From 726084fa98a8ac4e4def126efed0409aecec257e Mon Sep 17 00:00:00 2001 From: Fabio Massaioli Date: Wed, 5 Feb 2025 14:29:44 +0100 Subject: [PATCH 001/374] Standardise and enhance fileserver service --- v3/pkg/services/fileserver/fileserver.go | 51 +++++++++++++----------- 1 file changed, 27 insertions(+), 24 deletions(-) diff --git a/v3/pkg/services/fileserver/fileserver.go b/v3/pkg/services/fileserver/fileserver.go index f84b64945..550a429de 100644 --- a/v3/pkg/services/fileserver/fileserver.go +++ b/v3/pkg/services/fileserver/fileserver.go @@ -1,35 +1,29 @@ package fileserver import ( - "context" "net/http" - - "github.com/wailsapp/wails/v3/pkg/application" + "sync/atomic" ) -// ---------------- Service Setup ---------------- -// This is the main Service struct. It can be named anything you like. - type Config struct { + // RootPath specifies the filesystem path from which requests are to be served. RootPath string } type Service struct { - config *Config - fs http.Handler + fs atomic.Pointer[http.Handler] } -func New(config *Config) *Service { - return &Service{ - config: config, - fs: http.FileServer(http.Dir(config.RootPath)), - } +// New initialises an unconfigured fileserver. See [Configure] for details. +func New() *Service { + return NewWithConfig(nil) } -// ServiceShutdown is called when the app is shutting down -// You can use this to clean up any resources you have allocated -func (s *Service) ServiceShutdown() error { - return nil +// New initialises and optionally configures a fileserver. See [Service.Configure] for details. +func NewWithConfig(config *Config) *Service { + result := &Service{} + result.Configure(config) + return result } // ServiceName returns the name of the plugin. @@ -38,14 +32,23 @@ func (s *Service) ServiceName() string { return "github.com/wailsapp/wails/v3/services/fileserver" } -// ServiceStartup is called when the app is starting up. You can use this to -// initialise any resources you need. -func (s *Service) ServiceStartup(ctx context.Context, options application.ServiceOptions) error { - // Any initialization code here - return nil +// Configure reconfigures the fileserver. +// If config is nil, then every request will receive a 503 Service Unavailable response. +// +//wails:ignore +func (s *Service) Configure(config *Config) { + if config == nil { + s.fs.Store(&dummyHandler) + } else { + var fs http.Handler = http.FileServer(http.Dir(config.RootPath)) + s.fs.Store(&fs) + } } func (s *Service) ServeHTTP(w http.ResponseWriter, r *http.Request) { - // Create a new file server rooted at the given path - s.fs.ServeHTTP(w, r) + (*s.fs.Load()).ServeHTTP(w, r) } + +var dummyHandler http.Handler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + http.Error(w, "Fileserver service has not been configured yet", http.StatusServiceUnavailable) +}) From 63f47bc9ed86c330f8354eea0f58d63878887eb4 Mon Sep 17 00:00:00 2001 From: Fabio Massaioli Date: Wed, 5 Feb 2025 14:42:49 +0100 Subject: [PATCH 002/374] Standardise and enhance logger service --- v3/pkg/application/logger_dev.go | 2 +- v3/pkg/application/logger_dev_windows.go | 9 +- v3/pkg/application/logger_prod.go | 2 +- v3/pkg/services/log/log.go | 190 ++++++++++++++++++----- 4 files changed, 161 insertions(+), 42 deletions(-) diff --git a/v3/pkg/application/logger_dev.go b/v3/pkg/application/logger_dev.go index 4952e87bf..e84f49490 100644 --- a/v3/pkg/application/logger_dev.go +++ b/v3/pkg/application/logger_dev.go @@ -11,7 +11,7 @@ import ( "github.com/mattn/go-isatty" ) -func DefaultLogger(level slog.Level) *slog.Logger { +func DefaultLogger(level slog.Leveler) *slog.Logger { return slog.New(tint.NewHandler(os.Stderr, &tint.Options{ TimeFormat: time.Kitchen, NoColor: !isatty.IsTerminal(os.Stderr.Fd()), diff --git a/v3/pkg/application/logger_dev_windows.go b/v3/pkg/application/logger_dev_windows.go index 5a43abc5a..20d20c376 100644 --- a/v3/pkg/application/logger_dev_windows.go +++ b/v3/pkg/application/logger_dev_windows.go @@ -3,15 +3,16 @@ package application import ( - "github.com/lmittmann/tint" - "github.com/mattn/go-colorable" - "github.com/mattn/go-isatty" "log/slog" "os" "time" + + "github.com/lmittmann/tint" + "github.com/mattn/go-colorable" + "github.com/mattn/go-isatty" ) -func DefaultLogger(level slog.Level) *slog.Logger { +func DefaultLogger(level slog.Leveler) *slog.Logger { return slog.New(tint.NewHandler(colorable.NewColorable(os.Stderr), &tint.Options{ TimeFormat: time.StampMilli, NoColor: !isatty.IsTerminal(os.Stderr.Fd()), diff --git a/v3/pkg/application/logger_prod.go b/v3/pkg/application/logger_prod.go index 3cfbf4036..a748611ce 100644 --- a/v3/pkg/application/logger_prod.go +++ b/v3/pkg/application/logger_prod.go @@ -7,6 +7,6 @@ import ( "log/slog" ) -func DefaultLogger(level slog.Level) *slog.Logger { +func DefaultLogger(level slog.Leveler) *slog.Logger { return slog.New(slog.NewTextHandler(io.Discard, nil)) } diff --git a/v3/pkg/services/log/log.go b/v3/pkg/services/log/log.go index dd1aafac1..38ed4fd5f 100644 --- a/v3/pkg/services/log/log.go +++ b/v3/pkg/services/log/log.go @@ -4,74 +4,192 @@ import ( "context" _ "embed" "log/slog" + "sync/atomic" "github.com/wailsapp/wails/v3/pkg/application" ) +// A Level is the importance or severity of a log event. +// The higher the level, the more important or severe the event. +// +// Values are arbitrary, but there are four predefined ones. +type Level = int + +const ( + Debug = Level(slog.LevelDebug) + Info = Level(slog.LevelInfo) + Warning = Level(slog.LevelWarn) + Error = Level(slog.LevelError) +) + type Config struct { // Logger is the logger to use. If not set, a default logger will be used. Logger *slog.Logger // LogLevel defines the log level of the logger. LogLevel slog.Level - - // Handles errors that occur when writing to the log - ErrorHandler func(err error) } -type LoggerService struct { - config *Config - app *application.App +//wails:inject export { +//wails:inject DebugContext as Debug, +//wails:inject InfoContext as Info, +//wails:inject WarningContext as Warning, +//wails:inject ErrorContext as Error, +//wails:inject }; +type Service struct { + config atomic.Pointer[Config] level slog.LevelVar } -func NewLoggerService(config *Config) *LoggerService { - if config.Logger == nil { - config.Logger = application.DefaultLogger(config.LogLevel) - } +// New initialises a logging service with the default configuration. +func New() *Service { + return NewWithConfig(nil) +} - result := &LoggerService{ - config: config, - } - result.level.Set(config.LogLevel) +// NewWithConfig initialises a logging service with a custom configuration. +func NewWithConfig(config *Config) *Service { + result := &Service{} + result.Configure(config) return result } -func New() *LoggerService { - return NewLoggerService(&Config{}) -} - -// ServiceShutdown is called when the app is shutting down -// You can use this to clean up any resources you have allocated -func (l *LoggerService) ServiceShutdown() error { return nil } - // ServiceName returns the name of the plugin. // You should use the go module format e.g. github.com/myuser/myplugin -func (l *LoggerService) ServiceName() string { +func (l *Service) ServiceName() string { return "github.com/wailsapp/wails/v3/plugins/log" } -func (l *LoggerService) ServiceStartup(ctx context.Context, options application.ServiceOptions) error { - // Any initialization code here - return nil +// Configure reconfigures the logger dynamically. +// If config is nil, it falls back to the default configuration. +// +//wails:ignore +func (l *Service) Configure(config *Config) { + if config == nil { + config = &Config{} + } else { + // Clone to prevent changes from the outside. + clone := new(Config) + *clone = *config + config = clone + } + + l.level.Set(slog.Level(config.LogLevel)) + + if config.Logger == nil { + config.Logger = application.DefaultLogger(&l.level) + } + + l.config.Store(config) } -func (l *LoggerService) Debug(message string, args ...any) { - l.config.Logger.Debug(message, args...) +// Level returns the currently configured log level, +// that is either the one configured initially +// or the last value passed to [Service.SetLogLevel]. +// +// Through this method, [Service] implements the [slog.Leveler] interface. +// The intended use case is to propagate +// the service's dynamic level setting to custom loggers. +// For example: +// +// logService := log.New() +// customLogger := slog.New(slog.NewTextHandler( +// customWriter, +// &slog.HandlerOptions{ +// Level: logService, +// }, +// )) +// logService.Configure(&log.Config{ +// Logger: customLogger +// }) +// +// By doing so, setting updates made through [Service.SetLogLevel] +// will propagate dynamically to the custom logger. +// +//wails:ignore +func (l *Service) Level() slog.Level { + return l.level.Level() } -func (l *LoggerService) Info(message string, args ...any) { - l.config.Logger.Info(message, args...) +// LogLevel returns the currently configured log level, +// that is either the one configured initially +// or the last value passed to [Service.SetLogLevel]. +func (l *Service) LogLevel() Level { + return Level(l.Level()) } -func (l *LoggerService) Warning(message string, args ...any) { - l.config.Logger.Warn(message, args...) +// SetLogLevel changes the current log level. +func (l *Service) SetLogLevel(level Level) { + l.level.Set(slog.Level(level)) } -func (l *LoggerService) Error(message string, args ...any) { - l.config.Logger.Error(message, args...) +// Log emits a log record with the current time and the given level and message. +// The Record's attributes consist of the Logger's attributes followed by +// the attributes specified by args. +// +// The attribute arguments are processed as follows: +// - If an argument is a string and this is not the last argument, +// the following argument is treated as the value and the two are combined +// into an attribute. +// - Otherwise, the argument is treated as a value with key "!BADKEY". +// +// Log feeds the binding call context into the configured logger, +// so custom handlers may access context values, e.g. the current window. +func (l *Service) Log(ctx context.Context, level Level, message string, args ...any) { + l.config.Load().Logger.Log(ctx, slog.Level(level), message, args...) } -func (l *LoggerService) SetLogLevel(level slog.Level) { - l.level.Set(level) +// Debug logs at level [Debug]. +// +//wails:ignore +func (l *Service) Debug(message string, args ...any) { + l.DebugContext(context.Background(), message, args...) +} + +// Info logs at level [Info]. +// +//wails:ignore +func (l *Service) Info(message string, args ...any) { + l.InfoContext(context.Background(), message, args...) +} + +// Warning logs at level [Warning]. +// +//wails:ignore +func (l *Service) Warning(message string, args ...any) { + l.WarningContext(context.Background(), message, args...) +} + +// Error logs at level [Error]. +// +//wails:ignore +func (l *Service) Error(message string, args ...any) { + l.ErrorContext(context.Background(), message, args...) +} + +// DebugContext logs at level [Debug]. +// +//wails:internal +func (l *Service) DebugContext(ctx context.Context, message string, args ...any) { + l.Log(ctx, Debug, message, args...) +} + +// InfoContext logs at level [Info]. +// +//wails:internal +func (l *Service) InfoContext(ctx context.Context, message string, args ...any) { + l.Log(ctx, Info, message, args...) +} + +// WarningContext logs at level [Warn]. +// +//wails:internal +func (l *Service) WarningContext(ctx context.Context, message string, args ...any) { + l.Log(ctx, Warning, message, args...) +} + +// ErrorContext logs at level [Error]. +// +//wails:internal +func (l *Service) ErrorContext(ctx context.Context, message string, args ...any) { + l.Log(ctx, Error, message, args...) } From 6edb2b018944c69bb11e43f2556f38fa16477e40 Mon Sep 17 00:00:00 2001 From: Fabio Massaioli Date: Wed, 5 Feb 2025 14:48:02 +0100 Subject: [PATCH 003/374] Standardise and enhance kvstore service --- v3/pkg/services/kvstore/kvstore.go | 241 ++++++++++++++++++----------- 1 file changed, 154 insertions(+), 87 deletions(-) diff --git a/v3/pkg/services/kvstore/kvstore.go b/v3/pkg/services/kvstore/kvstore.go index ca46dccb5..48ca17574 100644 --- a/v3/pkg/services/kvstore/kvstore.go +++ b/v3/pkg/services/kvstore/kvstore.go @@ -3,7 +3,6 @@ package kvstore import ( "context" "encoding/json" - "io" "os" "sync" @@ -11,111 +10,147 @@ import ( "github.com/wailsapp/wails/v3/pkg/application" ) -type KeyValueStore struct { - config *Config - filename string - data map[string]any - unsaved bool - lock sync.RWMutex -} - type Config struct { + // Filename specifies the path of the on-disk file associated to the key-value store. Filename string + + // AutoSave specifies whether the store + // must be written to disk automatically after every modification. + // When AutoSave is false, stores are only saved to disk upon shutdown + // or when the [Service.Save] method is called manually. AutoSave bool } -type Service struct{} +type Service struct { + lock sync.RWMutex -func New(config *Config) *KeyValueStore { - return &KeyValueStore{ - config: config, - data: make(map[string]any), - } + config *Config + + data map[string]any + unsaved bool } -// ServiceShutdown will save the store to disk if there are unsaved changes. -func (kvs *KeyValueStore) ServiceShutdown() error { - if kvs.unsaved { - err := kvs.Save() - if err != nil { - return errors.Wrap(err, "Error saving store") - } - } - return nil +// New initialises an in-memory key-value store. See [NewWithConfig] for details. +func New() *Service { + return NewWithConfig(nil) +} + +// NewWithConfig initialises a key-value store with the given configuration: +// - if config is nil, the new store is in-memory, i.e. not associated with a file; +// - if config is non-nil, the associated file is not loaded until [Service.Load] is called. +// +// If the store is registered with the application as a service, +// [Service.Load] will be called automatically at startup. +func NewWithConfig(config *Config) *Service { + result := &Service{data: make(map[string]any)} + result.Configure(config) + return result } // ServiceName returns the name of the plugin. -func (kvs *KeyValueStore) ServiceName() string { +func (kvs *Service) ServiceName() string { return "github.com/wailsapp/wails/v3/plugins/kvstore" } -// ServiceStartup is called when the plugin is loaded. This is where you should do any setup. -func (kvs *KeyValueStore) ServiceStartup(ctx context.Context, options application.ServiceOptions) error { - err := kvs.open(kvs.config.Filename) - if err != nil { - return err - } - - return nil +// ServiceStartup loads the store from disk if it is associated with a file. +// It returns a non-nil error in case of failure. +func (kvs *Service) ServiceStartup(ctx context.Context, options application.ServiceOptions) error { + return errors.Wrap(kvs.Load(), "error loading store") } -func (kvs *KeyValueStore) open(filename string) (err error) { - kvs.filename = filename - kvs.data = make(map[string]any) +// ServiceShutdown saves the store to disk if it is associated with a file. +// It returns a non-nil error in case of failure. +func (kvs *Service) ServiceShutdown() error { + return errors.Wrap(kvs.Save(), "error saving store") +} - file, err := os.Open(filename) +// Configure changes the store's configuration. +// The contents of the store at call time are preserved and marked unsaved. +// Consumers will need to call [Service.Load] manually after Configure +// in order to load a new file. +// +// If the store is unsaved upon calling Configure, no attempt is made at saving it. +// Consumers will need to call [Service.Save] manually beforehand. +// +// See [NewWithConfig] for details on configuration. +// +//wails:ignore +func (kvs *Service) Configure(config *Config) { + if config != nil { + // Clone to prevent changes from the outside. + clone := new(Config) + *clone = *config + config = clone + } + + kvs.lock.Lock() + defer kvs.lock.Unlock() + + kvs.config = config + kvs.unsaved = true +} + +// Load loads the store from disk. +// If the store is in-memory, i.e. not associated with a file, Load has no effect. +// If the operation fails, a non-nil error is returned +// and the store's content and state at call time are preserved. +func (kvs *Service) Load() error { + kvs.lock.Lock() + defer kvs.lock.Unlock() + + if kvs.config == nil { + return nil + } + + bytes, err := os.ReadFile(kvs.config.Filename) if err != nil { if os.IsNotExist(err) { return nil - } - return err - } - defer func() { - err2 := file.Close() - if err2 != nil { - application.Get().Logger.Error("Key/Value Store Plugin Error:", "error", err.Error()) - if err == nil { - err = err2 - } - } - }() - - bytes, err := io.ReadAll(file) - if err != nil { - return err - } - - if len(bytes) > 0 { - if err := json.Unmarshal(bytes, &kvs.data); err != nil { + } else { return err } } + // Init new map because [json.Unmarshal] does not clear the previous one. + data := make(map[string]any) + + if len(bytes) > 0 { + if err := json.Unmarshal(bytes, &data); err != nil { + return err + } + } + + kvs.data = data + kvs.unsaved = false return nil } -// Save saves the store to disk -func (kvs *KeyValueStore) Save() error { +// Save saves the store to disk. +// If the store is in-memory, i.e. not associated with a file, Save has no effect. +func (kvs *Service) Save() error { kvs.lock.Lock() defer kvs.lock.Unlock() + if kvs.config == nil { + return nil + } + bytes, err := json.Marshal(kvs.data) if err != nil { return err } - err = os.WriteFile(kvs.filename, bytes, 0644) + err = os.WriteFile(kvs.config.Filename, bytes, 0644) if err != nil { return err } kvs.unsaved = false - return nil } // Get returns the value for the given key. If key is empty, the entire store is returned. -func (kvs *KeyValueStore) Get(key string) any { +func (kvs *Service) Get(key string) any { kvs.lock.RLock() defer kvs.lock.RUnlock() @@ -127,35 +162,67 @@ func (kvs *KeyValueStore) Get(key string) any { } // Set sets the value for the given key. If AutoSave is true, the store is saved to disk. -func (kvs *KeyValueStore) Set(key string, value any) error { - kvs.lock.Lock() - kvs.data[key] = value - kvs.lock.Unlock() - if kvs.config.AutoSave { - err := kvs.Save() - if err != nil { - return err - } - kvs.unsaved = false - } else { +func (kvs *Service) Set(key string, value any) error { + var autosave bool + func() { + kvs.lock.Lock() + defer kvs.lock.Unlock() + + kvs.data[key] = value kvs.unsaved = true + + if kvs.config != nil { + autosave = kvs.config.AutoSave + } + }() + + if autosave { + return kvs.Save() + } else { + return nil } - return nil } -// Delete deletes the key from the store. If AutoSave is true, the store is saved to disk. -func (kvs *KeyValueStore) Delete(key string) error { - kvs.lock.Lock() - delete(kvs.data, key) - kvs.lock.Unlock() - if kvs.config.AutoSave { - err := kvs.Save() - if err != nil { - return err - } - kvs.unsaved = false - } else { +// Delete deletes the given key from the store. If AutoSave is true, the store is saved to disk. +func (kvs *Service) Delete(key string) error { + var autosave bool + func() { + kvs.lock.Lock() + defer kvs.lock.Unlock() + + delete(kvs.data, key) kvs.unsaved = true + + if kvs.config != nil { + autosave = kvs.config.AutoSave + } + }() + + if autosave { + return kvs.Save() + } else { + return nil + } +} + +// Clear deletes all keys from the store. If AutoSave is true, the store is saved to disk. +func (kvs *Service) Clear() error { + var autosave bool + func() { + kvs.lock.Lock() + defer kvs.lock.Unlock() + + kvs.data = make(map[string]any) + kvs.unsaved = true + + if kvs.config != nil { + autosave = kvs.config.AutoSave + } + }() + + if autosave { + return kvs.Save() + } else { + return nil } - return nil } From ae2936927dc48bfb9687d0011f4cece35f3f3653 Mon Sep 17 00:00:00 2001 From: Fabio Massaioli Date: Wed, 5 Feb 2025 14:48:44 +0100 Subject: [PATCH 004/374] Standardise and enhance sqlite service --- v3/pkg/services/sqlite/sqlite.go | 473 +++++++++++++++++++++++++++---- v3/pkg/services/sqlite/stmt.js | 79 ++++++ 2 files changed, 502 insertions(+), 50 deletions(-) create mode 100644 v3/pkg/services/sqlite/stmt.js diff --git a/v3/pkg/services/sqlite/sqlite.go b/v3/pkg/services/sqlite/sqlite.go index c8cde7b7f..2b8d5f908 100644 --- a/v3/pkg/services/sqlite/sqlite.go +++ b/v3/pkg/services/sqlite/sqlite.go @@ -1,39 +1,83 @@ +//wails:include stmt.js package sqlite import ( + "bytes" "context" "database/sql" - "errors" + "fmt" + "sync" + "sync/atomic" + "github.com/pkg/errors" "github.com/wailsapp/wails/v3/pkg/application" _ "modernc.org/sqlite" ) -// ---------------- Service Setup ---------------- -// This is the main Service struct. It can be named anything you like. - type Config struct { - DBFile string + // DBSource is the database URI to use. + // The string ":memory:" can be used to create an in-memory database. + // The sqlite driver can be configured through query parameters. + // For more details see https://pkg.go.dev/modernc.org/sqlite#Driver.Open + DBSource string } +//wails:inject export { +//wails:inject ExecContext as Execute, +//wails:inject QueryContext as Query +//wails:inject }; +//wails:inject +//wails:inject import { Stmt } from "./stmt.js"; +//wails:inject +//wails:inject **:/** +//wails:inject **: * Prepare creates a prepared statement for later queries or executions. +//wails:inject **: * Multiple queries or executions may be run concurrently from the returned statement. +//wails:inject **: * +//wails:inject **: * The caller must call the statement's Close method when it is no longer needed. +//wails:inject **: * Statements are closed automatically +//wails:inject **: * when the connection they are associated with is closed. +//wails:inject **: * +//wails:inject **: * Prepare supports early cancellation. +//wails:inject j*: * +//wails:inject j*: * @param {string} query +//wails:inject j*: * @returns {Promise & { cancel(): void }} +//wails:inject **: */ +//wails:inject j*:export function Prepare(query) { +//wails:inject t*:export function Prepare(query: string): Promise & { cancel(): void } { +//wails:inject **: const promise = PrepareContext(query); +//wails:inject j*: const wrapper = /** @type {any} */(promise.then(function (id) { +//wails:inject t*: const wrapper: any = (promise.then(function (id) { +//wails:inject **: return id == null ? null : new Stmt( +//wails:inject **: ClosePrepared.bind(null, id), +//wails:inject **: ExecPrepared.bind(null, id), +//wails:inject **: QueryPrepared.bind(null, id)); +//wails:inject **: })); +//wails:inject **: wrapper.cancel = promise.cancel; +//wails:inject **: return wrapper; +//wails:inject **:} type Service struct { + lock sync.RWMutex config *Config conn *sql.DB + stmts map[uint64]struct{} } -func New(config *Config) *Service { - return &Service{ - config: config, - } +// New initialises a sqlite service with the default configuration. +func New() *Service { + return NewWithConfig(nil) } -// ServiceShutdown is called when the app is shutting down -// You can use this to clean up any resources you have allocated -func (s *Service) ServiceShutdown() error { - if s.conn != nil { - return s.conn.Close() - } - return nil +// NewWithConfig initialises a sqlite service with a custom configuration. +// If config is nil, it falls back to the default configuration, i.e. an in-memory database. +// +// The database connection is not opened right away. +// A call to [Service.Open] must succeed before using all other methods. +// If the service is registered with the application, +// [Service.Open] will be called automatically at startup. +func NewWithConfig(config *Config) *Service { + result := &Service{} + result.Configure(config) + return result } // ServiceName returns the name of the plugin. @@ -42,58 +86,325 @@ func (s *Service) ServiceName() string { return "github.com/wailsapp/wails/v3/plugins/sqlite" } -// ServiceStartup is called when the app is starting up. You can use this to -// initialise any resources you need. +// ServiceStartup opens the database connection. +// It returns a non-nil error in case of failures. func (s *Service) ServiceStartup(ctx context.Context, options application.ServiceOptions) error { - if s.config.DBFile == "" { - return errors.New(`no database file specified. Please set DBFile in the config to either a filename or use ":memory:" to use an in-memory database`) + return s.Open() +} + +// ServiceShutdown closes the database connection. +// It returns a non-nil error in case of failures. +func (s *Service) ServiceShutdown() error { + return s.Close() +} + +// Configure changes the database service configuration. +// The connection state at call time is preserved. +// Consumers will need to call [Service.Open] manually after Configure +// in order to reconnect with the new configuration. +// +// See [NewWithConfig] for details on configuration. +// +//wails:ignore +func (s *Service) Configure(config *Config) { + if config == nil { + config = &Config{DBSource: ":memory:"} + } else { + // Clone to prevent changes from the outside. + clone := new(Config) + *clone = *config + config = clone } - db, err := s.Open(s.config.DBFile) - if err != nil { + + s.lock.Lock() + defer s.lock.Unlock() + + s.config = config +} + +// Open validates the current configuration, +// closes the current connection if one is present, +// then opens and validates a new connection. +// +// Even when a non-nil error is returned, +// the database service is left in a consistent state, +// ready for a new call to Open. +func (s *Service) Open() error { + s.lock.Lock() + defer s.lock.Unlock() + + if s.config.DBSource == "" { + return errors.New(`no database source specified; please set DBSource in the config to a filename or specify ":memory:" to use an in-memory database`) + } + + if err := s.closeImpl(); err != nil { return err } - _ = db + + conn, err := sql.Open("sqlite", s.config.DBSource) + if err != nil { + return errors.Wrap(err, "error opening database connection") + } + + // Test connection + if err := conn.Ping(); err != nil { + _ = conn.Close() + return errors.Wrap(err, "error opening database connection") + } + + s.conn = conn + s.stmts = make(map[uint64]struct{}) return nil } -func (s *Service) Open(dbPath string) (string, error) { - var err error - s.conn, err = sql.Open("sqlite", dbPath) - if err != nil { - return "", err - } - return "Database connection opened", nil +// Close closes the current database connection if one is open, otherwise has no effect. +// Additionally, Close closes all open prepared statements associated to the connection. +// +// Even when a non-nil error is returned, +// the database service is left in a consistent state, +// ready for a call to [Service.Open]. +func (s *Service) Close() error { + s.lock.Lock() + defer s.lock.Unlock() + + return s.closeImpl() } -func (s *Service) Execute(query string, args ...any) error { +// closeImpl performs the close operation without acquiring the lock first. +// It is the caller's responsibility +// to ensure the lock is held exclusively (in write mode) +// for the entire duration of the call. +func (s *Service) closeImpl() error { if s.conn == nil { + return nil + } + + for id := range s.stmts { + if stmt, ok := stmts.Load(id); ok { + // WARN: do not delegate to [Stmt.Close], it would cause a deadlock. + // Ignore errors, closing the connection should free up all resources. + _ = stmt.(*Stmt).sqlStmt.Close() + } + } + + err := s.conn.Close() + + // Clear the connection even in case of errors: + // if [sql.DB.Close] returns an error, + // the connection becomes unusable. + s.conn = nil + s.stmts = nil + + return err +} + +// Execute executes a query without returning any rows. +// +//wails:ignore +func (s *Service) Execute(query string, args ...any) error { + return s.ExecContext(context.Background(), query, args...) +} + +// ExecContext executes a query without returning any rows. +// It supports early cancellation. +// +//wails:internal +func (s *Service) ExecContext(ctx context.Context, query string, args ...any) error { + s.lock.RLock() + conn := s.conn + s.lock.RUnlock() + + if conn == nil { return errors.New("no open database connection") } - _, err := s.conn.Exec(query, args...) - if err != nil { + _, err := conn.ExecContext(ctx, query, args...) + if err != nil && !errors.Is(err, context.Canceled) { return err } + return nil } -func (s *Service) Select(query string, args ...any) ([]map[string]any, error) { - if s.conn == nil { +// Query executes a query and returns a slice of key-value records, +// one per row, with column names as keys. +// +//wails:ignore +func (s *Service) Query(query string, args ...any) (Rows, error) { + return s.QueryContext(context.Background(), query, args...) +} + +// QueryContext executes a query and returns a slice of key-value records, +// one per row, with column names as keys. +// It supports early cancellation, returning the slice of results fetched so far. +// +//wails:internal +func (s *Service) QueryContext(ctx context.Context, query string, args ...any) (Rows, error) { + s.lock.RLock() + conn := s.conn + s.lock.RUnlock() + + if conn == nil { return nil, errors.New("no open database connection") } - rows, err := s.conn.Query(query, args...) + rows, err := conn.QueryContext(ctx, query, args...) if err != nil { - return nil, err + if errors.Is(err, context.Canceled) { + return Rows{}, nil + } else { + return nil, err + } } + + return parseRows(ctx, rows) +} + +// Prepare creates a prepared statement for later queries or executions. +// Multiple queries or executions may be run concurrently from the returned statement. +// +// The caller should call the statement's Close method when it is no longer needed. +// Statements are closed automatically +// when the connection they are associated with is closed. +// +//wails:ignore +func (s *Service) Prepare(query string) (*Stmt, error) { + return s.PrepareContext(context.Background(), query) +} + +// PrepareContext creates a prepared statement for later queries or executions. +// Multiple queries or executions may be run concurrently from the returned statement. +// +// The caller must call the statement's Close method when it is no longer needed. +// Statements are closed automatically +// when the connection they are associated with is closed. +// +// PrepareContext supports early cancellation. +// +//wails:internal +func (s *Service) PrepareContext(ctx context.Context, query string) (*Stmt, error) { + s.lock.RLock() + conn := s.conn + s.lock.RUnlock() + + if conn == nil { + return nil, errors.New("no open database connection") + } + + id := nextId.Load() + for id != 0 && !nextId.CompareAndSwap(id, id+1) { + } + if id == 0 { + return nil, errors.New("prepared statement ids exhausted") + } + + stmt, err := conn.PrepareContext(ctx, query) + if err != nil { + if errors.Is(err, context.Canceled) { + return nil, nil + } else { + return nil, err + } + } + + func() { + s.lock.Lock() + defer s.lock.Unlock() + + s.stmts[id] = struct{}{} + }() + + wrapper := &Stmt{ + sqlStmt: stmt, + db: s, + id: id, + } + stmts.Store(id, wrapper) + + return wrapper, nil +} + +// ClosePrepared closes a prepared statement +// obtained with [Service.Prepare] or [Service.PrepareContext]. +// ClosePrepared is idempotent: +// it has no effect on prepared statements that are already closed. +// +//wails:internal +func (s *Service) ClosePrepared(stmt *Stmt) error { + return stmt.Close() +} + +// ExecPrepared executes a prepared statement +// obtained with [Service.Prepare] or [Service.PrepareContext] +// without returning any rows. +// It supports early cancellation. +// +//wails:internal +func (s *Service) ExecPrepared(ctx context.Context, stmt *Stmt, args ...any) error { + if stmt == nil { + return errors.New("no prepared statement provided") + } else if stmt.sqlStmt == nil { + return errors.New("prepared statement is not valid") + } + + _, err := stmt.ExecContext(ctx, args...) + if err != nil && !errors.Is(err, context.Canceled) { + return err + } + + return nil +} + +// QueryPrepared executes a prepared statement +// obtained with [Service.Prepare] or [Service.PrepareContext] +// and returns a slice of key-value records, one per row, with column names as keys. +// It supports early cancellation, returning the slice of results fetched so far. +// +//wails:internal +func (s *Service) QueryPrepared(ctx context.Context, stmt *Stmt, args ...any) (Rows, error) { + if stmt == nil { + return nil, errors.New("no prepared statement provided") + } else if stmt.sqlStmt == nil { + return nil, errors.New("prepared statement is not valid") + } + + rows, err := stmt.sqlStmt.QueryContext(ctx, args...) + if err != nil { + if errors.Is(err, context.Canceled) { + return Rows{}, nil + } else { + return nil, err + } + } + + return parseRows(ctx, rows) +} + +type ( + // Row holds a single row in the result of a query. + // It is a key-value map where keys are column names. + Row = map[string]any + + // Rows holds the result of a query + // as an array of key-value maps where keys are column names. + Rows = []Row +) + +func parseRows(ctx context.Context, rows *sql.Rows) (Rows, error) { defer rows.Close() - columns, err := rows.Columns() - var results []map[string]any + columns, _ := rows.Columns() + values := make([]any, len(columns)) + pointers := make([]any, len(columns)) + results := []map[string]any{} + for rows.Next() { - values := make([]any, len(columns)) - pointers := make([]any, len(columns)) + select { + default: + case <-ctx.Done(): + return results, nil + } for i := range values { pointers[i] = &values[i] @@ -107,21 +418,83 @@ func (s *Service) Select(query string, args ...any) ([]map[string]any, error) { for i, column := range columns { row[column] = values[i] } + results = append(results, row) } return results, nil } -func (s *Service) Close() (string, error) { - if s.conn == nil { - return "", errors.New("no open database connection") +var ( + // stmts holds all currently active prepared statements, + // for all [Service] instances. + stmts sync.Map + + // nextId holds the next available prepared statement id. + // We use a counter to make sure IDs are never reused. + nextId atomic.Uint64 +) + +func init() { + nextId.Store(1) +} + +type ( + sqlStmt = *sql.Stmt + + // Stmt wraps a prepared sql statement pointer. + // It provides the same methods as the [sql.Stmt] type. + // + //wails:internal + Stmt struct { + sqlStmt + db *Service + id uint64 + } +) + +// Close closes the statement. +// It has no effect when the statement is already closed. +func (s *Stmt) Close() error { + if s == nil || s.sqlStmt == nil { + return nil } - err := s.conn.Close() - if err != nil { - return "", err - } - s.conn = nil - return "Database connection closed", nil + err := s.sqlStmt.Close() + stmts.Delete(s.id) + + func() { + s.db.lock.Lock() + defer s.db.lock.Unlock() + + delete(s.db.stmts, s.id) + }() + + return errors.Wrap(err, "error closing prepared statement") +} + +func (s *Stmt) MarshalText() ([]byte, error) { + var buf bytes.Buffer + buf.Grow(16) + + if _, err := fmt.Fprintf(&buf, "%016x", s.id); err != nil { + return nil, err + } + + return buf.Bytes(), nil +} + +func (s *Stmt) UnmarshalText(text []byte) error { + if n, err := fmt.Fscanf(bytes.NewReader(text), "%x", &s.id); n < 1 || err != nil { + return errors.New("invalid prepared statement id") + } + + if stmt, ok := stmts.Load(s.id); ok { + *s = *(stmt.(*Stmt)) + } else { + s.sqlStmt = nil + s.db = nil + } + + return nil } diff --git a/v3/pkg/services/sqlite/stmt.js b/v3/pkg/services/sqlite/stmt.js new file mode 100644 index 000000000..948b0c3dd --- /dev/null +++ b/v3/pkg/services/sqlite/stmt.js @@ -0,0 +1,79 @@ +//@ts-check + +//@ts-ignore: Unused imports +import * as $models from "./models.js"; + +const execSymbol = Symbol("exec"), + querySymbol = Symbol("query"), + closeSymbol = Symbol("close"); + +/** + * Stmt represents a prepared statement for later queries or executions. + * Multiple queries or executions may be run concurrently on the same statement. + * + * The caller must call the statement's Close method when it is no longer needed. + * Statements are closed automatically + * when the connection they are associated with is closed. + */ +export class Stmt { + /** + * Constructs a new prepared statement instance. + * @param {(...args: any[]) => Promise} close + * @param {(...args: any[]) => Promise & { cancel(): void }} exec + * @param {(...args: any[]) => Promise<$models.Rows> & { cancel(): void }} query + */ + constructor(close, exec, query) { + /** + * @member + * @private + * @type {typeof close} + */ + this[closeSymbol] = close; + + /** + * @member + * @private + * @type {typeof exec} + */ + this[execSymbol] = exec; + + /** + * @member + * @private + * @type {typeof query} + */ + this[querySymbol] = query; + } + + /** + * Closes the prepared statement. + * It has no effect when the statement is already closed. + * @returns {Promise} + */ + Close() { + return this[closeSymbol](); + } + + /** + * Executes the prepared statement without returning any rows. + * It supports early cancellation. + * + * @param {any[]} args + * @returns {Promise & { cancel(): void }} + */ + Exec(...args) { + return this[execSymbol](...args); + } + + /** + * Executes the prepared statement + * and returns a slice of key-value records, one per row, with column names as keys. + * It supports early cancellation, returning the array of results fetched so far. + * + * @param {any[]} args + * @returns {Promise<$models.Rows> & { cancel(): void }} + */ + Query(...args) { + return this[querySymbol](...args); + } +} From 23412656ded8ffa05ec57327a8e463c6aabca6ba Mon Sep 17 00:00:00 2001 From: Fabio Massaioli Date: Thu, 6 Feb 2025 04:00:25 +0100 Subject: [PATCH 005/374] Update example --- v3/examples/services/assets/index.html | 18 +++++++++--------- v3/examples/services/main.go | 17 +++++++++-------- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/v3/examples/services/assets/index.html b/v3/examples/services/assets/index.html index 67746fdec..84e856a4f 100644 --- a/v3/examples/services/assets/index.html +++ b/v3/examples/services/assets/index.html @@ -6,10 +6,10 @@

Exception class that will be thrown in case the bound method returns an error. +The value of the RuntimeError#name property is "RuntimeError".

+

Hierarchy

  • Error
    • RuntimeError

Constructors

Properties

Constructors

  • Constructs a new RuntimeError instance.

    +

    Parameters

    • message: string

      The error message.

      +
    • Rest ...args: any[]

      Optional arguments for the Error constructor.

      +

    Returns RuntimeError

Properties

cause?: unknown
message: string
name: string
stack?: string

Generated using TypeDoc

\ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Events.WailsEvent.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Events.WailsEvent.html index ce9933534..62aa8f9ad 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Events.WailsEvent.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Events.WailsEvent.html @@ -1,4 +1,4 @@ -WailsEvent | @wailsio/runtime

Constructors

constructor +WailsEvent | @wailsio/runtime

Constructors

Properties

Constructors

Properties

data: any
name: any

Generated using TypeDoc

\ No newline at end of file +

Constructors

Properties

data: any
name: any

Generated using TypeDoc

\ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Hide.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Hide.html index b33108196..a08585c2a 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Hide.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Hide.html @@ -1,2 +1,2 @@ Hide | @wailsio/runtime
  • Hides a certain method by calling the HideMethod function.

    -

    Returns Promise<void>

Generated using TypeDoc

\ No newline at end of file +

Returns Promise<void>

Generated using TypeDoc

\ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Quit.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Quit.html index b8c72b5f0..01bd8f80e 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Quit.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Quit.html @@ -1,2 +1,2 @@ Quit | @wailsio/runtime
  • Calls the QuitMethod to terminate the program.

    -

    Returns Promise<void>

Generated using TypeDoc

\ No newline at end of file +

Returns Promise<void>

Generated using TypeDoc

\ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Show.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Show.html index e97c56612..17581c525 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Show.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Show.html @@ -1,2 +1,2 @@ Show | @wailsio/runtime
  • Calls the ShowMethod and returns the result.

    -

    Returns Promise<void>

Generated using TypeDoc

\ No newline at end of file +

Returns Promise<void>

Generated using TypeDoc

\ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Browser.OpenURL.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Browser.OpenURL.html index d001c834c..37a530915 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Browser.OpenURL.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Browser.OpenURL.html @@ -1,3 +1,3 @@ OpenURL | @wailsio/runtime
  • Open a browser window to the given URL

    Parameters

    • url: string

      The URL to open

      -

    Returns Promise<string>

Generated using TypeDoc

\ No newline at end of file +

Returns Promise<string>

Generated using TypeDoc

\ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByID.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByID.html index 88efcba00..fc2e75e38 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByID.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByID.html @@ -1,7 +1,8 @@ -ByID | @wailsio/runtime
  • Calls a method by its ID with the specified arguments.

    +ByID | @wailsio/runtime
    • Calls a method by its numeric ID with the specified arguments. +See Call for details.

      Parameters

      • methodID: number

        The ID of the method to call.

      • Rest ...args: any[]

        The arguments to pass to the method.

        -

      Returns any

        +

Returns Promise<any>

  • The result of the method call.
-

Generated using TypeDoc

\ No newline at end of file +

Generated using TypeDoc

\ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByName.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByName.html index 57ce6d7fe..33444099e 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByName.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByName.html @@ -1,6 +1,6 @@ -ByName | @wailsio/runtime
  • Executes a method by name.

    +ByName | @wailsio/runtime
    • Calls a bound method by name with the specified arguments. +See Call for details.

      Parameters

      • methodName: string

        The name of the method in the format 'package.struct.method'.

      • Rest ...args: any[]

        The arguments to pass to the method.

        -

      Returns any

      The result of the method execution.

      -

      Throws

      If the name is not a string or is not in the correct format.

      -

    Generated using TypeDoc

    \ No newline at end of file +

Returns Promise<any>

The result of the method call.

+

Generated using TypeDoc

\ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.Call.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.Call.html index 44dbce6c3..29f44519b 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.Call.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.Call.html @@ -1,6 +1,11 @@ -Call | @wailsio/runtime
  • Call method.

    -

    Parameters

    • options: Object

      The options for the method.

      -

    Returns Object

      +Call | @wailsio/runtime
      • Call a bound method according to the given call options.

        +

        In case of failure, the returned promise will reject with an exception +among ReferenceError (unknown method), TypeError (wrong argument count or type), +RuntimeError (method returned an error), or other (network or internal errors). +The exception might have a "cause" field with the value returned +by the application- or service-level error marshaling functions.

        +

        Parameters

        Returns Promise<any>

        • The result of the call.
        -

      Generated using TypeDoc

      \ No newline at end of file +

Generated using TypeDoc

\ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.Plugin.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.Plugin.html deleted file mode 100644 index dff293734..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.Plugin.html +++ /dev/null @@ -1,8 +0,0 @@ -Plugin | @wailsio/runtime
  • Calls a method on a plugin.

    -

    Parameters

    • pluginName: string

      The name of the plugin.

      -
    • methodName: string

      The name of the method to call.

      -
    • Rest ...args: any[]

      The arguments to pass to the method.

      -

    Returns any

      -
    • The result of the method call.
    • -
    -

Generated using TypeDoc

\ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.SetText.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.SetText.html index 7b49863d1..f7dcf256a 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.SetText.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.SetText.html @@ -3,4 +3,4 @@

Returns Promise<any>

  • A Promise that resolves when the operation is successful.
-

Generated using TypeDoc

\ No newline at end of file +

Generated using TypeDoc

\ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.Text.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.Text.html index 894bbc80f..dde4beeba 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.Text.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.Text.html @@ -1,3 +1,3 @@ Text | @wailsio/runtime
  • Get the Clipboard text

    Returns Promise<string>

    A promise that resolves with the text from the Clipboard.

    -

Generated using TypeDoc

\ No newline at end of file +

Generated using TypeDoc

\ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Any.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Any.html index 0217706d6..251ad8f36 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Any.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Any.html @@ -1,2 +1,2 @@ Any | @wailsio/runtime
  • Any is a dummy creation function for simple or unknown types.

    -

    Type Parameters

    • T

    Parameters

    • source: any

    Returns T

Generated using TypeDoc

\ No newline at end of file +

Type Parameters

  • T

Parameters

  • source: any

Returns T

Generated using TypeDoc

\ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Array.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Array.html index ff34b11f1..63151d29f 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Array.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Array.html @@ -1,4 +1,4 @@ Array | @wailsio/runtime
  • Array takes a creation function for an arbitrary type and returns an in-place creation function for an array whose elements are of that type.

    -

    Type Parameters

    • T

    Parameters

    • element: ((source) => T)
        • (source): T
        • Parameters

          • source: any

          Returns T

    Returns ((source) => T[])

      • (source): T[]
      • Parameters

        • source: any

        Returns T[]

Generated using TypeDoc

\ No newline at end of file +

Type Parameters

  • T

Parameters

  • element: ((source) => T)
      • (source): T
      • Parameters

        • source: any

        Returns T

Returns ((source) => T[])

    • (source): T[]
    • Parameters

      • source: any

      Returns T[]

Generated using TypeDoc

\ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.ByteSlice.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.ByteSlice.html index cab3c34af..72a9ad146 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.ByteSlice.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.ByteSlice.html @@ -1,3 +1,3 @@ ByteSlice | @wailsio/runtime
  • ByteSlice is a creation function that replaces null strings with empty strings.

    -

    Parameters

    • source: any

    Returns string

Generated using TypeDoc

\ No newline at end of file +

Parameters

  • source: any

Returns string

Generated using TypeDoc

\ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Map.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Map.html index f7af45bf3..a81270070 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Map.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Map.html @@ -1,4 +1,4 @@ Map | @wailsio/runtime
  • Map takes creation functions for two arbitrary types and returns an in-place creation function for an object whose keys and values are of those types.

    -

    Type Parameters

    • K
    • V

    Parameters

    • key: ((source) => K)
        • (source): K
        • Parameters

          • source: any

          Returns K

    • value: ((source) => V)
        • (source): V
        • Parameters

          • source: any

          Returns V

    Returns ((source) => {
        [_: K]: V;
    })

      • (source): {
            [_: K]: V;
        }
      • Parameters

        • source: any

        Returns {
            [_: K]: V;
        }

Generated using TypeDoc

\ No newline at end of file +

Type Parameters

  • K
  • V

Parameters

  • key: ((source) => K)
      • (source): K
      • Parameters

        • source: any

        Returns K

  • value: ((source) => V)
      • (source): V
      • Parameters

        • source: any

        Returns V

Returns ((source) => {
    [_: K]: V;
})

    • (source): {
          [_: K]: V;
      }
    • Parameters

      • source: any

      Returns {
          [_: K]: V;
      }

Generated using TypeDoc

\ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Nullable.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Nullable.html index 26b37c367..2174bef8f 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Nullable.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Nullable.html @@ -1,3 +1,3 @@ Nullable | @wailsio/runtime
  • Nullable takes a creation function for an arbitrary type and returns a creation function for a nullable value of that type.

    -

    Type Parameters

    • T

    Parameters

    • element: ((source) => T)
        • (source): T
        • Parameters

          • source: any

          Returns T

    Returns ((source) => null | T)

      • (source): null | T
      • Parameters

        • source: any

        Returns null | T

Generated using TypeDoc

\ No newline at end of file +

Type Parameters

  • T

Parameters

  • element: ((source) => T)
      • (source): T
      • Parameters

        • source: any

        Returns T

Returns ((source) => null | T)

    • (source): null | T
    • Parameters

      • source: any

      Returns null | T

Generated using TypeDoc

\ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Struct.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Struct.html index 800377936..9735e1941 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Struct.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Struct.html @@ -1,3 +1,3 @@ Struct | @wailsio/runtime
  • Struct takes an object mapping field names to creation functions and returns an in-place creation function for a struct.

    -

    Type Parameters

    • T extends {
          [_: string]: ((source) => any);
      }
    • U extends {
          [Key in string | number | symbol]?: ReturnType<T[Key]>
      }

    Parameters

    • createField: T

    Returns ((source) => U)

      • (source): U
      • Parameters

        • source: any

        Returns U

Generated using TypeDoc

\ No newline at end of file +

Type Parameters

  • T extends {
        [_: string]: ((source) => any);
    }
  • U extends {
        [Key in string | number | symbol]?: ReturnType<T[Key]>
    }

Parameters

  • createField: T

Returns ((source) => U)

    • (source): U
    • Parameters

      • source: any

      Returns U

Generated using TypeDoc

\ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Error.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Error.html index 0672de6ac..6db728dcb 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Error.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Error.html @@ -2,4 +2,4 @@

Returns Promise<string>

  • The label of the button pressed
-

Generated using TypeDoc

\ No newline at end of file +

Generated using TypeDoc

\ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Info.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Info.html index 3ad7968fe..14130d470 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Info.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Info.html @@ -2,4 +2,4 @@

Returns Promise<string>

  • The label of the button pressed
-

Generated using TypeDoc

\ No newline at end of file +

Generated using TypeDoc

\ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.OpenFile.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.OpenFile.html index 6a50199ac..821b85f04 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.OpenFile.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.OpenFile.html @@ -1,3 +1,3 @@ OpenFile | @wailsio/runtime
  • Parameters

    Returns Promise<string | string[]>

    Returns selected file or list of files. Returns blank string if no file is selected.

    -

Generated using TypeDoc

\ No newline at end of file +

Generated using TypeDoc

\ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Question.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Question.html index 5531a7c07..17bc86219 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Question.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Question.html @@ -2,4 +2,4 @@

Returns Promise<string>

  • The label of the button pressed
-

Generated using TypeDoc

\ No newline at end of file +

Generated using TypeDoc

\ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.SaveFile.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.SaveFile.html index 8bd6014ef..26bd93652 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.SaveFile.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.SaveFile.html @@ -1,3 +1,3 @@ SaveFile | @wailsio/runtime
  • Parameters

    Returns Promise<string>

    Returns the selected file. Returns blank string if no file is selected.

    -

Generated using TypeDoc

\ No newline at end of file +

Generated using TypeDoc

\ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Warning.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Warning.html index 1bc95ef80..053cf106b 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Warning.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Warning.html @@ -2,4 +2,4 @@

Returns Promise<string>

  • The label of the button pressed
-

Generated using TypeDoc

\ No newline at end of file +

Generated using TypeDoc

\ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Emit.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Emit.html index af707a219..542ab7a1e 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Emit.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Emit.html @@ -3,4 +3,4 @@

Returns any

  • The result of the emitted event.
-

Generated using TypeDoc

\ No newline at end of file +

Generated using TypeDoc

\ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Off.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Off.html index 54cbdae93..f1fcded3f 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Off.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Off.html @@ -1,4 +1,4 @@ Off | @wailsio/runtime
  • Removes event listeners for the specified event names.

    Parameters

    • eventName: string

      The name of the event to remove listeners for.

    • Rest ...additionalEventNames: string[]

      Additional event names to remove listeners for.

      -

    Returns undefined

Generated using TypeDoc

\ No newline at end of file +

Returns undefined

Generated using TypeDoc

\ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OffAll.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OffAll.html index 9f5b06ca9..cebf1d976 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OffAll.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OffAll.html @@ -1,3 +1,3 @@ OffAll | @wailsio/runtime
  • Removes all event listeners.

    Returns void

    Function

    OffAll

    -

Generated using TypeDoc

\ No newline at end of file +

Generated using TypeDoc

\ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.On.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.On.html index 47f71bd94..d75c76ad6 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.On.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.On.html @@ -4,4 +4,4 @@

Returns Function

  • A function that, when called, will unregister the callback from the event.
-

Generated using TypeDoc

\ No newline at end of file +

Generated using TypeDoc

\ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OnMultiple.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OnMultiple.html index 3d51fbd33..076aa9068 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OnMultiple.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OnMultiple.html @@ -5,4 +5,4 @@

Returns Function

  • A function that, when called, will unregister the callback from the event.
-

Generated using TypeDoc

\ No newline at end of file +

Generated using TypeDoc

\ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Once.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Once.html index 5e286a7be..adb14bda4 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Once.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Once.html @@ -4,4 +4,4 @@

Returns Function

  • A function that, when called, will unregister the callback from the event.
-

Generated using TypeDoc

\ No newline at end of file +

Generated using TypeDoc

\ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.setup.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.setup.html index 0620de3a1..deae4ec72 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.setup.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.setup.html @@ -1 +1 @@ -setup | @wailsio/runtime

Generated using TypeDoc

\ No newline at end of file +setup | @wailsio/runtime

Generated using TypeDoc

\ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Flags.GetFlag.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Flags.GetFlag.html index 563c4cbfe..bc2335a44 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Flags.GetFlag.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Flags.GetFlag.html @@ -3,4 +3,4 @@

Returns any

  • The value associated with the specified key.
-

Generated using TypeDoc

\ No newline at end of file +

Generated using TypeDoc

\ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetAll.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetAll.html index a34fc12c4..5848da1ed 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetAll.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetAll.html @@ -1,3 +1,3 @@ GetAll | @wailsio/runtime
  • Gets all screens.

    Returns Promise<Screen[]>

    A promise that resolves to an array of Screen objects.

    -

Generated using TypeDoc

\ No newline at end of file +

Generated using TypeDoc

\ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetCurrent.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetCurrent.html index af6bae7ef..fc43c9176 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetCurrent.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetCurrent.html @@ -1,3 +1,3 @@ GetCurrent | @wailsio/runtime
  • Gets the current active screen.

    Returns Promise<Screen>

    A promise that resolves with the current active screen.

    -

Generated using TypeDoc

\ No newline at end of file +

Generated using TypeDoc

\ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetPrimary.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetPrimary.html index da6e35d2c..1bfa6606b 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetPrimary.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetPrimary.html @@ -1,3 +1,3 @@ GetPrimary | @wailsio/runtime
  • Gets the primary screen.

    Returns Promise<Screen>

    A promise that resolves to the primary screen.

    -

Generated using TypeDoc

\ No newline at end of file +

Generated using TypeDoc

\ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Capabilities.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Capabilities.html index 593529d86..9c93a483c 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Capabilities.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Capabilities.html @@ -1,4 +1,4 @@ Capabilities | @wailsio/runtime
  • Fetches the capabilities of the application from the server.

    Returns Promise<Object>

    A promise that resolves to an object containing the capabilities.

    Async

    Function

    Capabilities

    -

Generated using TypeDoc

\ No newline at end of file +

Generated using TypeDoc

\ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Environment.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Environment.html index e18e37a81..c4359efa9 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Environment.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Environment.html @@ -2,4 +2,4 @@
  • A promise that resolves to an object containing OS and system architecture.
  • Function

    Retrieves environment details.

    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsAMD64.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsAMD64.html index b7ab83f45..21801ee6c 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsAMD64.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsAMD64.html @@ -1,3 +1,3 @@ IsAMD64 | @wailsio/runtime
    • Checks if the current environment architecture is AMD64.

      Returns boolean

      True if the current environment architecture is AMD64, false otherwise.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM.html index 280713f3b..a94a24dc8 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM.html @@ -1,3 +1,3 @@ IsARM | @wailsio/runtime
    • Checks if the current architecture is ARM.

      Returns boolean

      True if the current architecture is ARM, false otherwise.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM64.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM64.html index b056c3125..c9386a5fa 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM64.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM64.html @@ -2,4 +2,4 @@

    Returns boolean

    • Returns true if the environment is ARM64 architecture, otherwise returns false.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDarkMode.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDarkMode.html index a9a70ec5e..04672fe31 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDarkMode.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDarkMode.html @@ -2,4 +2,4 @@
  • A promise that resolves to a boolean value indicating if the system is in dark mode.
  • Function

    Retrieves the system dark mode status.

    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDebug.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDebug.html index 07b2e4569..ce780df72 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDebug.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDebug.html @@ -1 +1 @@ -IsDebug | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file +IsDebug | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsLinux.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsLinux.html index 556563fb6..c5ada1aa5 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsLinux.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsLinux.html @@ -1,3 +1,3 @@ IsLinux | @wailsio/runtime
    • Checks if the current operating system is Linux.

      Returns boolean

      Returns true if the current operating system is Linux, false otherwise.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsMac.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsMac.html index f702a9d12..d7abc7b4a 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsMac.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsMac.html @@ -1,3 +1,3 @@ IsMac | @wailsio/runtime
    • Checks if the current environment is a macOS operating system.

      Returns boolean

      True if the environment is macOS, false otherwise.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsWindows.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsWindows.html index a2c1801e5..73a038712 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsWindows.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsWindows.html @@ -1,3 +1,3 @@ IsWindows | @wailsio/runtime
    • Checks if the current operating system is Windows.

      Returns boolean

      True if the operating system is Windows, otherwise false.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.invoke.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.invoke.html index 662b2a3da..e922a2368 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.invoke.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.invoke.html @@ -1 +1 @@ -invoke | @wailsio/runtime
    • Parameters

      • msg: any

      Returns any

    Generated using TypeDoc

    \ No newline at end of file +invoke | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Enable.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Enable.html index 2659bfd80..0d1961d1a 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Enable.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Enable.html @@ -1,2 +1,2 @@ Enable | @wailsio/runtime
    • Schedules an automatic reload of WML to be performed as soon as the document is fully loaded.

      -

      Returns void

    Generated using TypeDoc

    \ No newline at end of file +

    Returns void

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Reload.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Reload.html index 3659194ea..60a617d38 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Reload.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Reload.html @@ -1,2 +1,2 @@ Reload | @wailsio/runtime
    • Reloads the WML page by adding necessary event listeners and browser listeners.

      -

      Returns void

    Generated using TypeDoc

    \ No newline at end of file +

    Returns void

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/init.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/init.html index 7ae37c231..fe15a9f06 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/init.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/init.html @@ -1 +1 @@ -init | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file +init | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Call.CallOptions.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Call.CallOptions.html new file mode 100644 index 000000000..dad01b74b --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Call.CallOptions.html @@ -0,0 +1,7 @@ +CallOptions | @wailsio/runtime

    Interface CallOptions

    interface CallOptions {
        args: any[];
        methodID: undefined | number;
        methodName: undefined | string;
    }

    Properties

    Properties

    args: any[]

    Arguments to be passed into the bound method.

    +
    methodID: undefined | number

    The numeric ID of the bound method to call.

    +
    methodName: undefined | string

    The fully qualified name of the bound method to call.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.Button.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.Button.html index 0a8b97861..9b82a7b58 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.Button.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.Button.html @@ -1,7 +1,7 @@ -Button | @wailsio/runtime
    interface Button {
        IsCancel: undefined | boolean;
        IsDefault: undefined | boolean;
        Label: undefined | string;
    }

    Properties

    IsCancel +Button | @wailsio/runtime
    interface Button {
        IsCancel: undefined | boolean;
        IsDefault: undefined | boolean;
        Label: undefined | string;
    }

    Properties

    IsCancel: undefined | boolean

    True if the button should cancel an operation when clicked.

    -
    IsDefault: undefined | boolean

    True if the button should be the default action when the user presses enter.

    -
    Label: undefined | string

    Text that appears within the button.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    IsDefault: undefined | boolean

    True if the button should be the default action when the user presses enter.

    +
    Label: undefined | string

    Text that appears within the button.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.FileFilter.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.FileFilter.html index 149e12992..19eea827a 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.FileFilter.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.FileFilter.html @@ -1,5 +1,5 @@ -FileFilter | @wailsio/runtime
    interface FileFilter {
        DisplayName: undefined | string;
        Pattern: undefined | string;
    }

    Properties

    DisplayName +FileFilter | @wailsio/runtime
    interface FileFilter {
        DisplayName: undefined | string;
        Pattern: undefined | string;
    }

    Properties

    Properties

    DisplayName: undefined | string

    Display name for the filter, it could be "Text Files", "Images" etc.

    -
    Pattern: undefined | string

    Pattern to match for the filter, e.g. ".txt;.md" for text markdown files.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    Pattern: undefined | string

    Pattern to match for the filter, e.g. ".txt;.md" for text markdown files.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.MessageDialogOptions.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.MessageDialogOptions.html index 8d9843d86..609c7b979 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.MessageDialogOptions.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.MessageDialogOptions.html @@ -1,9 +1,9 @@ -MessageDialogOptions | @wailsio/runtime

    Interface MessageDialogOptions

    interface MessageDialogOptions {
        Buttons: undefined | Button[];
        Detached: undefined | boolean;
        Message: undefined | string;
        Title: undefined | string;
    }

    Properties

    Buttons +MessageDialogOptions | @wailsio/runtime

    Interface MessageDialogOptions

    interface MessageDialogOptions {
        Buttons: undefined | Button[];
        Detached: undefined | boolean;
        Message: undefined | string;
        Title: undefined | string;
    }

    Properties

    Buttons: undefined | Button[]

    Array of button options to show in the dialog.

    -
    Detached: undefined | boolean

    True if the dialog should appear detached from the main window (if applicable).

    -
    Message: undefined | string

    The main message to show in the dialog.

    -
    Title: undefined | string

    The title of the dialog window.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    Detached: undefined | boolean

    True if the dialog should appear detached from the main window (if applicable).

    +
    Message: undefined | string

    The main message to show in the dialog.

    +
    Title: undefined | string

    The title of the dialog window.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.OpenFileDialogOptions.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.OpenFileDialogOptions.html index 52f6b11ea..19bf1ba42 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.OpenFileDialogOptions.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.OpenFileDialogOptions.html @@ -1,4 +1,4 @@ -OpenFileDialogOptions | @wailsio/runtime

    Interface OpenFileDialogOptions

    interface OpenFileDialogOptions {
        AllowsMultipleSelection: undefined | boolean;
        AllowsOtherFiletypes: undefined | boolean;
        ButtonText: undefined | string;
        CanChooseDirectories: undefined | boolean;
        CanChooseFiles: undefined | boolean;
        CanCreateDirectories: undefined | boolean;
        CanSelectHiddenExtension: undefined | boolean;
        Detached: undefined | boolean;
        Directory: undefined | string;
        Filters: undefined | FileFilter[];
        HideExtension: undefined | boolean;
        Message: undefined | string;
        ResolvesAliases: undefined | boolean;
        ShowHiddenFiles: undefined | boolean;
        Title: undefined | string;
        TreatsFilePackagesAsDirectories: undefined | boolean;
    }

    Properties

    AllowsMultipleSelection +OpenFileDialogOptions | @wailsio/runtime

    Interface OpenFileDialogOptions

    interface OpenFileDialogOptions {
        AllowsMultipleSelection: undefined | boolean;
        AllowsOtherFiletypes: undefined | boolean;
        ButtonText: undefined | string;
        CanChooseDirectories: undefined | boolean;
        CanChooseFiles: undefined | boolean;
        CanCreateDirectories: undefined | boolean;
        CanSelectHiddenExtension: undefined | boolean;
        Detached: undefined | boolean;
        Directory: undefined | string;
        Filters: undefined | FileFilter[];
        HideExtension: undefined | boolean;
        Message: undefined | string;
        ResolvesAliases: undefined | boolean;
        ShowHiddenFiles: undefined | boolean;
        Title: undefined | string;
        TreatsFilePackagesAsDirectories: undefined | boolean;
    }

    Properties

    AllowsMultipleSelection: undefined | boolean

    Indicates if multiple selection is allowed.

    -
    AllowsOtherFiletypes: undefined | boolean

    Indicates if other file types are allowed.

    -
    ButtonText: undefined | string

    Text to display on the button.

    -
    CanChooseDirectories: undefined | boolean

    Indicates if directories can be chosen.

    -
    CanChooseFiles: undefined | boolean

    Indicates if files can be chosen.

    -
    CanCreateDirectories: undefined | boolean

    Indicates if directories can be created.

    -
    CanSelectHiddenExtension: undefined | boolean

    Indicates if hidden extensions can be selected.

    -
    Detached: undefined | boolean

    Indicates if the dialog should appear detached from the main window.

    -
    Directory: undefined | string

    Directory to open in the dialog.

    -
    Filters: undefined | FileFilter[]

    Array of file filters.

    -
    HideExtension: undefined | boolean

    Indicates if the extension should be hidden.

    -
    Message: undefined | string

    Message to show in the dialog.

    -
    ResolvesAliases: undefined | boolean

    Indicates if aliases should be resolved.

    -
    ShowHiddenFiles: undefined | boolean

    Indicates if hidden files should be shown.

    -
    Title: undefined | string

    Title of the dialog.

    -
    TreatsFilePackagesAsDirectories: undefined | boolean

    Indicates if file packages should be treated as directories.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    AllowsOtherFiletypes: undefined | boolean

    Indicates if other file types are allowed.

    +
    ButtonText: undefined | string

    Text to display on the button.

    +
    CanChooseDirectories: undefined | boolean

    Indicates if directories can be chosen.

    +
    CanChooseFiles: undefined | boolean

    Indicates if files can be chosen.

    +
    CanCreateDirectories: undefined | boolean

    Indicates if directories can be created.

    +
    CanSelectHiddenExtension: undefined | boolean

    Indicates if hidden extensions can be selected.

    +
    Detached: undefined | boolean

    Indicates if the dialog should appear detached from the main window.

    +
    Directory: undefined | string

    Directory to open in the dialog.

    +
    Filters: undefined | FileFilter[]

    Array of file filters.

    +
    HideExtension: undefined | boolean

    Indicates if the extension should be hidden.

    +
    Message: undefined | string

    Message to show in the dialog.

    +
    ResolvesAliases: undefined | boolean

    Indicates if aliases should be resolved.

    +
    ShowHiddenFiles: undefined | boolean

    Indicates if hidden files should be shown.

    +
    Title: undefined | string

    Title of the dialog.

    +
    TreatsFilePackagesAsDirectories: undefined | boolean

    Indicates if file packages should be treated as directories.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.SaveFileDialogOptions.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.SaveFileDialogOptions.html index a51cc257b..99d04ff77 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.SaveFileDialogOptions.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.SaveFileDialogOptions.html @@ -1,4 +1,4 @@ -SaveFileDialogOptions | @wailsio/runtime

    Interface SaveFileDialogOptions

    interface SaveFileDialogOptions {
        AllowsMultipleSelection: undefined | boolean;
        AllowsOtherFiletypes: undefined | boolean;
        ButtonText: undefined | string;
        CanChooseDirectories: undefined | boolean;
        CanChooseFiles: undefined | boolean;
        CanCreateDirectories: undefined | boolean;
        CanSelectHiddenExtension: undefined | boolean;
        Detached: undefined | boolean;
        Directory: undefined | string;
        Filename: undefined | string;
        Filters: undefined | FileFilter[];
        HideExtension: undefined | boolean;
        Message: undefined | string;
        ResolvesAliases: undefined | boolean;
        ShowHiddenFiles: undefined | boolean;
        Title: undefined | string;
        TreatsFilePackagesAsDirectories: undefined | boolean;
    }

    Properties

    AllowsMultipleSelection +SaveFileDialogOptions | @wailsio/runtime

    Interface SaveFileDialogOptions

    interface SaveFileDialogOptions {
        AllowsMultipleSelection: undefined | boolean;
        AllowsOtherFiletypes: undefined | boolean;
        ButtonText: undefined | string;
        CanChooseDirectories: undefined | boolean;
        CanChooseFiles: undefined | boolean;
        CanCreateDirectories: undefined | boolean;
        CanSelectHiddenExtension: undefined | boolean;
        Detached: undefined | boolean;
        Directory: undefined | string;
        Filename: undefined | string;
        Filters: undefined | FileFilter[];
        HideExtension: undefined | boolean;
        Message: undefined | string;
        ResolvesAliases: undefined | boolean;
        ShowHiddenFiles: undefined | boolean;
        Title: undefined | string;
        TreatsFilePackagesAsDirectories: undefined | boolean;
    }

    Properties

    AllowsMultipleSelection: undefined | boolean

    Indicates if multiple selection is allowed.

    -
    AllowsOtherFiletypes: undefined | boolean

    Indicates if other file types are allowed.

    -
    ButtonText: undefined | string

    Text to display on the button.

    -
    CanChooseDirectories: undefined | boolean

    Indicates if directories can be chosen.

    -
    CanChooseFiles: undefined | boolean

    Indicates if files can be chosen.

    -
    CanCreateDirectories: undefined | boolean

    Indicates if directories can be created.

    -
    CanSelectHiddenExtension: undefined | boolean

    Indicates if hidden extensions can be selected.

    -
    Detached: undefined | boolean

    Indicates if the dialog should appear detached from the main window.

    -
    Directory: undefined | string

    Directory to open in the dialog.

    -
    Filename: undefined | string

    Default filename to use in the dialog.

    -
    Filters: undefined | FileFilter[]

    Array of file filters.

    -
    HideExtension: undefined | boolean

    Indicates if the extension should be hidden.

    -
    Message: undefined | string

    Message to show in the dialog.

    -
    ResolvesAliases: undefined | boolean

    Indicates if aliases should be resolved.

    -
    ShowHiddenFiles: undefined | boolean

    Indicates if hidden files should be shown.

    -
    Title: undefined | string

    Title of the dialog.

    -
    TreatsFilePackagesAsDirectories: undefined | boolean

    Indicates if file packages should be treated as directories.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    AllowsOtherFiletypes: undefined | boolean

    Indicates if other file types are allowed.

    +
    ButtonText: undefined | string

    Text to display on the button.

    +
    CanChooseDirectories: undefined | boolean

    Indicates if directories can be chosen.

    +
    CanChooseFiles: undefined | boolean

    Indicates if files can be chosen.

    +
    CanCreateDirectories: undefined | boolean

    Indicates if directories can be created.

    +
    CanSelectHiddenExtension: undefined | boolean

    Indicates if hidden extensions can be selected.

    +
    Detached: undefined | boolean

    Indicates if the dialog should appear detached from the main window.

    +
    Directory: undefined | string

    Directory to open in the dialog.

    +
    Filename: undefined | string

    Default filename to use in the dialog.

    +
    Filters: undefined | FileFilter[]

    Array of file filters.

    +
    HideExtension: undefined | boolean

    Indicates if the extension should be hidden.

    +
    Message: undefined | string

    Message to show in the dialog.

    +
    ResolvesAliases: undefined | boolean

    Indicates if aliases should be resolved.

    +
    ShowHiddenFiles: undefined | boolean

    Indicates if hidden files should be shown.

    +
    Title: undefined | string

    Title of the dialog.

    +
    TreatsFilePackagesAsDirectories: undefined | boolean

    Indicates if file packages should be treated as directories.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Rect.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Rect.html index 09b621d07..061657146 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Rect.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Rect.html @@ -1,9 +1,9 @@ -Rect | @wailsio/runtime
    interface Rect {
        Height: number;
        Width: number;
        X: number;
        Y: number;
    }

    Properties

    Height +Rect | @wailsio/runtime
    interface Rect {
        Height: number;
        Width: number;
        X: number;
        Y: number;
    }

    Properties

    Properties

    Height: number

    The height of the rectangle.

    -
    Width: number

    The width of the rectangle.

    -
    X: number

    The X coordinate of the origin.

    -
    Y: number

    The Y coordinate of the origin.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    Width: number

    The width of the rectangle.

    +
    X: number

    The X coordinate of the origin.

    +
    Y: number

    The Y coordinate of the origin.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Screen.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Screen.html index cc548efe2..152f5c183 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Screen.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Screen.html @@ -1,4 +1,4 @@ -Screen | @wailsio/runtime
    interface Screen {
        Bounds: Rect;
        ID: string;
        IsPrimary: boolean;
        Name: string;
        PhysicalBounds: Rect;
        PhysicalWorkArea: Rect;
        Rotation: number;
        ScaleFactor: number;
        Size: Size;
        WorkArea: Rect;
        X: number;
        Y: number;
    }

    Properties

    Bounds +Screen | @wailsio/runtime
    interface Screen {
        Bounds: Rect;
        ID: string;
        IsPrimary: boolean;
        Name: string;
        PhysicalBounds: Rect;
        PhysicalWorkArea: Rect;
        Rotation: number;
        ScaleFactor: number;
        Size: Size;
        WorkArea: Rect;
        X: number;
        Y: number;
    }

    Properties

    Bounds ID IsPrimary Name @@ -11,15 +11,15 @@ X Y

    Properties

    Bounds: Rect

    Contains the bounds of the screen in terms of X, Y, Width, and Height.

    -
    ID: string

    Unique identifier for the screen.

    -
    IsPrimary: boolean

    True if this is the primary monitor selected by the user in the operating system.

    -
    Name: string

    Human readable name of the screen.

    -
    PhysicalBounds: Rect

    Contains the physical bounds of the screen in terms of X, Y, Width, and Height (before scaling).

    -
    PhysicalWorkArea: Rect

    Contains the physical WorkArea of the screen (before scaling).

    -
    Rotation: number

    The rotation of the screen.

    -
    ScaleFactor: number

    The scale factor of the screen (DPI/96). 1 = standard DPI, 2 = HiDPI (Retina), etc.

    -
    Size: Size

    Contains the width and height of the screen.

    -
    WorkArea: Rect

    Contains the area of the screen that is actually usable (excluding taskbar and other system UI).

    -
    X: number

    The X coordinate of the screen.

    -
    Y: number

    The Y coordinate of the screen.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    ID: string

    Unique identifier for the screen.

    +
    IsPrimary: boolean

    True if this is the primary monitor selected by the user in the operating system.

    +
    Name: string

    Human readable name of the screen.

    +
    PhysicalBounds: Rect

    Contains the physical bounds of the screen in terms of X, Y, Width, and Height (before scaling).

    +
    PhysicalWorkArea: Rect

    Contains the physical WorkArea of the screen (before scaling).

    +
    Rotation: number

    The rotation of the screen.

    +
    ScaleFactor: number

    The scale factor of the screen (DPI/96). 1 = standard DPI, 2 = HiDPI (Retina), etc.

    +
    Size: Size

    Contains the width and height of the screen.

    +
    WorkArea: Rect

    Contains the area of the screen that is actually usable (excluding taskbar and other system UI).

    +
    X: number

    The X coordinate of the screen.

    +
    Y: number

    The Y coordinate of the screen.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Size.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Size.html index b5d89c97b..df8d06084 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Size.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Size.html @@ -1,5 +1,5 @@ -Size | @wailsio/runtime
    interface Size {
        Height: number;
        Width: number;
    }

    Properties

    Height +Size | @wailsio/runtime
    interface Size {
        Height: number;
        Width: number;
    }

    Properties

    Properties

    Height: number

    The height.

    -
    Width: number

    The width.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    Width: number

    The width.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.EnvironmentInfo.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.EnvironmentInfo.html index 9771266f3..f34fccb77 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.EnvironmentInfo.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.EnvironmentInfo.html @@ -1,11 +1,11 @@ -EnvironmentInfo | @wailsio/runtime

    Interface EnvironmentInfo

    interface EnvironmentInfo {
        Arch: string;
        Debug: boolean;
        OS: string;
        OSInfo: OSInfo;
        PlatformInfo: Object;
    }

    Properties

    Arch +EnvironmentInfo | @wailsio/runtime

    Interface EnvironmentInfo

    interface EnvironmentInfo {
        Arch: string;
        Debug: boolean;
        OS: string;
        OSInfo: OSInfo;
        PlatformInfo: Object;
    }

    Properties

    Arch: string

    The architecture of the system.

    -
    Debug: boolean

    True if the application is running in debug mode, otherwise false.

    -
    OS: string

    The operating system in use.

    -
    OSInfo: OSInfo

    Details of the operating system.

    -
    PlatformInfo: Object

    Additional platform information.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    Debug: boolean

    True if the application is running in debug mode, otherwise false.

    +
    OS: string

    The operating system in use.

    +
    OSInfo: OSInfo

    Details of the operating system.

    +
    PlatformInfo: Object

    Additional platform information.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.OSInfo.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.OSInfo.html index 15b0b3697..b08a3cd05 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.OSInfo.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.OSInfo.html @@ -1,9 +1,9 @@ -OSInfo | @wailsio/runtime
    interface OSInfo {
        Branding: string;
        ID: string;
        Name: string;
        Version: string;
    }

    Properties

    Branding +OSInfo | @wailsio/runtime
    interface OSInfo {
        Branding: string;
        ID: string;
        Name: string;
        Version: string;
    }

    Properties

    Properties

    Branding: string

    The branding of the OS.

    -
    ID: string

    The ID of the OS.

    -
    Name: string

    The name of the OS.

    -
    Version: string

    The version of the OS.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    ID: string

    The ID of the OS.

    +
    Name: string

    The name of the OS.

    +
    Version: string

    The version of the OS.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Application.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Application.html index 789688e85..c2e707da7 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Application.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Application.html @@ -1,4 +1,4 @@ -Application | @wailsio/runtime

    Namespace Application

    Index

    Functions

    Hide +Application | @wailsio/runtime

    Namespace Application

    Index

    Functions

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Browser.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Browser.html index 27f624a65..d7a4db8d3 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Browser.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Browser.html @@ -1,2 +1,2 @@ -Browser | @wailsio/runtime

    Namespace Browser

    Index

    Functions

    OpenURL +Browser | @wailsio/runtime

    Namespace Browser

    Index

    Functions

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Call.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Call.html index 9f266235a..57343eecc 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Call.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Call.html @@ -1,5 +1,6 @@ -Call | @wailsio/runtime

    Namespace Call

    Index

    Functions

    ByID +Call | @wailsio/runtime

    Namespace Call

    Index

    Classes

    Interfaces

    Functions

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Clipboard.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Clipboard.html index a256cfcba..3fbf76e42 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Clipboard.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Clipboard.html @@ -1,3 +1,3 @@ -Clipboard | @wailsio/runtime

    Namespace Clipboard

    Index

    Functions

    SetText +Clipboard | @wailsio/runtime

    Namespace Clipboard

    Index

    Functions

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Create.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Create.html index f1f6f57bb..7a552333c 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Create.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Create.html @@ -1,4 +1,4 @@ -Create | @wailsio/runtime

    Namespace Create

    Index

    Functions

    Any +Create | @wailsio/runtime

    Namespace Create

    Index

    Functions

    Any Array ByteSlice Map diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Dialogs.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Dialogs.html index 92c8f0efc..559d76c10 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Dialogs.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Dialogs.html @@ -1,4 +1,4 @@ -Dialogs | @wailsio/runtime

    Namespace Dialogs

    Index

    Interfaces

    Button +Dialogs | @wailsio/runtime

    Namespace Dialogs

    Index

    Interfaces

    Button FileFilter MessageDialogOptions OpenFileDialogOptions diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Events.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Events.html index 1146df181..9eb586414 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Events.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Events.html @@ -1,4 +1,4 @@ -Events | @wailsio/runtime

    Namespace Events

    Index

    Classes

    WailsEvent +Events | @wailsio/runtime

    Namespace Events

    Index

    Classes

    Variables

    Functions

    Emit Off diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Flags.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Flags.html index 0fd35b980..21e0baf68 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Flags.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Flags.html @@ -1,2 +1,2 @@ -Flags | @wailsio/runtime

    Namespace Flags

    Index

    Functions

    GetFlag +Flags | @wailsio/runtime

    Namespace Flags

    Index

    Functions

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Screens.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Screens.html index 006e2f6a6..b05971b6b 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Screens.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Screens.html @@ -1,4 +1,4 @@ -Screens | @wailsio/runtime

    Namespace Screens

    Index

    Interfaces

    Rect +Screens | @wailsio/runtime

    Namespace Screens

    Index

    Interfaces

    Functions

    GetAll diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/System.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/System.html index 30d3be1f1..593bb0241 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/System.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/System.html @@ -1,4 +1,4 @@ -System | @wailsio/runtime

    Namespace System

    Index

    Interfaces

    EnvironmentInfo +System | @wailsio/runtime

    Namespace System

    Index

    Interfaces

    Functions

    Capabilities Environment diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/WML.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/WML.html index 2ec16bd38..57e00073a 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/WML.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/WML.html @@ -1,3 +1,3 @@ -WML | @wailsio/runtime

    Namespace WML

    Index

    Functions

    Enable +WML | @wailsio/runtime

    Namespace WML

    Index

    Functions

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Events.Types.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Events.Types.html index e8b79328c..9ad714080 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Events.Types.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Events.Types.html @@ -1 +1 @@ -Types | @wailsio/runtime

    Variable TypesConst

    Types: {
        Common: {
            ApplicationOpenedWithFile: string;
            ApplicationStarted: string;
            ThemeChanged: string;
            WindowClosing: string;
            WindowDPIChanged: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowFilesDropped: string;
            WindowFocus: string;
            WindowFullscreen: string;
            WindowHide: string;
            WindowLostFocus: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowRestore: string;
            WindowRuntimeReady: string;
            WindowShow: string;
            WindowUnFullscreen: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowZoom: string;
            WindowZoomIn: string;
            WindowZoomOut: string;
            WindowZoomReset: string;
        };
        Linux: {
            ApplicationStartup: string;
            SystemThemeChanged: string;
            WindowDeleteEvent: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowFocusIn: string;
            WindowFocusOut: string;
            WindowLoadChanged: string;
        };
        Mac: {
            ApplicationDidBecomeActive: string;
            ApplicationDidChangeBackingProperties: string;
            ApplicationDidChangeEffectiveAppearance: string;
            ApplicationDidChangeIcon: string;
            ApplicationDidChangeOcclusionState: string;
            ApplicationDidChangeScreenParameters: string;
            ApplicationDidChangeStatusBarFrame: string;
            ApplicationDidChangeStatusBarOrientation: string;
            ApplicationDidChangeTheme: string;
            ApplicationDidFinishLaunching: string;
            ApplicationDidHide: string;
            ApplicationDidResignActive: string;
            ApplicationDidUnhide: string;
            ApplicationDidUpdate: string;
            ApplicationShouldHandleReopen: string;
            ApplicationWillBecomeActive: string;
            ApplicationWillFinishLaunching: string;
            ApplicationWillHide: string;
            ApplicationWillResignActive: string;
            ApplicationWillTerminate: string;
            ApplicationWillUnhide: string;
            ApplicationWillUpdate: string;
            MenuDidAddItem: string;
            MenuDidBeginTracking: string;
            MenuDidClose: string;
            MenuDidDisplayItem: string;
            MenuDidEndTracking: string;
            MenuDidHighlightItem: string;
            MenuDidOpen: string;
            MenuDidPopUp: string;
            MenuDidRemoveItem: string;
            MenuDidSendAction: string;
            MenuDidSendActionToItem: string;
            MenuDidUpdate: string;
            MenuWillAddItem: string;
            MenuWillBeginTracking: string;
            MenuWillDisplayItem: string;
            MenuWillEndTracking: string;
            MenuWillHighlightItem: string;
            MenuWillOpen: string;
            MenuWillPopUp: string;
            MenuWillRemoveItem: string;
            MenuWillSendAction: string;
            MenuWillSendActionToItem: string;
            MenuWillUpdate: string;
            WebViewDidCommitNavigation: string;
            WebViewDidFinishNavigation: string;
            WebViewDidReceiveServerRedirectForProvisionalNavigation: string;
            WebViewDidStartProvisionalNavigation: string;
            WindowDidBecomeKey: string;
            WindowDidBecomeMain: string;
            WindowDidBeginSheet: string;
            WindowDidChangeAlpha: string;
            WindowDidChangeBackingLocation: string;
            WindowDidChangeBackingProperties: string;
            WindowDidChangeCollectionBehavior: string;
            WindowDidChangeEffectiveAppearance: string;
            WindowDidChangeOcclusionState: string;
            WindowDidChangeOrderingMode: string;
            WindowDidChangeScreen: string;
            WindowDidChangeScreenParameters: string;
            WindowDidChangeScreenProfile: string;
            WindowDidChangeScreenSpace: string;
            WindowDidChangeScreenSpaceProperties: string;
            WindowDidChangeSharingType: string;
            WindowDidChangeSpace: string;
            WindowDidChangeSpaceOrderingMode: string;
            WindowDidChangeTitle: string;
            WindowDidChangeToolbar: string;
            WindowDidDeminiaturize: string;
            WindowDidEndSheet: string;
            WindowDidEnterFullScreen: string;
            WindowDidEnterVersionBrowser: string;
            WindowDidExitFullScreen: string;
            WindowDidExitVersionBrowser: string;
            WindowDidExpose: string;
            WindowDidFocus: string;
            WindowDidMiniaturize: string;
            WindowDidMove: string;
            WindowDidOrderOffScreen: string;
            WindowDidOrderOnScreen: string;
            WindowDidResignKey: string;
            WindowDidResignMain: string;
            WindowDidResize: string;
            WindowDidUpdate: string;
            WindowDidUpdateAlpha: string;
            WindowDidUpdateCollectionBehavior: string;
            WindowDidUpdateCollectionProperties: string;
            WindowDidUpdateShadow: string;
            WindowDidUpdateTitle: string;
            WindowDidUpdateToolbar: string;
            WindowDidZoom: string;
            WindowFileDraggingEntered: string;
            WindowFileDraggingExited: string;
            WindowFileDraggingPerformed: string;
            WindowHide: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowShouldClose: string;
            WindowShow: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowWillBecomeKey: string;
            WindowWillBecomeMain: string;
            WindowWillBeginSheet: string;
            WindowWillChangeOrderingMode: string;
            WindowWillClose: string;
            WindowWillDeminiaturize: string;
            WindowWillEnterFullScreen: string;
            WindowWillEnterVersionBrowser: string;
            WindowWillExitFullScreen: string;
            WindowWillExitVersionBrowser: string;
            WindowWillFocus: string;
            WindowWillMiniaturize: string;
            WindowWillMove: string;
            WindowWillOrderOffScreen: string;
            WindowWillOrderOnScreen: string;
            WindowWillResignMain: string;
            WindowWillResize: string;
            WindowWillUnfocus: string;
            WindowWillUpdate: string;
            WindowWillUpdateAlpha: string;
            WindowWillUpdateCollectionBehavior: string;
            WindowWillUpdateCollectionProperties: string;
            WindowWillUpdateShadow: string;
            WindowWillUpdateTitle: string;
            WindowWillUpdateToolbar: string;
            WindowWillUpdateVisibility: string;
            WindowWillUseStandardFrame: string;
            WindowZoomIn: string;
            WindowZoomOut: string;
            WindowZoomReset: string;
        };
        Windows: {
            APMPowerSettingChange: string;
            APMPowerStatusChange: string;
            APMResumeAutomatic: string;
            APMResumeSuspend: string;
            APMSuspend: string;
            ApplicationStarted: string;
            SystemThemeChanged: string;
            WebViewNavigationCompleted: string;
            WindowActive: string;
            WindowBackgroundErase: string;
            WindowClickActive: string;
            WindowClosing: string;
            WindowDPIChanged: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowDragDrop: string;
            WindowDragEnter: string;
            WindowDragLeave: string;
            WindowDragOver: string;
            WindowEndMove: string;
            WindowEndResize: string;
            WindowFullscreen: string;
            WindowHide: string;
            WindowInactive: string;
            WindowKeyDown: string;
            WindowKeyUp: string;
            WindowKillFocus: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowNonClientHit: string;
            WindowNonClientMouseDown: string;
            WindowNonClientMouseLeave: string;
            WindowNonClientMouseMove: string;
            WindowNonClientMouseUp: string;
            WindowPaint: string;
            WindowRestore: string;
            WindowSetFocus: string;
            WindowShow: string;
            WindowStartMove: string;
            WindowStartResize: string;
            WindowUnFullscreen: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowZOrderChanged: string;
        };
    } = EventTypes

    Type declaration

    • Common: {
          ApplicationOpenedWithFile: string;
          ApplicationStarted: string;
          ThemeChanged: string;
          WindowClosing: string;
          WindowDPIChanged: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowFilesDropped: string;
          WindowFocus: string;
          WindowFullscreen: string;
          WindowHide: string;
          WindowLostFocus: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowRestore: string;
          WindowRuntimeReady: string;
          WindowShow: string;
          WindowUnFullscreen: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowZoom: string;
          WindowZoomIn: string;
          WindowZoomOut: string;
          WindowZoomReset: string;
      }
      • ApplicationOpenedWithFile: string
      • ApplicationStarted: string
      • ThemeChanged: string
      • WindowClosing: string
      • WindowDPIChanged: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowFilesDropped: string
      • WindowFocus: string
      • WindowFullscreen: string
      • WindowHide: string
      • WindowLostFocus: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowRestore: string
      • WindowRuntimeReady: string
      • WindowShow: string
      • WindowUnFullscreen: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowZoom: string
      • WindowZoomIn: string
      • WindowZoomOut: string
      • WindowZoomReset: string
    • Linux: {
          ApplicationStartup: string;
          SystemThemeChanged: string;
          WindowDeleteEvent: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowFocusIn: string;
          WindowFocusOut: string;
          WindowLoadChanged: string;
      }
      • ApplicationStartup: string
      • SystemThemeChanged: string
      • WindowDeleteEvent: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowFocusIn: string
      • WindowFocusOut: string
      • WindowLoadChanged: string
    • Mac: {
          ApplicationDidBecomeActive: string;
          ApplicationDidChangeBackingProperties: string;
          ApplicationDidChangeEffectiveAppearance: string;
          ApplicationDidChangeIcon: string;
          ApplicationDidChangeOcclusionState: string;
          ApplicationDidChangeScreenParameters: string;
          ApplicationDidChangeStatusBarFrame: string;
          ApplicationDidChangeStatusBarOrientation: string;
          ApplicationDidChangeTheme: string;
          ApplicationDidFinishLaunching: string;
          ApplicationDidHide: string;
          ApplicationDidResignActive: string;
          ApplicationDidUnhide: string;
          ApplicationDidUpdate: string;
          ApplicationShouldHandleReopen: string;
          ApplicationWillBecomeActive: string;
          ApplicationWillFinishLaunching: string;
          ApplicationWillHide: string;
          ApplicationWillResignActive: string;
          ApplicationWillTerminate: string;
          ApplicationWillUnhide: string;
          ApplicationWillUpdate: string;
          MenuDidAddItem: string;
          MenuDidBeginTracking: string;
          MenuDidClose: string;
          MenuDidDisplayItem: string;
          MenuDidEndTracking: string;
          MenuDidHighlightItem: string;
          MenuDidOpen: string;
          MenuDidPopUp: string;
          MenuDidRemoveItem: string;
          MenuDidSendAction: string;
          MenuDidSendActionToItem: string;
          MenuDidUpdate: string;
          MenuWillAddItem: string;
          MenuWillBeginTracking: string;
          MenuWillDisplayItem: string;
          MenuWillEndTracking: string;
          MenuWillHighlightItem: string;
          MenuWillOpen: string;
          MenuWillPopUp: string;
          MenuWillRemoveItem: string;
          MenuWillSendAction: string;
          MenuWillSendActionToItem: string;
          MenuWillUpdate: string;
          WebViewDidCommitNavigation: string;
          WebViewDidFinishNavigation: string;
          WebViewDidReceiveServerRedirectForProvisionalNavigation: string;
          WebViewDidStartProvisionalNavigation: string;
          WindowDidBecomeKey: string;
          WindowDidBecomeMain: string;
          WindowDidBeginSheet: string;
          WindowDidChangeAlpha: string;
          WindowDidChangeBackingLocation: string;
          WindowDidChangeBackingProperties: string;
          WindowDidChangeCollectionBehavior: string;
          WindowDidChangeEffectiveAppearance: string;
          WindowDidChangeOcclusionState: string;
          WindowDidChangeOrderingMode: string;
          WindowDidChangeScreen: string;
          WindowDidChangeScreenParameters: string;
          WindowDidChangeScreenProfile: string;
          WindowDidChangeScreenSpace: string;
          WindowDidChangeScreenSpaceProperties: string;
          WindowDidChangeSharingType: string;
          WindowDidChangeSpace: string;
          WindowDidChangeSpaceOrderingMode: string;
          WindowDidChangeTitle: string;
          WindowDidChangeToolbar: string;
          WindowDidDeminiaturize: string;
          WindowDidEndSheet: string;
          WindowDidEnterFullScreen: string;
          WindowDidEnterVersionBrowser: string;
          WindowDidExitFullScreen: string;
          WindowDidExitVersionBrowser: string;
          WindowDidExpose: string;
          WindowDidFocus: string;
          WindowDidMiniaturize: string;
          WindowDidMove: string;
          WindowDidOrderOffScreen: string;
          WindowDidOrderOnScreen: string;
          WindowDidResignKey: string;
          WindowDidResignMain: string;
          WindowDidResize: string;
          WindowDidUpdate: string;
          WindowDidUpdateAlpha: string;
          WindowDidUpdateCollectionBehavior: string;
          WindowDidUpdateCollectionProperties: string;
          WindowDidUpdateShadow: string;
          WindowDidUpdateTitle: string;
          WindowDidUpdateToolbar: string;
          WindowDidZoom: string;
          WindowFileDraggingEntered: string;
          WindowFileDraggingExited: string;
          WindowFileDraggingPerformed: string;
          WindowHide: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowShouldClose: string;
          WindowShow: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowWillBecomeKey: string;
          WindowWillBecomeMain: string;
          WindowWillBeginSheet: string;
          WindowWillChangeOrderingMode: string;
          WindowWillClose: string;
          WindowWillDeminiaturize: string;
          WindowWillEnterFullScreen: string;
          WindowWillEnterVersionBrowser: string;
          WindowWillExitFullScreen: string;
          WindowWillExitVersionBrowser: string;
          WindowWillFocus: string;
          WindowWillMiniaturize: string;
          WindowWillMove: string;
          WindowWillOrderOffScreen: string;
          WindowWillOrderOnScreen: string;
          WindowWillResignMain: string;
          WindowWillResize: string;
          WindowWillUnfocus: string;
          WindowWillUpdate: string;
          WindowWillUpdateAlpha: string;
          WindowWillUpdateCollectionBehavior: string;
          WindowWillUpdateCollectionProperties: string;
          WindowWillUpdateShadow: string;
          WindowWillUpdateTitle: string;
          WindowWillUpdateToolbar: string;
          WindowWillUpdateVisibility: string;
          WindowWillUseStandardFrame: string;
          WindowZoomIn: string;
          WindowZoomOut: string;
          WindowZoomReset: string;
      }
      • ApplicationDidBecomeActive: string
      • ApplicationDidChangeBackingProperties: string
      • ApplicationDidChangeEffectiveAppearance: string
      • ApplicationDidChangeIcon: string
      • ApplicationDidChangeOcclusionState: string
      • ApplicationDidChangeScreenParameters: string
      • ApplicationDidChangeStatusBarFrame: string
      • ApplicationDidChangeStatusBarOrientation: string
      • ApplicationDidChangeTheme: string
      • ApplicationDidFinishLaunching: string
      • ApplicationDidHide: string
      • ApplicationDidResignActive: string
      • ApplicationDidUnhide: string
      • ApplicationDidUpdate: string
      • ApplicationShouldHandleReopen: string
      • ApplicationWillBecomeActive: string
      • ApplicationWillFinishLaunching: string
      • ApplicationWillHide: string
      • ApplicationWillResignActive: string
      • ApplicationWillTerminate: string
      • ApplicationWillUnhide: string
      • ApplicationWillUpdate: string
      • MenuDidAddItem: string
      • MenuDidBeginTracking: string
      • MenuDidClose: string
      • MenuDidDisplayItem: string
      • MenuDidEndTracking: string
      • MenuDidHighlightItem: string
      • MenuDidOpen: string
      • MenuDidPopUp: string
      • MenuDidRemoveItem: string
      • MenuDidSendAction: string
      • MenuDidSendActionToItem: string
      • MenuDidUpdate: string
      • MenuWillAddItem: string
      • MenuWillBeginTracking: string
      • MenuWillDisplayItem: string
      • MenuWillEndTracking: string
      • MenuWillHighlightItem: string
      • MenuWillOpen: string
      • MenuWillPopUp: string
      • MenuWillRemoveItem: string
      • MenuWillSendAction: string
      • MenuWillSendActionToItem: string
      • MenuWillUpdate: string
      • WebViewDidCommitNavigation: string
      • WebViewDidFinishNavigation: string
      • WebViewDidReceiveServerRedirectForProvisionalNavigation: string
      • WebViewDidStartProvisionalNavigation: string
      • WindowDidBecomeKey: string
      • WindowDidBecomeMain: string
      • WindowDidBeginSheet: string
      • WindowDidChangeAlpha: string
      • WindowDidChangeBackingLocation: string
      • WindowDidChangeBackingProperties: string
      • WindowDidChangeCollectionBehavior: string
      • WindowDidChangeEffectiveAppearance: string
      • WindowDidChangeOcclusionState: string
      • WindowDidChangeOrderingMode: string
      • WindowDidChangeScreen: string
      • WindowDidChangeScreenParameters: string
      • WindowDidChangeScreenProfile: string
      • WindowDidChangeScreenSpace: string
      • WindowDidChangeScreenSpaceProperties: string
      • WindowDidChangeSharingType: string
      • WindowDidChangeSpace: string
      • WindowDidChangeSpaceOrderingMode: string
      • WindowDidChangeTitle: string
      • WindowDidChangeToolbar: string
      • WindowDidDeminiaturize: string
      • WindowDidEndSheet: string
      • WindowDidEnterFullScreen: string
      • WindowDidEnterVersionBrowser: string
      • WindowDidExitFullScreen: string
      • WindowDidExitVersionBrowser: string
      • WindowDidExpose: string
      • WindowDidFocus: string
      • WindowDidMiniaturize: string
      • WindowDidMove: string
      • WindowDidOrderOffScreen: string
      • WindowDidOrderOnScreen: string
      • WindowDidResignKey: string
      • WindowDidResignMain: string
      • WindowDidResize: string
      • WindowDidUpdate: string
      • WindowDidUpdateAlpha: string
      • WindowDidUpdateCollectionBehavior: string
      • WindowDidUpdateCollectionProperties: string
      • WindowDidUpdateShadow: string
      • WindowDidUpdateTitle: string
      • WindowDidUpdateToolbar: string
      • WindowDidZoom: string
      • WindowFileDraggingEntered: string
      • WindowFileDraggingExited: string
      • WindowFileDraggingPerformed: string
      • WindowHide: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowShouldClose: string
      • WindowShow: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowWillBecomeKey: string
      • WindowWillBecomeMain: string
      • WindowWillBeginSheet: string
      • WindowWillChangeOrderingMode: string
      • WindowWillClose: string
      • WindowWillDeminiaturize: string
      • WindowWillEnterFullScreen: string
      • WindowWillEnterVersionBrowser: string
      • WindowWillExitFullScreen: string
      • WindowWillExitVersionBrowser: string
      • WindowWillFocus: string
      • WindowWillMiniaturize: string
      • WindowWillMove: string
      • WindowWillOrderOffScreen: string
      • WindowWillOrderOnScreen: string
      • WindowWillResignMain: string
      • WindowWillResize: string
      • WindowWillUnfocus: string
      • WindowWillUpdate: string
      • WindowWillUpdateAlpha: string
      • WindowWillUpdateCollectionBehavior: string
      • WindowWillUpdateCollectionProperties: string
      • WindowWillUpdateShadow: string
      • WindowWillUpdateTitle: string
      • WindowWillUpdateToolbar: string
      • WindowWillUpdateVisibility: string
      • WindowWillUseStandardFrame: string
      • WindowZoomIn: string
      • WindowZoomOut: string
      • WindowZoomReset: string
    • Windows: {
          APMPowerSettingChange: string;
          APMPowerStatusChange: string;
          APMResumeAutomatic: string;
          APMResumeSuspend: string;
          APMSuspend: string;
          ApplicationStarted: string;
          SystemThemeChanged: string;
          WebViewNavigationCompleted: string;
          WindowActive: string;
          WindowBackgroundErase: string;
          WindowClickActive: string;
          WindowClosing: string;
          WindowDPIChanged: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowDragDrop: string;
          WindowDragEnter: string;
          WindowDragLeave: string;
          WindowDragOver: string;
          WindowEndMove: string;
          WindowEndResize: string;
          WindowFullscreen: string;
          WindowHide: string;
          WindowInactive: string;
          WindowKeyDown: string;
          WindowKeyUp: string;
          WindowKillFocus: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowNonClientHit: string;
          WindowNonClientMouseDown: string;
          WindowNonClientMouseLeave: string;
          WindowNonClientMouseMove: string;
          WindowNonClientMouseUp: string;
          WindowPaint: string;
          WindowRestore: string;
          WindowSetFocus: string;
          WindowShow: string;
          WindowStartMove: string;
          WindowStartResize: string;
          WindowUnFullscreen: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowZOrderChanged: string;
      }
      • APMPowerSettingChange: string
      • APMPowerStatusChange: string
      • APMResumeAutomatic: string
      • APMResumeSuspend: string
      • APMSuspend: string
      • ApplicationStarted: string
      • SystemThemeChanged: string
      • WebViewNavigationCompleted: string
      • WindowActive: string
      • WindowBackgroundErase: string
      • WindowClickActive: string
      • WindowClosing: string
      • WindowDPIChanged: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowDragDrop: string
      • WindowDragEnter: string
      • WindowDragLeave: string
      • WindowDragOver: string
      • WindowEndMove: string
      • WindowEndResize: string
      • WindowFullscreen: string
      • WindowHide: string
      • WindowInactive: string
      • WindowKeyDown: string
      • WindowKeyUp: string
      • WindowKillFocus: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowNonClientHit: string
      • WindowNonClientMouseDown: string
      • WindowNonClientMouseLeave: string
      • WindowNonClientMouseMove: string
      • WindowNonClientMouseUp: string
      • WindowPaint: string
      • WindowRestore: string
      • WindowSetFocus: string
      • WindowShow: string
      • WindowStartMove: string
      • WindowStartResize: string
      • WindowUnFullscreen: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowZOrderChanged: string

    Generated using TypeDoc

    \ No newline at end of file +Types | @wailsio/runtime

    Variable TypesConst

    Types: {
        Common: {
            ApplicationOpenedWithFile: string;
            ApplicationStarted: string;
            ThemeChanged: string;
            WindowClosing: string;
            WindowDPIChanged: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowFilesDropped: string;
            WindowFocus: string;
            WindowFullscreen: string;
            WindowHide: string;
            WindowLostFocus: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowRestore: string;
            WindowRuntimeReady: string;
            WindowShow: string;
            WindowUnFullscreen: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowZoom: string;
            WindowZoomIn: string;
            WindowZoomOut: string;
            WindowZoomReset: string;
        };
        Linux: {
            ApplicationStartup: string;
            SystemThemeChanged: string;
            WindowDeleteEvent: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowFocusIn: string;
            WindowFocusOut: string;
            WindowLoadChanged: string;
        };
        Mac: {
            ApplicationDidBecomeActive: string;
            ApplicationDidChangeBackingProperties: string;
            ApplicationDidChangeEffectiveAppearance: string;
            ApplicationDidChangeIcon: string;
            ApplicationDidChangeOcclusionState: string;
            ApplicationDidChangeScreenParameters: string;
            ApplicationDidChangeStatusBarFrame: string;
            ApplicationDidChangeStatusBarOrientation: string;
            ApplicationDidChangeTheme: string;
            ApplicationDidFinishLaunching: string;
            ApplicationDidHide: string;
            ApplicationDidResignActive: string;
            ApplicationDidUnhide: string;
            ApplicationDidUpdate: string;
            ApplicationShouldHandleReopen: string;
            ApplicationWillBecomeActive: string;
            ApplicationWillFinishLaunching: string;
            ApplicationWillHide: string;
            ApplicationWillResignActive: string;
            ApplicationWillTerminate: string;
            ApplicationWillUnhide: string;
            ApplicationWillUpdate: string;
            MenuDidAddItem: string;
            MenuDidBeginTracking: string;
            MenuDidClose: string;
            MenuDidDisplayItem: string;
            MenuDidEndTracking: string;
            MenuDidHighlightItem: string;
            MenuDidOpen: string;
            MenuDidPopUp: string;
            MenuDidRemoveItem: string;
            MenuDidSendAction: string;
            MenuDidSendActionToItem: string;
            MenuDidUpdate: string;
            MenuWillAddItem: string;
            MenuWillBeginTracking: string;
            MenuWillDisplayItem: string;
            MenuWillEndTracking: string;
            MenuWillHighlightItem: string;
            MenuWillOpen: string;
            MenuWillPopUp: string;
            MenuWillRemoveItem: string;
            MenuWillSendAction: string;
            MenuWillSendActionToItem: string;
            MenuWillUpdate: string;
            WebViewDidCommitNavigation: string;
            WebViewDidFinishNavigation: string;
            WebViewDidReceiveServerRedirectForProvisionalNavigation: string;
            WebViewDidStartProvisionalNavigation: string;
            WindowDidBecomeKey: string;
            WindowDidBecomeMain: string;
            WindowDidBeginSheet: string;
            WindowDidChangeAlpha: string;
            WindowDidChangeBackingLocation: string;
            WindowDidChangeBackingProperties: string;
            WindowDidChangeCollectionBehavior: string;
            WindowDidChangeEffectiveAppearance: string;
            WindowDidChangeOcclusionState: string;
            WindowDidChangeOrderingMode: string;
            WindowDidChangeScreen: string;
            WindowDidChangeScreenParameters: string;
            WindowDidChangeScreenProfile: string;
            WindowDidChangeScreenSpace: string;
            WindowDidChangeScreenSpaceProperties: string;
            WindowDidChangeSharingType: string;
            WindowDidChangeSpace: string;
            WindowDidChangeSpaceOrderingMode: string;
            WindowDidChangeTitle: string;
            WindowDidChangeToolbar: string;
            WindowDidDeminiaturize: string;
            WindowDidEndSheet: string;
            WindowDidEnterFullScreen: string;
            WindowDidEnterVersionBrowser: string;
            WindowDidExitFullScreen: string;
            WindowDidExitVersionBrowser: string;
            WindowDidExpose: string;
            WindowDidFocus: string;
            WindowDidMiniaturize: string;
            WindowDidMove: string;
            WindowDidOrderOffScreen: string;
            WindowDidOrderOnScreen: string;
            WindowDidResignKey: string;
            WindowDidResignMain: string;
            WindowDidResize: string;
            WindowDidUpdate: string;
            WindowDidUpdateAlpha: string;
            WindowDidUpdateCollectionBehavior: string;
            WindowDidUpdateCollectionProperties: string;
            WindowDidUpdateShadow: string;
            WindowDidUpdateTitle: string;
            WindowDidUpdateToolbar: string;
            WindowDidZoom: string;
            WindowFileDraggingEntered: string;
            WindowFileDraggingExited: string;
            WindowFileDraggingPerformed: string;
            WindowHide: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowShouldClose: string;
            WindowShow: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowWillBecomeKey: string;
            WindowWillBecomeMain: string;
            WindowWillBeginSheet: string;
            WindowWillChangeOrderingMode: string;
            WindowWillClose: string;
            WindowWillDeminiaturize: string;
            WindowWillEnterFullScreen: string;
            WindowWillEnterVersionBrowser: string;
            WindowWillExitFullScreen: string;
            WindowWillExitVersionBrowser: string;
            WindowWillFocus: string;
            WindowWillMiniaturize: string;
            WindowWillMove: string;
            WindowWillOrderOffScreen: string;
            WindowWillOrderOnScreen: string;
            WindowWillResignMain: string;
            WindowWillResize: string;
            WindowWillUnfocus: string;
            WindowWillUpdate: string;
            WindowWillUpdateAlpha: string;
            WindowWillUpdateCollectionBehavior: string;
            WindowWillUpdateCollectionProperties: string;
            WindowWillUpdateShadow: string;
            WindowWillUpdateTitle: string;
            WindowWillUpdateToolbar: string;
            WindowWillUpdateVisibility: string;
            WindowWillUseStandardFrame: string;
            WindowZoomIn: string;
            WindowZoomOut: string;
            WindowZoomReset: string;
        };
        Windows: {
            APMPowerSettingChange: string;
            APMPowerStatusChange: string;
            APMResumeAutomatic: string;
            APMResumeSuspend: string;
            APMSuspend: string;
            ApplicationStarted: string;
            SystemThemeChanged: string;
            WebViewNavigationCompleted: string;
            WindowActive: string;
            WindowBackgroundErase: string;
            WindowClickActive: string;
            WindowClosing: string;
            WindowDPIChanged: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowDragDrop: string;
            WindowDragEnter: string;
            WindowDragLeave: string;
            WindowDragOver: string;
            WindowEndMove: string;
            WindowEndResize: string;
            WindowFullscreen: string;
            WindowHide: string;
            WindowInactive: string;
            WindowKeyDown: string;
            WindowKeyUp: string;
            WindowKillFocus: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowNonClientHit: string;
            WindowNonClientMouseDown: string;
            WindowNonClientMouseLeave: string;
            WindowNonClientMouseMove: string;
            WindowNonClientMouseUp: string;
            WindowPaint: string;
            WindowRestore: string;
            WindowSetFocus: string;
            WindowShow: string;
            WindowStartMove: string;
            WindowStartResize: string;
            WindowUnFullscreen: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowZOrderChanged: string;
        };
    } = EventTypes

    Type declaration

    • Common: {
          ApplicationOpenedWithFile: string;
          ApplicationStarted: string;
          ThemeChanged: string;
          WindowClosing: string;
          WindowDPIChanged: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowFilesDropped: string;
          WindowFocus: string;
          WindowFullscreen: string;
          WindowHide: string;
          WindowLostFocus: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowRestore: string;
          WindowRuntimeReady: string;
          WindowShow: string;
          WindowUnFullscreen: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowZoom: string;
          WindowZoomIn: string;
          WindowZoomOut: string;
          WindowZoomReset: string;
      }
      • ApplicationOpenedWithFile: string
      • ApplicationStarted: string
      • ThemeChanged: string
      • WindowClosing: string
      • WindowDPIChanged: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowFilesDropped: string
      • WindowFocus: string
      • WindowFullscreen: string
      • WindowHide: string
      • WindowLostFocus: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowRestore: string
      • WindowRuntimeReady: string
      • WindowShow: string
      • WindowUnFullscreen: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowZoom: string
      • WindowZoomIn: string
      • WindowZoomOut: string
      • WindowZoomReset: string
    • Linux: {
          ApplicationStartup: string;
          SystemThemeChanged: string;
          WindowDeleteEvent: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowFocusIn: string;
          WindowFocusOut: string;
          WindowLoadChanged: string;
      }
      • ApplicationStartup: string
      • SystemThemeChanged: string
      • WindowDeleteEvent: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowFocusIn: string
      • WindowFocusOut: string
      • WindowLoadChanged: string
    • Mac: {
          ApplicationDidBecomeActive: string;
          ApplicationDidChangeBackingProperties: string;
          ApplicationDidChangeEffectiveAppearance: string;
          ApplicationDidChangeIcon: string;
          ApplicationDidChangeOcclusionState: string;
          ApplicationDidChangeScreenParameters: string;
          ApplicationDidChangeStatusBarFrame: string;
          ApplicationDidChangeStatusBarOrientation: string;
          ApplicationDidChangeTheme: string;
          ApplicationDidFinishLaunching: string;
          ApplicationDidHide: string;
          ApplicationDidResignActive: string;
          ApplicationDidUnhide: string;
          ApplicationDidUpdate: string;
          ApplicationShouldHandleReopen: string;
          ApplicationWillBecomeActive: string;
          ApplicationWillFinishLaunching: string;
          ApplicationWillHide: string;
          ApplicationWillResignActive: string;
          ApplicationWillTerminate: string;
          ApplicationWillUnhide: string;
          ApplicationWillUpdate: string;
          MenuDidAddItem: string;
          MenuDidBeginTracking: string;
          MenuDidClose: string;
          MenuDidDisplayItem: string;
          MenuDidEndTracking: string;
          MenuDidHighlightItem: string;
          MenuDidOpen: string;
          MenuDidPopUp: string;
          MenuDidRemoveItem: string;
          MenuDidSendAction: string;
          MenuDidSendActionToItem: string;
          MenuDidUpdate: string;
          MenuWillAddItem: string;
          MenuWillBeginTracking: string;
          MenuWillDisplayItem: string;
          MenuWillEndTracking: string;
          MenuWillHighlightItem: string;
          MenuWillOpen: string;
          MenuWillPopUp: string;
          MenuWillRemoveItem: string;
          MenuWillSendAction: string;
          MenuWillSendActionToItem: string;
          MenuWillUpdate: string;
          WebViewDidCommitNavigation: string;
          WebViewDidFinishNavigation: string;
          WebViewDidReceiveServerRedirectForProvisionalNavigation: string;
          WebViewDidStartProvisionalNavigation: string;
          WindowDidBecomeKey: string;
          WindowDidBecomeMain: string;
          WindowDidBeginSheet: string;
          WindowDidChangeAlpha: string;
          WindowDidChangeBackingLocation: string;
          WindowDidChangeBackingProperties: string;
          WindowDidChangeCollectionBehavior: string;
          WindowDidChangeEffectiveAppearance: string;
          WindowDidChangeOcclusionState: string;
          WindowDidChangeOrderingMode: string;
          WindowDidChangeScreen: string;
          WindowDidChangeScreenParameters: string;
          WindowDidChangeScreenProfile: string;
          WindowDidChangeScreenSpace: string;
          WindowDidChangeScreenSpaceProperties: string;
          WindowDidChangeSharingType: string;
          WindowDidChangeSpace: string;
          WindowDidChangeSpaceOrderingMode: string;
          WindowDidChangeTitle: string;
          WindowDidChangeToolbar: string;
          WindowDidDeminiaturize: string;
          WindowDidEndSheet: string;
          WindowDidEnterFullScreen: string;
          WindowDidEnterVersionBrowser: string;
          WindowDidExitFullScreen: string;
          WindowDidExitVersionBrowser: string;
          WindowDidExpose: string;
          WindowDidFocus: string;
          WindowDidMiniaturize: string;
          WindowDidMove: string;
          WindowDidOrderOffScreen: string;
          WindowDidOrderOnScreen: string;
          WindowDidResignKey: string;
          WindowDidResignMain: string;
          WindowDidResize: string;
          WindowDidUpdate: string;
          WindowDidUpdateAlpha: string;
          WindowDidUpdateCollectionBehavior: string;
          WindowDidUpdateCollectionProperties: string;
          WindowDidUpdateShadow: string;
          WindowDidUpdateTitle: string;
          WindowDidUpdateToolbar: string;
          WindowDidZoom: string;
          WindowFileDraggingEntered: string;
          WindowFileDraggingExited: string;
          WindowFileDraggingPerformed: string;
          WindowHide: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowShouldClose: string;
          WindowShow: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowWillBecomeKey: string;
          WindowWillBecomeMain: string;
          WindowWillBeginSheet: string;
          WindowWillChangeOrderingMode: string;
          WindowWillClose: string;
          WindowWillDeminiaturize: string;
          WindowWillEnterFullScreen: string;
          WindowWillEnterVersionBrowser: string;
          WindowWillExitFullScreen: string;
          WindowWillExitVersionBrowser: string;
          WindowWillFocus: string;
          WindowWillMiniaturize: string;
          WindowWillMove: string;
          WindowWillOrderOffScreen: string;
          WindowWillOrderOnScreen: string;
          WindowWillResignMain: string;
          WindowWillResize: string;
          WindowWillUnfocus: string;
          WindowWillUpdate: string;
          WindowWillUpdateAlpha: string;
          WindowWillUpdateCollectionBehavior: string;
          WindowWillUpdateCollectionProperties: string;
          WindowWillUpdateShadow: string;
          WindowWillUpdateTitle: string;
          WindowWillUpdateToolbar: string;
          WindowWillUpdateVisibility: string;
          WindowWillUseStandardFrame: string;
          WindowZoomIn: string;
          WindowZoomOut: string;
          WindowZoomReset: string;
      }
      • ApplicationDidBecomeActive: string
      • ApplicationDidChangeBackingProperties: string
      • ApplicationDidChangeEffectiveAppearance: string
      • ApplicationDidChangeIcon: string
      • ApplicationDidChangeOcclusionState: string
      • ApplicationDidChangeScreenParameters: string
      • ApplicationDidChangeStatusBarFrame: string
      • ApplicationDidChangeStatusBarOrientation: string
      • ApplicationDidChangeTheme: string
      • ApplicationDidFinishLaunching: string
      • ApplicationDidHide: string
      • ApplicationDidResignActive: string
      • ApplicationDidUnhide: string
      • ApplicationDidUpdate: string
      • ApplicationShouldHandleReopen: string
      • ApplicationWillBecomeActive: string
      • ApplicationWillFinishLaunching: string
      • ApplicationWillHide: string
      • ApplicationWillResignActive: string
      • ApplicationWillTerminate: string
      • ApplicationWillUnhide: string
      • ApplicationWillUpdate: string
      • MenuDidAddItem: string
      • MenuDidBeginTracking: string
      • MenuDidClose: string
      • MenuDidDisplayItem: string
      • MenuDidEndTracking: string
      • MenuDidHighlightItem: string
      • MenuDidOpen: string
      • MenuDidPopUp: string
      • MenuDidRemoveItem: string
      • MenuDidSendAction: string
      • MenuDidSendActionToItem: string
      • MenuDidUpdate: string
      • MenuWillAddItem: string
      • MenuWillBeginTracking: string
      • MenuWillDisplayItem: string
      • MenuWillEndTracking: string
      • MenuWillHighlightItem: string
      • MenuWillOpen: string
      • MenuWillPopUp: string
      • MenuWillRemoveItem: string
      • MenuWillSendAction: string
      • MenuWillSendActionToItem: string
      • MenuWillUpdate: string
      • WebViewDidCommitNavigation: string
      • WebViewDidFinishNavigation: string
      • WebViewDidReceiveServerRedirectForProvisionalNavigation: string
      • WebViewDidStartProvisionalNavigation: string
      • WindowDidBecomeKey: string
      • WindowDidBecomeMain: string
      • WindowDidBeginSheet: string
      • WindowDidChangeAlpha: string
      • WindowDidChangeBackingLocation: string
      • WindowDidChangeBackingProperties: string
      • WindowDidChangeCollectionBehavior: string
      • WindowDidChangeEffectiveAppearance: string
      • WindowDidChangeOcclusionState: string
      • WindowDidChangeOrderingMode: string
      • WindowDidChangeScreen: string
      • WindowDidChangeScreenParameters: string
      • WindowDidChangeScreenProfile: string
      • WindowDidChangeScreenSpace: string
      • WindowDidChangeScreenSpaceProperties: string
      • WindowDidChangeSharingType: string
      • WindowDidChangeSpace: string
      • WindowDidChangeSpaceOrderingMode: string
      • WindowDidChangeTitle: string
      • WindowDidChangeToolbar: string
      • WindowDidDeminiaturize: string
      • WindowDidEndSheet: string
      • WindowDidEnterFullScreen: string
      • WindowDidEnterVersionBrowser: string
      • WindowDidExitFullScreen: string
      • WindowDidExitVersionBrowser: string
      • WindowDidExpose: string
      • WindowDidFocus: string
      • WindowDidMiniaturize: string
      • WindowDidMove: string
      • WindowDidOrderOffScreen: string
      • WindowDidOrderOnScreen: string
      • WindowDidResignKey: string
      • WindowDidResignMain: string
      • WindowDidResize: string
      • WindowDidUpdate: string
      • WindowDidUpdateAlpha: string
      • WindowDidUpdateCollectionBehavior: string
      • WindowDidUpdateCollectionProperties: string
      • WindowDidUpdateShadow: string
      • WindowDidUpdateTitle: string
      • WindowDidUpdateToolbar: string
      • WindowDidZoom: string
      • WindowFileDraggingEntered: string
      • WindowFileDraggingExited: string
      • WindowFileDraggingPerformed: string
      • WindowHide: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowShouldClose: string
      • WindowShow: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowWillBecomeKey: string
      • WindowWillBecomeMain: string
      • WindowWillBeginSheet: string
      • WindowWillChangeOrderingMode: string
      • WindowWillClose: string
      • WindowWillDeminiaturize: string
      • WindowWillEnterFullScreen: string
      • WindowWillEnterVersionBrowser: string
      • WindowWillExitFullScreen: string
      • WindowWillExitVersionBrowser: string
      • WindowWillFocus: string
      • WindowWillMiniaturize: string
      • WindowWillMove: string
      • WindowWillOrderOffScreen: string
      • WindowWillOrderOnScreen: string
      • WindowWillResignMain: string
      • WindowWillResize: string
      • WindowWillUnfocus: string
      • WindowWillUpdate: string
      • WindowWillUpdateAlpha: string
      • WindowWillUpdateCollectionBehavior: string
      • WindowWillUpdateCollectionProperties: string
      • WindowWillUpdateShadow: string
      • WindowWillUpdateTitle: string
      • WindowWillUpdateToolbar: string
      • WindowWillUpdateVisibility: string
      • WindowWillUseStandardFrame: string
      • WindowZoomIn: string
      • WindowZoomOut: string
      • WindowZoomReset: string
    • Windows: {
          APMPowerSettingChange: string;
          APMPowerStatusChange: string;
          APMResumeAutomatic: string;
          APMResumeSuspend: string;
          APMSuspend: string;
          ApplicationStarted: string;
          SystemThemeChanged: string;
          WebViewNavigationCompleted: string;
          WindowActive: string;
          WindowBackgroundErase: string;
          WindowClickActive: string;
          WindowClosing: string;
          WindowDPIChanged: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowDragDrop: string;
          WindowDragEnter: string;
          WindowDragLeave: string;
          WindowDragOver: string;
          WindowEndMove: string;
          WindowEndResize: string;
          WindowFullscreen: string;
          WindowHide: string;
          WindowInactive: string;
          WindowKeyDown: string;
          WindowKeyUp: string;
          WindowKillFocus: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowNonClientHit: string;
          WindowNonClientMouseDown: string;
          WindowNonClientMouseLeave: string;
          WindowNonClientMouseMove: string;
          WindowNonClientMouseUp: string;
          WindowPaint: string;
          WindowRestore: string;
          WindowSetFocus: string;
          WindowShow: string;
          WindowStartMove: string;
          WindowStartResize: string;
          WindowUnFullscreen: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowZOrderChanged: string;
      }
      • APMPowerSettingChange: string
      • APMPowerStatusChange: string
      • APMResumeAutomatic: string
      • APMResumeSuspend: string
      • APMSuspend: string
      • ApplicationStarted: string
      • SystemThemeChanged: string
      • WebViewNavigationCompleted: string
      • WindowActive: string
      • WindowBackgroundErase: string
      • WindowClickActive: string
      • WindowClosing: string
      • WindowDPIChanged: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowDragDrop: string
      • WindowDragEnter: string
      • WindowDragLeave: string
      • WindowDragOver: string
      • WindowEndMove: string
      • WindowEndResize: string
      • WindowFullscreen: string
      • WindowHide: string
      • WindowInactive: string
      • WindowKeyDown: string
      • WindowKeyUp: string
      • WindowKillFocus: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowNonClientHit: string
      • WindowNonClientMouseDown: string
      • WindowNonClientMouseLeave: string
      • WindowNonClientMouseMove: string
      • WindowNonClientMouseUp: string
      • WindowPaint: string
      • WindowRestore: string
      • WindowSetFocus: string
      • WindowShow: string
      • WindowStartMove: string
      • WindowStartResize: string
      • WindowUnFullscreen: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowZOrderChanged: string

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Window.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Window.html index f638162a6..5e8b5d684 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Window.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Window.html @@ -1,2 +1,2 @@ Window | @wailsio/runtime

    Variable WindowConst

    Window: Window = ...

    The window within which the script is running.

    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/package.json b/v3/internal/runtime/desktop/@wailsio/runtime/package.json index 1195a58f3..4c3544130 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/package.json +++ b/v3/internal/runtime/desktop/@wailsio/runtime/package.json @@ -1,7 +1,7 @@ { "name": "@wailsio/runtime", "type": "module", - "version": "3.0.0-alpha.55", + "version": "3.0.0-alpha.56", "description": "Wails Runtime", "types": "types/index.d.ts", "exports": { From 32839bd0d12320701b722e82ac9c4ccba4c928ce Mon Sep 17 00:00:00 2001 From: popaprozac Date: Thu, 20 Feb 2025 14:03:38 -0800 Subject: [PATCH 014/374] initial notification impl --- v3/examples/notifications/main.go | 131 ++++ .../desktop/@wailsio/runtime/package.json | 2 +- .../@wailsio/runtime/src/event_types.js | 1 + .../@wailsio/runtime/types/event_types.d.ts | 1 + v3/pkg/application/application_darwin.go | 35 + .../application/context_application_event.go | 6 +- v3/pkg/application/notifications_darwin.go | 177 +++++ v3/pkg/application/notifications_darwin.h | 31 + v3/pkg/application/notifications_darwin.m | 278 ++++++++ v3/pkg/events/events.go | 619 +++++++++--------- v3/pkg/events/events.txt | 1 + v3/pkg/events/events_darwin.h | 223 +++---- 12 files changed, 1084 insertions(+), 421 deletions(-) create mode 100644 v3/examples/notifications/main.go create mode 100644 v3/pkg/application/notifications_darwin.go create mode 100644 v3/pkg/application/notifications_darwin.h create mode 100644 v3/pkg/application/notifications_darwin.m diff --git a/v3/examples/notifications/main.go b/v3/examples/notifications/main.go new file mode 100644 index 000000000..2bf9735fd --- /dev/null +++ b/v3/examples/notifications/main.go @@ -0,0 +1,131 @@ +package main + +import ( + _ "embed" + "fmt" + "log" + "time" + + "github.com/wailsapp/wails/v3/pkg/application" + "github.com/wailsapp/wails/v3/pkg/events" +) + +func main() { + app := application.New(application.Options{ + Name: "Notifications Demo", + Description: "A test of macOS notifications", + Assets: application.AlphaAssets, + }) + + app.NewWebviewWindowWithOptions(application.WebviewWindowOptions{ + Width: 500, + Height: 800, + }) + + app.OnApplicationEvent(events.Mac.ApplicationDidFinishLaunching, func(event *application.ApplicationEvent) { + // Request pemission to send notifications + granted, err := application.RequestUserNotificationAuthorization() + if err != nil { + log.Default().Printf("WARNING: %s\n", err) + } + + if granted { + // Send notification with no actions + err = application.SendNotification("some-uuid", "Title", "", "body!") + if err != nil { + log.Default().Printf("WARNING: %s\n", err) + } + + err = application.RegisterNotificationCategory(application.NotificationCategory{ + ID: "MESSAGE_CATEGORY", + Actions: []application.NotificationAction{ + {ID: "VIEW_ACTION", Title: "View"}, + {ID: "MARK_READ_ACTION", Title: "Mark as Read"}, + {ID: "DELETE_ACTION", Title: "Delete", Destructive: true}, + }, + HasReplyField: true, + ReplyPlaceholder: "Type your reply...", + ReplyButtonTitle: "Reply", + }) + if err != nil { + log.Default().Printf("WARNING: %s\n", err) + } + + err = application.SendNotificationWithActions(application.NotificationOptions{ + ID: "some-other-uuid", + Title: "New Message", + Subtitle: "From: Jane Doe", + Body: "Is it raining today where you are?", + CategoryID: "MESSAGE_CATEGORY", + Data: map[string]interface{}{ + "messageId": "msg-123", + "senderId": "user-123", + "timestamp": time.Now().Unix(), + }, + }) + if err != nil { + log.Default().Printf("WARNING: %s\n", err) + } + } + }) + + app.OnApplicationEvent(events.Mac.DidReceiveNotificationResponse, func(event *application.ApplicationEvent) { + data := event.Context().GetData() + + // Parse data received + if data != nil { + if identifier, ok := data["identifier"].(string); ok { + fmt.Printf("Notification identifier: %s\n", identifier) + } + + if actionIdentifier, ok := data["actionIdentifier"].(string); ok { + fmt.Printf("Action Identifier: %s\n", actionIdentifier) + } + + if userText, ok := data["userText"].(string); ok { + fmt.Printf("User replied: %s\n", userText) + } + + if userInfo, ok := data["userInfo"].(map[string]interface{}); ok { + fmt.Printf("Custom data: %+v\n", userInfo) + } + + // Send notification to JS + app.EmitEvent("notification", data) + } + }) + + go func() { + time.Sleep(time.Second * 5) + // Sometime later check if you are still authorized + granted, err := application.CheckNotificationAuthorization() + if err != nil { + log.Default().Printf("WARNING: %s\n", err) + } + println(granted) + + // Sometime later remove delivered notification by identifier + err = application.RemoveDeliveredNotification("some-uuid") + if err != nil { + log.Default().Printf("WARNING: %s\n", err) + } + }() + + go func() { + time.Sleep(time.Second * 10) + // Sometime later remove all pending and delivered notifications + err := application.RemoveAllPendingNotifications() + if err != nil { + log.Default().Printf("WARNING: %s\n", err) + } + err = application.RemoveAllDeliveredNotifications() + if err != nil { + log.Default().Printf("WARNING: %s\n", err) + } + }() + + err := app.Run() + if err != nil { + log.Fatal(err) + } +} diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/package.json b/v3/internal/runtime/desktop/@wailsio/runtime/package.json index 4c3544130..7412db923 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/package.json +++ b/v3/internal/runtime/desktop/@wailsio/runtime/package.json @@ -1,7 +1,7 @@ { "name": "@wailsio/runtime", "type": "module", - "version": "3.0.0-alpha.56", + "version": "3.0.0-alpha.57", "description": "Wails Runtime", "types": "types/index.d.ts", "exports": { diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/event_types.js b/v3/internal/runtime/desktop/@wailsio/runtime/src/event_types.js index 9c7feed7c..f56a77cb6 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/src/event_types.js +++ b/v3/internal/runtime/desktop/@wailsio/runtime/src/event_types.js @@ -69,6 +69,7 @@ export const EventTypes = { ApplicationWillTerminate: "mac:ApplicationWillTerminate", ApplicationWillUnhide: "mac:ApplicationWillUnhide", ApplicationWillUpdate: "mac:ApplicationWillUpdate", + DidReceiveNotificationResponse: "mac:DidReceiveNotificationResponse", MenuDidAddItem: "mac:MenuDidAddItem", MenuDidBeginTracking: "mac:MenuDidBeginTracking", MenuDidClose: "mac:MenuDidClose", diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/types/event_types.d.ts b/v3/internal/runtime/desktop/@wailsio/runtime/types/event_types.d.ts index e8742de59..5c2d40009 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/types/event_types.d.ts +++ b/v3/internal/runtime/desktop/@wailsio/runtime/types/event_types.d.ts @@ -69,6 +69,7 @@ export declare const EventTypes: { ApplicationWillTerminate: string, ApplicationWillUnhide: string, ApplicationWillUpdate: string, + DidReceiveNotificationResponse: string, MenuDidAddItem: string, MenuDidBeginTracking: string, MenuDidClose: string, diff --git a/v3/pkg/application/application_darwin.go b/v3/pkg/application/application_darwin.go index 623e4a94c..ce205b029 100644 --- a/v3/pkg/application/application_darwin.go +++ b/v3/pkg/application/application_darwin.go @@ -228,6 +228,41 @@ func (m *macosApp) setApplicationMenu(menu *Menu) { C.setApplicationMenu(m.applicationMenu) } +// RequestNotificationPermission requests user permission for notifications +func (m *macosApp) RequestNotificationPermission() (bool, error) { + return RequestUserNotificationAuthorization() +} + +// CheckNotificationPermission checks current permission status +func (m *macosApp) CheckNotificationPermission() (bool, error) { + return CheckNotificationAuthorization() +} + +// SendNotification sends a simple notification +func (m *macosApp) SendNotification(identifier, title, subtitle, body string) error { + return SendNotification(identifier, title, subtitle, body) +} + +// SendNotificationWithActions sends a notification with custom actions +func (m *macosApp) SendNotificationWithActions(options NotificationOptions) error { + return SendNotificationWithActions(options) +} + +// RegisterNotificationCategory registers a notification category with actions +func (m *macosApp) RegisterNotificationCategory(category NotificationCategory) error { + return RegisterNotificationCategory(category) +} + +// RemoveAllPendingNotifications removes all pending notifications +func (m *macosApp) RemoveAllPendingNotifications() { + RemoveAllPendingNotifications() +} + +// RemovePendingNotification removes a specific pending notification +func (m *macosApp) RemovePendingNotification(identifier string) { + RemovePendingNotification(identifier) +} + func (m *macosApp) run() error { if m.parent.options.SingleInstance != nil { cUniqueID := C.CString(m.parent.options.SingleInstance.UniqueID) diff --git a/v3/pkg/application/context_application_event.go b/v3/pkg/application/context_application_event.go index 468634f22..50cf8b90d 100644 --- a/v3/pkg/application/context_application_event.go +++ b/v3/pkg/application/context_application_event.go @@ -52,7 +52,7 @@ func (c ApplicationEventContext) HasVisibleWindows() bool { return c.getBool("hasVisibleWindows") } -func (c ApplicationEventContext) setData(data map[string]any) { +func (c *ApplicationEventContext) setData(data map[string]any) { c.data = data } @@ -72,6 +72,10 @@ func (c ApplicationEventContext) Filename() string { return result } +func (c *ApplicationEventContext) GetData() map[string]any { + return c.data +} + func newApplicationEventContext() *ApplicationEventContext { return &ApplicationEventContext{ data: make(map[string]any), diff --git a/v3/pkg/application/notifications_darwin.go b/v3/pkg/application/notifications_darwin.go new file mode 100644 index 000000000..e04075238 --- /dev/null +++ b/v3/pkg/application/notifications_darwin.go @@ -0,0 +1,177 @@ +//go:build darwin + +package application + +/* +#cgo CFLAGS: -mmacosx-version-min=10.14 -x objective-c +#cgo LDFLAGS: -framework Cocoa -mmacosx-version-min=10.14 -framework UserNotifications +#import "notifications_darwin.h" +*/ +import "C" +import ( + "encoding/json" + "fmt" + "unsafe" +) + +// NotificationAction represents a button in a notification +type NotificationAction struct { + ID string `json:"id"` + Title string `json:"title"` + Destructive bool `json:"destructive,omitempty"` + AuthenticationRequired bool `json:"authenticationRequired,omitempty"` +} + +// NotificationCategory groups actions for notifications +type NotificationCategory struct { + ID string `json:"id"` + Actions []NotificationAction `json:"actions"` + HasReplyField bool `json:"hasReplyField,omitempty"` + ReplyPlaceholder string `json:"replyPlaceholder,omitempty"` + ReplyButtonTitle string `json:"replyButtonTitle,omitempty"` +} + +// NotificationOptions contains configuration for a notification +type NotificationOptions struct { + ID string `json:"id"` + Title string `json:"title"` + Subtitle string `json:"subtitle,omitempty"` + Body string `json:"body"` + CategoryID string `json:"categoryId,omitempty"` + Data map[string]interface{} `json:"data,omitempty"` +} + +// Check if the app has a valid bundle identifier +func CheckBundleIdentifier() bool { + return bool(C.checkBundleIdentifier()) +} + +// RequestUserNotificationAuthorization requests permission for notifications. +func RequestUserNotificationAuthorization() (bool, error) { + if !CheckBundleIdentifier() { + return false, fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") + } + result := C.requestUserNotificationAuthorization(nil) + return result == true, nil +} + +// CheckNotificationAuthorization checks current permission status +func CheckNotificationAuthorization() (bool, error) { + if !CheckBundleIdentifier() { + return false, fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") + } + return bool(C.checkNotificationAuthorization()), nil +} + +// SendNotification sends a notification with the given identifier, title, subtitle, and body. +func SendNotification(identifier, title, subtitle, body string) error { + if !CheckBundleIdentifier() { + return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") + } + cIdentifier := C.CString(identifier) + cTitle := C.CString(title) + cSubtitle := C.CString(subtitle) + cBody := C.CString(body) + defer C.free(unsafe.Pointer(cIdentifier)) + defer C.free(unsafe.Pointer(cTitle)) + defer C.free(unsafe.Pointer(cSubtitle)) + defer C.free(unsafe.Pointer(cBody)) + + C.sendNotification(cIdentifier, cTitle, cSubtitle, cBody, nil) + return nil +} + +// SendNotificationWithActions sends a notification with the specified actions +func SendNotificationWithActions(options NotificationOptions) error { + if !CheckBundleIdentifier() { + return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") + } + cIdentifier := C.CString(options.ID) + cTitle := C.CString(options.Title) + cSubtitle := C.CString(options.Subtitle) + cBody := C.CString(options.Body) + cCategoryID := C.CString(options.CategoryID) + defer C.free(unsafe.Pointer(cIdentifier)) + defer C.free(unsafe.Pointer(cTitle)) + defer C.free(unsafe.Pointer(cSubtitle)) + defer C.free(unsafe.Pointer(cBody)) + defer C.free(unsafe.Pointer(cCategoryID)) + + var cActionsJSON *C.char + if options.Data != nil { + jsonData, err := json.Marshal(options.Data) + if err == nil { + cActionsJSON = C.CString(string(jsonData)) + defer C.free(unsafe.Pointer(cActionsJSON)) + } + } + + C.sendNotificationWithActions(cIdentifier, cTitle, cSubtitle, cBody, cCategoryID, cActionsJSON, nil) + return nil +} + +// RegisterNotificationCategory registers a category with actions and optional reply field +func RegisterNotificationCategory(category NotificationCategory) error { + if !CheckBundleIdentifier() { + return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") + } + cCategoryID := C.CString(category.ID) + defer C.free(unsafe.Pointer(cCategoryID)) + + actionsJSON, err := json.Marshal(category.Actions) + if err != nil { + return err + } + cActionsJSON := C.CString(string(actionsJSON)) + defer C.free(unsafe.Pointer(cActionsJSON)) + + var cReplyPlaceholder, cReplyButtonTitle *C.char + if category.HasReplyField { + cReplyPlaceholder = C.CString(category.ReplyPlaceholder) + cReplyButtonTitle = C.CString(category.ReplyButtonTitle) + defer C.free(unsafe.Pointer(cReplyPlaceholder)) + defer C.free(unsafe.Pointer(cReplyButtonTitle)) + } + + C.registerNotificationCategory(cCategoryID, cActionsJSON, C.bool(category.HasReplyField), + cReplyPlaceholder, cReplyButtonTitle) + return nil +} + +// RemoveAllPendingNotifications removes all pending notifications +func RemoveAllPendingNotifications() error { + if !CheckBundleIdentifier() { + return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") + } + C.removeAllPendingNotifications() + return nil +} + +// RemovePendingNotification removes a specific pending notification +func RemovePendingNotification(identifier string) error { + if !CheckBundleIdentifier() { + return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") + } + cIdentifier := C.CString(identifier) + defer C.free(unsafe.Pointer(cIdentifier)) + C.removePendingNotification(cIdentifier) + return nil +} + +func RemoveAllDeliveredNotifications() error { + if !CheckBundleIdentifier() { + return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") + } + C.removeAllDeliveredNotifications() + return nil +} + +func RemoveDeliveredNotification(identifier string) error { + if !CheckBundleIdentifier() { + return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") + } + cIdentifier := C.CString(identifier) + defer C.free(unsafe.Pointer(cIdentifier)) + C.removeDeliveredNotification(cIdentifier) + return nil +} diff --git a/v3/pkg/application/notifications_darwin.h b/v3/pkg/application/notifications_darwin.h new file mode 100644 index 000000000..4014b9a1c --- /dev/null +++ b/v3/pkg/application/notifications_darwin.h @@ -0,0 +1,31 @@ +//go:build darwin + +#ifndef NOTIFICATIONS_DARWIN_H +#define NOTIFICATIONS_DARWIN_H + +#import + +#ifdef __cplusplus +extern "C" { +#endif + +bool checkBundleIdentifier(void); +bool requestUserNotificationAuthorization(void *completion); +bool checkNotificationAuthorization(void); +void sendNotification(const char *identifier, const char *title, const char *subtitle, const char *body, void *completion); + +// New advanced notification functions +void sendNotificationWithActions(const char *identifier, const char *title, const char *subtitle, + const char *body, const char *categoryId, const char *actions_json, void *completion); +void registerNotificationCategory(const char *categoryId, const char *actions_json, bool hasReplyField, + const char *replyPlaceholder, const char *replyButtonTitle); +void removeAllPendingNotifications(void); +void removePendingNotification(const char *identifier); +void removeAllDeliveredNotifications(void); +void removeDeliveredNotification(const char *identifier); + +#ifdef __cplusplus +} +#endif + +#endif /* NOTIFICATIONS_DARWIN_H */ \ No newline at end of file diff --git a/v3/pkg/application/notifications_darwin.m b/v3/pkg/application/notifications_darwin.m new file mode 100644 index 000000000..31152e13e --- /dev/null +++ b/v3/pkg/application/notifications_darwin.m @@ -0,0 +1,278 @@ +#import "notifications_darwin.h" +#import +#import +#import "../events/events_darwin.h" + +extern bool hasListeners(unsigned int); +extern void processApplicationEvent(unsigned int, void* data); + +@interface NotificationsDelegate : NSObject +@end + +@implementation NotificationsDelegate + +- (void)userNotificationCenter:(UNUserNotificationCenter *)center + willPresentNotification:(UNNotification *)notification + withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler { + UNNotificationPresentationOptions options = UNNotificationPresentationOptionList | + UNNotificationPresentationOptionBanner | + UNNotificationPresentationOptionSound; + completionHandler(options); +} + +- (void)userNotificationCenter:(UNUserNotificationCenter *)center +didReceiveNotificationResponse:(UNNotificationResponse *)response + withCompletionHandler:(void (^)(void))completionHandler { + + NSMutableDictionary *payload = [NSMutableDictionary dictionary]; + + [payload setObject:response.notification.request.identifier forKey:@"identifier"]; + [payload setObject:response.actionIdentifier forKey:@"actionIdentifier"]; + [payload setObject:response.notification.request.content.title ?: @"" forKey:@"title"]; + [payload setObject:response.notification.request.content.body ?: @"" forKey:@"body"]; + + if (response.notification.request.content.categoryIdentifier) { + [payload setObject:response.notification.request.content.categoryIdentifier forKey:@"categoryIdentifier"]; + } + + if (response.notification.request.content.userInfo) { + [payload setObject:response.notification.request.content.userInfo forKey:@"userInfo"]; + } + + if ([response isKindOfClass:[UNTextInputNotificationResponse class]]) { + UNTextInputNotificationResponse *textResponse = (UNTextInputNotificationResponse *)response; + [payload setObject:textResponse.userText forKey:@"userText"]; + } + + // Check if there are listeners for our notification response event + if (hasListeners(EventDidReceiveNotificationResponse)) { + processApplicationEvent(EventDidReceiveNotificationResponse, (__bridge void*)payload); + } + + completionHandler(); +} + +@end + +static NotificationsDelegate *delegateInstance = nil; + +static void ensureDelegateInitialized(void) { + if (!delegateInstance) { + delegateInstance = [[NotificationsDelegate alloc] init]; + UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; + center.delegate = delegateInstance; + } +} + +bool checkBundleIdentifier(void) { + NSBundle *main = [NSBundle mainBundle]; + if (main.bundleIdentifier == nil) { + NSLog(@"Error: Cannot use notifications in development mode.\n" + " Notifications require the app to be properly bundled with a bundle identifier.\n" + " To test notifications:\n" + " 1. Build and package your app using 'wails package'\n" + " 2. Sign the packaged .app\n" + " 3. Run the signed .app bundle"); + return false; + } + return true; +} + +bool requestUserNotificationAuthorization(void *completion) { + if (!checkBundleIdentifier()) { + return false; + } + + ensureDelegateInitialized(); + + UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; + UNAuthorizationOptions options = UNAuthorizationOptionAlert | UNAuthorizationOptionSound | UNAuthorizationOptionBadge; + + [center requestAuthorizationWithOptions:options completionHandler:^(BOOL granted, NSError * _Nullable error) { + if (completion != NULL) { + void (^callback)(NSError *, BOOL) = completion; + callback(error, granted); + } + }]; + return true; +} + +bool checkNotificationAuthorization(void) { + ensureDelegateInitialized(); + + __block BOOL isAuthorized = NO; + dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); + + UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; + [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) { + isAuthorized = (settings.authorizationStatus == UNAuthorizationStatusAuthorized); + dispatch_semaphore_signal(semaphore); + }]; + + // Wait for response with a timeout + dispatch_semaphore_wait(semaphore, dispatch_time(DISPATCH_TIME_NOW, 3 * NSEC_PER_SEC)); + return isAuthorized; +} + +void sendNotification(const char *identifier, const char *title, const char *subtitle, const char *body, void *completion) { + ensureDelegateInitialized(); + + NSString *nsIdentifier = [NSString stringWithUTF8String:identifier]; + NSString *nsTitle = [NSString stringWithUTF8String:title]; + NSString *nsSubtitle = [NSString stringWithUTF8String:subtitle]; + NSString *nsBody = [NSString stringWithUTF8String:body]; + + UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; + + UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init]; + content.title = nsTitle; + content.subtitle = nsSubtitle; + content.body = nsBody; + content.sound = [UNNotificationSound defaultSound]; + + UNTimeIntervalNotificationTrigger *trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:1 repeats:NO]; + + UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:nsIdentifier content:content trigger:trigger]; + + [center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) { + if (completion != NULL) { + void (^callback)(NSError *) = completion; + callback(error); + } + }]; +} + +void sendNotificationWithActions(const char *identifier, const char *title, const char *subtitle, + const char *body, const char *categoryId, const char *actions_json, void *completion) { + ensureDelegateInitialized(); + + NSString *nsIdentifier = [NSString stringWithUTF8String:identifier]; + NSString *nsTitle = [NSString stringWithUTF8String:title]; + NSString *nsSubtitle = subtitle ? [NSString stringWithUTF8String:subtitle] : @""; + NSString *nsBody = [NSString stringWithUTF8String:body]; + NSString *nsCategoryId = [NSString stringWithUTF8String:categoryId]; + + NSMutableDictionary *customData = [NSMutableDictionary dictionary]; + if (actions_json) { + NSString *actionsJsonStr = [NSString stringWithUTF8String:actions_json]; + NSData *jsonData = [actionsJsonStr dataUsingEncoding:NSUTF8StringEncoding]; + NSError *error = nil; + NSDictionary *parsedData = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error]; + if (!error && parsedData) { + [customData addEntriesFromDictionary:parsedData]; + } + } + + UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; + + UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init]; + content.title = nsTitle; + if (![nsSubtitle isEqualToString:@""]) { + content.subtitle = nsSubtitle; + } + content.body = nsBody; + content.sound = [UNNotificationSound defaultSound]; + content.categoryIdentifier = nsCategoryId; + + // Add custom data if available + if (customData.count > 0) { + content.userInfo = customData; + } + + UNTimeIntervalNotificationTrigger *trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:1 repeats:NO]; + + UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:nsIdentifier content:content trigger:trigger]; + + [center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) { + if (completion != NULL) { + void (^callback)(NSError *) = completion; + callback(error); + } + }]; +} + +void registerNotificationCategory(const char *categoryId, const char *actions_json, bool hasReplyField, + const char *replyPlaceholder, const char *replyButtonTitle) { + ensureDelegateInitialized(); + + NSString *nsCategoryId = [NSString stringWithUTF8String:categoryId]; + NSString *actionsJsonStr = actions_json ? [NSString stringWithUTF8String:actions_json] : @"[]"; + + NSData *jsonData = [actionsJsonStr dataUsingEncoding:NSUTF8StringEncoding]; + NSError *error = nil; + NSArray *actionsArray = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error]; + + if (error) { + NSLog(@"Error parsing notification actions JSON: %@", error); + return; + } + + NSMutableArray *actions = [NSMutableArray array]; + + for (NSDictionary *actionDict in actionsArray) { + NSString *actionId = actionDict[@"id"]; + NSString *actionTitle = actionDict[@"title"]; + BOOL destructive = [actionDict[@"destructive"] boolValue]; + BOOL authRequired = [actionDict[@"authenticationRequired"] boolValue]; + + if (actionId && actionTitle) { + UNNotificationActionOptions options = UNNotificationActionOptionNone; + if (destructive) options |= UNNotificationActionOptionDestructive; + if (authRequired) options |= UNNotificationActionOptionAuthenticationRequired; + + UNNotificationAction *action = [UNNotificationAction + actionWithIdentifier:actionId + title:actionTitle + options:options]; + [actions addObject:action]; + } + } + + if (hasReplyField && replyPlaceholder && replyButtonTitle) { + NSString *placeholder = [NSString stringWithUTF8String:replyPlaceholder]; + NSString *buttonTitle = [NSString stringWithUTF8String:replyButtonTitle]; + + UNTextInputNotificationAction *textAction = + [UNTextInputNotificationAction actionWithIdentifier:@"TEXT_REPLY" + title:buttonTitle + options:UNNotificationActionOptionNone + textInputButtonTitle:buttonTitle + textInputPlaceholder:placeholder]; + [actions addObject:textAction]; + } + + UNNotificationCategory *category = [UNNotificationCategory + categoryWithIdentifier:nsCategoryId + actions:actions + intentIdentifiers:@[] + options:UNNotificationCategoryOptionNone]; + + UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; + [center getNotificationCategoriesWithCompletionHandler:^(NSSet *categories) { + NSMutableSet *updatedCategories = [NSMutableSet setWithSet:categories]; + [updatedCategories addObject:category]; + [center setNotificationCategories:updatedCategories]; + }]; +} + +void removeAllPendingNotifications(void) { + UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; + [center removeAllPendingNotificationRequests]; +} + +void removePendingNotification(const char *identifier) { + NSString *nsIdentifier = [NSString stringWithUTF8String:identifier]; + UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; + [center removePendingNotificationRequestsWithIdentifiers:@[nsIdentifier]]; +} + +void removeAllDeliveredNotifications(void) { + UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; + [center removeAllDeliveredNotifications]; +} + +void removeDeliveredNotification(const char *identifier) { + NSString *nsIdentifier = [NSString stringWithUTF8String:identifier]; + UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; + [center removeDeliveredNotificationsWithIdentifiers:@[nsIdentifier]]; +} \ No newline at end of file diff --git a/v3/pkg/events/events.go b/v3/pkg/events/events.go index 0bb4c850c..84f214cac 100644 --- a/v3/pkg/events/events.go +++ b/v3/pkg/events/events.go @@ -112,6 +112,7 @@ type macEvents struct { ApplicationWillTerminate ApplicationEventType ApplicationWillUnhide ApplicationEventType ApplicationWillUpdate ApplicationEventType + DidReceiveNotificationResponse ApplicationEventType MenuDidAddItem ApplicationEventType MenuDidBeginTracking ApplicationEventType MenuDidClose ApplicationEventType @@ -248,116 +249,117 @@ func newMacEvents() macEvents { ApplicationWillTerminate: 1075, ApplicationWillUnhide: 1076, ApplicationWillUpdate: 1077, - MenuDidAddItem: 1078, - MenuDidBeginTracking: 1079, - MenuDidClose: 1080, - MenuDidDisplayItem: 1081, - MenuDidEndTracking: 1082, - MenuDidHighlightItem: 1083, - MenuDidOpen: 1084, - MenuDidPopUp: 1085, - MenuDidRemoveItem: 1086, - MenuDidSendAction: 1087, - MenuDidSendActionToItem: 1088, - MenuDidUpdate: 1089, - MenuWillAddItem: 1090, - MenuWillBeginTracking: 1091, - MenuWillDisplayItem: 1092, - MenuWillEndTracking: 1093, - MenuWillHighlightItem: 1094, - MenuWillOpen: 1095, - MenuWillPopUp: 1096, - MenuWillRemoveItem: 1097, - MenuWillSendAction: 1098, - MenuWillSendActionToItem: 1099, - MenuWillUpdate: 1100, - WebViewDidCommitNavigation: 1101, - WebViewDidFinishNavigation: 1102, - WebViewDidReceiveServerRedirectForProvisionalNavigation: 1103, - WebViewDidStartProvisionalNavigation: 1104, - WindowDidBecomeKey: 1105, - WindowDidBecomeMain: 1106, - WindowDidBeginSheet: 1107, - WindowDidChangeAlpha: 1108, - WindowDidChangeBackingLocation: 1109, - WindowDidChangeBackingProperties: 1110, - WindowDidChangeCollectionBehavior: 1111, - WindowDidChangeEffectiveAppearance: 1112, - WindowDidChangeOcclusionState: 1113, - WindowDidChangeOrderingMode: 1114, - WindowDidChangeScreen: 1115, - WindowDidChangeScreenParameters: 1116, - WindowDidChangeScreenProfile: 1117, - WindowDidChangeScreenSpace: 1118, - WindowDidChangeScreenSpaceProperties: 1119, - WindowDidChangeSharingType: 1120, - WindowDidChangeSpace: 1121, - WindowDidChangeSpaceOrderingMode: 1122, - WindowDidChangeTitle: 1123, - WindowDidChangeToolbar: 1124, - WindowDidDeminiaturize: 1125, - WindowDidEndSheet: 1126, - WindowDidEnterFullScreen: 1127, - WindowDidEnterVersionBrowser: 1128, - WindowDidExitFullScreen: 1129, - WindowDidExitVersionBrowser: 1130, - WindowDidExpose: 1131, - WindowDidFocus: 1132, - WindowDidMiniaturize: 1133, - WindowDidMove: 1134, - WindowDidOrderOffScreen: 1135, - WindowDidOrderOnScreen: 1136, - WindowDidResignKey: 1137, - WindowDidResignMain: 1138, - WindowDidResize: 1139, - WindowDidUpdate: 1140, - WindowDidUpdateAlpha: 1141, - WindowDidUpdateCollectionBehavior: 1142, - WindowDidUpdateCollectionProperties: 1143, - WindowDidUpdateShadow: 1144, - WindowDidUpdateTitle: 1145, - WindowDidUpdateToolbar: 1146, - WindowDidZoom: 1147, - WindowFileDraggingEntered: 1148, - WindowFileDraggingExited: 1149, - WindowFileDraggingPerformed: 1150, - WindowHide: 1151, - WindowMaximise: 1152, - WindowUnMaximise: 1153, - WindowMinimise: 1154, - WindowUnMinimise: 1155, - WindowShouldClose: 1156, - WindowShow: 1157, - WindowWillBecomeKey: 1158, - WindowWillBecomeMain: 1159, - WindowWillBeginSheet: 1160, - WindowWillChangeOrderingMode: 1161, - WindowWillClose: 1162, - WindowWillDeminiaturize: 1163, - WindowWillEnterFullScreen: 1164, - WindowWillEnterVersionBrowser: 1165, - WindowWillExitFullScreen: 1166, - WindowWillExitVersionBrowser: 1167, - WindowWillFocus: 1168, - WindowWillMiniaturize: 1169, - WindowWillMove: 1170, - WindowWillOrderOffScreen: 1171, - WindowWillOrderOnScreen: 1172, - WindowWillResignMain: 1173, - WindowWillResize: 1174, - WindowWillUnfocus: 1175, - WindowWillUpdate: 1176, - WindowWillUpdateAlpha: 1177, - WindowWillUpdateCollectionBehavior: 1178, - WindowWillUpdateCollectionProperties: 1179, - WindowWillUpdateShadow: 1180, - WindowWillUpdateTitle: 1181, - WindowWillUpdateToolbar: 1182, - WindowWillUpdateVisibility: 1183, - WindowWillUseStandardFrame: 1184, - WindowZoomIn: 1185, - WindowZoomOut: 1186, - WindowZoomReset: 1187, + DidReceiveNotificationResponse: 1078, + MenuDidAddItem: 1079, + MenuDidBeginTracking: 1080, + MenuDidClose: 1081, + MenuDidDisplayItem: 1082, + MenuDidEndTracking: 1083, + MenuDidHighlightItem: 1084, + MenuDidOpen: 1085, + MenuDidPopUp: 1086, + MenuDidRemoveItem: 1087, + MenuDidSendAction: 1088, + MenuDidSendActionToItem: 1089, + MenuDidUpdate: 1090, + MenuWillAddItem: 1091, + MenuWillBeginTracking: 1092, + MenuWillDisplayItem: 1093, + MenuWillEndTracking: 1094, + MenuWillHighlightItem: 1095, + MenuWillOpen: 1096, + MenuWillPopUp: 1097, + MenuWillRemoveItem: 1098, + MenuWillSendAction: 1099, + MenuWillSendActionToItem: 1100, + MenuWillUpdate: 1101, + WebViewDidCommitNavigation: 1102, + WebViewDidFinishNavigation: 1103, + WebViewDidReceiveServerRedirectForProvisionalNavigation: 1104, + WebViewDidStartProvisionalNavigation: 1105, + WindowDidBecomeKey: 1106, + WindowDidBecomeMain: 1107, + WindowDidBeginSheet: 1108, + WindowDidChangeAlpha: 1109, + WindowDidChangeBackingLocation: 1110, + WindowDidChangeBackingProperties: 1111, + WindowDidChangeCollectionBehavior: 1112, + WindowDidChangeEffectiveAppearance: 1113, + WindowDidChangeOcclusionState: 1114, + WindowDidChangeOrderingMode: 1115, + WindowDidChangeScreen: 1116, + WindowDidChangeScreenParameters: 1117, + WindowDidChangeScreenProfile: 1118, + WindowDidChangeScreenSpace: 1119, + WindowDidChangeScreenSpaceProperties: 1120, + WindowDidChangeSharingType: 1121, + WindowDidChangeSpace: 1122, + WindowDidChangeSpaceOrderingMode: 1123, + WindowDidChangeTitle: 1124, + WindowDidChangeToolbar: 1125, + WindowDidDeminiaturize: 1126, + WindowDidEndSheet: 1127, + WindowDidEnterFullScreen: 1128, + WindowDidEnterVersionBrowser: 1129, + WindowDidExitFullScreen: 1130, + WindowDidExitVersionBrowser: 1131, + WindowDidExpose: 1132, + WindowDidFocus: 1133, + WindowDidMiniaturize: 1134, + WindowDidMove: 1135, + WindowDidOrderOffScreen: 1136, + WindowDidOrderOnScreen: 1137, + WindowDidResignKey: 1138, + WindowDidResignMain: 1139, + WindowDidResize: 1140, + WindowDidUpdate: 1141, + WindowDidUpdateAlpha: 1142, + WindowDidUpdateCollectionBehavior: 1143, + WindowDidUpdateCollectionProperties: 1144, + WindowDidUpdateShadow: 1145, + WindowDidUpdateTitle: 1146, + WindowDidUpdateToolbar: 1147, + WindowDidZoom: 1148, + WindowFileDraggingEntered: 1149, + WindowFileDraggingExited: 1150, + WindowFileDraggingPerformed: 1151, + WindowHide: 1152, + WindowMaximise: 1153, + WindowUnMaximise: 1154, + WindowMinimise: 1155, + WindowUnMinimise: 1156, + WindowShouldClose: 1157, + WindowShow: 1158, + WindowWillBecomeKey: 1159, + WindowWillBecomeMain: 1160, + WindowWillBeginSheet: 1161, + WindowWillChangeOrderingMode: 1162, + WindowWillClose: 1163, + WindowWillDeminiaturize: 1164, + WindowWillEnterFullScreen: 1165, + WindowWillEnterVersionBrowser: 1166, + WindowWillExitFullScreen: 1167, + WindowWillExitVersionBrowser: 1168, + WindowWillFocus: 1169, + WindowWillMiniaturize: 1170, + WindowWillMove: 1171, + WindowWillOrderOffScreen: 1172, + WindowWillOrderOnScreen: 1173, + WindowWillResignMain: 1174, + WindowWillResize: 1175, + WindowWillUnfocus: 1176, + WindowWillUpdate: 1177, + WindowWillUpdateAlpha: 1178, + WindowWillUpdateCollectionBehavior: 1179, + WindowWillUpdateCollectionProperties: 1180, + WindowWillUpdateShadow: 1181, + WindowWillUpdateTitle: 1182, + WindowWillUpdateToolbar: 1183, + WindowWillUpdateVisibility: 1184, + WindowWillUseStandardFrame: 1185, + WindowZoomIn: 1186, + WindowZoomOut: 1187, + WindowZoomReset: 1188, } } @@ -412,50 +414,50 @@ type windowsEvents struct { func newWindowsEvents() windowsEvents { return windowsEvents{ - APMPowerSettingChange: 1188, - APMPowerStatusChange: 1189, - APMResumeAutomatic: 1190, - APMResumeSuspend: 1191, - APMSuspend: 1192, - ApplicationStarted: 1193, - SystemThemeChanged: 1194, - WebViewNavigationCompleted: 1195, - WindowActive: 1196, - WindowBackgroundErase: 1197, - WindowClickActive: 1198, - WindowClosing: 1199, - WindowDidMove: 1200, - WindowDidResize: 1201, - WindowDPIChanged: 1202, - WindowDragDrop: 1203, - WindowDragEnter: 1204, - WindowDragLeave: 1205, - WindowDragOver: 1206, - WindowEndMove: 1207, - WindowEndResize: 1208, - WindowFullscreen: 1209, - WindowHide: 1210, - WindowInactive: 1211, - WindowKeyDown: 1212, - WindowKeyUp: 1213, - WindowKillFocus: 1214, - WindowNonClientHit: 1215, - WindowNonClientMouseDown: 1216, - WindowNonClientMouseLeave: 1217, - WindowNonClientMouseMove: 1218, - WindowNonClientMouseUp: 1219, - WindowPaint: 1220, - WindowRestore: 1221, - WindowSetFocus: 1222, - WindowShow: 1223, - WindowStartMove: 1224, - WindowStartResize: 1225, - WindowUnFullscreen: 1226, - WindowZOrderChanged: 1227, - WindowMinimise: 1228, - WindowUnMinimise: 1229, - WindowMaximise: 1230, - WindowUnMaximise: 1231, + APMPowerSettingChange: 1189, + APMPowerStatusChange: 1190, + APMResumeAutomatic: 1191, + APMResumeSuspend: 1192, + APMSuspend: 1193, + ApplicationStarted: 1194, + SystemThemeChanged: 1195, + WebViewNavigationCompleted: 1196, + WindowActive: 1197, + WindowBackgroundErase: 1198, + WindowClickActive: 1199, + WindowClosing: 1200, + WindowDidMove: 1201, + WindowDidResize: 1202, + WindowDPIChanged: 1203, + WindowDragDrop: 1204, + WindowDragEnter: 1205, + WindowDragLeave: 1206, + WindowDragOver: 1207, + WindowEndMove: 1208, + WindowEndResize: 1209, + WindowFullscreen: 1210, + WindowHide: 1211, + WindowInactive: 1212, + WindowKeyDown: 1213, + WindowKeyUp: 1214, + WindowKillFocus: 1215, + WindowNonClientHit: 1216, + WindowNonClientMouseDown: 1217, + WindowNonClientMouseLeave: 1218, + WindowNonClientMouseMove: 1219, + WindowNonClientMouseUp: 1220, + WindowPaint: 1221, + WindowRestore: 1222, + WindowSetFocus: 1223, + WindowShow: 1224, + WindowStartMove: 1225, + WindowStartResize: 1226, + WindowUnFullscreen: 1227, + WindowZOrderChanged: 1228, + WindowMinimise: 1229, + WindowUnMinimise: 1230, + WindowMaximise: 1231, + WindowUnMaximise: 1232, } } @@ -518,159 +520,160 @@ var eventToJS = map[uint]string{ 1075: "mac:ApplicationWillTerminate", 1076: "mac:ApplicationWillUnhide", 1077: "mac:ApplicationWillUpdate", - 1078: "mac:MenuDidAddItem", - 1079: "mac:MenuDidBeginTracking", - 1080: "mac:MenuDidClose", - 1081: "mac:MenuDidDisplayItem", - 1082: "mac:MenuDidEndTracking", - 1083: "mac:MenuDidHighlightItem", - 1084: "mac:MenuDidOpen", - 1085: "mac:MenuDidPopUp", - 1086: "mac:MenuDidRemoveItem", - 1087: "mac:MenuDidSendAction", - 1088: "mac:MenuDidSendActionToItem", - 1089: "mac:MenuDidUpdate", - 1090: "mac:MenuWillAddItem", - 1091: "mac:MenuWillBeginTracking", - 1092: "mac:MenuWillDisplayItem", - 1093: "mac:MenuWillEndTracking", - 1094: "mac:MenuWillHighlightItem", - 1095: "mac:MenuWillOpen", - 1096: "mac:MenuWillPopUp", - 1097: "mac:MenuWillRemoveItem", - 1098: "mac:MenuWillSendAction", - 1099: "mac:MenuWillSendActionToItem", - 1100: "mac:MenuWillUpdate", - 1101: "mac:WebViewDidCommitNavigation", - 1102: "mac:WebViewDidFinishNavigation", - 1103: "mac:WebViewDidReceiveServerRedirectForProvisionalNavigation", - 1104: "mac:WebViewDidStartProvisionalNavigation", - 1105: "mac:WindowDidBecomeKey", - 1106: "mac:WindowDidBecomeMain", - 1107: "mac:WindowDidBeginSheet", - 1108: "mac:WindowDidChangeAlpha", - 1109: "mac:WindowDidChangeBackingLocation", - 1110: "mac:WindowDidChangeBackingProperties", - 1111: "mac:WindowDidChangeCollectionBehavior", - 1112: "mac:WindowDidChangeEffectiveAppearance", - 1113: "mac:WindowDidChangeOcclusionState", - 1114: "mac:WindowDidChangeOrderingMode", - 1115: "mac:WindowDidChangeScreen", - 1116: "mac:WindowDidChangeScreenParameters", - 1117: "mac:WindowDidChangeScreenProfile", - 1118: "mac:WindowDidChangeScreenSpace", - 1119: "mac:WindowDidChangeScreenSpaceProperties", - 1120: "mac:WindowDidChangeSharingType", - 1121: "mac:WindowDidChangeSpace", - 1122: "mac:WindowDidChangeSpaceOrderingMode", - 1123: "mac:WindowDidChangeTitle", - 1124: "mac:WindowDidChangeToolbar", - 1125: "mac:WindowDidDeminiaturize", - 1126: "mac:WindowDidEndSheet", - 1127: "mac:WindowDidEnterFullScreen", - 1128: "mac:WindowDidEnterVersionBrowser", - 1129: "mac:WindowDidExitFullScreen", - 1130: "mac:WindowDidExitVersionBrowser", - 1131: "mac:WindowDidExpose", - 1132: "mac:WindowDidFocus", - 1133: "mac:WindowDidMiniaturize", - 1134: "mac:WindowDidMove", - 1135: "mac:WindowDidOrderOffScreen", - 1136: "mac:WindowDidOrderOnScreen", - 1137: "mac:WindowDidResignKey", - 1138: "mac:WindowDidResignMain", - 1139: "mac:WindowDidResize", - 1140: "mac:WindowDidUpdate", - 1141: "mac:WindowDidUpdateAlpha", - 1142: "mac:WindowDidUpdateCollectionBehavior", - 1143: "mac:WindowDidUpdateCollectionProperties", - 1144: "mac:WindowDidUpdateShadow", - 1145: "mac:WindowDidUpdateTitle", - 1146: "mac:WindowDidUpdateToolbar", - 1147: "mac:WindowDidZoom", - 1148: "mac:WindowFileDraggingEntered", - 1149: "mac:WindowFileDraggingExited", - 1150: "mac:WindowFileDraggingPerformed", - 1151: "mac:WindowHide", - 1152: "mac:WindowMaximise", - 1153: "mac:WindowUnMaximise", - 1154: "mac:WindowMinimise", - 1155: "mac:WindowUnMinimise", - 1156: "mac:WindowShouldClose", - 1157: "mac:WindowShow", - 1158: "mac:WindowWillBecomeKey", - 1159: "mac:WindowWillBecomeMain", - 1160: "mac:WindowWillBeginSheet", - 1161: "mac:WindowWillChangeOrderingMode", - 1162: "mac:WindowWillClose", - 1163: "mac:WindowWillDeminiaturize", - 1164: "mac:WindowWillEnterFullScreen", - 1165: "mac:WindowWillEnterVersionBrowser", - 1166: "mac:WindowWillExitFullScreen", - 1167: "mac:WindowWillExitVersionBrowser", - 1168: "mac:WindowWillFocus", - 1169: "mac:WindowWillMiniaturize", - 1170: "mac:WindowWillMove", - 1171: "mac:WindowWillOrderOffScreen", - 1172: "mac:WindowWillOrderOnScreen", - 1173: "mac:WindowWillResignMain", - 1174: "mac:WindowWillResize", - 1175: "mac:WindowWillUnfocus", - 1176: "mac:WindowWillUpdate", - 1177: "mac:WindowWillUpdateAlpha", - 1178: "mac:WindowWillUpdateCollectionBehavior", - 1179: "mac:WindowWillUpdateCollectionProperties", - 1180: "mac:WindowWillUpdateShadow", - 1181: "mac:WindowWillUpdateTitle", - 1182: "mac:WindowWillUpdateToolbar", - 1183: "mac:WindowWillUpdateVisibility", - 1184: "mac:WindowWillUseStandardFrame", - 1185: "mac:WindowZoomIn", - 1186: "mac:WindowZoomOut", - 1187: "mac:WindowZoomReset", - 1188: "windows:APMPowerSettingChange", - 1189: "windows:APMPowerStatusChange", - 1190: "windows:APMResumeAutomatic", - 1191: "windows:APMResumeSuspend", - 1192: "windows:APMSuspend", - 1193: "windows:ApplicationStarted", - 1194: "windows:SystemThemeChanged", - 1195: "windows:WebViewNavigationCompleted", - 1196: "windows:WindowActive", - 1197: "windows:WindowBackgroundErase", - 1198: "windows:WindowClickActive", - 1199: "windows:WindowClosing", - 1200: "windows:WindowDidMove", - 1201: "windows:WindowDidResize", - 1202: "windows:WindowDPIChanged", - 1203: "windows:WindowDragDrop", - 1204: "windows:WindowDragEnter", - 1205: "windows:WindowDragLeave", - 1206: "windows:WindowDragOver", - 1207: "windows:WindowEndMove", - 1208: "windows:WindowEndResize", - 1209: "windows:WindowFullscreen", - 1210: "windows:WindowHide", - 1211: "windows:WindowInactive", - 1212: "windows:WindowKeyDown", - 1213: "windows:WindowKeyUp", - 1214: "windows:WindowKillFocus", - 1215: "windows:WindowNonClientHit", - 1216: "windows:WindowNonClientMouseDown", - 1217: "windows:WindowNonClientMouseLeave", - 1218: "windows:WindowNonClientMouseMove", - 1219: "windows:WindowNonClientMouseUp", - 1220: "windows:WindowPaint", - 1221: "windows:WindowRestore", - 1222: "windows:WindowSetFocus", - 1223: "windows:WindowShow", - 1224: "windows:WindowStartMove", - 1225: "windows:WindowStartResize", - 1226: "windows:WindowUnFullscreen", - 1227: "windows:WindowZOrderChanged", - 1228: "windows:WindowMinimise", - 1229: "windows:WindowUnMinimise", - 1230: "windows:WindowMaximise", - 1231: "windows:WindowUnMaximise", + 1078: "mac:DidReceiveNotificationResponse", + 1079: "mac:MenuDidAddItem", + 1080: "mac:MenuDidBeginTracking", + 1081: "mac:MenuDidClose", + 1082: "mac:MenuDidDisplayItem", + 1083: "mac:MenuDidEndTracking", + 1084: "mac:MenuDidHighlightItem", + 1085: "mac:MenuDidOpen", + 1086: "mac:MenuDidPopUp", + 1087: "mac:MenuDidRemoveItem", + 1088: "mac:MenuDidSendAction", + 1089: "mac:MenuDidSendActionToItem", + 1090: "mac:MenuDidUpdate", + 1091: "mac:MenuWillAddItem", + 1092: "mac:MenuWillBeginTracking", + 1093: "mac:MenuWillDisplayItem", + 1094: "mac:MenuWillEndTracking", + 1095: "mac:MenuWillHighlightItem", + 1096: "mac:MenuWillOpen", + 1097: "mac:MenuWillPopUp", + 1098: "mac:MenuWillRemoveItem", + 1099: "mac:MenuWillSendAction", + 1100: "mac:MenuWillSendActionToItem", + 1101: "mac:MenuWillUpdate", + 1102: "mac:WebViewDidCommitNavigation", + 1103: "mac:WebViewDidFinishNavigation", + 1104: "mac:WebViewDidReceiveServerRedirectForProvisionalNavigation", + 1105: "mac:WebViewDidStartProvisionalNavigation", + 1106: "mac:WindowDidBecomeKey", + 1107: "mac:WindowDidBecomeMain", + 1108: "mac:WindowDidBeginSheet", + 1109: "mac:WindowDidChangeAlpha", + 1110: "mac:WindowDidChangeBackingLocation", + 1111: "mac:WindowDidChangeBackingProperties", + 1112: "mac:WindowDidChangeCollectionBehavior", + 1113: "mac:WindowDidChangeEffectiveAppearance", + 1114: "mac:WindowDidChangeOcclusionState", + 1115: "mac:WindowDidChangeOrderingMode", + 1116: "mac:WindowDidChangeScreen", + 1117: "mac:WindowDidChangeScreenParameters", + 1118: "mac:WindowDidChangeScreenProfile", + 1119: "mac:WindowDidChangeScreenSpace", + 1120: "mac:WindowDidChangeScreenSpaceProperties", + 1121: "mac:WindowDidChangeSharingType", + 1122: "mac:WindowDidChangeSpace", + 1123: "mac:WindowDidChangeSpaceOrderingMode", + 1124: "mac:WindowDidChangeTitle", + 1125: "mac:WindowDidChangeToolbar", + 1126: "mac:WindowDidDeminiaturize", + 1127: "mac:WindowDidEndSheet", + 1128: "mac:WindowDidEnterFullScreen", + 1129: "mac:WindowDidEnterVersionBrowser", + 1130: "mac:WindowDidExitFullScreen", + 1131: "mac:WindowDidExitVersionBrowser", + 1132: "mac:WindowDidExpose", + 1133: "mac:WindowDidFocus", + 1134: "mac:WindowDidMiniaturize", + 1135: "mac:WindowDidMove", + 1136: "mac:WindowDidOrderOffScreen", + 1137: "mac:WindowDidOrderOnScreen", + 1138: "mac:WindowDidResignKey", + 1139: "mac:WindowDidResignMain", + 1140: "mac:WindowDidResize", + 1141: "mac:WindowDidUpdate", + 1142: "mac:WindowDidUpdateAlpha", + 1143: "mac:WindowDidUpdateCollectionBehavior", + 1144: "mac:WindowDidUpdateCollectionProperties", + 1145: "mac:WindowDidUpdateShadow", + 1146: "mac:WindowDidUpdateTitle", + 1147: "mac:WindowDidUpdateToolbar", + 1148: "mac:WindowDidZoom", + 1149: "mac:WindowFileDraggingEntered", + 1150: "mac:WindowFileDraggingExited", + 1151: "mac:WindowFileDraggingPerformed", + 1152: "mac:WindowHide", + 1153: "mac:WindowMaximise", + 1154: "mac:WindowUnMaximise", + 1155: "mac:WindowMinimise", + 1156: "mac:WindowUnMinimise", + 1157: "mac:WindowShouldClose", + 1158: "mac:WindowShow", + 1159: "mac:WindowWillBecomeKey", + 1160: "mac:WindowWillBecomeMain", + 1161: "mac:WindowWillBeginSheet", + 1162: "mac:WindowWillChangeOrderingMode", + 1163: "mac:WindowWillClose", + 1164: "mac:WindowWillDeminiaturize", + 1165: "mac:WindowWillEnterFullScreen", + 1166: "mac:WindowWillEnterVersionBrowser", + 1167: "mac:WindowWillExitFullScreen", + 1168: "mac:WindowWillExitVersionBrowser", + 1169: "mac:WindowWillFocus", + 1170: "mac:WindowWillMiniaturize", + 1171: "mac:WindowWillMove", + 1172: "mac:WindowWillOrderOffScreen", + 1173: "mac:WindowWillOrderOnScreen", + 1174: "mac:WindowWillResignMain", + 1175: "mac:WindowWillResize", + 1176: "mac:WindowWillUnfocus", + 1177: "mac:WindowWillUpdate", + 1178: "mac:WindowWillUpdateAlpha", + 1179: "mac:WindowWillUpdateCollectionBehavior", + 1180: "mac:WindowWillUpdateCollectionProperties", + 1181: "mac:WindowWillUpdateShadow", + 1182: "mac:WindowWillUpdateTitle", + 1183: "mac:WindowWillUpdateToolbar", + 1184: "mac:WindowWillUpdateVisibility", + 1185: "mac:WindowWillUseStandardFrame", + 1186: "mac:WindowZoomIn", + 1187: "mac:WindowZoomOut", + 1188: "mac:WindowZoomReset", + 1189: "windows:APMPowerSettingChange", + 1190: "windows:APMPowerStatusChange", + 1191: "windows:APMResumeAutomatic", + 1192: "windows:APMResumeSuspend", + 1193: "windows:APMSuspend", + 1194: "windows:ApplicationStarted", + 1195: "windows:SystemThemeChanged", + 1196: "windows:WebViewNavigationCompleted", + 1197: "windows:WindowActive", + 1198: "windows:WindowBackgroundErase", + 1199: "windows:WindowClickActive", + 1200: "windows:WindowClosing", + 1201: "windows:WindowDidMove", + 1202: "windows:WindowDidResize", + 1203: "windows:WindowDPIChanged", + 1204: "windows:WindowDragDrop", + 1205: "windows:WindowDragEnter", + 1206: "windows:WindowDragLeave", + 1207: "windows:WindowDragOver", + 1208: "windows:WindowEndMove", + 1209: "windows:WindowEndResize", + 1210: "windows:WindowFullscreen", + 1211: "windows:WindowHide", + 1212: "windows:WindowInactive", + 1213: "windows:WindowKeyDown", + 1214: "windows:WindowKeyUp", + 1215: "windows:WindowKillFocus", + 1216: "windows:WindowNonClientHit", + 1217: "windows:WindowNonClientMouseDown", + 1218: "windows:WindowNonClientMouseLeave", + 1219: "windows:WindowNonClientMouseMove", + 1220: "windows:WindowNonClientMouseUp", + 1221: "windows:WindowPaint", + 1222: "windows:WindowRestore", + 1223: "windows:WindowSetFocus", + 1224: "windows:WindowShow", + 1225: "windows:WindowStartMove", + 1226: "windows:WindowStartResize", + 1227: "windows:WindowUnFullscreen", + 1228: "windows:WindowZOrderChanged", + 1229: "windows:WindowMinimise", + 1230: "windows:WindowUnMinimise", + 1231: "windows:WindowMaximise", + 1232: "windows:WindowUnMaximise", } diff --git a/v3/pkg/events/events.txt b/v3/pkg/events/events.txt index 1d43adf5e..fa83f4655 100644 --- a/v3/pkg/events/events.txt +++ b/v3/pkg/events/events.txt @@ -52,6 +52,7 @@ mac:ApplicationWillResignActive mac:ApplicationWillTerminate mac:ApplicationWillUnhide mac:ApplicationWillUpdate +mac:DidReceiveNotificationResponse mac:MenuDidAddItem mac:MenuDidBeginTracking mac:MenuDidClose diff --git a/v3/pkg/events/events_darwin.h b/v3/pkg/events/events_darwin.h index bacaab781..5e6c1a39e 100644 --- a/v3/pkg/events/events_darwin.h +++ b/v3/pkg/events/events_darwin.h @@ -28,118 +28,119 @@ extern void processWindowEvent(unsigned int, unsigned int); #define EventApplicationWillTerminate 1075 #define EventApplicationWillUnhide 1076 #define EventApplicationWillUpdate 1077 -#define EventMenuDidAddItem 1078 -#define EventMenuDidBeginTracking 1079 -#define EventMenuDidClose 1080 -#define EventMenuDidDisplayItem 1081 -#define EventMenuDidEndTracking 1082 -#define EventMenuDidHighlightItem 1083 -#define EventMenuDidOpen 1084 -#define EventMenuDidPopUp 1085 -#define EventMenuDidRemoveItem 1086 -#define EventMenuDidSendAction 1087 -#define EventMenuDidSendActionToItem 1088 -#define EventMenuDidUpdate 1089 -#define EventMenuWillAddItem 1090 -#define EventMenuWillBeginTracking 1091 -#define EventMenuWillDisplayItem 1092 -#define EventMenuWillEndTracking 1093 -#define EventMenuWillHighlightItem 1094 -#define EventMenuWillOpen 1095 -#define EventMenuWillPopUp 1096 -#define EventMenuWillRemoveItem 1097 -#define EventMenuWillSendAction 1098 -#define EventMenuWillSendActionToItem 1099 -#define EventMenuWillUpdate 1100 -#define EventWebViewDidCommitNavigation 1101 -#define EventWebViewDidFinishNavigation 1102 -#define EventWebViewDidReceiveServerRedirectForProvisionalNavigation 1103 -#define EventWebViewDidStartProvisionalNavigation 1104 -#define EventWindowDidBecomeKey 1105 -#define EventWindowDidBecomeMain 1106 -#define EventWindowDidBeginSheet 1107 -#define EventWindowDidChangeAlpha 1108 -#define EventWindowDidChangeBackingLocation 1109 -#define EventWindowDidChangeBackingProperties 1110 -#define EventWindowDidChangeCollectionBehavior 1111 -#define EventWindowDidChangeEffectiveAppearance 1112 -#define EventWindowDidChangeOcclusionState 1113 -#define EventWindowDidChangeOrderingMode 1114 -#define EventWindowDidChangeScreen 1115 -#define EventWindowDidChangeScreenParameters 1116 -#define EventWindowDidChangeScreenProfile 1117 -#define EventWindowDidChangeScreenSpace 1118 -#define EventWindowDidChangeScreenSpaceProperties 1119 -#define EventWindowDidChangeSharingType 1120 -#define EventWindowDidChangeSpace 1121 -#define EventWindowDidChangeSpaceOrderingMode 1122 -#define EventWindowDidChangeTitle 1123 -#define EventWindowDidChangeToolbar 1124 -#define EventWindowDidDeminiaturize 1125 -#define EventWindowDidEndSheet 1126 -#define EventWindowDidEnterFullScreen 1127 -#define EventWindowDidEnterVersionBrowser 1128 -#define EventWindowDidExitFullScreen 1129 -#define EventWindowDidExitVersionBrowser 1130 -#define EventWindowDidExpose 1131 -#define EventWindowDidFocus 1132 -#define EventWindowDidMiniaturize 1133 -#define EventWindowDidMove 1134 -#define EventWindowDidOrderOffScreen 1135 -#define EventWindowDidOrderOnScreen 1136 -#define EventWindowDidResignKey 1137 -#define EventWindowDidResignMain 1138 -#define EventWindowDidResize 1139 -#define EventWindowDidUpdate 1140 -#define EventWindowDidUpdateAlpha 1141 -#define EventWindowDidUpdateCollectionBehavior 1142 -#define EventWindowDidUpdateCollectionProperties 1143 -#define EventWindowDidUpdateShadow 1144 -#define EventWindowDidUpdateTitle 1145 -#define EventWindowDidUpdateToolbar 1146 -#define EventWindowDidZoom 1147 -#define EventWindowFileDraggingEntered 1148 -#define EventWindowFileDraggingExited 1149 -#define EventWindowFileDraggingPerformed 1150 -#define EventWindowHide 1151 -#define EventWindowMaximise 1152 -#define EventWindowUnMaximise 1153 -#define EventWindowMinimise 1154 -#define EventWindowUnMinimise 1155 -#define EventWindowShouldClose 1156 -#define EventWindowShow 1157 -#define EventWindowWillBecomeKey 1158 -#define EventWindowWillBecomeMain 1159 -#define EventWindowWillBeginSheet 1160 -#define EventWindowWillChangeOrderingMode 1161 -#define EventWindowWillClose 1162 -#define EventWindowWillDeminiaturize 1163 -#define EventWindowWillEnterFullScreen 1164 -#define EventWindowWillEnterVersionBrowser 1165 -#define EventWindowWillExitFullScreen 1166 -#define EventWindowWillExitVersionBrowser 1167 -#define EventWindowWillFocus 1168 -#define EventWindowWillMiniaturize 1169 -#define EventWindowWillMove 1170 -#define EventWindowWillOrderOffScreen 1171 -#define EventWindowWillOrderOnScreen 1172 -#define EventWindowWillResignMain 1173 -#define EventWindowWillResize 1174 -#define EventWindowWillUnfocus 1175 -#define EventWindowWillUpdate 1176 -#define EventWindowWillUpdateAlpha 1177 -#define EventWindowWillUpdateCollectionBehavior 1178 -#define EventWindowWillUpdateCollectionProperties 1179 -#define EventWindowWillUpdateShadow 1180 -#define EventWindowWillUpdateTitle 1181 -#define EventWindowWillUpdateToolbar 1182 -#define EventWindowWillUpdateVisibility 1183 -#define EventWindowWillUseStandardFrame 1184 -#define EventWindowZoomIn 1185 -#define EventWindowZoomOut 1186 -#define EventWindowZoomReset 1187 +#define EventDidReceiveNotificationResponse 1078 +#define EventMenuDidAddItem 1079 +#define EventMenuDidBeginTracking 1080 +#define EventMenuDidClose 1081 +#define EventMenuDidDisplayItem 1082 +#define EventMenuDidEndTracking 1083 +#define EventMenuDidHighlightItem 1084 +#define EventMenuDidOpen 1085 +#define EventMenuDidPopUp 1086 +#define EventMenuDidRemoveItem 1087 +#define EventMenuDidSendAction 1088 +#define EventMenuDidSendActionToItem 1089 +#define EventMenuDidUpdate 1090 +#define EventMenuWillAddItem 1091 +#define EventMenuWillBeginTracking 1092 +#define EventMenuWillDisplayItem 1093 +#define EventMenuWillEndTracking 1094 +#define EventMenuWillHighlightItem 1095 +#define EventMenuWillOpen 1096 +#define EventMenuWillPopUp 1097 +#define EventMenuWillRemoveItem 1098 +#define EventMenuWillSendAction 1099 +#define EventMenuWillSendActionToItem 1100 +#define EventMenuWillUpdate 1101 +#define EventWebViewDidCommitNavigation 1102 +#define EventWebViewDidFinishNavigation 1103 +#define EventWebViewDidReceiveServerRedirectForProvisionalNavigation 1104 +#define EventWebViewDidStartProvisionalNavigation 1105 +#define EventWindowDidBecomeKey 1106 +#define EventWindowDidBecomeMain 1107 +#define EventWindowDidBeginSheet 1108 +#define EventWindowDidChangeAlpha 1109 +#define EventWindowDidChangeBackingLocation 1110 +#define EventWindowDidChangeBackingProperties 1111 +#define EventWindowDidChangeCollectionBehavior 1112 +#define EventWindowDidChangeEffectiveAppearance 1113 +#define EventWindowDidChangeOcclusionState 1114 +#define EventWindowDidChangeOrderingMode 1115 +#define EventWindowDidChangeScreen 1116 +#define EventWindowDidChangeScreenParameters 1117 +#define EventWindowDidChangeScreenProfile 1118 +#define EventWindowDidChangeScreenSpace 1119 +#define EventWindowDidChangeScreenSpaceProperties 1120 +#define EventWindowDidChangeSharingType 1121 +#define EventWindowDidChangeSpace 1122 +#define EventWindowDidChangeSpaceOrderingMode 1123 +#define EventWindowDidChangeTitle 1124 +#define EventWindowDidChangeToolbar 1125 +#define EventWindowDidDeminiaturize 1126 +#define EventWindowDidEndSheet 1127 +#define EventWindowDidEnterFullScreen 1128 +#define EventWindowDidEnterVersionBrowser 1129 +#define EventWindowDidExitFullScreen 1130 +#define EventWindowDidExitVersionBrowser 1131 +#define EventWindowDidExpose 1132 +#define EventWindowDidFocus 1133 +#define EventWindowDidMiniaturize 1134 +#define EventWindowDidMove 1135 +#define EventWindowDidOrderOffScreen 1136 +#define EventWindowDidOrderOnScreen 1137 +#define EventWindowDidResignKey 1138 +#define EventWindowDidResignMain 1139 +#define EventWindowDidResize 1140 +#define EventWindowDidUpdate 1141 +#define EventWindowDidUpdateAlpha 1142 +#define EventWindowDidUpdateCollectionBehavior 1143 +#define EventWindowDidUpdateCollectionProperties 1144 +#define EventWindowDidUpdateShadow 1145 +#define EventWindowDidUpdateTitle 1146 +#define EventWindowDidUpdateToolbar 1147 +#define EventWindowDidZoom 1148 +#define EventWindowFileDraggingEntered 1149 +#define EventWindowFileDraggingExited 1150 +#define EventWindowFileDraggingPerformed 1151 +#define EventWindowHide 1152 +#define EventWindowMaximise 1153 +#define EventWindowUnMaximise 1154 +#define EventWindowMinimise 1155 +#define EventWindowUnMinimise 1156 +#define EventWindowShouldClose 1157 +#define EventWindowShow 1158 +#define EventWindowWillBecomeKey 1159 +#define EventWindowWillBecomeMain 1160 +#define EventWindowWillBeginSheet 1161 +#define EventWindowWillChangeOrderingMode 1162 +#define EventWindowWillClose 1163 +#define EventWindowWillDeminiaturize 1164 +#define EventWindowWillEnterFullScreen 1165 +#define EventWindowWillEnterVersionBrowser 1166 +#define EventWindowWillExitFullScreen 1167 +#define EventWindowWillExitVersionBrowser 1168 +#define EventWindowWillFocus 1169 +#define EventWindowWillMiniaturize 1170 +#define EventWindowWillMove 1171 +#define EventWindowWillOrderOffScreen 1172 +#define EventWindowWillOrderOnScreen 1173 +#define EventWindowWillResignMain 1174 +#define EventWindowWillResize 1175 +#define EventWindowWillUnfocus 1176 +#define EventWindowWillUpdate 1177 +#define EventWindowWillUpdateAlpha 1178 +#define EventWindowWillUpdateCollectionBehavior 1179 +#define EventWindowWillUpdateCollectionProperties 1180 +#define EventWindowWillUpdateShadow 1181 +#define EventWindowWillUpdateTitle 1182 +#define EventWindowWillUpdateToolbar 1183 +#define EventWindowWillUpdateVisibility 1184 +#define EventWindowWillUseStandardFrame 1185 +#define EventWindowZoomIn 1186 +#define EventWindowZoomOut 1187 +#define EventWindowZoomReset 1188 -#define MAX_EVENTS 1188 +#define MAX_EVENTS 1189 #endif \ No newline at end of file From 274511c5cba8d5055dcf53ad894c7f24588acd1b Mon Sep 17 00:00:00 2001 From: popaprozac Date: Thu, 20 Feb 2025 22:27:56 -0800 Subject: [PATCH 015/374] update log message --- v3/pkg/application/notifications_darwin.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v3/pkg/application/notifications_darwin.m b/v3/pkg/application/notifications_darwin.m index 31152e13e..7c0a1cade 100644 --- a/v3/pkg/application/notifications_darwin.m +++ b/v3/pkg/application/notifications_darwin.m @@ -70,7 +70,7 @@ bool checkBundleIdentifier(void) { NSLog(@"Error: Cannot use notifications in development mode.\n" " Notifications require the app to be properly bundled with a bundle identifier.\n" " To test notifications:\n" - " 1. Build and package your app using 'wails package'\n" + " 1. Build and package your app using 'wails3 package'\n" " 2. Sign the packaged .app\n" " 3. Run the signed .app bundle"); return false; From f694ad223ee421c7ed1e2191e7d87835ec6775c4 Mon Sep 17 00:00:00 2001 From: popaprozac Date: Fri, 21 Feb 2025 18:20:37 -0800 Subject: [PATCH 016/374] service and minor refactor --- v3/pkg/application/application_darwin.go | 35 ---- v3/pkg/services/notification/notification.go | 200 +++++++++++++++++++ 2 files changed, 200 insertions(+), 35 deletions(-) create mode 100644 v3/pkg/services/notification/notification.go diff --git a/v3/pkg/application/application_darwin.go b/v3/pkg/application/application_darwin.go index ce205b029..623e4a94c 100644 --- a/v3/pkg/application/application_darwin.go +++ b/v3/pkg/application/application_darwin.go @@ -228,41 +228,6 @@ func (m *macosApp) setApplicationMenu(menu *Menu) { C.setApplicationMenu(m.applicationMenu) } -// RequestNotificationPermission requests user permission for notifications -func (m *macosApp) RequestNotificationPermission() (bool, error) { - return RequestUserNotificationAuthorization() -} - -// CheckNotificationPermission checks current permission status -func (m *macosApp) CheckNotificationPermission() (bool, error) { - return CheckNotificationAuthorization() -} - -// SendNotification sends a simple notification -func (m *macosApp) SendNotification(identifier, title, subtitle, body string) error { - return SendNotification(identifier, title, subtitle, body) -} - -// SendNotificationWithActions sends a notification with custom actions -func (m *macosApp) SendNotificationWithActions(options NotificationOptions) error { - return SendNotificationWithActions(options) -} - -// RegisterNotificationCategory registers a notification category with actions -func (m *macosApp) RegisterNotificationCategory(category NotificationCategory) error { - return RegisterNotificationCategory(category) -} - -// RemoveAllPendingNotifications removes all pending notifications -func (m *macosApp) RemoveAllPendingNotifications() { - RemoveAllPendingNotifications() -} - -// RemovePendingNotification removes a specific pending notification -func (m *macosApp) RemovePendingNotification(identifier string) { - RemovePendingNotification(identifier) -} - func (m *macosApp) run() error { if m.parent.options.SingleInstance != nil { cUniqueID := C.CString(m.parent.options.SingleInstance.UniqueID) diff --git a/v3/pkg/services/notification/notification.go b/v3/pkg/services/notification/notification.go new file mode 100644 index 000000000..987e4d438 --- /dev/null +++ b/v3/pkg/services/notification/notification.go @@ -0,0 +1,200 @@ +//go:build darwin + +package notification + +/* +#cgo CFLAGS: -mmacosx-version-min=10.14 -x objective-c +#cgo LDFLAGS: -framework Cocoa -mmacosx-version-min=10.14 -framework UserNotifications +#import "../../application/notifications_darwin.h" +*/ +import "C" +import ( + "context" + "encoding/json" + "fmt" + "unsafe" + + "github.com/wailsapp/wails/v3/pkg/application" +) + +type NotificationService struct { +} + +// NotificationAction represents an action button for a notification +type NotificationAction struct { + ID string `json:"id"` + Title string `json:"title"` + Destructive bool `json:"destructive,omitempty"` + AuthenticationRequired bool `json:"authenticationRequired,omitempty"` +} + +// NotificationCategory groups actions for notifications +type NotificationCategory struct { + ID string `json:"id"` + Actions []NotificationAction `json:"actions"` + HasReplyField bool `json:"hasReplyField,omitempty"` + ReplyPlaceholder string `json:"replyPlaceholder,omitempty"` + ReplyButtonTitle string `json:"replyButtonTitle,omitempty"` +} + +// NotificationOptions contains configuration for a notification +type NotificationOptions struct { + ID string `json:"id"` + Title string `json:"title"` + Subtitle string `json:"subtitle,omitempty"` + Body string `json:"body"` + CategoryID string `json:"categoryId,omitempty"` + Data map[string]interface{} `json:"data,omitempty"` +} + +func CheckBundleIdentifier() bool { + return bool(C.checkBundleIdentifier()) +} + +// ServiceName returns the name of the service +func (ns *NotificationService) ServiceName() string { + return "github.com/wailsapp/wails/v3/services/notifications" +} + +// ServiceStartup is called when the service is loaded +func (ns *NotificationService) ServiceStartup(ctx context.Context, options application.ServiceOptions) error { + if !CheckBundleIdentifier() { + return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") + } + return nil +} + +// ServiceShutdown is called when the service is unloaded +func (ns *NotificationService) ServiceShutdown() error { + return nil +} + +// RequestUserNotificationAuthorization requests permission for notifications. +func (ns *NotificationService) RequestUserNotificationAuthorization() (bool, error) { + if !CheckBundleIdentifier() { + return false, fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") + } + result := C.requestUserNotificationAuthorization(nil) + return result == true, nil +} + +// CheckNotificationAuthorization checks current permission status +func (ns *NotificationService) CheckNotificationAuthorization() (bool, error) { + if !CheckBundleIdentifier() { + return false, fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") + } + return bool(C.checkNotificationAuthorization()), nil +} + +// SendNotification sends a notification with the given identifier, title, subtitle, and body. +func (ns *NotificationService) SendNotification(identifier, title, subtitle, body string) error { + if !CheckBundleIdentifier() { + return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") + } + cIdentifier := C.CString(identifier) + cTitle := C.CString(title) + cSubtitle := C.CString(subtitle) + cBody := C.CString(body) + defer C.free(unsafe.Pointer(cIdentifier)) + defer C.free(unsafe.Pointer(cTitle)) + defer C.free(unsafe.Pointer(cSubtitle)) + defer C.free(unsafe.Pointer(cBody)) + + C.sendNotification(cIdentifier, cTitle, cSubtitle, cBody, nil) + return nil +} + +// SendNotificationWithActions sends a notification with the specified actions +func (ns *NotificationService) SendNotificationWithActions(options NotificationOptions) error { + if !CheckBundleIdentifier() { + return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") + } + cIdentifier := C.CString(options.ID) + cTitle := C.CString(options.Title) + cSubtitle := C.CString(options.Subtitle) + cBody := C.CString(options.Body) + cCategoryID := C.CString(options.CategoryID) + defer C.free(unsafe.Pointer(cIdentifier)) + defer C.free(unsafe.Pointer(cTitle)) + defer C.free(unsafe.Pointer(cSubtitle)) + defer C.free(unsafe.Pointer(cBody)) + defer C.free(unsafe.Pointer(cCategoryID)) + + var cActionsJSON *C.char + if options.Data != nil { + jsonData, err := json.Marshal(options.Data) + if err == nil { + cActionsJSON = C.CString(string(jsonData)) + defer C.free(unsafe.Pointer(cActionsJSON)) + } + } + + C.sendNotificationWithActions(cIdentifier, cTitle, cSubtitle, cBody, cCategoryID, cActionsJSON, nil) + return nil +} + +// RegisterNotificationCategory registers a category with actions and optional reply field +func (ns *NotificationService) RegisterNotificationCategory(category NotificationCategory) error { + if !CheckBundleIdentifier() { + return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") + } + cCategoryID := C.CString(category.ID) + defer C.free(unsafe.Pointer(cCategoryID)) + + actionsJSON, err := json.Marshal(category.Actions) + if err != nil { + return err + } + cActionsJSON := C.CString(string(actionsJSON)) + defer C.free(unsafe.Pointer(cActionsJSON)) + + var cReplyPlaceholder, cReplyButtonTitle *C.char + if category.HasReplyField { + cReplyPlaceholder = C.CString(category.ReplyPlaceholder) + cReplyButtonTitle = C.CString(category.ReplyButtonTitle) + defer C.free(unsafe.Pointer(cReplyPlaceholder)) + defer C.free(unsafe.Pointer(cReplyButtonTitle)) + } + + C.registerNotificationCategory(cCategoryID, cActionsJSON, C.bool(category.HasReplyField), + cReplyPlaceholder, cReplyButtonTitle) + return nil +} + +// RemoveAllPendingNotifications removes all pending notifications +func (ns *NotificationService) RemoveAllPendingNotifications() error { + if !CheckBundleIdentifier() { + return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") + } + C.removeAllPendingNotifications() + return nil +} + +// RemovePendingNotification removes a specific pending notification +func (ns *NotificationService) RemovePendingNotification(identifier string) error { + if !CheckBundleIdentifier() { + return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") + } + cIdentifier := C.CString(identifier) + defer C.free(unsafe.Pointer(cIdentifier)) + C.removePendingNotification(cIdentifier) + return nil +} + +func (ns *NotificationService) RemoveAllDeliveredNotifications() error { + if !CheckBundleIdentifier() { + return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") + } + C.removeAllDeliveredNotifications() + return nil +} + +func (ns *NotificationService) RemoveDeliveredNotification(identifier string) error { + if !CheckBundleIdentifier() { + return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") + } + cIdentifier := C.CString(identifier) + defer C.free(unsafe.Pointer(cIdentifier)) + C.removeDeliveredNotification(cIdentifier) + return nil +} From cc524d78e4bca1691f3c6bb0f86fc31550c3186e Mon Sep 17 00:00:00 2001 From: popaprozac Date: Fri, 21 Feb 2025 18:36:54 -0800 Subject: [PATCH 017/374] update example --- v3/examples/notifications/frontend/index.html | 31 ++++ v3/examples/notifications/frontend/main.js | 67 ++++++++ .../notifications/frontend/package.json | 16 ++ .../frontend/public/Inter-Medium.ttf | Bin 0 -> 315132 bytes .../frontend/public/javascript.svg | 1 + .../notifications/frontend/public/style.css | 160 ++++++++++++++++++ .../notifications/frontend/public/wails.png | Bin 0 -> 9057 bytes v3/examples/notifications/main.go | 4 + 8 files changed, 279 insertions(+) create mode 100644 v3/examples/notifications/frontend/index.html create mode 100644 v3/examples/notifications/frontend/main.js create mode 100644 v3/examples/notifications/frontend/package.json create mode 100644 v3/examples/notifications/frontend/public/Inter-Medium.ttf create mode 100644 v3/examples/notifications/frontend/public/javascript.svg create mode 100644 v3/examples/notifications/frontend/public/style.css create mode 100644 v3/examples/notifications/frontend/public/wails.png diff --git a/v3/examples/notifications/frontend/index.html b/v3/examples/notifications/frontend/index.html new file mode 100644 index 000000000..88daa5e2f --- /dev/null +++ b/v3/examples/notifications/frontend/index.html @@ -0,0 +1,31 @@ + + + + + + + + Wails App + + +
    + +

    Wails + Javascript

    + +
    + + + diff --git a/v3/examples/notifications/frontend/main.js b/v3/examples/notifications/frontend/main.js new file mode 100644 index 000000000..18dd0214c --- /dev/null +++ b/v3/examples/notifications/frontend/main.js @@ -0,0 +1,67 @@ +import { GreetService } from "./bindings/notifications"; +import { NotificationService } from "./bindings/github.com/wailsapp/wails/v3/pkg/services/notification"; +import { Events } from "@wailsio/runtime"; + +const resultElement = document.getElementById('result'); +const timeElement = document.getElementById('time'); +const notificationsElement = document.getElementById('notifications'); + +const nofitications = new Map(); + +window.doGreet = () => { + let name = document.getElementById('name').value; + if (!name) { + name = 'anonymous'; + } + GreetService.Greet(name).then((result) => { + resultElement.innerText = result; + }).catch((err) => { + console.log(err); + }); +} + +window.sendNotification = async () => { + const granted = await NotificationService.CheckNotificationAuthorization(); + if (granted) { + await NotificationService.SendNotification("some-uuid-fronted", "Frontend Notificaiton", "", "Notificaiton sent through JS!"); + } +} + +window.sendComplexNotification = async () => { + const granted = await NotificationService.CheckNotificationAuthorization(); + if (granted) { + await NotificationService.RegisterNotificationCategory({ + id: "FRONTEND_NOTIF", + actions: [ + { id: "VIEW_ACTION", title: "View" }, + { id: "MARK_READ_ACTION", title: "Mark as Read" }, + { id: "DELETE_ACTION", title: "Delete", destructive: true }, + ], + hasReplyField: true, + replyButtonTitle: "Reply", + replyPlaceholder: "Reply to frontend...", + }); + + await NotificationService.SendNotificationWithActions({ + id: "some-uuid-complex", + title: "Complex Frontend Notification", + subtitle: "From: Jane Doe", + body: "Is it rainging today where you are?", + categoryId: "FRONTEND_NOTIF", + data: { + messageId: "msg-456", + senderId: "user-456", + timestamp: Date.now(), + } + }); + } +} + +Events.On('time', (time) => { + timeElement.innerText = time.data; +}); + +Events.On("notification", (data) => { + nofitications.set(data.identifier, data); + notificationsElement.innerText = Array.from(nofitications.values()).map(notification => JSON.stringify(notification)).join(", "); +}); \ No newline at end of file diff --git a/v3/examples/notifications/frontend/package.json b/v3/examples/notifications/frontend/package.json new file mode 100644 index 000000000..9ae87549e --- /dev/null +++ b/v3/examples/notifications/frontend/package.json @@ -0,0 +1,16 @@ +{ + "name": "frontend", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build:dev": "vite build --minify false --mode development", + "build": "vite build --mode production", + "preview": "vite preview" + }, + "devDependencies": { + "vite": "^5.0.0", + "@wailsio/runtime": "latest" + } +} \ No newline at end of file diff --git a/v3/examples/notifications/frontend/public/Inter-Medium.ttf b/v3/examples/notifications/frontend/public/Inter-Medium.ttf new file mode 100644 index 0000000000000000000000000000000000000000..a01f3777a6fc284b7a720c0f8248a27066389ef9 GIT binary patch literal 315132 zcmd>{3Ajzw|M0(S?X!n-?sds<&AMdHJY`De%rlit*Gxz*k|ZQaMWm8sCL|H5Orgje zLX;sYN}^G@hWmcjK4)L_tKaY+-sgFr_ul8T*4k_QuJ8KpwfA0opS?wiNG6<+$lZ18 z)h}DV>>3eWoroNFw`kt_=)7a6M2)O0s^ph46$l{1e>k6gWyQwEyWNY9Gz_3HOX&vyAf z)S{Q>5MAJ8?;gqBOFo}`FX>%Kuhg4}e4BH=#y0Xu!QTA`56g7y>@Ol2dy5p=(eJ@- z$>AZbE{NPwf$hEhlZOqA#4CsVv?oaelKb~){O#aW5vPqvIP<^B5&SN zzrXqG{ycsElt;op`!QDN*v#5b&hDJC`frju&adR?&uep=z_GS14*mY-l@WRR#%E^J z5gn_;)b6n*lGS$$ihj6P@4+ggNJ_r}gHSL1OfsF!hHQL}O9s)M+nsb6q^Qx|dn(6vPA zI=TUFBi#nKoleH>rm-LWq<#hWRsAaNOuY_wquz}Bk=}y4L+`}htv|#4+^Q|gs%JIC zZDKuyJJ=e6`-n9Tcf7Rn$I0&?vs26| zhFiiZfm_XC?3_kUBivR_Pu$*4Z`=o*2XF^C18^U9hKc1o;ygllxHE$A80QJxxz0jS zuIEyxThJ|tTgUBy+u7}m`?&iA?o;klxKF!J<38g~!kywy!JX<(#hvD&2lrK%QFa%* zi*es@m*OsSm*cK3;-OD(xHp{e)}Vk zj}jgoW^}?YgkQj&9-fZ-es~?J8^W6i?+WiGygz&h_el5{?w4U|4u2c|7WaG@4Tpb< z&3F~`P%|^Jmxw&?#K*!)a@fDd!depS)3LB6rR?`&;m{3vY^h|U1HT@J_`b2QD{bt= zSlAQKPKbrWk`y{03&#=O6AQ=R5YC{ItYxwI1gT)5Z@>Ob60rux!na7g)jbx@d_A7& zF41ZhjaN$YSmk12Emid&v9Kle_1m#?vid~S~a&&R@fB%ch5h4XS)iH$F^BublD{H+{eYRAG!9CZrB!ugRWM=V@`kdUjN zBuh7WfLsk_FyVgEhwba}^<)_FgGi|@50cvbPdWcF{jc){v8|mem2h13VpUJrSMT9Ty>3?!}(7+ojH-SDu#-J4JfsYA$L->-WxHJI`PNg0eR zrk)%OnM*bDYd9+u%CMXc}>W)X;S;MZTi-o7KTVyUt%M{ zpqpyy=F2mb5@zI$)P2a=gfb8NwcIE}lbcEgd7JyvnwADob^xWW$D|N5?1t^0zAS_O zQtAi&vUMquf)xFc*ywzS->W{9Gc5#~G(9rbkmBnx1>HsEAMVR+MkEQ{8BLp>rLbir zGrCS9&XgYD_t!`p9oeqL4kG72YyWz`jLr6f!IZesh8y~=80{Nt9gJqGN@@O6kj9Lc zv5gcd1xCxI{5E@$-W-c)!v1aS(MVgL6eDkvv?kP((8K7#*oWzf$r0U;dyvc6hZ(zQ zpG@0PYchFTv)7wZyDs_ln$4cljk3`iN|37^TSfn*nUt7Tjja8l6mAc+*oxXs%n;lp+B0Ju?NN%a&mjNx zQA%QOYv@ZAwTBy1qIx#6N9RXVm)WNV`Ln4R6=O?*1lLQJyvZW|tkd#HTL!IG;ff$? zK_%HvmWsrckxH~t1`Xbrs}-Zz6sjSqu?f?oo7-qboY_;%TtDcBTuC=cQU@IjWS%m1 z7|f>SXw48EVPi4Z+enfY7y8oNVG@2$=8*Bb|Yth z#wE~FX<80?P)sDQpt&yPN^GUn|6ii|e_rpkJ?_f1l28#`I0oDP{d)d+`M8MGzY({b zoVDP42V>h{^2j=f$(R9Lo&d7Uiy12EF<#m^3% zk;mAc3tNaQ3?C4lt$)Av9sZ_hKH0z`#ŹD@)<7ltOtn$SSm;LMTrPEA?sR43d= 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�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 literal 0 HcmV?d00001 diff --git a/v3/examples/notifications/frontend/public/javascript.svg b/v3/examples/notifications/frontend/public/javascript.svg new file mode 100644 index 000000000..f9abb2b72 --- /dev/null +++ b/v3/examples/notifications/frontend/public/javascript.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v3/examples/notifications/frontend/public/style.css b/v3/examples/notifications/frontend/public/style.css new file mode 100644 index 000000000..127799eda --- /dev/null +++ b/v3/examples/notifications/frontend/public/style.css @@ -0,0 +1,160 @@ +:root { + font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", + "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", + sans-serif; + font-size: 16px; + line-height: 24px; + font-weight: 400; + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: rgba(27, 38, 54, 1); + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +* { + user-select: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; +} + +@font-face { + font-family: "Inter"; + font-style: normal; + font-weight: 400; + src: local(""), + url("./Inter-Medium.ttf") format("truetype"); +} + +h3 { + font-size: 3em; + line-height: 1.1; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} + +a:hover { + color: #535bf2; +} + +button { + /* width: 60px; */ + height: 30px; + line-height: 30px; + border-radius: 3px; + border: none; + margin: 0 0 0 20px; + padding: 0 8px; + cursor: pointer; +} + +.result { + height: 20px; + line-height: 20px; +} + +body { + margin: 0; + display: flex; + place-items: center; + place-content: center; + min-width: 320px; + min-height: 100vh; +} + +.container { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +#app { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; +} + +.logo:hover { + filter: drop-shadow(0 0 2em #e80000aa); +} + +.logo.vanilla:hover { + filter: drop-shadow(0 0 2em #f7df1eaa); +} + +.result { + height: 20px; + line-height: 20px; + margin: 1.5rem auto; + text-align: center; +} + +.footer { + margin-top: 1rem; + align-content: center; + text-align: center; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + + a:hover { + color: #747bff; + } + + button { + background-color: #f9f9f9; + } +} + + +.input-box .btn:hover { + background-image: linear-gradient(to top, #cfd9df 0%, #e2ebf0 100%); + color: #333333; +} + +.input-box .input { + border: none; + border-radius: 3px; + outline: none; + height: 30px; + line-height: 30px; + padding: 0 10px; + color: black; + background-color: rgba(240, 240, 240, 1); + -webkit-font-smoothing: antialiased; +} + +.input-box .input:hover { + border: none; + background-color: rgba(255, 255, 255, 1); +} + +.input-box .input:focus { + border: none; + background-color: rgba(255, 255, 255, 1); +} \ No newline at end of file diff --git a/v3/examples/notifications/frontend/public/wails.png b/v3/examples/notifications/frontend/public/wails.png new file mode 100644 index 0000000000000000000000000000000000000000..8bdf424833bfb5b6b34a0807224e94533f738f2e GIT binary patch literal 9057 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 Date: Sat, 22 Feb 2025 00:34:29 -0800 Subject: [PATCH 018/374] refactor --- v3/examples/notifications/frontend/index.html | 31 --- v3/examples/notifications/frontend/main.js | 67 ------- .../notifications/frontend/package.json | 16 -- .../frontend/public/Inter-Medium.ttf | Bin 315132 -> 0 bytes .../frontend/public/javascript.svg | 1 - .../notifications/frontend/public/style.css | 160 ---------------- .../notifications/frontend/public/wails.png | Bin 9057 -> 0 bytes v3/examples/notifications/main.go | 135 ------------- .../v3/pkg/services/notifications/index.js | 25 +++ .../v3/pkg/services/notifications/models.js | 37 ++++ .../v3/pkg/services/notifications/service.js | 98 ++++++++++ v3/examples/services/assets/index.html | 7 + v3/examples/services/main.go | 11 +- v3/pkg/application/notifications_darwin.go | 177 ------------------ .../notifications.go} | 40 ++-- .../notifications}/notifications_darwin.h | 0 .../notifications}/notifications_darwin.m | 2 +- 17 files changed, 197 insertions(+), 610 deletions(-) delete mode 100644 v3/examples/notifications/frontend/index.html delete mode 100644 v3/examples/notifications/frontend/main.js delete mode 100644 v3/examples/notifications/frontend/package.json delete mode 100644 v3/examples/notifications/frontend/public/Inter-Medium.ttf delete mode 100644 v3/examples/notifications/frontend/public/javascript.svg delete mode 100644 v3/examples/notifications/frontend/public/style.css delete mode 100644 v3/examples/notifications/frontend/public/wails.png delete mode 100644 v3/examples/notifications/main.go create mode 100644 v3/examples/services/assets/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/index.js create mode 100644 v3/examples/services/assets/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/models.js create mode 100644 v3/examples/services/assets/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/service.js delete mode 100644 v3/pkg/application/notifications_darwin.go rename v3/pkg/services/{notification/notification.go => notifications/notifications.go} (83%) rename v3/pkg/{application => services/notifications}/notifications_darwin.h (100%) rename v3/pkg/{application => services/notifications}/notifications_darwin.m (99%) diff --git a/v3/examples/notifications/frontend/index.html b/v3/examples/notifications/frontend/index.html deleted file mode 100644 index 88daa5e2f..000000000 --- a/v3/examples/notifications/frontend/index.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - Wails App - - - - - - diff --git a/v3/examples/notifications/frontend/main.js b/v3/examples/notifications/frontend/main.js deleted file mode 100644 index 18dd0214c..000000000 --- a/v3/examples/notifications/frontend/main.js +++ /dev/null @@ -1,67 +0,0 @@ -import { GreetService } from "./bindings/notifications"; -import { NotificationService } from "./bindings/github.com/wailsapp/wails/v3/pkg/services/notification"; -import { Events } from "@wailsio/runtime"; - -const resultElement = document.getElementById('result'); -const timeElement = document.getElementById('time'); -const notificationsElement = document.getElementById('notifications'); - -const nofitications = new Map(); - -window.doGreet = () => { - let name = document.getElementById('name').value; - if (!name) { - name = 'anonymous'; - } - GreetService.Greet(name).then((result) => { - resultElement.innerText = result; - }).catch((err) => { - console.log(err); - }); -} - -window.sendNotification = async () => { - const granted = await NotificationService.CheckNotificationAuthorization(); - if (granted) { - await NotificationService.SendNotification("some-uuid-fronted", "Frontend Notificaiton", "", "Notificaiton sent through JS!"); - } -} - -window.sendComplexNotification = async () => { - const granted = await NotificationService.CheckNotificationAuthorization(); - if (granted) { - await NotificationService.RegisterNotificationCategory({ - id: "FRONTEND_NOTIF", - actions: [ - { id: "VIEW_ACTION", title: "View" }, - { id: "MARK_READ_ACTION", title: "Mark as Read" }, - { id: "DELETE_ACTION", title: "Delete", destructive: true }, - ], - hasReplyField: true, - replyButtonTitle: "Reply", - replyPlaceholder: "Reply to frontend...", - }); - - await NotificationService.SendNotificationWithActions({ - id: "some-uuid-complex", - title: "Complex Frontend Notification", - subtitle: "From: Jane Doe", - body: "Is it rainging today where you are?", - categoryId: "FRONTEND_NOTIF", - data: { - messageId: "msg-456", - senderId: "user-456", - timestamp: Date.now(), - } - }); - } -} - -Events.On('time', (time) => { - timeElement.innerText = time.data; -}); - -Events.On("notification", (data) => { - nofitications.set(data.identifier, data); - notificationsElement.innerText = Array.from(nofitications.values()).map(notification => JSON.stringify(notification)).join(", "); -}); \ No newline at end of file diff --git a/v3/examples/notifications/frontend/package.json b/v3/examples/notifications/frontend/package.json deleted file mode 100644 index 9ae87549e..000000000 --- a/v3/examples/notifications/frontend/package.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "frontend", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "dev": "vite", - "build:dev": "vite build --minify false --mode development", - "build": "vite build --mode production", - "preview": "vite preview" - }, - "devDependencies": { - "vite": "^5.0.0", - "@wailsio/runtime": "latest" - } -} \ No newline at end of file diff --git a/v3/examples/notifications/frontend/public/Inter-Medium.ttf b/v3/examples/notifications/frontend/public/Inter-Medium.ttf deleted file mode 100644 index a01f3777a6fc284b7a720c0f8248a27066389ef9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 315132 zcmd>{3Ajzw|M0(S?X!n-?sds<&AMdHJY`De%rlit*Gxz*k|ZQaMWm8sCL|H5Orgje zLX;sYN}^G@hWmcjK4)L_tKaY+-sgFr_ul8T*4k_QuJ8KpwfA0opS?wiNG6<+$lZ18 z)h}DV>>3eWoroNFw`kt_=)7a6M2)O0s^ph46$l{1e>k6gWyQwEyWNY9Gz_3HOX&vyAf z)S{Q>5MAJ8?;gqBOFo}`FX>%Kuhg4}e4BH=#y0Xu!QTA`56g7y>@Ol2dy5p=(eJ@- z$>AZbE{NPwf$hEhlZOqA#4CsVv?oaelKb~){O#aW5vPqvIP<^B5&SN zzrXqG{ycsElt;op`!QDN*v#5b&hDJC`frju&adR?&uep=z_GS14*mY-l@WRR#%E^J z5gn_;)b6n*lGS$$ihj6P@4+ggNJ_r}gHSL1OfsF!hHQL}O9s)M+nsb6q^Qx|dn(6vPA zI=TUFBi#nKoleH>rm-LWq<#hWRsAaNOuY_wquz}Bk=}y4L+`}htv|#4+^Q|gs%JIC zZDKuyJJ=e6`-n9Tcf7Rn$I0&?vs26| zhFiiZfm_XC?3_kUBivR_Pu$*4Z`=o*2XF^C18^U9hKc1o;ygllxHE$A80QJxxz0jS zuIEyxThJ|tTgUBy+u7}m`?&iA?o;klxKF!J<38g~!kywy!JX<(#hvD&2lrK%QFa%* zi*es@m*OsSm*cK3;-OD(xHp{e)}Vk zj}jgoW^}?YgkQj&9-fZ-es~?J8^W6i?+WiGygz&h_el5{?w4U|4u2c|7WaG@4Tpb< z&3F~`P%|^Jmxw&?#K*!)a@fDd!depS)3LB6rR?`&;m{3vY^h|U1HT@J_`b2QD{bt= zSlAQKPKbrWk`y{03&#=O6AQ=R5YC{ItYxwI1gT)5Z@>Ob60rux!na7g)jbx@d_A7& zF41ZhjaN$YSmk12Emid&v9Kle_1m#?vid~S~a&&R@fB%ch5h4XS)iH$F^BublD{H+{eYRAG!9CZrB!ugRWM=V@`kdUjN zBuh7WfLsk_FyVgEhwba}^<)_FgGi|@50cvbPdWcF{jc){v8|mem2h13VpUJrSMT9Ty>3?!}(7+ojH-SDu#-J4JfsYA$L->-WxHJI`PNg0eR zrk)%OnM*bDYd9+u%CMXc}>W)X;S;MZTi-o7KTVyUt%M{ zpqpyy=F2mb5@zI$)P2a=gfb8NwcIE}lbcEgd7JyvnwADob^xWW$D|N5?1t^0zAS_O zQtAi&vUMquf)xFc*ywzS->W{9Gc5#~G(9rbkmBnx1>HsEAMVR+MkEQ{8BLp>rLbir zGrCS9&XgYD_t!`p9oeqL4kG72YyWz`jLr6f!IZesh8y~=80{Nt9gJqGN@@O6kj9Lc zv5gcd1xCxI{5E@$-W-c)!v1aS(MVgL6eDkvv?kP((8K7#*oWzf$r0U;dyvc6hZ(zQ zpG@0PYchFTv)7wZyDs_ln$4cljk3`iN|37^TSfn*nUt7Tjja8l6mAc+*oxXs%n;lp+B0Ju?NN%a&mjNx zQA%QOYv@ZAwTBy1qIx#6N9RXVm)WNV`Ln4R6=O?*1lLQJyvZW|tkd#HTL!IG;ff$? zK_%HvmWsrckxH~t1`Xbrs}-Zz6sjSqu?f?oo7-qboY_;%TtDcBTuC=cQU@IjWS%m1 z7|f>SXw48EVPi4Z+enfY7y8oNVG@2$=8*Bb|Yth z#wE~FX<80?P)sDQpt&yPN^GUn|6ii|e_rpkJ?_f1l28#`I0oDP{d)d+`M8MGzY({b zoVDP42V>h{^2j=f$(R9Lo&d7Uiy12EF<#m^3% zk;mAc3tNaQ3?C4lt$)Av9sZ_hKH0z`#ŹD@)<7ltOtn$SSm;LMTrPEA?sR43d= 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�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 diff --git a/v3/examples/notifications/frontend/public/javascript.svg b/v3/examples/notifications/frontend/public/javascript.svg deleted file mode 100644 index f9abb2b72..000000000 --- a/v3/examples/notifications/frontend/public/javascript.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/v3/examples/notifications/frontend/public/style.css b/v3/examples/notifications/frontend/public/style.css deleted file mode 100644 index 127799eda..000000000 --- a/v3/examples/notifications/frontend/public/style.css +++ /dev/null @@ -1,160 +0,0 @@ -:root { - font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", - "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", - sans-serif; - font-size: 16px; - line-height: 24px; - font-weight: 400; - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - background-color: rgba(27, 38, 54, 1); - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -webkit-text-size-adjust: 100%; -} - -* { - user-select: none; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; -} - -@font-face { - font-family: "Inter"; - font-style: normal; - font-weight: 400; - src: local(""), - url("./Inter-Medium.ttf") format("truetype"); -} - -h3 { - font-size: 3em; - line-height: 1.1; -} - -a { - font-weight: 500; - color: #646cff; - text-decoration: inherit; -} - -a:hover { - color: #535bf2; -} - -button { - /* width: 60px; */ - height: 30px; - line-height: 30px; - border-radius: 3px; - border: none; - margin: 0 0 0 20px; - padding: 0 8px; - cursor: pointer; -} - -.result { - height: 20px; - line-height: 20px; -} - -body { - margin: 0; - display: flex; - place-items: center; - place-content: center; - min-width: 320px; - min-height: 100vh; -} - -.container { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; -} - -h1 { - font-size: 3.2em; - line-height: 1.1; -} - -#app { - max-width: 1280px; - margin: 0 auto; - padding: 2rem; - text-align: center; -} - -.logo { - height: 6em; - padding: 1.5em; - will-change: filter; -} - -.logo:hover { - filter: drop-shadow(0 0 2em #e80000aa); -} - -.logo.vanilla:hover { - filter: drop-shadow(0 0 2em #f7df1eaa); -} - -.result { - height: 20px; - line-height: 20px; - margin: 1.5rem auto; - text-align: center; -} - -.footer { - margin-top: 1rem; - align-content: center; - text-align: center; -} - -@media (prefers-color-scheme: light) { - :root { - color: #213547; - background-color: #ffffff; - } - - a:hover { - color: #747bff; - } - - button { - background-color: #f9f9f9; - } -} - - -.input-box .btn:hover { - background-image: linear-gradient(to top, #cfd9df 0%, #e2ebf0 100%); - color: #333333; -} - -.input-box .input { - border: none; - border-radius: 3px; - outline: none; - height: 30px; - line-height: 30px; - padding: 0 10px; - color: black; - background-color: rgba(240, 240, 240, 1); - -webkit-font-smoothing: antialiased; -} - -.input-box .input:hover { - border: none; - background-color: rgba(255, 255, 255, 1); -} - -.input-box .input:focus { - border: none; - background-color: rgba(255, 255, 255, 1); -} \ No newline at end of file diff --git a/v3/examples/notifications/frontend/public/wails.png b/v3/examples/notifications/frontend/public/wails.png deleted file mode 100644 index 8bdf424833bfb5b6b34a0807224e94533f738f2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9057 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 & { cancel(): void }} + */ +export function CheckNotificationAuthorization() { + let $resultPromise = /** @type {any} */($Call.ByID(2789931702)); + return $resultPromise; +} + +/** + * RegisterNotificationCategory registers a category with actions and optional reply field + * @param {$models.NotificationCategory} category + * @returns {Promise & { cancel(): void }} + */ +export function RegisterNotificationCategory(category) { + let $resultPromise = /** @type {any} */($Call.ByID(2679064664, category)); + return $resultPromise; +} + +/** + * @returns {Promise & { cancel(): void }} + */ +export function RemoveAllDeliveredNotifications() { + let $resultPromise = /** @type {any} */($Call.ByID(384520397)); + return $resultPromise; +} + +/** + * RemoveAllPendingNotifications removes all pending notifications + * @returns {Promise & { cancel(): void }} + */ +export function RemoveAllPendingNotifications() { + let $resultPromise = /** @type {any} */($Call.ByID(1423986276)); + return $resultPromise; +} + +/** + * @param {string} identifier + * @returns {Promise & { cancel(): void }} + */ +export function RemoveDeliveredNotification(identifier) { + let $resultPromise = /** @type {any} */($Call.ByID(149440045, identifier)); + return $resultPromise; +} + +/** + * RemovePendingNotification removes a specific pending notification + * @param {string} identifier + * @returns {Promise & { cancel(): void }} + */ +export function RemovePendingNotification(identifier) { + let $resultPromise = /** @type {any} */($Call.ByID(3872412470, identifier)); + return $resultPromise; +} + +/** + * RequestUserNotificationAuthorization requests permission for notifications. + * @returns {Promise & { cancel(): void }} + */ +export function RequestUserNotificationAuthorization() { + let $resultPromise = /** @type {any} */($Call.ByID(3412125712)); + return $resultPromise; +} + +/** + * SendNotification sends a notification with the given identifier, title, subtitle, and body. + * @param {string} identifier + * @param {string} title + * @param {string} subtitle + * @param {string} body + * @returns {Promise & { cancel(): void }} + */ +export function SendNotification(identifier, title, subtitle, body) { + let $resultPromise = /** @type {any} */($Call.ByID(2246903123, identifier, title, subtitle, body)); + return $resultPromise; +} + +/** + * SendNotificationWithActions sends a notification with the specified actions + * @param {$models.NotificationOptions} options + * @returns {Promise & { cancel(): void }} + */ +export function SendNotificationWithActions(options) { + let $resultPromise = /** @type {any} */($Call.ByID(1615199806, options)); + return $resultPromise; +} diff --git a/v3/examples/services/assets/index.html b/v3/examples/services/assets/index.html index 67746fdec..24a372593 100644 --- a/v3/examples/services/assets/index.html +++ b/v3/examples/services/assets/index.html @@ -10,6 +10,13 @@ import * as kvstore from './bindings/github.com/wailsapp/wails/v3/pkg/services/kvstore/keyvaluestore.js'; import {Debug, Info, Warning, Error} from './bindings/github.com/wailsapp/wails/v3/pkg/services/log/loggerservice.js'; import * as hash from './bindings/github.com/wailsapp/wails/v3/examples/services/hashes/service.js'; + import * as notifications from "./bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/service.js" + + notifications.RequestUserNotificationAuthorization().then((granted) => { + if (granted) { + notifications.SendNotification("some-uuid-fronted", "Frontend Notificaiton", "", "Notificaiton sent through JS!"); + } + }); function runHash() { let hashstring = document.getElementById("hashstring").value; diff --git a/v3/examples/services/main.go b/v3/examples/services/main.go index a4ebb6bf4..6bc020c8a 100644 --- a/v3/examples/services/main.go +++ b/v3/examples/services/main.go @@ -2,16 +2,18 @@ package main import ( "embed" + "log/slog" + "os" + "path/filepath" + "runtime" + "github.com/wailsapp/wails/v3/examples/services/hashes" "github.com/wailsapp/wails/v3/pkg/application" "github.com/wailsapp/wails/v3/pkg/services/fileserver" "github.com/wailsapp/wails/v3/pkg/services/kvstore" "github.com/wailsapp/wails/v3/pkg/services/log" + "github.com/wailsapp/wails/v3/pkg/services/notifications" "github.com/wailsapp/wails/v3/pkg/services/sqlite" - "log/slog" - "os" - "path/filepath" - "runtime" ) //go:embed assets/* @@ -48,6 +50,7 @@ func main() { }), application.ServiceOptions{ Route: "/files", }), + application.NewService(notifications.New()), }, Assets: application.AssetOptions{ Handler: application.BundledAssetFileServer(assets), diff --git a/v3/pkg/application/notifications_darwin.go b/v3/pkg/application/notifications_darwin.go deleted file mode 100644 index e04075238..000000000 --- a/v3/pkg/application/notifications_darwin.go +++ /dev/null @@ -1,177 +0,0 @@ -//go:build darwin - -package application - -/* -#cgo CFLAGS: -mmacosx-version-min=10.14 -x objective-c -#cgo LDFLAGS: -framework Cocoa -mmacosx-version-min=10.14 -framework UserNotifications -#import "notifications_darwin.h" -*/ -import "C" -import ( - "encoding/json" - "fmt" - "unsafe" -) - -// NotificationAction represents a button in a notification -type NotificationAction struct { - ID string `json:"id"` - Title string `json:"title"` - Destructive bool `json:"destructive,omitempty"` - AuthenticationRequired bool `json:"authenticationRequired,omitempty"` -} - -// NotificationCategory groups actions for notifications -type NotificationCategory struct { - ID string `json:"id"` - Actions []NotificationAction `json:"actions"` - HasReplyField bool `json:"hasReplyField,omitempty"` - ReplyPlaceholder string `json:"replyPlaceholder,omitempty"` - ReplyButtonTitle string `json:"replyButtonTitle,omitempty"` -} - -// NotificationOptions contains configuration for a notification -type NotificationOptions struct { - ID string `json:"id"` - Title string `json:"title"` - Subtitle string `json:"subtitle,omitempty"` - Body string `json:"body"` - CategoryID string `json:"categoryId,omitempty"` - Data map[string]interface{} `json:"data,omitempty"` -} - -// Check if the app has a valid bundle identifier -func CheckBundleIdentifier() bool { - return bool(C.checkBundleIdentifier()) -} - -// RequestUserNotificationAuthorization requests permission for notifications. -func RequestUserNotificationAuthorization() (bool, error) { - if !CheckBundleIdentifier() { - return false, fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") - } - result := C.requestUserNotificationAuthorization(nil) - return result == true, nil -} - -// CheckNotificationAuthorization checks current permission status -func CheckNotificationAuthorization() (bool, error) { - if !CheckBundleIdentifier() { - return false, fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") - } - return bool(C.checkNotificationAuthorization()), nil -} - -// SendNotification sends a notification with the given identifier, title, subtitle, and body. -func SendNotification(identifier, title, subtitle, body string) error { - if !CheckBundleIdentifier() { - return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") - } - cIdentifier := C.CString(identifier) - cTitle := C.CString(title) - cSubtitle := C.CString(subtitle) - cBody := C.CString(body) - defer C.free(unsafe.Pointer(cIdentifier)) - defer C.free(unsafe.Pointer(cTitle)) - defer C.free(unsafe.Pointer(cSubtitle)) - defer C.free(unsafe.Pointer(cBody)) - - C.sendNotification(cIdentifier, cTitle, cSubtitle, cBody, nil) - return nil -} - -// SendNotificationWithActions sends a notification with the specified actions -func SendNotificationWithActions(options NotificationOptions) error { - if !CheckBundleIdentifier() { - return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") - } - cIdentifier := C.CString(options.ID) - cTitle := C.CString(options.Title) - cSubtitle := C.CString(options.Subtitle) - cBody := C.CString(options.Body) - cCategoryID := C.CString(options.CategoryID) - defer C.free(unsafe.Pointer(cIdentifier)) - defer C.free(unsafe.Pointer(cTitle)) - defer C.free(unsafe.Pointer(cSubtitle)) - defer C.free(unsafe.Pointer(cBody)) - defer C.free(unsafe.Pointer(cCategoryID)) - - var cActionsJSON *C.char - if options.Data != nil { - jsonData, err := json.Marshal(options.Data) - if err == nil { - cActionsJSON = C.CString(string(jsonData)) - defer C.free(unsafe.Pointer(cActionsJSON)) - } - } - - C.sendNotificationWithActions(cIdentifier, cTitle, cSubtitle, cBody, cCategoryID, cActionsJSON, nil) - return nil -} - -// RegisterNotificationCategory registers a category with actions and optional reply field -func RegisterNotificationCategory(category NotificationCategory) error { - if !CheckBundleIdentifier() { - return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") - } - cCategoryID := C.CString(category.ID) - defer C.free(unsafe.Pointer(cCategoryID)) - - actionsJSON, err := json.Marshal(category.Actions) - if err != nil { - return err - } - cActionsJSON := C.CString(string(actionsJSON)) - defer C.free(unsafe.Pointer(cActionsJSON)) - - var cReplyPlaceholder, cReplyButtonTitle *C.char - if category.HasReplyField { - cReplyPlaceholder = C.CString(category.ReplyPlaceholder) - cReplyButtonTitle = C.CString(category.ReplyButtonTitle) - defer C.free(unsafe.Pointer(cReplyPlaceholder)) - defer C.free(unsafe.Pointer(cReplyButtonTitle)) - } - - C.registerNotificationCategory(cCategoryID, cActionsJSON, C.bool(category.HasReplyField), - cReplyPlaceholder, cReplyButtonTitle) - return nil -} - -// RemoveAllPendingNotifications removes all pending notifications -func RemoveAllPendingNotifications() error { - if !CheckBundleIdentifier() { - return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") - } - C.removeAllPendingNotifications() - return nil -} - -// RemovePendingNotification removes a specific pending notification -func RemovePendingNotification(identifier string) error { - if !CheckBundleIdentifier() { - return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") - } - cIdentifier := C.CString(identifier) - defer C.free(unsafe.Pointer(cIdentifier)) - C.removePendingNotification(cIdentifier) - return nil -} - -func RemoveAllDeliveredNotifications() error { - if !CheckBundleIdentifier() { - return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") - } - C.removeAllDeliveredNotifications() - return nil -} - -func RemoveDeliveredNotification(identifier string) error { - if !CheckBundleIdentifier() { - return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") - } - cIdentifier := C.CString(identifier) - defer C.free(unsafe.Pointer(cIdentifier)) - C.removeDeliveredNotification(cIdentifier) - return nil -} diff --git a/v3/pkg/services/notification/notification.go b/v3/pkg/services/notifications/notifications.go similarity index 83% rename from v3/pkg/services/notification/notification.go rename to v3/pkg/services/notifications/notifications.go index 987e4d438..8f700daf5 100644 --- a/v3/pkg/services/notification/notification.go +++ b/v3/pkg/services/notifications/notifications.go @@ -1,11 +1,11 @@ //go:build darwin -package notification +package notifications /* #cgo CFLAGS: -mmacosx-version-min=10.14 -x objective-c #cgo LDFLAGS: -framework Cocoa -mmacosx-version-min=10.14 -framework UserNotifications -#import "../../application/notifications_darwin.h" +#import "./notifications_darwin.h" */ import "C" import ( @@ -17,11 +17,11 @@ import ( "github.com/wailsapp/wails/v3/pkg/application" ) -type NotificationService struct { +type Service struct { } // NotificationAction represents an action button for a notification -type NotificationAction struct { +type NotificationAction = struct { ID string `json:"id"` Title string `json:"title"` Destructive bool `json:"destructive,omitempty"` @@ -29,7 +29,7 @@ type NotificationAction struct { } // NotificationCategory groups actions for notifications -type NotificationCategory struct { +type NotificationCategory = struct { ID string `json:"id"` Actions []NotificationAction `json:"actions"` HasReplyField bool `json:"hasReplyField,omitempty"` @@ -38,7 +38,7 @@ type NotificationCategory struct { } // NotificationOptions contains configuration for a notification -type NotificationOptions struct { +type NotificationOptions = struct { ID string `json:"id"` Title string `json:"title"` Subtitle string `json:"subtitle,omitempty"` @@ -47,17 +47,21 @@ type NotificationOptions struct { Data map[string]interface{} `json:"data,omitempty"` } +func New() *Service { + return &Service{} +} + func CheckBundleIdentifier() bool { return bool(C.checkBundleIdentifier()) } // ServiceName returns the name of the service -func (ns *NotificationService) ServiceName() string { +func (ns *Service) ServiceName() string { return "github.com/wailsapp/wails/v3/services/notifications" } // ServiceStartup is called when the service is loaded -func (ns *NotificationService) ServiceStartup(ctx context.Context, options application.ServiceOptions) error { +func (ns *Service) ServiceStartup(ctx context.Context, options application.ServiceOptions) error { if !CheckBundleIdentifier() { return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") } @@ -65,12 +69,12 @@ func (ns *NotificationService) ServiceStartup(ctx context.Context, options appli } // ServiceShutdown is called when the service is unloaded -func (ns *NotificationService) ServiceShutdown() error { +func (ns *Service) ServiceShutdown() error { return nil } // RequestUserNotificationAuthorization requests permission for notifications. -func (ns *NotificationService) RequestUserNotificationAuthorization() (bool, error) { +func (ns *Service) RequestUserNotificationAuthorization() (bool, error) { if !CheckBundleIdentifier() { return false, fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") } @@ -79,7 +83,7 @@ func (ns *NotificationService) RequestUserNotificationAuthorization() (bool, err } // CheckNotificationAuthorization checks current permission status -func (ns *NotificationService) CheckNotificationAuthorization() (bool, error) { +func (ns *Service) CheckNotificationAuthorization() (bool, error) { if !CheckBundleIdentifier() { return false, fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") } @@ -87,7 +91,7 @@ func (ns *NotificationService) CheckNotificationAuthorization() (bool, error) { } // SendNotification sends a notification with the given identifier, title, subtitle, and body. -func (ns *NotificationService) SendNotification(identifier, title, subtitle, body string) error { +func (ns *Service) SendNotification(identifier, title, subtitle, body string) error { if !CheckBundleIdentifier() { return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") } @@ -105,7 +109,7 @@ func (ns *NotificationService) SendNotification(identifier, title, subtitle, bod } // SendNotificationWithActions sends a notification with the specified actions -func (ns *NotificationService) SendNotificationWithActions(options NotificationOptions) error { +func (ns *Service) SendNotificationWithActions(options NotificationOptions) error { if !CheckBundleIdentifier() { return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") } @@ -134,7 +138,7 @@ func (ns *NotificationService) SendNotificationWithActions(options NotificationO } // RegisterNotificationCategory registers a category with actions and optional reply field -func (ns *NotificationService) RegisterNotificationCategory(category NotificationCategory) error { +func (ns *Service) RegisterNotificationCategory(category NotificationCategory) error { if !CheckBundleIdentifier() { return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") } @@ -162,7 +166,7 @@ func (ns *NotificationService) RegisterNotificationCategory(category Notificatio } // RemoveAllPendingNotifications removes all pending notifications -func (ns *NotificationService) RemoveAllPendingNotifications() error { +func (ns *Service) RemoveAllPendingNotifications() error { if !CheckBundleIdentifier() { return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") } @@ -171,7 +175,7 @@ func (ns *NotificationService) RemoveAllPendingNotifications() error { } // RemovePendingNotification removes a specific pending notification -func (ns *NotificationService) RemovePendingNotification(identifier string) error { +func (ns *Service) RemovePendingNotification(identifier string) error { if !CheckBundleIdentifier() { return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") } @@ -181,7 +185,7 @@ func (ns *NotificationService) RemovePendingNotification(identifier string) erro return nil } -func (ns *NotificationService) RemoveAllDeliveredNotifications() error { +func (ns *Service) RemoveAllDeliveredNotifications() error { if !CheckBundleIdentifier() { return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") } @@ -189,7 +193,7 @@ func (ns *NotificationService) RemoveAllDeliveredNotifications() error { return nil } -func (ns *NotificationService) RemoveDeliveredNotification(identifier string) error { +func (ns *Service) RemoveDeliveredNotification(identifier string) error { if !CheckBundleIdentifier() { return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") } diff --git a/v3/pkg/application/notifications_darwin.h b/v3/pkg/services/notifications/notifications_darwin.h similarity index 100% rename from v3/pkg/application/notifications_darwin.h rename to v3/pkg/services/notifications/notifications_darwin.h diff --git a/v3/pkg/application/notifications_darwin.m b/v3/pkg/services/notifications/notifications_darwin.m similarity index 99% rename from v3/pkg/application/notifications_darwin.m rename to v3/pkg/services/notifications/notifications_darwin.m index 7c0a1cade..f4e9b1404 100644 --- a/v3/pkg/application/notifications_darwin.m +++ b/v3/pkg/services/notifications/notifications_darwin.m @@ -1,7 +1,7 @@ #import "notifications_darwin.h" #import #import -#import "../events/events_darwin.h" +#import "../../events/events_darwin.h" extern bool hasListeners(unsigned int); extern void processApplicationEvent(unsigned int, void* data); From 91f1704f6874afb00c75a2a0fc325e9d124e31cd Mon Sep 17 00:00:00 2001 From: popaprozac Date: Sat, 22 Feb 2025 01:11:44 -0800 Subject: [PATCH 019/374] cleanup --- v3/pkg/services/notifications/notifications_darwin.h | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/v3/pkg/services/notifications/notifications_darwin.h b/v3/pkg/services/notifications/notifications_darwin.h index 4014b9a1c..fb21d4cb0 100644 --- a/v3/pkg/services/notifications/notifications_darwin.h +++ b/v3/pkg/services/notifications/notifications_darwin.h @@ -5,16 +5,10 @@ #import -#ifdef __cplusplus -extern "C" { -#endif - bool checkBundleIdentifier(void); bool requestUserNotificationAuthorization(void *completion); bool checkNotificationAuthorization(void); void sendNotification(const char *identifier, const char *title, const char *subtitle, const char *body, void *completion); - -// New advanced notification functions void sendNotificationWithActions(const char *identifier, const char *title, const char *subtitle, const char *body, const char *categoryId, const char *actions_json, void *completion); void registerNotificationCategory(const char *categoryId, const char *actions_json, bool hasReplyField, @@ -24,8 +18,4 @@ void removePendingNotification(const char *identifier); void removeAllDeliveredNotifications(void); void removeDeliveredNotification(const char *identifier); -#ifdef __cplusplus -} -#endif - #endif /* NOTIFICATIONS_DARWIN_H */ \ No newline at end of file From 01fa3071f1bab414de2fc43638114e2bc019bfd3 Mon Sep 17 00:00:00 2001 From: Zach Botterman Date: Sat, 22 Feb 2025 17:30:04 -0800 Subject: [PATCH 020/374] windows impl --- v3/go.mod | 1 + v3/go.sum | 2 + .../services/notifications/notifications.go | 181 ++---------------- .../notifications/notifications_darwin.go | 176 +++++++++++++++++ .../notifications/notifications_darwin.m | 4 + .../notifications/notifications_windows.go | 150 +++++++++++++++ 6 files changed, 345 insertions(+), 169 deletions(-) create mode 100644 v3/pkg/services/notifications/notifications_darwin.go create mode 100644 v3/pkg/services/notifications/notifications_windows.go diff --git a/v3/go.mod b/v3/go.mod index 3067f25ff..fd4383baa 100644 --- a/v3/go.mod +++ b/v3/go.mod @@ -3,6 +3,7 @@ module github.com/wailsapp/wails/v3 go 1.24.0 require ( + git.sr.ht/~jackmordaunt/go-toast v1.1.2 github.com/Masterminds/semver v1.5.0 github.com/adrg/xdg v0.5.3 github.com/atterpac/refresh v0.8.4 diff --git a/v3/go.sum b/v3/go.sum index 672302267..faf9d7aff 100644 --- a/v3/go.sum +++ b/v3/go.sum @@ -8,6 +8,8 @@ atomicgo.dev/schedule v0.1.0 h1:nTthAbhZS5YZmgYbb2+DH8uQIZcTlIrd4eYr3UQxEjs= atomicgo.dev/schedule v0.1.0/go.mod h1:xeUa3oAkiuHYh8bKiQBRojqAMq3PXXbJujjb0hw8pEU= dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s= dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= +git.sr.ht/~jackmordaunt/go-toast v1.1.2 h1:/yrfI55LRt1M7H1vkaw+NaH1+L1CDxrqDltwm5euVuE= +git.sr.ht/~jackmordaunt/go-toast v1.1.2/go.mod h1:jA4OqHKTQ4AFBdwrSnwnskUIIS3HYzlJSgdzCKqfavo= github.com/AlekSi/pointer v1.2.0 h1:glcy/gc4h8HnG2Z3ZECSzZ1IX1x2JxRVuDzaJwQE0+w= github.com/AlekSi/pointer v1.2.0/go.mod h1:gZGfd3dpW4vEc/UlyfKKi1roIqcCgwOIvb0tSNSBle0= github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= diff --git a/v3/pkg/services/notifications/notifications.go b/v3/pkg/services/notifications/notifications.go index 8f700daf5..5e0ea6910 100644 --- a/v3/pkg/services/notifications/notifications.go +++ b/v3/pkg/services/notifications/notifications.go @@ -1,22 +1,5 @@ -//go:build darwin - package notifications -/* -#cgo CFLAGS: -mmacosx-version-min=10.14 -x objective-c -#cgo LDFLAGS: -framework Cocoa -mmacosx-version-min=10.14 -framework UserNotifications -#import "./notifications_darwin.h" -*/ -import "C" -import ( - "context" - "encoding/json" - "fmt" - "unsafe" - - "github.com/wailsapp/wails/v3/pkg/application" -) - type Service struct { } @@ -47,158 +30,18 @@ type NotificationOptions = struct { Data map[string]interface{} `json:"data,omitempty"` } -func New() *Service { - return &Service{} +type NotificationResponseData = struct { + ID string `json:"id,omitempty"` + ActionIdentifier string `json:"actionIdentifier,omitempty"` + CategoryID string `json:"categoryIdentifier,omitempty"` + Title string `json:"title,omitempty"` + Subtitle string `json:"subtitle,omitempty"` + Body string `json:"body,omitempty"` + UserText string `json:"userText,omitempty"` + UserInfo map[string]interface{} `json:"userInfo,omitempty"` } -func CheckBundleIdentifier() bool { - return bool(C.checkBundleIdentifier()) -} - -// ServiceName returns the name of the service -func (ns *Service) ServiceName() string { - return "github.com/wailsapp/wails/v3/services/notifications" -} - -// ServiceStartup is called when the service is loaded -func (ns *Service) ServiceStartup(ctx context.Context, options application.ServiceOptions) error { - if !CheckBundleIdentifier() { - return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") - } - return nil -} - -// ServiceShutdown is called when the service is unloaded -func (ns *Service) ServiceShutdown() error { - return nil -} - -// RequestUserNotificationAuthorization requests permission for notifications. -func (ns *Service) RequestUserNotificationAuthorization() (bool, error) { - if !CheckBundleIdentifier() { - return false, fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") - } - result := C.requestUserNotificationAuthorization(nil) - return result == true, nil -} - -// CheckNotificationAuthorization checks current permission status -func (ns *Service) CheckNotificationAuthorization() (bool, error) { - if !CheckBundleIdentifier() { - return false, fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") - } - return bool(C.checkNotificationAuthorization()), nil -} - -// SendNotification sends a notification with the given identifier, title, subtitle, and body. -func (ns *Service) SendNotification(identifier, title, subtitle, body string) error { - if !CheckBundleIdentifier() { - return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") - } - cIdentifier := C.CString(identifier) - cTitle := C.CString(title) - cSubtitle := C.CString(subtitle) - cBody := C.CString(body) - defer C.free(unsafe.Pointer(cIdentifier)) - defer C.free(unsafe.Pointer(cTitle)) - defer C.free(unsafe.Pointer(cSubtitle)) - defer C.free(unsafe.Pointer(cBody)) - - C.sendNotification(cIdentifier, cTitle, cSubtitle, cBody, nil) - return nil -} - -// SendNotificationWithActions sends a notification with the specified actions -func (ns *Service) SendNotificationWithActions(options NotificationOptions) error { - if !CheckBundleIdentifier() { - return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") - } - cIdentifier := C.CString(options.ID) - cTitle := C.CString(options.Title) - cSubtitle := C.CString(options.Subtitle) - cBody := C.CString(options.Body) - cCategoryID := C.CString(options.CategoryID) - defer C.free(unsafe.Pointer(cIdentifier)) - defer C.free(unsafe.Pointer(cTitle)) - defer C.free(unsafe.Pointer(cSubtitle)) - defer C.free(unsafe.Pointer(cBody)) - defer C.free(unsafe.Pointer(cCategoryID)) - - var cActionsJSON *C.char - if options.Data != nil { - jsonData, err := json.Marshal(options.Data) - if err == nil { - cActionsJSON = C.CString(string(jsonData)) - defer C.free(unsafe.Pointer(cActionsJSON)) - } - } - - C.sendNotificationWithActions(cIdentifier, cTitle, cSubtitle, cBody, cCategoryID, cActionsJSON, nil) - return nil -} - -// RegisterNotificationCategory registers a category with actions and optional reply field -func (ns *Service) RegisterNotificationCategory(category NotificationCategory) error { - if !CheckBundleIdentifier() { - return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") - } - cCategoryID := C.CString(category.ID) - defer C.free(unsafe.Pointer(cCategoryID)) - - actionsJSON, err := json.Marshal(category.Actions) - if err != nil { - return err - } - cActionsJSON := C.CString(string(actionsJSON)) - defer C.free(unsafe.Pointer(cActionsJSON)) - - var cReplyPlaceholder, cReplyButtonTitle *C.char - if category.HasReplyField { - cReplyPlaceholder = C.CString(category.ReplyPlaceholder) - cReplyButtonTitle = C.CString(category.ReplyButtonTitle) - defer C.free(unsafe.Pointer(cReplyPlaceholder)) - defer C.free(unsafe.Pointer(cReplyButtonTitle)) - } - - C.registerNotificationCategory(cCategoryID, cActionsJSON, C.bool(category.HasReplyField), - cReplyPlaceholder, cReplyButtonTitle) - return nil -} - -// RemoveAllPendingNotifications removes all pending notifications -func (ns *Service) RemoveAllPendingNotifications() error { - if !CheckBundleIdentifier() { - return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") - } - C.removeAllPendingNotifications() - return nil -} - -// RemovePendingNotification removes a specific pending notification -func (ns *Service) RemovePendingNotification(identifier string) error { - if !CheckBundleIdentifier() { - return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") - } - cIdentifier := C.CString(identifier) - defer C.free(unsafe.Pointer(cIdentifier)) - C.removePendingNotification(cIdentifier) - return nil -} - -func (ns *Service) RemoveAllDeliveredNotifications() error { - if !CheckBundleIdentifier() { - return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") - } - C.removeAllDeliveredNotifications() - return nil -} - -func (ns *Service) RemoveDeliveredNotification(identifier string) error { - if !CheckBundleIdentifier() { - return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") - } - cIdentifier := C.CString(identifier) - defer C.free(unsafe.Pointer(cIdentifier)) - C.removeDeliveredNotification(cIdentifier) - return nil +type NotificationResponse = struct { + Name string `json:"name"` + Data NotificationResponseData `json:"data"` } diff --git a/v3/pkg/services/notifications/notifications_darwin.go b/v3/pkg/services/notifications/notifications_darwin.go new file mode 100644 index 000000000..5fc72b235 --- /dev/null +++ b/v3/pkg/services/notifications/notifications_darwin.go @@ -0,0 +1,176 @@ +//go:build darwin + +package notifications + +/* +#cgo CFLAGS: -mmacosx-version-min=10.14 -x objective-c +#cgo LDFLAGS: -framework Cocoa -mmacosx-version-min=10.14 -framework UserNotifications +#import "./notifications_darwin.h" +*/ +import "C" +import ( + "context" + "encoding/json" + "fmt" + "unsafe" + + "github.com/wailsapp/wails/v3/pkg/application" +) + +func New() *Service { + return &Service{} +} + +// ServiceName returns the name of the service +func (ns *Service) ServiceName() string { + return "github.com/wailsapp/wails/v3/services/notifications" +} + +// ServiceStartup is called when the service is loaded +func (ns *Service) ServiceStartup(ctx context.Context, options application.ServiceOptions) error { + if !CheckBundleIdentifier() { + return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") + } + return nil +} + +// ServiceShutdown is called when the service is unloaded +func (ns *Service) ServiceShutdown() error { + return nil +} + +func CheckBundleIdentifier() bool { + return bool(C.checkBundleIdentifier()) +} + +// RequestUserNotificationAuthorization requests permission for notifications. +func (ns *Service) RequestUserNotificationAuthorization() (bool, error) { + if !CheckBundleIdentifier() { + return false, fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") + } + result := C.requestUserNotificationAuthorization(nil) + return result == true, nil +} + +// CheckNotificationAuthorization checks current permission status +func (ns *Service) CheckNotificationAuthorization() (bool, error) { + if !CheckBundleIdentifier() { + return false, fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") + } + return bool(C.checkNotificationAuthorization()), nil +} + +// SendNotification sends a notification with the given identifier, title, subtitle, and body. +func (ns *Service) SendNotification(identifier, title, subtitle, body string) error { + if !CheckBundleIdentifier() { + return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") + } + cIdentifier := C.CString(identifier) + cTitle := C.CString(title) + cSubtitle := C.CString(subtitle) + cBody := C.CString(body) + defer C.free(unsafe.Pointer(cIdentifier)) + defer C.free(unsafe.Pointer(cTitle)) + defer C.free(unsafe.Pointer(cSubtitle)) + defer C.free(unsafe.Pointer(cBody)) + + C.sendNotification(cIdentifier, cTitle, cSubtitle, cBody, nil) + return nil +} + +// SendNotificationWithActions sends a notification with the specified actions +func (ns *Service) SendNotificationWithActions(options NotificationOptions) error { + if !CheckBundleIdentifier() { + return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") + } + cIdentifier := C.CString(options.ID) + cTitle := C.CString(options.Title) + cSubtitle := C.CString(options.Subtitle) + cBody := C.CString(options.Body) + cCategoryID := C.CString(options.CategoryID) + defer C.free(unsafe.Pointer(cIdentifier)) + defer C.free(unsafe.Pointer(cTitle)) + defer C.free(unsafe.Pointer(cSubtitle)) + defer C.free(unsafe.Pointer(cBody)) + defer C.free(unsafe.Pointer(cCategoryID)) + + var cActionsJSON *C.char + if options.Data != nil { + jsonData, err := json.Marshal(options.Data) + if err == nil { + cActionsJSON = C.CString(string(jsonData)) + defer C.free(unsafe.Pointer(cActionsJSON)) + } + } + + C.sendNotificationWithActions(cIdentifier, cTitle, cSubtitle, cBody, cCategoryID, cActionsJSON, nil) + return nil +} + +// RegisterNotificationCategory registers a category with actions and optional reply field +func (ns *Service) RegisterNotificationCategory(category NotificationCategory) error { + if !CheckBundleIdentifier() { + return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") + } + cCategoryID := C.CString(category.ID) + defer C.free(unsafe.Pointer(cCategoryID)) + + actionsJSON, err := json.Marshal(category.Actions) + if err != nil { + return err + } + cActionsJSON := C.CString(string(actionsJSON)) + defer C.free(unsafe.Pointer(cActionsJSON)) + + var cReplyPlaceholder, cReplyButtonTitle *C.char + if category.HasReplyField { + cReplyPlaceholder = C.CString(category.ReplyPlaceholder) + cReplyButtonTitle = C.CString(category.ReplyButtonTitle) + defer C.free(unsafe.Pointer(cReplyPlaceholder)) + defer C.free(unsafe.Pointer(cReplyButtonTitle)) + } + + C.registerNotificationCategory(cCategoryID, cActionsJSON, C.bool(category.HasReplyField), + cReplyPlaceholder, cReplyButtonTitle) + return nil +} + +// RemoveAllPendingNotifications removes all pending notifications +func (ns *Service) RemoveAllPendingNotifications() error { + if !CheckBundleIdentifier() { + return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") + } + C.removeAllPendingNotifications() + return nil +} + +// RemovePendingNotification removes a specific pending notification +func (ns *Service) RemovePendingNotification(identifier string) error { + if !CheckBundleIdentifier() { + return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") + } + cIdentifier := C.CString(identifier) + defer C.free(unsafe.Pointer(cIdentifier)) + C.removePendingNotification(cIdentifier) + return nil +} + +// RemoveAllDeliveredNotifications removes all delivered notifications +func (ns *Service) RemoveAllDeliveredNotifications() error { + if !CheckBundleIdentifier() { + return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") + } + C.removeAllDeliveredNotifications() + return nil +} + +// RemoveDeliveredNotification removes a specific delivered notification +func (ns *Service) RemoveDeliveredNotification(identifier string) error { + if !CheckBundleIdentifier() { + return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") + } + cIdentifier := C.CString(identifier) + defer C.free(unsafe.Pointer(cIdentifier)) + C.removeDeliveredNotification(cIdentifier) + return nil +} diff --git a/v3/pkg/services/notifications/notifications_darwin.m b/v3/pkg/services/notifications/notifications_darwin.m index f4e9b1404..f3eaec1a1 100644 --- a/v3/pkg/services/notifications/notifications_darwin.m +++ b/v3/pkg/services/notifications/notifications_darwin.m @@ -34,6 +34,10 @@ didReceiveNotificationResponse:(UNNotificationResponse *)response if (response.notification.request.content.categoryIdentifier) { [payload setObject:response.notification.request.content.categoryIdentifier forKey:@"categoryIdentifier"]; } + + if (response.notification.request.content.subtitle) { + [payload setObject:response.notification.request.content.subtitle forKey:@"subtitle"]; + } if (response.notification.request.content.userInfo) { [payload setObject:response.notification.request.content.userInfo forKey:@"userInfo"]; diff --git a/v3/pkg/services/notifications/notifications_windows.go b/v3/pkg/services/notifications/notifications_windows.go new file mode 100644 index 000000000..e942568d6 --- /dev/null +++ b/v3/pkg/services/notifications/notifications_windows.go @@ -0,0 +1,150 @@ +//go:build windows + +package notifications + +import ( + "context" + + "git.sr.ht/~jackmordaunt/go-toast" + "github.com/wailsapp/wails/v3/pkg/application" +) + +var NotificationCategories map[string]NotificationCategory = make(map[string]NotificationCategory) + +func New() *Service { + return &Service{} +} + +// ServiceName returns the name of the service +func (ns *Service) ServiceName() string { + return "github.com/wailsapp/wails/v3/services/notifications" +} + +// ServiceStartup is called when the service is loaded +func (ns *Service) ServiceStartup(ctx context.Context, options application.ServiceOptions) error { + toast.SetActivationCallback(func(args string, data []toast.UserData) { + response := NotificationResponse{ + Name: "notification", + Data: NotificationResponseData{ + ActionIdentifier: args, + }, + } + + if userText, found := getUserText(data); found { + response.Data.UserText = userText + } + + application.Get().EmitEvent("notificationResponse", response) + }) + return nil +} + +// ServiceShutdown is called when the service is unloaded +func (ns *Service) ServiceShutdown() error { + return nil +} + +// On Windows this does not apply, return true +func CheckBundleIdentifier() bool { + return true +} + +// On Windows this does not apply, return true +func (ns *Service) RequestUserNotificationAuthorization() (bool, error) { + return true, nil +} + +// On Windows this does not apply, return true +func (ns *Service) CheckNotificationAuthorization() bool { + return true +} + +func (ns *Service) SendNotification(identifier, title, _, body string) error { + n := toast.Notification{ + AppID: identifier, + Title: title, + Body: body, + } + + err := n.Push() + if err != nil { + return err + } + return nil +} + +func (ns *Service) SendNotificationWithActions(options NotificationOptions) error { + nCategory := NotificationCategories[options.CategoryID] + + n := toast.Notification{ + AppID: options.ID, + Title: options.Title, + Body: options.Body, + } + + for _, action := range nCategory.Actions { + n.Actions = append(n.Actions, toast.Action{ + Content: action.Title, + Arguments: action.ID, + }) + } + + if nCategory.HasReplyField { + n.Inputs = append(n.Inputs, toast.Input{ + ID: "userText", + Title: nCategory.ReplyButtonTitle, + Placeholder: nCategory.ReplyPlaceholder, + }) + + n.Actions = append(n.Actions, toast.Action{ + Content: nCategory.ReplyButtonTitle, + }) + } + + err := n.Push() + if err != nil { + return err + } + return nil +} + +func (ns *Service) RegisterNotificationCategory(category NotificationCategory) error { + NotificationCategories[category.ID] = NotificationCategory{ + ID: category.ID, + Actions: category.Actions, + HasReplyField: bool(category.HasReplyField), + ReplyPlaceholder: category.ReplyPlaceholder, + ReplyButtonTitle: category.ReplyButtonTitle, + } + + return nil +} + +// RemoveAllPendingNotifications removes all pending notifications +func (ns *Service) RemoveAllPendingNotifications() error { + return nil +} + +// RemovePendingNotification removes a specific pending notification +func (ns *Service) RemovePendingNotification(_ string) error { + return nil +} + +// RemoveAllDeliveredNotifications removes all delivered notifications +func (ns *Service) RemoveAllDeliveredNotifications() error { + return nil +} + +// RemoveDeliveredNotification removes a specific delivered notification +func (ns *Service) RemoveDeliveredNotification(_ string) error { + return nil +} + +func getUserText(data []toast.UserData) (string, bool) { + for _, d := range data { + if d.Key == "userText" { + return d.Value, true + } + } + return "", false +} From c7d54e2fa9e3f7a4243ed0b36ad64334e80a9533 Mon Sep 17 00:00:00 2001 From: popaprozac Date: Sat, 22 Feb 2025 18:58:16 -0800 Subject: [PATCH 021/374] remove app event --- .../desktop/@wailsio/runtime/package.json | 2 +- .../@wailsio/runtime/src/event_types.js | 1 - .../@wailsio/runtime/types/event_types.d.ts | 1 - v3/pkg/events/events.go | 619 +++++++++--------- v3/pkg/events/events.txt | 1 - v3/pkg/events/events_darwin.h | 223 ++++--- .../notifications/notifications_darwin.go | 15 + .../notifications/notifications_darwin.m | 12 +- 8 files changed, 441 insertions(+), 433 deletions(-) diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/package.json b/v3/internal/runtime/desktop/@wailsio/runtime/package.json index 7412db923..ae1fd6853 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/package.json +++ b/v3/internal/runtime/desktop/@wailsio/runtime/package.json @@ -1,7 +1,7 @@ { "name": "@wailsio/runtime", "type": "module", - "version": "3.0.0-alpha.57", + "version": "3.0.0-alpha.58", "description": "Wails Runtime", "types": "types/index.d.ts", "exports": { diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/event_types.js b/v3/internal/runtime/desktop/@wailsio/runtime/src/event_types.js index f56a77cb6..9c7feed7c 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/src/event_types.js +++ b/v3/internal/runtime/desktop/@wailsio/runtime/src/event_types.js @@ -69,7 +69,6 @@ export const EventTypes = { ApplicationWillTerminate: "mac:ApplicationWillTerminate", ApplicationWillUnhide: "mac:ApplicationWillUnhide", ApplicationWillUpdate: "mac:ApplicationWillUpdate", - DidReceiveNotificationResponse: "mac:DidReceiveNotificationResponse", MenuDidAddItem: "mac:MenuDidAddItem", MenuDidBeginTracking: "mac:MenuDidBeginTracking", MenuDidClose: "mac:MenuDidClose", diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/types/event_types.d.ts b/v3/internal/runtime/desktop/@wailsio/runtime/types/event_types.d.ts index 5c2d40009..e8742de59 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/types/event_types.d.ts +++ b/v3/internal/runtime/desktop/@wailsio/runtime/types/event_types.d.ts @@ -69,7 +69,6 @@ export declare const EventTypes: { ApplicationWillTerminate: string, ApplicationWillUnhide: string, ApplicationWillUpdate: string, - DidReceiveNotificationResponse: string, MenuDidAddItem: string, MenuDidBeginTracking: string, MenuDidClose: string, diff --git a/v3/pkg/events/events.go b/v3/pkg/events/events.go index 84f214cac..0bb4c850c 100644 --- a/v3/pkg/events/events.go +++ b/v3/pkg/events/events.go @@ -112,7 +112,6 @@ type macEvents struct { ApplicationWillTerminate ApplicationEventType ApplicationWillUnhide ApplicationEventType ApplicationWillUpdate ApplicationEventType - DidReceiveNotificationResponse ApplicationEventType MenuDidAddItem ApplicationEventType MenuDidBeginTracking ApplicationEventType MenuDidClose ApplicationEventType @@ -249,117 +248,116 @@ func newMacEvents() macEvents { ApplicationWillTerminate: 1075, ApplicationWillUnhide: 1076, ApplicationWillUpdate: 1077, - DidReceiveNotificationResponse: 1078, - MenuDidAddItem: 1079, - MenuDidBeginTracking: 1080, - MenuDidClose: 1081, - MenuDidDisplayItem: 1082, - MenuDidEndTracking: 1083, - MenuDidHighlightItem: 1084, - MenuDidOpen: 1085, - MenuDidPopUp: 1086, - MenuDidRemoveItem: 1087, - MenuDidSendAction: 1088, - MenuDidSendActionToItem: 1089, - MenuDidUpdate: 1090, - MenuWillAddItem: 1091, - MenuWillBeginTracking: 1092, - MenuWillDisplayItem: 1093, - MenuWillEndTracking: 1094, - MenuWillHighlightItem: 1095, - MenuWillOpen: 1096, - MenuWillPopUp: 1097, - MenuWillRemoveItem: 1098, - MenuWillSendAction: 1099, - MenuWillSendActionToItem: 1100, - MenuWillUpdate: 1101, - WebViewDidCommitNavigation: 1102, - WebViewDidFinishNavigation: 1103, - WebViewDidReceiveServerRedirectForProvisionalNavigation: 1104, - WebViewDidStartProvisionalNavigation: 1105, - WindowDidBecomeKey: 1106, - WindowDidBecomeMain: 1107, - WindowDidBeginSheet: 1108, - WindowDidChangeAlpha: 1109, - WindowDidChangeBackingLocation: 1110, - WindowDidChangeBackingProperties: 1111, - WindowDidChangeCollectionBehavior: 1112, - WindowDidChangeEffectiveAppearance: 1113, - WindowDidChangeOcclusionState: 1114, - WindowDidChangeOrderingMode: 1115, - WindowDidChangeScreen: 1116, - WindowDidChangeScreenParameters: 1117, - WindowDidChangeScreenProfile: 1118, - WindowDidChangeScreenSpace: 1119, - WindowDidChangeScreenSpaceProperties: 1120, - WindowDidChangeSharingType: 1121, - WindowDidChangeSpace: 1122, - WindowDidChangeSpaceOrderingMode: 1123, - WindowDidChangeTitle: 1124, - WindowDidChangeToolbar: 1125, - WindowDidDeminiaturize: 1126, - WindowDidEndSheet: 1127, - WindowDidEnterFullScreen: 1128, - WindowDidEnterVersionBrowser: 1129, - WindowDidExitFullScreen: 1130, - WindowDidExitVersionBrowser: 1131, - WindowDidExpose: 1132, - WindowDidFocus: 1133, - WindowDidMiniaturize: 1134, - WindowDidMove: 1135, - WindowDidOrderOffScreen: 1136, - WindowDidOrderOnScreen: 1137, - WindowDidResignKey: 1138, - WindowDidResignMain: 1139, - WindowDidResize: 1140, - WindowDidUpdate: 1141, - WindowDidUpdateAlpha: 1142, - WindowDidUpdateCollectionBehavior: 1143, - WindowDidUpdateCollectionProperties: 1144, - WindowDidUpdateShadow: 1145, - WindowDidUpdateTitle: 1146, - WindowDidUpdateToolbar: 1147, - WindowDidZoom: 1148, - WindowFileDraggingEntered: 1149, - WindowFileDraggingExited: 1150, - WindowFileDraggingPerformed: 1151, - WindowHide: 1152, - WindowMaximise: 1153, - WindowUnMaximise: 1154, - WindowMinimise: 1155, - WindowUnMinimise: 1156, - WindowShouldClose: 1157, - WindowShow: 1158, - WindowWillBecomeKey: 1159, - WindowWillBecomeMain: 1160, - WindowWillBeginSheet: 1161, - WindowWillChangeOrderingMode: 1162, - WindowWillClose: 1163, - WindowWillDeminiaturize: 1164, - WindowWillEnterFullScreen: 1165, - WindowWillEnterVersionBrowser: 1166, - WindowWillExitFullScreen: 1167, - WindowWillExitVersionBrowser: 1168, - WindowWillFocus: 1169, - WindowWillMiniaturize: 1170, - WindowWillMove: 1171, - WindowWillOrderOffScreen: 1172, - WindowWillOrderOnScreen: 1173, - WindowWillResignMain: 1174, - WindowWillResize: 1175, - WindowWillUnfocus: 1176, - WindowWillUpdate: 1177, - WindowWillUpdateAlpha: 1178, - WindowWillUpdateCollectionBehavior: 1179, - WindowWillUpdateCollectionProperties: 1180, - WindowWillUpdateShadow: 1181, - WindowWillUpdateTitle: 1182, - WindowWillUpdateToolbar: 1183, - WindowWillUpdateVisibility: 1184, - WindowWillUseStandardFrame: 1185, - WindowZoomIn: 1186, - WindowZoomOut: 1187, - WindowZoomReset: 1188, + MenuDidAddItem: 1078, + MenuDidBeginTracking: 1079, + MenuDidClose: 1080, + MenuDidDisplayItem: 1081, + MenuDidEndTracking: 1082, + MenuDidHighlightItem: 1083, + MenuDidOpen: 1084, + MenuDidPopUp: 1085, + MenuDidRemoveItem: 1086, + MenuDidSendAction: 1087, + MenuDidSendActionToItem: 1088, + MenuDidUpdate: 1089, + MenuWillAddItem: 1090, + MenuWillBeginTracking: 1091, + MenuWillDisplayItem: 1092, + MenuWillEndTracking: 1093, + MenuWillHighlightItem: 1094, + MenuWillOpen: 1095, + MenuWillPopUp: 1096, + MenuWillRemoveItem: 1097, + MenuWillSendAction: 1098, + MenuWillSendActionToItem: 1099, + MenuWillUpdate: 1100, + WebViewDidCommitNavigation: 1101, + WebViewDidFinishNavigation: 1102, + WebViewDidReceiveServerRedirectForProvisionalNavigation: 1103, + WebViewDidStartProvisionalNavigation: 1104, + WindowDidBecomeKey: 1105, + WindowDidBecomeMain: 1106, + WindowDidBeginSheet: 1107, + WindowDidChangeAlpha: 1108, + WindowDidChangeBackingLocation: 1109, + WindowDidChangeBackingProperties: 1110, + WindowDidChangeCollectionBehavior: 1111, + WindowDidChangeEffectiveAppearance: 1112, + WindowDidChangeOcclusionState: 1113, + WindowDidChangeOrderingMode: 1114, + WindowDidChangeScreen: 1115, + WindowDidChangeScreenParameters: 1116, + WindowDidChangeScreenProfile: 1117, + WindowDidChangeScreenSpace: 1118, + WindowDidChangeScreenSpaceProperties: 1119, + WindowDidChangeSharingType: 1120, + WindowDidChangeSpace: 1121, + WindowDidChangeSpaceOrderingMode: 1122, + WindowDidChangeTitle: 1123, + WindowDidChangeToolbar: 1124, + WindowDidDeminiaturize: 1125, + WindowDidEndSheet: 1126, + WindowDidEnterFullScreen: 1127, + WindowDidEnterVersionBrowser: 1128, + WindowDidExitFullScreen: 1129, + WindowDidExitVersionBrowser: 1130, + WindowDidExpose: 1131, + WindowDidFocus: 1132, + WindowDidMiniaturize: 1133, + WindowDidMove: 1134, + WindowDidOrderOffScreen: 1135, + WindowDidOrderOnScreen: 1136, + WindowDidResignKey: 1137, + WindowDidResignMain: 1138, + WindowDidResize: 1139, + WindowDidUpdate: 1140, + WindowDidUpdateAlpha: 1141, + WindowDidUpdateCollectionBehavior: 1142, + WindowDidUpdateCollectionProperties: 1143, + WindowDidUpdateShadow: 1144, + WindowDidUpdateTitle: 1145, + WindowDidUpdateToolbar: 1146, + WindowDidZoom: 1147, + WindowFileDraggingEntered: 1148, + WindowFileDraggingExited: 1149, + WindowFileDraggingPerformed: 1150, + WindowHide: 1151, + WindowMaximise: 1152, + WindowUnMaximise: 1153, + WindowMinimise: 1154, + WindowUnMinimise: 1155, + WindowShouldClose: 1156, + WindowShow: 1157, + WindowWillBecomeKey: 1158, + WindowWillBecomeMain: 1159, + WindowWillBeginSheet: 1160, + WindowWillChangeOrderingMode: 1161, + WindowWillClose: 1162, + WindowWillDeminiaturize: 1163, + WindowWillEnterFullScreen: 1164, + WindowWillEnterVersionBrowser: 1165, + WindowWillExitFullScreen: 1166, + WindowWillExitVersionBrowser: 1167, + WindowWillFocus: 1168, + WindowWillMiniaturize: 1169, + WindowWillMove: 1170, + WindowWillOrderOffScreen: 1171, + WindowWillOrderOnScreen: 1172, + WindowWillResignMain: 1173, + WindowWillResize: 1174, + WindowWillUnfocus: 1175, + WindowWillUpdate: 1176, + WindowWillUpdateAlpha: 1177, + WindowWillUpdateCollectionBehavior: 1178, + WindowWillUpdateCollectionProperties: 1179, + WindowWillUpdateShadow: 1180, + WindowWillUpdateTitle: 1181, + WindowWillUpdateToolbar: 1182, + WindowWillUpdateVisibility: 1183, + WindowWillUseStandardFrame: 1184, + WindowZoomIn: 1185, + WindowZoomOut: 1186, + WindowZoomReset: 1187, } } @@ -414,50 +412,50 @@ type windowsEvents struct { func newWindowsEvents() windowsEvents { return windowsEvents{ - APMPowerSettingChange: 1189, - APMPowerStatusChange: 1190, - APMResumeAutomatic: 1191, - APMResumeSuspend: 1192, - APMSuspend: 1193, - ApplicationStarted: 1194, - SystemThemeChanged: 1195, - WebViewNavigationCompleted: 1196, - WindowActive: 1197, - WindowBackgroundErase: 1198, - WindowClickActive: 1199, - WindowClosing: 1200, - WindowDidMove: 1201, - WindowDidResize: 1202, - WindowDPIChanged: 1203, - WindowDragDrop: 1204, - WindowDragEnter: 1205, - WindowDragLeave: 1206, - WindowDragOver: 1207, - WindowEndMove: 1208, - WindowEndResize: 1209, - WindowFullscreen: 1210, - WindowHide: 1211, - WindowInactive: 1212, - WindowKeyDown: 1213, - WindowKeyUp: 1214, - WindowKillFocus: 1215, - WindowNonClientHit: 1216, - WindowNonClientMouseDown: 1217, - WindowNonClientMouseLeave: 1218, - WindowNonClientMouseMove: 1219, - WindowNonClientMouseUp: 1220, - WindowPaint: 1221, - WindowRestore: 1222, - WindowSetFocus: 1223, - WindowShow: 1224, - WindowStartMove: 1225, - WindowStartResize: 1226, - WindowUnFullscreen: 1227, - WindowZOrderChanged: 1228, - WindowMinimise: 1229, - WindowUnMinimise: 1230, - WindowMaximise: 1231, - WindowUnMaximise: 1232, + APMPowerSettingChange: 1188, + APMPowerStatusChange: 1189, + APMResumeAutomatic: 1190, + APMResumeSuspend: 1191, + APMSuspend: 1192, + ApplicationStarted: 1193, + SystemThemeChanged: 1194, + WebViewNavigationCompleted: 1195, + WindowActive: 1196, + WindowBackgroundErase: 1197, + WindowClickActive: 1198, + WindowClosing: 1199, + WindowDidMove: 1200, + WindowDidResize: 1201, + WindowDPIChanged: 1202, + WindowDragDrop: 1203, + WindowDragEnter: 1204, + WindowDragLeave: 1205, + WindowDragOver: 1206, + WindowEndMove: 1207, + WindowEndResize: 1208, + WindowFullscreen: 1209, + WindowHide: 1210, + WindowInactive: 1211, + WindowKeyDown: 1212, + WindowKeyUp: 1213, + WindowKillFocus: 1214, + WindowNonClientHit: 1215, + WindowNonClientMouseDown: 1216, + WindowNonClientMouseLeave: 1217, + WindowNonClientMouseMove: 1218, + WindowNonClientMouseUp: 1219, + WindowPaint: 1220, + WindowRestore: 1221, + WindowSetFocus: 1222, + WindowShow: 1223, + WindowStartMove: 1224, + WindowStartResize: 1225, + WindowUnFullscreen: 1226, + WindowZOrderChanged: 1227, + WindowMinimise: 1228, + WindowUnMinimise: 1229, + WindowMaximise: 1230, + WindowUnMaximise: 1231, } } @@ -520,160 +518,159 @@ var eventToJS = map[uint]string{ 1075: "mac:ApplicationWillTerminate", 1076: "mac:ApplicationWillUnhide", 1077: "mac:ApplicationWillUpdate", - 1078: "mac:DidReceiveNotificationResponse", - 1079: "mac:MenuDidAddItem", - 1080: "mac:MenuDidBeginTracking", - 1081: "mac:MenuDidClose", - 1082: "mac:MenuDidDisplayItem", - 1083: "mac:MenuDidEndTracking", - 1084: "mac:MenuDidHighlightItem", - 1085: "mac:MenuDidOpen", - 1086: "mac:MenuDidPopUp", - 1087: "mac:MenuDidRemoveItem", - 1088: "mac:MenuDidSendAction", - 1089: "mac:MenuDidSendActionToItem", - 1090: "mac:MenuDidUpdate", - 1091: "mac:MenuWillAddItem", - 1092: "mac:MenuWillBeginTracking", - 1093: "mac:MenuWillDisplayItem", - 1094: "mac:MenuWillEndTracking", - 1095: "mac:MenuWillHighlightItem", - 1096: "mac:MenuWillOpen", - 1097: "mac:MenuWillPopUp", - 1098: "mac:MenuWillRemoveItem", - 1099: "mac:MenuWillSendAction", - 1100: "mac:MenuWillSendActionToItem", - 1101: "mac:MenuWillUpdate", - 1102: "mac:WebViewDidCommitNavigation", - 1103: "mac:WebViewDidFinishNavigation", - 1104: "mac:WebViewDidReceiveServerRedirectForProvisionalNavigation", - 1105: "mac:WebViewDidStartProvisionalNavigation", - 1106: "mac:WindowDidBecomeKey", - 1107: "mac:WindowDidBecomeMain", - 1108: "mac:WindowDidBeginSheet", - 1109: "mac:WindowDidChangeAlpha", - 1110: "mac:WindowDidChangeBackingLocation", - 1111: "mac:WindowDidChangeBackingProperties", - 1112: "mac:WindowDidChangeCollectionBehavior", - 1113: "mac:WindowDidChangeEffectiveAppearance", - 1114: "mac:WindowDidChangeOcclusionState", - 1115: "mac:WindowDidChangeOrderingMode", - 1116: "mac:WindowDidChangeScreen", - 1117: "mac:WindowDidChangeScreenParameters", - 1118: "mac:WindowDidChangeScreenProfile", - 1119: "mac:WindowDidChangeScreenSpace", - 1120: "mac:WindowDidChangeScreenSpaceProperties", - 1121: "mac:WindowDidChangeSharingType", - 1122: "mac:WindowDidChangeSpace", - 1123: "mac:WindowDidChangeSpaceOrderingMode", - 1124: "mac:WindowDidChangeTitle", - 1125: "mac:WindowDidChangeToolbar", - 1126: "mac:WindowDidDeminiaturize", - 1127: "mac:WindowDidEndSheet", - 1128: "mac:WindowDidEnterFullScreen", - 1129: "mac:WindowDidEnterVersionBrowser", - 1130: "mac:WindowDidExitFullScreen", - 1131: "mac:WindowDidExitVersionBrowser", - 1132: "mac:WindowDidExpose", - 1133: "mac:WindowDidFocus", - 1134: "mac:WindowDidMiniaturize", - 1135: "mac:WindowDidMove", - 1136: "mac:WindowDidOrderOffScreen", - 1137: "mac:WindowDidOrderOnScreen", - 1138: "mac:WindowDidResignKey", - 1139: "mac:WindowDidResignMain", - 1140: "mac:WindowDidResize", - 1141: "mac:WindowDidUpdate", - 1142: "mac:WindowDidUpdateAlpha", - 1143: "mac:WindowDidUpdateCollectionBehavior", - 1144: "mac:WindowDidUpdateCollectionProperties", - 1145: "mac:WindowDidUpdateShadow", - 1146: "mac:WindowDidUpdateTitle", - 1147: "mac:WindowDidUpdateToolbar", - 1148: "mac:WindowDidZoom", - 1149: "mac:WindowFileDraggingEntered", - 1150: "mac:WindowFileDraggingExited", - 1151: "mac:WindowFileDraggingPerformed", - 1152: "mac:WindowHide", - 1153: "mac:WindowMaximise", - 1154: "mac:WindowUnMaximise", - 1155: "mac:WindowMinimise", - 1156: "mac:WindowUnMinimise", - 1157: "mac:WindowShouldClose", - 1158: "mac:WindowShow", - 1159: "mac:WindowWillBecomeKey", - 1160: "mac:WindowWillBecomeMain", - 1161: "mac:WindowWillBeginSheet", - 1162: "mac:WindowWillChangeOrderingMode", - 1163: "mac:WindowWillClose", - 1164: "mac:WindowWillDeminiaturize", - 1165: "mac:WindowWillEnterFullScreen", - 1166: "mac:WindowWillEnterVersionBrowser", - 1167: "mac:WindowWillExitFullScreen", - 1168: "mac:WindowWillExitVersionBrowser", - 1169: "mac:WindowWillFocus", - 1170: "mac:WindowWillMiniaturize", - 1171: "mac:WindowWillMove", - 1172: "mac:WindowWillOrderOffScreen", - 1173: "mac:WindowWillOrderOnScreen", - 1174: "mac:WindowWillResignMain", - 1175: "mac:WindowWillResize", - 1176: "mac:WindowWillUnfocus", - 1177: "mac:WindowWillUpdate", - 1178: "mac:WindowWillUpdateAlpha", - 1179: "mac:WindowWillUpdateCollectionBehavior", - 1180: "mac:WindowWillUpdateCollectionProperties", - 1181: "mac:WindowWillUpdateShadow", - 1182: "mac:WindowWillUpdateTitle", - 1183: "mac:WindowWillUpdateToolbar", - 1184: "mac:WindowWillUpdateVisibility", - 1185: "mac:WindowWillUseStandardFrame", - 1186: "mac:WindowZoomIn", - 1187: "mac:WindowZoomOut", - 1188: "mac:WindowZoomReset", - 1189: "windows:APMPowerSettingChange", - 1190: "windows:APMPowerStatusChange", - 1191: "windows:APMResumeAutomatic", - 1192: "windows:APMResumeSuspend", - 1193: "windows:APMSuspend", - 1194: "windows:ApplicationStarted", - 1195: "windows:SystemThemeChanged", - 1196: "windows:WebViewNavigationCompleted", - 1197: "windows:WindowActive", - 1198: "windows:WindowBackgroundErase", - 1199: "windows:WindowClickActive", - 1200: "windows:WindowClosing", - 1201: "windows:WindowDidMove", - 1202: "windows:WindowDidResize", - 1203: "windows:WindowDPIChanged", - 1204: "windows:WindowDragDrop", - 1205: "windows:WindowDragEnter", - 1206: "windows:WindowDragLeave", - 1207: "windows:WindowDragOver", - 1208: "windows:WindowEndMove", - 1209: "windows:WindowEndResize", - 1210: "windows:WindowFullscreen", - 1211: "windows:WindowHide", - 1212: "windows:WindowInactive", - 1213: "windows:WindowKeyDown", - 1214: "windows:WindowKeyUp", - 1215: "windows:WindowKillFocus", - 1216: "windows:WindowNonClientHit", - 1217: "windows:WindowNonClientMouseDown", - 1218: "windows:WindowNonClientMouseLeave", - 1219: "windows:WindowNonClientMouseMove", - 1220: "windows:WindowNonClientMouseUp", - 1221: "windows:WindowPaint", - 1222: "windows:WindowRestore", - 1223: "windows:WindowSetFocus", - 1224: "windows:WindowShow", - 1225: "windows:WindowStartMove", - 1226: "windows:WindowStartResize", - 1227: "windows:WindowUnFullscreen", - 1228: "windows:WindowZOrderChanged", - 1229: "windows:WindowMinimise", - 1230: "windows:WindowUnMinimise", - 1231: "windows:WindowMaximise", - 1232: "windows:WindowUnMaximise", + 1078: "mac:MenuDidAddItem", + 1079: "mac:MenuDidBeginTracking", + 1080: "mac:MenuDidClose", + 1081: "mac:MenuDidDisplayItem", + 1082: "mac:MenuDidEndTracking", + 1083: "mac:MenuDidHighlightItem", + 1084: "mac:MenuDidOpen", + 1085: "mac:MenuDidPopUp", + 1086: "mac:MenuDidRemoveItem", + 1087: "mac:MenuDidSendAction", + 1088: "mac:MenuDidSendActionToItem", + 1089: "mac:MenuDidUpdate", + 1090: "mac:MenuWillAddItem", + 1091: "mac:MenuWillBeginTracking", + 1092: "mac:MenuWillDisplayItem", + 1093: "mac:MenuWillEndTracking", + 1094: "mac:MenuWillHighlightItem", + 1095: "mac:MenuWillOpen", + 1096: "mac:MenuWillPopUp", + 1097: "mac:MenuWillRemoveItem", + 1098: "mac:MenuWillSendAction", + 1099: "mac:MenuWillSendActionToItem", + 1100: "mac:MenuWillUpdate", + 1101: "mac:WebViewDidCommitNavigation", + 1102: "mac:WebViewDidFinishNavigation", + 1103: "mac:WebViewDidReceiveServerRedirectForProvisionalNavigation", + 1104: "mac:WebViewDidStartProvisionalNavigation", + 1105: "mac:WindowDidBecomeKey", + 1106: "mac:WindowDidBecomeMain", + 1107: "mac:WindowDidBeginSheet", + 1108: "mac:WindowDidChangeAlpha", + 1109: "mac:WindowDidChangeBackingLocation", + 1110: "mac:WindowDidChangeBackingProperties", + 1111: "mac:WindowDidChangeCollectionBehavior", + 1112: "mac:WindowDidChangeEffectiveAppearance", + 1113: "mac:WindowDidChangeOcclusionState", + 1114: "mac:WindowDidChangeOrderingMode", + 1115: "mac:WindowDidChangeScreen", + 1116: "mac:WindowDidChangeScreenParameters", + 1117: "mac:WindowDidChangeScreenProfile", + 1118: "mac:WindowDidChangeScreenSpace", + 1119: "mac:WindowDidChangeScreenSpaceProperties", + 1120: "mac:WindowDidChangeSharingType", + 1121: "mac:WindowDidChangeSpace", + 1122: "mac:WindowDidChangeSpaceOrderingMode", + 1123: "mac:WindowDidChangeTitle", + 1124: "mac:WindowDidChangeToolbar", + 1125: "mac:WindowDidDeminiaturize", + 1126: "mac:WindowDidEndSheet", + 1127: "mac:WindowDidEnterFullScreen", + 1128: "mac:WindowDidEnterVersionBrowser", + 1129: "mac:WindowDidExitFullScreen", + 1130: "mac:WindowDidExitVersionBrowser", + 1131: "mac:WindowDidExpose", + 1132: "mac:WindowDidFocus", + 1133: "mac:WindowDidMiniaturize", + 1134: "mac:WindowDidMove", + 1135: "mac:WindowDidOrderOffScreen", + 1136: "mac:WindowDidOrderOnScreen", + 1137: "mac:WindowDidResignKey", + 1138: "mac:WindowDidResignMain", + 1139: "mac:WindowDidResize", + 1140: "mac:WindowDidUpdate", + 1141: "mac:WindowDidUpdateAlpha", + 1142: "mac:WindowDidUpdateCollectionBehavior", + 1143: "mac:WindowDidUpdateCollectionProperties", + 1144: "mac:WindowDidUpdateShadow", + 1145: "mac:WindowDidUpdateTitle", + 1146: "mac:WindowDidUpdateToolbar", + 1147: "mac:WindowDidZoom", + 1148: "mac:WindowFileDraggingEntered", + 1149: "mac:WindowFileDraggingExited", + 1150: "mac:WindowFileDraggingPerformed", + 1151: "mac:WindowHide", + 1152: "mac:WindowMaximise", + 1153: "mac:WindowUnMaximise", + 1154: "mac:WindowMinimise", + 1155: "mac:WindowUnMinimise", + 1156: "mac:WindowShouldClose", + 1157: "mac:WindowShow", + 1158: "mac:WindowWillBecomeKey", + 1159: "mac:WindowWillBecomeMain", + 1160: "mac:WindowWillBeginSheet", + 1161: "mac:WindowWillChangeOrderingMode", + 1162: "mac:WindowWillClose", + 1163: "mac:WindowWillDeminiaturize", + 1164: "mac:WindowWillEnterFullScreen", + 1165: "mac:WindowWillEnterVersionBrowser", + 1166: "mac:WindowWillExitFullScreen", + 1167: "mac:WindowWillExitVersionBrowser", + 1168: "mac:WindowWillFocus", + 1169: "mac:WindowWillMiniaturize", + 1170: "mac:WindowWillMove", + 1171: "mac:WindowWillOrderOffScreen", + 1172: "mac:WindowWillOrderOnScreen", + 1173: "mac:WindowWillResignMain", + 1174: "mac:WindowWillResize", + 1175: "mac:WindowWillUnfocus", + 1176: "mac:WindowWillUpdate", + 1177: "mac:WindowWillUpdateAlpha", + 1178: "mac:WindowWillUpdateCollectionBehavior", + 1179: "mac:WindowWillUpdateCollectionProperties", + 1180: "mac:WindowWillUpdateShadow", + 1181: "mac:WindowWillUpdateTitle", + 1182: "mac:WindowWillUpdateToolbar", + 1183: "mac:WindowWillUpdateVisibility", + 1184: "mac:WindowWillUseStandardFrame", + 1185: "mac:WindowZoomIn", + 1186: "mac:WindowZoomOut", + 1187: "mac:WindowZoomReset", + 1188: "windows:APMPowerSettingChange", + 1189: "windows:APMPowerStatusChange", + 1190: "windows:APMResumeAutomatic", + 1191: "windows:APMResumeSuspend", + 1192: "windows:APMSuspend", + 1193: "windows:ApplicationStarted", + 1194: "windows:SystemThemeChanged", + 1195: "windows:WebViewNavigationCompleted", + 1196: "windows:WindowActive", + 1197: "windows:WindowBackgroundErase", + 1198: "windows:WindowClickActive", + 1199: "windows:WindowClosing", + 1200: "windows:WindowDidMove", + 1201: "windows:WindowDidResize", + 1202: "windows:WindowDPIChanged", + 1203: "windows:WindowDragDrop", + 1204: "windows:WindowDragEnter", + 1205: "windows:WindowDragLeave", + 1206: "windows:WindowDragOver", + 1207: "windows:WindowEndMove", + 1208: "windows:WindowEndResize", + 1209: "windows:WindowFullscreen", + 1210: "windows:WindowHide", + 1211: "windows:WindowInactive", + 1212: "windows:WindowKeyDown", + 1213: "windows:WindowKeyUp", + 1214: "windows:WindowKillFocus", + 1215: "windows:WindowNonClientHit", + 1216: "windows:WindowNonClientMouseDown", + 1217: "windows:WindowNonClientMouseLeave", + 1218: "windows:WindowNonClientMouseMove", + 1219: "windows:WindowNonClientMouseUp", + 1220: "windows:WindowPaint", + 1221: "windows:WindowRestore", + 1222: "windows:WindowSetFocus", + 1223: "windows:WindowShow", + 1224: "windows:WindowStartMove", + 1225: "windows:WindowStartResize", + 1226: "windows:WindowUnFullscreen", + 1227: "windows:WindowZOrderChanged", + 1228: "windows:WindowMinimise", + 1229: "windows:WindowUnMinimise", + 1230: "windows:WindowMaximise", + 1231: "windows:WindowUnMaximise", } diff --git a/v3/pkg/events/events.txt b/v3/pkg/events/events.txt index fa83f4655..1d43adf5e 100644 --- a/v3/pkg/events/events.txt +++ b/v3/pkg/events/events.txt @@ -52,7 +52,6 @@ mac:ApplicationWillResignActive mac:ApplicationWillTerminate mac:ApplicationWillUnhide mac:ApplicationWillUpdate -mac:DidReceiveNotificationResponse mac:MenuDidAddItem mac:MenuDidBeginTracking mac:MenuDidClose diff --git a/v3/pkg/events/events_darwin.h b/v3/pkg/events/events_darwin.h index 5e6c1a39e..bacaab781 100644 --- a/v3/pkg/events/events_darwin.h +++ b/v3/pkg/events/events_darwin.h @@ -28,119 +28,118 @@ extern void processWindowEvent(unsigned int, unsigned int); #define EventApplicationWillTerminate 1075 #define EventApplicationWillUnhide 1076 #define EventApplicationWillUpdate 1077 -#define EventDidReceiveNotificationResponse 1078 -#define EventMenuDidAddItem 1079 -#define EventMenuDidBeginTracking 1080 -#define EventMenuDidClose 1081 -#define EventMenuDidDisplayItem 1082 -#define EventMenuDidEndTracking 1083 -#define EventMenuDidHighlightItem 1084 -#define EventMenuDidOpen 1085 -#define EventMenuDidPopUp 1086 -#define EventMenuDidRemoveItem 1087 -#define EventMenuDidSendAction 1088 -#define EventMenuDidSendActionToItem 1089 -#define EventMenuDidUpdate 1090 -#define EventMenuWillAddItem 1091 -#define EventMenuWillBeginTracking 1092 -#define EventMenuWillDisplayItem 1093 -#define EventMenuWillEndTracking 1094 -#define EventMenuWillHighlightItem 1095 -#define EventMenuWillOpen 1096 -#define EventMenuWillPopUp 1097 -#define EventMenuWillRemoveItem 1098 -#define EventMenuWillSendAction 1099 -#define EventMenuWillSendActionToItem 1100 -#define EventMenuWillUpdate 1101 -#define EventWebViewDidCommitNavigation 1102 -#define EventWebViewDidFinishNavigation 1103 -#define EventWebViewDidReceiveServerRedirectForProvisionalNavigation 1104 -#define EventWebViewDidStartProvisionalNavigation 1105 -#define EventWindowDidBecomeKey 1106 -#define EventWindowDidBecomeMain 1107 -#define EventWindowDidBeginSheet 1108 -#define EventWindowDidChangeAlpha 1109 -#define EventWindowDidChangeBackingLocation 1110 -#define EventWindowDidChangeBackingProperties 1111 -#define EventWindowDidChangeCollectionBehavior 1112 -#define EventWindowDidChangeEffectiveAppearance 1113 -#define EventWindowDidChangeOcclusionState 1114 -#define EventWindowDidChangeOrderingMode 1115 -#define EventWindowDidChangeScreen 1116 -#define EventWindowDidChangeScreenParameters 1117 -#define EventWindowDidChangeScreenProfile 1118 -#define EventWindowDidChangeScreenSpace 1119 -#define EventWindowDidChangeScreenSpaceProperties 1120 -#define EventWindowDidChangeSharingType 1121 -#define EventWindowDidChangeSpace 1122 -#define EventWindowDidChangeSpaceOrderingMode 1123 -#define EventWindowDidChangeTitle 1124 -#define EventWindowDidChangeToolbar 1125 -#define EventWindowDidDeminiaturize 1126 -#define EventWindowDidEndSheet 1127 -#define EventWindowDidEnterFullScreen 1128 -#define EventWindowDidEnterVersionBrowser 1129 -#define EventWindowDidExitFullScreen 1130 -#define EventWindowDidExitVersionBrowser 1131 -#define EventWindowDidExpose 1132 -#define EventWindowDidFocus 1133 -#define EventWindowDidMiniaturize 1134 -#define EventWindowDidMove 1135 -#define EventWindowDidOrderOffScreen 1136 -#define EventWindowDidOrderOnScreen 1137 -#define EventWindowDidResignKey 1138 -#define EventWindowDidResignMain 1139 -#define EventWindowDidResize 1140 -#define EventWindowDidUpdate 1141 -#define EventWindowDidUpdateAlpha 1142 -#define EventWindowDidUpdateCollectionBehavior 1143 -#define EventWindowDidUpdateCollectionProperties 1144 -#define EventWindowDidUpdateShadow 1145 -#define EventWindowDidUpdateTitle 1146 -#define EventWindowDidUpdateToolbar 1147 -#define EventWindowDidZoom 1148 -#define EventWindowFileDraggingEntered 1149 -#define EventWindowFileDraggingExited 1150 -#define EventWindowFileDraggingPerformed 1151 -#define EventWindowHide 1152 -#define EventWindowMaximise 1153 -#define EventWindowUnMaximise 1154 -#define EventWindowMinimise 1155 -#define EventWindowUnMinimise 1156 -#define EventWindowShouldClose 1157 -#define EventWindowShow 1158 -#define EventWindowWillBecomeKey 1159 -#define EventWindowWillBecomeMain 1160 -#define EventWindowWillBeginSheet 1161 -#define EventWindowWillChangeOrderingMode 1162 -#define EventWindowWillClose 1163 -#define EventWindowWillDeminiaturize 1164 -#define EventWindowWillEnterFullScreen 1165 -#define EventWindowWillEnterVersionBrowser 1166 -#define EventWindowWillExitFullScreen 1167 -#define EventWindowWillExitVersionBrowser 1168 -#define EventWindowWillFocus 1169 -#define EventWindowWillMiniaturize 1170 -#define EventWindowWillMove 1171 -#define EventWindowWillOrderOffScreen 1172 -#define EventWindowWillOrderOnScreen 1173 -#define EventWindowWillResignMain 1174 -#define EventWindowWillResize 1175 -#define EventWindowWillUnfocus 1176 -#define EventWindowWillUpdate 1177 -#define EventWindowWillUpdateAlpha 1178 -#define EventWindowWillUpdateCollectionBehavior 1179 -#define EventWindowWillUpdateCollectionProperties 1180 -#define EventWindowWillUpdateShadow 1181 -#define EventWindowWillUpdateTitle 1182 -#define EventWindowWillUpdateToolbar 1183 -#define EventWindowWillUpdateVisibility 1184 -#define EventWindowWillUseStandardFrame 1185 -#define EventWindowZoomIn 1186 -#define EventWindowZoomOut 1187 -#define EventWindowZoomReset 1188 +#define EventMenuDidAddItem 1078 +#define EventMenuDidBeginTracking 1079 +#define EventMenuDidClose 1080 +#define EventMenuDidDisplayItem 1081 +#define EventMenuDidEndTracking 1082 +#define EventMenuDidHighlightItem 1083 +#define EventMenuDidOpen 1084 +#define EventMenuDidPopUp 1085 +#define EventMenuDidRemoveItem 1086 +#define EventMenuDidSendAction 1087 +#define EventMenuDidSendActionToItem 1088 +#define EventMenuDidUpdate 1089 +#define EventMenuWillAddItem 1090 +#define EventMenuWillBeginTracking 1091 +#define EventMenuWillDisplayItem 1092 +#define EventMenuWillEndTracking 1093 +#define EventMenuWillHighlightItem 1094 +#define EventMenuWillOpen 1095 +#define EventMenuWillPopUp 1096 +#define EventMenuWillRemoveItem 1097 +#define EventMenuWillSendAction 1098 +#define EventMenuWillSendActionToItem 1099 +#define EventMenuWillUpdate 1100 +#define EventWebViewDidCommitNavigation 1101 +#define EventWebViewDidFinishNavigation 1102 +#define EventWebViewDidReceiveServerRedirectForProvisionalNavigation 1103 +#define EventWebViewDidStartProvisionalNavigation 1104 +#define EventWindowDidBecomeKey 1105 +#define EventWindowDidBecomeMain 1106 +#define EventWindowDidBeginSheet 1107 +#define EventWindowDidChangeAlpha 1108 +#define EventWindowDidChangeBackingLocation 1109 +#define EventWindowDidChangeBackingProperties 1110 +#define EventWindowDidChangeCollectionBehavior 1111 +#define EventWindowDidChangeEffectiveAppearance 1112 +#define EventWindowDidChangeOcclusionState 1113 +#define EventWindowDidChangeOrderingMode 1114 +#define EventWindowDidChangeScreen 1115 +#define EventWindowDidChangeScreenParameters 1116 +#define EventWindowDidChangeScreenProfile 1117 +#define EventWindowDidChangeScreenSpace 1118 +#define EventWindowDidChangeScreenSpaceProperties 1119 +#define EventWindowDidChangeSharingType 1120 +#define EventWindowDidChangeSpace 1121 +#define EventWindowDidChangeSpaceOrderingMode 1122 +#define EventWindowDidChangeTitle 1123 +#define EventWindowDidChangeToolbar 1124 +#define EventWindowDidDeminiaturize 1125 +#define EventWindowDidEndSheet 1126 +#define EventWindowDidEnterFullScreen 1127 +#define EventWindowDidEnterVersionBrowser 1128 +#define EventWindowDidExitFullScreen 1129 +#define EventWindowDidExitVersionBrowser 1130 +#define EventWindowDidExpose 1131 +#define EventWindowDidFocus 1132 +#define EventWindowDidMiniaturize 1133 +#define EventWindowDidMove 1134 +#define EventWindowDidOrderOffScreen 1135 +#define EventWindowDidOrderOnScreen 1136 +#define EventWindowDidResignKey 1137 +#define EventWindowDidResignMain 1138 +#define EventWindowDidResize 1139 +#define EventWindowDidUpdate 1140 +#define EventWindowDidUpdateAlpha 1141 +#define EventWindowDidUpdateCollectionBehavior 1142 +#define EventWindowDidUpdateCollectionProperties 1143 +#define EventWindowDidUpdateShadow 1144 +#define EventWindowDidUpdateTitle 1145 +#define EventWindowDidUpdateToolbar 1146 +#define EventWindowDidZoom 1147 +#define EventWindowFileDraggingEntered 1148 +#define EventWindowFileDraggingExited 1149 +#define EventWindowFileDraggingPerformed 1150 +#define EventWindowHide 1151 +#define EventWindowMaximise 1152 +#define EventWindowUnMaximise 1153 +#define EventWindowMinimise 1154 +#define EventWindowUnMinimise 1155 +#define EventWindowShouldClose 1156 +#define EventWindowShow 1157 +#define EventWindowWillBecomeKey 1158 +#define EventWindowWillBecomeMain 1159 +#define EventWindowWillBeginSheet 1160 +#define EventWindowWillChangeOrderingMode 1161 +#define EventWindowWillClose 1162 +#define EventWindowWillDeminiaturize 1163 +#define EventWindowWillEnterFullScreen 1164 +#define EventWindowWillEnterVersionBrowser 1165 +#define EventWindowWillExitFullScreen 1166 +#define EventWindowWillExitVersionBrowser 1167 +#define EventWindowWillFocus 1168 +#define EventWindowWillMiniaturize 1169 +#define EventWindowWillMove 1170 +#define EventWindowWillOrderOffScreen 1171 +#define EventWindowWillOrderOnScreen 1172 +#define EventWindowWillResignMain 1173 +#define EventWindowWillResize 1174 +#define EventWindowWillUnfocus 1175 +#define EventWindowWillUpdate 1176 +#define EventWindowWillUpdateAlpha 1177 +#define EventWindowWillUpdateCollectionBehavior 1178 +#define EventWindowWillUpdateCollectionProperties 1179 +#define EventWindowWillUpdateShadow 1180 +#define EventWindowWillUpdateTitle 1181 +#define EventWindowWillUpdateToolbar 1182 +#define EventWindowWillUpdateVisibility 1183 +#define EventWindowWillUseStandardFrame 1184 +#define EventWindowZoomIn 1185 +#define EventWindowZoomOut 1186 +#define EventWindowZoomReset 1187 -#define MAX_EVENTS 1189 +#define MAX_EVENTS 1188 #endif \ No newline at end of file diff --git a/v3/pkg/services/notifications/notifications_darwin.go b/v3/pkg/services/notifications/notifications_darwin.go index 5fc72b235..d9d378bcf 100644 --- a/v3/pkg/services/notifications/notifications_darwin.go +++ b/v3/pkg/services/notifications/notifications_darwin.go @@ -174,3 +174,18 @@ func (ns *Service) RemoveDeliveredNotification(identifier string) error { C.removeDeliveredNotification(cIdentifier) return nil } + +//export didReceiveNotificationResponse +func didReceiveNotificationResponse(jsonPayload *C.char) { + payload := C.GoString(jsonPayload) + + var response NotificationResponseData + if err := json.Unmarshal([]byte(payload), &response); err != nil { + return + } + + application.Get().EmitEvent("notificationResponse", NotificationResponse{ + Name: "notification", + Data: response, + }) +} diff --git a/v3/pkg/services/notifications/notifications_darwin.m b/v3/pkg/services/notifications/notifications_darwin.m index f3eaec1a1..b4be6835a 100644 --- a/v3/pkg/services/notifications/notifications_darwin.m +++ b/v3/pkg/services/notifications/notifications_darwin.m @@ -1,10 +1,8 @@ #import "notifications_darwin.h" #import #import -#import "../../events/events_darwin.h" -extern bool hasListeners(unsigned int); -extern void processApplicationEvent(unsigned int, void* data); +extern void didReceiveNotificationResponse(const char *jsonPayload); @interface NotificationsDelegate : NSObject @end @@ -48,9 +46,11 @@ didReceiveNotificationResponse:(UNNotificationResponse *)response [payload setObject:textResponse.userText forKey:@"userText"]; } - // Check if there are listeners for our notification response event - if (hasListeners(EventDidReceiveNotificationResponse)) { - processApplicationEvent(EventDidReceiveNotificationResponse, (__bridge void*)payload); + NSError *error = nil; + NSData *jsonData = [NSJSONSerialization dataWithJSONObject:payload options:0 error:&error]; + if (!error) { + NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; + didReceiveNotificationResponse([jsonString UTF8String]); } completionHandler(); From 7757eae7452f232bbc81a790743d242c2884c16c Mon Sep 17 00:00:00 2001 From: popaprozac Date: Sat, 22 Feb 2025 19:05:00 -0800 Subject: [PATCH 022/374] standalone example --- .../frontend/Inter Font License.txt | 93 ++++++++++ .../v3/pkg/services/notifications/index.js | 0 .../v3/pkg/services/notifications/models.js | 0 .../v3/pkg/services/notifications/service.js | 2 + .../frontend/dist/Inter-Medium.ttf | Bin 0 -> 315132 bytes .../frontend/dist/assets/index-CS0sRFez.js | 6 + .../notifications/frontend/dist/index.html | 29 ++++ .../frontend/dist/javascript.svg | 1 + .../notifications/frontend/dist/style.css | 160 ++++++++++++++++++ .../notifications/frontend/dist/wails.png | Bin 0 -> 9057 bytes v3/examples/notifications/frontend/index.html | 29 ++++ v3/examples/notifications/frontend/main.js | 50 ++++++ .../notifications/frontend/package.json | 16 ++ .../frontend/public/Inter-Medium.ttf | Bin 0 -> 315132 bytes .../frontend/public/javascript.svg | 1 + .../notifications/frontend/public/style.css | 160 ++++++++++++++++++ .../notifications/frontend/public/wails.png | Bin 0 -> 9057 bytes v3/examples/notifications/main.go | 135 +++++++++++++++ v3/examples/services/assets/index.html | 7 - v3/examples/services/main.go | 2 - 20 files changed, 682 insertions(+), 9 deletions(-) create mode 100644 v3/examples/notifications/frontend/Inter Font License.txt rename v3/examples/{services/assets => notifications/frontend}/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/index.js (100%) rename v3/examples/{services/assets => notifications/frontend}/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/models.js (100%) rename v3/examples/{services/assets => notifications/frontend}/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/service.js (95%) create mode 100644 v3/examples/notifications/frontend/dist/Inter-Medium.ttf create mode 100644 v3/examples/notifications/frontend/dist/assets/index-CS0sRFez.js create mode 100644 v3/examples/notifications/frontend/dist/index.html create mode 100644 v3/examples/notifications/frontend/dist/javascript.svg create mode 100644 v3/examples/notifications/frontend/dist/style.css create mode 100644 v3/examples/notifications/frontend/dist/wails.png create mode 100644 v3/examples/notifications/frontend/index.html create mode 100644 v3/examples/notifications/frontend/main.js create mode 100644 v3/examples/notifications/frontend/package.json create mode 100644 v3/examples/notifications/frontend/public/Inter-Medium.ttf create mode 100644 v3/examples/notifications/frontend/public/javascript.svg create mode 100644 v3/examples/notifications/frontend/public/style.css create mode 100644 v3/examples/notifications/frontend/public/wails.png create mode 100644 v3/examples/notifications/main.go diff --git a/v3/examples/notifications/frontend/Inter Font License.txt b/v3/examples/notifications/frontend/Inter Font License.txt new file mode 100644 index 000000000..b525cbf3a --- /dev/null +++ b/v3/examples/notifications/frontend/Inter Font License.txt @@ -0,0 +1,93 @@ +Copyright 2020 The Inter Project Authors (https://github.com/rsms/inter) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/v3/examples/services/assets/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/index.js b/v3/examples/notifications/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/index.js similarity index 100% rename from v3/examples/services/assets/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/index.js rename to v3/examples/notifications/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/index.js diff --git a/v3/examples/services/assets/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/models.js b/v3/examples/notifications/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/models.js similarity index 100% rename from v3/examples/services/assets/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/models.js rename to v3/examples/notifications/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/models.js diff --git a/v3/examples/services/assets/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/service.js b/v3/examples/notifications/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/service.js similarity index 95% rename from v3/examples/services/assets/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/service.js rename to v3/examples/notifications/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/service.js index 5c91a1c77..8fb7eff96 100644 --- a/v3/examples/services/assets/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/service.js +++ b/v3/examples/notifications/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/service.js @@ -30,6 +30,7 @@ export function RegisterNotificationCategory(category) { } /** + * RemoveAllDeliveredNotifications removes all delivered notifications * @returns {Promise & { cancel(): void }} */ export function RemoveAllDeliveredNotifications() { @@ -47,6 +48,7 @@ export function RemoveAllPendingNotifications() { } /** + * RemoveDeliveredNotification removes a specific delivered notification * @param {string} identifier * @returns {Promise & { cancel(): void }} */ diff --git a/v3/examples/notifications/frontend/dist/Inter-Medium.ttf b/v3/examples/notifications/frontend/dist/Inter-Medium.ttf new file mode 100644 index 0000000000000000000000000000000000000000..a01f3777a6fc284b7a720c0f8248a27066389ef9 GIT binary patch literal 315132 zcmd>{3Ajzw|M0(S?X!n-?sds<&AMdHJY`De%rlit*Gxz*k|ZQaMWm8sCL|H5Orgje zLX;sYN}^G@hWmcjK4)L_tKaY+-sgFr_ul8T*4k_QuJ8KpwfA0opS?wiNG6<+$lZ18 z)h}DV>>3eWoroNFw`kt_=)7a6M2)O0s^ph46$l{1e>k6gWyQwEyWNY9Gz_3HOX&vyAf z)S{Q>5MAJ8?;gqBOFo}`FX>%Kuhg4}e4BH=#y0Xu!QTA`56g7y>@Ol2dy5p=(eJ@- z$>AZbE{NPwf$hEhlZOqA#4CsVv?oaelKb~){O#aW5vPqvIP<^B5&SN zzrXqG{ycsElt;op`!QDN*v#5b&hDJC`frju&adR?&uep=z_GS14*mY-l@WRR#%E^J z5gn_;)b6n*lGS$$ihj6P@4+ggNJ_r}gHSL1OfsF!hHQL}O9s)M+nsb6q^Qx|dn(6vPA zI=TUFBi#nKoleH>rm-LWq<#hWRsAaNOuY_wquz}Bk=}y4L+`}htv|#4+^Q|gs%JIC zZDKuyJJ=e6`-n9Tcf7Rn$I0&?vs26| zhFiiZfm_XC?3_kUBivR_Pu$*4Z`=o*2XF^C18^U9hKc1o;ygllxHE$A80QJxxz0jS zuIEyxThJ|tTgUBy+u7}m`?&iA?o;klxKF!J<38g~!kywy!JX<(#hvD&2lrK%QFa%* zi*es@m*OsSm*cK3;-OD(xHp{e)}Vk zj}jgoW^}?YgkQj&9-fZ-es~?J8^W6i?+WiGygz&h_el5{?w4U|4u2c|7WaG@4Tpb< z&3F~`P%|^Jmxw&?#K*!)a@fDd!depS)3LB6rR?`&;m{3vY^h|U1HT@J_`b2QD{bt= zSlAQKPKbrWk`y{03&#=O6AQ=R5YC{ItYxwI1gT)5Z@>Ob60rux!na7g)jbx@d_A7& zF41ZhjaN$YSmk12Emid&v9Kle_1m#?vid~S~a&&R@fB%ch5h4XS)iH$F^BublD{H+{eYRAG!9CZrB!ugRWM=V@`kdUjN zBuh7WfLsk_FyVgEhwba}^<)_FgGi|@50cvbPdWcF{jc){v8|mem2h13VpUJrSMT9Ty>3?!}(7+ojH-SDu#-J4JfsYA$L->-WxHJI`PNg0eR zrk)%OnM*bDYd9+u%CMXc}>W)X;S;MZTi-o7KTVyUt%M{ zpqpyy=F2mb5@zI$)P2a=gfb8NwcIE}lbcEgd7JyvnwADob^xWW$D|N5?1t^0zAS_O zQtAi&vUMquf)xFc*ywzS->W{9Gc5#~G(9rbkmBnx1>HsEAMVR+MkEQ{8BLp>rLbir zGrCS9&XgYD_t!`p9oeqL4kG72YyWz`jLr6f!IZesh8y~=80{Nt9gJqGN@@O6kj9Lc zv5gcd1xCxI{5E@$-W-c)!v1aS(MVgL6eDkvv?kP((8K7#*oWzf$r0U;dyvc6hZ(zQ zpG@0PYchFTv)7wZyDs_ln$4cljk3`iN|37^TSfn*nUt7Tjja8l6mAc+*oxXs%n;lp+B0Ju?NN%a&mjNx zQA%QOYv@ZAwTBy1qIx#6N9RXVm)WNV`Ln4R6=O?*1lLQJyvZW|tkd#HTL!IG;ff$? zK_%HvmWsrckxH~t1`Xbrs}-Zz6sjSqu?f?oo7-qboY_;%TtDcBTuC=cQU@IjWS%m1 z7|f>SXw48EVPi4Z+enfY7y8oNVG@2$=8*Bb|Yth z#wE~FX<80?P)sDQpt&yPN^GUn|6ii|e_rpkJ?_f1l28#`I0oDP{d)d+`M8MGzY({b zoVDP42V>h{^2j=f$(R9Lo&d7Uiy12EF<#m^3% zk;mAc3tNaQ3?C4lt$)Av9sZ_hKH0z`#ŹD@)<7ltOtn$SSm;LMTrPEA?sR43d= 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�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 literal 0 HcmV?d00001 diff --git a/v3/examples/notifications/frontend/dist/assets/index-CS0sRFez.js b/v3/examples/notifications/frontend/dist/assets/index-CS0sRFez.js new file mode 100644 index 000000000..297ce49b9 --- /dev/null +++ b/v3/examples/notifications/frontend/dist/assets/index-CS0sRFez.js @@ -0,0 +1,6 @@ +(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const r of document.querySelectorAll('link[rel="modulepreload"]'))o(r);new MutationObserver(r=>{for(const s of r)if(s.type==="childList")for(const l of s.addedNodes)l.tagName==="LINK"&&l.rel==="modulepreload"&&o(l)}).observe(document,{childList:!0,subtree:!0});function n(r){const s={};return r.integrity&&(s.integrity=r.integrity),r.referrerPolicy&&(s.referrerPolicy=r.referrerPolicy),r.crossOrigin==="use-credentials"?s.credentials="include":r.crossOrigin==="anonymous"?s.credentials="omit":s.credentials="same-origin",s}function o(r){if(r.ep)return;r.ep=!0;const s=n(r);fetch(r.href,s)}})();let L="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict",O=(t=21)=>{let e="",n=t|0;for(;n--;)e+=L[Math.random()*64|0];return e};const _=window.location.origin+"/wails/runtime",h={Call:0,Events:3,ContextMenu:4,Dialog:5,Window:6,Browser:9,CancelCall:10};let k=O();function w(t,e){return function(n,o=null){return W(t,n,e,o)}}async function W(t,e,n,o){let r=new URL(_);t!=null&&r.searchParams.append("object",t),e!=null&&r.searchParams.append("method",e);let s={headers:{}};n&&(s.headers["x-wails-window-name"]=n),o&&r.searchParams.append("args",JSON.stringify(o)),s.headers["x-wails-client-id"]=k;let l=await fetch(r,s);if(!l.ok)throw new Error(await l.text());return l.headers.get("Content-Type")&&l.headers.get("Content-Type").indexOf("application/json")!==-1?l.json():l.text()}const P=(()=>{var t,e,n;try{if((t=window==null?void 0:window.chrome)!=null&&t.webview)return o=>window.chrome.webview.postMessage(o);if((n=(e=window==null?void 0:window.webkit)==null?void 0:e.messageHandlers)!=null&&n.external)return o=>window.webkit.messageHandlers.external.postMessage(o)}catch{console.warn(` +%c⚠️ Browser Environment Detected %c + +%cOnly UI previews are available in the browser. For full functionality, please run the application in desktop mode. +More information at: https://v3.wails.io/learn/build/#using-a-browser-for-development +`,"background: #ffffff; color: #000000; font-weight: bold; padding: 4px 8px; border-radius: 4px; border: 2px solid #000000;","background: transparent;","color: #ffffff; font-style: italic; font-weight: bold;")}return null})();function E(t){if(P)return P(t)}function H(){return window._wails.environment.OS==="windows"}function B(){return window._wails.environment.Debug===!0}window.addEventListener("contextmenu",Y);const U=w(h.ContextMenu,""),$=0;function Z(t,e,n,o){U($,{id:t,x:e,y:n,data:o})}function Y(t){let e=t.target,n=window.getComputedStyle(e).getPropertyValue("--custom-contextmenu");if(n=n?n.trim():"",n){t.preventDefault();let o=window.getComputedStyle(e).getPropertyValue("--custom-contextmenu-data");Z(n,t.clientX,t.clientY,o);return}j(t)}function j(t){if(B())return;const e=t.target;switch(window.getComputedStyle(e).getPropertyValue("--default-contextmenu").trim()){case"show":return;case"hide":t.preventDefault();return;default:if(e.isContentEditable)return;const r=window.getSelection(),s=r.toString().length>0;if(s)for(let l=0;lt.target.clientWidth||t.offsetY>t.target.clientHeight)return;p=!0}else p=!1}function V(){p=!1}function u(t){document.documentElement.style.cursor=t||G,S=t}function q(t){if(p&&(p=!1,(t.buttons!==void 0?t.buttons:t.which)>0)){E("wails:drag");return}if(!z||!H())return;let e=x("system.resizeHandleHeight")||5,n=x("system.resizeHandleWidth")||5,o=x("resizeCornerExtra")||10,r=window.outerWidth-t.clientXoe(type,{"call-id":e});let o=!1,r=!1,s=new Promise((l,a)=>{t["call-id"]=e,y.set(e,{resolve:l,reject:a}),ne(te,t).then(c=>{if(r=!0,o)return n()}).catch(c=>{a(c),y.delete(e)})});return s.cancel=()=>{if(r)return n();o=!0},s}function R(t,...e){return ae({methodID:t,args:e})}window._wails=window._wails||{};window._wails.dialogErrorCallback=we;window._wails.dialogResultCallback=he;const ce=2,ue=3,de=w(h.Dialog,""),f=new Map;function fe(){let t;do t=O();while(f.has(t));return t}function I(t,e={}){const n=fe();return e["dialog-id"]=n,new Promise((o,r)=>{f.set(n,{resolve:o,reject:r}),de(t,e).catch(s=>{r(s),f.delete(n)})})}function he(t,e,n){let o=f.get(t);o&&(f.delete(t),n?o.resolve(JSON.parse(e)):o.resolve(e))}function we(t,e){let n=f.get(t);n&&(f.delete(t),n.reject(new me(e)))}const me=t=>I(ce,t),ge=t=>I(ue,t);window._wails=window._wails||{};window._wails.dispatchWailsEvent=Ce;const pe=w(h.Events,""),Me=0,d=new Map;class be{constructor(e,n,o){this.eventName=e,this.maxCallbacks=o||-1,this.Callback=r=>(n(r),this.maxCallbacks===-1?!1:(this.maxCallbacks-=1,this.maxCallbacks===0))}}class ye{constructor(e,n=null){this.name=e,this.data=n}}function Ce(t){let e=d.get(t.name);if(e){let n=e.filter(o=>{if(o.Callback(t))return!0});n.length>0&&(e=e.filter(o=>!n.includes(o)),e.length===0?d.delete(t.name):d.set(t.name,e))}}function Ee(t,e,n){let o=d.get(t)||[];const r=new be(t,e,n);return o.push(r),d.set(t,o),()=>Se(r)}function N(t,e){return Ee(t,e,-1)}function Se(t){const e=t.eventName;let n=d.get(e).filter(o=>o!==t);n.length===0?d.delete(e):d.set(e,n)}function ve(t){return pe(Me,t)}const Re=0,xe=1,Oe=2,Te=3,Pe=4,ze=5,De=6,Ie=7,Ne=8,Ae=9,Fe=10,Le=11,_e=12,ke=13,We=14,He=15,Be=16,Ue=17,$e=18,Ze=19,Ye=20,je=21,Ge=22,Je=23,Xe=24,Ve=25,qe=26,Ke=27,Qe=28,et=29,tt=30,nt=31,ot=32,rt=33,it=34,st=35,lt=36,at=37,ct=38,ut=39,dt=40,ft=41,ht=42,wt=43,mt=44,gt=45,pt=46,Mt=47,i=Symbol();class v{constructor(e=""){this[i]=w(h.Window,e);for(const n of Object.getOwnPropertyNames(v.prototype))n!=="constructor"&&typeof this[n]=="function"&&(this[n]=this[n].bind(this))}Get(e){return new v(e)}Position(){return this[i](Re)}Center(){return this[i](xe)}Close(){return this[i](Oe)}DisableSizeConstraints(){return this[i](Te)}EnableSizeConstraints(){return this[i](Pe)}Focus(){return this[i](ze)}ForceReload(){return this[i](De)}Fullscreen(){return this[i](Ie)}GetScreen(){return this[i](Ne)}GetZoom(){return this[i](Ae)}Height(){return this[i](Fe)}Hide(){return this[i](Le)}IsFocused(){return this[i](_e)}IsFullscreen(){return this[i](ke)}IsMaximised(){return this[i](We)}IsMinimised(){return this[i](He)}Maximise(){return this[i](Be)}Minimise(){return this[i](Ue)}Name(){return this[i]($e)}OpenDevTools(){return this[i](Ze)}RelativePosition(){return this[i](Ye)}Reload(){return this[i](je)}Resizable(){return this[i](Ge)}Restore(){return this[i](Je)}SetPosition(e,n){return this[i](Xe,{x:e,y:n})}SetAlwaysOnTop(e){return this[i](Ve,{alwaysOnTop:e})}SetBackgroundColour(e,n,o,r){return this[i](qe,{r:e,g:n,b:o,a:r})}SetFrameless(e){return this[i](Ke,{frameless:e})}SetFullscreenButtonEnabled(e){return this[i](Qe,{enabled:e})}SetMaxSize(e,n){return this[i](et,{width:e,height:n})}SetMinSize(e,n){return this[i](tt,{width:e,height:n})}SetRelativePosition(e,n){return this[i](nt,{x:e,y:n})}SetResizable(e){return this[i](ot,{resizable:e})}SetSize(e,n){return this[i](rt,{width:e,height:n})}SetTitle(e){return this[i](it,{title:e})}SetZoom(e){return this[i](st,{zoom:e})}Show(){return this[i](lt)}Size(){return this[i](at)}ToggleFullscreen(){return this[i](ct)}ToggleMaximise(){return this[i](ut)}UnFullscreen(){return this[i](dt)}UnMaximise(){return this[i](ft)}UnMinimise(){return this[i](ht)}Width(){return this[i](wt)}Zoom(){return this[i](mt)}ZoomIn(){return this[i](gt)}ZoomOut(){return this[i](pt)}ZoomReset(){return this[i](Mt)}}const bt=new v("");function yt(){if(!EventTarget||!AbortSignal||!AbortController)return!1;let t=!0;const e=new EventTarget,n=new AbortController;return e.addEventListener("test",()=>{t=!1},{signal:n.signal}),n.abort(),e.dispatchEvent(new CustomEvent("test")),t}document.addEventListener("DOMContentLoaded",()=>!0);function Ct(t,e=null){ve(new ye(t,e))}function Et(t,e){const n=bt.Get(t),o=n[e];if(typeof o!="function"){console.error(`Window method '${e}' not found`);return}try{o.call(n)}catch(r){console.error(`Error calling window method '${e}': `,r)}}function St(t){const e=t.currentTarget;function n(r="Yes"){if(r!=="Yes")return;const s=e.getAttribute("data-wml-event"),l=e.getAttribute("data-wml-target-window")||"",a=e.getAttribute("data-wml-window"),c=e.getAttribute("data-wml-openURL");s!==null&&Ct(s),a!==null&&Et(l,a),c!==null&&ee(c)}const o=e.getAttribute("data-wml-confirm");o?ge({Title:"Confirm",Message:o,Detached:!1,Buttons:[{Label:"Yes"},{Label:"No",IsDefault:!0}]}).then(n):n()}const C=Symbol();class vt{constructor(){this[C]=new AbortController}set(e,n){return{signal:this[C].signal}}reset(){this[C].abort(),this[C]=new AbortController}}const b=Symbol(),g=Symbol();class Rt{constructor(){this[b]=new WeakMap,this[g]=0}set(e,n){return this[g]+=!this[b].has(e),this[b].set(e,n),{}}reset(){if(!(this[g]<=0)){for(const e of document.body.querySelectorAll("*")){if(this[g]<=0)break;const n=this[b].get(e);this[g]-=typeof n<"u";for(const o of n||[])e.removeEventListener(o,St)}this[b]=new WeakMap,this[g]=0}}}yt()?new vt:new Rt;window._wails=window._wails||{};let A=!1;function xt(){window._wails.invoke=E,E("wails:runtime:ready"),A=!0}window.addEventListener("load",()=>{A||xt()});function Ot(t){return R(2679064664,t)}function F(){return R(3412125712)}function Tt(t,e,n,o){return R(2246903123,t,e,n,o)}function Pt(t){return R(1615199806,t)}const zt=document.getElementById("time"),Dt=document.getElementById("notifications");window.sendNotification=async()=>{await F()&&await Tt("some-uuid-fronted","Frontend Notificaiton","","Notificaiton sent through JS!")};window.sendComplexNotification=async()=>{await F()&&(await Ot({id:"FRONTEND_NOTIF",actions:[{id:"VIEW_ACTION",title:"View"},{id:"MARK_READ_ACTION",title:"Mark as Read"},{id:"DELETE_ACTION",title:"Delete",destructive:!0}],hasReplyField:!0,replyButtonTitle:"Reply",replyPlaceholder:"Reply to frontend..."}),await Pt({id:"some-uuid-complex",title:"Complex Frontend Notification",subtitle:"From: Jane Doe",body:"Is it rainging today where you are?",categoryId:"FRONTEND_NOTIF",data:{messageId:"msg-456",senderId:"user-456",timestamp:Date.now()}}))};N("time",t=>{zt.innerText=t.data});N("notificationResponse",t=>{Dt.innerText+=JSON.stringify(t.data[0].data)}); diff --git a/v3/examples/notifications/frontend/dist/index.html b/v3/examples/notifications/frontend/dist/index.html new file mode 100644 index 000000000..39216bd8d --- /dev/null +++ b/v3/examples/notifications/frontend/dist/index.html @@ -0,0 +1,29 @@ + + + + + + + + Wails App + + + + + + diff --git a/v3/examples/notifications/frontend/dist/javascript.svg b/v3/examples/notifications/frontend/dist/javascript.svg new file mode 100644 index 000000000..f9abb2b72 --- /dev/null +++ b/v3/examples/notifications/frontend/dist/javascript.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v3/examples/notifications/frontend/dist/style.css b/v3/examples/notifications/frontend/dist/style.css new file mode 100644 index 000000000..127799eda --- /dev/null +++ b/v3/examples/notifications/frontend/dist/style.css @@ -0,0 +1,160 @@ +:root { + font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", + "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", + sans-serif; + font-size: 16px; + line-height: 24px; + font-weight: 400; + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: rgba(27, 38, 54, 1); + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +* { + user-select: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; +} + +@font-face { + font-family: "Inter"; + font-style: normal; + font-weight: 400; + src: local(""), + url("./Inter-Medium.ttf") format("truetype"); +} + +h3 { + font-size: 3em; + line-height: 1.1; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} + +a:hover { + color: #535bf2; +} + +button { + /* width: 60px; */ + height: 30px; + line-height: 30px; + border-radius: 3px; + border: none; + margin: 0 0 0 20px; + padding: 0 8px; + cursor: pointer; +} + +.result { + height: 20px; + line-height: 20px; +} + +body { + margin: 0; + display: flex; + place-items: center; + place-content: center; + min-width: 320px; + min-height: 100vh; +} + +.container { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +#app { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; +} + +.logo:hover { + filter: drop-shadow(0 0 2em #e80000aa); +} + +.logo.vanilla:hover { + filter: drop-shadow(0 0 2em #f7df1eaa); +} + +.result { + height: 20px; + line-height: 20px; + margin: 1.5rem auto; + text-align: center; +} + +.footer { + margin-top: 1rem; + align-content: center; + text-align: center; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + + a:hover { + color: #747bff; + } + + button { + background-color: #f9f9f9; + } +} + + +.input-box .btn:hover { + background-image: linear-gradient(to top, #cfd9df 0%, #e2ebf0 100%); + color: #333333; +} + +.input-box .input { + border: none; + border-radius: 3px; + outline: none; + height: 30px; + line-height: 30px; + padding: 0 10px; + color: black; + background-color: rgba(240, 240, 240, 1); + -webkit-font-smoothing: antialiased; +} + +.input-box .input:hover { + border: none; + background-color: rgba(255, 255, 255, 1); +} + +.input-box .input:focus { + border: none; + background-color: rgba(255, 255, 255, 1); +} \ No newline at end of file diff --git a/v3/examples/notifications/frontend/dist/wails.png b/v3/examples/notifications/frontend/dist/wails.png new file mode 100644 index 0000000000000000000000000000000000000000..8bdf424833bfb5b6b34a0807224e94533f738f2e GIT binary patch literal 9057 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 + + + + + + + Wails App + + +
    + +

    Wails + Javascript

    + +
    + + + diff --git a/v3/examples/notifications/frontend/main.js b/v3/examples/notifications/frontend/main.js new file mode 100644 index 000000000..54c03e560 --- /dev/null +++ b/v3/examples/notifications/frontend/main.js @@ -0,0 +1,50 @@ +import * as Notifications from "./bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/service"; +import { Events } from "@wailsio/runtime"; + +const timeElement = document.getElementById('time'); +const notificationsElement = document.getElementById('notifications'); + +window.sendNotification = async () => { + const granted = await Notifications.RequestUserNotificationAuthorization(); + if (granted) { + await Notifications.SendNotification("some-uuid-fronted", "Frontend Notificaiton", "", "Notificaiton sent through JS!"); + } +} + +window.sendComplexNotification = async () => { + const granted = await Notifications.RequestUserNotificationAuthorization(); + if (granted) { + await Notifications.RegisterNotificationCategory({ + id: "FRONTEND_NOTIF", + actions: [ + { id: "VIEW_ACTION", title: "View" }, + { id: "MARK_READ_ACTION", title: "Mark as Read" }, + { id: "DELETE_ACTION", title: "Delete", destructive: true }, + ], + hasReplyField: true, + replyButtonTitle: "Reply", + replyPlaceholder: "Reply to frontend...", + }); + + await Notifications.SendNotificationWithActions({ + id: "some-uuid-complex", + title: "Complex Frontend Notification", + subtitle: "From: Jane Doe", + body: "Is it rainging today where you are?", + categoryId: "FRONTEND_NOTIF", + data: { + messageId: "msg-456", + senderId: "user-456", + timestamp: Date.now(), + } + }); + } +} + +Events.On('time', (time) => { + timeElement.innerText = time.data; +}); + +Events.On("notificationResponse", (response) => { + notificationsElement.innerText += JSON.stringify(response.data[0].data); +}); \ No newline at end of file diff --git a/v3/examples/notifications/frontend/package.json b/v3/examples/notifications/frontend/package.json new file mode 100644 index 000000000..9ae87549e --- /dev/null +++ b/v3/examples/notifications/frontend/package.json @@ -0,0 +1,16 @@ +{ + "name": "frontend", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build:dev": "vite build --minify false --mode development", + "build": "vite build --mode production", + "preview": "vite preview" + }, + "devDependencies": { + "vite": "^5.0.0", + "@wailsio/runtime": "latest" + } +} \ No newline at end of file diff --git a/v3/examples/notifications/frontend/public/Inter-Medium.ttf b/v3/examples/notifications/frontend/public/Inter-Medium.ttf new file mode 100644 index 0000000000000000000000000000000000000000..a01f3777a6fc284b7a720c0f8248a27066389ef9 GIT binary patch literal 315132 zcmd>{3Ajzw|M0(S?X!n-?sds<&AMdHJY`De%rlit*Gxz*k|ZQaMWm8sCL|H5Orgje zLX;sYN}^G@hWmcjK4)L_tKaY+-sgFr_ul8T*4k_QuJ8KpwfA0opS?wiNG6<+$lZ18 z)h}DV>>3eWoroNFw`kt_=)7a6M2)O0s^ph46$l{1e>k6gWyQwEyWNY9Gz_3HOX&vyAf z)S{Q>5MAJ8?;gqBOFo}`FX>%Kuhg4}e4BH=#y0Xu!QTA`56g7y>@Ol2dy5p=(eJ@- z$>AZbE{NPwf$hEhlZOqA#4CsVv?oaelKb~){O#aW5vPqvIP<^B5&SN zzrXqG{ycsElt;op`!QDN*v#5b&hDJC`frju&adR?&uep=z_GS14*mY-l@WRR#%E^J z5gn_;)b6n*lGS$$ihj6P@4+ggNJ_r}gHSL1OfsF!hHQL}O9s)M+nsb6q^Qx|dn(6vPA zI=TUFBi#nKoleH>rm-LWq<#hWRsAaNOuY_wquz}Bk=}y4L+`}htv|#4+^Q|gs%JIC zZDKuyJJ=e6`-n9Tcf7Rn$I0&?vs26| zhFiiZfm_XC?3_kUBivR_Pu$*4Z`=o*2XF^C18^U9hKc1o;ygllxHE$A80QJxxz0jS zuIEyxThJ|tTgUBy+u7}m`?&iA?o;klxKF!J<38g~!kywy!JX<(#hvD&2lrK%QFa%* zi*es@m*OsSm*cK3;-OD(xHp{e)}Vk zj}jgoW^}?YgkQj&9-fZ-es~?J8^W6i?+WiGygz&h_el5{?w4U|4u2c|7WaG@4Tpb< z&3F~`P%|^Jmxw&?#K*!)a@fDd!depS)3LB6rR?`&;m{3vY^h|U1HT@J_`b2QD{bt= zSlAQKPKbrWk`y{03&#=O6AQ=R5YC{ItYxwI1gT)5Z@>Ob60rux!na7g)jbx@d_A7& zF41ZhjaN$YSmk12Emid&v9Kle_1m#?vid~S~a&&R@fB%ch5h4XS)iH$F^BublD{H+{eYRAG!9CZrB!ugRWM=V@`kdUjN zBuh7WfLsk_FyVgEhwba}^<)_FgGi|@50cvbPdWcF{jc){v8|mem2h13VpUJrSMT9Ty>3?!}(7+ojH-SDu#-J4JfsYA$L->-WxHJI`PNg0eR zrk)%OnM*bDYd9+u%CMXc}>W)X;S;MZTi-o7KTVyUt%M{ zpqpyy=F2mb5@zI$)P2a=gfb8NwcIE}lbcEgd7JyvnwADob^xWW$D|N5?1t^0zAS_O zQtAi&vUMquf)xFc*ywzS->W{9Gc5#~G(9rbkmBnx1>HsEAMVR+MkEQ{8BLp>rLbir zGrCS9&XgYD_t!`p9oeqL4kG72YyWz`jLr6f!IZesh8y~=80{Nt9gJqGN@@O6kj9Lc zv5gcd1xCxI{5E@$-W-c)!v1aS(MVgL6eDkvv?kP((8K7#*oWzf$r0U;dyvc6hZ(zQ zpG@0PYchFTv)7wZyDs_ln$4cljk3`iN|37^TSfn*nUt7Tjja8l6mAc+*oxXs%n;lp+B0Ju?NN%a&mjNx zQA%QOYv@ZAwTBy1qIx#6N9RXVm)WNV`Ln4R6=O?*1lLQJyvZW|tkd#HTL!IG;ff$? zK_%HvmWsrckxH~t1`Xbrs}-Zz6sjSqu?f?oo7-qboY_;%TtDcBTuC=cQU@IjWS%m1 z7|f>SXw48EVPi4Z+enfY7y8oNVG@2$=8*Bb|Yth z#wE~FX<80?P)sDQpt&yPN^GUn|6ii|e_rpkJ?_f1l28#`I0oDP{d)d+`M8MGzY({b zoVDP42V>h{^2j=f$(R9Lo&d7Uiy12EF<#m^3% zk;mAc3tNaQ3?C4lt$)Av9sZ_hKH0z`#ŹD@)<7ltOtn$SSm;LMTrPEA?sR43d= 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�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 literal 0 HcmV?d00001 diff --git a/v3/examples/notifications/frontend/public/javascript.svg b/v3/examples/notifications/frontend/public/javascript.svg new file mode 100644 index 000000000..f9abb2b72 --- /dev/null +++ b/v3/examples/notifications/frontend/public/javascript.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v3/examples/notifications/frontend/public/style.css b/v3/examples/notifications/frontend/public/style.css new file mode 100644 index 000000000..127799eda --- /dev/null +++ b/v3/examples/notifications/frontend/public/style.css @@ -0,0 +1,160 @@ +:root { + font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", + "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", + sans-serif; + font-size: 16px; + line-height: 24px; + font-weight: 400; + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: rgba(27, 38, 54, 1); + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +* { + user-select: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; +} + +@font-face { + font-family: "Inter"; + font-style: normal; + font-weight: 400; + src: local(""), + url("./Inter-Medium.ttf") format("truetype"); +} + +h3 { + font-size: 3em; + line-height: 1.1; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} + +a:hover { + color: #535bf2; +} + +button { + /* width: 60px; */ + height: 30px; + line-height: 30px; + border-radius: 3px; + border: none; + margin: 0 0 0 20px; + padding: 0 8px; + cursor: pointer; +} + +.result { + height: 20px; + line-height: 20px; +} + +body { + margin: 0; + display: flex; + place-items: center; + place-content: center; + min-width: 320px; + min-height: 100vh; +} + +.container { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +#app { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; +} + +.logo:hover { + filter: drop-shadow(0 0 2em #e80000aa); +} + +.logo.vanilla:hover { + filter: drop-shadow(0 0 2em #f7df1eaa); +} + +.result { + height: 20px; + line-height: 20px; + margin: 1.5rem auto; + text-align: center; +} + +.footer { + margin-top: 1rem; + align-content: center; + text-align: center; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + + a:hover { + color: #747bff; + } + + button { + background-color: #f9f9f9; + } +} + + +.input-box .btn:hover { + background-image: linear-gradient(to top, #cfd9df 0%, #e2ebf0 100%); + color: #333333; +} + +.input-box .input { + border: none; + border-radius: 3px; + outline: none; + height: 30px; + line-height: 30px; + padding: 0 10px; + color: black; + background-color: rgba(240, 240, 240, 1); + -webkit-font-smoothing: antialiased; +} + +.input-box .input:hover { + border: none; + background-color: rgba(255, 255, 255, 1); +} + +.input-box .input:focus { + border: none; + background-color: rgba(255, 255, 255, 1); +} \ No newline at end of file diff --git a/v3/examples/notifications/frontend/public/wails.png b/v3/examples/notifications/frontend/public/wails.png new file mode 100644 index 0000000000000000000000000000000000000000..8bdf424833bfb5b6b34a0807224e94533f738f2e GIT binary patch literal 9057 zcmZ8{2T)T_^llPD2O;#H(0d70YCAm-kK4IT%q3wO#f@cSkoyOv7UZbwtg0tZBfw$LE#=wo}a9o1+*;KVc5H$nWYB{gt6AL zun)38=LLlZSfCY5tUsU}*z^*}>D$@4yEwQ9x%qlnVC9UgTcV=aa2s$qws##4$D**b zMRZWCzaGl*nTiQ(V7scA*|0_#BMfV!Md06=*e3V|hk5u~*|@OGgN%$=e=s3sJQ+O} zJIyZ`MnpBj!>-3ySm3&-=ocDh6agi+tA>R= zh>&uWhyNP`YcV~vkdCF4i5<(2CGX|r!Nz@uPf^Xx*2~G;&B2pF$rwpO6MzS~zrSDn z5dMLfdX$&{0}&Ng-s`io{ocM*`u~*q3F8VTq>3P>j(tFTv9_K_!LabebRxfaT1q-g z3b9{QTy5=uo$RWM>*35yk*fBrqSBO->WYX6HeqZnu+^F37n~6g#FGCK5}p$j>f+$( zQxc=1fKv_x^ZS^Z06W9jqwSL^9c;| z@M8-%%*2FMFOQa`gdU1j3@dmCJ9jlRdn+4vG%3x2xOf=@YX}il7%??gnOth-I5Ily z@`!mrn@CQNom3yr+&9bl@OGr#JGm{&VR$^a(AD)J~MgUTa)%X)4Jl0k+YL*8qtU`=j*F3HA?6enK z%K8J_3zSm!CP(|V2iXCqqoVOwmlqdvQ{^E(PMVrW(TL;8v%g!b?kB%eUulbD&QA6> z2K%dmJSF(9u8y|5Y6{bZ7_R>PyEr}mvoYXqXJu(}b+9!(U6}O#$=xY>yeu!`YNNW; zR7vjl@0F$L_L>;Y;lcWX?Drj2-?E*qF1Ncg;@+QbuXjXi$z7f9>~0<&{NDE1`~7Qg zBWXQ*GXnsCnrW&iKK5Na$a2&-GNI~&W)UUV2G1Hizd_m+#eAf8E1G>KB``}vP5srF zj$g>DY_YWAqj7Eh-|Lm-zt^pH^I$L=%$6#_fLtVkpx3l&qZ92}w6pThV${F!kdvb@ zF75_lxKViBW2pf1sSsDw3?P)F{fBhU=edMA9dM2?u&Ic)So}F4`#%fyl~U)K z#R&U5!g0rzBl)6ZIToDt>!1so@x zm-!h7zZI|Z*R%9KXEMVe7pG>*=YAlj|GV2XbOz`kAb0{N5Rg{ za6QWT)TqWQpE4()iE(F{tsYvY_{i6GIXIlmTq~a0f>!Fi%4bJ0cuG=ls?!OQqQ%oaad-VdKmsp96EojkGw-a6|%c`_YE<%(!fxeMChl5|YQ zsD3Wzk|8a{%i`eU<0}RGeZXBZUYVPEzORPjDpBvuE<9vfefN5*NHbjh+3=+nptvVn z*8k#wo?I_($0Yr^5qav_H1hpuG!^AGFXi&9^;QaUqXj1Ek`fx<4oP}& z^vk2p5XH?;%%{$D7f=$m|Lr8Rhh6q;;_4iFFkj{M=X3NYlM1uOz}vm^{j;1S*>Tcw z=b+6LxcTEtRqgMpSSY{ET%iEzx=iYg{dpW~rpIqX^W{3HIibPnc><6;YdKftry- z9f}6jNtWjWVvIh5TD!K?Hm8<`%Ruv@rh*6hEGQU5V1KM8in`8W>@iL=W-Y7g1(P9o zK93H{&;Q}%!afJd<|Y{g|z-jrf9JkJGB93Ji0nu zUjEG&rk%k|1lffF;2^2dw4$*=P%s}r5b+N!^V4F5?-L>(N?aNLwZo(<-;#G={gM|) ze0l6`kYw8sKqW8b}#x)>q%e@p6r|#;Y?h;aV7hAM&}-p>ZN_jtKlMK~%&8%=p}NVrY}+_9_55e1PD0|3{!ruU%22P->^6 zbAIs~CLE?s3Bov&_A8oi9RzW33fN7x?&pU=H=BSKQQ%2N-G(UWaT)8UwI#MmT@(kT z#02zmZ%>C%Uw|Vu8TbMmSa-}BOm_K|d2M^H<@o8|NGg-*(^VDq0y`c+cjjjapu*VO z{0HU<#mKni)gHBm#;pE+Bq~ax`#EK}(fe zkw+z+Z^U{Jj0yE?9EXZSxOFmW9jA(H`n(Sn0s|)UdLE_zT@aIF{i3cvF7SzK9Fglx z9NGW9u+Z)g8Q`$xrw=0Vz2p(j0tozciEdwKzBbB(dn9Apt)`U)?|z4ofkDWuLEpdt z*w%TNn3%||Jzwp9gzoVF_xHb*+!6BArw_*hE$fLn3PoqP{PdawUr9&*%a>`#mp@;G z244MjLg8O+{*x#KA;?dZgAHZt29_mVDX*15Bp<5rJ(*&CRus{eu6j zY~uC&!kjf^jwsse$c$|y;=I-e`G)m-N0K}QX=qWHQUH~$(zD8^wl+66x9C6NDHr8R ztSTKuUR|Y1{2K&XHC;hc^i%{4OkD5H5r?Lr9bKj1D2Q(i5e_-K{wNu6_H!xkHwbI6 zCk&}+y)A!p=RbSo@2K;Zo)Af>I3pQ%l1ZFD+UC0aT4SZIFH7>yH&`3|0#FShkk!|y zG>kxU5U4YNZ%X2z{h0n(xi-r-bC2&Nm`F&;EM9OoB@-kt3-k?PX;9@;#VE)IP}~fM z@Zd)<>Q9o}vXgh8+OUhnQhdH1FrWN6Y@V3@RE^*TK&D|pC(~`K6mWF&VXm` z4PB5_Te_$4y>Hi>#WO@D%OTBmvnS%xc-`RKD~Rz}kZ*7g)BK>M z2;z+{vu04eIY|MMsIpQEU~1u~gm`U_FMk;ehJ#cCOqJtc`<(Ni*ZAU;7$a^rrA3s_ z*%A=`&dU;-qy|7!62O|#TUjC zW7N=I{^lg0VGs&^o5|&k6jcfSn59KnFN8Z=34j9%ong;IpQ0{>M;eE5nw0=ANEJ~5 z5H*w^C=SMSZ~wDRhk+0z@9)j`Je1i|g&c;Ln@8 z8gmjb3{>#Sg+;oKYz|0tFp;nBrliz)wB~;yVBX|;yxtQ{BN!DMyV@eVh3-h^PfSR7 z099yyQ2XxsqM@PT@>E?#wXmpYd-8~Vg9B|hymnco3dXP^{Z+vfu%|nQdoQ{f*nk>( zl>l-`hDF=zryoH$H@CMS2?m{iF3W!Z{?f}GRavwsg()mc2^_Qr-d-^Sf?*e2;gAwf zO0{6lnz_3V08WX`PH8+CjrBXib;^V_MwTm!j-8Jv;mno+xN&fGdSPrDOAL0C=|Pgl z<51y{+ewn{H7#cK`j$TdkU!piK_VLbyHve_qx9}(Q8oaACmi-G)Ros8E@PhE9Bn-_ zE%(NZXUCoBq19t|9A*}40EF<{_6P(xSRVRJp!35Eh%qo?z%7|kuvc0&u7yapb-?bo z19uL-@#!`UX&72XY8xfu4IivdYZ^Xl@F6h_mVQke@(#Oyd`z>@d-uidEfLjEIuQyO6V9$`} zCGT_s-bKkezpM{K8{lm9fx25B(Bvv4{NQAr=Nh(-t|V|%ZTkzn3!;$UH2qR8z;&l6 zOnGiaRgmjq=ykZ#;!J2i2&^`-_LfcNXvgcI%E1Rv$goTt>S^ldKTW4Ov~q}nk4ry{>UycMKdJ{**Kl?Km3=}|CNAV^^_R^|CacufVL zKYT%YV(ccCm<3qV8nDBjJFj6`sv;Y-RGT!hCN539S@G!BpyAhKrYZHvptJT-_B#}P zvs)gOmqojJdG4mcI37iyA!=qFsp5cHb;t-3c2%f#>?`3vVu4hfbyCU+b7}~0cT?s1 zEYx#1AdD9AN{2T^0PH;*{ArDptrWVIQM4Xom0}0)g)4xHmaQJIC#9tBS~XSX9&!MF zcM5@~x2XR)O}Vb!`D=x>inf2V8z7B{)wS6kn3I{$baT8q$yw_0o@j2q#1wU`ogYz4 zMnHVk02=J%GX71OnGP>)g15@EBUH5U)%s)S9jCfDotUYKjDx>?92Q?1@;)Y8tl6C} z5FBu$c;y7KDx|W~J+7AIq-#3O#_mZ2zcwqw2nfgh{BUJO?UNRf;Bs)9V}045JWbOk z|2Z^Wf3K}dsJiL=gE6sMiH=FRe5%|iXcqMXGFG^MkgTGtiyiE{hXbj3`v!kr zC?m9oS98fmufu~SFJC+6`O_te0~~M=G+saCDT09l#$rjN&(zT!HdIg1UH71t!WZRP zv;ePGsHf7Pr|NA7etl^HAPp7dmUZS@LGU>wgAOS#h8{Hu%G!IbXQr0FVE^*aQ%E zDl+fUgYo_`yLnzZ*&RvP)$(@yC7uH2mZru@{-DW3SchpHPaMBHkXu?FG^-+D9FM6V z6(4CpPr!+GX-=lYWoc`jNnX*Uup*11)8(^v!ZD@smWnP1f**v`9K^^KWvLU^rtuqN zjCYC05Yv*p_0Qcj+JMl%i3?v(A~jSVf2h68$HYOqpMM;V?g)yQ9!nh)=WaUHu6c5D z$ij58hvJSoU_5=s!kcVIwDgsp3dVs9%R%V{@QHhYyy2#y9^|l%okU!+*cV68 zo&}=>d4iCiSwz*i1cY&<2x-K_D)xhKURDr$hYX|TYll|6mwuEk{6WuOv8JPTJs;2v zKNaR;i?RgC=6ePl1GDMC5#}TnUYlj3;!+JZqSI%(yFVk`qNCYJRV9DfB8Ocv2kqmV zNk1l?jm|{q4U#E5l$8jpqi`#E0GM&eaH&B<$mxY#T zEM_Mo`Osw(62!5Q*OF5@KGWvUh`R8X%V{k3p5WPpn8U(Yi4s6LaF z+g)xVrJt-O=g9h>!lpMh z8s~v2_9UpBF7RhZ9M&=AkfyFeo=Z6vLH8PJ7**|M!7-yuF@EE)Mc<3T?|CxGc2I)- zJ^AnO!I6Mt8&x?d#->dhVsETgAaETda!m*g$3z&p5UiybKf`A`I@G3};(NL{uBME#uD1p<6>Z4@aUHo?b$MY{|D;CfpL2HP=hUWs1SxD;Xci7IE#-?tvw0qJC_3E4~jume(Ui~cT=|sNf_EbgKg>W^#J|_s6y;k>* zV}ti6_5PdmqpmW>b+HJkc1l_4ynMCZX!p$YBAE_Ia#}UtQ>h^uSi9KfM`=-50b_B+ zihJ?=9_vZp9`QQVeJpJ`Q#U>TR7F^=xxaBi+vr2?UVf*f>chU5{r=9Y9^dh< zJ$m+7Wm{id)wb?yylk!Mbys=k@wyzW=c}7Y?s>B}$dnI%GaS##T5g6RdsGLnIKt%N z8rYkE9bFtVkWb{@e<5dEq)EW%3xD}@XY;q(q5rx9LG!GW25W}(;7IgK*rZ^X_093w zQYx=tCy|&=jqIp+cnptzl@W1`hv(NNk)zN0T9P+!yTfm~H~6oH-ILmryUaHCHCLN55=lGO`&jwl90c~$foHe!4jiqrK%qNLwfq5PgH`Ud(u5Q5= zBe0ua-bIe#RzjrB_21mB<6oaw#vts*g6)z8Dp$l6hAE;dpO1>qoX_jew0p>dJqmoJ zo*t4Y1#}10d;5MNp2RS$XN!$^Kkj!5wah-)Gwuz8-W&heMjVf+w!i1(o|kvX_```# z4PVf!^NaX?F%#3XS*18ujFif9tdB+I801UAXK=-S2FA+a*+TX5YF{u}%LOTx82dxShG zqKZm;o8y_YH($=7JSMGaX{!K3(c!Q`WN9jsA zfX9QjQKEA2FYARsaffDLkE#4-4{diSbg))M;mhHxSgRdR2E3R7a6tViFlLv~)4*(6{in=iep6*w;| zJ4Qz6&1N)Bc+Pc`mPJeMAHdx2iP-r73goy++ZeJ~W-5JKpuWtsm;hb3DcUv-V0Mb@ zGq+p{h8kOP2FM}$4peMbhg2|CMyuk*vBC`3D}^pYQ_+rR$zLtroo1o&9p*RG8AeZR zYM`=`Z;g+bFYQeppt-``IVrsH-Y-e}vdSOm?|6gE=rl51qR83iBl+#mxeS?h|50ne~Q? zwhVX$I(plq2Q#7<#xg(M>Z4668r-86#=IoHZ_6}Z9msvLz5ZQzHe69QMYaR_Hx{Tl zE;7wuB6P2_q3-?0X0`2KNckj=&=9ftlbnE)0q*~&xpSTiFs8x}7O^nUkAOunsEaqr zFi@Qrj8^(mZSw}izpZ&2-82)uNky0Pi7QKQL5Hu{g68C>>eBpeVbh%#_Am4Qdyya( zZ>@hQ&eG3{HhJ27w$RxPi~jDDG**De^;l)2&i+Vi*-c5t<&TZ5`KOe!r*0<#(Wck- zU6?yqF=RDjZ}c52q* (xdm?^b^xxK;E6atI(vOAyLtMyn?mY_QPNLQzP7_Wt+VQ z*eEYWhk3Uh`~++8dJZo6759X;sv}!PZ5Q)E77HYsszJjoucx!AWCE$i=tEbXs`0?l zzx9Xl5k&L9!t7abFMh?RH zsY0v9l|1JY@-U~j2^a@R?f!-n^iW-ZC=`&3YsYb1JiDU zjI_2DsH-InLsnu0s)xX4UXi=QdLWAt&K%y<+3AvsrH{|0Y~JSflgvGDAAJphmC-yc zSPePVYoXU3{rV`f_?f?Cd!?FmJ2#K+x%!2M5+^}UzWVRYyF|eS+lPbMb;{F`TjC(e z$n9;>v&^JN0N~oiOj-}^`PW`IcNOO=Ru(hYrmGj1>--A^EyHLNX>v>@Is}y?rV}x1%uZ`J=R3wzM1((*1_csgfbQqj2?7-|*=d1sHWoO*5A*3BYeUK-#*yX49%pUb#=mg4ovSV_^{rZ#E ze(gAPW=jZXwnIXmkmSc-ZT%NiA7}T=tGL7-s*k;U+^T(fqJ~S# z>bga_K702o1VN6Rg(4{;Q3?!Vl=6g0e)$HpoL&Bjd1l=#DMKMD1>KDyq8o%tl`+!qeX35uIF$0UXpCPY946J5%eGWEeK>M(68yr{K4r0>)FzJPW!1v zvZwwb6`;ez1?GQR7fM>(2B-HujvCd{2Z#@_X{deygCC1U0`m#AKYe|faBZEw3rKf= zZOE3ch^{B}3#=sBxS2M7g+DSsv{n6-Pe*^ACog1j%%_CpWfps6HQ3Mf(WHurdoX-W>&E z4fQRUh1)PCx7!mf7nGtYuEkucY+vB5%Ay#m+=1RzN=YX+4t)6n_f^ja>x5j~Y}Qx5 z>H;-zFeT}HaZfS@YW&lFvkc}s72^%LAsUa1wpJ?7cXbX$KnlEt2;NS-B@@c1u2U&V=X!aem2gwbfylPdjPB&uf|Wx=GkH1A!y97NCu|UN;w0b zztp7760f)?NU30Gu5ywySdk|^o3d!8ENiQ3#M~*jrK?~37E;zkYw}rf5VjE!Rcr{u z3u;(u(pH^!g~c800j|9GH?ru@y(?U0t^mc<#_dY$jCq8mn;e^~#@+~;UW(v!nO3|;Ti z_n{^0egl4yqAqMbNby28{7!2gQUCwfJ#HKD { - if (granted) { - notifications.SendNotification("some-uuid-fronted", "Frontend Notificaiton", "", "Notificaiton sent through JS!"); - } - }); function runHash() { let hashstring = document.getElementById("hashstring").value; diff --git a/v3/examples/services/main.go b/v3/examples/services/main.go index 6bc020c8a..b85650784 100644 --- a/v3/examples/services/main.go +++ b/v3/examples/services/main.go @@ -12,7 +12,6 @@ import ( "github.com/wailsapp/wails/v3/pkg/services/fileserver" "github.com/wailsapp/wails/v3/pkg/services/kvstore" "github.com/wailsapp/wails/v3/pkg/services/log" - "github.com/wailsapp/wails/v3/pkg/services/notifications" "github.com/wailsapp/wails/v3/pkg/services/sqlite" ) @@ -50,7 +49,6 @@ func main() { }), application.ServiceOptions{ Route: "/files", }), - application.NewService(notifications.New()), }, Assets: application.AssetOptions{ Handler: application.BundledAssetFileServer(assets), From 9f3957722809c5c216139ac7d16c0935f97ef2e5 Mon Sep 17 00:00:00 2001 From: Zach Botterman Date: Sat, 22 Feb 2025 20:02:26 -0800 Subject: [PATCH 023/374] add comments --- .../services/notifications/notifications.go | 2 ++ .../notifications/notifications_darwin.go | 26 +++++++++------- .../notifications/notifications_windows.go | 31 ++++++++++++++----- 3 files changed, 40 insertions(+), 19 deletions(-) diff --git a/v3/pkg/services/notifications/notifications.go b/v3/pkg/services/notifications/notifications.go index 5e0ea6910..461f0b395 100644 --- a/v3/pkg/services/notifications/notifications.go +++ b/v3/pkg/services/notifications/notifications.go @@ -30,6 +30,7 @@ type NotificationOptions = struct { Data map[string]interface{} `json:"data,omitempty"` } +// NotificationResponseData type NotificationResponseData = struct { ID string `json:"id,omitempty"` ActionIdentifier string `json:"actionIdentifier,omitempty"` @@ -41,6 +42,7 @@ type NotificationResponseData = struct { UserInfo map[string]interface{} `json:"userInfo,omitempty"` } +// NotificationResponse type NotificationResponse = struct { Name string `json:"name"` Data NotificationResponseData `json:"data"` diff --git a/v3/pkg/services/notifications/notifications_darwin.go b/v3/pkg/services/notifications/notifications_darwin.go index d9d378bcf..78454d898 100644 --- a/v3/pkg/services/notifications/notifications_darwin.go +++ b/v3/pkg/services/notifications/notifications_darwin.go @@ -17,16 +17,18 @@ import ( "github.com/wailsapp/wails/v3/pkg/application" ) +// Creates a new Notifications Service. +// Your app must be packaged and signed for this feature to work. func New() *Service { return &Service{} } -// ServiceName returns the name of the service +// ServiceName returns the name of the service. func (ns *Service) ServiceName() string { return "github.com/wailsapp/wails/v3/services/notifications" } -// ServiceStartup is called when the service is loaded +// ServiceStartup is called when the service is loaded. func (ns *Service) ServiceStartup(ctx context.Context, options application.ServiceOptions) error { if !CheckBundleIdentifier() { return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") @@ -34,7 +36,7 @@ func (ns *Service) ServiceStartup(ctx context.Context, options application.Servi return nil } -// ServiceShutdown is called when the service is unloaded +// ServiceShutdown is called when the service is unloaded. func (ns *Service) ServiceShutdown() error { return nil } @@ -52,7 +54,7 @@ func (ns *Service) RequestUserNotificationAuthorization() (bool, error) { return result == true, nil } -// CheckNotificationAuthorization checks current permission status +// CheckNotificationAuthorization checks current notification permission status. func (ns *Service) CheckNotificationAuthorization() (bool, error) { if !CheckBundleIdentifier() { return false, fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") @@ -60,7 +62,7 @@ func (ns *Service) CheckNotificationAuthorization() (bool, error) { return bool(C.checkNotificationAuthorization()), nil } -// SendNotification sends a notification with the given identifier, title, subtitle, and body. +// SendNotification sends a basic notification with a unique identifier, title, subtitle, and body. func (ns *Service) SendNotification(identifier, title, subtitle, body string) error { if !CheckBundleIdentifier() { return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") @@ -78,7 +80,9 @@ func (ns *Service) SendNotification(identifier, title, subtitle, body string) er return nil } -// SendNotificationWithActions sends a notification with the specified actions +// SendNotificationWithActions sends a notification with additional actions and inputs. +// A NotificationCategory must be registered with RegisterNotificationCategory first. The `CategoryID` must match the registered category. +// If a NotificationCategory is not registered a basic notification will be sent. func (ns *Service) SendNotificationWithActions(options NotificationOptions) error { if !CheckBundleIdentifier() { return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") @@ -107,7 +111,7 @@ func (ns *Service) SendNotificationWithActions(options NotificationOptions) erro return nil } -// RegisterNotificationCategory registers a category with actions and optional reply field +// RegisterNotificationCategory registers a new NotificationCategory to be used with SendNotificationWithActions. func (ns *Service) RegisterNotificationCategory(category NotificationCategory) error { if !CheckBundleIdentifier() { return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") @@ -135,7 +139,7 @@ func (ns *Service) RegisterNotificationCategory(category NotificationCategory) e return nil } -// RemoveAllPendingNotifications removes all pending notifications +// RemoveAllPendingNotifications removes all pending notifications. func (ns *Service) RemoveAllPendingNotifications() error { if !CheckBundleIdentifier() { return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") @@ -144,7 +148,7 @@ func (ns *Service) RemoveAllPendingNotifications() error { return nil } -// RemovePendingNotification removes a specific pending notification +// RemovePendingNotification removes a pending notification matching the unique identifier. func (ns *Service) RemovePendingNotification(identifier string) error { if !CheckBundleIdentifier() { return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") @@ -155,7 +159,7 @@ func (ns *Service) RemovePendingNotification(identifier string) error { return nil } -// RemoveAllDeliveredNotifications removes all delivered notifications +// RemoveAllDeliveredNotifications removes all delivered notifications. func (ns *Service) RemoveAllDeliveredNotifications() error { if !CheckBundleIdentifier() { return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") @@ -164,7 +168,7 @@ func (ns *Service) RemoveAllDeliveredNotifications() error { return nil } -// RemoveDeliveredNotification removes a specific delivered notification +// RemoveDeliveredNotification removes a delivered notification matching the unique identifier. func (ns *Service) RemoveDeliveredNotification(identifier string) error { if !CheckBundleIdentifier() { return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") diff --git a/v3/pkg/services/notifications/notifications_windows.go b/v3/pkg/services/notifications/notifications_windows.go index e942568d6..ab025f95f 100644 --- a/v3/pkg/services/notifications/notifications_windows.go +++ b/v3/pkg/services/notifications/notifications_windows.go @@ -21,6 +21,7 @@ func (ns *Service) ServiceName() string { } // ServiceStartup is called when the service is loaded +// Sets an activation callback to emit an event when notifications are interacted with. func (ns *Service) ServiceStartup(ctx context.Context, options application.ServiceOptions) error { toast.SetActivationCallback(func(args string, data []toast.UserData) { response := NotificationResponse{ @@ -44,21 +45,26 @@ func (ns *Service) ServiceShutdown() error { return nil } -// On Windows this does not apply, return true +// CheckBundleIdentifier is a Windows stub that always returns true. +// (bundle identifiers are macOS-specific) func CheckBundleIdentifier() bool { return true } -// On Windows this does not apply, return true +// RequestUserNotificationAuthorization is a Windows stub that always returns true, nil. +// (user authorization is macOS-specific) func (ns *Service) RequestUserNotificationAuthorization() (bool, error) { return true, nil } -// On Windows this does not apply, return true +// CheckNotificationAuthorization is a Windows stub that always returns true. +// (user authorization is macOS-specific) func (ns *Service) CheckNotificationAuthorization() bool { return true } +// SendNotification sends a basic notification with a name, title, and body. +// (subtitle is only available on macOS) func (ns *Service) SendNotification(identifier, title, _, body string) error { n := toast.Notification{ AppID: identifier, @@ -73,6 +79,9 @@ func (ns *Service) SendNotification(identifier, title, _, body string) error { return nil } +// SendNotificationWithActions sends a notification with additional actions and inputs. +// A NotificationCategory must be registered with RegisterNotificationCategory first. The `CategoryID` must match the registered category. +// If a NotificationCategory is not registered a basic notification will be sent. func (ns *Service) SendNotificationWithActions(options NotificationOptions) error { nCategory := NotificationCategories[options.CategoryID] @@ -97,7 +106,8 @@ func (ns *Service) SendNotificationWithActions(options NotificationOptions) erro }) n.Actions = append(n.Actions, toast.Action{ - Content: nCategory.ReplyButtonTitle, + Content: nCategory.ReplyButtonTitle, + Arguments: "TEXT_REPLY", }) } @@ -108,6 +118,7 @@ func (ns *Service) SendNotificationWithActions(options NotificationOptions) erro return nil } +// RegisterNotificationCategory registers a new NotificationCategory to be used with SendNotificationWithActions. func (ns *Service) RegisterNotificationCategory(category NotificationCategory) error { NotificationCategories[category.ID] = NotificationCategory{ ID: category.ID, @@ -120,22 +131,26 @@ func (ns *Service) RegisterNotificationCategory(category NotificationCategory) e return nil } -// RemoveAllPendingNotifications removes all pending notifications +// RemoveAllPendingNotifications is a Windows stub that always returns nil. +// (macOS-specific) func (ns *Service) RemoveAllPendingNotifications() error { return nil } -// RemovePendingNotification removes a specific pending notification +// RemovePendingNotification is a Windows stub that always returns nil. +// (macOS-specific) func (ns *Service) RemovePendingNotification(_ string) error { return nil } -// RemoveAllDeliveredNotifications removes all delivered notifications +// RemoveAllDeliveredNotifications is a Windows stub that always returns nil. +// (macOS-specific) func (ns *Service) RemoveAllDeliveredNotifications() error { return nil } -// RemoveDeliveredNotification removes a specific delivered notification +// RemoveDeliveredNotification is a Windows stub that always returns nil. +// (macOS-specific) func (ns *Service) RemoveDeliveredNotification(_ string) error { return nil } From 47a0977ac68dee475cd5a976682c000845c1eba8 Mon Sep 17 00:00:00 2001 From: popaprozac Date: Sat, 22 Feb 2025 20:25:03 -0800 Subject: [PATCH 024/374] add overwrite and remove notification category --- .../notifications/notifications_darwin.go | 13 ++++++ .../notifications/notifications_darwin.h | 7 ++-- .../notifications/notifications_darwin.m | 41 ++++++++++++++++++- 3 files changed, 55 insertions(+), 6 deletions(-) diff --git a/v3/pkg/services/notifications/notifications_darwin.go b/v3/pkg/services/notifications/notifications_darwin.go index 78454d898..41a5a4c11 100644 --- a/v3/pkg/services/notifications/notifications_darwin.go +++ b/v3/pkg/services/notifications/notifications_darwin.go @@ -112,6 +112,7 @@ func (ns *Service) SendNotificationWithActions(options NotificationOptions) erro } // RegisterNotificationCategory registers a new NotificationCategory to be used with SendNotificationWithActions. +// Registering a category with the same name as a previously registered NotificationCategory will override it. func (ns *Service) RegisterNotificationCategory(category NotificationCategory) error { if !CheckBundleIdentifier() { return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") @@ -139,6 +140,18 @@ func (ns *Service) RegisterNotificationCategory(category NotificationCategory) e return nil } +// RemoveNotificationCategory remove a previously registered NotificationCategory. +func (ns *Service) RemoveNotificationCategory(categoryId string) error { + if !CheckBundleIdentifier() { + return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") + } + cCategoryID := C.CString(categoryId) + defer C.free(unsafe.Pointer(cCategoryID)) + + C.removeNotificationCategory(cCategoryID) + return nil +} + // RemoveAllPendingNotifications removes all pending notifications. func (ns *Service) RemoveAllPendingNotifications() error { if !CheckBundleIdentifier() { diff --git a/v3/pkg/services/notifications/notifications_darwin.h b/v3/pkg/services/notifications/notifications_darwin.h index fb21d4cb0..74ac28553 100644 --- a/v3/pkg/services/notifications/notifications_darwin.h +++ b/v3/pkg/services/notifications/notifications_darwin.h @@ -9,10 +9,9 @@ bool checkBundleIdentifier(void); bool requestUserNotificationAuthorization(void *completion); bool checkNotificationAuthorization(void); void sendNotification(const char *identifier, const char *title, const char *subtitle, const char *body, void *completion); -void sendNotificationWithActions(const char *identifier, const char *title, const char *subtitle, - const char *body, const char *categoryId, const char *actions_json, void *completion); -void registerNotificationCategory(const char *categoryId, const char *actions_json, bool hasReplyField, - const char *replyPlaceholder, const char *replyButtonTitle); +void sendNotificationWithActions(const char *identifier, const char *title, const char *subtitle, const char *body, const char *categoryId, const char *actions_json, void *completion); +void registerNotificationCategory(const char *categoryId, const char *actions_json, bool hasReplyField, const char *replyPlaceholder, const char *replyButtonTitle); +void removeNotificationCategory(const char *categoryId); void removeAllPendingNotifications(void); void removePendingNotification(const char *identifier); void removeAllDeliveredNotifications(void); diff --git a/v3/pkg/services/notifications/notifications_darwin.m b/v3/pkg/services/notifications/notifications_darwin.m index b4be6835a..0028211ec 100644 --- a/v3/pkg/services/notifications/notifications_darwin.m +++ b/v3/pkg/services/notifications/notifications_darwin.m @@ -245,7 +245,7 @@ void registerNotificationCategory(const char *categoryId, const char *actions_js [actions addObject:textAction]; } - UNNotificationCategory *category = [UNNotificationCategory + UNNotificationCategory *newCategory = [UNNotificationCategory categoryWithIdentifier:nsCategoryId actions:actions intentIdentifiers:@[] @@ -254,11 +254,48 @@ void registerNotificationCategory(const char *categoryId, const char *actions_js UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; [center getNotificationCategoriesWithCompletionHandler:^(NSSet *categories) { NSMutableSet *updatedCategories = [NSMutableSet setWithSet:categories]; - [updatedCategories addObject:category]; + + // Remove existing category with same ID if it exists + UNNotificationCategory *existingCategory = nil; + for (UNNotificationCategory *category in updatedCategories) { + if ([category.identifier isEqualToString:nsCategoryId]) { + existingCategory = category; + break; + } + } + if (existingCategory) { + [updatedCategories removeObject:existingCategory]; + } + + // Add the new category + [updatedCategories addObject:newCategory]; [center setNotificationCategories:updatedCategories]; }]; } +void removeNotificationCategory(const char *categoryId) { + NSString *nsCategoryId = [NSString stringWithUTF8String:categoryId]; + UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; + + [center getNotificationCategoriesWithCompletionHandler:^(NSSet *categories) { + NSMutableSet *updatedCategories = [NSMutableSet setWithSet:categories]; + + // Find and remove the category with matching identifier + UNNotificationCategory *categoryToRemove = nil; + for (UNNotificationCategory *category in updatedCategories) { + if ([category.identifier isEqualToString:nsCategoryId]) { + categoryToRemove = category; + break; + } + } + + if (categoryToRemove) { + [updatedCategories removeObject:categoryToRemove]; + [center setNotificationCategories:updatedCategories]; + } + }]; +} + void removeAllPendingNotifications(void) { UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; [center removeAllPendingNotificationRequests]; From a5e2e42a552af8d8b0a756f013bc72d5f61cd9be Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Sun, 23 Feb 2025 15:46:03 +1100 Subject: [PATCH 025/374] [darwin] Ensure menu updates occur on main thread --- docs/src/content/docs/changelog.mdx | 1 + v3/pkg/application/menu_darwin.go | 14 ++++++++------ 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/docs/src/content/docs/changelog.mdx b/docs/src/content/docs/changelog.mdx index 6b9ca3118..5047a6feb 100644 --- a/docs/src/content/docs/changelog.mdx +++ b/docs/src/content/docs/changelog.mdx @@ -89,6 +89,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fixed hidden menu items on macOS by [@leaanthony](https://github.com/leaanthony) - Fixed handling and formatting of errors in message processors by [@fbbdev](https://github.com/fbbdev) in [#4066](https://github.com/wailsapp/wails/pull/4066) -  Fixed skipped service shutdown when quitting application by [@fbbdev](https://github.com/fbbdev) in [#4066](https://github.com/wailsapp/wails/pull/4066) +-  Ensure menu updates occur on the main thread by [@leaanthony](https://github.com/leaanthony) ### Changed diff --git a/v3/pkg/application/menu_darwin.go b/v3/pkg/application/menu_darwin.go index 3a5fa69e4..1e3fc7197 100644 --- a/v3/pkg/application/menu_darwin.go +++ b/v3/pkg/application/menu_darwin.go @@ -72,12 +72,14 @@ func newMenuImpl(menu *Menu) *macosMenu { } func (m *macosMenu) update() { - if m.nsMenu == nil { - m.nsMenu = C.createNSMenu(C.CString(m.menu.label)) - } else { - C.clearMenu(m.nsMenu) - } - m.processMenu(m.nsMenu, m.menu) + InvokeSync(func() { + if m.nsMenu == nil { + m.nsMenu = C.createNSMenu(C.CString(m.menu.label)) + } else { + C.clearMenu(m.nsMenu) + } + m.processMenu(m.nsMenu, m.menu) + }) } func (m *macosMenu) processMenu(parent unsafe.Pointer, menu *Menu) { From 6d44068ede1d67005a2ffc24907c774cc68e41df Mon Sep 17 00:00:00 2001 From: Zach Botterman Date: Sat, 22 Feb 2025 20:52:23 -0800 Subject: [PATCH 026/374] save notification categories to registry --- .../notifications/notifications_darwin.go | 2 +- .../notifications/notifications_windows.go | 75 ++++++++++++++++++- 2 files changed, 73 insertions(+), 4 deletions(-) diff --git a/v3/pkg/services/notifications/notifications_darwin.go b/v3/pkg/services/notifications/notifications_darwin.go index 41a5a4c11..626f52524 100644 --- a/v3/pkg/services/notifications/notifications_darwin.go +++ b/v3/pkg/services/notifications/notifications_darwin.go @@ -140,7 +140,7 @@ func (ns *Service) RegisterNotificationCategory(category NotificationCategory) e return nil } -// RemoveNotificationCategory remove a previously registered NotificationCategory. +// RemoveNotificationCategory removes a previously registered NotificationCategory. func (ns *Service) RemoveNotificationCategory(categoryId string) error { if !CheckBundleIdentifier() { return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") diff --git a/v3/pkg/services/notifications/notifications_windows.go b/v3/pkg/services/notifications/notifications_windows.go index ab025f95f..9c9fad042 100644 --- a/v3/pkg/services/notifications/notifications_windows.go +++ b/v3/pkg/services/notifications/notifications_windows.go @@ -4,9 +4,15 @@ package notifications import ( "context" + "encoding/json" + "fmt" + "os" + "path/filepath" + "strings" "git.sr.ht/~jackmordaunt/go-toast" "github.com/wailsapp/wails/v3/pkg/application" + "golang.org/x/sys/windows/registry" ) var NotificationCategories map[string]NotificationCategory = make(map[string]NotificationCategory) @@ -37,12 +43,12 @@ func (ns *Service) ServiceStartup(ctx context.Context, options application.Servi application.Get().EmitEvent("notificationResponse", response) }) - return nil + return loadCategoriesFromRegistry() } // ServiceShutdown is called when the service is unloaded func (ns *Service) ServiceShutdown() error { - return nil + return saveCategoriesToRegistry() } // CheckBundleIdentifier is a Windows stub that always returns true. @@ -128,7 +134,13 @@ func (ns *Service) RegisterNotificationCategory(category NotificationCategory) e ReplyButtonTitle: category.ReplyButtonTitle, } - return nil + return saveCategoriesToRegistry() +} + +// RemoveNotificationCategory removes a previously registered NotificationCategory. +func (ns *Service) RemoveNotificationCategory(categoryId string) error { + delete(NotificationCategories, categoryId) + return saveCategoriesToRegistry() } // RemoveAllPendingNotifications is a Windows stub that always returns nil. @@ -155,6 +167,63 @@ func (ns *Service) RemoveDeliveredNotification(_ string) error { return nil } +func getExeName() string { + executable, err := os.Executable() + if err != nil { + return "" + } + + return strings.TrimSuffix(filepath.Base(executable), filepath.Ext(executable)) +} + +func saveCategoriesToRegistry() error { + appName := getExeName() + registryPath := fmt.Sprintf(`SOFTWARE\%s\NotificationCategories`, appName) + + key, _, err := registry.CreateKey( + registry.CURRENT_USER, + registryPath, + registry.ALL_ACCESS, + ) + if err != nil { + return err + } + defer key.Close() + + data, err := json.Marshal(NotificationCategories) + if err != nil { + return err + } + + return key.SetStringValue("Categories", string(data)) +} + +func loadCategoriesFromRegistry() error { + appName := getExeName() + println(appName) + registryPath := fmt.Sprintf(`SOFTWARE\%s\NotificationCategories`, appName) + + key, err := registry.OpenKey( + registry.CURRENT_USER, + registryPath, + registry.QUERY_VALUE, + ) + if err != nil { + if err == registry.ErrNotExist { + return nil + } + return err + } + defer key.Close() + + data, _, err := key.GetStringValue("Categories") + if err != nil { + return err + } + + return json.Unmarshal([]byte(data), &NotificationCategories) +} + func getUserText(data []toast.UserData) (string, bool) { for _, d := range data { if d.Key == "userText" { From ab9c4600880ca104b4edc6e5a3950ed1acbe0001 Mon Sep 17 00:00:00 2001 From: Zach Botterman Date: Sun, 23 Feb 2025 11:40:39 -0800 Subject: [PATCH 027/374] quick fixes --- v3/examples/notifications/frontend/main.js | 8 +++++--- v3/pkg/application/context_application_event.go | 6 +----- v3/pkg/services/notifications/notifications_windows.go | 8 +++++++- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/v3/examples/notifications/frontend/main.js b/v3/examples/notifications/frontend/main.js index 54c03e560..f032ac16b 100644 --- a/v3/examples/notifications/frontend/main.js +++ b/v3/examples/notifications/frontend/main.js @@ -7,7 +7,8 @@ const notificationsElement = document.getElementById('notifications'); window.sendNotification = async () => { const granted = await Notifications.RequestUserNotificationAuthorization(); if (granted) { - await Notifications.SendNotification("some-uuid-fronted", "Frontend Notificaiton", "", "Notificaiton sent through JS!"); + const uuid = crypto.randomUUID(); + await Notifications.SendNotification(uuid, "Frontend Notification", "", "Notification sent through JS!"); } } @@ -26,11 +27,12 @@ window.sendComplexNotification = async () => { replyPlaceholder: "Reply to frontend...", }); + const uuid = crypto.randomUUID(); await Notifications.SendNotificationWithActions({ - id: "some-uuid-complex", + id: uuid, title: "Complex Frontend Notification", subtitle: "From: Jane Doe", - body: "Is it rainging today where you are?", + body: "Is it raining today where you are?", categoryId: "FRONTEND_NOTIF", data: { messageId: "msg-456", diff --git a/v3/pkg/application/context_application_event.go b/v3/pkg/application/context_application_event.go index 50cf8b90d..468634f22 100644 --- a/v3/pkg/application/context_application_event.go +++ b/v3/pkg/application/context_application_event.go @@ -52,7 +52,7 @@ func (c ApplicationEventContext) HasVisibleWindows() bool { return c.getBool("hasVisibleWindows") } -func (c *ApplicationEventContext) setData(data map[string]any) { +func (c ApplicationEventContext) setData(data map[string]any) { c.data = data } @@ -72,10 +72,6 @@ func (c ApplicationEventContext) Filename() string { return result } -func (c *ApplicationEventContext) GetData() map[string]any { - return c.data -} - func newApplicationEventContext() *ApplicationEventContext { return &ApplicationEventContext{ data: make(map[string]any), diff --git a/v3/pkg/services/notifications/notifications_windows.go b/v3/pkg/services/notifications/notifications_windows.go index 9c9fad042..d88e06f9c 100644 --- a/v3/pkg/services/notifications/notifications_windows.go +++ b/v3/pkg/services/notifications/notifications_windows.go @@ -167,6 +167,7 @@ func (ns *Service) RemoveDeliveredNotification(_ string) error { return nil } +// Is there a better way for me to grab this from the Wails config? func getExeName() string { executable, err := os.Executable() if err != nil { @@ -178,6 +179,9 @@ func getExeName() string { func saveCategoriesToRegistry() error { appName := getExeName() + if appName == "" { + return fmt.Errorf("failed to save categories to registry: empty executable name") + } registryPath := fmt.Sprintf(`SOFTWARE\%s\NotificationCategories`, appName) key, _, err := registry.CreateKey( @@ -200,7 +204,9 @@ func saveCategoriesToRegistry() error { func loadCategoriesFromRegistry() error { appName := getExeName() - println(appName) + if appName == "" { + return fmt.Errorf("failed to save categories to registry: empty executable name") + } registryPath := fmt.Sprintf(`SOFTWARE\%s\NotificationCategories`, appName) key, err := registry.OpenKey( From 27e512d5f1bdb5c03fa1c2e46b9b57e0dad705a3 Mon Sep 17 00:00:00 2001 From: popaprozac Date: Sun, 23 Feb 2025 13:55:03 -0800 Subject: [PATCH 028/374] add data option to basic notification --- .../notifications/notifications_darwin.go | 45 +++++++++++-------- .../notifications/notifications_darwin.h | 2 +- .../notifications/notifications_darwin.m | 18 +++++++- 3 files changed, 45 insertions(+), 20 deletions(-) diff --git a/v3/pkg/services/notifications/notifications_darwin.go b/v3/pkg/services/notifications/notifications_darwin.go index 626f52524..a84d6f024 100644 --- a/v3/pkg/services/notifications/notifications_darwin.go +++ b/v3/pkg/services/notifications/notifications_darwin.go @@ -31,7 +31,7 @@ func (ns *Service) ServiceName() string { // ServiceStartup is called when the service is loaded. func (ns *Service) ServiceStartup(ctx context.Context, options application.ServiceOptions) error { if !CheckBundleIdentifier() { - return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") + return fmt.Errorf("notifications require a bundled application with a unique bundle identifier") } return nil } @@ -48,7 +48,7 @@ func CheckBundleIdentifier() bool { // RequestUserNotificationAuthorization requests permission for notifications. func (ns *Service) RequestUserNotificationAuthorization() (bool, error) { if !CheckBundleIdentifier() { - return false, fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") + return false, fmt.Errorf("notifications require a bundled application with a unique bundle identifier") } result := C.requestUserNotificationAuthorization(nil) return result == true, nil @@ -57,26 +57,35 @@ func (ns *Service) RequestUserNotificationAuthorization() (bool, error) { // CheckNotificationAuthorization checks current notification permission status. func (ns *Service) CheckNotificationAuthorization() (bool, error) { if !CheckBundleIdentifier() { - return false, fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") + return false, fmt.Errorf("notifications require a bundled application with a unique bundle identifier") } return bool(C.checkNotificationAuthorization()), nil } // SendNotification sends a basic notification with a unique identifier, title, subtitle, and body. -func (ns *Service) SendNotification(identifier, title, subtitle, body string) error { +func (ns *Service) SendNotification(options NotificationOptions) error { if !CheckBundleIdentifier() { - return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") + return fmt.Errorf("notifications require a bundled application with a unique bundle identifier") } - cIdentifier := C.CString(identifier) - cTitle := C.CString(title) - cSubtitle := C.CString(subtitle) - cBody := C.CString(body) + cIdentifier := C.CString(options.ID) + cTitle := C.CString(options.Title) + cSubtitle := C.CString(options.Subtitle) + cBody := C.CString(options.Body) defer C.free(unsafe.Pointer(cIdentifier)) defer C.free(unsafe.Pointer(cTitle)) defer C.free(unsafe.Pointer(cSubtitle)) defer C.free(unsafe.Pointer(cBody)) - C.sendNotification(cIdentifier, cTitle, cSubtitle, cBody, nil) + var cDataJSON *C.char + if options.Data != nil { + jsonData, err := json.Marshal(options.Data) + if err == nil { + cDataJSON = C.CString(string(jsonData)) + defer C.free(unsafe.Pointer(cDataJSON)) + } + } + + C.sendNotification(cIdentifier, cTitle, cSubtitle, cBody, cDataJSON, nil) return nil } @@ -85,7 +94,7 @@ func (ns *Service) SendNotification(identifier, title, subtitle, body string) er // If a NotificationCategory is not registered a basic notification will be sent. func (ns *Service) SendNotificationWithActions(options NotificationOptions) error { if !CheckBundleIdentifier() { - return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") + return fmt.Errorf("notifications require a bundled application with a unique bundle identifier") } cIdentifier := C.CString(options.ID) cTitle := C.CString(options.Title) @@ -115,7 +124,7 @@ func (ns *Service) SendNotificationWithActions(options NotificationOptions) erro // Registering a category with the same name as a previously registered NotificationCategory will override it. func (ns *Service) RegisterNotificationCategory(category NotificationCategory) error { if !CheckBundleIdentifier() { - return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") + return fmt.Errorf("notifications require a bundled application with a unique bundle identifier") } cCategoryID := C.CString(category.ID) defer C.free(unsafe.Pointer(cCategoryID)) @@ -140,10 +149,10 @@ func (ns *Service) RegisterNotificationCategory(category NotificationCategory) e return nil } -// RemoveNotificationCategory removes a previously registered NotificationCategory. +// RemoveNotificationCategory remove a previously registered NotificationCategory. func (ns *Service) RemoveNotificationCategory(categoryId string) error { if !CheckBundleIdentifier() { - return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") + return fmt.Errorf("notifications require a bundled application with a unique bundle identifier") } cCategoryID := C.CString(categoryId) defer C.free(unsafe.Pointer(cCategoryID)) @@ -155,7 +164,7 @@ func (ns *Service) RemoveNotificationCategory(categoryId string) error { // RemoveAllPendingNotifications removes all pending notifications. func (ns *Service) RemoveAllPendingNotifications() error { if !CheckBundleIdentifier() { - return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") + return fmt.Errorf("notifications require a bundled application with a unique bundle identifier") } C.removeAllPendingNotifications() return nil @@ -164,7 +173,7 @@ func (ns *Service) RemoveAllPendingNotifications() error { // RemovePendingNotification removes a pending notification matching the unique identifier. func (ns *Service) RemovePendingNotification(identifier string) error { if !CheckBundleIdentifier() { - return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") + return fmt.Errorf("notifications require a bundled application with a unique bundle identifier") } cIdentifier := C.CString(identifier) defer C.free(unsafe.Pointer(cIdentifier)) @@ -175,7 +184,7 @@ func (ns *Service) RemovePendingNotification(identifier string) error { // RemoveAllDeliveredNotifications removes all delivered notifications. func (ns *Service) RemoveAllDeliveredNotifications() error { if !CheckBundleIdentifier() { - return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") + return fmt.Errorf("notifications require a bundled application with a unique bundle identifier") } C.removeAllDeliveredNotifications() return nil @@ -184,7 +193,7 @@ func (ns *Service) RemoveAllDeliveredNotifications() error { // RemoveDeliveredNotification removes a delivered notification matching the unique identifier. func (ns *Service) RemoveDeliveredNotification(identifier string) error { if !CheckBundleIdentifier() { - return fmt.Errorf("Notifications require a bundled application with a unique bundle identifier") + return fmt.Errorf("notifications require a bundled application with a unique bundle identifier") } cIdentifier := C.CString(identifier) defer C.free(unsafe.Pointer(cIdentifier)) diff --git a/v3/pkg/services/notifications/notifications_darwin.h b/v3/pkg/services/notifications/notifications_darwin.h index 74ac28553..21a210289 100644 --- a/v3/pkg/services/notifications/notifications_darwin.h +++ b/v3/pkg/services/notifications/notifications_darwin.h @@ -8,7 +8,7 @@ bool checkBundleIdentifier(void); bool requestUserNotificationAuthorization(void *completion); bool checkNotificationAuthorization(void); -void sendNotification(const char *identifier, const char *title, const char *subtitle, const char *body, void *completion); +void sendNotification(const char *identifier, const char *title, const char *subtitle, const char *body, const char *data_json, void *completion); void sendNotificationWithActions(const char *identifier, const char *title, const char *subtitle, const char *body, const char *categoryId, const char *actions_json, void *completion); void registerNotificationCategory(const char *categoryId, const char *actions_json, bool hasReplyField, const char *replyPlaceholder, const char *replyButtonTitle); void removeNotificationCategory(const char *categoryId); diff --git a/v3/pkg/services/notifications/notifications_darwin.m b/v3/pkg/services/notifications/notifications_darwin.m index 0028211ec..3c3fe4978 100644 --- a/v3/pkg/services/notifications/notifications_darwin.m +++ b/v3/pkg/services/notifications/notifications_darwin.m @@ -118,7 +118,7 @@ bool checkNotificationAuthorization(void) { return isAuthorized; } -void sendNotification(const char *identifier, const char *title, const char *subtitle, const char *body, void *completion) { +void sendNotification(const char *identifier, const char *title, const char *subtitle, const char *body, const char *data_json, void *completion) { ensureDelegateInitialized(); NSString *nsIdentifier = [NSString stringWithUTF8String:identifier]; @@ -126,6 +126,17 @@ void sendNotification(const char *identifier, const char *title, const char *sub NSString *nsSubtitle = [NSString stringWithUTF8String:subtitle]; NSString *nsBody = [NSString stringWithUTF8String:body]; + NSMutableDictionary *customData = [NSMutableDictionary dictionary]; + if (data_json) { + NSString *dataJsonStr = [NSString stringWithUTF8String:data_json]; + NSData *jsonData = [dataJsonStr dataUsingEncoding:NSUTF8StringEncoding]; + NSError *error = nil; + NSDictionary *parsedData = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error]; + if (!error && parsedData) { + [customData addEntriesFromDictionary:parsedData]; + } + } + UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init]; @@ -134,6 +145,11 @@ void sendNotification(const char *identifier, const char *title, const char *sub content.body = nsBody; content.sound = [UNNotificationSound defaultSound]; + // Add custom data if available + if (customData.count > 0) { + content.userInfo = customData; + } + UNTimeIntervalNotificationTrigger *trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:1 repeats:NO]; UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:nsIdentifier content:content trigger:trigger]; From f8647ff73c2aa0e2a56e735b696859b86ac9385d Mon Sep 17 00:00:00 2001 From: popaprozac Date: Sun, 23 Feb 2025 14:11:32 -0800 Subject: [PATCH 029/374] update min macos version --- v3/pkg/services/notifications/notifications_darwin.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/v3/pkg/services/notifications/notifications_darwin.go b/v3/pkg/services/notifications/notifications_darwin.go index a84d6f024..b95d93078 100644 --- a/v3/pkg/services/notifications/notifications_darwin.go +++ b/v3/pkg/services/notifications/notifications_darwin.go @@ -3,8 +3,8 @@ package notifications /* -#cgo CFLAGS: -mmacosx-version-min=10.14 -x objective-c -#cgo LDFLAGS: -framework Cocoa -mmacosx-version-min=10.14 -framework UserNotifications +#cgo CFLAGS: -mmacosx-version-min=11.0 -x objective-c +#cgo LDFLAGS: -framework Cocoa -mmacosx-version-min=11 -framework UserNotifications #import "./notifications_darwin.h" */ import "C" From c1230d4b86d7d559e3789e1a48ad8cf01c35de24 Mon Sep 17 00:00:00 2001 From: Zach Botterman Date: Sun, 23 Feb 2025 14:37:03 -0800 Subject: [PATCH 030/374] update win impl to match --- v3/pkg/services/notifications/notifications.go | 14 +++++++------- .../notifications/notifications_windows.go | 8 ++++---- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/v3/pkg/services/notifications/notifications.go b/v3/pkg/services/notifications/notifications.go index 461f0b395..57715b11e 100644 --- a/v3/pkg/services/notifications/notifications.go +++ b/v3/pkg/services/notifications/notifications.go @@ -5,16 +5,16 @@ type Service struct { // NotificationAction represents an action button for a notification type NotificationAction = struct { - ID string `json:"id"` - Title string `json:"title"` + ID string `json:"id,omitempty"` + Title string `json:"title,omitempty"` Destructive bool `json:"destructive,omitempty"` AuthenticationRequired bool `json:"authenticationRequired,omitempty"` } // NotificationCategory groups actions for notifications type NotificationCategory = struct { - ID string `json:"id"` - Actions []NotificationAction `json:"actions"` + ID string `json:"id,omitempty"` + Actions []NotificationAction `json:"actions,omitempty"` HasReplyField bool `json:"hasReplyField,omitempty"` ReplyPlaceholder string `json:"replyPlaceholder,omitempty"` ReplyButtonTitle string `json:"replyButtonTitle,omitempty"` @@ -22,10 +22,10 @@ type NotificationCategory = struct { // NotificationOptions contains configuration for a notification type NotificationOptions = struct { - ID string `json:"id"` - Title string `json:"title"` + ID string `json:"id,omitempty"` + Title string `json:"title,omitempty"` Subtitle string `json:"subtitle,omitempty"` - Body string `json:"body"` + Body string `json:"body,omitempty"` CategoryID string `json:"categoryId,omitempty"` Data map[string]interface{} `json:"data,omitempty"` } diff --git a/v3/pkg/services/notifications/notifications_windows.go b/v3/pkg/services/notifications/notifications_windows.go index d88e06f9c..f279f67be 100644 --- a/v3/pkg/services/notifications/notifications_windows.go +++ b/v3/pkg/services/notifications/notifications_windows.go @@ -71,11 +71,11 @@ func (ns *Service) CheckNotificationAuthorization() bool { // SendNotification sends a basic notification with a name, title, and body. // (subtitle is only available on macOS) -func (ns *Service) SendNotification(identifier, title, _, body string) error { +func (ns *Service) SendNotification(options NotificationOptions) error { n := toast.Notification{ - AppID: identifier, - Title: title, - Body: body, + AppID: options.ID, + Title: options.Title, + Body: options.Body, } err := n.Push() From 9eab58f0d2c8070199d161616f0ee0470b5b2b62 Mon Sep 17 00:00:00 2001 From: Zach Botterman Date: Sun, 23 Feb 2025 14:40:40 -0800 Subject: [PATCH 031/374] update comments --- v3/pkg/services/notifications/notifications_windows.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/v3/pkg/services/notifications/notifications_windows.go b/v3/pkg/services/notifications/notifications_windows.go index f279f67be..92ae45f96 100644 --- a/v3/pkg/services/notifications/notifications_windows.go +++ b/v3/pkg/services/notifications/notifications_windows.go @@ -69,8 +69,8 @@ func (ns *Service) CheckNotificationAuthorization() bool { return true } -// SendNotification sends a basic notification with a name, title, and body. -// (subtitle is only available on macOS) +// SendNotification sends a basic notification with a name, title, and body. All other options are ignored on Windows. +// (subtitle, category id, and data are only available on macOS) func (ns *Service) SendNotification(options NotificationOptions) error { n := toast.Notification{ AppID: options.ID, @@ -88,6 +88,7 @@ func (ns *Service) SendNotification(options NotificationOptions) error { // SendNotificationWithActions sends a notification with additional actions and inputs. // A NotificationCategory must be registered with RegisterNotificationCategory first. The `CategoryID` must match the registered category. // If a NotificationCategory is not registered a basic notification will be sent. +// (subtitle, category id, and data are only available on macOS) func (ns *Service) SendNotificationWithActions(options NotificationOptions) error { nCategory := NotificationCategories[options.CategoryID] From cc760a173a29371088625060dc675db05567c029 Mon Sep 17 00:00:00 2001 From: Zach Botterman Date: Sun, 23 Feb 2025 15:41:56 -0800 Subject: [PATCH 032/374] test data with toast --- .../notifications/notifications_windows.go | 58 ++++++++++++++++--- 1 file changed, 51 insertions(+), 7 deletions(-) diff --git a/v3/pkg/services/notifications/notifications_windows.go b/v3/pkg/services/notifications/notifications_windows.go index 92ae45f96..f1b0d3a1a 100644 --- a/v3/pkg/services/notifications/notifications_windows.go +++ b/v3/pkg/services/notifications/notifications_windows.go @@ -17,6 +17,11 @@ import ( var NotificationCategories map[string]NotificationCategory = make(map[string]NotificationCategory) +const ( + defaultAction = "defaultActionIdentifier" + dataSeparator = ":::" +) + func New() *Service { return &Service{} } @@ -30,13 +35,22 @@ func (ns *Service) ServiceName() string { // Sets an activation callback to emit an event when notifications are interacted with. func (ns *Service) ServiceStartup(ctx context.Context, options application.ServiceOptions) error { toast.SetActivationCallback(func(args string, data []toast.UserData) { + actionIdentifier, userInfo := parseNotificationResponse(args) response := NotificationResponse{ Name: "notification", Data: NotificationResponseData{ - ActionIdentifier: args, + ActionIdentifier: actionIdentifier, }, } + if userInfo != "" { + jsonStr := strings.ReplaceAll(userInfo, "'", "\"") + var userInfoMap map[string]interface{} + if err := json.Unmarshal([]byte(jsonStr), &userInfoMap); err == nil { + response.Data.UserInfo = userInfoMap + } + } + if userText, found := getUserText(data); found { response.Data.UserText = userText } @@ -73,9 +87,20 @@ func (ns *Service) CheckNotificationAuthorization() bool { // (subtitle, category id, and data are only available on macOS) func (ns *Service) SendNotification(options NotificationOptions) error { n := toast.Notification{ - AppID: options.ID, - Title: options.Title, - Body: options.Body, + AppID: options.ID, + Title: options.Title, + Body: options.Body, + ActivationArguments: defaultAction, + } + + options.Data["title"] = options.Title + options.Data["body"] = options.Body + + if options.Data != nil { + jsonData, err := json.Marshal(options.Data) + if err == nil { + n.ActivationArguments = defaultAction + dataSeparator + strings.ReplaceAll(string(jsonData), "\"", "'") + } } err := n.Push() @@ -93,9 +118,10 @@ func (ns *Service) SendNotificationWithActions(options NotificationOptions) erro nCategory := NotificationCategories[options.CategoryID] n := toast.Notification{ - AppID: options.ID, - Title: options.Title, - Body: options.Body, + AppID: options.ID, + Title: options.Title, + Body: options.Body, + ActivationArguments: defaultAction, } for _, action := range nCategory.Actions { @@ -118,6 +144,16 @@ func (ns *Service) SendNotificationWithActions(options NotificationOptions) erro }) } + if options.Data != nil { + jsonData, err := json.Marshal(options.Data) + if err == nil { + n.ActivationArguments = defaultAction + dataSeparator + strings.ReplaceAll(string(jsonData), "\"", "'") + for index := range n.Actions { + n.Actions[index].Arguments = n.Actions[index].Arguments + dataSeparator + strings.ReplaceAll(string(jsonData), "\"", "'") + } + } + } + err := n.Push() if err != nil { return err @@ -168,6 +204,14 @@ func (ns *Service) RemoveDeliveredNotification(_ string) error { return nil } +func parseNotificationResponse(response string) (action string, data string) { + parts := strings.Split(response, dataSeparator) + if len(parts) == 1 { + return parts[0], "" + } + return parts[0], parts[1] +} + // Is there a better way for me to grab this from the Wails config? func getExeName() string { executable, err := os.Executable() From 978a982ab752843c1ee7829573c9949466226992 Mon Sep 17 00:00:00 2001 From: Zach Botterman Date: Sun, 23 Feb 2025 15:45:42 -0800 Subject: [PATCH 033/374] don't add title or body quite yet --- v3/pkg/services/notifications/notifications_windows.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/v3/pkg/services/notifications/notifications_windows.go b/v3/pkg/services/notifications/notifications_windows.go index f1b0d3a1a..078a3cb08 100644 --- a/v3/pkg/services/notifications/notifications_windows.go +++ b/v3/pkg/services/notifications/notifications_windows.go @@ -93,9 +93,6 @@ func (ns *Service) SendNotification(options NotificationOptions) error { ActivationArguments: defaultAction, } - options.Data["title"] = options.Title - options.Data["body"] = options.Body - if options.Data != nil { jsonData, err := json.Marshal(options.Data) if err == nil { From bf4222c9cce0d7488ea7d64646496674b011780b Mon Sep 17 00:00:00 2001 From: Zach Botterman Date: Sun, 23 Feb 2025 16:00:04 -0800 Subject: [PATCH 034/374] update example --- .../v3/pkg/services/notifications/models.js | 14 +- .../v3/pkg/services/notifications/service.js | 59 ++++--- .../frontend/dist/Inter-Medium.ttf | Bin 315132 -> 0 bytes .../frontend/dist/assets/index-CS0sRFez.js | 6 - .../notifications/frontend/dist/index.html | 29 ---- .../frontend/dist/javascript.svg | 1 - .../notifications/frontend/dist/style.css | 160 ------------------ .../notifications/frontend/dist/wails.png | Bin 9057 -> 0 bytes v3/examples/notifications/frontend/main.js | 23 ++- v3/examples/notifications/main.go | 141 +++++++-------- 10 files changed, 123 insertions(+), 310 deletions(-) delete mode 100644 v3/examples/notifications/frontend/dist/Inter-Medium.ttf delete mode 100644 v3/examples/notifications/frontend/dist/assets/index-CS0sRFez.js delete mode 100644 v3/examples/notifications/frontend/dist/index.html delete mode 100644 v3/examples/notifications/frontend/dist/javascript.svg delete mode 100644 v3/examples/notifications/frontend/dist/style.css delete mode 100644 v3/examples/notifications/frontend/dist/wails.png diff --git a/v3/examples/notifications/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/models.js b/v3/examples/notifications/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/models.js index 2525e0f38..958e7d79c 100644 --- a/v3/examples/notifications/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/models.js +++ b/v3/examples/notifications/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/models.js @@ -9,8 +9,8 @@ import {Create as $Create} from "@wailsio/runtime"; /** * NotificationAction represents an action button for a notification * @typedef {Object} NotificationAction - * @property {string} id - * @property {string} title + * @property {string} [id] + * @property {string} [title] * @property {boolean} [destructive] * @property {boolean} [authenticationRequired] */ @@ -18,8 +18,8 @@ import {Create as $Create} from "@wailsio/runtime"; /** * NotificationCategory groups actions for notifications * @typedef {Object} NotificationCategory - * @property {string} id - * @property {NotificationAction[]} actions + * @property {string} [id] + * @property {NotificationAction[]} [actions] * @property {boolean} [hasReplyField] * @property {string} [replyPlaceholder] * @property {string} [replyButtonTitle] @@ -28,10 +28,10 @@ import {Create as $Create} from "@wailsio/runtime"; /** * NotificationOptions contains configuration for a notification * @typedef {Object} NotificationOptions - * @property {string} id - * @property {string} title + * @property {string} [id] + * @property {string} [title] * @property {string} [subtitle] - * @property {string} body + * @property {string} [body] * @property {string} [categoryId] * @property {{ [_: string]: any }} [data] */ diff --git a/v3/examples/notifications/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/service.js b/v3/examples/notifications/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/service.js index 8fb7eff96..85da85975 100644 --- a/v3/examples/notifications/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/service.js +++ b/v3/examples/notifications/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/service.js @@ -11,7 +11,8 @@ import {Call as $Call, Create as $Create} from "@wailsio/runtime"; import * as $models from "./models.js"; /** - * CheckNotificationAuthorization checks current permission status + * CheckNotificationAuthorization is a Windows stub that always returns true. + * (user authorization is macOS-specific) * @returns {Promise & { cancel(): void }} */ export function CheckNotificationAuthorization() { @@ -20,7 +21,7 @@ export function CheckNotificationAuthorization() { } /** - * RegisterNotificationCategory registers a category with actions and optional reply field + * RegisterNotificationCategory registers a new NotificationCategory to be used with SendNotificationWithActions. * @param {$models.NotificationCategory} category * @returns {Promise & { cancel(): void }} */ @@ -30,7 +31,8 @@ export function RegisterNotificationCategory(category) { } /** - * RemoveAllDeliveredNotifications removes all delivered notifications + * RemoveAllDeliveredNotifications is a Windows stub that always returns nil. + * (macOS-specific) * @returns {Promise & { cancel(): void }} */ export function RemoveAllDeliveredNotifications() { @@ -39,7 +41,8 @@ export function RemoveAllDeliveredNotifications() { } /** - * RemoveAllPendingNotifications removes all pending notifications + * RemoveAllPendingNotifications is a Windows stub that always returns nil. + * (macOS-specific) * @returns {Promise & { cancel(): void }} */ export function RemoveAllPendingNotifications() { @@ -48,27 +51,40 @@ export function RemoveAllPendingNotifications() { } /** - * RemoveDeliveredNotification removes a specific delivered notification - * @param {string} identifier + * RemoveDeliveredNotification is a Windows stub that always returns nil. + * (macOS-specific) + * @param {string} $0 * @returns {Promise & { cancel(): void }} */ -export function RemoveDeliveredNotification(identifier) { - let $resultPromise = /** @type {any} */($Call.ByID(149440045, identifier)); +export function RemoveDeliveredNotification($0) { + let $resultPromise = /** @type {any} */($Call.ByID(149440045, $0)); return $resultPromise; } /** - * RemovePendingNotification removes a specific pending notification - * @param {string} identifier + * RemoveNotificationCategory removes a previously registered NotificationCategory. + * @param {string} categoryId * @returns {Promise & { cancel(): void }} */ -export function RemovePendingNotification(identifier) { - let $resultPromise = /** @type {any} */($Call.ByID(3872412470, identifier)); +export function RemoveNotificationCategory(categoryId) { + let $resultPromise = /** @type {any} */($Call.ByID(229511469, categoryId)); return $resultPromise; } /** - * RequestUserNotificationAuthorization requests permission for notifications. + * RemovePendingNotification is a Windows stub that always returns nil. + * (macOS-specific) + * @param {string} $0 + * @returns {Promise & { cancel(): void }} + */ +export function RemovePendingNotification($0) { + let $resultPromise = /** @type {any} */($Call.ByID(3872412470, $0)); + return $resultPromise; +} + +/** + * RequestUserNotificationAuthorization is a Windows stub that always returns true, nil. + * (user authorization is macOS-specific) * @returns {Promise & { cancel(): void }} */ export function RequestUserNotificationAuthorization() { @@ -77,20 +93,21 @@ export function RequestUserNotificationAuthorization() { } /** - * SendNotification sends a notification with the given identifier, title, subtitle, and body. - * @param {string} identifier - * @param {string} title - * @param {string} subtitle - * @param {string} body + * SendNotification sends a basic notification with a name, title, and body. All other options are ignored on Windows. + * (subtitle, category id, and data are only available on macOS) + * @param {$models.NotificationOptions} options * @returns {Promise & { cancel(): void }} */ -export function SendNotification(identifier, title, subtitle, body) { - let $resultPromise = /** @type {any} */($Call.ByID(2246903123, identifier, title, subtitle, body)); +export function SendNotification(options) { + let $resultPromise = /** @type {any} */($Call.ByID(2246903123, options)); return $resultPromise; } /** - * SendNotificationWithActions sends a notification with the specified actions + * SendNotificationWithActions sends a notification with additional actions and inputs. + * A NotificationCategory must be registered with RegisterNotificationCategory first. The `CategoryID` must match the registered category. + * If a NotificationCategory is not registered a basic notification will be sent. + * (subtitle, category id, and data are only available on macOS) * @param {$models.NotificationOptions} options * @returns {Promise & { cancel(): void }} */ diff --git a/v3/examples/notifications/frontend/dist/Inter-Medium.ttf b/v3/examples/notifications/frontend/dist/Inter-Medium.ttf deleted file mode 100644 index a01f3777a6fc284b7a720c0f8248a27066389ef9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 315132 zcmd>{3Ajzw|M0(S?X!n-?sds<&AMdHJY`De%rlit*Gxz*k|ZQaMWm8sCL|H5Orgje zLX;sYN}^G@hWmcjK4)L_tKaY+-sgFr_ul8T*4k_QuJ8KpwfA0opS?wiNG6<+$lZ18 z)h}DV>>3eWoroNFw`kt_=)7a6M2)O0s^ph46$l{1e>k6gWyQwEyWNY9Gz_3HOX&vyAf z)S{Q>5MAJ8?;gqBOFo}`FX>%Kuhg4}e4BH=#y0Xu!QTA`56g7y>@Ol2dy5p=(eJ@- z$>AZbE{NPwf$hEhlZOqA#4CsVv?oaelKb~){O#aW5vPqvIP<^B5&SN zzrXqG{ycsElt;op`!QDN*v#5b&hDJC`frju&adR?&uep=z_GS14*mY-l@WRR#%E^J z5gn_;)b6n*lGS$$ihj6P@4+ggNJ_r}gHSL1OfsF!hHQL}O9s)M+nsb6q^Qx|dn(6vPA zI=TUFBi#nKoleH>rm-LWq<#hWRsAaNOuY_wquz}Bk=}y4L+`}htv|#4+^Q|gs%JIC zZDKuyJJ=e6`-n9Tcf7Rn$I0&?vs26| zhFiiZfm_XC?3_kUBivR_Pu$*4Z`=o*2XF^C18^U9hKc1o;ygllxHE$A80QJxxz0jS zuIEyxThJ|tTgUBy+u7}m`?&iA?o;klxKF!J<38g~!kywy!JX<(#hvD&2lrK%QFa%* zi*es@m*OsSm*cK3;-OD(xHp{e)}Vk zj}jgoW^}?YgkQj&9-fZ-es~?J8^W6i?+WiGygz&h_el5{?w4U|4u2c|7WaG@4Tpb< z&3F~`P%|^Jmxw&?#K*!)a@fDd!depS)3LB6rR?`&;m{3vY^h|U1HT@J_`b2QD{bt= zSlAQKPKbrWk`y{03&#=O6AQ=R5YC{ItYxwI1gT)5Z@>Ob60rux!na7g)jbx@d_A7& zF41ZhjaN$YSmk12Emid&v9Kle_1m#?vid~S~a&&R@fB%ch5h4XS)iH$F^BublD{H+{eYRAG!9CZrB!ugRWM=V@`kdUjN zBuh7WfLsk_FyVgEhwba}^<)_FgGi|@50cvbPdWcF{jc){v8|mem2h13VpUJrSMT9Ty>3?!}(7+ojH-SDu#-J4JfsYA$L->-WxHJI`PNg0eR zrk)%OnM*bDYd9+u%CMXc}>W)X;S;MZTi-o7KTVyUt%M{ zpqpyy=F2mb5@zI$)P2a=gfb8NwcIE}lbcEgd7JyvnwADob^xWW$D|N5?1t^0zAS_O zQtAi&vUMquf)xFc*ywzS->W{9Gc5#~G(9rbkmBnx1>HsEAMVR+MkEQ{8BLp>rLbir zGrCS9&XgYD_t!`p9oeqL4kG72YyWz`jLr6f!IZesh8y~=80{Nt9gJqGN@@O6kj9Lc zv5gcd1xCxI{5E@$-W-c)!v1aS(MVgL6eDkvv?kP((8K7#*oWzf$r0U;dyvc6hZ(zQ zpG@0PYchFTv)7wZyDs_ln$4cljk3`iN|37^TSfn*nUt7Tjja8l6mAc+*oxXs%n;lp+B0Ju?NN%a&mjNx zQA%QOYv@ZAwTBy1qIx#6N9RXVm)WNV`Ln4R6=O?*1lLQJyvZW|tkd#HTL!IG;ff$? zK_%HvmWsrckxH~t1`Xbrs}-Zz6sjSqu?f?oo7-qboY_;%TtDcBTuC=cQU@IjWS%m1 z7|f>SXw48EVPi4Z+enfY7y8oNVG@2$=8*Bb|Yth z#wE~FX<80?P)sDQpt&yPN^GUn|6ii|e_rpkJ?_f1l28#`I0oDP{d)d+`M8MGzY({b zoVDP42V>h{^2j=f$(R9Lo&d7Uiy12EF<#m^3% zk;mAc3tNaQ3?C4lt$)Av9sZ_hKH0z`#ŹD@)<7ltOtn$SSm;LMTrPEA?sR43d= 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�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 diff --git a/v3/examples/notifications/frontend/dist/assets/index-CS0sRFez.js b/v3/examples/notifications/frontend/dist/assets/index-CS0sRFez.js deleted file mode 100644 index 297ce49b9..000000000 --- a/v3/examples/notifications/frontend/dist/assets/index-CS0sRFez.js +++ /dev/null @@ -1,6 +0,0 @@ -(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const r of document.querySelectorAll('link[rel="modulepreload"]'))o(r);new MutationObserver(r=>{for(const s of r)if(s.type==="childList")for(const l of s.addedNodes)l.tagName==="LINK"&&l.rel==="modulepreload"&&o(l)}).observe(document,{childList:!0,subtree:!0});function n(r){const s={};return r.integrity&&(s.integrity=r.integrity),r.referrerPolicy&&(s.referrerPolicy=r.referrerPolicy),r.crossOrigin==="use-credentials"?s.credentials="include":r.crossOrigin==="anonymous"?s.credentials="omit":s.credentials="same-origin",s}function o(r){if(r.ep)return;r.ep=!0;const s=n(r);fetch(r.href,s)}})();let L="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict",O=(t=21)=>{let e="",n=t|0;for(;n--;)e+=L[Math.random()*64|0];return e};const _=window.location.origin+"/wails/runtime",h={Call:0,Events:3,ContextMenu:4,Dialog:5,Window:6,Browser:9,CancelCall:10};let k=O();function w(t,e){return function(n,o=null){return W(t,n,e,o)}}async function W(t,e,n,o){let r=new URL(_);t!=null&&r.searchParams.append("object",t),e!=null&&r.searchParams.append("method",e);let s={headers:{}};n&&(s.headers["x-wails-window-name"]=n),o&&r.searchParams.append("args",JSON.stringify(o)),s.headers["x-wails-client-id"]=k;let l=await fetch(r,s);if(!l.ok)throw new Error(await l.text());return l.headers.get("Content-Type")&&l.headers.get("Content-Type").indexOf("application/json")!==-1?l.json():l.text()}const P=(()=>{var t,e,n;try{if((t=window==null?void 0:window.chrome)!=null&&t.webview)return o=>window.chrome.webview.postMessage(o);if((n=(e=window==null?void 0:window.webkit)==null?void 0:e.messageHandlers)!=null&&n.external)return o=>window.webkit.messageHandlers.external.postMessage(o)}catch{console.warn(` -%c⚠️ Browser Environment Detected %c - -%cOnly UI previews are available in the browser. For full functionality, please run the application in desktop mode. -More information at: https://v3.wails.io/learn/build/#using-a-browser-for-development -`,"background: #ffffff; color: #000000; font-weight: bold; padding: 4px 8px; border-radius: 4px; border: 2px solid #000000;","background: transparent;","color: #ffffff; font-style: italic; font-weight: bold;")}return null})();function E(t){if(P)return P(t)}function H(){return window._wails.environment.OS==="windows"}function B(){return window._wails.environment.Debug===!0}window.addEventListener("contextmenu",Y);const U=w(h.ContextMenu,""),$=0;function Z(t,e,n,o){U($,{id:t,x:e,y:n,data:o})}function Y(t){let e=t.target,n=window.getComputedStyle(e).getPropertyValue("--custom-contextmenu");if(n=n?n.trim():"",n){t.preventDefault();let o=window.getComputedStyle(e).getPropertyValue("--custom-contextmenu-data");Z(n,t.clientX,t.clientY,o);return}j(t)}function j(t){if(B())return;const e=t.target;switch(window.getComputedStyle(e).getPropertyValue("--default-contextmenu").trim()){case"show":return;case"hide":t.preventDefault();return;default:if(e.isContentEditable)return;const r=window.getSelection(),s=r.toString().length>0;if(s)for(let l=0;lt.target.clientWidth||t.offsetY>t.target.clientHeight)return;p=!0}else p=!1}function V(){p=!1}function u(t){document.documentElement.style.cursor=t||G,S=t}function q(t){if(p&&(p=!1,(t.buttons!==void 0?t.buttons:t.which)>0)){E("wails:drag");return}if(!z||!H())return;let e=x("system.resizeHandleHeight")||5,n=x("system.resizeHandleWidth")||5,o=x("resizeCornerExtra")||10,r=window.outerWidth-t.clientXoe(type,{"call-id":e});let o=!1,r=!1,s=new Promise((l,a)=>{t["call-id"]=e,y.set(e,{resolve:l,reject:a}),ne(te,t).then(c=>{if(r=!0,o)return n()}).catch(c=>{a(c),y.delete(e)})});return s.cancel=()=>{if(r)return n();o=!0},s}function R(t,...e){return ae({methodID:t,args:e})}window._wails=window._wails||{};window._wails.dialogErrorCallback=we;window._wails.dialogResultCallback=he;const ce=2,ue=3,de=w(h.Dialog,""),f=new Map;function fe(){let t;do t=O();while(f.has(t));return t}function I(t,e={}){const n=fe();return e["dialog-id"]=n,new Promise((o,r)=>{f.set(n,{resolve:o,reject:r}),de(t,e).catch(s=>{r(s),f.delete(n)})})}function he(t,e,n){let o=f.get(t);o&&(f.delete(t),n?o.resolve(JSON.parse(e)):o.resolve(e))}function we(t,e){let n=f.get(t);n&&(f.delete(t),n.reject(new me(e)))}const me=t=>I(ce,t),ge=t=>I(ue,t);window._wails=window._wails||{};window._wails.dispatchWailsEvent=Ce;const pe=w(h.Events,""),Me=0,d=new Map;class be{constructor(e,n,o){this.eventName=e,this.maxCallbacks=o||-1,this.Callback=r=>(n(r),this.maxCallbacks===-1?!1:(this.maxCallbacks-=1,this.maxCallbacks===0))}}class ye{constructor(e,n=null){this.name=e,this.data=n}}function Ce(t){let e=d.get(t.name);if(e){let n=e.filter(o=>{if(o.Callback(t))return!0});n.length>0&&(e=e.filter(o=>!n.includes(o)),e.length===0?d.delete(t.name):d.set(t.name,e))}}function Ee(t,e,n){let o=d.get(t)||[];const r=new be(t,e,n);return o.push(r),d.set(t,o),()=>Se(r)}function N(t,e){return Ee(t,e,-1)}function Se(t){const e=t.eventName;let n=d.get(e).filter(o=>o!==t);n.length===0?d.delete(e):d.set(e,n)}function ve(t){return pe(Me,t)}const Re=0,xe=1,Oe=2,Te=3,Pe=4,ze=5,De=6,Ie=7,Ne=8,Ae=9,Fe=10,Le=11,_e=12,ke=13,We=14,He=15,Be=16,Ue=17,$e=18,Ze=19,Ye=20,je=21,Ge=22,Je=23,Xe=24,Ve=25,qe=26,Ke=27,Qe=28,et=29,tt=30,nt=31,ot=32,rt=33,it=34,st=35,lt=36,at=37,ct=38,ut=39,dt=40,ft=41,ht=42,wt=43,mt=44,gt=45,pt=46,Mt=47,i=Symbol();class v{constructor(e=""){this[i]=w(h.Window,e);for(const n of Object.getOwnPropertyNames(v.prototype))n!=="constructor"&&typeof this[n]=="function"&&(this[n]=this[n].bind(this))}Get(e){return new v(e)}Position(){return this[i](Re)}Center(){return this[i](xe)}Close(){return this[i](Oe)}DisableSizeConstraints(){return this[i](Te)}EnableSizeConstraints(){return this[i](Pe)}Focus(){return this[i](ze)}ForceReload(){return this[i](De)}Fullscreen(){return this[i](Ie)}GetScreen(){return this[i](Ne)}GetZoom(){return this[i](Ae)}Height(){return this[i](Fe)}Hide(){return this[i](Le)}IsFocused(){return this[i](_e)}IsFullscreen(){return this[i](ke)}IsMaximised(){return this[i](We)}IsMinimised(){return this[i](He)}Maximise(){return this[i](Be)}Minimise(){return this[i](Ue)}Name(){return this[i]($e)}OpenDevTools(){return this[i](Ze)}RelativePosition(){return this[i](Ye)}Reload(){return this[i](je)}Resizable(){return this[i](Ge)}Restore(){return this[i](Je)}SetPosition(e,n){return this[i](Xe,{x:e,y:n})}SetAlwaysOnTop(e){return this[i](Ve,{alwaysOnTop:e})}SetBackgroundColour(e,n,o,r){return this[i](qe,{r:e,g:n,b:o,a:r})}SetFrameless(e){return this[i](Ke,{frameless:e})}SetFullscreenButtonEnabled(e){return this[i](Qe,{enabled:e})}SetMaxSize(e,n){return this[i](et,{width:e,height:n})}SetMinSize(e,n){return this[i](tt,{width:e,height:n})}SetRelativePosition(e,n){return this[i](nt,{x:e,y:n})}SetResizable(e){return this[i](ot,{resizable:e})}SetSize(e,n){return this[i](rt,{width:e,height:n})}SetTitle(e){return this[i](it,{title:e})}SetZoom(e){return this[i](st,{zoom:e})}Show(){return this[i](lt)}Size(){return this[i](at)}ToggleFullscreen(){return this[i](ct)}ToggleMaximise(){return this[i](ut)}UnFullscreen(){return this[i](dt)}UnMaximise(){return this[i](ft)}UnMinimise(){return this[i](ht)}Width(){return this[i](wt)}Zoom(){return this[i](mt)}ZoomIn(){return this[i](gt)}ZoomOut(){return this[i](pt)}ZoomReset(){return this[i](Mt)}}const bt=new v("");function yt(){if(!EventTarget||!AbortSignal||!AbortController)return!1;let t=!0;const e=new EventTarget,n=new AbortController;return e.addEventListener("test",()=>{t=!1},{signal:n.signal}),n.abort(),e.dispatchEvent(new CustomEvent("test")),t}document.addEventListener("DOMContentLoaded",()=>!0);function Ct(t,e=null){ve(new ye(t,e))}function Et(t,e){const n=bt.Get(t),o=n[e];if(typeof o!="function"){console.error(`Window method '${e}' not found`);return}try{o.call(n)}catch(r){console.error(`Error calling window method '${e}': `,r)}}function St(t){const e=t.currentTarget;function n(r="Yes"){if(r!=="Yes")return;const s=e.getAttribute("data-wml-event"),l=e.getAttribute("data-wml-target-window")||"",a=e.getAttribute("data-wml-window"),c=e.getAttribute("data-wml-openURL");s!==null&&Ct(s),a!==null&&Et(l,a),c!==null&&ee(c)}const o=e.getAttribute("data-wml-confirm");o?ge({Title:"Confirm",Message:o,Detached:!1,Buttons:[{Label:"Yes"},{Label:"No",IsDefault:!0}]}).then(n):n()}const C=Symbol();class vt{constructor(){this[C]=new AbortController}set(e,n){return{signal:this[C].signal}}reset(){this[C].abort(),this[C]=new AbortController}}const b=Symbol(),g=Symbol();class Rt{constructor(){this[b]=new WeakMap,this[g]=0}set(e,n){return this[g]+=!this[b].has(e),this[b].set(e,n),{}}reset(){if(!(this[g]<=0)){for(const e of document.body.querySelectorAll("*")){if(this[g]<=0)break;const n=this[b].get(e);this[g]-=typeof n<"u";for(const o of n||[])e.removeEventListener(o,St)}this[b]=new WeakMap,this[g]=0}}}yt()?new vt:new Rt;window._wails=window._wails||{};let A=!1;function xt(){window._wails.invoke=E,E("wails:runtime:ready"),A=!0}window.addEventListener("load",()=>{A||xt()});function Ot(t){return R(2679064664,t)}function F(){return R(3412125712)}function Tt(t,e,n,o){return R(2246903123,t,e,n,o)}function Pt(t){return R(1615199806,t)}const zt=document.getElementById("time"),Dt=document.getElementById("notifications");window.sendNotification=async()=>{await F()&&await Tt("some-uuid-fronted","Frontend Notificaiton","","Notificaiton sent through JS!")};window.sendComplexNotification=async()=>{await F()&&(await Ot({id:"FRONTEND_NOTIF",actions:[{id:"VIEW_ACTION",title:"View"},{id:"MARK_READ_ACTION",title:"Mark as Read"},{id:"DELETE_ACTION",title:"Delete",destructive:!0}],hasReplyField:!0,replyButtonTitle:"Reply",replyPlaceholder:"Reply to frontend..."}),await Pt({id:"some-uuid-complex",title:"Complex Frontend Notification",subtitle:"From: Jane Doe",body:"Is it rainging today where you are?",categoryId:"FRONTEND_NOTIF",data:{messageId:"msg-456",senderId:"user-456",timestamp:Date.now()}}))};N("time",t=>{zt.innerText=t.data});N("notificationResponse",t=>{Dt.innerText+=JSON.stringify(t.data[0].data)}); diff --git a/v3/examples/notifications/frontend/dist/index.html b/v3/examples/notifications/frontend/dist/index.html deleted file mode 100644 index 39216bd8d..000000000 --- a/v3/examples/notifications/frontend/dist/index.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - Wails App - - - - - - diff --git a/v3/examples/notifications/frontend/dist/javascript.svg b/v3/examples/notifications/frontend/dist/javascript.svg deleted file mode 100644 index f9abb2b72..000000000 --- a/v3/examples/notifications/frontend/dist/javascript.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/v3/examples/notifications/frontend/dist/style.css b/v3/examples/notifications/frontend/dist/style.css deleted file mode 100644 index 127799eda..000000000 --- a/v3/examples/notifications/frontend/dist/style.css +++ /dev/null @@ -1,160 +0,0 @@ -:root { - font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", - "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", - sans-serif; - font-size: 16px; - line-height: 24px; - font-weight: 400; - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - background-color: rgba(27, 38, 54, 1); - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -webkit-text-size-adjust: 100%; -} - -* { - user-select: none; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; -} - -@font-face { - font-family: "Inter"; - font-style: normal; - font-weight: 400; - src: local(""), - url("./Inter-Medium.ttf") format("truetype"); -} - -h3 { - font-size: 3em; - line-height: 1.1; -} - -a { - font-weight: 500; - color: #646cff; - text-decoration: inherit; -} - -a:hover { - color: #535bf2; -} - -button { - /* width: 60px; */ - height: 30px; - line-height: 30px; - border-radius: 3px; - border: none; - margin: 0 0 0 20px; - padding: 0 8px; - cursor: pointer; -} - -.result { - height: 20px; - line-height: 20px; -} - -body { - margin: 0; - display: flex; - place-items: center; - place-content: center; - min-width: 320px; - min-height: 100vh; -} - -.container { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; -} - -h1 { - font-size: 3.2em; - line-height: 1.1; -} - -#app { - max-width: 1280px; - margin: 0 auto; - padding: 2rem; - text-align: center; -} - -.logo { - height: 6em; - padding: 1.5em; - will-change: filter; -} - -.logo:hover { - filter: drop-shadow(0 0 2em #e80000aa); -} - -.logo.vanilla:hover { - filter: drop-shadow(0 0 2em #f7df1eaa); -} - -.result { - height: 20px; - line-height: 20px; - margin: 1.5rem auto; - text-align: center; -} - -.footer { - margin-top: 1rem; - align-content: center; - text-align: center; -} - -@media (prefers-color-scheme: light) { - :root { - color: #213547; - background-color: #ffffff; - } - - a:hover { - color: #747bff; - } - - button { - background-color: #f9f9f9; - } -} - - -.input-box .btn:hover { - background-image: linear-gradient(to top, #cfd9df 0%, #e2ebf0 100%); - color: #333333; -} - -.input-box .input { - border: none; - border-radius: 3px; - outline: none; - height: 30px; - line-height: 30px; - padding: 0 10px; - color: black; - background-color: rgba(240, 240, 240, 1); - -webkit-font-smoothing: antialiased; -} - -.input-box .input:hover { - border: none; - background-color: rgba(255, 255, 255, 1); -} - -.input-box .input:focus { - border: none; - background-color: rgba(255, 255, 255, 1); -} \ No newline at end of file diff --git a/v3/examples/notifications/frontend/dist/wails.png b/v3/examples/notifications/frontend/dist/wails.png deleted file mode 100644 index 8bdf424833bfb5b6b34a0807224e94533f738f2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9057 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 { const granted = await Notifications.RequestUserNotificationAuthorization(); if (granted) { - const uuid = crypto.randomUUID(); - await Notifications.SendNotification(uuid, "Frontend Notification", "", "Notification sent through JS!"); + const id = System.IsWindows() ? "Wails Notification Demo" : crypto.randomUUID() + await Notifications.SendNotification({ + id, + title: "Title", + body: "Body!", + data: { + messageId: "msg-123", + senderId: "user-123", + timestamp: Date.now(), + } + }); } } @@ -20,19 +29,18 @@ window.sendComplexNotification = async () => { actions: [ { id: "VIEW_ACTION", title: "View" }, { id: "MARK_READ_ACTION", title: "Mark as Read" }, - { id: "DELETE_ACTION", title: "Delete", destructive: true }, ], hasReplyField: true, replyButtonTitle: "Reply", replyPlaceholder: "Reply to frontend...", }); - const uuid = crypto.randomUUID(); + const id = System.IsWindows() ? "Wails Notification Demo" : crypto.randomUUID() await Notifications.SendNotificationWithActions({ - id: uuid, + id, title: "Complex Frontend Notification", subtitle: "From: Jane Doe", - body: "Is it raining today where you are?", + body: "Is it rainging today where you are?", categoryId: "FRONTEND_NOTIF", data: { messageId: "msg-456", @@ -48,5 +56,6 @@ Events.On('time', (time) => { }); Events.On("notificationResponse", (response) => { + console.log(response) notificationsElement.innerText += JSON.stringify(response.data[0].data); }); \ No newline at end of file diff --git a/v3/examples/notifications/main.go b/v3/examples/notifications/main.go index 8c2e941df..d69bf3f93 100644 --- a/v3/examples/notifications/main.go +++ b/v3/examples/notifications/main.go @@ -9,18 +9,29 @@ import ( "time" "github.com/wailsapp/wails/v3/pkg/application" - "github.com/wailsapp/wails/v3/pkg/events" "github.com/wailsapp/wails/v3/pkg/services/notifications" ) +// Wails uses Go's `embed` package to embed the frontend files into the binary. +// Any files in the frontend/dist folder will be embedded into the binary and +// made available to the frontend. +// See https://pkg.go.dev/embed for more information. + //go:embed all:frontend/dist var assets embed.FS +// main function serves as the application's entry point. It initializes the application, creates a window, +// and starts a goroutine that emits a time-based event every second. It subsequently runs the application and +// logs any error that might occur. func main() { NotificationService := notifications.New() - + // Create a new Wails application by providing the necessary options. + // Variables 'Name' and 'Description' are for application metadata. + // 'Assets' configures the asset server with the 'FS' variable pointing to the frontend files. + // 'Bind' is a list of Go struct instances. The frontend has access to the methods of these instances. + // 'Mac' options tailor the application when running an macOS. app := application.New(application.Options{ - Name: "notifications", + Name: "notifications_demo", Description: "A demo of using raw HTML & CSS", Services: []application.Service{ application.NewService(NotificationService), @@ -33,6 +44,11 @@ func main() { }, }) + // Create a new window with the necessary options. + // 'Title' is the title of the window. + // 'Mac' options tailor the window when running on macOS. + // 'BackgroundColour' is the background colour of the window. + // 'URL' is the URL that will be loaded into the webview. app.NewWebviewWindowWithOptions(application.WebviewWindowOptions{ Title: "Window 1", Mac: application.MacWindow{ @@ -44,85 +60,52 @@ func main() { URL: "/", }) - app.OnApplicationEvent(events.Mac.ApplicationDidFinishLaunching, func(event *application.ApplicationEvent) { - // Request pemission to send notifications - granted, err := NotificationService.RequestUserNotificationAuthorization() - if err != nil { - log.Default().Printf("WARNING: %s\n", err) - } - - if granted { - // Send notification with no actions - err = NotificationService.SendNotification("some-uuid", "Title", "", "body!") - if err != nil { - log.Default().Printf("WARNING: %s\n", err) - } - - err = NotificationService.RegisterNotificationCategory(notifications.NotificationCategory{ - ID: "MESSAGE_CATEGORY", - Actions: []notifications.NotificationAction{ - {ID: "VIEW_ACTION", Title: "View"}, - {ID: "MARK_READ_ACTION", Title: "Mark as Read"}, - {ID: "DELETE_ACTION", Title: "Delete", Destructive: true}, - }, - HasReplyField: true, - ReplyPlaceholder: "Type your reply...", - ReplyButtonTitle: "Reply", - }) - if err != nil { - log.Default().Printf("WARNING: %s\n", err) - } - - err = NotificationService.SendNotificationWithActions(notifications.NotificationOptions{ - ID: "some-other-uuid", - Title: "New Message", - Subtitle: "From: Jane Doe", - Body: "Is it raining today where you are?", - CategoryID: "MESSAGE_CATEGORY", - Data: map[string]interface{}{ - "messageId": "msg-123", - "senderId": "user-123", - "timestamp": time.Now().Unix(), - }, - }) - if err != nil { - log.Default().Printf("WARNING: %s\n", err) - } - } - }) - - app.OnEvent("notificationResponse", func(event *application.CustomEvent) { - data, _ := json.Marshal(event.Data) - fmt.Printf("%s\n", string(data)) - }) - go func() { - time.Sleep(time.Second * 5) - // Sometime later check if you are still authorized - granted, err := NotificationService.CheckNotificationAuthorization() - if err != nil { - log.Default().Printf("WARNING: %s\n", err) - } - println(granted) + app.OnEvent("notificationResponse", func(event *application.CustomEvent) { + data, _ := json.Marshal(event.Data) + fmt.Printf("%s\n", string(data)) + }) - // Sometime later remove delivered notification by identifier - err = NotificationService.RemoveDeliveredNotification("some-uuid") - if err != nil { - log.Default().Printf("WARNING: %s\n", err) - } - }() + NotificationService.RequestUserNotificationAuthorization() + NotificationService.CheckNotificationAuthorization() - go func() { - time.Sleep(time.Second * 10) - // Sometime later remove all pending and delivered notifications - err := NotificationService.RemoveAllPendingNotifications() - if err != nil { - log.Default().Printf("WARNING: %s\n", err) - } - err = NotificationService.RemoveAllDeliveredNotifications() - if err != nil { - log.Default().Printf("WARNING: %s\n", err) - } + time.Sleep(time.Second * 2) + NotificationService.SendNotification(notifications.NotificationOptions{ + ID: "Wails Notification Demo", + Title: "Title!", + Body: "Body!", + Data: map[string]interface{}{ + "messageId": "msg-123", + "senderId": "user-123", + "timestamp": time.Now().String(), + }, + }) + + time.Sleep(time.Second * 2) + NotificationService.RegisterNotificationCategory(notifications.NotificationCategory{ + ID: "BACKEND_NOTIF", + Actions: []notifications.NotificationAction{ + {ID: "VIEW_ACTION", Title: "View"}, + {ID: "MARK_READ_ACTION", Title: "Mark as Read"}, + {ID: "DELETE_ACTION", Title: "Delete", Destructive: true}, + }, + HasReplyField: true, + ReplyButtonTitle: "Reply", + ReplyPlaceholder: "Reply to backend...", + }) + + NotificationService.SendNotificationWithActions(notifications.NotificationOptions{ + ID: "Wails Notification Demo", + Title: "Complex Backend Notification", + Subtitle: "Should not show on Windows", + Body: "Is it raining today where you are?", + CategoryID: "BACKEND_NOTIF", + Data: map[string]interface{}{ + "messageId": "msg-456", + "senderId": "user-456", + "timestamp": time.Now().String(), + }, + }) }() // Run the application. This blocks until the application has been exited. From c904433ff345677026f326cacbf77d25e51824a5 Mon Sep 17 00:00:00 2001 From: popaprozac Date: Sun, 23 Feb 2025 16:30:13 -0800 Subject: [PATCH 035/374] update example --- v3/examples/notifications/frontend/main.js | 5 -- v3/examples/notifications/main.go | 99 +++++++++++++--------- 2 files changed, 58 insertions(+), 46 deletions(-) diff --git a/v3/examples/notifications/frontend/main.js b/v3/examples/notifications/frontend/main.js index 9f1ac1d69..79fc8dcca 100644 --- a/v3/examples/notifications/frontend/main.js +++ b/v3/examples/notifications/frontend/main.js @@ -1,7 +1,6 @@ import * as Notifications from "./bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/service"; import { Events, System } from "@wailsio/runtime"; -const timeElement = document.getElementById('time'); const notificationsElement = document.getElementById('notifications'); window.sendNotification = async () => { @@ -51,10 +50,6 @@ window.sendComplexNotification = async () => { } } -Events.On('time', (time) => { - timeElement.innerText = time.data; -}); - Events.On("notificationResponse", (response) => { console.log(response) notificationsElement.innerText += JSON.stringify(response.data[0].data); diff --git a/v3/examples/notifications/main.go b/v3/examples/notifications/main.go index d69bf3f93..dc9fec9c9 100644 --- a/v3/examples/notifications/main.go +++ b/v3/examples/notifications/main.go @@ -60,52 +60,69 @@ func main() { URL: "/", }) + app.OnEvent("notificationResponse", func(event *application.CustomEvent) { + data, _ := json.Marshal(event.Data) + fmt.Printf("%s\n", string(data)) + }) + go func() { - app.OnEvent("notificationResponse", func(event *application.CustomEvent) { - data, _ := json.Marshal(event.Data) - fmt.Printf("%s\n", string(data)) - }) + granted, err := NotificationService.RequestUserNotificationAuthorization() + if err != nil { + log.Default().Printf("WARNING: %s\n", err) + return + } - NotificationService.RequestUserNotificationAuthorization() - NotificationService.CheckNotificationAuthorization() + if granted { + time.Sleep(time.Second * 2) - time.Sleep(time.Second * 2) - NotificationService.SendNotification(notifications.NotificationOptions{ - ID: "Wails Notification Demo", - Title: "Title!", - Body: "Body!", - Data: map[string]interface{}{ - "messageId": "msg-123", - "senderId": "user-123", - "timestamp": time.Now().String(), - }, - }) + var uuid1 string = "Wails Notification Demo" + if application.Get().Environment().OS == "darwin" { + uuid1 = "uuid1" + } - time.Sleep(time.Second * 2) - NotificationService.RegisterNotificationCategory(notifications.NotificationCategory{ - ID: "BACKEND_NOTIF", - Actions: []notifications.NotificationAction{ - {ID: "VIEW_ACTION", Title: "View"}, - {ID: "MARK_READ_ACTION", Title: "Mark as Read"}, - {ID: "DELETE_ACTION", Title: "Delete", Destructive: true}, - }, - HasReplyField: true, - ReplyButtonTitle: "Reply", - ReplyPlaceholder: "Reply to backend...", - }) + NotificationService.SendNotification(notifications.NotificationOptions{ + ID: uuid1, + Title: "Title!", + Body: "Body!", + Data: map[string]interface{}{ + "messageId": "msg-123", + "senderId": "user-123", + "timestamp": time.Now().String(), + }, + }) - NotificationService.SendNotificationWithActions(notifications.NotificationOptions{ - ID: "Wails Notification Demo", - Title: "Complex Backend Notification", - Subtitle: "Should not show on Windows", - Body: "Is it raining today where you are?", - CategoryID: "BACKEND_NOTIF", - Data: map[string]interface{}{ - "messageId": "msg-456", - "senderId": "user-456", - "timestamp": time.Now().String(), - }, - }) + time.Sleep(time.Second * 2) + + var uuid2 string = "Wails Notification Demo" + if application.Get().Environment().OS == "darwin" { + uuid2 = "uuid2" + } + + NotificationService.RegisterNotificationCategory(notifications.NotificationCategory{ + ID: "BACKEND_NOTIF", + Actions: []notifications.NotificationAction{ + {ID: "VIEW_ACTION", Title: "View"}, + {ID: "MARK_READ_ACTION", Title: "Mark as Read"}, + {ID: "DELETE_ACTION", Title: "Delete", Destructive: true}, + }, + HasReplyField: true, + ReplyButtonTitle: "Reply", + ReplyPlaceholder: "Reply to backend...", + }) + + NotificationService.SendNotificationWithActions(notifications.NotificationOptions{ + ID: uuid2, + Title: "Complex Backend Notification", + Subtitle: "Should not show on Windows", + Body: "Is it raining today where you are?", + CategoryID: "BACKEND_NOTIF", + Data: map[string]interface{}{ + "messageId": "msg-456", + "senderId": "user-456", + "timestamp": time.Now().String(), + }, + }) + } }() // Run the application. This blocks until the application has been exited. From 983c25f69fe0e989ab87bcefe3129690a4788a54 Mon Sep 17 00:00:00 2001 From: Zach Botterman Date: Sun, 23 Feb 2025 21:59:27 -0800 Subject: [PATCH 036/374] rw safety --- .../notifications/notifications_windows.go | 27 +++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/v3/pkg/services/notifications/notifications_windows.go b/v3/pkg/services/notifications/notifications_windows.go index 078a3cb08..56e939cd3 100644 --- a/v3/pkg/services/notifications/notifications_windows.go +++ b/v3/pkg/services/notifications/notifications_windows.go @@ -9,13 +9,15 @@ import ( "os" "path/filepath" "strings" + "sync" "git.sr.ht/~jackmordaunt/go-toast" "github.com/wailsapp/wails/v3/pkg/application" "golang.org/x/sys/windows/registry" ) -var NotificationCategories map[string]NotificationCategory = make(map[string]NotificationCategory) +var NotificationLock sync.RWMutex +var NotificationCategories = make(map[string]NotificationCategory) const ( defaultAction = "defaultActionIdentifier" @@ -57,6 +59,9 @@ func (ns *Service) ServiceStartup(ctx context.Context, options application.Servi application.Get().EmitEvent("notificationResponse", response) }) + + NotificationLock.Lock() + defer NotificationLock.Unlock() return loadCategoriesFromRegistry() } @@ -112,7 +117,9 @@ func (ns *Service) SendNotification(options NotificationOptions) error { // If a NotificationCategory is not registered a basic notification will be sent. // (subtitle, category id, and data are only available on macOS) func (ns *Service) SendNotificationWithActions(options NotificationOptions) error { + NotificationLock.RLock() nCategory := NotificationCategories[options.CategoryID] + NotificationLock.RUnlock() n := toast.Notification{ AppID: options.ID, @@ -160,6 +167,7 @@ func (ns *Service) SendNotificationWithActions(options NotificationOptions) erro // RegisterNotificationCategory registers a new NotificationCategory to be used with SendNotificationWithActions. func (ns *Service) RegisterNotificationCategory(category NotificationCategory) error { + NotificationLock.Lock() NotificationCategories[category.ID] = NotificationCategory{ ID: category.ID, Actions: category.Actions, @@ -167,13 +175,17 @@ func (ns *Service) RegisterNotificationCategory(category NotificationCategory) e ReplyPlaceholder: category.ReplyPlaceholder, ReplyButtonTitle: category.ReplyButtonTitle, } + NotificationLock.Unlock() return saveCategoriesToRegistry() } // RemoveNotificationCategory removes a previously registered NotificationCategory. func (ns *Service) RemoveNotificationCategory(categoryId string) error { + NotificationLock.Lock() delete(NotificationCategories, categoryId) + NotificationLock.Unlock() + return saveCategoriesToRegistry() } @@ -236,7 +248,9 @@ func saveCategoriesToRegistry() error { } defer key.Close() + NotificationLock.RLock() data, err := json.Marshal(NotificationCategories) + NotificationLock.RUnlock() if err != nil { return err } @@ -269,7 +283,16 @@ func loadCategoriesFromRegistry() error { return err } - return json.Unmarshal([]byte(data), &NotificationCategories) + categories := make(map[string]NotificationCategory) + if err := json.Unmarshal([]byte(data), &categories); err != nil { + return err + } + + NotificationLock.Lock() + NotificationCategories = categories + NotificationLock.Unlock() + + return nil } func getUserText(data []toast.UserData) (string, bool) { From 1e3511c0d3127faf0def240a1bbdf64eaa8b286d Mon Sep 17 00:00:00 2001 From: Zach Botterman Date: Sun, 23 Feb 2025 22:18:07 -0800 Subject: [PATCH 037/374] fix deadlock --- v3/pkg/services/notifications/notifications_windows.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/v3/pkg/services/notifications/notifications_windows.go b/v3/pkg/services/notifications/notifications_windows.go index 56e939cd3..23a2f787e 100644 --- a/v3/pkg/services/notifications/notifications_windows.go +++ b/v3/pkg/services/notifications/notifications_windows.go @@ -60,8 +60,6 @@ func (ns *Service) ServiceStartup(ctx context.Context, options application.Servi application.Get().EmitEvent("notificationResponse", response) }) - NotificationLock.Lock() - defer NotificationLock.Unlock() return loadCategoriesFromRegistry() } From 3dbf0589ce497ea17011ed3cd291b8faf0e45ade Mon Sep 17 00:00:00 2001 From: Zach Botterman Date: Sun, 23 Feb 2025 22:25:12 -0800 Subject: [PATCH 038/374] update comments --- v3/pkg/services/notifications/notifications_windows.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/v3/pkg/services/notifications/notifications_windows.go b/v3/pkg/services/notifications/notifications_windows.go index 23a2f787e..0dfb1a367 100644 --- a/v3/pkg/services/notifications/notifications_windows.go +++ b/v3/pkg/services/notifications/notifications_windows.go @@ -87,7 +87,7 @@ func (ns *Service) CheckNotificationAuthorization() bool { } // SendNotification sends a basic notification with a name, title, and body. All other options are ignored on Windows. -// (subtitle, category id, and data are only available on macOS) +// (subtitle and category id are only available on macOS) func (ns *Service) SendNotification(options NotificationOptions) error { n := toast.Notification{ AppID: options.ID, @@ -113,7 +113,7 @@ func (ns *Service) SendNotification(options NotificationOptions) error { // SendNotificationWithActions sends a notification with additional actions and inputs. // A NotificationCategory must be registered with RegisterNotificationCategory first. The `CategoryID` must match the registered category. // If a NotificationCategory is not registered a basic notification will be sent. -// (subtitle, category id, and data are only available on macOS) +// (subtitle and category id are only available on macOS) func (ns *Service) SendNotificationWithActions(options NotificationOptions) error { NotificationLock.RLock() nCategory := NotificationCategories[options.CategoryID] @@ -164,6 +164,7 @@ func (ns *Service) SendNotificationWithActions(options NotificationOptions) erro } // RegisterNotificationCategory registers a new NotificationCategory to be used with SendNotificationWithActions. +// Registering a category with the same name as a previously registered NotificationCategory will override it. func (ns *Service) RegisterNotificationCategory(category NotificationCategory) error { NotificationLock.Lock() NotificationCategories[category.ID] = NotificationCategory{ From 1dff481199f4a9e77f46a9db672c1c55e6ae719b Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Mon, 24 Feb 2025 07:54:46 +0000 Subject: [PATCH 039/374] [skip ci] Publish @wailsio/runtime 3.0.0-alpha.57 --- .../docs/classes/Call.RuntimeError.html | 4 +-- .../docs/classes/Events.WailsEvent.html | 4 +-- .../docs/functions/Application.Hide.html | 2 +- .../docs/functions/Application.Quit.html | 2 +- .../docs/functions/Application.Show.html | 2 +- .../docs/functions/Browser.OpenURL.html | 2 +- .../runtime/docs/functions/Call.ByID.html | 2 +- .../runtime/docs/functions/Call.ByName.html | 2 +- .../runtime/docs/functions/Call.Call.html | 2 +- .../docs/functions/Clipboard.SetText.html | 2 +- .../docs/functions/Clipboard.Text.html | 2 +- .../runtime/docs/functions/Create.Any.html | 2 +- .../runtime/docs/functions/Create.Array.html | 2 +- .../docs/functions/Create.ByteSlice.html | 2 +- .../runtime/docs/functions/Create.Map.html | 2 +- .../docs/functions/Create.Nullable.html | 2 +- .../runtime/docs/functions/Create.Struct.html | 2 +- .../runtime/docs/functions/Dialogs.Error.html | 2 +- .../runtime/docs/functions/Dialogs.Info.html | 2 +- .../docs/functions/Dialogs.OpenFile.html | 2 +- .../docs/functions/Dialogs.Question.html | 2 +- .../docs/functions/Dialogs.SaveFile.html | 2 +- .../docs/functions/Dialogs.Warning.html | 2 +- .../runtime/docs/functions/Events.Emit.html | 2 +- .../runtime/docs/functions/Events.Off.html | 2 +- .../runtime/docs/functions/Events.OffAll.html | 2 +- .../runtime/docs/functions/Events.On.html | 2 +- .../docs/functions/Events.OnMultiple.html | 2 +- .../runtime/docs/functions/Events.Once.html | 2 +- .../runtime/docs/functions/Events.setup.html | 2 +- .../runtime/docs/functions/Flags.GetFlag.html | 2 +- .../docs/functions/Screens.GetAll.html | 2 +- .../docs/functions/Screens.GetCurrent.html | 2 +- .../docs/functions/Screens.GetPrimary.html | 2 +- .../docs/functions/System.Capabilities.html | 2 +- .../docs/functions/System.Environment.html | 2 +- .../docs/functions/System.IsAMD64.html | 2 +- .../runtime/docs/functions/System.IsARM.html | 2 +- .../docs/functions/System.IsARM64.html | 2 +- .../docs/functions/System.IsDarkMode.html | 2 +- .../docs/functions/System.IsDebug.html | 2 +- .../docs/functions/System.IsLinux.html | 2 +- .../runtime/docs/functions/System.IsMac.html | 2 +- .../docs/functions/System.IsWindows.html | 2 +- .../runtime/docs/functions/System.invoke.html | 2 +- .../runtime/docs/functions/WML.Enable.html | 2 +- .../runtime/docs/functions/WML.Reload.html | 2 +- .../@wailsio/runtime/docs/functions/init.html | 2 +- .../docs/interfaces/Call.CallOptions.html | 8 ++--- .../docs/interfaces/Dialogs.Button.html | 8 ++--- .../docs/interfaces/Dialogs.FileFilter.html | 6 ++-- .../Dialogs.MessageDialogOptions.html | 10 +++--- .../Dialogs.OpenFileDialogOptions.html | 34 +++++++++--------- .../Dialogs.SaveFileDialogOptions.html | 36 +++++++++---------- .../runtime/docs/interfaces/Screens.Rect.html | 10 +++--- .../docs/interfaces/Screens.Screen.html | 26 +++++++------- .../runtime/docs/interfaces/Screens.Size.html | 6 ++-- .../interfaces/System.EnvironmentInfo.html | 12 +++---- .../docs/interfaces/System.OSInfo.html | 10 +++--- .../runtime/docs/modules/Application.html | 2 +- .../runtime/docs/modules/Browser.html | 2 +- .../@wailsio/runtime/docs/modules/Call.html | 2 +- .../runtime/docs/modules/Clipboard.html | 2 +- .../@wailsio/runtime/docs/modules/Create.html | 2 +- .../runtime/docs/modules/Dialogs.html | 2 +- .../@wailsio/runtime/docs/modules/Events.html | 2 +- .../@wailsio/runtime/docs/modules/Flags.html | 2 +- .../runtime/docs/modules/Screens.html | 2 +- .../@wailsio/runtime/docs/modules/System.html | 2 +- .../@wailsio/runtime/docs/modules/WML.html | 2 +- .../runtime/docs/variables/Events.Types.html | 2 +- .../runtime/docs/variables/Window.html | 2 +- .../desktop/@wailsio/runtime/package.json | 2 +- 73 files changed, 147 insertions(+), 147 deletions(-) diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Call.RuntimeError.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Call.RuntimeError.html index c48e109d2..0a3c47496 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Call.RuntimeError.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Call.RuntimeError.html @@ -1,6 +1,6 @@ RuntimeError | @wailsio/runtime

    Exception class that will be thrown in case the bound method returns an error. The value of the RuntimeError#name property is "RuntimeError".

    -

    Hierarchy

    • Error
      • RuntimeError

    Constructors

    Hierarchy

    • Error
      • RuntimeError

    Constructors

    Properties

    cause? message name @@ -8,4 +8,4 @@ The value of the

    Constructors

    • Constructs a new RuntimeError instance.

      Parameters

      • message: string

        The error message.

      • Rest ...args: any[]

        Optional arguments for the Error constructor.

        -

      Returns RuntimeError

    Properties

    cause?: unknown
    message: string
    name: string
    stack?: string

    Generated using TypeDoc

    \ No newline at end of file +
    - -

    Wails + Javascript

    - -
    + +

    Wails + Javascript

    + +
    - -

    Wails + Javascript

    - -

    Returns RuntimeError

    Properties

    cause?: unknown
    message: string
    name: string
    stack?: string

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Events.WailsEvent.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Events.WailsEvent.html index 62aa8f9ad..df9e89a3f 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Events.WailsEvent.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Events.WailsEvent.html @@ -1,4 +1,4 @@ -WailsEvent | @wailsio/runtime

    Constructors

    constructor +WailsEvent | @wailsio/runtime

    Constructors

    Properties

    Constructors

    Properties

    data: any
    name: any

    Generated using TypeDoc

    \ No newline at end of file +

    Constructors

    Properties

    data: any
    name: any

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Hide.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Hide.html index a08585c2a..3c599547b 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Hide.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Hide.html @@ -1,2 +1,2 @@ Hide | @wailsio/runtime
    • Hides a certain method by calling the HideMethod function.

      -

      Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file +

    Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Quit.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Quit.html index 01bd8f80e..58f8b8876 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Quit.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Quit.html @@ -1,2 +1,2 @@ Quit | @wailsio/runtime
    • Calls the QuitMethod to terminate the program.

      -

      Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file +

    Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Show.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Show.html index 17581c525..546052e05 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Show.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Show.html @@ -1,2 +1,2 @@ Show | @wailsio/runtime
    • Calls the ShowMethod and returns the result.

      -

      Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file +

    Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Browser.OpenURL.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Browser.OpenURL.html index 37a530915..7c1e2a846 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Browser.OpenURL.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Browser.OpenURL.html @@ -1,3 +1,3 @@ OpenURL | @wailsio/runtime
    • Open a browser window to the given URL

      Parameters

      • url: string

        The URL to open

        -

      Returns Promise<string>

    Generated using TypeDoc

    \ No newline at end of file +

    Returns Promise<string>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByID.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByID.html index fc2e75e38..be1007fab 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByID.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByID.html @@ -5,4 +5,4 @@ See Call for details.

    Returns Promise<any>

    • The result of the method call.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByName.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByName.html index 33444099e..2b9c980d8 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByName.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByName.html @@ -3,4 +3,4 @@ See Call for details.

    Parameters

    • methodName: string

      The name of the method in the format 'package.struct.method'.

    • Rest ...args: any[]

      The arguments to pass to the method.

    Returns Promise<any>

    The result of the method call.

    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.Call.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.Call.html index 29f44519b..6cb45c0ac 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.Call.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.Call.html @@ -8,4 +8,4 @@ by the application- or service-level error marshaling functions.

    Returns Promise<any>

    • The result of the call.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.SetText.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.SetText.html index f7dcf256a..25c0256f6 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.SetText.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.SetText.html @@ -3,4 +3,4 @@

    Returns Promise<any>

    • A Promise that resolves when the operation is successful.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.Text.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.Text.html index dde4beeba..43a3b1dcc 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.Text.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.Text.html @@ -1,3 +1,3 @@ Text | @wailsio/runtime
    • Get the Clipboard text

      Returns Promise<string>

      A promise that resolves with the text from the Clipboard.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Any.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Any.html index 251ad8f36..a8ef5b801 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Any.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Any.html @@ -1,2 +1,2 @@ Any | @wailsio/runtime
    • Any is a dummy creation function for simple or unknown types.

      -

      Type Parameters

      • T

      Parameters

      • source: any

      Returns T

    Generated using TypeDoc

    \ No newline at end of file +

    Type Parameters

    • T

    Parameters

    • source: any

    Returns T

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Array.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Array.html index 63151d29f..438177f63 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Array.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Array.html @@ -1,4 +1,4 @@ Array | @wailsio/runtime
    • Array takes a creation function for an arbitrary type and returns an in-place creation function for an array whose elements are of that type.

      -

      Type Parameters

      • T

      Parameters

      • element: ((source) => T)
          • (source): T
          • Parameters

            • source: any

            Returns T

      Returns ((source) => T[])

        • (source): T[]
        • Parameters

          • source: any

          Returns T[]

    Generated using TypeDoc

    \ No newline at end of file +

    Type Parameters

    • T

    Parameters

    • element: ((source) => T)
        • (source): T
        • Parameters

          • source: any

          Returns T

    Returns ((source) => T[])

      • (source): T[]
      • Parameters

        • source: any

        Returns T[]

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.ByteSlice.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.ByteSlice.html index 72a9ad146..d4f7c30b9 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.ByteSlice.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.ByteSlice.html @@ -1,3 +1,3 @@ ByteSlice | @wailsio/runtime
    • ByteSlice is a creation function that replaces null strings with empty strings.

      -

      Parameters

      • source: any

      Returns string

    Generated using TypeDoc

    \ No newline at end of file +

    Parameters

    • source: any

    Returns string

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Map.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Map.html index a81270070..390ece492 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Map.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Map.html @@ -1,4 +1,4 @@ Map | @wailsio/runtime
    • Map takes creation functions for two arbitrary types and returns an in-place creation function for an object whose keys and values are of those types.

      -

      Type Parameters

      • K
      • V

      Parameters

      • key: ((source) => K)
          • (source): K
          • Parameters

            • source: any

            Returns K

      • value: ((source) => V)
          • (source): V
          • Parameters

            • source: any

            Returns V

      Returns ((source) => {
          [_: K]: V;
      })

        • (source): {
              [_: K]: V;
          }
        • Parameters

          • source: any

          Returns {
              [_: K]: V;
          }

    Generated using TypeDoc

    \ No newline at end of file +

    Type Parameters

    • K
    • V

    Parameters

    • key: ((source) => K)
        • (source): K
        • Parameters

          • source: any

          Returns K

    • value: ((source) => V)
        • (source): V
        • Parameters

          • source: any

          Returns V

    Returns ((source) => {
        [_: K]: V;
    })

      • (source): {
            [_: K]: V;
        }
      • Parameters

        • source: any

        Returns {
            [_: K]: V;
        }

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Nullable.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Nullable.html index 2174bef8f..fc29033a7 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Nullable.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Nullable.html @@ -1,3 +1,3 @@ Nullable | @wailsio/runtime
    • Nullable takes a creation function for an arbitrary type and returns a creation function for a nullable value of that type.

      -

      Type Parameters

      • T

      Parameters

      • element: ((source) => T)
          • (source): T
          • Parameters

            • source: any

            Returns T

      Returns ((source) => null | T)

        • (source): null | T
        • Parameters

          • source: any

          Returns null | T

    Generated using TypeDoc

    \ No newline at end of file +

    Type Parameters

    • T

    Parameters

    • element: ((source) => T)
        • (source): T
        • Parameters

          • source: any

          Returns T

    Returns ((source) => null | T)

      • (source): null | T
      • Parameters

        • source: any

        Returns null | T

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Struct.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Struct.html index 9735e1941..d53e16c34 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Struct.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Struct.html @@ -1,3 +1,3 @@ Struct | @wailsio/runtime
    • Struct takes an object mapping field names to creation functions and returns an in-place creation function for a struct.

      -

      Type Parameters

      • T extends {
            [_: string]: ((source) => any);
        }
      • U extends {
            [Key in string | number | symbol]?: ReturnType<T[Key]>
        }

      Parameters

      • createField: T

      Returns ((source) => U)

        • (source): U
        • Parameters

          • source: any

          Returns U

    Generated using TypeDoc

    \ No newline at end of file +

    Type Parameters

    • T extends {
          [_: string]: ((source) => any);
      }
    • U extends {
          [Key in string | number | symbol]?: ReturnType<T[Key]>
      }

    Parameters

    • createField: T

    Returns ((source) => U)

      • (source): U
      • Parameters

        • source: any

        Returns U

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Error.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Error.html index 6db728dcb..dbf1d7730 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Error.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Error.html @@ -2,4 +2,4 @@

    Returns Promise<string>

    • The label of the button pressed
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Info.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Info.html index 14130d470..426c01d13 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Info.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Info.html @@ -2,4 +2,4 @@

    Returns Promise<string>

    • The label of the button pressed
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.OpenFile.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.OpenFile.html index 821b85f04..492671fba 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.OpenFile.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.OpenFile.html @@ -1,3 +1,3 @@ OpenFile | @wailsio/runtime
    • Parameters

      Returns Promise<string | string[]>

      Returns selected file or list of files. Returns blank string if no file is selected.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Question.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Question.html index 17bc86219..a78560b64 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Question.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Question.html @@ -2,4 +2,4 @@

    Returns Promise<string>

    • The label of the button pressed
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.SaveFile.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.SaveFile.html index 26bd93652..12832bda3 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.SaveFile.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.SaveFile.html @@ -1,3 +1,3 @@ SaveFile | @wailsio/runtime
    • Parameters

      Returns Promise<string>

      Returns the selected file. Returns blank string if no file is selected.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Warning.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Warning.html index 053cf106b..506f997f6 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Warning.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Warning.html @@ -2,4 +2,4 @@

    Returns Promise<string>

    • The label of the button pressed
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Emit.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Emit.html index 542ab7a1e..84bd90913 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Emit.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Emit.html @@ -3,4 +3,4 @@

    Returns any

    • The result of the emitted event.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Off.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Off.html index f1fcded3f..aadda585c 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Off.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Off.html @@ -1,4 +1,4 @@ Off | @wailsio/runtime
    • Removes event listeners for the specified event names.

      Parameters

      • eventName: string

        The name of the event to remove listeners for.

      • Rest ...additionalEventNames: string[]

        Additional event names to remove listeners for.

        -

      Returns undefined

    Generated using TypeDoc

    \ No newline at end of file +

    Returns undefined

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OffAll.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OffAll.html index cebf1d976..1eaaa3177 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OffAll.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OffAll.html @@ -1,3 +1,3 @@ OffAll | @wailsio/runtime
    • Removes all event listeners.

      Returns void

      Function

      OffAll

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.On.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.On.html index d75c76ad6..f2be25dd5 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.On.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.On.html @@ -4,4 +4,4 @@

    Returns Function

    • A function that, when called, will unregister the callback from the event.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OnMultiple.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OnMultiple.html index 076aa9068..e973a5a4f 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OnMultiple.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OnMultiple.html @@ -5,4 +5,4 @@

    Returns Function

    • A function that, when called, will unregister the callback from the event.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Once.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Once.html index adb14bda4..0014783c2 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Once.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Once.html @@ -4,4 +4,4 @@

    Returns Function

    • A function that, when called, will unregister the callback from the event.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.setup.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.setup.html index deae4ec72..aa8bc1214 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.setup.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.setup.html @@ -1 +1 @@ -setup | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file +setup | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Flags.GetFlag.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Flags.GetFlag.html index bc2335a44..12ab6466f 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Flags.GetFlag.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Flags.GetFlag.html @@ -3,4 +3,4 @@

    Returns any

    • The value associated with the specified key.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetAll.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetAll.html index 5848da1ed..30f5f6fd4 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetAll.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetAll.html @@ -1,3 +1,3 @@ GetAll | @wailsio/runtime
    • Gets all screens.

      Returns Promise<Screen[]>

      A promise that resolves to an array of Screen objects.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetCurrent.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetCurrent.html index fc43c9176..a60aa183c 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetCurrent.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetCurrent.html @@ -1,3 +1,3 @@ GetCurrent | @wailsio/runtime
    • Gets the current active screen.

      Returns Promise<Screen>

      A promise that resolves with the current active screen.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetPrimary.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetPrimary.html index 1bfa6606b..a612a8717 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetPrimary.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetPrimary.html @@ -1,3 +1,3 @@ GetPrimary | @wailsio/runtime
    • Gets the primary screen.

      Returns Promise<Screen>

      A promise that resolves to the primary screen.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Capabilities.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Capabilities.html index 9c93a483c..dffb74a65 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Capabilities.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Capabilities.html @@ -1,4 +1,4 @@ Capabilities | @wailsio/runtime
    • Fetches the capabilities of the application from the server.

      Returns Promise<Object>

      A promise that resolves to an object containing the capabilities.

      Async

      Function

      Capabilities

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Environment.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Environment.html index c4359efa9..6540a0dbc 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Environment.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Environment.html @@ -2,4 +2,4 @@
  • A promise that resolves to an object containing OS and system architecture.
  • Function

    Retrieves environment details.

    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsAMD64.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsAMD64.html index 21801ee6c..7767f6103 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsAMD64.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsAMD64.html @@ -1,3 +1,3 @@ IsAMD64 | @wailsio/runtime
    • Checks if the current environment architecture is AMD64.

      Returns boolean

      True if the current environment architecture is AMD64, false otherwise.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM.html index a94a24dc8..61e505d27 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM.html @@ -1,3 +1,3 @@ IsARM | @wailsio/runtime
    • Checks if the current architecture is ARM.

      Returns boolean

      True if the current architecture is ARM, false otherwise.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM64.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM64.html index c9386a5fa..8ffdf93da 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM64.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM64.html @@ -2,4 +2,4 @@

    Returns boolean

    • Returns true if the environment is ARM64 architecture, otherwise returns false.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDarkMode.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDarkMode.html index 04672fe31..f16b4910a 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDarkMode.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDarkMode.html @@ -2,4 +2,4 @@
  • A promise that resolves to a boolean value indicating if the system is in dark mode.
  • Function

    Retrieves the system dark mode status.

    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDebug.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDebug.html index ce780df72..133a618fd 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDebug.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDebug.html @@ -1 +1 @@ -IsDebug | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file +IsDebug | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsLinux.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsLinux.html index c5ada1aa5..1c6ba957f 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsLinux.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsLinux.html @@ -1,3 +1,3 @@ IsLinux | @wailsio/runtime
    • Checks if the current operating system is Linux.

      Returns boolean

      Returns true if the current operating system is Linux, false otherwise.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsMac.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsMac.html index d7abc7b4a..7095ba7c3 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsMac.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsMac.html @@ -1,3 +1,3 @@ IsMac | @wailsio/runtime
    • Checks if the current environment is a macOS operating system.

      Returns boolean

      True if the environment is macOS, false otherwise.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsWindows.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsWindows.html index 73a038712..54e7738e0 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsWindows.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsWindows.html @@ -1,3 +1,3 @@ IsWindows | @wailsio/runtime
    • Checks if the current operating system is Windows.

      Returns boolean

      True if the operating system is Windows, otherwise false.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.invoke.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.invoke.html index e922a2368..fff5174b9 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.invoke.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.invoke.html @@ -1 +1 @@ -invoke | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file +invoke | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Enable.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Enable.html index 0d1961d1a..9dd233b3b 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Enable.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Enable.html @@ -1,2 +1,2 @@ Enable | @wailsio/runtime
    • Schedules an automatic reload of WML to be performed as soon as the document is fully loaded.

      -

      Returns void

    Generated using TypeDoc

    \ No newline at end of file +

    Returns void

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Reload.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Reload.html index 60a617d38..7c4dcce8c 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Reload.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Reload.html @@ -1,2 +1,2 @@ Reload | @wailsio/runtime
    • Reloads the WML page by adding necessary event listeners and browser listeners.

      -

      Returns void

    Generated using TypeDoc

    \ No newline at end of file +

    Returns void

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/init.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/init.html index fe15a9f06..82122482a 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/init.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/init.html @@ -1 +1 @@ -init | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file +init | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Call.CallOptions.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Call.CallOptions.html index dad01b74b..29d829e19 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Call.CallOptions.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Call.CallOptions.html @@ -1,7 +1,7 @@ -CallOptions | @wailsio/runtime

    Interface CallOptions

    interface CallOptions {
        args: any[];
        methodID: undefined | number;
        methodName: undefined | string;
    }

    Properties

    args +CallOptions | @wailsio/runtime

    Interface CallOptions

    interface CallOptions {
        args: any[];
        methodID: undefined | number;
        methodName: undefined | string;
    }

    Properties

    args: any[]

    Arguments to be passed into the bound method.

    -
    methodID: undefined | number

    The numeric ID of the bound method to call.

    -
    methodName: undefined | string

    The fully qualified name of the bound method to call.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    methodID: undefined | number

    The numeric ID of the bound method to call.

    +
    methodName: undefined | string

    The fully qualified name of the bound method to call.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.Button.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.Button.html index 9b82a7b58..33d3bc025 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.Button.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.Button.html @@ -1,7 +1,7 @@ -Button | @wailsio/runtime
    interface Button {
        IsCancel: undefined | boolean;
        IsDefault: undefined | boolean;
        Label: undefined | string;
    }

    Properties

    IsCancel +Button | @wailsio/runtime
    interface Button {
        IsCancel: undefined | boolean;
        IsDefault: undefined | boolean;
        Label: undefined | string;
    }

    Properties

    IsCancel: undefined | boolean

    True if the button should cancel an operation when clicked.

    -
    IsDefault: undefined | boolean

    True if the button should be the default action when the user presses enter.

    -
    Label: undefined | string

    Text that appears within the button.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    IsDefault: undefined | boolean

    True if the button should be the default action when the user presses enter.

    +
    Label: undefined | string

    Text that appears within the button.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.FileFilter.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.FileFilter.html index 19eea827a..cb7bac3e7 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.FileFilter.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.FileFilter.html @@ -1,5 +1,5 @@ -FileFilter | @wailsio/runtime
    interface FileFilter {
        DisplayName: undefined | string;
        Pattern: undefined | string;
    }

    Properties

    DisplayName +FileFilter | @wailsio/runtime
    interface FileFilter {
        DisplayName: undefined | string;
        Pattern: undefined | string;
    }

    Properties

    Properties

    DisplayName: undefined | string

    Display name for the filter, it could be "Text Files", "Images" etc.

    -
    Pattern: undefined | string

    Pattern to match for the filter, e.g. ".txt;.md" for text markdown files.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    Pattern: undefined | string

    Pattern to match for the filter, e.g. ".txt;.md" for text markdown files.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.MessageDialogOptions.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.MessageDialogOptions.html index 609c7b979..7d6e2d854 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.MessageDialogOptions.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.MessageDialogOptions.html @@ -1,9 +1,9 @@ -MessageDialogOptions | @wailsio/runtime

    Interface MessageDialogOptions

    interface MessageDialogOptions {
        Buttons: undefined | Button[];
        Detached: undefined | boolean;
        Message: undefined | string;
        Title: undefined | string;
    }

    Properties

    Buttons +MessageDialogOptions | @wailsio/runtime

    Interface MessageDialogOptions

    interface MessageDialogOptions {
        Buttons: undefined | Button[];
        Detached: undefined | boolean;
        Message: undefined | string;
        Title: undefined | string;
    }

    Properties

    Buttons: undefined | Button[]

    Array of button options to show in the dialog.

    -
    Detached: undefined | boolean

    True if the dialog should appear detached from the main window (if applicable).

    -
    Message: undefined | string

    The main message to show in the dialog.

    -
    Title: undefined | string

    The title of the dialog window.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    Detached: undefined | boolean

    True if the dialog should appear detached from the main window (if applicable).

    +
    Message: undefined | string

    The main message to show in the dialog.

    +
    Title: undefined | string

    The title of the dialog window.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.OpenFileDialogOptions.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.OpenFileDialogOptions.html index 19bf1ba42..983f5d9cf 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.OpenFileDialogOptions.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.OpenFileDialogOptions.html @@ -1,4 +1,4 @@ -OpenFileDialogOptions | @wailsio/runtime

    Interface OpenFileDialogOptions

    interface OpenFileDialogOptions {
        AllowsMultipleSelection: undefined | boolean;
        AllowsOtherFiletypes: undefined | boolean;
        ButtonText: undefined | string;
        CanChooseDirectories: undefined | boolean;
        CanChooseFiles: undefined | boolean;
        CanCreateDirectories: undefined | boolean;
        CanSelectHiddenExtension: undefined | boolean;
        Detached: undefined | boolean;
        Directory: undefined | string;
        Filters: undefined | FileFilter[];
        HideExtension: undefined | boolean;
        Message: undefined | string;
        ResolvesAliases: undefined | boolean;
        ShowHiddenFiles: undefined | boolean;
        Title: undefined | string;
        TreatsFilePackagesAsDirectories: undefined | boolean;
    }

    Properties

    AllowsMultipleSelection +OpenFileDialogOptions | @wailsio/runtime

    Interface OpenFileDialogOptions

    interface OpenFileDialogOptions {
        AllowsMultipleSelection: undefined | boolean;
        AllowsOtherFiletypes: undefined | boolean;
        ButtonText: undefined | string;
        CanChooseDirectories: undefined | boolean;
        CanChooseFiles: undefined | boolean;
        CanCreateDirectories: undefined | boolean;
        CanSelectHiddenExtension: undefined | boolean;
        Detached: undefined | boolean;
        Directory: undefined | string;
        Filters: undefined | FileFilter[];
        HideExtension: undefined | boolean;
        Message: undefined | string;
        ResolvesAliases: undefined | boolean;
        ShowHiddenFiles: undefined | boolean;
        Title: undefined | string;
        TreatsFilePackagesAsDirectories: undefined | boolean;
    }

    Properties

    AllowsMultipleSelection: undefined | boolean

    Indicates if multiple selection is allowed.

    -
    AllowsOtherFiletypes: undefined | boolean

    Indicates if other file types are allowed.

    -
    ButtonText: undefined | string

    Text to display on the button.

    -
    CanChooseDirectories: undefined | boolean

    Indicates if directories can be chosen.

    -
    CanChooseFiles: undefined | boolean

    Indicates if files can be chosen.

    -
    CanCreateDirectories: undefined | boolean

    Indicates if directories can be created.

    -
    CanSelectHiddenExtension: undefined | boolean

    Indicates if hidden extensions can be selected.

    -
    Detached: undefined | boolean

    Indicates if the dialog should appear detached from the main window.

    -
    Directory: undefined | string

    Directory to open in the dialog.

    -
    Filters: undefined | FileFilter[]

    Array of file filters.

    -
    HideExtension: undefined | boolean

    Indicates if the extension should be hidden.

    -
    Message: undefined | string

    Message to show in the dialog.

    -
    ResolvesAliases: undefined | boolean

    Indicates if aliases should be resolved.

    -
    ShowHiddenFiles: undefined | boolean

    Indicates if hidden files should be shown.

    -
    Title: undefined | string

    Title of the dialog.

    -
    TreatsFilePackagesAsDirectories: undefined | boolean

    Indicates if file packages should be treated as directories.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    AllowsOtherFiletypes: undefined | boolean

    Indicates if other file types are allowed.

    +
    ButtonText: undefined | string

    Text to display on the button.

    +
    CanChooseDirectories: undefined | boolean

    Indicates if directories can be chosen.

    +
    CanChooseFiles: undefined | boolean

    Indicates if files can be chosen.

    +
    CanCreateDirectories: undefined | boolean

    Indicates if directories can be created.

    +
    CanSelectHiddenExtension: undefined | boolean

    Indicates if hidden extensions can be selected.

    +
    Detached: undefined | boolean

    Indicates if the dialog should appear detached from the main window.

    +
    Directory: undefined | string

    Directory to open in the dialog.

    +
    Filters: undefined | FileFilter[]

    Array of file filters.

    +
    HideExtension: undefined | boolean

    Indicates if the extension should be hidden.

    +
    Message: undefined | string

    Message to show in the dialog.

    +
    ResolvesAliases: undefined | boolean

    Indicates if aliases should be resolved.

    +
    ShowHiddenFiles: undefined | boolean

    Indicates if hidden files should be shown.

    +
    Title: undefined | string

    Title of the dialog.

    +
    TreatsFilePackagesAsDirectories: undefined | boolean

    Indicates if file packages should be treated as directories.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.SaveFileDialogOptions.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.SaveFileDialogOptions.html index 99d04ff77..f1e203ea0 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.SaveFileDialogOptions.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.SaveFileDialogOptions.html @@ -1,4 +1,4 @@ -SaveFileDialogOptions | @wailsio/runtime

    Interface SaveFileDialogOptions

    interface SaveFileDialogOptions {
        AllowsMultipleSelection: undefined | boolean;
        AllowsOtherFiletypes: undefined | boolean;
        ButtonText: undefined | string;
        CanChooseDirectories: undefined | boolean;
        CanChooseFiles: undefined | boolean;
        CanCreateDirectories: undefined | boolean;
        CanSelectHiddenExtension: undefined | boolean;
        Detached: undefined | boolean;
        Directory: undefined | string;
        Filename: undefined | string;
        Filters: undefined | FileFilter[];
        HideExtension: undefined | boolean;
        Message: undefined | string;
        ResolvesAliases: undefined | boolean;
        ShowHiddenFiles: undefined | boolean;
        Title: undefined | string;
        TreatsFilePackagesAsDirectories: undefined | boolean;
    }

    Properties

    AllowsMultipleSelection +SaveFileDialogOptions | @wailsio/runtime

    Interface SaveFileDialogOptions

    interface SaveFileDialogOptions {
        AllowsMultipleSelection: undefined | boolean;
        AllowsOtherFiletypes: undefined | boolean;
        ButtonText: undefined | string;
        CanChooseDirectories: undefined | boolean;
        CanChooseFiles: undefined | boolean;
        CanCreateDirectories: undefined | boolean;
        CanSelectHiddenExtension: undefined | boolean;
        Detached: undefined | boolean;
        Directory: undefined | string;
        Filename: undefined | string;
        Filters: undefined | FileFilter[];
        HideExtension: undefined | boolean;
        Message: undefined | string;
        ResolvesAliases: undefined | boolean;
        ShowHiddenFiles: undefined | boolean;
        Title: undefined | string;
        TreatsFilePackagesAsDirectories: undefined | boolean;
    }

    Properties

    AllowsMultipleSelection: undefined | boolean

    Indicates if multiple selection is allowed.

    -
    AllowsOtherFiletypes: undefined | boolean

    Indicates if other file types are allowed.

    -
    ButtonText: undefined | string

    Text to display on the button.

    -
    CanChooseDirectories: undefined | boolean

    Indicates if directories can be chosen.

    -
    CanChooseFiles: undefined | boolean

    Indicates if files can be chosen.

    -
    CanCreateDirectories: undefined | boolean

    Indicates if directories can be created.

    -
    CanSelectHiddenExtension: undefined | boolean

    Indicates if hidden extensions can be selected.

    -
    Detached: undefined | boolean

    Indicates if the dialog should appear detached from the main window.

    -
    Directory: undefined | string

    Directory to open in the dialog.

    -
    Filename: undefined | string

    Default filename to use in the dialog.

    -
    Filters: undefined | FileFilter[]

    Array of file filters.

    -
    HideExtension: undefined | boolean

    Indicates if the extension should be hidden.

    -
    Message: undefined | string

    Message to show in the dialog.

    -
    ResolvesAliases: undefined | boolean

    Indicates if aliases should be resolved.

    -
    ShowHiddenFiles: undefined | boolean

    Indicates if hidden files should be shown.

    -
    Title: undefined | string

    Title of the dialog.

    -
    TreatsFilePackagesAsDirectories: undefined | boolean

    Indicates if file packages should be treated as directories.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    AllowsOtherFiletypes: undefined | boolean

    Indicates if other file types are allowed.

    +
    ButtonText: undefined | string

    Text to display on the button.

    +
    CanChooseDirectories: undefined | boolean

    Indicates if directories can be chosen.

    +
    CanChooseFiles: undefined | boolean

    Indicates if files can be chosen.

    +
    CanCreateDirectories: undefined | boolean

    Indicates if directories can be created.

    +
    CanSelectHiddenExtension: undefined | boolean

    Indicates if hidden extensions can be selected.

    +
    Detached: undefined | boolean

    Indicates if the dialog should appear detached from the main window.

    +
    Directory: undefined | string

    Directory to open in the dialog.

    +
    Filename: undefined | string

    Default filename to use in the dialog.

    +
    Filters: undefined | FileFilter[]

    Array of file filters.

    +
    HideExtension: undefined | boolean

    Indicates if the extension should be hidden.

    +
    Message: undefined | string

    Message to show in the dialog.

    +
    ResolvesAliases: undefined | boolean

    Indicates if aliases should be resolved.

    +
    ShowHiddenFiles: undefined | boolean

    Indicates if hidden files should be shown.

    +
    Title: undefined | string

    Title of the dialog.

    +
    TreatsFilePackagesAsDirectories: undefined | boolean

    Indicates if file packages should be treated as directories.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Rect.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Rect.html index 061657146..8daab6225 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Rect.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Rect.html @@ -1,9 +1,9 @@ -Rect | @wailsio/runtime
    interface Rect {
        Height: number;
        Width: number;
        X: number;
        Y: number;
    }

    Properties

    Height +Rect | @wailsio/runtime
    interface Rect {
        Height: number;
        Width: number;
        X: number;
        Y: number;
    }

    Properties

    Properties

    Height: number

    The height of the rectangle.

    -
    Width: number

    The width of the rectangle.

    -
    X: number

    The X coordinate of the origin.

    -
    Y: number

    The Y coordinate of the origin.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    Width: number

    The width of the rectangle.

    +
    X: number

    The X coordinate of the origin.

    +
    Y: number

    The Y coordinate of the origin.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Screen.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Screen.html index 152f5c183..4b7d841cd 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Screen.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Screen.html @@ -1,4 +1,4 @@ -Screen | @wailsio/runtime
    interface Screen {
        Bounds: Rect;
        ID: string;
        IsPrimary: boolean;
        Name: string;
        PhysicalBounds: Rect;
        PhysicalWorkArea: Rect;
        Rotation: number;
        ScaleFactor: number;
        Size: Size;
        WorkArea: Rect;
        X: number;
        Y: number;
    }

    Properties

    Bounds +Screen | @wailsio/runtime
    interface Screen {
        Bounds: Rect;
        ID: string;
        IsPrimary: boolean;
        Name: string;
        PhysicalBounds: Rect;
        PhysicalWorkArea: Rect;
        Rotation: number;
        ScaleFactor: number;
        Size: Size;
        WorkArea: Rect;
        X: number;
        Y: number;
    }

    Properties

    Bounds ID IsPrimary Name @@ -11,15 +11,15 @@ X Y

    Properties

    Bounds: Rect

    Contains the bounds of the screen in terms of X, Y, Width, and Height.

    -
    ID: string

    Unique identifier for the screen.

    -
    IsPrimary: boolean

    True if this is the primary monitor selected by the user in the operating system.

    -
    Name: string

    Human readable name of the screen.

    -
    PhysicalBounds: Rect

    Contains the physical bounds of the screen in terms of X, Y, Width, and Height (before scaling).

    -
    PhysicalWorkArea: Rect

    Contains the physical WorkArea of the screen (before scaling).

    -
    Rotation: number

    The rotation of the screen.

    -
    ScaleFactor: number

    The scale factor of the screen (DPI/96). 1 = standard DPI, 2 = HiDPI (Retina), etc.

    -
    Size: Size

    Contains the width and height of the screen.

    -
    WorkArea: Rect

    Contains the area of the screen that is actually usable (excluding taskbar and other system UI).

    -
    X: number

    The X coordinate of the screen.

    -
    Y: number

    The Y coordinate of the screen.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    ID: string

    Unique identifier for the screen.

    +
    IsPrimary: boolean

    True if this is the primary monitor selected by the user in the operating system.

    +
    Name: string

    Human readable name of the screen.

    +
    PhysicalBounds: Rect

    Contains the physical bounds of the screen in terms of X, Y, Width, and Height (before scaling).

    +
    PhysicalWorkArea: Rect

    Contains the physical WorkArea of the screen (before scaling).

    +
    Rotation: number

    The rotation of the screen.

    +
    ScaleFactor: number

    The scale factor of the screen (DPI/96). 1 = standard DPI, 2 = HiDPI (Retina), etc.

    +
    Size: Size

    Contains the width and height of the screen.

    +
    WorkArea: Rect

    Contains the area of the screen that is actually usable (excluding taskbar and other system UI).

    +
    X: number

    The X coordinate of the screen.

    +
    Y: number

    The Y coordinate of the screen.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Size.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Size.html index df8d06084..04412497b 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Size.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Size.html @@ -1,5 +1,5 @@ -Size | @wailsio/runtime
    interface Size {
        Height: number;
        Width: number;
    }

    Properties

    Height +Size | @wailsio/runtime
    interface Size {
        Height: number;
        Width: number;
    }

    Properties

    Properties

    Height: number

    The height.

    -
    Width: number

    The width.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    Width: number

    The width.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.EnvironmentInfo.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.EnvironmentInfo.html index f34fccb77..781443461 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.EnvironmentInfo.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.EnvironmentInfo.html @@ -1,11 +1,11 @@ -EnvironmentInfo | @wailsio/runtime

    Interface EnvironmentInfo

    interface EnvironmentInfo {
        Arch: string;
        Debug: boolean;
        OS: string;
        OSInfo: OSInfo;
        PlatformInfo: Object;
    }

    Properties

    Arch +EnvironmentInfo | @wailsio/runtime

    Interface EnvironmentInfo

    interface EnvironmentInfo {
        Arch: string;
        Debug: boolean;
        OS: string;
        OSInfo: OSInfo;
        PlatformInfo: Object;
    }

    Properties

    Arch: string

    The architecture of the system.

    -
    Debug: boolean

    True if the application is running in debug mode, otherwise false.

    -
    OS: string

    The operating system in use.

    -
    OSInfo: OSInfo

    Details of the operating system.

    -
    PlatformInfo: Object

    Additional platform information.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    Debug: boolean

    True if the application is running in debug mode, otherwise false.

    +
    OS: string

    The operating system in use.

    +
    OSInfo: OSInfo

    Details of the operating system.

    +
    PlatformInfo: Object

    Additional platform information.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.OSInfo.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.OSInfo.html index b08a3cd05..bfc63c548 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.OSInfo.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.OSInfo.html @@ -1,9 +1,9 @@ -OSInfo | @wailsio/runtime
    interface OSInfo {
        Branding: string;
        ID: string;
        Name: string;
        Version: string;
    }

    Properties

    Branding +OSInfo | @wailsio/runtime
    interface OSInfo {
        Branding: string;
        ID: string;
        Name: string;
        Version: string;
    }

    Properties

    Properties

    Branding: string

    The branding of the OS.

    -
    ID: string

    The ID of the OS.

    -
    Name: string

    The name of the OS.

    -
    Version: string

    The version of the OS.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    ID: string

    The ID of the OS.

    +
    Name: string

    The name of the OS.

    +
    Version: string

    The version of the OS.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Application.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Application.html index c2e707da7..9fab8f8e7 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Application.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Application.html @@ -1,4 +1,4 @@ -Application | @wailsio/runtime

    Namespace Application

    Index

    Functions

    Hide +Application | @wailsio/runtime

    Namespace Application

    Index

    Functions

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Browser.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Browser.html index d7a4db8d3..e57b18c15 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Browser.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Browser.html @@ -1,2 +1,2 @@ -Browser | @wailsio/runtime

    Namespace Browser

    Index

    Functions

    OpenURL +Browser | @wailsio/runtime

    Namespace Browser

    Index

    Functions

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Call.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Call.html index 57343eecc..a7f6bc039 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Call.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Call.html @@ -1,4 +1,4 @@ -Call | @wailsio/runtime

    Namespace Call

    Index

    Classes

    RuntimeError +Call | @wailsio/runtime

    Namespace Call

    Index

    Classes

    Interfaces

    Functions

    ByID ByName diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Clipboard.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Clipboard.html index 3fbf76e42..56e44f9f7 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Clipboard.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Clipboard.html @@ -1,3 +1,3 @@ -Clipboard | @wailsio/runtime

    Namespace Clipboard

    Index

    Functions

    SetText +Clipboard | @wailsio/runtime

    Namespace Clipboard

    Index

    Functions

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Create.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Create.html index 7a552333c..50bace8da 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Create.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Create.html @@ -1,4 +1,4 @@ -Create | @wailsio/runtime

    Namespace Create

    Index

    Functions

    Any +Create | @wailsio/runtime

    Namespace Create

    Index

    Functions

    Any Array ByteSlice Map diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Dialogs.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Dialogs.html index 559d76c10..f54953bb9 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Dialogs.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Dialogs.html @@ -1,4 +1,4 @@ -Dialogs | @wailsio/runtime

    Namespace Dialogs

    Index

    Interfaces

    Button +Dialogs | @wailsio/runtime

    Namespace Dialogs

    Index

    Interfaces

    Button FileFilter MessageDialogOptions OpenFileDialogOptions diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Events.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Events.html index 9eb586414..0a82c22f4 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Events.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Events.html @@ -1,4 +1,4 @@ -Events | @wailsio/runtime

    Namespace Events

    Index

    Classes

    WailsEvent +Events | @wailsio/runtime

    Namespace Events

    Index

    Classes

    Variables

    Functions

    Emit Off diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Flags.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Flags.html index 21e0baf68..e4c19b365 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Flags.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Flags.html @@ -1,2 +1,2 @@ -Flags | @wailsio/runtime

    Namespace Flags

    Index

    Functions

    GetFlag +Flags | @wailsio/runtime

    Namespace Flags

    Index

    Functions

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Screens.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Screens.html index b05971b6b..ba24910e5 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Screens.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Screens.html @@ -1,4 +1,4 @@ -Screens | @wailsio/runtime

    Namespace Screens

    Index

    Interfaces

    Rect +Screens | @wailsio/runtime

    Namespace Screens

    Index

    Interfaces

    Functions

    GetAll diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/System.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/System.html index 593bb0241..3bad2e75e 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/System.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/System.html @@ -1,4 +1,4 @@ -System | @wailsio/runtime

    Namespace System

    Index

    Interfaces

    EnvironmentInfo +System | @wailsio/runtime

    Namespace System

    Index

    Interfaces

    Functions

    Capabilities Environment diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/WML.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/WML.html index 57e00073a..a8cafba66 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/WML.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/WML.html @@ -1,3 +1,3 @@ -WML | @wailsio/runtime

    Namespace WML

    Index

    Functions

    Enable +WML | @wailsio/runtime

    Namespace WML

    Index

    Functions

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Events.Types.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Events.Types.html index 9ad714080..7f0fbd1fd 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Events.Types.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Events.Types.html @@ -1 +1 @@ -Types | @wailsio/runtime

    Variable TypesConst

    Types: {
        Common: {
            ApplicationOpenedWithFile: string;
            ApplicationStarted: string;
            ThemeChanged: string;
            WindowClosing: string;
            WindowDPIChanged: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowFilesDropped: string;
            WindowFocus: string;
            WindowFullscreen: string;
            WindowHide: string;
            WindowLostFocus: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowRestore: string;
            WindowRuntimeReady: string;
            WindowShow: string;
            WindowUnFullscreen: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowZoom: string;
            WindowZoomIn: string;
            WindowZoomOut: string;
            WindowZoomReset: string;
        };
        Linux: {
            ApplicationStartup: string;
            SystemThemeChanged: string;
            WindowDeleteEvent: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowFocusIn: string;
            WindowFocusOut: string;
            WindowLoadChanged: string;
        };
        Mac: {
            ApplicationDidBecomeActive: string;
            ApplicationDidChangeBackingProperties: string;
            ApplicationDidChangeEffectiveAppearance: string;
            ApplicationDidChangeIcon: string;
            ApplicationDidChangeOcclusionState: string;
            ApplicationDidChangeScreenParameters: string;
            ApplicationDidChangeStatusBarFrame: string;
            ApplicationDidChangeStatusBarOrientation: string;
            ApplicationDidChangeTheme: string;
            ApplicationDidFinishLaunching: string;
            ApplicationDidHide: string;
            ApplicationDidResignActive: string;
            ApplicationDidUnhide: string;
            ApplicationDidUpdate: string;
            ApplicationShouldHandleReopen: string;
            ApplicationWillBecomeActive: string;
            ApplicationWillFinishLaunching: string;
            ApplicationWillHide: string;
            ApplicationWillResignActive: string;
            ApplicationWillTerminate: string;
            ApplicationWillUnhide: string;
            ApplicationWillUpdate: string;
            MenuDidAddItem: string;
            MenuDidBeginTracking: string;
            MenuDidClose: string;
            MenuDidDisplayItem: string;
            MenuDidEndTracking: string;
            MenuDidHighlightItem: string;
            MenuDidOpen: string;
            MenuDidPopUp: string;
            MenuDidRemoveItem: string;
            MenuDidSendAction: string;
            MenuDidSendActionToItem: string;
            MenuDidUpdate: string;
            MenuWillAddItem: string;
            MenuWillBeginTracking: string;
            MenuWillDisplayItem: string;
            MenuWillEndTracking: string;
            MenuWillHighlightItem: string;
            MenuWillOpen: string;
            MenuWillPopUp: string;
            MenuWillRemoveItem: string;
            MenuWillSendAction: string;
            MenuWillSendActionToItem: string;
            MenuWillUpdate: string;
            WebViewDidCommitNavigation: string;
            WebViewDidFinishNavigation: string;
            WebViewDidReceiveServerRedirectForProvisionalNavigation: string;
            WebViewDidStartProvisionalNavigation: string;
            WindowDidBecomeKey: string;
            WindowDidBecomeMain: string;
            WindowDidBeginSheet: string;
            WindowDidChangeAlpha: string;
            WindowDidChangeBackingLocation: string;
            WindowDidChangeBackingProperties: string;
            WindowDidChangeCollectionBehavior: string;
            WindowDidChangeEffectiveAppearance: string;
            WindowDidChangeOcclusionState: string;
            WindowDidChangeOrderingMode: string;
            WindowDidChangeScreen: string;
            WindowDidChangeScreenParameters: string;
            WindowDidChangeScreenProfile: string;
            WindowDidChangeScreenSpace: string;
            WindowDidChangeScreenSpaceProperties: string;
            WindowDidChangeSharingType: string;
            WindowDidChangeSpace: string;
            WindowDidChangeSpaceOrderingMode: string;
            WindowDidChangeTitle: string;
            WindowDidChangeToolbar: string;
            WindowDidDeminiaturize: string;
            WindowDidEndSheet: string;
            WindowDidEnterFullScreen: string;
            WindowDidEnterVersionBrowser: string;
            WindowDidExitFullScreen: string;
            WindowDidExitVersionBrowser: string;
            WindowDidExpose: string;
            WindowDidFocus: string;
            WindowDidMiniaturize: string;
            WindowDidMove: string;
            WindowDidOrderOffScreen: string;
            WindowDidOrderOnScreen: string;
            WindowDidResignKey: string;
            WindowDidResignMain: string;
            WindowDidResize: string;
            WindowDidUpdate: string;
            WindowDidUpdateAlpha: string;
            WindowDidUpdateCollectionBehavior: string;
            WindowDidUpdateCollectionProperties: string;
            WindowDidUpdateShadow: string;
            WindowDidUpdateTitle: string;
            WindowDidUpdateToolbar: string;
            WindowDidZoom: string;
            WindowFileDraggingEntered: string;
            WindowFileDraggingExited: string;
            WindowFileDraggingPerformed: string;
            WindowHide: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowShouldClose: string;
            WindowShow: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowWillBecomeKey: string;
            WindowWillBecomeMain: string;
            WindowWillBeginSheet: string;
            WindowWillChangeOrderingMode: string;
            WindowWillClose: string;
            WindowWillDeminiaturize: string;
            WindowWillEnterFullScreen: string;
            WindowWillEnterVersionBrowser: string;
            WindowWillExitFullScreen: string;
            WindowWillExitVersionBrowser: string;
            WindowWillFocus: string;
            WindowWillMiniaturize: string;
            WindowWillMove: string;
            WindowWillOrderOffScreen: string;
            WindowWillOrderOnScreen: string;
            WindowWillResignMain: string;
            WindowWillResize: string;
            WindowWillUnfocus: string;
            WindowWillUpdate: string;
            WindowWillUpdateAlpha: string;
            WindowWillUpdateCollectionBehavior: string;
            WindowWillUpdateCollectionProperties: string;
            WindowWillUpdateShadow: string;
            WindowWillUpdateTitle: string;
            WindowWillUpdateToolbar: string;
            WindowWillUpdateVisibility: string;
            WindowWillUseStandardFrame: string;
            WindowZoomIn: string;
            WindowZoomOut: string;
            WindowZoomReset: string;
        };
        Windows: {
            APMPowerSettingChange: string;
            APMPowerStatusChange: string;
            APMResumeAutomatic: string;
            APMResumeSuspend: string;
            APMSuspend: string;
            ApplicationStarted: string;
            SystemThemeChanged: string;
            WebViewNavigationCompleted: string;
            WindowActive: string;
            WindowBackgroundErase: string;
            WindowClickActive: string;
            WindowClosing: string;
            WindowDPIChanged: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowDragDrop: string;
            WindowDragEnter: string;
            WindowDragLeave: string;
            WindowDragOver: string;
            WindowEndMove: string;
            WindowEndResize: string;
            WindowFullscreen: string;
            WindowHide: string;
            WindowInactive: string;
            WindowKeyDown: string;
            WindowKeyUp: string;
            WindowKillFocus: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowNonClientHit: string;
            WindowNonClientMouseDown: string;
            WindowNonClientMouseLeave: string;
            WindowNonClientMouseMove: string;
            WindowNonClientMouseUp: string;
            WindowPaint: string;
            WindowRestore: string;
            WindowSetFocus: string;
            WindowShow: string;
            WindowStartMove: string;
            WindowStartResize: string;
            WindowUnFullscreen: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowZOrderChanged: string;
        };
    } = EventTypes

    Type declaration

    • Common: {
          ApplicationOpenedWithFile: string;
          ApplicationStarted: string;
          ThemeChanged: string;
          WindowClosing: string;
          WindowDPIChanged: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowFilesDropped: string;
          WindowFocus: string;
          WindowFullscreen: string;
          WindowHide: string;
          WindowLostFocus: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowRestore: string;
          WindowRuntimeReady: string;
          WindowShow: string;
          WindowUnFullscreen: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowZoom: string;
          WindowZoomIn: string;
          WindowZoomOut: string;
          WindowZoomReset: string;
      }
      • ApplicationOpenedWithFile: string
      • ApplicationStarted: string
      • ThemeChanged: string
      • WindowClosing: string
      • WindowDPIChanged: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowFilesDropped: string
      • WindowFocus: string
      • WindowFullscreen: string
      • WindowHide: string
      • WindowLostFocus: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowRestore: string
      • WindowRuntimeReady: string
      • WindowShow: string
      • WindowUnFullscreen: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowZoom: string
      • WindowZoomIn: string
      • WindowZoomOut: string
      • WindowZoomReset: string
    • Linux: {
          ApplicationStartup: string;
          SystemThemeChanged: string;
          WindowDeleteEvent: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowFocusIn: string;
          WindowFocusOut: string;
          WindowLoadChanged: string;
      }
      • ApplicationStartup: string
      • SystemThemeChanged: string
      • WindowDeleteEvent: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowFocusIn: string
      • WindowFocusOut: string
      • WindowLoadChanged: string
    • Mac: {
          ApplicationDidBecomeActive: string;
          ApplicationDidChangeBackingProperties: string;
          ApplicationDidChangeEffectiveAppearance: string;
          ApplicationDidChangeIcon: string;
          ApplicationDidChangeOcclusionState: string;
          ApplicationDidChangeScreenParameters: string;
          ApplicationDidChangeStatusBarFrame: string;
          ApplicationDidChangeStatusBarOrientation: string;
          ApplicationDidChangeTheme: string;
          ApplicationDidFinishLaunching: string;
          ApplicationDidHide: string;
          ApplicationDidResignActive: string;
          ApplicationDidUnhide: string;
          ApplicationDidUpdate: string;
          ApplicationShouldHandleReopen: string;
          ApplicationWillBecomeActive: string;
          ApplicationWillFinishLaunching: string;
          ApplicationWillHide: string;
          ApplicationWillResignActive: string;
          ApplicationWillTerminate: string;
          ApplicationWillUnhide: string;
          ApplicationWillUpdate: string;
          MenuDidAddItem: string;
          MenuDidBeginTracking: string;
          MenuDidClose: string;
          MenuDidDisplayItem: string;
          MenuDidEndTracking: string;
          MenuDidHighlightItem: string;
          MenuDidOpen: string;
          MenuDidPopUp: string;
          MenuDidRemoveItem: string;
          MenuDidSendAction: string;
          MenuDidSendActionToItem: string;
          MenuDidUpdate: string;
          MenuWillAddItem: string;
          MenuWillBeginTracking: string;
          MenuWillDisplayItem: string;
          MenuWillEndTracking: string;
          MenuWillHighlightItem: string;
          MenuWillOpen: string;
          MenuWillPopUp: string;
          MenuWillRemoveItem: string;
          MenuWillSendAction: string;
          MenuWillSendActionToItem: string;
          MenuWillUpdate: string;
          WebViewDidCommitNavigation: string;
          WebViewDidFinishNavigation: string;
          WebViewDidReceiveServerRedirectForProvisionalNavigation: string;
          WebViewDidStartProvisionalNavigation: string;
          WindowDidBecomeKey: string;
          WindowDidBecomeMain: string;
          WindowDidBeginSheet: string;
          WindowDidChangeAlpha: string;
          WindowDidChangeBackingLocation: string;
          WindowDidChangeBackingProperties: string;
          WindowDidChangeCollectionBehavior: string;
          WindowDidChangeEffectiveAppearance: string;
          WindowDidChangeOcclusionState: string;
          WindowDidChangeOrderingMode: string;
          WindowDidChangeScreen: string;
          WindowDidChangeScreenParameters: string;
          WindowDidChangeScreenProfile: string;
          WindowDidChangeScreenSpace: string;
          WindowDidChangeScreenSpaceProperties: string;
          WindowDidChangeSharingType: string;
          WindowDidChangeSpace: string;
          WindowDidChangeSpaceOrderingMode: string;
          WindowDidChangeTitle: string;
          WindowDidChangeToolbar: string;
          WindowDidDeminiaturize: string;
          WindowDidEndSheet: string;
          WindowDidEnterFullScreen: string;
          WindowDidEnterVersionBrowser: string;
          WindowDidExitFullScreen: string;
          WindowDidExitVersionBrowser: string;
          WindowDidExpose: string;
          WindowDidFocus: string;
          WindowDidMiniaturize: string;
          WindowDidMove: string;
          WindowDidOrderOffScreen: string;
          WindowDidOrderOnScreen: string;
          WindowDidResignKey: string;
          WindowDidResignMain: string;
          WindowDidResize: string;
          WindowDidUpdate: string;
          WindowDidUpdateAlpha: string;
          WindowDidUpdateCollectionBehavior: string;
          WindowDidUpdateCollectionProperties: string;
          WindowDidUpdateShadow: string;
          WindowDidUpdateTitle: string;
          WindowDidUpdateToolbar: string;
          WindowDidZoom: string;
          WindowFileDraggingEntered: string;
          WindowFileDraggingExited: string;
          WindowFileDraggingPerformed: string;
          WindowHide: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowShouldClose: string;
          WindowShow: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowWillBecomeKey: string;
          WindowWillBecomeMain: string;
          WindowWillBeginSheet: string;
          WindowWillChangeOrderingMode: string;
          WindowWillClose: string;
          WindowWillDeminiaturize: string;
          WindowWillEnterFullScreen: string;
          WindowWillEnterVersionBrowser: string;
          WindowWillExitFullScreen: string;
          WindowWillExitVersionBrowser: string;
          WindowWillFocus: string;
          WindowWillMiniaturize: string;
          WindowWillMove: string;
          WindowWillOrderOffScreen: string;
          WindowWillOrderOnScreen: string;
          WindowWillResignMain: string;
          WindowWillResize: string;
          WindowWillUnfocus: string;
          WindowWillUpdate: string;
          WindowWillUpdateAlpha: string;
          WindowWillUpdateCollectionBehavior: string;
          WindowWillUpdateCollectionProperties: string;
          WindowWillUpdateShadow: string;
          WindowWillUpdateTitle: string;
          WindowWillUpdateToolbar: string;
          WindowWillUpdateVisibility: string;
          WindowWillUseStandardFrame: string;
          WindowZoomIn: string;
          WindowZoomOut: string;
          WindowZoomReset: string;
      }
      • ApplicationDidBecomeActive: string
      • ApplicationDidChangeBackingProperties: string
      • ApplicationDidChangeEffectiveAppearance: string
      • ApplicationDidChangeIcon: string
      • ApplicationDidChangeOcclusionState: string
      • ApplicationDidChangeScreenParameters: string
      • ApplicationDidChangeStatusBarFrame: string
      • ApplicationDidChangeStatusBarOrientation: string
      • ApplicationDidChangeTheme: string
      • ApplicationDidFinishLaunching: string
      • ApplicationDidHide: string
      • ApplicationDidResignActive: string
      • ApplicationDidUnhide: string
      • ApplicationDidUpdate: string
      • ApplicationShouldHandleReopen: string
      • ApplicationWillBecomeActive: string
      • ApplicationWillFinishLaunching: string
      • ApplicationWillHide: string
      • ApplicationWillResignActive: string
      • ApplicationWillTerminate: string
      • ApplicationWillUnhide: string
      • ApplicationWillUpdate: string
      • MenuDidAddItem: string
      • MenuDidBeginTracking: string
      • MenuDidClose: string
      • MenuDidDisplayItem: string
      • MenuDidEndTracking: string
      • MenuDidHighlightItem: string
      • MenuDidOpen: string
      • MenuDidPopUp: string
      • MenuDidRemoveItem: string
      • MenuDidSendAction: string
      • MenuDidSendActionToItem: string
      • MenuDidUpdate: string
      • MenuWillAddItem: string
      • MenuWillBeginTracking: string
      • MenuWillDisplayItem: string
      • MenuWillEndTracking: string
      • MenuWillHighlightItem: string
      • MenuWillOpen: string
      • MenuWillPopUp: string
      • MenuWillRemoveItem: string
      • MenuWillSendAction: string
      • MenuWillSendActionToItem: string
      • MenuWillUpdate: string
      • WebViewDidCommitNavigation: string
      • WebViewDidFinishNavigation: string
      • WebViewDidReceiveServerRedirectForProvisionalNavigation: string
      • WebViewDidStartProvisionalNavigation: string
      • WindowDidBecomeKey: string
      • WindowDidBecomeMain: string
      • WindowDidBeginSheet: string
      • WindowDidChangeAlpha: string
      • WindowDidChangeBackingLocation: string
      • WindowDidChangeBackingProperties: string
      • WindowDidChangeCollectionBehavior: string
      • WindowDidChangeEffectiveAppearance: string
      • WindowDidChangeOcclusionState: string
      • WindowDidChangeOrderingMode: string
      • WindowDidChangeScreen: string
      • WindowDidChangeScreenParameters: string
      • WindowDidChangeScreenProfile: string
      • WindowDidChangeScreenSpace: string
      • WindowDidChangeScreenSpaceProperties: string
      • WindowDidChangeSharingType: string
      • WindowDidChangeSpace: string
      • WindowDidChangeSpaceOrderingMode: string
      • WindowDidChangeTitle: string
      • WindowDidChangeToolbar: string
      • WindowDidDeminiaturize: string
      • WindowDidEndSheet: string
      • WindowDidEnterFullScreen: string
      • WindowDidEnterVersionBrowser: string
      • WindowDidExitFullScreen: string
      • WindowDidExitVersionBrowser: string
      • WindowDidExpose: string
      • WindowDidFocus: string
      • WindowDidMiniaturize: string
      • WindowDidMove: string
      • WindowDidOrderOffScreen: string
      • WindowDidOrderOnScreen: string
      • WindowDidResignKey: string
      • WindowDidResignMain: string
      • WindowDidResize: string
      • WindowDidUpdate: string
      • WindowDidUpdateAlpha: string
      • WindowDidUpdateCollectionBehavior: string
      • WindowDidUpdateCollectionProperties: string
      • WindowDidUpdateShadow: string
      • WindowDidUpdateTitle: string
      • WindowDidUpdateToolbar: string
      • WindowDidZoom: string
      • WindowFileDraggingEntered: string
      • WindowFileDraggingExited: string
      • WindowFileDraggingPerformed: string
      • WindowHide: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowShouldClose: string
      • WindowShow: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowWillBecomeKey: string
      • WindowWillBecomeMain: string
      • WindowWillBeginSheet: string
      • WindowWillChangeOrderingMode: string
      • WindowWillClose: string
      • WindowWillDeminiaturize: string
      • WindowWillEnterFullScreen: string
      • WindowWillEnterVersionBrowser: string
      • WindowWillExitFullScreen: string
      • WindowWillExitVersionBrowser: string
      • WindowWillFocus: string
      • WindowWillMiniaturize: string
      • WindowWillMove: string
      • WindowWillOrderOffScreen: string
      • WindowWillOrderOnScreen: string
      • WindowWillResignMain: string
      • WindowWillResize: string
      • WindowWillUnfocus: string
      • WindowWillUpdate: string
      • WindowWillUpdateAlpha: string
      • WindowWillUpdateCollectionBehavior: string
      • WindowWillUpdateCollectionProperties: string
      • WindowWillUpdateShadow: string
      • WindowWillUpdateTitle: string
      • WindowWillUpdateToolbar: string
      • WindowWillUpdateVisibility: string
      • WindowWillUseStandardFrame: string
      • WindowZoomIn: string
      • WindowZoomOut: string
      • WindowZoomReset: string
    • Windows: {
          APMPowerSettingChange: string;
          APMPowerStatusChange: string;
          APMResumeAutomatic: string;
          APMResumeSuspend: string;
          APMSuspend: string;
          ApplicationStarted: string;
          SystemThemeChanged: string;
          WebViewNavigationCompleted: string;
          WindowActive: string;
          WindowBackgroundErase: string;
          WindowClickActive: string;
          WindowClosing: string;
          WindowDPIChanged: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowDragDrop: string;
          WindowDragEnter: string;
          WindowDragLeave: string;
          WindowDragOver: string;
          WindowEndMove: string;
          WindowEndResize: string;
          WindowFullscreen: string;
          WindowHide: string;
          WindowInactive: string;
          WindowKeyDown: string;
          WindowKeyUp: string;
          WindowKillFocus: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowNonClientHit: string;
          WindowNonClientMouseDown: string;
          WindowNonClientMouseLeave: string;
          WindowNonClientMouseMove: string;
          WindowNonClientMouseUp: string;
          WindowPaint: string;
          WindowRestore: string;
          WindowSetFocus: string;
          WindowShow: string;
          WindowStartMove: string;
          WindowStartResize: string;
          WindowUnFullscreen: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowZOrderChanged: string;
      }
      • APMPowerSettingChange: string
      • APMPowerStatusChange: string
      • APMResumeAutomatic: string
      • APMResumeSuspend: string
      • APMSuspend: string
      • ApplicationStarted: string
      • SystemThemeChanged: string
      • WebViewNavigationCompleted: string
      • WindowActive: string
      • WindowBackgroundErase: string
      • WindowClickActive: string
      • WindowClosing: string
      • WindowDPIChanged: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowDragDrop: string
      • WindowDragEnter: string
      • WindowDragLeave: string
      • WindowDragOver: string
      • WindowEndMove: string
      • WindowEndResize: string
      • WindowFullscreen: string
      • WindowHide: string
      • WindowInactive: string
      • WindowKeyDown: string
      • WindowKeyUp: string
      • WindowKillFocus: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowNonClientHit: string
      • WindowNonClientMouseDown: string
      • WindowNonClientMouseLeave: string
      • WindowNonClientMouseMove: string
      • WindowNonClientMouseUp: string
      • WindowPaint: string
      • WindowRestore: string
      • WindowSetFocus: string
      • WindowShow: string
      • WindowStartMove: string
      • WindowStartResize: string
      • WindowUnFullscreen: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowZOrderChanged: string

    Generated using TypeDoc

    \ No newline at end of file +Types | @wailsio/runtime

    Variable TypesConst

    Types: {
        Common: {
            ApplicationOpenedWithFile: string;
            ApplicationStarted: string;
            ThemeChanged: string;
            WindowClosing: string;
            WindowDPIChanged: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowFilesDropped: string;
            WindowFocus: string;
            WindowFullscreen: string;
            WindowHide: string;
            WindowLostFocus: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowRestore: string;
            WindowRuntimeReady: string;
            WindowShow: string;
            WindowUnFullscreen: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowZoom: string;
            WindowZoomIn: string;
            WindowZoomOut: string;
            WindowZoomReset: string;
        };
        Linux: {
            ApplicationStartup: string;
            SystemThemeChanged: string;
            WindowDeleteEvent: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowFocusIn: string;
            WindowFocusOut: string;
            WindowLoadChanged: string;
        };
        Mac: {
            ApplicationDidBecomeActive: string;
            ApplicationDidChangeBackingProperties: string;
            ApplicationDidChangeEffectiveAppearance: string;
            ApplicationDidChangeIcon: string;
            ApplicationDidChangeOcclusionState: string;
            ApplicationDidChangeScreenParameters: string;
            ApplicationDidChangeStatusBarFrame: string;
            ApplicationDidChangeStatusBarOrientation: string;
            ApplicationDidChangeTheme: string;
            ApplicationDidFinishLaunching: string;
            ApplicationDidHide: string;
            ApplicationDidResignActive: string;
            ApplicationDidUnhide: string;
            ApplicationDidUpdate: string;
            ApplicationShouldHandleReopen: string;
            ApplicationWillBecomeActive: string;
            ApplicationWillFinishLaunching: string;
            ApplicationWillHide: string;
            ApplicationWillResignActive: string;
            ApplicationWillTerminate: string;
            ApplicationWillUnhide: string;
            ApplicationWillUpdate: string;
            MenuDidAddItem: string;
            MenuDidBeginTracking: string;
            MenuDidClose: string;
            MenuDidDisplayItem: string;
            MenuDidEndTracking: string;
            MenuDidHighlightItem: string;
            MenuDidOpen: string;
            MenuDidPopUp: string;
            MenuDidRemoveItem: string;
            MenuDidSendAction: string;
            MenuDidSendActionToItem: string;
            MenuDidUpdate: string;
            MenuWillAddItem: string;
            MenuWillBeginTracking: string;
            MenuWillDisplayItem: string;
            MenuWillEndTracking: string;
            MenuWillHighlightItem: string;
            MenuWillOpen: string;
            MenuWillPopUp: string;
            MenuWillRemoveItem: string;
            MenuWillSendAction: string;
            MenuWillSendActionToItem: string;
            MenuWillUpdate: string;
            WebViewDidCommitNavigation: string;
            WebViewDidFinishNavigation: string;
            WebViewDidReceiveServerRedirectForProvisionalNavigation: string;
            WebViewDidStartProvisionalNavigation: string;
            WindowDidBecomeKey: string;
            WindowDidBecomeMain: string;
            WindowDidBeginSheet: string;
            WindowDidChangeAlpha: string;
            WindowDidChangeBackingLocation: string;
            WindowDidChangeBackingProperties: string;
            WindowDidChangeCollectionBehavior: string;
            WindowDidChangeEffectiveAppearance: string;
            WindowDidChangeOcclusionState: string;
            WindowDidChangeOrderingMode: string;
            WindowDidChangeScreen: string;
            WindowDidChangeScreenParameters: string;
            WindowDidChangeScreenProfile: string;
            WindowDidChangeScreenSpace: string;
            WindowDidChangeScreenSpaceProperties: string;
            WindowDidChangeSharingType: string;
            WindowDidChangeSpace: string;
            WindowDidChangeSpaceOrderingMode: string;
            WindowDidChangeTitle: string;
            WindowDidChangeToolbar: string;
            WindowDidDeminiaturize: string;
            WindowDidEndSheet: string;
            WindowDidEnterFullScreen: string;
            WindowDidEnterVersionBrowser: string;
            WindowDidExitFullScreen: string;
            WindowDidExitVersionBrowser: string;
            WindowDidExpose: string;
            WindowDidFocus: string;
            WindowDidMiniaturize: string;
            WindowDidMove: string;
            WindowDidOrderOffScreen: string;
            WindowDidOrderOnScreen: string;
            WindowDidResignKey: string;
            WindowDidResignMain: string;
            WindowDidResize: string;
            WindowDidUpdate: string;
            WindowDidUpdateAlpha: string;
            WindowDidUpdateCollectionBehavior: string;
            WindowDidUpdateCollectionProperties: string;
            WindowDidUpdateShadow: string;
            WindowDidUpdateTitle: string;
            WindowDidUpdateToolbar: string;
            WindowDidZoom: string;
            WindowFileDraggingEntered: string;
            WindowFileDraggingExited: string;
            WindowFileDraggingPerformed: string;
            WindowHide: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowShouldClose: string;
            WindowShow: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowWillBecomeKey: string;
            WindowWillBecomeMain: string;
            WindowWillBeginSheet: string;
            WindowWillChangeOrderingMode: string;
            WindowWillClose: string;
            WindowWillDeminiaturize: string;
            WindowWillEnterFullScreen: string;
            WindowWillEnterVersionBrowser: string;
            WindowWillExitFullScreen: string;
            WindowWillExitVersionBrowser: string;
            WindowWillFocus: string;
            WindowWillMiniaturize: string;
            WindowWillMove: string;
            WindowWillOrderOffScreen: string;
            WindowWillOrderOnScreen: string;
            WindowWillResignMain: string;
            WindowWillResize: string;
            WindowWillUnfocus: string;
            WindowWillUpdate: string;
            WindowWillUpdateAlpha: string;
            WindowWillUpdateCollectionBehavior: string;
            WindowWillUpdateCollectionProperties: string;
            WindowWillUpdateShadow: string;
            WindowWillUpdateTitle: string;
            WindowWillUpdateToolbar: string;
            WindowWillUpdateVisibility: string;
            WindowWillUseStandardFrame: string;
            WindowZoomIn: string;
            WindowZoomOut: string;
            WindowZoomReset: string;
        };
        Windows: {
            APMPowerSettingChange: string;
            APMPowerStatusChange: string;
            APMResumeAutomatic: string;
            APMResumeSuspend: string;
            APMSuspend: string;
            ApplicationStarted: string;
            SystemThemeChanged: string;
            WebViewNavigationCompleted: string;
            WindowActive: string;
            WindowBackgroundErase: string;
            WindowClickActive: string;
            WindowClosing: string;
            WindowDPIChanged: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowDragDrop: string;
            WindowDragEnter: string;
            WindowDragLeave: string;
            WindowDragOver: string;
            WindowEndMove: string;
            WindowEndResize: string;
            WindowFullscreen: string;
            WindowHide: string;
            WindowInactive: string;
            WindowKeyDown: string;
            WindowKeyUp: string;
            WindowKillFocus: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowNonClientHit: string;
            WindowNonClientMouseDown: string;
            WindowNonClientMouseLeave: string;
            WindowNonClientMouseMove: string;
            WindowNonClientMouseUp: string;
            WindowPaint: string;
            WindowRestore: string;
            WindowSetFocus: string;
            WindowShow: string;
            WindowStartMove: string;
            WindowStartResize: string;
            WindowUnFullscreen: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowZOrderChanged: string;
        };
    } = EventTypes

    Type declaration

    • Common: {
          ApplicationOpenedWithFile: string;
          ApplicationStarted: string;
          ThemeChanged: string;
          WindowClosing: string;
          WindowDPIChanged: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowFilesDropped: string;
          WindowFocus: string;
          WindowFullscreen: string;
          WindowHide: string;
          WindowLostFocus: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowRestore: string;
          WindowRuntimeReady: string;
          WindowShow: string;
          WindowUnFullscreen: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowZoom: string;
          WindowZoomIn: string;
          WindowZoomOut: string;
          WindowZoomReset: string;
      }
      • ApplicationOpenedWithFile: string
      • ApplicationStarted: string
      • ThemeChanged: string
      • WindowClosing: string
      • WindowDPIChanged: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowFilesDropped: string
      • WindowFocus: string
      • WindowFullscreen: string
      • WindowHide: string
      • WindowLostFocus: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowRestore: string
      • WindowRuntimeReady: string
      • WindowShow: string
      • WindowUnFullscreen: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowZoom: string
      • WindowZoomIn: string
      • WindowZoomOut: string
      • WindowZoomReset: string
    • Linux: {
          ApplicationStartup: string;
          SystemThemeChanged: string;
          WindowDeleteEvent: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowFocusIn: string;
          WindowFocusOut: string;
          WindowLoadChanged: string;
      }
      • ApplicationStartup: string
      • SystemThemeChanged: string
      • WindowDeleteEvent: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowFocusIn: string
      • WindowFocusOut: string
      • WindowLoadChanged: string
    • Mac: {
          ApplicationDidBecomeActive: string;
          ApplicationDidChangeBackingProperties: string;
          ApplicationDidChangeEffectiveAppearance: string;
          ApplicationDidChangeIcon: string;
          ApplicationDidChangeOcclusionState: string;
          ApplicationDidChangeScreenParameters: string;
          ApplicationDidChangeStatusBarFrame: string;
          ApplicationDidChangeStatusBarOrientation: string;
          ApplicationDidChangeTheme: string;
          ApplicationDidFinishLaunching: string;
          ApplicationDidHide: string;
          ApplicationDidResignActive: string;
          ApplicationDidUnhide: string;
          ApplicationDidUpdate: string;
          ApplicationShouldHandleReopen: string;
          ApplicationWillBecomeActive: string;
          ApplicationWillFinishLaunching: string;
          ApplicationWillHide: string;
          ApplicationWillResignActive: string;
          ApplicationWillTerminate: string;
          ApplicationWillUnhide: string;
          ApplicationWillUpdate: string;
          MenuDidAddItem: string;
          MenuDidBeginTracking: string;
          MenuDidClose: string;
          MenuDidDisplayItem: string;
          MenuDidEndTracking: string;
          MenuDidHighlightItem: string;
          MenuDidOpen: string;
          MenuDidPopUp: string;
          MenuDidRemoveItem: string;
          MenuDidSendAction: string;
          MenuDidSendActionToItem: string;
          MenuDidUpdate: string;
          MenuWillAddItem: string;
          MenuWillBeginTracking: string;
          MenuWillDisplayItem: string;
          MenuWillEndTracking: string;
          MenuWillHighlightItem: string;
          MenuWillOpen: string;
          MenuWillPopUp: string;
          MenuWillRemoveItem: string;
          MenuWillSendAction: string;
          MenuWillSendActionToItem: string;
          MenuWillUpdate: string;
          WebViewDidCommitNavigation: string;
          WebViewDidFinishNavigation: string;
          WebViewDidReceiveServerRedirectForProvisionalNavigation: string;
          WebViewDidStartProvisionalNavigation: string;
          WindowDidBecomeKey: string;
          WindowDidBecomeMain: string;
          WindowDidBeginSheet: string;
          WindowDidChangeAlpha: string;
          WindowDidChangeBackingLocation: string;
          WindowDidChangeBackingProperties: string;
          WindowDidChangeCollectionBehavior: string;
          WindowDidChangeEffectiveAppearance: string;
          WindowDidChangeOcclusionState: string;
          WindowDidChangeOrderingMode: string;
          WindowDidChangeScreen: string;
          WindowDidChangeScreenParameters: string;
          WindowDidChangeScreenProfile: string;
          WindowDidChangeScreenSpace: string;
          WindowDidChangeScreenSpaceProperties: string;
          WindowDidChangeSharingType: string;
          WindowDidChangeSpace: string;
          WindowDidChangeSpaceOrderingMode: string;
          WindowDidChangeTitle: string;
          WindowDidChangeToolbar: string;
          WindowDidDeminiaturize: string;
          WindowDidEndSheet: string;
          WindowDidEnterFullScreen: string;
          WindowDidEnterVersionBrowser: string;
          WindowDidExitFullScreen: string;
          WindowDidExitVersionBrowser: string;
          WindowDidExpose: string;
          WindowDidFocus: string;
          WindowDidMiniaturize: string;
          WindowDidMove: string;
          WindowDidOrderOffScreen: string;
          WindowDidOrderOnScreen: string;
          WindowDidResignKey: string;
          WindowDidResignMain: string;
          WindowDidResize: string;
          WindowDidUpdate: string;
          WindowDidUpdateAlpha: string;
          WindowDidUpdateCollectionBehavior: string;
          WindowDidUpdateCollectionProperties: string;
          WindowDidUpdateShadow: string;
          WindowDidUpdateTitle: string;
          WindowDidUpdateToolbar: string;
          WindowDidZoom: string;
          WindowFileDraggingEntered: string;
          WindowFileDraggingExited: string;
          WindowFileDraggingPerformed: string;
          WindowHide: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowShouldClose: string;
          WindowShow: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowWillBecomeKey: string;
          WindowWillBecomeMain: string;
          WindowWillBeginSheet: string;
          WindowWillChangeOrderingMode: string;
          WindowWillClose: string;
          WindowWillDeminiaturize: string;
          WindowWillEnterFullScreen: string;
          WindowWillEnterVersionBrowser: string;
          WindowWillExitFullScreen: string;
          WindowWillExitVersionBrowser: string;
          WindowWillFocus: string;
          WindowWillMiniaturize: string;
          WindowWillMove: string;
          WindowWillOrderOffScreen: string;
          WindowWillOrderOnScreen: string;
          WindowWillResignMain: string;
          WindowWillResize: string;
          WindowWillUnfocus: string;
          WindowWillUpdate: string;
          WindowWillUpdateAlpha: string;
          WindowWillUpdateCollectionBehavior: string;
          WindowWillUpdateCollectionProperties: string;
          WindowWillUpdateShadow: string;
          WindowWillUpdateTitle: string;
          WindowWillUpdateToolbar: string;
          WindowWillUpdateVisibility: string;
          WindowWillUseStandardFrame: string;
          WindowZoomIn: string;
          WindowZoomOut: string;
          WindowZoomReset: string;
      }
      • ApplicationDidBecomeActive: string
      • ApplicationDidChangeBackingProperties: string
      • ApplicationDidChangeEffectiveAppearance: string
      • ApplicationDidChangeIcon: string
      • ApplicationDidChangeOcclusionState: string
      • ApplicationDidChangeScreenParameters: string
      • ApplicationDidChangeStatusBarFrame: string
      • ApplicationDidChangeStatusBarOrientation: string
      • ApplicationDidChangeTheme: string
      • ApplicationDidFinishLaunching: string
      • ApplicationDidHide: string
      • ApplicationDidResignActive: string
      • ApplicationDidUnhide: string
      • ApplicationDidUpdate: string
      • ApplicationShouldHandleReopen: string
      • ApplicationWillBecomeActive: string
      • ApplicationWillFinishLaunching: string
      • ApplicationWillHide: string
      • ApplicationWillResignActive: string
      • ApplicationWillTerminate: string
      • ApplicationWillUnhide: string
      • ApplicationWillUpdate: string
      • MenuDidAddItem: string
      • MenuDidBeginTracking: string
      • MenuDidClose: string
      • MenuDidDisplayItem: string
      • MenuDidEndTracking: string
      • MenuDidHighlightItem: string
      • MenuDidOpen: string
      • MenuDidPopUp: string
      • MenuDidRemoveItem: string
      • MenuDidSendAction: string
      • MenuDidSendActionToItem: string
      • MenuDidUpdate: string
      • MenuWillAddItem: string
      • MenuWillBeginTracking: string
      • MenuWillDisplayItem: string
      • MenuWillEndTracking: string
      • MenuWillHighlightItem: string
      • MenuWillOpen: string
      • MenuWillPopUp: string
      • MenuWillRemoveItem: string
      • MenuWillSendAction: string
      • MenuWillSendActionToItem: string
      • MenuWillUpdate: string
      • WebViewDidCommitNavigation: string
      • WebViewDidFinishNavigation: string
      • WebViewDidReceiveServerRedirectForProvisionalNavigation: string
      • WebViewDidStartProvisionalNavigation: string
      • WindowDidBecomeKey: string
      • WindowDidBecomeMain: string
      • WindowDidBeginSheet: string
      • WindowDidChangeAlpha: string
      • WindowDidChangeBackingLocation: string
      • WindowDidChangeBackingProperties: string
      • WindowDidChangeCollectionBehavior: string
      • WindowDidChangeEffectiveAppearance: string
      • WindowDidChangeOcclusionState: string
      • WindowDidChangeOrderingMode: string
      • WindowDidChangeScreen: string
      • WindowDidChangeScreenParameters: string
      • WindowDidChangeScreenProfile: string
      • WindowDidChangeScreenSpace: string
      • WindowDidChangeScreenSpaceProperties: string
      • WindowDidChangeSharingType: string
      • WindowDidChangeSpace: string
      • WindowDidChangeSpaceOrderingMode: string
      • WindowDidChangeTitle: string
      • WindowDidChangeToolbar: string
      • WindowDidDeminiaturize: string
      • WindowDidEndSheet: string
      • WindowDidEnterFullScreen: string
      • WindowDidEnterVersionBrowser: string
      • WindowDidExitFullScreen: string
      • WindowDidExitVersionBrowser: string
      • WindowDidExpose: string
      • WindowDidFocus: string
      • WindowDidMiniaturize: string
      • WindowDidMove: string
      • WindowDidOrderOffScreen: string
      • WindowDidOrderOnScreen: string
      • WindowDidResignKey: string
      • WindowDidResignMain: string
      • WindowDidResize: string
      • WindowDidUpdate: string
      • WindowDidUpdateAlpha: string
      • WindowDidUpdateCollectionBehavior: string
      • WindowDidUpdateCollectionProperties: string
      • WindowDidUpdateShadow: string
      • WindowDidUpdateTitle: string
      • WindowDidUpdateToolbar: string
      • WindowDidZoom: string
      • WindowFileDraggingEntered: string
      • WindowFileDraggingExited: string
      • WindowFileDraggingPerformed: string
      • WindowHide: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowShouldClose: string
      • WindowShow: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowWillBecomeKey: string
      • WindowWillBecomeMain: string
      • WindowWillBeginSheet: string
      • WindowWillChangeOrderingMode: string
      • WindowWillClose: string
      • WindowWillDeminiaturize: string
      • WindowWillEnterFullScreen: string
      • WindowWillEnterVersionBrowser: string
      • WindowWillExitFullScreen: string
      • WindowWillExitVersionBrowser: string
      • WindowWillFocus: string
      • WindowWillMiniaturize: string
      • WindowWillMove: string
      • WindowWillOrderOffScreen: string
      • WindowWillOrderOnScreen: string
      • WindowWillResignMain: string
      • WindowWillResize: string
      • WindowWillUnfocus: string
      • WindowWillUpdate: string
      • WindowWillUpdateAlpha: string
      • WindowWillUpdateCollectionBehavior: string
      • WindowWillUpdateCollectionProperties: string
      • WindowWillUpdateShadow: string
      • WindowWillUpdateTitle: string
      • WindowWillUpdateToolbar: string
      • WindowWillUpdateVisibility: string
      • WindowWillUseStandardFrame: string
      • WindowZoomIn: string
      • WindowZoomOut: string
      • WindowZoomReset: string
    • Windows: {
          APMPowerSettingChange: string;
          APMPowerStatusChange: string;
          APMResumeAutomatic: string;
          APMResumeSuspend: string;
          APMSuspend: string;
          ApplicationStarted: string;
          SystemThemeChanged: string;
          WebViewNavigationCompleted: string;
          WindowActive: string;
          WindowBackgroundErase: string;
          WindowClickActive: string;
          WindowClosing: string;
          WindowDPIChanged: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowDragDrop: string;
          WindowDragEnter: string;
          WindowDragLeave: string;
          WindowDragOver: string;
          WindowEndMove: string;
          WindowEndResize: string;
          WindowFullscreen: string;
          WindowHide: string;
          WindowInactive: string;
          WindowKeyDown: string;
          WindowKeyUp: string;
          WindowKillFocus: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowNonClientHit: string;
          WindowNonClientMouseDown: string;
          WindowNonClientMouseLeave: string;
          WindowNonClientMouseMove: string;
          WindowNonClientMouseUp: string;
          WindowPaint: string;
          WindowRestore: string;
          WindowSetFocus: string;
          WindowShow: string;
          WindowStartMove: string;
          WindowStartResize: string;
          WindowUnFullscreen: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowZOrderChanged: string;
      }
      • APMPowerSettingChange: string
      • APMPowerStatusChange: string
      • APMResumeAutomatic: string
      • APMResumeSuspend: string
      • APMSuspend: string
      • ApplicationStarted: string
      • SystemThemeChanged: string
      • WebViewNavigationCompleted: string
      • WindowActive: string
      • WindowBackgroundErase: string
      • WindowClickActive: string
      • WindowClosing: string
      • WindowDPIChanged: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowDragDrop: string
      • WindowDragEnter: string
      • WindowDragLeave: string
      • WindowDragOver: string
      • WindowEndMove: string
      • WindowEndResize: string
      • WindowFullscreen: string
      • WindowHide: string
      • WindowInactive: string
      • WindowKeyDown: string
      • WindowKeyUp: string
      • WindowKillFocus: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowNonClientHit: string
      • WindowNonClientMouseDown: string
      • WindowNonClientMouseLeave: string
      • WindowNonClientMouseMove: string
      • WindowNonClientMouseUp: string
      • WindowPaint: string
      • WindowRestore: string
      • WindowSetFocus: string
      • WindowShow: string
      • WindowStartMove: string
      • WindowStartResize: string
      • WindowUnFullscreen: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowZOrderChanged: string

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Window.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Window.html index 5e8b5d684..bdd80efb8 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Window.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Window.html @@ -1,2 +1,2 @@ Window | @wailsio/runtime

    Variable WindowConst

    Window: Window = ...

    The window within which the script is running.

    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/package.json b/v3/internal/runtime/desktop/@wailsio/runtime/package.json index 4c3544130..7412db923 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/package.json +++ b/v3/internal/runtime/desktop/@wailsio/runtime/package.json @@ -1,7 +1,7 @@ { "name": "@wailsio/runtime", "type": "module", - "version": "3.0.0-alpha.56", + "version": "3.0.0-alpha.57", "description": "Wails Runtime", "types": "types/index.d.ts", "exports": { From be716fc0ee580445178a4d6dda87b26840b7cc95 Mon Sep 17 00:00:00 2001 From: Zach Botterman Date: Mon, 24 Feb 2025 16:47:19 -0800 Subject: [PATCH 040/374] fix input id --- v3/go.mod | 2 +- v3/go.sum | 4 ++-- .../services/notifications/notifications_windows.go | 13 ++++++++++++- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/v3/go.mod b/v3/go.mod index fd4383baa..cf9dd83c7 100644 --- a/v3/go.mod +++ b/v3/go.mod @@ -3,7 +3,7 @@ module github.com/wailsapp/wails/v3 go 1.24.0 require ( - git.sr.ht/~jackmordaunt/go-toast v1.1.2 + git.sr.ht/~jackmordaunt/go-toast/v2 v2.0.3 github.com/Masterminds/semver v1.5.0 github.com/adrg/xdg v0.5.3 github.com/atterpac/refresh v0.8.4 diff --git a/v3/go.sum b/v3/go.sum index faf9d7aff..052246286 100644 --- a/v3/go.sum +++ b/v3/go.sum @@ -8,8 +8,8 @@ atomicgo.dev/schedule v0.1.0 h1:nTthAbhZS5YZmgYbb2+DH8uQIZcTlIrd4eYr3UQxEjs= atomicgo.dev/schedule v0.1.0/go.mod h1:xeUa3oAkiuHYh8bKiQBRojqAMq3PXXbJujjb0hw8pEU= dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s= dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= -git.sr.ht/~jackmordaunt/go-toast v1.1.2 h1:/yrfI55LRt1M7H1vkaw+NaH1+L1CDxrqDltwm5euVuE= -git.sr.ht/~jackmordaunt/go-toast v1.1.2/go.mod h1:jA4OqHKTQ4AFBdwrSnwnskUIIS3HYzlJSgdzCKqfavo= +git.sr.ht/~jackmordaunt/go-toast/v2 v2.0.3 h1:N3IGoHHp9pb6mj1cbXbuaSXV/UMKwmbKLf53nQmtqMA= +git.sr.ht/~jackmordaunt/go-toast/v2 v2.0.3/go.mod h1:QtOLZGz8olr4qH2vWK0QH0w0O4T9fEIjMuWpKUsH7nc= github.com/AlekSi/pointer v1.2.0 h1:glcy/gc4h8HnG2Z3ZECSzZ1IX1x2JxRVuDzaJwQE0+w= github.com/AlekSi/pointer v1.2.0/go.mod h1:gZGfd3dpW4vEc/UlyfKKi1roIqcCgwOIvb0tSNSBle0= github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= diff --git a/v3/pkg/services/notifications/notifications_windows.go b/v3/pkg/services/notifications/notifications_windows.go index 0dfb1a367..2496b7669 100644 --- a/v3/pkg/services/notifications/notifications_windows.go +++ b/v3/pkg/services/notifications/notifications_windows.go @@ -11,7 +11,7 @@ import ( "strings" "sync" - "git.sr.ht/~jackmordaunt/go-toast" + "git.sr.ht/~jackmordaunt/go-toast/v2" "github.com/wailsapp/wails/v3/pkg/application" "golang.org/x/sys/windows/registry" ) @@ -36,7 +36,15 @@ func (ns *Service) ServiceName() string { // ServiceStartup is called when the service is loaded // Sets an activation callback to emit an event when notifications are interacted with. func (ns *Service) ServiceStartup(ctx context.Context, options application.ServiceOptions) error { + toast.SetAppData(toast.AppData{ + AppID: "Notifications", + GUID: "{8F2E1A3D-C497-42B6-9E5D-72F8A169B051}", + IconPath: "C:\\Users\\Zach\\Development\\notifications_demo\\build\\appicon.ico", + ActivationExe: "C:\\Users\\Zach\\Development\\notifications_demo\\bin\\Notifications.exe", + }) + toast.SetActivationCallback(func(args string, data []toast.UserData) { + println("HERE!") actionIdentifier, userInfo := parseNotificationResponse(args) response := NotificationResponse{ Name: "notification", @@ -94,6 +102,7 @@ func (ns *Service) SendNotification(options NotificationOptions) error { Title: options.Title, Body: options.Body, ActivationArguments: defaultAction, + Audio: toast.IM, } if options.Data != nil { @@ -124,6 +133,7 @@ func (ns *Service) SendNotificationWithActions(options NotificationOptions) erro Title: options.Title, Body: options.Body, ActivationArguments: defaultAction, + Audio: toast.IM, } for _, action := range nCategory.Actions { @@ -143,6 +153,7 @@ func (ns *Service) SendNotificationWithActions(options NotificationOptions) erro n.Actions = append(n.Actions, toast.Action{ Content: nCategory.ReplyButtonTitle, Arguments: "TEXT_REPLY", + InputID: "userText", }) } From 8da998191a8fa99d3e104c325c8ee2c9d34e3bd1 Mon Sep 17 00:00:00 2001 From: Zach Botterman Date: Mon, 24 Feb 2025 17:58:05 -0800 Subject: [PATCH 041/374] for review --- .../notifications/notifications_windows.go | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/v3/pkg/services/notifications/notifications_windows.go b/v3/pkg/services/notifications/notifications_windows.go index 2496b7669..977ddae40 100644 --- a/v3/pkg/services/notifications/notifications_windows.go +++ b/v3/pkg/services/notifications/notifications_windows.go @@ -36,15 +36,17 @@ func (ns *Service) ServiceName() string { // ServiceStartup is called when the service is loaded // Sets an activation callback to emit an event when notifications are interacted with. func (ns *Service) ServiceStartup(ctx context.Context, options application.ServiceOptions) error { - toast.SetAppData(toast.AppData{ - AppID: "Notifications", - GUID: "{8F2E1A3D-C497-42B6-9E5D-72F8A169B051}", - IconPath: "C:\\Users\\Zach\\Development\\notifications_demo\\build\\appicon.ico", - ActivationExe: "C:\\Users\\Zach\\Development\\notifications_demo\\bin\\Notifications.exe", - }) + // Need to get App Name and generate a UUID on first launch + // + // toast.SetAppData(toast.AppData{ + // AppID: "Notifications", + // GUID: "{8F2E1A3D-C497-42B6-9E5D-72F8A169B051}", + // IconPath: "C:\\Users\\Zach\\Development\\notifications_demo\\build\\appicon.ico", + // ActivationExe: "C:\\Users\\Zach\\Development\\notifications_demo\\bin\\Notifications.exe", + // }) + // toast.SetActivationCallback(func(args string, data []toast.UserData) { - println("HERE!") actionIdentifier, userInfo := parseNotificationResponse(args) response := NotificationResponse{ Name: "notification", From 95b4bfc253c2f393476cf25ba752dc442a94757e Mon Sep 17 00:00:00 2001 From: Fabio Massaioli Date: Tue, 25 Feb 2025 03:30:30 +0100 Subject: [PATCH 042/374] Migrate runtime to TypeScript --- .../desktop/@wailsio/runtime/.npmignore | 5 - .../desktop/@wailsio/runtime/package.json | 49 +- .../src/{application.js => application.ts} | 19 +- .../desktop/@wailsio/runtime/src/browser.js | 24 - .../desktop/@wailsio/runtime/src/browser.ts | 24 + .../desktop/@wailsio/runtime/src/callable.ts | 125 +++ .../desktop/@wailsio/runtime/src/calls.js | 221 ----- .../desktop/@wailsio/runtime/src/calls.ts | 233 +++++ .../@wailsio/runtime/src/cancellable.ts | 923 ++++++++++++++++++ .../desktop/@wailsio/runtime/src/clipboard.js | 35 - .../desktop/@wailsio/runtime/src/clipboard.ts | 35 + .../src/{contextmenu.js => contextmenu.ts} | 65 +- .../runtime/src/{create.js => create.ts} | 40 +- .../desktop/@wailsio/runtime/src/dialogs.js | 200 ---- .../desktop/@wailsio/runtime/src/dialogs.ts | 255 +++++ .../desktop/@wailsio/runtime/src/drag.js | 119 --- .../desktop/@wailsio/runtime/src/drag.ts | 209 ++++ .../src/{event_types.js => event_types.ts} | 32 +- .../desktop/@wailsio/runtime/src/events.js | 140 --- .../desktop/@wailsio/runtime/src/events.ts | 135 +++ .../desktop/@wailsio/runtime/src/flags.js | 25 - .../desktop/@wailsio/runtime/src/flags.ts | 23 + .../desktop/@wailsio/runtime/src/global.d.ts | 17 + .../desktop/@wailsio/runtime/src/index.js | 60 -- .../desktop/@wailsio/runtime/src/index.ts | 57 ++ .../desktop/@wailsio/runtime/src/listener.ts | 52 + .../runtime/src/{nanoid.js => nanoid.ts} | 6 +- .../desktop/@wailsio/runtime/src/runtime.js | 92 -- .../desktop/@wailsio/runtime/src/runtime.ts | 67 ++ .../desktop/@wailsio/runtime/src/screens.js | 71 -- .../desktop/@wailsio/runtime/src/screens.ts | 88 ++ .../desktop/@wailsio/runtime/src/system.js | 143 --- .../desktop/@wailsio/runtime/src/system.ts | 156 +++ .../runtime/src/{utils.js => utils.ts} | 22 +- .../desktop/@wailsio/runtime/src/window.js | 638 ------------ .../desktop/@wailsio/runtime/src/window.ts | 520 ++++++++++ .../desktop/@wailsio/runtime/src/wml.js | 250 ----- .../desktop/@wailsio/runtime/src/wml.ts | 209 ++++ .../desktop/@wailsio/runtime/tsconfig.json | 40 +- v3/tasks/events/generate.go | 124 +-- 40 files changed, 3316 insertions(+), 2232 deletions(-) delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/.npmignore rename v3/internal/runtime/desktop/@wailsio/runtime/src/{application.js => application.ts} (61%) delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/src/browser.js create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/src/browser.ts create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/src/callable.ts delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/src/calls.js create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/src/calls.ts create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/src/cancellable.ts delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/src/clipboard.js create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/src/clipboard.ts rename v3/internal/runtime/desktop/@wailsio/runtime/src/{contextmenu.js => contextmenu.ts} (55%) rename v3/internal/runtime/desktop/@wailsio/runtime/src/{create.js => create.ts} (69%) delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/src/dialogs.js create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/src/dialogs.ts delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/src/drag.js create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/src/drag.ts rename v3/internal/runtime/desktop/@wailsio/runtime/src/{event_types.js => event_types.ts} (96%) delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/src/events.js create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/src/events.ts delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/src/flags.js create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/src/flags.ts create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/src/global.d.ts delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/src/index.js create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/src/index.ts create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/src/listener.ts rename v3/internal/runtime/desktop/@wailsio/runtime/src/{nanoid.js => nanoid.ts} (96%) delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/src/runtime.js create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/src/runtime.ts delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/src/screens.js create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/src/screens.ts delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/src/system.js create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/src/system.ts rename v3/internal/runtime/desktop/@wailsio/runtime/src/{utils.js => utils.ts} (85%) delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/src/window.js create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/src/window.ts delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/src/wml.js create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/src/wml.ts diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/.npmignore b/v3/internal/runtime/desktop/@wailsio/runtime/.npmignore deleted file mode 100644 index a77a7c831..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/.npmignore +++ /dev/null @@ -1,5 +0,0 @@ -events.test.js -node_modules -types/drag.d.ts -types/contextmenu.d.ts -types/log.d.ts \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/package.json b/v3/internal/runtime/desktop/@wailsio/runtime/package.json index 4c3544130..3f24339c3 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/package.json +++ b/v3/internal/runtime/desktop/@wailsio/runtime/package.json @@ -3,36 +3,47 @@ "type": "module", "version": "3.0.0-alpha.56", "description": "Wails Runtime", - "types": "types/index.d.ts", "exports": { - ".": { - "types": "./types/index.d.ts", - "require": "./src/index.js", - "import": "./src/index.js" - } + "types": "./types/index.d.ts", + "import": "./dist/index.js" }, "repository": { "type": "git", - "url": "git+https://github.com/wailsapp/wails.git" - }, - "scripts": { - "prebuild:types": "rimraf ./types", - "build:types": "npx -p typescript tsc src/index.js --declaration --allowJs --emitDeclarationOnly --outDir types", - "postbuild:types": "task generate:events", - "build:docs": "npx typedoc ./src/index.js", - "build:docs:md": "npx typedoc ./src/index.js" + "url": "git+https://github.com/wailsapp/wails.git", + "directory": "v3/internal/runtime/desktop/@wailsio/runtime" }, "author": "The Wails Team", "license": "MIT", + "homepage": "https://v3.wails.io", "bugs": { "url": "https://github.com/wailsapp/wails/issues" }, - "homepage": "https://wails.io", - "private": false, + "files": [ + "./dist", + "./types" + ], + "sideEffects": [ + "./dist/index.js", + "./dist/contextmenu.js", + "./dist/drag.js" + ], + "scripts": { + "clean": "npx rimraf ./dist ./docs ./types ./tsconfig.tsbuildinfo", + "generate:events": "task generate:events", + "generate": "npm run generate:events", + "prebuild": "npm run clean && npm run generate", + "build:code": "npx tsc", + "build:docs": "npx typedoc --plugin typedoc-plugin-mdn-links --plugin typedoc-plugin-missing-exports ./src/index.ts", + "build:docs:md": "npx typedoc --plugin typedoc-plugin-markdown --plugin typedoc-plugin-mdn-links --plugin typedoc-plugin-missing-exports ./src/index.ts", + "build": "npm run build:code & npm run build:docs & wait", + "prepack": "npm run build" + }, "devDependencies": { "rimraf": "^5.0.5", - "typedoc": "^0.25.7", - "typedoc-plugin-markdown": "^3.17.1", - "typescript": "^5.3.3" + "typedoc": "^0.27.7", + "typedoc-plugin-markdown": "^4.4.2", + "typedoc-plugin-mdn-links": "^4.0.13", + "typedoc-plugin-missing-exports": "^3.1.0", + "typescript": "^5.7.3", } } diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/application.js b/v3/internal/runtime/desktop/@wailsio/runtime/src/application.ts similarity index 61% rename from v3/internal/runtime/desktop/@wailsio/runtime/src/application.js rename to v3/internal/runtime/desktop/@wailsio/runtime/src/application.ts index 8f650e287..57a41ac9e 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/src/application.js +++ b/v3/internal/runtime/desktop/@wailsio/runtime/src/application.ts @@ -8,10 +8,8 @@ The electron alternative for Go (c) Lea Anthony 2019-present */ -/* jshint esversion: 9 */ - -import { newRuntimeCallerWithID, objectNames } from "./runtime"; -const call = newRuntimeCallerWithID(objectNames.Application, ''); +import { newRuntimeCaller, objectNames } from "./runtime.js"; +const call = newRuntimeCaller(objectNames.Application); const HideMethod = 0; const ShowMethod = 1; @@ -19,28 +17,21 @@ const QuitMethod = 2; /** * Hides a certain method by calling the HideMethod function. - * - * @return {Promise} - * */ -export function Hide() { +export function Hide(): Promise { return call(HideMethod); } /** * Calls the ShowMethod and returns the result. - * - * @return {Promise} */ -export function Show() { +export function Show(): Promise { return call(ShowMethod); } /** * Calls the QuitMethod to terminate the program. - * - * @return {Promise} */ -export function Quit() { +export function Quit(): Promise { return call(QuitMethod); } diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/browser.js b/v3/internal/runtime/desktop/@wailsio/runtime/src/browser.js deleted file mode 100644 index 64d80c986..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/src/browser.js +++ /dev/null @@ -1,24 +0,0 @@ -/* - _ __ _ __ -| | / /___ _(_) /____ -| | /| / / __ `/ / / ___/ -| |/ |/ / /_/ / / (__ ) -|__/|__/\__,_/_/_/____/ -The electron alternative for Go -(c) Lea Anthony 2019-present -*/ - -/* jshint esversion: 9 */ -import {newRuntimeCallerWithID, objectNames} from "./runtime"; - -const call = newRuntimeCallerWithID(objectNames.Browser, ''); -const BrowserOpenURL = 0; - -/** - * Open a browser window to the given URL - * @param {string} url - The URL to open - * @returns {Promise} - */ -export function OpenURL(url) { - return call(BrowserOpenURL, {url}); -} diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/browser.ts b/v3/internal/runtime/desktop/@wailsio/runtime/src/browser.ts new file mode 100644 index 000000000..465310d3d --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/src/browser.ts @@ -0,0 +1,24 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ + +import { newRuntimeCaller, objectNames } from "./runtime.js"; + +const call = newRuntimeCaller(objectNames.Browser); + +const BrowserOpenURL = 0; + +/** + * Open a browser window to the given URL. + * + * @param url - The URL to open + */ +export function OpenURL(url: string | URL): Promise { + return call(BrowserOpenURL, {url: url.toString()}); +} diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/callable.ts b/v3/internal/runtime/desktop/@wailsio/runtime/src/callable.ts new file mode 100644 index 000000000..e8e2e4087 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/src/callable.ts @@ -0,0 +1,125 @@ +// Source: https://github.com/inspect-js/is-callable + +// The MIT License (MIT) +// +// Copyright (c) 2015 Jordan Harband +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +var fnToStr = Function.prototype.toString; +var reflectApply: typeof Reflect.apply | false | null = typeof Reflect === 'object' && Reflect !== null && Reflect.apply; +var badArrayLike: any; +var isCallableMarker: any; +if (typeof reflectApply === 'function' && typeof Object.defineProperty === 'function') { + try { + badArrayLike = Object.defineProperty({}, 'length', { + get: function () { + throw isCallableMarker; + } + }); + isCallableMarker = {}; + // eslint-disable-next-line no-throw-literal + reflectApply(function () { throw 42; }, null, badArrayLike); + } catch (_) { + if (_ !== isCallableMarker) { + reflectApply = null; + } + } +} else { + reflectApply = null; +} + +var constructorRegex = /^\s*class\b/; +var isES6ClassFn = function isES6ClassFunction(value: any): boolean { + try { + var fnStr = fnToStr.call(value); + return constructorRegex.test(fnStr); + } catch (e) { + return false; // not a function + } +}; + +var tryFunctionObject = function tryFunctionToStr(value: any): boolean { + try { + if (isES6ClassFn(value)) { return false; } + fnToStr.call(value); + return true; + } catch (e) { + return false; + } +}; +var toStr = Object.prototype.toString; +var objectClass = '[object Object]'; +var fnClass = '[object Function]'; +var genClass = '[object GeneratorFunction]'; +var ddaClass = '[object HTMLAllCollection]'; // IE 11 +var ddaClass2 = '[object HTML document.all class]'; +var ddaClass3 = '[object HTMLCollection]'; // IE 9-10 +var hasToStringTag = typeof Symbol === 'function' && !!Symbol.toStringTag; // better: use `has-tostringtag` + +var isIE68 = !(0 in [,]); // eslint-disable-line no-sparse-arrays, comma-spacing + +var isDDA: (value: any) => boolean = function isDocumentDotAll() { return false; }; +if (typeof document === 'object') { + // Firefox 3 canonicalizes DDA to undefined when it's not accessed directly + var all = document.all; + if (toStr.call(all) === toStr.call(document.all)) { + isDDA = function isDocumentDotAll(value) { + /* globals document: false */ + // in IE 6-8, typeof document.all is "object" and it's truthy + if ((isIE68 || !value) && (typeof value === 'undefined' || typeof value === 'object')) { + try { + var str = toStr.call(value); + return ( + str === ddaClass + || str === ddaClass2 + || str === ddaClass3 // opera 12.16 + || str === objectClass // IE 6-8 + ) && value('') == null; // eslint-disable-line eqeqeq + } catch (e) { /**/ } + } + return false; + }; + } +} + +function isCallableRefApply(value: T | unknown): value is (...args: any[]) => any { + if (isDDA(value)) { return true; } + if (!value) { return false; } + if (typeof value !== 'function' && typeof value !== 'object') { return false; } + try { + (reflectApply as any)(value, null, badArrayLike); + } catch (e) { + if (e !== isCallableMarker) { return false; } + } + return !isES6ClassFn(value) && tryFunctionObject(value); +} + +function isCallableNoRefApply(value: T | unknown): value is (...args: any[]) => any { + if (isDDA(value)) { return true; } + if (!value) { return false; } + if (typeof value !== 'function' && typeof value !== 'object') { return false; } + if (hasToStringTag) { return tryFunctionObject(value); } + if (isES6ClassFn(value)) { return false; } + var strClass = toStr.call(value); + if (strClass !== fnClass && strClass !== genClass && !(/^\[object HTML/).test(strClass)) { return false; } + return tryFunctionObject(value); +}; + +export default reflectApply ? isCallableRefApply : isCallableNoRefApply; diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/calls.js b/v3/internal/runtime/desktop/@wailsio/runtime/src/calls.js deleted file mode 100644 index dad53bb02..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/src/calls.js +++ /dev/null @@ -1,221 +0,0 @@ -/* - _ __ _ __ -| | / /___ _(_) /____ -| | /| / / __ `/ / / ___/ -| |/ |/ / /_/ / / (__ ) -|__/|__/\__,_/_/_/____/ -The electron alternative for Go -(c) Lea Anthony 2019-present -*/ - -/* jshint esversion: 9 */ -import { newRuntimeCallerWithID, objectNames } from "./runtime"; -import { nanoid } from './nanoid.js'; - -// Setup -window._wails = window._wails || {}; -window._wails.callResultHandler = resultHandler; -window._wails.callErrorHandler = errorHandler; - - -const CallBinding = 0; -const call = newRuntimeCallerWithID(objectNames.Call, ''); -const cancelCall = newRuntimeCallerWithID(objectNames.CancelCall, ''); -let callResponses = new Map(); - -/** - * Generates a unique ID using the nanoid library. - * - * @return {string} - A unique ID that does not exist in the callResponses set. - */ -function generateID() { - let result; - do { - result = nanoid(); - } while (callResponses.has(result)); - return result; -} - -/** - * Handles the result of a call request. - * - * @param {string} id - The id of the request to handle the result for. - * @param {string} data - The result data of the request. - * @param {boolean} isJSON - Indicates whether the data is JSON or not. - * - * @return {undefined} - This method does not return any value. - */ -function resultHandler(id, data, isJSON) { - const promiseHandler = getAndDeleteResponse(id); - if (promiseHandler) { - if (!data) { - promiseHandler.resolve(); - } else if (!isJSON) { - promiseHandler.resolve(data); - } else { - try { - promiseHandler.resolve(JSON.parse(data)); - } catch (err) { - promiseHandler.reject(new TypeError("could not parse result: " + err.message, { cause: err })); - } - } - } -} - -/** - * Handles the error from a call request. - * - * @param {string} id - The id of the promise handler. - * @param {string} data - The error data to reject the promise handler with. - * @param {boolean} isJSON - Indicates whether the data is JSON or not. - * - * @return {void} - */ -function errorHandler(id, data, isJSON) { - const promiseHandler = getAndDeleteResponse(id); - if (promiseHandler) { - if (!isJSON) { - promiseHandler.reject(new Error(data)); - } else { - let error; - try { - error = JSON.parse(data); - } catch (err) { - promiseHandler.reject(new TypeError("could not parse error: " + err.message, { cause: err })); - return; - } - - let options = {}; - if (error.cause) { - options.cause = error.cause; - } - - let exception; - switch (error.kind) { - case "ReferenceError": - exception = new ReferenceError(error.message, options); - break; - case "TypeError": - exception = new TypeError(error.message, options); - break; - case "RuntimeError": - exception = new RuntimeError(error.message, options); - break; - default: - exception = new Error(error.message, options); - break; - } - - promiseHandler.reject(exception); - } - } -} - -/** - * Retrieves and removes the response associated with the given ID from the callResponses map. - * - * @param {any} id - The ID of the response to be retrieved and removed. - * - * @returns {any} The response object associated with the given ID. - */ -function getAndDeleteResponse(id) { - const response = callResponses.get(id); - callResponses.delete(id); - return response; -} - -/** - * Collects all required information for a binding call. - * - * @typedef {Object} CallOptions - * @property {number} [methodID] - The numeric ID of the bound method to call. - * @property {string} [methodName] - The fully qualified name of the bound method to call. - * @property {any[]} args - Arguments to be passed into the bound method. - */ - -/** - * Exception class that will be thrown in case the bound method returns an error. - * The value of the {@link RuntimeError#name} property is "RuntimeError". - */ -export class RuntimeError extends Error { - /** - * Constructs a new RuntimeError instance. - * - * @param {string} message - The error message. - * @param {any[]} args - Optional arguments for the Error constructor. - */ - constructor(message, ...args) { - super(message, ...args); - this.name = "RuntimeError"; - } -} - -/** - * Call a bound method according to the given call options. - * - * In case of failure, the returned promise will reject with an exception - * among ReferenceError (unknown method), TypeError (wrong argument count or type), - * {@link RuntimeError} (method returned an error), or other (network or internal errors). - * The exception might have a "cause" field with the value returned - * by the application- or service-level error marshaling functions. - * - * @param {CallOptions} options - A method call descriptor. - * @returns {Promise} - The result of the call. - */ -export function Call(options) { - const id = generateID(); - const doCancel = () => { return cancelCall(type, {"call-id": id}) }; - let queuedCancel = false, callRunning = false; - let p = new Promise((resolve, reject) => { - options["call-id"] = id; - callResponses.set(id, { resolve, reject }); - call(CallBinding, options).then((_) => { - callRunning = true; - if (queuedCancel) { - return doCancel(); - } - }).catch((error) => { - reject(error); - callResponses.delete(id); - }); - }); - p.cancel = () => { - if (callRunning) { - return doCancel(); - } else { - queuedCancel = true; - } - }; - - return p; -} - -/** - * Calls a bound method by name with the specified arguments. - * See {@link Call} for details. - * - * @param {string} methodName - The name of the method in the format 'package.struct.method'. - * @param {any[]} args - The arguments to pass to the method. - * @returns {Promise} The result of the method call. - */ -export function ByName(methodName, ...args) { - return Call({ - methodName, - args - }); -} - -/** - * Calls a method by its numeric ID with the specified arguments. - * See {@link Call} for details. - * - * @param {number} methodID - The ID of the method to call. - * @param {any[]} args - The arguments to pass to the method. - * @return {Promise} - The result of the method call. - */ -export function ByID(methodID, ...args) { - return Call({ - methodID, - args - }); -} diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/calls.ts b/v3/internal/runtime/desktop/@wailsio/runtime/src/calls.ts new file mode 100644 index 000000000..fce698bf4 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/src/calls.ts @@ -0,0 +1,233 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ + +import { CancellablePromise, type CancellablePromiseWithResolvers } from "./cancellable.js"; +import { newRuntimeCaller, objectNames } from "./runtime.js"; +import { nanoid } from "./nanoid.js"; + +// Setup +window._wails = window._wails || {}; +window._wails.callResultHandler = resultHandler; +window._wails.callErrorHandler = errorHandler; + +type PromiseResolvers = Omit, "promise" | "oncancelled"> + +const call = newRuntimeCaller(objectNames.Call); +const cancelCall = newRuntimeCaller(objectNames.CancelCall); +const callResponses = new Map(); + +const CallBinding = 0; +const CancelMethod = 0 + +/** + * Holds all required information for a binding call. + * May provide either a method ID or a method name, but not both. + */ +export type CallOptions = { + /** The numeric ID of the bound method to call. */ + methodID: number; + /** The fully qualified name of the bound method to call. */ + methodName?: never; + /** Arguments to be passed into the bound method. */ + args: any[]; +} | { + /** The numeric ID of the bound method to call. */ + methodID?: never; + /** The fully qualified name of the bound method to call. */ + methodName: string; + /** Arguments to be passed into the bound method. */ + args: any[]; +}; + +/** + * Exception class that will be thrown in case the bound method returns an error. + * The value of the {@link RuntimeError#name} property is "RuntimeError". + */ +export class RuntimeError extends Error { + /** + * Constructs a new RuntimeError instance. + * @param message - The error message. + * @param options - Options to be forwarded to the Error constructor. + */ + constructor(message?: string, options?: ErrorOptions) { + super(message, options); + this.name = "RuntimeError"; + } +} + +/** + * Handles the result of a call request. + * + * @param id - The id of the request to handle the result for. + * @param data - The result data of the request. + * @param isJSON - Indicates whether the data is JSON or not. + */ +function resultHandler(id: string, data: string, isJSON: boolean): void { + const resolvers = getAndDeleteResponse(id); + if (!resolvers) { + return; + } + + if (!data) { + resolvers.resolve(undefined); + } else if (!isJSON) { + resolvers.resolve(data); + } else { + try { + resolvers.resolve(JSON.parse(data)); + } catch (err: any) { + resolvers.reject(new TypeError("could not parse result: " + err.message, { cause: err })); + } + } +} + +/** + * Handles the error from a call request. + * + * @param id - The id of the promise handler. + * @param data - The error data to reject the promise handler with. + * @param isJSON - Indicates whether the data is JSON or not. + */ +function errorHandler(id: string, data: string, isJSON: boolean): void { + const resolvers = getAndDeleteResponse(id); + if (!resolvers) { + return; + } + + if (!isJSON) { + resolvers.reject(new Error(data)); + } else { + let error: any; + try { + error = JSON.parse(data); + } catch (err: any) { + resolvers.reject(new TypeError("could not parse error: " + err.message, { cause: err })); + return; + } + + let options: ErrorOptions = {}; + if (error.cause) { + options.cause = error.cause; + } + + let exception; + switch (error.kind) { + case "ReferenceError": + exception = new ReferenceError(error.message, options); + break; + case "TypeError": + exception = new TypeError(error.message, options); + break; + case "RuntimeError": + exception = new RuntimeError(error.message, options); + break; + default: + exception = new Error(error.message, options); + break; + } + + resolvers.reject(exception); + } +} + +/** + * Retrieves and removes the response associated with the given ID from the callResponses map. + * + * @param id - The ID of the response to be retrieved and removed. + * @returns The response object associated with the given ID, if any. + */ +function getAndDeleteResponse(id: string): PromiseResolvers | undefined { + const response = callResponses.get(id); + callResponses.delete(id); + return response; +} + +/** + * Generates a unique ID using the nanoid library. + * + * @returns A unique ID that does not exist in the callResponses set. + */ +function generateID(): string { + let result; + do { + result = nanoid(); + } while (callResponses.has(result)); + return result; +} + +/** + * Call a bound method according to the given call options. + * + * In case of failure, the returned promise will reject with an exception + * among ReferenceError (unknown method), TypeError (wrong argument count or type), + * {@link RuntimeError} (method returned an error), or other (network or internal errors). + * The exception might have a "cause" field with the value returned + * by the application- or service-level error marshaling functions. + * + * @param options - A method call descriptor. + * @returns The result of the call. + */ +export function Call(options: CallOptions): CancellablePromise { + const id = generateID(); + + const result = CancellablePromise.withResolvers(); + callResponses.set(id, { resolve: result.resolve, reject: result.reject }); + + const request = call(CallBinding, Object.assign({ "call-id": id }, options)); + let running = false; + + request.then(() => { + running = true; + }, (err) => { + callResponses.delete(id); + result.reject(err); + }); + + const cancel = () => { + callResponses.delete(id); + return cancelCall(CancelMethod, {"call-id": id}).catch((err) => { + console.log("Error while requesting binding call cancellation:", err); + }); + }; + + result.oncancelled = () => { + if (running) { + return cancel(); + } else { + return request.then(cancel); + } + }; + + return result.promise; +} + +/** + * Calls a bound method by name with the specified arguments. + * See {@link Call} for details. + * + * @param methodName - The name of the method in the format 'package.struct.method'. + * @param args - The arguments to pass to the method. + * @returns The result of the method call. + */ +export function ByName(methodName: string, ...args: any[]): CancellablePromise { + return Call({ methodName, args }); +} + +/** + * Calls a method by its numeric ID with the specified arguments. + * See {@link Call} for details. + * + * @param methodID - The ID of the method to call. + * @param args - The arguments to pass to the method. + * @return The result of the method call. + */ +export function ByID(methodID: number, ...args: any[]): CancellablePromise { + return Call({ methodID, args }); +} diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/cancellable.ts b/v3/internal/runtime/desktop/@wailsio/runtime/src/cancellable.ts new file mode 100644 index 000000000..8406b78b3 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/src/cancellable.ts @@ -0,0 +1,923 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ + +import isCallable from "./callable.js"; + +/** + * Exception class that will be used as rejection reason + * in case a {@link CancellablePromise} is cancelled successfully. + * + * The value of the {@link name} property is the string `"CancelError"`. + * The value of the {@link cause} property is the cause passed to the cancel method, if any. + */ +export class CancelError extends Error { + /** + * Constructs a new `CancelError` instance. + * @param message - The error message. + * @param options - Options to be forwarded to the Error constructor. + */ + constructor(message?: string, options?: ErrorOptions) { + super(message, options); + this.name = "CancelError"; + } +} + +/** + * Exception class that will be reported as an unhandled rejection + * in case a {@link CancellablePromise} rejects after being cancelled, + * or when the `oncancelled` callback throws or rejects. + * + * The value of the {@link name} property is the string `"CancelledRejectionError"`. + * The value of the {@link cause} property is the reason the promise rejected with. + * + * Because the original promise was cancelled, + * a wrapper promise will be passed to the unhandled rejection listener instead. + * The {@link promise} property holds a reference to the original promise. + */ +export class CancelledRejectionError extends Error { + /** + * Holds a reference to the promise that was cancelled and then rejected. + */ + promise: CancellablePromise; + + /** + * Constructs a new `CancelledRejectionError` instance. + * @param promise - The promise that caused the error originally. + * @param reason - The rejection reason. + * @param info - An optional informative message specifying the circumstances in which the error was thrown. + * Defaults to the string `"Unhandled rejection in cancelled promise."`. + */ + constructor(promise: CancellablePromise, reason?: any, info?: string) { + super((info ?? "Unhandled rejection in cancelled promise.") + " Reason: " + errorMessage(reason), { cause: reason }); + this.promise = promise; + this.name = "CancelledRejectionError"; + } +} + +type CancellablePromiseResolver = (value: T | PromiseLike | CancellablePromiseLike) => void; +type CancellablePromiseRejector = (reason?: any) => void; +type CancellablePromiseCanceller = (cause?: any) => void | PromiseLike; +type CancellablePromiseExecutor = (resolve: CancellablePromiseResolver, reject: CancellablePromiseRejector) => void; + +export interface CancellablePromiseLike { + then(onfulfilled?: ((value: T) => TResult1 | PromiseLike | CancellablePromiseLike) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike | CancellablePromiseLike) | undefined | null): CancellablePromiseLike; + cancel(cause?: any): void; +} + +/** + * Wraps a cancellable promise along with its resolution methods. + * The `oncancelled` field will be null initially but may be set to provide a custom cancellation function. + */ +export interface CancellablePromiseWithResolvers { + promise: CancellablePromise; + resolve: CancellablePromiseResolver; + reject: CancellablePromiseRejector; + oncancelled: CancellablePromiseCanceller | null; +} + +interface CancellablePromiseState { + readonly root: CancellablePromiseState; + resolving: boolean; + settled: boolean; + reason?: CancelError; +} + +// Private field names. +const barrierSym = Symbol("barrier"); +const cancelImplSym = Symbol("cancelImpl"); +const species = Symbol.species ?? Symbol("speciesPolyfill"); + +/** + * A promise with an attached method for cancelling long-running operations (see {@link CancellablePromise#cancel}). + * Cancellation can optionally be bound to an {@link AbortSignal} + * for better composability (see {@link CancellablePromise#cancelOn}). + * + * Cancelling a pending promise will result in an immediate rejection + * with an instance of {@link CancelError} as reason, + * but whoever started the promise will be responsible + * for actually aborting the underlying operation. + * To this purpose, the constructor and all chaining methods + * accept optional cancellation callbacks. + * + * If a `CancellablePromise` still resolves after having been cancelled, + * the result will be discarded. If it rejects, the reason + * will be reported as an unhandled rejection, + * wrapped in a {@link CancelledRejectionError} instance. + * To facilitate the handling of cancellation requests, + * cancelled `CancellablePromise`s will _not_ report unhandled `CancelError`s + * whose `cause` field is the same as the one with which the current promise was cancelled. + * + * All usual promise methods are defined and return a `CancellablePromise` + * whose cancel method will cancel the parent operation as well, propagating the cancellation reason + * upwards through promise chains. + * Conversely, cancelling a promise will not automatically cancel dependent promises downstream: + * ```ts + * let root = new CancellablePromise((resolve, reject) => { ... }); + * let child1 = root.then(() => { ... }); + * let child2 = child1.then(() => { ... }); + * let child3 = root.catch(() => { ... }); + * child1.cancel(); // Cancels child1 and root, but not child2 or child3 + * ``` + * Cancelling a promise that has already settled is safe and has no consequence. + * + * The `cancel` method returns a promise that _always fulfills_ + * after the whole chain has processed the cancel request + * and all attached callbacks up to that moment have run. + * + * All ES2024 promise methods (static and instance) are defined on CancellablePromise, + * but actual availability may vary with OS/webview version. + * + * In line with the proposal at https://github.com/tc39/proposal-rm-builtin-subclassing, + * `CancellablePromise` does not support transparent subclassing. + * Extenders should take care to provide their own method implementations. + * This might be reconsidered in case the proposal is retired. + * + * CancellablePromise is a wrapper around the DOM Promise object + * and is compliant with the [Promises/A+ specification](https://promisesaplus.com/) + * (it passes the [compliance suite](https://github.com/promises-aplus/promises-tests)) + * if so is the underlying implementation. + */ +export class CancellablePromise extends Promise implements PromiseLike, CancellablePromiseLike { + // Private fields. + /** @internal */ + private [barrierSym]!: Partial> | null; + /** @internal */ + private readonly [cancelImplSym]!: (reason: CancelError) => void | PromiseLike; + + /** + * Creates a new `CancellablePromise`. + * + * @param executor - A callback used to initialize the promise. This callback is passed two arguments: + * a `resolve` callback used to resolve the promise with a value + * or the result of another promise (possibly cancellable), + * and a `reject` callback used to reject the promise with a provided reason or error. + * If the value provided to the `resolve` callback is a thenable _and_ cancellable object + * (it has a `then` _and_ a `cancel` method), + * cancellation requests will be forwarded to that object and the oncancelled will not be invoked anymore. + * If any one of the two callbacks is called _after_ the promise has been cancelled, + * the provided values will be cancelled and resolved as usual, + * but their results will be discarded. + * However, if the resolution process ultimately ends up in a rejection + * that is not due to cancellation, the rejection reason + * will be wrapped in a {@link CancelledRejectionError} + * and bubbled up as an unhandled rejection. + * @param oncancelled - It is the caller's responsibility to ensure that any operation + * started by the executor is properly halted upon cancellation. + * This optional callback can be used to that purpose. + * It will be called _synchronously_ with a cancellation cause + * when cancellation is requested, _after_ the promise has already rejected + * with a {@link CancelError}, but _before_ + * any {@link then}/{@link catch}/{@link finally} callback runs. + * If the callback returns a thenable, the promise returned from {@link cancel} + * will only fulfill after the former has settled. + * Unhandled exceptions or rejections from the callback will be wrapped + * in a {@link CancelledRejectionError} and bubbled up as unhandled rejections. + * If the `resolve` callback is called before cancellation with a cancellable promise, + * cancellation requests on this promise will be diverted to that promise, + * and the original `oncancelled` callback will be discarded. + */ + constructor(executor: CancellablePromiseExecutor, oncancelled?: CancellablePromiseCanceller) { + let resolve!: (value: T | PromiseLike) => void; + let reject!: (reason?: any) => void; + super((res, rej) => { resolve = res; reject = rej; }); + + if ((this.constructor as any)[species] !== Promise) { + throw new TypeError("CancellablePromise does not support transparent subclassing. Please refrain from overriding the [Symbol.species] static property."); + } + + let promise: CancellablePromiseWithResolvers = { + promise: this, + resolve, + reject, + get oncancelled() { return oncancelled ?? null; }, + set oncancelled(cb) { oncancelled = cb ?? undefined; } + }; + + const state: CancellablePromiseState = { + get root() { return state; }, + resolving: false, + settled: false + }; + + // Setup cancellation system. + void Object.defineProperties(this, { + [barrierSym]: { + configurable: false, + enumerable: false, + writable: true, + value: null + }, + [cancelImplSym]: { + configurable: false, + enumerable: false, + writable: false, + value: cancellerFor(promise, state) + } + }); + + // Run the actual executor. + const rejector = rejectorFor(promise, state); + try { + executor(resolverFor(promise, state), rejector); + } catch (err) { + if (state.resolving) { + console.log("Unhandled exception in CancellablePromise executor.", err); + } else { + rejector(err); + } + } + } + + /** + * Cancels immediately the execution of the operation associated with this promise. + * The promise rejects with a {@link CancelError} instance as reason, + * with the {@link CancelError#cause} property set to the given argument, if any. + * + * Has no effect if called after the promise has already settled; + * repeated calls in particular are safe, but only the first one + * will set the cancellation cause. + * + * The `CancelError` exception _need not_ be handled explicitly _on the promises that are being cancelled:_ + * cancelling a promise with no attached rejection handler does not trigger an unhandled rejection event. + * Therefore, the following idioms are all equally correct: + * ```ts + * new CancellablePromise((resolve, reject) => { ... }).cancel(); + * new CancellablePromise((resolve, reject) => { ... }).then(...).cancel(); + * new CancellablePromise((resolve, reject) => { ... }).then(...).catch(...).cancel(); + * ``` + * Whenever some cancelled promise in a chain rejects with a `CancelError` + * with the same cancellation cause as itself, the error will be discarded silently. + * However, the `CancelError` _will still be delivered_ to all attached rejection handlers + * added by {@link then} and related methods: + * ```ts + * let cancellable = new CancellablePromise((resolve, reject) => { ... }); + * cancellable.then(() => { ... }).catch(console.log); + * cancellable.cancel(); // A CancelError is printed to the console. + * ``` + * If the `CancelError` is not handled downstream by the time it reaches + * a _non-cancelled_ promise, it _will_ trigger an unhandled rejection event, + * just like normal rejections would: + * ```ts + * let cancellable = new CancellablePromise((resolve, reject) => { ... }); + * let chained = cancellable.then(() => { ... }).then(() => { ... }); // No catch... + * cancellable.cancel(); // Unhandled rejection event on chained! + * ``` + * Therefore, it is important to either cancel whole promise chains from their tail, + * as shown in the correct idioms above, or take care of handling errors everywhere. + * + * @returns A cancellable promise that _fulfills_ after the cancel callback (if any) + * and all handlers attached up to the call to cancel have run. + * If the cancel callback returns a thenable, the promise returned by `cancel` + * will also wait for that thenable to settle. + * This enables callers to wait for the cancelled operation to terminate + * without being forced to handle potential errors at the call site. + * ```ts + * cancellable.cancel().then(() => { + * // Cleanup finished, it's safe to do something else. + * }, (err) => { + * // Unreachable: the promise returned from cancel will never reject. + * }); + * ``` + * Note that the returned promise will _not_ handle implicitly any rejection + * that might have occurred already in the cancelled chain. + * It will just track whether registered handlers have been executed or not. + * Therefore, unhandled rejections will never be silently handled by calling cancel. + */ + cancel(cause?: any): CancellablePromise { + return new CancellablePromise((resolve) => { + Promise.allSettled([ + this[cancelImplSym](new CancelError("Promise cancelled.", { cause })), + currentBarrier(this) + ]).then(() => resolve(), () => resolve()); + }); + } + + /** + * Binds promise cancellation to the abort event of the given {@link AbortSignal}. + * If the signal has already aborted, the promise will be cancelled immediately. + * When either condition is verified, the cancellation cause will be set + * to the signal's abort reason (see {@link AbortSignal#reason}). + * + * Has no effect if called (or if the signal aborts) _after_ the promise has already settled. + * Only the first signal to abort will set the cancellation cause. + * + * For more details about the cancellation process, + * see {@link cancel} and the `CancellablePromise` constructor. + * + * This method enables `await`ing cancellable promises without having + * to store them for future cancellation, e.g.: + * ```ts + * await longRunningOperation().cancelOn(signal); + * ``` + * instead of: + * ```ts + * let promiseToBeCancelled = longRunningOperation(); + * await promiseToBeCancelled; + * ``` + * + * @returns This promise, for method chaining. + */ + cancelOn(signal: AbortSignal): CancellablePromise { + if (signal.aborted) { + void this.cancel(signal.reason) + } else { + signal.addEventListener('abort', () => void this.cancel(signal.reason), {capture: true}); + } + + return this; + } + + /** + * Attaches callbacks for the resolution and/or rejection of the `CancellablePromise`. + * + * The optional `oncancelled` argument will be invoked when the returned promise is cancelled, + * with the same semantics as the `oncancelled` argument of the constructor. + * When the parent promise rejects or is cancelled, the `onrejected` callback will run, + * _even after the returned promise has been cancelled:_ + * in that case, should it reject or throw, the reason will be wrapped + * in a {@link CancelledRejectionError} and bubbled up as an unhandled rejection. + * + * @param onfulfilled The callback to execute when the Promise is resolved. + * @param onrejected The callback to execute when the Promise is rejected. + * @returns A `CancellablePromise` for the completion of whichever callback is executed. + * The returned promise is hooked up to propagate cancellation requests up the chain, but not down: + * + * - if the parent promise is cancelled, the `onrejected` handler will be invoked with a `CancelError` + * and the returned promise _will resolve regularly_ with its result; + * - conversely, if the returned promise is cancelled, _the parent promise is cancelled too;_ + * the `onrejected` handler will still be invoked with the parent's `CancelError`, + * but its result will be discarded + * and the returned promise will reject with a `CancelError` as well. + * + * The promise returned from {@link cancel} will fulfill only after all attached handlers + * up the entire promise chain have been run. + * + * If either callback returns a cancellable promise, + * cancellation requests will be diverted to it, + * and the specified `oncancelled` callback will be discarded. + */ + then(onfulfilled?: ((value: T) => TResult1 | PromiseLike | CancellablePromiseLike) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike | CancellablePromiseLike) | undefined | null, oncancelled?: CancellablePromiseCanceller): CancellablePromise { + if (!(this instanceof CancellablePromise)) { + throw new TypeError("CancellablePromise.prototype.then called on an invalid object."); + } + + // NOTE: TypeScript's built-in type for then is broken, + // as it allows specifying an arbitrary TResult1 != T even when onfulfilled is not a function. + // We cannot fix it if we want to CancellablePromise to implement PromiseLike. + + if (!isCallable(onfulfilled)) { onfulfilled = identity as any; } + if (!isCallable(onrejected)) { onrejected = thrower; } + + if (onfulfilled === identity && onrejected == thrower) { + // Shortcut for trivial arguments. + return new CancellablePromise((resolve) => resolve(this as any)); + } + + const barrier: Partial> = {}; + this[barrierSym] = barrier; + + return new CancellablePromise((resolve, reject) => { + void promiseThen.call(this, + (value) => { + if (this[barrierSym] === barrier) { this[barrierSym] = null; } + barrier.resolve?.(); + + try { + resolve(onfulfilled!(value)); + } catch (err) { + reject(err); + } + }, + (reason?) => { + if (this[barrierSym] === barrier) { this[barrierSym] = null; } + barrier.resolve?.(); + + try { + resolve(onrejected!(reason)); + } catch (err) { + reject(err); + } + } + ); + }, async (cause?) => { + //cancelled = true; + try { + return oncancelled?.(cause); + } finally { + await this.cancel(cause); + } + }); + } + + /** + * Attaches a callback for only the rejection of the Promise. + * + * The optional `oncancelled` argument will be invoked when the returned promise is cancelled, + * with the same semantics as the `oncancelled` argument of the constructor. + * When the parent promise rejects or is cancelled, the `onrejected` callback will run, + * _even after the returned promise has been cancelled:_ + * in that case, should it reject or throw, the reason will be wrapped + * in a {@link CancelledRejectionError} and bubbled up as an unhandled rejection. + * + * It is equivalent to + * ```ts + * cancellablePromise.then(undefined, onrejected, oncancelled); + * ``` + * and the same caveats apply. + * + * @returns A Promise for the completion of the callback. + * Cancellation requests on the returned promise + * will propagate up the chain to the parent promise, + * but not in the other direction. + * + * The promise returned from {@link cancel} will fulfill only after all attached handlers + * up the entire promise chain have been run. + * + * If `onrejected` returns a cancellable promise, + * cancellation requests will be diverted to it, + * and the specified `oncancelled` callback will be discarded. + * See {@link then} for more details. + */ + catch(onrejected?: ((reason: any) => (PromiseLike | TResult)) | undefined | null, oncancelled?: CancellablePromiseCanceller): CancellablePromise { + return this.then(undefined, onrejected, oncancelled); + } + + /** + * Attaches a callback that is invoked when the CancellablePromise is settled (fulfilled or rejected). The + * resolved value cannot be accessed or modified from the callback. + * The returned promise will settle in the same state as the original one + * after the provided callback has completed execution, + * unless the callback throws or returns a rejecting promise, + * in which case the returned promise will reject as well. + * + * The optional `oncancelled` argument will be invoked when the returned promise is cancelled, + * with the same semantics as the `oncancelled` argument of the constructor. + * Once the parent promise settles, the `onfinally` callback will run, + * _even after the returned promise has been cancelled:_ + * in that case, should it reject or throw, the reason will be wrapped + * in a {@link CancelledRejectionError} and bubbled up as an unhandled rejection. + * + * This method is implemented in terms of {@link then} and the same caveats apply. + * It is polyfilled, hence available in every OS/webview version. + * + * @returns A Promise for the completion of the callback. + * Cancellation requests on the returned promise + * will propagate up the chain to the parent promise, + * but not in the other direction. + * + * The promise returned from {@link cancel} will fulfill only after all attached handlers + * up the entire promise chain have been run. + * + * If `onfinally` returns a cancellable promise, + * cancellation requests will be diverted to it, + * and the specified `oncancelled` callback will be discarded. + * See {@link then} for more details. + */ + finally(onfinally?: (() => void) | undefined | null, oncancelled?: CancellablePromiseCanceller): CancellablePromise { + if (!(this instanceof CancellablePromise)) { + throw new TypeError("CancellablePromise.prototype.finally called on an invalid object."); + } + + if (!isCallable(onfinally)) { + return this.then(onfinally, onfinally, oncancelled); + } + + return this.then( + (value) => CancellablePromise.resolve(onfinally()).then(() => value), + (reason?) => CancellablePromise.resolve(onfinally()).then(() => { throw reason; }), + oncancelled, + ); + } + + /** + * We use the `[Symbol.species]` static property, if available, + * to disable the built-in automatic subclassing features from {@link Promise}. + * It is critical for performance reasons that extenders do not override this. + * Once the proposal at https://github.com/tc39/proposal-rm-builtin-subclassing + * is either accepted or retired, this implementation will have to be revised accordingly. + * + * @ignore + * @internal + */ + static get [species]() { + return Promise; + } + + /** + * Creates a CancellablePromise that is resolved with an array of results + * when all of the provided Promises resolve, or rejected when any Promise is rejected. + * + * Every one of the provided objects that is a thenable _and_ cancellable object + * will be cancelled when the returned promise is cancelled, with the same cause. + * + * @group Static Methods + */ + static all(values: Iterable>): CancellablePromise[]>; + static all(values: T): CancellablePromise<{ -readonly [P in keyof T]: Awaited; }>; + static all | ArrayLike>(values: T): CancellablePromise { + let collected = Array.from(values); + return collected.length === 0 + ? CancellablePromise.resolve(collected) + : new CancellablePromise((resolve, reject) => { + void Promise.all(collected).then(resolve, reject); + }, allCanceller(collected)); + } + + /** + * Creates a CancellablePromise that is resolved with an array of results + * when all of the provided Promises resolve or reject. + * + * Every one of the provided objects that is a thenable _and_ cancellable object + * will be cancelled when the returned promise is cancelled, with the same cause. + * + * @group Static Methods + */ + static allSettled(values: Iterable>): CancellablePromise>[]>; + static allSettled(values: T): CancellablePromise<{ -readonly [P in keyof T]: PromiseSettledResult>; }>; + static allSettled | ArrayLike>(values: T): CancellablePromise { + let collected = Array.from(values); + return collected.length === 0 + ? CancellablePromise.resolve(collected) + : new CancellablePromise((resolve, reject) => { + void Promise.allSettled(collected).then(resolve, reject); + }, allCanceller(collected)); + } + + /** + * The any function returns a promise that is fulfilled by the first given promise to be fulfilled, + * or rejected with an AggregateError containing an array of rejection reasons + * if all of the given promises are rejected. + * It resolves all elements of the passed iterable to promises as it runs this algorithm. + * + * Every one of the provided objects that is a thenable _and_ cancellable object + * will be cancelled when the returned promise is cancelled, with the same cause. + * + * @group Static Methods + */ + static any(values: Iterable>): CancellablePromise>; + static any(values: T): CancellablePromise>; + static any | ArrayLike>(values: T): CancellablePromise { + let collected = Array.from(values); + return collected.length === 0 + ? CancellablePromise.resolve(collected) + : new CancellablePromise((resolve, reject) => { + void Promise.any(collected).then(resolve, reject); + }, allCanceller(collected)); + } + + /** + * Creates a Promise that is resolved or rejected when any of the provided Promises are resolved or rejected. + * + * Every one of the provided objects that is a thenable _and_ cancellable object + * will be cancelled when the returned promise is cancelled, with the same cause. + * + * @group Static Methods + */ + static race(values: Iterable>): CancellablePromise>; + static race(values: T): CancellablePromise>; + static race | ArrayLike>(values: T): CancellablePromise { + let collected = Array.from(values); + return new CancellablePromise((resolve, reject) => { + void Promise.race(collected).then(resolve, reject); + }, allCanceller(collected)); + } + + /** + * Creates a new cancelled CancellablePromise for the provided cause. + * + * @group Static Methods + */ + static cancel(cause?: any): CancellablePromise { + const p = new CancellablePromise(() => {}); + p.cancel(cause); + return p; + } + + /** + * Creates a new CancellablePromise that cancels + * after the specified timeout, with the provided cause. + * + * If the {@link AbortSignal.timeout} factory method is available, + * it is used to base the timeout on _active_ time rather than _elapsed_ time. + * Otherwise, `timeout` falls back to {@link setTimeout}. + * + * @group Static Methods + */ + static timeout(milliseconds: number, cause?: any): CancellablePromise { + const promise = new CancellablePromise(() => {}); + if (AbortSignal && typeof AbortSignal === 'function' && AbortSignal.timeout && typeof AbortSignal.timeout === 'function') { + AbortSignal.timeout(milliseconds).addEventListener('abort', () => void promise.cancel(cause)); + } else { + setTimeout(() => void promise.cancel(cause), milliseconds); + } + return promise; + } + + /** + * Creates a new CancellablePromise that resolves after the specified timeout. + * The returned promise can be cancelled without consequences. + * + * @group Static Methods + */ + static sleep(milliseconds: number): CancellablePromise; + /** + * Creates a new CancellablePromise that resolves after + * the specified timeout, with the provided value. + * The returned promise can be cancelled without consequences. + * + * @group Static Methods + */ + static sleep(milliseconds: number, value: T): CancellablePromise; + static sleep(milliseconds: number, value?: T): CancellablePromise { + return new CancellablePromise((resolve) => { + setTimeout(() => resolve(value!), milliseconds); + }); + } + + /** + * Creates a new rejected CancellablePromise for the provided reason. + * + * @group Static Methods + */ + static reject(reason?: any): CancellablePromise { + return new CancellablePromise((_, reject) => reject(reason)); + } + + /** + * Creates a new resolved CancellablePromise. + * + * @group Static Methods + */ + static resolve(): CancellablePromise; + /** + * Creates a new resolved CancellablePromise for the provided value. + * + * @group Static Methods + */ + static resolve(value: T): CancellablePromise>; + /** + * Creates a new resolved CancellablePromise for the provided value. + * + * @group Static Methods + */ + static resolve(value: T | PromiseLike): CancellablePromise>; + static resolve(value?: T | PromiseLike): CancellablePromise> { + if (value instanceof CancellablePromise) { + // Optimise for cancellable promises. + return value; + } + return new CancellablePromise((resolve) => resolve(value)); + } + + /** + * Creates a new CancellablePromise and returns it in an object, along with its resolve and reject functions + * and a getter/setter for the cancellation callback. + * + * This method is polyfilled, hence available in every OS/webview version. + * + * @group Static Methods + */ + static withResolvers(): CancellablePromiseWithResolvers { + let result: CancellablePromiseWithResolvers = { oncancelled: null } as any; + result.promise = new CancellablePromise((resolve, reject) => { + result.resolve = resolve; + result.reject = reject; + }, (cause?: any) => { result.oncancelled?.(cause); }); + return result; + } +} + +/** + * Returns a callback that implements the cancellation algorithm for the given cancellable promise. + * The promise returned from the resulting function does not reject. + */ +function cancellerFor(promise: CancellablePromiseWithResolvers, state: CancellablePromiseState) { + let cancellationPromise: void | PromiseLike = undefined; + + return (reason: CancelError): void | PromiseLike => { + if (!state.settled) { + state.settled = true; + state.reason = reason; + promise.reject(reason); + + // Attach an error handler that ignores this specific rejection reason and nothing else. + // In theory, a sane underlying implementation at this point + // should always reject with our cancellation reason, + // hence the handler will never throw. + void promiseThen.call(promise.promise, undefined, (err) => { + if (err !== reason) { + throw err; + } + }); + } + + // If reason is not set, the promise resolved regularly, hence we must not call oncancelled. + // If oncancelled is unset, no need to go any further. + if (!state.reason || !promise.oncancelled) { return; } + + cancellationPromise = new Promise((resolve) => { + try { + resolve(promise.oncancelled!(state.reason!.cause)); + } catch (err) { + Promise.reject(new CancelledRejectionError(promise.promise, err, "Unhandled exception in oncancelled callback.")); + } + }); + cancellationPromise.then(undefined, (reason?) => { + throw new CancelledRejectionError(promise.promise, reason, "Unhandled rejection in oncancelled callback."); + }); + + // Unset oncancelled to prevent repeated calls. + promise.oncancelled = null; + + return cancellationPromise; + } +} + +/** + * Returns a callback that implements the resolution algorithm for the given cancellable promise. + */ +function resolverFor(promise: CancellablePromiseWithResolvers, state: CancellablePromiseState): CancellablePromiseResolver { + return (value) => { + if (state.resolving) { return; } + state.resolving = true; + + if (value === promise.promise) { + if (state.settled) { return; } + state.settled = true; + promise.reject(new TypeError("A promise cannot be resolved with itself.")); + return; + } + + if (value != null && (typeof value === 'object' || typeof value === 'function')) { + let then: any; + try { + then = (value as any).then; + } catch (err) { + state.settled = true; + promise.reject(err); + return; + } + + if (isCallable(then)) { + try { + let cancel = (value as any).cancel; + if (isCallable(cancel)) { + const oncancelled = (cause?: any) => { + Reflect.apply(cancel, value, [cause]); + }; + if (state.reason) { + // If already cancelled, propagate cancellation. + // The promise returned from the canceller algorithm does not reject + // so it can be discarded safely. + void cancellerFor({ ...promise, oncancelled }, state)(state.reason); + } else { + promise.oncancelled = oncancelled; + } + } + } catch {} + + const newState: CancellablePromiseState = { + root: state.root, + resolving: false, + get settled() { return this.root.settled }, + set settled(value) { this.root.settled = value; }, + get reason() { return this.root.reason } + }; + + const rejector = rejectorFor(promise, newState); + try { + Reflect.apply(then, value, [resolverFor(promise, newState), rejector]); + } catch (err) { + rejector(err); + } + return; // IMPORTANT! + } + } + + if (state.settled) { return; } + state.settled = true; + promise.resolve(value); + }; +} + +/** + * Returns a callback that implements the rejection algorithm for the given cancellable promise. + */ +function rejectorFor(promise: CancellablePromiseWithResolvers, state: CancellablePromiseState): CancellablePromiseRejector { + return (reason?) => { + if (state.resolving) { return; } + state.resolving = true; + + if (state.settled) { + try { + if (reason instanceof CancelError && state.reason instanceof CancelError && Object.is(reason.cause, state.reason.cause)) { + // Swallow late rejections that are CancelErrors whose cancellation cause is the same as ours. + return; + } + } catch {} + + void Promise.reject(new CancelledRejectionError(promise.promise, reason)); + } else { + state.settled = true; + promise.reject(reason); + } + } +} + +/** + * Returns a callback that cancels all values in an iterable that look like cancellable thenables. + */ +function allCanceller(values: Iterable): CancellablePromiseCanceller { + return (cause?) => { + for (const value of values) { + try { + if (isCallable(value.then)) { + let cancel = value.cancel; + if (isCallable(cancel)) { + Reflect.apply(cancel, value, [cause]); + } + } + } catch {} + } + } +} + +/** + * Returns its argument. + */ +function identity(x: T): T { + return x; +} + +/** + * Throws its argument. + */ +function thrower(reason?: any): never { + throw reason; +} + +/** + * Attempts various strategies to convert an error to a string. + */ +function errorMessage(err: any): string { + try { + if (err instanceof Error || typeof err !== 'object' || err.toString !== Object.prototype.toString) { + return "" + err; + } + } catch {} + + try { + return JSON.stringify(err); + } catch {} + + try { + return Object.prototype.toString.call(err); + } catch {} + + return ""; +} + +/** + * Gets the current barrier promise for the given cancellable promise. If necessary, initialises the barrier. + */ +function currentBarrier(promise: CancellablePromise): Promise { + let pwr: Partial> = promise[barrierSym] ?? {}; + if (!('promise' in pwr)) { + Object.assign(pwr, promiseWithResolvers()); + } + if (promise[barrierSym] == null) { + pwr.resolve!(); + promise[barrierSym] = pwr; + } + return pwr.promise!; +} + +// Stop sneaky people from breaking the barrier mechanism. +const promiseThen = Promise.prototype.then; +Promise.prototype.then = function(...args) { + if (this instanceof CancellablePromise) { + return this.then(...args); + } else { + return Reflect.apply(promiseThen, this, args); + } +} + +// Polyfill Promise.withResolvers. +let promiseWithResolvers = Promise.withResolvers; +if (promiseWithResolvers && typeof promiseWithResolvers === 'function') { + promiseWithResolvers = promiseWithResolvers.bind(Promise); +} else { + promiseWithResolvers = function (): PromiseWithResolvers { + let resolve!: (value: T | PromiseLike) => void; + let reject!: (reason?: any) => void; + const promise = new Promise((res, rej) => { resolve = res; reject = rej; }); + return { promise, resolve, reject }; + } +} \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/clipboard.js b/v3/internal/runtime/desktop/@wailsio/runtime/src/clipboard.js deleted file mode 100644 index 15cfc518a..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/src/clipboard.js +++ /dev/null @@ -1,35 +0,0 @@ -/* - _ __ _ __ -| | / /___ _(_) /____ -| | /| / / __ `/ / / ___/ -| |/ |/ / /_/ / / (__ ) -|__/|__/\__,_/_/_/____/ -The electron alternative for Go -(c) Lea Anthony 2019-present -*/ - -/* jshint esversion: 9 */ - -import {newRuntimeCallerWithID, objectNames} from "./runtime"; - -const call = newRuntimeCallerWithID(objectNames.Clipboard, ''); -const ClipboardSetText = 0; -const ClipboardText = 1; - -/** - * Sets the text to the Clipboard. - * - * @param {string} text - The text to be set to the Clipboard. - * @return {Promise} - A Promise that resolves when the operation is successful. - */ -export function SetText(text) { - return call(ClipboardSetText, {text}); -} - -/** - * Get the Clipboard text - * @returns {Promise} A promise that resolves with the text from the Clipboard. - */ -export function Text() { - return call(ClipboardText); -} diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/clipboard.ts b/v3/internal/runtime/desktop/@wailsio/runtime/src/clipboard.ts new file mode 100644 index 000000000..a6f2f1985 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/src/clipboard.ts @@ -0,0 +1,35 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ + +import {newRuntimeCaller, objectNames} from "./runtime.js"; + +const call = newRuntimeCaller(objectNames.Clipboard); + +const ClipboardSetText = 0; +const ClipboardText = 1; + +/** + * Sets the text to the Clipboard. + * + * @param text - The text to be set to the Clipboard. + * @return A Promise that resolves when the operation is successful. + */ +export function SetText(text: string): Promise { + return call(ClipboardSetText, {text}); +} + +/** + * Get the Clipboard text + * + * @returns A promise that resolves with the text from the Clipboard. + */ +export function Text(): Promise { + return call(ClipboardText); +} diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/contextmenu.js b/v3/internal/runtime/desktop/@wailsio/runtime/src/contextmenu.ts similarity index 55% rename from v3/internal/runtime/desktop/@wailsio/runtime/src/contextmenu.js rename to v3/internal/runtime/desktop/@wailsio/runtime/src/contextmenu.ts index ab0749901..50ab188f2 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/src/contextmenu.js +++ b/v3/internal/runtime/desktop/@wailsio/runtime/src/contextmenu.ts @@ -8,30 +8,38 @@ The electron alternative for Go (c) Lea Anthony 2019-present */ -/* jshint esversion: 9 */ - -import {newRuntimeCallerWithID, objectNames} from "./runtime"; -import {IsDebug} from "./system"; +import { newRuntimeCaller, objectNames } from "./runtime.js"; +import { IsDebug } from "./system.js"; // setup window.addEventListener('contextmenu', contextMenuHandler); -const call = newRuntimeCallerWithID(objectNames.ContextMenu, ''); +const call = newRuntimeCaller(objectNames.ContextMenu); + const ContextMenuOpen = 0; -function openContextMenu(id, x, y, data) { +function openContextMenu(id: string, x: number, y: number, data: any): void { void call(ContextMenuOpen, {id, x, y, data}); } -function contextMenuHandler(event) { +function contextMenuHandler(event: MouseEvent) { + let target: HTMLElement; + + if (event.target instanceof HTMLElement) { + target = event.target; + } else if (!(event.target instanceof HTMLElement) && event.target instanceof Node) { + target = event.target.parentElement ?? document.body; + } else { + target = document.body; + } + // Check for custom context menu - let element = event.target; - let customContextMenu = window.getComputedStyle(element).getPropertyValue("--custom-contextmenu"); - customContextMenu = customContextMenu ? customContextMenu.trim() : ""; + let customContextMenu = window.getComputedStyle(target).getPropertyValue("--custom-contextmenu").trim(); + if (customContextMenu) { event.preventDefault(); - let customContextMenuData = window.getComputedStyle(element).getPropertyValue("--custom-contextmenu-data"); - openContextMenu(customContextMenu, event.clientX, event.clientY, customContextMenuData); + let data = window.getComputedStyle(target).getPropertyValue("--custom-contextmenu-data"); + openContextMenu(customContextMenu, event.clientX, event.clientY, data); return } @@ -46,47 +54,56 @@ function contextMenuHandler(event) { This rule is inherited like normal CSS rules, so nesting works as expected */ -function processDefaultContextMenu(event) { - +function processDefaultContextMenu(event: MouseEvent) { // Debug builds always show the menu if (IsDebug()) { return; } + let target: HTMLElement; + + if (event.target instanceof HTMLElement) { + target = event.target; + } else if (!(event.target instanceof HTMLElement) && event.target instanceof Node) { + target = event.target.parentElement ?? document.body; + } else { + target = document.body; + } + // Process default context menu - const element = event.target; - const computedStyle = window.getComputedStyle(element); - const defaultContextMenuAction = computedStyle.getPropertyValue("--default-contextmenu").trim(); - switch (defaultContextMenuAction) { + switch (window.getComputedStyle(target).getPropertyValue("--default-contextmenu").trim()) { case "show": return; + case "hide": event.preventDefault(); return; + default: // Check if contentEditable is true - if (element.isContentEditable) { + if (target.isContentEditable) { return; } // Check if text has been selected const selection = window.getSelection(); - const hasSelection = (selection.toString().length > 0) + const hasSelection = selection && selection.toString().length > 0; if (hasSelection) { for (let i = 0; i < selection.rangeCount; i++) { const range = selection.getRangeAt(i); const rects = range.getClientRects(); for (let j = 0; j < rects.length; j++) { const rect = rects[j]; - if (document.elementFromPoint(rect.left, rect.top) === element) { + if (document.elementFromPoint(rect.left, rect.top) === target) { return; } } } } - // Check if tagname is input or textarea - if (element.tagName === "INPUT" || element.tagName === "TEXTAREA") { - if (hasSelection || (!element.readOnly && !element.disabled)) { + + // Check if tag is input or textarea. + if (target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement) { + if (hasSelection || (!target.readOnly && !target.disabled)) { return; } } diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/create.js b/v3/internal/runtime/desktop/@wailsio/runtime/src/create.ts similarity index 69% rename from v3/internal/runtime/desktop/@wailsio/runtime/src/create.js rename to v3/internal/runtime/desktop/@wailsio/runtime/src/create.ts index 6967eef09..dc3db4aad 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/src/create.js +++ b/v3/internal/runtime/desktop/@wailsio/runtime/src/create.ts @@ -8,37 +8,27 @@ The electron alternative for Go (c) Lea Anthony 2019-present */ -/* jshint esversion: 9 */ - /** * Any is a dummy creation function for simple or unknown types. - * @template T - * @param {any} source - * @returns {T} */ -export function Any(source) { - return /** @type {T} */(source); +export function Any(source: any): T { + return source; } /** * ByteSlice is a creation function that replaces * null strings with empty strings. - * @param {any} source - * @returns {string} */ -export function ByteSlice(source) { - return /** @type {any} */((source == null) ? "" : source); +export function ByteSlice(source: any): string { + return ((source == null) ? "" : source); } /** * Array takes a creation function for an arbitrary type * and returns an in-place creation function for an array * whose elements are of that type. - * @template T - * @param {(source: any) => T} element - * @returns {(source: any) => T[]} */ -export function Array(element) { +export function Array(element: (source: any) => T): (source: any) => T[] { if (element === Any) { return (source) => (source === null ? [] : source); } @@ -58,12 +48,8 @@ export function Array(element) { * Map takes creation functions for two arbitrary types * and returns an in-place creation function for an object * whose keys and values are of those types. - * @template K, V - * @param {(source: any) => K} key - * @param {(source: any) => V} value - * @returns {(source: any) => { [_: K]: V }} */ -export function Map(key, value) { +export function Map(key: (source: any) => string, value: (source: any) => V): (source: any) => Record { if (value === Any) { return (source) => (source === null ? {} : source); } @@ -82,11 +68,8 @@ export function Map(key, value) { /** * Nullable takes a creation function for an arbitrary type * and returns a creation function for a nullable value of that type. - * @template T - * @param {(source: any) => T} element - * @returns {(source: any) => (T | null)} */ -export function Nullable(element) { +export function Nullable(element: (source: any) => T): (source: any) => (T | null) { if (element === Any) { return Any; } @@ -97,12 +80,11 @@ export function Nullable(element) { /** * Struct takes an object mapping field names to creation functions * and returns an in-place creation function for a struct. - * @template {{ [_: string]: ((source: any) => any) }} T - * @template {{ [Key in keyof T]?: ReturnType }} U - * @param {T} createField - * @returns {(source: any) => U} */ -export function Struct(createField) { +export function Struct< + T extends { [_: string]: ((source: any) => any) }, + U extends { [Key in keyof T]?: ReturnType } +>(createField: T): (source: any) => U { let allAny = true; for (const name in createField) { if (createField[name] !== Any) { diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/dialogs.js b/v3/internal/runtime/desktop/@wailsio/runtime/src/dialogs.js deleted file mode 100644 index dc7678724..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/src/dialogs.js +++ /dev/null @@ -1,200 +0,0 @@ -/* - _ __ _ __ -| | / /___ _(_) /____ -| | /| / / __ `/ / / ___/ -| |/ |/ / /_/ / / (__ ) -|__/|__/\__,_/_/_/____/ -The electron alternative for Go -(c) Lea Anthony 2019-present -*/ - -/* jshint esversion: 9 */ - -/** - * @typedef {Object} OpenFileDialogOptions - * @property {boolean} [CanChooseDirectories] - Indicates if directories can be chosen. - * @property {boolean} [CanChooseFiles] - Indicates if files can be chosen. - * @property {boolean} [CanCreateDirectories] - Indicates if directories can be created. - * @property {boolean} [ShowHiddenFiles] - Indicates if hidden files should be shown. - * @property {boolean} [ResolvesAliases] - Indicates if aliases should be resolved. - * @property {boolean} [AllowsMultipleSelection] - Indicates if multiple selection is allowed. - * @property {boolean} [HideExtension] - Indicates if the extension should be hidden. - * @property {boolean} [CanSelectHiddenExtension] - Indicates if hidden extensions can be selected. - * @property {boolean} [TreatsFilePackagesAsDirectories] - Indicates if file packages should be treated as directories. - * @property {boolean} [AllowsOtherFiletypes] - Indicates if other file types are allowed. - * @property {FileFilter[]} [Filters] - Array of file filters. - * @property {string} [Title] - Title of the dialog. - * @property {string} [Message] - Message to show in the dialog. - * @property {string} [ButtonText] - Text to display on the button. - * @property {string} [Directory] - Directory to open in the dialog. - * @property {boolean} [Detached] - Indicates if the dialog should appear detached from the main window. - */ - - -/** - * @typedef {Object} SaveFileDialogOptions - * @property {string} [Filename] - Default filename to use in the dialog. - * @property {boolean} [CanChooseDirectories] - Indicates if directories can be chosen. - * @property {boolean} [CanChooseFiles] - Indicates if files can be chosen. - * @property {boolean} [CanCreateDirectories] - Indicates if directories can be created. - * @property {boolean} [ShowHiddenFiles] - Indicates if hidden files should be shown. - * @property {boolean} [ResolvesAliases] - Indicates if aliases should be resolved. - * @property {boolean} [AllowsMultipleSelection] - Indicates if multiple selection is allowed. - * @property {boolean} [HideExtension] - Indicates if the extension should be hidden. - * @property {boolean} [CanSelectHiddenExtension] - Indicates if hidden extensions can be selected. - * @property {boolean} [TreatsFilePackagesAsDirectories] - Indicates if file packages should be treated as directories. - * @property {boolean} [AllowsOtherFiletypes] - Indicates if other file types are allowed. - * @property {FileFilter[]} [Filters] - Array of file filters. - * @property {string} [Title] - Title of the dialog. - * @property {string} [Message] - Message to show in the dialog. - * @property {string} [ButtonText] - Text to display on the button. - * @property {string} [Directory] - Directory to open in the dialog. - * @property {boolean} [Detached] - Indicates if the dialog should appear detached from the main window. - */ - -/** - * @typedef {Object} MessageDialogOptions - * @property {string} [Title] - The title of the dialog window. - * @property {string} [Message] - The main message to show in the dialog. - * @property {Button[]} [Buttons] - Array of button options to show in the dialog. - * @property {boolean} [Detached] - True if the dialog should appear detached from the main window (if applicable). - */ - -/** - * @typedef {Object} Button - * @property {string} [Label] - Text that appears within the button. - * @property {boolean} [IsCancel] - True if the button should cancel an operation when clicked. - * @property {boolean} [IsDefault] - True if the button should be the default action when the user presses enter. - */ - -/** - * @typedef {Object} FileFilter - * @property {string} [DisplayName] - Display name for the filter, it could be "Text Files", "Images" etc. - * @property {string} [Pattern] - Pattern to match for the filter, e.g. "*.txt;*.md" for text markdown files. - */ - -// setup -window._wails = window._wails || {}; -window._wails.dialogErrorCallback = dialogErrorCallback; -window._wails.dialogResultCallback = dialogResultCallback; - -import {newRuntimeCallerWithID, objectNames} from "./runtime"; - -import { nanoid } from './nanoid.js'; - -// Define constants from the `methods` object in Title Case -const DialogInfo = 0; -const DialogWarning = 1; -const DialogError = 2; -const DialogQuestion = 3; -const DialogOpenFile = 4; -const DialogSaveFile = 5; - -const call = newRuntimeCallerWithID(objectNames.Dialog, ''); -const dialogResponses = new Map(); - -/** - * Generates a unique id that is not present in dialogResponses. - * @returns {string} unique id - */ -function generateID() { - let result; - do { - result = nanoid(); - } while (dialogResponses.has(result)); - return result; -} - -/** - * Shows a dialog of specified type with the given options. - * @param {number} type - type of dialog - * @param {MessageDialogOptions|OpenFileDialogOptions|SaveFileDialogOptions} options - options for the dialog - * @returns {Promise} promise that resolves with result of dialog - */ -function dialog(type, options = {}) { - const id = generateID(); - options["dialog-id"] = id; - return new Promise((resolve, reject) => { - dialogResponses.set(id, {resolve, reject}); - call(type, options).catch((error) => { - reject(error); - dialogResponses.delete(id); - }); - }); -} - -/** - * Handles the callback from a dialog. - * - * @param {string} id - The ID of the dialog response. - * @param {string} data - The data received from the dialog. - * @param {boolean} isJSON - Flag indicating whether the data is in JSON format. - * - * @return {undefined} - */ -function dialogResultCallback(id, data, isJSON) { - let p = dialogResponses.get(id); - if (p) { - dialogResponses.delete(id); - if (isJSON) { - p.resolve(JSON.parse(data)); - } else { - p.resolve(data); - } - } -} - -/** - * Callback function for handling errors in dialog. - * - * @param {string} id - The id of the dialog response. - * @param {string} message - The error message. - * - * @return {void} - */ -function dialogErrorCallback(id, message) { - let p = dialogResponses.get(id); - if (p) { - dialogResponses.delete(id); - p.reject(new Error(message)); - } -} - - -// Replace `methods` with constants in Title Case - -/** - * @param {MessageDialogOptions} options - Dialog options - * @returns {Promise} - The label of the button pressed - */ -export const Info = (options) => dialog(DialogInfo, options); - -/** - * @param {MessageDialogOptions} options - Dialog options - * @returns {Promise} - The label of the button pressed - */ -export const Warning = (options) => dialog(DialogWarning, options); - -/** - * @param {MessageDialogOptions} options - Dialog options - * @returns {Promise} - The label of the button pressed - */ -export const Error = (options) => dialog(DialogError, options); - -/** - * @param {MessageDialogOptions} options - Dialog options - * @returns {Promise} - The label of the button pressed - */ -export const Question = (options) => dialog(DialogQuestion, options); - -/** - * @param {OpenFileDialogOptions} options - Dialog options - * @returns {Promise} Returns selected file or list of files. Returns blank string if no file is selected. - */ -export const OpenFile = (options) => dialog(DialogOpenFile, options); - -/** - * @param {SaveFileDialogOptions} options - Dialog options - * @returns {Promise} Returns the selected file. Returns blank string if no file is selected. - */ -export const SaveFile = (options) => dialog(DialogSaveFile, options); diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/dialogs.ts b/v3/internal/runtime/desktop/@wailsio/runtime/src/dialogs.ts new file mode 100644 index 000000000..bb0625b2e --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/src/dialogs.ts @@ -0,0 +1,255 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ + +import {newRuntimeCaller, objectNames} from "./runtime.js"; +import { nanoid } from './nanoid.js'; + +// setup +window._wails = window._wails || {}; +window._wails.dialogErrorCallback = dialogErrorCallback; +window._wails.dialogResultCallback = dialogResultCallback; + +type PromiseResolvers = Omit, "promise">; + +const call = newRuntimeCaller(objectNames.Dialog); +const dialogResponses = new Map(); + +// Define constants from the `methods` object in Title Case +const DialogInfo = 0; +const DialogWarning = 1; +const DialogError = 2; +const DialogQuestion = 3; +const DialogOpenFile = 4; +const DialogSaveFile = 5; + +export interface OpenFileDialogOptions { + /** Indicates if directories can be chosen. */ + CanChooseDirectories?: boolean; + /** Indicates if files can be chosen. */ + CanChooseFiles?: boolean; + /** Indicates if directories can be created. */ + CanCreateDirectories?: boolean; + /** Indicates if hidden files should be shown. */ + ShowHiddenFiles?: boolean; + /** Indicates if aliases should be resolved. */ + ResolvesAliases?: boolean; + /** Indicates if multiple selection is allowed. */ + AllowsMultipleSelection?: boolean; + /** Indicates if the extension should be hidden. */ + HideExtension?: boolean; + /** Indicates if hidden extensions can be selected. */ + CanSelectHiddenExtension?: boolean; + /** Indicates if file packages should be treated as directories. */ + TreatsFilePackagesAsDirectories?: boolean; + /** Indicates if other file types are allowed. */ + AllowsOtherFiletypes?: boolean; + /** Array of file filters. */ + Filters?: FileFilter[]; + /** Title of the dialog. */ + Title?: string; + /** Message to show in the dialog. */ + Message?: string; + /** Text to display on the button. */ + ButtonText?: string; + /** Directory to open in the dialog. */ + Directory?: string; + /** Indicates if the dialog should appear detached from the main window. */ + Detached?: boolean; +} + +export interface SaveFileDialogOptions { + /** Default filename to use in the dialog. */ + Filename?: string; + /** Indicates if directories can be chosen. */ + CanChooseDirectories?: boolean; + /** Indicates if files can be chosen. */ + CanChooseFiles?: boolean; + /** Indicates if directories can be created. */ + CanCreateDirectories?: boolean; + /** Indicates if hidden files should be shown. */ + ShowHiddenFiles?: boolean; + /** Indicates if aliases should be resolved. */ + ResolvesAliases?: boolean; + /** Indicates if the extension should be hidden. */ + HideExtension?: boolean; + /** Indicates if hidden extensions can be selected. */ + CanSelectHiddenExtension?: boolean; + /** Indicates if file packages should be treated as directories. */ + TreatsFilePackagesAsDirectories?: boolean; + /** Indicates if other file types are allowed. */ + AllowsOtherFiletypes?: boolean; + /** Array of file filters. */ + Filters?: FileFilter[]; + /** Title of the dialog. */ + Title?: string; + /** Message to show in the dialog. */ + Message?: string; + /** Text to display on the button. */ + ButtonText?: string; + /** Directory to open in the dialog. */ + Directory?: string; + /** Indicates if the dialog should appear detached from the main window. */ + Detached?: boolean; +} + +export interface MessageDialogOptions { + /** The title of the dialog window. */ + Title?: string; + /** The main message to show in the dialog. */ + Message?: string; + /** Array of button options to show in the dialog. */ + Buttons?: Button[]; + /** True if the dialog should appear detached from the main window (if applicable). */ + Detached?: boolean; +} + +export interface Button { + /** Text that appears within the button. */ + Label?: string; + /** True if the button should cancel an operation when clicked. */ + IsCancel?: boolean; + /** True if the button should be the default action when the user presses enter. */ + IsDefault?: boolean; +} + +export interface FileFilter { + /** Display name for the filter, it could be "Text Files", "Images" etc. */ + DisplayName?: string; + /** Pattern to match for the filter, e.g. "*.txt;*.md" for text markdown files. */ + Pattern?: string; +} + +/** + * Handles the result of a dialog request. + * + * @param id - The id of the request to handle the result for. + * @param data - The result data of the request. + * @param isJSON - Indicates whether the data is JSON or not. + */ +function dialogResultCallback(id: string, data: string, isJSON: boolean): void { + let resolvers = getAndDeleteResponse(id); + if (!resolvers) { + return; + } + + if (isJSON) { + try { + resolvers.resolve(JSON.parse(data)); + } catch (err: any) { + resolvers.reject(new TypeError("could not parse result: " + err.message, { cause: err })); + } + } else { + resolvers.resolve(data); + } +} + +/** + * Handles the error from a dialog request. + * + * @param id - The id of the promise handler. + * @param message - An error message. + */ +function dialogErrorCallback(id: string, message: string): void { + getAndDeleteResponse(id)?.reject(new window.Error(message)); +} + +/** + * Retrieves and removes the response associated with the given ID from the dialogResponses map. + * + * @param id - The ID of the response to be retrieved and removed. + * @returns The response object associated with the given ID, if any. + */ +function getAndDeleteResponse(id: string): PromiseResolvers | undefined { + const response = dialogResponses.get(id); + dialogResponses.delete(id); + return response; +} + +/** + * Generates a unique ID using the nanoid library. + * + * @returns A unique ID that does not exist in the dialogResponses set. + */ +function generateID(): string { + let result; + do { + result = nanoid(); + } while (dialogResponses.has(result)); + return result; +} + +/** + * Presents a dialog of specified type with the given options. + * + * @param type - Dialog type. + * @param options - Options for the dialog. + * @returns A promise that resolves with result of dialog. + */ +function dialog(type: number, options: MessageDialogOptions | OpenFileDialogOptions | SaveFileDialogOptions = {}): Promise { + const id = generateID(); + return new Promise((resolve, reject) => { + dialogResponses.set(id, { resolve, reject }); + call(type, Object.assign({ "dialog-id": id }, options)).catch((err: any) => { + dialogResponses.delete(id); + reject(err); + }); + }); +} + +/** + * Presents an info dialog. + * + * @param options - Dialog options + * @returns A promise that resolves with the label of the chosen button. + */ +export function Info(options: MessageDialogOptions): Promise { return dialog(DialogInfo, options); } + +/** + * Presents a warning dialog. + * + * @param options - Dialog options. + * @returns A promise that resolves with the label of the chosen button. + */ +export function Warning(options: MessageDialogOptions): Promise { return dialog(DialogWarning, options); } + +/** + * Presents an error dialog. + * + * @param options - Dialog options. + * @returns A promise that resolves with the label of the chosen button. + */ +export function Error(options: MessageDialogOptions): Promise { return dialog(DialogError, options); } + +/** + * Presents a question dialog. + * + * @param options - Dialog options. + * @returns A promise that resolves with the label of the chosen button. + */ +export function Question(options: MessageDialogOptions): Promise { return dialog(DialogQuestion, options); } + +/** + * Presents a file selection dialog to pick one or more files to open. + * + * @param options - Dialog options. + * @returns Selected file or list of files, or a blank string/empty list if no file has been selected. + */ +export function OpenFile(options: OpenFileDialogOptions & { AllowsMultipleSelection: true }): Promise; +export function OpenFile(options: OpenFileDialogOptions & { AllowsMultipleSelection?: false | undefined }): Promise; +export function OpenFile(options: OpenFileDialogOptions): Promise; +export function OpenFile(options: OpenFileDialogOptions): Promise { return dialog(DialogOpenFile, options) ?? []; } + +/** + * Presents a file selection dialog to pick a file to save. + * + * @param options - Dialog options. + * @returns Selected file, or a blank string if no file has been selected. + */ +export function SaveFile(options: SaveFileDialogOptions): Promise { return dialog(DialogSaveFile, options); } diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/drag.js b/v3/internal/runtime/desktop/@wailsio/runtime/src/drag.js deleted file mode 100644 index 9c841796c..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/src/drag.js +++ /dev/null @@ -1,119 +0,0 @@ -/* - _ __ _ __ -| | / /___ _(_) /____ -| | /| / / __ `/ / / ___/ -| |/ |/ / /_/ / / (__ ) -|__/|__/\__,_/_/_/____/ -The electron alternative for Go -(c) Lea Anthony 2019-present -*/ -/* jshint esversion: 9 */ -import {invoke, IsWindows} from "./system"; -import {GetFlag} from "./flags"; - -// Setup -let shouldDrag = false; -let resizable = false; -let resizeEdge = null; -let defaultCursor = "auto"; - -window._wails = window._wails || {}; - -window._wails.setResizable = function(value) { - resizable = value; -}; - -window._wails.endDrag = function() { - document.body.style.cursor = 'default'; - shouldDrag = false; -}; - -window.addEventListener('mousedown', onMouseDown); -window.addEventListener('mousemove', onMouseMove); -window.addEventListener('mouseup', onMouseUp); - - -function dragTest(e) { - let val = window.getComputedStyle(e.target).getPropertyValue("--wails-draggable"); - let mousePressed = e.buttons !== undefined ? e.buttons : e.which; - if (!val || val === "" || val.trim() !== "drag" || mousePressed === 0) { - return false; - } - return e.detail === 1; -} - -function onMouseDown(e) { - - // Check for resizing - if (resizeEdge) { - invoke("wails:resize:" + resizeEdge); - e.preventDefault(); - return; - } - - if (dragTest(e)) { - // This checks for clicks on the scroll bar - if (e.offsetX > e.target.clientWidth || e.offsetY > e.target.clientHeight) { - return; - } - shouldDrag = true; - } else { - shouldDrag = false; - } -} - -function onMouseUp() { - shouldDrag = false; -} - -function setResize(cursor) { - document.documentElement.style.cursor = cursor || defaultCursor; - resizeEdge = cursor; -} - -function onMouseMove(e) { - if (shouldDrag) { - shouldDrag = false; - let mousePressed = e.buttons !== undefined ? e.buttons : e.which; - if (mousePressed > 0) { - invoke("wails:drag"); - return; - } - } - if (!resizable || !IsWindows()) { - return; - } - if (defaultCursor == null) { - defaultCursor = document.documentElement.style.cursor; - } - let resizeHandleHeight = GetFlag("system.resizeHandleHeight") || 5; - let resizeHandleWidth = GetFlag("system.resizeHandleWidth") || 5; - - // Extra pixels for the corner areas - let cornerExtra = GetFlag("resizeCornerExtra") || 10; - - let rightBorder = window.outerWidth - e.clientX < resizeHandleWidth; - let leftBorder = e.clientX < resizeHandleWidth; - let topBorder = e.clientY < resizeHandleHeight; - let bottomBorder = window.outerHeight - e.clientY < resizeHandleHeight; - - // Adjust for corners - let rightCorner = window.outerWidth - e.clientX < (resizeHandleWidth + cornerExtra); - let leftCorner = e.clientX < (resizeHandleWidth + cornerExtra); - let topCorner = e.clientY < (resizeHandleHeight + cornerExtra); - let bottomCorner = window.outerHeight - e.clientY < (resizeHandleHeight + cornerExtra); - - // If we aren't on an edge, but were, reset the cursor to default - if (!leftBorder && !rightBorder && !topBorder && !bottomBorder && resizeEdge !== undefined) { - setResize(); - } - // Adjusted for corner areas - else if (rightCorner && bottomCorner) setResize("se-resize"); - else if (leftCorner && bottomCorner) setResize("sw-resize"); - else if (leftCorner && topCorner) setResize("nw-resize"); - else if (topCorner && rightCorner) setResize("ne-resize"); - else if (leftBorder) setResize("w-resize"); - else if (topBorder) setResize("n-resize"); - else if (bottomBorder) setResize("s-resize"); - else if (rightBorder) setResize("e-resize"); -} \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/drag.ts b/v3/internal/runtime/desktop/@wailsio/runtime/src/drag.ts new file mode 100644 index 000000000..71fdc0256 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/src/drag.ts @@ -0,0 +1,209 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ + +import { invoke, IsWindows } from "./system.js"; +import { GetFlag } from "./flags.js"; +import { canTrackButtons } from "./utils.js"; + +// Setup +let canDrag = false; +let dragging = false; + +let resizable = false; +let canResize = false; +let resizing = false; +let resizeEdge: string = ""; +let defaultCursor = "auto"; + +let buttons = 0; +const buttonsTracked = canTrackButtons(); + +window._wails = window._wails || {}; +window._wails.setResizable = (value: boolean): void => { + resizable = value; + if (!resizable) { + // Stop resizing if in progress. + canResize = resizing = false; + setResize(); + } +}; + +window.addEventListener('mousedown', onMouseDown, { capture: true }); +window.addEventListener('mousemove', onMouseMove, { capture: true }); +window.addEventListener('mouseup', onMouseUp, { capture: true }); +for (const ev of ['click', 'contextmenu', 'dblclick', 'pointerdown', 'pointerup']) { + window.addEventListener(ev, suppressEvent, { capture: true }); +} + +function suppressEvent(event: Event) { + if (dragging || resizing) { + // Suppress all button events during dragging & resizing. + event.stopImmediatePropagation(); + event.stopPropagation(); + event.preventDefault(); + } +} + +function onMouseDown(event: MouseEvent): void { + buttons = buttonsTracked ? event.buttons : (buttons | (1 << event.button)); + + if (dragging || resizing) { + // After dragging or resizing has started, only lifting the primary button can stop it. + // Do not let any other events through. + suppressEvent(event); + return; + } + + if ((canDrag || canResize) && (buttons & 1) && event.button !== 0) { + // We were ready before, the primary is pressed and was not released: + // still ready, but let events bubble through the window. + return; + } + + // Reset readiness state. + canDrag = false; + canResize = false; + + // Check for resizing readiness. + if (resizeEdge) { + if (event.button === 0 && event.detail === 1) { + // Ready to resize if the primary button was pressed for the first time. + canResize = true; + invoke("wails:resize:" + resizeEdge); + } + + // Do not start drag operations within resize edges. + return; + } + + let target: HTMLElement; + + if (event.target instanceof HTMLElement) { + target = event.target; + } else if (!(event.target instanceof HTMLElement) && event.target instanceof Node) { + target = event.target.parentElement ?? document.body; + } else { + target = document.body; + } + + const style = window.getComputedStyle(target); + const setting = style.getPropertyValue("--wails-draggable").trim(); + if (setting === "drag" && event.button === 0 && event.detail === 1) { + // Ready to drag if the primary button was pressed for the first time on a draggable element. + // Ignore clicks on the scrollbar. + if ( + event.offsetX - parseFloat(style.paddingLeft) < target.clientWidth + && event.offsetY - parseFloat(style.paddingTop) < target.clientHeight + ) { + canDrag = true; + invoke("wails:drag"); + } + } +} + +function onMouseUp(event: MouseEvent) { + buttons = buttonsTracked ? event.buttons : (buttons & ~(1 << event.button)); + + if (event.button === 0) { + if (resizing) { + // Let mouseup event bubble when a drag ends, but not when a resize ends. + suppressEvent(event); + } + + // Stop dragging and resizing when the primary button is lifted. + canDrag = false; + dragging = false; + canResize = false; + resizing = false; + return; + } + + // After dragging or resizing has started, only lifting the primary button can stop it. + suppressEvent(event); + return; +} + +const cursorForEdge = Object.freeze({ + "se-resize": "nwse-resize", + "sw-resize": "nesw-resize", + "nw-resize": "nwse-resize", + "ne-resize": "nesw-resize", + "w-resize": "ew-resize", + "n-resize": "ns-resize", + "s-resize": "ns-resize", + "e-resize": "ew-resize", +}) + +function setResize(edge?: keyof typeof cursorForEdge): void { + if (edge) { + if (!resizeEdge) { defaultCursor = document.body.style.cursor; } + document.body.style.cursor = cursorForEdge[edge]; + } else if (!edge && resizeEdge) { + document.body.style.cursor = defaultCursor; + } + + resizeEdge = edge || ""; +} + +function onMouseMove(event: MouseEvent): void { + if (canResize && resizeEdge) { + // Start resizing. + resizing = true; + } else if (canDrag) { + // Start dragging. + dragging = true; + } + + if (dragging || resizing) { + // Either drag or resize is ongoing, + // reset readiness and stop processing. + canDrag = canResize = false; + return; + } + + if (!resizable || !IsWindows()) { + if (resizeEdge) { setResize(); } + return; + } + + const resizeHandleHeight = GetFlag("system.resizeHandleHeight") || 5; + const resizeHandleWidth = GetFlag("system.resizeHandleWidth") || 5; + + // Extra pixels for the corner areas. + const cornerExtra = GetFlag("resizeCornerExtra") || 10; + + const rightBorder = (window.outerWidth - event.clientX) < resizeHandleWidth; + const leftBorder = event.clientX < resizeHandleWidth; + const topBorder = event.clientY < resizeHandleHeight; + const bottomBorder = (window.outerHeight - event.clientY) < resizeHandleHeight; + + // Adjust for corner areas. + const rightCorner = (window.outerWidth - event.clientX) < (resizeHandleWidth + cornerExtra); + const leftCorner = event.clientX < (resizeHandleWidth + cornerExtra); + const topCorner = event.clientY < (resizeHandleHeight + cornerExtra); + const bottomCorner = (window.outerHeight - event.clientY) < (resizeHandleHeight + cornerExtra); + + if (!leftCorner && !topCorner && !bottomCorner && !rightCorner) { + // Optimisation: out of all corner areas implies out of borders. + setResize(); + } + // Detect corners. + else if (rightCorner && bottomCorner) setResize("se-resize"); + else if (leftCorner && bottomCorner) setResize("sw-resize"); + else if (leftCorner && topCorner) setResize("nw-resize"); + else if (topCorner && rightCorner) setResize("ne-resize"); + // Detect borders. + else if (leftBorder) setResize("w-resize"); + else if (topBorder) setResize("n-resize"); + else if (bottomBorder) setResize("s-resize"); + else if (rightBorder) setResize("e-resize"); + // Out of border area. + else setResize(); +} diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/event_types.js b/v3/internal/runtime/desktop/@wailsio/runtime/src/event_types.ts similarity index 96% rename from v3/internal/runtime/desktop/@wailsio/runtime/src/event_types.js rename to v3/internal/runtime/desktop/@wailsio/runtime/src/event_types.ts index 9c7feed7c..5c5de0ce2 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/src/event_types.js +++ b/v3/internal/runtime/desktop/@wailsio/runtime/src/event_types.ts @@ -1,6 +1,18 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ -export const EventTypes = { - Windows: { +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +export const Types = Object.freeze({ + Windows: Object.freeze({ APMPowerSettingChange: "windows:APMPowerSettingChange", APMPowerStatusChange: "windows:APMPowerStatusChange", APMResumeAutomatic: "windows:APMResumeAutomatic", @@ -45,8 +57,8 @@ export const EventTypes = { WindowUnMinimise: "windows:WindowUnMinimise", WindowMaximise: "windows:WindowMaximise", WindowUnMaximise: "windows:WindowUnMaximise", - }, - Mac: { + }), + Mac: Object.freeze({ ApplicationDidBecomeActive: "mac:ApplicationDidBecomeActive", ApplicationDidChangeBackingProperties: "mac:ApplicationDidChangeBackingProperties", ApplicationDidChangeEffectiveAppearance: "mac:ApplicationDidChangeEffectiveAppearance", @@ -179,8 +191,8 @@ export const EventTypes = { WindowZoomIn: "mac:WindowZoomIn", WindowZoomOut: "mac:WindowZoomOut", WindowZoomReset: "mac:WindowZoomReset", - }, - Linux: { + }), + Linux: Object.freeze({ ApplicationStartup: "linux:ApplicationStartup", SystemThemeChanged: "linux:SystemThemeChanged", WindowDeleteEvent: "linux:WindowDeleteEvent", @@ -189,8 +201,8 @@ export const EventTypes = { WindowFocusIn: "linux:WindowFocusIn", WindowFocusOut: "linux:WindowFocusOut", WindowLoadChanged: "linux:WindowLoadChanged", - }, - Common: { + }), + Common: Object.freeze({ ApplicationOpenedWithFile: "common:ApplicationOpenedWithFile", ApplicationStarted: "common:ApplicationStarted", ThemeChanged: "common:ThemeChanged", @@ -215,5 +227,5 @@ export const EventTypes = { WindowZoomIn: "common:WindowZoomIn", WindowZoomOut: "common:WindowZoomOut", WindowZoomReset: "common:WindowZoomReset", - }, -}; + }), +}); diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/events.js b/v3/internal/runtime/desktop/@wailsio/runtime/src/events.js deleted file mode 100644 index afbcbb922..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/src/events.js +++ /dev/null @@ -1,140 +0,0 @@ -/* - _ __ _ __ -| | / /___ _(_) /____ -| | /| / / __ `/ / / ___/ -| |/ |/ / /_/ / / (__ ) -|__/|__/\__,_/_/_/____/ -The electron alternative for Go -(c) Lea Anthony 2019-present -*/ - -/* jshint esversion: 9 */ - -/** - * @typedef {import("./types").WailsEvent} WailsEvent - */ -import {newRuntimeCallerWithID, objectNames} from "./runtime"; - -import {EventTypes} from "./event_types"; -export const Types = EventTypes; - -// Setup -window._wails = window._wails || {}; -window._wails.dispatchWailsEvent = dispatchWailsEvent; - -const call = newRuntimeCallerWithID(objectNames.Events, ''); -const EmitMethod = 0; -const eventListeners = new Map(); - -class Listener { - constructor(eventName, callback, maxCallbacks) { - this.eventName = eventName; - this.maxCallbacks = maxCallbacks || -1; - this.Callback = (data) => { - callback(data); - if (this.maxCallbacks === -1) return false; - this.maxCallbacks -= 1; - return this.maxCallbacks === 0; - }; - } -} - -export class WailsEvent { - constructor(name, data = null) { - this.name = name; - this.data = data; - } -} - -export function setup() { -} - -function dispatchWailsEvent(event) { - let listeners = eventListeners.get(event.name); - if (listeners) { - let toRemove = listeners.filter(listener => { - let remove = listener.Callback(event); - if (remove) return true; - }); - if (toRemove.length > 0) { - listeners = listeners.filter(l => !toRemove.includes(l)); - if (listeners.length === 0) eventListeners.delete(event.name); - else eventListeners.set(event.name, listeners); - } - } -} - -/** - * Register a callback function to be called multiple times for a specific event. - * - * @param {string} eventName - The name of the event to register the callback for. - * @param {function} callback - The callback function to be called when the event is triggered. - * @param {number} maxCallbacks - The maximum number of times the callback can be called for the event. Once the maximum number is reached, the callback will no longer be called. - * - @return {function} - A function that, when called, will unregister the callback from the event. - */ -export function OnMultiple(eventName, callback, maxCallbacks) { - let listeners = eventListeners.get(eventName) || []; - const thisListener = new Listener(eventName, callback, maxCallbacks); - listeners.push(thisListener); - eventListeners.set(eventName, listeners); - return () => listenerOff(thisListener); -} - -/** - * Registers a callback function to be executed when the specified event occurs. - * - * @param {string} eventName - The name of the event. - * @param {function} callback - The callback function to be executed. It takes no parameters. - * @return {function} - A function that, when called, will unregister the callback from the event. */ -export function On(eventName, callback) { return OnMultiple(eventName, callback, -1); } - -/** - * Registers a callback function to be executed only once for the specified event. - * - * @param {string} eventName - The name of the event. - * @param {function} callback - The function to be executed when the event occurs. - * @return {function} - A function that, when called, will unregister the callback from the event. - */ -export function Once(eventName, callback) { return OnMultiple(eventName, callback, 1); } - -/** - * Removes the specified listener from the event listeners collection. - * If all listeners for the event are removed, the event key is deleted from the collection. - * - * @param {Object} listener - The listener to be removed. - */ -function listenerOff(listener) { - const eventName = listener.eventName; - let listeners = eventListeners.get(eventName).filter(l => l !== listener); - if (listeners.length === 0) eventListeners.delete(eventName); - else eventListeners.set(eventName, listeners); -} - - -/** - * Removes event listeners for the specified event names. - * - * @param {string} eventName - The name of the event to remove listeners for. - * @param {...string} additionalEventNames - Additional event names to remove listeners for. - * @return {undefined} - */ -export function Off(eventName, ...additionalEventNames) { - let eventsToRemove = [eventName, ...additionalEventNames]; - eventsToRemove.forEach(eventName => eventListeners.delete(eventName)); -} -/** - * Removes all event listeners. - * - * @function OffAll - * @returns {void} - */ -export function OffAll() { eventListeners.clear(); } - -/** - * Emits an event using the given event name. - * - * @param {WailsEvent} event - The name of the event to emit. - * @returns {any} - The result of the emitted event. - */ -export function Emit(event) { return call(EmitMethod, event); } diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/events.ts b/v3/internal/runtime/desktop/@wailsio/runtime/src/events.ts new file mode 100644 index 000000000..d8c67b65f --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/src/events.ts @@ -0,0 +1,135 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ + +import { newRuntimeCaller, objectNames } from "./runtime.js"; +import { eventListeners, Listener, listenerOff } from "./listener.js"; + +// Setup +window._wails = window._wails || {}; +window._wails.dispatchWailsEvent = dispatchWailsEvent; + +const call = newRuntimeCaller(objectNames.Events); +const EmitMethod = 0; + +export { Types } from "./event_types.js"; + +/** + * The type of handlers for a given event. + */ +export type Callback = (ev: WailsEvent) => void; + +/** + * Represents a system event or a custom event emitted through wails-provided facilities. + */ +export class WailsEvent { + /** + * The name of the event. + */ + name: string; + + /** + * Optional data associated with the emitted event. + */ + data: any; + + /** + * Name of the originating window. Omitted for application events. + * Will be overridden if set manually. + */ + sender?: string; + + constructor(name: string, data: any = null) { + this.name = name; + this.data = data; + } +} + +function dispatchWailsEvent(event: any) { + let listeners = eventListeners.get(event.name); + if (!listeners) { + return; + } + + let wailsEvent = new WailsEvent(event.name, event.data); + if ('sender' in event) { + wailsEvent.sender = event.sender; + } + + listeners = listeners.filter(listener => !listener.dispatch(wailsEvent)); + if (listeners.length === 0) { + eventListeners.delete(event.name); + } else { + eventListeners.set(event.name, listeners); + } +} + +/** + * Register a callback function to be called multiple times for a specific event. + * + * @param eventName - The name of the event to register the callback for. + * @param callback - The callback function to be called when the event is triggered. + * @param maxCallbacks - The maximum number of times the callback can be called for the event. Once the maximum number is reached, the callback will no longer be called. + * @returns A function that, when called, will unregister the callback from the event. + */ +export function OnMultiple(eventName: string, callback: Callback, maxCallbacks: number) { + let listeners = eventListeners.get(eventName) || []; + const thisListener = new Listener(eventName, callback, maxCallbacks); + listeners.push(thisListener); + eventListeners.set(eventName, listeners); + return () => listenerOff(thisListener); +} + +/** + * Registers a callback function to be executed when the specified event occurs. + * + * @param eventName - The name of the event to register the callback for. + * @param callback - The callback function to be called when the event is triggered. + * @returns A function that, when called, will unregister the callback from the event. + */ +export function On(eventName: string, callback: Callback): () => void { + return OnMultiple(eventName, callback, -1); +} + +/** + * Registers a callback function to be executed only once for the specified event. + * + * @param eventName - The name of the event to register the callback for. + * @param callback - The callback function to be called when the event is triggered. + * @returns A function that, when called, will unregister the callback from the event. + */ +export function Once(eventName: string, callback: Callback): () => void { + return OnMultiple(eventName, callback, 1); +} + +/** + * Removes event listeners for the specified event names. + * + * @param eventNames - The name of the events to remove listeners for. + */ +export function Off(...eventNames: [string, ...string[]]): void { + eventNames.forEach(eventName => eventListeners.delete(eventName)); +} + +/** + * Removes all event listeners. + */ +export function OffAll(): void { + eventListeners.clear(); +} + +/** + * Emits the given event. + * + * @param event - The name of the event to emit. + * @returns A promise that will be fulfilled once the event has been emitted. + */ +export function Emit(event: WailsEvent): Promise { + return call(EmitMethod, event); +} diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/flags.js b/v3/internal/runtime/desktop/@wailsio/runtime/src/flags.js deleted file mode 100644 index 26be59d76..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/src/flags.js +++ /dev/null @@ -1,25 +0,0 @@ -/* - _ __ _ __ -| | / /___ _(_) /____ -| | /| / / __ `/ / / ___/ -| |/ |/ / /_/ / / (__ ) -|__/|__/\__,_/_/_/____/ -The electron alternative for Go -(c) Lea Anthony 2019-present -*/ - -/* jshint esversion: 9 */ - -/** - * Retrieves the value associated with the specified key from the flag map. - * - * @param {string} keyString - The key to retrieve the value for. - * @return {*} - The value associated with the specified key. - */ -export function GetFlag(keyString) { - try { - return window._wails.flags[keyString]; - } catch (e) { - throw new Error("Unable to retrieve flag '" + keyString + "': " + e); - } -} diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/flags.ts b/v3/internal/runtime/desktop/@wailsio/runtime/src/flags.ts new file mode 100644 index 000000000..9e4ad2427 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/src/flags.ts @@ -0,0 +1,23 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ + +/** + * Retrieves the value associated with the specified key from the flag map. + * + * @param key - The key to retrieve the value for. + * @return The value associated with the specified key. + */ +export function GetFlag(key: string): any { + try { + return window._wails.flags[key]; + } catch (e) { + throw new Error("Unable to retrieve flag '" + key + "': " + e, { cause: e }); + } +} diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/global.d.ts b/v3/internal/runtime/desktop/@wailsio/runtime/src/global.d.ts new file mode 100644 index 000000000..231896ce1 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/src/global.d.ts @@ -0,0 +1,17 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ + +declare global { + interface Window { + _wails: Record; + } +} + +export {}; diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/index.js b/v3/internal/runtime/desktop/@wailsio/runtime/src/index.js deleted file mode 100644 index 071c60092..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/src/index.js +++ /dev/null @@ -1,60 +0,0 @@ -/* - _ __ _ __ -| | / /___ _(_) /____ -| | /| / / __ `/ / / ___/ -| |/ |/ / /_/ / / (__ ) -|__/|__/\__,_/_/_/____/ -The electron alternative for Go -(c) Lea Anthony 2019-present -*/ - -// Setup -window._wails = window._wails || {}; - -import "./contextmenu"; -import "./drag"; - -// Re-export public API -import * as Application from "./application"; -import * as Browser from "./browser"; -import * as Call from "./calls"; -import * as Clipboard from "./clipboard"; -import * as Create from "./create"; -import * as Dialogs from "./dialogs"; -import * as Events from "./events"; -import * as Flags from "./flags"; -import * as Screens from "./screens"; -import * as System from "./system"; -import Window from "./window"; -import * as WML from "./wml"; - -export { - Application, - Browser, - Call, - Clipboard, - Create, - Dialogs, - Events, - Flags, - Screens, - System, - Window, - WML -}; - -let initialised = false; -export function init() { - window._wails.invoke = System.invoke; - System.invoke("wails:runtime:ready"); - initialised = true; -} - -window.addEventListener("load", () => { - if (!initialised) { - init(); - } -}); - -// Notify backend - diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/index.ts b/v3/internal/runtime/desktop/@wailsio/runtime/src/index.ts new file mode 100644 index 000000000..7905ead84 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/src/index.ts @@ -0,0 +1,57 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ + +// Setup +window._wails = window._wails || {}; + +import "./contextmenu.js"; +import "./drag.js"; + +// Re-export public API +import * as Application from "./application.js"; +import * as Browser from "./browser.js"; +import * as Call from "./calls.js"; +import * as Clipboard from "./clipboard.js"; +import * as Create from "./create.js"; +import * as Dialogs from "./dialogs.js"; +import * as Events from "./events.js"; +import * as Flags from "./flags.js"; +import * as Screens from "./screens.js"; +import * as System from "./system.js"; +import Window from "./window.js"; +import * as WML from "./wml.js"; + +export { + Application, + Browser, + Call, + Clipboard, + Dialogs, + Events, + Flags, + Screens, + System, + Window, + WML +}; + +/** + * An internal utility consumed by the binding generator. + * + * @private + * @ignore + */ +export { Create }; + +export * from "./cancellable.js"; + +// Notify backend +window._wails.invoke = System.invoke; +System.invoke("wails:runtime:ready"); diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/listener.ts b/v3/internal/runtime/desktop/@wailsio/runtime/src/listener.ts new file mode 100644 index 000000000..0d74debca --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/src/listener.ts @@ -0,0 +1,52 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ + +// The following utilities have been factored out of ./events.ts +// for testing purposes. + +export const eventListeners = new Map(); + +export class Listener { + eventName: string; + callback: (data: any) => void; + maxCallbacks: number; + + constructor(eventName: string, callback: (data: any) => void, maxCallbacks: number) { + this.eventName = eventName; + this.callback = callback; + this.maxCallbacks = maxCallbacks || -1; + } + + dispatch(data: any): boolean { + try { + this.callback(data); + } catch (err) { + console.error(err); + } + + if (this.maxCallbacks === -1) return false; + this.maxCallbacks -= 1; + return this.maxCallbacks === 0; + } +} + +export function listenerOff(listener: Listener): void { + let listeners = eventListeners.get(listener.eventName); + if (!listeners) { + return; + } + + listeners = listeners.filter(l => l !== listener); + if (listeners.length === 0) { + eventListeners.delete(listener.eventName); + } else { + eventListeners.set(listener.eventName, listeners); + } +} diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/nanoid.js b/v3/internal/runtime/desktop/@wailsio/runtime/src/nanoid.ts similarity index 96% rename from v3/internal/runtime/desktop/@wailsio/runtime/src/nanoid.js rename to v3/internal/runtime/desktop/@wailsio/runtime/src/nanoid.ts index 37adf3fb0..bfe83048f 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/src/nanoid.js +++ b/v3/internal/runtime/desktop/@wailsio/runtime/src/nanoid.ts @@ -27,10 +27,10 @@ // `'use`, `andom`, and `rict'` // References to the brotli default dictionary: // `-26T`, `1983`, `40px`, `75px`, `bush`, `jack`, `mind`, `very`, and `wolf` -let urlAlphabet = +const urlAlphabet = 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict' -export let nanoid = (size = 21) => { +export function nanoid(size: number = 21): string { let id = '' // A compact alternative for `for (var i = 0; i < step; i++)`. let i = size | 0 @@ -39,4 +39,4 @@ export let nanoid = (size = 21) => { id += urlAlphabet[(Math.random() * 64) | 0] } return id -} \ No newline at end of file +} diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/runtime.js b/v3/internal/runtime/desktop/@wailsio/runtime/src/runtime.js deleted file mode 100644 index b1ae204ab..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/src/runtime.js +++ /dev/null @@ -1,92 +0,0 @@ -/* - _ __ _ __ -| | / /___ _(_) /____ -| | /| / / __ `/ / / ___/ -| |/ |/ / /_/ / / (__ ) -|__/|__/\__,_/_/_/____/ -The electron alternative for Go -(c) Lea Anthony 2019-present -*/ - -/* jshint esversion: 9 */ -import { nanoid } from './nanoid.js'; - -const runtimeURL = window.location.origin + "/wails/runtime"; - -// Object Names -export const objectNames = { - Call: 0, - Clipboard: 1, - Application: 2, - Events: 3, - ContextMenu: 4, - Dialog: 5, - Window: 6, - Screens: 7, - System: 8, - Browser: 9, - CancelCall: 10, -} -export let clientId = nanoid(); - -/** - * Creates a runtime caller function that invokes a specified method on a given object within a specified window context. - * - * @param {Object} object - The object on which the method is to be invoked. - * @param {string} windowName - The name of the window context in which the method should be called. - * @returns {Function} A runtime caller function that takes the method name and optionally arguments and invokes the method within the specified window context. - */ -export function newRuntimeCaller(object, windowName) { - return function (method, args=null) { - return runtimeCall(object + "." + method, windowName, args); - }; -} - -/** - * Creates a new runtime caller with specified ID. - * - * @param {number} object - The object to invoke the method on. - * @param {string} windowName - The name of the window. - * @return {Function} - The new runtime caller function. - */ -export function newRuntimeCallerWithID(object, windowName) { - return function (method, args=null) { - return runtimeCallWithID(object, method, windowName, args); - }; -} - - -function runtimeCall(method, windowName, args) { - return runtimeCallWithID(null, method, windowName, args); -} - -async function runtimeCallWithID(objectID, method, windowName, args) { - let url = new URL(runtimeURL); - if (objectID != null) { - url.searchParams.append("object", objectID); - } - if (method != null) { - url.searchParams.append("method", method); - } - let fetchOptions = { - headers: {}, - }; - if (windowName) { - fetchOptions.headers["x-wails-window-name"] = windowName; - } - if (args) { - url.searchParams.append("args", JSON.stringify(args)); - } - fetchOptions.headers["x-wails-client-id"] = clientId; - - let response = await fetch(url, fetchOptions); - if (!response.ok) { - throw new Error(await response.text()); - } - - if (response.headers.get("Content-Type") && response.headers.get("Content-Type").indexOf("application/json") !== -1) { - return response.json(); - } else { - return response.text(); - } -} diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/runtime.ts b/v3/internal/runtime/desktop/@wailsio/runtime/src/runtime.ts new file mode 100644 index 000000000..412427ef5 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/src/runtime.ts @@ -0,0 +1,67 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ + +import { nanoid } from './nanoid.js'; + +const runtimeURL = window.location.origin + "/wails/runtime"; + +// Object Names +export const objectNames = Object.freeze({ + Call: 0, + Clipboard: 1, + Application: 2, + Events: 3, + ContextMenu: 4, + Dialog: 5, + Window: 6, + Screens: 7, + System: 8, + Browser: 9, + CancelCall: 10, +}); +export let clientId = nanoid(); + +/** + * Creates a new runtime caller with specified ID. + * + * @param object - The object to invoke the method on. + * @param windowName - The name of the window. + * @return The new runtime caller function. + */ +export function newRuntimeCaller(object: number, windowName: string = '') { + return function (method: number, args: any = null) { + return runtimeCallWithID(object, method, windowName, args); + }; +} + +async function runtimeCallWithID(objectID: number, method: number, windowName: string, args: any): Promise { + let url = new URL(runtimeURL); + url.searchParams.append("object", objectID.toString()); + url.searchParams.append("method", method.toString()); + if (args) { url.searchParams.append("args", JSON.stringify(args)); } + + let headers: Record = { + ["x-wails-client-id"]: clientId + } + if (windowName) { + headers["x-wails-window-name"] = windowName; + } + + let response = await fetch(url, { headers }); + if (!response.ok) { + throw new Error(await response.text()); + } + + if ((response.headers.get("Content-Type")?.indexOf("application/json") ?? -1) !== -1) { + return response.json(); + } else { + return response.text(); + } +} diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/screens.js b/v3/internal/runtime/desktop/@wailsio/runtime/src/screens.js deleted file mode 100644 index 97fc2af02..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/src/screens.js +++ /dev/null @@ -1,71 +0,0 @@ -/* - _ __ _ __ -| | / /___ _(_) /____ -| | /| / / __ `/ / / ___/ -| |/ |/ / /_/ / / (__ ) -|__/|__/\__,_/_/_/____/ -The electron alternative for Go -(c) Lea Anthony 2019-present -*/ - -/* jshint esversion: 9 */ - -/** - * @typedef {Object} Size - * @property {number} Width - The width. - * @property {number} Height - The height. - */ - -/** - * @typedef {Object} Rect - * @property {number} X - The X coordinate of the origin. - * @property {number} Y - The Y coordinate of the origin. - * @property {number} Width - The width of the rectangle. - * @property {number} Height - The height of the rectangle. - */ - -/** - * @typedef {Object} Screen - * @property {string} ID - Unique identifier for the screen. - * @property {string} Name - Human readable name of the screen. - * @property {number} ScaleFactor - The scale factor of the screen (DPI/96). 1 = standard DPI, 2 = HiDPI (Retina), etc. - * @property {number} X - The X coordinate of the screen. - * @property {number} Y - The Y coordinate of the screen. - * @property {Size} Size - Contains the width and height of the screen. - * @property {Rect} Bounds - Contains the bounds of the screen in terms of X, Y, Width, and Height. - * @property {Rect} PhysicalBounds - Contains the physical bounds of the screen in terms of X, Y, Width, and Height (before scaling). - * @property {Rect} WorkArea - Contains the area of the screen that is actually usable (excluding taskbar and other system UI). - * @property {Rect} PhysicalWorkArea - Contains the physical WorkArea of the screen (before scaling). - * @property {boolean} IsPrimary - True if this is the primary monitor selected by the user in the operating system. - * @property {number} Rotation - The rotation of the screen. - */ - -import { newRuntimeCallerWithID, objectNames } from "./runtime"; -const call = newRuntimeCallerWithID(objectNames.Screens, ""); - -const getAll = 0; -const getPrimary = 1; -const getCurrent = 2; - -/** - * Gets all screens. - * @returns {Promise} A promise that resolves to an array of Screen objects. - */ -export function GetAll() { - return call(getAll); -} -/** - * Gets the primary screen. - * @returns {Promise} A promise that resolves to the primary screen. - */ -export function GetPrimary() { - return call(getPrimary); -} -/** - * Gets the current active screen. - * - * @returns {Promise} A promise that resolves with the current active screen. - */ -export function GetCurrent() { - return call(getCurrent); -} diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/screens.ts b/v3/internal/runtime/desktop/@wailsio/runtime/src/screens.ts new file mode 100644 index 000000000..c0ecfd7be --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/src/screens.ts @@ -0,0 +1,88 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ + +export interface Size { + /** The width of a rectangular area. */ + Width: number; + /** The height of a rectangular area. */ + Height: number; +} + +export interface Rect { + /** The X coordinate of the origin. */ + X: number; + /** The Y coordinate of the origin. */ + Y: number; + /** The width of the rectangle. */ + Width: number; + /** The height of the rectangle. */ + Height: number; +} + +export interface Screen { + /** Unique identifier for the screen. */ + ID: string; + /** Human-readable name of the screen. */ + Name: string; + /** The scale factor of the screen (DPI/96). 1 = standard DPI, 2 = HiDPI (Retina), etc. */ + ScaleFactor: number; + /** The X coordinate of the screen. */ + X: number; + /** The Y coordinate of the screen. */ + Y: number; + /** Contains the width and height of the screen. */ + Size: Size; + /** Contains the bounds of the screen in terms of X, Y, Width, and Height. */ + Bounds: Rect; + /** Contains the physical bounds of the screen in terms of X, Y, Width, and Height (before scaling). */ + PhysicalBounds: Rect; + /** Contains the area of the screen that is actually usable (excluding taskbar and other system UI). */ + WorkArea: Rect; + /** Contains the physical WorkArea of the screen (before scaling). */ + PhysicalWorkArea: Rect; + /** True if this is the primary monitor selected by the user in the operating system. */ + IsPrimary: boolean; + /** The rotation of the screen. */ + Rotation: number; +} + +import { newRuntimeCaller, objectNames } from "./runtime.js"; +const call = newRuntimeCaller(objectNames.Screens); + +const getAll = 0; +const getPrimary = 1; +const getCurrent = 2; + +/** + * Gets all screens. + * + * @returns A promise that resolves to an array of Screen objects. + */ +export function GetAll(): Promise { + return call(getAll); +} + +/** + * Gets the primary screen. + * + * @returns A promise that resolves to the primary screen. + */ +export function GetPrimary(): Promise { + return call(getPrimary); +} + +/** + * Gets the current active screen. + * + * @returns A promise that resolves with the current active screen. + */ +export function GetCurrent(): Promise { + return call(getCurrent); +} diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/system.js b/v3/internal/runtime/desktop/@wailsio/runtime/src/system.js deleted file mode 100644 index 18287e656..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/src/system.js +++ /dev/null @@ -1,143 +0,0 @@ -/* - _ __ _ __ -| | / /___ _(_) /____ -| | /| / / __ `/ / / ___/ -| |/ |/ / /_/ / / (__ ) -|__/|__/\__,_/_/_/____/ -The electron alternative for Go -(c) Lea Anthony 2019-present -*/ - -/* jshint esversion: 9 */ - -import {newRuntimeCallerWithID, objectNames} from "./runtime"; -let call = newRuntimeCallerWithID(objectNames.System, ''); -const systemIsDarkMode = 0; -const environment = 1; - -const _invoke = (() => { - try { - if(window?.chrome?.webview) { - return (msg) => window.chrome.webview.postMessage(msg); - } - if(window?.webkit?.messageHandlers?.external) { - return (msg) => window.webkit.messageHandlers.external.postMessage(msg); - } - } catch(e) { - console.warn('\n%c⚠️ Browser Environment Detected %c\n\n%cOnly UI previews are available in the browser. For full functionality, please run the application in desktop mode.\nMore information at: https://v3.wails.io/learn/build/#using-a-browser-for-development\n', - 'background: #ffffff; color: #000000; font-weight: bold; padding: 4px 8px; border-radius: 4px; border: 2px solid #000000;', - 'background: transparent;', - 'color: #ffffff; font-style: italic; font-weight: bold;'); - } - return null; -})(); - -export function invoke(msg) { - if (!_invoke) return; - return _invoke(msg); -} - -/** - * @function - * Retrieves the system dark mode status. - * @returns {Promise} - A promise that resolves to a boolean value indicating if the system is in dark mode. - */ -export function IsDarkMode() { - return call(systemIsDarkMode); -} - -/** - * Fetches the capabilities of the application from the server. - * - * @async - * @function Capabilities - * @returns {Promise} A promise that resolves to an object containing the capabilities. - */ -export function Capabilities() { - let response = fetch("/wails/capabilities"); - return response.json(); -} - -/** - * @typedef {Object} OSInfo - * @property {string} Branding - The branding of the OS. - * @property {string} ID - The ID of the OS. - * @property {string} Name - The name of the OS. - * @property {string} Version - The version of the OS. - */ - -/** - * @typedef {Object} EnvironmentInfo - * @property {string} Arch - The architecture of the system. - * @property {boolean} Debug - True if the application is running in debug mode, otherwise false. - * @property {string} OS - The operating system in use. - * @property {OSInfo} OSInfo - Details of the operating system. - * @property {Object} PlatformInfo - Additional platform information. - */ - -/** - * @function - * Retrieves environment details. - * @returns {Promise} - A promise that resolves to an object containing OS and system architecture. - */ -export function Environment() { - return call(environment); -} - -/** - * Checks if the current operating system is Windows. - * - * @return {boolean} True if the operating system is Windows, otherwise false. - */ -export function IsWindows() { - return window._wails.environment.OS === "windows"; -} - -/** - * Checks if the current operating system is Linux. - * - * @returns {boolean} Returns true if the current operating system is Linux, false otherwise. - */ -export function IsLinux() { - return window._wails.environment.OS === "linux"; -} - -/** - * Checks if the current environment is a macOS operating system. - * - * @returns {boolean} True if the environment is macOS, false otherwise. - */ -export function IsMac() { - return window._wails.environment.OS === "darwin"; -} - -/** - * Checks if the current environment architecture is AMD64. - * @returns {boolean} True if the current environment architecture is AMD64, false otherwise. - */ -export function IsAMD64() { - return window._wails.environment.Arch === "amd64"; -} - -/** - * Checks if the current architecture is ARM. - * - * @returns {boolean} True if the current architecture is ARM, false otherwise. - */ -export function IsARM() { - return window._wails.environment.Arch === "arm"; -} - -/** - * Checks if the current environment is ARM64 architecture. - * - * @returns {boolean} - Returns true if the environment is ARM64 architecture, otherwise returns false. - */ -export function IsARM64() { - return window._wails.environment.Arch === "arm64"; -} - -export function IsDebug() { - return window._wails.environment.Debug === true; -} - diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/system.ts b/v3/internal/runtime/desktop/@wailsio/runtime/src/system.ts new file mode 100644 index 000000000..444c49ef2 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/src/system.ts @@ -0,0 +1,156 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ + +import { newRuntimeCaller, objectNames } from "./runtime.js"; + +let call = newRuntimeCaller(objectNames.System); + +const SystemIsDarkMode = 0; +const SystemEnvironment = 1; + +const _invoke = (function () { + try { + if ((window as any).chrome?.webview?.postMessage) { + return (window as any).chrome.webview.postMessage.bind((window as any).chrome.webview); + } else if ((window as any).webkit?.messageHandlers?.['external']?.postMessage) { + return (window as any).webkit.messageHandlers['external'].postMessage.bind((window as any).webkit.messageHandlers['external']); + } + } catch(e) {} + + console.warn('\n%c⚠️ Browser Environment Detected %c\n\n%cOnly UI previews are available in the browser. For full functionality, please run the application in desktop mode.\nMore information at: https://v3.wails.io/learn/build/#using-a-browser-for-development\n', + 'background: #ffffff; color: #000000; font-weight: bold; padding: 4px 8px; border-radius: 4px; border: 2px solid #000000;', + 'background: transparent;', + 'color: #ffffff; font-style: italic; font-weight: bold;'); + return null; +})(); + +export function invoke(msg: any): void { + return _invoke?.(msg); +} + +/** + * Retrieves the system dark mode status. + * + * @returns A promise that resolves to a boolean value indicating if the system is in dark mode. + */ +export function IsDarkMode(): Promise { + return call(SystemIsDarkMode); +} + +/** + * Fetches the capabilities of the application from the server. + * + * @returns A promise that resolves to an object containing the capabilities. + */ +export async function Capabilities(): Promise> { + let response = await fetch("/wails/capabilities"); + if (response.ok) { + return response.json(); + } else { + throw new Error("could not fetch capabilities: " + response.statusText); + } +} + +export interface OSInfo { + /** The branding of the OS. */ + Branding: string; + /** The ID of the OS. */ + ID: string; + /** The name of the OS. */ + Name: string; + /** The version of the OS. */ + Version: string; +} + +export interface EnvironmentInfo { + /** The architecture of the system. */ + Arch: string; + /** True if the application is running in debug mode, otherwise false. */ + Debug: boolean; + /** The operating system in use. */ + OS: string; + /** Details of the operating system. */ + OSInfo: OSInfo; + /** Additional platform information. */ + PlatformInfo: Record; +} + +/** + * Retrieves environment details. + * + * @returns A promise that resolves to an object containing OS and system architecture. + */ +export function Environment(): Promise { + return call(SystemEnvironment); +} + +/** + * Checks if the current operating system is Windows. + * + * @return True if the operating system is Windows, otherwise false. + */ +export function IsWindows(): boolean { + return window._wails.environment.OS === "windows"; +} + +/** + * Checks if the current operating system is Linux. + * + * @returns Returns true if the current operating system is Linux, false otherwise. + */ +export function IsLinux(): boolean { + return window._wails.environment.OS === "linux"; +} + +/** + * Checks if the current environment is a macOS operating system. + * + * @returns True if the environment is macOS, false otherwise. + */ +export function IsMac(): boolean { + return window._wails.environment.OS === "darwin"; +} + +/** + * Checks if the current environment architecture is AMD64. + * + * @returns True if the current environment architecture is AMD64, false otherwise. + */ +export function IsAMD64(): boolean { + return window._wails.environment.Arch === "amd64"; +} + +/** + * Checks if the current architecture is ARM. + * + * @returns True if the current architecture is ARM, false otherwise. + */ +export function IsARM(): boolean { + return window._wails.environment.Arch === "arm"; +} + +/** + * Checks if the current environment is ARM64 architecture. + * + * @returns Returns true if the environment is ARM64 architecture, otherwise returns false. + */ +export function IsARM64(): boolean { + return window._wails.environment.Arch === "arm64"; +} + +/** + * Reports whether the app is being run in debug mode. + * + * @returns True if the app is being run in debug mode. + */ +export function IsDebug(): boolean { + return Boolean(window._wails.environment.Debug); +} + diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/utils.js b/v3/internal/runtime/desktop/@wailsio/runtime/src/utils.ts similarity index 85% rename from v3/internal/runtime/desktop/@wailsio/runtime/src/utils.js rename to v3/internal/runtime/desktop/@wailsio/runtime/src/utils.ts index b11035a54..2562d2fb6 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/src/utils.js +++ b/v3/internal/runtime/desktop/@wailsio/runtime/src/utils.ts @@ -10,10 +10,10 @@ The electron alternative for Go /** * Logs a message to the console with custom formatting. - * @param {string} message - The message to be logged. - * @return {void} + * + * @param message - The message to be logged. */ -export function debugLog(message) { +export function debugLog(message: any) { // eslint-disable-next-line console.log( '%c wails3 %c ' + message + ' ', @@ -22,11 +22,17 @@ export function debugLog(message) { ); } +/** + * Checks whether the webview supports the {@link MouseEvent#buttons} property. + * Looking at you macOS High Sierra! + */ +export function canTrackButtons(): boolean { + return (new MouseEvent('mousedown')).buttons === 0; +} + /** * Checks whether the browser supports removing listeners by triggering an AbortSignal - * (see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#signal) - * - * @return {boolean} + * (see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#signal). */ export function canAbortListeners() { if (!EventTarget || !AbortSignal || !AbortController) @@ -75,9 +81,9 @@ export function canAbortListeners() { ***/ let isReady = false; -document.addEventListener('DOMContentLoaded', () => isReady = true); +document.addEventListener('DOMContentLoaded', () => { isReady = true }); -export function whenReady(callback) { +export function whenReady(callback: () => void) { if (isReady || document.readyState === 'complete') { callback(); } else { diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/window.js b/v3/internal/runtime/desktop/@wailsio/runtime/src/window.js deleted file mode 100644 index b02729974..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/src/window.js +++ /dev/null @@ -1,638 +0,0 @@ -/* - _ __ _ __ -| | / /___ _(_) /____ -| | /| / / __ `/ / / ___/ -| |/ |/ / /_/ / / (__ ) -|__/|__/\__,_/_/_/____/ -The electron alternative for Go -(c) Lea Anthony 2019-present -*/ - -/* jshint esversion: 9 */ - -// Import screen jsdoc definition from ./screens.js -/** - * @typedef {import("./screens").Screen} Screen - */ - - -/** - * A record describing the position of a window. - * - * @typedef {Object} Position - * @property {number} x - The horizontal position of the window - * @property {number} y - The vertical position of the window - */ - - -/** - * A record describing the size of a window. - * - * @typedef {Object} Size - * @property {number} width - The width of the window - * @property {number} height - The height of the window - */ - - -import {newRuntimeCallerWithID, objectNames} from "./runtime"; - -const PositionMethod = 0; -const CenterMethod = 1; -const CloseMethod = 2; -const DisableSizeConstraintsMethod = 3; -const EnableSizeConstraintsMethod = 4; -const FocusMethod = 5; -const ForceReloadMethod = 6; -const FullscreenMethod = 7; -const GetScreenMethod = 8; -const GetZoomMethod = 9; -const HeightMethod = 10; -const HideMethod = 11; -const IsFocusedMethod = 12; -const IsFullscreenMethod = 13; -const IsMaximisedMethod = 14; -const IsMinimisedMethod = 15; -const MaximiseMethod = 16; -const MinimiseMethod = 17; -const NameMethod = 18; -const OpenDevToolsMethod = 19; -const RelativePositionMethod = 20; -const ReloadMethod = 21; -const ResizableMethod = 22; -const RestoreMethod = 23; -const SetPositionMethod = 24; -const SetAlwaysOnTopMethod = 25; -const SetBackgroundColourMethod = 26; -const SetFramelessMethod = 27; -const SetFullscreenButtonEnabledMethod = 28; -const SetMaxSizeMethod = 29; -const SetMinSizeMethod = 30; -const SetRelativePositionMethod = 31; -const SetResizableMethod = 32; -const SetSizeMethod = 33; -const SetTitleMethod = 34; -const SetZoomMethod = 35; -const ShowMethod = 36; -const SizeMethod = 37; -const ToggleFullscreenMethod = 38; -const ToggleMaximiseMethod = 39; -const UnFullscreenMethod = 40; -const UnMaximiseMethod = 41; -const UnMinimiseMethod = 42; -const WidthMethod = 43; -const ZoomMethod = 44; -const ZoomInMethod = 45; -const ZoomOutMethod = 46; -const ZoomResetMethod = 47; - -/** - * @type {symbol} - */ -const caller = Symbol(); - -export class Window { - /** - * Initialises a window object with the specified name. - * - * @private - * @param {string} name - The name of the target window. - */ - constructor(name = '') { - /** - * @private - * @name {@link caller} - * @type {(...args: any[]) => any} - */ - this[caller] = newRuntimeCallerWithID(objectNames.Window, name) - - // bind instance method to make them easily usable in event handlers - for (const method of Object.getOwnPropertyNames(Window.prototype)) { - if ( - method !== "constructor" - && typeof this[method] === "function" - ) { - this[method] = this[method].bind(this); - } - } - } - - /** - * Gets the specified window. - * - * @public - * @param {string} name - The name of the window to get. - * @return {Window} - The corresponding window object. - */ - Get(name) { - return new Window(name); - } - - /** - * Returns the absolute position of the window. - * - * @public - * @return {Promise} - The current absolute position of the window. - */ - Position() { - return this[caller](PositionMethod); - } - - /** - * Centers the window on the screen. - * - * @public - * @return {Promise} - */ - Center() { - return this[caller](CenterMethod); - } - - /** - * Closes the window. - * - * @public - * @return {Promise} - */ - Close() { - return this[caller](CloseMethod); - } - - /** - * Disables min/max size constraints. - * - * @public - * @return {Promise} - */ - DisableSizeConstraints() { - return this[caller](DisableSizeConstraintsMethod); - } - - /** - * Enables min/max size constraints. - * - * @public - * @return {Promise} - */ - EnableSizeConstraints() { - return this[caller](EnableSizeConstraintsMethod); - } - - /** - * Focuses the window. - * - * @public - * @return {Promise} - */ - Focus() { - return this[caller](FocusMethod); - } - - /** - * Forces the window to reload the page assets. - * - * @public - * @return {Promise} - */ - ForceReload() { - return this[caller](ForceReloadMethod); - } - - /** - * Doc. - * - * @public - * @return {Promise} - */ - Fullscreen() { - return this[caller](FullscreenMethod); - } - - /** - * Returns the screen that the window is on. - * - * @public - * @return {Promise} - The screen the window is currently on - */ - GetScreen() { - return this[caller](GetScreenMethod); - } - - /** - * Returns the current zoom level of the window. - * - * @public - * @return {Promise} - The current zoom level - */ - GetZoom() { - return this[caller](GetZoomMethod); - } - - /** - * Returns the height of the window. - * - * @public - * @return {Promise} - The current height of the window - */ - Height() { - return this[caller](HeightMethod); - } - - /** - * Hides the window. - * - * @public - * @return {Promise} - */ - Hide() { - return this[caller](HideMethod); - } - - /** - * Returns true if the window is focused. - * - * @public - * @return {Promise} - Whether the window is currently focused - */ - IsFocused() { - return this[caller](IsFocusedMethod); - } - - /** - * Returns true if the window is fullscreen. - * - * @public - * @return {Promise} - Whether the window is currently fullscreen - */ - IsFullscreen() { - return this[caller](IsFullscreenMethod); - } - - /** - * Returns true if the window is maximised. - * - * @public - * @return {Promise} - Whether the window is currently maximised - */ - IsMaximised() { - return this[caller](IsMaximisedMethod); - } - - /** - * Returns true if the window is minimised. - * - * @public - * @return {Promise} - Whether the window is currently minimised - */ - IsMinimised() { - return this[caller](IsMinimisedMethod); - } - - /** - * Maximises the window. - * - * @public - * @return {Promise} - */ - Maximise() { - return this[caller](MaximiseMethod); - } - - /** - * Minimises the window. - * - * @public - * @return {Promise} - */ - Minimise() { - return this[caller](MinimiseMethod); - } - - /** - * Returns the name of the window. - * - * @public - * @return {Promise} - The name of the window - */ - Name() { - return this[caller](NameMethod); - } - - /** - * Opens the development tools pane. - * - * @public - * @return {Promise} - */ - OpenDevTools() { - return this[caller](OpenDevToolsMethod); - } - - /** - * Returns the relative position of the window to the screen. - * - * @public - * @return {Promise} - The current relative position of the window - */ - RelativePosition() { - return this[caller](RelativePositionMethod); - } - - /** - * Reloads the page assets. - * - * @public - * @return {Promise} - */ - Reload() { - return this[caller](ReloadMethod); - } - - /** - * Returns true if the window is resizable. - * - * @public - * @return {Promise} - Whether the window is currently resizable - */ - Resizable() { - return this[caller](ResizableMethod); - } - - /** - * Restores the window to its previous state if it was previously minimised, maximised or fullscreen. - * - * @public - * @return {Promise} - */ - Restore() { - return this[caller](RestoreMethod); - } - - /** - * Sets the absolute position of the window. - * - * @public - * @param {number} x - The desired horizontal absolute position of the window - * @param {number} y - The desired vertical absolute position of the window - * @return {Promise} - */ - SetPosition(x, y) { - return this[caller](SetPositionMethod, { x, y }); - } - - /** - * Sets the window to be always on top. - * - * @public - * @param {boolean} alwaysOnTop - Whether the window should stay on top - * @return {Promise} - */ - SetAlwaysOnTop(alwaysOnTop) { - return this[caller](SetAlwaysOnTopMethod, { alwaysOnTop }); - } - - /** - * Sets the background colour of the window. - * - * @public - * @param {number} r - The desired red component of the window background - * @param {number} g - The desired green component of the window background - * @param {number} b - The desired blue component of the window background - * @param {number} a - The desired alpha component of the window background - * @return {Promise} - */ - SetBackgroundColour(r, g, b, a) { - return this[caller](SetBackgroundColourMethod, { r, g, b, a }); - } - - /** - * Removes the window frame and title bar. - * - * @public - * @param {boolean} frameless - Whether the window should be frameless - * @return {Promise} - */ - SetFrameless(frameless) { - return this[caller](SetFramelessMethod, { frameless }); - } - - /** - * Disables the system fullscreen button. - * - * @public - * @param {boolean} enabled - Whether the fullscreen button should be enabled - * @return {Promise} - */ - SetFullscreenButtonEnabled(enabled) { - return this[caller](SetFullscreenButtonEnabledMethod, { enabled }); - } - - /** - * Sets the maximum size of the window. - * - * @public - * @param {number} width - The desired maximum width of the window - * @param {number} height - The desired maximum height of the window - * @return {Promise} - */ - SetMaxSize(width, height) { - return this[caller](SetMaxSizeMethod, { width, height }); - } - - /** - * Sets the minimum size of the window. - * - * @public - * @param {number} width - The desired minimum width of the window - * @param {number} height - The desired minimum height of the window - * @return {Promise} - */ - SetMinSize(width, height) { - return this[caller](SetMinSizeMethod, { width, height }); - } - - /** - * Sets the relative position of the window to the screen. - * - * @public - * @param {number} x - The desired horizontal relative position of the window - * @param {number} y - The desired vertical relative position of the window - * @return {Promise} - */ - SetRelativePosition(x, y) { - return this[caller](SetRelativePositionMethod, { x, y }); - } - - /** - * Sets whether the window is resizable. - * - * @public - * @param {boolean} resizable - Whether the window should be resizable - * @return {Promise} - */ - SetResizable(resizable) { - return this[caller](SetResizableMethod, { resizable }); - } - - /** - * Sets the size of the window. - * - * @public - * @param {number} width - The desired width of the window - * @param {number} height - The desired height of the window - * @return {Promise} - */ - SetSize(width, height) { - return this[caller](SetSizeMethod, { width, height }); - } - - /** - * Sets the title of the window. - * - * @public - * @param {string} title - The desired title of the window - * @return {Promise} - */ - SetTitle(title) { - return this[caller](SetTitleMethod, { title }); - } - - /** - * Sets the zoom level of the window. - * - * @public - * @param {number} zoom - The desired zoom level - * @return {Promise} - */ - SetZoom(zoom) { - return this[caller](SetZoomMethod, { zoom }); - } - - /** - * Shows the window. - * - * @public - * @return {Promise} - */ - Show() { - return this[caller](ShowMethod); - } - - /** - * Returns the size of the window. - * - * @public - * @return {Promise} - The current size of the window - */ - Size() { - return this[caller](SizeMethod); - } - - /** - * Toggles the window between fullscreen and normal. - * - * @public - * @return {Promise} - */ - ToggleFullscreen() { - return this[caller](ToggleFullscreenMethod); - } - - /** - * Toggles the window between maximised and normal. - * - * @public - * @return {Promise} - */ - ToggleMaximise() { - return this[caller](ToggleMaximiseMethod); - } - - /** - * Un-fullscreens the window. - * - * @public - * @return {Promise} - */ - UnFullscreen() { - return this[caller](UnFullscreenMethod); - } - - /** - * Un-maximises the window. - * - * @public - * @return {Promise} - */ - UnMaximise() { - return this[caller](UnMaximiseMethod); - } - - /** - * Un-minimises the window. - * - * @public - * @return {Promise} - */ - UnMinimise() { - return this[caller](UnMinimiseMethod); - } - - /** - * Returns the width of the window. - * - * @public - * @return {Promise} - The current width of the window - */ - Width() { - return this[caller](WidthMethod); - } - - /** - * Zooms the window. - * - * @public - * @return {Promise} - */ - Zoom() { - return this[caller](ZoomMethod); - } - - /** - * Increases the zoom level of the webview content. - * - * @public - * @return {Promise} - */ - ZoomIn() { - return this[caller](ZoomInMethod); - } - - /** - * Decreases the zoom level of the webview content. - * - * @public - * @return {Promise} - */ - ZoomOut() { - return this[caller](ZoomOutMethod); - } - - /** - * Resets the zoom level of the webview content. - * - * @public - * @return {Promise} - */ - ZoomReset() { - return this[caller](ZoomResetMethod); - } -} - -/** - * The window within which the script is running. - * - * @type {Window} - */ -const thisWindow = new Window(''); - -export default thisWindow; diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/window.ts b/v3/internal/runtime/desktop/@wailsio/runtime/src/window.ts new file mode 100644 index 000000000..10bef1f08 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/src/window.ts @@ -0,0 +1,520 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ + +import {newRuntimeCaller, objectNames} from "./runtime.js"; +import type { Screen } from "./screens.js"; + +const PositionMethod = 0; +const CenterMethod = 1; +const CloseMethod = 2; +const DisableSizeConstraintsMethod = 3; +const EnableSizeConstraintsMethod = 4; +const FocusMethod = 5; +const ForceReloadMethod = 6; +const FullscreenMethod = 7; +const GetScreenMethod = 8; +const GetZoomMethod = 9; +const HeightMethod = 10; +const HideMethod = 11; +const IsFocusedMethod = 12; +const IsFullscreenMethod = 13; +const IsMaximisedMethod = 14; +const IsMinimisedMethod = 15; +const MaximiseMethod = 16; +const MinimiseMethod = 17; +const NameMethod = 18; +const OpenDevToolsMethod = 19; +const RelativePositionMethod = 20; +const ReloadMethod = 21; +const ResizableMethod = 22; +const RestoreMethod = 23; +const SetPositionMethod = 24; +const SetAlwaysOnTopMethod = 25; +const SetBackgroundColourMethod = 26; +const SetFramelessMethod = 27; +const SetFullscreenButtonEnabledMethod = 28; +const SetMaxSizeMethod = 29; +const SetMinSizeMethod = 30; +const SetRelativePositionMethod = 31; +const SetResizableMethod = 32; +const SetSizeMethod = 33; +const SetTitleMethod = 34; +const SetZoomMethod = 35; +const ShowMethod = 36; +const SizeMethod = 37; +const ToggleFullscreenMethod = 38; +const ToggleMaximiseMethod = 39; +const UnFullscreenMethod = 40; +const UnMaximiseMethod = 41; +const UnMinimiseMethod = 42; +const WidthMethod = 43; +const ZoomMethod = 44; +const ZoomInMethod = 45; +const ZoomOutMethod = 46; +const ZoomResetMethod = 47; + +/** + * A record describing the position of a window. + */ +interface Position { + /** The horizontal position of the window. */ + x: number; + /** The vertical position of the window. */ + y: number; +} + +/** + * A record describing the size of a window. + */ +interface Size { + /** The width of the window. */ + width: number; + /** The height of the window. */ + height: number; +} + +// Private field names. +const callerSym = Symbol("caller"); + +class Window { + // Private fields. + private [callerSym]: (message: number, args?: any) => Promise; + + /** + * Initialises a window object with the specified name. + * + * @private + * @param name - The name of the target window. + */ + constructor(name: string = '') { + this[callerSym] = newRuntimeCaller(objectNames.Window, name) + + // bind instance method to make them easily usable in event handlers + for (const method of Object.getOwnPropertyNames(Window.prototype)) { + if ( + method !== "constructor" + && typeof (this as any)[method] === "function" + ) { + (this as any)[method] = (this as any)[method].bind(this); + } + } + } + + /** + * Gets the specified window. + * + * @param name - The name of the window to get. + * @returns The corresponding window object. + */ + Get(name: string): Window { + return new Window(name); + } + + /** + * Returns the absolute position of the window. + * + * @returns The current absolute position of the window. + */ + Position(): Promise { + return this[callerSym](PositionMethod); + } + + /** + * Centers the window on the screen. + */ + Center(): Promise { + return this[callerSym](CenterMethod); + } + + /** + * Closes the window. + */ + Close(): Promise { + return this[callerSym](CloseMethod); + } + + /** + * Disables min/max size constraints. + */ + DisableSizeConstraints(): Promise { + return this[callerSym](DisableSizeConstraintsMethod); + } + + /** + * Enables min/max size constraints. + */ + EnableSizeConstraints(): Promise { + return this[callerSym](EnableSizeConstraintsMethod); + } + + /** + * Focuses the window. + */ + Focus(): Promise { + return this[callerSym](FocusMethod); + } + + /** + * Forces the window to reload the page assets. + */ + ForceReload(): Promise { + return this[callerSym](ForceReloadMethod); + } + + /** + * Switches the window to fullscreen mode. + */ + Fullscreen(): Promise { + return this[callerSym](FullscreenMethod); + } + + /** + * Returns the screen that the window is on. + * + * @returns The screen the window is currently on. + */ + GetScreen(): Promise { + return this[callerSym](GetScreenMethod); + } + + /** + * Returns the current zoom level of the window. + * + * @returns The current zoom level. + */ + GetZoom(): Promise { + return this[callerSym](GetZoomMethod); + } + + /** + * Returns the height of the window. + * + * @returns The current height of the window. + */ + Height(): Promise { + return this[callerSym](HeightMethod); + } + + /** + * Hides the window. + */ + Hide(): Promise { + return this[callerSym](HideMethod); + } + + /** + * Returns true if the window is focused. + * + * @returns Whether the window is currently focused. + */ + IsFocused(): Promise { + return this[callerSym](IsFocusedMethod); + } + + /** + * Returns true if the window is fullscreen. + * + * @returns Whether the window is currently fullscreen. + */ + IsFullscreen(): Promise { + return this[callerSym](IsFullscreenMethod); + } + + /** + * Returns true if the window is maximised. + * + * @returns Whether the window is currently maximised. + */ + IsMaximised(): Promise { + return this[callerSym](IsMaximisedMethod); + } + + /** + * Returns true if the window is minimised. + * + * @returns Whether the window is currently minimised. + */ + IsMinimised(): Promise { + return this[callerSym](IsMinimisedMethod); + } + + /** + * Maximises the window. + */ + Maximise(): Promise { + return this[callerSym](MaximiseMethod); + } + + /** + * Minimises the window. + */ + Minimise(): Promise { + return this[callerSym](MinimiseMethod); + } + + /** + * Returns the name of the window. + * + * @returns The name of the window. + */ + Name(): Promise { + return this[callerSym](NameMethod); + } + + /** + * Opens the development tools pane. + */ + OpenDevTools(): Promise { + return this[callerSym](OpenDevToolsMethod); + } + + /** + * Returns the relative position of the window to the screen. + * + * @returns The current relative position of the window. + */ + RelativePosition(): Promise { + return this[callerSym](RelativePositionMethod); + } + + /** + * Reloads the page assets. + */ + Reload(): Promise { + return this[callerSym](ReloadMethod); + } + + /** + * Returns true if the window is resizable. + * + * @returns Whether the window is currently resizable. + */ + Resizable(): Promise { + return this[callerSym](ResizableMethod); + } + + /** + * Restores the window to its previous state if it was previously minimised, maximised or fullscreen. + */ + Restore(): Promise { + return this[callerSym](RestoreMethod); + } + + /** + * Sets the absolute position of the window. + * + * @param x - The desired horizontal absolute position of the window. + * @param y - The desired vertical absolute position of the window. + */ + SetPosition(x: number, y: number): Promise { + return this[callerSym](SetPositionMethod, { x, y }); + } + + /** + * Sets the window to be always on top. + * + * @param alwaysOnTop - Whether the window should stay on top. + */ + SetAlwaysOnTop(alwaysOnTop: boolean): Promise { + return this[callerSym](SetAlwaysOnTopMethod, { alwaysOnTop }); + } + + /** + * Sets the background colour of the window. + * + * @param r - The desired red component of the window background. + * @param g - The desired green component of the window background. + * @param b - The desired blue component of the window background. + * @param a - The desired alpha component of the window background. + */ + SetBackgroundColour(r: number, g: number, b: number, a: number): Promise { + return this[callerSym](SetBackgroundColourMethod, { r, g, b, a }); + } + + /** + * Removes the window frame and title bar. + * + * @param frameless - Whether the window should be frameless. + */ + SetFrameless(frameless: boolean): Promise { + return this[callerSym](SetFramelessMethod, { frameless }); + } + + /** + * Disables the system fullscreen button. + * + * @param enabled - Whether the fullscreen button should be enabled. + */ + SetFullscreenButtonEnabled(enabled: boolean): Promise { + return this[callerSym](SetFullscreenButtonEnabledMethod, { enabled }); + } + + /** + * Sets the maximum size of the window. + * + * @param width - The desired maximum width of the window. + * @param height - The desired maximum height of the window. + */ + SetMaxSize(width: number, height: number): Promise { + return this[callerSym](SetMaxSizeMethod, { width, height }); + } + + /** + * Sets the minimum size of the window. + * + * @param width - The desired minimum width of the window. + * @param height - The desired minimum height of the window. + */ + SetMinSize(width: number, height: number): Promise { + return this[callerSym](SetMinSizeMethod, { width, height }); + } + + /** + * Sets the relative position of the window to the screen. + * + * @param x - The desired horizontal relative position of the window. + * @param y - The desired vertical relative position of the window. + */ + SetRelativePosition(x: number, y: number): Promise { + return this[callerSym](SetRelativePositionMethod, { x, y }); + } + + /** + * Sets whether the window is resizable. + * + * @param resizable - Whether the window should be resizable. + */ + SetResizable(resizable: boolean): Promise { + return this[callerSym](SetResizableMethod, { resizable }); + } + + /** + * Sets the size of the window. + * + * @param width - The desired width of the window. + * @param height - The desired height of the window. + */ + SetSize(width: number, height: number): Promise { + return this[callerSym](SetSizeMethod, { width, height }); + } + + /** + * Sets the title of the window. + * + * @param title - The desired title of the window. + */ + SetTitle(title: string): Promise { + return this[callerSym](SetTitleMethod, { title }); + } + + /** + * Sets the zoom level of the window. + * + * @param zoom - The desired zoom level. + */ + SetZoom(zoom: number): Promise { + return this[callerSym](SetZoomMethod, { zoom }); + } + + /** + * Shows the window. + */ + Show(): Promise { + return this[callerSym](ShowMethod); + } + + /** + * Returns the size of the window. + * + * @returns The current size of the window. + */ + Size(): Promise { + return this[callerSym](SizeMethod); + } + + /** + * Toggles the window between fullscreen and normal. + */ + ToggleFullscreen(): Promise { + return this[callerSym](ToggleFullscreenMethod); + } + + /** + * Toggles the window between maximised and normal. + */ + ToggleMaximise(): Promise { + return this[callerSym](ToggleMaximiseMethod); + } + + /** + * Un-fullscreens the window. + */ + UnFullscreen(): Promise { + return this[callerSym](UnFullscreenMethod); + } + + /** + * Un-maximises the window. + */ + UnMaximise(): Promise { + return this[callerSym](UnMaximiseMethod); + } + + /** + * Un-minimises the window. + */ + UnMinimise(): Promise { + return this[callerSym](UnMinimiseMethod); + } + + /** + * Returns the width of the window. + * + * @returns The current width of the window. + */ + Width(): Promise { + return this[callerSym](WidthMethod); + } + + /** + * Zooms the window. + */ + Zoom(): Promise { + return this[callerSym](ZoomMethod); + } + + /** + * Increases the zoom level of the webview content. + */ + ZoomIn(): Promise { + return this[callerSym](ZoomInMethod); + } + + /** + * Decreases the zoom level of the webview content. + */ + ZoomOut(): Promise { + return this[callerSym](ZoomOutMethod); + } + + /** + * Resets the zoom level of the webview content. + */ + ZoomReset(): Promise { + return this[callerSym](ZoomResetMethod); + } +} + +/** + * The window within which the script is running. + */ +const thisWindow = new Window(''); + +export default thisWindow; diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/wml.js b/v3/internal/runtime/desktop/@wailsio/runtime/src/wml.js deleted file mode 100644 index 819758514..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/src/wml.js +++ /dev/null @@ -1,250 +0,0 @@ -/* - _ __ _ __ -| | / /___ _(_) /____ -| | /| / / __ `/ / / ___/ -| |/ |/ / /_/ / / (__ ) -|__/|__/\__,_/_/_/____/ -The electron alternative for Go -(c) Lea Anthony 2019-present -*/ - -import {OpenURL} from "./browser"; -import {Question} from "./dialogs"; -import {Emit, WailsEvent} from "./events"; -import {canAbortListeners, whenReady} from "./utils"; -import Window from "./window"; - -/** - * Sends an event with the given name and optional data. - * - * @param {string} eventName - The name of the event to send. - * @param {any} [data=null] - Optional data to send along with the event. - * - * @return {void} - */ -function sendEvent(eventName, data=null) { - Emit(new WailsEvent(eventName, data)); -} - -/** - * Calls a method on a specified window. - * @param {string} windowName - The name of the window to call the method on. - * @param {string} methodName - The name of the method to call. - */ -function callWindowMethod(windowName, methodName) { - const targetWindow = Window.Get(windowName); - const method = targetWindow[methodName]; - - if (typeof method !== "function") { - console.error(`Window method '${methodName}' not found`); - return; - } - - try { - method.call(targetWindow); - } catch (e) { - console.error(`Error calling window method '${methodName}': `, e); - } -} - -/** - * Responds to a triggering event by running appropriate WML actions for the current target - * - * @param {Event} ev - * @return {void} - */ -function onWMLTriggered(ev) { - const element = ev.currentTarget; - - function runEffect(choice = "Yes") { - if (choice !== "Yes") - return; - - const eventType = element.getAttribute('data-wml-event'); - const targetWindow = element.getAttribute('data-wml-target-window') || ""; - const windowMethod = element.getAttribute('data-wml-window'); - const url = element.getAttribute('data-wml-openURL'); - - if (eventType !== null) - sendEvent(eventType); - if (windowMethod !== null) - callWindowMethod(targetWindow, windowMethod); - if (url !== null) - void OpenURL(url); - } - - const confirm = element.getAttribute('data-wml-confirm'); - - if (confirm) { - Question({ - Title: "Confirm", - Message: confirm, - Detached: false, - Buttons: [ - { Label: "Yes" }, - { Label: "No", IsDefault: true } - ] - }).then(runEffect); - } else { - runEffect(); - } -} - -/** - * @type {symbol} - */ -const controller = Symbol(); - -/** - * AbortControllerRegistry does not actually remember active event listeners: instead - * it ties them to an AbortSignal and uses an AbortController to remove them all at once. - */ -class AbortControllerRegistry { - constructor() { - /** - * Stores the AbortController that can be used to remove all currently active listeners. - * - * @private - * @name {@link controller} - * @member {AbortController} - */ - this[controller] = new AbortController(); - } - - /** - * Returns an options object for addEventListener that ties the listener - * to the AbortSignal from the current AbortController. - * - * @param {HTMLElement} element An HTML element - * @param {string[]} triggers The list of active WML trigger events for the specified elements - * @returns {AddEventListenerOptions} - */ - set(element, triggers) { - return { signal: this[controller].signal }; - } - - /** - * Removes all registered event listeners. - * - * @returns {void} - */ - reset() { - this[controller].abort(); - this[controller] = new AbortController(); - } -} - -/** - * @type {symbol} - */ -const triggerMap = Symbol(); - -/** - * @type {symbol} - */ -const elementCount = Symbol(); - -/** - * WeakMapRegistry maps active trigger events to each DOM element through a WeakMap. - * This ensures that the mapping remains private to this module, while still allowing garbage - * collection of the involved elements. - */ -class WeakMapRegistry { - constructor() { - /** - * Stores the current element-to-trigger mapping. - * - * @private - * @name {@link triggerMap} - * @member {WeakMap} - */ - this[triggerMap] = new WeakMap(); - - /** - * Counts the number of elements with active WML triggers. - * - * @private - * @name {@link elementCount} - * @member {number} - */ - this[elementCount] = 0; - } - - /** - * Sets the active triggers for the specified element. - * - * @param {HTMLElement} element An HTML element - * @param {string[]} triggers The list of active WML trigger events for the specified element - * @returns {AddEventListenerOptions} - */ - set(element, triggers) { - this[elementCount] += !this[triggerMap].has(element); - this[triggerMap].set(element, triggers); - return {}; - } - - /** - * Removes all registered event listeners. - * - * @returns {void} - */ - reset() { - if (this[elementCount] <= 0) - return; - - for (const element of document.body.querySelectorAll('*')) { - if (this[elementCount] <= 0) - break; - - const triggers = this[triggerMap].get(element); - this[elementCount] -= (typeof triggers !== "undefined"); - - for (const trigger of triggers || []) - element.removeEventListener(trigger, onWMLTriggered); - } - - this[triggerMap] = new WeakMap(); - this[elementCount] = 0; - } -} - -const triggerRegistry = canAbortListeners() ? new AbortControllerRegistry() : new WeakMapRegistry(); - -/** - * Adds event listeners to the specified element. - * - * @param {HTMLElement} element - * @return {void} - */ -function addWMLListeners(element) { - const triggerRegExp = /\S+/g; - const triggerAttr = (element.getAttribute('data-wml-trigger') || "click"); - const triggers = []; - - let match; - while ((match = triggerRegExp.exec(triggerAttr)) !== null) - triggers.push(match[0]); - - const options = triggerRegistry.set(element, triggers); - for (const trigger of triggers) - element.addEventListener(trigger, onWMLTriggered, options); -} - -/** - * Schedules an automatic reload of WML to be performed as soon as the document is fully loaded. - * - * @return {void} - */ -export function Enable() { - whenReady(Reload); -} - -/** - * Reloads the WML page by adding necessary event listeners and browser listeners. - * - * @return {void} - */ -export function Reload() { - triggerRegistry.reset(); - document.body.querySelectorAll('[data-wml-event], [data-wml-window], [data-wml-openURL]').forEach(addWMLListeners); -} diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/wml.ts b/v3/internal/runtime/desktop/@wailsio/runtime/src/wml.ts new file mode 100644 index 000000000..fad38b6eb --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/src/wml.ts @@ -0,0 +1,209 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ + +import { OpenURL } from "./browser.js"; +import { Question } from "./dialogs.js"; +import { Emit, WailsEvent } from "./events.js"; +import { canAbortListeners, whenReady } from "./utils.js"; +import Window from "./window.js"; + +/** + * Sends an event with the given name and optional data. + * + * @param eventName - - The name of the event to send. + * @param [data=null] - - Optional data to send along with the event. + */ +function sendEvent(eventName: string, data: any = null): void { + Emit(new WailsEvent(eventName, data)); +} + +/** + * Calls a method on a specified window. + * + * @param windowName - The name of the window to call the method on. + * @param methodName - The name of the method to call. + */ +function callWindowMethod(windowName: string, methodName: string) { + const targetWindow = Window.Get(windowName); + const method = (targetWindow as any)[methodName]; + + if (typeof method !== "function") { + console.error(`Window method '${methodName}' not found`); + return; + } + + try { + method.call(targetWindow); + } catch (e) { + console.error(`Error calling window method '${methodName}': `, e); + } +} + +/** + * Responds to a triggering event by running appropriate WML actions for the current target. + */ +function onWMLTriggered(ev: Event): void { + const element = ev.currentTarget as Element; + + function runEffect(choice = "Yes") { + if (choice !== "Yes") + return; + + const eventType = element.getAttribute('wml-event') || element.getAttribute('data-wml-event'); + const targetWindow = element.getAttribute('wml-target-window') || element.getAttribute('data-wml-target-window') || ""; + const windowMethod = element.getAttribute('wml-window') || element.getAttribute('data-wml-window'); + const url = element.getAttribute('wml-openurl') || element.getAttribute('data-wml-openurl'); + + if (eventType !== null) + sendEvent(eventType); + if (windowMethod !== null) + callWindowMethod(targetWindow, windowMethod); + if (url !== null) + void OpenURL(url); + } + + const confirm = element.getAttribute('wml-confirm') || element.getAttribute('data-wml-confirm'); + + if (confirm) { + Question({ + Title: "Confirm", + Message: confirm, + Detached: false, + Buttons: [ + { Label: "Yes" }, + { Label: "No", IsDefault: true } + ] + }).then(runEffect); + } else { + runEffect(); + } +} + +// Private field names. +const controllerSym = Symbol("controller"); +const triggerMapSym = Symbol("triggerMap"); +const elementCountSym = Symbol("elementCount"); + +/** + * AbortControllerRegistry does not actually remember active event listeners: instead + * it ties them to an AbortSignal and uses an AbortController to remove them all at once. + */ +class AbortControllerRegistry { + // Private fields. + [controllerSym]: AbortController; + + constructor() { + this[controllerSym] = new AbortController(); + } + + /** + * Returns an options object for addEventListener that ties the listener + * to the AbortSignal from the current AbortController. + * + * @param element - An HTML element + * @param triggers - The list of active WML trigger events for the specified elements + */ + set(element: Element, triggers: string[]): AddEventListenerOptions { + return { signal: this[controllerSym].signal }; + } + + /** + * Removes all registered event listeners and resets the registry. + */ + reset(): void { + this[controllerSym].abort(); + this[controllerSym] = new AbortController(); + } +} + +/** + * WeakMapRegistry maps active trigger events to each DOM element through a WeakMap. + * This ensures that the mapping remains private to this module, while still allowing garbage + * collection of the involved elements. + */ +class WeakMapRegistry { + /** Stores the current element-to-trigger mapping. */ + [triggerMapSym]: WeakMap; + /** Counts the number of elements with active WML triggers. */ + [elementCountSym]: number; + + constructor() { + this[triggerMapSym] = new WeakMap(); + this[elementCountSym] = 0; + } + + /** + * Sets active triggers for the specified element. + * + * @param element - An HTML element + * @param triggers - The list of active WML trigger events for the specified element + */ + set(element: Element, triggers: string[]): AddEventListenerOptions { + if (!this[triggerMapSym].has(element)) { this[elementCountSym]++; } + this[triggerMapSym].set(element, triggers); + return {}; + } + + /** + * Removes all registered event listeners. + */ + reset(): void { + if (this[elementCountSym] <= 0) + return; + + for (const element of document.body.querySelectorAll('*')) { + if (this[elementCountSym] <= 0) + break; + + const triggers = this[triggerMapSym].get(element); + if (triggers != null) { this[elementCountSym]--; } + + for (const trigger of triggers || []) + element.removeEventListener(trigger, onWMLTriggered); + } + + this[triggerMapSym] = new WeakMap(); + this[elementCountSym] = 0; + } +} + +const triggerRegistry = canAbortListeners() ? new AbortControllerRegistry() : new WeakMapRegistry(); + +/** + * Adds event listeners to the specified element. + */ +function addWMLListeners(element: Element): void { + const triggerRegExp = /\S+/g; + const triggerAttr = (element.getAttribute('wml-trigger') || element.getAttribute('data-wml-trigger') || "click"); + const triggers: string[] = []; + + let match; + while ((match = triggerRegExp.exec(triggerAttr)) !== null) + triggers.push(match[0]); + + const options = triggerRegistry.set(element, triggers); + for (const trigger of triggers) + element.addEventListener(trigger, onWMLTriggered, options); +} + +/** + * Schedules an automatic reload of WML to be performed as soon as the document is fully loaded. + */ +export function Enable(): void { + whenReady(Reload); +} + +/** + * Reloads the WML page by adding necessary event listeners and browser listeners. + */ +export function Reload(): void { + triggerRegistry.reset(); + document.body.querySelectorAll('[wml-event], [wml-window], [wml-openurl], [data-wml-event], [data-wml-window], [data-wml-openurl]').forEach(addWMLListeners); +} diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/tsconfig.json b/v3/internal/runtime/desktop/@wailsio/runtime/tsconfig.json index 2cbc06eed..63db7a091 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/tsconfig.json +++ b/v3/internal/runtime/desktop/@wailsio/runtime/tsconfig.json @@ -1,20 +1,36 @@ { "include": ["./src/**/*"], + "exclude": ["./src/**/*.test.*"], "compilerOptions": { - "lib": [ - "dom", - "dom.iterable", - "esnext" - ], - "allowJs": true, + "composite": true, + + "allowJs": false, + + "noEmitOnError": true, "declaration": true, - "declarationMap": true, - "emitDeclarationOnly": true, - "esModuleInterop": true, - "module": "esnext", - "moduleResolution": "bundler", + "declarationMap": false, + "declarationDir": "types", "outDir": "dist", + "rootDir": "src", + + "target": "ES2015", + "module": "ES2015", + "moduleResolution": "bundler", + "isolatedModules": true, + "verbatimModuleSyntax": true, + "stripInternal": true, + + "lib": [ + "DOM", + "DOM.Iterable", + "ESNext" + ], + "strict": true, - "target": "es6", + "noUnusedLocals": true, + "noUnusedParameters": false, + "noImplicitAny": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true } } \ No newline at end of file diff --git a/v3/tasks/events/generate.go b/v3/tasks/events/generate.go index e643db182..b09b8f028 100644 --- a/v3/tasks/events/generate.go +++ b/v3/tasks/events/generate.go @@ -2,15 +2,12 @@ package main import ( "bytes" - "github.com/Masterminds/semver/v3" - "github.com/tidwall/gjson" - "github.com/tidwall/sjson" "os" "strconv" "strings" ) -var eventsGo = `package events +const eventsGo = `package events type ApplicationEventType uint type WindowEventType uint @@ -64,7 +61,7 @@ $$EVENTTOJS} ` -var darwinEventsH = `//go:build darwin +const darwinEventsH = `//go:build darwin #ifndef _events_h #define _events_h @@ -76,7 +73,7 @@ $$CHEADEREVENTS #endif` -var linuxEventsH = `//go:build linux +const linuxEventsH = `//go:build linux #ifndef _events_h #define _events_h @@ -88,34 +85,32 @@ $$CHEADEREVENTS #endif` -var eventsJS = ` -export const EventTypes = { - Windows: { -$$WINDOWSJSEVENTS }, - Mac: { -$$MACJSEVENTS }, - Linux: { -$$LINUXJSEVENTS }, - Common: { -$$COMMONJSEVENTS }, -}; -` +const eventsTS = `/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ ` + "`" + `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ -var eventsTS = ` -export declare const EventTypes: { - Windows: { -$$WINDOWSTSEVENTS }, - Mac: { -$$MACTSEVENTS }, - Linux: { -$$LINUXTSEVENTS }, - Common: { -$$COMMONTSEVENTS }, -}; +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +export const Types = Object.freeze({ + Windows: Object.freeze({ +$$WINDOWSJSEVENTS }), + Mac: Object.freeze({ +$$MACJSEVENTS }), + Linux: Object.freeze({ +$$LINUXJSEVENTS }), + Common: Object.freeze({ +$$COMMONJSEVENTS }), +}); ` func main() { - eventNames, err := os.ReadFile("../../pkg/events/events.txt") if err != nil { panic(err) @@ -138,11 +133,6 @@ func main() { commonEventsDecl := bytes.NewBufferString("") commonEventsValues := bytes.NewBufferString("") - linuxJSEvents := bytes.NewBufferString("") - macJSEvents := bytes.NewBufferString("") - windowsJSEvents := bytes.NewBufferString("") - commonJSEvents := bytes.NewBufferString("") - linuxTSEvents := bytes.NewBufferString("") macTSEvents := bytes.NewBufferString("") windowsTSEvents := bytes.NewBufferString("") @@ -197,8 +187,7 @@ func main() { } linuxEventsDecl.WriteString("\t" + eventTitle + " " + eventType + "\n") linuxEventsValues.WriteString("\t\t" + event + ": " + strconv.Itoa(id) + ",\n") - linuxJSEvents.WriteString("\t\t" + event + ": \"" + strings.TrimSpace(string(line)) + "\",\n") - linuxTSEvents.WriteString("\t\t" + event + ": string,\n") + linuxTSEvents.WriteString("\t\t" + event + ": \"" + strings.TrimSpace(string(line)) + "\",\n") eventToJS.WriteString("\t" + strconv.Itoa(id) + ": \"" + strings.TrimSpace(string(line)) + "\",\n") maxLinuxEvents = id linuxCHeaderEvents.WriteString("#define Event" + eventTitle + " " + strconv.Itoa(id) + "\n") @@ -212,8 +201,7 @@ func main() { } macEventsDecl.WriteString("\t" + eventTitle + " " + eventType + "\n") macEventsValues.WriteString("\t\t" + event + ": " + strconv.Itoa(id) + ",\n") - macJSEvents.WriteString("\t\t" + event + ": \"" + strings.TrimSpace(string(line)) + "\",\n") - macTSEvents.WriteString("\t\t" + event + ": string,\n") + macTSEvents.WriteString("\t\t" + event + ": \"" + strings.TrimSpace(string(line)) + "\",\n") macCHeaderEvents.WriteString("#define Event" + eventTitle + " " + strconv.Itoa(id) + "\n") eventToJS.WriteString("\t" + strconv.Itoa(id) + ": \"" + strings.TrimSpace(string(line)) + "\",\n") maxMacEvents = id @@ -261,8 +249,7 @@ func main() { } commonEventsDecl.WriteString("\t" + eventTitle + " " + eventType + "\n") commonEventsValues.WriteString("\t\t" + event + ": " + strconv.Itoa(id) + ",\n") - commonJSEvents.WriteString("\t\t" + event + ": \"" + strings.TrimSpace(string(line)) + "\",\n") - commonTSEvents.WriteString("\t\t" + event + ": string,\n") + commonTSEvents.WriteString("\t\t" + event + ": \"" + strings.TrimSpace(string(line)) + "\",\n") eventToJS.WriteString("\t" + strconv.Itoa(id) + ": \"" + strings.TrimSpace(string(line)) + "\",\n") case "windows": eventType := "ApplicationEventType" @@ -274,8 +261,7 @@ func main() { } windowsEventsDecl.WriteString("\t" + eventTitle + " " + eventType + "\n") windowsEventsValues.WriteString("\t\t" + event + ": " + strconv.Itoa(id) + ",\n") - windowsJSEvents.WriteString("\t\t" + event + ": \"" + strings.TrimSpace(string(line)) + "\",\n") - windowsTSEvents.WriteString("\t\t" + event + ": string,\n") + windowsTSEvents.WriteString("\t\t" + event + ": \"" + strings.TrimSpace(string(line)) + "\",\n") eventToJS.WriteString("\t" + strconv.Itoa(id) + ": \"" + strings.TrimSpace(string(line)) + "\",\n") } } @@ -299,22 +285,12 @@ func main() { panic(err) } - // Save the eventsJS template substituting the values and decls - templateToWrite = strings.ReplaceAll(eventsJS, "$$MACJSEVENTS", macJSEvents.String()) - templateToWrite = strings.ReplaceAll(templateToWrite, "$$WINDOWSJSEVENTS", windowsJSEvents.String()) - templateToWrite = strings.ReplaceAll(templateToWrite, "$$LINUXJSEVENTS", linuxJSEvents.String()) - templateToWrite = strings.ReplaceAll(templateToWrite, "$$COMMONJSEVENTS", commonJSEvents.String()) - err = os.WriteFile("../../internal/runtime/desktop/@wailsio/runtime/src/event_types.js", []byte(templateToWrite), 0644) - if err != nil { - panic(err) - } - // Save the eventsTS template substituting the values and decls - templateToWrite = strings.ReplaceAll(eventsTS, "$$MACTSEVENTS", macTSEvents.String()) - templateToWrite = strings.ReplaceAll(templateToWrite, "$$WINDOWSTSEVENTS", windowsTSEvents.String()) - templateToWrite = strings.ReplaceAll(templateToWrite, "$$LINUXTSEVENTS", linuxTSEvents.String()) - templateToWrite = strings.ReplaceAll(templateToWrite, "$$COMMONTSEVENTS", commonTSEvents.String()) - err = os.WriteFile("../../internal/runtime/desktop/@wailsio/runtime/types/event_types.d.ts", []byte(templateToWrite), 0644) + templateToWrite = strings.ReplaceAll(eventsTS, "$$MACJSEVENTS", macTSEvents.String()) + templateToWrite = strings.ReplaceAll(templateToWrite, "$$WINDOWSJSEVENTS", windowsTSEvents.String()) + templateToWrite = strings.ReplaceAll(templateToWrite, "$$LINUXJSEVENTS", linuxTSEvents.String()) + templateToWrite = strings.ReplaceAll(templateToWrite, "$$COMMONJSEVENTS", commonTSEvents.String()) + err = os.WriteFile("../../internal/runtime/desktop/@wailsio/runtime/src/event_types.ts", []byte(templateToWrite), 0644) if err != nil { panic(err) } @@ -402,36 +378,4 @@ func main() { if err != nil { panic(err) } - - // Load the runtime package.json - packageJsonFilename := "../../internal/runtime/desktop/@wailsio/runtime/package.json" - packageJSON, err := os.ReadFile(packageJsonFilename) - if err != nil { - panic(err) - } - version := gjson.Get(string(packageJSON), "version").String() - // Parse and increment version - v := semver.MustParse(version) - prerelease := v.Prerelease() - // Split the prerelease by the "." and increment the last part by 1 - parts := strings.Split(prerelease, ".") - prereleaseDigits, err := strconv.Atoi(parts[len(parts)-1]) - if err != nil { - panic(err) - } - prereleaseNumber := strconv.Itoa(prereleaseDigits + 1) - parts[len(parts)-1] = prereleaseNumber - prerelease = strings.Join(parts, ".") - newVersion, err := v.SetPrerelease(prerelease) - if err != nil { - panic(err) - } - - // Set new version using sjson - newJSON, err := sjson.Set(string(packageJSON), "version", newVersion.String()) - if err != nil { - panic(err) - } - - err = os.WriteFile(packageJsonFilename, []byte(newJSON), 0644) } From 52f1b595e8c340c651cf38ee03dd005e5db3f44f Mon Sep 17 00:00:00 2001 From: Fabio Massaioli Date: Tue, 25 Feb 2025 03:30:59 +0100 Subject: [PATCH 043/374] Add runtime tests --- .../desktop/@wailsio/runtime/package.json | 12 + .../@wailsio/runtime/src/cancellable.test.js | 430 ++++++++++++++++++ .../@wailsio/runtime/src/events.test.js | 193 +++++--- .../runtime/src/promises_aplus.test.js | 44 ++ .../desktop/@wailsio/runtime/vitest.config.ts | 8 + 5 files changed, 618 insertions(+), 69 deletions(-) create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/src/cancellable.test.js create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/src/promises_aplus.test.js create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/vitest.config.ts diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/package.json b/v3/internal/runtime/desktop/@wailsio/runtime/package.json index 3f24339c3..b19175913 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/package.json +++ b/v3/internal/runtime/desktop/@wailsio/runtime/package.json @@ -28,6 +28,8 @@ "./dist/drag.js" ], "scripts": { + "check": "npx tsc --noEmit", + "test": "npx vitest run", "clean": "npx rimraf ./dist ./docs ./types ./tsconfig.tsbuildinfo", "generate:events": "task generate:events", "generate": "npm run generate:events", @@ -39,11 +41,21 @@ "prepack": "npm run build" }, "devDependencies": { + "happy-dom": "^17.1.1", + "promises-aplus-tests": "2.1.2", "rimraf": "^5.0.5", "typedoc": "^0.27.7", "typedoc-plugin-markdown": "^4.4.2", "typedoc-plugin-mdn-links": "^4.0.13", "typedoc-plugin-missing-exports": "^3.1.0", "typescript": "^5.7.3", + "vitest": "^3.0.6" + }, + "overrides": { + "promises-aplus-tests": { + "mocha": "^11.1.0", + "sinon": "^19.0.2", + "underscore": "^1.13.7" + } } } diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/cancellable.test.js b/v3/internal/runtime/desktop/@wailsio/runtime/src/cancellable.test.js new file mode 100644 index 000000000..4a86a2abe --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/src/cancellable.test.js @@ -0,0 +1,430 @@ +import * as util from "node:util"; +import { describe, it, beforeEach, afterEach, assert, expect, vi } from "vitest"; +import { CancelError, CancellablePromise, CancelledRejectionError } from "./cancellable"; + +// TODO: In order of importance: +// TODO: test cancellation of subpromises the main promise resolves to. +// TODO: test cancellation of promise chains built by calling then() and friends: +// - all promises up the chain should be cancelled; +// - rejection handlers should be always executed with the CancelError of their parent promise in the chain; +// - promises returned from rejection handlers should be cancelled too; +// - if a rejection handler throws or returns a promise that ultimately rejects, +// it should be reported as an unhandled rejection, +// - unless it is a CancelError with the same reason given for cancelling the returned promise. +// TODO: test multiple calls to cancel() (second and later should have no effect). + +let expectedUnhandled = new Map(); + +process.on('unhandledRejection', function (error, promise) { + let reason = error; + if (reason instanceof CancelledRejectionError) { + promise = reason.promise; + reason = reason.cause; + } + + let reasons = expectedUnhandled.get(promise); + const callbacks = reasons?.get(reason); + if (callbacks) { + for (const cb of callbacks) { + try { + cb(reason, promise); + } catch (e) { + console.error("Exception in unhandled rejection callback.", e); + } + } + + reasons.delete(reason); + if (reasons.size === 0) { + expectedUnhandled.delete(promise); + } + return; + } + + console.log(util.format("Unhandled rejection.\nReason: %o\nPromise: %o", reason, promise)); + throw error; +}); + +function ignoreUnhandled(reason, promise) { + expectUnhandled(reason, promise, null); +} + +function expectUnhandled(reason, promise, cb) { + let reasons = expectedUnhandled.get(promise); + if (!reasons) { + reasons = new Map(); + expectedUnhandled.set(promise, reasons); + } + let callbacks = reasons.get(reason); + if (!callbacks) { + callbacks = []; + reasons.set(reason, callbacks); + } + if (cb) { + callbacks.push(cb); + } +} + +afterEach(() => { + vi.resetAllMocks(); + vi.restoreAllMocks(); +}); + +const dummyValue = { value: "value" }; +const dummyCause = { dummy: "dummy" }; +const dummyError = new Error("dummy"); +const oncancelled = vi.fn().mockName("oncancelled"); +const sentinel = vi.fn().mockName("sentinel"); +const unhandled = vi.fn().mockName("unhandled"); + +const resolutionPatterns = [ + ["forever", "pending", (test, value, { cls = CancellablePromise, cb = oncancelled } = {}) => test( + new cls(() => {}, cb) + )], + ["already", "fulfilled", (test, value, { cls = CancellablePromise, cb = oncancelled } = {}) => { + const prw = cls.withResolvers(); + prw.oncancelled = cb; + prw.resolve(value ?? dummyValue); + return test(prw.promise); + }], + ["immediately", "fulfilled", (test, value, { cls = CancellablePromise, cb = oncancelled } = {}) => { + const prw = cls.withResolvers(); + prw.oncancelled = cb; + const tp = test(prw.promise); + prw.resolve(value ?? dummyValue); + return tp; + }], + ["eventually", "fulfilled", async (test, value, { cls = CancellablePromise, cb = oncancelled } = {}) => { + const prw = cls.withResolvers(); + prw.oncancelled = cb; + const tp = test(prw.promise); + await new Promise((resolve) => { + setTimeout(() => { + prw.resolve(value ?? dummyValue); + resolve(); + }, 50); + }); + return tp; + }], + ["already", "rejected", (test, reason, { cls = CancellablePromise, cb = oncancelled } = {}) => { + const prw = cls.withResolvers(); + prw.oncancelled = cb; + prw.reject(reason ?? dummyError); + return test(prw.promise); + }], + ["immediately", "rejected", (test, reason, { cls = CancellablePromise, cb = oncancelled } = {}) => { + const prw = cls.withResolvers(); + prw.oncancelled = cb; + const tp = test(prw.promise); + prw.reject(reason ?? dummyError); + return tp; + }], + ["eventually", "rejected", async (test, reason, { cls = CancellablePromise, cb = oncancelled } = {}) => { + const prw = cls.withResolvers(); + prw.oncancelled = cb; + const tp = test(prw.promise); + await new Promise((resolve) => { + setTimeout(() => { + prw.reject(reason ?? dummyError); + resolve(); + }, 50); + }); + return tp; + }], +]; + +describe("CancellablePromise.cancel", ()=> { + it("should suppress its own unhandled cancellation error", async () => { + const p = new CancellablePromise(() => {}); + p.cancel(); + + process.on('unhandledRejection', sentinel); + await new Promise((resolve) => setTimeout(resolve, 100)); + process.off('unhandledRejection', sentinel); + + expect(sentinel).not.toHaveBeenCalled(); + }); + + it.for([ + ["rejections", dummyError], + ["cancellation errors", new CancelError("dummy", { cause: dummyCause })], + ])("should not suppress arbitrary unhandled %s", async ([kind, err]) => { + const p = new CancellablePromise(() => { throw err; }); + p.cancel(); + + await new Promise((resolve) => { + expectUnhandled(err, p, unhandled); + expectUnhandled(err, p, resolve); + }); + + expect(unhandled).toHaveBeenCalledExactlyOnceWith(err, p); + }); + + describe.for(resolutionPatterns)("when applied to %s %s promises", ([time, state, test]) => { + if (time === "already") { + it("should have no effect", () => test(async (promise) => { + promise.then(sentinel, sentinel); + + let reason; + try { + promise.cancel(); + await promise; + assert(state === "fulfilled", "Promise fulfilled unexpectedly"); + } catch (err) { + reason = err; + assert(state === "rejected", "Promise rejected unexpectedly"); + } + + expect(sentinel).toHaveBeenCalled(); + expect(oncancelled).not.toHaveBeenCalled(); + expect(reason).not.toBeInstanceOf(CancelError); + })); + } else { + if (state === "rejected") { + it("should report late rejections as unhandled", () => test(async (promise) => { + promise.cancel(); + + await new Promise((resolve) => { + expectUnhandled(dummyError, promise, unhandled); + expectUnhandled(dummyError, promise, resolve); + }); + + expect(unhandled).toHaveBeenCalledExactlyOnceWith(dummyError, promise); + })); + } + + it("should reject with a CancelError", () => test(async (promise) => { + // Ignore the unhandled rejection from the test promise. + if (state === "rejected") { ignoreUnhandled(dummyError, promise); } + + let reason; + try { + promise.cancel(); + await promise; + } catch (err) { + reason = err; + } + + expect(reason).toBeInstanceOf(CancelError); + })); + + it("should call the oncancelled callback synchronously", () => test(async (promise) => { + // Ignore the unhandled rejection from the test promise. + if (state === "rejected") { ignoreUnhandled(dummyError, promise); } + + try { + promise.cancel(); + sentinel(); + await promise; + } catch {} + + expect(oncancelled).toHaveBeenCalledBefore(sentinel); + })); + + it("should propagate the given cause", () => test(async (promise) => { + // Ignore the unhandled rejection from the test promise. + if (state === "rejected") { ignoreUnhandled(dummyError, promise); } + + let reason; + try { + promise.cancel(dummyCause); + await promise; + } catch (err) { + reason = err; + } + + expect(reason).toBeInstanceOf(CancelError); + expect(reason).toHaveProperty('cause', dummyCause); + expect(oncancelled).toHaveBeenCalledWith(reason.cause); + })); + } + }); +}); + +const onabort = vi.fn().mockName("abort"); + +const abortPatterns = [ + ["never", "standalone", (test) => { + const signal = new AbortSignal(); + signal.addEventListener('abort', onabort, { capture: true }); + return test(signal); + }], + ["already", "standalone", (test) => { + const signal = AbortSignal.abort(dummyCause); + onabort(); + return test(signal); + }], + ["eventually", "standalone", (test) => { + const signal = AbortSignal.timeout(25); + signal.addEventListener('abort', onabort, { capture: true }); + return test(signal); + }], + ["never", "controller-bound", (test) => { + const signal = new AbortController().signal; + signal.addEventListener('abort', onabort, { capture: true }); + return test(signal); + }], + ["already", " controller-bound", (test) => { + const ctrl = new AbortController(); + ctrl.signal.addEventListener('abort', onabort, { capture: true }); + ctrl.abort(dummyCause); + return test(ctrl.signal); + }], + ["immediately", "controller-bound", (test) => { + const ctrl = new AbortController(); + ctrl.signal.addEventListener('abort', onabort, { capture: true }); + const tp = test(ctrl.signal); + ctrl.abort(dummyCause); + return tp; + }], + ["eventually", "controller-bound", (test) => { + const ctrl = new AbortController(); + ctrl.signal.addEventListener('abort', onabort, { capture: true }); + const tp = test(ctrl.signal); + setTimeout(() => ctrl.abort(dummyCause), 25); + return tp; + }] +]; + +describe("CancellablePromise.cancelOn", ()=> { + it("should return the target promise for chaining", () => { + const p = new CancellablePromise(() => {}); + expect(p.cancelOn(AbortSignal.abort())).toBe(p); + }); + + function tests(abortTime, mode, testSignal, resolveTime, state, testPromise) { + if (abortTime !== "never") { + it(`should call CancellablePromise.cancel ${abortTime === "already" ? "immediately" : "on abort"} with the abort reason as cause`, () => testSignal((signal) => testPromise(async (promise) => { + // Ignore the unhandled rejection from the test promise. + if (state === "rejected") { ignoreUnhandled(dummyError, promise); } + + const cancelSpy = vi.spyOn(promise, 'cancel'); + + promise.catch(() => {}); + promise.cancelOn(signal); + + if (signal.aborted) { + sentinel(); + } else { + await new Promise((resolve) => { + signal.onabort = () => { + sentinel(); + resolve(); + }; + }); + } + + expect(cancelSpy).toHaveBeenCalledAfter(onabort); + expect(cancelSpy).toHaveBeenCalledBefore(sentinel); + expect(cancelSpy).toHaveBeenCalledExactlyOnceWith(signal.reason); + }))); + } + + if ( + resolveTime === "already" + || abortTime === "never" + || ( + ["immediately", "eventually"].includes(abortTime) + && ["already", "immediately"].includes(resolveTime) + ) + ) { + it("should have no effect", () => testSignal((signal) => testPromise(async (promise) => { + promise.then(sentinel, sentinel); + + let reason; + try { + if (resolveTime !== "forever") { + await promise.cancelOn(signal); + assert(state === "fulfilled", "Promise fulfilled unexpectedly"); + } else { + await Promise.race([promise, new Promise((resolve) => setTimeout(resolve, 100))]).then(sentinel); + } + } catch (err) { + reason = err; + assert(state === "rejected", "Promise rejected unexpectedly"); + } + + if (abortTime !== "never" && !signal.aborted) { + // Wait for the AbortSignal to have actually aborted. + await new Promise((resolve) => signal.onabort = resolve); + } + + expect(sentinel).toHaveBeenCalled(); + expect(oncancelled).not.toHaveBeenCalled(); + expect(reason).not.toBeInstanceOf(CancelError); + }))); + } else { + if (state === "rejected") { + it("should report late rejections as unhandled", () => testSignal((signal) => testPromise(async (promise) => { + promise.cancelOn(signal); + + await new Promise((resolve) => { + expectUnhandled(dummyError, promise, unhandled); + expectUnhandled(dummyError, promise, resolve); + }); + + expect(unhandled).toHaveBeenCalledExactlyOnceWith(dummyError, promise); + }))); + } + + it("should reject with a CancelError", () => testSignal((signal) => testPromise(async (promise)=> { + // Ignore the unhandled rejection from the test promise. + if (state === "rejected") { ignoreUnhandled(dummyError, promise); } + + let reason; + try { + await promise.cancelOn(signal); + } catch (err) { + reason = err; + } + + expect(reason).toBeInstanceOf(CancelError); + }))); + + it(`should call the oncancelled callback ${abortTime === "already" ? "" : "a"}synchronously`, () => testSignal((signal) => testPromise(async (promise) => { + // Ignore the unhandled rejection from the test promise. + if (state === "rejected") { ignoreUnhandled(dummyError, promise); } + + try { + promise.cancelOn(signal); + sentinel(); + await promise; + } catch {} + + expect(oncancelled).toHaveBeenCalledAfter(onabort); + if (abortTime === "already") { + expect(oncancelled).toHaveBeenCalledBefore(sentinel); + } else { + expect(oncancelled).toHaveBeenCalledAfter(sentinel); + } + }))); + + it("should propagate the abort reason as cause", () => testSignal((signal) => testPromise(async (promise) => { + // Ignore the unhandled rejection from the test promise. + if (state === "rejected") { ignoreUnhandled(dummyError, promise); } + + let reason; + try { + await promise.cancelOn(signal); + } catch (err) { + reason = err; + } + + expect(reason).toBeInstanceOf(CancelError); + expect(reason).toHaveProperty('cause', signal.reason); + expect(oncancelled).toHaveBeenCalledWith(signal.reason); + }))); + } + } + + describe.for(abortPatterns)("when called with %s aborted %s signals", ([abortTime, mode, testSignal]) => { + describe.for(resolutionPatterns)("when applied to %s %s promises", ([resolveTime, state, testPromise]) => { + tests(abortTime, mode, testSignal, resolveTime, state, testPromise); + }); + }); + + describe.for(resolutionPatterns)("when applied to %s %s promises", ([resolveTime, state, testPromise]) => { + describe.for(abortPatterns)("when called with %s aborted %s signals", ([abortTime, mode, testSignal]) => { + tests(abortTime, mode, testSignal, resolveTime, state, testPromise); + }); + }); +}); \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/events.test.js b/v3/internal/runtime/desktop/@wailsio/runtime/src/events.test.js index c46868cb0..c21804f53 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/src/events.test.js +++ b/v3/internal/runtime/desktop/@wailsio/runtime/src/events.test.js @@ -1,18 +1,28 @@ - -import { On, Off, OffAll, OnMultiple, WailsEvent, dispatchWailsEvent, eventListeners, Once } from './events'; - +import { On, Off, OffAll, OnMultiple, WailsEvent, Once } from './events'; +import { eventListeners } from "./listener"; import { expect, describe, it, vi, afterEach, beforeEach } from 'vitest'; +const dispatchWailsEvent = window._wails.dispatchWailsEvent; + afterEach(() => { OffAll(); vi.resetAllMocks(); }); -describe('OnMultiple', () => { - let testEvent = new WailsEvent('a', {}); +describe("OnMultiple", () => { + const testEvent = { name: 'a', data: ["hello", "events"] }; + const cb = vi.fn((ev) => { + expect(ev).toBeInstanceOf(WailsEvent); + expect(ev).toMatchObject(testEvent); + }); - it('should stop after a specified number of times', () => { - const cb = vi.fn(); + it("should dispatch a properly initialised WailsEvent", () => { + OnMultiple('a', cb, 5); + dispatchWailsEvent(testEvent); + expect(cb).toHaveBeenCalled(); + }); + + it("should stop after the specified number of times", () => { OnMultiple('a', cb, 5); dispatchWailsEvent(testEvent); dispatchWailsEvent(testEvent); @@ -20,77 +30,122 @@ describe('OnMultiple', () => { dispatchWailsEvent(testEvent); dispatchWailsEvent(testEvent); dispatchWailsEvent(testEvent); - expect(cb).toBeCalledTimes(5); + expect(cb).toHaveBeenCalledTimes(5); }); - it('should return a cancel fn', () => { - const cb = vi.fn() - const cancel = OnMultiple('a', cb, 5) - dispatchWailsEvent(testEvent) - dispatchWailsEvent(testEvent) - cancel() - dispatchWailsEvent(testEvent) - dispatchWailsEvent(testEvent) - expect(cb).toBeCalledTimes(2) - }) -}) - -describe('On', () => { - it('should create a listener with a count of -1', () => { - On('a', () => {}) - expect(eventListeners.get("a")[0].maxCallbacks).toBe(-1) - }) - - it('should return a cancel fn', () => { - const cancel = On('a', () => {}) + it("should return a cancel fn", () => { + const cancel = OnMultiple('a', cb, 5); + dispatchWailsEvent(testEvent); + dispatchWailsEvent(testEvent); cancel(); - }) -}) + dispatchWailsEvent(testEvent); + dispatchWailsEvent(testEvent); + expect(cb).toBeCalledTimes(2); + }); +}); -describe('Once', () => { - it('should create a listener with a count of 1', () => { - Once('a', () => {}) - expect(eventListeners.get("a")[0].maxCallbacks).toBe(1) - }) +describe("On", () => { + let testEvent = { name: 'a', data: ["hello", "events"], sender: "window" }; + const cb = vi.fn((ev) => { + expect(ev).toBeInstanceOf(WailsEvent); + expect(ev).toMatchObject(testEvent); + }); - it('should return a cancel fn', () => { - const cancel = EventsOn('a', () => {}) + it("should dispatch a properly initialised WailsEvent", () => { + On('a', cb); + dispatchWailsEvent(testEvent); + expect(cb).toHaveBeenCalled(); + }); + + it("should never stop", () => { + On('a', cb); + expect(eventListeners.get('a')[0].maxCallbacks).toBe(-1); + dispatchWailsEvent(testEvent); + expect(eventListeners.get('a')[0].maxCallbacks).toBe(-1); + }); + + it("should return a cancel fn", () => { + const cancel = On('a', cb) + dispatchWailsEvent(testEvent); cancel(); - }) + dispatchWailsEvent(testEvent); + expect(cb).toHaveBeenCalledTimes(1); + }); +}); + +describe("Once", () => { + const testEvent = { name: 'a', data: ["hello", "events"] }; + const cb = vi.fn((ev) => { + expect(ev).toBeInstanceOf(WailsEvent); + expect(ev).toMatchObject(testEvent); + }); + + it("should dispatch a properly initialised WailsEvent", () => { + Once('a', cb); + dispatchWailsEvent(testEvent); + expect(cb).toHaveBeenCalled(); + }); + + it("should stop after one time", () => { + Once('a', cb) + dispatchWailsEvent(testEvent); + dispatchWailsEvent(testEvent); + dispatchWailsEvent(testEvent); + expect(cb).toHaveBeenCalledTimes(1); + }); + + it("should return a cancel fn", () => { + const cancel = Once('a', cb) + cancel(); + dispatchWailsEvent(testEvent); + expect(cb).not.toHaveBeenCalled(); + }); }) -describe('Off', () => { +describe("Off", () => { + const cba = vi.fn(), cbb = vi.fn(), cbc = vi.fn(); + beforeEach(() => { - On('a', () => {}) - On('a', () => {}) - On('a', () => {}) - On('b', () => {}) - On('c', () => {}) - }) + On('a', cba); + On('a', cba); + On('a', cba); + On('b', cbb); + On('c', cbc); + On('c', cbc); + }); - it('should cancel all event listeners for a single type', () => { - Off('a') - expect(eventListeners.get('a')).toBeUndefined() - expect(eventListeners.get('b')).not.toBeUndefined() - expect(eventListeners.get('c')).not.toBeUndefined() - }) + it("should cancel all event listeners for a single type", () => { + Off('a'); + dispatchWailsEvent({ name: 'a' }); + dispatchWailsEvent({ name: 'b' }); + dispatchWailsEvent({ name: 'c' }); + expect(cba).not.toHaveBeenCalled(); + expect(cbb).toHaveBeenCalledTimes(1); + expect(cbc).toHaveBeenCalledTimes(2); + }); - it('should cancel all event listeners for multiple types', () => { - Off('a', 'b') - expect(eventListeners.get('a')).toBeUndefined() - expect(eventListeners.get('b')).toBeUndefined() - expect(eventListeners.get('c')).not.toBeUndefined() - }) -}) + it("should cancel all event listeners for multiple types", () => { + Off('a', 'c') + dispatchWailsEvent({ name: 'a' }); + dispatchWailsEvent({ name: 'b' }); + dispatchWailsEvent({ name: 'c' }); + expect(cba).not.toHaveBeenCalled(); + expect(cbb).toHaveBeenCalledTimes(1); + expect(cbc).not.toHaveBeenCalled(); + }); +}); -describe('OffAll', () => { - it('should cancel all event listeners', () => { - On('a', () => {}) - On('a', () => {}) - On('a', () => {}) - On('b', () => {}) - On('c', () => {}) - OffAll() - expect(eventListeners.size).toBe(0) - }) -}) +describe("OffAll", () => { + it("should cancel all event listeners", () => { + const cba = vi.fn(), cbb = vi.fn(), cbc = vi.fn(); + On('a', cba); + On('a', cba); + On('a', cba); + On('b', cbb); + On('c', cbc); + On('c', cbc); + expect(cba).not.toHaveBeenCalled(); + expect(cbb).not.toHaveBeenCalled(); + expect(cbc).not.toHaveBeenCalled(); + }); +}); diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/promises_aplus.test.js b/v3/internal/runtime/desktop/@wailsio/runtime/src/promises_aplus.test.js new file mode 100644 index 000000000..e4806b6e0 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/src/promises_aplus.test.js @@ -0,0 +1,44 @@ +import * as util from "util"; +import * as V from "vitest"; +import { CancellablePromise } from "./cancellable"; + +// The Promises/A+ suite handles some errors late. +process.on('rejectionHandled', function () {}); + +// The Promises/A+ suite leaves some errors unhandled. +process.on('unhandledRejection', function (reason, promise) { + if (promise instanceof CancellablePromise && reason != null && typeof reason === 'object') { + for (const key of ['dummy', 'other', 'sentinel']) { + if (reason[key] === key) { + return; + } + } + } + throw new Error(`Unhandled rejection at: ${util.inspect(promise)}; reason: ${util.inspect(reason)}`, { cause: reason }); +}); + +// Emulate a minimal version of the mocha BDD API using vitest primitives. +global.context = global.describe = V.describe; +global.specify = global.it = function it(desc, fn) { + let viTestFn = fn; + if (fn && fn.length) { + viTestFn = () => new Promise((done) => fn(done)); + } + V.it(desc, viTestFn); +} +global.before = function(desc, fn) { V.beforeAll(typeof desc === 'function' ? desc : fn) }; +global.after = function(desc, fn) { V.afterAll(typeof desc === 'function' ? desc : fn) }; +global.beforeEach = function(desc, fn) { V.beforeEach(typeof desc === 'function' ? desc : fn) }; +global.afterEach = function(desc, fn) { V.afterEach(typeof desc === 'function' ? desc : fn) }; + +require('promises-aplus-tests').mocha({ + resolved(value) { + return CancellablePromise.resolve(value); + }, + rejected(reason) { + return CancellablePromise.reject(reason); + }, + deferred() { + return CancellablePromise.withResolvers(); + } +}); diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/vitest.config.ts b/v3/internal/runtime/desktop/@wailsio/runtime/vitest.config.ts new file mode 100644 index 000000000..efb60170a --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/vitest.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + environment: 'happy-dom', + testTimeout: 200 + }, +}); From 2c521e63cb5b26d22ba3287a19e9edd2e0ae5231 Mon Sep 17 00:00:00 2001 From: Fabio Massaioli Date: Tue, 25 Feb 2025 03:32:09 +0100 Subject: [PATCH 044/374] Update package-lock.json --- .../@wailsio/runtime/package-lock.json | 2903 +++++++++++++++-- 1 file changed, 2684 insertions(+), 219 deletions(-) diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/package-lock.json b/v3/internal/runtime/desktop/@wailsio/runtime/package-lock.json index 9f8307460..86e396190 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/package-lock.json +++ b/v3/internal/runtime/desktop/@wailsio/runtime/package-lock.json @@ -1,18 +1,460 @@ { "name": "@wailsio/runtime", - "version": "3.0.0-alpha.55", + "version": "3.0.0-alpha.56", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@wailsio/runtime", - "version": "3.0.0-alpha.55", + "version": "3.0.0-alpha.56", "license": "MIT", "devDependencies": { + "happy-dom": "^17.1.1", + "promises-aplus-tests": "2.1.2", "rimraf": "^5.0.5", - "typedoc": "^0.25.7", - "typedoc-plugin-markdown": "^3.17.1", - "typescript": "^5.3.3" + "typedoc": "^0.27.7", + "typedoc-plugin-markdown": "^4.4.2", + "typedoc-plugin-mdn-links": "^4.0.13", + "typedoc-plugin-missing-exports": "^3.1.0", + "typescript": "^5.7.3", + "vitest": "^3.0.6" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", + "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", + "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", + "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", + "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", + "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", + "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", + "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", + "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", + "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", + "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", + "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", + "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", + "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", + "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", + "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", + "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", + "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", + "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", + "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@gerrit0/mini-shiki": { + "version": "1.27.2", + "resolved": "https://registry.npmjs.org/@gerrit0/mini-shiki/-/mini-shiki-1.27.2.tgz", + "integrity": "sha512-GeWyHz8ao2gBiUW4OJnQDxXQnFgZQwwQk05t/CVVgNBN7/rK8XZ7xY6YhLVv9tH3VppWWmr9DCl3MwemB/i+Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/engine-oniguruma": "^1.27.2", + "@shikijs/types": "^1.27.2", + "@shikijs/vscode-textmate": "^10.0.1" } }, "node_modules/@isaacs/cliui": { @@ -20,6 +462,7 @@ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dev": true, + "license": "ISC", "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -32,21 +475,521 @@ "node": ">=12" } }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">=14" } }, - "node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.8.tgz", + "integrity": "sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==", + "cpu": [ + "arm" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.8.tgz", + "integrity": "sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.8.tgz", + "integrity": "sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.8.tgz", + "integrity": "sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.8.tgz", + "integrity": "sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.8.tgz", + "integrity": "sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.8.tgz", + "integrity": "sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.8.tgz", + "integrity": "sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.8.tgz", + "integrity": "sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.8.tgz", + "integrity": "sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.8.tgz", + "integrity": "sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.8.tgz", + "integrity": "sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.8.tgz", + "integrity": "sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.8.tgz", + "integrity": "sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.8.tgz", + "integrity": "sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.8.tgz", + "integrity": "sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.8.tgz", + "integrity": "sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.8.tgz", + "integrity": "sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.8.tgz", + "integrity": "sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.29.2.tgz", + "integrity": "sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "1.29.2", + "@shikijs/vscode-textmate": "^10.0.1" + } + }, + "node_modules/@shikijs/types": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.29.2.tgz", + "integrity": "sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.1", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "13.0.5", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz", + "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.1" + } + }, + "node_modules/@sinonjs/samsam": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.2.tgz", + "integrity": "sha512-v46t/fwnhejRSFTGqbpn9u+LQ9xJDse10gNnPgAcxgdoCDMXj/G2asWAC/8Qs+BAZDicX+MNZouXT1A7c83kVw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.1", + "lodash.get": "^4.4.2", + "type-detect": "^4.1.0" + } + }, + "node_modules/@sinonjs/samsam/node_modules/type-detect": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", + "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.3.tgz", + "integrity": "sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA==", + "dev": true, + "license": "(Unlicense OR Apache-2.0)" + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vitest/expect": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.0.7.tgz", + "integrity": "sha512-QP25f+YJhzPfHrHfYHtvRn+uvkCFCqFtW9CktfBxmB+25QqWsx7VB2As6f4GmwllHLDhXNHvqedwhvMmSnNmjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "3.0.7", + "@vitest/utils": "3.0.7", + "chai": "^5.2.0", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.0.7.tgz", + "integrity": "sha512-qui+3BLz9Eonx4EAuR/i+QlCX6AUZ35taDQgwGkK/Tw6/WgwodSrjN1X2xf69IA/643ZX5zNKIn2svvtZDrs4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "3.0.7", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.17" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0 || ^6.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.0.7.tgz", + "integrity": "sha512-CiRY0BViD/V8uwuEzz9Yapyao+M9M008/9oMOSQydwbwb+CMokEq3XVaF3XK/VWaOK0Jm9z7ENhybg70Gtxsmg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.0.7.tgz", + "integrity": "sha512-WeEl38Z0S2ZcuRTeyYqaZtm4e26tq6ZFqh5y8YD9YxfWuu0OFiGFUbnxNynwLjNRHPsXyee2M9tV7YxOTPZl2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "3.0.7", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.0.7.tgz", + "integrity": "sha512-eqTUryJWQN0Rtf5yqCGTQWsCFOQe4eNz5Twsu21xYEcnFJtMU5XvmG0vgebhdLlrHQTSq5p8vWHJIeJQV8ovsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.0.7", + "magic-string": "^0.30.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.0.7.tgz", + "integrity": "sha512-4T4WcsibB0B6hrKdAZTM37ekuyFZt2cGbEGd2+L0P8ov15J1/HUsUaqkXEQPNAWr4BtPPe1gI+FYfMHhEKfR8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^3.0.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.0.7.tgz", + "integrity": "sha512-xePVpCRfooFX3rANQjwoditoXgWb1MaFbzmGuPP59MK6i13mrnDw/yEIyJudLeW6/38mCNcwCiJIGmpDPibAIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.0.7", + "loupe": "^3.1.3", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -54,44 +997,292 @@ "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/ansi-sequence-parser": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz", - "integrity": "sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==", - "dev": true - }, "node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": ">=12" + "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true, + "license": "ISC" + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/chai": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.0.tgz", + "integrity": "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -103,13 +1294,15 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -119,25 +1312,223 @@ "node": ">= 8" } }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-module-lexer": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", + "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.24.2", + "@esbuild/android-arm": "0.24.2", + "@esbuild/android-arm64": "0.24.2", + "@esbuild/android-x64": "0.24.2", + "@esbuild/darwin-arm64": "0.24.2", + "@esbuild/darwin-x64": "0.24.2", + "@esbuild/freebsd-arm64": "0.24.2", + "@esbuild/freebsd-x64": "0.24.2", + "@esbuild/linux-arm": "0.24.2", + "@esbuild/linux-arm64": "0.24.2", + "@esbuild/linux-ia32": "0.24.2", + "@esbuild/linux-loong64": "0.24.2", + "@esbuild/linux-mips64el": "0.24.2", + "@esbuild/linux-ppc64": "0.24.2", + "@esbuild/linux-riscv64": "0.24.2", + "@esbuild/linux-s390x": "0.24.2", + "@esbuild/linux-x64": "0.24.2", + "@esbuild/netbsd-arm64": "0.24.2", + "@esbuild/netbsd-x64": "0.24.2", + "@esbuild/openbsd-arm64": "0.24.2", + "@esbuild/openbsd-x64": "0.24.2", + "@esbuild/sunos-x64": "0.24.2", + "@esbuild/win32-arm64": "0.24.2", + "@esbuild/win32-ia32": "0.24.2", + "@esbuild/win32-x64": "0.24.2" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/expect-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.1.0.tgz", + "integrity": "sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } }, "node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "dev": true, + "license": "ISC", "dependencies": { - "cross-spawn": "^7.0.0", + "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" }, "engines": { @@ -147,120 +1538,71 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, + "license": "ISC", "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" + "is-glob": "^4.0.1" }, "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" + "node": ">= 6" } }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jsonc-parser": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", - "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", - "dev": true - }, - "node_modules/lru-cache": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/lunr": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", - "dev": true - }, - "node_modules/marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", - "dev": true, - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -271,78 +1613,680 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "node_modules/happy-dom": { + "version": "17.1.8", + "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-17.1.8.tgz", + "integrity": "sha512-Yxbq/FG79z1rhAf/iB6YM8wO2JB/JDQBy99RiLSs+2siEAi5J05x9eW1nnASHZJbpldjJE2KuFLsLZ+AzX/IxA==", "dev": true, + "license": "MIT", + "dependencies": { + "webidl-conversions": "^7.0.0", + "whatwg-mimetype": "^3.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/just-extend": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-6.2.0.tgz", + "integrity": "sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==", + "dev": true, + "license": "MIT" + }, + "node_modules/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "uc.micro": "^2.0.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "deprecated": "This package is deprecated. Use the optional chaining (?.) operator instead.", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/loupe": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", + "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/markdown-it": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "node_modules/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "dev": true, + "license": "MIT" + }, + "node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" } }, "node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, + "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true + "node_modules/mocha": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.1.0.tgz", + "integrity": "sha512-8uJR5RTC2NgpY3GrYcgpZrsEd9zKbPDpob1RezyR2upGHRQtHWofmzTMzTMSV6dru3tj5Ukt0+Vnq1qhFEEwAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.3", + "browser-stdout": "^1.3.1", + "chokidar": "^3.5.3", + "debug": "^4.3.5", + "diff": "^5.2.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^10.4.5", + "he": "^1.2.0", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^5.1.6", + "ms": "^2.1.3", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^6.5.1", + "yargs": "^17.7.2", + "yargs-parser": "^21.1.1", + "yargs-unparser": "^2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/nise": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/nise/-/nise-6.1.1.tgz", + "integrity": "sha512-aMSAzLVY7LyeM60gvBS423nBmIPP+Wy7St7hsb+8/fc1HmeoHJfLO8CKse4u3BtOZvQLJghYPI2i/1WZrEj5/g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.1", + "@sinonjs/fake-timers": "^13.0.1", + "@sinonjs/text-encoding": "^0.7.3", + "just-extend": "^6.2.0", + "path-to-regexp": "^8.1.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/path-scurry": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", + "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/rimraf": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", - "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==", + "node_modules/path-to-regexp": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", + "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathval": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/promises-aplus-tests": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/promises-aplus-tests/-/promises-aplus-tests-2.1.2.tgz", + "integrity": "sha512-XiDfjQqx+rHLof8CU9xPOMLsjiXXxr3fkjE7WJjUzXttffB8K/nsnNsPTcwS4VvHliSjGVsYVqIjFeTHw53f5w==", + "dev": true, + "license": "WTFPL", + "dependencies": { + "mocha": "^2.5.3", + "sinon": "^1.10.3", + "underscore": "~1.8.3" + }, + "bin": { + "promises-aplus-tests": "lib/cli.js" + } + }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", + "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", + "dev": true, + "license": "ISC", "dependencies": { "glob": "^10.3.7" }, "bin": { "rimraf": "dist/esm/bin.mjs" }, - "engines": { - "node": ">=14" - }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rollup": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.8.tgz", + "integrity": "sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.34.8", + "@rollup/rollup-android-arm64": "4.34.8", + "@rollup/rollup-darwin-arm64": "4.34.8", + "@rollup/rollup-darwin-x64": "4.34.8", + "@rollup/rollup-freebsd-arm64": "4.34.8", + "@rollup/rollup-freebsd-x64": "4.34.8", + "@rollup/rollup-linux-arm-gnueabihf": "4.34.8", + "@rollup/rollup-linux-arm-musleabihf": "4.34.8", + "@rollup/rollup-linux-arm64-gnu": "4.34.8", + "@rollup/rollup-linux-arm64-musl": "4.34.8", + "@rollup/rollup-linux-loongarch64-gnu": "4.34.8", + "@rollup/rollup-linux-powerpc64le-gnu": "4.34.8", + "@rollup/rollup-linux-riscv64-gnu": "4.34.8", + "@rollup/rollup-linux-s390x-gnu": "4.34.8", + "@rollup/rollup-linux-x64-gnu": "4.34.8", + "@rollup/rollup-linux-x64-musl": "4.34.8", + "@rollup/rollup-win32-arm64-msvc": "4.34.8", + "@rollup/rollup-win32-ia32-msvc": "4.34.8", + "@rollup/rollup-win32-x64-msvc": "4.34.8", + "fsevents": "~2.3.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -355,27 +2299,24 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/shiki": { - "version": "0.14.7", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.7.tgz", - "integrity": "sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg==", + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", "dev": true, - "dependencies": { - "ansi-sequence-parser": "^1.1.0", - "jsonc-parser": "^3.2.0", - "vscode-oniguruma": "^1.7.0", - "vscode-textmate": "^8.0.0" - } + "license": "ISC" }, "node_modules/signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, + "license": "ISC", "engines": { "node": ">=14" }, @@ -383,20 +2324,78 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/sinon": { + "version": "19.0.2", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-19.0.2.tgz", + "integrity": "sha512-euuToqM+PjO4UgXeLETsfQiuoyPXlqFezr6YZDFwHR3t4qaX0fZUe1MfPMznTL5f8BWrVS89KduLdMUsxFCO6g==", "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.1", + "@sinonjs/fake-timers": "^13.0.2", + "@sinonjs/samsam": "^8.0.1", + "diff": "^7.0.0", + "nise": "^6.1.1", + "supports-color": "^7.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/sinon" + } + }, + "node_modules/sinon/node_modules/diff": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", + "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/sinon/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/std-env": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz", + "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==", + "dev": true, + "license": "MIT" + }, "node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, + "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -415,6 +2414,7 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -429,6 +2429,7 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -437,13 +2438,15 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/string-width-cjs/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -456,6 +2459,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -472,6 +2476,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -484,48 +2489,185 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/typedoc": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.25.12.tgz", - "integrity": "sha512-F+qhkK2VoTweDXd1c42GS/By2DvI2uDF4/EpG424dTexSHdtCH52C6IcAvMA6jR3DzAWZjHpUOW+E02kyPNUNw==", + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinypool": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz", + "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", + "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/typedoc": { + "version": "0.27.9", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.27.9.tgz", + "integrity": "sha512-/z585740YHURLl9DN2jCWe6OW7zKYm6VoQ93H0sxZ1cwHQEQrUn5BJrEnkWhfzUdyO+BLGjnKUZ9iz9hKloFDw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@gerrit0/mini-shiki": "^1.24.0", "lunr": "^2.3.9", - "marked": "^4.3.0", - "minimatch": "^9.0.3", - "shiki": "^0.14.7" + "markdown-it": "^14.1.0", + "minimatch": "^9.0.5", + "yaml": "^2.6.1" }, "bin": { "typedoc": "bin/typedoc" }, "engines": { - "node": ">= 16" + "node": ">= 18" }, "peerDependencies": { - "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x" + "typescript": "5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x" } }, "node_modules/typedoc-plugin-markdown": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-3.17.1.tgz", - "integrity": "sha512-QzdU3fj0Kzw2XSdoL15ExLASt2WPqD7FbLeaqwT70+XjKyTshBnUlQA5nNREO1C2P8Uen0CDjsBLMsCQ+zd0lw==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-4.4.2.tgz", + "integrity": "sha512-kJVkU2Wd+AXQpyL6DlYXXRrfNrHrEIUgiABWH8Z+2Lz5Sq6an4dQ/hfvP75bbokjNDUskOdFlEEm/0fSVyC7eg==", "dev": true, - "dependencies": { - "handlebars": "^4.7.7" + "license": "MIT", + "engines": { + "node": ">= 18" }, "peerDependencies": { - "typedoc": ">=0.24.0" + "typedoc": "0.27.x" + } + }, + "node_modules/typedoc-plugin-mdn-links": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/typedoc-plugin-mdn-links/-/typedoc-plugin-mdn-links-4.0.14.tgz", + "integrity": "sha512-IDILzJr4OzNb5uAWWRMZYny80Q6jUQerAwskdYbNMwaHMRwsB3+y8oqYYE7/PyH+kJVvJnCC4G2wnAQ3CLdgqA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "typedoc": "0.26.x || 0.27.x" + } + }, + "node_modules/typedoc-plugin-missing-exports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/typedoc-plugin-missing-exports/-/typedoc-plugin-missing-exports-3.1.0.tgz", + "integrity": "sha512-Sogbaj+qDa21NjB3SlIw4JXSwmcl/WOjwiPNaVEcPhpNG/MiRTtpwV81cT7h1cbu9StpONFPbddYWR0KV/fTWA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "typedoc": "0.26.x || 0.27.x" + } + }, + "node_modules/typedoc/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/typescript": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz", - "integrity": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -534,36 +2676,211 @@ "node": ">=14.17" } }, - "node_modules/uglify-js": { - "version": "3.17.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", - "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", "dev": true, - "optional": true, + "license": "MIT" + }, + "node_modules/underscore": { + "version": "1.13.7", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.7.tgz", + "integrity": "sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.1.1.tgz", + "integrity": "sha512-4GgM54XrwRfrOp297aIYspIti66k56v16ZnqHvrIM7mG+HjDlAwS7p+Srr7J6fGvEdOJ5JcQ/D9T7HhtdXDTzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.24.2", + "postcss": "^8.5.2", + "rollup": "^4.30.1" + }, "bin": { - "uglifyjs": "bin/uglifyjs" + "vite": "bin/vite.js" }, "engines": { - "node": ">=0.8.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } } }, - "node_modules/vscode-oniguruma": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", - "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", - "dev": true + "node_modules/vite-node": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.0.7.tgz", + "integrity": "sha512-2fX0QwX4GkkkpULXdT1Pf4q0tC1i1lFOyseKoonavXUNlQ77KpW2XqBGGNIm/J4Ows4KxgGJzDguYVPKwG/n5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.4.0", + "es-module-lexer": "^1.6.0", + "pathe": "^2.0.3", + "vite": "^5.0.0 || ^6.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } }, - "node_modules/vscode-textmate": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", - "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==", - "dev": true + "node_modules/vitest": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.0.7.tgz", + "integrity": "sha512-IP7gPK3LS3Fvn44x30X1dM9vtawm0aesAa2yBIZ9vQf+qB69NXC5776+Qmcr7ohUXIQuLhk7xQR0aSUIDPqavg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "3.0.7", + "@vitest/mocker": "3.0.7", + "@vitest/pretty-format": "^3.0.7", + "@vitest/runner": "3.0.7", + "@vitest/snapshot": "3.0.7", + "@vitest/spy": "3.0.7", + "@vitest/utils": "3.0.7", + "chai": "^5.2.0", + "debug": "^4.4.0", + "expect-type": "^1.1.0", + "magic-string": "^0.30.17", + "pathe": "^2.0.3", + "std-env": "^3.8.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.2", + "tinypool": "^1.0.2", + "tinyrainbow": "^2.0.0", + "vite": "^5.0.0 || ^6.0.0", + "vite-node": "3.0.7", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/debug": "^4.1.12", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "@vitest/browser": "3.0.7", + "@vitest/ui": "3.0.7", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/debug": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -574,17 +2891,36 @@ "node": ">= 8" } }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/workerpool": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", + "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", + "dev": true, + "license": "Apache-2.0" }, "node_modules/wrap-ansi": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -603,6 +2939,7 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -620,36 +2957,24 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/wrap-ansi-cjs/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -664,12 +2989,152 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yaml": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", + "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } } } From 7b2c04dcb2d579d349a0f2bb454f539e9bb791bb Mon Sep 17 00:00:00 2001 From: Fabio Massaioli Date: Tue, 25 Feb 2025 03:32:30 +0100 Subject: [PATCH 045/374] Update bundled runtime --- .../bundledassets/runtime.debug.js | 1997 ++++++++++++----- .../assetserver/bundledassets/runtime.js | 2 +- v3/internal/runtime/.gitignore | 3 +- v3/internal/runtime/Taskfile.yaml | 20 +- v3/internal/runtime/desktop/README.md | 6 +- v3/internal/runtime/desktop/compiled/main.js | 4 +- v3/internal/runtime/vite.config.ts | 7 - 7 files changed, 1424 insertions(+), 615 deletions(-) delete mode 100644 v3/internal/runtime/vite.config.ts diff --git a/v3/internal/assetserver/bundledassets/runtime.debug.js b/v3/internal/assetserver/bundledassets/runtime.debug.js index f7beb3c2f..738554ba3 100644 --- a/v3/internal/assetserver/bundledassets/runtime.debug.js +++ b/v3/internal/assetserver/bundledassets/runtime.debug.js @@ -1,15 +1,56 @@ var __defProp = Object.defineProperty; +var __defProps = Object.defineProperties; +var __getOwnPropDescs = Object.getOwnPropertyDescriptors; +var __getOwnPropSymbols = Object.getOwnPropertySymbols; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __propIsEnum = Object.prototype.propertyIsEnumerable; +var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; +var __spreadValues = (a, b) => { + for (var prop in b || (b = {})) + if (__hasOwnProp.call(b, prop)) + __defNormalProp(a, prop, b[prop]); + if (__getOwnPropSymbols) + for (var prop of __getOwnPropSymbols(b)) { + if (__propIsEnum.call(b, prop)) + __defNormalProp(a, prop, b[prop]); + } + return a; +}; +var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b)); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; +var __async = (__this, __arguments, generator) => { + return new Promise((resolve, reject) => { + var fulfilled = (value) => { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + }; + var rejected = (value) => { + try { + step(generator.throw(value)); + } catch (e) { + reject(e); + } + }; + var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected); + step((generator = generator.apply(__this, __arguments)).next()); + }); +}; -// desktop/@wailsio/runtime/src/index.js +// desktop/@wailsio/runtime/src/index.ts var index_exports = {}; __export(index_exports, { Application: () => application_exports, Browser: () => browser_exports, Call: () => calls_exports, + CancelError: () => CancelError, + CancellablePromise: () => CancellablePromise, + CancelledRejectionError: () => CancelledRejectionError, Clipboard: () => clipboard_exports, Create: () => create_exports, Dialogs: () => dialogs_exports, @@ -18,37 +59,36 @@ __export(index_exports, { Screens: () => screens_exports, System: () => system_exports, WML: () => wml_exports, - Window: () => window_default, - init: () => init + Window: () => window_default }); -// desktop/@wailsio/runtime/src/wml.js +// desktop/@wailsio/runtime/src/wml.ts var wml_exports = {}; __export(wml_exports, { Enable: () => Enable, Reload: () => Reload }); -// desktop/@wailsio/runtime/src/browser.js +// desktop/@wailsio/runtime/src/browser.ts var browser_exports = {}; __export(browser_exports, { OpenURL: () => OpenURL }); -// desktop/@wailsio/runtime/src/nanoid.js +// desktop/@wailsio/runtime/src/nanoid.ts var urlAlphabet = "useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict"; -var nanoid = (size = 21) => { +function nanoid(size = 21) { let id = ""; let i = size | 0; while (i--) { id += urlAlphabet[Math.random() * 64 | 0]; } return id; -}; +} -// desktop/@wailsio/runtime/src/runtime.js +// desktop/@wailsio/runtime/src/runtime.ts var runtimeURL = window.location.origin + "/wails/runtime"; -var objectNames = { +var objectNames = Object.freeze({ Call: 0, Clipboard: 1, Application: 2, @@ -60,50 +100,48 @@ var objectNames = { System: 8, Browser: 9, CancelCall: 10 -}; +}); var clientId = nanoid(); -function newRuntimeCallerWithID(object, windowName) { +function newRuntimeCaller(object, windowName = "") { return function(method, args = null) { return runtimeCallWithID(object, method, windowName, args); }; } -async function runtimeCallWithID(objectID, method, windowName, args) { - let url = new URL(runtimeURL); - if (objectID != null) { - url.searchParams.append("object", objectID); - } - if (method != null) { - url.searchParams.append("method", method); - } - let fetchOptions = { - headers: {} - }; - if (windowName) { - fetchOptions.headers["x-wails-window-name"] = windowName; - } - if (args) { - url.searchParams.append("args", JSON.stringify(args)); - } - fetchOptions.headers["x-wails-client-id"] = clientId; - let response = await fetch(url, fetchOptions); - if (!response.ok) { - throw new Error(await response.text()); - } - if (response.headers.get("Content-Type") && response.headers.get("Content-Type").indexOf("application/json") !== -1) { - return response.json(); - } else { - return response.text(); - } +function runtimeCallWithID(objectID, method, windowName, args) { + return __async(this, null, function* () { + var _a2, _b; + let url = new URL(runtimeURL); + url.searchParams.append("object", objectID.toString()); + url.searchParams.append("method", method.toString()); + if (args) { + url.searchParams.append("args", JSON.stringify(args)); + } + let headers = { + ["x-wails-client-id"]: clientId + }; + if (windowName) { + headers["x-wails-window-name"] = windowName; + } + let response = yield fetch(url, { headers }); + if (!response.ok) { + throw new Error(yield response.text()); + } + if (((_b = (_a2 = response.headers.get("Content-Type")) == null ? void 0 : _a2.indexOf("application/json")) != null ? _b : -1) !== -1) { + return response.json(); + } else { + return response.text(); + } + }); } -// desktop/@wailsio/runtime/src/browser.js -var call = newRuntimeCallerWithID(objectNames.Browser, ""); +// desktop/@wailsio/runtime/src/browser.ts +var call = newRuntimeCaller(objectNames.Browser); var BrowserOpenURL = 0; function OpenURL(url) { - return call(BrowserOpenURL, { url }); + return call(BrowserOpenURL, { url: url.toString() }); } -// desktop/@wailsio/runtime/src/dialogs.js +// desktop/@wailsio/runtime/src/dialogs.ts var dialogs_exports = {}; __export(dialogs_exports, { Error: () => Error2, @@ -116,14 +154,38 @@ __export(dialogs_exports, { window._wails = window._wails || {}; window._wails.dialogErrorCallback = dialogErrorCallback; window._wails.dialogResultCallback = dialogResultCallback; +var call2 = newRuntimeCaller(objectNames.Dialog); +var dialogResponses = /* @__PURE__ */ new Map(); var DialogInfo = 0; var DialogWarning = 1; var DialogError = 2; var DialogQuestion = 3; var DialogOpenFile = 4; var DialogSaveFile = 5; -var call2 = newRuntimeCallerWithID(objectNames.Dialog, ""); -var dialogResponses = /* @__PURE__ */ new Map(); +function dialogResultCallback(id, data, isJSON) { + let resolvers = getAndDeleteResponse(id); + if (!resolvers) { + return; + } + if (isJSON) { + try { + resolvers.resolve(JSON.parse(data)); + } catch (err) { + resolvers.reject(new TypeError("could not parse result: " + err.message, { cause: err })); + } + } else { + resolvers.resolve(data); + } +} +function dialogErrorCallback(id, message) { + var _a2; + (_a2 = getAndDeleteResponse(id)) == null ? void 0 : _a2.reject(new window.Error(message)); +} +function getAndDeleteResponse(id) { + const response = dialogResponses.get(id); + dialogResponses.delete(id); + return response; +} function generateID() { let result; do { @@ -131,43 +193,37 @@ function generateID() { } while (dialogResponses.has(result)); return result; } -function dialog(type2, options = {}) { +function dialog(type, options = {}) { const id = generateID(); - options["dialog-id"] = id; return new Promise((resolve, reject) => { dialogResponses.set(id, { resolve, reject }); - call2(type2, options).catch((error) => { - reject(error); + call2(type, Object.assign({ "dialog-id": id }, options)).catch((err) => { dialogResponses.delete(id); + reject(err); }); }); } -function dialogResultCallback(id, data, isJSON) { - let p = dialogResponses.get(id); - if (p) { - dialogResponses.delete(id); - if (isJSON) { - p.resolve(JSON.parse(data)); - } else { - p.resolve(data); - } - } +function Info(options) { + return dialog(DialogInfo, options); } -function dialogErrorCallback(id, message) { - let p = dialogResponses.get(id); - if (p) { - dialogResponses.delete(id); - p.reject(new Error2(message)); - } +function Warning(options) { + return dialog(DialogWarning, options); +} +function Error2(options) { + return dialog(DialogError, options); +} +function Question(options) { + return dialog(DialogQuestion, options); +} +function OpenFile(options) { + var _a2; + return (_a2 = dialog(DialogOpenFile, options)) != null ? _a2 : []; +} +function SaveFile(options) { + return dialog(DialogSaveFile, options); } -var Info = (options) => dialog(DialogInfo, options); -var Warning = (options) => dialog(DialogWarning, options); -var Error2 = (options) => dialog(DialogError, options); -var Question = (options) => dialog(DialogQuestion, options); -var OpenFile = (options) => dialog(DialogOpenFile, options); -var SaveFile = (options) => dialog(DialogSaveFile, options); -// desktop/@wailsio/runtime/src/events.js +// desktop/@wailsio/runtime/src/events.ts var events_exports = {}; __export(events_exports, { Emit: () => Emit, @@ -177,13 +233,44 @@ __export(events_exports, { OnMultiple: () => OnMultiple, Once: () => Once, Types: () => Types, - WailsEvent: () => WailsEvent, - setup: () => setup + WailsEvent: () => WailsEvent }); -// desktop/@wailsio/runtime/src/event_types.js -var EventTypes = { - Windows: { +// desktop/@wailsio/runtime/src/listener.ts +var eventListeners = /* @__PURE__ */ new Map(); +var Listener = class { + constructor(eventName, callback, maxCallbacks) { + this.eventName = eventName; + this.callback = callback; + this.maxCallbacks = maxCallbacks || -1; + } + dispatch(data) { + try { + this.callback(data); + } catch (err) { + console.error(err); + } + if (this.maxCallbacks === -1) return false; + this.maxCallbacks -= 1; + return this.maxCallbacks === 0; + } +}; +function listenerOff(listener) { + let listeners = eventListeners.get(listener.eventName); + if (!listeners) { + return; + } + listeners = listeners.filter((l) => l !== listener); + if (listeners.length === 0) { + eventListeners.delete(listener.eventName); + } else { + eventListeners.set(listener.eventName, listeners); + } +} + +// desktop/@wailsio/runtime/src/event_types.ts +var Types = Object.freeze({ + Windows: Object.freeze({ APMPowerSettingChange: "windows:APMPowerSettingChange", APMPowerStatusChange: "windows:APMPowerStatusChange", APMResumeAutomatic: "windows:APMResumeAutomatic", @@ -228,8 +315,8 @@ var EventTypes = { WindowUnMinimise: "windows:WindowUnMinimise", WindowMaximise: "windows:WindowMaximise", WindowUnMaximise: "windows:WindowUnMaximise" - }, - Mac: { + }), + Mac: Object.freeze({ ApplicationDidBecomeActive: "mac:ApplicationDidBecomeActive", ApplicationDidChangeBackingProperties: "mac:ApplicationDidChangeBackingProperties", ApplicationDidChangeEffectiveAppearance: "mac:ApplicationDidChangeEffectiveAppearance", @@ -362,8 +449,8 @@ var EventTypes = { WindowZoomIn: "mac:WindowZoomIn", WindowZoomOut: "mac:WindowZoomOut", WindowZoomReset: "mac:WindowZoomReset" - }, - Linux: { + }), + Linux: Object.freeze({ ApplicationStartup: "linux:ApplicationStartup", SystemThemeChanged: "linux:SystemThemeChanged", WindowDeleteEvent: "linux:WindowDeleteEvent", @@ -372,8 +459,8 @@ var EventTypes = { WindowFocusIn: "linux:WindowFocusIn", WindowFocusOut: "linux:WindowFocusOut", WindowLoadChanged: "linux:WindowLoadChanged" - }, - Common: { + }), + Common: Object.freeze({ ApplicationOpenedWithFile: "common:ApplicationOpenedWithFile", ApplicationStarted: "common:ApplicationStarted", ThemeChanged: "common:ThemeChanged", @@ -398,48 +485,34 @@ var EventTypes = { WindowZoomIn: "common:WindowZoomIn", WindowZoomOut: "common:WindowZoomOut", WindowZoomReset: "common:WindowZoomReset" - } -}; + }) +}); -// desktop/@wailsio/runtime/src/events.js -var Types = EventTypes; +// desktop/@wailsio/runtime/src/events.ts window._wails = window._wails || {}; window._wails.dispatchWailsEvent = dispatchWailsEvent; -var call3 = newRuntimeCallerWithID(objectNames.Events, ""); +var call3 = newRuntimeCaller(objectNames.Events); var EmitMethod = 0; -var eventListeners = /* @__PURE__ */ new Map(); -var Listener = class { - constructor(eventName, callback, maxCallbacks) { - this.eventName = eventName; - this.maxCallbacks = maxCallbacks || -1; - this.Callback = (data) => { - callback(data); - if (this.maxCallbacks === -1) return false; - this.maxCallbacks -= 1; - return this.maxCallbacks === 0; - }; - } -}; var WailsEvent = class { constructor(name, data = null) { this.name = name; this.data = data; } }; -function setup() { -} function dispatchWailsEvent(event) { let listeners = eventListeners.get(event.name); - if (listeners) { - let toRemove = listeners.filter((listener) => { - let remove = listener.Callback(event); - if (remove) return true; - }); - if (toRemove.length > 0) { - listeners = listeners.filter((l) => !toRemove.includes(l)); - if (listeners.length === 0) eventListeners.delete(event.name); - else eventListeners.set(event.name, listeners); - } + if (!listeners) { + return; + } + let wailsEvent = new WailsEvent(event.name, event.data); + if ("sender" in event) { + wailsEvent.sender = event.sender; + } + listeners = listeners.filter((listener) => !listener.dispatch(wailsEvent)); + if (listeners.length === 0) { + eventListeners.delete(event.name); + } else { + eventListeners.set(event.name, listeners); } } function OnMultiple(eventName, callback, maxCallbacks) { @@ -455,15 +528,8 @@ function On(eventName, callback) { function Once(eventName, callback) { return OnMultiple(eventName, callback, 1); } -function listenerOff(listener) { - const eventName = listener.eventName; - let listeners = eventListeners.get(eventName).filter((l) => l !== listener); - if (listeners.length === 0) eventListeners.delete(eventName); - else eventListeners.set(eventName, listeners); -} -function Off(eventName, ...additionalEventNames) { - let eventsToRemove = [eventName, ...additionalEventNames]; - eventsToRemove.forEach((eventName2) => eventListeners.delete(eventName2)); +function Off(...eventNames) { + eventNames.forEach((eventName) => eventListeners.delete(eventName)); } function OffAll() { eventListeners.clear(); @@ -472,7 +538,7 @@ function Emit(event) { return call3(EmitMethod, event); } -// desktop/@wailsio/runtime/src/utils.js +// desktop/@wailsio/runtime/src/utils.ts function debugLog(message) { console.log( "%c wails3 %c " + message + " ", @@ -480,21 +546,26 @@ function debugLog(message) { "background: #009900; color: #fff; border-radius: 0px 3px 3px 0px; padding: 1px; font-size: 0.7rem" ); } +function canTrackButtons() { + return new MouseEvent("mousedown").buttons === 0; +} function canAbortListeners() { if (!EventTarget || !AbortSignal || !AbortController) return false; let result = true; const target = new EventTarget(); - const controller2 = new AbortController(); + const controller = new AbortController(); target.addEventListener("test", () => { result = false; - }, { signal: controller2.signal }); - controller2.abort(); + }, { signal: controller.signal }); + controller.abort(); target.dispatchEvent(new CustomEvent("test")); return result; } var isReady = false; -document.addEventListener("DOMContentLoaded", () => isReady = true); +document.addEventListener("DOMContentLoaded", () => { + isReady = true; +}); function whenReady(callback) { if (isReady || document.readyState === "complete") { callback(); @@ -503,7 +574,7 @@ function whenReady(callback) { } } -// desktop/@wailsio/runtime/src/window.js +// desktop/@wailsio/runtime/src/window.ts var PositionMethod = 0; var CenterMethod = 1; var CloseMethod = 2; @@ -552,16 +623,17 @@ var ZoomMethod = 44; var ZoomInMethod = 45; var ZoomOutMethod = 46; var ZoomResetMethod = 47; -var caller = Symbol(); -var Window = class _Window { +var callerSym = Symbol("caller"); +callerSym; +var _Window = class _Window { /** * Initialises a window object with the specified name. * * @private - * @param {string} name - The name of the target window. + * @param name - The name of the target window. */ constructor(name = "") { - this[caller] = newRuntimeCallerWithID(objectNames.Window, name); + this[callerSym] = newRuntimeCaller(objectNames.Window, name); for (const method of Object.getOwnPropertyNames(_Window.prototype)) { if (method !== "constructor" && typeof this[method] === "function") { this[method] = this[method].bind(this); @@ -571,9 +643,8 @@ var Window = class _Window { /** * Gets the specified window. * - * @public - * @param {string} name - The name of the window to get. - * @return {Window} - The corresponding window object. + * @param name - The name of the window to get. + * @returns The corresponding window object. */ Get(name) { return new _Window(name); @@ -581,460 +652,355 @@ var Window = class _Window { /** * Returns the absolute position of the window. * - * @public - * @return {Promise} - The current absolute position of the window. + * @returns The current absolute position of the window. */ Position() { - return this[caller](PositionMethod); + return this[callerSym](PositionMethod); } /** * Centers the window on the screen. - * - * @public - * @return {Promise} */ Center() { - return this[caller](CenterMethod); + return this[callerSym](CenterMethod); } /** * Closes the window. - * - * @public - * @return {Promise} */ Close() { - return this[caller](CloseMethod); + return this[callerSym](CloseMethod); } /** * Disables min/max size constraints. - * - * @public - * @return {Promise} */ DisableSizeConstraints() { - return this[caller](DisableSizeConstraintsMethod); + return this[callerSym](DisableSizeConstraintsMethod); } /** * Enables min/max size constraints. - * - * @public - * @return {Promise} */ EnableSizeConstraints() { - return this[caller](EnableSizeConstraintsMethod); + return this[callerSym](EnableSizeConstraintsMethod); } /** * Focuses the window. - * - * @public - * @return {Promise} */ Focus() { - return this[caller](FocusMethod); + return this[callerSym](FocusMethod); } /** * Forces the window to reload the page assets. - * - * @public - * @return {Promise} */ ForceReload() { - return this[caller](ForceReloadMethod); + return this[callerSym](ForceReloadMethod); } /** - * Doc. - * - * @public - * @return {Promise} + * Switches the window to fullscreen mode. */ Fullscreen() { - return this[caller](FullscreenMethod); + return this[callerSym](FullscreenMethod); } /** * Returns the screen that the window is on. * - * @public - * @return {Promise} - The screen the window is currently on + * @returns The screen the window is currently on. */ GetScreen() { - return this[caller](GetScreenMethod); + return this[callerSym](GetScreenMethod); } /** * Returns the current zoom level of the window. * - * @public - * @return {Promise} - The current zoom level + * @returns The current zoom level. */ GetZoom() { - return this[caller](GetZoomMethod); + return this[callerSym](GetZoomMethod); } /** * Returns the height of the window. * - * @public - * @return {Promise} - The current height of the window + * @returns The current height of the window. */ Height() { - return this[caller](HeightMethod); + return this[callerSym](HeightMethod); } /** * Hides the window. - * - * @public - * @return {Promise} */ Hide() { - return this[caller](HideMethod); + return this[callerSym](HideMethod); } /** * Returns true if the window is focused. * - * @public - * @return {Promise} - Whether the window is currently focused + * @returns Whether the window is currently focused. */ IsFocused() { - return this[caller](IsFocusedMethod); + return this[callerSym](IsFocusedMethod); } /** * Returns true if the window is fullscreen. * - * @public - * @return {Promise} - Whether the window is currently fullscreen + * @returns Whether the window is currently fullscreen. */ IsFullscreen() { - return this[caller](IsFullscreenMethod); + return this[callerSym](IsFullscreenMethod); } /** * Returns true if the window is maximised. * - * @public - * @return {Promise} - Whether the window is currently maximised + * @returns Whether the window is currently maximised. */ IsMaximised() { - return this[caller](IsMaximisedMethod); + return this[callerSym](IsMaximisedMethod); } /** * Returns true if the window is minimised. * - * @public - * @return {Promise} - Whether the window is currently minimised + * @returns Whether the window is currently minimised. */ IsMinimised() { - return this[caller](IsMinimisedMethod); + return this[callerSym](IsMinimisedMethod); } /** * Maximises the window. - * - * @public - * @return {Promise} */ Maximise() { - return this[caller](MaximiseMethod); + return this[callerSym](MaximiseMethod); } /** * Minimises the window. - * - * @public - * @return {Promise} */ Minimise() { - return this[caller](MinimiseMethod); + return this[callerSym](MinimiseMethod); } /** * Returns the name of the window. * - * @public - * @return {Promise} - The name of the window + * @returns The name of the window. */ Name() { - return this[caller](NameMethod); + return this[callerSym](NameMethod); } /** * Opens the development tools pane. - * - * @public - * @return {Promise} */ OpenDevTools() { - return this[caller](OpenDevToolsMethod); + return this[callerSym](OpenDevToolsMethod); } /** * Returns the relative position of the window to the screen. * - * @public - * @return {Promise} - The current relative position of the window + * @returns The current relative position of the window. */ RelativePosition() { - return this[caller](RelativePositionMethod); + return this[callerSym](RelativePositionMethod); } /** * Reloads the page assets. - * - * @public - * @return {Promise} */ Reload() { - return this[caller](ReloadMethod); + return this[callerSym](ReloadMethod); } /** * Returns true if the window is resizable. * - * @public - * @return {Promise} - Whether the window is currently resizable + * @returns Whether the window is currently resizable. */ Resizable() { - return this[caller](ResizableMethod); + return this[callerSym](ResizableMethod); } /** * Restores the window to its previous state if it was previously minimised, maximised or fullscreen. - * - * @public - * @return {Promise} */ Restore() { - return this[caller](RestoreMethod); + return this[callerSym](RestoreMethod); } /** * Sets the absolute position of the window. * - * @public - * @param {number} x - The desired horizontal absolute position of the window - * @param {number} y - The desired vertical absolute position of the window - * @return {Promise} + * @param x - The desired horizontal absolute position of the window. + * @param y - The desired vertical absolute position of the window. */ SetPosition(x, y) { - return this[caller](SetPositionMethod, { x, y }); + return this[callerSym](SetPositionMethod, { x, y }); } /** * Sets the window to be always on top. * - * @public - * @param {boolean} alwaysOnTop - Whether the window should stay on top - * @return {Promise} + * @param alwaysOnTop - Whether the window should stay on top. */ SetAlwaysOnTop(alwaysOnTop) { - return this[caller](SetAlwaysOnTopMethod, { alwaysOnTop }); + return this[callerSym](SetAlwaysOnTopMethod, { alwaysOnTop }); } /** * Sets the background colour of the window. * - * @public - * @param {number} r - The desired red component of the window background - * @param {number} g - The desired green component of the window background - * @param {number} b - The desired blue component of the window background - * @param {number} a - The desired alpha component of the window background - * @return {Promise} + * @param r - The desired red component of the window background. + * @param g - The desired green component of the window background. + * @param b - The desired blue component of the window background. + * @param a - The desired alpha component of the window background. */ SetBackgroundColour(r, g, b, a) { - return this[caller](SetBackgroundColourMethod, { r, g, b, a }); + return this[callerSym](SetBackgroundColourMethod, { r, g, b, a }); } /** * Removes the window frame and title bar. * - * @public - * @param {boolean} frameless - Whether the window should be frameless - * @return {Promise} + * @param frameless - Whether the window should be frameless. */ SetFrameless(frameless) { - return this[caller](SetFramelessMethod, { frameless }); + return this[callerSym](SetFramelessMethod, { frameless }); } /** * Disables the system fullscreen button. * - * @public - * @param {boolean} enabled - Whether the fullscreen button should be enabled - * @return {Promise} + * @param enabled - Whether the fullscreen button should be enabled. */ SetFullscreenButtonEnabled(enabled) { - return this[caller](SetFullscreenButtonEnabledMethod, { enabled }); + return this[callerSym](SetFullscreenButtonEnabledMethod, { enabled }); } /** * Sets the maximum size of the window. * - * @public - * @param {number} width - The desired maximum width of the window - * @param {number} height - The desired maximum height of the window - * @return {Promise} + * @param width - The desired maximum width of the window. + * @param height - The desired maximum height of the window. */ SetMaxSize(width, height) { - return this[caller](SetMaxSizeMethod, { width, height }); + return this[callerSym](SetMaxSizeMethod, { width, height }); } /** * Sets the minimum size of the window. * - * @public - * @param {number} width - The desired minimum width of the window - * @param {number} height - The desired minimum height of the window - * @return {Promise} + * @param width - The desired minimum width of the window. + * @param height - The desired minimum height of the window. */ SetMinSize(width, height) { - return this[caller](SetMinSizeMethod, { width, height }); + return this[callerSym](SetMinSizeMethod, { width, height }); } /** * Sets the relative position of the window to the screen. * - * @public - * @param {number} x - The desired horizontal relative position of the window - * @param {number} y - The desired vertical relative position of the window - * @return {Promise} + * @param x - The desired horizontal relative position of the window. + * @param y - The desired vertical relative position of the window. */ SetRelativePosition(x, y) { - return this[caller](SetRelativePositionMethod, { x, y }); + return this[callerSym](SetRelativePositionMethod, { x, y }); } /** * Sets whether the window is resizable. * - * @public - * @param {boolean} resizable - Whether the window should be resizable - * @return {Promise} + * @param resizable - Whether the window should be resizable. */ SetResizable(resizable2) { - return this[caller](SetResizableMethod, { resizable: resizable2 }); + return this[callerSym](SetResizableMethod, { resizable: resizable2 }); } /** * Sets the size of the window. * - * @public - * @param {number} width - The desired width of the window - * @param {number} height - The desired height of the window - * @return {Promise} + * @param width - The desired width of the window. + * @param height - The desired height of the window. */ SetSize(width, height) { - return this[caller](SetSizeMethod, { width, height }); + return this[callerSym](SetSizeMethod, { width, height }); } /** * Sets the title of the window. * - * @public - * @param {string} title - The desired title of the window - * @return {Promise} + * @param title - The desired title of the window. */ SetTitle(title) { - return this[caller](SetTitleMethod, { title }); + return this[callerSym](SetTitleMethod, { title }); } /** * Sets the zoom level of the window. * - * @public - * @param {number} zoom - The desired zoom level - * @return {Promise} + * @param zoom - The desired zoom level. */ SetZoom(zoom) { - return this[caller](SetZoomMethod, { zoom }); + return this[callerSym](SetZoomMethod, { zoom }); } /** * Shows the window. - * - * @public - * @return {Promise} */ Show() { - return this[caller](ShowMethod); + return this[callerSym](ShowMethod); } /** * Returns the size of the window. * - * @public - * @return {Promise} - The current size of the window + * @returns The current size of the window. */ Size() { - return this[caller](SizeMethod); + return this[callerSym](SizeMethod); } /** * Toggles the window between fullscreen and normal. - * - * @public - * @return {Promise} */ ToggleFullscreen() { - return this[caller](ToggleFullscreenMethod); + return this[callerSym](ToggleFullscreenMethod); } /** * Toggles the window between maximised and normal. - * - * @public - * @return {Promise} */ ToggleMaximise() { - return this[caller](ToggleMaximiseMethod); + return this[callerSym](ToggleMaximiseMethod); } /** * Un-fullscreens the window. - * - * @public - * @return {Promise} */ UnFullscreen() { - return this[caller](UnFullscreenMethod); + return this[callerSym](UnFullscreenMethod); } /** * Un-maximises the window. - * - * @public - * @return {Promise} */ UnMaximise() { - return this[caller](UnMaximiseMethod); + return this[callerSym](UnMaximiseMethod); } /** * Un-minimises the window. - * - * @public - * @return {Promise} */ UnMinimise() { - return this[caller](UnMinimiseMethod); + return this[callerSym](UnMinimiseMethod); } /** * Returns the width of the window. * - * @public - * @return {Promise} - The current width of the window + * @returns The current width of the window. */ Width() { - return this[caller](WidthMethod); + return this[callerSym](WidthMethod); } /** * Zooms the window. - * - * @public - * @return {Promise} */ Zoom() { - return this[caller](ZoomMethod); + return this[callerSym](ZoomMethod); } /** * Increases the zoom level of the webview content. - * - * @public - * @return {Promise} */ ZoomIn() { - return this[caller](ZoomInMethod); + return this[callerSym](ZoomInMethod); } /** * Decreases the zoom level of the webview content. - * - * @public - * @return {Promise} */ ZoomOut() { - return this[caller](ZoomOutMethod); + return this[callerSym](ZoomOutMethod); } /** * Resets the zoom level of the webview content. - * - * @public - * @return {Promise} */ ZoomReset() { - return this[caller](ZoomResetMethod); + return this[callerSym](ZoomResetMethod); } }; +var Window = _Window; var thisWindow = new Window(""); var window_default = thisWindow; -// desktop/@wailsio/runtime/src/wml.js +// desktop/@wailsio/runtime/src/wml.ts function sendEvent(eventName, data = null) { Emit(new WailsEvent(eventName, data)); } @@ -1056,10 +1022,10 @@ function onWMLTriggered(ev) { function runEffect(choice = "Yes") { if (choice !== "Yes") return; - const eventType = element.getAttribute("data-wml-event"); - const targetWindow = element.getAttribute("data-wml-target-window") || ""; - const windowMethod = element.getAttribute("data-wml-window"); - const url = element.getAttribute("data-wml-openURL"); + const eventType = element.getAttribute("wml-event") || element.getAttribute("data-wml-event"); + const targetWindow = element.getAttribute("wml-target-window") || element.getAttribute("data-wml-target-window") || ""; + const windowMethod = element.getAttribute("wml-window") || element.getAttribute("data-wml-window"); + const url = element.getAttribute("wml-openurl") || element.getAttribute("data-wml-openurl"); if (eventType !== null) sendEvent(eventType); if (windowMethod !== null) @@ -1067,7 +1033,7 @@ function onWMLTriggered(ev) { if (url !== null) void OpenURL(url); } - const confirm = element.getAttribute("data-wml-confirm"); + const confirm = element.getAttribute("wml-confirm") || element.getAttribute("data-wml-confirm"); if (confirm) { Question({ Title: "Confirm", @@ -1082,75 +1048,75 @@ function onWMLTriggered(ev) { runEffect(); } } -var controller = Symbol(); +var controllerSym = Symbol("controller"); +var triggerMapSym = Symbol("triggerMap"); +var elementCountSym = Symbol("elementCount"); +controllerSym; var AbortControllerRegistry = class { constructor() { - this[controller] = new AbortController(); + this[controllerSym] = new AbortController(); } /** * Returns an options object for addEventListener that ties the listener * to the AbortSignal from the current AbortController. * - * @param {HTMLElement} element An HTML element - * @param {string[]} triggers The list of active WML trigger events for the specified elements - * @returns {AddEventListenerOptions} + * @param element - An HTML element + * @param triggers - The list of active WML trigger events for the specified elements */ set(element, triggers) { - return { signal: this[controller].signal }; + return { signal: this[controllerSym].signal }; } /** - * Removes all registered event listeners. - * - * @returns {void} + * Removes all registered event listeners and resets the registry. */ reset() { - this[controller].abort(); - this[controller] = new AbortController(); + this[controllerSym].abort(); + this[controllerSym] = new AbortController(); } }; -var triggerMap = Symbol(); -var elementCount = Symbol(); +triggerMapSym, elementCountSym; var WeakMapRegistry = class { constructor() { - this[triggerMap] = /* @__PURE__ */ new WeakMap(); - this[elementCount] = 0; + this[triggerMapSym] = /* @__PURE__ */ new WeakMap(); + this[elementCountSym] = 0; } /** - * Sets the active triggers for the specified element. + * Sets active triggers for the specified element. * - * @param {HTMLElement} element An HTML element - * @param {string[]} triggers The list of active WML trigger events for the specified element - * @returns {AddEventListenerOptions} + * @param element - An HTML element + * @param triggers - The list of active WML trigger events for the specified element */ set(element, triggers) { - this[elementCount] += !this[triggerMap].has(element); - this[triggerMap].set(element, triggers); + if (!this[triggerMapSym].has(element)) { + this[elementCountSym]++; + } + this[triggerMapSym].set(element, triggers); return {}; } /** * Removes all registered event listeners. - * - * @returns {void} */ reset() { - if (this[elementCount] <= 0) + if (this[elementCountSym] <= 0) return; for (const element of document.body.querySelectorAll("*")) { - if (this[elementCount] <= 0) + if (this[elementCountSym] <= 0) break; - const triggers = this[triggerMap].get(element); - this[elementCount] -= typeof triggers !== "undefined"; + const triggers = this[triggerMapSym].get(element); + if (triggers != null) { + this[elementCountSym]--; + } for (const trigger of triggers || []) element.removeEventListener(trigger, onWMLTriggered); } - this[triggerMap] = /* @__PURE__ */ new WeakMap(); - this[elementCount] = 0; + this[triggerMapSym] = /* @__PURE__ */ new WeakMap(); + this[elementCountSym] = 0; } }; var triggerRegistry = canAbortListeners() ? new AbortControllerRegistry() : new WeakMapRegistry(); function addWMLListeners(element) { const triggerRegExp = /\S+/g; - const triggerAttr = element.getAttribute("data-wml-trigger") || "click"; + const triggerAttr = element.getAttribute("wml-trigger") || element.getAttribute("data-wml-trigger") || "click"; const triggers = []; let match; while ((match = triggerRegExp.exec(triggerAttr)) !== null) @@ -1164,7 +1130,7 @@ function Enable() { } function Reload() { triggerRegistry.reset(); - document.body.querySelectorAll("[data-wml-event], [data-wml-window], [data-wml-openURL]").forEach(addWMLListeners); + document.body.querySelectorAll("[wml-event], [wml-window], [wml-openurl], [data-wml-event], [data-wml-window], [data-wml-openurl]").forEach(addWMLListeners); } // desktop/compiled/main.js @@ -1174,7 +1140,7 @@ if (true) { debugLog("Wails Runtime Loaded"); } -// desktop/@wailsio/runtime/src/system.js +// desktop/@wailsio/runtime/src/system.ts var system_exports = {}; __export(system_exports, { Capabilities: () => Capabilities, @@ -1189,40 +1155,45 @@ __export(system_exports, { IsWindows: () => IsWindows, invoke: () => invoke }); -var call4 = newRuntimeCallerWithID(objectNames.System, ""); -var systemIsDarkMode = 0; -var environment = 1; -var _invoke = (() => { +var call4 = newRuntimeCaller(objectNames.System); +var SystemIsDarkMode = 0; +var SystemEnvironment = 1; +var _invoke = function() { + var _a2, _b, _c, _d, _e; try { - if (window?.chrome?.webview) { - return (msg) => window.chrome.webview.postMessage(msg); - } - if (window?.webkit?.messageHandlers?.external) { - return (msg) => window.webkit.messageHandlers.external.postMessage(msg); + if ((_b = (_a2 = window.chrome) == null ? void 0 : _a2.webview) == null ? void 0 : _b.postMessage) { + return window.chrome.webview.postMessage.bind(window.chrome.webview); + } else if ((_e = (_d = (_c = window.webkit) == null ? void 0 : _c.messageHandlers) == null ? void 0 : _d["external"]) == null ? void 0 : _e.postMessage) { + return window.webkit.messageHandlers["external"].postMessage.bind(window.webkit.messageHandlers["external"]); } } catch (e) { - console.warn( - "\n%c\u26A0\uFE0F Browser Environment Detected %c\n\n%cOnly UI previews are available in the browser. For full functionality, please run the application in desktop mode.\nMore information at: https://v3.wails.io/learn/build/#using-a-browser-for-development\n", - "background: #ffffff; color: #000000; font-weight: bold; padding: 4px 8px; border-radius: 4px; border: 2px solid #000000;", - "background: transparent;", - "color: #ffffff; font-style: italic; font-weight: bold;" - ); } + console.warn( + "\n%c\u26A0\uFE0F Browser Environment Detected %c\n\n%cOnly UI previews are available in the browser. For full functionality, please run the application in desktop mode.\nMore information at: https://v3.wails.io/learn/build/#using-a-browser-for-development\n", + "background: #ffffff; color: #000000; font-weight: bold; padding: 4px 8px; border-radius: 4px; border: 2px solid #000000;", + "background: transparent;", + "color: #ffffff; font-style: italic; font-weight: bold;" + ); return null; -})(); +}(); function invoke(msg) { - if (!_invoke) return; - return _invoke(msg); + return _invoke == null ? void 0 : _invoke(msg); } function IsDarkMode() { - return call4(systemIsDarkMode); + return call4(SystemIsDarkMode); } function Capabilities() { - let response = fetch("/wails/capabilities"); - return response.json(); + return __async(this, null, function* () { + let response = yield fetch("/wails/capabilities"); + if (response.ok) { + return response.json(); + } else { + throw new Error("could not fetch capabilities: " + response.statusText); + } + }); } function Environment() { - return call4(environment); + return call4(SystemEnvironment); } function IsWindows() { return window._wails.environment.OS === "windows"; @@ -1243,61 +1214,74 @@ function IsARM64() { return window._wails.environment.Arch === "arm64"; } function IsDebug() { - return window._wails.environment.Debug === true; + return Boolean(window._wails.environment.Debug); } -// desktop/@wailsio/runtime/src/contextmenu.js +// desktop/@wailsio/runtime/src/contextmenu.ts window.addEventListener("contextmenu", contextMenuHandler); -var call5 = newRuntimeCallerWithID(objectNames.ContextMenu, ""); +var call5 = newRuntimeCaller(objectNames.ContextMenu); var ContextMenuOpen = 0; function openContextMenu(id, x, y, data) { void call5(ContextMenuOpen, { id, x, y, data }); } function contextMenuHandler(event) { - let element = event.target; - let customContextMenu = window.getComputedStyle(element).getPropertyValue("--custom-contextmenu"); - customContextMenu = customContextMenu ? customContextMenu.trim() : ""; + var _a2; + let target; + if (event.target instanceof HTMLElement) { + target = event.target; + } else if (!(event.target instanceof HTMLElement) && event.target instanceof Node) { + target = (_a2 = event.target.parentElement) != null ? _a2 : document.body; + } else { + target = document.body; + } + let customContextMenu = window.getComputedStyle(target).getPropertyValue("--custom-contextmenu").trim(); if (customContextMenu) { event.preventDefault(); - let customContextMenuData = window.getComputedStyle(element).getPropertyValue("--custom-contextmenu-data"); - openContextMenu(customContextMenu, event.clientX, event.clientY, customContextMenuData); + let data = window.getComputedStyle(target).getPropertyValue("--custom-contextmenu-data"); + openContextMenu(customContextMenu, event.clientX, event.clientY, data); return; } processDefaultContextMenu(event); } function processDefaultContextMenu(event) { + var _a2; if (IsDebug()) { return; } - const element = event.target; - const computedStyle = window.getComputedStyle(element); - const defaultContextMenuAction = computedStyle.getPropertyValue("--default-contextmenu").trim(); - switch (defaultContextMenuAction) { + let target; + if (event.target instanceof HTMLElement) { + target = event.target; + } else if (!(event.target instanceof HTMLElement) && event.target instanceof Node) { + target = (_a2 = event.target.parentElement) != null ? _a2 : document.body; + } else { + target = document.body; + } + switch (window.getComputedStyle(target).getPropertyValue("--default-contextmenu").trim()) { case "show": return; case "hide": event.preventDefault(); return; default: - if (element.isContentEditable) { + if (target.isContentEditable) { return; } const selection = window.getSelection(); - const hasSelection = selection.toString().length > 0; + const hasSelection = selection && selection.toString().length > 0; if (hasSelection) { for (let i = 0; i < selection.rangeCount; i++) { const range = selection.getRangeAt(i); const rects = range.getClientRects(); for (let j = 0; j < rects.length; j++) { const rect = rects[j]; - if (document.elementFromPoint(rect.left, rect.top) === element) { + if (document.elementFromPoint(rect.left, rect.top) === target) { return; } } } } - if (element.tagName === "INPUT" || element.tagName === "TEXTAREA") { - if (hasSelection || !element.readOnly && !element.disabled) { + if (target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement) { + if (hasSelection || !target.readOnly && !target.disabled) { return; } } @@ -1305,92 +1289,150 @@ function processDefaultContextMenu(event) { } } -// desktop/@wailsio/runtime/src/flags.js +// desktop/@wailsio/runtime/src/flags.ts var flags_exports = {}; __export(flags_exports, { GetFlag: () => GetFlag }); -function GetFlag(keyString) { +function GetFlag(key) { try { - return window._wails.flags[keyString]; + return window._wails.flags[key]; } catch (e) { - throw new Error("Unable to retrieve flag '" + keyString + "': " + e); + throw new Error("Unable to retrieve flag '" + key + "': " + e, { cause: e }); } } -// desktop/@wailsio/runtime/src/drag.js -var shouldDrag = false; +// desktop/@wailsio/runtime/src/drag.ts +var canDrag = false; +var dragging = false; var resizable = false; -var resizeEdge = null; +var canResize = false; +var resizing = false; +var resizeEdge = ""; var defaultCursor = "auto"; +var buttons = 0; +var buttonsTracked = canTrackButtons(); window._wails = window._wails || {}; -window._wails.setResizable = function(value) { +window._wails.setResizable = (value) => { resizable = value; -}; -window._wails.endDrag = function() { - document.body.style.cursor = "default"; - shouldDrag = false; -}; -window.addEventListener("mousedown", onMouseDown); -window.addEventListener("mousemove", onMouseMove); -window.addEventListener("mouseup", onMouseUp); -function dragTest(e) { - let val = window.getComputedStyle(e.target).getPropertyValue("--wails-draggable"); - let mousePressed = e.buttons !== void 0 ? e.buttons : e.which; - if (!val || val === "" || val.trim() !== "drag" || mousePressed === 0) { - return false; + if (!resizable) { + canResize = resizing = false; + setResize(); } - return e.detail === 1; +}; +window.addEventListener("mousedown", onMouseDown, { capture: true }); +window.addEventListener("mousemove", onMouseMove, { capture: true }); +window.addEventListener("mouseup", onMouseUp, { capture: true }); +for (const ev of ["click", "contextmenu", "dblclick", "pointerdown", "pointerup"]) { + window.addEventListener(ev, suppressEvent, { capture: true }); } -function onMouseDown(e) { - if (resizeEdge) { - invoke("wails:resize:" + resizeEdge); - e.preventDefault(); +function suppressEvent(event) { + if (dragging || resizing) { + event.stopImmediatePropagation(); + event.stopPropagation(); + event.preventDefault(); + } +} +function onMouseDown(event) { + var _a2; + buttons = buttonsTracked ? event.buttons : buttons | 1 << event.button; + if (dragging || resizing) { + suppressEvent(event); return; } - if (dragTest(e)) { - if (e.offsetX > e.target.clientWidth || e.offsetY > e.target.clientHeight) { - return; + if ((canDrag || canResize) && buttons & 1 && event.button !== 0) { + return; + } + canDrag = false; + canResize = false; + if (resizeEdge) { + if (event.button === 0 && event.detail === 1) { + canResize = true; + invoke("wails:resize:" + resizeEdge); } - shouldDrag = true; + return; + } + let target; + if (event.target instanceof HTMLElement) { + target = event.target; + } else if (!(event.target instanceof HTMLElement) && event.target instanceof Node) { + target = (_a2 = event.target.parentElement) != null ? _a2 : document.body; } else { - shouldDrag = false; + target = document.body; + } + const style = window.getComputedStyle(target); + const setting = style.getPropertyValue("--wails-draggable").trim(); + if (setting === "drag" && event.button === 0 && event.detail === 1) { + if (event.offsetX - parseFloat(style.paddingLeft) < target.clientWidth && event.offsetY - parseFloat(style.paddingTop) < target.clientHeight) { + canDrag = true; + invoke("wails:drag"); + } } } -function onMouseUp() { - shouldDrag = false; -} -function setResize(cursor) { - document.documentElement.style.cursor = cursor || defaultCursor; - resizeEdge = cursor; -} -function onMouseMove(e) { - if (shouldDrag) { - shouldDrag = false; - let mousePressed = e.buttons !== void 0 ? e.buttons : e.which; - if (mousePressed > 0) { - invoke("wails:drag"); - return; +function onMouseUp(event) { + buttons = buttonsTracked ? event.buttons : buttons & ~(1 << event.button); + if (event.button === 0) { + if (resizing) { + suppressEvent(event); } + canDrag = false; + dragging = false; + canResize = false; + resizing = false; + return; + } + suppressEvent(event); + return; +} +var cursorForEdge = Object.freeze({ + "se-resize": "nwse-resize", + "sw-resize": "nesw-resize", + "nw-resize": "nwse-resize", + "ne-resize": "nesw-resize", + "w-resize": "ew-resize", + "n-resize": "ns-resize", + "s-resize": "ns-resize", + "e-resize": "ew-resize" +}); +function setResize(edge) { + if (edge) { + if (!resizeEdge) { + defaultCursor = document.body.style.cursor; + } + document.body.style.cursor = cursorForEdge[edge]; + } else if (!edge && resizeEdge) { + document.body.style.cursor = defaultCursor; + } + resizeEdge = edge || ""; +} +function onMouseMove(event) { + if (canResize && resizeEdge) { + resizing = true; + } else if (canDrag) { + dragging = true; + } + if (dragging || resizing) { + canDrag = canResize = false; + return; } if (!resizable || !IsWindows()) { + if (resizeEdge) { + setResize(); + } return; } - if (defaultCursor == null) { - defaultCursor = document.documentElement.style.cursor; - } - let resizeHandleHeight = GetFlag("system.resizeHandleHeight") || 5; - let resizeHandleWidth = GetFlag("system.resizeHandleWidth") || 5; - let cornerExtra = GetFlag("resizeCornerExtra") || 10; - let rightBorder = window.outerWidth - e.clientX < resizeHandleWidth; - let leftBorder = e.clientX < resizeHandleWidth; - let topBorder = e.clientY < resizeHandleHeight; - let bottomBorder = window.outerHeight - e.clientY < resizeHandleHeight; - let rightCorner = window.outerWidth - e.clientX < resizeHandleWidth + cornerExtra; - let leftCorner = e.clientX < resizeHandleWidth + cornerExtra; - let topCorner = e.clientY < resizeHandleHeight + cornerExtra; - let bottomCorner = window.outerHeight - e.clientY < resizeHandleHeight + cornerExtra; - if (!leftBorder && !rightBorder && !topBorder && !bottomBorder && resizeEdge !== void 0) { + const resizeHandleHeight = GetFlag("system.resizeHandleHeight") || 5; + const resizeHandleWidth = GetFlag("system.resizeHandleWidth") || 5; + const cornerExtra = GetFlag("resizeCornerExtra") || 10; + const rightBorder = window.outerWidth - event.clientX < resizeHandleWidth; + const leftBorder = event.clientX < resizeHandleWidth; + const topBorder = event.clientY < resizeHandleHeight; + const bottomBorder = window.outerHeight - event.clientY < resizeHandleHeight; + const rightCorner = window.outerWidth - event.clientX < resizeHandleWidth + cornerExtra; + const leftCorner = event.clientX < resizeHandleWidth + cornerExtra; + const topCorner = event.clientY < resizeHandleHeight + cornerExtra; + const bottomCorner = window.outerHeight - event.clientY < resizeHandleHeight + cornerExtra; + if (!leftCorner && !topCorner && !bottomCorner && !rightCorner) { setResize(); } else if (rightCorner && bottomCorner) setResize("se-resize"); else if (leftCorner && bottomCorner) setResize("sw-resize"); @@ -1400,16 +1442,17 @@ function onMouseMove(e) { else if (topBorder) setResize("n-resize"); else if (bottomBorder) setResize("s-resize"); else if (rightBorder) setResize("e-resize"); + else setResize(); } -// desktop/@wailsio/runtime/src/application.js +// desktop/@wailsio/runtime/src/application.ts var application_exports = {}; __export(application_exports, { Hide: () => Hide, Quit: () => Quit, Show: () => Show }); -var call6 = newRuntimeCallerWithID(objectNames.Application, ""); +var call6 = newRuntimeCaller(objectNames.Application); var HideMethod2 = 0; var ShowMethod2 = 1; var QuitMethod = 2; @@ -1423,7 +1466,7 @@ function Quit() { return call6(QuitMethod); } -// desktop/@wailsio/runtime/src/calls.js +// desktop/@wailsio/runtime/src/calls.ts var calls_exports = {}; __export(calls_exports, { ByID: () => ByID, @@ -1431,13 +1474,868 @@ __export(calls_exports, { Call: () => Call, RuntimeError: () => RuntimeError }); + +// desktop/@wailsio/runtime/src/callable.ts +var fnToStr = Function.prototype.toString; +var reflectApply = typeof Reflect === "object" && Reflect !== null && Reflect.apply; +var badArrayLike; +var isCallableMarker; +if (typeof reflectApply === "function" && typeof Object.defineProperty === "function") { + try { + badArrayLike = Object.defineProperty({}, "length", { + get: function() { + throw isCallableMarker; + } + }); + isCallableMarker = {}; + reflectApply(function() { + throw 42; + }, null, badArrayLike); + } catch (_) { + if (_ !== isCallableMarker) { + reflectApply = null; + } + } +} else { + reflectApply = null; +} +var constructorRegex = /^\s*class\b/; +var isES6ClassFn = function isES6ClassFunction(value) { + try { + var fnStr = fnToStr.call(value); + return constructorRegex.test(fnStr); + } catch (e) { + return false; + } +}; +var tryFunctionObject = function tryFunctionToStr(value) { + try { + if (isES6ClassFn(value)) { + return false; + } + fnToStr.call(value); + return true; + } catch (e) { + return false; + } +}; +var toStr = Object.prototype.toString; +var objectClass = "[object Object]"; +var fnClass = "[object Function]"; +var genClass = "[object GeneratorFunction]"; +var ddaClass = "[object HTMLAllCollection]"; +var ddaClass2 = "[object HTML document.all class]"; +var ddaClass3 = "[object HTMLCollection]"; +var hasToStringTag = typeof Symbol === "function" && !!Symbol.toStringTag; +var isIE68 = !(0 in [,]); +var isDDA = function isDocumentDotAll() { + return false; +}; +if (typeof document === "object") { + all = document.all; + if (toStr.call(all) === toStr.call(document.all)) { + isDDA = function isDocumentDotAll2(value) { + if ((isIE68 || !value) && (typeof value === "undefined" || typeof value === "object")) { + try { + var str = toStr.call(value); + return (str === ddaClass || str === ddaClass2 || str === ddaClass3 || str === objectClass) && value("") == null; + } catch (e) { + } + } + return false; + }; + } +} +var all; +function isCallableRefApply(value) { + if (isDDA(value)) { + return true; + } + if (!value) { + return false; + } + if (typeof value !== "function" && typeof value !== "object") { + return false; + } + try { + reflectApply(value, null, badArrayLike); + } catch (e) { + if (e !== isCallableMarker) { + return false; + } + } + return !isES6ClassFn(value) && tryFunctionObject(value); +} +function isCallableNoRefApply(value) { + if (isDDA(value)) { + return true; + } + if (!value) { + return false; + } + if (typeof value !== "function" && typeof value !== "object") { + return false; + } + if (hasToStringTag) { + return tryFunctionObject(value); + } + if (isES6ClassFn(value)) { + return false; + } + var strClass = toStr.call(value); + if (strClass !== fnClass && strClass !== genClass && !/^\[object HTML/.test(strClass)) { + return false; + } + return tryFunctionObject(value); +} +var callable_default = reflectApply ? isCallableRefApply : isCallableNoRefApply; + +// desktop/@wailsio/runtime/src/cancellable.ts +var CancelError = class extends Error { + /** + * Constructs a new `CancelError` instance. + * @param message - The error message. + * @param options - Options to be forwarded to the Error constructor. + */ + constructor(message, options) { + super(message, options); + this.name = "CancelError"; + } +}; +var CancelledRejectionError = class extends Error { + /** + * Constructs a new `CancelledRejectionError` instance. + * @param promise - The promise that caused the error originally. + * @param reason - The rejection reason. + * @param info - An optional informative message specifying the circumstances in which the error was thrown. + * Defaults to the string `"Unhandled rejection in cancelled promise."`. + */ + constructor(promise, reason, info) { + super((info != null ? info : "Unhandled rejection in cancelled promise.") + " Reason: " + errorMessage(reason), { cause: reason }); + this.promise = promise; + this.name = "CancelledRejectionError"; + } +}; +var barrierSym = Symbol("barrier"); +var cancelImplSym = Symbol("cancelImpl"); +var _a; +var species = (_a = Symbol.species) != null ? _a : Symbol("speciesPolyfill"); +var CancellablePromise = class _CancellablePromise extends Promise { + /** + * Creates a new `CancellablePromise`. + * + * @param executor - A callback used to initialize the promise. This callback is passed two arguments: + * a `resolve` callback used to resolve the promise with a value + * or the result of another promise (possibly cancellable), + * and a `reject` callback used to reject the promise with a provided reason or error. + * If the value provided to the `resolve` callback is a thenable _and_ cancellable object + * (it has a `then` _and_ a `cancel` method), + * cancellation requests will be forwarded to that object and the oncancelled will not be invoked anymore. + * If any one of the two callbacks is called _after_ the promise has been cancelled, + * the provided values will be cancelled and resolved as usual, + * but their results will be discarded. + * However, if the resolution process ultimately ends up in a rejection + * that is not due to cancellation, the rejection reason + * will be wrapped in a {@link CancelledRejectionError} + * and bubbled up as an unhandled rejection. + * @param oncancelled - It is the caller's responsibility to ensure that any operation + * started by the executor is properly halted upon cancellation. + * This optional callback can be used to that purpose. + * It will be called _synchronously_ with a cancellation cause + * when cancellation is requested, _after_ the promise has already rejected + * with a {@link CancelError}, but _before_ + * any {@link then}/{@link catch}/{@link finally} callback runs. + * If the callback returns a thenable, the promise returned from {@link cancel} + * will only fulfill after the former has settled. + * Unhandled exceptions or rejections from the callback will be wrapped + * in a {@link CancelledRejectionError} and bubbled up as unhandled rejections. + * If the `resolve` callback is called before cancellation with a cancellable promise, + * cancellation requests on this promise will be diverted to that promise, + * and the original `oncancelled` callback will be discarded. + */ + constructor(executor, oncancelled) { + let resolve; + let reject; + super((res, rej) => { + resolve = res; + reject = rej; + }); + if (this.constructor[species] !== Promise) { + throw new TypeError("CancellablePromise does not support transparent subclassing. Please refrain from overriding the [Symbol.species] static property."); + } + let promise = { + promise: this, + resolve, + reject, + get oncancelled() { + return oncancelled != null ? oncancelled : null; + }, + set oncancelled(cb) { + oncancelled = cb != null ? cb : void 0; + } + }; + const state = { + get root() { + return state; + }, + resolving: false, + settled: false + }; + void Object.defineProperties(this, { + [barrierSym]: { + configurable: false, + enumerable: false, + writable: true, + value: null + }, + [cancelImplSym]: { + configurable: false, + enumerable: false, + writable: false, + value: cancellerFor(promise, state) + } + }); + const rejector = rejectorFor(promise, state); + try { + executor(resolverFor(promise, state), rejector); + } catch (err) { + if (state.resolving) { + console.log("Unhandled exception in CancellablePromise executor.", err); + } else { + rejector(err); + } + } + } + /** + * Cancels immediately the execution of the operation associated with this promise. + * The promise rejects with a {@link CancelError} instance as reason, + * with the {@link CancelError#cause} property set to the given argument, if any. + * + * Has no effect if called after the promise has already settled; + * repeated calls in particular are safe, but only the first one + * will set the cancellation cause. + * + * The `CancelError` exception _need not_ be handled explicitly _on the promises that are being cancelled:_ + * cancelling a promise with no attached rejection handler does not trigger an unhandled rejection event. + * Therefore, the following idioms are all equally correct: + * ```ts + * new CancellablePromise((resolve, reject) => { ... }).cancel(); + * new CancellablePromise((resolve, reject) => { ... }).then(...).cancel(); + * new CancellablePromise((resolve, reject) => { ... }).then(...).catch(...).cancel(); + * ``` + * Whenever some cancelled promise in a chain rejects with a `CancelError` + * with the same cancellation cause as itself, the error will be discarded silently. + * However, the `CancelError` _will still be delivered_ to all attached rejection handlers + * added by {@link then} and related methods: + * ```ts + * let cancellable = new CancellablePromise((resolve, reject) => { ... }); + * cancellable.then(() => { ... }).catch(console.log); + * cancellable.cancel(); // A CancelError is printed to the console. + * ``` + * If the `CancelError` is not handled downstream by the time it reaches + * a _non-cancelled_ promise, it _will_ trigger an unhandled rejection event, + * just like normal rejections would: + * ```ts + * let cancellable = new CancellablePromise((resolve, reject) => { ... }); + * let chained = cancellable.then(() => { ... }).then(() => { ... }); // No catch... + * cancellable.cancel(); // Unhandled rejection event on chained! + * ``` + * Therefore, it is important to either cancel whole promise chains from their tail, + * as shown in the correct idioms above, or take care of handling errors everywhere. + * + * @returns A cancellable promise that _fulfills_ after the cancel callback (if any) + * and all handlers attached up to the call to cancel have run. + * If the cancel callback returns a thenable, the promise returned by `cancel` + * will also wait for that thenable to settle. + * This enables callers to wait for the cancelled operation to terminate + * without being forced to handle potential errors at the call site. + * ```ts + * cancellable.cancel().then(() => { + * // Cleanup finished, it's safe to do something else. + * }, (err) => { + * // Unreachable: the promise returned from cancel will never reject. + * }); + * ``` + * Note that the returned promise will _not_ handle implicitly any rejection + * that might have occurred already in the cancelled chain. + * It will just track whether registered handlers have been executed or not. + * Therefore, unhandled rejections will never be silently handled by calling cancel. + */ + cancel(cause) { + return new _CancellablePromise((resolve) => { + Promise.allSettled([ + this[cancelImplSym](new CancelError("Promise cancelled.", { cause })), + currentBarrier(this) + ]).then(() => resolve(), () => resolve()); + }); + } + /** + * Binds promise cancellation to the abort event of the given {@link AbortSignal}. + * If the signal has already aborted, the promise will be cancelled immediately. + * When either condition is verified, the cancellation cause will be set + * to the signal's abort reason (see {@link AbortSignal#reason}). + * + * Has no effect if called (or if the signal aborts) _after_ the promise has already settled. + * Only the first signal to abort will set the cancellation cause. + * + * For more details about the cancellation process, + * see {@link cancel} and the `CancellablePromise` constructor. + * + * This method enables `await`ing cancellable promises without having + * to store them for future cancellation, e.g.: + * ```ts + * await longRunningOperation().cancelOn(signal); + * ``` + * instead of: + * ```ts + * let promiseToBeCancelled = longRunningOperation(); + * await promiseToBeCancelled; + * ``` + * + * @returns This promise, for method chaining. + */ + cancelOn(signal) { + if (signal.aborted) { + void this.cancel(signal.reason); + } else { + signal.addEventListener("abort", () => void this.cancel(signal.reason), { capture: true }); + } + return this; + } + /** + * Attaches callbacks for the resolution and/or rejection of the `CancellablePromise`. + * + * The optional `oncancelled` argument will be invoked when the returned promise is cancelled, + * with the same semantics as the `oncancelled` argument of the constructor. + * When the parent promise rejects or is cancelled, the `onrejected` callback will run, + * _even after the returned promise has been cancelled:_ + * in that case, should it reject or throw, the reason will be wrapped + * in a {@link CancelledRejectionError} and bubbled up as an unhandled rejection. + * + * @param onfulfilled The callback to execute when the Promise is resolved. + * @param onrejected The callback to execute when the Promise is rejected. + * @returns A `CancellablePromise` for the completion of whichever callback is executed. + * The returned promise is hooked up to propagate cancellation requests up the chain, but not down: + * + * - if the parent promise is cancelled, the `onrejected` handler will be invoked with a `CancelError` + * and the returned promise _will resolve regularly_ with its result; + * - conversely, if the returned promise is cancelled, _the parent promise is cancelled too;_ + * the `onrejected` handler will still be invoked with the parent's `CancelError`, + * but its result will be discarded + * and the returned promise will reject with a `CancelError` as well. + * + * The promise returned from {@link cancel} will fulfill only after all attached handlers + * up the entire promise chain have been run. + * + * If either callback returns a cancellable promise, + * cancellation requests will be diverted to it, + * and the specified `oncancelled` callback will be discarded. + */ + then(onfulfilled, onrejected, oncancelled) { + if (!(this instanceof _CancellablePromise)) { + throw new TypeError("CancellablePromise.prototype.then called on an invalid object."); + } + if (!callable_default(onfulfilled)) { + onfulfilled = identity; + } + if (!callable_default(onrejected)) { + onrejected = thrower; + } + if (onfulfilled === identity && onrejected == thrower) { + return new _CancellablePromise((resolve) => resolve(this)); + } + const barrier = {}; + this[barrierSym] = barrier; + return new _CancellablePromise((resolve, reject) => { + void promiseThen.call( + this, + (value) => { + var _a2; + if (this[barrierSym] === barrier) { + this[barrierSym] = null; + } + (_a2 = barrier.resolve) == null ? void 0 : _a2.call(barrier); + try { + resolve(onfulfilled(value)); + } catch (err) { + reject(err); + } + }, + (reason) => { + var _a2; + if (this[barrierSym] === barrier) { + this[barrierSym] = null; + } + (_a2 = barrier.resolve) == null ? void 0 : _a2.call(barrier); + try { + resolve(onrejected(reason)); + } catch (err) { + reject(err); + } + } + ); + }, (cause) => __async(this, null, function* () { + try { + return oncancelled == null ? void 0 : oncancelled(cause); + } finally { + yield this.cancel(cause); + } + })); + } + /** + * Attaches a callback for only the rejection of the Promise. + * + * The optional `oncancelled` argument will be invoked when the returned promise is cancelled, + * with the same semantics as the `oncancelled` argument of the constructor. + * When the parent promise rejects or is cancelled, the `onrejected` callback will run, + * _even after the returned promise has been cancelled:_ + * in that case, should it reject or throw, the reason will be wrapped + * in a {@link CancelledRejectionError} and bubbled up as an unhandled rejection. + * + * It is equivalent to + * ```ts + * cancellablePromise.then(undefined, onrejected, oncancelled); + * ``` + * and the same caveats apply. + * + * @returns A Promise for the completion of the callback. + * Cancellation requests on the returned promise + * will propagate up the chain to the parent promise, + * but not in the other direction. + * + * The promise returned from {@link cancel} will fulfill only after all attached handlers + * up the entire promise chain have been run. + * + * If `onrejected` returns a cancellable promise, + * cancellation requests will be diverted to it, + * and the specified `oncancelled` callback will be discarded. + * See {@link then} for more details. + */ + catch(onrejected, oncancelled) { + return this.then(void 0, onrejected, oncancelled); + } + /** + * Attaches a callback that is invoked when the CancellablePromise is settled (fulfilled or rejected). The + * resolved value cannot be accessed or modified from the callback. + * The returned promise will settle in the same state as the original one + * after the provided callback has completed execution, + * unless the callback throws or returns a rejecting promise, + * in which case the returned promise will reject as well. + * + * The optional `oncancelled` argument will be invoked when the returned promise is cancelled, + * with the same semantics as the `oncancelled` argument of the constructor. + * Once the parent promise settles, the `onfinally` callback will run, + * _even after the returned promise has been cancelled:_ + * in that case, should it reject or throw, the reason will be wrapped + * in a {@link CancelledRejectionError} and bubbled up as an unhandled rejection. + * + * This method is implemented in terms of {@link then} and the same caveats apply. + * It is polyfilled, hence available in every OS/webview version. + * + * @returns A Promise for the completion of the callback. + * Cancellation requests on the returned promise + * will propagate up the chain to the parent promise, + * but not in the other direction. + * + * The promise returned from {@link cancel} will fulfill only after all attached handlers + * up the entire promise chain have been run. + * + * If `onfinally` returns a cancellable promise, + * cancellation requests will be diverted to it, + * and the specified `oncancelled` callback will be discarded. + * See {@link then} for more details. + */ + finally(onfinally, oncancelled) { + if (!(this instanceof _CancellablePromise)) { + throw new TypeError("CancellablePromise.prototype.finally called on an invalid object."); + } + if (!callable_default(onfinally)) { + return this.then(onfinally, onfinally, oncancelled); + } + return this.then( + (value) => _CancellablePromise.resolve(onfinally()).then(() => value), + (reason) => _CancellablePromise.resolve(onfinally()).then(() => { + throw reason; + }), + oncancelled + ); + } + /** + * We use the `[Symbol.species]` static property, if available, + * to disable the built-in automatic subclassing features from {@link Promise}. + * It is critical for performance reasons that extenders do not override this. + * Once the proposal at https://github.com/tc39/proposal-rm-builtin-subclassing + * is either accepted or retired, this implementation will have to be revised accordingly. + * + * @ignore + * @internal + */ + static get [(barrierSym, cancelImplSym, species)]() { + return Promise; + } + static all(values) { + let collected = Array.from(values); + return collected.length === 0 ? _CancellablePromise.resolve(collected) : new _CancellablePromise((resolve, reject) => { + void Promise.all(collected).then(resolve, reject); + }, allCanceller(collected)); + } + static allSettled(values) { + let collected = Array.from(values); + return collected.length === 0 ? _CancellablePromise.resolve(collected) : new _CancellablePromise((resolve, reject) => { + void Promise.allSettled(collected).then(resolve, reject); + }, allCanceller(collected)); + } + static any(values) { + let collected = Array.from(values); + return collected.length === 0 ? _CancellablePromise.resolve(collected) : new _CancellablePromise((resolve, reject) => { + void Promise.any(collected).then(resolve, reject); + }, allCanceller(collected)); + } + static race(values) { + let collected = Array.from(values); + return new _CancellablePromise((resolve, reject) => { + void Promise.race(collected).then(resolve, reject); + }, allCanceller(collected)); + } + /** + * Creates a new cancelled CancellablePromise for the provided cause. + * + * @group Static Methods + */ + static cancel(cause) { + const p = new _CancellablePromise(() => { + }); + p.cancel(cause); + return p; + } + /** + * Creates a new CancellablePromise that cancels + * after the specified timeout, with the provided cause. + * + * If the {@link AbortSignal.timeout} factory method is available, + * it is used to base the timeout on _active_ time rather than _elapsed_ time. + * Otherwise, `timeout` falls back to {@link setTimeout}. + * + * @group Static Methods + */ + static timeout(milliseconds, cause) { + const promise = new _CancellablePromise(() => { + }); + if (AbortSignal && typeof AbortSignal === "function" && AbortSignal.timeout && typeof AbortSignal.timeout === "function") { + AbortSignal.timeout(milliseconds).addEventListener("abort", () => void promise.cancel(cause)); + } else { + setTimeout(() => void promise.cancel(cause), milliseconds); + } + return promise; + } + static sleep(milliseconds, value) { + return new _CancellablePromise((resolve) => { + setTimeout(() => resolve(value), milliseconds); + }); + } + /** + * Creates a new rejected CancellablePromise for the provided reason. + * + * @group Static Methods + */ + static reject(reason) { + return new _CancellablePromise((_, reject) => reject(reason)); + } + static resolve(value) { + if (value instanceof _CancellablePromise) { + return value; + } + return new _CancellablePromise((resolve) => resolve(value)); + } + /** + * Creates a new CancellablePromise and returns it in an object, along with its resolve and reject functions + * and a getter/setter for the cancellation callback. + * + * This method is polyfilled, hence available in every OS/webview version. + * + * @group Static Methods + */ + static withResolvers() { + let result = { oncancelled: null }; + result.promise = new _CancellablePromise((resolve, reject) => { + result.resolve = resolve; + result.reject = reject; + }, (cause) => { + var _a2; + (_a2 = result.oncancelled) == null ? void 0 : _a2.call(result, cause); + }); + return result; + } +}; +function cancellerFor(promise, state) { + let cancellationPromise = void 0; + return (reason) => { + if (!state.settled) { + state.settled = true; + state.reason = reason; + promise.reject(reason); + void promiseThen.call(promise.promise, void 0, (err) => { + if (err !== reason) { + throw err; + } + }); + } + if (!state.reason || !promise.oncancelled) { + return; + } + cancellationPromise = new Promise((resolve) => { + try { + resolve(promise.oncancelled(state.reason.cause)); + } catch (err) { + Promise.reject(new CancelledRejectionError(promise.promise, err, "Unhandled exception in oncancelled callback.")); + } + }); + cancellationPromise.then(void 0, (reason2) => { + throw new CancelledRejectionError(promise.promise, reason2, "Unhandled rejection in oncancelled callback."); + }); + promise.oncancelled = null; + return cancellationPromise; + }; +} +function resolverFor(promise, state) { + return (value) => { + if (state.resolving) { + return; + } + state.resolving = true; + if (value === promise.promise) { + if (state.settled) { + return; + } + state.settled = true; + promise.reject(new TypeError("A promise cannot be resolved with itself.")); + return; + } + if (value != null && (typeof value === "object" || typeof value === "function")) { + let then; + try { + then = value.then; + } catch (err) { + state.settled = true; + promise.reject(err); + return; + } + if (callable_default(then)) { + try { + let cancel = value.cancel; + if (callable_default(cancel)) { + const oncancelled = (cause) => { + Reflect.apply(cancel, value, [cause]); + }; + if (state.reason) { + void cancellerFor(__spreadProps(__spreadValues({}, promise), { oncancelled }), state)(state.reason); + } else { + promise.oncancelled = oncancelled; + } + } + } catch (e) { + } + const newState = { + root: state.root, + resolving: false, + get settled() { + return this.root.settled; + }, + set settled(value2) { + this.root.settled = value2; + }, + get reason() { + return this.root.reason; + } + }; + const rejector = rejectorFor(promise, newState); + try { + Reflect.apply(then, value, [resolverFor(promise, newState), rejector]); + } catch (err) { + rejector(err); + } + return; + } + } + if (state.settled) { + return; + } + state.settled = true; + promise.resolve(value); + }; +} +function rejectorFor(promise, state) { + return (reason) => { + if (state.resolving) { + return; + } + state.resolving = true; + if (state.settled) { + try { + if (reason instanceof CancelError && state.reason instanceof CancelError && Object.is(reason.cause, state.reason.cause)) { + return; + } + } catch (e) { + } + void Promise.reject(new CancelledRejectionError(promise.promise, reason)); + } else { + state.settled = true; + promise.reject(reason); + } + }; +} +function allCanceller(values) { + return (cause) => { + for (const value of values) { + try { + if (callable_default(value.then)) { + let cancel = value.cancel; + if (callable_default(cancel)) { + Reflect.apply(cancel, value, [cause]); + } + } + } catch (e) { + } + } + }; +} +function identity(x) { + return x; +} +function thrower(reason) { + throw reason; +} +function errorMessage(err) { + try { + if (err instanceof Error || typeof err !== "object" || err.toString !== Object.prototype.toString) { + return "" + err; + } + } catch (e) { + } + try { + return JSON.stringify(err); + } catch (e) { + } + try { + return Object.prototype.toString.call(err); + } catch (e) { + } + return ""; +} +function currentBarrier(promise) { + var _a2; + let pwr = (_a2 = promise[barrierSym]) != null ? _a2 : {}; + if (!("promise" in pwr)) { + Object.assign(pwr, promiseWithResolvers()); + } + if (promise[barrierSym] == null) { + pwr.resolve(); + promise[barrierSym] = pwr; + } + return pwr.promise; +} +var promiseThen = Promise.prototype.then; +Promise.prototype.then = function(...args) { + if (this instanceof CancellablePromise) { + return this.then(...args); + } else { + return Reflect.apply(promiseThen, this, args); + } +}; +var promiseWithResolvers = Promise.withResolvers; +if (promiseWithResolvers && typeof promiseWithResolvers === "function") { + promiseWithResolvers = promiseWithResolvers.bind(Promise); +} else { + promiseWithResolvers = function() { + let resolve; + let reject; + const promise = new Promise((res, rej) => { + resolve = res; + reject = rej; + }); + return { promise, resolve, reject }; + }; +} + +// desktop/@wailsio/runtime/src/calls.ts window._wails = window._wails || {}; window._wails.callResultHandler = resultHandler; window._wails.callErrorHandler = errorHandler; -var CallBinding = 0; -var call7 = newRuntimeCallerWithID(objectNames.Call, ""); -var cancelCall = newRuntimeCallerWithID(objectNames.CancelCall, ""); +var call7 = newRuntimeCaller(objectNames.Call); +var cancelCall = newRuntimeCaller(objectNames.CancelCall); var callResponses = /* @__PURE__ */ new Map(); +var CallBinding = 0; +var CancelMethod = 0; +var RuntimeError = class extends Error { + /** + * Constructs a new RuntimeError instance. + * @param message - The error message. + * @param options - Options to be forwarded to the Error constructor. + */ + constructor(message, options) { + super(message, options); + this.name = "RuntimeError"; + } +}; +function resultHandler(id, data, isJSON) { + const resolvers = getAndDeleteResponse2(id); + if (!resolvers) { + return; + } + if (!data) { + resolvers.resolve(void 0); + } else if (!isJSON) { + resolvers.resolve(data); + } else { + try { + resolvers.resolve(JSON.parse(data)); + } catch (err) { + resolvers.reject(new TypeError("could not parse result: " + err.message, { cause: err })); + } + } +} +function errorHandler(id, data, isJSON) { + const resolvers = getAndDeleteResponse2(id); + if (!resolvers) { + return; + } + if (!isJSON) { + resolvers.reject(new Error(data)); + } else { + let error; + try { + error = JSON.parse(data); + } catch (err) { + resolvers.reject(new TypeError("could not parse error: " + err.message, { cause: err })); + return; + } + let options = {}; + if (error.cause) { + options.cause = error.cause; + } + let exception; + switch (error.kind) { + case "ReferenceError": + exception = new ReferenceError(error.message, options); + break; + case "TypeError": + exception = new TypeError(error.message, options); + break; + case "RuntimeError": + exception = new RuntimeError(error.message, options); + break; + default: + exception = new Error(error.message, options); + break; + } + resolvers.reject(exception); + } +} +function getAndDeleteResponse2(id) { + const response = callResponses.get(id); + callResponses.delete(id); + return response; +} function generateID2() { let result; do { @@ -1445,123 +2343,47 @@ function generateID2() { } while (callResponses.has(result)); return result; } -function resultHandler(id, data, isJSON) { - const promiseHandler = getAndDeleteResponse(id); - if (promiseHandler) { - if (!data) { - promiseHandler.resolve(); - } else if (!isJSON) { - promiseHandler.resolve(data); - } else { - try { - promiseHandler.resolve(JSON.parse(data)); - } catch (err) { - promiseHandler.reject(new TypeError("could not parse result: " + err.message, { cause: err })); - } - } - } -} -function errorHandler(id, data, isJSON) { - const promiseHandler = getAndDeleteResponse(id); - if (promiseHandler) { - if (!isJSON) { - promiseHandler.reject(new Error(data)); - } else { - let error; - try { - error = JSON.parse(data); - } catch (err) { - promiseHandler.reject(new TypeError("could not parse error: " + err.message, { cause: err })); - return; - } - let options = {}; - if (error.cause) { - options.cause = error.cause; - } - let exception; - switch (error.kind) { - case "ReferenceError": - exception = new ReferenceError(error.message, options); - break; - case "TypeError": - exception = new TypeError(error.message, options); - break; - case "RuntimeError": - exception = new RuntimeError(error.message, options); - break; - default: - exception = new Error(error.message, options); - break; - } - promiseHandler.reject(exception); - } - } -} -function getAndDeleteResponse(id) { - const response = callResponses.get(id); - callResponses.delete(id); - return response; -} -var RuntimeError = class extends Error { - /** - * Constructs a new RuntimeError instance. - * - * @param {string} message - The error message. - * @param {any[]} args - Optional arguments for the Error constructor. - */ - constructor(message, ...args) { - super(message, ...args); - this.name = "RuntimeError"; - } -}; function Call(options) { const id = generateID2(); - const doCancel = () => { - return cancelCall(type, { "call-id": id }); - }; - let queuedCancel = false, callRunning = false; - let p = new Promise((resolve, reject) => { - options["call-id"] = id; - callResponses.set(id, { resolve, reject }); - call7(CallBinding, options).then((_) => { - callRunning = true; - if (queuedCancel) { - return doCancel(); - } - }).catch((error) => { - reject(error); - callResponses.delete(id); - }); + const result = CancellablePromise.withResolvers(); + callResponses.set(id, { resolve: result.resolve, reject: result.reject }); + const request = call7(CallBinding, Object.assign({ "call-id": id }, options)); + let running = false; + request.then(() => { + running = true; + }, (err) => { + callResponses.delete(id); + result.reject(err); }); - p.cancel = () => { - if (callRunning) { - return doCancel(); + const cancel = () => { + callResponses.delete(id); + return cancelCall(CancelMethod, { "call-id": id }).catch((err) => { + console.log("Error while requesting binding call cancellation:", err); + }); + }; + result.oncancelled = () => { + if (running) { + return cancel(); } else { - queuedCancel = true; + return request.then(cancel); } }; - return p; + return result.promise; } function ByName(methodName, ...args) { - return Call({ - methodName, - args - }); + return Call({ methodName, args }); } function ByID(methodID, ...args) { - return Call({ - methodID, - args - }); + return Call({ methodID, args }); } -// desktop/@wailsio/runtime/src/clipboard.js +// desktop/@wailsio/runtime/src/clipboard.ts var clipboard_exports = {}; __export(clipboard_exports, { SetText: () => SetText, Text: () => Text }); -var call8 = newRuntimeCallerWithID(objectNames.Clipboard, ""); +var call8 = newRuntimeCaller(objectNames.Clipboard); var ClipboardSetText = 0; var ClipboardText = 1; function SetText(text) { @@ -1571,29 +2393,23 @@ function Text() { return call8(ClipboardText); } -// desktop/@wailsio/runtime/src/create.js +// desktop/@wailsio/runtime/src/create.ts var create_exports = {}; __export(create_exports, { Any: () => Any, - Array: () => Array, + Array: () => Array2, ByteSlice: () => ByteSlice, Map: () => Map2, Nullable: () => Nullable, Struct: () => Struct }); function Any(source) { - return ( - /** @type {T} */ - source - ); + return source; } function ByteSlice(source) { - return ( - /** @type {any} */ - source == null ? "" : source - ); + return source == null ? "" : source; } -function Array(element) { +function Array2(element) { if (element === Any) { return (source) => source === null ? [] : source; } @@ -1648,14 +2464,14 @@ function Struct(createField) { }; } -// desktop/@wailsio/runtime/src/screens.js +// desktop/@wailsio/runtime/src/screens.ts var screens_exports = {}; __export(screens_exports, { GetAll: () => GetAll, GetCurrent: () => GetCurrent, GetPrimary: () => GetPrimary }); -var call9 = newRuntimeCallerWithID(objectNames.Screens, ""); +var call9 = newRuntimeCaller(objectNames.Screens); var getAll = 0; var getPrimary = 1; var getCurrent = 2; @@ -1669,23 +2485,17 @@ function GetCurrent() { return call9(getCurrent); } -// desktop/@wailsio/runtime/src/index.js +// desktop/@wailsio/runtime/src/index.ts window._wails = window._wails || {}; -var initialised = false; -function init() { - window._wails.invoke = invoke; - invoke("wails:runtime:ready"); - initialised = true; -} -window.addEventListener("load", () => { - if (!initialised) { - init(); - } -}); +window._wails.invoke = invoke; +invoke("wails:runtime:ready"); export { application_exports as Application, browser_exports as Browser, calls_exports as Call, + CancelError, + CancellablePromise, + CancelledRejectionError, clipboard_exports as Clipboard, create_exports as Create, dialogs_exports as Dialogs, @@ -1694,7 +2504,6 @@ export { screens_exports as Screens, system_exports as System, wml_exports as WML, - window_default as Window, - init + window_default as Window }; -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2luZGV4LmpzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy93bWwuanMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2Jyb3dzZXIuanMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL25hbm9pZC5qcyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvcnVudGltZS5qcyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvZGlhbG9ncy5qcyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvZXZlbnRzLmpzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9ldmVudF90eXBlcy5qcyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvdXRpbHMuanMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3dpbmRvdy5qcyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvY29tcGlsZWQvbWFpbi5qcyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvc3lzdGVtLmpzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9jb250ZXh0bWVudS5qcyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvZmxhZ3MuanMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2RyYWcuanMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2FwcGxpY2F0aW9uLmpzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9jYWxscy5qcyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvY2xpcGJvYXJkLmpzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9jcmVhdGUuanMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3NjcmVlbnMuanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vLyBTZXR1cFxud2luZG93Ll93YWlscyA9IHdpbmRvdy5fd2FpbHMgfHwge307XG5cbmltcG9ydCBcIi4vY29udGV4dG1lbnVcIjtcbmltcG9ydCBcIi4vZHJhZ1wiO1xuXG4vLyBSZS1leHBvcnQgcHVibGljIEFQSVxuaW1wb3J0ICogYXMgQXBwbGljYXRpb24gZnJvbSBcIi4vYXBwbGljYXRpb25cIjtcbmltcG9ydCAqIGFzIEJyb3dzZXIgZnJvbSBcIi4vYnJvd3NlclwiO1xuaW1wb3J0ICogYXMgQ2FsbCBmcm9tIFwiLi9jYWxsc1wiO1xuaW1wb3J0ICogYXMgQ2xpcGJvYXJkIGZyb20gXCIuL2NsaXBib2FyZFwiO1xuaW1wb3J0ICogYXMgQ3JlYXRlIGZyb20gXCIuL2NyZWF0ZVwiO1xuaW1wb3J0ICogYXMgRGlhbG9ncyBmcm9tIFwiLi9kaWFsb2dzXCI7XG5pbXBvcnQgKiBhcyBFdmVudHMgZnJvbSBcIi4vZXZlbnRzXCI7XG5pbXBvcnQgKiBhcyBGbGFncyBmcm9tIFwiLi9mbGFnc1wiO1xuaW1wb3J0ICogYXMgU2NyZWVucyBmcm9tIFwiLi9zY3JlZW5zXCI7XG5pbXBvcnQgKiBhcyBTeXN0ZW0gZnJvbSBcIi4vc3lzdGVtXCI7XG5pbXBvcnQgV2luZG93IGZyb20gXCIuL3dpbmRvd1wiO1xuaW1wb3J0ICogYXMgV01MIGZyb20gXCIuL3dtbFwiO1xuXG5leHBvcnQge1xuICAgIEFwcGxpY2F0aW9uLFxuICAgIEJyb3dzZXIsXG4gICAgQ2FsbCxcbiAgICBDbGlwYm9hcmQsXG4gICAgQ3JlYXRlLFxuICAgIERpYWxvZ3MsXG4gICAgRXZlbnRzLFxuICAgIEZsYWdzLFxuICAgIFNjcmVlbnMsXG4gICAgU3lzdGVtLFxuICAgIFdpbmRvdyxcbiAgICBXTUxcbn07XG5cbmxldCBpbml0aWFsaXNlZCA9IGZhbHNlO1xuZXhwb3J0IGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgd2luZG93Ll93YWlscy5pbnZva2UgPSBTeXN0ZW0uaW52b2tlO1xuICAgIFN5c3RlbS5pbnZva2UoXCJ3YWlsczpydW50aW1lOnJlYWR5XCIpO1xuICAgIGluaXRpYWxpc2VkID0gdHJ1ZTtcbn1cblxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsICgpID0+IHtcbiAgICBpZiAoIWluaXRpYWxpc2VkKSB7XG4gICAgICAgIGluaXQoKTtcbiAgICB9XG59KTtcblxuLy8gTm90aWZ5IGJhY2tlbmRcblxuIiwgIi8qXG4gXyAgICAgX18gICAgIF8gX19cbnwgfCAgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5pbXBvcnQge09wZW5VUkx9IGZyb20gXCIuL2Jyb3dzZXJcIjtcbmltcG9ydCB7UXVlc3Rpb259IGZyb20gXCIuL2RpYWxvZ3NcIjtcbmltcG9ydCB7RW1pdCwgV2FpbHNFdmVudH0gZnJvbSBcIi4vZXZlbnRzXCI7XG5pbXBvcnQge2NhbkFib3J0TGlzdGVuZXJzLCB3aGVuUmVhZHl9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgV2luZG93IGZyb20gXCIuL3dpbmRvd1wiO1xuXG4vKipcbiAqIFNlbmRzIGFuIGV2ZW50IHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIG9wdGlvbmFsIGRhdGEuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudCB0byBzZW5kLlxuICogQHBhcmFtIHthbnl9IFtkYXRhPW51bGxdIC0gT3B0aW9uYWwgZGF0YSB0byBzZW5kIGFsb25nIHdpdGggdGhlIGV2ZW50LlxuICpcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHNlbmRFdmVudChldmVudE5hbWUsIGRhdGE9bnVsbCkge1xuICAgIEVtaXQobmV3IFdhaWxzRXZlbnQoZXZlbnROYW1lLCBkYXRhKSk7XG59XG5cbi8qKlxuICogQ2FsbHMgYSBtZXRob2Qgb24gYSBzcGVjaWZpZWQgd2luZG93LlxuICogQHBhcmFtIHtzdHJpbmd9IHdpbmRvd05hbWUgLSBUaGUgbmFtZSBvZiB0aGUgd2luZG93IHRvIGNhbGwgdGhlIG1ldGhvZCBvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0byBjYWxsLlxuICovXG5mdW5jdGlvbiBjYWxsV2luZG93TWV0aG9kKHdpbmRvd05hbWUsIG1ldGhvZE5hbWUpIHtcbiAgICBjb25zdCB0YXJnZXRXaW5kb3cgPSBXaW5kb3cuR2V0KHdpbmRvd05hbWUpO1xuICAgIGNvbnN0IG1ldGhvZCA9IHRhcmdldFdpbmRvd1ttZXRob2ROYW1lXTtcblxuICAgIGlmICh0eXBlb2YgbWV0aG9kICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgV2luZG93IG1ldGhvZCAnJHttZXRob2ROYW1lfScgbm90IGZvdW5kYCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgICBtZXRob2QuY2FsbCh0YXJnZXRXaW5kb3cpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgY2FsbGluZyB3aW5kb3cgbWV0aG9kICcke21ldGhvZE5hbWV9JzogYCwgZSk7XG4gICAgfVxufVxuXG4vKipcbiAqIFJlc3BvbmRzIHRvIGEgdHJpZ2dlcmluZyBldmVudCBieSBydW5uaW5nIGFwcHJvcHJpYXRlIFdNTCBhY3Rpb25zIGZvciB0aGUgY3VycmVudCB0YXJnZXRcbiAqXG4gKiBAcGFyYW0ge0V2ZW50fSBldlxuICogQHJldHVybiB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gb25XTUxUcmlnZ2VyZWQoZXYpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gZXYuY3VycmVudFRhcmdldDtcblxuICAgIGZ1bmN0aW9uIHJ1bkVmZmVjdChjaG9pY2UgPSBcIlllc1wiKSB7XG4gICAgICAgIGlmIChjaG9pY2UgIT09IFwiWWVzXCIpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY29uc3QgZXZlbnRUeXBlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtd21sLWV2ZW50Jyk7XG4gICAgICAgIGNvbnN0IHRhcmdldFdpbmRvdyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXdtbC10YXJnZXQtd2luZG93JykgfHwgXCJcIjtcbiAgICAgICAgY29uc3Qgd2luZG93TWV0aG9kID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtd21sLXdpbmRvdycpO1xuICAgICAgICBjb25zdCB1cmwgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS13bWwtb3BlblVSTCcpO1xuXG4gICAgICAgIGlmIChldmVudFR5cGUgIT09IG51bGwpXG4gICAgICAgICAgICBzZW5kRXZlbnQoZXZlbnRUeXBlKTtcbiAgICAgICAgaWYgKHdpbmRvd01ldGhvZCAhPT0gbnVsbClcbiAgICAgICAgICAgIGNhbGxXaW5kb3dNZXRob2QodGFyZ2V0V2luZG93LCB3aW5kb3dNZXRob2QpO1xuICAgICAgICBpZiAodXJsICE9PSBudWxsKVxuICAgICAgICAgICAgdm9pZCBPcGVuVVJMKHVybCk7XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlybSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXdtbC1jb25maXJtJyk7XG5cbiAgICBpZiAoY29uZmlybSkge1xuICAgICAgICBRdWVzdGlvbih7XG4gICAgICAgICAgICBUaXRsZTogXCJDb25maXJtXCIsXG4gICAgICAgICAgICBNZXNzYWdlOiBjb25maXJtLFxuICAgICAgICAgICAgRGV0YWNoZWQ6IGZhbHNlLFxuICAgICAgICAgICAgQnV0dG9uczogW1xuICAgICAgICAgICAgICAgIHsgTGFiZWw6IFwiWWVzXCIgfSxcbiAgICAgICAgICAgICAgICB7IExhYmVsOiBcIk5vXCIsIElzRGVmYXVsdDogdHJ1ZSB9XG4gICAgICAgICAgICBdXG4gICAgICAgIH0pLnRoZW4ocnVuRWZmZWN0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBydW5FZmZlY3QoKTtcbiAgICB9XG59XG5cbi8qKlxuICogQHR5cGUge3N5bWJvbH1cbiAqL1xuY29uc3QgY29udHJvbGxlciA9IFN5bWJvbCgpO1xuXG4vKipcbiAqIEFib3J0Q29udHJvbGxlclJlZ2lzdHJ5IGRvZXMgbm90IGFjdHVhbGx5IHJlbWVtYmVyIGFjdGl2ZSBldmVudCBsaXN0ZW5lcnM6IGluc3RlYWRcbiAqIGl0IHRpZXMgdGhlbSB0byBhbiBBYm9ydFNpZ25hbCBhbmQgdXNlcyBhbiBBYm9ydENvbnRyb2xsZXIgdG8gcmVtb3ZlIHRoZW0gYWxsIGF0IG9uY2UuXG4gKi9cbmNsYXNzIEFib3J0Q29udHJvbGxlclJlZ2lzdHJ5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFN0b3JlcyB0aGUgQWJvcnRDb250cm9sbGVyIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVtb3ZlIGFsbCBjdXJyZW50bHkgYWN0aXZlIGxpc3RlbmVycy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQG5hbWUge0BsaW5rIGNvbnRyb2xsZXJ9XG4gICAgICAgICAqIEBtZW1iZXIge0Fib3J0Q29udHJvbGxlcn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXNbY29udHJvbGxlcl0gPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBvcHRpb25zIG9iamVjdCBmb3IgYWRkRXZlbnRMaXN0ZW5lciB0aGF0IHRpZXMgdGhlIGxpc3RlbmVyXG4gICAgICogdG8gdGhlIEFib3J0U2lnbmFsIGZyb20gdGhlIGN1cnJlbnQgQWJvcnRDb250cm9sbGVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudCBBbiBIVE1MIGVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0cmlnZ2VycyBUaGUgbGlzdCBvZiBhY3RpdmUgV01MIHRyaWdnZXIgZXZlbnRzIGZvciB0aGUgc3BlY2lmaWVkIGVsZW1lbnRzXG4gICAgICogQHJldHVybnMge0FkZEV2ZW50TGlzdGVuZXJPcHRpb25zfVxuICAgICAqL1xuICAgIHNldChlbGVtZW50LCB0cmlnZ2Vycykge1xuICAgICAgICByZXR1cm4geyBzaWduYWw6IHRoaXNbY29udHJvbGxlcl0uc2lnbmFsIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwgcmVnaXN0ZXJlZCBldmVudCBsaXN0ZW5lcnMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICByZXNldCgpIHtcbiAgICAgICAgdGhpc1tjb250cm9sbGVyXS5hYm9ydCgpO1xuICAgICAgICB0aGlzW2NvbnRyb2xsZXJdID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAdHlwZSB7c3ltYm9sfVxuICovXG5jb25zdCB0cmlnZ2VyTWFwID0gU3ltYm9sKCk7XG5cbi8qKlxuICogQHR5cGUge3N5bWJvbH1cbiAqL1xuY29uc3QgZWxlbWVudENvdW50ID0gU3ltYm9sKCk7XG5cbi8qKlxuICogV2Vha01hcFJlZ2lzdHJ5IG1hcHMgYWN0aXZlIHRyaWdnZXIgZXZlbnRzIHRvIGVhY2ggRE9NIGVsZW1lbnQgdGhyb3VnaCBhIFdlYWtNYXAuXG4gKiBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgbWFwcGluZyByZW1haW5zIHByaXZhdGUgdG8gdGhpcyBtb2R1bGUsIHdoaWxlIHN0aWxsIGFsbG93aW5nIGdhcmJhZ2VcbiAqIGNvbGxlY3Rpb24gb2YgdGhlIGludm9sdmVkIGVsZW1lbnRzLlxuICovXG5jbGFzcyBXZWFrTWFwUmVnaXN0cnkge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogU3RvcmVzIHRoZSBjdXJyZW50IGVsZW1lbnQtdG8tdHJpZ2dlciBtYXBwaW5nLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAbmFtZSB7QGxpbmsgdHJpZ2dlck1hcH1cbiAgICAgICAgICogQG1lbWJlciB7V2Vha01hcDxIVE1MRWxlbWVudCwgc3RyaW5nW10+fVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpc1t0cmlnZ2VyTWFwXSA9IG5ldyBXZWFrTWFwKCk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHdpdGggYWN0aXZlIFdNTCB0cmlnZ2Vycy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQG5hbWUge0BsaW5rIGVsZW1lbnRDb3VudH1cbiAgICAgICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpc1tlbGVtZW50Q291bnRdID0gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBhY3RpdmUgdHJpZ2dlcnMgZm9yIHRoZSBzcGVjaWZpZWQgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnQgQW4gSFRNTCBlbGVtZW50XG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gdHJpZ2dlcnMgVGhlIGxpc3Qgb2YgYWN0aXZlIFdNTCB0cmlnZ2VyIGV2ZW50cyBmb3IgdGhlIHNwZWNpZmllZCBlbGVtZW50XG4gICAgICogQHJldHVybnMge0FkZEV2ZW50TGlzdGVuZXJPcHRpb25zfVxuICAgICAqL1xuICAgIHNldChlbGVtZW50LCB0cmlnZ2Vycykge1xuICAgICAgICB0aGlzW2VsZW1lbnRDb3VudF0gKz0gIXRoaXNbdHJpZ2dlck1hcF0uaGFzKGVsZW1lbnQpO1xuICAgICAgICB0aGlzW3RyaWdnZXJNYXBdLnNldChlbGVtZW50LCB0cmlnZ2Vycyk7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCByZWdpc3RlcmVkIGV2ZW50IGxpc3RlbmVycy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIHJlc2V0KCkge1xuICAgICAgICBpZiAodGhpc1tlbGVtZW50Q291bnRdIDw9IDApXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGRvY3VtZW50LmJvZHkucXVlcnlTZWxlY3RvckFsbCgnKicpKSB7XG4gICAgICAgICAgICBpZiAodGhpc1tlbGVtZW50Q291bnRdIDw9IDApXG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNvbnN0IHRyaWdnZXJzID0gdGhpc1t0cmlnZ2VyTWFwXS5nZXQoZWxlbWVudCk7XG4gICAgICAgICAgICB0aGlzW2VsZW1lbnRDb3VudF0gLT0gKHR5cGVvZiB0cmlnZ2VycyAhPT0gXCJ1bmRlZmluZWRcIik7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgdHJpZ2dlciBvZiB0cmlnZ2VycyB8fCBbXSlcbiAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodHJpZ2dlciwgb25XTUxUcmlnZ2VyZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpc1t0cmlnZ2VyTWFwXSA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgIHRoaXNbZWxlbWVudENvdW50XSA9IDA7XG4gICAgfVxufVxuXG5jb25zdCB0cmlnZ2VyUmVnaXN0cnkgPSBjYW5BYm9ydExpc3RlbmVycygpID8gbmV3IEFib3J0Q29udHJvbGxlclJlZ2lzdHJ5KCkgOiBuZXcgV2Vha01hcFJlZ2lzdHJ5KCk7XG5cbi8qKlxuICogQWRkcyBldmVudCBsaXN0ZW5lcnMgdG8gdGhlIHNwZWNpZmllZCBlbGVtZW50LlxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGFkZFdNTExpc3RlbmVycyhlbGVtZW50KSB7XG4gICAgY29uc3QgdHJpZ2dlclJlZ0V4cCA9IC9cXFMrL2c7XG4gICAgY29uc3QgdHJpZ2dlckF0dHIgPSAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtd21sLXRyaWdnZXInKSB8fCBcImNsaWNrXCIpO1xuICAgIGNvbnN0IHRyaWdnZXJzID0gW107XG5cbiAgICBsZXQgbWF0Y2g7XG4gICAgd2hpbGUgKChtYXRjaCA9IHRyaWdnZXJSZWdFeHAuZXhlYyh0cmlnZ2VyQXR0cikpICE9PSBudWxsKVxuICAgICAgICB0cmlnZ2Vycy5wdXNoKG1hdGNoWzBdKTtcblxuICAgIGNvbnN0IG9wdGlvbnMgPSB0cmlnZ2VyUmVnaXN0cnkuc2V0KGVsZW1lbnQsIHRyaWdnZXJzKTtcbiAgICBmb3IgKGNvbnN0IHRyaWdnZXIgb2YgdHJpZ2dlcnMpXG4gICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih0cmlnZ2VyLCBvbldNTFRyaWdnZXJlZCwgb3B0aW9ucyk7XG59XG5cbi8qKlxuICogU2NoZWR1bGVzIGFuIGF1dG9tYXRpYyByZWxvYWQgb2YgV01MIHRvIGJlIHBlcmZvcm1lZCBhcyBzb29uIGFzIHRoZSBkb2N1bWVudCBpcyBmdWxseSBsb2FkZWQuXG4gKlxuICogQHJldHVybiB7dm9pZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEVuYWJsZSgpIHtcbiAgICB3aGVuUmVhZHkoUmVsb2FkKTtcbn1cblxuLyoqXG4gKiBSZWxvYWRzIHRoZSBXTUwgcGFnZSBieSBhZGRpbmcgbmVjZXNzYXJ5IGV2ZW50IGxpc3RlbmVycyBhbmQgYnJvd3NlciBsaXN0ZW5lcnMuXG4gKlxuICogQHJldHVybiB7dm9pZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFJlbG9hZCgpIHtcbiAgICB0cmlnZ2VyUmVnaXN0cnkucmVzZXQoKTtcbiAgICBkb2N1bWVudC5ib2R5LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXdtbC1ldmVudF0sIFtkYXRhLXdtbC13aW5kb3ddLCBbZGF0YS13bWwtb3BlblVSTF0nKS5mb3JFYWNoKGFkZFdNTExpc3RlbmVycyk7XG59XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbi8qIGpzaGludCBlc3ZlcnNpb246IDkgKi9cbmltcG9ydCB7bmV3UnVudGltZUNhbGxlcldpdGhJRCwgb2JqZWN0TmFtZXN9IGZyb20gXCIuL3J1bnRpbWVcIjtcblxuY29uc3QgY2FsbCA9IG5ld1J1bnRpbWVDYWxsZXJXaXRoSUQob2JqZWN0TmFtZXMuQnJvd3NlciwgJycpO1xuY29uc3QgQnJvd3Nlck9wZW5VUkwgPSAwO1xuXG4vKipcbiAqIE9wZW4gYSBicm93c2VyIHdpbmRvdyB0byB0aGUgZ2l2ZW4gVVJMXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsIC0gVGhlIFVSTCB0byBvcGVuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fVxuICovXG5leHBvcnQgZnVuY3Rpb24gT3BlblVSTCh1cmwpIHtcbiAgICByZXR1cm4gY2FsbChCcm93c2VyT3BlblVSTCwge3VybH0pO1xufVxuIiwgIi8vIFNvdXJjZTogaHR0cHM6Ly9naXRodWIuY29tL2FpL25hbm9pZFxuXG4vLyBUaGUgTUlUIExpY2Vuc2UgKE1JVClcbi8vXG4vLyBDb3B5cmlnaHQgMjAxNyBBbmRyZXkgU2l0bmlrIDxhbmRyZXlAc2l0bmlrLnJ1PlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2Zcbi8vIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW5cbi8vIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG9cbi8vIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mXG4vLyB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sXG4vLyAgICAgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gICAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuLy8gY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyAgICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1Ncbi8vIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUlxuLy8gQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSXG4vLyBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTlxuLy8gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gVGhpcyBhbHBoYWJldCB1c2VzIGBBLVphLXowLTlfLWAgc3ltYm9scy5cbi8vIFRoZSBvcmRlciBvZiBjaGFyYWN0ZXJzIGlzIG9wdGltaXplZCBmb3IgYmV0dGVyIGd6aXAgYW5kIGJyb3RsaSBjb21wcmVzc2lvbi5cbi8vIFJlZmVyZW5jZXMgdG8gdGhlIHNhbWUgZmlsZSAod29ya3MgYm90aCBmb3IgZ3ppcCBhbmQgYnJvdGxpKTpcbi8vIGAndXNlYCwgYGFuZG9tYCwgYW5kIGByaWN0J2Bcbi8vIFJlZmVyZW5jZXMgdG8gdGhlIGJyb3RsaSBkZWZhdWx0IGRpY3Rpb25hcnk6XG4vLyBgLTI2VGAsIGAxOTgzYCwgYDQwcHhgLCBgNzVweGAsIGBidXNoYCwgYGphY2tgLCBgbWluZGAsIGB2ZXJ5YCwgYW5kIGB3b2xmYFxubGV0IHVybEFscGhhYmV0ID1cbiAgICAndXNlYW5kb20tMjZUMTk4MzQwUFg3NXB4SkFDS1ZFUllNSU5EQlVTSFdPTEZfR1FaYmZnaGprbHF2d3l6cmljdCdcblxuZXhwb3J0IGxldCBuYW5vaWQgPSAoc2l6ZSA9IDIxKSA9PiB7XG4gICAgbGV0IGlkID0gJydcbiAgICAvLyBBIGNvbXBhY3QgYWx0ZXJuYXRpdmUgZm9yIGBmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXA7IGkrKylgLlxuICAgIGxldCBpID0gc2l6ZSB8IDBcbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgIC8vIGB8IDBgIGlzIG1vcmUgY29tcGFjdCBhbmQgZmFzdGVyIHRoYW4gYE1hdGguZmxvb3IoKWAuXG4gICAgICAgIGlkICs9IHVybEFscGhhYmV0WyhNYXRoLnJhbmRvbSgpICogNjQpIHwgMF1cbiAgICB9XG4gICAgcmV0dXJuIGlkXG59IiwgIi8qXG4gXyAgICAgX18gICAgIF8gX19cbnwgfCAgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vKiBqc2hpbnQgZXN2ZXJzaW9uOiA5ICovXG5pbXBvcnQgeyBuYW5vaWQgfSBmcm9tICcuL25hbm9pZC5qcyc7XG5cbmNvbnN0IHJ1bnRpbWVVUkwgPSB3aW5kb3cubG9jYXRpb24ub3JpZ2luICsgXCIvd2FpbHMvcnVudGltZVwiO1xuXG4vLyBPYmplY3QgTmFtZXNcbmV4cG9ydCBjb25zdCBvYmplY3ROYW1lcyA9IHtcbiAgICBDYWxsOiAwLFxuICAgIENsaXBib2FyZDogMSxcbiAgICBBcHBsaWNhdGlvbjogMixcbiAgICBFdmVudHM6IDMsXG4gICAgQ29udGV4dE1lbnU6IDQsXG4gICAgRGlhbG9nOiA1LFxuICAgIFdpbmRvdzogNixcbiAgICBTY3JlZW5zOiA3LFxuICAgIFN5c3RlbTogOCxcbiAgICBCcm93c2VyOiA5LFxuICAgIENhbmNlbENhbGw6IDEwLFxufVxuZXhwb3J0IGxldCBjbGllbnRJZCA9IG5hbm9pZCgpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBydW50aW1lIGNhbGxlciBmdW5jdGlvbiB0aGF0IGludm9rZXMgYSBzcGVjaWZpZWQgbWV0aG9kIG9uIGEgZ2l2ZW4gb2JqZWN0IHdpdGhpbiBhIHNwZWNpZmllZCB3aW5kb3cgY29udGV4dC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IC0gVGhlIG9iamVjdCBvbiB3aGljaCB0aGUgbWV0aG9kIGlzIHRvIGJlIGludm9rZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gd2luZG93TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB3aW5kb3cgY29udGV4dCBpbiB3aGljaCB0aGUgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IEEgcnVudGltZSBjYWxsZXIgZnVuY3Rpb24gdGhhdCB0YWtlcyB0aGUgbWV0aG9kIG5hbWUgYW5kIG9wdGlvbmFsbHkgYXJndW1lbnRzIGFuZCBpbnZva2VzIHRoZSBtZXRob2Qgd2l0aGluIHRoZSBzcGVjaWZpZWQgd2luZG93IGNvbnRleHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuZXdSdW50aW1lQ2FsbGVyKG9iamVjdCwgd2luZG93TmFtZSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAobWV0aG9kLCBhcmdzPW51bGwpIHtcbiAgICAgICAgcmV0dXJuIHJ1bnRpbWVDYWxsKG9iamVjdCArIFwiLlwiICsgbWV0aG9kLCB3aW5kb3dOYW1lLCBhcmdzKTtcbiAgICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgcnVudGltZSBjYWxsZXIgd2l0aCBzcGVjaWZpZWQgSUQuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IG9iamVjdCAtIFRoZSBvYmplY3QgdG8gaW52b2tlIHRoZSBtZXRob2Qgb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gd2luZG93TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB3aW5kb3cuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gLSBUaGUgbmV3IHJ1bnRpbWUgY2FsbGVyIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbmV3UnVudGltZUNhbGxlcldpdGhJRChvYmplY3QsIHdpbmRvd05hbWUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG1ldGhvZCwgYXJncz1udWxsKSB7XG4gICAgICAgIHJldHVybiBydW50aW1lQ2FsbFdpdGhJRChvYmplY3QsIG1ldGhvZCwgd2luZG93TmFtZSwgYXJncyk7XG4gICAgfTtcbn1cblxuXG5mdW5jdGlvbiBydW50aW1lQ2FsbChtZXRob2QsIHdpbmRvd05hbWUsIGFyZ3MpIHtcbiAgICByZXR1cm4gcnVudGltZUNhbGxXaXRoSUQobnVsbCwgbWV0aG9kLCB3aW5kb3dOYW1lLCBhcmdzKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVudGltZUNhbGxXaXRoSUQob2JqZWN0SUQsIG1ldGhvZCwgd2luZG93TmFtZSwgYXJncykge1xuICAgIGxldCB1cmwgPSBuZXcgVVJMKHJ1bnRpbWVVUkwpO1xuICAgIGlmIChvYmplY3RJRCAhPSBudWxsKSB7XG4gICAgICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKFwib2JqZWN0XCIsIG9iamVjdElEKTtcbiAgICB9XG4gICAgaWYgKG1ldGhvZCAhPSBudWxsKSB7XG4gICAgICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKFwibWV0aG9kXCIsIG1ldGhvZCk7XG4gICAgfVxuICAgIGxldCBmZXRjaE9wdGlvbnMgPSB7XG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgIH07XG4gICAgaWYgKHdpbmRvd05hbWUpIHtcbiAgICAgICAgZmV0Y2hPcHRpb25zLmhlYWRlcnNbXCJ4LXdhaWxzLXdpbmRvdy1uYW1lXCJdID0gd2luZG93TmFtZTtcbiAgICB9XG4gICAgaWYgKGFyZ3MpIHtcbiAgICAgICAgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoXCJhcmdzXCIsIEpTT04uc3RyaW5naWZ5KGFyZ3MpKTtcbiAgICB9XG4gICAgZmV0Y2hPcHRpb25zLmhlYWRlcnNbXCJ4LXdhaWxzLWNsaWVudC1pZFwiXSA9IGNsaWVudElkO1xuXG4gICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCBmZXRjaE9wdGlvbnMpO1xuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGF3YWl0IHJlc3BvbnNlLnRleHQoKSk7XG4gICAgfVxuXG4gICAgaWYgKHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiQ29udGVudC1UeXBlXCIpICYmIHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiQ29udGVudC1UeXBlXCIpLmluZGV4T2YoXCJhcHBsaWNhdGlvbi9qc29uXCIpICE9PSAtMSkge1xuICAgICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiByZXNwb25zZS50ZXh0KCk7XG4gICAgfVxufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vKiBqc2hpbnQgZXN2ZXJzaW9uOiA5ICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gT3BlbkZpbGVEaWFsb2dPcHRpb25zXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtDYW5DaG9vc2VEaXJlY3Rvcmllc10gLSBJbmRpY2F0ZXMgaWYgZGlyZWN0b3JpZXMgY2FuIGJlIGNob3Nlbi5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW0NhbkNob29zZUZpbGVzXSAtIEluZGljYXRlcyBpZiBmaWxlcyBjYW4gYmUgY2hvc2VuLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbQ2FuQ3JlYXRlRGlyZWN0b3JpZXNdIC0gSW5kaWNhdGVzIGlmIGRpcmVjdG9yaWVzIGNhbiBiZSBjcmVhdGVkLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbU2hvd0hpZGRlbkZpbGVzXSAtIEluZGljYXRlcyBpZiBoaWRkZW4gZmlsZXMgc2hvdWxkIGJlIHNob3duLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbUmVzb2x2ZXNBbGlhc2VzXSAtIEluZGljYXRlcyBpZiBhbGlhc2VzIHNob3VsZCBiZSByZXNvbHZlZC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW0FsbG93c011bHRpcGxlU2VsZWN0aW9uXSAtIEluZGljYXRlcyBpZiBtdWx0aXBsZSBzZWxlY3Rpb24gaXMgYWxsb3dlZC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW0hpZGVFeHRlbnNpb25dIC0gSW5kaWNhdGVzIGlmIHRoZSBleHRlbnNpb24gc2hvdWxkIGJlIGhpZGRlbi5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW0NhblNlbGVjdEhpZGRlbkV4dGVuc2lvbl0gLSBJbmRpY2F0ZXMgaWYgaGlkZGVuIGV4dGVuc2lvbnMgY2FuIGJlIHNlbGVjdGVkLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbVHJlYXRzRmlsZVBhY2thZ2VzQXNEaXJlY3Rvcmllc10gLSBJbmRpY2F0ZXMgaWYgZmlsZSBwYWNrYWdlcyBzaG91bGQgYmUgdHJlYXRlZCBhcyBkaXJlY3Rvcmllcy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW0FsbG93c090aGVyRmlsZXR5cGVzXSAtIEluZGljYXRlcyBpZiBvdGhlciBmaWxlIHR5cGVzIGFyZSBhbGxvd2VkLlxuICogQHByb3BlcnR5IHtGaWxlRmlsdGVyW119IFtGaWx0ZXJzXSAtIEFycmF5IG9mIGZpbGUgZmlsdGVycy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbVGl0bGVdIC0gVGl0bGUgb2YgdGhlIGRpYWxvZy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbTWVzc2FnZV0gLSBNZXNzYWdlIHRvIHNob3cgaW4gdGhlIGRpYWxvZy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbQnV0dG9uVGV4dF0gLSBUZXh0IHRvIGRpc3BsYXkgb24gdGhlIGJ1dHRvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbRGlyZWN0b3J5XSAtIERpcmVjdG9yeSB0byBvcGVuIGluIHRoZSBkaWFsb2cuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtEZXRhY2hlZF0gLSBJbmRpY2F0ZXMgaWYgdGhlIGRpYWxvZyBzaG91bGQgYXBwZWFyIGRldGFjaGVkIGZyb20gdGhlIG1haW4gd2luZG93LlxuICovXG5cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTYXZlRmlsZURpYWxvZ09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbRmlsZW5hbWVdIC0gRGVmYXVsdCBmaWxlbmFtZSB0byB1c2UgaW4gdGhlIGRpYWxvZy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW0NhbkNob29zZURpcmVjdG9yaWVzXSAtIEluZGljYXRlcyBpZiBkaXJlY3RvcmllcyBjYW4gYmUgY2hvc2VuLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbQ2FuQ2hvb3NlRmlsZXNdIC0gSW5kaWNhdGVzIGlmIGZpbGVzIGNhbiBiZSBjaG9zZW4uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtDYW5DcmVhdGVEaXJlY3Rvcmllc10gLSBJbmRpY2F0ZXMgaWYgZGlyZWN0b3JpZXMgY2FuIGJlIGNyZWF0ZWQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtTaG93SGlkZGVuRmlsZXNdIC0gSW5kaWNhdGVzIGlmIGhpZGRlbiBmaWxlcyBzaG91bGQgYmUgc2hvd24uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtSZXNvbHZlc0FsaWFzZXNdIC0gSW5kaWNhdGVzIGlmIGFsaWFzZXMgc2hvdWxkIGJlIHJlc29sdmVkLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbQWxsb3dzTXVsdGlwbGVTZWxlY3Rpb25dIC0gSW5kaWNhdGVzIGlmIG11bHRpcGxlIHNlbGVjdGlvbiBpcyBhbGxvd2VkLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbSGlkZUV4dGVuc2lvbl0gLSBJbmRpY2F0ZXMgaWYgdGhlIGV4dGVuc2lvbiBzaG91bGQgYmUgaGlkZGVuLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbQ2FuU2VsZWN0SGlkZGVuRXh0ZW5zaW9uXSAtIEluZGljYXRlcyBpZiBoaWRkZW4gZXh0ZW5zaW9ucyBjYW4gYmUgc2VsZWN0ZWQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtUcmVhdHNGaWxlUGFja2FnZXNBc0RpcmVjdG9yaWVzXSAtIEluZGljYXRlcyBpZiBmaWxlIHBhY2thZ2VzIHNob3VsZCBiZSB0cmVhdGVkIGFzIGRpcmVjdG9yaWVzLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbQWxsb3dzT3RoZXJGaWxldHlwZXNdIC0gSW5kaWNhdGVzIGlmIG90aGVyIGZpbGUgdHlwZXMgYXJlIGFsbG93ZWQuXG4gKiBAcHJvcGVydHkge0ZpbGVGaWx0ZXJbXX0gW0ZpbHRlcnNdIC0gQXJyYXkgb2YgZmlsZSBmaWx0ZXJzLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtUaXRsZV0gLSBUaXRsZSBvZiB0aGUgZGlhbG9nLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtNZXNzYWdlXSAtIE1lc3NhZ2UgdG8gc2hvdyBpbiB0aGUgZGlhbG9nLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtCdXR0b25UZXh0XSAtIFRleHQgdG8gZGlzcGxheSBvbiB0aGUgYnV0dG9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtEaXJlY3RvcnldIC0gRGlyZWN0b3J5IHRvIG9wZW4gaW4gdGhlIGRpYWxvZy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW0RldGFjaGVkXSAtIEluZGljYXRlcyBpZiB0aGUgZGlhbG9nIHNob3VsZCBhcHBlYXIgZGV0YWNoZWQgZnJvbSB0aGUgbWFpbiB3aW5kb3cuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBNZXNzYWdlRGlhbG9nT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFtUaXRsZV0gLSBUaGUgdGl0bGUgb2YgdGhlIGRpYWxvZyB3aW5kb3cuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW01lc3NhZ2VdIC0gVGhlIG1haW4gbWVzc2FnZSB0byBzaG93IGluIHRoZSBkaWFsb2cuXG4gKiBAcHJvcGVydHkge0J1dHRvbltdfSBbQnV0dG9uc10gLSBBcnJheSBvZiBidXR0b24gb3B0aW9ucyB0byBzaG93IGluIHRoZSBkaWFsb2cuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtEZXRhY2hlZF0gLSBUcnVlIGlmIHRoZSBkaWFsb2cgc2hvdWxkIGFwcGVhciBkZXRhY2hlZCBmcm9tIHRoZSBtYWluIHdpbmRvdyAoaWYgYXBwbGljYWJsZSkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBCdXR0b25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbTGFiZWxdIC0gVGV4dCB0aGF0IGFwcGVhcnMgd2l0aGluIHRoZSBidXR0b24uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtJc0NhbmNlbF0gLSBUcnVlIGlmIHRoZSBidXR0b24gc2hvdWxkIGNhbmNlbCBhbiBvcGVyYXRpb24gd2hlbiBjbGlja2VkLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbSXNEZWZhdWx0XSAtIFRydWUgaWYgdGhlIGJ1dHRvbiBzaG91bGQgYmUgdGhlIGRlZmF1bHQgYWN0aW9uIHdoZW4gdGhlIHVzZXIgcHJlc3NlcyBlbnRlci5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEZpbGVGaWx0ZXJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbRGlzcGxheU5hbWVdIC0gRGlzcGxheSBuYW1lIGZvciB0aGUgZmlsdGVyLCBpdCBjb3VsZCBiZSBcIlRleHQgRmlsZXNcIiwgXCJJbWFnZXNcIiBldGMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW1BhdHRlcm5dIC0gUGF0dGVybiB0byBtYXRjaCBmb3IgdGhlIGZpbHRlciwgZS5nLiBcIioudHh0OyoubWRcIiBmb3IgdGV4dCBtYXJrZG93biBmaWxlcy5cbiAqL1xuXG4vLyBzZXR1cFxud2luZG93Ll93YWlscyA9IHdpbmRvdy5fd2FpbHMgfHwge307XG53aW5kb3cuX3dhaWxzLmRpYWxvZ0Vycm9yQ2FsbGJhY2sgPSBkaWFsb2dFcnJvckNhbGxiYWNrO1xud2luZG93Ll93YWlscy5kaWFsb2dSZXN1bHRDYWxsYmFjayA9IGRpYWxvZ1Jlc3VsdENhbGxiYWNrO1xuXG5pbXBvcnQge25ld1J1bnRpbWVDYWxsZXJXaXRoSUQsIG9iamVjdE5hbWVzfSBmcm9tIFwiLi9ydW50aW1lXCI7XG5cbmltcG9ydCB7IG5hbm9pZCB9IGZyb20gJy4vbmFub2lkLmpzJztcblxuLy8gRGVmaW5lIGNvbnN0YW50cyBmcm9tIHRoZSBgbWV0aG9kc2Agb2JqZWN0IGluIFRpdGxlIENhc2VcbmNvbnN0IERpYWxvZ0luZm8gPSAwO1xuY29uc3QgRGlhbG9nV2FybmluZyA9IDE7XG5jb25zdCBEaWFsb2dFcnJvciA9IDI7XG5jb25zdCBEaWFsb2dRdWVzdGlvbiA9IDM7XG5jb25zdCBEaWFsb2dPcGVuRmlsZSA9IDQ7XG5jb25zdCBEaWFsb2dTYXZlRmlsZSA9IDU7XG5cbmNvbnN0IGNhbGwgPSBuZXdSdW50aW1lQ2FsbGVyV2l0aElEKG9iamVjdE5hbWVzLkRpYWxvZywgJycpO1xuY29uc3QgZGlhbG9nUmVzcG9uc2VzID0gbmV3IE1hcCgpO1xuXG4vKipcbiAqIEdlbmVyYXRlcyBhIHVuaXF1ZSBpZCB0aGF0IGlzIG5vdCBwcmVzZW50IGluIGRpYWxvZ1Jlc3BvbnNlcy5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IHVuaXF1ZSBpZFxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZUlEKCkge1xuICAgIGxldCByZXN1bHQ7XG4gICAgZG8ge1xuICAgICAgICByZXN1bHQgPSBuYW5vaWQoKTtcbiAgICB9IHdoaWxlIChkaWFsb2dSZXNwb25zZXMuaGFzKHJlc3VsdCkpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogU2hvd3MgYSBkaWFsb2cgb2Ygc3BlY2lmaWVkIHR5cGUgd2l0aCB0aGUgZ2l2ZW4gb3B0aW9ucy5cbiAqIEBwYXJhbSB7bnVtYmVyfSB0eXBlIC0gdHlwZSBvZiBkaWFsb2dcbiAqIEBwYXJhbSB7TWVzc2FnZURpYWxvZ09wdGlvbnN8T3BlbkZpbGVEaWFsb2dPcHRpb25zfFNhdmVGaWxlRGlhbG9nT3B0aW9uc30gb3B0aW9ucyAtIG9wdGlvbnMgZm9yIHRoZSBkaWFsb2dcbiAqIEByZXR1cm5zIHtQcm9taXNlfSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCByZXN1bHQgb2YgZGlhbG9nXG4gKi9cbmZ1bmN0aW9uIGRpYWxvZyh0eXBlLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBpZCA9IGdlbmVyYXRlSUQoKTtcbiAgICBvcHRpb25zW1wiZGlhbG9nLWlkXCJdID0gaWQ7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgZGlhbG9nUmVzcG9uc2VzLnNldChpZCwge3Jlc29sdmUsIHJlamVjdH0pO1xuICAgICAgICBjYWxsKHR5cGUsIG9wdGlvbnMpLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgIGRpYWxvZ1Jlc3BvbnNlcy5kZWxldGUoaWQpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBIYW5kbGVzIHRoZSBjYWxsYmFjayBmcm9tIGEgZGlhbG9nLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIFRoZSBJRCBvZiB0aGUgZGlhbG9nIHJlc3BvbnNlLlxuICogQHBhcmFtIHtzdHJpbmd9IGRhdGEgLSBUaGUgZGF0YSByZWNlaXZlZCBmcm9tIHRoZSBkaWFsb2cuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzSlNPTiAtIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBkYXRhIGlzIGluIEpTT04gZm9ybWF0LlxuICpcbiAqIEByZXR1cm4ge3VuZGVmaW5lZH1cbiAqL1xuZnVuY3Rpb24gZGlhbG9nUmVzdWx0Q2FsbGJhY2soaWQsIGRhdGEsIGlzSlNPTikge1xuICAgIGxldCBwID0gZGlhbG9nUmVzcG9uc2VzLmdldChpZCk7XG4gICAgaWYgKHApIHtcbiAgICAgICAgZGlhbG9nUmVzcG9uc2VzLmRlbGV0ZShpZCk7XG4gICAgICAgIGlmIChpc0pTT04pIHtcbiAgICAgICAgICAgIHAucmVzb2x2ZShKU09OLnBhcnNlKGRhdGEpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHAucmVzb2x2ZShkYXRhKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBDYWxsYmFjayBmdW5jdGlvbiBmb3IgaGFuZGxpbmcgZXJyb3JzIGluIGRpYWxvZy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaWQgLSBUaGUgaWQgb2YgdGhlIGRpYWxvZyByZXNwb25zZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gVGhlIGVycm9yIG1lc3NhZ2UuXG4gKlxuICogQHJldHVybiB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gZGlhbG9nRXJyb3JDYWxsYmFjayhpZCwgbWVzc2FnZSkge1xuICAgIGxldCBwID0gZGlhbG9nUmVzcG9uc2VzLmdldChpZCk7XG4gICAgaWYgKHApIHtcbiAgICAgICAgZGlhbG9nUmVzcG9uc2VzLmRlbGV0ZShpZCk7XG4gICAgICAgIHAucmVqZWN0KG5ldyBFcnJvcihtZXNzYWdlKSk7XG4gICAgfVxufVxuXG5cbi8vIFJlcGxhY2UgYG1ldGhvZHNgIHdpdGggY29uc3RhbnRzIGluIFRpdGxlIENhc2VcblxuLyoqXG4gKiBAcGFyYW0ge01lc3NhZ2VEaWFsb2dPcHRpb25zfSBvcHRpb25zIC0gRGlhbG9nIG9wdGlvbnNcbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IC0gVGhlIGxhYmVsIG9mIHRoZSBidXR0b24gcHJlc3NlZFxuICovXG5leHBvcnQgY29uc3QgSW5mbyA9IChvcHRpb25zKSA9PiBkaWFsb2coRGlhbG9nSW5mbywgb3B0aW9ucyk7XG5cbi8qKlxuICogQHBhcmFtIHtNZXNzYWdlRGlhbG9nT3B0aW9uc30gb3B0aW9ucyAtIERpYWxvZyBvcHRpb25zXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSAtIFRoZSBsYWJlbCBvZiB0aGUgYnV0dG9uIHByZXNzZWRcbiAqL1xuZXhwb3J0IGNvbnN0IFdhcm5pbmcgPSAob3B0aW9ucykgPT4gZGlhbG9nKERpYWxvZ1dhcm5pbmcsIG9wdGlvbnMpO1xuXG4vKipcbiAqIEBwYXJhbSB7TWVzc2FnZURpYWxvZ09wdGlvbnN9IG9wdGlvbnMgLSBEaWFsb2cgb3B0aW9uc1xuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gLSBUaGUgbGFiZWwgb2YgdGhlIGJ1dHRvbiBwcmVzc2VkXG4gKi9cbmV4cG9ydCBjb25zdCBFcnJvciA9IChvcHRpb25zKSA9PiBkaWFsb2coRGlhbG9nRXJyb3IsIG9wdGlvbnMpO1xuXG4vKipcbiAqIEBwYXJhbSB7TWVzc2FnZURpYWxvZ09wdGlvbnN9IG9wdGlvbnMgLSBEaWFsb2cgb3B0aW9uc1xuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gLSBUaGUgbGFiZWwgb2YgdGhlIGJ1dHRvbiBwcmVzc2VkXG4gKi9cbmV4cG9ydCBjb25zdCBRdWVzdGlvbiA9IChvcHRpb25zKSA9PiBkaWFsb2coRGlhbG9nUXVlc3Rpb24sIG9wdGlvbnMpO1xuXG4vKipcbiAqIEBwYXJhbSB7T3BlbkZpbGVEaWFsb2dPcHRpb25zfSBvcHRpb25zIC0gRGlhbG9nIG9wdGlvbnNcbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZ1tdfHN0cmluZz59IFJldHVybnMgc2VsZWN0ZWQgZmlsZSBvciBsaXN0IG9mIGZpbGVzLiBSZXR1cm5zIGJsYW5rIHN0cmluZyBpZiBubyBmaWxlIGlzIHNlbGVjdGVkLlxuICovXG5leHBvcnQgY29uc3QgT3BlbkZpbGUgPSAob3B0aW9ucykgPT4gZGlhbG9nKERpYWxvZ09wZW5GaWxlLCBvcHRpb25zKTtcblxuLyoqXG4gKiBAcGFyYW0ge1NhdmVGaWxlRGlhbG9nT3B0aW9uc30gb3B0aW9ucyAtIERpYWxvZyBvcHRpb25zXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSBSZXR1cm5zIHRoZSBzZWxlY3RlZCBmaWxlLiBSZXR1cm5zIGJsYW5rIHN0cmluZyBpZiBubyBmaWxlIGlzIHNlbGVjdGVkLlxuICovXG5leHBvcnQgY29uc3QgU2F2ZUZpbGUgPSAob3B0aW9ucykgPT4gZGlhbG9nKERpYWxvZ1NhdmVGaWxlLCBvcHRpb25zKTtcbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuLyoganNoaW50IGVzdmVyc2lvbjogOSAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtpbXBvcnQoXCIuL3R5cGVzXCIpLldhaWxzRXZlbnR9IFdhaWxzRXZlbnRcbiAqL1xuaW1wb3J0IHtuZXdSdW50aW1lQ2FsbGVyV2l0aElELCBvYmplY3ROYW1lc30gZnJvbSBcIi4vcnVudGltZVwiO1xuXG5pbXBvcnQge0V2ZW50VHlwZXN9IGZyb20gXCIuL2V2ZW50X3R5cGVzXCI7XG5leHBvcnQgY29uc3QgVHlwZXMgPSBFdmVudFR5cGVzO1xuXG4vLyBTZXR1cFxud2luZG93Ll93YWlscyA9IHdpbmRvdy5fd2FpbHMgfHwge307XG53aW5kb3cuX3dhaWxzLmRpc3BhdGNoV2FpbHNFdmVudCA9IGRpc3BhdGNoV2FpbHNFdmVudDtcblxuY29uc3QgY2FsbCA9IG5ld1J1bnRpbWVDYWxsZXJXaXRoSUQob2JqZWN0TmFtZXMuRXZlbnRzLCAnJyk7XG5jb25zdCBFbWl0TWV0aG9kID0gMDtcbmNvbnN0IGV2ZW50TGlzdGVuZXJzID0gbmV3IE1hcCgpO1xuXG5jbGFzcyBMaXN0ZW5lciB7XG4gICAgY29uc3RydWN0b3IoZXZlbnROYW1lLCBjYWxsYmFjaywgbWF4Q2FsbGJhY2tzKSB7XG4gICAgICAgIHRoaXMuZXZlbnROYW1lID0gZXZlbnROYW1lO1xuICAgICAgICB0aGlzLm1heENhbGxiYWNrcyA9IG1heENhbGxiYWNrcyB8fCAtMTtcbiAgICAgICAgdGhpcy5DYWxsYmFjayA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgICBjYWxsYmFjayhkYXRhKTtcbiAgICAgICAgICAgIGlmICh0aGlzLm1heENhbGxiYWNrcyA9PT0gLTEpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMubWF4Q2FsbGJhY2tzIC09IDE7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tYXhDYWxsYmFja3MgPT09IDA7XG4gICAgICAgIH07XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgV2FpbHNFdmVudCB7XG4gICAgY29uc3RydWN0b3IobmFtZSwgZGF0YSA9IG51bGwpIHtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXR1cCgpIHtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hXYWlsc0V2ZW50KGV2ZW50KSB7XG4gICAgbGV0IGxpc3RlbmVycyA9IGV2ZW50TGlzdGVuZXJzLmdldChldmVudC5uYW1lKTtcbiAgICBpZiAobGlzdGVuZXJzKSB7XG4gICAgICAgIGxldCB0b1JlbW92ZSA9IGxpc3RlbmVycy5maWx0ZXIobGlzdGVuZXIgPT4ge1xuICAgICAgICAgICAgbGV0IHJlbW92ZSA9IGxpc3RlbmVyLkNhbGxiYWNrKGV2ZW50KTtcbiAgICAgICAgICAgIGlmIChyZW1vdmUpIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHRvUmVtb3ZlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxpc3RlbmVycyA9IGxpc3RlbmVycy5maWx0ZXIobCA9PiAhdG9SZW1vdmUuaW5jbHVkZXMobCkpO1xuICAgICAgICAgICAgaWYgKGxpc3RlbmVycy5sZW5ndGggPT09IDApIGV2ZW50TGlzdGVuZXJzLmRlbGV0ZShldmVudC5uYW1lKTtcbiAgICAgICAgICAgIGVsc2UgZXZlbnRMaXN0ZW5lcnMuc2V0KGV2ZW50Lm5hbWUsIGxpc3RlbmVycyk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgZm9yIGEgc3BlY2lmaWMgZXZlbnQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudCB0byByZWdpc3RlciB0aGUgY2FsbGJhY2sgZm9yLlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBtYXhDYWxsYmFja3MgLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGltZXMgdGhlIGNhbGxiYWNrIGNhbiBiZSBjYWxsZWQgZm9yIHRoZSBldmVudC4gT25jZSB0aGUgbWF4aW11bSBudW1iZXIgaXMgcmVhY2hlZCwgdGhlIGNhbGxiYWNrIHdpbGwgbm8gbG9uZ2VyIGJlIGNhbGxlZC5cbiAqXG4gQHJldHVybiB7ZnVuY3Rpb259IC0gQSBmdW5jdGlvbiB0aGF0LCB3aGVuIGNhbGxlZCwgd2lsbCB1bnJlZ2lzdGVyIHRoZSBjYWxsYmFjayBmcm9tIHRoZSBldmVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE9uTXVsdGlwbGUoZXZlbnROYW1lLCBjYWxsYmFjaywgbWF4Q2FsbGJhY2tzKSB7XG4gICAgbGV0IGxpc3RlbmVycyA9IGV2ZW50TGlzdGVuZXJzLmdldChldmVudE5hbWUpIHx8IFtdO1xuICAgIGNvbnN0IHRoaXNMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcihldmVudE5hbWUsIGNhbGxiYWNrLCBtYXhDYWxsYmFja3MpO1xuICAgIGxpc3RlbmVycy5wdXNoKHRoaXNMaXN0ZW5lcik7XG4gICAgZXZlbnRMaXN0ZW5lcnMuc2V0KGV2ZW50TmFtZSwgbGlzdGVuZXJzKTtcbiAgICByZXR1cm4gKCkgPT4gbGlzdGVuZXJPZmYodGhpc0xpc3RlbmVyKTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCB3aGVuIHRoZSBzcGVjaWZpZWQgZXZlbnQgb2NjdXJzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBleGVjdXRlZC4gSXQgdGFrZXMgbm8gcGFyYW1ldGVycy5cbiAqIEByZXR1cm4ge2Z1bmN0aW9ufSAtIEEgZnVuY3Rpb24gdGhhdCwgd2hlbiBjYWxsZWQsIHdpbGwgdW5yZWdpc3RlciB0aGUgY2FsbGJhY2sgZnJvbSB0aGUgZXZlbnQuICovXG5leHBvcnQgZnVuY3Rpb24gT24oZXZlbnROYW1lLCBjYWxsYmFjaykgeyByZXR1cm4gT25NdWx0aXBsZShldmVudE5hbWUsIGNhbGxiYWNrLCAtMSk7IH1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBvbmx5IG9uY2UgZm9yIHRoZSBzcGVjaWZpZWQgZXZlbnQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gVGhlIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIGV2ZW50IG9jY3Vycy5cbiAqIEByZXR1cm4ge2Z1bmN0aW9ufSAtIEEgZnVuY3Rpb24gdGhhdCwgd2hlbiBjYWxsZWQsIHdpbGwgdW5yZWdpc3RlciB0aGUgY2FsbGJhY2sgZnJvbSB0aGUgZXZlbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBPbmNlKGV2ZW50TmFtZSwgY2FsbGJhY2spIHsgcmV0dXJuIE9uTXVsdGlwbGUoZXZlbnROYW1lLCBjYWxsYmFjaywgMSk7IH1cblxuLyoqXG4gKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgbGlzdGVuZXIgZnJvbSB0aGUgZXZlbnQgbGlzdGVuZXJzIGNvbGxlY3Rpb24uXG4gKiBJZiBhbGwgbGlzdGVuZXJzIGZvciB0aGUgZXZlbnQgYXJlIHJlbW92ZWQsIHRoZSBldmVudCBrZXkgaXMgZGVsZXRlZCBmcm9tIHRoZSBjb2xsZWN0aW9uLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBsaXN0ZW5lciAtIFRoZSBsaXN0ZW5lciB0byBiZSByZW1vdmVkLlxuICovXG5mdW5jdGlvbiBsaXN0ZW5lck9mZihsaXN0ZW5lcikge1xuICAgIGNvbnN0IGV2ZW50TmFtZSA9IGxpc3RlbmVyLmV2ZW50TmFtZTtcbiAgICBsZXQgbGlzdGVuZXJzID0gZXZlbnRMaXN0ZW5lcnMuZ2V0KGV2ZW50TmFtZSkuZmlsdGVyKGwgPT4gbCAhPT0gbGlzdGVuZXIpO1xuICAgIGlmIChsaXN0ZW5lcnMubGVuZ3RoID09PSAwKSBldmVudExpc3RlbmVycy5kZWxldGUoZXZlbnROYW1lKTtcbiAgICBlbHNlIGV2ZW50TGlzdGVuZXJzLnNldChldmVudE5hbWUsIGxpc3RlbmVycyk7XG59XG5cblxuLyoqXG4gKiBSZW1vdmVzIGV2ZW50IGxpc3RlbmVycyBmb3IgdGhlIHNwZWNpZmllZCBldmVudCBuYW1lcy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIHJlbW92ZSBsaXN0ZW5lcnMgZm9yLlxuICogQHBhcmFtIHsuLi5zdHJpbmd9IGFkZGl0aW9uYWxFdmVudE5hbWVzIC0gQWRkaXRpb25hbCBldmVudCBuYW1lcyB0byByZW1vdmUgbGlzdGVuZXJzIGZvci5cbiAqIEByZXR1cm4ge3VuZGVmaW5lZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE9mZihldmVudE5hbWUsIC4uLmFkZGl0aW9uYWxFdmVudE5hbWVzKSB7XG4gICAgbGV0IGV2ZW50c1RvUmVtb3ZlID0gW2V2ZW50TmFtZSwgLi4uYWRkaXRpb25hbEV2ZW50TmFtZXNdO1xuICAgIGV2ZW50c1RvUmVtb3ZlLmZvckVhY2goZXZlbnROYW1lID0+IGV2ZW50TGlzdGVuZXJzLmRlbGV0ZShldmVudE5hbWUpKTtcbn1cbi8qKlxuICogUmVtb3ZlcyBhbGwgZXZlbnQgbGlzdGVuZXJzLlxuICpcbiAqIEBmdW5jdGlvbiBPZmZBbGxcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gT2ZmQWxsKCkgeyBldmVudExpc3RlbmVycy5jbGVhcigpOyB9XG5cbi8qKlxuICogRW1pdHMgYW4gZXZlbnQgdXNpbmcgdGhlIGdpdmVuIGV2ZW50IG5hbWUuXG4gKlxuICogQHBhcmFtIHtXYWlsc0V2ZW50fSBldmVudCAtIFRoZSBuYW1lIG9mIHRoZSBldmVudCB0byBlbWl0LlxuICogQHJldHVybnMge2FueX0gLSBUaGUgcmVzdWx0IG9mIHRoZSBlbWl0dGVkIGV2ZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gRW1pdChldmVudCkgeyByZXR1cm4gY2FsbChFbWl0TWV0aG9kLCBldmVudCk7IH1cbiIsICJcbmV4cG9ydCBjb25zdCBFdmVudFR5cGVzID0ge1xuXHRXaW5kb3dzOiB7XG5cdFx0QVBNUG93ZXJTZXR0aW5nQ2hhbmdlOiBcIndpbmRvd3M6QVBNUG93ZXJTZXR0aW5nQ2hhbmdlXCIsXG5cdFx0QVBNUG93ZXJTdGF0dXNDaGFuZ2U6IFwid2luZG93czpBUE1Qb3dlclN0YXR1c0NoYW5nZVwiLFxuXHRcdEFQTVJlc3VtZUF1dG9tYXRpYzogXCJ3aW5kb3dzOkFQTVJlc3VtZUF1dG9tYXRpY1wiLFxuXHRcdEFQTVJlc3VtZVN1c3BlbmQ6IFwid2luZG93czpBUE1SZXN1bWVTdXNwZW5kXCIsXG5cdFx0QVBNU3VzcGVuZDogXCJ3aW5kb3dzOkFQTVN1c3BlbmRcIixcblx0XHRBcHBsaWNhdGlvblN0YXJ0ZWQ6IFwid2luZG93czpBcHBsaWNhdGlvblN0YXJ0ZWRcIixcblx0XHRTeXN0ZW1UaGVtZUNoYW5nZWQ6IFwid2luZG93czpTeXN0ZW1UaGVtZUNoYW5nZWRcIixcblx0XHRXZWJWaWV3TmF2aWdhdGlvbkNvbXBsZXRlZDogXCJ3aW5kb3dzOldlYlZpZXdOYXZpZ2F0aW9uQ29tcGxldGVkXCIsXG5cdFx0V2luZG93QWN0aXZlOiBcIndpbmRvd3M6V2luZG93QWN0aXZlXCIsXG5cdFx0V2luZG93QmFja2dyb3VuZEVyYXNlOiBcIndpbmRvd3M6V2luZG93QmFja2dyb3VuZEVyYXNlXCIsXG5cdFx0V2luZG93Q2xpY2tBY3RpdmU6IFwid2luZG93czpXaW5kb3dDbGlja0FjdGl2ZVwiLFxuXHRcdFdpbmRvd0Nsb3Npbmc6IFwid2luZG93czpXaW5kb3dDbG9zaW5nXCIsXG5cdFx0V2luZG93RGlkTW92ZTogXCJ3aW5kb3dzOldpbmRvd0RpZE1vdmVcIixcblx0XHRXaW5kb3dEaWRSZXNpemU6IFwid2luZG93czpXaW5kb3dEaWRSZXNpemVcIixcblx0XHRXaW5kb3dEUElDaGFuZ2VkOiBcIndpbmRvd3M6V2luZG93RFBJQ2hhbmdlZFwiLFxuXHRcdFdpbmRvd0RyYWdEcm9wOiBcIndpbmRvd3M6V2luZG93RHJhZ0Ryb3BcIixcblx0XHRXaW5kb3dEcmFnRW50ZXI6IFwid2luZG93czpXaW5kb3dEcmFnRW50ZXJcIixcblx0XHRXaW5kb3dEcmFnTGVhdmU6IFwid2luZG93czpXaW5kb3dEcmFnTGVhdmVcIixcblx0XHRXaW5kb3dEcmFnT3ZlcjogXCJ3aW5kb3dzOldpbmRvd0RyYWdPdmVyXCIsXG5cdFx0V2luZG93RW5kTW92ZTogXCJ3aW5kb3dzOldpbmRvd0VuZE1vdmVcIixcblx0XHRXaW5kb3dFbmRSZXNpemU6IFwid2luZG93czpXaW5kb3dFbmRSZXNpemVcIixcblx0XHRXaW5kb3dGdWxsc2NyZWVuOiBcIndpbmRvd3M6V2luZG93RnVsbHNjcmVlblwiLFxuXHRcdFdpbmRvd0hpZGU6IFwid2luZG93czpXaW5kb3dIaWRlXCIsXG5cdFx0V2luZG93SW5hY3RpdmU6IFwid2luZG93czpXaW5kb3dJbmFjdGl2ZVwiLFxuXHRcdFdpbmRvd0tleURvd246IFwid2luZG93czpXaW5kb3dLZXlEb3duXCIsXG5cdFx0V2luZG93S2V5VXA6IFwid2luZG93czpXaW5kb3dLZXlVcFwiLFxuXHRcdFdpbmRvd0tpbGxGb2N1czogXCJ3aW5kb3dzOldpbmRvd0tpbGxGb2N1c1wiLFxuXHRcdFdpbmRvd05vbkNsaWVudEhpdDogXCJ3aW5kb3dzOldpbmRvd05vbkNsaWVudEhpdFwiLFxuXHRcdFdpbmRvd05vbkNsaWVudE1vdXNlRG93bjogXCJ3aW5kb3dzOldpbmRvd05vbkNsaWVudE1vdXNlRG93blwiLFxuXHRcdFdpbmRvd05vbkNsaWVudE1vdXNlTGVhdmU6IFwid2luZG93czpXaW5kb3dOb25DbGllbnRNb3VzZUxlYXZlXCIsXG5cdFx0V2luZG93Tm9uQ2xpZW50TW91c2VNb3ZlOiBcIndpbmRvd3M6V2luZG93Tm9uQ2xpZW50TW91c2VNb3ZlXCIsXG5cdFx0V2luZG93Tm9uQ2xpZW50TW91c2VVcDogXCJ3aW5kb3dzOldpbmRvd05vbkNsaWVudE1vdXNlVXBcIixcblx0XHRXaW5kb3dQYWludDogXCJ3aW5kb3dzOldpbmRvd1BhaW50XCIsXG5cdFx0V2luZG93UmVzdG9yZTogXCJ3aW5kb3dzOldpbmRvd1Jlc3RvcmVcIixcblx0XHRXaW5kb3dTZXRGb2N1czogXCJ3aW5kb3dzOldpbmRvd1NldEZvY3VzXCIsXG5cdFx0V2luZG93U2hvdzogXCJ3aW5kb3dzOldpbmRvd1Nob3dcIixcblx0XHRXaW5kb3dTdGFydE1vdmU6IFwid2luZG93czpXaW5kb3dTdGFydE1vdmVcIixcblx0XHRXaW5kb3dTdGFydFJlc2l6ZTogXCJ3aW5kb3dzOldpbmRvd1N0YXJ0UmVzaXplXCIsXG5cdFx0V2luZG93VW5GdWxsc2NyZWVuOiBcIndpbmRvd3M6V2luZG93VW5GdWxsc2NyZWVuXCIsXG5cdFx0V2luZG93Wk9yZGVyQ2hhbmdlZDogXCJ3aW5kb3dzOldpbmRvd1pPcmRlckNoYW5nZWRcIixcblx0XHRXaW5kb3dNaW5pbWlzZTogXCJ3aW5kb3dzOldpbmRvd01pbmltaXNlXCIsXG5cdFx0V2luZG93VW5NaW5pbWlzZTogXCJ3aW5kb3dzOldpbmRvd1VuTWluaW1pc2VcIixcblx0XHRXaW5kb3dNYXhpbWlzZTogXCJ3aW5kb3dzOldpbmRvd01heGltaXNlXCIsXG5cdFx0V2luZG93VW5NYXhpbWlzZTogXCJ3aW5kb3dzOldpbmRvd1VuTWF4aW1pc2VcIixcblx0fSxcblx0TWFjOiB7XG5cdFx0QXBwbGljYXRpb25EaWRCZWNvbWVBY3RpdmU6IFwibWFjOkFwcGxpY2F0aW9uRGlkQmVjb21lQWN0aXZlXCIsXG5cdFx0QXBwbGljYXRpb25EaWRDaGFuZ2VCYWNraW5nUHJvcGVydGllczogXCJtYWM6QXBwbGljYXRpb25EaWRDaGFuZ2VCYWNraW5nUHJvcGVydGllc1wiLFxuXHRcdEFwcGxpY2F0aW9uRGlkQ2hhbmdlRWZmZWN0aXZlQXBwZWFyYW5jZTogXCJtYWM6QXBwbGljYXRpb25EaWRDaGFuZ2VFZmZlY3RpdmVBcHBlYXJhbmNlXCIsXG5cdFx0QXBwbGljYXRpb25EaWRDaGFuZ2VJY29uOiBcIm1hYzpBcHBsaWNhdGlvbkRpZENoYW5nZUljb25cIixcblx0XHRBcHBsaWNhdGlvbkRpZENoYW5nZU9jY2x1c2lvblN0YXRlOiBcIm1hYzpBcHBsaWNhdGlvbkRpZENoYW5nZU9jY2x1c2lvblN0YXRlXCIsXG5cdFx0QXBwbGljYXRpb25EaWRDaGFuZ2VTY3JlZW5QYXJhbWV0ZXJzOiBcIm1hYzpBcHBsaWNhdGlvbkRpZENoYW5nZVNjcmVlblBhcmFtZXRlcnNcIixcblx0XHRBcHBsaWNhdGlvbkRpZENoYW5nZVN0YXR1c0JhckZyYW1lOiBcIm1hYzpBcHBsaWNhdGlvbkRpZENoYW5nZVN0YXR1c0JhckZyYW1lXCIsXG5cdFx0QXBwbGljYXRpb25EaWRDaGFuZ2VTdGF0dXNCYXJPcmllbnRhdGlvbjogXCJtYWM6QXBwbGljYXRpb25EaWRDaGFuZ2VTdGF0dXNCYXJPcmllbnRhdGlvblwiLFxuXHRcdEFwcGxpY2F0aW9uRGlkQ2hhbmdlVGhlbWU6IFwibWFjOkFwcGxpY2F0aW9uRGlkQ2hhbmdlVGhlbWVcIixcblx0XHRBcHBsaWNhdGlvbkRpZEZpbmlzaExhdW5jaGluZzogXCJtYWM6QXBwbGljYXRpb25EaWRGaW5pc2hMYXVuY2hpbmdcIixcblx0XHRBcHBsaWNhdGlvbkRpZEhpZGU6IFwibWFjOkFwcGxpY2F0aW9uRGlkSGlkZVwiLFxuXHRcdEFwcGxpY2F0aW9uRGlkUmVzaWduQWN0aXZlOiBcIm1hYzpBcHBsaWNhdGlvbkRpZFJlc2lnbkFjdGl2ZVwiLFxuXHRcdEFwcGxpY2F0aW9uRGlkVW5oaWRlOiBcIm1hYzpBcHBsaWNhdGlvbkRpZFVuaGlkZVwiLFxuXHRcdEFwcGxpY2F0aW9uRGlkVXBkYXRlOiBcIm1hYzpBcHBsaWNhdGlvbkRpZFVwZGF0ZVwiLFxuXHRcdEFwcGxpY2F0aW9uU2hvdWxkSGFuZGxlUmVvcGVuOiBcIm1hYzpBcHBsaWNhdGlvblNob3VsZEhhbmRsZVJlb3BlblwiLFxuXHRcdEFwcGxpY2F0aW9uV2lsbEJlY29tZUFjdGl2ZTogXCJtYWM6QXBwbGljYXRpb25XaWxsQmVjb21lQWN0aXZlXCIsXG5cdFx0QXBwbGljYXRpb25XaWxsRmluaXNoTGF1bmNoaW5nOiBcIm1hYzpBcHBsaWNhdGlvbldpbGxGaW5pc2hMYXVuY2hpbmdcIixcblx0XHRBcHBsaWNhdGlvbldpbGxIaWRlOiBcIm1hYzpBcHBsaWNhdGlvbldpbGxIaWRlXCIsXG5cdFx0QXBwbGljYXRpb25XaWxsUmVzaWduQWN0aXZlOiBcIm1hYzpBcHBsaWNhdGlvbldpbGxSZXNpZ25BY3RpdmVcIixcblx0XHRBcHBsaWNhdGlvbldpbGxUZXJtaW5hdGU6IFwibWFjOkFwcGxpY2F0aW9uV2lsbFRlcm1pbmF0ZVwiLFxuXHRcdEFwcGxpY2F0aW9uV2lsbFVuaGlkZTogXCJtYWM6QXBwbGljYXRpb25XaWxsVW5oaWRlXCIsXG5cdFx0QXBwbGljYXRpb25XaWxsVXBkYXRlOiBcIm1hYzpBcHBsaWNhdGlvbldpbGxVcGRhdGVcIixcblx0XHRNZW51RGlkQWRkSXRlbTogXCJtYWM6TWVudURpZEFkZEl0ZW1cIixcblx0XHRNZW51RGlkQmVnaW5UcmFja2luZzogXCJtYWM6TWVudURpZEJlZ2luVHJhY2tpbmdcIixcblx0XHRNZW51RGlkQ2xvc2U6IFwibWFjOk1lbnVEaWRDbG9zZVwiLFxuXHRcdE1lbnVEaWREaXNwbGF5SXRlbTogXCJtYWM6TWVudURpZERpc3BsYXlJdGVtXCIsXG5cdFx0TWVudURpZEVuZFRyYWNraW5nOiBcIm1hYzpNZW51RGlkRW5kVHJhY2tpbmdcIixcblx0XHRNZW51RGlkSGlnaGxpZ2h0SXRlbTogXCJtYWM6TWVudURpZEhpZ2hsaWdodEl0ZW1cIixcblx0XHRNZW51RGlkT3BlbjogXCJtYWM6TWVudURpZE9wZW5cIixcblx0XHRNZW51RGlkUG9wVXA6IFwibWFjOk1lbnVEaWRQb3BVcFwiLFxuXHRcdE1lbnVEaWRSZW1vdmVJdGVtOiBcIm1hYzpNZW51RGlkUmVtb3ZlSXRlbVwiLFxuXHRcdE1lbnVEaWRTZW5kQWN0aW9uOiBcIm1hYzpNZW51RGlkU2VuZEFjdGlvblwiLFxuXHRcdE1lbnVEaWRTZW5kQWN0aW9uVG9JdGVtOiBcIm1hYzpNZW51RGlkU2VuZEFjdGlvblRvSXRlbVwiLFxuXHRcdE1lbnVEaWRVcGRhdGU6IFwibWFjOk1lbnVEaWRVcGRhdGVcIixcblx0XHRNZW51V2lsbEFkZEl0ZW06IFwibWFjOk1lbnVXaWxsQWRkSXRlbVwiLFxuXHRcdE1lbnVXaWxsQmVnaW5UcmFja2luZzogXCJtYWM6TWVudVdpbGxCZWdpblRyYWNraW5nXCIsXG5cdFx0TWVudVdpbGxEaXNwbGF5SXRlbTogXCJtYWM6TWVudVdpbGxEaXNwbGF5SXRlbVwiLFxuXHRcdE1lbnVXaWxsRW5kVHJhY2tpbmc6IFwibWFjOk1lbnVXaWxsRW5kVHJhY2tpbmdcIixcblx0XHRNZW51V2lsbEhpZ2hsaWdodEl0ZW06IFwibWFjOk1lbnVXaWxsSGlnaGxpZ2h0SXRlbVwiLFxuXHRcdE1lbnVXaWxsT3BlbjogXCJtYWM6TWVudVdpbGxPcGVuXCIsXG5cdFx0TWVudVdpbGxQb3BVcDogXCJtYWM6TWVudVdpbGxQb3BVcFwiLFxuXHRcdE1lbnVXaWxsUmVtb3ZlSXRlbTogXCJtYWM6TWVudVdpbGxSZW1vdmVJdGVtXCIsXG5cdFx0TWVudVdpbGxTZW5kQWN0aW9uOiBcIm1hYzpNZW51V2lsbFNlbmRBY3Rpb25cIixcblx0XHRNZW51V2lsbFNlbmRBY3Rpb25Ub0l0ZW06IFwibWFjOk1lbnVXaWxsU2VuZEFjdGlvblRvSXRlbVwiLFxuXHRcdE1lbnVXaWxsVXBkYXRlOiBcIm1hYzpNZW51V2lsbFVwZGF0ZVwiLFxuXHRcdFdlYlZpZXdEaWRDb21taXROYXZpZ2F0aW9uOiBcIm1hYzpXZWJWaWV3RGlkQ29tbWl0TmF2aWdhdGlvblwiLFxuXHRcdFdlYlZpZXdEaWRGaW5pc2hOYXZpZ2F0aW9uOiBcIm1hYzpXZWJWaWV3RGlkRmluaXNoTmF2aWdhdGlvblwiLFxuXHRcdFdlYlZpZXdEaWRSZWNlaXZlU2VydmVyUmVkaXJlY3RGb3JQcm92aXNpb25hbE5hdmlnYXRpb246IFwibWFjOldlYlZpZXdEaWRSZWNlaXZlU2VydmVyUmVkaXJlY3RGb3JQcm92aXNpb25hbE5hdmlnYXRpb25cIixcblx0XHRXZWJWaWV3RGlkU3RhcnRQcm92aXNpb25hbE5hdmlnYXRpb246IFwibWFjOldlYlZpZXdEaWRTdGFydFByb3Zpc2lvbmFsTmF2aWdhdGlvblwiLFxuXHRcdFdpbmRvd0RpZEJlY29tZUtleTogXCJtYWM6V2luZG93RGlkQmVjb21lS2V5XCIsXG5cdFx0V2luZG93RGlkQmVjb21lTWFpbjogXCJtYWM6V2luZG93RGlkQmVjb21lTWFpblwiLFxuXHRcdFdpbmRvd0RpZEJlZ2luU2hlZXQ6IFwibWFjOldpbmRvd0RpZEJlZ2luU2hlZXRcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VBbHBoYTogXCJtYWM6V2luZG93RGlkQ2hhbmdlQWxwaGFcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VCYWNraW5nTG9jYXRpb246IFwibWFjOldpbmRvd0RpZENoYW5nZUJhY2tpbmdMb2NhdGlvblwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZUJhY2tpbmdQcm9wZXJ0aWVzOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VCYWNraW5nUHJvcGVydGllc1wiLFxuXHRcdFdpbmRvd0RpZENoYW5nZUNvbGxlY3Rpb25CZWhhdmlvcjogXCJtYWM6V2luZG93RGlkQ2hhbmdlQ29sbGVjdGlvbkJlaGF2aW9yXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlRWZmZWN0aXZlQXBwZWFyYW5jZTogXCJtYWM6V2luZG93RGlkQ2hhbmdlRWZmZWN0aXZlQXBwZWFyYW5jZVwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZU9jY2x1c2lvblN0YXRlOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VPY2NsdXNpb25TdGF0ZVwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZU9yZGVyaW5nTW9kZTogXCJtYWM6V2luZG93RGlkQ2hhbmdlT3JkZXJpbmdNb2RlXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlU2NyZWVuOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VTY3JlZW5cIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VTY3JlZW5QYXJhbWV0ZXJzOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VTY3JlZW5QYXJhbWV0ZXJzXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlU2NyZWVuUHJvZmlsZTogXCJtYWM6V2luZG93RGlkQ2hhbmdlU2NyZWVuUHJvZmlsZVwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZVNjcmVlblNwYWNlOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VTY3JlZW5TcGFjZVwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZVNjcmVlblNwYWNlUHJvcGVydGllczogXCJtYWM6V2luZG93RGlkQ2hhbmdlU2NyZWVuU3BhY2VQcm9wZXJ0aWVzXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlU2hhcmluZ1R5cGU6IFwibWFjOldpbmRvd0RpZENoYW5nZVNoYXJpbmdUeXBlXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlU3BhY2U6IFwibWFjOldpbmRvd0RpZENoYW5nZVNwYWNlXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlU3BhY2VPcmRlcmluZ01vZGU6IFwibWFjOldpbmRvd0RpZENoYW5nZVNwYWNlT3JkZXJpbmdNb2RlXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlVGl0bGU6IFwibWFjOldpbmRvd0RpZENoYW5nZVRpdGxlXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlVG9vbGJhcjogXCJtYWM6V2luZG93RGlkQ2hhbmdlVG9vbGJhclwiLFxuXHRcdFdpbmRvd0RpZERlbWluaWF0dXJpemU6IFwibWFjOldpbmRvd0RpZERlbWluaWF0dXJpemVcIixcblx0XHRXaW5kb3dEaWRFbmRTaGVldDogXCJtYWM6V2luZG93RGlkRW5kU2hlZXRcIixcblx0XHRXaW5kb3dEaWRFbnRlckZ1bGxTY3JlZW46IFwibWFjOldpbmRvd0RpZEVudGVyRnVsbFNjcmVlblwiLFxuXHRcdFdpbmRvd0RpZEVudGVyVmVyc2lvbkJyb3dzZXI6IFwibWFjOldpbmRvd0RpZEVudGVyVmVyc2lvbkJyb3dzZXJcIixcblx0XHRXaW5kb3dEaWRFeGl0RnVsbFNjcmVlbjogXCJtYWM6V2luZG93RGlkRXhpdEZ1bGxTY3JlZW5cIixcblx0XHRXaW5kb3dEaWRFeGl0VmVyc2lvbkJyb3dzZXI6IFwibWFjOldpbmRvd0RpZEV4aXRWZXJzaW9uQnJvd3NlclwiLFxuXHRcdFdpbmRvd0RpZEV4cG9zZTogXCJtYWM6V2luZG93RGlkRXhwb3NlXCIsXG5cdFx0V2luZG93RGlkRm9jdXM6IFwibWFjOldpbmRvd0RpZEZvY3VzXCIsXG5cdFx0V2luZG93RGlkTWluaWF0dXJpemU6IFwibWFjOldpbmRvd0RpZE1pbmlhdHVyaXplXCIsXG5cdFx0V2luZG93RGlkTW92ZTogXCJtYWM6V2luZG93RGlkTW92ZVwiLFxuXHRcdFdpbmRvd0RpZE9yZGVyT2ZmU2NyZWVuOiBcIm1hYzpXaW5kb3dEaWRPcmRlck9mZlNjcmVlblwiLFxuXHRcdFdpbmRvd0RpZE9yZGVyT25TY3JlZW46IFwibWFjOldpbmRvd0RpZE9yZGVyT25TY3JlZW5cIixcblx0XHRXaW5kb3dEaWRSZXNpZ25LZXk6IFwibWFjOldpbmRvd0RpZFJlc2lnbktleVwiLFxuXHRcdFdpbmRvd0RpZFJlc2lnbk1haW46IFwibWFjOldpbmRvd0RpZFJlc2lnbk1haW5cIixcblx0XHRXaW5kb3dEaWRSZXNpemU6IFwibWFjOldpbmRvd0RpZFJlc2l6ZVwiLFxuXHRcdFdpbmRvd0RpZFVwZGF0ZTogXCJtYWM6V2luZG93RGlkVXBkYXRlXCIsXG5cdFx0V2luZG93RGlkVXBkYXRlQWxwaGE6IFwibWFjOldpbmRvd0RpZFVwZGF0ZUFscGhhXCIsXG5cdFx0V2luZG93RGlkVXBkYXRlQ29sbGVjdGlvbkJlaGF2aW9yOiBcIm1hYzpXaW5kb3dEaWRVcGRhdGVDb2xsZWN0aW9uQmVoYXZpb3JcIixcblx0XHRXaW5kb3dEaWRVcGRhdGVDb2xsZWN0aW9uUHJvcGVydGllczogXCJtYWM6V2luZG93RGlkVXBkYXRlQ29sbGVjdGlvblByb3BlcnRpZXNcIixcblx0XHRXaW5kb3dEaWRVcGRhdGVTaGFkb3c6IFwibWFjOldpbmRvd0RpZFVwZGF0ZVNoYWRvd1wiLFxuXHRcdFdpbmRvd0RpZFVwZGF0ZVRpdGxlOiBcIm1hYzpXaW5kb3dEaWRVcGRhdGVUaXRsZVwiLFxuXHRcdFdpbmRvd0RpZFVwZGF0ZVRvb2xiYXI6IFwibWFjOldpbmRvd0RpZFVwZGF0ZVRvb2xiYXJcIixcblx0XHRXaW5kb3dEaWRab29tOiBcIm1hYzpXaW5kb3dEaWRab29tXCIsXG5cdFx0V2luZG93RmlsZURyYWdnaW5nRW50ZXJlZDogXCJtYWM6V2luZG93RmlsZURyYWdnaW5nRW50ZXJlZFwiLFxuXHRcdFdpbmRvd0ZpbGVEcmFnZ2luZ0V4aXRlZDogXCJtYWM6V2luZG93RmlsZURyYWdnaW5nRXhpdGVkXCIsXG5cdFx0V2luZG93RmlsZURyYWdnaW5nUGVyZm9ybWVkOiBcIm1hYzpXaW5kb3dGaWxlRHJhZ2dpbmdQZXJmb3JtZWRcIixcblx0XHRXaW5kb3dIaWRlOiBcIm1hYzpXaW5kb3dIaWRlXCIsXG5cdFx0V2luZG93TWF4aW1pc2U6IFwibWFjOldpbmRvd01heGltaXNlXCIsXG5cdFx0V2luZG93VW5NYXhpbWlzZTogXCJtYWM6V2luZG93VW5NYXhpbWlzZVwiLFxuXHRcdFdpbmRvd01pbmltaXNlOiBcIm1hYzpXaW5kb3dNaW5pbWlzZVwiLFxuXHRcdFdpbmRvd1VuTWluaW1pc2U6IFwibWFjOldpbmRvd1VuTWluaW1pc2VcIixcblx0XHRXaW5kb3dTaG91bGRDbG9zZTogXCJtYWM6V2luZG93U2hvdWxkQ2xvc2VcIixcblx0XHRXaW5kb3dTaG93OiBcIm1hYzpXaW5kb3dTaG93XCIsXG5cdFx0V2luZG93V2lsbEJlY29tZUtleTogXCJtYWM6V2luZG93V2lsbEJlY29tZUtleVwiLFxuXHRcdFdpbmRvd1dpbGxCZWNvbWVNYWluOiBcIm1hYzpXaW5kb3dXaWxsQmVjb21lTWFpblwiLFxuXHRcdFdpbmRvd1dpbGxCZWdpblNoZWV0OiBcIm1hYzpXaW5kb3dXaWxsQmVnaW5TaGVldFwiLFxuXHRcdFdpbmRvd1dpbGxDaGFuZ2VPcmRlcmluZ01vZGU6IFwibWFjOldpbmRvd1dpbGxDaGFuZ2VPcmRlcmluZ01vZGVcIixcblx0XHRXaW5kb3dXaWxsQ2xvc2U6IFwibWFjOldpbmRvd1dpbGxDbG9zZVwiLFxuXHRcdFdpbmRvd1dpbGxEZW1pbmlhdHVyaXplOiBcIm1hYzpXaW5kb3dXaWxsRGVtaW5pYXR1cml6ZVwiLFxuXHRcdFdpbmRvd1dpbGxFbnRlckZ1bGxTY3JlZW46IFwibWFjOldpbmRvd1dpbGxFbnRlckZ1bGxTY3JlZW5cIixcblx0XHRXaW5kb3dXaWxsRW50ZXJWZXJzaW9uQnJvd3NlcjogXCJtYWM6V2luZG93V2lsbEVudGVyVmVyc2lvbkJyb3dzZXJcIixcblx0XHRXaW5kb3dXaWxsRXhpdEZ1bGxTY3JlZW46IFwibWFjOldpbmRvd1dpbGxFeGl0RnVsbFNjcmVlblwiLFxuXHRcdFdpbmRvd1dpbGxFeGl0VmVyc2lvbkJyb3dzZXI6IFwibWFjOldpbmRvd1dpbGxFeGl0VmVyc2lvbkJyb3dzZXJcIixcblx0XHRXaW5kb3dXaWxsRm9jdXM6IFwibWFjOldpbmRvd1dpbGxGb2N1c1wiLFxuXHRcdFdpbmRvd1dpbGxNaW5pYXR1cml6ZTogXCJtYWM6V2luZG93V2lsbE1pbmlhdHVyaXplXCIsXG5cdFx0V2luZG93V2lsbE1vdmU6IFwibWFjOldpbmRvd1dpbGxNb3ZlXCIsXG5cdFx0V2luZG93V2lsbE9yZGVyT2ZmU2NyZWVuOiBcIm1hYzpXaW5kb3dXaWxsT3JkZXJPZmZTY3JlZW5cIixcblx0XHRXaW5kb3dXaWxsT3JkZXJPblNjcmVlbjogXCJtYWM6V2luZG93V2lsbE9yZGVyT25TY3JlZW5cIixcblx0XHRXaW5kb3dXaWxsUmVzaWduTWFpbjogXCJtYWM6V2luZG93V2lsbFJlc2lnbk1haW5cIixcblx0XHRXaW5kb3dXaWxsUmVzaXplOiBcIm1hYzpXaW5kb3dXaWxsUmVzaXplXCIsXG5cdFx0V2luZG93V2lsbFVuZm9jdXM6IFwibWFjOldpbmRvd1dpbGxVbmZvY3VzXCIsXG5cdFx0V2luZG93V2lsbFVwZGF0ZTogXCJtYWM6V2luZG93V2lsbFVwZGF0ZVwiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGVBbHBoYTogXCJtYWM6V2luZG93V2lsbFVwZGF0ZUFscGhhXCIsXG5cdFx0V2luZG93V2lsbFVwZGF0ZUNvbGxlY3Rpb25CZWhhdmlvcjogXCJtYWM6V2luZG93V2lsbFVwZGF0ZUNvbGxlY3Rpb25CZWhhdmlvclwiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGVDb2xsZWN0aW9uUHJvcGVydGllczogXCJtYWM6V2luZG93V2lsbFVwZGF0ZUNvbGxlY3Rpb25Qcm9wZXJ0aWVzXCIsXG5cdFx0V2luZG93V2lsbFVwZGF0ZVNoYWRvdzogXCJtYWM6V2luZG93V2lsbFVwZGF0ZVNoYWRvd1wiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGVUaXRsZTogXCJtYWM6V2luZG93V2lsbFVwZGF0ZVRpdGxlXCIsXG5cdFx0V2luZG93V2lsbFVwZGF0ZVRvb2xiYXI6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVUb29sYmFyXCIsXG5cdFx0V2luZG93V2lsbFVwZGF0ZVZpc2liaWxpdHk6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVWaXNpYmlsaXR5XCIsXG5cdFx0V2luZG93V2lsbFVzZVN0YW5kYXJkRnJhbWU6IFwibWFjOldpbmRvd1dpbGxVc2VTdGFuZGFyZEZyYW1lXCIsXG5cdFx0V2luZG93Wm9vbUluOiBcIm1hYzpXaW5kb3dab29tSW5cIixcblx0XHRXaW5kb3dab29tT3V0OiBcIm1hYzpXaW5kb3dab29tT3V0XCIsXG5cdFx0V2luZG93Wm9vbVJlc2V0OiBcIm1hYzpXaW5kb3dab29tUmVzZXRcIixcblx0fSxcblx0TGludXg6IHtcblx0XHRBcHBsaWNhdGlvblN0YXJ0dXA6IFwibGludXg6QXBwbGljYXRpb25TdGFydHVwXCIsXG5cdFx0U3lzdGVtVGhlbWVDaGFuZ2VkOiBcImxpbnV4OlN5c3RlbVRoZW1lQ2hhbmdlZFwiLFxuXHRcdFdpbmRvd0RlbGV0ZUV2ZW50OiBcImxpbnV4OldpbmRvd0RlbGV0ZUV2ZW50XCIsXG5cdFx0V2luZG93RGlkTW92ZTogXCJsaW51eDpXaW5kb3dEaWRNb3ZlXCIsXG5cdFx0V2luZG93RGlkUmVzaXplOiBcImxpbnV4OldpbmRvd0RpZFJlc2l6ZVwiLFxuXHRcdFdpbmRvd0ZvY3VzSW46IFwibGludXg6V2luZG93Rm9jdXNJblwiLFxuXHRcdFdpbmRvd0ZvY3VzT3V0OiBcImxpbnV4OldpbmRvd0ZvY3VzT3V0XCIsXG5cdFx0V2luZG93TG9hZENoYW5nZWQ6IFwibGludXg6V2luZG93TG9hZENoYW5nZWRcIixcblx0fSxcblx0Q29tbW9uOiB7XG5cdFx0QXBwbGljYXRpb25PcGVuZWRXaXRoRmlsZTogXCJjb21tb246QXBwbGljYXRpb25PcGVuZWRXaXRoRmlsZVwiLFxuXHRcdEFwcGxpY2F0aW9uU3RhcnRlZDogXCJjb21tb246QXBwbGljYXRpb25TdGFydGVkXCIsXG5cdFx0VGhlbWVDaGFuZ2VkOiBcImNvbW1vbjpUaGVtZUNoYW5nZWRcIixcblx0XHRXaW5kb3dDbG9zaW5nOiBcImNvbW1vbjpXaW5kb3dDbG9zaW5nXCIsXG5cdFx0V2luZG93RGlkTW92ZTogXCJjb21tb246V2luZG93RGlkTW92ZVwiLFxuXHRcdFdpbmRvd0RpZFJlc2l6ZTogXCJjb21tb246V2luZG93RGlkUmVzaXplXCIsXG5cdFx0V2luZG93RFBJQ2hhbmdlZDogXCJjb21tb246V2luZG93RFBJQ2hhbmdlZFwiLFxuXHRcdFdpbmRvd0ZpbGVzRHJvcHBlZDogXCJjb21tb246V2luZG93RmlsZXNEcm9wcGVkXCIsXG5cdFx0V2luZG93Rm9jdXM6IFwiY29tbW9uOldpbmRvd0ZvY3VzXCIsXG5cdFx0V2luZG93RnVsbHNjcmVlbjogXCJjb21tb246V2luZG93RnVsbHNjcmVlblwiLFxuXHRcdFdpbmRvd0hpZGU6IFwiY29tbW9uOldpbmRvd0hpZGVcIixcblx0XHRXaW5kb3dMb3N0Rm9jdXM6IFwiY29tbW9uOldpbmRvd0xvc3RGb2N1c1wiLFxuXHRcdFdpbmRvd01heGltaXNlOiBcImNvbW1vbjpXaW5kb3dNYXhpbWlzZVwiLFxuXHRcdFdpbmRvd01pbmltaXNlOiBcImNvbW1vbjpXaW5kb3dNaW5pbWlzZVwiLFxuXHRcdFdpbmRvd1Jlc3RvcmU6IFwiY29tbW9uOldpbmRvd1Jlc3RvcmVcIixcblx0XHRXaW5kb3dSdW50aW1lUmVhZHk6IFwiY29tbW9uOldpbmRvd1J1bnRpbWVSZWFkeVwiLFxuXHRcdFdpbmRvd1Nob3c6IFwiY29tbW9uOldpbmRvd1Nob3dcIixcblx0XHRXaW5kb3dVbkZ1bGxzY3JlZW46IFwiY29tbW9uOldpbmRvd1VuRnVsbHNjcmVlblwiLFxuXHRcdFdpbmRvd1VuTWF4aW1pc2U6IFwiY29tbW9uOldpbmRvd1VuTWF4aW1pc2VcIixcblx0XHRXaW5kb3dVbk1pbmltaXNlOiBcImNvbW1vbjpXaW5kb3dVbk1pbmltaXNlXCIsXG5cdFx0V2luZG93Wm9vbTogXCJjb21tb246V2luZG93Wm9vbVwiLFxuXHRcdFdpbmRvd1pvb21JbjogXCJjb21tb246V2luZG93Wm9vbUluXCIsXG5cdFx0V2luZG93Wm9vbU91dDogXCJjb21tb246V2luZG93Wm9vbU91dFwiLFxuXHRcdFdpbmRvd1pvb21SZXNldDogXCJjb21tb246V2luZG93Wm9vbVJlc2V0XCIsXG5cdH0sXG59O1xuIiwgIi8qXG4gXyAgICAgX18gICAgIF8gX19cbnwgfCAgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vKipcbiAqIExvZ3MgYSBtZXNzYWdlIHRvIHRoZSBjb25zb2xlIHdpdGggY3VzdG9tIGZvcm1hdHRpbmcuXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSAtIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAqIEByZXR1cm4ge3ZvaWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWJ1Z0xvZyhtZXNzYWdlKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgY29uc29sZS5sb2coXG4gICAgICAgICclYyB3YWlsczMgJWMgJyArIG1lc3NhZ2UgKyAnICcsXG4gICAgICAgICdiYWNrZ3JvdW5kOiAjYWEwMDAwOyBjb2xvcjogI2ZmZjsgYm9yZGVyLXJhZGl1czogM3B4IDBweCAwcHggM3B4OyBwYWRkaW5nOiAxcHg7IGZvbnQtc2l6ZTogMC43cmVtJyxcbiAgICAgICAgJ2JhY2tncm91bmQ6ICMwMDk5MDA7IGNvbG9yOiAjZmZmOyBib3JkZXItcmFkaXVzOiAwcHggM3B4IDNweCAwcHg7IHBhZGRpbmc6IDFweDsgZm9udC1zaXplOiAwLjdyZW0nXG4gICAgKTtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciB0aGUgYnJvd3NlciBzdXBwb3J0cyByZW1vdmluZyBsaXN0ZW5lcnMgYnkgdHJpZ2dlcmluZyBhbiBBYm9ydFNpZ25hbFxuICogKHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRXZlbnRUYXJnZXQvYWRkRXZlbnRMaXN0ZW5lciNzaWduYWwpXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbkFib3J0TGlzdGVuZXJzKCkge1xuICAgIGlmICghRXZlbnRUYXJnZXQgfHwgIUFib3J0U2lnbmFsIHx8ICFBYm9ydENvbnRyb2xsZXIpXG4gICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIGxldCByZXN1bHQgPSB0cnVlO1xuXG4gICAgY29uc3QgdGFyZ2V0ID0gbmV3IEV2ZW50VGFyZ2V0KCk7XG4gICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigndGVzdCcsICgpID0+IHsgcmVzdWx0ID0gZmFsc2U7IH0sIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9KTtcbiAgICBjb250cm9sbGVyLmFib3J0KCk7XG4gICAgdGFyZ2V0LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCd0ZXN0JykpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqKlxuIFRoaXMgdGVjaG5pcXVlIGZvciBwcm9wZXIgbG9hZCBkZXRlY3Rpb24gaXMgdGFrZW4gZnJvbSBIVE1YOlxuXG4gQlNEIDItQ2xhdXNlIExpY2Vuc2VcblxuIENvcHlyaWdodCAoYykgMjAyMCwgQmlnIFNreSBTb2Z0d2FyZVxuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cbiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcblxuIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuXG4gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb25cbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cblxuIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4gQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEVcbiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTFxuIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SXG4gU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVJcbiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLFxuIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFXG4gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cblxuICoqKi9cblxubGV0IGlzUmVhZHkgPSBmYWxzZTtcbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiBpc1JlYWR5ID0gdHJ1ZSk7XG5cbmV4cG9ydCBmdW5jdGlvbiB3aGVuUmVhZHkoY2FsbGJhY2spIHtcbiAgICBpZiAoaXNSZWFkeSB8fCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnKSB7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGNhbGxiYWNrKTtcbiAgICB9XG59XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbi8qIGpzaGludCBlc3ZlcnNpb246IDkgKi9cblxuLy8gSW1wb3J0IHNjcmVlbiBqc2RvYyBkZWZpbml0aW9uIGZyb20gLi9zY3JlZW5zLmpzXG4vKipcbiAqIEB0eXBlZGVmIHtpbXBvcnQoXCIuL3NjcmVlbnNcIikuU2NyZWVufSBTY3JlZW5cbiAqL1xuXG5cbi8qKlxuICogQSByZWNvcmQgZGVzY3JpYmluZyB0aGUgcG9zaXRpb24gb2YgYSB3aW5kb3cuXG4gKlxuICogQHR5cGVkZWYge09iamVjdH0gUG9zaXRpb25cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB4IC0gVGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhlIHdpbmRvd1xuICogQHByb3BlcnR5IHtudW1iZXJ9IHkgLSBUaGUgdmVydGljYWwgcG9zaXRpb24gb2YgdGhlIHdpbmRvd1xuICovXG5cblxuLyoqXG4gKiBBIHJlY29yZCBkZXNjcmliaW5nIHRoZSBzaXplIG9mIGEgd2luZG93LlxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFNpemVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgd2luZG93XG4gKiBAcHJvcGVydHkge251bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgd2luZG93XG4gKi9cblxuXG5pbXBvcnQge25ld1J1bnRpbWVDYWxsZXJXaXRoSUQsIG9iamVjdE5hbWVzfSBmcm9tIFwiLi9ydW50aW1lXCI7XG5cbmNvbnN0IFBvc2l0aW9uTWV0aG9kICAgICAgICAgICAgICAgICAgICA9IDA7XG5jb25zdCBDZW50ZXJNZXRob2QgICAgICAgICAgICAgICAgICAgICAgPSAxO1xuY29uc3QgQ2xvc2VNZXRob2QgICAgICAgICAgICAgICAgICAgICAgID0gMjtcbmNvbnN0IERpc2FibGVTaXplQ29uc3RyYWludHNNZXRob2QgICAgICA9IDM7XG5jb25zdCBFbmFibGVTaXplQ29uc3RyYWludHNNZXRob2QgICAgICAgPSA0O1xuY29uc3QgRm9jdXNNZXRob2QgICAgICAgICAgICAgICAgICAgICAgID0gNTtcbmNvbnN0IEZvcmNlUmVsb2FkTWV0aG9kICAgICAgICAgICAgICAgICA9IDY7XG5jb25zdCBGdWxsc2NyZWVuTWV0aG9kICAgICAgICAgICAgICAgICAgPSA3O1xuY29uc3QgR2V0U2NyZWVuTWV0aG9kICAgICAgICAgICAgICAgICAgID0gODtcbmNvbnN0IEdldFpvb21NZXRob2QgICAgICAgICAgICAgICAgICAgICA9IDk7XG5jb25zdCBIZWlnaHRNZXRob2QgICAgICAgICAgICAgICAgICAgICAgPSAxMDtcbmNvbnN0IEhpZGVNZXRob2QgICAgICAgICAgICAgICAgICAgICAgICA9IDExO1xuY29uc3QgSXNGb2N1c2VkTWV0aG9kICAgICAgICAgICAgICAgICAgID0gMTI7XG5jb25zdCBJc0Z1bGxzY3JlZW5NZXRob2QgICAgICAgICAgICAgICAgPSAxMztcbmNvbnN0IElzTWF4aW1pc2VkTWV0aG9kICAgICAgICAgICAgICAgICA9IDE0O1xuY29uc3QgSXNNaW5pbWlzZWRNZXRob2QgICAgICAgICAgICAgICAgID0gMTU7XG5jb25zdCBNYXhpbWlzZU1ldGhvZCAgICAgICAgICAgICAgICAgICAgPSAxNjtcbmNvbnN0IE1pbmltaXNlTWV0aG9kICAgICAgICAgICAgICAgICAgICA9IDE3O1xuY29uc3QgTmFtZU1ldGhvZCAgICAgICAgICAgICAgICAgICAgICAgID0gMTg7XG5jb25zdCBPcGVuRGV2VG9vbHNNZXRob2QgICAgICAgICAgICAgICAgPSAxOTtcbmNvbnN0IFJlbGF0aXZlUG9zaXRpb25NZXRob2QgICAgICAgICAgICA9IDIwO1xuY29uc3QgUmVsb2FkTWV0aG9kICAgICAgICAgICAgICAgICAgICAgID0gMjE7XG5jb25zdCBSZXNpemFibGVNZXRob2QgICAgICAgICAgICAgICAgICAgPSAyMjtcbmNvbnN0IFJlc3RvcmVNZXRob2QgICAgICAgICAgICAgICAgICAgICA9IDIzO1xuY29uc3QgU2V0UG9zaXRpb25NZXRob2QgICAgICAgICAgICAgICAgID0gMjQ7XG5jb25zdCBTZXRBbHdheXNPblRvcE1ldGhvZCAgICAgICAgICAgICAgPSAyNTtcbmNvbnN0IFNldEJhY2tncm91bmRDb2xvdXJNZXRob2QgICAgICAgICA9IDI2O1xuY29uc3QgU2V0RnJhbWVsZXNzTWV0aG9kICAgICAgICAgICAgICAgID0gMjc7XG5jb25zdCBTZXRGdWxsc2NyZWVuQnV0dG9uRW5hYmxlZE1ldGhvZCAgPSAyODtcbmNvbnN0IFNldE1heFNpemVNZXRob2QgICAgICAgICAgICAgICAgICA9IDI5O1xuY29uc3QgU2V0TWluU2l6ZU1ldGhvZCAgICAgICAgICAgICAgICAgID0gMzA7XG5jb25zdCBTZXRSZWxhdGl2ZVBvc2l0aW9uTWV0aG9kICAgICAgICAgPSAzMTtcbmNvbnN0IFNldFJlc2l6YWJsZU1ldGhvZCAgICAgICAgICAgICAgICA9IDMyO1xuY29uc3QgU2V0U2l6ZU1ldGhvZCAgICAgICAgICAgICAgICAgICAgID0gMzM7XG5jb25zdCBTZXRUaXRsZU1ldGhvZCAgICAgICAgICAgICAgICAgICAgPSAzNDtcbmNvbnN0IFNldFpvb21NZXRob2QgICAgICAgICAgICAgICAgICAgICA9IDM1O1xuY29uc3QgU2hvd01ldGhvZCAgICAgICAgICAgICAgICAgICAgICAgID0gMzY7XG5jb25zdCBTaXplTWV0aG9kICAgICAgICAgICAgICAgICAgICAgICAgPSAzNztcbmNvbnN0IFRvZ2dsZUZ1bGxzY3JlZW5NZXRob2QgICAgICAgICAgICA9IDM4O1xuY29uc3QgVG9nZ2xlTWF4aW1pc2VNZXRob2QgICAgICAgICAgICAgID0gMzk7XG5jb25zdCBVbkZ1bGxzY3JlZW5NZXRob2QgICAgICAgICAgICAgICAgPSA0MDtcbmNvbnN0IFVuTWF4aW1pc2VNZXRob2QgICAgICAgICAgICAgICAgICA9IDQxO1xuY29uc3QgVW5NaW5pbWlzZU1ldGhvZCAgICAgICAgICAgICAgICAgID0gNDI7XG5jb25zdCBXaWR0aE1ldGhvZCAgICAgICAgICAgICAgICAgICAgICAgPSA0MztcbmNvbnN0IFpvb21NZXRob2QgICAgICAgICAgICAgICAgICAgICAgICA9IDQ0O1xuY29uc3QgWm9vbUluTWV0aG9kICAgICAgICAgICAgICAgICAgICAgID0gNDU7XG5jb25zdCBab29tT3V0TWV0aG9kICAgICAgICAgICAgICAgICAgICAgPSA0NjtcbmNvbnN0IFpvb21SZXNldE1ldGhvZCAgICAgICAgICAgICAgICAgICA9IDQ3O1xuXG4vKipcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IGNhbGxlciA9IFN5bWJvbCgpO1xuXG5leHBvcnQgY2xhc3MgV2luZG93IHtcbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXNlcyBhIHdpbmRvdyBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhcmdldCB3aW5kb3cuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobmFtZSA9ICcnKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAbmFtZSB7QGxpbmsgY2FsbGVyfVxuICAgICAgICAgKiBAdHlwZSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzW2NhbGxlcl0gPSBuZXdSdW50aW1lQ2FsbGVyV2l0aElEKG9iamVjdE5hbWVzLldpbmRvdywgbmFtZSlcblxuICAgICAgICAvLyBiaW5kIGluc3RhbmNlIG1ldGhvZCB0byBtYWtlIHRoZW0gZWFzaWx5IHVzYWJsZSBpbiBldmVudCBoYW5kbGVyc1xuICAgICAgICBmb3IgKGNvbnN0IG1ldGhvZCBvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhXaW5kb3cucHJvdG90eXBlKSkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIG1ldGhvZCAhPT0gXCJjb25zdHJ1Y3RvclwiXG4gICAgICAgICAgICAgICAgJiYgdHlwZW9mIHRoaXNbbWV0aG9kXSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aGlzW21ldGhvZF0gPSB0aGlzW21ldGhvZF0uYmluZCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHNwZWNpZmllZCB3aW5kb3cuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgd2luZG93IHRvIGdldC5cbiAgICAgKiBAcmV0dXJuIHtXaW5kb3d9IC0gVGhlIGNvcnJlc3BvbmRpbmcgd2luZG93IG9iamVjdC5cbiAgICAgKi9cbiAgICBHZXQobmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IFdpbmRvdyhuYW1lKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBhYnNvbHV0ZSBwb3NpdGlvbiBvZiB0aGUgd2luZG93LlxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqIEByZXR1cm4ge1Byb21pc2U8UG9zaXRpb24+fSAtIFRoZSBjdXJyZW50IGFic29sdXRlIHBvc2l0aW9uIG9mIHRoZSB3aW5kb3cuXG4gICAgICovXG4gICAgUG9zaXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlcl0oUG9zaXRpb25NZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENlbnRlcnMgdGhlIHdpbmRvdyBvbiB0aGUgc2NyZWVuLlxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59XG4gICAgICovXG4gICAgQ2VudGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJdKENlbnRlck1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xvc2VzIHRoZSB3aW5kb3cuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAgICAgKi9cbiAgICBDbG9zZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyXShDbG9zZU1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZXMgbWluL21heCBzaXplIGNvbnN0cmFpbnRzLlxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59XG4gICAgICovXG4gICAgRGlzYWJsZVNpemVDb25zdHJhaW50cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyXShEaXNhYmxlU2l6ZUNvbnN0cmFpbnRzTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzIG1pbi9tYXggc2l6ZSBjb25zdHJhaW50cy5cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICAgICAqL1xuICAgIEVuYWJsZVNpemVDb25zdHJhaW50cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyXShFbmFibGVTaXplQ29uc3RyYWludHNNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZvY3VzZXMgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICAgICAqL1xuICAgIEZvY3VzKCkge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJdKEZvY3VzTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JjZXMgdGhlIHdpbmRvdyB0byByZWxvYWQgdGhlIHBhZ2UgYXNzZXRzLlxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59XG4gICAgICovXG4gICAgRm9yY2VSZWxvYWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlcl0oRm9yY2VSZWxvYWRNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERvYy5cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICAgICAqL1xuICAgIEZ1bGxzY3JlZW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlcl0oRnVsbHNjcmVlbk1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc2NyZWVuIHRoYXQgdGhlIHdpbmRvdyBpcyBvbi5cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlPFNjcmVlbj59IC0gVGhlIHNjcmVlbiB0aGUgd2luZG93IGlzIGN1cnJlbnRseSBvblxuICAgICAqL1xuICAgIEdldFNjcmVlbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyXShHZXRTY3JlZW5NZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgem9vbSBsZXZlbCBvZiB0aGUgd2luZG93LlxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqIEByZXR1cm4ge1Byb21pc2U8bnVtYmVyPn0gLSBUaGUgY3VycmVudCB6b29tIGxldmVsXG4gICAgICovXG4gICAgR2V0Wm9vbSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyXShHZXRab29tTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBoZWlnaHQgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlPG51bWJlcj59IC0gVGhlIGN1cnJlbnQgaGVpZ2h0IG9mIHRoZSB3aW5kb3dcbiAgICAgKi9cbiAgICBIZWlnaHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlcl0oSGVpZ2h0TWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIaWRlcyB0aGUgd2luZG93LlxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59XG4gICAgICovXG4gICAgSGlkZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyXShIaWRlTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHdpbmRvdyBpcyBmb2N1c2VkLlxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqIEByZXR1cm4ge1Byb21pc2U8Ym9vbGVhbj59IC0gV2hldGhlciB0aGUgd2luZG93IGlzIGN1cnJlbnRseSBmb2N1c2VkXG4gICAgICovXG4gICAgSXNGb2N1c2VkKCkge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJdKElzRm9jdXNlZE1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB3aW5kb3cgaXMgZnVsbHNjcmVlbi5cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlPGJvb2xlYW4+fSAtIFdoZXRoZXIgdGhlIHdpbmRvdyBpcyBjdXJyZW50bHkgZnVsbHNjcmVlblxuICAgICAqL1xuICAgIElzRnVsbHNjcmVlbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyXShJc0Z1bGxzY3JlZW5NZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgd2luZG93IGlzIG1heGltaXNlZC5cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlPGJvb2xlYW4+fSAtIFdoZXRoZXIgdGhlIHdpbmRvdyBpcyBjdXJyZW50bHkgbWF4aW1pc2VkXG4gICAgICovXG4gICAgSXNNYXhpbWlzZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlcl0oSXNNYXhpbWlzZWRNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgd2luZG93IGlzIG1pbmltaXNlZC5cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlPGJvb2xlYW4+fSAtIFdoZXRoZXIgdGhlIHdpbmRvdyBpcyBjdXJyZW50bHkgbWluaW1pc2VkXG4gICAgICovXG4gICAgSXNNaW5pbWlzZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlcl0oSXNNaW5pbWlzZWRNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1heGltaXNlcyB0aGUgd2luZG93LlxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59XG4gICAgICovXG4gICAgTWF4aW1pc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlcl0oTWF4aW1pc2VNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1pbmltaXNlcyB0aGUgd2luZG93LlxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59XG4gICAgICovXG4gICAgTWluaW1pc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlcl0oTWluaW1pc2VNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZz59IC0gVGhlIG5hbWUgb2YgdGhlIHdpbmRvd1xuICAgICAqL1xuICAgIE5hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlcl0oTmFtZU1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3BlbnMgdGhlIGRldmVsb3BtZW50IHRvb2xzIHBhbmUuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAgICAgKi9cbiAgICBPcGVuRGV2VG9vbHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlcl0oT3BlbkRldlRvb2xzTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSByZWxhdGl2ZSBwb3NpdGlvbiBvZiB0aGUgd2luZG93IHRvIHRoZSBzY3JlZW4uXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQHJldHVybiB7UHJvbWlzZTxQb3NpdGlvbj59IC0gVGhlIGN1cnJlbnQgcmVsYXRpdmUgcG9zaXRpb24gb2YgdGhlIHdpbmRvd1xuICAgICAqL1xuICAgIFJlbGF0aXZlUG9zaXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlcl0oUmVsYXRpdmVQb3NpdGlvbk1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVsb2FkcyB0aGUgcGFnZSBhc3NldHMuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAgICAgKi9cbiAgICBSZWxvYWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlcl0oUmVsb2FkTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHdpbmRvdyBpcyByZXNpemFibGUuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQHJldHVybiB7UHJvbWlzZTxib29sZWFuPn0gLSBXaGV0aGVyIHRoZSB3aW5kb3cgaXMgY3VycmVudGx5IHJlc2l6YWJsZVxuICAgICAqL1xuICAgIFJlc2l6YWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyXShSZXNpemFibGVNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc3RvcmVzIHRoZSB3aW5kb3cgdG8gaXRzIHByZXZpb3VzIHN0YXRlIGlmIGl0IHdhcyBwcmV2aW91c2x5IG1pbmltaXNlZCwgbWF4aW1pc2VkIG9yIGZ1bGxzY3JlZW4uXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAgICAgKi9cbiAgICBSZXN0b3JlKCkge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJdKFJlc3RvcmVNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGFic29sdXRlIHBvc2l0aW9uIG9mIHRoZSB3aW5kb3cuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgZGVzaXJlZCBob3Jpem9udGFsIGFic29sdXRlIHBvc2l0aW9uIG9mIHRoZSB3aW5kb3dcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSBkZXNpcmVkIHZlcnRpY2FsIGFic29sdXRlIHBvc2l0aW9uIG9mIHRoZSB3aW5kb3dcbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICAgICAqL1xuICAgIFNldFBvc2l0aW9uKHgsIHkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyXShTZXRQb3NpdGlvbk1ldGhvZCwgeyB4LCB5IH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHdpbmRvdyB0byBiZSBhbHdheXMgb24gdG9wLlxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gYWx3YXlzT25Ub3AgLSBXaGV0aGVyIHRoZSB3aW5kb3cgc2hvdWxkIHN0YXkgb24gdG9wXG4gICAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAgICAgKi9cbiAgICBTZXRBbHdheXNPblRvcChhbHdheXNPblRvcCkge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJdKFNldEFsd2F5c09uVG9wTWV0aG9kLCB7IGFsd2F5c09uVG9wIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGJhY2tncm91bmQgY29sb3VyIG9mIHRoZSB3aW5kb3cuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHIgLSBUaGUgZGVzaXJlZCByZWQgY29tcG9uZW50IG9mIHRoZSB3aW5kb3cgYmFja2dyb3VuZFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBnIC0gVGhlIGRlc2lyZWQgZ3JlZW4gY29tcG9uZW50IG9mIHRoZSB3aW5kb3cgYmFja2dyb3VuZFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiIC0gVGhlIGRlc2lyZWQgYmx1ZSBjb21wb25lbnQgb2YgdGhlIHdpbmRvdyBiYWNrZ3JvdW5kXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGEgLSBUaGUgZGVzaXJlZCBhbHBoYSBjb21wb25lbnQgb2YgdGhlIHdpbmRvdyBiYWNrZ3JvdW5kXG4gICAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAgICAgKi9cbiAgICBTZXRCYWNrZ3JvdW5kQ29sb3VyKHIsIGcsIGIsIGEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyXShTZXRCYWNrZ3JvdW5kQ29sb3VyTWV0aG9kLCB7IHIsIGcsIGIsIGEgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgd2luZG93IGZyYW1lIGFuZCB0aXRsZSBiYXIuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQHBhcmFtIHtib29sZWFufSBmcmFtZWxlc3MgLSBXaGV0aGVyIHRoZSB3aW5kb3cgc2hvdWxkIGJlIGZyYW1lbGVzc1xuICAgICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59XG4gICAgICovXG4gICAgU2V0RnJhbWVsZXNzKGZyYW1lbGVzcykge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJdKFNldEZyYW1lbGVzc01ldGhvZCwgeyBmcmFtZWxlc3MgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZXMgdGhlIHN5c3RlbSBmdWxsc2NyZWVuIGJ1dHRvbi5cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIHRoZSBmdWxsc2NyZWVuIGJ1dHRvbiBzaG91bGQgYmUgZW5hYmxlZFxuICAgICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59XG4gICAgICovXG4gICAgU2V0RnVsbHNjcmVlbkJ1dHRvbkVuYWJsZWQoZW5hYmxlZCkge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJdKFNldEZ1bGxzY3JlZW5CdXR0b25FbmFibGVkTWV0aG9kLCB7IGVuYWJsZWQgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSB3aW5kb3cuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gVGhlIGRlc2lyZWQgbWF4aW11bSB3aWR0aCBvZiB0aGUgd2luZG93XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIFRoZSBkZXNpcmVkIG1heGltdW0gaGVpZ2h0IG9mIHRoZSB3aW5kb3dcbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICAgICAqL1xuICAgIFNldE1heFNpemUod2lkdGgsIGhlaWdodCkge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJdKFNldE1heFNpemVNZXRob2QsIHsgd2lkdGgsIGhlaWdodCB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBtaW5pbXVtIHNpemUgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBUaGUgZGVzaXJlZCBtaW5pbXVtIHdpZHRoIG9mIHRoZSB3aW5kb3dcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gVGhlIGRlc2lyZWQgbWluaW11bSBoZWlnaHQgb2YgdGhlIHdpbmRvd1xuICAgICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59XG4gICAgICovXG4gICAgU2V0TWluU2l6ZSh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlcl0oU2V0TWluU2l6ZU1ldGhvZCwgeyB3aWR0aCwgaGVpZ2h0IH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHJlbGF0aXZlIHBvc2l0aW9uIG9mIHRoZSB3aW5kb3cgdG8gdGhlIHNjcmVlbi5cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBkZXNpcmVkIGhvcml6b250YWwgcmVsYXRpdmUgcG9zaXRpb24gb2YgdGhlIHdpbmRvd1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIGRlc2lyZWQgdmVydGljYWwgcmVsYXRpdmUgcG9zaXRpb24gb2YgdGhlIHdpbmRvd1xuICAgICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59XG4gICAgICovXG4gICAgU2V0UmVsYXRpdmVQb3NpdGlvbih4LCB5KSB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlcl0oU2V0UmVsYXRpdmVQb3NpdGlvbk1ldGhvZCwgeyB4LCB5IH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgd2hldGhlciB0aGUgd2luZG93IGlzIHJlc2l6YWJsZS5cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHJlc2l6YWJsZSAtIFdoZXRoZXIgdGhlIHdpbmRvdyBzaG91bGQgYmUgcmVzaXphYmxlXG4gICAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAgICAgKi9cbiAgICBTZXRSZXNpemFibGUocmVzaXphYmxlKSB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlcl0oU2V0UmVzaXphYmxlTWV0aG9kLCB7IHJlc2l6YWJsZSB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBzaXplIG9mIHRoZSB3aW5kb3cuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gVGhlIGRlc2lyZWQgd2lkdGggb2YgdGhlIHdpbmRvd1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgZGVzaXJlZCBoZWlnaHQgb2YgdGhlIHdpbmRvd1xuICAgICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59XG4gICAgICovXG4gICAgU2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlcl0oU2V0U2l6ZU1ldGhvZCwgeyB3aWR0aCwgaGVpZ2h0IH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHRpdGxlIG9mIHRoZSB3aW5kb3cuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlIC0gVGhlIGRlc2lyZWQgdGl0bGUgb2YgdGhlIHdpbmRvd1xuICAgICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59XG4gICAgICovXG4gICAgU2V0VGl0bGUodGl0bGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyXShTZXRUaXRsZU1ldGhvZCwgeyB0aXRsZSB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB6b29tIGxldmVsIG9mIHRoZSB3aW5kb3cuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHpvb20gLSBUaGUgZGVzaXJlZCB6b29tIGxldmVsXG4gICAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAgICAgKi9cbiAgICBTZXRab29tKHpvb20pIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyXShTZXRab29tTWV0aG9kLCB7IHpvb20gfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2hvd3MgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICAgICAqL1xuICAgIFNob3coKSB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlcl0oU2hvd01ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgd2luZG93LlxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqIEByZXR1cm4ge1Byb21pc2U8U2l6ZT59IC0gVGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgd2luZG93XG4gICAgICovXG4gICAgU2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyXShTaXplTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUb2dnbGVzIHRoZSB3aW5kb3cgYmV0d2VlbiBmdWxsc2NyZWVuIGFuZCBub3JtYWwuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAgICAgKi9cbiAgICBUb2dnbGVGdWxsc2NyZWVuKCkge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJdKFRvZ2dsZUZ1bGxzY3JlZW5NZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRvZ2dsZXMgdGhlIHdpbmRvdyBiZXR3ZWVuIG1heGltaXNlZCBhbmQgbm9ybWFsLlxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59XG4gICAgICovXG4gICAgVG9nZ2xlTWF4aW1pc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlcl0oVG9nZ2xlTWF4aW1pc2VNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVuLWZ1bGxzY3JlZW5zIHRoZSB3aW5kb3cuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAgICAgKi9cbiAgICBVbkZ1bGxzY3JlZW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlcl0oVW5GdWxsc2NyZWVuTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVbi1tYXhpbWlzZXMgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICAgICAqL1xuICAgIFVuTWF4aW1pc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlcl0oVW5NYXhpbWlzZU1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVW4tbWluaW1pc2VzIHRoZSB3aW5kb3cuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAgICAgKi9cbiAgICBVbk1pbmltaXNlKCkge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJdKFVuTWluaW1pc2VNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHdpZHRoIG9mIHRoZSB3aW5kb3cuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQHJldHVybiB7UHJvbWlzZTxudW1iZXI+fSAtIFRoZSBjdXJyZW50IHdpZHRoIG9mIHRoZSB3aW5kb3dcbiAgICAgKi9cbiAgICBXaWR0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyXShXaWR0aE1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogWm9vbXMgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICAgICAqL1xuICAgIFpvb20oKSB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlcl0oWm9vbU1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5jcmVhc2VzIHRoZSB6b29tIGxldmVsIG9mIHRoZSB3ZWJ2aWV3IGNvbnRlbnQuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAgICAgKi9cbiAgICBab29tSW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlcl0oWm9vbUluTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWNyZWFzZXMgdGhlIHpvb20gbGV2ZWwgb2YgdGhlIHdlYnZpZXcgY29udGVudC5cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICAgICAqL1xuICAgIFpvb21PdXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlcl0oWm9vbU91dE1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzZXRzIHRoZSB6b29tIGxldmVsIG9mIHRoZSB3ZWJ2aWV3IGNvbnRlbnQuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAgICAgKi9cbiAgICBab29tUmVzZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlcl0oWm9vbVJlc2V0TWV0aG9kKTtcbiAgICB9XG59XG5cbi8qKlxuICogVGhlIHdpbmRvdyB3aXRoaW4gd2hpY2ggdGhlIHNjcmlwdCBpcyBydW5uaW5nLlxuICpcbiAqIEB0eXBlIHtXaW5kb3d9XG4gKi9cbmNvbnN0IHRoaXNXaW5kb3cgPSBuZXcgV2luZG93KCcnKTtcblxuZXhwb3J0IGRlZmF1bHQgdGhpc1dpbmRvdztcbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuaW1wb3J0ICogYXMgUnVudGltZSBmcm9tIFwiLi4vQHdhaWxzaW8vcnVudGltZS9zcmNcIjtcblxuLy8gTk9URTogdGhlIGZvbGxvd2luZyBtZXRob2RzIE1VU1QgYmUgaW1wb3J0ZWQgZXhwbGljaXRseSBiZWNhdXNlIG9mIGhvdyBlc2J1aWxkIGluamVjdGlvbiB3b3Jrc1xuaW1wb3J0IHtFbmFibGUgYXMgRW5hYmxlV01MfSBmcm9tIFwiLi4vQHdhaWxzaW8vcnVudGltZS9zcmMvd21sXCI7XG5pbXBvcnQge2RlYnVnTG9nfSBmcm9tIFwiLi4vQHdhaWxzaW8vcnVudGltZS9zcmMvdXRpbHNcIjtcblxud2luZG93LndhaWxzID0gUnVudGltZTtcbkVuYWJsZVdNTCgpO1xuXG5pZiAoREVCVUcpIHtcbiAgICBkZWJ1Z0xvZyhcIldhaWxzIFJ1bnRpbWUgTG9hZGVkXCIpXG59XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbi8qIGpzaGludCBlc3ZlcnNpb246IDkgKi9cblxuaW1wb3J0IHtuZXdSdW50aW1lQ2FsbGVyV2l0aElELCBvYmplY3ROYW1lc30gZnJvbSBcIi4vcnVudGltZVwiO1xubGV0IGNhbGwgPSBuZXdSdW50aW1lQ2FsbGVyV2l0aElEKG9iamVjdE5hbWVzLlN5c3RlbSwgJycpO1xuY29uc3Qgc3lzdGVtSXNEYXJrTW9kZSA9IDA7XG5jb25zdCBlbnZpcm9ubWVudCA9IDE7XG5cbmNvbnN0IF9pbnZva2UgPSAoKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIGlmKHdpbmRvdz8uY2hyb21lPy53ZWJ2aWV3KSB7XG4gICAgICAgICAgICByZXR1cm4gKG1zZykgPT4gd2luZG93LmNocm9tZS53ZWJ2aWV3LnBvc3RNZXNzYWdlKG1zZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYod2luZG93Py53ZWJraXQ/Lm1lc3NhZ2VIYW5kbGVycz8uZXh0ZXJuYWwpIHtcbiAgICAgICAgICAgIHJldHVybiAobXNnKSA9PiB3aW5kb3cud2Via2l0Lm1lc3NhZ2VIYW5kbGVycy5leHRlcm5hbC5wb3N0TWVzc2FnZShtc2cpO1xuICAgICAgICB9XG4gICAgfSBjYXRjaChlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignXFxuJWNcdTI2QTBcdUZFMEYgQnJvd3NlciBFbnZpcm9ubWVudCBEZXRlY3RlZCAlY1xcblxcbiVjT25seSBVSSBwcmV2aWV3cyBhcmUgYXZhaWxhYmxlIGluIHRoZSBicm93c2VyLiBGb3IgZnVsbCBmdW5jdGlvbmFsaXR5LCBwbGVhc2UgcnVuIHRoZSBhcHBsaWNhdGlvbiBpbiBkZXNrdG9wIG1vZGUuXFxuTW9yZSBpbmZvcm1hdGlvbiBhdDogaHR0cHM6Ly92My53YWlscy5pby9sZWFybi9idWlsZC8jdXNpbmctYS1icm93c2VyLWZvci1kZXZlbG9wbWVudFxcbicsXG4gICAgICAgICAgICAnYmFja2dyb3VuZDogI2ZmZmZmZjsgY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyBwYWRkaW5nOiA0cHggOHB4OyBib3JkZXItcmFkaXVzOiA0cHg7IGJvcmRlcjogMnB4IHNvbGlkICMwMDAwMDA7JyxcbiAgICAgICAgICAgICdiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsnLFxuICAgICAgICAgICAgJ2NvbG9yOiAjZmZmZmZmOyBmb250LXN0eWxlOiBpdGFsaWM7IGZvbnQtd2VpZ2h0OiBib2xkOycpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn0pKCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnZva2UobXNnKSB7XG4gICAgaWYgKCFfaW52b2tlKSByZXR1cm47XG4gICAgcmV0dXJuIF9pbnZva2UobXNnKTtcbn1cblxuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIFJldHJpZXZlcyB0aGUgc3lzdGVtIGRhcmsgbW9kZSBzdGF0dXMuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gLSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyBpZiB0aGUgc3lzdGVtIGlzIGluIGRhcmsgbW9kZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIElzRGFya01vZGUoKSB7XG4gICAgcmV0dXJuIGNhbGwoc3lzdGVtSXNEYXJrTW9kZSk7XG59XG5cbi8qKlxuICogRmV0Y2hlcyB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZSBhcHBsaWNhdGlvbiBmcm9tIHRoZSBzZXJ2ZXIuXG4gKlxuICogQGFzeW5jXG4gKiBAZnVuY3Rpb24gQ2FwYWJpbGl0aWVzXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxPYmplY3Q+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgY2FwYWJpbGl0aWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQ2FwYWJpbGl0aWVzKCkge1xuICAgIGxldCByZXNwb25zZSA9IGZldGNoKFwiL3dhaWxzL2NhcGFiaWxpdGllc1wiKTtcbiAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IE9TSW5mb1xuICogQHByb3BlcnR5IHtzdHJpbmd9IEJyYW5kaW5nIC0gVGhlIGJyYW5kaW5nIG9mIHRoZSBPUy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBJRCAtIFRoZSBJRCBvZiB0aGUgT1MuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBPUy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBWZXJzaW9uIC0gVGhlIHZlcnNpb24gb2YgdGhlIE9TLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gRW52aXJvbm1lbnRJbmZvXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQXJjaCAtIFRoZSBhcmNoaXRlY3R1cmUgb2YgdGhlIHN5c3RlbS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gRGVidWcgLSBUcnVlIGlmIHRoZSBhcHBsaWNhdGlvbiBpcyBydW5uaW5nIGluIGRlYnVnIG1vZGUsIG90aGVyd2lzZSBmYWxzZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBPUyAtIFRoZSBvcGVyYXRpbmcgc3lzdGVtIGluIHVzZS5cbiAqIEBwcm9wZXJ0eSB7T1NJbmZvfSBPU0luZm8gLSBEZXRhaWxzIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtLlxuICogQHByb3BlcnR5IHtPYmplY3R9IFBsYXRmb3JtSW5mbyAtIEFkZGl0aW9uYWwgcGxhdGZvcm0gaW5mb3JtYXRpb24uXG4gKi9cblxuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIFJldHJpZXZlcyBlbnZpcm9ubWVudCBkZXRhaWxzLlxuICogQHJldHVybnMge1Byb21pc2U8RW52aXJvbm1lbnRJbmZvPn0gLSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBvYmplY3QgY29udGFpbmluZyBPUyBhbmQgc3lzdGVtIGFyY2hpdGVjdHVyZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEVudmlyb25tZW50KCkge1xuICAgIHJldHVybiBjYWxsKGVudmlyb25tZW50KTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGN1cnJlbnQgb3BlcmF0aW5nIHN5c3RlbSBpcyBXaW5kb3dzLlxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIG9wZXJhdGluZyBzeXN0ZW0gaXMgV2luZG93cywgb3RoZXJ3aXNlIGZhbHNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSXNXaW5kb3dzKCkge1xuICAgIHJldHVybiB3aW5kb3cuX3dhaWxzLmVudmlyb25tZW50Lk9TID09PSBcIndpbmRvd3NcIjtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGN1cnJlbnQgb3BlcmF0aW5nIHN5c3RlbSBpcyBMaW51eC5cbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBjdXJyZW50IG9wZXJhdGluZyBzeXN0ZW0gaXMgTGludXgsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIElzTGludXgoKSB7XG4gICAgcmV0dXJuIHdpbmRvdy5fd2FpbHMuZW52aXJvbm1lbnQuT1MgPT09IFwibGludXhcIjtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgaXMgYSBtYWNPUyBvcGVyYXRpbmcgc3lzdGVtLlxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBlbnZpcm9ubWVudCBpcyBtYWNPUywgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSXNNYWMoKSB7XG4gICAgcmV0dXJuIHdpbmRvdy5fd2FpbHMuZW52aXJvbm1lbnQuT1MgPT09IFwiZGFyd2luXCI7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBjdXJyZW50IGVudmlyb25tZW50IGFyY2hpdGVjdHVyZSBpcyBBTUQ2NC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBjdXJyZW50IGVudmlyb25tZW50IGFyY2hpdGVjdHVyZSBpcyBBTUQ2NCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSXNBTUQ2NCgpIHtcbiAgICByZXR1cm4gd2luZG93Ll93YWlscy5lbnZpcm9ubWVudC5BcmNoID09PSBcImFtZDY0XCI7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBjdXJyZW50IGFyY2hpdGVjdHVyZSBpcyBBUk0uXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIGN1cnJlbnQgYXJjaGl0ZWN0dXJlIGlzIEFSTSwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSXNBUk0oKSB7XG4gICAgcmV0dXJuIHdpbmRvdy5fd2FpbHMuZW52aXJvbm1lbnQuQXJjaCA9PT0gXCJhcm1cIjtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgaXMgQVJNNjQgYXJjaGl0ZWN0dXJlLlxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIFJldHVybnMgdHJ1ZSBpZiB0aGUgZW52aXJvbm1lbnQgaXMgQVJNNjQgYXJjaGl0ZWN0dXJlLCBvdGhlcndpc2UgcmV0dXJucyBmYWxzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIElzQVJNNjQoKSB7XG4gICAgcmV0dXJuIHdpbmRvdy5fd2FpbHMuZW52aXJvbm1lbnQuQXJjaCA9PT0gXCJhcm02NFwiO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gSXNEZWJ1ZygpIHtcbiAgICByZXR1cm4gd2luZG93Ll93YWlscy5lbnZpcm9ubWVudC5EZWJ1ZyA9PT0gdHJ1ZTtcbn1cblxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vKiBqc2hpbnQgZXN2ZXJzaW9uOiA5ICovXG5cbmltcG9ydCB7bmV3UnVudGltZUNhbGxlcldpdGhJRCwgb2JqZWN0TmFtZXN9IGZyb20gXCIuL3J1bnRpbWVcIjtcbmltcG9ydCB7SXNEZWJ1Z30gZnJvbSBcIi4vc3lzdGVtXCI7XG5cbi8vIHNldHVwXG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCBjb250ZXh0TWVudUhhbmRsZXIpO1xuXG5jb25zdCBjYWxsID0gbmV3UnVudGltZUNhbGxlcldpdGhJRChvYmplY3ROYW1lcy5Db250ZXh0TWVudSwgJycpO1xuY29uc3QgQ29udGV4dE1lbnVPcGVuID0gMDtcblxuZnVuY3Rpb24gb3BlbkNvbnRleHRNZW51KGlkLCB4LCB5LCBkYXRhKSB7XG4gICAgdm9pZCBjYWxsKENvbnRleHRNZW51T3Blbiwge2lkLCB4LCB5LCBkYXRhfSk7XG59XG5cbmZ1bmN0aW9uIGNvbnRleHRNZW51SGFuZGxlcihldmVudCkge1xuICAgIC8vIENoZWNrIGZvciBjdXN0b20gY29udGV4dCBtZW51XG4gICAgbGV0IGVsZW1lbnQgPSBldmVudC50YXJnZXQ7XG4gICAgbGV0IGN1c3RvbUNvbnRleHRNZW51ID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkuZ2V0UHJvcGVydHlWYWx1ZShcIi0tY3VzdG9tLWNvbnRleHRtZW51XCIpO1xuICAgIGN1c3RvbUNvbnRleHRNZW51ID0gY3VzdG9tQ29udGV4dE1lbnUgPyBjdXN0b21Db250ZXh0TWVudS50cmltKCkgOiBcIlwiO1xuICAgIGlmIChjdXN0b21Db250ZXh0TWVudSkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBsZXQgY3VzdG9tQ29udGV4dE1lbnVEYXRhID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkuZ2V0UHJvcGVydHlWYWx1ZShcIi0tY3VzdG9tLWNvbnRleHRtZW51LWRhdGFcIik7XG4gICAgICAgIG9wZW5Db250ZXh0TWVudShjdXN0b21Db250ZXh0TWVudSwgZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSwgY3VzdG9tQ29udGV4dE1lbnVEYXRhKTtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgcHJvY2Vzc0RlZmF1bHRDb250ZXh0TWVudShldmVudCk7XG59XG5cblxuLypcbi0tZGVmYXVsdC1jb250ZXh0bWVudTogYXV0bzsgKGRlZmF1bHQpIHdpbGwgc2hvdyB0aGUgZGVmYXVsdCBjb250ZXh0IG1lbnUgaWYgY29udGVudEVkaXRhYmxlIGlzIHRydWUgT1IgdGV4dCBoYXMgYmVlbiBzZWxlY3RlZCBPUiBlbGVtZW50IGlzIGlucHV0IG9yIHRleHRhcmVhXG4tLWRlZmF1bHQtY29udGV4dG1lbnU6IHNob3c7IHdpbGwgYWx3YXlzIHNob3cgdGhlIGRlZmF1bHQgY29udGV4dCBtZW51XG4tLWRlZmF1bHQtY29udGV4dG1lbnU6IGhpZGU7IHdpbGwgYWx3YXlzIGhpZGUgdGhlIGRlZmF1bHQgY29udGV4dCBtZW51XG5cblRoaXMgcnVsZSBpcyBpbmhlcml0ZWQgbGlrZSBub3JtYWwgQ1NTIHJ1bGVzLCBzbyBuZXN0aW5nIHdvcmtzIGFzIGV4cGVjdGVkXG4qL1xuZnVuY3Rpb24gcHJvY2Vzc0RlZmF1bHRDb250ZXh0TWVudShldmVudCkge1xuXG4gICAgLy8gRGVidWcgYnVpbGRzIGFsd2F5cyBzaG93IHRoZSBtZW51XG4gICAgaWYgKElzRGVidWcoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUHJvY2VzcyBkZWZhdWx0IGNvbnRleHQgbWVudVxuICAgIGNvbnN0IGVsZW1lbnQgPSBldmVudC50YXJnZXQ7XG4gICAgY29uc3QgY29tcHV0ZWRTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO1xuICAgIGNvbnN0IGRlZmF1bHRDb250ZXh0TWVudUFjdGlvbiA9IGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShcIi0tZGVmYXVsdC1jb250ZXh0bWVudVwiKS50cmltKCk7XG4gICAgc3dpdGNoIChkZWZhdWx0Q29udGV4dE1lbnVBY3Rpb24pIHtcbiAgICAgICAgY2FzZSBcInNob3dcIjpcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY2FzZSBcImhpZGVcIjpcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAvLyBDaGVjayBpZiBjb250ZW50RWRpdGFibGUgaXMgdHJ1ZVxuICAgICAgICAgICAgaWYgKGVsZW1lbnQuaXNDb250ZW50RWRpdGFibGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRleHQgaGFzIGJlZW4gc2VsZWN0ZWRcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgICAgIGNvbnN0IGhhc1NlbGVjdGlvbiA9IChzZWxlY3Rpb24udG9TdHJpbmcoKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgaWYgKGhhc1NlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VsZWN0aW9uLnJhbmdlQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KGkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWN0cyA9IHJhbmdlLmdldENsaWVudFJlY3RzKCk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcmVjdHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY3QgPSByZWN0c1tqXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KHJlY3QubGVmdCwgcmVjdC50b3ApID09PSBlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGFnbmFtZSBpcyBpbnB1dCBvciB0ZXh0YXJlYVxuICAgICAgICAgICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gXCJJTlBVVFwiIHx8IGVsZW1lbnQudGFnTmFtZSA9PT0gXCJURVhUQVJFQVwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhc1NlbGVjdGlvbiB8fCAoIWVsZW1lbnQucmVhZE9ubHkgJiYgIWVsZW1lbnQuZGlzYWJsZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGhpZGUgZGVmYXVsdCBjb250ZXh0IG1lbnVcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vKiBqc2hpbnQgZXN2ZXJzaW9uOiA5ICovXG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBrZXkgZnJvbSB0aGUgZmxhZyBtYXAuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGtleVN0cmluZyAtIFRoZSBrZXkgdG8gcmV0cmlldmUgdGhlIHZhbHVlIGZvci5cbiAqIEByZXR1cm4geyp9IC0gVGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGtleS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEdldEZsYWcoa2V5U3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5fd2FpbHMuZmxhZ3Nba2V5U3RyaW5nXTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuYWJsZSB0byByZXRyaWV2ZSBmbGFnICdcIiArIGtleVN0cmluZyArIFwiJzogXCIgKyBlKTtcbiAgICB9XG59XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG4vKiBqc2hpbnQgZXN2ZXJzaW9uOiA5ICovXG5pbXBvcnQge2ludm9rZSwgSXNXaW5kb3dzfSBmcm9tIFwiLi9zeXN0ZW1cIjtcbmltcG9ydCB7R2V0RmxhZ30gZnJvbSBcIi4vZmxhZ3NcIjtcblxuLy8gU2V0dXBcbmxldCBzaG91bGREcmFnID0gZmFsc2U7XG5sZXQgcmVzaXphYmxlID0gZmFsc2U7XG5sZXQgcmVzaXplRWRnZSA9IG51bGw7XG5sZXQgZGVmYXVsdEN1cnNvciA9IFwiYXV0b1wiO1xuXG53aW5kb3cuX3dhaWxzID0gd2luZG93Ll93YWlscyB8fCB7fTtcblxud2luZG93Ll93YWlscy5zZXRSZXNpemFibGUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJlc2l6YWJsZSA9IHZhbHVlO1xufTtcblxud2luZG93Ll93YWlscy5lbmREcmFnID0gZnVuY3Rpb24oKSB7XG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3IgPSAnZGVmYXVsdCc7XG4gICAgc2hvdWxkRHJhZyA9IGZhbHNlO1xufTtcblxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIG9uTW91c2VEb3duKTtcbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSk7XG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCk7XG5cblxuZnVuY3Rpb24gZHJhZ1Rlc3QoZSkge1xuICAgIGxldCB2YWwgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlLnRhcmdldCkuZ2V0UHJvcGVydHlWYWx1ZShcIi0td2FpbHMtZHJhZ2dhYmxlXCIpO1xuICAgIGxldCBtb3VzZVByZXNzZWQgPSBlLmJ1dHRvbnMgIT09IHVuZGVmaW5lZCA/IGUuYnV0dG9ucyA6IGUud2hpY2g7XG4gICAgaWYgKCF2YWwgfHwgdmFsID09PSBcIlwiIHx8IHZhbC50cmltKCkgIT09IFwiZHJhZ1wiIHx8IG1vdXNlUHJlc3NlZCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBlLmRldGFpbCA9PT0gMTtcbn1cblxuZnVuY3Rpb24gb25Nb3VzZURvd24oZSkge1xuXG4gICAgLy8gQ2hlY2sgZm9yIHJlc2l6aW5nXG4gICAgaWYgKHJlc2l6ZUVkZ2UpIHtcbiAgICAgICAgaW52b2tlKFwid2FpbHM6cmVzaXplOlwiICsgcmVzaXplRWRnZSk7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChkcmFnVGVzdChlKSkge1xuICAgICAgICAvLyBUaGlzIGNoZWNrcyBmb3IgY2xpY2tzIG9uIHRoZSBzY3JvbGwgYmFyXG4gICAgICAgIGlmIChlLm9mZnNldFggPiBlLnRhcmdldC5jbGllbnRXaWR0aCB8fCBlLm9mZnNldFkgPiBlLnRhcmdldC5jbGllbnRIZWlnaHQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzaG91bGREcmFnID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBzaG91bGREcmFnID0gZmFsc2U7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBvbk1vdXNlVXAoKSB7XG4gICAgc2hvdWxkRHJhZyA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBzZXRSZXNpemUoY3Vyc29yKSB7XG4gICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLmN1cnNvciA9IGN1cnNvciB8fCBkZWZhdWx0Q3Vyc29yO1xuICAgIHJlc2l6ZUVkZ2UgPSBjdXJzb3I7XG59XG5cbmZ1bmN0aW9uIG9uTW91c2VNb3ZlKGUpIHtcbiAgICBpZiAoc2hvdWxkRHJhZykge1xuICAgICAgICBzaG91bGREcmFnID0gZmFsc2U7XG4gICAgICAgIGxldCBtb3VzZVByZXNzZWQgPSBlLmJ1dHRvbnMgIT09IHVuZGVmaW5lZCA/IGUuYnV0dG9ucyA6IGUud2hpY2g7XG4gICAgICAgIGlmIChtb3VzZVByZXNzZWQgPiAwKSB7XG4gICAgICAgICAgICBpbnZva2UoXCJ3YWlsczpkcmFnXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICghcmVzaXphYmxlIHx8ICFJc1dpbmRvd3MoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChkZWZhdWx0Q3Vyc29yID09IG51bGwpIHtcbiAgICAgICAgZGVmYXVsdEN1cnNvciA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5jdXJzb3I7XG4gICAgfVxuICAgIGxldCByZXNpemVIYW5kbGVIZWlnaHQgPSBHZXRGbGFnKFwic3lzdGVtLnJlc2l6ZUhhbmRsZUhlaWdodFwiKSB8fCA1O1xuICAgIGxldCByZXNpemVIYW5kbGVXaWR0aCA9IEdldEZsYWcoXCJzeXN0ZW0ucmVzaXplSGFuZGxlV2lkdGhcIikgfHwgNTtcblxuICAgIC8vIEV4dHJhIHBpeGVscyBmb3IgdGhlIGNvcm5lciBhcmVhc1xuICAgIGxldCBjb3JuZXJFeHRyYSA9IEdldEZsYWcoXCJyZXNpemVDb3JuZXJFeHRyYVwiKSB8fCAxMDtcblxuICAgIGxldCByaWdodEJvcmRlciA9IHdpbmRvdy5vdXRlcldpZHRoIC0gZS5jbGllbnRYIDwgcmVzaXplSGFuZGxlV2lkdGg7XG4gICAgbGV0IGxlZnRCb3JkZXIgPSBlLmNsaWVudFggPCByZXNpemVIYW5kbGVXaWR0aDtcbiAgICBsZXQgdG9wQm9yZGVyID0gZS5jbGllbnRZIDwgcmVzaXplSGFuZGxlSGVpZ2h0O1xuICAgIGxldCBib3R0b21Cb3JkZXIgPSB3aW5kb3cub3V0ZXJIZWlnaHQgLSBlLmNsaWVudFkgPCByZXNpemVIYW5kbGVIZWlnaHQ7XG5cbiAgICAvLyBBZGp1c3QgZm9yIGNvcm5lcnNcbiAgICBsZXQgcmlnaHRDb3JuZXIgPSB3aW5kb3cub3V0ZXJXaWR0aCAtIGUuY2xpZW50WCA8IChyZXNpemVIYW5kbGVXaWR0aCArIGNvcm5lckV4dHJhKTtcbiAgICBsZXQgbGVmdENvcm5lciA9IGUuY2xpZW50WCA8IChyZXNpemVIYW5kbGVXaWR0aCArIGNvcm5lckV4dHJhKTtcbiAgICBsZXQgdG9wQ29ybmVyID0gZS5jbGllbnRZIDwgKHJlc2l6ZUhhbmRsZUhlaWdodCArIGNvcm5lckV4dHJhKTtcbiAgICBsZXQgYm90dG9tQ29ybmVyID0gd2luZG93Lm91dGVySGVpZ2h0IC0gZS5jbGllbnRZIDwgKHJlc2l6ZUhhbmRsZUhlaWdodCArIGNvcm5lckV4dHJhKTtcblxuICAgIC8vIElmIHdlIGFyZW4ndCBvbiBhbiBlZGdlLCBidXQgd2VyZSwgcmVzZXQgdGhlIGN1cnNvciB0byBkZWZhdWx0XG4gICAgaWYgKCFsZWZ0Qm9yZGVyICYmICFyaWdodEJvcmRlciAmJiAhdG9wQm9yZGVyICYmICFib3R0b21Cb3JkZXIgJiYgcmVzaXplRWRnZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHNldFJlc2l6ZSgpO1xuICAgIH1cbiAgICAvLyBBZGp1c3RlZCBmb3IgY29ybmVyIGFyZWFzXG4gICAgZWxzZSBpZiAocmlnaHRDb3JuZXIgJiYgYm90dG9tQ29ybmVyKSBzZXRSZXNpemUoXCJzZS1yZXNpemVcIik7XG4gICAgZWxzZSBpZiAobGVmdENvcm5lciAmJiBib3R0b21Db3JuZXIpIHNldFJlc2l6ZShcInN3LXJlc2l6ZVwiKTtcbiAgICBlbHNlIGlmIChsZWZ0Q29ybmVyICYmIHRvcENvcm5lcikgc2V0UmVzaXplKFwibnctcmVzaXplXCIpO1xuICAgIGVsc2UgaWYgKHRvcENvcm5lciAmJiByaWdodENvcm5lcikgc2V0UmVzaXplKFwibmUtcmVzaXplXCIpO1xuICAgIGVsc2UgaWYgKGxlZnRCb3JkZXIpIHNldFJlc2l6ZShcInctcmVzaXplXCIpO1xuICAgIGVsc2UgaWYgKHRvcEJvcmRlcikgc2V0UmVzaXplKFwibi1yZXNpemVcIik7XG4gICAgZWxzZSBpZiAoYm90dG9tQm9yZGVyKSBzZXRSZXNpemUoXCJzLXJlc2l6ZVwiKTtcbiAgICBlbHNlIGlmIChyaWdodEJvcmRlcikgc2V0UmVzaXplKFwiZS1yZXNpemVcIik7XG59IiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vKiBqc2hpbnQgZXN2ZXJzaW9uOiA5ICovXG5cbmltcG9ydCB7IG5ld1J1bnRpbWVDYWxsZXJXaXRoSUQsIG9iamVjdE5hbWVzIH0gZnJvbSBcIi4vcnVudGltZVwiO1xuY29uc3QgY2FsbCA9IG5ld1J1bnRpbWVDYWxsZXJXaXRoSUQob2JqZWN0TmFtZXMuQXBwbGljYXRpb24sICcnKTtcblxuY29uc3QgSGlkZU1ldGhvZCA9IDA7XG5jb25zdCBTaG93TWV0aG9kID0gMTtcbmNvbnN0IFF1aXRNZXRob2QgPSAyO1xuXG4vKipcbiAqIEhpZGVzIGEgY2VydGFpbiBtZXRob2QgYnkgY2FsbGluZyB0aGUgSGlkZU1ldGhvZCBmdW5jdGlvbi5cbiAqXG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEhpZGUoKSB7XG4gICAgcmV0dXJuIGNhbGwoSGlkZU1ldGhvZCk7XG59XG5cbi8qKlxuICogQ2FsbHMgdGhlIFNob3dNZXRob2QgYW5kIHJldHVybnMgdGhlIHJlc3VsdC5cbiAqXG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICovXG5leHBvcnQgZnVuY3Rpb24gU2hvdygpIHtcbiAgICByZXR1cm4gY2FsbChTaG93TWV0aG9kKTtcbn1cblxuLyoqXG4gKiBDYWxscyB0aGUgUXVpdE1ldGhvZCB0byB0ZXJtaW5hdGUgdGhlIHByb2dyYW0uXG4gKlxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFF1aXQoKSB7XG4gICAgcmV0dXJuIGNhbGwoUXVpdE1ldGhvZCk7XG59XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbi8qIGpzaGludCBlc3ZlcnNpb246IDkgKi9cbmltcG9ydCB7IG5ld1J1bnRpbWVDYWxsZXJXaXRoSUQsIG9iamVjdE5hbWVzIH0gZnJvbSBcIi4vcnVudGltZVwiO1xuaW1wb3J0IHsgbmFub2lkIH0gZnJvbSAnLi9uYW5vaWQuanMnO1xuXG4vLyBTZXR1cFxud2luZG93Ll93YWlscyA9IHdpbmRvdy5fd2FpbHMgfHwge307XG53aW5kb3cuX3dhaWxzLmNhbGxSZXN1bHRIYW5kbGVyID0gcmVzdWx0SGFuZGxlcjtcbndpbmRvdy5fd2FpbHMuY2FsbEVycm9ySGFuZGxlciA9IGVycm9ySGFuZGxlcjtcblxuXG5jb25zdCBDYWxsQmluZGluZyA9IDA7XG5jb25zdCBjYWxsID0gbmV3UnVudGltZUNhbGxlcldpdGhJRChvYmplY3ROYW1lcy5DYWxsLCAnJyk7XG5jb25zdCBjYW5jZWxDYWxsID0gbmV3UnVudGltZUNhbGxlcldpdGhJRChvYmplY3ROYW1lcy5DYW5jZWxDYWxsLCAnJyk7XG5sZXQgY2FsbFJlc3BvbnNlcyA9IG5ldyBNYXAoKTtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSB1bmlxdWUgSUQgdXNpbmcgdGhlIG5hbm9pZCBsaWJyYXJ5LlxuICpcbiAqIEByZXR1cm4ge3N0cmluZ30gLSBBIHVuaXF1ZSBJRCB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBjYWxsUmVzcG9uc2VzIHNldC5cbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVJRCgpIHtcbiAgICBsZXQgcmVzdWx0O1xuICAgIGRvIHtcbiAgICAgICAgcmVzdWx0ID0gbmFub2lkKCk7XG4gICAgfSB3aGlsZSAoY2FsbFJlc3BvbnNlcy5oYXMocmVzdWx0KSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBIYW5kbGVzIHRoZSByZXN1bHQgb2YgYSBjYWxsIHJlcXVlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGlkIC0gVGhlIGlkIG9mIHRoZSByZXF1ZXN0IHRvIGhhbmRsZSB0aGUgcmVzdWx0IGZvci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhIC0gVGhlIHJlc3VsdCBkYXRhIG9mIHRoZSByZXF1ZXN0LlxuICogQHBhcmFtIHtib29sZWFufSBpc0pTT04gLSBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZGF0YSBpcyBKU09OIG9yIG5vdC5cbiAqXG4gKiBAcmV0dXJuIHt1bmRlZmluZWR9IC0gVGhpcyBtZXRob2QgZG9lcyBub3QgcmV0dXJuIGFueSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gcmVzdWx0SGFuZGxlcihpZCwgZGF0YSwgaXNKU09OKSB7XG4gICAgY29uc3QgcHJvbWlzZUhhbmRsZXIgPSBnZXRBbmREZWxldGVSZXNwb25zZShpZCk7XG4gICAgaWYgKHByb21pc2VIYW5kbGVyKSB7XG4gICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgICAgcHJvbWlzZUhhbmRsZXIucmVzb2x2ZSgpO1xuICAgICAgICB9IGVsc2UgaWYgKCFpc0pTT04pIHtcbiAgICAgICAgICAgIHByb21pc2VIYW5kbGVyLnJlc29sdmUoZGF0YSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHByb21pc2VIYW5kbGVyLnJlc29sdmUoSlNPTi5wYXJzZShkYXRhKSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBwcm9taXNlSGFuZGxlci5yZWplY3QobmV3IFR5cGVFcnJvcihcImNvdWxkIG5vdCBwYXJzZSByZXN1bHQ6IFwiICsgZXJyLm1lc3NhZ2UsIHsgY2F1c2U6IGVyciB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogSGFuZGxlcyB0aGUgZXJyb3IgZnJvbSBhIGNhbGwgcmVxdWVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaWQgLSBUaGUgaWQgb2YgdGhlIHByb21pc2UgaGFuZGxlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhIC0gVGhlIGVycm9yIGRhdGEgdG8gcmVqZWN0IHRoZSBwcm9taXNlIGhhbmRsZXIgd2l0aC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNKU09OIC0gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRhdGEgaXMgSlNPTiBvciBub3QuXG4gKlxuICogQHJldHVybiB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gZXJyb3JIYW5kbGVyKGlkLCBkYXRhLCBpc0pTT04pIHtcbiAgICBjb25zdCBwcm9taXNlSGFuZGxlciA9IGdldEFuZERlbGV0ZVJlc3BvbnNlKGlkKTtcbiAgICBpZiAocHJvbWlzZUhhbmRsZXIpIHtcbiAgICAgICAgaWYgKCFpc0pTT04pIHtcbiAgICAgICAgICAgIHByb21pc2VIYW5kbGVyLnJlamVjdChuZXcgRXJyb3IoZGF0YSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGVycm9yO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBlcnJvciA9IEpTT04ucGFyc2UoZGF0YSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBwcm9taXNlSGFuZGxlci5yZWplY3QobmV3IFR5cGVFcnJvcihcImNvdWxkIG5vdCBwYXJzZSBlcnJvcjogXCIgKyBlcnIubWVzc2FnZSwgeyBjYXVzZTogZXJyIH0pKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBvcHRpb25zID0ge307XG4gICAgICAgICAgICBpZiAoZXJyb3IuY2F1c2UpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zLmNhdXNlID0gZXJyb3IuY2F1c2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBleGNlcHRpb247XG4gICAgICAgICAgICBzd2l0Y2ggKGVycm9yLmtpbmQpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwiUmVmZXJlbmNlRXJyb3JcIjpcbiAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uID0gbmV3IFJlZmVyZW5jZUVycm9yKGVycm9yLm1lc3NhZ2UsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiVHlwZUVycm9yXCI6XG4gICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiA9IG5ldyBUeXBlRXJyb3IoZXJyb3IubWVzc2FnZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJSdW50aW1lRXJyb3JcIjpcbiAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uID0gbmV3IFJ1bnRpbWVFcnJvcihlcnJvci5tZXNzYWdlLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uID0gbmV3IEVycm9yKGVycm9yLm1lc3NhZ2UsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcHJvbWlzZUhhbmRsZXIucmVqZWN0KGV4Y2VwdGlvbik7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogUmV0cmlldmVzIGFuZCByZW1vdmVzIHRoZSByZXNwb25zZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIElEIGZyb20gdGhlIGNhbGxSZXNwb25zZXMgbWFwLlxuICpcbiAqIEBwYXJhbSB7YW55fSBpZCAtIFRoZSBJRCBvZiB0aGUgcmVzcG9uc2UgdG8gYmUgcmV0cmlldmVkIGFuZCByZW1vdmVkLlxuICpcbiAqIEByZXR1cm5zIHthbnl9IFRoZSByZXNwb25zZSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBJRC5cbiAqL1xuZnVuY3Rpb24gZ2V0QW5kRGVsZXRlUmVzcG9uc2UoaWQpIHtcbiAgICBjb25zdCByZXNwb25zZSA9IGNhbGxSZXNwb25zZXMuZ2V0KGlkKTtcbiAgICBjYWxsUmVzcG9uc2VzLmRlbGV0ZShpZCk7XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xufVxuXG4vKipcbiAqIENvbGxlY3RzIGFsbCByZXF1aXJlZCBpbmZvcm1hdGlvbiBmb3IgYSBiaW5kaW5nIGNhbGwuXG4gKlxuICogQHR5cGVkZWYge09iamVjdH0gQ2FsbE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbbWV0aG9kSURdIC0gVGhlIG51bWVyaWMgSUQgb2YgdGhlIGJvdW5kIG1ldGhvZCB0byBjYWxsLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFttZXRob2ROYW1lXSAtIFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgYm91bmQgbWV0aG9kIHRvIGNhbGwuXG4gKiBAcHJvcGVydHkge2FueVtdfSBhcmdzIC0gQXJndW1lbnRzIHRvIGJlIHBhc3NlZCBpbnRvIHRoZSBib3VuZCBtZXRob2QuXG4gKi9cblxuLyoqXG4gKiBFeGNlcHRpb24gY2xhc3MgdGhhdCB3aWxsIGJlIHRocm93biBpbiBjYXNlIHRoZSBib3VuZCBtZXRob2QgcmV0dXJucyBhbiBlcnJvci5cbiAqIFRoZSB2YWx1ZSBvZiB0aGUge0BsaW5rIFJ1bnRpbWVFcnJvciNuYW1lfSBwcm9wZXJ0eSBpcyBcIlJ1bnRpbWVFcnJvclwiLlxuICovXG5leHBvcnQgY2xhc3MgUnVudGltZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgYSBuZXcgUnVudGltZUVycm9yIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBUaGUgZXJyb3IgbWVzc2FnZS5cbiAgICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzIC0gT3B0aW9uYWwgYXJndW1lbnRzIGZvciB0aGUgRXJyb3IgY29uc3RydWN0b3IuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobWVzc2FnZSwgLi4uYXJncykge1xuICAgICAgICBzdXBlcihtZXNzYWdlLCAuLi5hcmdzKTtcbiAgICAgICAgdGhpcy5uYW1lID0gXCJSdW50aW1lRXJyb3JcIjtcbiAgICB9XG59XG5cbi8qKlxuICogQ2FsbCBhIGJvdW5kIG1ldGhvZCBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIGNhbGwgb3B0aW9ucy5cbiAqXG4gKiBJbiBjYXNlIG9mIGZhaWx1cmUsIHRoZSByZXR1cm5lZCBwcm9taXNlIHdpbGwgcmVqZWN0IHdpdGggYW4gZXhjZXB0aW9uXG4gKiBhbW9uZyBSZWZlcmVuY2VFcnJvciAodW5rbm93biBtZXRob2QpLCBUeXBlRXJyb3IgKHdyb25nIGFyZ3VtZW50IGNvdW50IG9yIHR5cGUpLFxuICoge0BsaW5rIFJ1bnRpbWVFcnJvcn0gKG1ldGhvZCByZXR1cm5lZCBhbiBlcnJvciksIG9yIG90aGVyIChuZXR3b3JrIG9yIGludGVybmFsIGVycm9ycykuXG4gKiBUaGUgZXhjZXB0aW9uIG1pZ2h0IGhhdmUgYSBcImNhdXNlXCIgZmllbGQgd2l0aCB0aGUgdmFsdWUgcmV0dXJuZWRcbiAqIGJ5IHRoZSBhcHBsaWNhdGlvbi0gb3Igc2VydmljZS1sZXZlbCBlcnJvciBtYXJzaGFsaW5nIGZ1bmN0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge0NhbGxPcHRpb25zfSBvcHRpb25zIC0gQSBtZXRob2QgY2FsbCBkZXNjcmlwdG9yLlxuICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gLSBUaGUgcmVzdWx0IG9mIHRoZSBjYWxsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQ2FsbChvcHRpb25zKSB7XG4gICAgY29uc3QgaWQgPSBnZW5lcmF0ZUlEKCk7XG4gICAgY29uc3QgZG9DYW5jZWwgPSAoKSA9PiB7IHJldHVybiBjYW5jZWxDYWxsKHR5cGUsIHtcImNhbGwtaWRcIjogaWR9KSB9O1xuICAgIGxldCBxdWV1ZWRDYW5jZWwgPSBmYWxzZSwgY2FsbFJ1bm5pbmcgPSBmYWxzZTtcbiAgICBsZXQgcCA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgb3B0aW9uc1tcImNhbGwtaWRcIl0gPSBpZDtcbiAgICAgICAgY2FsbFJlc3BvbnNlcy5zZXQoaWQsIHsgcmVzb2x2ZSwgcmVqZWN0IH0pO1xuICAgICAgICBjYWxsKENhbGxCaW5kaW5nLCBvcHRpb25zKS50aGVuKChfKSA9PiB7XG4gICAgICAgICAgICBjYWxsUnVubmluZyA9IHRydWU7XG4gICAgICAgICAgICBpZiAocXVldWVkQ2FuY2VsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRvQ2FuY2VsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgIGNhbGxSZXNwb25zZXMuZGVsZXRlKGlkKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gICAgcC5jYW5jZWwgPSAoKSA9PiB7XG4gICAgICAgIGlmIChjYWxsUnVubmluZykge1xuICAgICAgICAgICAgcmV0dXJuIGRvQ2FuY2VsKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBxdWV1ZWRDYW5jZWwgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBwO1xufVxuXG4vKipcbiAqIENhbGxzIGEgYm91bmQgbWV0aG9kIGJ5IG5hbWUgd2l0aCB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50cy5cbiAqIFNlZSB7QGxpbmsgQ2FsbH0gZm9yIGRldGFpbHMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgbWV0aG9kIGluIHRoZSBmb3JtYXQgJ3BhY2thZ2Uuc3RydWN0Lm1ldGhvZCcuXG4gKiBAcGFyYW0ge2FueVtdfSBhcmdzIC0gVGhlIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBtZXRob2QuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSBUaGUgcmVzdWx0IG9mIHRoZSBtZXRob2QgY2FsbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEJ5TmFtZShtZXRob2ROYW1lLCAuLi5hcmdzKSB7XG4gICAgcmV0dXJuIENhbGwoe1xuICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICBhcmdzXG4gICAgfSk7XG59XG5cbi8qKlxuICogQ2FsbHMgYSBtZXRob2QgYnkgaXRzIG51bWVyaWMgSUQgd2l0aCB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50cy5cbiAqIFNlZSB7QGxpbmsgQ2FsbH0gZm9yIGRldGFpbHMuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IG1ldGhvZElEIC0gVGhlIElEIG9mIHRoZSBtZXRob2QgdG8gY2FsbC5cbiAqIEBwYXJhbSB7YW55W119IGFyZ3MgLSBUaGUgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIG1ldGhvZC5cbiAqIEByZXR1cm4ge1Byb21pc2U8YW55Pn0gLSBUaGUgcmVzdWx0IG9mIHRoZSBtZXRob2QgY2FsbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEJ5SUQobWV0aG9kSUQsIC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gQ2FsbCh7XG4gICAgICAgIG1ldGhvZElELFxuICAgICAgICBhcmdzXG4gICAgfSk7XG59XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbi8qIGpzaGludCBlc3ZlcnNpb246IDkgKi9cblxuaW1wb3J0IHtuZXdSdW50aW1lQ2FsbGVyV2l0aElELCBvYmplY3ROYW1lc30gZnJvbSBcIi4vcnVudGltZVwiO1xuXG5jb25zdCBjYWxsID0gbmV3UnVudGltZUNhbGxlcldpdGhJRChvYmplY3ROYW1lcy5DbGlwYm9hcmQsICcnKTtcbmNvbnN0IENsaXBib2FyZFNldFRleHQgPSAwO1xuY29uc3QgQ2xpcGJvYXJkVGV4dCA9IDE7XG5cbi8qKlxuICogU2V0cyB0aGUgdGV4dCB0byB0aGUgQ2xpcGJvYXJkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gVGhlIHRleHQgdG8gYmUgc2V0IHRvIHRoZSBDbGlwYm9hcmQuXG4gKiBAcmV0dXJuIHtQcm9taXNlfSAtIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gU2V0VGV4dCh0ZXh0KSB7XG4gICAgcmV0dXJuIGNhbGwoQ2xpcGJvYXJkU2V0VGV4dCwge3RleHR9KTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIENsaXBib2FyZCB0ZXh0XG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSB0ZXh0IGZyb20gdGhlIENsaXBib2FyZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFRleHQoKSB7XG4gICAgcmV0dXJuIGNhbGwoQ2xpcGJvYXJkVGV4dCk7XG59XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbi8qIGpzaGludCBlc3ZlcnNpb246IDkgKi9cblxuLyoqXG4gKiBBbnkgaXMgYSBkdW1teSBjcmVhdGlvbiBmdW5jdGlvbiBmb3Igc2ltcGxlIG9yIHVua25vd24gdHlwZXMuXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHthbnl9IHNvdXJjZVxuICogQHJldHVybnMge1R9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBBbnkoc291cmNlKSB7XG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7VH0gKi8oc291cmNlKTtcbn1cblxuLyoqXG4gKiBCeXRlU2xpY2UgaXMgYSBjcmVhdGlvbiBmdW5jdGlvbiB0aGF0IHJlcGxhY2VzXG4gKiBudWxsIHN0cmluZ3Mgd2l0aCBlbXB0eSBzdHJpbmdzLlxuICogQHBhcmFtIHthbnl9IHNvdXJjZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEJ5dGVTbGljZShzb3VyY2UpIHtcbiAgICByZXR1cm4gLyoqIEB0eXBlIHthbnl9ICovKChzb3VyY2UgPT0gbnVsbCkgPyBcIlwiIDogc291cmNlKTtcbn1cblxuLyoqXG4gKiBBcnJheSB0YWtlcyBhIGNyZWF0aW9uIGZ1bmN0aW9uIGZvciBhbiBhcmJpdHJhcnkgdHlwZVxuICogYW5kIHJldHVybnMgYW4gaW4tcGxhY2UgY3JlYXRpb24gZnVuY3Rpb24gZm9yIGFuIGFycmF5XG4gKiB3aG9zZSBlbGVtZW50cyBhcmUgb2YgdGhhdCB0eXBlLlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7KHNvdXJjZTogYW55KSA9PiBUfSBlbGVtZW50XG4gKiBAcmV0dXJucyB7KHNvdXJjZTogYW55KSA9PiBUW119XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBBcnJheShlbGVtZW50KSB7XG4gICAgaWYgKGVsZW1lbnQgPT09IEFueSkge1xuICAgICAgICByZXR1cm4gKHNvdXJjZSkgPT4gKHNvdXJjZSA9PT0gbnVsbCA/IFtdIDogc291cmNlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKHNvdXJjZSkgPT4ge1xuICAgICAgICBpZiAoc291cmNlID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3VyY2UubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHNvdXJjZVtpXSA9IGVsZW1lbnQoc291cmNlW2ldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc291cmNlO1xuICAgIH07XG59XG5cbi8qKlxuICogTWFwIHRha2VzIGNyZWF0aW9uIGZ1bmN0aW9ucyBmb3IgdHdvIGFyYml0cmFyeSB0eXBlc1xuICogYW5kIHJldHVybnMgYW4gaW4tcGxhY2UgY3JlYXRpb24gZnVuY3Rpb24gZm9yIGFuIG9iamVjdFxuICogd2hvc2Uga2V5cyBhbmQgdmFsdWVzIGFyZSBvZiB0aG9zZSB0eXBlcy5cbiAqIEB0ZW1wbGF0ZSBLLCBWXG4gKiBAcGFyYW0geyhzb3VyY2U6IGFueSkgPT4gS30ga2V5XG4gKiBAcGFyYW0geyhzb3VyY2U6IGFueSkgPT4gVn0gdmFsdWVcbiAqIEByZXR1cm5zIHsoc291cmNlOiBhbnkpID0+IHsgW186IEtdOiBWIH19XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBNYXAoa2V5LCB2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PT0gQW55KSB7XG4gICAgICAgIHJldHVybiAoc291cmNlKSA9PiAoc291cmNlID09PSBudWxsID8ge30gOiBzb3VyY2UpO1xuICAgIH1cblxuICAgIHJldHVybiAoc291cmNlKSA9PiB7XG4gICAgICAgIGlmIChzb3VyY2UgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgIHNvdXJjZVtrZXldID0gdmFsdWUoc291cmNlW2tleV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgfTtcbn1cblxuLyoqXG4gKiBOdWxsYWJsZSB0YWtlcyBhIGNyZWF0aW9uIGZ1bmN0aW9uIGZvciBhbiBhcmJpdHJhcnkgdHlwZVxuICogYW5kIHJldHVybnMgYSBjcmVhdGlvbiBmdW5jdGlvbiBmb3IgYSBudWxsYWJsZSB2YWx1ZSBvZiB0aGF0IHR5cGUuXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHsoc291cmNlOiBhbnkpID0+IFR9IGVsZW1lbnRcbiAqIEByZXR1cm5zIHsoc291cmNlOiBhbnkpID0+IChUIHwgbnVsbCl9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBOdWxsYWJsZShlbGVtZW50KSB7XG4gICAgaWYgKGVsZW1lbnQgPT09IEFueSkge1xuICAgICAgICByZXR1cm4gQW55O1xuICAgIH1cblxuICAgIHJldHVybiAoc291cmNlKSA9PiAoc291cmNlID09PSBudWxsID8gbnVsbCA6IGVsZW1lbnQoc291cmNlKSk7XG59XG5cbi8qKlxuICogU3RydWN0IHRha2VzIGFuIG9iamVjdCBtYXBwaW5nIGZpZWxkIG5hbWVzIHRvIGNyZWF0aW9uIGZ1bmN0aW9uc1xuICogYW5kIHJldHVybnMgYW4gaW4tcGxhY2UgY3JlYXRpb24gZnVuY3Rpb24gZm9yIGEgc3RydWN0LlxuICogQHRlbXBsYXRlIHt7IFtfOiBzdHJpbmddOiAoKHNvdXJjZTogYW55KSA9PiBhbnkpIH19IFRcbiAqIEB0ZW1wbGF0ZSB7eyBbS2V5IGluIGtleW9mIFRdPzogUmV0dXJuVHlwZTxUW0tleV0+IH19IFVcbiAqIEBwYXJhbSB7VH0gY3JlYXRlRmllbGRcbiAqIEByZXR1cm5zIHsoc291cmNlOiBhbnkpID0+IFV9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBTdHJ1Y3QoY3JlYXRlRmllbGQpIHtcbiAgICBsZXQgYWxsQW55ID0gdHJ1ZTtcbiAgICBmb3IgKGNvbnN0IG5hbWUgaW4gY3JlYXRlRmllbGQpIHtcbiAgICAgICAgaWYgKGNyZWF0ZUZpZWxkW25hbWVdICE9PSBBbnkpIHtcbiAgICAgICAgICAgIGFsbEFueSA9IGZhbHNlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGFsbEFueSkge1xuICAgICAgICByZXR1cm4gQW55O1xuICAgIH1cblxuICAgIHJldHVybiAoc291cmNlKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBpbiBjcmVhdGVGaWVsZCkge1xuICAgICAgICAgICAgaWYgKG5hbWUgaW4gc291cmNlKSB7XG4gICAgICAgICAgICAgICAgc291cmNlW25hbWVdID0gY3JlYXRlRmllbGRbbmFtZV0oc291cmNlW25hbWVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc291cmNlO1xuICAgIH07XG59XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbi8qIGpzaGludCBlc3ZlcnNpb246IDkgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTaXplXG4gKiBAcHJvcGVydHkge251bWJlcn0gV2lkdGggLSBUaGUgd2lkdGguXG4gKiBAcHJvcGVydHkge251bWJlcn0gSGVpZ2h0IC0gVGhlIGhlaWdodC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFJlY3RcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBYIC0gVGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgb3JpZ2luLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFkgLSBUaGUgWSBjb29yZGluYXRlIG9mIHRoZSBvcmlnaW4uXG4gKiBAcHJvcGVydHkge251bWJlcn0gV2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBIZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTY3JlZW5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBJRCAtIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgc2NyZWVuLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IE5hbWUgLSBIdW1hbiByZWFkYWJsZSBuYW1lIG9mIHRoZSBzY3JlZW4uXG4gKiBAcHJvcGVydHkge251bWJlcn0gU2NhbGVGYWN0b3IgLSBUaGUgc2NhbGUgZmFjdG9yIG9mIHRoZSBzY3JlZW4gKERQSS85NikuIDEgPSBzdGFuZGFyZCBEUEksIDIgPSBIaURQSSAoUmV0aW5hKSwgZXRjLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFggLSBUaGUgWCBjb29yZGluYXRlIG9mIHRoZSBzY3JlZW4uXG4gKiBAcHJvcGVydHkge251bWJlcn0gWSAtIFRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHNjcmVlbi5cbiAqIEBwcm9wZXJ0eSB7U2l6ZX0gU2l6ZSAtIENvbnRhaW5zIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBzY3JlZW4uXG4gKiBAcHJvcGVydHkge1JlY3R9IEJvdW5kcyAtIENvbnRhaW5zIHRoZSBib3VuZHMgb2YgdGhlIHNjcmVlbiBpbiB0ZXJtcyBvZiBYLCBZLCBXaWR0aCwgYW5kIEhlaWdodC5cbiAqIEBwcm9wZXJ0eSB7UmVjdH0gUGh5c2ljYWxCb3VuZHMgLSBDb250YWlucyB0aGUgcGh5c2ljYWwgYm91bmRzIG9mIHRoZSBzY3JlZW4gaW4gdGVybXMgb2YgWCwgWSwgV2lkdGgsIGFuZCBIZWlnaHQgKGJlZm9yZSBzY2FsaW5nKS5cbiAqIEBwcm9wZXJ0eSB7UmVjdH0gV29ya0FyZWEgLSBDb250YWlucyB0aGUgYXJlYSBvZiB0aGUgc2NyZWVuIHRoYXQgaXMgYWN0dWFsbHkgdXNhYmxlIChleGNsdWRpbmcgdGFza2JhciBhbmQgb3RoZXIgc3lzdGVtIFVJKS5cbiAqIEBwcm9wZXJ0eSB7UmVjdH0gUGh5c2ljYWxXb3JrQXJlYSAtIENvbnRhaW5zIHRoZSBwaHlzaWNhbCBXb3JrQXJlYSBvZiB0aGUgc2NyZWVuIChiZWZvcmUgc2NhbGluZykuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IElzUHJpbWFyeSAtIFRydWUgaWYgdGhpcyBpcyB0aGUgcHJpbWFyeSBtb25pdG9yIHNlbGVjdGVkIGJ5IHRoZSB1c2VyIGluIHRoZSBvcGVyYXRpbmcgc3lzdGVtLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFJvdGF0aW9uIC0gVGhlIHJvdGF0aW9uIG9mIHRoZSBzY3JlZW4uXG4gKi9cblxuaW1wb3J0IHsgbmV3UnVudGltZUNhbGxlcldpdGhJRCwgb2JqZWN0TmFtZXMgfSBmcm9tIFwiLi9ydW50aW1lXCI7XG5jb25zdCBjYWxsID0gbmV3UnVudGltZUNhbGxlcldpdGhJRChvYmplY3ROYW1lcy5TY3JlZW5zLCBcIlwiKTtcblxuY29uc3QgZ2V0QWxsID0gMDtcbmNvbnN0IGdldFByaW1hcnkgPSAxO1xuY29uc3QgZ2V0Q3VycmVudCA9IDI7XG5cbi8qKlxuICogR2V0cyBhbGwgc2NyZWVucy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPFNjcmVlbltdPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgb2YgU2NyZWVuIG9iamVjdHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBHZXRBbGwoKSB7XG4gICAgcmV0dXJuIGNhbGwoZ2V0QWxsKTtcbn1cbi8qKlxuICogR2V0cyB0aGUgcHJpbWFyeSBzY3JlZW4uXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxTY3JlZW4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcHJpbWFyeSBzY3JlZW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBHZXRQcmltYXJ5KCkge1xuICAgIHJldHVybiBjYWxsKGdldFByaW1hcnkpO1xufVxuLyoqXG4gKiBHZXRzIHRoZSBjdXJyZW50IGFjdGl2ZSBzY3JlZW4uXG4gKlxuICogQHJldHVybnMge1Byb21pc2U8U2NyZWVuPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgY3VycmVudCBhY3RpdmUgc2NyZWVuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gR2V0Q3VycmVudCgpIHtcbiAgICByZXR1cm4gY2FsbChnZXRDdXJyZW50KTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7O0FDQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7O0FDQUE7QUFBQTtBQUFBO0FBQUE7OztBQzZCQSxJQUFJLGNBQ0E7QUFFRyxJQUFJLFNBQVMsQ0FBQyxPQUFPLE9BQU87QUFDL0IsTUFBSSxLQUFLO0FBRVQsTUFBSSxJQUFJLE9BQU87QUFDZixTQUFPLEtBQUs7QUFFUixVQUFNLFlBQWEsS0FBSyxPQUFPLElBQUksS0FBTSxDQUFDO0FBQUEsRUFDOUM7QUFDQSxTQUFPO0FBQ1g7OztBQzVCQSxJQUFNLGFBQWEsT0FBTyxTQUFTLFNBQVM7QUFHckMsSUFBTSxjQUFjO0FBQUEsRUFDdkIsTUFBTTtBQUFBLEVBQ04sV0FBVztBQUFBLEVBQ1gsYUFBYTtBQUFBLEVBQ2IsUUFBUTtBQUFBLEVBQ1IsYUFBYTtBQUFBLEVBQ2IsUUFBUTtBQUFBLEVBQ1IsUUFBUTtBQUFBLEVBQ1IsU0FBUztBQUFBLEVBQ1QsUUFBUTtBQUFBLEVBQ1IsU0FBUztBQUFBLEVBQ1QsWUFBWTtBQUNoQjtBQUNPLElBQUksV0FBVyxPQUFPO0FBc0J0QixTQUFTLHVCQUF1QixRQUFRLFlBQVk7QUFDdkQsU0FBTyxTQUFVLFFBQVEsT0FBSyxNQUFNO0FBQ2hDLFdBQU8sa0JBQWtCLFFBQVEsUUFBUSxZQUFZLElBQUk7QUFBQSxFQUM3RDtBQUNKO0FBT0EsZUFBZSxrQkFBa0IsVUFBVSxRQUFRLFlBQVksTUFBTTtBQUNqRSxNQUFJLE1BQU0sSUFBSSxJQUFJLFVBQVU7QUFDNUIsTUFBSSxZQUFZLE1BQU07QUFDbEIsUUFBSSxhQUFhLE9BQU8sVUFBVSxRQUFRO0FBQUEsRUFDOUM7QUFDQSxNQUFJLFVBQVUsTUFB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QzFCLGdCQUFnQjtBQUFBLElBQ2hCLDRCQUE0QjtBQUFBLElBQzVCLDRCQUE0QjtBQUFBLElBQzVCLHlEQUF5RDtBQUFBLElBQ3pELHNDQUFzQztBQUFBLElBQ3RDLG9CQUFvQjtBQUFBLElBQ3BCLHFCQUFxQjtBQUFBLElBQ3JCLHFCQUFxQjtBQUFBLElBQ3JCLHNCQUFzQjtBQUFBLElBQ3RCLGdDQUFnQztBQUFBLElBQ2hDLGtDQUFrQztBQUFBLElBQ2xDLG1DQUFtQztBQUFBLElBQ25DLG9DQUFvQztBQUFBLElBQ3BDLCtCQUErQjtBQUFBLElBQy9CLDZCQUE2QjtBQUFBLElBQzdCLHVCQUF1QjtBQUFBLElBQ3ZCLGlDQUFpQztBQUFBLElBQ2pDLDhCQUE4QjtBQUFBLElBQzlCLDRCQUE0QjtBQUFBLElBQzVCLHNDQUFzQztBQUFBLElBQ3RDLDRCQUE0QjtBQUFBLElBQzVCLHNCQUFzQjtBQUFBLElBQ3RCLGtDQUFrQztBQUFBLElBQ2xDLHNCQUFzQjtBQUFBLElBQ3RCLHdCQUF3QjtBQUFBLElBQ3hCLHdCQUF3QjtBQUFBLElBQ3hCLG1CQUFtQjtBQUFBLElBQ25CLDBCQUEwQjtBQUFBLElBQzFCLDhCQUE4QjtBQUFBLElBQzlCLHlCQUF5QjtBQUFBLElBQ3pCLDZCQUE2QjtBQUFBLElBQzdCLGlCQUFpQjtBQUFBLElBQ2pCLGdCQUFnQjtBQUFBLElBQ2hCLHNCQUFzQjtBQUFBLElBQ3RCLGVBQWU7QUFBQSxJQUNmLHlCQUF5QjtBQUFBLElBQ3pCLHdCQUF3QjtBQUFBLElBQ3hCLG9CQUFvQjtBQUFBLElBQ3BCLHFCQUFxQjtBQUFBLElBQ3JCLGlCQUFpQjtBQUFBLElBQ2pCLGlCQUFpQjtBQUFBLElBQ2pCLHNCQUFzQjtBQUFBLElBQ3RCLG1DQUFtQztBQUFBLElBQ25DLHFDQUFxQztBQUFBLElBQ3JDLHVCQUF1QjtBQUFBLElBQ3ZCLHNCQUFzQjtBQUFBLElBQ3RCLHdCQUF3QjtBQUFBLElBQ3hCLGVBQWU7QUFBQSxJQUNmLDJCQUEyQjtBQUFBLElBQzNCLDBCQUEwQjtBQUFBLElBQzFCLDZC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SSxZQUFZLElBQUksTUFBTSxLQUFLO0FBQzNCLGVBQVM7QUFDVDtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBSSxRQUFRO0FBQ1IsV0FBTztBQUFBLEVBQ1g7QUFFQSxTQUFPLENBQUMsV0FBVztBQUNmLGVBQVcsUUFBUSxhQUFhO0FBQzVCLFVBQUksUUFBUSxRQUFRO0FBQ2hCLGVBQU8sSUFBSSxJQUFJLFlBQVksSUFBSSxFQUFFLE9BQU8sSUFBSSxDQUFDO0FBQUEsTUFDakQ7QUFBQSxJQUNKO0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFDSjs7O0FDNUhBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQTJDQSxJQUFNQyxRQUFPLHVCQUF1QixZQUFZLFNBQVMsRUFBRTtBQUUzRCxJQUFNLFNBQVM7QUFDZixJQUFNLGFBQWE7QUFDbkIsSUFBTSxhQUFhO0FBTVosU0FBUyxTQUFTO0FBQ3JCLFNBQU9BLE1BQUssTUFBTTtBQUN0QjtBQUtPLFNBQVMsYUFBYTtBQUN6QixTQUFPQSxNQUFLLFVBQVU7QUFDMUI7QUFNTyxTQUFTLGFBQWE7QUFDekIsU0FBT0EsTUFBSyxVQUFVO0FBQzFCOzs7QW5CM0RBLE9BQU8sU0FBUyxPQUFPLFVBQVUsQ0FBQztBQWtDbEMsSUFBSSxjQUFjO0FBQ1gsU0FBUyxPQUFPO0FBQ25CLFNBQU8sT0FBTyxTQUFnQjtBQUM5QixFQUFPLE9BQU8scUJBQXFCO0FBQ25DLGdCQUFjO0FBQ2xCO0FBRUEsT0FBTyxpQkFBaUIsUUFBUSxNQUFNO0FBQ2xDLE1BQUksQ0FBQyxhQUFhO0FBQ2QsU0FBSztBQUFBLEVBQ1Q7QUFDSixDQUFDOyIsCiAgIm5hbWVzIjogWyJFcnJvciIsICJjYWxsIiwgInR5cGUiLCAiRXJyb3IiLCAiY2FsbCIsICJldmVudE5hbWUiLCAiY29udHJvbGxlciIsICJyZXNpemFibGUiLCAiY2FsbCIsICJjYWxsIiwgImNhbGwiLCAiSGlkZU1ldGhvZCIsICJTaG93TWV0aG9kIiwgImNhbGwiLCAiZ2VuZXJhdGVJRCIsICJjYWxsIiwgIk1hcCIsICJNYXAiLCAia2V5IiwgImNhbGwiXQp9Cg== +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2luZGV4LnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy93bWwudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2Jyb3dzZXIudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL25hbm9pZC50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvcnVudGltZS50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvZGlhbG9ncy50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvZXZlbnRzLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9saXN0ZW5lci50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvZXZlbnRfdHlwZXMudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3V0aWxzLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy93aW5kb3cudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL2NvbXBpbGVkL21haW4uanMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3N5c3RlbS50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvY29udGV4dG1lbnUudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2ZsYWdzLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9kcmFnLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9hcHBsaWNhdGlvbi50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvY2FsbHMudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2NhbGxhYmxlLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9jYW5jZWxsYWJsZS50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvY2xpcGJvYXJkLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9jcmVhdGUudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3NjcmVlbnMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vLyBTZXR1cFxud2luZG93Ll93YWlscyA9IHdpbmRvdy5fd2FpbHMgfHwge307XG5cbmltcG9ydCBcIi4vY29udGV4dG1lbnUuanNcIjtcbmltcG9ydCBcIi4vZHJhZy5qc1wiO1xuXG4vLyBSZS1leHBvcnQgcHVibGljIEFQSVxuaW1wb3J0ICogYXMgQXBwbGljYXRpb24gZnJvbSBcIi4vYXBwbGljYXRpb24uanNcIjtcbmltcG9ydCAqIGFzIEJyb3dzZXIgZnJvbSBcIi4vYnJvd3Nlci5qc1wiO1xuaW1wb3J0ICogYXMgQ2FsbCBmcm9tIFwiLi9jYWxscy5qc1wiO1xuaW1wb3J0ICogYXMgQ2xpcGJvYXJkIGZyb20gXCIuL2NsaXBib2FyZC5qc1wiO1xuaW1wb3J0ICogYXMgQ3JlYXRlIGZyb20gXCIuL2NyZWF0ZS5qc1wiO1xuaW1wb3J0ICogYXMgRGlhbG9ncyBmcm9tIFwiLi9kaWFsb2dzLmpzXCI7XG5pbXBvcnQgKiBhcyBFdmVudHMgZnJvbSBcIi4vZXZlbnRzLmpzXCI7XG5pbXBvcnQgKiBhcyBGbGFncyBmcm9tIFwiLi9mbGFncy5qc1wiO1xuaW1wb3J0ICogYXMgU2NyZWVucyBmcm9tIFwiLi9zY3JlZW5zLmpzXCI7XG5pbXBvcnQgKiBhcyBTeXN0ZW0gZnJvbSBcIi4vc3lzdGVtLmpzXCI7XG5pbXBvcnQgV2luZG93IGZyb20gXCIuL3dpbmRvdy5qc1wiO1xuaW1wb3J0ICogYXMgV01MIGZyb20gXCIuL3dtbC5qc1wiO1xuXG5leHBvcnQge1xuICAgIEFwcGxpY2F0aW9uLFxuICAgIEJyb3dzZXIsXG4gICAgQ2FsbCxcbiAgICBDbGlwYm9hcmQsXG4gICAgRGlhbG9ncyxcbiAgICBFdmVudHMsXG4gICAgRmxhZ3MsXG4gICAgU2NyZWVucyxcbiAgICBTeXN0ZW0sXG4gICAgV2luZG93LFxuICAgIFdNTFxufTtcblxuLyoqXG4gKiBBbiBpbnRlcm5hbCB1dGlsaXR5IGNvbnN1bWVkIGJ5IHRoZSBiaW5kaW5nIGdlbmVyYXRvci5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGlnbm9yZVxuICovXG5leHBvcnQgeyBDcmVhdGUgfTtcblxuZXhwb3J0ICogZnJvbSBcIi4vY2FuY2VsbGFibGUuanNcIjtcblxuLy8gTm90aWZ5IGJhY2tlbmRcbndpbmRvdy5fd2FpbHMuaW52b2tlID0gU3lzdGVtLmludm9rZTtcblN5c3RlbS5pbnZva2UoXCJ3YWlsczpydW50aW1lOnJlYWR5XCIpO1xuIiwgIi8qXG4gXyAgICAgX18gICAgIF8gX19cbnwgfCAgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5pbXBvcnQgeyBPcGVuVVJMIH0gZnJvbSBcIi4vYnJvd3Nlci5qc1wiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi9kaWFsb2dzLmpzXCI7XG5pbXBvcnQgeyBFbWl0LCBXYWlsc0V2ZW50IH0gZnJvbSBcIi4vZXZlbnRzLmpzXCI7XG5pbXBvcnQgeyBjYW5BYm9ydExpc3RlbmVycywgd2hlblJlYWR5IH0gZnJvbSBcIi4vdXRpbHMuanNcIjtcbmltcG9ydCBXaW5kb3cgZnJvbSBcIi4vd2luZG93LmpzXCI7XG5cbi8qKlxuICogU2VuZHMgYW4gZXZlbnQgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgb3B0aW9uYWwgZGF0YS5cbiAqXG4gKiBAcGFyYW0gZXZlbnROYW1lIC0gLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gc2VuZC5cbiAqIEBwYXJhbSBbZGF0YT1udWxsXSAtIC0gT3B0aW9uYWwgZGF0YSB0byBzZW5kIGFsb25nIHdpdGggdGhlIGV2ZW50LlxuICovXG5mdW5jdGlvbiBzZW5kRXZlbnQoZXZlbnROYW1lOiBzdHJpbmcsIGRhdGE6IGFueSA9IG51bGwpOiB2b2lkIHtcbiAgICBFbWl0KG5ldyBXYWlsc0V2ZW50KGV2ZW50TmFtZSwgZGF0YSkpO1xufVxuXG4vKipcbiAqIENhbGxzIGEgbWV0aG9kIG9uIGEgc3BlY2lmaWVkIHdpbmRvdy5cbiAqXG4gKiBAcGFyYW0gd2luZG93TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB3aW5kb3cgdG8gY2FsbCB0aGUgbWV0aG9kIG9uLlxuICogQHBhcmFtIG1ldGhvZE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgbWV0aG9kIHRvIGNhbGwuXG4gKi9cbmZ1bmN0aW9uIGNhbGxXaW5kb3dNZXRob2Qod2luZG93TmFtZTogc3RyaW5nLCBtZXRob2ROYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCB0YXJnZXRXaW5kb3cgPSBXaW5kb3cuR2V0KHdpbmRvd05hbWUpO1xuICAgIGNvbnN0IG1ldGhvZCA9ICh0YXJnZXRXaW5kb3cgYXMgYW55KVttZXRob2ROYW1lXTtcblxuICAgIGlmICh0eXBlb2YgbWV0aG9kICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgV2luZG93IG1ldGhvZCAnJHttZXRob2ROYW1lfScgbm90IGZvdW5kYCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgICBtZXRob2QuY2FsbCh0YXJnZXRXaW5kb3cpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgY2FsbGluZyB3aW5kb3cgbWV0aG9kICcke21ldGhvZE5hbWV9JzogYCwgZSk7XG4gICAgfVxufVxuXG4vKipcbiAqIFJlc3BvbmRzIHRvIGEgdHJpZ2dlcmluZyBldmVudCBieSBydW5uaW5nIGFwcHJvcHJpYXRlIFdNTCBhY3Rpb25zIGZvciB0aGUgY3VycmVudCB0YXJnZXQuXG4gKi9cbmZ1bmN0aW9uIG9uV01MVHJpZ2dlcmVkKGV2OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGVsZW1lbnQgPSBldi5jdXJyZW50VGFyZ2V0IGFzIEVsZW1lbnQ7XG5cbiAgICBmdW5jdGlvbiBydW5FZmZlY3QoY2hvaWNlID0gXCJZZXNcIikge1xuICAgICAgICBpZiAoY2hvaWNlICE9PSBcIlllc1wiKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGV2ZW50VHlwZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd3bWwtZXZlbnQnKSB8fCBlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS13bWwtZXZlbnQnKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0V2luZG93ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3dtbC10YXJnZXQtd2luZG93JykgfHwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtd21sLXRhcmdldC13aW5kb3cnKSB8fCBcIlwiO1xuICAgICAgICBjb25zdCB3aW5kb3dNZXRob2QgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnd21sLXdpbmRvdycpIHx8IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXdtbC13aW5kb3cnKTtcbiAgICAgICAgY29uc3QgdXJsID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3dtbC1vcGVudXJsJykgfHwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtd21sLW9wZW51cmwnKTtcblxuICAgICAgICBpZiAoZXZlbnRUeXBlICE9PSBudWxsKVxuICAgICAgICAgICAgc2VuZEV2ZW50KGV2ZW50VHlwZSk7XG4gICAgICAgIGlmICh3aW5kb3dNZXRob2QgIT09IG51bGwpXG4gICAgICAgICAgICBjYWxsV2luZG93TWV0aG9kKHRhcmdldFdpbmRvdywgd2luZG93TWV0aG9kKTtcbiAgICAgICAgaWYgKHVybCAhPT0gbnVsbClcbiAgICAgICAgICAgIHZvaWQgT3BlblVSTCh1cmwpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpcm0gPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnd21sLWNvbmZpcm0nKSB8fCBlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS13bWwtY29uZmlybScpO1xuXG4gICAgaWYgKGNvbmZpcm0pIHtcbiAgICAgICAgUXVlc3Rpb24oe1xuICAgICAgICAgICAgVGl0bGU6IFwiQ29uZmlybVwiLFxuICAgICAgICAgICAgTWVzc2FnZTogY29uZmlybSxcbiAgICAgICAgICAgIERldGFjaGVkOiBmYWxzZSxcbiAgICAgICAgICAgIEJ1dHRvbnM6IFtcbiAgICAgICAgICAgICAgICB7IExhYmVsOiBcIlllc1wiIH0sXG4gICAgICAgICAgICAgICAgeyBMYWJlbDogXCJOb1wiLCBJc0RlZmF1bHQ6IHRydWUgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9KS50aGVuKHJ1bkVmZmVjdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcnVuRWZmZWN0KCk7XG4gICAgfVxufVxuXG4vLyBQcml2YXRlIGZpZWxkIG5hbWVzLlxuY29uc3QgY29udHJvbGxlclN5bSA9IFN5bWJvbChcImNvbnRyb2xsZXJcIik7XG5jb25zdCB0cmlnZ2VyTWFwU3ltID0gU3ltYm9sKFwidHJpZ2dlck1hcFwiKTtcbmNvbnN0IGVsZW1lbnRDb3VudFN5bSA9IFN5bWJvbChcImVsZW1lbnRDb3VudFwiKTtcblxuLyoqXG4gKiBBYm9ydENvbnRyb2xsZXJSZWdpc3RyeSBkb2VzIG5vdCBhY3R1YWxseSByZW1lbWJlciBhY3RpdmUgZXZlbnQgbGlzdGVuZXJzOiBpbnN0ZWFkXG4gKiBpdCB0aWVzIHRoZW0gdG8gYW4gQWJvcnRTaWduYWwgYW5kIHVzZXMgYW4gQWJvcnRDb250cm9sbGVyIHRvIHJlbW92ZSB0aGVtIGFsbCBhdCBvbmNlLlxuICovXG5jbGFzcyBBYm9ydENvbnRyb2xsZXJSZWdpc3RyeSB7XG4gICAgLy8gUHJpdmF0ZSBmaWVsZHMuXG4gICAgW2NvbnRyb2xsZXJTeW1dOiBBYm9ydENvbnRyb2xsZXI7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpc1tjb250cm9sbGVyU3ltXSA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIG9wdGlvbnMgb2JqZWN0IGZvciBhZGRFdmVudExpc3RlbmVyIHRoYXQgdGllcyB0aGUgbGlzdGVuZXJcbiAgICAgKiB0byB0aGUgQWJvcnRTaWduYWwgZnJvbSB0aGUgY3VycmVudCBBYm9ydENvbnRyb2xsZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZWxlbWVudCAtIEFuIEhUTUwgZWxlbWVudFxuICAgICAqIEBwYXJhbSB0cmlnZ2VycyAtIFRoZSBsaXN0IG9mIGFjdGl2ZSBXTUwgdHJpZ2dlciBldmVudHMgZm9yIHRoZSBzcGVjaWZpZWQgZWxlbWVudHNcbiAgICAgKi9cbiAgICBzZXQoZWxlbWVudDogRWxlbWVudCwgdHJpZ2dlcnM6IHN0cmluZ1tdKTogQWRkRXZlbnRMaXN0ZW5lck9wdGlvbnMge1xuICAgICAgICByZXR1cm4geyBzaWduYWw6IHRoaXNbY29udHJvbGxlclN5bV0uc2lnbmFsIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwgcmVnaXN0ZXJlZCBldmVudCBsaXN0ZW5lcnMgYW5kIHJlc2V0cyB0aGUgcmVnaXN0cnkuXG4gICAgICovXG4gICAgcmVzZXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXNbY29udHJvbGxlclN5bV0uYWJvcnQoKTtcbiAgICAgICAgdGhpc1tjb250cm9sbGVyU3ltXSA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICB9XG59XG5cbi8qKlxuICogV2Vha01hcFJlZ2lzdHJ5IG1hcHMgYWN0aXZlIHRyaWdnZXIgZXZlbnRzIHRvIGVhY2ggRE9NIGVsZW1lbnQgdGhyb3VnaCBhIFdlYWtNYXAuXG4gKiBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgbWFwcGluZyByZW1haW5zIHByaXZhdGUgdG8gdGhpcyBtb2R1bGUsIHdoaWxlIHN0aWxsIGFsbG93aW5nIGdhcmJhZ2VcbiAqIGNvbGxlY3Rpb24gb2YgdGhlIGludm9sdmVkIGVsZW1lbnRzLlxuICovXG5jbGFzcyBXZWFrTWFwUmVnaXN0cnkge1xuICAgIC8qKiBTdG9yZXMgdGhlIGN1cnJlbnQgZWxlbWVudC10by10cmlnZ2VyIG1hcHBpbmcuICovXG4gICAgW3RyaWdnZXJNYXBTeW1dOiBXZWFrTWFwPEVsZW1lbnQsIHN0cmluZ1tdPjtcbiAgICAvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgd2l0aCBhY3RpdmUgV01MIHRyaWdnZXJzLiAqL1xuICAgIFtlbGVtZW50Q291bnRTeW1dOiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpc1t0cmlnZ2VyTWFwU3ltXSA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgIHRoaXNbZWxlbWVudENvdW50U3ltXSA9IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBhY3RpdmUgdHJpZ2dlcnMgZm9yIHRoZSBzcGVjaWZpZWQgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbGVtZW50IC0gQW4gSFRNTCBlbGVtZW50XG4gICAgICogQHBhcmFtIHRyaWdnZXJzIC0gVGhlIGxpc3Qgb2YgYWN0aXZlIFdNTCB0cmlnZ2VyIGV2ZW50cyBmb3IgdGhlIHNwZWNpZmllZCBlbGVtZW50XG4gICAgICovXG4gICAgc2V0KGVsZW1lbnQ6IEVsZW1lbnQsIHRyaWdnZXJzOiBzdHJpbmdbXSk6IEFkZEV2ZW50TGlzdGVuZXJPcHRpb25zIHtcbiAgICAgICAgaWYgKCF0aGlzW3RyaWdnZXJNYXBTeW1dLmhhcyhlbGVtZW50KSkgeyB0aGlzW2VsZW1lbnRDb3VudFN5bV0rKzsgfVxuICAgICAgICB0aGlzW3RyaWdnZXJNYXBTeW1dLnNldChlbGVtZW50LCB0cmlnZ2Vycyk7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCByZWdpc3RlcmVkIGV2ZW50IGxpc3RlbmVycy5cbiAgICAgKi9cbiAgICByZXNldCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXNbZWxlbWVudENvdW50U3ltXSA8PSAwKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBkb2N1bWVudC5ib2R5LnF1ZXJ5U2VsZWN0b3JBbGwoJyonKSkge1xuICAgICAgICAgICAgaWYgKHRoaXNbZWxlbWVudENvdW50U3ltXSA8PSAwKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjb25zdCB0cmlnZ2VycyA9IHRoaXNbdHJpZ2dlck1hcFN5bV0uZ2V0KGVsZW1lbnQpO1xuICAgICAgICAgICAgaWYgKHRyaWdnZXJzICE9IG51bGwpIHsgdGhpc1tlbGVtZW50Q291bnRTeW1dLS07IH1cblxuICAgICAgICAgICAgZm9yIChjb25zdCB0cmlnZ2VyIG9mIHRyaWdnZXJzIHx8IFtdKVxuICAgICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0cmlnZ2VyLCBvbldNTFRyaWdnZXJlZCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzW3RyaWdnZXJNYXBTeW1dID0gbmV3IFdlYWtNYXAoKTtcbiAgICAgICAgdGhpc1tlbGVtZW50Q291bnRTeW1dID0gMDtcbiAgICB9XG59XG5cbmNvbnN0IHRyaWdnZXJSZWdpc3RyeSA9IGNhbkFib3J0TGlzdGVuZXJzKCkgPyBuZXcgQWJvcnRDb250cm9sbGVyUmVnaXN0cnkoKSA6IG5ldyBXZWFrTWFwUmVnaXN0cnkoKTtcblxuLyoqXG4gKiBBZGRzIGV2ZW50IGxpc3RlbmVycyB0byB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuXG4gKi9cbmZ1bmN0aW9uIGFkZFdNTExpc3RlbmVycyhlbGVtZW50OiBFbGVtZW50KTogdm9pZCB7XG4gICAgY29uc3QgdHJpZ2dlclJlZ0V4cCA9IC9cXFMrL2c7XG4gICAgY29uc3QgdHJpZ2dlckF0dHIgPSAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3dtbC10cmlnZ2VyJykgfHwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtd21sLXRyaWdnZXInKSB8fCBcImNsaWNrXCIpO1xuICAgIGNvbnN0IHRyaWdnZXJzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgbGV0IG1hdGNoO1xuICAgIHdoaWxlICgobWF0Y2ggPSB0cmlnZ2VyUmVnRXhwLmV4ZWModHJpZ2dlckF0dHIpKSAhPT0gbnVsbClcbiAgICAgICAgdHJpZ2dlcnMucHVzaChtYXRjaFswXSk7XG5cbiAgICBjb25zdCBvcHRpb25zID0gdHJpZ2dlclJlZ2lzdHJ5LnNldChlbGVtZW50LCB0cmlnZ2Vycyk7XG4gICAgZm9yIChjb25zdCB0cmlnZ2VyIG9mIHRyaWdnZXJzKVxuICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIodHJpZ2dlciwgb25XTUxUcmlnZ2VyZWQsIG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIFNjaGVkdWxlcyBhbiBhdXRvbWF0aWMgcmVsb2FkIG9mIFdNTCB0byBiZSBwZXJmb3JtZWQgYXMgc29vbiBhcyB0aGUgZG9jdW1lbnQgaXMgZnVsbHkgbG9hZGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gRW5hYmxlKCk6IHZvaWQge1xuICAgIHdoZW5SZWFkeShSZWxvYWQpO1xufVxuXG4vKipcbiAqIFJlbG9hZHMgdGhlIFdNTCBwYWdlIGJ5IGFkZGluZyBuZWNlc3NhcnkgZXZlbnQgbGlzdGVuZXJzIGFuZCBicm93c2VyIGxpc3RlbmVycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFJlbG9hZCgpOiB2b2lkIHtcbiAgICB0cmlnZ2VyUmVnaXN0cnkucmVzZXQoKTtcbiAgICBkb2N1bWVudC5ib2R5LnF1ZXJ5U2VsZWN0b3JBbGwoJ1t3bWwtZXZlbnRdLCBbd21sLXdpbmRvd10sIFt3bWwtb3BlbnVybF0sIFtkYXRhLXdtbC1ldmVudF0sIFtkYXRhLXdtbC13aW5kb3ddLCBbZGF0YS13bWwtb3BlbnVybF0nKS5mb3JFYWNoKGFkZFdNTExpc3RlbmVycyk7XG59XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbmltcG9ydCB7IG5ld1J1bnRpbWVDYWxsZXIsIG9iamVjdE5hbWVzIH0gZnJvbSBcIi4vcnVudGltZS5qc1wiO1xuXG5jb25zdCBjYWxsID0gbmV3UnVudGltZUNhbGxlcihvYmplY3ROYW1lcy5Ccm93c2VyKTtcblxuY29uc3QgQnJvd3Nlck9wZW5VUkwgPSAwO1xuXG4vKipcbiAqIE9wZW4gYSBicm93c2VyIHdpbmRvdyB0byB0aGUgZ2l2ZW4gVVJMLlxuICpcbiAqIEBwYXJhbSB1cmwgLSBUaGUgVVJMIHRvIG9wZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE9wZW5VUkwodXJsOiBzdHJpbmcgfCBVUkwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gY2FsbChCcm93c2VyT3BlblVSTCwge3VybDogdXJsLnRvU3RyaW5nKCl9KTtcbn1cbiIsICIvLyBTb3VyY2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9haS9uYW5vaWRcblxuLy8gVGhlIE1JVCBMaWNlbnNlIChNSVQpXG4vL1xuLy8gQ29weXJpZ2h0IDIwMTcgQW5kcmV5IFNpdG5payA8YW5kcmV5QHNpdG5pay5ydT5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mXG4vLyB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluXG4vLyB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvXG4vLyB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZlxuLy8gdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLFxuLy8gICAgIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vICAgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbi8vIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gICAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTXG4vLyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1Jcbi8vIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUlxuLy8gSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU5cbi8vIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIFRoaXMgYWxwaGFiZXQgdXNlcyBgQS1aYS16MC05Xy1gIHN5bWJvbHMuXG4vLyBUaGUgb3JkZXIgb2YgY2hhcmFjdGVycyBpcyBvcHRpbWl6ZWQgZm9yIGJldHRlciBnemlwIGFuZCBicm90bGkgY29tcHJlc3Npb24uXG4vLyBSZWZlcmVuY2VzIHRvIHRoZSBzYW1lIGZpbGUgKHdvcmtzIGJvdGggZm9yIGd6aXAgYW5kIGJyb3RsaSk6XG4vLyBgJ3VzZWAsIGBhbmRvbWAsIGFuZCBgcmljdCdgXG4vLyBSZWZlcmVuY2VzIHRvIHRoZSBicm90bGkgZGVmYXVsdCBkaWN0aW9uYXJ5OlxuLy8gYC0yNlRgLCBgMTk4M2AsIGA0MHB4YCwgYDc1cHhgLCBgYnVzaGAsIGBqYWNrYCwgYG1pbmRgLCBgdmVyeWAsIGFuZCBgd29sZmBcbmNvbnN0IHVybEFscGhhYmV0ID1cbiAgICAndXNlYW5kb20tMjZUMTk4MzQwUFg3NXB4SkFDS1ZFUllNSU5EQlVTSFdPTEZfR1FaYmZnaGprbHF2d3l6cmljdCdcblxuZXhwb3J0IGZ1bmN0aW9uIG5hbm9pZChzaXplOiBudW1iZXIgPSAyMSk6IHN0cmluZyB7XG4gICAgbGV0IGlkID0gJydcbiAgICAvLyBBIGNvbXBhY3QgYWx0ZXJuYXRpdmUgZm9yIGBmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXA7IGkrKylgLlxuICAgIGxldCBpID0gc2l6ZSB8IDBcbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgIC8vIGB8IDBgIGlzIG1vcmUgY29tcGFjdCBhbmQgZmFzdGVyIHRoYW4gYE1hdGguZmxvb3IoKWAuXG4gICAgICAgIGlkICs9IHVybEFscGhhYmV0WyhNYXRoLnJhbmRvbSgpICogNjQpIHwgMF1cbiAgICB9XG4gICAgcmV0dXJuIGlkXG59XG4iLCAiLypcbiBfICAgICBfXyAgICAgXyBfX1xufCB8ICAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbmltcG9ydCB7IG5hbm9pZCB9IGZyb20gJy4vbmFub2lkLmpzJztcblxuY29uc3QgcnVudGltZVVSTCA9IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4gKyBcIi93YWlscy9ydW50aW1lXCI7XG5cbi8vIE9iamVjdCBOYW1lc1xuZXhwb3J0IGNvbnN0IG9iamVjdE5hbWVzID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgQ2FsbDogMCxcbiAgICBDbGlwYm9hcmQ6IDEsXG4gICAgQXBwbGljYXRpb246IDIsXG4gICAgRXZlbnRzOiAzLFxuICAgIENvbnRleHRNZW51OiA0LFxuICAgIERpYWxvZzogNSxcbiAgICBXaW5kb3c6IDYsXG4gICAgU2NyZWVuczogNyxcbiAgICBTeXN0ZW06IDgsXG4gICAgQnJvd3NlcjogOSxcbiAgICBDYW5jZWxDYWxsOiAxMCxcbn0pO1xuZXhwb3J0IGxldCBjbGllbnRJZCA9IG5hbm9pZCgpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgcnVudGltZSBjYWxsZXIgd2l0aCBzcGVjaWZpZWQgSUQuXG4gKlxuICogQHBhcmFtIG9iamVjdCAtIFRoZSBvYmplY3QgdG8gaW52b2tlIHRoZSBtZXRob2Qgb24uXG4gKiBAcGFyYW0gd2luZG93TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB3aW5kb3cuXG4gKiBAcmV0dXJuIFRoZSBuZXcgcnVudGltZSBjYWxsZXIgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuZXdSdW50aW1lQ2FsbGVyKG9iamVjdDogbnVtYmVyLCB3aW5kb3dOYW1lOiBzdHJpbmcgPSAnJykge1xuICAgIHJldHVybiBmdW5jdGlvbiAobWV0aG9kOiBudW1iZXIsIGFyZ3M6IGFueSA9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHJ1bnRpbWVDYWxsV2l0aElEKG9iamVjdCwgbWV0aG9kLCB3aW5kb3dOYW1lLCBhcmdzKTtcbiAgICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW50aW1lQ2FsbFdpdGhJRChvYmplY3RJRDogbnVtYmVyLCBtZXRob2Q6IG51bWJlciwgd2luZG93TmFtZTogc3RyaW5nLCBhcmdzOiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgIGxldCB1cmwgPSBuZXcgVVJMKHJ1bnRpbWVVUkwpO1xuICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKFwib2JqZWN0XCIsIG9iamVjdElELnRvU3RyaW5nKCkpO1xuICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKFwibWV0aG9kXCIsIG1ldGhvZC50b1N0cmluZygpKTtcbiAgICBpZiAoYXJncykgeyB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChcImFyZ3NcIiwgSlNPTi5zdHJpbmdpZnkoYXJncykpOyB9XG5cbiAgICBsZXQgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgW1wieC13YWlscy1jbGllbnQtaWRcIl06IGNsaWVudElkXG4gICAgfVxuICAgIGlmICh3aW5kb3dOYW1lKSB7XG4gICAgICAgIGhlYWRlcnNbXCJ4LXdhaWxzLXdpbmRvdy1uYW1lXCJdID0gd2luZG93TmFtZTtcbiAgICB9XG5cbiAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHsgaGVhZGVycyB9KTtcbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihhd2FpdCByZXNwb25zZS50ZXh0KCkpO1xuICAgIH1cblxuICAgIGlmICgocmVzcG9uc2UuaGVhZGVycy5nZXQoXCJDb250ZW50LVR5cGVcIik/LmluZGV4T2YoXCJhcHBsaWNhdGlvbi9qc29uXCIpID8/IC0xKSAhPT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcmVzcG9uc2UudGV4dCgpO1xuICAgIH1cbn1cbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuaW1wb3J0IHtuZXdSdW50aW1lQ2FsbGVyLCBvYmplY3ROYW1lc30gZnJvbSBcIi4vcnVudGltZS5qc1wiO1xuaW1wb3J0IHsgbmFub2lkIH0gZnJvbSAnLi9uYW5vaWQuanMnO1xuXG4vLyBzZXR1cFxud2luZG93Ll93YWlscyA9IHdpbmRvdy5fd2FpbHMgfHwge307XG53aW5kb3cuX3dhaWxzLmRpYWxvZ0Vycm9yQ2FsbGJhY2sgPSBkaWFsb2dFcnJvckNhbGxiYWNrO1xud2luZG93Ll93YWlscy5kaWFsb2dSZXN1bHRDYWxsYmFjayA9IGRpYWxvZ1Jlc3VsdENhbGxiYWNrO1xuXG50eXBlIFByb21pc2VSZXNvbHZlcnMgPSBPbWl0PFByb21pc2VXaXRoUmVzb2x2ZXJzPGFueT4sIFwicHJvbWlzZVwiPjtcblxuY29uc3QgY2FsbCA9IG5ld1J1bnRpbWVDYWxsZXIob2JqZWN0TmFtZXMuRGlhbG9nKTtcbmNvbnN0IGRpYWxvZ1Jlc3BvbnNlcyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlUmVzb2x2ZXJzPigpO1xuXG4vLyBEZWZpbmUgY29uc3RhbnRzIGZyb20gdGhlIGBtZXRob2RzYCBvYmplY3QgaW4gVGl0bGUgQ2FzZVxuY29uc3QgRGlhbG9nSW5mbyA9IDA7XG5jb25zdCBEaWFsb2dXYXJuaW5nID0gMTtcbmNvbnN0IERpYWxvZ0Vycm9yID0gMjtcbmNvbnN0IERpYWxvZ1F1ZXN0aW9uID0gMztcbmNvbnN0IERpYWxvZ09wZW5GaWxlID0gNDtcbmNvbnN0IERpYWxvZ1NhdmVGaWxlID0gNTtcblxuZXhwb3J0IGludGVyZmFjZSBPcGVuRmlsZURpYWxvZ09wdGlvbnMge1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgZGlyZWN0b3JpZXMgY2FuIGJlIGNob3Nlbi4gKi9cbiAgICBDYW5DaG9vc2VEaXJlY3Rvcmllcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBmaWxlcyBjYW4gYmUgY2hvc2VuLiAqL1xuICAgIENhbkNob29zZUZpbGVzPzogYm9vbGVhbjtcbiAgICAvKiogSW5kaWNhdGVzIGlmIGRpcmVjdG9yaWVzIGNhbiBiZSBjcmVhdGVkLiAqL1xuICAgIENhbkNyZWF0ZURpcmVjdG9yaWVzPzogYm9vbGVhbjtcbiAgICAvKiogSW5kaWNhdGVzIGlmIGhpZGRlbiBmaWxlcyBzaG91bGQgYmUgc2hvd24uICovXG4gICAgU2hvd0hpZGRlbkZpbGVzPzogYm9vbGVhbjtcbiAgICAvKiogSW5kaWNhdGVzIGlmIGFsaWFzZXMgc2hvdWxkIGJlIHJlc29sdmVkLiAqL1xuICAgIFJlc29sdmVzQWxpYXNlcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBtdWx0aXBsZSBzZWxlY3Rpb24gaXMgYWxsb3dlZC4gKi9cbiAgICBBbGxvd3NNdWx0aXBsZVNlbGVjdGlvbj86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiB0aGUgZXh0ZW5zaW9uIHNob3VsZCBiZSBoaWRkZW4uICovXG4gICAgSGlkZUV4dGVuc2lvbj86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBoaWRkZW4gZXh0ZW5zaW9ucyBjYW4gYmUgc2VsZWN0ZWQuICovXG4gICAgQ2FuU2VsZWN0SGlkZGVuRXh0ZW5zaW9uPzogYm9vbGVhbjtcbiAgICAvKiogSW5kaWNhdGVzIGlmIGZpbGUgcGFja2FnZXMgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgZGlyZWN0b3JpZXMuICovXG4gICAgVHJlYXRzRmlsZVBhY2thZ2VzQXNEaXJlY3Rvcmllcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBvdGhlciBmaWxlIHR5cGVzIGFyZSBhbGxvd2VkLiAqL1xuICAgIEFsbG93c090aGVyRmlsZXR5cGVzPzogYm9vbGVhbjtcbiAgICAvKiogQXJyYXkgb2YgZmlsZSBmaWx0ZXJzLiAqL1xuICAgIEZpbHRlcnM/OiBGaWxlRmlsdGVyW107XG4gICAgLyoqIFRpdGxlIG9mIHRoZSBkaWFsb2cuICovXG4gICAgVGl0bGU/OiBzdHJpbmc7XG4gICAgLyoqIE1lc3NhZ2UgdG8gc2hvdyBpbiB0aGUgZGlhbG9nLiAqL1xuICAgIE1lc3NhZ2U/OiBzdHJpbmc7XG4gICAgLyoqIFRleHQgdG8gZGlzcGxheSBvbiB0aGUgYnV0dG9uLiAqL1xuICAgIEJ1dHRvblRleHQ/OiBzdHJpbmc7XG4gICAgLyoqIERpcmVjdG9yeSB0byBvcGVuIGluIHRoZSBkaWFsb2cuICovXG4gICAgRGlyZWN0b3J5Pzogc3RyaW5nO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgdGhlIGRpYWxvZyBzaG91bGQgYXBwZWFyIGRldGFjaGVkIGZyb20gdGhlIG1haW4gd2luZG93LiAqL1xuICAgIERldGFjaGVkPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTYXZlRmlsZURpYWxvZ09wdGlvbnMge1xuICAgIC8qKiBEZWZhdWx0IGZpbGVuYW1lIHRvIHVzZSBpbiB0aGUgZGlhbG9nLiAqL1xuICAgIEZpbGVuYW1lPzogc3RyaW5nO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgZGlyZWN0b3JpZXMgY2FuIGJlIGNob3Nlbi4gKi9cbiAgICBDYW5DaG9vc2VEaXJlY3Rvcmllcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBmaWxlcyBjYW4gYmUgY2hvc2VuLiAqL1xuICAgIENhbkNob29zZUZpbGVzPzogYm9vbGVhbjtcbiAgICAvKiogSW5kaWNhdGVzIGlmIGRpcmVjdG9yaWVzIGNhbiBiZSBjcmVhdGVkLiAqL1xuICAgIENhbkNyZWF0ZURpcmVjdG9yaWVzPzogYm9vbGVhbjtcbiAgICAvKiogSW5kaWNhdGVzIGlmIGhpZGRlbiBmaWxlcyBzaG91bGQgYmUgc2hvd24uICovXG4gICAgU2hvd0hpZGRlbkZpbGVzPzogYm9vbGVhbjtcbiAgICAvKiogSW5kaWNhdGVzIGlmIGFsaWFzZXMgc2hvdWxkIGJlIHJlc29sdmVkLiAqL1xuICAgIFJlc29sdmVzQWxpYXNlcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiB0aGUgZXh0ZW5zaW9uIHNob3VsZCBiZSBoaWRkZW4uICovXG4gICAgSGlkZUV4dGVuc2lvbj86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBoaWRkZW4gZXh0ZW5zaW9ucyBjYW4gYmUgc2VsZWN0ZWQuICovXG4gICAgQ2FuU2VsZWN0SGlkZGVuRXh0ZW5zaW9uPzogYm9vbGVhbjtcbiAgICAvKiogSW5kaWNhdGVzIGlmIGZpbGUgcGFja2FnZXMgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgZGlyZWN0b3JpZXMuICovXG4gICAgVHJlYXRzRmlsZVBhY2thZ2VzQXNEaXJlY3Rvcmllcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBvdGhlciBmaWxlIHR5cGVzIGFyZSBhbGxvd2VkLiAqL1xuICAgIEFsbG93c090aGVyRmlsZXR5cGVzPzogYm9vbGVhbjtcbiAgICAvKiogQXJyYXkgb2YgZmlsZSBmaWx0ZXJzLiAqL1xuICAgIEZpbHRlcnM/OiBGaWxlRmlsdGVyW107XG4gICAgLyoqIFRpdGxlIG9mIHRoZSBkaWFsb2cuICovXG4gICAgVGl0bGU/OiBzdHJpbmc7XG4gICAgLyoqIE1lc3NhZ2UgdG8gc2hvdyBpbiB0aGUgZGlhbG9nLiAqL1xuICAgIE1lc3NhZ2U/OiBzdHJpbmc7XG4gICAgLyoqIFRleHQgdG8gZGlzcGxheSBvbiB0aGUgYnV0dG9uLiAqL1xuICAgIEJ1dHRvblRleHQ/OiBzdHJpbmc7XG4gICAgLyoqIERpcmVjdG9yeSB0byBvcGVuIGluIHRoZSBkaWFsb2cuICovXG4gICAgRGlyZWN0b3J5Pzogc3RyaW5nO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgdGhlIGRpYWxvZyBzaG91bGQgYXBwZWFyIGRldGFjaGVkIGZyb20gdGhlIG1haW4gd2luZG93LiAqL1xuICAgIERldGFjaGVkPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNZXNzYWdlRGlhbG9nT3B0aW9ucyB7XG4gICAgLyoqIFRoZSB0aXRsZSBvZiB0aGUgZGlhbG9nIHdpbmRvdy4gKi9cbiAgICBUaXRsZT86IHN0cmluZztcbiAgICAvKiogVGhlIG1haW4gbWVzc2FnZSB0byBzaG93IGluIHRoZSBkaWFsb2cuICovXG4gICAgTWVzc2FnZT86IHN0cmluZztcbiAgICAvKiogQXJyYXkgb2YgYnV0dG9uIG9wdGlvbnMgdG8gc2hvdyBpbiB0aGUgZGlhbG9nLiAqL1xuICAgIEJ1dHRvbnM/OiBCdXR0b25bXTtcbiAgICAvKiogVHJ1ZSBpZiB0aGUgZGlhbG9nIHNob3VsZCBhcHBlYXIgZGV0YWNoZWQgZnJvbSB0aGUgbWFpbiB3aW5kb3cgKGlmIGFwcGxpY2FibGUpLiAqL1xuICAgIERldGFjaGVkPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCdXR0b24ge1xuICAgIC8qKiBUZXh0IHRoYXQgYXBwZWFycyB3aXRoaW4gdGhlIGJ1dHRvbi4gKi9cbiAgICBMYWJlbD86IHN0cmluZztcbiAgICAvKiogVHJ1ZSBpZiB0aGUgYnV0dG9uIHNob3VsZCBjYW5jZWwgYW4gb3BlcmF0aW9uIHdoZW4gY2xpY2tlZC4gKi9cbiAgICBJc0NhbmNlbD86IGJvb2xlYW47XG4gICAgLyoqIFRydWUgaWYgdGhlIGJ1dHRvbiBzaG91bGQgYmUgdGhlIGRlZmF1bHQgYWN0aW9uIHdoZW4gdGhlIHVzZXIgcHJlc3NlcyBlbnRlci4gKi9cbiAgICBJc0RlZmF1bHQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVGaWx0ZXIge1xuICAgIC8qKiBEaXNwbGF5IG5hbWUgZm9yIHRoZSBmaWx0ZXIsIGl0IGNvdWxkIGJlIFwiVGV4dCBGaWxlc1wiLCBcIkltYWdlc1wiIGV0Yy4gKi9cbiAgICBEaXNwbGF5TmFtZT86IHN0cmluZztcbiAgICAvKiogUGF0dGVybiB0byBtYXRjaCBmb3IgdGhlIGZpbHRlciwgZS5nLiBcIioudHh0OyoubWRcIiBmb3IgdGV4dCBtYXJrZG93biBmaWxlcy4gKi9cbiAgICBQYXR0ZXJuPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEhhbmRsZXMgdGhlIHJlc3VsdCBvZiBhIGRpYWxvZyByZXF1ZXN0LlxuICpcbiAqIEBwYXJhbSBpZCAtIFRoZSBpZCBvZiB0aGUgcmVxdWVzdCB0byBoYW5kbGUgdGhlIHJlc3VsdCBmb3IuXG4gKiBAcGFyYW0gZGF0YSAtIFRoZSByZXN1bHQgZGF0YSBvZiB0aGUgcmVxdWVzdC5cbiAqIEBwYXJhbSBpc0pTT04gLSBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZGF0YSBpcyBKU09OIG9yIG5vdC5cbiAqL1xuZnVuY3Rpb24gZGlhbG9nUmVzdWx0Q2FsbGJhY2soaWQ6IHN0cmluZywgZGF0YTogc3RyaW5nLCBpc0pTT046IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBsZXQgcmVzb2x2ZXJzID0gZ2V0QW5kRGVsZXRlUmVzcG9uc2UoaWQpO1xuICAgIGlmICghcmVzb2x2ZXJzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaXNKU09OKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXNvbHZlcnMucmVzb2x2ZShKU09OLnBhcnNlKGRhdGEpKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgICAgIHJlc29sdmVycy5yZWplY3QobmV3IFR5cGVFcnJvcihcImNvdWxkIG5vdCBwYXJzZSByZXN1bHQ6IFwiICsgZXJyLm1lc3NhZ2UsIHsgY2F1c2U6IGVyciB9KSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICByZXNvbHZlcnMucmVzb2x2ZShkYXRhKTtcbiAgICB9XG59XG5cbi8qKlxuICogSGFuZGxlcyB0aGUgZXJyb3IgZnJvbSBhIGRpYWxvZyByZXF1ZXN0LlxuICpcbiAqIEBwYXJhbSBpZCAtIFRoZSBpZCBvZiB0aGUgcHJvbWlzZSBoYW5kbGVyLlxuICogQHBhcmFtIG1lc3NhZ2UgLSBBbiBlcnJvciBtZXNzYWdlLlxuICovXG5mdW5jdGlvbiBkaWFsb2dFcnJvckNhbGxiYWNrKGlkOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgIGdldEFuZERlbGV0ZVJlc3BvbnNlKGlkKT8ucmVqZWN0KG5ldyB3aW5kb3cuRXJyb3IobWVzc2FnZSkpO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyBhbmQgcmVtb3ZlcyB0aGUgcmVzcG9uc2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBJRCBmcm9tIHRoZSBkaWFsb2dSZXNwb25zZXMgbWFwLlxuICpcbiAqIEBwYXJhbSBpZCAtIFRoZSBJRCBvZiB0aGUgcmVzcG9uc2UgdG8gYmUgcmV0cmlldmVkIGFuZCByZW1vdmVkLlxuICogQHJldHVybnMgVGhlIHJlc3BvbnNlIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIElELCBpZiBhbnkuXG4gKi9cbmZ1bmN0aW9uIGdldEFuZERlbGV0ZVJlc3BvbnNlKGlkOiBzdHJpbmcpOiBQcm9taXNlUmVzb2x2ZXJzIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZXNwb25zZSA9IGRpYWxvZ1Jlc3BvbnNlcy5nZXQoaWQpO1xuICAgIGRpYWxvZ1Jlc3BvbnNlcy5kZWxldGUoaWQpO1xuICAgIHJldHVybiByZXNwb25zZTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSB1bmlxdWUgSUQgdXNpbmcgdGhlIG5hbm9pZCBsaWJyYXJ5LlxuICpcbiAqIEByZXR1cm5zIEEgdW5pcXVlIElEIHRoYXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGRpYWxvZ1Jlc3BvbnNlcyBzZXQuXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlSUQoKTogc3RyaW5nIHtcbiAgICBsZXQgcmVzdWx0O1xuICAgIGRvIHtcbiAgICAgICAgcmVzdWx0ID0gbmFub2lkKCk7XG4gICAgfSB3aGlsZSAoZGlhbG9nUmVzcG9uc2VzLmhhcyhyZXN1bHQpKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFByZXNlbnRzIGEgZGlhbG9nIG9mIHNwZWNpZmllZCB0eXBlIHdpdGggdGhlIGdpdmVuIG9wdGlvbnMuXG4gKlxuICogQHBhcmFtIHR5cGUgLSBEaWFsb2cgdHlwZS5cbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyBmb3IgdGhlIGRpYWxvZy5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggcmVzdWx0IG9mIGRpYWxvZy5cbiAqL1xuZnVuY3Rpb24gZGlhbG9nKHR5cGU6IG51bWJlciwgb3B0aW9uczogTWVzc2FnZURpYWxvZ09wdGlvbnMgfCBPcGVuRmlsZURpYWxvZ09wdGlvbnMgfCBTYXZlRmlsZURpYWxvZ09wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgaWQgPSBnZW5lcmF0ZUlEKCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgZGlhbG9nUmVzcG9uc2VzLnNldChpZCwgeyByZXNvbHZlLCByZWplY3QgfSk7XG4gICAgICAgIGNhbGwodHlwZSwgT2JqZWN0LmFzc2lnbih7IFwiZGlhbG9nLWlkXCI6IGlkIH0sIG9wdGlvbnMpKS5jYXRjaCgoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGRpYWxvZ1Jlc3BvbnNlcy5kZWxldGUoaWQpO1xuICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIFByZXNlbnRzIGFuIGluZm8gZGlhbG9nLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gRGlhbG9nIG9wdGlvbnNcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGxhYmVsIG9mIHRoZSBjaG9zZW4gYnV0dG9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSW5mbyhvcHRpb25zOiBNZXNzYWdlRGlhbG9nT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7IHJldHVybiBkaWFsb2coRGlhbG9nSW5mbywgb3B0aW9ucyk7IH1cblxuLyoqXG4gKiBQcmVzZW50cyBhIHdhcm5pbmcgZGlhbG9nLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gRGlhbG9nIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBsYWJlbCBvZiB0aGUgY2hvc2VuIGJ1dHRvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFdhcm5pbmcob3B0aW9uczogTWVzc2FnZURpYWxvZ09wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4geyByZXR1cm4gZGlhbG9nKERpYWxvZ1dhcm5pbmcsIG9wdGlvbnMpOyB9XG5cbi8qKlxuICogUHJlc2VudHMgYW4gZXJyb3IgZGlhbG9nLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gRGlhbG9nIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBsYWJlbCBvZiB0aGUgY2hvc2VuIGJ1dHRvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEVycm9yKG9wdGlvbnM6IE1lc3NhZ2VEaWFsb2dPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHsgcmV0dXJuIGRpYWxvZyhEaWFsb2dFcnJvciwgb3B0aW9ucyk7IH1cblxuLyoqXG4gKiBQcmVzZW50cyBhIHF1ZXN0aW9uIGRpYWxvZy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIERpYWxvZyBvcHRpb25zLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgbGFiZWwgb2YgdGhlIGNob3NlbiBidXR0b24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBRdWVzdGlvbihvcHRpb25zOiBNZXNzYWdlRGlhbG9nT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7IHJldHVybiBkaWFsb2coRGlhbG9nUXVlc3Rpb24sIG9wdGlvbnMpOyB9XG5cbi8qKlxuICogUHJlc2VudHMgYSBmaWxlIHNlbGVjdGlvbiBkaWFsb2cgdG8gcGljayBvbmUgb3IgbW9yZSBmaWxlcyB0byBvcGVuLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gRGlhbG9nIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBTZWxlY3RlZCBmaWxlIG9yIGxpc3Qgb2YgZmlsZXMsIG9yIGEgYmxhbmsgc3RyaW5nL2VtcHR5IGxpc3QgaWYgbm8gZmlsZSBoYXMgYmVlbiBzZWxlY3RlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE9wZW5GaWxlKG9wdGlvbnM6IE9wZW5GaWxlRGlhbG9nT3B0aW9ucyAmIHsgQWxsb3dzTXVsdGlwbGVTZWxlY3Rpb246IHRydWUgfSk6IFByb21pc2U8c3RyaW5nW10+O1xuZXhwb3J0IGZ1bmN0aW9uIE9wZW5GaWxlKG9wdGlvbnM6IE9wZW5GaWxlRGlhbG9nT3B0aW9ucyAmIHsgQWxsb3dzTXVsdGlwbGVTZWxlY3Rpb24/OiBmYWxzZSB8IHVuZGVmaW5lZCB9KTogUHJvbWlzZTxzdHJpbmc+O1xuZXhwb3J0IGZ1bmN0aW9uIE9wZW5GaWxlKG9wdGlvbnM6IE9wZW5GaWxlRGlhbG9nT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nIHwgc3RyaW5nW10+O1xuZXhwb3J0IGZ1bmN0aW9uIE9wZW5GaWxlKG9wdGlvbnM6IE9wZW5GaWxlRGlhbG9nT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nIHwgc3RyaW5nW10+IHsgcmV0dXJuIGRpYWxvZyhEaWFsb2dPcGVuRmlsZSwgb3B0aW9ucykgPz8gW107IH1cblxuLyoqXG4gKiBQcmVzZW50cyBhIGZpbGUgc2VsZWN0aW9uIGRpYWxvZyB0byBwaWNrIGEgZmlsZSB0byBzYXZlLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gRGlhbG9nIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBTZWxlY3RlZCBmaWxlLCBvciBhIGJsYW5rIHN0cmluZyBpZiBubyBmaWxlIGhhcyBiZWVuIHNlbGVjdGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gU2F2ZUZpbGUob3B0aW9uczogU2F2ZUZpbGVEaWFsb2dPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHsgcmV0dXJuIGRpYWxvZyhEaWFsb2dTYXZlRmlsZSwgb3B0aW9ucyk7IH1cbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuaW1wb3J0IHsgbmV3UnVudGltZUNhbGxlciwgb2JqZWN0TmFtZXMgfSBmcm9tIFwiLi9ydW50aW1lLmpzXCI7XG5pbXBvcnQgeyBldmVudExpc3RlbmVycywgTGlzdGVuZXIsIGxpc3RlbmVyT2ZmIH0gZnJvbSBcIi4vbGlzdGVuZXIuanNcIjtcblxuLy8gU2V0dXBcbndpbmRvdy5fd2FpbHMgPSB3aW5kb3cuX3dhaWxzIHx8IHt9O1xud2luZG93Ll93YWlscy5kaXNwYXRjaFdhaWxzRXZlbnQgPSBkaXNwYXRjaFdhaWxzRXZlbnQ7XG5cbmNvbnN0IGNhbGwgPSBuZXdSdW50aW1lQ2FsbGVyKG9iamVjdE5hbWVzLkV2ZW50cyk7XG5jb25zdCBFbWl0TWV0aG9kID0gMDtcblxuZXhwb3J0IHsgVHlwZXMgfSBmcm9tIFwiLi9ldmVudF90eXBlcy5qc1wiO1xuXG4vKipcbiAqIFRoZSB0eXBlIG9mIGhhbmRsZXJzIGZvciBhIGdpdmVuIGV2ZW50LlxuICovXG5leHBvcnQgdHlwZSBDYWxsYmFjayA9IChldjogV2FpbHNFdmVudCkgPT4gdm9pZDtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgc3lzdGVtIGV2ZW50IG9yIGEgY3VzdG9tIGV2ZW50IGVtaXR0ZWQgdGhyb3VnaCB3YWlscy1wcm92aWRlZCBmYWNpbGl0aWVzLlxuICovXG5leHBvcnQgY2xhc3MgV2FpbHNFdmVudCB7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIE9wdGlvbmFsIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbWl0dGVkIGV2ZW50LlxuICAgICAqL1xuICAgIGRhdGE6IGFueTtcblxuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgdGhlIG9yaWdpbmF0aW5nIHdpbmRvdy4gT21pdHRlZCBmb3IgYXBwbGljYXRpb24gZXZlbnRzLlxuICAgICAqIFdpbGwgYmUgb3ZlcnJpZGRlbiBpZiBzZXQgbWFudWFsbHkuXG4gICAgICovXG4gICAgc2VuZGVyPzogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCBkYXRhOiBhbnkgPSBudWxsKSB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkaXNwYXRjaFdhaWxzRXZlbnQoZXZlbnQ6IGFueSkge1xuICAgIGxldCBsaXN0ZW5lcnMgPSBldmVudExpc3RlbmVycy5nZXQoZXZlbnQubmFtZSk7XG4gICAgaWYgKCFsaXN0ZW5lcnMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCB3YWlsc0V2ZW50ID0gbmV3IFdhaWxzRXZlbnQoZXZlbnQubmFtZSwgZXZlbnQuZGF0YSk7XG4gICAgaWYgKCdzZW5kZXInIGluIGV2ZW50KSB7XG4gICAgICAgIHdhaWxzRXZlbnQuc2VuZGVyID0gZXZlbnQuc2VuZGVyO1xuICAgIH1cblxuICAgIGxpc3RlbmVycyA9IGxpc3RlbmVycy5maWx0ZXIobGlzdGVuZXIgPT4gIWxpc3RlbmVyLmRpc3BhdGNoKHdhaWxzRXZlbnQpKTtcbiAgICBpZiAobGlzdGVuZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBldmVudExpc3RlbmVycy5kZWxldGUoZXZlbnQubmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZXZlbnRMaXN0ZW5lcnMuc2V0KGV2ZW50Lm5hbWUsIGxpc3RlbmVycyk7XG4gICAgfVxufVxuXG4vKipcbiAqIFJlZ2lzdGVyIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGZvciBhIHNwZWNpZmljIGV2ZW50LlxuICpcbiAqIEBwYXJhbSBldmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gcmVnaXN0ZXIgdGhlIGNhbGxiYWNrIGZvci5cbiAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlxuICogQHBhcmFtIG1heENhbGxiYWNrcyAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0aW1lcyB0aGUgY2FsbGJhY2sgY2FuIGJlIGNhbGxlZCBmb3IgdGhlIGV2ZW50LiBPbmNlIHRoZSBtYXhpbXVtIG51bWJlciBpcyByZWFjaGVkLCB0aGUgY2FsbGJhY2sgd2lsbCBubyBsb25nZXIgYmUgY2FsbGVkLlxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0LCB3aGVuIGNhbGxlZCwgd2lsbCB1bnJlZ2lzdGVyIHRoZSBjYWxsYmFjayBmcm9tIHRoZSBldmVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE9uTXVsdGlwbGUoZXZlbnROYW1lOiBzdHJpbmcsIGNhbGxiYWNrOiBDYWxsYmFjaywgbWF4Q2FsbGJhY2tzOiBudW1iZXIpIHtcbiAgICBsZXQgbGlzdGVuZXJzID0gZXZlbnRMaXN0ZW5lcnMuZ2V0KGV2ZW50TmFtZSkgfHwgW107XG4gICAgY29uc3QgdGhpc0xpc3RlbmVyID0gbmV3IExpc3RlbmVyKGV2ZW50TmFtZSwgY2FsbGJhY2ssIG1heENhbGxiYWNrcyk7XG4gICAgbGlzdGVuZXJzLnB1c2godGhpc0xpc3RlbmVyKTtcbiAgICBldmVudExpc3RlbmVycy5zZXQoZXZlbnROYW1lLCBsaXN0ZW5lcnMpO1xuICAgIHJldHVybiAoKSA9PiBsaXN0ZW5lck9mZih0aGlzTGlzdGVuZXIpO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIHNwZWNpZmllZCBldmVudCBvY2N1cnMuXG4gKlxuICogQHBhcmFtIGV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudCB0byByZWdpc3RlciB0aGUgY2FsbGJhY2sgZm9yLlxuICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQsIHdoZW4gY2FsbGVkLCB3aWxsIHVucmVnaXN0ZXIgdGhlIGNhbGxiYWNrIGZyb20gdGhlIGV2ZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gT24oZXZlbnROYW1lOiBzdHJpbmcsIGNhbGxiYWNrOiBDYWxsYmFjayk6ICgpID0+IHZvaWQge1xuICAgIHJldHVybiBPbk11bHRpcGxlKGV2ZW50TmFtZSwgY2FsbGJhY2ssIC0xKTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBvbmx5IG9uY2UgZm9yIHRoZSBzcGVjaWZpZWQgZXZlbnQuXG4gKlxuICogQHBhcmFtIGV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudCB0byByZWdpc3RlciB0aGUgY2FsbGJhY2sgZm9yLlxuICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQsIHdoZW4gY2FsbGVkLCB3aWxsIHVucmVnaXN0ZXIgdGhlIGNhbGxiYWNrIGZyb20gdGhlIGV2ZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gT25jZShldmVudE5hbWU6IHN0cmluZywgY2FsbGJhY2s6IENhbGxiYWNrKTogKCkgPT4gdm9pZCB7XG4gICAgcmV0dXJuIE9uTXVsdGlwbGUoZXZlbnROYW1lLCBjYWxsYmFjaywgMSk7XG59XG5cbi8qKlxuICogUmVtb3ZlcyBldmVudCBsaXN0ZW5lcnMgZm9yIHRoZSBzcGVjaWZpZWQgZXZlbnQgbmFtZXMuXG4gKlxuICogQHBhcmFtIGV2ZW50TmFtZXMgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnRzIHRvIHJlbW92ZSBsaXN0ZW5lcnMgZm9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gT2ZmKC4uLmV2ZW50TmFtZXM6IFtzdHJpbmcsIC4uLnN0cmluZ1tdXSk6IHZvaWQge1xuICAgIGV2ZW50TmFtZXMuZm9yRWFjaChldmVudE5hbWUgPT4gZXZlbnRMaXN0ZW5lcnMuZGVsZXRlKGV2ZW50TmFtZSkpO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgYWxsIGV2ZW50IGxpc3RlbmVycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE9mZkFsbCgpOiB2b2lkIHtcbiAgICBldmVudExpc3RlbmVycy5jbGVhcigpO1xufVxuXG4vKipcbiAqIEVtaXRzIHRoZSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0gZXZlbnQgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gZW1pdC5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgZnVsZmlsbGVkIG9uY2UgdGhlIGV2ZW50IGhhcyBiZWVuIGVtaXR0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFbWl0KGV2ZW50OiBXYWlsc0V2ZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIGNhbGwoRW1pdE1ldGhvZCwgZXZlbnQpO1xufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vLyBUaGUgZm9sbG93aW5nIHV0aWxpdGllcyBoYXZlIGJlZW4gZmFjdG9yZWQgb3V0IG9mIC4vZXZlbnRzLnRzXG4vLyBmb3IgdGVzdGluZyBwdXJwb3Nlcy5cblxuZXhwb3J0IGNvbnN0IGV2ZW50TGlzdGVuZXJzID0gbmV3IE1hcDxzdHJpbmcsIExpc3RlbmVyW10+KCk7XG5cbmV4cG9ydCBjbGFzcyBMaXN0ZW5lciB7XG4gICAgZXZlbnROYW1lOiBzdHJpbmc7XG4gICAgY2FsbGJhY2s6IChkYXRhOiBhbnkpID0+IHZvaWQ7XG4gICAgbWF4Q2FsbGJhY2tzOiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvcihldmVudE5hbWU6IHN0cmluZywgY2FsbGJhY2s6IChkYXRhOiBhbnkpID0+IHZvaWQsIG1heENhbGxiYWNrczogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuZXZlbnROYW1lID0gZXZlbnROYW1lO1xuICAgICAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgICAgIHRoaXMubWF4Q2FsbGJhY2tzID0gbWF4Q2FsbGJhY2tzIHx8IC0xO1xuICAgIH1cblxuICAgIGRpc3BhdGNoKGRhdGE6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5jYWxsYmFjayhkYXRhKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5tYXhDYWxsYmFja3MgPT09IC0xKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMubWF4Q2FsbGJhY2tzIC09IDE7XG4gICAgICAgIHJldHVybiB0aGlzLm1heENhbGxiYWNrcyA9PT0gMDtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsaXN0ZW5lck9mZihsaXN0ZW5lcjogTGlzdGVuZXIpOiB2b2lkIHtcbiAgICBsZXQgbGlzdGVuZXJzID0gZXZlbnRMaXN0ZW5lcnMuZ2V0KGxpc3RlbmVyLmV2ZW50TmFtZSk7XG4gICAgaWYgKCFsaXN0ZW5lcnMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxpc3RlbmVycyA9IGxpc3RlbmVycy5maWx0ZXIobCA9PiBsICE9PSBsaXN0ZW5lcik7XG4gICAgaWYgKGxpc3RlbmVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZXZlbnRMaXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyLmV2ZW50TmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZXZlbnRMaXN0ZW5lcnMuc2V0KGxpc3RlbmVyLmV2ZW50TmFtZSwgbGlzdGVuZXJzKTtcbiAgICB9XG59XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbi8vIEN5bmh5cmNod3lkIHkgZmZlaWwgaG9uIHluIGF3dG9tYXRpZy4gUEVJRElXQ0ggXHUwMEMyIE1PRElXTFxuLy8gVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkLiBETyBOT1QgRURJVFxuXG5leHBvcnQgY29uc3QgVHlwZXMgPSBPYmplY3QuZnJlZXplKHtcblx0V2luZG93czogT2JqZWN0LmZyZWV6ZSh7XG5cdFx0QVBNUG93ZXJTZXR0aW5nQ2hhbmdlOiBcIndpbmRvd3M6QVBNUG93ZXJTZXR0aW5nQ2hhbmdlXCIsXG5cdFx0QVBNUG93ZXJTdGF0dXNDaGFuZ2U6IFwid2luZG93czpBUE1Qb3dlclN0YXR1c0NoYW5nZVwiLFxuXHRcdEFQTVJlc3VtZUF1dG9tYXRpYzogXCJ3aW5kb3dzOkFQTVJlc3VtZUF1dG9tYXRpY1wiLFxuXHRcdEFQTVJlc3VtZVN1c3BlbmQ6IFwid2luZG93czpBUE1SZXN1bWVTdXNwZW5kXCIsXG5cdFx0QVBNU3VzcGVuZDogXCJ3aW5kb3dzOkFQTVN1c3BlbmRcIixcblx0XHRBcHBsaWNhdGlvblN0YXJ0ZWQ6IFwid2luZG93czpBcHBsaWNhdGlvblN0YXJ0ZWRcIixcblx0XHRTeXN0ZW1UaGVtZUNoYW5nZWQ6IFwid2luZG93czpTeXN0ZW1UaGVtZUNoYW5nZWRcIixcblx0XHRXZWJWaWV3TmF2aWdhdGlvbkNvbXBsZXRlZDogXCJ3aW5kb3dzOldlYlZpZXdOYXZpZ2F0aW9uQ29tcGxldGVkXCIsXG5cdFx0V2luZG93QWN0aXZlOiBcIndpbmRvd3M6V2luZG93QWN0aXZlXCIsXG5cdFx0V2luZG93QmFja2dyb3VuZEVyYXNlOiBcIndpbmRvd3M6V2luZG93QmFja2dyb3VuZEVyYXNlXCIsXG5cdFx0V2luZG93Q2xpY2tBY3RpdmU6IFwid2luZG93czpXaW5kb3dDbGlja0FjdGl2ZVwiLFxuXHRcdFdpbmRvd0Nsb3Npbmc6IFwid2luZG93czpXaW5kb3dDbG9zaW5nXCIsXG5cdFx0V2luZG93RGlkTW92ZTogXCJ3aW5kb3dzOldpbmRvd0RpZE1vdmVcIixcblx0XHRXaW5kb3dEaWRSZXNpemU6IFwid2luZG93czpXaW5kb3dEaWRSZXNpemVcIixcblx0XHRXaW5kb3dEUElDaGFuZ2VkOiBcIndpbmRvd3M6V2luZG93RFBJQ2hhbmdlZFwiLFxuXHRcdFdpbmRvd0RyYWdEcm9wOiBcIndpbmRvd3M6V2luZG93RHJhZ0Ryb3BcIixcblx0XHRXaW5kb3dEcmFnRW50ZXI6IFwid2luZG93czpXaW5kb3dEcmFnRW50ZXJcIixcblx0XHRXaW5kb3dEcmFnTGVhdmU6IFwid2luZG93czpXaW5kb3dEcmFnTGVhdmVcIixcblx0XHRXaW5kb3dEcmFnT3ZlcjogXCJ3aW5kb3dzOldpbmRvd0RyYWdPdmVyXCIsXG5cdFx0V2luZG93RW5kTW92ZTogXCJ3aW5kb3dzOldpbmRvd0VuZE1vdmVcIixcblx0XHRXaW5kb3dFbmRSZXNpemU6IFwid2luZG93czpXaW5kb3dFbmRSZXNpemVcIixcblx0XHRXaW5kb3dGdWxsc2NyZWVuOiBcIndpbmRvd3M6V2luZG93RnVsbHNjcmVlblwiLFxuXHRcdFdpbmRvd0hpZGU6IFwid2luZG93czpXaW5kb3dIaWRlXCIsXG5cdFx0V2luZG93SW5hY3RpdmU6IFwid2luZG93czpXaW5kb3dJbmFjdGl2ZVwiLFxuXHRcdFdpbmRvd0tleURvd246IFwid2luZG93czpXaW5kb3dLZXlEb3duXCIsXG5cdFx0V2luZG93S2V5VXA6IFwid2luZG93czpXaW5kb3dLZXlVcFwiLFxuXHRcdFdpbmRvd0tpbGxGb2N1czogXCJ3aW5kb3dzOldpbmRvd0tpbGxGb2N1c1wiLFxuXHRcdFdpbmRvd05vbkNsaWVudEhpdDogXCJ3aW5kb3dzOldpbmRvd05vbkNsaWVudEhpdFwiLFxuXHRcdFdpbmRvd05vbkNsaWVudE1vdXNlRG93bjogXCJ3aW5kb3dzOldpbmRvd05vbkNsaWVudE1vdXNlRG93blwiLFxuXHRcdFdpbmRvd05vbkNsaWVudE1vdXNlTGVhdmU6IFwid2luZG93czpXaW5kb3dOb25DbGllbnRNb3VzZUxlYXZlXCIsXG5cdFx0V2luZG93Tm9uQ2xpZW50TW91c2VNb3ZlOiBcIndpbmRvd3M6V2luZG93Tm9uQ2xpZW50TW91c2VNb3ZlXCIsXG5cdFx0V2luZG93Tm9uQ2xpZW50TW91c2VVcDogXCJ3aW5kb3dzOldpbmRvd05vbkNsaWVudE1vdXNlVXBcIixcblx0XHRXaW5kb3dQYWludDogXCJ3aW5kb3dzOldpbmRvd1BhaW50XCIsXG5cdFx0V2luZG93UmVzdG9yZTogXCJ3aW5kb3dzOldpbmRvd1Jlc3RvcmVcIixcblx0XHRXaW5kb3dTZXRGb2N1czogXCJ3aW5kb3dzOldpbmRvd1NldEZvY3VzXCIsXG5cdFx0V2luZG93U2hvdzogXCJ3aW5kb3dzOldpbmRvd1Nob3dcIixcblx0XHRXaW5kb3dTdGFydE1vdmU6IFwid2luZG93czpXaW5kb3dTdGFydE1vdmVcIixcblx0XHRXaW5kb3dTdGFydFJlc2l6ZTogXCJ3aW5kb3dzOldpbmRvd1N0YXJ0UmVzaXplXCIsXG5cdFx0V2luZG93VW5GdWxsc2NyZWVuOiBcIndpbmRvd3M6V2luZG93VW5GdWxsc2NyZWVuXCIsXG5cdFx0V2luZG93Wk9yZGVyQ2hhbmdlZDogXCJ3aW5kb3dzOldpbmRvd1pPcmRlckNoYW5nZWRcIixcblx0XHRXaW5kb3dNaW5pbWlzZTogXCJ3aW5kb3dzOldpbmRvd01pbmltaXNlXCIsXG5cdFx0V2luZG93VW5NaW5pbWlzZTogXCJ3aW5kb3dzOldpbmRvd1VuTWluaW1pc2VcIixcblx0XHRXaW5kb3dNYXhpbWlzZTogXCJ3aW5kb3dzOldpbmRvd01heGltaXNlXCIsXG5cdFx0V2luZG93VW5NYXhpbWlzZTogXCJ3aW5kb3dzOldpbmRvd1VuTWF4aW1pc2VcIixcblx0fSksXG5cdE1hYzogT2JqZWN0LmZyZWV6ZSh7XG5cdFx0QXBwbGljYXRpb25EaWRCZWNvbWVBY3RpdmU6IFwibWFjOkFwcGxpY2F0aW9uRGlkQmVjb21lQWN0aXZlXCIsXG5cdFx0QXBwbGljYXRpb25EaWRDaGFuZ2VCYWNraW5nUHJvcGVydGllczogXCJtYWM6QXBwbGljYXRpb25EaWRDaGFuZ2VCYWNraW5nUHJvcGVydGllc1wiLFxuXHRcdEFwcGxpY2F0aW9uRGlkQ2hhbmdlRWZmZWN0aXZlQXBwZWFyYW5jZTogXCJtYWM6QXBwbGljYXRpb25EaWRDaGFuZ2VFZmZlY3RpdmVBcHBlYXJhbmNlXCIsXG5cdFx0QXBwbGljYXRpb25EaWRDaGFuZ2VJY29uOiBcIm1hYzpBcHBsaWNhdGlvbkRpZENoYW5nZUljb25cIixcblx0XHRBcHBsaWNhdGlvbkRpZENoYW5nZU9jY2x1c2lvblN0YXRlOiBcIm1hYzpBcHBsaWNhdGlvbkRpZENoYW5nZU9jY2x1c2lvblN0YXRlXCIsXG5cdFx0QXBwbGljYXRpb25EaWRDaGFuZ2VTY3JlZW5QYXJhbWV0ZXJzOiBcIm1hYzpBcHBsaWNhdGlvbkRpZENoYW5nZVNjcmVlblBhcmFtZXRlcnNcIixcblx0XHRBcHBsaWNhdGlvbkRpZENoYW5nZVN0YXR1c0JhckZyYW1lOiBcIm1hYzpBcHBsaWNhdGlvbkRpZENoYW5nZVN0YXR1c0JhckZyYW1lXCIsXG5cdFx0QXBwbGljYXRpb25EaWRDaGFuZ2VTdGF0dXNCYXJPcmllbnRhdGlvbjogXCJtYWM6QXBwbGljYXRpb25EaWRDaGFuZ2VTdGF0dXNCYXJPcmllbnRhdGlvblwiLFxuXHRcdEFwcGxpY2F0aW9uRGlkQ2hhbmdlVGhlbWU6IFwibWFjOkFwcGxpY2F0aW9uRGlkQ2hhbmdlVGhlbWVcIixcblx0XHRBcHBsaWNhdGlvbkRpZEZpbmlzaExhdW5jaGluZzogXCJtYWM6QXBwbGljYXRpb25EaWRGaW5pc2hMYXVuY2hpbmdcIixcblx0XHRBcHBsaWNhdGlvbkRpZEhpZGU6IFwibWFjOkFwcGxpY2F0aW9uRGlkSGlkZVwiLFxuXHRcdEFwcGxpY2F0aW9uRGlkUmVzaWduQWN0aXZlOiBcIm1hYzpBcHBsaWNhdGlvbkRpZFJlc2lnbkFjdGl2ZVwiLFxuXHRcdEFwcGxpY2F0aW9uRGlkVW5oaWRlOiBcIm1hYzpBcHBsaWNhdGlvbkRpZFVuaGlkZVwiLFxuXHRcdEFwcGxpY2F0aW9uRGlkVXBkYXRlOiBcIm1hYzpBcHBsaWNhdGlvbkRpZFVwZGF0ZVwiLFxuXHRcdEFwcGxpY2F0aW9uU2hvdWxkSGFuZGxlUmVvcGVuOiBcIm1hYzpBcHBsaWNhdGlvblNob3VsZEhhbmRsZVJlb3BlblwiLFxuXHRcdEFwcGxpY2F0aW9uV2lsbEJlY29tZUFjdGl2ZTogXCJtYWM6QXBwbGljYXRpb25XaWxsQmVjb21lQWN0aXZlXCIsXG5cdFx0QXBwbGljYXRpb25XaWxsRmluaXNoTGF1bmNoaW5nOiBcIm1hYzpBcHBsaWNhdGlvbldpbGxGaW5pc2hMYXVuY2hpbmdcIixcblx0XHRBcHBsaWNhdGlvbldpbGxIaWRlOiBcIm1hYzpBcHBsaWNhdGlvbldpbGxIaWRlXCIsXG5cdFx0QXBwbGljYXRpb25XaWxsUmVzaWduQWN0aXZlOiBcIm1hYzpBcHBsaWNhdGlvbldpbGxSZXNpZ25BY3RpdmVcIixcblx0XHRBcHBsaWNhdGlvbldpbGxUZXJtaW5hdGU6IFwibWFjOkFwcGxpY2F0aW9uV2lsbFRlcm1pbmF0ZVwiLFxuXHRcdEFwcGxpY2F0aW9uV2lsbFVuaGlkZTogXCJtYWM6QXBwbGljYXRpb25XaWxsVW5oaWRlXCIsXG5cdFx0QXBwbGljYXRpb25XaWxsVXBkYXRlOiBcIm1hYzpBcHBsaWNhdGlvbldpbGxVcGRhdGVcIixcblx0XHRNZW51RGlkQWRkSXRlbTogXCJtYWM6TWVudURpZEFkZEl0ZW1cIixcblx0XHRNZW51RGlkQmVnaW5UcmFja2luZzogXCJtYWM6TWVudURpZEJlZ2luVHJhY2tpbmdcIixcblx0XHRNZW51RGlkQ2xvc2U6IFwibWFjOk1lbnVEaWRDbG9zZVwiLFxuXHRcdE1lbnVEaWREaXNwbGF5SXRlbTogXCJtYWM6TWVudURpZERpc3BsYXlJdGVtXCIsXG5cdFx0TWVudURpZEVuZFRyYWNraW5nOiBcIm1hYzpNZW51RGlkRW5kVHJhY2tpbmdcIixcblx0XHRNZW51RGlkSGlnaGxpZ2h0SXRlbTogXCJtYWM6TWVudURpZEhpZ2hsaWdodEl0ZW1cIixcblx0XHRNZW51RGlkT3BlbjogXCJtYWM6TWVudURpZE9wZW5cIixcblx0XHRNZW51RGlkUG9wVXA6IFwibWFjOk1lbnVEaWRQb3BVcFwiLFxuXHRcdE1lbnVEaWRSZW1vdmVJdGVtOiBcIm1hYzpNZW51RGlkUmVtb3ZlSXRlbVwiLFxuXHRcdE1lbnVEaWRTZW5kQWN0aW9uOiBcIm1hYzpNZW51RGlkU2VuZEFjdGlvblwiLFxuXHRcdE1lbnVEaWRTZW5kQWN0aW9uVG9JdGVtOiBcIm1hYzpNZW51RGlkU2VuZEFjdGlvblRvSXRlbVwiLFxuXHRcdE1lbnVEaWRVcGRhdGU6IFwibWFjOk1lbnVEaWRVcGRhdGVcIixcblx0XHRNZW51V2lsbEFkZEl0ZW06IFwibWFjOk1lbnVXaWxsQWRkSXRlbVwiLFxuXHRcdE1lbnVXaWxsQmVnaW5UcmFja2luZzogXCJtYWM6TWVudVdpbGxCZWdpblRyYWNraW5nXCIsXG5cdFx0TWVudVdpbGxEaXNwbGF5SXRlbTogXCJtYWM6TWVudVdpbGxEaXNwbGF5SXRlbVwiLFxuXHRcdE1lbnVXaWxsRW5kVHJhY2tpbmc6IFwibWFjOk1lbnVXaWxsRW5kVHJhY2tpbmdcIixcblx0XHRNZW51V2lsbEhpZ2hsaWdodEl0ZW06IFwibWFjOk1lbnVXaWxsSGlnaGxpZ2h0SXRlbVwiLFxuXHRcdE1lbnVXaWxsT3BlbjogXCJtYWM6TWVudVdpbGxPcGVuXCIsXG5cdFx0TWVudVdpbGxQb3BVcDogXCJtYWM6TWVudVdpbGxQb3BVcFwiLFxuXHRcdE1lbnVXaWxsUmVtb3ZlSXRlbTogXCJtYWM6TWVudVdpbGxSZW1vdmVJdGVtXCIsXG5cdFx0TWVudVdpbGxTZW5kQWN0aW9uOiBcIm1hYzpNZW51V2lsbFNlbmRBY3Rpb25cIixcblx0XHRNZW51V2lsbFNlbmRBY3Rpb25Ub0l0ZW06IFwibWFjOk1lbnVXaWxsU2VuZEFjdGlvblRvSXRlbVwiLFxuXHRcdE1lbnVXaWxsVXBkYXRlOiBcIm1hYzpNZW51V2lsbFVwZGF0ZVwiLFxuXHRcdFdlYlZpZXdEaWRDb21taXROYXZpZ2F0aW9uOiBcIm1hYzpXZWJWaWV3RGlkQ29tbWl0TmF2aWdhdGlvblwiLFxuXHRcdFdlYlZpZXdEaWRGaW5pc2hOYXZpZ2F0aW9uOiBcIm1hYzpXZWJWaWV3RGlkRmluaXNoTmF2aWdhdGlvblwiLFxuXHRcdFdlYlZpZXdEaWRSZWNlaXZlU2VydmVyUmVkaXJlY3RGb3JQcm92aXNpb25hbE5hdmlnYXRpb246IFwibWFjOldlYlZpZXdEaWRSZWNlaXZlU2VydmVyUmVkaXJlY3RGb3JQcm92aXNpb25hbE5hdmlnYXRpb25cIixcblx0XHRXZWJWaWV3RGlkU3RhcnRQcm92aXNpb25hbE5hdmlnYXRpb246IFwibWFjOldlYlZpZXdEaWRTdGFydFByb3Zpc2lvbmFsTmF2aWdhdGlvblwiLFxuXHRcdFdpbmRvd0RpZEJlY29tZUtleTogXCJtYWM6V2luZG93RGlkQmVjb21lS2V5XCIsXG5cdFx0V2luZG93RGlkQmVjb21lTWFpbjogXCJtYWM6V2luZG93RGlkQmVjb21lTWFpblwiLFxuXHRcdFdpbmRvd0RpZEJlZ2luU2hlZXQ6IFwibWFjOldpbmRvd0RpZEJlZ2luU2hlZXRcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VBbHBoYTogXCJtYWM6V2luZG93RGlkQ2hhbmdlQWxwaGFcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VCYWNraW5nTG9jYXRpb246IFwibWFjOldpbmRvd0RpZENoYW5nZUJhY2tpbmdMb2NhdGlvblwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZUJhY2tpbmdQcm9wZXJ0aWVzOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VCYWNraW5nUHJvcGVydGllc1wiLFxuXHRcdFdpbmRvd0RpZENoYW5nZUNvbGxlY3Rpb25CZWhhdmlvcjogXCJtYWM6V2luZG93RGlkQ2hhbmdlQ29sbGVjdGlvbkJlaGF2aW9yXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlRWZmZWN0aXZlQXBwZWFyYW5jZTogXCJtYWM6V2luZG93RGlkQ2hhbmdlRWZmZWN0aXZlQXBwZWFyYW5jZVwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZU9jY2x1c2lvblN0YXRlOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VPY2NsdXNpb25TdGF0ZVwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZU9yZGVyaW5nTW9kZTogXCJtYWM6V2luZG93RGlkQ2hhbmdlT3JkZXJpbmdNb2RlXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlU2NyZWVuOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VTY3JlZW5cIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VTY3JlZW5QYXJhbWV0ZXJzOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VTY3JlZW5QYXJhbWV0ZXJzXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlU2NyZWVuUHJvZmlsZTogXCJtYWM6V2luZG93RGlkQ2hhbmdlU2NyZWVuUHJvZmlsZVwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZVNjcmVlblNwYWNlOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VTY3JlZW5TcGFjZVwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZVNjcmVlblNwYWNlUHJvcGVydGllczogXCJtYWM6V2luZG93RGlkQ2hhbmdlU2NyZWVuU3BhY2VQcm9wZXJ0aWVzXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlU2hhcmluZ1R5cGU6IFwibWFjOldpbmRvd0RpZENoYW5nZVNoYXJpbmdUeXBlXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlU3BhY2U6IFwibWFjOldpbmRvd0RpZENoYW5nZVNwYWNlXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlU3BhY2VPcmRlcmluZ01vZGU6IFwibWFjOldpbmRvd0RpZENoYW5nZVNwYWNlT3JkZXJpbmdNb2RlXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlVGl0bGU6IFwibWFjOldpbmRvd0RpZENoYW5nZVRpdGxlXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlVG9vbGJhcjogXCJtYWM6V2luZG93RGlkQ2hhbmdlVG9vbGJhclwiLFxuXHRcdFdpbmRvd0RpZERlbWluaWF0dXJpemU6IFwibWFjOldpbmRvd0RpZERlbWluaWF0dXJpemVcIixcblx0XHRXaW5kb3dEaWRFbmRTaGVldDogXCJtYWM6V2luZG93RGlkRW5kU2hlZXRcIixcblx0XHRXaW5kb3dEaWRFbnRlckZ1bGxTY3JlZW46IFwibWFjOldpbmRvd0RpZEVudGVyRnVsbFNjcmVlblwiLFxuXHRcdFdpbmRvd0RpZEVudGVyVmVyc2lvbkJyb3dzZXI6IFwibWFjOldpbmRvd0RpZEVudGVyVmVyc2lvbkJyb3dzZXJcIixcblx0XHRXaW5kb3dEaWRFeGl0RnVsbFNjcmVlbjogXCJtYWM6V2luZG93RGlkRXhpdEZ1bGxTY3JlZW5cIixcblx0XHRXaW5kb3dEaWRFeGl0VmVyc2lvbkJyb3dzZXI6IFwibWFjOldpbmRvd0RpZEV4aXRWZXJzaW9uQnJvd3NlclwiLFxuXHRcdFdpbmRvd0RpZEV4cG9zZTogXCJtYWM6V2luZG93RGlkRXhwb3NlXCIsXG5cdFx0V2luZG93RGlkRm9jdXM6IFwibWFjOldpbmRvd0RpZEZvY3VzXCIsXG5cdFx0V2luZG93RGlkTWluaWF0dXJpemU6IFwibWFjOldpbmRvd0RpZE1pbmlhdHVyaXplXCIsXG5cdFx0V2luZG93RGlkTW92ZTogXCJtYWM6V2luZG93RGlkTW92ZVwiLFxuXHRcdFdpbmRvd0RpZE9yZGVyT2ZmU2NyZWVuOiBcIm1hYzpXaW5kb3dEaWRPcmRlck9mZlNjcmVlblwiLFxuXHRcdFdpbmRvd0RpZE9yZGVyT25TY3JlZW46IFwibWFjOldpbmRvd0RpZE9yZGVyT25TY3JlZW5cIixcblx0XHRXaW5kb3dEaWRSZXNpZ25LZXk6IFwibWFjOldpbmRvd0RpZFJlc2lnbktleVwiLFxuXHRcdFdpbmRvd0RpZFJlc2lnbk1haW46IFwibWFjOldpbmRvd0RpZFJlc2lnbk1haW5cIixcblx0XHRXaW5kb3dEaWRSZXNpemU6IFwibWFjOldpbmRvd0RpZFJlc2l6ZVwiLFxuXHRcdFdpbmRvd0RpZFVwZGF0ZTogXCJtYWM6V2luZG93RGlkVXBkYXRlXCIsXG5cdFx0V2luZG93RGlkVXBkYXRlQWxwaGE6IFwibWFjOldpbmRvd0RpZFVwZGF0ZUFscGhhXCIsXG5cdFx0V2luZG93RGlkVXBkYXRlQ29sbGVjdGlvbkJlaGF2aW9yOiBcIm1hYzpXaW5kb3dEaWRVcGRhdGVDb2xsZWN0aW9uQmVoYXZpb3JcIixcblx0XHRXaW5kb3dEaWRVcGRhdGVDb2xsZWN0aW9uUHJvcGVydGllczogXCJtYWM6V2luZG93RGlkVXBkYXRlQ29sbGVjdGlvblByb3BlcnRpZXNcIixcblx0XHRXaW5kb3dEaWRVcGRhdGVTaGFkb3c6IFwibWFjOldpbmRvd0RpZFVwZGF0ZVNoYWRvd1wiLFxuXHRcdFdpbmRvd0RpZFVwZGF0ZVRpdGxlOiBcIm1hYzpXaW5kb3dEaWRVcGRhdGVUaXRsZVwiLFxuXHRcdFdpbmRvd0RpZFVwZGF0ZVRvb2xiYXI6IFwibWFjOldpbmRvd0RpZFVwZGF0ZVRvb2xiYXJcIixcblx0XHRXaW5kb3dEaWRab29tOiBcIm1hYzpXaW5kb3dEaWRab29tXCIsXG5cdFx0V2luZG93RmlsZURyYWdnaW5nRW50ZXJlZDogXCJtYWM6V2luZG93RmlsZURyYWdnaW5nRW50ZXJlZFwiLFxuXHRcdFdpbmRvd0ZpbGVEcmFnZ2luZ0V4aXRlZDogXCJtYWM6V2luZG93RmlsZURyYWdnaW5nRXhpdGVkXCIsXG5cdFx0V2luZG93RmlsZURyYWdnaW5nUGVyZm9ybWVkOiBcIm1hYzpXaW5kb3dGaWxlRHJhZ2dpbmdQZXJmb3JtZWRcIixcblx0XHRXaW5kb3dIaWRlOiBcIm1hYzpXaW5kb3dIaWRlXCIsXG5cdFx0V2luZG93TWF4aW1pc2U6IFwibWFjOldpbmRvd01heGltaXNlXCIsXG5cdFx0V2luZG93VW5NYXhpbWlzZTogXCJtYWM6V2luZG93VW5NYXhpbWlzZVwiLFxuXHRcdFdpbmRvd01pbmltaXNlOiBcIm1hYzpXaW5kb3dNaW5pbWlzZVwiLFxuXHRcdFdpbmRvd1VuTWluaW1pc2U6IFwibWFjOldpbmRvd1VuTWluaW1pc2VcIixcblx0XHRXaW5kb3dTaG91bGRDbG9zZTogXCJtYWM6V2luZG93U2hvdWxkQ2xvc2VcIixcblx0XHRXaW5kb3dTaG93OiBcIm1hYzpXaW5kb3dTaG93XCIsXG5cdFx0V2luZG93V2lsbEJlY29tZUtleTogXCJtYWM6V2luZG93V2lsbEJlY29tZUtleVwiLFxuXHRcdFdpbmRvd1dpbGxCZWNvbWVNYWluOiBcIm1hYzpXaW5kb3dXaWxsQmVjb21lTWFpblwiLFxuXHRcdFdpbmRvd1dpbGxCZWdpblNoZWV0OiBcIm1hYzpXaW5kb3dXaWxsQmVnaW5TaGVldFwiLFxuXHRcdFdpbmRvd1dpbGxDaGFuZ2VPcmRlcmluZ01vZGU6IFwibWFjOldpbmRvd1dpbGxDaGFuZ2VPcmRlcmluZ01vZGVcIixcblx0XHRXaW5kb3dXaWxsQ2xvc2U6IFwibWFjOldpbmRvd1dpbGxDbG9zZVwiLFxuXHRcdFdpbmRvd1dpbGxEZW1pbmlhdHVyaXplOiBcIm1hYzpXaW5kb3dXaWxsRGVtaW5pYXR1cml6ZVwiLFxuXHRcdFdpbmRvd1dpbGxFbnRlckZ1bGxTY3JlZW46IFwibWFjOldpbmRvd1dpbGxFbnRlckZ1bGxTY3JlZW5cIixcblx0XHRXaW5kb3dXaWxsRW50ZXJWZXJzaW9uQnJvd3NlcjogXCJtYWM6V2luZG93V2lsbEVudGVyVmVyc2lvbkJyb3dzZXJcIixcblx0XHRXaW5kb3dXaWxsRXhpdEZ1bGxTY3JlZW46IFwibWFjOldpbmRvd1dpbGxFeGl0RnVsbFNjcmVlblwiLFxuXHRcdFdpbmRvd1dpbGxFeGl0VmVyc2lvbkJyb3dzZXI6IFwibWFjOldpbmRvd1dpbGxFeGl0VmVyc2lvbkJyb3dzZXJcIixcblx0XHRXaW5kb3dXaWxsRm9jdXM6IFwibWFjOldpbmRvd1dpbGxGb2N1c1wiLFxuXHRcdFdpbmRvd1dpbGxNaW5pYXR1cml6ZTogXCJtYWM6V2luZG93V2lsbE1pbmlhdHVyaXplXCIsXG5cdFx0V2luZG93V2lsbE1vdmU6IFwibWFjOldpbmRvd1dpbGxNb3ZlXCIsXG5cdFx0V2luZG93V2lsbE9yZGVyT2ZmU2NyZWVuOiBcIm1hYzpXaW5kb3dXaWxsT3JkZXJPZmZTY3JlZW5cIixcblx0XHRXaW5kb3dXaWxsT3JkZXJPblNjcmVlbjogXCJtYWM6V2luZG93V2lsbE9yZGVyT25TY3JlZW5cIixcblx0XHRXaW5kb3dXaWxsUmVzaWduTWFpbjogXCJtYWM6V2luZG93V2lsbFJlc2lnbk1haW5cIixcblx0XHRXaW5kb3dXaWxsUmVzaXplOiBcIm1hYzpXaW5kb3dXaWxsUmVzaXplXCIsXG5cdFx0V2luZG93V2lsbFVuZm9jdXM6IFwibWFjOldpbmRvd1dpbGxVbmZvY3VzXCIsXG5cdFx0V2luZG93V2lsbFVwZGF0ZTogXCJtYWM6V2luZG93V2lsbFVwZGF0ZVwiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGVBbHBoYTogXCJtYWM6V2luZG93V2lsbFVwZGF0ZUFscGhhXCIsXG5cdFx0V2luZG93V2lsbFVwZGF0ZUNvbGxlY3Rpb25CZWhhdmlvcjogXCJtYWM6V2luZG93V2lsbFVwZGF0ZUNvbGxlY3Rpb25CZWhhdmlvclwiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGVDb2xsZWN0aW9uUHJvcGVydGllczogXCJtYWM6V2luZG93V2lsbFVwZGF0ZUNvbGxlY3Rpb25Qcm9wZXJ0aWVzXCIsXG5cdFx0V2luZG93V2lsbFVwZGF0ZVNoYWRvdzogXCJtYWM6V2luZG93V2lsbFVwZGF0ZVNoYWRvd1wiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGVUaXRsZTogXCJtYWM6V2luZG93V2lsbFVwZGF0ZVRpdGxlXCIsXG5cdFx0V2luZG93V2lsbFVwZGF0ZVRvb2xiYXI6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVUb29sYmFyXCIsXG5cdFx0V2luZG93V2lsbFVwZGF0ZVZpc2liaWxpdHk6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVWaXNpYmlsaXR5XCIsXG5cdFx0V2luZG93V2lsbFVzZVN0YW5kYXJkRnJhbWU6IFwibWFjOldpbmRvd1dpbGxVc2VTdGFuZGFyZEZyYW1lXCIsXG5cdFx0V2luZG93Wm9vbUluOiBcIm1hYzpXaW5kb3dab29tSW5cIixcblx0XHRXaW5kb3dab29tT3V0OiBcIm1hYzpXaW5kb3dab29tT3V0XCIsXG5cdFx0V2luZG93Wm9vbVJlc2V0OiBcIm1hYzpXaW5kb3dab29tUmVzZXRcIixcblx0fSksXG5cdExpbnV4OiBPYmplY3QuZnJlZXplKHtcblx0XHRBcHBsaWNhdGlvblN0YXJ0dXA6IFwibGludXg6QXBwbGljYXRpb25TdGFydHVwXCIsXG5cdFx0U3lzdGVtVGhlbWVDaGFuZ2VkOiBcImxpbnV4OlN5c3RlbVRoZW1lQ2hhbmdlZFwiLFxuXHRcdFdpbmRvd0RlbGV0ZUV2ZW50OiBcImxpbnV4OldpbmRvd0RlbGV0ZUV2ZW50XCIsXG5cdFx0V2luZG93RGlkTW92ZTogXCJsaW51eDpXaW5kb3dEaWRNb3ZlXCIsXG5cdFx0V2luZG93RGlkUmVzaXplOiBcImxpbnV4OldpbmRvd0RpZFJlc2l6ZVwiLFxuXHRcdFdpbmRvd0ZvY3VzSW46IFwibGludXg6V2luZG93Rm9jdXNJblwiLFxuXHRcdFdpbmRvd0ZvY3VzT3V0OiBcImxpbnV4OldpbmRvd0ZvY3VzT3V0XCIsXG5cdFx0V2luZG93TG9hZENoYW5nZWQ6IFwibGludXg6V2luZG93TG9hZENoYW5nZWRcIixcblx0fSksXG5cdENvbW1vbjogT2JqZWN0LmZyZWV6ZSh7XG5cdFx0QXBwbGljYXRpb25PcGVuZWRXaXRoRmlsZTogXCJjb21tb246QXBwbGljYXRpb25PcGVuZWRXaXRoRmlsZVwiLFxuXHRcdEFwcGxpY2F0aW9uU3RhcnRlZDogXCJjb21tb246QXBwbGljYXRpb25TdGFydGVkXCIsXG5cdFx0VGhlbWVDaGFuZ2VkOiBcImNvbW1vbjpUaGVtZUNoYW5nZWRcIixcblx0XHRXaW5kb3dDbG9zaW5nOiBcImNvbW1vbjpXaW5kb3dDbG9zaW5nXCIsXG5cdFx0V2luZG93RGlkTW92ZTogXCJjb21tb246V2luZG93RGlkTW92ZVwiLFxuXHRcdFdpbmRvd0RpZFJlc2l6ZTogXCJjb21tb246V2luZG93RGlkUmVzaXplXCIsXG5cdFx0V2luZG93RFBJQ2hhbmdlZDogXCJjb21tb246V2luZG93RFBJQ2hhbmdlZFwiLFxuXHRcdFdpbmRvd0ZpbGVzRHJvcHBlZDogXCJjb21tb246V2luZG93RmlsZXNEcm9wcGVkXCIsXG5cdFx0V2luZG93Rm9jdXM6IFwiY29tbW9uOldpbmRvd0ZvY3VzXCIsXG5cdFx0V2luZG93RnVsbHNjcmVlbjogXCJjb21tb246V2luZG93RnVsbHNjcmVlblwiLFxuXHRcdFdpbmRvd0hpZGU6IFwiY29tbW9uOldpbmRvd0hpZGVcIixcblx0XHRXaW5kb3dMb3N0Rm9jdXM6IFwiY29tbW9uOldpbmRvd0xvc3RGb2N1c1wiLFxuXHRcdFdpbmRvd01heGltaXNlOiBcImNvbW1vbjpXaW5kb3dNYXhpbWlzZVwiLFxuXHRcdFdpbmRvd01pbmltaXNlOiBcImNvbW1vbjpXaW5kb3dNaW5pbWlzZVwiLFxuXHRcdFdpbmRvd1Jlc3RvcmU6IFwiY29tbW9uOldpbmRvd1Jlc3RvcmVcIixcblx0XHRXaW5kb3dSdW50aW1lUmVhZHk6IFwiY29tbW9uOldpbmRvd1J1bnRpbWVSZWFkeVwiLFxuXHRcdFdpbmRvd1Nob3c6IFwiY29tbW9uOldpbmRvd1Nob3dcIixcblx0XHRXaW5kb3dVbkZ1bGxzY3JlZW46IFwiY29tbW9uOldpbmRvd1VuRnVsbHNjcmVlblwiLFxuXHRcdFdpbmRvd1VuTWF4aW1pc2U6IFwiY29tbW9uOldpbmRvd1VuTWF4aW1pc2VcIixcblx0XHRXaW5kb3dVbk1pbmltaXNlOiBcImNvbW1vbjpXaW5kb3dVbk1pbmltaXNlXCIsXG5cdFx0V2luZG93Wm9vbTogXCJjb21tb246V2luZG93Wm9vbVwiLFxuXHRcdFdpbmRvd1pvb21JbjogXCJjb21tb246V2luZG93Wm9vbUluXCIsXG5cdFx0V2luZG93Wm9vbU91dDogXCJjb21tb246V2luZG93Wm9vbU91dFwiLFxuXHRcdFdpbmRvd1pvb21SZXNldDogXCJjb21tb246V2luZG93Wm9vbVJlc2V0XCIsXG5cdH0pLFxufSk7XG4iLCAiLypcbiBfICAgICBfXyAgICAgXyBfX1xufCB8ICAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbi8qKlxuICogTG9ncyBhIG1lc3NhZ2UgdG8gdGhlIGNvbnNvbGUgd2l0aCBjdXN0b20gZm9ybWF0dGluZy5cbiAqXG4gKiBAcGFyYW0gbWVzc2FnZSAtIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlYnVnTG9nKG1lc3NhZ2U6IGFueSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAnJWMgd2FpbHMzICVjICcgKyBtZXNzYWdlICsgJyAnLFxuICAgICAgICAnYmFja2dyb3VuZDogI2FhMDAwMDsgY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDNweCAwcHggMHB4IDNweDsgcGFkZGluZzogMXB4OyBmb250LXNpemU6IDAuN3JlbScsXG4gICAgICAgICdiYWNrZ3JvdW5kOiAjMDA5OTAwOyBjb2xvcjogI2ZmZjsgYm9yZGVyLXJhZGl1czogMHB4IDNweCAzcHggMHB4OyBwYWRkaW5nOiAxcHg7IGZvbnQtc2l6ZTogMC43cmVtJ1xuICAgICk7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIHdlYnZpZXcgc3VwcG9ydHMgdGhlIHtAbGluayBNb3VzZUV2ZW50I2J1dHRvbnN9IHByb3BlcnR5LlxuICogTG9va2luZyBhdCB5b3UgbWFjT1MgSGlnaCBTaWVycmEhXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYW5UcmFja0J1dHRvbnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChuZXcgTW91c2VFdmVudCgnbW91c2Vkb3duJykpLmJ1dHRvbnMgPT09IDA7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIGJyb3dzZXIgc3VwcG9ydHMgcmVtb3ZpbmcgbGlzdGVuZXJzIGJ5IHRyaWdnZXJpbmcgYW4gQWJvcnRTaWduYWxcbiAqIChzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0V2ZW50VGFyZ2V0L2FkZEV2ZW50TGlzdGVuZXIjc2lnbmFsKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbkFib3J0TGlzdGVuZXJzKCkge1xuICAgIGlmICghRXZlbnRUYXJnZXQgfHwgIUFib3J0U2lnbmFsIHx8ICFBYm9ydENvbnRyb2xsZXIpXG4gICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIGxldCByZXN1bHQgPSB0cnVlO1xuXG4gICAgY29uc3QgdGFyZ2V0ID0gbmV3IEV2ZW50VGFyZ2V0KCk7XG4gICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigndGVzdCcsICgpID0+IHsgcmVzdWx0ID0gZmFsc2U7IH0sIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9KTtcbiAgICBjb250cm9sbGVyLmFib3J0KCk7XG4gICAgdGFyZ2V0LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCd0ZXN0JykpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqKlxuIFRoaXMgdGVjaG5pcXVlIGZvciBwcm9wZXIgbG9hZCBkZXRlY3Rpb24gaXMgdGFrZW4gZnJvbSBIVE1YOlxuXG4gQlNEIDItQ2xhdXNlIExpY2Vuc2VcblxuIENvcHlyaWdodCAoYykgMjAyMCwgQmlnIFNreSBTb2Z0d2FyZVxuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cbiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcblxuIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuXG4gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb25cbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cblxuIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4gQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEVcbiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTFxuIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SXG4gU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVJcbiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLFxuIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFXG4gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cblxuICoqKi9cblxubGV0IGlzUmVhZHkgPSBmYWxzZTtcbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB7IGlzUmVhZHkgPSB0cnVlIH0pO1xuXG5leHBvcnQgZnVuY3Rpb24gd2hlblJlYWR5KGNhbGxiYWNrOiAoKSA9PiB2b2lkKSB7XG4gICAgaWYgKGlzUmVhZHkgfHwgZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJykge1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBjYWxsYmFjayk7XG4gICAgfVxufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5pbXBvcnQge25ld1J1bnRpbWVDYWxsZXIsIG9iamVjdE5hbWVzfSBmcm9tIFwiLi9ydW50aW1lLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNjcmVlbiB9IGZyb20gXCIuL3NjcmVlbnMuanNcIjtcblxuY29uc3QgUG9zaXRpb25NZXRob2QgICAgICAgICAgICAgICAgICAgID0gMDtcbmNvbnN0IENlbnRlck1ldGhvZCAgICAgICAgICAgICAgICAgICAgICA9IDE7XG5jb25zdCBDbG9zZU1ldGhvZCAgICAgICAgICAgICAgICAgICAgICAgPSAyO1xuY29uc3QgRGlzYWJsZVNpemVDb25zdHJhaW50c01ldGhvZCAgICAgID0gMztcbmNvbnN0IEVuYWJsZVNpemVDb25zdHJhaW50c01ldGhvZCAgICAgICA9IDQ7XG5jb25zdCBGb2N1c01ldGhvZCAgICAgICAgICAgICAgICAgICAgICAgPSA1O1xuY29uc3QgRm9yY2VSZWxvYWRNZXRob2QgICAgICAgICAgICAgICAgID0gNjtcbmNvbnN0IEZ1bGxzY3JlZW5NZXRob2QgICAgICAgICAgICAgICAgICA9IDc7XG5jb25zdCBHZXRTY3JlZW5NZXRob2QgICAgICAgICAgICAgICAgICAgPSA4O1xuY29uc3QgR2V0Wm9vbU1ldGhvZCAgICAgICAgICAgICAgICAgICAgID0gOTtcbmNvbnN0IEhlaWdodE1ldGhvZCAgICAgICAgICAgICAgICAgICAgICA9IDEwO1xuY29uc3QgSGlkZU1ldGhvZCAgICAgICAgICAgICAgICAgICAgICAgID0gMTE7XG5jb25zdCBJc0ZvY3VzZWRNZXRob2QgICAgICAgICAgICAgICAgICAgPSAxMjtcbmNvbnN0IElzRnVsbHNjcmVlbk1ldGhvZCAgICAgICAgICAgICAgICA9IDEzO1xuY29uc3QgSXNNYXhpbWlzZWRNZXRob2QgICAgICAgICAgICAgICAgID0gMTQ7XG5jb25zdCBJc01pbmltaXNlZE1ldGhvZCAgICAgICAgICAgICAgICAgPSAxNTtcbmNvbnN0IE1heGltaXNlTWV0aG9kICAgICAgICAgICAgICAgICAgICA9IDE2O1xuY29uc3QgTWluaW1pc2VNZXRob2QgICAgICAgICAgICAgICAgICAgID0gMTc7XG5jb25zdCBOYW1lTWV0aG9kICAgICAgICAgICAgICAgICAgICAgICAgPSAxODtcbmNvbnN0IE9wZW5EZXZUb29sc01ldGhvZCAgICAgICAgICAgICAgICA9IDE5O1xuY29uc3QgUmVsYXRpdmVQb3NpdGlvbk1ldGhvZCAgICAgICAgICAgID0gMjA7XG5jb25zdCBSZWxvYWRNZXRob2QgICAgICAgICAgICAgICAgICAgICAgPSAyMTtcbmNvbnN0IFJlc2l6YWJsZU1ldGhvZCAgICAgICAgICAgICAgICAgICA9IDIyO1xuY29uc3QgUmVzdG9yZU1ldGhvZCAgICAgICAgICAgICAgICAgICAgID0gMjM7XG5jb25zdCBTZXRQb3NpdGlvbk1ldGhvZCAgICAgICAgICAgICAgICAgPSAyNDtcbmNvbnN0IFNldEFsd2F5c09uVG9wTWV0aG9kICAgICAgICAgICAgICA9IDI1O1xuY29uc3QgU2V0QmFja2dyb3VuZENvbG91ck1ldGhvZCAgICAgICAgID0gMjY7XG5jb25zdCBTZXRGcmFtZWxlc3NNZXRob2QgICAgICAgICAgICAgICAgPSAyNztcbmNvbnN0IFNldEZ1bGxzY3JlZW5CdXR0b25FbmFibGVkTWV0aG9kICA9IDI4O1xuY29uc3QgU2V0TWF4U2l6ZU1ldGhvZCAgICAgICAgICAgICAgICAgID0gMjk7XG5jb25zdCBTZXRNaW5TaXplTWV0aG9kICAgICAgICAgICAgICAgICAgPSAzMDtcbmNvbnN0IFNldFJlbGF0aXZlUG9zaXRpb25NZXRob2QgICAgICAgICA9IDMxO1xuY29uc3QgU2V0UmVzaXphYmxlTWV0aG9kICAgICAgICAgICAgICAgID0gMzI7XG5jb25zdCBTZXRTaXplTWV0aG9kICAgICAgICAgICAgICAgICAgICAgPSAzMztcbmNvbnN0IFNldFRpdGxlTWV0aG9kICAgICAgICAgICAgICAgICAgICA9IDM0O1xuY29uc3QgU2V0Wm9vbU1ldGhvZCAgICAgICAgICAgICAgICAgICAgID0gMzU7XG5jb25zdCBTaG93TWV0aG9kICAgICAgICAgICAgICAgICAgICAgICAgPSAzNjtcbmNvbnN0IFNpemVNZXRob2QgICAgICAgICAgICAgICAgICAgICAgICA9IDM3O1xuY29uc3QgVG9nZ2xlRnVsbHNjcmVlbk1ldGhvZCAgICAgICAgICAgID0gMzg7XG5jb25zdCBUb2dnbGVNYXhpbWlzZU1ldGhvZCAgICAgICAgICAgICAgPSAzOTtcbmNvbnN0IFVuRnVsbHNjcmVlbk1ldGhvZCAgICAgICAgICAgICAgICA9IDQwO1xuY29uc3QgVW5NYXhpbWlzZU1ldGhvZCAgICAgICAgICAgICAgICAgID0gNDE7XG5jb25zdCBVbk1pbmltaXNlTWV0aG9kICAgICAgICAgICAgICAgICAgPSA0MjtcbmNvbnN0IFdpZHRoTWV0aG9kICAgICAgICAgICAgICAgICAgICAgICA9IDQzO1xuY29uc3QgWm9vbU1ldGhvZCAgICAgICAgICAgICAgICAgICAgICAgID0gNDQ7XG5jb25zdCBab29tSW5NZXRob2QgICAgICAgICAgICAgICAgICAgICAgPSA0NTtcbmNvbnN0IFpvb21PdXRNZXRob2QgICAgICAgICAgICAgICAgICAgICA9IDQ2O1xuY29uc3QgWm9vbVJlc2V0TWV0aG9kICAgICAgICAgICAgICAgICAgID0gNDc7XG5cbi8qKlxuICogQSByZWNvcmQgZGVzY3JpYmluZyB0aGUgcG9zaXRpb24gb2YgYSB3aW5kb3cuXG4gKi9cbmludGVyZmFjZSBQb3NpdGlvbiB7XG4gICAgLyoqIFRoZSBob3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoZSB3aW5kb3cuICovXG4gICAgeDogbnVtYmVyO1xuICAgIC8qKiBUaGUgdmVydGljYWwgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy4gKi9cbiAgICB5OiBudW1iZXI7XG59XG5cbi8qKlxuICogQSByZWNvcmQgZGVzY3JpYmluZyB0aGUgc2l6ZSBvZiBhIHdpbmRvdy5cbiAqL1xuaW50ZXJmYWNlIFNpemUge1xuICAgIC8qKiBUaGUgd2lkdGggb2YgdGhlIHdpbmRvdy4gKi9cbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIC8qKiBUaGUgaGVpZ2h0IG9mIHRoZSB3aW5kb3cuICovXG4gICAgaGVpZ2h0OiBudW1iZXI7XG59XG5cbi8vIFByaXZhdGUgZmllbGQgbmFtZXMuXG5jb25zdCBjYWxsZXJTeW0gPSBTeW1ib2woXCJjYWxsZXJcIik7XG5cbmNsYXNzIFdpbmRvdyB7XG4gICAgLy8gUHJpdmF0ZSBmaWVsZHMuXG4gICAgcHJpdmF0ZSBbY2FsbGVyU3ltXTogKG1lc3NhZ2U6IG51bWJlciwgYXJncz86IGFueSkgPT4gUHJvbWlzZTxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGlzZXMgYSB3aW5kb3cgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YXJnZXQgd2luZG93LlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZyA9ICcnKSB7XG4gICAgICAgIHRoaXNbY2FsbGVyU3ltXSA9IG5ld1J1bnRpbWVDYWxsZXIob2JqZWN0TmFtZXMuV2luZG93LCBuYW1lKVxuXG4gICAgICAgIC8vIGJpbmQgaW5zdGFuY2UgbWV0aG9kIHRvIG1ha2UgdGhlbSBlYXNpbHkgdXNhYmxlIGluIGV2ZW50IGhhbmRsZXJzXG4gICAgICAgIGZvciAoY29uc3QgbWV0aG9kIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKFdpbmRvdy5wcm90b3R5cGUpKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgbWV0aG9kICE9PSBcImNvbnN0cnVjdG9yXCJcbiAgICAgICAgICAgICAgICAmJiB0eXBlb2YgKHRoaXMgYXMgYW55KVttZXRob2RdID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICh0aGlzIGFzIGFueSlbbWV0aG9kXSA9ICh0aGlzIGFzIGFueSlbbWV0aG9kXS5iaW5kKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgc3BlY2lmaWVkIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHdpbmRvdyB0byBnZXQuXG4gICAgICogQHJldHVybnMgVGhlIGNvcnJlc3BvbmRpbmcgd2luZG93IG9iamVjdC5cbiAgICAgKi9cbiAgICBHZXQobmFtZTogc3RyaW5nKTogV2luZG93IHtcbiAgICAgICAgcmV0dXJuIG5ldyBXaW5kb3cobmFtZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IGFic29sdXRlIHBvc2l0aW9uIG9mIHRoZSB3aW5kb3cuXG4gICAgICovXG4gICAgUG9zaXRpb24oKTogUHJvbWlzZTxQb3NpdGlvbj4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFBvc2l0aW9uTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDZW50ZXJzIHRoZSB3aW5kb3cgb24gdGhlIHNjcmVlbi5cbiAgICAgKi9cbiAgICBDZW50ZXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oQ2VudGVyTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBDbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShDbG9zZU1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZXMgbWluL21heCBzaXplIGNvbnN0cmFpbnRzLlxuICAgICAqL1xuICAgIERpc2FibGVTaXplQ29uc3RyYWludHMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oRGlzYWJsZVNpemVDb25zdHJhaW50c01ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyBtaW4vbWF4IHNpemUgY29uc3RyYWludHMuXG4gICAgICovXG4gICAgRW5hYmxlU2l6ZUNvbnN0cmFpbnRzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEVuYWJsZVNpemVDb25zdHJhaW50c01ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9jdXNlcyB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIEZvY3VzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEZvY3VzTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JjZXMgdGhlIHdpbmRvdyB0byByZWxvYWQgdGhlIHBhZ2UgYXNzZXRzLlxuICAgICAqL1xuICAgIEZvcmNlUmVsb2FkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEZvcmNlUmVsb2FkTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTd2l0Y2hlcyB0aGUgd2luZG93IHRvIGZ1bGxzY3JlZW4gbW9kZS5cbiAgICAgKi9cbiAgICBGdWxsc2NyZWVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEZ1bGxzY3JlZW5NZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHNjcmVlbiB0aGF0IHRoZSB3aW5kb3cgaXMgb24uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgc2NyZWVuIHRoZSB3aW5kb3cgaXMgY3VycmVudGx5IG9uLlxuICAgICAqL1xuICAgIEdldFNjcmVlbigpOiBQcm9taXNlPFNjcmVlbj4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEdldFNjcmVlbk1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudCB6b29tIGxldmVsIG9mIHRoZSB3aW5kb3cuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCB6b29tIGxldmVsLlxuICAgICAqL1xuICAgIEdldFpvb20oKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShHZXRab29tTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBoZWlnaHQgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IGhlaWdodCBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIEhlaWdodCgpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEhlaWdodE1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGlkZXMgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBIaWRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEhpZGVNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgd2luZG93IGlzIGZvY3VzZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSB3aW5kb3cgaXMgY3VycmVudGx5IGZvY3VzZWQuXG4gICAgICovXG4gICAgSXNGb2N1c2VkKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKElzRm9jdXNlZE1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB3aW5kb3cgaXMgZnVsbHNjcmVlbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIHdpbmRvdyBpcyBjdXJyZW50bHkgZnVsbHNjcmVlbi5cbiAgICAgKi9cbiAgICBJc0Z1bGxzY3JlZW4oKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oSXNGdWxsc2NyZWVuTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHdpbmRvdyBpcyBtYXhpbWlzZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSB3aW5kb3cgaXMgY3VycmVudGx5IG1heGltaXNlZC5cbiAgICAgKi9cbiAgICBJc01heGltaXNlZCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShJc01heGltaXNlZE1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB3aW5kb3cgaXMgbWluaW1pc2VkLlxuICAgICAqXG4gICAgICogQHJldHVybnMgV2hldGhlciB0aGUgd2luZG93IGlzIGN1cnJlbnRseSBtaW5pbWlzZWQuXG4gICAgICovXG4gICAgSXNNaW5pbWlzZWQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oSXNNaW5pbWlzZWRNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1heGltaXNlcyB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIE1heGltaXNlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKE1heGltaXNlTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNaW5pbWlzZXMgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBNaW5pbWlzZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShNaW5pbWlzZU1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgd2luZG93LlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIG5hbWUgb2YgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBOYW1lKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oTmFtZU1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3BlbnMgdGhlIGRldmVsb3BtZW50IHRvb2xzIHBhbmUuXG4gICAgICovXG4gICAgT3BlbkRldlRvb2xzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKE9wZW5EZXZUb29sc01ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcmVsYXRpdmUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdyB0byB0aGUgc2NyZWVuLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIGN1cnJlbnQgcmVsYXRpdmUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBSZWxhdGl2ZVBvc2l0aW9uKCk6IFByb21pc2U8UG9zaXRpb24+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShSZWxhdGl2ZVBvc2l0aW9uTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWxvYWRzIHRoZSBwYWdlIGFzc2V0cy5cbiAgICAgKi9cbiAgICBSZWxvYWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oUmVsb2FkTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHdpbmRvdyBpcyByZXNpemFibGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSB3aW5kb3cgaXMgY3VycmVudGx5IHJlc2l6YWJsZS5cbiAgICAgKi9cbiAgICBSZXNpemFibGUoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oUmVzaXphYmxlTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXN0b3JlcyB0aGUgd2luZG93IHRvIGl0cyBwcmV2aW91cyBzdGF0ZSBpZiBpdCB3YXMgcHJldmlvdXNseSBtaW5pbWlzZWQsIG1heGltaXNlZCBvciBmdWxsc2NyZWVuLlxuICAgICAqL1xuICAgIFJlc3RvcmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oUmVzdG9yZU1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB4IC0gVGhlIGRlc2lyZWQgaG9yaXpvbnRhbCBhYnNvbHV0ZSBwb3NpdGlvbiBvZiB0aGUgd2luZG93LlxuICAgICAqIEBwYXJhbSB5IC0gVGhlIGRlc2lyZWQgdmVydGljYWwgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBTZXRQb3NpdGlvbih4OiBudW1iZXIsIHk6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFNldFBvc2l0aW9uTWV0aG9kLCB7IHgsIHkgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgd2luZG93IHRvIGJlIGFsd2F5cyBvbiB0b3AuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYWx3YXlzT25Ub3AgLSBXaGV0aGVyIHRoZSB3aW5kb3cgc2hvdWxkIHN0YXkgb24gdG9wLlxuICAgICAqL1xuICAgIFNldEFsd2F5c09uVG9wKGFsd2F5c09uVG9wOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2V0QWx3YXlzT25Ub3BNZXRob2QsIHsgYWx3YXlzT25Ub3AgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgYmFja2dyb3VuZCBjb2xvdXIgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByIC0gVGhlIGRlc2lyZWQgcmVkIGNvbXBvbmVudCBvZiB0aGUgd2luZG93IGJhY2tncm91bmQuXG4gICAgICogQHBhcmFtIGcgLSBUaGUgZGVzaXJlZCBncmVlbiBjb21wb25lbnQgb2YgdGhlIHdpbmRvdyBiYWNrZ3JvdW5kLlxuICAgICAqIEBwYXJhbSBiIC0gVGhlIGRlc2lyZWQgYmx1ZSBjb21wb25lbnQgb2YgdGhlIHdpbmRvdyBiYWNrZ3JvdW5kLlxuICAgICAqIEBwYXJhbSBhIC0gVGhlIGRlc2lyZWQgYWxwaGEgY29tcG9uZW50IG9mIHRoZSB3aW5kb3cgYmFja2dyb3VuZC5cbiAgICAgKi9cbiAgICBTZXRCYWNrZ3JvdW5kQ29sb3VyKHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIsIGE6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFNldEJhY2tncm91bmRDb2xvdXJNZXRob2QsIHsgciwgZywgYiwgYSB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSB3aW5kb3cgZnJhbWUgYW5kIHRpdGxlIGJhci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmcmFtZWxlc3MgLSBXaGV0aGVyIHRoZSB3aW5kb3cgc2hvdWxkIGJlIGZyYW1lbGVzcy5cbiAgICAgKi9cbiAgICBTZXRGcmFtZWxlc3MoZnJhbWVsZXNzOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2V0RnJhbWVsZXNzTWV0aG9kLCB7IGZyYW1lbGVzcyB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlcyB0aGUgc3lzdGVtIGZ1bGxzY3JlZW4gYnV0dG9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVuYWJsZWQgLSBXaGV0aGVyIHRoZSBmdWxsc2NyZWVuIGJ1dHRvbiBzaG91bGQgYmUgZW5hYmxlZC5cbiAgICAgKi9cbiAgICBTZXRGdWxsc2NyZWVuQnV0dG9uRW5hYmxlZChlbmFibGVkOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2V0RnVsbHNjcmVlbkJ1dHRvbkVuYWJsZWRNZXRob2QsIHsgZW5hYmxlZCB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB3aWR0aCAtIFRoZSBkZXNpcmVkIG1heGltdW0gd2lkdGggb2YgdGhlIHdpbmRvdy5cbiAgICAgKiBAcGFyYW0gaGVpZ2h0IC0gVGhlIGRlc2lyZWQgbWF4aW11bSBoZWlnaHQgb2YgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBTZXRNYXhTaXplKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2V0TWF4U2l6ZU1ldGhvZCwgeyB3aWR0aCwgaGVpZ2h0IH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIG1pbmltdW0gc2l6ZSBvZiB0aGUgd2luZG93LlxuICAgICAqXG4gICAgICogQHBhcmFtIHdpZHRoIC0gVGhlIGRlc2lyZWQgbWluaW11bSB3aWR0aCBvZiB0aGUgd2luZG93LlxuICAgICAqIEBwYXJhbSBoZWlnaHQgLSBUaGUgZGVzaXJlZCBtaW5pbXVtIGhlaWdodCBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFNldE1pblNpemUod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShTZXRNaW5TaXplTWV0aG9kLCB7IHdpZHRoLCBoZWlnaHQgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcmVsYXRpdmUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdyB0byB0aGUgc2NyZWVuLlxuICAgICAqXG4gICAgICogQHBhcmFtIHggLSBUaGUgZGVzaXJlZCBob3Jpem9udGFsIHJlbGF0aXZlIHBvc2l0aW9uIG9mIHRoZSB3aW5kb3cuXG4gICAgICogQHBhcmFtIHkgLSBUaGUgZGVzaXJlZCB2ZXJ0aWNhbCByZWxhdGl2ZSBwb3NpdGlvbiBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFNldFJlbGF0aXZlUG9zaXRpb24oeDogbnVtYmVyLCB5OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShTZXRSZWxhdGl2ZVBvc2l0aW9uTWV0aG9kLCB7IHgsIHkgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB3aGV0aGVyIHRoZSB3aW5kb3cgaXMgcmVzaXphYmxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlc2l6YWJsZSAtIFdoZXRoZXIgdGhlIHdpbmRvdyBzaG91bGQgYmUgcmVzaXphYmxlLlxuICAgICAqL1xuICAgIFNldFJlc2l6YWJsZShyZXNpemFibGU6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShTZXRSZXNpemFibGVNZXRob2QsIHsgcmVzaXphYmxlIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHNpemUgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB3aWR0aCAtIFRoZSBkZXNpcmVkIHdpZHRoIG9mIHRoZSB3aW5kb3cuXG4gICAgICogQHBhcmFtIGhlaWdodCAtIFRoZSBkZXNpcmVkIGhlaWdodCBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFNldFNpemUod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShTZXRTaXplTWV0aG9kLCB7IHdpZHRoLCBoZWlnaHQgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdGl0bGUgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0aXRsZSAtIFRoZSBkZXNpcmVkIHRpdGxlIG9mIHRoZSB3aW5kb3cuXG4gICAgICovXG4gICAgU2V0VGl0bGUodGl0bGU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFNldFRpdGxlTWV0aG9kLCB7IHRpdGxlIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHpvb20gbGV2ZWwgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB6b29tIC0gVGhlIGRlc2lyZWQgem9vbSBsZXZlbC5cbiAgICAgKi9cbiAgICBTZXRab29tKHpvb206IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFNldFpvb21NZXRob2QsIHsgem9vbSB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTaG93cyB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFNob3coKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2hvd01ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgd2luZG93LlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFNpemUoKTogUHJvbWlzZTxTaXplPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2l6ZU1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG9nZ2xlcyB0aGUgd2luZG93IGJldHdlZW4gZnVsbHNjcmVlbiBhbmQgbm9ybWFsLlxuICAgICAqL1xuICAgIFRvZ2dsZUZ1bGxzY3JlZW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oVG9nZ2xlRnVsbHNjcmVlbk1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG9nZ2xlcyB0aGUgd2luZG93IGJldHdlZW4gbWF4aW1pc2VkIGFuZCBub3JtYWwuXG4gICAgICovXG4gICAgVG9nZ2xlTWF4aW1pc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oVG9nZ2xlTWF4aW1pc2VNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVuLWZ1bGxzY3JlZW5zIHRoZSB3aW5kb3cuXG4gICAgICovXG4gICAgVW5GdWxsc2NyZWVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFVuRnVsbHNjcmVlbk1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVW4tbWF4aW1pc2VzIHRoZSB3aW5kb3cuXG4gICAgICovXG4gICAgVW5NYXhpbWlzZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShVbk1heGltaXNlTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVbi1taW5pbWlzZXMgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBVbk1pbmltaXNlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFVuTWluaW1pc2VNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHdpZHRoIG9mIHRoZSB3aW5kb3cuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCB3aWR0aCBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFdpZHRoKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oV2lkdGhNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFpvb21zIHRoZSB3aW5kb3cuXG4gICAgICovXG4gICAgWm9vbSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShab29tTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbmNyZWFzZXMgdGhlIHpvb20gbGV2ZWwgb2YgdGhlIHdlYnZpZXcgY29udGVudC5cbiAgICAgKi9cbiAgICBab29tSW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oWm9vbUluTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWNyZWFzZXMgdGhlIHpvb20gbGV2ZWwgb2YgdGhlIHdlYnZpZXcgY29udGVudC5cbiAgICAgKi9cbiAgICBab29tT3V0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFpvb21PdXRNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUgem9vbSBsZXZlbCBvZiB0aGUgd2VidmlldyBjb250ZW50LlxuICAgICAqL1xuICAgIFpvb21SZXNldCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShab29tUmVzZXRNZXRob2QpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBUaGUgd2luZG93IHdpdGhpbiB3aGljaCB0aGUgc2NyaXB0IGlzIHJ1bm5pbmcuXG4gKi9cbmNvbnN0IHRoaXNXaW5kb3cgPSBuZXcgV2luZG93KCcnKTtcblxuZXhwb3J0IGRlZmF1bHQgdGhpc1dpbmRvdztcbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuaW1wb3J0ICogYXMgUnVudGltZSBmcm9tIFwiLi4vQHdhaWxzaW8vcnVudGltZS9zcmNcIjtcblxuLy8gTk9URTogdGhlIGZvbGxvd2luZyBtZXRob2RzIE1VU1QgYmUgaW1wb3J0ZWQgZXhwbGljaXRseSBiZWNhdXNlIG9mIGhvdyBlc2J1aWxkIGluamVjdGlvbiB3b3Jrc1xuaW1wb3J0IHsgRW5hYmxlIGFzIEVuYWJsZVdNTCB9IGZyb20gXCIuLi9Ad2FpbHNpby9ydW50aW1lL3NyYy93bWxcIjtcbmltcG9ydCB7IGRlYnVnTG9nIH0gZnJvbSBcIi4uL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3V0aWxzXCI7XG5cbndpbmRvdy53YWlscyA9IFJ1bnRpbWU7XG5FbmFibGVXTUwoKTtcblxuaWYgKERFQlVHKSB7XG4gICAgZGVidWdMb2coXCJXYWlscyBSdW50aW1lIExvYWRlZFwiKVxufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5pbXBvcnQgeyBuZXdSdW50aW1lQ2FsbGVyLCBvYmplY3ROYW1lcyB9IGZyb20gXCIuL3J1bnRpbWUuanNcIjtcblxubGV0IGNhbGwgPSBuZXdSdW50aW1lQ2FsbGVyKG9iamVjdE5hbWVzLlN5c3RlbSk7XG5cbmNvbnN0IFN5c3RlbUlzRGFya01vZGUgPSAwO1xuY29uc3QgU3lzdGVtRW52aXJvbm1lbnQgPSAxO1xuXG5jb25zdCBfaW52b2tlID0gKGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAoKHdpbmRvdyBhcyBhbnkpLmNocm9tZT8ud2Vidmlldz8ucG9zdE1lc3NhZ2UpIHtcbiAgICAgICAgICAgIHJldHVybiAod2luZG93IGFzIGFueSkuY2hyb21lLndlYnZpZXcucG9zdE1lc3NhZ2UuYmluZCgod2luZG93IGFzIGFueSkuY2hyb21lLndlYnZpZXcpO1xuICAgICAgICB9IGVsc2UgaWYgKCh3aW5kb3cgYXMgYW55KS53ZWJraXQ/Lm1lc3NhZ2VIYW5kbGVycz8uWydleHRlcm5hbCddPy5wb3N0TWVzc2FnZSkge1xuICAgICAgICAgICAgcmV0dXJuICh3aW5kb3cgYXMgYW55KS53ZWJraXQubWVzc2FnZUhhbmRsZXJzWydleHRlcm5hbCddLnBvc3RNZXNzYWdlLmJpbmQoKHdpbmRvdyBhcyBhbnkpLndlYmtpdC5tZXNzYWdlSGFuZGxlcnNbJ2V4dGVybmFsJ10pO1xuICAgICAgICB9XG4gICAgfSBjYXRjaChlKSB7fVxuXG4gICAgY29uc29sZS53YXJuKCdcXG4lY1x1MjZBMFx1RkUwRiBCcm93c2VyIEVudmlyb25tZW50IERldGVjdGVkICVjXFxuXFxuJWNPbmx5IFVJIHByZXZpZXdzIGFyZSBhdmFpbGFibGUgaW4gdGhlIGJyb3dzZXIuIEZvciBmdWxsIGZ1bmN0aW9uYWxpdHksIHBsZWFzZSBydW4gdGhlIGFwcGxpY2F0aW9uIGluIGRlc2t0b3AgbW9kZS5cXG5Nb3JlIGluZm9ybWF0aW9uIGF0OiBodHRwczovL3YzLndhaWxzLmlvL2xlYXJuL2J1aWxkLyN1c2luZy1hLWJyb3dzZXItZm9yLWRldmVsb3BtZW50XFxuJyxcbiAgICAgICAgJ2JhY2tncm91bmQ6ICNmZmZmZmY7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgcGFkZGluZzogNHB4IDhweDsgYm9yZGVyLXJhZGl1czogNHB4OyBib3JkZXI6IDJweCBzb2xpZCAjMDAwMDAwOycsXG4gICAgICAgICdiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsnLFxuICAgICAgICAnY29sb3I6ICNmZmZmZmY7IGZvbnQtc3R5bGU6IGl0YWxpYzsgZm9udC13ZWlnaHQ6IGJvbGQ7Jyk7XG4gICAgcmV0dXJuIG51bGw7XG59KSgpO1xuXG5leHBvcnQgZnVuY3Rpb24gaW52b2tlKG1zZzogYW55KTogdm9pZCB7XG4gICAgcmV0dXJuIF9pbnZva2U/Lihtc2cpO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgc3lzdGVtIGRhcmsgbW9kZSBzdGF0dXMuXG4gKlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYSBib29sZWFuIHZhbHVlIGluZGljYXRpbmcgaWYgdGhlIHN5c3RlbSBpcyBpbiBkYXJrIG1vZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBJc0RhcmtNb2RlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBjYWxsKFN5c3RlbUlzRGFya01vZGUpO1xufVxuXG4vKipcbiAqIEZldGNoZXMgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUgYXBwbGljYXRpb24gZnJvbSB0aGUgc2VydmVyLlxuICpcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBjYXBhYmlsaXRpZXMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBDYXBhYmlsaXRpZXMoKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXCIvd2FpbHMvY2FwYWJpbGl0aWVzXCIpO1xuICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImNvdWxkIG5vdCBmZXRjaCBjYXBhYmlsaXRpZXM6IFwiICsgcmVzcG9uc2Uuc3RhdHVzVGV4dCk7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9TSW5mbyB7XG4gICAgLyoqIFRoZSBicmFuZGluZyBvZiB0aGUgT1MuICovXG4gICAgQnJhbmRpbmc6IHN0cmluZztcbiAgICAvKiogVGhlIElEIG9mIHRoZSBPUy4gKi9cbiAgICBJRDogc3RyaW5nO1xuICAgIC8qKiBUaGUgbmFtZSBvZiB0aGUgT1MuICovXG4gICAgTmFtZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgdmVyc2lvbiBvZiB0aGUgT1MuICovXG4gICAgVmVyc2lvbjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVudmlyb25tZW50SW5mbyB7XG4gICAgLyoqIFRoZSBhcmNoaXRlY3R1cmUgb2YgdGhlIHN5c3RlbS4gKi9cbiAgICBBcmNoOiBzdHJpbmc7XG4gICAgLyoqIFRydWUgaWYgdGhlIGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcgaW4gZGVidWcgbW9kZSwgb3RoZXJ3aXNlIGZhbHNlLiAqL1xuICAgIERlYnVnOiBib29sZWFuO1xuICAgIC8qKiBUaGUgb3BlcmF0aW5nIHN5c3RlbSBpbiB1c2UuICovXG4gICAgT1M6IHN0cmluZztcbiAgICAvKiogRGV0YWlscyBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbS4gKi9cbiAgICBPU0luZm86IE9TSW5mbztcbiAgICAvKiogQWRkaXRpb25hbCBwbGF0Zm9ybSBpbmZvcm1hdGlvbi4gKi9cbiAgICBQbGF0Zm9ybUluZm86IFJlY29yZDxzdHJpbmcsIGFueT47XG59XG5cbi8qKlxuICogUmV0cmlldmVzIGVudmlyb25tZW50IGRldGFpbHMuXG4gKlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gb2JqZWN0IGNvbnRhaW5pbmcgT1MgYW5kIHN5c3RlbSBhcmNoaXRlY3R1cmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFbnZpcm9ubWVudCgpOiBQcm9taXNlPEVudmlyb25tZW50SW5mbz4ge1xuICAgIHJldHVybiBjYWxsKFN5c3RlbUVudmlyb25tZW50KTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGN1cnJlbnQgb3BlcmF0aW5nIHN5c3RlbSBpcyBXaW5kb3dzLlxuICpcbiAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBpcyBXaW5kb3dzLCBvdGhlcndpc2UgZmFsc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBJc1dpbmRvd3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHdpbmRvdy5fd2FpbHMuZW52aXJvbm1lbnQuT1MgPT09IFwid2luZG93c1wiO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgY3VycmVudCBvcGVyYXRpbmcgc3lzdGVtIGlzIExpbnV4LlxuICpcbiAqIEByZXR1cm5zIFJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVudCBvcGVyYXRpbmcgc3lzdGVtIGlzIExpbnV4LCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBJc0xpbnV4KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB3aW5kb3cuX3dhaWxzLmVudmlyb25tZW50Lk9TID09PSBcImxpbnV4XCI7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBjdXJyZW50IGVudmlyb25tZW50IGlzIGEgbWFjT1Mgb3BlcmF0aW5nIHN5c3RlbS5cbiAqXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBlbnZpcm9ubWVudCBpcyBtYWNPUywgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSXNNYWMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHdpbmRvdy5fd2FpbHMuZW52aXJvbm1lbnQuT1MgPT09IFwiZGFyd2luXCI7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBjdXJyZW50IGVudmlyb25tZW50IGFyY2hpdGVjdHVyZSBpcyBBTUQ2NC5cbiAqXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBjdXJyZW50IGVudmlyb25tZW50IGFyY2hpdGVjdHVyZSBpcyBBTUQ2NCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSXNBTUQ2NCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gd2luZG93Ll93YWlscy5lbnZpcm9ubWVudC5BcmNoID09PSBcImFtZDY0XCI7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBjdXJyZW50IGFyY2hpdGVjdHVyZSBpcyBBUk0uXG4gKlxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgY3VycmVudCBhcmNoaXRlY3R1cmUgaXMgQVJNLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBJc0FSTSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gd2luZG93Ll93YWlscy5lbnZpcm9ubWVudC5BcmNoID09PSBcImFybVwiO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgY3VycmVudCBlbnZpcm9ubWVudCBpcyBBUk02NCBhcmNoaXRlY3R1cmUuXG4gKlxuICogQHJldHVybnMgUmV0dXJucyB0cnVlIGlmIHRoZSBlbnZpcm9ubWVudCBpcyBBUk02NCBhcmNoaXRlY3R1cmUsIG90aGVyd2lzZSByZXR1cm5zIGZhbHNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSXNBUk02NCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gd2luZG93Ll93YWlscy5lbnZpcm9ubWVudC5BcmNoID09PSBcImFybTY0XCI7XG59XG5cbi8qKlxuICogUmVwb3J0cyB3aGV0aGVyIHRoZSBhcHAgaXMgYmVpbmcgcnVuIGluIGRlYnVnIG1vZGUuXG4gKlxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgYXBwIGlzIGJlaW5nIHJ1biBpbiBkZWJ1ZyBtb2RlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSXNEZWJ1ZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gQm9vbGVhbih3aW5kb3cuX3dhaWxzLmVudmlyb25tZW50LkRlYnVnKTtcbn1cblxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5pbXBvcnQgeyBuZXdSdW50aW1lQ2FsbGVyLCBvYmplY3ROYW1lcyB9IGZyb20gXCIuL3J1bnRpbWUuanNcIjtcbmltcG9ydCB7IElzRGVidWcgfSBmcm9tIFwiLi9zeXN0ZW0uanNcIjtcblxuLy8gc2V0dXBcbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIGNvbnRleHRNZW51SGFuZGxlcik7XG5cbmNvbnN0IGNhbGwgPSBuZXdSdW50aW1lQ2FsbGVyKG9iamVjdE5hbWVzLkNvbnRleHRNZW51KTtcblxuY29uc3QgQ29udGV4dE1lbnVPcGVuID0gMDtcblxuZnVuY3Rpb24gb3BlbkNvbnRleHRNZW51KGlkOiBzdHJpbmcsIHg6IG51bWJlciwgeTogbnVtYmVyLCBkYXRhOiBhbnkpOiB2b2lkIHtcbiAgICB2b2lkIGNhbGwoQ29udGV4dE1lbnVPcGVuLCB7aWQsIHgsIHksIGRhdGF9KTtcbn1cblxuZnVuY3Rpb24gY29udGV4dE1lbnVIYW5kbGVyKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgbGV0IHRhcmdldDogSFRNTEVsZW1lbnQ7XG5cbiAgICBpZiAoZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgIH0gZWxzZSBpZiAoIShldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkgJiYgZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgTm9kZSkge1xuICAgICAgICB0YXJnZXQgPSBldmVudC50YXJnZXQucGFyZW50RWxlbWVudCA/PyBkb2N1bWVudC5ib2R5O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRhcmdldCA9IGRvY3VtZW50LmJvZHk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIGN1c3RvbSBjb250ZXh0IG1lbnVcbiAgICBsZXQgY3VzdG9tQ29udGV4dE1lbnUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXQpLmdldFByb3BlcnR5VmFsdWUoXCItLWN1c3RvbS1jb250ZXh0bWVudVwiKS50cmltKCk7XG5cbiAgICBpZiAoY3VzdG9tQ29udGV4dE1lbnUpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgbGV0IGRhdGEgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXQpLmdldFByb3BlcnR5VmFsdWUoXCItLWN1c3RvbS1jb250ZXh0bWVudS1kYXRhXCIpO1xuICAgICAgICBvcGVuQ29udGV4dE1lbnUoY3VzdG9tQ29udGV4dE1lbnUsIGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFksIGRhdGEpO1xuICAgICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBwcm9jZXNzRGVmYXVsdENvbnRleHRNZW51KGV2ZW50KTtcbn1cblxuXG4vKlxuLS1kZWZhdWx0LWNvbnRleHRtZW51OiBhdXRvOyAoZGVmYXVsdCkgd2lsbCBzaG93IHRoZSBkZWZhdWx0IGNvbnRleHQgbWVudSBpZiBjb250ZW50RWRpdGFibGUgaXMgdHJ1ZSBPUiB0ZXh0IGhhcyBiZWVuIHNlbGVjdGVkIE9SIGVsZW1lbnQgaXMgaW5wdXQgb3IgdGV4dGFyZWFcbi0tZGVmYXVsdC1jb250ZXh0bWVudTogc2hvdzsgd2lsbCBhbHdheXMgc2hvdyB0aGUgZGVmYXVsdCBjb250ZXh0IG1lbnVcbi0tZGVmYXVsdC1jb250ZXh0bWVudTogaGlkZTsgd2lsbCBhbHdheXMgaGlkZSB0aGUgZGVmYXVsdCBjb250ZXh0IG1lbnVcblxuVGhpcyBydWxlIGlzIGluaGVyaXRlZCBsaWtlIG5vcm1hbCBDU1MgcnVsZXMsIHNvIG5lc3Rpbmcgd29ya3MgYXMgZXhwZWN0ZWRcbiovXG5mdW5jdGlvbiBwcm9jZXNzRGVmYXVsdENvbnRleHRNZW51KGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgLy8gRGVidWcgYnVpbGRzIGFsd2F5cyBzaG93IHRoZSBtZW51XG4gICAgaWYgKElzRGVidWcoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHRhcmdldDogSFRNTEVsZW1lbnQ7XG5cbiAgICBpZiAoZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgIH0gZWxzZSBpZiAoIShldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkgJiYgZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgTm9kZSkge1xuICAgICAgICB0YXJnZXQgPSBldmVudC50YXJnZXQucGFyZW50RWxlbWVudCA/PyBkb2N1bWVudC5ib2R5O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRhcmdldCA9IGRvY3VtZW50LmJvZHk7XG4gICAgfVxuXG4gICAgLy8gUHJvY2VzcyBkZWZhdWx0IGNvbnRleHQgbWVudVxuICAgIHN3aXRjaCAod2luZG93LmdldENvbXB1dGVkU3R5bGUodGFyZ2V0KS5nZXRQcm9wZXJ0eVZhbHVlKFwiLS1kZWZhdWx0LWNvbnRleHRtZW51XCIpLnRyaW0oKSkge1xuICAgICAgICBjYXNlIFwic2hvd1wiOlxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNhc2UgXCJoaWRlXCI6XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAvLyBDaGVjayBpZiBjb250ZW50RWRpdGFibGUgaXMgdHJ1ZVxuICAgICAgICAgICAgaWYgKHRhcmdldC5pc0NvbnRlbnRFZGl0YWJsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGV4dCBoYXMgYmVlbiBzZWxlY3RlZFxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgICAgICAgICAgY29uc3QgaGFzU2VsZWN0aW9uID0gc2VsZWN0aW9uICYmIHNlbGVjdGlvbi50b1N0cmluZygpLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICBpZiAoaGFzU2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3Rpb24ucmFuZ2VDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoaSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY3RzID0gcmFuZ2UuZ2V0Q2xpZW50UmVjdHMoKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByZWN0cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjdCA9IHJlY3RzW2pdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQocmVjdC5sZWZ0LCByZWN0LnRvcCkgPT09IHRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGFnIGlzIGlucHV0IG9yIHRleHRhcmVhLlxuICAgICAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgfHwgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTFRleHRBcmVhRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGlmIChoYXNTZWxlY3Rpb24gfHwgKCF0YXJnZXQucmVhZE9ubHkgJiYgIXRhcmdldC5kaXNhYmxlZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaGlkZSBkZWZhdWx0IGNvbnRleHQgbWVudVxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG59XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBrZXkgZnJvbSB0aGUgZmxhZyBtYXAuXG4gKlxuICogQHBhcmFtIGtleSAtIFRoZSBrZXkgdG8gcmV0cmlldmUgdGhlIHZhbHVlIGZvci5cbiAqIEByZXR1cm4gVGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGtleS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEdldEZsYWcoa2V5OiBzdHJpbmcpOiBhbnkge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB3aW5kb3cuX3dhaWxzLmZsYWdzW2tleV07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gcmV0cmlldmUgZmxhZyAnXCIgKyBrZXkgKyBcIic6IFwiICsgZSwgeyBjYXVzZTogZSB9KTtcbiAgICB9XG59XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbmltcG9ydCB7IGludm9rZSwgSXNXaW5kb3dzIH0gZnJvbSBcIi4vc3lzdGVtLmpzXCI7XG5pbXBvcnQgeyBHZXRGbGFnIH0gZnJvbSBcIi4vZmxhZ3MuanNcIjtcbmltcG9ydCB7IGNhblRyYWNrQnV0dG9ucyB9IGZyb20gXCIuL3V0aWxzLmpzXCI7XG5cbi8vIFNldHVwXG5sZXQgY2FuRHJhZyA9IGZhbHNlO1xubGV0IGRyYWdnaW5nID0gZmFsc2U7XG5cbmxldCByZXNpemFibGUgPSBmYWxzZTtcbmxldCBjYW5SZXNpemUgPSBmYWxzZTtcbmxldCByZXNpemluZyA9IGZhbHNlO1xubGV0IHJlc2l6ZUVkZ2U6IHN0cmluZyA9IFwiXCI7XG5sZXQgZGVmYXVsdEN1cnNvciA9IFwiYXV0b1wiO1xuXG5sZXQgYnV0dG9ucyA9IDA7XG5jb25zdCBidXR0b25zVHJhY2tlZCA9IGNhblRyYWNrQnV0dG9ucygpO1xuXG53aW5kb3cuX3dhaWxzID0gd2luZG93Ll93YWlscyB8fCB7fTtcbndpbmRvdy5fd2FpbHMuc2V0UmVzaXphYmxlID0gKHZhbHVlOiBib29sZWFuKTogdm9pZCA9PiB7XG4gICAgcmVzaXphYmxlID0gdmFsdWU7XG4gICAgaWYgKCFyZXNpemFibGUpIHtcbiAgICAgICAgLy8gU3RvcCByZXNpemluZyBpZiBpbiBwcm9ncmVzcy5cbiAgICAgICAgY2FuUmVzaXplID0gcmVzaXppbmcgPSBmYWxzZTtcbiAgICAgICAgc2V0UmVzaXplKCk7XG4gICAgfVxufTtcblxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIG9uTW91c2VEb3duLCB7IGNhcHR1cmU6IHRydWUgfSk7XG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUsIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25Nb3VzZVVwLCB7IGNhcHR1cmU6IHRydWUgfSk7XG5mb3IgKGNvbnN0IGV2IG9mIFsnY2xpY2snLCAnY29udGV4dG1lbnUnLCAnZGJsY2xpY2snLCAncG9pbnRlcmRvd24nLCAncG9pbnRlcnVwJ10pIHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihldiwgc3VwcHJlc3NFdmVudCwgeyBjYXB0dXJlOiB0cnVlIH0pO1xufVxuXG5mdW5jdGlvbiBzdXBwcmVzc0V2ZW50KGV2ZW50OiBFdmVudCkge1xuICAgIGlmIChkcmFnZ2luZyB8fCByZXNpemluZykge1xuICAgICAgICAvLyBTdXBwcmVzcyBhbGwgYnV0dG9uIGV2ZW50cyBkdXJpbmcgZHJhZ2dpbmcgJiByZXNpemluZy5cbiAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gb25Nb3VzZURvd24oZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBidXR0b25zID0gYnV0dG9uc1RyYWNrZWQgPyBldmVudC5idXR0b25zIDogKGJ1dHRvbnMgfCAoMSA8PCBldmVudC5idXR0b24pKTtcblxuICAgIGlmIChkcmFnZ2luZyB8fCByZXNpemluZykge1xuICAgICAgICAvLyBBZnRlciBkcmFnZ2luZyBvciByZXNpemluZyBoYXMgc3RhcnRlZCwgb25seSBsaWZ0aW5nIHRoZSBwcmltYXJ5IGJ1dHRvbiBjYW4gc3RvcCBpdC5cbiAgICAgICAgLy8gRG8gbm90IGxldCBhbnkgb3RoZXIgZXZlbnRzIHRocm91Z2guXG4gICAgICAgIHN1cHByZXNzRXZlbnQoZXZlbnQpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKChjYW5EcmFnIHx8IGNhblJlc2l6ZSkgJiYgKGJ1dHRvbnMgJiAxKSAmJiBldmVudC5idXR0b24gIT09IDApIHtcbiAgICAgICAgLy8gV2Ugd2VyZSByZWFkeSBiZWZvcmUsIHRoZSBwcmltYXJ5IGlzIHByZXNzZWQgYW5kIHdhcyBub3QgcmVsZWFzZWQ6XG4gICAgICAgIC8vIHN0aWxsIHJlYWR5LCBidXQgbGV0IGV2ZW50cyBidWJibGUgdGhyb3VnaCB0aGUgd2luZG93LlxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUmVzZXQgcmVhZGluZXNzIHN0YXRlLlxuICAgIGNhbkRyYWcgPSBmYWxzZTtcbiAgICBjYW5SZXNpemUgPSBmYWxzZTtcblxuICAgIC8vIENoZWNrIGZvciByZXNpemluZyByZWFkaW5lc3MuXG4gICAgaWYgKHJlc2l6ZUVkZ2UpIHtcbiAgICAgICAgaWYgKGV2ZW50LmJ1dHRvbiA9PT0gMCAmJiBldmVudC5kZXRhaWwgPT09IDEpIHtcbiAgICAgICAgICAgIC8vIFJlYWR5IHRvIHJlc2l6ZSBpZiB0aGUgcHJpbWFyeSBidXR0b24gd2FzIHByZXNzZWQgZm9yIHRoZSBmaXJzdCB0aW1lLlxuICAgICAgICAgICAgY2FuUmVzaXplID0gdHJ1ZTtcbiAgICAgICAgICAgIGludm9rZShcIndhaWxzOnJlc2l6ZTpcIiArIHJlc2l6ZUVkZ2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRG8gbm90IHN0YXJ0IGRyYWcgb3BlcmF0aW9ucyB3aXRoaW4gcmVzaXplIGVkZ2VzLlxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHRhcmdldDogSFRNTEVsZW1lbnQ7XG5cbiAgICBpZiAoZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgIH0gZWxzZSBpZiAoIShldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkgJiYgZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgTm9kZSkge1xuICAgICAgICB0YXJnZXQgPSBldmVudC50YXJnZXQucGFyZW50RWxlbWVudCA/PyBkb2N1bWVudC5ib2R5O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRhcmdldCA9IGRvY3VtZW50LmJvZHk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXQpO1xuICAgIGNvbnN0IHNldHRpbmcgPSBzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKFwiLS13YWlscy1kcmFnZ2FibGVcIikudHJpbSgpO1xuICAgIGlmIChzZXR0aW5nID09PSBcImRyYWdcIiAmJiBldmVudC5idXR0b24gPT09IDAgJiYgZXZlbnQuZGV0YWlsID09PSAxKSB7XG4gICAgICAgIC8vIFJlYWR5IHRvIGRyYWcgaWYgdGhlIHByaW1hcnkgYnV0dG9uIHdhcyBwcmVzc2VkIGZvciB0aGUgZmlyc3QgdGltZSBvbiBhIGRyYWdnYWJsZSBlbGVtZW50LlxuICAgICAgICAvLyBJZ25vcmUgY2xpY2tzIG9uIHRoZSBzY3JvbGxiYXIuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGV2ZW50Lm9mZnNldFggLSBwYXJzZUZsb2F0KHN0eWxlLnBhZGRpbmdMZWZ0KSA8IHRhcmdldC5jbGllbnRXaWR0aFxuICAgICAgICAgICAgJiYgZXZlbnQub2Zmc2V0WSAtIHBhcnNlRmxvYXQoc3R5bGUucGFkZGluZ1RvcCkgPCB0YXJnZXQuY2xpZW50SGVpZ2h0XG4gICAgICAgICkge1xuICAgICAgICAgICAgY2FuRHJhZyA9IHRydWU7XG4gICAgICAgICAgICBpbnZva2UoXCJ3YWlsczpkcmFnXCIpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBvbk1vdXNlVXAoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBidXR0b25zID0gYnV0dG9uc1RyYWNrZWQgPyBldmVudC5idXR0b25zIDogKGJ1dHRvbnMgJiB+KDEgPDwgZXZlbnQuYnV0dG9uKSk7XG5cbiAgICBpZiAoZXZlbnQuYnV0dG9uID09PSAwKSB7XG4gICAgICAgIGlmIChyZXNpemluZykge1xuICAgICAgICAgICAgLy8gTGV0IG1vdXNldXAgZXZlbnQgYnViYmxlIHdoZW4gYSBkcmFnIGVuZHMsIGJ1dCBub3Qgd2hlbiBhIHJlc2l6ZSBlbmRzLlxuICAgICAgICAgICAgc3VwcHJlc3NFdmVudChldmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdG9wIGRyYWdnaW5nIGFuZCByZXNpemluZyB3aGVuIHRoZSBwcmltYXJ5IGJ1dHRvbiBpcyBsaWZ0ZWQuXG4gICAgICAgIGNhbkRyYWcgPSBmYWxzZTtcbiAgICAgICAgZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgICAgY2FuUmVzaXplID0gZmFsc2U7XG4gICAgICAgIHJlc2l6aW5nID0gZmFsc2U7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBZnRlciBkcmFnZ2luZyBvciByZXNpemluZyBoYXMgc3RhcnRlZCwgb25seSBsaWZ0aW5nIHRoZSBwcmltYXJ5IGJ1dHRvbiBjYW4gc3RvcCBpdC5cbiAgICBzdXBwcmVzc0V2ZW50KGV2ZW50KTtcbiAgICByZXR1cm47XG59XG5cbmNvbnN0IGN1cnNvckZvckVkZ2UgPSBPYmplY3QuZnJlZXplKHtcbiAgICBcInNlLXJlc2l6ZVwiOiBcIm53c2UtcmVzaXplXCIsXG4gICAgXCJzdy1yZXNpemVcIjogXCJuZXN3LXJlc2l6ZVwiLFxuICAgIFwibnctcmVzaXplXCI6IFwibndzZS1yZXNpemVcIixcbiAgICBcIm5lLXJlc2l6ZVwiOiBcIm5lc3ctcmVzaXplXCIsXG4gICAgXCJ3LXJlc2l6ZVwiOiBcImV3LXJlc2l6ZVwiLFxuICAgIFwibi1yZXNpemVcIjogXCJucy1yZXNpemVcIixcbiAgICBcInMtcmVzaXplXCI6IFwibnMtcmVzaXplXCIsXG4gICAgXCJlLXJlc2l6ZVwiOiBcImV3LXJlc2l6ZVwiLFxufSlcblxuZnVuY3Rpb24gc2V0UmVzaXplKGVkZ2U/OiBrZXlvZiB0eXBlb2YgY3Vyc29yRm9yRWRnZSk6IHZvaWQge1xuICAgIGlmIChlZGdlKSB7XG4gICAgICAgIGlmICghcmVzaXplRWRnZSkgeyBkZWZhdWx0Q3Vyc29yID0gZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3I7IH1cbiAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3IgPSBjdXJzb3JGb3JFZGdlW2VkZ2VdO1xuICAgIH0gZWxzZSBpZiAoIWVkZ2UgJiYgcmVzaXplRWRnZSkge1xuICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLmN1cnNvciA9IGRlZmF1bHRDdXJzb3I7XG4gICAgfVxuXG4gICAgcmVzaXplRWRnZSA9IGVkZ2UgfHwgXCJcIjtcbn1cblxuZnVuY3Rpb24gb25Nb3VzZU1vdmUoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoY2FuUmVzaXplICYmIHJlc2l6ZUVkZ2UpIHtcbiAgICAgICAgLy8gU3RhcnQgcmVzaXppbmcuXG4gICAgICAgIHJlc2l6aW5nID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKGNhbkRyYWcpIHtcbiAgICAgICAgLy8gU3RhcnQgZHJhZ2dpbmcuXG4gICAgICAgIGRyYWdnaW5nID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoZHJhZ2dpbmcgfHwgcmVzaXppbmcpIHtcbiAgICAgICAgLy8gRWl0aGVyIGRyYWcgb3IgcmVzaXplIGlzIG9uZ29pbmcsXG4gICAgICAgIC8vIHJlc2V0IHJlYWRpbmVzcyBhbmQgc3RvcCBwcm9jZXNzaW5nLlxuICAgICAgICBjYW5EcmFnID0gY2FuUmVzaXplID0gZmFsc2U7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXJlc2l6YWJsZSB8fCAhSXNXaW5kb3dzKCkpIHtcbiAgICAgICAgaWYgKHJlc2l6ZUVkZ2UpIHsgc2V0UmVzaXplKCk7IH1cbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc2l6ZUhhbmRsZUhlaWdodCA9IEdldEZsYWcoXCJzeXN0ZW0ucmVzaXplSGFuZGxlSGVpZ2h0XCIpIHx8IDU7XG4gICAgY29uc3QgcmVzaXplSGFuZGxlV2lkdGggPSBHZXRGbGFnKFwic3lzdGVtLnJlc2l6ZUhhbmRsZVdpZHRoXCIpIHx8IDU7XG5cbiAgICAvLyBFeHRyYSBwaXhlbHMgZm9yIHRoZSBjb3JuZXIgYXJlYXMuXG4gICAgY29uc3QgY29ybmVyRXh0cmEgPSBHZXRGbGFnKFwicmVzaXplQ29ybmVyRXh0cmFcIikgfHwgMTA7XG5cbiAgICBjb25zdCByaWdodEJvcmRlciA9ICh3aW5kb3cub3V0ZXJXaWR0aCAtIGV2ZW50LmNsaWVudFgpIDwgcmVzaXplSGFuZGxlV2lkdGg7XG4gICAgY29uc3QgbGVmdEJvcmRlciA9IGV2ZW50LmNsaWVudFggPCByZXNpemVIYW5kbGVXaWR0aDtcbiAgICBjb25zdCB0b3BCb3JkZXIgPSBldmVudC5jbGllbnRZIDwgcmVzaXplSGFuZGxlSGVpZ2h0O1xuICAgIGNvbnN0IGJvdHRvbUJvcmRlciA9ICh3aW5kb3cub3V0ZXJIZWlnaHQgLSBldmVudC5jbGllbnRZKSA8IHJlc2l6ZUhhbmRsZUhlaWdodDtcblxuICAgIC8vIEFkanVzdCBmb3IgY29ybmVyIGFyZWFzLlxuICAgIGNvbnN0IHJpZ2h0Q29ybmVyID0gKHdpbmRvdy5vdXRlcldpZHRoIC0gZXZlbnQuY2xpZW50WCkgPCAocmVzaXplSGFuZGxlV2lkdGggKyBjb3JuZXJFeHRyYSk7XG4gICAgY29uc3QgbGVmdENvcm5lciA9IGV2ZW50LmNsaWVudFggPCAocmVzaXplSGFuZGxlV2lkdGggKyBjb3JuZXJFeHRyYSk7XG4gICAgY29uc3QgdG9wQ29ybmVyID0gZXZlbnQuY2xpZW50WSA8IChyZXNpemVIYW5kbGVIZWlnaHQgKyBjb3JuZXJFeHRyYSk7XG4gICAgY29uc3QgYm90dG9tQ29ybmVyID0gKHdpbmRvdy5vdXRlckhlaWdodCAtIGV2ZW50LmNsaWVudFkpIDwgKHJlc2l6ZUhhbmRsZUhlaWdodCArIGNvcm5lckV4dHJhKTtcblxuICAgIGlmICghbGVmdENvcm5lciAmJiAhdG9wQ29ybmVyICYmICFib3R0b21Db3JuZXIgJiYgIXJpZ2h0Q29ybmVyKSB7XG4gICAgICAgIC8vIE9wdGltaXNhdGlvbjogb3V0IG9mIGFsbCBjb3JuZXIgYXJlYXMgaW1wbGllcyBvdXQgb2YgYm9yZGVycy5cbiAgICAgICAgc2V0UmVzaXplKCk7XG4gICAgfVxuICAgIC8vIERldGVjdCBjb3JuZXJzLlxuICAgIGVsc2UgaWYgKHJpZ2h0Q29ybmVyICYmIGJvdHRvbUNvcm5lcikgc2V0UmVzaXplKFwic2UtcmVzaXplXCIpO1xuICAgIGVsc2UgaWYgKGxlZnRDb3JuZXIgJiYgYm90dG9tQ29ybmVyKSBzZXRSZXNpemUoXCJzdy1yZXNpemVcIik7XG4gICAgZWxzZSBpZiAobGVmdENvcm5lciAmJiB0b3BDb3JuZXIpIHNldFJlc2l6ZShcIm53LXJlc2l6ZVwiKTtcbiAgICBlbHNlIGlmICh0b3BDb3JuZXIgJiYgcmlnaHRDb3JuZXIpIHNldFJlc2l6ZShcIm5lLXJlc2l6ZVwiKTtcbiAgICAvLyBEZXRlY3QgYm9yZGVycy5cbiAgICBlbHNlIGlmIChsZWZ0Qm9yZGVyKSBzZXRSZXNpemUoXCJ3LXJlc2l6ZVwiKTtcbiAgICBlbHNlIGlmICh0b3BCb3JkZXIpIHNldFJlc2l6ZShcIm4tcmVzaXplXCIpO1xuICAgIGVsc2UgaWYgKGJvdHRvbUJvcmRlcikgc2V0UmVzaXplKFwicy1yZXNpemVcIik7XG4gICAgZWxzZSBpZiAocmlnaHRCb3JkZXIpIHNldFJlc2l6ZShcImUtcmVzaXplXCIpO1xuICAgIC8vIE91dCBvZiBib3JkZXIgYXJlYS5cbiAgICBlbHNlIHNldFJlc2l6ZSgpO1xufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5pbXBvcnQgeyBuZXdSdW50aW1lQ2FsbGVyLCBvYmplY3ROYW1lcyB9IGZyb20gXCIuL3J1bnRpbWUuanNcIjtcbmNvbnN0IGNhbGwgPSBuZXdSdW50aW1lQ2FsbGVyKG9iamVjdE5hbWVzLkFwcGxpY2F0aW9uKTtcblxuY29uc3QgSGlkZU1ldGhvZCA9IDA7XG5jb25zdCBTaG93TWV0aG9kID0gMTtcbmNvbnN0IFF1aXRNZXRob2QgPSAyO1xuXG4vKipcbiAqIEhpZGVzIGEgY2VydGFpbiBtZXRob2QgYnkgY2FsbGluZyB0aGUgSGlkZU1ldGhvZCBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEhpZGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIGNhbGwoSGlkZU1ldGhvZCk7XG59XG5cbi8qKlxuICogQ2FsbHMgdGhlIFNob3dNZXRob2QgYW5kIHJldHVybnMgdGhlIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFNob3coKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIGNhbGwoU2hvd01ldGhvZCk7XG59XG5cbi8qKlxuICogQ2FsbHMgdGhlIFF1aXRNZXRob2QgdG8gdGVybWluYXRlIHRoZSBwcm9ncmFtLlxuICovXG5leHBvcnQgZnVuY3Rpb24gUXVpdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gY2FsbChRdWl0TWV0aG9kKTtcbn1cbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuaW1wb3J0IHsgQ2FuY2VsbGFibGVQcm9taXNlLCB0eXBlIENhbmNlbGxhYmxlUHJvbWlzZVdpdGhSZXNvbHZlcnMgfSBmcm9tIFwiLi9jYW5jZWxsYWJsZS5qc1wiO1xuaW1wb3J0IHsgbmV3UnVudGltZUNhbGxlciwgb2JqZWN0TmFtZXMgfSBmcm9tIFwiLi9ydW50aW1lLmpzXCI7XG5pbXBvcnQgeyBuYW5vaWQgfSBmcm9tIFwiLi9uYW5vaWQuanNcIjtcblxuLy8gU2V0dXBcbndpbmRvdy5fd2FpbHMgPSB3aW5kb3cuX3dhaWxzIHx8IHt9O1xud2luZG93Ll93YWlscy5jYWxsUmVzdWx0SGFuZGxlciA9IHJlc3VsdEhhbmRsZXI7XG53aW5kb3cuX3dhaWxzLmNhbGxFcnJvckhhbmRsZXIgPSBlcnJvckhhbmRsZXI7XG5cbnR5cGUgUHJvbWlzZVJlc29sdmVycyA9IE9taXQ8Q2FuY2VsbGFibGVQcm9taXNlV2l0aFJlc29sdmVyczxhbnk+LCBcInByb21pc2VcIiB8IFwib25jYW5jZWxsZWRcIj5cblxuY29uc3QgY2FsbCA9IG5ld1J1bnRpbWVDYWxsZXIob2JqZWN0TmFtZXMuQ2FsbCk7XG5jb25zdCBjYW5jZWxDYWxsID0gbmV3UnVudGltZUNhbGxlcihvYmplY3ROYW1lcy5DYW5jZWxDYWxsKTtcbmNvbnN0IGNhbGxSZXNwb25zZXMgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZVJlc29sdmVycz4oKTtcblxuY29uc3QgQ2FsbEJpbmRpbmcgPSAwO1xuY29uc3QgQ2FuY2VsTWV0aG9kID0gMFxuXG4vKipcbiAqIEhvbGRzIGFsbCByZXF1aXJlZCBpbmZvcm1hdGlvbiBmb3IgYSBiaW5kaW5nIGNhbGwuXG4gKiBNYXkgcHJvdmlkZSBlaXRoZXIgYSBtZXRob2QgSUQgb3IgYSBtZXRob2QgbmFtZSwgYnV0IG5vdCBib3RoLlxuICovXG5leHBvcnQgdHlwZSBDYWxsT3B0aW9ucyA9IHtcbiAgICAvKiogVGhlIG51bWVyaWMgSUQgb2YgdGhlIGJvdW5kIG1ldGhvZCB0byBjYWxsLiAqL1xuICAgIG1ldGhvZElEOiBudW1iZXI7XG4gICAgLyoqIFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgYm91bmQgbWV0aG9kIHRvIGNhbGwuICovXG4gICAgbWV0aG9kTmFtZT86IG5ldmVyO1xuICAgIC8qKiBBcmd1bWVudHMgdG8gYmUgcGFzc2VkIGludG8gdGhlIGJvdW5kIG1ldGhvZC4gKi9cbiAgICBhcmdzOiBhbnlbXTtcbn0gfCB7XG4gICAgLyoqIFRoZSBudW1lcmljIElEIG9mIHRoZSBib3VuZCBtZXRob2QgdG8gY2FsbC4gKi9cbiAgICBtZXRob2RJRD86IG5ldmVyO1xuICAgIC8qKiBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGJvdW5kIG1ldGhvZCB0byBjYWxsLiAqL1xuICAgIG1ldGhvZE5hbWU6IHN0cmluZztcbiAgICAvKiogQXJndW1lbnRzIHRvIGJlIHBhc3NlZCBpbnRvIHRoZSBib3VuZCBtZXRob2QuICovXG4gICAgYXJnczogYW55W107XG59O1xuXG4vKipcbiAqIEV4Y2VwdGlvbiBjbGFzcyB0aGF0IHdpbGwgYmUgdGhyb3duIGluIGNhc2UgdGhlIGJvdW5kIG1ldGhvZCByZXR1cm5zIGFuIGVycm9yLlxuICogVGhlIHZhbHVlIG9mIHRoZSB7QGxpbmsgUnVudGltZUVycm9yI25hbWV9IHByb3BlcnR5IGlzIFwiUnVudGltZUVycm9yXCIuXG4gKi9cbmV4cG9ydCBjbGFzcyBSdW50aW1lRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIG5ldyBSdW50aW1lRXJyb3IgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgZXJyb3IgbWVzc2FnZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gYmUgZm9yd2FyZGVkIHRvIHRoZSBFcnJvciBjb25zdHJ1Y3Rvci5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlPzogc3RyaW5nLCBvcHRpb25zPzogRXJyb3JPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLm5hbWUgPSBcIlJ1bnRpbWVFcnJvclwiO1xuICAgIH1cbn1cblxuLyoqXG4gKiBIYW5kbGVzIHRoZSByZXN1bHQgb2YgYSBjYWxsIHJlcXVlc3QuXG4gKlxuICogQHBhcmFtIGlkIC0gVGhlIGlkIG9mIHRoZSByZXF1ZXN0IHRvIGhhbmRsZSB0aGUgcmVzdWx0IGZvci5cbiAqIEBwYXJhbSBkYXRhIC0gVGhlIHJlc3VsdCBkYXRhIG9mIHRoZSByZXF1ZXN0LlxuICogQHBhcmFtIGlzSlNPTiAtIEluZGljYXRlcyB3aGV0aGVyIHRoZSBkYXRhIGlzIEpTT04gb3Igbm90LlxuICovXG5mdW5jdGlvbiByZXN1bHRIYW5kbGVyKGlkOiBzdHJpbmcsIGRhdGE6IHN0cmluZywgaXNKU09OOiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgcmVzb2x2ZXJzID0gZ2V0QW5kRGVsZXRlUmVzcG9uc2UoaWQpO1xuICAgIGlmICghcmVzb2x2ZXJzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgcmVzb2x2ZXJzLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgICB9IGVsc2UgaWYgKCFpc0pTT04pIHtcbiAgICAgICAgcmVzb2x2ZXJzLnJlc29sdmUoZGF0YSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlc29sdmVycy5yZXNvbHZlKEpTT04ucGFyc2UoZGF0YSkpO1xuICAgICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICAgICAgcmVzb2x2ZXJzLnJlamVjdChuZXcgVHlwZUVycm9yKFwiY291bGQgbm90IHBhcnNlIHJlc3VsdDogXCIgKyBlcnIubWVzc2FnZSwgeyBjYXVzZTogZXJyIH0pKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBIYW5kbGVzIHRoZSBlcnJvciBmcm9tIGEgY2FsbCByZXF1ZXN0LlxuICpcbiAqIEBwYXJhbSBpZCAtIFRoZSBpZCBvZiB0aGUgcHJvbWlzZSBoYW5kbGVyLlxuICogQHBhcmFtIGRhdGEgLSBUaGUgZXJyb3IgZGF0YSB0byByZWplY3QgdGhlIHByb21pc2UgaGFuZGxlciB3aXRoLlxuICogQHBhcmFtIGlzSlNPTiAtIEluZGljYXRlcyB3aGV0aGVyIHRoZSBkYXRhIGlzIEpTT04gb3Igbm90LlxuICovXG5mdW5jdGlvbiBlcnJvckhhbmRsZXIoaWQ6IHN0cmluZywgZGF0YTogc3RyaW5nLCBpc0pTT046IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCByZXNvbHZlcnMgPSBnZXRBbmREZWxldGVSZXNwb25zZShpZCk7XG4gICAgaWYgKCFyZXNvbHZlcnMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghaXNKU09OKSB7XG4gICAgICAgIHJlc29sdmVycy5yZWplY3QobmV3IEVycm9yKGRhdGEpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgZXJyb3I6IGFueTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGVycm9yID0gSlNPTi5wYXJzZShkYXRhKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgICAgIHJlc29sdmVycy5yZWplY3QobmV3IFR5cGVFcnJvcihcImNvdWxkIG5vdCBwYXJzZSBlcnJvcjogXCIgKyBlcnIubWVzc2FnZSwgeyBjYXVzZTogZXJyIH0pKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBvcHRpb25zOiBFcnJvck9wdGlvbnMgPSB7fTtcbiAgICAgICAgaWYgKGVycm9yLmNhdXNlKSB7XG4gICAgICAgICAgICBvcHRpb25zLmNhdXNlID0gZXJyb3IuY2F1c2U7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZXhjZXB0aW9uO1xuICAgICAgICBzd2l0Y2ggKGVycm9yLmtpbmQpIHtcbiAgICAgICAgICAgIGNhc2UgXCJSZWZlcmVuY2VFcnJvclwiOlxuICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiA9IG5ldyBSZWZlcmVuY2VFcnJvcihlcnJvci5tZXNzYWdlLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJUeXBlRXJyb3JcIjpcbiAgICAgICAgICAgICAgICBleGNlcHRpb24gPSBuZXcgVHlwZUVycm9yKGVycm9yLm1lc3NhZ2UsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIlJ1bnRpbWVFcnJvclwiOlxuICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiA9IG5ldyBSdW50aW1lRXJyb3IoZXJyb3IubWVzc2FnZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiA9IG5ldyBFcnJvcihlcnJvci5tZXNzYWdlLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc29sdmVycy5yZWplY3QoZXhjZXB0aW9uKTtcbiAgICB9XG59XG5cbi8qKlxuICogUmV0cmlldmVzIGFuZCByZW1vdmVzIHRoZSByZXNwb25zZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIElEIGZyb20gdGhlIGNhbGxSZXNwb25zZXMgbWFwLlxuICpcbiAqIEBwYXJhbSBpZCAtIFRoZSBJRCBvZiB0aGUgcmVzcG9uc2UgdG8gYmUgcmV0cmlldmVkIGFuZCByZW1vdmVkLlxuICogQHJldHVybnMgVGhlIHJlc3BvbnNlIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIElELCBpZiBhbnkuXG4gKi9cbmZ1bmN0aW9uIGdldEFuZERlbGV0ZVJlc3BvbnNlKGlkOiBzdHJpbmcpOiBQcm9taXNlUmVzb2x2ZXJzIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZXNwb25zZSA9IGNhbGxSZXNwb25zZXMuZ2V0KGlkKTtcbiAgICBjYWxsUmVzcG9uc2VzLmRlbGV0ZShpZCk7XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIHVuaXF1ZSBJRCB1c2luZyB0aGUgbmFub2lkIGxpYnJhcnkuXG4gKlxuICogQHJldHVybnMgQSB1bmlxdWUgSUQgdGhhdCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgY2FsbFJlc3BvbnNlcyBzZXQuXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlSUQoKTogc3RyaW5nIHtcbiAgICBsZXQgcmVzdWx0O1xuICAgIGRvIHtcbiAgICAgICAgcmVzdWx0ID0gbmFub2lkKCk7XG4gICAgfSB3aGlsZSAoY2FsbFJlc3BvbnNlcy5oYXMocmVzdWx0KSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBDYWxsIGEgYm91bmQgbWV0aG9kIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gY2FsbCBvcHRpb25zLlxuICpcbiAqIEluIGNhc2Ugb2YgZmFpbHVyZSwgdGhlIHJldHVybmVkIHByb21pc2Ugd2lsbCByZWplY3Qgd2l0aCBhbiBleGNlcHRpb25cbiAqIGFtb25nIFJlZmVyZW5jZUVycm9yICh1bmtub3duIG1ldGhvZCksIFR5cGVFcnJvciAod3JvbmcgYXJndW1lbnQgY291bnQgb3IgdHlwZSksXG4gKiB7QGxpbmsgUnVudGltZUVycm9yfSAobWV0aG9kIHJldHVybmVkIGFuIGVycm9yKSwgb3Igb3RoZXIgKG5ldHdvcmsgb3IgaW50ZXJuYWwgZXJyb3JzKS5cbiAqIFRoZSBleGNlcHRpb24gbWlnaHQgaGF2ZSBhIFwiY2F1c2VcIiBmaWVsZCB3aXRoIHRoZSB2YWx1ZSByZXR1cm5lZFxuICogYnkgdGhlIGFwcGxpY2F0aW9uLSBvciBzZXJ2aWNlLWxldmVsIGVycm9yIG1hcnNoYWxpbmcgZnVuY3Rpb25zLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gQSBtZXRob2QgY2FsbCBkZXNjcmlwdG9yLlxuICogQHJldHVybnMgVGhlIHJlc3VsdCBvZiB0aGUgY2FsbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENhbGwob3B0aW9uczogQ2FsbE9wdGlvbnMpOiBDYW5jZWxsYWJsZVByb21pc2U8YW55PiB7XG4gICAgY29uc3QgaWQgPSBnZW5lcmF0ZUlEKCk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBDYW5jZWxsYWJsZVByb21pc2Uud2l0aFJlc29sdmVyczxhbnk+KCk7XG4gICAgY2FsbFJlc3BvbnNlcy5zZXQoaWQsIHsgcmVzb2x2ZTogcmVzdWx0LnJlc29sdmUsIHJlamVjdDogcmVzdWx0LnJlamVjdCB9KTtcblxuICAgIGNvbnN0IHJlcXVlc3QgPSBjYWxsKENhbGxCaW5kaW5nLCBPYmplY3QuYXNzaWduKHsgXCJjYWxsLWlkXCI6IGlkIH0sIG9wdGlvbnMpKTtcbiAgICBsZXQgcnVubmluZyA9IGZhbHNlO1xuXG4gICAgcmVxdWVzdC50aGVuKCgpID0+IHtcbiAgICAgICAgcnVubmluZyA9IHRydWU7XG4gICAgfSwgKGVycikgPT4ge1xuICAgICAgICBjYWxsUmVzcG9uc2VzLmRlbGV0ZShpZCk7XG4gICAgICAgIHJlc3VsdC5yZWplY3QoZXJyKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGNhbmNlbCA9ICgpID0+IHtcbiAgICAgICAgY2FsbFJlc3BvbnNlcy5kZWxldGUoaWQpO1xuICAgICAgICByZXR1cm4gY2FuY2VsQ2FsbChDYW5jZWxNZXRob2QsIHtcImNhbGwtaWRcIjogaWR9KS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIHdoaWxlIHJlcXVlc3RpbmcgYmluZGluZyBjYWxsIGNhbmNlbGxhdGlvbjpcIiwgZXJyKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJlc3VsdC5vbmNhbmNlbGxlZCA9ICgpID0+IHtcbiAgICAgICAgaWYgKHJ1bm5pbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBjYW5jZWwoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByZXF1ZXN0LnRoZW4oY2FuY2VsKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gcmVzdWx0LnByb21pc2U7XG59XG5cbi8qKlxuICogQ2FsbHMgYSBib3VuZCBtZXRob2QgYnkgbmFtZSB3aXRoIHRoZSBzcGVjaWZpZWQgYXJndW1lbnRzLlxuICogU2VlIHtAbGluayBDYWxsfSBmb3IgZGV0YWlscy5cbiAqXG4gKiBAcGFyYW0gbWV0aG9kTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBtZXRob2QgaW4gdGhlIGZvcm1hdCAncGFja2FnZS5zdHJ1Y3QubWV0aG9kJy5cbiAqIEBwYXJhbSBhcmdzIC0gVGhlIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBtZXRob2QuXG4gKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIHRoZSBtZXRob2QgY2FsbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEJ5TmFtZShtZXRob2ROYW1lOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogQ2FuY2VsbGFibGVQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBDYWxsKHsgbWV0aG9kTmFtZSwgYXJncyB9KTtcbn1cblxuLyoqXG4gKiBDYWxscyBhIG1ldGhvZCBieSBpdHMgbnVtZXJpYyBJRCB3aXRoIHRoZSBzcGVjaWZpZWQgYXJndW1lbnRzLlxuICogU2VlIHtAbGluayBDYWxsfSBmb3IgZGV0YWlscy5cbiAqXG4gKiBAcGFyYW0gbWV0aG9kSUQgLSBUaGUgSUQgb2YgdGhlIG1ldGhvZCB0byBjYWxsLlxuICogQHBhcmFtIGFyZ3MgLSBUaGUgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIG1ldGhvZC5cbiAqIEByZXR1cm4gVGhlIHJlc3VsdCBvZiB0aGUgbWV0aG9kIGNhbGwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBCeUlEKG1ldGhvZElEOiBudW1iZXIsIC4uLmFyZ3M6IGFueVtdKTogQ2FuY2VsbGFibGVQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBDYWxsKHsgbWV0aG9kSUQsIGFyZ3MgfSk7XG59XG4iLCAiLy8gU291cmNlOiBodHRwczovL2dpdGh1Yi5jb20vaW5zcGVjdC1qcy9pcy1jYWxsYWJsZVxuXG4vLyBUaGUgTUlUIExpY2Vuc2UgKE1JVClcbi8vXG4vLyBDb3B5cmlnaHQgKGMpIDIwMTUgSm9yZGFuIEhhcmJhbmRcbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4vLyBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbi8vIFNPRlRXQVJFLlxuXG52YXIgZm5Ub1N0ciA9IEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZztcbnZhciByZWZsZWN0QXBwbHk6IHR5cGVvZiBSZWZsZWN0LmFwcGx5IHwgZmFsc2UgfCBudWxsID0gdHlwZW9mIFJlZmxlY3QgPT09ICdvYmplY3QnICYmIFJlZmxlY3QgIT09IG51bGwgJiYgUmVmbGVjdC5hcHBseTtcbnZhciBiYWRBcnJheUxpa2U6IGFueTtcbnZhciBpc0NhbGxhYmxlTWFya2VyOiBhbnk7XG5pZiAodHlwZW9mIHJlZmxlY3RBcHBseSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgT2JqZWN0LmRlZmluZVByb3BlcnR5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgYmFkQXJyYXlMaWtlID0gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAnbGVuZ3RoJywge1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgaXNDYWxsYWJsZU1hcmtlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlzQ2FsbGFibGVNYXJrZXIgPSB7fTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXRocm93LWxpdGVyYWxcbiAgICAgICAgcmVmbGVjdEFwcGx5KGZ1bmN0aW9uICgpIHsgdGhyb3cgNDI7IH0sIG51bGwsIGJhZEFycmF5TGlrZSk7XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgICBpZiAoXyAhPT0gaXNDYWxsYWJsZU1hcmtlcikge1xuICAgICAgICAgICAgcmVmbGVjdEFwcGx5ID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn0gZWxzZSB7XG4gICAgcmVmbGVjdEFwcGx5ID0gbnVsbDtcbn1cblxudmFyIGNvbnN0cnVjdG9yUmVnZXggPSAvXlxccypjbGFzc1xcYi87XG52YXIgaXNFUzZDbGFzc0ZuID0gZnVuY3Rpb24gaXNFUzZDbGFzc0Z1bmN0aW9uKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgICB2YXIgZm5TdHIgPSBmblRvU3RyLmNhbGwodmFsdWUpO1xuICAgICAgICByZXR1cm4gY29uc3RydWN0b3JSZWdleC50ZXN0KGZuU3RyKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTsgLy8gbm90IGEgZnVuY3Rpb25cbiAgICB9XG59O1xuXG52YXIgdHJ5RnVuY3Rpb25PYmplY3QgPSBmdW5jdGlvbiB0cnlGdW5jdGlvblRvU3RyKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAoaXNFUzZDbGFzc0ZuKHZhbHVlKSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAgICAgZm5Ub1N0ci5jYWxsKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufTtcbnZhciB0b1N0ciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgb2JqZWN0Q2xhc3MgPSAnW29iamVjdCBPYmplY3RdJztcbnZhciBmbkNsYXNzID0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbnZhciBnZW5DbGFzcyA9ICdbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSc7XG52YXIgZGRhQ2xhc3MgPSAnW29iamVjdCBIVE1MQWxsQ29sbGVjdGlvbl0nOyAvLyBJRSAxMVxudmFyIGRkYUNsYXNzMiA9ICdbb2JqZWN0IEhUTUwgZG9jdW1lbnQuYWxsIGNsYXNzXSc7XG52YXIgZGRhQ2xhc3MzID0gJ1tvYmplY3QgSFRNTENvbGxlY3Rpb25dJzsgLy8gSUUgOS0xMFxudmFyIGhhc1RvU3RyaW5nVGFnID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiAhIVN5bWJvbC50b1N0cmluZ1RhZzsgLy8gYmV0dGVyOiB1c2UgYGhhcy10b3N0cmluZ3RhZ2BcblxudmFyIGlzSUU2OCA9ICEoMCBpbiBbLF0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNwYXJzZS1hcnJheXMsIGNvbW1hLXNwYWNpbmdcblxudmFyIGlzRERBOiAodmFsdWU6IGFueSkgPT4gYm9vbGVhbiA9IGZ1bmN0aW9uIGlzRG9jdW1lbnREb3RBbGwoKSB7IHJldHVybiBmYWxzZTsgfTtcbmlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICdvYmplY3QnKSB7XG4gICAgLy8gRmlyZWZveCAzIGNhbm9uaWNhbGl6ZXMgRERBIHRvIHVuZGVmaW5lZCB3aGVuIGl0J3Mgbm90IGFjY2Vzc2VkIGRpcmVjdGx5XG4gICAgdmFyIGFsbCA9IGRvY3VtZW50LmFsbDtcbiAgICBpZiAodG9TdHIuY2FsbChhbGwpID09PSB0b1N0ci5jYWxsKGRvY3VtZW50LmFsbCkpIHtcbiAgICAgICAgaXNEREEgPSBmdW5jdGlvbiBpc0RvY3VtZW50RG90QWxsKHZhbHVlKSB7XG4gICAgICAgICAgICAvKiBnbG9iYWxzIGRvY3VtZW50OiBmYWxzZSAqL1xuICAgICAgICAgICAgLy8gaW4gSUUgNi04LCB0eXBlb2YgZG9jdW1lbnQuYWxsIGlzIFwib2JqZWN0XCIgYW5kIGl0J3MgdHJ1dGh5XG4gICAgICAgICAgICBpZiAoKGlzSUU2OCB8fCAhdmFsdWUpICYmICh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ciA9IHRvU3RyLmNhbGwodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RyID09PSBkZGFDbGFzc1xuICAgICAgICAgICAgICAgICAgICAgICAgfHwgc3RyID09PSBkZGFDbGFzczJcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IHN0ciA9PT0gZGRhQ2xhc3MzIC8vIG9wZXJhIDEyLjE2XG4gICAgICAgICAgICAgICAgICAgICAgICB8fCBzdHIgPT09IG9iamVjdENsYXNzIC8vIElFIDYtOFxuICAgICAgICAgICAgICAgICAgICApICYmIHZhbHVlKCcnKSA9PSBudWxsOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGVxZXFlcVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgLyoqLyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH07XG4gICAgfVxufVxuXG5mdW5jdGlvbiBpc0NhbGxhYmxlUmVmQXBwbHk8VD4odmFsdWU6IFQgfCB1bmtub3duKTogdmFsdWUgaXMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkgIHtcbiAgICBpZiAoaXNEREEodmFsdWUpKSB7IHJldHVybiB0cnVlOyB9XG4gICAgaWYgKCF2YWx1ZSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgdHJ5IHtcbiAgICAgICAgKHJlZmxlY3RBcHBseSBhcyBhbnkpKHZhbHVlLCBudWxsLCBiYWRBcnJheUxpa2UpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGUgIT09IGlzQ2FsbGFibGVNYXJrZXIpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgfVxuICAgIHJldHVybiAhaXNFUzZDbGFzc0ZuKHZhbHVlKSAmJiB0cnlGdW5jdGlvbk9iamVjdCh2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIGlzQ2FsbGFibGVOb1JlZkFwcGx5PFQ+KHZhbHVlOiBUIHwgdW5rbm93bik6IHZhbHVlIGlzICguLi5hcmdzOiBhbnlbXSkgPT4gYW55IHtcbiAgICBpZiAoaXNEREEodmFsdWUpKSB7IHJldHVybiB0cnVlOyB9XG4gICAgaWYgKCF2YWx1ZSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgaWYgKGhhc1RvU3RyaW5nVGFnKSB7IHJldHVybiB0cnlGdW5jdGlvbk9iamVjdCh2YWx1ZSk7IH1cbiAgICBpZiAoaXNFUzZDbGFzc0ZuKHZhbHVlKSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICB2YXIgc3RyQ2xhc3MgPSB0b1N0ci5jYWxsKHZhbHVlKTtcbiAgICBpZiAoc3RyQ2xhc3MgIT09IGZuQ2xhc3MgJiYgc3RyQ2xhc3MgIT09IGdlbkNsYXNzICYmICEoL15cXFtvYmplY3QgSFRNTC8pLnRlc3Qoc3RyQ2xhc3MpKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIHJldHVybiB0cnlGdW5jdGlvbk9iamVjdCh2YWx1ZSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCByZWZsZWN0QXBwbHkgPyBpc0NhbGxhYmxlUmVmQXBwbHkgOiBpc0NhbGxhYmxlTm9SZWZBcHBseTtcbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuaW1wb3J0IGlzQ2FsbGFibGUgZnJvbSBcIi4vY2FsbGFibGUuanNcIjtcblxuLyoqXG4gKiBFeGNlcHRpb24gY2xhc3MgdGhhdCB3aWxsIGJlIHVzZWQgYXMgcmVqZWN0aW9uIHJlYXNvblxuICogaW4gY2FzZSBhIHtAbGluayBDYW5jZWxsYWJsZVByb21pc2V9IGlzIGNhbmNlbGxlZCBzdWNjZXNzZnVsbHkuXG4gKlxuICogVGhlIHZhbHVlIG9mIHRoZSB7QGxpbmsgbmFtZX0gcHJvcGVydHkgaXMgdGhlIHN0cmluZyBgXCJDYW5jZWxFcnJvclwiYC5cbiAqIFRoZSB2YWx1ZSBvZiB0aGUge0BsaW5rIGNhdXNlfSBwcm9wZXJ0eSBpcyB0aGUgY2F1c2UgcGFzc2VkIHRvIHRoZSBjYW5jZWwgbWV0aG9kLCBpZiBhbnkuXG4gKi9cbmV4cG9ydCBjbGFzcyBDYW5jZWxFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGBDYW5jZWxFcnJvcmAgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgZXJyb3IgbWVzc2FnZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gYmUgZm9yd2FyZGVkIHRvIHRoZSBFcnJvciBjb25zdHJ1Y3Rvci5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlPzogc3RyaW5nLCBvcHRpb25zPzogRXJyb3JPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLm5hbWUgPSBcIkNhbmNlbEVycm9yXCI7XG4gICAgfVxufVxuXG4vKipcbiAqIEV4Y2VwdGlvbiBjbGFzcyB0aGF0IHdpbGwgYmUgcmVwb3J0ZWQgYXMgYW4gdW5oYW5kbGVkIHJlamVjdGlvblxuICogaW4gY2FzZSBhIHtAbGluayBDYW5jZWxsYWJsZVByb21pc2V9IHJlamVjdHMgYWZ0ZXIgYmVpbmcgY2FuY2VsbGVkLFxuICogb3Igd2hlbiB0aGUgYG9uY2FuY2VsbGVkYCBjYWxsYmFjayB0aHJvd3Mgb3IgcmVqZWN0cy5cbiAqXG4gKiBUaGUgdmFsdWUgb2YgdGhlIHtAbGluayBuYW1lfSBwcm9wZXJ0eSBpcyB0aGUgc3RyaW5nIGBcIkNhbmNlbGxlZFJlamVjdGlvbkVycm9yXCJgLlxuICogVGhlIHZhbHVlIG9mIHRoZSB7QGxpbmsgY2F1c2V9IHByb3BlcnR5IGlzIHRoZSByZWFzb24gdGhlIHByb21pc2UgcmVqZWN0ZWQgd2l0aC5cbiAqXG4gKiBCZWNhdXNlIHRoZSBvcmlnaW5hbCBwcm9taXNlIHdhcyBjYW5jZWxsZWQsXG4gKiBhIHdyYXBwZXIgcHJvbWlzZSB3aWxsIGJlIHBhc3NlZCB0byB0aGUgdW5oYW5kbGVkIHJlamVjdGlvbiBsaXN0ZW5lciBpbnN0ZWFkLlxuICogVGhlIHtAbGluayBwcm9taXNlfSBwcm9wZXJ0eSBob2xkcyBhIHJlZmVyZW5jZSB0byB0aGUgb3JpZ2luYWwgcHJvbWlzZS5cbiAqL1xuZXhwb3J0IGNsYXNzIENhbmNlbGxlZFJlamVjdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIC8qKlxuICAgICAqIEhvbGRzIGEgcmVmZXJlbmNlIHRvIHRoZSBwcm9taXNlIHRoYXQgd2FzIGNhbmNlbGxlZCBhbmQgdGhlbiByZWplY3RlZC5cbiAgICAgKi9cbiAgICBwcm9taXNlOiBDYW5jZWxsYWJsZVByb21pc2U8dW5rbm93bj47XG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGBDYW5jZWxsZWRSZWplY3Rpb25FcnJvcmAgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHByb21pc2UgLSBUaGUgcHJvbWlzZSB0aGF0IGNhdXNlZCB0aGUgZXJyb3Igb3JpZ2luYWxseS5cbiAgICAgKiBAcGFyYW0gcmVhc29uIC0gVGhlIHJlamVjdGlvbiByZWFzb24uXG4gICAgICogQHBhcmFtIGluZm8gLSBBbiBvcHRpb25hbCBpbmZvcm1hdGl2ZSBtZXNzYWdlIHNwZWNpZnlpbmcgdGhlIGNpcmN1bXN0YW5jZXMgaW4gd2hpY2ggdGhlIGVycm9yIHdhcyB0aHJvd24uXG4gICAgICogICAgICAgICAgICAgICBEZWZhdWx0cyB0byB0aGUgc3RyaW5nIGBcIlVuaGFuZGxlZCByZWplY3Rpb24gaW4gY2FuY2VsbGVkIHByb21pc2UuXCJgLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHByb21pc2U6IENhbmNlbGxhYmxlUHJvbWlzZTx1bmtub3duPiwgcmVhc29uPzogYW55LCBpbmZvPzogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKChpbmZvID8/IFwiVW5oYW5kbGVkIHJlamVjdGlvbiBpbiBjYW5jZWxsZWQgcHJvbWlzZS5cIikgKyBcIiBSZWFzb246IFwiICsgZXJyb3JNZXNzYWdlKHJlYXNvbiksIHsgY2F1c2U6IHJlYXNvbiB9KTtcbiAgICAgICAgdGhpcy5wcm9taXNlID0gcHJvbWlzZTtcbiAgICAgICAgdGhpcy5uYW1lID0gXCJDYW5jZWxsZWRSZWplY3Rpb25FcnJvclwiO1xuICAgIH1cbn1cblxudHlwZSBDYW5jZWxsYWJsZVByb21pc2VSZXNvbHZlcjxUPiA9ICh2YWx1ZTogVCB8IFByb21pc2VMaWtlPFQ+IHwgQ2FuY2VsbGFibGVQcm9taXNlTGlrZTxUPikgPT4gdm9pZDtcbnR5cGUgQ2FuY2VsbGFibGVQcm9taXNlUmVqZWN0b3IgPSAocmVhc29uPzogYW55KSA9PiB2b2lkO1xudHlwZSBDYW5jZWxsYWJsZVByb21pc2VDYW5jZWxsZXIgPSAoY2F1c2U/OiBhbnkpID0+IHZvaWQgfCBQcm9taXNlTGlrZTx2b2lkPjtcbnR5cGUgQ2FuY2VsbGFibGVQcm9taXNlRXhlY3V0b3I8VD4gPSAocmVzb2x2ZTogQ2FuY2VsbGFibGVQcm9taXNlUmVzb2x2ZXI8VD4sIHJlamVjdDogQ2FuY2VsbGFibGVQcm9taXNlUmVqZWN0b3IpID0+IHZvaWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FuY2VsbGFibGVQcm9taXNlTGlrZTxUPiB7XG4gICAgdGhlbjxUUmVzdWx0MSA9IFQsIFRSZXN1bHQyID0gbmV2ZXI+KG9uZnVsZmlsbGVkPzogKCh2YWx1ZTogVCkgPT4gVFJlc3VsdDEgfCBQcm9taXNlTGlrZTxUUmVzdWx0MT4gfCBDYW5jZWxsYWJsZVByb21pc2VMaWtlPFRSZXN1bHQxPikgfCB1bmRlZmluZWQgfCBudWxsLCBvbnJlamVjdGVkPzogKChyZWFzb246IGFueSkgPT4gVFJlc3VsdDIgfCBQcm9taXNlTGlrZTxUUmVzdWx0Mj4gfCBDYW5jZWxsYWJsZVByb21pc2VMaWtlPFRSZXN1bHQyPikgfCB1bmRlZmluZWQgfCBudWxsKTogQ2FuY2VsbGFibGVQcm9taXNlTGlrZTxUUmVzdWx0MSB8IFRSZXN1bHQyPjtcbiAgICBjYW5jZWwoY2F1c2U/OiBhbnkpOiB2b2lkO1xufVxuXG4vKipcbiAqIFdyYXBzIGEgY2FuY2VsbGFibGUgcHJvbWlzZSBhbG9uZyB3aXRoIGl0cyByZXNvbHV0aW9uIG1ldGhvZHMuXG4gKiBUaGUgYG9uY2FuY2VsbGVkYCBmaWVsZCB3aWxsIGJlIG51bGwgaW5pdGlhbGx5IGJ1dCBtYXkgYmUgc2V0IHRvIHByb3ZpZGUgYSBjdXN0b20gY2FuY2VsbGF0aW9uIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhbmNlbGxhYmxlUHJvbWlzZVdpdGhSZXNvbHZlcnM8VD4ge1xuICAgIHByb21pc2U6IENhbmNlbGxhYmxlUHJvbWlzZTxUPjtcbiAgICByZXNvbHZlOiBDYW5jZWxsYWJsZVByb21pc2VSZXNvbHZlcjxUPjtcbiAgICByZWplY3Q6IENhbmNlbGxhYmxlUHJvbWlzZVJlamVjdG9yO1xuICAgIG9uY2FuY2VsbGVkOiBDYW5jZWxsYWJsZVByb21pc2VDYW5jZWxsZXIgfCBudWxsO1xufVxuXG5pbnRlcmZhY2UgQ2FuY2VsbGFibGVQcm9taXNlU3RhdGUge1xuICAgIHJlYWRvbmx5IHJvb3Q6IENhbmNlbGxhYmxlUHJvbWlzZVN0YXRlO1xuICAgIHJlc29sdmluZzogYm9vbGVhbjtcbiAgICBzZXR0bGVkOiBib29sZWFuO1xuICAgIHJlYXNvbj86IENhbmNlbEVycm9yO1xufVxuXG4vLyBQcml2YXRlIGZpZWxkIG5hbWVzLlxuY29uc3QgYmFycmllclN5bSA9IFN5bWJvbChcImJhcnJpZXJcIik7XG5jb25zdCBjYW5jZWxJbXBsU3ltID0gU3ltYm9sKFwiY2FuY2VsSW1wbFwiKTtcbmNvbnN0IHNwZWNpZXMgPSBTeW1ib2wuc3BlY2llcyA/PyBTeW1ib2woXCJzcGVjaWVzUG9seWZpbGxcIik7XG5cbi8qKlxuICogQSBwcm9taXNlIHdpdGggYW4gYXR0YWNoZWQgbWV0aG9kIGZvciBjYW5jZWxsaW5nIGxvbmctcnVubmluZyBvcGVyYXRpb25zIChzZWUge0BsaW5rIENhbmNlbGxhYmxlUHJvbWlzZSNjYW5jZWx9KS5cbiAqIENhbmNlbGxhdGlvbiBjYW4gb3B0aW9uYWxseSBiZSBib3VuZCB0byBhbiB7QGxpbmsgQWJvcnRTaWduYWx9XG4gKiBmb3IgYmV0dGVyIGNvbXBvc2FiaWxpdHkgKHNlZSB7QGxpbmsgQ2FuY2VsbGFibGVQcm9taXNlI2NhbmNlbE9ufSkuXG4gKlxuICogQ2FuY2VsbGluZyBhIHBlbmRpbmcgcHJvbWlzZSB3aWxsIHJlc3VsdCBpbiBhbiBpbW1lZGlhdGUgcmVqZWN0aW9uXG4gKiB3aXRoIGFuIGluc3RhbmNlIG9mIHtAbGluayBDYW5jZWxFcnJvcn0gYXMgcmVhc29uLFxuICogYnV0IHdob2V2ZXIgc3RhcnRlZCB0aGUgcHJvbWlzZSB3aWxsIGJlIHJlc3BvbnNpYmxlXG4gKiBmb3IgYWN0dWFsbHkgYWJvcnRpbmcgdGhlIHVuZGVybHlpbmcgb3BlcmF0aW9uLlxuICogVG8gdGhpcyBwdXJwb3NlLCB0aGUgY29uc3RydWN0b3IgYW5kIGFsbCBjaGFpbmluZyBtZXRob2RzXG4gKiBhY2NlcHQgb3B0aW9uYWwgY2FuY2VsbGF0aW9uIGNhbGxiYWNrcy5cbiAqXG4gKiBJZiBhIGBDYW5jZWxsYWJsZVByb21pc2VgIHN0aWxsIHJlc29sdmVzIGFmdGVyIGhhdmluZyBiZWVuIGNhbmNlbGxlZCxcbiAqIHRoZSByZXN1bHQgd2lsbCBiZSBkaXNjYXJkZWQuIElmIGl0IHJlamVjdHMsIHRoZSByZWFzb25cbiAqIHdpbGwgYmUgcmVwb3J0ZWQgYXMgYW4gdW5oYW5kbGVkIHJlamVjdGlvbixcbiAqIHdyYXBwZWQgaW4gYSB7QGxpbmsgQ2FuY2VsbGVkUmVqZWN0aW9uRXJyb3J9IGluc3RhbmNlLlxuICogVG8gZmFjaWxpdGF0ZSB0aGUgaGFuZGxpbmcgb2YgY2FuY2VsbGF0aW9uIHJlcXVlc3RzLFxuICogY2FuY2VsbGVkIGBDYW5jZWxsYWJsZVByb21pc2VgcyB3aWxsIF9ub3RfIHJlcG9ydCB1bmhhbmRsZWQgYENhbmNlbEVycm9yYHNcbiAqIHdob3NlIGBjYXVzZWAgZmllbGQgaXMgdGhlIHNhbWUgYXMgdGhlIG9uZSB3aXRoIHdoaWNoIHRoZSBjdXJyZW50IHByb21pc2Ugd2FzIGNhbmNlbGxlZC5cbiAqXG4gKiBBbGwgdXN1YWwgcHJvbWlzZSBtZXRob2RzIGFyZSBkZWZpbmVkIGFuZCByZXR1cm4gYSBgQ2FuY2VsbGFibGVQcm9taXNlYFxuICogd2hvc2UgY2FuY2VsIG1ldGhvZCB3aWxsIGNhbmNlbCB0aGUgcGFyZW50IG9wZXJhdGlvbiBhcyB3ZWxsLCBwcm9wYWdhdGluZyB0aGUgY2FuY2VsbGF0aW9uIHJlYXNvblxuICogdXB3YXJkcyB0aHJvdWdoIHByb21pc2UgY2hhaW5zLlxuICogQ29udmVyc2VseSwgY2FuY2VsbGluZyBhIHByb21pc2Ugd2lsbCBub3QgYXV0b21hdGljYWxseSBjYW5jZWwgZGVwZW5kZW50IHByb21pc2VzIGRvd25zdHJlYW06XG4gKiBgYGB0c1xuICogbGV0IHJvb3QgPSBuZXcgQ2FuY2VsbGFibGVQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsgLi4uIH0pO1xuICogbGV0IGNoaWxkMSA9IHJvb3QudGhlbigoKSA9PiB7IC4uLiB9KTtcbiAqIGxldCBjaGlsZDIgPSBjaGlsZDEudGhlbigoKSA9PiB7IC4uLiB9KTtcbiAqIGxldCBjaGlsZDMgPSByb290LmNhdGNoKCgpID0+IHsgLi4uIH0pO1xuICogY2hpbGQxLmNhbmNlbCgpOyAvLyBDYW5jZWxzIGNoaWxkMSBhbmQgcm9vdCwgYnV0IG5vdCBjaGlsZDIgb3IgY2hpbGQzXG4gKiBgYGBcbiAqIENhbmNlbGxpbmcgYSBwcm9taXNlIHRoYXQgaGFzIGFscmVhZHkgc2V0dGxlZCBpcyBzYWZlIGFuZCBoYXMgbm8gY29uc2VxdWVuY2UuXG4gKlxuICogVGhlIGBjYW5jZWxgIG1ldGhvZCByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IF9hbHdheXMgZnVsZmlsbHNfXG4gKiBhZnRlciB0aGUgd2hvbGUgY2hhaW4gaGFzIHByb2Nlc3NlZCB0aGUgY2FuY2VsIHJlcXVlc3RcbiAqIGFuZCBhbGwgYXR0YWNoZWQgY2FsbGJhY2tzIHVwIHRvIHRoYXQgbW9tZW50IGhhdmUgcnVuLlxuICpcbiAqIEFsbCBFUzIwMjQgcHJvbWlzZSBtZXRob2RzIChzdGF0aWMgYW5kIGluc3RhbmNlKSBhcmUgZGVmaW5lZCBvbiBDYW5jZWxsYWJsZVByb21pc2UsXG4gKiBidXQgYWN0dWFsIGF2YWlsYWJpbGl0eSBtYXkgdmFyeSB3aXRoIE9TL3dlYnZpZXcgdmVyc2lvbi5cbiAqXG4gKiBJbiBsaW5lIHdpdGggdGhlIHByb3Bvc2FsIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXJtLWJ1aWx0aW4tc3ViY2xhc3NpbmcsXG4gKiBgQ2FuY2VsbGFibGVQcm9taXNlYCBkb2VzIG5vdCBzdXBwb3J0IHRyYW5zcGFyZW50IHN1YmNsYXNzaW5nLlxuICogRXh0ZW5kZXJzIHNob3VsZCB0YWtlIGNhcmUgdG8gcHJvdmlkZSB0aGVpciBvd24gbWV0aG9kIGltcGxlbWVudGF0aW9ucy5cbiAqIFRoaXMgbWlnaHQgYmUgcmVjb25zaWRlcmVkIGluIGNhc2UgdGhlIHByb3Bvc2FsIGlzIHJldGlyZWQuXG4gKlxuICogQ2FuY2VsbGFibGVQcm9taXNlIGlzIGEgd3JhcHBlciBhcm91bmQgdGhlIERPTSBQcm9taXNlIG9iamVjdFxuICogYW5kIGlzIGNvbXBsaWFudCB3aXRoIHRoZSBbUHJvbWlzZXMvQSsgc3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8pXG4gKiAoaXQgcGFzc2VzIHRoZSBbY29tcGxpYW5jZSBzdWl0ZV0oaHR0cHM6Ly9naXRodWIuY29tL3Byb21pc2VzLWFwbHVzL3Byb21pc2VzLXRlc3RzKSlcbiAqIGlmIHNvIGlzIHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgQ2FuY2VsbGFibGVQcm9taXNlPFQ+IGV4dGVuZHMgUHJvbWlzZTxUPiBpbXBsZW1lbnRzIFByb21pc2VMaWtlPFQ+LCBDYW5jZWxsYWJsZVByb21pc2VMaWtlPFQ+IHtcbiAgICAvLyBQcml2YXRlIGZpZWxkcy5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgcHJpdmF0ZSBbYmFycmllclN5bV0hOiBQYXJ0aWFsPFByb21pc2VXaXRoUmVzb2x2ZXJzPHZvaWQ+PiB8IG51bGw7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgW2NhbmNlbEltcGxTeW1dITogKHJlYXNvbjogQ2FuY2VsRXJyb3IpID0+IHZvaWQgfCBQcm9taXNlTGlrZTx2b2lkPjtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgYENhbmNlbGxhYmxlUHJvbWlzZWAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZXhlY3V0b3IgLSBBIGNhbGxiYWNrIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcHJvbWlzZS4gVGhpcyBjYWxsYmFjayBpcyBwYXNzZWQgdHdvIGFyZ3VtZW50czpcbiAgICAgKiAgICAgICAgICAgICAgICAgICBhIGByZXNvbHZlYCBjYWxsYmFjayB1c2VkIHRvIHJlc29sdmUgdGhlIHByb21pc2Ugd2l0aCBhIHZhbHVlXG4gICAgICogICAgICAgICAgICAgICAgICAgb3IgdGhlIHJlc3VsdCBvZiBhbm90aGVyIHByb21pc2UgKHBvc3NpYmx5IGNhbmNlbGxhYmxlKSxcbiAgICAgKiAgICAgICAgICAgICAgICAgICBhbmQgYSBgcmVqZWN0YCBjYWxsYmFjayB1c2VkIHRvIHJlamVjdCB0aGUgcHJvbWlzZSB3aXRoIGEgcHJvdmlkZWQgcmVhc29uIG9yIGVycm9yLlxuICAgICAqICAgICAgICAgICAgICAgICAgIElmIHRoZSB2YWx1ZSBwcm92aWRlZCB0byB0aGUgYHJlc29sdmVgIGNhbGxiYWNrIGlzIGEgdGhlbmFibGUgX2FuZF8gY2FuY2VsbGFibGUgb2JqZWN0XG4gICAgICogICAgICAgICAgICAgICAgICAgKGl0IGhhcyBhIGB0aGVuYCBfYW5kXyBhIGBjYW5jZWxgIG1ldGhvZCksXG4gICAgICogICAgICAgICAgICAgICAgICAgY2FuY2VsbGF0aW9uIHJlcXVlc3RzIHdpbGwgYmUgZm9yd2FyZGVkIHRvIHRoYXQgb2JqZWN0IGFuZCB0aGUgb25jYW5jZWxsZWQgd2lsbCBub3QgYmUgaW52b2tlZCBhbnltb3JlLlxuICAgICAqICAgICAgICAgICAgICAgICAgIElmIGFueSBvbmUgb2YgdGhlIHR3byBjYWxsYmFja3MgaXMgY2FsbGVkIF9hZnRlcl8gdGhlIHByb21pc2UgaGFzIGJlZW4gY2FuY2VsbGVkLFxuICAgICAqICAgICAgICAgICAgICAgICAgIHRoZSBwcm92aWRlZCB2YWx1ZXMgd2lsbCBiZSBjYW5jZWxsZWQgYW5kIHJlc29sdmVkIGFzIHVzdWFsLFxuICAgICAqICAgICAgICAgICAgICAgICAgIGJ1dCB0aGVpciByZXN1bHRzIHdpbGwgYmUgZGlzY2FyZGVkLlxuICAgICAqICAgICAgICAgICAgICAgICAgIEhvd2V2ZXIsIGlmIHRoZSByZXNvbHV0aW9uIHByb2Nlc3MgdWx0aW1hdGVseSBlbmRzIHVwIGluIGEgcmVqZWN0aW9uXG4gICAgICogICAgICAgICAgICAgICAgICAgdGhhdCBpcyBub3QgZHVlIHRvIGNhbmNlbGxhdGlvbiwgdGhlIHJlamVjdGlvbiByZWFzb25cbiAgICAgKiAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHdyYXBwZWQgaW4gYSB7QGxpbmsgQ2FuY2VsbGVkUmVqZWN0aW9uRXJyb3J9XG4gICAgICogICAgICAgICAgICAgICAgICAgYW5kIGJ1YmJsZWQgdXAgYXMgYW4gdW5oYW5kbGVkIHJlamVjdGlvbi5cbiAgICAgKiBAcGFyYW0gb25jYW5jZWxsZWQgLSBJdCBpcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZW5zdXJlIHRoYXQgYW55IG9wZXJhdGlvblxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZWQgYnkgdGhlIGV4ZWN1dG9yIGlzIHByb3Blcmx5IGhhbHRlZCB1cG9uIGNhbmNlbGxhdGlvbi5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBUaGlzIG9wdGlvbmFsIGNhbGxiYWNrIGNhbiBiZSB1c2VkIHRvIHRoYXQgcHVycG9zZS5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBJdCB3aWxsIGJlIGNhbGxlZCBfc3luY2hyb25vdXNseV8gd2l0aCBhIGNhbmNlbGxhdGlvbiBjYXVzZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIHdoZW4gY2FuY2VsbGF0aW9uIGlzIHJlcXVlc3RlZCwgX2FmdGVyXyB0aGUgcHJvbWlzZSBoYXMgYWxyZWFkeSByZWplY3RlZFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIHdpdGggYSB7QGxpbmsgQ2FuY2VsRXJyb3J9LCBidXQgX2JlZm9yZV9cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBhbnkge0BsaW5rIHRoZW59L3tAbGluayBjYXRjaH0ve0BsaW5rIGZpbmFsbHl9IGNhbGxiYWNrIHJ1bnMuXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIGNhbGxiYWNrIHJldHVybnMgYSB0aGVuYWJsZSwgdGhlIHByb21pc2UgcmV0dXJuZWQgZnJvbSB7QGxpbmsgY2FuY2VsfVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIHdpbGwgb25seSBmdWxmaWxsIGFmdGVyIHRoZSBmb3JtZXIgaGFzIHNldHRsZWQuXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgVW5oYW5kbGVkIGV4Y2VwdGlvbnMgb3IgcmVqZWN0aW9ucyBmcm9tIHRoZSBjYWxsYmFjayB3aWxsIGJlIHdyYXBwZWRcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBpbiBhIHtAbGluayBDYW5jZWxsZWRSZWplY3Rpb25FcnJvcn0gYW5kIGJ1YmJsZWQgdXAgYXMgdW5oYW5kbGVkIHJlamVjdGlvbnMuXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIGByZXNvbHZlYCBjYWxsYmFjayBpcyBjYWxsZWQgYmVmb3JlIGNhbmNlbGxhdGlvbiB3aXRoIGEgY2FuY2VsbGFibGUgcHJvbWlzZSxcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb24gcmVxdWVzdHMgb24gdGhpcyBwcm9taXNlIHdpbGwgYmUgZGl2ZXJ0ZWQgdG8gdGhhdCBwcm9taXNlLFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGUgb3JpZ2luYWwgYG9uY2FuY2VsbGVkYCBjYWxsYmFjayB3aWxsIGJlIGRpc2NhcmRlZC5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihleGVjdXRvcjogQ2FuY2VsbGFibGVQcm9taXNlRXhlY3V0b3I8VD4sIG9uY2FuY2VsbGVkPzogQ2FuY2VsbGFibGVQcm9taXNlQ2FuY2VsbGVyKSB7XG4gICAgICAgIGxldCByZXNvbHZlITogKHZhbHVlOiBUIHwgUHJvbWlzZUxpa2U8VD4pID0+IHZvaWQ7XG4gICAgICAgIGxldCByZWplY3QhOiAocmVhc29uPzogYW55KSA9PiB2b2lkO1xuICAgICAgICBzdXBlcigocmVzLCByZWopID0+IHsgcmVzb2x2ZSA9IHJlczsgcmVqZWN0ID0gcmVqOyB9KTtcblxuICAgICAgICBpZiAoKHRoaXMuY29uc3RydWN0b3IgYXMgYW55KVtzcGVjaWVzXSAhPT0gUHJvbWlzZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbmNlbGxhYmxlUHJvbWlzZSBkb2VzIG5vdCBzdXBwb3J0IHRyYW5zcGFyZW50IHN1YmNsYXNzaW5nLiBQbGVhc2UgcmVmcmFpbiBmcm9tIG92ZXJyaWRpbmcgdGhlIFtTeW1ib2wuc3BlY2llc10gc3RhdGljIHByb3BlcnR5LlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwcm9taXNlOiBDYW5jZWxsYWJsZVByb21pc2VXaXRoUmVzb2x2ZXJzPFQ+ID0ge1xuICAgICAgICAgICAgcHJvbWlzZTogdGhpcyxcbiAgICAgICAgICAgIHJlc29sdmUsXG4gICAgICAgICAgICByZWplY3QsXG4gICAgICAgICAgICBnZXQgb25jYW5jZWxsZWQoKSB7IHJldHVybiBvbmNhbmNlbGxlZCA/PyBudWxsOyB9LFxuICAgICAgICAgICAgc2V0IG9uY2FuY2VsbGVkKGNiKSB7IG9uY2FuY2VsbGVkID0gY2IgPz8gdW5kZWZpbmVkOyB9XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3Qgc3RhdGU6IENhbmNlbGxhYmxlUHJvbWlzZVN0YXRlID0ge1xuICAgICAgICAgICAgZ2V0IHJvb3QoKSB7IHJldHVybiBzdGF0ZTsgfSxcbiAgICAgICAgICAgIHJlc29sdmluZzogZmFsc2UsXG4gICAgICAgICAgICBzZXR0bGVkOiBmYWxzZVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFNldHVwIGNhbmNlbGxhdGlvbiBzeXN0ZW0uXG4gICAgICAgIHZvaWQgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcywge1xuICAgICAgICAgICAgW2JhcnJpZXJTeW1dOiB7XG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtjYW5jZWxJbXBsU3ltXToge1xuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBjYW5jZWxsZXJGb3IocHJvbWlzZSwgc3RhdGUpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFJ1biB0aGUgYWN0dWFsIGV4ZWN1dG9yLlxuICAgICAgICBjb25zdCByZWplY3RvciA9IHJlamVjdG9yRm9yKHByb21pc2UsIHN0YXRlKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGV4ZWN1dG9yKHJlc29sdmVyRm9yKHByb21pc2UsIHN0YXRlKSwgcmVqZWN0b3IpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZS5yZXNvbHZpbmcpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIlVuaGFuZGxlZCBleGNlcHRpb24gaW4gQ2FuY2VsbGFibGVQcm9taXNlIGV4ZWN1dG9yLlwiLCBlcnIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZWplY3RvcihlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FuY2VscyBpbW1lZGlhdGVseSB0aGUgZXhlY3V0aW9uIG9mIHRoZSBvcGVyYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgcHJvbWlzZS5cbiAgICAgKiBUaGUgcHJvbWlzZSByZWplY3RzIHdpdGggYSB7QGxpbmsgQ2FuY2VsRXJyb3J9IGluc3RhbmNlIGFzIHJlYXNvbixcbiAgICAgKiB3aXRoIHRoZSB7QGxpbmsgQ2FuY2VsRXJyb3IjY2F1c2V9IHByb3BlcnR5IHNldCB0byB0aGUgZ2l2ZW4gYXJndW1lbnQsIGlmIGFueS5cbiAgICAgKlxuICAgICAqIEhhcyBubyBlZmZlY3QgaWYgY2FsbGVkIGFmdGVyIHRoZSBwcm9taXNlIGhhcyBhbHJlYWR5IHNldHRsZWQ7XG4gICAgICogcmVwZWF0ZWQgY2FsbHMgaW4gcGFydGljdWxhciBhcmUgc2FmZSwgYnV0IG9ubHkgdGhlIGZpcnN0IG9uZVxuICAgICAqIHdpbGwgc2V0IHRoZSBjYW5jZWxsYXRpb24gY2F1c2UuXG4gICAgICpcbiAgICAgKiBUaGUgYENhbmNlbEVycm9yYCBleGNlcHRpb24gX25lZWQgbm90XyBiZSBoYW5kbGVkIGV4cGxpY2l0bHkgX29uIHRoZSBwcm9taXNlcyB0aGF0IGFyZSBiZWluZyBjYW5jZWxsZWQ6X1xuICAgICAqIGNhbmNlbGxpbmcgYSBwcm9taXNlIHdpdGggbm8gYXR0YWNoZWQgcmVqZWN0aW9uIGhhbmRsZXIgZG9lcyBub3QgdHJpZ2dlciBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uIGV2ZW50LlxuICAgICAqIFRoZXJlZm9yZSwgdGhlIGZvbGxvd2luZyBpZGlvbXMgYXJlIGFsbCBlcXVhbGx5IGNvcnJlY3Q6XG4gICAgICogYGBgdHNcbiAgICAgKiBuZXcgQ2FuY2VsbGFibGVQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsgLi4uIH0pLmNhbmNlbCgpO1xuICAgICAqIG5ldyBDYW5jZWxsYWJsZVByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4geyAuLi4gfSkudGhlbiguLi4pLmNhbmNlbCgpO1xuICAgICAqIG5ldyBDYW5jZWxsYWJsZVByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4geyAuLi4gfSkudGhlbiguLi4pLmNhdGNoKC4uLikuY2FuY2VsKCk7XG4gICAgICogYGBgXG4gICAgICogV2hlbmV2ZXIgc29tZSBjYW5jZWxsZWQgcHJvbWlzZSBpbiBhIGNoYWluIHJlamVjdHMgd2l0aCBhIGBDYW5jZWxFcnJvcmBcbiAgICAgKiB3aXRoIHRoZSBzYW1lIGNhbmNlbGxhdGlvbiBjYXVzZSBhcyBpdHNlbGYsIHRoZSBlcnJvciB3aWxsIGJlIGRpc2NhcmRlZCBzaWxlbnRseS5cbiAgICAgKiBIb3dldmVyLCB0aGUgYENhbmNlbEVycm9yYCBfd2lsbCBzdGlsbCBiZSBkZWxpdmVyZWRfIHRvIGFsbCBhdHRhY2hlZCByZWplY3Rpb24gaGFuZGxlcnNcbiAgICAgKiBhZGRlZCBieSB7QGxpbmsgdGhlbn0gYW5kIHJlbGF0ZWQgbWV0aG9kczpcbiAgICAgKiBgYGB0c1xuICAgICAqIGxldCBjYW5jZWxsYWJsZSA9IG5ldyBDYW5jZWxsYWJsZVByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4geyAuLi4gfSk7XG4gICAgICogY2FuY2VsbGFibGUudGhlbigoKSA9PiB7IC4uLiB9KS5jYXRjaChjb25zb2xlLmxvZyk7XG4gICAgICogY2FuY2VsbGFibGUuY2FuY2VsKCk7IC8vIEEgQ2FuY2VsRXJyb3IgaXMgcHJpbnRlZCB0byB0aGUgY29uc29sZS5cbiAgICAgKiBgYGBcbiAgICAgKiBJZiB0aGUgYENhbmNlbEVycm9yYCBpcyBub3QgaGFuZGxlZCBkb3duc3RyZWFtIGJ5IHRoZSB0aW1lIGl0IHJlYWNoZXNcbiAgICAgKiBhIF9ub24tY2FuY2VsbGVkXyBwcm9taXNlLCBpdCBfd2lsbF8gdHJpZ2dlciBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uIGV2ZW50LFxuICAgICAqIGp1c3QgbGlrZSBub3JtYWwgcmVqZWN0aW9ucyB3b3VsZDpcbiAgICAgKiBgYGB0c1xuICAgICAqIGxldCBjYW5jZWxsYWJsZSA9IG5ldyBDYW5jZWxsYWJsZVByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4geyAuLi4gfSk7XG4gICAgICogbGV0IGNoYWluZWQgPSBjYW5jZWxsYWJsZS50aGVuKCgpID0+IHsgLi4uIH0pLnRoZW4oKCkgPT4geyAuLi4gfSk7IC8vIE5vIGNhdGNoLi4uXG4gICAgICogY2FuY2VsbGFibGUuY2FuY2VsKCk7IC8vIFVuaGFuZGxlZCByZWplY3Rpb24gZXZlbnQgb24gY2hhaW5lZCFcbiAgICAgKiBgYGBcbiAgICAgKiBUaGVyZWZvcmUsIGl0IGlzIGltcG9ydGFudCB0byBlaXRoZXIgY2FuY2VsIHdob2xlIHByb21pc2UgY2hhaW5zIGZyb20gdGhlaXIgdGFpbCxcbiAgICAgKiBhcyBzaG93biBpbiB0aGUgY29ycmVjdCBpZGlvbXMgYWJvdmUsIG9yIHRha2UgY2FyZSBvZiBoYW5kbGluZyBlcnJvcnMgZXZlcnl3aGVyZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEEgY2FuY2VsbGFibGUgcHJvbWlzZSB0aGF0IF9mdWxmaWxsc18gYWZ0ZXIgdGhlIGNhbmNlbCBjYWxsYmFjayAoaWYgYW55KVxuICAgICAqIGFuZCBhbGwgaGFuZGxlcnMgYXR0YWNoZWQgdXAgdG8gdGhlIGNhbGwgdG8gY2FuY2VsIGhhdmUgcnVuLlxuICAgICAqIElmIHRoZSBjYW5jZWwgY2FsbGJhY2sgcmV0dXJucyBhIHRoZW5hYmxlLCB0aGUgcHJvbWlzZSByZXR1cm5lZCBieSBgY2FuY2VsYFxuICAgICAqIHdpbGwgYWxzbyB3YWl0IGZvciB0aGF0IHRoZW5hYmxlIHRvIHNldHRsZS5cbiAgICAgKiBUaGlzIGVuYWJsZXMgY2FsbGVycyB0byB3YWl0IGZvciB0aGUgY2FuY2VsbGVkIG9wZXJhdGlvbiB0byB0ZXJtaW5hdGVcbiAgICAgKiB3aXRob3V0IGJlaW5nIGZvcmNlZCB0byBoYW5kbGUgcG90ZW50aWFsIGVycm9ycyBhdCB0aGUgY2FsbCBzaXRlLlxuICAgICAqIGBgYHRzXG4gICAgICogY2FuY2VsbGFibGUuY2FuY2VsKCkudGhlbigoKSA9PiB7XG4gICAgICogICAgIC8vIENsZWFudXAgZmluaXNoZWQsIGl0J3Mgc2FmZSB0byBkbyBzb21ldGhpbmcgZWxzZS5cbiAgICAgKiB9LCAoZXJyKSA9PiB7XG4gICAgICogICAgIC8vIFVucmVhY2hhYmxlOiB0aGUgcHJvbWlzZSByZXR1cm5lZCBmcm9tIGNhbmNlbCB3aWxsIG5ldmVyIHJlamVjdC5cbiAgICAgKiB9KTtcbiAgICAgKiBgYGBcbiAgICAgKiBOb3RlIHRoYXQgdGhlIHJldHVybmVkIHByb21pc2Ugd2lsbCBfbm90XyBoYW5kbGUgaW1wbGljaXRseSBhbnkgcmVqZWN0aW9uXG4gICAgICogdGhhdCBtaWdodCBoYXZlIG9jY3VycmVkIGFscmVhZHkgaW4gdGhlIGNhbmNlbGxlZCBjaGFpbi5cbiAgICAgKiBJdCB3aWxsIGp1c3QgdHJhY2sgd2hldGhlciByZWdpc3RlcmVkIGhhbmRsZXJzIGhhdmUgYmVlbiBleGVjdXRlZCBvciBub3QuXG4gICAgICogVGhlcmVmb3JlLCB1bmhhbmRsZWQgcmVqZWN0aW9ucyB3aWxsIG5ldmVyIGJlIHNpbGVudGx5IGhhbmRsZWQgYnkgY2FsbGluZyBjYW5jZWwuXG4gICAgICovXG4gICAgY2FuY2VsKGNhdXNlPzogYW55KTogQ2FuY2VsbGFibGVQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBDYW5jZWxsYWJsZVByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIFByb21pc2UuYWxsU2V0dGxlZChbXG4gICAgICAgICAgICAgICAgdGhpc1tjYW5jZWxJbXBsU3ltXShuZXcgQ2FuY2VsRXJyb3IoXCJQcm9taXNlIGNhbmNlbGxlZC5cIiwgeyBjYXVzZSB9KSksXG4gICAgICAgICAgICAgICAgY3VycmVudEJhcnJpZXIodGhpcylcbiAgICAgICAgICAgIF0pLnRoZW4oKCkgPT4gcmVzb2x2ZSgpLCAoKSA9PiByZXNvbHZlKCkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCaW5kcyBwcm9taXNlIGNhbmNlbGxhdGlvbiB0byB0aGUgYWJvcnQgZXZlbnQgb2YgdGhlIGdpdmVuIHtAbGluayBBYm9ydFNpZ25hbH0uXG4gICAgICogSWYgdGhlIHNpZ25hbCBoYXMgYWxyZWFkeSBhYm9ydGVkLCB0aGUgcHJvbWlzZSB3aWxsIGJlIGNhbmNlbGxlZCBpbW1lZGlhdGVseS5cbiAgICAgKiBXaGVuIGVpdGhlciBjb25kaXRpb24gaXMgdmVyaWZpZWQsIHRoZSBjYW5jZWxsYXRpb24gY2F1c2Ugd2lsbCBiZSBzZXRcbiAgICAgKiB0byB0aGUgc2lnbmFsJ3MgYWJvcnQgcmVhc29uIChzZWUge0BsaW5rIEFib3J0U2lnbmFsI3JlYXNvbn0pLlxuICAgICAqXG4gICAgICogSGFzIG5vIGVmZmVjdCBpZiBjYWxsZWQgKG9yIGlmIHRoZSBzaWduYWwgYWJvcnRzKSBfYWZ0ZXJfIHRoZSBwcm9taXNlIGhhcyBhbHJlYWR5IHNldHRsZWQuXG4gICAgICogT25seSB0aGUgZmlyc3Qgc2lnbmFsIHRvIGFib3J0IHdpbGwgc2V0IHRoZSBjYW5jZWxsYXRpb24gY2F1c2UuXG4gICAgICpcbiAgICAgKiBGb3IgbW9yZSBkZXRhaWxzIGFib3V0IHRoZSBjYW5jZWxsYXRpb24gcHJvY2VzcyxcbiAgICAgKiBzZWUge0BsaW5rIGNhbmNlbH0gYW5kIHRoZSBgQ2FuY2VsbGFibGVQcm9taXNlYCBjb25zdHJ1Y3Rvci5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGVuYWJsZXMgYGF3YWl0YGluZyBjYW5jZWxsYWJsZSBwcm9taXNlcyB3aXRob3V0IGhhdmluZ1xuICAgICAqIHRvIHN0b3JlIHRoZW0gZm9yIGZ1dHVyZSBjYW5jZWxsYXRpb24sIGUuZy46XG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBsb25nUnVubmluZ09wZXJhdGlvbigpLmNhbmNlbE9uKHNpZ25hbCk7XG4gICAgICogYGBgXG4gICAgICogaW5zdGVhZCBvZjpcbiAgICAgKiBgYGB0c1xuICAgICAqIGxldCBwcm9taXNlVG9CZUNhbmNlbGxlZCA9IGxvbmdSdW5uaW5nT3BlcmF0aW9uKCk7XG4gICAgICogYXdhaXQgcHJvbWlzZVRvQmVDYW5jZWxsZWQ7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGlzIHByb21pc2UsIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICovXG4gICAgY2FuY2VsT24oc2lnbmFsOiBBYm9ydFNpZ25hbCk6IENhbmNlbGxhYmxlUHJvbWlzZTxUPiB7XG4gICAgICAgIGlmIChzaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgICAgdm9pZCB0aGlzLmNhbmNlbChzaWduYWwucmVhc29uKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgKCkgPT4gdm9pZCB0aGlzLmNhbmNlbChzaWduYWwucmVhc29uKSwge2NhcHR1cmU6IHRydWV9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEF0dGFjaGVzIGNhbGxiYWNrcyBmb3IgdGhlIHJlc29sdXRpb24gYW5kL29yIHJlamVjdGlvbiBvZiB0aGUgYENhbmNlbGxhYmxlUHJvbWlzZWAuXG4gICAgICpcbiAgICAgKiBUaGUgb3B0aW9uYWwgYG9uY2FuY2VsbGVkYCBhcmd1bWVudCB3aWxsIGJlIGludm9rZWQgd2hlbiB0aGUgcmV0dXJuZWQgcHJvbWlzZSBpcyBjYW5jZWxsZWQsXG4gICAgICogd2l0aCB0aGUgc2FtZSBzZW1hbnRpY3MgYXMgdGhlIGBvbmNhbmNlbGxlZGAgYXJndW1lbnQgb2YgdGhlIGNvbnN0cnVjdG9yLlxuICAgICAqIFdoZW4gdGhlIHBhcmVudCBwcm9taXNlIHJlamVjdHMgb3IgaXMgY2FuY2VsbGVkLCB0aGUgYG9ucmVqZWN0ZWRgIGNhbGxiYWNrIHdpbGwgcnVuLFxuICAgICAqIF9ldmVuIGFmdGVyIHRoZSByZXR1cm5lZCBwcm9taXNlIGhhcyBiZWVuIGNhbmNlbGxlZDpfXG4gICAgICogaW4gdGhhdCBjYXNlLCBzaG91bGQgaXQgcmVqZWN0IG9yIHRocm93LCB0aGUgcmVhc29uIHdpbGwgYmUgd3JhcHBlZFxuICAgICAqIGluIGEge0BsaW5rIENhbmNlbGxlZFJlamVjdGlvbkVycm9yfSBhbmQgYnViYmxlZCB1cCBhcyBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9uZnVsZmlsbGVkIFRoZSBjYWxsYmFjayB0byBleGVjdXRlIHdoZW4gdGhlIFByb21pc2UgaXMgcmVzb2x2ZWQuXG4gICAgICogQHBhcmFtIG9ucmVqZWN0ZWQgVGhlIGNhbGxiYWNrIHRvIGV4ZWN1dGUgd2hlbiB0aGUgUHJvbWlzZSBpcyByZWplY3RlZC5cbiAgICAgKiBAcmV0dXJucyBBIGBDYW5jZWxsYWJsZVByb21pc2VgIGZvciB0aGUgY29tcGxldGlvbiBvZiB3aGljaGV2ZXIgY2FsbGJhY2sgaXMgZXhlY3V0ZWQuXG4gICAgICogVGhlIHJldHVybmVkIHByb21pc2UgaXMgaG9va2VkIHVwIHRvIHByb3BhZ2F0ZSBjYW5jZWxsYXRpb24gcmVxdWVzdHMgdXAgdGhlIGNoYWluLCBidXQgbm90IGRvd246XG4gICAgICpcbiAgICAgKiAgIC0gaWYgdGhlIHBhcmVudCBwcm9taXNlIGlzIGNhbmNlbGxlZCwgdGhlIGBvbnJlamVjdGVkYCBoYW5kbGVyIHdpbGwgYmUgaW52b2tlZCB3aXRoIGEgYENhbmNlbEVycm9yYFxuICAgICAqICAgICBhbmQgdGhlIHJldHVybmVkIHByb21pc2UgX3dpbGwgcmVzb2x2ZSByZWd1bGFybHlfIHdpdGggaXRzIHJlc3VsdDtcbiAgICAgKiAgIC0gY29udmVyc2VseSwgaWYgdGhlIHJldHVybmVkIHByb21pc2UgaXMgY2FuY2VsbGVkLCBfdGhlIHBhcmVudCBwcm9taXNlIGlzIGNhbmNlbGxlZCB0b287X1xuICAgICAqICAgICB0aGUgYG9ucmVqZWN0ZWRgIGhhbmRsZXIgd2lsbCBzdGlsbCBiZSBpbnZva2VkIHdpdGggdGhlIHBhcmVudCdzIGBDYW5jZWxFcnJvcmAsXG4gICAgICogICAgIGJ1dCBpdHMgcmVzdWx0IHdpbGwgYmUgZGlzY2FyZGVkXG4gICAgICogICAgIGFuZCB0aGUgcmV0dXJuZWQgcHJvbWlzZSB3aWxsIHJlamVjdCB3aXRoIGEgYENhbmNlbEVycm9yYCBhcyB3ZWxsLlxuICAgICAqXG4gICAgICogVGhlIHByb21pc2UgcmV0dXJuZWQgZnJvbSB7QGxpbmsgY2FuY2VsfSB3aWxsIGZ1bGZpbGwgb25seSBhZnRlciBhbGwgYXR0YWNoZWQgaGFuZGxlcnNcbiAgICAgKiB1cCB0aGUgZW50aXJlIHByb21pc2UgY2hhaW4gaGF2ZSBiZWVuIHJ1bi5cbiAgICAgKlxuICAgICAqIElmIGVpdGhlciBjYWxsYmFjayByZXR1cm5zIGEgY2FuY2VsbGFibGUgcHJvbWlzZSxcbiAgICAgKiBjYW5jZWxsYXRpb24gcmVxdWVzdHMgd2lsbCBiZSBkaXZlcnRlZCB0byBpdCxcbiAgICAgKiBhbmQgdGhlIHNwZWNpZmllZCBgb25jYW5jZWxsZWRgIGNhbGxiYWNrIHdpbGwgYmUgZGlzY2FyZGVkLlxuICAgICAqL1xuICAgIHRoZW48VFJlc3VsdDEgPSBULCBUUmVzdWx0MiA9IG5ldmVyPihvbmZ1bGZpbGxlZD86ICgodmFsdWU6IFQpID0+IFRSZXN1bHQxIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDE+IHwgQ2FuY2VsbGFibGVQcm9taXNlTGlrZTxUUmVzdWx0MT4pIHwgdW5kZWZpbmVkIHwgbnVsbCwgb25yZWplY3RlZD86ICgocmVhc29uOiBhbnkpID0+IFRSZXN1bHQyIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDI+IHwgQ2FuY2VsbGFibGVQcm9taXNlTGlrZTxUUmVzdWx0Mj4pIHwgdW5kZWZpbmVkIHwgbnVsbCwgb25jYW5jZWxsZWQ/OiBDYW5jZWxsYWJsZVByb21pc2VDYW5jZWxsZXIpOiBDYW5jZWxsYWJsZVByb21pc2U8VFJlc3VsdDEgfCBUUmVzdWx0Mj4ge1xuICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgQ2FuY2VsbGFibGVQcm9taXNlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbmNlbGxhYmxlUHJvbWlzZS5wcm90b3R5cGUudGhlbiBjYWxsZWQgb24gYW4gaW52YWxpZCBvYmplY3QuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTk9URTogVHlwZVNjcmlwdCdzIGJ1aWx0LWluIHR5cGUgZm9yIHRoZW4gaXMgYnJva2VuLFxuICAgICAgICAvLyBhcyBpdCBhbGxvd3Mgc3BlY2lmeWluZyBhbiBhcmJpdHJhcnkgVFJlc3VsdDEgIT0gVCBldmVuIHdoZW4gb25mdWxmaWxsZWQgaXMgbm90IGEgZnVuY3Rpb24uXG4gICAgICAgIC8vIFdlIGNhbm5vdCBmaXggaXQgaWYgd2Ugd2FudCB0byBDYW5jZWxsYWJsZVByb21pc2UgdG8gaW1wbGVtZW50IFByb21pc2VMaWtlPFQ+LlxuXG4gICAgICAgIGlmICghaXNDYWxsYWJsZShvbmZ1bGZpbGxlZCkpIHsgb25mdWxmaWxsZWQgPSBpZGVudGl0eSBhcyBhbnk7IH1cbiAgICAgICAgaWYgKCFpc0NhbGxhYmxlKG9ucmVqZWN0ZWQpKSB7IG9ucmVqZWN0ZWQgPSB0aHJvd2VyOyB9XG5cbiAgICAgICAgaWYgKG9uZnVsZmlsbGVkID09PSBpZGVudGl0eSAmJiBvbnJlamVjdGVkID09IHRocm93ZXIpIHtcbiAgICAgICAgICAgIC8vIFNob3J0Y3V0IGZvciB0cml2aWFsIGFyZ3VtZW50cy5cbiAgICAgICAgICAgIHJldHVybiBuZXcgQ2FuY2VsbGFibGVQcm9taXNlKChyZXNvbHZlKSA9PiByZXNvbHZlKHRoaXMgYXMgYW55KSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBiYXJyaWVyOiBQYXJ0aWFsPFByb21pc2VXaXRoUmVzb2x2ZXJzPHZvaWQ+PiA9IHt9O1xuICAgICAgICB0aGlzW2JhcnJpZXJTeW1dID0gYmFycmllcjtcblxuICAgICAgICByZXR1cm4gbmV3IENhbmNlbGxhYmxlUHJvbWlzZTxUUmVzdWx0MSB8IFRSZXN1bHQyPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB2b2lkIHByb21pc2VUaGVuLmNhbGwodGhpcyxcbiAgICAgICAgICAgICAgICAodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXNbYmFycmllclN5bV0gPT09IGJhcnJpZXIpIHsgdGhpc1tiYXJyaWVyU3ltXSA9IG51bGw7IH1cbiAgICAgICAgICAgICAgICAgICAgYmFycmllci5yZXNvbHZlPy4oKTtcblxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShvbmZ1bGZpbGxlZCEodmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKHJlYXNvbj8pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXNbYmFycmllclN5bV0gPT09IGJhcnJpZXIpIHsgdGhpc1tiYXJyaWVyU3ltXSA9IG51bGw7IH1cbiAgICAgICAgICAgICAgICAgICAgYmFycmllci5yZXNvbHZlPy4oKTtcblxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShvbnJlamVjdGVkIShyZWFzb24pKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0sIGFzeW5jIChjYXVzZT8pID0+IHtcbiAgICAgICAgICAgIC8vY2FuY2VsbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9uY2FuY2VsbGVkPy4oY2F1c2UpO1xuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNhbmNlbChjYXVzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEF0dGFjaGVzIGEgY2FsbGJhY2sgZm9yIG9ubHkgdGhlIHJlamVjdGlvbiBvZiB0aGUgUHJvbWlzZS5cbiAgICAgKlxuICAgICAqIFRoZSBvcHRpb25hbCBgb25jYW5jZWxsZWRgIGFyZ3VtZW50IHdpbGwgYmUgaW52b2tlZCB3aGVuIHRoZSByZXR1cm5lZCBwcm9taXNlIGlzIGNhbmNlbGxlZCxcbiAgICAgKiB3aXRoIHRoZSBzYW1lIHNlbWFudGljcyBhcyB0aGUgYG9uY2FuY2VsbGVkYCBhcmd1bWVudCBvZiB0aGUgY29uc3RydWN0b3IuXG4gICAgICogV2hlbiB0aGUgcGFyZW50IHByb21pc2UgcmVqZWN0cyBvciBpcyBjYW5jZWxsZWQsIHRoZSBgb25yZWplY3RlZGAgY2FsbGJhY2sgd2lsbCBydW4sXG4gICAgICogX2V2ZW4gYWZ0ZXIgdGhlIHJldHVybmVkIHByb21pc2UgaGFzIGJlZW4gY2FuY2VsbGVkOl9cbiAgICAgKiBpbiB0aGF0IGNhc2UsIHNob3VsZCBpdCByZWplY3Qgb3IgdGhyb3csIHRoZSByZWFzb24gd2lsbCBiZSB3cmFwcGVkXG4gICAgICogaW4gYSB7QGxpbmsgQ2FuY2VsbGVkUmVqZWN0aW9uRXJyb3J9IGFuZCBidWJibGVkIHVwIGFzIGFuIHVuaGFuZGxlZCByZWplY3Rpb24uXG4gICAgICpcbiAgICAgKiBJdCBpcyBlcXVpdmFsZW50IHRvXG4gICAgICogYGBgdHNcbiAgICAgKiBjYW5jZWxsYWJsZVByb21pc2UudGhlbih1bmRlZmluZWQsIG9ucmVqZWN0ZWQsIG9uY2FuY2VsbGVkKTtcbiAgICAgKiBgYGBcbiAgICAgKiBhbmQgdGhlIHNhbWUgY2F2ZWF0cyBhcHBseS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEEgUHJvbWlzZSBmb3IgdGhlIGNvbXBsZXRpb24gb2YgdGhlIGNhbGxiYWNrLlxuICAgICAqIENhbmNlbGxhdGlvbiByZXF1ZXN0cyBvbiB0aGUgcmV0dXJuZWQgcHJvbWlzZVxuICAgICAqIHdpbGwgcHJvcGFnYXRlIHVwIHRoZSBjaGFpbiB0byB0aGUgcGFyZW50IHByb21pc2UsXG4gICAgICogYnV0IG5vdCBpbiB0aGUgb3RoZXIgZGlyZWN0aW9uLlxuICAgICAqXG4gICAgICogVGhlIHByb21pc2UgcmV0dXJuZWQgZnJvbSB7QGxpbmsgY2FuY2VsfSB3aWxsIGZ1bGZpbGwgb25seSBhZnRlciBhbGwgYXR0YWNoZWQgaGFuZGxlcnNcbiAgICAgKiB1cCB0aGUgZW50aXJlIHByb21pc2UgY2hhaW4gaGF2ZSBiZWVuIHJ1bi5cbiAgICAgKlxuICAgICAqIElmIGBvbnJlamVjdGVkYCByZXR1cm5zIGEgY2FuY2VsbGFibGUgcHJvbWlzZSxcbiAgICAgKiBjYW5jZWxsYXRpb24gcmVxdWVzdHMgd2lsbCBiZSBkaXZlcnRlZCB0byBpdCxcbiAgICAgKiBhbmQgdGhlIHNwZWNpZmllZCBgb25jYW5jZWxsZWRgIGNhbGxiYWNrIHdpbGwgYmUgZGlzY2FyZGVkLlxuICAgICAqIFNlZSB7QGxpbmsgdGhlbn0gZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKi9cbiAgICBjYXRjaDxUUmVzdWx0ID0gbmV2ZXI+KG9ucmVqZWN0ZWQ/OiAoKHJlYXNvbjogYW55KSA9PiAoUHJvbWlzZUxpa2U8VFJlc3VsdD4gfCBUUmVzdWx0KSkgfCB1bmRlZmluZWQgfCBudWxsLCBvbmNhbmNlbGxlZD86IENhbmNlbGxhYmxlUHJvbWlzZUNhbmNlbGxlcik6IENhbmNlbGxhYmxlUHJvbWlzZTxUIHwgVFJlc3VsdD4ge1xuICAgICAgICByZXR1cm4gdGhpcy50aGVuKHVuZGVmaW5lZCwgb25yZWplY3RlZCwgb25jYW5jZWxsZWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEF0dGFjaGVzIGEgY2FsbGJhY2sgdGhhdCBpcyBpbnZva2VkIHdoZW4gdGhlIENhbmNlbGxhYmxlUHJvbWlzZSBpcyBzZXR0bGVkIChmdWxmaWxsZWQgb3IgcmVqZWN0ZWQpLiBUaGVcbiAgICAgKiByZXNvbHZlZCB2YWx1ZSBjYW5ub3QgYmUgYWNjZXNzZWQgb3IgbW9kaWZpZWQgZnJvbSB0aGUgY2FsbGJhY2suXG4gICAgICogVGhlIHJldHVybmVkIHByb21pc2Ugd2lsbCBzZXR0bGUgaW4gdGhlIHNhbWUgc3RhdGUgYXMgdGhlIG9yaWdpbmFsIG9uZVxuICAgICAqIGFmdGVyIHRoZSBwcm92aWRlZCBjYWxsYmFjayBoYXMgY29tcGxldGVkIGV4ZWN1dGlvbixcbiAgICAgKiB1bmxlc3MgdGhlIGNhbGxiYWNrIHRocm93cyBvciByZXR1cm5zIGEgcmVqZWN0aW5nIHByb21pc2UsXG4gICAgICogaW4gd2hpY2ggY2FzZSB0aGUgcmV0dXJuZWQgcHJvbWlzZSB3aWxsIHJlamVjdCBhcyB3ZWxsLlxuICAgICAqXG4gICAgICogVGhlIG9wdGlvbmFsIGBvbmNhbmNlbGxlZGAgYXJndW1lbnQgd2lsbCBiZSBpbnZva2VkIHdoZW4gdGhlIHJldHVybmVkIHByb21pc2UgaXMgY2FuY2VsbGVkLFxuICAgICAqIHdpdGggdGhlIHNhbWUgc2VtYW50aWNzIGFzIHRoZSBgb25jYW5jZWxsZWRgIGFyZ3VtZW50IG9mIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgKiBPbmNlIHRoZSBwYXJlbnQgcHJvbWlzZSBzZXR0bGVzLCB0aGUgYG9uZmluYWxseWAgY2FsbGJhY2sgd2lsbCBydW4sXG4gICAgICogX2V2ZW4gYWZ0ZXIgdGhlIHJldHVybmVkIHByb21pc2UgaGFzIGJlZW4gY2FuY2VsbGVkOl9cbiAgICAgKiBpbiB0aGF0IGNhc2UsIHNob3VsZCBpdCByZWplY3Qgb3IgdGhyb3csIHRoZSByZWFzb24gd2lsbCBiZSB3cmFwcGVkXG4gICAgICogaW4gYSB7QGxpbmsgQ2FuY2VsbGVkUmVqZWN0aW9uRXJyb3J9IGFuZCBidWJibGVkIHVwIGFzIGFuIHVuaGFuZGxlZCByZWplY3Rpb24uXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiB7QGxpbmsgdGhlbn0gYW5kIHRoZSBzYW1lIGNhdmVhdHMgYXBwbHkuXG4gICAgICogSXQgaXMgcG9seWZpbGxlZCwgaGVuY2UgYXZhaWxhYmxlIGluIGV2ZXJ5IE9TL3dlYnZpZXcgdmVyc2lvbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEEgUHJvbWlzZSBmb3IgdGhlIGNvbXBsZXRpb24gb2YgdGhlIGNhbGxiYWNrLlxuICAgICAqIENhbmNlbGxhdGlvbiByZXF1ZXN0cyBvbiB0aGUgcmV0dXJuZWQgcHJvbWlzZVxuICAgICAqIHdpbGwgcHJvcGFnYXRlIHVwIHRoZSBjaGFpbiB0byB0aGUgcGFyZW50IHByb21pc2UsXG4gICAgICogYnV0IG5vdCBpbiB0aGUgb3RoZXIgZGlyZWN0aW9uLlxuICAgICAqXG4gICAgICogVGhlIHByb21pc2UgcmV0dXJuZWQgZnJvbSB7QGxpbmsgY2FuY2VsfSB3aWxsIGZ1bGZpbGwgb25seSBhZnRlciBhbGwgYXR0YWNoZWQgaGFuZGxlcnNcbiAgICAgKiB1cCB0aGUgZW50aXJlIHByb21pc2UgY2hhaW4gaGF2ZSBiZWVuIHJ1bi5cbiAgICAgKlxuICAgICAqIElmIGBvbmZpbmFsbHlgIHJldHVybnMgYSBjYW5jZWxsYWJsZSBwcm9taXNlLFxuICAgICAqIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyB3aWxsIGJlIGRpdmVydGVkIHRvIGl0LFxuICAgICAqIGFuZCB0aGUgc3BlY2lmaWVkIGBvbmNhbmNlbGxlZGAgY2FsbGJhY2sgd2lsbCBiZSBkaXNjYXJkZWQuXG4gICAgICogU2VlIHtAbGluayB0aGVufSBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqL1xuICAgIGZpbmFsbHkob25maW5hbGx5PzogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkIHwgbnVsbCwgb25jYW5jZWxsZWQ/OiBDYW5jZWxsYWJsZVByb21pc2VDYW5jZWxsZXIpOiBDYW5jZWxsYWJsZVByb21pc2U8VD4ge1xuICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgQ2FuY2VsbGFibGVQcm9taXNlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbmNlbGxhYmxlUHJvbWlzZS5wcm90b3R5cGUuZmluYWxseSBjYWxsZWQgb24gYW4gaW52YWxpZCBvYmplY3QuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc0NhbGxhYmxlKG9uZmluYWxseSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRoZW4ob25maW5hbGx5LCBvbmZpbmFsbHksIG9uY2FuY2VsbGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnRoZW4oXG4gICAgICAgICAgICAodmFsdWUpID0+IENhbmNlbGxhYmxlUHJvbWlzZS5yZXNvbHZlKG9uZmluYWxseSgpKS50aGVuKCgpID0+IHZhbHVlKSxcbiAgICAgICAgICAgIChyZWFzb24/KSA9PiBDYW5jZWxsYWJsZVByb21pc2UucmVzb2x2ZShvbmZpbmFsbHkoKSkudGhlbigoKSA9PiB7IHRocm93IHJlYXNvbjsgfSksXG4gICAgICAgICAgICBvbmNhbmNlbGxlZCxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXZSB1c2UgdGhlIGBbU3ltYm9sLnNwZWNpZXNdYCBzdGF0aWMgcHJvcGVydHksIGlmIGF2YWlsYWJsZSxcbiAgICAgKiB0byBkaXNhYmxlIHRoZSBidWlsdC1pbiBhdXRvbWF0aWMgc3ViY2xhc3NpbmcgZmVhdHVyZXMgZnJvbSB7QGxpbmsgUHJvbWlzZX0uXG4gICAgICogSXQgaXMgY3JpdGljYWwgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMgdGhhdCBleHRlbmRlcnMgZG8gbm90IG92ZXJyaWRlIHRoaXMuXG4gICAgICogT25jZSB0aGUgcHJvcG9zYWwgYXQgaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtcm0tYnVpbHRpbi1zdWJjbGFzc2luZ1xuICAgICAqIGlzIGVpdGhlciBhY2NlcHRlZCBvciByZXRpcmVkLCB0aGlzIGltcGxlbWVudGF0aW9uIHdpbGwgaGF2ZSB0byBiZSByZXZpc2VkIGFjY29yZGluZ2x5LlxuICAgICAqXG4gICAgICogQGlnbm9yZVxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgW3NwZWNpZXNdKCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgQ2FuY2VsbGFibGVQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aCBhbiBhcnJheSBvZiByZXN1bHRzXG4gICAgICogd2hlbiBhbGwgb2YgdGhlIHByb3ZpZGVkIFByb21pc2VzIHJlc29sdmUsIG9yIHJlamVjdGVkIHdoZW4gYW55IFByb21pc2UgaXMgcmVqZWN0ZWQuXG4gICAgICpcbiAgICAgKiBFdmVyeSBvbmUgb2YgdGhlIHByb3ZpZGVkIG9iamVjdHMgdGhhdCBpcyBhIHRoZW5hYmxlIF9hbmRfIGNhbmNlbGxhYmxlIG9iamVjdFxuICAgICAqIHdpbGwgYmUgY2FuY2VsbGVkIHdoZW4gdGhlIHJldHVybmVkIHByb21pc2UgaXMgY2FuY2VsbGVkLCB3aXRoIHRoZSBzYW1lIGNhdXNlLlxuICAgICAqXG4gICAgICogQGdyb3VwIFN0YXRpYyBNZXRob2RzXG4gICAgICovXG4gICAgc3RhdGljIGFsbDxUPih2YWx1ZXM6IEl0ZXJhYmxlPFQgfCBQcm9taXNlTGlrZTxUPj4pOiBDYW5jZWxsYWJsZVByb21pc2U8QXdhaXRlZDxUPltdPjtcbiAgICBzdGF0aWMgYWxsPFQgZXh0ZW5kcyByZWFkb25seSB1bmtub3duW10gfCBbXT4odmFsdWVzOiBUKTogQ2FuY2VsbGFibGVQcm9taXNlPHsgLXJlYWRvbmx5IFtQIGluIGtleW9mIFRdOiBBd2FpdGVkPFRbUF0+OyB9PjtcbiAgICBzdGF0aWMgYWxsPFQgZXh0ZW5kcyBJdGVyYWJsZTx1bmtub3duPiB8IEFycmF5TGlrZTx1bmtub3duPj4odmFsdWVzOiBUKTogQ2FuY2VsbGFibGVQcm9taXNlPHVua25vd24+IHtcbiAgICAgICAgbGV0IGNvbGxlY3RlZCA9IEFycmF5LmZyb20odmFsdWVzKTtcbiAgICAgICAgcmV0dXJuIGNvbGxlY3RlZC5sZW5ndGggPT09IDBcbiAgICAgICAgICAgID8gQ2FuY2VsbGFibGVQcm9taXNlLnJlc29sdmUoY29sbGVjdGVkKVxuICAgICAgICAgICAgOiBuZXcgQ2FuY2VsbGFibGVQcm9taXNlPHVua25vd24+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICB2b2lkIFByb21pc2UuYWxsKGNvbGxlY3RlZCkudGhlbihyZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgICAgfSwgYWxsQ2FuY2VsbGVyKGNvbGxlY3RlZCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBDYW5jZWxsYWJsZVByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoIGFuIGFycmF5IG9mIHJlc3VsdHNcbiAgICAgKiB3aGVuIGFsbCBvZiB0aGUgcHJvdmlkZWQgUHJvbWlzZXMgcmVzb2x2ZSBvciByZWplY3QuXG4gICAgICpcbiAgICAgKiBFdmVyeSBvbmUgb2YgdGhlIHByb3ZpZGVkIG9iamVjdHMgdGhhdCBpcyBhIHRoZW5hYmxlIF9hbmRfIGNhbmNlbGxhYmxlIG9iamVjdFxuICAgICAqIHdpbGwgYmUgY2FuY2VsbGVkIHdoZW4gdGhlIHJldHVybmVkIHByb21pc2UgaXMgY2FuY2VsbGVkLCB3aXRoIHRoZSBzYW1lIGNhdXNlLlxuICAgICAqXG4gICAgICogQGdyb3VwIFN0YXRpYyBNZXRob2RzXG4gICAgICovXG4gICAgc3RhdGljIGFsbFNldHRsZWQ8VD4odmFsdWVzOiBJdGVyYWJsZTxUIHwgUHJvbWlzZUxpa2U8VD4+KTogQ2FuY2VsbGFibGVQcm9taXNlPFByb21pc2VTZXR0bGVkUmVzdWx0PEF3YWl0ZWQ8VD4+W10+O1xuICAgIHN0YXRpYyBhbGxTZXR0bGVkPFQgZXh0ZW5kcyByZWFkb25seSB1bmtub3duW10gfCBbXT4odmFsdWVzOiBUKTogQ2FuY2VsbGFibGVQcm9taXNlPHsgLXJlYWRvbmx5IFtQIGluIGtleW9mIFRdOiBQcm9taXNlU2V0dGxlZFJlc3VsdDxBd2FpdGVkPFRbUF0+PjsgfT47XG4gICAgc3RhdGljIGFsbFNldHRsZWQ8VCBleHRlbmRzIEl0ZXJhYmxlPHVua25vd24+IHwgQXJyYXlMaWtlPHVua25vd24+Pih2YWx1ZXM6IFQpOiBDYW5jZWxsYWJsZVByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICBsZXQgY29sbGVjdGVkID0gQXJyYXkuZnJvbSh2YWx1ZXMpO1xuICAgICAgICByZXR1cm4gY29sbGVjdGVkLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgPyBDYW5jZWxsYWJsZVByb21pc2UucmVzb2x2ZShjb2xsZWN0ZWQpXG4gICAgICAgICAgICA6IG5ldyBDYW5jZWxsYWJsZVByb21pc2U8dW5rbm93bj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHZvaWQgUHJvbWlzZS5hbGxTZXR0bGVkKGNvbGxlY3RlZCkudGhlbihyZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgICAgfSwgYWxsQ2FuY2VsbGVyKGNvbGxlY3RlZCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBhbnkgZnVuY3Rpb24gcmV0dXJucyBhIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgYnkgdGhlIGZpcnN0IGdpdmVuIHByb21pc2UgdG8gYmUgZnVsZmlsbGVkLFxuICAgICAqIG9yIHJlamVjdGVkIHdpdGggYW4gQWdncmVnYXRlRXJyb3IgY29udGFpbmluZyBhbiBhcnJheSBvZiByZWplY3Rpb24gcmVhc29uc1xuICAgICAqIGlmIGFsbCBvZiB0aGUgZ2l2ZW4gcHJvbWlzZXMgYXJlIHJlamVjdGVkLlxuICAgICAqIEl0IHJlc29sdmVzIGFsbCBlbGVtZW50cyBvZiB0aGUgcGFzc2VkIGl0ZXJhYmxlIHRvIHByb21pc2VzIGFzIGl0IHJ1bnMgdGhpcyBhbGdvcml0aG0uXG4gICAgICpcbiAgICAgKiBFdmVyeSBvbmUgb2YgdGhlIHByb3ZpZGVkIG9iamVjdHMgdGhhdCBpcyBhIHRoZW5hYmxlIF9hbmRfIGNhbmNlbGxhYmxlIG9iamVjdFxuICAgICAqIHdpbGwgYmUgY2FuY2VsbGVkIHdoZW4gdGhlIHJldHVybmVkIHByb21pc2UgaXMgY2FuY2VsbGVkLCB3aXRoIHRoZSBzYW1lIGNhdXNlLlxuICAgICAqXG4gICAgICogQGdyb3VwIFN0YXRpYyBNZXRob2RzXG4gICAgICovXG4gICAgc3RhdGljIGFueTxUPih2YWx1ZXM6IEl0ZXJhYmxlPFQgfCBQcm9taXNlTGlrZTxUPj4pOiBDYW5jZWxsYWJsZVByb21pc2U8QXdhaXRlZDxUPj47XG4gICAgc3RhdGljIGFueTxUIGV4dGVuZHMgcmVhZG9ubHkgdW5rbm93bltdIHwgW10+KHZhbHVlczogVCk6IENhbmNlbGxhYmxlUHJvbWlzZTxBd2FpdGVkPFRbbnVtYmVyXT4+O1xuICAgIHN0YXRpYyBhbnk8VCBleHRlbmRzIEl0ZXJhYmxlPHVua25vd24+IHwgQXJyYXlMaWtlPHVua25vd24+Pih2YWx1ZXM6IFQpOiBDYW5jZWxsYWJsZVByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICBsZXQgY29sbGVjdGVkID0gQXJyYXkuZnJvbSh2YWx1ZXMpO1xuICAgICAgICByZXR1cm4gY29sbGVjdGVkLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgPyBDYW5jZWxsYWJsZVByb21pc2UucmVzb2x2ZShjb2xsZWN0ZWQpXG4gICAgICAgICAgICA6IG5ldyBDYW5jZWxsYWJsZVByb21pc2U8dW5rbm93bj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHZvaWQgUHJvbWlzZS5hbnkoY29sbGVjdGVkKS50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgICB9LCBhbGxDYW5jZWxsZXIoY29sbGVjdGVkKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCBvciByZWplY3RlZCB3aGVuIGFueSBvZiB0aGUgcHJvdmlkZWQgUHJvbWlzZXMgYXJlIHJlc29sdmVkIG9yIHJlamVjdGVkLlxuICAgICAqXG4gICAgICogRXZlcnkgb25lIG9mIHRoZSBwcm92aWRlZCBvYmplY3RzIHRoYXQgaXMgYSB0aGVuYWJsZSBfYW5kXyBjYW5jZWxsYWJsZSBvYmplY3RcbiAgICAgKiB3aWxsIGJlIGNhbmNlbGxlZCB3aGVuIHRoZSByZXR1cm5lZCBwcm9taXNlIGlzIGNhbmNlbGxlZCwgd2l0aCB0aGUgc2FtZSBjYXVzZS5cbiAgICAgKlxuICAgICAqIEBncm91cCBTdGF0aWMgTWV0aG9kc1xuICAgICAqL1xuICAgIHN0YXRpYyByYWNlPFQ+KHZhbHVlczogSXRlcmFibGU8VCB8IFByb21pc2VMaWtlPFQ+Pik6IENhbmNlbGxhYmxlUHJvbWlzZTxBd2FpdGVkPFQ+PjtcbiAgICBzdGF0aWMgcmFjZTxUIGV4dGVuZHMgcmVhZG9ubHkgdW5rbm93bltdIHwgW10+KHZhbHVlczogVCk6IENhbmNlbGxhYmxlUHJvbWlzZTxBd2FpdGVkPFRbbnVtYmVyXT4+O1xuICAgIHN0YXRpYyByYWNlPFQgZXh0ZW5kcyBJdGVyYWJsZTx1bmtub3duPiB8IEFycmF5TGlrZTx1bmtub3duPj4odmFsdWVzOiBUKTogQ2FuY2VsbGFibGVQcm9taXNlPHVua25vd24+IHtcbiAgICAgICAgbGV0IGNvbGxlY3RlZCA9IEFycmF5LmZyb20odmFsdWVzKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDYW5jZWxsYWJsZVByb21pc2U8dW5rbm93bj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdm9pZCBQcm9taXNlLnJhY2UoY29sbGVjdGVkKS50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0sIGFsbENhbmNlbGxlcihjb2xsZWN0ZWQpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGNhbmNlbGxlZCBDYW5jZWxsYWJsZVByb21pc2UgZm9yIHRoZSBwcm92aWRlZCBjYXVzZS5cbiAgICAgKlxuICAgICAqIEBncm91cCBTdGF0aWMgTWV0aG9kc1xuICAgICAqL1xuICAgIHN0YXRpYyBjYW5jZWw8VCA9IG5ldmVyPihjYXVzZT86IGFueSk6IENhbmNlbGxhYmxlUHJvbWlzZTxUPiB7XG4gICAgICAgIGNvbnN0IHAgPSBuZXcgQ2FuY2VsbGFibGVQcm9taXNlPFQ+KCgpID0+IHt9KTtcbiAgICAgICAgcC5jYW5jZWwoY2F1c2UpO1xuICAgICAgICByZXR1cm4gcDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IENhbmNlbGxhYmxlUHJvbWlzZSB0aGF0IGNhbmNlbHNcbiAgICAgKiBhZnRlciB0aGUgc3BlY2lmaWVkIHRpbWVvdXQsIHdpdGggdGhlIHByb3ZpZGVkIGNhdXNlLlxuICAgICAqXG4gICAgICogSWYgdGhlIHtAbGluayBBYm9ydFNpZ25hbC50aW1lb3V0fSBmYWN0b3J5IG1ldGhvZCBpcyBhdmFpbGFibGUsXG4gICAgICogaXQgaXMgdXNlZCB0byBiYXNlIHRoZSB0aW1lb3V0IG9uIF9hY3RpdmVfIHRpbWUgcmF0aGVyIHRoYW4gX2VsYXBzZWRfIHRpbWUuXG4gICAgICogT3RoZXJ3aXNlLCBgdGltZW91dGAgZmFsbHMgYmFjayB0byB7QGxpbmsgc2V0VGltZW91dH0uXG4gICAgICpcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcbiAgICAgKi9cbiAgICBzdGF0aWMgdGltZW91dDxUID0gbmV2ZXI+KG1pbGxpc2Vjb25kczogbnVtYmVyLCBjYXVzZT86IGFueSk6IENhbmNlbGxhYmxlUHJvbWlzZTxUPiB7XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBuZXcgQ2FuY2VsbGFibGVQcm9taXNlPFQ+KCgpID0+IHt9KTtcbiAgICAgICAgaWYgKEFib3J0U2lnbmFsICYmIHR5cGVvZiBBYm9ydFNpZ25hbCA9PT0gJ2Z1bmN0aW9uJyAmJiBBYm9ydFNpZ25hbC50aW1lb3V0ICYmIHR5cGVvZiBBYm9ydFNpZ25hbC50aW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBBYm9ydFNpZ25hbC50aW1lb3V0KG1pbGxpc2Vjb25kcykuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PiB2b2lkIHByb21pc2UuY2FuY2VsKGNhdXNlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHZvaWQgcHJvbWlzZS5jYW5jZWwoY2F1c2UpLCBtaWxsaXNlY29uZHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ2FuY2VsbGFibGVQcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgdGhlIHNwZWNpZmllZCB0aW1lb3V0LlxuICAgICAqIFRoZSByZXR1cm5lZCBwcm9taXNlIGNhbiBiZSBjYW5jZWxsZWQgd2l0aG91dCBjb25zZXF1ZW5jZXMuXG4gICAgICpcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcbiAgICAgKi9cbiAgICBzdGF0aWMgc2xlZXAobWlsbGlzZWNvbmRzOiBudW1iZXIpOiBDYW5jZWxsYWJsZVByb21pc2U8dm9pZD47XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBDYW5jZWxsYWJsZVByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlclxuICAgICAqIHRoZSBzcGVjaWZpZWQgdGltZW91dCwgd2l0aCB0aGUgcHJvdmlkZWQgdmFsdWUuXG4gICAgICogVGhlIHJldHVybmVkIHByb21pc2UgY2FuIGJlIGNhbmNlbGxlZCB3aXRob3V0IGNvbnNlcXVlbmNlcy5cbiAgICAgKlxuICAgICAqIEBncm91cCBTdGF0aWMgTWV0aG9kc1xuICAgICAqL1xuICAgIHN0YXRpYyBzbGVlcDxUPihtaWxsaXNlY29uZHM6IG51bWJlciwgdmFsdWU6IFQpOiBDYW5jZWxsYWJsZVByb21pc2U8VD47XG4gICAgc3RhdGljIHNsZWVwPFQgPSB2b2lkPihtaWxsaXNlY29uZHM6IG51bWJlciwgdmFsdWU/OiBUKTogQ2FuY2VsbGFibGVQcm9taXNlPFQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBDYW5jZWxsYWJsZVByb21pc2U8VD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZSh2YWx1ZSEpLCBtaWxsaXNlY29uZHMpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHJlamVjdGVkIENhbmNlbGxhYmxlUHJvbWlzZSBmb3IgdGhlIHByb3ZpZGVkIHJlYXNvbi5cbiAgICAgKlxuICAgICAqIEBncm91cCBTdGF0aWMgTWV0aG9kc1xuICAgICAqL1xuICAgIHN0YXRpYyByZWplY3Q8VCA9IG5ldmVyPihyZWFzb24/OiBhbnkpOiBDYW5jZWxsYWJsZVByb21pc2U8VD4ge1xuICAgICAgICByZXR1cm4gbmV3IENhbmNlbGxhYmxlUHJvbWlzZTxUPigoXywgcmVqZWN0KSA9PiByZWplY3QocmVhc29uKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyByZXNvbHZlZCBDYW5jZWxsYWJsZVByb21pc2UuXG4gICAgICpcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcbiAgICAgKi9cbiAgICBzdGF0aWMgcmVzb2x2ZSgpOiBDYW5jZWxsYWJsZVByb21pc2U8dm9pZD47XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyByZXNvbHZlZCBDYW5jZWxsYWJsZVByb21pc2UgZm9yIHRoZSBwcm92aWRlZCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBncm91cCBTdGF0aWMgTWV0aG9kc1xuICAgICAqL1xuICAgIHN0YXRpYyByZXNvbHZlPFQ+KHZhbHVlOiBUKTogQ2FuY2VsbGFibGVQcm9taXNlPEF3YWl0ZWQ8VD4+O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgcmVzb2x2ZWQgQ2FuY2VsbGFibGVQcm9taXNlIGZvciB0aGUgcHJvdmlkZWQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcbiAgICAgKi9cbiAgICBzdGF0aWMgcmVzb2x2ZTxUPih2YWx1ZTogVCB8IFByb21pc2VMaWtlPFQ+KTogQ2FuY2VsbGFibGVQcm9taXNlPEF3YWl0ZWQ8VD4+O1xuICAgIHN0YXRpYyByZXNvbHZlPFQgPSB2b2lkPih2YWx1ZT86IFQgfCBQcm9taXNlTGlrZTxUPik6IENhbmNlbGxhYmxlUHJvbWlzZTxBd2FpdGVkPFQ+PiB7XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIENhbmNlbGxhYmxlUHJvbWlzZSkge1xuICAgICAgICAgICAgLy8gT3B0aW1pc2UgZm9yIGNhbmNlbGxhYmxlIHByb21pc2VzLlxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQ2FuY2VsbGFibGVQcm9taXNlPGFueT4oKHJlc29sdmUpID0+IHJlc29sdmUodmFsdWUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IENhbmNlbGxhYmxlUHJvbWlzZSBhbmQgcmV0dXJucyBpdCBpbiBhbiBvYmplY3QsIGFsb25nIHdpdGggaXRzIHJlc29sdmUgYW5kIHJlamVjdCBmdW5jdGlvbnNcbiAgICAgKiBhbmQgYSBnZXR0ZXIvc2V0dGVyIGZvciB0aGUgY2FuY2VsbGF0aW9uIGNhbGxiYWNrLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgaXMgcG9seWZpbGxlZCwgaGVuY2UgYXZhaWxhYmxlIGluIGV2ZXJ5IE9TL3dlYnZpZXcgdmVyc2lvbi5cbiAgICAgKlxuICAgICAqIEBncm91cCBTdGF0aWMgTWV0aG9kc1xuICAgICAqL1xuICAgIHN0YXRpYyB3aXRoUmVzb2x2ZXJzPFQ+KCk6IENhbmNlbGxhYmxlUHJvbWlzZVdpdGhSZXNvbHZlcnM8VD4ge1xuICAgICAgICBsZXQgcmVzdWx0OiBDYW5jZWxsYWJsZVByb21pc2VXaXRoUmVzb2x2ZXJzPFQ+ID0geyBvbmNhbmNlbGxlZDogbnVsbCB9IGFzIGFueTtcbiAgICAgICAgcmVzdWx0LnByb21pc2UgPSBuZXcgQ2FuY2VsbGFibGVQcm9taXNlPFQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHJlc3VsdC5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgICAgIHJlc3VsdC5yZWplY3QgPSByZWplY3Q7XG4gICAgICAgIH0sIChjYXVzZT86IGFueSkgPT4geyByZXN1bHQub25jYW5jZWxsZWQ/LihjYXVzZSk7IH0pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgY2FsbGJhY2sgdGhhdCBpbXBsZW1lbnRzIHRoZSBjYW5jZWxsYXRpb24gYWxnb3JpdGhtIGZvciB0aGUgZ2l2ZW4gY2FuY2VsbGFibGUgcHJvbWlzZS5cbiAqIFRoZSBwcm9taXNlIHJldHVybmVkIGZyb20gdGhlIHJlc3VsdGluZyBmdW5jdGlvbiBkb2VzIG5vdCByZWplY3QuXG4gKi9cbmZ1bmN0aW9uIGNhbmNlbGxlckZvcjxUPihwcm9taXNlOiBDYW5jZWxsYWJsZVByb21pc2VXaXRoUmVzb2x2ZXJzPFQ+LCBzdGF0ZTogQ2FuY2VsbGFibGVQcm9taXNlU3RhdGUpIHtcbiAgICBsZXQgY2FuY2VsbGF0aW9uUHJvbWlzZTogdm9pZCB8IFByb21pc2VMaWtlPHZvaWQ+ID0gdW5kZWZpbmVkO1xuXG4gICAgcmV0dXJuIChyZWFzb246IENhbmNlbEVycm9yKTogdm9pZCB8IFByb21pc2VMaWtlPHZvaWQ+ID0+IHtcbiAgICAgICAgaWYgKCFzdGF0ZS5zZXR0bGVkKSB7XG4gICAgICAgICAgICBzdGF0ZS5zZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHN0YXRlLnJlYXNvbiA9IHJlYXNvbjtcbiAgICAgICAgICAgIHByb21pc2UucmVqZWN0KHJlYXNvbik7XG5cbiAgICAgICAgICAgIC8vIEF0dGFjaCBhbiBlcnJvciBoYW5kbGVyIHRoYXQgaWdub3JlcyB0aGlzIHNwZWNpZmljIHJlamVjdGlvbiByZWFzb24gYW5kIG5vdGhpbmcgZWxzZS5cbiAgICAgICAgICAgIC8vIEluIHRoZW9yeSwgYSBzYW5lIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gYXQgdGhpcyBwb2ludFxuICAgICAgICAgICAgLy8gc2hvdWxkIGFsd2F5cyByZWplY3Qgd2l0aCBvdXIgY2FuY2VsbGF0aW9uIHJlYXNvbixcbiAgICAgICAgICAgIC8vIGhlbmNlIHRoZSBoYW5kbGVyIHdpbGwgbmV2ZXIgdGhyb3cuXG4gICAgICAgICAgICB2b2lkIHByb21pc2VUaGVuLmNhbGwocHJvbWlzZS5wcm9taXNlLCB1bmRlZmluZWQsIChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyICE9PSByZWFzb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgcmVhc29uIGlzIG5vdCBzZXQsIHRoZSBwcm9taXNlIHJlc29sdmVkIHJlZ3VsYXJseSwgaGVuY2Ugd2UgbXVzdCBub3QgY2FsbCBvbmNhbmNlbGxlZC5cbiAgICAgICAgLy8gSWYgb25jYW5jZWxsZWQgaXMgdW5zZXQsIG5vIG5lZWQgdG8gZ28gYW55IGZ1cnRoZXIuXG4gICAgICAgIGlmICghc3RhdGUucmVhc29uIHx8ICFwcm9taXNlLm9uY2FuY2VsbGVkKSB7IHJldHVybjsgfVxuXG4gICAgICAgIGNhbmNlbGxhdGlvblByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHByb21pc2Uub25jYW5jZWxsZWQhKHN0YXRlLnJlYXNvbiEuY2F1c2UpKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIFByb21pc2UucmVqZWN0KG5ldyBDYW5jZWxsZWRSZWplY3Rpb25FcnJvcihwcm9taXNlLnByb21pc2UsIGVyciwgXCJVbmhhbmRsZWQgZXhjZXB0aW9uIGluIG9uY2FuY2VsbGVkIGNhbGxiYWNrLlwiKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBjYW5jZWxsYXRpb25Qcm9taXNlLnRoZW4odW5kZWZpbmVkLCAocmVhc29uPykgPT4ge1xuICAgICAgICAgICAgdGhyb3cgbmV3IENhbmNlbGxlZFJlamVjdGlvbkVycm9yKHByb21pc2UucHJvbWlzZSwgcmVhc29uLCBcIlVuaGFuZGxlZCByZWplY3Rpb24gaW4gb25jYW5jZWxsZWQgY2FsbGJhY2suXCIpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBVbnNldCBvbmNhbmNlbGxlZCB0byBwcmV2ZW50IHJlcGVhdGVkIGNhbGxzLlxuICAgICAgICBwcm9taXNlLm9uY2FuY2VsbGVkID0gbnVsbDtcblxuICAgICAgICByZXR1cm4gY2FuY2VsbGF0aW9uUHJvbWlzZTtcbiAgICB9XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGNhbGxiYWNrIHRoYXQgaW1wbGVtZW50cyB0aGUgcmVzb2x1dGlvbiBhbGdvcml0aG0gZm9yIHRoZSBnaXZlbiBjYW5jZWxsYWJsZSBwcm9taXNlLlxuICovXG5mdW5jdGlvbiByZXNvbHZlckZvcjxUPihwcm9taXNlOiBDYW5jZWxsYWJsZVByb21pc2VXaXRoUmVzb2x2ZXJzPFQ+LCBzdGF0ZTogQ2FuY2VsbGFibGVQcm9taXNlU3RhdGUpOiBDYW5jZWxsYWJsZVByb21pc2VSZXNvbHZlcjxUPiB7XG4gICAgcmV0dXJuICh2YWx1ZSkgPT4ge1xuICAgICAgICBpZiAoc3RhdGUucmVzb2x2aW5nKSB7IHJldHVybjsgfVxuICAgICAgICBzdGF0ZS5yZXNvbHZpbmcgPSB0cnVlO1xuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gcHJvbWlzZS5wcm9taXNlKSB7XG4gICAgICAgICAgICBpZiAoc3RhdGUuc2V0dGxlZCkgeyByZXR1cm47IH1cbiAgICAgICAgICAgIHN0YXRlLnNldHRsZWQgPSB0cnVlO1xuICAgICAgICAgICAgcHJvbWlzZS5yZWplY3QobmV3IFR5cGVFcnJvcihcIkEgcHJvbWlzZSBjYW5ub3QgYmUgcmVzb2x2ZWQgd2l0aCBpdHNlbGYuXCIpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgICAgICAgIGxldCB0aGVuOiBhbnk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoZW4gPSAodmFsdWUgYXMgYW55KS50aGVuO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgc3RhdGUuc2V0dGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgcHJvbWlzZS5yZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpc0NhbGxhYmxlKHRoZW4pKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNhbmNlbCA9ICh2YWx1ZSBhcyBhbnkpLmNhbmNlbDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ2FsbGFibGUoY2FuY2VsKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb25jYW5jZWxsZWQgPSAoY2F1c2U/OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZsZWN0LmFwcGx5KGNhbmNlbCwgdmFsdWUsIFtjYXVzZV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5yZWFzb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBhbHJlYWR5IGNhbmNlbGxlZCwgcHJvcGFnYXRlIGNhbmNlbGxhdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcHJvbWlzZSByZXR1cm5lZCBmcm9tIHRoZSBjYW5jZWxsZXIgYWxnb3JpdGhtIGRvZXMgbm90IHJlamVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIGl0IGNhbiBiZSBkaXNjYXJkZWQgc2FmZWx5LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgY2FuY2VsbGVyRm9yKHsgLi4ucHJvbWlzZSwgb25jYW5jZWxsZWQgfSwgc3RhdGUpKHN0YXRlLnJlYXNvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2Uub25jYW5jZWxsZWQgPSBvbmNhbmNlbGxlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2gge31cblxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1N0YXRlOiBDYW5jZWxsYWJsZVByb21pc2VTdGF0ZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgcm9vdDogc3RhdGUucm9vdCxcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2aW5nOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgZ2V0IHNldHRsZWQoKSB7IHJldHVybiB0aGlzLnJvb3Quc2V0dGxlZCB9LFxuICAgICAgICAgICAgICAgICAgICBzZXQgc2V0dGxlZCh2YWx1ZSkgeyB0aGlzLnJvb3Quc2V0dGxlZCA9IHZhbHVlOyB9LFxuICAgICAgICAgICAgICAgICAgICBnZXQgcmVhc29uKCkgeyByZXR1cm4gdGhpcy5yb290LnJlYXNvbiB9XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlamVjdG9yID0gcmVqZWN0b3JGb3IocHJvbWlzZSwgbmV3U3RhdGUpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIFJlZmxlY3QuYXBwbHkodGhlbiwgdmFsdWUsIFtyZXNvbHZlckZvcihwcm9taXNlLCBuZXdTdGF0ZSksIHJlamVjdG9yXSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdG9yKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjsgLy8gSU1QT1JUQU5UIVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0YXRlLnNldHRsZWQpIHsgcmV0dXJuOyB9XG4gICAgICAgIHN0YXRlLnNldHRsZWQgPSB0cnVlO1xuICAgICAgICBwcm9taXNlLnJlc29sdmUodmFsdWUpO1xuICAgIH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGNhbGxiYWNrIHRoYXQgaW1wbGVtZW50cyB0aGUgcmVqZWN0aW9uIGFsZ29yaXRobSBmb3IgdGhlIGdpdmVuIGNhbmNlbGxhYmxlIHByb21pc2UuXG4gKi9cbmZ1bmN0aW9uIHJlamVjdG9yRm9yPFQ+KHByb21pc2U6IENhbmNlbGxhYmxlUHJvbWlzZVdpdGhSZXNvbHZlcnM8VD4sIHN0YXRlOiBDYW5jZWxsYWJsZVByb21pc2VTdGF0ZSk6IENhbmNlbGxhYmxlUHJvbWlzZVJlamVjdG9yIHtcbiAgICByZXR1cm4gKHJlYXNvbj8pID0+IHtcbiAgICAgICAgaWYgKHN0YXRlLnJlc29sdmluZykgeyByZXR1cm47IH1cbiAgICAgICAgc3RhdGUucmVzb2x2aW5nID0gdHJ1ZTtcblxuICAgICAgICBpZiAoc3RhdGUuc2V0dGxlZCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAocmVhc29uIGluc3RhbmNlb2YgQ2FuY2VsRXJyb3IgJiYgc3RhdGUucmVhc29uIGluc3RhbmNlb2YgQ2FuY2VsRXJyb3IgJiYgT2JqZWN0LmlzKHJlYXNvbi5jYXVzZSwgc3RhdGUucmVhc29uLmNhdXNlKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTd2FsbG93IGxhdGUgcmVqZWN0aW9ucyB0aGF0IGFyZSBDYW5jZWxFcnJvcnMgd2hvc2UgY2FuY2VsbGF0aW9uIGNhdXNlIGlzIHRoZSBzYW1lIGFzIG91cnMuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIHt9XG5cbiAgICAgICAgICAgIHZvaWQgUHJvbWlzZS5yZWplY3QobmV3IENhbmNlbGxlZFJlamVjdGlvbkVycm9yKHByb21pc2UucHJvbWlzZSwgcmVhc29uKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdGF0ZS5zZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHByb21pc2UucmVqZWN0KHJlYXNvbik7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGNhbGxiYWNrIHRoYXQgY2FuY2VscyBhbGwgdmFsdWVzIGluIGFuIGl0ZXJhYmxlIHRoYXQgbG9vayBsaWtlIGNhbmNlbGxhYmxlIHRoZW5hYmxlcy5cbiAqL1xuZnVuY3Rpb24gYWxsQ2FuY2VsbGVyKHZhbHVlczogSXRlcmFibGU8YW55Pik6IENhbmNlbGxhYmxlUHJvbWlzZUNhbmNlbGxlciB7XG4gICAgcmV0dXJuIChjYXVzZT8pID0+IHtcbiAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzQ2FsbGFibGUodmFsdWUudGhlbikpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNhbmNlbCA9IHZhbHVlLmNhbmNlbDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ2FsbGFibGUoY2FuY2VsKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgUmVmbGVjdC5hcHBseShjYW5jZWwsIHZhbHVlLCBbY2F1c2VdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2gge31cbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGl0cyBhcmd1bWVudC5cbiAqL1xuZnVuY3Rpb24gaWRlbnRpdHk8VD4oeDogVCk6IFQge1xuICAgIHJldHVybiB4O1xufVxuXG4vKipcbiAqIFRocm93cyBpdHMgYXJndW1lbnQuXG4gKi9cbmZ1bmN0aW9uIHRocm93ZXIocmVhc29uPzogYW55KTogbmV2ZXIge1xuICAgIHRocm93IHJlYXNvbjtcbn1cblxuLyoqXG4gKiBBdHRlbXB0cyB2YXJpb3VzIHN0cmF0ZWdpZXMgdG8gY29udmVydCBhbiBlcnJvciB0byBhIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gZXJyb3JNZXNzYWdlKGVycjogYW55KTogc3RyaW5nIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IgfHwgdHlwZW9mIGVyciAhPT0gJ29iamVjdCcgfHwgZXJyLnRvU3RyaW5nICE9PSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJcIiArIGVycjtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2gge31cblxuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShlcnIpO1xuICAgIH0gY2F0Y2gge31cblxuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZXJyKTtcbiAgICB9IGNhdGNoIHt9XG5cbiAgICByZXR1cm4gXCI8Y291bGQgbm90IGNvbnZlcnQgZXJyb3IgdG8gc3RyaW5nPlwiO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGN1cnJlbnQgYmFycmllciBwcm9taXNlIGZvciB0aGUgZ2l2ZW4gY2FuY2VsbGFibGUgcHJvbWlzZS4gSWYgbmVjZXNzYXJ5LCBpbml0aWFsaXNlcyB0aGUgYmFycmllci5cbiAqL1xuZnVuY3Rpb24gY3VycmVudEJhcnJpZXI8VD4ocHJvbWlzZTogQ2FuY2VsbGFibGVQcm9taXNlPFQ+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IHB3cjogUGFydGlhbDxQcm9taXNlV2l0aFJlc29sdmVyczx2b2lkPj4gPSBwcm9taXNlW2JhcnJpZXJTeW1dID8/IHt9O1xuICAgIGlmICghKCdwcm9taXNlJyBpbiBwd3IpKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24ocHdyLCBwcm9taXNlV2l0aFJlc29sdmVyczx2b2lkPigpKTtcbiAgICB9XG4gICAgaWYgKHByb21pc2VbYmFycmllclN5bV0gPT0gbnVsbCkge1xuICAgICAgICBwd3IucmVzb2x2ZSEoKTtcbiAgICAgICAgcHJvbWlzZVtiYXJyaWVyU3ltXSA9IHB3cjtcbiAgICB9XG4gICAgcmV0dXJuIHB3ci5wcm9taXNlITtcbn1cblxuLy8gU3RvcCBzbmVha3kgcGVvcGxlIGZyb20gYnJlYWtpbmcgdGhlIGJhcnJpZXIgbWVjaGFuaXNtLlxuY29uc3QgcHJvbWlzZVRoZW4gPSBQcm9taXNlLnByb3RvdHlwZS50aGVuO1xuUHJvbWlzZS5wcm90b3R5cGUudGhlbiA9IGZ1bmN0aW9uKC4uLmFyZ3MpIHtcbiAgICBpZiAodGhpcyBpbnN0YW5jZW9mIENhbmNlbGxhYmxlUHJvbWlzZSkge1xuICAgICAgICByZXR1cm4gdGhpcy50aGVuKC4uLmFyZ3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBSZWZsZWN0LmFwcGx5KHByb21pc2VUaGVuLCB0aGlzLCBhcmdzKTtcbiAgICB9XG59XG5cbi8vIFBvbHlmaWxsIFByb21pc2Uud2l0aFJlc29sdmVycy5cbmxldCBwcm9taXNlV2l0aFJlc29sdmVycyA9IFByb21pc2Uud2l0aFJlc29sdmVycztcbmlmIChwcm9taXNlV2l0aFJlc29sdmVycyAmJiB0eXBlb2YgcHJvbWlzZVdpdGhSZXNvbHZlcnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBwcm9taXNlV2l0aFJlc29sdmVycyA9IHByb21pc2VXaXRoUmVzb2x2ZXJzLmJpbmQoUHJvbWlzZSk7XG59IGVsc2Uge1xuICAgIHByb21pc2VXaXRoUmVzb2x2ZXJzID0gZnVuY3Rpb24gPFQ+KCk6IFByb21pc2VXaXRoUmVzb2x2ZXJzPFQ+IHtcbiAgICAgICAgbGV0IHJlc29sdmUhOiAodmFsdWU6IFQgfCBQcm9taXNlTGlrZTxUPikgPT4gdm9pZDtcbiAgICAgICAgbGV0IHJlamVjdCE6IChyZWFzb24/OiBhbnkpID0+IHZvaWQ7XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZTxUPigocmVzLCByZWopID0+IHsgcmVzb2x2ZSA9IHJlczsgcmVqZWN0ID0gcmVqOyB9KTtcbiAgICAgICAgcmV0dXJuIHsgcHJvbWlzZSwgcmVzb2x2ZSwgcmVqZWN0IH07XG4gICAgfVxufSIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuaW1wb3J0IHtuZXdSdW50aW1lQ2FsbGVyLCBvYmplY3ROYW1lc30gZnJvbSBcIi4vcnVudGltZS5qc1wiO1xuXG5jb25zdCBjYWxsID0gbmV3UnVudGltZUNhbGxlcihvYmplY3ROYW1lcy5DbGlwYm9hcmQpO1xuXG5jb25zdCBDbGlwYm9hcmRTZXRUZXh0ID0gMDtcbmNvbnN0IENsaXBib2FyZFRleHQgPSAxO1xuXG4vKipcbiAqIFNldHMgdGhlIHRleHQgdG8gdGhlIENsaXBib2FyZC5cbiAqXG4gKiBAcGFyYW0gdGV4dCAtIFRoZSB0ZXh0IHRvIGJlIHNldCB0byB0aGUgQ2xpcGJvYXJkLlxuICogQHJldHVybiBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFNldFRleHQodGV4dDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIGNhbGwoQ2xpcGJvYXJkU2V0VGV4dCwge3RleHR9KTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIENsaXBib2FyZCB0ZXh0XG4gKlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgdGV4dCBmcm9tIHRoZSBDbGlwYm9hcmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBUZXh0KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIGNhbGwoQ2xpcGJvYXJkVGV4dCk7XG59XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbi8qKlxuICogQW55IGlzIGEgZHVtbXkgY3JlYXRpb24gZnVuY3Rpb24gZm9yIHNpbXBsZSBvciB1bmtub3duIHR5cGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQW55PFQ+KHNvdXJjZTogYW55KTogVCB7XG4gICAgcmV0dXJuIHNvdXJjZTtcbn1cblxuLyoqXG4gKiBCeXRlU2xpY2UgaXMgYSBjcmVhdGlvbiBmdW5jdGlvbiB0aGF0IHJlcGxhY2VzXG4gKiBudWxsIHN0cmluZ3Mgd2l0aCBlbXB0eSBzdHJpbmdzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQnl0ZVNsaWNlKHNvdXJjZTogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gKChzb3VyY2UgPT0gbnVsbCkgPyBcIlwiIDogc291cmNlKTtcbn1cblxuLyoqXG4gKiBBcnJheSB0YWtlcyBhIGNyZWF0aW9uIGZ1bmN0aW9uIGZvciBhbiBhcmJpdHJhcnkgdHlwZVxuICogYW5kIHJldHVybnMgYW4gaW4tcGxhY2UgY3JlYXRpb24gZnVuY3Rpb24gZm9yIGFuIGFycmF5XG4gKiB3aG9zZSBlbGVtZW50cyBhcmUgb2YgdGhhdCB0eXBlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQXJyYXk8VD4oZWxlbWVudDogKHNvdXJjZTogYW55KSA9PiBUKTogKHNvdXJjZTogYW55KSA9PiBUW10ge1xuICAgIGlmIChlbGVtZW50ID09PSBBbnkpIHtcbiAgICAgICAgcmV0dXJuIChzb3VyY2UpID0+IChzb3VyY2UgPT09IG51bGwgPyBbXSA6IHNvdXJjZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIChzb3VyY2UpID0+IHtcbiAgICAgICAgaWYgKHNvdXJjZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc291cmNlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBzb3VyY2VbaV0gPSBlbGVtZW50KHNvdXJjZVtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICB9O1xufVxuXG4vKipcbiAqIE1hcCB0YWtlcyBjcmVhdGlvbiBmdW5jdGlvbnMgZm9yIHR3byBhcmJpdHJhcnkgdHlwZXNcbiAqIGFuZCByZXR1cm5zIGFuIGluLXBsYWNlIGNyZWF0aW9uIGZ1bmN0aW9uIGZvciBhbiBvYmplY3RcbiAqIHdob3NlIGtleXMgYW5kIHZhbHVlcyBhcmUgb2YgdGhvc2UgdHlwZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBNYXA8Vj4oa2V5OiAoc291cmNlOiBhbnkpID0+IHN0cmluZywgdmFsdWU6IChzb3VyY2U6IGFueSkgPT4gVik6IChzb3VyY2U6IGFueSkgPT4gUmVjb3JkPHN0cmluZywgVj4ge1xuICAgIGlmICh2YWx1ZSA9PT0gQW55KSB7XG4gICAgICAgIHJldHVybiAoc291cmNlKSA9PiAoc291cmNlID09PSBudWxsID8ge30gOiBzb3VyY2UpO1xuICAgIH1cblxuICAgIHJldHVybiAoc291cmNlKSA9PiB7XG4gICAgICAgIGlmIChzb3VyY2UgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgIHNvdXJjZVtrZXldID0gdmFsdWUoc291cmNlW2tleV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgfTtcbn1cblxuLyoqXG4gKiBOdWxsYWJsZSB0YWtlcyBhIGNyZWF0aW9uIGZ1bmN0aW9uIGZvciBhbiBhcmJpdHJhcnkgdHlwZVxuICogYW5kIHJldHVybnMgYSBjcmVhdGlvbiBmdW5jdGlvbiBmb3IgYSBudWxsYWJsZSB2YWx1ZSBvZiB0aGF0IHR5cGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBOdWxsYWJsZTxUPihlbGVtZW50OiAoc291cmNlOiBhbnkpID0+IFQpOiAoc291cmNlOiBhbnkpID0+IChUIHwgbnVsbCkge1xuICAgIGlmIChlbGVtZW50ID09PSBBbnkpIHtcbiAgICAgICAgcmV0dXJuIEFueTtcbiAgICB9XG5cbiAgICByZXR1cm4gKHNvdXJjZSkgPT4gKHNvdXJjZSA9PT0gbnVsbCA/IG51bGwgOiBlbGVtZW50KHNvdXJjZSkpO1xufVxuXG4vKipcbiAqIFN0cnVjdCB0YWtlcyBhbiBvYmplY3QgbWFwcGluZyBmaWVsZCBuYW1lcyB0byBjcmVhdGlvbiBmdW5jdGlvbnNcbiAqIGFuZCByZXR1cm5zIGFuIGluLXBsYWNlIGNyZWF0aW9uIGZ1bmN0aW9uIGZvciBhIHN0cnVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFN0cnVjdDxcbiAgICBUIGV4dGVuZHMgeyBbXzogc3RyaW5nXTogKChzb3VyY2U6IGFueSkgPT4gYW55KSB9LFxuICAgIFUgZXh0ZW5kcyB7IFtLZXkgaW4ga2V5b2YgVF0/OiBSZXR1cm5UeXBlPFRbS2V5XT4gfVxuPihjcmVhdGVGaWVsZDogVCk6IChzb3VyY2U6IGFueSkgPT4gVSB7XG4gICAgbGV0IGFsbEFueSA9IHRydWU7XG4gICAgZm9yIChjb25zdCBuYW1lIGluIGNyZWF0ZUZpZWxkKSB7XG4gICAgICAgIGlmIChjcmVhdGVGaWVsZFtuYW1lXSAhPT0gQW55KSB7XG4gICAgICAgICAgICBhbGxBbnkgPSBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChhbGxBbnkpIHtcbiAgICAgICAgcmV0dXJuIEFueTtcbiAgICB9XG5cbiAgICByZXR1cm4gKHNvdXJjZSkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgaW4gY3JlYXRlRmllbGQpIHtcbiAgICAgICAgICAgIGlmIChuYW1lIGluIHNvdXJjZSkge1xuICAgICAgICAgICAgICAgIHNvdXJjZVtuYW1lXSA9IGNyZWF0ZUZpZWxkW25hbWVdKHNvdXJjZVtuYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICB9O1xufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5leHBvcnQgaW50ZXJmYWNlIFNpemUge1xuICAgIC8qKiBUaGUgd2lkdGggb2YgYSByZWN0YW5ndWxhciBhcmVhLiAqL1xuICAgIFdpZHRoOiBudW1iZXI7XG4gICAgLyoqIFRoZSBoZWlnaHQgb2YgYSByZWN0YW5ndWxhciBhcmVhLiAqL1xuICAgIEhlaWdodDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlY3Qge1xuICAgIC8qKiBUaGUgWCBjb29yZGluYXRlIG9mIHRoZSBvcmlnaW4uICovXG4gICAgWDogbnVtYmVyO1xuICAgIC8qKiBUaGUgWSBjb29yZGluYXRlIG9mIHRoZSBvcmlnaW4uICovXG4gICAgWTogbnVtYmVyO1xuICAgIC8qKiBUaGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZS4gKi9cbiAgICBXaWR0aDogbnVtYmVyO1xuICAgIC8qKiBUaGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUuICovXG4gICAgSGVpZ2h0OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2NyZWVuIHtcbiAgICAvKiogVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBzY3JlZW4uICovXG4gICAgSUQ6IHN0cmluZztcbiAgICAvKiogSHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgc2NyZWVuLiAqL1xuICAgIE5hbWU6IHN0cmluZztcbiAgICAvKiogVGhlIHNjYWxlIGZhY3RvciBvZiB0aGUgc2NyZWVuIChEUEkvOTYpLiAxID0gc3RhbmRhcmQgRFBJLCAyID0gSGlEUEkgKFJldGluYSksIGV0Yy4gKi9cbiAgICBTY2FsZUZhY3RvcjogbnVtYmVyO1xuICAgIC8qKiBUaGUgWCBjb29yZGluYXRlIG9mIHRoZSBzY3JlZW4uICovXG4gICAgWDogbnVtYmVyO1xuICAgIC8qKiBUaGUgWSBjb29yZGluYXRlIG9mIHRoZSBzY3JlZW4uICovXG4gICAgWTogbnVtYmVyO1xuICAgIC8qKiBDb250YWlucyB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgc2NyZWVuLiAqL1xuICAgIFNpemU6IFNpemU7XG4gICAgLyoqIENvbnRhaW5zIHRoZSBib3VuZHMgb2YgdGhlIHNjcmVlbiBpbiB0ZXJtcyBvZiBYLCBZLCBXaWR0aCwgYW5kIEhlaWdodC4gKi9cbiAgICBCb3VuZHM6IFJlY3Q7XG4gICAgLyoqIENvbnRhaW5zIHRoZSBwaHlzaWNhbCBib3VuZHMgb2YgdGhlIHNjcmVlbiBpbiB0ZXJtcyBvZiBYLCBZLCBXaWR0aCwgYW5kIEhlaWdodCAoYmVmb3JlIHNjYWxpbmcpLiAqL1xuICAgIFBoeXNpY2FsQm91bmRzOiBSZWN0O1xuICAgIC8qKiBDb250YWlucyB0aGUgYXJlYSBvZiB0aGUgc2NyZWVuIHRoYXQgaXMgYWN0dWFsbHkgdXNhYmxlIChleGNsdWRpbmcgdGFza2JhciBhbmQgb3RoZXIgc3lzdGVtIFVJKS4gKi9cbiAgICBXb3JrQXJlYTogUmVjdDtcbiAgICAvKiogQ29udGFpbnMgdGhlIHBoeXNpY2FsIFdvcmtBcmVhIG9mIHRoZSBzY3JlZW4gKGJlZm9yZSBzY2FsaW5nKS4gKi9cbiAgICBQaHlzaWNhbFdvcmtBcmVhOiBSZWN0O1xuICAgIC8qKiBUcnVlIGlmIHRoaXMgaXMgdGhlIHByaW1hcnkgbW9uaXRvciBzZWxlY3RlZCBieSB0aGUgdXNlciBpbiB0aGUgb3BlcmF0aW5nIHN5c3RlbS4gKi9cbiAgICBJc1ByaW1hcnk6IGJvb2xlYW47XG4gICAgLyoqIFRoZSByb3RhdGlvbiBvZiB0aGUgc2NyZWVuLiAqL1xuICAgIFJvdGF0aW9uOiBudW1iZXI7XG59XG5cbmltcG9ydCB7IG5ld1J1bnRpbWVDYWxsZXIsIG9iamVjdE5hbWVzIH0gZnJvbSBcIi4vcnVudGltZS5qc1wiO1xuY29uc3QgY2FsbCA9IG5ld1J1bnRpbWVDYWxsZXIob2JqZWN0TmFtZXMuU2NyZWVucyk7XG5cbmNvbnN0IGdldEFsbCA9IDA7XG5jb25zdCBnZXRQcmltYXJ5ID0gMTtcbmNvbnN0IGdldEN1cnJlbnQgPSAyO1xuXG4vKipcbiAqIEdldHMgYWxsIHNjcmVlbnMuXG4gKlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgb2YgU2NyZWVuIG9iamVjdHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBHZXRBbGwoKTogUHJvbWlzZTxTY3JlZW5bXT4ge1xuICAgIHJldHVybiBjYWxsKGdldEFsbCk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgcHJpbWFyeSBzY3JlZW4uXG4gKlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHByaW1hcnkgc2NyZWVuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gR2V0UHJpbWFyeSgpOiBQcm9taXNlPFNjcmVlbj4ge1xuICAgIHJldHVybiBjYWxsKGdldFByaW1hcnkpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGN1cnJlbnQgYWN0aXZlIHNjcmVlbi5cbiAqXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBjdXJyZW50IGFjdGl2ZSBzY3JlZW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBHZXRDdXJyZW50KCk6IFByb21pc2U8U2NyZWVuPiB7XG4gICAgcmV0dXJuIGNhbGwoZ2V0Q3VycmVudCk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7OztBQ0FBO0FBQUE7QUFBQTtBQUFBO0FBQUE7OztBQ0FBO0FBQUE7QUFBQTtBQUFBOzs7QUM2QkEsSUFBTSxjQUNGO0FBRUcsU0FBUyxPQUFPLE9BQWUsSUFBWTtBQUM5QyxNQUFJLEtBQUs7QUFFVCxNQUFJLElBQUksT0FBTztBQUNmLFNBQU8sS0FBSztBQUVSLFVBQU0sWUFBYSxLQUFLLE9BQU8sSUFBSSxLQUFNLENBQUM7QUFBQSxFQUM5QztBQUNBLFNBQU87QUFDWDs7O0FDN0JBLElBQU0sYUFBYSxPQUFPLFNBQVMsU0FBUztBQUdyQyxJQUFNLGNBQWMsT0FBTyxPQUFP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QUFBQSxFQUNYO0FBRUEsU0FBTyxDQUFDLFdBQVksV0FBVyxPQUFPLE9BQU8sUUFBUSxNQUFNO0FBQy9EO0FBTU8sU0FBUyxPQUdkLGFBQW9DO0FBQ2xDLE1BQUksU0FBUztBQUNiLGFBQVcsUUFBUSxhQUFhO0FBQzVCLFFBQUksWUFBWSxJQUFJLE1BQU0sS0FBSztBQUMzQixlQUFTO0FBQ1Q7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQUksUUFBUTtBQUNSLFdBQU87QUFBQSxFQUNYO0FBRUEsU0FBTyxDQUFDLFdBQVc7QUFDZixlQUFXLFFBQVEsYUFBYTtBQUM1QixVQUFJLFFBQVEsUUFBUTtBQUNoQixlQUFPLElBQUksSUFBSSxZQUFZLElBQUksRUFBRSxPQUFPLElBQUksQ0FBQztBQUFBLE1BQ2pEO0FBQUEsSUFDSjtBQUNBLFdBQU87QUFBQSxFQUNYO0FBQ0o7OztBQzFHQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUF3REEsSUFBTUMsUUFBTyxpQkFBaUIsWUFBWSxPQUFPO0FBRWpELElBQU0sU0FBUztBQUNmLElBQU0sYUFBYTtBQUNuQixJQUFNLGFBQWE7QUFPWixTQUFTLFNBQTRCO0FBQ3hDLFNBQU9BLE1BQUssTUFBTTtBQUN0QjtBQU9PLFNBQVMsYUFBOEI7QUFDMUMsU0FBT0EsTUFBSyxVQUFVO0FBQzFCO0FBT08sU0FBUyxhQUE4QjtBQUMxQyxTQUFPQSxNQUFLLFVBQVU7QUFDMUI7OztBdEI1RUEsT0FBTyxTQUFTLE9BQU8sVUFBVSxDQUFDO0FBNENsQyxPQUFPLE9BQU8sU0FBZ0I7QUFDdkIsT0FBTyxxQkFBcUI7IiwKICAibmFtZXMiOiBbIl9hIiwgIkVycm9yIiwgImNhbGwiLCAiX2EiLCAiRXJyb3IiLCAiY2FsbCIsICJyZXNpemFibGUiLCAiY2FsbCIsICJfYSIsICJjYWxsIiwgIl9hIiwgIl9hIiwgImNhbGwiLCAiSGlkZU1ldGhvZCIsICJTaG93TWV0aG9kIiwgImlzRG9jdW1lbnREb3RBbGwiLCAiX2EiLCAicmVhc29uIiwgInZhbHVlIiwgImNhbGwiLCAiZ2V0QW5kRGVsZXRlUmVzcG9uc2UiLCAiZ2VuZXJhdGVJRCIsICJjYWxsIiwgIkFycmF5IiwgIk1hcCIsICJBcnJheSIsICJNYXAiLCAia2V5IiwgImNhbGwiXQp9Cg== diff --git a/v3/internal/assetserver/bundledassets/runtime.js b/v3/internal/assetserver/bundledassets/runtime.js index b4b88e141..08ad86c99 100644 --- a/v3/internal/assetserver/bundledassets/runtime.js +++ b/v3/internal/assetserver/bundledassets/runtime.js @@ -1 +1 @@ -var Ce=Object.defineProperty;var w=(e,n)=>{for(var i in n)Ce(e,i,{get:n[i],enumerable:!0})};var j={};w(j,{Application:()=>q,Browser:()=>I,Call:()=>ee,Clipboard:()=>ne,Create:()=>ie,Dialogs:()=>T,Events:()=>L,Flags:()=>X,Screens:()=>te,System:()=>Y,WML:()=>V,Window:()=>E,init:()=>Me});var V={};w(V,{Enable:()=>_,Reload:()=>ue});var I={};w(I,{OpenURL:()=>O});var Se="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict",D=(e=21)=>{let n="",i=e|0;for(;i--;)n+=Se[Math.random()*64|0];return n};var xe=window.location.origin+"/wails/runtime",l={Call:0,Clipboard:1,Application:2,Events:3,ContextMenu:4,Dialog:5,Window:6,Screens:7,System:8,Browser:9,CancelCall:10},ve=D();function s(e,n){return function(i,o=null){return Ae(e,i,n,o)}}async function Ae(e,n,i,o){let r=new URL(xe);e!=null&&r.searchParams.append("object",e),n!=null&&r.searchParams.append("method",n);let d={headers:{}};i&&(d.headers["x-wails-window-name"]=i),o&&r.searchParams.append("args",JSON.stringify(o)),d.headers["x-wails-client-id"]=ve;let a=await fetch(r,d);if(!a.ok)throw new Error(await a.text());return a.headers.get("Content-Type")&&a.headers.get("Content-Type").indexOf("application/json")!==-1?a.json():a.text()}var be=s(l.Browser,""),Re=0;function O(e){return be(Re,{url:e})}var T={};w(T,{Error:()=>de,Info:()=>ke,OpenFile:()=>Ne,Question:()=>P,SaveFile:()=>He,Warning:()=>Le});window._wails=window._wails||{};window._wails.dialogErrorCallback=ze;window._wails.dialogResultCallback=Be;var Ee=0,ye=1,Ue=2,Fe=3,Oe=4,Ie=5,Pe=s(l.Dialog,""),W=new Map;function Te(){let e;do e=D();while(W.has(e));return e}function M(e,n={}){let i=Te();return n["dialog-id"]=i,new Promise((o,r)=>{W.set(i,{resolve:o,reject:r}),Pe(e,n).catch(d=>{r(d),W.delete(i)})})}function Be(e,n,i){let o=W.get(e);o&&(W.delete(e),i?o.resolve(JSON.parse(n)):o.resolve(n))}function ze(e,n){let i=W.get(e);i&&(W.delete(e),i.reject(new de(n)))}var ke=e=>M(Ee,e),Le=e=>M(ye,e),de=e=>M(Ue,e),P=e=>M(Fe,e),Ne=e=>M(Oe,e),He=e=>M(Ie,e);var L={};w(L,{Emit:()=>k,Off:()=>Qe,OffAll:()=>Je,On:()=>Ke,OnMultiple:()=>z,Once:()=>Ye,Types:()=>Ze,WailsEvent:()=>v,setup:()=>je});var ae={Windows:{APMPowerSettingChange:"windows:APMPowerSettingChange",APMPowerStatusChange:"windows:APMPowerStatusChange",APMResumeAutomatic:"windows:APMResumeAutomatic",APMResumeSuspend:"windows:APMResumeSuspend",APMSuspend:"windows:APMSuspend",ApplicationStarted:"windows:ApplicationStarted",SystemThemeChanged:"windows:SystemThemeChanged",WebViewNavigationCompleted:"windows:WebViewNavigationCompleted",WindowActive:"windows:WindowActive",WindowBackgroundErase:"windows:WindowBackgroundErase",WindowClickActive:"windows:WindowClickActive",WindowClosing:"windows:WindowClosing",WindowDidMove:"windows:WindowDidMove",WindowDidResize:"windows:WindowDidResize",WindowDPIChanged:"windows:WindowDPIChanged",WindowDragDrop:"windows:WindowDragDrop",WindowDragEnter:"windows:WindowDragEnter",WindowDragLeave:"windows:WindowDragLeave",WindowDragOver:"windows:WindowDragOver",WindowEndMove:"windows:WindowEndMove",WindowEndResize:"windows:WindowEndResize",WindowFullscreen:"windows:WindowFullscreen",WindowHide:"windows:WindowHide",WindowInactive:"windows:WindowInactive",WindowKeyDown:"windows:WindowKeyDown",WindowKeyUp:"windows:WindowKeyUp",WindowKillFocus:"windows:WindowKillFocus",WindowNonClientHit:"windows:WindowNonClientHit",WindowNonClientMouseDown:"windows:WindowNonClientMouseDown",WindowNonClientMouseLeave:"windows:WindowNonClientMouseLeave",WindowNonClientMouseMove:"windows:WindowNonClientMouseMove",WindowNonClientMouseUp:"windows:WindowNonClientMouseUp",WindowPaint:"windows:WindowPaint",WindowRestore:"windows:WindowRestore",WindowSetFocus:"windows:WindowSetFocus",WindowShow:"windows:WindowShow",WindowStartMove:"windows:WindowStartMove",WindowStartResize:"windows:WindowStartResize",WindowUnFullscreen:"windows:WindowUnFullscreen",WindowZOrderChanged:"windows:WindowZOrderChanged",WindowMinimise:"windows:WindowMinimise",WindowUnMinimise:"windows:WindowUnMinimise",WindowMaximise:"windows:WindowMaximise",WindowUnMaximise:"windows:WindowUnMaximise"},Mac:{ApplicationDidBecomeActive:"mac:ApplicationDidBecomeActive",ApplicationDidChangeBackingProperties:"mac:ApplicationDidChangeBackingProperties",ApplicationDidChangeEffectiveAppearance:"mac:ApplicationDidChangeEffectiveAppearance",ApplicationDidChangeIcon:"mac:ApplicationDidChangeIcon",ApplicationDidChangeOcclusionState:"mac:ApplicationDidChangeOcclusionState",ApplicationDidChangeScreenParameters:"mac:ApplicationDidChangeScreenParameters",ApplicationDidChangeStatusBarFrame:"mac:ApplicationDidChangeStatusBarFrame",ApplicationDidChangeStatusBarOrientation:"mac:ApplicationDidChangeStatusBarOrientation",ApplicationDidChangeTheme:"mac:ApplicationDidChangeTheme",ApplicationDidFinishLaunching:"mac:ApplicationDidFinishLaunching",ApplicationDidHide:"mac:ApplicationDidHide",ApplicationDidResignActive:"mac:ApplicationDidResignActive",ApplicationDidUnhide:"mac:ApplicationDidUnhide",ApplicationDidUpdate:"mac:ApplicationDidUpdate",ApplicationShouldHandleReopen:"mac:ApplicationShouldHandleReopen",ApplicationWillBecomeActive:"mac:ApplicationWillBecomeActive",ApplicationWillFinishLaunching:"mac:ApplicationWillFinishLaunching",ApplicationWillHide:"mac:ApplicationWillHide",ApplicationWillResignActive:"mac:ApplicationWillResignActive",ApplicationWillTerminate:"mac:ApplicationWillTerminate",ApplicationWillUnhide:"mac:ApplicationWillUnhide",ApplicationWillUpdate:"mac:ApplicationWillUpdate",MenuDidAddItem:"mac:MenuDidAddItem",MenuDidBeginTracking:"mac:MenuDidBeginTracking",MenuDidClose:"mac:MenuDidClose",MenuDidDisplayItem:"mac:MenuDidDisplayItem",MenuDidEndTracking:"mac:MenuDidEndTracking",MenuDidHighlightItem:"mac:MenuDidHighlightItem",MenuDidOpen:"mac:MenuDidOpen",MenuDidPopUp:"mac:MenuDidPopUp",MenuDidRemoveItem:"mac:MenuDidRemoveItem",MenuDidSendAction:"mac:MenuDidSendAction",MenuDidSendActionToItem:"mac:MenuDidSendActionToItem",MenuDidUpdate:"mac:MenuDidUpdate",MenuWillAddItem:"mac:MenuWillAddItem",MenuWillBeginTracking:"mac:MenuWillBeginTracking",MenuWillDisplayItem:"mac:MenuWillDisplayItem",MenuWillEndTracking:"mac:MenuWillEndTracking",MenuWillHighlightItem:"mac:MenuWillHighlightItem",MenuWillOpen:"mac:MenuWillOpen",MenuWillPopUp:"mac:MenuWillPopUp",MenuWillRemoveItem:"mac:MenuWillRemoveItem",MenuWillSendAction:"mac:MenuWillSendAction",MenuWillSendActionToItem:"mac:MenuWillSendActionToItem",MenuWillUpdate:"mac:MenuWillUpdate",WebViewDidCommitNavigation:"mac:WebViewDidCommitNavigation",WebViewDidFinishNavigation:"mac:WebViewDidFinishNavigation",WebViewDidReceiveServerRedirectForProvisionalNavigation:"mac:WebViewDidReceiveServerRedirectForProvisionalNavigation",WebViewDidStartProvisionalNavigation:"mac:WebViewDidStartProvisionalNavigation",WindowDidBecomeKey:"mac:WindowDidBecomeKey",WindowDidBecomeMain:"mac:WindowDidBecomeMain",WindowDidBeginSheet:"mac:WindowDidBeginSheet",WindowDidChangeAlpha:"mac:WindowDidChangeAlpha",WindowDidChangeBackingLocation:"mac:WindowDidChangeBackingLocation",WindowDidChangeBackingProperties:"mac:WindowDidChangeBackingProperties",WindowDidChangeCollectionBehavior:"mac:WindowDidChangeCollectionBehavior",WindowDidChangeEffectiveAppearance:"mac:WindowDidChangeEffectiveAppearance",WindowDidChangeOcclusionState:"mac:WindowDidChangeOcclusionState",WindowDidChangeOrderingMode:"mac:WindowDidChangeOrderingMode",WindowDidChangeScreen:"mac:WindowDidChangeScreen",WindowDidChangeScreenParameters:"mac:WindowDidChangeScreenParameters",WindowDidChangeScreenProfile:"mac:WindowDidChangeScreenProfile",WindowDidChangeScreenSpace:"mac:WindowDidChangeScreenSpace",WindowDidChangeScreenSpaceProperties:"mac:WindowDidChangeScreenSpaceProperties",WindowDidChangeSharingType:"mac:WindowDidChangeSharingType",WindowDidChangeSpace:"mac:WindowDidChangeSpace",WindowDidChangeSpaceOrderingMode:"mac:WindowDidChangeSpaceOrderingMode",WindowDidChangeTitle:"mac:WindowDidChangeTitle",WindowDidChangeToolbar:"mac:WindowDidChangeToolbar",WindowDidDeminiaturize:"mac:WindowDidDeminiaturize",WindowDidEndSheet:"mac:WindowDidEndSheet",WindowDidEnterFullScreen:"mac:WindowDidEnterFullScreen",WindowDidEnterVersionBrowser:"mac:WindowDidEnterVersionBrowser",WindowDidExitFullScreen:"mac:WindowDidExitFullScreen",WindowDidExitVersionBrowser:"mac:WindowDidExitVersionBrowser",WindowDidExpose:"mac:WindowDidExpose",WindowDidFocus:"mac:WindowDidFocus",WindowDidMiniaturize:"mac:WindowDidMiniaturize",WindowDidMove:"mac:WindowDidMove",WindowDidOrderOffScreen:"mac:WindowDidOrderOffScreen",WindowDidOrderOnScreen:"mac:WindowDidOrderOnScreen",WindowDidResignKey:"mac:WindowDidResignKey",WindowDidResignMain:"mac:WindowDidResignMain",WindowDidResize:"mac:WindowDidResize",WindowDidUpdate:"mac:WindowDidUpdate",WindowDidUpdateAlpha:"mac:WindowDidUpdateAlpha",WindowDidUpdateCollectionBehavior:"mac:WindowDidUpdateCollectionBehavior",WindowDidUpdateCollectionProperties:"mac:WindowDidUpdateCollectionProperties",WindowDidUpdateShadow:"mac:WindowDidUpdateShadow",WindowDidUpdateTitle:"mac:WindowDidUpdateTitle",WindowDidUpdateToolbar:"mac:WindowDidUpdateToolbar",WindowDidZoom:"mac:WindowDidZoom",WindowFileDraggingEntered:"mac:WindowFileDraggingEntered",WindowFileDraggingExited:"mac:WindowFileDraggingExited",WindowFileDraggingPerformed:"mac:WindowFileDraggingPerformed",WindowHide:"mac:WindowHide",WindowMaximise:"mac:WindowMaximise",WindowUnMaximise:"mac:WindowUnMaximise",WindowMinimise:"mac:WindowMinimise",WindowUnMinimise:"mac:WindowUnMinimise",WindowShouldClose:"mac:WindowShouldClose",WindowShow:"mac:WindowShow",WindowWillBecomeKey:"mac:WindowWillBecomeKey",WindowWillBecomeMain:"mac:WindowWillBecomeMain",WindowWillBeginSheet:"mac:WindowWillBeginSheet",WindowWillChangeOrderingMode:"mac:WindowWillChangeOrderingMode",WindowWillClose:"mac:WindowWillClose",WindowWillDeminiaturize:"mac:WindowWillDeminiaturize",WindowWillEnterFullScreen:"mac:WindowWillEnterFullScreen",WindowWillEnterVersionBrowser:"mac:WindowWillEnterVersionBrowser",WindowWillExitFullScreen:"mac:WindowWillExitFullScreen",WindowWillExitVersionBrowser:"mac:WindowWillExitVersionBrowser",WindowWillFocus:"mac:WindowWillFocus",WindowWillMiniaturize:"mac:WindowWillMiniaturize",WindowWillMove:"mac:WindowWillMove",WindowWillOrderOffScreen:"mac:WindowWillOrderOffScreen",WindowWillOrderOnScreen:"mac:WindowWillOrderOnScreen",WindowWillResignMain:"mac:WindowWillResignMain",WindowWillResize:"mac:WindowWillResize",WindowWillUnfocus:"mac:WindowWillUnfocus",WindowWillUpdate:"mac:WindowWillUpdate",WindowWillUpdateAlpha:"mac:WindowWillUpdateAlpha",WindowWillUpdateCollectionBehavior:"mac:WindowWillUpdateCollectionBehavior",WindowWillUpdateCollectionProperties:"mac:WindowWillUpdateCollectionProperties",WindowWillUpdateShadow:"mac:WindowWillUpdateShadow",WindowWillUpdateTitle:"mac:WindowWillUpdateTitle",WindowWillUpdateToolbar:"mac:WindowWillUpdateToolbar",WindowWillUpdateVisibility:"mac:WindowWillUpdateVisibility",WindowWillUseStandardFrame:"mac:WindowWillUseStandardFrame",WindowZoomIn:"mac:WindowZoomIn",WindowZoomOut:"mac:WindowZoomOut",WindowZoomReset:"mac:WindowZoomReset"},Linux:{ApplicationStartup:"linux:ApplicationStartup",SystemThemeChanged:"linux:SystemThemeChanged",WindowDeleteEvent:"linux:WindowDeleteEvent",WindowDidMove:"linux:WindowDidMove",WindowDidResize:"linux:WindowDidResize",WindowFocusIn:"linux:WindowFocusIn",WindowFocusOut:"linux:WindowFocusOut",WindowLoadChanged:"linux:WindowLoadChanged"},Common:{ApplicationOpenedWithFile:"common:ApplicationOpenedWithFile",ApplicationStarted:"common:ApplicationStarted",ThemeChanged:"common:ThemeChanged",WindowClosing:"common:WindowClosing",WindowDidMove:"common:WindowDidMove",WindowDidResize:"common:WindowDidResize",WindowDPIChanged:"common:WindowDPIChanged",WindowFilesDropped:"common:WindowFilesDropped",WindowFocus:"common:WindowFocus",WindowFullscreen:"common:WindowFullscreen",WindowHide:"common:WindowHide",WindowLostFocus:"common:WindowLostFocus",WindowMaximise:"common:WindowMaximise",WindowMinimise:"common:WindowMinimise",WindowRestore:"common:WindowRestore",WindowRuntimeReady:"common:WindowRuntimeReady",WindowShow:"common:WindowShow",WindowUnFullscreen:"common:WindowUnFullscreen",WindowUnMaximise:"common:WindowUnMaximise",WindowUnMinimise:"common:WindowUnMinimise",WindowZoom:"common:WindowZoom",WindowZoomIn:"common:WindowZoomIn",WindowZoomOut:"common:WindowZoomOut",WindowZoomReset:"common:WindowZoomReset"}};var Ze=ae;window._wails=window._wails||{};window._wails.dispatchWailsEvent=Ge;var _e=s(l.Events,""),Ve=0,u=new Map,B=class{constructor(n,i,o){this.eventName=n,this.maxCallbacks=o||-1,this.Callback=r=>(i(r),this.maxCallbacks===-1?!1:(this.maxCallbacks-=1,this.maxCallbacks===0))}},v=class{constructor(n,i=null){this.name=n,this.data=i}};function je(){}function Ge(e){let n=u.get(e.name);if(n){let i=n.filter(o=>{if(o.Callback(e))return!0});i.length>0&&(n=n.filter(o=>!i.includes(o)),n.length===0?u.delete(e.name):u.set(e.name,n))}}function z(e,n,i){let o=u.get(e)||[],r=new B(e,n,i);return o.push(r),u.set(e,o),()=>Xe(r)}function Ke(e,n){return z(e,n,-1)}function Ye(e,n){return z(e,n,1)}function Xe(e){let n=e.eventName,i=u.get(n).filter(o=>o!==e);i.length===0?u.delete(n):u.set(n,i)}function Qe(e,...n){[e,...n].forEach(o=>u.delete(o))}function Je(){u.clear()}function k(e){return _e(Ve,e)}function le(){if(!EventTarget||!AbortSignal||!AbortController)return!1;let e=!0,n=new EventTarget,i=new AbortController;return n.addEventListener("test",()=>{e=!1},{signal:i.signal}),i.abort(),n.dispatchEvent(new CustomEvent("test")),e}var se=!1;document.addEventListener("DOMContentLoaded",()=>se=!0);function ce(e){se||document.readyState==="complete"?e():document.addEventListener("DOMContentLoaded",e)}var qe=0,$e=1,en=2,nn=3,on=4,tn=5,rn=6,dn=7,an=8,ln=9,sn=10,cn=11,wn=12,mn=13,un=14,pn=15,Wn=16,hn=17,gn=18,fn=19,Dn=20,Mn=21,Cn=22,Sn=23,xn=24,vn=25,An=26,bn=27,Rn=28,En=29,yn=30,Un=31,Fn=32,On=33,In=34,Pn=35,Tn=36,Bn=37,zn=38,kn=39,Ln=40,Nn=41,Hn=42,Zn=43,_n=44,Vn=45,jn=46,Gn=47,t=Symbol(),N=class e{constructor(n=""){this[t]=s(l.Window,n);for(let i of Object.getOwnPropertyNames(e.prototype))i!=="constructor"&&typeof this[i]=="function"&&(this[i]=this[i].bind(this))}Get(n){return new e(n)}Position(){return this[t](qe)}Center(){return this[t]($e)}Close(){return this[t](en)}DisableSizeConstraints(){return this[t](nn)}EnableSizeConstraints(){return this[t](on)}Focus(){return this[t](tn)}ForceReload(){return this[t](rn)}Fullscreen(){return this[t](dn)}GetScreen(){return this[t](an)}GetZoom(){return this[t](ln)}Height(){return this[t](sn)}Hide(){return this[t](cn)}IsFocused(){return this[t](wn)}IsFullscreen(){return this[t](mn)}IsMaximised(){return this[t](un)}IsMinimised(){return this[t](pn)}Maximise(){return this[t](Wn)}Minimise(){return this[t](hn)}Name(){return this[t](gn)}OpenDevTools(){return this[t](fn)}RelativePosition(){return this[t](Dn)}Reload(){return this[t](Mn)}Resizable(){return this[t](Cn)}Restore(){return this[t](Sn)}SetPosition(n,i){return this[t](xn,{x:n,y:i})}SetAlwaysOnTop(n){return this[t](vn,{alwaysOnTop:n})}SetBackgroundColour(n,i,o,r){return this[t](An,{r:n,g:i,b:o,a:r})}SetFrameless(n){return this[t](bn,{frameless:n})}SetFullscreenButtonEnabled(n){return this[t](Rn,{enabled:n})}SetMaxSize(n,i){return this[t](En,{width:n,height:i})}SetMinSize(n,i){return this[t](yn,{width:n,height:i})}SetRelativePosition(n,i){return this[t](Un,{x:n,y:i})}SetResizable(n){return this[t](Fn,{resizable:n})}SetSize(n,i){return this[t](On,{width:n,height:i})}SetTitle(n){return this[t](In,{title:n})}SetZoom(n){return this[t](Pn,{zoom:n})}Show(){return this[t](Tn)}Size(){return this[t](Bn)}ToggleFullscreen(){return this[t](zn)}ToggleMaximise(){return this[t](kn)}UnFullscreen(){return this[t](Ln)}UnMaximise(){return this[t](Nn)}UnMinimise(){return this[t](Hn)}Width(){return this[t](Zn)}Zoom(){return this[t](_n)}ZoomIn(){return this[t](Vn)}ZoomOut(){return this[t](jn)}ZoomReset(){return this[t](Gn)}},Kn=new N(""),E=Kn;function Yn(e,n=null){k(new v(e,n))}function Xn(e,n){let i=E.Get(e),o=i[n];if(typeof o=="function")try{o.call(i)}catch{}}function we(e){let n=e.currentTarget;function i(r="Yes"){if(r!=="Yes")return;let d=n.getAttribute("data-wml-event"),a=n.getAttribute("data-wml-target-window")||"",c=n.getAttribute("data-wml-window"),m=n.getAttribute("data-wml-openURL");d!==null&&Yn(d),c!==null&&Xn(a,c),m!==null&&O(m)}let o=n.getAttribute("data-wml-confirm");o?P({Title:"Confirm",Message:o,Detached:!1,Buttons:[{Label:"Yes"},{Label:"No",IsDefault:!0}]}).then(i):i()}var y=Symbol(),H=class{constructor(){this[y]=new AbortController}set(n,i){return{signal:this[y].signal}}reset(){this[y].abort(),this[y]=new AbortController}},A=Symbol(),C=Symbol(),Z=class{constructor(){this[A]=new WeakMap,this[C]=0}set(n,i){return this[C]+=!this[A].has(n),this[A].set(n,i),{}}reset(){if(!(this[C]<=0)){for(let n of document.body.querySelectorAll("*")){if(this[C]<=0)break;let i=this[A].get(n);this[C]-=typeof i<"u";for(let o of i||[])n.removeEventListener(o,we)}this[A]=new WeakMap,this[C]=0}}},me=le()?new H:new Z;function Qn(e){let n=/\S+/g,i=e.getAttribute("data-wml-trigger")||"click",o=[],r;for(;(r=n.exec(i))!==null;)o.push(r[0]);let d=me.set(e,o);for(let a of o)e.addEventListener(a,we,d)}function _(){ce(ue)}function ue(){me.reset(),document.body.querySelectorAll("[data-wml-event], [data-wml-window], [data-wml-openURL]").forEach(Qn)}window.wails=j;_();var Y={};w(Y,{Capabilities:()=>ei,Environment:()=>ni,IsAMD64:()=>ti,IsARM:()=>ri,IsARM64:()=>di,IsDarkMode:()=>$n,IsDebug:()=>K,IsLinux:()=>ii,IsMac:()=>oi,IsWindows:()=>G,invoke:()=>h});var We=s(l.System,""),Jn=0,qn=1,pe=(()=>{try{if(window?.chrome?.webview)return e=>window.chrome.webview.postMessage(e);if(window?.webkit?.messageHandlers?.external)return e=>window.webkit.messageHandlers.external.postMessage(e)}catch{}return null})();function h(e){if(pe)return pe(e)}function $n(){return We(Jn)}function ei(){return fetch("/wails/capabilities").json()}function ni(){return We(qn)}function G(){return window._wails.environment.OS==="windows"}function ii(){return window._wails.environment.OS==="linux"}function oi(){return window._wails.environment.OS==="darwin"}function ti(){return window._wails.environment.Arch==="amd64"}function ri(){return window._wails.environment.Arch==="arm"}function di(){return window._wails.environment.Arch==="arm64"}function K(){return window._wails.environment.Debug===!0}window.addEventListener("contextmenu",ci);var ai=s(l.ContextMenu,""),li=0;function si(e,n,i,o){ai(li,{id:e,x:n,y:i,data:o})}function ci(e){let n=e.target,i=window.getComputedStyle(n).getPropertyValue("--custom-contextmenu");if(i=i?i.trim():"",i){e.preventDefault();let o=window.getComputedStyle(n).getPropertyValue("--custom-contextmenu-data");si(i,e.clientX,e.clientY,o);return}wi(e)}function wi(e){if(K())return;let n=e.target;switch(window.getComputedStyle(n).getPropertyValue("--default-contextmenu").trim()){case"show":return;case"hide":e.preventDefault();return;default:if(n.isContentEditable)return;let r=window.getSelection(),d=r.toString().length>0;if(d)for(let a=0;ab});function b(e){try{return window._wails.flags[e]}catch(n){throw new Error("Unable to retrieve flag '"+e+"': "+n)}}var S=!1,he=!1,U=null,Q="auto";window._wails=window._wails||{};window._wails.setResizable=function(e){he=e};window._wails.endDrag=function(){document.body.style.cursor="default",S=!1};window.addEventListener("mousedown",ui);window.addEventListener("mousemove",Wi);window.addEventListener("mouseup",pi);function mi(e){let n=window.getComputedStyle(e.target).getPropertyValue("--wails-draggable"),i=e.buttons!==void 0?e.buttons:e.which;return!n||n===""||n.trim()!=="drag"||i===0?!1:e.detail===1}function ui(e){if(U){h("wails:resize:"+U),e.preventDefault();return}if(mi(e)){if(e.offsetX>e.target.clientWidth||e.offsetY>e.target.clientHeight)return;S=!0}else S=!1}function pi(){S=!1}function p(e){document.documentElement.style.cursor=e||Q,U=e}function Wi(e){if(S&&(S=!1,(e.buttons!==void 0?e.buttons:e.which)>0)){h("wails:drag");return}if(!he||!G())return;Q==null&&(Q=document.documentElement.style.cursor);let n=b("system.resizeHandleHeight")||5,i=b("system.resizeHandleWidth")||5,o=b("resizeCornerExtra")||10,r=window.outerWidth-e.clientXDi,Quit:()=>Ci,Show:()=>Mi});var J=s(l.Application,""),hi=0,gi=1,fi=2;function Di(){return J(hi)}function Mi(){return J(gi)}function Ci(){return J(fi)}var ee={};w(ee,{ByID:()=>yi,ByName:()=>Ei,Call:()=>$,RuntimeError:()=>F});window._wails=window._wails||{};window._wails.callResultHandler=bi;window._wails.callErrorHandler=Ri;var Si=0,xi=s(l.Call,""),vi=s(l.CancelCall,""),R=new Map;function Ai(){let e;do e=D();while(R.has(e));return e}function bi(e,n,i){let o=ge(e);if(o)if(!n)o.resolve();else if(!i)o.resolve(n);else try{o.resolve(JSON.parse(n))}catch(r){o.reject(new TypeError("could not parse result: "+r.message,{cause:r}))}}function Ri(e,n,i){let o=ge(e);if(o)if(!i)o.reject(new Error(n));else{let r;try{r=JSON.parse(n)}catch(c){o.reject(new TypeError("could not parse error: "+c.message,{cause:c}));return}let d={};r.cause&&(d.cause=r.cause);let a;switch(r.kind){case"ReferenceError":a=new ReferenceError(r.message,d);break;case"TypeError":a=new TypeError(r.message,d);break;case"RuntimeError":a=new F(r.message,d);break;default:a=new Error(r.message,d);break}o.reject(a)}}function ge(e){let n=R.get(e);return R.delete(e),n}var F=class extends Error{constructor(n,...i){super(n,...i),this.name="RuntimeError"}};function $(e){let n=Ai(),i=()=>vi(type,{"call-id":n}),o=!1,r=!1,d=new Promise((a,c)=>{e["call-id"]=n,R.set(n,{resolve:a,reject:c}),xi(Si,e).then(m=>{if(r=!0,o)return i()}).catch(m=>{c(m),R.delete(n)})});return d.cancel=()=>{if(r)return i();o=!0},d}function Ei(e,...n){return $({methodName:e,args:n})}function yi(e,...n){return $({methodID:e,args:n})}var ne={};w(ne,{SetText:()=>Oi,Text:()=>Ii});var fe=s(l.Clipboard,""),Ui=0,Fi=1;function Oi(e){return fe(Ui,{text:e})}function Ii(){return fe(Fi)}var ie={};w(ie,{Any:()=>g,Array:()=>Ti,ByteSlice:()=>Pi,Map:()=>Bi,Nullable:()=>zi,Struct:()=>ki});function g(e){return e}function Pi(e){return e??""}function Ti(e){return e===g?n=>n===null?[]:n:n=>{if(n===null)return[];for(let i=0;ii===null?{}:i:i=>{if(i===null)return{};for(let o in i)i[o]=n(i[o]);return i}}function zi(e){return e===g?g:n=>n===null?null:e(n)}function ki(e){let n=!0;for(let i in e)if(e[i]!==g){n=!1;break}return n?g:i=>{for(let o in e)o in i&&(i[o]=e[o](i[o]));return i}}var te={};w(te,{GetAll:()=>Zi,GetCurrent:()=>Vi,GetPrimary:()=>_i});var oe=s(l.Screens,""),Li=0,Ni=1,Hi=2;function Zi(){return oe(Li)}function _i(){return oe(Ni)}function Vi(){return oe(Hi)}window._wails=window._wails||{};var De=!1;function Me(){window._wails.invoke=h,h("wails:runtime:ready"),De=!0}window.addEventListener("load",()=>{De||Me()});export{q as Application,I as Browser,ee as Call,ne as Clipboard,ie as Create,T as Dialogs,L as Events,X as Flags,te as Screens,Y as System,V as WML,E as Window,Me as init}; +var Oe=Object.defineProperty,sn=Object.defineProperties;var ln=Object.getOwnPropertyDescriptors;var Ae=Object.getOwnPropertySymbols;var an=Object.prototype.hasOwnProperty,cn=Object.prototype.propertyIsEnumerable;var Ee=(n,e,i)=>e in n?Oe(n,e,{enumerable:!0,configurable:!0,writable:!0,value:i}):n[e]=i,ke=(n,e)=>{for(var i in e||(e={}))an.call(e,i)&&Ee(n,i,e[i]);if(Ae)for(var i of Ae(e))cn.call(e,i)&&Ee(n,i,e[i]);return n},Fe=(n,e)=>sn(n,ln(e));var w=(n,e)=>{for(var i in e)Oe(n,i,{get:e[i],enumerable:!0})};var D=(n,e,i)=>new Promise((o,t)=>{var s=a=>{try{c(i.next(a))}catch(u){t(u)}},l=a=>{try{c(i.throw(a))}catch(u){t(u)}},c=a=>a.done?o(a.value):Promise.resolve(a.value).then(s,l);c((i=i.apply(n,e)).next())});var ce={};w(ce,{Application:()=>he,Browser:()=>_,Call:()=>Me,CancelError:()=>O,CancellablePromise:()=>F,CancelledRejectionError:()=>k,Clipboard:()=>Se,Create:()=>Te,Dialogs:()=>ee,Events:()=>oe,Flags:()=>pe,Screens:()=>Re,System:()=>we,WML:()=>ae,Window:()=>Z});var ae={};w(ae,{Enable:()=>le,Reload:()=>Ve});var _={};w(_,{OpenURL:()=>q});var dn="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";function M(n=21){let e="",i=n|0;for(;i--;)e+=dn[Math.random()*64|0];return e}var mn=window.location.origin+"/wails/runtime",d=Object.freeze({Call:0,Clipboard:1,Application:2,Events:3,ContextMenu:4,Dialog:5,Window:6,Screens:7,System:8,Browser:9,CancelCall:10}),un=M();function m(n,e=""){return function(i,o=null){return wn(n,i,e,o)}}function wn(n,e,i,o){return D(this,null,function*(){var c,a;let t=new URL(mn);t.searchParams.append("object",n.toString()),t.searchParams.append("method",e.toString()),o&&t.searchParams.append("args",JSON.stringify(o));let s={"x-wails-client-id":un};i&&(s["x-wails-window-name"]=i);let l=yield fetch(t,{headers:s});if(!l.ok)throw new Error(yield l.text());return((a=(c=l.headers.get("Content-Type"))==null?void 0:c.indexOf("application/json"))!=null?a:-1)!==-1?l.json():l.text()})}var pn=m(d.Browser),fn=0;function q(n){return pn(fn,{url:n.toString()})}var ee={};w(ee,{Error:()=>xn,Info:()=>Sn,OpenFile:()=>Rn,Question:()=>$,SaveFile:()=>An,Warning:()=>Tn});window._wails=window._wails||{};window._wails.dialogErrorCallback=Dn;window._wails.dialogResultCallback=Pn;var gn=m(d.Dialog),U=new Map,hn=0,Wn=1,bn=2,yn=3,vn=4,Cn=5;function Pn(n,e,i){let o=Le(n);if(o)if(i)try{o.resolve(JSON.parse(e))}catch(t){o.reject(new TypeError("could not parse result: "+t.message,{cause:t}))}else o.resolve(e)}function Dn(n,e){var i;(i=Le(n))==null||i.reject(new window.Error(e))}function Le(n){let e=U.get(n);return U.delete(n),e}function Mn(){let n;do n=M();while(U.has(n));return n}function S(n,e={}){let i=Mn();return new Promise((o,t)=>{U.set(i,{resolve:o,reject:t}),gn(n,Object.assign({"dialog-id":i},e)).catch(s=>{U.delete(i),t(s)})})}function Sn(n){return S(hn,n)}function Tn(n){return S(Wn,n)}function xn(n){return S(bn,n)}function $(n){return S(yn,n)}function Rn(n){var e;return(e=S(vn,n))!=null?e:[]}function An(n){return S(Cn,n)}var oe={};w(oe,{Emit:()=>ie,Off:()=>Un,OffAll:()=>In,On:()=>Fn,OnMultiple:()=>ne,Once:()=>Ln,Types:()=>Ie,WailsEvent:()=>T});var f=new Map,H=class{constructor(e,i,o){this.eventName=e,this.callback=i,this.maxCallbacks=o||-1}dispatch(e){try{this.callback(e)}catch(i){}return this.maxCallbacks===-1?!1:(this.maxCallbacks-=1,this.maxCallbacks===0)}};function Ue(n){let e=f.get(n.eventName);e&&(e=e.filter(i=>i!==n),e.length===0?f.delete(n.eventName):f.set(n.eventName,e))}var Ie=Object.freeze({Windows:Object.freeze({APMPowerSettingChange:"windows:APMPowerSettingChange",APMPowerStatusChange:"windows:APMPowerStatusChange",APMResumeAutomatic:"windows:APMResumeAutomatic",APMResumeSuspend:"windows:APMResumeSuspend",APMSuspend:"windows:APMSuspend",ApplicationStarted:"windows:ApplicationStarted",SystemThemeChanged:"windows:SystemThemeChanged",WebViewNavigationCompleted:"windows:WebViewNavigationCompleted",WindowActive:"windows:WindowActive",WindowBackgroundErase:"windows:WindowBackgroundErase",WindowClickActive:"windows:WindowClickActive",WindowClosing:"windows:WindowClosing",WindowDidMove:"windows:WindowDidMove",WindowDidResize:"windows:WindowDidResize",WindowDPIChanged:"windows:WindowDPIChanged",WindowDragDrop:"windows:WindowDragDrop",WindowDragEnter:"windows:WindowDragEnter",WindowDragLeave:"windows:WindowDragLeave",WindowDragOver:"windows:WindowDragOver",WindowEndMove:"windows:WindowEndMove",WindowEndResize:"windows:WindowEndResize",WindowFullscreen:"windows:WindowFullscreen",WindowHide:"windows:WindowHide",WindowInactive:"windows:WindowInactive",WindowKeyDown:"windows:WindowKeyDown",WindowKeyUp:"windows:WindowKeyUp",WindowKillFocus:"windows:WindowKillFocus",WindowNonClientHit:"windows:WindowNonClientHit",WindowNonClientMouseDown:"windows:WindowNonClientMouseDown",WindowNonClientMouseLeave:"windows:WindowNonClientMouseLeave",WindowNonClientMouseMove:"windows:WindowNonClientMouseMove",WindowNonClientMouseUp:"windows:WindowNonClientMouseUp",WindowPaint:"windows:WindowPaint",WindowRestore:"windows:WindowRestore",WindowSetFocus:"windows:WindowSetFocus",WindowShow:"windows:WindowShow",WindowStartMove:"windows:WindowStartMove",WindowStartResize:"windows:WindowStartResize",WindowUnFullscreen:"windows:WindowUnFullscreen",WindowZOrderChanged:"windows:WindowZOrderChanged",WindowMinimise:"windows:WindowMinimise",WindowUnMinimise:"windows:WindowUnMinimise",WindowMaximise:"windows:WindowMaximise",WindowUnMaximise:"windows:WindowUnMaximise"}),Mac:Object.freeze({ApplicationDidBecomeActive:"mac:ApplicationDidBecomeActive",ApplicationDidChangeBackingProperties:"mac:ApplicationDidChangeBackingProperties",ApplicationDidChangeEffectiveAppearance:"mac:ApplicationDidChangeEffectiveAppearance",ApplicationDidChangeIcon:"mac:ApplicationDidChangeIcon",ApplicationDidChangeOcclusionState:"mac:ApplicationDidChangeOcclusionState",ApplicationDidChangeScreenParameters:"mac:ApplicationDidChangeScreenParameters",ApplicationDidChangeStatusBarFrame:"mac:ApplicationDidChangeStatusBarFrame",ApplicationDidChangeStatusBarOrientation:"mac:ApplicationDidChangeStatusBarOrientation",ApplicationDidChangeTheme:"mac:ApplicationDidChangeTheme",ApplicationDidFinishLaunching:"mac:ApplicationDidFinishLaunching",ApplicationDidHide:"mac:ApplicationDidHide",ApplicationDidResignActive:"mac:ApplicationDidResignActive",ApplicationDidUnhide:"mac:ApplicationDidUnhide",ApplicationDidUpdate:"mac:ApplicationDidUpdate",ApplicationShouldHandleReopen:"mac:ApplicationShouldHandleReopen",ApplicationWillBecomeActive:"mac:ApplicationWillBecomeActive",ApplicationWillFinishLaunching:"mac:ApplicationWillFinishLaunching",ApplicationWillHide:"mac:ApplicationWillHide",ApplicationWillResignActive:"mac:ApplicationWillResignActive",ApplicationWillTerminate:"mac:ApplicationWillTerminate",ApplicationWillUnhide:"mac:ApplicationWillUnhide",ApplicationWillUpdate:"mac:ApplicationWillUpdate",MenuDidAddItem:"mac:MenuDidAddItem",MenuDidBeginTracking:"mac:MenuDidBeginTracking",MenuDidClose:"mac:MenuDidClose",MenuDidDisplayItem:"mac:MenuDidDisplayItem",MenuDidEndTracking:"mac:MenuDidEndTracking",MenuDidHighlightItem:"mac:MenuDidHighlightItem",MenuDidOpen:"mac:MenuDidOpen",MenuDidPopUp:"mac:MenuDidPopUp",MenuDidRemoveItem:"mac:MenuDidRemoveItem",MenuDidSendAction:"mac:MenuDidSendAction",MenuDidSendActionToItem:"mac:MenuDidSendActionToItem",MenuDidUpdate:"mac:MenuDidUpdate",MenuWillAddItem:"mac:MenuWillAddItem",MenuWillBeginTracking:"mac:MenuWillBeginTracking",MenuWillDisplayItem:"mac:MenuWillDisplayItem",MenuWillEndTracking:"mac:MenuWillEndTracking",MenuWillHighlightItem:"mac:MenuWillHighlightItem",MenuWillOpen:"mac:MenuWillOpen",MenuWillPopUp:"mac:MenuWillPopUp",MenuWillRemoveItem:"mac:MenuWillRemoveItem",MenuWillSendAction:"mac:MenuWillSendAction",MenuWillSendActionToItem:"mac:MenuWillSendActionToItem",MenuWillUpdate:"mac:MenuWillUpdate",WebViewDidCommitNavigation:"mac:WebViewDidCommitNavigation",WebViewDidFinishNavigation:"mac:WebViewDidFinishNavigation",WebViewDidReceiveServerRedirectForProvisionalNavigation:"mac:WebViewDidReceiveServerRedirectForProvisionalNavigation",WebViewDidStartProvisionalNavigation:"mac:WebViewDidStartProvisionalNavigation",WindowDidBecomeKey:"mac:WindowDidBecomeKey",WindowDidBecomeMain:"mac:WindowDidBecomeMain",WindowDidBeginSheet:"mac:WindowDidBeginSheet",WindowDidChangeAlpha:"mac:WindowDidChangeAlpha",WindowDidChangeBackingLocation:"mac:WindowDidChangeBackingLocation",WindowDidChangeBackingProperties:"mac:WindowDidChangeBackingProperties",WindowDidChangeCollectionBehavior:"mac:WindowDidChangeCollectionBehavior",WindowDidChangeEffectiveAppearance:"mac:WindowDidChangeEffectiveAppearance",WindowDidChangeOcclusionState:"mac:WindowDidChangeOcclusionState",WindowDidChangeOrderingMode:"mac:WindowDidChangeOrderingMode",WindowDidChangeScreen:"mac:WindowDidChangeScreen",WindowDidChangeScreenParameters:"mac:WindowDidChangeScreenParameters",WindowDidChangeScreenProfile:"mac:WindowDidChangeScreenProfile",WindowDidChangeScreenSpace:"mac:WindowDidChangeScreenSpace",WindowDidChangeScreenSpaceProperties:"mac:WindowDidChangeScreenSpaceProperties",WindowDidChangeSharingType:"mac:WindowDidChangeSharingType",WindowDidChangeSpace:"mac:WindowDidChangeSpace",WindowDidChangeSpaceOrderingMode:"mac:WindowDidChangeSpaceOrderingMode",WindowDidChangeTitle:"mac:WindowDidChangeTitle",WindowDidChangeToolbar:"mac:WindowDidChangeToolbar",WindowDidDeminiaturize:"mac:WindowDidDeminiaturize",WindowDidEndSheet:"mac:WindowDidEndSheet",WindowDidEnterFullScreen:"mac:WindowDidEnterFullScreen",WindowDidEnterVersionBrowser:"mac:WindowDidEnterVersionBrowser",WindowDidExitFullScreen:"mac:WindowDidExitFullScreen",WindowDidExitVersionBrowser:"mac:WindowDidExitVersionBrowser",WindowDidExpose:"mac:WindowDidExpose",WindowDidFocus:"mac:WindowDidFocus",WindowDidMiniaturize:"mac:WindowDidMiniaturize",WindowDidMove:"mac:WindowDidMove",WindowDidOrderOffScreen:"mac:WindowDidOrderOffScreen",WindowDidOrderOnScreen:"mac:WindowDidOrderOnScreen",WindowDidResignKey:"mac:WindowDidResignKey",WindowDidResignMain:"mac:WindowDidResignMain",WindowDidResize:"mac:WindowDidResize",WindowDidUpdate:"mac:WindowDidUpdate",WindowDidUpdateAlpha:"mac:WindowDidUpdateAlpha",WindowDidUpdateCollectionBehavior:"mac:WindowDidUpdateCollectionBehavior",WindowDidUpdateCollectionProperties:"mac:WindowDidUpdateCollectionProperties",WindowDidUpdateShadow:"mac:WindowDidUpdateShadow",WindowDidUpdateTitle:"mac:WindowDidUpdateTitle",WindowDidUpdateToolbar:"mac:WindowDidUpdateToolbar",WindowDidZoom:"mac:WindowDidZoom",WindowFileDraggingEntered:"mac:WindowFileDraggingEntered",WindowFileDraggingExited:"mac:WindowFileDraggingExited",WindowFileDraggingPerformed:"mac:WindowFileDraggingPerformed",WindowHide:"mac:WindowHide",WindowMaximise:"mac:WindowMaximise",WindowUnMaximise:"mac:WindowUnMaximise",WindowMinimise:"mac:WindowMinimise",WindowUnMinimise:"mac:WindowUnMinimise",WindowShouldClose:"mac:WindowShouldClose",WindowShow:"mac:WindowShow",WindowWillBecomeKey:"mac:WindowWillBecomeKey",WindowWillBecomeMain:"mac:WindowWillBecomeMain",WindowWillBeginSheet:"mac:WindowWillBeginSheet",WindowWillChangeOrderingMode:"mac:WindowWillChangeOrderingMode",WindowWillClose:"mac:WindowWillClose",WindowWillDeminiaturize:"mac:WindowWillDeminiaturize",WindowWillEnterFullScreen:"mac:WindowWillEnterFullScreen",WindowWillEnterVersionBrowser:"mac:WindowWillEnterVersionBrowser",WindowWillExitFullScreen:"mac:WindowWillExitFullScreen",WindowWillExitVersionBrowser:"mac:WindowWillExitVersionBrowser",WindowWillFocus:"mac:WindowWillFocus",WindowWillMiniaturize:"mac:WindowWillMiniaturize",WindowWillMove:"mac:WindowWillMove",WindowWillOrderOffScreen:"mac:WindowWillOrderOffScreen",WindowWillOrderOnScreen:"mac:WindowWillOrderOnScreen",WindowWillResignMain:"mac:WindowWillResignMain",WindowWillResize:"mac:WindowWillResize",WindowWillUnfocus:"mac:WindowWillUnfocus",WindowWillUpdate:"mac:WindowWillUpdate",WindowWillUpdateAlpha:"mac:WindowWillUpdateAlpha",WindowWillUpdateCollectionBehavior:"mac:WindowWillUpdateCollectionBehavior",WindowWillUpdateCollectionProperties:"mac:WindowWillUpdateCollectionProperties",WindowWillUpdateShadow:"mac:WindowWillUpdateShadow",WindowWillUpdateTitle:"mac:WindowWillUpdateTitle",WindowWillUpdateToolbar:"mac:WindowWillUpdateToolbar",WindowWillUpdateVisibility:"mac:WindowWillUpdateVisibility",WindowWillUseStandardFrame:"mac:WindowWillUseStandardFrame",WindowZoomIn:"mac:WindowZoomIn",WindowZoomOut:"mac:WindowZoomOut",WindowZoomReset:"mac:WindowZoomReset"}),Linux:Object.freeze({ApplicationStartup:"linux:ApplicationStartup",SystemThemeChanged:"linux:SystemThemeChanged",WindowDeleteEvent:"linux:WindowDeleteEvent",WindowDidMove:"linux:WindowDidMove",WindowDidResize:"linux:WindowDidResize",WindowFocusIn:"linux:WindowFocusIn",WindowFocusOut:"linux:WindowFocusOut",WindowLoadChanged:"linux:WindowLoadChanged"}),Common:Object.freeze({ApplicationOpenedWithFile:"common:ApplicationOpenedWithFile",ApplicationStarted:"common:ApplicationStarted",ThemeChanged:"common:ThemeChanged",WindowClosing:"common:WindowClosing",WindowDidMove:"common:WindowDidMove",WindowDidResize:"common:WindowDidResize",WindowDPIChanged:"common:WindowDPIChanged",WindowFilesDropped:"common:WindowFilesDropped",WindowFocus:"common:WindowFocus",WindowFullscreen:"common:WindowFullscreen",WindowHide:"common:WindowHide",WindowLostFocus:"common:WindowLostFocus",WindowMaximise:"common:WindowMaximise",WindowMinimise:"common:WindowMinimise",WindowRestore:"common:WindowRestore",WindowRuntimeReady:"common:WindowRuntimeReady",WindowShow:"common:WindowShow",WindowUnFullscreen:"common:WindowUnFullscreen",WindowUnMaximise:"common:WindowUnMaximise",WindowUnMinimise:"common:WindowUnMinimise",WindowZoom:"common:WindowZoom",WindowZoomIn:"common:WindowZoomIn",WindowZoomOut:"common:WindowZoomOut",WindowZoomReset:"common:WindowZoomReset"})});window._wails=window._wails||{};window._wails.dispatchWailsEvent=kn;var En=m(d.Events),On=0,T=class{constructor(e,i=null){this.name=e,this.data=i}};function kn(n){let e=f.get(n.name);if(!e)return;let i=new T(n.name,n.data);"sender"in n&&(i.sender=n.sender),e=e.filter(o=>!o.dispatch(i)),e.length===0?f.delete(n.name):f.set(n.name,e)}function ne(n,e,i){let o=f.get(n)||[],t=new H(n,e,i);return o.push(t),f.set(n,o),()=>Ue(t)}function Fn(n,e){return ne(n,e,-1)}function Ln(n,e){return ne(n,e,1)}function Un(...n){n.forEach(e=>f.delete(e))}function In(){f.clear()}function ie(n){return En(On,n)}function ze(){return new MouseEvent("mousedown").buttons===0}function je(){if(!EventTarget||!AbortSignal||!AbortController)return!1;let n=!0,e=new EventTarget,i=new AbortController;return e.addEventListener("test",()=>{n=!1},{signal:i.signal}),i.abort(),e.dispatchEvent(new CustomEvent("test")),n}var Be=!1;document.addEventListener("DOMContentLoaded",()=>{Be=!0});function He(n){Be||document.readyState==="complete"?n():document.addEventListener("DOMContentLoaded",n)}var zn=0,jn=1,Bn=2,Hn=3,Nn=4,Zn=5,Vn=6,Kn=7,Gn=8,Yn=9,Xn=10,Jn=11,Qn=12,qn=13,_n=14,$n=15,ei=16,ni=17,ii=18,oi=19,ti=20,ri=21,si=22,li=23,ai=24,ci=25,di=26,mi=27,ui=28,wi=29,pi=30,fi=31,gi=32,hi=33,Wi=34,bi=35,yi=36,vi=37,Ci=38,Pi=39,Di=40,Mi=41,Si=42,Ti=43,xi=44,Ri=45,Ai=46,Ei=47,r=Symbol("caller");r;var N=class N{constructor(e=""){this[r]=m(d.Window,e);for(let i of Object.getOwnPropertyNames(N.prototype))i!=="constructor"&&typeof this[i]=="function"&&(this[i]=this[i].bind(this))}Get(e){return new N(e)}Position(){return this[r](zn)}Center(){return this[r](jn)}Close(){return this[r](Bn)}DisableSizeConstraints(){return this[r](Hn)}EnableSizeConstraints(){return this[r](Nn)}Focus(){return this[r](Zn)}ForceReload(){return this[r](Vn)}Fullscreen(){return this[r](Kn)}GetScreen(){return this[r](Gn)}GetZoom(){return this[r](Yn)}Height(){return this[r](Xn)}Hide(){return this[r](Jn)}IsFocused(){return this[r](Qn)}IsFullscreen(){return this[r](qn)}IsMaximised(){return this[r](_n)}IsMinimised(){return this[r]($n)}Maximise(){return this[r](ei)}Minimise(){return this[r](ni)}Name(){return this[r](ii)}OpenDevTools(){return this[r](oi)}RelativePosition(){return this[r](ti)}Reload(){return this[r](ri)}Resizable(){return this[r](si)}Restore(){return this[r](li)}SetPosition(e,i){return this[r](ai,{x:e,y:i})}SetAlwaysOnTop(e){return this[r](ci,{alwaysOnTop:e})}SetBackgroundColour(e,i,o,t){return this[r](di,{r:e,g:i,b:o,a:t})}SetFrameless(e){return this[r](mi,{frameless:e})}SetFullscreenButtonEnabled(e){return this[r](ui,{enabled:e})}SetMaxSize(e,i){return this[r](wi,{width:e,height:i})}SetMinSize(e,i){return this[r](pi,{width:e,height:i})}SetRelativePosition(e,i){return this[r](fi,{x:e,y:i})}SetResizable(e){return this[r](gi,{resizable:e})}SetSize(e,i){return this[r](hi,{width:e,height:i})}SetTitle(e){return this[r](Wi,{title:e})}SetZoom(e){return this[r](bi,{zoom:e})}Show(){return this[r](yi)}Size(){return this[r](vi)}ToggleFullscreen(){return this[r](Ci)}ToggleMaximise(){return this[r](Pi)}UnFullscreen(){return this[r](Di)}UnMaximise(){return this[r](Mi)}UnMinimise(){return this[r](Si)}Width(){return this[r](Ti)}Zoom(){return this[r](xi)}ZoomIn(){return this[r](Ri)}ZoomOut(){return this[r](Ai)}ZoomReset(){return this[r](Ei)}},te=N,Oi=new te(""),Z=Oi;function ki(n,e=null){ie(new T(n,e))}function Fi(n,e){let i=Z.Get(n),o=i[e];if(typeof o=="function")try{o.call(i)}catch(t){}}function Ne(n){let e=n.currentTarget;function i(t="Yes"){if(t!=="Yes")return;let s=e.getAttribute("wml-event")||e.getAttribute("data-wml-event"),l=e.getAttribute("wml-target-window")||e.getAttribute("data-wml-target-window")||"",c=e.getAttribute("wml-window")||e.getAttribute("data-wml-window"),a=e.getAttribute("wml-openurl")||e.getAttribute("data-wml-openurl");s!==null&&ki(s),c!==null&&Fi(l,c),a!==null&&q(a)}let o=e.getAttribute("wml-confirm")||e.getAttribute("data-wml-confirm");o?$({Title:"Confirm",Message:o,Detached:!1,Buttons:[{Label:"Yes"},{Label:"No",IsDefault:!0}]}).then(i):i()}var I=Symbol("controller"),x=Symbol("triggerMap"),W=Symbol("elementCount");I;var re=class{constructor(){this[I]=new AbortController}set(e,i){return{signal:this[I].signal}}reset(){this[I].abort(),this[I]=new AbortController}};x,W;var se=class{constructor(){this[x]=new WeakMap,this[W]=0}set(e,i){return this[x].has(e)||this[W]++,this[x].set(e,i),{}}reset(){if(!(this[W]<=0)){for(let e of document.body.querySelectorAll("*")){if(this[W]<=0)break;let i=this[x].get(e);i!=null&&this[W]--;for(let o of i||[])e.removeEventListener(o,Ne)}this[x]=new WeakMap,this[W]=0}}},Ze=je()?new re:new se;function Li(n){let e=/\S+/g,i=n.getAttribute("wml-trigger")||n.getAttribute("data-wml-trigger")||"click",o=[],t;for(;(t=e.exec(i))!==null;)o.push(t[0]);let s=Ze.set(n,o);for(let l of o)n.addEventListener(l,Ne,s)}function le(){He(Ve)}function Ve(){Ze.reset(),document.body.querySelectorAll("[wml-event], [wml-window], [wml-openurl], [data-wml-event], [data-wml-window], [data-wml-openurl]").forEach(Li)}window.wails=ce;le();var we={};w(we,{Capabilities:()=>ji,Environment:()=>Bi,IsAMD64:()=>Zi,IsARM:()=>Vi,IsARM64:()=>Ki,IsDarkMode:()=>zi,IsDebug:()=>ue,IsLinux:()=>Hi,IsMac:()=>Ni,IsWindows:()=>me,invoke:()=>b});var Ke=m(d.System),Ui=0,Ii=1,de=function(){var n,e,i,o,t;try{if((e=(n=window.chrome)==null?void 0:n.webview)!=null&&e.postMessage)return window.chrome.webview.postMessage.bind(window.chrome.webview);if((t=(o=(i=window.webkit)==null?void 0:i.messageHandlers)==null?void 0:o.external)!=null&&t.postMessage)return window.webkit.messageHandlers.external.postMessage.bind(window.webkit.messageHandlers.external)}catch(s){}return null}();function b(n){return de==null?void 0:de(n)}function zi(){return Ke(Ui)}function ji(){return D(this,null,function*(){let n=yield fetch("/wails/capabilities");if(n.ok)return n.json();throw new Error("could not fetch capabilities: "+n.statusText)})}function Bi(){return Ke(Ii)}function me(){return window._wails.environment.OS==="windows"}function Hi(){return window._wails.environment.OS==="linux"}function Ni(){return window._wails.environment.OS==="darwin"}function Zi(){return window._wails.environment.Arch==="amd64"}function Vi(){return window._wails.environment.Arch==="arm"}function Ki(){return window._wails.environment.Arch==="arm64"}function ue(){return!!window._wails.environment.Debug}window.addEventListener("contextmenu",Ji);var Gi=m(d.ContextMenu),Yi=0;function Xi(n,e,i,o){Gi(Yi,{id:n,x:e,y:i,data:o})}function Ji(n){var o;let e;n.target instanceof HTMLElement?e=n.target:!(n.target instanceof HTMLElement)&&n.target instanceof Node?e=(o=n.target.parentElement)!=null?o:document.body:e=document.body;let i=window.getComputedStyle(e).getPropertyValue("--custom-contextmenu").trim();if(i){n.preventDefault();let t=window.getComputedStyle(e).getPropertyValue("--custom-contextmenu-data");Xi(i,n.clientX,n.clientY,t);return}Qi(n)}function Qi(n){var i;if(ue())return;let e;switch(n.target instanceof HTMLElement?e=n.target:!(n.target instanceof HTMLElement)&&n.target instanceof Node?e=(i=n.target.parentElement)!=null?i:document.body:e=document.body,window.getComputedStyle(e).getPropertyValue("--default-contextmenu").trim()){case"show":return;case"hide":n.preventDefault();return;default:if(e.isContentEditable)return;let o=window.getSelection(),t=o&&o.toString().length>0;if(t)for(let s=0;sz});function z(n){try{return window._wails.flags[n]}catch(e){throw new Error("Unable to retrieve flag '"+n+"': "+e,{cause:e})}}var R=!1,B=!1,fe=!1,y=!1,C=!1,v="",Ge="auto",j=0,Ye=ze();window._wails=window._wails||{};window._wails.setResizable=n=>{fe=n,fe||(y=C=!1,p())};window.addEventListener("mousedown",qi,{capture:!0});window.addEventListener("mousemove",eo,{capture:!0});window.addEventListener("mouseup",_i,{capture:!0});for(let n of["click","contextmenu","dblclick","pointerdown","pointerup"])window.addEventListener(n,V,{capture:!0});function V(n){(B||C)&&(n.stopImmediatePropagation(),n.stopPropagation(),n.preventDefault())}function qi(n){var t;if(j=Ye?n.buttons:j|1<to,Quit:()=>so,Show:()=>ro});var ge=m(d.Application),no=0,io=1,oo=2;function to(){return ge(no)}function ro(){return ge(io)}function so(){return ge(oo)}var Me={};w(Me,{ByID:()=>Ro,ByName:()=>xo,Call:()=>De,RuntimeError:()=>X});var Je=Function.prototype.toString,A=typeof Reflect=="object"&&Reflect!==null&&Reflect.apply,We,K;if(typeof A=="function"&&typeof Object.defineProperty=="function")try{We=Object.defineProperty({},"length",{get:function(){throw K}}),K={},A(function(){throw 42},null,We)}catch(n){n!==K&&(A=null)}else A=null;var lo=/^\s*class\b/,ye=function(e){try{var i=Je.call(e);return lo.test(i)}catch(o){return!1}},be=function(e){try{return ye(e)?!1:(Je.call(e),!0)}catch(i){return!1}},G=Object.prototype.toString,ao="[object Object]",co="[object Function]",mo="[object GeneratorFunction]",uo="[object HTMLAllCollection]",wo="[object HTML document.all class]",po="[object HTMLCollection]",fo=typeof Symbol=="function"&&!!Symbol.toStringTag,go=!(0 in[,]),ve=function(){return!1};typeof document=="object"&&(Xe=document.all,G.call(Xe)===G.call(document.all)&&(ve=function(e){if((go||!e)&&(typeof e=="undefined"||typeof e=="object"))try{var i=G.call(e);return(i===uo||i===wo||i===po||i===ao)&&e("")==null}catch(o){}return!1}));var Xe;function ho(n){if(ve(n))return!0;if(!n||typeof n!="function"&&typeof n!="object")return!1;try{A(n,null,We)}catch(e){if(e!==K)return!1}return!ye(n)&&be(n)}function Wo(n){if(ve(n))return!0;if(!n||typeof n!="function"&&typeof n!="object")return!1;if(fo)return be(n);if(ye(n))return!1;var e=G.call(n);return e!==co&&e!==mo&&!/^\[object HTML/.test(e)?!1:be(n)}var h=A?ho:Wo;var O=class extends Error{constructor(e,i){super(e,i),this.name="CancelError"}},k=class extends Error{constructor(e,i,o){super((o!=null?o:"Unhandled rejection in cancelled promise.")+" Reason: "+bo(i),{cause:i}),this.promise=e,this.name="CancelledRejectionError"}},g=Symbol("barrier"),Ce=Symbol("cancelImpl"),$e,Qe=($e=Symbol.species)!=null?$e:Symbol("speciesPolyfill"),F=class n extends Promise{constructor(e,i){let o,t;if(super((a,u)=>{o=a,t=u}),this.constructor[Qe]!==Promise)throw new TypeError("CancellablePromise does not support transparent subclassing. Please refrain from overriding the [Symbol.species] static property.");let s={promise:this,resolve:o,reject:t,get oncancelled(){return i!=null?i:null},set oncancelled(a){i=a!=null?a:void 0}},l={get root(){return l},resolving:!1,settled:!1};Object.defineProperties(this,{[g]:{configurable:!1,enumerable:!1,writable:!0,value:null},[Ce]:{configurable:!1,enumerable:!1,writable:!1,value:en(s,l)}});let c=on(s,l);try{e(nn(s,l),c)}catch(a){l.resolving||c(a)}}cancel(e){return new n(i=>{Promise.allSettled([this[Ce](new O("Promise cancelled.",{cause:e})),yo(this)]).then(()=>i(),()=>i())})}cancelOn(e){return e.aborted?this.cancel(e.reason):e.addEventListener("abort",()=>void this.cancel(e.reason),{capture:!0}),this}then(e,i,o){if(!(this instanceof n))throw new TypeError("CancellablePromise.prototype.then called on an invalid object.");if(h(e)||(e=qe),h(i)||(i=_e),e===qe&&i==_e)return new n(s=>s(this));let t={};return this[g]=t,new n((s,l)=>{Pe.call(this,c=>{var a;this[g]===t&&(this[g]=null),(a=t.resolve)==null||a.call(t);try{s(e(c))}catch(u){l(u)}},c=>{var a;this[g]===t&&(this[g]=null),(a=t.resolve)==null||a.call(t);try{s(i(c))}catch(u){l(u)}})},s=>D(this,null,function*(){try{return o==null?void 0:o(s)}finally{yield this.cancel(s)}}))}catch(e,i){return this.then(void 0,e,i)}finally(e,i){if(!(this instanceof n))throw new TypeError("CancellablePromise.prototype.finally called on an invalid object.");return h(e)?this.then(o=>n.resolve(e()).then(()=>o),o=>n.resolve(e()).then(()=>{throw o}),i):this.then(e,e,i)}static get[(g,Ce,Qe)](){return Promise}static all(e){let i=Array.from(e);return i.length===0?n.resolve(i):new n((o,t)=>{Promise.all(i).then(o,t)},Y(i))}static allSettled(e){let i=Array.from(e);return i.length===0?n.resolve(i):new n((o,t)=>{Promise.allSettled(i).then(o,t)},Y(i))}static any(e){let i=Array.from(e);return i.length===0?n.resolve(i):new n((o,t)=>{Promise.any(i).then(o,t)},Y(i))}static race(e){let i=Array.from(e);return new n((o,t)=>{Promise.race(i).then(o,t)},Y(i))}static cancel(e){let i=new n(()=>{});return i.cancel(e),i}static timeout(e,i){let o=new n(()=>{});return AbortSignal&&typeof AbortSignal=="function"&&AbortSignal.timeout&&typeof AbortSignal.timeout=="function"?AbortSignal.timeout(e).addEventListener("abort",()=>void o.cancel(i)):setTimeout(()=>void o.cancel(i),e),o}static sleep(e,i){return new n(o=>{setTimeout(()=>o(i),e)})}static reject(e){return new n((i,o)=>o(e))}static resolve(e){return e instanceof n?e:new n(i=>i(e))}static withResolvers(){let e={oncancelled:null};return e.promise=new n((i,o)=>{e.resolve=i,e.reject=o},i=>{var o;(o=e.oncancelled)==null||o.call(e,i)}),e}};function en(n,e){let i;return o=>{if(e.settled||(e.settled=!0,e.reason=o,n.reject(o),Pe.call(n.promise,void 0,t=>{if(t!==o)throw t})),!(!e.reason||!n.oncancelled))return i=new Promise(t=>{try{t(n.oncancelled(e.reason.cause))}catch(s){Promise.reject(new k(n.promise,s,"Unhandled exception in oncancelled callback."))}}),i.then(void 0,t=>{throw new k(n.promise,t,"Unhandled rejection in oncancelled callback.")}),n.oncancelled=null,i}}function nn(n,e){return i=>{if(!e.resolving){if(e.resolving=!0,i===n.promise){if(e.settled)return;e.settled=!0,n.reject(new TypeError("A promise cannot be resolved with itself."));return}if(i!=null&&(typeof i=="object"||typeof i=="function")){let o;try{o=i.then}catch(t){e.settled=!0,n.reject(t);return}if(h(o)){try{let l=i.cancel;if(h(l)){let c=a=>{Reflect.apply(l,i,[a])};e.reason?en(Fe(ke({},n),{oncancelled:c}),e)(e.reason):n.oncancelled=c}}catch(l){}let t={root:e.root,resolving:!1,get settled(){return this.root.settled},set settled(l){this.root.settled=l},get reason(){return this.root.reason}},s=on(n,t);try{Reflect.apply(o,i,[nn(n,t),s])}catch(l){s(l)}return}}e.settled||(e.settled=!0,n.resolve(i))}}}function on(n,e){return i=>{if(!e.resolving)if(e.resolving=!0,e.settled){try{if(i instanceof O&&e.reason instanceof O&&Object.is(i.cause,e.reason.cause))return}catch(o){}Promise.reject(new k(n.promise,i))}else e.settled=!0,n.reject(i)}}function Y(n){return e=>{for(let i of n)try{if(h(i.then)){let o=i.cancel;h(o)&&Reflect.apply(o,i,[e])}}catch(o){}}}function qe(n){return n}function _e(n){throw n}function bo(n){try{if(n instanceof Error||typeof n!="object"||n.toString!==Object.prototype.toString)return""+n}catch(e){}try{return JSON.stringify(n)}catch(e){}try{return Object.prototype.toString.call(n)}catch(e){}return""}function yo(n){var i;let e=(i=n[g])!=null?i:{};return"promise"in e||Object.assign(e,E()),n[g]==null&&(e.resolve(),n[g]=e),e.promise}var Pe=Promise.prototype.then;Promise.prototype.then=function(...n){return this instanceof F?this.then(...n):Reflect.apply(Pe,this,n)};var E=Promise.withResolvers;E&&typeof E=="function"?E=E.bind(Promise):E=function(){let n,e;return{promise:new Promise((o,t)=>{n=o,e=t}),resolve:n,reject:e}};window._wails=window._wails||{};window._wails.callResultHandler=Mo;window._wails.callErrorHandler=So;var vo=m(d.Call),Co=m(d.CancelCall),L=new Map,Po=0,Do=0,X=class extends Error{constructor(e,i){super(e,i),this.name="RuntimeError"}};function Mo(n,e,i){let o=tn(n);if(o)if(!e)o.resolve(void 0);else if(!i)o.resolve(e);else try{o.resolve(JSON.parse(e))}catch(t){o.reject(new TypeError("could not parse result: "+t.message,{cause:t}))}}function So(n,e,i){let o=tn(n);if(o)if(!i)o.reject(new Error(e));else{let t;try{t=JSON.parse(e)}catch(c){o.reject(new TypeError("could not parse error: "+c.message,{cause:c}));return}let s={};t.cause&&(s.cause=t.cause);let l;switch(t.kind){case"ReferenceError":l=new ReferenceError(t.message,s);break;case"TypeError":l=new TypeError(t.message,s);break;case"RuntimeError":l=new X(t.message,s);break;default:l=new Error(t.message,s);break}o.reject(l)}}function tn(n){let e=L.get(n);return L.delete(n),e}function To(){let n;do n=M();while(L.has(n));return n}function De(n){let e=To(),i=F.withResolvers();L.set(e,{resolve:i.resolve,reject:i.reject});let o=vo(Po,Object.assign({"call-id":e},n)),t=!1;o.then(()=>{t=!0},l=>{L.delete(e),i.reject(l)});let s=()=>(L.delete(e),Co(Do,{"call-id":e}).catch(l=>{}));return i.oncancelled=()=>t?s():o.then(s),i.promise}function xo(n,...e){return De({methodName:n,args:e})}function Ro(n,...e){return De({methodID:n,args:e})}var Se={};w(Se,{SetText:()=>Oo,Text:()=>ko});var rn=m(d.Clipboard),Ao=0,Eo=1;function Oo(n){return rn(Ao,{text:n})}function ko(){return rn(Eo)}var Te={};w(Te,{Any:()=>P,Array:()=>Lo,ByteSlice:()=>Fo,Map:()=>Uo,Nullable:()=>Io,Struct:()=>zo});function P(n){return n}function Fo(n){return n==null?"":n}function Lo(n){return n===P?e=>e===null?[]:e:e=>{if(e===null)return[];for(let i=0;ii===null?{}:i:i=>{if(i===null)return{};for(let o in i)i[o]=e(i[o]);return i}}function Io(n){return n===P?P:e=>e===null?null:n(e)}function zo(n){let e=!0;for(let i in n)if(n[i]!==P){e=!1;break}return e?P:i=>{for(let o in n)o in i&&(i[o]=n[o](i[o]));return i}}var Re={};w(Re,{GetAll:()=>No,GetCurrent:()=>Vo,GetPrimary:()=>Zo});var xe=m(d.Screens),jo=0,Bo=1,Ho=2;function No(){return xe(jo)}function Zo(){return xe(Bo)}function Vo(){return xe(Ho)}window._wails=window._wails||{};window._wails.invoke=b;b("wails:runtime:ready");export{he as Application,_ as Browser,Me as Call,O as CancelError,F as CancellablePromise,k as CancelledRejectionError,Se as Clipboard,Te as Create,ee as Dialogs,oe as Events,pe as Flags,Re as Screens,we as System,ae as WML,Z as Window}; diff --git a/v3/internal/runtime/.gitignore b/v3/internal/runtime/.gitignore index cdd93f315..b91601cbd 100644 --- a/v3/internal/runtime/.gitignore +++ b/v3/internal/runtime/.gitignore @@ -1,2 +1,3 @@ node_modules -.task \ No newline at end of file +.task +*.tsbuildinfo diff --git a/v3/internal/runtime/Taskfile.yaml b/v3/internal/runtime/Taskfile.yaml index 1e5323ea7..d343bcf4f 100644 --- a/v3/internal/runtime/Taskfile.yaml +++ b/v3/internal/runtime/Taskfile.yaml @@ -11,25 +11,29 @@ tasks: cmds: - npm install + check: + dir: desktop/@wailsio/runtime + deps: + - install-deps + cmds: + - npm run check + test: dir: desktop/@wailsio/runtime + deps: + - install-deps cmds: - - npx vitest run - - update: - dir: desktop/@wailsio/runtime - cmds: - - npx npm-check-updates -u + - npm test build:debug: internal: true cmds: - - npx esbuild@latest desktop/@wailsio/runtime/src/index.js --inject:desktop/compiled/main.js --format=esm --bundle --tree-shaking=true --sourcemap=inline --outfile=../assetserver/bundledassets/runtime.debug.js --define:DEBUG=true + - npx esbuild@latest desktop/@wailsio/runtime/src/index.ts --inject:desktop/compiled/main.js --format=esm --target=es2015 --bundle --ignore-annotations --tree-shaking=true --sourcemap=inline --outfile=../assetserver/bundledassets/runtime.debug.js --define:DEBUG=true build:production: internal: true cmds: - - npx esbuild@latest desktop/@wailsio/runtime/src/index.js --inject:desktop/compiled/main.js --format=esm --bundle --tree-shaking=true --minify --outfile=../assetserver/bundledassets/runtime.js --define:DEBUG=false --drop:console + - npx esbuild@latest desktop/@wailsio/runtime/src/index.ts --inject:desktop/compiled/main.js --format=esm --target=es2015 --bundle --ignore-annotations --tree-shaking=true --minify --outfile=../assetserver/bundledassets/runtime.js --define:DEBUG=false --drop:console build:all: internal: true diff --git a/v3/internal/runtime/desktop/README.md b/v3/internal/runtime/desktop/README.md index 3da6938c4..0ca8ed53e 100644 --- a/v3/internal/runtime/desktop/README.md +++ b/v3/internal/runtime/desktop/README.md @@ -1,8 +1,10 @@ # README -The `main.js` file in this directory is the entrypoint for the `runtime.js` file that may be +The `index.js` file in the `compiled` directory is the entrypoint for the `runtime.js` file that may be loaded at runtime. This will add `window.wails` and `window._wails` to the global scope. NOTE: It is preferable to use the `@wailsio/runtime` package to use the runtime. -After updating any files in this directory, you must run `wails3 task build:runtime` to regenerate the compiled JS. \ No newline at end of file +⚠️ Do not rebuild the runtime manually after updating TS code: +the CI pipeline will take care of this. +PRs that touch build artifacts will be blocked from merging. \ No newline at end of file diff --git a/v3/internal/runtime/desktop/compiled/main.js b/v3/internal/runtime/desktop/compiled/main.js index ad35cbeea..d2b21dca1 100644 --- a/v3/internal/runtime/desktop/compiled/main.js +++ b/v3/internal/runtime/desktop/compiled/main.js @@ -11,8 +11,8 @@ The electron alternative for Go import * as Runtime from "../@wailsio/runtime/src"; // NOTE: the following methods MUST be imported explicitly because of how esbuild injection works -import {Enable as EnableWML} from "../@wailsio/runtime/src/wml"; -import {debugLog} from "../@wailsio/runtime/src/utils"; +import { Enable as EnableWML } from "../@wailsio/runtime/src/wml"; +import { debugLog } from "../@wailsio/runtime/src/utils"; window.wails = Runtime; EnableWML(); diff --git a/v3/internal/runtime/vite.config.ts b/v3/internal/runtime/vite.config.ts deleted file mode 100644 index eb0831c65..000000000 --- a/v3/internal/runtime/vite.config.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { defineConfig } from 'vitest/config' - -export default defineConfig({ - test: { - environment: 'happy-dom', - }, -}) \ No newline at end of file From 14fb7ed4f7b22c480f9ad128f9fd3a4a1abed6b2 Mon Sep 17 00:00:00 2001 From: Fabio Massaioli Date: Tue, 25 Feb 2025 03:32:51 +0100 Subject: [PATCH 046/374] Update binding generator to new internal API --- v3/internal/generator/render/create.go | 30 +++++++---- v3/internal/generator/render/info.go | 4 ++ .../generator/render/templates/models.js.tmpl | 2 +- .../generator/render/templates/models.ts.tmpl | 2 +- .../render/templates/service.js.tmpl | 22 ++++---- .../render/templates/service.ts.tmpl | 24 ++++----- v3/internal/generator/testdata/tsconfig.json | 51 +++++++++++-------- 7 files changed, 75 insertions(+), 60 deletions(-) diff --git a/v3/internal/generator/render/create.go b/v3/internal/generator/render/create.go index 8a7880390..1332345d1 100644 --- a/v3/internal/generator/render/create.go +++ b/v3/internal/generator/render/create.go @@ -213,17 +213,22 @@ func (m *module) PostponedCreates() []string { m.postponedCreates.Iterate(func(key types.Type, value any) { pp := value.(*postponed) - pre := "" + pre, post := "", "" if pp.params != "" { - pre = pp.params + " => " + if m.TS { + pre = createParamRegex.ReplaceAllString(pp.params, "${0}: any") + " => " + } else { + pre = "/** @type {(...args: any[]) => any} */(" + pp.params + " => " + post = ")" + } } switch t := key.(type) { case *types.Array, *types.Slice: - result[pp.index] = fmt.Sprintf("%s$Create.Array(%s)", pre, m.JSCreateWithParams(t.(interface{ Elem() types.Type }).Elem(), pp.params)) + result[pp.index] = fmt.Sprintf("%s$Create.Array(%s)%s", pre, m.JSCreateWithParams(t.(interface{ Elem() types.Type }).Elem(), pp.params), post) case *types.Map: - result[pp.index] = fmt.Sprintf("%s$Create.Map($Create.Any, %s)", pre, m.JSCreateWithParams(t.Elem(), pp.params)) + result[pp.index] = fmt.Sprintf("%s$Create.Map($Create.Any, %s)%s", pre, m.JSCreateWithParams(t.Elem(), pp.params), post) case *types.Named: if !collect.IsClass(key) { @@ -231,23 +236,24 @@ func (m *module) PostponedCreates() []string { // require an indirect assignment to break cycles. // Typescript cannot infer the return type on its own: add hints. - cast, returnType := "", "" + cast, argType, returnType := "", "", "" if m.TS { + argType = ": any[]" returnType = ": any" } else { cast = "/** @type {(...args: any[]) => any} */" } result[pp.index] = fmt.Sprintf(` -%s(function $$initCreateType%d(...args)%s { +%s(function $$initCreateType%d(...args%s)%s { if ($$createType%d === $$initCreateType%d) { - $$createType%d = %s%s; + $$createType%d = %s%s%s; } return $$createType%d(...args); })`, - cast, pp.index, returnType, + cast, pp.index, argType, returnType, pp.index, pp.index, - pp.index, pre, m.JSCreateWithParams(t.Underlying(), pp.params), + pp.index, pre, m.JSCreateWithParams(t.Underlying(), pp.params), post, pp.index, )[1:] // Remove initial newline. @@ -280,11 +286,12 @@ func (m *module) PostponedCreates() []string { } builder.WriteString(")") } + builder.WriteString(post) result[pp.index] = builder.String() case *types.Pointer: - result[pp.index] = fmt.Sprintf("%s$Create.Nullable(%s)", pre, m.JSCreateWithParams(t.Elem(), pp.params)) + result[pp.index] = fmt.Sprintf("%s$Create.Nullable(%s)%s", pre, m.JSCreateWithParams(t.Elem(), pp.params), post) case *types.Struct: info := m.collector.Struct(t) @@ -311,11 +318,12 @@ func (m *module) PostponedCreates() []string { builder.WriteRune('\n') } builder.WriteString("})") + builder.WriteString(post) result[pp.index] = builder.String() default: - result[pp.index] = pre + "$Create.Any" + result[pp.index] = pre + "$Create.Any" + post } }) diff --git a/v3/internal/generator/render/info.go b/v3/internal/generator/render/info.go index 7cd95a3f6..b3305e3f8 100644 --- a/v3/internal/generator/render/info.go +++ b/v3/internal/generator/render/info.go @@ -1,6 +1,7 @@ package render import ( + "regexp" "strings" "github.com/wailsapp/wails/v3/internal/generator/collect" @@ -26,6 +27,9 @@ type modelInfo struct { } } +// createParamRegex must match type parameter creation strings as generated by [modelinfo]. +var createParamRegex = regexp.MustCompile(`\$\$createParam[^\s,)]*`) + // modelinfo gathers and returns useful information about the given model. func modelinfo(model *collect.ModelInfo, useInterfaces bool) (info modelInfo) { info.HasValues = len(model.Values) > 0 diff --git a/v3/internal/generator/render/templates/models.js.tmpl b/v3/internal/generator/render/templates/models.js.tmpl index 4d12429d0..5fe0db83c 100644 --- a/v3/internal/generator/render/templates/models.js.tmpl +++ b/v3/internal/generator/render/templates/models.js.tmpl @@ -9,7 +9,7 @@ {{if not $useInterfaces}} // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "{{js $runtime}}"; +import { Create as $Create } from "{{js $runtime}}"; {{end -}} {{range $imports.External}} // eslint-disable-next-line @typescript-eslint/ban-ts-comment diff --git a/v3/internal/generator/render/templates/models.ts.tmpl b/v3/internal/generator/render/templates/models.ts.tmpl index e82e7311a..d5ec2a971 100644 --- a/v3/internal/generator/render/templates/models.ts.tmpl +++ b/v3/internal/generator/render/templates/models.ts.tmpl @@ -8,7 +8,7 @@ {{if not $useInterfaces}} // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "{{js $runtime}}"; +import { Create as $Create } from "{{js $runtime}}"; {{end -}} {{range $imports.External}} // eslint-disable-next-line @typescript-eslint/ban-ts-comment diff --git a/v3/internal/generator/render/templates/service.js.tmpl b/v3/internal/generator/render/templates/service.js.tmpl index bde8ad188..f71e055bf 100644 --- a/v3/internal/generator/render/templates/service.js.tmpl +++ b/v3/internal/generator/render/templates/service.js.tmpl @@ -22,7 +22,7 @@ {{end}} // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call{{if not $useInterfaces}}, Create as $Create{{end -}} } from "{{js $runtime}}"; +import { Call as $Call, CancellablePromise as $CancellablePromise{{if not $useInterfaces}}, Create as $Create{{end}} } from "{{js $runtime}}"; {{range $imports.External}} // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -46,7 +46,7 @@ import * as $models from "./{{js $models}}"; {{- range $i, $param := .Params}} * @param { {{- $module.JSType .Type}}{{if .Variadic}}[]{{end -}} } {{jsparam $i .}} {{- end}} - * @returns {Promise< + * @returns {$CancellablePromise< {{- if eq 0 (len .Results) -}} void {{- else if eq 1 (len .Results)}} @@ -56,7 +56,7 @@ import * as $models from "./{{js $models}}"; {{- if gt $i 0}}, {{end}} {{- $module.JSType $result}} {{- end}}] - {{- end}}> & { cancel(): void }} + {{- end}}>} */ {{if not .Internal}}export {{end}}function {{.Name}}({{range $i, $param := .Params -}} {{- if gt $i 0}}, {{end}} @@ -64,14 +64,14 @@ import * as $models from "./{{js $models}}"; {{- jsparam $i .}} {{- end}}) { {{- if $useNames}} - let $resultPromise = /** @type {any} */($Call.ByName("{{js .FQN}}" + return $Call.ByName("{{js .FQN}}" {{- else}} - let $resultPromise = /** @type {any} */($Call.ByID({{.ID}} - {{- end}}{{range $i, $param := .Params}}, {{jsparam $i .}}{{end}})); - {{- if or $useInterfaces (not .Results) ($module.SkipCreate .Results)}} - return $resultPromise; - {{- else}} - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByID({{.ID}} + {{- end}}{{range $i, $param := .Params}}, {{jsparam $i .}}{{end}}) + {{- if or $useInterfaces (not .Results) ($module.SkipCreate .Results) -}} + ; + {{- else -}} + .then(/** @type {($result: any) => any} */(($result) => { {{- if eq 1 (len .Results)}} return {{$module.JSCreate (index .Results 0)}}($result); {{- else}} @@ -83,8 +83,6 @@ import * as $models from "./{{js $models}}"; return $result; {{- end}} })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; {{- end}} } {{end}} diff --git a/v3/internal/generator/render/templates/service.ts.tmpl b/v3/internal/generator/render/templates/service.ts.tmpl index 9a2f0cd31..4db90fe60 100644 --- a/v3/internal/generator/render/templates/service.ts.tmpl +++ b/v3/internal/generator/render/templates/service.ts.tmpl @@ -21,7 +21,7 @@ {{end}} // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call{{if not $useInterfaces}}, Create as $Create{{end -}} } from "{{js $runtime}}"; +import { Call as $Call, CancellablePromise as $CancellablePromise{{if not $useInterfaces}}, Create as $Create{{end}} } from "{{js $runtime}}"; {{range $imports.External}} // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -49,7 +49,7 @@ import * as $models from "./{{js $models}}"; {{- if gt $i 0}}, {{end}} {{- if .Variadic}}...{{end}} {{- jsparam $i .}}: {{$module.JSType .Type}}{{if .Variadic}}[]{{end}} -{{- end}}): Promise< +{{- end}}): $CancellablePromise< {{- if eq 0 (len .Results) -}} void {{- else if eq 1 (len .Results)}} @@ -59,16 +59,16 @@ import * as $models from "./{{js $models}}"; {{- if gt $i 0}}, {{end}} {{- $module.JSType $result}} {{- end}}] - {{- end}}> & { cancel(): void } { + {{- end}}> { {{- if $useNames}} - let $resultPromise = $Call.ByName("{{js .FQN}}" + return $Call.ByName("{{js .FQN}}" {{- else}} - let $resultPromise = $Call.ByID({{.ID}} - {{- end}}{{range $i, $param := .Params}}, {{jsparam $i .}}{{end}}) as any; - {{- if or $useInterfaces (not .Results) ($module.SkipCreate .Results)}} - return $resultPromise; - {{- else}} - let $typingPromise = $resultPromise.then(($result: any) => { + return $Call.ByID({{.ID}} + {{- end}}{{range $i, $param := .Params}}, {{jsparam $i .}}{{end}}) + {{- if or $useInterfaces (not .Results) ($module.SkipCreate .Results) -}} + ; + {{- else -}} + .then(($result: any) => { {{- if eq 1 (len .Results)}} return {{$module.JSCreate (index .Results 0)}}($result); {{- else}} @@ -79,9 +79,7 @@ import * as $models from "./{{js $models}}"; {{- end}}{{end}} return $result; {{- end}} - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); {{- end}} } {{end}} diff --git a/v3/internal/generator/testdata/tsconfig.json b/v3/internal/generator/testdata/tsconfig.json index 8bfb46227..aa4939e6a 100644 --- a/v3/internal/generator/testdata/tsconfig.json +++ b/v3/internal/generator/testdata/tsconfig.json @@ -1,28 +1,35 @@ { - "compilerOptions": { - "allowJs": true, - "noEmit": true, - "skipLibCheck": true, + "include": ["output/**/*.js", "output/**/*.ts"], + "exclude": ["output/**/*.got.?s"], + "references": [ + { "path": "../../runtime/desktop/@wailsio/runtime" } + ], + "compilerOptions": { + "allowJs": true, - "target": "ES6", - "lib": ["ES6", "DOM"], + "noEmit": true, + "skipLibCheck": true, - "module": "ES6", - "moduleResolution": "Node", - "isolatedModules": true, - "esModuleInterop": true, + "target": "ES2015", + "module": "ES2015", + "moduleResolution": "bundler", + "isolatedModules": true, + "verbatimModuleSyntax": true, - "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": false, - "noImplicitAny": false, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": true, + "lib": [ + "DOM", + "ESNext" + ], - "paths": { - "/wails/runtime.js": ["../../runtime/desktop/@wailsio/runtime/types/index.d.ts"] - } - }, - "include": ["output/**/*"], - "exclude": ["output/**/*.got.?s"] + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": false, + "noImplicitAny": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + + "paths": { + "/wails/runtime.js": ["../../runtime/desktop/@wailsio/runtime/src/index.ts"] + } + } } From cdb40455429160904255b264f6e712aa2cb26402 Mon Sep 17 00:00:00 2001 From: Fabio Massaioli Date: Tue, 25 Feb 2025 03:33:15 +0100 Subject: [PATCH 047/374] Update existing examples --- v3/examples/binding/README.md | 4 +-- .../wails/v3/examples/binding/greetservice.js | 19 +++++-------- .../v3/examples/services/hashes/service.js | 7 +++-- .../v3/pkg/services/kvstore/keyvaluestore.js | 22 +++++++-------- .../v3/pkg/services/log/loggerservice.js | 27 ++++++++----------- .../wails/v3/pkg/services/sqlite/service.js | 24 +++++++---------- v3/examples/services/assets/index.html | 8 +++--- v3/examples/wml/assets/index.html | 18 ++++++------- 8 files changed, 53 insertions(+), 76 deletions(-) diff --git a/v3/examples/binding/README.md b/v3/examples/binding/README.md index 9b5d68a7a..37d0f2cc8 100644 --- a/v3/examples/binding/README.md +++ b/v3/examples/binding/README.md @@ -2,10 +2,10 @@ This example demonstrates how to generate bindings for your application. -To generate bindings, run `wails3 generate bindings -b -d assets/bindings` in this directory. +To generate bindings, run `wails3 generate bindings -clean -b -d assets/bindings` in this directory. See more options by running `wails3 generate bindings --help`. ## Notes - The bindings generator is still a work in progress and is subject to change. - - The generated code uses `wails.CallByID` by default. This is the most secure and quickest way to call a function. In a future release, we will look at generating `wails.CallByName` too. + - The generated code uses `wails.CallByID` by default. This is the most robust way to call a function. diff --git a/v3/examples/binding/assets/bindings/github.com/wailsapp/wails/v3/examples/binding/greetservice.js b/v3/examples/binding/assets/bindings/github.com/wailsapp/wails/v3/examples/binding/greetservice.js index 0521b91e8..0e5e40d84 100644 --- a/v3/examples/binding/assets/bindings/github.com/wailsapp/wails/v3/examples/binding/greetservice.js +++ b/v3/examples/binding/assets/bindings/github.com/wailsapp/wails/v3/examples/binding/greetservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import {Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create} from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -18,36 +18,31 @@ import * as data$0 from "./data/models.js"; /** * GetPerson returns a person with the given name. * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function GetPerson(name) { - let $resultPromise = /** @type {any} */($Call.ByID(2952413357, name)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByID(2952413357, name).then(/** @type {($result: any) => any} */(($result) => { return $$createType0($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } /** * Greet greets a person * @param {string} name * @param {number[]} counts - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name, ...counts) { - let $resultPromise = /** @type {any} */($Call.ByID(1411160069, name, counts)); - return $resultPromise; + return $Call.ByID(1411160069, name, counts); } /** * GreetPerson greets a person * @param {data$0.Person} person - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function GreetPerson(person) { - let $resultPromise = /** @type {any} */($Call.ByID(4021313248, person)); - return $resultPromise; + return $Call.ByID(4021313248, person); } // Private type creation functions diff --git a/v3/examples/services/assets/bindings/github.com/wailsapp/wails/v3/examples/services/hashes/service.js b/v3/examples/services/assets/bindings/github.com/wailsapp/wails/v3/examples/services/hashes/service.js index ed4a57d7d..f5c01b306 100644 --- a/v3/examples/services/assets/bindings/github.com/wailsapp/wails/v3/examples/services/hashes/service.js +++ b/v3/examples/services/assets/bindings/github.com/wailsapp/wails/v3/examples/services/hashes/service.js @@ -4,7 +4,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import {Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create} from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -12,9 +12,8 @@ import * as $models from "./models.js"; /** * @param {string} s - * @returns {Promise<$models.Hashes> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Hashes>} */ export function Generate(s) { - let $resultPromise = /** @type {any} */($Call.ByID(1123907498, s)); - return $resultPromise; + return $Call.ByID(1123907498, s); } diff --git a/v3/examples/services/assets/bindings/github.com/wailsapp/wails/v3/pkg/services/kvstore/keyvaluestore.js b/v3/examples/services/assets/bindings/github.com/wailsapp/wails/v3/pkg/services/kvstore/keyvaluestore.js index 26d36cbb6..d575e46f5 100644 --- a/v3/examples/services/assets/bindings/github.com/wailsapp/wails/v3/pkg/services/kvstore/keyvaluestore.js +++ b/v3/examples/services/assets/bindings/github.com/wailsapp/wails/v3/pkg/services/kvstore/keyvaluestore.js @@ -4,44 +4,40 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import {Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create} from "/wails/runtime.js"; /** * Delete deletes the key from the store. If AutoSave is true, the store is saved to disk. * @param {string} key - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Delete(key) { - let $resultPromise = /** @type {any} */($Call.ByID(1029952841, key)); - return $resultPromise; + return $Call.ByID(1029952841, key); } /** * Get returns the value for the given key. If key is empty, the entire store is returned. * @param {string} key - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Get(key) { - let $resultPromise = /** @type {any} */($Call.ByID(3017738442, key)); - return $resultPromise; + return $Call.ByID(3017738442, key); } /** * Save saves the store to disk - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Save() { - let $resultPromise = /** @type {any} */($Call.ByID(840897339)); - return $resultPromise; + return $Call.ByID(840897339); } /** * Set sets the value for the given key. If AutoSave is true, the store is saved to disk. * @param {string} key * @param {any} value - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Set(key, value) { - let $resultPromise = /** @type {any} */($Call.ByID(2329265830, key, value)); - return $resultPromise; + return $Call.ByID(2329265830, key, value); } diff --git a/v3/examples/services/assets/bindings/github.com/wailsapp/wails/v3/pkg/services/log/loggerservice.js b/v3/examples/services/assets/bindings/github.com/wailsapp/wails/v3/pkg/services/log/loggerservice.js index 0ee366a67..b783a9a53 100644 --- a/v3/examples/services/assets/bindings/github.com/wailsapp/wails/v3/pkg/services/log/loggerservice.js +++ b/v3/examples/services/assets/bindings/github.com/wailsapp/wails/v3/pkg/services/log/loggerservice.js @@ -4,7 +4,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import {Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create} from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -13,48 +13,43 @@ import * as slog$0 from "../../../../../../../log/slog/models.js"; /** * @param {string} message * @param {any[]} args - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Debug(message, ...args) { - let $resultPromise = /** @type {any} */($Call.ByID(1384012895, message, args)); - return $resultPromise; + return $Call.ByID(1384012895, message, args); } /** * @param {string} message * @param {any[]} args - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Error(message, ...args) { - let $resultPromise = /** @type {any} */($Call.ByID(1324251502, message, args)); - return $resultPromise; + return $Call.ByID(1324251502, message, args); } /** * @param {string} message * @param {any[]} args - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Info(message, ...args) { - let $resultPromise = /** @type {any} */($Call.ByID(3712350036, message, args)); - return $resultPromise; + return $Call.ByID(3712350036, message, args); } /** * @param {slog$0.Level} level - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function SetLogLevel(level) { - let $resultPromise = /** @type {any} */($Call.ByID(2521579448, level)); - return $resultPromise; + return $Call.ByID(2521579448, level); } /** * @param {string} message * @param {any[]} args - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Warning(message, ...args) { - let $resultPromise = /** @type {any} */($Call.ByID(2902024404, message, args)); - return $resultPromise; + return $Call.ByID(2902024404, message, args); } diff --git a/v3/examples/services/assets/bindings/github.com/wailsapp/wails/v3/pkg/services/sqlite/service.js b/v3/examples/services/assets/bindings/github.com/wailsapp/wails/v3/pkg/services/sqlite/service.js index ddbe76eb4..224fe1139 100644 --- a/v3/examples/services/assets/bindings/github.com/wailsapp/wails/v3/pkg/services/sqlite/service.js +++ b/v3/examples/services/assets/bindings/github.com/wailsapp/wails/v3/pkg/services/sqlite/service.js @@ -4,47 +4,41 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import {Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create} from "/wails/runtime.js"; /** - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Close() { - let $resultPromise = /** @type {any} */($Call.ByID(1888105376)); - return $resultPromise; + return $Call.ByID(1888105376); } /** * @param {string} query * @param {any[]} args - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Execute(query, ...args) { - let $resultPromise = /** @type {any} */($Call.ByID(3811930203, query, args)); - return $resultPromise; + return $Call.ByID(3811930203, query, args); } /** * @param {string} dbPath - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Open(dbPath) { - let $resultPromise = /** @type {any} */($Call.ByID(2012175612, dbPath)); - return $resultPromise; + return $Call.ByID(2012175612, dbPath); } /** * @param {string} query * @param {any[]} args - * @returns {Promise<{ [_: string]: any }[]> & { cancel(): void }} + * @returns {$CancellablePromise<{ [_: string]: any }[]>} */ export function Select(query, ...args) { - let $resultPromise = /** @type {any} */($Call.ByID(2472933124, query, args)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByID(2472933124, query, args).then(/** @type {($result: any) => any} */(($result) => { return $$createType1($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } // Private type creation functions diff --git a/v3/examples/services/assets/index.html b/v3/examples/services/assets/index.html index 67746fdec..930ba1496 100644 --- a/v3/examples/services/assets/index.html +++ b/v3/examples/services/assets/index.html @@ -48,11 +48,7 @@ let results = document.getElementById("sqlresults"); results.innerHTML = ""; if (!isSelect) { - let message = "Query executed successfully"; - if (result.length > 0) { - message += " - " + result; - } - results.innerHTML = message; + results.innerHTML = "Query executed successfully"; return; } if (result.length === 0) { @@ -78,6 +74,8 @@ } results.appendChild(table); }).catch((err) => { + // Log error for debugging + console.error(err); // Put error in results document.getElementById("sqlresults").innerHTML = "

    " + err + "

    "; }); diff --git a/v3/examples/wml/assets/index.html b/v3/examples/wml/assets/index.html index 5895e3d43..466f4c5f0 100644 --- a/v3/examples/wml/assets/index.html +++ b/v3/examples/wml/assets/index.html @@ -136,22 +136,22 @@ src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABAAAAAMrCAYAAADX0eD4AAAFQmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iCiAgICB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iCiAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgZXhpZjpDb2xvclNwYWNlPSIxIgogICBleGlmOlBpeGVsWERpbWVuc2lvbj0iMTAyNCIKICAgZXhpZjpQaXhlbFlEaW1lbnNpb249IjgxMSIKICAgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIKICAgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIgogICB0aWZmOkltYWdlTGVuZ3RoPSI4MTEiCiAgIHRpZmY6SW1hZ2VXaWR0aD0iMTAyNCIKICAgdGlmZjpSZXNvbHV0aW9uVW5pdD0iMiIKICAgdGlmZjpYUmVzb2x1dGlvbj0iNzIvMSIKICAgdGlmZjpZUmVzb2x1dGlvbj0iNzIvMSIKICAgeG1wOk1ldGFkYXRhRGF0ZT0i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"/>
    Alpha
    -

    Documentation

    -

    Feedback

    +

    Documentation

    +

    Feedback

    This application contains no Javascript!

    -

    Emit event

    +

    Emit event

    Delete all the things!

    -

    Close the Window?

    -

    Center

    -

    Minimise

    -

    Maximise

    -

    UnMaximise

    +

    Close the Window?

    +

    Center

    +

    Minimise

    +

    Maximise

    +

    UnMaximise

    Fullscreen

    UnFullscreen

    Restore

    Open Browser?

    -

    Hover over me

    +

    Hover over me

    From 0dfc2b2a5343a7d0c656a34d0a06ec7149637e6e Mon Sep 17 00:00:00 2001 From: Fabio Massaioli Date: Tue, 25 Feb 2025 03:33:24 +0100 Subject: [PATCH 048/374] Add cancellation examples --- v3/examples/cancel-async/GreetService.go | 19 +++ v3/examples/cancel-async/README.md | 5 + .../wails/v3/examples/cancel-async/index.js | 8 ++ .../wails/v3/examples/cancel-async/service.js | 16 +++ v3/examples/cancel-async/assets/index.html | 134 +++++++++++++++++ v3/examples/cancel-async/main.go | 37 +++++ v3/examples/cancel-chaining/GreetService.go | 19 +++ v3/examples/cancel-chaining/README.md | 5 + .../v3/examples/cancel-chaining/index.js | 8 ++ .../v3/examples/cancel-chaining/service.js | 16 +++ v3/examples/cancel-chaining/assets/index.html | 136 ++++++++++++++++++ v3/examples/cancel-chaining/main.go | 37 +++++ 12 files changed, 440 insertions(+) create mode 100644 v3/examples/cancel-async/GreetService.go create mode 100644 v3/examples/cancel-async/README.md create mode 100644 v3/examples/cancel-async/assets/bindings/github.com/wailsapp/wails/v3/examples/cancel-async/index.js create mode 100644 v3/examples/cancel-async/assets/bindings/github.com/wailsapp/wails/v3/examples/cancel-async/service.js create mode 100644 v3/examples/cancel-async/assets/index.html create mode 100644 v3/examples/cancel-async/main.go create mode 100644 v3/examples/cancel-chaining/GreetService.go create mode 100644 v3/examples/cancel-chaining/README.md create mode 100644 v3/examples/cancel-chaining/assets/bindings/github.com/wailsapp/wails/v3/examples/cancel-chaining/index.js create mode 100644 v3/examples/cancel-chaining/assets/bindings/github.com/wailsapp/wails/v3/examples/cancel-chaining/service.js create mode 100644 v3/examples/cancel-chaining/assets/index.html create mode 100644 v3/examples/cancel-chaining/main.go diff --git a/v3/examples/cancel-async/GreetService.go b/v3/examples/cancel-async/GreetService.go new file mode 100644 index 000000000..b2cc72e9b --- /dev/null +++ b/v3/examples/cancel-async/GreetService.go @@ -0,0 +1,19 @@ +package main + +import ( + "context" + "time" +) + +type Service struct { +} + +// A long running operation of specified duration. +func (*Service) LongRunning(ctx context.Context, milliseconds int) error { + select { + case <-time.After(time.Duration(milliseconds) * time.Millisecond): + return nil + case <-ctx.Done(): + return ctx.Err() + } +} diff --git a/v3/examples/cancel-async/README.md b/v3/examples/cancel-async/README.md new file mode 100644 index 000000000..feec0e5d6 --- /dev/null +++ b/v3/examples/cancel-async/README.md @@ -0,0 +1,5 @@ +# Binding Call Cancelling Example + +This example demonstrates how to cancel binding calls in async/await style. + +To regenerate bindings, run `wails3 generate bindings -clean -b -d assets/bindings` in this directory. diff --git a/v3/examples/cancel-async/assets/bindings/github.com/wailsapp/wails/v3/examples/cancel-async/index.js b/v3/examples/cancel-async/assets/bindings/github.com/wailsapp/wails/v3/examples/cancel-async/index.js new file mode 100644 index 000000000..d2bf43c94 --- /dev/null +++ b/v3/examples/cancel-async/assets/bindings/github.com/wailsapp/wails/v3/examples/cancel-async/index.js @@ -0,0 +1,8 @@ +// @ts-check +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +import * as Service from "./service.js"; +export { + Service +}; diff --git a/v3/examples/cancel-async/assets/bindings/github.com/wailsapp/wails/v3/examples/cancel-async/service.js b/v3/examples/cancel-async/assets/bindings/github.com/wailsapp/wails/v3/examples/cancel-async/service.js new file mode 100644 index 000000000..6aae91e1d --- /dev/null +++ b/v3/examples/cancel-async/assets/bindings/github.com/wailsapp/wails/v3/examples/cancel-async/service.js @@ -0,0 +1,16 @@ +// @ts-check +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import {Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create} from "/wails/runtime.js"; + +/** + * A long running operation of specified duration. + * @param {number} milliseconds + * @returns {$CancellablePromise} + */ +export function LongRunning(milliseconds) { + return $Call.ByID(298191698, milliseconds); +} diff --git a/v3/examples/cancel-async/assets/index.html b/v3/examples/cancel-async/assets/index.html new file mode 100644 index 000000000..ff0609928 --- /dev/null +++ b/v3/examples/cancel-async/assets/index.html @@ -0,0 +1,134 @@ + + + + + Wails Alpha + + + + +
    Alpha
    +
    +

    Documentation

    +

    Feedback

    +
    +
    Please enter a duration in milliseconds below 👇
    +
    + + + + +
    + + + diff --git a/v3/examples/cancel-async/main.go b/v3/examples/cancel-async/main.go new file mode 100644 index 000000000..3d7855208 --- /dev/null +++ b/v3/examples/cancel-async/main.go @@ -0,0 +1,37 @@ +package main + +import ( + "embed" + "log" + + "github.com/wailsapp/wails/v3/pkg/application" +) + +//go:embed assets/* +var assets embed.FS + +func main() { + app := application.New(application.Options{ + Services: []application.Service{ + application.NewService(&Service{}), + }, + Assets: application.AssetOptions{ + Handler: application.BundledAssetFileServer(assets), + }, + Mac: application.MacOptions{ + ApplicationShouldTerminateAfterLastWindowClosed: true, + }, + }) + + app.NewWebviewWindowWithOptions(application.WebviewWindowOptions{ + URL: "/", + DevToolsEnabled: true, + }) + + err := app.Run() + + if err != nil { + log.Fatal(err) + } + +} diff --git a/v3/examples/cancel-chaining/GreetService.go b/v3/examples/cancel-chaining/GreetService.go new file mode 100644 index 000000000..b2cc72e9b --- /dev/null +++ b/v3/examples/cancel-chaining/GreetService.go @@ -0,0 +1,19 @@ +package main + +import ( + "context" + "time" +) + +type Service struct { +} + +// A long running operation of specified duration. +func (*Service) LongRunning(ctx context.Context, milliseconds int) error { + select { + case <-time.After(time.Duration(milliseconds) * time.Millisecond): + return nil + case <-ctx.Done(): + return ctx.Err() + } +} diff --git a/v3/examples/cancel-chaining/README.md b/v3/examples/cancel-chaining/README.md new file mode 100644 index 000000000..10c5855ea --- /dev/null +++ b/v3/examples/cancel-chaining/README.md @@ -0,0 +1,5 @@ +# Binding Call Cancelling Example + +This example demonstrates how to cancel binding calls in promise chaining style. + +To regenerate bindings, run `wails3 generate bindings -clean -b -d assets/bindings` in this directory. diff --git a/v3/examples/cancel-chaining/assets/bindings/github.com/wailsapp/wails/v3/examples/cancel-chaining/index.js b/v3/examples/cancel-chaining/assets/bindings/github.com/wailsapp/wails/v3/examples/cancel-chaining/index.js new file mode 100644 index 000000000..d2bf43c94 --- /dev/null +++ b/v3/examples/cancel-chaining/assets/bindings/github.com/wailsapp/wails/v3/examples/cancel-chaining/index.js @@ -0,0 +1,8 @@ +// @ts-check +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +import * as Service from "./service.js"; +export { + Service +}; diff --git a/v3/examples/cancel-chaining/assets/bindings/github.com/wailsapp/wails/v3/examples/cancel-chaining/service.js b/v3/examples/cancel-chaining/assets/bindings/github.com/wailsapp/wails/v3/examples/cancel-chaining/service.js new file mode 100644 index 000000000..6aae91e1d --- /dev/null +++ b/v3/examples/cancel-chaining/assets/bindings/github.com/wailsapp/wails/v3/examples/cancel-chaining/service.js @@ -0,0 +1,16 @@ +// @ts-check +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import {Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create} from "/wails/runtime.js"; + +/** + * A long running operation of specified duration. + * @param {number} milliseconds + * @returns {$CancellablePromise} + */ +export function LongRunning(milliseconds) { + return $Call.ByID(298191698, milliseconds); +} diff --git a/v3/examples/cancel-chaining/assets/index.html b/v3/examples/cancel-chaining/assets/index.html new file mode 100644 index 000000000..71221c28d --- /dev/null +++ b/v3/examples/cancel-chaining/assets/index.html @@ -0,0 +1,136 @@ + + + + + Wails Alpha + + + + +
    Alpha
    +
    +

    Documentation

    +

    Feedback

    +
    +
    Please enter a duration in milliseconds below 👇
    +
    + + + + +
    + + + diff --git a/v3/examples/cancel-chaining/main.go b/v3/examples/cancel-chaining/main.go new file mode 100644 index 000000000..3d7855208 --- /dev/null +++ b/v3/examples/cancel-chaining/main.go @@ -0,0 +1,37 @@ +package main + +import ( + "embed" + "log" + + "github.com/wailsapp/wails/v3/pkg/application" +) + +//go:embed assets/* +var assets embed.FS + +func main() { + app := application.New(application.Options{ + Services: []application.Service{ + application.NewService(&Service{}), + }, + Assets: application.AssetOptions{ + Handler: application.BundledAssetFileServer(assets), + }, + Mac: application.MacOptions{ + ApplicationShouldTerminateAfterLastWindowClosed: true, + }, + }) + + app.NewWebviewWindowWithOptions(application.WebviewWindowOptions{ + URL: "/", + DevToolsEnabled: true, + }) + + err := app.Run() + + if err != nil { + log.Fatal(err) + } + +} From 87ceed05facbd02221083a8ed67f4ddbc2d6ff09 Mon Sep 17 00:00:00 2001 From: Fabio Massaioli Date: Tue, 25 Feb 2025 03:33:56 +0100 Subject: [PATCH 049/374] Fix logging bug in call message processor --- v3/pkg/application/messageprocessor_call.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/v3/pkg/application/messageprocessor_call.go b/v3/pkg/application/messageprocessor_call.go index 5d7558cb6..dc25d375c 100644 --- a/v3/pkg/application/messageprocessor_call.go +++ b/v3/pkg/application/messageprocessor_call.go @@ -151,7 +151,9 @@ func (m *MessageProcessor) processCallMethod(method int, rw http.ResponseWriter, // Prepare args for logging. This should never fail since json.Unmarshal succeeded before. jsonArgs, _ := json.Marshal(options.Args) var jsonResult []byte - defer m.Info("Binding call complete:", "id", *callID, "method", boundMethod, "args", string(jsonArgs), "result", string(jsonResult)) + defer func() { + m.Info("Binding call complete:", "id", *callID, "method", boundMethod, "args", string(jsonArgs), "result", string(jsonResult)) + }() // Set the context values for the window if window != nil { From ea7660d4b18d403ded363a5cfb0b15e169634c61 Mon Sep 17 00:00:00 2001 From: Fabio Massaioli Date: Tue, 25 Feb 2025 03:34:12 +0100 Subject: [PATCH 050/374] Update docs --- docs/src/content/docs/guides/menus.mdx | 4 + docs/src/content/docs/learn/bindings.mdx | 83 +++++++++++++++++++- docs/src/content/docs/learn/context-menu.mdx | 4 + docs/src/content/docs/learn/runtime.mdx | 48 ++++++++--- 4 files changed, 128 insertions(+), 11 deletions(-) diff --git a/docs/src/content/docs/guides/menus.mdx b/docs/src/content/docs/guides/menus.mdx index 58a9cd313..50023ab4d 100644 --- a/docs/src/content/docs/guides/menus.mdx +++ b/docs/src/content/docs/guides/menus.mdx @@ -366,6 +366,10 @@ You can control when the default context menu appears using the `--default-conte ``` +:::note +This feature will only work as expected after the runtime [has been initialised](../../learn/runtime#initialisation). +::: + #### Nested Context Menu Behavior When using the `--default-contextmenu` property on nested elements, the following rules apply: diff --git a/docs/src/content/docs/learn/bindings.mdx b/docs/src/content/docs/learn/bindings.mdx index 1ca0ee590..d66de725f 100644 --- a/docs/src/content/docs/learn/bindings.mdx +++ b/docs/src/content/docs/learn/bindings.mdx @@ -437,8 +437,9 @@ func (s *MyService) WindowAwareMethod(ctx context.Context) (string, error) { ``` From the frontend, these methods can be called normally. If you need to cancel a -long-running operation, the Promise will be rejected with the cancellation -error: +long-running operation, you can call the special `cancel` method on the promise +and it will reject immediately with a special cancellation error; +the Go context will be cancelled and the actual result of the call will be discarded: ```javascript // Call the method @@ -449,6 +450,84 @@ const promise = MyService.LongRunningTask("input"); promise.cancel(); ``` +In fact, the runtime returns a special promise wrapper +that provides cancellation support for arbitrarily long promise chains. +For example: + +```javascript +import { CancelError } from "@wailsio/runtime"; + +// Call the method and process its output +const promise = MyService.LongRunningTask("input").then((result) => { + console.log(result); +}).catch((err) => { + if (err instanceof CancelError) { + console.log("Cancelled.", err.cause); + } else { + console.error("Failed.", err); + } +}); + +// Later... +// cancel() accepts an optional cause parameter +// that will be attached to the cancellation error: +promise.cancel("I'm tired of waiting!").then(() => { + // Cancellation has been requested successfully + // and all handlers attached above have run. + console.log("Ready for the next adventure!"); +}); +``` + +The `cancel` method returns a promise that fulfills always (and never rejects) +after the cancellation request has been submitted successfully +and all previously attached handlers have run. + +:::note +Calling the `cancel` method on a settled promise is safe and has no effect; +if the task completes before the call to `cancel`, the code above is going to log: + +``` +completed +Ready for the next adventure! +``` + +However, if `cancel` is called before the task finishes, the output will be: + +``` +Cancelled. I'm tired of waiting! +Ready for the next adventure! +``` +::: + +The approach discussed above requires storing and chaining promises manually, +which can be cumbersome for code written in `async`/`await` style. +If you target plaforms that support the `AbortController`/`AbortSignal` idiom, +you can call the `cancelOn` method and tie call cancellation to an `AbortSignal` instead: + +```javascript +async function callBinding(signal) { + try { + await MyService.LongRunningTask("input").cancelOn(signal); + } catch (err) { + if (err instanceof CancelError) { + console.log("Cancelled! Cause: ", err.cause); + } else { + console.error("Failed! Error: ", err); + } + } +} + +let controller = new AbortController(); +callBinding(controller.signal); + +// Later... +controller.abort("I'm tired of waiting!"); +``` + +:::caution +On the macOS platform, `AbortSignal` is only supported from macOS 10.15 Catalina onwards. +::: + ### Handling errors As you may have noticed above, bound methods can return errors, which are handled specially. diff --git a/docs/src/content/docs/learn/context-menu.mdx b/docs/src/content/docs/learn/context-menu.mdx index f56e9a763..ca57f182b 100644 --- a/docs/src/content/docs/learn/context-menu.mdx +++ b/docs/src/content/docs/learn/context-menu.mdx @@ -65,6 +65,10 @@ To associate a context menu with an HTML element, use the `--custom-contextmenu` - `--custom-contextmenu`: Specifies the menu ID (must match the ID used in `NewContextMenu`) - `--custom-contextmenu-data`: Optional data that will be passed to the click handlers +:::note +This feature will only work as expected after the runtime [has been initialised](../runtime#initialisation). +::: + ## Default Context Menu The default context menu is the webview's built-in context menu that provides system-level operations. You can control its visibility using the `--default-contextmenu` CSS property: diff --git a/docs/src/content/docs/learn/runtime.mdx b/docs/src/content/docs/learn/runtime.mdx index 3c2fbfc33..e9780c035 100644 --- a/docs/src/content/docs/learn/runtime.mdx +++ b/docs/src/content/docs/learn/runtime.mdx @@ -22,12 +22,12 @@ The runtime is required for integration between Go and the frontend. There are 2 ways to integrate the runtime: - Using the `@wailsio/runtime` package -- Using a pre-built version of the runtime +- Using a pre-built bundle ## Using the npm package The `@wailsio/runtime` package is a JavaScript package that provides access to -the Wails runtime from the frontend. It is used in by all the standard templates +the Wails runtime from the frontend. It is used by all standard templates and is the recommended way to integrate the runtime into your application. By using the `@wailsio/runtime` package, you will only include the parts of the runtime that you use. @@ -37,25 +37,55 @@ The package is available on npm and can be installed using: npm install --save @wailsio/runtime ``` -## Using a pre-built local version of the runtime +## Using a pre-built bundle Some projects will not use a Javascript bundler and may prefer to use a -pre-built version of the runtime. This is the default for the examples in -`v3/examples`. The pre-built version of the runtime can be generated using the -following command: +pre-built version of the runtime. The pre-built version of the runtime +can be generated using the following command: ```shell wails3 generate runtime ``` This will generate a `runtime.js` (and `runtime.debug.js`) file in the current -directory. This file can be used by your application by adding it to your frontend project: +directory. This file is an ES module that can be imported by your application scripts +just like the npm package, but the API is also exported to the global window object, +so for simpler applications you can use it as follows: ```html - + + - + ``` + +:::caution +It is important to include the `type="module"` attribute on the ` diff --git a/v3/examples/notifications/frontend/main.js b/v3/examples/notifications/frontend/main.js index 79fc8dcca..64624f34b 100644 --- a/v3/examples/notifications/frontend/main.js +++ b/v3/examples/notifications/frontend/main.js @@ -50,7 +50,6 @@ window.sendComplexNotification = async () => { } } -Events.On("notificationResponse", (response) => { - console.log(response) - notificationsElement.innerText += JSON.stringify(response.data[0].data); +Events.On("notification:response", (response) => { + notificationsElement.innerText = JSON.stringify(response.data[0]); }); \ No newline at end of file diff --git a/v3/examples/notifications/main.go b/v3/examples/notifications/main.go index dc9fec9c9..a1d34dd5e 100644 --- a/v3/examples/notifications/main.go +++ b/v3/examples/notifications/main.go @@ -12,29 +12,17 @@ import ( "github.com/wailsapp/wails/v3/pkg/services/notifications" ) -// Wails uses Go's `embed` package to embed the frontend files into the binary. -// Any files in the frontend/dist folder will be embedded into the binary and -// made available to the frontend. -// See https://pkg.go.dev/embed for more information. - //go:embed all:frontend/dist var assets embed.FS -// main function serves as the application's entry point. It initializes the application, creates a window, -// and starts a goroutine that emits a time-based event every second. It subsequently runs the application and -// logs any error that might occur. func main() { - NotificationService := notifications.New() - // Create a new Wails application by providing the necessary options. - // Variables 'Name' and 'Description' are for application metadata. - // 'Assets' configures the asset server with the 'FS' variable pointing to the frontend files. - // 'Bind' is a list of Go struct instances. The frontend has access to the methods of these instances. - // 'Mac' options tailor the application when running an macOS. + notificationService := notifications.New() + app := application.New(application.Options{ Name: "notifications_demo", Description: "A demo of using raw HTML & CSS", Services: []application.Service{ - application.NewService(NotificationService), + application.NewService(notificationService), }, Assets: application.AssetOptions{ Handler: application.AssetFileServerFS(assets), @@ -44,11 +32,6 @@ func main() { }, }) - // Create a new window with the necessary options. - // 'Title' is the title of the window. - // 'Mac' options tailor the window when running on macOS. - // 'BackgroundColour' is the background colour of the window. - // 'URL' is the URL that will be loaded into the webview. app.NewWebviewWindowWithOptions(application.WebviewWindowOptions{ Title: "Window 1", Mac: application.MacWindow{ @@ -60,19 +43,19 @@ func main() { URL: "/", }) - app.OnEvent("notificationResponse", func(event *application.CustomEvent) { - data, _ := json.Marshal(event.Data) - fmt.Printf("%s\n", string(data)) - }) - go func() { - granted, err := NotificationService.RequestUserNotificationAuthorization() + granted, err := notificationService.RequestUserNotificationAuthorization() if err != nil { log.Default().Printf("WARNING: %s\n", err) return } if granted { + notificationService.OnNotificationResponse(func(response notifications.NotificationResponse) { + data, _ := json.Marshal(response) + fmt.Printf("%s\n", string(data)) + app.EmitEvent("notification:response", response) + }) time.Sleep(time.Second * 2) var uuid1 string = "Wails Notification Demo" @@ -80,7 +63,7 @@ func main() { uuid1 = "uuid1" } - NotificationService.SendNotification(notifications.NotificationOptions{ + notificationService.SendNotification(notifications.NotificationOptions{ ID: uuid1, Title: "Title!", Body: "Body!", @@ -98,7 +81,7 @@ func main() { uuid2 = "uuid2" } - NotificationService.RegisterNotificationCategory(notifications.NotificationCategory{ + notificationService.RegisterNotificationCategory(notifications.NotificationCategory{ ID: "BACKEND_NOTIF", Actions: []notifications.NotificationAction{ {ID: "VIEW_ACTION", Title: "View"}, @@ -110,7 +93,7 @@ func main() { ReplyPlaceholder: "Reply to backend...", }) - NotificationService.SendNotificationWithActions(notifications.NotificationOptions{ + notificationService.SendNotificationWithActions(notifications.NotificationOptions{ ID: uuid2, Title: "Complex Backend Notification", Subtitle: "Should not show on Windows", @@ -125,10 +108,8 @@ func main() { } }() - // Run the application. This blocks until the application has been exited. err := app.Run() - // If an error occurred while running the application, log it and exit. if err != nil { log.Fatal(err) } From 253f67243afe4bb9eecef573f89484576d224dc7 Mon Sep 17 00:00:00 2001 From: popaprozac Date: Mon, 24 Feb 2025 22:39:50 -0800 Subject: [PATCH 056/374] init linux --- v3/go.mod | 1 + v3/go.sum | 2 + .../services/notifications/notifications.go | 5 + .../notifications/notifications_darwin.go | 24 ++-- .../notifications/notifications_linux.go | 103 ++++++++++++++++++ .../notifications/notifications_windows.go | 12 +- 6 files changed, 131 insertions(+), 16 deletions(-) create mode 100644 v3/pkg/services/notifications/notifications_linux.go diff --git a/v3/go.mod b/v3/go.mod index cf9dd83c7..83799de5a 100644 --- a/v3/go.mod +++ b/v3/go.mod @@ -46,6 +46,7 @@ require ( require ( atomicgo.dev/schedule v0.1.0 // indirect + git.sr.ht/~whereswaldon/shout v0.0.0-20241212204820-26acea6b0007 // indirect github.com/ncruces/go-strftime v0.1.9 // indirect ) diff --git a/v3/go.sum b/v3/go.sum index 052246286..16a7c6db4 100644 --- a/v3/go.sum +++ b/v3/go.sum @@ -10,6 +10,8 @@ dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s= dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= git.sr.ht/~jackmordaunt/go-toast/v2 v2.0.3 h1:N3IGoHHp9pb6mj1cbXbuaSXV/UMKwmbKLf53nQmtqMA= git.sr.ht/~jackmordaunt/go-toast/v2 v2.0.3/go.mod h1:QtOLZGz8olr4qH2vWK0QH0w0O4T9fEIjMuWpKUsH7nc= +git.sr.ht/~whereswaldon/shout v0.0.0-20241212204820-26acea6b0007 h1:5xMwYHPm3ym1ccRmVmUEj4hiESj5uqXMYPwG+1Ruf28= +git.sr.ht/~whereswaldon/shout v0.0.0-20241212204820-26acea6b0007/go.mod h1:VJjhIIJD+YFIyJSH6nCDqoo9ikvAEaD63tUo4uI86pA= github.com/AlekSi/pointer v1.2.0 h1:glcy/gc4h8HnG2Z3ZECSzZ1IX1x2JxRVuDzaJwQE0+w= github.com/AlekSi/pointer v1.2.0/go.mod h1:gZGfd3dpW4vEc/UlyfKKi1roIqcCgwOIvb0tSNSBle0= github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= diff --git a/v3/pkg/services/notifications/notifications.go b/v3/pkg/services/notifications/notifications.go index 78bd6e120..c53f77ba3 100644 --- a/v3/pkg/services/notifications/notifications.go +++ b/v3/pkg/services/notifications/notifications.go @@ -46,6 +46,11 @@ type NotificationResponse = struct { UserInfo map[string]interface{} `json:"userInfo,omitempty"` } +// ServiceName returns the name of the service. +func (ns *Service) ServiceName() string { + return "github.com/wailsapp/wails/v3/services/notifications" +} + // OnNotificationResponse registers a callback function that will be called when // a notification response is received from the user func (ns *Service) OnNotificationResponse(callback func(response NotificationResponse)) { diff --git a/v3/pkg/services/notifications/notifications_darwin.go b/v3/pkg/services/notifications/notifications_darwin.go index 34e49e079..2197e6741 100644 --- a/v3/pkg/services/notifications/notifications_darwin.go +++ b/v3/pkg/services/notifications/notifications_darwin.go @@ -29,11 +29,6 @@ func New() *Service { return NotificationService } -// ServiceName returns the name of the service. -func (ns *Service) ServiceName() string { - return "github.com/wailsapp/wails/v3/services/notifications" -} - // ServiceStartup is called when the service is loaded. func (ns *Service) ServiceStartup(ctx context.Context, options application.ServiceOptions) error { if !CheckBundleIdentifier() { @@ -207,10 +202,15 @@ func (ns *Service) RemoveDeliveredNotification(identifier string) error { return nil } -func (ns *Service) forwardResponse(response NotificationResponse) { - if NotificationService != nil { - NotificationService.handleNotificationResponse(response) - } +// RemoveNotification is a macOS stub that always returns nil. +// Use one of the following instead: +// RemoveAllPendingNotifications +// RemovePendingNotification +// RemoveAllDeliveredNotifications +// RemoveDeliveredNotification +// (Linux-specific) +func (ns *Service) RemoveNotification(identifier string) error { + return nil } //export didReceiveNotificationResponse @@ -222,9 +222,11 @@ func didReceiveNotificationResponse(jsonPayload *C.char) { return } - if response.ActionIdentifier == AppleDefaultActionIdentifier { + if response.ActionIdentifier == "com.apple.UNNotificationDefaultActionIdentifier" { response.ActionIdentifier = DefaultActionIdentifier } - NotificationService.forwardResponse(response) + if NotificationService != nil { + NotificationService.handleNotificationResponse(response) + } } diff --git a/v3/pkg/services/notifications/notifications_linux.go b/v3/pkg/services/notifications/notifications_linux.go new file mode 100644 index 000000000..b499d4788 --- /dev/null +++ b/v3/pkg/services/notifications/notifications_linux.go @@ -0,0 +1,103 @@ +//go:build linux + +package notifications + +import ( + "context" + + "git.sr.ht/~whereswaldon/shout" + "github.com/wailsapp/wails/v3/pkg/application" +) + +var NotificationService *Service +var Notifier shout.Notifier + +// Creates a new Notifications Service. +func New() *Service { + if NotificationService == nil { + NotificationService = &Service{} + } + return NotificationService +} + +// ServiceStartup is called when the service is loaded +func (ns *Service) ServiceStartup(ctx context.Context, options application.ServiceOptions) error { + return nil +} + +// ServiceShutdown is called when the service is unloaded +func (ns *Service) ServiceShutdown() error { + return nil +} + +// CheckBundleIdentifier is a Linux stub that always returns true. +// (bundle identifiers are macOS-specific) +func CheckBundleIdentifier() bool { + return true +} + +// RequestUserNotificationAuthorization is a Linux stub that always returns true, nil. +// (user authorization is macOS-specific) +func (ns *Service) RequestUserNotificationAuthorization() (bool, error) { + return true, nil +} + +// CheckNotificationAuthorization is a Linux stub that always returns true. +// (user authorization is macOS-specific) +func (ns *Service) CheckNotificationAuthorization() bool { + return true +} + +// SendNotification sends a basic notification with a name, title, and body. All other options are ignored on Linux. +// (subtitle and category id are only available on macOS) +func (ns *Service) SendNotification(options NotificationOptions) error { + return nil +} + +// SendNotificationWithActions sends a notification with additional actions and inputs. +// A NotificationCategory must be registered with RegisterNotificationCategory first. The `CategoryID` must match the registered category. +// If a NotificationCategory is not registered a basic notification will be sent. +// (subtitle and category id are only available on macOS) +func (ns *Service) SendNotificationWithActions(options NotificationOptions) error { + return nil +} + +// RegisterNotificationCategory registers a new NotificationCategory to be used with SendNotificationWithActions. +func (ns *Service) RegisterNotificationCategory(category NotificationCategory) error { + return nil +} + +// RemoveNotificationCategory removes a previously registered NotificationCategory. +func (ns *Service) RemoveNotificationCategory(categoryId string) error { + return nil +} + +// RemoveAllPendingNotifications is a Linux stub that always returns nil. +// (macOS-specific) +func (ns *Service) RemoveAllPendingNotifications() error { + return nil +} + +// RemovePendingNotification is a Linux stub that always returns nil. +// (macOS-specific) +func (ns *Service) RemovePendingNotification(_ string) error { + return nil +} + +// RemoveAllDeliveredNotifications is a Linux stub that always returns nil. +// (macOS-specific) +func (ns *Service) RemoveAllDeliveredNotifications() error { + return nil +} + +// RemoveDeliveredNotification is a Linux stub that always returns nil. +// (macOS-specific) +func (ns *Service) RemoveDeliveredNotification(_ string) error { + return nil +} + +// RemoveNotification removes a pending notification matching the unique identifier. +// (Linux-specific) +func (ns *Service) RemoveNotification(identifier string) error { + return nil +} diff --git a/v3/pkg/services/notifications/notifications_windows.go b/v3/pkg/services/notifications/notifications_windows.go index 6a266bbee..e0fc917aa 100644 --- a/v3/pkg/services/notifications/notifications_windows.go +++ b/v3/pkg/services/notifications/notifications_windows.go @@ -24,6 +24,7 @@ const ( dataSeparator = ":::" ) +// Creates a new Notifications Service. func New() *Service { if NotificationService == nil { NotificationService = &Service{} @@ -31,11 +32,6 @@ func New() *Service { return NotificationService } -// ServiceName returns the name of the service -func (ns *Service) ServiceName() string { - return "github.com/wailsapp/wails/v3/services/notifications" -} - // ServiceStartup is called when the service is loaded // Sets an activation callback to emit an event when notifications are interacted with. func (ns *Service) ServiceStartup(ctx context.Context, options application.ServiceOptions) error { @@ -227,6 +223,12 @@ func (ns *Service) RemoveDeliveredNotification(_ string) error { return nil } +// RemoveNotification is a Windows stub that always returns nil. +// (Linux-specific) +func (ns *Service) RemoveNotification(identifier string) error { + return nil +} + func parseNotificationResponse(response string) (action string, data string) { parts := strings.Split(response, dataSeparator) if len(parts) == 1 { From b59f003f61825f40fe51942f4ea479661eb2723f Mon Sep 17 00:00:00 2001 From: Fabio Massaioli Date: Tue, 25 Feb 2025 13:50:16 +0100 Subject: [PATCH 057/374] Fix dragging system --- .../bundledassets/runtime.debug.js | 107 ++++++++----- .../assetserver/bundledassets/runtime.js | 2 +- .../@wailsio/runtime/package-lock.json | 4 +- .../desktop/@wailsio/runtime/src/drag.ts | 142 +++++++++++------- 4 files changed, 160 insertions(+), 95 deletions(-) diff --git a/v3/internal/assetserver/bundledassets/runtime.debug.js b/v3/internal/assetserver/bundledassets/runtime.debug.js index 738554ba3..8a9aa1744 100644 --- a/v3/internal/assetserver/bundledassets/runtime.debug.js +++ b/v3/internal/assetserver/bundledassets/runtime.debug.js @@ -1320,10 +1320,10 @@ window._wails.setResizable = (value) => { setResize(); } }; -window.addEventListener("mousedown", onMouseDown, { capture: true }); -window.addEventListener("mousemove", onMouseMove, { capture: true }); -window.addEventListener("mouseup", onMouseUp, { capture: true }); -for (const ev of ["click", "contextmenu", "dblclick", "pointerdown", "pointerup"]) { +window.addEventListener("mousedown", update, { capture: true }); +window.addEventListener("mousemove", update, { capture: true }); +window.addEventListener("mouseup", update, { capture: true }); +for (const ev of ["click", "contextmenu", "dblclick"]) { window.addEventListener(ev, suppressEvent, { capture: true }); } function suppressEvent(event) { @@ -1333,23 +1333,65 @@ function suppressEvent(event) { event.preventDefault(); } } -function onMouseDown(event) { +var MouseDown = 0; +var MouseUp = 1; +var MouseMove = 2; +function update(event) { + let eventType, eventButtons = event.buttons; + switch (event.type) { + case "mousedown": + eventType = MouseDown; + if (!buttonsTracked) { + eventButtons = buttons | 1 << event.button; + } + break; + case "mouseup": + eventType = MouseUp; + if (!buttonsTracked) { + eventButtons = buttons & ~(1 << event.button); + } + break; + default: + eventType = MouseMove; + if (!buttonsTracked) { + eventButtons = buttons; + } + break; + } + let released = buttons & ~eventButtons; + let pressed = eventButtons & ~buttons; + buttons = eventButtons; + if (eventType === MouseDown && !(pressed & event.button)) { + released |= 1 << event.button; + pressed |= 1 << event.button; + } + if (eventType !== MouseMove && resizing || dragging && (eventType === MouseDown || event.button !== 0)) { + event.stopImmediatePropagation(); + event.stopPropagation(); + event.preventDefault(); + } + if (released & 1) { + primaryUp(event); + } + if (pressed & 1) { + primaryDown(event); + } + if (eventType === MouseMove) { + onMouseMove(event); + } + ; +} +function primaryDown(event) { var _a2; - buttons = buttonsTracked ? event.buttons : buttons | 1 << event.button; - if (dragging || resizing) { - suppressEvent(event); - return; - } - if ((canDrag || canResize) && buttons & 1 && event.button !== 0) { - return; - } canDrag = false; canResize = false; - if (resizeEdge) { - if (event.button === 0 && event.detail === 1) { - canResize = true; - invoke("wails:resize:" + resizeEdge); + if (!IsWindows()) { + if (event.type === "mousedown" && event.button === 0 && event.detail !== 1) { + return; } + } + if (resizeEdge) { + canResize = true; return; } let target; @@ -1361,28 +1403,13 @@ function onMouseDown(event) { target = document.body; } const style = window.getComputedStyle(target); - const setting = style.getPropertyValue("--wails-draggable").trim(); - if (setting === "drag" && event.button === 0 && event.detail === 1) { - if (event.offsetX - parseFloat(style.paddingLeft) < target.clientWidth && event.offsetY - parseFloat(style.paddingTop) < target.clientHeight) { - canDrag = true; - invoke("wails:drag"); - } - } + canDrag = style.getPropertyValue("--wails-draggable").trim() === "drag" && (event.offsetX - parseFloat(style.paddingLeft) < target.clientWidth && event.offsetY - parseFloat(style.paddingTop) < target.clientHeight); } -function onMouseUp(event) { - buttons = buttonsTracked ? event.buttons : buttons & ~(1 << event.button); - if (event.button === 0) { - if (resizing) { - suppressEvent(event); - } - canDrag = false; - dragging = false; - canResize = false; - resizing = false; - return; - } - suppressEvent(event); - return; +function primaryUp(event) { + canDrag = false; + dragging = false; + canResize = false; + resizing = false; } var cursorForEdge = Object.freeze({ "se-resize": "nwse-resize", @@ -1408,8 +1435,10 @@ function setResize(edge) { function onMouseMove(event) { if (canResize && resizeEdge) { resizing = true; + invoke("wails:resize:" + resizeEdge); } else if (canDrag) { dragging = true; + invoke("wails:drag"); } if (dragging || resizing) { canDrag = canResize = false; @@ -2506,4 +2535,4 @@ export { wml_exports as WML, window_default as Window }; -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2luZGV4LnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy93bWwudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2Jyb3dzZXIudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL25hbm9pZC50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvcnVudGltZS50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvZGlhbG9ncy50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvZXZlbnRzLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9saXN0ZW5lci50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvZXZlbnRfdHlwZXMudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3V0aWxzLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy93aW5kb3cudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL2NvbXBpbGVkL21haW4uanMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3N5c3RlbS50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvY29udGV4dG1lbnUudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2ZsYWdzLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9kcmFnLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9hcHBsaWNhdGlvbi50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvY2FsbHMudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2NhbGxhYmxlLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9jYW5jZWxsYWJsZS50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvY2xpcGJvYXJkLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9jcmVhdGUudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3NjcmVlbnMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vLyBTZXR1cFxud2luZG93Ll93YWlscyA9IHdpbmRvdy5fd2FpbHMgfHwge307XG5cbmltcG9ydCBcIi4vY29udGV4dG1lbnUuanNcIjtcbmltcG9ydCBcIi4vZHJhZy5qc1wiO1xuXG4vLyBSZS1leHBvcnQgcHVibGljIEFQSVxuaW1wb3J0ICogYXMgQXBwbGljYXRpb24gZnJvbSBcIi4vYXBwbGljYXRpb24uanNcIjtcbmltcG9ydCAqIGFzIEJyb3dzZXIgZnJvbSBcIi4vYnJvd3Nlci5qc1wiO1xuaW1wb3J0ICogYXMgQ2FsbCBmcm9tIFwiLi9jYWxscy5qc1wiO1xuaW1wb3J0ICogYXMgQ2xpcGJvYXJkIGZyb20gXCIuL2NsaXBib2FyZC5qc1wiO1xuaW1wb3J0ICogYXMgQ3JlYXRlIGZyb20gXCIuL2NyZWF0ZS5qc1wiO1xuaW1wb3J0ICogYXMgRGlhbG9ncyBmcm9tIFwiLi9kaWFsb2dzLmpzXCI7XG5pbXBvcnQgKiBhcyBFdmVudHMgZnJvbSBcIi4vZXZlbnRzLmpzXCI7XG5pbXBvcnQgKiBhcyBGbGFncyBmcm9tIFwiLi9mbGFncy5qc1wiO1xuaW1wb3J0ICogYXMgU2NyZWVucyBmcm9tIFwiLi9zY3JlZW5zLmpzXCI7XG5pbXBvcnQgKiBhcyBTeXN0ZW0gZnJvbSBcIi4vc3lzdGVtLmpzXCI7XG5pbXBvcnQgV2luZG93IGZyb20gXCIuL3dpbmRvdy5qc1wiO1xuaW1wb3J0ICogYXMgV01MIGZyb20gXCIuL3dtbC5qc1wiO1xuXG5leHBvcnQge1xuICAgIEFwcGxpY2F0aW9uLFxuICAgIEJyb3dzZXIsXG4gICAgQ2FsbCxcbiAgICBDbGlwYm9hcmQsXG4gICAgRGlhbG9ncyxcbiAgICBFdmVudHMsXG4gICAgRmxhZ3MsXG4gICAgU2NyZWVucyxcbiAgICBTeXN0ZW0sXG4gICAgV2luZG93LFxuICAgIFdNTFxufTtcblxuLyoqXG4gKiBBbiBpbnRlcm5hbCB1dGlsaXR5IGNvbnN1bWVkIGJ5IHRoZSBiaW5kaW5nIGdlbmVyYXRvci5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGlnbm9yZVxuICovXG5leHBvcnQgeyBDcmVhdGUgfTtcblxuZXhwb3J0ICogZnJvbSBcIi4vY2FuY2VsbGFibGUuanNcIjtcblxuLy8gTm90aWZ5IGJhY2tlbmRcbndpbmRvdy5fd2FpbHMuaW52b2tlID0gU3lzdGVtLmludm9rZTtcblN5c3RlbS5pbnZva2UoXCJ3YWlsczpydW50aW1lOnJlYWR5XCIpO1xuIiwgIi8qXG4gXyAgICAgX18gICAgIF8gX19cbnwgfCAgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5pbXBvcnQgeyBPcGVuVVJMIH0gZnJvbSBcIi4vYnJvd3Nlci5qc1wiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi9kaWFsb2dzLmpzXCI7XG5pbXBvcnQgeyBFbWl0LCBXYWlsc0V2ZW50IH0gZnJvbSBcIi4vZXZlbnRzLmpzXCI7XG5pbXBvcnQgeyBjYW5BYm9ydExpc3RlbmVycywgd2hlblJlYWR5IH0gZnJvbSBcIi4vdXRpbHMuanNcIjtcbmltcG9ydCBXaW5kb3cgZnJvbSBcIi4vd2luZG93LmpzXCI7XG5cbi8qKlxuICogU2VuZHMgYW4gZXZlbnQgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgb3B0aW9uYWwgZGF0YS5cbiAqXG4gKiBAcGFyYW0gZXZlbnROYW1lIC0gLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gc2VuZC5cbiAqIEBwYXJhbSBbZGF0YT1udWxsXSAtIC0gT3B0aW9uYWwgZGF0YSB0byBzZW5kIGFsb25nIHdpdGggdGhlIGV2ZW50LlxuICovXG5mdW5jdGlvbiBzZW5kRXZlbnQoZXZlbnROYW1lOiBzdHJpbmcsIGRhdGE6IGFueSA9IG51bGwpOiB2b2lkIHtcbiAgICBFbWl0KG5ldyBXYWlsc0V2ZW50KGV2ZW50TmFtZSwgZGF0YSkpO1xufVxuXG4vKipcbiAqIENhbGxzIGEgbWV0aG9kIG9uIGEgc3BlY2lmaWVkIHdpbmRvdy5cbiAqXG4gKiBAcGFyYW0gd2luZG93TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB3aW5kb3cgdG8gY2FsbCB0aGUgbWV0aG9kIG9uLlxuICogQHBhcmFtIG1ldGhvZE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgbWV0aG9kIHRvIGNhbGwuXG4gKi9cbmZ1bmN0aW9uIGNhbGxXaW5kb3dNZXRob2Qod2luZG93TmFtZTogc3RyaW5nLCBtZXRob2ROYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCB0YXJnZXRXaW5kb3cgPSBXaW5kb3cuR2V0KHdpbmRvd05hbWUpO1xuICAgIGNvbnN0IG1ldGhvZCA9ICh0YXJnZXRXaW5kb3cgYXMgYW55KVttZXRob2ROYW1lXTtcblxuICAgIGlmICh0eXBlb2YgbWV0aG9kICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgV2luZG93IG1ldGhvZCAnJHttZXRob2ROYW1lfScgbm90IGZvdW5kYCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgICBtZXRob2QuY2FsbCh0YXJnZXRXaW5kb3cpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgY2FsbGluZyB3aW5kb3cgbWV0aG9kICcke21ldGhvZE5hbWV9JzogYCwgZSk7XG4gICAgfVxufVxuXG4vKipcbiAqIFJlc3BvbmRzIHRvIGEgdHJpZ2dlcmluZyBldmVudCBieSBydW5uaW5nIGFwcHJvcHJpYXRlIFdNTCBhY3Rpb25zIGZvciB0aGUgY3VycmVudCB0YXJnZXQuXG4gKi9cbmZ1bmN0aW9uIG9uV01MVHJpZ2dlcmVkKGV2OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGVsZW1lbnQgPSBldi5jdXJyZW50VGFyZ2V0IGFzIEVsZW1lbnQ7XG5cbiAgICBmdW5jdGlvbiBydW5FZmZlY3QoY2hvaWNlID0gXCJZZXNcIikge1xuICAgICAgICBpZiAoY2hvaWNlICE9PSBcIlllc1wiKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGV2ZW50VHlwZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd3bWwtZXZlbnQnKSB8fCBlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS13bWwtZXZlbnQnKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0V2luZG93ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3dtbC10YXJnZXQtd2luZG93JykgfHwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtd21sLXRhcmdldC13aW5kb3cnKSB8fCBcIlwiO1xuICAgICAgICBjb25zdCB3aW5kb3dNZXRob2QgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnd21sLXdpbmRvdycpIHx8IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXdtbC13aW5kb3cnKTtcbiAgICAgICAgY29uc3QgdXJsID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3dtbC1vcGVudXJsJykgfHwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtd21sLW9wZW51cmwnKTtcblxuICAgICAgICBpZiAoZXZlbnRUeXBlICE9PSBudWxsKVxuICAgICAgICAgICAgc2VuZEV2ZW50KGV2ZW50VHlwZSk7XG4gICAgICAgIGlmICh3aW5kb3dNZXRob2QgIT09IG51bGwpXG4gICAgICAgICAgICBjYWxsV2luZG93TWV0aG9kKHRhcmdldFdpbmRvdywgd2luZG93TWV0aG9kKTtcbiAgICAgICAgaWYgKHVybCAhPT0gbnVsbClcbiAgICAgICAgICAgIHZvaWQgT3BlblVSTCh1cmwpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpcm0gPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnd21sLWNvbmZpcm0nKSB8fCBlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS13bWwtY29uZmlybScpO1xuXG4gICAgaWYgKGNvbmZpcm0pIHtcbiAgICAgICAgUXVlc3Rpb24oe1xuICAgICAgICAgICAgVGl0bGU6IFwiQ29uZmlybVwiLFxuICAgICAgICAgICAgTWVzc2FnZTogY29uZmlybSxcbiAgICAgICAgICAgIERldGFjaGVkOiBmYWxzZSxcbiAgICAgICAgICAgIEJ1dHRvbnM6IFtcbiAgICAgICAgICAgICAgICB7IExhYmVsOiBcIlllc1wiIH0sXG4gICAgICAgICAgICAgICAgeyBMYWJlbDogXCJOb1wiLCBJc0RlZmF1bHQ6IHRydWUgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9KS50aGVuKHJ1bkVmZmVjdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcnVuRWZmZWN0KCk7XG4gICAgfVxufVxuXG4vLyBQcml2YXRlIGZpZWxkIG5hbWVzLlxuY29uc3QgY29udHJvbGxlclN5bSA9IFN5bWJvbChcImNvbnRyb2xsZXJcIik7XG5jb25zdCB0cmlnZ2VyTWFwU3ltID0gU3ltYm9sKFwidHJpZ2dlck1hcFwiKTtcbmNvbnN0IGVsZW1lbnRDb3VudFN5bSA9IFN5bWJvbChcImVsZW1lbnRDb3VudFwiKTtcblxuLyoqXG4gKiBBYm9ydENvbnRyb2xsZXJSZWdpc3RyeSBkb2VzIG5vdCBhY3R1YWxseSByZW1lbWJlciBhY3RpdmUgZXZlbnQgbGlzdGVuZXJzOiBpbnN0ZWFkXG4gKiBpdCB0aWVzIHRoZW0gdG8gYW4gQWJvcnRTaWduYWwgYW5kIHVzZXMgYW4gQWJvcnRDb250cm9sbGVyIHRvIHJlbW92ZSB0aGVtIGFsbCBhdCBvbmNlLlxuICovXG5jbGFzcyBBYm9ydENvbnRyb2xsZXJSZWdpc3RyeSB7XG4gICAgLy8gUHJpdmF0ZSBmaWVsZHMuXG4gICAgW2NvbnRyb2xsZXJTeW1dOiBBYm9ydENvbnRyb2xsZXI7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpc1tjb250cm9sbGVyU3ltXSA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIG9wdGlvbnMgb2JqZWN0IGZvciBhZGRFdmVudExpc3RlbmVyIHRoYXQgdGllcyB0aGUgbGlzdGVuZXJcbiAgICAgKiB0byB0aGUgQWJvcnRTaWduYWwgZnJvbSB0aGUgY3VycmVudCBBYm9ydENvbnRyb2xsZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZWxlbWVudCAtIEFuIEhUTUwgZWxlbWVudFxuICAgICAqIEBwYXJhbSB0cmlnZ2VycyAtIFRoZSBsaXN0IG9mIGFjdGl2ZSBXTUwgdHJpZ2dlciBldmVudHMgZm9yIHRoZSBzcGVjaWZpZWQgZWxlbWVudHNcbiAgICAgKi9cbiAgICBzZXQoZWxlbWVudDogRWxlbWVudCwgdHJpZ2dlcnM6IHN0cmluZ1tdKTogQWRkRXZlbnRMaXN0ZW5lck9wdGlvbnMge1xuICAgICAgICByZXR1cm4geyBzaWduYWw6IHRoaXNbY29udHJvbGxlclN5bV0uc2lnbmFsIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwgcmVnaXN0ZXJlZCBldmVudCBsaXN0ZW5lcnMgYW5kIHJlc2V0cyB0aGUgcmVnaXN0cnkuXG4gICAgICovXG4gICAgcmVzZXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXNbY29udHJvbGxlclN5bV0uYWJvcnQoKTtcbiAgICAgICAgdGhpc1tjb250cm9sbGVyU3ltXSA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICB9XG59XG5cbi8qKlxuICogV2Vha01hcFJlZ2lzdHJ5IG1hcHMgYWN0aXZlIHRyaWdnZXIgZXZlbnRzIHRvIGVhY2ggRE9NIGVsZW1lbnQgdGhyb3VnaCBhIFdlYWtNYXAuXG4gKiBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgbWFwcGluZyByZW1haW5zIHByaXZhdGUgdG8gdGhpcyBtb2R1bGUsIHdoaWxlIHN0aWxsIGFsbG93aW5nIGdhcmJhZ2VcbiAqIGNvbGxlY3Rpb24gb2YgdGhlIGludm9sdmVkIGVsZW1lbnRzLlxuICovXG5jbGFzcyBXZWFrTWFwUmVnaXN0cnkge1xuICAgIC8qKiBTdG9yZXMgdGhlIGN1cnJlbnQgZWxlbWVudC10by10cmlnZ2VyIG1hcHBpbmcuICovXG4gICAgW3RyaWdnZXJNYXBTeW1dOiBXZWFrTWFwPEVsZW1lbnQsIHN0cmluZ1tdPjtcbiAgICAvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgd2l0aCBhY3RpdmUgV01MIHRyaWdnZXJzLiAqL1xuICAgIFtlbGVtZW50Q291bnRTeW1dOiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpc1t0cmlnZ2VyTWFwU3ltXSA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgIHRoaXNbZWxlbWVudENvdW50U3ltXSA9IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBhY3RpdmUgdHJpZ2dlcnMgZm9yIHRoZSBzcGVjaWZpZWQgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbGVtZW50IC0gQW4gSFRNTCBlbGVtZW50XG4gICAgICogQHBhcmFtIHRyaWdnZXJzIC0gVGhlIGxpc3Qgb2YgYWN0aXZlIFdNTCB0cmlnZ2VyIGV2ZW50cyBmb3IgdGhlIHNwZWNpZmllZCBlbGVtZW50XG4gICAgICovXG4gICAgc2V0KGVsZW1lbnQ6IEVsZW1lbnQsIHRyaWdnZXJzOiBzdHJpbmdbXSk6IEFkZEV2ZW50TGlzdGVuZXJPcHRpb25zIHtcbiAgICAgICAgaWYgKCF0aGlzW3RyaWdnZXJNYXBTeW1dLmhhcyhlbGVtZW50KSkgeyB0aGlzW2VsZW1lbnRDb3VudFN5bV0rKzsgfVxuICAgICAgICB0aGlzW3RyaWdnZXJNYXBTeW1dLnNldChlbGVtZW50LCB0cmlnZ2Vycyk7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCByZWdpc3RlcmVkIGV2ZW50IGxpc3RlbmVycy5cbiAgICAgKi9cbiAgICByZXNldCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXNbZWxlbWVudENvdW50U3ltXSA8PSAwKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBkb2N1bWVudC5ib2R5LnF1ZXJ5U2VsZWN0b3JBbGwoJyonKSkge1xuICAgICAgICAgICAgaWYgKHRoaXNbZWxlbWVudENvdW50U3ltXSA8PSAwKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjb25zdCB0cmlnZ2VycyA9IHRoaXNbdHJpZ2dlck1hcFN5bV0uZ2V0KGVsZW1lbnQpO1xuICAgICAgICAgICAgaWYgKHRyaWdnZXJzICE9IG51bGwpIHsgdGhpc1tlbGVtZW50Q291bnRTeW1dLS07IH1cblxuICAgICAgICAgICAgZm9yIChjb25zdCB0cmlnZ2VyIG9mIHRyaWdnZXJzIHx8IFtdKVxuICAgICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0cmlnZ2VyLCBvbldNTFRyaWdnZXJlZCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzW3RyaWdnZXJNYXBTeW1dID0gbmV3IFdlYWtNYXAoKTtcbiAgICAgICAgdGhpc1tlbGVtZW50Q291bnRTeW1dID0gMDtcbiAgICB9XG59XG5cbmNvbnN0IHRyaWdnZXJSZWdpc3RyeSA9IGNhbkFib3J0TGlzdGVuZXJzKCkgPyBuZXcgQWJvcnRDb250cm9sbGVyUmVnaXN0cnkoKSA6IG5ldyBXZWFrTWFwUmVnaXN0cnkoKTtcblxuLyoqXG4gKiBBZGRzIGV2ZW50IGxpc3RlbmVycyB0byB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuXG4gKi9cbmZ1bmN0aW9uIGFkZFdNTExpc3RlbmVycyhlbGVtZW50OiBFbGVtZW50KTogdm9pZCB7XG4gICAgY29uc3QgdHJpZ2dlclJlZ0V4cCA9IC9cXFMrL2c7XG4gICAgY29uc3QgdHJpZ2dlckF0dHIgPSAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3dtbC10cmlnZ2VyJykgfHwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtd21sLXRyaWdnZXInKSB8fCBcImNsaWNrXCIpO1xuICAgIGNvbnN0IHRyaWdnZXJzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgbGV0IG1hdGNoO1xuICAgIHdoaWxlICgobWF0Y2ggPSB0cmlnZ2VyUmVnRXhwLmV4ZWModHJpZ2dlckF0dHIpKSAhPT0gbnVsbClcbiAgICAgICAgdHJpZ2dlcnMucHVzaChtYXRjaFswXSk7XG5cbiAgICBjb25zdCBvcHRpb25zID0gdHJpZ2dlclJlZ2lzdHJ5LnNldChlbGVtZW50LCB0cmlnZ2Vycyk7XG4gICAgZm9yIChjb25zdCB0cmlnZ2VyIG9mIHRyaWdnZXJzKVxuICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIodHJpZ2dlciwgb25XTUxUcmlnZ2VyZWQsIG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIFNjaGVkdWxlcyBhbiBhdXRvbWF0aWMgcmVsb2FkIG9mIFdNTCB0byBiZSBwZXJmb3JtZWQgYXMgc29vbiBhcyB0aGUgZG9jdW1lbnQgaXMgZnVsbHkgbG9hZGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gRW5hYmxlKCk6IHZvaWQge1xuICAgIHdoZW5SZWFkeShSZWxvYWQpO1xufVxuXG4vKipcbiAqIFJlbG9hZHMgdGhlIFdNTCBwYWdlIGJ5IGFkZGluZyBuZWNlc3NhcnkgZXZlbnQgbGlzdGVuZXJzIGFuZCBicm93c2VyIGxpc3RlbmVycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFJlbG9hZCgpOiB2b2lkIHtcbiAgICB0cmlnZ2VyUmVnaXN0cnkucmVzZXQoKTtcbiAgICBkb2N1bWVudC5ib2R5LnF1ZXJ5U2VsZWN0b3JBbGwoJ1t3bWwtZXZlbnRdLCBbd21sLXdpbmRvd10sIFt3bWwtb3BlbnVybF0sIFtkYXRhLXdtbC1ldmVudF0sIFtkYXRhLXdtbC13aW5kb3ddLCBbZGF0YS13bWwtb3BlbnVybF0nKS5mb3JFYWNoKGFkZFdNTExpc3RlbmVycyk7XG59XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbmltcG9ydCB7IG5ld1J1bnRpbWVDYWxsZXIsIG9iamVjdE5hbWVzIH0gZnJvbSBcIi4vcnVudGltZS5qc1wiO1xuXG5jb25zdCBjYWxsID0gbmV3UnVudGltZUNhbGxlcihvYmplY3ROYW1lcy5Ccm93c2VyKTtcblxuY29uc3QgQnJvd3Nlck9wZW5VUkwgPSAwO1xuXG4vKipcbiAqIE9wZW4gYSBicm93c2VyIHdpbmRvdyB0byB0aGUgZ2l2ZW4gVVJMLlxuICpcbiAqIEBwYXJhbSB1cmwgLSBUaGUgVVJMIHRvIG9wZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE9wZW5VUkwodXJsOiBzdHJpbmcgfCBVUkwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gY2FsbChCcm93c2VyT3BlblVSTCwge3VybDogdXJsLnRvU3RyaW5nKCl9KTtcbn1cbiIsICIvLyBTb3VyY2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9haS9uYW5vaWRcblxuLy8gVGhlIE1JVCBMaWNlbnNlIChNSVQpXG4vL1xuLy8gQ29weXJpZ2h0IDIwMTcgQW5kcmV5IFNpdG5payA8YW5kcmV5QHNpdG5pay5ydT5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mXG4vLyB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluXG4vLyB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvXG4vLyB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZlxuLy8gdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLFxuLy8gICAgIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vICAgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbi8vIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gICAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTXG4vLyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1Jcbi8vIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUlxuLy8gSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU5cbi8vIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIFRoaXMgYWxwaGFiZXQgdXNlcyBgQS1aYS16MC05Xy1gIHN5bWJvbHMuXG4vLyBUaGUgb3JkZXIgb2YgY2hhcmFjdGVycyBpcyBvcHRpbWl6ZWQgZm9yIGJldHRlciBnemlwIGFuZCBicm90bGkgY29tcHJlc3Npb24uXG4vLyBSZWZlcmVuY2VzIHRvIHRoZSBzYW1lIGZpbGUgKHdvcmtzIGJvdGggZm9yIGd6aXAgYW5kIGJyb3RsaSk6XG4vLyBgJ3VzZWAsIGBhbmRvbWAsIGFuZCBgcmljdCdgXG4vLyBSZWZlcmVuY2VzIHRvIHRoZSBicm90bGkgZGVmYXVsdCBkaWN0aW9uYXJ5OlxuLy8gYC0yNlRgLCBgMTk4M2AsIGA0MHB4YCwgYDc1cHhgLCBgYnVzaGAsIGBqYWNrYCwgYG1pbmRgLCBgdmVyeWAsIGFuZCBgd29sZmBcbmNvbnN0IHVybEFscGhhYmV0ID1cbiAgICAndXNlYW5kb20tMjZUMTk4MzQwUFg3NXB4SkFDS1ZFUllNSU5EQlVTSFdPTEZfR1FaYmZnaGprbHF2d3l6cmljdCdcblxuZXhwb3J0IGZ1bmN0aW9uIG5hbm9pZChzaXplOiBudW1iZXIgPSAyMSk6IHN0cmluZyB7XG4gICAgbGV0IGlkID0gJydcbiAgICAvLyBBIGNvbXBhY3QgYWx0ZXJuYXRpdmUgZm9yIGBmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXA7IGkrKylgLlxuICAgIGxldCBpID0gc2l6ZSB8IDBcbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgIC8vIGB8IDBgIGlzIG1vcmUgY29tcGFjdCBhbmQgZmFzdGVyIHRoYW4gYE1hdGguZmxvb3IoKWAuXG4gICAgICAgIGlkICs9IHVybEFscGhhYmV0WyhNYXRoLnJhbmRvbSgpICogNjQpIHwgMF1cbiAgICB9XG4gICAgcmV0dXJuIGlkXG59XG4iLCAiLypcbiBfICAgICBfXyAgICAgXyBfX1xufCB8ICAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbmltcG9ydCB7IG5hbm9pZCB9IGZyb20gJy4vbmFub2lkLmpzJztcblxuY29uc3QgcnVudGltZVVSTCA9IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4gKyBcIi93YWlscy9ydW50aW1lXCI7XG5cbi8vIE9iamVjdCBOYW1lc1xuZXhwb3J0IGNvbnN0IG9iamVjdE5hbWVzID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgQ2FsbDogMCxcbiAgICBDbGlwYm9hcmQ6IDEsXG4gICAgQXBwbGljYXRpb246IDIsXG4gICAgRXZlbnRzOiAzLFxuICAgIENvbnRleHRNZW51OiA0LFxuICAgIERpYWxvZzogNSxcbiAgICBXaW5kb3c6IDYsXG4gICAgU2NyZWVuczogNyxcbiAgICBTeXN0ZW06IDgsXG4gICAgQnJvd3NlcjogOSxcbiAgICBDYW5jZWxDYWxsOiAxMCxcbn0pO1xuZXhwb3J0IGxldCBjbGllbnRJZCA9IG5hbm9pZCgpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgcnVudGltZSBjYWxsZXIgd2l0aCBzcGVjaWZpZWQgSUQuXG4gKlxuICogQHBhcmFtIG9iamVjdCAtIFRoZSBvYmplY3QgdG8gaW52b2tlIHRoZSBtZXRob2Qgb24uXG4gKiBAcGFyYW0gd2luZG93TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB3aW5kb3cuXG4gKiBAcmV0dXJuIFRoZSBuZXcgcnVudGltZSBjYWxsZXIgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuZXdSdW50aW1lQ2FsbGVyKG9iamVjdDogbnVtYmVyLCB3aW5kb3dOYW1lOiBzdHJpbmcgPSAnJykge1xuICAgIHJldHVybiBmdW5jdGlvbiAobWV0aG9kOiBudW1iZXIsIGFyZ3M6IGFueSA9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHJ1bnRpbWVDYWxsV2l0aElEKG9iamVjdCwgbWV0aG9kLCB3aW5kb3dOYW1lLCBhcmdzKTtcbiAgICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW50aW1lQ2FsbFdpdGhJRChvYmplY3RJRDogbnVtYmVyLCBtZXRob2Q6IG51bWJlciwgd2luZG93TmFtZTogc3RyaW5nLCBhcmdzOiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgIGxldCB1cmwgPSBuZXcgVVJMKHJ1bnRpbWVVUkwpO1xuICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKFwib2JqZWN0XCIsIG9iamVjdElELnRvU3RyaW5nKCkpO1xuICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKFwibWV0aG9kXCIsIG1ldGhvZC50b1N0cmluZygpKTtcbiAgICBpZiAoYXJncykgeyB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChcImFyZ3NcIiwgSlNPTi5zdHJpbmdpZnkoYXJncykpOyB9XG5cbiAgICBsZXQgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgW1wieC13YWlscy1jbGllbnQtaWRcIl06IGNsaWVudElkXG4gICAgfVxuICAgIGlmICh3aW5kb3dOYW1lKSB7XG4gICAgICAgIGhlYWRlcnNbXCJ4LXdhaWxzLXdpbmRvdy1uYW1lXCJdID0gd2luZG93TmFtZTtcbiAgICB9XG5cbiAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHsgaGVhZGVycyB9KTtcbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihhd2FpdCByZXNwb25zZS50ZXh0KCkpO1xuICAgIH1cblxuICAgIGlmICgocmVzcG9uc2UuaGVhZGVycy5nZXQoXCJDb250ZW50LVR5cGVcIik/LmluZGV4T2YoXCJhcHBsaWNhdGlvbi9qc29uXCIpID8/IC0xKSAhPT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcmVzcG9uc2UudGV4dCgpO1xuICAgIH1cbn1cbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuaW1wb3J0IHtuZXdSdW50aW1lQ2FsbGVyLCBvYmplY3ROYW1lc30gZnJvbSBcIi4vcnVudGltZS5qc1wiO1xuaW1wb3J0IHsgbmFub2lkIH0gZnJvbSAnLi9uYW5vaWQuanMnO1xuXG4vLyBzZXR1cFxud2luZG93Ll93YWlscyA9IHdpbmRvdy5fd2FpbHMgfHwge307XG53aW5kb3cuX3dhaWxzLmRpYWxvZ0Vycm9yQ2FsbGJhY2sgPSBkaWFsb2dFcnJvckNhbGxiYWNrO1xud2luZG93Ll93YWlscy5kaWFsb2dSZXN1bHRDYWxsYmFjayA9IGRpYWxvZ1Jlc3VsdENhbGxiYWNrO1xuXG50eXBlIFByb21pc2VSZXNvbHZlcnMgPSBPbWl0PFByb21pc2VXaXRoUmVzb2x2ZXJzPGFueT4sIFwicHJvbWlzZVwiPjtcblxuY29uc3QgY2FsbCA9IG5ld1J1bnRpbWVDYWxsZXIob2JqZWN0TmFtZXMuRGlhbG9nKTtcbmNvbnN0IGRpYWxvZ1Jlc3BvbnNlcyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlUmVzb2x2ZXJzPigpO1xuXG4vLyBEZWZpbmUgY29uc3RhbnRzIGZyb20gdGhlIGBtZXRob2RzYCBvYmplY3QgaW4gVGl0bGUgQ2FzZVxuY29uc3QgRGlhbG9nSW5mbyA9IDA7XG5jb25zdCBEaWFsb2dXYXJuaW5nID0gMTtcbmNvbnN0IERpYWxvZ0Vycm9yID0gMjtcbmNvbnN0IERpYWxvZ1F1ZXN0aW9uID0gMztcbmNvbnN0IERpYWxvZ09wZW5GaWxlID0gNDtcbmNvbnN0IERpYWxvZ1NhdmVGaWxlID0gNTtcblxuZXhwb3J0IGludGVyZmFjZSBPcGVuRmlsZURpYWxvZ09wdGlvbnMge1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgZGlyZWN0b3JpZXMgY2FuIGJlIGNob3Nlbi4gKi9cbiAgICBDYW5DaG9vc2VEaXJlY3Rvcmllcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBmaWxlcyBjYW4gYmUgY2hvc2VuLiAqL1xuICAgIENhbkNob29zZUZpbGVzPzogYm9vbGVhbjtcbiAgICAvKiogSW5kaWNhdGVzIGlmIGRpcmVjdG9yaWVzIGNhbiBiZSBjcmVhdGVkLiAqL1xuICAgIENhbkNyZWF0ZURpcmVjdG9yaWVzPzogYm9vbGVhbjtcbiAgICAvKiogSW5kaWNhdGVzIGlmIGhpZGRlbiBmaWxlcyBzaG91bGQgYmUgc2hvd24uICovXG4gICAgU2hvd0hpZGRlbkZpbGVzPzogYm9vbGVhbjtcbiAgICAvKiogSW5kaWNhdGVzIGlmIGFsaWFzZXMgc2hvdWxkIGJlIHJlc29sdmVkLiAqL1xuICAgIFJlc29sdmVzQWxpYXNlcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBtdWx0aXBsZSBzZWxlY3Rpb24gaXMgYWxsb3dlZC4gKi9cbiAgICBBbGxvd3NNdWx0aXBsZVNlbGVjdGlvbj86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiB0aGUgZXh0ZW5zaW9uIHNob3VsZCBiZSBoaWRkZW4uICovXG4gICAgSGlkZUV4dGVuc2lvbj86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBoaWRkZW4gZXh0ZW5zaW9ucyBjYW4gYmUgc2VsZWN0ZWQuICovXG4gICAgQ2FuU2VsZWN0SGlkZGVuRXh0ZW5zaW9uPzogYm9vbGVhbjtcbiAgICAvKiogSW5kaWNhdGVzIGlmIGZpbGUgcGFja2FnZXMgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgZGlyZWN0b3JpZXMuICovXG4gICAgVHJlYXRzRmlsZVBhY2thZ2VzQXNEaXJlY3Rvcmllcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBvdGhlciBmaWxlIHR5cGVzIGFyZSBhbGxvd2VkLiAqL1xuICAgIEFsbG93c090aGVyRmlsZXR5cGVzPzogYm9vbGVhbjtcbiAgICAvKiogQXJyYXkgb2YgZmlsZSBmaWx0ZXJzLiAqL1xuICAgIEZpbHRlcnM/OiBGaWxlRmlsdGVyW107XG4gICAgLyoqIFRpdGxlIG9mIHRoZSBkaWFsb2cuICovXG4gICAgVGl0bGU/OiBzdHJpbmc7XG4gICAgLyoqIE1lc3NhZ2UgdG8gc2hvdyBpbiB0aGUgZGlhbG9nLiAqL1xuICAgIE1lc3NhZ2U/OiBzdHJpbmc7XG4gICAgLyoqIFRleHQgdG8gZGlzcGxheSBvbiB0aGUgYnV0dG9uLiAqL1xuICAgIEJ1dHRvblRleHQ/OiBzdHJpbmc7XG4gICAgLyoqIERpcmVjdG9yeSB0byBvcGVuIGluIHRoZSBkaWFsb2cuICovXG4gICAgRGlyZWN0b3J5Pzogc3RyaW5nO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgdGhlIGRpYWxvZyBzaG91bGQgYXBwZWFyIGRldGFjaGVkIGZyb20gdGhlIG1haW4gd2luZG93LiAqL1xuICAgIERldGFjaGVkPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTYXZlRmlsZURpYWxvZ09wdGlvbnMge1xuICAgIC8qKiBEZWZhdWx0IGZpbGVuYW1lIHRvIHVzZSBpbiB0aGUgZGlhbG9nLiAqL1xuICAgIEZpbGVuYW1lPzogc3RyaW5nO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgZGlyZWN0b3JpZXMgY2FuIGJlIGNob3Nlbi4gKi9cbiAgICBDYW5DaG9vc2VEaXJlY3Rvcmllcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBmaWxlcyBjYW4gYmUgY2hvc2VuLiAqL1xuICAgIENhbkNob29zZUZpbGVzPzogYm9vbGVhbjtcbiAgICAvKiogSW5kaWNhdGVzIGlmIGRpcmVjdG9yaWVzIGNhbiBiZSBjcmVhdGVkLiAqL1xuICAgIENhbkNyZWF0ZURpcmVjdG9yaWVzPzogYm9vbGVhbjtcbiAgICAvKiogSW5kaWNhdGVzIGlmIGhpZGRlbiBmaWxlcyBzaG91bGQgYmUgc2hvd24uICovXG4gICAgU2hvd0hpZGRlbkZpbGVzPzogYm9vbGVhbjtcbiAgICAvKiogSW5kaWNhdGVzIGlmIGFsaWFzZXMgc2hvdWxkIGJlIHJlc29sdmVkLiAqL1xuICAgIFJlc29sdmVzQWxpYXNlcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiB0aGUgZXh0ZW5zaW9uIHNob3VsZCBiZSBoaWRkZW4uICovXG4gICAgSGlkZUV4dGVuc2lvbj86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBoaWRkZW4gZXh0ZW5zaW9ucyBjYW4gYmUgc2VsZWN0ZWQuICovXG4gICAgQ2FuU2VsZWN0SGlkZGVuRXh0ZW5zaW9uPzogYm9vbGVhbjtcbiAgICAvKiogSW5kaWNhdGVzIGlmIGZpbGUgcGFja2FnZXMgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgZGlyZWN0b3JpZXMuICovXG4gICAgVHJlYXRzRmlsZVBhY2thZ2VzQXNEaXJlY3Rvcmllcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBvdGhlciBmaWxlIHR5cGVzIGFyZSBhbGxvd2VkLiAqL1xuICAgIEFsbG93c090aGVyRmlsZXR5cGVzPzogYm9vbGVhbjtcbiAgICAvKiogQXJyYXkgb2YgZmlsZSBmaWx0ZXJzLiAqL1xuICAgIEZpbHRlcnM/OiBGaWxlRmlsdGVyW107XG4gICAgLyoqIFRpdGxlIG9mIHRoZSBkaWFsb2cuICovXG4gICAgVGl0bGU/OiBzdHJpbmc7XG4gICAgLyoqIE1lc3NhZ2UgdG8gc2hvdyBpbiB0aGUgZGlhbG9nLiAqL1xuICAgIE1lc3NhZ2U/OiBzdHJpbmc7XG4gICAgLyoqIFRleHQgdG8gZGlzcGxheSBvbiB0aGUgYnV0dG9uLiAqL1xuICAgIEJ1dHRvblRleHQ/OiBzdHJpbmc7XG4gICAgLyoqIERpcmVjdG9yeSB0byBvcGVuIGluIHRoZSBkaWFsb2cuICovXG4gICAgRGlyZWN0b3J5Pzogc3RyaW5nO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgdGhlIGRpYWxvZyBzaG91bGQgYXBwZWFyIGRldGFjaGVkIGZyb20gdGhlIG1haW4gd2luZG93LiAqL1xuICAgIERldGFjaGVkPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNZXNzYWdlRGlhbG9nT3B0aW9ucyB7XG4gICAgLyoqIFRoZSB0aXRsZSBvZiB0aGUgZGlhbG9nIHdpbmRvdy4gKi9cbiAgICBUaXRsZT86IHN0cmluZztcbiAgICAvKiogVGhlIG1haW4gbWVzc2FnZSB0byBzaG93IGluIHRoZSBkaWFsb2cuICovXG4gICAgTWVzc2FnZT86IHN0cmluZztcbiAgICAvKiogQXJyYXkgb2YgYnV0dG9uIG9wdGlvbnMgdG8gc2hvdyBpbiB0aGUgZGlhbG9nLiAqL1xuICAgIEJ1dHRvbnM/OiBCdXR0b25bXTtcbiAgICAvKiogVHJ1ZSBpZiB0aGUgZGlhbG9nIHNob3VsZCBhcHBlYXIgZGV0YWNoZWQgZnJvbSB0aGUgbWFpbiB3aW5kb3cgKGlmIGFwcGxpY2FibGUpLiAqL1xuICAgIERldGFjaGVkPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCdXR0b24ge1xuICAgIC8qKiBUZXh0IHRoYXQgYXBwZWFycyB3aXRoaW4gdGhlIGJ1dHRvbi4gKi9cbiAgICBMYWJlbD86IHN0cmluZztcbiAgICAvKiogVHJ1ZSBpZiB0aGUgYnV0dG9uIHNob3VsZCBjYW5jZWwgYW4gb3BlcmF0aW9uIHdoZW4gY2xpY2tlZC4gKi9cbiAgICBJc0NhbmNlbD86IGJvb2xlYW47XG4gICAgLyoqIFRydWUgaWYgdGhlIGJ1dHRvbiBzaG91bGQgYmUgdGhlIGRlZmF1bHQgYWN0aW9uIHdoZW4gdGhlIHVzZXIgcHJlc3NlcyBlbnRlci4gKi9cbiAgICBJc0RlZmF1bHQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVGaWx0ZXIge1xuICAgIC8qKiBEaXNwbGF5IG5hbWUgZm9yIHRoZSBmaWx0ZXIsIGl0IGNvdWxkIGJlIFwiVGV4dCBGaWxlc1wiLCBcIkltYWdlc1wiIGV0Yy4gKi9cbiAgICBEaXNwbGF5TmFtZT86IHN0cmluZztcbiAgICAvKiogUGF0dGVybiB0byBtYXRjaCBmb3IgdGhlIGZpbHRlciwgZS5nLiBcIioudHh0OyoubWRcIiBmb3IgdGV4dCBtYXJrZG93biBmaWxlcy4gKi9cbiAgICBQYXR0ZXJuPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEhhbmRsZXMgdGhlIHJlc3VsdCBvZiBhIGRpYWxvZyByZXF1ZXN0LlxuICpcbiAqIEBwYXJhbSBpZCAtIFRoZSBpZCBvZiB0aGUgcmVxdWVzdCB0byBoYW5kbGUgdGhlIHJlc3VsdCBmb3IuXG4gKiBAcGFyYW0gZGF0YSAtIFRoZSByZXN1bHQgZGF0YSBvZiB0aGUgcmVxdWVzdC5cbiAqIEBwYXJhbSBpc0pTT04gLSBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZGF0YSBpcyBKU09OIG9yIG5vdC5cbiAqL1xuZnVuY3Rpb24gZGlhbG9nUmVzdWx0Q2FsbGJhY2soaWQ6IHN0cmluZywgZGF0YTogc3RyaW5nLCBpc0pTT046IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBsZXQgcmVzb2x2ZXJzID0gZ2V0QW5kRGVsZXRlUmVzcG9uc2UoaWQpO1xuICAgIGlmICghcmVzb2x2ZXJzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaXNKU09OKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXNvbHZlcnMucmVzb2x2ZShKU09OLnBhcnNlKGRhdGEpKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgICAgIHJlc29sdmVycy5yZWplY3QobmV3IFR5cGVFcnJvcihcImNvdWxkIG5vdCBwYXJzZSByZXN1bHQ6IFwiICsgZXJyLm1lc3NhZ2UsIHsgY2F1c2U6IGVyciB9KSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICByZXNvbHZlcnMucmVzb2x2ZShkYXRhKTtcbiAgICB9XG59XG5cbi8qKlxuICogSGFuZGxlcyB0aGUgZXJyb3IgZnJvbSBhIGRpYWxvZyByZXF1ZXN0LlxuICpcbiAqIEBwYXJhbSBpZCAtIFRoZSBpZCBvZiB0aGUgcHJvbWlzZSBoYW5kbGVyLlxuICogQHBhcmFtIG1lc3NhZ2UgLSBBbiBlcnJvciBtZXNzYWdlLlxuICovXG5mdW5jdGlvbiBkaWFsb2dFcnJvckNhbGxiYWNrKGlkOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgIGdldEFuZERlbGV0ZVJlc3BvbnNlKGlkKT8ucmVqZWN0KG5ldyB3aW5kb3cuRXJyb3IobWVzc2FnZSkpO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyBhbmQgcmVtb3ZlcyB0aGUgcmVzcG9uc2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBJRCBmcm9tIHRoZSBkaWFsb2dSZXNwb25zZXMgbWFwLlxuICpcbiAqIEBwYXJhbSBpZCAtIFRoZSBJRCBvZiB0aGUgcmVzcG9uc2UgdG8gYmUgcmV0cmlldmVkIGFuZCByZW1vdmVkLlxuICogQHJldHVybnMgVGhlIHJlc3BvbnNlIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIElELCBpZiBhbnkuXG4gKi9cbmZ1bmN0aW9uIGdldEFuZERlbGV0ZVJlc3BvbnNlKGlkOiBzdHJpbmcpOiBQcm9taXNlUmVzb2x2ZXJzIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZXNwb25zZSA9IGRpYWxvZ1Jlc3BvbnNlcy5nZXQoaWQpO1xuICAgIGRpYWxvZ1Jlc3BvbnNlcy5kZWxldGUoaWQpO1xuICAgIHJldHVybiByZXNwb25zZTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSB1bmlxdWUgSUQgdXNpbmcgdGhlIG5hbm9pZCBsaWJyYXJ5LlxuICpcbiAqIEByZXR1cm5zIEEgdW5pcXVlIElEIHRoYXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGRpYWxvZ1Jlc3BvbnNlcyBzZXQuXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlSUQoKTogc3RyaW5nIHtcbiAgICBsZXQgcmVzdWx0O1xuICAgIGRvIHtcbiAgICAgICAgcmVzdWx0ID0gbmFub2lkKCk7XG4gICAgfSB3aGlsZSAoZGlhbG9nUmVzcG9uc2VzLmhhcyhyZXN1bHQpKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFByZXNlbnRzIGEgZGlhbG9nIG9mIHNwZWNpZmllZCB0eXBlIHdpdGggdGhlIGdpdmVuIG9wdGlvbnMuXG4gKlxuICogQHBhcmFtIHR5cGUgLSBEaWFsb2cgdHlwZS5cbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyBmb3IgdGhlIGRpYWxvZy5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggcmVzdWx0IG9mIGRpYWxvZy5cbiAqL1xuZnVuY3Rpb24gZGlhbG9nKHR5cGU6IG51bWJlciwgb3B0aW9uczogTWVzc2FnZURpYWxvZ09wdGlvbnMgfCBPcGVuRmlsZURpYWxvZ09wdGlvbnMgfCBTYXZlRmlsZURpYWxvZ09wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgaWQgPSBnZW5lcmF0ZUlEKCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgZGlhbG9nUmVzcG9uc2VzLnNldChpZCwgeyByZXNvbHZlLCByZWplY3QgfSk7XG4gICAgICAgIGNhbGwodHlwZSwgT2JqZWN0LmFzc2lnbih7IFwiZGlhbG9nLWlkXCI6IGlkIH0sIG9wdGlvbnMpKS5jYXRjaCgoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGRpYWxvZ1Jlc3BvbnNlcy5kZWxldGUoaWQpO1xuICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIFByZXNlbnRzIGFuIGluZm8gZGlhbG9nLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gRGlhbG9nIG9wdGlvbnNcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGxhYmVsIG9mIHRoZSBjaG9zZW4gYnV0dG9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSW5mbyhvcHRpb25zOiBNZXNzYWdlRGlhbG9nT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7IHJldHVybiBkaWFsb2coRGlhbG9nSW5mbywgb3B0aW9ucyk7IH1cblxuLyoqXG4gKiBQcmVzZW50cyBhIHdhcm5pbmcgZGlhbG9nLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gRGlhbG9nIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBsYWJlbCBvZiB0aGUgY2hvc2VuIGJ1dHRvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFdhcm5pbmcob3B0aW9uczogTWVzc2FnZURpYWxvZ09wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4geyByZXR1cm4gZGlhbG9nKERpYWxvZ1dhcm5pbmcsIG9wdGlvbnMpOyB9XG5cbi8qKlxuICogUHJlc2VudHMgYW4gZXJyb3IgZGlhbG9nLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gRGlhbG9nIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBsYWJlbCBvZiB0aGUgY2hvc2VuIGJ1dHRvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEVycm9yKG9wdGlvbnM6IE1lc3NhZ2VEaWFsb2dPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHsgcmV0dXJuIGRpYWxvZyhEaWFsb2dFcnJvciwgb3B0aW9ucyk7IH1cblxuLyoqXG4gKiBQcmVzZW50cyBhIHF1ZXN0aW9uIGRpYWxvZy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIERpYWxvZyBvcHRpb25zLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgbGFiZWwgb2YgdGhlIGNob3NlbiBidXR0b24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBRdWVzdGlvbihvcHRpb25zOiBNZXNzYWdlRGlhbG9nT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7IHJldHVybiBkaWFsb2coRGlhbG9nUXVlc3Rpb24sIG9wdGlvbnMpOyB9XG5cbi8qKlxuICogUHJlc2VudHMgYSBmaWxlIHNlbGVjdGlvbiBkaWFsb2cgdG8gcGljayBvbmUgb3IgbW9yZSBmaWxlcyB0byBvcGVuLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gRGlhbG9nIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBTZWxlY3RlZCBmaWxlIG9yIGxpc3Qgb2YgZmlsZXMsIG9yIGEgYmxhbmsgc3RyaW5nL2VtcHR5IGxpc3QgaWYgbm8gZmlsZSBoYXMgYmVlbiBzZWxlY3RlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE9wZW5GaWxlKG9wdGlvbnM6IE9wZW5GaWxlRGlhbG9nT3B0aW9ucyAmIHsgQWxsb3dzTXVsdGlwbGVTZWxlY3Rpb246IHRydWUgfSk6IFByb21pc2U8c3RyaW5nW10+O1xuZXhwb3J0IGZ1bmN0aW9uIE9wZW5GaWxlKG9wdGlvbnM6IE9wZW5GaWxlRGlhbG9nT3B0aW9ucyAmIHsgQWxsb3dzTXVsdGlwbGVTZWxlY3Rpb24/OiBmYWxzZSB8IHVuZGVmaW5lZCB9KTogUHJvbWlzZTxzdHJpbmc+O1xuZXhwb3J0IGZ1bmN0aW9uIE9wZW5GaWxlKG9wdGlvbnM6IE9wZW5GaWxlRGlhbG9nT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nIHwgc3RyaW5nW10+O1xuZXhwb3J0IGZ1bmN0aW9uIE9wZW5GaWxlKG9wdGlvbnM6IE9wZW5GaWxlRGlhbG9nT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nIHwgc3RyaW5nW10+IHsgcmV0dXJuIGRpYWxvZyhEaWFsb2dPcGVuRmlsZSwgb3B0aW9ucykgPz8gW107IH1cblxuLyoqXG4gKiBQcmVzZW50cyBhIGZpbGUgc2VsZWN0aW9uIGRpYWxvZyB0byBwaWNrIGEgZmlsZSB0byBzYXZlLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gRGlhbG9nIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBTZWxlY3RlZCBmaWxlLCBvciBhIGJsYW5rIHN0cmluZyBpZiBubyBmaWxlIGhhcyBiZWVuIHNlbGVjdGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gU2F2ZUZpbGUob3B0aW9uczogU2F2ZUZpbGVEaWFsb2dPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHsgcmV0dXJuIGRpYWxvZyhEaWFsb2dTYXZlRmlsZSwgb3B0aW9ucyk7IH1cbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuaW1wb3J0IHsgbmV3UnVudGltZUNhbGxlciwgb2JqZWN0TmFtZXMgfSBmcm9tIFwiLi9ydW50aW1lLmpzXCI7XG5pbXBvcnQgeyBldmVudExpc3RlbmVycywgTGlzdGVuZXIsIGxpc3RlbmVyT2ZmIH0gZnJvbSBcIi4vbGlzdGVuZXIuanNcIjtcblxuLy8gU2V0dXBcbndpbmRvdy5fd2FpbHMgPSB3aW5kb3cuX3dhaWxzIHx8IHt9O1xud2luZG93Ll93YWlscy5kaXNwYXRjaFdhaWxzRXZlbnQgPSBkaXNwYXRjaFdhaWxzRXZlbnQ7XG5cbmNvbnN0IGNhbGwgPSBuZXdSdW50aW1lQ2FsbGVyKG9iamVjdE5hbWVzLkV2ZW50cyk7XG5jb25zdCBFbWl0TWV0aG9kID0gMDtcblxuZXhwb3J0IHsgVHlwZXMgfSBmcm9tIFwiLi9ldmVudF90eXBlcy5qc1wiO1xuXG4vKipcbiAqIFRoZSB0eXBlIG9mIGhhbmRsZXJzIGZvciBhIGdpdmVuIGV2ZW50LlxuICovXG5leHBvcnQgdHlwZSBDYWxsYmFjayA9IChldjogV2FpbHNFdmVudCkgPT4gdm9pZDtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgc3lzdGVtIGV2ZW50IG9yIGEgY3VzdG9tIGV2ZW50IGVtaXR0ZWQgdGhyb3VnaCB3YWlscy1wcm92aWRlZCBmYWNpbGl0aWVzLlxuICovXG5leHBvcnQgY2xhc3MgV2FpbHNFdmVudCB7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIE9wdGlvbmFsIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbWl0dGVkIGV2ZW50LlxuICAgICAqL1xuICAgIGRhdGE6IGFueTtcblxuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgdGhlIG9yaWdpbmF0aW5nIHdpbmRvdy4gT21pdHRlZCBmb3IgYXBwbGljYXRpb24gZXZlbnRzLlxuICAgICAqIFdpbGwgYmUgb3ZlcnJpZGRlbiBpZiBzZXQgbWFudWFsbHkuXG4gICAgICovXG4gICAgc2VuZGVyPzogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCBkYXRhOiBhbnkgPSBudWxsKSB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkaXNwYXRjaFdhaWxzRXZlbnQoZXZlbnQ6IGFueSkge1xuICAgIGxldCBsaXN0ZW5lcnMgPSBldmVudExpc3RlbmVycy5nZXQoZXZlbnQubmFtZSk7XG4gICAgaWYgKCFsaXN0ZW5lcnMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCB3YWlsc0V2ZW50ID0gbmV3IFdhaWxzRXZlbnQoZXZlbnQubmFtZSwgZXZlbnQuZGF0YSk7XG4gICAgaWYgKCdzZW5kZXInIGluIGV2ZW50KSB7XG4gICAgICAgIHdhaWxzRXZlbnQuc2VuZGVyID0gZXZlbnQuc2VuZGVyO1xuICAgIH1cblxuICAgIGxpc3RlbmVycyA9IGxpc3RlbmVycy5maWx0ZXIobGlzdGVuZXIgPT4gIWxpc3RlbmVyLmRpc3BhdGNoKHdhaWxzRXZlbnQpKTtcbiAgICBpZiAobGlzdGVuZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBldmVudExpc3RlbmVycy5kZWxldGUoZXZlbnQubmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZXZlbnRMaXN0ZW5lcnMuc2V0KGV2ZW50Lm5hbWUsIGxpc3RlbmVycyk7XG4gICAgfVxufVxuXG4vKipcbiAqIFJlZ2lzdGVyIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGZvciBhIHNwZWNpZmljIGV2ZW50LlxuICpcbiAqIEBwYXJhbSBldmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gcmVnaXN0ZXIgdGhlIGNhbGxiYWNrIGZvci5cbiAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlxuICogQHBhcmFtIG1heENhbGxiYWNrcyAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0aW1lcyB0aGUgY2FsbGJhY2sgY2FuIGJlIGNhbGxlZCBmb3IgdGhlIGV2ZW50LiBPbmNlIHRoZSBtYXhpbXVtIG51bWJlciBpcyByZWFjaGVkLCB0aGUgY2FsbGJhY2sgd2lsbCBubyBsb25nZXIgYmUgY2FsbGVkLlxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0LCB3aGVuIGNhbGxlZCwgd2lsbCB1bnJlZ2lzdGVyIHRoZSBjYWxsYmFjayBmcm9tIHRoZSBldmVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE9uTXVsdGlwbGUoZXZlbnROYW1lOiBzdHJpbmcsIGNhbGxiYWNrOiBDYWxsYmFjaywgbWF4Q2FsbGJhY2tzOiBudW1iZXIpIHtcbiAgICBsZXQgbGlzdGVuZXJzID0gZXZlbnRMaXN0ZW5lcnMuZ2V0KGV2ZW50TmFtZSkgfHwgW107XG4gICAgY29uc3QgdGhpc0xpc3RlbmVyID0gbmV3IExpc3RlbmVyKGV2ZW50TmFtZSwgY2FsbGJhY2ssIG1heENhbGxiYWNrcyk7XG4gICAgbGlzdGVuZXJzLnB1c2godGhpc0xpc3RlbmVyKTtcbiAgICBldmVudExpc3RlbmVycy5zZXQoZXZlbnROYW1lLCBsaXN0ZW5lcnMpO1xuICAgIHJldHVybiAoKSA9PiBsaXN0ZW5lck9mZih0aGlzTGlzdGVuZXIpO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIHNwZWNpZmllZCBldmVudCBvY2N1cnMuXG4gKlxuICogQHBhcmFtIGV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudCB0byByZWdpc3RlciB0aGUgY2FsbGJhY2sgZm9yLlxuICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQsIHdoZW4gY2FsbGVkLCB3aWxsIHVucmVnaXN0ZXIgdGhlIGNhbGxiYWNrIGZyb20gdGhlIGV2ZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gT24oZXZlbnROYW1lOiBzdHJpbmcsIGNhbGxiYWNrOiBDYWxsYmFjayk6ICgpID0+IHZvaWQge1xuICAgIHJldHVybiBPbk11bHRpcGxlKGV2ZW50TmFtZSwgY2FsbGJhY2ssIC0xKTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBvbmx5IG9uY2UgZm9yIHRoZSBzcGVjaWZpZWQgZXZlbnQuXG4gKlxuICogQHBhcmFtIGV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudCB0byByZWdpc3RlciB0aGUgY2FsbGJhY2sgZm9yLlxuICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQsIHdoZW4gY2FsbGVkLCB3aWxsIHVucmVnaXN0ZXIgdGhlIGNhbGxiYWNrIGZyb20gdGhlIGV2ZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gT25jZShldmVudE5hbWU6IHN0cmluZywgY2FsbGJhY2s6IENhbGxiYWNrKTogKCkgPT4gdm9pZCB7XG4gICAgcmV0dXJuIE9uTXVsdGlwbGUoZXZlbnROYW1lLCBjYWxsYmFjaywgMSk7XG59XG5cbi8qKlxuICogUmVtb3ZlcyBldmVudCBsaXN0ZW5lcnMgZm9yIHRoZSBzcGVjaWZpZWQgZXZlbnQgbmFtZXMuXG4gKlxuICogQHBhcmFtIGV2ZW50TmFtZXMgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnRzIHRvIHJlbW92ZSBsaXN0ZW5lcnMgZm9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gT2ZmKC4uLmV2ZW50TmFtZXM6IFtzdHJpbmcsIC4uLnN0cmluZ1tdXSk6IHZvaWQge1xuICAgIGV2ZW50TmFtZXMuZm9yRWFjaChldmVudE5hbWUgPT4gZXZlbnRMaXN0ZW5lcnMuZGVsZXRlKGV2ZW50TmFtZSkpO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgYWxsIGV2ZW50IGxpc3RlbmVycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE9mZkFsbCgpOiB2b2lkIHtcbiAgICBldmVudExpc3RlbmVycy5jbGVhcigpO1xufVxuXG4vKipcbiAqIEVtaXRzIHRoZSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0gZXZlbnQgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gZW1pdC5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgZnVsZmlsbGVkIG9uY2UgdGhlIGV2ZW50IGhhcyBiZWVuIGVtaXR0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFbWl0KGV2ZW50OiBXYWlsc0V2ZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIGNhbGwoRW1pdE1ldGhvZCwgZXZlbnQpO1xufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vLyBUaGUgZm9sbG93aW5nIHV0aWxpdGllcyBoYXZlIGJlZW4gZmFjdG9yZWQgb3V0IG9mIC4vZXZlbnRzLnRzXG4vLyBmb3IgdGVzdGluZyBwdXJwb3Nlcy5cblxuZXhwb3J0IGNvbnN0IGV2ZW50TGlzdGVuZXJzID0gbmV3IE1hcDxzdHJpbmcsIExpc3RlbmVyW10+KCk7XG5cbmV4cG9ydCBjbGFzcyBMaXN0ZW5lciB7XG4gICAgZXZlbnROYW1lOiBzdHJpbmc7XG4gICAgY2FsbGJhY2s6IChkYXRhOiBhbnkpID0+IHZvaWQ7XG4gICAgbWF4Q2FsbGJhY2tzOiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvcihldmVudE5hbWU6IHN0cmluZywgY2FsbGJhY2s6IChkYXRhOiBhbnkpID0+IHZvaWQsIG1heENhbGxiYWNrczogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuZXZlbnROYW1lID0gZXZlbnROYW1lO1xuICAgICAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgICAgIHRoaXMubWF4Q2FsbGJhY2tzID0gbWF4Q2FsbGJhY2tzIHx8IC0xO1xuICAgIH1cblxuICAgIGRpc3BhdGNoKGRhdGE6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5jYWxsYmFjayhkYXRhKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5tYXhDYWxsYmFja3MgPT09IC0xKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMubWF4Q2FsbGJhY2tzIC09IDE7XG4gICAgICAgIHJldHVybiB0aGlzLm1heENhbGxiYWNrcyA9PT0gMDtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsaXN0ZW5lck9mZihsaXN0ZW5lcjogTGlzdGVuZXIpOiB2b2lkIHtcbiAgICBsZXQgbGlzdGVuZXJzID0gZXZlbnRMaXN0ZW5lcnMuZ2V0KGxpc3RlbmVyLmV2ZW50TmFtZSk7XG4gICAgaWYgKCFsaXN0ZW5lcnMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxpc3RlbmVycyA9IGxpc3RlbmVycy5maWx0ZXIobCA9PiBsICE9PSBsaXN0ZW5lcik7XG4gICAgaWYgKGxpc3RlbmVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZXZlbnRMaXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyLmV2ZW50TmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZXZlbnRMaXN0ZW5lcnMuc2V0KGxpc3RlbmVyLmV2ZW50TmFtZSwgbGlzdGVuZXJzKTtcbiAgICB9XG59XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbi8vIEN5bmh5cmNod3lkIHkgZmZlaWwgaG9uIHluIGF3dG9tYXRpZy4gUEVJRElXQ0ggXHUwMEMyIE1PRElXTFxuLy8gVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkLiBETyBOT1QgRURJVFxuXG5leHBvcnQgY29uc3QgVHlwZXMgPSBPYmplY3QuZnJlZXplKHtcblx0V2luZG93czogT2JqZWN0LmZyZWV6ZSh7XG5cdFx0QVBNUG93ZXJTZXR0aW5nQ2hhbmdlOiBcIndpbmRvd3M6QVBNUG93ZXJTZXR0aW5nQ2hhbmdlXCIsXG5cdFx0QVBNUG93ZXJTdGF0dXNDaGFuZ2U6IFwid2luZG93czpBUE1Qb3dlclN0YXR1c0NoYW5nZVwiLFxuXHRcdEFQTVJlc3VtZUF1dG9tYXRpYzogXCJ3aW5kb3dzOkFQTVJlc3VtZUF1dG9tYXRpY1wiLFxuXHRcdEFQTVJlc3VtZVN1c3BlbmQ6IFwid2luZG93czpBUE1SZXN1bWVTdXNwZW5kXCIsXG5cdFx0QVBNU3VzcGVuZDogXCJ3aW5kb3dzOkFQTVN1c3BlbmRcIixcblx0XHRBcHBsaWNhdGlvblN0YXJ0ZWQ6IFwid2luZG93czpBcHBsaWNhdGlvblN0YXJ0ZWRcIixcblx0XHRTeXN0ZW1UaGVtZUNoYW5nZWQ6IFwid2luZG93czpTeXN0ZW1UaGVtZUNoYW5nZWRcIixcblx0XHRXZWJWaWV3TmF2aWdhdGlvbkNvbXBsZXRlZDogXCJ3aW5kb3dzOldlYlZpZXdOYXZpZ2F0aW9uQ29tcGxldGVkXCIsXG5cdFx0V2luZG93QWN0aXZlOiBcIndpbmRvd3M6V2luZG93QWN0aXZlXCIsXG5cdFx0V2luZG93QmFja2dyb3VuZEVyYXNlOiBcIndpbmRvd3M6V2luZG93QmFja2dyb3VuZEVyYXNlXCIsXG5cdFx0V2luZG93Q2xpY2tBY3RpdmU6IFwid2luZG93czpXaW5kb3dDbGlja0FjdGl2ZVwiLFxuXHRcdFdpbmRvd0Nsb3Npbmc6IFwid2luZG93czpXaW5kb3dDbG9zaW5nXCIsXG5cdFx0V2luZG93RGlkTW92ZTogXCJ3aW5kb3dzOldpbmRvd0RpZE1vdmVcIixcblx0XHRXaW5kb3dEaWRSZXNpemU6IFwid2luZG93czpXaW5kb3dEaWRSZXNpemVcIixcblx0XHRXaW5kb3dEUElDaGFuZ2VkOiBcIndpbmRvd3M6V2luZG93RFBJQ2hhbmdlZFwiLFxuXHRcdFdpbmRvd0RyYWdEcm9wOiBcIndpbmRvd3M6V2luZG93RHJhZ0Ryb3BcIixcblx0XHRXaW5kb3dEcmFnRW50ZXI6IFwid2luZG93czpXaW5kb3dEcmFnRW50ZXJcIixcblx0XHRXaW5kb3dEcmFnTGVhdmU6IFwid2luZG93czpXaW5kb3dEcmFnTGVhdmVcIixcblx0XHRXaW5kb3dEcmFnT3ZlcjogXCJ3aW5kb3dzOldpbmRvd0RyYWdPdmVyXCIsXG5cdFx0V2luZG93RW5kTW92ZTogXCJ3aW5kb3dzOldpbmRvd0VuZE1vdmVcIixcblx0XHRXaW5kb3dFbmRSZXNpemU6IFwid2luZG93czpXaW5kb3dFbmRSZXNpemVcIixcblx0XHRXaW5kb3dGdWxsc2NyZWVuOiBcIndpbmRvd3M6V2luZG93RnVsbHNjcmVlblwiLFxuXHRcdFdpbmRvd0hpZGU6IFwid2luZG93czpXaW5kb3dIaWRlXCIsXG5cdFx0V2luZG93SW5hY3RpdmU6IFwid2luZG93czpXaW5kb3dJbmFjdGl2ZVwiLFxuXHRcdFdpbmRvd0tleURvd246IFwid2luZG93czpXaW5kb3dLZXlEb3duXCIsXG5cdFx0V2luZG93S2V5VXA6IFwid2luZG93czpXaW5kb3dLZXlVcFwiLFxuXHRcdFdpbmRvd0tpbGxGb2N1czogXCJ3aW5kb3dzOldpbmRvd0tpbGxGb2N1c1wiLFxuXHRcdFdpbmRvd05vbkNsaWVudEhpdDogXCJ3aW5kb3dzOldpbmRvd05vbkNsaWVudEhpdFwiLFxuXHRcdFdpbmRvd05vbkNsaWVudE1vdXNlRG93bjogXCJ3aW5kb3dzOldpbmRvd05vbkNsaWVudE1vdXNlRG93blwiLFxuXHRcdFdpbmRvd05vbkNsaWVudE1vdXNlTGVhdmU6IFwid2luZG93czpXaW5kb3dOb25DbGllbnRNb3VzZUxlYXZlXCIsXG5cdFx0V2luZG93Tm9uQ2xpZW50TW91c2VNb3ZlOiBcIndpbmRvd3M6V2luZG93Tm9uQ2xpZW50TW91c2VNb3ZlXCIsXG5cdFx0V2luZG93Tm9uQ2xpZW50TW91c2VVcDogXCJ3aW5kb3dzOldpbmRvd05vbkNsaWVudE1vdXNlVXBcIixcblx0XHRXaW5kb3dQYWludDogXCJ3aW5kb3dzOldpbmRvd1BhaW50XCIsXG5cdFx0V2luZG93UmVzdG9yZTogXCJ3aW5kb3dzOldpbmRvd1Jlc3RvcmVcIixcblx0XHRXaW5kb3dTZXRGb2N1czogXCJ3aW5kb3dzOldpbmRvd1NldEZvY3VzXCIsXG5cdFx0V2luZG93U2hvdzogXCJ3aW5kb3dzOldpbmRvd1Nob3dcIixcblx0XHRXaW5kb3dTdGFydE1vdmU6IFwid2luZG93czpXaW5kb3dTdGFydE1vdmVcIixcblx0XHRXaW5kb3dTdGFydFJlc2l6ZTogXCJ3aW5kb3dzOldpbmRvd1N0YXJ0UmVzaXplXCIsXG5cdFx0V2luZG93VW5GdWxsc2NyZWVuOiBcIndpbmRvd3M6V2luZG93VW5GdWxsc2NyZWVuXCIsXG5cdFx0V2luZG93Wk9yZGVyQ2hhbmdlZDogXCJ3aW5kb3dzOldpbmRvd1pPcmRlckNoYW5nZWRcIixcblx0XHRXaW5kb3dNaW5pbWlzZTogXCJ3aW5kb3dzOldpbmRvd01pbmltaXNlXCIsXG5cdFx0V2luZG93VW5NaW5pbWlzZTogXCJ3aW5kb3dzOldpbmRvd1VuTWluaW1pc2VcIixcblx0XHRXaW5kb3dNYXhpbWlzZTogXCJ3aW5kb3dzOldpbmRvd01heGltaXNlXCIsXG5cdFx0V2luZG93VW5NYXhpbWlzZTogXCJ3aW5kb3dzOldpbmRvd1VuTWF4aW1pc2VcIixcblx0fSksXG5cdE1hYzogT2JqZWN0LmZyZWV6ZSh7XG5cdFx0QXBwbGljYXRpb25EaWRCZWNvbWVBY3RpdmU6IFwibWFjOkFwcGxpY2F0aW9uRGlkQmVjb21lQWN0aXZlXCIsXG5cdFx0QXBwbGljYXRpb25EaWRDaGFuZ2VCYWNraW5nUHJvcGVydGllczogXCJtYWM6QXBwbGljYXRpb25EaWRDaGFuZ2VCYWNraW5nUHJvcGVydGllc1wiLFxuXHRcdEFwcGxpY2F0aW9uRGlkQ2hhbmdlRWZmZWN0aXZlQXBwZWFyYW5jZTogXCJtYWM6QXBwbGljYXRpb25EaWRDaGFuZ2VFZmZlY3RpdmVBcHBlYXJhbmNlXCIsXG5cdFx0QXBwbGljYXRpb25EaWRDaGFuZ2VJY29uOiBcIm1hYzpBcHBsaWNhdGlvbkRpZENoYW5nZUljb25cIixcblx0XHRBcHBsaWNhdGlvbkRpZENoYW5nZU9jY2x1c2lvblN0YXRlOiBcIm1hYzpBcHBsaWNhdGlvbkRpZENoYW5nZU9jY2x1c2lvblN0YXRlXCIsXG5cdFx0QXBwbGljYXRpb25EaWRDaGFuZ2VTY3JlZW5QYXJhbWV0ZXJzOiBcIm1hYzpBcHBsaWNhdGlvbkRpZENoYW5nZVNjcmVlblBhcmFtZXRlcnNcIixcblx0XHRBcHBsaWNhdGlvbkRpZENoYW5nZVN0YXR1c0JhckZyYW1lOiBcIm1hYzpBcHBsaWNhdGlvbkRpZENoYW5nZVN0YXR1c0JhckZyYW1lXCIsXG5cdFx0QXBwbGljYXRpb25EaWRDaGFuZ2VTdGF0dXNCYXJPcmllbnRhdGlvbjogXCJtYWM6QXBwbGljYXRpb25EaWRDaGFuZ2VTdGF0dXNCYXJPcmllbnRhdGlvblwiLFxuXHRcdEFwcGxpY2F0aW9uRGlkQ2hhbmdlVGhlbWU6IFwibWFjOkFwcGxpY2F0aW9uRGlkQ2hhbmdlVGhlbWVcIixcblx0XHRBcHBsaWNhdGlvbkRpZEZpbmlzaExhdW5jaGluZzogXCJtYWM6QXBwbGljYXRpb25EaWRGaW5pc2hMYXVuY2hpbmdcIixcblx0XHRBcHBsaWNhdGlvbkRpZEhpZGU6IFwibWFjOkFwcGxpY2F0aW9uRGlkSGlkZVwiLFxuXHRcdEFwcGxpY2F0aW9uRGlkUmVzaWduQWN0aXZlOiBcIm1hYzpBcHBsaWNhdGlvbkRpZFJlc2lnbkFjdGl2ZVwiLFxuXHRcdEFwcGxpY2F0aW9uRGlkVW5oaWRlOiBcIm1hYzpBcHBsaWNhdGlvbkRpZFVuaGlkZVwiLFxuXHRcdEFwcGxpY2F0aW9uRGlkVXBkYXRlOiBcIm1hYzpBcHBsaWNhdGlvbkRpZFVwZGF0ZVwiLFxuXHRcdEFwcGxpY2F0aW9uU2hvdWxkSGFuZGxlUmVvcGVuOiBcIm1hYzpBcHBsaWNhdGlvblNob3VsZEhhbmRsZVJlb3BlblwiLFxuXHRcdEFwcGxpY2F0aW9uV2lsbEJlY29tZUFjdGl2ZTogXCJtYWM6QXBwbGljYXRpb25XaWxsQmVjb21lQWN0aXZlXCIsXG5cdFx0QXBwbGljYXRpb25XaWxsRmluaXNoTGF1bmNoaW5nOiBcIm1hYzpBcHBsaWNhdGlvbldpbGxGaW5pc2hMYXVuY2hpbmdcIixcblx0XHRBcHBsaWNhdGlvbldpbGxIaWRlOiBcIm1hYzpBcHBsaWNhdGlvbldpbGxIaWRlXCIsXG5cdFx0QXBwbGljYXRpb25XaWxsUmVzaWduQWN0aXZlOiBcIm1hYzpBcHBsaWNhdGlvbldpbGxSZXNpZ25BY3RpdmVcIixcblx0XHRBcHBsaWNhdGlvbldpbGxUZXJtaW5hdGU6IFwibWFjOkFwcGxpY2F0aW9uV2lsbFRlcm1pbmF0ZVwiLFxuXHRcdEFwcGxpY2F0aW9uV2lsbFVuaGlkZTogXCJtYWM6QXBwbGljYXRpb25XaWxsVW5oaWRlXCIsXG5cdFx0QXBwbGljYXRpb25XaWxsVXBkYXRlOiBcIm1hYzpBcHBsaWNhdGlvbldpbGxVcGRhdGVcIixcblx0XHRNZW51RGlkQWRkSXRlbTogXCJtYWM6TWVudURpZEFkZEl0ZW1cIixcblx0XHRNZW51RGlkQmVnaW5UcmFja2luZzogXCJtYWM6TWVudURpZEJlZ2luVHJhY2tpbmdcIixcblx0XHRNZW51RGlkQ2xvc2U6IFwibWFjOk1lbnVEaWRDbG9zZVwiLFxuXHRcdE1lbnVEaWREaXNwbGF5SXRlbTogXCJtYWM6TWVudURpZERpc3BsYXlJdGVtXCIsXG5cdFx0TWVudURpZEVuZFRyYWNraW5nOiBcIm1hYzpNZW51RGlkRW5kVHJhY2tpbmdcIixcblx0XHRNZW51RGlkSGlnaGxpZ2h0SXRlbTogXCJtYWM6TWVudURpZEhpZ2hsaWdodEl0ZW1cIixcblx0XHRNZW51RGlkT3BlbjogXCJtYWM6TWVudURpZE9wZW5cIixcblx0XHRNZW51RGlkUG9wVXA6IFwibWFjOk1lbnVEaWRQb3BVcFwiLFxuXHRcdE1lbnVEaWRSZW1vdmVJdGVtOiBcIm1hYzpNZW51RGlkUmVtb3ZlSXRlbVwiLFxuXHRcdE1lbnVEaWRTZW5kQWN0aW9uOiBcIm1hYzpNZW51RGlkU2VuZEFjdGlvblwiLFxuXHRcdE1lbnVEaWRTZW5kQWN0aW9uVG9JdGVtOiBcIm1hYzpNZW51RGlkU2VuZEFjdGlvblRvSXRlbVwiLFxuXHRcdE1lbnVEaWRVcGRhdGU6IFwibWFjOk1lbnVEaWRVcGRhdGVcIixcblx0XHRNZW51V2lsbEFkZEl0ZW06IFwibWFjOk1lbnVXaWxsQWRkSXRlbVwiLFxuXHRcdE1lbnVXaWxsQmVnaW5UcmFja2luZzogXCJtYWM6TWVudVdpbGxCZWdpblRyYWNraW5nXCIsXG5cdFx0TWVudVdpbGxEaXNwbGF5SXRlbTogXCJtYWM6TWVudVdpbGxEaXNwbGF5SXRlbVwiLFxuXHRcdE1lbnVXaWxsRW5kVHJhY2tpbmc6IFwibWFjOk1lbnVXaWxsRW5kVHJhY2tpbmdcIixcblx0XHRNZW51V2lsbEhpZ2hsaWdodEl0ZW06IFwibWFjOk1lbnVXaWxsSGlnaGxpZ2h0SXRlbVwiLFxuXHRcdE1lbnVXaWxsT3BlbjogXCJtYWM6TWVudVdpbGxPcGVuXCIsXG5cdFx0TWVudVdpbGxQb3BVcDogXCJtYWM6TWVudVdpbGxQb3BVcFwiLFxuXHRcdE1lbnVXaWxsUmVtb3ZlSXRlbTogXCJtYWM6TWVudVdpbGxSZW1vdmVJdGVtXCIsXG5cdFx0TWVudVdpbGxTZW5kQWN0aW9uOiBcIm1hYzpNZW51V2lsbFNlbmRBY3Rpb25cIixcblx0XHRNZW51V2lsbFNlbmRBY3Rpb25Ub0l0ZW06IFwibWFjOk1lbnVXaWxsU2VuZEFjdGlvblRvSXRlbVwiLFxuXHRcdE1lbnVXaWxsVXBkYXRlOiBcIm1hYzpNZW51V2lsbFVwZGF0ZVwiLFxuXHRcdFdlYlZpZXdEaWRDb21taXROYXZpZ2F0aW9uOiBcIm1hYzpXZWJWaWV3RGlkQ29tbWl0TmF2aWdhdGlvblwiLFxuXHRcdFdlYlZpZXdEaWRGaW5pc2hOYXZpZ2F0aW9uOiBcIm1hYzpXZWJWaWV3RGlkRmluaXNoTmF2aWdhdGlvblwiLFxuXHRcdFdlYlZpZXdEaWRSZWNlaXZlU2VydmVyUmVkaXJlY3RGb3JQcm92aXNpb25hbE5hdmlnYXRpb246IFwibWFjOldlYlZpZXdEaWRSZWNlaXZlU2VydmVyUmVkaXJlY3RGb3JQcm92aXNpb25hbE5hdmlnYXRpb25cIixcblx0XHRXZWJWaWV3RGlkU3RhcnRQcm92aXNpb25hbE5hdmlnYXRpb246IFwibWFjOldlYlZpZXdEaWRTdGFydFByb3Zpc2lvbmFsTmF2aWdhdGlvblwiLFxuXHRcdFdpbmRvd0RpZEJlY29tZUtleTogXCJtYWM6V2luZG93RGlkQmVjb21lS2V5XCIsXG5cdFx0V2luZG93RGlkQmVjb21lTWFpbjogXCJtYWM6V2luZG93RGlkQmVjb21lTWFpblwiLFxuXHRcdFdpbmRvd0RpZEJlZ2luU2hlZXQ6IFwibWFjOldpbmRvd0RpZEJlZ2luU2hlZXRcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VBbHBoYTogXCJtYWM6V2luZG93RGlkQ2hhbmdlQWxwaGFcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VCYWNraW5nTG9jYXRpb246IFwibWFjOldpbmRvd0RpZENoYW5nZUJhY2tpbmdMb2NhdGlvblwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZUJhY2tpbmdQcm9wZXJ0aWVzOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VCYWNraW5nUHJvcGVydGllc1wiLFxuXHRcdFdpbmRvd0RpZENoYW5nZUNvbGxlY3Rpb25CZWhhdmlvcjogXCJtYWM6V2luZG93RGlkQ2hhbmdlQ29sbGVjdGlvbkJlaGF2aW9yXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlRWZmZWN0aXZlQXBwZWFyYW5jZTogXCJtYWM6V2luZG93RGlkQ2hhbmdlRWZmZWN0aXZlQXBwZWFyYW5jZVwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZU9jY2x1c2lvblN0YXRlOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VPY2NsdXNpb25TdGF0ZVwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZU9yZGVyaW5nTW9kZTogXCJtYWM6V2luZG93RGlkQ2hhbmdlT3JkZXJpbmdNb2RlXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlU2NyZWVuOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VTY3JlZW5cIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VTY3JlZW5QYXJhbWV0ZXJzOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VTY3JlZW5QYXJhbWV0ZXJzXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlU2NyZWVuUHJvZmlsZTogXCJtYWM6V2luZG93RGlkQ2hhbmdlU2NyZWVuUHJvZmlsZVwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZVNjcmVlblNwYWNlOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VTY3JlZW5TcGFjZVwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZVNjcmVlblNwYWNlUHJvcGVydGllczogXCJtYWM6V2luZG93RGlkQ2hhbmdlU2NyZWVuU3BhY2VQcm9wZXJ0aWVzXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlU2hhcmluZ1R5cGU6IFwibWFjOldpbmRvd0RpZENoYW5nZVNoYXJpbmdUeXBlXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlU3BhY2U6IFwibWFjOldpbmRvd0RpZENoYW5nZVNwYWNlXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlU3BhY2VPcmRlcmluZ01vZGU6IFwibWFjOldpbmRvd0RpZENoYW5nZVNwYWNlT3JkZXJpbmdNb2RlXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlVGl0bGU6IFwibWFjOldpbmRvd0RpZENoYW5nZVRpdGxlXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlVG9vbGJhcjogXCJtYWM6V2luZG93RGlkQ2hhbmdlVG9vbGJhclwiLFxuXHRcdFdpbmRvd0RpZERlbWluaWF0dXJpemU6IFwibWFjOldpbmRvd0RpZERlbWluaWF0dXJpemVcIixcblx0XHRXaW5kb3dEaWRFbmRTaGVldDogXCJtYWM6V2luZG93RGlkRW5kU2hlZXRcIixcblx0XHRXaW5kb3dEaWRFbnRlckZ1bGxTY3JlZW46IFwibWFjOldpbmRvd0RpZEVudGVyRnVsbFNjcmVlblwiLFxuXHRcdFdpbmRvd0RpZEVudGVyVmVyc2lvbkJyb3dzZXI6IFwibWFjOldpbmRvd0RpZEVudGVyVmVyc2lvbkJyb3dzZXJcIixcblx0XHRXaW5kb3dEaWRFeGl0RnVsbFNjcmVlbjogXCJtYWM6V2luZG93RGlkRXhpdEZ1bGxTY3JlZW5cIixcblx0XHRXaW5kb3dEaWRFeGl0VmVyc2lvbkJyb3dzZXI6IFwibWFjOldpbmRvd0RpZEV4aXRWZXJzaW9uQnJvd3NlclwiLFxuXHRcdFdpbmRvd0RpZEV4cG9zZTogXCJtYWM6V2luZG93RGlkRXhwb3NlXCIsXG5cdFx0V2luZG93RGlkRm9jdXM6IFwibWFjOldpbmRvd0RpZEZvY3VzXCIsXG5cdFx0V2luZG93RGlkTWluaWF0dXJpemU6IFwibWFjOldpbmRvd0RpZE1pbmlhdHVyaXplXCIsXG5cdFx0V2luZG93RGlkTW92ZTogXCJtYWM6V2luZG93RGlkTW92ZVwiLFxuXHRcdFdpbmRvd0RpZE9yZGVyT2ZmU2NyZWVuOiBcIm1hYzpXaW5kb3dEaWRPcmRlck9mZlNjcmVlblwiLFxuXHRcdFdpbmRvd0RpZE9yZGVyT25TY3JlZW46IFwibWFjOldpbmRvd0RpZE9yZGVyT25TY3JlZW5cIixcblx0XHRXaW5kb3dEaWRSZXNpZ25LZXk6IFwibWFjOldpbmRvd0RpZFJlc2lnbktleVwiLFxuXHRcdFdpbmRvd0RpZFJlc2lnbk1haW46IFwibWFjOldpbmRvd0RpZFJlc2lnbk1haW5cIixcblx0XHRXaW5kb3dEaWRSZXNpemU6IFwibWFjOldpbmRvd0RpZFJlc2l6ZVwiLFxuXHRcdFdpbmRvd0RpZFVwZGF0ZTogXCJtYWM6V2luZG93RGlkVXBkYXRlXCIsXG5cdFx0V2luZG93RGlkVXBkYXRlQWxwaGE6IFwibWFjOldpbmRvd0RpZFVwZGF0ZUFscGhhXCIsXG5cdFx0V2luZG93RGlkVXBkYXRlQ29sbGVjdGlvbkJlaGF2aW9yOiBcIm1hYzpXaW5kb3dEaWRVcGRhdGVDb2xsZWN0aW9uQmVoYXZpb3JcIixcblx0XHRXaW5kb3dEaWRVcGRhdGVDb2xsZWN0aW9uUHJvcGVydGllczogXCJtYWM6V2luZG93RGlkVXBkYXRlQ29sbGVjdGlvblByb3BlcnRpZXNcIixcblx0XHRXaW5kb3dEaWRVcGRhdGVTaGFkb3c6IFwibWFjOldpbmRvd0RpZFVwZGF0ZVNoYWRvd1wiLFxuXHRcdFdpbmRvd0RpZFVwZGF0ZVRpdGxlOiBcIm1hYzpXaW5kb3dEaWRVcGRhdGVUaXRsZVwiLFxuXHRcdFdpbmRvd0RpZFVwZGF0ZVRvb2xiYXI6IFwibWFjOldpbmRvd0RpZFVwZGF0ZVRvb2xiYXJcIixcblx0XHRXaW5kb3dEaWRab29tOiBcIm1hYzpXaW5kb3dEaWRab29tXCIsXG5cdFx0V2luZG93RmlsZURyYWdnaW5nRW50ZXJlZDogXCJtYWM6V2luZG93RmlsZURyYWdnaW5nRW50ZXJlZFwiLFxuXHRcdFdpbmRvd0ZpbGVEcmFnZ2luZ0V4aXRlZDogXCJtYWM6V2luZG93RmlsZURyYWdnaW5nRXhpdGVkXCIsXG5cdFx0V2luZG93RmlsZURyYWdnaW5nUGVyZm9ybWVkOiBcIm1hYzpXaW5kb3dGaWxlRHJhZ2dpbmdQZXJmb3JtZWRcIixcblx0XHRXaW5kb3dIaWRlOiBcIm1hYzpXaW5kb3dIaWRlXCIsXG5cdFx0V2luZG93TWF4aW1pc2U6IFwibWFjOldpbmRvd01heGltaXNlXCIsXG5cdFx0V2luZG93VW5NYXhpbWlzZTogXCJtYWM6V2luZG93VW5NYXhpbWlzZVwiLFxuXHRcdFdpbmRvd01pbmltaXNlOiBcIm1hYzpXaW5kb3dNaW5pbWlzZVwiLFxuXHRcdFdpbmRvd1VuTWluaW1pc2U6IFwibWFjOldpbmRvd1VuTWluaW1pc2VcIixcblx0XHRXaW5kb3dTaG91bGRDbG9zZTogXCJtYWM6V2luZG93U2hvdWxkQ2xvc2VcIixcblx0XHRXaW5kb3dTaG93OiBcIm1hYzpXaW5kb3dTaG93XCIsXG5cdFx0V2luZG93V2lsbEJlY29tZUtleTogXCJtYWM6V2luZG93V2lsbEJlY29tZUtleVwiLFxuXHRcdFdpbmRvd1dpbGxCZWNvbWVNYWluOiBcIm1hYzpXaW5kb3dXaWxsQmVjb21lTWFpblwiLFxuXHRcdFdpbmRvd1dpbGxCZWdpblNoZWV0OiBcIm1hYzpXaW5kb3dXaWxsQmVnaW5TaGVldFwiLFxuXHRcdFdpbmRvd1dpbGxDaGFuZ2VPcmRlcmluZ01vZGU6IFwibWFjOldpbmRvd1dpbGxDaGFuZ2VPcmRlcmluZ01vZGVcIixcblx0XHRXaW5kb3dXaWxsQ2xvc2U6IFwibWFjOldpbmRvd1dpbGxDbG9zZVwiLFxuXHRcdFdpbmRvd1dpbGxEZW1pbmlhdHVyaXplOiBcIm1hYzpXaW5kb3dXaWxsRGVtaW5pYXR1cml6ZVwiLFxuXHRcdFdpbmRvd1dpbGxFbnRlckZ1bGxTY3JlZW46IFwibWFjOldpbmRvd1dpbGxFbnRlckZ1bGxTY3JlZW5cIixcblx0XHRXaW5kb3dXaWxsRW50ZXJWZXJzaW9uQnJvd3NlcjogXCJtYWM6V2luZG93V2lsbEVudGVyVmVyc2lvbkJyb3dzZXJcIixcblx0XHRXaW5kb3dXaWxsRXhpdEZ1bGxTY3JlZW46IFwibWFjOldpbmRvd1dpbGxFeGl0RnVsbFNjcmVlblwiLFxuXHRcdFdpbmRvd1dpbGxFeGl0VmVyc2lvbkJyb3dzZXI6IFwibWFjOldpbmRvd1dpbGxFeGl0VmVyc2lvbkJyb3dzZXJcIixcblx0XHRXaW5kb3dXaWxsRm9jdXM6IFwibWFjOldpbmRvd1dpbGxGb2N1c1wiLFxuXHRcdFdpbmRvd1dpbGxNaW5pYXR1cml6ZTogXCJtYWM6V2luZG93V2lsbE1pbmlhdHVyaXplXCIsXG5cdFx0V2luZG93V2lsbE1vdmU6IFwibWFjOldpbmRvd1dpbGxNb3ZlXCIsXG5cdFx0V2luZG93V2lsbE9yZGVyT2ZmU2NyZWVuOiBcIm1hYzpXaW5kb3dXaWxsT3JkZXJPZmZTY3JlZW5cIixcblx0XHRXaW5kb3dXaWxsT3JkZXJPblNjcmVlbjogXCJtYWM6V2luZG93V2lsbE9yZGVyT25TY3JlZW5cIixcblx0XHRXaW5kb3dXaWxsUmVzaWduTWFpbjogXCJtYWM6V2luZG93V2lsbFJlc2lnbk1haW5cIixcblx0XHRXaW5kb3dXaWxsUmVzaXplOiBcIm1hYzpXaW5kb3dXaWxsUmVzaXplXCIsXG5cdFx0V2luZG93V2lsbFVuZm9jdXM6IFwibWFjOldpbmRvd1dpbGxVbmZvY3VzXCIsXG5cdFx0V2luZG93V2lsbFVwZGF0ZTogXCJtYWM6V2luZG93V2lsbFVwZGF0ZVwiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGVBbHBoYTogXCJtYWM6V2luZG93V2lsbFVwZGF0ZUFscGhhXCIsXG5cdFx0V2luZG93V2lsbFVwZGF0ZUNvbGxlY3Rpb25CZWhhdmlvcjogXCJtYWM6V2luZG93V2lsbFVwZGF0ZUNvbGxlY3Rpb25CZWhhdmlvclwiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGVDb2xsZWN0aW9uUHJvcGVydGllczogXCJtYWM6V2luZG93V2lsbFVwZGF0ZUNvbGxlY3Rpb25Qcm9wZXJ0aWVzXCIsXG5cdFx0V2luZG93V2lsbFVwZGF0ZVNoYWRvdzogXCJtYWM6V2luZG93V2lsbFVwZGF0ZVNoYWRvd1wiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGVUaXRsZTogXCJtYWM6V2luZG93V2lsbFVwZGF0ZVRpdGxlXCIsXG5cdFx0V2luZG93V2lsbFVwZGF0ZVRvb2xiYXI6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVUb29sYmFyXCIsXG5cdFx0V2luZG93V2lsbFVwZGF0ZVZpc2liaWxpdHk6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVWaXNpYmlsaXR5XCIsXG5cdFx0V2luZG93V2lsbFVzZVN0YW5kYXJkRnJhbWU6IFwibWFjOldpbmRvd1dpbGxVc2VTdGFuZGFyZEZyYW1lXCIsXG5cdFx0V2luZG93Wm9vbUluOiBcIm1hYzpXaW5kb3dab29tSW5cIixcblx0XHRXaW5kb3dab29tT3V0OiBcIm1hYzpXaW5kb3dab29tT3V0XCIsXG5cdFx0V2luZG93Wm9vbVJlc2V0OiBcIm1hYzpXaW5kb3dab29tUmVzZXRcIixcblx0fSksXG5cdExpbnV4OiBPYmplY3QuZnJlZXplKHtcblx0XHRBcHBsaWNhdGlvblN0YXJ0dXA6IFwibGludXg6QXBwbGljYXRpb25TdGFydHVwXCIsXG5cdFx0U3lzdGVtVGhlbWVDaGFuZ2VkOiBcImxpbnV4OlN5c3RlbVRoZW1lQ2hhbmdlZFwiLFxuXHRcdFdpbmRvd0RlbGV0ZUV2ZW50OiBcImxpbnV4OldpbmRvd0RlbGV0ZUV2ZW50XCIsXG5cdFx0V2luZG93RGlkTW92ZTogXCJsaW51eDpXaW5kb3dEaWRNb3ZlXCIsXG5cdFx0V2luZG93RGlkUmVzaXplOiBcImxpbnV4OldpbmRvd0RpZFJlc2l6ZVwiLFxuXHRcdFdpbmRvd0ZvY3VzSW46IFwibGludXg6V2luZG93Rm9jdXNJblwiLFxuXHRcdFdpbmRvd0ZvY3VzT3V0OiBcImxpbnV4OldpbmRvd0ZvY3VzT3V0XCIsXG5cdFx0V2luZG93TG9hZENoYW5nZWQ6IFwibGludXg6V2luZG93TG9hZENoYW5nZWRcIixcblx0fSksXG5cdENvbW1vbjogT2JqZWN0LmZyZWV6ZSh7XG5cdFx0QXBwbGljYXRpb25PcGVuZWRXaXRoRmlsZTogXCJjb21tb246QXBwbGljYXRpb25PcGVuZWRXaXRoRmlsZVwiLFxuXHRcdEFwcGxpY2F0aW9uU3RhcnRlZDogXCJjb21tb246QXBwbGljYXRpb25TdGFydGVkXCIsXG5cdFx0VGhlbWVDaGFuZ2VkOiBcImNvbW1vbjpUaGVtZUNoYW5nZWRcIixcblx0XHRXaW5kb3dDbG9zaW5nOiBcImNvbW1vbjpXaW5kb3dDbG9zaW5nXCIsXG5cdFx0V2luZG93RGlkTW92ZTogXCJjb21tb246V2luZG93RGlkTW92ZVwiLFxuXHRcdFdpbmRvd0RpZFJlc2l6ZTogXCJjb21tb246V2luZG93RGlkUmVzaXplXCIsXG5cdFx0V2luZG93RFBJQ2hhbmdlZDogXCJjb21tb246V2luZG93RFBJQ2hhbmdlZFwiLFxuXHRcdFdpbmRvd0ZpbGVzRHJvcHBlZDogXCJjb21tb246V2luZG93RmlsZXNEcm9wcGVkXCIsXG5cdFx0V2luZG93Rm9jdXM6IFwiY29tbW9uOldpbmRvd0ZvY3VzXCIsXG5cdFx0V2luZG93RnVsbHNjcmVlbjogXCJjb21tb246V2luZG93RnVsbHNjcmVlblwiLFxuXHRcdFdpbmRvd0hpZGU6IFwiY29tbW9uOldpbmRvd0hpZGVcIixcblx0XHRXaW5kb3dMb3N0Rm9jdXM6IFwiY29tbW9uOldpbmRvd0xvc3RGb2N1c1wiLFxuXHRcdFdpbmRvd01heGltaXNlOiBcImNvbW1vbjpXaW5kb3dNYXhpbWlzZVwiLFxuXHRcdFdpbmRvd01pbmltaXNlOiBcImNvbW1vbjpXaW5kb3dNaW5pbWlzZVwiLFxuXHRcdFdpbmRvd1Jlc3RvcmU6IFwiY29tbW9uOldpbmRvd1Jlc3RvcmVcIixcblx0XHRXaW5kb3dSdW50aW1lUmVhZHk6IFwiY29tbW9uOldpbmRvd1J1bnRpbWVSZWFkeVwiLFxuXHRcdFdpbmRvd1Nob3c6IFwiY29tbW9uOldpbmRvd1Nob3dcIixcblx0XHRXaW5kb3dVbkZ1bGxzY3JlZW46IFwiY29tbW9uOldpbmRvd1VuRnVsbHNjcmVlblwiLFxuXHRcdFdpbmRvd1VuTWF4aW1pc2U6IFwiY29tbW9uOldpbmRvd1VuTWF4aW1pc2VcIixcblx0XHRXaW5kb3dVbk1pbmltaXNlOiBcImNvbW1vbjpXaW5kb3dVbk1pbmltaXNlXCIsXG5cdFx0V2luZG93Wm9vbTogXCJjb21tb246V2luZG93Wm9vbVwiLFxuXHRcdFdpbmRvd1pvb21JbjogXCJjb21tb246V2luZG93Wm9vbUluXCIsXG5cdFx0V2luZG93Wm9vbU91dDogXCJjb21tb246V2luZG93Wm9vbU91dFwiLFxuXHRcdFdpbmRvd1pvb21SZXNldDogXCJjb21tb246V2luZG93Wm9vbVJlc2V0XCIsXG5cdH0pLFxufSk7XG4iLCAiLypcbiBfICAgICBfXyAgICAgXyBfX1xufCB8ICAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbi8qKlxuICogTG9ncyBhIG1lc3NhZ2UgdG8gdGhlIGNvbnNvbGUgd2l0aCBjdXN0b20gZm9ybWF0dGluZy5cbiAqXG4gKiBAcGFyYW0gbWVzc2FnZSAtIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlYnVnTG9nKG1lc3NhZ2U6IGFueSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAnJWMgd2FpbHMzICVjICcgKyBtZXNzYWdlICsgJyAnLFxuICAgICAgICAnYmFja2dyb3VuZDogI2FhMDAwMDsgY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDNweCAwcHggMHB4IDNweDsgcGFkZGluZzogMXB4OyBmb250LXNpemU6IDAuN3JlbScsXG4gICAgICAgICdiYWNrZ3JvdW5kOiAjMDA5OTAwOyBjb2xvcjogI2ZmZjsgYm9yZGVyLXJhZGl1czogMHB4IDNweCAzcHggMHB4OyBwYWRkaW5nOiAxcHg7IGZvbnQtc2l6ZTogMC43cmVtJ1xuICAgICk7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIHdlYnZpZXcgc3VwcG9ydHMgdGhlIHtAbGluayBNb3VzZUV2ZW50I2J1dHRvbnN9IHByb3BlcnR5LlxuICogTG9va2luZyBhdCB5b3UgbWFjT1MgSGlnaCBTaWVycmEhXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYW5UcmFja0J1dHRvbnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChuZXcgTW91c2VFdmVudCgnbW91c2Vkb3duJykpLmJ1dHRvbnMgPT09IDA7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIGJyb3dzZXIgc3VwcG9ydHMgcmVtb3ZpbmcgbGlzdGVuZXJzIGJ5IHRyaWdnZXJpbmcgYW4gQWJvcnRTaWduYWxcbiAqIChzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0V2ZW50VGFyZ2V0L2FkZEV2ZW50TGlzdGVuZXIjc2lnbmFsKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbkFib3J0TGlzdGVuZXJzKCkge1xuICAgIGlmICghRXZlbnRUYXJnZXQgfHwgIUFib3J0U2lnbmFsIHx8ICFBYm9ydENvbnRyb2xsZXIpXG4gICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIGxldCByZXN1bHQgPSB0cnVlO1xuXG4gICAgY29uc3QgdGFyZ2V0ID0gbmV3IEV2ZW50VGFyZ2V0KCk7XG4gICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigndGVzdCcsICgpID0+IHsgcmVzdWx0ID0gZmFsc2U7IH0sIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9KTtcbiAgICBjb250cm9sbGVyLmFib3J0KCk7XG4gICAgdGFyZ2V0LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCd0ZXN0JykpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqKlxuIFRoaXMgdGVjaG5pcXVlIGZvciBwcm9wZXIgbG9hZCBkZXRlY3Rpb24gaXMgdGFrZW4gZnJvbSBIVE1YOlxuXG4gQlNEIDItQ2xhdXNlIExpY2Vuc2VcblxuIENvcHlyaWdodCAoYykgMjAyMCwgQmlnIFNreSBTb2Z0d2FyZVxuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cbiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcblxuIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuXG4gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb25cbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cblxuIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4gQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEVcbiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTFxuIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SXG4gU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVJcbiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLFxuIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFXG4gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cblxuICoqKi9cblxubGV0IGlzUmVhZHkgPSBmYWxzZTtcbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB7IGlzUmVhZHkgPSB0cnVlIH0pO1xuXG5leHBvcnQgZnVuY3Rpb24gd2hlblJlYWR5KGNhbGxiYWNrOiAoKSA9PiB2b2lkKSB7XG4gICAgaWYgKGlzUmVhZHkgfHwgZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJykge1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBjYWxsYmFjayk7XG4gICAgfVxufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5pbXBvcnQge25ld1J1bnRpbWVDYWxsZXIsIG9iamVjdE5hbWVzfSBmcm9tIFwiLi9ydW50aW1lLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNjcmVlbiB9IGZyb20gXCIuL3NjcmVlbnMuanNcIjtcblxuY29uc3QgUG9zaXRpb25NZXRob2QgICAgICAgICAgICAgICAgICAgID0gMDtcbmNvbnN0IENlbnRlck1ldGhvZCAgICAgICAgICAgICAgICAgICAgICA9IDE7XG5jb25zdCBDbG9zZU1ldGhvZCAgICAgICAgICAgICAgICAgICAgICAgPSAyO1xuY29uc3QgRGlzYWJsZVNpemVDb25zdHJhaW50c01ldGhvZCAgICAgID0gMztcbmNvbnN0IEVuYWJsZVNpemVDb25zdHJhaW50c01ldGhvZCAgICAgICA9IDQ7XG5jb25zdCBGb2N1c01ldGhvZCAgICAgICAgICAgICAgICAgICAgICAgPSA1O1xuY29uc3QgRm9yY2VSZWxvYWRNZXRob2QgICAgICAgICAgICAgICAgID0gNjtcbmNvbnN0IEZ1bGxzY3JlZW5NZXRob2QgICAgICAgICAgICAgICAgICA9IDc7XG5jb25zdCBHZXRTY3JlZW5NZXRob2QgICAgICAgICAgICAgICAgICAgPSA4O1xuY29uc3QgR2V0Wm9vbU1ldGhvZCAgICAgICAgICAgICAgICAgICAgID0gOTtcbmNvbnN0IEhlaWdodE1ldGhvZCAgICAgICAgICAgICAgICAgICAgICA9IDEwO1xuY29uc3QgSGlkZU1ldGhvZCAgICAgICAgICAgICAgICAgICAgICAgID0gMTE7XG5jb25zdCBJc0ZvY3VzZWRNZXRob2QgICAgICAgICAgICAgICAgICAgPSAxMjtcbmNvbnN0IElzRnVsbHNjcmVlbk1ldGhvZCAgICAgICAgICAgICAgICA9IDEzO1xuY29uc3QgSXNNYXhpbWlzZWRNZXRob2QgICAgICAgICAgICAgICAgID0gMTQ7XG5jb25zdCBJc01pbmltaXNlZE1ldGhvZCAgICAgICAgICAgICAgICAgPSAxNTtcbmNvbnN0IE1heGltaXNlTWV0aG9kICAgICAgICAgICAgICAgICAgICA9IDE2O1xuY29uc3QgTWluaW1pc2VNZXRob2QgICAgICAgICAgICAgICAgICAgID0gMTc7XG5jb25zdCBOYW1lTWV0aG9kICAgICAgICAgICAgICAgICAgICAgICAgPSAxODtcbmNvbnN0IE9wZW5EZXZUb29sc01ldGhvZCAgICAgICAgICAgICAgICA9IDE5O1xuY29uc3QgUmVsYXRpdmVQb3NpdGlvbk1ldGhvZCAgICAgICAgICAgID0gMjA7XG5jb25zdCBSZWxvYWRNZXRob2QgICAgICAgICAgICAgICAgICAgICAgPSAyMTtcbmNvbnN0IFJlc2l6YWJsZU1ldGhvZCAgICAgICAgICAgICAgICAgICA9IDIyO1xuY29uc3QgUmVzdG9yZU1ldGhvZCAgICAgICAgICAgICAgICAgICAgID0gMjM7XG5jb25zdCBTZXRQb3NpdGlvbk1ldGhvZCAgICAgICAgICAgICAgICAgPSAyNDtcbmNvbnN0IFNldEFsd2F5c09uVG9wTWV0aG9kICAgICAgICAgICAgICA9IDI1O1xuY29uc3QgU2V0QmFja2dyb3VuZENvbG91ck1ldGhvZCAgICAgICAgID0gMjY7XG5jb25zdCBTZXRGcmFtZWxlc3NNZXRob2QgICAgICAgICAgICAgICAgPSAyNztcbmNvbnN0IFNldEZ1bGxzY3JlZW5CdXR0b25FbmFibGVkTWV0aG9kICA9IDI4O1xuY29uc3QgU2V0TWF4U2l6ZU1ldGhvZCAgICAgICAgICAgICAgICAgID0gMjk7XG5jb25zdCBTZXRNaW5TaXplTWV0aG9kICAgICAgICAgICAgICAgICAgPSAzMDtcbmNvbnN0IFNldFJlbGF0aXZlUG9zaXRpb25NZXRob2QgICAgICAgICA9IDMxO1xuY29uc3QgU2V0UmVzaXphYmxlTWV0aG9kICAgICAgICAgICAgICAgID0gMzI7XG5jb25zdCBTZXRTaXplTWV0aG9kICAgICAgICAgICAgICAgICAgICAgPSAzMztcbmNvbnN0IFNldFRpdGxlTWV0aG9kICAgICAgICAgICAgICAgICAgICA9IDM0O1xuY29uc3QgU2V0Wm9vbU1ldGhvZCAgICAgICAgICAgICAgICAgICAgID0gMzU7XG5jb25zdCBTaG93TWV0aG9kICAgICAgICAgICAgICAgICAgICAgICAgPSAzNjtcbmNvbnN0IFNpemVNZXRob2QgICAgICAgICAgICAgICAgICAgICAgICA9IDM3O1xuY29uc3QgVG9nZ2xlRnVsbHNjcmVlbk1ldGhvZCAgICAgICAgICAgID0gMzg7XG5jb25zdCBUb2dnbGVNYXhpbWlzZU1ldGhvZCAgICAgICAgICAgICAgPSAzOTtcbmNvbnN0IFVuRnVsbHNjcmVlbk1ldGhvZCAgICAgICAgICAgICAgICA9IDQwO1xuY29uc3QgVW5NYXhpbWlzZU1ldGhvZCAgICAgICAgICAgICAgICAgID0gNDE7XG5jb25zdCBVbk1pbmltaXNlTWV0aG9kICAgICAgICAgICAgICAgICAgPSA0MjtcbmNvbnN0IFdpZHRoTWV0aG9kICAgICAgICAgICAgICAgICAgICAgICA9IDQzO1xuY29uc3QgWm9vbU1ldGhvZCAgICAgICAgICAgICAgICAgICAgICAgID0gNDQ7XG5jb25zdCBab29tSW5NZXRob2QgICAgICAgICAgICAgICAgICAgICAgPSA0NTtcbmNvbnN0IFpvb21PdXRNZXRob2QgICAgICAgICAgICAgICAgICAgICA9IDQ2O1xuY29uc3QgWm9vbVJlc2V0TWV0aG9kICAgICAgICAgICAgICAgICAgID0gNDc7XG5cbi8qKlxuICogQSByZWNvcmQgZGVzY3JpYmluZyB0aGUgcG9zaXRpb24gb2YgYSB3aW5kb3cuXG4gKi9cbmludGVyZmFjZSBQb3NpdGlvbiB7XG4gICAgLyoqIFRoZSBob3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoZSB3aW5kb3cuICovXG4gICAgeDogbnVtYmVyO1xuICAgIC8qKiBUaGUgdmVydGljYWwgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy4gKi9cbiAgICB5OiBudW1iZXI7XG59XG5cbi8qKlxuICogQSByZWNvcmQgZGVzY3JpYmluZyB0aGUgc2l6ZSBvZiBhIHdpbmRvdy5cbiAqL1xuaW50ZXJmYWNlIFNpemUge1xuICAgIC8qKiBUaGUgd2lkdGggb2YgdGhlIHdpbmRvdy4gKi9cbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIC8qKiBUaGUgaGVpZ2h0IG9mIHRoZSB3aW5kb3cuICovXG4gICAgaGVpZ2h0OiBudW1iZXI7XG59XG5cbi8vIFByaXZhdGUgZmllbGQgbmFtZXMuXG5jb25zdCBjYWxsZXJTeW0gPSBTeW1ib2woXCJjYWxsZXJcIik7XG5cbmNsYXNzIFdpbmRvdyB7XG4gICAgLy8gUHJpdmF0ZSBmaWVsZHMuXG4gICAgcHJpdmF0ZSBbY2FsbGVyU3ltXTogKG1lc3NhZ2U6IG51bWJlciwgYXJncz86IGFueSkgPT4gUHJvbWlzZTxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGlzZXMgYSB3aW5kb3cgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YXJnZXQgd2luZG93LlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZyA9ICcnKSB7XG4gICAgICAgIHRoaXNbY2FsbGVyU3ltXSA9IG5ld1J1bnRpbWVDYWxsZXIob2JqZWN0TmFtZXMuV2luZG93LCBuYW1lKVxuXG4gICAgICAgIC8vIGJpbmQgaW5zdGFuY2UgbWV0aG9kIHRvIG1ha2UgdGhlbSBlYXNpbHkgdXNhYmxlIGluIGV2ZW50IGhhbmRsZXJzXG4gICAgICAgIGZvciAoY29uc3QgbWV0aG9kIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKFdpbmRvdy5wcm90b3R5cGUpKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgbWV0aG9kICE9PSBcImNvbnN0cnVjdG9yXCJcbiAgICAgICAgICAgICAgICAmJiB0eXBlb2YgKHRoaXMgYXMgYW55KVttZXRob2RdID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICh0aGlzIGFzIGFueSlbbWV0aG9kXSA9ICh0aGlzIGFzIGFueSlbbWV0aG9kXS5iaW5kKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgc3BlY2lmaWVkIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHdpbmRvdyB0byBnZXQuXG4gICAgICogQHJldHVybnMgVGhlIGNvcnJlc3BvbmRpbmcgd2luZG93IG9iamVjdC5cbiAgICAgKi9cbiAgICBHZXQobmFtZTogc3RyaW5nKTogV2luZG93IHtcbiAgICAgICAgcmV0dXJuIG5ldyBXaW5kb3cobmFtZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IGFic29sdXRlIHBvc2l0aW9uIG9mIHRoZSB3aW5kb3cuXG4gICAgICovXG4gICAgUG9zaXRpb24oKTogUHJvbWlzZTxQb3NpdGlvbj4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFBvc2l0aW9uTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDZW50ZXJzIHRoZSB3aW5kb3cgb24gdGhlIHNjcmVlbi5cbiAgICAgKi9cbiAgICBDZW50ZXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oQ2VudGVyTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBDbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShDbG9zZU1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZXMgbWluL21heCBzaXplIGNvbnN0cmFpbnRzLlxuICAgICAqL1xuICAgIERpc2FibGVTaXplQ29uc3RyYWludHMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oRGlzYWJsZVNpemVDb25zdHJhaW50c01ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyBtaW4vbWF4IHNpemUgY29uc3RyYWludHMuXG4gICAgICovXG4gICAgRW5hYmxlU2l6ZUNvbnN0cmFpbnRzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEVuYWJsZVNpemVDb25zdHJhaW50c01ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9jdXNlcyB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIEZvY3VzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEZvY3VzTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JjZXMgdGhlIHdpbmRvdyB0byByZWxvYWQgdGhlIHBhZ2UgYXNzZXRzLlxuICAgICAqL1xuICAgIEZvcmNlUmVsb2FkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEZvcmNlUmVsb2FkTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTd2l0Y2hlcyB0aGUgd2luZG93IHRvIGZ1bGxzY3JlZW4gbW9kZS5cbiAgICAgKi9cbiAgICBGdWxsc2NyZWVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEZ1bGxzY3JlZW5NZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHNjcmVlbiB0aGF0IHRoZSB3aW5kb3cgaXMgb24uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgc2NyZWVuIHRoZSB3aW5kb3cgaXMgY3VycmVudGx5IG9uLlxuICAgICAqL1xuICAgIEdldFNjcmVlbigpOiBQcm9taXNlPFNjcmVlbj4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEdldFNjcmVlbk1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudCB6b29tIGxldmVsIG9mIHRoZSB3aW5kb3cuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCB6b29tIGxldmVsLlxuICAgICAqL1xuICAgIEdldFpvb20oKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShHZXRab29tTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBoZWlnaHQgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IGhlaWdodCBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIEhlaWdodCgpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEhlaWdodE1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGlkZXMgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBIaWRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEhpZGVNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgd2luZG93IGlzIGZvY3VzZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSB3aW5kb3cgaXMgY3VycmVudGx5IGZvY3VzZWQuXG4gICAgICovXG4gICAgSXNGb2N1c2VkKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKElzRm9jdXNlZE1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB3aW5kb3cgaXMgZnVsbHNjcmVlbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIHdpbmRvdyBpcyBjdXJyZW50bHkgZnVsbHNjcmVlbi5cbiAgICAgKi9cbiAgICBJc0Z1bGxzY3JlZW4oKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oSXNGdWxsc2NyZWVuTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHdpbmRvdyBpcyBtYXhpbWlzZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSB3aW5kb3cgaXMgY3VycmVudGx5IG1heGltaXNlZC5cbiAgICAgKi9cbiAgICBJc01heGltaXNlZCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShJc01heGltaXNlZE1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB3aW5kb3cgaXMgbWluaW1pc2VkLlxuICAgICAqXG4gICAgICogQHJldHVybnMgV2hldGhlciB0aGUgd2luZG93IGlzIGN1cnJlbnRseSBtaW5pbWlzZWQuXG4gICAgICovXG4gICAgSXNNaW5pbWlzZWQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oSXNNaW5pbWlzZWRNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1heGltaXNlcyB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIE1heGltaXNlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKE1heGltaXNlTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNaW5pbWlzZXMgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBNaW5pbWlzZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShNaW5pbWlzZU1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgd2luZG93LlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIG5hbWUgb2YgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBOYW1lKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oTmFtZU1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3BlbnMgdGhlIGRldmVsb3BtZW50IHRvb2xzIHBhbmUuXG4gICAgICovXG4gICAgT3BlbkRldlRvb2xzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKE9wZW5EZXZUb29sc01ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcmVsYXRpdmUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdyB0byB0aGUgc2NyZWVuLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIGN1cnJlbnQgcmVsYXRpdmUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBSZWxhdGl2ZVBvc2l0aW9uKCk6IFByb21pc2U8UG9zaXRpb24+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShSZWxhdGl2ZVBvc2l0aW9uTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWxvYWRzIHRoZSBwYWdlIGFzc2V0cy5cbiAgICAgKi9cbiAgICBSZWxvYWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oUmVsb2FkTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHdpbmRvdyBpcyByZXNpemFibGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSB3aW5kb3cgaXMgY3VycmVudGx5IHJlc2l6YWJsZS5cbiAgICAgKi9cbiAgICBSZXNpemFibGUoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oUmVzaXphYmxlTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXN0b3JlcyB0aGUgd2luZG93IHRvIGl0cyBwcmV2aW91cyBzdGF0ZSBpZiBpdCB3YXMgcHJldmlvdXNseSBtaW5pbWlzZWQsIG1heGltaXNlZCBvciBmdWxsc2NyZWVuLlxuICAgICAqL1xuICAgIFJlc3RvcmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oUmVzdG9yZU1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB4IC0gVGhlIGRlc2lyZWQgaG9yaXpvbnRhbCBhYnNvbHV0ZSBwb3NpdGlvbiBvZiB0aGUgd2luZG93LlxuICAgICAqIEBwYXJhbSB5IC0gVGhlIGRlc2lyZWQgdmVydGljYWwgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBTZXRQb3NpdGlvbih4OiBudW1iZXIsIHk6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFNldFBvc2l0aW9uTWV0aG9kLCB7IHgsIHkgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgd2luZG93IHRvIGJlIGFsd2F5cyBvbiB0b3AuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYWx3YXlzT25Ub3AgLSBXaGV0aGVyIHRoZSB3aW5kb3cgc2hvdWxkIHN0YXkgb24gdG9wLlxuICAgICAqL1xuICAgIFNldEFsd2F5c09uVG9wKGFsd2F5c09uVG9wOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2V0QWx3YXlzT25Ub3BNZXRob2QsIHsgYWx3YXlzT25Ub3AgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgYmFja2dyb3VuZCBjb2xvdXIgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByIC0gVGhlIGRlc2lyZWQgcmVkIGNvbXBvbmVudCBvZiB0aGUgd2luZG93IGJhY2tncm91bmQuXG4gICAgICogQHBhcmFtIGcgLSBUaGUgZGVzaXJlZCBncmVlbiBjb21wb25lbnQgb2YgdGhlIHdpbmRvdyBiYWNrZ3JvdW5kLlxuICAgICAqIEBwYXJhbSBiIC0gVGhlIGRlc2lyZWQgYmx1ZSBjb21wb25lbnQgb2YgdGhlIHdpbmRvdyBiYWNrZ3JvdW5kLlxuICAgICAqIEBwYXJhbSBhIC0gVGhlIGRlc2lyZWQgYWxwaGEgY29tcG9uZW50IG9mIHRoZSB3aW5kb3cgYmFja2dyb3VuZC5cbiAgICAgKi9cbiAgICBTZXRCYWNrZ3JvdW5kQ29sb3VyKHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIsIGE6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFNldEJhY2tncm91bmRDb2xvdXJNZXRob2QsIHsgciwgZywgYiwgYSB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSB3aW5kb3cgZnJhbWUgYW5kIHRpdGxlIGJhci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmcmFtZWxlc3MgLSBXaGV0aGVyIHRoZSB3aW5kb3cgc2hvdWxkIGJlIGZyYW1lbGVzcy5cbiAgICAgKi9cbiAgICBTZXRGcmFtZWxlc3MoZnJhbWVsZXNzOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2V0RnJhbWVsZXNzTWV0aG9kLCB7IGZyYW1lbGVzcyB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlcyB0aGUgc3lzdGVtIGZ1bGxzY3JlZW4gYnV0dG9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVuYWJsZWQgLSBXaGV0aGVyIHRoZSBmdWxsc2NyZWVuIGJ1dHRvbiBzaG91bGQgYmUgZW5hYmxlZC5cbiAgICAgKi9cbiAgICBTZXRGdWxsc2NyZWVuQnV0dG9uRW5hYmxlZChlbmFibGVkOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2V0RnVsbHNjcmVlbkJ1dHRvbkVuYWJsZWRNZXRob2QsIHsgZW5hYmxlZCB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB3aWR0aCAtIFRoZSBkZXNpcmVkIG1heGltdW0gd2lkdGggb2YgdGhlIHdpbmRvdy5cbiAgICAgKiBAcGFyYW0gaGVpZ2h0IC0gVGhlIGRlc2lyZWQgbWF4aW11bSBoZWlnaHQgb2YgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBTZXRNYXhTaXplKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2V0TWF4U2l6ZU1ldGhvZCwgeyB3aWR0aCwgaGVpZ2h0IH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIG1pbmltdW0gc2l6ZSBvZiB0aGUgd2luZG93LlxuICAgICAqXG4gICAgICogQHBhcmFtIHdpZHRoIC0gVGhlIGRlc2lyZWQgbWluaW11bSB3aWR0aCBvZiB0aGUgd2luZG93LlxuICAgICAqIEBwYXJhbSBoZWlnaHQgLSBUaGUgZGVzaXJlZCBtaW5pbXVtIGhlaWdodCBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFNldE1pblNpemUod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShTZXRNaW5TaXplTWV0aG9kLCB7IHdpZHRoLCBoZWlnaHQgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcmVsYXRpdmUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdyB0byB0aGUgc2NyZWVuLlxuICAgICAqXG4gICAgICogQHBhcmFtIHggLSBUaGUgZGVzaXJlZCBob3Jpem9udGFsIHJlbGF0aXZlIHBvc2l0aW9uIG9mIHRoZSB3aW5kb3cuXG4gICAgICogQHBhcmFtIHkgLSBUaGUgZGVzaXJlZCB2ZXJ0aWNhbCByZWxhdGl2ZSBwb3NpdGlvbiBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFNldFJlbGF0aXZlUG9zaXRpb24oeDogbnVtYmVyLCB5OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShTZXRSZWxhdGl2ZVBvc2l0aW9uTWV0aG9kLCB7IHgsIHkgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB3aGV0aGVyIHRoZSB3aW5kb3cgaXMgcmVzaXphYmxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlc2l6YWJsZSAtIFdoZXRoZXIgdGhlIHdpbmRvdyBzaG91bGQgYmUgcmVzaXphYmxlLlxuICAgICAqL1xuICAgIFNldFJlc2l6YWJsZShyZXNpemFibGU6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShTZXRSZXNpemFibGVNZXRob2QsIHsgcmVzaXphYmxlIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHNpemUgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB3aWR0aCAtIFRoZSBkZXNpcmVkIHdpZHRoIG9mIHRoZSB3aW5kb3cuXG4gICAgICogQHBhcmFtIGhlaWdodCAtIFRoZSBkZXNpcmVkIGhlaWdodCBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFNldFNpemUod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShTZXRTaXplTWV0aG9kLCB7IHdpZHRoLCBoZWlnaHQgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdGl0bGUgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0aXRsZSAtIFRoZSBkZXNpcmVkIHRpdGxlIG9mIHRoZSB3aW5kb3cuXG4gICAgICovXG4gICAgU2V0VGl0bGUodGl0bGU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFNldFRpdGxlTWV0aG9kLCB7IHRpdGxlIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHpvb20gbGV2ZWwgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB6b29tIC0gVGhlIGRlc2lyZWQgem9vbSBsZXZlbC5cbiAgICAgKi9cbiAgICBTZXRab29tKHpvb206IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFNldFpvb21NZXRob2QsIHsgem9vbSB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTaG93cyB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFNob3coKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2hvd01ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgd2luZG93LlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFNpemUoKTogUHJvbWlzZTxTaXplPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2l6ZU1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG9nZ2xlcyB0aGUgd2luZG93IGJldHdlZW4gZnVsbHNjcmVlbiBhbmQgbm9ybWFsLlxuICAgICAqL1xuICAgIFRvZ2dsZUZ1bGxzY3JlZW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oVG9nZ2xlRnVsbHNjcmVlbk1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG9nZ2xlcyB0aGUgd2luZG93IGJldHdlZW4gbWF4aW1pc2VkIGFuZCBub3JtYWwuXG4gICAgICovXG4gICAgVG9nZ2xlTWF4aW1pc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oVG9nZ2xlTWF4aW1pc2VNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVuLWZ1bGxzY3JlZW5zIHRoZSB3aW5kb3cuXG4gICAgICovXG4gICAgVW5GdWxsc2NyZWVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFVuRnVsbHNjcmVlbk1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVW4tbWF4aW1pc2VzIHRoZSB3aW5kb3cuXG4gICAgICovXG4gICAgVW5NYXhpbWlzZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShVbk1heGltaXNlTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVbi1taW5pbWlzZXMgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBVbk1pbmltaXNlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFVuTWluaW1pc2VNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHdpZHRoIG9mIHRoZSB3aW5kb3cuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCB3aWR0aCBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFdpZHRoKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oV2lkdGhNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFpvb21zIHRoZSB3aW5kb3cuXG4gICAgICovXG4gICAgWm9vbSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShab29tTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbmNyZWFzZXMgdGhlIHpvb20gbGV2ZWwgb2YgdGhlIHdlYnZpZXcgY29udGVudC5cbiAgICAgKi9cbiAgICBab29tSW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oWm9vbUluTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWNyZWFzZXMgdGhlIHpvb20gbGV2ZWwgb2YgdGhlIHdlYnZpZXcgY29udGVudC5cbiAgICAgKi9cbiAgICBab29tT3V0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFpvb21PdXRNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUgem9vbSBsZXZlbCBvZiB0aGUgd2VidmlldyBjb250ZW50LlxuICAgICAqL1xuICAgIFpvb21SZXNldCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShab29tUmVzZXRNZXRob2QpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBUaGUgd2luZG93IHdpdGhpbiB3aGljaCB0aGUgc2NyaXB0IGlzIHJ1bm5pbmcuXG4gKi9cbmNvbnN0IHRoaXNXaW5kb3cgPSBuZXcgV2luZG93KCcnKTtcblxuZXhwb3J0IGRlZmF1bHQgdGhpc1dpbmRvdztcbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuaW1wb3J0ICogYXMgUnVudGltZSBmcm9tIFwiLi4vQHdhaWxzaW8vcnVudGltZS9zcmNcIjtcblxuLy8gTk9URTogdGhlIGZvbGxvd2luZyBtZXRob2RzIE1VU1QgYmUgaW1wb3J0ZWQgZXhwbGljaXRseSBiZWNhdXNlIG9mIGhvdyBlc2J1aWxkIGluamVjdGlvbiB3b3Jrc1xuaW1wb3J0IHsgRW5hYmxlIGFzIEVuYWJsZVdNTCB9IGZyb20gXCIuLi9Ad2FpbHNpby9ydW50aW1lL3NyYy93bWxcIjtcbmltcG9ydCB7IGRlYnVnTG9nIH0gZnJvbSBcIi4uL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3V0aWxzXCI7XG5cbndpbmRvdy53YWlscyA9IFJ1bnRpbWU7XG5FbmFibGVXTUwoKTtcblxuaWYgKERFQlVHKSB7XG4gICAgZGVidWdMb2coXCJXYWlscyBSdW50aW1lIExvYWRlZFwiKVxufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5pbXBvcnQgeyBuZXdSdW50aW1lQ2FsbGVyLCBvYmplY3ROYW1lcyB9IGZyb20gXCIuL3J1bnRpbWUuanNcIjtcblxubGV0IGNhbGwgPSBuZXdSdW50aW1lQ2FsbGVyKG9iamVjdE5hbWVzLlN5c3RlbSk7XG5cbmNvbnN0IFN5c3RlbUlzRGFya01vZGUgPSAwO1xuY29uc3QgU3lzdGVtRW52aXJvbm1lbnQgPSAxO1xuXG5jb25zdCBfaW52b2tlID0gKGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAoKHdpbmRvdyBhcyBhbnkpLmNocm9tZT8ud2Vidmlldz8ucG9zdE1lc3NhZ2UpIHtcbiAgICAgICAgICAgIHJldHVybiAod2luZG93IGFzIGFueSkuY2hyb21lLndlYnZpZXcucG9zdE1lc3NhZ2UuYmluZCgod2luZG93IGFzIGFueSkuY2hyb21lLndlYnZpZXcpO1xuICAgICAgICB9IGVsc2UgaWYgKCh3aW5kb3cgYXMgYW55KS53ZWJraXQ/Lm1lc3NhZ2VIYW5kbGVycz8uWydleHRlcm5hbCddPy5wb3N0TWVzc2FnZSkge1xuICAgICAgICAgICAgcmV0dXJuICh3aW5kb3cgYXMgYW55KS53ZWJraXQubWVzc2FnZUhhbmRsZXJzWydleHRlcm5hbCddLnBvc3RNZXNzYWdlLmJpbmQoKHdpbmRvdyBhcyBhbnkpLndlYmtpdC5tZXNzYWdlSGFuZGxlcnNbJ2V4dGVybmFsJ10pO1xuICAgICAgICB9XG4gICAgfSBjYXRjaChlKSB7fVxuXG4gICAgY29uc29sZS53YXJuKCdcXG4lY1x1MjZBMFx1RkUwRiBCcm93c2VyIEVudmlyb25tZW50IERldGVjdGVkICVjXFxuXFxuJWNPbmx5IFVJIHByZXZpZXdzIGFyZSBhdmFpbGFibGUgaW4gdGhlIGJyb3dzZXIuIEZvciBmdWxsIGZ1bmN0aW9uYWxpdHksIHBsZWFzZSBydW4gdGhlIGFwcGxpY2F0aW9uIGluIGRlc2t0b3AgbW9kZS5cXG5Nb3JlIGluZm9ybWF0aW9uIGF0OiBodHRwczovL3YzLndhaWxzLmlvL2xlYXJuL2J1aWxkLyN1c2luZy1hLWJyb3dzZXItZm9yLWRldmVsb3BtZW50XFxuJyxcbiAgICAgICAgJ2JhY2tncm91bmQ6ICNmZmZmZmY7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgcGFkZGluZzogNHB4IDhweDsgYm9yZGVyLXJhZGl1czogNHB4OyBib3JkZXI6IDJweCBzb2xpZCAjMDAwMDAwOycsXG4gICAgICAgICdiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsnLFxuICAgICAgICAnY29sb3I6ICNmZmZmZmY7IGZvbnQtc3R5bGU6IGl0YWxpYzsgZm9udC13ZWlnaHQ6IGJvbGQ7Jyk7XG4gICAgcmV0dXJuIG51bGw7XG59KSgpO1xuXG5leHBvcnQgZnVuY3Rpb24gaW52b2tlKG1zZzogYW55KTogdm9pZCB7XG4gICAgcmV0dXJuIF9pbnZva2U/Lihtc2cpO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgc3lzdGVtIGRhcmsgbW9kZSBzdGF0dXMuXG4gKlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYSBib29sZWFuIHZhbHVlIGluZGljYXRpbmcgaWYgdGhlIHN5c3RlbSBpcyBpbiBkYXJrIG1vZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBJc0RhcmtNb2RlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBjYWxsKFN5c3RlbUlzRGFya01vZGUpO1xufVxuXG4vKipcbiAqIEZldGNoZXMgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUgYXBwbGljYXRpb24gZnJvbSB0aGUgc2VydmVyLlxuICpcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBjYXBhYmlsaXRpZXMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBDYXBhYmlsaXRpZXMoKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXCIvd2FpbHMvY2FwYWJpbGl0aWVzXCIpO1xuICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImNvdWxkIG5vdCBmZXRjaCBjYXBhYmlsaXRpZXM6IFwiICsgcmVzcG9uc2Uuc3RhdHVzVGV4dCk7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9TSW5mbyB7XG4gICAgLyoqIFRoZSBicmFuZGluZyBvZiB0aGUgT1MuICovXG4gICAgQnJhbmRpbmc6IHN0cmluZztcbiAgICAvKiogVGhlIElEIG9mIHRoZSBPUy4gKi9cbiAgICBJRDogc3RyaW5nO1xuICAgIC8qKiBUaGUgbmFtZSBvZiB0aGUgT1MuICovXG4gICAgTmFtZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgdmVyc2lvbiBvZiB0aGUgT1MuICovXG4gICAgVmVyc2lvbjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVudmlyb25tZW50SW5mbyB7XG4gICAgLyoqIFRoZSBhcmNoaXRlY3R1cmUgb2YgdGhlIHN5c3RlbS4gKi9cbiAgICBBcmNoOiBzdHJpbmc7XG4gICAgLyoqIFRydWUgaWYgdGhlIGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcgaW4gZGVidWcgbW9kZSwgb3RoZXJ3aXNlIGZhbHNlLiAqL1xuICAgIERlYnVnOiBib29sZWFuO1xuICAgIC8qKiBUaGUgb3BlcmF0aW5nIHN5c3RlbSBpbiB1c2UuICovXG4gICAgT1M6IHN0cmluZztcbiAgICAvKiogRGV0YWlscyBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbS4gKi9cbiAgICBPU0luZm86IE9TSW5mbztcbiAgICAvKiogQWRkaXRpb25hbCBwbGF0Zm9ybSBpbmZvcm1hdGlvbi4gKi9cbiAgICBQbGF0Zm9ybUluZm86IFJlY29yZDxzdHJpbmcsIGFueT47XG59XG5cbi8qKlxuICogUmV0cmlldmVzIGVudmlyb25tZW50IGRldGFpbHMuXG4gKlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gb2JqZWN0IGNvbnRhaW5pbmcgT1MgYW5kIHN5c3RlbSBhcmNoaXRlY3R1cmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFbnZpcm9ubWVudCgpOiBQcm9taXNlPEVudmlyb25tZW50SW5mbz4ge1xuICAgIHJldHVybiBjYWxsKFN5c3RlbUVudmlyb25tZW50KTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGN1cnJlbnQgb3BlcmF0aW5nIHN5c3RlbSBpcyBXaW5kb3dzLlxuICpcbiAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBpcyBXaW5kb3dzLCBvdGhlcndpc2UgZmFsc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBJc1dpbmRvd3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHdpbmRvdy5fd2FpbHMuZW52aXJvbm1lbnQuT1MgPT09IFwid2luZG93c1wiO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgY3VycmVudCBvcGVyYXRpbmcgc3lzdGVtIGlzIExpbnV4LlxuICpcbiAqIEByZXR1cm5zIFJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVudCBvcGVyYXRpbmcgc3lzdGVtIGlzIExpbnV4LCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBJc0xpbnV4KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB3aW5kb3cuX3dhaWxzLmVudmlyb25tZW50Lk9TID09PSBcImxpbnV4XCI7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBjdXJyZW50IGVudmlyb25tZW50IGlzIGEgbWFjT1Mgb3BlcmF0aW5nIHN5c3RlbS5cbiAqXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBlbnZpcm9ubWVudCBpcyBtYWNPUywgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSXNNYWMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHdpbmRvdy5fd2FpbHMuZW52aXJvbm1lbnQuT1MgPT09IFwiZGFyd2luXCI7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBjdXJyZW50IGVudmlyb25tZW50IGFyY2hpdGVjdHVyZSBpcyBBTUQ2NC5cbiAqXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBjdXJyZW50IGVudmlyb25tZW50IGFyY2hpdGVjdHVyZSBpcyBBTUQ2NCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSXNBTUQ2NCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gd2luZG93Ll93YWlscy5lbnZpcm9ubWVudC5BcmNoID09PSBcImFtZDY0XCI7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBjdXJyZW50IGFyY2hpdGVjdHVyZSBpcyBBUk0uXG4gKlxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgY3VycmVudCBhcmNoaXRlY3R1cmUgaXMgQVJNLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBJc0FSTSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gd2luZG93Ll93YWlscy5lbnZpcm9ubWVudC5BcmNoID09PSBcImFybVwiO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgY3VycmVudCBlbnZpcm9ubWVudCBpcyBBUk02NCBhcmNoaXRlY3R1cmUuXG4gKlxuICogQHJldHVybnMgUmV0dXJucyB0cnVlIGlmIHRoZSBlbnZpcm9ubWVudCBpcyBBUk02NCBhcmNoaXRlY3R1cmUsIG90aGVyd2lzZSByZXR1cm5zIGZhbHNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSXNBUk02NCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gd2luZG93Ll93YWlscy5lbnZpcm9ubWVudC5BcmNoID09PSBcImFybTY0XCI7XG59XG5cbi8qKlxuICogUmVwb3J0cyB3aGV0aGVyIHRoZSBhcHAgaXMgYmVpbmcgcnVuIGluIGRlYnVnIG1vZGUuXG4gKlxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgYXBwIGlzIGJlaW5nIHJ1biBpbiBkZWJ1ZyBtb2RlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSXNEZWJ1ZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gQm9vbGVhbih3aW5kb3cuX3dhaWxzLmVudmlyb25tZW50LkRlYnVnKTtcbn1cblxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5pbXBvcnQgeyBuZXdSdW50aW1lQ2FsbGVyLCBvYmplY3ROYW1lcyB9IGZyb20gXCIuL3J1bnRpbWUuanNcIjtcbmltcG9ydCB7IElzRGVidWcgfSBmcm9tIFwiLi9zeXN0ZW0uanNcIjtcblxuLy8gc2V0dXBcbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIGNvbnRleHRNZW51SGFuZGxlcik7XG5cbmNvbnN0IGNhbGwgPSBuZXdSdW50aW1lQ2FsbGVyKG9iamVjdE5hbWVzLkNvbnRleHRNZW51KTtcblxuY29uc3QgQ29udGV4dE1lbnVPcGVuID0gMDtcblxuZnVuY3Rpb24gb3BlbkNvbnRleHRNZW51KGlkOiBzdHJpbmcsIHg6IG51bWJlciwgeTogbnVtYmVyLCBkYXRhOiBhbnkpOiB2b2lkIHtcbiAgICB2b2lkIGNhbGwoQ29udGV4dE1lbnVPcGVuLCB7aWQsIHgsIHksIGRhdGF9KTtcbn1cblxuZnVuY3Rpb24gY29udGV4dE1lbnVIYW5kbGVyKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgbGV0IHRhcmdldDogSFRNTEVsZW1lbnQ7XG5cbiAgICBpZiAoZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgIH0gZWxzZSBpZiAoIShldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkgJiYgZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgTm9kZSkge1xuICAgICAgICB0YXJnZXQgPSBldmVudC50YXJnZXQucGFyZW50RWxlbWVudCA/PyBkb2N1bWVudC5ib2R5O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRhcmdldCA9IGRvY3VtZW50LmJvZHk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIGN1c3RvbSBjb250ZXh0IG1lbnVcbiAgICBsZXQgY3VzdG9tQ29udGV4dE1lbnUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXQpLmdldFByb3BlcnR5VmFsdWUoXCItLWN1c3RvbS1jb250ZXh0bWVudVwiKS50cmltKCk7XG5cbiAgICBpZiAoY3VzdG9tQ29udGV4dE1lbnUpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgbGV0IGRhdGEgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXQpLmdldFByb3BlcnR5VmFsdWUoXCItLWN1c3RvbS1jb250ZXh0bWVudS1kYXRhXCIpO1xuICAgICAgICBvcGVuQ29udGV4dE1lbnUoY3VzdG9tQ29udGV4dE1lbnUsIGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFksIGRhdGEpO1xuICAgICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBwcm9jZXNzRGVmYXVsdENvbnRleHRNZW51KGV2ZW50KTtcbn1cblxuXG4vKlxuLS1kZWZhdWx0LWNvbnRleHRtZW51OiBhdXRvOyAoZGVmYXVsdCkgd2lsbCBzaG93IHRoZSBkZWZhdWx0IGNvbnRleHQgbWVudSBpZiBjb250ZW50RWRpdGFibGUgaXMgdHJ1ZSBPUiB0ZXh0IGhhcyBiZWVuIHNlbGVjdGVkIE9SIGVsZW1lbnQgaXMgaW5wdXQgb3IgdGV4dGFyZWFcbi0tZGVmYXVsdC1jb250ZXh0bWVudTogc2hvdzsgd2lsbCBhbHdheXMgc2hvdyB0aGUgZGVmYXVsdCBjb250ZXh0IG1lbnVcbi0tZGVmYXVsdC1jb250ZXh0bWVudTogaGlkZTsgd2lsbCBhbHdheXMgaGlkZSB0aGUgZGVmYXVsdCBjb250ZXh0IG1lbnVcblxuVGhpcyBydWxlIGlzIGluaGVyaXRlZCBsaWtlIG5vcm1hbCBDU1MgcnVsZXMsIHNvIG5lc3Rpbmcgd29ya3MgYXMgZXhwZWN0ZWRcbiovXG5mdW5jdGlvbiBwcm9jZXNzRGVmYXVsdENvbnRleHRNZW51KGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgLy8gRGVidWcgYnVpbGRzIGFsd2F5cyBzaG93IHRoZSBtZW51XG4gICAgaWYgKElzRGVidWcoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHRhcmdldDogSFRNTEVsZW1lbnQ7XG5cbiAgICBpZiAoZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgIH0gZWxzZSBpZiAoIShldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkgJiYgZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgTm9kZSkge1xuICAgICAgICB0YXJnZXQgPSBldmVudC50YXJnZXQucGFyZW50RWxlbWVudCA/PyBkb2N1bWVudC5ib2R5O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRhcmdldCA9IGRvY3VtZW50LmJvZHk7XG4gICAgfVxuXG4gICAgLy8gUHJvY2VzcyBkZWZhdWx0IGNvbnRleHQgbWVudVxuICAgIHN3aXRjaCAod2luZG93LmdldENvbXB1dGVkU3R5bGUodGFyZ2V0KS5nZXRQcm9wZXJ0eVZhbHVlKFwiLS1kZWZhdWx0LWNvbnRleHRtZW51XCIpLnRyaW0oKSkge1xuICAgICAgICBjYXNlIFwic2hvd1wiOlxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNhc2UgXCJoaWRlXCI6XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAvLyBDaGVjayBpZiBjb250ZW50RWRpdGFibGUgaXMgdHJ1ZVxuICAgICAgICAgICAgaWYgKHRhcmdldC5pc0NvbnRlbnRFZGl0YWJsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGV4dCBoYXMgYmVlbiBzZWxlY3RlZFxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgICAgICAgICAgY29uc3QgaGFzU2VsZWN0aW9uID0gc2VsZWN0aW9uICYmIHNlbGVjdGlvbi50b1N0cmluZygpLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICBpZiAoaGFzU2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3Rpb24ucmFuZ2VDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoaSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY3RzID0gcmFuZ2UuZ2V0Q2xpZW50UmVjdHMoKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByZWN0cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjdCA9IHJlY3RzW2pdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQocmVjdC5sZWZ0LCByZWN0LnRvcCkgPT09IHRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGFnIGlzIGlucHV0IG9yIHRleHRhcmVhLlxuICAgICAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgfHwgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTFRleHRBcmVhRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGlmIChoYXNTZWxlY3Rpb24gfHwgKCF0YXJnZXQucmVhZE9ubHkgJiYgIXRhcmdldC5kaXNhYmxlZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaGlkZSBkZWZhdWx0IGNvbnRleHQgbWVudVxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG59XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBrZXkgZnJvbSB0aGUgZmxhZyBtYXAuXG4gKlxuICogQHBhcmFtIGtleSAtIFRoZSBrZXkgdG8gcmV0cmlldmUgdGhlIHZhbHVlIGZvci5cbiAqIEByZXR1cm4gVGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGtleS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEdldEZsYWcoa2V5OiBzdHJpbmcpOiBhbnkge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB3aW5kb3cuX3dhaWxzLmZsYWdzW2tleV07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gcmV0cmlldmUgZmxhZyAnXCIgKyBrZXkgKyBcIic6IFwiICsgZSwgeyBjYXVzZTogZSB9KTtcbiAgICB9XG59XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbmltcG9ydCB7IGludm9rZSwgSXNXaW5kb3dzIH0gZnJvbSBcIi4vc3lzdGVtLmpzXCI7XG5pbXBvcnQgeyBHZXRGbGFnIH0gZnJvbSBcIi4vZmxhZ3MuanNcIjtcbmltcG9ydCB7IGNhblRyYWNrQnV0dG9ucyB9IGZyb20gXCIuL3V0aWxzLmpzXCI7XG5cbi8vIFNldHVwXG5sZXQgY2FuRHJhZyA9IGZhbHNlO1xubGV0IGRyYWdnaW5nID0gZmFsc2U7XG5cbmxldCByZXNpemFibGUgPSBmYWxzZTtcbmxldCBjYW5SZXNpemUgPSBmYWxzZTtcbmxldCByZXNpemluZyA9IGZhbHNlO1xubGV0IHJlc2l6ZUVkZ2U6IHN0cmluZyA9IFwiXCI7XG5sZXQgZGVmYXVsdEN1cnNvciA9IFwiYXV0b1wiO1xuXG5sZXQgYnV0dG9ucyA9IDA7XG5jb25zdCBidXR0b25zVHJhY2tlZCA9IGNhblRyYWNrQnV0dG9ucygpO1xuXG53aW5kb3cuX3dhaWxzID0gd2luZG93Ll93YWlscyB8fCB7fTtcbndpbmRvdy5fd2FpbHMuc2V0UmVzaXphYmxlID0gKHZhbHVlOiBib29sZWFuKTogdm9pZCA9PiB7XG4gICAgcmVzaXphYmxlID0gdmFsdWU7XG4gICAgaWYgKCFyZXNpemFibGUpIHtcbiAgICAgICAgLy8gU3RvcCByZXNpemluZyBpZiBpbiBwcm9ncmVzcy5cbiAgICAgICAgY2FuUmVzaXplID0gcmVzaXppbmcgPSBmYWxzZTtcbiAgICAgICAgc2V0UmVzaXplKCk7XG4gICAgfVxufTtcblxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIG9uTW91c2VEb3duLCB7IGNhcHR1cmU6IHRydWUgfSk7XG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUsIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25Nb3VzZVVwLCB7IGNhcHR1cmU6IHRydWUgfSk7XG5mb3IgKGNvbnN0IGV2IG9mIFsnY2xpY2snLCAnY29udGV4dG1lbnUnLCAnZGJsY2xpY2snLCAncG9pbnRlcmRvd24nLCAncG9pbnRlcnVwJ10pIHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihldiwgc3VwcHJlc3NFdmVudCwgeyBjYXB0dXJlOiB0cnVlIH0pO1xufVxuXG5mdW5jdGlvbiBzdXBwcmVzc0V2ZW50KGV2ZW50OiBFdmVudCkge1xuICAgIGlmIChkcmFnZ2luZyB8fCByZXNpemluZykge1xuICAgICAgICAvLyBTdXBwcmVzcyBhbGwgYnV0dG9uIGV2ZW50cyBkdXJpbmcgZHJhZ2dpbmcgJiByZXNpemluZy5cbiAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gb25Nb3VzZURvd24oZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBidXR0b25zID0gYnV0dG9uc1RyYWNrZWQgPyBldmVudC5idXR0b25zIDogKGJ1dHRvbnMgfCAoMSA8PCBldmVudC5idXR0b24pKTtcblxuICAgIGlmIChkcmFnZ2luZyB8fCByZXNpemluZykge1xuICAgICAgICAvLyBBZnRlciBkcmFnZ2luZyBvciByZXNpemluZyBoYXMgc3RhcnRlZCwgb25seSBsaWZ0aW5nIHRoZSBwcmltYXJ5IGJ1dHRvbiBjYW4gc3RvcCBpdC5cbiAgICAgICAgLy8gRG8gbm90IGxldCBhbnkgb3RoZXIgZXZlbnRzIHRocm91Z2guXG4gICAgICAgIHN1cHByZXNzRXZlbnQoZXZlbnQpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKChjYW5EcmFnIHx8IGNhblJlc2l6ZSkgJiYgKGJ1dHRvbnMgJiAxKSAmJiBldmVudC5idXR0b24gIT09IDApIHtcbiAgICAgICAgLy8gV2Ugd2VyZSByZWFkeSBiZWZvcmUsIHRoZSBwcmltYXJ5IGlzIHByZXNzZWQgYW5kIHdhcyBub3QgcmVsZWFzZWQ6XG4gICAgICAgIC8vIHN0aWxsIHJlYWR5LCBidXQgbGV0IGV2ZW50cyBidWJibGUgdGhyb3VnaCB0aGUgd2luZG93LlxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUmVzZXQgcmVhZGluZXNzIHN0YXRlLlxuICAgIGNhbkRyYWcgPSBmYWxzZTtcbiAgICBjYW5SZXNpemUgPSBmYWxzZTtcblxuICAgIC8vIENoZWNrIGZvciByZXNpemluZyByZWFkaW5lc3MuXG4gICAgaWYgKHJlc2l6ZUVkZ2UpIHtcbiAgICAgICAgaWYgKGV2ZW50LmJ1dHRvbiA9PT0gMCAmJiBldmVudC5kZXRhaWwgPT09IDEpIHtcbiAgICAgICAgICAgIC8vIFJlYWR5IHRvIHJlc2l6ZSBpZiB0aGUgcHJpbWFyeSBidXR0b24gd2FzIHByZXNzZWQgZm9yIHRoZSBmaXJzdCB0aW1lLlxuICAgICAgICAgICAgY2FuUmVzaXplID0gdHJ1ZTtcbiAgICAgICAgICAgIGludm9rZShcIndhaWxzOnJlc2l6ZTpcIiArIHJlc2l6ZUVkZ2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRG8gbm90IHN0YXJ0IGRyYWcgb3BlcmF0aW9ucyB3aXRoaW4gcmVzaXplIGVkZ2VzLlxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHRhcmdldDogSFRNTEVsZW1lbnQ7XG5cbiAgICBpZiAoZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgIH0gZWxzZSBpZiAoIShldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkgJiYgZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgTm9kZSkge1xuICAgICAgICB0YXJnZXQgPSBldmVudC50YXJnZXQucGFyZW50RWxlbWVudCA/PyBkb2N1bWVudC5ib2R5O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRhcmdldCA9IGRvY3VtZW50LmJvZHk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXQpO1xuICAgIGNvbnN0IHNldHRpbmcgPSBzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKFwiLS13YWlscy1kcmFnZ2FibGVcIikudHJpbSgpO1xuICAgIGlmIChzZXR0aW5nID09PSBcImRyYWdcIiAmJiBldmVudC5idXR0b24gPT09IDAgJiYgZXZlbnQuZGV0YWlsID09PSAxKSB7XG4gICAgICAgIC8vIFJlYWR5IHRvIGRyYWcgaWYgdGhlIHByaW1hcnkgYnV0dG9uIHdhcyBwcmVzc2VkIGZvciB0aGUgZmlyc3QgdGltZSBvbiBhIGRyYWdnYWJsZSBlbGVtZW50LlxuICAgICAgICAvLyBJZ25vcmUgY2xpY2tzIG9uIHRoZSBzY3JvbGxiYXIuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGV2ZW50Lm9mZnNldFggLSBwYXJzZUZsb2F0KHN0eWxlLnBhZGRpbmdMZWZ0KSA8IHRhcmdldC5jbGllbnRXaWR0aFxuICAgICAgICAgICAgJiYgZXZlbnQub2Zmc2V0WSAtIHBhcnNlRmxvYXQoc3R5bGUucGFkZGluZ1RvcCkgPCB0YXJnZXQuY2xpZW50SGVpZ2h0XG4gICAgICAgICkge1xuICAgICAgICAgICAgY2FuRHJhZyA9IHRydWU7XG4gICAgICAgICAgICBpbnZva2UoXCJ3YWlsczpkcmFnXCIpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBvbk1vdXNlVXAoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBidXR0b25zID0gYnV0dG9uc1RyYWNrZWQgPyBldmVudC5idXR0b25zIDogKGJ1dHRvbnMgJiB+KDEgPDwgZXZlbnQuYnV0dG9uKSk7XG5cbiAgICBpZiAoZXZlbnQuYnV0dG9uID09PSAwKSB7XG4gICAgICAgIGlmIChyZXNpemluZykge1xuICAgICAgICAgICAgLy8gTGV0IG1vdXNldXAgZXZlbnQgYnViYmxlIHdoZW4gYSBkcmFnIGVuZHMsIGJ1dCBub3Qgd2hlbiBhIHJlc2l6ZSBlbmRzLlxuICAgICAgICAgICAgc3VwcHJlc3NFdmVudChldmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdG9wIGRyYWdnaW5nIGFuZCByZXNpemluZyB3aGVuIHRoZSBwcmltYXJ5IGJ1dHRvbiBpcyBsaWZ0ZWQuXG4gICAgICAgIGNhbkRyYWcgPSBmYWxzZTtcbiAgICAgICAgZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgICAgY2FuUmVzaXplID0gZmFsc2U7XG4gICAgICAgIHJlc2l6aW5nID0gZmFsc2U7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBZnRlciBkcmFnZ2luZyBvciByZXNpemluZyBoYXMgc3RhcnRlZCwgb25seSBsaWZ0aW5nIHRoZSBwcmltYXJ5IGJ1dHRvbiBjYW4gc3RvcCBpdC5cbiAgICBzdXBwcmVzc0V2ZW50KGV2ZW50KTtcbiAgICByZXR1cm47XG59XG5cbmNvbnN0IGN1cnNvckZvckVkZ2UgPSBPYmplY3QuZnJlZXplKHtcbiAgICBcInNlLXJlc2l6ZVwiOiBcIm53c2UtcmVzaXplXCIsXG4gICAgXCJzdy1yZXNpemVcIjogXCJuZXN3LXJlc2l6ZVwiLFxuICAgIFwibnctcmVzaXplXCI6IFwibndzZS1yZXNpemVcIixcbiAgICBcIm5lLXJlc2l6ZVwiOiBcIm5lc3ctcmVzaXplXCIsXG4gICAgXCJ3LXJlc2l6ZVwiOiBcImV3LXJlc2l6ZVwiLFxuICAgIFwibi1yZXNpemVcIjogXCJucy1yZXNpemVcIixcbiAgICBcInMtcmVzaXplXCI6IFwibnMtcmVzaXplXCIsXG4gICAgXCJlLXJlc2l6ZVwiOiBcImV3LXJlc2l6ZVwiLFxufSlcblxuZnVuY3Rpb24gc2V0UmVzaXplKGVkZ2U/OiBrZXlvZiB0eXBlb2YgY3Vyc29yRm9yRWRnZSk6IHZvaWQge1xuICAgIGlmIChlZGdlKSB7XG4gICAgICAgIGlmICghcmVzaXplRWRnZSkgeyBkZWZhdWx0Q3Vyc29yID0gZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3I7IH1cbiAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3IgPSBjdXJzb3JGb3JFZGdlW2VkZ2VdO1xuICAgIH0gZWxzZSBpZiAoIWVkZ2UgJiYgcmVzaXplRWRnZSkge1xuICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLmN1cnNvciA9IGRlZmF1bHRDdXJzb3I7XG4gICAgfVxuXG4gICAgcmVzaXplRWRnZSA9IGVkZ2UgfHwgXCJcIjtcbn1cblxuZnVuY3Rpb24gb25Nb3VzZU1vdmUoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoY2FuUmVzaXplICYmIHJlc2l6ZUVkZ2UpIHtcbiAgICAgICAgLy8gU3RhcnQgcmVzaXppbmcuXG4gICAgICAgIHJlc2l6aW5nID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKGNhbkRyYWcpIHtcbiAgICAgICAgLy8gU3RhcnQgZHJhZ2dpbmcuXG4gICAgICAgIGRyYWdnaW5nID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoZHJhZ2dpbmcgfHwgcmVzaXppbmcpIHtcbiAgICAgICAgLy8gRWl0aGVyIGRyYWcgb3IgcmVzaXplIGlzIG9uZ29pbmcsXG4gICAgICAgIC8vIHJlc2V0IHJlYWRpbmVzcyBhbmQgc3RvcCBwcm9jZXNzaW5nLlxuICAgICAgICBjYW5EcmFnID0gY2FuUmVzaXplID0gZmFsc2U7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXJlc2l6YWJsZSB8fCAhSXNXaW5kb3dzKCkpIHtcbiAgICAgICAgaWYgKHJlc2l6ZUVkZ2UpIHsgc2V0UmVzaXplKCk7IH1cbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc2l6ZUhhbmRsZUhlaWdodCA9IEdldEZsYWcoXCJzeXN0ZW0ucmVzaXplSGFuZGxlSGVpZ2h0XCIpIHx8IDU7XG4gICAgY29uc3QgcmVzaXplSGFuZGxlV2lkdGggPSBHZXRGbGFnKFwic3lzdGVtLnJlc2l6ZUhhbmRsZVdpZHRoXCIpIHx8IDU7XG5cbiAgICAvLyBFeHRyYSBwaXhlbHMgZm9yIHRoZSBjb3JuZXIgYXJlYXMuXG4gICAgY29uc3QgY29ybmVyRXh0cmEgPSBHZXRGbGFnKFwicmVzaXplQ29ybmVyRXh0cmFcIikgfHwgMTA7XG5cbiAgICBjb25zdCByaWdodEJvcmRlciA9ICh3aW5kb3cub3V0ZXJXaWR0aCAtIGV2ZW50LmNsaWVudFgpIDwgcmVzaXplSGFuZGxlV2lkdGg7XG4gICAgY29uc3QgbGVmdEJvcmRlciA9IGV2ZW50LmNsaWVudFggPCByZXNpemVIYW5kbGVXaWR0aDtcbiAgICBjb25zdCB0b3BCb3JkZXIgPSBldmVudC5jbGllbnRZIDwgcmVzaXplSGFuZGxlSGVpZ2h0O1xuICAgIGNvbnN0IGJvdHRvbUJvcmRlciA9ICh3aW5kb3cub3V0ZXJIZWlnaHQgLSBldmVudC5jbGllbnRZKSA8IHJlc2l6ZUhhbmRsZUhlaWdodDtcblxuICAgIC8vIEFkanVzdCBmb3IgY29ybmVyIGFyZWFzLlxuICAgIGNvbnN0IHJpZ2h0Q29ybmVyID0gKHdpbmRvdy5vdXRlcldpZHRoIC0gZXZlbnQuY2xpZW50WCkgPCAocmVzaXplSGFuZGxlV2lkdGggKyBjb3JuZXJFeHRyYSk7XG4gICAgY29uc3QgbGVmdENvcm5lciA9IGV2ZW50LmNsaWVudFggPCAocmVzaXplSGFuZGxlV2lkdGggKyBjb3JuZXJFeHRyYSk7XG4gICAgY29uc3QgdG9wQ29ybmVyID0gZXZlbnQuY2xpZW50WSA8IChyZXNpemVIYW5kbGVIZWlnaHQgKyBjb3JuZXJFeHRyYSk7XG4gICAgY29uc3QgYm90dG9tQ29ybmVyID0gKHdpbmRvdy5vdXRlckhlaWdodCAtIGV2ZW50LmNsaWVudFkpIDwgKHJlc2l6ZUhhbmRsZUhlaWdodCArIGNvcm5lckV4dHJhKTtcblxuICAgIGlmICghbGVmdENvcm5lciAmJiAhdG9wQ29ybmVyICYmICFib3R0b21Db3JuZXIgJiYgIXJpZ2h0Q29ybmVyKSB7XG4gICAgICAgIC8vIE9wdGltaXNhdGlvbjogb3V0IG9mIGFsbCBjb3JuZXIgYXJlYXMgaW1wbGllcyBvdXQgb2YgYm9yZGVycy5cbiAgICAgICAgc2V0UmVzaXplKCk7XG4gICAgfVxuICAgIC8vIERldGVjdCBjb3JuZXJzLlxuICAgIGVsc2UgaWYgKHJpZ2h0Q29ybmVyICYmIGJvdHRvbUNvcm5lcikgc2V0UmVzaXplKFwic2UtcmVzaXplXCIpO1xuICAgIGVsc2UgaWYgKGxlZnRDb3JuZXIgJiYgYm90dG9tQ29ybmVyKSBzZXRSZXNpemUoXCJzdy1yZXNpemVcIik7XG4gICAgZWxzZSBpZiAobGVmdENvcm5lciAmJiB0b3BDb3JuZXIpIHNldFJlc2l6ZShcIm53LXJlc2l6ZVwiKTtcbiAgICBlbHNlIGlmICh0b3BDb3JuZXIgJiYgcmlnaHRDb3JuZXIpIHNldFJlc2l6ZShcIm5lLXJlc2l6ZVwiKTtcbiAgICAvLyBEZXRlY3QgYm9yZGVycy5cbiAgICBlbHNlIGlmIChsZWZ0Qm9yZGVyKSBzZXRSZXNpemUoXCJ3LXJlc2l6ZVwiKTtcbiAgICBlbHNlIGlmICh0b3BCb3JkZXIpIHNldFJlc2l6ZShcIm4tcmVzaXplXCIpO1xuICAgIGVsc2UgaWYgKGJvdHRvbUJvcmRlcikgc2V0UmVzaXplKFwicy1yZXNpemVcIik7XG4gICAgZWxzZSBpZiAocmlnaHRCb3JkZXIpIHNldFJlc2l6ZShcImUtcmVzaXplXCIpO1xuICAgIC8vIE91dCBvZiBib3JkZXIgYXJlYS5cbiAgICBlbHNlIHNldFJlc2l6ZSgpO1xufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5pbXBvcnQgeyBuZXdSdW50aW1lQ2FsbGVyLCBvYmplY3ROYW1lcyB9IGZyb20gXCIuL3J1bnRpbWUuanNcIjtcbmNvbnN0IGNhbGwgPSBuZXdSdW50aW1lQ2FsbGVyKG9iamVjdE5hbWVzLkFwcGxpY2F0aW9uKTtcblxuY29uc3QgSGlkZU1ldGhvZCA9IDA7XG5jb25zdCBTaG93TWV0aG9kID0gMTtcbmNvbnN0IFF1aXRNZXRob2QgPSAyO1xuXG4vKipcbiAqIEhpZGVzIGEgY2VydGFpbiBtZXRob2QgYnkgY2FsbGluZyB0aGUgSGlkZU1ldGhvZCBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEhpZGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIGNhbGwoSGlkZU1ldGhvZCk7XG59XG5cbi8qKlxuICogQ2FsbHMgdGhlIFNob3dNZXRob2QgYW5kIHJldHVybnMgdGhlIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFNob3coKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIGNhbGwoU2hvd01ldGhvZCk7XG59XG5cbi8qKlxuICogQ2FsbHMgdGhlIFF1aXRNZXRob2QgdG8gdGVybWluYXRlIHRoZSBwcm9ncmFtLlxuICovXG5leHBvcnQgZnVuY3Rpb24gUXVpdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gY2FsbChRdWl0TWV0aG9kKTtcbn1cbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuaW1wb3J0IHsgQ2FuY2VsbGFibGVQcm9taXNlLCB0eXBlIENhbmNlbGxhYmxlUHJvbWlzZVdpdGhSZXNvbHZlcnMgfSBmcm9tIFwiLi9jYW5jZWxsYWJsZS5qc1wiO1xuaW1wb3J0IHsgbmV3UnVudGltZUNhbGxlciwgb2JqZWN0TmFtZXMgfSBmcm9tIFwiLi9ydW50aW1lLmpzXCI7XG5pbXBvcnQgeyBuYW5vaWQgfSBmcm9tIFwiLi9uYW5vaWQuanNcIjtcblxuLy8gU2V0dXBcbndpbmRvdy5fd2FpbHMgPSB3aW5kb3cuX3dhaWxzIHx8IHt9O1xud2luZG93Ll93YWlscy5jYWxsUmVzdWx0SGFuZGxlciA9IHJlc3VsdEhhbmRsZXI7XG53aW5kb3cuX3dhaWxzLmNhbGxFcnJvckhhbmRsZXIgPSBlcnJvckhhbmRsZXI7XG5cbnR5cGUgUHJvbWlzZVJlc29sdmVycyA9IE9taXQ8Q2FuY2VsbGFibGVQcm9taXNlV2l0aFJlc29sdmVyczxhbnk+LCBcInByb21pc2VcIiB8IFwib25jYW5jZWxsZWRcIj5cblxuY29uc3QgY2FsbCA9IG5ld1J1bnRpbWVDYWxsZXIob2JqZWN0TmFtZXMuQ2FsbCk7XG5jb25zdCBjYW5jZWxDYWxsID0gbmV3UnVudGltZUNhbGxlcihvYmplY3ROYW1lcy5DYW5jZWxDYWxsKTtcbmNvbnN0IGNhbGxSZXNwb25zZXMgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZVJlc29sdmVycz4oKTtcblxuY29uc3QgQ2FsbEJpbmRpbmcgPSAwO1xuY29uc3QgQ2FuY2VsTWV0aG9kID0gMFxuXG4vKipcbiAqIEhvbGRzIGFsbCByZXF1aXJlZCBpbmZvcm1hdGlvbiBmb3IgYSBiaW5kaW5nIGNhbGwuXG4gKiBNYXkgcHJvdmlkZSBlaXRoZXIgYSBtZXRob2QgSUQgb3IgYSBtZXRob2QgbmFtZSwgYnV0IG5vdCBib3RoLlxuICovXG5leHBvcnQgdHlwZSBDYWxsT3B0aW9ucyA9IHtcbiAgICAvKiogVGhlIG51bWVyaWMgSUQgb2YgdGhlIGJvdW5kIG1ldGhvZCB0byBjYWxsLiAqL1xuICAgIG1ldGhvZElEOiBudW1iZXI7XG4gICAgLyoqIFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgYm91bmQgbWV0aG9kIHRvIGNhbGwuICovXG4gICAgbWV0aG9kTmFtZT86IG5ldmVyO1xuICAgIC8qKiBBcmd1bWVudHMgdG8gYmUgcGFzc2VkIGludG8gdGhlIGJvdW5kIG1ldGhvZC4gKi9cbiAgICBhcmdzOiBhbnlbXTtcbn0gfCB7XG4gICAgLyoqIFRoZSBudW1lcmljIElEIG9mIHRoZSBib3VuZCBtZXRob2QgdG8gY2FsbC4gKi9cbiAgICBtZXRob2RJRD86IG5ldmVyO1xuICAgIC8qKiBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGJvdW5kIG1ldGhvZCB0byBjYWxsLiAqL1xuICAgIG1ldGhvZE5hbWU6IHN0cmluZztcbiAgICAvKiogQXJndW1lbnRzIHRvIGJlIHBhc3NlZCBpbnRvIHRoZSBib3VuZCBtZXRob2QuICovXG4gICAgYXJnczogYW55W107XG59O1xuXG4vKipcbiAqIEV4Y2VwdGlvbiBjbGFzcyB0aGF0IHdpbGwgYmUgdGhyb3duIGluIGNhc2UgdGhlIGJvdW5kIG1ldGhvZCByZXR1cm5zIGFuIGVycm9yLlxuICogVGhlIHZhbHVlIG9mIHRoZSB7QGxpbmsgUnVudGltZUVycm9yI25hbWV9IHByb3BlcnR5IGlzIFwiUnVudGltZUVycm9yXCIuXG4gKi9cbmV4cG9ydCBjbGFzcyBSdW50aW1lRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIG5ldyBSdW50aW1lRXJyb3IgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgZXJyb3IgbWVzc2FnZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gYmUgZm9yd2FyZGVkIHRvIHRoZSBFcnJvciBjb25zdHJ1Y3Rvci5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlPzogc3RyaW5nLCBvcHRpb25zPzogRXJyb3JPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLm5hbWUgPSBcIlJ1bnRpbWVFcnJvclwiO1xuICAgIH1cbn1cblxuLyoqXG4gKiBIYW5kbGVzIHRoZSByZXN1bHQgb2YgYSBjYWxsIHJlcXVlc3QuXG4gKlxuICogQHBhcmFtIGlkIC0gVGhlIGlkIG9mIHRoZSByZXF1ZXN0IHRvIGhhbmRsZSB0aGUgcmVzdWx0IGZvci5cbiAqIEBwYXJhbSBkYXRhIC0gVGhlIHJlc3VsdCBkYXRhIG9mIHRoZSByZXF1ZXN0LlxuICogQHBhcmFtIGlzSlNPTiAtIEluZGljYXRlcyB3aGV0aGVyIHRoZSBkYXRhIGlzIEpTT04gb3Igbm90LlxuICovXG5mdW5jdGlvbiByZXN1bHRIYW5kbGVyKGlkOiBzdHJpbmcsIGRhdGE6IHN0cmluZywgaXNKU09OOiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgcmVzb2x2ZXJzID0gZ2V0QW5kRGVsZXRlUmVzcG9uc2UoaWQpO1xuICAgIGlmICghcmVzb2x2ZXJzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgcmVzb2x2ZXJzLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgICB9IGVsc2UgaWYgKCFpc0pTT04pIHtcbiAgICAgICAgcmVzb2x2ZXJzLnJlc29sdmUoZGF0YSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlc29sdmVycy5yZXNvbHZlKEpTT04ucGFyc2UoZGF0YSkpO1xuICAgICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICAgICAgcmVzb2x2ZXJzLnJlamVjdChuZXcgVHlwZUVycm9yKFwiY291bGQgbm90IHBhcnNlIHJlc3VsdDogXCIgKyBlcnIubWVzc2FnZSwgeyBjYXVzZTogZXJyIH0pKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBIYW5kbGVzIHRoZSBlcnJvciBmcm9tIGEgY2FsbCByZXF1ZXN0LlxuICpcbiAqIEBwYXJhbSBpZCAtIFRoZSBpZCBvZiB0aGUgcHJvbWlzZSBoYW5kbGVyLlxuICogQHBhcmFtIGRhdGEgLSBUaGUgZXJyb3IgZGF0YSB0byByZWplY3QgdGhlIHByb21pc2UgaGFuZGxlciB3aXRoLlxuICogQHBhcmFtIGlzSlNPTiAtIEluZGljYXRlcyB3aGV0aGVyIHRoZSBkYXRhIGlzIEpTT04gb3Igbm90LlxuICovXG5mdW5jdGlvbiBlcnJvckhhbmRsZXIoaWQ6IHN0cmluZywgZGF0YTogc3RyaW5nLCBpc0pTT046IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCByZXNvbHZlcnMgPSBnZXRBbmREZWxldGVSZXNwb25zZShpZCk7XG4gICAgaWYgKCFyZXNvbHZlcnMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghaXNKU09OKSB7XG4gICAgICAgIHJlc29sdmVycy5yZWplY3QobmV3IEVycm9yKGRhdGEpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgZXJyb3I6IGFueTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGVycm9yID0gSlNPTi5wYXJzZShkYXRhKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgICAgIHJlc29sdmVycy5yZWplY3QobmV3IFR5cGVFcnJvcihcImNvdWxkIG5vdCBwYXJzZSBlcnJvcjogXCIgKyBlcnIubWVzc2FnZSwgeyBjYXVzZTogZXJyIH0pKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBvcHRpb25zOiBFcnJvck9wdGlvbnMgPSB7fTtcbiAgICAgICAgaWYgKGVycm9yLmNhdXNlKSB7XG4gICAgICAgICAgICBvcHRpb25zLmNhdXNlID0gZXJyb3IuY2F1c2U7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZXhjZXB0aW9uO1xuICAgICAgICBzd2l0Y2ggKGVycm9yLmtpbmQpIHtcbiAgICAgICAgICAgIGNhc2UgXCJSZWZlcmVuY2VFcnJvclwiOlxuICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiA9IG5ldyBSZWZlcmVuY2VFcnJvcihlcnJvci5tZXNzYWdlLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJUeXBlRXJyb3JcIjpcbiAgICAgICAgICAgICAgICBleGNlcHRpb24gPSBuZXcgVHlwZUVycm9yKGVycm9yLm1lc3NhZ2UsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIlJ1bnRpbWVFcnJvclwiOlxuICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiA9IG5ldyBSdW50aW1lRXJyb3IoZXJyb3IubWVzc2FnZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiA9IG5ldyBFcnJvcihlcnJvci5tZXNzYWdlLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc29sdmVycy5yZWplY3QoZXhjZXB0aW9uKTtcbiAgICB9XG59XG5cbi8qKlxuICogUmV0cmlldmVzIGFuZCByZW1vdmVzIHRoZSByZXNwb25zZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIElEIGZyb20gdGhlIGNhbGxSZXNwb25zZXMgbWFwLlxuICpcbiAqIEBwYXJhbSBpZCAtIFRoZSBJRCBvZiB0aGUgcmVzcG9uc2UgdG8gYmUgcmV0cmlldmVkIGFuZCByZW1vdmVkLlxuICogQHJldHVybnMgVGhlIHJlc3BvbnNlIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIElELCBpZiBhbnkuXG4gKi9cbmZ1bmN0aW9uIGdldEFuZERlbGV0ZVJlc3BvbnNlKGlkOiBzdHJpbmcpOiBQcm9taXNlUmVzb2x2ZXJzIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZXNwb25zZSA9IGNhbGxSZXNwb25zZXMuZ2V0KGlkKTtcbiAgICBjYWxsUmVzcG9uc2VzLmRlbGV0ZShpZCk7XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIHVuaXF1ZSBJRCB1c2luZyB0aGUgbmFub2lkIGxpYnJhcnkuXG4gKlxuICogQHJldHVybnMgQSB1bmlxdWUgSUQgdGhhdCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgY2FsbFJlc3BvbnNlcyBzZXQuXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlSUQoKTogc3RyaW5nIHtcbiAgICBsZXQgcmVzdWx0O1xuICAgIGRvIHtcbiAgICAgICAgcmVzdWx0ID0gbmFub2lkKCk7XG4gICAgfSB3aGlsZSAoY2FsbFJlc3BvbnNlcy5oYXMocmVzdWx0KSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBDYWxsIGEgYm91bmQgbWV0aG9kIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gY2FsbCBvcHRpb25zLlxuICpcbiAqIEluIGNhc2Ugb2YgZmFpbHVyZSwgdGhlIHJldHVybmVkIHByb21pc2Ugd2lsbCByZWplY3Qgd2l0aCBhbiBleGNlcHRpb25cbiAqIGFtb25nIFJlZmVyZW5jZUVycm9yICh1bmtub3duIG1ldGhvZCksIFR5cGVFcnJvciAod3JvbmcgYXJndW1lbnQgY291bnQgb3IgdHlwZSksXG4gKiB7QGxpbmsgUnVudGltZUVycm9yfSAobWV0aG9kIHJldHVybmVkIGFuIGVycm9yKSwgb3Igb3RoZXIgKG5ldHdvcmsgb3IgaW50ZXJuYWwgZXJyb3JzKS5cbiAqIFRoZSBleGNlcHRpb24gbWlnaHQgaGF2ZSBhIFwiY2F1c2VcIiBmaWVsZCB3aXRoIHRoZSB2YWx1ZSByZXR1cm5lZFxuICogYnkgdGhlIGFwcGxpY2F0aW9uLSBvciBzZXJ2aWNlLWxldmVsIGVycm9yIG1hcnNoYWxpbmcgZnVuY3Rpb25zLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gQSBtZXRob2QgY2FsbCBkZXNjcmlwdG9yLlxuICogQHJldHVybnMgVGhlIHJlc3VsdCBvZiB0aGUgY2FsbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENhbGwob3B0aW9uczogQ2FsbE9wdGlvbnMpOiBDYW5jZWxsYWJsZVByb21pc2U8YW55PiB7XG4gICAgY29uc3QgaWQgPSBnZW5lcmF0ZUlEKCk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBDYW5jZWxsYWJsZVByb21pc2Uud2l0aFJlc29sdmVyczxhbnk+KCk7XG4gICAgY2FsbFJlc3BvbnNlcy5zZXQoaWQsIHsgcmVzb2x2ZTogcmVzdWx0LnJlc29sdmUsIHJlamVjdDogcmVzdWx0LnJlamVjdCB9KTtcblxuICAgIGNvbnN0IHJlcXVlc3QgPSBjYWxsKENhbGxCaW5kaW5nLCBPYmplY3QuYXNzaWduKHsgXCJjYWxsLWlkXCI6IGlkIH0sIG9wdGlvbnMpKTtcbiAgICBsZXQgcnVubmluZyA9IGZhbHNlO1xuXG4gICAgcmVxdWVzdC50aGVuKCgpID0+IHtcbiAgICAgICAgcnVubmluZyA9IHRydWU7XG4gICAgfSwgKGVycikgPT4ge1xuICAgICAgICBjYWxsUmVzcG9uc2VzLmRlbGV0ZShpZCk7XG4gICAgICAgIHJlc3VsdC5yZWplY3QoZXJyKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGNhbmNlbCA9ICgpID0+IHtcbiAgICAgICAgY2FsbFJlc3BvbnNlcy5kZWxldGUoaWQpO1xuICAgICAgICByZXR1cm4gY2FuY2VsQ2FsbChDYW5jZWxNZXRob2QsIHtcImNhbGwtaWRcIjogaWR9KS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIHdoaWxlIHJlcXVlc3RpbmcgYmluZGluZyBjYWxsIGNhbmNlbGxhdGlvbjpcIiwgZXJyKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJlc3VsdC5vbmNhbmNlbGxlZCA9ICgpID0+IHtcbiAgICAgICAgaWYgKHJ1bm5pbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBjYW5jZWwoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByZXF1ZXN0LnRoZW4oY2FuY2VsKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gcmVzdWx0LnByb21pc2U7XG59XG5cbi8qKlxuICogQ2FsbHMgYSBib3VuZCBtZXRob2QgYnkgbmFtZSB3aXRoIHRoZSBzcGVjaWZpZWQgYXJndW1lbnRzLlxuICogU2VlIHtAbGluayBDYWxsfSBmb3IgZGV0YWlscy5cbiAqXG4gKiBAcGFyYW0gbWV0aG9kTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBtZXRob2QgaW4gdGhlIGZvcm1hdCAncGFja2FnZS5zdHJ1Y3QubWV0aG9kJy5cbiAqIEBwYXJhbSBhcmdzIC0gVGhlIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBtZXRob2QuXG4gKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIHRoZSBtZXRob2QgY2FsbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEJ5TmFtZShtZXRob2ROYW1lOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogQ2FuY2VsbGFibGVQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBDYWxsKHsgbWV0aG9kTmFtZSwgYXJncyB9KTtcbn1cblxuLyoqXG4gKiBDYWxscyBhIG1ldGhvZCBieSBpdHMgbnVtZXJpYyBJRCB3aXRoIHRoZSBzcGVjaWZpZWQgYXJndW1lbnRzLlxuICogU2VlIHtAbGluayBDYWxsfSBmb3IgZGV0YWlscy5cbiAqXG4gKiBAcGFyYW0gbWV0aG9kSUQgLSBUaGUgSUQgb2YgdGhlIG1ldGhvZCB0byBjYWxsLlxuICogQHBhcmFtIGFyZ3MgLSBUaGUgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIG1ldGhvZC5cbiAqIEByZXR1cm4gVGhlIHJlc3VsdCBvZiB0aGUgbWV0aG9kIGNhbGwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBCeUlEKG1ldGhvZElEOiBudW1iZXIsIC4uLmFyZ3M6IGFueVtdKTogQ2FuY2VsbGFibGVQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBDYWxsKHsgbWV0aG9kSUQsIGFyZ3MgfSk7XG59XG4iLCAiLy8gU291cmNlOiBodHRwczovL2dpdGh1Yi5jb20vaW5zcGVjdC1qcy9pcy1jYWxsYWJsZVxuXG4vLyBUaGUgTUlUIExpY2Vuc2UgKE1JVClcbi8vXG4vLyBDb3B5cmlnaHQgKGMpIDIwMTUgSm9yZGFuIEhhcmJhbmRcbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4vLyBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbi8vIFNPRlRXQVJFLlxuXG52YXIgZm5Ub1N0ciA9IEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZztcbnZhciByZWZsZWN0QXBwbHk6IHR5cGVvZiBSZWZsZWN0LmFwcGx5IHwgZmFsc2UgfCBudWxsID0gdHlwZW9mIFJlZmxlY3QgPT09ICdvYmplY3QnICYmIFJlZmxlY3QgIT09IG51bGwgJiYgUmVmbGVjdC5hcHBseTtcbnZhciBiYWRBcnJheUxpa2U6IGFueTtcbnZhciBpc0NhbGxhYmxlTWFya2VyOiBhbnk7XG5pZiAodHlwZW9mIHJlZmxlY3RBcHBseSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgT2JqZWN0LmRlZmluZVByb3BlcnR5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgYmFkQXJyYXlMaWtlID0gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAnbGVuZ3RoJywge1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgaXNDYWxsYWJsZU1hcmtlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlzQ2FsbGFibGVNYXJrZXIgPSB7fTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXRocm93LWxpdGVyYWxcbiAgICAgICAgcmVmbGVjdEFwcGx5KGZ1bmN0aW9uICgpIHsgdGhyb3cgNDI7IH0sIG51bGwsIGJhZEFycmF5TGlrZSk7XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgICBpZiAoXyAhPT0gaXNDYWxsYWJsZU1hcmtlcikge1xuICAgICAgICAgICAgcmVmbGVjdEFwcGx5ID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn0gZWxzZSB7XG4gICAgcmVmbGVjdEFwcGx5ID0gbnVsbDtcbn1cblxudmFyIGNvbnN0cnVjdG9yUmVnZXggPSAvXlxccypjbGFzc1xcYi87XG52YXIgaXNFUzZDbGFzc0ZuID0gZnVuY3Rpb24gaXNFUzZDbGFzc0Z1bmN0aW9uKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgICB2YXIgZm5TdHIgPSBmblRvU3RyLmNhbGwodmFsdWUpO1xuICAgICAgICByZXR1cm4gY29uc3RydWN0b3JSZWdleC50ZXN0KGZuU3RyKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTsgLy8gbm90IGEgZnVuY3Rpb25cbiAgICB9XG59O1xuXG52YXIgdHJ5RnVuY3Rpb25PYmplY3QgPSBmdW5jdGlvbiB0cnlGdW5jdGlvblRvU3RyKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAoaXNFUzZDbGFzc0ZuKHZhbHVlKSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAgICAgZm5Ub1N0ci5jYWxsKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufTtcbnZhciB0b1N0ciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgb2JqZWN0Q2xhc3MgPSAnW29iamVjdCBPYmplY3RdJztcbnZhciBmbkNsYXNzID0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbnZhciBnZW5DbGFzcyA9ICdbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSc7XG52YXIgZGRhQ2xhc3MgPSAnW29iamVjdCBIVE1MQWxsQ29sbGVjdGlvbl0nOyAvLyBJRSAxMVxudmFyIGRkYUNsYXNzMiA9ICdbb2JqZWN0IEhUTUwgZG9jdW1lbnQuYWxsIGNsYXNzXSc7XG52YXIgZGRhQ2xhc3MzID0gJ1tvYmplY3QgSFRNTENvbGxlY3Rpb25dJzsgLy8gSUUgOS0xMFxudmFyIGhhc1RvU3RyaW5nVGFnID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiAhIVN5bWJvbC50b1N0cmluZ1RhZzsgLy8gYmV0dGVyOiB1c2UgYGhhcy10b3N0cmluZ3RhZ2BcblxudmFyIGlzSUU2OCA9ICEoMCBpbiBbLF0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNwYXJzZS1hcnJheXMsIGNvbW1hLXNwYWNpbmdcblxudmFyIGlzRERBOiAodmFsdWU6IGFueSkgPT4gYm9vbGVhbiA9IGZ1bmN0aW9uIGlzRG9jdW1lbnREb3RBbGwoKSB7IHJldHVybiBmYWxzZTsgfTtcbmlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICdvYmplY3QnKSB7XG4gICAgLy8gRmlyZWZveCAzIGNhbm9uaWNhbGl6ZXMgRERBIHRvIHVuZGVmaW5lZCB3aGVuIGl0J3Mgbm90IGFjY2Vzc2VkIGRpcmVjdGx5XG4gICAgdmFyIGFsbCA9IGRvY3VtZW50LmFsbDtcbiAgICBpZiAodG9TdHIuY2FsbChhbGwpID09PSB0b1N0ci5jYWxsKGRvY3VtZW50LmFsbCkpIHtcbiAgICAgICAgaXNEREEgPSBmdW5jdGlvbiBpc0RvY3VtZW50RG90QWxsKHZhbHVlKSB7XG4gICAgICAgICAgICAvKiBnbG9iYWxzIGRvY3VtZW50OiBmYWxzZSAqL1xuICAgICAgICAgICAgLy8gaW4gSUUgNi04LCB0eXBlb2YgZG9jdW1lbnQuYWxsIGlzIFwib2JqZWN0XCIgYW5kIGl0J3MgdHJ1dGh5XG4gICAgICAgICAgICBpZiAoKGlzSUU2OCB8fCAhdmFsdWUpICYmICh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ciA9IHRvU3RyLmNhbGwodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RyID09PSBkZGFDbGFzc1xuICAgICAgICAgICAgICAgICAgICAgICAgfHwgc3RyID09PSBkZGFDbGFzczJcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IHN0ciA9PT0gZGRhQ2xhc3MzIC8vIG9wZXJhIDEyLjE2XG4gICAgICAgICAgICAgICAgICAgICAgICB8fCBzdHIgPT09IG9iamVjdENsYXNzIC8vIElFIDYtOFxuICAgICAgICAgICAgICAgICAgICApICYmIHZhbHVlKCcnKSA9PSBudWxsOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGVxZXFlcVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgLyoqLyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH07XG4gICAgfVxufVxuXG5mdW5jdGlvbiBpc0NhbGxhYmxlUmVmQXBwbHk8VD4odmFsdWU6IFQgfCB1bmtub3duKTogdmFsdWUgaXMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkgIHtcbiAgICBpZiAoaXNEREEodmFsdWUpKSB7IHJldHVybiB0cnVlOyB9XG4gICAgaWYgKCF2YWx1ZSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgdHJ5IHtcbiAgICAgICAgKHJlZmxlY3RBcHBseSBhcyBhbnkpKHZhbHVlLCBudWxsLCBiYWRBcnJheUxpa2UpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGUgIT09IGlzQ2FsbGFibGVNYXJrZXIpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgfVxuICAgIHJldHVybiAhaXNFUzZDbGFzc0ZuKHZhbHVlKSAmJiB0cnlGdW5jdGlvbk9iamVjdCh2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIGlzQ2FsbGFibGVOb1JlZkFwcGx5PFQ+KHZhbHVlOiBUIHwgdW5rbm93bik6IHZhbHVlIGlzICguLi5hcmdzOiBhbnlbXSkgPT4gYW55IHtcbiAgICBpZiAoaXNEREEodmFsdWUpKSB7IHJldHVybiB0cnVlOyB9XG4gICAgaWYgKCF2YWx1ZSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgaWYgKGhhc1RvU3RyaW5nVGFnKSB7IHJldHVybiB0cnlGdW5jdGlvbk9iamVjdCh2YWx1ZSk7IH1cbiAgICBpZiAoaXNFUzZDbGFzc0ZuKHZhbHVlKSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICB2YXIgc3RyQ2xhc3MgPSB0b1N0ci5jYWxsKHZhbHVlKTtcbiAgICBpZiAoc3RyQ2xhc3MgIT09IGZuQ2xhc3MgJiYgc3RyQ2xhc3MgIT09IGdlbkNsYXNzICYmICEoL15cXFtvYmplY3QgSFRNTC8pLnRlc3Qoc3RyQ2xhc3MpKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIHJldHVybiB0cnlGdW5jdGlvbk9iamVjdCh2YWx1ZSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCByZWZsZWN0QXBwbHkgPyBpc0NhbGxhYmxlUmVmQXBwbHkgOiBpc0NhbGxhYmxlTm9SZWZBcHBseTtcbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuaW1wb3J0IGlzQ2FsbGFibGUgZnJvbSBcIi4vY2FsbGFibGUuanNcIjtcblxuLyoqXG4gKiBFeGNlcHRpb24gY2xhc3MgdGhhdCB3aWxsIGJlIHVzZWQgYXMgcmVqZWN0aW9uIHJlYXNvblxuICogaW4gY2FzZSBhIHtAbGluayBDYW5jZWxsYWJsZVByb21pc2V9IGlzIGNhbmNlbGxlZCBzdWNjZXNzZnVsbHkuXG4gKlxuICogVGhlIHZhbHVlIG9mIHRoZSB7QGxpbmsgbmFtZX0gcHJvcGVydHkgaXMgdGhlIHN0cmluZyBgXCJDYW5jZWxFcnJvclwiYC5cbiAqIFRoZSB2YWx1ZSBvZiB0aGUge0BsaW5rIGNhdXNlfSBwcm9wZXJ0eSBpcyB0aGUgY2F1c2UgcGFzc2VkIHRvIHRoZSBjYW5jZWwgbWV0aG9kLCBpZiBhbnkuXG4gKi9cbmV4cG9ydCBjbGFzcyBDYW5jZWxFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGBDYW5jZWxFcnJvcmAgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgZXJyb3IgbWVzc2FnZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gYmUgZm9yd2FyZGVkIHRvIHRoZSBFcnJvciBjb25zdHJ1Y3Rvci5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlPzogc3RyaW5nLCBvcHRpb25zPzogRXJyb3JPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLm5hbWUgPSBcIkNhbmNlbEVycm9yXCI7XG4gICAgfVxufVxuXG4vKipcbiAqIEV4Y2VwdGlvbiBjbGFzcyB0aGF0IHdpbGwgYmUgcmVwb3J0ZWQgYXMgYW4gdW5oYW5kbGVkIHJlamVjdGlvblxuICogaW4gY2FzZSBhIHtAbGluayBDYW5jZWxsYWJsZVByb21pc2V9IHJlamVjdHMgYWZ0ZXIgYmVpbmcgY2FuY2VsbGVkLFxuICogb3Igd2hlbiB0aGUgYG9uY2FuY2VsbGVkYCBjYWxsYmFjayB0aHJvd3Mgb3IgcmVqZWN0cy5cbiAqXG4gKiBUaGUgdmFsdWUgb2YgdGhlIHtAbGluayBuYW1lfSBwcm9wZXJ0eSBpcyB0aGUgc3RyaW5nIGBcIkNhbmNlbGxlZFJlamVjdGlvbkVycm9yXCJgLlxuICogVGhlIHZhbHVlIG9mIHRoZSB7QGxpbmsgY2F1c2V9IHByb3BlcnR5IGlzIHRoZSByZWFzb24gdGhlIHByb21pc2UgcmVqZWN0ZWQgd2l0aC5cbiAqXG4gKiBCZWNhdXNlIHRoZSBvcmlnaW5hbCBwcm9taXNlIHdhcyBjYW5jZWxsZWQsXG4gKiBhIHdyYXBwZXIgcHJvbWlzZSB3aWxsIGJlIHBhc3NlZCB0byB0aGUgdW5oYW5kbGVkIHJlamVjdGlvbiBsaXN0ZW5lciBpbnN0ZWFkLlxuICogVGhlIHtAbGluayBwcm9taXNlfSBwcm9wZXJ0eSBob2xkcyBhIHJlZmVyZW5jZSB0byB0aGUgb3JpZ2luYWwgcHJvbWlzZS5cbiAqL1xuZXhwb3J0IGNsYXNzIENhbmNlbGxlZFJlamVjdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIC8qKlxuICAgICAqIEhvbGRzIGEgcmVmZXJlbmNlIHRvIHRoZSBwcm9taXNlIHRoYXQgd2FzIGNhbmNlbGxlZCBhbmQgdGhlbiByZWplY3RlZC5cbiAgICAgKi9cbiAgICBwcm9taXNlOiBDYW5jZWxsYWJsZVByb21pc2U8dW5rbm93bj47XG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGBDYW5jZWxsZWRSZWplY3Rpb25FcnJvcmAgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHByb21pc2UgLSBUaGUgcHJvbWlzZSB0aGF0IGNhdXNlZCB0aGUgZXJyb3Igb3JpZ2luYWxseS5cbiAgICAgKiBAcGFyYW0gcmVhc29uIC0gVGhlIHJlamVjdGlvbiByZWFzb24uXG4gICAgICogQHBhcmFtIGluZm8gLSBBbiBvcHRpb25hbCBpbmZvcm1hdGl2ZSBtZXNzYWdlIHNwZWNpZnlpbmcgdGhlIGNpcmN1bXN0YW5jZXMgaW4gd2hpY2ggdGhlIGVycm9yIHdhcyB0aHJvd24uXG4gICAgICogICAgICAgICAgICAgICBEZWZhdWx0cyB0byB0aGUgc3RyaW5nIGBcIlVuaGFuZGxlZCByZWplY3Rpb24gaW4gY2FuY2VsbGVkIHByb21pc2UuXCJgLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHByb21pc2U6IENhbmNlbGxhYmxlUHJvbWlzZTx1bmtub3duPiwgcmVhc29uPzogYW55LCBpbmZvPzogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKChpbmZvID8/IFwiVW5oYW5kbGVkIHJlamVjdGlvbiBpbiBjYW5jZWxsZWQgcHJvbWlzZS5cIikgKyBcIiBSZWFzb246IFwiICsgZXJyb3JNZXNzYWdlKHJlYXNvbiksIHsgY2F1c2U6IHJlYXNvbiB9KTtcbiAgICAgICAgdGhpcy5wcm9taXNlID0gcHJvbWlzZTtcbiAgICAgICAgdGhpcy5uYW1lID0gXCJDYW5jZWxsZWRSZWplY3Rpb25FcnJvclwiO1xuICAgIH1cbn1cblxudHlwZSBDYW5jZWxsYWJsZVByb21pc2VSZXNvbHZlcjxUPiA9ICh2YWx1ZTogVCB8IFByb21pc2VMaWtlPFQ+IHwgQ2FuY2VsbGFibGVQcm9taXNlTGlrZTxUPikgPT4gdm9pZDtcbnR5cGUgQ2FuY2VsbGFibGVQcm9taXNlUmVqZWN0b3IgPSAocmVhc29uPzogYW55KSA9PiB2b2lkO1xudHlwZSBDYW5jZWxsYWJsZVByb21pc2VDYW5jZWxsZXIgPSAoY2F1c2U/OiBhbnkpID0+IHZvaWQgfCBQcm9taXNlTGlrZTx2b2lkPjtcbnR5cGUgQ2FuY2VsbGFibGVQcm9taXNlRXhlY3V0b3I8VD4gPSAocmVzb2x2ZTogQ2FuY2VsbGFibGVQcm9taXNlUmVzb2x2ZXI8VD4sIHJlamVjdDogQ2FuY2VsbGFibGVQcm9taXNlUmVqZWN0b3IpID0+IHZvaWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FuY2VsbGFibGVQcm9taXNlTGlrZTxUPiB7XG4gICAgdGhlbjxUUmVzdWx0MSA9IFQsIFRSZXN1bHQyID0gbmV2ZXI+KG9uZnVsZmlsbGVkPzogKCh2YWx1ZTogVCkgPT4gVFJlc3VsdDEgfCBQcm9taXNlTGlrZTxUUmVzdWx0MT4gfCBDYW5jZWxsYWJsZVByb21pc2VMaWtlPFRSZXN1bHQxPikgfCB1bmRlZmluZWQgfCBudWxsLCBvbnJlamVjdGVkPzogKChyZWFzb246IGFueSkgPT4gVFJlc3VsdDIgfCBQcm9taXNlTGlrZTxUUmVzdWx0Mj4gfCBDYW5jZWxsYWJsZVByb21pc2VMaWtlPFRSZXN1bHQyPikgfCB1bmRlZmluZWQgfCBudWxsKTogQ2FuY2VsbGFibGVQcm9taXNlTGlrZTxUUmVzdWx0MSB8IFRSZXN1bHQyPjtcbiAgICBjYW5jZWwoY2F1c2U/OiBhbnkpOiB2b2lkO1xufVxuXG4vKipcbiAqIFdyYXBzIGEgY2FuY2VsbGFibGUgcHJvbWlzZSBhbG9uZyB3aXRoIGl0cyByZXNvbHV0aW9uIG1ldGhvZHMuXG4gKiBUaGUgYG9uY2FuY2VsbGVkYCBmaWVsZCB3aWxsIGJlIG51bGwgaW5pdGlhbGx5IGJ1dCBtYXkgYmUgc2V0IHRvIHByb3ZpZGUgYSBjdXN0b20gY2FuY2VsbGF0aW9uIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhbmNlbGxhYmxlUHJvbWlzZVdpdGhSZXNvbHZlcnM8VD4ge1xuICAgIHByb21pc2U6IENhbmNlbGxhYmxlUHJvbWlzZTxUPjtcbiAgICByZXNvbHZlOiBDYW5jZWxsYWJsZVByb21pc2VSZXNvbHZlcjxUPjtcbiAgICByZWplY3Q6IENhbmNlbGxhYmxlUHJvbWlzZVJlamVjdG9yO1xuICAgIG9uY2FuY2VsbGVkOiBDYW5jZWxsYWJsZVByb21pc2VDYW5jZWxsZXIgfCBudWxsO1xufVxuXG5pbnRlcmZhY2UgQ2FuY2VsbGFibGVQcm9taXNlU3RhdGUge1xuICAgIHJlYWRvbmx5IHJvb3Q6IENhbmNlbGxhYmxlUHJvbWlzZVN0YXRlO1xuICAgIHJlc29sdmluZzogYm9vbGVhbjtcbiAgICBzZXR0bGVkOiBib29sZWFuO1xuICAgIHJlYXNvbj86IENhbmNlbEVycm9yO1xufVxuXG4vLyBQcml2YXRlIGZpZWxkIG5hbWVzLlxuY29uc3QgYmFycmllclN5bSA9IFN5bWJvbChcImJhcnJpZXJcIik7XG5jb25zdCBjYW5jZWxJbXBsU3ltID0gU3ltYm9sKFwiY2FuY2VsSW1wbFwiKTtcbmNvbnN0IHNwZWNpZXMgPSBTeW1ib2wuc3BlY2llcyA/PyBTeW1ib2woXCJzcGVjaWVzUG9seWZpbGxcIik7XG5cbi8qKlxuICogQSBwcm9taXNlIHdpdGggYW4gYXR0YWNoZWQgbWV0aG9kIGZvciBjYW5jZWxsaW5nIGxvbmctcnVubmluZyBvcGVyYXRpb25zIChzZWUge0BsaW5rIENhbmNlbGxhYmxlUHJvbWlzZSNjYW5jZWx9KS5cbiAqIENhbmNlbGxhdGlvbiBjYW4gb3B0aW9uYWxseSBiZSBib3VuZCB0byBhbiB7QGxpbmsgQWJvcnRTaWduYWx9XG4gKiBmb3IgYmV0dGVyIGNvbXBvc2FiaWxpdHkgKHNlZSB7QGxpbmsgQ2FuY2VsbGFibGVQcm9taXNlI2NhbmNlbE9ufSkuXG4gKlxuICogQ2FuY2VsbGluZyBhIHBlbmRpbmcgcHJvbWlzZSB3aWxsIHJlc3VsdCBpbiBhbiBpbW1lZGlhdGUgcmVqZWN0aW9uXG4gKiB3aXRoIGFuIGluc3RhbmNlIG9mIHtAbGluayBDYW5jZWxFcnJvcn0gYXMgcmVhc29uLFxuICogYnV0IHdob2V2ZXIgc3RhcnRlZCB0aGUgcHJvbWlzZSB3aWxsIGJlIHJlc3BvbnNpYmxlXG4gKiBmb3IgYWN0dWFsbHkgYWJvcnRpbmcgdGhlIHVuZGVybHlpbmcgb3BlcmF0aW9uLlxuICogVG8gdGhpcyBwdXJwb3NlLCB0aGUgY29uc3RydWN0b3IgYW5kIGFsbCBjaGFpbmluZyBtZXRob2RzXG4gKiBhY2NlcHQgb3B0aW9uYWwgY2FuY2VsbGF0aW9uIGNhbGxiYWNrcy5cbiAqXG4gKiBJZiBhIGBDYW5jZWxsYWJsZVByb21pc2VgIHN0aWxsIHJlc29sdmVzIGFmdGVyIGhhdmluZyBiZWVuIGNhbmNlbGxlZCxcbiAqIHRoZSByZXN1bHQgd2lsbCBiZSBkaXNjYXJkZWQuIElmIGl0IHJlamVjdHMsIHRoZSByZWFzb25cbiAqIHdpbGwgYmUgcmVwb3J0ZWQgYXMgYW4gdW5oYW5kbGVkIHJlamVjdGlvbixcbiAqIHdyYXBwZWQgaW4gYSB7QGxpbmsgQ2FuY2VsbGVkUmVqZWN0aW9uRXJyb3J9IGluc3RhbmNlLlxuICogVG8gZmFjaWxpdGF0ZSB0aGUgaGFuZGxpbmcgb2YgY2FuY2VsbGF0aW9uIHJlcXVlc3RzLFxuICogY2FuY2VsbGVkIGBDYW5jZWxsYWJsZVByb21pc2VgcyB3aWxsIF9ub3RfIHJlcG9ydCB1bmhhbmRsZWQgYENhbmNlbEVycm9yYHNcbiAqIHdob3NlIGBjYXVzZWAgZmllbGQgaXMgdGhlIHNhbWUgYXMgdGhlIG9uZSB3aXRoIHdoaWNoIHRoZSBjdXJyZW50IHByb21pc2Ugd2FzIGNhbmNlbGxlZC5cbiAqXG4gKiBBbGwgdXN1YWwgcHJvbWlzZSBtZXRob2RzIGFyZSBkZWZpbmVkIGFuZCByZXR1cm4gYSBgQ2FuY2VsbGFibGVQcm9taXNlYFxuICogd2hvc2UgY2FuY2VsIG1ldGhvZCB3aWxsIGNhbmNlbCB0aGUgcGFyZW50IG9wZXJhdGlvbiBhcyB3ZWxsLCBwcm9wYWdhdGluZyB0aGUgY2FuY2VsbGF0aW9uIHJlYXNvblxuICogdXB3YXJkcyB0aHJvdWdoIHByb21pc2UgY2hhaW5zLlxuICogQ29udmVyc2VseSwgY2FuY2VsbGluZyBhIHByb21pc2Ugd2lsbCBub3QgYXV0b21hdGljYWxseSBjYW5jZWwgZGVwZW5kZW50IHByb21pc2VzIGRvd25zdHJlYW06XG4gKiBgYGB0c1xuICogbGV0IHJvb3QgPSBuZXcgQ2FuY2VsbGFibGVQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsgLi4uIH0pO1xuICogbGV0IGNoaWxkMSA9IHJvb3QudGhlbigoKSA9PiB7IC4uLiB9KTtcbiAqIGxldCBjaGlsZDIgPSBjaGlsZDEudGhlbigoKSA9PiB7IC4uLiB9KTtcbiAqIGxldCBjaGlsZDMgPSByb290LmNhdGNoKCgpID0+IHsgLi4uIH0pO1xuICogY2hpbGQxLmNhbmNlbCgpOyAvLyBDYW5jZWxzIGNoaWxkMSBhbmQgcm9vdCwgYnV0IG5vdCBjaGlsZDIgb3IgY2hpbGQzXG4gKiBgYGBcbiAqIENhbmNlbGxpbmcgYSBwcm9taXNlIHRoYXQgaGFzIGFscmVhZHkgc2V0dGxlZCBpcyBzYWZlIGFuZCBoYXMgbm8gY29uc2VxdWVuY2UuXG4gKlxuICogVGhlIGBjYW5jZWxgIG1ldGhvZCByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IF9hbHdheXMgZnVsZmlsbHNfXG4gKiBhZnRlciB0aGUgd2hvbGUgY2hhaW4gaGFzIHByb2Nlc3NlZCB0aGUgY2FuY2VsIHJlcXVlc3RcbiAqIGFuZCBhbGwgYXR0YWNoZWQgY2FsbGJhY2tzIHVwIHRvIHRoYXQgbW9tZW50IGhhdmUgcnVuLlxuICpcbiAqIEFsbCBFUzIwMjQgcHJvbWlzZSBtZXRob2RzIChzdGF0aWMgYW5kIGluc3RhbmNlKSBhcmUgZGVmaW5lZCBvbiBDYW5jZWxsYWJsZVByb21pc2UsXG4gKiBidXQgYWN0dWFsIGF2YWlsYWJpbGl0eSBtYXkgdmFyeSB3aXRoIE9TL3dlYnZpZXcgdmVyc2lvbi5cbiAqXG4gKiBJbiBsaW5lIHdpdGggdGhlIHByb3Bvc2FsIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXJtLWJ1aWx0aW4tc3ViY2xhc3NpbmcsXG4gKiBgQ2FuY2VsbGFibGVQcm9taXNlYCBkb2VzIG5vdCBzdXBwb3J0IHRyYW5zcGFyZW50IHN1YmNsYXNzaW5nLlxuICogRXh0ZW5kZXJzIHNob3VsZCB0YWtlIGNhcmUgdG8gcHJvdmlkZSB0aGVpciBvd24gbWV0aG9kIGltcGxlbWVudGF0aW9ucy5cbiAqIFRoaXMgbWlnaHQgYmUgcmVjb25zaWRlcmVkIGluIGNhc2UgdGhlIHByb3Bvc2FsIGlzIHJldGlyZWQuXG4gKlxuICogQ2FuY2VsbGFibGVQcm9taXNlIGlzIGEgd3JhcHBlciBhcm91bmQgdGhlIERPTSBQcm9taXNlIG9iamVjdFxuICogYW5kIGlzIGNvbXBsaWFudCB3aXRoIHRoZSBbUHJvbWlzZXMvQSsgc3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8pXG4gKiAoaXQgcGFzc2VzIHRoZSBbY29tcGxpYW5jZSBzdWl0ZV0oaHR0cHM6Ly9naXRodWIuY29tL3Byb21pc2VzLWFwbHVzL3Byb21pc2VzLXRlc3RzKSlcbiAqIGlmIHNvIGlzIHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgQ2FuY2VsbGFibGVQcm9taXNlPFQ+IGV4dGVuZHMgUHJvbWlzZTxUPiBpbXBsZW1lbnRzIFByb21pc2VMaWtlPFQ+LCBDYW5jZWxsYWJsZVByb21pc2VMaWtlPFQ+IHtcbiAgICAvLyBQcml2YXRlIGZpZWxkcy5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgcHJpdmF0ZSBbYmFycmllclN5bV0hOiBQYXJ0aWFsPFByb21pc2VXaXRoUmVzb2x2ZXJzPHZvaWQ+PiB8IG51bGw7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgW2NhbmNlbEltcGxTeW1dITogKHJlYXNvbjogQ2FuY2VsRXJyb3IpID0+IHZvaWQgfCBQcm9taXNlTGlrZTx2b2lkPjtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgYENhbmNlbGxhYmxlUHJvbWlzZWAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZXhlY3V0b3IgLSBBIGNhbGxiYWNrIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcHJvbWlzZS4gVGhpcyBjYWxsYmFjayBpcyBwYXNzZWQgdHdvIGFyZ3VtZW50czpcbiAgICAgKiAgICAgICAgICAgICAgICAgICBhIGByZXNvbHZlYCBjYWxsYmFjayB1c2VkIHRvIHJlc29sdmUgdGhlIHByb21pc2Ugd2l0aCBhIHZhbHVlXG4gICAgICogICAgICAgICAgICAgICAgICAgb3IgdGhlIHJlc3VsdCBvZiBhbm90aGVyIHByb21pc2UgKHBvc3NpYmx5IGNhbmNlbGxhYmxlKSxcbiAgICAgKiAgICAgICAgICAgICAgICAgICBhbmQgYSBgcmVqZWN0YCBjYWxsYmFjayB1c2VkIHRvIHJlamVjdCB0aGUgcHJvbWlzZSB3aXRoIGEgcHJvdmlkZWQgcmVhc29uIG9yIGVycm9yLlxuICAgICAqICAgICAgICAgICAgICAgICAgIElmIHRoZSB2YWx1ZSBwcm92aWRlZCB0byB0aGUgYHJlc29sdmVgIGNhbGxiYWNrIGlzIGEgdGhlbmFibGUgX2FuZF8gY2FuY2VsbGFibGUgb2JqZWN0XG4gICAgICogICAgICAgICAgICAgICAgICAgKGl0IGhhcyBhIGB0aGVuYCBfYW5kXyBhIGBjYW5jZWxgIG1ldGhvZCksXG4gICAgICogICAgICAgICAgICAgICAgICAgY2FuY2VsbGF0aW9uIHJlcXVlc3RzIHdpbGwgYmUgZm9yd2FyZGVkIHRvIHRoYXQgb2JqZWN0IGFuZCB0aGUgb25jYW5jZWxsZWQgd2lsbCBub3QgYmUgaW52b2tlZCBhbnltb3JlLlxuICAgICAqICAgICAgICAgICAgICAgICAgIElmIGFueSBvbmUgb2YgdGhlIHR3byBjYWxsYmFja3MgaXMgY2FsbGVkIF9hZnRlcl8gdGhlIHByb21pc2UgaGFzIGJlZW4gY2FuY2VsbGVkLFxuICAgICAqICAgICAgICAgICAgICAgICAgIHRoZSBwcm92aWRlZCB2YWx1ZXMgd2lsbCBiZSBjYW5jZWxsZWQgYW5kIHJlc29sdmVkIGFzIHVzdWFsLFxuICAgICAqICAgICAgICAgICAgICAgICAgIGJ1dCB0aGVpciByZXN1bHRzIHdpbGwgYmUgZGlzY2FyZGVkLlxuICAgICAqICAgICAgICAgICAgICAgICAgIEhvd2V2ZXIsIGlmIHRoZSByZXNvbHV0aW9uIHByb2Nlc3MgdWx0aW1hdGVseSBlbmRzIHVwIGluIGEgcmVqZWN0aW9uXG4gICAgICogICAgICAgICAgICAgICAgICAgdGhhdCBpcyBub3QgZHVlIHRvIGNhbmNlbGxhdGlvbiwgdGhlIHJlamVjdGlvbiByZWFzb25cbiAgICAgKiAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHdyYXBwZWQgaW4gYSB7QGxpbmsgQ2FuY2VsbGVkUmVqZWN0aW9uRXJyb3J9XG4gICAgICogICAgICAgICAgICAgICAgICAgYW5kIGJ1YmJsZWQgdXAgYXMgYW4gdW5oYW5kbGVkIHJlamVjdGlvbi5cbiAgICAgKiBAcGFyYW0gb25jYW5jZWxsZWQgLSBJdCBpcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZW5zdXJlIHRoYXQgYW55IG9wZXJhdGlvblxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZWQgYnkgdGhlIGV4ZWN1dG9yIGlzIHByb3Blcmx5IGhhbHRlZCB1cG9uIGNhbmNlbGxhdGlvbi5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBUaGlzIG9wdGlvbmFsIGNhbGxiYWNrIGNhbiBiZSB1c2VkIHRvIHRoYXQgcHVycG9zZS5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBJdCB3aWxsIGJlIGNhbGxlZCBfc3luY2hyb25vdXNseV8gd2l0aCBhIGNhbmNlbGxhdGlvbiBjYXVzZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIHdoZW4gY2FuY2VsbGF0aW9uIGlzIHJlcXVlc3RlZCwgX2FmdGVyXyB0aGUgcHJvbWlzZSBoYXMgYWxyZWFkeSByZWplY3RlZFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIHdpdGggYSB7QGxpbmsgQ2FuY2VsRXJyb3J9LCBidXQgX2JlZm9yZV9cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBhbnkge0BsaW5rIHRoZW59L3tAbGluayBjYXRjaH0ve0BsaW5rIGZpbmFsbHl9IGNhbGxiYWNrIHJ1bnMuXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIGNhbGxiYWNrIHJldHVybnMgYSB0aGVuYWJsZSwgdGhlIHByb21pc2UgcmV0dXJuZWQgZnJvbSB7QGxpbmsgY2FuY2VsfVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIHdpbGwgb25seSBmdWxmaWxsIGFmdGVyIHRoZSBmb3JtZXIgaGFzIHNldHRsZWQuXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgVW5oYW5kbGVkIGV4Y2VwdGlvbnMgb3IgcmVqZWN0aW9ucyBmcm9tIHRoZSBjYWxsYmFjayB3aWxsIGJlIHdyYXBwZWRcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBpbiBhIHtAbGluayBDYW5jZWxsZWRSZWplY3Rpb25FcnJvcn0gYW5kIGJ1YmJsZWQgdXAgYXMgdW5oYW5kbGVkIHJlamVjdGlvbnMuXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIGByZXNvbHZlYCBjYWxsYmFjayBpcyBjYWxsZWQgYmVmb3JlIGNhbmNlbGxhdGlvbiB3aXRoIGEgY2FuY2VsbGFibGUgcHJvbWlzZSxcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb24gcmVxdWVzdHMgb24gdGhpcyBwcm9taXNlIHdpbGwgYmUgZGl2ZXJ0ZWQgdG8gdGhhdCBwcm9taXNlLFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGUgb3JpZ2luYWwgYG9uY2FuY2VsbGVkYCBjYWxsYmFjayB3aWxsIGJlIGRpc2NhcmRlZC5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihleGVjdXRvcjogQ2FuY2VsbGFibGVQcm9taXNlRXhlY3V0b3I8VD4sIG9uY2FuY2VsbGVkPzogQ2FuY2VsbGFibGVQcm9taXNlQ2FuY2VsbGVyKSB7XG4gICAgICAgIGxldCByZXNvbHZlITogKHZhbHVlOiBUIHwgUHJvbWlzZUxpa2U8VD4pID0+IHZvaWQ7XG4gICAgICAgIGxldCByZWplY3QhOiAocmVhc29uPzogYW55KSA9PiB2b2lkO1xuICAgICAgICBzdXBlcigocmVzLCByZWopID0+IHsgcmVzb2x2ZSA9IHJlczsgcmVqZWN0ID0gcmVqOyB9KTtcblxuICAgICAgICBpZiAoKHRoaXMuY29uc3RydWN0b3IgYXMgYW55KVtzcGVjaWVzXSAhPT0gUHJvbWlzZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbmNlbGxhYmxlUHJvbWlzZSBkb2VzIG5vdCBzdXBwb3J0IHRyYW5zcGFyZW50IHN1YmNsYXNzaW5nLiBQbGVhc2UgcmVmcmFpbiBmcm9tIG92ZXJyaWRpbmcgdGhlIFtTeW1ib2wuc3BlY2llc10gc3RhdGljIHByb3BlcnR5LlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwcm9taXNlOiBDYW5jZWxsYWJsZVByb21pc2VXaXRoUmVzb2x2ZXJzPFQ+ID0ge1xuICAgICAgICAgICAgcHJvbWlzZTogdGhpcyxcbiAgICAgICAgICAgIHJlc29sdmUsXG4gICAgICAgICAgICByZWplY3QsXG4gICAgICAgICAgICBnZXQgb25jYW5jZWxsZWQoKSB7IHJldHVybiBvbmNhbmNlbGxlZCA/PyBudWxsOyB9LFxuICAgICAgICAgICAgc2V0IG9uY2FuY2VsbGVkKGNiKSB7IG9uY2FuY2VsbGVkID0gY2IgPz8gdW5kZWZpbmVkOyB9XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3Qgc3RhdGU6IENhbmNlbGxhYmxlUHJvbWlzZVN0YXRlID0ge1xuICAgICAgICAgICAgZ2V0IHJvb3QoKSB7IHJldHVybiBzdGF0ZTsgfSxcbiAgICAgICAgICAgIHJlc29sdmluZzogZmFsc2UsXG4gICAgICAgICAgICBzZXR0bGVkOiBmYWxzZVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFNldHVwIGNhbmNlbGxhdGlvbiBzeXN0ZW0uXG4gICAgICAgIHZvaWQgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcywge1xuICAgICAgICAgICAgW2JhcnJpZXJTeW1dOiB7XG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtjYW5jZWxJbXBsU3ltXToge1xuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBjYW5jZWxsZXJGb3IocHJvbWlzZSwgc3RhdGUpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFJ1biB0aGUgYWN0dWFsIGV4ZWN1dG9yLlxuICAgICAgICBjb25zdCByZWplY3RvciA9IHJlamVjdG9yRm9yKHByb21pc2UsIHN0YXRlKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGV4ZWN1dG9yKHJlc29sdmVyRm9yKHByb21pc2UsIHN0YXRlKSwgcmVqZWN0b3IpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZS5yZXNvbHZpbmcpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIlVuaGFuZGxlZCBleGNlcHRpb24gaW4gQ2FuY2VsbGFibGVQcm9taXNlIGV4ZWN1dG9yLlwiLCBlcnIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZWplY3RvcihlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FuY2VscyBpbW1lZGlhdGVseSB0aGUgZXhlY3V0aW9uIG9mIHRoZSBvcGVyYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgcHJvbWlzZS5cbiAgICAgKiBUaGUgcHJvbWlzZSByZWplY3RzIHdpdGggYSB7QGxpbmsgQ2FuY2VsRXJyb3J9IGluc3RhbmNlIGFzIHJlYXNvbixcbiAgICAgKiB3aXRoIHRoZSB7QGxpbmsgQ2FuY2VsRXJyb3IjY2F1c2V9IHByb3BlcnR5IHNldCB0byB0aGUgZ2l2ZW4gYXJndW1lbnQsIGlmIGFueS5cbiAgICAgKlxuICAgICAqIEhhcyBubyBlZmZlY3QgaWYgY2FsbGVkIGFmdGVyIHRoZSBwcm9taXNlIGhhcyBhbHJlYWR5IHNldHRsZWQ7XG4gICAgICogcmVwZWF0ZWQgY2FsbHMgaW4gcGFydGljdWxhciBhcmUgc2FmZSwgYnV0IG9ubHkgdGhlIGZpcnN0IG9uZVxuICAgICAqIHdpbGwgc2V0IHRoZSBjYW5jZWxsYXRpb24gY2F1c2UuXG4gICAgICpcbiAgICAgKiBUaGUgYENhbmNlbEVycm9yYCBleGNlcHRpb24gX25lZWQgbm90XyBiZSBoYW5kbGVkIGV4cGxpY2l0bHkgX29uIHRoZSBwcm9taXNlcyB0aGF0IGFyZSBiZWluZyBjYW5jZWxsZWQ6X1xuICAgICAqIGNhbmNlbGxpbmcgYSBwcm9taXNlIHdpdGggbm8gYXR0YWNoZWQgcmVqZWN0aW9uIGhhbmRsZXIgZG9lcyBub3QgdHJpZ2dlciBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uIGV2ZW50LlxuICAgICAqIFRoZXJlZm9yZSwgdGhlIGZvbGxvd2luZyBpZGlvbXMgYXJlIGFsbCBlcXVhbGx5IGNvcnJlY3Q6XG4gICAgICogYGBgdHNcbiAgICAgKiBuZXcgQ2FuY2VsbGFibGVQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsgLi4uIH0pLmNhbmNlbCgpO1xuICAgICAqIG5ldyBDYW5jZWxsYWJsZVByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4geyAuLi4gfSkudGhlbiguLi4pLmNhbmNlbCgpO1xuICAgICAqIG5ldyBDYW5jZWxsYWJsZVByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4geyAuLi4gfSkudGhlbiguLi4pLmNhdGNoKC4uLikuY2FuY2VsKCk7XG4gICAgICogYGBgXG4gICAgICogV2hlbmV2ZXIgc29tZSBjYW5jZWxsZWQgcHJvbWlzZSBpbiBhIGNoYWluIHJlamVjdHMgd2l0aCBhIGBDYW5jZWxFcnJvcmBcbiAgICAgKiB3aXRoIHRoZSBzYW1lIGNhbmNlbGxhdGlvbiBjYXVzZSBhcyBpdHNlbGYsIHRoZSBlcnJvciB3aWxsIGJlIGRpc2NhcmRlZCBzaWxlbnRseS5cbiAgICAgKiBIb3dldmVyLCB0aGUgYENhbmNlbEVycm9yYCBfd2lsbCBzdGlsbCBiZSBkZWxpdmVyZWRfIHRvIGFsbCBhdHRhY2hlZCByZWplY3Rpb24gaGFuZGxlcnNcbiAgICAgKiBhZGRlZCBieSB7QGxpbmsgdGhlbn0gYW5kIHJlbGF0ZWQgbWV0aG9kczpcbiAgICAgKiBgYGB0c1xuICAgICAqIGxldCBjYW5jZWxsYWJsZSA9IG5ldyBDYW5jZWxsYWJsZVByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4geyAuLi4gfSk7XG4gICAgICogY2FuY2VsbGFibGUudGhlbigoKSA9PiB7IC4uLiB9KS5jYXRjaChjb25zb2xlLmxvZyk7XG4gICAgICogY2FuY2VsbGFibGUuY2FuY2VsKCk7IC8vIEEgQ2FuY2VsRXJyb3IgaXMgcHJpbnRlZCB0byB0aGUgY29uc29sZS5cbiAgICAgKiBgYGBcbiAgICAgKiBJZiB0aGUgYENhbmNlbEVycm9yYCBpcyBub3QgaGFuZGxlZCBkb3duc3RyZWFtIGJ5IHRoZSB0aW1lIGl0IHJlYWNoZXNcbiAgICAgKiBhIF9ub24tY2FuY2VsbGVkXyBwcm9taXNlLCBpdCBfd2lsbF8gdHJpZ2dlciBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uIGV2ZW50LFxuICAgICAqIGp1c3QgbGlrZSBub3JtYWwgcmVqZWN0aW9ucyB3b3VsZDpcbiAgICAgKiBgYGB0c1xuICAgICAqIGxldCBjYW5jZWxsYWJsZSA9IG5ldyBDYW5jZWxsYWJsZVByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4geyAuLi4gfSk7XG4gICAgICogbGV0IGNoYWluZWQgPSBjYW5jZWxsYWJsZS50aGVuKCgpID0+IHsgLi4uIH0pLnRoZW4oKCkgPT4geyAuLi4gfSk7IC8vIE5vIGNhdGNoLi4uXG4gICAgICogY2FuY2VsbGFibGUuY2FuY2VsKCk7IC8vIFVuaGFuZGxlZCByZWplY3Rpb24gZXZlbnQgb24gY2hhaW5lZCFcbiAgICAgKiBgYGBcbiAgICAgKiBUaGVyZWZvcmUsIGl0IGlzIGltcG9ydGFudCB0byBlaXRoZXIgY2FuY2VsIHdob2xlIHByb21pc2UgY2hhaW5zIGZyb20gdGhlaXIgdGFpbCxcbiAgICAgKiBhcyBzaG93biBpbiB0aGUgY29ycmVjdCBpZGlvbXMgYWJvdmUsIG9yIHRha2UgY2FyZSBvZiBoYW5kbGluZyBlcnJvcnMgZXZlcnl3aGVyZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEEgY2FuY2VsbGFibGUgcHJvbWlzZSB0aGF0IF9mdWxmaWxsc18gYWZ0ZXIgdGhlIGNhbmNlbCBjYWxsYmFjayAoaWYgYW55KVxuICAgICAqIGFuZCBhbGwgaGFuZGxlcnMgYXR0YWNoZWQgdXAgdG8gdGhlIGNhbGwgdG8gY2FuY2VsIGhhdmUgcnVuLlxuICAgICAqIElmIHRoZSBjYW5jZWwgY2FsbGJhY2sgcmV0dXJucyBhIHRoZW5hYmxlLCB0aGUgcHJvbWlzZSByZXR1cm5lZCBieSBgY2FuY2VsYFxuICAgICAqIHdpbGwgYWxzbyB3YWl0IGZvciB0aGF0IHRoZW5hYmxlIHRvIHNldHRsZS5cbiAgICAgKiBUaGlzIGVuYWJsZXMgY2FsbGVycyB0byB3YWl0IGZvciB0aGUgY2FuY2VsbGVkIG9wZXJhdGlvbiB0byB0ZXJtaW5hdGVcbiAgICAgKiB3aXRob3V0IGJlaW5nIGZvcmNlZCB0byBoYW5kbGUgcG90ZW50aWFsIGVycm9ycyBhdCB0aGUgY2FsbCBzaXRlLlxuICAgICAqIGBgYHRzXG4gICAgICogY2FuY2VsbGFibGUuY2FuY2VsKCkudGhlbigoKSA9PiB7XG4gICAgICogICAgIC8vIENsZWFudXAgZmluaXNoZWQsIGl0J3Mgc2FmZSB0byBkbyBzb21ldGhpbmcgZWxzZS5cbiAgICAgKiB9LCAoZXJyKSA9PiB7XG4gICAgICogICAgIC8vIFVucmVhY2hhYmxlOiB0aGUgcHJvbWlzZSByZXR1cm5lZCBmcm9tIGNhbmNlbCB3aWxsIG5ldmVyIHJlamVjdC5cbiAgICAgKiB9KTtcbiAgICAgKiBgYGBcbiAgICAgKiBOb3RlIHRoYXQgdGhlIHJldHVybmVkIHByb21pc2Ugd2lsbCBfbm90XyBoYW5kbGUgaW1wbGljaXRseSBhbnkgcmVqZWN0aW9uXG4gICAgICogdGhhdCBtaWdodCBoYXZlIG9jY3VycmVkIGFscmVhZHkgaW4gdGhlIGNhbmNlbGxlZCBjaGFpbi5cbiAgICAgKiBJdCB3aWxsIGp1c3QgdHJhY2sgd2hldGhlciByZWdpc3RlcmVkIGhhbmRsZXJzIGhhdmUgYmVlbiBleGVjdXRlZCBvciBub3QuXG4gICAgICogVGhlcmVmb3JlLCB1bmhhbmRsZWQgcmVqZWN0aW9ucyB3aWxsIG5ldmVyIGJlIHNpbGVudGx5IGhhbmRsZWQgYnkgY2FsbGluZyBjYW5jZWwuXG4gICAgICovXG4gICAgY2FuY2VsKGNhdXNlPzogYW55KTogQ2FuY2VsbGFibGVQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBDYW5jZWxsYWJsZVByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIFByb21pc2UuYWxsU2V0dGxlZChbXG4gICAgICAgICAgICAgICAgdGhpc1tjYW5jZWxJbXBsU3ltXShuZXcgQ2FuY2VsRXJyb3IoXCJQcm9taXNlIGNhbmNlbGxlZC5cIiwgeyBjYXVzZSB9KSksXG4gICAgICAgICAgICAgICAgY3VycmVudEJhcnJpZXIodGhpcylcbiAgICAgICAgICAgIF0pLnRoZW4oKCkgPT4gcmVzb2x2ZSgpLCAoKSA9PiByZXNvbHZlKCkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCaW5kcyBwcm9taXNlIGNhbmNlbGxhdGlvbiB0byB0aGUgYWJvcnQgZXZlbnQgb2YgdGhlIGdpdmVuIHtAbGluayBBYm9ydFNpZ25hbH0uXG4gICAgICogSWYgdGhlIHNpZ25hbCBoYXMgYWxyZWFkeSBhYm9ydGVkLCB0aGUgcHJvbWlzZSB3aWxsIGJlIGNhbmNlbGxlZCBpbW1lZGlhdGVseS5cbiAgICAgKiBXaGVuIGVpdGhlciBjb25kaXRpb24gaXMgdmVyaWZpZWQsIHRoZSBjYW5jZWxsYXRpb24gY2F1c2Ugd2lsbCBiZSBzZXRcbiAgICAgKiB0byB0aGUgc2lnbmFsJ3MgYWJvcnQgcmVhc29uIChzZWUge0BsaW5rIEFib3J0U2lnbmFsI3JlYXNvbn0pLlxuICAgICAqXG4gICAgICogSGFzIG5vIGVmZmVjdCBpZiBjYWxsZWQgKG9yIGlmIHRoZSBzaWduYWwgYWJvcnRzKSBfYWZ0ZXJfIHRoZSBwcm9taXNlIGhhcyBhbHJlYWR5IHNldHRsZWQuXG4gICAgICogT25seSB0aGUgZmlyc3Qgc2lnbmFsIHRvIGFib3J0IHdpbGwgc2V0IHRoZSBjYW5jZWxsYXRpb24gY2F1c2UuXG4gICAgICpcbiAgICAgKiBGb3IgbW9yZSBkZXRhaWxzIGFib3V0IHRoZSBjYW5jZWxsYXRpb24gcHJvY2VzcyxcbiAgICAgKiBzZWUge0BsaW5rIGNhbmNlbH0gYW5kIHRoZSBgQ2FuY2VsbGFibGVQcm9taXNlYCBjb25zdHJ1Y3Rvci5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGVuYWJsZXMgYGF3YWl0YGluZyBjYW5jZWxsYWJsZSBwcm9taXNlcyB3aXRob3V0IGhhdmluZ1xuICAgICAqIHRvIHN0b3JlIHRoZW0gZm9yIGZ1dHVyZSBjYW5jZWxsYXRpb24sIGUuZy46XG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBsb25nUnVubmluZ09wZXJhdGlvbigpLmNhbmNlbE9uKHNpZ25hbCk7XG4gICAgICogYGBgXG4gICAgICogaW5zdGVhZCBvZjpcbiAgICAgKiBgYGB0c1xuICAgICAqIGxldCBwcm9taXNlVG9CZUNhbmNlbGxlZCA9IGxvbmdSdW5uaW5nT3BlcmF0aW9uKCk7XG4gICAgICogYXdhaXQgcHJvbWlzZVRvQmVDYW5jZWxsZWQ7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGlzIHByb21pc2UsIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICovXG4gICAgY2FuY2VsT24oc2lnbmFsOiBBYm9ydFNpZ25hbCk6IENhbmNlbGxhYmxlUHJvbWlzZTxUPiB7XG4gICAgICAgIGlmIChzaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgICAgdm9pZCB0aGlzLmNhbmNlbChzaWduYWwucmVhc29uKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgKCkgPT4gdm9pZCB0aGlzLmNhbmNlbChzaWduYWwucmVhc29uKSwge2NhcHR1cmU6IHRydWV9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEF0dGFjaGVzIGNhbGxiYWNrcyBmb3IgdGhlIHJlc29sdXRpb24gYW5kL29yIHJlamVjdGlvbiBvZiB0aGUgYENhbmNlbGxhYmxlUHJvbWlzZWAuXG4gICAgICpcbiAgICAgKiBUaGUgb3B0aW9uYWwgYG9uY2FuY2VsbGVkYCBhcmd1bWVudCB3aWxsIGJlIGludm9rZWQgd2hlbiB0aGUgcmV0dXJuZWQgcHJvbWlzZSBpcyBjYW5jZWxsZWQsXG4gICAgICogd2l0aCB0aGUgc2FtZSBzZW1hbnRpY3MgYXMgdGhlIGBvbmNhbmNlbGxlZGAgYXJndW1lbnQgb2YgdGhlIGNvbnN0cnVjdG9yLlxuICAgICAqIFdoZW4gdGhlIHBhcmVudCBwcm9taXNlIHJlamVjdHMgb3IgaXMgY2FuY2VsbGVkLCB0aGUgYG9ucmVqZWN0ZWRgIGNhbGxiYWNrIHdpbGwgcnVuLFxuICAgICAqIF9ldmVuIGFmdGVyIHRoZSByZXR1cm5lZCBwcm9taXNlIGhhcyBiZWVuIGNhbmNlbGxlZDpfXG4gICAgICogaW4gdGhhdCBjYXNlLCBzaG91bGQgaXQgcmVqZWN0IG9yIHRocm93LCB0aGUgcmVhc29uIHdpbGwgYmUgd3JhcHBlZFxuICAgICAqIGluIGEge0BsaW5rIENhbmNlbGxlZFJlamVjdGlvbkVycm9yfSBhbmQgYnViYmxlZCB1cCBhcyBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9uZnVsZmlsbGVkIFRoZSBjYWxsYmFjayB0byBleGVjdXRlIHdoZW4gdGhlIFByb21pc2UgaXMgcmVzb2x2ZWQuXG4gICAgICogQHBhcmFtIG9ucmVqZWN0ZWQgVGhlIGNhbGxiYWNrIHRvIGV4ZWN1dGUgd2hlbiB0aGUgUHJvbWlzZSBpcyByZWplY3RlZC5cbiAgICAgKiBAcmV0dXJucyBBIGBDYW5jZWxsYWJsZVByb21pc2VgIGZvciB0aGUgY29tcGxldGlvbiBvZiB3aGljaGV2ZXIgY2FsbGJhY2sgaXMgZXhlY3V0ZWQuXG4gICAgICogVGhlIHJldHVybmVkIHByb21pc2UgaXMgaG9va2VkIHVwIHRvIHByb3BhZ2F0ZSBjYW5jZWxsYXRpb24gcmVxdWVzdHMgdXAgdGhlIGNoYWluLCBidXQgbm90IGRvd246XG4gICAgICpcbiAgICAgKiAgIC0gaWYgdGhlIHBhcmVudCBwcm9taXNlIGlzIGNhbmNlbGxlZCwgdGhlIGBvbnJlamVjdGVkYCBoYW5kbGVyIHdpbGwgYmUgaW52b2tlZCB3aXRoIGEgYENhbmNlbEVycm9yYFxuICAgICAqICAgICBhbmQgdGhlIHJldHVybmVkIHByb21pc2UgX3dpbGwgcmVzb2x2ZSByZWd1bGFybHlfIHdpdGggaXRzIHJlc3VsdDtcbiAgICAgKiAgIC0gY29udmVyc2VseSwgaWYgdGhlIHJldHVybmVkIHByb21pc2UgaXMgY2FuY2VsbGVkLCBfdGhlIHBhcmVudCBwcm9taXNlIGlzIGNhbmNlbGxlZCB0b287X1xuICAgICAqICAgICB0aGUgYG9ucmVqZWN0ZWRgIGhhbmRsZXIgd2lsbCBzdGlsbCBiZSBpbnZva2VkIHdpdGggdGhlIHBhcmVudCdzIGBDYW5jZWxFcnJvcmAsXG4gICAgICogICAgIGJ1dCBpdHMgcmVzdWx0IHdpbGwgYmUgZGlzY2FyZGVkXG4gICAgICogICAgIGFuZCB0aGUgcmV0dXJuZWQgcHJvbWlzZSB3aWxsIHJlamVjdCB3aXRoIGEgYENhbmNlbEVycm9yYCBhcyB3ZWxsLlxuICAgICAqXG4gICAgICogVGhlIHByb21pc2UgcmV0dXJuZWQgZnJvbSB7QGxpbmsgY2FuY2VsfSB3aWxsIGZ1bGZpbGwgb25seSBhZnRlciBhbGwgYXR0YWNoZWQgaGFuZGxlcnNcbiAgICAgKiB1cCB0aGUgZW50aXJlIHByb21pc2UgY2hhaW4gaGF2ZSBiZWVuIHJ1bi5cbiAgICAgKlxuICAgICAqIElmIGVpdGhlciBjYWxsYmFjayByZXR1cm5zIGEgY2FuY2VsbGFibGUgcHJvbWlzZSxcbiAgICAgKiBjYW5jZWxsYXRpb24gcmVxdWVzdHMgd2lsbCBiZSBkaXZlcnRlZCB0byBpdCxcbiAgICAgKiBhbmQgdGhlIHNwZWNpZmllZCBgb25jYW5jZWxsZWRgIGNhbGxiYWNrIHdpbGwgYmUgZGlzY2FyZGVkLlxuICAgICAqL1xuICAgIHRoZW48VFJlc3VsdDEgPSBULCBUUmVzdWx0MiA9IG5ldmVyPihvbmZ1bGZpbGxlZD86ICgodmFsdWU6IFQpID0+IFRSZXN1bHQxIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDE+IHwgQ2FuY2VsbGFibGVQcm9taXNlTGlrZTxUUmVzdWx0MT4pIHwgdW5kZWZpbmVkIHwgbnVsbCwgb25yZWplY3RlZD86ICgocmVhc29uOiBhbnkpID0+IFRSZXN1bHQyIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDI+IHwgQ2FuY2VsbGFibGVQcm9taXNlTGlrZTxUUmVzdWx0Mj4pIHwgdW5kZWZpbmVkIHwgbnVsbCwgb25jYW5jZWxsZWQ/OiBDYW5jZWxsYWJsZVByb21pc2VDYW5jZWxsZXIpOiBDYW5jZWxsYWJsZVByb21pc2U8VFJlc3VsdDEgfCBUUmVzdWx0Mj4ge1xuICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgQ2FuY2VsbGFibGVQcm9taXNlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbmNlbGxhYmxlUHJvbWlzZS5wcm90b3R5cGUudGhlbiBjYWxsZWQgb24gYW4gaW52YWxpZCBvYmplY3QuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTk9URTogVHlwZVNjcmlwdCdzIGJ1aWx0LWluIHR5cGUgZm9yIHRoZW4gaXMgYnJva2VuLFxuICAgICAgICAvLyBhcyBpdCBhbGxvd3Mgc3BlY2lmeWluZyBhbiBhcmJpdHJhcnkgVFJlc3VsdDEgIT0gVCBldmVuIHdoZW4gb25mdWxmaWxsZWQgaXMgbm90IGEgZnVuY3Rpb24uXG4gICAgICAgIC8vIFdlIGNhbm5vdCBmaXggaXQgaWYgd2Ugd2FudCB0byBDYW5jZWxsYWJsZVByb21pc2UgdG8gaW1wbGVtZW50IFByb21pc2VMaWtlPFQ+LlxuXG4gICAgICAgIGlmICghaXNDYWxsYWJsZShvbmZ1bGZpbGxlZCkpIHsgb25mdWxmaWxsZWQgPSBpZGVudGl0eSBhcyBhbnk7IH1cbiAgICAgICAgaWYgKCFpc0NhbGxhYmxlKG9ucmVqZWN0ZWQpKSB7IG9ucmVqZWN0ZWQgPSB0aHJvd2VyOyB9XG5cbiAgICAgICAgaWYgKG9uZnVsZmlsbGVkID09PSBpZGVudGl0eSAmJiBvbnJlamVjdGVkID09IHRocm93ZXIpIHtcbiAgICAgICAgICAgIC8vIFNob3J0Y3V0IGZvciB0cml2aWFsIGFyZ3VtZW50cy5cbiAgICAgICAgICAgIHJldHVybiBuZXcgQ2FuY2VsbGFibGVQcm9taXNlKChyZXNvbHZlKSA9PiByZXNvbHZlKHRoaXMgYXMgYW55KSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBiYXJyaWVyOiBQYXJ0aWFsPFByb21pc2VXaXRoUmVzb2x2ZXJzPHZvaWQ+PiA9IHt9O1xuICAgICAgICB0aGlzW2JhcnJpZXJTeW1dID0gYmFycmllcjtcblxuICAgICAgICByZXR1cm4gbmV3IENhbmNlbGxhYmxlUHJvbWlzZTxUUmVzdWx0MSB8IFRSZXN1bHQyPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB2b2lkIHByb21pc2VUaGVuLmNhbGwodGhpcyxcbiAgICAgICAgICAgICAgICAodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXNbYmFycmllclN5bV0gPT09IGJhcnJpZXIpIHsgdGhpc1tiYXJyaWVyU3ltXSA9IG51bGw7IH1cbiAgICAgICAgICAgICAgICAgICAgYmFycmllci5yZXNvbHZlPy4oKTtcblxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShvbmZ1bGZpbGxlZCEodmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKHJlYXNvbj8pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXNbYmFycmllclN5bV0gPT09IGJhcnJpZXIpIHsgdGhpc1tiYXJyaWVyU3ltXSA9IG51bGw7IH1cbiAgICAgICAgICAgICAgICAgICAgYmFycmllci5yZXNvbHZlPy4oKTtcblxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShvbnJlamVjdGVkIShyZWFzb24pKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0sIGFzeW5jIChjYXVzZT8pID0+IHtcbiAgICAgICAgICAgIC8vY2FuY2VsbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9uY2FuY2VsbGVkPy4oY2F1c2UpO1xuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNhbmNlbChjYXVzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEF0dGFjaGVzIGEgY2FsbGJhY2sgZm9yIG9ubHkgdGhlIHJlamVjdGlvbiBvZiB0aGUgUHJvbWlzZS5cbiAgICAgKlxuICAgICAqIFRoZSBvcHRpb25hbCBgb25jYW5jZWxsZWRgIGFyZ3VtZW50IHdpbGwgYmUgaW52b2tlZCB3aGVuIHRoZSByZXR1cm5lZCBwcm9taXNlIGlzIGNhbmNlbGxlZCxcbiAgICAgKiB3aXRoIHRoZSBzYW1lIHNlbWFudGljcyBhcyB0aGUgYG9uY2FuY2VsbGVkYCBhcmd1bWVudCBvZiB0aGUgY29uc3RydWN0b3IuXG4gICAgICogV2hlbiB0aGUgcGFyZW50IHByb21pc2UgcmVqZWN0cyBvciBpcyBjYW5jZWxsZWQsIHRoZSBgb25yZWplY3RlZGAgY2FsbGJhY2sgd2lsbCBydW4sXG4gICAgICogX2V2ZW4gYWZ0ZXIgdGhlIHJldHVybmVkIHByb21pc2UgaGFzIGJlZW4gY2FuY2VsbGVkOl9cbiAgICAgKiBpbiB0aGF0IGNhc2UsIHNob3VsZCBpdCByZWplY3Qgb3IgdGhyb3csIHRoZSByZWFzb24gd2lsbCBiZSB3cmFwcGVkXG4gICAgICogaW4gYSB7QGxpbmsgQ2FuY2VsbGVkUmVqZWN0aW9uRXJyb3J9IGFuZCBidWJibGVkIHVwIGFzIGFuIHVuaGFuZGxlZCByZWplY3Rpb24uXG4gICAgICpcbiAgICAgKiBJdCBpcyBlcXVpdmFsZW50IHRvXG4gICAgICogYGBgdHNcbiAgICAgKiBjYW5jZWxsYWJsZVByb21pc2UudGhlbih1bmRlZmluZWQsIG9ucmVqZWN0ZWQsIG9uY2FuY2VsbGVkKTtcbiAgICAgKiBgYGBcbiAgICAgKiBhbmQgdGhlIHNhbWUgY2F2ZWF0cyBhcHBseS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEEgUHJvbWlzZSBmb3IgdGhlIGNvbXBsZXRpb24gb2YgdGhlIGNhbGxiYWNrLlxuICAgICAqIENhbmNlbGxhdGlvbiByZXF1ZXN0cyBvbiB0aGUgcmV0dXJuZWQgcHJvbWlzZVxuICAgICAqIHdpbGwgcHJvcGFnYXRlIHVwIHRoZSBjaGFpbiB0byB0aGUgcGFyZW50IHByb21pc2UsXG4gICAgICogYnV0IG5vdCBpbiB0aGUgb3RoZXIgZGlyZWN0aW9uLlxuICAgICAqXG4gICAgICogVGhlIHByb21pc2UgcmV0dXJuZWQgZnJvbSB7QGxpbmsgY2FuY2VsfSB3aWxsIGZ1bGZpbGwgb25seSBhZnRlciBhbGwgYXR0YWNoZWQgaGFuZGxlcnNcbiAgICAgKiB1cCB0aGUgZW50aXJlIHByb21pc2UgY2hhaW4gaGF2ZSBiZWVuIHJ1bi5cbiAgICAgKlxuICAgICAqIElmIGBvbnJlamVjdGVkYCByZXR1cm5zIGEgY2FuY2VsbGFibGUgcHJvbWlzZSxcbiAgICAgKiBjYW5jZWxsYXRpb24gcmVxdWVzdHMgd2lsbCBiZSBkaXZlcnRlZCB0byBpdCxcbiAgICAgKiBhbmQgdGhlIHNwZWNpZmllZCBgb25jYW5jZWxsZWRgIGNhbGxiYWNrIHdpbGwgYmUgZGlzY2FyZGVkLlxuICAgICAqIFNlZSB7QGxpbmsgdGhlbn0gZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKi9cbiAgICBjYXRjaDxUUmVzdWx0ID0gbmV2ZXI+KG9ucmVqZWN0ZWQ/OiAoKHJlYXNvbjogYW55KSA9PiAoUHJvbWlzZUxpa2U8VFJlc3VsdD4gfCBUUmVzdWx0KSkgfCB1bmRlZmluZWQgfCBudWxsLCBvbmNhbmNlbGxlZD86IENhbmNlbGxhYmxlUHJvbWlzZUNhbmNlbGxlcik6IENhbmNlbGxhYmxlUHJvbWlzZTxUIHwgVFJlc3VsdD4ge1xuICAgICAgICByZXR1cm4gdGhpcy50aGVuKHVuZGVmaW5lZCwgb25yZWplY3RlZCwgb25jYW5jZWxsZWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEF0dGFjaGVzIGEgY2FsbGJhY2sgdGhhdCBpcyBpbnZva2VkIHdoZW4gdGhlIENhbmNlbGxhYmxlUHJvbWlzZSBpcyBzZXR0bGVkIChmdWxmaWxsZWQgb3IgcmVqZWN0ZWQpLiBUaGVcbiAgICAgKiByZXNvbHZlZCB2YWx1ZSBjYW5ub3QgYmUgYWNjZXNzZWQgb3IgbW9kaWZpZWQgZnJvbSB0aGUgY2FsbGJhY2suXG4gICAgICogVGhlIHJldHVybmVkIHByb21pc2Ugd2lsbCBzZXR0bGUgaW4gdGhlIHNhbWUgc3RhdGUgYXMgdGhlIG9yaWdpbmFsIG9uZVxuICAgICAqIGFmdGVyIHRoZSBwcm92aWRlZCBjYWxsYmFjayBoYXMgY29tcGxldGVkIGV4ZWN1dGlvbixcbiAgICAgKiB1bmxlc3MgdGhlIGNhbGxiYWNrIHRocm93cyBvciByZXR1cm5zIGEgcmVqZWN0aW5nIHByb21pc2UsXG4gICAgICogaW4gd2hpY2ggY2FzZSB0aGUgcmV0dXJuZWQgcHJvbWlzZSB3aWxsIHJlamVjdCBhcyB3ZWxsLlxuICAgICAqXG4gICAgICogVGhlIG9wdGlvbmFsIGBvbmNhbmNlbGxlZGAgYXJndW1lbnQgd2lsbCBiZSBpbnZva2VkIHdoZW4gdGhlIHJldHVybmVkIHByb21pc2UgaXMgY2FuY2VsbGVkLFxuICAgICAqIHdpdGggdGhlIHNhbWUgc2VtYW50aWNzIGFzIHRoZSBgb25jYW5jZWxsZWRgIGFyZ3VtZW50IG9mIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgKiBPbmNlIHRoZSBwYXJlbnQgcHJvbWlzZSBzZXR0bGVzLCB0aGUgYG9uZmluYWxseWAgY2FsbGJhY2sgd2lsbCBydW4sXG4gICAgICogX2V2ZW4gYWZ0ZXIgdGhlIHJldHVybmVkIHByb21pc2UgaGFzIGJlZW4gY2FuY2VsbGVkOl9cbiAgICAgKiBpbiB0aGF0IGNhc2UsIHNob3VsZCBpdCByZWplY3Qgb3IgdGhyb3csIHRoZSByZWFzb24gd2lsbCBiZSB3cmFwcGVkXG4gICAgICogaW4gYSB7QGxpbmsgQ2FuY2VsbGVkUmVqZWN0aW9uRXJyb3J9IGFuZCBidWJibGVkIHVwIGFzIGFuIHVuaGFuZGxlZCByZWplY3Rpb24uXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiB7QGxpbmsgdGhlbn0gYW5kIHRoZSBzYW1lIGNhdmVhdHMgYXBwbHkuXG4gICAgICogSXQgaXMgcG9seWZpbGxlZCwgaGVuY2UgYXZhaWxhYmxlIGluIGV2ZXJ5IE9TL3dlYnZpZXcgdmVyc2lvbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEEgUHJvbWlzZSBmb3IgdGhlIGNvbXBsZXRpb24gb2YgdGhlIGNhbGxiYWNrLlxuICAgICAqIENhbmNlbGxhdGlvbiByZXF1ZXN0cyBvbiB0aGUgcmV0dXJuZWQgcHJvbWlzZVxuICAgICAqIHdpbGwgcHJvcGFnYXRlIHVwIHRoZSBjaGFpbiB0byB0aGUgcGFyZW50IHByb21pc2UsXG4gICAgICogYnV0IG5vdCBpbiB0aGUgb3RoZXIgZGlyZWN0aW9uLlxuICAgICAqXG4gICAgICogVGhlIHByb21pc2UgcmV0dXJuZWQgZnJvbSB7QGxpbmsgY2FuY2VsfSB3aWxsIGZ1bGZpbGwgb25seSBhZnRlciBhbGwgYXR0YWNoZWQgaGFuZGxlcnNcbiAgICAgKiB1cCB0aGUgZW50aXJlIHByb21pc2UgY2hhaW4gaGF2ZSBiZWVuIHJ1bi5cbiAgICAgKlxuICAgICAqIElmIGBvbmZpbmFsbHlgIHJldHVybnMgYSBjYW5jZWxsYWJsZSBwcm9taXNlLFxuICAgICAqIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyB3aWxsIGJlIGRpdmVydGVkIHRvIGl0LFxuICAgICAqIGFuZCB0aGUgc3BlY2lmaWVkIGBvbmNhbmNlbGxlZGAgY2FsbGJhY2sgd2lsbCBiZSBkaXNjYXJkZWQuXG4gICAgICogU2VlIHtAbGluayB0aGVufSBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqL1xuICAgIGZpbmFsbHkob25maW5hbGx5PzogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkIHwgbnVsbCwgb25jYW5jZWxsZWQ/OiBDYW5jZWxsYWJsZVByb21pc2VDYW5jZWxsZXIpOiBDYW5jZWxsYWJsZVByb21pc2U8VD4ge1xuICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgQ2FuY2VsbGFibGVQcm9taXNlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbmNlbGxhYmxlUHJvbWlzZS5wcm90b3R5cGUuZmluYWxseSBjYWxsZWQgb24gYW4gaW52YWxpZCBvYmplY3QuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc0NhbGxhYmxlKG9uZmluYWxseSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRoZW4ob25maW5hbGx5LCBvbmZpbmFsbHksIG9uY2FuY2VsbGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnRoZW4oXG4gICAgICAgICAgICAodmFsdWUpID0+IENhbmNlbGxhYmxlUHJvbWlzZS5yZXNvbHZlKG9uZmluYWxseSgpKS50aGVuKCgpID0+IHZhbHVlKSxcbiAgICAgICAgICAgIChyZWFzb24/KSA9PiBDYW5jZWxsYWJsZVByb21pc2UucmVzb2x2ZShvbmZpbmFsbHkoKSkudGhlbigoKSA9PiB7IHRocm93IHJlYXNvbjsgfSksXG4gICAgICAgICAgICBvbmNhbmNlbGxlZCxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXZSB1c2UgdGhlIGBbU3ltYm9sLnNwZWNpZXNdYCBzdGF0aWMgcHJvcGVydHksIGlmIGF2YWlsYWJsZSxcbiAgICAgKiB0byBkaXNhYmxlIHRoZSBidWlsdC1pbiBhdXRvbWF0aWMgc3ViY2xhc3NpbmcgZmVhdHVyZXMgZnJvbSB7QGxpbmsgUHJvbWlzZX0uXG4gICAgICogSXQgaXMgY3JpdGljYWwgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMgdGhhdCBleHRlbmRlcnMgZG8gbm90IG92ZXJyaWRlIHRoaXMuXG4gICAgICogT25jZSB0aGUgcHJvcG9zYWwgYXQgaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtcm0tYnVpbHRpbi1zdWJjbGFzc2luZ1xuICAgICAqIGlzIGVpdGhlciBhY2NlcHRlZCBvciByZXRpcmVkLCB0aGlzIGltcGxlbWVudGF0aW9uIHdpbGwgaGF2ZSB0byBiZSByZXZpc2VkIGFjY29yZGluZ2x5LlxuICAgICAqXG4gICAgICogQGlnbm9yZVxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgW3NwZWNpZXNdKCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgQ2FuY2VsbGFibGVQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aCBhbiBhcnJheSBvZiByZXN1bHRzXG4gICAgICogd2hlbiBhbGwgb2YgdGhlIHByb3ZpZGVkIFByb21pc2VzIHJlc29sdmUsIG9yIHJlamVjdGVkIHdoZW4gYW55IFByb21pc2UgaXMgcmVqZWN0ZWQuXG4gICAgICpcbiAgICAgKiBFdmVyeSBvbmUgb2YgdGhlIHByb3ZpZGVkIG9iamVjdHMgdGhhdCBpcyBhIHRoZW5hYmxlIF9hbmRfIGNhbmNlbGxhYmxlIG9iamVjdFxuICAgICAqIHdpbGwgYmUgY2FuY2VsbGVkIHdoZW4gdGhlIHJldHVybmVkIHByb21pc2UgaXMgY2FuY2VsbGVkLCB3aXRoIHRoZSBzYW1lIGNhdXNlLlxuICAgICAqXG4gICAgICogQGdyb3VwIFN0YXRpYyBNZXRob2RzXG4gICAgICovXG4gICAgc3RhdGljIGFsbDxUPih2YWx1ZXM6IEl0ZXJhYmxlPFQgfCBQcm9taXNlTGlrZTxUPj4pOiBDYW5jZWxsYWJsZVByb21pc2U8QXdhaXRlZDxUPltdPjtcbiAgICBzdGF0aWMgYWxsPFQgZXh0ZW5kcyByZWFkb25seSB1bmtub3duW10gfCBbXT4odmFsdWVzOiBUKTogQ2FuY2VsbGFibGVQcm9taXNlPHsgLXJlYWRvbmx5IFtQIGluIGtleW9mIFRdOiBBd2FpdGVkPFRbUF0+OyB9PjtcbiAgICBzdGF0aWMgYWxsPFQgZXh0ZW5kcyBJdGVyYWJsZTx1bmtub3duPiB8IEFycmF5TGlrZTx1bmtub3duPj4odmFsdWVzOiBUKTogQ2FuY2VsbGFibGVQcm9taXNlPHVua25vd24+IHtcbiAgICAgICAgbGV0IGNvbGxlY3RlZCA9IEFycmF5LmZyb20odmFsdWVzKTtcbiAgICAgICAgcmV0dXJuIGNvbGxlY3RlZC5sZW5ndGggPT09IDBcbiAgICAgICAgICAgID8gQ2FuY2VsbGFibGVQcm9taXNlLnJlc29sdmUoY29sbGVjdGVkKVxuICAgICAgICAgICAgOiBuZXcgQ2FuY2VsbGFibGVQcm9taXNlPHVua25vd24+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICB2b2lkIFByb21pc2UuYWxsKGNvbGxlY3RlZCkudGhlbihyZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgICAgfSwgYWxsQ2FuY2VsbGVyKGNvbGxlY3RlZCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBDYW5jZWxsYWJsZVByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoIGFuIGFycmF5IG9mIHJlc3VsdHNcbiAgICAgKiB3aGVuIGFsbCBvZiB0aGUgcHJvdmlkZWQgUHJvbWlzZXMgcmVzb2x2ZSBvciByZWplY3QuXG4gICAgICpcbiAgICAgKiBFdmVyeSBvbmUgb2YgdGhlIHByb3ZpZGVkIG9iamVjdHMgdGhhdCBpcyBhIHRoZW5hYmxlIF9hbmRfIGNhbmNlbGxhYmxlIG9iamVjdFxuICAgICAqIHdpbGwgYmUgY2FuY2VsbGVkIHdoZW4gdGhlIHJldHVybmVkIHByb21pc2UgaXMgY2FuY2VsbGVkLCB3aXRoIHRoZSBzYW1lIGNhdXNlLlxuICAgICAqXG4gICAgICogQGdyb3VwIFN0YXRpYyBNZXRob2RzXG4gICAgICovXG4gICAgc3RhdGljIGFsbFNldHRsZWQ8VD4odmFsdWVzOiBJdGVyYWJsZTxUIHwgUHJvbWlzZUxpa2U8VD4+KTogQ2FuY2VsbGFibGVQcm9taXNlPFByb21pc2VTZXR0bGVkUmVzdWx0PEF3YWl0ZWQ8VD4+W10+O1xuICAgIHN0YXRpYyBhbGxTZXR0bGVkPFQgZXh0ZW5kcyByZWFkb25seSB1bmtub3duW10gfCBbXT4odmFsdWVzOiBUKTogQ2FuY2VsbGFibGVQcm9taXNlPHsgLXJlYWRvbmx5IFtQIGluIGtleW9mIFRdOiBQcm9taXNlU2V0dGxlZFJlc3VsdDxBd2FpdGVkPFRbUF0+PjsgfT47XG4gICAgc3RhdGljIGFsbFNldHRsZWQ8VCBleHRlbmRzIEl0ZXJhYmxlPHVua25vd24+IHwgQXJyYXlMaWtlPHVua25vd24+Pih2YWx1ZXM6IFQpOiBDYW5jZWxsYWJsZVByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICBsZXQgY29sbGVjdGVkID0gQXJyYXkuZnJvbSh2YWx1ZXMpO1xuICAgICAgICByZXR1cm4gY29sbGVjdGVkLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgPyBDYW5jZWxsYWJsZVByb21pc2UucmVzb2x2ZShjb2xsZWN0ZWQpXG4gICAgICAgICAgICA6IG5ldyBDYW5jZWxsYWJsZVByb21pc2U8dW5rbm93bj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHZvaWQgUHJvbWlzZS5hbGxTZXR0bGVkKGNvbGxlY3RlZCkudGhlbihyZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgICAgfSwgYWxsQ2FuY2VsbGVyKGNvbGxlY3RlZCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBhbnkgZnVuY3Rpb24gcmV0dXJucyBhIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgYnkgdGhlIGZpcnN0IGdpdmVuIHByb21pc2UgdG8gYmUgZnVsZmlsbGVkLFxuICAgICAqIG9yIHJlamVjdGVkIHdpdGggYW4gQWdncmVnYXRlRXJyb3IgY29udGFpbmluZyBhbiBhcnJheSBvZiByZWplY3Rpb24gcmVhc29uc1xuICAgICAqIGlmIGFsbCBvZiB0aGUgZ2l2ZW4gcHJvbWlzZXMgYXJlIHJlamVjdGVkLlxuICAgICAqIEl0IHJlc29sdmVzIGFsbCBlbGVtZW50cyBvZiB0aGUgcGFzc2VkIGl0ZXJhYmxlIHRvIHByb21pc2VzIGFzIGl0IHJ1bnMgdGhpcyBhbGdvcml0aG0uXG4gICAgICpcbiAgICAgKiBFdmVyeSBvbmUgb2YgdGhlIHByb3ZpZGVkIG9iamVjdHMgdGhhdCBpcyBhIHRoZW5hYmxlIF9hbmRfIGNhbmNlbGxhYmxlIG9iamVjdFxuICAgICAqIHdpbGwgYmUgY2FuY2VsbGVkIHdoZW4gdGhlIHJldHVybmVkIHByb21pc2UgaXMgY2FuY2VsbGVkLCB3aXRoIHRoZSBzYW1lIGNhdXNlLlxuICAgICAqXG4gICAgICogQGdyb3VwIFN0YXRpYyBNZXRob2RzXG4gICAgICovXG4gICAgc3RhdGljIGFueTxUPih2YWx1ZXM6IEl0ZXJhYmxlPFQgfCBQcm9taXNlTGlrZTxUPj4pOiBDYW5jZWxsYWJsZVByb21pc2U8QXdhaXRlZDxUPj47XG4gICAgc3RhdGljIGFueTxUIGV4dGVuZHMgcmVhZG9ubHkgdW5rbm93bltdIHwgW10+KHZhbHVlczogVCk6IENhbmNlbGxhYmxlUHJvbWlzZTxBd2FpdGVkPFRbbnVtYmVyXT4+O1xuICAgIHN0YXRpYyBhbnk8VCBleHRlbmRzIEl0ZXJhYmxlPHVua25vd24+IHwgQXJyYXlMaWtlPHVua25vd24+Pih2YWx1ZXM6IFQpOiBDYW5jZWxsYWJsZVByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICBsZXQgY29sbGVjdGVkID0gQXJyYXkuZnJvbSh2YWx1ZXMpO1xuICAgICAgICByZXR1cm4gY29sbGVjdGVkLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgPyBDYW5jZWxsYWJsZVByb21pc2UucmVzb2x2ZShjb2xsZWN0ZWQpXG4gICAgICAgICAgICA6IG5ldyBDYW5jZWxsYWJsZVByb21pc2U8dW5rbm93bj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHZvaWQgUHJvbWlzZS5hbnkoY29sbGVjdGVkKS50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgICB9LCBhbGxDYW5jZWxsZXIoY29sbGVjdGVkKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCBvciByZWplY3RlZCB3aGVuIGFueSBvZiB0aGUgcHJvdmlkZWQgUHJvbWlzZXMgYXJlIHJlc29sdmVkIG9yIHJlamVjdGVkLlxuICAgICAqXG4gICAgICogRXZlcnkgb25lIG9mIHRoZSBwcm92aWRlZCBvYmplY3RzIHRoYXQgaXMgYSB0aGVuYWJsZSBfYW5kXyBjYW5jZWxsYWJsZSBvYmplY3RcbiAgICAgKiB3aWxsIGJlIGNhbmNlbGxlZCB3aGVuIHRoZSByZXR1cm5lZCBwcm9taXNlIGlzIGNhbmNlbGxlZCwgd2l0aCB0aGUgc2FtZSBjYXVzZS5cbiAgICAgKlxuICAgICAqIEBncm91cCBTdGF0aWMgTWV0aG9kc1xuICAgICAqL1xuICAgIHN0YXRpYyByYWNlPFQ+KHZhbHVlczogSXRlcmFibGU8VCB8IFByb21pc2VMaWtlPFQ+Pik6IENhbmNlbGxhYmxlUHJvbWlzZTxBd2FpdGVkPFQ+PjtcbiAgICBzdGF0aWMgcmFjZTxUIGV4dGVuZHMgcmVhZG9ubHkgdW5rbm93bltdIHwgW10+KHZhbHVlczogVCk6IENhbmNlbGxhYmxlUHJvbWlzZTxBd2FpdGVkPFRbbnVtYmVyXT4+O1xuICAgIHN0YXRpYyByYWNlPFQgZXh0ZW5kcyBJdGVyYWJsZTx1bmtub3duPiB8IEFycmF5TGlrZTx1bmtub3duPj4odmFsdWVzOiBUKTogQ2FuY2VsbGFibGVQcm9taXNlPHVua25vd24+IHtcbiAgICAgICAgbGV0IGNvbGxlY3RlZCA9IEFycmF5LmZyb20odmFsdWVzKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDYW5jZWxsYWJsZVByb21pc2U8dW5rbm93bj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdm9pZCBQcm9taXNlLnJhY2UoY29sbGVjdGVkKS50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0sIGFsbENhbmNlbGxlcihjb2xsZWN0ZWQpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGNhbmNlbGxlZCBDYW5jZWxsYWJsZVByb21pc2UgZm9yIHRoZSBwcm92aWRlZCBjYXVzZS5cbiAgICAgKlxuICAgICAqIEBncm91cCBTdGF0aWMgTWV0aG9kc1xuICAgICAqL1xuICAgIHN0YXRpYyBjYW5jZWw8VCA9IG5ldmVyPihjYXVzZT86IGFueSk6IENhbmNlbGxhYmxlUHJvbWlzZTxUPiB7XG4gICAgICAgIGNvbnN0IHAgPSBuZXcgQ2FuY2VsbGFibGVQcm9taXNlPFQ+KCgpID0+IHt9KTtcbiAgICAgICAgcC5jYW5jZWwoY2F1c2UpO1xuICAgICAgICByZXR1cm4gcDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IENhbmNlbGxhYmxlUHJvbWlzZSB0aGF0IGNhbmNlbHNcbiAgICAgKiBhZnRlciB0aGUgc3BlY2lmaWVkIHRpbWVvdXQsIHdpdGggdGhlIHByb3ZpZGVkIGNhdXNlLlxuICAgICAqXG4gICAgICogSWYgdGhlIHtAbGluayBBYm9ydFNpZ25hbC50aW1lb3V0fSBmYWN0b3J5IG1ldGhvZCBpcyBhdmFpbGFibGUsXG4gICAgICogaXQgaXMgdXNlZCB0byBiYXNlIHRoZSB0aW1lb3V0IG9uIF9hY3RpdmVfIHRpbWUgcmF0aGVyIHRoYW4gX2VsYXBzZWRfIHRpbWUuXG4gICAgICogT3RoZXJ3aXNlLCBgdGltZW91dGAgZmFsbHMgYmFjayB0byB7QGxpbmsgc2V0VGltZW91dH0uXG4gICAgICpcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcbiAgICAgKi9cbiAgICBzdGF0aWMgdGltZW91dDxUID0gbmV2ZXI+KG1pbGxpc2Vjb25kczogbnVtYmVyLCBjYXVzZT86IGFueSk6IENhbmNlbGxhYmxlUHJvbWlzZTxUPiB7XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBuZXcgQ2FuY2VsbGFibGVQcm9taXNlPFQ+KCgpID0+IHt9KTtcbiAgICAgICAgaWYgKEFib3J0U2lnbmFsICYmIHR5cGVvZiBBYm9ydFNpZ25hbCA9PT0gJ2Z1bmN0aW9uJyAmJiBBYm9ydFNpZ25hbC50aW1lb3V0ICYmIHR5cGVvZiBBYm9ydFNpZ25hbC50aW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBBYm9ydFNpZ25hbC50aW1lb3V0KG1pbGxpc2Vjb25kcykuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PiB2b2lkIHByb21pc2UuY2FuY2VsKGNhdXNlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHZvaWQgcHJvbWlzZS5jYW5jZWwoY2F1c2UpLCBtaWxsaXNlY29uZHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ2FuY2VsbGFibGVQcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgdGhlIHNwZWNpZmllZCB0aW1lb3V0LlxuICAgICAqIFRoZSByZXR1cm5lZCBwcm9taXNlIGNhbiBiZSBjYW5jZWxsZWQgd2l0aG91dCBjb25zZXF1ZW5jZXMuXG4gICAgICpcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcbiAgICAgKi9cbiAgICBzdGF0aWMgc2xlZXAobWlsbGlzZWNvbmRzOiBudW1iZXIpOiBDYW5jZWxsYWJsZVByb21pc2U8dm9pZD47XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBDYW5jZWxsYWJsZVByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlclxuICAgICAqIHRoZSBzcGVjaWZpZWQgdGltZW91dCwgd2l0aCB0aGUgcHJvdmlkZWQgdmFsdWUuXG4gICAgICogVGhlIHJldHVybmVkIHByb21pc2UgY2FuIGJlIGNhbmNlbGxlZCB3aXRob3V0IGNvbnNlcXVlbmNlcy5cbiAgICAgKlxuICAgICAqIEBncm91cCBTdGF0aWMgTWV0aG9kc1xuICAgICAqL1xuICAgIHN0YXRpYyBzbGVlcDxUPihtaWxsaXNlY29uZHM6IG51bWJlciwgdmFsdWU6IFQpOiBDYW5jZWxsYWJsZVByb21pc2U8VD47XG4gICAgc3RhdGljIHNsZWVwPFQgPSB2b2lkPihtaWxsaXNlY29uZHM6IG51bWJlciwgdmFsdWU/OiBUKTogQ2FuY2VsbGFibGVQcm9taXNlPFQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBDYW5jZWxsYWJsZVByb21pc2U8VD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZSh2YWx1ZSEpLCBtaWxsaXNlY29uZHMpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHJlamVjdGVkIENhbmNlbGxhYmxlUHJvbWlzZSBmb3IgdGhlIHByb3ZpZGVkIHJlYXNvbi5cbiAgICAgKlxuICAgICAqIEBncm91cCBTdGF0aWMgTWV0aG9kc1xuICAgICAqL1xuICAgIHN0YXRpYyByZWplY3Q8VCA9IG5ldmVyPihyZWFzb24/OiBhbnkpOiBDYW5jZWxsYWJsZVByb21pc2U8VD4ge1xuICAgICAgICByZXR1cm4gbmV3IENhbmNlbGxhYmxlUHJvbWlzZTxUPigoXywgcmVqZWN0KSA9PiByZWplY3QocmVhc29uKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyByZXNvbHZlZCBDYW5jZWxsYWJsZVByb21pc2UuXG4gICAgICpcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcbiAgICAgKi9cbiAgICBzdGF0aWMgcmVzb2x2ZSgpOiBDYW5jZWxsYWJsZVByb21pc2U8dm9pZD47XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyByZXNvbHZlZCBDYW5jZWxsYWJsZVByb21pc2UgZm9yIHRoZSBwcm92aWRlZCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBncm91cCBTdGF0aWMgTWV0aG9kc1xuICAgICAqL1xuICAgIHN0YXRpYyByZXNvbHZlPFQ+KHZhbHVlOiBUKTogQ2FuY2VsbGFibGVQcm9taXNlPEF3YWl0ZWQ8VD4+O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgcmVzb2x2ZWQgQ2FuY2VsbGFibGVQcm9taXNlIGZvciB0aGUgcHJvdmlkZWQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcbiAgICAgKi9cbiAgICBzdGF0aWMgcmVzb2x2ZTxUPih2YWx1ZTogVCB8IFByb21pc2VMaWtlPFQ+KTogQ2FuY2VsbGFibGVQcm9taXNlPEF3YWl0ZWQ8VD4+O1xuICAgIHN0YXRpYyByZXNvbHZlPFQgPSB2b2lkPih2YWx1ZT86IFQgfCBQcm9taXNlTGlrZTxUPik6IENhbmNlbGxhYmxlUHJvbWlzZTxBd2FpdGVkPFQ+PiB7XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIENhbmNlbGxhYmxlUHJvbWlzZSkge1xuICAgICAgICAgICAgLy8gT3B0aW1pc2UgZm9yIGNhbmNlbGxhYmxlIHByb21pc2VzLlxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQ2FuY2VsbGFibGVQcm9taXNlPGFueT4oKHJlc29sdmUpID0+IHJlc29sdmUodmFsdWUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IENhbmNlbGxhYmxlUHJvbWlzZSBhbmQgcmV0dXJucyBpdCBpbiBhbiBvYmplY3QsIGFsb25nIHdpdGggaXRzIHJlc29sdmUgYW5kIHJlamVjdCBmdW5jdGlvbnNcbiAgICAgKiBhbmQgYSBnZXR0ZXIvc2V0dGVyIGZvciB0aGUgY2FuY2VsbGF0aW9uIGNhbGxiYWNrLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgaXMgcG9seWZpbGxlZCwgaGVuY2UgYXZhaWxhYmxlIGluIGV2ZXJ5IE9TL3dlYnZpZXcgdmVyc2lvbi5cbiAgICAgKlxuICAgICAqIEBncm91cCBTdGF0aWMgTWV0aG9kc1xuICAgICAqL1xuICAgIHN0YXRpYyB3aXRoUmVzb2x2ZXJzPFQ+KCk6IENhbmNlbGxhYmxlUHJvbWlzZVdpdGhSZXNvbHZlcnM8VD4ge1xuICAgICAgICBsZXQgcmVzdWx0OiBDYW5jZWxsYWJsZVByb21pc2VXaXRoUmVzb2x2ZXJzPFQ+ID0geyBvbmNhbmNlbGxlZDogbnVsbCB9IGFzIGFueTtcbiAgICAgICAgcmVzdWx0LnByb21pc2UgPSBuZXcgQ2FuY2VsbGFibGVQcm9taXNlPFQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHJlc3VsdC5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgICAgIHJlc3VsdC5yZWplY3QgPSByZWplY3Q7XG4gICAgICAgIH0sIChjYXVzZT86IGFueSkgPT4geyByZXN1bHQub25jYW5jZWxsZWQ/LihjYXVzZSk7IH0pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgY2FsbGJhY2sgdGhhdCBpbXBsZW1lbnRzIHRoZSBjYW5jZWxsYXRpb24gYWxnb3JpdGhtIGZvciB0aGUgZ2l2ZW4gY2FuY2VsbGFibGUgcHJvbWlzZS5cbiAqIFRoZSBwcm9taXNlIHJldHVybmVkIGZyb20gdGhlIHJlc3VsdGluZyBmdW5jdGlvbiBkb2VzIG5vdCByZWplY3QuXG4gKi9cbmZ1bmN0aW9uIGNhbmNlbGxlckZvcjxUPihwcm9taXNlOiBDYW5jZWxsYWJsZVByb21pc2VXaXRoUmVzb2x2ZXJzPFQ+LCBzdGF0ZTogQ2FuY2VsbGFibGVQcm9taXNlU3RhdGUpIHtcbiAgICBsZXQgY2FuY2VsbGF0aW9uUHJvbWlzZTogdm9pZCB8IFByb21pc2VMaWtlPHZvaWQ+ID0gdW5kZWZpbmVkO1xuXG4gICAgcmV0dXJuIChyZWFzb246IENhbmNlbEVycm9yKTogdm9pZCB8IFByb21pc2VMaWtlPHZvaWQ+ID0+IHtcbiAgICAgICAgaWYgKCFzdGF0ZS5zZXR0bGVkKSB7XG4gICAgICAgICAgICBzdGF0ZS5zZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHN0YXRlLnJlYXNvbiA9IHJlYXNvbjtcbiAgICAgICAgICAgIHByb21pc2UucmVqZWN0KHJlYXNvbik7XG5cbiAgICAgICAgICAgIC8vIEF0dGFjaCBhbiBlcnJvciBoYW5kbGVyIHRoYXQgaWdub3JlcyB0aGlzIHNwZWNpZmljIHJlamVjdGlvbiByZWFzb24gYW5kIG5vdGhpbmcgZWxzZS5cbiAgICAgICAgICAgIC8vIEluIHRoZW9yeSwgYSBzYW5lIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gYXQgdGhpcyBwb2ludFxuICAgICAgICAgICAgLy8gc2hvdWxkIGFsd2F5cyByZWplY3Qgd2l0aCBvdXIgY2FuY2VsbGF0aW9uIHJlYXNvbixcbiAgICAgICAgICAgIC8vIGhlbmNlIHRoZSBoYW5kbGVyIHdpbGwgbmV2ZXIgdGhyb3cuXG4gICAgICAgICAgICB2b2lkIHByb21pc2VUaGVuLmNhbGwocHJvbWlzZS5wcm9taXNlLCB1bmRlZmluZWQsIChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyICE9PSByZWFzb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgcmVhc29uIGlzIG5vdCBzZXQsIHRoZSBwcm9taXNlIHJlc29sdmVkIHJlZ3VsYXJseSwgaGVuY2Ugd2UgbXVzdCBub3QgY2FsbCBvbmNhbmNlbGxlZC5cbiAgICAgICAgLy8gSWYgb25jYW5jZWxsZWQgaXMgdW5zZXQsIG5vIG5lZWQgdG8gZ28gYW55IGZ1cnRoZXIuXG4gICAgICAgIGlmICghc3RhdGUucmVhc29uIHx8ICFwcm9taXNlLm9uY2FuY2VsbGVkKSB7IHJldHVybjsgfVxuXG4gICAgICAgIGNhbmNlbGxhdGlvblByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHByb21pc2Uub25jYW5jZWxsZWQhKHN0YXRlLnJlYXNvbiEuY2F1c2UpKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIFByb21pc2UucmVqZWN0KG5ldyBDYW5jZWxsZWRSZWplY3Rpb25FcnJvcihwcm9taXNlLnByb21pc2UsIGVyciwgXCJVbmhhbmRsZWQgZXhjZXB0aW9uIGluIG9uY2FuY2VsbGVkIGNhbGxiYWNrLlwiKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBjYW5jZWxsYXRpb25Qcm9taXNlLnRoZW4odW5kZWZpbmVkLCAocmVhc29uPykgPT4ge1xuICAgICAgICAgICAgdGhyb3cgbmV3IENhbmNlbGxlZFJlamVjdGlvbkVycm9yKHByb21pc2UucHJvbWlzZSwgcmVhc29uLCBcIlVuaGFuZGxlZCByZWplY3Rpb24gaW4gb25jYW5jZWxsZWQgY2FsbGJhY2suXCIpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBVbnNldCBvbmNhbmNlbGxlZCB0byBwcmV2ZW50IHJlcGVhdGVkIGNhbGxzLlxuICAgICAgICBwcm9taXNlLm9uY2FuY2VsbGVkID0gbnVsbDtcblxuICAgICAgICByZXR1cm4gY2FuY2VsbGF0aW9uUHJvbWlzZTtcbiAgICB9XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGNhbGxiYWNrIHRoYXQgaW1wbGVtZW50cyB0aGUgcmVzb2x1dGlvbiBhbGdvcml0aG0gZm9yIHRoZSBnaXZlbiBjYW5jZWxsYWJsZSBwcm9taXNlLlxuICovXG5mdW5jdGlvbiByZXNvbHZlckZvcjxUPihwcm9taXNlOiBDYW5jZWxsYWJsZVByb21pc2VXaXRoUmVzb2x2ZXJzPFQ+LCBzdGF0ZTogQ2FuY2VsbGFibGVQcm9taXNlU3RhdGUpOiBDYW5jZWxsYWJsZVByb21pc2VSZXNvbHZlcjxUPiB7XG4gICAgcmV0dXJuICh2YWx1ZSkgPT4ge1xuICAgICAgICBpZiAoc3RhdGUucmVzb2x2aW5nKSB7IHJldHVybjsgfVxuICAgICAgICBzdGF0ZS5yZXNvbHZpbmcgPSB0cnVlO1xuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gcHJvbWlzZS5wcm9taXNlKSB7XG4gICAgICAgICAgICBpZiAoc3RhdGUuc2V0dGxlZCkgeyByZXR1cm47IH1cbiAgICAgICAgICAgIHN0YXRlLnNldHRsZWQgPSB0cnVlO1xuICAgICAgICAgICAgcHJvbWlzZS5yZWplY3QobmV3IFR5cGVFcnJvcihcIkEgcHJvbWlzZSBjYW5ub3QgYmUgcmVzb2x2ZWQgd2l0aCBpdHNlbGYuXCIpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgICAgICAgIGxldCB0aGVuOiBhbnk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoZW4gPSAodmFsdWUgYXMgYW55KS50aGVuO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgc3RhdGUuc2V0dGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgcHJvbWlzZS5yZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpc0NhbGxhYmxlKHRoZW4pKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNhbmNlbCA9ICh2YWx1ZSBhcyBhbnkpLmNhbmNlbDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ2FsbGFibGUoY2FuY2VsKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb25jYW5jZWxsZWQgPSAoY2F1c2U/OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZsZWN0LmFwcGx5KGNhbmNlbCwgdmFsdWUsIFtjYXVzZV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5yZWFzb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBhbHJlYWR5IGNhbmNlbGxlZCwgcHJvcGFnYXRlIGNhbmNlbGxhdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcHJvbWlzZSByZXR1cm5lZCBmcm9tIHRoZSBjYW5jZWxsZXIgYWxnb3JpdGhtIGRvZXMgbm90IHJlamVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIGl0IGNhbiBiZSBkaXNjYXJkZWQgc2FmZWx5LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgY2FuY2VsbGVyRm9yKHsgLi4ucHJvbWlzZSwgb25jYW5jZWxsZWQgfSwgc3RhdGUpKHN0YXRlLnJlYXNvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2Uub25jYW5jZWxsZWQgPSBvbmNhbmNlbGxlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2gge31cblxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1N0YXRlOiBDYW5jZWxsYWJsZVByb21pc2VTdGF0ZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgcm9vdDogc3RhdGUucm9vdCxcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2aW5nOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgZ2V0IHNldHRsZWQoKSB7IHJldHVybiB0aGlzLnJvb3Quc2V0dGxlZCB9LFxuICAgICAgICAgICAgICAgICAgICBzZXQgc2V0dGxlZCh2YWx1ZSkgeyB0aGlzLnJvb3Quc2V0dGxlZCA9IHZhbHVlOyB9LFxuICAgICAgICAgICAgICAgICAgICBnZXQgcmVhc29uKCkgeyByZXR1cm4gdGhpcy5yb290LnJlYXNvbiB9XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlamVjdG9yID0gcmVqZWN0b3JGb3IocHJvbWlzZSwgbmV3U3RhdGUpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIFJlZmxlY3QuYXBwbHkodGhlbiwgdmFsdWUsIFtyZXNvbHZlckZvcihwcm9taXNlLCBuZXdTdGF0ZSksIHJlamVjdG9yXSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdG9yKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjsgLy8gSU1QT1JUQU5UIVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0YXRlLnNldHRsZWQpIHsgcmV0dXJuOyB9XG4gICAgICAgIHN0YXRlLnNldHRsZWQgPSB0cnVlO1xuICAgICAgICBwcm9taXNlLnJlc29sdmUodmFsdWUpO1xuICAgIH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGNhbGxiYWNrIHRoYXQgaW1wbGVtZW50cyB0aGUgcmVqZWN0aW9uIGFsZ29yaXRobSBmb3IgdGhlIGdpdmVuIGNhbmNlbGxhYmxlIHByb21pc2UuXG4gKi9cbmZ1bmN0aW9uIHJlamVjdG9yRm9yPFQ+KHByb21pc2U6IENhbmNlbGxhYmxlUHJvbWlzZVdpdGhSZXNvbHZlcnM8VD4sIHN0YXRlOiBDYW5jZWxsYWJsZVByb21pc2VTdGF0ZSk6IENhbmNlbGxhYmxlUHJvbWlzZVJlamVjdG9yIHtcbiAgICByZXR1cm4gKHJlYXNvbj8pID0+IHtcbiAgICAgICAgaWYgKHN0YXRlLnJlc29sdmluZykgeyByZXR1cm47IH1cbiAgICAgICAgc3RhdGUucmVzb2x2aW5nID0gdHJ1ZTtcblxuICAgICAgICBpZiAoc3RhdGUuc2V0dGxlZCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAocmVhc29uIGluc3RhbmNlb2YgQ2FuY2VsRXJyb3IgJiYgc3RhdGUucmVhc29uIGluc3RhbmNlb2YgQ2FuY2VsRXJyb3IgJiYgT2JqZWN0LmlzKHJlYXNvbi5jYXVzZSwgc3RhdGUucmVhc29uLmNhdXNlKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTd2FsbG93IGxhdGUgcmVqZWN0aW9ucyB0aGF0IGFyZSBDYW5jZWxFcnJvcnMgd2hvc2UgY2FuY2VsbGF0aW9uIGNhdXNlIGlzIHRoZSBzYW1lIGFzIG91cnMuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIHt9XG5cbiAgICAgICAgICAgIHZvaWQgUHJvbWlzZS5yZWplY3QobmV3IENhbmNlbGxlZFJlamVjdGlvbkVycm9yKHByb21pc2UucHJvbWlzZSwgcmVhc29uKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdGF0ZS5zZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHByb21pc2UucmVqZWN0KHJlYXNvbik7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGNhbGxiYWNrIHRoYXQgY2FuY2VscyBhbGwgdmFsdWVzIGluIGFuIGl0ZXJhYmxlIHRoYXQgbG9vayBsaWtlIGNhbmNlbGxhYmxlIHRoZW5hYmxlcy5cbiAqL1xuZnVuY3Rpb24gYWxsQ2FuY2VsbGVyKHZhbHVlczogSXRlcmFibGU8YW55Pik6IENhbmNlbGxhYmxlUHJvbWlzZUNhbmNlbGxlciB7XG4gICAgcmV0dXJuIChjYXVzZT8pID0+IHtcbiAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzQ2FsbGFibGUodmFsdWUudGhlbikpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNhbmNlbCA9IHZhbHVlLmNhbmNlbDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ2FsbGFibGUoY2FuY2VsKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgUmVmbGVjdC5hcHBseShjYW5jZWwsIHZhbHVlLCBbY2F1c2VdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2gge31cbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGl0cyBhcmd1bWVudC5cbiAqL1xuZnVuY3Rpb24gaWRlbnRpdHk8VD4oeDogVCk6IFQge1xuICAgIHJldHVybiB4O1xufVxuXG4vKipcbiAqIFRocm93cyBpdHMgYXJndW1lbnQuXG4gKi9cbmZ1bmN0aW9uIHRocm93ZXIocmVhc29uPzogYW55KTogbmV2ZXIge1xuICAgIHRocm93IHJlYXNvbjtcbn1cblxuLyoqXG4gKiBBdHRlbXB0cyB2YXJpb3VzIHN0cmF0ZWdpZXMgdG8gY29udmVydCBhbiBlcnJvciB0byBhIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gZXJyb3JNZXNzYWdlKGVycjogYW55KTogc3RyaW5nIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IgfHwgdHlwZW9mIGVyciAhPT0gJ29iamVjdCcgfHwgZXJyLnRvU3RyaW5nICE9PSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJcIiArIGVycjtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2gge31cblxuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShlcnIpO1xuICAgIH0gY2F0Y2gge31cblxuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZXJyKTtcbiAgICB9IGNhdGNoIHt9XG5cbiAgICByZXR1cm4gXCI8Y291bGQgbm90IGNvbnZlcnQgZXJyb3IgdG8gc3RyaW5nPlwiO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGN1cnJlbnQgYmFycmllciBwcm9taXNlIGZvciB0aGUgZ2l2ZW4gY2FuY2VsbGFibGUgcHJvbWlzZS4gSWYgbmVjZXNzYXJ5LCBpbml0aWFsaXNlcyB0aGUgYmFycmllci5cbiAqL1xuZnVuY3Rpb24gY3VycmVudEJhcnJpZXI8VD4ocHJvbWlzZTogQ2FuY2VsbGFibGVQcm9taXNlPFQ+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IHB3cjogUGFydGlhbDxQcm9taXNlV2l0aFJlc29sdmVyczx2b2lkPj4gPSBwcm9taXNlW2JhcnJpZXJTeW1dID8/IHt9O1xuICAgIGlmICghKCdwcm9taXNlJyBpbiBwd3IpKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24ocHdyLCBwcm9taXNlV2l0aFJlc29sdmVyczx2b2lkPigpKTtcbiAgICB9XG4gICAgaWYgKHByb21pc2VbYmFycmllclN5bV0gPT0gbnVsbCkge1xuICAgICAgICBwd3IucmVzb2x2ZSEoKTtcbiAgICAgICAgcHJvbWlzZVtiYXJyaWVyU3ltXSA9IHB3cjtcbiAgICB9XG4gICAgcmV0dXJuIHB3ci5wcm9taXNlITtcbn1cblxuLy8gU3RvcCBzbmVha3kgcGVvcGxlIGZyb20gYnJlYWtpbmcgdGhlIGJhcnJpZXIgbWVjaGFuaXNtLlxuY29uc3QgcHJvbWlzZVRoZW4gPSBQcm9taXNlLnByb3RvdHlwZS50aGVuO1xuUHJvbWlzZS5wcm90b3R5cGUudGhlbiA9IGZ1bmN0aW9uKC4uLmFyZ3MpIHtcbiAgICBpZiAodGhpcyBpbnN0YW5jZW9mIENhbmNlbGxhYmxlUHJvbWlzZSkge1xuICAgICAgICByZXR1cm4gdGhpcy50aGVuKC4uLmFyZ3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBSZWZsZWN0LmFwcGx5KHByb21pc2VUaGVuLCB0aGlzLCBhcmdzKTtcbiAgICB9XG59XG5cbi8vIFBvbHlmaWxsIFByb21pc2Uud2l0aFJlc29sdmVycy5cbmxldCBwcm9taXNlV2l0aFJlc29sdmVycyA9IFByb21pc2Uud2l0aFJlc29sdmVycztcbmlmIChwcm9taXNlV2l0aFJlc29sdmVycyAmJiB0eXBlb2YgcHJvbWlzZVdpdGhSZXNvbHZlcnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBwcm9taXNlV2l0aFJlc29sdmVycyA9IHByb21pc2VXaXRoUmVzb2x2ZXJzLmJpbmQoUHJvbWlzZSk7XG59IGVsc2Uge1xuICAgIHByb21pc2VXaXRoUmVzb2x2ZXJzID0gZnVuY3Rpb24gPFQ+KCk6IFByb21pc2VXaXRoUmVzb2x2ZXJzPFQ+IHtcbiAgICAgICAgbGV0IHJlc29sdmUhOiAodmFsdWU6IFQgfCBQcm9taXNlTGlrZTxUPikgPT4gdm9pZDtcbiAgICAgICAgbGV0IHJlamVjdCE6IChyZWFzb24/OiBhbnkpID0+IHZvaWQ7XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZTxUPigocmVzLCByZWopID0+IHsgcmVzb2x2ZSA9IHJlczsgcmVqZWN0ID0gcmVqOyB9KTtcbiAgICAgICAgcmV0dXJuIHsgcHJvbWlzZSwgcmVzb2x2ZSwgcmVqZWN0IH07XG4gICAgfVxufSIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuaW1wb3J0IHtuZXdSdW50aW1lQ2FsbGVyLCBvYmplY3ROYW1lc30gZnJvbSBcIi4vcnVudGltZS5qc1wiO1xuXG5jb25zdCBjYWxsID0gbmV3UnVudGltZUNhbGxlcihvYmplY3ROYW1lcy5DbGlwYm9hcmQpO1xuXG5jb25zdCBDbGlwYm9hcmRTZXRUZXh0ID0gMDtcbmNvbnN0IENsaXBib2FyZFRleHQgPSAxO1xuXG4vKipcbiAqIFNldHMgdGhlIHRleHQgdG8gdGhlIENsaXBib2FyZC5cbiAqXG4gKiBAcGFyYW0gdGV4dCAtIFRoZSB0ZXh0IHRvIGJlIHNldCB0byB0aGUgQ2xpcGJvYXJkLlxuICogQHJldHVybiBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFNldFRleHQodGV4dDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIGNhbGwoQ2xpcGJvYXJkU2V0VGV4dCwge3RleHR9KTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIENsaXBib2FyZCB0ZXh0XG4gKlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgdGV4dCBmcm9tIHRoZSBDbGlwYm9hcmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBUZXh0KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIGNhbGwoQ2xpcGJvYXJkVGV4dCk7XG59XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbi8qKlxuICogQW55IGlzIGEgZHVtbXkgY3JlYXRpb24gZnVuY3Rpb24gZm9yIHNpbXBsZSBvciB1bmtub3duIHR5cGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQW55PFQ+KHNvdXJjZTogYW55KTogVCB7XG4gICAgcmV0dXJuIHNvdXJjZTtcbn1cblxuLyoqXG4gKiBCeXRlU2xpY2UgaXMgYSBjcmVhdGlvbiBmdW5jdGlvbiB0aGF0IHJlcGxhY2VzXG4gKiBudWxsIHN0cmluZ3Mgd2l0aCBlbXB0eSBzdHJpbmdzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQnl0ZVNsaWNlKHNvdXJjZTogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gKChzb3VyY2UgPT0gbnVsbCkgPyBcIlwiIDogc291cmNlKTtcbn1cblxuLyoqXG4gKiBBcnJheSB0YWtlcyBhIGNyZWF0aW9uIGZ1bmN0aW9uIGZvciBhbiBhcmJpdHJhcnkgdHlwZVxuICogYW5kIHJldHVybnMgYW4gaW4tcGxhY2UgY3JlYXRpb24gZnVuY3Rpb24gZm9yIGFuIGFycmF5XG4gKiB3aG9zZSBlbGVtZW50cyBhcmUgb2YgdGhhdCB0eXBlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQXJyYXk8VD4oZWxlbWVudDogKHNvdXJjZTogYW55KSA9PiBUKTogKHNvdXJjZTogYW55KSA9PiBUW10ge1xuICAgIGlmIChlbGVtZW50ID09PSBBbnkpIHtcbiAgICAgICAgcmV0dXJuIChzb3VyY2UpID0+IChzb3VyY2UgPT09IG51bGwgPyBbXSA6IHNvdXJjZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIChzb3VyY2UpID0+IHtcbiAgICAgICAgaWYgKHNvdXJjZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc291cmNlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBzb3VyY2VbaV0gPSBlbGVtZW50KHNvdXJjZVtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICB9O1xufVxuXG4vKipcbiAqIE1hcCB0YWtlcyBjcmVhdGlvbiBmdW5jdGlvbnMgZm9yIHR3byBhcmJpdHJhcnkgdHlwZXNcbiAqIGFuZCByZXR1cm5zIGFuIGluLXBsYWNlIGNyZWF0aW9uIGZ1bmN0aW9uIGZvciBhbiBvYmplY3RcbiAqIHdob3NlIGtleXMgYW5kIHZhbHVlcyBhcmUgb2YgdGhvc2UgdHlwZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBNYXA8Vj4oa2V5OiAoc291cmNlOiBhbnkpID0+IHN0cmluZywgdmFsdWU6IChzb3VyY2U6IGFueSkgPT4gVik6IChzb3VyY2U6IGFueSkgPT4gUmVjb3JkPHN0cmluZywgVj4ge1xuICAgIGlmICh2YWx1ZSA9PT0gQW55KSB7XG4gICAgICAgIHJldHVybiAoc291cmNlKSA9PiAoc291cmNlID09PSBudWxsID8ge30gOiBzb3VyY2UpO1xuICAgIH1cblxuICAgIHJldHVybiAoc291cmNlKSA9PiB7XG4gICAgICAgIGlmIChzb3VyY2UgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgIHNvdXJjZVtrZXldID0gdmFsdWUoc291cmNlW2tleV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgfTtcbn1cblxuLyoqXG4gKiBOdWxsYWJsZSB0YWtlcyBhIGNyZWF0aW9uIGZ1bmN0aW9uIGZvciBhbiBhcmJpdHJhcnkgdHlwZVxuICogYW5kIHJldHVybnMgYSBjcmVhdGlvbiBmdW5jdGlvbiBmb3IgYSBudWxsYWJsZSB2YWx1ZSBvZiB0aGF0IHR5cGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBOdWxsYWJsZTxUPihlbGVtZW50OiAoc291cmNlOiBhbnkpID0+IFQpOiAoc291cmNlOiBhbnkpID0+IChUIHwgbnVsbCkge1xuICAgIGlmIChlbGVtZW50ID09PSBBbnkpIHtcbiAgICAgICAgcmV0dXJuIEFueTtcbiAgICB9XG5cbiAgICByZXR1cm4gKHNvdXJjZSkgPT4gKHNvdXJjZSA9PT0gbnVsbCA/IG51bGwgOiBlbGVtZW50KHNvdXJjZSkpO1xufVxuXG4vKipcbiAqIFN0cnVjdCB0YWtlcyBhbiBvYmplY3QgbWFwcGluZyBmaWVsZCBuYW1lcyB0byBjcmVhdGlvbiBmdW5jdGlvbnNcbiAqIGFuZCByZXR1cm5zIGFuIGluLXBsYWNlIGNyZWF0aW9uIGZ1bmN0aW9uIGZvciBhIHN0cnVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFN0cnVjdDxcbiAgICBUIGV4dGVuZHMgeyBbXzogc3RyaW5nXTogKChzb3VyY2U6IGFueSkgPT4gYW55KSB9LFxuICAgIFUgZXh0ZW5kcyB7IFtLZXkgaW4ga2V5b2YgVF0/OiBSZXR1cm5UeXBlPFRbS2V5XT4gfVxuPihjcmVhdGVGaWVsZDogVCk6IChzb3VyY2U6IGFueSkgPT4gVSB7XG4gICAgbGV0IGFsbEFueSA9IHRydWU7XG4gICAgZm9yIChjb25zdCBuYW1lIGluIGNyZWF0ZUZpZWxkKSB7XG4gICAgICAgIGlmIChjcmVhdGVGaWVsZFtuYW1lXSAhPT0gQW55KSB7XG4gICAgICAgICAgICBhbGxBbnkgPSBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChhbGxBbnkpIHtcbiAgICAgICAgcmV0dXJuIEFueTtcbiAgICB9XG5cbiAgICByZXR1cm4gKHNvdXJjZSkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgaW4gY3JlYXRlRmllbGQpIHtcbiAgICAgICAgICAgIGlmIChuYW1lIGluIHNvdXJjZSkge1xuICAgICAgICAgICAgICAgIHNvdXJjZVtuYW1lXSA9IGNyZWF0ZUZpZWxkW25hbWVdKHNvdXJjZVtuYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICB9O1xufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5leHBvcnQgaW50ZXJmYWNlIFNpemUge1xuICAgIC8qKiBUaGUgd2lkdGggb2YgYSByZWN0YW5ndWxhciBhcmVhLiAqL1xuICAgIFdpZHRoOiBudW1iZXI7XG4gICAgLyoqIFRoZSBoZWlnaHQgb2YgYSByZWN0YW5ndWxhciBhcmVhLiAqL1xuICAgIEhlaWdodDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlY3Qge1xuICAgIC8qKiBUaGUgWCBjb29yZGluYXRlIG9mIHRoZSBvcmlnaW4uICovXG4gICAgWDogbnVtYmVyO1xuICAgIC8qKiBUaGUgWSBjb29yZGluYXRlIG9mIHRoZSBvcmlnaW4uICovXG4gICAgWTogbnVtYmVyO1xuICAgIC8qKiBUaGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZS4gKi9cbiAgICBXaWR0aDogbnVtYmVyO1xuICAgIC8qKiBUaGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUuICovXG4gICAgSGVpZ2h0OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2NyZWVuIHtcbiAgICAvKiogVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBzY3JlZW4uICovXG4gICAgSUQ6IHN0cmluZztcbiAgICAvKiogSHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgc2NyZWVuLiAqL1xuICAgIE5hbWU6IHN0cmluZztcbiAgICAvKiogVGhlIHNjYWxlIGZhY3RvciBvZiB0aGUgc2NyZWVuIChEUEkvOTYpLiAxID0gc3RhbmRhcmQgRFBJLCAyID0gSGlEUEkgKFJldGluYSksIGV0Yy4gKi9cbiAgICBTY2FsZUZhY3RvcjogbnVtYmVyO1xuICAgIC8qKiBUaGUgWCBjb29yZGluYXRlIG9mIHRoZSBzY3JlZW4uICovXG4gICAgWDogbnVtYmVyO1xuICAgIC8qKiBUaGUgWSBjb29yZGluYXRlIG9mIHRoZSBzY3JlZW4uICovXG4gICAgWTogbnVtYmVyO1xuICAgIC8qKiBDb250YWlucyB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgc2NyZWVuLiAqL1xuICAgIFNpemU6IFNpemU7XG4gICAgLyoqIENvbnRhaW5zIHRoZSBib3VuZHMgb2YgdGhlIHNjcmVlbiBpbiB0ZXJtcyBvZiBYLCBZLCBXaWR0aCwgYW5kIEhlaWdodC4gKi9cbiAgICBCb3VuZHM6IFJlY3Q7XG4gICAgLyoqIENvbnRhaW5zIHRoZSBwaHlzaWNhbCBib3VuZHMgb2YgdGhlIHNjcmVlbiBpbiB0ZXJtcyBvZiBYLCBZLCBXaWR0aCwgYW5kIEhlaWdodCAoYmVmb3JlIHNjYWxpbmcpLiAqL1xuICAgIFBoeXNpY2FsQm91bmRzOiBSZWN0O1xuICAgIC8qKiBDb250YWlucyB0aGUgYXJlYSBvZiB0aGUgc2NyZWVuIHRoYXQgaXMgYWN0dWFsbHkgdXNhYmxlIChleGNsdWRpbmcgdGFza2JhciBhbmQgb3RoZXIgc3lzdGVtIFVJKS4gKi9cbiAgICBXb3JrQXJlYTogUmVjdDtcbiAgICAvKiogQ29udGFpbnMgdGhlIHBoeXNpY2FsIFdvcmtBcmVhIG9mIHRoZSBzY3JlZW4gKGJlZm9yZSBzY2FsaW5nKS4gKi9cbiAgICBQaHlzaWNhbFdvcmtBcmVhOiBSZWN0O1xuICAgIC8qKiBUcnVlIGlmIHRoaXMgaXMgdGhlIHByaW1hcnkgbW9uaXRvciBzZWxlY3RlZCBieSB0aGUgdXNlciBpbiB0aGUgb3BlcmF0aW5nIHN5c3RlbS4gKi9cbiAgICBJc1ByaW1hcnk6IGJvb2xlYW47XG4gICAgLyoqIFRoZSByb3RhdGlvbiBvZiB0aGUgc2NyZWVuLiAqL1xuICAgIFJvdGF0aW9uOiBudW1iZXI7XG59XG5cbmltcG9ydCB7IG5ld1J1bnRpbWVDYWxsZXIsIG9iamVjdE5hbWVzIH0gZnJvbSBcIi4vcnVudGltZS5qc1wiO1xuY29uc3QgY2FsbCA9IG5ld1J1bnRpbWVDYWxsZXIob2JqZWN0TmFtZXMuU2NyZWVucyk7XG5cbmNvbnN0IGdldEFsbCA9IDA7XG5jb25zdCBnZXRQcmltYXJ5ID0gMTtcbmNvbnN0IGdldEN1cnJlbnQgPSAyO1xuXG4vKipcbiAqIEdldHMgYWxsIHNjcmVlbnMuXG4gKlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgb2YgU2NyZWVuIG9iamVjdHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBHZXRBbGwoKTogUHJvbWlzZTxTY3JlZW5bXT4ge1xuICAgIHJldHVybiBjYWxsKGdldEFsbCk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgcHJpbWFyeSBzY3JlZW4uXG4gKlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHByaW1hcnkgc2NyZWVuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gR2V0UHJpbWFyeSgpOiBQcm9taXNlPFNjcmVlbj4ge1xuICAgIHJldHVybiBjYWxsKGdldFByaW1hcnkpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGN1cnJlbnQgYWN0aXZlIHNjcmVlbi5cbiAqXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBjdXJyZW50IGFjdGl2ZSBzY3JlZW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBHZXRDdXJyZW50KCk6IFByb21pc2U8U2NyZWVuPiB7XG4gICAgcmV0dXJuIGNhbGwoZ2V0Q3VycmVudCk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7OztBQ0FBO0FBQUE7QUFBQTtBQUFBO0FBQUE7OztBQ0FBO0FBQUE7QUFBQTtBQUFBOzs7QUM2QkEsSUFBTSxjQUNGO0FBRUcsU0FBUyxPQUFPLE9BQWUsSUFBWTtBQUM5QyxNQUFJLEtBQUs7QUFFVCxNQUFJLElBQUksT0FBTztBQUNmLFNBQU8sS0FBSztBQUVSLFVBQU0sWUFBYSxLQUFLLE9BQU8sSUFBSSxLQUFNLENBQUM7QUFBQSxFQUM5QztBQUNBLFNBQU87QUFDWDs7O0FDN0JBLElBQU0sYUFBYSxPQUFPLFNBQVMsU0FBUztBQUdyQyxJQUFNLGNBQWMsT0FBTyxPQUFP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QUFBQSxFQUNYO0FBRUEsU0FBTyxDQUFDLFdBQVksV0FBVyxPQUFPLE9BQU8sUUFBUSxNQUFNO0FBQy9EO0FBTU8sU0FBUyxPQUdkLGFBQW9DO0FBQ2xDLE1BQUksU0FBUztBQUNiLGFBQVcsUUFBUSxhQUFhO0FBQzVCLFFBQUksWUFBWSxJQUFJLE1BQU0sS0FBSztBQUMzQixlQUFTO0FBQ1Q7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQUksUUFBUTtBQUNSLFdBQU87QUFBQSxFQUNYO0FBRUEsU0FBTyxDQUFDLFdBQVc7QUFDZixlQUFXLFFBQVEsYUFBYTtBQUM1QixVQUFJLFFBQVEsUUFBUTtBQUNoQixlQUFPLElBQUksSUFBSSxZQUFZLElBQUksRUFBRSxPQUFPLElBQUksQ0FBQztBQUFBLE1BQ2pEO0FBQUEsSUFDSjtBQUNBLFdBQU87QUFBQSxFQUNYO0FBQ0o7OztBQzFHQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUF3REEsSUFBTUMsUUFBTyxpQkFBaUIsWUFBWSxPQUFPO0FBRWpELElBQU0sU0FBUztBQUNmLElBQU0sYUFBYTtBQUNuQixJQUFNLGFBQWE7QUFPWixTQUFTLFNBQTRCO0FBQ3hDLFNBQU9BLE1BQUssTUFBTTtBQUN0QjtBQU9PLFNBQVMsYUFBOEI7QUFDMUMsU0FBT0EsTUFBSyxVQUFVO0FBQzFCO0FBT08sU0FBUyxhQUE4QjtBQUMxQyxTQUFPQSxNQUFLLFVBQVU7QUFDMUI7OztBdEI1RUEsT0FBTyxTQUFTLE9BQU8sVUFBVSxDQUFDO0FBNENsQyxPQUFPLE9BQU8sU0FBZ0I7QUFDdkIsT0FBTyxxQkFBcUI7IiwKICAibmFtZXMiOiBbIl9hIiwgIkVycm9yIiwgImNhbGwiLCAiX2EiLCAiRXJyb3IiLCAiY2FsbCIsICJyZXNpemFibGUiLCAiY2FsbCIsICJfYSIsICJjYWxsIiwgIl9hIiwgIl9hIiwgImNhbGwiLCAiSGlkZU1ldGhvZCIsICJTaG93TWV0aG9kIiwgImlzRG9jdW1lbnREb3RBbGwiLCAiX2EiLCAicmVhc29uIiwgInZhbHVlIiwgImNhbGwiLCAiZ2V0QW5kRGVsZXRlUmVzcG9uc2UiLCAiZ2VuZXJhdGVJRCIsICJjYWxsIiwgIkFycmF5IiwgIk1hcCIsICJBcnJheSIsICJNYXAiLCAia2V5IiwgImNhbGwiXQp9Cg== +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2luZGV4LnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy93bWwudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2Jyb3dzZXIudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL25hbm9pZC50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvcnVudGltZS50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvZGlhbG9ncy50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvZXZlbnRzLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9saXN0ZW5lci50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvZXZlbnRfdHlwZXMudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3V0aWxzLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy93aW5kb3cudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL2NvbXBpbGVkL21haW4uanMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3N5c3RlbS50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvY29udGV4dG1lbnUudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2ZsYWdzLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9kcmFnLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9hcHBsaWNhdGlvbi50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvY2FsbHMudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2NhbGxhYmxlLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9jYW5jZWxsYWJsZS50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvY2xpcGJvYXJkLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9jcmVhdGUudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3NjcmVlbnMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vLyBTZXR1cFxud2luZG93Ll93YWlscyA9IHdpbmRvdy5fd2FpbHMgfHwge307XG5cbmltcG9ydCBcIi4vY29udGV4dG1lbnUuanNcIjtcbmltcG9ydCBcIi4vZHJhZy5qc1wiO1xuXG4vLyBSZS1leHBvcnQgcHVibGljIEFQSVxuaW1wb3J0ICogYXMgQXBwbGljYXRpb24gZnJvbSBcIi4vYXBwbGljYXRpb24uanNcIjtcbmltcG9ydCAqIGFzIEJyb3dzZXIgZnJvbSBcIi4vYnJvd3Nlci5qc1wiO1xuaW1wb3J0ICogYXMgQ2FsbCBmcm9tIFwiLi9jYWxscy5qc1wiO1xuaW1wb3J0ICogYXMgQ2xpcGJvYXJkIGZyb20gXCIuL2NsaXBib2FyZC5qc1wiO1xuaW1wb3J0ICogYXMgQ3JlYXRlIGZyb20gXCIuL2NyZWF0ZS5qc1wiO1xuaW1wb3J0ICogYXMgRGlhbG9ncyBmcm9tIFwiLi9kaWFsb2dzLmpzXCI7XG5pbXBvcnQgKiBhcyBFdmVudHMgZnJvbSBcIi4vZXZlbnRzLmpzXCI7XG5pbXBvcnQgKiBhcyBGbGFncyBmcm9tIFwiLi9mbGFncy5qc1wiO1xuaW1wb3J0ICogYXMgU2NyZWVucyBmcm9tIFwiLi9zY3JlZW5zLmpzXCI7XG5pbXBvcnQgKiBhcyBTeXN0ZW0gZnJvbSBcIi4vc3lzdGVtLmpzXCI7XG5pbXBvcnQgV2luZG93IGZyb20gXCIuL3dpbmRvdy5qc1wiO1xuaW1wb3J0ICogYXMgV01MIGZyb20gXCIuL3dtbC5qc1wiO1xuXG5leHBvcnQge1xuICAgIEFwcGxpY2F0aW9uLFxuICAgIEJyb3dzZXIsXG4gICAgQ2FsbCxcbiAgICBDbGlwYm9hcmQsXG4gICAgRGlhbG9ncyxcbiAgICBFdmVudHMsXG4gICAgRmxhZ3MsXG4gICAgU2NyZWVucyxcbiAgICBTeXN0ZW0sXG4gICAgV2luZG93LFxuICAgIFdNTFxufTtcblxuLyoqXG4gKiBBbiBpbnRlcm5hbCB1dGlsaXR5IGNvbnN1bWVkIGJ5IHRoZSBiaW5kaW5nIGdlbmVyYXRvci5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGlnbm9yZVxuICovXG5leHBvcnQgeyBDcmVhdGUgfTtcblxuZXhwb3J0ICogZnJvbSBcIi4vY2FuY2VsbGFibGUuanNcIjtcblxuLy8gTm90aWZ5IGJhY2tlbmRcbndpbmRvdy5fd2FpbHMuaW52b2tlID0gU3lzdGVtLmludm9rZTtcblN5c3RlbS5pbnZva2UoXCJ3YWlsczpydW50aW1lOnJlYWR5XCIpO1xuIiwgIi8qXG4gXyAgICAgX18gICAgIF8gX19cbnwgfCAgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5pbXBvcnQgeyBPcGVuVVJMIH0gZnJvbSBcIi4vYnJvd3Nlci5qc1wiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi9kaWFsb2dzLmpzXCI7XG5pbXBvcnQgeyBFbWl0LCBXYWlsc0V2ZW50IH0gZnJvbSBcIi4vZXZlbnRzLmpzXCI7XG5pbXBvcnQgeyBjYW5BYm9ydExpc3RlbmVycywgd2hlblJlYWR5IH0gZnJvbSBcIi4vdXRpbHMuanNcIjtcbmltcG9ydCBXaW5kb3cgZnJvbSBcIi4vd2luZG93LmpzXCI7XG5cbi8qKlxuICogU2VuZHMgYW4gZXZlbnQgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgb3B0aW9uYWwgZGF0YS5cbiAqXG4gKiBAcGFyYW0gZXZlbnROYW1lIC0gLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gc2VuZC5cbiAqIEBwYXJhbSBbZGF0YT1udWxsXSAtIC0gT3B0aW9uYWwgZGF0YSB0byBzZW5kIGFsb25nIHdpdGggdGhlIGV2ZW50LlxuICovXG5mdW5jdGlvbiBzZW5kRXZlbnQoZXZlbnROYW1lOiBzdHJpbmcsIGRhdGE6IGFueSA9IG51bGwpOiB2b2lkIHtcbiAgICBFbWl0KG5ldyBXYWlsc0V2ZW50KGV2ZW50TmFtZSwgZGF0YSkpO1xufVxuXG4vKipcbiAqIENhbGxzIGEgbWV0aG9kIG9uIGEgc3BlY2lmaWVkIHdpbmRvdy5cbiAqXG4gKiBAcGFyYW0gd2luZG93TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB3aW5kb3cgdG8gY2FsbCB0aGUgbWV0aG9kIG9uLlxuICogQHBhcmFtIG1ldGhvZE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgbWV0aG9kIHRvIGNhbGwuXG4gKi9cbmZ1bmN0aW9uIGNhbGxXaW5kb3dNZXRob2Qod2luZG93TmFtZTogc3RyaW5nLCBtZXRob2ROYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCB0YXJnZXRXaW5kb3cgPSBXaW5kb3cuR2V0KHdpbmRvd05hbWUpO1xuICAgIGNvbnN0IG1ldGhvZCA9ICh0YXJnZXRXaW5kb3cgYXMgYW55KVttZXRob2ROYW1lXTtcblxuICAgIGlmICh0eXBlb2YgbWV0aG9kICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgV2luZG93IG1ldGhvZCAnJHttZXRob2ROYW1lfScgbm90IGZvdW5kYCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgICBtZXRob2QuY2FsbCh0YXJnZXRXaW5kb3cpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgY2FsbGluZyB3aW5kb3cgbWV0aG9kICcke21ldGhvZE5hbWV9JzogYCwgZSk7XG4gICAgfVxufVxuXG4vKipcbiAqIFJlc3BvbmRzIHRvIGEgdHJpZ2dlcmluZyBldmVudCBieSBydW5uaW5nIGFwcHJvcHJpYXRlIFdNTCBhY3Rpb25zIGZvciB0aGUgY3VycmVudCB0YXJnZXQuXG4gKi9cbmZ1bmN0aW9uIG9uV01MVHJpZ2dlcmVkKGV2OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGVsZW1lbnQgPSBldi5jdXJyZW50VGFyZ2V0IGFzIEVsZW1lbnQ7XG5cbiAgICBmdW5jdGlvbiBydW5FZmZlY3QoY2hvaWNlID0gXCJZZXNcIikge1xuICAgICAgICBpZiAoY2hvaWNlICE9PSBcIlllc1wiKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGV2ZW50VHlwZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd3bWwtZXZlbnQnKSB8fCBlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS13bWwtZXZlbnQnKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0V2luZG93ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3dtbC10YXJnZXQtd2luZG93JykgfHwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtd21sLXRhcmdldC13aW5kb3cnKSB8fCBcIlwiO1xuICAgICAgICBjb25zdCB3aW5kb3dNZXRob2QgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnd21sLXdpbmRvdycpIHx8IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXdtbC13aW5kb3cnKTtcbiAgICAgICAgY29uc3QgdXJsID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3dtbC1vcGVudXJsJykgfHwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtd21sLW9wZW51cmwnKTtcblxuICAgICAgICBpZiAoZXZlbnRUeXBlICE9PSBudWxsKVxuICAgICAgICAgICAgc2VuZEV2ZW50KGV2ZW50VHlwZSk7XG4gICAgICAgIGlmICh3aW5kb3dNZXRob2QgIT09IG51bGwpXG4gICAgICAgICAgICBjYWxsV2luZG93TWV0aG9kKHRhcmdldFdpbmRvdywgd2luZG93TWV0aG9kKTtcbiAgICAgICAgaWYgKHVybCAhPT0gbnVsbClcbiAgICAgICAgICAgIHZvaWQgT3BlblVSTCh1cmwpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpcm0gPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnd21sLWNvbmZpcm0nKSB8fCBlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS13bWwtY29uZmlybScpO1xuXG4gICAgaWYgKGNvbmZpcm0pIHtcbiAgICAgICAgUXVlc3Rpb24oe1xuICAgICAgICAgICAgVGl0bGU6IFwiQ29uZmlybVwiLFxuICAgICAgICAgICAgTWVzc2FnZTogY29uZmlybSxcbiAgICAgICAgICAgIERldGFjaGVkOiBmYWxzZSxcbiAgICAgICAgICAgIEJ1dHRvbnM6IFtcbiAgICAgICAgICAgICAgICB7IExhYmVsOiBcIlllc1wiIH0sXG4gICAgICAgICAgICAgICAgeyBMYWJlbDogXCJOb1wiLCBJc0RlZmF1bHQ6IHRydWUgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9KS50aGVuKHJ1bkVmZmVjdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcnVuRWZmZWN0KCk7XG4gICAgfVxufVxuXG4vLyBQcml2YXRlIGZpZWxkIG5hbWVzLlxuY29uc3QgY29udHJvbGxlclN5bSA9IFN5bWJvbChcImNvbnRyb2xsZXJcIik7XG5jb25zdCB0cmlnZ2VyTWFwU3ltID0gU3ltYm9sKFwidHJpZ2dlck1hcFwiKTtcbmNvbnN0IGVsZW1lbnRDb3VudFN5bSA9IFN5bWJvbChcImVsZW1lbnRDb3VudFwiKTtcblxuLyoqXG4gKiBBYm9ydENvbnRyb2xsZXJSZWdpc3RyeSBkb2VzIG5vdCBhY3R1YWxseSByZW1lbWJlciBhY3RpdmUgZXZlbnQgbGlzdGVuZXJzOiBpbnN0ZWFkXG4gKiBpdCB0aWVzIHRoZW0gdG8gYW4gQWJvcnRTaWduYWwgYW5kIHVzZXMgYW4gQWJvcnRDb250cm9sbGVyIHRvIHJlbW92ZSB0aGVtIGFsbCBhdCBvbmNlLlxuICovXG5jbGFzcyBBYm9ydENvbnRyb2xsZXJSZWdpc3RyeSB7XG4gICAgLy8gUHJpdmF0ZSBmaWVsZHMuXG4gICAgW2NvbnRyb2xsZXJTeW1dOiBBYm9ydENvbnRyb2xsZXI7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpc1tjb250cm9sbGVyU3ltXSA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIG9wdGlvbnMgb2JqZWN0IGZvciBhZGRFdmVudExpc3RlbmVyIHRoYXQgdGllcyB0aGUgbGlzdGVuZXJcbiAgICAgKiB0byB0aGUgQWJvcnRTaWduYWwgZnJvbSB0aGUgY3VycmVudCBBYm9ydENvbnRyb2xsZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZWxlbWVudCAtIEFuIEhUTUwgZWxlbWVudFxuICAgICAqIEBwYXJhbSB0cmlnZ2VycyAtIFRoZSBsaXN0IG9mIGFjdGl2ZSBXTUwgdHJpZ2dlciBldmVudHMgZm9yIHRoZSBzcGVjaWZpZWQgZWxlbWVudHNcbiAgICAgKi9cbiAgICBzZXQoZWxlbWVudDogRWxlbWVudCwgdHJpZ2dlcnM6IHN0cmluZ1tdKTogQWRkRXZlbnRMaXN0ZW5lck9wdGlvbnMge1xuICAgICAgICByZXR1cm4geyBzaWduYWw6IHRoaXNbY29udHJvbGxlclN5bV0uc2lnbmFsIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwgcmVnaXN0ZXJlZCBldmVudCBsaXN0ZW5lcnMgYW5kIHJlc2V0cyB0aGUgcmVnaXN0cnkuXG4gICAgICovXG4gICAgcmVzZXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXNbY29udHJvbGxlclN5bV0uYWJvcnQoKTtcbiAgICAgICAgdGhpc1tjb250cm9sbGVyU3ltXSA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICB9XG59XG5cbi8qKlxuICogV2Vha01hcFJlZ2lzdHJ5IG1hcHMgYWN0aXZlIHRyaWdnZXIgZXZlbnRzIHRvIGVhY2ggRE9NIGVsZW1lbnQgdGhyb3VnaCBhIFdlYWtNYXAuXG4gKiBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgbWFwcGluZyByZW1haW5zIHByaXZhdGUgdG8gdGhpcyBtb2R1bGUsIHdoaWxlIHN0aWxsIGFsbG93aW5nIGdhcmJhZ2VcbiAqIGNvbGxlY3Rpb24gb2YgdGhlIGludm9sdmVkIGVsZW1lbnRzLlxuICovXG5jbGFzcyBXZWFrTWFwUmVnaXN0cnkge1xuICAgIC8qKiBTdG9yZXMgdGhlIGN1cnJlbnQgZWxlbWVudC10by10cmlnZ2VyIG1hcHBpbmcuICovXG4gICAgW3RyaWdnZXJNYXBTeW1dOiBXZWFrTWFwPEVsZW1lbnQsIHN0cmluZ1tdPjtcbiAgICAvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgd2l0aCBhY3RpdmUgV01MIHRyaWdnZXJzLiAqL1xuICAgIFtlbGVtZW50Q291bnRTeW1dOiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpc1t0cmlnZ2VyTWFwU3ltXSA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgIHRoaXNbZWxlbWVudENvdW50U3ltXSA9IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBhY3RpdmUgdHJpZ2dlcnMgZm9yIHRoZSBzcGVjaWZpZWQgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbGVtZW50IC0gQW4gSFRNTCBlbGVtZW50XG4gICAgICogQHBhcmFtIHRyaWdnZXJzIC0gVGhlIGxpc3Qgb2YgYWN0aXZlIFdNTCB0cmlnZ2VyIGV2ZW50cyBmb3IgdGhlIHNwZWNpZmllZCBlbGVtZW50XG4gICAgICovXG4gICAgc2V0KGVsZW1lbnQ6IEVsZW1lbnQsIHRyaWdnZXJzOiBzdHJpbmdbXSk6IEFkZEV2ZW50TGlzdGVuZXJPcHRpb25zIHtcbiAgICAgICAgaWYgKCF0aGlzW3RyaWdnZXJNYXBTeW1dLmhhcyhlbGVtZW50KSkgeyB0aGlzW2VsZW1lbnRDb3VudFN5bV0rKzsgfVxuICAgICAgICB0aGlzW3RyaWdnZXJNYXBTeW1dLnNldChlbGVtZW50LCB0cmlnZ2Vycyk7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCByZWdpc3RlcmVkIGV2ZW50IGxpc3RlbmVycy5cbiAgICAgKi9cbiAgICByZXNldCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXNbZWxlbWVudENvdW50U3ltXSA8PSAwKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBkb2N1bWVudC5ib2R5LnF1ZXJ5U2VsZWN0b3JBbGwoJyonKSkge1xuICAgICAgICAgICAgaWYgKHRoaXNbZWxlbWVudENvdW50U3ltXSA8PSAwKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjb25zdCB0cmlnZ2VycyA9IHRoaXNbdHJpZ2dlck1hcFN5bV0uZ2V0KGVsZW1lbnQpO1xuICAgICAgICAgICAgaWYgKHRyaWdnZXJzICE9IG51bGwpIHsgdGhpc1tlbGVtZW50Q291bnRTeW1dLS07IH1cblxuICAgICAgICAgICAgZm9yIChjb25zdCB0cmlnZ2VyIG9mIHRyaWdnZXJzIHx8IFtdKVxuICAgICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0cmlnZ2VyLCBvbldNTFRyaWdnZXJlZCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzW3RyaWdnZXJNYXBTeW1dID0gbmV3IFdlYWtNYXAoKTtcbiAgICAgICAgdGhpc1tlbGVtZW50Q291bnRTeW1dID0gMDtcbiAgICB9XG59XG5cbmNvbnN0IHRyaWdnZXJSZWdpc3RyeSA9IGNhbkFib3J0TGlzdGVuZXJzKCkgPyBuZXcgQWJvcnRDb250cm9sbGVyUmVnaXN0cnkoKSA6IG5ldyBXZWFrTWFwUmVnaXN0cnkoKTtcblxuLyoqXG4gKiBBZGRzIGV2ZW50IGxpc3RlbmVycyB0byB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuXG4gKi9cbmZ1bmN0aW9uIGFkZFdNTExpc3RlbmVycyhlbGVtZW50OiBFbGVtZW50KTogdm9pZCB7XG4gICAgY29uc3QgdHJpZ2dlclJlZ0V4cCA9IC9cXFMrL2c7XG4gICAgY29uc3QgdHJpZ2dlckF0dHIgPSAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3dtbC10cmlnZ2VyJykgfHwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtd21sLXRyaWdnZXInKSB8fCBcImNsaWNrXCIpO1xuICAgIGNvbnN0IHRyaWdnZXJzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgbGV0IG1hdGNoO1xuICAgIHdoaWxlICgobWF0Y2ggPSB0cmlnZ2VyUmVnRXhwLmV4ZWModHJpZ2dlckF0dHIpKSAhPT0gbnVsbClcbiAgICAgICAgdHJpZ2dlcnMucHVzaChtYXRjaFswXSk7XG5cbiAgICBjb25zdCBvcHRpb25zID0gdHJpZ2dlclJlZ2lzdHJ5LnNldChlbGVtZW50LCB0cmlnZ2Vycyk7XG4gICAgZm9yIChjb25zdCB0cmlnZ2VyIG9mIHRyaWdnZXJzKVxuICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIodHJpZ2dlciwgb25XTUxUcmlnZ2VyZWQsIG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIFNjaGVkdWxlcyBhbiBhdXRvbWF0aWMgcmVsb2FkIG9mIFdNTCB0byBiZSBwZXJmb3JtZWQgYXMgc29vbiBhcyB0aGUgZG9jdW1lbnQgaXMgZnVsbHkgbG9hZGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gRW5hYmxlKCk6IHZvaWQge1xuICAgIHdoZW5SZWFkeShSZWxvYWQpO1xufVxuXG4vKipcbiAqIFJlbG9hZHMgdGhlIFdNTCBwYWdlIGJ5IGFkZGluZyBuZWNlc3NhcnkgZXZlbnQgbGlzdGVuZXJzIGFuZCBicm93c2VyIGxpc3RlbmVycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFJlbG9hZCgpOiB2b2lkIHtcbiAgICB0cmlnZ2VyUmVnaXN0cnkucmVzZXQoKTtcbiAgICBkb2N1bWVudC5ib2R5LnF1ZXJ5U2VsZWN0b3JBbGwoJ1t3bWwtZXZlbnRdLCBbd21sLXdpbmRvd10sIFt3bWwtb3BlbnVybF0sIFtkYXRhLXdtbC1ldmVudF0sIFtkYXRhLXdtbC13aW5kb3ddLCBbZGF0YS13bWwtb3BlbnVybF0nKS5mb3JFYWNoKGFkZFdNTExpc3RlbmVycyk7XG59XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbmltcG9ydCB7IG5ld1J1bnRpbWVDYWxsZXIsIG9iamVjdE5hbWVzIH0gZnJvbSBcIi4vcnVudGltZS5qc1wiO1xuXG5jb25zdCBjYWxsID0gbmV3UnVudGltZUNhbGxlcihvYmplY3ROYW1lcy5Ccm93c2VyKTtcblxuY29uc3QgQnJvd3Nlck9wZW5VUkwgPSAwO1xuXG4vKipcbiAqIE9wZW4gYSBicm93c2VyIHdpbmRvdyB0byB0aGUgZ2l2ZW4gVVJMLlxuICpcbiAqIEBwYXJhbSB1cmwgLSBUaGUgVVJMIHRvIG9wZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE9wZW5VUkwodXJsOiBzdHJpbmcgfCBVUkwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gY2FsbChCcm93c2VyT3BlblVSTCwge3VybDogdXJsLnRvU3RyaW5nKCl9KTtcbn1cbiIsICIvLyBTb3VyY2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9haS9uYW5vaWRcblxuLy8gVGhlIE1JVCBMaWNlbnNlIChNSVQpXG4vL1xuLy8gQ29weXJpZ2h0IDIwMTcgQW5kcmV5IFNpdG5payA8YW5kcmV5QHNpdG5pay5ydT5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mXG4vLyB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluXG4vLyB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvXG4vLyB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZlxuLy8gdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLFxuLy8gICAgIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vICAgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbi8vIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gICAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTXG4vLyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1Jcbi8vIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUlxuLy8gSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU5cbi8vIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIFRoaXMgYWxwaGFiZXQgdXNlcyBgQS1aYS16MC05Xy1gIHN5bWJvbHMuXG4vLyBUaGUgb3JkZXIgb2YgY2hhcmFjdGVycyBpcyBvcHRpbWl6ZWQgZm9yIGJldHRlciBnemlwIGFuZCBicm90bGkgY29tcHJlc3Npb24uXG4vLyBSZWZlcmVuY2VzIHRvIHRoZSBzYW1lIGZpbGUgKHdvcmtzIGJvdGggZm9yIGd6aXAgYW5kIGJyb3RsaSk6XG4vLyBgJ3VzZWAsIGBhbmRvbWAsIGFuZCBgcmljdCdgXG4vLyBSZWZlcmVuY2VzIHRvIHRoZSBicm90bGkgZGVmYXVsdCBkaWN0aW9uYXJ5OlxuLy8gYC0yNlRgLCBgMTk4M2AsIGA0MHB4YCwgYDc1cHhgLCBgYnVzaGAsIGBqYWNrYCwgYG1pbmRgLCBgdmVyeWAsIGFuZCBgd29sZmBcbmNvbnN0IHVybEFscGhhYmV0ID1cbiAgICAndXNlYW5kb20tMjZUMTk4MzQwUFg3NXB4SkFDS1ZFUllNSU5EQlVTSFdPTEZfR1FaYmZnaGprbHF2d3l6cmljdCdcblxuZXhwb3J0IGZ1bmN0aW9uIG5hbm9pZChzaXplOiBudW1iZXIgPSAyMSk6IHN0cmluZyB7XG4gICAgbGV0IGlkID0gJydcbiAgICAvLyBBIGNvbXBhY3QgYWx0ZXJuYXRpdmUgZm9yIGBmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXA7IGkrKylgLlxuICAgIGxldCBpID0gc2l6ZSB8IDBcbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgIC8vIGB8IDBgIGlzIG1vcmUgY29tcGFjdCBhbmQgZmFzdGVyIHRoYW4gYE1hdGguZmxvb3IoKWAuXG4gICAgICAgIGlkICs9IHVybEFscGhhYmV0WyhNYXRoLnJhbmRvbSgpICogNjQpIHwgMF1cbiAgICB9XG4gICAgcmV0dXJuIGlkXG59XG4iLCAiLypcbiBfICAgICBfXyAgICAgXyBfX1xufCB8ICAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbmltcG9ydCB7IG5hbm9pZCB9IGZyb20gJy4vbmFub2lkLmpzJztcblxuY29uc3QgcnVudGltZVVSTCA9IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4gKyBcIi93YWlscy9ydW50aW1lXCI7XG5cbi8vIE9iamVjdCBOYW1lc1xuZXhwb3J0IGNvbnN0IG9iamVjdE5hbWVzID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgQ2FsbDogMCxcbiAgICBDbGlwYm9hcmQ6IDEsXG4gICAgQXBwbGljYXRpb246IDIsXG4gICAgRXZlbnRzOiAzLFxuICAgIENvbnRleHRNZW51OiA0LFxuICAgIERpYWxvZzogNSxcbiAgICBXaW5kb3c6IDYsXG4gICAgU2NyZWVuczogNyxcbiAgICBTeXN0ZW06IDgsXG4gICAgQnJvd3NlcjogOSxcbiAgICBDYW5jZWxDYWxsOiAxMCxcbn0pO1xuZXhwb3J0IGxldCBjbGllbnRJZCA9IG5hbm9pZCgpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgcnVudGltZSBjYWxsZXIgd2l0aCBzcGVjaWZpZWQgSUQuXG4gKlxuICogQHBhcmFtIG9iamVjdCAtIFRoZSBvYmplY3QgdG8gaW52b2tlIHRoZSBtZXRob2Qgb24uXG4gKiBAcGFyYW0gd2luZG93TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB3aW5kb3cuXG4gKiBAcmV0dXJuIFRoZSBuZXcgcnVudGltZSBjYWxsZXIgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuZXdSdW50aW1lQ2FsbGVyKG9iamVjdDogbnVtYmVyLCB3aW5kb3dOYW1lOiBzdHJpbmcgPSAnJykge1xuICAgIHJldHVybiBmdW5jdGlvbiAobWV0aG9kOiBudW1iZXIsIGFyZ3M6IGFueSA9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHJ1bnRpbWVDYWxsV2l0aElEKG9iamVjdCwgbWV0aG9kLCB3aW5kb3dOYW1lLCBhcmdzKTtcbiAgICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW50aW1lQ2FsbFdpdGhJRChvYmplY3RJRDogbnVtYmVyLCBtZXRob2Q6IG51bWJlciwgd2luZG93TmFtZTogc3RyaW5nLCBhcmdzOiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgIGxldCB1cmwgPSBuZXcgVVJMKHJ1bnRpbWVVUkwpO1xuICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKFwib2JqZWN0XCIsIG9iamVjdElELnRvU3RyaW5nKCkpO1xuICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKFwibWV0aG9kXCIsIG1ldGhvZC50b1N0cmluZygpKTtcbiAgICBpZiAoYXJncykgeyB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChcImFyZ3NcIiwgSlNPTi5zdHJpbmdpZnkoYXJncykpOyB9XG5cbiAgICBsZXQgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgW1wieC13YWlscy1jbGllbnQtaWRcIl06IGNsaWVudElkXG4gICAgfVxuICAgIGlmICh3aW5kb3dOYW1lKSB7XG4gICAgICAgIGhlYWRlcnNbXCJ4LXdhaWxzLXdpbmRvdy1uYW1lXCJdID0gd2luZG93TmFtZTtcbiAgICB9XG5cbiAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHsgaGVhZGVycyB9KTtcbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihhd2FpdCByZXNwb25zZS50ZXh0KCkpO1xuICAgIH1cblxuICAgIGlmICgocmVzcG9uc2UuaGVhZGVycy5nZXQoXCJDb250ZW50LVR5cGVcIik/LmluZGV4T2YoXCJhcHBsaWNhdGlvbi9qc29uXCIpID8/IC0xKSAhPT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcmVzcG9uc2UudGV4dCgpO1xuICAgIH1cbn1cbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuaW1wb3J0IHtuZXdSdW50aW1lQ2FsbGVyLCBvYmplY3ROYW1lc30gZnJvbSBcIi4vcnVudGltZS5qc1wiO1xuaW1wb3J0IHsgbmFub2lkIH0gZnJvbSAnLi9uYW5vaWQuanMnO1xuXG4vLyBzZXR1cFxud2luZG93Ll93YWlscyA9IHdpbmRvdy5fd2FpbHMgfHwge307XG53aW5kb3cuX3dhaWxzLmRpYWxvZ0Vycm9yQ2FsbGJhY2sgPSBkaWFsb2dFcnJvckNhbGxiYWNrO1xud2luZG93Ll93YWlscy5kaWFsb2dSZXN1bHRDYWxsYmFjayA9IGRpYWxvZ1Jlc3VsdENhbGxiYWNrO1xuXG50eXBlIFByb21pc2VSZXNvbHZlcnMgPSBPbWl0PFByb21pc2VXaXRoUmVzb2x2ZXJzPGFueT4sIFwicHJvbWlzZVwiPjtcblxuY29uc3QgY2FsbCA9IG5ld1J1bnRpbWVDYWxsZXIob2JqZWN0TmFtZXMuRGlhbG9nKTtcbmNvbnN0IGRpYWxvZ1Jlc3BvbnNlcyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlUmVzb2x2ZXJzPigpO1xuXG4vLyBEZWZpbmUgY29uc3RhbnRzIGZyb20gdGhlIGBtZXRob2RzYCBvYmplY3QgaW4gVGl0bGUgQ2FzZVxuY29uc3QgRGlhbG9nSW5mbyA9IDA7XG5jb25zdCBEaWFsb2dXYXJuaW5nID0gMTtcbmNvbnN0IERpYWxvZ0Vycm9yID0gMjtcbmNvbnN0IERpYWxvZ1F1ZXN0aW9uID0gMztcbmNvbnN0IERpYWxvZ09wZW5GaWxlID0gNDtcbmNvbnN0IERpYWxvZ1NhdmVGaWxlID0gNTtcblxuZXhwb3J0IGludGVyZmFjZSBPcGVuRmlsZURpYWxvZ09wdGlvbnMge1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgZGlyZWN0b3JpZXMgY2FuIGJlIGNob3Nlbi4gKi9cbiAgICBDYW5DaG9vc2VEaXJlY3Rvcmllcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBmaWxlcyBjYW4gYmUgY2hvc2VuLiAqL1xuICAgIENhbkNob29zZUZpbGVzPzogYm9vbGVhbjtcbiAgICAvKiogSW5kaWNhdGVzIGlmIGRpcmVjdG9yaWVzIGNhbiBiZSBjcmVhdGVkLiAqL1xuICAgIENhbkNyZWF0ZURpcmVjdG9yaWVzPzogYm9vbGVhbjtcbiAgICAvKiogSW5kaWNhdGVzIGlmIGhpZGRlbiBmaWxlcyBzaG91bGQgYmUgc2hvd24uICovXG4gICAgU2hvd0hpZGRlbkZpbGVzPzogYm9vbGVhbjtcbiAgICAvKiogSW5kaWNhdGVzIGlmIGFsaWFzZXMgc2hvdWxkIGJlIHJlc29sdmVkLiAqL1xuICAgIFJlc29sdmVzQWxpYXNlcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBtdWx0aXBsZSBzZWxlY3Rpb24gaXMgYWxsb3dlZC4gKi9cbiAgICBBbGxvd3NNdWx0aXBsZVNlbGVjdGlvbj86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiB0aGUgZXh0ZW5zaW9uIHNob3VsZCBiZSBoaWRkZW4uICovXG4gICAgSGlkZUV4dGVuc2lvbj86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBoaWRkZW4gZXh0ZW5zaW9ucyBjYW4gYmUgc2VsZWN0ZWQuICovXG4gICAgQ2FuU2VsZWN0SGlkZGVuRXh0ZW5zaW9uPzogYm9vbGVhbjtcbiAgICAvKiogSW5kaWNhdGVzIGlmIGZpbGUgcGFja2FnZXMgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgZGlyZWN0b3JpZXMuICovXG4gICAgVHJlYXRzRmlsZVBhY2thZ2VzQXNEaXJlY3Rvcmllcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBvdGhlciBmaWxlIHR5cGVzIGFyZSBhbGxvd2VkLiAqL1xuICAgIEFsbG93c090aGVyRmlsZXR5cGVzPzogYm9vbGVhbjtcbiAgICAvKiogQXJyYXkgb2YgZmlsZSBmaWx0ZXJzLiAqL1xuICAgIEZpbHRlcnM/OiBGaWxlRmlsdGVyW107XG4gICAgLyoqIFRpdGxlIG9mIHRoZSBkaWFsb2cuICovXG4gICAgVGl0bGU/OiBzdHJpbmc7XG4gICAgLyoqIE1lc3NhZ2UgdG8gc2hvdyBpbiB0aGUgZGlhbG9nLiAqL1xuICAgIE1lc3NhZ2U/OiBzdHJpbmc7XG4gICAgLyoqIFRleHQgdG8gZGlzcGxheSBvbiB0aGUgYnV0dG9uLiAqL1xuICAgIEJ1dHRvblRleHQ/OiBzdHJpbmc7XG4gICAgLyoqIERpcmVjdG9yeSB0byBvcGVuIGluIHRoZSBkaWFsb2cuICovXG4gICAgRGlyZWN0b3J5Pzogc3RyaW5nO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgdGhlIGRpYWxvZyBzaG91bGQgYXBwZWFyIGRldGFjaGVkIGZyb20gdGhlIG1haW4gd2luZG93LiAqL1xuICAgIERldGFjaGVkPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTYXZlRmlsZURpYWxvZ09wdGlvbnMge1xuICAgIC8qKiBEZWZhdWx0IGZpbGVuYW1lIHRvIHVzZSBpbiB0aGUgZGlhbG9nLiAqL1xuICAgIEZpbGVuYW1lPzogc3RyaW5nO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgZGlyZWN0b3JpZXMgY2FuIGJlIGNob3Nlbi4gKi9cbiAgICBDYW5DaG9vc2VEaXJlY3Rvcmllcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBmaWxlcyBjYW4gYmUgY2hvc2VuLiAqL1xuICAgIENhbkNob29zZUZpbGVzPzogYm9vbGVhbjtcbiAgICAvKiogSW5kaWNhdGVzIGlmIGRpcmVjdG9yaWVzIGNhbiBiZSBjcmVhdGVkLiAqL1xuICAgIENhbkNyZWF0ZURpcmVjdG9yaWVzPzogYm9vbGVhbjtcbiAgICAvKiogSW5kaWNhdGVzIGlmIGhpZGRlbiBmaWxlcyBzaG91bGQgYmUgc2hvd24uICovXG4gICAgU2hvd0hpZGRlbkZpbGVzPzogYm9vbGVhbjtcbiAgICAvKiogSW5kaWNhdGVzIGlmIGFsaWFzZXMgc2hvdWxkIGJlIHJlc29sdmVkLiAqL1xuICAgIFJlc29sdmVzQWxpYXNlcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiB0aGUgZXh0ZW5zaW9uIHNob3VsZCBiZSBoaWRkZW4uICovXG4gICAgSGlkZUV4dGVuc2lvbj86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBoaWRkZW4gZXh0ZW5zaW9ucyBjYW4gYmUgc2VsZWN0ZWQuICovXG4gICAgQ2FuU2VsZWN0SGlkZGVuRXh0ZW5zaW9uPzogYm9vbGVhbjtcbiAgICAvKiogSW5kaWNhdGVzIGlmIGZpbGUgcGFja2FnZXMgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgZGlyZWN0b3JpZXMuICovXG4gICAgVHJlYXRzRmlsZVBhY2thZ2VzQXNEaXJlY3Rvcmllcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBvdGhlciBmaWxlIHR5cGVzIGFyZSBhbGxvd2VkLiAqL1xuICAgIEFsbG93c090aGVyRmlsZXR5cGVzPzogYm9vbGVhbjtcbiAgICAvKiogQXJyYXkgb2YgZmlsZSBmaWx0ZXJzLiAqL1xuICAgIEZpbHRlcnM/OiBGaWxlRmlsdGVyW107XG4gICAgLyoqIFRpdGxlIG9mIHRoZSBkaWFsb2cuICovXG4gICAgVGl0bGU/OiBzdHJpbmc7XG4gICAgLyoqIE1lc3NhZ2UgdG8gc2hvdyBpbiB0aGUgZGlhbG9nLiAqL1xuICAgIE1lc3NhZ2U/OiBzdHJpbmc7XG4gICAgLyoqIFRleHQgdG8gZGlzcGxheSBvbiB0aGUgYnV0dG9uLiAqL1xuICAgIEJ1dHRvblRleHQ/OiBzdHJpbmc7XG4gICAgLyoqIERpcmVjdG9yeSB0byBvcGVuIGluIHRoZSBkaWFsb2cuICovXG4gICAgRGlyZWN0b3J5Pzogc3RyaW5nO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgdGhlIGRpYWxvZyBzaG91bGQgYXBwZWFyIGRldGFjaGVkIGZyb20gdGhlIG1haW4gd2luZG93LiAqL1xuICAgIERldGFjaGVkPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNZXNzYWdlRGlhbG9nT3B0aW9ucyB7XG4gICAgLyoqIFRoZSB0aXRsZSBvZiB0aGUgZGlhbG9nIHdpbmRvdy4gKi9cbiAgICBUaXRsZT86IHN0cmluZztcbiAgICAvKiogVGhlIG1haW4gbWVzc2FnZSB0byBzaG93IGluIHRoZSBkaWFsb2cuICovXG4gICAgTWVzc2FnZT86IHN0cmluZztcbiAgICAvKiogQXJyYXkgb2YgYnV0dG9uIG9wdGlvbnMgdG8gc2hvdyBpbiB0aGUgZGlhbG9nLiAqL1xuICAgIEJ1dHRvbnM/OiBCdXR0b25bXTtcbiAgICAvKiogVHJ1ZSBpZiB0aGUgZGlhbG9nIHNob3VsZCBhcHBlYXIgZGV0YWNoZWQgZnJvbSB0aGUgbWFpbiB3aW5kb3cgKGlmIGFwcGxpY2FibGUpLiAqL1xuICAgIERldGFjaGVkPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCdXR0b24ge1xuICAgIC8qKiBUZXh0IHRoYXQgYXBwZWFycyB3aXRoaW4gdGhlIGJ1dHRvbi4gKi9cbiAgICBMYWJlbD86IHN0cmluZztcbiAgICAvKiogVHJ1ZSBpZiB0aGUgYnV0dG9uIHNob3VsZCBjYW5jZWwgYW4gb3BlcmF0aW9uIHdoZW4gY2xpY2tlZC4gKi9cbiAgICBJc0NhbmNlbD86IGJvb2xlYW47XG4gICAgLyoqIFRydWUgaWYgdGhlIGJ1dHRvbiBzaG91bGQgYmUgdGhlIGRlZmF1bHQgYWN0aW9uIHdoZW4gdGhlIHVzZXIgcHJlc3NlcyBlbnRlci4gKi9cbiAgICBJc0RlZmF1bHQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVGaWx0ZXIge1xuICAgIC8qKiBEaXNwbGF5IG5hbWUgZm9yIHRoZSBmaWx0ZXIsIGl0IGNvdWxkIGJlIFwiVGV4dCBGaWxlc1wiLCBcIkltYWdlc1wiIGV0Yy4gKi9cbiAgICBEaXNwbGF5TmFtZT86IHN0cmluZztcbiAgICAvKiogUGF0dGVybiB0byBtYXRjaCBmb3IgdGhlIGZpbHRlciwgZS5nLiBcIioudHh0OyoubWRcIiBmb3IgdGV4dCBtYXJrZG93biBmaWxlcy4gKi9cbiAgICBQYXR0ZXJuPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEhhbmRsZXMgdGhlIHJlc3VsdCBvZiBhIGRpYWxvZyByZXF1ZXN0LlxuICpcbiAqIEBwYXJhbSBpZCAtIFRoZSBpZCBvZiB0aGUgcmVxdWVzdCB0byBoYW5kbGUgdGhlIHJlc3VsdCBmb3IuXG4gKiBAcGFyYW0gZGF0YSAtIFRoZSByZXN1bHQgZGF0YSBvZiB0aGUgcmVxdWVzdC5cbiAqIEBwYXJhbSBpc0pTT04gLSBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZGF0YSBpcyBKU09OIG9yIG5vdC5cbiAqL1xuZnVuY3Rpb24gZGlhbG9nUmVzdWx0Q2FsbGJhY2soaWQ6IHN0cmluZywgZGF0YTogc3RyaW5nLCBpc0pTT046IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBsZXQgcmVzb2x2ZXJzID0gZ2V0QW5kRGVsZXRlUmVzcG9uc2UoaWQpO1xuICAgIGlmICghcmVzb2x2ZXJzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaXNKU09OKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXNvbHZlcnMucmVzb2x2ZShKU09OLnBhcnNlKGRhdGEpKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgICAgIHJlc29sdmVycy5yZWplY3QobmV3IFR5cGVFcnJvcihcImNvdWxkIG5vdCBwYXJzZSByZXN1bHQ6IFwiICsgZXJyLm1lc3NhZ2UsIHsgY2F1c2U6IGVyciB9KSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICByZXNvbHZlcnMucmVzb2x2ZShkYXRhKTtcbiAgICB9XG59XG5cbi8qKlxuICogSGFuZGxlcyB0aGUgZXJyb3IgZnJvbSBhIGRpYWxvZyByZXF1ZXN0LlxuICpcbiAqIEBwYXJhbSBpZCAtIFRoZSBpZCBvZiB0aGUgcHJvbWlzZSBoYW5kbGVyLlxuICogQHBhcmFtIG1lc3NhZ2UgLSBBbiBlcnJvciBtZXNzYWdlLlxuICovXG5mdW5jdGlvbiBkaWFsb2dFcnJvckNhbGxiYWNrKGlkOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgIGdldEFuZERlbGV0ZVJlc3BvbnNlKGlkKT8ucmVqZWN0KG5ldyB3aW5kb3cuRXJyb3IobWVzc2FnZSkpO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyBhbmQgcmVtb3ZlcyB0aGUgcmVzcG9uc2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBJRCBmcm9tIHRoZSBkaWFsb2dSZXNwb25zZXMgbWFwLlxuICpcbiAqIEBwYXJhbSBpZCAtIFRoZSBJRCBvZiB0aGUgcmVzcG9uc2UgdG8gYmUgcmV0cmlldmVkIGFuZCByZW1vdmVkLlxuICogQHJldHVybnMgVGhlIHJlc3BvbnNlIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIElELCBpZiBhbnkuXG4gKi9cbmZ1bmN0aW9uIGdldEFuZERlbGV0ZVJlc3BvbnNlKGlkOiBzdHJpbmcpOiBQcm9taXNlUmVzb2x2ZXJzIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZXNwb25zZSA9IGRpYWxvZ1Jlc3BvbnNlcy5nZXQoaWQpO1xuICAgIGRpYWxvZ1Jlc3BvbnNlcy5kZWxldGUoaWQpO1xuICAgIHJldHVybiByZXNwb25zZTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSB1bmlxdWUgSUQgdXNpbmcgdGhlIG5hbm9pZCBsaWJyYXJ5LlxuICpcbiAqIEByZXR1cm5zIEEgdW5pcXVlIElEIHRoYXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGRpYWxvZ1Jlc3BvbnNlcyBzZXQuXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlSUQoKTogc3RyaW5nIHtcbiAgICBsZXQgcmVzdWx0O1xuICAgIGRvIHtcbiAgICAgICAgcmVzdWx0ID0gbmFub2lkKCk7XG4gICAgfSB3aGlsZSAoZGlhbG9nUmVzcG9uc2VzLmhhcyhyZXN1bHQpKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFByZXNlbnRzIGEgZGlhbG9nIG9mIHNwZWNpZmllZCB0eXBlIHdpdGggdGhlIGdpdmVuIG9wdGlvbnMuXG4gKlxuICogQHBhcmFtIHR5cGUgLSBEaWFsb2cgdHlwZS5cbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyBmb3IgdGhlIGRpYWxvZy5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggcmVzdWx0IG9mIGRpYWxvZy5cbiAqL1xuZnVuY3Rpb24gZGlhbG9nKHR5cGU6IG51bWJlciwgb3B0aW9uczogTWVzc2FnZURpYWxvZ09wdGlvbnMgfCBPcGVuRmlsZURpYWxvZ09wdGlvbnMgfCBTYXZlRmlsZURpYWxvZ09wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgaWQgPSBnZW5lcmF0ZUlEKCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgZGlhbG9nUmVzcG9uc2VzLnNldChpZCwgeyByZXNvbHZlLCByZWplY3QgfSk7XG4gICAgICAgIGNhbGwodHlwZSwgT2JqZWN0LmFzc2lnbih7IFwiZGlhbG9nLWlkXCI6IGlkIH0sIG9wdGlvbnMpKS5jYXRjaCgoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGRpYWxvZ1Jlc3BvbnNlcy5kZWxldGUoaWQpO1xuICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIFByZXNlbnRzIGFuIGluZm8gZGlhbG9nLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gRGlhbG9nIG9wdGlvbnNcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGxhYmVsIG9mIHRoZSBjaG9zZW4gYnV0dG9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSW5mbyhvcHRpb25zOiBNZXNzYWdlRGlhbG9nT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7IHJldHVybiBkaWFsb2coRGlhbG9nSW5mbywgb3B0aW9ucyk7IH1cblxuLyoqXG4gKiBQcmVzZW50cyBhIHdhcm5pbmcgZGlhbG9nLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gRGlhbG9nIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBsYWJlbCBvZiB0aGUgY2hvc2VuIGJ1dHRvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFdhcm5pbmcob3B0aW9uczogTWVzc2FnZURpYWxvZ09wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4geyByZXR1cm4gZGlhbG9nKERpYWxvZ1dhcm5pbmcsIG9wdGlvbnMpOyB9XG5cbi8qKlxuICogUHJlc2VudHMgYW4gZXJyb3IgZGlhbG9nLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gRGlhbG9nIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBsYWJlbCBvZiB0aGUgY2hvc2VuIGJ1dHRvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEVycm9yKG9wdGlvbnM6IE1lc3NhZ2VEaWFsb2dPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHsgcmV0dXJuIGRpYWxvZyhEaWFsb2dFcnJvciwgb3B0aW9ucyk7IH1cblxuLyoqXG4gKiBQcmVzZW50cyBhIHF1ZXN0aW9uIGRpYWxvZy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIERpYWxvZyBvcHRpb25zLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgbGFiZWwgb2YgdGhlIGNob3NlbiBidXR0b24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBRdWVzdGlvbihvcHRpb25zOiBNZXNzYWdlRGlhbG9nT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7IHJldHVybiBkaWFsb2coRGlhbG9nUXVlc3Rpb24sIG9wdGlvbnMpOyB9XG5cbi8qKlxuICogUHJlc2VudHMgYSBmaWxlIHNlbGVjdGlvbiBkaWFsb2cgdG8gcGljayBvbmUgb3IgbW9yZSBmaWxlcyB0byBvcGVuLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gRGlhbG9nIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBTZWxlY3RlZCBmaWxlIG9yIGxpc3Qgb2YgZmlsZXMsIG9yIGEgYmxhbmsgc3RyaW5nL2VtcHR5IGxpc3QgaWYgbm8gZmlsZSBoYXMgYmVlbiBzZWxlY3RlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE9wZW5GaWxlKG9wdGlvbnM6IE9wZW5GaWxlRGlhbG9nT3B0aW9ucyAmIHsgQWxsb3dzTXVsdGlwbGVTZWxlY3Rpb246IHRydWUgfSk6IFByb21pc2U8c3RyaW5nW10+O1xuZXhwb3J0IGZ1bmN0aW9uIE9wZW5GaWxlKG9wdGlvbnM6IE9wZW5GaWxlRGlhbG9nT3B0aW9ucyAmIHsgQWxsb3dzTXVsdGlwbGVTZWxlY3Rpb24/OiBmYWxzZSB8IHVuZGVmaW5lZCB9KTogUHJvbWlzZTxzdHJpbmc+O1xuZXhwb3J0IGZ1bmN0aW9uIE9wZW5GaWxlKG9wdGlvbnM6IE9wZW5GaWxlRGlhbG9nT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nIHwgc3RyaW5nW10+O1xuZXhwb3J0IGZ1bmN0aW9uIE9wZW5GaWxlKG9wdGlvbnM6IE9wZW5GaWxlRGlhbG9nT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nIHwgc3RyaW5nW10+IHsgcmV0dXJuIGRpYWxvZyhEaWFsb2dPcGVuRmlsZSwgb3B0aW9ucykgPz8gW107IH1cblxuLyoqXG4gKiBQcmVzZW50cyBhIGZpbGUgc2VsZWN0aW9uIGRpYWxvZyB0byBwaWNrIGEgZmlsZSB0byBzYXZlLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gRGlhbG9nIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBTZWxlY3RlZCBmaWxlLCBvciBhIGJsYW5rIHN0cmluZyBpZiBubyBmaWxlIGhhcyBiZWVuIHNlbGVjdGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gU2F2ZUZpbGUob3B0aW9uczogU2F2ZUZpbGVEaWFsb2dPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHsgcmV0dXJuIGRpYWxvZyhEaWFsb2dTYXZlRmlsZSwgb3B0aW9ucyk7IH1cbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuaW1wb3J0IHsgbmV3UnVudGltZUNhbGxlciwgb2JqZWN0TmFtZXMgfSBmcm9tIFwiLi9ydW50aW1lLmpzXCI7XG5pbXBvcnQgeyBldmVudExpc3RlbmVycywgTGlzdGVuZXIsIGxpc3RlbmVyT2ZmIH0gZnJvbSBcIi4vbGlzdGVuZXIuanNcIjtcblxuLy8gU2V0dXBcbndpbmRvdy5fd2FpbHMgPSB3aW5kb3cuX3dhaWxzIHx8IHt9O1xud2luZG93Ll93YWlscy5kaXNwYXRjaFdhaWxzRXZlbnQgPSBkaXNwYXRjaFdhaWxzRXZlbnQ7XG5cbmNvbnN0IGNhbGwgPSBuZXdSdW50aW1lQ2FsbGVyKG9iamVjdE5hbWVzLkV2ZW50cyk7XG5jb25zdCBFbWl0TWV0aG9kID0gMDtcblxuZXhwb3J0IHsgVHlwZXMgfSBmcm9tIFwiLi9ldmVudF90eXBlcy5qc1wiO1xuXG4vKipcbiAqIFRoZSB0eXBlIG9mIGhhbmRsZXJzIGZvciBhIGdpdmVuIGV2ZW50LlxuICovXG5leHBvcnQgdHlwZSBDYWxsYmFjayA9IChldjogV2FpbHNFdmVudCkgPT4gdm9pZDtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgc3lzdGVtIGV2ZW50IG9yIGEgY3VzdG9tIGV2ZW50IGVtaXR0ZWQgdGhyb3VnaCB3YWlscy1wcm92aWRlZCBmYWNpbGl0aWVzLlxuICovXG5leHBvcnQgY2xhc3MgV2FpbHNFdmVudCB7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIE9wdGlvbmFsIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbWl0dGVkIGV2ZW50LlxuICAgICAqL1xuICAgIGRhdGE6IGFueTtcblxuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgdGhlIG9yaWdpbmF0aW5nIHdpbmRvdy4gT21pdHRlZCBmb3IgYXBwbGljYXRpb24gZXZlbnRzLlxuICAgICAqIFdpbGwgYmUgb3ZlcnJpZGRlbiBpZiBzZXQgbWFudWFsbHkuXG4gICAgICovXG4gICAgc2VuZGVyPzogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCBkYXRhOiBhbnkgPSBudWxsKSB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkaXNwYXRjaFdhaWxzRXZlbnQoZXZlbnQ6IGFueSkge1xuICAgIGxldCBsaXN0ZW5lcnMgPSBldmVudExpc3RlbmVycy5nZXQoZXZlbnQubmFtZSk7XG4gICAgaWYgKCFsaXN0ZW5lcnMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCB3YWlsc0V2ZW50ID0gbmV3IFdhaWxzRXZlbnQoZXZlbnQubmFtZSwgZXZlbnQuZGF0YSk7XG4gICAgaWYgKCdzZW5kZXInIGluIGV2ZW50KSB7XG4gICAgICAgIHdhaWxzRXZlbnQuc2VuZGVyID0gZXZlbnQuc2VuZGVyO1xuICAgIH1cblxuICAgIGxpc3RlbmVycyA9IGxpc3RlbmVycy5maWx0ZXIobGlzdGVuZXIgPT4gIWxpc3RlbmVyLmRpc3BhdGNoKHdhaWxzRXZlbnQpKTtcbiAgICBpZiAobGlzdGVuZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBldmVudExpc3RlbmVycy5kZWxldGUoZXZlbnQubmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZXZlbnRMaXN0ZW5lcnMuc2V0KGV2ZW50Lm5hbWUsIGxpc3RlbmVycyk7XG4gICAgfVxufVxuXG4vKipcbiAqIFJlZ2lzdGVyIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGZvciBhIHNwZWNpZmljIGV2ZW50LlxuICpcbiAqIEBwYXJhbSBldmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gcmVnaXN0ZXIgdGhlIGNhbGxiYWNrIGZvci5cbiAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlxuICogQHBhcmFtIG1heENhbGxiYWNrcyAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0aW1lcyB0aGUgY2FsbGJhY2sgY2FuIGJlIGNhbGxlZCBmb3IgdGhlIGV2ZW50LiBPbmNlIHRoZSBtYXhpbXVtIG51bWJlciBpcyByZWFjaGVkLCB0aGUgY2FsbGJhY2sgd2lsbCBubyBsb25nZXIgYmUgY2FsbGVkLlxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0LCB3aGVuIGNhbGxlZCwgd2lsbCB1bnJlZ2lzdGVyIHRoZSBjYWxsYmFjayBmcm9tIHRoZSBldmVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE9uTXVsdGlwbGUoZXZlbnROYW1lOiBzdHJpbmcsIGNhbGxiYWNrOiBDYWxsYmFjaywgbWF4Q2FsbGJhY2tzOiBudW1iZXIpIHtcbiAgICBsZXQgbGlzdGVuZXJzID0gZXZlbnRMaXN0ZW5lcnMuZ2V0KGV2ZW50TmFtZSkgfHwgW107XG4gICAgY29uc3QgdGhpc0xpc3RlbmVyID0gbmV3IExpc3RlbmVyKGV2ZW50TmFtZSwgY2FsbGJhY2ssIG1heENhbGxiYWNrcyk7XG4gICAgbGlzdGVuZXJzLnB1c2godGhpc0xpc3RlbmVyKTtcbiAgICBldmVudExpc3RlbmVycy5zZXQoZXZlbnROYW1lLCBsaXN0ZW5lcnMpO1xuICAgIHJldHVybiAoKSA9PiBsaXN0ZW5lck9mZih0aGlzTGlzdGVuZXIpO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIHNwZWNpZmllZCBldmVudCBvY2N1cnMuXG4gKlxuICogQHBhcmFtIGV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudCB0byByZWdpc3RlciB0aGUgY2FsbGJhY2sgZm9yLlxuICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQsIHdoZW4gY2FsbGVkLCB3aWxsIHVucmVnaXN0ZXIgdGhlIGNhbGxiYWNrIGZyb20gdGhlIGV2ZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gT24oZXZlbnROYW1lOiBzdHJpbmcsIGNhbGxiYWNrOiBDYWxsYmFjayk6ICgpID0+IHZvaWQge1xuICAgIHJldHVybiBPbk11bHRpcGxlKGV2ZW50TmFtZSwgY2FsbGJhY2ssIC0xKTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBvbmx5IG9uY2UgZm9yIHRoZSBzcGVjaWZpZWQgZXZlbnQuXG4gKlxuICogQHBhcmFtIGV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudCB0byByZWdpc3RlciB0aGUgY2FsbGJhY2sgZm9yLlxuICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQsIHdoZW4gY2FsbGVkLCB3aWxsIHVucmVnaXN0ZXIgdGhlIGNhbGxiYWNrIGZyb20gdGhlIGV2ZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gT25jZShldmVudE5hbWU6IHN0cmluZywgY2FsbGJhY2s6IENhbGxiYWNrKTogKCkgPT4gdm9pZCB7XG4gICAgcmV0dXJuIE9uTXVsdGlwbGUoZXZlbnROYW1lLCBjYWxsYmFjaywgMSk7XG59XG5cbi8qKlxuICogUmVtb3ZlcyBldmVudCBsaXN0ZW5lcnMgZm9yIHRoZSBzcGVjaWZpZWQgZXZlbnQgbmFtZXMuXG4gKlxuICogQHBhcmFtIGV2ZW50TmFtZXMgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnRzIHRvIHJlbW92ZSBsaXN0ZW5lcnMgZm9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gT2ZmKC4uLmV2ZW50TmFtZXM6IFtzdHJpbmcsIC4uLnN0cmluZ1tdXSk6IHZvaWQge1xuICAgIGV2ZW50TmFtZXMuZm9yRWFjaChldmVudE5hbWUgPT4gZXZlbnRMaXN0ZW5lcnMuZGVsZXRlKGV2ZW50TmFtZSkpO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgYWxsIGV2ZW50IGxpc3RlbmVycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE9mZkFsbCgpOiB2b2lkIHtcbiAgICBldmVudExpc3RlbmVycy5jbGVhcigpO1xufVxuXG4vKipcbiAqIEVtaXRzIHRoZSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0gZXZlbnQgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gZW1pdC5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgZnVsZmlsbGVkIG9uY2UgdGhlIGV2ZW50IGhhcyBiZWVuIGVtaXR0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFbWl0KGV2ZW50OiBXYWlsc0V2ZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIGNhbGwoRW1pdE1ldGhvZCwgZXZlbnQpO1xufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vLyBUaGUgZm9sbG93aW5nIHV0aWxpdGllcyBoYXZlIGJlZW4gZmFjdG9yZWQgb3V0IG9mIC4vZXZlbnRzLnRzXG4vLyBmb3IgdGVzdGluZyBwdXJwb3Nlcy5cblxuZXhwb3J0IGNvbnN0IGV2ZW50TGlzdGVuZXJzID0gbmV3IE1hcDxzdHJpbmcsIExpc3RlbmVyW10+KCk7XG5cbmV4cG9ydCBjbGFzcyBMaXN0ZW5lciB7XG4gICAgZXZlbnROYW1lOiBzdHJpbmc7XG4gICAgY2FsbGJhY2s6IChkYXRhOiBhbnkpID0+IHZvaWQ7XG4gICAgbWF4Q2FsbGJhY2tzOiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvcihldmVudE5hbWU6IHN0cmluZywgY2FsbGJhY2s6IChkYXRhOiBhbnkpID0+IHZvaWQsIG1heENhbGxiYWNrczogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuZXZlbnROYW1lID0gZXZlbnROYW1lO1xuICAgICAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgICAgIHRoaXMubWF4Q2FsbGJhY2tzID0gbWF4Q2FsbGJhY2tzIHx8IC0xO1xuICAgIH1cblxuICAgIGRpc3BhdGNoKGRhdGE6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5jYWxsYmFjayhkYXRhKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5tYXhDYWxsYmFja3MgPT09IC0xKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMubWF4Q2FsbGJhY2tzIC09IDE7XG4gICAgICAgIHJldHVybiB0aGlzLm1heENhbGxiYWNrcyA9PT0gMDtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsaXN0ZW5lck9mZihsaXN0ZW5lcjogTGlzdGVuZXIpOiB2b2lkIHtcbiAgICBsZXQgbGlzdGVuZXJzID0gZXZlbnRMaXN0ZW5lcnMuZ2V0KGxpc3RlbmVyLmV2ZW50TmFtZSk7XG4gICAgaWYgKCFsaXN0ZW5lcnMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxpc3RlbmVycyA9IGxpc3RlbmVycy5maWx0ZXIobCA9PiBsICE9PSBsaXN0ZW5lcik7XG4gICAgaWYgKGxpc3RlbmVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZXZlbnRMaXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyLmV2ZW50TmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZXZlbnRMaXN0ZW5lcnMuc2V0KGxpc3RlbmVyLmV2ZW50TmFtZSwgbGlzdGVuZXJzKTtcbiAgICB9XG59XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbi8vIEN5bmh5cmNod3lkIHkgZmZlaWwgaG9uIHluIGF3dG9tYXRpZy4gUEVJRElXQ0ggXHUwMEMyIE1PRElXTFxuLy8gVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkLiBETyBOT1QgRURJVFxuXG5leHBvcnQgY29uc3QgVHlwZXMgPSBPYmplY3QuZnJlZXplKHtcblx0V2luZG93czogT2JqZWN0LmZyZWV6ZSh7XG5cdFx0QVBNUG93ZXJTZXR0aW5nQ2hhbmdlOiBcIndpbmRvd3M6QVBNUG93ZXJTZXR0aW5nQ2hhbmdlXCIsXG5cdFx0QVBNUG93ZXJTdGF0dXNDaGFuZ2U6IFwid2luZG93czpBUE1Qb3dlclN0YXR1c0NoYW5nZVwiLFxuXHRcdEFQTVJlc3VtZUF1dG9tYXRpYzogXCJ3aW5kb3dzOkFQTVJlc3VtZUF1dG9tYXRpY1wiLFxuXHRcdEFQTVJlc3VtZVN1c3BlbmQ6IFwid2luZG93czpBUE1SZXN1bWVTdXNwZW5kXCIsXG5cdFx0QVBNU3VzcGVuZDogXCJ3aW5kb3dzOkFQTVN1c3BlbmRcIixcblx0XHRBcHBsaWNhdGlvblN0YXJ0ZWQ6IFwid2luZG93czpBcHBsaWNhdGlvblN0YXJ0ZWRcIixcblx0XHRTeXN0ZW1UaGVtZUNoYW5nZWQ6IFwid2luZG93czpTeXN0ZW1UaGVtZUNoYW5nZWRcIixcblx0XHRXZWJWaWV3TmF2aWdhdGlvbkNvbXBsZXRlZDogXCJ3aW5kb3dzOldlYlZpZXdOYXZpZ2F0aW9uQ29tcGxldGVkXCIsXG5cdFx0V2luZG93QWN0aXZlOiBcIndpbmRvd3M6V2luZG93QWN0aXZlXCIsXG5cdFx0V2luZG93QmFja2dyb3VuZEVyYXNlOiBcIndpbmRvd3M6V2luZG93QmFja2dyb3VuZEVyYXNlXCIsXG5cdFx0V2luZG93Q2xpY2tBY3RpdmU6IFwid2luZG93czpXaW5kb3dDbGlja0FjdGl2ZVwiLFxuXHRcdFdpbmRvd0Nsb3Npbmc6IFwid2luZG93czpXaW5kb3dDbG9zaW5nXCIsXG5cdFx0V2luZG93RGlkTW92ZTogXCJ3aW5kb3dzOldpbmRvd0RpZE1vdmVcIixcblx0XHRXaW5kb3dEaWRSZXNpemU6IFwid2luZG93czpXaW5kb3dEaWRSZXNpemVcIixcblx0XHRXaW5kb3dEUElDaGFuZ2VkOiBcIndpbmRvd3M6V2luZG93RFBJQ2hhbmdlZFwiLFxuXHRcdFdpbmRvd0RyYWdEcm9wOiBcIndpbmRvd3M6V2luZG93RHJhZ0Ryb3BcIixcblx0XHRXaW5kb3dEcmFnRW50ZXI6IFwid2luZG93czpXaW5kb3dEcmFnRW50ZXJcIixcblx0XHRXaW5kb3dEcmFnTGVhdmU6IFwid2luZG93czpXaW5kb3dEcmFnTGVhdmVcIixcblx0XHRXaW5kb3dEcmFnT3ZlcjogXCJ3aW5kb3dzOldpbmRvd0RyYWdPdmVyXCIsXG5cdFx0V2luZG93RW5kTW92ZTogXCJ3aW5kb3dzOldpbmRvd0VuZE1vdmVcIixcblx0XHRXaW5kb3dFbmRSZXNpemU6IFwid2luZG93czpXaW5kb3dFbmRSZXNpemVcIixcblx0XHRXaW5kb3dGdWxsc2NyZWVuOiBcIndpbmRvd3M6V2luZG93RnVsbHNjcmVlblwiLFxuXHRcdFdpbmRvd0hpZGU6IFwid2luZG93czpXaW5kb3dIaWRlXCIsXG5cdFx0V2luZG93SW5hY3RpdmU6IFwid2luZG93czpXaW5kb3dJbmFjdGl2ZVwiLFxuXHRcdFdpbmRvd0tleURvd246IFwid2luZG93czpXaW5kb3dLZXlEb3duXCIsXG5cdFx0V2luZG93S2V5VXA6IFwid2luZG93czpXaW5kb3dLZXlVcFwiLFxuXHRcdFdpbmRvd0tpbGxGb2N1czogXCJ3aW5kb3dzOldpbmRvd0tpbGxGb2N1c1wiLFxuXHRcdFdpbmRvd05vbkNsaWVudEhpdDogXCJ3aW5kb3dzOldpbmRvd05vbkNsaWVudEhpdFwiLFxuXHRcdFdpbmRvd05vbkNsaWVudE1vdXNlRG93bjogXCJ3aW5kb3dzOldpbmRvd05vbkNsaWVudE1vdXNlRG93blwiLFxuXHRcdFdpbmRvd05vbkNsaWVudE1vdXNlTGVhdmU6IFwid2luZG93czpXaW5kb3dOb25DbGllbnRNb3VzZUxlYXZlXCIsXG5cdFx0V2luZG93Tm9uQ2xpZW50TW91c2VNb3ZlOiBcIndpbmRvd3M6V2luZG93Tm9uQ2xpZW50TW91c2VNb3ZlXCIsXG5cdFx0V2luZG93Tm9uQ2xpZW50TW91c2VVcDogXCJ3aW5kb3dzOldpbmRvd05vbkNsaWVudE1vdXNlVXBcIixcblx0XHRXaW5kb3dQYWludDogXCJ3aW5kb3dzOldpbmRvd1BhaW50XCIsXG5cdFx0V2luZG93UmVzdG9yZTogXCJ3aW5kb3dzOldpbmRvd1Jlc3RvcmVcIixcblx0XHRXaW5kb3dTZXRGb2N1czogXCJ3aW5kb3dzOldpbmRvd1NldEZvY3VzXCIsXG5cdFx0V2luZG93U2hvdzogXCJ3aW5kb3dzOldpbmRvd1Nob3dcIixcblx0XHRXaW5kb3dTdGFydE1vdmU6IFwid2luZG93czpXaW5kb3dTdGFydE1vdmVcIixcblx0XHRXaW5kb3dTdGFydFJlc2l6ZTogXCJ3aW5kb3dzOldpbmRvd1N0YXJ0UmVzaXplXCIsXG5cdFx0V2luZG93VW5GdWxsc2NyZWVuOiBcIndpbmRvd3M6V2luZG93VW5GdWxsc2NyZWVuXCIsXG5cdFx0V2luZG93Wk9yZGVyQ2hhbmdlZDogXCJ3aW5kb3dzOldpbmRvd1pPcmRlckNoYW5nZWRcIixcblx0XHRXaW5kb3dNaW5pbWlzZTogXCJ3aW5kb3dzOldpbmRvd01pbmltaXNlXCIsXG5cdFx0V2luZG93VW5NaW5pbWlzZTogXCJ3aW5kb3dzOldpbmRvd1VuTWluaW1pc2VcIixcblx0XHRXaW5kb3dNYXhpbWlzZTogXCJ3aW5kb3dzOldpbmRvd01heGltaXNlXCIsXG5cdFx0V2luZG93VW5NYXhpbWlzZTogXCJ3aW5kb3dzOldpbmRvd1VuTWF4aW1pc2VcIixcblx0fSksXG5cdE1hYzogT2JqZWN0LmZyZWV6ZSh7XG5cdFx0QXBwbGljYXRpb25EaWRCZWNvbWVBY3RpdmU6IFwibWFjOkFwcGxpY2F0aW9uRGlkQmVjb21lQWN0aXZlXCIsXG5cdFx0QXBwbGljYXRpb25EaWRDaGFuZ2VCYWNraW5nUHJvcGVydGllczogXCJtYWM6QXBwbGljYXRpb25EaWRDaGFuZ2VCYWNraW5nUHJvcGVydGllc1wiLFxuXHRcdEFwcGxpY2F0aW9uRGlkQ2hhbmdlRWZmZWN0aXZlQXBwZWFyYW5jZTogXCJtYWM6QXBwbGljYXRpb25EaWRDaGFuZ2VFZmZlY3RpdmVBcHBlYXJhbmNlXCIsXG5cdFx0QXBwbGljYXRpb25EaWRDaGFuZ2VJY29uOiBcIm1hYzpBcHBsaWNhdGlvbkRpZENoYW5nZUljb25cIixcblx0XHRBcHBsaWNhdGlvbkRpZENoYW5nZU9jY2x1c2lvblN0YXRlOiBcIm1hYzpBcHBsaWNhdGlvbkRpZENoYW5nZU9jY2x1c2lvblN0YXRlXCIsXG5cdFx0QXBwbGljYXRpb25EaWRDaGFuZ2VTY3JlZW5QYXJhbWV0ZXJzOiBcIm1hYzpBcHBsaWNhdGlvbkRpZENoYW5nZVNjcmVlblBhcmFtZXRlcnNcIixcblx0XHRBcHBsaWNhdGlvbkRpZENoYW5nZVN0YXR1c0JhckZyYW1lOiBcIm1hYzpBcHBsaWNhdGlvbkRpZENoYW5nZVN0YXR1c0JhckZyYW1lXCIsXG5cdFx0QXBwbGljYXRpb25EaWRDaGFuZ2VTdGF0dXNCYXJPcmllbnRhdGlvbjogXCJtYWM6QXBwbGljYXRpb25EaWRDaGFuZ2VTdGF0dXNCYXJPcmllbnRhdGlvblwiLFxuXHRcdEFwcGxpY2F0aW9uRGlkQ2hhbmdlVGhlbWU6IFwibWFjOkFwcGxpY2F0aW9uRGlkQ2hhbmdlVGhlbWVcIixcblx0XHRBcHBsaWNhdGlvbkRpZEZpbmlzaExhdW5jaGluZzogXCJtYWM6QXBwbGljYXRpb25EaWRGaW5pc2hMYXVuY2hpbmdcIixcblx0XHRBcHBsaWNhdGlvbkRpZEhpZGU6IFwibWFjOkFwcGxpY2F0aW9uRGlkSGlkZVwiLFxuXHRcdEFwcGxpY2F0aW9uRGlkUmVzaWduQWN0aXZlOiBcIm1hYzpBcHBsaWNhdGlvbkRpZFJlc2lnbkFjdGl2ZVwiLFxuXHRcdEFwcGxpY2F0aW9uRGlkVW5oaWRlOiBcIm1hYzpBcHBsaWNhdGlvbkRpZFVuaGlkZVwiLFxuXHRcdEFwcGxpY2F0aW9uRGlkVXBkYXRlOiBcIm1hYzpBcHBsaWNhdGlvbkRpZFVwZGF0ZVwiLFxuXHRcdEFwcGxpY2F0aW9uU2hvdWxkSGFuZGxlUmVvcGVuOiBcIm1hYzpBcHBsaWNhdGlvblNob3VsZEhhbmRsZVJlb3BlblwiLFxuXHRcdEFwcGxpY2F0aW9uV2lsbEJlY29tZUFjdGl2ZTogXCJtYWM6QXBwbGljYXRpb25XaWxsQmVjb21lQWN0aXZlXCIsXG5cdFx0QXBwbGljYXRpb25XaWxsRmluaXNoTGF1bmNoaW5nOiBcIm1hYzpBcHBsaWNhdGlvbldpbGxGaW5pc2hMYXVuY2hpbmdcIixcblx0XHRBcHBsaWNhdGlvbldpbGxIaWRlOiBcIm1hYzpBcHBsaWNhdGlvbldpbGxIaWRlXCIsXG5cdFx0QXBwbGljYXRpb25XaWxsUmVzaWduQWN0aXZlOiBcIm1hYzpBcHBsaWNhdGlvbldpbGxSZXNpZ25BY3RpdmVcIixcblx0XHRBcHBsaWNhdGlvbldpbGxUZXJtaW5hdGU6IFwibWFjOkFwcGxpY2F0aW9uV2lsbFRlcm1pbmF0ZVwiLFxuXHRcdEFwcGxpY2F0aW9uV2lsbFVuaGlkZTogXCJtYWM6QXBwbGljYXRpb25XaWxsVW5oaWRlXCIsXG5cdFx0QXBwbGljYXRpb25XaWxsVXBkYXRlOiBcIm1hYzpBcHBsaWNhdGlvbldpbGxVcGRhdGVcIixcblx0XHRNZW51RGlkQWRkSXRlbTogXCJtYWM6TWVudURpZEFkZEl0ZW1cIixcblx0XHRNZW51RGlkQmVnaW5UcmFja2luZzogXCJtYWM6TWVudURpZEJlZ2luVHJhY2tpbmdcIixcblx0XHRNZW51RGlkQ2xvc2U6IFwibWFjOk1lbnVEaWRDbG9zZVwiLFxuXHRcdE1lbnVEaWREaXNwbGF5SXRlbTogXCJtYWM6TWVudURpZERpc3BsYXlJdGVtXCIsXG5cdFx0TWVudURpZEVuZFRyYWNraW5nOiBcIm1hYzpNZW51RGlkRW5kVHJhY2tpbmdcIixcblx0XHRNZW51RGlkSGlnaGxpZ2h0SXRlbTogXCJtYWM6TWVudURpZEhpZ2hsaWdodEl0ZW1cIixcblx0XHRNZW51RGlkT3BlbjogXCJtYWM6TWVudURpZE9wZW5cIixcblx0XHRNZW51RGlkUG9wVXA6IFwibWFjOk1lbnVEaWRQb3BVcFwiLFxuXHRcdE1lbnVEaWRSZW1vdmVJdGVtOiBcIm1hYzpNZW51RGlkUmVtb3ZlSXRlbVwiLFxuXHRcdE1lbnVEaWRTZW5kQWN0aW9uOiBcIm1hYzpNZW51RGlkU2VuZEFjdGlvblwiLFxuXHRcdE1lbnVEaWRTZW5kQWN0aW9uVG9JdGVtOiBcIm1hYzpNZW51RGlkU2VuZEFjdGlvblRvSXRlbVwiLFxuXHRcdE1lbnVEaWRVcGRhdGU6IFwibWFjOk1lbnVEaWRVcGRhdGVcIixcblx0XHRNZW51V2lsbEFkZEl0ZW06IFwibWFjOk1lbnVXaWxsQWRkSXRlbVwiLFxuXHRcdE1lbnVXaWxsQmVnaW5UcmFja2luZzogXCJtYWM6TWVudVdpbGxCZWdpblRyYWNraW5nXCIsXG5cdFx0TWVudVdpbGxEaXNwbGF5SXRlbTogXCJtYWM6TWVudVdpbGxEaXNwbGF5SXRlbVwiLFxuXHRcdE1lbnVXaWxsRW5kVHJhY2tpbmc6IFwibWFjOk1lbnVXaWxsRW5kVHJhY2tpbmdcIixcblx0XHRNZW51V2lsbEhpZ2hsaWdodEl0ZW06IFwibWFjOk1lbnVXaWxsSGlnaGxpZ2h0SXRlbVwiLFxuXHRcdE1lbnVXaWxsT3BlbjogXCJtYWM6TWVudVdpbGxPcGVuXCIsXG5cdFx0TWVudVdpbGxQb3BVcDogXCJtYWM6TWVudVdpbGxQb3BVcFwiLFxuXHRcdE1lbnVXaWxsUmVtb3ZlSXRlbTogXCJtYWM6TWVudVdpbGxSZW1vdmVJdGVtXCIsXG5cdFx0TWVudVdpbGxTZW5kQWN0aW9uOiBcIm1hYzpNZW51V2lsbFNlbmRBY3Rpb25cIixcblx0XHRNZW51V2lsbFNlbmRBY3Rpb25Ub0l0ZW06IFwibWFjOk1lbnVXaWxsU2VuZEFjdGlvblRvSXRlbVwiLFxuXHRcdE1lbnVXaWxsVXBkYXRlOiBcIm1hYzpNZW51V2lsbFVwZGF0ZVwiLFxuXHRcdFdlYlZpZXdEaWRDb21taXROYXZpZ2F0aW9uOiBcIm1hYzpXZWJWaWV3RGlkQ29tbWl0TmF2aWdhdGlvblwiLFxuXHRcdFdlYlZpZXdEaWRGaW5pc2hOYXZpZ2F0aW9uOiBcIm1hYzpXZWJWaWV3RGlkRmluaXNoTmF2aWdhdGlvblwiLFxuXHRcdFdlYlZpZXdEaWRSZWNlaXZlU2VydmVyUmVkaXJlY3RGb3JQcm92aXNpb25hbE5hdmlnYXRpb246IFwibWFjOldlYlZpZXdEaWRSZWNlaXZlU2VydmVyUmVkaXJlY3RGb3JQcm92aXNpb25hbE5hdmlnYXRpb25cIixcblx0XHRXZWJWaWV3RGlkU3RhcnRQcm92aXNpb25hbE5hdmlnYXRpb246IFwibWFjOldlYlZpZXdEaWRTdGFydFByb3Zpc2lvbmFsTmF2aWdhdGlvblwiLFxuXHRcdFdpbmRvd0RpZEJlY29tZUtleTogXCJtYWM6V2luZG93RGlkQmVjb21lS2V5XCIsXG5cdFx0V2luZG93RGlkQmVjb21lTWFpbjogXCJtYWM6V2luZG93RGlkQmVjb21lTWFpblwiLFxuXHRcdFdpbmRvd0RpZEJlZ2luU2hlZXQ6IFwibWFjOldpbmRvd0RpZEJlZ2luU2hlZXRcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VBbHBoYTogXCJtYWM6V2luZG93RGlkQ2hhbmdlQWxwaGFcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VCYWNraW5nTG9jYXRpb246IFwibWFjOldpbmRvd0RpZENoYW5nZUJhY2tpbmdMb2NhdGlvblwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZUJhY2tpbmdQcm9wZXJ0aWVzOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VCYWNraW5nUHJvcGVydGllc1wiLFxuXHRcdFdpbmRvd0RpZENoYW5nZUNvbGxlY3Rpb25CZWhhdmlvcjogXCJtYWM6V2luZG93RGlkQ2hhbmdlQ29sbGVjdGlvbkJlaGF2aW9yXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlRWZmZWN0aXZlQXBwZWFyYW5jZTogXCJtYWM6V2luZG93RGlkQ2hhbmdlRWZmZWN0aXZlQXBwZWFyYW5jZVwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZU9jY2x1c2lvblN0YXRlOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VPY2NsdXNpb25TdGF0ZVwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZU9yZGVyaW5nTW9kZTogXCJtYWM6V2luZG93RGlkQ2hhbmdlT3JkZXJpbmdNb2RlXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlU2NyZWVuOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VTY3JlZW5cIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VTY3JlZW5QYXJhbWV0ZXJzOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VTY3JlZW5QYXJhbWV0ZXJzXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlU2NyZWVuUHJvZmlsZTogXCJtYWM6V2luZG93RGlkQ2hhbmdlU2NyZWVuUHJvZmlsZVwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZVNjcmVlblNwYWNlOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VTY3JlZW5TcGFjZVwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZVNjcmVlblNwYWNlUHJvcGVydGllczogXCJtYWM6V2luZG93RGlkQ2hhbmdlU2NyZWVuU3BhY2VQcm9wZXJ0aWVzXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlU2hhcmluZ1R5cGU6IFwibWFjOldpbmRvd0RpZENoYW5nZVNoYXJpbmdUeXBlXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlU3BhY2U6IFwibWFjOldpbmRvd0RpZENoYW5nZVNwYWNlXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlU3BhY2VPcmRlcmluZ01vZGU6IFwibWFjOldpbmRvd0RpZENoYW5nZVNwYWNlT3JkZXJpbmdNb2RlXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlVGl0bGU6IFwibWFjOldpbmRvd0RpZENoYW5nZVRpdGxlXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlVG9vbGJhcjogXCJtYWM6V2luZG93RGlkQ2hhbmdlVG9vbGJhclwiLFxuXHRcdFdpbmRvd0RpZERlbWluaWF0dXJpemU6IFwibWFjOldpbmRvd0RpZERlbWluaWF0dXJpemVcIixcblx0XHRXaW5kb3dEaWRFbmRTaGVldDogXCJtYWM6V2luZG93RGlkRW5kU2hlZXRcIixcblx0XHRXaW5kb3dEaWRFbnRlckZ1bGxTY3JlZW46IFwibWFjOldpbmRvd0RpZEVudGVyRnVsbFNjcmVlblwiLFxuXHRcdFdpbmRvd0RpZEVudGVyVmVyc2lvbkJyb3dzZXI6IFwibWFjOldpbmRvd0RpZEVudGVyVmVyc2lvbkJyb3dzZXJcIixcblx0XHRXaW5kb3dEaWRFeGl0RnVsbFNjcmVlbjogXCJtYWM6V2luZG93RGlkRXhpdEZ1bGxTY3JlZW5cIixcblx0XHRXaW5kb3dEaWRFeGl0VmVyc2lvbkJyb3dzZXI6IFwibWFjOldpbmRvd0RpZEV4aXRWZXJzaW9uQnJvd3NlclwiLFxuXHRcdFdpbmRvd0RpZEV4cG9zZTogXCJtYWM6V2luZG93RGlkRXhwb3NlXCIsXG5cdFx0V2luZG93RGlkRm9jdXM6IFwibWFjOldpbmRvd0RpZEZvY3VzXCIsXG5cdFx0V2luZG93RGlkTWluaWF0dXJpemU6IFwibWFjOldpbmRvd0RpZE1pbmlhdHVyaXplXCIsXG5cdFx0V2luZG93RGlkTW92ZTogXCJtYWM6V2luZG93RGlkTW92ZVwiLFxuXHRcdFdpbmRvd0RpZE9yZGVyT2ZmU2NyZWVuOiBcIm1hYzpXaW5kb3dEaWRPcmRlck9mZlNjcmVlblwiLFxuXHRcdFdpbmRvd0RpZE9yZGVyT25TY3JlZW46IFwibWFjOldpbmRvd0RpZE9yZGVyT25TY3JlZW5cIixcblx0XHRXaW5kb3dEaWRSZXNpZ25LZXk6IFwibWFjOldpbmRvd0RpZFJlc2lnbktleVwiLFxuXHRcdFdpbmRvd0RpZFJlc2lnbk1haW46IFwibWFjOldpbmRvd0RpZFJlc2lnbk1haW5cIixcblx0XHRXaW5kb3dEaWRSZXNpemU6IFwibWFjOldpbmRvd0RpZFJlc2l6ZVwiLFxuXHRcdFdpbmRvd0RpZFVwZGF0ZTogXCJtYWM6V2luZG93RGlkVXBkYXRlXCIsXG5cdFx0V2luZG93RGlkVXBkYXRlQWxwaGE6IFwibWFjOldpbmRvd0RpZFVwZGF0ZUFscGhhXCIsXG5cdFx0V2luZG93RGlkVXBkYXRlQ29sbGVjdGlvbkJlaGF2aW9yOiBcIm1hYzpXaW5kb3dEaWRVcGRhdGVDb2xsZWN0aW9uQmVoYXZpb3JcIixcblx0XHRXaW5kb3dEaWRVcGRhdGVDb2xsZWN0aW9uUHJvcGVydGllczogXCJtYWM6V2luZG93RGlkVXBkYXRlQ29sbGVjdGlvblByb3BlcnRpZXNcIixcblx0XHRXaW5kb3dEaWRVcGRhdGVTaGFkb3c6IFwibWFjOldpbmRvd0RpZFVwZGF0ZVNoYWRvd1wiLFxuXHRcdFdpbmRvd0RpZFVwZGF0ZVRpdGxlOiBcIm1hYzpXaW5kb3dEaWRVcGRhdGVUaXRsZVwiLFxuXHRcdFdpbmRvd0RpZFVwZGF0ZVRvb2xiYXI6IFwibWFjOldpbmRvd0RpZFVwZGF0ZVRvb2xiYXJcIixcblx0XHRXaW5kb3dEaWRab29tOiBcIm1hYzpXaW5kb3dEaWRab29tXCIsXG5cdFx0V2luZG93RmlsZURyYWdnaW5nRW50ZXJlZDogXCJtYWM6V2luZG93RmlsZURyYWdnaW5nRW50ZXJlZFwiLFxuXHRcdFdpbmRvd0ZpbGVEcmFnZ2luZ0V4aXRlZDogXCJtYWM6V2luZG93RmlsZURyYWdnaW5nRXhpdGVkXCIsXG5cdFx0V2luZG93RmlsZURyYWdnaW5nUGVyZm9ybWVkOiBcIm1hYzpXaW5kb3dGaWxlRHJhZ2dpbmdQZXJmb3JtZWRcIixcblx0XHRXaW5kb3dIaWRlOiBcIm1hYzpXaW5kb3dIaWRlXCIsXG5cdFx0V2luZG93TWF4aW1pc2U6IFwibWFjOldpbmRvd01heGltaXNlXCIsXG5cdFx0V2luZG93VW5NYXhpbWlzZTogXCJtYWM6V2luZG93VW5NYXhpbWlzZVwiLFxuXHRcdFdpbmRvd01pbmltaXNlOiBcIm1hYzpXaW5kb3dNaW5pbWlzZVwiLFxuXHRcdFdpbmRvd1VuTWluaW1pc2U6IFwibWFjOldpbmRvd1VuTWluaW1pc2VcIixcblx0XHRXaW5kb3dTaG91bGRDbG9zZTogXCJtYWM6V2luZG93U2hvdWxkQ2xvc2VcIixcblx0XHRXaW5kb3dTaG93OiBcIm1hYzpXaW5kb3dTaG93XCIsXG5cdFx0V2luZG93V2lsbEJlY29tZUtleTogXCJtYWM6V2luZG93V2lsbEJlY29tZUtleVwiLFxuXHRcdFdpbmRvd1dpbGxCZWNvbWVNYWluOiBcIm1hYzpXaW5kb3dXaWxsQmVjb21lTWFpblwiLFxuXHRcdFdpbmRvd1dpbGxCZWdpblNoZWV0OiBcIm1hYzpXaW5kb3dXaWxsQmVnaW5TaGVldFwiLFxuXHRcdFdpbmRvd1dpbGxDaGFuZ2VPcmRlcmluZ01vZGU6IFwibWFjOldpbmRvd1dpbGxDaGFuZ2VPcmRlcmluZ01vZGVcIixcblx0XHRXaW5kb3dXaWxsQ2xvc2U6IFwibWFjOldpbmRvd1dpbGxDbG9zZVwiLFxuXHRcdFdpbmRvd1dpbGxEZW1pbmlhdHVyaXplOiBcIm1hYzpXaW5kb3dXaWxsRGVtaW5pYXR1cml6ZVwiLFxuXHRcdFdpbmRvd1dpbGxFbnRlckZ1bGxTY3JlZW46IFwibWFjOldpbmRvd1dpbGxFbnRlckZ1bGxTY3JlZW5cIixcblx0XHRXaW5kb3dXaWxsRW50ZXJWZXJzaW9uQnJvd3NlcjogXCJtYWM6V2luZG93V2lsbEVudGVyVmVyc2lvbkJyb3dzZXJcIixcblx0XHRXaW5kb3dXaWxsRXhpdEZ1bGxTY3JlZW46IFwibWFjOldpbmRvd1dpbGxFeGl0RnVsbFNjcmVlblwiLFxuXHRcdFdpbmRvd1dpbGxFeGl0VmVyc2lvbkJyb3dzZXI6IFwibWFjOldpbmRvd1dpbGxFeGl0VmVyc2lvbkJyb3dzZXJcIixcblx0XHRXaW5kb3dXaWxsRm9jdXM6IFwibWFjOldpbmRvd1dpbGxGb2N1c1wiLFxuXHRcdFdpbmRvd1dpbGxNaW5pYXR1cml6ZTogXCJtYWM6V2luZG93V2lsbE1pbmlhdHVyaXplXCIsXG5cdFx0V2luZG93V2lsbE1vdmU6IFwibWFjOldpbmRvd1dpbGxNb3ZlXCIsXG5cdFx0V2luZG93V2lsbE9yZGVyT2ZmU2NyZWVuOiBcIm1hYzpXaW5kb3dXaWxsT3JkZXJPZmZTY3JlZW5cIixcblx0XHRXaW5kb3dXaWxsT3JkZXJPblNjcmVlbjogXCJtYWM6V2luZG93V2lsbE9yZGVyT25TY3JlZW5cIixcblx0XHRXaW5kb3dXaWxsUmVzaWduTWFpbjogXCJtYWM6V2luZG93V2lsbFJlc2lnbk1haW5cIixcblx0XHRXaW5kb3dXaWxsUmVzaXplOiBcIm1hYzpXaW5kb3dXaWxsUmVzaXplXCIsXG5cdFx0V2luZG93V2lsbFVuZm9jdXM6IFwibWFjOldpbmRvd1dpbGxVbmZvY3VzXCIsXG5cdFx0V2luZG93V2lsbFVwZGF0ZTogXCJtYWM6V2luZG93V2lsbFVwZGF0ZVwiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGVBbHBoYTogXCJtYWM6V2luZG93V2lsbFVwZGF0ZUFscGhhXCIsXG5cdFx0V2luZG93V2lsbFVwZGF0ZUNvbGxlY3Rpb25CZWhhdmlvcjogXCJtYWM6V2luZG93V2lsbFVwZGF0ZUNvbGxlY3Rpb25CZWhhdmlvclwiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGVDb2xsZWN0aW9uUHJvcGVydGllczogXCJtYWM6V2luZG93V2lsbFVwZGF0ZUNvbGxlY3Rpb25Qcm9wZXJ0aWVzXCIsXG5cdFx0V2luZG93V2lsbFVwZGF0ZVNoYWRvdzogXCJtYWM6V2luZG93V2lsbFVwZGF0ZVNoYWRvd1wiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGVUaXRsZTogXCJtYWM6V2luZG93V2lsbFVwZGF0ZVRpdGxlXCIsXG5cdFx0V2luZG93V2lsbFVwZGF0ZVRvb2xiYXI6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVUb29sYmFyXCIsXG5cdFx0V2luZG93V2lsbFVwZGF0ZVZpc2liaWxpdHk6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVWaXNpYmlsaXR5XCIsXG5cdFx0V2luZG93V2lsbFVzZVN0YW5kYXJkRnJhbWU6IFwibWFjOldpbmRvd1dpbGxVc2VTdGFuZGFyZEZyYW1lXCIsXG5cdFx0V2luZG93Wm9vbUluOiBcIm1hYzpXaW5kb3dab29tSW5cIixcblx0XHRXaW5kb3dab29tT3V0OiBcIm1hYzpXaW5kb3dab29tT3V0XCIsXG5cdFx0V2luZG93Wm9vbVJlc2V0OiBcIm1hYzpXaW5kb3dab29tUmVzZXRcIixcblx0fSksXG5cdExpbnV4OiBPYmplY3QuZnJlZXplKHtcblx0XHRBcHBsaWNhdGlvblN0YXJ0dXA6IFwibGludXg6QXBwbGljYXRpb25TdGFydHVwXCIsXG5cdFx0U3lzdGVtVGhlbWVDaGFuZ2VkOiBcImxpbnV4OlN5c3RlbVRoZW1lQ2hhbmdlZFwiLFxuXHRcdFdpbmRvd0RlbGV0ZUV2ZW50OiBcImxpbnV4OldpbmRvd0RlbGV0ZUV2ZW50XCIsXG5cdFx0V2luZG93RGlkTW92ZTogXCJsaW51eDpXaW5kb3dEaWRNb3ZlXCIsXG5cdFx0V2luZG93RGlkUmVzaXplOiBcImxpbnV4OldpbmRvd0RpZFJlc2l6ZVwiLFxuXHRcdFdpbmRvd0ZvY3VzSW46IFwibGludXg6V2luZG93Rm9jdXNJblwiLFxuXHRcdFdpbmRvd0ZvY3VzT3V0OiBcImxpbnV4OldpbmRvd0ZvY3VzT3V0XCIsXG5cdFx0V2luZG93TG9hZENoYW5nZWQ6IFwibGludXg6V2luZG93TG9hZENoYW5nZWRcIixcblx0fSksXG5cdENvbW1vbjogT2JqZWN0LmZyZWV6ZSh7XG5cdFx0QXBwbGljYXRpb25PcGVuZWRXaXRoRmlsZTogXCJjb21tb246QXBwbGljYXRpb25PcGVuZWRXaXRoRmlsZVwiLFxuXHRcdEFwcGxpY2F0aW9uU3RhcnRlZDogXCJjb21tb246QXBwbGljYXRpb25TdGFydGVkXCIsXG5cdFx0VGhlbWVDaGFuZ2VkOiBcImNvbW1vbjpUaGVtZUNoYW5nZWRcIixcblx0XHRXaW5kb3dDbG9zaW5nOiBcImNvbW1vbjpXaW5kb3dDbG9zaW5nXCIsXG5cdFx0V2luZG93RGlkTW92ZTogXCJjb21tb246V2luZG93RGlkTW92ZVwiLFxuXHRcdFdpbmRvd0RpZFJlc2l6ZTogXCJjb21tb246V2luZG93RGlkUmVzaXplXCIsXG5cdFx0V2luZG93RFBJQ2hhbmdlZDogXCJjb21tb246V2luZG93RFBJQ2hhbmdlZFwiLFxuXHRcdFdpbmRvd0ZpbGVzRHJvcHBlZDogXCJjb21tb246V2luZG93RmlsZXNEcm9wcGVkXCIsXG5cdFx0V2luZG93Rm9jdXM6IFwiY29tbW9uOldpbmRvd0ZvY3VzXCIsXG5cdFx0V2luZG93RnVsbHNjcmVlbjogXCJjb21tb246V2luZG93RnVsbHNjcmVlblwiLFxuXHRcdFdpbmRvd0hpZGU6IFwiY29tbW9uOldpbmRvd0hpZGVcIixcblx0XHRXaW5kb3dMb3N0Rm9jdXM6IFwiY29tbW9uOldpbmRvd0xvc3RGb2N1c1wiLFxuXHRcdFdpbmRvd01heGltaXNlOiBcImNvbW1vbjpXaW5kb3dNYXhpbWlzZVwiLFxuXHRcdFdpbmRvd01pbmltaXNlOiBcImNvbW1vbjpXaW5kb3dNaW5pbWlzZVwiLFxuXHRcdFdpbmRvd1Jlc3RvcmU6IFwiY29tbW9uOldpbmRvd1Jlc3RvcmVcIixcblx0XHRXaW5kb3dSdW50aW1lUmVhZHk6IFwiY29tbW9uOldpbmRvd1J1bnRpbWVSZWFkeVwiLFxuXHRcdFdpbmRvd1Nob3c6IFwiY29tbW9uOldpbmRvd1Nob3dcIixcblx0XHRXaW5kb3dVbkZ1bGxzY3JlZW46IFwiY29tbW9uOldpbmRvd1VuRnVsbHNjcmVlblwiLFxuXHRcdFdpbmRvd1VuTWF4aW1pc2U6IFwiY29tbW9uOldpbmRvd1VuTWF4aW1pc2VcIixcblx0XHRXaW5kb3dVbk1pbmltaXNlOiBcImNvbW1vbjpXaW5kb3dVbk1pbmltaXNlXCIsXG5cdFx0V2luZG93Wm9vbTogXCJjb21tb246V2luZG93Wm9vbVwiLFxuXHRcdFdpbmRvd1pvb21JbjogXCJjb21tb246V2luZG93Wm9vbUluXCIsXG5cdFx0V2luZG93Wm9vbU91dDogXCJjb21tb246V2luZG93Wm9vbU91dFwiLFxuXHRcdFdpbmRvd1pvb21SZXNldDogXCJjb21tb246V2luZG93Wm9vbVJlc2V0XCIsXG5cdH0pLFxufSk7XG4iLCAiLypcbiBfICAgICBfXyAgICAgXyBfX1xufCB8ICAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbi8qKlxuICogTG9ncyBhIG1lc3NhZ2UgdG8gdGhlIGNvbnNvbGUgd2l0aCBjdXN0b20gZm9ybWF0dGluZy5cbiAqXG4gKiBAcGFyYW0gbWVzc2FnZSAtIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlYnVnTG9nKG1lc3NhZ2U6IGFueSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAnJWMgd2FpbHMzICVjICcgKyBtZXNzYWdlICsgJyAnLFxuICAgICAgICAnYmFja2dyb3VuZDogI2FhMDAwMDsgY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDNweCAwcHggMHB4IDNweDsgcGFkZGluZzogMXB4OyBmb250LXNpemU6IDAuN3JlbScsXG4gICAgICAgICdiYWNrZ3JvdW5kOiAjMDA5OTAwOyBjb2xvcjogI2ZmZjsgYm9yZGVyLXJhZGl1czogMHB4IDNweCAzcHggMHB4OyBwYWRkaW5nOiAxcHg7IGZvbnQtc2l6ZTogMC43cmVtJ1xuICAgICk7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIHdlYnZpZXcgc3VwcG9ydHMgdGhlIHtAbGluayBNb3VzZUV2ZW50I2J1dHRvbnN9IHByb3BlcnR5LlxuICogTG9va2luZyBhdCB5b3UgbWFjT1MgSGlnaCBTaWVycmEhXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYW5UcmFja0J1dHRvbnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChuZXcgTW91c2VFdmVudCgnbW91c2Vkb3duJykpLmJ1dHRvbnMgPT09IDA7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIGJyb3dzZXIgc3VwcG9ydHMgcmVtb3ZpbmcgbGlzdGVuZXJzIGJ5IHRyaWdnZXJpbmcgYW4gQWJvcnRTaWduYWxcbiAqIChzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0V2ZW50VGFyZ2V0L2FkZEV2ZW50TGlzdGVuZXIjc2lnbmFsKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbkFib3J0TGlzdGVuZXJzKCkge1xuICAgIGlmICghRXZlbnRUYXJnZXQgfHwgIUFib3J0U2lnbmFsIHx8ICFBYm9ydENvbnRyb2xsZXIpXG4gICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIGxldCByZXN1bHQgPSB0cnVlO1xuXG4gICAgY29uc3QgdGFyZ2V0ID0gbmV3IEV2ZW50VGFyZ2V0KCk7XG4gICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigndGVzdCcsICgpID0+IHsgcmVzdWx0ID0gZmFsc2U7IH0sIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9KTtcbiAgICBjb250cm9sbGVyLmFib3J0KCk7XG4gICAgdGFyZ2V0LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCd0ZXN0JykpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqKlxuIFRoaXMgdGVjaG5pcXVlIGZvciBwcm9wZXIgbG9hZCBkZXRlY3Rpb24gaXMgdGFrZW4gZnJvbSBIVE1YOlxuXG4gQlNEIDItQ2xhdXNlIExpY2Vuc2VcblxuIENvcHlyaWdodCAoYykgMjAyMCwgQmlnIFNreSBTb2Z0d2FyZVxuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cbiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcblxuIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuXG4gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb25cbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cblxuIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4gQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEVcbiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTFxuIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SXG4gU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVJcbiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLFxuIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFXG4gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cblxuICoqKi9cblxubGV0IGlzUmVhZHkgPSBmYWxzZTtcbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB7IGlzUmVhZHkgPSB0cnVlIH0pO1xuXG5leHBvcnQgZnVuY3Rpb24gd2hlblJlYWR5KGNhbGxiYWNrOiAoKSA9PiB2b2lkKSB7XG4gICAgaWYgKGlzUmVhZHkgfHwgZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJykge1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBjYWxsYmFjayk7XG4gICAgfVxufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5pbXBvcnQge25ld1J1bnRpbWVDYWxsZXIsIG9iamVjdE5hbWVzfSBmcm9tIFwiLi9ydW50aW1lLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNjcmVlbiB9IGZyb20gXCIuL3NjcmVlbnMuanNcIjtcblxuY29uc3QgUG9zaXRpb25NZXRob2QgICAgICAgICAgICAgICAgICAgID0gMDtcbmNvbnN0IENlbnRlck1ldGhvZCAgICAgICAgICAgICAgICAgICAgICA9IDE7XG5jb25zdCBDbG9zZU1ldGhvZCAgICAgICAgICAgICAgICAgICAgICAgPSAyO1xuY29uc3QgRGlzYWJsZVNpemVDb25zdHJhaW50c01ldGhvZCAgICAgID0gMztcbmNvbnN0IEVuYWJsZVNpemVDb25zdHJhaW50c01ldGhvZCAgICAgICA9IDQ7XG5jb25zdCBGb2N1c01ldGhvZCAgICAgICAgICAgICAgICAgICAgICAgPSA1O1xuY29uc3QgRm9yY2VSZWxvYWRNZXRob2QgICAgICAgICAgICAgICAgID0gNjtcbmNvbnN0IEZ1bGxzY3JlZW5NZXRob2QgICAgICAgICAgICAgICAgICA9IDc7XG5jb25zdCBHZXRTY3JlZW5NZXRob2QgICAgICAgICAgICAgICAgICAgPSA4O1xuY29uc3QgR2V0Wm9vbU1ldGhvZCAgICAgICAgICAgICAgICAgICAgID0gOTtcbmNvbnN0IEhlaWdodE1ldGhvZCAgICAgICAgICAgICAgICAgICAgICA9IDEwO1xuY29uc3QgSGlkZU1ldGhvZCAgICAgICAgICAgICAgICAgICAgICAgID0gMTE7XG5jb25zdCBJc0ZvY3VzZWRNZXRob2QgICAgICAgICAgICAgICAgICAgPSAxMjtcbmNvbnN0IElzRnVsbHNjcmVlbk1ldGhvZCAgICAgICAgICAgICAgICA9IDEzO1xuY29uc3QgSXNNYXhpbWlzZWRNZXRob2QgICAgICAgICAgICAgICAgID0gMTQ7XG5jb25zdCBJc01pbmltaXNlZE1ldGhvZCAgICAgICAgICAgICAgICAgPSAxNTtcbmNvbnN0IE1heGltaXNlTWV0aG9kICAgICAgICAgICAgICAgICAgICA9IDE2O1xuY29uc3QgTWluaW1pc2VNZXRob2QgICAgICAgICAgICAgICAgICAgID0gMTc7XG5jb25zdCBOYW1lTWV0aG9kICAgICAgICAgICAgICAgICAgICAgICAgPSAxODtcbmNvbnN0IE9wZW5EZXZUb29sc01ldGhvZCAgICAgICAgICAgICAgICA9IDE5O1xuY29uc3QgUmVsYXRpdmVQb3NpdGlvbk1ldGhvZCAgICAgICAgICAgID0gMjA7XG5jb25zdCBSZWxvYWRNZXRob2QgICAgICAgICAgICAgICAgICAgICAgPSAyMTtcbmNvbnN0IFJlc2l6YWJsZU1ldGhvZCAgICAgICAgICAgICAgICAgICA9IDIyO1xuY29uc3QgUmVzdG9yZU1ldGhvZCAgICAgICAgICAgICAgICAgICAgID0gMjM7XG5jb25zdCBTZXRQb3NpdGlvbk1ldGhvZCAgICAgICAgICAgICAgICAgPSAyNDtcbmNvbnN0IFNldEFsd2F5c09uVG9wTWV0aG9kICAgICAgICAgICAgICA9IDI1O1xuY29uc3QgU2V0QmFja2dyb3VuZENvbG91ck1ldGhvZCAgICAgICAgID0gMjY7XG5jb25zdCBTZXRGcmFtZWxlc3NNZXRob2QgICAgICAgICAgICAgICAgPSAyNztcbmNvbnN0IFNldEZ1bGxzY3JlZW5CdXR0b25FbmFibGVkTWV0aG9kICA9IDI4O1xuY29uc3QgU2V0TWF4U2l6ZU1ldGhvZCAgICAgICAgICAgICAgICAgID0gMjk7XG5jb25zdCBTZXRNaW5TaXplTWV0aG9kICAgICAgICAgICAgICAgICAgPSAzMDtcbmNvbnN0IFNldFJlbGF0aXZlUG9zaXRpb25NZXRob2QgICAgICAgICA9IDMxO1xuY29uc3QgU2V0UmVzaXphYmxlTWV0aG9kICAgICAgICAgICAgICAgID0gMzI7XG5jb25zdCBTZXRTaXplTWV0aG9kICAgICAgICAgICAgICAgICAgICAgPSAzMztcbmNvbnN0IFNldFRpdGxlTWV0aG9kICAgICAgICAgICAgICAgICAgICA9IDM0O1xuY29uc3QgU2V0Wm9vbU1ldGhvZCAgICAgICAgICAgICAgICAgICAgID0gMzU7XG5jb25zdCBTaG93TWV0aG9kICAgICAgICAgICAgICAgICAgICAgICAgPSAzNjtcbmNvbnN0IFNpemVNZXRob2QgICAgICAgICAgICAgICAgICAgICAgICA9IDM3O1xuY29uc3QgVG9nZ2xlRnVsbHNjcmVlbk1ldGhvZCAgICAgICAgICAgID0gMzg7XG5jb25zdCBUb2dnbGVNYXhpbWlzZU1ldGhvZCAgICAgICAgICAgICAgPSAzOTtcbmNvbnN0IFVuRnVsbHNjcmVlbk1ldGhvZCAgICAgICAgICAgICAgICA9IDQwO1xuY29uc3QgVW5NYXhpbWlzZU1ldGhvZCAgICAgICAgICAgICAgICAgID0gNDE7XG5jb25zdCBVbk1pbmltaXNlTWV0aG9kICAgICAgICAgICAgICAgICAgPSA0MjtcbmNvbnN0IFdpZHRoTWV0aG9kICAgICAgICAgICAgICAgICAgICAgICA9IDQzO1xuY29uc3QgWm9vbU1ldGhvZCAgICAgICAgICAgICAgICAgICAgICAgID0gNDQ7XG5jb25zdCBab29tSW5NZXRob2QgICAgICAgICAgICAgICAgICAgICAgPSA0NTtcbmNvbnN0IFpvb21PdXRNZXRob2QgICAgICAgICAgICAgICAgICAgICA9IDQ2O1xuY29uc3QgWm9vbVJlc2V0TWV0aG9kICAgICAgICAgICAgICAgICAgID0gNDc7XG5cbi8qKlxuICogQSByZWNvcmQgZGVzY3JpYmluZyB0aGUgcG9zaXRpb24gb2YgYSB3aW5kb3cuXG4gKi9cbmludGVyZmFjZSBQb3NpdGlvbiB7XG4gICAgLyoqIFRoZSBob3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoZSB3aW5kb3cuICovXG4gICAgeDogbnVtYmVyO1xuICAgIC8qKiBUaGUgdmVydGljYWwgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy4gKi9cbiAgICB5OiBudW1iZXI7XG59XG5cbi8qKlxuICogQSByZWNvcmQgZGVzY3JpYmluZyB0aGUgc2l6ZSBvZiBhIHdpbmRvdy5cbiAqL1xuaW50ZXJmYWNlIFNpemUge1xuICAgIC8qKiBUaGUgd2lkdGggb2YgdGhlIHdpbmRvdy4gKi9cbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIC8qKiBUaGUgaGVpZ2h0IG9mIHRoZSB3aW5kb3cuICovXG4gICAgaGVpZ2h0OiBudW1iZXI7XG59XG5cbi8vIFByaXZhdGUgZmllbGQgbmFtZXMuXG5jb25zdCBjYWxsZXJTeW0gPSBTeW1ib2woXCJjYWxsZXJcIik7XG5cbmNsYXNzIFdpbmRvdyB7XG4gICAgLy8gUHJpdmF0ZSBmaWVsZHMuXG4gICAgcHJpdmF0ZSBbY2FsbGVyU3ltXTogKG1lc3NhZ2U6IG51bWJlciwgYXJncz86IGFueSkgPT4gUHJvbWlzZTxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGlzZXMgYSB3aW5kb3cgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YXJnZXQgd2luZG93LlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZyA9ICcnKSB7XG4gICAgICAgIHRoaXNbY2FsbGVyU3ltXSA9IG5ld1J1bnRpbWVDYWxsZXIob2JqZWN0TmFtZXMuV2luZG93LCBuYW1lKVxuXG4gICAgICAgIC8vIGJpbmQgaW5zdGFuY2UgbWV0aG9kIHRvIG1ha2UgdGhlbSBlYXNpbHkgdXNhYmxlIGluIGV2ZW50IGhhbmRsZXJzXG4gICAgICAgIGZvciAoY29uc3QgbWV0aG9kIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKFdpbmRvdy5wcm90b3R5cGUpKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgbWV0aG9kICE9PSBcImNvbnN0cnVjdG9yXCJcbiAgICAgICAgICAgICAgICAmJiB0eXBlb2YgKHRoaXMgYXMgYW55KVttZXRob2RdID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICh0aGlzIGFzIGFueSlbbWV0aG9kXSA9ICh0aGlzIGFzIGFueSlbbWV0aG9kXS5iaW5kKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgc3BlY2lmaWVkIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHdpbmRvdyB0byBnZXQuXG4gICAgICogQHJldHVybnMgVGhlIGNvcnJlc3BvbmRpbmcgd2luZG93IG9iamVjdC5cbiAgICAgKi9cbiAgICBHZXQobmFtZTogc3RyaW5nKTogV2luZG93IHtcbiAgICAgICAgcmV0dXJuIG5ldyBXaW5kb3cobmFtZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IGFic29sdXRlIHBvc2l0aW9uIG9mIHRoZSB3aW5kb3cuXG4gICAgICovXG4gICAgUG9zaXRpb24oKTogUHJvbWlzZTxQb3NpdGlvbj4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFBvc2l0aW9uTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDZW50ZXJzIHRoZSB3aW5kb3cgb24gdGhlIHNjcmVlbi5cbiAgICAgKi9cbiAgICBDZW50ZXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oQ2VudGVyTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBDbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShDbG9zZU1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZXMgbWluL21heCBzaXplIGNvbnN0cmFpbnRzLlxuICAgICAqL1xuICAgIERpc2FibGVTaXplQ29uc3RyYWludHMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oRGlzYWJsZVNpemVDb25zdHJhaW50c01ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyBtaW4vbWF4IHNpemUgY29uc3RyYWludHMuXG4gICAgICovXG4gICAgRW5hYmxlU2l6ZUNvbnN0cmFpbnRzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEVuYWJsZVNpemVDb25zdHJhaW50c01ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9jdXNlcyB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIEZvY3VzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEZvY3VzTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JjZXMgdGhlIHdpbmRvdyB0byByZWxvYWQgdGhlIHBhZ2UgYXNzZXRzLlxuICAgICAqL1xuICAgIEZvcmNlUmVsb2FkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEZvcmNlUmVsb2FkTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTd2l0Y2hlcyB0aGUgd2luZG93IHRvIGZ1bGxzY3JlZW4gbW9kZS5cbiAgICAgKi9cbiAgICBGdWxsc2NyZWVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEZ1bGxzY3JlZW5NZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHNjcmVlbiB0aGF0IHRoZSB3aW5kb3cgaXMgb24uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgc2NyZWVuIHRoZSB3aW5kb3cgaXMgY3VycmVudGx5IG9uLlxuICAgICAqL1xuICAgIEdldFNjcmVlbigpOiBQcm9taXNlPFNjcmVlbj4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEdldFNjcmVlbk1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudCB6b29tIGxldmVsIG9mIHRoZSB3aW5kb3cuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCB6b29tIGxldmVsLlxuICAgICAqL1xuICAgIEdldFpvb20oKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShHZXRab29tTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBoZWlnaHQgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IGhlaWdodCBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIEhlaWdodCgpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEhlaWdodE1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGlkZXMgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBIaWRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEhpZGVNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgd2luZG93IGlzIGZvY3VzZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSB3aW5kb3cgaXMgY3VycmVudGx5IGZvY3VzZWQuXG4gICAgICovXG4gICAgSXNGb2N1c2VkKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKElzRm9jdXNlZE1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB3aW5kb3cgaXMgZnVsbHNjcmVlbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIHdpbmRvdyBpcyBjdXJyZW50bHkgZnVsbHNjcmVlbi5cbiAgICAgKi9cbiAgICBJc0Z1bGxzY3JlZW4oKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oSXNGdWxsc2NyZWVuTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHdpbmRvdyBpcyBtYXhpbWlzZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSB3aW5kb3cgaXMgY3VycmVudGx5IG1heGltaXNlZC5cbiAgICAgKi9cbiAgICBJc01heGltaXNlZCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShJc01heGltaXNlZE1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB3aW5kb3cgaXMgbWluaW1pc2VkLlxuICAgICAqXG4gICAgICogQHJldHVybnMgV2hldGhlciB0aGUgd2luZG93IGlzIGN1cnJlbnRseSBtaW5pbWlzZWQuXG4gICAgICovXG4gICAgSXNNaW5pbWlzZWQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oSXNNaW5pbWlzZWRNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1heGltaXNlcyB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIE1heGltaXNlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKE1heGltaXNlTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNaW5pbWlzZXMgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBNaW5pbWlzZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShNaW5pbWlzZU1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgd2luZG93LlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIG5hbWUgb2YgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBOYW1lKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oTmFtZU1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3BlbnMgdGhlIGRldmVsb3BtZW50IHRvb2xzIHBhbmUuXG4gICAgICovXG4gICAgT3BlbkRldlRvb2xzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKE9wZW5EZXZUb29sc01ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcmVsYXRpdmUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdyB0byB0aGUgc2NyZWVuLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIGN1cnJlbnQgcmVsYXRpdmUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBSZWxhdGl2ZVBvc2l0aW9uKCk6IFByb21pc2U8UG9zaXRpb24+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShSZWxhdGl2ZVBvc2l0aW9uTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWxvYWRzIHRoZSBwYWdlIGFzc2V0cy5cbiAgICAgKi9cbiAgICBSZWxvYWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oUmVsb2FkTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHdpbmRvdyBpcyByZXNpemFibGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSB3aW5kb3cgaXMgY3VycmVudGx5IHJlc2l6YWJsZS5cbiAgICAgKi9cbiAgICBSZXNpemFibGUoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oUmVzaXphYmxlTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXN0b3JlcyB0aGUgd2luZG93IHRvIGl0cyBwcmV2aW91cyBzdGF0ZSBpZiBpdCB3YXMgcHJldmlvdXNseSBtaW5pbWlzZWQsIG1heGltaXNlZCBvciBmdWxsc2NyZWVuLlxuICAgICAqL1xuICAgIFJlc3RvcmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oUmVzdG9yZU1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB4IC0gVGhlIGRlc2lyZWQgaG9yaXpvbnRhbCBhYnNvbHV0ZSBwb3NpdGlvbiBvZiB0aGUgd2luZG93LlxuICAgICAqIEBwYXJhbSB5IC0gVGhlIGRlc2lyZWQgdmVydGljYWwgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBTZXRQb3NpdGlvbih4OiBudW1iZXIsIHk6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFNldFBvc2l0aW9uTWV0aG9kLCB7IHgsIHkgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgd2luZG93IHRvIGJlIGFsd2F5cyBvbiB0b3AuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYWx3YXlzT25Ub3AgLSBXaGV0aGVyIHRoZSB3aW5kb3cgc2hvdWxkIHN0YXkgb24gdG9wLlxuICAgICAqL1xuICAgIFNldEFsd2F5c09uVG9wKGFsd2F5c09uVG9wOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2V0QWx3YXlzT25Ub3BNZXRob2QsIHsgYWx3YXlzT25Ub3AgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgYmFja2dyb3VuZCBjb2xvdXIgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByIC0gVGhlIGRlc2lyZWQgcmVkIGNvbXBvbmVudCBvZiB0aGUgd2luZG93IGJhY2tncm91bmQuXG4gICAgICogQHBhcmFtIGcgLSBUaGUgZGVzaXJlZCBncmVlbiBjb21wb25lbnQgb2YgdGhlIHdpbmRvdyBiYWNrZ3JvdW5kLlxuICAgICAqIEBwYXJhbSBiIC0gVGhlIGRlc2lyZWQgYmx1ZSBjb21wb25lbnQgb2YgdGhlIHdpbmRvdyBiYWNrZ3JvdW5kLlxuICAgICAqIEBwYXJhbSBhIC0gVGhlIGRlc2lyZWQgYWxwaGEgY29tcG9uZW50IG9mIHRoZSB3aW5kb3cgYmFja2dyb3VuZC5cbiAgICAgKi9cbiAgICBTZXRCYWNrZ3JvdW5kQ29sb3VyKHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIsIGE6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFNldEJhY2tncm91bmRDb2xvdXJNZXRob2QsIHsgciwgZywgYiwgYSB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSB3aW5kb3cgZnJhbWUgYW5kIHRpdGxlIGJhci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmcmFtZWxlc3MgLSBXaGV0aGVyIHRoZSB3aW5kb3cgc2hvdWxkIGJlIGZyYW1lbGVzcy5cbiAgICAgKi9cbiAgICBTZXRGcmFtZWxlc3MoZnJhbWVsZXNzOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2V0RnJhbWVsZXNzTWV0aG9kLCB7IGZyYW1lbGVzcyB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlcyB0aGUgc3lzdGVtIGZ1bGxzY3JlZW4gYnV0dG9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVuYWJsZWQgLSBXaGV0aGVyIHRoZSBmdWxsc2NyZWVuIGJ1dHRvbiBzaG91bGQgYmUgZW5hYmxlZC5cbiAgICAgKi9cbiAgICBTZXRGdWxsc2NyZWVuQnV0dG9uRW5hYmxlZChlbmFibGVkOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2V0RnVsbHNjcmVlbkJ1dHRvbkVuYWJsZWRNZXRob2QsIHsgZW5hYmxlZCB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB3aWR0aCAtIFRoZSBkZXNpcmVkIG1heGltdW0gd2lkdGggb2YgdGhlIHdpbmRvdy5cbiAgICAgKiBAcGFyYW0gaGVpZ2h0IC0gVGhlIGRlc2lyZWQgbWF4aW11bSBoZWlnaHQgb2YgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBTZXRNYXhTaXplKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2V0TWF4U2l6ZU1ldGhvZCwgeyB3aWR0aCwgaGVpZ2h0IH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIG1pbmltdW0gc2l6ZSBvZiB0aGUgd2luZG93LlxuICAgICAqXG4gICAgICogQHBhcmFtIHdpZHRoIC0gVGhlIGRlc2lyZWQgbWluaW11bSB3aWR0aCBvZiB0aGUgd2luZG93LlxuICAgICAqIEBwYXJhbSBoZWlnaHQgLSBUaGUgZGVzaXJlZCBtaW5pbXVtIGhlaWdodCBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFNldE1pblNpemUod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShTZXRNaW5TaXplTWV0aG9kLCB7IHdpZHRoLCBoZWlnaHQgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcmVsYXRpdmUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdyB0byB0aGUgc2NyZWVuLlxuICAgICAqXG4gICAgICogQHBhcmFtIHggLSBUaGUgZGVzaXJlZCBob3Jpem9udGFsIHJlbGF0aXZlIHBvc2l0aW9uIG9mIHRoZSB3aW5kb3cuXG4gICAgICogQHBhcmFtIHkgLSBUaGUgZGVzaXJlZCB2ZXJ0aWNhbCByZWxhdGl2ZSBwb3NpdGlvbiBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFNldFJlbGF0aXZlUG9zaXRpb24oeDogbnVtYmVyLCB5OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShTZXRSZWxhdGl2ZVBvc2l0aW9uTWV0aG9kLCB7IHgsIHkgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB3aGV0aGVyIHRoZSB3aW5kb3cgaXMgcmVzaXphYmxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlc2l6YWJsZSAtIFdoZXRoZXIgdGhlIHdpbmRvdyBzaG91bGQgYmUgcmVzaXphYmxlLlxuICAgICAqL1xuICAgIFNldFJlc2l6YWJsZShyZXNpemFibGU6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShTZXRSZXNpemFibGVNZXRob2QsIHsgcmVzaXphYmxlIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHNpemUgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB3aWR0aCAtIFRoZSBkZXNpcmVkIHdpZHRoIG9mIHRoZSB3aW5kb3cuXG4gICAgICogQHBhcmFtIGhlaWdodCAtIFRoZSBkZXNpcmVkIGhlaWdodCBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFNldFNpemUod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShTZXRTaXplTWV0aG9kLCB7IHdpZHRoLCBoZWlnaHQgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdGl0bGUgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0aXRsZSAtIFRoZSBkZXNpcmVkIHRpdGxlIG9mIHRoZSB3aW5kb3cuXG4gICAgICovXG4gICAgU2V0VGl0bGUodGl0bGU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFNldFRpdGxlTWV0aG9kLCB7IHRpdGxlIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHpvb20gbGV2ZWwgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB6b29tIC0gVGhlIGRlc2lyZWQgem9vbSBsZXZlbC5cbiAgICAgKi9cbiAgICBTZXRab29tKHpvb206IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFNldFpvb21NZXRob2QsIHsgem9vbSB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTaG93cyB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFNob3coKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2hvd01ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgd2luZG93LlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFNpemUoKTogUHJvbWlzZTxTaXplPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2l6ZU1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG9nZ2xlcyB0aGUgd2luZG93IGJldHdlZW4gZnVsbHNjcmVlbiBhbmQgbm9ybWFsLlxuICAgICAqL1xuICAgIFRvZ2dsZUZ1bGxzY3JlZW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oVG9nZ2xlRnVsbHNjcmVlbk1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG9nZ2xlcyB0aGUgd2luZG93IGJldHdlZW4gbWF4aW1pc2VkIGFuZCBub3JtYWwuXG4gICAgICovXG4gICAgVG9nZ2xlTWF4aW1pc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oVG9nZ2xlTWF4aW1pc2VNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVuLWZ1bGxzY3JlZW5zIHRoZSB3aW5kb3cuXG4gICAgICovXG4gICAgVW5GdWxsc2NyZWVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFVuRnVsbHNjcmVlbk1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVW4tbWF4aW1pc2VzIHRoZSB3aW5kb3cuXG4gICAgICovXG4gICAgVW5NYXhpbWlzZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShVbk1heGltaXNlTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVbi1taW5pbWlzZXMgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBVbk1pbmltaXNlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFVuTWluaW1pc2VNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHdpZHRoIG9mIHRoZSB3aW5kb3cuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCB3aWR0aCBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFdpZHRoKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oV2lkdGhNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFpvb21zIHRoZSB3aW5kb3cuXG4gICAgICovXG4gICAgWm9vbSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShab29tTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbmNyZWFzZXMgdGhlIHpvb20gbGV2ZWwgb2YgdGhlIHdlYnZpZXcgY29udGVudC5cbiAgICAgKi9cbiAgICBab29tSW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oWm9vbUluTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWNyZWFzZXMgdGhlIHpvb20gbGV2ZWwgb2YgdGhlIHdlYnZpZXcgY29udGVudC5cbiAgICAgKi9cbiAgICBab29tT3V0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFpvb21PdXRNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUgem9vbSBsZXZlbCBvZiB0aGUgd2VidmlldyBjb250ZW50LlxuICAgICAqL1xuICAgIFpvb21SZXNldCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShab29tUmVzZXRNZXRob2QpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBUaGUgd2luZG93IHdpdGhpbiB3aGljaCB0aGUgc2NyaXB0IGlzIHJ1bm5pbmcuXG4gKi9cbmNvbnN0IHRoaXNXaW5kb3cgPSBuZXcgV2luZG93KCcnKTtcblxuZXhwb3J0IGRlZmF1bHQgdGhpc1dpbmRvdztcbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuaW1wb3J0ICogYXMgUnVudGltZSBmcm9tIFwiLi4vQHdhaWxzaW8vcnVudGltZS9zcmNcIjtcblxuLy8gTk9URTogdGhlIGZvbGxvd2luZyBtZXRob2RzIE1VU1QgYmUgaW1wb3J0ZWQgZXhwbGljaXRseSBiZWNhdXNlIG9mIGhvdyBlc2J1aWxkIGluamVjdGlvbiB3b3Jrc1xuaW1wb3J0IHsgRW5hYmxlIGFzIEVuYWJsZVdNTCB9IGZyb20gXCIuLi9Ad2FpbHNpby9ydW50aW1lL3NyYy93bWxcIjtcbmltcG9ydCB7IGRlYnVnTG9nIH0gZnJvbSBcIi4uL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3V0aWxzXCI7XG5cbndpbmRvdy53YWlscyA9IFJ1bnRpbWU7XG5FbmFibGVXTUwoKTtcblxuaWYgKERFQlVHKSB7XG4gICAgZGVidWdMb2coXCJXYWlscyBSdW50aW1lIExvYWRlZFwiKVxufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5pbXBvcnQgeyBuZXdSdW50aW1lQ2FsbGVyLCBvYmplY3ROYW1lcyB9IGZyb20gXCIuL3J1bnRpbWUuanNcIjtcblxubGV0IGNhbGwgPSBuZXdSdW50aW1lQ2FsbGVyKG9iamVjdE5hbWVzLlN5c3RlbSk7XG5cbmNvbnN0IFN5c3RlbUlzRGFya01vZGUgPSAwO1xuY29uc3QgU3lzdGVtRW52aXJvbm1lbnQgPSAxO1xuXG5jb25zdCBfaW52b2tlID0gKGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAoKHdpbmRvdyBhcyBhbnkpLmNocm9tZT8ud2Vidmlldz8ucG9zdE1lc3NhZ2UpIHtcbiAgICAgICAgICAgIHJldHVybiAod2luZG93IGFzIGFueSkuY2hyb21lLndlYnZpZXcucG9zdE1lc3NhZ2UuYmluZCgod2luZG93IGFzIGFueSkuY2hyb21lLndlYnZpZXcpO1xuICAgICAgICB9IGVsc2UgaWYgKCh3aW5kb3cgYXMgYW55KS53ZWJraXQ/Lm1lc3NhZ2VIYW5kbGVycz8uWydleHRlcm5hbCddPy5wb3N0TWVzc2FnZSkge1xuICAgICAgICAgICAgcmV0dXJuICh3aW5kb3cgYXMgYW55KS53ZWJraXQubWVzc2FnZUhhbmRsZXJzWydleHRlcm5hbCddLnBvc3RNZXNzYWdlLmJpbmQoKHdpbmRvdyBhcyBhbnkpLndlYmtpdC5tZXNzYWdlSGFuZGxlcnNbJ2V4dGVybmFsJ10pO1xuICAgICAgICB9XG4gICAgfSBjYXRjaChlKSB7fVxuXG4gICAgY29uc29sZS53YXJuKCdcXG4lY1x1MjZBMFx1RkUwRiBCcm93c2VyIEVudmlyb25tZW50IERldGVjdGVkICVjXFxuXFxuJWNPbmx5IFVJIHByZXZpZXdzIGFyZSBhdmFpbGFibGUgaW4gdGhlIGJyb3dzZXIuIEZvciBmdWxsIGZ1bmN0aW9uYWxpdHksIHBsZWFzZSBydW4gdGhlIGFwcGxpY2F0aW9uIGluIGRlc2t0b3AgbW9kZS5cXG5Nb3JlIGluZm9ybWF0aW9uIGF0OiBodHRwczovL3YzLndhaWxzLmlvL2xlYXJuL2J1aWxkLyN1c2luZy1hLWJyb3dzZXItZm9yLWRldmVsb3BtZW50XFxuJyxcbiAgICAgICAgJ2JhY2tncm91bmQ6ICNmZmZmZmY7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgcGFkZGluZzogNHB4IDhweDsgYm9yZGVyLXJhZGl1czogNHB4OyBib3JkZXI6IDJweCBzb2xpZCAjMDAwMDAwOycsXG4gICAgICAgICdiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsnLFxuICAgICAgICAnY29sb3I6ICNmZmZmZmY7IGZvbnQtc3R5bGU6IGl0YWxpYzsgZm9udC13ZWlnaHQ6IGJvbGQ7Jyk7XG4gICAgcmV0dXJuIG51bGw7XG59KSgpO1xuXG5leHBvcnQgZnVuY3Rpb24gaW52b2tlKG1zZzogYW55KTogdm9pZCB7XG4gICAgcmV0dXJuIF9pbnZva2U/Lihtc2cpO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgc3lzdGVtIGRhcmsgbW9kZSBzdGF0dXMuXG4gKlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYSBib29sZWFuIHZhbHVlIGluZGljYXRpbmcgaWYgdGhlIHN5c3RlbSBpcyBpbiBkYXJrIG1vZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBJc0RhcmtNb2RlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBjYWxsKFN5c3RlbUlzRGFya01vZGUpO1xufVxuXG4vKipcbiAqIEZldGNoZXMgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUgYXBwbGljYXRpb24gZnJvbSB0aGUgc2VydmVyLlxuICpcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBjYXBhYmlsaXRpZXMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBDYXBhYmlsaXRpZXMoKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXCIvd2FpbHMvY2FwYWJpbGl0aWVzXCIpO1xuICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImNvdWxkIG5vdCBmZXRjaCBjYXBhYmlsaXRpZXM6IFwiICsgcmVzcG9uc2Uuc3RhdHVzVGV4dCk7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9TSW5mbyB7XG4gICAgLyoqIFRoZSBicmFuZGluZyBvZiB0aGUgT1MuICovXG4gICAgQnJhbmRpbmc6IHN0cmluZztcbiAgICAvKiogVGhlIElEIG9mIHRoZSBPUy4gKi9cbiAgICBJRDogc3RyaW5nO1xuICAgIC8qKiBUaGUgbmFtZSBvZiB0aGUgT1MuICovXG4gICAgTmFtZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgdmVyc2lvbiBvZiB0aGUgT1MuICovXG4gICAgVmVyc2lvbjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVudmlyb25tZW50SW5mbyB7XG4gICAgLyoqIFRoZSBhcmNoaXRlY3R1cmUgb2YgdGhlIHN5c3RlbS4gKi9cbiAgICBBcmNoOiBzdHJpbmc7XG4gICAgLyoqIFRydWUgaWYgdGhlIGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcgaW4gZGVidWcgbW9kZSwgb3RoZXJ3aXNlIGZhbHNlLiAqL1xuICAgIERlYnVnOiBib29sZWFuO1xuICAgIC8qKiBUaGUgb3BlcmF0aW5nIHN5c3RlbSBpbiB1c2UuICovXG4gICAgT1M6IHN0cmluZztcbiAgICAvKiogRGV0YWlscyBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbS4gKi9cbiAgICBPU0luZm86IE9TSW5mbztcbiAgICAvKiogQWRkaXRpb25hbCBwbGF0Zm9ybSBpbmZvcm1hdGlvbi4gKi9cbiAgICBQbGF0Zm9ybUluZm86IFJlY29yZDxzdHJpbmcsIGFueT47XG59XG5cbi8qKlxuICogUmV0cmlldmVzIGVudmlyb25tZW50IGRldGFpbHMuXG4gKlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gb2JqZWN0IGNvbnRhaW5pbmcgT1MgYW5kIHN5c3RlbSBhcmNoaXRlY3R1cmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFbnZpcm9ubWVudCgpOiBQcm9taXNlPEVudmlyb25tZW50SW5mbz4ge1xuICAgIHJldHVybiBjYWxsKFN5c3RlbUVudmlyb25tZW50KTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGN1cnJlbnQgb3BlcmF0aW5nIHN5c3RlbSBpcyBXaW5kb3dzLlxuICpcbiAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBpcyBXaW5kb3dzLCBvdGhlcndpc2UgZmFsc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBJc1dpbmRvd3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHdpbmRvdy5fd2FpbHMuZW52aXJvbm1lbnQuT1MgPT09IFwid2luZG93c1wiO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgY3VycmVudCBvcGVyYXRpbmcgc3lzdGVtIGlzIExpbnV4LlxuICpcbiAqIEByZXR1cm5zIFJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVudCBvcGVyYXRpbmcgc3lzdGVtIGlzIExpbnV4LCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBJc0xpbnV4KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB3aW5kb3cuX3dhaWxzLmVudmlyb25tZW50Lk9TID09PSBcImxpbnV4XCI7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBjdXJyZW50IGVudmlyb25tZW50IGlzIGEgbWFjT1Mgb3BlcmF0aW5nIHN5c3RlbS5cbiAqXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBlbnZpcm9ubWVudCBpcyBtYWNPUywgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSXNNYWMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHdpbmRvdy5fd2FpbHMuZW52aXJvbm1lbnQuT1MgPT09IFwiZGFyd2luXCI7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBjdXJyZW50IGVudmlyb25tZW50IGFyY2hpdGVjdHVyZSBpcyBBTUQ2NC5cbiAqXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBjdXJyZW50IGVudmlyb25tZW50IGFyY2hpdGVjdHVyZSBpcyBBTUQ2NCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSXNBTUQ2NCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gd2luZG93Ll93YWlscy5lbnZpcm9ubWVudC5BcmNoID09PSBcImFtZDY0XCI7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBjdXJyZW50IGFyY2hpdGVjdHVyZSBpcyBBUk0uXG4gKlxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgY3VycmVudCBhcmNoaXRlY3R1cmUgaXMgQVJNLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBJc0FSTSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gd2luZG93Ll93YWlscy5lbnZpcm9ubWVudC5BcmNoID09PSBcImFybVwiO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgY3VycmVudCBlbnZpcm9ubWVudCBpcyBBUk02NCBhcmNoaXRlY3R1cmUuXG4gKlxuICogQHJldHVybnMgUmV0dXJucyB0cnVlIGlmIHRoZSBlbnZpcm9ubWVudCBpcyBBUk02NCBhcmNoaXRlY3R1cmUsIG90aGVyd2lzZSByZXR1cm5zIGZhbHNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSXNBUk02NCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gd2luZG93Ll93YWlscy5lbnZpcm9ubWVudC5BcmNoID09PSBcImFybTY0XCI7XG59XG5cbi8qKlxuICogUmVwb3J0cyB3aGV0aGVyIHRoZSBhcHAgaXMgYmVpbmcgcnVuIGluIGRlYnVnIG1vZGUuXG4gKlxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgYXBwIGlzIGJlaW5nIHJ1biBpbiBkZWJ1ZyBtb2RlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSXNEZWJ1ZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gQm9vbGVhbih3aW5kb3cuX3dhaWxzLmVudmlyb25tZW50LkRlYnVnKTtcbn1cblxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5pbXBvcnQgeyBuZXdSdW50aW1lQ2FsbGVyLCBvYmplY3ROYW1lcyB9IGZyb20gXCIuL3J1bnRpbWUuanNcIjtcbmltcG9ydCB7IElzRGVidWcgfSBmcm9tIFwiLi9zeXN0ZW0uanNcIjtcblxuLy8gc2V0dXBcbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIGNvbnRleHRNZW51SGFuZGxlcik7XG5cbmNvbnN0IGNhbGwgPSBuZXdSdW50aW1lQ2FsbGVyKG9iamVjdE5hbWVzLkNvbnRleHRNZW51KTtcblxuY29uc3QgQ29udGV4dE1lbnVPcGVuID0gMDtcblxuZnVuY3Rpb24gb3BlbkNvbnRleHRNZW51KGlkOiBzdHJpbmcsIHg6IG51bWJlciwgeTogbnVtYmVyLCBkYXRhOiBhbnkpOiB2b2lkIHtcbiAgICB2b2lkIGNhbGwoQ29udGV4dE1lbnVPcGVuLCB7aWQsIHgsIHksIGRhdGF9KTtcbn1cblxuZnVuY3Rpb24gY29udGV4dE1lbnVIYW5kbGVyKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgbGV0IHRhcmdldDogSFRNTEVsZW1lbnQ7XG5cbiAgICBpZiAoZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgIH0gZWxzZSBpZiAoIShldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkgJiYgZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgTm9kZSkge1xuICAgICAgICB0YXJnZXQgPSBldmVudC50YXJnZXQucGFyZW50RWxlbWVudCA/PyBkb2N1bWVudC5ib2R5O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRhcmdldCA9IGRvY3VtZW50LmJvZHk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIGN1c3RvbSBjb250ZXh0IG1lbnVcbiAgICBsZXQgY3VzdG9tQ29udGV4dE1lbnUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXQpLmdldFByb3BlcnR5VmFsdWUoXCItLWN1c3RvbS1jb250ZXh0bWVudVwiKS50cmltKCk7XG5cbiAgICBpZiAoY3VzdG9tQ29udGV4dE1lbnUpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgbGV0IGRhdGEgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXQpLmdldFByb3BlcnR5VmFsdWUoXCItLWN1c3RvbS1jb250ZXh0bWVudS1kYXRhXCIpO1xuICAgICAgICBvcGVuQ29udGV4dE1lbnUoY3VzdG9tQ29udGV4dE1lbnUsIGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFksIGRhdGEpO1xuICAgICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBwcm9jZXNzRGVmYXVsdENvbnRleHRNZW51KGV2ZW50KTtcbn1cblxuXG4vKlxuLS1kZWZhdWx0LWNvbnRleHRtZW51OiBhdXRvOyAoZGVmYXVsdCkgd2lsbCBzaG93IHRoZSBkZWZhdWx0IGNvbnRleHQgbWVudSBpZiBjb250ZW50RWRpdGFibGUgaXMgdHJ1ZSBPUiB0ZXh0IGhhcyBiZWVuIHNlbGVjdGVkIE9SIGVsZW1lbnQgaXMgaW5wdXQgb3IgdGV4dGFyZWFcbi0tZGVmYXVsdC1jb250ZXh0bWVudTogc2hvdzsgd2lsbCBhbHdheXMgc2hvdyB0aGUgZGVmYXVsdCBjb250ZXh0IG1lbnVcbi0tZGVmYXVsdC1jb250ZXh0bWVudTogaGlkZTsgd2lsbCBhbHdheXMgaGlkZSB0aGUgZGVmYXVsdCBjb250ZXh0IG1lbnVcblxuVGhpcyBydWxlIGlzIGluaGVyaXRlZCBsaWtlIG5vcm1hbCBDU1MgcnVsZXMsIHNvIG5lc3Rpbmcgd29ya3MgYXMgZXhwZWN0ZWRcbiovXG5mdW5jdGlvbiBwcm9jZXNzRGVmYXVsdENvbnRleHRNZW51KGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgLy8gRGVidWcgYnVpbGRzIGFsd2F5cyBzaG93IHRoZSBtZW51XG4gICAgaWYgKElzRGVidWcoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHRhcmdldDogSFRNTEVsZW1lbnQ7XG5cbiAgICBpZiAoZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgIH0gZWxzZSBpZiAoIShldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkgJiYgZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgTm9kZSkge1xuICAgICAgICB0YXJnZXQgPSBldmVudC50YXJnZXQucGFyZW50RWxlbWVudCA/PyBkb2N1bWVudC5ib2R5O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRhcmdldCA9IGRvY3VtZW50LmJvZHk7XG4gICAgfVxuXG4gICAgLy8gUHJvY2VzcyBkZWZhdWx0IGNvbnRleHQgbWVudVxuICAgIHN3aXRjaCAod2luZG93LmdldENvbXB1dGVkU3R5bGUodGFyZ2V0KS5nZXRQcm9wZXJ0eVZhbHVlKFwiLS1kZWZhdWx0LWNvbnRleHRtZW51XCIpLnRyaW0oKSkge1xuICAgICAgICBjYXNlIFwic2hvd1wiOlxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNhc2UgXCJoaWRlXCI6XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAvLyBDaGVjayBpZiBjb250ZW50RWRpdGFibGUgaXMgdHJ1ZVxuICAgICAgICAgICAgaWYgKHRhcmdldC5pc0NvbnRlbnRFZGl0YWJsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGV4dCBoYXMgYmVlbiBzZWxlY3RlZFxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgICAgICAgICAgY29uc3QgaGFzU2VsZWN0aW9uID0gc2VsZWN0aW9uICYmIHNlbGVjdGlvbi50b1N0cmluZygpLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICBpZiAoaGFzU2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3Rpb24ucmFuZ2VDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoaSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY3RzID0gcmFuZ2UuZ2V0Q2xpZW50UmVjdHMoKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByZWN0cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjdCA9IHJlY3RzW2pdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQocmVjdC5sZWZ0LCByZWN0LnRvcCkgPT09IHRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGFnIGlzIGlucHV0IG9yIHRleHRhcmVhLlxuICAgICAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgfHwgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTFRleHRBcmVhRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGlmIChoYXNTZWxlY3Rpb24gfHwgKCF0YXJnZXQucmVhZE9ubHkgJiYgIXRhcmdldC5kaXNhYmxlZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaGlkZSBkZWZhdWx0IGNvbnRleHQgbWVudVxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG59XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBrZXkgZnJvbSB0aGUgZmxhZyBtYXAuXG4gKlxuICogQHBhcmFtIGtleSAtIFRoZSBrZXkgdG8gcmV0cmlldmUgdGhlIHZhbHVlIGZvci5cbiAqIEByZXR1cm4gVGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGtleS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEdldEZsYWcoa2V5OiBzdHJpbmcpOiBhbnkge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB3aW5kb3cuX3dhaWxzLmZsYWdzW2tleV07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gcmV0cmlldmUgZmxhZyAnXCIgKyBrZXkgKyBcIic6IFwiICsgZSwgeyBjYXVzZTogZSB9KTtcbiAgICB9XG59XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbmltcG9ydCB7IGludm9rZSwgSXNXaW5kb3dzIH0gZnJvbSBcIi4vc3lzdGVtLmpzXCI7XG5pbXBvcnQgeyBHZXRGbGFnIH0gZnJvbSBcIi4vZmxhZ3MuanNcIjtcbmltcG9ydCB7IGNhblRyYWNrQnV0dG9ucyB9IGZyb20gXCIuL3V0aWxzLmpzXCI7XG5cbi8vIFNldHVwXG5sZXQgY2FuRHJhZyA9IGZhbHNlO1xubGV0IGRyYWdnaW5nID0gZmFsc2U7XG5cbmxldCByZXNpemFibGUgPSBmYWxzZTtcbmxldCBjYW5SZXNpemUgPSBmYWxzZTtcbmxldCByZXNpemluZyA9IGZhbHNlO1xubGV0IHJlc2l6ZUVkZ2U6IHN0cmluZyA9IFwiXCI7XG5sZXQgZGVmYXVsdEN1cnNvciA9IFwiYXV0b1wiO1xuXG5sZXQgYnV0dG9ucyA9IDA7XG5jb25zdCBidXR0b25zVHJhY2tlZCA9IGNhblRyYWNrQnV0dG9ucygpO1xuXG53aW5kb3cuX3dhaWxzID0gd2luZG93Ll93YWlscyB8fCB7fTtcbndpbmRvdy5fd2FpbHMuc2V0UmVzaXphYmxlID0gKHZhbHVlOiBib29sZWFuKTogdm9pZCA9PiB7XG4gICAgcmVzaXphYmxlID0gdmFsdWU7XG4gICAgaWYgKCFyZXNpemFibGUpIHtcbiAgICAgICAgLy8gU3RvcCByZXNpemluZyBpZiBpbiBwcm9ncmVzcy5cbiAgICAgICAgY2FuUmVzaXplID0gcmVzaXppbmcgPSBmYWxzZTtcbiAgICAgICAgc2V0UmVzaXplKCk7XG4gICAgfVxufTtcblxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHVwZGF0ZSwgeyBjYXB0dXJlOiB0cnVlIH0pO1xud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHVwZGF0ZSwgeyBjYXB0dXJlOiB0cnVlIH0pO1xud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB1cGRhdGUsIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbmZvciAoY29uc3QgZXYgb2YgWydjbGljaycsICdjb250ZXh0bWVudScsICdkYmxjbGljayddKSB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoZXYsIHN1cHByZXNzRXZlbnQsIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbn1cblxuZnVuY3Rpb24gc3VwcHJlc3NFdmVudChldmVudDogRXZlbnQpIHtcbiAgICAvLyBTdXBwcmVzcyBjbGljayBldmVudHMgd2hpbGUgcmVzaXppbmcgb3IgZHJhZ2dpbmcuXG4gICAgaWYgKGRyYWdnaW5nIHx8IHJlc2l6aW5nKSB7XG4gICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG59XG5cbi8vIFVzZSBjb25zdGFudHMgdG8gYXZvaWQgY29tcGFyaW5nIHN0cmluZ3MgbXVsdGlwbGUgdGltZXMuXG5jb25zdCBNb3VzZURvd24gPSAwO1xuY29uc3QgTW91c2VVcCAgID0gMTtcbmNvbnN0IE1vdXNlTW92ZSA9IDI7XG5cbmZ1bmN0aW9uIHVwZGF0ZShldmVudDogTW91c2VFdmVudCkge1xuICAgIC8vIFdpbmRvd3Mgc3VwcHJlc3NlcyBtb3VzZSBldmVudHMgYXQgdGhlIGVuZCBvZiBkcmFnZ2luZyBvciByZXNpemluZyxcbiAgICAvLyBzbyB3ZSBuZWVkIHRvIGJlIHNtYXJ0IGFuZCBzeW50aGVzaXplIGJ1dHRvbiBldmVudHMuXG5cbiAgICBsZXQgZXZlbnRUeXBlOiBudW1iZXIsIGV2ZW50QnV0dG9ucyA9IGV2ZW50LmJ1dHRvbnM7XG4gICAgc3dpdGNoIChldmVudC50eXBlKSB7XG4gICAgICAgIGNhc2UgJ21vdXNlZG93bic6XG4gICAgICAgICAgICBldmVudFR5cGUgPSBNb3VzZURvd247XG4gICAgICAgICAgICBpZiAoIWJ1dHRvbnNUcmFja2VkKSB7IGV2ZW50QnV0dG9ucyA9IGJ1dHRvbnMgfCAoMSA8PCBldmVudC5idXR0b24pOyB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbW91c2V1cCc6XG4gICAgICAgICAgICBldmVudFR5cGUgPSBNb3VzZVVwO1xuICAgICAgICAgICAgaWYgKCFidXR0b25zVHJhY2tlZCkgeyBldmVudEJ1dHRvbnMgPSBidXR0b25zICYgfigxIDw8IGV2ZW50LmJ1dHRvbik7IH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgZXZlbnRUeXBlID0gTW91c2VNb3ZlO1xuICAgICAgICAgICAgaWYgKCFidXR0b25zVHJhY2tlZCkgeyBldmVudEJ1dHRvbnMgPSBidXR0b25zOyB9XG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBsZXQgcmVsZWFzZWQgPSBidXR0b25zICYgfmV2ZW50QnV0dG9ucztcbiAgICBsZXQgcHJlc3NlZCA9IGV2ZW50QnV0dG9ucyAmIH5idXR0b25zO1xuXG4gICAgYnV0dG9ucyA9IGV2ZW50QnV0dG9ucztcblxuICAgIC8vIFN5bnRoZXNpemUgYSByZWxlYXNlLXByZXNzIHNlcXVlbmNlIGlmIHdlIGRldGVjdCBhIHByZXNzIG9mIGFuIGFscmVhZHkgcHJlc3NlZCBidXR0b24uXG4gICAgaWYgKGV2ZW50VHlwZSA9PT0gTW91c2VEb3duICYmICEocHJlc3NlZCAmIGV2ZW50LmJ1dHRvbikpIHtcbiAgICAgICAgcmVsZWFzZWQgfD0gKDEgPDwgZXZlbnQuYnV0dG9uKTtcbiAgICAgICAgcHJlc3NlZCB8PSAoMSA8PCBldmVudC5idXR0b24pO1xuICAgIH1cblxuICAgIC8vIFN1cHByZXNzIGFsbCBidXR0b24gZXZlbnRzIGR1cmluZyBkcmFnZ2luZyBhbmQgcmVzaXppbmcsXG4gICAgLy8gdW5sZXNzIHRoaXMgaXMgYSBtb3VzZXVwIGV2ZW50IHRoYXQgaXMgZW5kaW5nIGEgZHJhZyBhY3Rpb24uXG4gICAgaWYgKFxuICAgICAgICBldmVudFR5cGUgIT09IE1vdXNlTW92ZSAvLyBGYXN0IHBhdGggZm9yIG1vdXNlbW92ZVxuICAgICAgICAmJiByZXNpemluZ1xuICAgICAgICB8fCAoXG4gICAgICAgICAgICBkcmFnZ2luZ1xuICAgICAgICAgICAgJiYgKFxuICAgICAgICAgICAgICAgIGV2ZW50VHlwZSA9PT0gTW91c2VEb3duXG4gICAgICAgICAgICAgICAgfHwgZXZlbnQuYnV0dG9uICE9PSAwXG4gICAgICAgICAgICApXG4gICAgICAgIClcbiAgICApIHtcbiAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSByZWxlYXNlc1xuICAgIGlmIChyZWxlYXNlZCAmIDEpIHsgcHJpbWFyeVVwKGV2ZW50KTsgfVxuICAgIC8vIEhhbmRsZSBwcmVzc2VzXG4gICAgaWYgKHByZXNzZWQgJiAxKSB7IHByaW1hcnlEb3duKGV2ZW50KTsgfVxuXG4gICAgLy8gSGFuZGxlIG1vdXNlbW92ZVxuICAgIGlmIChldmVudFR5cGUgPT09IE1vdXNlTW92ZSkgeyBvbk1vdXNlTW92ZShldmVudCk7IH07XG59XG5cbmZ1bmN0aW9uIHByaW1hcnlEb3duKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgLy8gUmVzZXQgcmVhZGluZXNzIHN0YXRlLlxuICAgIGNhbkRyYWcgPSBmYWxzZTtcbiAgICBjYW5SZXNpemUgPSBmYWxzZTtcblxuICAgIC8vIElnbm9yZSByZXBlYXRlZCBjbGlja3Mgb24gbWFjT1MgYW5kIExpbnV4LlxuICAgIGlmICghSXNXaW5kb3dzKCkpIHtcbiAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdtb3VzZWRvd24nICYmIGV2ZW50LmJ1dHRvbiA9PT0gMCAmJiBldmVudC5kZXRhaWwgIT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyZXNpemVFZGdlKSB7XG4gICAgICAgIC8vIFJlYWR5IHRvIHJlc2l6ZSBpZiB0aGUgcHJpbWFyeSBidXR0b24gd2FzIHByZXNzZWQgZm9yIHRoZSBmaXJzdCB0aW1lLlxuICAgICAgICBjYW5SZXNpemUgPSB0cnVlO1xuICAgICAgICAvLyBEbyBub3Qgc3RhcnQgZHJhZyBvcGVyYXRpb25zIHdoZW4gb24gcmVzaXplIGVkZ2VzLlxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUmV0cmlldmUgdGFyZ2V0IGVsZW1lbnRcbiAgICBsZXQgdGFyZ2V0OiBIVE1MRWxlbWVudDtcblxuICAgIGlmIChldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgICB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgfSBlbHNlIGlmICghKGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSAmJiBldmVudC50YXJnZXQgaW5zdGFuY2VvZiBOb2RlKSB7XG4gICAgICAgIHRhcmdldCA9IGV2ZW50LnRhcmdldC5wYXJlbnRFbGVtZW50ID8/IGRvY3VtZW50LmJvZHk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGFyZ2V0ID0gZG9jdW1lbnQuYm9keTtcbiAgICB9XG5cbiAgICAvLyBSZWFkeSB0byBkcmFnIGlmIHRoZSBwcmltYXJ5IGJ1dHRvbiB3YXMgcHJlc3NlZCBmb3IgdGhlIGZpcnN0IHRpbWUgb24gYSBkcmFnZ2FibGUgZWxlbWVudC5cbiAgICAvLyBJZ25vcmUgY2xpY2tzIG9uIHRoZSBzY3JvbGxiYXIuXG4gICAgY29uc3Qgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXQpO1xuICAgIGNhbkRyYWcgPSAoXG4gICAgICAgIHN0eWxlLmdldFByb3BlcnR5VmFsdWUoXCItLXdhaWxzLWRyYWdnYWJsZVwiKS50cmltKCkgPT09IFwiZHJhZ1wiXG4gICAgICAgICYmIChcbiAgICAgICAgICAgIGV2ZW50Lm9mZnNldFggLSBwYXJzZUZsb2F0KHN0eWxlLnBhZGRpbmdMZWZ0KSA8IHRhcmdldC5jbGllbnRXaWR0aFxuICAgICAgICAgICAgJiYgZXZlbnQub2Zmc2V0WSAtIHBhcnNlRmxvYXQoc3R5bGUucGFkZGluZ1RvcCkgPCB0YXJnZXQuY2xpZW50SGVpZ2h0XG4gICAgICAgIClcbiAgICApO1xufVxuXG5mdW5jdGlvbiBwcmltYXJ5VXAoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICAvLyBTdG9wIGRyYWdnaW5nIGFuZCByZXNpemluZy5cbiAgICBjYW5EcmFnID0gZmFsc2U7XG4gICAgZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICBjYW5SZXNpemUgPSBmYWxzZTtcbiAgICByZXNpemluZyA9IGZhbHNlO1xufVxuXG5jb25zdCBjdXJzb3JGb3JFZGdlID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgXCJzZS1yZXNpemVcIjogXCJud3NlLXJlc2l6ZVwiLFxuICAgIFwic3ctcmVzaXplXCI6IFwibmVzdy1yZXNpemVcIixcbiAgICBcIm53LXJlc2l6ZVwiOiBcIm53c2UtcmVzaXplXCIsXG4gICAgXCJuZS1yZXNpemVcIjogXCJuZXN3LXJlc2l6ZVwiLFxuICAgIFwidy1yZXNpemVcIjogXCJldy1yZXNpemVcIixcbiAgICBcIm4tcmVzaXplXCI6IFwibnMtcmVzaXplXCIsXG4gICAgXCJzLXJlc2l6ZVwiOiBcIm5zLXJlc2l6ZVwiLFxuICAgIFwiZS1yZXNpemVcIjogXCJldy1yZXNpemVcIixcbn0pXG5cbmZ1bmN0aW9uIHNldFJlc2l6ZShlZGdlPzoga2V5b2YgdHlwZW9mIGN1cnNvckZvckVkZ2UpOiB2b2lkIHtcbiAgICBpZiAoZWRnZSkge1xuICAgICAgICBpZiAoIXJlc2l6ZUVkZ2UpIHsgZGVmYXVsdEN1cnNvciA9IGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yOyB9XG4gICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yID0gY3Vyc29yRm9yRWRnZVtlZGdlXTtcbiAgICB9IGVsc2UgaWYgKCFlZGdlICYmIHJlc2l6ZUVkZ2UpIHtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3IgPSBkZWZhdWx0Q3Vyc29yO1xuICAgIH1cblxuICAgIHJlc2l6ZUVkZ2UgPSBlZGdlIHx8IFwiXCI7XG59XG5cbmZ1bmN0aW9uIG9uTW91c2VNb3ZlKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGNhblJlc2l6ZSAmJiByZXNpemVFZGdlKSB7XG4gICAgICAgIC8vIFN0YXJ0IHJlc2l6aW5nLlxuICAgICAgICByZXNpemluZyA9IHRydWU7XG4gICAgICAgIGludm9rZShcIndhaWxzOnJlc2l6ZTpcIiArIHJlc2l6ZUVkZ2UpO1xuICAgIH0gZWxzZSBpZiAoY2FuRHJhZykge1xuICAgICAgICAvLyBTdGFydCBkcmFnZ2luZy5cbiAgICAgICAgZHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgICBpbnZva2UoXCJ3YWlsczpkcmFnXCIpO1xuICAgIH1cblxuICAgIGlmIChkcmFnZ2luZyB8fCByZXNpemluZykge1xuICAgICAgICAvLyBFaXRoZXIgZHJhZyBvciByZXNpemUgaXMgb25nb2luZyxcbiAgICAgICAgLy8gcmVzZXQgcmVhZGluZXNzIGFuZCBzdG9wIHByb2Nlc3NpbmcuXG4gICAgICAgIGNhbkRyYWcgPSBjYW5SZXNpemUgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghcmVzaXphYmxlIHx8ICFJc1dpbmRvd3MoKSkge1xuICAgICAgICBpZiAocmVzaXplRWRnZSkgeyBzZXRSZXNpemUoKTsgfVxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmVzaXplSGFuZGxlSGVpZ2h0ID0gR2V0RmxhZyhcInN5c3RlbS5yZXNpemVIYW5kbGVIZWlnaHRcIikgfHwgNTtcbiAgICBjb25zdCByZXNpemVIYW5kbGVXaWR0aCA9IEdldEZsYWcoXCJzeXN0ZW0ucmVzaXplSGFuZGxlV2lkdGhcIikgfHwgNTtcblxuICAgIC8vIEV4dHJhIHBpeGVscyBmb3IgdGhlIGNvcm5lciBhcmVhcy5cbiAgICBjb25zdCBjb3JuZXJFeHRyYSA9IEdldEZsYWcoXCJyZXNpemVDb3JuZXJFeHRyYVwiKSB8fCAxMDtcblxuICAgIGNvbnN0IHJpZ2h0Qm9yZGVyID0gKHdpbmRvdy5vdXRlcldpZHRoIC0gZXZlbnQuY2xpZW50WCkgPCByZXNpemVIYW5kbGVXaWR0aDtcbiAgICBjb25zdCBsZWZ0Qm9yZGVyID0gZXZlbnQuY2xpZW50WCA8IHJlc2l6ZUhhbmRsZVdpZHRoO1xuICAgIGNvbnN0IHRvcEJvcmRlciA9IGV2ZW50LmNsaWVudFkgPCByZXNpemVIYW5kbGVIZWlnaHQ7XG4gICAgY29uc3QgYm90dG9tQm9yZGVyID0gKHdpbmRvdy5vdXRlckhlaWdodCAtIGV2ZW50LmNsaWVudFkpIDwgcmVzaXplSGFuZGxlSGVpZ2h0O1xuXG4gICAgLy8gQWRqdXN0IGZvciBjb3JuZXIgYXJlYXMuXG4gICAgY29uc3QgcmlnaHRDb3JuZXIgPSAod2luZG93Lm91dGVyV2lkdGggLSBldmVudC5jbGllbnRYKSA8IChyZXNpemVIYW5kbGVXaWR0aCArIGNvcm5lckV4dHJhKTtcbiAgICBjb25zdCBsZWZ0Q29ybmVyID0gZXZlbnQuY2xpZW50WCA8IChyZXNpemVIYW5kbGVXaWR0aCArIGNvcm5lckV4dHJhKTtcbiAgICBjb25zdCB0b3BDb3JuZXIgPSBldmVudC5jbGllbnRZIDwgKHJlc2l6ZUhhbmRsZUhlaWdodCArIGNvcm5lckV4dHJhKTtcbiAgICBjb25zdCBib3R0b21Db3JuZXIgPSAod2luZG93Lm91dGVySGVpZ2h0IC0gZXZlbnQuY2xpZW50WSkgPCAocmVzaXplSGFuZGxlSGVpZ2h0ICsgY29ybmVyRXh0cmEpO1xuXG4gICAgaWYgKCFsZWZ0Q29ybmVyICYmICF0b3BDb3JuZXIgJiYgIWJvdHRvbUNvcm5lciAmJiAhcmlnaHRDb3JuZXIpIHtcbiAgICAgICAgLy8gT3B0aW1pc2F0aW9uOiBvdXQgb2YgYWxsIGNvcm5lciBhcmVhcyBpbXBsaWVzIG91dCBvZiBib3JkZXJzLlxuICAgICAgICBzZXRSZXNpemUoKTtcbiAgICB9XG4gICAgLy8gRGV0ZWN0IGNvcm5lcnMuXG4gICAgZWxzZSBpZiAocmlnaHRDb3JuZXIgJiYgYm90dG9tQ29ybmVyKSBzZXRSZXNpemUoXCJzZS1yZXNpemVcIik7XG4gICAgZWxzZSBpZiAobGVmdENvcm5lciAmJiBib3R0b21Db3JuZXIpIHNldFJlc2l6ZShcInN3LXJlc2l6ZVwiKTtcbiAgICBlbHNlIGlmIChsZWZ0Q29ybmVyICYmIHRvcENvcm5lcikgc2V0UmVzaXplKFwibnctcmVzaXplXCIpO1xuICAgIGVsc2UgaWYgKHRvcENvcm5lciAmJiByaWdodENvcm5lcikgc2V0UmVzaXplKFwibmUtcmVzaXplXCIpO1xuICAgIC8vIERldGVjdCBib3JkZXJzLlxuICAgIGVsc2UgaWYgKGxlZnRCb3JkZXIpIHNldFJlc2l6ZShcInctcmVzaXplXCIpO1xuICAgIGVsc2UgaWYgKHRvcEJvcmRlcikgc2V0UmVzaXplKFwibi1yZXNpemVcIik7XG4gICAgZWxzZSBpZiAoYm90dG9tQm9yZGVyKSBzZXRSZXNpemUoXCJzLXJlc2l6ZVwiKTtcbiAgICBlbHNlIGlmIChyaWdodEJvcmRlcikgc2V0UmVzaXplKFwiZS1yZXNpemVcIik7XG4gICAgLy8gT3V0IG9mIGJvcmRlciBhcmVhLlxuICAgIGVsc2Ugc2V0UmVzaXplKCk7XG59XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbmltcG9ydCB7IG5ld1J1bnRpbWVDYWxsZXIsIG9iamVjdE5hbWVzIH0gZnJvbSBcIi4vcnVudGltZS5qc1wiO1xuY29uc3QgY2FsbCA9IG5ld1J1bnRpbWVDYWxsZXIob2JqZWN0TmFtZXMuQXBwbGljYXRpb24pO1xuXG5jb25zdCBIaWRlTWV0aG9kID0gMDtcbmNvbnN0IFNob3dNZXRob2QgPSAxO1xuY29uc3QgUXVpdE1ldGhvZCA9IDI7XG5cbi8qKlxuICogSGlkZXMgYSBjZXJ0YWluIG1ldGhvZCBieSBjYWxsaW5nIHRoZSBIaWRlTWV0aG9kIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSGlkZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gY2FsbChIaWRlTWV0aG9kKTtcbn1cblxuLyoqXG4gKiBDYWxscyB0aGUgU2hvd01ldGhvZCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gU2hvdygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gY2FsbChTaG93TWV0aG9kKTtcbn1cblxuLyoqXG4gKiBDYWxscyB0aGUgUXVpdE1ldGhvZCB0byB0ZXJtaW5hdGUgdGhlIHByb2dyYW0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBRdWl0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBjYWxsKFF1aXRNZXRob2QpO1xufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5pbXBvcnQgeyBDYW5jZWxsYWJsZVByb21pc2UsIHR5cGUgQ2FuY2VsbGFibGVQcm9taXNlV2l0aFJlc29sdmVycyB9IGZyb20gXCIuL2NhbmNlbGxhYmxlLmpzXCI7XG5pbXBvcnQgeyBuZXdSdW50aW1lQ2FsbGVyLCBvYmplY3ROYW1lcyB9IGZyb20gXCIuL3J1bnRpbWUuanNcIjtcbmltcG9ydCB7IG5hbm9pZCB9IGZyb20gXCIuL25hbm9pZC5qc1wiO1xuXG4vLyBTZXR1cFxud2luZG93Ll93YWlscyA9IHdpbmRvdy5fd2FpbHMgfHwge307XG53aW5kb3cuX3dhaWxzLmNhbGxSZXN1bHRIYW5kbGVyID0gcmVzdWx0SGFuZGxlcjtcbndpbmRvdy5fd2FpbHMuY2FsbEVycm9ySGFuZGxlciA9IGVycm9ySGFuZGxlcjtcblxudHlwZSBQcm9taXNlUmVzb2x2ZXJzID0gT21pdDxDYW5jZWxsYWJsZVByb21pc2VXaXRoUmVzb2x2ZXJzPGFueT4sIFwicHJvbWlzZVwiIHwgXCJvbmNhbmNlbGxlZFwiPlxuXG5jb25zdCBjYWxsID0gbmV3UnVudGltZUNhbGxlcihvYmplY3ROYW1lcy5DYWxsKTtcbmNvbnN0IGNhbmNlbENhbGwgPSBuZXdSdW50aW1lQ2FsbGVyKG9iamVjdE5hbWVzLkNhbmNlbENhbGwpO1xuY29uc3QgY2FsbFJlc3BvbnNlcyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlUmVzb2x2ZXJzPigpO1xuXG5jb25zdCBDYWxsQmluZGluZyA9IDA7XG5jb25zdCBDYW5jZWxNZXRob2QgPSAwXG5cbi8qKlxuICogSG9sZHMgYWxsIHJlcXVpcmVkIGluZm9ybWF0aW9uIGZvciBhIGJpbmRpbmcgY2FsbC5cbiAqIE1heSBwcm92aWRlIGVpdGhlciBhIG1ldGhvZCBJRCBvciBhIG1ldGhvZCBuYW1lLCBidXQgbm90IGJvdGguXG4gKi9cbmV4cG9ydCB0eXBlIENhbGxPcHRpb25zID0ge1xuICAgIC8qKiBUaGUgbnVtZXJpYyBJRCBvZiB0aGUgYm91bmQgbWV0aG9kIHRvIGNhbGwuICovXG4gICAgbWV0aG9kSUQ6IG51bWJlcjtcbiAgICAvKiogVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBib3VuZCBtZXRob2QgdG8gY2FsbC4gKi9cbiAgICBtZXRob2ROYW1lPzogbmV2ZXI7XG4gICAgLyoqIEFyZ3VtZW50cyB0byBiZSBwYXNzZWQgaW50byB0aGUgYm91bmQgbWV0aG9kLiAqL1xuICAgIGFyZ3M6IGFueVtdO1xufSB8IHtcbiAgICAvKiogVGhlIG51bWVyaWMgSUQgb2YgdGhlIGJvdW5kIG1ldGhvZCB0byBjYWxsLiAqL1xuICAgIG1ldGhvZElEPzogbmV2ZXI7XG4gICAgLyoqIFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgYm91bmQgbWV0aG9kIHRvIGNhbGwuICovXG4gICAgbWV0aG9kTmFtZTogc3RyaW5nO1xuICAgIC8qKiBBcmd1bWVudHMgdG8gYmUgcGFzc2VkIGludG8gdGhlIGJvdW5kIG1ldGhvZC4gKi9cbiAgICBhcmdzOiBhbnlbXTtcbn07XG5cbi8qKlxuICogRXhjZXB0aW9uIGNsYXNzIHRoYXQgd2lsbCBiZSB0aHJvd24gaW4gY2FzZSB0aGUgYm91bmQgbWV0aG9kIHJldHVybnMgYW4gZXJyb3IuXG4gKiBUaGUgdmFsdWUgb2YgdGhlIHtAbGluayBSdW50aW1lRXJyb3IjbmFtZX0gcHJvcGVydHkgaXMgXCJSdW50aW1lRXJyb3JcIi5cbiAqL1xuZXhwb3J0IGNsYXNzIFJ1bnRpbWVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFJ1bnRpbWVFcnJvciBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZSAtIFRoZSBlcnJvciBtZXNzYWdlLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBiZSBmb3J3YXJkZWQgdG8gdGhlIEVycm9yIGNvbnN0cnVjdG9yLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcsIG9wdGlvbnM/OiBFcnJvck9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSwgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiUnVudGltZUVycm9yXCI7XG4gICAgfVxufVxuXG4vKipcbiAqIEhhbmRsZXMgdGhlIHJlc3VsdCBvZiBhIGNhbGwgcmVxdWVzdC5cbiAqXG4gKiBAcGFyYW0gaWQgLSBUaGUgaWQgb2YgdGhlIHJlcXVlc3QgdG8gaGFuZGxlIHRoZSByZXN1bHQgZm9yLlxuICogQHBhcmFtIGRhdGEgLSBUaGUgcmVzdWx0IGRhdGEgb2YgdGhlIHJlcXVlc3QuXG4gKiBAcGFyYW0gaXNKU09OIC0gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRhdGEgaXMgSlNPTiBvciBub3QuXG4gKi9cbmZ1bmN0aW9uIHJlc3VsdEhhbmRsZXIoaWQ6IHN0cmluZywgZGF0YTogc3RyaW5nLCBpc0pTT046IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCByZXNvbHZlcnMgPSBnZXRBbmREZWxldGVSZXNwb25zZShpZCk7XG4gICAgaWYgKCFyZXNvbHZlcnMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghZGF0YSkge1xuICAgICAgICByZXNvbHZlcnMucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgIH0gZWxzZSBpZiAoIWlzSlNPTikge1xuICAgICAgICByZXNvbHZlcnMucmVzb2x2ZShkYXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzb2x2ZXJzLnJlc29sdmUoSlNPTi5wYXJzZShkYXRhKSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgICAgICByZXNvbHZlcnMucmVqZWN0KG5ldyBUeXBlRXJyb3IoXCJjb3VsZCBub3QgcGFyc2UgcmVzdWx0OiBcIiArIGVyci5tZXNzYWdlLCB7IGNhdXNlOiBlcnIgfSkpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIEhhbmRsZXMgdGhlIGVycm9yIGZyb20gYSBjYWxsIHJlcXVlc3QuXG4gKlxuICogQHBhcmFtIGlkIC0gVGhlIGlkIG9mIHRoZSBwcm9taXNlIGhhbmRsZXIuXG4gKiBAcGFyYW0gZGF0YSAtIFRoZSBlcnJvciBkYXRhIHRvIHJlamVjdCB0aGUgcHJvbWlzZSBoYW5kbGVyIHdpdGguXG4gKiBAcGFyYW0gaXNKU09OIC0gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRhdGEgaXMgSlNPTiBvciBub3QuXG4gKi9cbmZ1bmN0aW9uIGVycm9ySGFuZGxlcihpZDogc3RyaW5nLCBkYXRhOiBzdHJpbmcsIGlzSlNPTjogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IHJlc29sdmVycyA9IGdldEFuZERlbGV0ZVJlc3BvbnNlKGlkKTtcbiAgICBpZiAoIXJlc29sdmVycykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFpc0pTT04pIHtcbiAgICAgICAgcmVzb2x2ZXJzLnJlamVjdChuZXcgRXJyb3IoZGF0YSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBlcnJvcjogYW55O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZXJyb3IgPSBKU09OLnBhcnNlKGRhdGEpO1xuICAgICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICAgICAgcmVzb2x2ZXJzLnJlamVjdChuZXcgVHlwZUVycm9yKFwiY291bGQgbm90IHBhcnNlIGVycm9yOiBcIiArIGVyci5tZXNzYWdlLCB7IGNhdXNlOiBlcnIgfSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG9wdGlvbnM6IEVycm9yT3B0aW9ucyA9IHt9O1xuICAgICAgICBpZiAoZXJyb3IuY2F1c2UpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuY2F1c2UgPSBlcnJvci5jYXVzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBleGNlcHRpb247XG4gICAgICAgIHN3aXRjaCAoZXJyb3Iua2luZCkge1xuICAgICAgICAgICAgY2FzZSBcIlJlZmVyZW5jZUVycm9yXCI6XG4gICAgICAgICAgICAgICAgZXhjZXB0aW9uID0gbmV3IFJlZmVyZW5jZUVycm9yKGVycm9yLm1lc3NhZ2UsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIlR5cGVFcnJvclwiOlxuICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiA9IG5ldyBUeXBlRXJyb3IoZXJyb3IubWVzc2FnZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiUnVudGltZUVycm9yXCI6XG4gICAgICAgICAgICAgICAgZXhjZXB0aW9uID0gbmV3IFJ1bnRpbWVFcnJvcihlcnJvci5tZXNzYWdlLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgZXhjZXB0aW9uID0gbmV3IEVycm9yKGVycm9yLm1lc3NhZ2UsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzb2x2ZXJzLnJlamVjdChleGNlcHRpb24pO1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgYW5kIHJlbW92ZXMgdGhlIHJlc3BvbnNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gSUQgZnJvbSB0aGUgY2FsbFJlc3BvbnNlcyBtYXAuXG4gKlxuICogQHBhcmFtIGlkIC0gVGhlIElEIG9mIHRoZSByZXNwb25zZSB0byBiZSByZXRyaWV2ZWQgYW5kIHJlbW92ZWQuXG4gKiBAcmV0dXJucyBUaGUgcmVzcG9uc2Ugb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gSUQsIGlmIGFueS5cbiAqL1xuZnVuY3Rpb24gZ2V0QW5kRGVsZXRlUmVzcG9uc2UoaWQ6IHN0cmluZyk6IFByb21pc2VSZXNvbHZlcnMgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gY2FsbFJlc3BvbnNlcy5nZXQoaWQpO1xuICAgIGNhbGxSZXNwb25zZXMuZGVsZXRlKGlkKTtcbiAgICByZXR1cm4gcmVzcG9uc2U7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgdW5pcXVlIElEIHVzaW5nIHRoZSBuYW5vaWQgbGlicmFyeS5cbiAqXG4gKiBAcmV0dXJucyBBIHVuaXF1ZSBJRCB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBjYWxsUmVzcG9uc2VzIHNldC5cbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVJRCgpOiBzdHJpbmcge1xuICAgIGxldCByZXN1bHQ7XG4gICAgZG8ge1xuICAgICAgICByZXN1bHQgPSBuYW5vaWQoKTtcbiAgICB9IHdoaWxlIChjYWxsUmVzcG9uc2VzLmhhcyhyZXN1bHQpKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIENhbGwgYSBib3VuZCBtZXRob2QgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBjYWxsIG9wdGlvbnMuXG4gKlxuICogSW4gY2FzZSBvZiBmYWlsdXJlLCB0aGUgcmV0dXJuZWQgcHJvbWlzZSB3aWxsIHJlamVjdCB3aXRoIGFuIGV4Y2VwdGlvblxuICogYW1vbmcgUmVmZXJlbmNlRXJyb3IgKHVua25vd24gbWV0aG9kKSwgVHlwZUVycm9yICh3cm9uZyBhcmd1bWVudCBjb3VudCBvciB0eXBlKSxcbiAqIHtAbGluayBSdW50aW1lRXJyb3J9IChtZXRob2QgcmV0dXJuZWQgYW4gZXJyb3IpLCBvciBvdGhlciAobmV0d29yayBvciBpbnRlcm5hbCBlcnJvcnMpLlxuICogVGhlIGV4Y2VwdGlvbiBtaWdodCBoYXZlIGEgXCJjYXVzZVwiIGZpZWxkIHdpdGggdGhlIHZhbHVlIHJldHVybmVkXG4gKiBieSB0aGUgYXBwbGljYXRpb24tIG9yIHNlcnZpY2UtbGV2ZWwgZXJyb3IgbWFyc2hhbGluZyBmdW5jdGlvbnMuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBBIG1ldGhvZCBjYWxsIGRlc2NyaXB0b3IuXG4gKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIHRoZSBjYWxsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQ2FsbChvcHRpb25zOiBDYWxsT3B0aW9ucyk6IENhbmNlbGxhYmxlUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBpZCA9IGdlbmVyYXRlSUQoKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IENhbmNlbGxhYmxlUHJvbWlzZS53aXRoUmVzb2x2ZXJzPGFueT4oKTtcbiAgICBjYWxsUmVzcG9uc2VzLnNldChpZCwgeyByZXNvbHZlOiByZXN1bHQucmVzb2x2ZSwgcmVqZWN0OiByZXN1bHQucmVqZWN0IH0pO1xuXG4gICAgY29uc3QgcmVxdWVzdCA9IGNhbGwoQ2FsbEJpbmRpbmcsIE9iamVjdC5hc3NpZ24oeyBcImNhbGwtaWRcIjogaWQgfSwgb3B0aW9ucykpO1xuICAgIGxldCBydW5uaW5nID0gZmFsc2U7XG5cbiAgICByZXF1ZXN0LnRoZW4oKCkgPT4ge1xuICAgICAgICBydW5uaW5nID0gdHJ1ZTtcbiAgICB9LCAoZXJyKSA9PiB7XG4gICAgICAgIGNhbGxSZXNwb25zZXMuZGVsZXRlKGlkKTtcbiAgICAgICAgcmVzdWx0LnJlamVjdChlcnIpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgY2FuY2VsID0gKCkgPT4ge1xuICAgICAgICBjYWxsUmVzcG9uc2VzLmRlbGV0ZShpZCk7XG4gICAgICAgIHJldHVybiBjYW5jZWxDYWxsKENhbmNlbE1ldGhvZCwge1wiY2FsbC1pZFwiOiBpZH0pLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3Igd2hpbGUgcmVxdWVzdGluZyBiaW5kaW5nIGNhbGwgY2FuY2VsbGF0aW9uOlwiLCBlcnIpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgcmVzdWx0Lm9uY2FuY2VsbGVkID0gKCkgPT4ge1xuICAgICAgICBpZiAocnVubmluZykge1xuICAgICAgICAgICAgcmV0dXJuIGNhbmNlbCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3QudGhlbihjYW5jZWwpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiByZXN1bHQucHJvbWlzZTtcbn1cblxuLyoqXG4gKiBDYWxscyBhIGJvdW5kIG1ldGhvZCBieSBuYW1lIHdpdGggdGhlIHNwZWNpZmllZCBhcmd1bWVudHMuXG4gKiBTZWUge0BsaW5rIENhbGx9IGZvciBkZXRhaWxzLlxuICpcbiAqIEBwYXJhbSBtZXRob2ROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIG1ldGhvZCBpbiB0aGUgZm9ybWF0ICdwYWNrYWdlLnN0cnVjdC5tZXRob2QnLlxuICogQHBhcmFtIGFyZ3MgLSBUaGUgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIG1ldGhvZC5cbiAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgdGhlIG1ldGhvZCBjYWxsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQnlOYW1lKG1ldGhvZE5hbWU6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBDYW5jZWxsYWJsZVByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIENhbGwoeyBtZXRob2ROYW1lLCBhcmdzIH0pO1xufVxuXG4vKipcbiAqIENhbGxzIGEgbWV0aG9kIGJ5IGl0cyBudW1lcmljIElEIHdpdGggdGhlIHNwZWNpZmllZCBhcmd1bWVudHMuXG4gKiBTZWUge0BsaW5rIENhbGx9IGZvciBkZXRhaWxzLlxuICpcbiAqIEBwYXJhbSBtZXRob2RJRCAtIFRoZSBJRCBvZiB0aGUgbWV0aG9kIHRvIGNhbGwuXG4gKiBAcGFyYW0gYXJncyAtIFRoZSBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgbWV0aG9kLlxuICogQHJldHVybiBUaGUgcmVzdWx0IG9mIHRoZSBtZXRob2QgY2FsbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEJ5SUQobWV0aG9kSUQ6IG51bWJlciwgLi4uYXJnczogYW55W10pOiBDYW5jZWxsYWJsZVByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIENhbGwoeyBtZXRob2RJRCwgYXJncyB9KTtcbn1cbiIsICIvLyBTb3VyY2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9pbnNwZWN0LWpzL2lzLWNhbGxhYmxlXG5cbi8vIFRoZSBNSVQgTGljZW5zZSAoTUlUKVxuLy9cbi8vIENvcHlyaWdodCAoYykgMjAxNSBKb3JkYW4gSGFyYmFuZFxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbi8vIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuLy8gU09GVFdBUkUuXG5cbnZhciBmblRvU3RyID0gRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyIHJlZmxlY3RBcHBseTogdHlwZW9mIFJlZmxlY3QuYXBwbHkgfCBmYWxzZSB8IG51bGwgPSB0eXBlb2YgUmVmbGVjdCA9PT0gJ29iamVjdCcgJiYgUmVmbGVjdCAhPT0gbnVsbCAmJiBSZWZsZWN0LmFwcGx5O1xudmFyIGJhZEFycmF5TGlrZTogYW55O1xudmFyIGlzQ2FsbGFibGVNYXJrZXI6IGFueTtcbmlmICh0eXBlb2YgcmVmbGVjdEFwcGx5ID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBPYmplY3QuZGVmaW5lUHJvcGVydHkgPT09ICdmdW5jdGlvbicpIHtcbiAgICB0cnkge1xuICAgICAgICBiYWRBcnJheUxpa2UgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdsZW5ndGgnLCB7XG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBpc0NhbGxhYmxlTWFya2VyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaXNDYWxsYWJsZU1hcmtlciA9IHt9O1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdGhyb3ctbGl0ZXJhbFxuICAgICAgICByZWZsZWN0QXBwbHkoZnVuY3Rpb24gKCkgeyB0aHJvdyA0MjsgfSwgbnVsbCwgYmFkQXJyYXlMaWtlKTtcbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgIGlmIChfICE9PSBpc0NhbGxhYmxlTWFya2VyKSB7XG4gICAgICAgICAgICByZWZsZWN0QXBwbHkgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxufSBlbHNlIHtcbiAgICByZWZsZWN0QXBwbHkgPSBudWxsO1xufVxuXG52YXIgY29uc3RydWN0b3JSZWdleCA9IC9eXFxzKmNsYXNzXFxiLztcbnZhciBpc0VTNkNsYXNzRm4gPSBmdW5jdGlvbiBpc0VTNkNsYXNzRnVuY3Rpb24odmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICAgIHZhciBmblN0ciA9IGZuVG9TdHIuY2FsbCh2YWx1ZSk7XG4gICAgICAgIHJldHVybiBjb25zdHJ1Y3RvclJlZ2V4LnRlc3QoZm5TdHIpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBub3QgYSBmdW5jdGlvblxuICAgIH1cbn07XG5cbnZhciB0cnlGdW5jdGlvbk9iamVjdCA9IGZ1bmN0aW9uIHRyeUZ1bmN0aW9uVG9TdHIodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICAgIGlmIChpc0VTNkNsYXNzRm4odmFsdWUpKSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgICBmblRvU3RyLmNhbGwodmFsdWUpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59O1xudmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciBvYmplY3RDbGFzcyA9ICdbb2JqZWN0IE9iamVjdF0nO1xudmFyIGZuQ2xhc3MgPSAnW29iamVjdCBGdW5jdGlvbl0nO1xudmFyIGdlbkNsYXNzID0gJ1tvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dJztcbnZhciBkZGFDbGFzcyA9ICdbb2JqZWN0IEhUTUxBbGxDb2xsZWN0aW9uXSc7IC8vIElFIDExXG52YXIgZGRhQ2xhc3MyID0gJ1tvYmplY3QgSFRNTCBkb2N1bWVudC5hbGwgY2xhc3NdJztcbnZhciBkZGFDbGFzczMgPSAnW29iamVjdCBIVE1MQ29sbGVjdGlvbl0nOyAvLyBJRSA5LTEwXG52YXIgaGFzVG9TdHJpbmdUYWcgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmICEhU3ltYm9sLnRvU3RyaW5nVGFnOyAvLyBiZXR0ZXI6IHVzZSBgaGFzLXRvc3RyaW5ndGFnYFxuXG52YXIgaXNJRTY4ID0gISgwIGluIFssXSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc3BhcnNlLWFycmF5cywgY29tbWEtc3BhY2luZ1xuXG52YXIgaXNEREE6ICh2YWx1ZTogYW55KSA9PiBib29sZWFuID0gZnVuY3Rpb24gaXNEb2N1bWVudERvdEFsbCgpIHsgcmV0dXJuIGZhbHNlOyB9O1xuaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ29iamVjdCcpIHtcbiAgICAvLyBGaXJlZm94IDMgY2Fub25pY2FsaXplcyBEREEgdG8gdW5kZWZpbmVkIHdoZW4gaXQncyBub3QgYWNjZXNzZWQgZGlyZWN0bHlcbiAgICB2YXIgYWxsID0gZG9jdW1lbnQuYWxsO1xuICAgIGlmICh0b1N0ci5jYWxsKGFsbCkgPT09IHRvU3RyLmNhbGwoZG9jdW1lbnQuYWxsKSkge1xuICAgICAgICBpc0REQSA9IGZ1bmN0aW9uIGlzRG9jdW1lbnREb3RBbGwodmFsdWUpIHtcbiAgICAgICAgICAgIC8qIGdsb2JhbHMgZG9jdW1lbnQ6IGZhbHNlICovXG4gICAgICAgICAgICAvLyBpbiBJRSA2LTgsIHR5cGVvZiBkb2N1bWVudC5hbGwgaXMgXCJvYmplY3RcIiBhbmQgaXQncyB0cnV0aHlcbiAgICAgICAgICAgIGlmICgoaXNJRTY4IHx8ICF2YWx1ZSkgJiYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JykpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3RyID0gdG9TdHIuY2FsbCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHIgPT09IGRkYUNsYXNzXG4gICAgICAgICAgICAgICAgICAgICAgICB8fCBzdHIgPT09IGRkYUNsYXNzMlxuICAgICAgICAgICAgICAgICAgICAgICAgfHwgc3RyID09PSBkZGFDbGFzczMgLy8gb3BlcmEgMTIuMTZcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IHN0ciA9PT0gb2JqZWN0Q2xhc3MgLy8gSUUgNi04XG4gICAgICAgICAgICAgICAgICAgICkgJiYgdmFsdWUoJycpID09IG51bGw7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZXFlcWVxXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgeyAvKiovIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGlzQ2FsbGFibGVSZWZBcHBseTxUPih2YWx1ZTogVCB8IHVua25vd24pOiB2YWx1ZSBpcyAoLi4uYXJnczogYW55W10pID0+IGFueSAge1xuICAgIGlmIChpc0REQSh2YWx1ZSkpIHsgcmV0dXJuIHRydWU7IH1cbiAgICBpZiAoIXZhbHVlKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgeyByZXR1cm4gZmFsc2U7IH1cbiAgICB0cnkge1xuICAgICAgICAocmVmbGVjdEFwcGx5IGFzIGFueSkodmFsdWUsIG51bGwsIGJhZEFycmF5TGlrZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoZSAhPT0gaXNDYWxsYWJsZU1hcmtlcikgeyByZXR1cm4gZmFsc2U7IH1cbiAgICB9XG4gICAgcmV0dXJuICFpc0VTNkNsYXNzRm4odmFsdWUpICYmIHRyeUZ1bmN0aW9uT2JqZWN0KHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gaXNDYWxsYWJsZU5vUmVmQXBwbHk8VD4odmFsdWU6IFQgfCB1bmtub3duKTogdmFsdWUgaXMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkge1xuICAgIGlmIChpc0REQSh2YWx1ZSkpIHsgcmV0dXJuIHRydWU7IH1cbiAgICBpZiAoIXZhbHVlKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBpZiAoaGFzVG9TdHJpbmdUYWcpIHsgcmV0dXJuIHRyeUZ1bmN0aW9uT2JqZWN0KHZhbHVlKTsgfVxuICAgIGlmIChpc0VTNkNsYXNzRm4odmFsdWUpKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIHZhciBzdHJDbGFzcyA9IHRvU3RyLmNhbGwodmFsdWUpO1xuICAgIGlmIChzdHJDbGFzcyAhPT0gZm5DbGFzcyAmJiBzdHJDbGFzcyAhPT0gZ2VuQ2xhc3MgJiYgISgvXlxcW29iamVjdCBIVE1MLykudGVzdChzdHJDbGFzcykpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgcmV0dXJuIHRyeUZ1bmN0aW9uT2JqZWN0KHZhbHVlKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHJlZmxlY3RBcHBseSA/IGlzQ2FsbGFibGVSZWZBcHBseSA6IGlzQ2FsbGFibGVOb1JlZkFwcGx5O1xuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5pbXBvcnQgaXNDYWxsYWJsZSBmcm9tIFwiLi9jYWxsYWJsZS5qc1wiO1xuXG4vKipcbiAqIEV4Y2VwdGlvbiBjbGFzcyB0aGF0IHdpbGwgYmUgdXNlZCBhcyByZWplY3Rpb24gcmVhc29uXG4gKiBpbiBjYXNlIGEge0BsaW5rIENhbmNlbGxhYmxlUHJvbWlzZX0gaXMgY2FuY2VsbGVkIHN1Y2Nlc3NmdWxseS5cbiAqXG4gKiBUaGUgdmFsdWUgb2YgdGhlIHtAbGluayBuYW1lfSBwcm9wZXJ0eSBpcyB0aGUgc3RyaW5nIGBcIkNhbmNlbEVycm9yXCJgLlxuICogVGhlIHZhbHVlIG9mIHRoZSB7QGxpbmsgY2F1c2V9IHByb3BlcnR5IGlzIHRoZSBjYXVzZSBwYXNzZWQgdG8gdGhlIGNhbmNlbCBtZXRob2QsIGlmIGFueS5cbiAqL1xuZXhwb3J0IGNsYXNzIENhbmNlbEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgYSBuZXcgYENhbmNlbEVycm9yYCBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZSAtIFRoZSBlcnJvciBtZXNzYWdlLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBiZSBmb3J3YXJkZWQgdG8gdGhlIEVycm9yIGNvbnN0cnVjdG9yLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcsIG9wdGlvbnM/OiBFcnJvck9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSwgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiQ2FuY2VsRXJyb3JcIjtcbiAgICB9XG59XG5cbi8qKlxuICogRXhjZXB0aW9uIGNsYXNzIHRoYXQgd2lsbCBiZSByZXBvcnRlZCBhcyBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uXG4gKiBpbiBjYXNlIGEge0BsaW5rIENhbmNlbGxhYmxlUHJvbWlzZX0gcmVqZWN0cyBhZnRlciBiZWluZyBjYW5jZWxsZWQsXG4gKiBvciB3aGVuIHRoZSBgb25jYW5jZWxsZWRgIGNhbGxiYWNrIHRocm93cyBvciByZWplY3RzLlxuICpcbiAqIFRoZSB2YWx1ZSBvZiB0aGUge0BsaW5rIG5hbWV9IHByb3BlcnR5IGlzIHRoZSBzdHJpbmcgYFwiQ2FuY2VsbGVkUmVqZWN0aW9uRXJyb3JcImAuXG4gKiBUaGUgdmFsdWUgb2YgdGhlIHtAbGluayBjYXVzZX0gcHJvcGVydHkgaXMgdGhlIHJlYXNvbiB0aGUgcHJvbWlzZSByZWplY3RlZCB3aXRoLlxuICpcbiAqIEJlY2F1c2UgdGhlIG9yaWdpbmFsIHByb21pc2Ugd2FzIGNhbmNlbGxlZCxcbiAqIGEgd3JhcHBlciBwcm9taXNlIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSB1bmhhbmRsZWQgcmVqZWN0aW9uIGxpc3RlbmVyIGluc3RlYWQuXG4gKiBUaGUge0BsaW5rIHByb21pc2V9IHByb3BlcnR5IGhvbGRzIGEgcmVmZXJlbmNlIHRvIHRoZSBvcmlnaW5hbCBwcm9taXNlLlxuICovXG5leHBvcnQgY2xhc3MgQ2FuY2VsbGVkUmVqZWN0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgLyoqXG4gICAgICogSG9sZHMgYSByZWZlcmVuY2UgdG8gdGhlIHByb21pc2UgdGhhdCB3YXMgY2FuY2VsbGVkIGFuZCB0aGVuIHJlamVjdGVkLlxuICAgICAqL1xuICAgIHByb21pc2U6IENhbmNlbGxhYmxlUHJvbWlzZTx1bmtub3duPjtcblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgYSBuZXcgYENhbmNlbGxlZFJlamVjdGlvbkVycm9yYCBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0gcHJvbWlzZSAtIFRoZSBwcm9taXNlIHRoYXQgY2F1c2VkIHRoZSBlcnJvciBvcmlnaW5hbGx5LlxuICAgICAqIEBwYXJhbSByZWFzb24gLSBUaGUgcmVqZWN0aW9uIHJlYXNvbi5cbiAgICAgKiBAcGFyYW0gaW5mbyAtIEFuIG9wdGlvbmFsIGluZm9ybWF0aXZlIG1lc3NhZ2Ugc3BlY2lmeWluZyB0aGUgY2lyY3Vtc3RhbmNlcyBpbiB3aGljaCB0aGUgZXJyb3Igd2FzIHRocm93bi5cbiAgICAgKiAgICAgICAgICAgICAgIERlZmF1bHRzIHRvIHRoZSBzdHJpbmcgYFwiVW5oYW5kbGVkIHJlamVjdGlvbiBpbiBjYW5jZWxsZWQgcHJvbWlzZS5cImAuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocHJvbWlzZTogQ2FuY2VsbGFibGVQcm9taXNlPHVua25vd24+LCByZWFzb24/OiBhbnksIGluZm8/OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKGluZm8gPz8gXCJVbmhhbmRsZWQgcmVqZWN0aW9uIGluIGNhbmNlbGxlZCBwcm9taXNlLlwiKSArIFwiIFJlYXNvbjogXCIgKyBlcnJvck1lc3NhZ2UocmVhc29uKSwgeyBjYXVzZTogcmVhc29uIH0pO1xuICAgICAgICB0aGlzLnByb21pc2UgPSBwcm9taXNlO1xuICAgICAgICB0aGlzLm5hbWUgPSBcIkNhbmNlbGxlZFJlamVjdGlvbkVycm9yXCI7XG4gICAgfVxufVxuXG50eXBlIENhbmNlbGxhYmxlUHJvbWlzZVJlc29sdmVyPFQ+ID0gKHZhbHVlOiBUIHwgUHJvbWlzZUxpa2U8VD4gfCBDYW5jZWxsYWJsZVByb21pc2VMaWtlPFQ+KSA9PiB2b2lkO1xudHlwZSBDYW5jZWxsYWJsZVByb21pc2VSZWplY3RvciA9IChyZWFzb24/OiBhbnkpID0+IHZvaWQ7XG50eXBlIENhbmNlbGxhYmxlUHJvbWlzZUNhbmNlbGxlciA9IChjYXVzZT86IGFueSkgPT4gdm9pZCB8IFByb21pc2VMaWtlPHZvaWQ+O1xudHlwZSBDYW5jZWxsYWJsZVByb21pc2VFeGVjdXRvcjxUPiA9IChyZXNvbHZlOiBDYW5jZWxsYWJsZVByb21pc2VSZXNvbHZlcjxUPiwgcmVqZWN0OiBDYW5jZWxsYWJsZVByb21pc2VSZWplY3RvcikgPT4gdm9pZDtcblxuZXhwb3J0IGludGVyZmFjZSBDYW5jZWxsYWJsZVByb21pc2VMaWtlPFQ+IHtcbiAgICB0aGVuPFRSZXN1bHQxID0gVCwgVFJlc3VsdDIgPSBuZXZlcj4ob25mdWxmaWxsZWQ/OiAoKHZhbHVlOiBUKSA9PiBUUmVzdWx0MSB8IFByb21pc2VMaWtlPFRSZXN1bHQxPiB8IENhbmNlbGxhYmxlUHJvbWlzZUxpa2U8VFJlc3VsdDE+KSB8IHVuZGVmaW5lZCB8IG51bGwsIG9ucmVqZWN0ZWQ/OiAoKHJlYXNvbjogYW55KSA9PiBUUmVzdWx0MiB8IFByb21pc2VMaWtlPFRSZXN1bHQyPiB8IENhbmNlbGxhYmxlUHJvbWlzZUxpa2U8VFJlc3VsdDI+KSB8IHVuZGVmaW5lZCB8IG51bGwpOiBDYW5jZWxsYWJsZVByb21pc2VMaWtlPFRSZXN1bHQxIHwgVFJlc3VsdDI+O1xuICAgIGNhbmNlbChjYXVzZT86IGFueSk6IHZvaWQ7XG59XG5cbi8qKlxuICogV3JhcHMgYSBjYW5jZWxsYWJsZSBwcm9taXNlIGFsb25nIHdpdGggaXRzIHJlc29sdXRpb24gbWV0aG9kcy5cbiAqIFRoZSBgb25jYW5jZWxsZWRgIGZpZWxkIHdpbGwgYmUgbnVsbCBpbml0aWFsbHkgYnV0IG1heSBiZSBzZXQgdG8gcHJvdmlkZSBhIGN1c3RvbSBjYW5jZWxsYXRpb24gZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FuY2VsbGFibGVQcm9taXNlV2l0aFJlc29sdmVyczxUPiB7XG4gICAgcHJvbWlzZTogQ2FuY2VsbGFibGVQcm9taXNlPFQ+O1xuICAgIHJlc29sdmU6IENhbmNlbGxhYmxlUHJvbWlzZVJlc29sdmVyPFQ+O1xuICAgIHJlamVjdDogQ2FuY2VsbGFibGVQcm9taXNlUmVqZWN0b3I7XG4gICAgb25jYW5jZWxsZWQ6IENhbmNlbGxhYmxlUHJvbWlzZUNhbmNlbGxlciB8IG51bGw7XG59XG5cbmludGVyZmFjZSBDYW5jZWxsYWJsZVByb21pc2VTdGF0ZSB7XG4gICAgcmVhZG9ubHkgcm9vdDogQ2FuY2VsbGFibGVQcm9taXNlU3RhdGU7XG4gICAgcmVzb2x2aW5nOiBib29sZWFuO1xuICAgIHNldHRsZWQ6IGJvb2xlYW47XG4gICAgcmVhc29uPzogQ2FuY2VsRXJyb3I7XG59XG5cbi8vIFByaXZhdGUgZmllbGQgbmFtZXMuXG5jb25zdCBiYXJyaWVyU3ltID0gU3ltYm9sKFwiYmFycmllclwiKTtcbmNvbnN0IGNhbmNlbEltcGxTeW0gPSBTeW1ib2woXCJjYW5jZWxJbXBsXCIpO1xuY29uc3Qgc3BlY2llcyA9IFN5bWJvbC5zcGVjaWVzID8/IFN5bWJvbChcInNwZWNpZXNQb2x5ZmlsbFwiKTtcblxuLyoqXG4gKiBBIHByb21pc2Ugd2l0aCBhbiBhdHRhY2hlZCBtZXRob2QgZm9yIGNhbmNlbGxpbmcgbG9uZy1ydW5uaW5nIG9wZXJhdGlvbnMgKHNlZSB7QGxpbmsgQ2FuY2VsbGFibGVQcm9taXNlI2NhbmNlbH0pLlxuICogQ2FuY2VsbGF0aW9uIGNhbiBvcHRpb25hbGx5IGJlIGJvdW5kIHRvIGFuIHtAbGluayBBYm9ydFNpZ25hbH1cbiAqIGZvciBiZXR0ZXIgY29tcG9zYWJpbGl0eSAoc2VlIHtAbGluayBDYW5jZWxsYWJsZVByb21pc2UjY2FuY2VsT259KS5cbiAqXG4gKiBDYW5jZWxsaW5nIGEgcGVuZGluZyBwcm9taXNlIHdpbGwgcmVzdWx0IGluIGFuIGltbWVkaWF0ZSByZWplY3Rpb25cbiAqIHdpdGggYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIENhbmNlbEVycm9yfSBhcyByZWFzb24sXG4gKiBidXQgd2hvZXZlciBzdGFydGVkIHRoZSBwcm9taXNlIHdpbGwgYmUgcmVzcG9uc2libGVcbiAqIGZvciBhY3R1YWxseSBhYm9ydGluZyB0aGUgdW5kZXJseWluZyBvcGVyYXRpb24uXG4gKiBUbyB0aGlzIHB1cnBvc2UsIHRoZSBjb25zdHJ1Y3RvciBhbmQgYWxsIGNoYWluaW5nIG1ldGhvZHNcbiAqIGFjY2VwdCBvcHRpb25hbCBjYW5jZWxsYXRpb24gY2FsbGJhY2tzLlxuICpcbiAqIElmIGEgYENhbmNlbGxhYmxlUHJvbWlzZWAgc3RpbGwgcmVzb2x2ZXMgYWZ0ZXIgaGF2aW5nIGJlZW4gY2FuY2VsbGVkLFxuICogdGhlIHJlc3VsdCB3aWxsIGJlIGRpc2NhcmRlZC4gSWYgaXQgcmVqZWN0cywgdGhlIHJlYXNvblxuICogd2lsbCBiZSByZXBvcnRlZCBhcyBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uLFxuICogd3JhcHBlZCBpbiBhIHtAbGluayBDYW5jZWxsZWRSZWplY3Rpb25FcnJvcn0gaW5zdGFuY2UuXG4gKiBUbyBmYWNpbGl0YXRlIHRoZSBoYW5kbGluZyBvZiBjYW5jZWxsYXRpb24gcmVxdWVzdHMsXG4gKiBjYW5jZWxsZWQgYENhbmNlbGxhYmxlUHJvbWlzZWBzIHdpbGwgX25vdF8gcmVwb3J0IHVuaGFuZGxlZCBgQ2FuY2VsRXJyb3Jgc1xuICogd2hvc2UgYGNhdXNlYCBmaWVsZCBpcyB0aGUgc2FtZSBhcyB0aGUgb25lIHdpdGggd2hpY2ggdGhlIGN1cnJlbnQgcHJvbWlzZSB3YXMgY2FuY2VsbGVkLlxuICpcbiAqIEFsbCB1c3VhbCBwcm9taXNlIG1ldGhvZHMgYXJlIGRlZmluZWQgYW5kIHJldHVybiBhIGBDYW5jZWxsYWJsZVByb21pc2VgXG4gKiB3aG9zZSBjYW5jZWwgbWV0aG9kIHdpbGwgY2FuY2VsIHRoZSBwYXJlbnQgb3BlcmF0aW9uIGFzIHdlbGwsIHByb3BhZ2F0aW5nIHRoZSBjYW5jZWxsYXRpb24gcmVhc29uXG4gKiB1cHdhcmRzIHRocm91Z2ggcHJvbWlzZSBjaGFpbnMuXG4gKiBDb252ZXJzZWx5LCBjYW5jZWxsaW5nIGEgcHJvbWlzZSB3aWxsIG5vdCBhdXRvbWF0aWNhbGx5IGNhbmNlbCBkZXBlbmRlbnQgcHJvbWlzZXMgZG93bnN0cmVhbTpcbiAqIGBgYHRzXG4gKiBsZXQgcm9vdCA9IG5ldyBDYW5jZWxsYWJsZVByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4geyAuLi4gfSk7XG4gKiBsZXQgY2hpbGQxID0gcm9vdC50aGVuKCgpID0+IHsgLi4uIH0pO1xuICogbGV0IGNoaWxkMiA9IGNoaWxkMS50aGVuKCgpID0+IHsgLi4uIH0pO1xuICogbGV0IGNoaWxkMyA9IHJvb3QuY2F0Y2goKCkgPT4geyAuLi4gfSk7XG4gKiBjaGlsZDEuY2FuY2VsKCk7IC8vIENhbmNlbHMgY2hpbGQxIGFuZCByb290LCBidXQgbm90IGNoaWxkMiBvciBjaGlsZDNcbiAqIGBgYFxuICogQ2FuY2VsbGluZyBhIHByb21pc2UgdGhhdCBoYXMgYWxyZWFkeSBzZXR0bGVkIGlzIHNhZmUgYW5kIGhhcyBubyBjb25zZXF1ZW5jZS5cbiAqXG4gKiBUaGUgYGNhbmNlbGAgbWV0aG9kIHJldHVybnMgYSBwcm9taXNlIHRoYXQgX2Fsd2F5cyBmdWxmaWxsc19cbiAqIGFmdGVyIHRoZSB3aG9sZSBjaGFpbiBoYXMgcHJvY2Vzc2VkIHRoZSBjYW5jZWwgcmVxdWVzdFxuICogYW5kIGFsbCBhdHRhY2hlZCBjYWxsYmFja3MgdXAgdG8gdGhhdCBtb21lbnQgaGF2ZSBydW4uXG4gKlxuICogQWxsIEVTMjAyNCBwcm9taXNlIG1ldGhvZHMgKHN0YXRpYyBhbmQgaW5zdGFuY2UpIGFyZSBkZWZpbmVkIG9uIENhbmNlbGxhYmxlUHJvbWlzZSxcbiAqIGJ1dCBhY3R1YWwgYXZhaWxhYmlsaXR5IG1heSB2YXJ5IHdpdGggT1Mvd2VidmlldyB2ZXJzaW9uLlxuICpcbiAqIEluIGxpbmUgd2l0aCB0aGUgcHJvcG9zYWwgYXQgaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtcm0tYnVpbHRpbi1zdWJjbGFzc2luZyxcbiAqIGBDYW5jZWxsYWJsZVByb21pc2VgIGRvZXMgbm90IHN1cHBvcnQgdHJhbnNwYXJlbnQgc3ViY2xhc3NpbmcuXG4gKiBFeHRlbmRlcnMgc2hvdWxkIHRha2UgY2FyZSB0byBwcm92aWRlIHRoZWlyIG93biBtZXRob2QgaW1wbGVtZW50YXRpb25zLlxuICogVGhpcyBtaWdodCBiZSByZWNvbnNpZGVyZWQgaW4gY2FzZSB0aGUgcHJvcG9zYWwgaXMgcmV0aXJlZC5cbiAqXG4gKiBDYW5jZWxsYWJsZVByb21pc2UgaXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgRE9NIFByb21pc2Ugb2JqZWN0XG4gKiBhbmQgaXMgY29tcGxpYW50IHdpdGggdGhlIFtQcm9taXNlcy9BKyBzcGVjaWZpY2F0aW9uXShodHRwczovL3Byb21pc2VzYXBsdXMuY29tLylcbiAqIChpdCBwYXNzZXMgdGhlIFtjb21wbGlhbmNlIHN1aXRlXShodHRwczovL2dpdGh1Yi5jb20vcHJvbWlzZXMtYXBsdXMvcHJvbWlzZXMtdGVzdHMpKVxuICogaWYgc28gaXMgdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBDYW5jZWxsYWJsZVByb21pc2U8VD4gZXh0ZW5kcyBQcm9taXNlPFQ+IGltcGxlbWVudHMgUHJvbWlzZUxpa2U8VD4sIENhbmNlbGxhYmxlUHJvbWlzZUxpa2U8VD4ge1xuICAgIC8vIFByaXZhdGUgZmllbGRzLlxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBwcml2YXRlIFtiYXJyaWVyU3ltXSE6IFBhcnRpYWw8UHJvbWlzZVdpdGhSZXNvbHZlcnM8dm9pZD4+IHwgbnVsbDtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBbY2FuY2VsSW1wbFN5bV0hOiAocmVhc29uOiBDYW5jZWxFcnJvcikgPT4gdm9pZCB8IFByb21pc2VMaWtlPHZvaWQ+O1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBgQ2FuY2VsbGFibGVQcm9taXNlYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBleGVjdXRvciAtIEEgY2FsbGJhY2sgdXNlZCB0byBpbml0aWFsaXplIHRoZSBwcm9taXNlLiBUaGlzIGNhbGxiYWNrIGlzIHBhc3NlZCB0d28gYXJndW1lbnRzOlxuICAgICAqICAgICAgICAgICAgICAgICAgIGEgYHJlc29sdmVgIGNhbGxiYWNrIHVzZWQgdG8gcmVzb2x2ZSB0aGUgcHJvbWlzZSB3aXRoIGEgdmFsdWVcbiAgICAgKiAgICAgICAgICAgICAgICAgICBvciB0aGUgcmVzdWx0IG9mIGFub3RoZXIgcHJvbWlzZSAocG9zc2libHkgY2FuY2VsbGFibGUpLFxuICAgICAqICAgICAgICAgICAgICAgICAgIGFuZCBhIGByZWplY3RgIGNhbGxiYWNrIHVzZWQgdG8gcmVqZWN0IHRoZSBwcm9taXNlIHdpdGggYSBwcm92aWRlZCByZWFzb24gb3IgZXJyb3IuXG4gICAgICogICAgICAgICAgICAgICAgICAgSWYgdGhlIHZhbHVlIHByb3ZpZGVkIHRvIHRoZSBgcmVzb2x2ZWAgY2FsbGJhY2sgaXMgYSB0aGVuYWJsZSBfYW5kXyBjYW5jZWxsYWJsZSBvYmplY3RcbiAgICAgKiAgICAgICAgICAgICAgICAgICAoaXQgaGFzIGEgYHRoZW5gIF9hbmRfIGEgYGNhbmNlbGAgbWV0aG9kKSxcbiAgICAgKiAgICAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb24gcmVxdWVzdHMgd2lsbCBiZSBmb3J3YXJkZWQgdG8gdGhhdCBvYmplY3QgYW5kIHRoZSBvbmNhbmNlbGxlZCB3aWxsIG5vdCBiZSBpbnZva2VkIGFueW1vcmUuXG4gICAgICogICAgICAgICAgICAgICAgICAgSWYgYW55IG9uZSBvZiB0aGUgdHdvIGNhbGxiYWNrcyBpcyBjYWxsZWQgX2FmdGVyXyB0aGUgcHJvbWlzZSBoYXMgYmVlbiBjYW5jZWxsZWQsXG4gICAgICogICAgICAgICAgICAgICAgICAgdGhlIHByb3ZpZGVkIHZhbHVlcyB3aWxsIGJlIGNhbmNlbGxlZCBhbmQgcmVzb2x2ZWQgYXMgdXN1YWwsXG4gICAgICogICAgICAgICAgICAgICAgICAgYnV0IHRoZWlyIHJlc3VsdHMgd2lsbCBiZSBkaXNjYXJkZWQuXG4gICAgICogICAgICAgICAgICAgICAgICAgSG93ZXZlciwgaWYgdGhlIHJlc29sdXRpb24gcHJvY2VzcyB1bHRpbWF0ZWx5IGVuZHMgdXAgaW4gYSByZWplY3Rpb25cbiAgICAgKiAgICAgICAgICAgICAgICAgICB0aGF0IGlzIG5vdCBkdWUgdG8gY2FuY2VsbGF0aW9uLCB0aGUgcmVqZWN0aW9uIHJlYXNvblxuICAgICAqICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgd3JhcHBlZCBpbiBhIHtAbGluayBDYW5jZWxsZWRSZWplY3Rpb25FcnJvcn1cbiAgICAgKiAgICAgICAgICAgICAgICAgICBhbmQgYnViYmxlZCB1cCBhcyBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uLlxuICAgICAqIEBwYXJhbSBvbmNhbmNlbGxlZCAtIEl0IGlzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBlbnN1cmUgdGhhdCBhbnkgb3BlcmF0aW9uXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgc3RhcnRlZCBieSB0aGUgZXhlY3V0b3IgaXMgcHJvcGVybHkgaGFsdGVkIHVwb24gY2FuY2VsbGF0aW9uLlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIFRoaXMgb3B0aW9uYWwgY2FsbGJhY2sgY2FuIGJlIHVzZWQgdG8gdGhhdCBwdXJwb3NlLlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIEl0IHdpbGwgYmUgY2FsbGVkIF9zeW5jaHJvbm91c2x5XyB3aXRoIGEgY2FuY2VsbGF0aW9uIGNhdXNlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgd2hlbiBjYW5jZWxsYXRpb24gaXMgcmVxdWVzdGVkLCBfYWZ0ZXJfIHRoZSBwcm9taXNlIGhhcyBhbHJlYWR5IHJlamVjdGVkXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgd2l0aCBhIHtAbGluayBDYW5jZWxFcnJvcn0sIGJ1dCBfYmVmb3JlX1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgIGFueSB7QGxpbmsgdGhlbn0ve0BsaW5rIGNhdGNofS97QGxpbmsgZmluYWxseX0gY2FsbGJhY2sgcnVucy5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgY2FsbGJhY2sgcmV0dXJucyBhIHRoZW5hYmxlLCB0aGUgcHJvbWlzZSByZXR1cm5lZCBmcm9tIHtAbGluayBjYW5jZWx9XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgd2lsbCBvbmx5IGZ1bGZpbGwgYWZ0ZXIgdGhlIGZvcm1lciBoYXMgc2V0dGxlZC5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBVbmhhbmRsZWQgZXhjZXB0aW9ucyBvciByZWplY3Rpb25zIGZyb20gdGhlIGNhbGxiYWNrIHdpbGwgYmUgd3JhcHBlZFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIGluIGEge0BsaW5rIENhbmNlbGxlZFJlamVjdGlvbkVycm9yfSBhbmQgYnViYmxlZCB1cCBhcyB1bmhhbmRsZWQgcmVqZWN0aW9ucy5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgYHJlc29sdmVgIGNhbGxiYWNrIGlzIGNhbGxlZCBiZWZvcmUgY2FuY2VsbGF0aW9uIHdpdGggYSBjYW5jZWxsYWJsZSBwcm9taXNlLFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyBvbiB0aGlzIHByb21pc2Ugd2lsbCBiZSBkaXZlcnRlZCB0byB0aGF0IHByb21pc2UsXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZSBvcmlnaW5hbCBgb25jYW5jZWxsZWRgIGNhbGxiYWNrIHdpbGwgYmUgZGlzY2FyZGVkLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGV4ZWN1dG9yOiBDYW5jZWxsYWJsZVByb21pc2VFeGVjdXRvcjxUPiwgb25jYW5jZWxsZWQ/OiBDYW5jZWxsYWJsZVByb21pc2VDYW5jZWxsZXIpIHtcbiAgICAgICAgbGV0IHJlc29sdmUhOiAodmFsdWU6IFQgfCBQcm9taXNlTGlrZTxUPikgPT4gdm9pZDtcbiAgICAgICAgbGV0IHJlamVjdCE6IChyZWFzb24/OiBhbnkpID0+IHZvaWQ7XG4gICAgICAgIHN1cGVyKChyZXMsIHJlaikgPT4geyByZXNvbHZlID0gcmVzOyByZWplY3QgPSByZWo7IH0pO1xuXG4gICAgICAgIGlmICgodGhpcy5jb25zdHJ1Y3RvciBhcyBhbnkpW3NwZWNpZXNdICE9PSBQcm9taXNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2FuY2VsbGFibGVQcm9taXNlIGRvZXMgbm90IHN1cHBvcnQgdHJhbnNwYXJlbnQgc3ViY2xhc3NpbmcuIFBsZWFzZSByZWZyYWluIGZyb20gb3ZlcnJpZGluZyB0aGUgW1N5bWJvbC5zcGVjaWVzXSBzdGF0aWMgcHJvcGVydHkuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHByb21pc2U6IENhbmNlbGxhYmxlUHJvbWlzZVdpdGhSZXNvbHZlcnM8VD4gPSB7XG4gICAgICAgICAgICBwcm9taXNlOiB0aGlzLFxuICAgICAgICAgICAgcmVzb2x2ZSxcbiAgICAgICAgICAgIHJlamVjdCxcbiAgICAgICAgICAgIGdldCBvbmNhbmNlbGxlZCgpIHsgcmV0dXJuIG9uY2FuY2VsbGVkID8/IG51bGw7IH0sXG4gICAgICAgICAgICBzZXQgb25jYW5jZWxsZWQoY2IpIHsgb25jYW5jZWxsZWQgPSBjYiA/PyB1bmRlZmluZWQ7IH1cbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBzdGF0ZTogQ2FuY2VsbGFibGVQcm9taXNlU3RhdGUgPSB7XG4gICAgICAgICAgICBnZXQgcm9vdCgpIHsgcmV0dXJuIHN0YXRlOyB9LFxuICAgICAgICAgICAgcmVzb2x2aW5nOiBmYWxzZSxcbiAgICAgICAgICAgIHNldHRsZWQ6IGZhbHNlXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gU2V0dXAgY2FuY2VsbGF0aW9uIHN5c3RlbS5cbiAgICAgICAgdm9pZCBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgICAgICAgICBbYmFycmllclN5bV06IHtcbiAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW2NhbmNlbEltcGxTeW1dOiB7XG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGNhbmNlbGxlckZvcihwcm9taXNlLCBzdGF0ZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUnVuIHRoZSBhY3R1YWwgZXhlY3V0b3IuXG4gICAgICAgIGNvbnN0IHJlamVjdG9yID0gcmVqZWN0b3JGb3IocHJvbWlzZSwgc3RhdGUpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZXhlY3V0b3IocmVzb2x2ZXJGb3IocHJvbWlzZSwgc3RhdGUpLCByZWplY3Rvcik7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKHN0YXRlLnJlc29sdmluZykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVW5oYW5kbGVkIGV4Y2VwdGlvbiBpbiBDYW5jZWxsYWJsZVByb21pc2UgZXhlY3V0b3IuXCIsIGVycik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlamVjdG9yKGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYW5jZWxzIGltbWVkaWF0ZWx5IHRoZSBleGVjdXRpb24gb2YgdGhlIG9wZXJhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBwcm9taXNlLlxuICAgICAqIFRoZSBwcm9taXNlIHJlamVjdHMgd2l0aCBhIHtAbGluayBDYW5jZWxFcnJvcn0gaW5zdGFuY2UgYXMgcmVhc29uLFxuICAgICAqIHdpdGggdGhlIHtAbGluayBDYW5jZWxFcnJvciNjYXVzZX0gcHJvcGVydHkgc2V0IHRvIHRoZSBnaXZlbiBhcmd1bWVudCwgaWYgYW55LlxuICAgICAqXG4gICAgICogSGFzIG5vIGVmZmVjdCBpZiBjYWxsZWQgYWZ0ZXIgdGhlIHByb21pc2UgaGFzIGFscmVhZHkgc2V0dGxlZDtcbiAgICAgKiByZXBlYXRlZCBjYWxscyBpbiBwYXJ0aWN1bGFyIGFyZSBzYWZlLCBidXQgb25seSB0aGUgZmlyc3Qgb25lXG4gICAgICogd2lsbCBzZXQgdGhlIGNhbmNlbGxhdGlvbiBjYXVzZS5cbiAgICAgKlxuICAgICAqIFRoZSBgQ2FuY2VsRXJyb3JgIGV4Y2VwdGlvbiBfbmVlZCBub3RfIGJlIGhhbmRsZWQgZXhwbGljaXRseSBfb24gdGhlIHByb21pc2VzIHRoYXQgYXJlIGJlaW5nIGNhbmNlbGxlZDpfXG4gICAgICogY2FuY2VsbGluZyBhIHByb21pc2Ugd2l0aCBubyBhdHRhY2hlZCByZWplY3Rpb24gaGFuZGxlciBkb2VzIG5vdCB0cmlnZ2VyIGFuIHVuaGFuZGxlZCByZWplY3Rpb24gZXZlbnQuXG4gICAgICogVGhlcmVmb3JlLCB0aGUgZm9sbG93aW5nIGlkaW9tcyBhcmUgYWxsIGVxdWFsbHkgY29ycmVjdDpcbiAgICAgKiBgYGB0c1xuICAgICAqIG5ldyBDYW5jZWxsYWJsZVByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4geyAuLi4gfSkuY2FuY2VsKCk7XG4gICAgICogbmV3IENhbmNlbGxhYmxlUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7IC4uLiB9KS50aGVuKC4uLikuY2FuY2VsKCk7XG4gICAgICogbmV3IENhbmNlbGxhYmxlUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7IC4uLiB9KS50aGVuKC4uLikuY2F0Y2goLi4uKS5jYW5jZWwoKTtcbiAgICAgKiBgYGBcbiAgICAgKiBXaGVuZXZlciBzb21lIGNhbmNlbGxlZCBwcm9taXNlIGluIGEgY2hhaW4gcmVqZWN0cyB3aXRoIGEgYENhbmNlbEVycm9yYFxuICAgICAqIHdpdGggdGhlIHNhbWUgY2FuY2VsbGF0aW9uIGNhdXNlIGFzIGl0c2VsZiwgdGhlIGVycm9yIHdpbGwgYmUgZGlzY2FyZGVkIHNpbGVudGx5LlxuICAgICAqIEhvd2V2ZXIsIHRoZSBgQ2FuY2VsRXJyb3JgIF93aWxsIHN0aWxsIGJlIGRlbGl2ZXJlZF8gdG8gYWxsIGF0dGFjaGVkIHJlamVjdGlvbiBoYW5kbGVyc1xuICAgICAqIGFkZGVkIGJ5IHtAbGluayB0aGVufSBhbmQgcmVsYXRlZCBtZXRob2RzOlxuICAgICAqIGBgYHRzXG4gICAgICogbGV0IGNhbmNlbGxhYmxlID0gbmV3IENhbmNlbGxhYmxlUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7IC4uLiB9KTtcbiAgICAgKiBjYW5jZWxsYWJsZS50aGVuKCgpID0+IHsgLi4uIH0pLmNhdGNoKGNvbnNvbGUubG9nKTtcbiAgICAgKiBjYW5jZWxsYWJsZS5jYW5jZWwoKTsgLy8gQSBDYW5jZWxFcnJvciBpcyBwcmludGVkIHRvIHRoZSBjb25zb2xlLlxuICAgICAqIGBgYFxuICAgICAqIElmIHRoZSBgQ2FuY2VsRXJyb3JgIGlzIG5vdCBoYW5kbGVkIGRvd25zdHJlYW0gYnkgdGhlIHRpbWUgaXQgcmVhY2hlc1xuICAgICAqIGEgX25vbi1jYW5jZWxsZWRfIHByb21pc2UsIGl0IF93aWxsXyB0cmlnZ2VyIGFuIHVuaGFuZGxlZCByZWplY3Rpb24gZXZlbnQsXG4gICAgICoganVzdCBsaWtlIG5vcm1hbCByZWplY3Rpb25zIHdvdWxkOlxuICAgICAqIGBgYHRzXG4gICAgICogbGV0IGNhbmNlbGxhYmxlID0gbmV3IENhbmNlbGxhYmxlUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7IC4uLiB9KTtcbiAgICAgKiBsZXQgY2hhaW5lZCA9IGNhbmNlbGxhYmxlLnRoZW4oKCkgPT4geyAuLi4gfSkudGhlbigoKSA9PiB7IC4uLiB9KTsgLy8gTm8gY2F0Y2guLi5cbiAgICAgKiBjYW5jZWxsYWJsZS5jYW5jZWwoKTsgLy8gVW5oYW5kbGVkIHJlamVjdGlvbiBldmVudCBvbiBjaGFpbmVkIVxuICAgICAqIGBgYFxuICAgICAqIFRoZXJlZm9yZSwgaXQgaXMgaW1wb3J0YW50IHRvIGVpdGhlciBjYW5jZWwgd2hvbGUgcHJvbWlzZSBjaGFpbnMgZnJvbSB0aGVpciB0YWlsLFxuICAgICAqIGFzIHNob3duIGluIHRoZSBjb3JyZWN0IGlkaW9tcyBhYm92ZSwgb3IgdGFrZSBjYXJlIG9mIGhhbmRsaW5nIGVycm9ycyBldmVyeXdoZXJlLlxuICAgICAqXG4gICAgICogQHJldHVybnMgQSBjYW5jZWxsYWJsZSBwcm9taXNlIHRoYXQgX2Z1bGZpbGxzXyBhZnRlciB0aGUgY2FuY2VsIGNhbGxiYWNrIChpZiBhbnkpXG4gICAgICogYW5kIGFsbCBoYW5kbGVycyBhdHRhY2hlZCB1cCB0byB0aGUgY2FsbCB0byBjYW5jZWwgaGF2ZSBydW4uXG4gICAgICogSWYgdGhlIGNhbmNlbCBjYWxsYmFjayByZXR1cm5zIGEgdGhlbmFibGUsIHRoZSBwcm9taXNlIHJldHVybmVkIGJ5IGBjYW5jZWxgXG4gICAgICogd2lsbCBhbHNvIHdhaXQgZm9yIHRoYXQgdGhlbmFibGUgdG8gc2V0dGxlLlxuICAgICAqIFRoaXMgZW5hYmxlcyBjYWxsZXJzIHRvIHdhaXQgZm9yIHRoZSBjYW5jZWxsZWQgb3BlcmF0aW9uIHRvIHRlcm1pbmF0ZVxuICAgICAqIHdpdGhvdXQgYmVpbmcgZm9yY2VkIHRvIGhhbmRsZSBwb3RlbnRpYWwgZXJyb3JzIGF0IHRoZSBjYWxsIHNpdGUuXG4gICAgICogYGBgdHNcbiAgICAgKiBjYW5jZWxsYWJsZS5jYW5jZWwoKS50aGVuKCgpID0+IHtcbiAgICAgKiAgICAgLy8gQ2xlYW51cCBmaW5pc2hlZCwgaXQncyBzYWZlIHRvIGRvIHNvbWV0aGluZyBlbHNlLlxuICAgICAqIH0sIChlcnIpID0+IHtcbiAgICAgKiAgICAgLy8gVW5yZWFjaGFibGU6IHRoZSBwcm9taXNlIHJldHVybmVkIGZyb20gY2FuY2VsIHdpbGwgbmV2ZXIgcmVqZWN0LlxuICAgICAqIH0pO1xuICAgICAqIGBgYFxuICAgICAqIE5vdGUgdGhhdCB0aGUgcmV0dXJuZWQgcHJvbWlzZSB3aWxsIF9ub3RfIGhhbmRsZSBpbXBsaWNpdGx5IGFueSByZWplY3Rpb25cbiAgICAgKiB0aGF0IG1pZ2h0IGhhdmUgb2NjdXJyZWQgYWxyZWFkeSBpbiB0aGUgY2FuY2VsbGVkIGNoYWluLlxuICAgICAqIEl0IHdpbGwganVzdCB0cmFjayB3aGV0aGVyIHJlZ2lzdGVyZWQgaGFuZGxlcnMgaGF2ZSBiZWVuIGV4ZWN1dGVkIG9yIG5vdC5cbiAgICAgKiBUaGVyZWZvcmUsIHVuaGFuZGxlZCByZWplY3Rpb25zIHdpbGwgbmV2ZXIgYmUgc2lsZW50bHkgaGFuZGxlZCBieSBjYWxsaW5nIGNhbmNlbC5cbiAgICAgKi9cbiAgICBjYW5jZWwoY2F1c2U/OiBhbnkpOiBDYW5jZWxsYWJsZVByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gbmV3IENhbmNlbGxhYmxlUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgUHJvbWlzZS5hbGxTZXR0bGVkKFtcbiAgICAgICAgICAgICAgICB0aGlzW2NhbmNlbEltcGxTeW1dKG5ldyBDYW5jZWxFcnJvcihcIlByb21pc2UgY2FuY2VsbGVkLlwiLCB7IGNhdXNlIH0pKSxcbiAgICAgICAgICAgICAgICBjdXJyZW50QmFycmllcih0aGlzKVxuICAgICAgICAgICAgXSkudGhlbigoKSA9PiByZXNvbHZlKCksICgpID0+IHJlc29sdmUoKSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJpbmRzIHByb21pc2UgY2FuY2VsbGF0aW9uIHRvIHRoZSBhYm9ydCBldmVudCBvZiB0aGUgZ2l2ZW4ge0BsaW5rIEFib3J0U2lnbmFsfS5cbiAgICAgKiBJZiB0aGUgc2lnbmFsIGhhcyBhbHJlYWR5IGFib3J0ZWQsIHRoZSBwcm9taXNlIHdpbGwgYmUgY2FuY2VsbGVkIGltbWVkaWF0ZWx5LlxuICAgICAqIFdoZW4gZWl0aGVyIGNvbmRpdGlvbiBpcyB2ZXJpZmllZCwgdGhlIGNhbmNlbGxhdGlvbiBjYXVzZSB3aWxsIGJlIHNldFxuICAgICAqIHRvIHRoZSBzaWduYWwncyBhYm9ydCByZWFzb24gKHNlZSB7QGxpbmsgQWJvcnRTaWduYWwjcmVhc29ufSkuXG4gICAgICpcbiAgICAgKiBIYXMgbm8gZWZmZWN0IGlmIGNhbGxlZCAob3IgaWYgdGhlIHNpZ25hbCBhYm9ydHMpIF9hZnRlcl8gdGhlIHByb21pc2UgaGFzIGFscmVhZHkgc2V0dGxlZC5cbiAgICAgKiBPbmx5IHRoZSBmaXJzdCBzaWduYWwgdG8gYWJvcnQgd2lsbCBzZXQgdGhlIGNhbmNlbGxhdGlvbiBjYXVzZS5cbiAgICAgKlxuICAgICAqIEZvciBtb3JlIGRldGFpbHMgYWJvdXQgdGhlIGNhbmNlbGxhdGlvbiBwcm9jZXNzLFxuICAgICAqIHNlZSB7QGxpbmsgY2FuY2VsfSBhbmQgdGhlIGBDYW5jZWxsYWJsZVByb21pc2VgIGNvbnN0cnVjdG9yLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgZW5hYmxlcyBgYXdhaXRgaW5nIGNhbmNlbGxhYmxlIHByb21pc2VzIHdpdGhvdXQgaGF2aW5nXG4gICAgICogdG8gc3RvcmUgdGhlbSBmb3IgZnV0dXJlIGNhbmNlbGxhdGlvbiwgZS5nLjpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGxvbmdSdW5uaW5nT3BlcmF0aW9uKCkuY2FuY2VsT24oc2lnbmFsKTtcbiAgICAgKiBgYGBcbiAgICAgKiBpbnN0ZWFkIG9mOlxuICAgICAqIGBgYHRzXG4gICAgICogbGV0IHByb21pc2VUb0JlQ2FuY2VsbGVkID0gbG9uZ1J1bm5pbmdPcGVyYXRpb24oKTtcbiAgICAgKiBhd2FpdCBwcm9taXNlVG9CZUNhbmNlbGxlZDtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoaXMgcHJvbWlzZSwgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKi9cbiAgICBjYW5jZWxPbihzaWduYWw6IEFib3J0U2lnbmFsKTogQ2FuY2VsbGFibGVQcm9taXNlPFQ+IHtcbiAgICAgICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgICB2b2lkIHRoaXMuY2FuY2VsKHNpZ25hbC5yZWFzb24pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PiB2b2lkIHRoaXMuY2FuY2VsKHNpZ25hbC5yZWFzb24pLCB7Y2FwdHVyZTogdHJ1ZX0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXR0YWNoZXMgY2FsbGJhY2tzIGZvciB0aGUgcmVzb2x1dGlvbiBhbmQvb3IgcmVqZWN0aW9uIG9mIHRoZSBgQ2FuY2VsbGFibGVQcm9taXNlYC5cbiAgICAgKlxuICAgICAqIFRoZSBvcHRpb25hbCBgb25jYW5jZWxsZWRgIGFyZ3VtZW50IHdpbGwgYmUgaW52b2tlZCB3aGVuIHRoZSByZXR1cm5lZCBwcm9taXNlIGlzIGNhbmNlbGxlZCxcbiAgICAgKiB3aXRoIHRoZSBzYW1lIHNlbWFudGljcyBhcyB0aGUgYG9uY2FuY2VsbGVkYCBhcmd1bWVudCBvZiB0aGUgY29uc3RydWN0b3IuXG4gICAgICogV2hlbiB0aGUgcGFyZW50IHByb21pc2UgcmVqZWN0cyBvciBpcyBjYW5jZWxsZWQsIHRoZSBgb25yZWplY3RlZGAgY2FsbGJhY2sgd2lsbCBydW4sXG4gICAgICogX2V2ZW4gYWZ0ZXIgdGhlIHJldHVybmVkIHByb21pc2UgaGFzIGJlZW4gY2FuY2VsbGVkOl9cbiAgICAgKiBpbiB0aGF0IGNhc2UsIHNob3VsZCBpdCByZWplY3Qgb3IgdGhyb3csIHRoZSByZWFzb24gd2lsbCBiZSB3cmFwcGVkXG4gICAgICogaW4gYSB7QGxpbmsgQ2FuY2VsbGVkUmVqZWN0aW9uRXJyb3J9IGFuZCBidWJibGVkIHVwIGFzIGFuIHVuaGFuZGxlZCByZWplY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb25mdWxmaWxsZWQgVGhlIGNhbGxiYWNrIHRvIGV4ZWN1dGUgd2hlbiB0aGUgUHJvbWlzZSBpcyByZXNvbHZlZC5cbiAgICAgKiBAcGFyYW0gb25yZWplY3RlZCBUaGUgY2FsbGJhY2sgdG8gZXhlY3V0ZSB3aGVuIHRoZSBQcm9taXNlIGlzIHJlamVjdGVkLlxuICAgICAqIEByZXR1cm5zIEEgYENhbmNlbGxhYmxlUHJvbWlzZWAgZm9yIHRoZSBjb21wbGV0aW9uIG9mIHdoaWNoZXZlciBjYWxsYmFjayBpcyBleGVjdXRlZC5cbiAgICAgKiBUaGUgcmV0dXJuZWQgcHJvbWlzZSBpcyBob29rZWQgdXAgdG8gcHJvcGFnYXRlIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyB1cCB0aGUgY2hhaW4sIGJ1dCBub3QgZG93bjpcbiAgICAgKlxuICAgICAqICAgLSBpZiB0aGUgcGFyZW50IHByb21pc2UgaXMgY2FuY2VsbGVkLCB0aGUgYG9ucmVqZWN0ZWRgIGhhbmRsZXIgd2lsbCBiZSBpbnZva2VkIHdpdGggYSBgQ2FuY2VsRXJyb3JgXG4gICAgICogICAgIGFuZCB0aGUgcmV0dXJuZWQgcHJvbWlzZSBfd2lsbCByZXNvbHZlIHJlZ3VsYXJseV8gd2l0aCBpdHMgcmVzdWx0O1xuICAgICAqICAgLSBjb252ZXJzZWx5LCBpZiB0aGUgcmV0dXJuZWQgcHJvbWlzZSBpcyBjYW5jZWxsZWQsIF90aGUgcGFyZW50IHByb21pc2UgaXMgY2FuY2VsbGVkIHRvbztfXG4gICAgICogICAgIHRoZSBgb25yZWplY3RlZGAgaGFuZGxlciB3aWxsIHN0aWxsIGJlIGludm9rZWQgd2l0aCB0aGUgcGFyZW50J3MgYENhbmNlbEVycm9yYCxcbiAgICAgKiAgICAgYnV0IGl0cyByZXN1bHQgd2lsbCBiZSBkaXNjYXJkZWRcbiAgICAgKiAgICAgYW5kIHRoZSByZXR1cm5lZCBwcm9taXNlIHdpbGwgcmVqZWN0IHdpdGggYSBgQ2FuY2VsRXJyb3JgIGFzIHdlbGwuXG4gICAgICpcbiAgICAgKiBUaGUgcHJvbWlzZSByZXR1cm5lZCBmcm9tIHtAbGluayBjYW5jZWx9IHdpbGwgZnVsZmlsbCBvbmx5IGFmdGVyIGFsbCBhdHRhY2hlZCBoYW5kbGVyc1xuICAgICAqIHVwIHRoZSBlbnRpcmUgcHJvbWlzZSBjaGFpbiBoYXZlIGJlZW4gcnVuLlxuICAgICAqXG4gICAgICogSWYgZWl0aGVyIGNhbGxiYWNrIHJldHVybnMgYSBjYW5jZWxsYWJsZSBwcm9taXNlLFxuICAgICAqIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyB3aWxsIGJlIGRpdmVydGVkIHRvIGl0LFxuICAgICAqIGFuZCB0aGUgc3BlY2lmaWVkIGBvbmNhbmNlbGxlZGAgY2FsbGJhY2sgd2lsbCBiZSBkaXNjYXJkZWQuXG4gICAgICovXG4gICAgdGhlbjxUUmVzdWx0MSA9IFQsIFRSZXN1bHQyID0gbmV2ZXI+KG9uZnVsZmlsbGVkPzogKCh2YWx1ZTogVCkgPT4gVFJlc3VsdDEgfCBQcm9taXNlTGlrZTxUUmVzdWx0MT4gfCBDYW5jZWxsYWJsZVByb21pc2VMaWtlPFRSZXN1bHQxPikgfCB1bmRlZmluZWQgfCBudWxsLCBvbnJlamVjdGVkPzogKChyZWFzb246IGFueSkgPT4gVFJlc3VsdDIgfCBQcm9taXNlTGlrZTxUUmVzdWx0Mj4gfCBDYW5jZWxsYWJsZVByb21pc2VMaWtlPFRSZXN1bHQyPikgfCB1bmRlZmluZWQgfCBudWxsLCBvbmNhbmNlbGxlZD86IENhbmNlbGxhYmxlUHJvbWlzZUNhbmNlbGxlcik6IENhbmNlbGxhYmxlUHJvbWlzZTxUUmVzdWx0MSB8IFRSZXN1bHQyPiB7XG4gICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBDYW5jZWxsYWJsZVByb21pc2UpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2FuY2VsbGFibGVQcm9taXNlLnByb3RvdHlwZS50aGVuIGNhbGxlZCBvbiBhbiBpbnZhbGlkIG9iamVjdC5cIik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOT1RFOiBUeXBlU2NyaXB0J3MgYnVpbHQtaW4gdHlwZSBmb3IgdGhlbiBpcyBicm9rZW4sXG4gICAgICAgIC8vIGFzIGl0IGFsbG93cyBzcGVjaWZ5aW5nIGFuIGFyYml0cmFyeSBUUmVzdWx0MSAhPSBUIGV2ZW4gd2hlbiBvbmZ1bGZpbGxlZCBpcyBub3QgYSBmdW5jdGlvbi5cbiAgICAgICAgLy8gV2UgY2Fubm90IGZpeCBpdCBpZiB3ZSB3YW50IHRvIENhbmNlbGxhYmxlUHJvbWlzZSB0byBpbXBsZW1lbnQgUHJvbWlzZUxpa2U8VD4uXG5cbiAgICAgICAgaWYgKCFpc0NhbGxhYmxlKG9uZnVsZmlsbGVkKSkgeyBvbmZ1bGZpbGxlZCA9IGlkZW50aXR5IGFzIGFueTsgfVxuICAgICAgICBpZiAoIWlzQ2FsbGFibGUob25yZWplY3RlZCkpIHsgb25yZWplY3RlZCA9IHRocm93ZXI7IH1cblxuICAgICAgICBpZiAob25mdWxmaWxsZWQgPT09IGlkZW50aXR5ICYmIG9ucmVqZWN0ZWQgPT0gdGhyb3dlcikge1xuICAgICAgICAgICAgLy8gU2hvcnRjdXQgZm9yIHRyaXZpYWwgYXJndW1lbnRzLlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBDYW5jZWxsYWJsZVByb21pc2UoKHJlc29sdmUpID0+IHJlc29sdmUodGhpcyBhcyBhbnkpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJhcnJpZXI6IFBhcnRpYWw8UHJvbWlzZVdpdGhSZXNvbHZlcnM8dm9pZD4+ID0ge307XG4gICAgICAgIHRoaXNbYmFycmllclN5bV0gPSBiYXJyaWVyO1xuXG4gICAgICAgIHJldHVybiBuZXcgQ2FuY2VsbGFibGVQcm9taXNlPFRSZXN1bHQxIHwgVFJlc3VsdDI+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHZvaWQgcHJvbWlzZVRoZW4uY2FsbCh0aGlzLFxuICAgICAgICAgICAgICAgICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpc1tiYXJyaWVyU3ltXSA9PT0gYmFycmllcikgeyB0aGlzW2JhcnJpZXJTeW1dID0gbnVsbDsgfVxuICAgICAgICAgICAgICAgICAgICBiYXJyaWVyLnJlc29sdmU/LigpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG9uZnVsZmlsbGVkISh2YWx1ZSkpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAocmVhc29uPykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpc1tiYXJyaWVyU3ltXSA9PT0gYmFycmllcikgeyB0aGlzW2JhcnJpZXJTeW1dID0gbnVsbDsgfVxuICAgICAgICAgICAgICAgICAgICBiYXJyaWVyLnJlc29sdmU/LigpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG9ucmVqZWN0ZWQhKHJlYXNvbikpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSwgYXN5bmMgKGNhdXNlPykgPT4ge1xuICAgICAgICAgICAgLy9jYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb25jYW5jZWxsZWQ/LihjYXVzZSk7XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY2FuY2VsKGNhdXNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXR0YWNoZXMgYSBjYWxsYmFjayBmb3Igb25seSB0aGUgcmVqZWN0aW9uIG9mIHRoZSBQcm9taXNlLlxuICAgICAqXG4gICAgICogVGhlIG9wdGlvbmFsIGBvbmNhbmNlbGxlZGAgYXJndW1lbnQgd2lsbCBiZSBpbnZva2VkIHdoZW4gdGhlIHJldHVybmVkIHByb21pc2UgaXMgY2FuY2VsbGVkLFxuICAgICAqIHdpdGggdGhlIHNhbWUgc2VtYW50aWNzIGFzIHRoZSBgb25jYW5jZWxsZWRgIGFyZ3VtZW50IG9mIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgKiBXaGVuIHRoZSBwYXJlbnQgcHJvbWlzZSByZWplY3RzIG9yIGlzIGNhbmNlbGxlZCwgdGhlIGBvbnJlamVjdGVkYCBjYWxsYmFjayB3aWxsIHJ1bixcbiAgICAgKiBfZXZlbiBhZnRlciB0aGUgcmV0dXJuZWQgcHJvbWlzZSBoYXMgYmVlbiBjYW5jZWxsZWQ6X1xuICAgICAqIGluIHRoYXQgY2FzZSwgc2hvdWxkIGl0IHJlamVjdCBvciB0aHJvdywgdGhlIHJlYXNvbiB3aWxsIGJlIHdyYXBwZWRcbiAgICAgKiBpbiBhIHtAbGluayBDYW5jZWxsZWRSZWplY3Rpb25FcnJvcn0gYW5kIGJ1YmJsZWQgdXAgYXMgYW4gdW5oYW5kbGVkIHJlamVjdGlvbi5cbiAgICAgKlxuICAgICAqIEl0IGlzIGVxdWl2YWxlbnQgdG9cbiAgICAgKiBgYGB0c1xuICAgICAqIGNhbmNlbGxhYmxlUHJvbWlzZS50aGVuKHVuZGVmaW5lZCwgb25yZWplY3RlZCwgb25jYW5jZWxsZWQpO1xuICAgICAqIGBgYFxuICAgICAqIGFuZCB0aGUgc2FtZSBjYXZlYXRzIGFwcGx5LlxuICAgICAqXG4gICAgICogQHJldHVybnMgQSBQcm9taXNlIGZvciB0aGUgY29tcGxldGlvbiBvZiB0aGUgY2FsbGJhY2suXG4gICAgICogQ2FuY2VsbGF0aW9uIHJlcXVlc3RzIG9uIHRoZSByZXR1cm5lZCBwcm9taXNlXG4gICAgICogd2lsbCBwcm9wYWdhdGUgdXAgdGhlIGNoYWluIHRvIHRoZSBwYXJlbnQgcHJvbWlzZSxcbiAgICAgKiBidXQgbm90IGluIHRoZSBvdGhlciBkaXJlY3Rpb24uXG4gICAgICpcbiAgICAgKiBUaGUgcHJvbWlzZSByZXR1cm5lZCBmcm9tIHtAbGluayBjYW5jZWx9IHdpbGwgZnVsZmlsbCBvbmx5IGFmdGVyIGFsbCBhdHRhY2hlZCBoYW5kbGVyc1xuICAgICAqIHVwIHRoZSBlbnRpcmUgcHJvbWlzZSBjaGFpbiBoYXZlIGJlZW4gcnVuLlxuICAgICAqXG4gICAgICogSWYgYG9ucmVqZWN0ZWRgIHJldHVybnMgYSBjYW5jZWxsYWJsZSBwcm9taXNlLFxuICAgICAqIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyB3aWxsIGJlIGRpdmVydGVkIHRvIGl0LFxuICAgICAqIGFuZCB0aGUgc3BlY2lmaWVkIGBvbmNhbmNlbGxlZGAgY2FsbGJhY2sgd2lsbCBiZSBkaXNjYXJkZWQuXG4gICAgICogU2VlIHtAbGluayB0aGVufSBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqL1xuICAgIGNhdGNoPFRSZXN1bHQgPSBuZXZlcj4ob25yZWplY3RlZD86ICgocmVhc29uOiBhbnkpID0+IChQcm9taXNlTGlrZTxUUmVzdWx0PiB8IFRSZXN1bHQpKSB8IHVuZGVmaW5lZCB8IG51bGwsIG9uY2FuY2VsbGVkPzogQ2FuY2VsbGFibGVQcm9taXNlQ2FuY2VsbGVyKTogQ2FuY2VsbGFibGVQcm9taXNlPFQgfCBUUmVzdWx0PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRoZW4odW5kZWZpbmVkLCBvbnJlamVjdGVkLCBvbmNhbmNlbGxlZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXR0YWNoZXMgYSBjYWxsYmFjayB0aGF0IGlzIGludm9rZWQgd2hlbiB0aGUgQ2FuY2VsbGFibGVQcm9taXNlIGlzIHNldHRsZWQgKGZ1bGZpbGxlZCBvciByZWplY3RlZCkuIFRoZVxuICAgICAqIHJlc29sdmVkIHZhbHVlIGNhbm5vdCBiZSBhY2Nlc3NlZCBvciBtb2RpZmllZCBmcm9tIHRoZSBjYWxsYmFjay5cbiAgICAgKiBUaGUgcmV0dXJuZWQgcHJvbWlzZSB3aWxsIHNldHRsZSBpbiB0aGUgc2FtZSBzdGF0ZSBhcyB0aGUgb3JpZ2luYWwgb25lXG4gICAgICogYWZ0ZXIgdGhlIHByb3ZpZGVkIGNhbGxiYWNrIGhhcyBjb21wbGV0ZWQgZXhlY3V0aW9uLFxuICAgICAqIHVubGVzcyB0aGUgY2FsbGJhY2sgdGhyb3dzIG9yIHJldHVybnMgYSByZWplY3RpbmcgcHJvbWlzZSxcbiAgICAgKiBpbiB3aGljaCBjYXNlIHRoZSByZXR1cm5lZCBwcm9taXNlIHdpbGwgcmVqZWN0IGFzIHdlbGwuXG4gICAgICpcbiAgICAgKiBUaGUgb3B0aW9uYWwgYG9uY2FuY2VsbGVkYCBhcmd1bWVudCB3aWxsIGJlIGludm9rZWQgd2hlbiB0aGUgcmV0dXJuZWQgcHJvbWlzZSBpcyBjYW5jZWxsZWQsXG4gICAgICogd2l0aCB0aGUgc2FtZSBzZW1hbnRpY3MgYXMgdGhlIGBvbmNhbmNlbGxlZGAgYXJndW1lbnQgb2YgdGhlIGNvbnN0cnVjdG9yLlxuICAgICAqIE9uY2UgdGhlIHBhcmVudCBwcm9taXNlIHNldHRsZXMsIHRoZSBgb25maW5hbGx5YCBjYWxsYmFjayB3aWxsIHJ1bixcbiAgICAgKiBfZXZlbiBhZnRlciB0aGUgcmV0dXJuZWQgcHJvbWlzZSBoYXMgYmVlbiBjYW5jZWxsZWQ6X1xuICAgICAqIGluIHRoYXQgY2FzZSwgc2hvdWxkIGl0IHJlamVjdCBvciB0aHJvdywgdGhlIHJlYXNvbiB3aWxsIGJlIHdyYXBwZWRcbiAgICAgKiBpbiBhIHtAbGluayBDYW5jZWxsZWRSZWplY3Rpb25FcnJvcn0gYW5kIGJ1YmJsZWQgdXAgYXMgYW4gdW5oYW5kbGVkIHJlamVjdGlvbi5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIHtAbGluayB0aGVufSBhbmQgdGhlIHNhbWUgY2F2ZWF0cyBhcHBseS5cbiAgICAgKiBJdCBpcyBwb2x5ZmlsbGVkLCBoZW5jZSBhdmFpbGFibGUgaW4gZXZlcnkgT1Mvd2VidmlldyB2ZXJzaW9uLlxuICAgICAqXG4gICAgICogQHJldHVybnMgQSBQcm9taXNlIGZvciB0aGUgY29tcGxldGlvbiBvZiB0aGUgY2FsbGJhY2suXG4gICAgICogQ2FuY2VsbGF0aW9uIHJlcXVlc3RzIG9uIHRoZSByZXR1cm5lZCBwcm9taXNlXG4gICAgICogd2lsbCBwcm9wYWdhdGUgdXAgdGhlIGNoYWluIHRvIHRoZSBwYXJlbnQgcHJvbWlzZSxcbiAgICAgKiBidXQgbm90IGluIHRoZSBvdGhlciBkaXJlY3Rpb24uXG4gICAgICpcbiAgICAgKiBUaGUgcHJvbWlzZSByZXR1cm5lZCBmcm9tIHtAbGluayBjYW5jZWx9IHdpbGwgZnVsZmlsbCBvbmx5IGFmdGVyIGFsbCBhdHRhY2hlZCBoYW5kbGVyc1xuICAgICAqIHVwIHRoZSBlbnRpcmUgcHJvbWlzZSBjaGFpbiBoYXZlIGJlZW4gcnVuLlxuICAgICAqXG4gICAgICogSWYgYG9uZmluYWxseWAgcmV0dXJucyBhIGNhbmNlbGxhYmxlIHByb21pc2UsXG4gICAgICogY2FuY2VsbGF0aW9uIHJlcXVlc3RzIHdpbGwgYmUgZGl2ZXJ0ZWQgdG8gaXQsXG4gICAgICogYW5kIHRoZSBzcGVjaWZpZWQgYG9uY2FuY2VsbGVkYCBjYWxsYmFjayB3aWxsIGJlIGRpc2NhcmRlZC5cbiAgICAgKiBTZWUge0BsaW5rIHRoZW59IGZvciBtb3JlIGRldGFpbHMuXG4gICAgICovXG4gICAgZmluYWxseShvbmZpbmFsbHk/OiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWQgfCBudWxsLCBvbmNhbmNlbGxlZD86IENhbmNlbGxhYmxlUHJvbWlzZUNhbmNlbGxlcik6IENhbmNlbGxhYmxlUHJvbWlzZTxUPiB7XG4gICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBDYW5jZWxsYWJsZVByb21pc2UpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2FuY2VsbGFibGVQcm9taXNlLnByb3RvdHlwZS5maW5hbGx5IGNhbGxlZCBvbiBhbiBpbnZhbGlkIG9iamVjdC5cIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzQ2FsbGFibGUob25maW5hbGx5KSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudGhlbihvbmZpbmFsbHksIG9uZmluYWxseSwgb25jYW5jZWxsZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudGhlbihcbiAgICAgICAgICAgICh2YWx1ZSkgPT4gQ2FuY2VsbGFibGVQcm9taXNlLnJlc29sdmUob25maW5hbGx5KCkpLnRoZW4oKCkgPT4gdmFsdWUpLFxuICAgICAgICAgICAgKHJlYXNvbj8pID0+IENhbmNlbGxhYmxlUHJvbWlzZS5yZXNvbHZlKG9uZmluYWxseSgpKS50aGVuKCgpID0+IHsgdGhyb3cgcmVhc29uOyB9KSxcbiAgICAgICAgICAgIG9uY2FuY2VsbGVkLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdlIHVzZSB0aGUgYFtTeW1ib2wuc3BlY2llc11gIHN0YXRpYyBwcm9wZXJ0eSwgaWYgYXZhaWxhYmxlLFxuICAgICAqIHRvIGRpc2FibGUgdGhlIGJ1aWx0LWluIGF1dG9tYXRpYyBzdWJjbGFzc2luZyBmZWF0dXJlcyBmcm9tIHtAbGluayBQcm9taXNlfS5cbiAgICAgKiBJdCBpcyBjcml0aWNhbCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucyB0aGF0IGV4dGVuZGVycyBkbyBub3Qgb3ZlcnJpZGUgdGhpcy5cbiAgICAgKiBPbmNlIHRoZSBwcm9wb3NhbCBhdCBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1ybS1idWlsdGluLXN1YmNsYXNzaW5nXG4gICAgICogaXMgZWl0aGVyIGFjY2VwdGVkIG9yIHJldGlyZWQsIHRoaXMgaW1wbGVtZW50YXRpb24gd2lsbCBoYXZlIHRvIGJlIHJldmlzZWQgYWNjb3JkaW5nbHkuXG4gICAgICpcbiAgICAgKiBAaWdub3JlXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgc3RhdGljIGdldCBbc3BlY2llc10oKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBDYW5jZWxsYWJsZVByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoIGFuIGFycmF5IG9mIHJlc3VsdHNcbiAgICAgKiB3aGVuIGFsbCBvZiB0aGUgcHJvdmlkZWQgUHJvbWlzZXMgcmVzb2x2ZSwgb3IgcmVqZWN0ZWQgd2hlbiBhbnkgUHJvbWlzZSBpcyByZWplY3RlZC5cbiAgICAgKlxuICAgICAqIEV2ZXJ5IG9uZSBvZiB0aGUgcHJvdmlkZWQgb2JqZWN0cyB0aGF0IGlzIGEgdGhlbmFibGUgX2FuZF8gY2FuY2VsbGFibGUgb2JqZWN0XG4gICAgICogd2lsbCBiZSBjYW5jZWxsZWQgd2hlbiB0aGUgcmV0dXJuZWQgcHJvbWlzZSBpcyBjYW5jZWxsZWQsIHdpdGggdGhlIHNhbWUgY2F1c2UuXG4gICAgICpcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcbiAgICAgKi9cbiAgICBzdGF0aWMgYWxsPFQ+KHZhbHVlczogSXRlcmFibGU8VCB8IFByb21pc2VMaWtlPFQ+Pik6IENhbmNlbGxhYmxlUHJvbWlzZTxBd2FpdGVkPFQ+W10+O1xuICAgIHN0YXRpYyBhbGw8VCBleHRlbmRzIHJlYWRvbmx5IHVua25vd25bXSB8IFtdPih2YWx1ZXM6IFQpOiBDYW5jZWxsYWJsZVByb21pc2U8eyAtcmVhZG9ubHkgW1AgaW4ga2V5b2YgVF06IEF3YWl0ZWQ8VFtQXT47IH0+O1xuICAgIHN0YXRpYyBhbGw8VCBleHRlbmRzIEl0ZXJhYmxlPHVua25vd24+IHwgQXJyYXlMaWtlPHVua25vd24+Pih2YWx1ZXM6IFQpOiBDYW5jZWxsYWJsZVByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICBsZXQgY29sbGVjdGVkID0gQXJyYXkuZnJvbSh2YWx1ZXMpO1xuICAgICAgICByZXR1cm4gY29sbGVjdGVkLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgPyBDYW5jZWxsYWJsZVByb21pc2UucmVzb2x2ZShjb2xsZWN0ZWQpXG4gICAgICAgICAgICA6IG5ldyBDYW5jZWxsYWJsZVByb21pc2U8dW5rbm93bj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHZvaWQgUHJvbWlzZS5hbGwoY29sbGVjdGVkKS50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgICB9LCBhbGxDYW5jZWxsZXIoY29sbGVjdGVkKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIENhbmNlbGxhYmxlUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggYW4gYXJyYXkgb2YgcmVzdWx0c1xuICAgICAqIHdoZW4gYWxsIG9mIHRoZSBwcm92aWRlZCBQcm9taXNlcyByZXNvbHZlIG9yIHJlamVjdC5cbiAgICAgKlxuICAgICAqIEV2ZXJ5IG9uZSBvZiB0aGUgcHJvdmlkZWQgb2JqZWN0cyB0aGF0IGlzIGEgdGhlbmFibGUgX2FuZF8gY2FuY2VsbGFibGUgb2JqZWN0XG4gICAgICogd2lsbCBiZSBjYW5jZWxsZWQgd2hlbiB0aGUgcmV0dXJuZWQgcHJvbWlzZSBpcyBjYW5jZWxsZWQsIHdpdGggdGhlIHNhbWUgY2F1c2UuXG4gICAgICpcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcbiAgICAgKi9cbiAgICBzdGF0aWMgYWxsU2V0dGxlZDxUPih2YWx1ZXM6IEl0ZXJhYmxlPFQgfCBQcm9taXNlTGlrZTxUPj4pOiBDYW5jZWxsYWJsZVByb21pc2U8UHJvbWlzZVNldHRsZWRSZXN1bHQ8QXdhaXRlZDxUPj5bXT47XG4gICAgc3RhdGljIGFsbFNldHRsZWQ8VCBleHRlbmRzIHJlYWRvbmx5IHVua25vd25bXSB8IFtdPih2YWx1ZXM6IFQpOiBDYW5jZWxsYWJsZVByb21pc2U8eyAtcmVhZG9ubHkgW1AgaW4ga2V5b2YgVF06IFByb21pc2VTZXR0bGVkUmVzdWx0PEF3YWl0ZWQ8VFtQXT4+OyB9PjtcbiAgICBzdGF0aWMgYWxsU2V0dGxlZDxUIGV4dGVuZHMgSXRlcmFibGU8dW5rbm93bj4gfCBBcnJheUxpa2U8dW5rbm93bj4+KHZhbHVlczogVCk6IENhbmNlbGxhYmxlUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIGxldCBjb2xsZWN0ZWQgPSBBcnJheS5mcm9tKHZhbHVlcyk7XG4gICAgICAgIHJldHVybiBjb2xsZWN0ZWQubGVuZ3RoID09PSAwXG4gICAgICAgICAgICA/IENhbmNlbGxhYmxlUHJvbWlzZS5yZXNvbHZlKGNvbGxlY3RlZClcbiAgICAgICAgICAgIDogbmV3IENhbmNlbGxhYmxlUHJvbWlzZTx1bmtub3duPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgdm9pZCBQcm9taXNlLmFsbFNldHRsZWQoY29sbGVjdGVkKS50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgICB9LCBhbGxDYW5jZWxsZXIoY29sbGVjdGVkKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGFueSBmdW5jdGlvbiByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCBieSB0aGUgZmlyc3QgZ2l2ZW4gcHJvbWlzZSB0byBiZSBmdWxmaWxsZWQsXG4gICAgICogb3IgcmVqZWN0ZWQgd2l0aCBhbiBBZ2dyZWdhdGVFcnJvciBjb250YWluaW5nIGFuIGFycmF5IG9mIHJlamVjdGlvbiByZWFzb25zXG4gICAgICogaWYgYWxsIG9mIHRoZSBnaXZlbiBwcm9taXNlcyBhcmUgcmVqZWN0ZWQuXG4gICAgICogSXQgcmVzb2x2ZXMgYWxsIGVsZW1lbnRzIG9mIHRoZSBwYXNzZWQgaXRlcmFibGUgdG8gcHJvbWlzZXMgYXMgaXQgcnVucyB0aGlzIGFsZ29yaXRobS5cbiAgICAgKlxuICAgICAqIEV2ZXJ5IG9uZSBvZiB0aGUgcHJvdmlkZWQgb2JqZWN0cyB0aGF0IGlzIGEgdGhlbmFibGUgX2FuZF8gY2FuY2VsbGFibGUgb2JqZWN0XG4gICAgICogd2lsbCBiZSBjYW5jZWxsZWQgd2hlbiB0aGUgcmV0dXJuZWQgcHJvbWlzZSBpcyBjYW5jZWxsZWQsIHdpdGggdGhlIHNhbWUgY2F1c2UuXG4gICAgICpcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcbiAgICAgKi9cbiAgICBzdGF0aWMgYW55PFQ+KHZhbHVlczogSXRlcmFibGU8VCB8IFByb21pc2VMaWtlPFQ+Pik6IENhbmNlbGxhYmxlUHJvbWlzZTxBd2FpdGVkPFQ+PjtcbiAgICBzdGF0aWMgYW55PFQgZXh0ZW5kcyByZWFkb25seSB1bmtub3duW10gfCBbXT4odmFsdWVzOiBUKTogQ2FuY2VsbGFibGVQcm9taXNlPEF3YWl0ZWQ8VFtudW1iZXJdPj47XG4gICAgc3RhdGljIGFueTxUIGV4dGVuZHMgSXRlcmFibGU8dW5rbm93bj4gfCBBcnJheUxpa2U8dW5rbm93bj4+KHZhbHVlczogVCk6IENhbmNlbGxhYmxlUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIGxldCBjb2xsZWN0ZWQgPSBBcnJheS5mcm9tKHZhbHVlcyk7XG4gICAgICAgIHJldHVybiBjb2xsZWN0ZWQubGVuZ3RoID09PSAwXG4gICAgICAgICAgICA/IENhbmNlbGxhYmxlUHJvbWlzZS5yZXNvbHZlKGNvbGxlY3RlZClcbiAgICAgICAgICAgIDogbmV3IENhbmNlbGxhYmxlUHJvbWlzZTx1bmtub3duPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgdm9pZCBQcm9taXNlLmFueShjb2xsZWN0ZWQpLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICAgIH0sIGFsbENhbmNlbGxlcihjb2xsZWN0ZWQpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIG9yIHJlamVjdGVkIHdoZW4gYW55IG9mIHRoZSBwcm92aWRlZCBQcm9taXNlcyBhcmUgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQuXG4gICAgICpcbiAgICAgKiBFdmVyeSBvbmUgb2YgdGhlIHByb3ZpZGVkIG9iamVjdHMgdGhhdCBpcyBhIHRoZW5hYmxlIF9hbmRfIGNhbmNlbGxhYmxlIG9iamVjdFxuICAgICAqIHdpbGwgYmUgY2FuY2VsbGVkIHdoZW4gdGhlIHJldHVybmVkIHByb21pc2UgaXMgY2FuY2VsbGVkLCB3aXRoIHRoZSBzYW1lIGNhdXNlLlxuICAgICAqXG4gICAgICogQGdyb3VwIFN0YXRpYyBNZXRob2RzXG4gICAgICovXG4gICAgc3RhdGljIHJhY2U8VD4odmFsdWVzOiBJdGVyYWJsZTxUIHwgUHJvbWlzZUxpa2U8VD4+KTogQ2FuY2VsbGFibGVQcm9taXNlPEF3YWl0ZWQ8VD4+O1xuICAgIHN0YXRpYyByYWNlPFQgZXh0ZW5kcyByZWFkb25seSB1bmtub3duW10gfCBbXT4odmFsdWVzOiBUKTogQ2FuY2VsbGFibGVQcm9taXNlPEF3YWl0ZWQ8VFtudW1iZXJdPj47XG4gICAgc3RhdGljIHJhY2U8VCBleHRlbmRzIEl0ZXJhYmxlPHVua25vd24+IHwgQXJyYXlMaWtlPHVua25vd24+Pih2YWx1ZXM6IFQpOiBDYW5jZWxsYWJsZVByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICBsZXQgY29sbGVjdGVkID0gQXJyYXkuZnJvbSh2YWx1ZXMpO1xuICAgICAgICByZXR1cm4gbmV3IENhbmNlbGxhYmxlUHJvbWlzZTx1bmtub3duPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB2b2lkIFByb21pc2UucmFjZShjb2xsZWN0ZWQpLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSwgYWxsQ2FuY2VsbGVyKGNvbGxlY3RlZCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgY2FuY2VsbGVkIENhbmNlbGxhYmxlUHJvbWlzZSBmb3IgdGhlIHByb3ZpZGVkIGNhdXNlLlxuICAgICAqXG4gICAgICogQGdyb3VwIFN0YXRpYyBNZXRob2RzXG4gICAgICovXG4gICAgc3RhdGljIGNhbmNlbDxUID0gbmV2ZXI+KGNhdXNlPzogYW55KTogQ2FuY2VsbGFibGVQcm9taXNlPFQ+IHtcbiAgICAgICAgY29uc3QgcCA9IG5ldyBDYW5jZWxsYWJsZVByb21pc2U8VD4oKCkgPT4ge30pO1xuICAgICAgICBwLmNhbmNlbChjYXVzZSk7XG4gICAgICAgIHJldHVybiBwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ2FuY2VsbGFibGVQcm9taXNlIHRoYXQgY2FuY2Vsc1xuICAgICAqIGFmdGVyIHRoZSBzcGVjaWZpZWQgdGltZW91dCwgd2l0aCB0aGUgcHJvdmlkZWQgY2F1c2UuXG4gICAgICpcbiAgICAgKiBJZiB0aGUge0BsaW5rIEFib3J0U2lnbmFsLnRpbWVvdXR9IGZhY3RvcnkgbWV0aG9kIGlzIGF2YWlsYWJsZSxcbiAgICAgKiBpdCBpcyB1c2VkIHRvIGJhc2UgdGhlIHRpbWVvdXQgb24gX2FjdGl2ZV8gdGltZSByYXRoZXIgdGhhbiBfZWxhcHNlZF8gdGltZS5cbiAgICAgKiBPdGhlcndpc2UsIGB0aW1lb3V0YCBmYWxscyBiYWNrIHRvIHtAbGluayBzZXRUaW1lb3V0fS5cbiAgICAgKlxuICAgICAqIEBncm91cCBTdGF0aWMgTWV0aG9kc1xuICAgICAqL1xuICAgIHN0YXRpYyB0aW1lb3V0PFQgPSBuZXZlcj4obWlsbGlzZWNvbmRzOiBudW1iZXIsIGNhdXNlPzogYW55KTogQ2FuY2VsbGFibGVQcm9taXNlPFQ+IHtcbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IG5ldyBDYW5jZWxsYWJsZVByb21pc2U8VD4oKCkgPT4ge30pO1xuICAgICAgICBpZiAoQWJvcnRTaWduYWwgJiYgdHlwZW9mIEFib3J0U2lnbmFsID09PSAnZnVuY3Rpb24nICYmIEFib3J0U2lnbmFsLnRpbWVvdXQgJiYgdHlwZW9mIEFib3J0U2lnbmFsLnRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIEFib3J0U2lnbmFsLnRpbWVvdXQobWlsbGlzZWNvbmRzKS5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsICgpID0+IHZvaWQgcHJvbWlzZS5jYW5jZWwoY2F1c2UpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdm9pZCBwcm9taXNlLmNhbmNlbChjYXVzZSksIG1pbGxpc2Vjb25kcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBDYW5jZWxsYWJsZVByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciB0aGUgc3BlY2lmaWVkIHRpbWVvdXQuXG4gICAgICogVGhlIHJldHVybmVkIHByb21pc2UgY2FuIGJlIGNhbmNlbGxlZCB3aXRob3V0IGNvbnNlcXVlbmNlcy5cbiAgICAgKlxuICAgICAqIEBncm91cCBTdGF0aWMgTWV0aG9kc1xuICAgICAqL1xuICAgIHN0YXRpYyBzbGVlcChtaWxsaXNlY29uZHM6IG51bWJlcik6IENhbmNlbGxhYmxlUHJvbWlzZTx2b2lkPjtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IENhbmNlbGxhYmxlUHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyXG4gICAgICogdGhlIHNwZWNpZmllZCB0aW1lb3V0LCB3aXRoIHRoZSBwcm92aWRlZCB2YWx1ZS5cbiAgICAgKiBUaGUgcmV0dXJuZWQgcHJvbWlzZSBjYW4gYmUgY2FuY2VsbGVkIHdpdGhvdXQgY29uc2VxdWVuY2VzLlxuICAgICAqXG4gICAgICogQGdyb3VwIFN0YXRpYyBNZXRob2RzXG4gICAgICovXG4gICAgc3RhdGljIHNsZWVwPFQ+KG1pbGxpc2Vjb25kczogbnVtYmVyLCB2YWx1ZTogVCk6IENhbmNlbGxhYmxlUHJvbWlzZTxUPjtcbiAgICBzdGF0aWMgc2xlZXA8VCA9IHZvaWQ+KG1pbGxpc2Vjb25kczogbnVtYmVyLCB2YWx1ZT86IFQpOiBDYW5jZWxsYWJsZVByb21pc2U8VD4ge1xuICAgICAgICByZXR1cm4gbmV3IENhbmNlbGxhYmxlUHJvbWlzZTxUPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKHZhbHVlISksIG1pbGxpc2Vjb25kcyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgcmVqZWN0ZWQgQ2FuY2VsbGFibGVQcm9taXNlIGZvciB0aGUgcHJvdmlkZWQgcmVhc29uLlxuICAgICAqXG4gICAgICogQGdyb3VwIFN0YXRpYyBNZXRob2RzXG4gICAgICovXG4gICAgc3RhdGljIHJlamVjdDxUID0gbmV2ZXI+KHJlYXNvbj86IGFueSk6IENhbmNlbGxhYmxlUHJvbWlzZTxUPiB7XG4gICAgICAgIHJldHVybiBuZXcgQ2FuY2VsbGFibGVQcm9taXNlPFQ+KChfLCByZWplY3QpID0+IHJlamVjdChyZWFzb24pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHJlc29sdmVkIENhbmNlbGxhYmxlUHJvbWlzZS5cbiAgICAgKlxuICAgICAqIEBncm91cCBTdGF0aWMgTWV0aG9kc1xuICAgICAqL1xuICAgIHN0YXRpYyByZXNvbHZlKCk6IENhbmNlbGxhYmxlUHJvbWlzZTx2b2lkPjtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHJlc29sdmVkIENhbmNlbGxhYmxlUHJvbWlzZSBmb3IgdGhlIHByb3ZpZGVkIHZhbHVlLlxuICAgICAqXG4gICAgICogQGdyb3VwIFN0YXRpYyBNZXRob2RzXG4gICAgICovXG4gICAgc3RhdGljIHJlc29sdmU8VD4odmFsdWU6IFQpOiBDYW5jZWxsYWJsZVByb21pc2U8QXdhaXRlZDxUPj47XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyByZXNvbHZlZCBDYW5jZWxsYWJsZVByb21pc2UgZm9yIHRoZSBwcm92aWRlZCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBncm91cCBTdGF0aWMgTWV0aG9kc1xuICAgICAqL1xuICAgIHN0YXRpYyByZXNvbHZlPFQ+KHZhbHVlOiBUIHwgUHJvbWlzZUxpa2U8VD4pOiBDYW5jZWxsYWJsZVByb21pc2U8QXdhaXRlZDxUPj47XG4gICAgc3RhdGljIHJlc29sdmU8VCA9IHZvaWQ+KHZhbHVlPzogVCB8IFByb21pc2VMaWtlPFQ+KTogQ2FuY2VsbGFibGVQcm9taXNlPEF3YWl0ZWQ8VD4+IHtcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQ2FuY2VsbGFibGVQcm9taXNlKSB7XG4gICAgICAgICAgICAvLyBPcHRpbWlzZSBmb3IgY2FuY2VsbGFibGUgcHJvbWlzZXMuXG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBDYW5jZWxsYWJsZVByb21pc2U8YW55PigocmVzb2x2ZSkgPT4gcmVzb2x2ZSh2YWx1ZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ2FuY2VsbGFibGVQcm9taXNlIGFuZCByZXR1cm5zIGl0IGluIGFuIG9iamVjdCwgYWxvbmcgd2l0aCBpdHMgcmVzb2x2ZSBhbmQgcmVqZWN0IGZ1bmN0aW9uc1xuICAgICAqIGFuZCBhIGdldHRlci9zZXR0ZXIgZm9yIHRoZSBjYW5jZWxsYXRpb24gY2FsbGJhY2suXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBwb2x5ZmlsbGVkLCBoZW5jZSBhdmFpbGFibGUgaW4gZXZlcnkgT1Mvd2VidmlldyB2ZXJzaW9uLlxuICAgICAqXG4gICAgICogQGdyb3VwIFN0YXRpYyBNZXRob2RzXG4gICAgICovXG4gICAgc3RhdGljIHdpdGhSZXNvbHZlcnM8VD4oKTogQ2FuY2VsbGFibGVQcm9taXNlV2l0aFJlc29sdmVyczxUPiB7XG4gICAgICAgIGxldCByZXN1bHQ6IENhbmNlbGxhYmxlUHJvbWlzZVdpdGhSZXNvbHZlcnM8VD4gPSB7IG9uY2FuY2VsbGVkOiBudWxsIH0gYXMgYW55O1xuICAgICAgICByZXN1bHQucHJvbWlzZSA9IG5ldyBDYW5jZWxsYWJsZVByb21pc2U8VD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgcmVzdWx0LnJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICAgICAgcmVzdWx0LnJlamVjdCA9IHJlamVjdDtcbiAgICAgICAgfSwgKGNhdXNlPzogYW55KSA9PiB7IHJlc3VsdC5vbmNhbmNlbGxlZD8uKGNhdXNlKTsgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgYSBjYWxsYmFjayB0aGF0IGltcGxlbWVudHMgdGhlIGNhbmNlbGxhdGlvbiBhbGdvcml0aG0gZm9yIHRoZSBnaXZlbiBjYW5jZWxsYWJsZSBwcm9taXNlLlxuICogVGhlIHByb21pc2UgcmV0dXJuZWQgZnJvbSB0aGUgcmVzdWx0aW5nIGZ1bmN0aW9uIGRvZXMgbm90IHJlamVjdC5cbiAqL1xuZnVuY3Rpb24gY2FuY2VsbGVyRm9yPFQ+KHByb21pc2U6IENhbmNlbGxhYmxlUHJvbWlzZVdpdGhSZXNvbHZlcnM8VD4sIHN0YXRlOiBDYW5jZWxsYWJsZVByb21pc2VTdGF0ZSkge1xuICAgIGxldCBjYW5jZWxsYXRpb25Qcm9taXNlOiB2b2lkIHwgUHJvbWlzZUxpa2U8dm9pZD4gPSB1bmRlZmluZWQ7XG5cbiAgICByZXR1cm4gKHJlYXNvbjogQ2FuY2VsRXJyb3IpOiB2b2lkIHwgUHJvbWlzZUxpa2U8dm9pZD4gPT4ge1xuICAgICAgICBpZiAoIXN0YXRlLnNldHRsZWQpIHtcbiAgICAgICAgICAgIHN0YXRlLnNldHRsZWQgPSB0cnVlO1xuICAgICAgICAgICAgc3RhdGUucmVhc29uID0gcmVhc29uO1xuICAgICAgICAgICAgcHJvbWlzZS5yZWplY3QocmVhc29uKTtcblxuICAgICAgICAgICAgLy8gQXR0YWNoIGFuIGVycm9yIGhhbmRsZXIgdGhhdCBpZ25vcmVzIHRoaXMgc3BlY2lmaWMgcmVqZWN0aW9uIHJlYXNvbiBhbmQgbm90aGluZyBlbHNlLlxuICAgICAgICAgICAgLy8gSW4gdGhlb3J5LCBhIHNhbmUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiBhdCB0aGlzIHBvaW50XG4gICAgICAgICAgICAvLyBzaG91bGQgYWx3YXlzIHJlamVjdCB3aXRoIG91ciBjYW5jZWxsYXRpb24gcmVhc29uLFxuICAgICAgICAgICAgLy8gaGVuY2UgdGhlIGhhbmRsZXIgd2lsbCBuZXZlciB0aHJvdy5cbiAgICAgICAgICAgIHZvaWQgcHJvbWlzZVRoZW4uY2FsbChwcm9taXNlLnByb21pc2UsIHVuZGVmaW5lZCwgKGVycikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlcnIgIT09IHJlYXNvbikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiByZWFzb24gaXMgbm90IHNldCwgdGhlIHByb21pc2UgcmVzb2x2ZWQgcmVndWxhcmx5LCBoZW5jZSB3ZSBtdXN0IG5vdCBjYWxsIG9uY2FuY2VsbGVkLlxuICAgICAgICAvLyBJZiBvbmNhbmNlbGxlZCBpcyB1bnNldCwgbm8gbmVlZCB0byBnbyBhbnkgZnVydGhlci5cbiAgICAgICAgaWYgKCFzdGF0ZS5yZWFzb24gfHwgIXByb21pc2Uub25jYW5jZWxsZWQpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgY2FuY2VsbGF0aW9uUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUocHJvbWlzZS5vbmNhbmNlbGxlZCEoc3RhdGUucmVhc29uIS5jYXVzZSkpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgUHJvbWlzZS5yZWplY3QobmV3IENhbmNlbGxlZFJlamVjdGlvbkVycm9yKHByb21pc2UucHJvbWlzZSwgZXJyLCBcIlVuaGFuZGxlZCBleGNlcHRpb24gaW4gb25jYW5jZWxsZWQgY2FsbGJhY2suXCIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGNhbmNlbGxhdGlvblByb21pc2UudGhlbih1bmRlZmluZWQsIChyZWFzb24/KSA9PiB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQ2FuY2VsbGVkUmVqZWN0aW9uRXJyb3IocHJvbWlzZS5wcm9taXNlLCByZWFzb24sIFwiVW5oYW5kbGVkIHJlamVjdGlvbiBpbiBvbmNhbmNlbGxlZCBjYWxsYmFjay5cIik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFVuc2V0IG9uY2FuY2VsbGVkIHRvIHByZXZlbnQgcmVwZWF0ZWQgY2FsbHMuXG4gICAgICAgIHByb21pc2Uub25jYW5jZWxsZWQgPSBudWxsO1xuXG4gICAgICAgIHJldHVybiBjYW5jZWxsYXRpb25Qcm9taXNlO1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgY2FsbGJhY2sgdGhhdCBpbXBsZW1lbnRzIHRoZSByZXNvbHV0aW9uIGFsZ29yaXRobSBmb3IgdGhlIGdpdmVuIGNhbmNlbGxhYmxlIHByb21pc2UuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVyRm9yPFQ+KHByb21pc2U6IENhbmNlbGxhYmxlUHJvbWlzZVdpdGhSZXNvbHZlcnM8VD4sIHN0YXRlOiBDYW5jZWxsYWJsZVByb21pc2VTdGF0ZSk6IENhbmNlbGxhYmxlUHJvbWlzZVJlc29sdmVyPFQ+IHtcbiAgICByZXR1cm4gKHZhbHVlKSA9PiB7XG4gICAgICAgIGlmIChzdGF0ZS5yZXNvbHZpbmcpIHsgcmV0dXJuOyB9XG4gICAgICAgIHN0YXRlLnJlc29sdmluZyA9IHRydWU7XG5cbiAgICAgICAgaWYgKHZhbHVlID09PSBwcm9taXNlLnByb21pc2UpIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZS5zZXR0bGVkKSB7IHJldHVybjsgfVxuICAgICAgICAgICAgc3RhdGUuc2V0dGxlZCA9IHRydWU7XG4gICAgICAgICAgICBwcm9taXNlLnJlamVjdChuZXcgVHlwZUVycm9yKFwiQSBwcm9taXNlIGNhbm5vdCBiZSByZXNvbHZlZCB3aXRoIGl0c2VsZi5cIikpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSkge1xuICAgICAgICAgICAgbGV0IHRoZW46IGFueTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhlbiA9ICh2YWx1ZSBhcyBhbnkpLnRoZW47XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBzdGF0ZS5zZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBwcm9taXNlLnJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlzQ2FsbGFibGUodGhlbikpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY2FuY2VsID0gKHZhbHVlIGFzIGFueSkuY2FuY2VsO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNDYWxsYWJsZShjYW5jZWwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvbmNhbmNlbGxlZCA9IChjYXVzZT86IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZmxlY3QuYXBwbHkoY2FuY2VsLCB2YWx1ZSwgW2NhdXNlXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLnJlYXNvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGFscmVhZHkgY2FuY2VsbGVkLCBwcm9wYWdhdGUgY2FuY2VsbGF0aW9uLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBwcm9taXNlIHJldHVybmVkIGZyb20gdGhlIGNhbmNlbGxlciBhbGdvcml0aG0gZG9lcyBub3QgcmVqZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gaXQgY2FuIGJlIGRpc2NhcmRlZCBzYWZlbHkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCBjYW5jZWxsZXJGb3IoeyAuLi5wcm9taXNlLCBvbmNhbmNlbGxlZCB9LCBzdGF0ZSkoc3RhdGUucmVhc29uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZS5vbmNhbmNlbGxlZCA9IG9uY2FuY2VsbGVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCB7fVxuXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3U3RhdGU6IENhbmNlbGxhYmxlUHJvbWlzZVN0YXRlID0ge1xuICAgICAgICAgICAgICAgICAgICByb290OiBzdGF0ZS5yb290LFxuICAgICAgICAgICAgICAgICAgICByZXNvbHZpbmc6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBnZXQgc2V0dGxlZCgpIHsgcmV0dXJuIHRoaXMucm9vdC5zZXR0bGVkIH0sXG4gICAgICAgICAgICAgICAgICAgIHNldCBzZXR0bGVkKHZhbHVlKSB7IHRoaXMucm9vdC5zZXR0bGVkID0gdmFsdWU7IH0sXG4gICAgICAgICAgICAgICAgICAgIGdldCByZWFzb24oKSB7IHJldHVybiB0aGlzLnJvb3QucmVhc29uIH1cbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVqZWN0b3IgPSByZWplY3RvckZvcihwcm9taXNlLCBuZXdTdGF0ZSk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgUmVmbGVjdC5hcHBseSh0aGVuLCB2YWx1ZSwgW3Jlc29sdmVyRm9yKHByb21pc2UsIG5ld1N0YXRlKSwgcmVqZWN0b3JdKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0b3IoZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBJTVBPUlRBTlQhXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RhdGUuc2V0dGxlZCkgeyByZXR1cm47IH1cbiAgICAgICAgc3RhdGUuc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIHByb21pc2UucmVzb2x2ZSh2YWx1ZSk7XG4gICAgfTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgY2FsbGJhY2sgdGhhdCBpbXBsZW1lbnRzIHRoZSByZWplY3Rpb24gYWxnb3JpdGhtIGZvciB0aGUgZ2l2ZW4gY2FuY2VsbGFibGUgcHJvbWlzZS5cbiAqL1xuZnVuY3Rpb24gcmVqZWN0b3JGb3I8VD4ocHJvbWlzZTogQ2FuY2VsbGFibGVQcm9taXNlV2l0aFJlc29sdmVyczxUPiwgc3RhdGU6IENhbmNlbGxhYmxlUHJvbWlzZVN0YXRlKTogQ2FuY2VsbGFibGVQcm9taXNlUmVqZWN0b3Ige1xuICAgIHJldHVybiAocmVhc29uPykgPT4ge1xuICAgICAgICBpZiAoc3RhdGUucmVzb2x2aW5nKSB7IHJldHVybjsgfVxuICAgICAgICBzdGF0ZS5yZXNvbHZpbmcgPSB0cnVlO1xuXG4gICAgICAgIGlmIChzdGF0ZS5zZXR0bGVkKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBDYW5jZWxFcnJvciAmJiBzdGF0ZS5yZWFzb24gaW5zdGFuY2VvZiBDYW5jZWxFcnJvciAmJiBPYmplY3QuaXMocmVhc29uLmNhdXNlLCBzdGF0ZS5yZWFzb24uY2F1c2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFN3YWxsb3cgbGF0ZSByZWplY3Rpb25zIHRoYXQgYXJlIENhbmNlbEVycm9ycyB3aG9zZSBjYW5jZWxsYXRpb24gY2F1c2UgaXMgdGhlIHNhbWUgYXMgb3Vycy5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2gge31cblxuICAgICAgICAgICAgdm9pZCBQcm9taXNlLnJlamVjdChuZXcgQ2FuY2VsbGVkUmVqZWN0aW9uRXJyb3IocHJvbWlzZS5wcm9taXNlLCByZWFzb24pKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YXRlLnNldHRsZWQgPSB0cnVlO1xuICAgICAgICAgICAgcHJvbWlzZS5yZWplY3QocmVhc29uKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgY2FsbGJhY2sgdGhhdCBjYW5jZWxzIGFsbCB2YWx1ZXMgaW4gYW4gaXRlcmFibGUgdGhhdCBsb29rIGxpa2UgY2FuY2VsbGFibGUgdGhlbmFibGVzLlxuICovXG5mdW5jdGlvbiBhbGxDYW5jZWxsZXIodmFsdWVzOiBJdGVyYWJsZTxhbnk+KTogQ2FuY2VsbGFibGVQcm9taXNlQ2FuY2VsbGVyIHtcbiAgICByZXR1cm4gKGNhdXNlPykgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoaXNDYWxsYWJsZSh2YWx1ZS50aGVuKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY2FuY2VsID0gdmFsdWUuY2FuY2VsO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNDYWxsYWJsZShjYW5jZWwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBSZWZsZWN0LmFwcGx5KGNhbmNlbCwgdmFsdWUsIFtjYXVzZV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCB7fVxuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgaXRzIGFyZ3VtZW50LlxuICovXG5mdW5jdGlvbiBpZGVudGl0eTxUPih4OiBUKTogVCB7XG4gICAgcmV0dXJuIHg7XG59XG5cbi8qKlxuICogVGhyb3dzIGl0cyBhcmd1bWVudC5cbiAqL1xuZnVuY3Rpb24gdGhyb3dlcihyZWFzb24/OiBhbnkpOiBuZXZlciB7XG4gICAgdGhyb3cgcmVhc29uO1xufVxuXG4vKipcbiAqIEF0dGVtcHRzIHZhcmlvdXMgc3RyYXRlZ2llcyB0byBjb252ZXJ0IGFuIGVycm9yIHRvIGEgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBlcnJvck1lc3NhZ2UoZXJyOiBhbnkpOiBzdHJpbmcge1xuICAgIHRyeSB7XG4gICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBFcnJvciB8fCB0eXBlb2YgZXJyICE9PSAnb2JqZWN0JyB8fCBlcnIudG9TdHJpbmcgIT09IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBcIlwiICsgZXJyO1xuICAgICAgICB9XG4gICAgfSBjYXRjaCB7fVxuXG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGVycik7XG4gICAgfSBjYXRjaCB7fVxuXG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlcnIpO1xuICAgIH0gY2F0Y2gge31cblxuICAgIHJldHVybiBcIjxjb3VsZCBub3QgY29udmVydCBlcnJvciB0byBzdHJpbmc+XCI7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgY3VycmVudCBiYXJyaWVyIHByb21pc2UgZm9yIHRoZSBnaXZlbiBjYW5jZWxsYWJsZSBwcm9taXNlLiBJZiBuZWNlc3NhcnksIGluaXRpYWxpc2VzIHRoZSBiYXJyaWVyLlxuICovXG5mdW5jdGlvbiBjdXJyZW50QmFycmllcjxUPihwcm9taXNlOiBDYW5jZWxsYWJsZVByb21pc2U8VD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgcHdyOiBQYXJ0aWFsPFByb21pc2VXaXRoUmVzb2x2ZXJzPHZvaWQ+PiA9IHByb21pc2VbYmFycmllclN5bV0gPz8ge307XG4gICAgaWYgKCEoJ3Byb21pc2UnIGluIHB3cikpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihwd3IsIHByb21pc2VXaXRoUmVzb2x2ZXJzPHZvaWQ+KCkpO1xuICAgIH1cbiAgICBpZiAocHJvbWlzZVtiYXJyaWVyU3ltXSA9PSBudWxsKSB7XG4gICAgICAgIHB3ci5yZXNvbHZlISgpO1xuICAgICAgICBwcm9taXNlW2JhcnJpZXJTeW1dID0gcHdyO1xuICAgIH1cbiAgICByZXR1cm4gcHdyLnByb21pc2UhO1xufVxuXG4vLyBTdG9wIHNuZWFreSBwZW9wbGUgZnJvbSBicmVha2luZyB0aGUgYmFycmllciBtZWNoYW5pc20uXG5jb25zdCBwcm9taXNlVGhlbiA9IFByb21pc2UucHJvdG90eXBlLnRoZW47XG5Qcm9taXNlLnByb3RvdHlwZS50aGVuID0gZnVuY3Rpb24oLi4uYXJncykge1xuICAgIGlmICh0aGlzIGluc3RhbmNlb2YgQ2FuY2VsbGFibGVQcm9taXNlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRoZW4oLi4uYXJncyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuYXBwbHkocHJvbWlzZVRoZW4sIHRoaXMsIGFyZ3MpO1xuICAgIH1cbn1cblxuLy8gUG9seWZpbGwgUHJvbWlzZS53aXRoUmVzb2x2ZXJzLlxubGV0IHByb21pc2VXaXRoUmVzb2x2ZXJzID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzO1xuaWYgKHByb21pc2VXaXRoUmVzb2x2ZXJzICYmIHR5cGVvZiBwcm9taXNlV2l0aFJlc29sdmVycyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHByb21pc2VXaXRoUmVzb2x2ZXJzID0gcHJvbWlzZVdpdGhSZXNvbHZlcnMuYmluZChQcm9taXNlKTtcbn0gZWxzZSB7XG4gICAgcHJvbWlzZVdpdGhSZXNvbHZlcnMgPSBmdW5jdGlvbiA8VD4oKTogUHJvbWlzZVdpdGhSZXNvbHZlcnM8VD4ge1xuICAgICAgICBsZXQgcmVzb2x2ZSE6ICh2YWx1ZTogVCB8IFByb21pc2VMaWtlPFQ+KSA9PiB2b2lkO1xuICAgICAgICBsZXQgcmVqZWN0ITogKHJlYXNvbj86IGFueSkgPT4gdm9pZDtcbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlPFQ+KChyZXMsIHJlaikgPT4geyByZXNvbHZlID0gcmVzOyByZWplY3QgPSByZWo7IH0pO1xuICAgICAgICByZXR1cm4geyBwcm9taXNlLCByZXNvbHZlLCByZWplY3QgfTtcbiAgICB9XG59IiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5pbXBvcnQge25ld1J1bnRpbWVDYWxsZXIsIG9iamVjdE5hbWVzfSBmcm9tIFwiLi9ydW50aW1lLmpzXCI7XG5cbmNvbnN0IGNhbGwgPSBuZXdSdW50aW1lQ2FsbGVyKG9iamVjdE5hbWVzLkNsaXBib2FyZCk7XG5cbmNvbnN0IENsaXBib2FyZFNldFRleHQgPSAwO1xuY29uc3QgQ2xpcGJvYXJkVGV4dCA9IDE7XG5cbi8qKlxuICogU2V0cyB0aGUgdGV4dCB0byB0aGUgQ2xpcGJvYXJkLlxuICpcbiAqIEBwYXJhbSB0ZXh0IC0gVGhlIHRleHQgdG8gYmUgc2V0IHRvIHRoZSBDbGlwYm9hcmQuXG4gKiBAcmV0dXJuIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gU2V0VGV4dCh0ZXh0OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gY2FsbChDbGlwYm9hcmRTZXRUZXh0LCB7dGV4dH0pO1xufVxuXG4vKipcbiAqIEdldCB0aGUgQ2xpcGJvYXJkIHRleHRcbiAqXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSB0ZXh0IGZyb20gdGhlIENsaXBib2FyZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFRleHQoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gY2FsbChDbGlwYm9hcmRUZXh0KTtcbn1cbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuLyoqXG4gKiBBbnkgaXMgYSBkdW1teSBjcmVhdGlvbiBmdW5jdGlvbiBmb3Igc2ltcGxlIG9yIHVua25vd24gdHlwZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBBbnk8VD4oc291cmNlOiBhbnkpOiBUIHtcbiAgICByZXR1cm4gc291cmNlO1xufVxuXG4vKipcbiAqIEJ5dGVTbGljZSBpcyBhIGNyZWF0aW9uIGZ1bmN0aW9uIHRoYXQgcmVwbGFjZXNcbiAqIG51bGwgc3RyaW5ncyB3aXRoIGVtcHR5IHN0cmluZ3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBCeXRlU2xpY2Uoc291cmNlOiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiAoKHNvdXJjZSA9PSBudWxsKSA/IFwiXCIgOiBzb3VyY2UpO1xufVxuXG4vKipcbiAqIEFycmF5IHRha2VzIGEgY3JlYXRpb24gZnVuY3Rpb24gZm9yIGFuIGFyYml0cmFyeSB0eXBlXG4gKiBhbmQgcmV0dXJucyBhbiBpbi1wbGFjZSBjcmVhdGlvbiBmdW5jdGlvbiBmb3IgYW4gYXJyYXlcbiAqIHdob3NlIGVsZW1lbnRzIGFyZSBvZiB0aGF0IHR5cGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBBcnJheTxUPihlbGVtZW50OiAoc291cmNlOiBhbnkpID0+IFQpOiAoc291cmNlOiBhbnkpID0+IFRbXSB7XG4gICAgaWYgKGVsZW1lbnQgPT09IEFueSkge1xuICAgICAgICByZXR1cm4gKHNvdXJjZSkgPT4gKHNvdXJjZSA9PT0gbnVsbCA/IFtdIDogc291cmNlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKHNvdXJjZSkgPT4ge1xuICAgICAgICBpZiAoc291cmNlID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3VyY2UubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHNvdXJjZVtpXSA9IGVsZW1lbnQoc291cmNlW2ldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc291cmNlO1xuICAgIH07XG59XG5cbi8qKlxuICogTWFwIHRha2VzIGNyZWF0aW9uIGZ1bmN0aW9ucyBmb3IgdHdvIGFyYml0cmFyeSB0eXBlc1xuICogYW5kIHJldHVybnMgYW4gaW4tcGxhY2UgY3JlYXRpb24gZnVuY3Rpb24gZm9yIGFuIG9iamVjdFxuICogd2hvc2Uga2V5cyBhbmQgdmFsdWVzIGFyZSBvZiB0aG9zZSB0eXBlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE1hcDxWPihrZXk6IChzb3VyY2U6IGFueSkgPT4gc3RyaW5nLCB2YWx1ZTogKHNvdXJjZTogYW55KSA9PiBWKTogKHNvdXJjZTogYW55KSA9PiBSZWNvcmQ8c3RyaW5nLCBWPiB7XG4gICAgaWYgKHZhbHVlID09PSBBbnkpIHtcbiAgICAgICAgcmV0dXJuIChzb3VyY2UpID0+IChzb3VyY2UgPT09IG51bGwgPyB7fSA6IHNvdXJjZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIChzb3VyY2UpID0+IHtcbiAgICAgICAgaWYgKHNvdXJjZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHNvdXJjZSkge1xuICAgICAgICAgICAgc291cmNlW2tleV0gPSB2YWx1ZShzb3VyY2Vba2V5XSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICB9O1xufVxuXG4vKipcbiAqIE51bGxhYmxlIHRha2VzIGEgY3JlYXRpb24gZnVuY3Rpb24gZm9yIGFuIGFyYml0cmFyeSB0eXBlXG4gKiBhbmQgcmV0dXJucyBhIGNyZWF0aW9uIGZ1bmN0aW9uIGZvciBhIG51bGxhYmxlIHZhbHVlIG9mIHRoYXQgdHlwZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE51bGxhYmxlPFQ+KGVsZW1lbnQ6IChzb3VyY2U6IGFueSkgPT4gVCk6IChzb3VyY2U6IGFueSkgPT4gKFQgfCBudWxsKSB7XG4gICAgaWYgKGVsZW1lbnQgPT09IEFueSkge1xuICAgICAgICByZXR1cm4gQW55O1xuICAgIH1cblxuICAgIHJldHVybiAoc291cmNlKSA9PiAoc291cmNlID09PSBudWxsID8gbnVsbCA6IGVsZW1lbnQoc291cmNlKSk7XG59XG5cbi8qKlxuICogU3RydWN0IHRha2VzIGFuIG9iamVjdCBtYXBwaW5nIGZpZWxkIG5hbWVzIHRvIGNyZWF0aW9uIGZ1bmN0aW9uc1xuICogYW5kIHJldHVybnMgYW4gaW4tcGxhY2UgY3JlYXRpb24gZnVuY3Rpb24gZm9yIGEgc3RydWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gU3RydWN0PFxuICAgIFQgZXh0ZW5kcyB7IFtfOiBzdHJpbmddOiAoKHNvdXJjZTogYW55KSA9PiBhbnkpIH0sXG4gICAgVSBleHRlbmRzIHsgW0tleSBpbiBrZXlvZiBUXT86IFJldHVyblR5cGU8VFtLZXldPiB9XG4+KGNyZWF0ZUZpZWxkOiBUKTogKHNvdXJjZTogYW55KSA9PiBVIHtcbiAgICBsZXQgYWxsQW55ID0gdHJ1ZTtcbiAgICBmb3IgKGNvbnN0IG5hbWUgaW4gY3JlYXRlRmllbGQpIHtcbiAgICAgICAgaWYgKGNyZWF0ZUZpZWxkW25hbWVdICE9PSBBbnkpIHtcbiAgICAgICAgICAgIGFsbEFueSA9IGZhbHNlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGFsbEFueSkge1xuICAgICAgICByZXR1cm4gQW55O1xuICAgIH1cblxuICAgIHJldHVybiAoc291cmNlKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBpbiBjcmVhdGVGaWVsZCkge1xuICAgICAgICAgICAgaWYgKG5hbWUgaW4gc291cmNlKSB7XG4gICAgICAgICAgICAgICAgc291cmNlW25hbWVdID0gY3JlYXRlRmllbGRbbmFtZV0oc291cmNlW25hbWVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc291cmNlO1xuICAgIH07XG59XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbmV4cG9ydCBpbnRlcmZhY2UgU2l6ZSB7XG4gICAgLyoqIFRoZSB3aWR0aCBvZiBhIHJlY3Rhbmd1bGFyIGFyZWEuICovXG4gICAgV2lkdGg6IG51bWJlcjtcbiAgICAvKiogVGhlIGhlaWdodCBvZiBhIHJlY3Rhbmd1bGFyIGFyZWEuICovXG4gICAgSGVpZ2h0OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVjdCB7XG4gICAgLyoqIFRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIG9yaWdpbi4gKi9cbiAgICBYOiBudW1iZXI7XG4gICAgLyoqIFRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIG9yaWdpbi4gKi9cbiAgICBZOiBudW1iZXI7XG4gICAgLyoqIFRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlLiAqL1xuICAgIFdpZHRoOiBudW1iZXI7XG4gICAgLyoqIFRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZS4gKi9cbiAgICBIZWlnaHQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTY3JlZW4ge1xuICAgIC8qKiBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHNjcmVlbi4gKi9cbiAgICBJRDogc3RyaW5nO1xuICAgIC8qKiBIdW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSBzY3JlZW4uICovXG4gICAgTmFtZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgc2NhbGUgZmFjdG9yIG9mIHRoZSBzY3JlZW4gKERQSS85NikuIDEgPSBzdGFuZGFyZCBEUEksIDIgPSBIaURQSSAoUmV0aW5hKSwgZXRjLiAqL1xuICAgIFNjYWxlRmFjdG9yOiBudW1iZXI7XG4gICAgLyoqIFRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHNjcmVlbi4gKi9cbiAgICBYOiBudW1iZXI7XG4gICAgLyoqIFRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHNjcmVlbi4gKi9cbiAgICBZOiBudW1iZXI7XG4gICAgLyoqIENvbnRhaW5zIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBzY3JlZW4uICovXG4gICAgU2l6ZTogU2l6ZTtcbiAgICAvKiogQ29udGFpbnMgdGhlIGJvdW5kcyBvZiB0aGUgc2NyZWVuIGluIHRlcm1zIG9mIFgsIFksIFdpZHRoLCBhbmQgSGVpZ2h0LiAqL1xuICAgIEJvdW5kczogUmVjdDtcbiAgICAvKiogQ29udGFpbnMgdGhlIHBoeXNpY2FsIGJvdW5kcyBvZiB0aGUgc2NyZWVuIGluIHRlcm1zIG9mIFgsIFksIFdpZHRoLCBhbmQgSGVpZ2h0IChiZWZvcmUgc2NhbGluZykuICovXG4gICAgUGh5c2ljYWxCb3VuZHM6IFJlY3Q7XG4gICAgLyoqIENvbnRhaW5zIHRoZSBhcmVhIG9mIHRoZSBzY3JlZW4gdGhhdCBpcyBhY3R1YWxseSB1c2FibGUgKGV4Y2x1ZGluZyB0YXNrYmFyIGFuZCBvdGhlciBzeXN0ZW0gVUkpLiAqL1xuICAgIFdvcmtBcmVhOiBSZWN0O1xuICAgIC8qKiBDb250YWlucyB0aGUgcGh5c2ljYWwgV29ya0FyZWEgb2YgdGhlIHNjcmVlbiAoYmVmb3JlIHNjYWxpbmcpLiAqL1xuICAgIFBoeXNpY2FsV29ya0FyZWE6IFJlY3Q7XG4gICAgLyoqIFRydWUgaWYgdGhpcyBpcyB0aGUgcHJpbWFyeSBtb25pdG9yIHNlbGVjdGVkIGJ5IHRoZSB1c2VyIGluIHRoZSBvcGVyYXRpbmcgc3lzdGVtLiAqL1xuICAgIElzUHJpbWFyeTogYm9vbGVhbjtcbiAgICAvKiogVGhlIHJvdGF0aW9uIG9mIHRoZSBzY3JlZW4uICovXG4gICAgUm90YXRpb246IG51bWJlcjtcbn1cblxuaW1wb3J0IHsgbmV3UnVudGltZUNhbGxlciwgb2JqZWN0TmFtZXMgfSBmcm9tIFwiLi9ydW50aW1lLmpzXCI7XG5jb25zdCBjYWxsID0gbmV3UnVudGltZUNhbGxlcihvYmplY3ROYW1lcy5TY3JlZW5zKTtcblxuY29uc3QgZ2V0QWxsID0gMDtcbmNvbnN0IGdldFByaW1hcnkgPSAxO1xuY29uc3QgZ2V0Q3VycmVudCA9IDI7XG5cbi8qKlxuICogR2V0cyBhbGwgc2NyZWVucy5cbiAqXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBvZiBTY3JlZW4gb2JqZWN0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEdldEFsbCgpOiBQcm9taXNlPFNjcmVlbltdPiB7XG4gICAgcmV0dXJuIGNhbGwoZ2V0QWxsKTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBwcmltYXJ5IHNjcmVlbi5cbiAqXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcHJpbWFyeSBzY3JlZW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBHZXRQcmltYXJ5KCk6IFByb21pc2U8U2NyZWVuPiB7XG4gICAgcmV0dXJuIGNhbGwoZ2V0UHJpbWFyeSk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgY3VycmVudCBhY3RpdmUgc2NyZWVuLlxuICpcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGN1cnJlbnQgYWN0aXZlIHNjcmVlbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEdldEN1cnJlbnQoKTogUHJvbWlzZTxTY3JlZW4+IHtcbiAgICByZXR1cm4gY2FsbChnZXRDdXJyZW50KTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7O0FDQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7O0FDQUE7QUFBQTtBQUFBO0FBQUE7OztBQzZCQSxJQUFNLGNBQ0Y7QUFFRyxTQUFTLE9BQU8sT0FBZSxJQUFZO0FBQzlDLE1BQUksS0FBSztBQUVULE1BQUksSUFBSSxPQUFPO0FBQ2YsU0FBTyxLQUFLO0FBRVIsVUFBTSxZQUFhLEtBQUssT0FBTyxJQUFJLEtBQU0sQ0FBQztBQUFBLEVBQzlDO0FBQ0EsU0FBTztBQUNYOzs7QUM3QkEsSUFBTSxhQUFhLE9BQU8sU0FBUyxTQUFTO0FBR3JDLElBQU0sY0FBYyxPQUFPLE9BQU87QUFBQSxFQUNyQyxNQUFN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QUFNLGFBQWE7QUFDbkIsSUFBTSxhQUFhO0FBT1osU0FBUyxTQUE0QjtBQUN4QyxTQUFPQSxNQUFLLE1BQU07QUFDdEI7QUFPTyxTQUFTLGFBQThCO0FBQzFDLFNBQU9BLE1BQUssVUFBVTtBQUMxQjtBQU9PLFNBQVMsYUFBOEI7QUFDMUMsU0FBT0EsTUFBSyxVQUFVO0FBQzFCOzs7QXRCNUVBLE9BQU8sU0FBUyxPQUFPLFVBQVUsQ0FBQztBQTRDbEMsT0FBTyxPQUFPLFNBQWdCO0FBQ3ZCLE9BQU8scUJBQXFCOyIsCiAgIm5hbWVzIjogWyJfYSIsICJFcnJvciIsICJjYWxsIiwgIl9hIiwgIkVycm9yIiwgImNhbGwiLCAicmVzaXphYmxlIiwgImNhbGwiLCAiX2EiLCAiY2FsbCIsICJfYSIsICJfYSIsICJjYWxsIiwgIkhpZGVNZXRob2QiLCAiU2hvd01ldGhvZCIsICJpc0RvY3VtZW50RG90QWxsIiwgIl9hIiwgInJlYXNvbiIsICJ2YWx1ZSIsICJjYWxsIiwgImdldEFuZERlbGV0ZVJlc3BvbnNlIiwgImdlbmVyYXRlSUQiLCAiY2FsbCIsICJBcnJheSIsICJNYXAiLCAiQXJyYXkiLCAiTWFwIiwgImtleSIsICJjYWxsIl0KfQo= diff --git a/v3/internal/assetserver/bundledassets/runtime.js b/v3/internal/assetserver/bundledassets/runtime.js index 08ad86c99..3b5fadf51 100644 --- a/v3/internal/assetserver/bundledassets/runtime.js +++ b/v3/internal/assetserver/bundledassets/runtime.js @@ -1 +1 @@ -var Oe=Object.defineProperty,sn=Object.defineProperties;var ln=Object.getOwnPropertyDescriptors;var Ae=Object.getOwnPropertySymbols;var an=Object.prototype.hasOwnProperty,cn=Object.prototype.propertyIsEnumerable;var Ee=(n,e,i)=>e in n?Oe(n,e,{enumerable:!0,configurable:!0,writable:!0,value:i}):n[e]=i,ke=(n,e)=>{for(var i in e||(e={}))an.call(e,i)&&Ee(n,i,e[i]);if(Ae)for(var i of Ae(e))cn.call(e,i)&&Ee(n,i,e[i]);return n},Fe=(n,e)=>sn(n,ln(e));var w=(n,e)=>{for(var i in e)Oe(n,i,{get:e[i],enumerable:!0})};var D=(n,e,i)=>new Promise((o,t)=>{var s=a=>{try{c(i.next(a))}catch(u){t(u)}},l=a=>{try{c(i.throw(a))}catch(u){t(u)}},c=a=>a.done?o(a.value):Promise.resolve(a.value).then(s,l);c((i=i.apply(n,e)).next())});var ce={};w(ce,{Application:()=>he,Browser:()=>_,Call:()=>Me,CancelError:()=>O,CancellablePromise:()=>F,CancelledRejectionError:()=>k,Clipboard:()=>Se,Create:()=>Te,Dialogs:()=>ee,Events:()=>oe,Flags:()=>pe,Screens:()=>Re,System:()=>we,WML:()=>ae,Window:()=>Z});var ae={};w(ae,{Enable:()=>le,Reload:()=>Ve});var _={};w(_,{OpenURL:()=>q});var dn="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";function M(n=21){let e="",i=n|0;for(;i--;)e+=dn[Math.random()*64|0];return e}var mn=window.location.origin+"/wails/runtime",d=Object.freeze({Call:0,Clipboard:1,Application:2,Events:3,ContextMenu:4,Dialog:5,Window:6,Screens:7,System:8,Browser:9,CancelCall:10}),un=M();function m(n,e=""){return function(i,o=null){return wn(n,i,e,o)}}function wn(n,e,i,o){return D(this,null,function*(){var c,a;let t=new URL(mn);t.searchParams.append("object",n.toString()),t.searchParams.append("method",e.toString()),o&&t.searchParams.append("args",JSON.stringify(o));let s={"x-wails-client-id":un};i&&(s["x-wails-window-name"]=i);let l=yield fetch(t,{headers:s});if(!l.ok)throw new Error(yield l.text());return((a=(c=l.headers.get("Content-Type"))==null?void 0:c.indexOf("application/json"))!=null?a:-1)!==-1?l.json():l.text()})}var pn=m(d.Browser),fn=0;function q(n){return pn(fn,{url:n.toString()})}var ee={};w(ee,{Error:()=>xn,Info:()=>Sn,OpenFile:()=>Rn,Question:()=>$,SaveFile:()=>An,Warning:()=>Tn});window._wails=window._wails||{};window._wails.dialogErrorCallback=Dn;window._wails.dialogResultCallback=Pn;var gn=m(d.Dialog),U=new Map,hn=0,Wn=1,bn=2,yn=3,vn=4,Cn=5;function Pn(n,e,i){let o=Le(n);if(o)if(i)try{o.resolve(JSON.parse(e))}catch(t){o.reject(new TypeError("could not parse result: "+t.message,{cause:t}))}else o.resolve(e)}function Dn(n,e){var i;(i=Le(n))==null||i.reject(new window.Error(e))}function Le(n){let e=U.get(n);return U.delete(n),e}function Mn(){let n;do n=M();while(U.has(n));return n}function S(n,e={}){let i=Mn();return new Promise((o,t)=>{U.set(i,{resolve:o,reject:t}),gn(n,Object.assign({"dialog-id":i},e)).catch(s=>{U.delete(i),t(s)})})}function Sn(n){return S(hn,n)}function Tn(n){return S(Wn,n)}function xn(n){return S(bn,n)}function $(n){return S(yn,n)}function Rn(n){var e;return(e=S(vn,n))!=null?e:[]}function An(n){return S(Cn,n)}var oe={};w(oe,{Emit:()=>ie,Off:()=>Un,OffAll:()=>In,On:()=>Fn,OnMultiple:()=>ne,Once:()=>Ln,Types:()=>Ie,WailsEvent:()=>T});var f=new Map,H=class{constructor(e,i,o){this.eventName=e,this.callback=i,this.maxCallbacks=o||-1}dispatch(e){try{this.callback(e)}catch(i){}return this.maxCallbacks===-1?!1:(this.maxCallbacks-=1,this.maxCallbacks===0)}};function Ue(n){let e=f.get(n.eventName);e&&(e=e.filter(i=>i!==n),e.length===0?f.delete(n.eventName):f.set(n.eventName,e))}var Ie=Object.freeze({Windows:Object.freeze({APMPowerSettingChange:"windows:APMPowerSettingChange",APMPowerStatusChange:"windows:APMPowerStatusChange",APMResumeAutomatic:"windows:APMResumeAutomatic",APMResumeSuspend:"windows:APMResumeSuspend",APMSuspend:"windows:APMSuspend",ApplicationStarted:"windows:ApplicationStarted",SystemThemeChanged:"windows:SystemThemeChanged",WebViewNavigationCompleted:"windows:WebViewNavigationCompleted",WindowActive:"windows:WindowActive",WindowBackgroundErase:"windows:WindowBackgroundErase",WindowClickActive:"windows:WindowClickActive",WindowClosing:"windows:WindowClosing",WindowDidMove:"windows:WindowDidMove",WindowDidResize:"windows:WindowDidResize",WindowDPIChanged:"windows:WindowDPIChanged",WindowDragDrop:"windows:WindowDragDrop",WindowDragEnter:"windows:WindowDragEnter",WindowDragLeave:"windows:WindowDragLeave",WindowDragOver:"windows:WindowDragOver",WindowEndMove:"windows:WindowEndMove",WindowEndResize:"windows:WindowEndResize",WindowFullscreen:"windows:WindowFullscreen",WindowHide:"windows:WindowHide",WindowInactive:"windows:WindowInactive",WindowKeyDown:"windows:WindowKeyDown",WindowKeyUp:"windows:WindowKeyUp",WindowKillFocus:"windows:WindowKillFocus",WindowNonClientHit:"windows:WindowNonClientHit",WindowNonClientMouseDown:"windows:WindowNonClientMouseDown",WindowNonClientMouseLeave:"windows:WindowNonClientMouseLeave",WindowNonClientMouseMove:"windows:WindowNonClientMouseMove",WindowNonClientMouseUp:"windows:WindowNonClientMouseUp",WindowPaint:"windows:WindowPaint",WindowRestore:"windows:WindowRestore",WindowSetFocus:"windows:WindowSetFocus",WindowShow:"windows:WindowShow",WindowStartMove:"windows:WindowStartMove",WindowStartResize:"windows:WindowStartResize",WindowUnFullscreen:"windows:WindowUnFullscreen",WindowZOrderChanged:"windows:WindowZOrderChanged",WindowMinimise:"windows:WindowMinimise",WindowUnMinimise:"windows:WindowUnMinimise",WindowMaximise:"windows:WindowMaximise",WindowUnMaximise:"windows:WindowUnMaximise"}),Mac:Object.freeze({ApplicationDidBecomeActive:"mac:ApplicationDidBecomeActive",ApplicationDidChangeBackingProperties:"mac:ApplicationDidChangeBackingProperties",ApplicationDidChangeEffectiveAppearance:"mac:ApplicationDidChangeEffectiveAppearance",ApplicationDidChangeIcon:"mac:ApplicationDidChangeIcon",ApplicationDidChangeOcclusionState:"mac:ApplicationDidChangeOcclusionState",ApplicationDidChangeScreenParameters:"mac:ApplicationDidChangeScreenParameters",ApplicationDidChangeStatusBarFrame:"mac:ApplicationDidChangeStatusBarFrame",ApplicationDidChangeStatusBarOrientation:"mac:ApplicationDidChangeStatusBarOrientation",ApplicationDidChangeTheme:"mac:ApplicationDidChangeTheme",ApplicationDidFinishLaunching:"mac:ApplicationDidFinishLaunching",ApplicationDidHide:"mac:ApplicationDidHide",ApplicationDidResignActive:"mac:ApplicationDidResignActive",ApplicationDidUnhide:"mac:ApplicationDidUnhide",ApplicationDidUpdate:"mac:ApplicationDidUpdate",ApplicationShouldHandleReopen:"mac:ApplicationShouldHandleReopen",ApplicationWillBecomeActive:"mac:ApplicationWillBecomeActive",ApplicationWillFinishLaunching:"mac:ApplicationWillFinishLaunching",ApplicationWillHide:"mac:ApplicationWillHide",ApplicationWillResignActive:"mac:ApplicationWillResignActive",ApplicationWillTerminate:"mac:ApplicationWillTerminate",ApplicationWillUnhide:"mac:ApplicationWillUnhide",ApplicationWillUpdate:"mac:ApplicationWillUpdate",MenuDidAddItem:"mac:MenuDidAddItem",MenuDidBeginTracking:"mac:MenuDidBeginTracking",MenuDidClose:"mac:MenuDidClose",MenuDidDisplayItem:"mac:MenuDidDisplayItem",MenuDidEndTracking:"mac:MenuDidEndTracking",MenuDidHighlightItem:"mac:MenuDidHighlightItem",MenuDidOpen:"mac:MenuDidOpen",MenuDidPopUp:"mac:MenuDidPopUp",MenuDidRemoveItem:"mac:MenuDidRemoveItem",MenuDidSendAction:"mac:MenuDidSendAction",MenuDidSendActionToItem:"mac:MenuDidSendActionToItem",MenuDidUpdate:"mac:MenuDidUpdate",MenuWillAddItem:"mac:MenuWillAddItem",MenuWillBeginTracking:"mac:MenuWillBeginTracking",MenuWillDisplayItem:"mac:MenuWillDisplayItem",MenuWillEndTracking:"mac:MenuWillEndTracking",MenuWillHighlightItem:"mac:MenuWillHighlightItem",MenuWillOpen:"mac:MenuWillOpen",MenuWillPopUp:"mac:MenuWillPopUp",MenuWillRemoveItem:"mac:MenuWillRemoveItem",MenuWillSendAction:"mac:MenuWillSendAction",MenuWillSendActionToItem:"mac:MenuWillSendActionToItem",MenuWillUpdate:"mac:MenuWillUpdate",WebViewDidCommitNavigation:"mac:WebViewDidCommitNavigation",WebViewDidFinishNavigation:"mac:WebViewDidFinishNavigation",WebViewDidReceiveServerRedirectForProvisionalNavigation:"mac:WebViewDidReceiveServerRedirectForProvisionalNavigation",WebViewDidStartProvisionalNavigation:"mac:WebViewDidStartProvisionalNavigation",WindowDidBecomeKey:"mac:WindowDidBecomeKey",WindowDidBecomeMain:"mac:WindowDidBecomeMain",WindowDidBeginSheet:"mac:WindowDidBeginSheet",WindowDidChangeAlpha:"mac:WindowDidChangeAlpha",WindowDidChangeBackingLocation:"mac:WindowDidChangeBackingLocation",WindowDidChangeBackingProperties:"mac:WindowDidChangeBackingProperties",WindowDidChangeCollectionBehavior:"mac:WindowDidChangeCollectionBehavior",WindowDidChangeEffectiveAppearance:"mac:WindowDidChangeEffectiveAppearance",WindowDidChangeOcclusionState:"mac:WindowDidChangeOcclusionState",WindowDidChangeOrderingMode:"mac:WindowDidChangeOrderingMode",WindowDidChangeScreen:"mac:WindowDidChangeScreen",WindowDidChangeScreenParameters:"mac:WindowDidChangeScreenParameters",WindowDidChangeScreenProfile:"mac:WindowDidChangeScreenProfile",WindowDidChangeScreenSpace:"mac:WindowDidChangeScreenSpace",WindowDidChangeScreenSpaceProperties:"mac:WindowDidChangeScreenSpaceProperties",WindowDidChangeSharingType:"mac:WindowDidChangeSharingType",WindowDidChangeSpace:"mac:WindowDidChangeSpace",WindowDidChangeSpaceOrderingMode:"mac:WindowDidChangeSpaceOrderingMode",WindowDidChangeTitle:"mac:WindowDidChangeTitle",WindowDidChangeToolbar:"mac:WindowDidChangeToolbar",WindowDidDeminiaturize:"mac:WindowDidDeminiaturize",WindowDidEndSheet:"mac:WindowDidEndSheet",WindowDidEnterFullScreen:"mac:WindowDidEnterFullScreen",WindowDidEnterVersionBrowser:"mac:WindowDidEnterVersionBrowser",WindowDidExitFullScreen:"mac:WindowDidExitFullScreen",WindowDidExitVersionBrowser:"mac:WindowDidExitVersionBrowser",WindowDidExpose:"mac:WindowDidExpose",WindowDidFocus:"mac:WindowDidFocus",WindowDidMiniaturize:"mac:WindowDidMiniaturize",WindowDidMove:"mac:WindowDidMove",WindowDidOrderOffScreen:"mac:WindowDidOrderOffScreen",WindowDidOrderOnScreen:"mac:WindowDidOrderOnScreen",WindowDidResignKey:"mac:WindowDidResignKey",WindowDidResignMain:"mac:WindowDidResignMain",WindowDidResize:"mac:WindowDidResize",WindowDidUpdate:"mac:WindowDidUpdate",WindowDidUpdateAlpha:"mac:WindowDidUpdateAlpha",WindowDidUpdateCollectionBehavior:"mac:WindowDidUpdateCollectionBehavior",WindowDidUpdateCollectionProperties:"mac:WindowDidUpdateCollectionProperties",WindowDidUpdateShadow:"mac:WindowDidUpdateShadow",WindowDidUpdateTitle:"mac:WindowDidUpdateTitle",WindowDidUpdateToolbar:"mac:WindowDidUpdateToolbar",WindowDidZoom:"mac:WindowDidZoom",WindowFileDraggingEntered:"mac:WindowFileDraggingEntered",WindowFileDraggingExited:"mac:WindowFileDraggingExited",WindowFileDraggingPerformed:"mac:WindowFileDraggingPerformed",WindowHide:"mac:WindowHide",WindowMaximise:"mac:WindowMaximise",WindowUnMaximise:"mac:WindowUnMaximise",WindowMinimise:"mac:WindowMinimise",WindowUnMinimise:"mac:WindowUnMinimise",WindowShouldClose:"mac:WindowShouldClose",WindowShow:"mac:WindowShow",WindowWillBecomeKey:"mac:WindowWillBecomeKey",WindowWillBecomeMain:"mac:WindowWillBecomeMain",WindowWillBeginSheet:"mac:WindowWillBeginSheet",WindowWillChangeOrderingMode:"mac:WindowWillChangeOrderingMode",WindowWillClose:"mac:WindowWillClose",WindowWillDeminiaturize:"mac:WindowWillDeminiaturize",WindowWillEnterFullScreen:"mac:WindowWillEnterFullScreen",WindowWillEnterVersionBrowser:"mac:WindowWillEnterVersionBrowser",WindowWillExitFullScreen:"mac:WindowWillExitFullScreen",WindowWillExitVersionBrowser:"mac:WindowWillExitVersionBrowser",WindowWillFocus:"mac:WindowWillFocus",WindowWillMiniaturize:"mac:WindowWillMiniaturize",WindowWillMove:"mac:WindowWillMove",WindowWillOrderOffScreen:"mac:WindowWillOrderOffScreen",WindowWillOrderOnScreen:"mac:WindowWillOrderOnScreen",WindowWillResignMain:"mac:WindowWillResignMain",WindowWillResize:"mac:WindowWillResize",WindowWillUnfocus:"mac:WindowWillUnfocus",WindowWillUpdate:"mac:WindowWillUpdate",WindowWillUpdateAlpha:"mac:WindowWillUpdateAlpha",WindowWillUpdateCollectionBehavior:"mac:WindowWillUpdateCollectionBehavior",WindowWillUpdateCollectionProperties:"mac:WindowWillUpdateCollectionProperties",WindowWillUpdateShadow:"mac:WindowWillUpdateShadow",WindowWillUpdateTitle:"mac:WindowWillUpdateTitle",WindowWillUpdateToolbar:"mac:WindowWillUpdateToolbar",WindowWillUpdateVisibility:"mac:WindowWillUpdateVisibility",WindowWillUseStandardFrame:"mac:WindowWillUseStandardFrame",WindowZoomIn:"mac:WindowZoomIn",WindowZoomOut:"mac:WindowZoomOut",WindowZoomReset:"mac:WindowZoomReset"}),Linux:Object.freeze({ApplicationStartup:"linux:ApplicationStartup",SystemThemeChanged:"linux:SystemThemeChanged",WindowDeleteEvent:"linux:WindowDeleteEvent",WindowDidMove:"linux:WindowDidMove",WindowDidResize:"linux:WindowDidResize",WindowFocusIn:"linux:WindowFocusIn",WindowFocusOut:"linux:WindowFocusOut",WindowLoadChanged:"linux:WindowLoadChanged"}),Common:Object.freeze({ApplicationOpenedWithFile:"common:ApplicationOpenedWithFile",ApplicationStarted:"common:ApplicationStarted",ThemeChanged:"common:ThemeChanged",WindowClosing:"common:WindowClosing",WindowDidMove:"common:WindowDidMove",WindowDidResize:"common:WindowDidResize",WindowDPIChanged:"common:WindowDPIChanged",WindowFilesDropped:"common:WindowFilesDropped",WindowFocus:"common:WindowFocus",WindowFullscreen:"common:WindowFullscreen",WindowHide:"common:WindowHide",WindowLostFocus:"common:WindowLostFocus",WindowMaximise:"common:WindowMaximise",WindowMinimise:"common:WindowMinimise",WindowRestore:"common:WindowRestore",WindowRuntimeReady:"common:WindowRuntimeReady",WindowShow:"common:WindowShow",WindowUnFullscreen:"common:WindowUnFullscreen",WindowUnMaximise:"common:WindowUnMaximise",WindowUnMinimise:"common:WindowUnMinimise",WindowZoom:"common:WindowZoom",WindowZoomIn:"common:WindowZoomIn",WindowZoomOut:"common:WindowZoomOut",WindowZoomReset:"common:WindowZoomReset"})});window._wails=window._wails||{};window._wails.dispatchWailsEvent=kn;var En=m(d.Events),On=0,T=class{constructor(e,i=null){this.name=e,this.data=i}};function kn(n){let e=f.get(n.name);if(!e)return;let i=new T(n.name,n.data);"sender"in n&&(i.sender=n.sender),e=e.filter(o=>!o.dispatch(i)),e.length===0?f.delete(n.name):f.set(n.name,e)}function ne(n,e,i){let o=f.get(n)||[],t=new H(n,e,i);return o.push(t),f.set(n,o),()=>Ue(t)}function Fn(n,e){return ne(n,e,-1)}function Ln(n,e){return ne(n,e,1)}function Un(...n){n.forEach(e=>f.delete(e))}function In(){f.clear()}function ie(n){return En(On,n)}function ze(){return new MouseEvent("mousedown").buttons===0}function je(){if(!EventTarget||!AbortSignal||!AbortController)return!1;let n=!0,e=new EventTarget,i=new AbortController;return e.addEventListener("test",()=>{n=!1},{signal:i.signal}),i.abort(),e.dispatchEvent(new CustomEvent("test")),n}var Be=!1;document.addEventListener("DOMContentLoaded",()=>{Be=!0});function He(n){Be||document.readyState==="complete"?n():document.addEventListener("DOMContentLoaded",n)}var zn=0,jn=1,Bn=2,Hn=3,Nn=4,Zn=5,Vn=6,Kn=7,Gn=8,Yn=9,Xn=10,Jn=11,Qn=12,qn=13,_n=14,$n=15,ei=16,ni=17,ii=18,oi=19,ti=20,ri=21,si=22,li=23,ai=24,ci=25,di=26,mi=27,ui=28,wi=29,pi=30,fi=31,gi=32,hi=33,Wi=34,bi=35,yi=36,vi=37,Ci=38,Pi=39,Di=40,Mi=41,Si=42,Ti=43,xi=44,Ri=45,Ai=46,Ei=47,r=Symbol("caller");r;var N=class N{constructor(e=""){this[r]=m(d.Window,e);for(let i of Object.getOwnPropertyNames(N.prototype))i!=="constructor"&&typeof this[i]=="function"&&(this[i]=this[i].bind(this))}Get(e){return new N(e)}Position(){return this[r](zn)}Center(){return this[r](jn)}Close(){return this[r](Bn)}DisableSizeConstraints(){return this[r](Hn)}EnableSizeConstraints(){return this[r](Nn)}Focus(){return this[r](Zn)}ForceReload(){return this[r](Vn)}Fullscreen(){return this[r](Kn)}GetScreen(){return this[r](Gn)}GetZoom(){return this[r](Yn)}Height(){return this[r](Xn)}Hide(){return this[r](Jn)}IsFocused(){return this[r](Qn)}IsFullscreen(){return this[r](qn)}IsMaximised(){return this[r](_n)}IsMinimised(){return this[r]($n)}Maximise(){return this[r](ei)}Minimise(){return this[r](ni)}Name(){return this[r](ii)}OpenDevTools(){return this[r](oi)}RelativePosition(){return this[r](ti)}Reload(){return this[r](ri)}Resizable(){return this[r](si)}Restore(){return this[r](li)}SetPosition(e,i){return this[r](ai,{x:e,y:i})}SetAlwaysOnTop(e){return this[r](ci,{alwaysOnTop:e})}SetBackgroundColour(e,i,o,t){return this[r](di,{r:e,g:i,b:o,a:t})}SetFrameless(e){return this[r](mi,{frameless:e})}SetFullscreenButtonEnabled(e){return this[r](ui,{enabled:e})}SetMaxSize(e,i){return this[r](wi,{width:e,height:i})}SetMinSize(e,i){return this[r](pi,{width:e,height:i})}SetRelativePosition(e,i){return this[r](fi,{x:e,y:i})}SetResizable(e){return this[r](gi,{resizable:e})}SetSize(e,i){return this[r](hi,{width:e,height:i})}SetTitle(e){return this[r](Wi,{title:e})}SetZoom(e){return this[r](bi,{zoom:e})}Show(){return this[r](yi)}Size(){return this[r](vi)}ToggleFullscreen(){return this[r](Ci)}ToggleMaximise(){return this[r](Pi)}UnFullscreen(){return this[r](Di)}UnMaximise(){return this[r](Mi)}UnMinimise(){return this[r](Si)}Width(){return this[r](Ti)}Zoom(){return this[r](xi)}ZoomIn(){return this[r](Ri)}ZoomOut(){return this[r](Ai)}ZoomReset(){return this[r](Ei)}},te=N,Oi=new te(""),Z=Oi;function ki(n,e=null){ie(new T(n,e))}function Fi(n,e){let i=Z.Get(n),o=i[e];if(typeof o=="function")try{o.call(i)}catch(t){}}function Ne(n){let e=n.currentTarget;function i(t="Yes"){if(t!=="Yes")return;let s=e.getAttribute("wml-event")||e.getAttribute("data-wml-event"),l=e.getAttribute("wml-target-window")||e.getAttribute("data-wml-target-window")||"",c=e.getAttribute("wml-window")||e.getAttribute("data-wml-window"),a=e.getAttribute("wml-openurl")||e.getAttribute("data-wml-openurl");s!==null&&ki(s),c!==null&&Fi(l,c),a!==null&&q(a)}let o=e.getAttribute("wml-confirm")||e.getAttribute("data-wml-confirm");o?$({Title:"Confirm",Message:o,Detached:!1,Buttons:[{Label:"Yes"},{Label:"No",IsDefault:!0}]}).then(i):i()}var I=Symbol("controller"),x=Symbol("triggerMap"),W=Symbol("elementCount");I;var re=class{constructor(){this[I]=new AbortController}set(e,i){return{signal:this[I].signal}}reset(){this[I].abort(),this[I]=new AbortController}};x,W;var se=class{constructor(){this[x]=new WeakMap,this[W]=0}set(e,i){return this[x].has(e)||this[W]++,this[x].set(e,i),{}}reset(){if(!(this[W]<=0)){for(let e of document.body.querySelectorAll("*")){if(this[W]<=0)break;let i=this[x].get(e);i!=null&&this[W]--;for(let o of i||[])e.removeEventListener(o,Ne)}this[x]=new WeakMap,this[W]=0}}},Ze=je()?new re:new se;function Li(n){let e=/\S+/g,i=n.getAttribute("wml-trigger")||n.getAttribute("data-wml-trigger")||"click",o=[],t;for(;(t=e.exec(i))!==null;)o.push(t[0]);let s=Ze.set(n,o);for(let l of o)n.addEventListener(l,Ne,s)}function le(){He(Ve)}function Ve(){Ze.reset(),document.body.querySelectorAll("[wml-event], [wml-window], [wml-openurl], [data-wml-event], [data-wml-window], [data-wml-openurl]").forEach(Li)}window.wails=ce;le();var we={};w(we,{Capabilities:()=>ji,Environment:()=>Bi,IsAMD64:()=>Zi,IsARM:()=>Vi,IsARM64:()=>Ki,IsDarkMode:()=>zi,IsDebug:()=>ue,IsLinux:()=>Hi,IsMac:()=>Ni,IsWindows:()=>me,invoke:()=>b});var Ke=m(d.System),Ui=0,Ii=1,de=function(){var n,e,i,o,t;try{if((e=(n=window.chrome)==null?void 0:n.webview)!=null&&e.postMessage)return window.chrome.webview.postMessage.bind(window.chrome.webview);if((t=(o=(i=window.webkit)==null?void 0:i.messageHandlers)==null?void 0:o.external)!=null&&t.postMessage)return window.webkit.messageHandlers.external.postMessage.bind(window.webkit.messageHandlers.external)}catch(s){}return null}();function b(n){return de==null?void 0:de(n)}function zi(){return Ke(Ui)}function ji(){return D(this,null,function*(){let n=yield fetch("/wails/capabilities");if(n.ok)return n.json();throw new Error("could not fetch capabilities: "+n.statusText)})}function Bi(){return Ke(Ii)}function me(){return window._wails.environment.OS==="windows"}function Hi(){return window._wails.environment.OS==="linux"}function Ni(){return window._wails.environment.OS==="darwin"}function Zi(){return window._wails.environment.Arch==="amd64"}function Vi(){return window._wails.environment.Arch==="arm"}function Ki(){return window._wails.environment.Arch==="arm64"}function ue(){return!!window._wails.environment.Debug}window.addEventListener("contextmenu",Ji);var Gi=m(d.ContextMenu),Yi=0;function Xi(n,e,i,o){Gi(Yi,{id:n,x:e,y:i,data:o})}function Ji(n){var o;let e;n.target instanceof HTMLElement?e=n.target:!(n.target instanceof HTMLElement)&&n.target instanceof Node?e=(o=n.target.parentElement)!=null?o:document.body:e=document.body;let i=window.getComputedStyle(e).getPropertyValue("--custom-contextmenu").trim();if(i){n.preventDefault();let t=window.getComputedStyle(e).getPropertyValue("--custom-contextmenu-data");Xi(i,n.clientX,n.clientY,t);return}Qi(n)}function Qi(n){var i;if(ue())return;let e;switch(n.target instanceof HTMLElement?e=n.target:!(n.target instanceof HTMLElement)&&n.target instanceof Node?e=(i=n.target.parentElement)!=null?i:document.body:e=document.body,window.getComputedStyle(e).getPropertyValue("--default-contextmenu").trim()){case"show":return;case"hide":n.preventDefault();return;default:if(e.isContentEditable)return;let o=window.getSelection(),t=o&&o.toString().length>0;if(t)for(let s=0;sz});function z(n){try{return window._wails.flags[n]}catch(e){throw new Error("Unable to retrieve flag '"+n+"': "+e,{cause:e})}}var R=!1,B=!1,fe=!1,y=!1,C=!1,v="",Ge="auto",j=0,Ye=ze();window._wails=window._wails||{};window._wails.setResizable=n=>{fe=n,fe||(y=C=!1,p())};window.addEventListener("mousedown",qi,{capture:!0});window.addEventListener("mousemove",eo,{capture:!0});window.addEventListener("mouseup",_i,{capture:!0});for(let n of["click","contextmenu","dblclick","pointerdown","pointerup"])window.addEventListener(n,V,{capture:!0});function V(n){(B||C)&&(n.stopImmediatePropagation(),n.stopPropagation(),n.preventDefault())}function qi(n){var t;if(j=Ye?n.buttons:j|1<to,Quit:()=>so,Show:()=>ro});var ge=m(d.Application),no=0,io=1,oo=2;function to(){return ge(no)}function ro(){return ge(io)}function so(){return ge(oo)}var Me={};w(Me,{ByID:()=>Ro,ByName:()=>xo,Call:()=>De,RuntimeError:()=>X});var Je=Function.prototype.toString,A=typeof Reflect=="object"&&Reflect!==null&&Reflect.apply,We,K;if(typeof A=="function"&&typeof Object.defineProperty=="function")try{We=Object.defineProperty({},"length",{get:function(){throw K}}),K={},A(function(){throw 42},null,We)}catch(n){n!==K&&(A=null)}else A=null;var lo=/^\s*class\b/,ye=function(e){try{var i=Je.call(e);return lo.test(i)}catch(o){return!1}},be=function(e){try{return ye(e)?!1:(Je.call(e),!0)}catch(i){return!1}},G=Object.prototype.toString,ao="[object Object]",co="[object Function]",mo="[object GeneratorFunction]",uo="[object HTMLAllCollection]",wo="[object HTML document.all class]",po="[object HTMLCollection]",fo=typeof Symbol=="function"&&!!Symbol.toStringTag,go=!(0 in[,]),ve=function(){return!1};typeof document=="object"&&(Xe=document.all,G.call(Xe)===G.call(document.all)&&(ve=function(e){if((go||!e)&&(typeof e=="undefined"||typeof e=="object"))try{var i=G.call(e);return(i===uo||i===wo||i===po||i===ao)&&e("")==null}catch(o){}return!1}));var Xe;function ho(n){if(ve(n))return!0;if(!n||typeof n!="function"&&typeof n!="object")return!1;try{A(n,null,We)}catch(e){if(e!==K)return!1}return!ye(n)&&be(n)}function Wo(n){if(ve(n))return!0;if(!n||typeof n!="function"&&typeof n!="object")return!1;if(fo)return be(n);if(ye(n))return!1;var e=G.call(n);return e!==co&&e!==mo&&!/^\[object HTML/.test(e)?!1:be(n)}var h=A?ho:Wo;var O=class extends Error{constructor(e,i){super(e,i),this.name="CancelError"}},k=class extends Error{constructor(e,i,o){super((o!=null?o:"Unhandled rejection in cancelled promise.")+" Reason: "+bo(i),{cause:i}),this.promise=e,this.name="CancelledRejectionError"}},g=Symbol("barrier"),Ce=Symbol("cancelImpl"),$e,Qe=($e=Symbol.species)!=null?$e:Symbol("speciesPolyfill"),F=class n extends Promise{constructor(e,i){let o,t;if(super((a,u)=>{o=a,t=u}),this.constructor[Qe]!==Promise)throw new TypeError("CancellablePromise does not support transparent subclassing. Please refrain from overriding the [Symbol.species] static property.");let s={promise:this,resolve:o,reject:t,get oncancelled(){return i!=null?i:null},set oncancelled(a){i=a!=null?a:void 0}},l={get root(){return l},resolving:!1,settled:!1};Object.defineProperties(this,{[g]:{configurable:!1,enumerable:!1,writable:!0,value:null},[Ce]:{configurable:!1,enumerable:!1,writable:!1,value:en(s,l)}});let c=on(s,l);try{e(nn(s,l),c)}catch(a){l.resolving||c(a)}}cancel(e){return new n(i=>{Promise.allSettled([this[Ce](new O("Promise cancelled.",{cause:e})),yo(this)]).then(()=>i(),()=>i())})}cancelOn(e){return e.aborted?this.cancel(e.reason):e.addEventListener("abort",()=>void this.cancel(e.reason),{capture:!0}),this}then(e,i,o){if(!(this instanceof n))throw new TypeError("CancellablePromise.prototype.then called on an invalid object.");if(h(e)||(e=qe),h(i)||(i=_e),e===qe&&i==_e)return new n(s=>s(this));let t={};return this[g]=t,new n((s,l)=>{Pe.call(this,c=>{var a;this[g]===t&&(this[g]=null),(a=t.resolve)==null||a.call(t);try{s(e(c))}catch(u){l(u)}},c=>{var a;this[g]===t&&(this[g]=null),(a=t.resolve)==null||a.call(t);try{s(i(c))}catch(u){l(u)}})},s=>D(this,null,function*(){try{return o==null?void 0:o(s)}finally{yield this.cancel(s)}}))}catch(e,i){return this.then(void 0,e,i)}finally(e,i){if(!(this instanceof n))throw new TypeError("CancellablePromise.prototype.finally called on an invalid object.");return h(e)?this.then(o=>n.resolve(e()).then(()=>o),o=>n.resolve(e()).then(()=>{throw o}),i):this.then(e,e,i)}static get[(g,Ce,Qe)](){return Promise}static all(e){let i=Array.from(e);return i.length===0?n.resolve(i):new n((o,t)=>{Promise.all(i).then(o,t)},Y(i))}static allSettled(e){let i=Array.from(e);return i.length===0?n.resolve(i):new n((o,t)=>{Promise.allSettled(i).then(o,t)},Y(i))}static any(e){let i=Array.from(e);return i.length===0?n.resolve(i):new n((o,t)=>{Promise.any(i).then(o,t)},Y(i))}static race(e){let i=Array.from(e);return new n((o,t)=>{Promise.race(i).then(o,t)},Y(i))}static cancel(e){let i=new n(()=>{});return i.cancel(e),i}static timeout(e,i){let o=new n(()=>{});return AbortSignal&&typeof AbortSignal=="function"&&AbortSignal.timeout&&typeof AbortSignal.timeout=="function"?AbortSignal.timeout(e).addEventListener("abort",()=>void o.cancel(i)):setTimeout(()=>void o.cancel(i),e),o}static sleep(e,i){return new n(o=>{setTimeout(()=>o(i),e)})}static reject(e){return new n((i,o)=>o(e))}static resolve(e){return e instanceof n?e:new n(i=>i(e))}static withResolvers(){let e={oncancelled:null};return e.promise=new n((i,o)=>{e.resolve=i,e.reject=o},i=>{var o;(o=e.oncancelled)==null||o.call(e,i)}),e}};function en(n,e){let i;return o=>{if(e.settled||(e.settled=!0,e.reason=o,n.reject(o),Pe.call(n.promise,void 0,t=>{if(t!==o)throw t})),!(!e.reason||!n.oncancelled))return i=new Promise(t=>{try{t(n.oncancelled(e.reason.cause))}catch(s){Promise.reject(new k(n.promise,s,"Unhandled exception in oncancelled callback."))}}),i.then(void 0,t=>{throw new k(n.promise,t,"Unhandled rejection in oncancelled callback.")}),n.oncancelled=null,i}}function nn(n,e){return i=>{if(!e.resolving){if(e.resolving=!0,i===n.promise){if(e.settled)return;e.settled=!0,n.reject(new TypeError("A promise cannot be resolved with itself."));return}if(i!=null&&(typeof i=="object"||typeof i=="function")){let o;try{o=i.then}catch(t){e.settled=!0,n.reject(t);return}if(h(o)){try{let l=i.cancel;if(h(l)){let c=a=>{Reflect.apply(l,i,[a])};e.reason?en(Fe(ke({},n),{oncancelled:c}),e)(e.reason):n.oncancelled=c}}catch(l){}let t={root:e.root,resolving:!1,get settled(){return this.root.settled},set settled(l){this.root.settled=l},get reason(){return this.root.reason}},s=on(n,t);try{Reflect.apply(o,i,[nn(n,t),s])}catch(l){s(l)}return}}e.settled||(e.settled=!0,n.resolve(i))}}}function on(n,e){return i=>{if(!e.resolving)if(e.resolving=!0,e.settled){try{if(i instanceof O&&e.reason instanceof O&&Object.is(i.cause,e.reason.cause))return}catch(o){}Promise.reject(new k(n.promise,i))}else e.settled=!0,n.reject(i)}}function Y(n){return e=>{for(let i of n)try{if(h(i.then)){let o=i.cancel;h(o)&&Reflect.apply(o,i,[e])}}catch(o){}}}function qe(n){return n}function _e(n){throw n}function bo(n){try{if(n instanceof Error||typeof n!="object"||n.toString!==Object.prototype.toString)return""+n}catch(e){}try{return JSON.stringify(n)}catch(e){}try{return Object.prototype.toString.call(n)}catch(e){}return""}function yo(n){var i;let e=(i=n[g])!=null?i:{};return"promise"in e||Object.assign(e,E()),n[g]==null&&(e.resolve(),n[g]=e),e.promise}var Pe=Promise.prototype.then;Promise.prototype.then=function(...n){return this instanceof F?this.then(...n):Reflect.apply(Pe,this,n)};var E=Promise.withResolvers;E&&typeof E=="function"?E=E.bind(Promise):E=function(){let n,e;return{promise:new Promise((o,t)=>{n=o,e=t}),resolve:n,reject:e}};window._wails=window._wails||{};window._wails.callResultHandler=Mo;window._wails.callErrorHandler=So;var vo=m(d.Call),Co=m(d.CancelCall),L=new Map,Po=0,Do=0,X=class extends Error{constructor(e,i){super(e,i),this.name="RuntimeError"}};function Mo(n,e,i){let o=tn(n);if(o)if(!e)o.resolve(void 0);else if(!i)o.resolve(e);else try{o.resolve(JSON.parse(e))}catch(t){o.reject(new TypeError("could not parse result: "+t.message,{cause:t}))}}function So(n,e,i){let o=tn(n);if(o)if(!i)o.reject(new Error(e));else{let t;try{t=JSON.parse(e)}catch(c){o.reject(new TypeError("could not parse error: "+c.message,{cause:c}));return}let s={};t.cause&&(s.cause=t.cause);let l;switch(t.kind){case"ReferenceError":l=new ReferenceError(t.message,s);break;case"TypeError":l=new TypeError(t.message,s);break;case"RuntimeError":l=new X(t.message,s);break;default:l=new Error(t.message,s);break}o.reject(l)}}function tn(n){let e=L.get(n);return L.delete(n),e}function To(){let n;do n=M();while(L.has(n));return n}function De(n){let e=To(),i=F.withResolvers();L.set(e,{resolve:i.resolve,reject:i.reject});let o=vo(Po,Object.assign({"call-id":e},n)),t=!1;o.then(()=>{t=!0},l=>{L.delete(e),i.reject(l)});let s=()=>(L.delete(e),Co(Do,{"call-id":e}).catch(l=>{}));return i.oncancelled=()=>t?s():o.then(s),i.promise}function xo(n,...e){return De({methodName:n,args:e})}function Ro(n,...e){return De({methodID:n,args:e})}var Se={};w(Se,{SetText:()=>Oo,Text:()=>ko});var rn=m(d.Clipboard),Ao=0,Eo=1;function Oo(n){return rn(Ao,{text:n})}function ko(){return rn(Eo)}var Te={};w(Te,{Any:()=>P,Array:()=>Lo,ByteSlice:()=>Fo,Map:()=>Uo,Nullable:()=>Io,Struct:()=>zo});function P(n){return n}function Fo(n){return n==null?"":n}function Lo(n){return n===P?e=>e===null?[]:e:e=>{if(e===null)return[];for(let i=0;ii===null?{}:i:i=>{if(i===null)return{};for(let o in i)i[o]=e(i[o]);return i}}function Io(n){return n===P?P:e=>e===null?null:n(e)}function zo(n){let e=!0;for(let i in n)if(n[i]!==P){e=!1;break}return e?P:i=>{for(let o in n)o in i&&(i[o]=n[o](i[o]));return i}}var Re={};w(Re,{GetAll:()=>No,GetCurrent:()=>Vo,GetPrimary:()=>Zo});var xe=m(d.Screens),jo=0,Bo=1,Ho=2;function No(){return xe(jo)}function Zo(){return xe(Bo)}function Vo(){return xe(Ho)}window._wails=window._wails||{};window._wails.invoke=b;b("wails:runtime:ready");export{he as Application,_ as Browser,Me as Call,O as CancelError,F as CancellablePromise,k as CancelledRejectionError,Se as Clipboard,Te as Create,ee as Dialogs,oe as Events,pe as Flags,Re as Screens,we as System,ae as WML,Z as Window}; +var Le=Object.defineProperty,ln=Object.defineProperties;var cn=Object.getOwnPropertyDescriptors;var Oe=Object.getOwnPropertySymbols;var dn=Object.prototype.hasOwnProperty,mn=Object.prototype.propertyIsEnumerable;var Fe=(n,e,i)=>e in n?Le(n,e,{enumerable:!0,configurable:!0,writable:!0,value:i}):n[e]=i,Ue=(n,e)=>{for(var i in e||(e={}))dn.call(e,i)&&Fe(n,i,e[i]);if(Oe)for(var i of Oe(e))mn.call(e,i)&&Fe(n,i,e[i]);return n},Ie=(n,e)=>ln(n,cn(e));var w=(n,e)=>{for(var i in e)Le(n,i,{get:e[i],enumerable:!0})};var C=(n,e,i)=>new Promise((o,t)=>{var s=l=>{try{c(i.next(l))}catch(u){t(u)}},a=l=>{try{c(i.throw(l))}catch(u){t(u)}},c=l=>l.done?o(l.value):Promise.resolve(l.value).then(s,a);c((i=i.apply(n,e)).next())});var ce={};w(ce,{Application:()=>ye,Browser:()=>_,Call:()=>xe,CancelError:()=>k,CancellablePromise:()=>F,CancelledRejectionError:()=>O,Clipboard:()=>Re,Create:()=>Ae,Dialogs:()=>ee,Events:()=>oe,Flags:()=>we,Screens:()=>ke,System:()=>ue,WML:()=>le,Window:()=>Z});var le={};w(le,{Enable:()=>ae,Reload:()=>Ye});var _={};w(_,{OpenURL:()=>q});var un="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";function P(n=21){let e="",i=n|0;for(;i--;)e+=un[Math.random()*64|0];return e}var wn=window.location.origin+"/wails/runtime",d=Object.freeze({Call:0,Clipboard:1,Application:2,Events:3,ContextMenu:4,Dialog:5,Window:6,Screens:7,System:8,Browser:9,CancelCall:10}),pn=P();function m(n,e=""){return function(i,o=null){return fn(n,i,e,o)}}function fn(n,e,i,o){return C(this,null,function*(){var c,l;let t=new URL(wn);t.searchParams.append("object",n.toString()),t.searchParams.append("method",e.toString()),o&&t.searchParams.append("args",JSON.stringify(o));let s={"x-wails-client-id":pn};i&&(s["x-wails-window-name"]=i);let a=yield fetch(t,{headers:s});if(!a.ok)throw new Error(yield a.text());return((l=(c=a.headers.get("Content-Type"))==null?void 0:c.indexOf("application/json"))!=null?l:-1)!==-1?a.json():a.text()})}var gn=m(d.Browser),hn=0;function q(n){return gn(hn,{url:n.toString()})}var ee={};w(ee,{Error:()=>An,Info:()=>xn,OpenFile:()=>En,Question:()=>$,SaveFile:()=>kn,Warning:()=>Rn});window._wails=window._wails||{};window._wails.dialogErrorCallback=Sn;window._wails.dialogResultCallback=Mn;var Wn=m(d.Dialog),U=new Map,bn=0,yn=1,vn=2,Cn=3,Pn=4,Dn=5;function Mn(n,e,i){let o=ze(n);if(o)if(i)try{o.resolve(JSON.parse(e))}catch(t){o.reject(new TypeError("could not parse result: "+t.message,{cause:t}))}else o.resolve(e)}function Sn(n,e){var i;(i=ze(n))==null||i.reject(new window.Error(e))}function ze(n){let e=U.get(n);return U.delete(n),e}function Tn(){let n;do n=P();while(U.has(n));return n}function D(n,e={}){let i=Tn();return new Promise((o,t)=>{U.set(i,{resolve:o,reject:t}),Wn(n,Object.assign({"dialog-id":i},e)).catch(s=>{U.delete(i),t(s)})})}function xn(n){return D(bn,n)}function Rn(n){return D(yn,n)}function An(n){return D(vn,n)}function $(n){return D(Cn,n)}function En(n){var e;return(e=D(Pn,n))!=null?e:[]}function kn(n){return D(Dn,n)}var oe={};w(oe,{Emit:()=>ie,Off:()=>zn,OffAll:()=>jn,On:()=>Un,OnMultiple:()=>ne,Once:()=>In,Types:()=>Be,WailsEvent:()=>M});var f=new Map,H=class{constructor(e,i,o){this.eventName=e,this.callback=i,this.maxCallbacks=o||-1}dispatch(e){try{this.callback(e)}catch(i){}return this.maxCallbacks===-1?!1:(this.maxCallbacks-=1,this.maxCallbacks===0)}};function je(n){let e=f.get(n.eventName);e&&(e=e.filter(i=>i!==n),e.length===0?f.delete(n.eventName):f.set(n.eventName,e))}var Be=Object.freeze({Windows:Object.freeze({APMPowerSettingChange:"windows:APMPowerSettingChange",APMPowerStatusChange:"windows:APMPowerStatusChange",APMResumeAutomatic:"windows:APMResumeAutomatic",APMResumeSuspend:"windows:APMResumeSuspend",APMSuspend:"windows:APMSuspend",ApplicationStarted:"windows:ApplicationStarted",SystemThemeChanged:"windows:SystemThemeChanged",WebViewNavigationCompleted:"windows:WebViewNavigationCompleted",WindowActive:"windows:WindowActive",WindowBackgroundErase:"windows:WindowBackgroundErase",WindowClickActive:"windows:WindowClickActive",WindowClosing:"windows:WindowClosing",WindowDidMove:"windows:WindowDidMove",WindowDidResize:"windows:WindowDidResize",WindowDPIChanged:"windows:WindowDPIChanged",WindowDragDrop:"windows:WindowDragDrop",WindowDragEnter:"windows:WindowDragEnter",WindowDragLeave:"windows:WindowDragLeave",WindowDragOver:"windows:WindowDragOver",WindowEndMove:"windows:WindowEndMove",WindowEndResize:"windows:WindowEndResize",WindowFullscreen:"windows:WindowFullscreen",WindowHide:"windows:WindowHide",WindowInactive:"windows:WindowInactive",WindowKeyDown:"windows:WindowKeyDown",WindowKeyUp:"windows:WindowKeyUp",WindowKillFocus:"windows:WindowKillFocus",WindowNonClientHit:"windows:WindowNonClientHit",WindowNonClientMouseDown:"windows:WindowNonClientMouseDown",WindowNonClientMouseLeave:"windows:WindowNonClientMouseLeave",WindowNonClientMouseMove:"windows:WindowNonClientMouseMove",WindowNonClientMouseUp:"windows:WindowNonClientMouseUp",WindowPaint:"windows:WindowPaint",WindowRestore:"windows:WindowRestore",WindowSetFocus:"windows:WindowSetFocus",WindowShow:"windows:WindowShow",WindowStartMove:"windows:WindowStartMove",WindowStartResize:"windows:WindowStartResize",WindowUnFullscreen:"windows:WindowUnFullscreen",WindowZOrderChanged:"windows:WindowZOrderChanged",WindowMinimise:"windows:WindowMinimise",WindowUnMinimise:"windows:WindowUnMinimise",WindowMaximise:"windows:WindowMaximise",WindowUnMaximise:"windows:WindowUnMaximise"}),Mac:Object.freeze({ApplicationDidBecomeActive:"mac:ApplicationDidBecomeActive",ApplicationDidChangeBackingProperties:"mac:ApplicationDidChangeBackingProperties",ApplicationDidChangeEffectiveAppearance:"mac:ApplicationDidChangeEffectiveAppearance",ApplicationDidChangeIcon:"mac:ApplicationDidChangeIcon",ApplicationDidChangeOcclusionState:"mac:ApplicationDidChangeOcclusionState",ApplicationDidChangeScreenParameters:"mac:ApplicationDidChangeScreenParameters",ApplicationDidChangeStatusBarFrame:"mac:ApplicationDidChangeStatusBarFrame",ApplicationDidChangeStatusBarOrientation:"mac:ApplicationDidChangeStatusBarOrientation",ApplicationDidChangeTheme:"mac:ApplicationDidChangeTheme",ApplicationDidFinishLaunching:"mac:ApplicationDidFinishLaunching",ApplicationDidHide:"mac:ApplicationDidHide",ApplicationDidResignActive:"mac:ApplicationDidResignActive",ApplicationDidUnhide:"mac:ApplicationDidUnhide",ApplicationDidUpdate:"mac:ApplicationDidUpdate",ApplicationShouldHandleReopen:"mac:ApplicationShouldHandleReopen",ApplicationWillBecomeActive:"mac:ApplicationWillBecomeActive",ApplicationWillFinishLaunching:"mac:ApplicationWillFinishLaunching",ApplicationWillHide:"mac:ApplicationWillHide",ApplicationWillResignActive:"mac:ApplicationWillResignActive",ApplicationWillTerminate:"mac:ApplicationWillTerminate",ApplicationWillUnhide:"mac:ApplicationWillUnhide",ApplicationWillUpdate:"mac:ApplicationWillUpdate",MenuDidAddItem:"mac:MenuDidAddItem",MenuDidBeginTracking:"mac:MenuDidBeginTracking",MenuDidClose:"mac:MenuDidClose",MenuDidDisplayItem:"mac:MenuDidDisplayItem",MenuDidEndTracking:"mac:MenuDidEndTracking",MenuDidHighlightItem:"mac:MenuDidHighlightItem",MenuDidOpen:"mac:MenuDidOpen",MenuDidPopUp:"mac:MenuDidPopUp",MenuDidRemoveItem:"mac:MenuDidRemoveItem",MenuDidSendAction:"mac:MenuDidSendAction",MenuDidSendActionToItem:"mac:MenuDidSendActionToItem",MenuDidUpdate:"mac:MenuDidUpdate",MenuWillAddItem:"mac:MenuWillAddItem",MenuWillBeginTracking:"mac:MenuWillBeginTracking",MenuWillDisplayItem:"mac:MenuWillDisplayItem",MenuWillEndTracking:"mac:MenuWillEndTracking",MenuWillHighlightItem:"mac:MenuWillHighlightItem",MenuWillOpen:"mac:MenuWillOpen",MenuWillPopUp:"mac:MenuWillPopUp",MenuWillRemoveItem:"mac:MenuWillRemoveItem",MenuWillSendAction:"mac:MenuWillSendAction",MenuWillSendActionToItem:"mac:MenuWillSendActionToItem",MenuWillUpdate:"mac:MenuWillUpdate",WebViewDidCommitNavigation:"mac:WebViewDidCommitNavigation",WebViewDidFinishNavigation:"mac:WebViewDidFinishNavigation",WebViewDidReceiveServerRedirectForProvisionalNavigation:"mac:WebViewDidReceiveServerRedirectForProvisionalNavigation",WebViewDidStartProvisionalNavigation:"mac:WebViewDidStartProvisionalNavigation",WindowDidBecomeKey:"mac:WindowDidBecomeKey",WindowDidBecomeMain:"mac:WindowDidBecomeMain",WindowDidBeginSheet:"mac:WindowDidBeginSheet",WindowDidChangeAlpha:"mac:WindowDidChangeAlpha",WindowDidChangeBackingLocation:"mac:WindowDidChangeBackingLocation",WindowDidChangeBackingProperties:"mac:WindowDidChangeBackingProperties",WindowDidChangeCollectionBehavior:"mac:WindowDidChangeCollectionBehavior",WindowDidChangeEffectiveAppearance:"mac:WindowDidChangeEffectiveAppearance",WindowDidChangeOcclusionState:"mac:WindowDidChangeOcclusionState",WindowDidChangeOrderingMode:"mac:WindowDidChangeOrderingMode",WindowDidChangeScreen:"mac:WindowDidChangeScreen",WindowDidChangeScreenParameters:"mac:WindowDidChangeScreenParameters",WindowDidChangeScreenProfile:"mac:WindowDidChangeScreenProfile",WindowDidChangeScreenSpace:"mac:WindowDidChangeScreenSpace",WindowDidChangeScreenSpaceProperties:"mac:WindowDidChangeScreenSpaceProperties",WindowDidChangeSharingType:"mac:WindowDidChangeSharingType",WindowDidChangeSpace:"mac:WindowDidChangeSpace",WindowDidChangeSpaceOrderingMode:"mac:WindowDidChangeSpaceOrderingMode",WindowDidChangeTitle:"mac:WindowDidChangeTitle",WindowDidChangeToolbar:"mac:WindowDidChangeToolbar",WindowDidDeminiaturize:"mac:WindowDidDeminiaturize",WindowDidEndSheet:"mac:WindowDidEndSheet",WindowDidEnterFullScreen:"mac:WindowDidEnterFullScreen",WindowDidEnterVersionBrowser:"mac:WindowDidEnterVersionBrowser",WindowDidExitFullScreen:"mac:WindowDidExitFullScreen",WindowDidExitVersionBrowser:"mac:WindowDidExitVersionBrowser",WindowDidExpose:"mac:WindowDidExpose",WindowDidFocus:"mac:WindowDidFocus",WindowDidMiniaturize:"mac:WindowDidMiniaturize",WindowDidMove:"mac:WindowDidMove",WindowDidOrderOffScreen:"mac:WindowDidOrderOffScreen",WindowDidOrderOnScreen:"mac:WindowDidOrderOnScreen",WindowDidResignKey:"mac:WindowDidResignKey",WindowDidResignMain:"mac:WindowDidResignMain",WindowDidResize:"mac:WindowDidResize",WindowDidUpdate:"mac:WindowDidUpdate",WindowDidUpdateAlpha:"mac:WindowDidUpdateAlpha",WindowDidUpdateCollectionBehavior:"mac:WindowDidUpdateCollectionBehavior",WindowDidUpdateCollectionProperties:"mac:WindowDidUpdateCollectionProperties",WindowDidUpdateShadow:"mac:WindowDidUpdateShadow",WindowDidUpdateTitle:"mac:WindowDidUpdateTitle",WindowDidUpdateToolbar:"mac:WindowDidUpdateToolbar",WindowDidZoom:"mac:WindowDidZoom",WindowFileDraggingEntered:"mac:WindowFileDraggingEntered",WindowFileDraggingExited:"mac:WindowFileDraggingExited",WindowFileDraggingPerformed:"mac:WindowFileDraggingPerformed",WindowHide:"mac:WindowHide",WindowMaximise:"mac:WindowMaximise",WindowUnMaximise:"mac:WindowUnMaximise",WindowMinimise:"mac:WindowMinimise",WindowUnMinimise:"mac:WindowUnMinimise",WindowShouldClose:"mac:WindowShouldClose",WindowShow:"mac:WindowShow",WindowWillBecomeKey:"mac:WindowWillBecomeKey",WindowWillBecomeMain:"mac:WindowWillBecomeMain",WindowWillBeginSheet:"mac:WindowWillBeginSheet",WindowWillChangeOrderingMode:"mac:WindowWillChangeOrderingMode",WindowWillClose:"mac:WindowWillClose",WindowWillDeminiaturize:"mac:WindowWillDeminiaturize",WindowWillEnterFullScreen:"mac:WindowWillEnterFullScreen",WindowWillEnterVersionBrowser:"mac:WindowWillEnterVersionBrowser",WindowWillExitFullScreen:"mac:WindowWillExitFullScreen",WindowWillExitVersionBrowser:"mac:WindowWillExitVersionBrowser",WindowWillFocus:"mac:WindowWillFocus",WindowWillMiniaturize:"mac:WindowWillMiniaturize",WindowWillMove:"mac:WindowWillMove",WindowWillOrderOffScreen:"mac:WindowWillOrderOffScreen",WindowWillOrderOnScreen:"mac:WindowWillOrderOnScreen",WindowWillResignMain:"mac:WindowWillResignMain",WindowWillResize:"mac:WindowWillResize",WindowWillUnfocus:"mac:WindowWillUnfocus",WindowWillUpdate:"mac:WindowWillUpdate",WindowWillUpdateAlpha:"mac:WindowWillUpdateAlpha",WindowWillUpdateCollectionBehavior:"mac:WindowWillUpdateCollectionBehavior",WindowWillUpdateCollectionProperties:"mac:WindowWillUpdateCollectionProperties",WindowWillUpdateShadow:"mac:WindowWillUpdateShadow",WindowWillUpdateTitle:"mac:WindowWillUpdateTitle",WindowWillUpdateToolbar:"mac:WindowWillUpdateToolbar",WindowWillUpdateVisibility:"mac:WindowWillUpdateVisibility",WindowWillUseStandardFrame:"mac:WindowWillUseStandardFrame",WindowZoomIn:"mac:WindowZoomIn",WindowZoomOut:"mac:WindowZoomOut",WindowZoomReset:"mac:WindowZoomReset"}),Linux:Object.freeze({ApplicationStartup:"linux:ApplicationStartup",SystemThemeChanged:"linux:SystemThemeChanged",WindowDeleteEvent:"linux:WindowDeleteEvent",WindowDidMove:"linux:WindowDidMove",WindowDidResize:"linux:WindowDidResize",WindowFocusIn:"linux:WindowFocusIn",WindowFocusOut:"linux:WindowFocusOut",WindowLoadChanged:"linux:WindowLoadChanged"}),Common:Object.freeze({ApplicationOpenedWithFile:"common:ApplicationOpenedWithFile",ApplicationStarted:"common:ApplicationStarted",ThemeChanged:"common:ThemeChanged",WindowClosing:"common:WindowClosing",WindowDidMove:"common:WindowDidMove",WindowDidResize:"common:WindowDidResize",WindowDPIChanged:"common:WindowDPIChanged",WindowFilesDropped:"common:WindowFilesDropped",WindowFocus:"common:WindowFocus",WindowFullscreen:"common:WindowFullscreen",WindowHide:"common:WindowHide",WindowLostFocus:"common:WindowLostFocus",WindowMaximise:"common:WindowMaximise",WindowMinimise:"common:WindowMinimise",WindowRestore:"common:WindowRestore",WindowRuntimeReady:"common:WindowRuntimeReady",WindowShow:"common:WindowShow",WindowUnFullscreen:"common:WindowUnFullscreen",WindowUnMaximise:"common:WindowUnMaximise",WindowUnMinimise:"common:WindowUnMinimise",WindowZoom:"common:WindowZoom",WindowZoomIn:"common:WindowZoomIn",WindowZoomOut:"common:WindowZoomOut",WindowZoomReset:"common:WindowZoomReset"})});window._wails=window._wails||{};window._wails.dispatchWailsEvent=Ln;var On=m(d.Events),Fn=0,M=class{constructor(e,i=null){this.name=e,this.data=i}};function Ln(n){let e=f.get(n.name);if(!e)return;let i=new M(n.name,n.data);"sender"in n&&(i.sender=n.sender),e=e.filter(o=>!o.dispatch(i)),e.length===0?f.delete(n.name):f.set(n.name,e)}function ne(n,e,i){let o=f.get(n)||[],t=new H(n,e,i);return o.push(t),f.set(n,o),()=>je(t)}function Un(n,e){return ne(n,e,-1)}function In(n,e){return ne(n,e,1)}function zn(...n){n.forEach(e=>f.delete(e))}function jn(){f.clear()}function ie(n){return On(Fn,n)}function He(){return new MouseEvent("mousedown").buttons===0}function Ne(){if(!EventTarget||!AbortSignal||!AbortController)return!1;let n=!0,e=new EventTarget,i=new AbortController;return e.addEventListener("test",()=>{n=!1},{signal:i.signal}),i.abort(),e.dispatchEvent(new CustomEvent("test")),n}var Ze=!1;document.addEventListener("DOMContentLoaded",()=>{Ze=!0});function Ve(n){Ze||document.readyState==="complete"?n():document.addEventListener("DOMContentLoaded",n)}var Bn=0,Hn=1,Nn=2,Zn=3,Vn=4,Kn=5,Gn=6,Yn=7,Xn=8,Jn=9,Qn=10,qn=11,_n=12,$n=13,ei=14,ni=15,ii=16,oi=17,ti=18,ri=19,si=20,ai=21,li=22,ci=23,di=24,mi=25,ui=26,wi=27,pi=28,fi=29,gi=30,hi=31,Wi=32,bi=33,yi=34,vi=35,Ci=36,Pi=37,Di=38,Mi=39,Si=40,Ti=41,xi=42,Ri=43,Ai=44,Ei=45,ki=46,Oi=47,r=Symbol("caller");r;var N=class N{constructor(e=""){this[r]=m(d.Window,e);for(let i of Object.getOwnPropertyNames(N.prototype))i!=="constructor"&&typeof this[i]=="function"&&(this[i]=this[i].bind(this))}Get(e){return new N(e)}Position(){return this[r](Bn)}Center(){return this[r](Hn)}Close(){return this[r](Nn)}DisableSizeConstraints(){return this[r](Zn)}EnableSizeConstraints(){return this[r](Vn)}Focus(){return this[r](Kn)}ForceReload(){return this[r](Gn)}Fullscreen(){return this[r](Yn)}GetScreen(){return this[r](Xn)}GetZoom(){return this[r](Jn)}Height(){return this[r](Qn)}Hide(){return this[r](qn)}IsFocused(){return this[r](_n)}IsFullscreen(){return this[r]($n)}IsMaximised(){return this[r](ei)}IsMinimised(){return this[r](ni)}Maximise(){return this[r](ii)}Minimise(){return this[r](oi)}Name(){return this[r](ti)}OpenDevTools(){return this[r](ri)}RelativePosition(){return this[r](si)}Reload(){return this[r](ai)}Resizable(){return this[r](li)}Restore(){return this[r](ci)}SetPosition(e,i){return this[r](di,{x:e,y:i})}SetAlwaysOnTop(e){return this[r](mi,{alwaysOnTop:e})}SetBackgroundColour(e,i,o,t){return this[r](ui,{r:e,g:i,b:o,a:t})}SetFrameless(e){return this[r](wi,{frameless:e})}SetFullscreenButtonEnabled(e){return this[r](pi,{enabled:e})}SetMaxSize(e,i){return this[r](fi,{width:e,height:i})}SetMinSize(e,i){return this[r](gi,{width:e,height:i})}SetRelativePosition(e,i){return this[r](hi,{x:e,y:i})}SetResizable(e){return this[r](Wi,{resizable:e})}SetSize(e,i){return this[r](bi,{width:e,height:i})}SetTitle(e){return this[r](yi,{title:e})}SetZoom(e){return this[r](vi,{zoom:e})}Show(){return this[r](Ci)}Size(){return this[r](Pi)}ToggleFullscreen(){return this[r](Di)}ToggleMaximise(){return this[r](Mi)}UnFullscreen(){return this[r](Si)}UnMaximise(){return this[r](Ti)}UnMinimise(){return this[r](xi)}Width(){return this[r](Ri)}Zoom(){return this[r](Ai)}ZoomIn(){return this[r](Ei)}ZoomOut(){return this[r](ki)}ZoomReset(){return this[r](Oi)}},te=N,Fi=new te(""),Z=Fi;function Li(n,e=null){ie(new M(n,e))}function Ui(n,e){let i=Z.Get(n),o=i[e];if(typeof o=="function")try{o.call(i)}catch(t){}}function Ke(n){let e=n.currentTarget;function i(t="Yes"){if(t!=="Yes")return;let s=e.getAttribute("wml-event")||e.getAttribute("data-wml-event"),a=e.getAttribute("wml-target-window")||e.getAttribute("data-wml-target-window")||"",c=e.getAttribute("wml-window")||e.getAttribute("data-wml-window"),l=e.getAttribute("wml-openurl")||e.getAttribute("data-wml-openurl");s!==null&&Li(s),c!==null&&Ui(a,c),l!==null&&q(l)}let o=e.getAttribute("wml-confirm")||e.getAttribute("data-wml-confirm");o?$({Title:"Confirm",Message:o,Detached:!1,Buttons:[{Label:"Yes"},{Label:"No",IsDefault:!0}]}).then(i):i()}var I=Symbol("controller"),S=Symbol("triggerMap"),W=Symbol("elementCount");I;var re=class{constructor(){this[I]=new AbortController}set(e,i){return{signal:this[I].signal}}reset(){this[I].abort(),this[I]=new AbortController}};S,W;var se=class{constructor(){this[S]=new WeakMap,this[W]=0}set(e,i){return this[S].has(e)||this[W]++,this[S].set(e,i),{}}reset(){if(!(this[W]<=0)){for(let e of document.body.querySelectorAll("*")){if(this[W]<=0)break;let i=this[S].get(e);i!=null&&this[W]--;for(let o of i||[])e.removeEventListener(o,Ke)}this[S]=new WeakMap,this[W]=0}}},Ge=Ne()?new re:new se;function Ii(n){let e=/\S+/g,i=n.getAttribute("wml-trigger")||n.getAttribute("data-wml-trigger")||"click",o=[],t;for(;(t=e.exec(i))!==null;)o.push(t[0]);let s=Ge.set(n,o);for(let a of o)n.addEventListener(a,Ke,s)}function ae(){Ve(Ye)}function Ye(){Ge.reset(),document.body.querySelectorAll("[wml-event], [wml-window], [wml-openurl], [data-wml-event], [data-wml-window], [data-wml-openurl]").forEach(Ii)}window.wails=ce;ae();var ue={};w(ue,{Capabilities:()=>Hi,Environment:()=>Ni,IsAMD64:()=>Ki,IsARM:()=>Gi,IsARM64:()=>Yi,IsDarkMode:()=>Bi,IsDebug:()=>me,IsLinux:()=>Zi,IsMac:()=>Vi,IsWindows:()=>V,invoke:()=>b});var Xe=m(d.System),zi=0,ji=1,de=function(){var n,e,i,o,t;try{if((e=(n=window.chrome)==null?void 0:n.webview)!=null&&e.postMessage)return window.chrome.webview.postMessage.bind(window.chrome.webview);if((t=(o=(i=window.webkit)==null?void 0:i.messageHandlers)==null?void 0:o.external)!=null&&t.postMessage)return window.webkit.messageHandlers.external.postMessage.bind(window.webkit.messageHandlers.external)}catch(s){}return null}();function b(n){return de==null?void 0:de(n)}function Bi(){return Xe(zi)}function Hi(){return C(this,null,function*(){let n=yield fetch("/wails/capabilities");if(n.ok)return n.json();throw new Error("could not fetch capabilities: "+n.statusText)})}function Ni(){return Xe(ji)}function V(){return window._wails.environment.OS==="windows"}function Zi(){return window._wails.environment.OS==="linux"}function Vi(){return window._wails.environment.OS==="darwin"}function Ki(){return window._wails.environment.Arch==="amd64"}function Gi(){return window._wails.environment.Arch==="arm"}function Yi(){return window._wails.environment.Arch==="arm64"}function me(){return!!window._wails.environment.Debug}window.addEventListener("contextmenu",qi);var Xi=m(d.ContextMenu),Ji=0;function Qi(n,e,i,o){Xi(Ji,{id:n,x:e,y:i,data:o})}function qi(n){var o;let e;n.target instanceof HTMLElement?e=n.target:!(n.target instanceof HTMLElement)&&n.target instanceof Node?e=(o=n.target.parentElement)!=null?o:document.body:e=document.body;let i=window.getComputedStyle(e).getPropertyValue("--custom-contextmenu").trim();if(i){n.preventDefault();let t=window.getComputedStyle(e).getPropertyValue("--custom-contextmenu-data");Qi(i,n.clientX,n.clientY,t);return}_i(n)}function _i(n){var i;if(me())return;let e;switch(n.target instanceof HTMLElement?e=n.target:!(n.target instanceof HTMLElement)&&n.target instanceof Node?e=(i=n.target.parentElement)!=null?i:document.body:e=document.body,window.getComputedStyle(e).getPropertyValue("--default-contextmenu").trim()){case"show":return;case"hide":n.preventDefault();return;default:if(e.isContentEditable)return;let o=window.getSelection(),t=o&&o.toString().length>0;if(t)for(let s=0;sz});function z(n){try{return window._wails.flags[n]}catch(e){throw new Error("Unable to retrieve flag '"+n+"': "+e,{cause:e})}}var j=!1,B=!1,he=!1,x=!1,R=!1,y="",Je="auto",T=0,pe=He();window._wails=window._wails||{};window._wails.setResizable=n=>{he=n,he||(x=R=!1,p())};window.addEventListener("mousedown",We,{capture:!0});window.addEventListener("mousemove",We,{capture:!0});window.addEventListener("mouseup",We,{capture:!0});for(let n of["click","contextmenu","dblclick"])window.addEventListener(n,$i,{capture:!0});function $i(n){(B||R)&&(n.stopImmediatePropagation(),n.stopPropagation(),n.preventDefault())}var fe=0,eo=1,ge=2;function We(n){let e,i=n.buttons;switch(n.type){case"mousedown":e=fe,pe||(i=T|1<lo,Quit:()=>mo,Show:()=>co});var be=m(d.Application),ro=0,so=1,ao=2;function lo(){return be(ro)}function co(){return be(so)}function mo(){return be(ao)}var xe={};w(xe,{ByID:()=>Oo,ByName:()=>ko,Call:()=>Te,RuntimeError:()=>X});var qe=Function.prototype.toString,A=typeof Reflect=="object"&&Reflect!==null&&Reflect.apply,ve,K;if(typeof A=="function"&&typeof Object.defineProperty=="function")try{ve=Object.defineProperty({},"length",{get:function(){throw K}}),K={},A(function(){throw 42},null,ve)}catch(n){n!==K&&(A=null)}else A=null;var uo=/^\s*class\b/,Pe=function(e){try{var i=qe.call(e);return uo.test(i)}catch(o){return!1}},Ce=function(e){try{return Pe(e)?!1:(qe.call(e),!0)}catch(i){return!1}},G=Object.prototype.toString,wo="[object Object]",po="[object Function]",fo="[object GeneratorFunction]",go="[object HTMLAllCollection]",ho="[object HTML document.all class]",Wo="[object HTMLCollection]",bo=typeof Symbol=="function"&&!!Symbol.toStringTag,yo=!(0 in[,]),De=function(){return!1};typeof document=="object"&&(Qe=document.all,G.call(Qe)===G.call(document.all)&&(De=function(e){if((yo||!e)&&(typeof e=="undefined"||typeof e=="object"))try{var i=G.call(e);return(i===go||i===ho||i===Wo||i===wo)&&e("")==null}catch(o){}return!1}));var Qe;function vo(n){if(De(n))return!0;if(!n||typeof n!="function"&&typeof n!="object")return!1;try{A(n,null,ve)}catch(e){if(e!==K)return!1}return!Pe(n)&&Ce(n)}function Co(n){if(De(n))return!0;if(!n||typeof n!="function"&&typeof n!="object")return!1;if(bo)return Ce(n);if(Pe(n))return!1;var e=G.call(n);return e!==po&&e!==fo&&!/^\[object HTML/.test(e)?!1:Ce(n)}var h=A?vo:Co;var k=class extends Error{constructor(e,i){super(e,i),this.name="CancelError"}},O=class extends Error{constructor(e,i,o){super((o!=null?o:"Unhandled rejection in cancelled promise.")+" Reason: "+Po(i),{cause:i}),this.promise=e,this.name="CancelledRejectionError"}},g=Symbol("barrier"),Me=Symbol("cancelImpl"),nn,_e=(nn=Symbol.species)!=null?nn:Symbol("speciesPolyfill"),F=class n extends Promise{constructor(e,i){let o,t;if(super((l,u)=>{o=l,t=u}),this.constructor[_e]!==Promise)throw new TypeError("CancellablePromise does not support transparent subclassing. Please refrain from overriding the [Symbol.species] static property.");let s={promise:this,resolve:o,reject:t,get oncancelled(){return i!=null?i:null},set oncancelled(l){i=l!=null?l:void 0}},a={get root(){return a},resolving:!1,settled:!1};Object.defineProperties(this,{[g]:{configurable:!1,enumerable:!1,writable:!0,value:null},[Me]:{configurable:!1,enumerable:!1,writable:!1,value:on(s,a)}});let c=rn(s,a);try{e(tn(s,a),c)}catch(l){a.resolving||c(l)}}cancel(e){return new n(i=>{Promise.allSettled([this[Me](new k("Promise cancelled.",{cause:e})),Do(this)]).then(()=>i(),()=>i())})}cancelOn(e){return e.aborted?this.cancel(e.reason):e.addEventListener("abort",()=>void this.cancel(e.reason),{capture:!0}),this}then(e,i,o){if(!(this instanceof n))throw new TypeError("CancellablePromise.prototype.then called on an invalid object.");if(h(e)||(e=$e),h(i)||(i=en),e===$e&&i==en)return new n(s=>s(this));let t={};return this[g]=t,new n((s,a)=>{Se.call(this,c=>{var l;this[g]===t&&(this[g]=null),(l=t.resolve)==null||l.call(t);try{s(e(c))}catch(u){a(u)}},c=>{var l;this[g]===t&&(this[g]=null),(l=t.resolve)==null||l.call(t);try{s(i(c))}catch(u){a(u)}})},s=>C(this,null,function*(){try{return o==null?void 0:o(s)}finally{yield this.cancel(s)}}))}catch(e,i){return this.then(void 0,e,i)}finally(e,i){if(!(this instanceof n))throw new TypeError("CancellablePromise.prototype.finally called on an invalid object.");return h(e)?this.then(o=>n.resolve(e()).then(()=>o),o=>n.resolve(e()).then(()=>{throw o}),i):this.then(e,e,i)}static get[(g,Me,_e)](){return Promise}static all(e){let i=Array.from(e);return i.length===0?n.resolve(i):new n((o,t)=>{Promise.all(i).then(o,t)},Y(i))}static allSettled(e){let i=Array.from(e);return i.length===0?n.resolve(i):new n((o,t)=>{Promise.allSettled(i).then(o,t)},Y(i))}static any(e){let i=Array.from(e);return i.length===0?n.resolve(i):new n((o,t)=>{Promise.any(i).then(o,t)},Y(i))}static race(e){let i=Array.from(e);return new n((o,t)=>{Promise.race(i).then(o,t)},Y(i))}static cancel(e){let i=new n(()=>{});return i.cancel(e),i}static timeout(e,i){let o=new n(()=>{});return AbortSignal&&typeof AbortSignal=="function"&&AbortSignal.timeout&&typeof AbortSignal.timeout=="function"?AbortSignal.timeout(e).addEventListener("abort",()=>void o.cancel(i)):setTimeout(()=>void o.cancel(i),e),o}static sleep(e,i){return new n(o=>{setTimeout(()=>o(i),e)})}static reject(e){return new n((i,o)=>o(e))}static resolve(e){return e instanceof n?e:new n(i=>i(e))}static withResolvers(){let e={oncancelled:null};return e.promise=new n((i,o)=>{e.resolve=i,e.reject=o},i=>{var o;(o=e.oncancelled)==null||o.call(e,i)}),e}};function on(n,e){let i;return o=>{if(e.settled||(e.settled=!0,e.reason=o,n.reject(o),Se.call(n.promise,void 0,t=>{if(t!==o)throw t})),!(!e.reason||!n.oncancelled))return i=new Promise(t=>{try{t(n.oncancelled(e.reason.cause))}catch(s){Promise.reject(new O(n.promise,s,"Unhandled exception in oncancelled callback."))}}),i.then(void 0,t=>{throw new O(n.promise,t,"Unhandled rejection in oncancelled callback.")}),n.oncancelled=null,i}}function tn(n,e){return i=>{if(!e.resolving){if(e.resolving=!0,i===n.promise){if(e.settled)return;e.settled=!0,n.reject(new TypeError("A promise cannot be resolved with itself."));return}if(i!=null&&(typeof i=="object"||typeof i=="function")){let o;try{o=i.then}catch(t){e.settled=!0,n.reject(t);return}if(h(o)){try{let a=i.cancel;if(h(a)){let c=l=>{Reflect.apply(a,i,[l])};e.reason?on(Ie(Ue({},n),{oncancelled:c}),e)(e.reason):n.oncancelled=c}}catch(a){}let t={root:e.root,resolving:!1,get settled(){return this.root.settled},set settled(a){this.root.settled=a},get reason(){return this.root.reason}},s=rn(n,t);try{Reflect.apply(o,i,[tn(n,t),s])}catch(a){s(a)}return}}e.settled||(e.settled=!0,n.resolve(i))}}}function rn(n,e){return i=>{if(!e.resolving)if(e.resolving=!0,e.settled){try{if(i instanceof k&&e.reason instanceof k&&Object.is(i.cause,e.reason.cause))return}catch(o){}Promise.reject(new O(n.promise,i))}else e.settled=!0,n.reject(i)}}function Y(n){return e=>{for(let i of n)try{if(h(i.then)){let o=i.cancel;h(o)&&Reflect.apply(o,i,[e])}}catch(o){}}}function $e(n){return n}function en(n){throw n}function Po(n){try{if(n instanceof Error||typeof n!="object"||n.toString!==Object.prototype.toString)return""+n}catch(e){}try{return JSON.stringify(n)}catch(e){}try{return Object.prototype.toString.call(n)}catch(e){}return""}function Do(n){var i;let e=(i=n[g])!=null?i:{};return"promise"in e||Object.assign(e,E()),n[g]==null&&(e.resolve(),n[g]=e),e.promise}var Se=Promise.prototype.then;Promise.prototype.then=function(...n){return this instanceof F?this.then(...n):Reflect.apply(Se,this,n)};var E=Promise.withResolvers;E&&typeof E=="function"?E=E.bind(Promise):E=function(){let n,e;return{promise:new Promise((o,t)=>{n=o,e=t}),resolve:n,reject:e}};window._wails=window._wails||{};window._wails.callResultHandler=Ro;window._wails.callErrorHandler=Ao;var Mo=m(d.Call),So=m(d.CancelCall),L=new Map,To=0,xo=0,X=class extends Error{constructor(e,i){super(e,i),this.name="RuntimeError"}};function Ro(n,e,i){let o=sn(n);if(o)if(!e)o.resolve(void 0);else if(!i)o.resolve(e);else try{o.resolve(JSON.parse(e))}catch(t){o.reject(new TypeError("could not parse result: "+t.message,{cause:t}))}}function Ao(n,e,i){let o=sn(n);if(o)if(!i)o.reject(new Error(e));else{let t;try{t=JSON.parse(e)}catch(c){o.reject(new TypeError("could not parse error: "+c.message,{cause:c}));return}let s={};t.cause&&(s.cause=t.cause);let a;switch(t.kind){case"ReferenceError":a=new ReferenceError(t.message,s);break;case"TypeError":a=new TypeError(t.message,s);break;case"RuntimeError":a=new X(t.message,s);break;default:a=new Error(t.message,s);break}o.reject(a)}}function sn(n){let e=L.get(n);return L.delete(n),e}function Eo(){let n;do n=P();while(L.has(n));return n}function Te(n){let e=Eo(),i=F.withResolvers();L.set(e,{resolve:i.resolve,reject:i.reject});let o=Mo(To,Object.assign({"call-id":e},n)),t=!1;o.then(()=>{t=!0},a=>{L.delete(e),i.reject(a)});let s=()=>(L.delete(e),So(xo,{"call-id":e}).catch(a=>{}));return i.oncancelled=()=>t?s():o.then(s),i.promise}function ko(n,...e){return Te({methodName:n,args:e})}function Oo(n,...e){return Te({methodID:n,args:e})}var Re={};w(Re,{SetText:()=>Uo,Text:()=>Io});var an=m(d.Clipboard),Fo=0,Lo=1;function Uo(n){return an(Fo,{text:n})}function Io(){return an(Lo)}var Ae={};w(Ae,{Any:()=>v,Array:()=>jo,ByteSlice:()=>zo,Map:()=>Bo,Nullable:()=>Ho,Struct:()=>No});function v(n){return n}function zo(n){return n==null?"":n}function jo(n){return n===v?e=>e===null?[]:e:e=>{if(e===null)return[];for(let i=0;ii===null?{}:i:i=>{if(i===null)return{};for(let o in i)i[o]=e(i[o]);return i}}function Ho(n){return n===v?v:e=>e===null?null:n(e)}function No(n){let e=!0;for(let i in n)if(n[i]!==v){e=!1;break}return e?v:i=>{for(let o in n)o in i&&(i[o]=n[o](i[o]));return i}}var ke={};w(ke,{GetAll:()=>Go,GetCurrent:()=>Xo,GetPrimary:()=>Yo});var Ee=m(d.Screens),Zo=0,Vo=1,Ko=2;function Go(){return Ee(Zo)}function Yo(){return Ee(Vo)}function Xo(){return Ee(Ko)}window._wails=window._wails||{};window._wails.invoke=b;b("wails:runtime:ready");export{ye as Application,_ as Browser,xe as Call,k as CancelError,F as CancellablePromise,O as CancelledRejectionError,Re as Clipboard,Ae as Create,ee as Dialogs,oe as Events,we as Flags,ke as Screens,ue as System,le as WML,Z as Window}; diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/package-lock.json b/v3/internal/runtime/desktop/@wailsio/runtime/package-lock.json index 86e396190..126472cd2 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/package-lock.json +++ b/v3/internal/runtime/desktop/@wailsio/runtime/package-lock.json @@ -1,12 +1,12 @@ { "name": "@wailsio/runtime", - "version": "3.0.0-alpha.56", + "version": "3.0.0-alpha.57", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@wailsio/runtime", - "version": "3.0.0-alpha.56", + "version": "3.0.0-alpha.57", "license": "MIT", "devDependencies": { "happy-dom": "^17.1.1", diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/drag.ts b/v3/internal/runtime/desktop/@wailsio/runtime/src/drag.ts index 71fdc0256..6b1280c2e 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/src/drag.ts +++ b/v3/internal/runtime/desktop/@wailsio/runtime/src/drag.ts @@ -35,54 +35,105 @@ window._wails.setResizable = (value: boolean): void => { } }; -window.addEventListener('mousedown', onMouseDown, { capture: true }); -window.addEventListener('mousemove', onMouseMove, { capture: true }); -window.addEventListener('mouseup', onMouseUp, { capture: true }); -for (const ev of ['click', 'contextmenu', 'dblclick', 'pointerdown', 'pointerup']) { +window.addEventListener('mousedown', update, { capture: true }); +window.addEventListener('mousemove', update, { capture: true }); +window.addEventListener('mouseup', update, { capture: true }); +for (const ev of ['click', 'contextmenu', 'dblclick']) { window.addEventListener(ev, suppressEvent, { capture: true }); } function suppressEvent(event: Event) { + // Suppress click events while resizing or dragging. if (dragging || resizing) { - // Suppress all button events during dragging & resizing. event.stopImmediatePropagation(); event.stopPropagation(); event.preventDefault(); } } -function onMouseDown(event: MouseEvent): void { - buttons = buttonsTracked ? event.buttons : (buttons | (1 << event.button)); +// Use constants to avoid comparing strings multiple times. +const MouseDown = 0; +const MouseUp = 1; +const MouseMove = 2; - if (dragging || resizing) { - // After dragging or resizing has started, only lifting the primary button can stop it. - // Do not let any other events through. - suppressEvent(event); - return; +function update(event: MouseEvent) { + // Windows suppresses mouse events at the end of dragging or resizing, + // so we need to be smart and synthesize button events. + + let eventType: number, eventButtons = event.buttons; + switch (event.type) { + case 'mousedown': + eventType = MouseDown; + if (!buttonsTracked) { eventButtons = buttons | (1 << event.button); } + break; + case 'mouseup': + eventType = MouseUp; + if (!buttonsTracked) { eventButtons = buttons & ~(1 << event.button); } + break; + default: + eventType = MouseMove; + if (!buttonsTracked) { eventButtons = buttons; } + break; } - if ((canDrag || canResize) && (buttons & 1) && event.button !== 0) { - // We were ready before, the primary is pressed and was not released: - // still ready, but let events bubble through the window. - return; + let released = buttons & ~eventButtons; + let pressed = eventButtons & ~buttons; + + buttons = eventButtons; + + // Synthesize a release-press sequence if we detect a press of an already pressed button. + if (eventType === MouseDown && !(pressed & event.button)) { + released |= (1 << event.button); + pressed |= (1 << event.button); } + // Suppress all button events during dragging and resizing, + // unless this is a mouseup event that is ending a drag action. + if ( + eventType !== MouseMove // Fast path for mousemove + && resizing + || ( + dragging + && ( + eventType === MouseDown + || event.button !== 0 + ) + ) + ) { + event.stopImmediatePropagation(); + event.stopPropagation(); + event.preventDefault(); + } + + // Handle releases + if (released & 1) { primaryUp(event); } + // Handle presses + if (pressed & 1) { primaryDown(event); } + + // Handle mousemove + if (eventType === MouseMove) { onMouseMove(event); }; +} + +function primaryDown(event: MouseEvent): void { // Reset readiness state. canDrag = false; canResize = false; - // Check for resizing readiness. - if (resizeEdge) { - if (event.button === 0 && event.detail === 1) { - // Ready to resize if the primary button was pressed for the first time. - canResize = true; - invoke("wails:resize:" + resizeEdge); + // Ignore repeated clicks on macOS and Linux. + if (!IsWindows()) { + if (event.type === 'mousedown' && event.button === 0 && event.detail !== 1) { + return; } + } - // Do not start drag operations within resize edges. + if (resizeEdge) { + // Ready to resize if the primary button was pressed for the first time. + canResize = true; + // Do not start drag operations when on resize edges. return; } + // Retrieve target element let target: HTMLElement; if (event.target instanceof HTMLElement) { @@ -93,41 +144,24 @@ function onMouseDown(event: MouseEvent): void { target = document.body; } + // Ready to drag if the primary button was pressed for the first time on a draggable element. + // Ignore clicks on the scrollbar. const style = window.getComputedStyle(target); - const setting = style.getPropertyValue("--wails-draggable").trim(); - if (setting === "drag" && event.button === 0 && event.detail === 1) { - // Ready to drag if the primary button was pressed for the first time on a draggable element. - // Ignore clicks on the scrollbar. - if ( + canDrag = ( + style.getPropertyValue("--wails-draggable").trim() === "drag" + && ( event.offsetX - parseFloat(style.paddingLeft) < target.clientWidth && event.offsetY - parseFloat(style.paddingTop) < target.clientHeight - ) { - canDrag = true; - invoke("wails:drag"); - } - } + ) + ); } -function onMouseUp(event: MouseEvent) { - buttons = buttonsTracked ? event.buttons : (buttons & ~(1 << event.button)); - - if (event.button === 0) { - if (resizing) { - // Let mouseup event bubble when a drag ends, but not when a resize ends. - suppressEvent(event); - } - - // Stop dragging and resizing when the primary button is lifted. - canDrag = false; - dragging = false; - canResize = false; - resizing = false; - return; - } - - // After dragging or resizing has started, only lifting the primary button can stop it. - suppressEvent(event); - return; +function primaryUp(event: MouseEvent) { + // Stop dragging and resizing. + canDrag = false; + dragging = false; + canResize = false; + resizing = false; } const cursorForEdge = Object.freeze({ @@ -156,9 +190,11 @@ function onMouseMove(event: MouseEvent): void { if (canResize && resizeEdge) { // Start resizing. resizing = true; + invoke("wails:resize:" + resizeEdge); } else if (canDrag) { // Start dragging. dragging = true; + invoke("wails:drag"); } if (dragging || resizing) { From c0f92d69a063d522b4722bb013090564af62fce2 Mon Sep 17 00:00:00 2001 From: Fabio Massaioli Date: Tue, 25 Feb 2025 14:17:20 +0100 Subject: [PATCH 058/374] Restructure workflows --- .github/workflows/build-and-test-v3.yml | 74 ++++++++++++++++++++----- .github/workflows/pr-v3.yml | 48 ---------------- .github/workflows/publish-npm.yml | 64 ++++++++++----------- 3 files changed, 94 insertions(+), 92 deletions(-) delete mode 100644 .github/workflows/pr-v3.yml diff --git a/.github/workflows/build-and-test-v3.yml b/.github/workflows/build-and-test-v3.yml index 4f42dcf54..b7bb78f67 100644 --- a/.github/workflows/build-and-test-v3.yml +++ b/.github/workflows/build-and-test-v3.yml @@ -22,6 +22,50 @@ jobs: echo "approved=false" >> $GITHUB_OUTPUT fi + check_build_artifacts: + name: Check runtime build artifact changes + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + persist-credentials: 'true' + + - name: Get changed files + id: changed-files + uses: tj-actions/changed-files@v45 + with: + files: | + v3/internal/runtime/desktop/@wailsio/runtime/dist/** + v3/internal/runtime/desktop/@wailsio/runtime/types/** + + - name: Get merge base + id: merge-base + if: steps.changed-files.outputs.any_changed == 'true' + env: + BASE_SHA: ${{github.event.pull_request.base.sha}} + HEAD_SHA: ${{github.event.pull_request.head.sha}} + run: | + echo "sha=$(git merge-base "$BASE_SHA" "$HEAD_SHA")" >> $GITHUB_OUTPUT + + - name: This PR includes changes to runtime build artifacts + uses: actions/github-script@v7 + if: steps.changed-files.outputs.any_changed == 'true' + env: + MERGE_BASE_SHA: ${{steps.merge-base.outputs.sha}} + with: + script: | + process.exitCode = 1 + core.error( + 'The CI pipeline will rebuild and publish the runtime automatically.\n' + + 'Please run the following command (or equivalent) in your local wails repo\n' + + 'to revert all build artifact changes; then update the PR:\n\n' + + ' cd v3/internal/runtime/desktop/@wailsio/runtime &&\n' + + ` git restore -s ${process.env.MERGE_BASE_SHA} -W -S -- dist types &&${"\n"}` + + ' git commit -m "Revert build artifact changes"\n', + { title: 'This PR includes changes to runtime build artifacts' } + ); + test_go: name: Run Go Tests needs: check_approval @@ -56,24 +100,24 @@ jobs: repo-token: ${{ secrets.GITHUB_TOKEN }} - name: Build Examples - working-directory: ./v3 + working-directory: v3 run: task test:examples - name: Run tests (mac) if: matrix.os == 'macos-latest' env: CGO_LDFLAGS: -framework UniformTypeIdentifiers -mmacosx-version-min=10.13 - working-directory: ./v3 + working-directory: v3 run: go test -v ./... - name: Run tests (windows) if: matrix.os == 'windows-latest' - working-directory: ./v3 + working-directory: v3 run: go test -v ./... - name: Run tests (ubuntu) if: matrix.os == 'ubuntu-latest' - working-directory: ./v3 + working-directory: v3 run: > xvfb-run --auto-servernum sh -c ' @@ -82,7 +126,7 @@ jobs: ' - name: Typecheck binding generator output - working-directory: ./v3 + working-directory: v3 run: task generator:test:check test_js: @@ -108,23 +152,27 @@ jobs: version: 3.x repo-token: ${{ secrets.GITHUB_TOKEN }} - - name: Typecheck runtime + - name: Clean build artifacts + working-directory: v3/internal/runtime/desktop/@wailsio/runtime + run: npm run clean + + - name: Type-check runtime + working-directory: v3 run: task runtime:check - working-directory: ./v3 - name: Test runtime + working-directory: v3 run: task runtime:test - working-directory: ./v3 - - name: Build bundled runtime + - name: Check that the bundled runtime builds + working-directory: v3 run: | npx --yes -p esbuild@latest exit task runtime:build - working-directory: ./v3 - - name: Verify that the npm package builds correctly + - name: Check that the npm package builds + working-directory: v3/internal/runtime/desktop/@wailsio/runtime run: npm run prepack - working-directory: ./v3/internal/runtime/desktop/@wailsio/runtime test_templates: name: Test Templates @@ -172,7 +220,7 @@ jobs: repo-token: ${{ secrets.GITHUB_TOKEN }} - name: Build Wails3 CLI - working-directory: ./v3 + working-directory: v3 run: | task install wails3 doctor diff --git a/.github/workflows/pr-v3.yml b/.github/workflows/pr-v3.yml deleted file mode 100644 index 9f0047345..000000000 --- a/.github/workflows/pr-v3.yml +++ /dev/null @@ -1,48 +0,0 @@ -name: PR Checks v3 - -on: - pull_request: - types: [opened, synchronize, reopened, ready_for_review] - -jobs: - changed_files: - name: Prevent runtime build artifact changes - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v4 - with: - persist-credentials: 'true' - - - name: Get changed files - id: changed-files - uses: tj-actions/changed-files@v45 - with: - files: v3/internal/runtime/desktop/@wailsio/runtime/{dist,docs,types}/** - - - name: Get merge base - id: merge-base - if: steps.changed-files.outputs.any_changed == 'true' - env: - BASE_SHA: ${{github.event.pull_request.base.sha}} - HEAD_SHA: ${{github.event.pull_request.head.sha}} - run: | - echo "MERGE_BASE_SHA=$(git merge-base "$BASE_SHA" "$HEAD_SHA")" >> $GITHUB_OUTPUT - - - name: Fail and report - uses: actions/github-script@v7 - if: steps.changed-files.outputs.any_changed == 'true' - env: - MERGE_BASE_SHA: ${{steps.merge-base.outputs.MERGE_BASE_SHA}} - with: - script: | - process.exitCode = 1 - core.error( - 'The CI pipeline will rebuild and publish the runtime automatically.\n' + - 'Please run the following command (or equivalent) in your local wails repo\n' + - 'to revert all build artifact changes, then update the PR:\n\n' + - ' cd v3/internal/runtime/desktop/@wailsio/runtime &&\n' + - ` git restore -s ${process.env.MERGE_BASE_SHA} -W -S -- dist docs types &&${"\n"}` + - ' git commit -m "Revert build artifact changes"', - { title: "Build artifact changes detected" } - ); diff --git a/.github/workflows/publish-npm.yml b/.github/workflows/publish-npm.yml index b2fd3c434..c263eb2bd 100644 --- a/.github/workflows/publish-npm.yml +++ b/.github/workflows/publish-npm.yml @@ -12,7 +12,6 @@ jobs: ref: 'v3-alpha' ssh-key: ${{ secrets.DEPLOY_KEY }} - - name: Configure git run: | git config --local user.email "github-actions@github.com" @@ -29,62 +28,65 @@ jobs: with: node-version: "20" - - name: Test+Build - run: | - npm ci - npm test - npm run build + - name: Clean build artifacts working-directory: v3/internal/runtime/desktop/@wailsio/runtime + run: npm run clean - name: Build bundled runtime + working-directory: v3 run: | npx --yes -p esbuild@latest exit task runtime:build - working-directory: v3 - - name: Detect build artifact changes + - name: Test+Build npm package + working-directory: v3/internal/runtime/desktop/@wailsio/runtime + run: | + npm ci + npm test + npm run prepack + + - name: Detect npm package changes uses: tj-actions/verify-changed-files@v20 - id: build-artifact-changes + id: package-changes with: - files: v3/internal/runtime/desktop/@wailsio/runtime/{dist,types,docs}/** + files: | + v3/internal/runtime/desktop/@wailsio/runtime/dist/** + v3/internal/runtime/desktop/@wailsio/runtime/types/** - name: Bump version - if: steps.build-artifact-changes.outputs.files_changed == 'true' - run: | - npm version prerelease + if: steps.package-changes.outputs.files_changed == 'true' + id: bump-version working-directory: v3/internal/runtime/desktop/@wailsio/runtime - - - name: Get version - if: steps.build-artifact-changes.outputs.files_changed == 'true' - id: get-version - uses: beaconbrigade/package-json-version@v0.3.2 - with: - path: v3/internal/runtime/desktop/@wailsio/runtime + run: | + echo "version=$(npm version prerelease)" >> $GITHUB_OUTPUT - name: Commit changes - if: steps.build-artifact-changes.outputs.files_changed == 'true' + if: steps.package-changes.outputs.files_changed == 'true' run: | git add . - git commit -m "[skip ci] Publish @wailsio/runtime ${{ steps.get-version.outputs.version }}" + git commit -m "[skip ci] Publish @wailsio/runtime ${{ steps.bump-version.outputs.version }}" git push - - uses: JS-DevTools/npm-publish@v3 - if: steps.build-artifact-changes.outputs.files_changed == 'true' + - name: Publish npm package + uses: JS-DevTools/npm-publish@v3 + if: steps.package-changes.outputs.files_changed == 'true' with: package: v3/internal/runtime/desktop/@wailsio/runtime access: public token: ${{ secrets.NPM_TOKEN }} - - name: Detect bundled runtime changes - if: steps.build-artifact-changes.outputs.files_changed != 'true' + - name: Detect docs and bundled runtime changes + if: steps.package-changes.outputs.files_changed != 'true' uses: tj-actions/verify-changed-files@v20 - id: bundle-changes + id: docs-bundle-changes with: - files: v3/internal/assetserver/bundledassets/** + files: | + v3/internal/assetserver/bundledassets/** + v3/internal/runtime/desktop/@wailsio/runtime/docs/** - - name: Commit bundled runtime changes - if: steps.build-artifact-changes.outputs.files_changed != 'true' && steps.bundle-changes.outputs.files_changed == 'true' + - name: Commit docs and bundled runtime changes + if: steps.package-changes.outputs.files_changed != 'true' && steps.docs-bundle-changes.outputs.files_changed == 'true' run: | git add . - git commit -m "[skip ci] Update bundled runtime" + git commit -m "[skip ci] Update runtime docs and bundle" git push From db6295594fea1d79a72e54919e5c1cd214765cc8 Mon Sep 17 00:00:00 2001 From: Fabio Massaioli Date: Tue, 25 Feb 2025 16:33:38 +0100 Subject: [PATCH 059/374] Fix cancellation of promise arrays --- .../@wailsio/runtime/src/cancellable.test.js | 1 + .../@wailsio/runtime/src/cancellable.ts | 73 ++++++++++++------- .../desktop/@wailsio/runtime/src/index.ts | 2 +- 3 files changed, 49 insertions(+), 27 deletions(-) diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/cancellable.test.js b/v3/internal/runtime/desktop/@wailsio/runtime/src/cancellable.test.js index 4a86a2abe..b618c1459 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/src/cancellable.test.js +++ b/v3/internal/runtime/desktop/@wailsio/runtime/src/cancellable.test.js @@ -12,6 +12,7 @@ import { CancelError, CancellablePromise, CancelledRejectionError } from "./canc // it should be reported as an unhandled rejection, // - unless it is a CancelError with the same reason given for cancelling the returned promise. // TODO: test multiple calls to cancel() (second and later should have no effect). +// TODO: test static factory methods and their cancellation support. let expectedUnhandled = new Map(); diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/cancellable.ts b/v3/internal/runtime/desktop/@wailsio/runtime/src/cancellable.ts index 8406b78b3..acc8236aa 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/src/cancellable.ts +++ b/v3/internal/runtime/desktop/@wailsio/runtime/src/cancellable.ts @@ -68,7 +68,7 @@ type CancellablePromiseExecutor = (resolve: CancellablePromiseResolver, re export interface CancellablePromiseLike { then(onfulfilled?: ((value: T) => TResult1 | PromiseLike | CancellablePromiseLike) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike | CancellablePromiseLike) | undefined | null): CancellablePromiseLike; - cancel(cause?: any): void; + cancel(cause?: any): void | PromiseLike; } /** @@ -292,7 +292,9 @@ export class CancellablePromise extends Promise implements PromiseLike, */ cancel(cause?: any): CancellablePromise { return new CancellablePromise((resolve) => { - Promise.allSettled([ + // INVARIANT: the result of this[cancelImplSym] and the barrier do not ever reject. + // Unfortunately macOS High Sierra does not support Promise.allSettled. + Promise.all([ this[cancelImplSym](new CancelError("Promise cancelled.", { cause })), currentBarrier(this) ]).then(() => resolve(), () => resolve()); @@ -523,11 +525,12 @@ export class CancellablePromise extends Promise implements PromiseLike, static all(values: T): CancellablePromise<{ -readonly [P in keyof T]: Awaited; }>; static all | ArrayLike>(values: T): CancellablePromise { let collected = Array.from(values); - return collected.length === 0 + const promise = collected.length === 0 ? CancellablePromise.resolve(collected) : new CancellablePromise((resolve, reject) => { void Promise.all(collected).then(resolve, reject); - }, allCanceller(collected)); + }, (cause?): Promise => cancelAll(promise, collected, cause)); + return promise; } /** @@ -543,11 +546,12 @@ export class CancellablePromise extends Promise implements PromiseLike, static allSettled(values: T): CancellablePromise<{ -readonly [P in keyof T]: PromiseSettledResult>; }>; static allSettled | ArrayLike>(values: T): CancellablePromise { let collected = Array.from(values); - return collected.length === 0 + const promise = collected.length === 0 ? CancellablePromise.resolve(collected) : new CancellablePromise((resolve, reject) => { void Promise.allSettled(collected).then(resolve, reject); - }, allCanceller(collected)); + }, (cause?): Promise => cancelAll(promise, collected, cause)); + return promise; } /** @@ -565,11 +569,12 @@ export class CancellablePromise extends Promise implements PromiseLike, static any(values: T): CancellablePromise>; static any | ArrayLike>(values: T): CancellablePromise { let collected = Array.from(values); - return collected.length === 0 + const promise = collected.length === 0 ? CancellablePromise.resolve(collected) : new CancellablePromise((resolve, reject) => { void Promise.any(collected).then(resolve, reject); - }, allCanceller(collected)); + }, (cause?): Promise => cancelAll(promise, collected, cause)); + return promise; } /** @@ -584,9 +589,10 @@ export class CancellablePromise extends Promise implements PromiseLike, static race(values: T): CancellablePromise>; static race | ArrayLike>(values: T): CancellablePromise { let collected = Array.from(values); - return new CancellablePromise((resolve, reject) => { + const promise = new CancellablePromise((resolve, reject) => { void Promise.race(collected).then(resolve, reject); - }, allCanceller(collected)); + }, (cause?): Promise => cancelAll(promise, collected, cause)); + return promise; } /** @@ -722,15 +728,14 @@ function cancellerFor(promise: CancellablePromiseWithResolvers, state: Can // If oncancelled is unset, no need to go any further. if (!state.reason || !promise.oncancelled) { return; } - cancellationPromise = new Promise((resolve) => { + cancellationPromise = new Promise((resolve) => { try { resolve(promise.oncancelled!(state.reason!.cause)); } catch (err) { Promise.reject(new CancelledRejectionError(promise.promise, err, "Unhandled exception in oncancelled callback.")); } - }); - cancellationPromise.then(undefined, (reason?) => { - throw new CancelledRejectionError(promise.promise, reason, "Unhandled rejection in oncancelled callback."); + }).catch((reason?) => { + Promise.reject(new CancelledRejectionError(promise.promise, reason, "Unhandled rejection in oncancelled callback.")); }); // Unset oncancelled to prevent repeated calls. @@ -832,21 +837,37 @@ function rejectorFor(promise: CancellablePromiseWithResolvers, state: Canc } /** - * Returns a callback that cancels all values in an iterable that look like cancellable thenables. + * Cancels all values in an array that look like cancellable thenables. + * Returns a promise that fulfills once all cancellation procedures for the given values have settled. */ -function allCanceller(values: Iterable): CancellablePromiseCanceller { - return (cause?) => { - for (const value of values) { - try { - if (isCallable(value.then)) { - let cancel = value.cancel; - if (isCallable(cancel)) { - Reflect.apply(cancel, value, [cause]); - } - } - } catch {} +function cancelAll(parent: CancellablePromise, values: any[], cause?: any): Promise { + const results = []; + + for (const value of values) { + let cancel: CancellablePromiseCanceller; + try { + if (!isCallable(value.then)) { continue; } + cancel = value.cancel; + if (!isCallable(cancel)) { continue; } + } catch { continue; } + + let result: void | PromiseLike; + try { + result = Reflect.apply(cancel, value, [cause]); + } catch (err) { + Promise.reject(new CancelledRejectionError(parent, err, "Unhandled exception in cancel method.")); + continue; } + + if (!result) { continue; } + results.push( + (result instanceof Promise ? result : Promise.resolve(result)).catch((reason?) => { + Promise.reject(new CancelledRejectionError(parent, reason, "Unhandled rejection in cancel method.")); + }) + ); } + + return Promise.all(results) as any; } /** diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/index.ts b/v3/internal/runtime/desktop/@wailsio/runtime/src/index.ts index 7905ead84..09d0dc243 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/src/index.ts +++ b/v3/internal/runtime/desktop/@wailsio/runtime/src/index.ts @@ -45,8 +45,8 @@ export { /** * An internal utility consumed by the binding generator. * - * @private * @ignore + * @internal */ export { Create }; From 746b38abe5306d8c526e16955bcb4e9ab9dd3ac9 Mon Sep 17 00:00:00 2001 From: Fabio Massaioli Date: Tue, 25 Feb 2025 16:36:42 +0100 Subject: [PATCH 060/374] Update changelog --- docs/src/content/docs/changelog.mdx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/src/content/docs/changelog.mdx b/docs/src/content/docs/changelog.mdx index 5047a6feb..14f6dfaba 100644 --- a/docs/src/content/docs/changelog.mdx +++ b/docs/src/content/docs/changelog.mdx @@ -60,6 +60,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Add test harness for application startup/shutdown sequence and service startup/shutdown tests by [@fbbdev](https://github.com/fbbdev) in [#4066](https://github.com/wailsapp/wails/pull/4066) - Add `RegisterService` method for registering services after the application has been created by [@fbbdev](https://github.com/fbbdev) in [#4066](https://github.com/wailsapp/wails/pull/4066) - Add `MarshalError` field in application and service options for custom error handling in binding calls by [@fbbdev](https://github.com/fbbdev) in [#4066](https://github.com/wailsapp/wails/pull/4066) +- Add cancellable promise wrapper that propagates cancellation requests through promise chains by [@fbbdev](https://github.com/fbbdev) in [#4100](https://github.com/wailsapp/wails/pull/4100) +- Add the ability to tie binding call cancellation to an `AbortSignal` by [@fbbdev](https://github.com/fbbdev) in [#4100](https://github.com/wailsapp/wails/pull/4100) +- Support `data-wml-*` attributes for WML alongside the usual `wml-*` attributes by [@leaanthony](https://github.com/leaanthony) ### Fixed @@ -90,6 +93,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fixed handling and formatting of errors in message processors by [@fbbdev](https://github.com/fbbdev) in [#4066](https://github.com/wailsapp/wails/pull/4066) -  Fixed skipped service shutdown when quitting application by [@fbbdev](https://github.com/fbbdev) in [#4066](https://github.com/wailsapp/wails/pull/4066) -  Ensure menu updates occur on the main thread by [@leaanthony](https://github.com/leaanthony) +- The dragging and resizing mechanism is now more robust and matches expected platform behaviour more closely by [@fbbdev](https://github.com/fbbdev) in [#4100](https://github.com/wailsapp/wails/pull/4100) ### Changed @@ -110,6 +114,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `ServiceStartup` hooks are now invoked when `App.Run` is called, not in `application.New` by [@fbbdev](https://github.com/fbbdev) in [#4066](https://github.com/wailsapp/wails/pull/4066) - `ServiceStartup` errors are now returned from `App.Run` instead of terminating the process by [@fbbdev](https://github.com/fbbdev) in [#4066](https://github.com/wailsapp/wails/pull/4066) - Binding and dialog calls from JS now reject with error objects instead of strings by [@fbbdev](https://github.com/fbbdev) in [#4066](https://github.com/wailsapp/wails/pull/4066) +- The JS runtime has been ported to TypeScript by [@fbbdev](https://github.com/fbbdev) in [#4100](https://github.com/wailsapp/wails/pull/4100) +- Bound methods now return a `CancellablePromise` that rejects with a `CancelError` if cancelled. The actual result of the call is discarded by [@fbbdev](https://github.com/fbbdev) in [#4100](https://github.com/wailsapp/wails/pull/4100) ## v3.0.0-alpha.9 - 2025-01-13 From 5436ebee71b94b8ac549dfa2568e0104311ca6a9 Mon Sep 17 00:00:00 2001 From: Fabio Massaioli Date: Tue, 25 Feb 2025 17:03:09 +0100 Subject: [PATCH 061/374] Allow manual publishing of the npm package --- .github/workflows/publish-npm.yml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/workflows/publish-npm.yml b/.github/workflows/publish-npm.yml index c263eb2bd..ec592edff 100644 --- a/.github/workflows/publish-npm.yml +++ b/.github/workflows/publish-npm.yml @@ -1,6 +1,7 @@ on: push: branches: ['v3-alpha'] + workflow_dispatch: jobs: publish: @@ -54,14 +55,14 @@ jobs: v3/internal/runtime/desktop/@wailsio/runtime/types/** - name: Bump version - if: steps.package-changes.outputs.files_changed == 'true' + if: github.event_name == 'workflow_dispatch' || steps.package-changes.outputs.files_changed == 'true' id: bump-version working-directory: v3/internal/runtime/desktop/@wailsio/runtime run: | echo "version=$(npm version prerelease)" >> $GITHUB_OUTPUT - name: Commit changes - if: steps.package-changes.outputs.files_changed == 'true' + if: github.event_name == 'workflow_dispatch' || steps.package-changes.outputs.files_changed == 'true' run: | git add . git commit -m "[skip ci] Publish @wailsio/runtime ${{ steps.bump-version.outputs.version }}" @@ -69,14 +70,14 @@ jobs: - name: Publish npm package uses: JS-DevTools/npm-publish@v3 - if: steps.package-changes.outputs.files_changed == 'true' + if: github.event_name == 'workflow_dispatch' || steps.package-changes.outputs.files_changed == 'true' with: package: v3/internal/runtime/desktop/@wailsio/runtime access: public token: ${{ secrets.NPM_TOKEN }} - name: Detect docs and bundled runtime changes - if: steps.package-changes.outputs.files_changed != 'true' + if: github.event_name != 'workflow_dispatch' && steps.package-changes.outputs.files_changed != 'true' uses: tj-actions/verify-changed-files@v20 id: docs-bundle-changes with: @@ -85,7 +86,7 @@ jobs: v3/internal/runtime/desktop/@wailsio/runtime/docs/** - name: Commit docs and bundled runtime changes - if: steps.package-changes.outputs.files_changed != 'true' && steps.docs-bundle-changes.outputs.files_changed == 'true' + if: github.event_name != 'workflow_dispatch' && steps.package-changes.outputs.files_changed != 'true' && steps.docs-bundle-changes.outputs.files_changed == 'true' run: | git add . git commit -m "[skip ci] Update runtime docs and bundle" From b74b9efa8ef11b57697c6bb4274bac65ff10d25c Mon Sep 17 00:00:00 2001 From: Fabio Massaioli Date: Tue, 25 Feb 2025 17:15:45 +0100 Subject: [PATCH 062/374] Fix OffAll test Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- .../runtime/desktop/@wailsio/runtime/src/events.test.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/events.test.js b/v3/internal/runtime/desktop/@wailsio/runtime/src/events.test.js index c21804f53..e8157a17a 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/src/events.test.js +++ b/v3/internal/runtime/desktop/@wailsio/runtime/src/events.test.js @@ -144,6 +144,10 @@ describe("OffAll", () => { On('b', cbb); On('c', cbc); On('c', cbc); + OffAll(); + dispatchWailsEvent({ name: 'a' }); + dispatchWailsEvent({ name: 'b' }); + dispatchWailsEvent({ name: 'c' }); expect(cba).not.toHaveBeenCalled(); expect(cbb).not.toHaveBeenCalled(); expect(cbc).not.toHaveBeenCalled(); From 11866ee52f1b930d87a78046ae15af662b51c155 Mon Sep 17 00:00:00 2001 From: Fabio Massaioli Date: Tue, 25 Feb 2025 17:19:56 +0100 Subject: [PATCH 063/374] Remove unneeded return statement Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- v3/internal/runtime/desktop/@wailsio/runtime/src/system.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/system.ts b/v3/internal/runtime/desktop/@wailsio/runtime/src/system.ts index 444c49ef2..cc160d03b 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/src/system.ts +++ b/v3/internal/runtime/desktop/@wailsio/runtime/src/system.ts @@ -32,7 +32,7 @@ const _invoke = (function () { })(); export function invoke(msg: any): void { - return _invoke?.(msg); + _invoke?.(msg); } /** From c774e198ee7716a3e1ff5a494ffda8762fed252a Mon Sep 17 00:00:00 2001 From: Fabio Massaioli Date: Tue, 25 Feb 2025 17:48:07 +0100 Subject: [PATCH 064/374] Update changelog --- docs/src/content/docs/changelog.mdx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/src/content/docs/changelog.mdx b/docs/src/content/docs/changelog.mdx index 14f6dfaba..db6121866 100644 --- a/docs/src/content/docs/changelog.mdx +++ b/docs/src/content/docs/changelog.mdx @@ -115,6 +115,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `ServiceStartup` errors are now returned from `App.Run` instead of terminating the process by [@fbbdev](https://github.com/fbbdev) in [#4066](https://github.com/wailsapp/wails/pull/4066) - Binding and dialog calls from JS now reject with error objects instead of strings by [@fbbdev](https://github.com/fbbdev) in [#4066](https://github.com/wailsapp/wails/pull/4066) - The JS runtime has been ported to TypeScript by [@fbbdev](https://github.com/fbbdev) in [#4100](https://github.com/wailsapp/wails/pull/4100) +- The runtime initialises as soon as it is imported, no need to wait for the window to load by [@fbbdev](https://github.com/fbbdev) in [#4100](https://github.com/wailsapp/wails/pull/4100) +- The runtime does not export an init method anymore. A side-effects import can be used to initialise it by [@fbbdev](https://github.com/fbbdev) in [#4100](https://github.com/wailsapp/wails/pull/4100) - Bound methods now return a `CancellablePromise` that rejects with a `CancelError` if cancelled. The actual result of the call is discarded by [@fbbdev](https://github.com/fbbdev) in [#4100](https://github.com/wailsapp/wails/pull/4100) ## v3.0.0-alpha.9 - 2025-01-13 From 5b2c8eba80405ff39d190b656cd51da338f4a9ab Mon Sep 17 00:00:00 2001 From: Fabio Massaioli Date: Tue, 25 Feb 2025 17:53:18 +0100 Subject: [PATCH 065/374] Remove Promise monkey-patching --- .../desktop/@wailsio/runtime/src/cancellable.ts | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/cancellable.ts b/v3/internal/runtime/desktop/@wailsio/runtime/src/cancellable.ts index acc8236aa..5a839e211 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/src/cancellable.ts +++ b/v3/internal/runtime/desktop/@wailsio/runtime/src/cancellable.ts @@ -386,7 +386,7 @@ export class CancellablePromise extends Promise implements PromiseLike, this[barrierSym] = barrier; return new CancellablePromise((resolve, reject) => { - void promiseThen.call(this, + void super.then( (value) => { if (this[barrierSym] === barrier) { this[barrierSym] = null; } barrier.resolve?.(); @@ -717,7 +717,7 @@ function cancellerFor(promise: CancellablePromiseWithResolvers, state: Can // In theory, a sane underlying implementation at this point // should always reject with our cancellation reason, // hence the handler will never throw. - void promiseThen.call(promise.promise, undefined, (err) => { + void Promise.prototype.then.call(promise.promise, undefined, (err) => { if (err !== reason) { throw err; } @@ -920,16 +920,6 @@ function currentBarrier(promise: CancellablePromise): Promise { return pwr.promise!; } -// Stop sneaky people from breaking the barrier mechanism. -const promiseThen = Promise.prototype.then; -Promise.prototype.then = function(...args) { - if (this instanceof CancellablePromise) { - return this.then(...args); - } else { - return Reflect.apply(promiseThen, this, args); - } -} - // Polyfill Promise.withResolvers. let promiseWithResolvers = Promise.withResolvers; if (promiseWithResolvers && typeof promiseWithResolvers === 'function') { From af635f02c67627c81837d82172da2b943536cdaa Mon Sep 17 00:00:00 2001 From: Fabio Massaioli Date: Tue, 25 Feb 2025 17:59:17 +0100 Subject: [PATCH 066/374] Refactor event target resolution logic --- .../@wailsio/runtime/src/contextmenu.ts | 90 ++++++++----------- .../desktop/@wailsio/runtime/src/drag.ts | 12 +-- .../desktop/@wailsio/runtime/src/utils.ts | 13 +++ 3 files changed, 50 insertions(+), 65 deletions(-) diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/contextmenu.ts b/v3/internal/runtime/desktop/@wailsio/runtime/src/contextmenu.ts index 50ab188f2..5f15bf237 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/src/contextmenu.ts +++ b/v3/internal/runtime/desktop/@wailsio/runtime/src/contextmenu.ts @@ -10,6 +10,7 @@ The electron alternative for Go import { newRuntimeCaller, objectNames } from "./runtime.js"; import { IsDebug } from "./system.js"; +import { eventTarget } from "./utils"; // setup window.addEventListener('contextmenu', contextMenuHandler); @@ -23,27 +24,18 @@ function openContextMenu(id: string, x: number, y: number, data: any): void { } function contextMenuHandler(event: MouseEvent) { - let target: HTMLElement; - - if (event.target instanceof HTMLElement) { - target = event.target; - } else if (!(event.target instanceof HTMLElement) && event.target instanceof Node) { - target = event.target.parentElement ?? document.body; - } else { - target = document.body; - } + const target = eventTarget(event); // Check for custom context menu - let customContextMenu = window.getComputedStyle(target).getPropertyValue("--custom-contextmenu").trim(); + const customContextMenu = window.getComputedStyle(target).getPropertyValue("--custom-contextmenu").trim(); if (customContextMenu) { event.preventDefault(); - let data = window.getComputedStyle(target).getPropertyValue("--custom-contextmenu-data"); + const data = window.getComputedStyle(target).getPropertyValue("--custom-contextmenu-data"); openContextMenu(customContextMenu, event.clientX, event.clientY, data); - return + } else { + processDefaultContextMenu(event, target); } - - processDefaultContextMenu(event); } @@ -54,61 +46,49 @@ function contextMenuHandler(event: MouseEvent) { This rule is inherited like normal CSS rules, so nesting works as expected */ -function processDefaultContextMenu(event: MouseEvent) { +function processDefaultContextMenu(event: MouseEvent, target: HTMLElement) { // Debug builds always show the menu if (IsDebug()) { return; } - let target: HTMLElement; - - if (event.target instanceof HTMLElement) { - target = event.target; - } else if (!(event.target instanceof HTMLElement) && event.target instanceof Node) { - target = event.target.parentElement ?? document.body; - } else { - target = document.body; - } - // Process default context menu switch (window.getComputedStyle(target).getPropertyValue("--default-contextmenu").trim()) { - case "show": + case 'show': return; - - case "hide": + case 'hide': event.preventDefault(); return; + } - default: - // Check if contentEditable is true - if (target.isContentEditable) { - return; - } + // Check if contentEditable is true + if (target.isContentEditable) { + return; + } - // Check if text has been selected - const selection = window.getSelection(); - const hasSelection = selection && selection.toString().length > 0; - if (hasSelection) { - for (let i = 0; i < selection.rangeCount; i++) { - const range = selection.getRangeAt(i); - const rects = range.getClientRects(); - for (let j = 0; j < rects.length; j++) { - const rect = rects[j]; - if (document.elementFromPoint(rect.left, rect.top) === target) { - return; - } - } - } - } - - // Check if tag is input or textarea. - if (target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement) { - if (hasSelection || (!target.readOnly && !target.disabled)) { + // Check if text has been selected + const selection = window.getSelection(); + const hasSelection = selection && selection.toString().length > 0; + if (hasSelection) { + for (let i = 0; i < selection.rangeCount; i++) { + const range = selection.getRangeAt(i); + const rects = range.getClientRects(); + for (let j = 0; j < rects.length; j++) { + const rect = rects[j]; + if (document.elementFromPoint(rect.left, rect.top) === target) { return; } } - - // hide default context menu - event.preventDefault(); + } } + + // Check if tag is input or textarea. + if (target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement) { + if (hasSelection || (!target.readOnly && !target.disabled)) { + return; + } + } + + // hide default context menu + event.preventDefault(); } diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/drag.ts b/v3/internal/runtime/desktop/@wailsio/runtime/src/drag.ts index 6b1280c2e..919c03c2c 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/src/drag.ts +++ b/v3/internal/runtime/desktop/@wailsio/runtime/src/drag.ts @@ -10,7 +10,7 @@ The electron alternative for Go import { invoke, IsWindows } from "./system.js"; import { GetFlag } from "./flags.js"; -import { canTrackButtons } from "./utils.js"; +import { canTrackButtons, eventTarget } from "./utils.js"; // Setup let canDrag = false; @@ -134,15 +134,7 @@ function primaryDown(event: MouseEvent): void { } // Retrieve target element - let target: HTMLElement; - - if (event.target instanceof HTMLElement) { - target = event.target; - } else if (!(event.target instanceof HTMLElement) && event.target instanceof Node) { - target = event.target.parentElement ?? document.body; - } else { - target = document.body; - } + const target = eventTarget(event); // Ready to drag if the primary button was pressed for the first time on a draggable element. // Ignore clicks on the scrollbar. diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/utils.ts b/v3/internal/runtime/desktop/@wailsio/runtime/src/utils.ts index 2562d2fb6..35b09463b 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/src/utils.ts +++ b/v3/internal/runtime/desktop/@wailsio/runtime/src/utils.ts @@ -49,6 +49,19 @@ export function canAbortListeners() { return result; } +/** + * Resolves the closest HTMLElement ancestor of an event's target. + */ +export function eventTarget(event: Event): HTMLElement { + if (event.target instanceof HTMLElement) { + return event.target; + } else if (!(event.target instanceof HTMLElement) && event.target instanceof Node) { + return event.target.parentElement ?? document.body; + } else { + return document.body; + } +} + /*** This technique for proper load detection is taken from HTMX: From ea98bd2e19bd0c8647bcfab6b10247f89d0a72d9 Mon Sep 17 00:00:00 2001 From: Fabio Massaioli Date: Tue, 25 Feb 2025 18:01:36 +0100 Subject: [PATCH 067/374] Rename copied files --- v3/examples/cancel-async/{GreetService.go => service.go} | 0 v3/examples/cancel-chaining/{GreetService.go => service.go} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename v3/examples/cancel-async/{GreetService.go => service.go} (100%) rename v3/examples/cancel-chaining/{GreetService.go => service.go} (100%) diff --git a/v3/examples/cancel-async/GreetService.go b/v3/examples/cancel-async/service.go similarity index 100% rename from v3/examples/cancel-async/GreetService.go rename to v3/examples/cancel-async/service.go diff --git a/v3/examples/cancel-chaining/GreetService.go b/v3/examples/cancel-chaining/service.go similarity index 100% rename from v3/examples/cancel-chaining/GreetService.go rename to v3/examples/cancel-chaining/service.go From d74ed5ab54072cf2a9d30e79237f96b1c6f787d5 Mon Sep 17 00:00:00 2001 From: Fabio Massaioli Date: Tue, 25 Feb 2025 18:09:53 +0100 Subject: [PATCH 068/374] Nitpicks --- v3/internal/runtime/desktop/@wailsio/runtime/src/calls.ts | 2 +- .../runtime/desktop/@wailsio/runtime/src/promises_aplus.test.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/calls.ts b/v3/internal/runtime/desktop/@wailsio/runtime/src/calls.ts index fce698bf4..11d063323 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/src/calls.ts +++ b/v3/internal/runtime/desktop/@wailsio/runtime/src/calls.ts @@ -193,7 +193,7 @@ export function Call(options: CallOptions): CancellablePromise { const cancel = () => { callResponses.delete(id); return cancelCall(CancelMethod, {"call-id": id}).catch((err) => { - console.log("Error while requesting binding call cancellation:", err); + console.error("Error while requesting binding call cancellation:", err); }); }; diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/promises_aplus.test.js b/v3/internal/runtime/desktop/@wailsio/runtime/src/promises_aplus.test.js index e4806b6e0..baf51e3c0 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/src/promises_aplus.test.js +++ b/v3/internal/runtime/desktop/@wailsio/runtime/src/promises_aplus.test.js @@ -21,7 +21,7 @@ process.on('unhandledRejection', function (reason, promise) { global.context = global.describe = V.describe; global.specify = global.it = function it(desc, fn) { let viTestFn = fn; - if (fn && fn.length) { + if (fn?.length) { viTestFn = () => new Promise((done) => fn(done)); } V.it(desc, viTestFn); From 135defc40573570ec2d62d338f1783e341089932 Mon Sep 17 00:00:00 2001 From: popaprozac Date: Tue, 25 Feb 2025 09:11:12 -0800 Subject: [PATCH 069/374] init test linux --- .../services/notifications/notifications.go | 4 +- .../notifications/notifications_darwin.go | 1 - .../notifications/notifications_linux.go | 216 ++++++++++++++++-- .../notifications/notifications_windows.go | 1 - 4 files changed, 204 insertions(+), 18 deletions(-) diff --git a/v3/pkg/services/notifications/notifications.go b/v3/pkg/services/notifications/notifications.go index c53f77ba3..1a3102a08 100644 --- a/v3/pkg/services/notifications/notifications.go +++ b/v3/pkg/services/notifications/notifications.go @@ -2,10 +2,12 @@ package notifications // Service represents the notifications service type Service struct { - // responseCallback is called when a notification response is received + // Callback is called when a notification response is received Callback func(response NotificationResponse) } +var NotificationService *Service + // NotificationAction represents an action button for a notification type NotificationAction = struct { ID string `json:"id,omitempty"` diff --git a/v3/pkg/services/notifications/notifications_darwin.go b/v3/pkg/services/notifications/notifications_darwin.go index 2197e6741..f001d6fde 100644 --- a/v3/pkg/services/notifications/notifications_darwin.go +++ b/v3/pkg/services/notifications/notifications_darwin.go @@ -17,7 +17,6 @@ import ( "github.com/wailsapp/wails/v3/pkg/application" ) -var NotificationService *Service var AppleDefaultActionIdentifier = "com.apple.UNNotificationDefaultActionIdentifier" // Creates a new Notifications Service. diff --git a/v3/pkg/services/notifications/notifications_linux.go b/v3/pkg/services/notifications/notifications_linux.go index b499d4788..0248b8bcd 100644 --- a/v3/pkg/services/notifications/notifications_linux.go +++ b/v3/pkg/services/notifications/notifications_linux.go @@ -4,12 +4,19 @@ package notifications import ( "context" + "encoding/json" + "fmt" + "os" + "path/filepath" + "sync" "git.sr.ht/~whereswaldon/shout" + "github.com/godbus/dbus/v5" "github.com/wailsapp/wails/v3/pkg/application" ) -var NotificationService *Service +var NotificationLock sync.RWMutex +var NotificationCategories = make(map[string]NotificationCategory) var Notifier shout.Notifier // Creates a new Notifications Service. @@ -22,12 +29,66 @@ func New() *Service { // ServiceStartup is called when the service is loaded func (ns *Service) ServiceStartup(ctx context.Context, options application.ServiceOptions) error { + if err := loadCategories(); err != nil { + fmt.Printf("Failed to load notification categories: %v\n", err) + } + + conn, err := dbus.SessionBus() + if err != nil { + return fmt.Errorf("failed to connect to D-Bus session bus: %v", err) + } + + appName := "Wails Application" + + var iconPath string + + Notifier, err = shout.NewNotifier(conn, appName, iconPath, func(notificationID, action string, platformData map[string]dbus.Variant, target, notifierResponse dbus.Variant, err error) { + if err != nil { + return + } + + response := NotificationResponse{ + ID: notificationID, + ActionIdentifier: action, + } + + if action == "default" { + response.ActionIdentifier = DefaultActionIdentifier + } + + if target.Signature().String() == "s" { + var targetStr string + if err := target.Store(&targetStr); err == nil { + // Try to parse as JSON + var userInfo map[string]interface{} + if err := json.Unmarshal([]byte(targetStr), &userInfo); err == nil { + response.UserInfo = userInfo + } + } + } + + if notifierResponse.Signature().String() == "s" { + var userText string + if err := notifierResponse.Store(&userText); err == nil { + response.UserText = userText + } + } + + if NotificationService != nil { + NotificationService.handleNotificationResponse(response) + } + }) + + if err != nil { + return fmt.Errorf("failed to create notifier: %v", err) + } + return nil } // ServiceShutdown is called when the service is unloaded func (ns *Service) ServiceShutdown() error { - return nil + return saveCategories() } // CheckBundleIdentifier is a Linux stub that always returns true. @@ -44,32 +105,87 @@ func (ns *Service) RequestUserNotificationAuthorization() (bool, error) { // CheckNotificationAuthorization is a Linux stub that always returns true. // (user authorization is macOS-specific) -func (ns *Service) CheckNotificationAuthorization() bool { - return true +func (ns *Service) CheckNotificationAuthorization() (bool, error) { + return true, nil } -// SendNotification sends a basic notification with a name, title, and body. All other options are ignored on Linux. -// (subtitle and category id are only available on macOS) +// SendNotification sends a basic notification with a unique identifier, title, subtitle, and body. func (ns *Service) SendNotification(options NotificationOptions) error { - return nil + notification := shout.Notification{ + Title: options.Title, + Body: options.Body, + Priority: shout.Normal, + DefaultAction: "default", + } + + if options.Data != nil { + jsonData, err := json.Marshal(options.Data) + if err == nil { + notification.DefaultActionTarget = dbus.MakeVariant(string(jsonData)) + } + } + + return Notifier.Send(options.ID, notification) } // SendNotificationWithActions sends a notification with additional actions and inputs. -// A NotificationCategory must be registered with RegisterNotificationCategory first. The `CategoryID` must match the registered category. -// If a NotificationCategory is not registered a basic notification will be sent. -// (subtitle and category id are only available on macOS) func (ns *Service) SendNotificationWithActions(options NotificationOptions) error { - return nil + NotificationLock.RLock() + category, exists := NotificationCategories[options.CategoryID] + NotificationLock.RUnlock() + + if !exists { + return ns.SendNotification(options) + } + + notification := shout.Notification{ + Title: options.Title, + Body: options.Body, + Priority: shout.Normal, + DefaultAction: "default", + } + + if options.Data != nil { + jsonData, err := json.Marshal(options.Data) + if err == nil { + notification.DefaultActionTarget = dbus.MakeVariant(string(jsonData)) + } + } + + for _, action := range category.Actions { + notification.Buttons = append(notification.Buttons, shout.Button{ + Label: action.Title, + Action: action.ID, + Target: "", // Will be set below if we have user data + }) + } + + if options.Data != nil { + jsonData, err := json.Marshal(options.Data) + if err == nil { + for i := range notification.Buttons { + notification.Buttons[i].Target = string(jsonData) + } + } + } + + return Notifier.Send(options.ID, notification) } // RegisterNotificationCategory registers a new NotificationCategory to be used with SendNotificationWithActions. func (ns *Service) RegisterNotificationCategory(category NotificationCategory) error { - return nil + NotificationLock.Lock() + NotificationCategories[category.ID] = category + NotificationLock.Unlock() + return saveCategories() } // RemoveNotificationCategory removes a previously registered NotificationCategory. func (ns *Service) RemoveNotificationCategory(categoryId string) error { - return nil + NotificationLock.Lock() + delete(NotificationCategories, categoryId) + NotificationLock.Unlock() + return saveCategories() } // RemoveAllPendingNotifications is a Linux stub that always returns nil. @@ -96,8 +212,78 @@ func (ns *Service) RemoveDeliveredNotification(_ string) error { return nil } -// RemoveNotification removes a pending notification matching the unique identifier. -// (Linux-specific) +// RemoveNotification removes a notification by ID (Linux-specific) func (ns *Service) RemoveNotification(identifier string) error { + return Notifier.Remove(identifier) +} + +// getConfigFilePath returns the path to the configuration file for storing notification categories +func getConfigFilePath() (string, error) { + configDir, err := os.UserConfigDir() + if err != nil { + return "", fmt.Errorf("failed to get user config directory: %v", err) + } + + appName := "Wails Application" + + appConfigDir := filepath.Join(configDir, appName) + if err := os.MkdirAll(appConfigDir, 0755); err != nil { + return "", fmt.Errorf("failed to create config directory: %v", err) + } + + return filepath.Join(appConfigDir, "notification-categories.json"), nil +} + +// saveCategories saves the notification categories to a file. +func saveCategories() error { + filePath, err := getConfigFilePath() + if err != nil { + return err + } + + NotificationLock.RLock() + data, err := json.Marshal(NotificationCategories) + NotificationLock.RUnlock() + + if err != nil { + return fmt.Errorf("failed to marshal notification categories: %v", err) + } + + if err := os.WriteFile(filePath, data, 0644); err != nil { + return fmt.Errorf("failed to write notification categories to file: %v", err) + } + + return nil +} + +// loadCategories loads notification categories from a file. +func loadCategories() error { + filePath, err := getConfigFilePath() + if err != nil { + return err + } + + if _, err := os.Stat(filePath); os.IsNotExist(err) { + return nil + } + + data, err := os.ReadFile(filePath) + if err != nil { + return fmt.Errorf("failed to read notification categories file: %v", err) + } + + if len(data) == 0 { + return nil + } + + categories := make(map[string]NotificationCategory) + if err := json.Unmarshal(data, &categories); err != nil { + return fmt.Errorf("failed to unmarshal notification categories: %v", err) + } + + NotificationLock.Lock() + NotificationCategories = categories + NotificationLock.Unlock() + return nil } diff --git a/v3/pkg/services/notifications/notifications_windows.go b/v3/pkg/services/notifications/notifications_windows.go index e0fc917aa..28d439f68 100644 --- a/v3/pkg/services/notifications/notifications_windows.go +++ b/v3/pkg/services/notifications/notifications_windows.go @@ -16,7 +16,6 @@ import ( "golang.org/x/sys/windows/registry" ) -var NotificationService *Service var NotificationLock sync.RWMutex var NotificationCategories = make(map[string]NotificationCategory) From 5cf89f362fb49d9a5bc5c387324cd4802f371126 Mon Sep 17 00:00:00 2001 From: Fabio Massaioli Date: Tue, 25 Feb 2025 18:30:52 +0100 Subject: [PATCH 070/374] Update bundled runtime --- .../bundledassets/runtime.debug.js | 178 +++++++++--------- .../assetserver/bundledassets/runtime.js | 2 +- 2 files changed, 88 insertions(+), 92 deletions(-) diff --git a/v3/internal/assetserver/bundledassets/runtime.debug.js b/v3/internal/assetserver/bundledassets/runtime.debug.js index 8a9aa1744..f4ecd5a5b 100644 --- a/v3/internal/assetserver/bundledassets/runtime.debug.js +++ b/v3/internal/assetserver/bundledassets/runtime.debug.js @@ -562,6 +562,16 @@ function canAbortListeners() { target.dispatchEvent(new CustomEvent("test")); return result; } +function eventTarget(event) { + var _a2; + if (event.target instanceof HTMLElement) { + return event.target; + } else if (!(event.target instanceof HTMLElement) && event.target instanceof Node) { + return (_a2 = event.target.parentElement) != null ? _a2 : document.body; + } else { + return document.body; + } +} var isReady = false; document.addEventListener("DOMContentLoaded", () => { isReady = true; @@ -1177,7 +1187,7 @@ var _invoke = function() { return null; }(); function invoke(msg) { - return _invoke == null ? void 0 : _invoke(msg); + _invoke == null ? void 0 : _invoke(msg); } function IsDarkMode() { return call4(SystemIsDarkMode); @@ -1225,68 +1235,50 @@ function openContextMenu(id, x, y, data) { void call5(ContextMenuOpen, { id, x, y, data }); } function contextMenuHandler(event) { - var _a2; - let target; - if (event.target instanceof HTMLElement) { - target = event.target; - } else if (!(event.target instanceof HTMLElement) && event.target instanceof Node) { - target = (_a2 = event.target.parentElement) != null ? _a2 : document.body; - } else { - target = document.body; - } - let customContextMenu = window.getComputedStyle(target).getPropertyValue("--custom-contextmenu").trim(); + const target = eventTarget(event); + const customContextMenu = window.getComputedStyle(target).getPropertyValue("--custom-contextmenu").trim(); if (customContextMenu) { event.preventDefault(); - let data = window.getComputedStyle(target).getPropertyValue("--custom-contextmenu-data"); + const data = window.getComputedStyle(target).getPropertyValue("--custom-contextmenu-data"); openContextMenu(customContextMenu, event.clientX, event.clientY, data); - return; + } else { + processDefaultContextMenu(event, target); } - processDefaultContextMenu(event); } -function processDefaultContextMenu(event) { - var _a2; +function processDefaultContextMenu(event, target) { if (IsDebug()) { return; } - let target; - if (event.target instanceof HTMLElement) { - target = event.target; - } else if (!(event.target instanceof HTMLElement) && event.target instanceof Node) { - target = (_a2 = event.target.parentElement) != null ? _a2 : document.body; - } else { - target = document.body; - } switch (window.getComputedStyle(target).getPropertyValue("--default-contextmenu").trim()) { case "show": return; case "hide": event.preventDefault(); return; - default: - if (target.isContentEditable) { - return; - } - const selection = window.getSelection(); - const hasSelection = selection && selection.toString().length > 0; - if (hasSelection) { - for (let i = 0; i < selection.rangeCount; i++) { - const range = selection.getRangeAt(i); - const rects = range.getClientRects(); - for (let j = 0; j < rects.length; j++) { - const rect = rects[j]; - if (document.elementFromPoint(rect.left, rect.top) === target) { - return; - } - } - } - } - if (target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement) { - if (hasSelection || !target.readOnly && !target.disabled) { + } + if (target.isContentEditable) { + return; + } + const selection = window.getSelection(); + const hasSelection = selection && selection.toString().length > 0; + if (hasSelection) { + for (let i = 0; i < selection.rangeCount; i++) { + const range = selection.getRangeAt(i); + const rects = range.getClientRects(); + for (let j = 0; j < rects.length; j++) { + const rect = rects[j]; + if (document.elementFromPoint(rect.left, rect.top) === target) { return; } } - event.preventDefault(); + } } + if (target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement) { + if (hasSelection || !target.readOnly && !target.disabled) { + return; + } + } + event.preventDefault(); } // desktop/@wailsio/runtime/src/flags.ts @@ -1382,7 +1374,6 @@ function update(event) { ; } function primaryDown(event) { - var _a2; canDrag = false; canResize = false; if (!IsWindows()) { @@ -1394,14 +1385,7 @@ function primaryDown(event) { canResize = true; return; } - let target; - if (event.target instanceof HTMLElement) { - target = event.target; - } else if (!(event.target instanceof HTMLElement) && event.target instanceof Node) { - target = (_a2 = event.target.parentElement) != null ? _a2 : document.body; - } else { - target = document.body; - } + const target = eventTarget(event); const style = window.getComputedStyle(target); canDrag = style.getPropertyValue("--wails-draggable").trim() === "drag" && (event.offsetX - parseFloat(style.paddingLeft) < target.clientWidth && event.offsetY - parseFloat(style.paddingTop) < target.clientHeight); } @@ -1792,7 +1776,7 @@ var CancellablePromise = class _CancellablePromise extends Promise { */ cancel(cause) { return new _CancellablePromise((resolve) => { - Promise.allSettled([ + Promise.all([ this[cancelImplSym](new CancelError("Promise cancelled.", { cause })), currentBarrier(this) ]).then(() => resolve(), () => resolve()); @@ -1876,8 +1860,7 @@ var CancellablePromise = class _CancellablePromise extends Promise { const barrier = {}; this[barrierSym] = barrier; return new _CancellablePromise((resolve, reject) => { - void promiseThen.call( - this, + void super.then( (value) => { var _a2; if (this[barrierSym] === barrier) { @@ -2004,27 +1987,31 @@ var CancellablePromise = class _CancellablePromise extends Promise { } static all(values) { let collected = Array.from(values); - return collected.length === 0 ? _CancellablePromise.resolve(collected) : new _CancellablePromise((resolve, reject) => { + const promise = collected.length === 0 ? _CancellablePromise.resolve(collected) : new _CancellablePromise((resolve, reject) => { void Promise.all(collected).then(resolve, reject); - }, allCanceller(collected)); + }, (cause) => cancelAll(promise, collected, cause)); + return promise; } static allSettled(values) { let collected = Array.from(values); - return collected.length === 0 ? _CancellablePromise.resolve(collected) : new _CancellablePromise((resolve, reject) => { + const promise = collected.length === 0 ? _CancellablePromise.resolve(collected) : new _CancellablePromise((resolve, reject) => { void Promise.allSettled(collected).then(resolve, reject); - }, allCanceller(collected)); + }, (cause) => cancelAll(promise, collected, cause)); + return promise; } static any(values) { let collected = Array.from(values); - return collected.length === 0 ? _CancellablePromise.resolve(collected) : new _CancellablePromise((resolve, reject) => { + const promise = collected.length === 0 ? _CancellablePromise.resolve(collected) : new _CancellablePromise((resolve, reject) => { void Promise.any(collected).then(resolve, reject); - }, allCanceller(collected)); + }, (cause) => cancelAll(promise, collected, cause)); + return promise; } static race(values) { let collected = Array.from(values); - return new _CancellablePromise((resolve, reject) => { + const promise = new _CancellablePromise((resolve, reject) => { void Promise.race(collected).then(resolve, reject); - }, allCanceller(collected)); + }, (cause) => cancelAll(promise, collected, cause)); + return promise; } /** * Creates a new cancelled CancellablePromise for the provided cause. @@ -2103,7 +2090,7 @@ function cancellerFor(promise, state) { state.settled = true; state.reason = reason; promise.reject(reason); - void promiseThen.call(promise.promise, void 0, (err) => { + void Promise.prototype.then.call(promise.promise, void 0, (err) => { if (err !== reason) { throw err; } @@ -2118,9 +2105,8 @@ function cancellerFor(promise, state) { } catch (err) { Promise.reject(new CancelledRejectionError(promise.promise, err, "Unhandled exception in oncancelled callback.")); } - }); - cancellationPromise.then(void 0, (reason2) => { - throw new CancelledRejectionError(promise.promise, reason2, "Unhandled rejection in oncancelled callback."); + }).catch((reason2) => { + Promise.reject(new CancelledRejectionError(promise.promise, reason2, "Unhandled rejection in oncancelled callback.")); }); promise.oncancelled = null; return cancellationPromise; @@ -2213,20 +2199,38 @@ function rejectorFor(promise, state) { } }; } -function allCanceller(values) { - return (cause) => { - for (const value of values) { - try { - if (callable_default(value.then)) { - let cancel = value.cancel; - if (callable_default(cancel)) { - Reflect.apply(cancel, value, [cause]); - } - } - } catch (e) { +function cancelAll(parent, values, cause) { + const results = []; + for (const value of values) { + let cancel; + try { + if (!callable_default(value.then)) { + continue; } + cancel = value.cancel; + if (!callable_default(cancel)) { + continue; + } + } catch (e) { + continue; } - }; + let result; + try { + result = Reflect.apply(cancel, value, [cause]); + } catch (err) { + Promise.reject(new CancelledRejectionError(parent, err, "Unhandled exception in cancel method.")); + continue; + } + if (!result) { + continue; + } + results.push( + (result instanceof Promise ? result : Promise.resolve(result)).catch((reason) => { + Promise.reject(new CancelledRejectionError(parent, reason, "Unhandled rejection in cancel method.")); + }) + ); + } + return Promise.all(results); } function identity(x) { return x; @@ -2263,14 +2267,6 @@ function currentBarrier(promise) { } return pwr.promise; } -var promiseThen = Promise.prototype.then; -Promise.prototype.then = function(...args) { - if (this instanceof CancellablePromise) { - return this.then(...args); - } else { - return Reflect.apply(promiseThen, this, args); - } -}; var promiseWithResolvers = Promise.withResolvers; if (promiseWithResolvers && typeof promiseWithResolvers === "function") { promiseWithResolvers = promiseWithResolvers.bind(Promise); @@ -2387,7 +2383,7 @@ function Call(options) { const cancel = () => { callResponses.delete(id); return cancelCall(CancelMethod, { "call-id": id }).catch((err) => { - console.log("Error while requesting binding call cancellation:", err); + console.error("Error while requesting binding call cancellation:", err); }); }; result.oncancelled = () => { @@ -2535,4 +2531,4 @@ export { wml_exports as WML, window_default as Window }; -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2luZGV4LnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy93bWwudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2Jyb3dzZXIudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL25hbm9pZC50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvcnVudGltZS50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvZGlhbG9ncy50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvZXZlbnRzLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9saXN0ZW5lci50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvZXZlbnRfdHlwZXMudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3V0aWxzLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy93aW5kb3cudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL2NvbXBpbGVkL21haW4uanMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3N5c3RlbS50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvY29udGV4dG1lbnUudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2ZsYWdzLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9kcmFnLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9hcHBsaWNhdGlvbi50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvY2FsbHMudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2NhbGxhYmxlLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9jYW5jZWxsYWJsZS50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvY2xpcGJvYXJkLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9jcmVhdGUudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3NjcmVlbnMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vLyBTZXR1cFxud2luZG93Ll93YWlscyA9IHdpbmRvdy5fd2FpbHMgfHwge307XG5cbmltcG9ydCBcIi4vY29udGV4dG1lbnUuanNcIjtcbmltcG9ydCBcIi4vZHJhZy5qc1wiO1xuXG4vLyBSZS1leHBvcnQgcHVibGljIEFQSVxuaW1wb3J0ICogYXMgQXBwbGljYXRpb24gZnJvbSBcIi4vYXBwbGljYXRpb24uanNcIjtcbmltcG9ydCAqIGFzIEJyb3dzZXIgZnJvbSBcIi4vYnJvd3Nlci5qc1wiO1xuaW1wb3J0ICogYXMgQ2FsbCBmcm9tIFwiLi9jYWxscy5qc1wiO1xuaW1wb3J0ICogYXMgQ2xpcGJvYXJkIGZyb20gXCIuL2NsaXBib2FyZC5qc1wiO1xuaW1wb3J0ICogYXMgQ3JlYXRlIGZyb20gXCIuL2NyZWF0ZS5qc1wiO1xuaW1wb3J0ICogYXMgRGlhbG9ncyBmcm9tIFwiLi9kaWFsb2dzLmpzXCI7XG5pbXBvcnQgKiBhcyBFdmVudHMgZnJvbSBcIi4vZXZlbnRzLmpzXCI7XG5pbXBvcnQgKiBhcyBGbGFncyBmcm9tIFwiLi9mbGFncy5qc1wiO1xuaW1wb3J0ICogYXMgU2NyZWVucyBmcm9tIFwiLi9zY3JlZW5zLmpzXCI7XG5pbXBvcnQgKiBhcyBTeXN0ZW0gZnJvbSBcIi4vc3lzdGVtLmpzXCI7XG5pbXBvcnQgV2luZG93IGZyb20gXCIuL3dpbmRvdy5qc1wiO1xuaW1wb3J0ICogYXMgV01MIGZyb20gXCIuL3dtbC5qc1wiO1xuXG5leHBvcnQge1xuICAgIEFwcGxpY2F0aW9uLFxuICAgIEJyb3dzZXIsXG4gICAgQ2FsbCxcbiAgICBDbGlwYm9hcmQsXG4gICAgRGlhbG9ncyxcbiAgICBFdmVudHMsXG4gICAgRmxhZ3MsXG4gICAgU2NyZWVucyxcbiAgICBTeXN0ZW0sXG4gICAgV2luZG93LFxuICAgIFdNTFxufTtcblxuLyoqXG4gKiBBbiBpbnRlcm5hbCB1dGlsaXR5IGNvbnN1bWVkIGJ5IHRoZSBiaW5kaW5nIGdlbmVyYXRvci5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGlnbm9yZVxuICovXG5leHBvcnQgeyBDcmVhdGUgfTtcblxuZXhwb3J0ICogZnJvbSBcIi4vY2FuY2VsbGFibGUuanNcIjtcblxuLy8gTm90aWZ5IGJhY2tlbmRcbndpbmRvdy5fd2FpbHMuaW52b2tlID0gU3lzdGVtLmludm9rZTtcblN5c3RlbS5pbnZva2UoXCJ3YWlsczpydW50aW1lOnJlYWR5XCIpO1xuIiwgIi8qXG4gXyAgICAgX18gICAgIF8gX19cbnwgfCAgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5pbXBvcnQgeyBPcGVuVVJMIH0gZnJvbSBcIi4vYnJvd3Nlci5qc1wiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi9kaWFsb2dzLmpzXCI7XG5pbXBvcnQgeyBFbWl0LCBXYWlsc0V2ZW50IH0gZnJvbSBcIi4vZXZlbnRzLmpzXCI7XG5pbXBvcnQgeyBjYW5BYm9ydExpc3RlbmVycywgd2hlblJlYWR5IH0gZnJvbSBcIi4vdXRpbHMuanNcIjtcbmltcG9ydCBXaW5kb3cgZnJvbSBcIi4vd2luZG93LmpzXCI7XG5cbi8qKlxuICogU2VuZHMgYW4gZXZlbnQgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgb3B0aW9uYWwgZGF0YS5cbiAqXG4gKiBAcGFyYW0gZXZlbnROYW1lIC0gLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gc2VuZC5cbiAqIEBwYXJhbSBbZGF0YT1udWxsXSAtIC0gT3B0aW9uYWwgZGF0YSB0byBzZW5kIGFsb25nIHdpdGggdGhlIGV2ZW50LlxuICovXG5mdW5jdGlvbiBzZW5kRXZlbnQoZXZlbnROYW1lOiBzdHJpbmcsIGRhdGE6IGFueSA9IG51bGwpOiB2b2lkIHtcbiAgICBFbWl0KG5ldyBXYWlsc0V2ZW50KGV2ZW50TmFtZSwgZGF0YSkpO1xufVxuXG4vKipcbiAqIENhbGxzIGEgbWV0aG9kIG9uIGEgc3BlY2lmaWVkIHdpbmRvdy5cbiAqXG4gKiBAcGFyYW0gd2luZG93TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB3aW5kb3cgdG8gY2FsbCB0aGUgbWV0aG9kIG9uLlxuICogQHBhcmFtIG1ldGhvZE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgbWV0aG9kIHRvIGNhbGwuXG4gKi9cbmZ1bmN0aW9uIGNhbGxXaW5kb3dNZXRob2Qod2luZG93TmFtZTogc3RyaW5nLCBtZXRob2ROYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCB0YXJnZXRXaW5kb3cgPSBXaW5kb3cuR2V0KHdpbmRvd05hbWUpO1xuICAgIGNvbnN0IG1ldGhvZCA9ICh0YXJnZXRXaW5kb3cgYXMgYW55KVttZXRob2ROYW1lXTtcblxuICAgIGlmICh0eXBlb2YgbWV0aG9kICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgV2luZG93IG1ldGhvZCAnJHttZXRob2ROYW1lfScgbm90IGZvdW5kYCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgICBtZXRob2QuY2FsbCh0YXJnZXRXaW5kb3cpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgY2FsbGluZyB3aW5kb3cgbWV0aG9kICcke21ldGhvZE5hbWV9JzogYCwgZSk7XG4gICAgfVxufVxuXG4vKipcbiAqIFJlc3BvbmRzIHRvIGEgdHJpZ2dlcmluZyBldmVudCBieSBydW5uaW5nIGFwcHJvcHJpYXRlIFdNTCBhY3Rpb25zIGZvciB0aGUgY3VycmVudCB0YXJnZXQuXG4gKi9cbmZ1bmN0aW9uIG9uV01MVHJpZ2dlcmVkKGV2OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGVsZW1lbnQgPSBldi5jdXJyZW50VGFyZ2V0IGFzIEVsZW1lbnQ7XG5cbiAgICBmdW5jdGlvbiBydW5FZmZlY3QoY2hvaWNlID0gXCJZZXNcIikge1xuICAgICAgICBpZiAoY2hvaWNlICE9PSBcIlllc1wiKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGV2ZW50VHlwZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd3bWwtZXZlbnQnKSB8fCBlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS13bWwtZXZlbnQnKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0V2luZG93ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3dtbC10YXJnZXQtd2luZG93JykgfHwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtd21sLXRhcmdldC13aW5kb3cnKSB8fCBcIlwiO1xuICAgICAgICBjb25zdCB3aW5kb3dNZXRob2QgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnd21sLXdpbmRvdycpIHx8IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXdtbC13aW5kb3cnKTtcbiAgICAgICAgY29uc3QgdXJsID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3dtbC1vcGVudXJsJykgfHwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtd21sLW9wZW51cmwnKTtcblxuICAgICAgICBpZiAoZXZlbnRUeXBlICE9PSBudWxsKVxuICAgICAgICAgICAgc2VuZEV2ZW50KGV2ZW50VHlwZSk7XG4gICAgICAgIGlmICh3aW5kb3dNZXRob2QgIT09IG51bGwpXG4gICAgICAgICAgICBjYWxsV2luZG93TWV0aG9kKHRhcmdldFdpbmRvdywgd2luZG93TWV0aG9kKTtcbiAgICAgICAgaWYgKHVybCAhPT0gbnVsbClcbiAgICAgICAgICAgIHZvaWQgT3BlblVSTCh1cmwpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpcm0gPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnd21sLWNvbmZpcm0nKSB8fCBlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS13bWwtY29uZmlybScpO1xuXG4gICAgaWYgKGNvbmZpcm0pIHtcbiAgICAgICAgUXVlc3Rpb24oe1xuICAgICAgICAgICAgVGl0bGU6IFwiQ29uZmlybVwiLFxuICAgICAgICAgICAgTWVzc2FnZTogY29uZmlybSxcbiAgICAgICAgICAgIERldGFjaGVkOiBmYWxzZSxcbiAgICAgICAgICAgIEJ1dHRvbnM6IFtcbiAgICAgICAgICAgICAgICB7IExhYmVsOiBcIlllc1wiIH0sXG4gICAgICAgICAgICAgICAgeyBMYWJlbDogXCJOb1wiLCBJc0RlZmF1bHQ6IHRydWUgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9KS50aGVuKHJ1bkVmZmVjdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcnVuRWZmZWN0KCk7XG4gICAgfVxufVxuXG4vLyBQcml2YXRlIGZpZWxkIG5hbWVzLlxuY29uc3QgY29udHJvbGxlclN5bSA9IFN5bWJvbChcImNvbnRyb2xsZXJcIik7XG5jb25zdCB0cmlnZ2VyTWFwU3ltID0gU3ltYm9sKFwidHJpZ2dlck1hcFwiKTtcbmNvbnN0IGVsZW1lbnRDb3VudFN5bSA9IFN5bWJvbChcImVsZW1lbnRDb3VudFwiKTtcblxuLyoqXG4gKiBBYm9ydENvbnRyb2xsZXJSZWdpc3RyeSBkb2VzIG5vdCBhY3R1YWxseSByZW1lbWJlciBhY3RpdmUgZXZlbnQgbGlzdGVuZXJzOiBpbnN0ZWFkXG4gKiBpdCB0aWVzIHRoZW0gdG8gYW4gQWJvcnRTaWduYWwgYW5kIHVzZXMgYW4gQWJvcnRDb250cm9sbGVyIHRvIHJlbW92ZSB0aGVtIGFsbCBhdCBvbmNlLlxuICovXG5jbGFzcyBBYm9ydENvbnRyb2xsZXJSZWdpc3RyeSB7XG4gICAgLy8gUHJpdmF0ZSBmaWVsZHMuXG4gICAgW2NvbnRyb2xsZXJTeW1dOiBBYm9ydENvbnRyb2xsZXI7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpc1tjb250cm9sbGVyU3ltXSA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIG9wdGlvbnMgb2JqZWN0IGZvciBhZGRFdmVudExpc3RlbmVyIHRoYXQgdGllcyB0aGUgbGlzdGVuZXJcbiAgICAgKiB0byB0aGUgQWJvcnRTaWduYWwgZnJvbSB0aGUgY3VycmVudCBBYm9ydENvbnRyb2xsZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZWxlbWVudCAtIEFuIEhUTUwgZWxlbWVudFxuICAgICAqIEBwYXJhbSB0cmlnZ2VycyAtIFRoZSBsaXN0IG9mIGFjdGl2ZSBXTUwgdHJpZ2dlciBldmVudHMgZm9yIHRoZSBzcGVjaWZpZWQgZWxlbWVudHNcbiAgICAgKi9cbiAgICBzZXQoZWxlbWVudDogRWxlbWVudCwgdHJpZ2dlcnM6IHN0cmluZ1tdKTogQWRkRXZlbnRMaXN0ZW5lck9wdGlvbnMge1xuICAgICAgICByZXR1cm4geyBzaWduYWw6IHRoaXNbY29udHJvbGxlclN5bV0uc2lnbmFsIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwgcmVnaXN0ZXJlZCBldmVudCBsaXN0ZW5lcnMgYW5kIHJlc2V0cyB0aGUgcmVnaXN0cnkuXG4gICAgICovXG4gICAgcmVzZXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXNbY29udHJvbGxlclN5bV0uYWJvcnQoKTtcbiAgICAgICAgdGhpc1tjb250cm9sbGVyU3ltXSA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICB9XG59XG5cbi8qKlxuICogV2Vha01hcFJlZ2lzdHJ5IG1hcHMgYWN0aXZlIHRyaWdnZXIgZXZlbnRzIHRvIGVhY2ggRE9NIGVsZW1lbnQgdGhyb3VnaCBhIFdlYWtNYXAuXG4gKiBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgbWFwcGluZyByZW1haW5zIHByaXZhdGUgdG8gdGhpcyBtb2R1bGUsIHdoaWxlIHN0aWxsIGFsbG93aW5nIGdhcmJhZ2VcbiAqIGNvbGxlY3Rpb24gb2YgdGhlIGludm9sdmVkIGVsZW1lbnRzLlxuICovXG5jbGFzcyBXZWFrTWFwUmVnaXN0cnkge1xuICAgIC8qKiBTdG9yZXMgdGhlIGN1cnJlbnQgZWxlbWVudC10by10cmlnZ2VyIG1hcHBpbmcuICovXG4gICAgW3RyaWdnZXJNYXBTeW1dOiBXZWFrTWFwPEVsZW1lbnQsIHN0cmluZ1tdPjtcbiAgICAvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgd2l0aCBhY3RpdmUgV01MIHRyaWdnZXJzLiAqL1xuICAgIFtlbGVtZW50Q291bnRTeW1dOiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpc1t0cmlnZ2VyTWFwU3ltXSA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgIHRoaXNbZWxlbWVudENvdW50U3ltXSA9IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBhY3RpdmUgdHJpZ2dlcnMgZm9yIHRoZSBzcGVjaWZpZWQgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbGVtZW50IC0gQW4gSFRNTCBlbGVtZW50XG4gICAgICogQHBhcmFtIHRyaWdnZXJzIC0gVGhlIGxpc3Qgb2YgYWN0aXZlIFdNTCB0cmlnZ2VyIGV2ZW50cyBmb3IgdGhlIHNwZWNpZmllZCBlbGVtZW50XG4gICAgICovXG4gICAgc2V0KGVsZW1lbnQ6IEVsZW1lbnQsIHRyaWdnZXJzOiBzdHJpbmdbXSk6IEFkZEV2ZW50TGlzdGVuZXJPcHRpb25zIHtcbiAgICAgICAgaWYgKCF0aGlzW3RyaWdnZXJNYXBTeW1dLmhhcyhlbGVtZW50KSkgeyB0aGlzW2VsZW1lbnRDb3VudFN5bV0rKzsgfVxuICAgICAgICB0aGlzW3RyaWdnZXJNYXBTeW1dLnNldChlbGVtZW50LCB0cmlnZ2Vycyk7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCByZWdpc3RlcmVkIGV2ZW50IGxpc3RlbmVycy5cbiAgICAgKi9cbiAgICByZXNldCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXNbZWxlbWVudENvdW50U3ltXSA8PSAwKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBkb2N1bWVudC5ib2R5LnF1ZXJ5U2VsZWN0b3JBbGwoJyonKSkge1xuICAgICAgICAgICAgaWYgKHRoaXNbZWxlbWVudENvdW50U3ltXSA8PSAwKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjb25zdCB0cmlnZ2VycyA9IHRoaXNbdHJpZ2dlck1hcFN5bV0uZ2V0KGVsZW1lbnQpO1xuICAgICAgICAgICAgaWYgKHRyaWdnZXJzICE9IG51bGwpIHsgdGhpc1tlbGVtZW50Q291bnRTeW1dLS07IH1cblxuICAgICAgICAgICAgZm9yIChjb25zdCB0cmlnZ2VyIG9mIHRyaWdnZXJzIHx8IFtdKVxuICAgICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0cmlnZ2VyLCBvbldNTFRyaWdnZXJlZCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzW3RyaWdnZXJNYXBTeW1dID0gbmV3IFdlYWtNYXAoKTtcbiAgICAgICAgdGhpc1tlbGVtZW50Q291bnRTeW1dID0gMDtcbiAgICB9XG59XG5cbmNvbnN0IHRyaWdnZXJSZWdpc3RyeSA9IGNhbkFib3J0TGlzdGVuZXJzKCkgPyBuZXcgQWJvcnRDb250cm9sbGVyUmVnaXN0cnkoKSA6IG5ldyBXZWFrTWFwUmVnaXN0cnkoKTtcblxuLyoqXG4gKiBBZGRzIGV2ZW50IGxpc3RlbmVycyB0byB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuXG4gKi9cbmZ1bmN0aW9uIGFkZFdNTExpc3RlbmVycyhlbGVtZW50OiBFbGVtZW50KTogdm9pZCB7XG4gICAgY29uc3QgdHJpZ2dlclJlZ0V4cCA9IC9cXFMrL2c7XG4gICAgY29uc3QgdHJpZ2dlckF0dHIgPSAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3dtbC10cmlnZ2VyJykgfHwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtd21sLXRyaWdnZXInKSB8fCBcImNsaWNrXCIpO1xuICAgIGNvbnN0IHRyaWdnZXJzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgbGV0IG1hdGNoO1xuICAgIHdoaWxlICgobWF0Y2ggPSB0cmlnZ2VyUmVnRXhwLmV4ZWModHJpZ2dlckF0dHIpKSAhPT0gbnVsbClcbiAgICAgICAgdHJpZ2dlcnMucHVzaChtYXRjaFswXSk7XG5cbiAgICBjb25zdCBvcHRpb25zID0gdHJpZ2dlclJlZ2lzdHJ5LnNldChlbGVtZW50LCB0cmlnZ2Vycyk7XG4gICAgZm9yIChjb25zdCB0cmlnZ2VyIG9mIHRyaWdnZXJzKVxuICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIodHJpZ2dlciwgb25XTUxUcmlnZ2VyZWQsIG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIFNjaGVkdWxlcyBhbiBhdXRvbWF0aWMgcmVsb2FkIG9mIFdNTCB0byBiZSBwZXJmb3JtZWQgYXMgc29vbiBhcyB0aGUgZG9jdW1lbnQgaXMgZnVsbHkgbG9hZGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gRW5hYmxlKCk6IHZvaWQge1xuICAgIHdoZW5SZWFkeShSZWxvYWQpO1xufVxuXG4vKipcbiAqIFJlbG9hZHMgdGhlIFdNTCBwYWdlIGJ5IGFkZGluZyBuZWNlc3NhcnkgZXZlbnQgbGlzdGVuZXJzIGFuZCBicm93c2VyIGxpc3RlbmVycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFJlbG9hZCgpOiB2b2lkIHtcbiAgICB0cmlnZ2VyUmVnaXN0cnkucmVzZXQoKTtcbiAgICBkb2N1bWVudC5ib2R5LnF1ZXJ5U2VsZWN0b3JBbGwoJ1t3bWwtZXZlbnRdLCBbd21sLXdpbmRvd10sIFt3bWwtb3BlbnVybF0sIFtkYXRhLXdtbC1ldmVudF0sIFtkYXRhLXdtbC13aW5kb3ddLCBbZGF0YS13bWwtb3BlbnVybF0nKS5mb3JFYWNoKGFkZFdNTExpc3RlbmVycyk7XG59XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbmltcG9ydCB7IG5ld1J1bnRpbWVDYWxsZXIsIG9iamVjdE5hbWVzIH0gZnJvbSBcIi4vcnVudGltZS5qc1wiO1xuXG5jb25zdCBjYWxsID0gbmV3UnVudGltZUNhbGxlcihvYmplY3ROYW1lcy5Ccm93c2VyKTtcblxuY29uc3QgQnJvd3Nlck9wZW5VUkwgPSAwO1xuXG4vKipcbiAqIE9wZW4gYSBicm93c2VyIHdpbmRvdyB0byB0aGUgZ2l2ZW4gVVJMLlxuICpcbiAqIEBwYXJhbSB1cmwgLSBUaGUgVVJMIHRvIG9wZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE9wZW5VUkwodXJsOiBzdHJpbmcgfCBVUkwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gY2FsbChCcm93c2VyT3BlblVSTCwge3VybDogdXJsLnRvU3RyaW5nKCl9KTtcbn1cbiIsICIvLyBTb3VyY2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9haS9uYW5vaWRcblxuLy8gVGhlIE1JVCBMaWNlbnNlIChNSVQpXG4vL1xuLy8gQ29weXJpZ2h0IDIwMTcgQW5kcmV5IFNpdG5payA8YW5kcmV5QHNpdG5pay5ydT5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mXG4vLyB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluXG4vLyB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvXG4vLyB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZlxuLy8gdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLFxuLy8gICAgIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vICAgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbi8vIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gICAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTXG4vLyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1Jcbi8vIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUlxuLy8gSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU5cbi8vIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIFRoaXMgYWxwaGFiZXQgdXNlcyBgQS1aYS16MC05Xy1gIHN5bWJvbHMuXG4vLyBUaGUgb3JkZXIgb2YgY2hhcmFjdGVycyBpcyBvcHRpbWl6ZWQgZm9yIGJldHRlciBnemlwIGFuZCBicm90bGkgY29tcHJlc3Npb24uXG4vLyBSZWZlcmVuY2VzIHRvIHRoZSBzYW1lIGZpbGUgKHdvcmtzIGJvdGggZm9yIGd6aXAgYW5kIGJyb3RsaSk6XG4vLyBgJ3VzZWAsIGBhbmRvbWAsIGFuZCBgcmljdCdgXG4vLyBSZWZlcmVuY2VzIHRvIHRoZSBicm90bGkgZGVmYXVsdCBkaWN0aW9uYXJ5OlxuLy8gYC0yNlRgLCBgMTk4M2AsIGA0MHB4YCwgYDc1cHhgLCBgYnVzaGAsIGBqYWNrYCwgYG1pbmRgLCBgdmVyeWAsIGFuZCBgd29sZmBcbmNvbnN0IHVybEFscGhhYmV0ID1cbiAgICAndXNlYW5kb20tMjZUMTk4MzQwUFg3NXB4SkFDS1ZFUllNSU5EQlVTSFdPTEZfR1FaYmZnaGprbHF2d3l6cmljdCdcblxuZXhwb3J0IGZ1bmN0aW9uIG5hbm9pZChzaXplOiBudW1iZXIgPSAyMSk6IHN0cmluZyB7XG4gICAgbGV0IGlkID0gJydcbiAgICAvLyBBIGNvbXBhY3QgYWx0ZXJuYXRpdmUgZm9yIGBmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXA7IGkrKylgLlxuICAgIGxldCBpID0gc2l6ZSB8IDBcbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgIC8vIGB8IDBgIGlzIG1vcmUgY29tcGFjdCBhbmQgZmFzdGVyIHRoYW4gYE1hdGguZmxvb3IoKWAuXG4gICAgICAgIGlkICs9IHVybEFscGhhYmV0WyhNYXRoLnJhbmRvbSgpICogNjQpIHwgMF1cbiAgICB9XG4gICAgcmV0dXJuIGlkXG59XG4iLCAiLypcbiBfICAgICBfXyAgICAgXyBfX1xufCB8ICAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbmltcG9ydCB7IG5hbm9pZCB9IGZyb20gJy4vbmFub2lkLmpzJztcblxuY29uc3QgcnVudGltZVVSTCA9IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4gKyBcIi93YWlscy9ydW50aW1lXCI7XG5cbi8vIE9iamVjdCBOYW1lc1xuZXhwb3J0IGNvbnN0IG9iamVjdE5hbWVzID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgQ2FsbDogMCxcbiAgICBDbGlwYm9hcmQ6IDEsXG4gICAgQXBwbGljYXRpb246IDIsXG4gICAgRXZlbnRzOiAzLFxuICAgIENvbnRleHRNZW51OiA0LFxuICAgIERpYWxvZzogNSxcbiAgICBXaW5kb3c6IDYsXG4gICAgU2NyZWVuczogNyxcbiAgICBTeXN0ZW06IDgsXG4gICAgQnJvd3NlcjogOSxcbiAgICBDYW5jZWxDYWxsOiAxMCxcbn0pO1xuZXhwb3J0IGxldCBjbGllbnRJZCA9IG5hbm9pZCgpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgcnVudGltZSBjYWxsZXIgd2l0aCBzcGVjaWZpZWQgSUQuXG4gKlxuICogQHBhcmFtIG9iamVjdCAtIFRoZSBvYmplY3QgdG8gaW52b2tlIHRoZSBtZXRob2Qgb24uXG4gKiBAcGFyYW0gd2luZG93TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB3aW5kb3cuXG4gKiBAcmV0dXJuIFRoZSBuZXcgcnVudGltZSBjYWxsZXIgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuZXdSdW50aW1lQ2FsbGVyKG9iamVjdDogbnVtYmVyLCB3aW5kb3dOYW1lOiBzdHJpbmcgPSAnJykge1xuICAgIHJldHVybiBmdW5jdGlvbiAobWV0aG9kOiBudW1iZXIsIGFyZ3M6IGFueSA9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHJ1bnRpbWVDYWxsV2l0aElEKG9iamVjdCwgbWV0aG9kLCB3aW5kb3dOYW1lLCBhcmdzKTtcbiAgICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW50aW1lQ2FsbFdpdGhJRChvYmplY3RJRDogbnVtYmVyLCBtZXRob2Q6IG51bWJlciwgd2luZG93TmFtZTogc3RyaW5nLCBhcmdzOiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgIGxldCB1cmwgPSBuZXcgVVJMKHJ1bnRpbWVVUkwpO1xuICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKFwib2JqZWN0XCIsIG9iamVjdElELnRvU3RyaW5nKCkpO1xuICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKFwibWV0aG9kXCIsIG1ldGhvZC50b1N0cmluZygpKTtcbiAgICBpZiAoYXJncykgeyB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChcImFyZ3NcIiwgSlNPTi5zdHJpbmdpZnkoYXJncykpOyB9XG5cbiAgICBsZXQgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgW1wieC13YWlscy1jbGllbnQtaWRcIl06IGNsaWVudElkXG4gICAgfVxuICAgIGlmICh3aW5kb3dOYW1lKSB7XG4gICAgICAgIGhlYWRlcnNbXCJ4LXdhaWxzLXdpbmRvdy1uYW1lXCJdID0gd2luZG93TmFtZTtcbiAgICB9XG5cbiAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHsgaGVhZGVycyB9KTtcbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihhd2FpdCByZXNwb25zZS50ZXh0KCkpO1xuICAgIH1cblxuICAgIGlmICgocmVzcG9uc2UuaGVhZGVycy5nZXQoXCJDb250ZW50LVR5cGVcIik/LmluZGV4T2YoXCJhcHBsaWNhdGlvbi9qc29uXCIpID8/IC0xKSAhPT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcmVzcG9uc2UudGV4dCgpO1xuICAgIH1cbn1cbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuaW1wb3J0IHtuZXdSdW50aW1lQ2FsbGVyLCBvYmplY3ROYW1lc30gZnJvbSBcIi4vcnVudGltZS5qc1wiO1xuaW1wb3J0IHsgbmFub2lkIH0gZnJvbSAnLi9uYW5vaWQuanMnO1xuXG4vLyBzZXR1cFxud2luZG93Ll93YWlscyA9IHdpbmRvdy5fd2FpbHMgfHwge307XG53aW5kb3cuX3dhaWxzLmRpYWxvZ0Vycm9yQ2FsbGJhY2sgPSBkaWFsb2dFcnJvckNhbGxiYWNrO1xud2luZG93Ll93YWlscy5kaWFsb2dSZXN1bHRDYWxsYmFjayA9IGRpYWxvZ1Jlc3VsdENhbGxiYWNrO1xuXG50eXBlIFByb21pc2VSZXNvbHZlcnMgPSBPbWl0PFByb21pc2VXaXRoUmVzb2x2ZXJzPGFueT4sIFwicHJvbWlzZVwiPjtcblxuY29uc3QgY2FsbCA9IG5ld1J1bnRpbWVDYWxsZXIob2JqZWN0TmFtZXMuRGlhbG9nKTtcbmNvbnN0IGRpYWxvZ1Jlc3BvbnNlcyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlUmVzb2x2ZXJzPigpO1xuXG4vLyBEZWZpbmUgY29uc3RhbnRzIGZyb20gdGhlIGBtZXRob2RzYCBvYmplY3QgaW4gVGl0bGUgQ2FzZVxuY29uc3QgRGlhbG9nSW5mbyA9IDA7XG5jb25zdCBEaWFsb2dXYXJuaW5nID0gMTtcbmNvbnN0IERpYWxvZ0Vycm9yID0gMjtcbmNvbnN0IERpYWxvZ1F1ZXN0aW9uID0gMztcbmNvbnN0IERpYWxvZ09wZW5GaWxlID0gNDtcbmNvbnN0IERpYWxvZ1NhdmVGaWxlID0gNTtcblxuZXhwb3J0IGludGVyZmFjZSBPcGVuRmlsZURpYWxvZ09wdGlvbnMge1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgZGlyZWN0b3JpZXMgY2FuIGJlIGNob3Nlbi4gKi9cbiAgICBDYW5DaG9vc2VEaXJlY3Rvcmllcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBmaWxlcyBjYW4gYmUgY2hvc2VuLiAqL1xuICAgIENhbkNob29zZUZpbGVzPzogYm9vbGVhbjtcbiAgICAvKiogSW5kaWNhdGVzIGlmIGRpcmVjdG9yaWVzIGNhbiBiZSBjcmVhdGVkLiAqL1xuICAgIENhbkNyZWF0ZURpcmVjdG9yaWVzPzogYm9vbGVhbjtcbiAgICAvKiogSW5kaWNhdGVzIGlmIGhpZGRlbiBmaWxlcyBzaG91bGQgYmUgc2hvd24uICovXG4gICAgU2hvd0hpZGRlbkZpbGVzPzogYm9vbGVhbjtcbiAgICAvKiogSW5kaWNhdGVzIGlmIGFsaWFzZXMgc2hvdWxkIGJlIHJlc29sdmVkLiAqL1xuICAgIFJlc29sdmVzQWxpYXNlcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBtdWx0aXBsZSBzZWxlY3Rpb24gaXMgYWxsb3dlZC4gKi9cbiAgICBBbGxvd3NNdWx0aXBsZVNlbGVjdGlvbj86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiB0aGUgZXh0ZW5zaW9uIHNob3VsZCBiZSBoaWRkZW4uICovXG4gICAgSGlkZUV4dGVuc2lvbj86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBoaWRkZW4gZXh0ZW5zaW9ucyBjYW4gYmUgc2VsZWN0ZWQuICovXG4gICAgQ2FuU2VsZWN0SGlkZGVuRXh0ZW5zaW9uPzogYm9vbGVhbjtcbiAgICAvKiogSW5kaWNhdGVzIGlmIGZpbGUgcGFja2FnZXMgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgZGlyZWN0b3JpZXMuICovXG4gICAgVHJlYXRzRmlsZVBhY2thZ2VzQXNEaXJlY3Rvcmllcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBvdGhlciBmaWxlIHR5cGVzIGFyZSBhbGxvd2VkLiAqL1xuICAgIEFsbG93c090aGVyRmlsZXR5cGVzPzogYm9vbGVhbjtcbiAgICAvKiogQXJyYXkgb2YgZmlsZSBmaWx0ZXJzLiAqL1xuICAgIEZpbHRlcnM/OiBGaWxlRmlsdGVyW107XG4gICAgLyoqIFRpdGxlIG9mIHRoZSBkaWFsb2cuICovXG4gICAgVGl0bGU/OiBzdHJpbmc7XG4gICAgLyoqIE1lc3NhZ2UgdG8gc2hvdyBpbiB0aGUgZGlhbG9nLiAqL1xuICAgIE1lc3NhZ2U/OiBzdHJpbmc7XG4gICAgLyoqIFRleHQgdG8gZGlzcGxheSBvbiB0aGUgYnV0dG9uLiAqL1xuICAgIEJ1dHRvblRleHQ/OiBzdHJpbmc7XG4gICAgLyoqIERpcmVjdG9yeSB0byBvcGVuIGluIHRoZSBkaWFsb2cuICovXG4gICAgRGlyZWN0b3J5Pzogc3RyaW5nO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgdGhlIGRpYWxvZyBzaG91bGQgYXBwZWFyIGRldGFjaGVkIGZyb20gdGhlIG1haW4gd2luZG93LiAqL1xuICAgIERldGFjaGVkPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTYXZlRmlsZURpYWxvZ09wdGlvbnMge1xuICAgIC8qKiBEZWZhdWx0IGZpbGVuYW1lIHRvIHVzZSBpbiB0aGUgZGlhbG9nLiAqL1xuICAgIEZpbGVuYW1lPzogc3RyaW5nO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgZGlyZWN0b3JpZXMgY2FuIGJlIGNob3Nlbi4gKi9cbiAgICBDYW5DaG9vc2VEaXJlY3Rvcmllcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBmaWxlcyBjYW4gYmUgY2hvc2VuLiAqL1xuICAgIENhbkNob29zZUZpbGVzPzogYm9vbGVhbjtcbiAgICAvKiogSW5kaWNhdGVzIGlmIGRpcmVjdG9yaWVzIGNhbiBiZSBjcmVhdGVkLiAqL1xuICAgIENhbkNyZWF0ZURpcmVjdG9yaWVzPzogYm9vbGVhbjtcbiAgICAvKiogSW5kaWNhdGVzIGlmIGhpZGRlbiBmaWxlcyBzaG91bGQgYmUgc2hvd24uICovXG4gICAgU2hvd0hpZGRlbkZpbGVzPzogYm9vbGVhbjtcbiAgICAvKiogSW5kaWNhdGVzIGlmIGFsaWFzZXMgc2hvdWxkIGJlIHJlc29sdmVkLiAqL1xuICAgIFJlc29sdmVzQWxpYXNlcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiB0aGUgZXh0ZW5zaW9uIHNob3VsZCBiZSBoaWRkZW4uICovXG4gICAgSGlkZUV4dGVuc2lvbj86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBoaWRkZW4gZXh0ZW5zaW9ucyBjYW4gYmUgc2VsZWN0ZWQuICovXG4gICAgQ2FuU2VsZWN0SGlkZGVuRXh0ZW5zaW9uPzogYm9vbGVhbjtcbiAgICAvKiogSW5kaWNhdGVzIGlmIGZpbGUgcGFja2FnZXMgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgZGlyZWN0b3JpZXMuICovXG4gICAgVHJlYXRzRmlsZVBhY2thZ2VzQXNEaXJlY3Rvcmllcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBvdGhlciBmaWxlIHR5cGVzIGFyZSBhbGxvd2VkLiAqL1xuICAgIEFsbG93c090aGVyRmlsZXR5cGVzPzogYm9vbGVhbjtcbiAgICAvKiogQXJyYXkgb2YgZmlsZSBmaWx0ZXJzLiAqL1xuICAgIEZpbHRlcnM/OiBGaWxlRmlsdGVyW107XG4gICAgLyoqIFRpdGxlIG9mIHRoZSBkaWFsb2cuICovXG4gICAgVGl0bGU/OiBzdHJpbmc7XG4gICAgLyoqIE1lc3NhZ2UgdG8gc2hvdyBpbiB0aGUgZGlhbG9nLiAqL1xuICAgIE1lc3NhZ2U/OiBzdHJpbmc7XG4gICAgLyoqIFRleHQgdG8gZGlzcGxheSBvbiB0aGUgYnV0dG9uLiAqL1xuICAgIEJ1dHRvblRleHQ/OiBzdHJpbmc7XG4gICAgLyoqIERpcmVjdG9yeSB0byBvcGVuIGluIHRoZSBkaWFsb2cuICovXG4gICAgRGlyZWN0b3J5Pzogc3RyaW5nO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgdGhlIGRpYWxvZyBzaG91bGQgYXBwZWFyIGRldGFjaGVkIGZyb20gdGhlIG1haW4gd2luZG93LiAqL1xuICAgIERldGFjaGVkPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNZXNzYWdlRGlhbG9nT3B0aW9ucyB7XG4gICAgLyoqIFRoZSB0aXRsZSBvZiB0aGUgZGlhbG9nIHdpbmRvdy4gKi9cbiAgICBUaXRsZT86IHN0cmluZztcbiAgICAvKiogVGhlIG1haW4gbWVzc2FnZSB0byBzaG93IGluIHRoZSBkaWFsb2cuICovXG4gICAgTWVzc2FnZT86IHN0cmluZztcbiAgICAvKiogQXJyYXkgb2YgYnV0dG9uIG9wdGlvbnMgdG8gc2hvdyBpbiB0aGUgZGlhbG9nLiAqL1xuICAgIEJ1dHRvbnM/OiBCdXR0b25bXTtcbiAgICAvKiogVHJ1ZSBpZiB0aGUgZGlhbG9nIHNob3VsZCBhcHBlYXIgZGV0YWNoZWQgZnJvbSB0aGUgbWFpbiB3aW5kb3cgKGlmIGFwcGxpY2FibGUpLiAqL1xuICAgIERldGFjaGVkPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCdXR0b24ge1xuICAgIC8qKiBUZXh0IHRoYXQgYXBwZWFycyB3aXRoaW4gdGhlIGJ1dHRvbi4gKi9cbiAgICBMYWJlbD86IHN0cmluZztcbiAgICAvKiogVHJ1ZSBpZiB0aGUgYnV0dG9uIHNob3VsZCBjYW5jZWwgYW4gb3BlcmF0aW9uIHdoZW4gY2xpY2tlZC4gKi9cbiAgICBJc0NhbmNlbD86IGJvb2xlYW47XG4gICAgLyoqIFRydWUgaWYgdGhlIGJ1dHRvbiBzaG91bGQgYmUgdGhlIGRlZmF1bHQgYWN0aW9uIHdoZW4gdGhlIHVzZXIgcHJlc3NlcyBlbnRlci4gKi9cbiAgICBJc0RlZmF1bHQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVGaWx0ZXIge1xuICAgIC8qKiBEaXNwbGF5IG5hbWUgZm9yIHRoZSBmaWx0ZXIsIGl0IGNvdWxkIGJlIFwiVGV4dCBGaWxlc1wiLCBcIkltYWdlc1wiIGV0Yy4gKi9cbiAgICBEaXNwbGF5TmFtZT86IHN0cmluZztcbiAgICAvKiogUGF0dGVybiB0byBtYXRjaCBmb3IgdGhlIGZpbHRlciwgZS5nLiBcIioudHh0OyoubWRcIiBmb3IgdGV4dCBtYXJrZG93biBmaWxlcy4gKi9cbiAgICBQYXR0ZXJuPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEhhbmRsZXMgdGhlIHJlc3VsdCBvZiBhIGRpYWxvZyByZXF1ZXN0LlxuICpcbiAqIEBwYXJhbSBpZCAtIFRoZSBpZCBvZiB0aGUgcmVxdWVzdCB0byBoYW5kbGUgdGhlIHJlc3VsdCBmb3IuXG4gKiBAcGFyYW0gZGF0YSAtIFRoZSByZXN1bHQgZGF0YSBvZiB0aGUgcmVxdWVzdC5cbiAqIEBwYXJhbSBpc0pTT04gLSBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZGF0YSBpcyBKU09OIG9yIG5vdC5cbiAqL1xuZnVuY3Rpb24gZGlhbG9nUmVzdWx0Q2FsbGJhY2soaWQ6IHN0cmluZywgZGF0YTogc3RyaW5nLCBpc0pTT046IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBsZXQgcmVzb2x2ZXJzID0gZ2V0QW5kRGVsZXRlUmVzcG9uc2UoaWQpO1xuICAgIGlmICghcmVzb2x2ZXJzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaXNKU09OKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXNvbHZlcnMucmVzb2x2ZShKU09OLnBhcnNlKGRhdGEpKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgICAgIHJlc29sdmVycy5yZWplY3QobmV3IFR5cGVFcnJvcihcImNvdWxkIG5vdCBwYXJzZSByZXN1bHQ6IFwiICsgZXJyLm1lc3NhZ2UsIHsgY2F1c2U6IGVyciB9KSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICByZXNvbHZlcnMucmVzb2x2ZShkYXRhKTtcbiAgICB9XG59XG5cbi8qKlxuICogSGFuZGxlcyB0aGUgZXJyb3IgZnJvbSBhIGRpYWxvZyByZXF1ZXN0LlxuICpcbiAqIEBwYXJhbSBpZCAtIFRoZSBpZCBvZiB0aGUgcHJvbWlzZSBoYW5kbGVyLlxuICogQHBhcmFtIG1lc3NhZ2UgLSBBbiBlcnJvciBtZXNzYWdlLlxuICovXG5mdW5jdGlvbiBkaWFsb2dFcnJvckNhbGxiYWNrKGlkOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgIGdldEFuZERlbGV0ZVJlc3BvbnNlKGlkKT8ucmVqZWN0KG5ldyB3aW5kb3cuRXJyb3IobWVzc2FnZSkpO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyBhbmQgcmVtb3ZlcyB0aGUgcmVzcG9uc2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBJRCBmcm9tIHRoZSBkaWFsb2dSZXNwb25zZXMgbWFwLlxuICpcbiAqIEBwYXJhbSBpZCAtIFRoZSBJRCBvZiB0aGUgcmVzcG9uc2UgdG8gYmUgcmV0cmlldmVkIGFuZCByZW1vdmVkLlxuICogQHJldHVybnMgVGhlIHJlc3BvbnNlIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIElELCBpZiBhbnkuXG4gKi9cbmZ1bmN0aW9uIGdldEFuZERlbGV0ZVJlc3BvbnNlKGlkOiBzdHJpbmcpOiBQcm9taXNlUmVzb2x2ZXJzIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZXNwb25zZSA9IGRpYWxvZ1Jlc3BvbnNlcy5nZXQoaWQpO1xuICAgIGRpYWxvZ1Jlc3BvbnNlcy5kZWxldGUoaWQpO1xuICAgIHJldHVybiByZXNwb25zZTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSB1bmlxdWUgSUQgdXNpbmcgdGhlIG5hbm9pZCBsaWJyYXJ5LlxuICpcbiAqIEByZXR1cm5zIEEgdW5pcXVlIElEIHRoYXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGRpYWxvZ1Jlc3BvbnNlcyBzZXQuXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlSUQoKTogc3RyaW5nIHtcbiAgICBsZXQgcmVzdWx0O1xuICAgIGRvIHtcbiAgICAgICAgcmVzdWx0ID0gbmFub2lkKCk7XG4gICAgfSB3aGlsZSAoZGlhbG9nUmVzcG9uc2VzLmhhcyhyZXN1bHQpKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFByZXNlbnRzIGEgZGlhbG9nIG9mIHNwZWNpZmllZCB0eXBlIHdpdGggdGhlIGdpdmVuIG9wdGlvbnMuXG4gKlxuICogQHBhcmFtIHR5cGUgLSBEaWFsb2cgdHlwZS5cbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyBmb3IgdGhlIGRpYWxvZy5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggcmVzdWx0IG9mIGRpYWxvZy5cbiAqL1xuZnVuY3Rpb24gZGlhbG9nKHR5cGU6IG51bWJlciwgb3B0aW9uczogTWVzc2FnZURpYWxvZ09wdGlvbnMgfCBPcGVuRmlsZURpYWxvZ09wdGlvbnMgfCBTYXZlRmlsZURpYWxvZ09wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgaWQgPSBnZW5lcmF0ZUlEKCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgZGlhbG9nUmVzcG9uc2VzLnNldChpZCwgeyByZXNvbHZlLCByZWplY3QgfSk7XG4gICAgICAgIGNhbGwodHlwZSwgT2JqZWN0LmFzc2lnbih7IFwiZGlhbG9nLWlkXCI6IGlkIH0sIG9wdGlvbnMpKS5jYXRjaCgoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGRpYWxvZ1Jlc3BvbnNlcy5kZWxldGUoaWQpO1xuICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIFByZXNlbnRzIGFuIGluZm8gZGlhbG9nLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gRGlhbG9nIG9wdGlvbnNcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGxhYmVsIG9mIHRoZSBjaG9zZW4gYnV0dG9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSW5mbyhvcHRpb25zOiBNZXNzYWdlRGlhbG9nT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7IHJldHVybiBkaWFsb2coRGlhbG9nSW5mbywgb3B0aW9ucyk7IH1cblxuLyoqXG4gKiBQcmVzZW50cyBhIHdhcm5pbmcgZGlhbG9nLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gRGlhbG9nIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBsYWJlbCBvZiB0aGUgY2hvc2VuIGJ1dHRvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFdhcm5pbmcob3B0aW9uczogTWVzc2FnZURpYWxvZ09wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4geyByZXR1cm4gZGlhbG9nKERpYWxvZ1dhcm5pbmcsIG9wdGlvbnMpOyB9XG5cbi8qKlxuICogUHJlc2VudHMgYW4gZXJyb3IgZGlhbG9nLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gRGlhbG9nIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBsYWJlbCBvZiB0aGUgY2hvc2VuIGJ1dHRvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEVycm9yKG9wdGlvbnM6IE1lc3NhZ2VEaWFsb2dPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHsgcmV0dXJuIGRpYWxvZyhEaWFsb2dFcnJvciwgb3B0aW9ucyk7IH1cblxuLyoqXG4gKiBQcmVzZW50cyBhIHF1ZXN0aW9uIGRpYWxvZy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIERpYWxvZyBvcHRpb25zLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgbGFiZWwgb2YgdGhlIGNob3NlbiBidXR0b24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBRdWVzdGlvbihvcHRpb25zOiBNZXNzYWdlRGlhbG9nT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7IHJldHVybiBkaWFsb2coRGlhbG9nUXVlc3Rpb24sIG9wdGlvbnMpOyB9XG5cbi8qKlxuICogUHJlc2VudHMgYSBmaWxlIHNlbGVjdGlvbiBkaWFsb2cgdG8gcGljayBvbmUgb3IgbW9yZSBmaWxlcyB0byBvcGVuLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gRGlhbG9nIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBTZWxlY3RlZCBmaWxlIG9yIGxpc3Qgb2YgZmlsZXMsIG9yIGEgYmxhbmsgc3RyaW5nL2VtcHR5IGxpc3QgaWYgbm8gZmlsZSBoYXMgYmVlbiBzZWxlY3RlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE9wZW5GaWxlKG9wdGlvbnM6IE9wZW5GaWxlRGlhbG9nT3B0aW9ucyAmIHsgQWxsb3dzTXVsdGlwbGVTZWxlY3Rpb246IHRydWUgfSk6IFByb21pc2U8c3RyaW5nW10+O1xuZXhwb3J0IGZ1bmN0aW9uIE9wZW5GaWxlKG9wdGlvbnM6IE9wZW5GaWxlRGlhbG9nT3B0aW9ucyAmIHsgQWxsb3dzTXVsdGlwbGVTZWxlY3Rpb24/OiBmYWxzZSB8IHVuZGVmaW5lZCB9KTogUHJvbWlzZTxzdHJpbmc+O1xuZXhwb3J0IGZ1bmN0aW9uIE9wZW5GaWxlKG9wdGlvbnM6IE9wZW5GaWxlRGlhbG9nT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nIHwgc3RyaW5nW10+O1xuZXhwb3J0IGZ1bmN0aW9uIE9wZW5GaWxlKG9wdGlvbnM6IE9wZW5GaWxlRGlhbG9nT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nIHwgc3RyaW5nW10+IHsgcmV0dXJuIGRpYWxvZyhEaWFsb2dPcGVuRmlsZSwgb3B0aW9ucykgPz8gW107IH1cblxuLyoqXG4gKiBQcmVzZW50cyBhIGZpbGUgc2VsZWN0aW9uIGRpYWxvZyB0byBwaWNrIGEgZmlsZSB0byBzYXZlLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gRGlhbG9nIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBTZWxlY3RlZCBmaWxlLCBvciBhIGJsYW5rIHN0cmluZyBpZiBubyBmaWxlIGhhcyBiZWVuIHNlbGVjdGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gU2F2ZUZpbGUob3B0aW9uczogU2F2ZUZpbGVEaWFsb2dPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHsgcmV0dXJuIGRpYWxvZyhEaWFsb2dTYXZlRmlsZSwgb3B0aW9ucyk7IH1cbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuaW1wb3J0IHsgbmV3UnVudGltZUNhbGxlciwgb2JqZWN0TmFtZXMgfSBmcm9tIFwiLi9ydW50aW1lLmpzXCI7XG5pbXBvcnQgeyBldmVudExpc3RlbmVycywgTGlzdGVuZXIsIGxpc3RlbmVyT2ZmIH0gZnJvbSBcIi4vbGlzdGVuZXIuanNcIjtcblxuLy8gU2V0dXBcbndpbmRvdy5fd2FpbHMgPSB3aW5kb3cuX3dhaWxzIHx8IHt9O1xud2luZG93Ll93YWlscy5kaXNwYXRjaFdhaWxzRXZlbnQgPSBkaXNwYXRjaFdhaWxzRXZlbnQ7XG5cbmNvbnN0IGNhbGwgPSBuZXdSdW50aW1lQ2FsbGVyKG9iamVjdE5hbWVzLkV2ZW50cyk7XG5jb25zdCBFbWl0TWV0aG9kID0gMDtcblxuZXhwb3J0IHsgVHlwZXMgfSBmcm9tIFwiLi9ldmVudF90eXBlcy5qc1wiO1xuXG4vKipcbiAqIFRoZSB0eXBlIG9mIGhhbmRsZXJzIGZvciBhIGdpdmVuIGV2ZW50LlxuICovXG5leHBvcnQgdHlwZSBDYWxsYmFjayA9IChldjogV2FpbHNFdmVudCkgPT4gdm9pZDtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgc3lzdGVtIGV2ZW50IG9yIGEgY3VzdG9tIGV2ZW50IGVtaXR0ZWQgdGhyb3VnaCB3YWlscy1wcm92aWRlZCBmYWNpbGl0aWVzLlxuICovXG5leHBvcnQgY2xhc3MgV2FpbHNFdmVudCB7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIE9wdGlvbmFsIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbWl0dGVkIGV2ZW50LlxuICAgICAqL1xuICAgIGRhdGE6IGFueTtcblxuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgdGhlIG9yaWdpbmF0aW5nIHdpbmRvdy4gT21pdHRlZCBmb3IgYXBwbGljYXRpb24gZXZlbnRzLlxuICAgICAqIFdpbGwgYmUgb3ZlcnJpZGRlbiBpZiBzZXQgbWFudWFsbHkuXG4gICAgICovXG4gICAgc2VuZGVyPzogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCBkYXRhOiBhbnkgPSBudWxsKSB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkaXNwYXRjaFdhaWxzRXZlbnQoZXZlbnQ6IGFueSkge1xuICAgIGxldCBsaXN0ZW5lcnMgPSBldmVudExpc3RlbmVycy5nZXQoZXZlbnQubmFtZSk7XG4gICAgaWYgKCFsaXN0ZW5lcnMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCB3YWlsc0V2ZW50ID0gbmV3IFdhaWxzRXZlbnQoZXZlbnQubmFtZSwgZXZlbnQuZGF0YSk7XG4gICAgaWYgKCdzZW5kZXInIGluIGV2ZW50KSB7XG4gICAgICAgIHdhaWxzRXZlbnQuc2VuZGVyID0gZXZlbnQuc2VuZGVyO1xuICAgIH1cblxuICAgIGxpc3RlbmVycyA9IGxpc3RlbmVycy5maWx0ZXIobGlzdGVuZXIgPT4gIWxpc3RlbmVyLmRpc3BhdGNoKHdhaWxzRXZlbnQpKTtcbiAgICBpZiAobGlzdGVuZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBldmVudExpc3RlbmVycy5kZWxldGUoZXZlbnQubmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZXZlbnRMaXN0ZW5lcnMuc2V0KGV2ZW50Lm5hbWUsIGxpc3RlbmVycyk7XG4gICAgfVxufVxuXG4vKipcbiAqIFJlZ2lzdGVyIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGZvciBhIHNwZWNpZmljIGV2ZW50LlxuICpcbiAqIEBwYXJhbSBldmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gcmVnaXN0ZXIgdGhlIGNhbGxiYWNrIGZvci5cbiAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlxuICogQHBhcmFtIG1heENhbGxiYWNrcyAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0aW1lcyB0aGUgY2FsbGJhY2sgY2FuIGJlIGNhbGxlZCBmb3IgdGhlIGV2ZW50LiBPbmNlIHRoZSBtYXhpbXVtIG51bWJlciBpcyByZWFjaGVkLCB0aGUgY2FsbGJhY2sgd2lsbCBubyBsb25nZXIgYmUgY2FsbGVkLlxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0LCB3aGVuIGNhbGxlZCwgd2lsbCB1bnJlZ2lzdGVyIHRoZSBjYWxsYmFjayBmcm9tIHRoZSBldmVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE9uTXVsdGlwbGUoZXZlbnROYW1lOiBzdHJpbmcsIGNhbGxiYWNrOiBDYWxsYmFjaywgbWF4Q2FsbGJhY2tzOiBudW1iZXIpIHtcbiAgICBsZXQgbGlzdGVuZXJzID0gZXZlbnRMaXN0ZW5lcnMuZ2V0KGV2ZW50TmFtZSkgfHwgW107XG4gICAgY29uc3QgdGhpc0xpc3RlbmVyID0gbmV3IExpc3RlbmVyKGV2ZW50TmFtZSwgY2FsbGJhY2ssIG1heENhbGxiYWNrcyk7XG4gICAgbGlzdGVuZXJzLnB1c2godGhpc0xpc3RlbmVyKTtcbiAgICBldmVudExpc3RlbmVycy5zZXQoZXZlbnROYW1lLCBsaXN0ZW5lcnMpO1xuICAgIHJldHVybiAoKSA9PiBsaXN0ZW5lck9mZih0aGlzTGlzdGVuZXIpO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIHNwZWNpZmllZCBldmVudCBvY2N1cnMuXG4gKlxuICogQHBhcmFtIGV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudCB0byByZWdpc3RlciB0aGUgY2FsbGJhY2sgZm9yLlxuICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQsIHdoZW4gY2FsbGVkLCB3aWxsIHVucmVnaXN0ZXIgdGhlIGNhbGxiYWNrIGZyb20gdGhlIGV2ZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gT24oZXZlbnROYW1lOiBzdHJpbmcsIGNhbGxiYWNrOiBDYWxsYmFjayk6ICgpID0+IHZvaWQge1xuICAgIHJldHVybiBPbk11bHRpcGxlKGV2ZW50TmFtZSwgY2FsbGJhY2ssIC0xKTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBvbmx5IG9uY2UgZm9yIHRoZSBzcGVjaWZpZWQgZXZlbnQuXG4gKlxuICogQHBhcmFtIGV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudCB0byByZWdpc3RlciB0aGUgY2FsbGJhY2sgZm9yLlxuICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQsIHdoZW4gY2FsbGVkLCB3aWxsIHVucmVnaXN0ZXIgdGhlIGNhbGxiYWNrIGZyb20gdGhlIGV2ZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gT25jZShldmVudE5hbWU6IHN0cmluZywgY2FsbGJhY2s6IENhbGxiYWNrKTogKCkgPT4gdm9pZCB7XG4gICAgcmV0dXJuIE9uTXVsdGlwbGUoZXZlbnROYW1lLCBjYWxsYmFjaywgMSk7XG59XG5cbi8qKlxuICogUmVtb3ZlcyBldmVudCBsaXN0ZW5lcnMgZm9yIHRoZSBzcGVjaWZpZWQgZXZlbnQgbmFtZXMuXG4gKlxuICogQHBhcmFtIGV2ZW50TmFtZXMgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnRzIHRvIHJlbW92ZSBsaXN0ZW5lcnMgZm9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gT2ZmKC4uLmV2ZW50TmFtZXM6IFtzdHJpbmcsIC4uLnN0cmluZ1tdXSk6IHZvaWQge1xuICAgIGV2ZW50TmFtZXMuZm9yRWFjaChldmVudE5hbWUgPT4gZXZlbnRMaXN0ZW5lcnMuZGVsZXRlKGV2ZW50TmFtZSkpO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgYWxsIGV2ZW50IGxpc3RlbmVycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE9mZkFsbCgpOiB2b2lkIHtcbiAgICBldmVudExpc3RlbmVycy5jbGVhcigpO1xufVxuXG4vKipcbiAqIEVtaXRzIHRoZSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0gZXZlbnQgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gZW1pdC5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgZnVsZmlsbGVkIG9uY2UgdGhlIGV2ZW50IGhhcyBiZWVuIGVtaXR0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFbWl0KGV2ZW50OiBXYWlsc0V2ZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIGNhbGwoRW1pdE1ldGhvZCwgZXZlbnQpO1xufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vLyBUaGUgZm9sbG93aW5nIHV0aWxpdGllcyBoYXZlIGJlZW4gZmFjdG9yZWQgb3V0IG9mIC4vZXZlbnRzLnRzXG4vLyBmb3IgdGVzdGluZyBwdXJwb3Nlcy5cblxuZXhwb3J0IGNvbnN0IGV2ZW50TGlzdGVuZXJzID0gbmV3IE1hcDxzdHJpbmcsIExpc3RlbmVyW10+KCk7XG5cbmV4cG9ydCBjbGFzcyBMaXN0ZW5lciB7XG4gICAgZXZlbnROYW1lOiBzdHJpbmc7XG4gICAgY2FsbGJhY2s6IChkYXRhOiBhbnkpID0+IHZvaWQ7XG4gICAgbWF4Q2FsbGJhY2tzOiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvcihldmVudE5hbWU6IHN0cmluZywgY2FsbGJhY2s6IChkYXRhOiBhbnkpID0+IHZvaWQsIG1heENhbGxiYWNrczogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuZXZlbnROYW1lID0gZXZlbnROYW1lO1xuICAgICAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgICAgIHRoaXMubWF4Q2FsbGJhY2tzID0gbWF4Q2FsbGJhY2tzIHx8IC0xO1xuICAgIH1cblxuICAgIGRpc3BhdGNoKGRhdGE6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5jYWxsYmFjayhkYXRhKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5tYXhDYWxsYmFja3MgPT09IC0xKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMubWF4Q2FsbGJhY2tzIC09IDE7XG4gICAgICAgIHJldHVybiB0aGlzLm1heENhbGxiYWNrcyA9PT0gMDtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsaXN0ZW5lck9mZihsaXN0ZW5lcjogTGlzdGVuZXIpOiB2b2lkIHtcbiAgICBsZXQgbGlzdGVuZXJzID0gZXZlbnRMaXN0ZW5lcnMuZ2V0KGxpc3RlbmVyLmV2ZW50TmFtZSk7XG4gICAgaWYgKCFsaXN0ZW5lcnMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxpc3RlbmVycyA9IGxpc3RlbmVycy5maWx0ZXIobCA9PiBsICE9PSBsaXN0ZW5lcik7XG4gICAgaWYgKGxpc3RlbmVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZXZlbnRMaXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyLmV2ZW50TmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZXZlbnRMaXN0ZW5lcnMuc2V0KGxpc3RlbmVyLmV2ZW50TmFtZSwgbGlzdGVuZXJzKTtcbiAgICB9XG59XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbi8vIEN5bmh5cmNod3lkIHkgZmZlaWwgaG9uIHluIGF3dG9tYXRpZy4gUEVJRElXQ0ggXHUwMEMyIE1PRElXTFxuLy8gVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkLiBETyBOT1QgRURJVFxuXG5leHBvcnQgY29uc3QgVHlwZXMgPSBPYmplY3QuZnJlZXplKHtcblx0V2luZG93czogT2JqZWN0LmZyZWV6ZSh7XG5cdFx0QVBNUG93ZXJTZXR0aW5nQ2hhbmdlOiBcIndpbmRvd3M6QVBNUG93ZXJTZXR0aW5nQ2hhbmdlXCIsXG5cdFx0QVBNUG93ZXJTdGF0dXNDaGFuZ2U6IFwid2luZG93czpBUE1Qb3dlclN0YXR1c0NoYW5nZVwiLFxuXHRcdEFQTVJlc3VtZUF1dG9tYXRpYzogXCJ3aW5kb3dzOkFQTVJlc3VtZUF1dG9tYXRpY1wiLFxuXHRcdEFQTVJlc3VtZVN1c3BlbmQ6IFwid2luZG93czpBUE1SZXN1bWVTdXNwZW5kXCIsXG5cdFx0QVBNU3VzcGVuZDogXCJ3aW5kb3dzOkFQTVN1c3BlbmRcIixcblx0XHRBcHBsaWNhdGlvblN0YXJ0ZWQ6IFwid2luZG93czpBcHBsaWNhdGlvblN0YXJ0ZWRcIixcblx0XHRTeXN0ZW1UaGVtZUNoYW5nZWQ6IFwid2luZG93czpTeXN0ZW1UaGVtZUNoYW5nZWRcIixcblx0XHRXZWJWaWV3TmF2aWdhdGlvbkNvbXBsZXRlZDogXCJ3aW5kb3dzOldlYlZpZXdOYXZpZ2F0aW9uQ29tcGxldGVkXCIsXG5cdFx0V2luZG93QWN0aXZlOiBcIndpbmRvd3M6V2luZG93QWN0aXZlXCIsXG5cdFx0V2luZG93QmFja2dyb3VuZEVyYXNlOiBcIndpbmRvd3M6V2luZG93QmFja2dyb3VuZEVyYXNlXCIsXG5cdFx0V2luZG93Q2xpY2tBY3RpdmU6IFwid2luZG93czpXaW5kb3dDbGlja0FjdGl2ZVwiLFxuXHRcdFdpbmRvd0Nsb3Npbmc6IFwid2luZG93czpXaW5kb3dDbG9zaW5nXCIsXG5cdFx0V2luZG93RGlkTW92ZTogXCJ3aW5kb3dzOldpbmRvd0RpZE1vdmVcIixcblx0XHRXaW5kb3dEaWRSZXNpemU6IFwid2luZG93czpXaW5kb3dEaWRSZXNpemVcIixcblx0XHRXaW5kb3dEUElDaGFuZ2VkOiBcIndpbmRvd3M6V2luZG93RFBJQ2hhbmdlZFwiLFxuXHRcdFdpbmRvd0RyYWdEcm9wOiBcIndpbmRvd3M6V2luZG93RHJhZ0Ryb3BcIixcblx0XHRXaW5kb3dEcmFnRW50ZXI6IFwid2luZG93czpXaW5kb3dEcmFnRW50ZXJcIixcblx0XHRXaW5kb3dEcmFnTGVhdmU6IFwid2luZG93czpXaW5kb3dEcmFnTGVhdmVcIixcblx0XHRXaW5kb3dEcmFnT3ZlcjogXCJ3aW5kb3dzOldpbmRvd0RyYWdPdmVyXCIsXG5cdFx0V2luZG93RW5kTW92ZTogXCJ3aW5kb3dzOldpbmRvd0VuZE1vdmVcIixcblx0XHRXaW5kb3dFbmRSZXNpemU6IFwid2luZG93czpXaW5kb3dFbmRSZXNpemVcIixcblx0XHRXaW5kb3dGdWxsc2NyZWVuOiBcIndpbmRvd3M6V2luZG93RnVsbHNjcmVlblwiLFxuXHRcdFdpbmRvd0hpZGU6IFwid2luZG93czpXaW5kb3dIaWRlXCIsXG5cdFx0V2luZG93SW5hY3RpdmU6IFwid2luZG93czpXaW5kb3dJbmFjdGl2ZVwiLFxuXHRcdFdpbmRvd0tleURvd246IFwid2luZG93czpXaW5kb3dLZXlEb3duXCIsXG5cdFx0V2luZG93S2V5VXA6IFwid2luZG93czpXaW5kb3dLZXlVcFwiLFxuXHRcdFdpbmRvd0tpbGxGb2N1czogXCJ3aW5kb3dzOldpbmRvd0tpbGxGb2N1c1wiLFxuXHRcdFdpbmRvd05vbkNsaWVudEhpdDogXCJ3aW5kb3dzOldpbmRvd05vbkNsaWVudEhpdFwiLFxuXHRcdFdpbmRvd05vbkNsaWVudE1vdXNlRG93bjogXCJ3aW5kb3dzOldpbmRvd05vbkNsaWVudE1vdXNlRG93blwiLFxuXHRcdFdpbmRvd05vbkNsaWVudE1vdXNlTGVhdmU6IFwid2luZG93czpXaW5kb3dOb25DbGllbnRNb3VzZUxlYXZlXCIsXG5cdFx0V2luZG93Tm9uQ2xpZW50TW91c2VNb3ZlOiBcIndpbmRvd3M6V2luZG93Tm9uQ2xpZW50TW91c2VNb3ZlXCIsXG5cdFx0V2luZG93Tm9uQ2xpZW50TW91c2VVcDogXCJ3aW5kb3dzOldpbmRvd05vbkNsaWVudE1vdXNlVXBcIixcblx0XHRXaW5kb3dQYWludDogXCJ3aW5kb3dzOldpbmRvd1BhaW50XCIsXG5cdFx0V2luZG93UmVzdG9yZTogXCJ3aW5kb3dzOldpbmRvd1Jlc3RvcmVcIixcblx0XHRXaW5kb3dTZXRGb2N1czogXCJ3aW5kb3dzOldpbmRvd1NldEZvY3VzXCIsXG5cdFx0V2luZG93U2hvdzogXCJ3aW5kb3dzOldpbmRvd1Nob3dcIixcblx0XHRXaW5kb3dTdGFydE1vdmU6IFwid2luZG93czpXaW5kb3dTdGFydE1vdmVcIixcblx0XHRXaW5kb3dTdGFydFJlc2l6ZTogXCJ3aW5kb3dzOldpbmRvd1N0YXJ0UmVzaXplXCIsXG5cdFx0V2luZG93VW5GdWxsc2NyZWVuOiBcIndpbmRvd3M6V2luZG93VW5GdWxsc2NyZWVuXCIsXG5cdFx0V2luZG93Wk9yZGVyQ2hhbmdlZDogXCJ3aW5kb3dzOldpbmRvd1pPcmRlckNoYW5nZWRcIixcblx0XHRXaW5kb3dNaW5pbWlzZTogXCJ3aW5kb3dzOldpbmRvd01pbmltaXNlXCIsXG5cdFx0V2luZG93VW5NaW5pbWlzZTogXCJ3aW5kb3dzOldpbmRvd1VuTWluaW1pc2VcIixcblx0XHRXaW5kb3dNYXhpbWlzZTogXCJ3aW5kb3dzOldpbmRvd01heGltaXNlXCIsXG5cdFx0V2luZG93VW5NYXhpbWlzZTogXCJ3aW5kb3dzOldpbmRvd1VuTWF4aW1pc2VcIixcblx0fSksXG5cdE1hYzogT2JqZWN0LmZyZWV6ZSh7XG5cdFx0QXBwbGljYXRpb25EaWRCZWNvbWVBY3RpdmU6IFwibWFjOkFwcGxpY2F0aW9uRGlkQmVjb21lQWN0aXZlXCIsXG5cdFx0QXBwbGljYXRpb25EaWRDaGFuZ2VCYWNraW5nUHJvcGVydGllczogXCJtYWM6QXBwbGljYXRpb25EaWRDaGFuZ2VCYWNraW5nUHJvcGVydGllc1wiLFxuXHRcdEFwcGxpY2F0aW9uRGlkQ2hhbmdlRWZmZWN0aXZlQXBwZWFyYW5jZTogXCJtYWM6QXBwbGljYXRpb25EaWRDaGFuZ2VFZmZlY3RpdmVBcHBlYXJhbmNlXCIsXG5cdFx0QXBwbGljYXRpb25EaWRDaGFuZ2VJY29uOiBcIm1hYzpBcHBsaWNhdGlvbkRpZENoYW5nZUljb25cIixcblx0XHRBcHBsaWNhdGlvbkRpZENoYW5nZU9jY2x1c2lvblN0YXRlOiBcIm1hYzpBcHBsaWNhdGlvbkRpZENoYW5nZU9jY2x1c2lvblN0YXRlXCIsXG5cdFx0QXBwbGljYXRpb25EaWRDaGFuZ2VTY3JlZW5QYXJhbWV0ZXJzOiBcIm1hYzpBcHBsaWNhdGlvbkRpZENoYW5nZVNjcmVlblBhcmFtZXRlcnNcIixcblx0XHRBcHBsaWNhdGlvbkRpZENoYW5nZVN0YXR1c0JhckZyYW1lOiBcIm1hYzpBcHBsaWNhdGlvbkRpZENoYW5nZVN0YXR1c0JhckZyYW1lXCIsXG5cdFx0QXBwbGljYXRpb25EaWRDaGFuZ2VTdGF0dXNCYXJPcmllbnRhdGlvbjogXCJtYWM6QXBwbGljYXRpb25EaWRDaGFuZ2VTdGF0dXNCYXJPcmllbnRhdGlvblwiLFxuXHRcdEFwcGxpY2F0aW9uRGlkQ2hhbmdlVGhlbWU6IFwibWFjOkFwcGxpY2F0aW9uRGlkQ2hhbmdlVGhlbWVcIixcblx0XHRBcHBsaWNhdGlvbkRpZEZpbmlzaExhdW5jaGluZzogXCJtYWM6QXBwbGljYXRpb25EaWRGaW5pc2hMYXVuY2hpbmdcIixcblx0XHRBcHBsaWNhdGlvbkRpZEhpZGU6IFwibWFjOkFwcGxpY2F0aW9uRGlkSGlkZVwiLFxuXHRcdEFwcGxpY2F0aW9uRGlkUmVzaWduQWN0aXZlOiBcIm1hYzpBcHBsaWNhdGlvbkRpZFJlc2lnbkFjdGl2ZVwiLFxuXHRcdEFwcGxpY2F0aW9uRGlkVW5oaWRlOiBcIm1hYzpBcHBsaWNhdGlvbkRpZFVuaGlkZVwiLFxuXHRcdEFwcGxpY2F0aW9uRGlkVXBkYXRlOiBcIm1hYzpBcHBsaWNhdGlvbkRpZFVwZGF0ZVwiLFxuXHRcdEFwcGxpY2F0aW9uU2hvdWxkSGFuZGxlUmVvcGVuOiBcIm1hYzpBcHBsaWNhdGlvblNob3VsZEhhbmRsZVJlb3BlblwiLFxuXHRcdEFwcGxpY2F0aW9uV2lsbEJlY29tZUFjdGl2ZTogXCJtYWM6QXBwbGljYXRpb25XaWxsQmVjb21lQWN0aXZlXCIsXG5cdFx0QXBwbGljYXRpb25XaWxsRmluaXNoTGF1bmNoaW5nOiBcIm1hYzpBcHBsaWNhdGlvbldpbGxGaW5pc2hMYXVuY2hpbmdcIixcblx0XHRBcHBsaWNhdGlvbldpbGxIaWRlOiBcIm1hYzpBcHBsaWNhdGlvbldpbGxIaWRlXCIsXG5cdFx0QXBwbGljYXRpb25XaWxsUmVzaWduQWN0aXZlOiBcIm1hYzpBcHBsaWNhdGlvbldpbGxSZXNpZ25BY3RpdmVcIixcblx0XHRBcHBsaWNhdGlvbldpbGxUZXJtaW5hdGU6IFwibWFjOkFwcGxpY2F0aW9uV2lsbFRlcm1pbmF0ZVwiLFxuXHRcdEFwcGxpY2F0aW9uV2lsbFVuaGlkZTogXCJtYWM6QXBwbGljYXRpb25XaWxsVW5oaWRlXCIsXG5cdFx0QXBwbGljYXRpb25XaWxsVXBkYXRlOiBcIm1hYzpBcHBsaWNhdGlvbldpbGxVcGRhdGVcIixcblx0XHRNZW51RGlkQWRkSXRlbTogXCJtYWM6TWVudURpZEFkZEl0ZW1cIixcblx0XHRNZW51RGlkQmVnaW5UcmFja2luZzogXCJtYWM6TWVudURpZEJlZ2luVHJhY2tpbmdcIixcblx0XHRNZW51RGlkQ2xvc2U6IFwibWFjOk1lbnVEaWRDbG9zZVwiLFxuXHRcdE1lbnVEaWREaXNwbGF5SXRlbTogXCJtYWM6TWVudURpZERpc3BsYXlJdGVtXCIsXG5cdFx0TWVudURpZEVuZFRyYWNraW5nOiBcIm1hYzpNZW51RGlkRW5kVHJhY2tpbmdcIixcblx0XHRNZW51RGlkSGlnaGxpZ2h0SXRlbTogXCJtYWM6TWVudURpZEhpZ2hsaWdodEl0ZW1cIixcblx0XHRNZW51RGlkT3BlbjogXCJtYWM6TWVudURpZE9wZW5cIixcblx0XHRNZW51RGlkUG9wVXA6IFwibWFjOk1lbnVEaWRQb3BVcFwiLFxuXHRcdE1lbnVEaWRSZW1vdmVJdGVtOiBcIm1hYzpNZW51RGlkUmVtb3ZlSXRlbVwiLFxuXHRcdE1lbnVEaWRTZW5kQWN0aW9uOiBcIm1hYzpNZW51RGlkU2VuZEFjdGlvblwiLFxuXHRcdE1lbnVEaWRTZW5kQWN0aW9uVG9JdGVtOiBcIm1hYzpNZW51RGlkU2VuZEFjdGlvblRvSXRlbVwiLFxuXHRcdE1lbnVEaWRVcGRhdGU6IFwibWFjOk1lbnVEaWRVcGRhdGVcIixcblx0XHRNZW51V2lsbEFkZEl0ZW06IFwibWFjOk1lbnVXaWxsQWRkSXRlbVwiLFxuXHRcdE1lbnVXaWxsQmVnaW5UcmFja2luZzogXCJtYWM6TWVudVdpbGxCZWdpblRyYWNraW5nXCIsXG5cdFx0TWVudVdpbGxEaXNwbGF5SXRlbTogXCJtYWM6TWVudVdpbGxEaXNwbGF5SXRlbVwiLFxuXHRcdE1lbnVXaWxsRW5kVHJhY2tpbmc6IFwibWFjOk1lbnVXaWxsRW5kVHJhY2tpbmdcIixcblx0XHRNZW51V2lsbEhpZ2hsaWdodEl0ZW06IFwibWFjOk1lbnVXaWxsSGlnaGxpZ2h0SXRlbVwiLFxuXHRcdE1lbnVXaWxsT3BlbjogXCJtYWM6TWVudVdpbGxPcGVuXCIsXG5cdFx0TWVudVdpbGxQb3BVcDogXCJtYWM6TWVudVdpbGxQb3BVcFwiLFxuXHRcdE1lbnVXaWxsUmVtb3ZlSXRlbTogXCJtYWM6TWVudVdpbGxSZW1vdmVJdGVtXCIsXG5cdFx0TWVudVdpbGxTZW5kQWN0aW9uOiBcIm1hYzpNZW51V2lsbFNlbmRBY3Rpb25cIixcblx0XHRNZW51V2lsbFNlbmRBY3Rpb25Ub0l0ZW06IFwibWFjOk1lbnVXaWxsU2VuZEFjdGlvblRvSXRlbVwiLFxuXHRcdE1lbnVXaWxsVXBkYXRlOiBcIm1hYzpNZW51V2lsbFVwZGF0ZVwiLFxuXHRcdFdlYlZpZXdEaWRDb21taXROYXZpZ2F0aW9uOiBcIm1hYzpXZWJWaWV3RGlkQ29tbWl0TmF2aWdhdGlvblwiLFxuXHRcdFdlYlZpZXdEaWRGaW5pc2hOYXZpZ2F0aW9uOiBcIm1hYzpXZWJWaWV3RGlkRmluaXNoTmF2aWdhdGlvblwiLFxuXHRcdFdlYlZpZXdEaWRSZWNlaXZlU2VydmVyUmVkaXJlY3RGb3JQcm92aXNpb25hbE5hdmlnYXRpb246IFwibWFjOldlYlZpZXdEaWRSZWNlaXZlU2VydmVyUmVkaXJlY3RGb3JQcm92aXNpb25hbE5hdmlnYXRpb25cIixcblx0XHRXZWJWaWV3RGlkU3RhcnRQcm92aXNpb25hbE5hdmlnYXRpb246IFwibWFjOldlYlZpZXdEaWRTdGFydFByb3Zpc2lvbmFsTmF2aWdhdGlvblwiLFxuXHRcdFdpbmRvd0RpZEJlY29tZUtleTogXCJtYWM6V2luZG93RGlkQmVjb21lS2V5XCIsXG5cdFx0V2luZG93RGlkQmVjb21lTWFpbjogXCJtYWM6V2luZG93RGlkQmVjb21lTWFpblwiLFxuXHRcdFdpbmRvd0RpZEJlZ2luU2hlZXQ6IFwibWFjOldpbmRvd0RpZEJlZ2luU2hlZXRcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VBbHBoYTogXCJtYWM6V2luZG93RGlkQ2hhbmdlQWxwaGFcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VCYWNraW5nTG9jYXRpb246IFwibWFjOldpbmRvd0RpZENoYW5nZUJhY2tpbmdMb2NhdGlvblwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZUJhY2tpbmdQcm9wZXJ0aWVzOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VCYWNraW5nUHJvcGVydGllc1wiLFxuXHRcdFdpbmRvd0RpZENoYW5nZUNvbGxlY3Rpb25CZWhhdmlvcjogXCJtYWM6V2luZG93RGlkQ2hhbmdlQ29sbGVjdGlvbkJlaGF2aW9yXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlRWZmZWN0aXZlQXBwZWFyYW5jZTogXCJtYWM6V2luZG93RGlkQ2hhbmdlRWZmZWN0aXZlQXBwZWFyYW5jZVwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZU9jY2x1c2lvblN0YXRlOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VPY2NsdXNpb25TdGF0ZVwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZU9yZGVyaW5nTW9kZTogXCJtYWM6V2luZG93RGlkQ2hhbmdlT3JkZXJpbmdNb2RlXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlU2NyZWVuOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VTY3JlZW5cIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VTY3JlZW5QYXJhbWV0ZXJzOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VTY3JlZW5QYXJhbWV0ZXJzXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlU2NyZWVuUHJvZmlsZTogXCJtYWM6V2luZG93RGlkQ2hhbmdlU2NyZWVuUHJvZmlsZVwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZVNjcmVlblNwYWNlOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VTY3JlZW5TcGFjZVwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZVNjcmVlblNwYWNlUHJvcGVydGllczogXCJtYWM6V2luZG93RGlkQ2hhbmdlU2NyZWVuU3BhY2VQcm9wZXJ0aWVzXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlU2hhcmluZ1R5cGU6IFwibWFjOldpbmRvd0RpZENoYW5nZVNoYXJpbmdUeXBlXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlU3BhY2U6IFwibWFjOldpbmRvd0RpZENoYW5nZVNwYWNlXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlU3BhY2VPcmRlcmluZ01vZGU6IFwibWFjOldpbmRvd0RpZENoYW5nZVNwYWNlT3JkZXJpbmdNb2RlXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlVGl0bGU6IFwibWFjOldpbmRvd0RpZENoYW5nZVRpdGxlXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlVG9vbGJhcjogXCJtYWM6V2luZG93RGlkQ2hhbmdlVG9vbGJhclwiLFxuXHRcdFdpbmRvd0RpZERlbWluaWF0dXJpemU6IFwibWFjOldpbmRvd0RpZERlbWluaWF0dXJpemVcIixcblx0XHRXaW5kb3dEaWRFbmRTaGVldDogXCJtYWM6V2luZG93RGlkRW5kU2hlZXRcIixcblx0XHRXaW5kb3dEaWRFbnRlckZ1bGxTY3JlZW46IFwibWFjOldpbmRvd0RpZEVudGVyRnVsbFNjcmVlblwiLFxuXHRcdFdpbmRvd0RpZEVudGVyVmVyc2lvbkJyb3dzZXI6IFwibWFjOldpbmRvd0RpZEVudGVyVmVyc2lvbkJyb3dzZXJcIixcblx0XHRXaW5kb3dEaWRFeGl0RnVsbFNjcmVlbjogXCJtYWM6V2luZG93RGlkRXhpdEZ1bGxTY3JlZW5cIixcblx0XHRXaW5kb3dEaWRFeGl0VmVyc2lvbkJyb3dzZXI6IFwibWFjOldpbmRvd0RpZEV4aXRWZXJzaW9uQnJvd3NlclwiLFxuXHRcdFdpbmRvd0RpZEV4cG9zZTogXCJtYWM6V2luZG93RGlkRXhwb3NlXCIsXG5cdFx0V2luZG93RGlkRm9jdXM6IFwibWFjOldpbmRvd0RpZEZvY3VzXCIsXG5cdFx0V2luZG93RGlkTWluaWF0dXJpemU6IFwibWFjOldpbmRvd0RpZE1pbmlhdHVyaXplXCIsXG5cdFx0V2luZG93RGlkTW92ZTogXCJtYWM6V2luZG93RGlkTW92ZVwiLFxuXHRcdFdpbmRvd0RpZE9yZGVyT2ZmU2NyZWVuOiBcIm1hYzpXaW5kb3dEaWRPcmRlck9mZlNjcmVlblwiLFxuXHRcdFdpbmRvd0RpZE9yZGVyT25TY3JlZW46IFwibWFjOldpbmRvd0RpZE9yZGVyT25TY3JlZW5cIixcblx0XHRXaW5kb3dEaWRSZXNpZ25LZXk6IFwibWFjOldpbmRvd0RpZFJlc2lnbktleVwiLFxuXHRcdFdpbmRvd0RpZFJlc2lnbk1haW46IFwibWFjOldpbmRvd0RpZFJlc2lnbk1haW5cIixcblx0XHRXaW5kb3dEaWRSZXNpemU6IFwibWFjOldpbmRvd0RpZFJlc2l6ZVwiLFxuXHRcdFdpbmRvd0RpZFVwZGF0ZTogXCJtYWM6V2luZG93RGlkVXBkYXRlXCIsXG5cdFx0V2luZG93RGlkVXBkYXRlQWxwaGE6IFwibWFjOldpbmRvd0RpZFVwZGF0ZUFscGhhXCIsXG5cdFx0V2luZG93RGlkVXBkYXRlQ29sbGVjdGlvbkJlaGF2aW9yOiBcIm1hYzpXaW5kb3dEaWRVcGRhdGVDb2xsZWN0aW9uQmVoYXZpb3JcIixcblx0XHRXaW5kb3dEaWRVcGRhdGVDb2xsZWN0aW9uUHJvcGVydGllczogXCJtYWM6V2luZG93RGlkVXBkYXRlQ29sbGVjdGlvblByb3BlcnRpZXNcIixcblx0XHRXaW5kb3dEaWRVcGRhdGVTaGFkb3c6IFwibWFjOldpbmRvd0RpZFVwZGF0ZVNoYWRvd1wiLFxuXHRcdFdpbmRvd0RpZFVwZGF0ZVRpdGxlOiBcIm1hYzpXaW5kb3dEaWRVcGRhdGVUaXRsZVwiLFxuXHRcdFdpbmRvd0RpZFVwZGF0ZVRvb2xiYXI6IFwibWFjOldpbmRvd0RpZFVwZGF0ZVRvb2xiYXJcIixcblx0XHRXaW5kb3dEaWRab29tOiBcIm1hYzpXaW5kb3dEaWRab29tXCIsXG5cdFx0V2luZG93RmlsZURyYWdnaW5nRW50ZXJlZDogXCJtYWM6V2luZG93RmlsZURyYWdnaW5nRW50ZXJlZFwiLFxuXHRcdFdpbmRvd0ZpbGVEcmFnZ2luZ0V4aXRlZDogXCJtYWM6V2luZG93RmlsZURyYWdnaW5nRXhpdGVkXCIsXG5cdFx0V2luZG93RmlsZURyYWdnaW5nUGVyZm9ybWVkOiBcIm1hYzpXaW5kb3dGaWxlRHJhZ2dpbmdQZXJmb3JtZWRcIixcblx0XHRXaW5kb3dIaWRlOiBcIm1hYzpXaW5kb3dIaWRlXCIsXG5cdFx0V2luZG93TWF4aW1pc2U6IFwibWFjOldpbmRvd01heGltaXNlXCIsXG5cdFx0V2luZG93VW5NYXhpbWlzZTogXCJtYWM6V2luZG93VW5NYXhpbWlzZVwiLFxuXHRcdFdpbmRvd01pbmltaXNlOiBcIm1hYzpXaW5kb3dNaW5pbWlzZVwiLFxuXHRcdFdpbmRvd1VuTWluaW1pc2U6IFwibWFjOldpbmRvd1VuTWluaW1pc2VcIixcblx0XHRXaW5kb3dTaG91bGRDbG9zZTogXCJtYWM6V2luZG93U2hvdWxkQ2xvc2VcIixcblx0XHRXaW5kb3dTaG93OiBcIm1hYzpXaW5kb3dTaG93XCIsXG5cdFx0V2luZG93V2lsbEJlY29tZUtleTogXCJtYWM6V2luZG93V2lsbEJlY29tZUtleVwiLFxuXHRcdFdpbmRvd1dpbGxCZWNvbWVNYWluOiBcIm1hYzpXaW5kb3dXaWxsQmVjb21lTWFpblwiLFxuXHRcdFdpbmRvd1dpbGxCZWdpblNoZWV0OiBcIm1hYzpXaW5kb3dXaWxsQmVnaW5TaGVldFwiLFxuXHRcdFdpbmRvd1dpbGxDaGFuZ2VPcmRlcmluZ01vZGU6IFwibWFjOldpbmRvd1dpbGxDaGFuZ2VPcmRlcmluZ01vZGVcIixcblx0XHRXaW5kb3dXaWxsQ2xvc2U6IFwibWFjOldpbmRvd1dpbGxDbG9zZVwiLFxuXHRcdFdpbmRvd1dpbGxEZW1pbmlhdHVyaXplOiBcIm1hYzpXaW5kb3dXaWxsRGVtaW5pYXR1cml6ZVwiLFxuXHRcdFdpbmRvd1dpbGxFbnRlckZ1bGxTY3JlZW46IFwibWFjOldpbmRvd1dpbGxFbnRlckZ1bGxTY3JlZW5cIixcblx0XHRXaW5kb3dXaWxsRW50ZXJWZXJzaW9uQnJvd3NlcjogXCJtYWM6V2luZG93V2lsbEVudGVyVmVyc2lvbkJyb3dzZXJcIixcblx0XHRXaW5kb3dXaWxsRXhpdEZ1bGxTY3JlZW46IFwibWFjOldpbmRvd1dpbGxFeGl0RnVsbFNjcmVlblwiLFxuXHRcdFdpbmRvd1dpbGxFeGl0VmVyc2lvbkJyb3dzZXI6IFwibWFjOldpbmRvd1dpbGxFeGl0VmVyc2lvbkJyb3dzZXJcIixcblx0XHRXaW5kb3dXaWxsRm9jdXM6IFwibWFjOldpbmRvd1dpbGxGb2N1c1wiLFxuXHRcdFdpbmRvd1dpbGxNaW5pYXR1cml6ZTogXCJtYWM6V2luZG93V2lsbE1pbmlhdHVyaXplXCIsXG5cdFx0V2luZG93V2lsbE1vdmU6IFwibWFjOldpbmRvd1dpbGxNb3ZlXCIsXG5cdFx0V2luZG93V2lsbE9yZGVyT2ZmU2NyZWVuOiBcIm1hYzpXaW5kb3dXaWxsT3JkZXJPZmZTY3JlZW5cIixcblx0XHRXaW5kb3dXaWxsT3JkZXJPblNjcmVlbjogXCJtYWM6V2luZG93V2lsbE9yZGVyT25TY3JlZW5cIixcblx0XHRXaW5kb3dXaWxsUmVzaWduTWFpbjogXCJtYWM6V2luZG93V2lsbFJlc2lnbk1haW5cIixcblx0XHRXaW5kb3dXaWxsUmVzaXplOiBcIm1hYzpXaW5kb3dXaWxsUmVzaXplXCIsXG5cdFx0V2luZG93V2lsbFVuZm9jdXM6IFwibWFjOldpbmRvd1dpbGxVbmZvY3VzXCIsXG5cdFx0V2luZG93V2lsbFVwZGF0ZTogXCJtYWM6V2luZG93V2lsbFVwZGF0ZVwiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGVBbHBoYTogXCJtYWM6V2luZG93V2lsbFVwZGF0ZUFscGhhXCIsXG5cdFx0V2luZG93V2lsbFVwZGF0ZUNvbGxlY3Rpb25CZWhhdmlvcjogXCJtYWM6V2luZG93V2lsbFVwZGF0ZUNvbGxlY3Rpb25CZWhhdmlvclwiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGVDb2xsZWN0aW9uUHJvcGVydGllczogXCJtYWM6V2luZG93V2lsbFVwZGF0ZUNvbGxlY3Rpb25Qcm9wZXJ0aWVzXCIsXG5cdFx0V2luZG93V2lsbFVwZGF0ZVNoYWRvdzogXCJtYWM6V2luZG93V2lsbFVwZGF0ZVNoYWRvd1wiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGVUaXRsZTogXCJtYWM6V2luZG93V2lsbFVwZGF0ZVRpdGxlXCIsXG5cdFx0V2luZG93V2lsbFVwZGF0ZVRvb2xiYXI6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVUb29sYmFyXCIsXG5cdFx0V2luZG93V2lsbFVwZGF0ZVZpc2liaWxpdHk6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVWaXNpYmlsaXR5XCIsXG5cdFx0V2luZG93V2lsbFVzZVN0YW5kYXJkRnJhbWU6IFwibWFjOldpbmRvd1dpbGxVc2VTdGFuZGFyZEZyYW1lXCIsXG5cdFx0V2luZG93Wm9vbUluOiBcIm1hYzpXaW5kb3dab29tSW5cIixcblx0XHRXaW5kb3dab29tT3V0OiBcIm1hYzpXaW5kb3dab29tT3V0XCIsXG5cdFx0V2luZG93Wm9vbVJlc2V0OiBcIm1hYzpXaW5kb3dab29tUmVzZXRcIixcblx0fSksXG5cdExpbnV4OiBPYmplY3QuZnJlZXplKHtcblx0XHRBcHBsaWNhdGlvblN0YXJ0dXA6IFwibGludXg6QXBwbGljYXRpb25TdGFydHVwXCIsXG5cdFx0U3lzdGVtVGhlbWVDaGFuZ2VkOiBcImxpbnV4OlN5c3RlbVRoZW1lQ2hhbmdlZFwiLFxuXHRcdFdpbmRvd0RlbGV0ZUV2ZW50OiBcImxpbnV4OldpbmRvd0RlbGV0ZUV2ZW50XCIsXG5cdFx0V2luZG93RGlkTW92ZTogXCJsaW51eDpXaW5kb3dEaWRNb3ZlXCIsXG5cdFx0V2luZG93RGlkUmVzaXplOiBcImxpbnV4OldpbmRvd0RpZFJlc2l6ZVwiLFxuXHRcdFdpbmRvd0ZvY3VzSW46IFwibGludXg6V2luZG93Rm9jdXNJblwiLFxuXHRcdFdpbmRvd0ZvY3VzT3V0OiBcImxpbnV4OldpbmRvd0ZvY3VzT3V0XCIsXG5cdFx0V2luZG93TG9hZENoYW5nZWQ6IFwibGludXg6V2luZG93TG9hZENoYW5nZWRcIixcblx0fSksXG5cdENvbW1vbjogT2JqZWN0LmZyZWV6ZSh7XG5cdFx0QXBwbGljYXRpb25PcGVuZWRXaXRoRmlsZTogXCJjb21tb246QXBwbGljYXRpb25PcGVuZWRXaXRoRmlsZVwiLFxuXHRcdEFwcGxpY2F0aW9uU3RhcnRlZDogXCJjb21tb246QXBwbGljYXRpb25TdGFydGVkXCIsXG5cdFx0VGhlbWVDaGFuZ2VkOiBcImNvbW1vbjpUaGVtZUNoYW5nZWRcIixcblx0XHRXaW5kb3dDbG9zaW5nOiBcImNvbW1vbjpXaW5kb3dDbG9zaW5nXCIsXG5cdFx0V2luZG93RGlkTW92ZTogXCJjb21tb246V2luZG93RGlkTW92ZVwiLFxuXHRcdFdpbmRvd0RpZFJlc2l6ZTogXCJjb21tb246V2luZG93RGlkUmVzaXplXCIsXG5cdFx0V2luZG93RFBJQ2hhbmdlZDogXCJjb21tb246V2luZG93RFBJQ2hhbmdlZFwiLFxuXHRcdFdpbmRvd0ZpbGVzRHJvcHBlZDogXCJjb21tb246V2luZG93RmlsZXNEcm9wcGVkXCIsXG5cdFx0V2luZG93Rm9jdXM6IFwiY29tbW9uOldpbmRvd0ZvY3VzXCIsXG5cdFx0V2luZG93RnVsbHNjcmVlbjogXCJjb21tb246V2luZG93RnVsbHNjcmVlblwiLFxuXHRcdFdpbmRvd0hpZGU6IFwiY29tbW9uOldpbmRvd0hpZGVcIixcblx0XHRXaW5kb3dMb3N0Rm9jdXM6IFwiY29tbW9uOldpbmRvd0xvc3RGb2N1c1wiLFxuXHRcdFdpbmRvd01heGltaXNlOiBcImNvbW1vbjpXaW5kb3dNYXhpbWlzZVwiLFxuXHRcdFdpbmRvd01pbmltaXNlOiBcImNvbW1vbjpXaW5kb3dNaW5pbWlzZVwiLFxuXHRcdFdpbmRvd1Jlc3RvcmU6IFwiY29tbW9uOldpbmRvd1Jlc3RvcmVcIixcblx0XHRXaW5kb3dSdW50aW1lUmVhZHk6IFwiY29tbW9uOldpbmRvd1J1bnRpbWVSZWFkeVwiLFxuXHRcdFdpbmRvd1Nob3c6IFwiY29tbW9uOldpbmRvd1Nob3dcIixcblx0XHRXaW5kb3dVbkZ1bGxzY3JlZW46IFwiY29tbW9uOldpbmRvd1VuRnVsbHNjcmVlblwiLFxuXHRcdFdpbmRvd1VuTWF4aW1pc2U6IFwiY29tbW9uOldpbmRvd1VuTWF4aW1pc2VcIixcblx0XHRXaW5kb3dVbk1pbmltaXNlOiBcImNvbW1vbjpXaW5kb3dVbk1pbmltaXNlXCIsXG5cdFx0V2luZG93Wm9vbTogXCJjb21tb246V2luZG93Wm9vbVwiLFxuXHRcdFdpbmRvd1pvb21JbjogXCJjb21tb246V2luZG93Wm9vbUluXCIsXG5cdFx0V2luZG93Wm9vbU91dDogXCJjb21tb246V2luZG93Wm9vbU91dFwiLFxuXHRcdFdpbmRvd1pvb21SZXNldDogXCJjb21tb246V2luZG93Wm9vbVJlc2V0XCIsXG5cdH0pLFxufSk7XG4iLCAiLypcbiBfICAgICBfXyAgICAgXyBfX1xufCB8ICAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbi8qKlxuICogTG9ncyBhIG1lc3NhZ2UgdG8gdGhlIGNvbnNvbGUgd2l0aCBjdXN0b20gZm9ybWF0dGluZy5cbiAqXG4gKiBAcGFyYW0gbWVzc2FnZSAtIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlYnVnTG9nKG1lc3NhZ2U6IGFueSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAnJWMgd2FpbHMzICVjICcgKyBtZXNzYWdlICsgJyAnLFxuICAgICAgICAnYmFja2dyb3VuZDogI2FhMDAwMDsgY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDNweCAwcHggMHB4IDNweDsgcGFkZGluZzogMXB4OyBmb250LXNpemU6IDAuN3JlbScsXG4gICAgICAgICdiYWNrZ3JvdW5kOiAjMDA5OTAwOyBjb2xvcjogI2ZmZjsgYm9yZGVyLXJhZGl1czogMHB4IDNweCAzcHggMHB4OyBwYWRkaW5nOiAxcHg7IGZvbnQtc2l6ZTogMC43cmVtJ1xuICAgICk7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIHdlYnZpZXcgc3VwcG9ydHMgdGhlIHtAbGluayBNb3VzZUV2ZW50I2J1dHRvbnN9IHByb3BlcnR5LlxuICogTG9va2luZyBhdCB5b3UgbWFjT1MgSGlnaCBTaWVycmEhXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYW5UcmFja0J1dHRvbnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChuZXcgTW91c2VFdmVudCgnbW91c2Vkb3duJykpLmJ1dHRvbnMgPT09IDA7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIGJyb3dzZXIgc3VwcG9ydHMgcmVtb3ZpbmcgbGlzdGVuZXJzIGJ5IHRyaWdnZXJpbmcgYW4gQWJvcnRTaWduYWxcbiAqIChzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0V2ZW50VGFyZ2V0L2FkZEV2ZW50TGlzdGVuZXIjc2lnbmFsKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbkFib3J0TGlzdGVuZXJzKCkge1xuICAgIGlmICghRXZlbnRUYXJnZXQgfHwgIUFib3J0U2lnbmFsIHx8ICFBYm9ydENvbnRyb2xsZXIpXG4gICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIGxldCByZXN1bHQgPSB0cnVlO1xuXG4gICAgY29uc3QgdGFyZ2V0ID0gbmV3IEV2ZW50VGFyZ2V0KCk7XG4gICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigndGVzdCcsICgpID0+IHsgcmVzdWx0ID0gZmFsc2U7IH0sIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9KTtcbiAgICBjb250cm9sbGVyLmFib3J0KCk7XG4gICAgdGFyZ2V0LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCd0ZXN0JykpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqKlxuIFRoaXMgdGVjaG5pcXVlIGZvciBwcm9wZXIgbG9hZCBkZXRlY3Rpb24gaXMgdGFrZW4gZnJvbSBIVE1YOlxuXG4gQlNEIDItQ2xhdXNlIExpY2Vuc2VcblxuIENvcHlyaWdodCAoYykgMjAyMCwgQmlnIFNreSBTb2Z0d2FyZVxuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cbiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcblxuIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuXG4gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb25cbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cblxuIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4gQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEVcbiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTFxuIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SXG4gU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVJcbiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLFxuIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFXG4gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cblxuICoqKi9cblxubGV0IGlzUmVhZHkgPSBmYWxzZTtcbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB7IGlzUmVhZHkgPSB0cnVlIH0pO1xuXG5leHBvcnQgZnVuY3Rpb24gd2hlblJlYWR5KGNhbGxiYWNrOiAoKSA9PiB2b2lkKSB7XG4gICAgaWYgKGlzUmVhZHkgfHwgZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJykge1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBjYWxsYmFjayk7XG4gICAgfVxufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5pbXBvcnQge25ld1J1bnRpbWVDYWxsZXIsIG9iamVjdE5hbWVzfSBmcm9tIFwiLi9ydW50aW1lLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNjcmVlbiB9IGZyb20gXCIuL3NjcmVlbnMuanNcIjtcblxuY29uc3QgUG9zaXRpb25NZXRob2QgICAgICAgICAgICAgICAgICAgID0gMDtcbmNvbnN0IENlbnRlck1ldGhvZCAgICAgICAgICAgICAgICAgICAgICA9IDE7XG5jb25zdCBDbG9zZU1ldGhvZCAgICAgICAgICAgICAgICAgICAgICAgPSAyO1xuY29uc3QgRGlzYWJsZVNpemVDb25zdHJhaW50c01ldGhvZCAgICAgID0gMztcbmNvbnN0IEVuYWJsZVNpemVDb25zdHJhaW50c01ldGhvZCAgICAgICA9IDQ7XG5jb25zdCBGb2N1c01ldGhvZCAgICAgICAgICAgICAgICAgICAgICAgPSA1O1xuY29uc3QgRm9yY2VSZWxvYWRNZXRob2QgICAgICAgICAgICAgICAgID0gNjtcbmNvbnN0IEZ1bGxzY3JlZW5NZXRob2QgICAgICAgICAgICAgICAgICA9IDc7XG5jb25zdCBHZXRTY3JlZW5NZXRob2QgICAgICAgICAgICAgICAgICAgPSA4O1xuY29uc3QgR2V0Wm9vbU1ldGhvZCAgICAgICAgICAgICAgICAgICAgID0gOTtcbmNvbnN0IEhlaWdodE1ldGhvZCAgICAgICAgICAgICAgICAgICAgICA9IDEwO1xuY29uc3QgSGlkZU1ldGhvZCAgICAgICAgICAgICAgICAgICAgICAgID0gMTE7XG5jb25zdCBJc0ZvY3VzZWRNZXRob2QgICAgICAgICAgICAgICAgICAgPSAxMjtcbmNvbnN0IElzRnVsbHNjcmVlbk1ldGhvZCAgICAgICAgICAgICAgICA9IDEzO1xuY29uc3QgSXNNYXhpbWlzZWRNZXRob2QgICAgICAgICAgICAgICAgID0gMTQ7XG5jb25zdCBJc01pbmltaXNlZE1ldGhvZCAgICAgICAgICAgICAgICAgPSAxNTtcbmNvbnN0IE1heGltaXNlTWV0aG9kICAgICAgICAgICAgICAgICAgICA9IDE2O1xuY29uc3QgTWluaW1pc2VNZXRob2QgICAgICAgICAgICAgICAgICAgID0gMTc7XG5jb25zdCBOYW1lTWV0aG9kICAgICAgICAgICAgICAgICAgICAgICAgPSAxODtcbmNvbnN0IE9wZW5EZXZUb29sc01ldGhvZCAgICAgICAgICAgICAgICA9IDE5O1xuY29uc3QgUmVsYXRpdmVQb3NpdGlvbk1ldGhvZCAgICAgICAgICAgID0gMjA7XG5jb25zdCBSZWxvYWRNZXRob2QgICAgICAgICAgICAgICAgICAgICAgPSAyMTtcbmNvbnN0IFJlc2l6YWJsZU1ldGhvZCAgICAgICAgICAgICAgICAgICA9IDIyO1xuY29uc3QgUmVzdG9yZU1ldGhvZCAgICAgICAgICAgICAgICAgICAgID0gMjM7XG5jb25zdCBTZXRQb3NpdGlvbk1ldGhvZCAgICAgICAgICAgICAgICAgPSAyNDtcbmNvbnN0IFNldEFsd2F5c09uVG9wTWV0aG9kICAgICAgICAgICAgICA9IDI1O1xuY29uc3QgU2V0QmFja2dyb3VuZENvbG91ck1ldGhvZCAgICAgICAgID0gMjY7XG5jb25zdCBTZXRGcmFtZWxlc3NNZXRob2QgICAgICAgICAgICAgICAgPSAyNztcbmNvbnN0IFNldEZ1bGxzY3JlZW5CdXR0b25FbmFibGVkTWV0aG9kICA9IDI4O1xuY29uc3QgU2V0TWF4U2l6ZU1ldGhvZCAgICAgICAgICAgICAgICAgID0gMjk7XG5jb25zdCBTZXRNaW5TaXplTWV0aG9kICAgICAgICAgICAgICAgICAgPSAzMDtcbmNvbnN0IFNldFJlbGF0aXZlUG9zaXRpb25NZXRob2QgICAgICAgICA9IDMxO1xuY29uc3QgU2V0UmVzaXphYmxlTWV0aG9kICAgICAgICAgICAgICAgID0gMzI7XG5jb25zdCBTZXRTaXplTWV0aG9kICAgICAgICAgICAgICAgICAgICAgPSAzMztcbmNvbnN0IFNldFRpdGxlTWV0aG9kICAgICAgICAgICAgICAgICAgICA9IDM0O1xuY29uc3QgU2V0Wm9vbU1ldGhvZCAgICAgICAgICAgICAgICAgICAgID0gMzU7XG5jb25zdCBTaG93TWV0aG9kICAgICAgICAgICAgICAgICAgICAgICAgPSAzNjtcbmNvbnN0IFNpemVNZXRob2QgICAgICAgICAgICAgICAgICAgICAgICA9IDM3O1xuY29uc3QgVG9nZ2xlRnVsbHNjcmVlbk1ldGhvZCAgICAgICAgICAgID0gMzg7XG5jb25zdCBUb2dnbGVNYXhpbWlzZU1ldGhvZCAgICAgICAgICAgICAgPSAzOTtcbmNvbnN0IFVuRnVsbHNjcmVlbk1ldGhvZCAgICAgICAgICAgICAgICA9IDQwO1xuY29uc3QgVW5NYXhpbWlzZU1ldGhvZCAgICAgICAgICAgICAgICAgID0gNDE7XG5jb25zdCBVbk1pbmltaXNlTWV0aG9kICAgICAgICAgICAgICAgICAgPSA0MjtcbmNvbnN0IFdpZHRoTWV0aG9kICAgICAgICAgICAgICAgICAgICAgICA9IDQzO1xuY29uc3QgWm9vbU1ldGhvZCAgICAgICAgICAgICAgICAgICAgICAgID0gNDQ7XG5jb25zdCBab29tSW5NZXRob2QgICAgICAgICAgICAgICAgICAgICAgPSA0NTtcbmNvbnN0IFpvb21PdXRNZXRob2QgICAgICAgICAgICAgICAgICAgICA9IDQ2O1xuY29uc3QgWm9vbVJlc2V0TWV0aG9kICAgICAgICAgICAgICAgICAgID0gNDc7XG5cbi8qKlxuICogQSByZWNvcmQgZGVzY3JpYmluZyB0aGUgcG9zaXRpb24gb2YgYSB3aW5kb3cuXG4gKi9cbmludGVyZmFjZSBQb3NpdGlvbiB7XG4gICAgLyoqIFRoZSBob3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoZSB3aW5kb3cuICovXG4gICAgeDogbnVtYmVyO1xuICAgIC8qKiBUaGUgdmVydGljYWwgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy4gKi9cbiAgICB5OiBudW1iZXI7XG59XG5cbi8qKlxuICogQSByZWNvcmQgZGVzY3JpYmluZyB0aGUgc2l6ZSBvZiBhIHdpbmRvdy5cbiAqL1xuaW50ZXJmYWNlIFNpemUge1xuICAgIC8qKiBUaGUgd2lkdGggb2YgdGhlIHdpbmRvdy4gKi9cbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIC8qKiBUaGUgaGVpZ2h0IG9mIHRoZSB3aW5kb3cuICovXG4gICAgaGVpZ2h0OiBudW1iZXI7XG59XG5cbi8vIFByaXZhdGUgZmllbGQgbmFtZXMuXG5jb25zdCBjYWxsZXJTeW0gPSBTeW1ib2woXCJjYWxsZXJcIik7XG5cbmNsYXNzIFdpbmRvdyB7XG4gICAgLy8gUHJpdmF0ZSBmaWVsZHMuXG4gICAgcHJpdmF0ZSBbY2FsbGVyU3ltXTogKG1lc3NhZ2U6IG51bWJlciwgYXJncz86IGFueSkgPT4gUHJvbWlzZTxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGlzZXMgYSB3aW5kb3cgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YXJnZXQgd2luZG93LlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZyA9ICcnKSB7XG4gICAgICAgIHRoaXNbY2FsbGVyU3ltXSA9IG5ld1J1bnRpbWVDYWxsZXIob2JqZWN0TmFtZXMuV2luZG93LCBuYW1lKVxuXG4gICAgICAgIC8vIGJpbmQgaW5zdGFuY2UgbWV0aG9kIHRvIG1ha2UgdGhlbSBlYXNpbHkgdXNhYmxlIGluIGV2ZW50IGhhbmRsZXJzXG4gICAgICAgIGZvciAoY29uc3QgbWV0aG9kIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKFdpbmRvdy5wcm90b3R5cGUpKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgbWV0aG9kICE9PSBcImNvbnN0cnVjdG9yXCJcbiAgICAgICAgICAgICAgICAmJiB0eXBlb2YgKHRoaXMgYXMgYW55KVttZXRob2RdID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICh0aGlzIGFzIGFueSlbbWV0aG9kXSA9ICh0aGlzIGFzIGFueSlbbWV0aG9kXS5iaW5kKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgc3BlY2lmaWVkIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHdpbmRvdyB0byBnZXQuXG4gICAgICogQHJldHVybnMgVGhlIGNvcnJlc3BvbmRpbmcgd2luZG93IG9iamVjdC5cbiAgICAgKi9cbiAgICBHZXQobmFtZTogc3RyaW5nKTogV2luZG93IHtcbiAgICAgICAgcmV0dXJuIG5ldyBXaW5kb3cobmFtZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IGFic29sdXRlIHBvc2l0aW9uIG9mIHRoZSB3aW5kb3cuXG4gICAgICovXG4gICAgUG9zaXRpb24oKTogUHJvbWlzZTxQb3NpdGlvbj4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFBvc2l0aW9uTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDZW50ZXJzIHRoZSB3aW5kb3cgb24gdGhlIHNjcmVlbi5cbiAgICAgKi9cbiAgICBDZW50ZXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oQ2VudGVyTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBDbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShDbG9zZU1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZXMgbWluL21heCBzaXplIGNvbnN0cmFpbnRzLlxuICAgICAqL1xuICAgIERpc2FibGVTaXplQ29uc3RyYWludHMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oRGlzYWJsZVNpemVDb25zdHJhaW50c01ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyBtaW4vbWF4IHNpemUgY29uc3RyYWludHMuXG4gICAgICovXG4gICAgRW5hYmxlU2l6ZUNvbnN0cmFpbnRzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEVuYWJsZVNpemVDb25zdHJhaW50c01ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9jdXNlcyB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIEZvY3VzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEZvY3VzTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JjZXMgdGhlIHdpbmRvdyB0byByZWxvYWQgdGhlIHBhZ2UgYXNzZXRzLlxuICAgICAqL1xuICAgIEZvcmNlUmVsb2FkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEZvcmNlUmVsb2FkTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTd2l0Y2hlcyB0aGUgd2luZG93IHRvIGZ1bGxzY3JlZW4gbW9kZS5cbiAgICAgKi9cbiAgICBGdWxsc2NyZWVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEZ1bGxzY3JlZW5NZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHNjcmVlbiB0aGF0IHRoZSB3aW5kb3cgaXMgb24uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgc2NyZWVuIHRoZSB3aW5kb3cgaXMgY3VycmVudGx5IG9uLlxuICAgICAqL1xuICAgIEdldFNjcmVlbigpOiBQcm9taXNlPFNjcmVlbj4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEdldFNjcmVlbk1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudCB6b29tIGxldmVsIG9mIHRoZSB3aW5kb3cuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCB6b29tIGxldmVsLlxuICAgICAqL1xuICAgIEdldFpvb20oKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShHZXRab29tTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBoZWlnaHQgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IGhlaWdodCBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIEhlaWdodCgpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEhlaWdodE1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGlkZXMgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBIaWRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEhpZGVNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgd2luZG93IGlzIGZvY3VzZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSB3aW5kb3cgaXMgY3VycmVudGx5IGZvY3VzZWQuXG4gICAgICovXG4gICAgSXNGb2N1c2VkKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKElzRm9jdXNlZE1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB3aW5kb3cgaXMgZnVsbHNjcmVlbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIHdpbmRvdyBpcyBjdXJyZW50bHkgZnVsbHNjcmVlbi5cbiAgICAgKi9cbiAgICBJc0Z1bGxzY3JlZW4oKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oSXNGdWxsc2NyZWVuTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHdpbmRvdyBpcyBtYXhpbWlzZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSB3aW5kb3cgaXMgY3VycmVudGx5IG1heGltaXNlZC5cbiAgICAgKi9cbiAgICBJc01heGltaXNlZCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShJc01heGltaXNlZE1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB3aW5kb3cgaXMgbWluaW1pc2VkLlxuICAgICAqXG4gICAgICogQHJldHVybnMgV2hldGhlciB0aGUgd2luZG93IGlzIGN1cnJlbnRseSBtaW5pbWlzZWQuXG4gICAgICovXG4gICAgSXNNaW5pbWlzZWQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oSXNNaW5pbWlzZWRNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1heGltaXNlcyB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIE1heGltaXNlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKE1heGltaXNlTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNaW5pbWlzZXMgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBNaW5pbWlzZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShNaW5pbWlzZU1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgd2luZG93LlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIG5hbWUgb2YgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBOYW1lKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oTmFtZU1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3BlbnMgdGhlIGRldmVsb3BtZW50IHRvb2xzIHBhbmUuXG4gICAgICovXG4gICAgT3BlbkRldlRvb2xzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKE9wZW5EZXZUb29sc01ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcmVsYXRpdmUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdyB0byB0aGUgc2NyZWVuLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIGN1cnJlbnQgcmVsYXRpdmUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBSZWxhdGl2ZVBvc2l0aW9uKCk6IFByb21pc2U8UG9zaXRpb24+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShSZWxhdGl2ZVBvc2l0aW9uTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWxvYWRzIHRoZSBwYWdlIGFzc2V0cy5cbiAgICAgKi9cbiAgICBSZWxvYWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oUmVsb2FkTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHdpbmRvdyBpcyByZXNpemFibGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSB3aW5kb3cgaXMgY3VycmVudGx5IHJlc2l6YWJsZS5cbiAgICAgKi9cbiAgICBSZXNpemFibGUoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oUmVzaXphYmxlTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXN0b3JlcyB0aGUgd2luZG93IHRvIGl0cyBwcmV2aW91cyBzdGF0ZSBpZiBpdCB3YXMgcHJldmlvdXNseSBtaW5pbWlzZWQsIG1heGltaXNlZCBvciBmdWxsc2NyZWVuLlxuICAgICAqL1xuICAgIFJlc3RvcmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oUmVzdG9yZU1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB4IC0gVGhlIGRlc2lyZWQgaG9yaXpvbnRhbCBhYnNvbHV0ZSBwb3NpdGlvbiBvZiB0aGUgd2luZG93LlxuICAgICAqIEBwYXJhbSB5IC0gVGhlIGRlc2lyZWQgdmVydGljYWwgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBTZXRQb3NpdGlvbih4OiBudW1iZXIsIHk6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFNldFBvc2l0aW9uTWV0aG9kLCB7IHgsIHkgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgd2luZG93IHRvIGJlIGFsd2F5cyBvbiB0b3AuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYWx3YXlzT25Ub3AgLSBXaGV0aGVyIHRoZSB3aW5kb3cgc2hvdWxkIHN0YXkgb24gdG9wLlxuICAgICAqL1xuICAgIFNldEFsd2F5c09uVG9wKGFsd2F5c09uVG9wOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2V0QWx3YXlzT25Ub3BNZXRob2QsIHsgYWx3YXlzT25Ub3AgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgYmFja2dyb3VuZCBjb2xvdXIgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByIC0gVGhlIGRlc2lyZWQgcmVkIGNvbXBvbmVudCBvZiB0aGUgd2luZG93IGJhY2tncm91bmQuXG4gICAgICogQHBhcmFtIGcgLSBUaGUgZGVzaXJlZCBncmVlbiBjb21wb25lbnQgb2YgdGhlIHdpbmRvdyBiYWNrZ3JvdW5kLlxuICAgICAqIEBwYXJhbSBiIC0gVGhlIGRlc2lyZWQgYmx1ZSBjb21wb25lbnQgb2YgdGhlIHdpbmRvdyBiYWNrZ3JvdW5kLlxuICAgICAqIEBwYXJhbSBhIC0gVGhlIGRlc2lyZWQgYWxwaGEgY29tcG9uZW50IG9mIHRoZSB3aW5kb3cgYmFja2dyb3VuZC5cbiAgICAgKi9cbiAgICBTZXRCYWNrZ3JvdW5kQ29sb3VyKHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIsIGE6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFNldEJhY2tncm91bmRDb2xvdXJNZXRob2QsIHsgciwgZywgYiwgYSB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSB3aW5kb3cgZnJhbWUgYW5kIHRpdGxlIGJhci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmcmFtZWxlc3MgLSBXaGV0aGVyIHRoZSB3aW5kb3cgc2hvdWxkIGJlIGZyYW1lbGVzcy5cbiAgICAgKi9cbiAgICBTZXRGcmFtZWxlc3MoZnJhbWVsZXNzOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2V0RnJhbWVsZXNzTWV0aG9kLCB7IGZyYW1lbGVzcyB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlcyB0aGUgc3lzdGVtIGZ1bGxzY3JlZW4gYnV0dG9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVuYWJsZWQgLSBXaGV0aGVyIHRoZSBmdWxsc2NyZWVuIGJ1dHRvbiBzaG91bGQgYmUgZW5hYmxlZC5cbiAgICAgKi9cbiAgICBTZXRGdWxsc2NyZWVuQnV0dG9uRW5hYmxlZChlbmFibGVkOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2V0RnVsbHNjcmVlbkJ1dHRvbkVuYWJsZWRNZXRob2QsIHsgZW5hYmxlZCB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB3aWR0aCAtIFRoZSBkZXNpcmVkIG1heGltdW0gd2lkdGggb2YgdGhlIHdpbmRvdy5cbiAgICAgKiBAcGFyYW0gaGVpZ2h0IC0gVGhlIGRlc2lyZWQgbWF4aW11bSBoZWlnaHQgb2YgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBTZXRNYXhTaXplKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2V0TWF4U2l6ZU1ldGhvZCwgeyB3aWR0aCwgaGVpZ2h0IH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIG1pbmltdW0gc2l6ZSBvZiB0aGUgd2luZG93LlxuICAgICAqXG4gICAgICogQHBhcmFtIHdpZHRoIC0gVGhlIGRlc2lyZWQgbWluaW11bSB3aWR0aCBvZiB0aGUgd2luZG93LlxuICAgICAqIEBwYXJhbSBoZWlnaHQgLSBUaGUgZGVzaXJlZCBtaW5pbXVtIGhlaWdodCBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFNldE1pblNpemUod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShTZXRNaW5TaXplTWV0aG9kLCB7IHdpZHRoLCBoZWlnaHQgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcmVsYXRpdmUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdyB0byB0aGUgc2NyZWVuLlxuICAgICAqXG4gICAgICogQHBhcmFtIHggLSBUaGUgZGVzaXJlZCBob3Jpem9udGFsIHJlbGF0aXZlIHBvc2l0aW9uIG9mIHRoZSB3aW5kb3cuXG4gICAgICogQHBhcmFtIHkgLSBUaGUgZGVzaXJlZCB2ZXJ0aWNhbCByZWxhdGl2ZSBwb3NpdGlvbiBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFNldFJlbGF0aXZlUG9zaXRpb24oeDogbnVtYmVyLCB5OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShTZXRSZWxhdGl2ZVBvc2l0aW9uTWV0aG9kLCB7IHgsIHkgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB3aGV0aGVyIHRoZSB3aW5kb3cgaXMgcmVzaXphYmxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlc2l6YWJsZSAtIFdoZXRoZXIgdGhlIHdpbmRvdyBzaG91bGQgYmUgcmVzaXphYmxlLlxuICAgICAqL1xuICAgIFNldFJlc2l6YWJsZShyZXNpemFibGU6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShTZXRSZXNpemFibGVNZXRob2QsIHsgcmVzaXphYmxlIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHNpemUgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB3aWR0aCAtIFRoZSBkZXNpcmVkIHdpZHRoIG9mIHRoZSB3aW5kb3cuXG4gICAgICogQHBhcmFtIGhlaWdodCAtIFRoZSBkZXNpcmVkIGhlaWdodCBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFNldFNpemUod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShTZXRTaXplTWV0aG9kLCB7IHdpZHRoLCBoZWlnaHQgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdGl0bGUgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0aXRsZSAtIFRoZSBkZXNpcmVkIHRpdGxlIG9mIHRoZSB3aW5kb3cuXG4gICAgICovXG4gICAgU2V0VGl0bGUodGl0bGU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFNldFRpdGxlTWV0aG9kLCB7IHRpdGxlIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHpvb20gbGV2ZWwgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB6b29tIC0gVGhlIGRlc2lyZWQgem9vbSBsZXZlbC5cbiAgICAgKi9cbiAgICBTZXRab29tKHpvb206IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFNldFpvb21NZXRob2QsIHsgem9vbSB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTaG93cyB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFNob3coKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2hvd01ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgd2luZG93LlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFNpemUoKTogUHJvbWlzZTxTaXplPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2l6ZU1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG9nZ2xlcyB0aGUgd2luZG93IGJldHdlZW4gZnVsbHNjcmVlbiBhbmQgbm9ybWFsLlxuICAgICAqL1xuICAgIFRvZ2dsZUZ1bGxzY3JlZW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oVG9nZ2xlRnVsbHNjcmVlbk1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG9nZ2xlcyB0aGUgd2luZG93IGJldHdlZW4gbWF4aW1pc2VkIGFuZCBub3JtYWwuXG4gICAgICovXG4gICAgVG9nZ2xlTWF4aW1pc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oVG9nZ2xlTWF4aW1pc2VNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVuLWZ1bGxzY3JlZW5zIHRoZSB3aW5kb3cuXG4gICAgICovXG4gICAgVW5GdWxsc2NyZWVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFVuRnVsbHNjcmVlbk1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVW4tbWF4aW1pc2VzIHRoZSB3aW5kb3cuXG4gICAgICovXG4gICAgVW5NYXhpbWlzZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShVbk1heGltaXNlTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVbi1taW5pbWlzZXMgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBVbk1pbmltaXNlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFVuTWluaW1pc2VNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHdpZHRoIG9mIHRoZSB3aW5kb3cuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCB3aWR0aCBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFdpZHRoKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oV2lkdGhNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFpvb21zIHRoZSB3aW5kb3cuXG4gICAgICovXG4gICAgWm9vbSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShab29tTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbmNyZWFzZXMgdGhlIHpvb20gbGV2ZWwgb2YgdGhlIHdlYnZpZXcgY29udGVudC5cbiAgICAgKi9cbiAgICBab29tSW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oWm9vbUluTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWNyZWFzZXMgdGhlIHpvb20gbGV2ZWwgb2YgdGhlIHdlYnZpZXcgY29udGVudC5cbiAgICAgKi9cbiAgICBab29tT3V0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFpvb21PdXRNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUgem9vbSBsZXZlbCBvZiB0aGUgd2VidmlldyBjb250ZW50LlxuICAgICAqL1xuICAgIFpvb21SZXNldCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShab29tUmVzZXRNZXRob2QpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBUaGUgd2luZG93IHdpdGhpbiB3aGljaCB0aGUgc2NyaXB0IGlzIHJ1bm5pbmcuXG4gKi9cbmNvbnN0IHRoaXNXaW5kb3cgPSBuZXcgV2luZG93KCcnKTtcblxuZXhwb3J0IGRlZmF1bHQgdGhpc1dpbmRvdztcbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuaW1wb3J0ICogYXMgUnVudGltZSBmcm9tIFwiLi4vQHdhaWxzaW8vcnVudGltZS9zcmNcIjtcblxuLy8gTk9URTogdGhlIGZvbGxvd2luZyBtZXRob2RzIE1VU1QgYmUgaW1wb3J0ZWQgZXhwbGljaXRseSBiZWNhdXNlIG9mIGhvdyBlc2J1aWxkIGluamVjdGlvbiB3b3Jrc1xuaW1wb3J0IHsgRW5hYmxlIGFzIEVuYWJsZVdNTCB9IGZyb20gXCIuLi9Ad2FpbHNpby9ydW50aW1lL3NyYy93bWxcIjtcbmltcG9ydCB7IGRlYnVnTG9nIH0gZnJvbSBcIi4uL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3V0aWxzXCI7XG5cbndpbmRvdy53YWlscyA9IFJ1bnRpbWU7XG5FbmFibGVXTUwoKTtcblxuaWYgKERFQlVHKSB7XG4gICAgZGVidWdMb2coXCJXYWlscyBSdW50aW1lIExvYWRlZFwiKVxufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5pbXBvcnQgeyBuZXdSdW50aW1lQ2FsbGVyLCBvYmplY3ROYW1lcyB9IGZyb20gXCIuL3J1bnRpbWUuanNcIjtcblxubGV0IGNhbGwgPSBuZXdSdW50aW1lQ2FsbGVyKG9iamVjdE5hbWVzLlN5c3RlbSk7XG5cbmNvbnN0IFN5c3RlbUlzRGFya01vZGUgPSAwO1xuY29uc3QgU3lzdGVtRW52aXJvbm1lbnQgPSAxO1xuXG5jb25zdCBfaW52b2tlID0gKGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAoKHdpbmRvdyBhcyBhbnkpLmNocm9tZT8ud2Vidmlldz8ucG9zdE1lc3NhZ2UpIHtcbiAgICAgICAgICAgIHJldHVybiAod2luZG93IGFzIGFueSkuY2hyb21lLndlYnZpZXcucG9zdE1lc3NhZ2UuYmluZCgod2luZG93IGFzIGFueSkuY2hyb21lLndlYnZpZXcpO1xuICAgICAgICB9IGVsc2UgaWYgKCh3aW5kb3cgYXMgYW55KS53ZWJraXQ/Lm1lc3NhZ2VIYW5kbGVycz8uWydleHRlcm5hbCddPy5wb3N0TWVzc2FnZSkge1xuICAgICAgICAgICAgcmV0dXJuICh3aW5kb3cgYXMgYW55KS53ZWJraXQubWVzc2FnZUhhbmRsZXJzWydleHRlcm5hbCddLnBvc3RNZXNzYWdlLmJpbmQoKHdpbmRvdyBhcyBhbnkpLndlYmtpdC5tZXNzYWdlSGFuZGxlcnNbJ2V4dGVybmFsJ10pO1xuICAgICAgICB9XG4gICAgfSBjYXRjaChlKSB7fVxuXG4gICAgY29uc29sZS53YXJuKCdcXG4lY1x1MjZBMFx1RkUwRiBCcm93c2VyIEVudmlyb25tZW50IERldGVjdGVkICVjXFxuXFxuJWNPbmx5IFVJIHByZXZpZXdzIGFyZSBhdmFpbGFibGUgaW4gdGhlIGJyb3dzZXIuIEZvciBmdWxsIGZ1bmN0aW9uYWxpdHksIHBsZWFzZSBydW4gdGhlIGFwcGxpY2F0aW9uIGluIGRlc2t0b3AgbW9kZS5cXG5Nb3JlIGluZm9ybWF0aW9uIGF0OiBodHRwczovL3YzLndhaWxzLmlvL2xlYXJuL2J1aWxkLyN1c2luZy1hLWJyb3dzZXItZm9yLWRldmVsb3BtZW50XFxuJyxcbiAgICAgICAgJ2JhY2tncm91bmQ6ICNmZmZmZmY7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgcGFkZGluZzogNHB4IDhweDsgYm9yZGVyLXJhZGl1czogNHB4OyBib3JkZXI6IDJweCBzb2xpZCAjMDAwMDAwOycsXG4gICAgICAgICdiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsnLFxuICAgICAgICAnY29sb3I6ICNmZmZmZmY7IGZvbnQtc3R5bGU6IGl0YWxpYzsgZm9udC13ZWlnaHQ6IGJvbGQ7Jyk7XG4gICAgcmV0dXJuIG51bGw7XG59KSgpO1xuXG5leHBvcnQgZnVuY3Rpb24gaW52b2tlKG1zZzogYW55KTogdm9pZCB7XG4gICAgcmV0dXJuIF9pbnZva2U/Lihtc2cpO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgc3lzdGVtIGRhcmsgbW9kZSBzdGF0dXMuXG4gKlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYSBib29sZWFuIHZhbHVlIGluZGljYXRpbmcgaWYgdGhlIHN5c3RlbSBpcyBpbiBkYXJrIG1vZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBJc0RhcmtNb2RlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBjYWxsKFN5c3RlbUlzRGFya01vZGUpO1xufVxuXG4vKipcbiAqIEZldGNoZXMgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUgYXBwbGljYXRpb24gZnJvbSB0aGUgc2VydmVyLlxuICpcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBjYXBhYmlsaXRpZXMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBDYXBhYmlsaXRpZXMoKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXCIvd2FpbHMvY2FwYWJpbGl0aWVzXCIpO1xuICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImNvdWxkIG5vdCBmZXRjaCBjYXBhYmlsaXRpZXM6IFwiICsgcmVzcG9uc2Uuc3RhdHVzVGV4dCk7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9TSW5mbyB7XG4gICAgLyoqIFRoZSBicmFuZGluZyBvZiB0aGUgT1MuICovXG4gICAgQnJhbmRpbmc6IHN0cmluZztcbiAgICAvKiogVGhlIElEIG9mIHRoZSBPUy4gKi9cbiAgICBJRDogc3RyaW5nO1xuICAgIC8qKiBUaGUgbmFtZSBvZiB0aGUgT1MuICovXG4gICAgTmFtZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgdmVyc2lvbiBvZiB0aGUgT1MuICovXG4gICAgVmVyc2lvbjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVudmlyb25tZW50SW5mbyB7XG4gICAgLyoqIFRoZSBhcmNoaXRlY3R1cmUgb2YgdGhlIHN5c3RlbS4gKi9cbiAgICBBcmNoOiBzdHJpbmc7XG4gICAgLyoqIFRydWUgaWYgdGhlIGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcgaW4gZGVidWcgbW9kZSwgb3RoZXJ3aXNlIGZhbHNlLiAqL1xuICAgIERlYnVnOiBib29sZWFuO1xuICAgIC8qKiBUaGUgb3BlcmF0aW5nIHN5c3RlbSBpbiB1c2UuICovXG4gICAgT1M6IHN0cmluZztcbiAgICAvKiogRGV0YWlscyBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbS4gKi9cbiAgICBPU0luZm86IE9TSW5mbztcbiAgICAvKiogQWRkaXRpb25hbCBwbGF0Zm9ybSBpbmZvcm1hdGlvbi4gKi9cbiAgICBQbGF0Zm9ybUluZm86IFJlY29yZDxzdHJpbmcsIGFueT47XG59XG5cbi8qKlxuICogUmV0cmlldmVzIGVudmlyb25tZW50IGRldGFpbHMuXG4gKlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gb2JqZWN0IGNvbnRhaW5pbmcgT1MgYW5kIHN5c3RlbSBhcmNoaXRlY3R1cmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFbnZpcm9ubWVudCgpOiBQcm9taXNlPEVudmlyb25tZW50SW5mbz4ge1xuICAgIHJldHVybiBjYWxsKFN5c3RlbUVudmlyb25tZW50KTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGN1cnJlbnQgb3BlcmF0aW5nIHN5c3RlbSBpcyBXaW5kb3dzLlxuICpcbiAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBpcyBXaW5kb3dzLCBvdGhlcndpc2UgZmFsc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBJc1dpbmRvd3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHdpbmRvdy5fd2FpbHMuZW52aXJvbm1lbnQuT1MgPT09IFwid2luZG93c1wiO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgY3VycmVudCBvcGVyYXRpbmcgc3lzdGVtIGlzIExpbnV4LlxuICpcbiAqIEByZXR1cm5zIFJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVudCBvcGVyYXRpbmcgc3lzdGVtIGlzIExpbnV4LCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBJc0xpbnV4KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB3aW5kb3cuX3dhaWxzLmVudmlyb25tZW50Lk9TID09PSBcImxpbnV4XCI7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBjdXJyZW50IGVudmlyb25tZW50IGlzIGEgbWFjT1Mgb3BlcmF0aW5nIHN5c3RlbS5cbiAqXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBlbnZpcm9ubWVudCBpcyBtYWNPUywgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSXNNYWMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHdpbmRvdy5fd2FpbHMuZW52aXJvbm1lbnQuT1MgPT09IFwiZGFyd2luXCI7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBjdXJyZW50IGVudmlyb25tZW50IGFyY2hpdGVjdHVyZSBpcyBBTUQ2NC5cbiAqXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBjdXJyZW50IGVudmlyb25tZW50IGFyY2hpdGVjdHVyZSBpcyBBTUQ2NCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSXNBTUQ2NCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gd2luZG93Ll93YWlscy5lbnZpcm9ubWVudC5BcmNoID09PSBcImFtZDY0XCI7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBjdXJyZW50IGFyY2hpdGVjdHVyZSBpcyBBUk0uXG4gKlxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgY3VycmVudCBhcmNoaXRlY3R1cmUgaXMgQVJNLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBJc0FSTSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gd2luZG93Ll93YWlscy5lbnZpcm9ubWVudC5BcmNoID09PSBcImFybVwiO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgY3VycmVudCBlbnZpcm9ubWVudCBpcyBBUk02NCBhcmNoaXRlY3R1cmUuXG4gKlxuICogQHJldHVybnMgUmV0dXJucyB0cnVlIGlmIHRoZSBlbnZpcm9ubWVudCBpcyBBUk02NCBhcmNoaXRlY3R1cmUsIG90aGVyd2lzZSByZXR1cm5zIGZhbHNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSXNBUk02NCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gd2luZG93Ll93YWlscy5lbnZpcm9ubWVudC5BcmNoID09PSBcImFybTY0XCI7XG59XG5cbi8qKlxuICogUmVwb3J0cyB3aGV0aGVyIHRoZSBhcHAgaXMgYmVpbmcgcnVuIGluIGRlYnVnIG1vZGUuXG4gKlxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgYXBwIGlzIGJlaW5nIHJ1biBpbiBkZWJ1ZyBtb2RlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSXNEZWJ1ZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gQm9vbGVhbih3aW5kb3cuX3dhaWxzLmVudmlyb25tZW50LkRlYnVnKTtcbn1cblxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5pbXBvcnQgeyBuZXdSdW50aW1lQ2FsbGVyLCBvYmplY3ROYW1lcyB9IGZyb20gXCIuL3J1bnRpbWUuanNcIjtcbmltcG9ydCB7IElzRGVidWcgfSBmcm9tIFwiLi9zeXN0ZW0uanNcIjtcblxuLy8gc2V0dXBcbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIGNvbnRleHRNZW51SGFuZGxlcik7XG5cbmNvbnN0IGNhbGwgPSBuZXdSdW50aW1lQ2FsbGVyKG9iamVjdE5hbWVzLkNvbnRleHRNZW51KTtcblxuY29uc3QgQ29udGV4dE1lbnVPcGVuID0gMDtcblxuZnVuY3Rpb24gb3BlbkNvbnRleHRNZW51KGlkOiBzdHJpbmcsIHg6IG51bWJlciwgeTogbnVtYmVyLCBkYXRhOiBhbnkpOiB2b2lkIHtcbiAgICB2b2lkIGNhbGwoQ29udGV4dE1lbnVPcGVuLCB7aWQsIHgsIHksIGRhdGF9KTtcbn1cblxuZnVuY3Rpb24gY29udGV4dE1lbnVIYW5kbGVyKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgbGV0IHRhcmdldDogSFRNTEVsZW1lbnQ7XG5cbiAgICBpZiAoZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgIH0gZWxzZSBpZiAoIShldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkgJiYgZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgTm9kZSkge1xuICAgICAgICB0YXJnZXQgPSBldmVudC50YXJnZXQucGFyZW50RWxlbWVudCA/PyBkb2N1bWVudC5ib2R5O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRhcmdldCA9IGRvY3VtZW50LmJvZHk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIGN1c3RvbSBjb250ZXh0IG1lbnVcbiAgICBsZXQgY3VzdG9tQ29udGV4dE1lbnUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXQpLmdldFByb3BlcnR5VmFsdWUoXCItLWN1c3RvbS1jb250ZXh0bWVudVwiKS50cmltKCk7XG5cbiAgICBpZiAoY3VzdG9tQ29udGV4dE1lbnUpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgbGV0IGRhdGEgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXQpLmdldFByb3BlcnR5VmFsdWUoXCItLWN1c3RvbS1jb250ZXh0bWVudS1kYXRhXCIpO1xuICAgICAgICBvcGVuQ29udGV4dE1lbnUoY3VzdG9tQ29udGV4dE1lbnUsIGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFksIGRhdGEpO1xuICAgICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBwcm9jZXNzRGVmYXVsdENvbnRleHRNZW51KGV2ZW50KTtcbn1cblxuXG4vKlxuLS1kZWZhdWx0LWNvbnRleHRtZW51OiBhdXRvOyAoZGVmYXVsdCkgd2lsbCBzaG93IHRoZSBkZWZhdWx0IGNvbnRleHQgbWVudSBpZiBjb250ZW50RWRpdGFibGUgaXMgdHJ1ZSBPUiB0ZXh0IGhhcyBiZWVuIHNlbGVjdGVkIE9SIGVsZW1lbnQgaXMgaW5wdXQgb3IgdGV4dGFyZWFcbi0tZGVmYXVsdC1jb250ZXh0bWVudTogc2hvdzsgd2lsbCBhbHdheXMgc2hvdyB0aGUgZGVmYXVsdCBjb250ZXh0IG1lbnVcbi0tZGVmYXVsdC1jb250ZXh0bWVudTogaGlkZTsgd2lsbCBhbHdheXMgaGlkZSB0aGUgZGVmYXVsdCBjb250ZXh0IG1lbnVcblxuVGhpcyBydWxlIGlzIGluaGVyaXRlZCBsaWtlIG5vcm1hbCBDU1MgcnVsZXMsIHNvIG5lc3Rpbmcgd29ya3MgYXMgZXhwZWN0ZWRcbiovXG5mdW5jdGlvbiBwcm9jZXNzRGVmYXVsdENvbnRleHRNZW51KGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgLy8gRGVidWcgYnVpbGRzIGFsd2F5cyBzaG93IHRoZSBtZW51XG4gICAgaWYgKElzRGVidWcoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHRhcmdldDogSFRNTEVsZW1lbnQ7XG5cbiAgICBpZiAoZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgIH0gZWxzZSBpZiAoIShldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkgJiYgZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgTm9kZSkge1xuICAgICAgICB0YXJnZXQgPSBldmVudC50YXJnZXQucGFyZW50RWxlbWVudCA/PyBkb2N1bWVudC5ib2R5O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRhcmdldCA9IGRvY3VtZW50LmJvZHk7XG4gICAgfVxuXG4gICAgLy8gUHJvY2VzcyBkZWZhdWx0IGNvbnRleHQgbWVudVxuICAgIHN3aXRjaCAod2luZG93LmdldENvbXB1dGVkU3R5bGUodGFyZ2V0KS5nZXRQcm9wZXJ0eVZhbHVlKFwiLS1kZWZhdWx0LWNvbnRleHRtZW51XCIpLnRyaW0oKSkge1xuICAgICAgICBjYXNlIFwic2hvd1wiOlxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNhc2UgXCJoaWRlXCI6XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAvLyBDaGVjayBpZiBjb250ZW50RWRpdGFibGUgaXMgdHJ1ZVxuICAgICAgICAgICAgaWYgKHRhcmdldC5pc0NvbnRlbnRFZGl0YWJsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGV4dCBoYXMgYmVlbiBzZWxlY3RlZFxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgICAgICAgICAgY29uc3QgaGFzU2VsZWN0aW9uID0gc2VsZWN0aW9uICYmIHNlbGVjdGlvbi50b1N0cmluZygpLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICBpZiAoaGFzU2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3Rpb24ucmFuZ2VDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoaSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY3RzID0gcmFuZ2UuZ2V0Q2xpZW50UmVjdHMoKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByZWN0cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjdCA9IHJlY3RzW2pdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQocmVjdC5sZWZ0LCByZWN0LnRvcCkgPT09IHRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGFnIGlzIGlucHV0IG9yIHRleHRhcmVhLlxuICAgICAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgfHwgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTFRleHRBcmVhRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGlmIChoYXNTZWxlY3Rpb24gfHwgKCF0YXJnZXQucmVhZE9ubHkgJiYgIXRhcmdldC5kaXNhYmxlZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaGlkZSBkZWZhdWx0IGNvbnRleHQgbWVudVxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG59XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBrZXkgZnJvbSB0aGUgZmxhZyBtYXAuXG4gKlxuICogQHBhcmFtIGtleSAtIFRoZSBrZXkgdG8gcmV0cmlldmUgdGhlIHZhbHVlIGZvci5cbiAqIEByZXR1cm4gVGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGtleS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEdldEZsYWcoa2V5OiBzdHJpbmcpOiBhbnkge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB3aW5kb3cuX3dhaWxzLmZsYWdzW2tleV07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gcmV0cmlldmUgZmxhZyAnXCIgKyBrZXkgKyBcIic6IFwiICsgZSwgeyBjYXVzZTogZSB9KTtcbiAgICB9XG59XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbmltcG9ydCB7IGludm9rZSwgSXNXaW5kb3dzIH0gZnJvbSBcIi4vc3lzdGVtLmpzXCI7XG5pbXBvcnQgeyBHZXRGbGFnIH0gZnJvbSBcIi4vZmxhZ3MuanNcIjtcbmltcG9ydCB7IGNhblRyYWNrQnV0dG9ucyB9IGZyb20gXCIuL3V0aWxzLmpzXCI7XG5cbi8vIFNldHVwXG5sZXQgY2FuRHJhZyA9IGZhbHNlO1xubGV0IGRyYWdnaW5nID0gZmFsc2U7XG5cbmxldCByZXNpemFibGUgPSBmYWxzZTtcbmxldCBjYW5SZXNpemUgPSBmYWxzZTtcbmxldCByZXNpemluZyA9IGZhbHNlO1xubGV0IHJlc2l6ZUVkZ2U6IHN0cmluZyA9IFwiXCI7XG5sZXQgZGVmYXVsdEN1cnNvciA9IFwiYXV0b1wiO1xuXG5sZXQgYnV0dG9ucyA9IDA7XG5jb25zdCBidXR0b25zVHJhY2tlZCA9IGNhblRyYWNrQnV0dG9ucygpO1xuXG53aW5kb3cuX3dhaWxzID0gd2luZG93Ll93YWlscyB8fCB7fTtcbndpbmRvdy5fd2FpbHMuc2V0UmVzaXphYmxlID0gKHZhbHVlOiBib29sZWFuKTogdm9pZCA9PiB7XG4gICAgcmVzaXphYmxlID0gdmFsdWU7XG4gICAgaWYgKCFyZXNpemFibGUpIHtcbiAgICAgICAgLy8gU3RvcCByZXNpemluZyBpZiBpbiBwcm9ncmVzcy5cbiAgICAgICAgY2FuUmVzaXplID0gcmVzaXppbmcgPSBmYWxzZTtcbiAgICAgICAgc2V0UmVzaXplKCk7XG4gICAgfVxufTtcblxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHVwZGF0ZSwgeyBjYXB0dXJlOiB0cnVlIH0pO1xud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHVwZGF0ZSwgeyBjYXB0dXJlOiB0cnVlIH0pO1xud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB1cGRhdGUsIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbmZvciAoY29uc3QgZXYgb2YgWydjbGljaycsICdjb250ZXh0bWVudScsICdkYmxjbGljayddKSB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoZXYsIHN1cHByZXNzRXZlbnQsIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbn1cblxuZnVuY3Rpb24gc3VwcHJlc3NFdmVudChldmVudDogRXZlbnQpIHtcbiAgICAvLyBTdXBwcmVzcyBjbGljayBldmVudHMgd2hpbGUgcmVzaXppbmcgb3IgZHJhZ2dpbmcuXG4gICAgaWYgKGRyYWdnaW5nIHx8IHJlc2l6aW5nKSB7XG4gICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG59XG5cbi8vIFVzZSBjb25zdGFudHMgdG8gYXZvaWQgY29tcGFyaW5nIHN0cmluZ3MgbXVsdGlwbGUgdGltZXMuXG5jb25zdCBNb3VzZURvd24gPSAwO1xuY29uc3QgTW91c2VVcCAgID0gMTtcbmNvbnN0IE1vdXNlTW92ZSA9IDI7XG5cbmZ1bmN0aW9uIHVwZGF0ZShldmVudDogTW91c2VFdmVudCkge1xuICAgIC8vIFdpbmRvd3Mgc3VwcHJlc3NlcyBtb3VzZSBldmVudHMgYXQgdGhlIGVuZCBvZiBkcmFnZ2luZyBvciByZXNpemluZyxcbiAgICAvLyBzbyB3ZSBuZWVkIHRvIGJlIHNtYXJ0IGFuZCBzeW50aGVzaXplIGJ1dHRvbiBldmVudHMuXG5cbiAgICBsZXQgZXZlbnRUeXBlOiBudW1iZXIsIGV2ZW50QnV0dG9ucyA9IGV2ZW50LmJ1dHRvbnM7XG4gICAgc3dpdGNoIChldmVudC50eXBlKSB7XG4gICAgICAgIGNhc2UgJ21vdXNlZG93bic6XG4gICAgICAgICAgICBldmVudFR5cGUgPSBNb3VzZURvd247XG4gICAgICAgICAgICBpZiAoIWJ1dHRvbnNUcmFja2VkKSB7IGV2ZW50QnV0dG9ucyA9IGJ1dHRvbnMgfCAoMSA8PCBldmVudC5idXR0b24pOyB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbW91c2V1cCc6XG4gICAgICAgICAgICBldmVudFR5cGUgPSBNb3VzZVVwO1xuICAgICAgICAgICAgaWYgKCFidXR0b25zVHJhY2tlZCkgeyBldmVudEJ1dHRvbnMgPSBidXR0b25zICYgfigxIDw8IGV2ZW50LmJ1dHRvbik7IH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgZXZlbnRUeXBlID0gTW91c2VNb3ZlO1xuICAgICAgICAgICAgaWYgKCFidXR0b25zVHJhY2tlZCkgeyBldmVudEJ1dHRvbnMgPSBidXR0b25zOyB9XG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBsZXQgcmVsZWFzZWQgPSBidXR0b25zICYgfmV2ZW50QnV0dG9ucztcbiAgICBsZXQgcHJlc3NlZCA9IGV2ZW50QnV0dG9ucyAmIH5idXR0b25zO1xuXG4gICAgYnV0dG9ucyA9IGV2ZW50QnV0dG9ucztcblxuICAgIC8vIFN5bnRoZXNpemUgYSByZWxlYXNlLXByZXNzIHNlcXVlbmNlIGlmIHdlIGRldGVjdCBhIHByZXNzIG9mIGFuIGFscmVhZHkgcHJlc3NlZCBidXR0b24uXG4gICAgaWYgKGV2ZW50VHlwZSA9PT0gTW91c2VEb3duICYmICEocHJlc3NlZCAmIGV2ZW50LmJ1dHRvbikpIHtcbiAgICAgICAgcmVsZWFzZWQgfD0gKDEgPDwgZXZlbnQuYnV0dG9uKTtcbiAgICAgICAgcHJlc3NlZCB8PSAoMSA8PCBldmVudC5idXR0b24pO1xuICAgIH1cblxuICAgIC8vIFN1cHByZXNzIGFsbCBidXR0b24gZXZlbnRzIGR1cmluZyBkcmFnZ2luZyBhbmQgcmVzaXppbmcsXG4gICAgLy8gdW5sZXNzIHRoaXMgaXMgYSBtb3VzZXVwIGV2ZW50IHRoYXQgaXMgZW5kaW5nIGEgZHJhZyBhY3Rpb24uXG4gICAgaWYgKFxuICAgICAgICBldmVudFR5cGUgIT09IE1vdXNlTW92ZSAvLyBGYXN0IHBhdGggZm9yIG1vdXNlbW92ZVxuICAgICAgICAmJiByZXNpemluZ1xuICAgICAgICB8fCAoXG4gICAgICAgICAgICBkcmFnZ2luZ1xuICAgICAgICAgICAgJiYgKFxuICAgICAgICAgICAgICAgIGV2ZW50VHlwZSA9PT0gTW91c2VEb3duXG4gICAgICAgICAgICAgICAgfHwgZXZlbnQuYnV0dG9uICE9PSAwXG4gICAgICAgICAgICApXG4gICAgICAgIClcbiAgICApIHtcbiAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSByZWxlYXNlc1xuICAgIGlmIChyZWxlYXNlZCAmIDEpIHsgcHJpbWFyeVVwKGV2ZW50KTsgfVxuICAgIC8vIEhhbmRsZSBwcmVzc2VzXG4gICAgaWYgKHByZXNzZWQgJiAxKSB7IHByaW1hcnlEb3duKGV2ZW50KTsgfVxuXG4gICAgLy8gSGFuZGxlIG1vdXNlbW92ZVxuICAgIGlmIChldmVudFR5cGUgPT09IE1vdXNlTW92ZSkgeyBvbk1vdXNlTW92ZShldmVudCk7IH07XG59XG5cbmZ1bmN0aW9uIHByaW1hcnlEb3duKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgLy8gUmVzZXQgcmVhZGluZXNzIHN0YXRlLlxuICAgIGNhbkRyYWcgPSBmYWxzZTtcbiAgICBjYW5SZXNpemUgPSBmYWxzZTtcblxuICAgIC8vIElnbm9yZSByZXBlYXRlZCBjbGlja3Mgb24gbWFjT1MgYW5kIExpbnV4LlxuICAgIGlmICghSXNXaW5kb3dzKCkpIHtcbiAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdtb3VzZWRvd24nICYmIGV2ZW50LmJ1dHRvbiA9PT0gMCAmJiBldmVudC5kZXRhaWwgIT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyZXNpemVFZGdlKSB7XG4gICAgICAgIC8vIFJlYWR5IHRvIHJlc2l6ZSBpZiB0aGUgcHJpbWFyeSBidXR0b24gd2FzIHByZXNzZWQgZm9yIHRoZSBmaXJzdCB0aW1lLlxuICAgICAgICBjYW5SZXNpemUgPSB0cnVlO1xuICAgICAgICAvLyBEbyBub3Qgc3RhcnQgZHJhZyBvcGVyYXRpb25zIHdoZW4gb24gcmVzaXplIGVkZ2VzLlxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUmV0cmlldmUgdGFyZ2V0IGVsZW1lbnRcbiAgICBsZXQgdGFyZ2V0OiBIVE1MRWxlbWVudDtcblxuICAgIGlmIChldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgICB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgfSBlbHNlIGlmICghKGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSAmJiBldmVudC50YXJnZXQgaW5zdGFuY2VvZiBOb2RlKSB7XG4gICAgICAgIHRhcmdldCA9IGV2ZW50LnRhcmdldC5wYXJlbnRFbGVtZW50ID8/IGRvY3VtZW50LmJvZHk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGFyZ2V0ID0gZG9jdW1lbnQuYm9keTtcbiAgICB9XG5cbiAgICAvLyBSZWFkeSB0byBkcmFnIGlmIHRoZSBwcmltYXJ5IGJ1dHRvbiB3YXMgcHJlc3NlZCBmb3IgdGhlIGZpcnN0IHRpbWUgb24gYSBkcmFnZ2FibGUgZWxlbWVudC5cbiAgICAvLyBJZ25vcmUgY2xpY2tzIG9uIHRoZSBzY3JvbGxiYXIuXG4gICAgY29uc3Qgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXQpO1xuICAgIGNhbkRyYWcgPSAoXG4gICAgICAgIHN0eWxlLmdldFByb3BlcnR5VmFsdWUoXCItLXdhaWxzLWRyYWdnYWJsZVwiKS50cmltKCkgPT09IFwiZHJhZ1wiXG4gICAgICAgICYmIChcbiAgICAgICAgICAgIGV2ZW50Lm9mZnNldFggLSBwYXJzZUZsb2F0KHN0eWxlLnBhZGRpbmdMZWZ0KSA8IHRhcmdldC5jbGllbnRXaWR0aFxuICAgICAgICAgICAgJiYgZXZlbnQub2Zmc2V0WSAtIHBhcnNlRmxvYXQoc3R5bGUucGFkZGluZ1RvcCkgPCB0YXJnZXQuY2xpZW50SGVpZ2h0XG4gICAgICAgIClcbiAgICApO1xufVxuXG5mdW5jdGlvbiBwcmltYXJ5VXAoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICAvLyBTdG9wIGRyYWdnaW5nIGFuZCByZXNpemluZy5cbiAgICBjYW5EcmFnID0gZmFsc2U7XG4gICAgZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICBjYW5SZXNpemUgPSBmYWxzZTtcbiAgICByZXNpemluZyA9IGZhbHNlO1xufVxuXG5jb25zdCBjdXJzb3JGb3JFZGdlID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgXCJzZS1yZXNpemVcIjogXCJud3NlLXJlc2l6ZVwiLFxuICAgIFwic3ctcmVzaXplXCI6IFwibmVzdy1yZXNpemVcIixcbiAgICBcIm53LXJlc2l6ZVwiOiBcIm53c2UtcmVzaXplXCIsXG4gICAgXCJuZS1yZXNpemVcIjogXCJuZXN3LXJlc2l6ZVwiLFxuICAgIFwidy1yZXNpemVcIjogXCJldy1yZXNpemVcIixcbiAgICBcIm4tcmVzaXplXCI6IFwibnMtcmVzaXplXCIsXG4gICAgXCJzLXJlc2l6ZVwiOiBcIm5zLXJlc2l6ZVwiLFxuICAgIFwiZS1yZXNpemVcIjogXCJldy1yZXNpemVcIixcbn0pXG5cbmZ1bmN0aW9uIHNldFJlc2l6ZShlZGdlPzoga2V5b2YgdHlwZW9mIGN1cnNvckZvckVkZ2UpOiB2b2lkIHtcbiAgICBpZiAoZWRnZSkge1xuICAgICAgICBpZiAoIXJlc2l6ZUVkZ2UpIHsgZGVmYXVsdEN1cnNvciA9IGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yOyB9XG4gICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yID0gY3Vyc29yRm9yRWRnZVtlZGdlXTtcbiAgICB9IGVsc2UgaWYgKCFlZGdlICYmIHJlc2l6ZUVkZ2UpIHtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3IgPSBkZWZhdWx0Q3Vyc29yO1xuICAgIH1cblxuICAgIHJlc2l6ZUVkZ2UgPSBlZGdlIHx8IFwiXCI7XG59XG5cbmZ1bmN0aW9uIG9uTW91c2VNb3ZlKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGNhblJlc2l6ZSAmJiByZXNpemVFZGdlKSB7XG4gICAgICAgIC8vIFN0YXJ0IHJlc2l6aW5nLlxuICAgICAgICByZXNpemluZyA9IHRydWU7XG4gICAgICAgIGludm9rZShcIndhaWxzOnJlc2l6ZTpcIiArIHJlc2l6ZUVkZ2UpO1xuICAgIH0gZWxzZSBpZiAoY2FuRHJhZykge1xuICAgICAgICAvLyBTdGFydCBkcmFnZ2luZy5cbiAgICAgICAgZHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgICBpbnZva2UoXCJ3YWlsczpkcmFnXCIpO1xuICAgIH1cblxuICAgIGlmIChkcmFnZ2luZyB8fCByZXNpemluZykge1xuICAgICAgICAvLyBFaXRoZXIgZHJhZyBvciByZXNpemUgaXMgb25nb2luZyxcbiAgICAgICAgLy8gcmVzZXQgcmVhZGluZXNzIGFuZCBzdG9wIHByb2Nlc3NpbmcuXG4gICAgICAgIGNhbkRyYWcgPSBjYW5SZXNpemUgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghcmVzaXphYmxlIHx8ICFJc1dpbmRvd3MoKSkge1xuICAgICAgICBpZiAocmVzaXplRWRnZSkgeyBzZXRSZXNpemUoKTsgfVxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmVzaXplSGFuZGxlSGVpZ2h0ID0gR2V0RmxhZyhcInN5c3RlbS5yZXNpemVIYW5kbGVIZWlnaHRcIikgfHwgNTtcbiAgICBjb25zdCByZXNpemVIYW5kbGVXaWR0aCA9IEdldEZsYWcoXCJzeXN0ZW0ucmVzaXplSGFuZGxlV2lkdGhcIikgfHwgNTtcblxuICAgIC8vIEV4dHJhIHBpeGVscyBmb3IgdGhlIGNvcm5lciBhcmVhcy5cbiAgICBjb25zdCBjb3JuZXJFeHRyYSA9IEdldEZsYWcoXCJyZXNpemVDb3JuZXJFeHRyYVwiKSB8fCAxMDtcblxuICAgIGNvbnN0IHJpZ2h0Qm9yZGVyID0gKHdpbmRvdy5vdXRlcldpZHRoIC0gZXZlbnQuY2xpZW50WCkgPCByZXNpemVIYW5kbGVXaWR0aDtcbiAgICBjb25zdCBsZWZ0Qm9yZGVyID0gZXZlbnQuY2xpZW50WCA8IHJlc2l6ZUhhbmRsZVdpZHRoO1xuICAgIGNvbnN0IHRvcEJvcmRlciA9IGV2ZW50LmNsaWVudFkgPCByZXNpemVIYW5kbGVIZWlnaHQ7XG4gICAgY29uc3QgYm90dG9tQm9yZGVyID0gKHdpbmRvdy5vdXRlckhlaWdodCAtIGV2ZW50LmNsaWVudFkpIDwgcmVzaXplSGFuZGxlSGVpZ2h0O1xuXG4gICAgLy8gQWRqdXN0IGZvciBjb3JuZXIgYXJlYXMuXG4gICAgY29uc3QgcmlnaHRDb3JuZXIgPSAod2luZG93Lm91dGVyV2lkdGggLSBldmVudC5jbGllbnRYKSA8IChyZXNpemVIYW5kbGVXaWR0aCArIGNvcm5lckV4dHJhKTtcbiAgICBjb25zdCBsZWZ0Q29ybmVyID0gZXZlbnQuY2xpZW50WCA8IChyZXNpemVIYW5kbGVXaWR0aCArIGNvcm5lckV4dHJhKTtcbiAgICBjb25zdCB0b3BDb3JuZXIgPSBldmVudC5jbGllbnRZIDwgKHJlc2l6ZUhhbmRsZUhlaWdodCArIGNvcm5lckV4dHJhKTtcbiAgICBjb25zdCBib3R0b21Db3JuZXIgPSAod2luZG93Lm91dGVySGVpZ2h0IC0gZXZlbnQuY2xpZW50WSkgPCAocmVzaXplSGFuZGxlSGVpZ2h0ICsgY29ybmVyRXh0cmEpO1xuXG4gICAgaWYgKCFsZWZ0Q29ybmVyICYmICF0b3BDb3JuZXIgJiYgIWJvdHRvbUNvcm5lciAmJiAhcmlnaHRDb3JuZXIpIHtcbiAgICAgICAgLy8gT3B0aW1pc2F0aW9uOiBvdXQgb2YgYWxsIGNvcm5lciBhcmVhcyBpbXBsaWVzIG91dCBvZiBib3JkZXJzLlxuICAgICAgICBzZXRSZXNpemUoKTtcbiAgICB9XG4gICAgLy8gRGV0ZWN0IGNvcm5lcnMuXG4gICAgZWxzZSBpZiAocmlnaHRDb3JuZXIgJiYgYm90dG9tQ29ybmVyKSBzZXRSZXNpemUoXCJzZS1yZXNpemVcIik7XG4gICAgZWxzZSBpZiAobGVmdENvcm5lciAmJiBib3R0b21Db3JuZXIpIHNldFJlc2l6ZShcInN3LXJlc2l6ZVwiKTtcbiAgICBlbHNlIGlmIChsZWZ0Q29ybmVyICYmIHRvcENvcm5lcikgc2V0UmVzaXplKFwibnctcmVzaXplXCIpO1xuICAgIGVsc2UgaWYgKHRvcENvcm5lciAmJiByaWdodENvcm5lcikgc2V0UmVzaXplKFwibmUtcmVzaXplXCIpO1xuICAgIC8vIERldGVjdCBib3JkZXJzLlxuICAgIGVsc2UgaWYgKGxlZnRCb3JkZXIpIHNldFJlc2l6ZShcInctcmVzaXplXCIpO1xuICAgIGVsc2UgaWYgKHRvcEJvcmRlcikgc2V0UmVzaXplKFwibi1yZXNpemVcIik7XG4gICAgZWxzZSBpZiAoYm90dG9tQm9yZGVyKSBzZXRSZXNpemUoXCJzLXJlc2l6ZVwiKTtcbiAgICBlbHNlIGlmIChyaWdodEJvcmRlcikgc2V0UmVzaXplKFwiZS1yZXNpemVcIik7XG4gICAgLy8gT3V0IG9mIGJvcmRlciBhcmVhLlxuICAgIGVsc2Ugc2V0UmVzaXplKCk7XG59XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbmltcG9ydCB7IG5ld1J1bnRpbWVDYWxsZXIsIG9iamVjdE5hbWVzIH0gZnJvbSBcIi4vcnVudGltZS5qc1wiO1xuY29uc3QgY2FsbCA9IG5ld1J1bnRpbWVDYWxsZXIob2JqZWN0TmFtZXMuQXBwbGljYXRpb24pO1xuXG5jb25zdCBIaWRlTWV0aG9kID0gMDtcbmNvbnN0IFNob3dNZXRob2QgPSAxO1xuY29uc3QgUXVpdE1ldGhvZCA9IDI7XG5cbi8qKlxuICogSGlkZXMgYSBjZXJ0YWluIG1ldGhvZCBieSBjYWxsaW5nIHRoZSBIaWRlTWV0aG9kIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSGlkZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gY2FsbChIaWRlTWV0aG9kKTtcbn1cblxuLyoqXG4gKiBDYWxscyB0aGUgU2hvd01ldGhvZCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gU2hvdygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gY2FsbChTaG93TWV0aG9kKTtcbn1cblxuLyoqXG4gKiBDYWxscyB0aGUgUXVpdE1ldGhvZCB0byB0ZXJtaW5hdGUgdGhlIHByb2dyYW0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBRdWl0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBjYWxsKFF1aXRNZXRob2QpO1xufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5pbXBvcnQgeyBDYW5jZWxsYWJsZVByb21pc2UsIHR5cGUgQ2FuY2VsbGFibGVQcm9taXNlV2l0aFJlc29sdmVycyB9IGZyb20gXCIuL2NhbmNlbGxhYmxlLmpzXCI7XG5pbXBvcnQgeyBuZXdSdW50aW1lQ2FsbGVyLCBvYmplY3ROYW1lcyB9IGZyb20gXCIuL3J1bnRpbWUuanNcIjtcbmltcG9ydCB7IG5hbm9pZCB9IGZyb20gXCIuL25hbm9pZC5qc1wiO1xuXG4vLyBTZXR1cFxud2luZG93Ll93YWlscyA9IHdpbmRvdy5fd2FpbHMgfHwge307XG53aW5kb3cuX3dhaWxzLmNhbGxSZXN1bHRIYW5kbGVyID0gcmVzdWx0SGFuZGxlcjtcbndpbmRvdy5fd2FpbHMuY2FsbEVycm9ySGFuZGxlciA9IGVycm9ySGFuZGxlcjtcblxudHlwZSBQcm9taXNlUmVzb2x2ZXJzID0gT21pdDxDYW5jZWxsYWJsZVByb21pc2VXaXRoUmVzb2x2ZXJzPGFueT4sIFwicHJvbWlzZVwiIHwgXCJvbmNhbmNlbGxlZFwiPlxuXG5jb25zdCBjYWxsID0gbmV3UnVudGltZUNhbGxlcihvYmplY3ROYW1lcy5DYWxsKTtcbmNvbnN0IGNhbmNlbENhbGwgPSBuZXdSdW50aW1lQ2FsbGVyKG9iamVjdE5hbWVzLkNhbmNlbENhbGwpO1xuY29uc3QgY2FsbFJlc3BvbnNlcyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlUmVzb2x2ZXJzPigpO1xuXG5jb25zdCBDYWxsQmluZGluZyA9IDA7XG5jb25zdCBDYW5jZWxNZXRob2QgPSAwXG5cbi8qKlxuICogSG9sZHMgYWxsIHJlcXVpcmVkIGluZm9ybWF0aW9uIGZvciBhIGJpbmRpbmcgY2FsbC5cbiAqIE1heSBwcm92aWRlIGVpdGhlciBhIG1ldGhvZCBJRCBvciBhIG1ldGhvZCBuYW1lLCBidXQgbm90IGJvdGguXG4gKi9cbmV4cG9ydCB0eXBlIENhbGxPcHRpb25zID0ge1xuICAgIC8qKiBUaGUgbnVtZXJpYyBJRCBvZiB0aGUgYm91bmQgbWV0aG9kIHRvIGNhbGwuICovXG4gICAgbWV0aG9kSUQ6IG51bWJlcjtcbiAgICAvKiogVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBib3VuZCBtZXRob2QgdG8gY2FsbC4gKi9cbiAgICBtZXRob2ROYW1lPzogbmV2ZXI7XG4gICAgLyoqIEFyZ3VtZW50cyB0byBiZSBwYXNzZWQgaW50byB0aGUgYm91bmQgbWV0aG9kLiAqL1xuICAgIGFyZ3M6IGFueVtdO1xufSB8IHtcbiAgICAvKiogVGhlIG51bWVyaWMgSUQgb2YgdGhlIGJvdW5kIG1ldGhvZCB0byBjYWxsLiAqL1xuICAgIG1ldGhvZElEPzogbmV2ZXI7XG4gICAgLyoqIFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgYm91bmQgbWV0aG9kIHRvIGNhbGwuICovXG4gICAgbWV0aG9kTmFtZTogc3RyaW5nO1xuICAgIC8qKiBBcmd1bWVudHMgdG8gYmUgcGFzc2VkIGludG8gdGhlIGJvdW5kIG1ldGhvZC4gKi9cbiAgICBhcmdzOiBhbnlbXTtcbn07XG5cbi8qKlxuICogRXhjZXB0aW9uIGNsYXNzIHRoYXQgd2lsbCBiZSB0aHJvd24gaW4gY2FzZSB0aGUgYm91bmQgbWV0aG9kIHJldHVybnMgYW4gZXJyb3IuXG4gKiBUaGUgdmFsdWUgb2YgdGhlIHtAbGluayBSdW50aW1lRXJyb3IjbmFtZX0gcHJvcGVydHkgaXMgXCJSdW50aW1lRXJyb3JcIi5cbiAqL1xuZXhwb3J0IGNsYXNzIFJ1bnRpbWVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFJ1bnRpbWVFcnJvciBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZSAtIFRoZSBlcnJvciBtZXNzYWdlLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBiZSBmb3J3YXJkZWQgdG8gdGhlIEVycm9yIGNvbnN0cnVjdG9yLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcsIG9wdGlvbnM/OiBFcnJvck9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSwgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiUnVudGltZUVycm9yXCI7XG4gICAgfVxufVxuXG4vKipcbiAqIEhhbmRsZXMgdGhlIHJlc3VsdCBvZiBhIGNhbGwgcmVxdWVzdC5cbiAqXG4gKiBAcGFyYW0gaWQgLSBUaGUgaWQgb2YgdGhlIHJlcXVlc3QgdG8gaGFuZGxlIHRoZSByZXN1bHQgZm9yLlxuICogQHBhcmFtIGRhdGEgLSBUaGUgcmVzdWx0IGRhdGEgb2YgdGhlIHJlcXVlc3QuXG4gKiBAcGFyYW0gaXNKU09OIC0gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRhdGEgaXMgSlNPTiBvciBub3QuXG4gKi9cbmZ1bmN0aW9uIHJlc3VsdEhhbmRsZXIoaWQ6IHN0cmluZywgZGF0YTogc3RyaW5nLCBpc0pTT046IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCByZXNvbHZlcnMgPSBnZXRBbmREZWxldGVSZXNwb25zZShpZCk7XG4gICAgaWYgKCFyZXNvbHZlcnMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghZGF0YSkge1xuICAgICAgICByZXNvbHZlcnMucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgIH0gZWxzZSBpZiAoIWlzSlNPTikge1xuICAgICAgICByZXNvbHZlcnMucmVzb2x2ZShkYXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzb2x2ZXJzLnJlc29sdmUoSlNPTi5wYXJzZShkYXRhKSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgICAgICByZXNvbHZlcnMucmVqZWN0KG5ldyBUeXBlRXJyb3IoXCJjb3VsZCBub3QgcGFyc2UgcmVzdWx0OiBcIiArIGVyci5tZXNzYWdlLCB7IGNhdXNlOiBlcnIgfSkpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIEhhbmRsZXMgdGhlIGVycm9yIGZyb20gYSBjYWxsIHJlcXVlc3QuXG4gKlxuICogQHBhcmFtIGlkIC0gVGhlIGlkIG9mIHRoZSBwcm9taXNlIGhhbmRsZXIuXG4gKiBAcGFyYW0gZGF0YSAtIFRoZSBlcnJvciBkYXRhIHRvIHJlamVjdCB0aGUgcHJvbWlzZSBoYW5kbGVyIHdpdGguXG4gKiBAcGFyYW0gaXNKU09OIC0gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRhdGEgaXMgSlNPTiBvciBub3QuXG4gKi9cbmZ1bmN0aW9uIGVycm9ySGFuZGxlcihpZDogc3RyaW5nLCBkYXRhOiBzdHJpbmcsIGlzSlNPTjogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IHJlc29sdmVycyA9IGdldEFuZERlbGV0ZVJlc3BvbnNlKGlkKTtcbiAgICBpZiAoIXJlc29sdmVycykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFpc0pTT04pIHtcbiAgICAgICAgcmVzb2x2ZXJzLnJlamVjdChuZXcgRXJyb3IoZGF0YSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBlcnJvcjogYW55O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZXJyb3IgPSBKU09OLnBhcnNlKGRhdGEpO1xuICAgICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICAgICAgcmVzb2x2ZXJzLnJlamVjdChuZXcgVHlwZUVycm9yKFwiY291bGQgbm90IHBhcnNlIGVycm9yOiBcIiArIGVyci5tZXNzYWdlLCB7IGNhdXNlOiBlcnIgfSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG9wdGlvbnM6IEVycm9yT3B0aW9ucyA9IHt9O1xuICAgICAgICBpZiAoZXJyb3IuY2F1c2UpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuY2F1c2UgPSBlcnJvci5jYXVzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBleGNlcHRpb247XG4gICAgICAgIHN3aXRjaCAoZXJyb3Iua2luZCkge1xuICAgICAgICAgICAgY2FzZSBcIlJlZmVyZW5jZUVycm9yXCI6XG4gICAgICAgICAgICAgICAgZXhjZXB0aW9uID0gbmV3IFJlZmVyZW5jZUVycm9yKGVycm9yLm1lc3NhZ2UsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIlR5cGVFcnJvclwiOlxuICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiA9IG5ldyBUeXBlRXJyb3IoZXJyb3IubWVzc2FnZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiUnVudGltZUVycm9yXCI6XG4gICAgICAgICAgICAgICAgZXhjZXB0aW9uID0gbmV3IFJ1bnRpbWVFcnJvcihlcnJvci5tZXNzYWdlLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgZXhjZXB0aW9uID0gbmV3IEVycm9yKGVycm9yLm1lc3NhZ2UsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzb2x2ZXJzLnJlamVjdChleGNlcHRpb24pO1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgYW5kIHJlbW92ZXMgdGhlIHJlc3BvbnNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gSUQgZnJvbSB0aGUgY2FsbFJlc3BvbnNlcyBtYXAuXG4gKlxuICogQHBhcmFtIGlkIC0gVGhlIElEIG9mIHRoZSByZXNwb25zZSB0byBiZSByZXRyaWV2ZWQgYW5kIHJlbW92ZWQuXG4gKiBAcmV0dXJucyBUaGUgcmVzcG9uc2Ugb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gSUQsIGlmIGFueS5cbiAqL1xuZnVuY3Rpb24gZ2V0QW5kRGVsZXRlUmVzcG9uc2UoaWQ6IHN0cmluZyk6IFByb21pc2VSZXNvbHZlcnMgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gY2FsbFJlc3BvbnNlcy5nZXQoaWQpO1xuICAgIGNhbGxSZXNwb25zZXMuZGVsZXRlKGlkKTtcbiAgICByZXR1cm4gcmVzcG9uc2U7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgdW5pcXVlIElEIHVzaW5nIHRoZSBuYW5vaWQgbGlicmFyeS5cbiAqXG4gKiBAcmV0dXJucyBBIHVuaXF1ZSBJRCB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBjYWxsUmVzcG9uc2VzIHNldC5cbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVJRCgpOiBzdHJpbmcge1xuICAgIGxldCByZXN1bHQ7XG4gICAgZG8ge1xuICAgICAgICByZXN1bHQgPSBuYW5vaWQoKTtcbiAgICB9IHdoaWxlIChjYWxsUmVzcG9uc2VzLmhhcyhyZXN1bHQpKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIENhbGwgYSBib3VuZCBtZXRob2QgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBjYWxsIG9wdGlvbnMuXG4gKlxuICogSW4gY2FzZSBvZiBmYWlsdXJlLCB0aGUgcmV0dXJuZWQgcHJvbWlzZSB3aWxsIHJlamVjdCB3aXRoIGFuIGV4Y2VwdGlvblxuICogYW1vbmcgUmVmZXJlbmNlRXJyb3IgKHVua25vd24gbWV0aG9kKSwgVHlwZUVycm9yICh3cm9uZyBhcmd1bWVudCBjb3VudCBvciB0eXBlKSxcbiAqIHtAbGluayBSdW50aW1lRXJyb3J9IChtZXRob2QgcmV0dXJuZWQgYW4gZXJyb3IpLCBvciBvdGhlciAobmV0d29yayBvciBpbnRlcm5hbCBlcnJvcnMpLlxuICogVGhlIGV4Y2VwdGlvbiBtaWdodCBoYXZlIGEgXCJjYXVzZVwiIGZpZWxkIHdpdGggdGhlIHZhbHVlIHJldHVybmVkXG4gKiBieSB0aGUgYXBwbGljYXRpb24tIG9yIHNlcnZpY2UtbGV2ZWwgZXJyb3IgbWFyc2hhbGluZyBmdW5jdGlvbnMuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBBIG1ldGhvZCBjYWxsIGRlc2NyaXB0b3IuXG4gKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIHRoZSBjYWxsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQ2FsbChvcHRpb25zOiBDYWxsT3B0aW9ucyk6IENhbmNlbGxhYmxlUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBpZCA9IGdlbmVyYXRlSUQoKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IENhbmNlbGxhYmxlUHJvbWlzZS53aXRoUmVzb2x2ZXJzPGFueT4oKTtcbiAgICBjYWxsUmVzcG9uc2VzLnNldChpZCwgeyByZXNvbHZlOiByZXN1bHQucmVzb2x2ZSwgcmVqZWN0OiByZXN1bHQucmVqZWN0IH0pO1xuXG4gICAgY29uc3QgcmVxdWVzdCA9IGNhbGwoQ2FsbEJpbmRpbmcsIE9iamVjdC5hc3NpZ24oeyBcImNhbGwtaWRcIjogaWQgfSwgb3B0aW9ucykpO1xuICAgIGxldCBydW5uaW5nID0gZmFsc2U7XG5cbiAgICByZXF1ZXN0LnRoZW4oKCkgPT4ge1xuICAgICAgICBydW5uaW5nID0gdHJ1ZTtcbiAgICB9LCAoZXJyKSA9PiB7XG4gICAgICAgIGNhbGxSZXNwb25zZXMuZGVsZXRlKGlkKTtcbiAgICAgICAgcmVzdWx0LnJlamVjdChlcnIpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgY2FuY2VsID0gKCkgPT4ge1xuICAgICAgICBjYWxsUmVzcG9uc2VzLmRlbGV0ZShpZCk7XG4gICAgICAgIHJldHVybiBjYW5jZWxDYWxsKENhbmNlbE1ldGhvZCwge1wiY2FsbC1pZFwiOiBpZH0pLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3Igd2hpbGUgcmVxdWVzdGluZyBiaW5kaW5nIGNhbGwgY2FuY2VsbGF0aW9uOlwiLCBlcnIpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgcmVzdWx0Lm9uY2FuY2VsbGVkID0gKCkgPT4ge1xuICAgICAgICBpZiAocnVubmluZykge1xuICAgICAgICAgICAgcmV0dXJuIGNhbmNlbCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3QudGhlbihjYW5jZWwpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiByZXN1bHQucHJvbWlzZTtcbn1cblxuLyoqXG4gKiBDYWxscyBhIGJvdW5kIG1ldGhvZCBieSBuYW1lIHdpdGggdGhlIHNwZWNpZmllZCBhcmd1bWVudHMuXG4gKiBTZWUge0BsaW5rIENhbGx9IGZvciBkZXRhaWxzLlxuICpcbiAqIEBwYXJhbSBtZXRob2ROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIG1ldGhvZCBpbiB0aGUgZm9ybWF0ICdwYWNrYWdlLnN0cnVjdC5tZXRob2QnLlxuICogQHBhcmFtIGFyZ3MgLSBUaGUgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIG1ldGhvZC5cbiAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgdGhlIG1ldGhvZCBjYWxsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQnlOYW1lKG1ldGhvZE5hbWU6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBDYW5jZWxsYWJsZVByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIENhbGwoeyBtZXRob2ROYW1lLCBhcmdzIH0pO1xufVxuXG4vKipcbiAqIENhbGxzIGEgbWV0aG9kIGJ5IGl0cyBudW1lcmljIElEIHdpdGggdGhlIHNwZWNpZmllZCBhcmd1bWVudHMuXG4gKiBTZWUge0BsaW5rIENhbGx9IGZvciBkZXRhaWxzLlxuICpcbiAqIEBwYXJhbSBtZXRob2RJRCAtIFRoZSBJRCBvZiB0aGUgbWV0aG9kIHRvIGNhbGwuXG4gKiBAcGFyYW0gYXJncyAtIFRoZSBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgbWV0aG9kLlxuICogQHJldHVybiBUaGUgcmVzdWx0IG9mIHRoZSBtZXRob2QgY2FsbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEJ5SUQobWV0aG9kSUQ6IG51bWJlciwgLi4uYXJnczogYW55W10pOiBDYW5jZWxsYWJsZVByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIENhbGwoeyBtZXRob2RJRCwgYXJncyB9KTtcbn1cbiIsICIvLyBTb3VyY2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9pbnNwZWN0LWpzL2lzLWNhbGxhYmxlXG5cbi8vIFRoZSBNSVQgTGljZW5zZSAoTUlUKVxuLy9cbi8vIENvcHlyaWdodCAoYykgMjAxNSBKb3JkYW4gSGFyYmFuZFxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbi8vIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuLy8gU09GVFdBUkUuXG5cbnZhciBmblRvU3RyID0gRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyIHJlZmxlY3RBcHBseTogdHlwZW9mIFJlZmxlY3QuYXBwbHkgfCBmYWxzZSB8IG51bGwgPSB0eXBlb2YgUmVmbGVjdCA9PT0gJ29iamVjdCcgJiYgUmVmbGVjdCAhPT0gbnVsbCAmJiBSZWZsZWN0LmFwcGx5O1xudmFyIGJhZEFycmF5TGlrZTogYW55O1xudmFyIGlzQ2FsbGFibGVNYXJrZXI6IGFueTtcbmlmICh0eXBlb2YgcmVmbGVjdEFwcGx5ID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBPYmplY3QuZGVmaW5lUHJvcGVydHkgPT09ICdmdW5jdGlvbicpIHtcbiAgICB0cnkge1xuICAgICAgICBiYWRBcnJheUxpa2UgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdsZW5ndGgnLCB7XG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBpc0NhbGxhYmxlTWFya2VyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaXNDYWxsYWJsZU1hcmtlciA9IHt9O1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdGhyb3ctbGl0ZXJhbFxuICAgICAgICByZWZsZWN0QXBwbHkoZnVuY3Rpb24gKCkgeyB0aHJvdyA0MjsgfSwgbnVsbCwgYmFkQXJyYXlMaWtlKTtcbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgIGlmIChfICE9PSBpc0NhbGxhYmxlTWFya2VyKSB7XG4gICAgICAgICAgICByZWZsZWN0QXBwbHkgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxufSBlbHNlIHtcbiAgICByZWZsZWN0QXBwbHkgPSBudWxsO1xufVxuXG52YXIgY29uc3RydWN0b3JSZWdleCA9IC9eXFxzKmNsYXNzXFxiLztcbnZhciBpc0VTNkNsYXNzRm4gPSBmdW5jdGlvbiBpc0VTNkNsYXNzRnVuY3Rpb24odmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICAgIHZhciBmblN0ciA9IGZuVG9TdHIuY2FsbCh2YWx1ZSk7XG4gICAgICAgIHJldHVybiBjb25zdHJ1Y3RvclJlZ2V4LnRlc3QoZm5TdHIpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBub3QgYSBmdW5jdGlvblxuICAgIH1cbn07XG5cbnZhciB0cnlGdW5jdGlvbk9iamVjdCA9IGZ1bmN0aW9uIHRyeUZ1bmN0aW9uVG9TdHIodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICAgIGlmIChpc0VTNkNsYXNzRm4odmFsdWUpKSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgICBmblRvU3RyLmNhbGwodmFsdWUpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59O1xudmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciBvYmplY3RDbGFzcyA9ICdbb2JqZWN0IE9iamVjdF0nO1xudmFyIGZuQ2xhc3MgPSAnW29iamVjdCBGdW5jdGlvbl0nO1xudmFyIGdlbkNsYXNzID0gJ1tvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dJztcbnZhciBkZGFDbGFzcyA9ICdbb2JqZWN0IEhUTUxBbGxDb2xsZWN0aW9uXSc7IC8vIElFIDExXG52YXIgZGRhQ2xhc3MyID0gJ1tvYmplY3QgSFRNTCBkb2N1bWVudC5hbGwgY2xhc3NdJztcbnZhciBkZGFDbGFzczMgPSAnW29iamVjdCBIVE1MQ29sbGVjdGlvbl0nOyAvLyBJRSA5LTEwXG52YXIgaGFzVG9TdHJpbmdUYWcgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmICEhU3ltYm9sLnRvU3RyaW5nVGFnOyAvLyBiZXR0ZXI6IHVzZSBgaGFzLXRvc3RyaW5ndGFnYFxuXG52YXIgaXNJRTY4ID0gISgwIGluIFssXSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc3BhcnNlLWFycmF5cywgY29tbWEtc3BhY2luZ1xuXG52YXIgaXNEREE6ICh2YWx1ZTogYW55KSA9PiBib29sZWFuID0gZnVuY3Rpb24gaXNEb2N1bWVudERvdEFsbCgpIHsgcmV0dXJuIGZhbHNlOyB9O1xuaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ29iamVjdCcpIHtcbiAgICAvLyBGaXJlZm94IDMgY2Fub25pY2FsaXplcyBEREEgdG8gdW5kZWZpbmVkIHdoZW4gaXQncyBub3QgYWNjZXNzZWQgZGlyZWN0bHlcbiAgICB2YXIgYWxsID0gZG9jdW1lbnQuYWxsO1xuICAgIGlmICh0b1N0ci5jYWxsKGFsbCkgPT09IHRvU3RyLmNhbGwoZG9jdW1lbnQuYWxsKSkge1xuICAgICAgICBpc0REQSA9IGZ1bmN0aW9uIGlzRG9jdW1lbnREb3RBbGwodmFsdWUpIHtcbiAgICAgICAgICAgIC8qIGdsb2JhbHMgZG9jdW1lbnQ6IGZhbHNlICovXG4gICAgICAgICAgICAvLyBpbiBJRSA2LTgsIHR5cGVvZiBkb2N1bWVudC5hbGwgaXMgXCJvYmplY3RcIiBhbmQgaXQncyB0cnV0aHlcbiAgICAgICAgICAgIGlmICgoaXNJRTY4IHx8ICF2YWx1ZSkgJiYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JykpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3RyID0gdG9TdHIuY2FsbCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHIgPT09IGRkYUNsYXNzXG4gICAgICAgICAgICAgICAgICAgICAgICB8fCBzdHIgPT09IGRkYUNsYXNzMlxuICAgICAgICAgICAgICAgICAgICAgICAgfHwgc3RyID09PSBkZGFDbGFzczMgLy8gb3BlcmEgMTIuMTZcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IHN0ciA9PT0gb2JqZWN0Q2xhc3MgLy8gSUUgNi04XG4gICAgICAgICAgICAgICAgICAgICkgJiYgdmFsdWUoJycpID09IG51bGw7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZXFlcWVxXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgeyAvKiovIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGlzQ2FsbGFibGVSZWZBcHBseTxUPih2YWx1ZTogVCB8IHVua25vd24pOiB2YWx1ZSBpcyAoLi4uYXJnczogYW55W10pID0+IGFueSAge1xuICAgIGlmIChpc0REQSh2YWx1ZSkpIHsgcmV0dXJuIHRydWU7IH1cbiAgICBpZiAoIXZhbHVlKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgeyByZXR1cm4gZmFsc2U7IH1cbiAgICB0cnkge1xuICAgICAgICAocmVmbGVjdEFwcGx5IGFzIGFueSkodmFsdWUsIG51bGwsIGJhZEFycmF5TGlrZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoZSAhPT0gaXNDYWxsYWJsZU1hcmtlcikgeyByZXR1cm4gZmFsc2U7IH1cbiAgICB9XG4gICAgcmV0dXJuICFpc0VTNkNsYXNzRm4odmFsdWUpICYmIHRyeUZ1bmN0aW9uT2JqZWN0KHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gaXNDYWxsYWJsZU5vUmVmQXBwbHk8VD4odmFsdWU6IFQgfCB1bmtub3duKTogdmFsdWUgaXMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkge1xuICAgIGlmIChpc0REQSh2YWx1ZSkpIHsgcmV0dXJuIHRydWU7IH1cbiAgICBpZiAoIXZhbHVlKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBpZiAoaGFzVG9TdHJpbmdUYWcpIHsgcmV0dXJuIHRyeUZ1bmN0aW9uT2JqZWN0KHZhbHVlKTsgfVxuICAgIGlmIChpc0VTNkNsYXNzRm4odmFsdWUpKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIHZhciBzdHJDbGFzcyA9IHRvU3RyLmNhbGwodmFsdWUpO1xuICAgIGlmIChzdHJDbGFzcyAhPT0gZm5DbGFzcyAmJiBzdHJDbGFzcyAhPT0gZ2VuQ2xhc3MgJiYgISgvXlxcW29iamVjdCBIVE1MLykudGVzdChzdHJDbGFzcykpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgcmV0dXJuIHRyeUZ1bmN0aW9uT2JqZWN0KHZhbHVlKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHJlZmxlY3RBcHBseSA/IGlzQ2FsbGFibGVSZWZBcHBseSA6IGlzQ2FsbGFibGVOb1JlZkFwcGx5O1xuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5pbXBvcnQgaXNDYWxsYWJsZSBmcm9tIFwiLi9jYWxsYWJsZS5qc1wiO1xuXG4vKipcbiAqIEV4Y2VwdGlvbiBjbGFzcyB0aGF0IHdpbGwgYmUgdXNlZCBhcyByZWplY3Rpb24gcmVhc29uXG4gKiBpbiBjYXNlIGEge0BsaW5rIENhbmNlbGxhYmxlUHJvbWlzZX0gaXMgY2FuY2VsbGVkIHN1Y2Nlc3NmdWxseS5cbiAqXG4gKiBUaGUgdmFsdWUgb2YgdGhlIHtAbGluayBuYW1lfSBwcm9wZXJ0eSBpcyB0aGUgc3RyaW5nIGBcIkNhbmNlbEVycm9yXCJgLlxuICogVGhlIHZhbHVlIG9mIHRoZSB7QGxpbmsgY2F1c2V9IHByb3BlcnR5IGlzIHRoZSBjYXVzZSBwYXNzZWQgdG8gdGhlIGNhbmNlbCBtZXRob2QsIGlmIGFueS5cbiAqL1xuZXhwb3J0IGNsYXNzIENhbmNlbEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgYSBuZXcgYENhbmNlbEVycm9yYCBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZSAtIFRoZSBlcnJvciBtZXNzYWdlLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBiZSBmb3J3YXJkZWQgdG8gdGhlIEVycm9yIGNvbnN0cnVjdG9yLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcsIG9wdGlvbnM/OiBFcnJvck9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSwgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiQ2FuY2VsRXJyb3JcIjtcbiAgICB9XG59XG5cbi8qKlxuICogRXhjZXB0aW9uIGNsYXNzIHRoYXQgd2lsbCBiZSByZXBvcnRlZCBhcyBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uXG4gKiBpbiBjYXNlIGEge0BsaW5rIENhbmNlbGxhYmxlUHJvbWlzZX0gcmVqZWN0cyBhZnRlciBiZWluZyBjYW5jZWxsZWQsXG4gKiBvciB3aGVuIHRoZSBgb25jYW5jZWxsZWRgIGNhbGxiYWNrIHRocm93cyBvciByZWplY3RzLlxuICpcbiAqIFRoZSB2YWx1ZSBvZiB0aGUge0BsaW5rIG5hbWV9IHByb3BlcnR5IGlzIHRoZSBzdHJpbmcgYFwiQ2FuY2VsbGVkUmVqZWN0aW9uRXJyb3JcImAuXG4gKiBUaGUgdmFsdWUgb2YgdGhlIHtAbGluayBjYXVzZX0gcHJvcGVydHkgaXMgdGhlIHJlYXNvbiB0aGUgcHJvbWlzZSByZWplY3RlZCB3aXRoLlxuICpcbiAqIEJlY2F1c2UgdGhlIG9yaWdpbmFsIHByb21pc2Ugd2FzIGNhbmNlbGxlZCxcbiAqIGEgd3JhcHBlciBwcm9taXNlIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSB1bmhhbmRsZWQgcmVqZWN0aW9uIGxpc3RlbmVyIGluc3RlYWQuXG4gKiBUaGUge0BsaW5rIHByb21pc2V9IHByb3BlcnR5IGhvbGRzIGEgcmVmZXJlbmNlIHRvIHRoZSBvcmlnaW5hbCBwcm9taXNlLlxuICovXG5leHBvcnQgY2xhc3MgQ2FuY2VsbGVkUmVqZWN0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgLyoqXG4gICAgICogSG9sZHMgYSByZWZlcmVuY2UgdG8gdGhlIHByb21pc2UgdGhhdCB3YXMgY2FuY2VsbGVkIGFuZCB0aGVuIHJlamVjdGVkLlxuICAgICAqL1xuICAgIHByb21pc2U6IENhbmNlbGxhYmxlUHJvbWlzZTx1bmtub3duPjtcblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgYSBuZXcgYENhbmNlbGxlZFJlamVjdGlvbkVycm9yYCBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0gcHJvbWlzZSAtIFRoZSBwcm9taXNlIHRoYXQgY2F1c2VkIHRoZSBlcnJvciBvcmlnaW5hbGx5LlxuICAgICAqIEBwYXJhbSByZWFzb24gLSBUaGUgcmVqZWN0aW9uIHJlYXNvbi5cbiAgICAgKiBAcGFyYW0gaW5mbyAtIEFuIG9wdGlvbmFsIGluZm9ybWF0aXZlIG1lc3NhZ2Ugc3BlY2lmeWluZyB0aGUgY2lyY3Vtc3RhbmNlcyBpbiB3aGljaCB0aGUgZXJyb3Igd2FzIHRocm93bi5cbiAgICAgKiAgICAgICAgICAgICAgIERlZmF1bHRzIHRvIHRoZSBzdHJpbmcgYFwiVW5oYW5kbGVkIHJlamVjdGlvbiBpbiBjYW5jZWxsZWQgcHJvbWlzZS5cImAuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocHJvbWlzZTogQ2FuY2VsbGFibGVQcm9taXNlPHVua25vd24+LCByZWFzb24/OiBhbnksIGluZm8/OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKGluZm8gPz8gXCJVbmhhbmRsZWQgcmVqZWN0aW9uIGluIGNhbmNlbGxlZCBwcm9taXNlLlwiKSArIFwiIFJlYXNvbjogXCIgKyBlcnJvck1lc3NhZ2UocmVhc29uKSwgeyBjYXVzZTogcmVhc29uIH0pO1xuICAgICAgICB0aGlzLnByb21pc2UgPSBwcm9taXNlO1xuICAgICAgICB0aGlzLm5hbWUgPSBcIkNhbmNlbGxlZFJlamVjdGlvbkVycm9yXCI7XG4gICAgfVxufVxuXG50eXBlIENhbmNlbGxhYmxlUHJvbWlzZVJlc29sdmVyPFQ+ID0gKHZhbHVlOiBUIHwgUHJvbWlzZUxpa2U8VD4gfCBDYW5jZWxsYWJsZVByb21pc2VMaWtlPFQ+KSA9PiB2b2lkO1xudHlwZSBDYW5jZWxsYWJsZVByb21pc2VSZWplY3RvciA9IChyZWFzb24/OiBhbnkpID0+IHZvaWQ7XG50eXBlIENhbmNlbGxhYmxlUHJvbWlzZUNhbmNlbGxlciA9IChjYXVzZT86IGFueSkgPT4gdm9pZCB8IFByb21pc2VMaWtlPHZvaWQ+O1xudHlwZSBDYW5jZWxsYWJsZVByb21pc2VFeGVjdXRvcjxUPiA9IChyZXNvbHZlOiBDYW5jZWxsYWJsZVByb21pc2VSZXNvbHZlcjxUPiwgcmVqZWN0OiBDYW5jZWxsYWJsZVByb21pc2VSZWplY3RvcikgPT4gdm9pZDtcblxuZXhwb3J0IGludGVyZmFjZSBDYW5jZWxsYWJsZVByb21pc2VMaWtlPFQ+IHtcbiAgICB0aGVuPFRSZXN1bHQxID0gVCwgVFJlc3VsdDIgPSBuZXZlcj4ob25mdWxmaWxsZWQ/OiAoKHZhbHVlOiBUKSA9PiBUUmVzdWx0MSB8IFByb21pc2VMaWtlPFRSZXN1bHQxPiB8IENhbmNlbGxhYmxlUHJvbWlzZUxpa2U8VFJlc3VsdDE+KSB8IHVuZGVmaW5lZCB8IG51bGwsIG9ucmVqZWN0ZWQ/OiAoKHJlYXNvbjogYW55KSA9PiBUUmVzdWx0MiB8IFByb21pc2VMaWtlPFRSZXN1bHQyPiB8IENhbmNlbGxhYmxlUHJvbWlzZUxpa2U8VFJlc3VsdDI+KSB8IHVuZGVmaW5lZCB8IG51bGwpOiBDYW5jZWxsYWJsZVByb21pc2VMaWtlPFRSZXN1bHQxIHwgVFJlc3VsdDI+O1xuICAgIGNhbmNlbChjYXVzZT86IGFueSk6IHZvaWQ7XG59XG5cbi8qKlxuICogV3JhcHMgYSBjYW5jZWxsYWJsZSBwcm9taXNlIGFsb25nIHdpdGggaXRzIHJlc29sdXRpb24gbWV0aG9kcy5cbiAqIFRoZSBgb25jYW5jZWxsZWRgIGZpZWxkIHdpbGwgYmUgbnVsbCBpbml0aWFsbHkgYnV0IG1heSBiZSBzZXQgdG8gcHJvdmlkZSBhIGN1c3RvbSBjYW5jZWxsYXRpb24gZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FuY2VsbGFibGVQcm9taXNlV2l0aFJlc29sdmVyczxUPiB7XG4gICAgcHJvbWlzZTogQ2FuY2VsbGFibGVQcm9taXNlPFQ+O1xuICAgIHJlc29sdmU6IENhbmNlbGxhYmxlUHJvbWlzZVJlc29sdmVyPFQ+O1xuICAgIHJlamVjdDogQ2FuY2VsbGFibGVQcm9taXNlUmVqZWN0b3I7XG4gICAgb25jYW5jZWxsZWQ6IENhbmNlbGxhYmxlUHJvbWlzZUNhbmNlbGxlciB8IG51bGw7XG59XG5cbmludGVyZmFjZSBDYW5jZWxsYWJsZVByb21pc2VTdGF0ZSB7XG4gICAgcmVhZG9ubHkgcm9vdDogQ2FuY2VsbGFibGVQcm9taXNlU3RhdGU7XG4gICAgcmVzb2x2aW5nOiBib29sZWFuO1xuICAgIHNldHRsZWQ6IGJvb2xlYW47XG4gICAgcmVhc29uPzogQ2FuY2VsRXJyb3I7XG59XG5cbi8vIFByaXZhdGUgZmllbGQgbmFtZXMuXG5jb25zdCBiYXJyaWVyU3ltID0gU3ltYm9sKFwiYmFycmllclwiKTtcbmNvbnN0IGNhbmNlbEltcGxTeW0gPSBTeW1ib2woXCJjYW5jZWxJbXBsXCIpO1xuY29uc3Qgc3BlY2llcyA9IFN5bWJvbC5zcGVjaWVzID8/IFN5bWJvbChcInNwZWNpZXNQb2x5ZmlsbFwiKTtcblxuLyoqXG4gKiBBIHByb21pc2Ugd2l0aCBhbiBhdHRhY2hlZCBtZXRob2QgZm9yIGNhbmNlbGxpbmcgbG9uZy1ydW5uaW5nIG9wZXJhdGlvbnMgKHNlZSB7QGxpbmsgQ2FuY2VsbGFibGVQcm9taXNlI2NhbmNlbH0pLlxuICogQ2FuY2VsbGF0aW9uIGNhbiBvcHRpb25hbGx5IGJlIGJvdW5kIHRvIGFuIHtAbGluayBBYm9ydFNpZ25hbH1cbiAqIGZvciBiZXR0ZXIgY29tcG9zYWJpbGl0eSAoc2VlIHtAbGluayBDYW5jZWxsYWJsZVByb21pc2UjY2FuY2VsT259KS5cbiAqXG4gKiBDYW5jZWxsaW5nIGEgcGVuZGluZyBwcm9taXNlIHdpbGwgcmVzdWx0IGluIGFuIGltbWVkaWF0ZSByZWplY3Rpb25cbiAqIHdpdGggYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIENhbmNlbEVycm9yfSBhcyByZWFzb24sXG4gKiBidXQgd2hvZXZlciBzdGFydGVkIHRoZSBwcm9taXNlIHdpbGwgYmUgcmVzcG9uc2libGVcbiAqIGZvciBhY3R1YWxseSBhYm9ydGluZyB0aGUgdW5kZXJseWluZyBvcGVyYXRpb24uXG4gKiBUbyB0aGlzIHB1cnBvc2UsIHRoZSBjb25zdHJ1Y3RvciBhbmQgYWxsIGNoYWluaW5nIG1ldGhvZHNcbiAqIGFjY2VwdCBvcHRpb25hbCBjYW5jZWxsYXRpb24gY2FsbGJhY2tzLlxuICpcbiAqIElmIGEgYENhbmNlbGxhYmxlUHJvbWlzZWAgc3RpbGwgcmVzb2x2ZXMgYWZ0ZXIgaGF2aW5nIGJlZW4gY2FuY2VsbGVkLFxuICogdGhlIHJlc3VsdCB3aWxsIGJlIGRpc2NhcmRlZC4gSWYgaXQgcmVqZWN0cywgdGhlIHJlYXNvblxuICogd2lsbCBiZSByZXBvcnRlZCBhcyBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uLFxuICogd3JhcHBlZCBpbiBhIHtAbGluayBDYW5jZWxsZWRSZWplY3Rpb25FcnJvcn0gaW5zdGFuY2UuXG4gKiBUbyBmYWNpbGl0YXRlIHRoZSBoYW5kbGluZyBvZiBjYW5jZWxsYXRpb24gcmVxdWVzdHMsXG4gKiBjYW5jZWxsZWQgYENhbmNlbGxhYmxlUHJvbWlzZWBzIHdpbGwgX25vdF8gcmVwb3J0IHVuaGFuZGxlZCBgQ2FuY2VsRXJyb3Jgc1xuICogd2hvc2UgYGNhdXNlYCBmaWVsZCBpcyB0aGUgc2FtZSBhcyB0aGUgb25lIHdpdGggd2hpY2ggdGhlIGN1cnJlbnQgcHJvbWlzZSB3YXMgY2FuY2VsbGVkLlxuICpcbiAqIEFsbCB1c3VhbCBwcm9taXNlIG1ldGhvZHMgYXJlIGRlZmluZWQgYW5kIHJldHVybiBhIGBDYW5jZWxsYWJsZVByb21pc2VgXG4gKiB3aG9zZSBjYW5jZWwgbWV0aG9kIHdpbGwgY2FuY2VsIHRoZSBwYXJlbnQgb3BlcmF0aW9uIGFzIHdlbGwsIHByb3BhZ2F0aW5nIHRoZSBjYW5jZWxsYXRpb24gcmVhc29uXG4gKiB1cHdhcmRzIHRocm91Z2ggcHJvbWlzZSBjaGFpbnMuXG4gKiBDb252ZXJzZWx5LCBjYW5jZWxsaW5nIGEgcHJvbWlzZSB3aWxsIG5vdCBhdXRvbWF0aWNhbGx5IGNhbmNlbCBkZXBlbmRlbnQgcHJvbWlzZXMgZG93bnN0cmVhbTpcbiAqIGBgYHRzXG4gKiBsZXQgcm9vdCA9IG5ldyBDYW5jZWxsYWJsZVByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4geyAuLi4gfSk7XG4gKiBsZXQgY2hpbGQxID0gcm9vdC50aGVuKCgpID0+IHsgLi4uIH0pO1xuICogbGV0IGNoaWxkMiA9IGNoaWxkMS50aGVuKCgpID0+IHsgLi4uIH0pO1xuICogbGV0IGNoaWxkMyA9IHJvb3QuY2F0Y2goKCkgPT4geyAuLi4gfSk7XG4gKiBjaGlsZDEuY2FuY2VsKCk7IC8vIENhbmNlbHMgY2hpbGQxIGFuZCByb290LCBidXQgbm90IGNoaWxkMiBvciBjaGlsZDNcbiAqIGBgYFxuICogQ2FuY2VsbGluZyBhIHByb21pc2UgdGhhdCBoYXMgYWxyZWFkeSBzZXR0bGVkIGlzIHNhZmUgYW5kIGhhcyBubyBjb25zZXF1ZW5jZS5cbiAqXG4gKiBUaGUgYGNhbmNlbGAgbWV0aG9kIHJldHVybnMgYSBwcm9taXNlIHRoYXQgX2Fsd2F5cyBmdWxmaWxsc19cbiAqIGFmdGVyIHRoZSB3aG9sZSBjaGFpbiBoYXMgcHJvY2Vzc2VkIHRoZSBjYW5jZWwgcmVxdWVzdFxuICogYW5kIGFsbCBhdHRhY2hlZCBjYWxsYmFja3MgdXAgdG8gdGhhdCBtb21lbnQgaGF2ZSBydW4uXG4gKlxuICogQWxsIEVTMjAyNCBwcm9taXNlIG1ldGhvZHMgKHN0YXRpYyBhbmQgaW5zdGFuY2UpIGFyZSBkZWZpbmVkIG9uIENhbmNlbGxhYmxlUHJvbWlzZSxcbiAqIGJ1dCBhY3R1YWwgYXZhaWxhYmlsaXR5IG1heSB2YXJ5IHdpdGggT1Mvd2VidmlldyB2ZXJzaW9uLlxuICpcbiAqIEluIGxpbmUgd2l0aCB0aGUgcHJvcG9zYWwgYXQgaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtcm0tYnVpbHRpbi1zdWJjbGFzc2luZyxcbiAqIGBDYW5jZWxsYWJsZVByb21pc2VgIGRvZXMgbm90IHN1cHBvcnQgdHJhbnNwYXJlbnQgc3ViY2xhc3NpbmcuXG4gKiBFeHRlbmRlcnMgc2hvdWxkIHRha2UgY2FyZSB0byBwcm92aWRlIHRoZWlyIG93biBtZXRob2QgaW1wbGVtZW50YXRpb25zLlxuICogVGhpcyBtaWdodCBiZSByZWNvbnNpZGVyZWQgaW4gY2FzZSB0aGUgcHJvcG9zYWwgaXMgcmV0aXJlZC5cbiAqXG4gKiBDYW5jZWxsYWJsZVByb21pc2UgaXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgRE9NIFByb21pc2Ugb2JqZWN0XG4gKiBhbmQgaXMgY29tcGxpYW50IHdpdGggdGhlIFtQcm9taXNlcy9BKyBzcGVjaWZpY2F0aW9uXShodHRwczovL3Byb21pc2VzYXBsdXMuY29tLylcbiAqIChpdCBwYXNzZXMgdGhlIFtjb21wbGlhbmNlIHN1aXRlXShodHRwczovL2dpdGh1Yi5jb20vcHJvbWlzZXMtYXBsdXMvcHJvbWlzZXMtdGVzdHMpKVxuICogaWYgc28gaXMgdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBDYW5jZWxsYWJsZVByb21pc2U8VD4gZXh0ZW5kcyBQcm9taXNlPFQ+IGltcGxlbWVudHMgUHJvbWlzZUxpa2U8VD4sIENhbmNlbGxhYmxlUHJvbWlzZUxpa2U8VD4ge1xuICAgIC8vIFByaXZhdGUgZmllbGRzLlxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBwcml2YXRlIFtiYXJyaWVyU3ltXSE6IFBhcnRpYWw8UHJvbWlzZVdpdGhSZXNvbHZlcnM8dm9pZD4+IHwgbnVsbDtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBbY2FuY2VsSW1wbFN5bV0hOiAocmVhc29uOiBDYW5jZWxFcnJvcikgPT4gdm9pZCB8IFByb21pc2VMaWtlPHZvaWQ+O1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBgQ2FuY2VsbGFibGVQcm9taXNlYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBleGVjdXRvciAtIEEgY2FsbGJhY2sgdXNlZCB0byBpbml0aWFsaXplIHRoZSBwcm9taXNlLiBUaGlzIGNhbGxiYWNrIGlzIHBhc3NlZCB0d28gYXJndW1lbnRzOlxuICAgICAqICAgICAgICAgICAgICAgICAgIGEgYHJlc29sdmVgIGNhbGxiYWNrIHVzZWQgdG8gcmVzb2x2ZSB0aGUgcHJvbWlzZSB3aXRoIGEgdmFsdWVcbiAgICAgKiAgICAgICAgICAgICAgICAgICBvciB0aGUgcmVzdWx0IG9mIGFub3RoZXIgcHJvbWlzZSAocG9zc2libHkgY2FuY2VsbGFibGUpLFxuICAgICAqICAgICAgICAgICAgICAgICAgIGFuZCBhIGByZWplY3RgIGNhbGxiYWNrIHVzZWQgdG8gcmVqZWN0IHRoZSBwcm9taXNlIHdpdGggYSBwcm92aWRlZCByZWFzb24gb3IgZXJyb3IuXG4gICAgICogICAgICAgICAgICAgICAgICAgSWYgdGhlIHZhbHVlIHByb3ZpZGVkIHRvIHRoZSBgcmVzb2x2ZWAgY2FsbGJhY2sgaXMgYSB0aGVuYWJsZSBfYW5kXyBjYW5jZWxsYWJsZSBvYmplY3RcbiAgICAgKiAgICAgICAgICAgICAgICAgICAoaXQgaGFzIGEgYHRoZW5gIF9hbmRfIGEgYGNhbmNlbGAgbWV0aG9kKSxcbiAgICAgKiAgICAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb24gcmVxdWVzdHMgd2lsbCBiZSBmb3J3YXJkZWQgdG8gdGhhdCBvYmplY3QgYW5kIHRoZSBvbmNhbmNlbGxlZCB3aWxsIG5vdCBiZSBpbnZva2VkIGFueW1vcmUuXG4gICAgICogICAgICAgICAgICAgICAgICAgSWYgYW55IG9uZSBvZiB0aGUgdHdvIGNhbGxiYWNrcyBpcyBjYWxsZWQgX2FmdGVyXyB0aGUgcHJvbWlzZSBoYXMgYmVlbiBjYW5jZWxsZWQsXG4gICAgICogICAgICAgICAgICAgICAgICAgdGhlIHByb3ZpZGVkIHZhbHVlcyB3aWxsIGJlIGNhbmNlbGxlZCBhbmQgcmVzb2x2ZWQgYXMgdXN1YWwsXG4gICAgICogICAgICAgICAgICAgICAgICAgYnV0IHRoZWlyIHJlc3VsdHMgd2lsbCBiZSBkaXNjYXJkZWQuXG4gICAgICogICAgICAgICAgICAgICAgICAgSG93ZXZlciwgaWYgdGhlIHJlc29sdXRpb24gcHJvY2VzcyB1bHRpbWF0ZWx5IGVuZHMgdXAgaW4gYSByZWplY3Rpb25cbiAgICAgKiAgICAgICAgICAgICAgICAgICB0aGF0IGlzIG5vdCBkdWUgdG8gY2FuY2VsbGF0aW9uLCB0aGUgcmVqZWN0aW9uIHJlYXNvblxuICAgICAqICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgd3JhcHBlZCBpbiBhIHtAbGluayBDYW5jZWxsZWRSZWplY3Rpb25FcnJvcn1cbiAgICAgKiAgICAgICAgICAgICAgICAgICBhbmQgYnViYmxlZCB1cCBhcyBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uLlxuICAgICAqIEBwYXJhbSBvbmNhbmNlbGxlZCAtIEl0IGlzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBlbnN1cmUgdGhhdCBhbnkgb3BlcmF0aW9uXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgc3RhcnRlZCBieSB0aGUgZXhlY3V0b3IgaXMgcHJvcGVybHkgaGFsdGVkIHVwb24gY2FuY2VsbGF0aW9uLlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIFRoaXMgb3B0aW9uYWwgY2FsbGJhY2sgY2FuIGJlIHVzZWQgdG8gdGhhdCBwdXJwb3NlLlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIEl0IHdpbGwgYmUgY2FsbGVkIF9zeW5jaHJvbm91c2x5XyB3aXRoIGEgY2FuY2VsbGF0aW9uIGNhdXNlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgd2hlbiBjYW5jZWxsYXRpb24gaXMgcmVxdWVzdGVkLCBfYWZ0ZXJfIHRoZSBwcm9taXNlIGhhcyBhbHJlYWR5IHJlamVjdGVkXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgd2l0aCBhIHtAbGluayBDYW5jZWxFcnJvcn0sIGJ1dCBfYmVmb3JlX1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgIGFueSB7QGxpbmsgdGhlbn0ve0BsaW5rIGNhdGNofS97QGxpbmsgZmluYWxseX0gY2FsbGJhY2sgcnVucy5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgY2FsbGJhY2sgcmV0dXJucyBhIHRoZW5hYmxlLCB0aGUgcHJvbWlzZSByZXR1cm5lZCBmcm9tIHtAbGluayBjYW5jZWx9XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgd2lsbCBvbmx5IGZ1bGZpbGwgYWZ0ZXIgdGhlIGZvcm1lciBoYXMgc2V0dGxlZC5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBVbmhhbmRsZWQgZXhjZXB0aW9ucyBvciByZWplY3Rpb25zIGZyb20gdGhlIGNhbGxiYWNrIHdpbGwgYmUgd3JhcHBlZFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIGluIGEge0BsaW5rIENhbmNlbGxlZFJlamVjdGlvbkVycm9yfSBhbmQgYnViYmxlZCB1cCBhcyB1bmhhbmRsZWQgcmVqZWN0aW9ucy5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgYHJlc29sdmVgIGNhbGxiYWNrIGlzIGNhbGxlZCBiZWZvcmUgY2FuY2VsbGF0aW9uIHdpdGggYSBjYW5jZWxsYWJsZSBwcm9taXNlLFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyBvbiB0aGlzIHByb21pc2Ugd2lsbCBiZSBkaXZlcnRlZCB0byB0aGF0IHByb21pc2UsXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZSBvcmlnaW5hbCBgb25jYW5jZWxsZWRgIGNhbGxiYWNrIHdpbGwgYmUgZGlzY2FyZGVkLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGV4ZWN1dG9yOiBDYW5jZWxsYWJsZVByb21pc2VFeGVjdXRvcjxUPiwgb25jYW5jZWxsZWQ/OiBDYW5jZWxsYWJsZVByb21pc2VDYW5jZWxsZXIpIHtcbiAgICAgICAgbGV0IHJlc29sdmUhOiAodmFsdWU6IFQgfCBQcm9taXNlTGlrZTxUPikgPT4gdm9pZDtcbiAgICAgICAgbGV0IHJlamVjdCE6IChyZWFzb24/OiBhbnkpID0+IHZvaWQ7XG4gICAgICAgIHN1cGVyKChyZXMsIHJlaikgPT4geyByZXNvbHZlID0gcmVzOyByZWplY3QgPSByZWo7IH0pO1xuXG4gICAgICAgIGlmICgodGhpcy5jb25zdHJ1Y3RvciBhcyBhbnkpW3NwZWNpZXNdICE9PSBQcm9taXNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2FuY2VsbGFibGVQcm9taXNlIGRvZXMgbm90IHN1cHBvcnQgdHJhbnNwYXJlbnQgc3ViY2xhc3NpbmcuIFBsZWFzZSByZWZyYWluIGZyb20gb3ZlcnJpZGluZyB0aGUgW1N5bWJvbC5zcGVjaWVzXSBzdGF0aWMgcHJvcGVydHkuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHByb21pc2U6IENhbmNlbGxhYmxlUHJvbWlzZVdpdGhSZXNvbHZlcnM8VD4gPSB7XG4gICAgICAgICAgICBwcm9taXNlOiB0aGlzLFxuICAgICAgICAgICAgcmVzb2x2ZSxcbiAgICAgICAgICAgIHJlamVjdCxcbiAgICAgICAgICAgIGdldCBvbmNhbmNlbGxlZCgpIHsgcmV0dXJuIG9uY2FuY2VsbGVkID8/IG51bGw7IH0sXG4gICAgICAgICAgICBzZXQgb25jYW5jZWxsZWQoY2IpIHsgb25jYW5jZWxsZWQgPSBjYiA/PyB1bmRlZmluZWQ7IH1cbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBzdGF0ZTogQ2FuY2VsbGFibGVQcm9taXNlU3RhdGUgPSB7XG4gICAgICAgICAgICBnZXQgcm9vdCgpIHsgcmV0dXJuIHN0YXRlOyB9LFxuICAgICAgICAgICAgcmVzb2x2aW5nOiBmYWxzZSxcbiAgICAgICAgICAgIHNldHRsZWQ6IGZhbHNlXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gU2V0dXAgY2FuY2VsbGF0aW9uIHN5c3RlbS5cbiAgICAgICAgdm9pZCBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgICAgICAgICBbYmFycmllclN5bV06IHtcbiAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW2NhbmNlbEltcGxTeW1dOiB7XG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGNhbmNlbGxlckZvcihwcm9taXNlLCBzdGF0ZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUnVuIHRoZSBhY3R1YWwgZXhlY3V0b3IuXG4gICAgICAgIGNvbnN0IHJlamVjdG9yID0gcmVqZWN0b3JGb3IocHJvbWlzZSwgc3RhdGUpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZXhlY3V0b3IocmVzb2x2ZXJGb3IocHJvbWlzZSwgc3RhdGUpLCByZWplY3Rvcik7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKHN0YXRlLnJlc29sdmluZykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVW5oYW5kbGVkIGV4Y2VwdGlvbiBpbiBDYW5jZWxsYWJsZVByb21pc2UgZXhlY3V0b3IuXCIsIGVycik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlamVjdG9yKGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYW5jZWxzIGltbWVkaWF0ZWx5IHRoZSBleGVjdXRpb24gb2YgdGhlIG9wZXJhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBwcm9taXNlLlxuICAgICAqIFRoZSBwcm9taXNlIHJlamVjdHMgd2l0aCBhIHtAbGluayBDYW5jZWxFcnJvcn0gaW5zdGFuY2UgYXMgcmVhc29uLFxuICAgICAqIHdpdGggdGhlIHtAbGluayBDYW5jZWxFcnJvciNjYXVzZX0gcHJvcGVydHkgc2V0IHRvIHRoZSBnaXZlbiBhcmd1bWVudCwgaWYgYW55LlxuICAgICAqXG4gICAgICogSGFzIG5vIGVmZmVjdCBpZiBjYWxsZWQgYWZ0ZXIgdGhlIHByb21pc2UgaGFzIGFscmVhZHkgc2V0dGxlZDtcbiAgICAgKiByZXBlYXRlZCBjYWxscyBpbiBwYXJ0aWN1bGFyIGFyZSBzYWZlLCBidXQgb25seSB0aGUgZmlyc3Qgb25lXG4gICAgICogd2lsbCBzZXQgdGhlIGNhbmNlbGxhdGlvbiBjYXVzZS5cbiAgICAgKlxuICAgICAqIFRoZSBgQ2FuY2VsRXJyb3JgIGV4Y2VwdGlvbiBfbmVlZCBub3RfIGJlIGhhbmRsZWQgZXhwbGljaXRseSBfb24gdGhlIHByb21pc2VzIHRoYXQgYXJlIGJlaW5nIGNhbmNlbGxlZDpfXG4gICAgICogY2FuY2VsbGluZyBhIHByb21pc2Ugd2l0aCBubyBhdHRhY2hlZCByZWplY3Rpb24gaGFuZGxlciBkb2VzIG5vdCB0cmlnZ2VyIGFuIHVuaGFuZGxlZCByZWplY3Rpb24gZXZlbnQuXG4gICAgICogVGhlcmVmb3JlLCB0aGUgZm9sbG93aW5nIGlkaW9tcyBhcmUgYWxsIGVxdWFsbHkgY29ycmVjdDpcbiAgICAgKiBgYGB0c1xuICAgICAqIG5ldyBDYW5jZWxsYWJsZVByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4geyAuLi4gfSkuY2FuY2VsKCk7XG4gICAgICogbmV3IENhbmNlbGxhYmxlUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7IC4uLiB9KS50aGVuKC4uLikuY2FuY2VsKCk7XG4gICAgICogbmV3IENhbmNlbGxhYmxlUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7IC4uLiB9KS50aGVuKC4uLikuY2F0Y2goLi4uKS5jYW5jZWwoKTtcbiAgICAgKiBgYGBcbiAgICAgKiBXaGVuZXZlciBzb21lIGNhbmNlbGxlZCBwcm9taXNlIGluIGEgY2hhaW4gcmVqZWN0cyB3aXRoIGEgYENhbmNlbEVycm9yYFxuICAgICAqIHdpdGggdGhlIHNhbWUgY2FuY2VsbGF0aW9uIGNhdXNlIGFzIGl0c2VsZiwgdGhlIGVycm9yIHdpbGwgYmUgZGlzY2FyZGVkIHNpbGVudGx5LlxuICAgICAqIEhvd2V2ZXIsIHRoZSBgQ2FuY2VsRXJyb3JgIF93aWxsIHN0aWxsIGJlIGRlbGl2ZXJlZF8gdG8gYWxsIGF0dGFjaGVkIHJlamVjdGlvbiBoYW5kbGVyc1xuICAgICAqIGFkZGVkIGJ5IHtAbGluayB0aGVufSBhbmQgcmVsYXRlZCBtZXRob2RzOlxuICAgICAqIGBgYHRzXG4gICAgICogbGV0IGNhbmNlbGxhYmxlID0gbmV3IENhbmNlbGxhYmxlUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7IC4uLiB9KTtcbiAgICAgKiBjYW5jZWxsYWJsZS50aGVuKCgpID0+IHsgLi4uIH0pLmNhdGNoKGNvbnNvbGUubG9nKTtcbiAgICAgKiBjYW5jZWxsYWJsZS5jYW5jZWwoKTsgLy8gQSBDYW5jZWxFcnJvciBpcyBwcmludGVkIHRvIHRoZSBjb25zb2xlLlxuICAgICAqIGBgYFxuICAgICAqIElmIHRoZSBgQ2FuY2VsRXJyb3JgIGlzIG5vdCBoYW5kbGVkIGRvd25zdHJlYW0gYnkgdGhlIHRpbWUgaXQgcmVhY2hlc1xuICAgICAqIGEgX25vbi1jYW5jZWxsZWRfIHByb21pc2UsIGl0IF93aWxsXyB0cmlnZ2VyIGFuIHVuaGFuZGxlZCByZWplY3Rpb24gZXZlbnQsXG4gICAgICoganVzdCBsaWtlIG5vcm1hbCByZWplY3Rpb25zIHdvdWxkOlxuICAgICAqIGBgYHRzXG4gICAgICogbGV0IGNhbmNlbGxhYmxlID0gbmV3IENhbmNlbGxhYmxlUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7IC4uLiB9KTtcbiAgICAgKiBsZXQgY2hhaW5lZCA9IGNhbmNlbGxhYmxlLnRoZW4oKCkgPT4geyAuLi4gfSkudGhlbigoKSA9PiB7IC4uLiB9KTsgLy8gTm8gY2F0Y2guLi5cbiAgICAgKiBjYW5jZWxsYWJsZS5jYW5jZWwoKTsgLy8gVW5oYW5kbGVkIHJlamVjdGlvbiBldmVudCBvbiBjaGFpbmVkIVxuICAgICAqIGBgYFxuICAgICAqIFRoZXJlZm9yZSwgaXQgaXMgaW1wb3J0YW50IHRvIGVpdGhlciBjYW5jZWwgd2hvbGUgcHJvbWlzZSBjaGFpbnMgZnJvbSB0aGVpciB0YWlsLFxuICAgICAqIGFzIHNob3duIGluIHRoZSBjb3JyZWN0IGlkaW9tcyBhYm92ZSwgb3IgdGFrZSBjYXJlIG9mIGhhbmRsaW5nIGVycm9ycyBldmVyeXdoZXJlLlxuICAgICAqXG4gICAgICogQHJldHVybnMgQSBjYW5jZWxsYWJsZSBwcm9taXNlIHRoYXQgX2Z1bGZpbGxzXyBhZnRlciB0aGUgY2FuY2VsIGNhbGxiYWNrIChpZiBhbnkpXG4gICAgICogYW5kIGFsbCBoYW5kbGVycyBhdHRhY2hlZCB1cCB0byB0aGUgY2FsbCB0byBjYW5jZWwgaGF2ZSBydW4uXG4gICAgICogSWYgdGhlIGNhbmNlbCBjYWxsYmFjayByZXR1cm5zIGEgdGhlbmFibGUsIHRoZSBwcm9taXNlIHJldHVybmVkIGJ5IGBjYW5jZWxgXG4gICAgICogd2lsbCBhbHNvIHdhaXQgZm9yIHRoYXQgdGhlbmFibGUgdG8gc2V0dGxlLlxuICAgICAqIFRoaXMgZW5hYmxlcyBjYWxsZXJzIHRvIHdhaXQgZm9yIHRoZSBjYW5jZWxsZWQgb3BlcmF0aW9uIHRvIHRlcm1pbmF0ZVxuICAgICAqIHdpdGhvdXQgYmVpbmcgZm9yY2VkIHRvIGhhbmRsZSBwb3RlbnRpYWwgZXJyb3JzIGF0IHRoZSBjYWxsIHNpdGUuXG4gICAgICogYGBgdHNcbiAgICAgKiBjYW5jZWxsYWJsZS5jYW5jZWwoKS50aGVuKCgpID0+IHtcbiAgICAgKiAgICAgLy8gQ2xlYW51cCBmaW5pc2hlZCwgaXQncyBzYWZlIHRvIGRvIHNvbWV0aGluZyBlbHNlLlxuICAgICAqIH0sIChlcnIpID0+IHtcbiAgICAgKiAgICAgLy8gVW5yZWFjaGFibGU6IHRoZSBwcm9taXNlIHJldHVybmVkIGZyb20gY2FuY2VsIHdpbGwgbmV2ZXIgcmVqZWN0LlxuICAgICAqIH0pO1xuICAgICAqIGBgYFxuICAgICAqIE5vdGUgdGhhdCB0aGUgcmV0dXJuZWQgcHJvbWlzZSB3aWxsIF9ub3RfIGhhbmRsZSBpbXBsaWNpdGx5IGFueSByZWplY3Rpb25cbiAgICAgKiB0aGF0IG1pZ2h0IGhhdmUgb2NjdXJyZWQgYWxyZWFkeSBpbiB0aGUgY2FuY2VsbGVkIGNoYWluLlxuICAgICAqIEl0IHdpbGwganVzdCB0cmFjayB3aGV0aGVyIHJlZ2lzdGVyZWQgaGFuZGxlcnMgaGF2ZSBiZWVuIGV4ZWN1dGVkIG9yIG5vdC5cbiAgICAgKiBUaGVyZWZvcmUsIHVuaGFuZGxlZCByZWplY3Rpb25zIHdpbGwgbmV2ZXIgYmUgc2lsZW50bHkgaGFuZGxlZCBieSBjYWxsaW5nIGNhbmNlbC5cbiAgICAgKi9cbiAgICBjYW5jZWwoY2F1c2U/OiBhbnkpOiBDYW5jZWxsYWJsZVByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gbmV3IENhbmNlbGxhYmxlUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgUHJvbWlzZS5hbGxTZXR0bGVkKFtcbiAgICAgICAgICAgICAgICB0aGlzW2NhbmNlbEltcGxTeW1dKG5ldyBDYW5jZWxFcnJvcihcIlByb21pc2UgY2FuY2VsbGVkLlwiLCB7IGNhdXNlIH0pKSxcbiAgICAgICAgICAgICAgICBjdXJyZW50QmFycmllcih0aGlzKVxuICAgICAgICAgICAgXSkudGhlbigoKSA9PiByZXNvbHZlKCksICgpID0+IHJlc29sdmUoKSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJpbmRzIHByb21pc2UgY2FuY2VsbGF0aW9uIHRvIHRoZSBhYm9ydCBldmVudCBvZiB0aGUgZ2l2ZW4ge0BsaW5rIEFib3J0U2lnbmFsfS5cbiAgICAgKiBJZiB0aGUgc2lnbmFsIGhhcyBhbHJlYWR5IGFib3J0ZWQsIHRoZSBwcm9taXNlIHdpbGwgYmUgY2FuY2VsbGVkIGltbWVkaWF0ZWx5LlxuICAgICAqIFdoZW4gZWl0aGVyIGNvbmRpdGlvbiBpcyB2ZXJpZmllZCwgdGhlIGNhbmNlbGxhdGlvbiBjYXVzZSB3aWxsIGJlIHNldFxuICAgICAqIHRvIHRoZSBzaWduYWwncyBhYm9ydCByZWFzb24gKHNlZSB7QGxpbmsgQWJvcnRTaWduYWwjcmVhc29ufSkuXG4gICAgICpcbiAgICAgKiBIYXMgbm8gZWZmZWN0IGlmIGNhbGxlZCAob3IgaWYgdGhlIHNpZ25hbCBhYm9ydHMpIF9hZnRlcl8gdGhlIHByb21pc2UgaGFzIGFscmVhZHkgc2V0dGxlZC5cbiAgICAgKiBPbmx5IHRoZSBmaXJzdCBzaWduYWwgdG8gYWJvcnQgd2lsbCBzZXQgdGhlIGNhbmNlbGxhdGlvbiBjYXVzZS5cbiAgICAgKlxuICAgICAqIEZvciBtb3JlIGRldGFpbHMgYWJvdXQgdGhlIGNhbmNlbGxhdGlvbiBwcm9jZXNzLFxuICAgICAqIHNlZSB7QGxpbmsgY2FuY2VsfSBhbmQgdGhlIGBDYW5jZWxsYWJsZVByb21pc2VgIGNvbnN0cnVjdG9yLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgZW5hYmxlcyBgYXdhaXRgaW5nIGNhbmNlbGxhYmxlIHByb21pc2VzIHdpdGhvdXQgaGF2aW5nXG4gICAgICogdG8gc3RvcmUgdGhlbSBmb3IgZnV0dXJlIGNhbmNlbGxhdGlvbiwgZS5nLjpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGxvbmdSdW5uaW5nT3BlcmF0aW9uKCkuY2FuY2VsT24oc2lnbmFsKTtcbiAgICAgKiBgYGBcbiAgICAgKiBpbnN0ZWFkIG9mOlxuICAgICAqIGBgYHRzXG4gICAgICogbGV0IHByb21pc2VUb0JlQ2FuY2VsbGVkID0gbG9uZ1J1bm5pbmdPcGVyYXRpb24oKTtcbiAgICAgKiBhd2FpdCBwcm9taXNlVG9CZUNhbmNlbGxlZDtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoaXMgcHJvbWlzZSwgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKi9cbiAgICBjYW5jZWxPbihzaWduYWw6IEFib3J0U2lnbmFsKTogQ2FuY2VsbGFibGVQcm9taXNlPFQ+IHtcbiAgICAgICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgICB2b2lkIHRoaXMuY2FuY2VsKHNpZ25hbC5yZWFzb24pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PiB2b2lkIHRoaXMuY2FuY2VsKHNpZ25hbC5yZWFzb24pLCB7Y2FwdHVyZTogdHJ1ZX0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXR0YWNoZXMgY2FsbGJhY2tzIGZvciB0aGUgcmVzb2x1dGlvbiBhbmQvb3IgcmVqZWN0aW9uIG9mIHRoZSBgQ2FuY2VsbGFibGVQcm9taXNlYC5cbiAgICAgKlxuICAgICAqIFRoZSBvcHRpb25hbCBgb25jYW5jZWxsZWRgIGFyZ3VtZW50IHdpbGwgYmUgaW52b2tlZCB3aGVuIHRoZSByZXR1cm5lZCBwcm9taXNlIGlzIGNhbmNlbGxlZCxcbiAgICAgKiB3aXRoIHRoZSBzYW1lIHNlbWFudGljcyBhcyB0aGUgYG9uY2FuY2VsbGVkYCBhcmd1bWVudCBvZiB0aGUgY29uc3RydWN0b3IuXG4gICAgICogV2hlbiB0aGUgcGFyZW50IHByb21pc2UgcmVqZWN0cyBvciBpcyBjYW5jZWxsZWQsIHRoZSBgb25yZWplY3RlZGAgY2FsbGJhY2sgd2lsbCBydW4sXG4gICAgICogX2V2ZW4gYWZ0ZXIgdGhlIHJldHVybmVkIHByb21pc2UgaGFzIGJlZW4gY2FuY2VsbGVkOl9cbiAgICAgKiBpbiB0aGF0IGNhc2UsIHNob3VsZCBpdCByZWplY3Qgb3IgdGhyb3csIHRoZSByZWFzb24gd2lsbCBiZSB3cmFwcGVkXG4gICAgICogaW4gYSB7QGxpbmsgQ2FuY2VsbGVkUmVqZWN0aW9uRXJyb3J9IGFuZCBidWJibGVkIHVwIGFzIGFuIHVuaGFuZGxlZCByZWplY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb25mdWxmaWxsZWQgVGhlIGNhbGxiYWNrIHRvIGV4ZWN1dGUgd2hlbiB0aGUgUHJvbWlzZSBpcyByZXNvbHZlZC5cbiAgICAgKiBAcGFyYW0gb25yZWplY3RlZCBUaGUgY2FsbGJhY2sgdG8gZXhlY3V0ZSB3aGVuIHRoZSBQcm9taXNlIGlzIHJlamVjdGVkLlxuICAgICAqIEByZXR1cm5zIEEgYENhbmNlbGxhYmxlUHJvbWlzZWAgZm9yIHRoZSBjb21wbGV0aW9uIG9mIHdoaWNoZXZlciBjYWxsYmFjayBpcyBleGVjdXRlZC5cbiAgICAgKiBUaGUgcmV0dXJuZWQgcHJvbWlzZSBpcyBob29rZWQgdXAgdG8gcHJvcGFnYXRlIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyB1cCB0aGUgY2hhaW4sIGJ1dCBub3QgZG93bjpcbiAgICAgKlxuICAgICAqICAgLSBpZiB0aGUgcGFyZW50IHByb21pc2UgaXMgY2FuY2VsbGVkLCB0aGUgYG9ucmVqZWN0ZWRgIGhhbmRsZXIgd2lsbCBiZSBpbnZva2VkIHdpdGggYSBgQ2FuY2VsRXJyb3JgXG4gICAgICogICAgIGFuZCB0aGUgcmV0dXJuZWQgcHJvbWlzZSBfd2lsbCByZXNvbHZlIHJlZ3VsYXJseV8gd2l0aCBpdHMgcmVzdWx0O1xuICAgICAqICAgLSBjb252ZXJzZWx5LCBpZiB0aGUgcmV0dXJuZWQgcHJvbWlzZSBpcyBjYW5jZWxsZWQsIF90aGUgcGFyZW50IHByb21pc2UgaXMgY2FuY2VsbGVkIHRvbztfXG4gICAgICogICAgIHRoZSBgb25yZWplY3RlZGAgaGFuZGxlciB3aWxsIHN0aWxsIGJlIGludm9rZWQgd2l0aCB0aGUgcGFyZW50J3MgYENhbmNlbEVycm9yYCxcbiAgICAgKiAgICAgYnV0IGl0cyByZXN1bHQgd2lsbCBiZSBkaXNjYXJkZWRcbiAgICAgKiAgICAgYW5kIHRoZSByZXR1cm5lZCBwcm9taXNlIHdpbGwgcmVqZWN0IHdpdGggYSBgQ2FuY2VsRXJyb3JgIGFzIHdlbGwuXG4gICAgICpcbiAgICAgKiBUaGUgcHJvbWlzZSByZXR1cm5lZCBmcm9tIHtAbGluayBjYW5jZWx9IHdpbGwgZnVsZmlsbCBvbmx5IGFmdGVyIGFsbCBhdHRhY2hlZCBoYW5kbGVyc1xuICAgICAqIHVwIHRoZSBlbnRpcmUgcHJvbWlzZSBjaGFpbiBoYXZlIGJlZW4gcnVuLlxuICAgICAqXG4gICAgICogSWYgZWl0aGVyIGNhbGxiYWNrIHJldHVybnMgYSBjYW5jZWxsYWJsZSBwcm9taXNlLFxuICAgICAqIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyB3aWxsIGJlIGRpdmVydGVkIHRvIGl0LFxuICAgICAqIGFuZCB0aGUgc3BlY2lmaWVkIGBvbmNhbmNlbGxlZGAgY2FsbGJhY2sgd2lsbCBiZSBkaXNjYXJkZWQuXG4gICAgICovXG4gICAgdGhlbjxUUmVzdWx0MSA9IFQsIFRSZXN1bHQyID0gbmV2ZXI+KG9uZnVsZmlsbGVkPzogKCh2YWx1ZTogVCkgPT4gVFJlc3VsdDEgfCBQcm9taXNlTGlrZTxUUmVzdWx0MT4gfCBDYW5jZWxsYWJsZVByb21pc2VMaWtlPFRSZXN1bHQxPikgfCB1bmRlZmluZWQgfCBudWxsLCBvbnJlamVjdGVkPzogKChyZWFzb246IGFueSkgPT4gVFJlc3VsdDIgfCBQcm9taXNlTGlrZTxUUmVzdWx0Mj4gfCBDYW5jZWxsYWJsZVByb21pc2VMaWtlPFRSZXN1bHQyPikgfCB1bmRlZmluZWQgfCBudWxsLCBvbmNhbmNlbGxlZD86IENhbmNlbGxhYmxlUHJvbWlzZUNhbmNlbGxlcik6IENhbmNlbGxhYmxlUHJvbWlzZTxUUmVzdWx0MSB8IFRSZXN1bHQyPiB7XG4gICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBDYW5jZWxsYWJsZVByb21pc2UpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2FuY2VsbGFibGVQcm9taXNlLnByb3RvdHlwZS50aGVuIGNhbGxlZCBvbiBhbiBpbnZhbGlkIG9iamVjdC5cIik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOT1RFOiBUeXBlU2NyaXB0J3MgYnVpbHQtaW4gdHlwZSBmb3IgdGhlbiBpcyBicm9rZW4sXG4gICAgICAgIC8vIGFzIGl0IGFsbG93cyBzcGVjaWZ5aW5nIGFuIGFyYml0cmFyeSBUUmVzdWx0MSAhPSBUIGV2ZW4gd2hlbiBvbmZ1bGZpbGxlZCBpcyBub3QgYSBmdW5jdGlvbi5cbiAgICAgICAgLy8gV2UgY2Fubm90IGZpeCBpdCBpZiB3ZSB3YW50IHRvIENhbmNlbGxhYmxlUHJvbWlzZSB0byBpbXBsZW1lbnQgUHJvbWlzZUxpa2U8VD4uXG5cbiAgICAgICAgaWYgKCFpc0NhbGxhYmxlKG9uZnVsZmlsbGVkKSkgeyBvbmZ1bGZpbGxlZCA9IGlkZW50aXR5IGFzIGFueTsgfVxuICAgICAgICBpZiAoIWlzQ2FsbGFibGUob25yZWplY3RlZCkpIHsgb25yZWplY3RlZCA9IHRocm93ZXI7IH1cblxuICAgICAgICBpZiAob25mdWxmaWxsZWQgPT09IGlkZW50aXR5ICYmIG9ucmVqZWN0ZWQgPT0gdGhyb3dlcikge1xuICAgICAgICAgICAgLy8gU2hvcnRjdXQgZm9yIHRyaXZpYWwgYXJndW1lbnRzLlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBDYW5jZWxsYWJsZVByb21pc2UoKHJlc29sdmUpID0+IHJlc29sdmUodGhpcyBhcyBhbnkpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJhcnJpZXI6IFBhcnRpYWw8UHJvbWlzZVdpdGhSZXNvbHZlcnM8dm9pZD4+ID0ge307XG4gICAgICAgIHRoaXNbYmFycmllclN5bV0gPSBiYXJyaWVyO1xuXG4gICAgICAgIHJldHVybiBuZXcgQ2FuY2VsbGFibGVQcm9taXNlPFRSZXN1bHQxIHwgVFJlc3VsdDI+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHZvaWQgcHJvbWlzZVRoZW4uY2FsbCh0aGlzLFxuICAgICAgICAgICAgICAgICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpc1tiYXJyaWVyU3ltXSA9PT0gYmFycmllcikgeyB0aGlzW2JhcnJpZXJTeW1dID0gbnVsbDsgfVxuICAgICAgICAgICAgICAgICAgICBiYXJyaWVyLnJlc29sdmU/LigpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG9uZnVsZmlsbGVkISh2YWx1ZSkpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAocmVhc29uPykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpc1tiYXJyaWVyU3ltXSA9PT0gYmFycmllcikgeyB0aGlzW2JhcnJpZXJTeW1dID0gbnVsbDsgfVxuICAgICAgICAgICAgICAgICAgICBiYXJyaWVyLnJlc29sdmU/LigpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG9ucmVqZWN0ZWQhKHJlYXNvbikpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSwgYXN5bmMgKGNhdXNlPykgPT4ge1xuICAgICAgICAgICAgLy9jYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb25jYW5jZWxsZWQ/LihjYXVzZSk7XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY2FuY2VsKGNhdXNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXR0YWNoZXMgYSBjYWxsYmFjayBmb3Igb25seSB0aGUgcmVqZWN0aW9uIG9mIHRoZSBQcm9taXNlLlxuICAgICAqXG4gICAgICogVGhlIG9wdGlvbmFsIGBvbmNhbmNlbGxlZGAgYXJndW1lbnQgd2lsbCBiZSBpbnZva2VkIHdoZW4gdGhlIHJldHVybmVkIHByb21pc2UgaXMgY2FuY2VsbGVkLFxuICAgICAqIHdpdGggdGhlIHNhbWUgc2VtYW50aWNzIGFzIHRoZSBgb25jYW5jZWxsZWRgIGFyZ3VtZW50IG9mIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgKiBXaGVuIHRoZSBwYXJlbnQgcHJvbWlzZSByZWplY3RzIG9yIGlzIGNhbmNlbGxlZCwgdGhlIGBvbnJlamVjdGVkYCBjYWxsYmFjayB3aWxsIHJ1bixcbiAgICAgKiBfZXZlbiBhZnRlciB0aGUgcmV0dXJuZWQgcHJvbWlzZSBoYXMgYmVlbiBjYW5jZWxsZWQ6X1xuICAgICAqIGluIHRoYXQgY2FzZSwgc2hvdWxkIGl0IHJlamVjdCBvciB0aHJvdywgdGhlIHJlYXNvbiB3aWxsIGJlIHdyYXBwZWRcbiAgICAgKiBpbiBhIHtAbGluayBDYW5jZWxsZWRSZWplY3Rpb25FcnJvcn0gYW5kIGJ1YmJsZWQgdXAgYXMgYW4gdW5oYW5kbGVkIHJlamVjdGlvbi5cbiAgICAgKlxuICAgICAqIEl0IGlzIGVxdWl2YWxlbnQgdG9cbiAgICAgKiBgYGB0c1xuICAgICAqIGNhbmNlbGxhYmxlUHJvbWlzZS50aGVuKHVuZGVmaW5lZCwgb25yZWplY3RlZCwgb25jYW5jZWxsZWQpO1xuICAgICAqIGBgYFxuICAgICAqIGFuZCB0aGUgc2FtZSBjYXZlYXRzIGFwcGx5LlxuICAgICAqXG4gICAgICogQHJldHVybnMgQSBQcm9taXNlIGZvciB0aGUgY29tcGxldGlvbiBvZiB0aGUgY2FsbGJhY2suXG4gICAgICogQ2FuY2VsbGF0aW9uIHJlcXVlc3RzIG9uIHRoZSByZXR1cm5lZCBwcm9taXNlXG4gICAgICogd2lsbCBwcm9wYWdhdGUgdXAgdGhlIGNoYWluIHRvIHRoZSBwYXJlbnQgcHJvbWlzZSxcbiAgICAgKiBidXQgbm90IGluIHRoZSBvdGhlciBkaXJlY3Rpb24uXG4gICAgICpcbiAgICAgKiBUaGUgcHJvbWlzZSByZXR1cm5lZCBmcm9tIHtAbGluayBjYW5jZWx9IHdpbGwgZnVsZmlsbCBvbmx5IGFmdGVyIGFsbCBhdHRhY2hlZCBoYW5kbGVyc1xuICAgICAqIHVwIHRoZSBlbnRpcmUgcHJvbWlzZSBjaGFpbiBoYXZlIGJlZW4gcnVuLlxuICAgICAqXG4gICAgICogSWYgYG9ucmVqZWN0ZWRgIHJldHVybnMgYSBjYW5jZWxsYWJsZSBwcm9taXNlLFxuICAgICAqIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyB3aWxsIGJlIGRpdmVydGVkIHRvIGl0LFxuICAgICAqIGFuZCB0aGUgc3BlY2lmaWVkIGBvbmNhbmNlbGxlZGAgY2FsbGJhY2sgd2lsbCBiZSBkaXNjYXJkZWQuXG4gICAgICogU2VlIHtAbGluayB0aGVufSBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqL1xuICAgIGNhdGNoPFRSZXN1bHQgPSBuZXZlcj4ob25yZWplY3RlZD86ICgocmVhc29uOiBhbnkpID0+IChQcm9taXNlTGlrZTxUUmVzdWx0PiB8IFRSZXN1bHQpKSB8IHVuZGVmaW5lZCB8IG51bGwsIG9uY2FuY2VsbGVkPzogQ2FuY2VsbGFibGVQcm9taXNlQ2FuY2VsbGVyKTogQ2FuY2VsbGFibGVQcm9taXNlPFQgfCBUUmVzdWx0PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRoZW4odW5kZWZpbmVkLCBvbnJlamVjdGVkLCBvbmNhbmNlbGxlZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXR0YWNoZXMgYSBjYWxsYmFjayB0aGF0IGlzIGludm9rZWQgd2hlbiB0aGUgQ2FuY2VsbGFibGVQcm9taXNlIGlzIHNldHRsZWQgKGZ1bGZpbGxlZCBvciByZWplY3RlZCkuIFRoZVxuICAgICAqIHJlc29sdmVkIHZhbHVlIGNhbm5vdCBiZSBhY2Nlc3NlZCBvciBtb2RpZmllZCBmcm9tIHRoZSBjYWxsYmFjay5cbiAgICAgKiBUaGUgcmV0dXJuZWQgcHJvbWlzZSB3aWxsIHNldHRsZSBpbiB0aGUgc2FtZSBzdGF0ZSBhcyB0aGUgb3JpZ2luYWwgb25lXG4gICAgICogYWZ0ZXIgdGhlIHByb3ZpZGVkIGNhbGxiYWNrIGhhcyBjb21wbGV0ZWQgZXhlY3V0aW9uLFxuICAgICAqIHVubGVzcyB0aGUgY2FsbGJhY2sgdGhyb3dzIG9yIHJldHVybnMgYSByZWplY3RpbmcgcHJvbWlzZSxcbiAgICAgKiBpbiB3aGljaCBjYXNlIHRoZSByZXR1cm5lZCBwcm9taXNlIHdpbGwgcmVqZWN0IGFzIHdlbGwuXG4gICAgICpcbiAgICAgKiBUaGUgb3B0aW9uYWwgYG9uY2FuY2VsbGVkYCBhcmd1bWVudCB3aWxsIGJlIGludm9rZWQgd2hlbiB0aGUgcmV0dXJuZWQgcHJvbWlzZSBpcyBjYW5jZWxsZWQsXG4gICAgICogd2l0aCB0aGUgc2FtZSBzZW1hbnRpY3MgYXMgdGhlIGBvbmNhbmNlbGxlZGAgYXJndW1lbnQgb2YgdGhlIGNvbnN0cnVjdG9yLlxuICAgICAqIE9uY2UgdGhlIHBhcmVudCBwcm9taXNlIHNldHRsZXMsIHRoZSBgb25maW5hbGx5YCBjYWxsYmFjayB3aWxsIHJ1bixcbiAgICAgKiBfZXZlbiBhZnRlciB0aGUgcmV0dXJuZWQgcHJvbWlzZSBoYXMgYmVlbiBjYW5jZWxsZWQ6X1xuICAgICAqIGluIHRoYXQgY2FzZSwgc2hvdWxkIGl0IHJlamVjdCBvciB0aHJvdywgdGhlIHJlYXNvbiB3aWxsIGJlIHdyYXBwZWRcbiAgICAgKiBpbiBhIHtAbGluayBDYW5jZWxsZWRSZWplY3Rpb25FcnJvcn0gYW5kIGJ1YmJsZWQgdXAgYXMgYW4gdW5oYW5kbGVkIHJlamVjdGlvbi5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIHtAbGluayB0aGVufSBhbmQgdGhlIHNhbWUgY2F2ZWF0cyBhcHBseS5cbiAgICAgKiBJdCBpcyBwb2x5ZmlsbGVkLCBoZW5jZSBhdmFpbGFibGUgaW4gZXZlcnkgT1Mvd2VidmlldyB2ZXJzaW9uLlxuICAgICAqXG4gICAgICogQHJldHVybnMgQSBQcm9taXNlIGZvciB0aGUgY29tcGxldGlvbiBvZiB0aGUgY2FsbGJhY2suXG4gICAgICogQ2FuY2VsbGF0aW9uIHJlcXVlc3RzIG9uIHRoZSByZXR1cm5lZCBwcm9taXNlXG4gICAgICogd2lsbCBwcm9wYWdhdGUgdXAgdGhlIGNoYWluIHRvIHRoZSBwYXJlbnQgcHJvbWlzZSxcbiAgICAgKiBidXQgbm90IGluIHRoZSBvdGhlciBkaXJlY3Rpb24uXG4gICAgICpcbiAgICAgKiBUaGUgcHJvbWlzZSByZXR1cm5lZCBmcm9tIHtAbGluayBjYW5jZWx9IHdpbGwgZnVsZmlsbCBvbmx5IGFmdGVyIGFsbCBhdHRhY2hlZCBoYW5kbGVyc1xuICAgICAqIHVwIHRoZSBlbnRpcmUgcHJvbWlzZSBjaGFpbiBoYXZlIGJlZW4gcnVuLlxuICAgICAqXG4gICAgICogSWYgYG9uZmluYWxseWAgcmV0dXJucyBhIGNhbmNlbGxhYmxlIHByb21pc2UsXG4gICAgICogY2FuY2VsbGF0aW9uIHJlcXVlc3RzIHdpbGwgYmUgZGl2ZXJ0ZWQgdG8gaXQsXG4gICAgICogYW5kIHRoZSBzcGVjaWZpZWQgYG9uY2FuY2VsbGVkYCBjYWxsYmFjayB3aWxsIGJlIGRpc2NhcmRlZC5cbiAgICAgKiBTZWUge0BsaW5rIHRoZW59IGZvciBtb3JlIGRldGFpbHMuXG4gICAgICovXG4gICAgZmluYWxseShvbmZpbmFsbHk/OiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWQgfCBudWxsLCBvbmNhbmNlbGxlZD86IENhbmNlbGxhYmxlUHJvbWlzZUNhbmNlbGxlcik6IENhbmNlbGxhYmxlUHJvbWlzZTxUPiB7XG4gICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBDYW5jZWxsYWJsZVByb21pc2UpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2FuY2VsbGFibGVQcm9taXNlLnByb3RvdHlwZS5maW5hbGx5IGNhbGxlZCBvbiBhbiBpbnZhbGlkIG9iamVjdC5cIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzQ2FsbGFibGUob25maW5hbGx5KSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudGhlbihvbmZpbmFsbHksIG9uZmluYWxseSwgb25jYW5jZWxsZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudGhlbihcbiAgICAgICAgICAgICh2YWx1ZSkgPT4gQ2FuY2VsbGFibGVQcm9taXNlLnJlc29sdmUob25maW5hbGx5KCkpLnRoZW4oKCkgPT4gdmFsdWUpLFxuICAgICAgICAgICAgKHJlYXNvbj8pID0+IENhbmNlbGxhYmxlUHJvbWlzZS5yZXNvbHZlKG9uZmluYWxseSgpKS50aGVuKCgpID0+IHsgdGhyb3cgcmVhc29uOyB9KSxcbiAgICAgICAgICAgIG9uY2FuY2VsbGVkLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdlIHVzZSB0aGUgYFtTeW1ib2wuc3BlY2llc11gIHN0YXRpYyBwcm9wZXJ0eSwgaWYgYXZhaWxhYmxlLFxuICAgICAqIHRvIGRpc2FibGUgdGhlIGJ1aWx0LWluIGF1dG9tYXRpYyBzdWJjbGFzc2luZyBmZWF0dXJlcyBmcm9tIHtAbGluayBQcm9taXNlfS5cbiAgICAgKiBJdCBpcyBjcml0aWNhbCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucyB0aGF0IGV4dGVuZGVycyBkbyBub3Qgb3ZlcnJpZGUgdGhpcy5cbiAgICAgKiBPbmNlIHRoZSBwcm9wb3NhbCBhdCBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1ybS1idWlsdGluLXN1YmNsYXNzaW5nXG4gICAgICogaXMgZWl0aGVyIGFjY2VwdGVkIG9yIHJldGlyZWQsIHRoaXMgaW1wbGVtZW50YXRpb24gd2lsbCBoYXZlIHRvIGJlIHJldmlzZWQgYWNjb3JkaW5nbHkuXG4gICAgICpcbiAgICAgKiBAaWdub3JlXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgc3RhdGljIGdldCBbc3BlY2llc10oKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBDYW5jZWxsYWJsZVByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoIGFuIGFycmF5IG9mIHJlc3VsdHNcbiAgICAgKiB3aGVuIGFsbCBvZiB0aGUgcHJvdmlkZWQgUHJvbWlzZXMgcmVzb2x2ZSwgb3IgcmVqZWN0ZWQgd2hlbiBhbnkgUHJvbWlzZSBpcyByZWplY3RlZC5cbiAgICAgKlxuICAgICAqIEV2ZXJ5IG9uZSBvZiB0aGUgcHJvdmlkZWQgb2JqZWN0cyB0aGF0IGlzIGEgdGhlbmFibGUgX2FuZF8gY2FuY2VsbGFibGUgb2JqZWN0XG4gICAgICogd2lsbCBiZSBjYW5jZWxsZWQgd2hlbiB0aGUgcmV0dXJuZWQgcHJvbWlzZSBpcyBjYW5jZWxsZWQsIHdpdGggdGhlIHNhbWUgY2F1c2UuXG4gICAgICpcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcbiAgICAgKi9cbiAgICBzdGF0aWMgYWxsPFQ+KHZhbHVlczogSXRlcmFibGU8VCB8IFByb21pc2VMaWtlPFQ+Pik6IENhbmNlbGxhYmxlUHJvbWlzZTxBd2FpdGVkPFQ+W10+O1xuICAgIHN0YXRpYyBhbGw8VCBleHRlbmRzIHJlYWRvbmx5IHVua25vd25bXSB8IFtdPih2YWx1ZXM6IFQpOiBDYW5jZWxsYWJsZVByb21pc2U8eyAtcmVhZG9ubHkgW1AgaW4ga2V5b2YgVF06IEF3YWl0ZWQ8VFtQXT47IH0+O1xuICAgIHN0YXRpYyBhbGw8VCBleHRlbmRzIEl0ZXJhYmxlPHVua25vd24+IHwgQXJyYXlMaWtlPHVua25vd24+Pih2YWx1ZXM6IFQpOiBDYW5jZWxsYWJsZVByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICBsZXQgY29sbGVjdGVkID0gQXJyYXkuZnJvbSh2YWx1ZXMpO1xuICAgICAgICByZXR1cm4gY29sbGVjdGVkLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgPyBDYW5jZWxsYWJsZVByb21pc2UucmVzb2x2ZShjb2xsZWN0ZWQpXG4gICAgICAgICAgICA6IG5ldyBDYW5jZWxsYWJsZVByb21pc2U8dW5rbm93bj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHZvaWQgUHJvbWlzZS5hbGwoY29sbGVjdGVkKS50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgICB9LCBhbGxDYW5jZWxsZXIoY29sbGVjdGVkKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIENhbmNlbGxhYmxlUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggYW4gYXJyYXkgb2YgcmVzdWx0c1xuICAgICAqIHdoZW4gYWxsIG9mIHRoZSBwcm92aWRlZCBQcm9taXNlcyByZXNvbHZlIG9yIHJlamVjdC5cbiAgICAgKlxuICAgICAqIEV2ZXJ5IG9uZSBvZiB0aGUgcHJvdmlkZWQgb2JqZWN0cyB0aGF0IGlzIGEgdGhlbmFibGUgX2FuZF8gY2FuY2VsbGFibGUgb2JqZWN0XG4gICAgICogd2lsbCBiZSBjYW5jZWxsZWQgd2hlbiB0aGUgcmV0dXJuZWQgcHJvbWlzZSBpcyBjYW5jZWxsZWQsIHdpdGggdGhlIHNhbWUgY2F1c2UuXG4gICAgICpcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcbiAgICAgKi9cbiAgICBzdGF0aWMgYWxsU2V0dGxlZDxUPih2YWx1ZXM6IEl0ZXJhYmxlPFQgfCBQcm9taXNlTGlrZTxUPj4pOiBDYW5jZWxsYWJsZVByb21pc2U8UHJvbWlzZVNldHRsZWRSZXN1bHQ8QXdhaXRlZDxUPj5bXT47XG4gICAgc3RhdGljIGFsbFNldHRsZWQ8VCBleHRlbmRzIHJlYWRvbmx5IHVua25vd25bXSB8IFtdPih2YWx1ZXM6IFQpOiBDYW5jZWxsYWJsZVByb21pc2U8eyAtcmVhZG9ubHkgW1AgaW4ga2V5b2YgVF06IFByb21pc2VTZXR0bGVkUmVzdWx0PEF3YWl0ZWQ8VFtQXT4+OyB9PjtcbiAgICBzdGF0aWMgYWxsU2V0dGxlZDxUIGV4dGVuZHMgSXRlcmFibGU8dW5rbm93bj4gfCBBcnJheUxpa2U8dW5rbm93bj4+KHZhbHVlczogVCk6IENhbmNlbGxhYmxlUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIGxldCBjb2xsZWN0ZWQgPSBBcnJheS5mcm9tKHZhbHVlcyk7XG4gICAgICAgIHJldHVybiBjb2xsZWN0ZWQubGVuZ3RoID09PSAwXG4gICAgICAgICAgICA/IENhbmNlbGxhYmxlUHJvbWlzZS5yZXNvbHZlKGNvbGxlY3RlZClcbiAgICAgICAgICAgIDogbmV3IENhbmNlbGxhYmxlUHJvbWlzZTx1bmtub3duPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgdm9pZCBQcm9taXNlLmFsbFNldHRsZWQoY29sbGVjdGVkKS50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgICB9LCBhbGxDYW5jZWxsZXIoY29sbGVjdGVkKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGFueSBmdW5jdGlvbiByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCBieSB0aGUgZmlyc3QgZ2l2ZW4gcHJvbWlzZSB0byBiZSBmdWxmaWxsZWQsXG4gICAgICogb3IgcmVqZWN0ZWQgd2l0aCBhbiBBZ2dyZWdhdGVFcnJvciBjb250YWluaW5nIGFuIGFycmF5IG9mIHJlamVjdGlvbiByZWFzb25zXG4gICAgICogaWYgYWxsIG9mIHRoZSBnaXZlbiBwcm9taXNlcyBhcmUgcmVqZWN0ZWQuXG4gICAgICogSXQgcmVzb2x2ZXMgYWxsIGVsZW1lbnRzIG9mIHRoZSBwYXNzZWQgaXRlcmFibGUgdG8gcHJvbWlzZXMgYXMgaXQgcnVucyB0aGlzIGFsZ29yaXRobS5cbiAgICAgKlxuICAgICAqIEV2ZXJ5IG9uZSBvZiB0aGUgcHJvdmlkZWQgb2JqZWN0cyB0aGF0IGlzIGEgdGhlbmFibGUgX2FuZF8gY2FuY2VsbGFibGUgb2JqZWN0XG4gICAgICogd2lsbCBiZSBjYW5jZWxsZWQgd2hlbiB0aGUgcmV0dXJuZWQgcHJvbWlzZSBpcyBjYW5jZWxsZWQsIHdpdGggdGhlIHNhbWUgY2F1c2UuXG4gICAgICpcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcbiAgICAgKi9cbiAgICBzdGF0aWMgYW55PFQ+KHZhbHVlczogSXRlcmFibGU8VCB8IFByb21pc2VMaWtlPFQ+Pik6IENhbmNlbGxhYmxlUHJvbWlzZTxBd2FpdGVkPFQ+PjtcbiAgICBzdGF0aWMgYW55PFQgZXh0ZW5kcyByZWFkb25seSB1bmtub3duW10gfCBbXT4odmFsdWVzOiBUKTogQ2FuY2VsbGFibGVQcm9taXNlPEF3YWl0ZWQ8VFtudW1iZXJdPj47XG4gICAgc3RhdGljIGFueTxUIGV4dGVuZHMgSXRlcmFibGU8dW5rbm93bj4gfCBBcnJheUxpa2U8dW5rbm93bj4+KHZhbHVlczogVCk6IENhbmNlbGxhYmxlUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIGxldCBjb2xsZWN0ZWQgPSBBcnJheS5mcm9tKHZhbHVlcyk7XG4gICAgICAgIHJldHVybiBjb2xsZWN0ZWQubGVuZ3RoID09PSAwXG4gICAgICAgICAgICA/IENhbmNlbGxhYmxlUHJvbWlzZS5yZXNvbHZlKGNvbGxlY3RlZClcbiAgICAgICAgICAgIDogbmV3IENhbmNlbGxhYmxlUHJvbWlzZTx1bmtub3duPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgdm9pZCBQcm9taXNlLmFueShjb2xsZWN0ZWQpLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICAgIH0sIGFsbENhbmNlbGxlcihjb2xsZWN0ZWQpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIG9yIHJlamVjdGVkIHdoZW4gYW55IG9mIHRoZSBwcm92aWRlZCBQcm9taXNlcyBhcmUgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQuXG4gICAgICpcbiAgICAgKiBFdmVyeSBvbmUgb2YgdGhlIHByb3ZpZGVkIG9iamVjdHMgdGhhdCBpcyBhIHRoZW5hYmxlIF9hbmRfIGNhbmNlbGxhYmxlIG9iamVjdFxuICAgICAqIHdpbGwgYmUgY2FuY2VsbGVkIHdoZW4gdGhlIHJldHVybmVkIHByb21pc2UgaXMgY2FuY2VsbGVkLCB3aXRoIHRoZSBzYW1lIGNhdXNlLlxuICAgICAqXG4gICAgICogQGdyb3VwIFN0YXRpYyBNZXRob2RzXG4gICAgICovXG4gICAgc3RhdGljIHJhY2U8VD4odmFsdWVzOiBJdGVyYWJsZTxUIHwgUHJvbWlzZUxpa2U8VD4+KTogQ2FuY2VsbGFibGVQcm9taXNlPEF3YWl0ZWQ8VD4+O1xuICAgIHN0YXRpYyByYWNlPFQgZXh0ZW5kcyByZWFkb25seSB1bmtub3duW10gfCBbXT4odmFsdWVzOiBUKTogQ2FuY2VsbGFibGVQcm9taXNlPEF3YWl0ZWQ8VFtudW1iZXJdPj47XG4gICAgc3RhdGljIHJhY2U8VCBleHRlbmRzIEl0ZXJhYmxlPHVua25vd24+IHwgQXJyYXlMaWtlPHVua25vd24+Pih2YWx1ZXM6IFQpOiBDYW5jZWxsYWJsZVByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICBsZXQgY29sbGVjdGVkID0gQXJyYXkuZnJvbSh2YWx1ZXMpO1xuICAgICAgICByZXR1cm4gbmV3IENhbmNlbGxhYmxlUHJvbWlzZTx1bmtub3duPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB2b2lkIFByb21pc2UucmFjZShjb2xsZWN0ZWQpLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSwgYWxsQ2FuY2VsbGVyKGNvbGxlY3RlZCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgY2FuY2VsbGVkIENhbmNlbGxhYmxlUHJvbWlzZSBmb3IgdGhlIHByb3ZpZGVkIGNhdXNlLlxuICAgICAqXG4gICAgICogQGdyb3VwIFN0YXRpYyBNZXRob2RzXG4gICAgICovXG4gICAgc3RhdGljIGNhbmNlbDxUID0gbmV2ZXI+KGNhdXNlPzogYW55KTogQ2FuY2VsbGFibGVQcm9taXNlPFQ+IHtcbiAgICAgICAgY29uc3QgcCA9IG5ldyBDYW5jZWxsYWJsZVByb21pc2U8VD4oKCkgPT4ge30pO1xuICAgICAgICBwLmNhbmNlbChjYXVzZSk7XG4gICAgICAgIHJldHVybiBwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ2FuY2VsbGFibGVQcm9taXNlIHRoYXQgY2FuY2Vsc1xuICAgICAqIGFmdGVyIHRoZSBzcGVjaWZpZWQgdGltZW91dCwgd2l0aCB0aGUgcHJvdmlkZWQgY2F1c2UuXG4gICAgICpcbiAgICAgKiBJZiB0aGUge0BsaW5rIEFib3J0U2lnbmFsLnRpbWVvdXR9IGZhY3RvcnkgbWV0aG9kIGlzIGF2YWlsYWJsZSxcbiAgICAgKiBpdCBpcyB1c2VkIHRvIGJhc2UgdGhlIHRpbWVvdXQgb24gX2FjdGl2ZV8gdGltZSByYXRoZXIgdGhhbiBfZWxhcHNlZF8gdGltZS5cbiAgICAgKiBPdGhlcndpc2UsIGB0aW1lb3V0YCBmYWxscyBiYWNrIHRvIHtAbGluayBzZXRUaW1lb3V0fS5cbiAgICAgKlxuICAgICAqIEBncm91cCBTdGF0aWMgTWV0aG9kc1xuICAgICAqL1xuICAgIHN0YXRpYyB0aW1lb3V0PFQgPSBuZXZlcj4obWlsbGlzZWNvbmRzOiBudW1iZXIsIGNhdXNlPzogYW55KTogQ2FuY2VsbGFibGVQcm9taXNlPFQ+IHtcbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IG5ldyBDYW5jZWxsYWJsZVByb21pc2U8VD4oKCkgPT4ge30pO1xuICAgICAgICBpZiAoQWJvcnRTaWduYWwgJiYgdHlwZW9mIEFib3J0U2lnbmFsID09PSAnZnVuY3Rpb24nICYmIEFib3J0U2lnbmFsLnRpbWVvdXQgJiYgdHlwZW9mIEFib3J0U2lnbmFsLnRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIEFib3J0U2lnbmFsLnRpbWVvdXQobWlsbGlzZWNvbmRzKS5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsICgpID0+IHZvaWQgcHJvbWlzZS5jYW5jZWwoY2F1c2UpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdm9pZCBwcm9taXNlLmNhbmNlbChjYXVzZSksIG1pbGxpc2Vjb25kcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBDYW5jZWxsYWJsZVByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciB0aGUgc3BlY2lmaWVkIHRpbWVvdXQuXG4gICAgICogVGhlIHJldHVybmVkIHByb21pc2UgY2FuIGJlIGNhbmNlbGxlZCB3aXRob3V0IGNvbnNlcXVlbmNlcy5cbiAgICAgKlxuICAgICAqIEBncm91cCBTdGF0aWMgTWV0aG9kc1xuICAgICAqL1xuICAgIHN0YXRpYyBzbGVlcChtaWxsaXNlY29uZHM6IG51bWJlcik6IENhbmNlbGxhYmxlUHJvbWlzZTx2b2lkPjtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IENhbmNlbGxhYmxlUHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyXG4gICAgICogdGhlIHNwZWNpZmllZCB0aW1lb3V0LCB3aXRoIHRoZSBwcm92aWRlZCB2YWx1ZS5cbiAgICAgKiBUaGUgcmV0dXJuZWQgcHJvbWlzZSBjYW4gYmUgY2FuY2VsbGVkIHdpdGhvdXQgY29uc2VxdWVuY2VzLlxuICAgICAqXG4gICAgICogQGdyb3VwIFN0YXRpYyBNZXRob2RzXG4gICAgICovXG4gICAgc3RhdGljIHNsZWVwPFQ+KG1pbGxpc2Vjb25kczogbnVtYmVyLCB2YWx1ZTogVCk6IENhbmNlbGxhYmxlUHJvbWlzZTxUPjtcbiAgICBzdGF0aWMgc2xlZXA8VCA9IHZvaWQ+KG1pbGxpc2Vjb25kczogbnVtYmVyLCB2YWx1ZT86IFQpOiBDYW5jZWxsYWJsZVByb21pc2U8VD4ge1xuICAgICAgICByZXR1cm4gbmV3IENhbmNlbGxhYmxlUHJvbWlzZTxUPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKHZhbHVlISksIG1pbGxpc2Vjb25kcyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgcmVqZWN0ZWQgQ2FuY2VsbGFibGVQcm9taXNlIGZvciB0aGUgcHJvdmlkZWQgcmVhc29uLlxuICAgICAqXG4gICAgICogQGdyb3VwIFN0YXRpYyBNZXRob2RzXG4gICAgICovXG4gICAgc3RhdGljIHJlamVjdDxUID0gbmV2ZXI+KHJlYXNvbj86IGFueSk6IENhbmNlbGxhYmxlUHJvbWlzZTxUPiB7XG4gICAgICAgIHJldHVybiBuZXcgQ2FuY2VsbGFibGVQcm9taXNlPFQ+KChfLCByZWplY3QpID0+IHJlamVjdChyZWFzb24pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHJlc29sdmVkIENhbmNlbGxhYmxlUHJvbWlzZS5cbiAgICAgKlxuICAgICAqIEBncm91cCBTdGF0aWMgTWV0aG9kc1xuICAgICAqL1xuICAgIHN0YXRpYyByZXNvbHZlKCk6IENhbmNlbGxhYmxlUHJvbWlzZTx2b2lkPjtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHJlc29sdmVkIENhbmNlbGxhYmxlUHJvbWlzZSBmb3IgdGhlIHByb3ZpZGVkIHZhbHVlLlxuICAgICAqXG4gICAgICogQGdyb3VwIFN0YXRpYyBNZXRob2RzXG4gICAgICovXG4gICAgc3RhdGljIHJlc29sdmU8VD4odmFsdWU6IFQpOiBDYW5jZWxsYWJsZVByb21pc2U8QXdhaXRlZDxUPj47XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyByZXNvbHZlZCBDYW5jZWxsYWJsZVByb21pc2UgZm9yIHRoZSBwcm92aWRlZCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBncm91cCBTdGF0aWMgTWV0aG9kc1xuICAgICAqL1xuICAgIHN0YXRpYyByZXNvbHZlPFQ+KHZhbHVlOiBUIHwgUHJvbWlzZUxpa2U8VD4pOiBDYW5jZWxsYWJsZVByb21pc2U8QXdhaXRlZDxUPj47XG4gICAgc3RhdGljIHJlc29sdmU8VCA9IHZvaWQ+KHZhbHVlPzogVCB8IFByb21pc2VMaWtlPFQ+KTogQ2FuY2VsbGFibGVQcm9taXNlPEF3YWl0ZWQ8VD4+IHtcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQ2FuY2VsbGFibGVQcm9taXNlKSB7XG4gICAgICAgICAgICAvLyBPcHRpbWlzZSBmb3IgY2FuY2VsbGFibGUgcHJvbWlzZXMuXG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBDYW5jZWxsYWJsZVByb21pc2U8YW55PigocmVzb2x2ZSkgPT4gcmVzb2x2ZSh2YWx1ZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ2FuY2VsbGFibGVQcm9taXNlIGFuZCByZXR1cm5zIGl0IGluIGFuIG9iamVjdCwgYWxvbmcgd2l0aCBpdHMgcmVzb2x2ZSBhbmQgcmVqZWN0IGZ1bmN0aW9uc1xuICAgICAqIGFuZCBhIGdldHRlci9zZXR0ZXIgZm9yIHRoZSBjYW5jZWxsYXRpb24gY2FsbGJhY2suXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBwb2x5ZmlsbGVkLCBoZW5jZSBhdmFpbGFibGUgaW4gZXZlcnkgT1Mvd2VidmlldyB2ZXJzaW9uLlxuICAgICAqXG4gICAgICogQGdyb3VwIFN0YXRpYyBNZXRob2RzXG4gICAgICovXG4gICAgc3RhdGljIHdpdGhSZXNvbHZlcnM8VD4oKTogQ2FuY2VsbGFibGVQcm9taXNlV2l0aFJlc29sdmVyczxUPiB7XG4gICAgICAgIGxldCByZXN1bHQ6IENhbmNlbGxhYmxlUHJvbWlzZVdpdGhSZXNvbHZlcnM8VD4gPSB7IG9uY2FuY2VsbGVkOiBudWxsIH0gYXMgYW55O1xuICAgICAgICByZXN1bHQucHJvbWlzZSA9IG5ldyBDYW5jZWxsYWJsZVByb21pc2U8VD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgcmVzdWx0LnJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICAgICAgcmVzdWx0LnJlamVjdCA9IHJlamVjdDtcbiAgICAgICAgfSwgKGNhdXNlPzogYW55KSA9PiB7IHJlc3VsdC5vbmNhbmNlbGxlZD8uKGNhdXNlKTsgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgYSBjYWxsYmFjayB0aGF0IGltcGxlbWVudHMgdGhlIGNhbmNlbGxhdGlvbiBhbGdvcml0aG0gZm9yIHRoZSBnaXZlbiBjYW5jZWxsYWJsZSBwcm9taXNlLlxuICogVGhlIHByb21pc2UgcmV0dXJuZWQgZnJvbSB0aGUgcmVzdWx0aW5nIGZ1bmN0aW9uIGRvZXMgbm90IHJlamVjdC5cbiAqL1xuZnVuY3Rpb24gY2FuY2VsbGVyRm9yPFQ+KHByb21pc2U6IENhbmNlbGxhYmxlUHJvbWlzZVdpdGhSZXNvbHZlcnM8VD4sIHN0YXRlOiBDYW5jZWxsYWJsZVByb21pc2VTdGF0ZSkge1xuICAgIGxldCBjYW5jZWxsYXRpb25Qcm9taXNlOiB2b2lkIHwgUHJvbWlzZUxpa2U8dm9pZD4gPSB1bmRlZmluZWQ7XG5cbiAgICByZXR1cm4gKHJlYXNvbjogQ2FuY2VsRXJyb3IpOiB2b2lkIHwgUHJvbWlzZUxpa2U8dm9pZD4gPT4ge1xuICAgICAgICBpZiAoIXN0YXRlLnNldHRsZWQpIHtcbiAgICAgICAgICAgIHN0YXRlLnNldHRsZWQgPSB0cnVlO1xuICAgICAgICAgICAgc3RhdGUucmVhc29uID0gcmVhc29uO1xuICAgICAgICAgICAgcHJvbWlzZS5yZWplY3QocmVhc29uKTtcblxuICAgICAgICAgICAgLy8gQXR0YWNoIGFuIGVycm9yIGhhbmRsZXIgdGhhdCBpZ25vcmVzIHRoaXMgc3BlY2lmaWMgcmVqZWN0aW9uIHJlYXNvbiBhbmQgbm90aGluZyBlbHNlLlxuICAgICAgICAgICAgLy8gSW4gdGhlb3J5LCBhIHNhbmUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiBhdCB0aGlzIHBvaW50XG4gICAgICAgICAgICAvLyBzaG91bGQgYWx3YXlzIHJlamVjdCB3aXRoIG91ciBjYW5jZWxsYXRpb24gcmVhc29uLFxuICAgICAgICAgICAgLy8gaGVuY2UgdGhlIGhhbmRsZXIgd2lsbCBuZXZlciB0aHJvdy5cbiAgICAgICAgICAgIHZvaWQgcHJvbWlzZVRoZW4uY2FsbChwcm9taXNlLnByb21pc2UsIHVuZGVmaW5lZCwgKGVycikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlcnIgIT09IHJlYXNvbikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiByZWFzb24gaXMgbm90IHNldCwgdGhlIHByb21pc2UgcmVzb2x2ZWQgcmVndWxhcmx5LCBoZW5jZSB3ZSBtdXN0IG5vdCBjYWxsIG9uY2FuY2VsbGVkLlxuICAgICAgICAvLyBJZiBvbmNhbmNlbGxlZCBpcyB1bnNldCwgbm8gbmVlZCB0byBnbyBhbnkgZnVydGhlci5cbiAgICAgICAgaWYgKCFzdGF0ZS5yZWFzb24gfHwgIXByb21pc2Uub25jYW5jZWxsZWQpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgY2FuY2VsbGF0aW9uUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUocHJvbWlzZS5vbmNhbmNlbGxlZCEoc3RhdGUucmVhc29uIS5jYXVzZSkpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgUHJvbWlzZS5yZWplY3QobmV3IENhbmNlbGxlZFJlamVjdGlvbkVycm9yKHByb21pc2UucHJvbWlzZSwgZXJyLCBcIlVuaGFuZGxlZCBleGNlcHRpb24gaW4gb25jYW5jZWxsZWQgY2FsbGJhY2suXCIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGNhbmNlbGxhdGlvblByb21pc2UudGhlbih1bmRlZmluZWQsIChyZWFzb24/KSA9PiB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQ2FuY2VsbGVkUmVqZWN0aW9uRXJyb3IocHJvbWlzZS5wcm9taXNlLCByZWFzb24sIFwiVW5oYW5kbGVkIHJlamVjdGlvbiBpbiBvbmNhbmNlbGxlZCBjYWxsYmFjay5cIik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFVuc2V0IG9uY2FuY2VsbGVkIHRvIHByZXZlbnQgcmVwZWF0ZWQgY2FsbHMuXG4gICAgICAgIHByb21pc2Uub25jYW5jZWxsZWQgPSBudWxsO1xuXG4gICAgICAgIHJldHVybiBjYW5jZWxsYXRpb25Qcm9taXNlO1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgY2FsbGJhY2sgdGhhdCBpbXBsZW1lbnRzIHRoZSByZXNvbHV0aW9uIGFsZ29yaXRobSBmb3IgdGhlIGdpdmVuIGNhbmNlbGxhYmxlIHByb21pc2UuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVyRm9yPFQ+KHByb21pc2U6IENhbmNlbGxhYmxlUHJvbWlzZVdpdGhSZXNvbHZlcnM8VD4sIHN0YXRlOiBDYW5jZWxsYWJsZVByb21pc2VTdGF0ZSk6IENhbmNlbGxhYmxlUHJvbWlzZVJlc29sdmVyPFQ+IHtcbiAgICByZXR1cm4gKHZhbHVlKSA9PiB7XG4gICAgICAgIGlmIChzdGF0ZS5yZXNvbHZpbmcpIHsgcmV0dXJuOyB9XG4gICAgICAgIHN0YXRlLnJlc29sdmluZyA9IHRydWU7XG5cbiAgICAgICAgaWYgKHZhbHVlID09PSBwcm9taXNlLnByb21pc2UpIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZS5zZXR0bGVkKSB7IHJldHVybjsgfVxuICAgICAgICAgICAgc3RhdGUuc2V0dGxlZCA9IHRydWU7XG4gICAgICAgICAgICBwcm9taXNlLnJlamVjdChuZXcgVHlwZUVycm9yKFwiQSBwcm9taXNlIGNhbm5vdCBiZSByZXNvbHZlZCB3aXRoIGl0c2VsZi5cIikpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSkge1xuICAgICAgICAgICAgbGV0IHRoZW46IGFueTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhlbiA9ICh2YWx1ZSBhcyBhbnkpLnRoZW47XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBzdGF0ZS5zZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBwcm9taXNlLnJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlzQ2FsbGFibGUodGhlbikpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY2FuY2VsID0gKHZhbHVlIGFzIGFueSkuY2FuY2VsO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNDYWxsYWJsZShjYW5jZWwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvbmNhbmNlbGxlZCA9IChjYXVzZT86IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZmxlY3QuYXBwbHkoY2FuY2VsLCB2YWx1ZSwgW2NhdXNlXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLnJlYXNvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGFscmVhZHkgY2FuY2VsbGVkLCBwcm9wYWdhdGUgY2FuY2VsbGF0aW9uLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBwcm9taXNlIHJldHVybmVkIGZyb20gdGhlIGNhbmNlbGxlciBhbGdvcml0aG0gZG9lcyBub3QgcmVqZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gaXQgY2FuIGJlIGRpc2NhcmRlZCBzYWZlbHkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCBjYW5jZWxsZXJGb3IoeyAuLi5wcm9taXNlLCBvbmNhbmNlbGxlZCB9LCBzdGF0ZSkoc3RhdGUucmVhc29uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZS5vbmNhbmNlbGxlZCA9IG9uY2FuY2VsbGVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCB7fVxuXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3U3RhdGU6IENhbmNlbGxhYmxlUHJvbWlzZVN0YXRlID0ge1xuICAgICAgICAgICAgICAgICAgICByb290OiBzdGF0ZS5yb290LFxuICAgICAgICAgICAgICAgICAgICByZXNvbHZpbmc6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBnZXQgc2V0dGxlZCgpIHsgcmV0dXJuIHRoaXMucm9vdC5zZXR0bGVkIH0sXG4gICAgICAgICAgICAgICAgICAgIHNldCBzZXR0bGVkKHZhbHVlKSB7IHRoaXMucm9vdC5zZXR0bGVkID0gdmFsdWU7IH0sXG4gICAgICAgICAgICAgICAgICAgIGdldCByZWFzb24oKSB7IHJldHVybiB0aGlzLnJvb3QucmVhc29uIH1cbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVqZWN0b3IgPSByZWplY3RvckZvcihwcm9taXNlLCBuZXdTdGF0ZSk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgUmVmbGVjdC5hcHBseSh0aGVuLCB2YWx1ZSwgW3Jlc29sdmVyRm9yKHByb21pc2UsIG5ld1N0YXRlKSwgcmVqZWN0b3JdKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0b3IoZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBJTVBPUlRBTlQhXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RhdGUuc2V0dGxlZCkgeyByZXR1cm47IH1cbiAgICAgICAgc3RhdGUuc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIHByb21pc2UucmVzb2x2ZSh2YWx1ZSk7XG4gICAgfTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgY2FsbGJhY2sgdGhhdCBpbXBsZW1lbnRzIHRoZSByZWplY3Rpb24gYWxnb3JpdGhtIGZvciB0aGUgZ2l2ZW4gY2FuY2VsbGFibGUgcHJvbWlzZS5cbiAqL1xuZnVuY3Rpb24gcmVqZWN0b3JGb3I8VD4ocHJvbWlzZTogQ2FuY2VsbGFibGVQcm9taXNlV2l0aFJlc29sdmVyczxUPiwgc3RhdGU6IENhbmNlbGxhYmxlUHJvbWlzZVN0YXRlKTogQ2FuY2VsbGFibGVQcm9taXNlUmVqZWN0b3Ige1xuICAgIHJldHVybiAocmVhc29uPykgPT4ge1xuICAgICAgICBpZiAoc3RhdGUucmVzb2x2aW5nKSB7IHJldHVybjsgfVxuICAgICAgICBzdGF0ZS5yZXNvbHZpbmcgPSB0cnVlO1xuXG4gICAgICAgIGlmIChzdGF0ZS5zZXR0bGVkKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBDYW5jZWxFcnJvciAmJiBzdGF0ZS5yZWFzb24gaW5zdGFuY2VvZiBDYW5jZWxFcnJvciAmJiBPYmplY3QuaXMocmVhc29uLmNhdXNlLCBzdGF0ZS5yZWFzb24uY2F1c2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFN3YWxsb3cgbGF0ZSByZWplY3Rpb25zIHRoYXQgYXJlIENhbmNlbEVycm9ycyB3aG9zZSBjYW5jZWxsYXRpb24gY2F1c2UgaXMgdGhlIHNhbWUgYXMgb3Vycy5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2gge31cblxuICAgICAgICAgICAgdm9pZCBQcm9taXNlLnJlamVjdChuZXcgQ2FuY2VsbGVkUmVqZWN0aW9uRXJyb3IocHJvbWlzZS5wcm9taXNlLCByZWFzb24pKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YXRlLnNldHRsZWQgPSB0cnVlO1xuICAgICAgICAgICAgcHJvbWlzZS5yZWplY3QocmVhc29uKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgY2FsbGJhY2sgdGhhdCBjYW5jZWxzIGFsbCB2YWx1ZXMgaW4gYW4gaXRlcmFibGUgdGhhdCBsb29rIGxpa2UgY2FuY2VsbGFibGUgdGhlbmFibGVzLlxuICovXG5mdW5jdGlvbiBhbGxDYW5jZWxsZXIodmFsdWVzOiBJdGVyYWJsZTxhbnk+KTogQ2FuY2VsbGFibGVQcm9taXNlQ2FuY2VsbGVyIHtcbiAgICByZXR1cm4gKGNhdXNlPykgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoaXNDYWxsYWJsZSh2YWx1ZS50aGVuKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY2FuY2VsID0gdmFsdWUuY2FuY2VsO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNDYWxsYWJsZShjYW5jZWwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBSZWZsZWN0LmFwcGx5KGNhbmNlbCwgdmFsdWUsIFtjYXVzZV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCB7fVxuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgaXRzIGFyZ3VtZW50LlxuICovXG5mdW5jdGlvbiBpZGVudGl0eTxUPih4OiBUKTogVCB7XG4gICAgcmV0dXJuIHg7XG59XG5cbi8qKlxuICogVGhyb3dzIGl0cyBhcmd1bWVudC5cbiAqL1xuZnVuY3Rpb24gdGhyb3dlcihyZWFzb24/OiBhbnkpOiBuZXZlciB7XG4gICAgdGhyb3cgcmVhc29uO1xufVxuXG4vKipcbiAqIEF0dGVtcHRzIHZhcmlvdXMgc3RyYXRlZ2llcyB0byBjb252ZXJ0IGFuIGVycm9yIHRvIGEgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBlcnJvck1lc3NhZ2UoZXJyOiBhbnkpOiBzdHJpbmcge1xuICAgIHRyeSB7XG4gICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBFcnJvciB8fCB0eXBlb2YgZXJyICE9PSAnb2JqZWN0JyB8fCBlcnIudG9TdHJpbmcgIT09IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBcIlwiICsgZXJyO1xuICAgICAgICB9XG4gICAgfSBjYXRjaCB7fVxuXG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGVycik7XG4gICAgfSBjYXRjaCB7fVxuXG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlcnIpO1xuICAgIH0gY2F0Y2gge31cblxuICAgIHJldHVybiBcIjxjb3VsZCBub3QgY29udmVydCBlcnJvciB0byBzdHJpbmc+XCI7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgY3VycmVudCBiYXJyaWVyIHByb21pc2UgZm9yIHRoZSBnaXZlbiBjYW5jZWxsYWJsZSBwcm9taXNlLiBJZiBuZWNlc3NhcnksIGluaXRpYWxpc2VzIHRoZSBiYXJyaWVyLlxuICovXG5mdW5jdGlvbiBjdXJyZW50QmFycmllcjxUPihwcm9taXNlOiBDYW5jZWxsYWJsZVByb21pc2U8VD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgcHdyOiBQYXJ0aWFsPFByb21pc2VXaXRoUmVzb2x2ZXJzPHZvaWQ+PiA9IHByb21pc2VbYmFycmllclN5bV0gPz8ge307XG4gICAgaWYgKCEoJ3Byb21pc2UnIGluIHB3cikpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihwd3IsIHByb21pc2VXaXRoUmVzb2x2ZXJzPHZvaWQ+KCkpO1xuICAgIH1cbiAgICBpZiAocHJvbWlzZVtiYXJyaWVyU3ltXSA9PSBudWxsKSB7XG4gICAgICAgIHB3ci5yZXNvbHZlISgpO1xuICAgICAgICBwcm9taXNlW2JhcnJpZXJTeW1dID0gcHdyO1xuICAgIH1cbiAgICByZXR1cm4gcHdyLnByb21pc2UhO1xufVxuXG4vLyBTdG9wIHNuZWFreSBwZW9wbGUgZnJvbSBicmVha2luZyB0aGUgYmFycmllciBtZWNoYW5pc20uXG5jb25zdCBwcm9taXNlVGhlbiA9IFByb21pc2UucHJvdG90eXBlLnRoZW47XG5Qcm9taXNlLnByb3RvdHlwZS50aGVuID0gZnVuY3Rpb24oLi4uYXJncykge1xuICAgIGlmICh0aGlzIGluc3RhbmNlb2YgQ2FuY2VsbGFibGVQcm9taXNlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRoZW4oLi4uYXJncyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuYXBwbHkocHJvbWlzZVRoZW4sIHRoaXMsIGFyZ3MpO1xuICAgIH1cbn1cblxuLy8gUG9seWZpbGwgUHJvbWlzZS53aXRoUmVzb2x2ZXJzLlxubGV0IHByb21pc2VXaXRoUmVzb2x2ZXJzID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzO1xuaWYgKHByb21pc2VXaXRoUmVzb2x2ZXJzICYmIHR5cGVvZiBwcm9taXNlV2l0aFJlc29sdmVycyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHByb21pc2VXaXRoUmVzb2x2ZXJzID0gcHJvbWlzZVdpdGhSZXNvbHZlcnMuYmluZChQcm9taXNlKTtcbn0gZWxzZSB7XG4gICAgcHJvbWlzZVdpdGhSZXNvbHZlcnMgPSBmdW5jdGlvbiA8VD4oKTogUHJvbWlzZVdpdGhSZXNvbHZlcnM8VD4ge1xuICAgICAgICBsZXQgcmVzb2x2ZSE6ICh2YWx1ZTogVCB8IFByb21pc2VMaWtlPFQ+KSA9PiB2b2lkO1xuICAgICAgICBsZXQgcmVqZWN0ITogKHJlYXNvbj86IGFueSkgPT4gdm9pZDtcbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlPFQ+KChyZXMsIHJlaikgPT4geyByZXNvbHZlID0gcmVzOyByZWplY3QgPSByZWo7IH0pO1xuICAgICAgICByZXR1cm4geyBwcm9taXNlLCByZXNvbHZlLCByZWplY3QgfTtcbiAgICB9XG59IiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5pbXBvcnQge25ld1J1bnRpbWVDYWxsZXIsIG9iamVjdE5hbWVzfSBmcm9tIFwiLi9ydW50aW1lLmpzXCI7XG5cbmNvbnN0IGNhbGwgPSBuZXdSdW50aW1lQ2FsbGVyKG9iamVjdE5hbWVzLkNsaXBib2FyZCk7XG5cbmNvbnN0IENsaXBib2FyZFNldFRleHQgPSAwO1xuY29uc3QgQ2xpcGJvYXJkVGV4dCA9IDE7XG5cbi8qKlxuICogU2V0cyB0aGUgdGV4dCB0byB0aGUgQ2xpcGJvYXJkLlxuICpcbiAqIEBwYXJhbSB0ZXh0IC0gVGhlIHRleHQgdG8gYmUgc2V0IHRvIHRoZSBDbGlwYm9hcmQuXG4gKiBAcmV0dXJuIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gU2V0VGV4dCh0ZXh0OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gY2FsbChDbGlwYm9hcmRTZXRUZXh0LCB7dGV4dH0pO1xufVxuXG4vKipcbiAqIEdldCB0aGUgQ2xpcGJvYXJkIHRleHRcbiAqXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSB0ZXh0IGZyb20gdGhlIENsaXBib2FyZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFRleHQoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gY2FsbChDbGlwYm9hcmRUZXh0KTtcbn1cbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuLyoqXG4gKiBBbnkgaXMgYSBkdW1teSBjcmVhdGlvbiBmdW5jdGlvbiBmb3Igc2ltcGxlIG9yIHVua25vd24gdHlwZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBBbnk8VD4oc291cmNlOiBhbnkpOiBUIHtcbiAgICByZXR1cm4gc291cmNlO1xufVxuXG4vKipcbiAqIEJ5dGVTbGljZSBpcyBhIGNyZWF0aW9uIGZ1bmN0aW9uIHRoYXQgcmVwbGFjZXNcbiAqIG51bGwgc3RyaW5ncyB3aXRoIGVtcHR5IHN0cmluZ3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBCeXRlU2xpY2Uoc291cmNlOiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiAoKHNvdXJjZSA9PSBudWxsKSA/IFwiXCIgOiBzb3VyY2UpO1xufVxuXG4vKipcbiAqIEFycmF5IHRha2VzIGEgY3JlYXRpb24gZnVuY3Rpb24gZm9yIGFuIGFyYml0cmFyeSB0eXBlXG4gKiBhbmQgcmV0dXJucyBhbiBpbi1wbGFjZSBjcmVhdGlvbiBmdW5jdGlvbiBmb3IgYW4gYXJyYXlcbiAqIHdob3NlIGVsZW1lbnRzIGFyZSBvZiB0aGF0IHR5cGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBBcnJheTxUPihlbGVtZW50OiAoc291cmNlOiBhbnkpID0+IFQpOiAoc291cmNlOiBhbnkpID0+IFRbXSB7XG4gICAgaWYgKGVsZW1lbnQgPT09IEFueSkge1xuICAgICAgICByZXR1cm4gKHNvdXJjZSkgPT4gKHNvdXJjZSA9PT0gbnVsbCA/IFtdIDogc291cmNlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKHNvdXJjZSkgPT4ge1xuICAgICAgICBpZiAoc291cmNlID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3VyY2UubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHNvdXJjZVtpXSA9IGVsZW1lbnQoc291cmNlW2ldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc291cmNlO1xuICAgIH07XG59XG5cbi8qKlxuICogTWFwIHRha2VzIGNyZWF0aW9uIGZ1bmN0aW9ucyBmb3IgdHdvIGFyYml0cmFyeSB0eXBlc1xuICogYW5kIHJldHVybnMgYW4gaW4tcGxhY2UgY3JlYXRpb24gZnVuY3Rpb24gZm9yIGFuIG9iamVjdFxuICogd2hvc2Uga2V5cyBhbmQgdmFsdWVzIGFyZSBvZiB0aG9zZSB0eXBlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE1hcDxWPihrZXk6IChzb3VyY2U6IGFueSkgPT4gc3RyaW5nLCB2YWx1ZTogKHNvdXJjZTogYW55KSA9PiBWKTogKHNvdXJjZTogYW55KSA9PiBSZWNvcmQ8c3RyaW5nLCBWPiB7XG4gICAgaWYgKHZhbHVlID09PSBBbnkpIHtcbiAgICAgICAgcmV0dXJuIChzb3VyY2UpID0+IChzb3VyY2UgPT09IG51bGwgPyB7fSA6IHNvdXJjZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIChzb3VyY2UpID0+IHtcbiAgICAgICAgaWYgKHNvdXJjZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHNvdXJjZSkge1xuICAgICAgICAgICAgc291cmNlW2tleV0gPSB2YWx1ZShzb3VyY2Vba2V5XSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICB9O1xufVxuXG4vKipcbiAqIE51bGxhYmxlIHRha2VzIGEgY3JlYXRpb24gZnVuY3Rpb24gZm9yIGFuIGFyYml0cmFyeSB0eXBlXG4gKiBhbmQgcmV0dXJucyBhIGNyZWF0aW9uIGZ1bmN0aW9uIGZvciBhIG51bGxhYmxlIHZhbHVlIG9mIHRoYXQgdHlwZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE51bGxhYmxlPFQ+KGVsZW1lbnQ6IChzb3VyY2U6IGFueSkgPT4gVCk6IChzb3VyY2U6IGFueSkgPT4gKFQgfCBudWxsKSB7XG4gICAgaWYgKGVsZW1lbnQgPT09IEFueSkge1xuICAgICAgICByZXR1cm4gQW55O1xuICAgIH1cblxuICAgIHJldHVybiAoc291cmNlKSA9PiAoc291cmNlID09PSBudWxsID8gbnVsbCA6IGVsZW1lbnQoc291cmNlKSk7XG59XG5cbi8qKlxuICogU3RydWN0IHRha2VzIGFuIG9iamVjdCBtYXBwaW5nIGZpZWxkIG5hbWVzIHRvIGNyZWF0aW9uIGZ1bmN0aW9uc1xuICogYW5kIHJldHVybnMgYW4gaW4tcGxhY2UgY3JlYXRpb24gZnVuY3Rpb24gZm9yIGEgc3RydWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gU3RydWN0PFxuICAgIFQgZXh0ZW5kcyB7IFtfOiBzdHJpbmddOiAoKHNvdXJjZTogYW55KSA9PiBhbnkpIH0sXG4gICAgVSBleHRlbmRzIHsgW0tleSBpbiBrZXlvZiBUXT86IFJldHVyblR5cGU8VFtLZXldPiB9XG4+KGNyZWF0ZUZpZWxkOiBUKTogKHNvdXJjZTogYW55KSA9PiBVIHtcbiAgICBsZXQgYWxsQW55ID0gdHJ1ZTtcbiAgICBmb3IgKGNvbnN0IG5hbWUgaW4gY3JlYXRlRmllbGQpIHtcbiAgICAgICAgaWYgKGNyZWF0ZUZpZWxkW25hbWVdICE9PSBBbnkpIHtcbiAgICAgICAgICAgIGFsbEFueSA9IGZhbHNlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGFsbEFueSkge1xuICAgICAgICByZXR1cm4gQW55O1xuICAgIH1cblxuICAgIHJldHVybiAoc291cmNlKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBpbiBjcmVhdGVGaWVsZCkge1xuICAgICAgICAgICAgaWYgKG5hbWUgaW4gc291cmNlKSB7XG4gICAgICAgICAgICAgICAgc291cmNlW25hbWVdID0gY3JlYXRlRmllbGRbbmFtZV0oc291cmNlW25hbWVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc291cmNlO1xuICAgIH07XG59XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbmV4cG9ydCBpbnRlcmZhY2UgU2l6ZSB7XG4gICAgLyoqIFRoZSB3aWR0aCBvZiBhIHJlY3Rhbmd1bGFyIGFyZWEuICovXG4gICAgV2lkdGg6IG51bWJlcjtcbiAgICAvKiogVGhlIGhlaWdodCBvZiBhIHJlY3Rhbmd1bGFyIGFyZWEuICovXG4gICAgSGVpZ2h0OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVjdCB7XG4gICAgLyoqIFRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIG9yaWdpbi4gKi9cbiAgICBYOiBudW1iZXI7XG4gICAgLyoqIFRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIG9yaWdpbi4gKi9cbiAgICBZOiBudW1iZXI7XG4gICAgLyoqIFRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlLiAqL1xuICAgIFdpZHRoOiBudW1iZXI7XG4gICAgLyoqIFRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZS4gKi9cbiAgICBIZWlnaHQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTY3JlZW4ge1xuICAgIC8qKiBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHNjcmVlbi4gKi9cbiAgICBJRDogc3RyaW5nO1xuICAgIC8qKiBIdW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSBzY3JlZW4uICovXG4gICAgTmFtZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgc2NhbGUgZmFjdG9yIG9mIHRoZSBzY3JlZW4gKERQSS85NikuIDEgPSBzdGFuZGFyZCBEUEksIDIgPSBIaURQSSAoUmV0aW5hKSwgZXRjLiAqL1xuICAgIFNjYWxlRmFjdG9yOiBudW1iZXI7XG4gICAgLyoqIFRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHNjcmVlbi4gKi9cbiAgICBYOiBudW1iZXI7XG4gICAgLyoqIFRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHNjcmVlbi4gKi9cbiAgICBZOiBudW1iZXI7XG4gICAgLyoqIENvbnRhaW5zIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBzY3JlZW4uICovXG4gICAgU2l6ZTogU2l6ZTtcbiAgICAvKiogQ29udGFpbnMgdGhlIGJvdW5kcyBvZiB0aGUgc2NyZWVuIGluIHRlcm1zIG9mIFgsIFksIFdpZHRoLCBhbmQgSGVpZ2h0LiAqL1xuICAgIEJvdW5kczogUmVjdDtcbiAgICAvKiogQ29udGFpbnMgdGhlIHBoeXNpY2FsIGJvdW5kcyBvZiB0aGUgc2NyZWVuIGluIHRlcm1zIG9mIFgsIFksIFdpZHRoLCBhbmQgSGVpZ2h0IChiZWZvcmUgc2NhbGluZykuICovXG4gICAgUGh5c2ljYWxCb3VuZHM6IFJlY3Q7XG4gICAgLyoqIENvbnRhaW5zIHRoZSBhcmVhIG9mIHRoZSBzY3JlZW4gdGhhdCBpcyBhY3R1YWxseSB1c2FibGUgKGV4Y2x1ZGluZyB0YXNrYmFyIGFuZCBvdGhlciBzeXN0ZW0gVUkpLiAqL1xuICAgIFdvcmtBcmVhOiBSZWN0O1xuICAgIC8qKiBDb250YWlucyB0aGUgcGh5c2ljYWwgV29ya0FyZWEgb2YgdGhlIHNjcmVlbiAoYmVmb3JlIHNjYWxpbmcpLiAqL1xuICAgIFBoeXNpY2FsV29ya0FyZWE6IFJlY3Q7XG4gICAgLyoqIFRydWUgaWYgdGhpcyBpcyB0aGUgcHJpbWFyeSBtb25pdG9yIHNlbGVjdGVkIGJ5IHRoZSB1c2VyIGluIHRoZSBvcGVyYXRpbmcgc3lzdGVtLiAqL1xuICAgIElzUHJpbWFyeTogYm9vbGVhbjtcbiAgICAvKiogVGhlIHJvdGF0aW9uIG9mIHRoZSBzY3JlZW4uICovXG4gICAgUm90YXRpb246IG51bWJlcjtcbn1cblxuaW1wb3J0IHsgbmV3UnVudGltZUNhbGxlciwgb2JqZWN0TmFtZXMgfSBmcm9tIFwiLi9ydW50aW1lLmpzXCI7XG5jb25zdCBjYWxsID0gbmV3UnVudGltZUNhbGxlcihvYmplY3ROYW1lcy5TY3JlZW5zKTtcblxuY29uc3QgZ2V0QWxsID0gMDtcbmNvbnN0IGdldFByaW1hcnkgPSAxO1xuY29uc3QgZ2V0Q3VycmVudCA9IDI7XG5cbi8qKlxuICogR2V0cyBhbGwgc2NyZWVucy5cbiAqXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBvZiBTY3JlZW4gb2JqZWN0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEdldEFsbCgpOiBQcm9taXNlPFNjcmVlbltdPiB7XG4gICAgcmV0dXJuIGNhbGwoZ2V0QWxsKTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBwcmltYXJ5IHNjcmVlbi5cbiAqXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcHJpbWFyeSBzY3JlZW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBHZXRQcmltYXJ5KCk6IFByb21pc2U8U2NyZWVuPiB7XG4gICAgcmV0dXJuIGNhbGwoZ2V0UHJpbWFyeSk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgY3VycmVudCBhY3RpdmUgc2NyZWVuLlxuICpcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGN1cnJlbnQgYWN0aXZlIHNjcmVlbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEdldEN1cnJlbnQoKTogUHJvbWlzZTxTY3JlZW4+IHtcbiAgICByZXR1cm4gY2FsbChnZXRDdXJyZW50KTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7O0FDQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7O0FDQUE7QUFBQTtBQUFBO0FBQUE7OztBQzZCQSxJQUFNLGNBQ0Y7QUFFRyxTQUFTLE9BQU8sT0FBZSxJQUFZO0FBQzlDLE1BQUksS0FBSztBQUVULE1BQUksSUFBSSxPQUFPO0FBQ2YsU0FBTyxLQUFLO0FBRVIsVUFBTSxZQUFhLEtBQUssT0FBTyxJQUFJLEtBQU0sQ0FBQztBQUFBLEVBQzlDO0FBQ0EsU0FBTztBQUNYOzs7QUM3QkEsSUFBTSxhQUFhLE9BQU8sU0FBUyxTQUFTO0FBR3JDLElBQU0sY0FBYyxPQUFPLE9BQU87QUFBQSxFQUNyQyxNQUFN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QUFNLGFBQWE7QUFDbkIsSUFBTSxhQUFhO0FBT1osU0FBUyxTQUE0QjtBQUN4QyxTQUFPQSxNQUFLLE1BQU07QUFDdEI7QUFPTyxTQUFTLGFBQThCO0FBQzFDLFNBQU9BLE1BQUssVUFBVTtBQUMxQjtBQU9PLFNBQVMsYUFBOEI7QUFDMUMsU0FBT0EsTUFBSyxVQUFVO0FBQzFCOzs7QXRCNUVBLE9BQU8sU0FBUyxPQUFPLFVBQVUsQ0FBQztBQTRDbEMsT0FBTyxPQUFPLFNBQWdCO0FBQ3ZCLE9BQU8scUJBQXFCOyIsCiAgIm5hbWVzIjogWyJfYSIsICJFcnJvciIsICJjYWxsIiwgIl9hIiwgIkVycm9yIiwgImNhbGwiLCAicmVzaXphYmxlIiwgImNhbGwiLCAiX2EiLCAiY2FsbCIsICJfYSIsICJfYSIsICJjYWxsIiwgIkhpZGVNZXRob2QiLCAiU2hvd01ldGhvZCIsICJpc0RvY3VtZW50RG90QWxsIiwgIl9hIiwgInJlYXNvbiIsICJ2YWx1ZSIsICJjYWxsIiwgImdldEFuZERlbGV0ZVJlc3BvbnNlIiwgImdlbmVyYXRlSUQiLCAiY2FsbCIsICJBcnJheSIsICJNYXAiLCAiQXJyYXkiLCAiTWFwIiwgImtleSIsICJjYWxsIl0KfQo= +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2luZGV4LnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy93bWwudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2Jyb3dzZXIudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL25hbm9pZC50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvcnVudGltZS50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvZGlhbG9ncy50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvZXZlbnRzLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9saXN0ZW5lci50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvZXZlbnRfdHlwZXMudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3V0aWxzLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy93aW5kb3cudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL2NvbXBpbGVkL21haW4uanMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3N5c3RlbS50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvY29udGV4dG1lbnUudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2ZsYWdzLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9kcmFnLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9hcHBsaWNhdGlvbi50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvY2FsbHMudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2NhbGxhYmxlLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9jYW5jZWxsYWJsZS50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvY2xpcGJvYXJkLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9jcmVhdGUudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3NjcmVlbnMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vLyBTZXR1cFxud2luZG93Ll93YWlscyA9IHdpbmRvdy5fd2FpbHMgfHwge307XG5cbmltcG9ydCBcIi4vY29udGV4dG1lbnUuanNcIjtcbmltcG9ydCBcIi4vZHJhZy5qc1wiO1xuXG4vLyBSZS1leHBvcnQgcHVibGljIEFQSVxuaW1wb3J0ICogYXMgQXBwbGljYXRpb24gZnJvbSBcIi4vYXBwbGljYXRpb24uanNcIjtcbmltcG9ydCAqIGFzIEJyb3dzZXIgZnJvbSBcIi4vYnJvd3Nlci5qc1wiO1xuaW1wb3J0ICogYXMgQ2FsbCBmcm9tIFwiLi9jYWxscy5qc1wiO1xuaW1wb3J0ICogYXMgQ2xpcGJvYXJkIGZyb20gXCIuL2NsaXBib2FyZC5qc1wiO1xuaW1wb3J0ICogYXMgQ3JlYXRlIGZyb20gXCIuL2NyZWF0ZS5qc1wiO1xuaW1wb3J0ICogYXMgRGlhbG9ncyBmcm9tIFwiLi9kaWFsb2dzLmpzXCI7XG5pbXBvcnQgKiBhcyBFdmVudHMgZnJvbSBcIi4vZXZlbnRzLmpzXCI7XG5pbXBvcnQgKiBhcyBGbGFncyBmcm9tIFwiLi9mbGFncy5qc1wiO1xuaW1wb3J0ICogYXMgU2NyZWVucyBmcm9tIFwiLi9zY3JlZW5zLmpzXCI7XG5pbXBvcnQgKiBhcyBTeXN0ZW0gZnJvbSBcIi4vc3lzdGVtLmpzXCI7XG5pbXBvcnQgV2luZG93IGZyb20gXCIuL3dpbmRvdy5qc1wiO1xuaW1wb3J0ICogYXMgV01MIGZyb20gXCIuL3dtbC5qc1wiO1xuXG5leHBvcnQge1xuICAgIEFwcGxpY2F0aW9uLFxuICAgIEJyb3dzZXIsXG4gICAgQ2FsbCxcbiAgICBDbGlwYm9hcmQsXG4gICAgRGlhbG9ncyxcbiAgICBFdmVudHMsXG4gICAgRmxhZ3MsXG4gICAgU2NyZWVucyxcbiAgICBTeXN0ZW0sXG4gICAgV2luZG93LFxuICAgIFdNTFxufTtcblxuLyoqXG4gKiBBbiBpbnRlcm5hbCB1dGlsaXR5IGNvbnN1bWVkIGJ5IHRoZSBiaW5kaW5nIGdlbmVyYXRvci5cbiAqXG4gKiBAaWdub3JlXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IHsgQ3JlYXRlIH07XG5cbmV4cG9ydCAqIGZyb20gXCIuL2NhbmNlbGxhYmxlLmpzXCI7XG5cbi8vIE5vdGlmeSBiYWNrZW5kXG53aW5kb3cuX3dhaWxzLmludm9rZSA9IFN5c3RlbS5pbnZva2U7XG5TeXN0ZW0uaW52b2tlKFwid2FpbHM6cnVudGltZTpyZWFkeVwiKTtcbiIsICIvKlxuIF8gICAgIF9fICAgICBfIF9fXG58IHwgIC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuaW1wb3J0IHsgT3BlblVSTCB9IGZyb20gXCIuL2Jyb3dzZXIuanNcIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4vZGlhbG9ncy5qc1wiO1xuaW1wb3J0IHsgRW1pdCwgV2FpbHNFdmVudCB9IGZyb20gXCIuL2V2ZW50cy5qc1wiO1xuaW1wb3J0IHsgY2FuQWJvcnRMaXN0ZW5lcnMsIHdoZW5SZWFkeSB9IGZyb20gXCIuL3V0aWxzLmpzXCI7XG5pbXBvcnQgV2luZG93IGZyb20gXCIuL3dpbmRvdy5qc1wiO1xuXG4vKipcbiAqIFNlbmRzIGFuIGV2ZW50IHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIG9wdGlvbmFsIGRhdGEuXG4gKlxuICogQHBhcmFtIGV2ZW50TmFtZSAtIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIHNlbmQuXG4gKiBAcGFyYW0gW2RhdGE9bnVsbF0gLSAtIE9wdGlvbmFsIGRhdGEgdG8gc2VuZCBhbG9uZyB3aXRoIHRoZSBldmVudC5cbiAqL1xuZnVuY3Rpb24gc2VuZEV2ZW50KGV2ZW50TmFtZTogc3RyaW5nLCBkYXRhOiBhbnkgPSBudWxsKTogdm9pZCB7XG4gICAgRW1pdChuZXcgV2FpbHNFdmVudChldmVudE5hbWUsIGRhdGEpKTtcbn1cblxuLyoqXG4gKiBDYWxscyBhIG1ldGhvZCBvbiBhIHNwZWNpZmllZCB3aW5kb3cuXG4gKlxuICogQHBhcmFtIHdpbmRvd05hbWUgLSBUaGUgbmFtZSBvZiB0aGUgd2luZG93IHRvIGNhbGwgdGhlIG1ldGhvZCBvbi5cbiAqIEBwYXJhbSBtZXRob2ROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0byBjYWxsLlxuICovXG5mdW5jdGlvbiBjYWxsV2luZG93TWV0aG9kKHdpbmRvd05hbWU6IHN0cmluZywgbWV0aG9kTmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgdGFyZ2V0V2luZG93ID0gV2luZG93LkdldCh3aW5kb3dOYW1lKTtcbiAgICBjb25zdCBtZXRob2QgPSAodGFyZ2V0V2luZG93IGFzIGFueSlbbWV0aG9kTmFtZV07XG5cbiAgICBpZiAodHlwZW9mIG1ldGhvZCAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFdpbmRvdyBtZXRob2QgJyR7bWV0aG9kTmFtZX0nIG5vdCBmb3VuZGApO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgICAgbWV0aG9kLmNhbGwodGFyZ2V0V2luZG93KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIGNhbGxpbmcgd2luZG93IG1ldGhvZCAnJHttZXRob2ROYW1lfSc6IGAsIGUpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZXNwb25kcyB0byBhIHRyaWdnZXJpbmcgZXZlbnQgYnkgcnVubmluZyBhcHByb3ByaWF0ZSBXTUwgYWN0aW9ucyBmb3IgdGhlIGN1cnJlbnQgdGFyZ2V0LlxuICovXG5mdW5jdGlvbiBvbldNTFRyaWdnZXJlZChldjogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBlbGVtZW50ID0gZXYuY3VycmVudFRhcmdldCBhcyBFbGVtZW50O1xuXG4gICAgZnVuY3Rpb24gcnVuRWZmZWN0KGNob2ljZSA9IFwiWWVzXCIpIHtcbiAgICAgICAgaWYgKGNob2ljZSAhPT0gXCJZZXNcIilcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjb25zdCBldmVudFR5cGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnd21sLWV2ZW50JykgfHwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtd21sLWV2ZW50Jyk7XG4gICAgICAgIGNvbnN0IHRhcmdldFdpbmRvdyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd3bWwtdGFyZ2V0LXdpbmRvdycpIHx8IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXdtbC10YXJnZXQtd2luZG93JykgfHwgXCJcIjtcbiAgICAgICAgY29uc3Qgd2luZG93TWV0aG9kID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3dtbC13aW5kb3cnKSB8fCBlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS13bWwtd2luZG93Jyk7XG4gICAgICAgIGNvbnN0IHVybCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd3bWwtb3BlbnVybCcpIHx8IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXdtbC1vcGVudXJsJyk7XG5cbiAgICAgICAgaWYgKGV2ZW50VHlwZSAhPT0gbnVsbClcbiAgICAgICAgICAgIHNlbmRFdmVudChldmVudFR5cGUpO1xuICAgICAgICBpZiAod2luZG93TWV0aG9kICE9PSBudWxsKVxuICAgICAgICAgICAgY2FsbFdpbmRvd01ldGhvZCh0YXJnZXRXaW5kb3csIHdpbmRvd01ldGhvZCk7XG4gICAgICAgIGlmICh1cmwgIT09IG51bGwpXG4gICAgICAgICAgICB2b2lkIE9wZW5VUkwodXJsKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb25maXJtID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3dtbC1jb25maXJtJykgfHwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtd21sLWNvbmZpcm0nKTtcblxuICAgIGlmIChjb25maXJtKSB7XG4gICAgICAgIFF1ZXN0aW9uKHtcbiAgICAgICAgICAgIFRpdGxlOiBcIkNvbmZpcm1cIixcbiAgICAgICAgICAgIE1lc3NhZ2U6IGNvbmZpcm0sXG4gICAgICAgICAgICBEZXRhY2hlZDogZmFsc2UsXG4gICAgICAgICAgICBCdXR0b25zOiBbXG4gICAgICAgICAgICAgICAgeyBMYWJlbDogXCJZZXNcIiB9LFxuICAgICAgICAgICAgICAgIHsgTGFiZWw6IFwiTm9cIiwgSXNEZWZhdWx0OiB0cnVlIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSkudGhlbihydW5FZmZlY3QpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJ1bkVmZmVjdCgpO1xuICAgIH1cbn1cblxuLy8gUHJpdmF0ZSBmaWVsZCBuYW1lcy5cbmNvbnN0IGNvbnRyb2xsZXJTeW0gPSBTeW1ib2woXCJjb250cm9sbGVyXCIpO1xuY29uc3QgdHJpZ2dlck1hcFN5bSA9IFN5bWJvbChcInRyaWdnZXJNYXBcIik7XG5jb25zdCBlbGVtZW50Q291bnRTeW0gPSBTeW1ib2woXCJlbGVtZW50Q291bnRcIik7XG5cbi8qKlxuICogQWJvcnRDb250cm9sbGVyUmVnaXN0cnkgZG9lcyBub3QgYWN0dWFsbHkgcmVtZW1iZXIgYWN0aXZlIGV2ZW50IGxpc3RlbmVyczogaW5zdGVhZFxuICogaXQgdGllcyB0aGVtIHRvIGFuIEFib3J0U2lnbmFsIGFuZCB1c2VzIGFuIEFib3J0Q29udHJvbGxlciB0byByZW1vdmUgdGhlbSBhbGwgYXQgb25jZS5cbiAqL1xuY2xhc3MgQWJvcnRDb250cm9sbGVyUmVnaXN0cnkge1xuICAgIC8vIFByaXZhdGUgZmllbGRzLlxuICAgIFtjb250cm9sbGVyU3ltXTogQWJvcnRDb250cm9sbGVyO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXNbY29udHJvbGxlclN5bV0gPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBvcHRpb25zIG9iamVjdCBmb3IgYWRkRXZlbnRMaXN0ZW5lciB0aGF0IHRpZXMgdGhlIGxpc3RlbmVyXG4gICAgICogdG8gdGhlIEFib3J0U2lnbmFsIGZyb20gdGhlIGN1cnJlbnQgQWJvcnRDb250cm9sbGVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVsZW1lbnQgLSBBbiBIVE1MIGVsZW1lbnRcbiAgICAgKiBAcGFyYW0gdHJpZ2dlcnMgLSBUaGUgbGlzdCBvZiBhY3RpdmUgV01MIHRyaWdnZXIgZXZlbnRzIGZvciB0aGUgc3BlY2lmaWVkIGVsZW1lbnRzXG4gICAgICovXG4gICAgc2V0KGVsZW1lbnQ6IEVsZW1lbnQsIHRyaWdnZXJzOiBzdHJpbmdbXSk6IEFkZEV2ZW50TGlzdGVuZXJPcHRpb25zIHtcbiAgICAgICAgcmV0dXJuIHsgc2lnbmFsOiB0aGlzW2NvbnRyb2xsZXJTeW1dLnNpZ25hbCB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIHJlZ2lzdGVyZWQgZXZlbnQgbGlzdGVuZXJzIGFuZCByZXNldHMgdGhlIHJlZ2lzdHJ5LlxuICAgICAqL1xuICAgIHJlc2V0KCk6IHZvaWQge1xuICAgICAgICB0aGlzW2NvbnRyb2xsZXJTeW1dLmFib3J0KCk7XG4gICAgICAgIHRoaXNbY29udHJvbGxlclN5bV0gPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgfVxufVxuXG4vKipcbiAqIFdlYWtNYXBSZWdpc3RyeSBtYXBzIGFjdGl2ZSB0cmlnZ2VyIGV2ZW50cyB0byBlYWNoIERPTSBlbGVtZW50IHRocm91Z2ggYSBXZWFrTWFwLlxuICogVGhpcyBlbnN1cmVzIHRoYXQgdGhlIG1hcHBpbmcgcmVtYWlucyBwcml2YXRlIHRvIHRoaXMgbW9kdWxlLCB3aGlsZSBzdGlsbCBhbGxvd2luZyBnYXJiYWdlXG4gKiBjb2xsZWN0aW9uIG9mIHRoZSBpbnZvbHZlZCBlbGVtZW50cy5cbiAqL1xuY2xhc3MgV2Vha01hcFJlZ2lzdHJ5IHtcbiAgICAvKiogU3RvcmVzIHRoZSBjdXJyZW50IGVsZW1lbnQtdG8tdHJpZ2dlciBtYXBwaW5nLiAqL1xuICAgIFt0cmlnZ2VyTWFwU3ltXTogV2Vha01hcDxFbGVtZW50LCBzdHJpbmdbXT47XG4gICAgLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHdpdGggYWN0aXZlIFdNTCB0cmlnZ2Vycy4gKi9cbiAgICBbZWxlbWVudENvdW50U3ltXTogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXNbdHJpZ2dlck1hcFN5bV0gPSBuZXcgV2Vha01hcCgpO1xuICAgICAgICB0aGlzW2VsZW1lbnRDb3VudFN5bV0gPSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgYWN0aXZlIHRyaWdnZXJzIGZvciB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZWxlbWVudCAtIEFuIEhUTUwgZWxlbWVudFxuICAgICAqIEBwYXJhbSB0cmlnZ2VycyAtIFRoZSBsaXN0IG9mIGFjdGl2ZSBXTUwgdHJpZ2dlciBldmVudHMgZm9yIHRoZSBzcGVjaWZpZWQgZWxlbWVudFxuICAgICAqL1xuICAgIHNldChlbGVtZW50OiBFbGVtZW50LCB0cmlnZ2Vyczogc3RyaW5nW10pOiBBZGRFdmVudExpc3RlbmVyT3B0aW9ucyB7XG4gICAgICAgIGlmICghdGhpc1t0cmlnZ2VyTWFwU3ltXS5oYXMoZWxlbWVudCkpIHsgdGhpc1tlbGVtZW50Q291bnRTeW1dKys7IH1cbiAgICAgICAgdGhpc1t0cmlnZ2VyTWFwU3ltXS5zZXQoZWxlbWVudCwgdHJpZ2dlcnMpO1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwgcmVnaXN0ZXJlZCBldmVudCBsaXN0ZW5lcnMuXG4gICAgICovXG4gICAgcmVzZXQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzW2VsZW1lbnRDb3VudFN5bV0gPD0gMClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZG9jdW1lbnQuYm9keS5xdWVyeVNlbGVjdG9yQWxsKCcqJykpIHtcbiAgICAgICAgICAgIGlmICh0aGlzW2VsZW1lbnRDb3VudFN5bV0gPD0gMClcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY29uc3QgdHJpZ2dlcnMgPSB0aGlzW3RyaWdnZXJNYXBTeW1dLmdldChlbGVtZW50KTtcbiAgICAgICAgICAgIGlmICh0cmlnZ2VycyAhPSBudWxsKSB7IHRoaXNbZWxlbWVudENvdW50U3ltXS0tOyB9XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgdHJpZ2dlciBvZiB0cmlnZ2VycyB8fCBbXSlcbiAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodHJpZ2dlciwgb25XTUxUcmlnZ2VyZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpc1t0cmlnZ2VyTWFwU3ltXSA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgIHRoaXNbZWxlbWVudENvdW50U3ltXSA9IDA7XG4gICAgfVxufVxuXG5jb25zdCB0cmlnZ2VyUmVnaXN0cnkgPSBjYW5BYm9ydExpc3RlbmVycygpID8gbmV3IEFib3J0Q29udHJvbGxlclJlZ2lzdHJ5KCkgOiBuZXcgV2Vha01hcFJlZ2lzdHJ5KCk7XG5cbi8qKlxuICogQWRkcyBldmVudCBsaXN0ZW5lcnMgdG8gdGhlIHNwZWNpZmllZCBlbGVtZW50LlxuICovXG5mdW5jdGlvbiBhZGRXTUxMaXN0ZW5lcnMoZWxlbWVudDogRWxlbWVudCk6IHZvaWQge1xuICAgIGNvbnN0IHRyaWdnZXJSZWdFeHAgPSAvXFxTKy9nO1xuICAgIGNvbnN0IHRyaWdnZXJBdHRyID0gKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd3bWwtdHJpZ2dlcicpIHx8IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXdtbC10cmlnZ2VyJykgfHwgXCJjbGlja1wiKTtcbiAgICBjb25zdCB0cmlnZ2Vyczogc3RyaW5nW10gPSBbXTtcblxuICAgIGxldCBtYXRjaDtcbiAgICB3aGlsZSAoKG1hdGNoID0gdHJpZ2dlclJlZ0V4cC5leGVjKHRyaWdnZXJBdHRyKSkgIT09IG51bGwpXG4gICAgICAgIHRyaWdnZXJzLnB1c2gobWF0Y2hbMF0pO1xuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHRyaWdnZXJSZWdpc3RyeS5zZXQoZWxlbWVudCwgdHJpZ2dlcnMpO1xuICAgIGZvciAoY29uc3QgdHJpZ2dlciBvZiB0cmlnZ2VycylcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHRyaWdnZXIsIG9uV01MVHJpZ2dlcmVkLCBvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBTY2hlZHVsZXMgYW4gYXV0b21hdGljIHJlbG9hZCBvZiBXTUwgdG8gYmUgcGVyZm9ybWVkIGFzIHNvb24gYXMgdGhlIGRvY3VtZW50IGlzIGZ1bGx5IGxvYWRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEVuYWJsZSgpOiB2b2lkIHtcbiAgICB3aGVuUmVhZHkoUmVsb2FkKTtcbn1cblxuLyoqXG4gKiBSZWxvYWRzIHRoZSBXTUwgcGFnZSBieSBhZGRpbmcgbmVjZXNzYXJ5IGV2ZW50IGxpc3RlbmVycyBhbmQgYnJvd3NlciBsaXN0ZW5lcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBSZWxvYWQoKTogdm9pZCB7XG4gICAgdHJpZ2dlclJlZ2lzdHJ5LnJlc2V0KCk7XG4gICAgZG9jdW1lbnQuYm9keS5xdWVyeVNlbGVjdG9yQWxsKCdbd21sLWV2ZW50XSwgW3dtbC13aW5kb3ddLCBbd21sLW9wZW51cmxdLCBbZGF0YS13bWwtZXZlbnRdLCBbZGF0YS13bWwtd2luZG93XSwgW2RhdGEtd21sLW9wZW51cmxdJykuZm9yRWFjaChhZGRXTUxMaXN0ZW5lcnMpO1xufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5pbXBvcnQgeyBuZXdSdW50aW1lQ2FsbGVyLCBvYmplY3ROYW1lcyB9IGZyb20gXCIuL3J1bnRpbWUuanNcIjtcblxuY29uc3QgY2FsbCA9IG5ld1J1bnRpbWVDYWxsZXIob2JqZWN0TmFtZXMuQnJvd3Nlcik7XG5cbmNvbnN0IEJyb3dzZXJPcGVuVVJMID0gMDtcblxuLyoqXG4gKiBPcGVuIGEgYnJvd3NlciB3aW5kb3cgdG8gdGhlIGdpdmVuIFVSTC5cbiAqXG4gKiBAcGFyYW0gdXJsIC0gVGhlIFVSTCB0byBvcGVuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBPcGVuVVJMKHVybDogc3RyaW5nIHwgVVJMKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIGNhbGwoQnJvd3Nlck9wZW5VUkwsIHt1cmw6IHVybC50b1N0cmluZygpfSk7XG59XG4iLCAiLy8gU291cmNlOiBodHRwczovL2dpdGh1Yi5jb20vYWkvbmFub2lkXG5cbi8vIFRoZSBNSVQgTGljZW5zZSAoTUlUKVxuLy9cbi8vIENvcHlyaWdodCAyMDE3IEFuZHJleSBTaXRuaWsgPGFuZHJleUBzaXRuaWsucnU+XG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZlxuLy8gdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpblxuLy8gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0b1xuLy8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2Zcbi8vIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbyxcbi8vICAgICBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyAgICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4vLyBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vICAgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTU1xuLy8gRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SXG4vLyBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVJcbi8vIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOXG4vLyBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBUaGlzIGFscGhhYmV0IHVzZXMgYEEtWmEtejAtOV8tYCBzeW1ib2xzLlxuLy8gVGhlIG9yZGVyIG9mIGNoYXJhY3RlcnMgaXMgb3B0aW1pemVkIGZvciBiZXR0ZXIgZ3ppcCBhbmQgYnJvdGxpIGNvbXByZXNzaW9uLlxuLy8gUmVmZXJlbmNlcyB0byB0aGUgc2FtZSBmaWxlICh3b3JrcyBib3RoIGZvciBnemlwIGFuZCBicm90bGkpOlxuLy8gYCd1c2VgLCBgYW5kb21gLCBhbmQgYHJpY3QnYFxuLy8gUmVmZXJlbmNlcyB0byB0aGUgYnJvdGxpIGRlZmF1bHQgZGljdGlvbmFyeTpcbi8vIGAtMjZUYCwgYDE5ODNgLCBgNDBweGAsIGA3NXB4YCwgYGJ1c2hgLCBgamFja2AsIGBtaW5kYCwgYHZlcnlgLCBhbmQgYHdvbGZgXG5jb25zdCB1cmxBbHBoYWJldCA9XG4gICAgJ3VzZWFuZG9tLTI2VDE5ODM0MFBYNzVweEpBQ0tWRVJZTUlOREJVU0hXT0xGX0dRWmJmZ2hqa2xxdnd5enJpY3QnXG5cbmV4cG9ydCBmdW5jdGlvbiBuYW5vaWQoc2l6ZTogbnVtYmVyID0gMjEpOiBzdHJpbmcge1xuICAgIGxldCBpZCA9ICcnXG4gICAgLy8gQSBjb21wYWN0IGFsdGVybmF0aXZlIGZvciBgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGVwOyBpKyspYC5cbiAgICBsZXQgaSA9IHNpemUgfCAwXG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgICAvLyBgfCAwYCBpcyBtb3JlIGNvbXBhY3QgYW5kIGZhc3RlciB0aGFuIGBNYXRoLmZsb29yKClgLlxuICAgICAgICBpZCArPSB1cmxBbHBoYWJldFsoTWF0aC5yYW5kb20oKSAqIDY0KSB8IDBdXG4gICAgfVxuICAgIHJldHVybiBpZFxufVxuIiwgIi8qXG4gXyAgICAgX18gICAgIF8gX19cbnwgfCAgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5pbXBvcnQgeyBuYW5vaWQgfSBmcm9tICcuL25hbm9pZC5qcyc7XG5cbmNvbnN0IHJ1bnRpbWVVUkwgPSB3aW5kb3cubG9jYXRpb24ub3JpZ2luICsgXCIvd2FpbHMvcnVudGltZVwiO1xuXG4vLyBPYmplY3QgTmFtZXNcbmV4cG9ydCBjb25zdCBvYmplY3ROYW1lcyA9IE9iamVjdC5mcmVlemUoe1xuICAgIENhbGw6IDAsXG4gICAgQ2xpcGJvYXJkOiAxLFxuICAgIEFwcGxpY2F0aW9uOiAyLFxuICAgIEV2ZW50czogMyxcbiAgICBDb250ZXh0TWVudTogNCxcbiAgICBEaWFsb2c6IDUsXG4gICAgV2luZG93OiA2LFxuICAgIFNjcmVlbnM6IDcsXG4gICAgU3lzdGVtOiA4LFxuICAgIEJyb3dzZXI6IDksXG4gICAgQ2FuY2VsQ2FsbDogMTAsXG59KTtcbmV4cG9ydCBsZXQgY2xpZW50SWQgPSBuYW5vaWQoKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHJ1bnRpbWUgY2FsbGVyIHdpdGggc3BlY2lmaWVkIElELlxuICpcbiAqIEBwYXJhbSBvYmplY3QgLSBUaGUgb2JqZWN0IHRvIGludm9rZSB0aGUgbWV0aG9kIG9uLlxuICogQHBhcmFtIHdpbmRvd05hbWUgLSBUaGUgbmFtZSBvZiB0aGUgd2luZG93LlxuICogQHJldHVybiBUaGUgbmV3IHJ1bnRpbWUgY2FsbGVyIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbmV3UnVudGltZUNhbGxlcihvYmplY3Q6IG51bWJlciwgd2luZG93TmFtZTogc3RyaW5nID0gJycpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG1ldGhvZDogbnVtYmVyLCBhcmdzOiBhbnkgPSBudWxsKSB7XG4gICAgICAgIHJldHVybiBydW50aW1lQ2FsbFdpdGhJRChvYmplY3QsIG1ldGhvZCwgd2luZG93TmFtZSwgYXJncyk7XG4gICAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVudGltZUNhbGxXaXRoSUQob2JqZWN0SUQ6IG51bWJlciwgbWV0aG9kOiBudW1iZXIsIHdpbmRvd05hbWU6IHN0cmluZywgYXJnczogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICBsZXQgdXJsID0gbmV3IFVSTChydW50aW1lVVJMKTtcbiAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChcIm9iamVjdFwiLCBvYmplY3RJRC50b1N0cmluZygpKTtcbiAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChcIm1ldGhvZFwiLCBtZXRob2QudG9TdHJpbmcoKSk7XG4gICAgaWYgKGFyZ3MpIHsgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoXCJhcmdzXCIsIEpTT04uc3RyaW5naWZ5KGFyZ3MpKTsgfVxuXG4gICAgbGV0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgIFtcIngtd2FpbHMtY2xpZW50LWlkXCJdOiBjbGllbnRJZFxuICAgIH1cbiAgICBpZiAod2luZG93TmFtZSkge1xuICAgICAgICBoZWFkZXJzW1wieC13YWlscy13aW5kb3ctbmFtZVwiXSA9IHdpbmRvd05hbWU7XG4gICAgfVxuXG4gICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7IGhlYWRlcnMgfSk7XG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYXdhaXQgcmVzcG9uc2UudGV4dCgpKTtcbiAgICB9XG5cbiAgICBpZiAoKHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiQ29udGVudC1UeXBlXCIpPy5pbmRleE9mKFwiYXBwbGljYXRpb24vanNvblwiKSA/PyAtMSkgIT09IC0xKSB7XG4gICAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKTtcbiAgICB9XG59XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbmltcG9ydCB7bmV3UnVudGltZUNhbGxlciwgb2JqZWN0TmFtZXN9IGZyb20gXCIuL3J1bnRpbWUuanNcIjtcbmltcG9ydCB7IG5hbm9pZCB9IGZyb20gJy4vbmFub2lkLmpzJztcblxuLy8gc2V0dXBcbndpbmRvdy5fd2FpbHMgPSB3aW5kb3cuX3dhaWxzIHx8IHt9O1xud2luZG93Ll93YWlscy5kaWFsb2dFcnJvckNhbGxiYWNrID0gZGlhbG9nRXJyb3JDYWxsYmFjaztcbndpbmRvdy5fd2FpbHMuZGlhbG9nUmVzdWx0Q2FsbGJhY2sgPSBkaWFsb2dSZXN1bHRDYWxsYmFjaztcblxudHlwZSBQcm9taXNlUmVzb2x2ZXJzID0gT21pdDxQcm9taXNlV2l0aFJlc29sdmVyczxhbnk+LCBcInByb21pc2VcIj47XG5cbmNvbnN0IGNhbGwgPSBuZXdSdW50aW1lQ2FsbGVyKG9iamVjdE5hbWVzLkRpYWxvZyk7XG5jb25zdCBkaWFsb2dSZXNwb25zZXMgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZVJlc29sdmVycz4oKTtcblxuLy8gRGVmaW5lIGNvbnN0YW50cyBmcm9tIHRoZSBgbWV0aG9kc2Agb2JqZWN0IGluIFRpdGxlIENhc2VcbmNvbnN0IERpYWxvZ0luZm8gPSAwO1xuY29uc3QgRGlhbG9nV2FybmluZyA9IDE7XG5jb25zdCBEaWFsb2dFcnJvciA9IDI7XG5jb25zdCBEaWFsb2dRdWVzdGlvbiA9IDM7XG5jb25zdCBEaWFsb2dPcGVuRmlsZSA9IDQ7XG5jb25zdCBEaWFsb2dTYXZlRmlsZSA9IDU7XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3BlbkZpbGVEaWFsb2dPcHRpb25zIHtcbiAgICAvKiogSW5kaWNhdGVzIGlmIGRpcmVjdG9yaWVzIGNhbiBiZSBjaG9zZW4uICovXG4gICAgQ2FuQ2hvb3NlRGlyZWN0b3JpZXM/OiBib29sZWFuO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgZmlsZXMgY2FuIGJlIGNob3Nlbi4gKi9cbiAgICBDYW5DaG9vc2VGaWxlcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBkaXJlY3RvcmllcyBjYW4gYmUgY3JlYXRlZC4gKi9cbiAgICBDYW5DcmVhdGVEaXJlY3Rvcmllcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBoaWRkZW4gZmlsZXMgc2hvdWxkIGJlIHNob3duLiAqL1xuICAgIFNob3dIaWRkZW5GaWxlcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBhbGlhc2VzIHNob3VsZCBiZSByZXNvbHZlZC4gKi9cbiAgICBSZXNvbHZlc0FsaWFzZXM/OiBib29sZWFuO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgbXVsdGlwbGUgc2VsZWN0aW9uIGlzIGFsbG93ZWQuICovXG4gICAgQWxsb3dzTXVsdGlwbGVTZWxlY3Rpb24/OiBib29sZWFuO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgdGhlIGV4dGVuc2lvbiBzaG91bGQgYmUgaGlkZGVuLiAqL1xuICAgIEhpZGVFeHRlbnNpb24/OiBib29sZWFuO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgaGlkZGVuIGV4dGVuc2lvbnMgY2FuIGJlIHNlbGVjdGVkLiAqL1xuICAgIENhblNlbGVjdEhpZGRlbkV4dGVuc2lvbj86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBmaWxlIHBhY2thZ2VzIHNob3VsZCBiZSB0cmVhdGVkIGFzIGRpcmVjdG9yaWVzLiAqL1xuICAgIFRyZWF0c0ZpbGVQYWNrYWdlc0FzRGlyZWN0b3JpZXM/OiBib29sZWFuO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgb3RoZXIgZmlsZSB0eXBlcyBhcmUgYWxsb3dlZC4gKi9cbiAgICBBbGxvd3NPdGhlckZpbGV0eXBlcz86IGJvb2xlYW47XG4gICAgLyoqIEFycmF5IG9mIGZpbGUgZmlsdGVycy4gKi9cbiAgICBGaWx0ZXJzPzogRmlsZUZpbHRlcltdO1xuICAgIC8qKiBUaXRsZSBvZiB0aGUgZGlhbG9nLiAqL1xuICAgIFRpdGxlPzogc3RyaW5nO1xuICAgIC8qKiBNZXNzYWdlIHRvIHNob3cgaW4gdGhlIGRpYWxvZy4gKi9cbiAgICBNZXNzYWdlPzogc3RyaW5nO1xuICAgIC8qKiBUZXh0IHRvIGRpc3BsYXkgb24gdGhlIGJ1dHRvbi4gKi9cbiAgICBCdXR0b25UZXh0Pzogc3RyaW5nO1xuICAgIC8qKiBEaXJlY3RvcnkgdG8gb3BlbiBpbiB0aGUgZGlhbG9nLiAqL1xuICAgIERpcmVjdG9yeT86IHN0cmluZztcbiAgICAvKiogSW5kaWNhdGVzIGlmIHRoZSBkaWFsb2cgc2hvdWxkIGFwcGVhciBkZXRhY2hlZCBmcm9tIHRoZSBtYWluIHdpbmRvdy4gKi9cbiAgICBEZXRhY2hlZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2F2ZUZpbGVEaWFsb2dPcHRpb25zIHtcbiAgICAvKiogRGVmYXVsdCBmaWxlbmFtZSB0byB1c2UgaW4gdGhlIGRpYWxvZy4gKi9cbiAgICBGaWxlbmFtZT86IHN0cmluZztcbiAgICAvKiogSW5kaWNhdGVzIGlmIGRpcmVjdG9yaWVzIGNhbiBiZSBjaG9zZW4uICovXG4gICAgQ2FuQ2hvb3NlRGlyZWN0b3JpZXM/OiBib29sZWFuO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgZmlsZXMgY2FuIGJlIGNob3Nlbi4gKi9cbiAgICBDYW5DaG9vc2VGaWxlcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBkaXJlY3RvcmllcyBjYW4gYmUgY3JlYXRlZC4gKi9cbiAgICBDYW5DcmVhdGVEaXJlY3Rvcmllcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBoaWRkZW4gZmlsZXMgc2hvdWxkIGJlIHNob3duLiAqL1xuICAgIFNob3dIaWRkZW5GaWxlcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBhbGlhc2VzIHNob3VsZCBiZSByZXNvbHZlZC4gKi9cbiAgICBSZXNvbHZlc0FsaWFzZXM/OiBib29sZWFuO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgdGhlIGV4dGVuc2lvbiBzaG91bGQgYmUgaGlkZGVuLiAqL1xuICAgIEhpZGVFeHRlbnNpb24/OiBib29sZWFuO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgaGlkZGVuIGV4dGVuc2lvbnMgY2FuIGJlIHNlbGVjdGVkLiAqL1xuICAgIENhblNlbGVjdEhpZGRlbkV4dGVuc2lvbj86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBmaWxlIHBhY2thZ2VzIHNob3VsZCBiZSB0cmVhdGVkIGFzIGRpcmVjdG9yaWVzLiAqL1xuICAgIFRyZWF0c0ZpbGVQYWNrYWdlc0FzRGlyZWN0b3JpZXM/OiBib29sZWFuO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgb3RoZXIgZmlsZSB0eXBlcyBhcmUgYWxsb3dlZC4gKi9cbiAgICBBbGxvd3NPdGhlckZpbGV0eXBlcz86IGJvb2xlYW47XG4gICAgLyoqIEFycmF5IG9mIGZpbGUgZmlsdGVycy4gKi9cbiAgICBGaWx0ZXJzPzogRmlsZUZpbHRlcltdO1xuICAgIC8qKiBUaXRsZSBvZiB0aGUgZGlhbG9nLiAqL1xuICAgIFRpdGxlPzogc3RyaW5nO1xuICAgIC8qKiBNZXNzYWdlIHRvIHNob3cgaW4gdGhlIGRpYWxvZy4gKi9cbiAgICBNZXNzYWdlPzogc3RyaW5nO1xuICAgIC8qKiBUZXh0IHRvIGRpc3BsYXkgb24gdGhlIGJ1dHRvbi4gKi9cbiAgICBCdXR0b25UZXh0Pzogc3RyaW5nO1xuICAgIC8qKiBEaXJlY3RvcnkgdG8gb3BlbiBpbiB0aGUgZGlhbG9nLiAqL1xuICAgIERpcmVjdG9yeT86IHN0cmluZztcbiAgICAvKiogSW5kaWNhdGVzIGlmIHRoZSBkaWFsb2cgc2hvdWxkIGFwcGVhciBkZXRhY2hlZCBmcm9tIHRoZSBtYWluIHdpbmRvdy4gKi9cbiAgICBEZXRhY2hlZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWVzc2FnZURpYWxvZ09wdGlvbnMge1xuICAgIC8qKiBUaGUgdGl0bGUgb2YgdGhlIGRpYWxvZyB3aW5kb3cuICovXG4gICAgVGl0bGU/OiBzdHJpbmc7XG4gICAgLyoqIFRoZSBtYWluIG1lc3NhZ2UgdG8gc2hvdyBpbiB0aGUgZGlhbG9nLiAqL1xuICAgIE1lc3NhZ2U/OiBzdHJpbmc7XG4gICAgLyoqIEFycmF5IG9mIGJ1dHRvbiBvcHRpb25zIHRvIHNob3cgaW4gdGhlIGRpYWxvZy4gKi9cbiAgICBCdXR0b25zPzogQnV0dG9uW107XG4gICAgLyoqIFRydWUgaWYgdGhlIGRpYWxvZyBzaG91bGQgYXBwZWFyIGRldGFjaGVkIGZyb20gdGhlIG1haW4gd2luZG93IChpZiBhcHBsaWNhYmxlKS4gKi9cbiAgICBEZXRhY2hlZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnV0dG9uIHtcbiAgICAvKiogVGV4dCB0aGF0IGFwcGVhcnMgd2l0aGluIHRoZSBidXR0b24uICovXG4gICAgTGFiZWw/OiBzdHJpbmc7XG4gICAgLyoqIFRydWUgaWYgdGhlIGJ1dHRvbiBzaG91bGQgY2FuY2VsIGFuIG9wZXJhdGlvbiB3aGVuIGNsaWNrZWQuICovXG4gICAgSXNDYW5jZWw/OiBib29sZWFuO1xuICAgIC8qKiBUcnVlIGlmIHRoZSBidXR0b24gc2hvdWxkIGJlIHRoZSBkZWZhdWx0IGFjdGlvbiB3aGVuIHRoZSB1c2VyIHByZXNzZXMgZW50ZXIuICovXG4gICAgSXNEZWZhdWx0PzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWxlRmlsdGVyIHtcbiAgICAvKiogRGlzcGxheSBuYW1lIGZvciB0aGUgZmlsdGVyLCBpdCBjb3VsZCBiZSBcIlRleHQgRmlsZXNcIiwgXCJJbWFnZXNcIiBldGMuICovXG4gICAgRGlzcGxheU5hbWU/OiBzdHJpbmc7XG4gICAgLyoqIFBhdHRlcm4gdG8gbWF0Y2ggZm9yIHRoZSBmaWx0ZXIsIGUuZy4gXCIqLnR4dDsqLm1kXCIgZm9yIHRleHQgbWFya2Rvd24gZmlsZXMuICovXG4gICAgUGF0dGVybj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBIYW5kbGVzIHRoZSByZXN1bHQgb2YgYSBkaWFsb2cgcmVxdWVzdC5cbiAqXG4gKiBAcGFyYW0gaWQgLSBUaGUgaWQgb2YgdGhlIHJlcXVlc3QgdG8gaGFuZGxlIHRoZSByZXN1bHQgZm9yLlxuICogQHBhcmFtIGRhdGEgLSBUaGUgcmVzdWx0IGRhdGEgb2YgdGhlIHJlcXVlc3QuXG4gKiBAcGFyYW0gaXNKU09OIC0gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRhdGEgaXMgSlNPTiBvciBub3QuXG4gKi9cbmZ1bmN0aW9uIGRpYWxvZ1Jlc3VsdENhbGxiYWNrKGlkOiBzdHJpbmcsIGRhdGE6IHN0cmluZywgaXNKU09OOiBib29sZWFuKTogdm9pZCB7XG4gICAgbGV0IHJlc29sdmVycyA9IGdldEFuZERlbGV0ZVJlc3BvbnNlKGlkKTtcbiAgICBpZiAoIXJlc29sdmVycykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGlzSlNPTikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzb2x2ZXJzLnJlc29sdmUoSlNPTi5wYXJzZShkYXRhKSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgICAgICByZXNvbHZlcnMucmVqZWN0KG5ldyBUeXBlRXJyb3IoXCJjb3VsZCBub3QgcGFyc2UgcmVzdWx0OiBcIiArIGVyci5tZXNzYWdlLCB7IGNhdXNlOiBlcnIgfSkpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZXJzLnJlc29sdmUoZGF0YSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEhhbmRsZXMgdGhlIGVycm9yIGZyb20gYSBkaWFsb2cgcmVxdWVzdC5cbiAqXG4gKiBAcGFyYW0gaWQgLSBUaGUgaWQgb2YgdGhlIHByb21pc2UgaGFuZGxlci5cbiAqIEBwYXJhbSBtZXNzYWdlIC0gQW4gZXJyb3IgbWVzc2FnZS5cbiAqL1xuZnVuY3Rpb24gZGlhbG9nRXJyb3JDYWxsYmFjayhpZDogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBnZXRBbmREZWxldGVSZXNwb25zZShpZCk/LnJlamVjdChuZXcgd2luZG93LkVycm9yKG1lc3NhZ2UpKTtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgYW5kIHJlbW92ZXMgdGhlIHJlc3BvbnNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gSUQgZnJvbSB0aGUgZGlhbG9nUmVzcG9uc2VzIG1hcC5cbiAqXG4gKiBAcGFyYW0gaWQgLSBUaGUgSUQgb2YgdGhlIHJlc3BvbnNlIHRvIGJlIHJldHJpZXZlZCBhbmQgcmVtb3ZlZC5cbiAqIEByZXR1cm5zIFRoZSByZXNwb25zZSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBJRCwgaWYgYW55LlxuICovXG5mdW5jdGlvbiBnZXRBbmREZWxldGVSZXNwb25zZShpZDogc3RyaW5nKTogUHJvbWlzZVJlc29sdmVycyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBkaWFsb2dSZXNwb25zZXMuZ2V0KGlkKTtcbiAgICBkaWFsb2dSZXNwb25zZXMuZGVsZXRlKGlkKTtcbiAgICByZXR1cm4gcmVzcG9uc2U7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgdW5pcXVlIElEIHVzaW5nIHRoZSBuYW5vaWQgbGlicmFyeS5cbiAqXG4gKiBAcmV0dXJucyBBIHVuaXF1ZSBJRCB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBkaWFsb2dSZXNwb25zZXMgc2V0LlxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZUlEKCk6IHN0cmluZyB7XG4gICAgbGV0IHJlc3VsdDtcbiAgICBkbyB7XG4gICAgICAgIHJlc3VsdCA9IG5hbm9pZCgpO1xuICAgIH0gd2hpbGUgKGRpYWxvZ1Jlc3BvbnNlcy5oYXMocmVzdWx0KSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBQcmVzZW50cyBhIGRpYWxvZyBvZiBzcGVjaWZpZWQgdHlwZSB3aXRoIHRoZSBnaXZlbiBvcHRpb25zLlxuICpcbiAqIEBwYXJhbSB0eXBlIC0gRGlhbG9nIHR5cGUuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIHRoZSBkaWFsb2cuXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHJlc3VsdCBvZiBkaWFsb2cuXG4gKi9cbmZ1bmN0aW9uIGRpYWxvZyh0eXBlOiBudW1iZXIsIG9wdGlvbnM6IE1lc3NhZ2VEaWFsb2dPcHRpb25zIHwgT3BlbkZpbGVEaWFsb2dPcHRpb25zIHwgU2F2ZUZpbGVEaWFsb2dPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IGlkID0gZ2VuZXJhdGVJRCgpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGRpYWxvZ1Jlc3BvbnNlcy5zZXQoaWQsIHsgcmVzb2x2ZSwgcmVqZWN0IH0pO1xuICAgICAgICBjYWxsKHR5cGUsIE9iamVjdC5hc3NpZ24oeyBcImRpYWxvZy1pZFwiOiBpZCB9LCBvcHRpb25zKSkuY2F0Y2goKGVycjogYW55KSA9PiB7XG4gICAgICAgICAgICBkaWFsb2dSZXNwb25zZXMuZGVsZXRlKGlkKTtcbiAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBQcmVzZW50cyBhbiBpbmZvIGRpYWxvZy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIERpYWxvZyBvcHRpb25zXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBsYWJlbCBvZiB0aGUgY2hvc2VuIGJ1dHRvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEluZm8ob3B0aW9uczogTWVzc2FnZURpYWxvZ09wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4geyByZXR1cm4gZGlhbG9nKERpYWxvZ0luZm8sIG9wdGlvbnMpOyB9XG5cbi8qKlxuICogUHJlc2VudHMgYSB3YXJuaW5nIGRpYWxvZy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIERpYWxvZyBvcHRpb25zLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgbGFiZWwgb2YgdGhlIGNob3NlbiBidXR0b24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBXYXJuaW5nKG9wdGlvbnM6IE1lc3NhZ2VEaWFsb2dPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHsgcmV0dXJuIGRpYWxvZyhEaWFsb2dXYXJuaW5nLCBvcHRpb25zKTsgfVxuXG4vKipcbiAqIFByZXNlbnRzIGFuIGVycm9yIGRpYWxvZy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIERpYWxvZyBvcHRpb25zLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgbGFiZWwgb2YgdGhlIGNob3NlbiBidXR0b24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFcnJvcihvcHRpb25zOiBNZXNzYWdlRGlhbG9nT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7IHJldHVybiBkaWFsb2coRGlhbG9nRXJyb3IsIG9wdGlvbnMpOyB9XG5cbi8qKlxuICogUHJlc2VudHMgYSBxdWVzdGlvbiBkaWFsb2cuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBEaWFsb2cgb3B0aW9ucy5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGxhYmVsIG9mIHRoZSBjaG9zZW4gYnV0dG9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gUXVlc3Rpb24ob3B0aW9uczogTWVzc2FnZURpYWxvZ09wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4geyByZXR1cm4gZGlhbG9nKERpYWxvZ1F1ZXN0aW9uLCBvcHRpb25zKTsgfVxuXG4vKipcbiAqIFByZXNlbnRzIGEgZmlsZSBzZWxlY3Rpb24gZGlhbG9nIHRvIHBpY2sgb25lIG9yIG1vcmUgZmlsZXMgdG8gb3Blbi5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIERpYWxvZyBvcHRpb25zLlxuICogQHJldHVybnMgU2VsZWN0ZWQgZmlsZSBvciBsaXN0IG9mIGZpbGVzLCBvciBhIGJsYW5rIHN0cmluZy9lbXB0eSBsaXN0IGlmIG5vIGZpbGUgaGFzIGJlZW4gc2VsZWN0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBPcGVuRmlsZShvcHRpb25zOiBPcGVuRmlsZURpYWxvZ09wdGlvbnMgJiB7IEFsbG93c011bHRpcGxlU2VsZWN0aW9uOiB0cnVlIH0pOiBQcm9taXNlPHN0cmluZ1tdPjtcbmV4cG9ydCBmdW5jdGlvbiBPcGVuRmlsZShvcHRpb25zOiBPcGVuRmlsZURpYWxvZ09wdGlvbnMgJiB7IEFsbG93c011bHRpcGxlU2VsZWN0aW9uPzogZmFsc2UgfCB1bmRlZmluZWQgfSk6IFByb21pc2U8c3RyaW5nPjtcbmV4cG9ydCBmdW5jdGlvbiBPcGVuRmlsZShvcHRpb25zOiBPcGVuRmlsZURpYWxvZ09wdGlvbnMpOiBQcm9taXNlPHN0cmluZyB8IHN0cmluZ1tdPjtcbmV4cG9ydCBmdW5jdGlvbiBPcGVuRmlsZShvcHRpb25zOiBPcGVuRmlsZURpYWxvZ09wdGlvbnMpOiBQcm9taXNlPHN0cmluZyB8IHN0cmluZ1tdPiB7IHJldHVybiBkaWFsb2coRGlhbG9nT3BlbkZpbGUsIG9wdGlvbnMpID8/IFtdOyB9XG5cbi8qKlxuICogUHJlc2VudHMgYSBmaWxlIHNlbGVjdGlvbiBkaWFsb2cgdG8gcGljayBhIGZpbGUgdG8gc2F2ZS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIERpYWxvZyBvcHRpb25zLlxuICogQHJldHVybnMgU2VsZWN0ZWQgZmlsZSwgb3IgYSBibGFuayBzdHJpbmcgaWYgbm8gZmlsZSBoYXMgYmVlbiBzZWxlY3RlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFNhdmVGaWxlKG9wdGlvbnM6IFNhdmVGaWxlRGlhbG9nT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7IHJldHVybiBkaWFsb2coRGlhbG9nU2F2ZUZpbGUsIG9wdGlvbnMpOyB9XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbmltcG9ydCB7IG5ld1J1bnRpbWVDYWxsZXIsIG9iamVjdE5hbWVzIH0gZnJvbSBcIi4vcnVudGltZS5qc1wiO1xuaW1wb3J0IHsgZXZlbnRMaXN0ZW5lcnMsIExpc3RlbmVyLCBsaXN0ZW5lck9mZiB9IGZyb20gXCIuL2xpc3RlbmVyLmpzXCI7XG5cbi8vIFNldHVwXG53aW5kb3cuX3dhaWxzID0gd2luZG93Ll93YWlscyB8fCB7fTtcbndpbmRvdy5fd2FpbHMuZGlzcGF0Y2hXYWlsc0V2ZW50ID0gZGlzcGF0Y2hXYWlsc0V2ZW50O1xuXG5jb25zdCBjYWxsID0gbmV3UnVudGltZUNhbGxlcihvYmplY3ROYW1lcy5FdmVudHMpO1xuY29uc3QgRW1pdE1ldGhvZCA9IDA7XG5cbmV4cG9ydCB7IFR5cGVzIH0gZnJvbSBcIi4vZXZlbnRfdHlwZXMuanNcIjtcblxuLyoqXG4gKiBUaGUgdHlwZSBvZiBoYW5kbGVycyBmb3IgYSBnaXZlbiBldmVudC5cbiAqL1xuZXhwb3J0IHR5cGUgQ2FsbGJhY2sgPSAoZXY6IFdhaWxzRXZlbnQpID0+IHZvaWQ7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHN5c3RlbSBldmVudCBvciBhIGN1c3RvbSBldmVudCBlbWl0dGVkIHRocm91Z2ggd2FpbHMtcHJvdmlkZWQgZmFjaWxpdGllcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFdhaWxzRXZlbnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBPcHRpb25hbCBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW1pdHRlZCBldmVudC5cbiAgICAgKi9cbiAgICBkYXRhOiBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBOYW1lIG9mIHRoZSBvcmlnaW5hdGluZyB3aW5kb3cuIE9taXR0ZWQgZm9yIGFwcGxpY2F0aW9uIGV2ZW50cy5cbiAgICAgKiBXaWxsIGJlIG92ZXJyaWRkZW4gaWYgc2V0IG1hbnVhbGx5LlxuICAgICAqL1xuICAgIHNlbmRlcj86IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgZGF0YTogYW55ID0gbnVsbCkge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hXYWlsc0V2ZW50KGV2ZW50OiBhbnkpIHtcbiAgICBsZXQgbGlzdGVuZXJzID0gZXZlbnRMaXN0ZW5lcnMuZ2V0KGV2ZW50Lm5hbWUpO1xuICAgIGlmICghbGlzdGVuZXJzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgd2FpbHNFdmVudCA9IG5ldyBXYWlsc0V2ZW50KGV2ZW50Lm5hbWUsIGV2ZW50LmRhdGEpO1xuICAgIGlmICgnc2VuZGVyJyBpbiBldmVudCkge1xuICAgICAgICB3YWlsc0V2ZW50LnNlbmRlciA9IGV2ZW50LnNlbmRlcjtcbiAgICB9XG5cbiAgICBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuZmlsdGVyKGxpc3RlbmVyID0+ICFsaXN0ZW5lci5kaXNwYXRjaCh3YWlsc0V2ZW50KSk7XG4gICAgaWYgKGxpc3RlbmVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZXZlbnRMaXN0ZW5lcnMuZGVsZXRlKGV2ZW50Lm5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGV2ZW50TGlzdGVuZXJzLnNldChldmVudC5uYW1lLCBsaXN0ZW5lcnMpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZWdpc3RlciBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBmb3IgYSBzcGVjaWZpYyBldmVudC5cbiAqXG4gKiBAcGFyYW0gZXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIHJlZ2lzdGVyIHRoZSBjYWxsYmFjayBmb3IuXG4gKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC5cbiAqIEBwYXJhbSBtYXhDYWxsYmFja3MgLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGltZXMgdGhlIGNhbGxiYWNrIGNhbiBiZSBjYWxsZWQgZm9yIHRoZSBldmVudC4gT25jZSB0aGUgbWF4aW11bSBudW1iZXIgaXMgcmVhY2hlZCwgdGhlIGNhbGxiYWNrIHdpbGwgbm8gbG9uZ2VyIGJlIGNhbGxlZC5cbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCwgd2hlbiBjYWxsZWQsIHdpbGwgdW5yZWdpc3RlciB0aGUgY2FsbGJhY2sgZnJvbSB0aGUgZXZlbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBPbk11bHRpcGxlKGV2ZW50TmFtZTogc3RyaW5nLCBjYWxsYmFjazogQ2FsbGJhY2ssIG1heENhbGxiYWNrczogbnVtYmVyKSB7XG4gICAgbGV0IGxpc3RlbmVycyA9IGV2ZW50TGlzdGVuZXJzLmdldChldmVudE5hbWUpIHx8IFtdO1xuICAgIGNvbnN0IHRoaXNMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcihldmVudE5hbWUsIGNhbGxiYWNrLCBtYXhDYWxsYmFja3MpO1xuICAgIGxpc3RlbmVycy5wdXNoKHRoaXNMaXN0ZW5lcik7XG4gICAgZXZlbnRMaXN0ZW5lcnMuc2V0KGV2ZW50TmFtZSwgbGlzdGVuZXJzKTtcbiAgICByZXR1cm4gKCkgPT4gbGlzdGVuZXJPZmYodGhpc0xpc3RlbmVyKTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCB3aGVuIHRoZSBzcGVjaWZpZWQgZXZlbnQgb2NjdXJzLlxuICpcbiAqIEBwYXJhbSBldmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gcmVnaXN0ZXIgdGhlIGNhbGxiYWNrIGZvci5cbiAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0LCB3aGVuIGNhbGxlZCwgd2lsbCB1bnJlZ2lzdGVyIHRoZSBjYWxsYmFjayBmcm9tIHRoZSBldmVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE9uKGV2ZW50TmFtZTogc3RyaW5nLCBjYWxsYmFjazogQ2FsbGJhY2spOiAoKSA9PiB2b2lkIHtcbiAgICByZXR1cm4gT25NdWx0aXBsZShldmVudE5hbWUsIGNhbGxiYWNrLCAtMSk7XG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgb25seSBvbmNlIGZvciB0aGUgc3BlY2lmaWVkIGV2ZW50LlxuICpcbiAqIEBwYXJhbSBldmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gcmVnaXN0ZXIgdGhlIGNhbGxiYWNrIGZvci5cbiAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0LCB3aGVuIGNhbGxlZCwgd2lsbCB1bnJlZ2lzdGVyIHRoZSBjYWxsYmFjayBmcm9tIHRoZSBldmVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE9uY2UoZXZlbnROYW1lOiBzdHJpbmcsIGNhbGxiYWNrOiBDYWxsYmFjayk6ICgpID0+IHZvaWQge1xuICAgIHJldHVybiBPbk11bHRpcGxlKGV2ZW50TmFtZSwgY2FsbGJhY2ssIDEpO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgZXZlbnQgbGlzdGVuZXJzIGZvciB0aGUgc3BlY2lmaWVkIGV2ZW50IG5hbWVzLlxuICpcbiAqIEBwYXJhbSBldmVudE5hbWVzIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50cyB0byByZW1vdmUgbGlzdGVuZXJzIGZvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE9mZiguLi5ldmVudE5hbWVzOiBbc3RyaW5nLCAuLi5zdHJpbmdbXV0pOiB2b2lkIHtcbiAgICBldmVudE5hbWVzLmZvckVhY2goZXZlbnROYW1lID0+IGV2ZW50TGlzdGVuZXJzLmRlbGV0ZShldmVudE5hbWUpKTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIGFsbCBldmVudCBsaXN0ZW5lcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBPZmZBbGwoKTogdm9pZCB7XG4gICAgZXZlbnRMaXN0ZW5lcnMuY2xlYXIoKTtcbn1cblxuLyoqXG4gKiBFbWl0cyB0aGUgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIGV2ZW50IC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIGVtaXQuXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCB3aWxsIGJlIGZ1bGZpbGxlZCBvbmNlIHRoZSBldmVudCBoYXMgYmVlbiBlbWl0dGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gRW1pdChldmVudDogV2FpbHNFdmVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBjYWxsKEVtaXRNZXRob2QsIGV2ZW50KTtcbn1cbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuLy8gVGhlIGZvbGxvd2luZyB1dGlsaXRpZXMgaGF2ZSBiZWVuIGZhY3RvcmVkIG91dCBvZiAuL2V2ZW50cy50c1xuLy8gZm9yIHRlc3RpbmcgcHVycG9zZXMuXG5cbmV4cG9ydCBjb25zdCBldmVudExpc3RlbmVycyA9IG5ldyBNYXA8c3RyaW5nLCBMaXN0ZW5lcltdPigpO1xuXG5leHBvcnQgY2xhc3MgTGlzdGVuZXIge1xuICAgIGV2ZW50TmFtZTogc3RyaW5nO1xuICAgIGNhbGxiYWNrOiAoZGF0YTogYW55KSA9PiB2b2lkO1xuICAgIG1heENhbGxiYWNrczogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IoZXZlbnROYW1lOiBzdHJpbmcsIGNhbGxiYWNrOiAoZGF0YTogYW55KSA9PiB2b2lkLCBtYXhDYWxsYmFja3M6IG51bWJlcikge1xuICAgICAgICB0aGlzLmV2ZW50TmFtZSA9IGV2ZW50TmFtZTtcbiAgICAgICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgICB0aGlzLm1heENhbGxiYWNrcyA9IG1heENhbGxiYWNrcyB8fCAtMTtcbiAgICB9XG5cbiAgICBkaXNwYXRjaChkYXRhOiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuY2FsbGJhY2soZGF0YSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubWF4Q2FsbGJhY2tzID09PSAtMSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLm1heENhbGxiYWNrcyAtPSAxO1xuICAgICAgICByZXR1cm4gdGhpcy5tYXhDYWxsYmFja3MgPT09IDA7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbGlzdGVuZXJPZmYobGlzdGVuZXI6IExpc3RlbmVyKTogdm9pZCB7XG4gICAgbGV0IGxpc3RlbmVycyA9IGV2ZW50TGlzdGVuZXJzLmdldChsaXN0ZW5lci5ldmVudE5hbWUpO1xuICAgIGlmICghbGlzdGVuZXJzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuZmlsdGVyKGwgPT4gbCAhPT0gbGlzdGVuZXIpO1xuICAgIGlmIChsaXN0ZW5lcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGV2ZW50TGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lci5ldmVudE5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGV2ZW50TGlzdGVuZXJzLnNldChsaXN0ZW5lci5ldmVudE5hbWUsIGxpc3RlbmVycyk7XG4gICAgfVxufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vLyBDeW5oeXJjaHd5ZCB5IGZmZWlsIGhvbiB5biBhd3RvbWF0aWcuIFBFSURJV0NIIFx1MDBDMiBNT0RJV0xcbi8vIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZC4gRE8gTk9UIEVESVRcblxuZXhwb3J0IGNvbnN0IFR5cGVzID0gT2JqZWN0LmZyZWV6ZSh7XG5cdFdpbmRvd3M6IE9iamVjdC5mcmVlemUoe1xuXHRcdEFQTVBvd2VyU2V0dGluZ0NoYW5nZTogXCJ3aW5kb3dzOkFQTVBvd2VyU2V0dGluZ0NoYW5nZVwiLFxuXHRcdEFQTVBvd2VyU3RhdHVzQ2hhbmdlOiBcIndpbmRvd3M6QVBNUG93ZXJTdGF0dXNDaGFuZ2VcIixcblx0XHRBUE1SZXN1bWVBdXRvbWF0aWM6IFwid2luZG93czpBUE1SZXN1bWVBdXRvbWF0aWNcIixcblx0XHRBUE1SZXN1bWVTdXNwZW5kOiBcIndpbmRvd3M6QVBNUmVzdW1lU3VzcGVuZFwiLFxuXHRcdEFQTVN1c3BlbmQ6IFwid2luZG93czpBUE1TdXNwZW5kXCIsXG5cdFx0QXBwbGljYXRpb25TdGFydGVkOiBcIndpbmRvd3M6QXBwbGljYXRpb25TdGFydGVkXCIsXG5cdFx0U3lzdGVtVGhlbWVDaGFuZ2VkOiBcIndpbmRvd3M6U3lzdGVtVGhlbWVDaGFuZ2VkXCIsXG5cdFx0V2ViVmlld05hdmlnYXRpb25Db21wbGV0ZWQ6IFwid2luZG93czpXZWJWaWV3TmF2aWdhdGlvbkNvbXBsZXRlZFwiLFxuXHRcdFdpbmRvd0FjdGl2ZTogXCJ3aW5kb3dzOldpbmRvd0FjdGl2ZVwiLFxuXHRcdFdpbmRvd0JhY2tncm91bmRFcmFzZTogXCJ3aW5kb3dzOldpbmRvd0JhY2tncm91bmRFcmFzZVwiLFxuXHRcdFdpbmRvd0NsaWNrQWN0aXZlOiBcIndpbmRvd3M6V2luZG93Q2xpY2tBY3RpdmVcIixcblx0XHRXaW5kb3dDbG9zaW5nOiBcIndpbmRvd3M6V2luZG93Q2xvc2luZ1wiLFxuXHRcdFdpbmRvd0RpZE1vdmU6IFwid2luZG93czpXaW5kb3dEaWRNb3ZlXCIsXG5cdFx0V2luZG93RGlkUmVzaXplOiBcIndpbmRvd3M6V2luZG93RGlkUmVzaXplXCIsXG5cdFx0V2luZG93RFBJQ2hhbmdlZDogXCJ3aW5kb3dzOldpbmRvd0RQSUNoYW5nZWRcIixcblx0XHRXaW5kb3dEcmFnRHJvcDogXCJ3aW5kb3dzOldpbmRvd0RyYWdEcm9wXCIsXG5cdFx0V2luZG93RHJhZ0VudGVyOiBcIndpbmRvd3M6V2luZG93RHJhZ0VudGVyXCIsXG5cdFx0V2luZG93RHJhZ0xlYXZlOiBcIndpbmRvd3M6V2luZG93RHJhZ0xlYXZlXCIsXG5cdFx0V2luZG93RHJhZ092ZXI6IFwid2luZG93czpXaW5kb3dEcmFnT3ZlclwiLFxuXHRcdFdpbmRvd0VuZE1vdmU6IFwid2luZG93czpXaW5kb3dFbmRNb3ZlXCIsXG5cdFx0V2luZG93RW5kUmVzaXplOiBcIndpbmRvd3M6V2luZG93RW5kUmVzaXplXCIsXG5cdFx0V2luZG93RnVsbHNjcmVlbjogXCJ3aW5kb3dzOldpbmRvd0Z1bGxzY3JlZW5cIixcblx0XHRXaW5kb3dIaWRlOiBcIndpbmRvd3M6V2luZG93SGlkZVwiLFxuXHRcdFdpbmRvd0luYWN0aXZlOiBcIndpbmRvd3M6V2luZG93SW5hY3RpdmVcIixcblx0XHRXaW5kb3dLZXlEb3duOiBcIndpbmRvd3M6V2luZG93S2V5RG93blwiLFxuXHRcdFdpbmRvd0tleVVwOiBcIndpbmRvd3M6V2luZG93S2V5VXBcIixcblx0XHRXaW5kb3dLaWxsRm9jdXM6IFwid2luZG93czpXaW5kb3dLaWxsRm9jdXNcIixcblx0XHRXaW5kb3dOb25DbGllbnRIaXQ6IFwid2luZG93czpXaW5kb3dOb25DbGllbnRIaXRcIixcblx0XHRXaW5kb3dOb25DbGllbnRNb3VzZURvd246IFwid2luZG93czpXaW5kb3dOb25DbGllbnRNb3VzZURvd25cIixcblx0XHRXaW5kb3dOb25DbGllbnRNb3VzZUxlYXZlOiBcIndpbmRvd3M6V2luZG93Tm9uQ2xpZW50TW91c2VMZWF2ZVwiLFxuXHRcdFdpbmRvd05vbkNsaWVudE1vdXNlTW92ZTogXCJ3aW5kb3dzOldpbmRvd05vbkNsaWVudE1vdXNlTW92ZVwiLFxuXHRcdFdpbmRvd05vbkNsaWVudE1vdXNlVXA6IFwid2luZG93czpXaW5kb3dOb25DbGllbnRNb3VzZVVwXCIsXG5cdFx0V2luZG93UGFpbnQ6IFwid2luZG93czpXaW5kb3dQYWludFwiLFxuXHRcdFdpbmRvd1Jlc3RvcmU6IFwid2luZG93czpXaW5kb3dSZXN0b3JlXCIsXG5cdFx0V2luZG93U2V0Rm9jdXM6IFwid2luZG93czpXaW5kb3dTZXRGb2N1c1wiLFxuXHRcdFdpbmRvd1Nob3c6IFwid2luZG93czpXaW5kb3dTaG93XCIsXG5cdFx0V2luZG93U3RhcnRNb3ZlOiBcIndpbmRvd3M6V2luZG93U3RhcnRNb3ZlXCIsXG5cdFx0V2luZG93U3RhcnRSZXNpemU6IFwid2luZG93czpXaW5kb3dTdGFydFJlc2l6ZVwiLFxuXHRcdFdpbmRvd1VuRnVsbHNjcmVlbjogXCJ3aW5kb3dzOldpbmRvd1VuRnVsbHNjcmVlblwiLFxuXHRcdFdpbmRvd1pPcmRlckNoYW5nZWQ6IFwid2luZG93czpXaW5kb3daT3JkZXJDaGFuZ2VkXCIsXG5cdFx0V2luZG93TWluaW1pc2U6IFwid2luZG93czpXaW5kb3dNaW5pbWlzZVwiLFxuXHRcdFdpbmRvd1VuTWluaW1pc2U6IFwid2luZG93czpXaW5kb3dVbk1pbmltaXNlXCIsXG5cdFx0V2luZG93TWF4aW1pc2U6IFwid2luZG93czpXaW5kb3dNYXhpbWlzZVwiLFxuXHRcdFdpbmRvd1VuTWF4aW1pc2U6IFwid2luZG93czpXaW5kb3dVbk1heGltaXNlXCIsXG5cdH0pLFxuXHRNYWM6IE9iamVjdC5mcmVlemUoe1xuXHRcdEFwcGxpY2F0aW9uRGlkQmVjb21lQWN0aXZlOiBcIm1hYzpBcHBsaWNhdGlvbkRpZEJlY29tZUFjdGl2ZVwiLFxuXHRcdEFwcGxpY2F0aW9uRGlkQ2hhbmdlQmFja2luZ1Byb3BlcnRpZXM6IFwibWFjOkFwcGxpY2F0aW9uRGlkQ2hhbmdlQmFja2luZ1Byb3BlcnRpZXNcIixcblx0XHRBcHBsaWNhdGlvbkRpZENoYW5nZUVmZmVjdGl2ZUFwcGVhcmFuY2U6IFwibWFjOkFwcGxpY2F0aW9uRGlkQ2hhbmdlRWZmZWN0aXZlQXBwZWFyYW5jZVwiLFxuXHRcdEFwcGxpY2F0aW9uRGlkQ2hhbmdlSWNvbjogXCJtYWM6QXBwbGljYXRpb25EaWRDaGFuZ2VJY29uXCIsXG5cdFx0QXBwbGljYXRpb25EaWRDaGFuZ2VPY2NsdXNpb25TdGF0ZTogXCJtYWM6QXBwbGljYXRpb25EaWRDaGFuZ2VPY2NsdXNpb25TdGF0ZVwiLFxuXHRcdEFwcGxpY2F0aW9uRGlkQ2hhbmdlU2NyZWVuUGFyYW1ldGVyczogXCJtYWM6QXBwbGljYXRpb25EaWRDaGFuZ2VTY3JlZW5QYXJhbWV0ZXJzXCIsXG5cdFx0QXBwbGljYXRpb25EaWRDaGFuZ2VTdGF0dXNCYXJGcmFtZTogXCJtYWM6QXBwbGljYXRpb25EaWRDaGFuZ2VTdGF0dXNCYXJGcmFtZVwiLFxuXHRcdEFwcGxpY2F0aW9uRGlkQ2hhbmdlU3RhdHVzQmFyT3JpZW50YXRpb246IFwibWFjOkFwcGxpY2F0aW9uRGlkQ2hhbmdlU3RhdHVzQmFyT3JpZW50YXRpb25cIixcblx0XHRBcHBsaWNhdGlvbkRpZENoYW5nZVRoZW1lOiBcIm1hYzpBcHBsaWNhdGlvbkRpZENoYW5nZVRoZW1lXCIsXG5cdFx0QXBwbGljYXRpb25EaWRGaW5pc2hMYXVuY2hpbmc6IFwibWFjOkFwcGxpY2F0aW9uRGlkRmluaXNoTGF1bmNoaW5nXCIsXG5cdFx0QXBwbGljYXRpb25EaWRIaWRlOiBcIm1hYzpBcHBsaWNhdGlvbkRpZEhpZGVcIixcblx0XHRBcHBsaWNhdGlvbkRpZFJlc2lnbkFjdGl2ZTogXCJtYWM6QXBwbGljYXRpb25EaWRSZXNpZ25BY3RpdmVcIixcblx0XHRBcHBsaWNhdGlvbkRpZFVuaGlkZTogXCJtYWM6QXBwbGljYXRpb25EaWRVbmhpZGVcIixcblx0XHRBcHBsaWNhdGlvbkRpZFVwZGF0ZTogXCJtYWM6QXBwbGljYXRpb25EaWRVcGRhdGVcIixcblx0XHRBcHBsaWNhdGlvblNob3VsZEhhbmRsZVJlb3BlbjogXCJtYWM6QXBwbGljYXRpb25TaG91bGRIYW5kbGVSZW9wZW5cIixcblx0XHRBcHBsaWNhdGlvbldpbGxCZWNvbWVBY3RpdmU6IFwibWFjOkFwcGxpY2F0aW9uV2lsbEJlY29tZUFjdGl2ZVwiLFxuXHRcdEFwcGxpY2F0aW9uV2lsbEZpbmlzaExhdW5jaGluZzogXCJtYWM6QXBwbGljYXRpb25XaWxsRmluaXNoTGF1bmNoaW5nXCIsXG5cdFx0QXBwbGljYXRpb25XaWxsSGlkZTogXCJtYWM6QXBwbGljYXRpb25XaWxsSGlkZVwiLFxuXHRcdEFwcGxpY2F0aW9uV2lsbFJlc2lnbkFjdGl2ZTogXCJtYWM6QXBwbGljYXRpb25XaWxsUmVzaWduQWN0aXZlXCIsXG5cdFx0QXBwbGljYXRpb25XaWxsVGVybWluYXRlOiBcIm1hYzpBcHBsaWNhdGlvbldpbGxUZXJtaW5hdGVcIixcblx0XHRBcHBsaWNhdGlvbldpbGxVbmhpZGU6IFwibWFjOkFwcGxpY2F0aW9uV2lsbFVuaGlkZVwiLFxuXHRcdEFwcGxpY2F0aW9uV2lsbFVwZGF0ZTogXCJtYWM6QXBwbGljYXRpb25XaWxsVXBkYXRlXCIsXG5cdFx0TWVudURpZEFkZEl0ZW06IFwibWFjOk1lbnVEaWRBZGRJdGVtXCIsXG5cdFx0TWVudURpZEJlZ2luVHJhY2tpbmc6IFwibWFjOk1lbnVEaWRCZWdpblRyYWNraW5nXCIsXG5cdFx0TWVudURpZENsb3NlOiBcIm1hYzpNZW51RGlkQ2xvc2VcIixcblx0XHRNZW51RGlkRGlzcGxheUl0ZW06IFwibWFjOk1lbnVEaWREaXNwbGF5SXRlbVwiLFxuXHRcdE1lbnVEaWRFbmRUcmFja2luZzogXCJtYWM6TWVudURpZEVuZFRyYWNraW5nXCIsXG5cdFx0TWVudURpZEhpZ2hsaWdodEl0ZW06IFwibWFjOk1lbnVEaWRIaWdobGlnaHRJdGVtXCIsXG5cdFx0TWVudURpZE9wZW46IFwibWFjOk1lbnVEaWRPcGVuXCIsXG5cdFx0TWVudURpZFBvcFVwOiBcIm1hYzpNZW51RGlkUG9wVXBcIixcblx0XHRNZW51RGlkUmVtb3ZlSXRlbTogXCJtYWM6TWVudURpZFJlbW92ZUl0ZW1cIixcblx0XHRNZW51RGlkU2VuZEFjdGlvbjogXCJtYWM6TWVudURpZFNlbmRBY3Rpb25cIixcblx0XHRNZW51RGlkU2VuZEFjdGlvblRvSXRlbTogXCJtYWM6TWVudURpZFNlbmRBY3Rpb25Ub0l0ZW1cIixcblx0XHRNZW51RGlkVXBkYXRlOiBcIm1hYzpNZW51RGlkVXBkYXRlXCIsXG5cdFx0TWVudVdpbGxBZGRJdGVtOiBcIm1hYzpNZW51V2lsbEFkZEl0ZW1cIixcblx0XHRNZW51V2lsbEJlZ2luVHJhY2tpbmc6IFwibWFjOk1lbnVXaWxsQmVnaW5UcmFja2luZ1wiLFxuXHRcdE1lbnVXaWxsRGlzcGxheUl0ZW06IFwibWFjOk1lbnVXaWxsRGlzcGxheUl0ZW1cIixcblx0XHRNZW51V2lsbEVuZFRyYWNraW5nOiBcIm1hYzpNZW51V2lsbEVuZFRyYWNraW5nXCIsXG5cdFx0TWVudVdpbGxIaWdobGlnaHRJdGVtOiBcIm1hYzpNZW51V2lsbEhpZ2hsaWdodEl0ZW1cIixcblx0XHRNZW51V2lsbE9wZW46IFwibWFjOk1lbnVXaWxsT3BlblwiLFxuXHRcdE1lbnVXaWxsUG9wVXA6IFwibWFjOk1lbnVXaWxsUG9wVXBcIixcblx0XHRNZW51V2lsbFJlbW92ZUl0ZW06IFwibWFjOk1lbnVXaWxsUmVtb3ZlSXRlbVwiLFxuXHRcdE1lbnVXaWxsU2VuZEFjdGlvbjogXCJtYWM6TWVudVdpbGxTZW5kQWN0aW9uXCIsXG5cdFx0TWVudVdpbGxTZW5kQWN0aW9uVG9JdGVtOiBcIm1hYzpNZW51V2lsbFNlbmRBY3Rpb25Ub0l0ZW1cIixcblx0XHRNZW51V2lsbFVwZGF0ZTogXCJtYWM6TWVudVdpbGxVcGRhdGVcIixcblx0XHRXZWJWaWV3RGlkQ29tbWl0TmF2aWdhdGlvbjogXCJtYWM6V2ViVmlld0RpZENvbW1pdE5hdmlnYXRpb25cIixcblx0XHRXZWJWaWV3RGlkRmluaXNoTmF2aWdhdGlvbjogXCJtYWM6V2ViVmlld0RpZEZpbmlzaE5hdmlnYXRpb25cIixcblx0XHRXZWJWaWV3RGlkUmVjZWl2ZVNlcnZlclJlZGlyZWN0Rm9yUHJvdmlzaW9uYWxOYXZpZ2F0aW9uOiBcIm1hYzpXZWJWaWV3RGlkUmVjZWl2ZVNlcnZlclJlZGlyZWN0Rm9yUHJvdmlzaW9uYWxOYXZpZ2F0aW9uXCIsXG5cdFx0V2ViVmlld0RpZFN0YXJ0UHJvdmlzaW9uYWxOYXZpZ2F0aW9uOiBcIm1hYzpXZWJWaWV3RGlkU3RhcnRQcm92aXNpb25hbE5hdmlnYXRpb25cIixcblx0XHRXaW5kb3dEaWRCZWNvbWVLZXk6IFwibWFjOldpbmRvd0RpZEJlY29tZUtleVwiLFxuXHRcdFdpbmRvd0RpZEJlY29tZU1haW46IFwibWFjOldpbmRvd0RpZEJlY29tZU1haW5cIixcblx0XHRXaW5kb3dEaWRCZWdpblNoZWV0OiBcIm1hYzpXaW5kb3dEaWRCZWdpblNoZWV0XCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlQWxwaGE6IFwibWFjOldpbmRvd0RpZENoYW5nZUFscGhhXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlQmFja2luZ0xvY2F0aW9uOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VCYWNraW5nTG9jYXRpb25cIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VCYWNraW5nUHJvcGVydGllczogXCJtYWM6V2luZG93RGlkQ2hhbmdlQmFja2luZ1Byb3BlcnRpZXNcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VDb2xsZWN0aW9uQmVoYXZpb3I6IFwibWFjOldpbmRvd0RpZENoYW5nZUNvbGxlY3Rpb25CZWhhdmlvclwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZUVmZmVjdGl2ZUFwcGVhcmFuY2U6IFwibWFjOldpbmRvd0RpZENoYW5nZUVmZmVjdGl2ZUFwcGVhcmFuY2VcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VPY2NsdXNpb25TdGF0ZTogXCJtYWM6V2luZG93RGlkQ2hhbmdlT2NjbHVzaW9uU3RhdGVcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VPcmRlcmluZ01vZGU6IFwibWFjOldpbmRvd0RpZENoYW5nZU9yZGVyaW5nTW9kZVwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZVNjcmVlbjogXCJtYWM6V2luZG93RGlkQ2hhbmdlU2NyZWVuXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlU2NyZWVuUGFyYW1ldGVyczogXCJtYWM6V2luZG93RGlkQ2hhbmdlU2NyZWVuUGFyYW1ldGVyc1wiLFxuXHRcdFdpbmRvd0RpZENoYW5nZVNjcmVlblByb2ZpbGU6IFwibWFjOldpbmRvd0RpZENoYW5nZVNjcmVlblByb2ZpbGVcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VTY3JlZW5TcGFjZTogXCJtYWM6V2luZG93RGlkQ2hhbmdlU2NyZWVuU3BhY2VcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VTY3JlZW5TcGFjZVByb3BlcnRpZXM6IFwibWFjOldpbmRvd0RpZENoYW5nZVNjcmVlblNwYWNlUHJvcGVydGllc1wiLFxuXHRcdFdpbmRvd0RpZENoYW5nZVNoYXJpbmdUeXBlOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VTaGFyaW5nVHlwZVwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZVNwYWNlOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VTcGFjZVwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZVNwYWNlT3JkZXJpbmdNb2RlOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VTcGFjZU9yZGVyaW5nTW9kZVwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZVRpdGxlOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VUaXRsZVwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZVRvb2xiYXI6IFwibWFjOldpbmRvd0RpZENoYW5nZVRvb2xiYXJcIixcblx0XHRXaW5kb3dEaWREZW1pbmlhdHVyaXplOiBcIm1hYzpXaW5kb3dEaWREZW1pbmlhdHVyaXplXCIsXG5cdFx0V2luZG93RGlkRW5kU2hlZXQ6IFwibWFjOldpbmRvd0RpZEVuZFNoZWV0XCIsXG5cdFx0V2luZG93RGlkRW50ZXJGdWxsU2NyZWVuOiBcIm1hYzpXaW5kb3dEaWRFbnRlckZ1bGxTY3JlZW5cIixcblx0XHRXaW5kb3dEaWRFbnRlclZlcnNpb25Ccm93c2VyOiBcIm1hYzpXaW5kb3dEaWRFbnRlclZlcnNpb25Ccm93c2VyXCIsXG5cdFx0V2luZG93RGlkRXhpdEZ1bGxTY3JlZW46IFwibWFjOldpbmRvd0RpZEV4aXRGdWxsU2NyZWVuXCIsXG5cdFx0V2luZG93RGlkRXhpdFZlcnNpb25Ccm93c2VyOiBcIm1hYzpXaW5kb3dEaWRFeGl0VmVyc2lvbkJyb3dzZXJcIixcblx0XHRXaW5kb3dEaWRFeHBvc2U6IFwibWFjOldpbmRvd0RpZEV4cG9zZVwiLFxuXHRcdFdpbmRvd0RpZEZvY3VzOiBcIm1hYzpXaW5kb3dEaWRGb2N1c1wiLFxuXHRcdFdpbmRvd0RpZE1pbmlhdHVyaXplOiBcIm1hYzpXaW5kb3dEaWRNaW5pYXR1cml6ZVwiLFxuXHRcdFdpbmRvd0RpZE1vdmU6IFwibWFjOldpbmRvd0RpZE1vdmVcIixcblx0XHRXaW5kb3dEaWRPcmRlck9mZlNjcmVlbjogXCJtYWM6V2luZG93RGlkT3JkZXJPZmZTY3JlZW5cIixcblx0XHRXaW5kb3dEaWRPcmRlck9uU2NyZWVuOiBcIm1hYzpXaW5kb3dEaWRPcmRlck9uU2NyZWVuXCIsXG5cdFx0V2luZG93RGlkUmVzaWduS2V5OiBcIm1hYzpXaW5kb3dEaWRSZXNpZ25LZXlcIixcblx0XHRXaW5kb3dEaWRSZXNpZ25NYWluOiBcIm1hYzpXaW5kb3dEaWRSZXNpZ25NYWluXCIsXG5cdFx0V2luZG93RGlkUmVzaXplOiBcIm1hYzpXaW5kb3dEaWRSZXNpemVcIixcblx0XHRXaW5kb3dEaWRVcGRhdGU6IFwibWFjOldpbmRvd0RpZFVwZGF0ZVwiLFxuXHRcdFdpbmRvd0RpZFVwZGF0ZUFscGhhOiBcIm1hYzpXaW5kb3dEaWRVcGRhdGVBbHBoYVwiLFxuXHRcdFdpbmRvd0RpZFVwZGF0ZUNvbGxlY3Rpb25CZWhhdmlvcjogXCJtYWM6V2luZG93RGlkVXBkYXRlQ29sbGVjdGlvbkJlaGF2aW9yXCIsXG5cdFx0V2luZG93RGlkVXBkYXRlQ29sbGVjdGlvblByb3BlcnRpZXM6IFwibWFjOldpbmRvd0RpZFVwZGF0ZUNvbGxlY3Rpb25Qcm9wZXJ0aWVzXCIsXG5cdFx0V2luZG93RGlkVXBkYXRlU2hhZG93OiBcIm1hYzpXaW5kb3dEaWRVcGRhdGVTaGFkb3dcIixcblx0XHRXaW5kb3dEaWRVcGRhdGVUaXRsZTogXCJtYWM6V2luZG93RGlkVXBkYXRlVGl0bGVcIixcblx0XHRXaW5kb3dEaWRVcGRhdGVUb29sYmFyOiBcIm1hYzpXaW5kb3dEaWRVcGRhdGVUb29sYmFyXCIsXG5cdFx0V2luZG93RGlkWm9vbTogXCJtYWM6V2luZG93RGlkWm9vbVwiLFxuXHRcdFdpbmRvd0ZpbGVEcmFnZ2luZ0VudGVyZWQ6IFwibWFjOldpbmRvd0ZpbGVEcmFnZ2luZ0VudGVyZWRcIixcblx0XHRXaW5kb3dGaWxlRHJhZ2dpbmdFeGl0ZWQ6IFwibWFjOldpbmRvd0ZpbGVEcmFnZ2luZ0V4aXRlZFwiLFxuXHRcdFdpbmRvd0ZpbGVEcmFnZ2luZ1BlcmZvcm1lZDogXCJtYWM6V2luZG93RmlsZURyYWdnaW5nUGVyZm9ybWVkXCIsXG5cdFx0V2luZG93SGlkZTogXCJtYWM6V2luZG93SGlkZVwiLFxuXHRcdFdpbmRvd01heGltaXNlOiBcIm1hYzpXaW5kb3dNYXhpbWlzZVwiLFxuXHRcdFdpbmRvd1VuTWF4aW1pc2U6IFwibWFjOldpbmRvd1VuTWF4aW1pc2VcIixcblx0XHRXaW5kb3dNaW5pbWlzZTogXCJtYWM6V2luZG93TWluaW1pc2VcIixcblx0XHRXaW5kb3dVbk1pbmltaXNlOiBcIm1hYzpXaW5kb3dVbk1pbmltaXNlXCIsXG5cdFx0V2luZG93U2hvdWxkQ2xvc2U6IFwibWFjOldpbmRvd1Nob3VsZENsb3NlXCIsXG5cdFx0V2luZG93U2hvdzogXCJtYWM6V2luZG93U2hvd1wiLFxuXHRcdFdpbmRvd1dpbGxCZWNvbWVLZXk6IFwibWFjOldpbmRvd1dpbGxCZWNvbWVLZXlcIixcblx0XHRXaW5kb3dXaWxsQmVjb21lTWFpbjogXCJtYWM6V2luZG93V2lsbEJlY29tZU1haW5cIixcblx0XHRXaW5kb3dXaWxsQmVnaW5TaGVldDogXCJtYWM6V2luZG93V2lsbEJlZ2luU2hlZXRcIixcblx0XHRXaW5kb3dXaWxsQ2hhbmdlT3JkZXJpbmdNb2RlOiBcIm1hYzpXaW5kb3dXaWxsQ2hhbmdlT3JkZXJpbmdNb2RlXCIsXG5cdFx0V2luZG93V2lsbENsb3NlOiBcIm1hYzpXaW5kb3dXaWxsQ2xvc2VcIixcblx0XHRXaW5kb3dXaWxsRGVtaW5pYXR1cml6ZTogXCJtYWM6V2luZG93V2lsbERlbWluaWF0dXJpemVcIixcblx0XHRXaW5kb3dXaWxsRW50ZXJGdWxsU2NyZWVuOiBcIm1hYzpXaW5kb3dXaWxsRW50ZXJGdWxsU2NyZWVuXCIsXG5cdFx0V2luZG93V2lsbEVudGVyVmVyc2lvbkJyb3dzZXI6IFwibWFjOldpbmRvd1dpbGxFbnRlclZlcnNpb25Ccm93c2VyXCIsXG5cdFx0V2luZG93V2lsbEV4aXRGdWxsU2NyZWVuOiBcIm1hYzpXaW5kb3dXaWxsRXhpdEZ1bGxTY3JlZW5cIixcblx0XHRXaW5kb3dXaWxsRXhpdFZlcnNpb25Ccm93c2VyOiBcIm1hYzpXaW5kb3dXaWxsRXhpdFZlcnNpb25Ccm93c2VyXCIsXG5cdFx0V2luZG93V2lsbEZvY3VzOiBcIm1hYzpXaW5kb3dXaWxsRm9jdXNcIixcblx0XHRXaW5kb3dXaWxsTWluaWF0dXJpemU6IFwibWFjOldpbmRvd1dpbGxNaW5pYXR1cml6ZVwiLFxuXHRcdFdpbmRvd1dpbGxNb3ZlOiBcIm1hYzpXaW5kb3dXaWxsTW92ZVwiLFxuXHRcdFdpbmRvd1dpbGxPcmRlck9mZlNjcmVlbjogXCJtYWM6V2luZG93V2lsbE9yZGVyT2ZmU2NyZWVuXCIsXG5cdFx0V2luZG93V2lsbE9yZGVyT25TY3JlZW46IFwibWFjOldpbmRvd1dpbGxPcmRlck9uU2NyZWVuXCIsXG5cdFx0V2luZG93V2lsbFJlc2lnbk1haW46IFwibWFjOldpbmRvd1dpbGxSZXNpZ25NYWluXCIsXG5cdFx0V2luZG93V2lsbFJlc2l6ZTogXCJtYWM6V2luZG93V2lsbFJlc2l6ZVwiLFxuXHRcdFdpbmRvd1dpbGxVbmZvY3VzOiBcIm1hYzpXaW5kb3dXaWxsVW5mb2N1c1wiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGU6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVcIixcblx0XHRXaW5kb3dXaWxsVXBkYXRlQWxwaGE6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVBbHBoYVwiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGVDb2xsZWN0aW9uQmVoYXZpb3I6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVDb2xsZWN0aW9uQmVoYXZpb3JcIixcblx0XHRXaW5kb3dXaWxsVXBkYXRlQ29sbGVjdGlvblByb3BlcnRpZXM6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVDb2xsZWN0aW9uUHJvcGVydGllc1wiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGVTaGFkb3c6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVTaGFkb3dcIixcblx0XHRXaW5kb3dXaWxsVXBkYXRlVGl0bGU6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVUaXRsZVwiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGVUb29sYmFyOiBcIm1hYzpXaW5kb3dXaWxsVXBkYXRlVG9vbGJhclwiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGVWaXNpYmlsaXR5OiBcIm1hYzpXaW5kb3dXaWxsVXBkYXRlVmlzaWJpbGl0eVwiLFxuXHRcdFdpbmRvd1dpbGxVc2VTdGFuZGFyZEZyYW1lOiBcIm1hYzpXaW5kb3dXaWxsVXNlU3RhbmRhcmRGcmFtZVwiLFxuXHRcdFdpbmRvd1pvb21JbjogXCJtYWM6V2luZG93Wm9vbUluXCIsXG5cdFx0V2luZG93Wm9vbU91dDogXCJtYWM6V2luZG93Wm9vbU91dFwiLFxuXHRcdFdpbmRvd1pvb21SZXNldDogXCJtYWM6V2luZG93Wm9vbVJlc2V0XCIsXG5cdH0pLFxuXHRMaW51eDogT2JqZWN0LmZyZWV6ZSh7XG5cdFx0QXBwbGljYXRpb25TdGFydHVwOiBcImxpbnV4OkFwcGxpY2F0aW9uU3RhcnR1cFwiLFxuXHRcdFN5c3RlbVRoZW1lQ2hhbmdlZDogXCJsaW51eDpTeXN0ZW1UaGVtZUNoYW5nZWRcIixcblx0XHRXaW5kb3dEZWxldGVFdmVudDogXCJsaW51eDpXaW5kb3dEZWxldGVFdmVudFwiLFxuXHRcdFdpbmRvd0RpZE1vdmU6IFwibGludXg6V2luZG93RGlkTW92ZVwiLFxuXHRcdFdpbmRvd0RpZFJlc2l6ZTogXCJsaW51eDpXaW5kb3dEaWRSZXNpemVcIixcblx0XHRXaW5kb3dGb2N1c0luOiBcImxpbnV4OldpbmRvd0ZvY3VzSW5cIixcblx0XHRXaW5kb3dGb2N1c091dDogXCJsaW51eDpXaW5kb3dGb2N1c091dFwiLFxuXHRcdFdpbmRvd0xvYWRDaGFuZ2VkOiBcImxpbnV4OldpbmRvd0xvYWRDaGFuZ2VkXCIsXG5cdH0pLFxuXHRDb21tb246IE9iamVjdC5mcmVlemUoe1xuXHRcdEFwcGxpY2F0aW9uT3BlbmVkV2l0aEZpbGU6IFwiY29tbW9uOkFwcGxpY2F0aW9uT3BlbmVkV2l0aEZpbGVcIixcblx0XHRBcHBsaWNhdGlvblN0YXJ0ZWQ6IFwiY29tbW9uOkFwcGxpY2F0aW9uU3RhcnRlZFwiLFxuXHRcdFRoZW1lQ2hhbmdlZDogXCJjb21tb246VGhlbWVDaGFuZ2VkXCIsXG5cdFx0V2luZG93Q2xvc2luZzogXCJjb21tb246V2luZG93Q2xvc2luZ1wiLFxuXHRcdFdpbmRvd0RpZE1vdmU6IFwiY29tbW9uOldpbmRvd0RpZE1vdmVcIixcblx0XHRXaW5kb3dEaWRSZXNpemU6IFwiY29tbW9uOldpbmRvd0RpZFJlc2l6ZVwiLFxuXHRcdFdpbmRvd0RQSUNoYW5nZWQ6IFwiY29tbW9uOldpbmRvd0RQSUNoYW5nZWRcIixcblx0XHRXaW5kb3dGaWxlc0Ryb3BwZWQ6IFwiY29tbW9uOldpbmRvd0ZpbGVzRHJvcHBlZFwiLFxuXHRcdFdpbmRvd0ZvY3VzOiBcImNvbW1vbjpXaW5kb3dGb2N1c1wiLFxuXHRcdFdpbmRvd0Z1bGxzY3JlZW46IFwiY29tbW9uOldpbmRvd0Z1bGxzY3JlZW5cIixcblx0XHRXaW5kb3dIaWRlOiBcImNvbW1vbjpXaW5kb3dIaWRlXCIsXG5cdFx0V2luZG93TG9zdEZvY3VzOiBcImNvbW1vbjpXaW5kb3dMb3N0Rm9jdXNcIixcblx0XHRXaW5kb3dNYXhpbWlzZTogXCJjb21tb246V2luZG93TWF4aW1pc2VcIixcblx0XHRXaW5kb3dNaW5pbWlzZTogXCJjb21tb246V2luZG93TWluaW1pc2VcIixcblx0XHRXaW5kb3dSZXN0b3JlOiBcImNvbW1vbjpXaW5kb3dSZXN0b3JlXCIsXG5cdFx0V2luZG93UnVudGltZVJlYWR5OiBcImNvbW1vbjpXaW5kb3dSdW50aW1lUmVhZHlcIixcblx0XHRXaW5kb3dTaG93OiBcImNvbW1vbjpXaW5kb3dTaG93XCIsXG5cdFx0V2luZG93VW5GdWxsc2NyZWVuOiBcImNvbW1vbjpXaW5kb3dVbkZ1bGxzY3JlZW5cIixcblx0XHRXaW5kb3dVbk1heGltaXNlOiBcImNvbW1vbjpXaW5kb3dVbk1heGltaXNlXCIsXG5cdFx0V2luZG93VW5NaW5pbWlzZTogXCJjb21tb246V2luZG93VW5NaW5pbWlzZVwiLFxuXHRcdFdpbmRvd1pvb206IFwiY29tbW9uOldpbmRvd1pvb21cIixcblx0XHRXaW5kb3dab29tSW46IFwiY29tbW9uOldpbmRvd1pvb21JblwiLFxuXHRcdFdpbmRvd1pvb21PdXQ6IFwiY29tbW9uOldpbmRvd1pvb21PdXRcIixcblx0XHRXaW5kb3dab29tUmVzZXQ6IFwiY29tbW9uOldpbmRvd1pvb21SZXNldFwiLFxuXHR9KSxcbn0pO1xuIiwgIi8qXG4gXyAgICAgX18gICAgIF8gX19cbnwgfCAgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vKipcbiAqIExvZ3MgYSBtZXNzYWdlIHRvIHRoZSBjb25zb2xlIHdpdGggY3VzdG9tIGZvcm1hdHRpbmcuXG4gKlxuICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWJ1Z0xvZyhtZXNzYWdlOiBhbnkpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgJyVjIHdhaWxzMyAlYyAnICsgbWVzc2FnZSArICcgJyxcbiAgICAgICAgJ2JhY2tncm91bmQ6ICNhYTAwMDA7IGNvbG9yOiAjZmZmOyBib3JkZXItcmFkaXVzOiAzcHggMHB4IDBweCAzcHg7IHBhZGRpbmc6IDFweDsgZm9udC1zaXplOiAwLjdyZW0nLFxuICAgICAgICAnYmFja2dyb3VuZDogIzAwOTkwMDsgY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDBweCAzcHggM3B4IDBweDsgcGFkZGluZzogMXB4OyBmb250LXNpemU6IDAuN3JlbSdcbiAgICApO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSB3ZWJ2aWV3IHN1cHBvcnRzIHRoZSB7QGxpbmsgTW91c2VFdmVudCNidXR0b25zfSBwcm9wZXJ0eS5cbiAqIExvb2tpbmcgYXQgeW91IG1hY09TIEhpZ2ggU2llcnJhIVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FuVHJhY2tCdXR0b25zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAobmV3IE1vdXNlRXZlbnQoJ21vdXNlZG93bicpKS5idXR0b25zID09PSAwO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBicm93c2VyIHN1cHBvcnRzIHJlbW92aW5nIGxpc3RlbmVycyBieSB0cmlnZ2VyaW5nIGFuIEFib3J0U2lnbmFsXG4gKiAoc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FdmVudFRhcmdldC9hZGRFdmVudExpc3RlbmVyI3NpZ25hbCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYW5BYm9ydExpc3RlbmVycygpIHtcbiAgICBpZiAoIUV2ZW50VGFyZ2V0IHx8ICFBYm9ydFNpZ25hbCB8fCAhQWJvcnRDb250cm9sbGVyKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBsZXQgcmVzdWx0ID0gdHJ1ZTtcblxuICAgIGNvbnN0IHRhcmdldCA9IG5ldyBFdmVudFRhcmdldCgpO1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCAoKSA9PiB7IHJlc3VsdCA9IGZhbHNlOyB9LCB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfSk7XG4gICAgY29udHJvbGxlci5hYm9ydCgpO1xuICAgIHRhcmdldC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgndGVzdCcpKTtcblxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIGNsb3Nlc3QgSFRNTEVsZW1lbnQgYW5jZXN0b3Igb2YgYW4gZXZlbnQncyB0YXJnZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBldmVudFRhcmdldChldmVudDogRXZlbnQpOiBIVE1MRWxlbWVudCB7XG4gICAgaWYgKGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBldmVudC50YXJnZXQ7XG4gICAgfSBlbHNlIGlmICghKGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSAmJiBldmVudC50YXJnZXQgaW5zdGFuY2VvZiBOb2RlKSB7XG4gICAgICAgIHJldHVybiBldmVudC50YXJnZXQucGFyZW50RWxlbWVudCA/PyBkb2N1bWVudC5ib2R5O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBkb2N1bWVudC5ib2R5O1xuICAgIH1cbn1cblxuLyoqKlxuIFRoaXMgdGVjaG5pcXVlIGZvciBwcm9wZXIgbG9hZCBkZXRlY3Rpb24gaXMgdGFrZW4gZnJvbSBIVE1YOlxuXG4gQlNEIDItQ2xhdXNlIExpY2Vuc2VcblxuIENvcHlyaWdodCAoYykgMjAyMCwgQmlnIFNreSBTb2Z0d2FyZVxuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cbiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcblxuIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuXG4gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb25cbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cblxuIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4gQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEVcbiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTFxuIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SXG4gU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVJcbiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLFxuIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFXG4gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cblxuICoqKi9cblxubGV0IGlzUmVhZHkgPSBmYWxzZTtcbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB7IGlzUmVhZHkgPSB0cnVlIH0pO1xuXG5leHBvcnQgZnVuY3Rpb24gd2hlblJlYWR5KGNhbGxiYWNrOiAoKSA9PiB2b2lkKSB7XG4gICAgaWYgKGlzUmVhZHkgfHwgZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJykge1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBjYWxsYmFjayk7XG4gICAgfVxufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5pbXBvcnQge25ld1J1bnRpbWVDYWxsZXIsIG9iamVjdE5hbWVzfSBmcm9tIFwiLi9ydW50aW1lLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNjcmVlbiB9IGZyb20gXCIuL3NjcmVlbnMuanNcIjtcblxuY29uc3QgUG9zaXRpb25NZXRob2QgICAgICAgICAgICAgICAgICAgID0gMDtcbmNvbnN0IENlbnRlck1ldGhvZCAgICAgICAgICAgICAgICAgICAgICA9IDE7XG5jb25zdCBDbG9zZU1ldGhvZCAgICAgICAgICAgICAgICAgICAgICAgPSAyO1xuY29uc3QgRGlzYWJsZVNpemVDb25zdHJhaW50c01ldGhvZCAgICAgID0gMztcbmNvbnN0IEVuYWJsZVNpemVDb25zdHJhaW50c01ldGhvZCAgICAgICA9IDQ7XG5jb25zdCBGb2N1c01ldGhvZCAgICAgICAgICAgICAgICAgICAgICAgPSA1O1xuY29uc3QgRm9yY2VSZWxvYWRNZXRob2QgICAgICAgICAgICAgICAgID0gNjtcbmNvbnN0IEZ1bGxzY3JlZW5NZXRob2QgICAgICAgICAgICAgICAgICA9IDc7XG5jb25zdCBHZXRTY3JlZW5NZXRob2QgICAgICAgICAgICAgICAgICAgPSA4O1xuY29uc3QgR2V0Wm9vbU1ldGhvZCAgICAgICAgICAgICAgICAgICAgID0gOTtcbmNvbnN0IEhlaWdodE1ldGhvZCAgICAgICAgICAgICAgICAgICAgICA9IDEwO1xuY29uc3QgSGlkZU1ldGhvZCAgICAgICAgICAgICAgICAgICAgICAgID0gMTE7XG5jb25zdCBJc0ZvY3VzZWRNZXRob2QgICAgICAgICAgICAgICAgICAgPSAxMjtcbmNvbnN0IElzRnVsbHNjcmVlbk1ldGhvZCAgICAgICAgICAgICAgICA9IDEzO1xuY29uc3QgSXNNYXhpbWlzZWRNZXRob2QgICAgICAgICAgICAgICAgID0gMTQ7XG5jb25zdCBJc01pbmltaXNlZE1ldGhvZCAgICAgICAgICAgICAgICAgPSAxNTtcbmNvbnN0IE1heGltaXNlTWV0aG9kICAgICAgICAgICAgICAgICAgICA9IDE2O1xuY29uc3QgTWluaW1pc2VNZXRob2QgICAgICAgICAgICAgICAgICAgID0gMTc7XG5jb25zdCBOYW1lTWV0aG9kICAgICAgICAgICAgICAgICAgICAgICAgPSAxODtcbmNvbnN0IE9wZW5EZXZUb29sc01ldGhvZCAgICAgICAgICAgICAgICA9IDE5O1xuY29uc3QgUmVsYXRpdmVQb3NpdGlvbk1ldGhvZCAgICAgICAgICAgID0gMjA7XG5jb25zdCBSZWxvYWRNZXRob2QgICAgICAgICAgICAgICAgICAgICAgPSAyMTtcbmNvbnN0IFJlc2l6YWJsZU1ldGhvZCAgICAgICAgICAgICAgICAgICA9IDIyO1xuY29uc3QgUmVzdG9yZU1ldGhvZCAgICAgICAgICAgICAgICAgICAgID0gMjM7XG5jb25zdCBTZXRQb3NpdGlvbk1ldGhvZCAgICAgICAgICAgICAgICAgPSAyNDtcbmNvbnN0IFNldEFsd2F5c09uVG9wTWV0aG9kICAgICAgICAgICAgICA9IDI1O1xuY29uc3QgU2V0QmFja2dyb3VuZENvbG91ck1ldGhvZCAgICAgICAgID0gMjY7XG5jb25zdCBTZXRGcmFtZWxlc3NNZXRob2QgICAgICAgICAgICAgICAgPSAyNztcbmNvbnN0IFNldEZ1bGxzY3JlZW5CdXR0b25FbmFibGVkTWV0aG9kICA9IDI4O1xuY29uc3QgU2V0TWF4U2l6ZU1ldGhvZCAgICAgICAgICAgICAgICAgID0gMjk7XG5jb25zdCBTZXRNaW5TaXplTWV0aG9kICAgICAgICAgICAgICAgICAgPSAzMDtcbmNvbnN0IFNldFJlbGF0aXZlUG9zaXRpb25NZXRob2QgICAgICAgICA9IDMxO1xuY29uc3QgU2V0UmVzaXphYmxlTWV0aG9kICAgICAgICAgICAgICAgID0gMzI7XG5jb25zdCBTZXRTaXplTWV0aG9kICAgICAgICAgICAgICAgICAgICAgPSAzMztcbmNvbnN0IFNldFRpdGxlTWV0aG9kICAgICAgICAgICAgICAgICAgICA9IDM0O1xuY29uc3QgU2V0Wm9vbU1ldGhvZCAgICAgICAgICAgICAgICAgICAgID0gMzU7XG5jb25zdCBTaG93TWV0aG9kICAgICAgICAgICAgICAgICAgICAgICAgPSAzNjtcbmNvbnN0IFNpemVNZXRob2QgICAgICAgICAgICAgICAgICAgICAgICA9IDM3O1xuY29uc3QgVG9nZ2xlRnVsbHNjcmVlbk1ldGhvZCAgICAgICAgICAgID0gMzg7XG5jb25zdCBUb2dnbGVNYXhpbWlzZU1ldGhvZCAgICAgICAgICAgICAgPSAzOTtcbmNvbnN0IFVuRnVsbHNjcmVlbk1ldGhvZCAgICAgICAgICAgICAgICA9IDQwO1xuY29uc3QgVW5NYXhpbWlzZU1ldGhvZCAgICAgICAgICAgICAgICAgID0gNDE7XG5jb25zdCBVbk1pbmltaXNlTWV0aG9kICAgICAgICAgICAgICAgICAgPSA0MjtcbmNvbnN0IFdpZHRoTWV0aG9kICAgICAgICAgICAgICAgICAgICAgICA9IDQzO1xuY29uc3QgWm9vbU1ldGhvZCAgICAgICAgICAgICAgICAgICAgICAgID0gNDQ7XG5jb25zdCBab29tSW5NZXRob2QgICAgICAgICAgICAgICAgICAgICAgPSA0NTtcbmNvbnN0IFpvb21PdXRNZXRob2QgICAgICAgICAgICAgICAgICAgICA9IDQ2O1xuY29uc3QgWm9vbVJlc2V0TWV0aG9kICAgICAgICAgICAgICAgICAgID0gNDc7XG5cbi8qKlxuICogQSByZWNvcmQgZGVzY3JpYmluZyB0aGUgcG9zaXRpb24gb2YgYSB3aW5kb3cuXG4gKi9cbmludGVyZmFjZSBQb3NpdGlvbiB7XG4gICAgLyoqIFRoZSBob3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoZSB3aW5kb3cuICovXG4gICAgeDogbnVtYmVyO1xuICAgIC8qKiBUaGUgdmVydGljYWwgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy4gKi9cbiAgICB5OiBudW1iZXI7XG59XG5cbi8qKlxuICogQSByZWNvcmQgZGVzY3JpYmluZyB0aGUgc2l6ZSBvZiBhIHdpbmRvdy5cbiAqL1xuaW50ZXJmYWNlIFNpemUge1xuICAgIC8qKiBUaGUgd2lkdGggb2YgdGhlIHdpbmRvdy4gKi9cbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIC8qKiBUaGUgaGVpZ2h0IG9mIHRoZSB3aW5kb3cuICovXG4gICAgaGVpZ2h0OiBudW1iZXI7XG59XG5cbi8vIFByaXZhdGUgZmllbGQgbmFtZXMuXG5jb25zdCBjYWxsZXJTeW0gPSBTeW1ib2woXCJjYWxsZXJcIik7XG5cbmNsYXNzIFdpbmRvdyB7XG4gICAgLy8gUHJpdmF0ZSBmaWVsZHMuXG4gICAgcHJpdmF0ZSBbY2FsbGVyU3ltXTogKG1lc3NhZ2U6IG51bWJlciwgYXJncz86IGFueSkgPT4gUHJvbWlzZTxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGlzZXMgYSB3aW5kb3cgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YXJnZXQgd2luZG93LlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZyA9ICcnKSB7XG4gICAgICAgIHRoaXNbY2FsbGVyU3ltXSA9IG5ld1J1bnRpbWVDYWxsZXIob2JqZWN0TmFtZXMuV2luZG93LCBuYW1lKVxuXG4gICAgICAgIC8vIGJpbmQgaW5zdGFuY2UgbWV0aG9kIHRvIG1ha2UgdGhlbSBlYXNpbHkgdXNhYmxlIGluIGV2ZW50IGhhbmRsZXJzXG4gICAgICAgIGZvciAoY29uc3QgbWV0aG9kIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKFdpbmRvdy5wcm90b3R5cGUpKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgbWV0aG9kICE9PSBcImNvbnN0cnVjdG9yXCJcbiAgICAgICAgICAgICAgICAmJiB0eXBlb2YgKHRoaXMgYXMgYW55KVttZXRob2RdID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICh0aGlzIGFzIGFueSlbbWV0aG9kXSA9ICh0aGlzIGFzIGFueSlbbWV0aG9kXS5iaW5kKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgc3BlY2lmaWVkIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHdpbmRvdyB0byBnZXQuXG4gICAgICogQHJldHVybnMgVGhlIGNvcnJlc3BvbmRpbmcgd2luZG93IG9iamVjdC5cbiAgICAgKi9cbiAgICBHZXQobmFtZTogc3RyaW5nKTogV2luZG93IHtcbiAgICAgICAgcmV0dXJuIG5ldyBXaW5kb3cobmFtZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IGFic29sdXRlIHBvc2l0aW9uIG9mIHRoZSB3aW5kb3cuXG4gICAgICovXG4gICAgUG9zaXRpb24oKTogUHJvbWlzZTxQb3NpdGlvbj4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFBvc2l0aW9uTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDZW50ZXJzIHRoZSB3aW5kb3cgb24gdGhlIHNjcmVlbi5cbiAgICAgKi9cbiAgICBDZW50ZXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oQ2VudGVyTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBDbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShDbG9zZU1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZXMgbWluL21heCBzaXplIGNvbnN0cmFpbnRzLlxuICAgICAqL1xuICAgIERpc2FibGVTaXplQ29uc3RyYWludHMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oRGlzYWJsZVNpemVDb25zdHJhaW50c01ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyBtaW4vbWF4IHNpemUgY29uc3RyYWludHMuXG4gICAgICovXG4gICAgRW5hYmxlU2l6ZUNvbnN0cmFpbnRzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEVuYWJsZVNpemVDb25zdHJhaW50c01ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9jdXNlcyB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIEZvY3VzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEZvY3VzTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JjZXMgdGhlIHdpbmRvdyB0byByZWxvYWQgdGhlIHBhZ2UgYXNzZXRzLlxuICAgICAqL1xuICAgIEZvcmNlUmVsb2FkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEZvcmNlUmVsb2FkTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTd2l0Y2hlcyB0aGUgd2luZG93IHRvIGZ1bGxzY3JlZW4gbW9kZS5cbiAgICAgKi9cbiAgICBGdWxsc2NyZWVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEZ1bGxzY3JlZW5NZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHNjcmVlbiB0aGF0IHRoZSB3aW5kb3cgaXMgb24uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgc2NyZWVuIHRoZSB3aW5kb3cgaXMgY3VycmVudGx5IG9uLlxuICAgICAqL1xuICAgIEdldFNjcmVlbigpOiBQcm9taXNlPFNjcmVlbj4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEdldFNjcmVlbk1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudCB6b29tIGxldmVsIG9mIHRoZSB3aW5kb3cuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCB6b29tIGxldmVsLlxuICAgICAqL1xuICAgIEdldFpvb20oKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShHZXRab29tTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBoZWlnaHQgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IGhlaWdodCBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIEhlaWdodCgpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEhlaWdodE1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGlkZXMgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBIaWRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEhpZGVNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgd2luZG93IGlzIGZvY3VzZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSB3aW5kb3cgaXMgY3VycmVudGx5IGZvY3VzZWQuXG4gICAgICovXG4gICAgSXNGb2N1c2VkKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKElzRm9jdXNlZE1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB3aW5kb3cgaXMgZnVsbHNjcmVlbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIHdpbmRvdyBpcyBjdXJyZW50bHkgZnVsbHNjcmVlbi5cbiAgICAgKi9cbiAgICBJc0Z1bGxzY3JlZW4oKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oSXNGdWxsc2NyZWVuTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHdpbmRvdyBpcyBtYXhpbWlzZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSB3aW5kb3cgaXMgY3VycmVudGx5IG1heGltaXNlZC5cbiAgICAgKi9cbiAgICBJc01heGltaXNlZCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShJc01heGltaXNlZE1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB3aW5kb3cgaXMgbWluaW1pc2VkLlxuICAgICAqXG4gICAgICogQHJldHVybnMgV2hldGhlciB0aGUgd2luZG93IGlzIGN1cnJlbnRseSBtaW5pbWlzZWQuXG4gICAgICovXG4gICAgSXNNaW5pbWlzZWQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oSXNNaW5pbWlzZWRNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1heGltaXNlcyB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIE1heGltaXNlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKE1heGltaXNlTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNaW5pbWlzZXMgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBNaW5pbWlzZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShNaW5pbWlzZU1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgd2luZG93LlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIG5hbWUgb2YgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBOYW1lKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oTmFtZU1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3BlbnMgdGhlIGRldmVsb3BtZW50IHRvb2xzIHBhbmUuXG4gICAgICovXG4gICAgT3BlbkRldlRvb2xzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKE9wZW5EZXZUb29sc01ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcmVsYXRpdmUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdyB0byB0aGUgc2NyZWVuLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIGN1cnJlbnQgcmVsYXRpdmUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBSZWxhdGl2ZVBvc2l0aW9uKCk6IFByb21pc2U8UG9zaXRpb24+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShSZWxhdGl2ZVBvc2l0aW9uTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWxvYWRzIHRoZSBwYWdlIGFzc2V0cy5cbiAgICAgKi9cbiAgICBSZWxvYWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oUmVsb2FkTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHdpbmRvdyBpcyByZXNpemFibGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSB3aW5kb3cgaXMgY3VycmVudGx5IHJlc2l6YWJsZS5cbiAgICAgKi9cbiAgICBSZXNpemFibGUoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oUmVzaXphYmxlTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXN0b3JlcyB0aGUgd2luZG93IHRvIGl0cyBwcmV2aW91cyBzdGF0ZSBpZiBpdCB3YXMgcHJldmlvdXNseSBtaW5pbWlzZWQsIG1heGltaXNlZCBvciBmdWxsc2NyZWVuLlxuICAgICAqL1xuICAgIFJlc3RvcmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oUmVzdG9yZU1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB4IC0gVGhlIGRlc2lyZWQgaG9yaXpvbnRhbCBhYnNvbHV0ZSBwb3NpdGlvbiBvZiB0aGUgd2luZG93LlxuICAgICAqIEBwYXJhbSB5IC0gVGhlIGRlc2lyZWQgdmVydGljYWwgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBTZXRQb3NpdGlvbih4OiBudW1iZXIsIHk6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFNldFBvc2l0aW9uTWV0aG9kLCB7IHgsIHkgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgd2luZG93IHRvIGJlIGFsd2F5cyBvbiB0b3AuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYWx3YXlzT25Ub3AgLSBXaGV0aGVyIHRoZSB3aW5kb3cgc2hvdWxkIHN0YXkgb24gdG9wLlxuICAgICAqL1xuICAgIFNldEFsd2F5c09uVG9wKGFsd2F5c09uVG9wOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2V0QWx3YXlzT25Ub3BNZXRob2QsIHsgYWx3YXlzT25Ub3AgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgYmFja2dyb3VuZCBjb2xvdXIgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByIC0gVGhlIGRlc2lyZWQgcmVkIGNvbXBvbmVudCBvZiB0aGUgd2luZG93IGJhY2tncm91bmQuXG4gICAgICogQHBhcmFtIGcgLSBUaGUgZGVzaXJlZCBncmVlbiBjb21wb25lbnQgb2YgdGhlIHdpbmRvdyBiYWNrZ3JvdW5kLlxuICAgICAqIEBwYXJhbSBiIC0gVGhlIGRlc2lyZWQgYmx1ZSBjb21wb25lbnQgb2YgdGhlIHdpbmRvdyBiYWNrZ3JvdW5kLlxuICAgICAqIEBwYXJhbSBhIC0gVGhlIGRlc2lyZWQgYWxwaGEgY29tcG9uZW50IG9mIHRoZSB3aW5kb3cgYmFja2dyb3VuZC5cbiAgICAgKi9cbiAgICBTZXRCYWNrZ3JvdW5kQ29sb3VyKHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIsIGE6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFNldEJhY2tncm91bmRDb2xvdXJNZXRob2QsIHsgciwgZywgYiwgYSB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSB3aW5kb3cgZnJhbWUgYW5kIHRpdGxlIGJhci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmcmFtZWxlc3MgLSBXaGV0aGVyIHRoZSB3aW5kb3cgc2hvdWxkIGJlIGZyYW1lbGVzcy5cbiAgICAgKi9cbiAgICBTZXRGcmFtZWxlc3MoZnJhbWVsZXNzOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2V0RnJhbWVsZXNzTWV0aG9kLCB7IGZyYW1lbGVzcyB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlcyB0aGUgc3lzdGVtIGZ1bGxzY3JlZW4gYnV0dG9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVuYWJsZWQgLSBXaGV0aGVyIHRoZSBmdWxsc2NyZWVuIGJ1dHRvbiBzaG91bGQgYmUgZW5hYmxlZC5cbiAgICAgKi9cbiAgICBTZXRGdWxsc2NyZWVuQnV0dG9uRW5hYmxlZChlbmFibGVkOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2V0RnVsbHNjcmVlbkJ1dHRvbkVuYWJsZWRNZXRob2QsIHsgZW5hYmxlZCB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB3aWR0aCAtIFRoZSBkZXNpcmVkIG1heGltdW0gd2lkdGggb2YgdGhlIHdpbmRvdy5cbiAgICAgKiBAcGFyYW0gaGVpZ2h0IC0gVGhlIGRlc2lyZWQgbWF4aW11bSBoZWlnaHQgb2YgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBTZXRNYXhTaXplKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2V0TWF4U2l6ZU1ldGhvZCwgeyB3aWR0aCwgaGVpZ2h0IH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIG1pbmltdW0gc2l6ZSBvZiB0aGUgd2luZG93LlxuICAgICAqXG4gICAgICogQHBhcmFtIHdpZHRoIC0gVGhlIGRlc2lyZWQgbWluaW11bSB3aWR0aCBvZiB0aGUgd2luZG93LlxuICAgICAqIEBwYXJhbSBoZWlnaHQgLSBUaGUgZGVzaXJlZCBtaW5pbXVtIGhlaWdodCBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFNldE1pblNpemUod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShTZXRNaW5TaXplTWV0aG9kLCB7IHdpZHRoLCBoZWlnaHQgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcmVsYXRpdmUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdyB0byB0aGUgc2NyZWVuLlxuICAgICAqXG4gICAgICogQHBhcmFtIHggLSBUaGUgZGVzaXJlZCBob3Jpem9udGFsIHJlbGF0aXZlIHBvc2l0aW9uIG9mIHRoZSB3aW5kb3cuXG4gICAgICogQHBhcmFtIHkgLSBUaGUgZGVzaXJlZCB2ZXJ0aWNhbCByZWxhdGl2ZSBwb3NpdGlvbiBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFNldFJlbGF0aXZlUG9zaXRpb24oeDogbnVtYmVyLCB5OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShTZXRSZWxhdGl2ZVBvc2l0aW9uTWV0aG9kLCB7IHgsIHkgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB3aGV0aGVyIHRoZSB3aW5kb3cgaXMgcmVzaXphYmxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlc2l6YWJsZSAtIFdoZXRoZXIgdGhlIHdpbmRvdyBzaG91bGQgYmUgcmVzaXphYmxlLlxuICAgICAqL1xuICAgIFNldFJlc2l6YWJsZShyZXNpemFibGU6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShTZXRSZXNpemFibGVNZXRob2QsIHsgcmVzaXphYmxlIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHNpemUgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB3aWR0aCAtIFRoZSBkZXNpcmVkIHdpZHRoIG9mIHRoZSB3aW5kb3cuXG4gICAgICogQHBhcmFtIGhlaWdodCAtIFRoZSBkZXNpcmVkIGhlaWdodCBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFNldFNpemUod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShTZXRTaXplTWV0aG9kLCB7IHdpZHRoLCBoZWlnaHQgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdGl0bGUgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0aXRsZSAtIFRoZSBkZXNpcmVkIHRpdGxlIG9mIHRoZSB3aW5kb3cuXG4gICAgICovXG4gICAgU2V0VGl0bGUodGl0bGU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFNldFRpdGxlTWV0aG9kLCB7IHRpdGxlIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHpvb20gbGV2ZWwgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB6b29tIC0gVGhlIGRlc2lyZWQgem9vbSBsZXZlbC5cbiAgICAgKi9cbiAgICBTZXRab29tKHpvb206IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFNldFpvb21NZXRob2QsIHsgem9vbSB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTaG93cyB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFNob3coKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2hvd01ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgd2luZG93LlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFNpemUoKTogUHJvbWlzZTxTaXplPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2l6ZU1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG9nZ2xlcyB0aGUgd2luZG93IGJldHdlZW4gZnVsbHNjcmVlbiBhbmQgbm9ybWFsLlxuICAgICAqL1xuICAgIFRvZ2dsZUZ1bGxzY3JlZW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oVG9nZ2xlRnVsbHNjcmVlbk1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG9nZ2xlcyB0aGUgd2luZG93IGJldHdlZW4gbWF4aW1pc2VkIGFuZCBub3JtYWwuXG4gICAgICovXG4gICAgVG9nZ2xlTWF4aW1pc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oVG9nZ2xlTWF4aW1pc2VNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVuLWZ1bGxzY3JlZW5zIHRoZSB3aW5kb3cuXG4gICAgICovXG4gICAgVW5GdWxsc2NyZWVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFVuRnVsbHNjcmVlbk1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVW4tbWF4aW1pc2VzIHRoZSB3aW5kb3cuXG4gICAgICovXG4gICAgVW5NYXhpbWlzZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShVbk1heGltaXNlTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVbi1taW5pbWlzZXMgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBVbk1pbmltaXNlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFVuTWluaW1pc2VNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHdpZHRoIG9mIHRoZSB3aW5kb3cuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCB3aWR0aCBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFdpZHRoKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oV2lkdGhNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFpvb21zIHRoZSB3aW5kb3cuXG4gICAgICovXG4gICAgWm9vbSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShab29tTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbmNyZWFzZXMgdGhlIHpvb20gbGV2ZWwgb2YgdGhlIHdlYnZpZXcgY29udGVudC5cbiAgICAgKi9cbiAgICBab29tSW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oWm9vbUluTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWNyZWFzZXMgdGhlIHpvb20gbGV2ZWwgb2YgdGhlIHdlYnZpZXcgY29udGVudC5cbiAgICAgKi9cbiAgICBab29tT3V0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFpvb21PdXRNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUgem9vbSBsZXZlbCBvZiB0aGUgd2VidmlldyBjb250ZW50LlxuICAgICAqL1xuICAgIFpvb21SZXNldCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShab29tUmVzZXRNZXRob2QpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBUaGUgd2luZG93IHdpdGhpbiB3aGljaCB0aGUgc2NyaXB0IGlzIHJ1bm5pbmcuXG4gKi9cbmNvbnN0IHRoaXNXaW5kb3cgPSBuZXcgV2luZG93KCcnKTtcblxuZXhwb3J0IGRlZmF1bHQgdGhpc1dpbmRvdztcbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuaW1wb3J0ICogYXMgUnVudGltZSBmcm9tIFwiLi4vQHdhaWxzaW8vcnVudGltZS9zcmNcIjtcblxuLy8gTk9URTogdGhlIGZvbGxvd2luZyBtZXRob2RzIE1VU1QgYmUgaW1wb3J0ZWQgZXhwbGljaXRseSBiZWNhdXNlIG9mIGhvdyBlc2J1aWxkIGluamVjdGlvbiB3b3Jrc1xuaW1wb3J0IHsgRW5hYmxlIGFzIEVuYWJsZVdNTCB9IGZyb20gXCIuLi9Ad2FpbHNpby9ydW50aW1lL3NyYy93bWxcIjtcbmltcG9ydCB7IGRlYnVnTG9nIH0gZnJvbSBcIi4uL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3V0aWxzXCI7XG5cbndpbmRvdy53YWlscyA9IFJ1bnRpbWU7XG5FbmFibGVXTUwoKTtcblxuaWYgKERFQlVHKSB7XG4gICAgZGVidWdMb2coXCJXYWlscyBSdW50aW1lIExvYWRlZFwiKVxufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5pbXBvcnQgeyBuZXdSdW50aW1lQ2FsbGVyLCBvYmplY3ROYW1lcyB9IGZyb20gXCIuL3J1bnRpbWUuanNcIjtcblxubGV0IGNhbGwgPSBuZXdSdW50aW1lQ2FsbGVyKG9iamVjdE5hbWVzLlN5c3RlbSk7XG5cbmNvbnN0IFN5c3RlbUlzRGFya01vZGUgPSAwO1xuY29uc3QgU3lzdGVtRW52aXJvbm1lbnQgPSAxO1xuXG5jb25zdCBfaW52b2tlID0gKGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAoKHdpbmRvdyBhcyBhbnkpLmNocm9tZT8ud2Vidmlldz8ucG9zdE1lc3NhZ2UpIHtcbiAgICAgICAgICAgIHJldHVybiAod2luZG93IGFzIGFueSkuY2hyb21lLndlYnZpZXcucG9zdE1lc3NhZ2UuYmluZCgod2luZG93IGFzIGFueSkuY2hyb21lLndlYnZpZXcpO1xuICAgICAgICB9IGVsc2UgaWYgKCh3aW5kb3cgYXMgYW55KS53ZWJraXQ/Lm1lc3NhZ2VIYW5kbGVycz8uWydleHRlcm5hbCddPy5wb3N0TWVzc2FnZSkge1xuICAgICAgICAgICAgcmV0dXJuICh3aW5kb3cgYXMgYW55KS53ZWJraXQubWVzc2FnZUhhbmRsZXJzWydleHRlcm5hbCddLnBvc3RNZXNzYWdlLmJpbmQoKHdpbmRvdyBhcyBhbnkpLndlYmtpdC5tZXNzYWdlSGFuZGxlcnNbJ2V4dGVybmFsJ10pO1xuICAgICAgICB9XG4gICAgfSBjYXRjaChlKSB7fVxuXG4gICAgY29uc29sZS53YXJuKCdcXG4lY1x1MjZBMFx1RkUwRiBCcm93c2VyIEVudmlyb25tZW50IERldGVjdGVkICVjXFxuXFxuJWNPbmx5IFVJIHByZXZpZXdzIGFyZSBhdmFpbGFibGUgaW4gdGhlIGJyb3dzZXIuIEZvciBmdWxsIGZ1bmN0aW9uYWxpdHksIHBsZWFzZSBydW4gdGhlIGFwcGxpY2F0aW9uIGluIGRlc2t0b3AgbW9kZS5cXG5Nb3JlIGluZm9ybWF0aW9uIGF0OiBodHRwczovL3YzLndhaWxzLmlvL2xlYXJuL2J1aWxkLyN1c2luZy1hLWJyb3dzZXItZm9yLWRldmVsb3BtZW50XFxuJyxcbiAgICAgICAgJ2JhY2tncm91bmQ6ICNmZmZmZmY7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgcGFkZGluZzogNHB4IDhweDsgYm9yZGVyLXJhZGl1czogNHB4OyBib3JkZXI6IDJweCBzb2xpZCAjMDAwMDAwOycsXG4gICAgICAgICdiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsnLFxuICAgICAgICAnY29sb3I6ICNmZmZmZmY7IGZvbnQtc3R5bGU6IGl0YWxpYzsgZm9udC13ZWlnaHQ6IGJvbGQ7Jyk7XG4gICAgcmV0dXJuIG51bGw7XG59KSgpO1xuXG5leHBvcnQgZnVuY3Rpb24gaW52b2tlKG1zZzogYW55KTogdm9pZCB7XG4gICAgX2ludm9rZT8uKG1zZyk7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBzeXN0ZW0gZGFyayBtb2RlIHN0YXR1cy5cbiAqXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyBpZiB0aGUgc3lzdGVtIGlzIGluIGRhcmsgbW9kZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIElzRGFya01vZGUoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIGNhbGwoU3lzdGVtSXNEYXJrTW9kZSk7XG59XG5cbi8qKlxuICogRmV0Y2hlcyB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZSBhcHBsaWNhdGlvbiBmcm9tIHRoZSBzZXJ2ZXIuXG4gKlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGNhcGFiaWxpdGllcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIENhcGFiaWxpdGllcygpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcIi93YWlscy9jYXBhYmlsaXRpZXNcIik7XG4gICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY291bGQgbm90IGZldGNoIGNhcGFiaWxpdGllczogXCIgKyByZXNwb25zZS5zdGF0dXNUZXh0KTtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT1NJbmZvIHtcbiAgICAvKiogVGhlIGJyYW5kaW5nIG9mIHRoZSBPUy4gKi9cbiAgICBCcmFuZGluZzogc3RyaW5nO1xuICAgIC8qKiBUaGUgSUQgb2YgdGhlIE9TLiAqL1xuICAgIElEOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBPUy4gKi9cbiAgICBOYW1lOiBzdHJpbmc7XG4gICAgLyoqIFRoZSB2ZXJzaW9uIG9mIHRoZSBPUy4gKi9cbiAgICBWZXJzaW9uOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW52aXJvbm1lbnRJbmZvIHtcbiAgICAvKiogVGhlIGFyY2hpdGVjdHVyZSBvZiB0aGUgc3lzdGVtLiAqL1xuICAgIEFyY2g6IHN0cmluZztcbiAgICAvKiogVHJ1ZSBpZiB0aGUgYXBwbGljYXRpb24gaXMgcnVubmluZyBpbiBkZWJ1ZyBtb2RlLCBvdGhlcndpc2UgZmFsc2UuICovXG4gICAgRGVidWc6IGJvb2xlYW47XG4gICAgLyoqIFRoZSBvcGVyYXRpbmcgc3lzdGVtIGluIHVzZS4gKi9cbiAgICBPUzogc3RyaW5nO1xuICAgIC8qKiBEZXRhaWxzIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtLiAqL1xuICAgIE9TSW5mbzogT1NJbmZvO1xuICAgIC8qKiBBZGRpdGlvbmFsIHBsYXRmb3JtIGluZm9ybWF0aW9uLiAqL1xuICAgIFBsYXRmb3JtSW5mbzogUmVjb3JkPHN0cmluZywgYW55Pjtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgZW52aXJvbm1lbnQgZGV0YWlscy5cbiAqXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBvYmplY3QgY29udGFpbmluZyBPUyBhbmQgc3lzdGVtIGFyY2hpdGVjdHVyZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEVudmlyb25tZW50KCk6IFByb21pc2U8RW52aXJvbm1lbnRJbmZvPiB7XG4gICAgcmV0dXJuIGNhbGwoU3lzdGVtRW52aXJvbm1lbnQpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgY3VycmVudCBvcGVyYXRpbmcgc3lzdGVtIGlzIFdpbmRvd3MuXG4gKlxuICogQHJldHVybiBUcnVlIGlmIHRoZSBvcGVyYXRpbmcgc3lzdGVtIGlzIFdpbmRvd3MsIG90aGVyd2lzZSBmYWxzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIElzV2luZG93cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gd2luZG93Ll93YWlscy5lbnZpcm9ubWVudC5PUyA9PT0gXCJ3aW5kb3dzXCI7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBjdXJyZW50IG9wZXJhdGluZyBzeXN0ZW0gaXMgTGludXguXG4gKlxuICogQHJldHVybnMgUmV0dXJucyB0cnVlIGlmIHRoZSBjdXJyZW50IG9wZXJhdGluZyBzeXN0ZW0gaXMgTGludXgsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIElzTGludXgoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHdpbmRvdy5fd2FpbHMuZW52aXJvbm1lbnQuT1MgPT09IFwibGludXhcIjtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgaXMgYSBtYWNPUyBvcGVyYXRpbmcgc3lzdGVtLlxuICpcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGVudmlyb25tZW50IGlzIG1hY09TLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBJc01hYygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gd2luZG93Ll93YWlscy5lbnZpcm9ubWVudC5PUyA9PT0gXCJkYXJ3aW5cIjtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgYXJjaGl0ZWN0dXJlIGlzIEFNRDY0LlxuICpcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgYXJjaGl0ZWN0dXJlIGlzIEFNRDY0LCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBJc0FNRDY0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB3aW5kb3cuX3dhaWxzLmVudmlyb25tZW50LkFyY2ggPT09IFwiYW1kNjRcIjtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGN1cnJlbnQgYXJjaGl0ZWN0dXJlIGlzIEFSTS5cbiAqXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBjdXJyZW50IGFyY2hpdGVjdHVyZSBpcyBBUk0sIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIElzQVJNKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB3aW5kb3cuX3dhaWxzLmVudmlyb25tZW50LkFyY2ggPT09IFwiYXJtXCI7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBjdXJyZW50IGVudmlyb25tZW50IGlzIEFSTTY0IGFyY2hpdGVjdHVyZS5cbiAqXG4gKiBAcmV0dXJucyBSZXR1cm5zIHRydWUgaWYgdGhlIGVudmlyb25tZW50IGlzIEFSTTY0IGFyY2hpdGVjdHVyZSwgb3RoZXJ3aXNlIHJldHVybnMgZmFsc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBJc0FSTTY0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB3aW5kb3cuX3dhaWxzLmVudmlyb25tZW50LkFyY2ggPT09IFwiYXJtNjRcIjtcbn1cblxuLyoqXG4gKiBSZXBvcnRzIHdoZXRoZXIgdGhlIGFwcCBpcyBiZWluZyBydW4gaW4gZGVidWcgbW9kZS5cbiAqXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBhcHAgaXMgYmVpbmcgcnVuIGluIGRlYnVnIG1vZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBJc0RlYnVnKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBCb29sZWFuKHdpbmRvdy5fd2FpbHMuZW52aXJvbm1lbnQuRGVidWcpO1xufVxuXG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbmltcG9ydCB7IG5ld1J1bnRpbWVDYWxsZXIsIG9iamVjdE5hbWVzIH0gZnJvbSBcIi4vcnVudGltZS5qc1wiO1xuaW1wb3J0IHsgSXNEZWJ1ZyB9IGZyb20gXCIuL3N5c3RlbS5qc1wiO1xuaW1wb3J0IHsgZXZlbnRUYXJnZXQgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG4vLyBzZXR1cFxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgY29udGV4dE1lbnVIYW5kbGVyKTtcblxuY29uc3QgY2FsbCA9IG5ld1J1bnRpbWVDYWxsZXIob2JqZWN0TmFtZXMuQ29udGV4dE1lbnUpO1xuXG5jb25zdCBDb250ZXh0TWVudU9wZW4gPSAwO1xuXG5mdW5jdGlvbiBvcGVuQ29udGV4dE1lbnUoaWQ6IHN0cmluZywgeDogbnVtYmVyLCB5OiBudW1iZXIsIGRhdGE6IGFueSk6IHZvaWQge1xuICAgIHZvaWQgY2FsbChDb250ZXh0TWVudU9wZW4sIHtpZCwgeCwgeSwgZGF0YX0pO1xufVxuXG5mdW5jdGlvbiBjb250ZXh0TWVudUhhbmRsZXIoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudFRhcmdldChldmVudCk7XG5cbiAgICAvLyBDaGVjayBmb3IgY3VzdG9tIGNvbnRleHQgbWVudVxuICAgIGNvbnN0IGN1c3RvbUNvbnRleHRNZW51ID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUodGFyZ2V0KS5nZXRQcm9wZXJ0eVZhbHVlKFwiLS1jdXN0b20tY29udGV4dG1lbnVcIikudHJpbSgpO1xuXG4gICAgaWYgKGN1c3RvbUNvbnRleHRNZW51KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXQpLmdldFByb3BlcnR5VmFsdWUoXCItLWN1c3RvbS1jb250ZXh0bWVudS1kYXRhXCIpO1xuICAgICAgICBvcGVuQ29udGV4dE1lbnUoY3VzdG9tQ29udGV4dE1lbnUsIGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFksIGRhdGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHByb2Nlc3NEZWZhdWx0Q29udGV4dE1lbnUoZXZlbnQsIHRhcmdldCk7XG4gICAgfVxufVxuXG5cbi8qXG4tLWRlZmF1bHQtY29udGV4dG1lbnU6IGF1dG87IChkZWZhdWx0KSB3aWxsIHNob3cgdGhlIGRlZmF1bHQgY29udGV4dCBtZW51IGlmIGNvbnRlbnRFZGl0YWJsZSBpcyB0cnVlIE9SIHRleHQgaGFzIGJlZW4gc2VsZWN0ZWQgT1IgZWxlbWVudCBpcyBpbnB1dCBvciB0ZXh0YXJlYVxuLS1kZWZhdWx0LWNvbnRleHRtZW51OiBzaG93OyB3aWxsIGFsd2F5cyBzaG93IHRoZSBkZWZhdWx0IGNvbnRleHQgbWVudVxuLS1kZWZhdWx0LWNvbnRleHRtZW51OiBoaWRlOyB3aWxsIGFsd2F5cyBoaWRlIHRoZSBkZWZhdWx0IGNvbnRleHQgbWVudVxuXG5UaGlzIHJ1bGUgaXMgaW5oZXJpdGVkIGxpa2Ugbm9ybWFsIENTUyBydWxlcywgc28gbmVzdGluZyB3b3JrcyBhcyBleHBlY3RlZFxuKi9cbmZ1bmN0aW9uIHByb2Nlc3NEZWZhdWx0Q29udGV4dE1lbnUoZXZlbnQ6IE1vdXNlRXZlbnQsIHRhcmdldDogSFRNTEVsZW1lbnQpIHtcbiAgICAvLyBEZWJ1ZyBidWlsZHMgYWx3YXlzIHNob3cgdGhlIG1lbnVcbiAgICBpZiAoSXNEZWJ1ZygpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBQcm9jZXNzIGRlZmF1bHQgY29udGV4dCBtZW51XG4gICAgc3dpdGNoICh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXQpLmdldFByb3BlcnR5VmFsdWUoXCItLWRlZmF1bHQtY29udGV4dG1lbnVcIikudHJpbSgpKSB7XG4gICAgICAgIGNhc2UgJ3Nob3cnOlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjYXNlICdoaWRlJzpcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgY29udGVudEVkaXRhYmxlIGlzIHRydWVcbiAgICBpZiAodGFyZ2V0LmlzQ29udGVudEVkaXRhYmxlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB0ZXh0IGhhcyBiZWVuIHNlbGVjdGVkXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgIGNvbnN0IGhhc1NlbGVjdGlvbiA9IHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24udG9TdHJpbmcoKS5sZW5ndGggPiAwO1xuICAgIGlmIChoYXNTZWxlY3Rpb24pIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3Rpb24ucmFuZ2VDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KGkpO1xuICAgICAgICAgICAgY29uc3QgcmVjdHMgPSByYW5nZS5nZXRDbGllbnRSZWN0cygpO1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByZWN0cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlY3QgPSByZWN0c1tqXTtcbiAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludChyZWN0LmxlZnQsIHJlY3QudG9wKSA9PT0gdGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB0YWcgaXMgaW5wdXQgb3IgdGV4dGFyZWEuXG4gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgfHwgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTFRleHRBcmVhRWxlbWVudCkge1xuICAgICAgICBpZiAoaGFzU2VsZWN0aW9uIHx8ICghdGFyZ2V0LnJlYWRPbmx5ICYmICF0YXJnZXQuZGlzYWJsZWQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBoaWRlIGRlZmF1bHQgY29udGV4dCBtZW51XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbn1cbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSBmcm9tIHRoZSBmbGFnIG1hcC5cbiAqXG4gKiBAcGFyYW0ga2V5IC0gVGhlIGtleSB0byByZXRyaWV2ZSB0aGUgdmFsdWUgZm9yLlxuICogQHJldHVybiBUaGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gR2V0RmxhZyhrZXk6IHN0cmluZyk6IGFueSB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5fd2FpbHMuZmxhZ3Nba2V5XTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuYWJsZSB0byByZXRyaWV2ZSBmbGFnICdcIiArIGtleSArIFwiJzogXCIgKyBlLCB7IGNhdXNlOiBlIH0pO1xuICAgIH1cbn1cbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuaW1wb3J0IHsgaW52b2tlLCBJc1dpbmRvd3MgfSBmcm9tIFwiLi9zeXN0ZW0uanNcIjtcbmltcG9ydCB7IEdldEZsYWcgfSBmcm9tIFwiLi9mbGFncy5qc1wiO1xuaW1wb3J0IHsgY2FuVHJhY2tCdXR0b25zLCBldmVudFRhcmdldCB9IGZyb20gXCIuL3V0aWxzLmpzXCI7XG5cbi8vIFNldHVwXG5sZXQgY2FuRHJhZyA9IGZhbHNlO1xubGV0IGRyYWdnaW5nID0gZmFsc2U7XG5cbmxldCByZXNpemFibGUgPSBmYWxzZTtcbmxldCBjYW5SZXNpemUgPSBmYWxzZTtcbmxldCByZXNpemluZyA9IGZhbHNlO1xubGV0IHJlc2l6ZUVkZ2U6IHN0cmluZyA9IFwiXCI7XG5sZXQgZGVmYXVsdEN1cnNvciA9IFwiYXV0b1wiO1xuXG5sZXQgYnV0dG9ucyA9IDA7XG5jb25zdCBidXR0b25zVHJhY2tlZCA9IGNhblRyYWNrQnV0dG9ucygpO1xuXG53aW5kb3cuX3dhaWxzID0gd2luZG93Ll93YWlscyB8fCB7fTtcbndpbmRvdy5fd2FpbHMuc2V0UmVzaXphYmxlID0gKHZhbHVlOiBib29sZWFuKTogdm9pZCA9PiB7XG4gICAgcmVzaXphYmxlID0gdmFsdWU7XG4gICAgaWYgKCFyZXNpemFibGUpIHtcbiAgICAgICAgLy8gU3RvcCByZXNpemluZyBpZiBpbiBwcm9ncmVzcy5cbiAgICAgICAgY2FuUmVzaXplID0gcmVzaXppbmcgPSBmYWxzZTtcbiAgICAgICAgc2V0UmVzaXplKCk7XG4gICAgfVxufTtcblxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHVwZGF0ZSwgeyBjYXB0dXJlOiB0cnVlIH0pO1xud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHVwZGF0ZSwgeyBjYXB0dXJlOiB0cnVlIH0pO1xud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB1cGRhdGUsIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbmZvciAoY29uc3QgZXYgb2YgWydjbGljaycsICdjb250ZXh0bWVudScsICdkYmxjbGljayddKSB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoZXYsIHN1cHByZXNzRXZlbnQsIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbn1cblxuZnVuY3Rpb24gc3VwcHJlc3NFdmVudChldmVudDogRXZlbnQpIHtcbiAgICAvLyBTdXBwcmVzcyBjbGljayBldmVudHMgd2hpbGUgcmVzaXppbmcgb3IgZHJhZ2dpbmcuXG4gICAgaWYgKGRyYWdnaW5nIHx8IHJlc2l6aW5nKSB7XG4gICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG59XG5cbi8vIFVzZSBjb25zdGFudHMgdG8gYXZvaWQgY29tcGFyaW5nIHN0cmluZ3MgbXVsdGlwbGUgdGltZXMuXG5jb25zdCBNb3VzZURvd24gPSAwO1xuY29uc3QgTW91c2VVcCAgID0gMTtcbmNvbnN0IE1vdXNlTW92ZSA9IDI7XG5cbmZ1bmN0aW9uIHVwZGF0ZShldmVudDogTW91c2VFdmVudCkge1xuICAgIC8vIFdpbmRvd3Mgc3VwcHJlc3NlcyBtb3VzZSBldmVudHMgYXQgdGhlIGVuZCBvZiBkcmFnZ2luZyBvciByZXNpemluZyxcbiAgICAvLyBzbyB3ZSBuZWVkIHRvIGJlIHNtYXJ0IGFuZCBzeW50aGVzaXplIGJ1dHRvbiBldmVudHMuXG5cbiAgICBsZXQgZXZlbnRUeXBlOiBudW1iZXIsIGV2ZW50QnV0dG9ucyA9IGV2ZW50LmJ1dHRvbnM7XG4gICAgc3dpdGNoIChldmVudC50eXBlKSB7XG4gICAgICAgIGNhc2UgJ21vdXNlZG93bic6XG4gICAgICAgICAgICBldmVudFR5cGUgPSBNb3VzZURvd247XG4gICAgICAgICAgICBpZiAoIWJ1dHRvbnNUcmFja2VkKSB7IGV2ZW50QnV0dG9ucyA9IGJ1dHRvbnMgfCAoMSA8PCBldmVudC5idXR0b24pOyB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbW91c2V1cCc6XG4gICAgICAgICAgICBldmVudFR5cGUgPSBNb3VzZVVwO1xuICAgICAgICAgICAgaWYgKCFidXR0b25zVHJhY2tlZCkgeyBldmVudEJ1dHRvbnMgPSBidXR0b25zICYgfigxIDw8IGV2ZW50LmJ1dHRvbik7IH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgZXZlbnRUeXBlID0gTW91c2VNb3ZlO1xuICAgICAgICAgICAgaWYgKCFidXR0b25zVHJhY2tlZCkgeyBldmVudEJ1dHRvbnMgPSBidXR0b25zOyB9XG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBsZXQgcmVsZWFzZWQgPSBidXR0b25zICYgfmV2ZW50QnV0dG9ucztcbiAgICBsZXQgcHJlc3NlZCA9IGV2ZW50QnV0dG9ucyAmIH5idXR0b25zO1xuXG4gICAgYnV0dG9ucyA9IGV2ZW50QnV0dG9ucztcblxuICAgIC8vIFN5bnRoZXNpemUgYSByZWxlYXNlLXByZXNzIHNlcXVlbmNlIGlmIHdlIGRldGVjdCBhIHByZXNzIG9mIGFuIGFscmVhZHkgcHJlc3NlZCBidXR0b24uXG4gICAgaWYgKGV2ZW50VHlwZSA9PT0gTW91c2VEb3duICYmICEocHJlc3NlZCAmIGV2ZW50LmJ1dHRvbikpIHtcbiAgICAgICAgcmVsZWFzZWQgfD0gKDEgPDwgZXZlbnQuYnV0dG9uKTtcbiAgICAgICAgcHJlc3NlZCB8PSAoMSA8PCBldmVudC5idXR0b24pO1xuICAgIH1cblxuICAgIC8vIFN1cHByZXNzIGFsbCBidXR0b24gZXZlbnRzIGR1cmluZyBkcmFnZ2luZyBhbmQgcmVzaXppbmcsXG4gICAgLy8gdW5sZXNzIHRoaXMgaXMgYSBtb3VzZXVwIGV2ZW50IHRoYXQgaXMgZW5kaW5nIGEgZHJhZyBhY3Rpb24uXG4gICAgaWYgKFxuICAgICAgICBldmVudFR5cGUgIT09IE1vdXNlTW92ZSAvLyBGYXN0IHBhdGggZm9yIG1vdXNlbW92ZVxuICAgICAgICAmJiByZXNpemluZ1xuICAgICAgICB8fCAoXG4gICAgICAgICAgICBkcmFnZ2luZ1xuICAgICAgICAgICAgJiYgKFxuICAgICAgICAgICAgICAgIGV2ZW50VHlwZSA9PT0gTW91c2VEb3duXG4gICAgICAgICAgICAgICAgfHwgZXZlbnQuYnV0dG9uICE9PSAwXG4gICAgICAgICAgICApXG4gICAgICAgIClcbiAgICApIHtcbiAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSByZWxlYXNlc1xuICAgIGlmIChyZWxlYXNlZCAmIDEpIHsgcHJpbWFyeVVwKGV2ZW50KTsgfVxuICAgIC8vIEhhbmRsZSBwcmVzc2VzXG4gICAgaWYgKHByZXNzZWQgJiAxKSB7IHByaW1hcnlEb3duKGV2ZW50KTsgfVxuXG4gICAgLy8gSGFuZGxlIG1vdXNlbW92ZVxuICAgIGlmIChldmVudFR5cGUgPT09IE1vdXNlTW92ZSkgeyBvbk1vdXNlTW92ZShldmVudCk7IH07XG59XG5cbmZ1bmN0aW9uIHByaW1hcnlEb3duKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgLy8gUmVzZXQgcmVhZGluZXNzIHN0YXRlLlxuICAgIGNhbkRyYWcgPSBmYWxzZTtcbiAgICBjYW5SZXNpemUgPSBmYWxzZTtcblxuICAgIC8vIElnbm9yZSByZXBlYXRlZCBjbGlja3Mgb24gbWFjT1MgYW5kIExpbnV4LlxuICAgIGlmICghSXNXaW5kb3dzKCkpIHtcbiAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdtb3VzZWRvd24nICYmIGV2ZW50LmJ1dHRvbiA9PT0gMCAmJiBldmVudC5kZXRhaWwgIT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyZXNpemVFZGdlKSB7XG4gICAgICAgIC8vIFJlYWR5IHRvIHJlc2l6ZSBpZiB0aGUgcHJpbWFyeSBidXR0b24gd2FzIHByZXNzZWQgZm9yIHRoZSBmaXJzdCB0aW1lLlxuICAgICAgICBjYW5SZXNpemUgPSB0cnVlO1xuICAgICAgICAvLyBEbyBub3Qgc3RhcnQgZHJhZyBvcGVyYXRpb25zIHdoZW4gb24gcmVzaXplIGVkZ2VzLlxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUmV0cmlldmUgdGFyZ2V0IGVsZW1lbnRcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudFRhcmdldChldmVudCk7XG5cbiAgICAvLyBSZWFkeSB0byBkcmFnIGlmIHRoZSBwcmltYXJ5IGJ1dHRvbiB3YXMgcHJlc3NlZCBmb3IgdGhlIGZpcnN0IHRpbWUgb24gYSBkcmFnZ2FibGUgZWxlbWVudC5cbiAgICAvLyBJZ25vcmUgY2xpY2tzIG9uIHRoZSBzY3JvbGxiYXIuXG4gICAgY29uc3Qgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXQpO1xuICAgIGNhbkRyYWcgPSAoXG4gICAgICAgIHN0eWxlLmdldFByb3BlcnR5VmFsdWUoXCItLXdhaWxzLWRyYWdnYWJsZVwiKS50cmltKCkgPT09IFwiZHJhZ1wiXG4gICAgICAgICYmIChcbiAgICAgICAgICAgIGV2ZW50Lm9mZnNldFggLSBwYXJzZUZsb2F0KHN0eWxlLnBhZGRpbmdMZWZ0KSA8IHRhcmdldC5jbGllbnRXaWR0aFxuICAgICAgICAgICAgJiYgZXZlbnQub2Zmc2V0WSAtIHBhcnNlRmxvYXQoc3R5bGUucGFkZGluZ1RvcCkgPCB0YXJnZXQuY2xpZW50SGVpZ2h0XG4gICAgICAgIClcbiAgICApO1xufVxuXG5mdW5jdGlvbiBwcmltYXJ5VXAoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICAvLyBTdG9wIGRyYWdnaW5nIGFuZCByZXNpemluZy5cbiAgICBjYW5EcmFnID0gZmFsc2U7XG4gICAgZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICBjYW5SZXNpemUgPSBmYWxzZTtcbiAgICByZXNpemluZyA9IGZhbHNlO1xufVxuXG5jb25zdCBjdXJzb3JGb3JFZGdlID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgXCJzZS1yZXNpemVcIjogXCJud3NlLXJlc2l6ZVwiLFxuICAgIFwic3ctcmVzaXplXCI6IFwibmVzdy1yZXNpemVcIixcbiAgICBcIm53LXJlc2l6ZVwiOiBcIm53c2UtcmVzaXplXCIsXG4gICAgXCJuZS1yZXNpemVcIjogXCJuZXN3LXJlc2l6ZVwiLFxuICAgIFwidy1yZXNpemVcIjogXCJldy1yZXNpemVcIixcbiAgICBcIm4tcmVzaXplXCI6IFwibnMtcmVzaXplXCIsXG4gICAgXCJzLXJlc2l6ZVwiOiBcIm5zLXJlc2l6ZVwiLFxuICAgIFwiZS1yZXNpemVcIjogXCJldy1yZXNpemVcIixcbn0pXG5cbmZ1bmN0aW9uIHNldFJlc2l6ZShlZGdlPzoga2V5b2YgdHlwZW9mIGN1cnNvckZvckVkZ2UpOiB2b2lkIHtcbiAgICBpZiAoZWRnZSkge1xuICAgICAgICBpZiAoIXJlc2l6ZUVkZ2UpIHsgZGVmYXVsdEN1cnNvciA9IGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yOyB9XG4gICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yID0gY3Vyc29yRm9yRWRnZVtlZGdlXTtcbiAgICB9IGVsc2UgaWYgKCFlZGdlICYmIHJlc2l6ZUVkZ2UpIHtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3IgPSBkZWZhdWx0Q3Vyc29yO1xuICAgIH1cblxuICAgIHJlc2l6ZUVkZ2UgPSBlZGdlIHx8IFwiXCI7XG59XG5cbmZ1bmN0aW9uIG9uTW91c2VNb3ZlKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGNhblJlc2l6ZSAmJiByZXNpemVFZGdlKSB7XG4gICAgICAgIC8vIFN0YXJ0IHJlc2l6aW5nLlxuICAgICAgICByZXNpemluZyA9IHRydWU7XG4gICAgICAgIGludm9rZShcIndhaWxzOnJlc2l6ZTpcIiArIHJlc2l6ZUVkZ2UpO1xuICAgIH0gZWxzZSBpZiAoY2FuRHJhZykge1xuICAgICAgICAvLyBTdGFydCBkcmFnZ2luZy5cbiAgICAgICAgZHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgICBpbnZva2UoXCJ3YWlsczpkcmFnXCIpO1xuICAgIH1cblxuICAgIGlmIChkcmFnZ2luZyB8fCByZXNpemluZykge1xuICAgICAgICAvLyBFaXRoZXIgZHJhZyBvciByZXNpemUgaXMgb25nb2luZyxcbiAgICAgICAgLy8gcmVzZXQgcmVhZGluZXNzIGFuZCBzdG9wIHByb2Nlc3NpbmcuXG4gICAgICAgIGNhbkRyYWcgPSBjYW5SZXNpemUgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghcmVzaXphYmxlIHx8ICFJc1dpbmRvd3MoKSkge1xuICAgICAgICBpZiAocmVzaXplRWRnZSkgeyBzZXRSZXNpemUoKTsgfVxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmVzaXplSGFuZGxlSGVpZ2h0ID0gR2V0RmxhZyhcInN5c3RlbS5yZXNpemVIYW5kbGVIZWlnaHRcIikgfHwgNTtcbiAgICBjb25zdCByZXNpemVIYW5kbGVXaWR0aCA9IEdldEZsYWcoXCJzeXN0ZW0ucmVzaXplSGFuZGxlV2lkdGhcIikgfHwgNTtcblxuICAgIC8vIEV4dHJhIHBpeGVscyBmb3IgdGhlIGNvcm5lciBhcmVhcy5cbiAgICBjb25zdCBjb3JuZXJFeHRyYSA9IEdldEZsYWcoXCJyZXNpemVDb3JuZXJFeHRyYVwiKSB8fCAxMDtcblxuICAgIGNvbnN0IHJpZ2h0Qm9yZGVyID0gKHdpbmRvdy5vdXRlcldpZHRoIC0gZXZlbnQuY2xpZW50WCkgPCByZXNpemVIYW5kbGVXaWR0aDtcbiAgICBjb25zdCBsZWZ0Qm9yZGVyID0gZXZlbnQuY2xpZW50WCA8IHJlc2l6ZUhhbmRsZVdpZHRoO1xuICAgIGNvbnN0IHRvcEJvcmRlciA9IGV2ZW50LmNsaWVudFkgPCByZXNpemVIYW5kbGVIZWlnaHQ7XG4gICAgY29uc3QgYm90dG9tQm9yZGVyID0gKHdpbmRvdy5vdXRlckhlaWdodCAtIGV2ZW50LmNsaWVudFkpIDwgcmVzaXplSGFuZGxlSGVpZ2h0O1xuXG4gICAgLy8gQWRqdXN0IGZvciBjb3JuZXIgYXJlYXMuXG4gICAgY29uc3QgcmlnaHRDb3JuZXIgPSAod2luZG93Lm91dGVyV2lkdGggLSBldmVudC5jbGllbnRYKSA8IChyZXNpemVIYW5kbGVXaWR0aCArIGNvcm5lckV4dHJhKTtcbiAgICBjb25zdCBsZWZ0Q29ybmVyID0gZXZlbnQuY2xpZW50WCA8IChyZXNpemVIYW5kbGVXaWR0aCArIGNvcm5lckV4dHJhKTtcbiAgICBjb25zdCB0b3BDb3JuZXIgPSBldmVudC5jbGllbnRZIDwgKHJlc2l6ZUhhbmRsZUhlaWdodCArIGNvcm5lckV4dHJhKTtcbiAgICBjb25zdCBib3R0b21Db3JuZXIgPSAod2luZG93Lm91dGVySGVpZ2h0IC0gZXZlbnQuY2xpZW50WSkgPCAocmVzaXplSGFuZGxlSGVpZ2h0ICsgY29ybmVyRXh0cmEpO1xuXG4gICAgaWYgKCFsZWZ0Q29ybmVyICYmICF0b3BDb3JuZXIgJiYgIWJvdHRvbUNvcm5lciAmJiAhcmlnaHRDb3JuZXIpIHtcbiAgICAgICAgLy8gT3B0aW1pc2F0aW9uOiBvdXQgb2YgYWxsIGNvcm5lciBhcmVhcyBpbXBsaWVzIG91dCBvZiBib3JkZXJzLlxuICAgICAgICBzZXRSZXNpemUoKTtcbiAgICB9XG4gICAgLy8gRGV0ZWN0IGNvcm5lcnMuXG4gICAgZWxzZSBpZiAocmlnaHRDb3JuZXIgJiYgYm90dG9tQ29ybmVyKSBzZXRSZXNpemUoXCJzZS1yZXNpemVcIik7XG4gICAgZWxzZSBpZiAobGVmdENvcm5lciAmJiBib3R0b21Db3JuZXIpIHNldFJlc2l6ZShcInN3LXJlc2l6ZVwiKTtcbiAgICBlbHNlIGlmIChsZWZ0Q29ybmVyICYmIHRvcENvcm5lcikgc2V0UmVzaXplKFwibnctcmVzaXplXCIpO1xuICAgIGVsc2UgaWYgKHRvcENvcm5lciAmJiByaWdodENvcm5lcikgc2V0UmVzaXplKFwibmUtcmVzaXplXCIpO1xuICAgIC8vIERldGVjdCBib3JkZXJzLlxuICAgIGVsc2UgaWYgKGxlZnRCb3JkZXIpIHNldFJlc2l6ZShcInctcmVzaXplXCIpO1xuICAgIGVsc2UgaWYgKHRvcEJvcmRlcikgc2V0UmVzaXplKFwibi1yZXNpemVcIik7XG4gICAgZWxzZSBpZiAoYm90dG9tQm9yZGVyKSBzZXRSZXNpemUoXCJzLXJlc2l6ZVwiKTtcbiAgICBlbHNlIGlmIChyaWdodEJvcmRlcikgc2V0UmVzaXplKFwiZS1yZXNpemVcIik7XG4gICAgLy8gT3V0IG9mIGJvcmRlciBhcmVhLlxuICAgIGVsc2Ugc2V0UmVzaXplKCk7XG59XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbmltcG9ydCB7IG5ld1J1bnRpbWVDYWxsZXIsIG9iamVjdE5hbWVzIH0gZnJvbSBcIi4vcnVudGltZS5qc1wiO1xuY29uc3QgY2FsbCA9IG5ld1J1bnRpbWVDYWxsZXIob2JqZWN0TmFtZXMuQXBwbGljYXRpb24pO1xuXG5jb25zdCBIaWRlTWV0aG9kID0gMDtcbmNvbnN0IFNob3dNZXRob2QgPSAxO1xuY29uc3QgUXVpdE1ldGhvZCA9IDI7XG5cbi8qKlxuICogSGlkZXMgYSBjZXJ0YWluIG1ldGhvZCBieSBjYWxsaW5nIHRoZSBIaWRlTWV0aG9kIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSGlkZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gY2FsbChIaWRlTWV0aG9kKTtcbn1cblxuLyoqXG4gKiBDYWxscyB0aGUgU2hvd01ldGhvZCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gU2hvdygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gY2FsbChTaG93TWV0aG9kKTtcbn1cblxuLyoqXG4gKiBDYWxscyB0aGUgUXVpdE1ldGhvZCB0byB0ZXJtaW5hdGUgdGhlIHByb2dyYW0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBRdWl0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBjYWxsKFF1aXRNZXRob2QpO1xufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5pbXBvcnQgeyBDYW5jZWxsYWJsZVByb21pc2UsIHR5cGUgQ2FuY2VsbGFibGVQcm9taXNlV2l0aFJlc29sdmVycyB9IGZyb20gXCIuL2NhbmNlbGxhYmxlLmpzXCI7XG5pbXBvcnQgeyBuZXdSdW50aW1lQ2FsbGVyLCBvYmplY3ROYW1lcyB9IGZyb20gXCIuL3J1bnRpbWUuanNcIjtcbmltcG9ydCB7IG5hbm9pZCB9IGZyb20gXCIuL25hbm9pZC5qc1wiO1xuXG4vLyBTZXR1cFxud2luZG93Ll93YWlscyA9IHdpbmRvdy5fd2FpbHMgfHwge307XG53aW5kb3cuX3dhaWxzLmNhbGxSZXN1bHRIYW5kbGVyID0gcmVzdWx0SGFuZGxlcjtcbndpbmRvdy5fd2FpbHMuY2FsbEVycm9ySGFuZGxlciA9IGVycm9ySGFuZGxlcjtcblxudHlwZSBQcm9taXNlUmVzb2x2ZXJzID0gT21pdDxDYW5jZWxsYWJsZVByb21pc2VXaXRoUmVzb2x2ZXJzPGFueT4sIFwicHJvbWlzZVwiIHwgXCJvbmNhbmNlbGxlZFwiPlxuXG5jb25zdCBjYWxsID0gbmV3UnVudGltZUNhbGxlcihvYmplY3ROYW1lcy5DYWxsKTtcbmNvbnN0IGNhbmNlbENhbGwgPSBuZXdSdW50aW1lQ2FsbGVyKG9iamVjdE5hbWVzLkNhbmNlbENhbGwpO1xuY29uc3QgY2FsbFJlc3BvbnNlcyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlUmVzb2x2ZXJzPigpO1xuXG5jb25zdCBDYWxsQmluZGluZyA9IDA7XG5jb25zdCBDYW5jZWxNZXRob2QgPSAwXG5cbi8qKlxuICogSG9sZHMgYWxsIHJlcXVpcmVkIGluZm9ybWF0aW9uIGZvciBhIGJpbmRpbmcgY2FsbC5cbiAqIE1heSBwcm92aWRlIGVpdGhlciBhIG1ldGhvZCBJRCBvciBhIG1ldGhvZCBuYW1lLCBidXQgbm90IGJvdGguXG4gKi9cbmV4cG9ydCB0eXBlIENhbGxPcHRpb25zID0ge1xuICAgIC8qKiBUaGUgbnVtZXJpYyBJRCBvZiB0aGUgYm91bmQgbWV0aG9kIHRvIGNhbGwuICovXG4gICAgbWV0aG9kSUQ6IG51bWJlcjtcbiAgICAvKiogVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBib3VuZCBtZXRob2QgdG8gY2FsbC4gKi9cbiAgICBtZXRob2ROYW1lPzogbmV2ZXI7XG4gICAgLyoqIEFyZ3VtZW50cyB0byBiZSBwYXNzZWQgaW50byB0aGUgYm91bmQgbWV0aG9kLiAqL1xuICAgIGFyZ3M6IGFueVtdO1xufSB8IHtcbiAgICAvKiogVGhlIG51bWVyaWMgSUQgb2YgdGhlIGJvdW5kIG1ldGhvZCB0byBjYWxsLiAqL1xuICAgIG1ldGhvZElEPzogbmV2ZXI7XG4gICAgLyoqIFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgYm91bmQgbWV0aG9kIHRvIGNhbGwuICovXG4gICAgbWV0aG9kTmFtZTogc3RyaW5nO1xuICAgIC8qKiBBcmd1bWVudHMgdG8gYmUgcGFzc2VkIGludG8gdGhlIGJvdW5kIG1ldGhvZC4gKi9cbiAgICBhcmdzOiBhbnlbXTtcbn07XG5cbi8qKlxuICogRXhjZXB0aW9uIGNsYXNzIHRoYXQgd2lsbCBiZSB0aHJvd24gaW4gY2FzZSB0aGUgYm91bmQgbWV0aG9kIHJldHVybnMgYW4gZXJyb3IuXG4gKiBUaGUgdmFsdWUgb2YgdGhlIHtAbGluayBSdW50aW1lRXJyb3IjbmFtZX0gcHJvcGVydHkgaXMgXCJSdW50aW1lRXJyb3JcIi5cbiAqL1xuZXhwb3J0IGNsYXNzIFJ1bnRpbWVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFJ1bnRpbWVFcnJvciBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZSAtIFRoZSBlcnJvciBtZXNzYWdlLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBiZSBmb3J3YXJkZWQgdG8gdGhlIEVycm9yIGNvbnN0cnVjdG9yLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcsIG9wdGlvbnM/OiBFcnJvck9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSwgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiUnVudGltZUVycm9yXCI7XG4gICAgfVxufVxuXG4vKipcbiAqIEhhbmRsZXMgdGhlIHJlc3VsdCBvZiBhIGNhbGwgcmVxdWVzdC5cbiAqXG4gKiBAcGFyYW0gaWQgLSBUaGUgaWQgb2YgdGhlIHJlcXVlc3QgdG8gaGFuZGxlIHRoZSByZXN1bHQgZm9yLlxuICogQHBhcmFtIGRhdGEgLSBUaGUgcmVzdWx0IGRhdGEgb2YgdGhlIHJlcXVlc3QuXG4gKiBAcGFyYW0gaXNKU09OIC0gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRhdGEgaXMgSlNPTiBvciBub3QuXG4gKi9cbmZ1bmN0aW9uIHJlc3VsdEhhbmRsZXIoaWQ6IHN0cmluZywgZGF0YTogc3RyaW5nLCBpc0pTT046IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCByZXNvbHZlcnMgPSBnZXRBbmREZWxldGVSZXNwb25zZShpZCk7XG4gICAgaWYgKCFyZXNvbHZlcnMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghZGF0YSkge1xuICAgICAgICByZXNvbHZlcnMucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgIH0gZWxzZSBpZiAoIWlzSlNPTikge1xuICAgICAgICByZXNvbHZlcnMucmVzb2x2ZShkYXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzb2x2ZXJzLnJlc29sdmUoSlNPTi5wYXJzZShkYXRhKSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgICAgICByZXNvbHZlcnMucmVqZWN0KG5ldyBUeXBlRXJyb3IoXCJjb3VsZCBub3QgcGFyc2UgcmVzdWx0OiBcIiArIGVyci5tZXNzYWdlLCB7IGNhdXNlOiBlcnIgfSkpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIEhhbmRsZXMgdGhlIGVycm9yIGZyb20gYSBjYWxsIHJlcXVlc3QuXG4gKlxuICogQHBhcmFtIGlkIC0gVGhlIGlkIG9mIHRoZSBwcm9taXNlIGhhbmRsZXIuXG4gKiBAcGFyYW0gZGF0YSAtIFRoZSBlcnJvciBkYXRhIHRvIHJlamVjdCB0aGUgcHJvbWlzZSBoYW5kbGVyIHdpdGguXG4gKiBAcGFyYW0gaXNKU09OIC0gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRhdGEgaXMgSlNPTiBvciBub3QuXG4gKi9cbmZ1bmN0aW9uIGVycm9ySGFuZGxlcihpZDogc3RyaW5nLCBkYXRhOiBzdHJpbmcsIGlzSlNPTjogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IHJlc29sdmVycyA9IGdldEFuZERlbGV0ZVJlc3BvbnNlKGlkKTtcbiAgICBpZiAoIXJlc29sdmVycykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFpc0pTT04pIHtcbiAgICAgICAgcmVzb2x2ZXJzLnJlamVjdChuZXcgRXJyb3IoZGF0YSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBlcnJvcjogYW55O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZXJyb3IgPSBKU09OLnBhcnNlKGRhdGEpO1xuICAgICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICAgICAgcmVzb2x2ZXJzLnJlamVjdChuZXcgVHlwZUVycm9yKFwiY291bGQgbm90IHBhcnNlIGVycm9yOiBcIiArIGVyci5tZXNzYWdlLCB7IGNhdXNlOiBlcnIgfSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG9wdGlvbnM6IEVycm9yT3B0aW9ucyA9IHt9O1xuICAgICAgICBpZiAoZXJyb3IuY2F1c2UpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuY2F1c2UgPSBlcnJvci5jYXVzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBleGNlcHRpb247XG4gICAgICAgIHN3aXRjaCAoZXJyb3Iua2luZCkge1xuICAgICAgICAgICAgY2FzZSBcIlJlZmVyZW5jZUVycm9yXCI6XG4gICAgICAgICAgICAgICAgZXhjZXB0aW9uID0gbmV3IFJlZmVyZW5jZUVycm9yKGVycm9yLm1lc3NhZ2UsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIlR5cGVFcnJvclwiOlxuICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiA9IG5ldyBUeXBlRXJyb3IoZXJyb3IubWVzc2FnZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiUnVudGltZUVycm9yXCI6XG4gICAgICAgICAgICAgICAgZXhjZXB0aW9uID0gbmV3IFJ1bnRpbWVFcnJvcihlcnJvci5tZXNzYWdlLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgZXhjZXB0aW9uID0gbmV3IEVycm9yKGVycm9yLm1lc3NhZ2UsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzb2x2ZXJzLnJlamVjdChleGNlcHRpb24pO1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgYW5kIHJlbW92ZXMgdGhlIHJlc3BvbnNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gSUQgZnJvbSB0aGUgY2FsbFJlc3BvbnNlcyBtYXAuXG4gKlxuICogQHBhcmFtIGlkIC0gVGhlIElEIG9mIHRoZSByZXNwb25zZSB0byBiZSByZXRyaWV2ZWQgYW5kIHJlbW92ZWQuXG4gKiBAcmV0dXJucyBUaGUgcmVzcG9uc2Ugb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gSUQsIGlmIGFueS5cbiAqL1xuZnVuY3Rpb24gZ2V0QW5kRGVsZXRlUmVzcG9uc2UoaWQ6IHN0cmluZyk6IFByb21pc2VSZXNvbHZlcnMgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gY2FsbFJlc3BvbnNlcy5nZXQoaWQpO1xuICAgIGNhbGxSZXNwb25zZXMuZGVsZXRlKGlkKTtcbiAgICByZXR1cm4gcmVzcG9uc2U7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgdW5pcXVlIElEIHVzaW5nIHRoZSBuYW5vaWQgbGlicmFyeS5cbiAqXG4gKiBAcmV0dXJucyBBIHVuaXF1ZSBJRCB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBjYWxsUmVzcG9uc2VzIHNldC5cbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVJRCgpOiBzdHJpbmcge1xuICAgIGxldCByZXN1bHQ7XG4gICAgZG8ge1xuICAgICAgICByZXN1bHQgPSBuYW5vaWQoKTtcbiAgICB9IHdoaWxlIChjYWxsUmVzcG9uc2VzLmhhcyhyZXN1bHQpKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIENhbGwgYSBib3VuZCBtZXRob2QgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBjYWxsIG9wdGlvbnMuXG4gKlxuICogSW4gY2FzZSBvZiBmYWlsdXJlLCB0aGUgcmV0dXJuZWQgcHJvbWlzZSB3aWxsIHJlamVjdCB3aXRoIGFuIGV4Y2VwdGlvblxuICogYW1vbmcgUmVmZXJlbmNlRXJyb3IgKHVua25vd24gbWV0aG9kKSwgVHlwZUVycm9yICh3cm9uZyBhcmd1bWVudCBjb3VudCBvciB0eXBlKSxcbiAqIHtAbGluayBSdW50aW1lRXJyb3J9IChtZXRob2QgcmV0dXJuZWQgYW4gZXJyb3IpLCBvciBvdGhlciAobmV0d29yayBvciBpbnRlcm5hbCBlcnJvcnMpLlxuICogVGhlIGV4Y2VwdGlvbiBtaWdodCBoYXZlIGEgXCJjYXVzZVwiIGZpZWxkIHdpdGggdGhlIHZhbHVlIHJldHVybmVkXG4gKiBieSB0aGUgYXBwbGljYXRpb24tIG9yIHNlcnZpY2UtbGV2ZWwgZXJyb3IgbWFyc2hhbGluZyBmdW5jdGlvbnMuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBBIG1ldGhvZCBjYWxsIGRlc2NyaXB0b3IuXG4gKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIHRoZSBjYWxsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQ2FsbChvcHRpb25zOiBDYWxsT3B0aW9ucyk6IENhbmNlbGxhYmxlUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBpZCA9IGdlbmVyYXRlSUQoKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IENhbmNlbGxhYmxlUHJvbWlzZS53aXRoUmVzb2x2ZXJzPGFueT4oKTtcbiAgICBjYWxsUmVzcG9uc2VzLnNldChpZCwgeyByZXNvbHZlOiByZXN1bHQucmVzb2x2ZSwgcmVqZWN0OiByZXN1bHQucmVqZWN0IH0pO1xuXG4gICAgY29uc3QgcmVxdWVzdCA9IGNhbGwoQ2FsbEJpbmRpbmcsIE9iamVjdC5hc3NpZ24oeyBcImNhbGwtaWRcIjogaWQgfSwgb3B0aW9ucykpO1xuICAgIGxldCBydW5uaW5nID0gZmFsc2U7XG5cbiAgICByZXF1ZXN0LnRoZW4oKCkgPT4ge1xuICAgICAgICBydW5uaW5nID0gdHJ1ZTtcbiAgICB9LCAoZXJyKSA9PiB7XG4gICAgICAgIGNhbGxSZXNwb25zZXMuZGVsZXRlKGlkKTtcbiAgICAgICAgcmVzdWx0LnJlamVjdChlcnIpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgY2FuY2VsID0gKCkgPT4ge1xuICAgICAgICBjYWxsUmVzcG9uc2VzLmRlbGV0ZShpZCk7XG4gICAgICAgIHJldHVybiBjYW5jZWxDYWxsKENhbmNlbE1ldGhvZCwge1wiY2FsbC1pZFwiOiBpZH0pLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciB3aGlsZSByZXF1ZXN0aW5nIGJpbmRpbmcgY2FsbCBjYW5jZWxsYXRpb246XCIsIGVycik7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICByZXN1bHQub25jYW5jZWxsZWQgPSAoKSA9PiB7XG4gICAgICAgIGlmIChydW5uaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FuY2VsKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcmVxdWVzdC50aGVuKGNhbmNlbCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIHJlc3VsdC5wcm9taXNlO1xufVxuXG4vKipcbiAqIENhbGxzIGEgYm91bmQgbWV0aG9kIGJ5IG5hbWUgd2l0aCB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50cy5cbiAqIFNlZSB7QGxpbmsgQ2FsbH0gZm9yIGRldGFpbHMuXG4gKlxuICogQHBhcmFtIG1ldGhvZE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgbWV0aG9kIGluIHRoZSBmb3JtYXQgJ3BhY2thZ2Uuc3RydWN0Lm1ldGhvZCcuXG4gKiBAcGFyYW0gYXJncyAtIFRoZSBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgbWV0aG9kLlxuICogQHJldHVybnMgVGhlIHJlc3VsdCBvZiB0aGUgbWV0aG9kIGNhbGwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBCeU5hbWUobWV0aG9kTmFtZTogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IENhbmNlbGxhYmxlUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gQ2FsbCh7IG1ldGhvZE5hbWUsIGFyZ3MgfSk7XG59XG5cbi8qKlxuICogQ2FsbHMgYSBtZXRob2QgYnkgaXRzIG51bWVyaWMgSUQgd2l0aCB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50cy5cbiAqIFNlZSB7QGxpbmsgQ2FsbH0gZm9yIGRldGFpbHMuXG4gKlxuICogQHBhcmFtIG1ldGhvZElEIC0gVGhlIElEIG9mIHRoZSBtZXRob2QgdG8gY2FsbC5cbiAqIEBwYXJhbSBhcmdzIC0gVGhlIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBtZXRob2QuXG4gKiBAcmV0dXJuIFRoZSByZXN1bHQgb2YgdGhlIG1ldGhvZCBjYWxsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQnlJRChtZXRob2RJRDogbnVtYmVyLCAuLi5hcmdzOiBhbnlbXSk6IENhbmNlbGxhYmxlUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gQ2FsbCh7IG1ldGhvZElELCBhcmdzIH0pO1xufVxuIiwgIi8vIFNvdXJjZTogaHR0cHM6Ly9naXRodWIuY29tL2luc3BlY3QtanMvaXMtY2FsbGFibGVcblxuLy8gVGhlIE1JVCBMaWNlbnNlIChNSVQpXG4vL1xuLy8gQ29weXJpZ2h0IChjKSAyMDE1IEpvcmRhbiBIYXJiYW5kXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuLy8gY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4vLyBTT0ZUV0FSRS5cblxudmFyIGZuVG9TdHIgPSBGdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgcmVmbGVjdEFwcGx5OiB0eXBlb2YgUmVmbGVjdC5hcHBseSB8IGZhbHNlIHwgbnVsbCA9IHR5cGVvZiBSZWZsZWN0ID09PSAnb2JqZWN0JyAmJiBSZWZsZWN0ICE9PSBudWxsICYmIFJlZmxlY3QuYXBwbHk7XG52YXIgYmFkQXJyYXlMaWtlOiBhbnk7XG52YXIgaXNDYWxsYWJsZU1hcmtlcjogYW55O1xuaWYgKHR5cGVvZiByZWZsZWN0QXBwbHkgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRyeSB7XG4gICAgICAgIGJhZEFycmF5TGlrZSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ2xlbmd0aCcsIHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRocm93IGlzQ2FsbGFibGVNYXJrZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpc0NhbGxhYmxlTWFya2VyID0ge307XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby10aHJvdy1saXRlcmFsXG4gICAgICAgIHJlZmxlY3RBcHBseShmdW5jdGlvbiAoKSB7IHRocm93IDQyOyB9LCBudWxsLCBiYWRBcnJheUxpa2UpO1xuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgaWYgKF8gIT09IGlzQ2FsbGFibGVNYXJrZXIpIHtcbiAgICAgICAgICAgIHJlZmxlY3RBcHBseSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG59IGVsc2Uge1xuICAgIHJlZmxlY3RBcHBseSA9IG51bGw7XG59XG5cbnZhciBjb25zdHJ1Y3RvclJlZ2V4ID0gL15cXHMqY2xhc3NcXGIvO1xudmFyIGlzRVM2Q2xhc3NGbiA9IGZ1bmN0aW9uIGlzRVM2Q2xhc3NGdW5jdGlvbih2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgICAgdmFyIGZuU3RyID0gZm5Ub1N0ci5jYWxsKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yUmVnZXgudGVzdChmblN0cik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7IC8vIG5vdCBhIGZ1bmN0aW9uXG4gICAgfVxufTtcblxudmFyIHRyeUZ1bmN0aW9uT2JqZWN0ID0gZnVuY3Rpb24gdHJ5RnVuY3Rpb25Ub1N0cih2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKGlzRVM2Q2xhc3NGbih2YWx1ZSkpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgICAgIGZuVG9TdHIuY2FsbCh2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn07XG52YXIgdG9TdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyIG9iamVjdENsYXNzID0gJ1tvYmplY3QgT2JqZWN0XSc7XG52YXIgZm5DbGFzcyA9ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG52YXIgZ2VuQ2xhc3MgPSAnW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0nO1xudmFyIGRkYUNsYXNzID0gJ1tvYmplY3QgSFRNTEFsbENvbGxlY3Rpb25dJzsgLy8gSUUgMTFcbnZhciBkZGFDbGFzczIgPSAnW29iamVjdCBIVE1MIGRvY3VtZW50LmFsbCBjbGFzc10nO1xudmFyIGRkYUNsYXNzMyA9ICdbb2JqZWN0IEhUTUxDb2xsZWN0aW9uXSc7IC8vIElFIDktMTBcbnZhciBoYXNUb1N0cmluZ1RhZyA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgISFTeW1ib2wudG9TdHJpbmdUYWc7IC8vIGJldHRlcjogdXNlIGBoYXMtdG9zdHJpbmd0YWdgXG5cbnZhciBpc0lFNjggPSAhKDAgaW4gWyxdKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zcGFyc2UtYXJyYXlzLCBjb21tYS1zcGFjaW5nXG5cbnZhciBpc0REQTogKHZhbHVlOiBhbnkpID0+IGJvb2xlYW4gPSBmdW5jdGlvbiBpc0RvY3VtZW50RG90QWxsKCkgeyByZXR1cm4gZmFsc2U7IH07XG5pZiAodHlwZW9mIGRvY3VtZW50ID09PSAnb2JqZWN0Jykge1xuICAgIC8vIEZpcmVmb3ggMyBjYW5vbmljYWxpemVzIEREQSB0byB1bmRlZmluZWQgd2hlbiBpdCdzIG5vdCBhY2Nlc3NlZCBkaXJlY3RseVxuICAgIHZhciBhbGwgPSBkb2N1bWVudC5hbGw7XG4gICAgaWYgKHRvU3RyLmNhbGwoYWxsKSA9PT0gdG9TdHIuY2FsbChkb2N1bWVudC5hbGwpKSB7XG4gICAgICAgIGlzRERBID0gZnVuY3Rpb24gaXNEb2N1bWVudERvdEFsbCh2YWx1ZSkge1xuICAgICAgICAgICAgLyogZ2xvYmFscyBkb2N1bWVudDogZmFsc2UgKi9cbiAgICAgICAgICAgIC8vIGluIElFIDYtOCwgdHlwZW9mIGRvY3VtZW50LmFsbCBpcyBcIm9iamVjdFwiIGFuZCBpdCdzIHRydXRoeVxuICAgICAgICAgICAgaWYgKChpc0lFNjggfHwgIXZhbHVlKSAmJiAodHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzdHIgPSB0b1N0ci5jYWxsKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ciA9PT0gZGRhQ2xhc3NcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IHN0ciA9PT0gZGRhQ2xhc3MyXG4gICAgICAgICAgICAgICAgICAgICAgICB8fCBzdHIgPT09IGRkYUNsYXNzMyAvLyBvcGVyYSAxMi4xNlxuICAgICAgICAgICAgICAgICAgICAgICAgfHwgc3RyID09PSBvYmplY3RDbGFzcyAvLyBJRSA2LThcbiAgICAgICAgICAgICAgICAgICAgKSAmJiB2YWx1ZSgnJykgPT0gbnVsbDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBlcWVxZXFcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7IC8qKi8gfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9O1xuICAgIH1cbn1cblxuZnVuY3Rpb24gaXNDYWxsYWJsZVJlZkFwcGx5PFQ+KHZhbHVlOiBUIHwgdW5rbm93bik6IHZhbHVlIGlzICguLi5hcmdzOiBhbnlbXSkgPT4gYW55ICB7XG4gICAgaWYgKGlzRERBKHZhbHVlKSkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgIGlmICghdmFsdWUpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIHRyeSB7XG4gICAgICAgIChyZWZsZWN0QXBwbHkgYXMgYW55KSh2YWx1ZSwgbnVsbCwgYmFkQXJyYXlMaWtlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChlICE9PSBpc0NhbGxhYmxlTWFya2VyKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIH1cbiAgICByZXR1cm4gIWlzRVM2Q2xhc3NGbih2YWx1ZSkgJiYgdHJ5RnVuY3Rpb25PYmplY3QodmFsdWUpO1xufVxuXG5mdW5jdGlvbiBpc0NhbGxhYmxlTm9SZWZBcHBseTxUPih2YWx1ZTogVCB8IHVua25vd24pOiB2YWx1ZSBpcyAoLi4uYXJnczogYW55W10pID0+IGFueSB7XG4gICAgaWYgKGlzRERBKHZhbHVlKSkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgIGlmICghdmFsdWUpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGlmIChoYXNUb1N0cmluZ1RhZykgeyByZXR1cm4gdHJ5RnVuY3Rpb25PYmplY3QodmFsdWUpOyB9XG4gICAgaWYgKGlzRVM2Q2xhc3NGbih2YWx1ZSkpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgdmFyIHN0ckNsYXNzID0gdG9TdHIuY2FsbCh2YWx1ZSk7XG4gICAgaWYgKHN0ckNsYXNzICE9PSBmbkNsYXNzICYmIHN0ckNsYXNzICE9PSBnZW5DbGFzcyAmJiAhKC9eXFxbb2JqZWN0IEhUTUwvKS50ZXN0KHN0ckNsYXNzKSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICByZXR1cm4gdHJ5RnVuY3Rpb25PYmplY3QodmFsdWUpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgcmVmbGVjdEFwcGx5ID8gaXNDYWxsYWJsZVJlZkFwcGx5IDogaXNDYWxsYWJsZU5vUmVmQXBwbHk7XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbmltcG9ydCBpc0NhbGxhYmxlIGZyb20gXCIuL2NhbGxhYmxlLmpzXCI7XG5cbi8qKlxuICogRXhjZXB0aW9uIGNsYXNzIHRoYXQgd2lsbCBiZSB1c2VkIGFzIHJlamVjdGlvbiByZWFzb25cbiAqIGluIGNhc2UgYSB7QGxpbmsgQ2FuY2VsbGFibGVQcm9taXNlfSBpcyBjYW5jZWxsZWQgc3VjY2Vzc2Z1bGx5LlxuICpcbiAqIFRoZSB2YWx1ZSBvZiB0aGUge0BsaW5rIG5hbWV9IHByb3BlcnR5IGlzIHRoZSBzdHJpbmcgYFwiQ2FuY2VsRXJyb3JcImAuXG4gKiBUaGUgdmFsdWUgb2YgdGhlIHtAbGluayBjYXVzZX0gcHJvcGVydHkgaXMgdGhlIGNhdXNlIHBhc3NlZCB0byB0aGUgY2FuY2VsIG1ldGhvZCwgaWYgYW55LlxuICovXG5leHBvcnQgY2xhc3MgQ2FuY2VsRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIG5ldyBgQ2FuY2VsRXJyb3JgIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSBtZXNzYWdlIC0gVGhlIGVycm9yIG1lc3NhZ2UuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIGJlIGZvcndhcmRlZCB0byB0aGUgRXJyb3IgY29uc3RydWN0b3IuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobWVzc2FnZT86IHN0cmluZywgb3B0aW9ucz86IEVycm9yT3B0aW9ucykge1xuICAgICAgICBzdXBlcihtZXNzYWdlLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5uYW1lID0gXCJDYW5jZWxFcnJvclwiO1xuICAgIH1cbn1cblxuLyoqXG4gKiBFeGNlcHRpb24gY2xhc3MgdGhhdCB3aWxsIGJlIHJlcG9ydGVkIGFzIGFuIHVuaGFuZGxlZCByZWplY3Rpb25cbiAqIGluIGNhc2UgYSB7QGxpbmsgQ2FuY2VsbGFibGVQcm9taXNlfSByZWplY3RzIGFmdGVyIGJlaW5nIGNhbmNlbGxlZCxcbiAqIG9yIHdoZW4gdGhlIGBvbmNhbmNlbGxlZGAgY2FsbGJhY2sgdGhyb3dzIG9yIHJlamVjdHMuXG4gKlxuICogVGhlIHZhbHVlIG9mIHRoZSB7QGxpbmsgbmFtZX0gcHJvcGVydHkgaXMgdGhlIHN0cmluZyBgXCJDYW5jZWxsZWRSZWplY3Rpb25FcnJvclwiYC5cbiAqIFRoZSB2YWx1ZSBvZiB0aGUge0BsaW5rIGNhdXNlfSBwcm9wZXJ0eSBpcyB0aGUgcmVhc29uIHRoZSBwcm9taXNlIHJlamVjdGVkIHdpdGguXG4gKlxuICogQmVjYXVzZSB0aGUgb3JpZ2luYWwgcHJvbWlzZSB3YXMgY2FuY2VsbGVkLFxuICogYSB3cmFwcGVyIHByb21pc2Ugd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHVuaGFuZGxlZCByZWplY3Rpb24gbGlzdGVuZXIgaW5zdGVhZC5cbiAqIFRoZSB7QGxpbmsgcHJvbWlzZX0gcHJvcGVydHkgaG9sZHMgYSByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmFsIHByb21pc2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBDYW5jZWxsZWRSZWplY3Rpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICAvKipcbiAgICAgKiBIb2xkcyBhIHJlZmVyZW5jZSB0byB0aGUgcHJvbWlzZSB0aGF0IHdhcyBjYW5jZWxsZWQgYW5kIHRoZW4gcmVqZWN0ZWQuXG4gICAgICovXG4gICAgcHJvbWlzZTogQ2FuY2VsbGFibGVQcm9taXNlPHVua25vd24+O1xuXG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIG5ldyBgQ2FuY2VsbGVkUmVqZWN0aW9uRXJyb3JgIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSBwcm9taXNlIC0gVGhlIHByb21pc2UgdGhhdCBjYXVzZWQgdGhlIGVycm9yIG9yaWdpbmFsbHkuXG4gICAgICogQHBhcmFtIHJlYXNvbiAtIFRoZSByZWplY3Rpb24gcmVhc29uLlxuICAgICAqIEBwYXJhbSBpbmZvIC0gQW4gb3B0aW9uYWwgaW5mb3JtYXRpdmUgbWVzc2FnZSBzcGVjaWZ5aW5nIHRoZSBjaXJjdW1zdGFuY2VzIGluIHdoaWNoIHRoZSBlcnJvciB3YXMgdGhyb3duLlxuICAgICAqICAgICAgICAgICAgICAgRGVmYXVsdHMgdG8gdGhlIHN0cmluZyBgXCJVbmhhbmRsZWQgcmVqZWN0aW9uIGluIGNhbmNlbGxlZCBwcm9taXNlLlwiYC5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihwcm9taXNlOiBDYW5jZWxsYWJsZVByb21pc2U8dW5rbm93bj4sIHJlYXNvbj86IGFueSwgaW5mbz86IHN0cmluZykge1xuICAgICAgICBzdXBlcigoaW5mbyA/PyBcIlVuaGFuZGxlZCByZWplY3Rpb24gaW4gY2FuY2VsbGVkIHByb21pc2UuXCIpICsgXCIgUmVhc29uOiBcIiArIGVycm9yTWVzc2FnZShyZWFzb24pLCB7IGNhdXNlOiByZWFzb24gfSk7XG4gICAgICAgIHRoaXMucHJvbWlzZSA9IHByb21pc2U7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiQ2FuY2VsbGVkUmVqZWN0aW9uRXJyb3JcIjtcbiAgICB9XG59XG5cbnR5cGUgQ2FuY2VsbGFibGVQcm9taXNlUmVzb2x2ZXI8VD4gPSAodmFsdWU6IFQgfCBQcm9taXNlTGlrZTxUPiB8IENhbmNlbGxhYmxlUHJvbWlzZUxpa2U8VD4pID0+IHZvaWQ7XG50eXBlIENhbmNlbGxhYmxlUHJvbWlzZVJlamVjdG9yID0gKHJlYXNvbj86IGFueSkgPT4gdm9pZDtcbnR5cGUgQ2FuY2VsbGFibGVQcm9taXNlQ2FuY2VsbGVyID0gKGNhdXNlPzogYW55KSA9PiB2b2lkIHwgUHJvbWlzZUxpa2U8dm9pZD47XG50eXBlIENhbmNlbGxhYmxlUHJvbWlzZUV4ZWN1dG9yPFQ+ID0gKHJlc29sdmU6IENhbmNlbGxhYmxlUHJvbWlzZVJlc29sdmVyPFQ+LCByZWplY3Q6IENhbmNlbGxhYmxlUHJvbWlzZVJlamVjdG9yKSA9PiB2b2lkO1xuXG5leHBvcnQgaW50ZXJmYWNlIENhbmNlbGxhYmxlUHJvbWlzZUxpa2U8VD4ge1xuICAgIHRoZW48VFJlc3VsdDEgPSBULCBUUmVzdWx0MiA9IG5ldmVyPihvbmZ1bGZpbGxlZD86ICgodmFsdWU6IFQpID0+IFRSZXN1bHQxIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDE+IHwgQ2FuY2VsbGFibGVQcm9taXNlTGlrZTxUUmVzdWx0MT4pIHwgdW5kZWZpbmVkIHwgbnVsbCwgb25yZWplY3RlZD86ICgocmVhc29uOiBhbnkpID0+IFRSZXN1bHQyIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDI+IHwgQ2FuY2VsbGFibGVQcm9taXNlTGlrZTxUUmVzdWx0Mj4pIHwgdW5kZWZpbmVkIHwgbnVsbCk6IENhbmNlbGxhYmxlUHJvbWlzZUxpa2U8VFJlc3VsdDEgfCBUUmVzdWx0Mj47XG4gICAgY2FuY2VsKGNhdXNlPzogYW55KTogdm9pZCB8IFByb21pc2VMaWtlPHZvaWQ+O1xufVxuXG4vKipcbiAqIFdyYXBzIGEgY2FuY2VsbGFibGUgcHJvbWlzZSBhbG9uZyB3aXRoIGl0cyByZXNvbHV0aW9uIG1ldGhvZHMuXG4gKiBUaGUgYG9uY2FuY2VsbGVkYCBmaWVsZCB3aWxsIGJlIG51bGwgaW5pdGlhbGx5IGJ1dCBtYXkgYmUgc2V0IHRvIHByb3ZpZGUgYSBjdXN0b20gY2FuY2VsbGF0aW9uIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhbmNlbGxhYmxlUHJvbWlzZVdpdGhSZXNvbHZlcnM8VD4ge1xuICAgIHByb21pc2U6IENhbmNlbGxhYmxlUHJvbWlzZTxUPjtcbiAgICByZXNvbHZlOiBDYW5jZWxsYWJsZVByb21pc2VSZXNvbHZlcjxUPjtcbiAgICByZWplY3Q6IENhbmNlbGxhYmxlUHJvbWlzZVJlamVjdG9yO1xuICAgIG9uY2FuY2VsbGVkOiBDYW5jZWxsYWJsZVByb21pc2VDYW5jZWxsZXIgfCBudWxsO1xufVxuXG5pbnRlcmZhY2UgQ2FuY2VsbGFibGVQcm9taXNlU3RhdGUge1xuICAgIHJlYWRvbmx5IHJvb3Q6IENhbmNlbGxhYmxlUHJvbWlzZVN0YXRlO1xuICAgIHJlc29sdmluZzogYm9vbGVhbjtcbiAgICBzZXR0bGVkOiBib29sZWFuO1xuICAgIHJlYXNvbj86IENhbmNlbEVycm9yO1xufVxuXG4vLyBQcml2YXRlIGZpZWxkIG5hbWVzLlxuY29uc3QgYmFycmllclN5bSA9IFN5bWJvbChcImJhcnJpZXJcIik7XG5jb25zdCBjYW5jZWxJbXBsU3ltID0gU3ltYm9sKFwiY2FuY2VsSW1wbFwiKTtcbmNvbnN0IHNwZWNpZXMgPSBTeW1ib2wuc3BlY2llcyA/PyBTeW1ib2woXCJzcGVjaWVzUG9seWZpbGxcIik7XG5cbi8qKlxuICogQSBwcm9taXNlIHdpdGggYW4gYXR0YWNoZWQgbWV0aG9kIGZvciBjYW5jZWxsaW5nIGxvbmctcnVubmluZyBvcGVyYXRpb25zIChzZWUge0BsaW5rIENhbmNlbGxhYmxlUHJvbWlzZSNjYW5jZWx9KS5cbiAqIENhbmNlbGxhdGlvbiBjYW4gb3B0aW9uYWxseSBiZSBib3VuZCB0byBhbiB7QGxpbmsgQWJvcnRTaWduYWx9XG4gKiBmb3IgYmV0dGVyIGNvbXBvc2FiaWxpdHkgKHNlZSB7QGxpbmsgQ2FuY2VsbGFibGVQcm9taXNlI2NhbmNlbE9ufSkuXG4gKlxuICogQ2FuY2VsbGluZyBhIHBlbmRpbmcgcHJvbWlzZSB3aWxsIHJlc3VsdCBpbiBhbiBpbW1lZGlhdGUgcmVqZWN0aW9uXG4gKiB3aXRoIGFuIGluc3RhbmNlIG9mIHtAbGluayBDYW5jZWxFcnJvcn0gYXMgcmVhc29uLFxuICogYnV0IHdob2V2ZXIgc3RhcnRlZCB0aGUgcHJvbWlzZSB3aWxsIGJlIHJlc3BvbnNpYmxlXG4gKiBmb3IgYWN0dWFsbHkgYWJvcnRpbmcgdGhlIHVuZGVybHlpbmcgb3BlcmF0aW9uLlxuICogVG8gdGhpcyBwdXJwb3NlLCB0aGUgY29uc3RydWN0b3IgYW5kIGFsbCBjaGFpbmluZyBtZXRob2RzXG4gKiBhY2NlcHQgb3B0aW9uYWwgY2FuY2VsbGF0aW9uIGNhbGxiYWNrcy5cbiAqXG4gKiBJZiBhIGBDYW5jZWxsYWJsZVByb21pc2VgIHN0aWxsIHJlc29sdmVzIGFmdGVyIGhhdmluZyBiZWVuIGNhbmNlbGxlZCxcbiAqIHRoZSByZXN1bHQgd2lsbCBiZSBkaXNjYXJkZWQuIElmIGl0IHJlamVjdHMsIHRoZSByZWFzb25cbiAqIHdpbGwgYmUgcmVwb3J0ZWQgYXMgYW4gdW5oYW5kbGVkIHJlamVjdGlvbixcbiAqIHdyYXBwZWQgaW4gYSB7QGxpbmsgQ2FuY2VsbGVkUmVqZWN0aW9uRXJyb3J9IGluc3RhbmNlLlxuICogVG8gZmFjaWxpdGF0ZSB0aGUgaGFuZGxpbmcgb2YgY2FuY2VsbGF0aW9uIHJlcXVlc3RzLFxuICogY2FuY2VsbGVkIGBDYW5jZWxsYWJsZVByb21pc2VgcyB3aWxsIF9ub3RfIHJlcG9ydCB1bmhhbmRsZWQgYENhbmNlbEVycm9yYHNcbiAqIHdob3NlIGBjYXVzZWAgZmllbGQgaXMgdGhlIHNhbWUgYXMgdGhlIG9uZSB3aXRoIHdoaWNoIHRoZSBjdXJyZW50IHByb21pc2Ugd2FzIGNhbmNlbGxlZC5cbiAqXG4gKiBBbGwgdXN1YWwgcHJvbWlzZSBtZXRob2RzIGFyZSBkZWZpbmVkIGFuZCByZXR1cm4gYSBgQ2FuY2VsbGFibGVQcm9taXNlYFxuICogd2hvc2UgY2FuY2VsIG1ldGhvZCB3aWxsIGNhbmNlbCB0aGUgcGFyZW50IG9wZXJhdGlvbiBhcyB3ZWxsLCBwcm9wYWdhdGluZyB0aGUgY2FuY2VsbGF0aW9uIHJlYXNvblxuICogdXB3YXJkcyB0aHJvdWdoIHByb21pc2UgY2hhaW5zLlxuICogQ29udmVyc2VseSwgY2FuY2VsbGluZyBhIHByb21pc2Ugd2lsbCBub3QgYXV0b21hdGljYWxseSBjYW5jZWwgZGVwZW5kZW50IHByb21pc2VzIGRvd25zdHJlYW06XG4gKiBgYGB0c1xuICogbGV0IHJvb3QgPSBuZXcgQ2FuY2VsbGFibGVQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsgLi4uIH0pO1xuICogbGV0IGNoaWxkMSA9IHJvb3QudGhlbigoKSA9PiB7IC4uLiB9KTtcbiAqIGxldCBjaGlsZDIgPSBjaGlsZDEudGhlbigoKSA9PiB7IC4uLiB9KTtcbiAqIGxldCBjaGlsZDMgPSByb290LmNhdGNoKCgpID0+IHsgLi4uIH0pO1xuICogY2hpbGQxLmNhbmNlbCgpOyAvLyBDYW5jZWxzIGNoaWxkMSBhbmQgcm9vdCwgYnV0IG5vdCBjaGlsZDIgb3IgY2hpbGQzXG4gKiBgYGBcbiAqIENhbmNlbGxpbmcgYSBwcm9taXNlIHRoYXQgaGFzIGFscmVhZHkgc2V0dGxlZCBpcyBzYWZlIGFuZCBoYXMgbm8gY29uc2VxdWVuY2UuXG4gKlxuICogVGhlIGBjYW5jZWxgIG1ldGhvZCByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IF9hbHdheXMgZnVsZmlsbHNfXG4gKiBhZnRlciB0aGUgd2hvbGUgY2hhaW4gaGFzIHByb2Nlc3NlZCB0aGUgY2FuY2VsIHJlcXVlc3RcbiAqIGFuZCBhbGwgYXR0YWNoZWQgY2FsbGJhY2tzIHVwIHRvIHRoYXQgbW9tZW50IGhhdmUgcnVuLlxuICpcbiAqIEFsbCBFUzIwMjQgcHJvbWlzZSBtZXRob2RzIChzdGF0aWMgYW5kIGluc3RhbmNlKSBhcmUgZGVmaW5lZCBvbiBDYW5jZWxsYWJsZVByb21pc2UsXG4gKiBidXQgYWN0dWFsIGF2YWlsYWJpbGl0eSBtYXkgdmFyeSB3aXRoIE9TL3dlYnZpZXcgdmVyc2lvbi5cbiAqXG4gKiBJbiBsaW5lIHdpdGggdGhlIHByb3Bvc2FsIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXJtLWJ1aWx0aW4tc3ViY2xhc3NpbmcsXG4gKiBgQ2FuY2VsbGFibGVQcm9taXNlYCBkb2VzIG5vdCBzdXBwb3J0IHRyYW5zcGFyZW50IHN1YmNsYXNzaW5nLlxuICogRXh0ZW5kZXJzIHNob3VsZCB0YWtlIGNhcmUgdG8gcHJvdmlkZSB0aGVpciBvd24gbWV0aG9kIGltcGxlbWVudGF0aW9ucy5cbiAqIFRoaXMgbWlnaHQgYmUgcmVjb25zaWRlcmVkIGluIGNhc2UgdGhlIHByb3Bvc2FsIGlzIHJldGlyZWQuXG4gKlxuICogQ2FuY2VsbGFibGVQcm9taXNlIGlzIGEgd3JhcHBlciBhcm91bmQgdGhlIERPTSBQcm9taXNlIG9iamVjdFxuICogYW5kIGlzIGNvbXBsaWFudCB3aXRoIHRoZSBbUHJvbWlzZXMvQSsgc3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8pXG4gKiAoaXQgcGFzc2VzIHRoZSBbY29tcGxpYW5jZSBzdWl0ZV0oaHR0cHM6Ly9naXRodWIuY29tL3Byb21pc2VzLWFwbHVzL3Byb21pc2VzLXRlc3RzKSlcbiAqIGlmIHNvIGlzIHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgQ2FuY2VsbGFibGVQcm9taXNlPFQ+IGV4dGVuZHMgUHJvbWlzZTxUPiBpbXBsZW1lbnRzIFByb21pc2VMaWtlPFQ+LCBDYW5jZWxsYWJsZVByb21pc2VMaWtlPFQ+IHtcbiAgICAvLyBQcml2YXRlIGZpZWxkcy5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgcHJpdmF0ZSBbYmFycmllclN5bV0hOiBQYXJ0aWFsPFByb21pc2VXaXRoUmVzb2x2ZXJzPHZvaWQ+PiB8IG51bGw7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgW2NhbmNlbEltcGxTeW1dITogKHJlYXNvbjogQ2FuY2VsRXJyb3IpID0+IHZvaWQgfCBQcm9taXNlTGlrZTx2b2lkPjtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgYENhbmNlbGxhYmxlUHJvbWlzZWAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZXhlY3V0b3IgLSBBIGNhbGxiYWNrIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcHJvbWlzZS4gVGhpcyBjYWxsYmFjayBpcyBwYXNzZWQgdHdvIGFyZ3VtZW50czpcbiAgICAgKiAgICAgICAgICAgICAgICAgICBhIGByZXNvbHZlYCBjYWxsYmFjayB1c2VkIHRvIHJlc29sdmUgdGhlIHByb21pc2Ugd2l0aCBhIHZhbHVlXG4gICAgICogICAgICAgICAgICAgICAgICAgb3IgdGhlIHJlc3VsdCBvZiBhbm90aGVyIHByb21pc2UgKHBvc3NpYmx5IGNhbmNlbGxhYmxlKSxcbiAgICAgKiAgICAgICAgICAgICAgICAgICBhbmQgYSBgcmVqZWN0YCBjYWxsYmFjayB1c2VkIHRvIHJlamVjdCB0aGUgcHJvbWlzZSB3aXRoIGEgcHJvdmlkZWQgcmVhc29uIG9yIGVycm9yLlxuICAgICAqICAgICAgICAgICAgICAgICAgIElmIHRoZSB2YWx1ZSBwcm92aWRlZCB0byB0aGUgYHJlc29sdmVgIGNhbGxiYWNrIGlzIGEgdGhlbmFibGUgX2FuZF8gY2FuY2VsbGFibGUgb2JqZWN0XG4gICAgICogICAgICAgICAgICAgICAgICAgKGl0IGhhcyBhIGB0aGVuYCBfYW5kXyBhIGBjYW5jZWxgIG1ldGhvZCksXG4gICAgICogICAgICAgICAgICAgICAgICAgY2FuY2VsbGF0aW9uIHJlcXVlc3RzIHdpbGwgYmUgZm9yd2FyZGVkIHRvIHRoYXQgb2JqZWN0IGFuZCB0aGUgb25jYW5jZWxsZWQgd2lsbCBub3QgYmUgaW52b2tlZCBhbnltb3JlLlxuICAgICAqICAgICAgICAgICAgICAgICAgIElmIGFueSBvbmUgb2YgdGhlIHR3byBjYWxsYmFja3MgaXMgY2FsbGVkIF9hZnRlcl8gdGhlIHByb21pc2UgaGFzIGJlZW4gY2FuY2VsbGVkLFxuICAgICAqICAgICAgICAgICAgICAgICAgIHRoZSBwcm92aWRlZCB2YWx1ZXMgd2lsbCBiZSBjYW5jZWxsZWQgYW5kIHJlc29sdmVkIGFzIHVzdWFsLFxuICAgICAqICAgICAgICAgICAgICAgICAgIGJ1dCB0aGVpciByZXN1bHRzIHdpbGwgYmUgZGlzY2FyZGVkLlxuICAgICAqICAgICAgICAgICAgICAgICAgIEhvd2V2ZXIsIGlmIHRoZSByZXNvbHV0aW9uIHByb2Nlc3MgdWx0aW1hdGVseSBlbmRzIHVwIGluIGEgcmVqZWN0aW9uXG4gICAgICogICAgICAgICAgICAgICAgICAgdGhhdCBpcyBub3QgZHVlIHRvIGNhbmNlbGxhdGlvbiwgdGhlIHJlamVjdGlvbiByZWFzb25cbiAgICAgKiAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHdyYXBwZWQgaW4gYSB7QGxpbmsgQ2FuY2VsbGVkUmVqZWN0aW9uRXJyb3J9XG4gICAgICogICAgICAgICAgICAgICAgICAgYW5kIGJ1YmJsZWQgdXAgYXMgYW4gdW5oYW5kbGVkIHJlamVjdGlvbi5cbiAgICAgKiBAcGFyYW0gb25jYW5jZWxsZWQgLSBJdCBpcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZW5zdXJlIHRoYXQgYW55IG9wZXJhdGlvblxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZWQgYnkgdGhlIGV4ZWN1dG9yIGlzIHByb3Blcmx5IGhhbHRlZCB1cG9uIGNhbmNlbGxhdGlvbi5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBUaGlzIG9wdGlvbmFsIGNhbGxiYWNrIGNhbiBiZSB1c2VkIHRvIHRoYXQgcHVycG9zZS5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBJdCB3aWxsIGJlIGNhbGxlZCBfc3luY2hyb25vdXNseV8gd2l0aCBhIGNhbmNlbGxhdGlvbiBjYXVzZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIHdoZW4gY2FuY2VsbGF0aW9uIGlzIHJlcXVlc3RlZCwgX2FmdGVyXyB0aGUgcHJvbWlzZSBoYXMgYWxyZWFkeSByZWplY3RlZFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIHdpdGggYSB7QGxpbmsgQ2FuY2VsRXJyb3J9LCBidXQgX2JlZm9yZV9cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBhbnkge0BsaW5rIHRoZW59L3tAbGluayBjYXRjaH0ve0BsaW5rIGZpbmFsbHl9IGNhbGxiYWNrIHJ1bnMuXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIGNhbGxiYWNrIHJldHVybnMgYSB0aGVuYWJsZSwgdGhlIHByb21pc2UgcmV0dXJuZWQgZnJvbSB7QGxpbmsgY2FuY2VsfVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIHdpbGwgb25seSBmdWxmaWxsIGFmdGVyIHRoZSBmb3JtZXIgaGFzIHNldHRsZWQuXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgVW5oYW5kbGVkIGV4Y2VwdGlvbnMgb3IgcmVqZWN0aW9ucyBmcm9tIHRoZSBjYWxsYmFjayB3aWxsIGJlIHdyYXBwZWRcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBpbiBhIHtAbGluayBDYW5jZWxsZWRSZWplY3Rpb25FcnJvcn0gYW5kIGJ1YmJsZWQgdXAgYXMgdW5oYW5kbGVkIHJlamVjdGlvbnMuXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIGByZXNvbHZlYCBjYWxsYmFjayBpcyBjYWxsZWQgYmVmb3JlIGNhbmNlbGxhdGlvbiB3aXRoIGEgY2FuY2VsbGFibGUgcHJvbWlzZSxcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb24gcmVxdWVzdHMgb24gdGhpcyBwcm9taXNlIHdpbGwgYmUgZGl2ZXJ0ZWQgdG8gdGhhdCBwcm9taXNlLFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGUgb3JpZ2luYWwgYG9uY2FuY2VsbGVkYCBjYWxsYmFjayB3aWxsIGJlIGRpc2NhcmRlZC5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihleGVjdXRvcjogQ2FuY2VsbGFibGVQcm9taXNlRXhlY3V0b3I8VD4sIG9uY2FuY2VsbGVkPzogQ2FuY2VsbGFibGVQcm9taXNlQ2FuY2VsbGVyKSB7XG4gICAgICAgIGxldCByZXNvbHZlITogKHZhbHVlOiBUIHwgUHJvbWlzZUxpa2U8VD4pID0+IHZvaWQ7XG4gICAgICAgIGxldCByZWplY3QhOiAocmVhc29uPzogYW55KSA9PiB2b2lkO1xuICAgICAgICBzdXBlcigocmVzLCByZWopID0+IHsgcmVzb2x2ZSA9IHJlczsgcmVqZWN0ID0gcmVqOyB9KTtcblxuICAgICAgICBpZiAoKHRoaXMuY29uc3RydWN0b3IgYXMgYW55KVtzcGVjaWVzXSAhPT0gUHJvbWlzZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbmNlbGxhYmxlUHJvbWlzZSBkb2VzIG5vdCBzdXBwb3J0IHRyYW5zcGFyZW50IHN1YmNsYXNzaW5nLiBQbGVhc2UgcmVmcmFpbiBmcm9tIG92ZXJyaWRpbmcgdGhlIFtTeW1ib2wuc3BlY2llc10gc3RhdGljIHByb3BlcnR5LlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwcm9taXNlOiBDYW5jZWxsYWJsZVByb21pc2VXaXRoUmVzb2x2ZXJzPFQ+ID0ge1xuICAgICAgICAgICAgcHJvbWlzZTogdGhpcyxcbiAgICAgICAgICAgIHJlc29sdmUsXG4gICAgICAgICAgICByZWplY3QsXG4gICAgICAgICAgICBnZXQgb25jYW5jZWxsZWQoKSB7IHJldHVybiBvbmNhbmNlbGxlZCA/PyBudWxsOyB9LFxuICAgICAgICAgICAgc2V0IG9uY2FuY2VsbGVkKGNiKSB7IG9uY2FuY2VsbGVkID0gY2IgPz8gdW5kZWZpbmVkOyB9XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3Qgc3RhdGU6IENhbmNlbGxhYmxlUHJvbWlzZVN0YXRlID0ge1xuICAgICAgICAgICAgZ2V0IHJvb3QoKSB7IHJldHVybiBzdGF0ZTsgfSxcbiAgICAgICAgICAgIHJlc29sdmluZzogZmFsc2UsXG4gICAgICAgICAgICBzZXR0bGVkOiBmYWxzZVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFNldHVwIGNhbmNlbGxhdGlvbiBzeXN0ZW0uXG4gICAgICAgIHZvaWQgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcywge1xuICAgICAgICAgICAgW2JhcnJpZXJTeW1dOiB7XG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtjYW5jZWxJbXBsU3ltXToge1xuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBjYW5jZWxsZXJGb3IocHJvbWlzZSwgc3RhdGUpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFJ1biB0aGUgYWN0dWFsIGV4ZWN1dG9yLlxuICAgICAgICBjb25zdCByZWplY3RvciA9IHJlamVjdG9yRm9yKHByb21pc2UsIHN0YXRlKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGV4ZWN1dG9yKHJlc29sdmVyRm9yKHByb21pc2UsIHN0YXRlKSwgcmVqZWN0b3IpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZS5yZXNvbHZpbmcpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIlVuaGFuZGxlZCBleGNlcHRpb24gaW4gQ2FuY2VsbGFibGVQcm9taXNlIGV4ZWN1dG9yLlwiLCBlcnIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZWplY3RvcihlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FuY2VscyBpbW1lZGlhdGVseSB0aGUgZXhlY3V0aW9uIG9mIHRoZSBvcGVyYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgcHJvbWlzZS5cbiAgICAgKiBUaGUgcHJvbWlzZSByZWplY3RzIHdpdGggYSB7QGxpbmsgQ2FuY2VsRXJyb3J9IGluc3RhbmNlIGFzIHJlYXNvbixcbiAgICAgKiB3aXRoIHRoZSB7QGxpbmsgQ2FuY2VsRXJyb3IjY2F1c2V9IHByb3BlcnR5IHNldCB0byB0aGUgZ2l2ZW4gYXJndW1lbnQsIGlmIGFueS5cbiAgICAgKlxuICAgICAqIEhhcyBubyBlZmZlY3QgaWYgY2FsbGVkIGFmdGVyIHRoZSBwcm9taXNlIGhhcyBhbHJlYWR5IHNldHRsZWQ7XG4gICAgICogcmVwZWF0ZWQgY2FsbHMgaW4gcGFydGljdWxhciBhcmUgc2FmZSwgYnV0IG9ubHkgdGhlIGZpcnN0IG9uZVxuICAgICAqIHdpbGwgc2V0IHRoZSBjYW5jZWxsYXRpb24gY2F1c2UuXG4gICAgICpcbiAgICAgKiBUaGUgYENhbmNlbEVycm9yYCBleGNlcHRpb24gX25lZWQgbm90XyBiZSBoYW5kbGVkIGV4cGxpY2l0bHkgX29uIHRoZSBwcm9taXNlcyB0aGF0IGFyZSBiZWluZyBjYW5jZWxsZWQ6X1xuICAgICAqIGNhbmNlbGxpbmcgYSBwcm9taXNlIHdpdGggbm8gYXR0YWNoZWQgcmVqZWN0aW9uIGhhbmRsZXIgZG9lcyBub3QgdHJpZ2dlciBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uIGV2ZW50LlxuICAgICAqIFRoZXJlZm9yZSwgdGhlIGZvbGxvd2luZyBpZGlvbXMgYXJlIGFsbCBlcXVhbGx5IGNvcnJlY3Q6XG4gICAgICogYGBgdHNcbiAgICAgKiBuZXcgQ2FuY2VsbGFibGVQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsgLi4uIH0pLmNhbmNlbCgpO1xuICAgICAqIG5ldyBDYW5jZWxsYWJsZVByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4geyAuLi4gfSkudGhlbiguLi4pLmNhbmNlbCgpO1xuICAgICAqIG5ldyBDYW5jZWxsYWJsZVByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4geyAuLi4gfSkudGhlbiguLi4pLmNhdGNoKC4uLikuY2FuY2VsKCk7XG4gICAgICogYGBgXG4gICAgICogV2hlbmV2ZXIgc29tZSBjYW5jZWxsZWQgcHJvbWlzZSBpbiBhIGNoYWluIHJlamVjdHMgd2l0aCBhIGBDYW5jZWxFcnJvcmBcbiAgICAgKiB3aXRoIHRoZSBzYW1lIGNhbmNlbGxhdGlvbiBjYXVzZSBhcyBpdHNlbGYsIHRoZSBlcnJvciB3aWxsIGJlIGRpc2NhcmRlZCBzaWxlbnRseS5cbiAgICAgKiBIb3dldmVyLCB0aGUgYENhbmNlbEVycm9yYCBfd2lsbCBzdGlsbCBiZSBkZWxpdmVyZWRfIHRvIGFsbCBhdHRhY2hlZCByZWplY3Rpb24gaGFuZGxlcnNcbiAgICAgKiBhZGRlZCBieSB7QGxpbmsgdGhlbn0gYW5kIHJlbGF0ZWQgbWV0aG9kczpcbiAgICAgKiBgYGB0c1xuICAgICAqIGxldCBjYW5jZWxsYWJsZSA9IG5ldyBDYW5jZWxsYWJsZVByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4geyAuLi4gfSk7XG4gICAgICogY2FuY2VsbGFibGUudGhlbigoKSA9PiB7IC4uLiB9KS5jYXRjaChjb25zb2xlLmxvZyk7XG4gICAgICogY2FuY2VsbGFibGUuY2FuY2VsKCk7IC8vIEEgQ2FuY2VsRXJyb3IgaXMgcHJpbnRlZCB0byB0aGUgY29uc29sZS5cbiAgICAgKiBgYGBcbiAgICAgKiBJZiB0aGUgYENhbmNlbEVycm9yYCBpcyBub3QgaGFuZGxlZCBkb3duc3RyZWFtIGJ5IHRoZSB0aW1lIGl0IHJlYWNoZXNcbiAgICAgKiBhIF9ub24tY2FuY2VsbGVkXyBwcm9taXNlLCBpdCBfd2lsbF8gdHJpZ2dlciBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uIGV2ZW50LFxuICAgICAqIGp1c3QgbGlrZSBub3JtYWwgcmVqZWN0aW9ucyB3b3VsZDpcbiAgICAgKiBgYGB0c1xuICAgICAqIGxldCBjYW5jZWxsYWJsZSA9IG5ldyBDYW5jZWxsYWJsZVByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4geyAuLi4gfSk7XG4gICAgICogbGV0IGNoYWluZWQgPSBjYW5jZWxsYWJsZS50aGVuKCgpID0+IHsgLi4uIH0pLnRoZW4oKCkgPT4geyAuLi4gfSk7IC8vIE5vIGNhdGNoLi4uXG4gICAgICogY2FuY2VsbGFibGUuY2FuY2VsKCk7IC8vIFVuaGFuZGxlZCByZWplY3Rpb24gZXZlbnQgb24gY2hhaW5lZCFcbiAgICAgKiBgYGBcbiAgICAgKiBUaGVyZWZvcmUsIGl0IGlzIGltcG9ydGFudCB0byBlaXRoZXIgY2FuY2VsIHdob2xlIHByb21pc2UgY2hhaW5zIGZyb20gdGhlaXIgdGFpbCxcbiAgICAgKiBhcyBzaG93biBpbiB0aGUgY29ycmVjdCBpZGlvbXMgYWJvdmUsIG9yIHRha2UgY2FyZSBvZiBoYW5kbGluZyBlcnJvcnMgZXZlcnl3aGVyZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEEgY2FuY2VsbGFibGUgcHJvbWlzZSB0aGF0IF9mdWxmaWxsc18gYWZ0ZXIgdGhlIGNhbmNlbCBjYWxsYmFjayAoaWYgYW55KVxuICAgICAqIGFuZCBhbGwgaGFuZGxlcnMgYXR0YWNoZWQgdXAgdG8gdGhlIGNhbGwgdG8gY2FuY2VsIGhhdmUgcnVuLlxuICAgICAqIElmIHRoZSBjYW5jZWwgY2FsbGJhY2sgcmV0dXJucyBhIHRoZW5hYmxlLCB0aGUgcHJvbWlzZSByZXR1cm5lZCBieSBgY2FuY2VsYFxuICAgICAqIHdpbGwgYWxzbyB3YWl0IGZvciB0aGF0IHRoZW5hYmxlIHRvIHNldHRsZS5cbiAgICAgKiBUaGlzIGVuYWJsZXMgY2FsbGVycyB0byB3YWl0IGZvciB0aGUgY2FuY2VsbGVkIG9wZXJhdGlvbiB0byB0ZXJtaW5hdGVcbiAgICAgKiB3aXRob3V0IGJlaW5nIGZvcmNlZCB0byBoYW5kbGUgcG90ZW50aWFsIGVycm9ycyBhdCB0aGUgY2FsbCBzaXRlLlxuICAgICAqIGBgYHRzXG4gICAgICogY2FuY2VsbGFibGUuY2FuY2VsKCkudGhlbigoKSA9PiB7XG4gICAgICogICAgIC8vIENsZWFudXAgZmluaXNoZWQsIGl0J3Mgc2FmZSB0byBkbyBzb21ldGhpbmcgZWxzZS5cbiAgICAgKiB9LCAoZXJyKSA9PiB7XG4gICAgICogICAgIC8vIFVucmVhY2hhYmxlOiB0aGUgcHJvbWlzZSByZXR1cm5lZCBmcm9tIGNhbmNlbCB3aWxsIG5ldmVyIHJlamVjdC5cbiAgICAgKiB9KTtcbiAgICAgKiBgYGBcbiAgICAgKiBOb3RlIHRoYXQgdGhlIHJldHVybmVkIHByb21pc2Ugd2lsbCBfbm90XyBoYW5kbGUgaW1wbGljaXRseSBhbnkgcmVqZWN0aW9uXG4gICAgICogdGhhdCBtaWdodCBoYXZlIG9jY3VycmVkIGFscmVhZHkgaW4gdGhlIGNhbmNlbGxlZCBjaGFpbi5cbiAgICAgKiBJdCB3aWxsIGp1c3QgdHJhY2sgd2hldGhlciByZWdpc3RlcmVkIGhhbmRsZXJzIGhhdmUgYmVlbiBleGVjdXRlZCBvciBub3QuXG4gICAgICogVGhlcmVmb3JlLCB1bmhhbmRsZWQgcmVqZWN0aW9ucyB3aWxsIG5ldmVyIGJlIHNpbGVudGx5IGhhbmRsZWQgYnkgY2FsbGluZyBjYW5jZWwuXG4gICAgICovXG4gICAgY2FuY2VsKGNhdXNlPzogYW55KTogQ2FuY2VsbGFibGVQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBDYW5jZWxsYWJsZVByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIC8vIElOVkFSSUFOVDogdGhlIHJlc3VsdCBvZiB0aGlzW2NhbmNlbEltcGxTeW1dIGFuZCB0aGUgYmFycmllciBkbyBub3QgZXZlciByZWplY3QuXG4gICAgICAgICAgICAvLyBVbmZvcnR1bmF0ZWx5IG1hY09TIEhpZ2ggU2llcnJhIGRvZXMgbm90IHN1cHBvcnQgUHJvbWlzZS5hbGxTZXR0bGVkLlxuICAgICAgICAgICAgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgIHRoaXNbY2FuY2VsSW1wbFN5bV0obmV3IENhbmNlbEVycm9yKFwiUHJvbWlzZSBjYW5jZWxsZWQuXCIsIHsgY2F1c2UgfSkpLFxuICAgICAgICAgICAgICAgIGN1cnJlbnRCYXJyaWVyKHRoaXMpXG4gICAgICAgICAgICBdKS50aGVuKCgpID0+IHJlc29sdmUoKSwgKCkgPT4gcmVzb2x2ZSgpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQmluZHMgcHJvbWlzZSBjYW5jZWxsYXRpb24gdG8gdGhlIGFib3J0IGV2ZW50IG9mIHRoZSBnaXZlbiB7QGxpbmsgQWJvcnRTaWduYWx9LlxuICAgICAqIElmIHRoZSBzaWduYWwgaGFzIGFscmVhZHkgYWJvcnRlZCwgdGhlIHByb21pc2Ugd2lsbCBiZSBjYW5jZWxsZWQgaW1tZWRpYXRlbHkuXG4gICAgICogV2hlbiBlaXRoZXIgY29uZGl0aW9uIGlzIHZlcmlmaWVkLCB0aGUgY2FuY2VsbGF0aW9uIGNhdXNlIHdpbGwgYmUgc2V0XG4gICAgICogdG8gdGhlIHNpZ25hbCdzIGFib3J0IHJlYXNvbiAoc2VlIHtAbGluayBBYm9ydFNpZ25hbCNyZWFzb259KS5cbiAgICAgKlxuICAgICAqIEhhcyBubyBlZmZlY3QgaWYgY2FsbGVkIChvciBpZiB0aGUgc2lnbmFsIGFib3J0cykgX2FmdGVyXyB0aGUgcHJvbWlzZSBoYXMgYWxyZWFkeSBzZXR0bGVkLlxuICAgICAqIE9ubHkgdGhlIGZpcnN0IHNpZ25hbCB0byBhYm9ydCB3aWxsIHNldCB0aGUgY2FuY2VsbGF0aW9uIGNhdXNlLlxuICAgICAqXG4gICAgICogRm9yIG1vcmUgZGV0YWlscyBhYm91dCB0aGUgY2FuY2VsbGF0aW9uIHByb2Nlc3MsXG4gICAgICogc2VlIHtAbGluayBjYW5jZWx9IGFuZCB0aGUgYENhbmNlbGxhYmxlUHJvbWlzZWAgY29uc3RydWN0b3IuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBlbmFibGVzIGBhd2FpdGBpbmcgY2FuY2VsbGFibGUgcHJvbWlzZXMgd2l0aG91dCBoYXZpbmdcbiAgICAgKiB0byBzdG9yZSB0aGVtIGZvciBmdXR1cmUgY2FuY2VsbGF0aW9uLCBlLmcuOlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgbG9uZ1J1bm5pbmdPcGVyYXRpb24oKS5jYW5jZWxPbihzaWduYWwpO1xuICAgICAqIGBgYFxuICAgICAqIGluc3RlYWQgb2Y6XG4gICAgICogYGBgdHNcbiAgICAgKiBsZXQgcHJvbWlzZVRvQmVDYW5jZWxsZWQgPSBsb25nUnVubmluZ09wZXJhdGlvbigpO1xuICAgICAqIGF3YWl0IHByb21pc2VUb0JlQ2FuY2VsbGVkO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhpcyBwcm9taXNlLCBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgICAqL1xuICAgIGNhbmNlbE9uKHNpZ25hbDogQWJvcnRTaWduYWwpOiBDYW5jZWxsYWJsZVByb21pc2U8VD4ge1xuICAgICAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgIHZvaWQgdGhpcy5jYW5jZWwoc2lnbmFsLnJlYXNvbilcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsICgpID0+IHZvaWQgdGhpcy5jYW5jZWwoc2lnbmFsLnJlYXNvbiksIHtjYXB0dXJlOiB0cnVlfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBdHRhY2hlcyBjYWxsYmFja3MgZm9yIHRoZSByZXNvbHV0aW9uIGFuZC9vciByZWplY3Rpb24gb2YgdGhlIGBDYW5jZWxsYWJsZVByb21pc2VgLlxuICAgICAqXG4gICAgICogVGhlIG9wdGlvbmFsIGBvbmNhbmNlbGxlZGAgYXJndW1lbnQgd2lsbCBiZSBpbnZva2VkIHdoZW4gdGhlIHJldHVybmVkIHByb21pc2UgaXMgY2FuY2VsbGVkLFxuICAgICAqIHdpdGggdGhlIHNhbWUgc2VtYW50aWNzIGFzIHRoZSBgb25jYW5jZWxsZWRgIGFyZ3VtZW50IG9mIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgKiBXaGVuIHRoZSBwYXJlbnQgcHJvbWlzZSByZWplY3RzIG9yIGlzIGNhbmNlbGxlZCwgdGhlIGBvbnJlamVjdGVkYCBjYWxsYmFjayB3aWxsIHJ1bixcbiAgICAgKiBfZXZlbiBhZnRlciB0aGUgcmV0dXJuZWQgcHJvbWlzZSBoYXMgYmVlbiBjYW5jZWxsZWQ6X1xuICAgICAqIGluIHRoYXQgY2FzZSwgc2hvdWxkIGl0IHJlamVjdCBvciB0aHJvdywgdGhlIHJlYXNvbiB3aWxsIGJlIHdyYXBwZWRcbiAgICAgKiBpbiBhIHtAbGluayBDYW5jZWxsZWRSZWplY3Rpb25FcnJvcn0gYW5kIGJ1YmJsZWQgdXAgYXMgYW4gdW5oYW5kbGVkIHJlamVjdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvbmZ1bGZpbGxlZCBUaGUgY2FsbGJhY2sgdG8gZXhlY3V0ZSB3aGVuIHRoZSBQcm9taXNlIGlzIHJlc29sdmVkLlxuICAgICAqIEBwYXJhbSBvbnJlamVjdGVkIFRoZSBjYWxsYmFjayB0byBleGVjdXRlIHdoZW4gdGhlIFByb21pc2UgaXMgcmVqZWN0ZWQuXG4gICAgICogQHJldHVybnMgQSBgQ2FuY2VsbGFibGVQcm9taXNlYCBmb3IgdGhlIGNvbXBsZXRpb24gb2Ygd2hpY2hldmVyIGNhbGxiYWNrIGlzIGV4ZWN1dGVkLlxuICAgICAqIFRoZSByZXR1cm5lZCBwcm9taXNlIGlzIGhvb2tlZCB1cCB0byBwcm9wYWdhdGUgY2FuY2VsbGF0aW9uIHJlcXVlc3RzIHVwIHRoZSBjaGFpbiwgYnV0IG5vdCBkb3duOlxuICAgICAqXG4gICAgICogICAtIGlmIHRoZSBwYXJlbnQgcHJvbWlzZSBpcyBjYW5jZWxsZWQsIHRoZSBgb25yZWplY3RlZGAgaGFuZGxlciB3aWxsIGJlIGludm9rZWQgd2l0aCBhIGBDYW5jZWxFcnJvcmBcbiAgICAgKiAgICAgYW5kIHRoZSByZXR1cm5lZCBwcm9taXNlIF93aWxsIHJlc29sdmUgcmVndWxhcmx5XyB3aXRoIGl0cyByZXN1bHQ7XG4gICAgICogICAtIGNvbnZlcnNlbHksIGlmIHRoZSByZXR1cm5lZCBwcm9taXNlIGlzIGNhbmNlbGxlZCwgX3RoZSBwYXJlbnQgcHJvbWlzZSBpcyBjYW5jZWxsZWQgdG9vO19cbiAgICAgKiAgICAgdGhlIGBvbnJlamVjdGVkYCBoYW5kbGVyIHdpbGwgc3RpbGwgYmUgaW52b2tlZCB3aXRoIHRoZSBwYXJlbnQncyBgQ2FuY2VsRXJyb3JgLFxuICAgICAqICAgICBidXQgaXRzIHJlc3VsdCB3aWxsIGJlIGRpc2NhcmRlZFxuICAgICAqICAgICBhbmQgdGhlIHJldHVybmVkIHByb21pc2Ugd2lsbCByZWplY3Qgd2l0aCBhIGBDYW5jZWxFcnJvcmAgYXMgd2VsbC5cbiAgICAgKlxuICAgICAqIFRoZSBwcm9taXNlIHJldHVybmVkIGZyb20ge0BsaW5rIGNhbmNlbH0gd2lsbCBmdWxmaWxsIG9ubHkgYWZ0ZXIgYWxsIGF0dGFjaGVkIGhhbmRsZXJzXG4gICAgICogdXAgdGhlIGVudGlyZSBwcm9taXNlIGNoYWluIGhhdmUgYmVlbiBydW4uXG4gICAgICpcbiAgICAgKiBJZiBlaXRoZXIgY2FsbGJhY2sgcmV0dXJucyBhIGNhbmNlbGxhYmxlIHByb21pc2UsXG4gICAgICogY2FuY2VsbGF0aW9uIHJlcXVlc3RzIHdpbGwgYmUgZGl2ZXJ0ZWQgdG8gaXQsXG4gICAgICogYW5kIHRoZSBzcGVjaWZpZWQgYG9uY2FuY2VsbGVkYCBjYWxsYmFjayB3aWxsIGJlIGRpc2NhcmRlZC5cbiAgICAgKi9cbiAgICB0aGVuPFRSZXN1bHQxID0gVCwgVFJlc3VsdDIgPSBuZXZlcj4ob25mdWxmaWxsZWQ/OiAoKHZhbHVlOiBUKSA9PiBUUmVzdWx0MSB8IFByb21pc2VMaWtlPFRSZXN1bHQxPiB8IENhbmNlbGxhYmxlUHJvbWlzZUxpa2U8VFJlc3VsdDE+KSB8IHVuZGVmaW5lZCB8IG51bGwsIG9ucmVqZWN0ZWQ/OiAoKHJlYXNvbjogYW55KSA9PiBUUmVzdWx0MiB8IFByb21pc2VMaWtlPFRSZXN1bHQyPiB8IENhbmNlbGxhYmxlUHJvbWlzZUxpa2U8VFJlc3VsdDI+KSB8IHVuZGVmaW5lZCB8IG51bGwsIG9uY2FuY2VsbGVkPzogQ2FuY2VsbGFibGVQcm9taXNlQ2FuY2VsbGVyKTogQ2FuY2VsbGFibGVQcm9taXNlPFRSZXN1bHQxIHwgVFJlc3VsdDI+IHtcbiAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIENhbmNlbGxhYmxlUHJvbWlzZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5jZWxsYWJsZVByb21pc2UucHJvdG90eXBlLnRoZW4gY2FsbGVkIG9uIGFuIGludmFsaWQgb2JqZWN0LlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5PVEU6IFR5cGVTY3JpcHQncyBidWlsdC1pbiB0eXBlIGZvciB0aGVuIGlzIGJyb2tlbixcbiAgICAgICAgLy8gYXMgaXQgYWxsb3dzIHNwZWNpZnlpbmcgYW4gYXJiaXRyYXJ5IFRSZXN1bHQxICE9IFQgZXZlbiB3aGVuIG9uZnVsZmlsbGVkIGlzIG5vdCBhIGZ1bmN0aW9uLlxuICAgICAgICAvLyBXZSBjYW5ub3QgZml4IGl0IGlmIHdlIHdhbnQgdG8gQ2FuY2VsbGFibGVQcm9taXNlIHRvIGltcGxlbWVudCBQcm9taXNlTGlrZTxUPi5cblxuICAgICAgICBpZiAoIWlzQ2FsbGFibGUob25mdWxmaWxsZWQpKSB7IG9uZnVsZmlsbGVkID0gaWRlbnRpdHkgYXMgYW55OyB9XG4gICAgICAgIGlmICghaXNDYWxsYWJsZShvbnJlamVjdGVkKSkgeyBvbnJlamVjdGVkID0gdGhyb3dlcjsgfVxuXG4gICAgICAgIGlmIChvbmZ1bGZpbGxlZCA9PT0gaWRlbnRpdHkgJiYgb25yZWplY3RlZCA9PSB0aHJvd2VyKSB7XG4gICAgICAgICAgICAvLyBTaG9ydGN1dCBmb3IgdHJpdmlhbCBhcmd1bWVudHMuXG4gICAgICAgICAgICByZXR1cm4gbmV3IENhbmNlbGxhYmxlUHJvbWlzZSgocmVzb2x2ZSkgPT4gcmVzb2x2ZSh0aGlzIGFzIGFueSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYmFycmllcjogUGFydGlhbDxQcm9taXNlV2l0aFJlc29sdmVyczx2b2lkPj4gPSB7fTtcbiAgICAgICAgdGhpc1tiYXJyaWVyU3ltXSA9IGJhcnJpZXI7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBDYW5jZWxsYWJsZVByb21pc2U8VFJlc3VsdDEgfCBUUmVzdWx0Mj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdm9pZCBzdXBlci50aGVuKFxuICAgICAgICAgICAgICAgICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpc1tiYXJyaWVyU3ltXSA9PT0gYmFycmllcikgeyB0aGlzW2JhcnJpZXJTeW1dID0gbnVsbDsgfVxuICAgICAgICAgICAgICAgICAgICBiYXJyaWVyLnJlc29sdmU/LigpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG9uZnVsZmlsbGVkISh2YWx1ZSkpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAocmVhc29uPykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpc1tiYXJyaWVyU3ltXSA9PT0gYmFycmllcikgeyB0aGlzW2JhcnJpZXJTeW1dID0gbnVsbDsgfVxuICAgICAgICAgICAgICAgICAgICBiYXJyaWVyLnJlc29sdmU/LigpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG9ucmVqZWN0ZWQhKHJlYXNvbikpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSwgYXN5bmMgKGNhdXNlPykgPT4ge1xuICAgICAgICAgICAgLy9jYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb25jYW5jZWxsZWQ/LihjYXVzZSk7XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY2FuY2VsKGNhdXNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXR0YWNoZXMgYSBjYWxsYmFjayBmb3Igb25seSB0aGUgcmVqZWN0aW9uIG9mIHRoZSBQcm9taXNlLlxuICAgICAqXG4gICAgICogVGhlIG9wdGlvbmFsIGBvbmNhbmNlbGxlZGAgYXJndW1lbnQgd2lsbCBiZSBpbnZva2VkIHdoZW4gdGhlIHJldHVybmVkIHByb21pc2UgaXMgY2FuY2VsbGVkLFxuICAgICAqIHdpdGggdGhlIHNhbWUgc2VtYW50aWNzIGFzIHRoZSBgb25jYW5jZWxsZWRgIGFyZ3VtZW50IG9mIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgKiBXaGVuIHRoZSBwYXJlbnQgcHJvbWlzZSByZWplY3RzIG9yIGlzIGNhbmNlbGxlZCwgdGhlIGBvbnJlamVjdGVkYCBjYWxsYmFjayB3aWxsIHJ1bixcbiAgICAgKiBfZXZlbiBhZnRlciB0aGUgcmV0dXJuZWQgcHJvbWlzZSBoYXMgYmVlbiBjYW5jZWxsZWQ6X1xuICAgICAqIGluIHRoYXQgY2FzZSwgc2hvdWxkIGl0IHJlamVjdCBvciB0aHJvdywgdGhlIHJlYXNvbiB3aWxsIGJlIHdyYXBwZWRcbiAgICAgKiBpbiBhIHtAbGluayBDYW5jZWxsZWRSZWplY3Rpb25FcnJvcn0gYW5kIGJ1YmJsZWQgdXAgYXMgYW4gdW5oYW5kbGVkIHJlamVjdGlvbi5cbiAgICAgKlxuICAgICAqIEl0IGlzIGVxdWl2YWxlbnQgdG9cbiAgICAgKiBgYGB0c1xuICAgICAqIGNhbmNlbGxhYmxlUHJvbWlzZS50aGVuKHVuZGVmaW5lZCwgb25yZWplY3RlZCwgb25jYW5jZWxsZWQpO1xuICAgICAqIGBgYFxuICAgICAqIGFuZCB0aGUgc2FtZSBjYXZlYXRzIGFwcGx5LlxuICAgICAqXG4gICAgICogQHJldHVybnMgQSBQcm9taXNlIGZvciB0aGUgY29tcGxldGlvbiBvZiB0aGUgY2FsbGJhY2suXG4gICAgICogQ2FuY2VsbGF0aW9uIHJlcXVlc3RzIG9uIHRoZSByZXR1cm5lZCBwcm9taXNlXG4gICAgICogd2lsbCBwcm9wYWdhdGUgdXAgdGhlIGNoYWluIHRvIHRoZSBwYXJlbnQgcHJvbWlzZSxcbiAgICAgKiBidXQgbm90IGluIHRoZSBvdGhlciBkaXJlY3Rpb24uXG4gICAgICpcbiAgICAgKiBUaGUgcHJvbWlzZSByZXR1cm5lZCBmcm9tIHtAbGluayBjYW5jZWx9IHdpbGwgZnVsZmlsbCBvbmx5IGFmdGVyIGFsbCBhdHRhY2hlZCBoYW5kbGVyc1xuICAgICAqIHVwIHRoZSBlbnRpcmUgcHJvbWlzZSBjaGFpbiBoYXZlIGJlZW4gcnVuLlxuICAgICAqXG4gICAgICogSWYgYG9ucmVqZWN0ZWRgIHJldHVybnMgYSBjYW5jZWxsYWJsZSBwcm9taXNlLFxuICAgICAqIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyB3aWxsIGJlIGRpdmVydGVkIHRvIGl0LFxuICAgICAqIGFuZCB0aGUgc3BlY2lmaWVkIGBvbmNhbmNlbGxlZGAgY2FsbGJhY2sgd2lsbCBiZSBkaXNjYXJkZWQuXG4gICAgICogU2VlIHtAbGluayB0aGVufSBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqL1xuICAgIGNhdGNoPFRSZXN1bHQgPSBuZXZlcj4ob25yZWplY3RlZD86ICgocmVhc29uOiBhbnkpID0+IChQcm9taXNlTGlrZTxUUmVzdWx0PiB8IFRSZXN1bHQpKSB8IHVuZGVmaW5lZCB8IG51bGwsIG9uY2FuY2VsbGVkPzogQ2FuY2VsbGFibGVQcm9taXNlQ2FuY2VsbGVyKTogQ2FuY2VsbGFibGVQcm9taXNlPFQgfCBUUmVzdWx0PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRoZW4odW5kZWZpbmVkLCBvbnJlamVjdGVkLCBvbmNhbmNlbGxlZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXR0YWNoZXMgYSBjYWxsYmFjayB0aGF0IGlzIGludm9rZWQgd2hlbiB0aGUgQ2FuY2VsbGFibGVQcm9taXNlIGlzIHNldHRsZWQgKGZ1bGZpbGxlZCBvciByZWplY3RlZCkuIFRoZVxuICAgICAqIHJlc29sdmVkIHZhbHVlIGNhbm5vdCBiZSBhY2Nlc3NlZCBvciBtb2RpZmllZCBmcm9tIHRoZSBjYWxsYmFjay5cbiAgICAgKiBUaGUgcmV0dXJuZWQgcHJvbWlzZSB3aWxsIHNldHRsZSBpbiB0aGUgc2FtZSBzdGF0ZSBhcyB0aGUgb3JpZ2luYWwgb25lXG4gICAgICogYWZ0ZXIgdGhlIHByb3ZpZGVkIGNhbGxiYWNrIGhhcyBjb21wbGV0ZWQgZXhlY3V0aW9uLFxuICAgICAqIHVubGVzcyB0aGUgY2FsbGJhY2sgdGhyb3dzIG9yIHJldHVybnMgYSByZWplY3RpbmcgcHJvbWlzZSxcbiAgICAgKiBpbiB3aGljaCBjYXNlIHRoZSByZXR1cm5lZCBwcm9taXNlIHdpbGwgcmVqZWN0IGFzIHdlbGwuXG4gICAgICpcbiAgICAgKiBUaGUgb3B0aW9uYWwgYG9uY2FuY2VsbGVkYCBhcmd1bWVudCB3aWxsIGJlIGludm9rZWQgd2hlbiB0aGUgcmV0dXJuZWQgcHJvbWlzZSBpcyBjYW5jZWxsZWQsXG4gICAgICogd2l0aCB0aGUgc2FtZSBzZW1hbnRpY3MgYXMgdGhlIGBvbmNhbmNlbGxlZGAgYXJndW1lbnQgb2YgdGhlIGNvbnN0cnVjdG9yLlxuICAgICAqIE9uY2UgdGhlIHBhcmVudCBwcm9taXNlIHNldHRsZXMsIHRoZSBgb25maW5hbGx5YCBjYWxsYmFjayB3aWxsIHJ1bixcbiAgICAgKiBfZXZlbiBhZnRlciB0aGUgcmV0dXJuZWQgcHJvbWlzZSBoYXMgYmVlbiBjYW5jZWxsZWQ6X1xuICAgICAqIGluIHRoYXQgY2FzZSwgc2hvdWxkIGl0IHJlamVjdCBvciB0aHJvdywgdGhlIHJlYXNvbiB3aWxsIGJlIHdyYXBwZWRcbiAgICAgKiBpbiBhIHtAbGluayBDYW5jZWxsZWRSZWplY3Rpb25FcnJvcn0gYW5kIGJ1YmJsZWQgdXAgYXMgYW4gdW5oYW5kbGVkIHJlamVjdGlvbi5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIHtAbGluayB0aGVufSBhbmQgdGhlIHNhbWUgY2F2ZWF0cyBhcHBseS5cbiAgICAgKiBJdCBpcyBwb2x5ZmlsbGVkLCBoZW5jZSBhdmFpbGFibGUgaW4gZXZlcnkgT1Mvd2VidmlldyB2ZXJzaW9uLlxuICAgICAqXG4gICAgICogQHJldHVybnMgQSBQcm9taXNlIGZvciB0aGUgY29tcGxldGlvbiBvZiB0aGUgY2FsbGJhY2suXG4gICAgICogQ2FuY2VsbGF0aW9uIHJlcXVlc3RzIG9uIHRoZSByZXR1cm5lZCBwcm9taXNlXG4gICAgICogd2lsbCBwcm9wYWdhdGUgdXAgdGhlIGNoYWluIHRvIHRoZSBwYXJlbnQgcHJvbWlzZSxcbiAgICAgKiBidXQgbm90IGluIHRoZSBvdGhlciBkaXJlY3Rpb24uXG4gICAgICpcbiAgICAgKiBUaGUgcHJvbWlzZSByZXR1cm5lZCBmcm9tIHtAbGluayBjYW5jZWx9IHdpbGwgZnVsZmlsbCBvbmx5IGFmdGVyIGFsbCBhdHRhY2hlZCBoYW5kbGVyc1xuICAgICAqIHVwIHRoZSBlbnRpcmUgcHJvbWlzZSBjaGFpbiBoYXZlIGJlZW4gcnVuLlxuICAgICAqXG4gICAgICogSWYgYG9uZmluYWxseWAgcmV0dXJucyBhIGNhbmNlbGxhYmxlIHByb21pc2UsXG4gICAgICogY2FuY2VsbGF0aW9uIHJlcXVlc3RzIHdpbGwgYmUgZGl2ZXJ0ZWQgdG8gaXQsXG4gICAgICogYW5kIHRoZSBzcGVjaWZpZWQgYG9uY2FuY2VsbGVkYCBjYWxsYmFjayB3aWxsIGJlIGRpc2NhcmRlZC5cbiAgICAgKiBTZWUge0BsaW5rIHRoZW59IGZvciBtb3JlIGRldGFpbHMuXG4gICAgICovXG4gICAgZmluYWxseShvbmZpbmFsbHk/OiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWQgfCBudWxsLCBvbmNhbmNlbGxlZD86IENhbmNlbGxhYmxlUHJvbWlzZUNhbmNlbGxlcik6IENhbmNlbGxhYmxlUHJvbWlzZTxUPiB7XG4gICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBDYW5jZWxsYWJsZVByb21pc2UpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2FuY2VsbGFibGVQcm9taXNlLnByb3RvdHlwZS5maW5hbGx5IGNhbGxlZCBvbiBhbiBpbnZhbGlkIG9iamVjdC5cIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzQ2FsbGFibGUob25maW5hbGx5KSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudGhlbihvbmZpbmFsbHksIG9uZmluYWxseSwgb25jYW5jZWxsZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudGhlbihcbiAgICAgICAgICAgICh2YWx1ZSkgPT4gQ2FuY2VsbGFibGVQcm9taXNlLnJlc29sdmUob25maW5hbGx5KCkpLnRoZW4oKCkgPT4gdmFsdWUpLFxuICAgICAgICAgICAgKHJlYXNvbj8pID0+IENhbmNlbGxhYmxlUHJvbWlzZS5yZXNvbHZlKG9uZmluYWxseSgpKS50aGVuKCgpID0+IHsgdGhyb3cgcmVhc29uOyB9KSxcbiAgICAgICAgICAgIG9uY2FuY2VsbGVkLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdlIHVzZSB0aGUgYFtTeW1ib2wuc3BlY2llc11gIHN0YXRpYyBwcm9wZXJ0eSwgaWYgYXZhaWxhYmxlLFxuICAgICAqIHRvIGRpc2FibGUgdGhlIGJ1aWx0LWluIGF1dG9tYXRpYyBzdWJjbGFzc2luZyBmZWF0dXJlcyBmcm9tIHtAbGluayBQcm9taXNlfS5cbiAgICAgKiBJdCBpcyBjcml0aWNhbCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucyB0aGF0IGV4dGVuZGVycyBkbyBub3Qgb3ZlcnJpZGUgdGhpcy5cbiAgICAgKiBPbmNlIHRoZSBwcm9wb3NhbCBhdCBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1ybS1idWlsdGluLXN1YmNsYXNzaW5nXG4gICAgICogaXMgZWl0aGVyIGFjY2VwdGVkIG9yIHJldGlyZWQsIHRoaXMgaW1wbGVtZW50YXRpb24gd2lsbCBoYXZlIHRvIGJlIHJldmlzZWQgYWNjb3JkaW5nbHkuXG4gICAgICpcbiAgICAgKiBAaWdub3JlXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgc3RhdGljIGdldCBbc3BlY2llc10oKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBDYW5jZWxsYWJsZVByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoIGFuIGFycmF5IG9mIHJlc3VsdHNcbiAgICAgKiB3aGVuIGFsbCBvZiB0aGUgcHJvdmlkZWQgUHJvbWlzZXMgcmVzb2x2ZSwgb3IgcmVqZWN0ZWQgd2hlbiBhbnkgUHJvbWlzZSBpcyByZWplY3RlZC5cbiAgICAgKlxuICAgICAqIEV2ZXJ5IG9uZSBvZiB0aGUgcHJvdmlkZWQgb2JqZWN0cyB0aGF0IGlzIGEgdGhlbmFibGUgX2FuZF8gY2FuY2VsbGFibGUgb2JqZWN0XG4gICAgICogd2lsbCBiZSBjYW5jZWxsZWQgd2hlbiB0aGUgcmV0dXJuZWQgcHJvbWlzZSBpcyBjYW5jZWxsZWQsIHdpdGggdGhlIHNhbWUgY2F1c2UuXG4gICAgICpcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcbiAgICAgKi9cbiAgICBzdGF0aWMgYWxsPFQ+KHZhbHVlczogSXRlcmFibGU8VCB8IFByb21pc2VMaWtlPFQ+Pik6IENhbmNlbGxhYmxlUHJvbWlzZTxBd2FpdGVkPFQ+W10+O1xuICAgIHN0YXRpYyBhbGw8VCBleHRlbmRzIHJlYWRvbmx5IHVua25vd25bXSB8IFtdPih2YWx1ZXM6IFQpOiBDYW5jZWxsYWJsZVByb21pc2U8eyAtcmVhZG9ubHkgW1AgaW4ga2V5b2YgVF06IEF3YWl0ZWQ8VFtQXT47IH0+O1xuICAgIHN0YXRpYyBhbGw8VCBleHRlbmRzIEl0ZXJhYmxlPHVua25vd24+IHwgQXJyYXlMaWtlPHVua25vd24+Pih2YWx1ZXM6IFQpOiBDYW5jZWxsYWJsZVByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICBsZXQgY29sbGVjdGVkID0gQXJyYXkuZnJvbSh2YWx1ZXMpO1xuICAgICAgICBjb25zdCBwcm9taXNlID0gY29sbGVjdGVkLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgPyBDYW5jZWxsYWJsZVByb21pc2UucmVzb2x2ZShjb2xsZWN0ZWQpXG4gICAgICAgICAgICA6IG5ldyBDYW5jZWxsYWJsZVByb21pc2U8dW5rbm93bj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHZvaWQgUHJvbWlzZS5hbGwoY29sbGVjdGVkKS50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgICB9LCAoY2F1c2U/KTogUHJvbWlzZTx2b2lkPiA9PiBjYW5jZWxBbGwocHJvbWlzZSwgY29sbGVjdGVkLCBjYXVzZSkpO1xuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgQ2FuY2VsbGFibGVQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aCBhbiBhcnJheSBvZiByZXN1bHRzXG4gICAgICogd2hlbiBhbGwgb2YgdGhlIHByb3ZpZGVkIFByb21pc2VzIHJlc29sdmUgb3IgcmVqZWN0LlxuICAgICAqXG4gICAgICogRXZlcnkgb25lIG9mIHRoZSBwcm92aWRlZCBvYmplY3RzIHRoYXQgaXMgYSB0aGVuYWJsZSBfYW5kXyBjYW5jZWxsYWJsZSBvYmplY3RcbiAgICAgKiB3aWxsIGJlIGNhbmNlbGxlZCB3aGVuIHRoZSByZXR1cm5lZCBwcm9taXNlIGlzIGNhbmNlbGxlZCwgd2l0aCB0aGUgc2FtZSBjYXVzZS5cbiAgICAgKlxuICAgICAqIEBncm91cCBTdGF0aWMgTWV0aG9kc1xuICAgICAqL1xuICAgIHN0YXRpYyBhbGxTZXR0bGVkPFQ+KHZhbHVlczogSXRlcmFibGU8VCB8IFByb21pc2VMaWtlPFQ+Pik6IENhbmNlbGxhYmxlUHJvbWlzZTxQcm9taXNlU2V0dGxlZFJlc3VsdDxBd2FpdGVkPFQ+PltdPjtcbiAgICBzdGF0aWMgYWxsU2V0dGxlZDxUIGV4dGVuZHMgcmVhZG9ubHkgdW5rbm93bltdIHwgW10+KHZhbHVlczogVCk6IENhbmNlbGxhYmxlUHJvbWlzZTx7IC1yZWFkb25seSBbUCBpbiBrZXlvZiBUXTogUHJvbWlzZVNldHRsZWRSZXN1bHQ8QXdhaXRlZDxUW1BdPj47IH0+O1xuICAgIHN0YXRpYyBhbGxTZXR0bGVkPFQgZXh0ZW5kcyBJdGVyYWJsZTx1bmtub3duPiB8IEFycmF5TGlrZTx1bmtub3duPj4odmFsdWVzOiBUKTogQ2FuY2VsbGFibGVQcm9taXNlPHVua25vd24+IHtcbiAgICAgICAgbGV0IGNvbGxlY3RlZCA9IEFycmF5LmZyb20odmFsdWVzKTtcbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IGNvbGxlY3RlZC5sZW5ndGggPT09IDBcbiAgICAgICAgICAgID8gQ2FuY2VsbGFibGVQcm9taXNlLnJlc29sdmUoY29sbGVjdGVkKVxuICAgICAgICAgICAgOiBuZXcgQ2FuY2VsbGFibGVQcm9taXNlPHVua25vd24+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICB2b2lkIFByb21pc2UuYWxsU2V0dGxlZChjb2xsZWN0ZWQpLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICAgIH0sIChjYXVzZT8pOiBQcm9taXNlPHZvaWQ+ID0+IGNhbmNlbEFsbChwcm9taXNlLCBjb2xsZWN0ZWQsIGNhdXNlKSk7XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBhbnkgZnVuY3Rpb24gcmV0dXJucyBhIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgYnkgdGhlIGZpcnN0IGdpdmVuIHByb21pc2UgdG8gYmUgZnVsZmlsbGVkLFxuICAgICAqIG9yIHJlamVjdGVkIHdpdGggYW4gQWdncmVnYXRlRXJyb3IgY29udGFpbmluZyBhbiBhcnJheSBvZiByZWplY3Rpb24gcmVhc29uc1xuICAgICAqIGlmIGFsbCBvZiB0aGUgZ2l2ZW4gcHJvbWlzZXMgYXJlIHJlamVjdGVkLlxuICAgICAqIEl0IHJlc29sdmVzIGFsbCBlbGVtZW50cyBvZiB0aGUgcGFzc2VkIGl0ZXJhYmxlIHRvIHByb21pc2VzIGFzIGl0IHJ1bnMgdGhpcyBhbGdvcml0aG0uXG4gICAgICpcbiAgICAgKiBFdmVyeSBvbmUgb2YgdGhlIHByb3ZpZGVkIG9iamVjdHMgdGhhdCBpcyBhIHRoZW5hYmxlIF9hbmRfIGNhbmNlbGxhYmxlIG9iamVjdFxuICAgICAqIHdpbGwgYmUgY2FuY2VsbGVkIHdoZW4gdGhlIHJldHVybmVkIHByb21pc2UgaXMgY2FuY2VsbGVkLCB3aXRoIHRoZSBzYW1lIGNhdXNlLlxuICAgICAqXG4gICAgICogQGdyb3VwIFN0YXRpYyBNZXRob2RzXG4gICAgICovXG4gICAgc3RhdGljIGFueTxUPih2YWx1ZXM6IEl0ZXJhYmxlPFQgfCBQcm9taXNlTGlrZTxUPj4pOiBDYW5jZWxsYWJsZVByb21pc2U8QXdhaXRlZDxUPj47XG4gICAgc3RhdGljIGFueTxUIGV4dGVuZHMgcmVhZG9ubHkgdW5rbm93bltdIHwgW10+KHZhbHVlczogVCk6IENhbmNlbGxhYmxlUHJvbWlzZTxBd2FpdGVkPFRbbnVtYmVyXT4+O1xuICAgIHN0YXRpYyBhbnk8VCBleHRlbmRzIEl0ZXJhYmxlPHVua25vd24+IHwgQXJyYXlMaWtlPHVua25vd24+Pih2YWx1ZXM6IFQpOiBDYW5jZWxsYWJsZVByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICBsZXQgY29sbGVjdGVkID0gQXJyYXkuZnJvbSh2YWx1ZXMpO1xuICAgICAgICBjb25zdCBwcm9taXNlID0gY29sbGVjdGVkLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgPyBDYW5jZWxsYWJsZVByb21pc2UucmVzb2x2ZShjb2xsZWN0ZWQpXG4gICAgICAgICAgICA6IG5ldyBDYW5jZWxsYWJsZVByb21pc2U8dW5rbm93bj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHZvaWQgUHJvbWlzZS5hbnkoY29sbGVjdGVkKS50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgICB9LCAoY2F1c2U/KTogUHJvbWlzZTx2b2lkPiA9PiBjYW5jZWxBbGwocHJvbWlzZSwgY29sbGVjdGVkLCBjYXVzZSkpO1xuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIG9yIHJlamVjdGVkIHdoZW4gYW55IG9mIHRoZSBwcm92aWRlZCBQcm9taXNlcyBhcmUgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQuXG4gICAgICpcbiAgICAgKiBFdmVyeSBvbmUgb2YgdGhlIHByb3ZpZGVkIG9iamVjdHMgdGhhdCBpcyBhIHRoZW5hYmxlIF9hbmRfIGNhbmNlbGxhYmxlIG9iamVjdFxuICAgICAqIHdpbGwgYmUgY2FuY2VsbGVkIHdoZW4gdGhlIHJldHVybmVkIHByb21pc2UgaXMgY2FuY2VsbGVkLCB3aXRoIHRoZSBzYW1lIGNhdXNlLlxuICAgICAqXG4gICAgICogQGdyb3VwIFN0YXRpYyBNZXRob2RzXG4gICAgICovXG4gICAgc3RhdGljIHJhY2U8VD4odmFsdWVzOiBJdGVyYWJsZTxUIHwgUHJvbWlzZUxpa2U8VD4+KTogQ2FuY2VsbGFibGVQcm9taXNlPEF3YWl0ZWQ8VD4+O1xuICAgIHN0YXRpYyByYWNlPFQgZXh0ZW5kcyByZWFkb25seSB1bmtub3duW10gfCBbXT4odmFsdWVzOiBUKTogQ2FuY2VsbGFibGVQcm9taXNlPEF3YWl0ZWQ8VFtudW1iZXJdPj47XG4gICAgc3RhdGljIHJhY2U8VCBleHRlbmRzIEl0ZXJhYmxlPHVua25vd24+IHwgQXJyYXlMaWtlPHVua25vd24+Pih2YWx1ZXM6IFQpOiBDYW5jZWxsYWJsZVByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICBsZXQgY29sbGVjdGVkID0gQXJyYXkuZnJvbSh2YWx1ZXMpO1xuICAgICAgICBjb25zdCBwcm9taXNlID0gbmV3IENhbmNlbGxhYmxlUHJvbWlzZTx1bmtub3duPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB2b2lkIFByb21pc2UucmFjZShjb2xsZWN0ZWQpLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSwgKGNhdXNlPyk6IFByb21pc2U8dm9pZD4gPT4gY2FuY2VsQWxsKHByb21pc2UsIGNvbGxlY3RlZCwgY2F1c2UpKTtcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBjYW5jZWxsZWQgQ2FuY2VsbGFibGVQcm9taXNlIGZvciB0aGUgcHJvdmlkZWQgY2F1c2UuXG4gICAgICpcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcbiAgICAgKi9cbiAgICBzdGF0aWMgY2FuY2VsPFQgPSBuZXZlcj4oY2F1c2U/OiBhbnkpOiBDYW5jZWxsYWJsZVByb21pc2U8VD4ge1xuICAgICAgICBjb25zdCBwID0gbmV3IENhbmNlbGxhYmxlUHJvbWlzZTxUPigoKSA9PiB7fSk7XG4gICAgICAgIHAuY2FuY2VsKGNhdXNlKTtcbiAgICAgICAgcmV0dXJuIHA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBDYW5jZWxsYWJsZVByb21pc2UgdGhhdCBjYW5jZWxzXG4gICAgICogYWZ0ZXIgdGhlIHNwZWNpZmllZCB0aW1lb3V0LCB3aXRoIHRoZSBwcm92aWRlZCBjYXVzZS5cbiAgICAgKlxuICAgICAqIElmIHRoZSB7QGxpbmsgQWJvcnRTaWduYWwudGltZW91dH0gZmFjdG9yeSBtZXRob2QgaXMgYXZhaWxhYmxlLFxuICAgICAqIGl0IGlzIHVzZWQgdG8gYmFzZSB0aGUgdGltZW91dCBvbiBfYWN0aXZlXyB0aW1lIHJhdGhlciB0aGFuIF9lbGFwc2VkXyB0aW1lLlxuICAgICAqIE90aGVyd2lzZSwgYHRpbWVvdXRgIGZhbGxzIGJhY2sgdG8ge0BsaW5rIHNldFRpbWVvdXR9LlxuICAgICAqXG4gICAgICogQGdyb3VwIFN0YXRpYyBNZXRob2RzXG4gICAgICovXG4gICAgc3RhdGljIHRpbWVvdXQ8VCA9IG5ldmVyPihtaWxsaXNlY29uZHM6IG51bWJlciwgY2F1c2U/OiBhbnkpOiBDYW5jZWxsYWJsZVByb21pc2U8VD4ge1xuICAgICAgICBjb25zdCBwcm9taXNlID0gbmV3IENhbmNlbGxhYmxlUHJvbWlzZTxUPigoKSA9PiB7fSk7XG4gICAgICAgIGlmIChBYm9ydFNpZ25hbCAmJiB0eXBlb2YgQWJvcnRTaWduYWwgPT09ICdmdW5jdGlvbicgJiYgQWJvcnRTaWduYWwudGltZW91dCAmJiB0eXBlb2YgQWJvcnRTaWduYWwudGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgQWJvcnRTaWduYWwudGltZW91dChtaWxsaXNlY29uZHMpLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgKCkgPT4gdm9pZCBwcm9taXNlLmNhbmNlbChjYXVzZSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB2b2lkIHByb21pc2UuY2FuY2VsKGNhdXNlKSwgbWlsbGlzZWNvbmRzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IENhbmNlbGxhYmxlUHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIHRoZSBzcGVjaWZpZWQgdGltZW91dC5cbiAgICAgKiBUaGUgcmV0dXJuZWQgcHJvbWlzZSBjYW4gYmUgY2FuY2VsbGVkIHdpdGhvdXQgY29uc2VxdWVuY2VzLlxuICAgICAqXG4gICAgICogQGdyb3VwIFN0YXRpYyBNZXRob2RzXG4gICAgICovXG4gICAgc3RhdGljIHNsZWVwKG1pbGxpc2Vjb25kczogbnVtYmVyKTogQ2FuY2VsbGFibGVQcm9taXNlPHZvaWQ+O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ2FuY2VsbGFibGVQcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXJcbiAgICAgKiB0aGUgc3BlY2lmaWVkIHRpbWVvdXQsIHdpdGggdGhlIHByb3ZpZGVkIHZhbHVlLlxuICAgICAqIFRoZSByZXR1cm5lZCBwcm9taXNlIGNhbiBiZSBjYW5jZWxsZWQgd2l0aG91dCBjb25zZXF1ZW5jZXMuXG4gICAgICpcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcbiAgICAgKi9cbiAgICBzdGF0aWMgc2xlZXA8VD4obWlsbGlzZWNvbmRzOiBudW1iZXIsIHZhbHVlOiBUKTogQ2FuY2VsbGFibGVQcm9taXNlPFQ+O1xuICAgIHN0YXRpYyBzbGVlcDxUID0gdm9pZD4obWlsbGlzZWNvbmRzOiBudW1iZXIsIHZhbHVlPzogVCk6IENhbmNlbGxhYmxlUHJvbWlzZTxUPiB7XG4gICAgICAgIHJldHVybiBuZXcgQ2FuY2VsbGFibGVQcm9taXNlPFQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHJlc29sdmUodmFsdWUhKSwgbWlsbGlzZWNvbmRzKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyByZWplY3RlZCBDYW5jZWxsYWJsZVByb21pc2UgZm9yIHRoZSBwcm92aWRlZCByZWFzb24uXG4gICAgICpcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcbiAgICAgKi9cbiAgICBzdGF0aWMgcmVqZWN0PFQgPSBuZXZlcj4ocmVhc29uPzogYW55KTogQ2FuY2VsbGFibGVQcm9taXNlPFQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBDYW5jZWxsYWJsZVByb21pc2U8VD4oKF8sIHJlamVjdCkgPT4gcmVqZWN0KHJlYXNvbikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgcmVzb2x2ZWQgQ2FuY2VsbGFibGVQcm9taXNlLlxuICAgICAqXG4gICAgICogQGdyb3VwIFN0YXRpYyBNZXRob2RzXG4gICAgICovXG4gICAgc3RhdGljIHJlc29sdmUoKTogQ2FuY2VsbGFibGVQcm9taXNlPHZvaWQ+O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgcmVzb2x2ZWQgQ2FuY2VsbGFibGVQcm9taXNlIGZvciB0aGUgcHJvdmlkZWQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcbiAgICAgKi9cbiAgICBzdGF0aWMgcmVzb2x2ZTxUPih2YWx1ZTogVCk6IENhbmNlbGxhYmxlUHJvbWlzZTxBd2FpdGVkPFQ+PjtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHJlc29sdmVkIENhbmNlbGxhYmxlUHJvbWlzZSBmb3IgdGhlIHByb3ZpZGVkIHZhbHVlLlxuICAgICAqXG4gICAgICogQGdyb3VwIFN0YXRpYyBNZXRob2RzXG4gICAgICovXG4gICAgc3RhdGljIHJlc29sdmU8VD4odmFsdWU6IFQgfCBQcm9taXNlTGlrZTxUPik6IENhbmNlbGxhYmxlUHJvbWlzZTxBd2FpdGVkPFQ+PjtcbiAgICBzdGF0aWMgcmVzb2x2ZTxUID0gdm9pZD4odmFsdWU/OiBUIHwgUHJvbWlzZUxpa2U8VD4pOiBDYW5jZWxsYWJsZVByb21pc2U8QXdhaXRlZDxUPj4ge1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBDYW5jZWxsYWJsZVByb21pc2UpIHtcbiAgICAgICAgICAgIC8vIE9wdGltaXNlIGZvciBjYW5jZWxsYWJsZSBwcm9taXNlcy5cbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IENhbmNlbGxhYmxlUHJvbWlzZTxhbnk+KChyZXNvbHZlKSA9PiByZXNvbHZlKHZhbHVlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBDYW5jZWxsYWJsZVByb21pc2UgYW5kIHJldHVybnMgaXQgaW4gYW4gb2JqZWN0LCBhbG9uZyB3aXRoIGl0cyByZXNvbHZlIGFuZCByZWplY3QgZnVuY3Rpb25zXG4gICAgICogYW5kIGEgZ2V0dGVyL3NldHRlciBmb3IgdGhlIGNhbmNlbGxhdGlvbiBjYWxsYmFjay5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHBvbHlmaWxsZWQsIGhlbmNlIGF2YWlsYWJsZSBpbiBldmVyeSBPUy93ZWJ2aWV3IHZlcnNpb24uXG4gICAgICpcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcbiAgICAgKi9cbiAgICBzdGF0aWMgd2l0aFJlc29sdmVyczxUPigpOiBDYW5jZWxsYWJsZVByb21pc2VXaXRoUmVzb2x2ZXJzPFQ+IHtcbiAgICAgICAgbGV0IHJlc3VsdDogQ2FuY2VsbGFibGVQcm9taXNlV2l0aFJlc29sdmVyczxUPiA9IHsgb25jYW5jZWxsZWQ6IG51bGwgfSBhcyBhbnk7XG4gICAgICAgIHJlc3VsdC5wcm9taXNlID0gbmV3IENhbmNlbGxhYmxlUHJvbWlzZTxUPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICByZXN1bHQucmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgICAgICByZXN1bHQucmVqZWN0ID0gcmVqZWN0O1xuICAgICAgICB9LCAoY2F1c2U/OiBhbnkpID0+IHsgcmVzdWx0Lm9uY2FuY2VsbGVkPy4oY2F1c2UpOyB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGNhbGxiYWNrIHRoYXQgaW1wbGVtZW50cyB0aGUgY2FuY2VsbGF0aW9uIGFsZ29yaXRobSBmb3IgdGhlIGdpdmVuIGNhbmNlbGxhYmxlIHByb21pc2UuXG4gKiBUaGUgcHJvbWlzZSByZXR1cm5lZCBmcm9tIHRoZSByZXN1bHRpbmcgZnVuY3Rpb24gZG9lcyBub3QgcmVqZWN0LlxuICovXG5mdW5jdGlvbiBjYW5jZWxsZXJGb3I8VD4ocHJvbWlzZTogQ2FuY2VsbGFibGVQcm9taXNlV2l0aFJlc29sdmVyczxUPiwgc3RhdGU6IENhbmNlbGxhYmxlUHJvbWlzZVN0YXRlKSB7XG4gICAgbGV0IGNhbmNlbGxhdGlvblByb21pc2U6IHZvaWQgfCBQcm9taXNlTGlrZTx2b2lkPiA9IHVuZGVmaW5lZDtcblxuICAgIHJldHVybiAocmVhc29uOiBDYW5jZWxFcnJvcik6IHZvaWQgfCBQcm9taXNlTGlrZTx2b2lkPiA9PiB7XG4gICAgICAgIGlmICghc3RhdGUuc2V0dGxlZCkge1xuICAgICAgICAgICAgc3RhdGUuc2V0dGxlZCA9IHRydWU7XG4gICAgICAgICAgICBzdGF0ZS5yZWFzb24gPSByZWFzb247XG4gICAgICAgICAgICBwcm9taXNlLnJlamVjdChyZWFzb24pO1xuXG4gICAgICAgICAgICAvLyBBdHRhY2ggYW4gZXJyb3IgaGFuZGxlciB0aGF0IGlnbm9yZXMgdGhpcyBzcGVjaWZpYyByZWplY3Rpb24gcmVhc29uIGFuZCBub3RoaW5nIGVsc2UuXG4gICAgICAgICAgICAvLyBJbiB0aGVvcnksIGEgc2FuZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIGF0IHRoaXMgcG9pbnRcbiAgICAgICAgICAgIC8vIHNob3VsZCBhbHdheXMgcmVqZWN0IHdpdGggb3VyIGNhbmNlbGxhdGlvbiByZWFzb24sXG4gICAgICAgICAgICAvLyBoZW5jZSB0aGUgaGFuZGxlciB3aWxsIG5ldmVyIHRocm93LlxuICAgICAgICAgICAgdm9pZCBQcm9taXNlLnByb3RvdHlwZS50aGVuLmNhbGwocHJvbWlzZS5wcm9taXNlLCB1bmRlZmluZWQsIChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyICE9PSByZWFzb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgcmVhc29uIGlzIG5vdCBzZXQsIHRoZSBwcm9taXNlIHJlc29sdmVkIHJlZ3VsYXJseSwgaGVuY2Ugd2UgbXVzdCBub3QgY2FsbCBvbmNhbmNlbGxlZC5cbiAgICAgICAgLy8gSWYgb25jYW5jZWxsZWQgaXMgdW5zZXQsIG5vIG5lZWQgdG8gZ28gYW55IGZ1cnRoZXIuXG4gICAgICAgIGlmICghc3RhdGUucmVhc29uIHx8ICFwcm9taXNlLm9uY2FuY2VsbGVkKSB7IHJldHVybjsgfVxuXG4gICAgICAgIGNhbmNlbGxhdGlvblByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHByb21pc2Uub25jYW5jZWxsZWQhKHN0YXRlLnJlYXNvbiEuY2F1c2UpKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIFByb21pc2UucmVqZWN0KG5ldyBDYW5jZWxsZWRSZWplY3Rpb25FcnJvcihwcm9taXNlLnByb21pc2UsIGVyciwgXCJVbmhhbmRsZWQgZXhjZXB0aW9uIGluIG9uY2FuY2VsbGVkIGNhbGxiYWNrLlwiKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pLmNhdGNoKChyZWFzb24/KSA9PiB7XG4gICAgICAgICAgICBQcm9taXNlLnJlamVjdChuZXcgQ2FuY2VsbGVkUmVqZWN0aW9uRXJyb3IocHJvbWlzZS5wcm9taXNlLCByZWFzb24sIFwiVW5oYW5kbGVkIHJlamVjdGlvbiBpbiBvbmNhbmNlbGxlZCBjYWxsYmFjay5cIikpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBVbnNldCBvbmNhbmNlbGxlZCB0byBwcmV2ZW50IHJlcGVhdGVkIGNhbGxzLlxuICAgICAgICBwcm9taXNlLm9uY2FuY2VsbGVkID0gbnVsbDtcblxuICAgICAgICByZXR1cm4gY2FuY2VsbGF0aW9uUHJvbWlzZTtcbiAgICB9XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGNhbGxiYWNrIHRoYXQgaW1wbGVtZW50cyB0aGUgcmVzb2x1dGlvbiBhbGdvcml0aG0gZm9yIHRoZSBnaXZlbiBjYW5jZWxsYWJsZSBwcm9taXNlLlxuICovXG5mdW5jdGlvbiByZXNvbHZlckZvcjxUPihwcm9taXNlOiBDYW5jZWxsYWJsZVByb21pc2VXaXRoUmVzb2x2ZXJzPFQ+LCBzdGF0ZTogQ2FuY2VsbGFibGVQcm9taXNlU3RhdGUpOiBDYW5jZWxsYWJsZVByb21pc2VSZXNvbHZlcjxUPiB7XG4gICAgcmV0dXJuICh2YWx1ZSkgPT4ge1xuICAgICAgICBpZiAoc3RhdGUucmVzb2x2aW5nKSB7IHJldHVybjsgfVxuICAgICAgICBzdGF0ZS5yZXNvbHZpbmcgPSB0cnVlO1xuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gcHJvbWlzZS5wcm9taXNlKSB7XG4gICAgICAgICAgICBpZiAoc3RhdGUuc2V0dGxlZCkgeyByZXR1cm47IH1cbiAgICAgICAgICAgIHN0YXRlLnNldHRsZWQgPSB0cnVlO1xuICAgICAgICAgICAgcHJvbWlzZS5yZWplY3QobmV3IFR5cGVFcnJvcihcIkEgcHJvbWlzZSBjYW5ub3QgYmUgcmVzb2x2ZWQgd2l0aCBpdHNlbGYuXCIpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgICAgICAgIGxldCB0aGVuOiBhbnk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoZW4gPSAodmFsdWUgYXMgYW55KS50aGVuO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgc3RhdGUuc2V0dGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgcHJvbWlzZS5yZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpc0NhbGxhYmxlKHRoZW4pKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNhbmNlbCA9ICh2YWx1ZSBhcyBhbnkpLmNhbmNlbDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ2FsbGFibGUoY2FuY2VsKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb25jYW5jZWxsZWQgPSAoY2F1c2U/OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZsZWN0LmFwcGx5KGNhbmNlbCwgdmFsdWUsIFtjYXVzZV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5yZWFzb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBhbHJlYWR5IGNhbmNlbGxlZCwgcHJvcGFnYXRlIGNhbmNlbGxhdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcHJvbWlzZSByZXR1cm5lZCBmcm9tIHRoZSBjYW5jZWxsZXIgYWxnb3JpdGhtIGRvZXMgbm90IHJlamVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIGl0IGNhbiBiZSBkaXNjYXJkZWQgc2FmZWx5LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgY2FuY2VsbGVyRm9yKHsgLi4ucHJvbWlzZSwgb25jYW5jZWxsZWQgfSwgc3RhdGUpKHN0YXRlLnJlYXNvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2Uub25jYW5jZWxsZWQgPSBvbmNhbmNlbGxlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2gge31cblxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1N0YXRlOiBDYW5jZWxsYWJsZVByb21pc2VTdGF0ZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgcm9vdDogc3RhdGUucm9vdCxcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2aW5nOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgZ2V0IHNldHRsZWQoKSB7IHJldHVybiB0aGlzLnJvb3Quc2V0dGxlZCB9LFxuICAgICAgICAgICAgICAgICAgICBzZXQgc2V0dGxlZCh2YWx1ZSkgeyB0aGlzLnJvb3Quc2V0dGxlZCA9IHZhbHVlOyB9LFxuICAgICAgICAgICAgICAgICAgICBnZXQgcmVhc29uKCkgeyByZXR1cm4gdGhpcy5yb290LnJlYXNvbiB9XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlamVjdG9yID0gcmVqZWN0b3JGb3IocHJvbWlzZSwgbmV3U3RhdGUpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIFJlZmxlY3QuYXBwbHkodGhlbiwgdmFsdWUsIFtyZXNvbHZlckZvcihwcm9taXNlLCBuZXdTdGF0ZSksIHJlamVjdG9yXSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdG9yKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjsgLy8gSU1QT1JUQU5UIVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0YXRlLnNldHRsZWQpIHsgcmV0dXJuOyB9XG4gICAgICAgIHN0YXRlLnNldHRsZWQgPSB0cnVlO1xuICAgICAgICBwcm9taXNlLnJlc29sdmUodmFsdWUpO1xuICAgIH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGNhbGxiYWNrIHRoYXQgaW1wbGVtZW50cyB0aGUgcmVqZWN0aW9uIGFsZ29yaXRobSBmb3IgdGhlIGdpdmVuIGNhbmNlbGxhYmxlIHByb21pc2UuXG4gKi9cbmZ1bmN0aW9uIHJlamVjdG9yRm9yPFQ+KHByb21pc2U6IENhbmNlbGxhYmxlUHJvbWlzZVdpdGhSZXNvbHZlcnM8VD4sIHN0YXRlOiBDYW5jZWxsYWJsZVByb21pc2VTdGF0ZSk6IENhbmNlbGxhYmxlUHJvbWlzZVJlamVjdG9yIHtcbiAgICByZXR1cm4gKHJlYXNvbj8pID0+IHtcbiAgICAgICAgaWYgKHN0YXRlLnJlc29sdmluZykgeyByZXR1cm47IH1cbiAgICAgICAgc3RhdGUucmVzb2x2aW5nID0gdHJ1ZTtcblxuICAgICAgICBpZiAoc3RhdGUuc2V0dGxlZCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAocmVhc29uIGluc3RhbmNlb2YgQ2FuY2VsRXJyb3IgJiYgc3RhdGUucmVhc29uIGluc3RhbmNlb2YgQ2FuY2VsRXJyb3IgJiYgT2JqZWN0LmlzKHJlYXNvbi5jYXVzZSwgc3RhdGUucmVhc29uLmNhdXNlKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTd2FsbG93IGxhdGUgcmVqZWN0aW9ucyB0aGF0IGFyZSBDYW5jZWxFcnJvcnMgd2hvc2UgY2FuY2VsbGF0aW9uIGNhdXNlIGlzIHRoZSBzYW1lIGFzIG91cnMuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIHt9XG5cbiAgICAgICAgICAgIHZvaWQgUHJvbWlzZS5yZWplY3QobmV3IENhbmNlbGxlZFJlamVjdGlvbkVycm9yKHByb21pc2UucHJvbWlzZSwgcmVhc29uKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdGF0ZS5zZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHByb21pc2UucmVqZWN0KHJlYXNvbik7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogQ2FuY2VscyBhbGwgdmFsdWVzIGluIGFuIGFycmF5IHRoYXQgbG9vayBsaWtlIGNhbmNlbGxhYmxlIHRoZW5hYmxlcy5cbiAqIFJldHVybnMgYSBwcm9taXNlIHRoYXQgZnVsZmlsbHMgb25jZSBhbGwgY2FuY2VsbGF0aW9uIHByb2NlZHVyZXMgZm9yIHRoZSBnaXZlbiB2YWx1ZXMgaGF2ZSBzZXR0bGVkLlxuICovXG5mdW5jdGlvbiBjYW5jZWxBbGwocGFyZW50OiBDYW5jZWxsYWJsZVByb21pc2U8dW5rbm93bj4sIHZhbHVlczogYW55W10sIGNhdXNlPzogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcmVzdWx0cyA9IFtdO1xuXG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgICAgbGV0IGNhbmNlbDogQ2FuY2VsbGFibGVQcm9taXNlQ2FuY2VsbGVyO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCFpc0NhbGxhYmxlKHZhbHVlLnRoZW4pKSB7IGNvbnRpbnVlOyB9XG4gICAgICAgICAgICBjYW5jZWwgPSB2YWx1ZS5jYW5jZWw7XG4gICAgICAgICAgICBpZiAoIWlzQ2FsbGFibGUoY2FuY2VsKSkgeyBjb250aW51ZTsgfVxuICAgICAgICB9IGNhdGNoIHsgY29udGludWU7IH1cblxuICAgICAgICBsZXQgcmVzdWx0OiB2b2lkIHwgUHJvbWlzZUxpa2U8dm9pZD47XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXN1bHQgPSBSZWZsZWN0LmFwcGx5KGNhbmNlbCwgdmFsdWUsIFtjYXVzZV0pO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIFByb21pc2UucmVqZWN0KG5ldyBDYW5jZWxsZWRSZWplY3Rpb25FcnJvcihwYXJlbnQsIGVyciwgXCJVbmhhbmRsZWQgZXhjZXB0aW9uIGluIGNhbmNlbCBtZXRob2QuXCIpKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFyZXN1bHQpIHsgY29udGludWU7IH1cbiAgICAgICAgcmVzdWx0cy5wdXNoKFxuICAgICAgICAgICAgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UgID8gcmVzdWx0IDogUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkpLmNhdGNoKChyZWFzb24/KSA9PiB7XG4gICAgICAgICAgICAgICAgUHJvbWlzZS5yZWplY3QobmV3IENhbmNlbGxlZFJlamVjdGlvbkVycm9yKHBhcmVudCwgcmVhc29uLCBcIlVuaGFuZGxlZCByZWplY3Rpb24gaW4gY2FuY2VsIG1ldGhvZC5cIikpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gUHJvbWlzZS5hbGwocmVzdWx0cykgYXMgYW55O1xufVxuXG4vKipcbiAqIFJldHVybnMgaXRzIGFyZ3VtZW50LlxuICovXG5mdW5jdGlvbiBpZGVudGl0eTxUPih4OiBUKTogVCB7XG4gICAgcmV0dXJuIHg7XG59XG5cbi8qKlxuICogVGhyb3dzIGl0cyBhcmd1bWVudC5cbiAqL1xuZnVuY3Rpb24gdGhyb3dlcihyZWFzb24/OiBhbnkpOiBuZXZlciB7XG4gICAgdGhyb3cgcmVhc29uO1xufVxuXG4vKipcbiAqIEF0dGVtcHRzIHZhcmlvdXMgc3RyYXRlZ2llcyB0byBjb252ZXJ0IGFuIGVycm9yIHRvIGEgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBlcnJvck1lc3NhZ2UoZXJyOiBhbnkpOiBzdHJpbmcge1xuICAgIHRyeSB7XG4gICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBFcnJvciB8fCB0eXBlb2YgZXJyICE9PSAnb2JqZWN0JyB8fCBlcnIudG9TdHJpbmcgIT09IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBcIlwiICsgZXJyO1xuICAgICAgICB9XG4gICAgfSBjYXRjaCB7fVxuXG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGVycik7XG4gICAgfSBjYXRjaCB7fVxuXG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlcnIpO1xuICAgIH0gY2F0Y2gge31cblxuICAgIHJldHVybiBcIjxjb3VsZCBub3QgY29udmVydCBlcnJvciB0byBzdHJpbmc+XCI7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgY3VycmVudCBiYXJyaWVyIHByb21pc2UgZm9yIHRoZSBnaXZlbiBjYW5jZWxsYWJsZSBwcm9taXNlLiBJZiBuZWNlc3NhcnksIGluaXRpYWxpc2VzIHRoZSBiYXJyaWVyLlxuICovXG5mdW5jdGlvbiBjdXJyZW50QmFycmllcjxUPihwcm9taXNlOiBDYW5jZWxsYWJsZVByb21pc2U8VD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgcHdyOiBQYXJ0aWFsPFByb21pc2VXaXRoUmVzb2x2ZXJzPHZvaWQ+PiA9IHByb21pc2VbYmFycmllclN5bV0gPz8ge307XG4gICAgaWYgKCEoJ3Byb21pc2UnIGluIHB3cikpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihwd3IsIHByb21pc2VXaXRoUmVzb2x2ZXJzPHZvaWQ+KCkpO1xuICAgIH1cbiAgICBpZiAocHJvbWlzZVtiYXJyaWVyU3ltXSA9PSBudWxsKSB7XG4gICAgICAgIHB3ci5yZXNvbHZlISgpO1xuICAgICAgICBwcm9taXNlW2JhcnJpZXJTeW1dID0gcHdyO1xuICAgIH1cbiAgICByZXR1cm4gcHdyLnByb21pc2UhO1xufVxuXG4vLyBQb2x5ZmlsbCBQcm9taXNlLndpdGhSZXNvbHZlcnMuXG5sZXQgcHJvbWlzZVdpdGhSZXNvbHZlcnMgPSBQcm9taXNlLndpdGhSZXNvbHZlcnM7XG5pZiAocHJvbWlzZVdpdGhSZXNvbHZlcnMgJiYgdHlwZW9mIHByb21pc2VXaXRoUmVzb2x2ZXJzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcHJvbWlzZVdpdGhSZXNvbHZlcnMgPSBwcm9taXNlV2l0aFJlc29sdmVycy5iaW5kKFByb21pc2UpO1xufSBlbHNlIHtcbiAgICBwcm9taXNlV2l0aFJlc29sdmVycyA9IGZ1bmN0aW9uIDxUPigpOiBQcm9taXNlV2l0aFJlc29sdmVyczxUPiB7XG4gICAgICAgIGxldCByZXNvbHZlITogKHZhbHVlOiBUIHwgUHJvbWlzZUxpa2U8VD4pID0+IHZvaWQ7XG4gICAgICAgIGxldCByZWplY3QhOiAocmVhc29uPzogYW55KSA9PiB2b2lkO1xuICAgICAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2U8VD4oKHJlcywgcmVqKSA9PiB7IHJlc29sdmUgPSByZXM7IHJlamVjdCA9IHJlajsgfSk7XG4gICAgICAgIHJldHVybiB7IHByb21pc2UsIHJlc29sdmUsIHJlamVjdCB9O1xuICAgIH1cbn0iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbmltcG9ydCB7bmV3UnVudGltZUNhbGxlciwgb2JqZWN0TmFtZXN9IGZyb20gXCIuL3J1bnRpbWUuanNcIjtcblxuY29uc3QgY2FsbCA9IG5ld1J1bnRpbWVDYWxsZXIob2JqZWN0TmFtZXMuQ2xpcGJvYXJkKTtcblxuY29uc3QgQ2xpcGJvYXJkU2V0VGV4dCA9IDA7XG5jb25zdCBDbGlwYm9hcmRUZXh0ID0gMTtcblxuLyoqXG4gKiBTZXRzIHRoZSB0ZXh0IHRvIHRoZSBDbGlwYm9hcmQuXG4gKlxuICogQHBhcmFtIHRleHQgLSBUaGUgdGV4dCB0byBiZSBzZXQgdG8gdGhlIENsaXBib2FyZC5cbiAqIEByZXR1cm4gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgb3BlcmF0aW9uIGlzIHN1Y2Nlc3NmdWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBTZXRUZXh0KHRleHQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBjYWxsKENsaXBib2FyZFNldFRleHQsIHt0ZXh0fSk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBDbGlwYm9hcmQgdGV4dFxuICpcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHRleHQgZnJvbSB0aGUgQ2xpcGJvYXJkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gVGV4dCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBjYWxsKENsaXBib2FyZFRleHQpO1xufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vKipcbiAqIEFueSBpcyBhIGR1bW15IGNyZWF0aW9uIGZ1bmN0aW9uIGZvciBzaW1wbGUgb3IgdW5rbm93biB0eXBlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEFueTxUPihzb3VyY2U6IGFueSk6IFQge1xuICAgIHJldHVybiBzb3VyY2U7XG59XG5cbi8qKlxuICogQnl0ZVNsaWNlIGlzIGEgY3JlYXRpb24gZnVuY3Rpb24gdGhhdCByZXBsYWNlc1xuICogbnVsbCBzdHJpbmdzIHdpdGggZW1wdHkgc3RyaW5ncy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEJ5dGVTbGljZShzb3VyY2U6IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuICgoc291cmNlID09IG51bGwpID8gXCJcIiA6IHNvdXJjZSk7XG59XG5cbi8qKlxuICogQXJyYXkgdGFrZXMgYSBjcmVhdGlvbiBmdW5jdGlvbiBmb3IgYW4gYXJiaXRyYXJ5IHR5cGVcbiAqIGFuZCByZXR1cm5zIGFuIGluLXBsYWNlIGNyZWF0aW9uIGZ1bmN0aW9uIGZvciBhbiBhcnJheVxuICogd2hvc2UgZWxlbWVudHMgYXJlIG9mIHRoYXQgdHlwZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEFycmF5PFQ+KGVsZW1lbnQ6IChzb3VyY2U6IGFueSkgPT4gVCk6IChzb3VyY2U6IGFueSkgPT4gVFtdIHtcbiAgICBpZiAoZWxlbWVudCA9PT0gQW55KSB7XG4gICAgICAgIHJldHVybiAoc291cmNlKSA9PiAoc291cmNlID09PSBudWxsID8gW10gOiBzb3VyY2UpO1xuICAgIH1cblxuICAgIHJldHVybiAoc291cmNlKSA9PiB7XG4gICAgICAgIGlmIChzb3VyY2UgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNvdXJjZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgc291cmNlW2ldID0gZWxlbWVudChzb3VyY2VbaV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgfTtcbn1cblxuLyoqXG4gKiBNYXAgdGFrZXMgY3JlYXRpb24gZnVuY3Rpb25zIGZvciB0d28gYXJiaXRyYXJ5IHR5cGVzXG4gKiBhbmQgcmV0dXJucyBhbiBpbi1wbGFjZSBjcmVhdGlvbiBmdW5jdGlvbiBmb3IgYW4gb2JqZWN0XG4gKiB3aG9zZSBrZXlzIGFuZCB2YWx1ZXMgYXJlIG9mIHRob3NlIHR5cGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gTWFwPFY+KGtleTogKHNvdXJjZTogYW55KSA9PiBzdHJpbmcsIHZhbHVlOiAoc291cmNlOiBhbnkpID0+IFYpOiAoc291cmNlOiBhbnkpID0+IFJlY29yZDxzdHJpbmcsIFY+IHtcbiAgICBpZiAodmFsdWUgPT09IEFueSkge1xuICAgICAgICByZXR1cm4gKHNvdXJjZSkgPT4gKHNvdXJjZSA9PT0gbnVsbCA/IHt9IDogc291cmNlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKHNvdXJjZSkgPT4ge1xuICAgICAgICBpZiAoc291cmNlID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgICAgICBzb3VyY2Vba2V5XSA9IHZhbHVlKHNvdXJjZVtrZXldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc291cmNlO1xuICAgIH07XG59XG5cbi8qKlxuICogTnVsbGFibGUgdGFrZXMgYSBjcmVhdGlvbiBmdW5jdGlvbiBmb3IgYW4gYXJiaXRyYXJ5IHR5cGVcbiAqIGFuZCByZXR1cm5zIGEgY3JlYXRpb24gZnVuY3Rpb24gZm9yIGEgbnVsbGFibGUgdmFsdWUgb2YgdGhhdCB0eXBlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gTnVsbGFibGU8VD4oZWxlbWVudDogKHNvdXJjZTogYW55KSA9PiBUKTogKHNvdXJjZTogYW55KSA9PiAoVCB8IG51bGwpIHtcbiAgICBpZiAoZWxlbWVudCA9PT0gQW55KSB7XG4gICAgICAgIHJldHVybiBBbnk7XG4gICAgfVxuXG4gICAgcmV0dXJuIChzb3VyY2UpID0+IChzb3VyY2UgPT09IG51bGwgPyBudWxsIDogZWxlbWVudChzb3VyY2UpKTtcbn1cblxuLyoqXG4gKiBTdHJ1Y3QgdGFrZXMgYW4gb2JqZWN0IG1hcHBpbmcgZmllbGQgbmFtZXMgdG8gY3JlYXRpb24gZnVuY3Rpb25zXG4gKiBhbmQgcmV0dXJucyBhbiBpbi1wbGFjZSBjcmVhdGlvbiBmdW5jdGlvbiBmb3IgYSBzdHJ1Y3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBTdHJ1Y3Q8XG4gICAgVCBleHRlbmRzIHsgW186IHN0cmluZ106ICgoc291cmNlOiBhbnkpID0+IGFueSkgfSxcbiAgICBVIGV4dGVuZHMgeyBbS2V5IGluIGtleW9mIFRdPzogUmV0dXJuVHlwZTxUW0tleV0+IH1cbj4oY3JlYXRlRmllbGQ6IFQpOiAoc291cmNlOiBhbnkpID0+IFUge1xuICAgIGxldCBhbGxBbnkgPSB0cnVlO1xuICAgIGZvciAoY29uc3QgbmFtZSBpbiBjcmVhdGVGaWVsZCkge1xuICAgICAgICBpZiAoY3JlYXRlRmllbGRbbmFtZV0gIT09IEFueSkge1xuICAgICAgICAgICAgYWxsQW55ID0gZmFsc2U7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoYWxsQW55KSB7XG4gICAgICAgIHJldHVybiBBbnk7XG4gICAgfVxuXG4gICAgcmV0dXJuIChzb3VyY2UpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBuYW1lIGluIGNyZWF0ZUZpZWxkKSB7XG4gICAgICAgICAgICBpZiAobmFtZSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBzb3VyY2VbbmFtZV0gPSBjcmVhdGVGaWVsZFtuYW1lXShzb3VyY2VbbmFtZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgfTtcbn1cbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuZXhwb3J0IGludGVyZmFjZSBTaXplIHtcbiAgICAvKiogVGhlIHdpZHRoIG9mIGEgcmVjdGFuZ3VsYXIgYXJlYS4gKi9cbiAgICBXaWR0aDogbnVtYmVyO1xuICAgIC8qKiBUaGUgaGVpZ2h0IG9mIGEgcmVjdGFuZ3VsYXIgYXJlYS4gKi9cbiAgICBIZWlnaHQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWN0IHtcbiAgICAvKiogVGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgb3JpZ2luLiAqL1xuICAgIFg6IG51bWJlcjtcbiAgICAvKiogVGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgb3JpZ2luLiAqL1xuICAgIFk6IG51bWJlcjtcbiAgICAvKiogVGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUuICovXG4gICAgV2lkdGg6IG51bWJlcjtcbiAgICAvKiogVGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLiAqL1xuICAgIEhlaWdodDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNjcmVlbiB7XG4gICAgLyoqIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgc2NyZWVuLiAqL1xuICAgIElEOiBzdHJpbmc7XG4gICAgLyoqIEh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIHNjcmVlbi4gKi9cbiAgICBOYW1lOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBzY2FsZSBmYWN0b3Igb2YgdGhlIHNjcmVlbiAoRFBJLzk2KS4gMSA9IHN0YW5kYXJkIERQSSwgMiA9IEhpRFBJIChSZXRpbmEpLCBldGMuICovXG4gICAgU2NhbGVGYWN0b3I6IG51bWJlcjtcbiAgICAvKiogVGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgc2NyZWVuLiAqL1xuICAgIFg6IG51bWJlcjtcbiAgICAvKiogVGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgc2NyZWVuLiAqL1xuICAgIFk6IG51bWJlcjtcbiAgICAvKiogQ29udGFpbnMgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIHNjcmVlbi4gKi9cbiAgICBTaXplOiBTaXplO1xuICAgIC8qKiBDb250YWlucyB0aGUgYm91bmRzIG9mIHRoZSBzY3JlZW4gaW4gdGVybXMgb2YgWCwgWSwgV2lkdGgsIGFuZCBIZWlnaHQuICovXG4gICAgQm91bmRzOiBSZWN0O1xuICAgIC8qKiBDb250YWlucyB0aGUgcGh5c2ljYWwgYm91bmRzIG9mIHRoZSBzY3JlZW4gaW4gdGVybXMgb2YgWCwgWSwgV2lkdGgsIGFuZCBIZWlnaHQgKGJlZm9yZSBzY2FsaW5nKS4gKi9cbiAgICBQaHlzaWNhbEJvdW5kczogUmVjdDtcbiAgICAvKiogQ29udGFpbnMgdGhlIGFyZWEgb2YgdGhlIHNjcmVlbiB0aGF0IGlzIGFjdHVhbGx5IHVzYWJsZSAoZXhjbHVkaW5nIHRhc2tiYXIgYW5kIG90aGVyIHN5c3RlbSBVSSkuICovXG4gICAgV29ya0FyZWE6IFJlY3Q7XG4gICAgLyoqIENvbnRhaW5zIHRoZSBwaHlzaWNhbCBXb3JrQXJlYSBvZiB0aGUgc2NyZWVuIChiZWZvcmUgc2NhbGluZykuICovXG4gICAgUGh5c2ljYWxXb3JrQXJlYTogUmVjdDtcbiAgICAvKiogVHJ1ZSBpZiB0aGlzIGlzIHRoZSBwcmltYXJ5IG1vbml0b3Igc2VsZWN0ZWQgYnkgdGhlIHVzZXIgaW4gdGhlIG9wZXJhdGluZyBzeXN0ZW0uICovXG4gICAgSXNQcmltYXJ5OiBib29sZWFuO1xuICAgIC8qKiBUaGUgcm90YXRpb24gb2YgdGhlIHNjcmVlbi4gKi9cbiAgICBSb3RhdGlvbjogbnVtYmVyO1xufVxuXG5pbXBvcnQgeyBuZXdSdW50aW1lQ2FsbGVyLCBvYmplY3ROYW1lcyB9IGZyb20gXCIuL3J1bnRpbWUuanNcIjtcbmNvbnN0IGNhbGwgPSBuZXdSdW50aW1lQ2FsbGVyKG9iamVjdE5hbWVzLlNjcmVlbnMpO1xuXG5jb25zdCBnZXRBbGwgPSAwO1xuY29uc3QgZ2V0UHJpbWFyeSA9IDE7XG5jb25zdCBnZXRDdXJyZW50ID0gMjtcblxuLyoqXG4gKiBHZXRzIGFsbCBzY3JlZW5zLlxuICpcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IG9mIFNjcmVlbiBvYmplY3RzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gR2V0QWxsKCk6IFByb21pc2U8U2NyZWVuW10+IHtcbiAgICByZXR1cm4gY2FsbChnZXRBbGwpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIHByaW1hcnkgc2NyZWVuLlxuICpcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBwcmltYXJ5IHNjcmVlbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEdldFByaW1hcnkoKTogUHJvbWlzZTxTY3JlZW4+IHtcbiAgICByZXR1cm4gY2FsbChnZXRQcmltYXJ5KTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBjdXJyZW50IGFjdGl2ZSBzY3JlZW4uXG4gKlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgY3VycmVudCBhY3RpdmUgc2NyZWVuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gR2V0Q3VycmVudCgpOiBQcm9taXNlPFNjcmVlbj4ge1xuICAgIHJldHVybiBjYWxsKGdldEN1cnJlbnQpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7QUNBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7QUNBQTtBQUFBO0FBQUE7QUFBQTs7O0FDNkJBLElB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O0FBQUEsSUFDdEMsb0NBQW9DO0FBQUEsSUFDcEMsMENBQTBDO0FBQUEsSUFDMUMsMkJBQTJCO0FBQUEsSUFDM0IsK0JBQStCO0FBQUEsSUFDL0Isb0JBQW9CO0FBQUEsSUFDcEIsNEJBQTRCO0FBQUEsSUFDNUIsc0JBQXNCO0FBQUEsSUFDdEIsc0JBQXNCO0FBQUEsSUFDdEIsK0JBQStCO0FBQUEsSUFDL0IsNkJBQTZCO0FBQUEsSUFDN0IsZ0NBQWdDO0FBQUEsSUFDaEMscUJBQXFCO0FBQUEsSUFDckIsNkJBQTZCO0FBQUEsSUFDN0IsMEJBQTBCO0FBQUEsSUFDMUIsdUJBQXVCO0FBQUEsSUFDdkIsdUJBQXVCO0FBQUEsSUFDdkIsZ0JBQWdCO0FBQUEsSUFDaEIsc0JBQXNCO0FBQUEsSUFDdEIsY0FBYztBQUFBLElBQ2Qsb0JBQW9CO0FBQUEsSUFDcEIsb0JBQW9CO0FBQUEsSUFDcEIsc0JBQXNCO0FBQUEsSUFDdEIsYUFBYTtBQUFBLElBQ2IsY0FBYztBQUFBLElBQ2QsbUJBQW1CO0FBQUEsSUFDbkIsbUJBQW1CO0FBQUEsSUFDbkIseUJBQXlCO0FBQUEsSUFDekIsZUFBZTtBQUFBLElBQ2YsaUJBQWlCO0FBQUEsSUFDakIsdUJBQXVCO0FBQUEsSUFDdkIscUJBQXFCO0FBQUEsSUFDckIscUJBQXFCO0FBQUEsSUFDckIsdUJBQXVCO0FBQUEsSUFDdkIsY0FBYztBQUFBLElBQ2QsZUFBZTtBQUFBLElBQ2Ysb0JBQW9CO0FBQUEsSUFDcEIsb0JBQW9CO0FBQUEsSUFDcEIsMEJBQTBCO0FBQUEsSUFDMUIsZ0JBQWdCO0FBQUEsSUFDaEIsNEJBQTRCO0FBQUEsSUFDNUIsNEJBQTRCO0FBQUEsSUFDNUIseURBQXlEO0FBQUEsSUFDekQsc0NBQXNDO0FBQUEsSUFDdEMsb0JBQW9CO0FBQUEsSUFDcEIscUJBQXFCO0FBQUEsSUFDckIscUJBQXFCO0FBQUEsSUFDckIsc0JBQXNCO0FBQUEsSUFDdEIsZ0NBQWdDO0FBQUEsSUFDaEMsa0NBQWtDO0FBQUEsSUFDbEMsbUNBQW1DO0FBQUEsSUFDbkMsb0NBQW9DO0FBQUEsSUFDcEMsK0JBQStCO0FBQUEsSUFDL0IsNkJBQTZCO0FBQUEsSUFDN0IsdUJBQXVCO0FBQUEsSUFDdkIsaUNBQWlDO0FBQUEsSUFDakMsOEJBQThCO0FBQUEsSUFDOUIsNEJBQTRCO0FBQUEsSUFDNUIsc0NBQXNDO0FBQUEsSUFDdEMsNEJBQTRCO0FBQUEsSUFDNUIsc0JBQXNCO0FBQUEsSUFDdEIsa0NBQWtDO0FBQUEsSUFDbEMsc0JBQXNCO0FBQUEsSUFDdEIsd0JBQXdCO0FBQUEsSUFDeEIsd0JBQXdCO0FBQUEsSUFDeEIsbUJBQW1CO0FBQUEsSUFDbkIsMEJBQTBCO0FBQUEsSUFDMUIsOEJBQThCO0FBQUEsSUFDOUIseUJBQXlCO0FBQUEsSUFDekIsNkJBQTZCO0FBQUEsSUFDN0IsaUJBQWlCO0FBQUEsSUFDakIsZ0JBQWdCO0FBQUEsSUFDaEIsc0JBQXNCO0FBQUEsSUFDdEIsZUFBZTtBQUFBLElBQ2YseUJBQXlCO0FBQUEsSUFDekIsd0JBQXdCO0FBQUEsSUFDeEIsb0JBQW9CO0FBQUEsSUFDcEIscUJBQXFCO0FBQUEsSUFDckIsaUJBQWlCO0FBQUEsSUFDakIsaUJBQWlCO0FBQUEsSUFDakIsc0JBQXNCO0FBQUEsSUFDdEIsbUNBQW1DO0FBQUEsSUFDbkMscUNBQXFDO0FBQUEsSUFDckMsdUJBQXVCO0FBQUEsSUFDdkIsc0JBQXNCO0FBQUEsSUFDdEIsd0JBQXdCO0FBQUEsSUFDeEIsZUFBZTtBQUFBLElBQ2YsMkJBQTJCO0FBQUEsSUFDM0IsMEJBQTBCO0FBQUEsSUFDMUIsNkJBQTZCO0FBQUEsSUFDN0IsWUFBWTtBQUFBLElBQ1osZ0JBQWdCO0FBQUEsSUFDaEIsa0JBQWtCO0FBQUEsSUFDbEIsZ0JBQWdCO0FBQUEsSUFDaEIsa0JBQWtCO0FBQUEsSUFDbEIsbUJBQW1CO0FBQUEsSUFDbkIsWUFBWTtBQUFBLElBQ1oscUJBQXFCO0FBQUEsSUFDckIsc0JBQXNCO0FBQUEsSUFDdEIsc0JBQXNCO0FBQUEsSUFDdEIsOEJBQThCO0FBQUEsSUFDOUIsaUJBQWlCO0FBQUEsSUFDakIs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LElBQUksSUFBSSxZQUFZLElBQUksRUFBRSxPQUFPLElBQUksQ0FBQztBQUFBLE1BQ2pEO0FBQUEsSUFDSjtBQUNBLFdBQU87QUFBQSxFQUNYO0FBQ0o7OztBQzFHQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUF3REEsSUFBTUMsUUFBTyxpQkFBaUIsWUFBWSxPQUFPO0FBRWpELElBQU0sU0FBUztBQUNmLElBQU0sYUFBYTtBQUNuQixJQUFNLGFBQWE7QUFPWixTQUFTLFNBQTRCO0FBQ3hDLFNBQU9BLE1BQUssTUFBTTtBQUN0QjtBQU9PLFNBQVMsYUFBOEI7QUFDMUMsU0FBT0EsTUFBSyxVQUFVO0FBQzFCO0FBT08sU0FBUyxhQUE4QjtBQUMxQyxTQUFPQSxNQUFLLFVBQVU7QUFDMUI7OztBdEI1RUEsT0FBTyxTQUFTLE9BQU8sVUFBVSxDQUFDO0FBNENsQyxPQUFPLE9BQU8sU0FBZ0I7QUFDdkIsT0FBTyxxQkFBcUI7IiwKICAibmFtZXMiOiBbIl9hIiwgIkVycm9yIiwgImNhbGwiLCAiX2EiLCAiRXJyb3IiLCAiY2FsbCIsICJfYSIsICJyZXNpemFibGUiLCAiY2FsbCIsICJfYSIsICJjYWxsIiwgImNhbGwiLCAiSGlkZU1ldGhvZCIsICJTaG93TWV0aG9kIiwgImlzRG9jdW1lbnREb3RBbGwiLCAiX2EiLCAicmVhc29uIiwgInZhbHVlIiwgImNhbGwiLCAiZ2V0QW5kRGVsZXRlUmVzcG9uc2UiLCAiZ2VuZXJhdGVJRCIsICJjYWxsIiwgIkFycmF5IiwgIk1hcCIsICJBcnJheSIsICJNYXAiLCAia2V5IiwgImNhbGwiXQp9Cg== diff --git a/v3/internal/assetserver/bundledassets/runtime.js b/v3/internal/assetserver/bundledassets/runtime.js index 3b5fadf51..25de50230 100644 --- a/v3/internal/assetserver/bundledassets/runtime.js +++ b/v3/internal/assetserver/bundledassets/runtime.js @@ -1 +1 @@ -var Le=Object.defineProperty,ln=Object.defineProperties;var cn=Object.getOwnPropertyDescriptors;var Oe=Object.getOwnPropertySymbols;var dn=Object.prototype.hasOwnProperty,mn=Object.prototype.propertyIsEnumerable;var Fe=(n,e,i)=>e in n?Le(n,e,{enumerable:!0,configurable:!0,writable:!0,value:i}):n[e]=i,Ue=(n,e)=>{for(var i in e||(e={}))dn.call(e,i)&&Fe(n,i,e[i]);if(Oe)for(var i of Oe(e))mn.call(e,i)&&Fe(n,i,e[i]);return n},Ie=(n,e)=>ln(n,cn(e));var w=(n,e)=>{for(var i in e)Le(n,i,{get:e[i],enumerable:!0})};var C=(n,e,i)=>new Promise((o,t)=>{var s=l=>{try{c(i.next(l))}catch(u){t(u)}},a=l=>{try{c(i.throw(l))}catch(u){t(u)}},c=l=>l.done?o(l.value):Promise.resolve(l.value).then(s,a);c((i=i.apply(n,e)).next())});var ce={};w(ce,{Application:()=>ye,Browser:()=>_,Call:()=>xe,CancelError:()=>k,CancellablePromise:()=>F,CancelledRejectionError:()=>O,Clipboard:()=>Re,Create:()=>Ae,Dialogs:()=>ee,Events:()=>oe,Flags:()=>we,Screens:()=>ke,System:()=>ue,WML:()=>le,Window:()=>Z});var le={};w(le,{Enable:()=>ae,Reload:()=>Ye});var _={};w(_,{OpenURL:()=>q});var un="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";function P(n=21){let e="",i=n|0;for(;i--;)e+=un[Math.random()*64|0];return e}var wn=window.location.origin+"/wails/runtime",d=Object.freeze({Call:0,Clipboard:1,Application:2,Events:3,ContextMenu:4,Dialog:5,Window:6,Screens:7,System:8,Browser:9,CancelCall:10}),pn=P();function m(n,e=""){return function(i,o=null){return fn(n,i,e,o)}}function fn(n,e,i,o){return C(this,null,function*(){var c,l;let t=new URL(wn);t.searchParams.append("object",n.toString()),t.searchParams.append("method",e.toString()),o&&t.searchParams.append("args",JSON.stringify(o));let s={"x-wails-client-id":pn};i&&(s["x-wails-window-name"]=i);let a=yield fetch(t,{headers:s});if(!a.ok)throw new Error(yield a.text());return((l=(c=a.headers.get("Content-Type"))==null?void 0:c.indexOf("application/json"))!=null?l:-1)!==-1?a.json():a.text()})}var gn=m(d.Browser),hn=0;function q(n){return gn(hn,{url:n.toString()})}var ee={};w(ee,{Error:()=>An,Info:()=>xn,OpenFile:()=>En,Question:()=>$,SaveFile:()=>kn,Warning:()=>Rn});window._wails=window._wails||{};window._wails.dialogErrorCallback=Sn;window._wails.dialogResultCallback=Mn;var Wn=m(d.Dialog),U=new Map,bn=0,yn=1,vn=2,Cn=3,Pn=4,Dn=5;function Mn(n,e,i){let o=ze(n);if(o)if(i)try{o.resolve(JSON.parse(e))}catch(t){o.reject(new TypeError("could not parse result: "+t.message,{cause:t}))}else o.resolve(e)}function Sn(n,e){var i;(i=ze(n))==null||i.reject(new window.Error(e))}function ze(n){let e=U.get(n);return U.delete(n),e}function Tn(){let n;do n=P();while(U.has(n));return n}function D(n,e={}){let i=Tn();return new Promise((o,t)=>{U.set(i,{resolve:o,reject:t}),Wn(n,Object.assign({"dialog-id":i},e)).catch(s=>{U.delete(i),t(s)})})}function xn(n){return D(bn,n)}function Rn(n){return D(yn,n)}function An(n){return D(vn,n)}function $(n){return D(Cn,n)}function En(n){var e;return(e=D(Pn,n))!=null?e:[]}function kn(n){return D(Dn,n)}var oe={};w(oe,{Emit:()=>ie,Off:()=>zn,OffAll:()=>jn,On:()=>Un,OnMultiple:()=>ne,Once:()=>In,Types:()=>Be,WailsEvent:()=>M});var f=new Map,H=class{constructor(e,i,o){this.eventName=e,this.callback=i,this.maxCallbacks=o||-1}dispatch(e){try{this.callback(e)}catch(i){}return this.maxCallbacks===-1?!1:(this.maxCallbacks-=1,this.maxCallbacks===0)}};function je(n){let e=f.get(n.eventName);e&&(e=e.filter(i=>i!==n),e.length===0?f.delete(n.eventName):f.set(n.eventName,e))}var Be=Object.freeze({Windows:Object.freeze({APMPowerSettingChange:"windows:APMPowerSettingChange",APMPowerStatusChange:"windows:APMPowerStatusChange",APMResumeAutomatic:"windows:APMResumeAutomatic",APMResumeSuspend:"windows:APMResumeSuspend",APMSuspend:"windows:APMSuspend",ApplicationStarted:"windows:ApplicationStarted",SystemThemeChanged:"windows:SystemThemeChanged",WebViewNavigationCompleted:"windows:WebViewNavigationCompleted",WindowActive:"windows:WindowActive",WindowBackgroundErase:"windows:WindowBackgroundErase",WindowClickActive:"windows:WindowClickActive",WindowClosing:"windows:WindowClosing",WindowDidMove:"windows:WindowDidMove",WindowDidResize:"windows:WindowDidResize",WindowDPIChanged:"windows:WindowDPIChanged",WindowDragDrop:"windows:WindowDragDrop",WindowDragEnter:"windows:WindowDragEnter",WindowDragLeave:"windows:WindowDragLeave",WindowDragOver:"windows:WindowDragOver",WindowEndMove:"windows:WindowEndMove",WindowEndResize:"windows:WindowEndResize",WindowFullscreen:"windows:WindowFullscreen",WindowHide:"windows:WindowHide",WindowInactive:"windows:WindowInactive",WindowKeyDown:"windows:WindowKeyDown",WindowKeyUp:"windows:WindowKeyUp",WindowKillFocus:"windows:WindowKillFocus",WindowNonClientHit:"windows:WindowNonClientHit",WindowNonClientMouseDown:"windows:WindowNonClientMouseDown",WindowNonClientMouseLeave:"windows:WindowNonClientMouseLeave",WindowNonClientMouseMove:"windows:WindowNonClientMouseMove",WindowNonClientMouseUp:"windows:WindowNonClientMouseUp",WindowPaint:"windows:WindowPaint",WindowRestore:"windows:WindowRestore",WindowSetFocus:"windows:WindowSetFocus",WindowShow:"windows:WindowShow",WindowStartMove:"windows:WindowStartMove",WindowStartResize:"windows:WindowStartResize",WindowUnFullscreen:"windows:WindowUnFullscreen",WindowZOrderChanged:"windows:WindowZOrderChanged",WindowMinimise:"windows:WindowMinimise",WindowUnMinimise:"windows:WindowUnMinimise",WindowMaximise:"windows:WindowMaximise",WindowUnMaximise:"windows:WindowUnMaximise"}),Mac:Object.freeze({ApplicationDidBecomeActive:"mac:ApplicationDidBecomeActive",ApplicationDidChangeBackingProperties:"mac:ApplicationDidChangeBackingProperties",ApplicationDidChangeEffectiveAppearance:"mac:ApplicationDidChangeEffectiveAppearance",ApplicationDidChangeIcon:"mac:ApplicationDidChangeIcon",ApplicationDidChangeOcclusionState:"mac:ApplicationDidChangeOcclusionState",ApplicationDidChangeScreenParameters:"mac:ApplicationDidChangeScreenParameters",ApplicationDidChangeStatusBarFrame:"mac:ApplicationDidChangeStatusBarFrame",ApplicationDidChangeStatusBarOrientation:"mac:ApplicationDidChangeStatusBarOrientation",ApplicationDidChangeTheme:"mac:ApplicationDidChangeTheme",ApplicationDidFinishLaunching:"mac:ApplicationDidFinishLaunching",ApplicationDidHide:"mac:ApplicationDidHide",ApplicationDidResignActive:"mac:ApplicationDidResignActive",ApplicationDidUnhide:"mac:ApplicationDidUnhide",ApplicationDidUpdate:"mac:ApplicationDidUpdate",ApplicationShouldHandleReopen:"mac:ApplicationShouldHandleReopen",ApplicationWillBecomeActive:"mac:ApplicationWillBecomeActive",ApplicationWillFinishLaunching:"mac:ApplicationWillFinishLaunching",ApplicationWillHide:"mac:ApplicationWillHide",ApplicationWillResignActive:"mac:ApplicationWillResignActive",ApplicationWillTerminate:"mac:ApplicationWillTerminate",ApplicationWillUnhide:"mac:ApplicationWillUnhide",ApplicationWillUpdate:"mac:ApplicationWillUpdate",MenuDidAddItem:"mac:MenuDidAddItem",MenuDidBeginTracking:"mac:MenuDidBeginTracking",MenuDidClose:"mac:MenuDidClose",MenuDidDisplayItem:"mac:MenuDidDisplayItem",MenuDidEndTracking:"mac:MenuDidEndTracking",MenuDidHighlightItem:"mac:MenuDidHighlightItem",MenuDidOpen:"mac:MenuDidOpen",MenuDidPopUp:"mac:MenuDidPopUp",MenuDidRemoveItem:"mac:MenuDidRemoveItem",MenuDidSendAction:"mac:MenuDidSendAction",MenuDidSendActionToItem:"mac:MenuDidSendActionToItem",MenuDidUpdate:"mac:MenuDidUpdate",MenuWillAddItem:"mac:MenuWillAddItem",MenuWillBeginTracking:"mac:MenuWillBeginTracking",MenuWillDisplayItem:"mac:MenuWillDisplayItem",MenuWillEndTracking:"mac:MenuWillEndTracking",MenuWillHighlightItem:"mac:MenuWillHighlightItem",MenuWillOpen:"mac:MenuWillOpen",MenuWillPopUp:"mac:MenuWillPopUp",MenuWillRemoveItem:"mac:MenuWillRemoveItem",MenuWillSendAction:"mac:MenuWillSendAction",MenuWillSendActionToItem:"mac:MenuWillSendActionToItem",MenuWillUpdate:"mac:MenuWillUpdate",WebViewDidCommitNavigation:"mac:WebViewDidCommitNavigation",WebViewDidFinishNavigation:"mac:WebViewDidFinishNavigation",WebViewDidReceiveServerRedirectForProvisionalNavigation:"mac:WebViewDidReceiveServerRedirectForProvisionalNavigation",WebViewDidStartProvisionalNavigation:"mac:WebViewDidStartProvisionalNavigation",WindowDidBecomeKey:"mac:WindowDidBecomeKey",WindowDidBecomeMain:"mac:WindowDidBecomeMain",WindowDidBeginSheet:"mac:WindowDidBeginSheet",WindowDidChangeAlpha:"mac:WindowDidChangeAlpha",WindowDidChangeBackingLocation:"mac:WindowDidChangeBackingLocation",WindowDidChangeBackingProperties:"mac:WindowDidChangeBackingProperties",WindowDidChangeCollectionBehavior:"mac:WindowDidChangeCollectionBehavior",WindowDidChangeEffectiveAppearance:"mac:WindowDidChangeEffectiveAppearance",WindowDidChangeOcclusionState:"mac:WindowDidChangeOcclusionState",WindowDidChangeOrderingMode:"mac:WindowDidChangeOrderingMode",WindowDidChangeScreen:"mac:WindowDidChangeScreen",WindowDidChangeScreenParameters:"mac:WindowDidChangeScreenParameters",WindowDidChangeScreenProfile:"mac:WindowDidChangeScreenProfile",WindowDidChangeScreenSpace:"mac:WindowDidChangeScreenSpace",WindowDidChangeScreenSpaceProperties:"mac:WindowDidChangeScreenSpaceProperties",WindowDidChangeSharingType:"mac:WindowDidChangeSharingType",WindowDidChangeSpace:"mac:WindowDidChangeSpace",WindowDidChangeSpaceOrderingMode:"mac:WindowDidChangeSpaceOrderingMode",WindowDidChangeTitle:"mac:WindowDidChangeTitle",WindowDidChangeToolbar:"mac:WindowDidChangeToolbar",WindowDidDeminiaturize:"mac:WindowDidDeminiaturize",WindowDidEndSheet:"mac:WindowDidEndSheet",WindowDidEnterFullScreen:"mac:WindowDidEnterFullScreen",WindowDidEnterVersionBrowser:"mac:WindowDidEnterVersionBrowser",WindowDidExitFullScreen:"mac:WindowDidExitFullScreen",WindowDidExitVersionBrowser:"mac:WindowDidExitVersionBrowser",WindowDidExpose:"mac:WindowDidExpose",WindowDidFocus:"mac:WindowDidFocus",WindowDidMiniaturize:"mac:WindowDidMiniaturize",WindowDidMove:"mac:WindowDidMove",WindowDidOrderOffScreen:"mac:WindowDidOrderOffScreen",WindowDidOrderOnScreen:"mac:WindowDidOrderOnScreen",WindowDidResignKey:"mac:WindowDidResignKey",WindowDidResignMain:"mac:WindowDidResignMain",WindowDidResize:"mac:WindowDidResize",WindowDidUpdate:"mac:WindowDidUpdate",WindowDidUpdateAlpha:"mac:WindowDidUpdateAlpha",WindowDidUpdateCollectionBehavior:"mac:WindowDidUpdateCollectionBehavior",WindowDidUpdateCollectionProperties:"mac:WindowDidUpdateCollectionProperties",WindowDidUpdateShadow:"mac:WindowDidUpdateShadow",WindowDidUpdateTitle:"mac:WindowDidUpdateTitle",WindowDidUpdateToolbar:"mac:WindowDidUpdateToolbar",WindowDidZoom:"mac:WindowDidZoom",WindowFileDraggingEntered:"mac:WindowFileDraggingEntered",WindowFileDraggingExited:"mac:WindowFileDraggingExited",WindowFileDraggingPerformed:"mac:WindowFileDraggingPerformed",WindowHide:"mac:WindowHide",WindowMaximise:"mac:WindowMaximise",WindowUnMaximise:"mac:WindowUnMaximise",WindowMinimise:"mac:WindowMinimise",WindowUnMinimise:"mac:WindowUnMinimise",WindowShouldClose:"mac:WindowShouldClose",WindowShow:"mac:WindowShow",WindowWillBecomeKey:"mac:WindowWillBecomeKey",WindowWillBecomeMain:"mac:WindowWillBecomeMain",WindowWillBeginSheet:"mac:WindowWillBeginSheet",WindowWillChangeOrderingMode:"mac:WindowWillChangeOrderingMode",WindowWillClose:"mac:WindowWillClose",WindowWillDeminiaturize:"mac:WindowWillDeminiaturize",WindowWillEnterFullScreen:"mac:WindowWillEnterFullScreen",WindowWillEnterVersionBrowser:"mac:WindowWillEnterVersionBrowser",WindowWillExitFullScreen:"mac:WindowWillExitFullScreen",WindowWillExitVersionBrowser:"mac:WindowWillExitVersionBrowser",WindowWillFocus:"mac:WindowWillFocus",WindowWillMiniaturize:"mac:WindowWillMiniaturize",WindowWillMove:"mac:WindowWillMove",WindowWillOrderOffScreen:"mac:WindowWillOrderOffScreen",WindowWillOrderOnScreen:"mac:WindowWillOrderOnScreen",WindowWillResignMain:"mac:WindowWillResignMain",WindowWillResize:"mac:WindowWillResize",WindowWillUnfocus:"mac:WindowWillUnfocus",WindowWillUpdate:"mac:WindowWillUpdate",WindowWillUpdateAlpha:"mac:WindowWillUpdateAlpha",WindowWillUpdateCollectionBehavior:"mac:WindowWillUpdateCollectionBehavior",WindowWillUpdateCollectionProperties:"mac:WindowWillUpdateCollectionProperties",WindowWillUpdateShadow:"mac:WindowWillUpdateShadow",WindowWillUpdateTitle:"mac:WindowWillUpdateTitle",WindowWillUpdateToolbar:"mac:WindowWillUpdateToolbar",WindowWillUpdateVisibility:"mac:WindowWillUpdateVisibility",WindowWillUseStandardFrame:"mac:WindowWillUseStandardFrame",WindowZoomIn:"mac:WindowZoomIn",WindowZoomOut:"mac:WindowZoomOut",WindowZoomReset:"mac:WindowZoomReset"}),Linux:Object.freeze({ApplicationStartup:"linux:ApplicationStartup",SystemThemeChanged:"linux:SystemThemeChanged",WindowDeleteEvent:"linux:WindowDeleteEvent",WindowDidMove:"linux:WindowDidMove",WindowDidResize:"linux:WindowDidResize",WindowFocusIn:"linux:WindowFocusIn",WindowFocusOut:"linux:WindowFocusOut",WindowLoadChanged:"linux:WindowLoadChanged"}),Common:Object.freeze({ApplicationOpenedWithFile:"common:ApplicationOpenedWithFile",ApplicationStarted:"common:ApplicationStarted",ThemeChanged:"common:ThemeChanged",WindowClosing:"common:WindowClosing",WindowDidMove:"common:WindowDidMove",WindowDidResize:"common:WindowDidResize",WindowDPIChanged:"common:WindowDPIChanged",WindowFilesDropped:"common:WindowFilesDropped",WindowFocus:"common:WindowFocus",WindowFullscreen:"common:WindowFullscreen",WindowHide:"common:WindowHide",WindowLostFocus:"common:WindowLostFocus",WindowMaximise:"common:WindowMaximise",WindowMinimise:"common:WindowMinimise",WindowRestore:"common:WindowRestore",WindowRuntimeReady:"common:WindowRuntimeReady",WindowShow:"common:WindowShow",WindowUnFullscreen:"common:WindowUnFullscreen",WindowUnMaximise:"common:WindowUnMaximise",WindowUnMinimise:"common:WindowUnMinimise",WindowZoom:"common:WindowZoom",WindowZoomIn:"common:WindowZoomIn",WindowZoomOut:"common:WindowZoomOut",WindowZoomReset:"common:WindowZoomReset"})});window._wails=window._wails||{};window._wails.dispatchWailsEvent=Ln;var On=m(d.Events),Fn=0,M=class{constructor(e,i=null){this.name=e,this.data=i}};function Ln(n){let e=f.get(n.name);if(!e)return;let i=new M(n.name,n.data);"sender"in n&&(i.sender=n.sender),e=e.filter(o=>!o.dispatch(i)),e.length===0?f.delete(n.name):f.set(n.name,e)}function ne(n,e,i){let o=f.get(n)||[],t=new H(n,e,i);return o.push(t),f.set(n,o),()=>je(t)}function Un(n,e){return ne(n,e,-1)}function In(n,e){return ne(n,e,1)}function zn(...n){n.forEach(e=>f.delete(e))}function jn(){f.clear()}function ie(n){return On(Fn,n)}function He(){return new MouseEvent("mousedown").buttons===0}function Ne(){if(!EventTarget||!AbortSignal||!AbortController)return!1;let n=!0,e=new EventTarget,i=new AbortController;return e.addEventListener("test",()=>{n=!1},{signal:i.signal}),i.abort(),e.dispatchEvent(new CustomEvent("test")),n}var Ze=!1;document.addEventListener("DOMContentLoaded",()=>{Ze=!0});function Ve(n){Ze||document.readyState==="complete"?n():document.addEventListener("DOMContentLoaded",n)}var Bn=0,Hn=1,Nn=2,Zn=3,Vn=4,Kn=5,Gn=6,Yn=7,Xn=8,Jn=9,Qn=10,qn=11,_n=12,$n=13,ei=14,ni=15,ii=16,oi=17,ti=18,ri=19,si=20,ai=21,li=22,ci=23,di=24,mi=25,ui=26,wi=27,pi=28,fi=29,gi=30,hi=31,Wi=32,bi=33,yi=34,vi=35,Ci=36,Pi=37,Di=38,Mi=39,Si=40,Ti=41,xi=42,Ri=43,Ai=44,Ei=45,ki=46,Oi=47,r=Symbol("caller");r;var N=class N{constructor(e=""){this[r]=m(d.Window,e);for(let i of Object.getOwnPropertyNames(N.prototype))i!=="constructor"&&typeof this[i]=="function"&&(this[i]=this[i].bind(this))}Get(e){return new N(e)}Position(){return this[r](Bn)}Center(){return this[r](Hn)}Close(){return this[r](Nn)}DisableSizeConstraints(){return this[r](Zn)}EnableSizeConstraints(){return this[r](Vn)}Focus(){return this[r](Kn)}ForceReload(){return this[r](Gn)}Fullscreen(){return this[r](Yn)}GetScreen(){return this[r](Xn)}GetZoom(){return this[r](Jn)}Height(){return this[r](Qn)}Hide(){return this[r](qn)}IsFocused(){return this[r](_n)}IsFullscreen(){return this[r]($n)}IsMaximised(){return this[r](ei)}IsMinimised(){return this[r](ni)}Maximise(){return this[r](ii)}Minimise(){return this[r](oi)}Name(){return this[r](ti)}OpenDevTools(){return this[r](ri)}RelativePosition(){return this[r](si)}Reload(){return this[r](ai)}Resizable(){return this[r](li)}Restore(){return this[r](ci)}SetPosition(e,i){return this[r](di,{x:e,y:i})}SetAlwaysOnTop(e){return this[r](mi,{alwaysOnTop:e})}SetBackgroundColour(e,i,o,t){return this[r](ui,{r:e,g:i,b:o,a:t})}SetFrameless(e){return this[r](wi,{frameless:e})}SetFullscreenButtonEnabled(e){return this[r](pi,{enabled:e})}SetMaxSize(e,i){return this[r](fi,{width:e,height:i})}SetMinSize(e,i){return this[r](gi,{width:e,height:i})}SetRelativePosition(e,i){return this[r](hi,{x:e,y:i})}SetResizable(e){return this[r](Wi,{resizable:e})}SetSize(e,i){return this[r](bi,{width:e,height:i})}SetTitle(e){return this[r](yi,{title:e})}SetZoom(e){return this[r](vi,{zoom:e})}Show(){return this[r](Ci)}Size(){return this[r](Pi)}ToggleFullscreen(){return this[r](Di)}ToggleMaximise(){return this[r](Mi)}UnFullscreen(){return this[r](Si)}UnMaximise(){return this[r](Ti)}UnMinimise(){return this[r](xi)}Width(){return this[r](Ri)}Zoom(){return this[r](Ai)}ZoomIn(){return this[r](Ei)}ZoomOut(){return this[r](ki)}ZoomReset(){return this[r](Oi)}},te=N,Fi=new te(""),Z=Fi;function Li(n,e=null){ie(new M(n,e))}function Ui(n,e){let i=Z.Get(n),o=i[e];if(typeof o=="function")try{o.call(i)}catch(t){}}function Ke(n){let e=n.currentTarget;function i(t="Yes"){if(t!=="Yes")return;let s=e.getAttribute("wml-event")||e.getAttribute("data-wml-event"),a=e.getAttribute("wml-target-window")||e.getAttribute("data-wml-target-window")||"",c=e.getAttribute("wml-window")||e.getAttribute("data-wml-window"),l=e.getAttribute("wml-openurl")||e.getAttribute("data-wml-openurl");s!==null&&Li(s),c!==null&&Ui(a,c),l!==null&&q(l)}let o=e.getAttribute("wml-confirm")||e.getAttribute("data-wml-confirm");o?$({Title:"Confirm",Message:o,Detached:!1,Buttons:[{Label:"Yes"},{Label:"No",IsDefault:!0}]}).then(i):i()}var I=Symbol("controller"),S=Symbol("triggerMap"),W=Symbol("elementCount");I;var re=class{constructor(){this[I]=new AbortController}set(e,i){return{signal:this[I].signal}}reset(){this[I].abort(),this[I]=new AbortController}};S,W;var se=class{constructor(){this[S]=new WeakMap,this[W]=0}set(e,i){return this[S].has(e)||this[W]++,this[S].set(e,i),{}}reset(){if(!(this[W]<=0)){for(let e of document.body.querySelectorAll("*")){if(this[W]<=0)break;let i=this[S].get(e);i!=null&&this[W]--;for(let o of i||[])e.removeEventListener(o,Ke)}this[S]=new WeakMap,this[W]=0}}},Ge=Ne()?new re:new se;function Ii(n){let e=/\S+/g,i=n.getAttribute("wml-trigger")||n.getAttribute("data-wml-trigger")||"click",o=[],t;for(;(t=e.exec(i))!==null;)o.push(t[0]);let s=Ge.set(n,o);for(let a of o)n.addEventListener(a,Ke,s)}function ae(){Ve(Ye)}function Ye(){Ge.reset(),document.body.querySelectorAll("[wml-event], [wml-window], [wml-openurl], [data-wml-event], [data-wml-window], [data-wml-openurl]").forEach(Ii)}window.wails=ce;ae();var ue={};w(ue,{Capabilities:()=>Hi,Environment:()=>Ni,IsAMD64:()=>Ki,IsARM:()=>Gi,IsARM64:()=>Yi,IsDarkMode:()=>Bi,IsDebug:()=>me,IsLinux:()=>Zi,IsMac:()=>Vi,IsWindows:()=>V,invoke:()=>b});var Xe=m(d.System),zi=0,ji=1,de=function(){var n,e,i,o,t;try{if((e=(n=window.chrome)==null?void 0:n.webview)!=null&&e.postMessage)return window.chrome.webview.postMessage.bind(window.chrome.webview);if((t=(o=(i=window.webkit)==null?void 0:i.messageHandlers)==null?void 0:o.external)!=null&&t.postMessage)return window.webkit.messageHandlers.external.postMessage.bind(window.webkit.messageHandlers.external)}catch(s){}return null}();function b(n){return de==null?void 0:de(n)}function Bi(){return Xe(zi)}function Hi(){return C(this,null,function*(){let n=yield fetch("/wails/capabilities");if(n.ok)return n.json();throw new Error("could not fetch capabilities: "+n.statusText)})}function Ni(){return Xe(ji)}function V(){return window._wails.environment.OS==="windows"}function Zi(){return window._wails.environment.OS==="linux"}function Vi(){return window._wails.environment.OS==="darwin"}function Ki(){return window._wails.environment.Arch==="amd64"}function Gi(){return window._wails.environment.Arch==="arm"}function Yi(){return window._wails.environment.Arch==="arm64"}function me(){return!!window._wails.environment.Debug}window.addEventListener("contextmenu",qi);var Xi=m(d.ContextMenu),Ji=0;function Qi(n,e,i,o){Xi(Ji,{id:n,x:e,y:i,data:o})}function qi(n){var o;let e;n.target instanceof HTMLElement?e=n.target:!(n.target instanceof HTMLElement)&&n.target instanceof Node?e=(o=n.target.parentElement)!=null?o:document.body:e=document.body;let i=window.getComputedStyle(e).getPropertyValue("--custom-contextmenu").trim();if(i){n.preventDefault();let t=window.getComputedStyle(e).getPropertyValue("--custom-contextmenu-data");Qi(i,n.clientX,n.clientY,t);return}_i(n)}function _i(n){var i;if(me())return;let e;switch(n.target instanceof HTMLElement?e=n.target:!(n.target instanceof HTMLElement)&&n.target instanceof Node?e=(i=n.target.parentElement)!=null?i:document.body:e=document.body,window.getComputedStyle(e).getPropertyValue("--default-contextmenu").trim()){case"show":return;case"hide":n.preventDefault();return;default:if(e.isContentEditable)return;let o=window.getSelection(),t=o&&o.toString().length>0;if(t)for(let s=0;sz});function z(n){try{return window._wails.flags[n]}catch(e){throw new Error("Unable to retrieve flag '"+n+"': "+e,{cause:e})}}var j=!1,B=!1,he=!1,x=!1,R=!1,y="",Je="auto",T=0,pe=He();window._wails=window._wails||{};window._wails.setResizable=n=>{he=n,he||(x=R=!1,p())};window.addEventListener("mousedown",We,{capture:!0});window.addEventListener("mousemove",We,{capture:!0});window.addEventListener("mouseup",We,{capture:!0});for(let n of["click","contextmenu","dblclick"])window.addEventListener(n,$i,{capture:!0});function $i(n){(B||R)&&(n.stopImmediatePropagation(),n.stopPropagation(),n.preventDefault())}var fe=0,eo=1,ge=2;function We(n){let e,i=n.buttons;switch(n.type){case"mousedown":e=fe,pe||(i=T|1<lo,Quit:()=>mo,Show:()=>co});var be=m(d.Application),ro=0,so=1,ao=2;function lo(){return be(ro)}function co(){return be(so)}function mo(){return be(ao)}var xe={};w(xe,{ByID:()=>Oo,ByName:()=>ko,Call:()=>Te,RuntimeError:()=>X});var qe=Function.prototype.toString,A=typeof Reflect=="object"&&Reflect!==null&&Reflect.apply,ve,K;if(typeof A=="function"&&typeof Object.defineProperty=="function")try{ve=Object.defineProperty({},"length",{get:function(){throw K}}),K={},A(function(){throw 42},null,ve)}catch(n){n!==K&&(A=null)}else A=null;var uo=/^\s*class\b/,Pe=function(e){try{var i=qe.call(e);return uo.test(i)}catch(o){return!1}},Ce=function(e){try{return Pe(e)?!1:(qe.call(e),!0)}catch(i){return!1}},G=Object.prototype.toString,wo="[object Object]",po="[object Function]",fo="[object GeneratorFunction]",go="[object HTMLAllCollection]",ho="[object HTML document.all class]",Wo="[object HTMLCollection]",bo=typeof Symbol=="function"&&!!Symbol.toStringTag,yo=!(0 in[,]),De=function(){return!1};typeof document=="object"&&(Qe=document.all,G.call(Qe)===G.call(document.all)&&(De=function(e){if((yo||!e)&&(typeof e=="undefined"||typeof e=="object"))try{var i=G.call(e);return(i===go||i===ho||i===Wo||i===wo)&&e("")==null}catch(o){}return!1}));var Qe;function vo(n){if(De(n))return!0;if(!n||typeof n!="function"&&typeof n!="object")return!1;try{A(n,null,ve)}catch(e){if(e!==K)return!1}return!Pe(n)&&Ce(n)}function Co(n){if(De(n))return!0;if(!n||typeof n!="function"&&typeof n!="object")return!1;if(bo)return Ce(n);if(Pe(n))return!1;var e=G.call(n);return e!==po&&e!==fo&&!/^\[object HTML/.test(e)?!1:Ce(n)}var h=A?vo:Co;var k=class extends Error{constructor(e,i){super(e,i),this.name="CancelError"}},O=class extends Error{constructor(e,i,o){super((o!=null?o:"Unhandled rejection in cancelled promise.")+" Reason: "+Po(i),{cause:i}),this.promise=e,this.name="CancelledRejectionError"}},g=Symbol("barrier"),Me=Symbol("cancelImpl"),nn,_e=(nn=Symbol.species)!=null?nn:Symbol("speciesPolyfill"),F=class n extends Promise{constructor(e,i){let o,t;if(super((l,u)=>{o=l,t=u}),this.constructor[_e]!==Promise)throw new TypeError("CancellablePromise does not support transparent subclassing. Please refrain from overriding the [Symbol.species] static property.");let s={promise:this,resolve:o,reject:t,get oncancelled(){return i!=null?i:null},set oncancelled(l){i=l!=null?l:void 0}},a={get root(){return a},resolving:!1,settled:!1};Object.defineProperties(this,{[g]:{configurable:!1,enumerable:!1,writable:!0,value:null},[Me]:{configurable:!1,enumerable:!1,writable:!1,value:on(s,a)}});let c=rn(s,a);try{e(tn(s,a),c)}catch(l){a.resolving||c(l)}}cancel(e){return new n(i=>{Promise.allSettled([this[Me](new k("Promise cancelled.",{cause:e})),Do(this)]).then(()=>i(),()=>i())})}cancelOn(e){return e.aborted?this.cancel(e.reason):e.addEventListener("abort",()=>void this.cancel(e.reason),{capture:!0}),this}then(e,i,o){if(!(this instanceof n))throw new TypeError("CancellablePromise.prototype.then called on an invalid object.");if(h(e)||(e=$e),h(i)||(i=en),e===$e&&i==en)return new n(s=>s(this));let t={};return this[g]=t,new n((s,a)=>{Se.call(this,c=>{var l;this[g]===t&&(this[g]=null),(l=t.resolve)==null||l.call(t);try{s(e(c))}catch(u){a(u)}},c=>{var l;this[g]===t&&(this[g]=null),(l=t.resolve)==null||l.call(t);try{s(i(c))}catch(u){a(u)}})},s=>C(this,null,function*(){try{return o==null?void 0:o(s)}finally{yield this.cancel(s)}}))}catch(e,i){return this.then(void 0,e,i)}finally(e,i){if(!(this instanceof n))throw new TypeError("CancellablePromise.prototype.finally called on an invalid object.");return h(e)?this.then(o=>n.resolve(e()).then(()=>o),o=>n.resolve(e()).then(()=>{throw o}),i):this.then(e,e,i)}static get[(g,Me,_e)](){return Promise}static all(e){let i=Array.from(e);return i.length===0?n.resolve(i):new n((o,t)=>{Promise.all(i).then(o,t)},Y(i))}static allSettled(e){let i=Array.from(e);return i.length===0?n.resolve(i):new n((o,t)=>{Promise.allSettled(i).then(o,t)},Y(i))}static any(e){let i=Array.from(e);return i.length===0?n.resolve(i):new n((o,t)=>{Promise.any(i).then(o,t)},Y(i))}static race(e){let i=Array.from(e);return new n((o,t)=>{Promise.race(i).then(o,t)},Y(i))}static cancel(e){let i=new n(()=>{});return i.cancel(e),i}static timeout(e,i){let o=new n(()=>{});return AbortSignal&&typeof AbortSignal=="function"&&AbortSignal.timeout&&typeof AbortSignal.timeout=="function"?AbortSignal.timeout(e).addEventListener("abort",()=>void o.cancel(i)):setTimeout(()=>void o.cancel(i),e),o}static sleep(e,i){return new n(o=>{setTimeout(()=>o(i),e)})}static reject(e){return new n((i,o)=>o(e))}static resolve(e){return e instanceof n?e:new n(i=>i(e))}static withResolvers(){let e={oncancelled:null};return e.promise=new n((i,o)=>{e.resolve=i,e.reject=o},i=>{var o;(o=e.oncancelled)==null||o.call(e,i)}),e}};function on(n,e){let i;return o=>{if(e.settled||(e.settled=!0,e.reason=o,n.reject(o),Se.call(n.promise,void 0,t=>{if(t!==o)throw t})),!(!e.reason||!n.oncancelled))return i=new Promise(t=>{try{t(n.oncancelled(e.reason.cause))}catch(s){Promise.reject(new O(n.promise,s,"Unhandled exception in oncancelled callback."))}}),i.then(void 0,t=>{throw new O(n.promise,t,"Unhandled rejection in oncancelled callback.")}),n.oncancelled=null,i}}function tn(n,e){return i=>{if(!e.resolving){if(e.resolving=!0,i===n.promise){if(e.settled)return;e.settled=!0,n.reject(new TypeError("A promise cannot be resolved with itself."));return}if(i!=null&&(typeof i=="object"||typeof i=="function")){let o;try{o=i.then}catch(t){e.settled=!0,n.reject(t);return}if(h(o)){try{let a=i.cancel;if(h(a)){let c=l=>{Reflect.apply(a,i,[l])};e.reason?on(Ie(Ue({},n),{oncancelled:c}),e)(e.reason):n.oncancelled=c}}catch(a){}let t={root:e.root,resolving:!1,get settled(){return this.root.settled},set settled(a){this.root.settled=a},get reason(){return this.root.reason}},s=rn(n,t);try{Reflect.apply(o,i,[tn(n,t),s])}catch(a){s(a)}return}}e.settled||(e.settled=!0,n.resolve(i))}}}function rn(n,e){return i=>{if(!e.resolving)if(e.resolving=!0,e.settled){try{if(i instanceof k&&e.reason instanceof k&&Object.is(i.cause,e.reason.cause))return}catch(o){}Promise.reject(new O(n.promise,i))}else e.settled=!0,n.reject(i)}}function Y(n){return e=>{for(let i of n)try{if(h(i.then)){let o=i.cancel;h(o)&&Reflect.apply(o,i,[e])}}catch(o){}}}function $e(n){return n}function en(n){throw n}function Po(n){try{if(n instanceof Error||typeof n!="object"||n.toString!==Object.prototype.toString)return""+n}catch(e){}try{return JSON.stringify(n)}catch(e){}try{return Object.prototype.toString.call(n)}catch(e){}return""}function Do(n){var i;let e=(i=n[g])!=null?i:{};return"promise"in e||Object.assign(e,E()),n[g]==null&&(e.resolve(),n[g]=e),e.promise}var Se=Promise.prototype.then;Promise.prototype.then=function(...n){return this instanceof F?this.then(...n):Reflect.apply(Se,this,n)};var E=Promise.withResolvers;E&&typeof E=="function"?E=E.bind(Promise):E=function(){let n,e;return{promise:new Promise((o,t)=>{n=o,e=t}),resolve:n,reject:e}};window._wails=window._wails||{};window._wails.callResultHandler=Ro;window._wails.callErrorHandler=Ao;var Mo=m(d.Call),So=m(d.CancelCall),L=new Map,To=0,xo=0,X=class extends Error{constructor(e,i){super(e,i),this.name="RuntimeError"}};function Ro(n,e,i){let o=sn(n);if(o)if(!e)o.resolve(void 0);else if(!i)o.resolve(e);else try{o.resolve(JSON.parse(e))}catch(t){o.reject(new TypeError("could not parse result: "+t.message,{cause:t}))}}function Ao(n,e,i){let o=sn(n);if(o)if(!i)o.reject(new Error(e));else{let t;try{t=JSON.parse(e)}catch(c){o.reject(new TypeError("could not parse error: "+c.message,{cause:c}));return}let s={};t.cause&&(s.cause=t.cause);let a;switch(t.kind){case"ReferenceError":a=new ReferenceError(t.message,s);break;case"TypeError":a=new TypeError(t.message,s);break;case"RuntimeError":a=new X(t.message,s);break;default:a=new Error(t.message,s);break}o.reject(a)}}function sn(n){let e=L.get(n);return L.delete(n),e}function Eo(){let n;do n=P();while(L.has(n));return n}function Te(n){let e=Eo(),i=F.withResolvers();L.set(e,{resolve:i.resolve,reject:i.reject});let o=Mo(To,Object.assign({"call-id":e},n)),t=!1;o.then(()=>{t=!0},a=>{L.delete(e),i.reject(a)});let s=()=>(L.delete(e),So(xo,{"call-id":e}).catch(a=>{}));return i.oncancelled=()=>t?s():o.then(s),i.promise}function ko(n,...e){return Te({methodName:n,args:e})}function Oo(n,...e){return Te({methodID:n,args:e})}var Re={};w(Re,{SetText:()=>Uo,Text:()=>Io});var an=m(d.Clipboard),Fo=0,Lo=1;function Uo(n){return an(Fo,{text:n})}function Io(){return an(Lo)}var Ae={};w(Ae,{Any:()=>v,Array:()=>jo,ByteSlice:()=>zo,Map:()=>Bo,Nullable:()=>Ho,Struct:()=>No});function v(n){return n}function zo(n){return n==null?"":n}function jo(n){return n===v?e=>e===null?[]:e:e=>{if(e===null)return[];for(let i=0;ii===null?{}:i:i=>{if(i===null)return{};for(let o in i)i[o]=e(i[o]);return i}}function Ho(n){return n===v?v:e=>e===null?null:n(e)}function No(n){let e=!0;for(let i in n)if(n[i]!==v){e=!1;break}return e?v:i=>{for(let o in n)o in i&&(i[o]=n[o](i[o]));return i}}var ke={};w(ke,{GetAll:()=>Go,GetCurrent:()=>Xo,GetPrimary:()=>Yo});var Ee=m(d.Screens),Zo=0,Vo=1,Ko=2;function Go(){return Ee(Zo)}function Yo(){return Ee(Vo)}function Xo(){return Ee(Ko)}window._wails=window._wails||{};window._wails.invoke=b;b("wails:runtime:ready");export{ye as Application,_ as Browser,xe as Call,k as CancelError,F as CancellablePromise,O as CancelledRejectionError,Re as Clipboard,Ae as Create,ee as Dialogs,oe as Events,we as Flags,ke as Screens,ue as System,le as WML,Z as Window}; +var Le=Object.defineProperty,ln=Object.defineProperties;var cn=Object.getOwnPropertyDescriptors;var Oe=Object.getOwnPropertySymbols;var dn=Object.prototype.hasOwnProperty,mn=Object.prototype.propertyIsEnumerable;var Fe=(n,e,i)=>e in n?Le(n,e,{enumerable:!0,configurable:!0,writable:!0,value:i}):n[e]=i,Ue=(n,e)=>{for(var i in e||(e={}))dn.call(e,i)&&Fe(n,i,e[i]);if(Oe)for(var i of Oe(e))mn.call(e,i)&&Fe(n,i,e[i]);return n},Ie=(n,e)=>ln(n,cn(e));var w=(n,e)=>{for(var i in e)Le(n,i,{get:e[i],enumerable:!0})};var P=(n,e,i)=>new Promise((o,t)=>{var r=l=>{try{c(i.next(l))}catch(u){t(u)}},a=l=>{try{c(i.throw(l))}catch(u){t(u)}},c=l=>l.done?o(l.value):Promise.resolve(l.value).then(r,a);c((i=i.apply(n,e)).next())});var de={};w(de,{Application:()=>ye,Browser:()=>$,Call:()=>xe,CancelError:()=>O,CancellablePromise:()=>B,CancelledRejectionError:()=>W,Clipboard:()=>Ae,Create:()=>Re,Dialogs:()=>ne,Events:()=>te,Flags:()=>pe,Screens:()=>ke,System:()=>we,WML:()=>ce,Window:()=>V});var ce={};w(ce,{Enable:()=>le,Reload:()=>Ye});var $={};w($,{OpenURL:()=>_});var un="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";function D(n=21){let e="",i=n|0;for(;i--;)e+=un[Math.random()*64|0];return e}var wn=window.location.origin+"/wails/runtime",d=Object.freeze({Call:0,Clipboard:1,Application:2,Events:3,ContextMenu:4,Dialog:5,Window:6,Screens:7,System:8,Browser:9,CancelCall:10}),pn=D();function m(n,e=""){return function(i,o=null){return fn(n,i,e,o)}}function fn(n,e,i,o){return P(this,null,function*(){var c,l;let t=new URL(wn);t.searchParams.append("object",n.toString()),t.searchParams.append("method",e.toString()),o&&t.searchParams.append("args",JSON.stringify(o));let r={"x-wails-client-id":pn};i&&(r["x-wails-window-name"]=i);let a=yield fetch(t,{headers:r});if(!a.ok)throw new Error(yield a.text());return((l=(c=a.headers.get("Content-Type"))==null?void 0:c.indexOf("application/json"))!=null?l:-1)!==-1?a.json():a.text()})}var gn=m(d.Browser),hn=0;function _(n){return gn(hn,{url:n.toString()})}var ne={};w(ne,{Error:()=>Rn,Info:()=>xn,OpenFile:()=>En,Question:()=>ee,SaveFile:()=>kn,Warning:()=>An});window._wails=window._wails||{};window._wails.dialogErrorCallback=Sn;window._wails.dialogResultCallback=Mn;var Wn=m(d.Dialog),L=new Map,bn=0,vn=1,yn=2,Cn=3,Pn=4,Dn=5;function Mn(n,e,i){let o=ze(n);if(o)if(i)try{o.resolve(JSON.parse(e))}catch(t){o.reject(new TypeError("could not parse result: "+t.message,{cause:t}))}else o.resolve(e)}function Sn(n,e){var i;(i=ze(n))==null||i.reject(new window.Error(e))}function ze(n){let e=L.get(n);return L.delete(n),e}function Tn(){let n;do n=D();while(L.has(n));return n}function M(n,e={}){let i=Tn();return new Promise((o,t)=>{L.set(i,{resolve:o,reject:t}),Wn(n,Object.assign({"dialog-id":i},e)).catch(r=>{L.delete(i),t(r)})})}function xn(n){return M(bn,n)}function An(n){return M(vn,n)}function Rn(n){return M(yn,n)}function ee(n){return M(Cn,n)}function En(n){var e;return(e=M(Pn,n))!=null?e:[]}function kn(n){return M(Dn,n)}var te={};w(te,{Emit:()=>oe,Off:()=>zn,OffAll:()=>jn,On:()=>Un,OnMultiple:()=>ie,Once:()=>In,Types:()=>Be,WailsEvent:()=>S});var f=new Map,H=class{constructor(e,i,o){this.eventName=e,this.callback=i,this.maxCallbacks=o||-1}dispatch(e){try{this.callback(e)}catch(i){}return this.maxCallbacks===-1?!1:(this.maxCallbacks-=1,this.maxCallbacks===0)}};function je(n){let e=f.get(n.eventName);e&&(e=e.filter(i=>i!==n),e.length===0?f.delete(n.eventName):f.set(n.eventName,e))}var Be=Object.freeze({Windows:Object.freeze({APMPowerSettingChange:"windows:APMPowerSettingChange",APMPowerStatusChange:"windows:APMPowerStatusChange",APMResumeAutomatic:"windows:APMResumeAutomatic",APMResumeSuspend:"windows:APMResumeSuspend",APMSuspend:"windows:APMSuspend",ApplicationStarted:"windows:ApplicationStarted",SystemThemeChanged:"windows:SystemThemeChanged",WebViewNavigationCompleted:"windows:WebViewNavigationCompleted",WindowActive:"windows:WindowActive",WindowBackgroundErase:"windows:WindowBackgroundErase",WindowClickActive:"windows:WindowClickActive",WindowClosing:"windows:WindowClosing",WindowDidMove:"windows:WindowDidMove",WindowDidResize:"windows:WindowDidResize",WindowDPIChanged:"windows:WindowDPIChanged",WindowDragDrop:"windows:WindowDragDrop",WindowDragEnter:"windows:WindowDragEnter",WindowDragLeave:"windows:WindowDragLeave",WindowDragOver:"windows:WindowDragOver",WindowEndMove:"windows:WindowEndMove",WindowEndResize:"windows:WindowEndResize",WindowFullscreen:"windows:WindowFullscreen",WindowHide:"windows:WindowHide",WindowInactive:"windows:WindowInactive",WindowKeyDown:"windows:WindowKeyDown",WindowKeyUp:"windows:WindowKeyUp",WindowKillFocus:"windows:WindowKillFocus",WindowNonClientHit:"windows:WindowNonClientHit",WindowNonClientMouseDown:"windows:WindowNonClientMouseDown",WindowNonClientMouseLeave:"windows:WindowNonClientMouseLeave",WindowNonClientMouseMove:"windows:WindowNonClientMouseMove",WindowNonClientMouseUp:"windows:WindowNonClientMouseUp",WindowPaint:"windows:WindowPaint",WindowRestore:"windows:WindowRestore",WindowSetFocus:"windows:WindowSetFocus",WindowShow:"windows:WindowShow",WindowStartMove:"windows:WindowStartMove",WindowStartResize:"windows:WindowStartResize",WindowUnFullscreen:"windows:WindowUnFullscreen",WindowZOrderChanged:"windows:WindowZOrderChanged",WindowMinimise:"windows:WindowMinimise",WindowUnMinimise:"windows:WindowUnMinimise",WindowMaximise:"windows:WindowMaximise",WindowUnMaximise:"windows:WindowUnMaximise"}),Mac:Object.freeze({ApplicationDidBecomeActive:"mac:ApplicationDidBecomeActive",ApplicationDidChangeBackingProperties:"mac:ApplicationDidChangeBackingProperties",ApplicationDidChangeEffectiveAppearance:"mac:ApplicationDidChangeEffectiveAppearance",ApplicationDidChangeIcon:"mac:ApplicationDidChangeIcon",ApplicationDidChangeOcclusionState:"mac:ApplicationDidChangeOcclusionState",ApplicationDidChangeScreenParameters:"mac:ApplicationDidChangeScreenParameters",ApplicationDidChangeStatusBarFrame:"mac:ApplicationDidChangeStatusBarFrame",ApplicationDidChangeStatusBarOrientation:"mac:ApplicationDidChangeStatusBarOrientation",ApplicationDidChangeTheme:"mac:ApplicationDidChangeTheme",ApplicationDidFinishLaunching:"mac:ApplicationDidFinishLaunching",ApplicationDidHide:"mac:ApplicationDidHide",ApplicationDidResignActive:"mac:ApplicationDidResignActive",ApplicationDidUnhide:"mac:ApplicationDidUnhide",ApplicationDidUpdate:"mac:ApplicationDidUpdate",ApplicationShouldHandleReopen:"mac:ApplicationShouldHandleReopen",ApplicationWillBecomeActive:"mac:ApplicationWillBecomeActive",ApplicationWillFinishLaunching:"mac:ApplicationWillFinishLaunching",ApplicationWillHide:"mac:ApplicationWillHide",ApplicationWillResignActive:"mac:ApplicationWillResignActive",ApplicationWillTerminate:"mac:ApplicationWillTerminate",ApplicationWillUnhide:"mac:ApplicationWillUnhide",ApplicationWillUpdate:"mac:ApplicationWillUpdate",MenuDidAddItem:"mac:MenuDidAddItem",MenuDidBeginTracking:"mac:MenuDidBeginTracking",MenuDidClose:"mac:MenuDidClose",MenuDidDisplayItem:"mac:MenuDidDisplayItem",MenuDidEndTracking:"mac:MenuDidEndTracking",MenuDidHighlightItem:"mac:MenuDidHighlightItem",MenuDidOpen:"mac:MenuDidOpen",MenuDidPopUp:"mac:MenuDidPopUp",MenuDidRemoveItem:"mac:MenuDidRemoveItem",MenuDidSendAction:"mac:MenuDidSendAction",MenuDidSendActionToItem:"mac:MenuDidSendActionToItem",MenuDidUpdate:"mac:MenuDidUpdate",MenuWillAddItem:"mac:MenuWillAddItem",MenuWillBeginTracking:"mac:MenuWillBeginTracking",MenuWillDisplayItem:"mac:MenuWillDisplayItem",MenuWillEndTracking:"mac:MenuWillEndTracking",MenuWillHighlightItem:"mac:MenuWillHighlightItem",MenuWillOpen:"mac:MenuWillOpen",MenuWillPopUp:"mac:MenuWillPopUp",MenuWillRemoveItem:"mac:MenuWillRemoveItem",MenuWillSendAction:"mac:MenuWillSendAction",MenuWillSendActionToItem:"mac:MenuWillSendActionToItem",MenuWillUpdate:"mac:MenuWillUpdate",WebViewDidCommitNavigation:"mac:WebViewDidCommitNavigation",WebViewDidFinishNavigation:"mac:WebViewDidFinishNavigation",WebViewDidReceiveServerRedirectForProvisionalNavigation:"mac:WebViewDidReceiveServerRedirectForProvisionalNavigation",WebViewDidStartProvisionalNavigation:"mac:WebViewDidStartProvisionalNavigation",WindowDidBecomeKey:"mac:WindowDidBecomeKey",WindowDidBecomeMain:"mac:WindowDidBecomeMain",WindowDidBeginSheet:"mac:WindowDidBeginSheet",WindowDidChangeAlpha:"mac:WindowDidChangeAlpha",WindowDidChangeBackingLocation:"mac:WindowDidChangeBackingLocation",WindowDidChangeBackingProperties:"mac:WindowDidChangeBackingProperties",WindowDidChangeCollectionBehavior:"mac:WindowDidChangeCollectionBehavior",WindowDidChangeEffectiveAppearance:"mac:WindowDidChangeEffectiveAppearance",WindowDidChangeOcclusionState:"mac:WindowDidChangeOcclusionState",WindowDidChangeOrderingMode:"mac:WindowDidChangeOrderingMode",WindowDidChangeScreen:"mac:WindowDidChangeScreen",WindowDidChangeScreenParameters:"mac:WindowDidChangeScreenParameters",WindowDidChangeScreenProfile:"mac:WindowDidChangeScreenProfile",WindowDidChangeScreenSpace:"mac:WindowDidChangeScreenSpace",WindowDidChangeScreenSpaceProperties:"mac:WindowDidChangeScreenSpaceProperties",WindowDidChangeSharingType:"mac:WindowDidChangeSharingType",WindowDidChangeSpace:"mac:WindowDidChangeSpace",WindowDidChangeSpaceOrderingMode:"mac:WindowDidChangeSpaceOrderingMode",WindowDidChangeTitle:"mac:WindowDidChangeTitle",WindowDidChangeToolbar:"mac:WindowDidChangeToolbar",WindowDidDeminiaturize:"mac:WindowDidDeminiaturize",WindowDidEndSheet:"mac:WindowDidEndSheet",WindowDidEnterFullScreen:"mac:WindowDidEnterFullScreen",WindowDidEnterVersionBrowser:"mac:WindowDidEnterVersionBrowser",WindowDidExitFullScreen:"mac:WindowDidExitFullScreen",WindowDidExitVersionBrowser:"mac:WindowDidExitVersionBrowser",WindowDidExpose:"mac:WindowDidExpose",WindowDidFocus:"mac:WindowDidFocus",WindowDidMiniaturize:"mac:WindowDidMiniaturize",WindowDidMove:"mac:WindowDidMove",WindowDidOrderOffScreen:"mac:WindowDidOrderOffScreen",WindowDidOrderOnScreen:"mac:WindowDidOrderOnScreen",WindowDidResignKey:"mac:WindowDidResignKey",WindowDidResignMain:"mac:WindowDidResignMain",WindowDidResize:"mac:WindowDidResize",WindowDidUpdate:"mac:WindowDidUpdate",WindowDidUpdateAlpha:"mac:WindowDidUpdateAlpha",WindowDidUpdateCollectionBehavior:"mac:WindowDidUpdateCollectionBehavior",WindowDidUpdateCollectionProperties:"mac:WindowDidUpdateCollectionProperties",WindowDidUpdateShadow:"mac:WindowDidUpdateShadow",WindowDidUpdateTitle:"mac:WindowDidUpdateTitle",WindowDidUpdateToolbar:"mac:WindowDidUpdateToolbar",WindowDidZoom:"mac:WindowDidZoom",WindowFileDraggingEntered:"mac:WindowFileDraggingEntered",WindowFileDraggingExited:"mac:WindowFileDraggingExited",WindowFileDraggingPerformed:"mac:WindowFileDraggingPerformed",WindowHide:"mac:WindowHide",WindowMaximise:"mac:WindowMaximise",WindowUnMaximise:"mac:WindowUnMaximise",WindowMinimise:"mac:WindowMinimise",WindowUnMinimise:"mac:WindowUnMinimise",WindowShouldClose:"mac:WindowShouldClose",WindowShow:"mac:WindowShow",WindowWillBecomeKey:"mac:WindowWillBecomeKey",WindowWillBecomeMain:"mac:WindowWillBecomeMain",WindowWillBeginSheet:"mac:WindowWillBeginSheet",WindowWillChangeOrderingMode:"mac:WindowWillChangeOrderingMode",WindowWillClose:"mac:WindowWillClose",WindowWillDeminiaturize:"mac:WindowWillDeminiaturize",WindowWillEnterFullScreen:"mac:WindowWillEnterFullScreen",WindowWillEnterVersionBrowser:"mac:WindowWillEnterVersionBrowser",WindowWillExitFullScreen:"mac:WindowWillExitFullScreen",WindowWillExitVersionBrowser:"mac:WindowWillExitVersionBrowser",WindowWillFocus:"mac:WindowWillFocus",WindowWillMiniaturize:"mac:WindowWillMiniaturize",WindowWillMove:"mac:WindowWillMove",WindowWillOrderOffScreen:"mac:WindowWillOrderOffScreen",WindowWillOrderOnScreen:"mac:WindowWillOrderOnScreen",WindowWillResignMain:"mac:WindowWillResignMain",WindowWillResize:"mac:WindowWillResize",WindowWillUnfocus:"mac:WindowWillUnfocus",WindowWillUpdate:"mac:WindowWillUpdate",WindowWillUpdateAlpha:"mac:WindowWillUpdateAlpha",WindowWillUpdateCollectionBehavior:"mac:WindowWillUpdateCollectionBehavior",WindowWillUpdateCollectionProperties:"mac:WindowWillUpdateCollectionProperties",WindowWillUpdateShadow:"mac:WindowWillUpdateShadow",WindowWillUpdateTitle:"mac:WindowWillUpdateTitle",WindowWillUpdateToolbar:"mac:WindowWillUpdateToolbar",WindowWillUpdateVisibility:"mac:WindowWillUpdateVisibility",WindowWillUseStandardFrame:"mac:WindowWillUseStandardFrame",WindowZoomIn:"mac:WindowZoomIn",WindowZoomOut:"mac:WindowZoomOut",WindowZoomReset:"mac:WindowZoomReset"}),Linux:Object.freeze({ApplicationStartup:"linux:ApplicationStartup",SystemThemeChanged:"linux:SystemThemeChanged",WindowDeleteEvent:"linux:WindowDeleteEvent",WindowDidMove:"linux:WindowDidMove",WindowDidResize:"linux:WindowDidResize",WindowFocusIn:"linux:WindowFocusIn",WindowFocusOut:"linux:WindowFocusOut",WindowLoadChanged:"linux:WindowLoadChanged"}),Common:Object.freeze({ApplicationOpenedWithFile:"common:ApplicationOpenedWithFile",ApplicationStarted:"common:ApplicationStarted",ThemeChanged:"common:ThemeChanged",WindowClosing:"common:WindowClosing",WindowDidMove:"common:WindowDidMove",WindowDidResize:"common:WindowDidResize",WindowDPIChanged:"common:WindowDPIChanged",WindowFilesDropped:"common:WindowFilesDropped",WindowFocus:"common:WindowFocus",WindowFullscreen:"common:WindowFullscreen",WindowHide:"common:WindowHide",WindowLostFocus:"common:WindowLostFocus",WindowMaximise:"common:WindowMaximise",WindowMinimise:"common:WindowMinimise",WindowRestore:"common:WindowRestore",WindowRuntimeReady:"common:WindowRuntimeReady",WindowShow:"common:WindowShow",WindowUnFullscreen:"common:WindowUnFullscreen",WindowUnMaximise:"common:WindowUnMaximise",WindowUnMinimise:"common:WindowUnMinimise",WindowZoom:"common:WindowZoom",WindowZoomIn:"common:WindowZoomIn",WindowZoomOut:"common:WindowZoomOut",WindowZoomReset:"common:WindowZoomReset"})});window._wails=window._wails||{};window._wails.dispatchWailsEvent=Ln;var On=m(d.Events),Fn=0,S=class{constructor(e,i=null){this.name=e,this.data=i}};function Ln(n){let e=f.get(n.name);if(!e)return;let i=new S(n.name,n.data);"sender"in n&&(i.sender=n.sender),e=e.filter(o=>!o.dispatch(i)),e.length===0?f.delete(n.name):f.set(n.name,e)}function ie(n,e,i){let o=f.get(n)||[],t=new H(n,e,i);return o.push(t),f.set(n,o),()=>je(t)}function Un(n,e){return ie(n,e,-1)}function In(n,e){return ie(n,e,1)}function zn(...n){n.forEach(e=>f.delete(e))}function jn(){f.clear()}function oe(n){return On(Fn,n)}function He(){return new MouseEvent("mousedown").buttons===0}function Ne(){if(!EventTarget||!AbortSignal||!AbortController)return!1;let n=!0,e=new EventTarget,i=new AbortController;return e.addEventListener("test",()=>{n=!1},{signal:i.signal}),i.abort(),e.dispatchEvent(new CustomEvent("test")),n}function N(n){var e;return n.target instanceof HTMLElement?n.target:!(n.target instanceof HTMLElement)&&n.target instanceof Node&&(e=n.target.parentElement)!=null?e:document.body}var Ze=!1;document.addEventListener("DOMContentLoaded",()=>{Ze=!0});function Ve(n){Ze||document.readyState==="complete"?n():document.addEventListener("DOMContentLoaded",n)}var Bn=0,Hn=1,Nn=2,Zn=3,Vn=4,Kn=5,Gn=6,Yn=7,Xn=8,Jn=9,Qn=10,qn=11,_n=12,$n=13,ei=14,ni=15,ii=16,oi=17,ti=18,ri=19,si=20,ai=21,li=22,ci=23,di=24,mi=25,ui=26,wi=27,pi=28,fi=29,gi=30,hi=31,Wi=32,bi=33,vi=34,yi=35,Ci=36,Pi=37,Di=38,Mi=39,Si=40,Ti=41,xi=42,Ai=43,Ri=44,Ei=45,ki=46,Oi=47,s=Symbol("caller");s;var Z=class Z{constructor(e=""){this[s]=m(d.Window,e);for(let i of Object.getOwnPropertyNames(Z.prototype))i!=="constructor"&&typeof this[i]=="function"&&(this[i]=this[i].bind(this))}Get(e){return new Z(e)}Position(){return this[s](Bn)}Center(){return this[s](Hn)}Close(){return this[s](Nn)}DisableSizeConstraints(){return this[s](Zn)}EnableSizeConstraints(){return this[s](Vn)}Focus(){return this[s](Kn)}ForceReload(){return this[s](Gn)}Fullscreen(){return this[s](Yn)}GetScreen(){return this[s](Xn)}GetZoom(){return this[s](Jn)}Height(){return this[s](Qn)}Hide(){return this[s](qn)}IsFocused(){return this[s](_n)}IsFullscreen(){return this[s]($n)}IsMaximised(){return this[s](ei)}IsMinimised(){return this[s](ni)}Maximise(){return this[s](ii)}Minimise(){return this[s](oi)}Name(){return this[s](ti)}OpenDevTools(){return this[s](ri)}RelativePosition(){return this[s](si)}Reload(){return this[s](ai)}Resizable(){return this[s](li)}Restore(){return this[s](ci)}SetPosition(e,i){return this[s](di,{x:e,y:i})}SetAlwaysOnTop(e){return this[s](mi,{alwaysOnTop:e})}SetBackgroundColour(e,i,o,t){return this[s](ui,{r:e,g:i,b:o,a:t})}SetFrameless(e){return this[s](wi,{frameless:e})}SetFullscreenButtonEnabled(e){return this[s](pi,{enabled:e})}SetMaxSize(e,i){return this[s](fi,{width:e,height:i})}SetMinSize(e,i){return this[s](gi,{width:e,height:i})}SetRelativePosition(e,i){return this[s](hi,{x:e,y:i})}SetResizable(e){return this[s](Wi,{resizable:e})}SetSize(e,i){return this[s](bi,{width:e,height:i})}SetTitle(e){return this[s](vi,{title:e})}SetZoom(e){return this[s](yi,{zoom:e})}Show(){return this[s](Ci)}Size(){return this[s](Pi)}ToggleFullscreen(){return this[s](Di)}ToggleMaximise(){return this[s](Mi)}UnFullscreen(){return this[s](Si)}UnMaximise(){return this[s](Ti)}UnMinimise(){return this[s](xi)}Width(){return this[s](Ai)}Zoom(){return this[s](Ri)}ZoomIn(){return this[s](Ei)}ZoomOut(){return this[s](ki)}ZoomReset(){return this[s](Oi)}},re=Z,Fi=new re(""),V=Fi;function Li(n,e=null){oe(new S(n,e))}function Ui(n,e){let i=V.Get(n),o=i[e];if(typeof o=="function")try{o.call(i)}catch(t){}}function Ke(n){let e=n.currentTarget;function i(t="Yes"){if(t!=="Yes")return;let r=e.getAttribute("wml-event")||e.getAttribute("data-wml-event"),a=e.getAttribute("wml-target-window")||e.getAttribute("data-wml-target-window")||"",c=e.getAttribute("wml-window")||e.getAttribute("data-wml-window"),l=e.getAttribute("wml-openurl")||e.getAttribute("data-wml-openurl");r!==null&&Li(r),c!==null&&Ui(a,c),l!==null&&_(l)}let o=e.getAttribute("wml-confirm")||e.getAttribute("data-wml-confirm");o?ee({Title:"Confirm",Message:o,Detached:!1,Buttons:[{Label:"Yes"},{Label:"No",IsDefault:!0}]}).then(i):i()}var U=Symbol("controller"),T=Symbol("triggerMap"),b=Symbol("elementCount");U;var se=class{constructor(){this[U]=new AbortController}set(e,i){return{signal:this[U].signal}}reset(){this[U].abort(),this[U]=new AbortController}};T,b;var ae=class{constructor(){this[T]=new WeakMap,this[b]=0}set(e,i){return this[T].has(e)||this[b]++,this[T].set(e,i),{}}reset(){if(!(this[b]<=0)){for(let e of document.body.querySelectorAll("*")){if(this[b]<=0)break;let i=this[T].get(e);i!=null&&this[b]--;for(let o of i||[])e.removeEventListener(o,Ke)}this[T]=new WeakMap,this[b]=0}}},Ge=Ne()?new se:new ae;function Ii(n){let e=/\S+/g,i=n.getAttribute("wml-trigger")||n.getAttribute("data-wml-trigger")||"click",o=[],t;for(;(t=e.exec(i))!==null;)o.push(t[0]);let r=Ge.set(n,o);for(let a of o)n.addEventListener(a,Ke,r)}function le(){Ve(Ye)}function Ye(){Ge.reset(),document.body.querySelectorAll("[wml-event], [wml-window], [wml-openurl], [data-wml-event], [data-wml-window], [data-wml-openurl]").forEach(Ii)}window.wails=de;le();var we={};w(we,{Capabilities:()=>Hi,Environment:()=>Ni,IsAMD64:()=>Ki,IsARM:()=>Gi,IsARM64:()=>Yi,IsDarkMode:()=>Bi,IsDebug:()=>ue,IsLinux:()=>Zi,IsMac:()=>Vi,IsWindows:()=>K,invoke:()=>v});var Xe=m(d.System),zi=0,ji=1,me=function(){var n,e,i,o,t;try{if((e=(n=window.chrome)==null?void 0:n.webview)!=null&&e.postMessage)return window.chrome.webview.postMessage.bind(window.chrome.webview);if((t=(o=(i=window.webkit)==null?void 0:i.messageHandlers)==null?void 0:o.external)!=null&&t.postMessage)return window.webkit.messageHandlers.external.postMessage.bind(window.webkit.messageHandlers.external)}catch(r){}return null}();function v(n){me==null||me(n)}function Bi(){return Xe(zi)}function Hi(){return P(this,null,function*(){let n=yield fetch("/wails/capabilities");if(n.ok)return n.json();throw new Error("could not fetch capabilities: "+n.statusText)})}function Ni(){return Xe(ji)}function K(){return window._wails.environment.OS==="windows"}function Zi(){return window._wails.environment.OS==="linux"}function Vi(){return window._wails.environment.OS==="darwin"}function Ki(){return window._wails.environment.Arch==="amd64"}function Gi(){return window._wails.environment.Arch==="arm"}function Yi(){return window._wails.environment.Arch==="arm64"}function ue(){return!!window._wails.environment.Debug}window.addEventListener("contextmenu",qi);var Xi=m(d.ContextMenu),Ji=0;function Qi(n,e,i,o){Xi(Ji,{id:n,x:e,y:i,data:o})}function qi(n){let e=N(n),i=window.getComputedStyle(e).getPropertyValue("--custom-contextmenu").trim();if(i){n.preventDefault();let o=window.getComputedStyle(e).getPropertyValue("--custom-contextmenu-data");Qi(i,n.clientX,n.clientY,o)}else _i(n,e)}function _i(n,e){if(ue())return;switch(window.getComputedStyle(e).getPropertyValue("--default-contextmenu").trim()){case"show":return;case"hide":n.preventDefault();return}if(e.isContentEditable)return;let i=window.getSelection(),o=i&&i.toString().length>0;if(o)for(let t=0;tI});function I(n){try{return window._wails.flags[n]}catch(e){throw new Error("Unable to retrieve flag '"+n+"': "+e,{cause:e})}}var z=!1,j=!1,We=!1,A=!1,R=!1,y="",Je="auto",x=0,fe=He();window._wails=window._wails||{};window._wails.setResizable=n=>{We=n,We||(A=R=!1,p())};window.addEventListener("mousedown",be,{capture:!0});window.addEventListener("mousemove",be,{capture:!0});window.addEventListener("mouseup",be,{capture:!0});for(let n of["click","contextmenu","dblclick"])window.addEventListener(n,$i,{capture:!0});function $i(n){(j||R)&&(n.stopImmediatePropagation(),n.stopPropagation(),n.preventDefault())}var ge=0,eo=1,he=2;function be(n){let e,i=n.buttons;switch(n.type){case"mousedown":e=ge,fe||(i=x|1<lo,Quit:()=>mo,Show:()=>co});var ve=m(d.Application),ro=0,so=1,ao=2;function lo(){return ve(ro)}function co(){return ve(so)}function mo(){return ve(ao)}var xe={};w(xe,{ByID:()=>Oo,ByName:()=>ko,Call:()=>Te,RuntimeError:()=>J});var qe=Function.prototype.toString,E=typeof Reflect=="object"&&Reflect!==null&&Reflect.apply,Ce,G;if(typeof E=="function"&&typeof Object.defineProperty=="function")try{Ce=Object.defineProperty({},"length",{get:function(){throw G}}),G={},E(function(){throw 42},null,Ce)}catch(n){n!==G&&(E=null)}else E=null;var uo=/^\s*class\b/,De=function(e){try{var i=qe.call(e);return uo.test(i)}catch(o){return!1}},Pe=function(e){try{return De(e)?!1:(qe.call(e),!0)}catch(i){return!1}},Y=Object.prototype.toString,wo="[object Object]",po="[object Function]",fo="[object GeneratorFunction]",go="[object HTMLAllCollection]",ho="[object HTML document.all class]",Wo="[object HTMLCollection]",bo=typeof Symbol=="function"&&!!Symbol.toStringTag,vo=!(0 in[,]),Me=function(){return!1};typeof document=="object"&&(Qe=document.all,Y.call(Qe)===Y.call(document.all)&&(Me=function(e){if((vo||!e)&&(typeof e=="undefined"||typeof e=="object"))try{var i=Y.call(e);return(i===go||i===ho||i===Wo||i===wo)&&e("")==null}catch(o){}return!1}));var Qe;function yo(n){if(Me(n))return!0;if(!n||typeof n!="function"&&typeof n!="object")return!1;try{E(n,null,Ce)}catch(e){if(e!==G)return!1}return!De(n)&&Pe(n)}function Co(n){if(Me(n))return!0;if(!n||typeof n!="function"&&typeof n!="object")return!1;if(bo)return Pe(n);if(De(n))return!1;var e=Y.call(n);return e!==po&&e!==fo&&!/^\[object HTML/.test(e)?!1:Pe(n)}var h=E?yo:Co;var O=class extends Error{constructor(e,i){super(e,i),this.name="CancelError"}},W=class extends Error{constructor(e,i,o){super((o!=null?o:"Unhandled rejection in cancelled promise.")+" Reason: "+Po(i),{cause:i}),this.promise=e,this.name="CancelledRejectionError"}},g=Symbol("barrier"),Se=Symbol("cancelImpl"),nn,_e=(nn=Symbol.species)!=null?nn:Symbol("speciesPolyfill"),B=class n extends Promise{constructor(e,i){let o,t;if(super((l,u)=>{o=l,t=u}),this.constructor[_e]!==Promise)throw new TypeError("CancellablePromise does not support transparent subclassing. Please refrain from overriding the [Symbol.species] static property.");let r={promise:this,resolve:o,reject:t,get oncancelled(){return i!=null?i:null},set oncancelled(l){i=l!=null?l:void 0}},a={get root(){return a},resolving:!1,settled:!1};Object.defineProperties(this,{[g]:{configurable:!1,enumerable:!1,writable:!0,value:null},[Se]:{configurable:!1,enumerable:!1,writable:!1,value:on(r,a)}});let c=rn(r,a);try{e(tn(r,a),c)}catch(l){a.resolving||c(l)}}cancel(e){return new n(i=>{Promise.all([this[Se](new O("Promise cancelled.",{cause:e})),Do(this)]).then(()=>i(),()=>i())})}cancelOn(e){return e.aborted?this.cancel(e.reason):e.addEventListener("abort",()=>void this.cancel(e.reason),{capture:!0}),this}then(e,i,o){if(!(this instanceof n))throw new TypeError("CancellablePromise.prototype.then called on an invalid object.");if(h(e)||(e=$e),h(i)||(i=en),e===$e&&i==en)return new n(r=>r(this));let t={};return this[g]=t,new n((r,a)=>{super.then(c=>{var l;this[g]===t&&(this[g]=null),(l=t.resolve)==null||l.call(t);try{r(e(c))}catch(u){a(u)}},c=>{var l;this[g]===t&&(this[g]=null),(l=t.resolve)==null||l.call(t);try{r(i(c))}catch(u){a(u)}})},r=>P(this,null,function*(){try{return o==null?void 0:o(r)}finally{yield this.cancel(r)}}))}catch(e,i){return this.then(void 0,e,i)}finally(e,i){if(!(this instanceof n))throw new TypeError("CancellablePromise.prototype.finally called on an invalid object.");return h(e)?this.then(o=>n.resolve(e()).then(()=>o),o=>n.resolve(e()).then(()=>{throw o}),i):this.then(e,e,i)}static get[(g,Se,_e)](){return Promise}static all(e){let i=Array.from(e),o=i.length===0?n.resolve(i):new n((t,r)=>{Promise.all(i).then(t,r)},t=>X(o,i,t));return o}static allSettled(e){let i=Array.from(e),o=i.length===0?n.resolve(i):new n((t,r)=>{Promise.allSettled(i).then(t,r)},t=>X(o,i,t));return o}static any(e){let i=Array.from(e),o=i.length===0?n.resolve(i):new n((t,r)=>{Promise.any(i).then(t,r)},t=>X(o,i,t));return o}static race(e){let i=Array.from(e),o=new n((t,r)=>{Promise.race(i).then(t,r)},t=>X(o,i,t));return o}static cancel(e){let i=new n(()=>{});return i.cancel(e),i}static timeout(e,i){let o=new n(()=>{});return AbortSignal&&typeof AbortSignal=="function"&&AbortSignal.timeout&&typeof AbortSignal.timeout=="function"?AbortSignal.timeout(e).addEventListener("abort",()=>void o.cancel(i)):setTimeout(()=>void o.cancel(i),e),o}static sleep(e,i){return new n(o=>{setTimeout(()=>o(i),e)})}static reject(e){return new n((i,o)=>o(e))}static resolve(e){return e instanceof n?e:new n(i=>i(e))}static withResolvers(){let e={oncancelled:null};return e.promise=new n((i,o)=>{e.resolve=i,e.reject=o},i=>{var o;(o=e.oncancelled)==null||o.call(e,i)}),e}};function on(n,e){let i;return o=>{if(e.settled||(e.settled=!0,e.reason=o,n.reject(o),Promise.prototype.then.call(n.promise,void 0,t=>{if(t!==o)throw t})),!(!e.reason||!n.oncancelled))return i=new Promise(t=>{try{t(n.oncancelled(e.reason.cause))}catch(r){Promise.reject(new W(n.promise,r,"Unhandled exception in oncancelled callback."))}}).catch(t=>{Promise.reject(new W(n.promise,t,"Unhandled rejection in oncancelled callback."))}),n.oncancelled=null,i}}function tn(n,e){return i=>{if(!e.resolving){if(e.resolving=!0,i===n.promise){if(e.settled)return;e.settled=!0,n.reject(new TypeError("A promise cannot be resolved with itself."));return}if(i!=null&&(typeof i=="object"||typeof i=="function")){let o;try{o=i.then}catch(t){e.settled=!0,n.reject(t);return}if(h(o)){try{let a=i.cancel;if(h(a)){let c=l=>{Reflect.apply(a,i,[l])};e.reason?on(Ie(Ue({},n),{oncancelled:c}),e)(e.reason):n.oncancelled=c}}catch(a){}let t={root:e.root,resolving:!1,get settled(){return this.root.settled},set settled(a){this.root.settled=a},get reason(){return this.root.reason}},r=rn(n,t);try{Reflect.apply(o,i,[tn(n,t),r])}catch(a){r(a)}return}}e.settled||(e.settled=!0,n.resolve(i))}}}function rn(n,e){return i=>{if(!e.resolving)if(e.resolving=!0,e.settled){try{if(i instanceof O&&e.reason instanceof O&&Object.is(i.cause,e.reason.cause))return}catch(o){}Promise.reject(new W(n.promise,i))}else e.settled=!0,n.reject(i)}}function X(n,e,i){let o=[];for(let t of e){let r;try{if(!h(t.then)||(r=t.cancel,!h(r)))continue}catch(c){continue}let a;try{a=Reflect.apply(r,t,[i])}catch(c){Promise.reject(new W(n,c,"Unhandled exception in cancel method."));continue}a&&o.push((a instanceof Promise?a:Promise.resolve(a)).catch(c=>{Promise.reject(new W(n,c,"Unhandled rejection in cancel method."))}))}return Promise.all(o)}function $e(n){return n}function en(n){throw n}function Po(n){try{if(n instanceof Error||typeof n!="object"||n.toString!==Object.prototype.toString)return""+n}catch(e){}try{return JSON.stringify(n)}catch(e){}try{return Object.prototype.toString.call(n)}catch(e){}return""}function Do(n){var i;let e=(i=n[g])!=null?i:{};return"promise"in e||Object.assign(e,k()),n[g]==null&&(e.resolve(),n[g]=e),e.promise}var k=Promise.withResolvers;k&&typeof k=="function"?k=k.bind(Promise):k=function(){let n,e;return{promise:new Promise((o,t)=>{n=o,e=t}),resolve:n,reject:e}};window._wails=window._wails||{};window._wails.callResultHandler=Ao;window._wails.callErrorHandler=Ro;var Mo=m(d.Call),So=m(d.CancelCall),F=new Map,To=0,xo=0,J=class extends Error{constructor(e,i){super(e,i),this.name="RuntimeError"}};function Ao(n,e,i){let o=sn(n);if(o)if(!e)o.resolve(void 0);else if(!i)o.resolve(e);else try{o.resolve(JSON.parse(e))}catch(t){o.reject(new TypeError("could not parse result: "+t.message,{cause:t}))}}function Ro(n,e,i){let o=sn(n);if(o)if(!i)o.reject(new Error(e));else{let t;try{t=JSON.parse(e)}catch(c){o.reject(new TypeError("could not parse error: "+c.message,{cause:c}));return}let r={};t.cause&&(r.cause=t.cause);let a;switch(t.kind){case"ReferenceError":a=new ReferenceError(t.message,r);break;case"TypeError":a=new TypeError(t.message,r);break;case"RuntimeError":a=new J(t.message,r);break;default:a=new Error(t.message,r);break}o.reject(a)}}function sn(n){let e=F.get(n);return F.delete(n),e}function Eo(){let n;do n=D();while(F.has(n));return n}function Te(n){let e=Eo(),i=B.withResolvers();F.set(e,{resolve:i.resolve,reject:i.reject});let o=Mo(To,Object.assign({"call-id":e},n)),t=!1;o.then(()=>{t=!0},a=>{F.delete(e),i.reject(a)});let r=()=>(F.delete(e),So(xo,{"call-id":e}).catch(a=>{}));return i.oncancelled=()=>t?r():o.then(r),i.promise}function ko(n,...e){return Te({methodName:n,args:e})}function Oo(n,...e){return Te({methodID:n,args:e})}var Ae={};w(Ae,{SetText:()=>Uo,Text:()=>Io});var an=m(d.Clipboard),Fo=0,Lo=1;function Uo(n){return an(Fo,{text:n})}function Io(){return an(Lo)}var Re={};w(Re,{Any:()=>C,Array:()=>jo,ByteSlice:()=>zo,Map:()=>Bo,Nullable:()=>Ho,Struct:()=>No});function C(n){return n}function zo(n){return n==null?"":n}function jo(n){return n===C?e=>e===null?[]:e:e=>{if(e===null)return[];for(let i=0;ii===null?{}:i:i=>{if(i===null)return{};for(let o in i)i[o]=e(i[o]);return i}}function Ho(n){return n===C?C:e=>e===null?null:n(e)}function No(n){let e=!0;for(let i in n)if(n[i]!==C){e=!1;break}return e?C:i=>{for(let o in n)o in i&&(i[o]=n[o](i[o]));return i}}var ke={};w(ke,{GetAll:()=>Go,GetCurrent:()=>Xo,GetPrimary:()=>Yo});var Ee=m(d.Screens),Zo=0,Vo=1,Ko=2;function Go(){return Ee(Zo)}function Yo(){return Ee(Vo)}function Xo(){return Ee(Ko)}window._wails=window._wails||{};window._wails.invoke=v;v("wails:runtime:ready");export{ye as Application,$ as Browser,xe as Call,O as CancelError,B as CancellablePromise,W as CancelledRejectionError,Ae as Clipboard,Re as Create,ne as Dialogs,te as Events,pe as Flags,ke as Screens,we as System,ce as WML,V as Window}; From 7bbc27594b9133b76fe704ffb1fdc9c39b9ae5fe Mon Sep 17 00:00:00 2001 From: Zach Botterman Date: Tue, 25 Feb 2025 09:32:52 -0800 Subject: [PATCH 071/374] fix windows --- .../notifications/notifications_windows.go | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/v3/pkg/services/notifications/notifications_windows.go b/v3/pkg/services/notifications/notifications_windows.go index 28d439f68..04dd6bc72 100644 --- a/v3/pkg/services/notifications/notifications_windows.go +++ b/v3/pkg/services/notifications/notifications_windows.go @@ -35,14 +35,13 @@ func New() *Service { // Sets an activation callback to emit an event when notifications are interacted with. func (ns *Service) ServiceStartup(ctx context.Context, options application.ServiceOptions) error { // Need to get App Name and generate a UUID on first launch - // - // toast.SetAppData(toast.AppData{ - // AppID: "Notifications", - // GUID: "{8F2E1A3D-C497-42B6-9E5D-72F8A169B051}", - // IconPath: "C:\\Users\\Zach\\Development\\notifications_demo\\build\\appicon.ico", - // ActivationExe: "C:\\Users\\Zach\\Development\\notifications_demo\\bin\\Notifications.exe", - // }) - // + // How do we grab the app icon properly? + toast.SetAppData(toast.AppData{ + AppID: "Notifications", + GUID: "{8F2E1A3D-C497-42B6-9E5D-72F8A169B051}", + IconPath: "C:\\Users\\Zach\\Development\\notifications_demo\\build\\appicon.ico", + ActivationExe: "C:\\Users\\Zach\\Development\\notifications_demo\\bin\\Notifications.exe", + }) toast.SetActivationCallback(func(args string, data []toast.UserData) { actionIdentifier, userInfo := parseNotificationResponse(args) @@ -97,7 +96,6 @@ func (ns *Service) CheckNotificationAuthorization() bool { // (subtitle and category id are only available on macOS) func (ns *Service) SendNotification(options NotificationOptions) error { n := toast.Notification{ - AppID: options.ID, Title: options.Title, Body: options.Body, ActivationArguments: DefaultActionIdentifier, @@ -128,7 +126,6 @@ func (ns *Service) SendNotificationWithActions(options NotificationOptions) erro NotificationLock.RUnlock() n := toast.Notification{ - AppID: options.ID, Title: options.Title, Body: options.Body, ActivationArguments: DefaultActionIdentifier, From 8dd1b61f1ea56a3370427a5ef8f4c15bceac6fec Mon Sep 17 00:00:00 2001 From: Fabio Massaioli Date: Tue, 25 Feb 2025 19:08:01 +0100 Subject: [PATCH 072/374] Use const for system caller variable --- v3/internal/assetserver/bundledassets/runtime.debug.js | 2 +- v3/internal/runtime/desktop/@wailsio/runtime/src/system.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/v3/internal/assetserver/bundledassets/runtime.debug.js b/v3/internal/assetserver/bundledassets/runtime.debug.js index f4ecd5a5b..8882ba9ef 100644 --- a/v3/internal/assetserver/bundledassets/runtime.debug.js +++ b/v3/internal/assetserver/bundledassets/runtime.debug.js @@ -2531,4 +2531,4 @@ export { wml_exports as WML, window_default as Window }; -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2luZGV4LnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy93bWwudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2Jyb3dzZXIudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL25hbm9pZC50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvcnVudGltZS50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvZGlhbG9ncy50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvZXZlbnRzLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9saXN0ZW5lci50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvZXZlbnRfdHlwZXMudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3V0aWxzLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy93aW5kb3cudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL2NvbXBpbGVkL21haW4uanMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3N5c3RlbS50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvY29udGV4dG1lbnUudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2ZsYWdzLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9kcmFnLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9hcHBsaWNhdGlvbi50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvY2FsbHMudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2NhbGxhYmxlLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9jYW5jZWxsYWJsZS50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvY2xpcGJvYXJkLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9jcmVhdGUudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3NjcmVlbnMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vLyBTZXR1cFxud2luZG93Ll93YWlscyA9IHdpbmRvdy5fd2FpbHMgfHwge307XG5cbmltcG9ydCBcIi4vY29udGV4dG1lbnUuanNcIjtcbmltcG9ydCBcIi4vZHJhZy5qc1wiO1xuXG4vLyBSZS1leHBvcnQgcHVibGljIEFQSVxuaW1wb3J0ICogYXMgQXBwbGljYXRpb24gZnJvbSBcIi4vYXBwbGljYXRpb24uanNcIjtcbmltcG9ydCAqIGFzIEJyb3dzZXIgZnJvbSBcIi4vYnJvd3Nlci5qc1wiO1xuaW1wb3J0ICogYXMgQ2FsbCBmcm9tIFwiLi9jYWxscy5qc1wiO1xuaW1wb3J0ICogYXMgQ2xpcGJvYXJkIGZyb20gXCIuL2NsaXBib2FyZC5qc1wiO1xuaW1wb3J0ICogYXMgQ3JlYXRlIGZyb20gXCIuL2NyZWF0ZS5qc1wiO1xuaW1wb3J0ICogYXMgRGlhbG9ncyBmcm9tIFwiLi9kaWFsb2dzLmpzXCI7XG5pbXBvcnQgKiBhcyBFdmVudHMgZnJvbSBcIi4vZXZlbnRzLmpzXCI7XG5pbXBvcnQgKiBhcyBGbGFncyBmcm9tIFwiLi9mbGFncy5qc1wiO1xuaW1wb3J0ICogYXMgU2NyZWVucyBmcm9tIFwiLi9zY3JlZW5zLmpzXCI7XG5pbXBvcnQgKiBhcyBTeXN0ZW0gZnJvbSBcIi4vc3lzdGVtLmpzXCI7XG5pbXBvcnQgV2luZG93IGZyb20gXCIuL3dpbmRvdy5qc1wiO1xuaW1wb3J0ICogYXMgV01MIGZyb20gXCIuL3dtbC5qc1wiO1xuXG5leHBvcnQge1xuICAgIEFwcGxpY2F0aW9uLFxuICAgIEJyb3dzZXIsXG4gICAgQ2FsbCxcbiAgICBDbGlwYm9hcmQsXG4gICAgRGlhbG9ncyxcbiAgICBFdmVudHMsXG4gICAgRmxhZ3MsXG4gICAgU2NyZWVucyxcbiAgICBTeXN0ZW0sXG4gICAgV2luZG93LFxuICAgIFdNTFxufTtcblxuLyoqXG4gKiBBbiBpbnRlcm5hbCB1dGlsaXR5IGNvbnN1bWVkIGJ5IHRoZSBiaW5kaW5nIGdlbmVyYXRvci5cbiAqXG4gKiBAaWdub3JlXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IHsgQ3JlYXRlIH07XG5cbmV4cG9ydCAqIGZyb20gXCIuL2NhbmNlbGxhYmxlLmpzXCI7XG5cbi8vIE5vdGlmeSBiYWNrZW5kXG53aW5kb3cuX3dhaWxzLmludm9rZSA9IFN5c3RlbS5pbnZva2U7XG5TeXN0ZW0uaW52b2tlKFwid2FpbHM6cnVudGltZTpyZWFkeVwiKTtcbiIsICIvKlxuIF8gICAgIF9fICAgICBfIF9fXG58IHwgIC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuaW1wb3J0IHsgT3BlblVSTCB9IGZyb20gXCIuL2Jyb3dzZXIuanNcIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4vZGlhbG9ncy5qc1wiO1xuaW1wb3J0IHsgRW1pdCwgV2FpbHNFdmVudCB9IGZyb20gXCIuL2V2ZW50cy5qc1wiO1xuaW1wb3J0IHsgY2FuQWJvcnRMaXN0ZW5lcnMsIHdoZW5SZWFkeSB9IGZyb20gXCIuL3V0aWxzLmpzXCI7XG5pbXBvcnQgV2luZG93IGZyb20gXCIuL3dpbmRvdy5qc1wiO1xuXG4vKipcbiAqIFNlbmRzIGFuIGV2ZW50IHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIG9wdGlvbmFsIGRhdGEuXG4gKlxuICogQHBhcmFtIGV2ZW50TmFtZSAtIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIHNlbmQuXG4gKiBAcGFyYW0gW2RhdGE9bnVsbF0gLSAtIE9wdGlvbmFsIGRhdGEgdG8gc2VuZCBhbG9uZyB3aXRoIHRoZSBldmVudC5cbiAqL1xuZnVuY3Rpb24gc2VuZEV2ZW50KGV2ZW50TmFtZTogc3RyaW5nLCBkYXRhOiBhbnkgPSBudWxsKTogdm9pZCB7XG4gICAgRW1pdChuZXcgV2FpbHNFdmVudChldmVudE5hbWUsIGRhdGEpKTtcbn1cblxuLyoqXG4gKiBDYWxscyBhIG1ldGhvZCBvbiBhIHNwZWNpZmllZCB3aW5kb3cuXG4gKlxuICogQHBhcmFtIHdpbmRvd05hbWUgLSBUaGUgbmFtZSBvZiB0aGUgd2luZG93IHRvIGNhbGwgdGhlIG1ldGhvZCBvbi5cbiAqIEBwYXJhbSBtZXRob2ROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0byBjYWxsLlxuICovXG5mdW5jdGlvbiBjYWxsV2luZG93TWV0aG9kKHdpbmRvd05hbWU6IHN0cmluZywgbWV0aG9kTmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgdGFyZ2V0V2luZG93ID0gV2luZG93LkdldCh3aW5kb3dOYW1lKTtcbiAgICBjb25zdCBtZXRob2QgPSAodGFyZ2V0V2luZG93IGFzIGFueSlbbWV0aG9kTmFtZV07XG5cbiAgICBpZiAodHlwZW9mIG1ldGhvZCAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFdpbmRvdyBtZXRob2QgJyR7bWV0aG9kTmFtZX0nIG5vdCBmb3VuZGApO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgICAgbWV0aG9kLmNhbGwodGFyZ2V0V2luZG93KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIGNhbGxpbmcgd2luZG93IG1ldGhvZCAnJHttZXRob2ROYW1lfSc6IGAsIGUpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZXNwb25kcyB0byBhIHRyaWdnZXJpbmcgZXZlbnQgYnkgcnVubmluZyBhcHByb3ByaWF0ZSBXTUwgYWN0aW9ucyBmb3IgdGhlIGN1cnJlbnQgdGFyZ2V0LlxuICovXG5mdW5jdGlvbiBvbldNTFRyaWdnZXJlZChldjogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBlbGVtZW50ID0gZXYuY3VycmVudFRhcmdldCBhcyBFbGVtZW50O1xuXG4gICAgZnVuY3Rpb24gcnVuRWZmZWN0KGNob2ljZSA9IFwiWWVzXCIpIHtcbiAgICAgICAgaWYgKGNob2ljZSAhPT0gXCJZZXNcIilcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjb25zdCBldmVudFR5cGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnd21sLWV2ZW50JykgfHwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtd21sLWV2ZW50Jyk7XG4gICAgICAgIGNvbnN0IHRhcmdldFdpbmRvdyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd3bWwtdGFyZ2V0LXdpbmRvdycpIHx8IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXdtbC10YXJnZXQtd2luZG93JykgfHwgXCJcIjtcbiAgICAgICAgY29uc3Qgd2luZG93TWV0aG9kID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3dtbC13aW5kb3cnKSB8fCBlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS13bWwtd2luZG93Jyk7XG4gICAgICAgIGNvbnN0IHVybCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd3bWwtb3BlbnVybCcpIHx8IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXdtbC1vcGVudXJsJyk7XG5cbiAgICAgICAgaWYgKGV2ZW50VHlwZSAhPT0gbnVsbClcbiAgICAgICAgICAgIHNlbmRFdmVudChldmVudFR5cGUpO1xuICAgICAgICBpZiAod2luZG93TWV0aG9kICE9PSBudWxsKVxuICAgICAgICAgICAgY2FsbFdpbmRvd01ldGhvZCh0YXJnZXRXaW5kb3csIHdpbmRvd01ldGhvZCk7XG4gICAgICAgIGlmICh1cmwgIT09IG51bGwpXG4gICAgICAgICAgICB2b2lkIE9wZW5VUkwodXJsKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb25maXJtID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3dtbC1jb25maXJtJykgfHwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtd21sLWNvbmZpcm0nKTtcblxuICAgIGlmIChjb25maXJtKSB7XG4gICAgICAgIFF1ZXN0aW9uKHtcbiAgICAgICAgICAgIFRpdGxlOiBcIkNvbmZpcm1cIixcbiAgICAgICAgICAgIE1lc3NhZ2U6IGNvbmZpcm0sXG4gICAgICAgICAgICBEZXRhY2hlZDogZmFsc2UsXG4gICAgICAgICAgICBCdXR0b25zOiBbXG4gICAgICAgICAgICAgICAgeyBMYWJlbDogXCJZZXNcIiB9LFxuICAgICAgICAgICAgICAgIHsgTGFiZWw6IFwiTm9cIiwgSXNEZWZhdWx0OiB0cnVlIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSkudGhlbihydW5FZmZlY3QpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJ1bkVmZmVjdCgpO1xuICAgIH1cbn1cblxuLy8gUHJpdmF0ZSBmaWVsZCBuYW1lcy5cbmNvbnN0IGNvbnRyb2xsZXJTeW0gPSBTeW1ib2woXCJjb250cm9sbGVyXCIpO1xuY29uc3QgdHJpZ2dlck1hcFN5bSA9IFN5bWJvbChcInRyaWdnZXJNYXBcIik7XG5jb25zdCBlbGVtZW50Q291bnRTeW0gPSBTeW1ib2woXCJlbGVtZW50Q291bnRcIik7XG5cbi8qKlxuICogQWJvcnRDb250cm9sbGVyUmVnaXN0cnkgZG9lcyBub3QgYWN0dWFsbHkgcmVtZW1iZXIgYWN0aXZlIGV2ZW50IGxpc3RlbmVyczogaW5zdGVhZFxuICogaXQgdGllcyB0aGVtIHRvIGFuIEFib3J0U2lnbmFsIGFuZCB1c2VzIGFuIEFib3J0Q29udHJvbGxlciB0byByZW1vdmUgdGhlbSBhbGwgYXQgb25jZS5cbiAqL1xuY2xhc3MgQWJvcnRDb250cm9sbGVyUmVnaXN0cnkge1xuICAgIC8vIFByaXZhdGUgZmllbGRzLlxuICAgIFtjb250cm9sbGVyU3ltXTogQWJvcnRDb250cm9sbGVyO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXNbY29udHJvbGxlclN5bV0gPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBvcHRpb25zIG9iamVjdCBmb3IgYWRkRXZlbnRMaXN0ZW5lciB0aGF0IHRpZXMgdGhlIGxpc3RlbmVyXG4gICAgICogdG8gdGhlIEFib3J0U2lnbmFsIGZyb20gdGhlIGN1cnJlbnQgQWJvcnRDb250cm9sbGVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVsZW1lbnQgLSBBbiBIVE1MIGVsZW1lbnRcbiAgICAgKiBAcGFyYW0gdHJpZ2dlcnMgLSBUaGUgbGlzdCBvZiBhY3RpdmUgV01MIHRyaWdnZXIgZXZlbnRzIGZvciB0aGUgc3BlY2lmaWVkIGVsZW1lbnRzXG4gICAgICovXG4gICAgc2V0KGVsZW1lbnQ6IEVsZW1lbnQsIHRyaWdnZXJzOiBzdHJpbmdbXSk6IEFkZEV2ZW50TGlzdGVuZXJPcHRpb25zIHtcbiAgICAgICAgcmV0dXJuIHsgc2lnbmFsOiB0aGlzW2NvbnRyb2xsZXJTeW1dLnNpZ25hbCB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIHJlZ2lzdGVyZWQgZXZlbnQgbGlzdGVuZXJzIGFuZCByZXNldHMgdGhlIHJlZ2lzdHJ5LlxuICAgICAqL1xuICAgIHJlc2V0KCk6IHZvaWQge1xuICAgICAgICB0aGlzW2NvbnRyb2xsZXJTeW1dLmFib3J0KCk7XG4gICAgICAgIHRoaXNbY29udHJvbGxlclN5bV0gPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgfVxufVxuXG4vKipcbiAqIFdlYWtNYXBSZWdpc3RyeSBtYXBzIGFjdGl2ZSB0cmlnZ2VyIGV2ZW50cyB0byBlYWNoIERPTSBlbGVtZW50IHRocm91Z2ggYSBXZWFrTWFwLlxuICogVGhpcyBlbnN1cmVzIHRoYXQgdGhlIG1hcHBpbmcgcmVtYWlucyBwcml2YXRlIHRvIHRoaXMgbW9kdWxlLCB3aGlsZSBzdGlsbCBhbGxvd2luZyBnYXJiYWdlXG4gKiBjb2xsZWN0aW9uIG9mIHRoZSBpbnZvbHZlZCBlbGVtZW50cy5cbiAqL1xuY2xhc3MgV2Vha01hcFJlZ2lzdHJ5IHtcbiAgICAvKiogU3RvcmVzIHRoZSBjdXJyZW50IGVsZW1lbnQtdG8tdHJpZ2dlciBtYXBwaW5nLiAqL1xuICAgIFt0cmlnZ2VyTWFwU3ltXTogV2Vha01hcDxFbGVtZW50LCBzdHJpbmdbXT47XG4gICAgLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHdpdGggYWN0aXZlIFdNTCB0cmlnZ2Vycy4gKi9cbiAgICBbZWxlbWVudENvdW50U3ltXTogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXNbdHJpZ2dlck1hcFN5bV0gPSBuZXcgV2Vha01hcCgpO1xuICAgICAgICB0aGlzW2VsZW1lbnRDb3VudFN5bV0gPSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgYWN0aXZlIHRyaWdnZXJzIGZvciB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZWxlbWVudCAtIEFuIEhUTUwgZWxlbWVudFxuICAgICAqIEBwYXJhbSB0cmlnZ2VycyAtIFRoZSBsaXN0IG9mIGFjdGl2ZSBXTUwgdHJpZ2dlciBldmVudHMgZm9yIHRoZSBzcGVjaWZpZWQgZWxlbWVudFxuICAgICAqL1xuICAgIHNldChlbGVtZW50OiBFbGVtZW50LCB0cmlnZ2Vyczogc3RyaW5nW10pOiBBZGRFdmVudExpc3RlbmVyT3B0aW9ucyB7XG4gICAgICAgIGlmICghdGhpc1t0cmlnZ2VyTWFwU3ltXS5oYXMoZWxlbWVudCkpIHsgdGhpc1tlbGVtZW50Q291bnRTeW1dKys7IH1cbiAgICAgICAgdGhpc1t0cmlnZ2VyTWFwU3ltXS5zZXQoZWxlbWVudCwgdHJpZ2dlcnMpO1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwgcmVnaXN0ZXJlZCBldmVudCBsaXN0ZW5lcnMuXG4gICAgICovXG4gICAgcmVzZXQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzW2VsZW1lbnRDb3VudFN5bV0gPD0gMClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZG9jdW1lbnQuYm9keS5xdWVyeVNlbGVjdG9yQWxsKCcqJykpIHtcbiAgICAgICAgICAgIGlmICh0aGlzW2VsZW1lbnRDb3VudFN5bV0gPD0gMClcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY29uc3QgdHJpZ2dlcnMgPSB0aGlzW3RyaWdnZXJNYXBTeW1dLmdldChlbGVtZW50KTtcbiAgICAgICAgICAgIGlmICh0cmlnZ2VycyAhPSBudWxsKSB7IHRoaXNbZWxlbWVudENvdW50U3ltXS0tOyB9XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgdHJpZ2dlciBvZiB0cmlnZ2VycyB8fCBbXSlcbiAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodHJpZ2dlciwgb25XTUxUcmlnZ2VyZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpc1t0cmlnZ2VyTWFwU3ltXSA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgIHRoaXNbZWxlbWVudENvdW50U3ltXSA9IDA7XG4gICAgfVxufVxuXG5jb25zdCB0cmlnZ2VyUmVnaXN0cnkgPSBjYW5BYm9ydExpc3RlbmVycygpID8gbmV3IEFib3J0Q29udHJvbGxlclJlZ2lzdHJ5KCkgOiBuZXcgV2Vha01hcFJlZ2lzdHJ5KCk7XG5cbi8qKlxuICogQWRkcyBldmVudCBsaXN0ZW5lcnMgdG8gdGhlIHNwZWNpZmllZCBlbGVtZW50LlxuICovXG5mdW5jdGlvbiBhZGRXTUxMaXN0ZW5lcnMoZWxlbWVudDogRWxlbWVudCk6IHZvaWQge1xuICAgIGNvbnN0IHRyaWdnZXJSZWdFeHAgPSAvXFxTKy9nO1xuICAgIGNvbnN0IHRyaWdnZXJBdHRyID0gKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd3bWwtdHJpZ2dlcicpIHx8IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXdtbC10cmlnZ2VyJykgfHwgXCJjbGlja1wiKTtcbiAgICBjb25zdCB0cmlnZ2Vyczogc3RyaW5nW10gPSBbXTtcblxuICAgIGxldCBtYXRjaDtcbiAgICB3aGlsZSAoKG1hdGNoID0gdHJpZ2dlclJlZ0V4cC5leGVjKHRyaWdnZXJBdHRyKSkgIT09IG51bGwpXG4gICAgICAgIHRyaWdnZXJzLnB1c2gobWF0Y2hbMF0pO1xuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHRyaWdnZXJSZWdpc3RyeS5zZXQoZWxlbWVudCwgdHJpZ2dlcnMpO1xuICAgIGZvciAoY29uc3QgdHJpZ2dlciBvZiB0cmlnZ2VycylcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHRyaWdnZXIsIG9uV01MVHJpZ2dlcmVkLCBvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBTY2hlZHVsZXMgYW4gYXV0b21hdGljIHJlbG9hZCBvZiBXTUwgdG8gYmUgcGVyZm9ybWVkIGFzIHNvb24gYXMgdGhlIGRvY3VtZW50IGlzIGZ1bGx5IGxvYWRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEVuYWJsZSgpOiB2b2lkIHtcbiAgICB3aGVuUmVhZHkoUmVsb2FkKTtcbn1cblxuLyoqXG4gKiBSZWxvYWRzIHRoZSBXTUwgcGFnZSBieSBhZGRpbmcgbmVjZXNzYXJ5IGV2ZW50IGxpc3RlbmVycyBhbmQgYnJvd3NlciBsaXN0ZW5lcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBSZWxvYWQoKTogdm9pZCB7XG4gICAgdHJpZ2dlclJlZ2lzdHJ5LnJlc2V0KCk7XG4gICAgZG9jdW1lbnQuYm9keS5xdWVyeVNlbGVjdG9yQWxsKCdbd21sLWV2ZW50XSwgW3dtbC13aW5kb3ddLCBbd21sLW9wZW51cmxdLCBbZGF0YS13bWwtZXZlbnRdLCBbZGF0YS13bWwtd2luZG93XSwgW2RhdGEtd21sLW9wZW51cmxdJykuZm9yRWFjaChhZGRXTUxMaXN0ZW5lcnMpO1xufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5pbXBvcnQgeyBuZXdSdW50aW1lQ2FsbGVyLCBvYmplY3ROYW1lcyB9IGZyb20gXCIuL3J1bnRpbWUuanNcIjtcblxuY29uc3QgY2FsbCA9IG5ld1J1bnRpbWVDYWxsZXIob2JqZWN0TmFtZXMuQnJvd3Nlcik7XG5cbmNvbnN0IEJyb3dzZXJPcGVuVVJMID0gMDtcblxuLyoqXG4gKiBPcGVuIGEgYnJvd3NlciB3aW5kb3cgdG8gdGhlIGdpdmVuIFVSTC5cbiAqXG4gKiBAcGFyYW0gdXJsIC0gVGhlIFVSTCB0byBvcGVuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBPcGVuVVJMKHVybDogc3RyaW5nIHwgVVJMKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIGNhbGwoQnJvd3Nlck9wZW5VUkwsIHt1cmw6IHVybC50b1N0cmluZygpfSk7XG59XG4iLCAiLy8gU291cmNlOiBodHRwczovL2dpdGh1Yi5jb20vYWkvbmFub2lkXG5cbi8vIFRoZSBNSVQgTGljZW5zZSAoTUlUKVxuLy9cbi8vIENvcHlyaWdodCAyMDE3IEFuZHJleSBTaXRuaWsgPGFuZHJleUBzaXRuaWsucnU+XG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZlxuLy8gdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpblxuLy8gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0b1xuLy8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2Zcbi8vIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbyxcbi8vICAgICBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyAgICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4vLyBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vICAgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTU1xuLy8gRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SXG4vLyBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVJcbi8vIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOXG4vLyBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBUaGlzIGFscGhhYmV0IHVzZXMgYEEtWmEtejAtOV8tYCBzeW1ib2xzLlxuLy8gVGhlIG9yZGVyIG9mIGNoYXJhY3RlcnMgaXMgb3B0aW1pemVkIGZvciBiZXR0ZXIgZ3ppcCBhbmQgYnJvdGxpIGNvbXByZXNzaW9uLlxuLy8gUmVmZXJlbmNlcyB0byB0aGUgc2FtZSBmaWxlICh3b3JrcyBib3RoIGZvciBnemlwIGFuZCBicm90bGkpOlxuLy8gYCd1c2VgLCBgYW5kb21gLCBhbmQgYHJpY3QnYFxuLy8gUmVmZXJlbmNlcyB0byB0aGUgYnJvdGxpIGRlZmF1bHQgZGljdGlvbmFyeTpcbi8vIGAtMjZUYCwgYDE5ODNgLCBgNDBweGAsIGA3NXB4YCwgYGJ1c2hgLCBgamFja2AsIGBtaW5kYCwgYHZlcnlgLCBhbmQgYHdvbGZgXG5jb25zdCB1cmxBbHBoYWJldCA9XG4gICAgJ3VzZWFuZG9tLTI2VDE5ODM0MFBYNzVweEpBQ0tWRVJZTUlOREJVU0hXT0xGX0dRWmJmZ2hqa2xxdnd5enJpY3QnXG5cbmV4cG9ydCBmdW5jdGlvbiBuYW5vaWQoc2l6ZTogbnVtYmVyID0gMjEpOiBzdHJpbmcge1xuICAgIGxldCBpZCA9ICcnXG4gICAgLy8gQSBjb21wYWN0IGFsdGVybmF0aXZlIGZvciBgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGVwOyBpKyspYC5cbiAgICBsZXQgaSA9IHNpemUgfCAwXG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgICAvLyBgfCAwYCBpcyBtb3JlIGNvbXBhY3QgYW5kIGZhc3RlciB0aGFuIGBNYXRoLmZsb29yKClgLlxuICAgICAgICBpZCArPSB1cmxBbHBoYWJldFsoTWF0aC5yYW5kb20oKSAqIDY0KSB8IDBdXG4gICAgfVxuICAgIHJldHVybiBpZFxufVxuIiwgIi8qXG4gXyAgICAgX18gICAgIF8gX19cbnwgfCAgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5pbXBvcnQgeyBuYW5vaWQgfSBmcm9tICcuL25hbm9pZC5qcyc7XG5cbmNvbnN0IHJ1bnRpbWVVUkwgPSB3aW5kb3cubG9jYXRpb24ub3JpZ2luICsgXCIvd2FpbHMvcnVudGltZVwiO1xuXG4vLyBPYmplY3QgTmFtZXNcbmV4cG9ydCBjb25zdCBvYmplY3ROYW1lcyA9IE9iamVjdC5mcmVlemUoe1xuICAgIENhbGw6IDAsXG4gICAgQ2xpcGJvYXJkOiAxLFxuICAgIEFwcGxpY2F0aW9uOiAyLFxuICAgIEV2ZW50czogMyxcbiAgICBDb250ZXh0TWVudTogNCxcbiAgICBEaWFsb2c6IDUsXG4gICAgV2luZG93OiA2LFxuICAgIFNjcmVlbnM6IDcsXG4gICAgU3lzdGVtOiA4LFxuICAgIEJyb3dzZXI6IDksXG4gICAgQ2FuY2VsQ2FsbDogMTAsXG59KTtcbmV4cG9ydCBsZXQgY2xpZW50SWQgPSBuYW5vaWQoKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHJ1bnRpbWUgY2FsbGVyIHdpdGggc3BlY2lmaWVkIElELlxuICpcbiAqIEBwYXJhbSBvYmplY3QgLSBUaGUgb2JqZWN0IHRvIGludm9rZSB0aGUgbWV0aG9kIG9uLlxuICogQHBhcmFtIHdpbmRvd05hbWUgLSBUaGUgbmFtZSBvZiB0aGUgd2luZG93LlxuICogQHJldHVybiBUaGUgbmV3IHJ1bnRpbWUgY2FsbGVyIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbmV3UnVudGltZUNhbGxlcihvYmplY3Q6IG51bWJlciwgd2luZG93TmFtZTogc3RyaW5nID0gJycpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG1ldGhvZDogbnVtYmVyLCBhcmdzOiBhbnkgPSBudWxsKSB7XG4gICAgICAgIHJldHVybiBydW50aW1lQ2FsbFdpdGhJRChvYmplY3QsIG1ldGhvZCwgd2luZG93TmFtZSwgYXJncyk7XG4gICAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVudGltZUNhbGxXaXRoSUQob2JqZWN0SUQ6IG51bWJlciwgbWV0aG9kOiBudW1iZXIsIHdpbmRvd05hbWU6IHN0cmluZywgYXJnczogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICBsZXQgdXJsID0gbmV3IFVSTChydW50aW1lVVJMKTtcbiAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChcIm9iamVjdFwiLCBvYmplY3RJRC50b1N0cmluZygpKTtcbiAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChcIm1ldGhvZFwiLCBtZXRob2QudG9TdHJpbmcoKSk7XG4gICAgaWYgKGFyZ3MpIHsgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoXCJhcmdzXCIsIEpTT04uc3RyaW5naWZ5KGFyZ3MpKTsgfVxuXG4gICAgbGV0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgIFtcIngtd2FpbHMtY2xpZW50LWlkXCJdOiBjbGllbnRJZFxuICAgIH1cbiAgICBpZiAod2luZG93TmFtZSkge1xuICAgICAgICBoZWFkZXJzW1wieC13YWlscy13aW5kb3ctbmFtZVwiXSA9IHdpbmRvd05hbWU7XG4gICAgfVxuXG4gICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7IGhlYWRlcnMgfSk7XG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYXdhaXQgcmVzcG9uc2UudGV4dCgpKTtcbiAgICB9XG5cbiAgICBpZiAoKHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiQ29udGVudC1UeXBlXCIpPy5pbmRleE9mKFwiYXBwbGljYXRpb24vanNvblwiKSA/PyAtMSkgIT09IC0xKSB7XG4gICAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKTtcbiAgICB9XG59XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbmltcG9ydCB7bmV3UnVudGltZUNhbGxlciwgb2JqZWN0TmFtZXN9IGZyb20gXCIuL3J1bnRpbWUuanNcIjtcbmltcG9ydCB7IG5hbm9pZCB9IGZyb20gJy4vbmFub2lkLmpzJztcblxuLy8gc2V0dXBcbndpbmRvdy5fd2FpbHMgPSB3aW5kb3cuX3dhaWxzIHx8IHt9O1xud2luZG93Ll93YWlscy5kaWFsb2dFcnJvckNhbGxiYWNrID0gZGlhbG9nRXJyb3JDYWxsYmFjaztcbndpbmRvdy5fd2FpbHMuZGlhbG9nUmVzdWx0Q2FsbGJhY2sgPSBkaWFsb2dSZXN1bHRDYWxsYmFjaztcblxudHlwZSBQcm9taXNlUmVzb2x2ZXJzID0gT21pdDxQcm9taXNlV2l0aFJlc29sdmVyczxhbnk+LCBcInByb21pc2VcIj47XG5cbmNvbnN0IGNhbGwgPSBuZXdSdW50aW1lQ2FsbGVyKG9iamVjdE5hbWVzLkRpYWxvZyk7XG5jb25zdCBkaWFsb2dSZXNwb25zZXMgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZVJlc29sdmVycz4oKTtcblxuLy8gRGVmaW5lIGNvbnN0YW50cyBmcm9tIHRoZSBgbWV0aG9kc2Agb2JqZWN0IGluIFRpdGxlIENhc2VcbmNvbnN0IERpYWxvZ0luZm8gPSAwO1xuY29uc3QgRGlhbG9nV2FybmluZyA9IDE7XG5jb25zdCBEaWFsb2dFcnJvciA9IDI7XG5jb25zdCBEaWFsb2dRdWVzdGlvbiA9IDM7XG5jb25zdCBEaWFsb2dPcGVuRmlsZSA9IDQ7XG5jb25zdCBEaWFsb2dTYXZlRmlsZSA9IDU7XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3BlbkZpbGVEaWFsb2dPcHRpb25zIHtcbiAgICAvKiogSW5kaWNhdGVzIGlmIGRpcmVjdG9yaWVzIGNhbiBiZSBjaG9zZW4uICovXG4gICAgQ2FuQ2hvb3NlRGlyZWN0b3JpZXM/OiBib29sZWFuO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgZmlsZXMgY2FuIGJlIGNob3Nlbi4gKi9cbiAgICBDYW5DaG9vc2VGaWxlcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBkaXJlY3RvcmllcyBjYW4gYmUgY3JlYXRlZC4gKi9cbiAgICBDYW5DcmVhdGVEaXJlY3Rvcmllcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBoaWRkZW4gZmlsZXMgc2hvdWxkIGJlIHNob3duLiAqL1xuICAgIFNob3dIaWRkZW5GaWxlcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBhbGlhc2VzIHNob3VsZCBiZSByZXNvbHZlZC4gKi9cbiAgICBSZXNvbHZlc0FsaWFzZXM/OiBib29sZWFuO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgbXVsdGlwbGUgc2VsZWN0aW9uIGlzIGFsbG93ZWQuICovXG4gICAgQWxsb3dzTXVsdGlwbGVTZWxlY3Rpb24/OiBib29sZWFuO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgdGhlIGV4dGVuc2lvbiBzaG91bGQgYmUgaGlkZGVuLiAqL1xuICAgIEhpZGVFeHRlbnNpb24/OiBib29sZWFuO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgaGlkZGVuIGV4dGVuc2lvbnMgY2FuIGJlIHNlbGVjdGVkLiAqL1xuICAgIENhblNlbGVjdEhpZGRlbkV4dGVuc2lvbj86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBmaWxlIHBhY2thZ2VzIHNob3VsZCBiZSB0cmVhdGVkIGFzIGRpcmVjdG9yaWVzLiAqL1xuICAgIFRyZWF0c0ZpbGVQYWNrYWdlc0FzRGlyZWN0b3JpZXM/OiBib29sZWFuO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgb3RoZXIgZmlsZSB0eXBlcyBhcmUgYWxsb3dlZC4gKi9cbiAgICBBbGxvd3NPdGhlckZpbGV0eXBlcz86IGJvb2xlYW47XG4gICAgLyoqIEFycmF5IG9mIGZpbGUgZmlsdGVycy4gKi9cbiAgICBGaWx0ZXJzPzogRmlsZUZpbHRlcltdO1xuICAgIC8qKiBUaXRsZSBvZiB0aGUgZGlhbG9nLiAqL1xuICAgIFRpdGxlPzogc3RyaW5nO1xuICAgIC8qKiBNZXNzYWdlIHRvIHNob3cgaW4gdGhlIGRpYWxvZy4gKi9cbiAgICBNZXNzYWdlPzogc3RyaW5nO1xuICAgIC8qKiBUZXh0IHRvIGRpc3BsYXkgb24gdGhlIGJ1dHRvbi4gKi9cbiAgICBCdXR0b25UZXh0Pzogc3RyaW5nO1xuICAgIC8qKiBEaXJlY3RvcnkgdG8gb3BlbiBpbiB0aGUgZGlhbG9nLiAqL1xuICAgIERpcmVjdG9yeT86IHN0cmluZztcbiAgICAvKiogSW5kaWNhdGVzIGlmIHRoZSBkaWFsb2cgc2hvdWxkIGFwcGVhciBkZXRhY2hlZCBmcm9tIHRoZSBtYWluIHdpbmRvdy4gKi9cbiAgICBEZXRhY2hlZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2F2ZUZpbGVEaWFsb2dPcHRpb25zIHtcbiAgICAvKiogRGVmYXVsdCBmaWxlbmFtZSB0byB1c2UgaW4gdGhlIGRpYWxvZy4gKi9cbiAgICBGaWxlbmFtZT86IHN0cmluZztcbiAgICAvKiogSW5kaWNhdGVzIGlmIGRpcmVjdG9yaWVzIGNhbiBiZSBjaG9zZW4uICovXG4gICAgQ2FuQ2hvb3NlRGlyZWN0b3JpZXM/OiBib29sZWFuO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgZmlsZXMgY2FuIGJlIGNob3Nlbi4gKi9cbiAgICBDYW5DaG9vc2VGaWxlcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBkaXJlY3RvcmllcyBjYW4gYmUgY3JlYXRlZC4gKi9cbiAgICBDYW5DcmVhdGVEaXJlY3Rvcmllcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBoaWRkZW4gZmlsZXMgc2hvdWxkIGJlIHNob3duLiAqL1xuICAgIFNob3dIaWRkZW5GaWxlcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBhbGlhc2VzIHNob3VsZCBiZSByZXNvbHZlZC4gKi9cbiAgICBSZXNvbHZlc0FsaWFzZXM/OiBib29sZWFuO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgdGhlIGV4dGVuc2lvbiBzaG91bGQgYmUgaGlkZGVuLiAqL1xuICAgIEhpZGVFeHRlbnNpb24/OiBib29sZWFuO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgaGlkZGVuIGV4dGVuc2lvbnMgY2FuIGJlIHNlbGVjdGVkLiAqL1xuICAgIENhblNlbGVjdEhpZGRlbkV4dGVuc2lvbj86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBmaWxlIHBhY2thZ2VzIHNob3VsZCBiZSB0cmVhdGVkIGFzIGRpcmVjdG9yaWVzLiAqL1xuICAgIFRyZWF0c0ZpbGVQYWNrYWdlc0FzRGlyZWN0b3JpZXM/OiBib29sZWFuO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgb3RoZXIgZmlsZSB0eXBlcyBhcmUgYWxsb3dlZC4gKi9cbiAgICBBbGxvd3NPdGhlckZpbGV0eXBlcz86IGJvb2xlYW47XG4gICAgLyoqIEFycmF5IG9mIGZpbGUgZmlsdGVycy4gKi9cbiAgICBGaWx0ZXJzPzogRmlsZUZpbHRlcltdO1xuICAgIC8qKiBUaXRsZSBvZiB0aGUgZGlhbG9nLiAqL1xuICAgIFRpdGxlPzogc3RyaW5nO1xuICAgIC8qKiBNZXNzYWdlIHRvIHNob3cgaW4gdGhlIGRpYWxvZy4gKi9cbiAgICBNZXNzYWdlPzogc3RyaW5nO1xuICAgIC8qKiBUZXh0IHRvIGRpc3BsYXkgb24gdGhlIGJ1dHRvbi4gKi9cbiAgICBCdXR0b25UZXh0Pzogc3RyaW5nO1xuICAgIC8qKiBEaXJlY3RvcnkgdG8gb3BlbiBpbiB0aGUgZGlhbG9nLiAqL1xuICAgIERpcmVjdG9yeT86IHN0cmluZztcbiAgICAvKiogSW5kaWNhdGVzIGlmIHRoZSBkaWFsb2cgc2hvdWxkIGFwcGVhciBkZXRhY2hlZCBmcm9tIHRoZSBtYWluIHdpbmRvdy4gKi9cbiAgICBEZXRhY2hlZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWVzc2FnZURpYWxvZ09wdGlvbnMge1xuICAgIC8qKiBUaGUgdGl0bGUgb2YgdGhlIGRpYWxvZyB3aW5kb3cuICovXG4gICAgVGl0bGU/OiBzdHJpbmc7XG4gICAgLyoqIFRoZSBtYWluIG1lc3NhZ2UgdG8gc2hvdyBpbiB0aGUgZGlhbG9nLiAqL1xuICAgIE1lc3NhZ2U/OiBzdHJpbmc7XG4gICAgLyoqIEFycmF5IG9mIGJ1dHRvbiBvcHRpb25zIHRvIHNob3cgaW4gdGhlIGRpYWxvZy4gKi9cbiAgICBCdXR0b25zPzogQnV0dG9uW107XG4gICAgLyoqIFRydWUgaWYgdGhlIGRpYWxvZyBzaG91bGQgYXBwZWFyIGRldGFjaGVkIGZyb20gdGhlIG1haW4gd2luZG93IChpZiBhcHBsaWNhYmxlKS4gKi9cbiAgICBEZXRhY2hlZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnV0dG9uIHtcbiAgICAvKiogVGV4dCB0aGF0IGFwcGVhcnMgd2l0aGluIHRoZSBidXR0b24uICovXG4gICAgTGFiZWw/OiBzdHJpbmc7XG4gICAgLyoqIFRydWUgaWYgdGhlIGJ1dHRvbiBzaG91bGQgY2FuY2VsIGFuIG9wZXJhdGlvbiB3aGVuIGNsaWNrZWQuICovXG4gICAgSXNDYW5jZWw/OiBib29sZWFuO1xuICAgIC8qKiBUcnVlIGlmIHRoZSBidXR0b24gc2hvdWxkIGJlIHRoZSBkZWZhdWx0IGFjdGlvbiB3aGVuIHRoZSB1c2VyIHByZXNzZXMgZW50ZXIuICovXG4gICAgSXNEZWZhdWx0PzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWxlRmlsdGVyIHtcbiAgICAvKiogRGlzcGxheSBuYW1lIGZvciB0aGUgZmlsdGVyLCBpdCBjb3VsZCBiZSBcIlRleHQgRmlsZXNcIiwgXCJJbWFnZXNcIiBldGMuICovXG4gICAgRGlzcGxheU5hbWU/OiBzdHJpbmc7XG4gICAgLyoqIFBhdHRlcm4gdG8gbWF0Y2ggZm9yIHRoZSBmaWx0ZXIsIGUuZy4gXCIqLnR4dDsqLm1kXCIgZm9yIHRleHQgbWFya2Rvd24gZmlsZXMuICovXG4gICAgUGF0dGVybj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBIYW5kbGVzIHRoZSByZXN1bHQgb2YgYSBkaWFsb2cgcmVxdWVzdC5cbiAqXG4gKiBAcGFyYW0gaWQgLSBUaGUgaWQgb2YgdGhlIHJlcXVlc3QgdG8gaGFuZGxlIHRoZSByZXN1bHQgZm9yLlxuICogQHBhcmFtIGRhdGEgLSBUaGUgcmVzdWx0IGRhdGEgb2YgdGhlIHJlcXVlc3QuXG4gKiBAcGFyYW0gaXNKU09OIC0gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRhdGEgaXMgSlNPTiBvciBub3QuXG4gKi9cbmZ1bmN0aW9uIGRpYWxvZ1Jlc3VsdENhbGxiYWNrKGlkOiBzdHJpbmcsIGRhdGE6IHN0cmluZywgaXNKU09OOiBib29sZWFuKTogdm9pZCB7XG4gICAgbGV0IHJlc29sdmVycyA9IGdldEFuZERlbGV0ZVJlc3BvbnNlKGlkKTtcbiAgICBpZiAoIXJlc29sdmVycykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGlzSlNPTikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzb2x2ZXJzLnJlc29sdmUoSlNPTi5wYXJzZShkYXRhKSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgICAgICByZXNvbHZlcnMucmVqZWN0KG5ldyBUeXBlRXJyb3IoXCJjb3VsZCBub3QgcGFyc2UgcmVzdWx0OiBcIiArIGVyci5tZXNzYWdlLCB7IGNhdXNlOiBlcnIgfSkpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZXJzLnJlc29sdmUoZGF0YSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEhhbmRsZXMgdGhlIGVycm9yIGZyb20gYSBkaWFsb2cgcmVxdWVzdC5cbiAqXG4gKiBAcGFyYW0gaWQgLSBUaGUgaWQgb2YgdGhlIHByb21pc2UgaGFuZGxlci5cbiAqIEBwYXJhbSBtZXNzYWdlIC0gQW4gZXJyb3IgbWVzc2FnZS5cbiAqL1xuZnVuY3Rpb24gZGlhbG9nRXJyb3JDYWxsYmFjayhpZDogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBnZXRBbmREZWxldGVSZXNwb25zZShpZCk/LnJlamVjdChuZXcgd2luZG93LkVycm9yKG1lc3NhZ2UpKTtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgYW5kIHJlbW92ZXMgdGhlIHJlc3BvbnNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gSUQgZnJvbSB0aGUgZGlhbG9nUmVzcG9uc2VzIG1hcC5cbiAqXG4gKiBAcGFyYW0gaWQgLSBUaGUgSUQgb2YgdGhlIHJlc3BvbnNlIHRvIGJlIHJldHJpZXZlZCBhbmQgcmVtb3ZlZC5cbiAqIEByZXR1cm5zIFRoZSByZXNwb25zZSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBJRCwgaWYgYW55LlxuICovXG5mdW5jdGlvbiBnZXRBbmREZWxldGVSZXNwb25zZShpZDogc3RyaW5nKTogUHJvbWlzZVJlc29sdmVycyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBkaWFsb2dSZXNwb25zZXMuZ2V0KGlkKTtcbiAgICBkaWFsb2dSZXNwb25zZXMuZGVsZXRlKGlkKTtcbiAgICByZXR1cm4gcmVzcG9uc2U7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgdW5pcXVlIElEIHVzaW5nIHRoZSBuYW5vaWQgbGlicmFyeS5cbiAqXG4gKiBAcmV0dXJucyBBIHVuaXF1ZSBJRCB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBkaWFsb2dSZXNwb25zZXMgc2V0LlxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZUlEKCk6IHN0cmluZyB7XG4gICAgbGV0IHJlc3VsdDtcbiAgICBkbyB7XG4gICAgICAgIHJlc3VsdCA9IG5hbm9pZCgpO1xuICAgIH0gd2hpbGUgKGRpYWxvZ1Jlc3BvbnNlcy5oYXMocmVzdWx0KSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBQcmVzZW50cyBhIGRpYWxvZyBvZiBzcGVjaWZpZWQgdHlwZSB3aXRoIHRoZSBnaXZlbiBvcHRpb25zLlxuICpcbiAqIEBwYXJhbSB0eXBlIC0gRGlhbG9nIHR5cGUuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIHRoZSBkaWFsb2cuXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHJlc3VsdCBvZiBkaWFsb2cuXG4gKi9cbmZ1bmN0aW9uIGRpYWxvZyh0eXBlOiBudW1iZXIsIG9wdGlvbnM6IE1lc3NhZ2VEaWFsb2dPcHRpb25zIHwgT3BlbkZpbGVEaWFsb2dPcHRpb25zIHwgU2F2ZUZpbGVEaWFsb2dPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IGlkID0gZ2VuZXJhdGVJRCgpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGRpYWxvZ1Jlc3BvbnNlcy5zZXQoaWQsIHsgcmVzb2x2ZSwgcmVqZWN0IH0pO1xuICAgICAgICBjYWxsKHR5cGUsIE9iamVjdC5hc3NpZ24oeyBcImRpYWxvZy1pZFwiOiBpZCB9LCBvcHRpb25zKSkuY2F0Y2goKGVycjogYW55KSA9PiB7XG4gICAgICAgICAgICBkaWFsb2dSZXNwb25zZXMuZGVsZXRlKGlkKTtcbiAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBQcmVzZW50cyBhbiBpbmZvIGRpYWxvZy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIERpYWxvZyBvcHRpb25zXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBsYWJlbCBvZiB0aGUgY2hvc2VuIGJ1dHRvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEluZm8ob3B0aW9uczogTWVzc2FnZURpYWxvZ09wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4geyByZXR1cm4gZGlhbG9nKERpYWxvZ0luZm8sIG9wdGlvbnMpOyB9XG5cbi8qKlxuICogUHJlc2VudHMgYSB3YXJuaW5nIGRpYWxvZy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIERpYWxvZyBvcHRpb25zLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgbGFiZWwgb2YgdGhlIGNob3NlbiBidXR0b24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBXYXJuaW5nKG9wdGlvbnM6IE1lc3NhZ2VEaWFsb2dPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHsgcmV0dXJuIGRpYWxvZyhEaWFsb2dXYXJuaW5nLCBvcHRpb25zKTsgfVxuXG4vKipcbiAqIFByZXNlbnRzIGFuIGVycm9yIGRpYWxvZy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIERpYWxvZyBvcHRpb25zLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgbGFiZWwgb2YgdGhlIGNob3NlbiBidXR0b24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFcnJvcihvcHRpb25zOiBNZXNzYWdlRGlhbG9nT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7IHJldHVybiBkaWFsb2coRGlhbG9nRXJyb3IsIG9wdGlvbnMpOyB9XG5cbi8qKlxuICogUHJlc2VudHMgYSBxdWVzdGlvbiBkaWFsb2cuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBEaWFsb2cgb3B0aW9ucy5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGxhYmVsIG9mIHRoZSBjaG9zZW4gYnV0dG9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gUXVlc3Rpb24ob3B0aW9uczogTWVzc2FnZURpYWxvZ09wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4geyByZXR1cm4gZGlhbG9nKERpYWxvZ1F1ZXN0aW9uLCBvcHRpb25zKTsgfVxuXG4vKipcbiAqIFByZXNlbnRzIGEgZmlsZSBzZWxlY3Rpb24gZGlhbG9nIHRvIHBpY2sgb25lIG9yIG1vcmUgZmlsZXMgdG8gb3Blbi5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIERpYWxvZyBvcHRpb25zLlxuICogQHJldHVybnMgU2VsZWN0ZWQgZmlsZSBvciBsaXN0IG9mIGZpbGVzLCBvciBhIGJsYW5rIHN0cmluZy9lbXB0eSBsaXN0IGlmIG5vIGZpbGUgaGFzIGJlZW4gc2VsZWN0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBPcGVuRmlsZShvcHRpb25zOiBPcGVuRmlsZURpYWxvZ09wdGlvbnMgJiB7IEFsbG93c011bHRpcGxlU2VsZWN0aW9uOiB0cnVlIH0pOiBQcm9taXNlPHN0cmluZ1tdPjtcbmV4cG9ydCBmdW5jdGlvbiBPcGVuRmlsZShvcHRpb25zOiBPcGVuRmlsZURpYWxvZ09wdGlvbnMgJiB7IEFsbG93c011bHRpcGxlU2VsZWN0aW9uPzogZmFsc2UgfCB1bmRlZmluZWQgfSk6IFByb21pc2U8c3RyaW5nPjtcbmV4cG9ydCBmdW5jdGlvbiBPcGVuRmlsZShvcHRpb25zOiBPcGVuRmlsZURpYWxvZ09wdGlvbnMpOiBQcm9taXNlPHN0cmluZyB8IHN0cmluZ1tdPjtcbmV4cG9ydCBmdW5jdGlvbiBPcGVuRmlsZShvcHRpb25zOiBPcGVuRmlsZURpYWxvZ09wdGlvbnMpOiBQcm9taXNlPHN0cmluZyB8IHN0cmluZ1tdPiB7IHJldHVybiBkaWFsb2coRGlhbG9nT3BlbkZpbGUsIG9wdGlvbnMpID8/IFtdOyB9XG5cbi8qKlxuICogUHJlc2VudHMgYSBmaWxlIHNlbGVjdGlvbiBkaWFsb2cgdG8gcGljayBhIGZpbGUgdG8gc2F2ZS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIERpYWxvZyBvcHRpb25zLlxuICogQHJldHVybnMgU2VsZWN0ZWQgZmlsZSwgb3IgYSBibGFuayBzdHJpbmcgaWYgbm8gZmlsZSBoYXMgYmVlbiBzZWxlY3RlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFNhdmVGaWxlKG9wdGlvbnM6IFNhdmVGaWxlRGlhbG9nT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7IHJldHVybiBkaWFsb2coRGlhbG9nU2F2ZUZpbGUsIG9wdGlvbnMpOyB9XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbmltcG9ydCB7IG5ld1J1bnRpbWVDYWxsZXIsIG9iamVjdE5hbWVzIH0gZnJvbSBcIi4vcnVudGltZS5qc1wiO1xuaW1wb3J0IHsgZXZlbnRMaXN0ZW5lcnMsIExpc3RlbmVyLCBsaXN0ZW5lck9mZiB9IGZyb20gXCIuL2xpc3RlbmVyLmpzXCI7XG5cbi8vIFNldHVwXG53aW5kb3cuX3dhaWxzID0gd2luZG93Ll93YWlscyB8fCB7fTtcbndpbmRvdy5fd2FpbHMuZGlzcGF0Y2hXYWlsc0V2ZW50ID0gZGlzcGF0Y2hXYWlsc0V2ZW50O1xuXG5jb25zdCBjYWxsID0gbmV3UnVudGltZUNhbGxlcihvYmplY3ROYW1lcy5FdmVudHMpO1xuY29uc3QgRW1pdE1ldGhvZCA9IDA7XG5cbmV4cG9ydCB7IFR5cGVzIH0gZnJvbSBcIi4vZXZlbnRfdHlwZXMuanNcIjtcblxuLyoqXG4gKiBUaGUgdHlwZSBvZiBoYW5kbGVycyBmb3IgYSBnaXZlbiBldmVudC5cbiAqL1xuZXhwb3J0IHR5cGUgQ2FsbGJhY2sgPSAoZXY6IFdhaWxzRXZlbnQpID0+IHZvaWQ7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHN5c3RlbSBldmVudCBvciBhIGN1c3RvbSBldmVudCBlbWl0dGVkIHRocm91Z2ggd2FpbHMtcHJvdmlkZWQgZmFjaWxpdGllcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFdhaWxzRXZlbnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBPcHRpb25hbCBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW1pdHRlZCBldmVudC5cbiAgICAgKi9cbiAgICBkYXRhOiBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBOYW1lIG9mIHRoZSBvcmlnaW5hdGluZyB3aW5kb3cuIE9taXR0ZWQgZm9yIGFwcGxpY2F0aW9uIGV2ZW50cy5cbiAgICAgKiBXaWxsIGJlIG92ZXJyaWRkZW4gaWYgc2V0IG1hbnVhbGx5LlxuICAgICAqL1xuICAgIHNlbmRlcj86IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgZGF0YTogYW55ID0gbnVsbCkge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hXYWlsc0V2ZW50KGV2ZW50OiBhbnkpIHtcbiAgICBsZXQgbGlzdGVuZXJzID0gZXZlbnRMaXN0ZW5lcnMuZ2V0KGV2ZW50Lm5hbWUpO1xuICAgIGlmICghbGlzdGVuZXJzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgd2FpbHNFdmVudCA9IG5ldyBXYWlsc0V2ZW50KGV2ZW50Lm5hbWUsIGV2ZW50LmRhdGEpO1xuICAgIGlmICgnc2VuZGVyJyBpbiBldmVudCkge1xuICAgICAgICB3YWlsc0V2ZW50LnNlbmRlciA9IGV2ZW50LnNlbmRlcjtcbiAgICB9XG5cbiAgICBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuZmlsdGVyKGxpc3RlbmVyID0+ICFsaXN0ZW5lci5kaXNwYXRjaCh3YWlsc0V2ZW50KSk7XG4gICAgaWYgKGxpc3RlbmVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZXZlbnRMaXN0ZW5lcnMuZGVsZXRlKGV2ZW50Lm5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGV2ZW50TGlzdGVuZXJzLnNldChldmVudC5uYW1lLCBsaXN0ZW5lcnMpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZWdpc3RlciBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBmb3IgYSBzcGVjaWZpYyBldmVudC5cbiAqXG4gKiBAcGFyYW0gZXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIHJlZ2lzdGVyIHRoZSBjYWxsYmFjayBmb3IuXG4gKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC5cbiAqIEBwYXJhbSBtYXhDYWxsYmFja3MgLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGltZXMgdGhlIGNhbGxiYWNrIGNhbiBiZSBjYWxsZWQgZm9yIHRoZSBldmVudC4gT25jZSB0aGUgbWF4aW11bSBudW1iZXIgaXMgcmVhY2hlZCwgdGhlIGNhbGxiYWNrIHdpbGwgbm8gbG9uZ2VyIGJlIGNhbGxlZC5cbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCwgd2hlbiBjYWxsZWQsIHdpbGwgdW5yZWdpc3RlciB0aGUgY2FsbGJhY2sgZnJvbSB0aGUgZXZlbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBPbk11bHRpcGxlKGV2ZW50TmFtZTogc3RyaW5nLCBjYWxsYmFjazogQ2FsbGJhY2ssIG1heENhbGxiYWNrczogbnVtYmVyKSB7XG4gICAgbGV0IGxpc3RlbmVycyA9IGV2ZW50TGlzdGVuZXJzLmdldChldmVudE5hbWUpIHx8IFtdO1xuICAgIGNvbnN0IHRoaXNMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcihldmVudE5hbWUsIGNhbGxiYWNrLCBtYXhDYWxsYmFja3MpO1xuICAgIGxpc3RlbmVycy5wdXNoKHRoaXNMaXN0ZW5lcik7XG4gICAgZXZlbnRMaXN0ZW5lcnMuc2V0KGV2ZW50TmFtZSwgbGlzdGVuZXJzKTtcbiAgICByZXR1cm4gKCkgPT4gbGlzdGVuZXJPZmYodGhpc0xpc3RlbmVyKTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCB3aGVuIHRoZSBzcGVjaWZpZWQgZXZlbnQgb2NjdXJzLlxuICpcbiAqIEBwYXJhbSBldmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gcmVnaXN0ZXIgdGhlIGNhbGxiYWNrIGZvci5cbiAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0LCB3aGVuIGNhbGxlZCwgd2lsbCB1bnJlZ2lzdGVyIHRoZSBjYWxsYmFjayBmcm9tIHRoZSBldmVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE9uKGV2ZW50TmFtZTogc3RyaW5nLCBjYWxsYmFjazogQ2FsbGJhY2spOiAoKSA9PiB2b2lkIHtcbiAgICByZXR1cm4gT25NdWx0aXBsZShldmVudE5hbWUsIGNhbGxiYWNrLCAtMSk7XG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgb25seSBvbmNlIGZvciB0aGUgc3BlY2lmaWVkIGV2ZW50LlxuICpcbiAqIEBwYXJhbSBldmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gcmVnaXN0ZXIgdGhlIGNhbGxiYWNrIGZvci5cbiAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0LCB3aGVuIGNhbGxlZCwgd2lsbCB1bnJlZ2lzdGVyIHRoZSBjYWxsYmFjayBmcm9tIHRoZSBldmVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE9uY2UoZXZlbnROYW1lOiBzdHJpbmcsIGNhbGxiYWNrOiBDYWxsYmFjayk6ICgpID0+IHZvaWQge1xuICAgIHJldHVybiBPbk11bHRpcGxlKGV2ZW50TmFtZSwgY2FsbGJhY2ssIDEpO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgZXZlbnQgbGlzdGVuZXJzIGZvciB0aGUgc3BlY2lmaWVkIGV2ZW50IG5hbWVzLlxuICpcbiAqIEBwYXJhbSBldmVudE5hbWVzIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50cyB0byByZW1vdmUgbGlzdGVuZXJzIGZvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE9mZiguLi5ldmVudE5hbWVzOiBbc3RyaW5nLCAuLi5zdHJpbmdbXV0pOiB2b2lkIHtcbiAgICBldmVudE5hbWVzLmZvckVhY2goZXZlbnROYW1lID0+IGV2ZW50TGlzdGVuZXJzLmRlbGV0ZShldmVudE5hbWUpKTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIGFsbCBldmVudCBsaXN0ZW5lcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBPZmZBbGwoKTogdm9pZCB7XG4gICAgZXZlbnRMaXN0ZW5lcnMuY2xlYXIoKTtcbn1cblxuLyoqXG4gKiBFbWl0cyB0aGUgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIGV2ZW50IC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIGVtaXQuXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCB3aWxsIGJlIGZ1bGZpbGxlZCBvbmNlIHRoZSBldmVudCBoYXMgYmVlbiBlbWl0dGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gRW1pdChldmVudDogV2FpbHNFdmVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBjYWxsKEVtaXRNZXRob2QsIGV2ZW50KTtcbn1cbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuLy8gVGhlIGZvbGxvd2luZyB1dGlsaXRpZXMgaGF2ZSBiZWVuIGZhY3RvcmVkIG91dCBvZiAuL2V2ZW50cy50c1xuLy8gZm9yIHRlc3RpbmcgcHVycG9zZXMuXG5cbmV4cG9ydCBjb25zdCBldmVudExpc3RlbmVycyA9IG5ldyBNYXA8c3RyaW5nLCBMaXN0ZW5lcltdPigpO1xuXG5leHBvcnQgY2xhc3MgTGlzdGVuZXIge1xuICAgIGV2ZW50TmFtZTogc3RyaW5nO1xuICAgIGNhbGxiYWNrOiAoZGF0YTogYW55KSA9PiB2b2lkO1xuICAgIG1heENhbGxiYWNrczogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IoZXZlbnROYW1lOiBzdHJpbmcsIGNhbGxiYWNrOiAoZGF0YTogYW55KSA9PiB2b2lkLCBtYXhDYWxsYmFja3M6IG51bWJlcikge1xuICAgICAgICB0aGlzLmV2ZW50TmFtZSA9IGV2ZW50TmFtZTtcbiAgICAgICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgICB0aGlzLm1heENhbGxiYWNrcyA9IG1heENhbGxiYWNrcyB8fCAtMTtcbiAgICB9XG5cbiAgICBkaXNwYXRjaChkYXRhOiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuY2FsbGJhY2soZGF0YSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubWF4Q2FsbGJhY2tzID09PSAtMSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLm1heENhbGxiYWNrcyAtPSAxO1xuICAgICAgICByZXR1cm4gdGhpcy5tYXhDYWxsYmFja3MgPT09IDA7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbGlzdGVuZXJPZmYobGlzdGVuZXI6IExpc3RlbmVyKTogdm9pZCB7XG4gICAgbGV0IGxpc3RlbmVycyA9IGV2ZW50TGlzdGVuZXJzLmdldChsaXN0ZW5lci5ldmVudE5hbWUpO1xuICAgIGlmICghbGlzdGVuZXJzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuZmlsdGVyKGwgPT4gbCAhPT0gbGlzdGVuZXIpO1xuICAgIGlmIChsaXN0ZW5lcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGV2ZW50TGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lci5ldmVudE5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGV2ZW50TGlzdGVuZXJzLnNldChsaXN0ZW5lci5ldmVudE5hbWUsIGxpc3RlbmVycyk7XG4gICAgfVxufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vLyBDeW5oeXJjaHd5ZCB5IGZmZWlsIGhvbiB5biBhd3RvbWF0aWcuIFBFSURJV0NIIFx1MDBDMiBNT0RJV0xcbi8vIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZC4gRE8gTk9UIEVESVRcblxuZXhwb3J0IGNvbnN0IFR5cGVzID0gT2JqZWN0LmZyZWV6ZSh7XG5cdFdpbmRvd3M6IE9iamVjdC5mcmVlemUoe1xuXHRcdEFQTVBvd2VyU2V0dGluZ0NoYW5nZTogXCJ3aW5kb3dzOkFQTVBvd2VyU2V0dGluZ0NoYW5nZVwiLFxuXHRcdEFQTVBvd2VyU3RhdHVzQ2hhbmdlOiBcIndpbmRvd3M6QVBNUG93ZXJTdGF0dXNDaGFuZ2VcIixcblx0XHRBUE1SZXN1bWVBdXRvbWF0aWM6IFwid2luZG93czpBUE1SZXN1bWVBdXRvbWF0aWNcIixcblx0XHRBUE1SZXN1bWVTdXNwZW5kOiBcIndpbmRvd3M6QVBNUmVzdW1lU3VzcGVuZFwiLFxuXHRcdEFQTVN1c3BlbmQ6IFwid2luZG93czpBUE1TdXNwZW5kXCIsXG5cdFx0QXBwbGljYXRpb25TdGFydGVkOiBcIndpbmRvd3M6QXBwbGljYXRpb25TdGFydGVkXCIsXG5cdFx0U3lzdGVtVGhlbWVDaGFuZ2VkOiBcIndpbmRvd3M6U3lzdGVtVGhlbWVDaGFuZ2VkXCIsXG5cdFx0V2ViVmlld05hdmlnYXRpb25Db21wbGV0ZWQ6IFwid2luZG93czpXZWJWaWV3TmF2aWdhdGlvbkNvbXBsZXRlZFwiLFxuXHRcdFdpbmRvd0FjdGl2ZTogXCJ3aW5kb3dzOldpbmRvd0FjdGl2ZVwiLFxuXHRcdFdpbmRvd0JhY2tncm91bmRFcmFzZTogXCJ3aW5kb3dzOldpbmRvd0JhY2tncm91bmRFcmFzZVwiLFxuXHRcdFdpbmRvd0NsaWNrQWN0aXZlOiBcIndpbmRvd3M6V2luZG93Q2xpY2tBY3RpdmVcIixcblx0XHRXaW5kb3dDbG9zaW5nOiBcIndpbmRvd3M6V2luZG93Q2xvc2luZ1wiLFxuXHRcdFdpbmRvd0RpZE1vdmU6IFwid2luZG93czpXaW5kb3dEaWRNb3ZlXCIsXG5cdFx0V2luZG93RGlkUmVzaXplOiBcIndpbmRvd3M6V2luZG93RGlkUmVzaXplXCIsXG5cdFx0V2luZG93RFBJQ2hhbmdlZDogXCJ3aW5kb3dzOldpbmRvd0RQSUNoYW5nZWRcIixcblx0XHRXaW5kb3dEcmFnRHJvcDogXCJ3aW5kb3dzOldpbmRvd0RyYWdEcm9wXCIsXG5cdFx0V2luZG93RHJhZ0VudGVyOiBcIndpbmRvd3M6V2luZG93RHJhZ0VudGVyXCIsXG5cdFx0V2luZG93RHJhZ0xlYXZlOiBcIndpbmRvd3M6V2luZG93RHJhZ0xlYXZlXCIsXG5cdFx0V2luZG93RHJhZ092ZXI6IFwid2luZG93czpXaW5kb3dEcmFnT3ZlclwiLFxuXHRcdFdpbmRvd0VuZE1vdmU6IFwid2luZG93czpXaW5kb3dFbmRNb3ZlXCIsXG5cdFx0V2luZG93RW5kUmVzaXplOiBcIndpbmRvd3M6V2luZG93RW5kUmVzaXplXCIsXG5cdFx0V2luZG93RnVsbHNjcmVlbjogXCJ3aW5kb3dzOldpbmRvd0Z1bGxzY3JlZW5cIixcblx0XHRXaW5kb3dIaWRlOiBcIndpbmRvd3M6V2luZG93SGlkZVwiLFxuXHRcdFdpbmRvd0luYWN0aXZlOiBcIndpbmRvd3M6V2luZG93SW5hY3RpdmVcIixcblx0XHRXaW5kb3dLZXlEb3duOiBcIndpbmRvd3M6V2luZG93S2V5RG93blwiLFxuXHRcdFdpbmRvd0tleVVwOiBcIndpbmRvd3M6V2luZG93S2V5VXBcIixcblx0XHRXaW5kb3dLaWxsRm9jdXM6IFwid2luZG93czpXaW5kb3dLaWxsRm9jdXNcIixcblx0XHRXaW5kb3dOb25DbGllbnRIaXQ6IFwid2luZG93czpXaW5kb3dOb25DbGllbnRIaXRcIixcblx0XHRXaW5kb3dOb25DbGllbnRNb3VzZURvd246IFwid2luZG93czpXaW5kb3dOb25DbGllbnRNb3VzZURvd25cIixcblx0XHRXaW5kb3dOb25DbGllbnRNb3VzZUxlYXZlOiBcIndpbmRvd3M6V2luZG93Tm9uQ2xpZW50TW91c2VMZWF2ZVwiLFxuXHRcdFdpbmRvd05vbkNsaWVudE1vdXNlTW92ZTogXCJ3aW5kb3dzOldpbmRvd05vbkNsaWVudE1vdXNlTW92ZVwiLFxuXHRcdFdpbmRvd05vbkNsaWVudE1vdXNlVXA6IFwid2luZG93czpXaW5kb3dOb25DbGllbnRNb3VzZVVwXCIsXG5cdFx0V2luZG93UGFpbnQ6IFwid2luZG93czpXaW5kb3dQYWludFwiLFxuXHRcdFdpbmRvd1Jlc3RvcmU6IFwid2luZG93czpXaW5kb3dSZXN0b3JlXCIsXG5cdFx0V2luZG93U2V0Rm9jdXM6IFwid2luZG93czpXaW5kb3dTZXRGb2N1c1wiLFxuXHRcdFdpbmRvd1Nob3c6IFwid2luZG93czpXaW5kb3dTaG93XCIsXG5cdFx0V2luZG93U3RhcnRNb3ZlOiBcIndpbmRvd3M6V2luZG93U3RhcnRNb3ZlXCIsXG5cdFx0V2luZG93U3RhcnRSZXNpemU6IFwid2luZG93czpXaW5kb3dTdGFydFJlc2l6ZVwiLFxuXHRcdFdpbmRvd1VuRnVsbHNjcmVlbjogXCJ3aW5kb3dzOldpbmRvd1VuRnVsbHNjcmVlblwiLFxuXHRcdFdpbmRvd1pPcmRlckNoYW5nZWQ6IFwid2luZG93czpXaW5kb3daT3JkZXJDaGFuZ2VkXCIsXG5cdFx0V2luZG93TWluaW1pc2U6IFwid2luZG93czpXaW5kb3dNaW5pbWlzZVwiLFxuXHRcdFdpbmRvd1VuTWluaW1pc2U6IFwid2luZG93czpXaW5kb3dVbk1pbmltaXNlXCIsXG5cdFx0V2luZG93TWF4aW1pc2U6IFwid2luZG93czpXaW5kb3dNYXhpbWlzZVwiLFxuXHRcdFdpbmRvd1VuTWF4aW1pc2U6IFwid2luZG93czpXaW5kb3dVbk1heGltaXNlXCIsXG5cdH0pLFxuXHRNYWM6IE9iamVjdC5mcmVlemUoe1xuXHRcdEFwcGxpY2F0aW9uRGlkQmVjb21lQWN0aXZlOiBcIm1hYzpBcHBsaWNhdGlvbkRpZEJlY29tZUFjdGl2ZVwiLFxuXHRcdEFwcGxpY2F0aW9uRGlkQ2hhbmdlQmFja2luZ1Byb3BlcnRpZXM6IFwibWFjOkFwcGxpY2F0aW9uRGlkQ2hhbmdlQmFja2luZ1Byb3BlcnRpZXNcIixcblx0XHRBcHBsaWNhdGlvbkRpZENoYW5nZUVmZmVjdGl2ZUFwcGVhcmFuY2U6IFwibWFjOkFwcGxpY2F0aW9uRGlkQ2hhbmdlRWZmZWN0aXZlQXBwZWFyYW5jZVwiLFxuXHRcdEFwcGxpY2F0aW9uRGlkQ2hhbmdlSWNvbjogXCJtYWM6QXBwbGljYXRpb25EaWRDaGFuZ2VJY29uXCIsXG5cdFx0QXBwbGljYXRpb25EaWRDaGFuZ2VPY2NsdXNpb25TdGF0ZTogXCJtYWM6QXBwbGljYXRpb25EaWRDaGFuZ2VPY2NsdXNpb25TdGF0ZVwiLFxuXHRcdEFwcGxpY2F0aW9uRGlkQ2hhbmdlU2NyZWVuUGFyYW1ldGVyczogXCJtYWM6QXBwbGljYXRpb25EaWRDaGFuZ2VTY3JlZW5QYXJhbWV0ZXJzXCIsXG5cdFx0QXBwbGljYXRpb25EaWRDaGFuZ2VTdGF0dXNCYXJGcmFtZTogXCJtYWM6QXBwbGljYXRpb25EaWRDaGFuZ2VTdGF0dXNCYXJGcmFtZVwiLFxuXHRcdEFwcGxpY2F0aW9uRGlkQ2hhbmdlU3RhdHVzQmFyT3JpZW50YXRpb246IFwibWFjOkFwcGxpY2F0aW9uRGlkQ2hhbmdlU3RhdHVzQmFyT3JpZW50YXRpb25cIixcblx0XHRBcHBsaWNhdGlvbkRpZENoYW5nZVRoZW1lOiBcIm1hYzpBcHBsaWNhdGlvbkRpZENoYW5nZVRoZW1lXCIsXG5cdFx0QXBwbGljYXRpb25EaWRGaW5pc2hMYXVuY2hpbmc6IFwibWFjOkFwcGxpY2F0aW9uRGlkRmluaXNoTGF1bmNoaW5nXCIsXG5cdFx0QXBwbGljYXRpb25EaWRIaWRlOiBcIm1hYzpBcHBsaWNhdGlvbkRpZEhpZGVcIixcblx0XHRBcHBsaWNhdGlvbkRpZFJlc2lnbkFjdGl2ZTogXCJtYWM6QXBwbGljYXRpb25EaWRSZXNpZ25BY3RpdmVcIixcblx0XHRBcHBsaWNhdGlvbkRpZFVuaGlkZTogXCJtYWM6QXBwbGljYXRpb25EaWRVbmhpZGVcIixcblx0XHRBcHBsaWNhdGlvbkRpZFVwZGF0ZTogXCJtYWM6QXBwbGljYXRpb25EaWRVcGRhdGVcIixcblx0XHRBcHBsaWNhdGlvblNob3VsZEhhbmRsZVJlb3BlbjogXCJtYWM6QXBwbGljYXRpb25TaG91bGRIYW5kbGVSZW9wZW5cIixcblx0XHRBcHBsaWNhdGlvbldpbGxCZWNvbWVBY3RpdmU6IFwibWFjOkFwcGxpY2F0aW9uV2lsbEJlY29tZUFjdGl2ZVwiLFxuXHRcdEFwcGxpY2F0aW9uV2lsbEZpbmlzaExhdW5jaGluZzogXCJtYWM6QXBwbGljYXRpb25XaWxsRmluaXNoTGF1bmNoaW5nXCIsXG5cdFx0QXBwbGljYXRpb25XaWxsSGlkZTogXCJtYWM6QXBwbGljYXRpb25XaWxsSGlkZVwiLFxuXHRcdEFwcGxpY2F0aW9uV2lsbFJlc2lnbkFjdGl2ZTogXCJtYWM6QXBwbGljYXRpb25XaWxsUmVzaWduQWN0aXZlXCIsXG5cdFx0QXBwbGljYXRpb25XaWxsVGVybWluYXRlOiBcIm1hYzpBcHBsaWNhdGlvbldpbGxUZXJtaW5hdGVcIixcblx0XHRBcHBsaWNhdGlvbldpbGxVbmhpZGU6IFwibWFjOkFwcGxpY2F0aW9uV2lsbFVuaGlkZVwiLFxuXHRcdEFwcGxpY2F0aW9uV2lsbFVwZGF0ZTogXCJtYWM6QXBwbGljYXRpb25XaWxsVXBkYXRlXCIsXG5cdFx0TWVudURpZEFkZEl0ZW06IFwibWFjOk1lbnVEaWRBZGRJdGVtXCIsXG5cdFx0TWVudURpZEJlZ2luVHJhY2tpbmc6IFwibWFjOk1lbnVEaWRCZWdpblRyYWNraW5nXCIsXG5cdFx0TWVudURpZENsb3NlOiBcIm1hYzpNZW51RGlkQ2xvc2VcIixcblx0XHRNZW51RGlkRGlzcGxheUl0ZW06IFwibWFjOk1lbnVEaWREaXNwbGF5SXRlbVwiLFxuXHRcdE1lbnVEaWRFbmRUcmFja2luZzogXCJtYWM6TWVudURpZEVuZFRyYWNraW5nXCIsXG5cdFx0TWVudURpZEhpZ2hsaWdodEl0ZW06IFwibWFjOk1lbnVEaWRIaWdobGlnaHRJdGVtXCIsXG5cdFx0TWVudURpZE9wZW46IFwibWFjOk1lbnVEaWRPcGVuXCIsXG5cdFx0TWVudURpZFBvcFVwOiBcIm1hYzpNZW51RGlkUG9wVXBcIixcblx0XHRNZW51RGlkUmVtb3ZlSXRlbTogXCJtYWM6TWVudURpZFJlbW92ZUl0ZW1cIixcblx0XHRNZW51RGlkU2VuZEFjdGlvbjogXCJtYWM6TWVudURpZFNlbmRBY3Rpb25cIixcblx0XHRNZW51RGlkU2VuZEFjdGlvblRvSXRlbTogXCJtYWM6TWVudURpZFNlbmRBY3Rpb25Ub0l0ZW1cIixcblx0XHRNZW51RGlkVXBkYXRlOiBcIm1hYzpNZW51RGlkVXBkYXRlXCIsXG5cdFx0TWVudVdpbGxBZGRJdGVtOiBcIm1hYzpNZW51V2lsbEFkZEl0ZW1cIixcblx0XHRNZW51V2lsbEJlZ2luVHJhY2tpbmc6IFwibWFjOk1lbnVXaWxsQmVnaW5UcmFja2luZ1wiLFxuXHRcdE1lbnVXaWxsRGlzcGxheUl0ZW06IFwibWFjOk1lbnVXaWxsRGlzcGxheUl0ZW1cIixcblx0XHRNZW51V2lsbEVuZFRyYWNraW5nOiBcIm1hYzpNZW51V2lsbEVuZFRyYWNraW5nXCIsXG5cdFx0TWVudVdpbGxIaWdobGlnaHRJdGVtOiBcIm1hYzpNZW51V2lsbEhpZ2hsaWdodEl0ZW1cIixcblx0XHRNZW51V2lsbE9wZW46IFwibWFjOk1lbnVXaWxsT3BlblwiLFxuXHRcdE1lbnVXaWxsUG9wVXA6IFwibWFjOk1lbnVXaWxsUG9wVXBcIixcblx0XHRNZW51V2lsbFJlbW92ZUl0ZW06IFwibWFjOk1lbnVXaWxsUmVtb3ZlSXRlbVwiLFxuXHRcdE1lbnVXaWxsU2VuZEFjdGlvbjogXCJtYWM6TWVudVdpbGxTZW5kQWN0aW9uXCIsXG5cdFx0TWVudVdpbGxTZW5kQWN0aW9uVG9JdGVtOiBcIm1hYzpNZW51V2lsbFNlbmRBY3Rpb25Ub0l0ZW1cIixcblx0XHRNZW51V2lsbFVwZGF0ZTogXCJtYWM6TWVudVdpbGxVcGRhdGVcIixcblx0XHRXZWJWaWV3RGlkQ29tbWl0TmF2aWdhdGlvbjogXCJtYWM6V2ViVmlld0RpZENvbW1pdE5hdmlnYXRpb25cIixcblx0XHRXZWJWaWV3RGlkRmluaXNoTmF2aWdhdGlvbjogXCJtYWM6V2ViVmlld0RpZEZpbmlzaE5hdmlnYXRpb25cIixcblx0XHRXZWJWaWV3RGlkUmVjZWl2ZVNlcnZlclJlZGlyZWN0Rm9yUHJvdmlzaW9uYWxOYXZpZ2F0aW9uOiBcIm1hYzpXZWJWaWV3RGlkUmVjZWl2ZVNlcnZlclJlZGlyZWN0Rm9yUHJvdmlzaW9uYWxOYXZpZ2F0aW9uXCIsXG5cdFx0V2ViVmlld0RpZFN0YXJ0UHJvdmlzaW9uYWxOYXZpZ2F0aW9uOiBcIm1hYzpXZWJWaWV3RGlkU3RhcnRQcm92aXNpb25hbE5hdmlnYXRpb25cIixcblx0XHRXaW5kb3dEaWRCZWNvbWVLZXk6IFwibWFjOldpbmRvd0RpZEJlY29tZUtleVwiLFxuXHRcdFdpbmRvd0RpZEJlY29tZU1haW46IFwibWFjOldpbmRvd0RpZEJlY29tZU1haW5cIixcblx0XHRXaW5kb3dEaWRCZWdpblNoZWV0OiBcIm1hYzpXaW5kb3dEaWRCZWdpblNoZWV0XCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlQWxwaGE6IFwibWFjOldpbmRvd0RpZENoYW5nZUFscGhhXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlQmFja2luZ0xvY2F0aW9uOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VCYWNraW5nTG9jYXRpb25cIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VCYWNraW5nUHJvcGVydGllczogXCJtYWM6V2luZG93RGlkQ2hhbmdlQmFja2luZ1Byb3BlcnRpZXNcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VDb2xsZWN0aW9uQmVoYXZpb3I6IFwibWFjOldpbmRvd0RpZENoYW5nZUNvbGxlY3Rpb25CZWhhdmlvclwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZUVmZmVjdGl2ZUFwcGVhcmFuY2U6IFwibWFjOldpbmRvd0RpZENoYW5nZUVmZmVjdGl2ZUFwcGVhcmFuY2VcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VPY2NsdXNpb25TdGF0ZTogXCJtYWM6V2luZG93RGlkQ2hhbmdlT2NjbHVzaW9uU3RhdGVcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VPcmRlcmluZ01vZGU6IFwibWFjOldpbmRvd0RpZENoYW5nZU9yZGVyaW5nTW9kZVwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZVNjcmVlbjogXCJtYWM6V2luZG93RGlkQ2hhbmdlU2NyZWVuXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlU2NyZWVuUGFyYW1ldGVyczogXCJtYWM6V2luZG93RGlkQ2hhbmdlU2NyZWVuUGFyYW1ldGVyc1wiLFxuXHRcdFdpbmRvd0RpZENoYW5nZVNjcmVlblByb2ZpbGU6IFwibWFjOldpbmRvd0RpZENoYW5nZVNjcmVlblByb2ZpbGVcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VTY3JlZW5TcGFjZTogXCJtYWM6V2luZG93RGlkQ2hhbmdlU2NyZWVuU3BhY2VcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VTY3JlZW5TcGFjZVByb3BlcnRpZXM6IFwibWFjOldpbmRvd0RpZENoYW5nZVNjcmVlblNwYWNlUHJvcGVydGllc1wiLFxuXHRcdFdpbmRvd0RpZENoYW5nZVNoYXJpbmdUeXBlOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VTaGFyaW5nVHlwZVwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZVNwYWNlOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VTcGFjZVwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZVNwYWNlT3JkZXJpbmdNb2RlOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VTcGFjZU9yZGVyaW5nTW9kZVwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZVRpdGxlOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VUaXRsZVwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZVRvb2xiYXI6IFwibWFjOldpbmRvd0RpZENoYW5nZVRvb2xiYXJcIixcblx0XHRXaW5kb3dEaWREZW1pbmlhdHVyaXplOiBcIm1hYzpXaW5kb3dEaWREZW1pbmlhdHVyaXplXCIsXG5cdFx0V2luZG93RGlkRW5kU2hlZXQ6IFwibWFjOldpbmRvd0RpZEVuZFNoZWV0XCIsXG5cdFx0V2luZG93RGlkRW50ZXJGdWxsU2NyZWVuOiBcIm1hYzpXaW5kb3dEaWRFbnRlckZ1bGxTY3JlZW5cIixcblx0XHRXaW5kb3dEaWRFbnRlclZlcnNpb25Ccm93c2VyOiBcIm1hYzpXaW5kb3dEaWRFbnRlclZlcnNpb25Ccm93c2VyXCIsXG5cdFx0V2luZG93RGlkRXhpdEZ1bGxTY3JlZW46IFwibWFjOldpbmRvd0RpZEV4aXRGdWxsU2NyZWVuXCIsXG5cdFx0V2luZG93RGlkRXhpdFZlcnNpb25Ccm93c2VyOiBcIm1hYzpXaW5kb3dEaWRFeGl0VmVyc2lvbkJyb3dzZXJcIixcblx0XHRXaW5kb3dEaWRFeHBvc2U6IFwibWFjOldpbmRvd0RpZEV4cG9zZVwiLFxuXHRcdFdpbmRvd0RpZEZvY3VzOiBcIm1hYzpXaW5kb3dEaWRGb2N1c1wiLFxuXHRcdFdpbmRvd0RpZE1pbmlhdHVyaXplOiBcIm1hYzpXaW5kb3dEaWRNaW5pYXR1cml6ZVwiLFxuXHRcdFdpbmRvd0RpZE1vdmU6IFwibWFjOldpbmRvd0RpZE1vdmVcIixcblx0XHRXaW5kb3dEaWRPcmRlck9mZlNjcmVlbjogXCJtYWM6V2luZG93RGlkT3JkZXJPZmZTY3JlZW5cIixcblx0XHRXaW5kb3dEaWRPcmRlck9uU2NyZWVuOiBcIm1hYzpXaW5kb3dEaWRPcmRlck9uU2NyZWVuXCIsXG5cdFx0V2luZG93RGlkUmVzaWduS2V5OiBcIm1hYzpXaW5kb3dEaWRSZXNpZ25LZXlcIixcblx0XHRXaW5kb3dEaWRSZXNpZ25NYWluOiBcIm1hYzpXaW5kb3dEaWRSZXNpZ25NYWluXCIsXG5cdFx0V2luZG93RGlkUmVzaXplOiBcIm1hYzpXaW5kb3dEaWRSZXNpemVcIixcblx0XHRXaW5kb3dEaWRVcGRhdGU6IFwibWFjOldpbmRvd0RpZFVwZGF0ZVwiLFxuXHRcdFdpbmRvd0RpZFVwZGF0ZUFscGhhOiBcIm1hYzpXaW5kb3dEaWRVcGRhdGVBbHBoYVwiLFxuXHRcdFdpbmRvd0RpZFVwZGF0ZUNvbGxlY3Rpb25CZWhhdmlvcjogXCJtYWM6V2luZG93RGlkVXBkYXRlQ29sbGVjdGlvbkJlaGF2aW9yXCIsXG5cdFx0V2luZG93RGlkVXBkYXRlQ29sbGVjdGlvblByb3BlcnRpZXM6IFwibWFjOldpbmRvd0RpZFVwZGF0ZUNvbGxlY3Rpb25Qcm9wZXJ0aWVzXCIsXG5cdFx0V2luZG93RGlkVXBkYXRlU2hhZG93OiBcIm1hYzpXaW5kb3dEaWRVcGRhdGVTaGFkb3dcIixcblx0XHRXaW5kb3dEaWRVcGRhdGVUaXRsZTogXCJtYWM6V2luZG93RGlkVXBkYXRlVGl0bGVcIixcblx0XHRXaW5kb3dEaWRVcGRhdGVUb29sYmFyOiBcIm1hYzpXaW5kb3dEaWRVcGRhdGVUb29sYmFyXCIsXG5cdFx0V2luZG93RGlkWm9vbTogXCJtYWM6V2luZG93RGlkWm9vbVwiLFxuXHRcdFdpbmRvd0ZpbGVEcmFnZ2luZ0VudGVyZWQ6IFwibWFjOldpbmRvd0ZpbGVEcmFnZ2luZ0VudGVyZWRcIixcblx0XHRXaW5kb3dGaWxlRHJhZ2dpbmdFeGl0ZWQ6IFwibWFjOldpbmRvd0ZpbGVEcmFnZ2luZ0V4aXRlZFwiLFxuXHRcdFdpbmRvd0ZpbGVEcmFnZ2luZ1BlcmZvcm1lZDogXCJtYWM6V2luZG93RmlsZURyYWdnaW5nUGVyZm9ybWVkXCIsXG5cdFx0V2luZG93SGlkZTogXCJtYWM6V2luZG93SGlkZVwiLFxuXHRcdFdpbmRvd01heGltaXNlOiBcIm1hYzpXaW5kb3dNYXhpbWlzZVwiLFxuXHRcdFdpbmRvd1VuTWF4aW1pc2U6IFwibWFjOldpbmRvd1VuTWF4aW1pc2VcIixcblx0XHRXaW5kb3dNaW5pbWlzZTogXCJtYWM6V2luZG93TWluaW1pc2VcIixcblx0XHRXaW5kb3dVbk1pbmltaXNlOiBcIm1hYzpXaW5kb3dVbk1pbmltaXNlXCIsXG5cdFx0V2luZG93U2hvdWxkQ2xvc2U6IFwibWFjOldpbmRvd1Nob3VsZENsb3NlXCIsXG5cdFx0V2luZG93U2hvdzogXCJtYWM6V2luZG93U2hvd1wiLFxuXHRcdFdpbmRvd1dpbGxCZWNvbWVLZXk6IFwibWFjOldpbmRvd1dpbGxCZWNvbWVLZXlcIixcblx0XHRXaW5kb3dXaWxsQmVjb21lTWFpbjogXCJtYWM6V2luZG93V2lsbEJlY29tZU1haW5cIixcblx0XHRXaW5kb3dXaWxsQmVnaW5TaGVldDogXCJtYWM6V2luZG93V2lsbEJlZ2luU2hlZXRcIixcblx0XHRXaW5kb3dXaWxsQ2hhbmdlT3JkZXJpbmdNb2RlOiBcIm1hYzpXaW5kb3dXaWxsQ2hhbmdlT3JkZXJpbmdNb2RlXCIsXG5cdFx0V2luZG93V2lsbENsb3NlOiBcIm1hYzpXaW5kb3dXaWxsQ2xvc2VcIixcblx0XHRXaW5kb3dXaWxsRGVtaW5pYXR1cml6ZTogXCJtYWM6V2luZG93V2lsbERlbWluaWF0dXJpemVcIixcblx0XHRXaW5kb3dXaWxsRW50ZXJGdWxsU2NyZWVuOiBcIm1hYzpXaW5kb3dXaWxsRW50ZXJGdWxsU2NyZWVuXCIsXG5cdFx0V2luZG93V2lsbEVudGVyVmVyc2lvbkJyb3dzZXI6IFwibWFjOldpbmRvd1dpbGxFbnRlclZlcnNpb25Ccm93c2VyXCIsXG5cdFx0V2luZG93V2lsbEV4aXRGdWxsU2NyZWVuOiBcIm1hYzpXaW5kb3dXaWxsRXhpdEZ1bGxTY3JlZW5cIixcblx0XHRXaW5kb3dXaWxsRXhpdFZlcnNpb25Ccm93c2VyOiBcIm1hYzpXaW5kb3dXaWxsRXhpdFZlcnNpb25Ccm93c2VyXCIsXG5cdFx0V2luZG93V2lsbEZvY3VzOiBcIm1hYzpXaW5kb3dXaWxsRm9jdXNcIixcblx0XHRXaW5kb3dXaWxsTWluaWF0dXJpemU6IFwibWFjOldpbmRvd1dpbGxNaW5pYXR1cml6ZVwiLFxuXHRcdFdpbmRvd1dpbGxNb3ZlOiBcIm1hYzpXaW5kb3dXaWxsTW92ZVwiLFxuXHRcdFdpbmRvd1dpbGxPcmRlck9mZlNjcmVlbjogXCJtYWM6V2luZG93V2lsbE9yZGVyT2ZmU2NyZWVuXCIsXG5cdFx0V2luZG93V2lsbE9yZGVyT25TY3JlZW46IFwibWFjOldpbmRvd1dpbGxPcmRlck9uU2NyZWVuXCIsXG5cdFx0V2luZG93V2lsbFJlc2lnbk1haW46IFwibWFjOldpbmRvd1dpbGxSZXNpZ25NYWluXCIsXG5cdFx0V2luZG93V2lsbFJlc2l6ZTogXCJtYWM6V2luZG93V2lsbFJlc2l6ZVwiLFxuXHRcdFdpbmRvd1dpbGxVbmZvY3VzOiBcIm1hYzpXaW5kb3dXaWxsVW5mb2N1c1wiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGU6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVcIixcblx0XHRXaW5kb3dXaWxsVXBkYXRlQWxwaGE6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVBbHBoYVwiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGVDb2xsZWN0aW9uQmVoYXZpb3I6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVDb2xsZWN0aW9uQmVoYXZpb3JcIixcblx0XHRXaW5kb3dXaWxsVXBkYXRlQ29sbGVjdGlvblByb3BlcnRpZXM6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVDb2xsZWN0aW9uUHJvcGVydGllc1wiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGVTaGFkb3c6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVTaGFkb3dcIixcblx0XHRXaW5kb3dXaWxsVXBkYXRlVGl0bGU6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVUaXRsZVwiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGVUb29sYmFyOiBcIm1hYzpXaW5kb3dXaWxsVXBkYXRlVG9vbGJhclwiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGVWaXNpYmlsaXR5OiBcIm1hYzpXaW5kb3dXaWxsVXBkYXRlVmlzaWJpbGl0eVwiLFxuXHRcdFdpbmRvd1dpbGxVc2VTdGFuZGFyZEZyYW1lOiBcIm1hYzpXaW5kb3dXaWxsVXNlU3RhbmRhcmRGcmFtZVwiLFxuXHRcdFdpbmRvd1pvb21JbjogXCJtYWM6V2luZG93Wm9vbUluXCIsXG5cdFx0V2luZG93Wm9vbU91dDogXCJtYWM6V2luZG93Wm9vbU91dFwiLFxuXHRcdFdpbmRvd1pvb21SZXNldDogXCJtYWM6V2luZG93Wm9vbVJlc2V0XCIsXG5cdH0pLFxuXHRMaW51eDogT2JqZWN0LmZyZWV6ZSh7XG5cdFx0QXBwbGljYXRpb25TdGFydHVwOiBcImxpbnV4OkFwcGxpY2F0aW9uU3RhcnR1cFwiLFxuXHRcdFN5c3RlbVRoZW1lQ2hhbmdlZDogXCJsaW51eDpTeXN0ZW1UaGVtZUNoYW5nZWRcIixcblx0XHRXaW5kb3dEZWxldGVFdmVudDogXCJsaW51eDpXaW5kb3dEZWxldGVFdmVudFwiLFxuXHRcdFdpbmRvd0RpZE1vdmU6IFwibGludXg6V2luZG93RGlkTW92ZVwiLFxuXHRcdFdpbmRvd0RpZFJlc2l6ZTogXCJsaW51eDpXaW5kb3dEaWRSZXNpemVcIixcblx0XHRXaW5kb3dGb2N1c0luOiBcImxpbnV4OldpbmRvd0ZvY3VzSW5cIixcblx0XHRXaW5kb3dGb2N1c091dDogXCJsaW51eDpXaW5kb3dGb2N1c091dFwiLFxuXHRcdFdpbmRvd0xvYWRDaGFuZ2VkOiBcImxpbnV4OldpbmRvd0xvYWRDaGFuZ2VkXCIsXG5cdH0pLFxuXHRDb21tb246IE9iamVjdC5mcmVlemUoe1xuXHRcdEFwcGxpY2F0aW9uT3BlbmVkV2l0aEZpbGU6IFwiY29tbW9uOkFwcGxpY2F0aW9uT3BlbmVkV2l0aEZpbGVcIixcblx0XHRBcHBsaWNhdGlvblN0YXJ0ZWQ6IFwiY29tbW9uOkFwcGxpY2F0aW9uU3RhcnRlZFwiLFxuXHRcdFRoZW1lQ2hhbmdlZDogXCJjb21tb246VGhlbWVDaGFuZ2VkXCIsXG5cdFx0V2luZG93Q2xvc2luZzogXCJjb21tb246V2luZG93Q2xvc2luZ1wiLFxuXHRcdFdpbmRvd0RpZE1vdmU6IFwiY29tbW9uOldpbmRvd0RpZE1vdmVcIixcblx0XHRXaW5kb3dEaWRSZXNpemU6IFwiY29tbW9uOldpbmRvd0RpZFJlc2l6ZVwiLFxuXHRcdFdpbmRvd0RQSUNoYW5nZWQ6IFwiY29tbW9uOldpbmRvd0RQSUNoYW5nZWRcIixcblx0XHRXaW5kb3dGaWxlc0Ryb3BwZWQ6IFwiY29tbW9uOldpbmRvd0ZpbGVzRHJvcHBlZFwiLFxuXHRcdFdpbmRvd0ZvY3VzOiBcImNvbW1vbjpXaW5kb3dGb2N1c1wiLFxuXHRcdFdpbmRvd0Z1bGxzY3JlZW46IFwiY29tbW9uOldpbmRvd0Z1bGxzY3JlZW5cIixcblx0XHRXaW5kb3dIaWRlOiBcImNvbW1vbjpXaW5kb3dIaWRlXCIsXG5cdFx0V2luZG93TG9zdEZvY3VzOiBcImNvbW1vbjpXaW5kb3dMb3N0Rm9jdXNcIixcblx0XHRXaW5kb3dNYXhpbWlzZTogXCJjb21tb246V2luZG93TWF4aW1pc2VcIixcblx0XHRXaW5kb3dNaW5pbWlzZTogXCJjb21tb246V2luZG93TWluaW1pc2VcIixcblx0XHRXaW5kb3dSZXN0b3JlOiBcImNvbW1vbjpXaW5kb3dSZXN0b3JlXCIsXG5cdFx0V2luZG93UnVudGltZVJlYWR5OiBcImNvbW1vbjpXaW5kb3dSdW50aW1lUmVhZHlcIixcblx0XHRXaW5kb3dTaG93OiBcImNvbW1vbjpXaW5kb3dTaG93XCIsXG5cdFx0V2luZG93VW5GdWxsc2NyZWVuOiBcImNvbW1vbjpXaW5kb3dVbkZ1bGxzY3JlZW5cIixcblx0XHRXaW5kb3dVbk1heGltaXNlOiBcImNvbW1vbjpXaW5kb3dVbk1heGltaXNlXCIsXG5cdFx0V2luZG93VW5NaW5pbWlzZTogXCJjb21tb246V2luZG93VW5NaW5pbWlzZVwiLFxuXHRcdFdpbmRvd1pvb206IFwiY29tbW9uOldpbmRvd1pvb21cIixcblx0XHRXaW5kb3dab29tSW46IFwiY29tbW9uOldpbmRvd1pvb21JblwiLFxuXHRcdFdpbmRvd1pvb21PdXQ6IFwiY29tbW9uOldpbmRvd1pvb21PdXRcIixcblx0XHRXaW5kb3dab29tUmVzZXQ6IFwiY29tbW9uOldpbmRvd1pvb21SZXNldFwiLFxuXHR9KSxcbn0pO1xuIiwgIi8qXG4gXyAgICAgX18gICAgIF8gX19cbnwgfCAgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vKipcbiAqIExvZ3MgYSBtZXNzYWdlIHRvIHRoZSBjb25zb2xlIHdpdGggY3VzdG9tIGZvcm1hdHRpbmcuXG4gKlxuICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWJ1Z0xvZyhtZXNzYWdlOiBhbnkpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgJyVjIHdhaWxzMyAlYyAnICsgbWVzc2FnZSArICcgJyxcbiAgICAgICAgJ2JhY2tncm91bmQ6ICNhYTAwMDA7IGNvbG9yOiAjZmZmOyBib3JkZXItcmFkaXVzOiAzcHggMHB4IDBweCAzcHg7IHBhZGRpbmc6IDFweDsgZm9udC1zaXplOiAwLjdyZW0nLFxuICAgICAgICAnYmFja2dyb3VuZDogIzAwOTkwMDsgY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDBweCAzcHggM3B4IDBweDsgcGFkZGluZzogMXB4OyBmb250LXNpemU6IDAuN3JlbSdcbiAgICApO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSB3ZWJ2aWV3IHN1cHBvcnRzIHRoZSB7QGxpbmsgTW91c2VFdmVudCNidXR0b25zfSBwcm9wZXJ0eS5cbiAqIExvb2tpbmcgYXQgeW91IG1hY09TIEhpZ2ggU2llcnJhIVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FuVHJhY2tCdXR0b25zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAobmV3IE1vdXNlRXZlbnQoJ21vdXNlZG93bicpKS5idXR0b25zID09PSAwO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBicm93c2VyIHN1cHBvcnRzIHJlbW92aW5nIGxpc3RlbmVycyBieSB0cmlnZ2VyaW5nIGFuIEFib3J0U2lnbmFsXG4gKiAoc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FdmVudFRhcmdldC9hZGRFdmVudExpc3RlbmVyI3NpZ25hbCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYW5BYm9ydExpc3RlbmVycygpIHtcbiAgICBpZiAoIUV2ZW50VGFyZ2V0IHx8ICFBYm9ydFNpZ25hbCB8fCAhQWJvcnRDb250cm9sbGVyKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBsZXQgcmVzdWx0ID0gdHJ1ZTtcblxuICAgIGNvbnN0IHRhcmdldCA9IG5ldyBFdmVudFRhcmdldCgpO1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCAoKSA9PiB7IHJlc3VsdCA9IGZhbHNlOyB9LCB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfSk7XG4gICAgY29udHJvbGxlci5hYm9ydCgpO1xuICAgIHRhcmdldC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgndGVzdCcpKTtcblxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIGNsb3Nlc3QgSFRNTEVsZW1lbnQgYW5jZXN0b3Igb2YgYW4gZXZlbnQncyB0YXJnZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBldmVudFRhcmdldChldmVudDogRXZlbnQpOiBIVE1MRWxlbWVudCB7XG4gICAgaWYgKGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBldmVudC50YXJnZXQ7XG4gICAgfSBlbHNlIGlmICghKGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSAmJiBldmVudC50YXJnZXQgaW5zdGFuY2VvZiBOb2RlKSB7XG4gICAgICAgIHJldHVybiBldmVudC50YXJnZXQucGFyZW50RWxlbWVudCA/PyBkb2N1bWVudC5ib2R5O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBkb2N1bWVudC5ib2R5O1xuICAgIH1cbn1cblxuLyoqKlxuIFRoaXMgdGVjaG5pcXVlIGZvciBwcm9wZXIgbG9hZCBkZXRlY3Rpb24gaXMgdGFrZW4gZnJvbSBIVE1YOlxuXG4gQlNEIDItQ2xhdXNlIExpY2Vuc2VcblxuIENvcHlyaWdodCAoYykgMjAyMCwgQmlnIFNreSBTb2Z0d2FyZVxuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cbiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcblxuIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuXG4gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb25cbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cblxuIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4gQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEVcbiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTFxuIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SXG4gU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVJcbiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLFxuIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFXG4gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cblxuICoqKi9cblxubGV0IGlzUmVhZHkgPSBmYWxzZTtcbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB7IGlzUmVhZHkgPSB0cnVlIH0pO1xuXG5leHBvcnQgZnVuY3Rpb24gd2hlblJlYWR5KGNhbGxiYWNrOiAoKSA9PiB2b2lkKSB7XG4gICAgaWYgKGlzUmVhZHkgfHwgZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJykge1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBjYWxsYmFjayk7XG4gICAgfVxufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5pbXBvcnQge25ld1J1bnRpbWVDYWxsZXIsIG9iamVjdE5hbWVzfSBmcm9tIFwiLi9ydW50aW1lLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNjcmVlbiB9IGZyb20gXCIuL3NjcmVlbnMuanNcIjtcblxuY29uc3QgUG9zaXRpb25NZXRob2QgICAgICAgICAgICAgICAgICAgID0gMDtcbmNvbnN0IENlbnRlck1ldGhvZCAgICAgICAgICAgICAgICAgICAgICA9IDE7XG5jb25zdCBDbG9zZU1ldGhvZCAgICAgICAgICAgICAgICAgICAgICAgPSAyO1xuY29uc3QgRGlzYWJsZVNpemVDb25zdHJhaW50c01ldGhvZCAgICAgID0gMztcbmNvbnN0IEVuYWJsZVNpemVDb25zdHJhaW50c01ldGhvZCAgICAgICA9IDQ7XG5jb25zdCBGb2N1c01ldGhvZCAgICAgICAgICAgICAgICAgICAgICAgPSA1O1xuY29uc3QgRm9yY2VSZWxvYWRNZXRob2QgICAgICAgICAgICAgICAgID0gNjtcbmNvbnN0IEZ1bGxzY3JlZW5NZXRob2QgICAgICAgICAgICAgICAgICA9IDc7XG5jb25zdCBHZXRTY3JlZW5NZXRob2QgICAgICAgICAgICAgICAgICAgPSA4O1xuY29uc3QgR2V0Wm9vbU1ldGhvZCAgICAgICAgICAgICAgICAgICAgID0gOTtcbmNvbnN0IEhlaWdodE1ldGhvZCAgICAgICAgICAgICAgICAgICAgICA9IDEwO1xuY29uc3QgSGlkZU1ldGhvZCAgICAgICAgICAgICAgICAgICAgICAgID0gMTE7XG5jb25zdCBJc0ZvY3VzZWRNZXRob2QgICAgICAgICAgICAgICAgICAgPSAxMjtcbmNvbnN0IElzRnVsbHNjcmVlbk1ldGhvZCAgICAgICAgICAgICAgICA9IDEzO1xuY29uc3QgSXNNYXhpbWlzZWRNZXRob2QgICAgICAgICAgICAgICAgID0gMTQ7XG5jb25zdCBJc01pbmltaXNlZE1ldGhvZCAgICAgICAgICAgICAgICAgPSAxNTtcbmNvbnN0IE1heGltaXNlTWV0aG9kICAgICAgICAgICAgICAgICAgICA9IDE2O1xuY29uc3QgTWluaW1pc2VNZXRob2QgICAgICAgICAgICAgICAgICAgID0gMTc7XG5jb25zdCBOYW1lTWV0aG9kICAgICAgICAgICAgICAgICAgICAgICAgPSAxODtcbmNvbnN0IE9wZW5EZXZUb29sc01ldGhvZCAgICAgICAgICAgICAgICA9IDE5O1xuY29uc3QgUmVsYXRpdmVQb3NpdGlvbk1ldGhvZCAgICAgICAgICAgID0gMjA7XG5jb25zdCBSZWxvYWRNZXRob2QgICAgICAgICAgICAgICAgICAgICAgPSAyMTtcbmNvbnN0IFJlc2l6YWJsZU1ldGhvZCAgICAgICAgICAgICAgICAgICA9IDIyO1xuY29uc3QgUmVzdG9yZU1ldGhvZCAgICAgICAgICAgICAgICAgICAgID0gMjM7XG5jb25zdCBTZXRQb3NpdGlvbk1ldGhvZCAgICAgICAgICAgICAgICAgPSAyNDtcbmNvbnN0IFNldEFsd2F5c09uVG9wTWV0aG9kICAgICAgICAgICAgICA9IDI1O1xuY29uc3QgU2V0QmFja2dyb3VuZENvbG91ck1ldGhvZCAgICAgICAgID0gMjY7XG5jb25zdCBTZXRGcmFtZWxlc3NNZXRob2QgICAgICAgICAgICAgICAgPSAyNztcbmNvbnN0IFNldEZ1bGxzY3JlZW5CdXR0b25FbmFibGVkTWV0aG9kICA9IDI4O1xuY29uc3QgU2V0TWF4U2l6ZU1ldGhvZCAgICAgICAgICAgICAgICAgID0gMjk7XG5jb25zdCBTZXRNaW5TaXplTWV0aG9kICAgICAgICAgICAgICAgICAgPSAzMDtcbmNvbnN0IFNldFJlbGF0aXZlUG9zaXRpb25NZXRob2QgICAgICAgICA9IDMxO1xuY29uc3QgU2V0UmVzaXphYmxlTWV0aG9kICAgICAgICAgICAgICAgID0gMzI7XG5jb25zdCBTZXRTaXplTWV0aG9kICAgICAgICAgICAgICAgICAgICAgPSAzMztcbmNvbnN0IFNldFRpdGxlTWV0aG9kICAgICAgICAgICAgICAgICAgICA9IDM0O1xuY29uc3QgU2V0Wm9vbU1ldGhvZCAgICAgICAgICAgICAgICAgICAgID0gMzU7XG5jb25zdCBTaG93TWV0aG9kICAgICAgICAgICAgICAgICAgICAgICAgPSAzNjtcbmNvbnN0IFNpemVNZXRob2QgICAgICAgICAgICAgICAgICAgICAgICA9IDM3O1xuY29uc3QgVG9nZ2xlRnVsbHNjcmVlbk1ldGhvZCAgICAgICAgICAgID0gMzg7XG5jb25zdCBUb2dnbGVNYXhpbWlzZU1ldGhvZCAgICAgICAgICAgICAgPSAzOTtcbmNvbnN0IFVuRnVsbHNjcmVlbk1ldGhvZCAgICAgICAgICAgICAgICA9IDQwO1xuY29uc3QgVW5NYXhpbWlzZU1ldGhvZCAgICAgICAgICAgICAgICAgID0gNDE7XG5jb25zdCBVbk1pbmltaXNlTWV0aG9kICAgICAgICAgICAgICAgICAgPSA0MjtcbmNvbnN0IFdpZHRoTWV0aG9kICAgICAgICAgICAgICAgICAgICAgICA9IDQzO1xuY29uc3QgWm9vbU1ldGhvZCAgICAgICAgICAgICAgICAgICAgICAgID0gNDQ7XG5jb25zdCBab29tSW5NZXRob2QgICAgICAgICAgICAgICAgICAgICAgPSA0NTtcbmNvbnN0IFpvb21PdXRNZXRob2QgICAgICAgICAgICAgICAgICAgICA9IDQ2O1xuY29uc3QgWm9vbVJlc2V0TWV0aG9kICAgICAgICAgICAgICAgICAgID0gNDc7XG5cbi8qKlxuICogQSByZWNvcmQgZGVzY3JpYmluZyB0aGUgcG9zaXRpb24gb2YgYSB3aW5kb3cuXG4gKi9cbmludGVyZmFjZSBQb3NpdGlvbiB7XG4gICAgLyoqIFRoZSBob3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoZSB3aW5kb3cuICovXG4gICAgeDogbnVtYmVyO1xuICAgIC8qKiBUaGUgdmVydGljYWwgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy4gKi9cbiAgICB5OiBudW1iZXI7XG59XG5cbi8qKlxuICogQSByZWNvcmQgZGVzY3JpYmluZyB0aGUgc2l6ZSBvZiBhIHdpbmRvdy5cbiAqL1xuaW50ZXJmYWNlIFNpemUge1xuICAgIC8qKiBUaGUgd2lkdGggb2YgdGhlIHdpbmRvdy4gKi9cbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIC8qKiBUaGUgaGVpZ2h0IG9mIHRoZSB3aW5kb3cuICovXG4gICAgaGVpZ2h0OiBudW1iZXI7XG59XG5cbi8vIFByaXZhdGUgZmllbGQgbmFtZXMuXG5jb25zdCBjYWxsZXJTeW0gPSBTeW1ib2woXCJjYWxsZXJcIik7XG5cbmNsYXNzIFdpbmRvdyB7XG4gICAgLy8gUHJpdmF0ZSBmaWVsZHMuXG4gICAgcHJpdmF0ZSBbY2FsbGVyU3ltXTogKG1lc3NhZ2U6IG51bWJlciwgYXJncz86IGFueSkgPT4gUHJvbWlzZTxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGlzZXMgYSB3aW5kb3cgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YXJnZXQgd2luZG93LlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZyA9ICcnKSB7XG4gICAgICAgIHRoaXNbY2FsbGVyU3ltXSA9IG5ld1J1bnRpbWVDYWxsZXIob2JqZWN0TmFtZXMuV2luZG93LCBuYW1lKVxuXG4gICAgICAgIC8vIGJpbmQgaW5zdGFuY2UgbWV0aG9kIHRvIG1ha2UgdGhlbSBlYXNpbHkgdXNhYmxlIGluIGV2ZW50IGhhbmRsZXJzXG4gICAgICAgIGZvciAoY29uc3QgbWV0aG9kIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKFdpbmRvdy5wcm90b3R5cGUpKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgbWV0aG9kICE9PSBcImNvbnN0cnVjdG9yXCJcbiAgICAgICAgICAgICAgICAmJiB0eXBlb2YgKHRoaXMgYXMgYW55KVttZXRob2RdID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICh0aGlzIGFzIGFueSlbbWV0aG9kXSA9ICh0aGlzIGFzIGFueSlbbWV0aG9kXS5iaW5kKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgc3BlY2lmaWVkIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHdpbmRvdyB0byBnZXQuXG4gICAgICogQHJldHVybnMgVGhlIGNvcnJlc3BvbmRpbmcgd2luZG93IG9iamVjdC5cbiAgICAgKi9cbiAgICBHZXQobmFtZTogc3RyaW5nKTogV2luZG93IHtcbiAgICAgICAgcmV0dXJuIG5ldyBXaW5kb3cobmFtZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IGFic29sdXRlIHBvc2l0aW9uIG9mIHRoZSB3aW5kb3cuXG4gICAgICovXG4gICAgUG9zaXRpb24oKTogUHJvbWlzZTxQb3NpdGlvbj4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFBvc2l0aW9uTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDZW50ZXJzIHRoZSB3aW5kb3cgb24gdGhlIHNjcmVlbi5cbiAgICAgKi9cbiAgICBDZW50ZXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oQ2VudGVyTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBDbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShDbG9zZU1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZXMgbWluL21heCBzaXplIGNvbnN0cmFpbnRzLlxuICAgICAqL1xuICAgIERpc2FibGVTaXplQ29uc3RyYWludHMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oRGlzYWJsZVNpemVDb25zdHJhaW50c01ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyBtaW4vbWF4IHNpemUgY29uc3RyYWludHMuXG4gICAgICovXG4gICAgRW5hYmxlU2l6ZUNvbnN0cmFpbnRzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEVuYWJsZVNpemVDb25zdHJhaW50c01ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9jdXNlcyB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIEZvY3VzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEZvY3VzTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JjZXMgdGhlIHdpbmRvdyB0byByZWxvYWQgdGhlIHBhZ2UgYXNzZXRzLlxuICAgICAqL1xuICAgIEZvcmNlUmVsb2FkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEZvcmNlUmVsb2FkTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTd2l0Y2hlcyB0aGUgd2luZG93IHRvIGZ1bGxzY3JlZW4gbW9kZS5cbiAgICAgKi9cbiAgICBGdWxsc2NyZWVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEZ1bGxzY3JlZW5NZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHNjcmVlbiB0aGF0IHRoZSB3aW5kb3cgaXMgb24uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgc2NyZWVuIHRoZSB3aW5kb3cgaXMgY3VycmVudGx5IG9uLlxuICAgICAqL1xuICAgIEdldFNjcmVlbigpOiBQcm9taXNlPFNjcmVlbj4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEdldFNjcmVlbk1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudCB6b29tIGxldmVsIG9mIHRoZSB3aW5kb3cuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCB6b29tIGxldmVsLlxuICAgICAqL1xuICAgIEdldFpvb20oKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShHZXRab29tTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBoZWlnaHQgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IGhlaWdodCBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIEhlaWdodCgpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEhlaWdodE1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGlkZXMgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBIaWRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEhpZGVNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgd2luZG93IGlzIGZvY3VzZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSB3aW5kb3cgaXMgY3VycmVudGx5IGZvY3VzZWQuXG4gICAgICovXG4gICAgSXNGb2N1c2VkKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKElzRm9jdXNlZE1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB3aW5kb3cgaXMgZnVsbHNjcmVlbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIHdpbmRvdyBpcyBjdXJyZW50bHkgZnVsbHNjcmVlbi5cbiAgICAgKi9cbiAgICBJc0Z1bGxzY3JlZW4oKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oSXNGdWxsc2NyZWVuTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHdpbmRvdyBpcyBtYXhpbWlzZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSB3aW5kb3cgaXMgY3VycmVudGx5IG1heGltaXNlZC5cbiAgICAgKi9cbiAgICBJc01heGltaXNlZCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShJc01heGltaXNlZE1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB3aW5kb3cgaXMgbWluaW1pc2VkLlxuICAgICAqXG4gICAgICogQHJldHVybnMgV2hldGhlciB0aGUgd2luZG93IGlzIGN1cnJlbnRseSBtaW5pbWlzZWQuXG4gICAgICovXG4gICAgSXNNaW5pbWlzZWQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oSXNNaW5pbWlzZWRNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1heGltaXNlcyB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIE1heGltaXNlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKE1heGltaXNlTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNaW5pbWlzZXMgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBNaW5pbWlzZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShNaW5pbWlzZU1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgd2luZG93LlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIG5hbWUgb2YgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBOYW1lKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oTmFtZU1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3BlbnMgdGhlIGRldmVsb3BtZW50IHRvb2xzIHBhbmUuXG4gICAgICovXG4gICAgT3BlbkRldlRvb2xzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKE9wZW5EZXZUb29sc01ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcmVsYXRpdmUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdyB0byB0aGUgc2NyZWVuLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIGN1cnJlbnQgcmVsYXRpdmUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBSZWxhdGl2ZVBvc2l0aW9uKCk6IFByb21pc2U8UG9zaXRpb24+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShSZWxhdGl2ZVBvc2l0aW9uTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWxvYWRzIHRoZSBwYWdlIGFzc2V0cy5cbiAgICAgKi9cbiAgICBSZWxvYWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oUmVsb2FkTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHdpbmRvdyBpcyByZXNpemFibGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSB3aW5kb3cgaXMgY3VycmVudGx5IHJlc2l6YWJsZS5cbiAgICAgKi9cbiAgICBSZXNpemFibGUoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oUmVzaXphYmxlTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXN0b3JlcyB0aGUgd2luZG93IHRvIGl0cyBwcmV2aW91cyBzdGF0ZSBpZiBpdCB3YXMgcHJldmlvdXNseSBtaW5pbWlzZWQsIG1heGltaXNlZCBvciBmdWxsc2NyZWVuLlxuICAgICAqL1xuICAgIFJlc3RvcmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oUmVzdG9yZU1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB4IC0gVGhlIGRlc2lyZWQgaG9yaXpvbnRhbCBhYnNvbHV0ZSBwb3NpdGlvbiBvZiB0aGUgd2luZG93LlxuICAgICAqIEBwYXJhbSB5IC0gVGhlIGRlc2lyZWQgdmVydGljYWwgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBTZXRQb3NpdGlvbih4OiBudW1iZXIsIHk6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFNldFBvc2l0aW9uTWV0aG9kLCB7IHgsIHkgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgd2luZG93IHRvIGJlIGFsd2F5cyBvbiB0b3AuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYWx3YXlzT25Ub3AgLSBXaGV0aGVyIHRoZSB3aW5kb3cgc2hvdWxkIHN0YXkgb24gdG9wLlxuICAgICAqL1xuICAgIFNldEFsd2F5c09uVG9wKGFsd2F5c09uVG9wOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2V0QWx3YXlzT25Ub3BNZXRob2QsIHsgYWx3YXlzT25Ub3AgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgYmFja2dyb3VuZCBjb2xvdXIgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByIC0gVGhlIGRlc2lyZWQgcmVkIGNvbXBvbmVudCBvZiB0aGUgd2luZG93IGJhY2tncm91bmQuXG4gICAgICogQHBhcmFtIGcgLSBUaGUgZGVzaXJlZCBncmVlbiBjb21wb25lbnQgb2YgdGhlIHdpbmRvdyBiYWNrZ3JvdW5kLlxuICAgICAqIEBwYXJhbSBiIC0gVGhlIGRlc2lyZWQgYmx1ZSBjb21wb25lbnQgb2YgdGhlIHdpbmRvdyBiYWNrZ3JvdW5kLlxuICAgICAqIEBwYXJhbSBhIC0gVGhlIGRlc2lyZWQgYWxwaGEgY29tcG9uZW50IG9mIHRoZSB3aW5kb3cgYmFja2dyb3VuZC5cbiAgICAgKi9cbiAgICBTZXRCYWNrZ3JvdW5kQ29sb3VyKHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIsIGE6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFNldEJhY2tncm91bmRDb2xvdXJNZXRob2QsIHsgciwgZywgYiwgYSB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSB3aW5kb3cgZnJhbWUgYW5kIHRpdGxlIGJhci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmcmFtZWxlc3MgLSBXaGV0aGVyIHRoZSB3aW5kb3cgc2hvdWxkIGJlIGZyYW1lbGVzcy5cbiAgICAgKi9cbiAgICBTZXRGcmFtZWxlc3MoZnJhbWVsZXNzOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2V0RnJhbWVsZXNzTWV0aG9kLCB7IGZyYW1lbGVzcyB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlcyB0aGUgc3lzdGVtIGZ1bGxzY3JlZW4gYnV0dG9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVuYWJsZWQgLSBXaGV0aGVyIHRoZSBmdWxsc2NyZWVuIGJ1dHRvbiBzaG91bGQgYmUgZW5hYmxlZC5cbiAgICAgKi9cbiAgICBTZXRGdWxsc2NyZWVuQnV0dG9uRW5hYmxlZChlbmFibGVkOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2V0RnVsbHNjcmVlbkJ1dHRvbkVuYWJsZWRNZXRob2QsIHsgZW5hYmxlZCB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB3aWR0aCAtIFRoZSBkZXNpcmVkIG1heGltdW0gd2lkdGggb2YgdGhlIHdpbmRvdy5cbiAgICAgKiBAcGFyYW0gaGVpZ2h0IC0gVGhlIGRlc2lyZWQgbWF4aW11bSBoZWlnaHQgb2YgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBTZXRNYXhTaXplKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2V0TWF4U2l6ZU1ldGhvZCwgeyB3aWR0aCwgaGVpZ2h0IH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIG1pbmltdW0gc2l6ZSBvZiB0aGUgd2luZG93LlxuICAgICAqXG4gICAgICogQHBhcmFtIHdpZHRoIC0gVGhlIGRlc2lyZWQgbWluaW11bSB3aWR0aCBvZiB0aGUgd2luZG93LlxuICAgICAqIEBwYXJhbSBoZWlnaHQgLSBUaGUgZGVzaXJlZCBtaW5pbXVtIGhlaWdodCBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFNldE1pblNpemUod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShTZXRNaW5TaXplTWV0aG9kLCB7IHdpZHRoLCBoZWlnaHQgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcmVsYXRpdmUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdyB0byB0aGUgc2NyZWVuLlxuICAgICAqXG4gICAgICogQHBhcmFtIHggLSBUaGUgZGVzaXJlZCBob3Jpem9udGFsIHJlbGF0aXZlIHBvc2l0aW9uIG9mIHRoZSB3aW5kb3cuXG4gICAgICogQHBhcmFtIHkgLSBUaGUgZGVzaXJlZCB2ZXJ0aWNhbCByZWxhdGl2ZSBwb3NpdGlvbiBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFNldFJlbGF0aXZlUG9zaXRpb24oeDogbnVtYmVyLCB5OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShTZXRSZWxhdGl2ZVBvc2l0aW9uTWV0aG9kLCB7IHgsIHkgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB3aGV0aGVyIHRoZSB3aW5kb3cgaXMgcmVzaXphYmxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlc2l6YWJsZSAtIFdoZXRoZXIgdGhlIHdpbmRvdyBzaG91bGQgYmUgcmVzaXphYmxlLlxuICAgICAqL1xuICAgIFNldFJlc2l6YWJsZShyZXNpemFibGU6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShTZXRSZXNpemFibGVNZXRob2QsIHsgcmVzaXphYmxlIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHNpemUgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB3aWR0aCAtIFRoZSBkZXNpcmVkIHdpZHRoIG9mIHRoZSB3aW5kb3cuXG4gICAgICogQHBhcmFtIGhlaWdodCAtIFRoZSBkZXNpcmVkIGhlaWdodCBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFNldFNpemUod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShTZXRTaXplTWV0aG9kLCB7IHdpZHRoLCBoZWlnaHQgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdGl0bGUgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0aXRsZSAtIFRoZSBkZXNpcmVkIHRpdGxlIG9mIHRoZSB3aW5kb3cuXG4gICAgICovXG4gICAgU2V0VGl0bGUodGl0bGU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFNldFRpdGxlTWV0aG9kLCB7IHRpdGxlIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHpvb20gbGV2ZWwgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB6b29tIC0gVGhlIGRlc2lyZWQgem9vbSBsZXZlbC5cbiAgICAgKi9cbiAgICBTZXRab29tKHpvb206IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFNldFpvb21NZXRob2QsIHsgem9vbSB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTaG93cyB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFNob3coKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2hvd01ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgd2luZG93LlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFNpemUoKTogUHJvbWlzZTxTaXplPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2l6ZU1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG9nZ2xlcyB0aGUgd2luZG93IGJldHdlZW4gZnVsbHNjcmVlbiBhbmQgbm9ybWFsLlxuICAgICAqL1xuICAgIFRvZ2dsZUZ1bGxzY3JlZW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oVG9nZ2xlRnVsbHNjcmVlbk1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG9nZ2xlcyB0aGUgd2luZG93IGJldHdlZW4gbWF4aW1pc2VkIGFuZCBub3JtYWwuXG4gICAgICovXG4gICAgVG9nZ2xlTWF4aW1pc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oVG9nZ2xlTWF4aW1pc2VNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVuLWZ1bGxzY3JlZW5zIHRoZSB3aW5kb3cuXG4gICAgICovXG4gICAgVW5GdWxsc2NyZWVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFVuRnVsbHNjcmVlbk1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVW4tbWF4aW1pc2VzIHRoZSB3aW5kb3cuXG4gICAgICovXG4gICAgVW5NYXhpbWlzZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShVbk1heGltaXNlTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVbi1taW5pbWlzZXMgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBVbk1pbmltaXNlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFVuTWluaW1pc2VNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHdpZHRoIG9mIHRoZSB3aW5kb3cuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCB3aWR0aCBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFdpZHRoKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oV2lkdGhNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFpvb21zIHRoZSB3aW5kb3cuXG4gICAgICovXG4gICAgWm9vbSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShab29tTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbmNyZWFzZXMgdGhlIHpvb20gbGV2ZWwgb2YgdGhlIHdlYnZpZXcgY29udGVudC5cbiAgICAgKi9cbiAgICBab29tSW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oWm9vbUluTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWNyZWFzZXMgdGhlIHpvb20gbGV2ZWwgb2YgdGhlIHdlYnZpZXcgY29udGVudC5cbiAgICAgKi9cbiAgICBab29tT3V0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFpvb21PdXRNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUgem9vbSBsZXZlbCBvZiB0aGUgd2VidmlldyBjb250ZW50LlxuICAgICAqL1xuICAgIFpvb21SZXNldCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShab29tUmVzZXRNZXRob2QpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBUaGUgd2luZG93IHdpdGhpbiB3aGljaCB0aGUgc2NyaXB0IGlzIHJ1bm5pbmcuXG4gKi9cbmNvbnN0IHRoaXNXaW5kb3cgPSBuZXcgV2luZG93KCcnKTtcblxuZXhwb3J0IGRlZmF1bHQgdGhpc1dpbmRvdztcbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuaW1wb3J0ICogYXMgUnVudGltZSBmcm9tIFwiLi4vQHdhaWxzaW8vcnVudGltZS9zcmNcIjtcblxuLy8gTk9URTogdGhlIGZvbGxvd2luZyBtZXRob2RzIE1VU1QgYmUgaW1wb3J0ZWQgZXhwbGljaXRseSBiZWNhdXNlIG9mIGhvdyBlc2J1aWxkIGluamVjdGlvbiB3b3Jrc1xuaW1wb3J0IHsgRW5hYmxlIGFzIEVuYWJsZVdNTCB9IGZyb20gXCIuLi9Ad2FpbHNpby9ydW50aW1lL3NyYy93bWxcIjtcbmltcG9ydCB7IGRlYnVnTG9nIH0gZnJvbSBcIi4uL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3V0aWxzXCI7XG5cbndpbmRvdy53YWlscyA9IFJ1bnRpbWU7XG5FbmFibGVXTUwoKTtcblxuaWYgKERFQlVHKSB7XG4gICAgZGVidWdMb2coXCJXYWlscyBSdW50aW1lIExvYWRlZFwiKVxufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5pbXBvcnQgeyBuZXdSdW50aW1lQ2FsbGVyLCBvYmplY3ROYW1lcyB9IGZyb20gXCIuL3J1bnRpbWUuanNcIjtcblxubGV0IGNhbGwgPSBuZXdSdW50aW1lQ2FsbGVyKG9iamVjdE5hbWVzLlN5c3RlbSk7XG5cbmNvbnN0IFN5c3RlbUlzRGFya01vZGUgPSAwO1xuY29uc3QgU3lzdGVtRW52aXJvbm1lbnQgPSAxO1xuXG5jb25zdCBfaW52b2tlID0gKGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAoKHdpbmRvdyBhcyBhbnkpLmNocm9tZT8ud2Vidmlldz8ucG9zdE1lc3NhZ2UpIHtcbiAgICAgICAgICAgIHJldHVybiAod2luZG93IGFzIGFueSkuY2hyb21lLndlYnZpZXcucG9zdE1lc3NhZ2UuYmluZCgod2luZG93IGFzIGFueSkuY2hyb21lLndlYnZpZXcpO1xuICAgICAgICB9IGVsc2UgaWYgKCh3aW5kb3cgYXMgYW55KS53ZWJraXQ/Lm1lc3NhZ2VIYW5kbGVycz8uWydleHRlcm5hbCddPy5wb3N0TWVzc2FnZSkge1xuICAgICAgICAgICAgcmV0dXJuICh3aW5kb3cgYXMgYW55KS53ZWJraXQubWVzc2FnZUhhbmRsZXJzWydleHRlcm5hbCddLnBvc3RNZXNzYWdlLmJpbmQoKHdpbmRvdyBhcyBhbnkpLndlYmtpdC5tZXNzYWdlSGFuZGxlcnNbJ2V4dGVybmFsJ10pO1xuICAgICAgICB9XG4gICAgfSBjYXRjaChlKSB7fVxuXG4gICAgY29uc29sZS53YXJuKCdcXG4lY1x1MjZBMFx1RkUwRiBCcm93c2VyIEVudmlyb25tZW50IERldGVjdGVkICVjXFxuXFxuJWNPbmx5IFVJIHByZXZpZXdzIGFyZSBhdmFpbGFibGUgaW4gdGhlIGJyb3dzZXIuIEZvciBmdWxsIGZ1bmN0aW9uYWxpdHksIHBsZWFzZSBydW4gdGhlIGFwcGxpY2F0aW9uIGluIGRlc2t0b3AgbW9kZS5cXG5Nb3JlIGluZm9ybWF0aW9uIGF0OiBodHRwczovL3YzLndhaWxzLmlvL2xlYXJuL2J1aWxkLyN1c2luZy1hLWJyb3dzZXItZm9yLWRldmVsb3BtZW50XFxuJyxcbiAgICAgICAgJ2JhY2tncm91bmQ6ICNmZmZmZmY7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgcGFkZGluZzogNHB4IDhweDsgYm9yZGVyLXJhZGl1czogNHB4OyBib3JkZXI6IDJweCBzb2xpZCAjMDAwMDAwOycsXG4gICAgICAgICdiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsnLFxuICAgICAgICAnY29sb3I6ICNmZmZmZmY7IGZvbnQtc3R5bGU6IGl0YWxpYzsgZm9udC13ZWlnaHQ6IGJvbGQ7Jyk7XG4gICAgcmV0dXJuIG51bGw7XG59KSgpO1xuXG5leHBvcnQgZnVuY3Rpb24gaW52b2tlKG1zZzogYW55KTogdm9pZCB7XG4gICAgX2ludm9rZT8uKG1zZyk7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBzeXN0ZW0gZGFyayBtb2RlIHN0YXR1cy5cbiAqXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyBpZiB0aGUgc3lzdGVtIGlzIGluIGRhcmsgbW9kZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIElzRGFya01vZGUoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIGNhbGwoU3lzdGVtSXNEYXJrTW9kZSk7XG59XG5cbi8qKlxuICogRmV0Y2hlcyB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZSBhcHBsaWNhdGlvbiBmcm9tIHRoZSBzZXJ2ZXIuXG4gKlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGNhcGFiaWxpdGllcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIENhcGFiaWxpdGllcygpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcIi93YWlscy9jYXBhYmlsaXRpZXNcIik7XG4gICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY291bGQgbm90IGZldGNoIGNhcGFiaWxpdGllczogXCIgKyByZXNwb25zZS5zdGF0dXNUZXh0KTtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT1NJbmZvIHtcbiAgICAvKiogVGhlIGJyYW5kaW5nIG9mIHRoZSBPUy4gKi9cbiAgICBCcmFuZGluZzogc3RyaW5nO1xuICAgIC8qKiBUaGUgSUQgb2YgdGhlIE9TLiAqL1xuICAgIElEOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBPUy4gKi9cbiAgICBOYW1lOiBzdHJpbmc7XG4gICAgLyoqIFRoZSB2ZXJzaW9uIG9mIHRoZSBPUy4gKi9cbiAgICBWZXJzaW9uOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW52aXJvbm1lbnRJbmZvIHtcbiAgICAvKiogVGhlIGFyY2hpdGVjdHVyZSBvZiB0aGUgc3lzdGVtLiAqL1xuICAgIEFyY2g6IHN0cmluZztcbiAgICAvKiogVHJ1ZSBpZiB0aGUgYXBwbGljYXRpb24gaXMgcnVubmluZyBpbiBkZWJ1ZyBtb2RlLCBvdGhlcndpc2UgZmFsc2UuICovXG4gICAgRGVidWc6IGJvb2xlYW47XG4gICAgLyoqIFRoZSBvcGVyYXRpbmcgc3lzdGVtIGluIHVzZS4gKi9cbiAgICBPUzogc3RyaW5nO1xuICAgIC8qKiBEZXRhaWxzIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtLiAqL1xuICAgIE9TSW5mbzogT1NJbmZvO1xuICAgIC8qKiBBZGRpdGlvbmFsIHBsYXRmb3JtIGluZm9ybWF0aW9uLiAqL1xuICAgIFBsYXRmb3JtSW5mbzogUmVjb3JkPHN0cmluZywgYW55Pjtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgZW52aXJvbm1lbnQgZGV0YWlscy5cbiAqXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBvYmplY3QgY29udGFpbmluZyBPUyBhbmQgc3lzdGVtIGFyY2hpdGVjdHVyZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEVudmlyb25tZW50KCk6IFByb21pc2U8RW52aXJvbm1lbnRJbmZvPiB7XG4gICAgcmV0dXJuIGNhbGwoU3lzdGVtRW52aXJvbm1lbnQpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgY3VycmVudCBvcGVyYXRpbmcgc3lzdGVtIGlzIFdpbmRvd3MuXG4gKlxuICogQHJldHVybiBUcnVlIGlmIHRoZSBvcGVyYXRpbmcgc3lzdGVtIGlzIFdpbmRvd3MsIG90aGVyd2lzZSBmYWxzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIElzV2luZG93cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gd2luZG93Ll93YWlscy5lbnZpcm9ubWVudC5PUyA9PT0gXCJ3aW5kb3dzXCI7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBjdXJyZW50IG9wZXJhdGluZyBzeXN0ZW0gaXMgTGludXguXG4gKlxuICogQHJldHVybnMgUmV0dXJucyB0cnVlIGlmIHRoZSBjdXJyZW50IG9wZXJhdGluZyBzeXN0ZW0gaXMgTGludXgsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIElzTGludXgoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHdpbmRvdy5fd2FpbHMuZW52aXJvbm1lbnQuT1MgPT09IFwibGludXhcIjtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgaXMgYSBtYWNPUyBvcGVyYXRpbmcgc3lzdGVtLlxuICpcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGVudmlyb25tZW50IGlzIG1hY09TLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBJc01hYygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gd2luZG93Ll93YWlscy5lbnZpcm9ubWVudC5PUyA9PT0gXCJkYXJ3aW5cIjtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgYXJjaGl0ZWN0dXJlIGlzIEFNRDY0LlxuICpcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgYXJjaGl0ZWN0dXJlIGlzIEFNRDY0LCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBJc0FNRDY0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB3aW5kb3cuX3dhaWxzLmVudmlyb25tZW50LkFyY2ggPT09IFwiYW1kNjRcIjtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGN1cnJlbnQgYXJjaGl0ZWN0dXJlIGlzIEFSTS5cbiAqXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBjdXJyZW50IGFyY2hpdGVjdHVyZSBpcyBBUk0sIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIElzQVJNKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB3aW5kb3cuX3dhaWxzLmVudmlyb25tZW50LkFyY2ggPT09IFwiYXJtXCI7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBjdXJyZW50IGVudmlyb25tZW50IGlzIEFSTTY0IGFyY2hpdGVjdHVyZS5cbiAqXG4gKiBAcmV0dXJucyBSZXR1cm5zIHRydWUgaWYgdGhlIGVudmlyb25tZW50IGlzIEFSTTY0IGFyY2hpdGVjdHVyZSwgb3RoZXJ3aXNlIHJldHVybnMgZmFsc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBJc0FSTTY0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB3aW5kb3cuX3dhaWxzLmVudmlyb25tZW50LkFyY2ggPT09IFwiYXJtNjRcIjtcbn1cblxuLyoqXG4gKiBSZXBvcnRzIHdoZXRoZXIgdGhlIGFwcCBpcyBiZWluZyBydW4gaW4gZGVidWcgbW9kZS5cbiAqXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBhcHAgaXMgYmVpbmcgcnVuIGluIGRlYnVnIG1vZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBJc0RlYnVnKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBCb29sZWFuKHdpbmRvdy5fd2FpbHMuZW52aXJvbm1lbnQuRGVidWcpO1xufVxuXG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbmltcG9ydCB7IG5ld1J1bnRpbWVDYWxsZXIsIG9iamVjdE5hbWVzIH0gZnJvbSBcIi4vcnVudGltZS5qc1wiO1xuaW1wb3J0IHsgSXNEZWJ1ZyB9IGZyb20gXCIuL3N5c3RlbS5qc1wiO1xuaW1wb3J0IHsgZXZlbnRUYXJnZXQgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG4vLyBzZXR1cFxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgY29udGV4dE1lbnVIYW5kbGVyKTtcblxuY29uc3QgY2FsbCA9IG5ld1J1bnRpbWVDYWxsZXIob2JqZWN0TmFtZXMuQ29udGV4dE1lbnUpO1xuXG5jb25zdCBDb250ZXh0TWVudU9wZW4gPSAwO1xuXG5mdW5jdGlvbiBvcGVuQ29udGV4dE1lbnUoaWQ6IHN0cmluZywgeDogbnVtYmVyLCB5OiBudW1iZXIsIGRhdGE6IGFueSk6IHZvaWQge1xuICAgIHZvaWQgY2FsbChDb250ZXh0TWVudU9wZW4sIHtpZCwgeCwgeSwgZGF0YX0pO1xufVxuXG5mdW5jdGlvbiBjb250ZXh0TWVudUhhbmRsZXIoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudFRhcmdldChldmVudCk7XG5cbiAgICAvLyBDaGVjayBmb3IgY3VzdG9tIGNvbnRleHQgbWVudVxuICAgIGNvbnN0IGN1c3RvbUNvbnRleHRNZW51ID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUodGFyZ2V0KS5nZXRQcm9wZXJ0eVZhbHVlKFwiLS1jdXN0b20tY29udGV4dG1lbnVcIikudHJpbSgpO1xuXG4gICAgaWYgKGN1c3RvbUNvbnRleHRNZW51KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXQpLmdldFByb3BlcnR5VmFsdWUoXCItLWN1c3RvbS1jb250ZXh0bWVudS1kYXRhXCIpO1xuICAgICAgICBvcGVuQ29udGV4dE1lbnUoY3VzdG9tQ29udGV4dE1lbnUsIGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFksIGRhdGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHByb2Nlc3NEZWZhdWx0Q29udGV4dE1lbnUoZXZlbnQsIHRhcmdldCk7XG4gICAgfVxufVxuXG5cbi8qXG4tLWRlZmF1bHQtY29udGV4dG1lbnU6IGF1dG87IChkZWZhdWx0KSB3aWxsIHNob3cgdGhlIGRlZmF1bHQgY29udGV4dCBtZW51IGlmIGNvbnRlbnRFZGl0YWJsZSBpcyB0cnVlIE9SIHRleHQgaGFzIGJlZW4gc2VsZWN0ZWQgT1IgZWxlbWVudCBpcyBpbnB1dCBvciB0ZXh0YXJlYVxuLS1kZWZhdWx0LWNvbnRleHRtZW51OiBzaG93OyB3aWxsIGFsd2F5cyBzaG93IHRoZSBkZWZhdWx0IGNvbnRleHQgbWVudVxuLS1kZWZhdWx0LWNvbnRleHRtZW51OiBoaWRlOyB3aWxsIGFsd2F5cyBoaWRlIHRoZSBkZWZhdWx0IGNvbnRleHQgbWVudVxuXG5UaGlzIHJ1bGUgaXMgaW5oZXJpdGVkIGxpa2Ugbm9ybWFsIENTUyBydWxlcywgc28gbmVzdGluZyB3b3JrcyBhcyBleHBlY3RlZFxuKi9cbmZ1bmN0aW9uIHByb2Nlc3NEZWZhdWx0Q29udGV4dE1lbnUoZXZlbnQ6IE1vdXNlRXZlbnQsIHRhcmdldDogSFRNTEVsZW1lbnQpIHtcbiAgICAvLyBEZWJ1ZyBidWlsZHMgYWx3YXlzIHNob3cgdGhlIG1lbnVcbiAgICBpZiAoSXNEZWJ1ZygpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBQcm9jZXNzIGRlZmF1bHQgY29udGV4dCBtZW51XG4gICAgc3dpdGNoICh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXQpLmdldFByb3BlcnR5VmFsdWUoXCItLWRlZmF1bHQtY29udGV4dG1lbnVcIikudHJpbSgpKSB7XG4gICAgICAgIGNhc2UgJ3Nob3cnOlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjYXNlICdoaWRlJzpcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgY29udGVudEVkaXRhYmxlIGlzIHRydWVcbiAgICBpZiAodGFyZ2V0LmlzQ29udGVudEVkaXRhYmxlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB0ZXh0IGhhcyBiZWVuIHNlbGVjdGVkXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgIGNvbnN0IGhhc1NlbGVjdGlvbiA9IHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24udG9TdHJpbmcoKS5sZW5ndGggPiAwO1xuICAgIGlmIChoYXNTZWxlY3Rpb24pIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3Rpb24ucmFuZ2VDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KGkpO1xuICAgICAgICAgICAgY29uc3QgcmVjdHMgPSByYW5nZS5nZXRDbGllbnRSZWN0cygpO1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByZWN0cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlY3QgPSByZWN0c1tqXTtcbiAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludChyZWN0LmxlZnQsIHJlY3QudG9wKSA9PT0gdGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB0YWcgaXMgaW5wdXQgb3IgdGV4dGFyZWEuXG4gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgfHwgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTFRleHRBcmVhRWxlbWVudCkge1xuICAgICAgICBpZiAoaGFzU2VsZWN0aW9uIHx8ICghdGFyZ2V0LnJlYWRPbmx5ICYmICF0YXJnZXQuZGlzYWJsZWQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBoaWRlIGRlZmF1bHQgY29udGV4dCBtZW51XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbn1cbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSBmcm9tIHRoZSBmbGFnIG1hcC5cbiAqXG4gKiBAcGFyYW0ga2V5IC0gVGhlIGtleSB0byByZXRyaWV2ZSB0aGUgdmFsdWUgZm9yLlxuICogQHJldHVybiBUaGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gR2V0RmxhZyhrZXk6IHN0cmluZyk6IGFueSB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5fd2FpbHMuZmxhZ3Nba2V5XTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuYWJsZSB0byByZXRyaWV2ZSBmbGFnICdcIiArIGtleSArIFwiJzogXCIgKyBlLCB7IGNhdXNlOiBlIH0pO1xuICAgIH1cbn1cbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuaW1wb3J0IHsgaW52b2tlLCBJc1dpbmRvd3MgfSBmcm9tIFwiLi9zeXN0ZW0uanNcIjtcbmltcG9ydCB7IEdldEZsYWcgfSBmcm9tIFwiLi9mbGFncy5qc1wiO1xuaW1wb3J0IHsgY2FuVHJhY2tCdXR0b25zLCBldmVudFRhcmdldCB9IGZyb20gXCIuL3V0aWxzLmpzXCI7XG5cbi8vIFNldHVwXG5sZXQgY2FuRHJhZyA9IGZhbHNlO1xubGV0IGRyYWdnaW5nID0gZmFsc2U7XG5cbmxldCByZXNpemFibGUgPSBmYWxzZTtcbmxldCBjYW5SZXNpemUgPSBmYWxzZTtcbmxldCByZXNpemluZyA9IGZhbHNlO1xubGV0IHJlc2l6ZUVkZ2U6IHN0cmluZyA9IFwiXCI7XG5sZXQgZGVmYXVsdEN1cnNvciA9IFwiYXV0b1wiO1xuXG5sZXQgYnV0dG9ucyA9IDA7XG5jb25zdCBidXR0b25zVHJhY2tlZCA9IGNhblRyYWNrQnV0dG9ucygpO1xuXG53aW5kb3cuX3dhaWxzID0gd2luZG93Ll93YWlscyB8fCB7fTtcbndpbmRvdy5fd2FpbHMuc2V0UmVzaXphYmxlID0gKHZhbHVlOiBib29sZWFuKTogdm9pZCA9PiB7XG4gICAgcmVzaXphYmxlID0gdmFsdWU7XG4gICAgaWYgKCFyZXNpemFibGUpIHtcbiAgICAgICAgLy8gU3RvcCByZXNpemluZyBpZiBpbiBwcm9ncmVzcy5cbiAgICAgICAgY2FuUmVzaXplID0gcmVzaXppbmcgPSBmYWxzZTtcbiAgICAgICAgc2V0UmVzaXplKCk7XG4gICAgfVxufTtcblxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHVwZGF0ZSwgeyBjYXB0dXJlOiB0cnVlIH0pO1xud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHVwZGF0ZSwgeyBjYXB0dXJlOiB0cnVlIH0pO1xud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB1cGRhdGUsIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbmZvciAoY29uc3QgZXYgb2YgWydjbGljaycsICdjb250ZXh0bWVudScsICdkYmxjbGljayddKSB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoZXYsIHN1cHByZXNzRXZlbnQsIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbn1cblxuZnVuY3Rpb24gc3VwcHJlc3NFdmVudChldmVudDogRXZlbnQpIHtcbiAgICAvLyBTdXBwcmVzcyBjbGljayBldmVudHMgd2hpbGUgcmVzaXppbmcgb3IgZHJhZ2dpbmcuXG4gICAgaWYgKGRyYWdnaW5nIHx8IHJlc2l6aW5nKSB7XG4gICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG59XG5cbi8vIFVzZSBjb25zdGFudHMgdG8gYXZvaWQgY29tcGFyaW5nIHN0cmluZ3MgbXVsdGlwbGUgdGltZXMuXG5jb25zdCBNb3VzZURvd24gPSAwO1xuY29uc3QgTW91c2VVcCAgID0gMTtcbmNvbnN0IE1vdXNlTW92ZSA9IDI7XG5cbmZ1bmN0aW9uIHVwZGF0ZShldmVudDogTW91c2VFdmVudCkge1xuICAgIC8vIFdpbmRvd3Mgc3VwcHJlc3NlcyBtb3VzZSBldmVudHMgYXQgdGhlIGVuZCBvZiBkcmFnZ2luZyBvciByZXNpemluZyxcbiAgICAvLyBzbyB3ZSBuZWVkIHRvIGJlIHNtYXJ0IGFuZCBzeW50aGVzaXplIGJ1dHRvbiBldmVudHMuXG5cbiAgICBsZXQgZXZlbnRUeXBlOiBudW1iZXIsIGV2ZW50QnV0dG9ucyA9IGV2ZW50LmJ1dHRvbnM7XG4gICAgc3dpdGNoIChldmVudC50eXBlKSB7XG4gICAgICAgIGNhc2UgJ21vdXNlZG93bic6XG4gICAgICAgICAgICBldmVudFR5cGUgPSBNb3VzZURvd247XG4gICAgICAgICAgICBpZiAoIWJ1dHRvbnNUcmFja2VkKSB7IGV2ZW50QnV0dG9ucyA9IGJ1dHRvbnMgfCAoMSA8PCBldmVudC5idXR0b24pOyB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbW91c2V1cCc6XG4gICAgICAgICAgICBldmVudFR5cGUgPSBNb3VzZVVwO1xuICAgICAgICAgICAgaWYgKCFidXR0b25zVHJhY2tlZCkgeyBldmVudEJ1dHRvbnMgPSBidXR0b25zICYgfigxIDw8IGV2ZW50LmJ1dHRvbik7IH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgZXZlbnRUeXBlID0gTW91c2VNb3ZlO1xuICAgICAgICAgICAgaWYgKCFidXR0b25zVHJhY2tlZCkgeyBldmVudEJ1dHRvbnMgPSBidXR0b25zOyB9XG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBsZXQgcmVsZWFzZWQgPSBidXR0b25zICYgfmV2ZW50QnV0dG9ucztcbiAgICBsZXQgcHJlc3NlZCA9IGV2ZW50QnV0dG9ucyAmIH5idXR0b25zO1xuXG4gICAgYnV0dG9ucyA9IGV2ZW50QnV0dG9ucztcblxuICAgIC8vIFN5bnRoZXNpemUgYSByZWxlYXNlLXByZXNzIHNlcXVlbmNlIGlmIHdlIGRldGVjdCBhIHByZXNzIG9mIGFuIGFscmVhZHkgcHJlc3NlZCBidXR0b24uXG4gICAgaWYgKGV2ZW50VHlwZSA9PT0gTW91c2VEb3duICYmICEocHJlc3NlZCAmIGV2ZW50LmJ1dHRvbikpIHtcbiAgICAgICAgcmVsZWFzZWQgfD0gKDEgPDwgZXZlbnQuYnV0dG9uKTtcbiAgICAgICAgcHJlc3NlZCB8PSAoMSA8PCBldmVudC5idXR0b24pO1xuICAgIH1cblxuICAgIC8vIFN1cHByZXNzIGFsbCBidXR0b24gZXZlbnRzIGR1cmluZyBkcmFnZ2luZyBhbmQgcmVzaXppbmcsXG4gICAgLy8gdW5sZXNzIHRoaXMgaXMgYSBtb3VzZXVwIGV2ZW50IHRoYXQgaXMgZW5kaW5nIGEgZHJhZyBhY3Rpb24uXG4gICAgaWYgKFxuICAgICAgICBldmVudFR5cGUgIT09IE1vdXNlTW92ZSAvLyBGYXN0IHBhdGggZm9yIG1vdXNlbW92ZVxuICAgICAgICAmJiByZXNpemluZ1xuICAgICAgICB8fCAoXG4gICAgICAgICAgICBkcmFnZ2luZ1xuICAgICAgICAgICAgJiYgKFxuICAgICAgICAgICAgICAgIGV2ZW50VHlwZSA9PT0gTW91c2VEb3duXG4gICAgICAgICAgICAgICAgfHwgZXZlbnQuYnV0dG9uICE9PSAwXG4gICAgICAgICAgICApXG4gICAgICAgIClcbiAgICApIHtcbiAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSByZWxlYXNlc1xuICAgIGlmIChyZWxlYXNlZCAmIDEpIHsgcHJpbWFyeVVwKGV2ZW50KTsgfVxuICAgIC8vIEhhbmRsZSBwcmVzc2VzXG4gICAgaWYgKHByZXNzZWQgJiAxKSB7IHByaW1hcnlEb3duKGV2ZW50KTsgfVxuXG4gICAgLy8gSGFuZGxlIG1vdXNlbW92ZVxuICAgIGlmIChldmVudFR5cGUgPT09IE1vdXNlTW92ZSkgeyBvbk1vdXNlTW92ZShldmVudCk7IH07XG59XG5cbmZ1bmN0aW9uIHByaW1hcnlEb3duKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgLy8gUmVzZXQgcmVhZGluZXNzIHN0YXRlLlxuICAgIGNhbkRyYWcgPSBmYWxzZTtcbiAgICBjYW5SZXNpemUgPSBmYWxzZTtcblxuICAgIC8vIElnbm9yZSByZXBlYXRlZCBjbGlja3Mgb24gbWFjT1MgYW5kIExpbnV4LlxuICAgIGlmICghSXNXaW5kb3dzKCkpIHtcbiAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdtb3VzZWRvd24nICYmIGV2ZW50LmJ1dHRvbiA9PT0gMCAmJiBldmVudC5kZXRhaWwgIT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyZXNpemVFZGdlKSB7XG4gICAgICAgIC8vIFJlYWR5IHRvIHJlc2l6ZSBpZiB0aGUgcHJpbWFyeSBidXR0b24gd2FzIHByZXNzZWQgZm9yIHRoZSBmaXJzdCB0aW1lLlxuICAgICAgICBjYW5SZXNpemUgPSB0cnVlO1xuICAgICAgICAvLyBEbyBub3Qgc3RhcnQgZHJhZyBvcGVyYXRpb25zIHdoZW4gb24gcmVzaXplIGVkZ2VzLlxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUmV0cmlldmUgdGFyZ2V0IGVsZW1lbnRcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudFRhcmdldChldmVudCk7XG5cbiAgICAvLyBSZWFkeSB0byBkcmFnIGlmIHRoZSBwcmltYXJ5IGJ1dHRvbiB3YXMgcHJlc3NlZCBmb3IgdGhlIGZpcnN0IHRpbWUgb24gYSBkcmFnZ2FibGUgZWxlbWVudC5cbiAgICAvLyBJZ25vcmUgY2xpY2tzIG9uIHRoZSBzY3JvbGxiYXIuXG4gICAgY29uc3Qgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXQpO1xuICAgIGNhbkRyYWcgPSAoXG4gICAgICAgIHN0eWxlLmdldFByb3BlcnR5VmFsdWUoXCItLXdhaWxzLWRyYWdnYWJsZVwiKS50cmltKCkgPT09IFwiZHJhZ1wiXG4gICAgICAgICYmIChcbiAgICAgICAgICAgIGV2ZW50Lm9mZnNldFggLSBwYXJzZUZsb2F0KHN0eWxlLnBhZGRpbmdMZWZ0KSA8IHRhcmdldC5jbGllbnRXaWR0aFxuICAgICAgICAgICAgJiYgZXZlbnQub2Zmc2V0WSAtIHBhcnNlRmxvYXQoc3R5bGUucGFkZGluZ1RvcCkgPCB0YXJnZXQuY2xpZW50SGVpZ2h0XG4gICAgICAgIClcbiAgICApO1xufVxuXG5mdW5jdGlvbiBwcmltYXJ5VXAoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICAvLyBTdG9wIGRyYWdnaW5nIGFuZCByZXNpemluZy5cbiAgICBjYW5EcmFnID0gZmFsc2U7XG4gICAgZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICBjYW5SZXNpemUgPSBmYWxzZTtcbiAgICByZXNpemluZyA9IGZhbHNlO1xufVxuXG5jb25zdCBjdXJzb3JGb3JFZGdlID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgXCJzZS1yZXNpemVcIjogXCJud3NlLXJlc2l6ZVwiLFxuICAgIFwic3ctcmVzaXplXCI6IFwibmVzdy1yZXNpemVcIixcbiAgICBcIm53LXJlc2l6ZVwiOiBcIm53c2UtcmVzaXplXCIsXG4gICAgXCJuZS1yZXNpemVcIjogXCJuZXN3LXJlc2l6ZVwiLFxuICAgIFwidy1yZXNpemVcIjogXCJldy1yZXNpemVcIixcbiAgICBcIm4tcmVzaXplXCI6IFwibnMtcmVzaXplXCIsXG4gICAgXCJzLXJlc2l6ZVwiOiBcIm5zLXJlc2l6ZVwiLFxuICAgIFwiZS1yZXNpemVcIjogXCJldy1yZXNpemVcIixcbn0pXG5cbmZ1bmN0aW9uIHNldFJlc2l6ZShlZGdlPzoga2V5b2YgdHlwZW9mIGN1cnNvckZvckVkZ2UpOiB2b2lkIHtcbiAgICBpZiAoZWRnZSkge1xuICAgICAgICBpZiAoIXJlc2l6ZUVkZ2UpIHsgZGVmYXVsdEN1cnNvciA9IGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yOyB9XG4gICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yID0gY3Vyc29yRm9yRWRnZVtlZGdlXTtcbiAgICB9IGVsc2UgaWYgKCFlZGdlICYmIHJlc2l6ZUVkZ2UpIHtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3IgPSBkZWZhdWx0Q3Vyc29yO1xuICAgIH1cblxuICAgIHJlc2l6ZUVkZ2UgPSBlZGdlIHx8IFwiXCI7XG59XG5cbmZ1bmN0aW9uIG9uTW91c2VNb3ZlKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGNhblJlc2l6ZSAmJiByZXNpemVFZGdlKSB7XG4gICAgICAgIC8vIFN0YXJ0IHJlc2l6aW5nLlxuICAgICAgICByZXNpemluZyA9IHRydWU7XG4gICAgICAgIGludm9rZShcIndhaWxzOnJlc2l6ZTpcIiArIHJlc2l6ZUVkZ2UpO1xuICAgIH0gZWxzZSBpZiAoY2FuRHJhZykge1xuICAgICAgICAvLyBTdGFydCBkcmFnZ2luZy5cbiAgICAgICAgZHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgICBpbnZva2UoXCJ3YWlsczpkcmFnXCIpO1xuICAgIH1cblxuICAgIGlmIChkcmFnZ2luZyB8fCByZXNpemluZykge1xuICAgICAgICAvLyBFaXRoZXIgZHJhZyBvciByZXNpemUgaXMgb25nb2luZyxcbiAgICAgICAgLy8gcmVzZXQgcmVhZGluZXNzIGFuZCBzdG9wIHByb2Nlc3NpbmcuXG4gICAgICAgIGNhbkRyYWcgPSBjYW5SZXNpemUgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghcmVzaXphYmxlIHx8ICFJc1dpbmRvd3MoKSkge1xuICAgICAgICBpZiAocmVzaXplRWRnZSkgeyBzZXRSZXNpemUoKTsgfVxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmVzaXplSGFuZGxlSGVpZ2h0ID0gR2V0RmxhZyhcInN5c3RlbS5yZXNpemVIYW5kbGVIZWlnaHRcIikgfHwgNTtcbiAgICBjb25zdCByZXNpemVIYW5kbGVXaWR0aCA9IEdldEZsYWcoXCJzeXN0ZW0ucmVzaXplSGFuZGxlV2lkdGhcIikgfHwgNTtcblxuICAgIC8vIEV4dHJhIHBpeGVscyBmb3IgdGhlIGNvcm5lciBhcmVhcy5cbiAgICBjb25zdCBjb3JuZXJFeHRyYSA9IEdldEZsYWcoXCJyZXNpemVDb3JuZXJFeHRyYVwiKSB8fCAxMDtcblxuICAgIGNvbnN0IHJpZ2h0Qm9yZGVyID0gKHdpbmRvdy5vdXRlcldpZHRoIC0gZXZlbnQuY2xpZW50WCkgPCByZXNpemVIYW5kbGVXaWR0aDtcbiAgICBjb25zdCBsZWZ0Qm9yZGVyID0gZXZlbnQuY2xpZW50WCA8IHJlc2l6ZUhhbmRsZVdpZHRoO1xuICAgIGNvbnN0IHRvcEJvcmRlciA9IGV2ZW50LmNsaWVudFkgPCByZXNpemVIYW5kbGVIZWlnaHQ7XG4gICAgY29uc3QgYm90dG9tQm9yZGVyID0gKHdpbmRvdy5vdXRlckhlaWdodCAtIGV2ZW50LmNsaWVudFkpIDwgcmVzaXplSGFuZGxlSGVpZ2h0O1xuXG4gICAgLy8gQWRqdXN0IGZvciBjb3JuZXIgYXJlYXMuXG4gICAgY29uc3QgcmlnaHRDb3JuZXIgPSAod2luZG93Lm91dGVyV2lkdGggLSBldmVudC5jbGllbnRYKSA8IChyZXNpemVIYW5kbGVXaWR0aCArIGNvcm5lckV4dHJhKTtcbiAgICBjb25zdCBsZWZ0Q29ybmVyID0gZXZlbnQuY2xpZW50WCA8IChyZXNpemVIYW5kbGVXaWR0aCArIGNvcm5lckV4dHJhKTtcbiAgICBjb25zdCB0b3BDb3JuZXIgPSBldmVudC5jbGllbnRZIDwgKHJlc2l6ZUhhbmRsZUhlaWdodCArIGNvcm5lckV4dHJhKTtcbiAgICBjb25zdCBib3R0b21Db3JuZXIgPSAod2luZG93Lm91dGVySGVpZ2h0IC0gZXZlbnQuY2xpZW50WSkgPCAocmVzaXplSGFuZGxlSGVpZ2h0ICsgY29ybmVyRXh0cmEpO1xuXG4gICAgaWYgKCFsZWZ0Q29ybmVyICYmICF0b3BDb3JuZXIgJiYgIWJvdHRvbUNvcm5lciAmJiAhcmlnaHRDb3JuZXIpIHtcbiAgICAgICAgLy8gT3B0aW1pc2F0aW9uOiBvdXQgb2YgYWxsIGNvcm5lciBhcmVhcyBpbXBsaWVzIG91dCBvZiBib3JkZXJzLlxuICAgICAgICBzZXRSZXNpemUoKTtcbiAgICB9XG4gICAgLy8gRGV0ZWN0IGNvcm5lcnMuXG4gICAgZWxzZSBpZiAocmlnaHRDb3JuZXIgJiYgYm90dG9tQ29ybmVyKSBzZXRSZXNpemUoXCJzZS1yZXNpemVcIik7XG4gICAgZWxzZSBpZiAobGVmdENvcm5lciAmJiBib3R0b21Db3JuZXIpIHNldFJlc2l6ZShcInN3LXJlc2l6ZVwiKTtcbiAgICBlbHNlIGlmIChsZWZ0Q29ybmVyICYmIHRvcENvcm5lcikgc2V0UmVzaXplKFwibnctcmVzaXplXCIpO1xuICAgIGVsc2UgaWYgKHRvcENvcm5lciAmJiByaWdodENvcm5lcikgc2V0UmVzaXplKFwibmUtcmVzaXplXCIpO1xuICAgIC8vIERldGVjdCBib3JkZXJzLlxuICAgIGVsc2UgaWYgKGxlZnRCb3JkZXIpIHNldFJlc2l6ZShcInctcmVzaXplXCIpO1xuICAgIGVsc2UgaWYgKHRvcEJvcmRlcikgc2V0UmVzaXplKFwibi1yZXNpemVcIik7XG4gICAgZWxzZSBpZiAoYm90dG9tQm9yZGVyKSBzZXRSZXNpemUoXCJzLXJlc2l6ZVwiKTtcbiAgICBlbHNlIGlmIChyaWdodEJvcmRlcikgc2V0UmVzaXplKFwiZS1yZXNpemVcIik7XG4gICAgLy8gT3V0IG9mIGJvcmRlciBhcmVhLlxuICAgIGVsc2Ugc2V0UmVzaXplKCk7XG59XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbmltcG9ydCB7IG5ld1J1bnRpbWVDYWxsZXIsIG9iamVjdE5hbWVzIH0gZnJvbSBcIi4vcnVudGltZS5qc1wiO1xuY29uc3QgY2FsbCA9IG5ld1J1bnRpbWVDYWxsZXIob2JqZWN0TmFtZXMuQXBwbGljYXRpb24pO1xuXG5jb25zdCBIaWRlTWV0aG9kID0gMDtcbmNvbnN0IFNob3dNZXRob2QgPSAxO1xuY29uc3QgUXVpdE1ldGhvZCA9IDI7XG5cbi8qKlxuICogSGlkZXMgYSBjZXJ0YWluIG1ldGhvZCBieSBjYWxsaW5nIHRoZSBIaWRlTWV0aG9kIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSGlkZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gY2FsbChIaWRlTWV0aG9kKTtcbn1cblxuLyoqXG4gKiBDYWxscyB0aGUgU2hvd01ldGhvZCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gU2hvdygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gY2FsbChTaG93TWV0aG9kKTtcbn1cblxuLyoqXG4gKiBDYWxscyB0aGUgUXVpdE1ldGhvZCB0byB0ZXJtaW5hdGUgdGhlIHByb2dyYW0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBRdWl0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBjYWxsKFF1aXRNZXRob2QpO1xufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5pbXBvcnQgeyBDYW5jZWxsYWJsZVByb21pc2UsIHR5cGUgQ2FuY2VsbGFibGVQcm9taXNlV2l0aFJlc29sdmVycyB9IGZyb20gXCIuL2NhbmNlbGxhYmxlLmpzXCI7XG5pbXBvcnQgeyBuZXdSdW50aW1lQ2FsbGVyLCBvYmplY3ROYW1lcyB9IGZyb20gXCIuL3J1bnRpbWUuanNcIjtcbmltcG9ydCB7IG5hbm9pZCB9IGZyb20gXCIuL25hbm9pZC5qc1wiO1xuXG4vLyBTZXR1cFxud2luZG93Ll93YWlscyA9IHdpbmRvdy5fd2FpbHMgfHwge307XG53aW5kb3cuX3dhaWxzLmNhbGxSZXN1bHRIYW5kbGVyID0gcmVzdWx0SGFuZGxlcjtcbndpbmRvdy5fd2FpbHMuY2FsbEVycm9ySGFuZGxlciA9IGVycm9ySGFuZGxlcjtcblxudHlwZSBQcm9taXNlUmVzb2x2ZXJzID0gT21pdDxDYW5jZWxsYWJsZVByb21pc2VXaXRoUmVzb2x2ZXJzPGFueT4sIFwicHJvbWlzZVwiIHwgXCJvbmNhbmNlbGxlZFwiPlxuXG5jb25zdCBjYWxsID0gbmV3UnVudGltZUNhbGxlcihvYmplY3ROYW1lcy5DYWxsKTtcbmNvbnN0IGNhbmNlbENhbGwgPSBuZXdSdW50aW1lQ2FsbGVyKG9iamVjdE5hbWVzLkNhbmNlbENhbGwpO1xuY29uc3QgY2FsbFJlc3BvbnNlcyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlUmVzb2x2ZXJzPigpO1xuXG5jb25zdCBDYWxsQmluZGluZyA9IDA7XG5jb25zdCBDYW5jZWxNZXRob2QgPSAwXG5cbi8qKlxuICogSG9sZHMgYWxsIHJlcXVpcmVkIGluZm9ybWF0aW9uIGZvciBhIGJpbmRpbmcgY2FsbC5cbiAqIE1heSBwcm92aWRlIGVpdGhlciBhIG1ldGhvZCBJRCBvciBhIG1ldGhvZCBuYW1lLCBidXQgbm90IGJvdGguXG4gKi9cbmV4cG9ydCB0eXBlIENhbGxPcHRpb25zID0ge1xuICAgIC8qKiBUaGUgbnVtZXJpYyBJRCBvZiB0aGUgYm91bmQgbWV0aG9kIHRvIGNhbGwuICovXG4gICAgbWV0aG9kSUQ6IG51bWJlcjtcbiAgICAvKiogVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBib3VuZCBtZXRob2QgdG8gY2FsbC4gKi9cbiAgICBtZXRob2ROYW1lPzogbmV2ZXI7XG4gICAgLyoqIEFyZ3VtZW50cyB0byBiZSBwYXNzZWQgaW50byB0aGUgYm91bmQgbWV0aG9kLiAqL1xuICAgIGFyZ3M6IGFueVtdO1xufSB8IHtcbiAgICAvKiogVGhlIG51bWVyaWMgSUQgb2YgdGhlIGJvdW5kIG1ldGhvZCB0byBjYWxsLiAqL1xuICAgIG1ldGhvZElEPzogbmV2ZXI7XG4gICAgLyoqIFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgYm91bmQgbWV0aG9kIHRvIGNhbGwuICovXG4gICAgbWV0aG9kTmFtZTogc3RyaW5nO1xuICAgIC8qKiBBcmd1bWVudHMgdG8gYmUgcGFzc2VkIGludG8gdGhlIGJvdW5kIG1ldGhvZC4gKi9cbiAgICBhcmdzOiBhbnlbXTtcbn07XG5cbi8qKlxuICogRXhjZXB0aW9uIGNsYXNzIHRoYXQgd2lsbCBiZSB0aHJvd24gaW4gY2FzZSB0aGUgYm91bmQgbWV0aG9kIHJldHVybnMgYW4gZXJyb3IuXG4gKiBUaGUgdmFsdWUgb2YgdGhlIHtAbGluayBSdW50aW1lRXJyb3IjbmFtZX0gcHJvcGVydHkgaXMgXCJSdW50aW1lRXJyb3JcIi5cbiAqL1xuZXhwb3J0IGNsYXNzIFJ1bnRpbWVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFJ1bnRpbWVFcnJvciBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZSAtIFRoZSBlcnJvciBtZXNzYWdlLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBiZSBmb3J3YXJkZWQgdG8gdGhlIEVycm9yIGNvbnN0cnVjdG9yLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcsIG9wdGlvbnM/OiBFcnJvck9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSwgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiUnVudGltZUVycm9yXCI7XG4gICAgfVxufVxuXG4vKipcbiAqIEhhbmRsZXMgdGhlIHJlc3VsdCBvZiBhIGNhbGwgcmVxdWVzdC5cbiAqXG4gKiBAcGFyYW0gaWQgLSBUaGUgaWQgb2YgdGhlIHJlcXVlc3QgdG8gaGFuZGxlIHRoZSByZXN1bHQgZm9yLlxuICogQHBhcmFtIGRhdGEgLSBUaGUgcmVzdWx0IGRhdGEgb2YgdGhlIHJlcXVlc3QuXG4gKiBAcGFyYW0gaXNKU09OIC0gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRhdGEgaXMgSlNPTiBvciBub3QuXG4gKi9cbmZ1bmN0aW9uIHJlc3VsdEhhbmRsZXIoaWQ6IHN0cmluZywgZGF0YTogc3RyaW5nLCBpc0pTT046IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCByZXNvbHZlcnMgPSBnZXRBbmREZWxldGVSZXNwb25zZShpZCk7XG4gICAgaWYgKCFyZXNvbHZlcnMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghZGF0YSkge1xuICAgICAgICByZXNvbHZlcnMucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgIH0gZWxzZSBpZiAoIWlzSlNPTikge1xuICAgICAgICByZXNvbHZlcnMucmVzb2x2ZShkYXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzb2x2ZXJzLnJlc29sdmUoSlNPTi5wYXJzZShkYXRhKSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgICAgICByZXNvbHZlcnMucmVqZWN0KG5ldyBUeXBlRXJyb3IoXCJjb3VsZCBub3QgcGFyc2UgcmVzdWx0OiBcIiArIGVyci5tZXNzYWdlLCB7IGNhdXNlOiBlcnIgfSkpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIEhhbmRsZXMgdGhlIGVycm9yIGZyb20gYSBjYWxsIHJlcXVlc3QuXG4gKlxuICogQHBhcmFtIGlkIC0gVGhlIGlkIG9mIHRoZSBwcm9taXNlIGhhbmRsZXIuXG4gKiBAcGFyYW0gZGF0YSAtIFRoZSBlcnJvciBkYXRhIHRvIHJlamVjdCB0aGUgcHJvbWlzZSBoYW5kbGVyIHdpdGguXG4gKiBAcGFyYW0gaXNKU09OIC0gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRhdGEgaXMgSlNPTiBvciBub3QuXG4gKi9cbmZ1bmN0aW9uIGVycm9ySGFuZGxlcihpZDogc3RyaW5nLCBkYXRhOiBzdHJpbmcsIGlzSlNPTjogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IHJlc29sdmVycyA9IGdldEFuZERlbGV0ZVJlc3BvbnNlKGlkKTtcbiAgICBpZiAoIXJlc29sdmVycykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFpc0pTT04pIHtcbiAgICAgICAgcmVzb2x2ZXJzLnJlamVjdChuZXcgRXJyb3IoZGF0YSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBlcnJvcjogYW55O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZXJyb3IgPSBKU09OLnBhcnNlKGRhdGEpO1xuICAgICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICAgICAgcmVzb2x2ZXJzLnJlamVjdChuZXcgVHlwZUVycm9yKFwiY291bGQgbm90IHBhcnNlIGVycm9yOiBcIiArIGVyci5tZXNzYWdlLCB7IGNhdXNlOiBlcnIgfSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG9wdGlvbnM6IEVycm9yT3B0aW9ucyA9IHt9O1xuICAgICAgICBpZiAoZXJyb3IuY2F1c2UpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuY2F1c2UgPSBlcnJvci5jYXVzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBleGNlcHRpb247XG4gICAgICAgIHN3aXRjaCAoZXJyb3Iua2luZCkge1xuICAgICAgICAgICAgY2FzZSBcIlJlZmVyZW5jZUVycm9yXCI6XG4gICAgICAgICAgICAgICAgZXhjZXB0aW9uID0gbmV3IFJlZmVyZW5jZUVycm9yKGVycm9yLm1lc3NhZ2UsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIlR5cGVFcnJvclwiOlxuICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiA9IG5ldyBUeXBlRXJyb3IoZXJyb3IubWVzc2FnZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiUnVudGltZUVycm9yXCI6XG4gICAgICAgICAgICAgICAgZXhjZXB0aW9uID0gbmV3IFJ1bnRpbWVFcnJvcihlcnJvci5tZXNzYWdlLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgZXhjZXB0aW9uID0gbmV3IEVycm9yKGVycm9yLm1lc3NhZ2UsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzb2x2ZXJzLnJlamVjdChleGNlcHRpb24pO1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgYW5kIHJlbW92ZXMgdGhlIHJlc3BvbnNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gSUQgZnJvbSB0aGUgY2FsbFJlc3BvbnNlcyBtYXAuXG4gKlxuICogQHBhcmFtIGlkIC0gVGhlIElEIG9mIHRoZSByZXNwb25zZSB0byBiZSByZXRyaWV2ZWQgYW5kIHJlbW92ZWQuXG4gKiBAcmV0dXJucyBUaGUgcmVzcG9uc2Ugb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gSUQsIGlmIGFueS5cbiAqL1xuZnVuY3Rpb24gZ2V0QW5kRGVsZXRlUmVzcG9uc2UoaWQ6IHN0cmluZyk6IFByb21pc2VSZXNvbHZlcnMgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gY2FsbFJlc3BvbnNlcy5nZXQoaWQpO1xuICAgIGNhbGxSZXNwb25zZXMuZGVsZXRlKGlkKTtcbiAgICByZXR1cm4gcmVzcG9uc2U7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgdW5pcXVlIElEIHVzaW5nIHRoZSBuYW5vaWQgbGlicmFyeS5cbiAqXG4gKiBAcmV0dXJucyBBIHVuaXF1ZSBJRCB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBjYWxsUmVzcG9uc2VzIHNldC5cbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVJRCgpOiBzdHJpbmcge1xuICAgIGxldCByZXN1bHQ7XG4gICAgZG8ge1xuICAgICAgICByZXN1bHQgPSBuYW5vaWQoKTtcbiAgICB9IHdoaWxlIChjYWxsUmVzcG9uc2VzLmhhcyhyZXN1bHQpKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIENhbGwgYSBib3VuZCBtZXRob2QgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBjYWxsIG9wdGlvbnMuXG4gKlxuICogSW4gY2FzZSBvZiBmYWlsdXJlLCB0aGUgcmV0dXJuZWQgcHJvbWlzZSB3aWxsIHJlamVjdCB3aXRoIGFuIGV4Y2VwdGlvblxuICogYW1vbmcgUmVmZXJlbmNlRXJyb3IgKHVua25vd24gbWV0aG9kKSwgVHlwZUVycm9yICh3cm9uZyBhcmd1bWVudCBjb3VudCBvciB0eXBlKSxcbiAqIHtAbGluayBSdW50aW1lRXJyb3J9IChtZXRob2QgcmV0dXJuZWQgYW4gZXJyb3IpLCBvciBvdGhlciAobmV0d29yayBvciBpbnRlcm5hbCBlcnJvcnMpLlxuICogVGhlIGV4Y2VwdGlvbiBtaWdodCBoYXZlIGEgXCJjYXVzZVwiIGZpZWxkIHdpdGggdGhlIHZhbHVlIHJldHVybmVkXG4gKiBieSB0aGUgYXBwbGljYXRpb24tIG9yIHNlcnZpY2UtbGV2ZWwgZXJyb3IgbWFyc2hhbGluZyBmdW5jdGlvbnMuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBBIG1ldGhvZCBjYWxsIGRlc2NyaXB0b3IuXG4gKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIHRoZSBjYWxsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQ2FsbChvcHRpb25zOiBDYWxsT3B0aW9ucyk6IENhbmNlbGxhYmxlUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBpZCA9IGdlbmVyYXRlSUQoKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IENhbmNlbGxhYmxlUHJvbWlzZS53aXRoUmVzb2x2ZXJzPGFueT4oKTtcbiAgICBjYWxsUmVzcG9uc2VzLnNldChpZCwgeyByZXNvbHZlOiByZXN1bHQucmVzb2x2ZSwgcmVqZWN0OiByZXN1bHQucmVqZWN0IH0pO1xuXG4gICAgY29uc3QgcmVxdWVzdCA9IGNhbGwoQ2FsbEJpbmRpbmcsIE9iamVjdC5hc3NpZ24oeyBcImNhbGwtaWRcIjogaWQgfSwgb3B0aW9ucykpO1xuICAgIGxldCBydW5uaW5nID0gZmFsc2U7XG5cbiAgICByZXF1ZXN0LnRoZW4oKCkgPT4ge1xuICAgICAgICBydW5uaW5nID0gdHJ1ZTtcbiAgICB9LCAoZXJyKSA9PiB7XG4gICAgICAgIGNhbGxSZXNwb25zZXMuZGVsZXRlKGlkKTtcbiAgICAgICAgcmVzdWx0LnJlamVjdChlcnIpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgY2FuY2VsID0gKCkgPT4ge1xuICAgICAgICBjYWxsUmVzcG9uc2VzLmRlbGV0ZShpZCk7XG4gICAgICAgIHJldHVybiBjYW5jZWxDYWxsKENhbmNlbE1ldGhvZCwge1wiY2FsbC1pZFwiOiBpZH0pLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciB3aGlsZSByZXF1ZXN0aW5nIGJpbmRpbmcgY2FsbCBjYW5jZWxsYXRpb246XCIsIGVycik7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICByZXN1bHQub25jYW5jZWxsZWQgPSAoKSA9PiB7XG4gICAgICAgIGlmIChydW5uaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FuY2VsKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcmVxdWVzdC50aGVuKGNhbmNlbCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIHJlc3VsdC5wcm9taXNlO1xufVxuXG4vKipcbiAqIENhbGxzIGEgYm91bmQgbWV0aG9kIGJ5IG5hbWUgd2l0aCB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50cy5cbiAqIFNlZSB7QGxpbmsgQ2FsbH0gZm9yIGRldGFpbHMuXG4gKlxuICogQHBhcmFtIG1ldGhvZE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgbWV0aG9kIGluIHRoZSBmb3JtYXQgJ3BhY2thZ2Uuc3RydWN0Lm1ldGhvZCcuXG4gKiBAcGFyYW0gYXJncyAtIFRoZSBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgbWV0aG9kLlxuICogQHJldHVybnMgVGhlIHJlc3VsdCBvZiB0aGUgbWV0aG9kIGNhbGwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBCeU5hbWUobWV0aG9kTmFtZTogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IENhbmNlbGxhYmxlUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gQ2FsbCh7IG1ldGhvZE5hbWUsIGFyZ3MgfSk7XG59XG5cbi8qKlxuICogQ2FsbHMgYSBtZXRob2QgYnkgaXRzIG51bWVyaWMgSUQgd2l0aCB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50cy5cbiAqIFNlZSB7QGxpbmsgQ2FsbH0gZm9yIGRldGFpbHMuXG4gKlxuICogQHBhcmFtIG1ldGhvZElEIC0gVGhlIElEIG9mIHRoZSBtZXRob2QgdG8gY2FsbC5cbiAqIEBwYXJhbSBhcmdzIC0gVGhlIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBtZXRob2QuXG4gKiBAcmV0dXJuIFRoZSByZXN1bHQgb2YgdGhlIG1ldGhvZCBjYWxsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQnlJRChtZXRob2RJRDogbnVtYmVyLCAuLi5hcmdzOiBhbnlbXSk6IENhbmNlbGxhYmxlUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gQ2FsbCh7IG1ldGhvZElELCBhcmdzIH0pO1xufVxuIiwgIi8vIFNvdXJjZTogaHR0cHM6Ly9naXRodWIuY29tL2luc3BlY3QtanMvaXMtY2FsbGFibGVcblxuLy8gVGhlIE1JVCBMaWNlbnNlIChNSVQpXG4vL1xuLy8gQ29weXJpZ2h0IChjKSAyMDE1IEpvcmRhbiBIYXJiYW5kXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuLy8gY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4vLyBTT0ZUV0FSRS5cblxudmFyIGZuVG9TdHIgPSBGdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgcmVmbGVjdEFwcGx5OiB0eXBlb2YgUmVmbGVjdC5hcHBseSB8IGZhbHNlIHwgbnVsbCA9IHR5cGVvZiBSZWZsZWN0ID09PSAnb2JqZWN0JyAmJiBSZWZsZWN0ICE9PSBudWxsICYmIFJlZmxlY3QuYXBwbHk7XG52YXIgYmFkQXJyYXlMaWtlOiBhbnk7XG52YXIgaXNDYWxsYWJsZU1hcmtlcjogYW55O1xuaWYgKHR5cGVvZiByZWZsZWN0QXBwbHkgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRyeSB7XG4gICAgICAgIGJhZEFycmF5TGlrZSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ2xlbmd0aCcsIHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRocm93IGlzQ2FsbGFibGVNYXJrZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpc0NhbGxhYmxlTWFya2VyID0ge307XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby10aHJvdy1saXRlcmFsXG4gICAgICAgIHJlZmxlY3RBcHBseShmdW5jdGlvbiAoKSB7IHRocm93IDQyOyB9LCBudWxsLCBiYWRBcnJheUxpa2UpO1xuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgaWYgKF8gIT09IGlzQ2FsbGFibGVNYXJrZXIpIHtcbiAgICAgICAgICAgIHJlZmxlY3RBcHBseSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG59IGVsc2Uge1xuICAgIHJlZmxlY3RBcHBseSA9IG51bGw7XG59XG5cbnZhciBjb25zdHJ1Y3RvclJlZ2V4ID0gL15cXHMqY2xhc3NcXGIvO1xudmFyIGlzRVM2Q2xhc3NGbiA9IGZ1bmN0aW9uIGlzRVM2Q2xhc3NGdW5jdGlvbih2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgICAgdmFyIGZuU3RyID0gZm5Ub1N0ci5jYWxsKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yUmVnZXgudGVzdChmblN0cik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7IC8vIG5vdCBhIGZ1bmN0aW9uXG4gICAgfVxufTtcblxudmFyIHRyeUZ1bmN0aW9uT2JqZWN0ID0gZnVuY3Rpb24gdHJ5RnVuY3Rpb25Ub1N0cih2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKGlzRVM2Q2xhc3NGbih2YWx1ZSkpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgICAgIGZuVG9TdHIuY2FsbCh2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn07XG52YXIgdG9TdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyIG9iamVjdENsYXNzID0gJ1tvYmplY3QgT2JqZWN0XSc7XG52YXIgZm5DbGFzcyA9ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG52YXIgZ2VuQ2xhc3MgPSAnW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0nO1xudmFyIGRkYUNsYXNzID0gJ1tvYmplY3QgSFRNTEFsbENvbGxlY3Rpb25dJzsgLy8gSUUgMTFcbnZhciBkZGFDbGFzczIgPSAnW29iamVjdCBIVE1MIGRvY3VtZW50LmFsbCBjbGFzc10nO1xudmFyIGRkYUNsYXNzMyA9ICdbb2JqZWN0IEhUTUxDb2xsZWN0aW9uXSc7IC8vIElFIDktMTBcbnZhciBoYXNUb1N0cmluZ1RhZyA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgISFTeW1ib2wudG9TdHJpbmdUYWc7IC8vIGJldHRlcjogdXNlIGBoYXMtdG9zdHJpbmd0YWdgXG5cbnZhciBpc0lFNjggPSAhKDAgaW4gWyxdKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zcGFyc2UtYXJyYXlzLCBjb21tYS1zcGFjaW5nXG5cbnZhciBpc0REQTogKHZhbHVlOiBhbnkpID0+IGJvb2xlYW4gPSBmdW5jdGlvbiBpc0RvY3VtZW50RG90QWxsKCkgeyByZXR1cm4gZmFsc2U7IH07XG5pZiAodHlwZW9mIGRvY3VtZW50ID09PSAnb2JqZWN0Jykge1xuICAgIC8vIEZpcmVmb3ggMyBjYW5vbmljYWxpemVzIEREQSB0byB1bmRlZmluZWQgd2hlbiBpdCdzIG5vdCBhY2Nlc3NlZCBkaXJlY3RseVxuICAgIHZhciBhbGwgPSBkb2N1bWVudC5hbGw7XG4gICAgaWYgKHRvU3RyLmNhbGwoYWxsKSA9PT0gdG9TdHIuY2FsbChkb2N1bWVudC5hbGwpKSB7XG4gICAgICAgIGlzRERBID0gZnVuY3Rpb24gaXNEb2N1bWVudERvdEFsbCh2YWx1ZSkge1xuICAgICAgICAgICAgLyogZ2xvYmFscyBkb2N1bWVudDogZmFsc2UgKi9cbiAgICAgICAgICAgIC8vIGluIElFIDYtOCwgdHlwZW9mIGRvY3VtZW50LmFsbCBpcyBcIm9iamVjdFwiIGFuZCBpdCdzIHRydXRoeVxuICAgICAgICAgICAgaWYgKChpc0lFNjggfHwgIXZhbHVlKSAmJiAodHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzdHIgPSB0b1N0ci5jYWxsKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ciA9PT0gZGRhQ2xhc3NcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IHN0ciA9PT0gZGRhQ2xhc3MyXG4gICAgICAgICAgICAgICAgICAgICAgICB8fCBzdHIgPT09IGRkYUNsYXNzMyAvLyBvcGVyYSAxMi4xNlxuICAgICAgICAgICAgICAgICAgICAgICAgfHwgc3RyID09PSBvYmplY3RDbGFzcyAvLyBJRSA2LThcbiAgICAgICAgICAgICAgICAgICAgKSAmJiB2YWx1ZSgnJykgPT0gbnVsbDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBlcWVxZXFcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7IC8qKi8gfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9O1xuICAgIH1cbn1cblxuZnVuY3Rpb24gaXNDYWxsYWJsZVJlZkFwcGx5PFQ+KHZhbHVlOiBUIHwgdW5rbm93bik6IHZhbHVlIGlzICguLi5hcmdzOiBhbnlbXSkgPT4gYW55ICB7XG4gICAgaWYgKGlzRERBKHZhbHVlKSkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgIGlmICghdmFsdWUpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIHRyeSB7XG4gICAgICAgIChyZWZsZWN0QXBwbHkgYXMgYW55KSh2YWx1ZSwgbnVsbCwgYmFkQXJyYXlMaWtlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChlICE9PSBpc0NhbGxhYmxlTWFya2VyKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIH1cbiAgICByZXR1cm4gIWlzRVM2Q2xhc3NGbih2YWx1ZSkgJiYgdHJ5RnVuY3Rpb25PYmplY3QodmFsdWUpO1xufVxuXG5mdW5jdGlvbiBpc0NhbGxhYmxlTm9SZWZBcHBseTxUPih2YWx1ZTogVCB8IHVua25vd24pOiB2YWx1ZSBpcyAoLi4uYXJnczogYW55W10pID0+IGFueSB7XG4gICAgaWYgKGlzRERBKHZhbHVlKSkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgIGlmICghdmFsdWUpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGlmIChoYXNUb1N0cmluZ1RhZykgeyByZXR1cm4gdHJ5RnVuY3Rpb25PYmplY3QodmFsdWUpOyB9XG4gICAgaWYgKGlzRVM2Q2xhc3NGbih2YWx1ZSkpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgdmFyIHN0ckNsYXNzID0gdG9TdHIuY2FsbCh2YWx1ZSk7XG4gICAgaWYgKHN0ckNsYXNzICE9PSBmbkNsYXNzICYmIHN0ckNsYXNzICE9PSBnZW5DbGFzcyAmJiAhKC9eXFxbb2JqZWN0IEhUTUwvKS50ZXN0KHN0ckNsYXNzKSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICByZXR1cm4gdHJ5RnVuY3Rpb25PYmplY3QodmFsdWUpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgcmVmbGVjdEFwcGx5ID8gaXNDYWxsYWJsZVJlZkFwcGx5IDogaXNDYWxsYWJsZU5vUmVmQXBwbHk7XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbmltcG9ydCBpc0NhbGxhYmxlIGZyb20gXCIuL2NhbGxhYmxlLmpzXCI7XG5cbi8qKlxuICogRXhjZXB0aW9uIGNsYXNzIHRoYXQgd2lsbCBiZSB1c2VkIGFzIHJlamVjdGlvbiByZWFzb25cbiAqIGluIGNhc2UgYSB7QGxpbmsgQ2FuY2VsbGFibGVQcm9taXNlfSBpcyBjYW5jZWxsZWQgc3VjY2Vzc2Z1bGx5LlxuICpcbiAqIFRoZSB2YWx1ZSBvZiB0aGUge0BsaW5rIG5hbWV9IHByb3BlcnR5IGlzIHRoZSBzdHJpbmcgYFwiQ2FuY2VsRXJyb3JcImAuXG4gKiBUaGUgdmFsdWUgb2YgdGhlIHtAbGluayBjYXVzZX0gcHJvcGVydHkgaXMgdGhlIGNhdXNlIHBhc3NlZCB0byB0aGUgY2FuY2VsIG1ldGhvZCwgaWYgYW55LlxuICovXG5leHBvcnQgY2xhc3MgQ2FuY2VsRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIG5ldyBgQ2FuY2VsRXJyb3JgIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSBtZXNzYWdlIC0gVGhlIGVycm9yIG1lc3NhZ2UuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIGJlIGZvcndhcmRlZCB0byB0aGUgRXJyb3IgY29uc3RydWN0b3IuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobWVzc2FnZT86IHN0cmluZywgb3B0aW9ucz86IEVycm9yT3B0aW9ucykge1xuICAgICAgICBzdXBlcihtZXNzYWdlLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5uYW1lID0gXCJDYW5jZWxFcnJvclwiO1xuICAgIH1cbn1cblxuLyoqXG4gKiBFeGNlcHRpb24gY2xhc3MgdGhhdCB3aWxsIGJlIHJlcG9ydGVkIGFzIGFuIHVuaGFuZGxlZCByZWplY3Rpb25cbiAqIGluIGNhc2UgYSB7QGxpbmsgQ2FuY2VsbGFibGVQcm9taXNlfSByZWplY3RzIGFmdGVyIGJlaW5nIGNhbmNlbGxlZCxcbiAqIG9yIHdoZW4gdGhlIGBvbmNhbmNlbGxlZGAgY2FsbGJhY2sgdGhyb3dzIG9yIHJlamVjdHMuXG4gKlxuICogVGhlIHZhbHVlIG9mIHRoZSB7QGxpbmsgbmFtZX0gcHJvcGVydHkgaXMgdGhlIHN0cmluZyBgXCJDYW5jZWxsZWRSZWplY3Rpb25FcnJvclwiYC5cbiAqIFRoZSB2YWx1ZSBvZiB0aGUge0BsaW5rIGNhdXNlfSBwcm9wZXJ0eSBpcyB0aGUgcmVhc29uIHRoZSBwcm9taXNlIHJlamVjdGVkIHdpdGguXG4gKlxuICogQmVjYXVzZSB0aGUgb3JpZ2luYWwgcHJvbWlzZSB3YXMgY2FuY2VsbGVkLFxuICogYSB3cmFwcGVyIHByb21pc2Ugd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHVuaGFuZGxlZCByZWplY3Rpb24gbGlzdGVuZXIgaW5zdGVhZC5cbiAqIFRoZSB7QGxpbmsgcHJvbWlzZX0gcHJvcGVydHkgaG9sZHMgYSByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmFsIHByb21pc2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBDYW5jZWxsZWRSZWplY3Rpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICAvKipcbiAgICAgKiBIb2xkcyBhIHJlZmVyZW5jZSB0byB0aGUgcHJvbWlzZSB0aGF0IHdhcyBjYW5jZWxsZWQgYW5kIHRoZW4gcmVqZWN0ZWQuXG4gICAgICovXG4gICAgcHJvbWlzZTogQ2FuY2VsbGFibGVQcm9taXNlPHVua25vd24+O1xuXG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIG5ldyBgQ2FuY2VsbGVkUmVqZWN0aW9uRXJyb3JgIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSBwcm9taXNlIC0gVGhlIHByb21pc2UgdGhhdCBjYXVzZWQgdGhlIGVycm9yIG9yaWdpbmFsbHkuXG4gICAgICogQHBhcmFtIHJlYXNvbiAtIFRoZSByZWplY3Rpb24gcmVhc29uLlxuICAgICAqIEBwYXJhbSBpbmZvIC0gQW4gb3B0aW9uYWwgaW5mb3JtYXRpdmUgbWVzc2FnZSBzcGVjaWZ5aW5nIHRoZSBjaXJjdW1zdGFuY2VzIGluIHdoaWNoIHRoZSBlcnJvciB3YXMgdGhyb3duLlxuICAgICAqICAgICAgICAgICAgICAgRGVmYXVsdHMgdG8gdGhlIHN0cmluZyBgXCJVbmhhbmRsZWQgcmVqZWN0aW9uIGluIGNhbmNlbGxlZCBwcm9taXNlLlwiYC5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihwcm9taXNlOiBDYW5jZWxsYWJsZVByb21pc2U8dW5rbm93bj4sIHJlYXNvbj86IGFueSwgaW5mbz86IHN0cmluZykge1xuICAgICAgICBzdXBlcigoaW5mbyA/PyBcIlVuaGFuZGxlZCByZWplY3Rpb24gaW4gY2FuY2VsbGVkIHByb21pc2UuXCIpICsgXCIgUmVhc29uOiBcIiArIGVycm9yTWVzc2FnZShyZWFzb24pLCB7IGNhdXNlOiByZWFzb24gfSk7XG4gICAgICAgIHRoaXMucHJvbWlzZSA9IHByb21pc2U7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiQ2FuY2VsbGVkUmVqZWN0aW9uRXJyb3JcIjtcbiAgICB9XG59XG5cbnR5cGUgQ2FuY2VsbGFibGVQcm9taXNlUmVzb2x2ZXI8VD4gPSAodmFsdWU6IFQgfCBQcm9taXNlTGlrZTxUPiB8IENhbmNlbGxhYmxlUHJvbWlzZUxpa2U8VD4pID0+IHZvaWQ7XG50eXBlIENhbmNlbGxhYmxlUHJvbWlzZVJlamVjdG9yID0gKHJlYXNvbj86IGFueSkgPT4gdm9pZDtcbnR5cGUgQ2FuY2VsbGFibGVQcm9taXNlQ2FuY2VsbGVyID0gKGNhdXNlPzogYW55KSA9PiB2b2lkIHwgUHJvbWlzZUxpa2U8dm9pZD47XG50eXBlIENhbmNlbGxhYmxlUHJvbWlzZUV4ZWN1dG9yPFQ+ID0gKHJlc29sdmU6IENhbmNlbGxhYmxlUHJvbWlzZVJlc29sdmVyPFQ+LCByZWplY3Q6IENhbmNlbGxhYmxlUHJvbWlzZVJlamVjdG9yKSA9PiB2b2lkO1xuXG5leHBvcnQgaW50ZXJmYWNlIENhbmNlbGxhYmxlUHJvbWlzZUxpa2U8VD4ge1xuICAgIHRoZW48VFJlc3VsdDEgPSBULCBUUmVzdWx0MiA9IG5ldmVyPihvbmZ1bGZpbGxlZD86ICgodmFsdWU6IFQpID0+IFRSZXN1bHQxIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDE+IHwgQ2FuY2VsbGFibGVQcm9taXNlTGlrZTxUUmVzdWx0MT4pIHwgdW5kZWZpbmVkIHwgbnVsbCwgb25yZWplY3RlZD86ICgocmVhc29uOiBhbnkpID0+IFRSZXN1bHQyIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDI+IHwgQ2FuY2VsbGFibGVQcm9taXNlTGlrZTxUUmVzdWx0Mj4pIHwgdW5kZWZpbmVkIHwgbnVsbCk6IENhbmNlbGxhYmxlUHJvbWlzZUxpa2U8VFJlc3VsdDEgfCBUUmVzdWx0Mj47XG4gICAgY2FuY2VsKGNhdXNlPzogYW55KTogdm9pZCB8IFByb21pc2VMaWtlPHZvaWQ+O1xufVxuXG4vKipcbiAqIFdyYXBzIGEgY2FuY2VsbGFibGUgcHJvbWlzZSBhbG9uZyB3aXRoIGl0cyByZXNvbHV0aW9uIG1ldGhvZHMuXG4gKiBUaGUgYG9uY2FuY2VsbGVkYCBmaWVsZCB3aWxsIGJlIG51bGwgaW5pdGlhbGx5IGJ1dCBtYXkgYmUgc2V0IHRvIHByb3ZpZGUgYSBjdXN0b20gY2FuY2VsbGF0aW9uIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhbmNlbGxhYmxlUHJvbWlzZVdpdGhSZXNvbHZlcnM8VD4ge1xuICAgIHByb21pc2U6IENhbmNlbGxhYmxlUHJvbWlzZTxUPjtcbiAgICByZXNvbHZlOiBDYW5jZWxsYWJsZVByb21pc2VSZXNvbHZlcjxUPjtcbiAgICByZWplY3Q6IENhbmNlbGxhYmxlUHJvbWlzZVJlamVjdG9yO1xuICAgIG9uY2FuY2VsbGVkOiBDYW5jZWxsYWJsZVByb21pc2VDYW5jZWxsZXIgfCBudWxsO1xufVxuXG5pbnRlcmZhY2UgQ2FuY2VsbGFibGVQcm9taXNlU3RhdGUge1xuICAgIHJlYWRvbmx5IHJvb3Q6IENhbmNlbGxhYmxlUHJvbWlzZVN0YXRlO1xuICAgIHJlc29sdmluZzogYm9vbGVhbjtcbiAgICBzZXR0bGVkOiBib29sZWFuO1xuICAgIHJlYXNvbj86IENhbmNlbEVycm9yO1xufVxuXG4vLyBQcml2YXRlIGZpZWxkIG5hbWVzLlxuY29uc3QgYmFycmllclN5bSA9IFN5bWJvbChcImJhcnJpZXJcIik7XG5jb25zdCBjYW5jZWxJbXBsU3ltID0gU3ltYm9sKFwiY2FuY2VsSW1wbFwiKTtcbmNvbnN0IHNwZWNpZXMgPSBTeW1ib2wuc3BlY2llcyA/PyBTeW1ib2woXCJzcGVjaWVzUG9seWZpbGxcIik7XG5cbi8qKlxuICogQSBwcm9taXNlIHdpdGggYW4gYXR0YWNoZWQgbWV0aG9kIGZvciBjYW5jZWxsaW5nIGxvbmctcnVubmluZyBvcGVyYXRpb25zIChzZWUge0BsaW5rIENhbmNlbGxhYmxlUHJvbWlzZSNjYW5jZWx9KS5cbiAqIENhbmNlbGxhdGlvbiBjYW4gb3B0aW9uYWxseSBiZSBib3VuZCB0byBhbiB7QGxpbmsgQWJvcnRTaWduYWx9XG4gKiBmb3IgYmV0dGVyIGNvbXBvc2FiaWxpdHkgKHNlZSB7QGxpbmsgQ2FuY2VsbGFibGVQcm9taXNlI2NhbmNlbE9ufSkuXG4gKlxuICogQ2FuY2VsbGluZyBhIHBlbmRpbmcgcHJvbWlzZSB3aWxsIHJlc3VsdCBpbiBhbiBpbW1lZGlhdGUgcmVqZWN0aW9uXG4gKiB3aXRoIGFuIGluc3RhbmNlIG9mIHtAbGluayBDYW5jZWxFcnJvcn0gYXMgcmVhc29uLFxuICogYnV0IHdob2V2ZXIgc3RhcnRlZCB0aGUgcHJvbWlzZSB3aWxsIGJlIHJlc3BvbnNpYmxlXG4gKiBmb3IgYWN0dWFsbHkgYWJvcnRpbmcgdGhlIHVuZGVybHlpbmcgb3BlcmF0aW9uLlxuICogVG8gdGhpcyBwdXJwb3NlLCB0aGUgY29uc3RydWN0b3IgYW5kIGFsbCBjaGFpbmluZyBtZXRob2RzXG4gKiBhY2NlcHQgb3B0aW9uYWwgY2FuY2VsbGF0aW9uIGNhbGxiYWNrcy5cbiAqXG4gKiBJZiBhIGBDYW5jZWxsYWJsZVByb21pc2VgIHN0aWxsIHJlc29sdmVzIGFmdGVyIGhhdmluZyBiZWVuIGNhbmNlbGxlZCxcbiAqIHRoZSByZXN1bHQgd2lsbCBiZSBkaXNjYXJkZWQuIElmIGl0IHJlamVjdHMsIHRoZSByZWFzb25cbiAqIHdpbGwgYmUgcmVwb3J0ZWQgYXMgYW4gdW5oYW5kbGVkIHJlamVjdGlvbixcbiAqIHdyYXBwZWQgaW4gYSB7QGxpbmsgQ2FuY2VsbGVkUmVqZWN0aW9uRXJyb3J9IGluc3RhbmNlLlxuICogVG8gZmFjaWxpdGF0ZSB0aGUgaGFuZGxpbmcgb2YgY2FuY2VsbGF0aW9uIHJlcXVlc3RzLFxuICogY2FuY2VsbGVkIGBDYW5jZWxsYWJsZVByb21pc2VgcyB3aWxsIF9ub3RfIHJlcG9ydCB1bmhhbmRsZWQgYENhbmNlbEVycm9yYHNcbiAqIHdob3NlIGBjYXVzZWAgZmllbGQgaXMgdGhlIHNhbWUgYXMgdGhlIG9uZSB3aXRoIHdoaWNoIHRoZSBjdXJyZW50IHByb21pc2Ugd2FzIGNhbmNlbGxlZC5cbiAqXG4gKiBBbGwgdXN1YWwgcHJvbWlzZSBtZXRob2RzIGFyZSBkZWZpbmVkIGFuZCByZXR1cm4gYSBgQ2FuY2VsbGFibGVQcm9taXNlYFxuICogd2hvc2UgY2FuY2VsIG1ldGhvZCB3aWxsIGNhbmNlbCB0aGUgcGFyZW50IG9wZXJhdGlvbiBhcyB3ZWxsLCBwcm9wYWdhdGluZyB0aGUgY2FuY2VsbGF0aW9uIHJlYXNvblxuICogdXB3YXJkcyB0aHJvdWdoIHByb21pc2UgY2hhaW5zLlxuICogQ29udmVyc2VseSwgY2FuY2VsbGluZyBhIHByb21pc2Ugd2lsbCBub3QgYXV0b21hdGljYWxseSBjYW5jZWwgZGVwZW5kZW50IHByb21pc2VzIGRvd25zdHJlYW06XG4gKiBgYGB0c1xuICogbGV0IHJvb3QgPSBuZXcgQ2FuY2VsbGFibGVQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsgLi4uIH0pO1xuICogbGV0IGNoaWxkMSA9IHJvb3QudGhlbigoKSA9PiB7IC4uLiB9KTtcbiAqIGxldCBjaGlsZDIgPSBjaGlsZDEudGhlbigoKSA9PiB7IC4uLiB9KTtcbiAqIGxldCBjaGlsZDMgPSByb290LmNhdGNoKCgpID0+IHsgLi4uIH0pO1xuICogY2hpbGQxLmNhbmNlbCgpOyAvLyBDYW5jZWxzIGNoaWxkMSBhbmQgcm9vdCwgYnV0IG5vdCBjaGlsZDIgb3IgY2hpbGQzXG4gKiBgYGBcbiAqIENhbmNlbGxpbmcgYSBwcm9taXNlIHRoYXQgaGFzIGFscmVhZHkgc2V0dGxlZCBpcyBzYWZlIGFuZCBoYXMgbm8gY29uc2VxdWVuY2UuXG4gKlxuICogVGhlIGBjYW5jZWxgIG1ldGhvZCByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IF9hbHdheXMgZnVsZmlsbHNfXG4gKiBhZnRlciB0aGUgd2hvbGUgY2hhaW4gaGFzIHByb2Nlc3NlZCB0aGUgY2FuY2VsIHJlcXVlc3RcbiAqIGFuZCBhbGwgYXR0YWNoZWQgY2FsbGJhY2tzIHVwIHRvIHRoYXQgbW9tZW50IGhhdmUgcnVuLlxuICpcbiAqIEFsbCBFUzIwMjQgcHJvbWlzZSBtZXRob2RzIChzdGF0aWMgYW5kIGluc3RhbmNlKSBhcmUgZGVmaW5lZCBvbiBDYW5jZWxsYWJsZVByb21pc2UsXG4gKiBidXQgYWN0dWFsIGF2YWlsYWJpbGl0eSBtYXkgdmFyeSB3aXRoIE9TL3dlYnZpZXcgdmVyc2lvbi5cbiAqXG4gKiBJbiBsaW5lIHdpdGggdGhlIHByb3Bvc2FsIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXJtLWJ1aWx0aW4tc3ViY2xhc3NpbmcsXG4gKiBgQ2FuY2VsbGFibGVQcm9taXNlYCBkb2VzIG5vdCBzdXBwb3J0IHRyYW5zcGFyZW50IHN1YmNsYXNzaW5nLlxuICogRXh0ZW5kZXJzIHNob3VsZCB0YWtlIGNhcmUgdG8gcHJvdmlkZSB0aGVpciBvd24gbWV0aG9kIGltcGxlbWVudGF0aW9ucy5cbiAqIFRoaXMgbWlnaHQgYmUgcmVjb25zaWRlcmVkIGluIGNhc2UgdGhlIHByb3Bvc2FsIGlzIHJldGlyZWQuXG4gKlxuICogQ2FuY2VsbGFibGVQcm9taXNlIGlzIGEgd3JhcHBlciBhcm91bmQgdGhlIERPTSBQcm9taXNlIG9iamVjdFxuICogYW5kIGlzIGNvbXBsaWFudCB3aXRoIHRoZSBbUHJvbWlzZXMvQSsgc3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8pXG4gKiAoaXQgcGFzc2VzIHRoZSBbY29tcGxpYW5jZSBzdWl0ZV0oaHR0cHM6Ly9naXRodWIuY29tL3Byb21pc2VzLWFwbHVzL3Byb21pc2VzLXRlc3RzKSlcbiAqIGlmIHNvIGlzIHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgQ2FuY2VsbGFibGVQcm9taXNlPFQ+IGV4dGVuZHMgUHJvbWlzZTxUPiBpbXBsZW1lbnRzIFByb21pc2VMaWtlPFQ+LCBDYW5jZWxsYWJsZVByb21pc2VMaWtlPFQ+IHtcbiAgICAvLyBQcml2YXRlIGZpZWxkcy5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgcHJpdmF0ZSBbYmFycmllclN5bV0hOiBQYXJ0aWFsPFByb21pc2VXaXRoUmVzb2x2ZXJzPHZvaWQ+PiB8IG51bGw7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgW2NhbmNlbEltcGxTeW1dITogKHJlYXNvbjogQ2FuY2VsRXJyb3IpID0+IHZvaWQgfCBQcm9taXNlTGlrZTx2b2lkPjtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgYENhbmNlbGxhYmxlUHJvbWlzZWAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZXhlY3V0b3IgLSBBIGNhbGxiYWNrIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcHJvbWlzZS4gVGhpcyBjYWxsYmFjayBpcyBwYXNzZWQgdHdvIGFyZ3VtZW50czpcbiAgICAgKiAgICAgICAgICAgICAgICAgICBhIGByZXNvbHZlYCBjYWxsYmFjayB1c2VkIHRvIHJlc29sdmUgdGhlIHByb21pc2Ugd2l0aCBhIHZhbHVlXG4gICAgICogICAgICAgICAgICAgICAgICAgb3IgdGhlIHJlc3VsdCBvZiBhbm90aGVyIHByb21pc2UgKHBvc3NpYmx5IGNhbmNlbGxhYmxlKSxcbiAgICAgKiAgICAgICAgICAgICAgICAgICBhbmQgYSBgcmVqZWN0YCBjYWxsYmFjayB1c2VkIHRvIHJlamVjdCB0aGUgcHJvbWlzZSB3aXRoIGEgcHJvdmlkZWQgcmVhc29uIG9yIGVycm9yLlxuICAgICAqICAgICAgICAgICAgICAgICAgIElmIHRoZSB2YWx1ZSBwcm92aWRlZCB0byB0aGUgYHJlc29sdmVgIGNhbGxiYWNrIGlzIGEgdGhlbmFibGUgX2FuZF8gY2FuY2VsbGFibGUgb2JqZWN0XG4gICAgICogICAgICAgICAgICAgICAgICAgKGl0IGhhcyBhIGB0aGVuYCBfYW5kXyBhIGBjYW5jZWxgIG1ldGhvZCksXG4gICAgICogICAgICAgICAgICAgICAgICAgY2FuY2VsbGF0aW9uIHJlcXVlc3RzIHdpbGwgYmUgZm9yd2FyZGVkIHRvIHRoYXQgb2JqZWN0IGFuZCB0aGUgb25jYW5jZWxsZWQgd2lsbCBub3QgYmUgaW52b2tlZCBhbnltb3JlLlxuICAgICAqICAgICAgICAgICAgICAgICAgIElmIGFueSBvbmUgb2YgdGhlIHR3byBjYWxsYmFja3MgaXMgY2FsbGVkIF9hZnRlcl8gdGhlIHByb21pc2UgaGFzIGJlZW4gY2FuY2VsbGVkLFxuICAgICAqICAgICAgICAgICAgICAgICAgIHRoZSBwcm92aWRlZCB2YWx1ZXMgd2lsbCBiZSBjYW5jZWxsZWQgYW5kIHJlc29sdmVkIGFzIHVzdWFsLFxuICAgICAqICAgICAgICAgICAgICAgICAgIGJ1dCB0aGVpciByZXN1bHRzIHdpbGwgYmUgZGlzY2FyZGVkLlxuICAgICAqICAgICAgICAgICAgICAgICAgIEhvd2V2ZXIsIGlmIHRoZSByZXNvbHV0aW9uIHByb2Nlc3MgdWx0aW1hdGVseSBlbmRzIHVwIGluIGEgcmVqZWN0aW9uXG4gICAgICogICAgICAgICAgICAgICAgICAgdGhhdCBpcyBub3QgZHVlIHRvIGNhbmNlbGxhdGlvbiwgdGhlIHJlamVjdGlvbiByZWFzb25cbiAgICAgKiAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHdyYXBwZWQgaW4gYSB7QGxpbmsgQ2FuY2VsbGVkUmVqZWN0aW9uRXJyb3J9XG4gICAgICogICAgICAgICAgICAgICAgICAgYW5kIGJ1YmJsZWQgdXAgYXMgYW4gdW5oYW5kbGVkIHJlamVjdGlvbi5cbiAgICAgKiBAcGFyYW0gb25jYW5jZWxsZWQgLSBJdCBpcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZW5zdXJlIHRoYXQgYW55IG9wZXJhdGlvblxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZWQgYnkgdGhlIGV4ZWN1dG9yIGlzIHByb3Blcmx5IGhhbHRlZCB1cG9uIGNhbmNlbGxhdGlvbi5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBUaGlzIG9wdGlvbmFsIGNhbGxiYWNrIGNhbiBiZSB1c2VkIHRvIHRoYXQgcHVycG9zZS5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBJdCB3aWxsIGJlIGNhbGxlZCBfc3luY2hyb25vdXNseV8gd2l0aCBhIGNhbmNlbGxhdGlvbiBjYXVzZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIHdoZW4gY2FuY2VsbGF0aW9uIGlzIHJlcXVlc3RlZCwgX2FmdGVyXyB0aGUgcHJvbWlzZSBoYXMgYWxyZWFkeSByZWplY3RlZFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIHdpdGggYSB7QGxpbmsgQ2FuY2VsRXJyb3J9LCBidXQgX2JlZm9yZV9cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBhbnkge0BsaW5rIHRoZW59L3tAbGluayBjYXRjaH0ve0BsaW5rIGZpbmFsbHl9IGNhbGxiYWNrIHJ1bnMuXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIGNhbGxiYWNrIHJldHVybnMgYSB0aGVuYWJsZSwgdGhlIHByb21pc2UgcmV0dXJuZWQgZnJvbSB7QGxpbmsgY2FuY2VsfVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIHdpbGwgb25seSBmdWxmaWxsIGFmdGVyIHRoZSBmb3JtZXIgaGFzIHNldHRsZWQuXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgVW5oYW5kbGVkIGV4Y2VwdGlvbnMgb3IgcmVqZWN0aW9ucyBmcm9tIHRoZSBjYWxsYmFjayB3aWxsIGJlIHdyYXBwZWRcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBpbiBhIHtAbGluayBDYW5jZWxsZWRSZWplY3Rpb25FcnJvcn0gYW5kIGJ1YmJsZWQgdXAgYXMgdW5oYW5kbGVkIHJlamVjdGlvbnMuXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIGByZXNvbHZlYCBjYWxsYmFjayBpcyBjYWxsZWQgYmVmb3JlIGNhbmNlbGxhdGlvbiB3aXRoIGEgY2FuY2VsbGFibGUgcHJvbWlzZSxcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb24gcmVxdWVzdHMgb24gdGhpcyBwcm9taXNlIHdpbGwgYmUgZGl2ZXJ0ZWQgdG8gdGhhdCBwcm9taXNlLFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGUgb3JpZ2luYWwgYG9uY2FuY2VsbGVkYCBjYWxsYmFjayB3aWxsIGJlIGRpc2NhcmRlZC5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihleGVjdXRvcjogQ2FuY2VsbGFibGVQcm9taXNlRXhlY3V0b3I8VD4sIG9uY2FuY2VsbGVkPzogQ2FuY2VsbGFibGVQcm9taXNlQ2FuY2VsbGVyKSB7XG4gICAgICAgIGxldCByZXNvbHZlITogKHZhbHVlOiBUIHwgUHJvbWlzZUxpa2U8VD4pID0+IHZvaWQ7XG4gICAgICAgIGxldCByZWplY3QhOiAocmVhc29uPzogYW55KSA9PiB2b2lkO1xuICAgICAgICBzdXBlcigocmVzLCByZWopID0+IHsgcmVzb2x2ZSA9IHJlczsgcmVqZWN0ID0gcmVqOyB9KTtcblxuICAgICAgICBpZiAoKHRoaXMuY29uc3RydWN0b3IgYXMgYW55KVtzcGVjaWVzXSAhPT0gUHJvbWlzZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbmNlbGxhYmxlUHJvbWlzZSBkb2VzIG5vdCBzdXBwb3J0IHRyYW5zcGFyZW50IHN1YmNsYXNzaW5nLiBQbGVhc2UgcmVmcmFpbiBmcm9tIG92ZXJyaWRpbmcgdGhlIFtTeW1ib2wuc3BlY2llc10gc3RhdGljIHByb3BlcnR5LlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwcm9taXNlOiBDYW5jZWxsYWJsZVByb21pc2VXaXRoUmVzb2x2ZXJzPFQ+ID0ge1xuICAgICAgICAgICAgcHJvbWlzZTogdGhpcyxcbiAgICAgICAgICAgIHJlc29sdmUsXG4gICAgICAgICAgICByZWplY3QsXG4gICAgICAgICAgICBnZXQgb25jYW5jZWxsZWQoKSB7IHJldHVybiBvbmNhbmNlbGxlZCA/PyBudWxsOyB9LFxuICAgICAgICAgICAgc2V0IG9uY2FuY2VsbGVkKGNiKSB7IG9uY2FuY2VsbGVkID0gY2IgPz8gdW5kZWZpbmVkOyB9XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3Qgc3RhdGU6IENhbmNlbGxhYmxlUHJvbWlzZVN0YXRlID0ge1xuICAgICAgICAgICAgZ2V0IHJvb3QoKSB7IHJldHVybiBzdGF0ZTsgfSxcbiAgICAgICAgICAgIHJlc29sdmluZzogZmFsc2UsXG4gICAgICAgICAgICBzZXR0bGVkOiBmYWxzZVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFNldHVwIGNhbmNlbGxhdGlvbiBzeXN0ZW0uXG4gICAgICAgIHZvaWQgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcywge1xuICAgICAgICAgICAgW2JhcnJpZXJTeW1dOiB7XG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtjYW5jZWxJbXBsU3ltXToge1xuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBjYW5jZWxsZXJGb3IocHJvbWlzZSwgc3RhdGUpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFJ1biB0aGUgYWN0dWFsIGV4ZWN1dG9yLlxuICAgICAgICBjb25zdCByZWplY3RvciA9IHJlamVjdG9yRm9yKHByb21pc2UsIHN0YXRlKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGV4ZWN1dG9yKHJlc29sdmVyRm9yKHByb21pc2UsIHN0YXRlKSwgcmVqZWN0b3IpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZS5yZXNvbHZpbmcpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIlVuaGFuZGxlZCBleGNlcHRpb24gaW4gQ2FuY2VsbGFibGVQcm9taXNlIGV4ZWN1dG9yLlwiLCBlcnIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZWplY3RvcihlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FuY2VscyBpbW1lZGlhdGVseSB0aGUgZXhlY3V0aW9uIG9mIHRoZSBvcGVyYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgcHJvbWlzZS5cbiAgICAgKiBUaGUgcHJvbWlzZSByZWplY3RzIHdpdGggYSB7QGxpbmsgQ2FuY2VsRXJyb3J9IGluc3RhbmNlIGFzIHJlYXNvbixcbiAgICAgKiB3aXRoIHRoZSB7QGxpbmsgQ2FuY2VsRXJyb3IjY2F1c2V9IHByb3BlcnR5IHNldCB0byB0aGUgZ2l2ZW4gYXJndW1lbnQsIGlmIGFueS5cbiAgICAgKlxuICAgICAqIEhhcyBubyBlZmZlY3QgaWYgY2FsbGVkIGFmdGVyIHRoZSBwcm9taXNlIGhhcyBhbHJlYWR5IHNldHRsZWQ7XG4gICAgICogcmVwZWF0ZWQgY2FsbHMgaW4gcGFydGljdWxhciBhcmUgc2FmZSwgYnV0IG9ubHkgdGhlIGZpcnN0IG9uZVxuICAgICAqIHdpbGwgc2V0IHRoZSBjYW5jZWxsYXRpb24gY2F1c2UuXG4gICAgICpcbiAgICAgKiBUaGUgYENhbmNlbEVycm9yYCBleGNlcHRpb24gX25lZWQgbm90XyBiZSBoYW5kbGVkIGV4cGxpY2l0bHkgX29uIHRoZSBwcm9taXNlcyB0aGF0IGFyZSBiZWluZyBjYW5jZWxsZWQ6X1xuICAgICAqIGNhbmNlbGxpbmcgYSBwcm9taXNlIHdpdGggbm8gYXR0YWNoZWQgcmVqZWN0aW9uIGhhbmRsZXIgZG9lcyBub3QgdHJpZ2dlciBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uIGV2ZW50LlxuICAgICAqIFRoZXJlZm9yZSwgdGhlIGZvbGxvd2luZyBpZGlvbXMgYXJlIGFsbCBlcXVhbGx5IGNvcnJlY3Q6XG4gICAgICogYGBgdHNcbiAgICAgKiBuZXcgQ2FuY2VsbGFibGVQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsgLi4uIH0pLmNhbmNlbCgpO1xuICAgICAqIG5ldyBDYW5jZWxsYWJsZVByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4geyAuLi4gfSkudGhlbiguLi4pLmNhbmNlbCgpO1xuICAgICAqIG5ldyBDYW5jZWxsYWJsZVByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4geyAuLi4gfSkudGhlbiguLi4pLmNhdGNoKC4uLikuY2FuY2VsKCk7XG4gICAgICogYGBgXG4gICAgICogV2hlbmV2ZXIgc29tZSBjYW5jZWxsZWQgcHJvbWlzZSBpbiBhIGNoYWluIHJlamVjdHMgd2l0aCBhIGBDYW5jZWxFcnJvcmBcbiAgICAgKiB3aXRoIHRoZSBzYW1lIGNhbmNlbGxhdGlvbiBjYXVzZSBhcyBpdHNlbGYsIHRoZSBlcnJvciB3aWxsIGJlIGRpc2NhcmRlZCBzaWxlbnRseS5cbiAgICAgKiBIb3dldmVyLCB0aGUgYENhbmNlbEVycm9yYCBfd2lsbCBzdGlsbCBiZSBkZWxpdmVyZWRfIHRvIGFsbCBhdHRhY2hlZCByZWplY3Rpb24gaGFuZGxlcnNcbiAgICAgKiBhZGRlZCBieSB7QGxpbmsgdGhlbn0gYW5kIHJlbGF0ZWQgbWV0aG9kczpcbiAgICAgKiBgYGB0c1xuICAgICAqIGxldCBjYW5jZWxsYWJsZSA9IG5ldyBDYW5jZWxsYWJsZVByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4geyAuLi4gfSk7XG4gICAgICogY2FuY2VsbGFibGUudGhlbigoKSA9PiB7IC4uLiB9KS5jYXRjaChjb25zb2xlLmxvZyk7XG4gICAgICogY2FuY2VsbGFibGUuY2FuY2VsKCk7IC8vIEEgQ2FuY2VsRXJyb3IgaXMgcHJpbnRlZCB0byB0aGUgY29uc29sZS5cbiAgICAgKiBgYGBcbiAgICAgKiBJZiB0aGUgYENhbmNlbEVycm9yYCBpcyBub3QgaGFuZGxlZCBkb3duc3RyZWFtIGJ5IHRoZSB0aW1lIGl0IHJlYWNoZXNcbiAgICAgKiBhIF9ub24tY2FuY2VsbGVkXyBwcm9taXNlLCBpdCBfd2lsbF8gdHJpZ2dlciBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uIGV2ZW50LFxuICAgICAqIGp1c3QgbGlrZSBub3JtYWwgcmVqZWN0aW9ucyB3b3VsZDpcbiAgICAgKiBgYGB0c1xuICAgICAqIGxldCBjYW5jZWxsYWJsZSA9IG5ldyBDYW5jZWxsYWJsZVByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4geyAuLi4gfSk7XG4gICAgICogbGV0IGNoYWluZWQgPSBjYW5jZWxsYWJsZS50aGVuKCgpID0+IHsgLi4uIH0pLnRoZW4oKCkgPT4geyAuLi4gfSk7IC8vIE5vIGNhdGNoLi4uXG4gICAgICogY2FuY2VsbGFibGUuY2FuY2VsKCk7IC8vIFVuaGFuZGxlZCByZWplY3Rpb24gZXZlbnQgb24gY2hhaW5lZCFcbiAgICAgKiBgYGBcbiAgICAgKiBUaGVyZWZvcmUsIGl0IGlzIGltcG9ydGFudCB0byBlaXRoZXIgY2FuY2VsIHdob2xlIHByb21pc2UgY2hhaW5zIGZyb20gdGhlaXIgdGFpbCxcbiAgICAgKiBhcyBzaG93biBpbiB0aGUgY29ycmVjdCBpZGlvbXMgYWJvdmUsIG9yIHRha2UgY2FyZSBvZiBoYW5kbGluZyBlcnJvcnMgZXZlcnl3aGVyZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEEgY2FuY2VsbGFibGUgcHJvbWlzZSB0aGF0IF9mdWxmaWxsc18gYWZ0ZXIgdGhlIGNhbmNlbCBjYWxsYmFjayAoaWYgYW55KVxuICAgICAqIGFuZCBhbGwgaGFuZGxlcnMgYXR0YWNoZWQgdXAgdG8gdGhlIGNhbGwgdG8gY2FuY2VsIGhhdmUgcnVuLlxuICAgICAqIElmIHRoZSBjYW5jZWwgY2FsbGJhY2sgcmV0dXJucyBhIHRoZW5hYmxlLCB0aGUgcHJvbWlzZSByZXR1cm5lZCBieSBgY2FuY2VsYFxuICAgICAqIHdpbGwgYWxzbyB3YWl0IGZvciB0aGF0IHRoZW5hYmxlIHRvIHNldHRsZS5cbiAgICAgKiBUaGlzIGVuYWJsZXMgY2FsbGVycyB0byB3YWl0IGZvciB0aGUgY2FuY2VsbGVkIG9wZXJhdGlvbiB0byB0ZXJtaW5hdGVcbiAgICAgKiB3aXRob3V0IGJlaW5nIGZvcmNlZCB0byBoYW5kbGUgcG90ZW50aWFsIGVycm9ycyBhdCB0aGUgY2FsbCBzaXRlLlxuICAgICAqIGBgYHRzXG4gICAgICogY2FuY2VsbGFibGUuY2FuY2VsKCkudGhlbigoKSA9PiB7XG4gICAgICogICAgIC8vIENsZWFudXAgZmluaXNoZWQsIGl0J3Mgc2FmZSB0byBkbyBzb21ldGhpbmcgZWxzZS5cbiAgICAgKiB9LCAoZXJyKSA9PiB7XG4gICAgICogICAgIC8vIFVucmVhY2hhYmxlOiB0aGUgcHJvbWlzZSByZXR1cm5lZCBmcm9tIGNhbmNlbCB3aWxsIG5ldmVyIHJlamVjdC5cbiAgICAgKiB9KTtcbiAgICAgKiBgYGBcbiAgICAgKiBOb3RlIHRoYXQgdGhlIHJldHVybmVkIHByb21pc2Ugd2lsbCBfbm90XyBoYW5kbGUgaW1wbGljaXRseSBhbnkgcmVqZWN0aW9uXG4gICAgICogdGhhdCBtaWdodCBoYXZlIG9jY3VycmVkIGFscmVhZHkgaW4gdGhlIGNhbmNlbGxlZCBjaGFpbi5cbiAgICAgKiBJdCB3aWxsIGp1c3QgdHJhY2sgd2hldGhlciByZWdpc3RlcmVkIGhhbmRsZXJzIGhhdmUgYmVlbiBleGVjdXRlZCBvciBub3QuXG4gICAgICogVGhlcmVmb3JlLCB1bmhhbmRsZWQgcmVqZWN0aW9ucyB3aWxsIG5ldmVyIGJlIHNpbGVudGx5IGhhbmRsZWQgYnkgY2FsbGluZyBjYW5jZWwuXG4gICAgICovXG4gICAgY2FuY2VsKGNhdXNlPzogYW55KTogQ2FuY2VsbGFibGVQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBDYW5jZWxsYWJsZVByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIC8vIElOVkFSSUFOVDogdGhlIHJlc3VsdCBvZiB0aGlzW2NhbmNlbEltcGxTeW1dIGFuZCB0aGUgYmFycmllciBkbyBub3QgZXZlciByZWplY3QuXG4gICAgICAgICAgICAvLyBVbmZvcnR1bmF0ZWx5IG1hY09TIEhpZ2ggU2llcnJhIGRvZXMgbm90IHN1cHBvcnQgUHJvbWlzZS5hbGxTZXR0bGVkLlxuICAgICAgICAgICAgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgIHRoaXNbY2FuY2VsSW1wbFN5bV0obmV3IENhbmNlbEVycm9yKFwiUHJvbWlzZSBjYW5jZWxsZWQuXCIsIHsgY2F1c2UgfSkpLFxuICAgICAgICAgICAgICAgIGN1cnJlbnRCYXJyaWVyKHRoaXMpXG4gICAgICAgICAgICBdKS50aGVuKCgpID0+IHJlc29sdmUoKSwgKCkgPT4gcmVzb2x2ZSgpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQmluZHMgcHJvbWlzZSBjYW5jZWxsYXRpb24gdG8gdGhlIGFib3J0IGV2ZW50IG9mIHRoZSBnaXZlbiB7QGxpbmsgQWJvcnRTaWduYWx9LlxuICAgICAqIElmIHRoZSBzaWduYWwgaGFzIGFscmVhZHkgYWJvcnRlZCwgdGhlIHByb21pc2Ugd2lsbCBiZSBjYW5jZWxsZWQgaW1tZWRpYXRlbHkuXG4gICAgICogV2hlbiBlaXRoZXIgY29uZGl0aW9uIGlzIHZlcmlmaWVkLCB0aGUgY2FuY2VsbGF0aW9uIGNhdXNlIHdpbGwgYmUgc2V0XG4gICAgICogdG8gdGhlIHNpZ25hbCdzIGFib3J0IHJlYXNvbiAoc2VlIHtAbGluayBBYm9ydFNpZ25hbCNyZWFzb259KS5cbiAgICAgKlxuICAgICAqIEhhcyBubyBlZmZlY3QgaWYgY2FsbGVkIChvciBpZiB0aGUgc2lnbmFsIGFib3J0cykgX2FmdGVyXyB0aGUgcHJvbWlzZSBoYXMgYWxyZWFkeSBzZXR0bGVkLlxuICAgICAqIE9ubHkgdGhlIGZpcnN0IHNpZ25hbCB0byBhYm9ydCB3aWxsIHNldCB0aGUgY2FuY2VsbGF0aW9uIGNhdXNlLlxuICAgICAqXG4gICAgICogRm9yIG1vcmUgZGV0YWlscyBhYm91dCB0aGUgY2FuY2VsbGF0aW9uIHByb2Nlc3MsXG4gICAgICogc2VlIHtAbGluayBjYW5jZWx9IGFuZCB0aGUgYENhbmNlbGxhYmxlUHJvbWlzZWAgY29uc3RydWN0b3IuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBlbmFibGVzIGBhd2FpdGBpbmcgY2FuY2VsbGFibGUgcHJvbWlzZXMgd2l0aG91dCBoYXZpbmdcbiAgICAgKiB0byBzdG9yZSB0aGVtIGZvciBmdXR1cmUgY2FuY2VsbGF0aW9uLCBlLmcuOlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgbG9uZ1J1bm5pbmdPcGVyYXRpb24oKS5jYW5jZWxPbihzaWduYWwpO1xuICAgICAqIGBgYFxuICAgICAqIGluc3RlYWQgb2Y6XG4gICAgICogYGBgdHNcbiAgICAgKiBsZXQgcHJvbWlzZVRvQmVDYW5jZWxsZWQgPSBsb25nUnVubmluZ09wZXJhdGlvbigpO1xuICAgICAqIGF3YWl0IHByb21pc2VUb0JlQ2FuY2VsbGVkO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhpcyBwcm9taXNlLCBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgICAqL1xuICAgIGNhbmNlbE9uKHNpZ25hbDogQWJvcnRTaWduYWwpOiBDYW5jZWxsYWJsZVByb21pc2U8VD4ge1xuICAgICAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgIHZvaWQgdGhpcy5jYW5jZWwoc2lnbmFsLnJlYXNvbilcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsICgpID0+IHZvaWQgdGhpcy5jYW5jZWwoc2lnbmFsLnJlYXNvbiksIHtjYXB0dXJlOiB0cnVlfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBdHRhY2hlcyBjYWxsYmFja3MgZm9yIHRoZSByZXNvbHV0aW9uIGFuZC9vciByZWplY3Rpb24gb2YgdGhlIGBDYW5jZWxsYWJsZVByb21pc2VgLlxuICAgICAqXG4gICAgICogVGhlIG9wdGlvbmFsIGBvbmNhbmNlbGxlZGAgYXJndW1lbnQgd2lsbCBiZSBpbnZva2VkIHdoZW4gdGhlIHJldHVybmVkIHByb21pc2UgaXMgY2FuY2VsbGVkLFxuICAgICAqIHdpdGggdGhlIHNhbWUgc2VtYW50aWNzIGFzIHRoZSBgb25jYW5jZWxsZWRgIGFyZ3VtZW50IG9mIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgKiBXaGVuIHRoZSBwYXJlbnQgcHJvbWlzZSByZWplY3RzIG9yIGlzIGNhbmNlbGxlZCwgdGhlIGBvbnJlamVjdGVkYCBjYWxsYmFjayB3aWxsIHJ1bixcbiAgICAgKiBfZXZlbiBhZnRlciB0aGUgcmV0dXJuZWQgcHJvbWlzZSBoYXMgYmVlbiBjYW5jZWxsZWQ6X1xuICAgICAqIGluIHRoYXQgY2FzZSwgc2hvdWxkIGl0IHJlamVjdCBvciB0aHJvdywgdGhlIHJlYXNvbiB3aWxsIGJlIHdyYXBwZWRcbiAgICAgKiBpbiBhIHtAbGluayBDYW5jZWxsZWRSZWplY3Rpb25FcnJvcn0gYW5kIGJ1YmJsZWQgdXAgYXMgYW4gdW5oYW5kbGVkIHJlamVjdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvbmZ1bGZpbGxlZCBUaGUgY2FsbGJhY2sgdG8gZXhlY3V0ZSB3aGVuIHRoZSBQcm9taXNlIGlzIHJlc29sdmVkLlxuICAgICAqIEBwYXJhbSBvbnJlamVjdGVkIFRoZSBjYWxsYmFjayB0byBleGVjdXRlIHdoZW4gdGhlIFByb21pc2UgaXMgcmVqZWN0ZWQuXG4gICAgICogQHJldHVybnMgQSBgQ2FuY2VsbGFibGVQcm9taXNlYCBmb3IgdGhlIGNvbXBsZXRpb24gb2Ygd2hpY2hldmVyIGNhbGxiYWNrIGlzIGV4ZWN1dGVkLlxuICAgICAqIFRoZSByZXR1cm5lZCBwcm9taXNlIGlzIGhvb2tlZCB1cCB0byBwcm9wYWdhdGUgY2FuY2VsbGF0aW9uIHJlcXVlc3RzIHVwIHRoZSBjaGFpbiwgYnV0IG5vdCBkb3duOlxuICAgICAqXG4gICAgICogICAtIGlmIHRoZSBwYXJlbnQgcHJvbWlzZSBpcyBjYW5jZWxsZWQsIHRoZSBgb25yZWplY3RlZGAgaGFuZGxlciB3aWxsIGJlIGludm9rZWQgd2l0aCBhIGBDYW5jZWxFcnJvcmBcbiAgICAgKiAgICAgYW5kIHRoZSByZXR1cm5lZCBwcm9taXNlIF93aWxsIHJlc29sdmUgcmVndWxhcmx5XyB3aXRoIGl0cyByZXN1bHQ7XG4gICAgICogICAtIGNvbnZlcnNlbHksIGlmIHRoZSByZXR1cm5lZCBwcm9taXNlIGlzIGNhbmNlbGxlZCwgX3RoZSBwYXJlbnQgcHJvbWlzZSBpcyBjYW5jZWxsZWQgdG9vO19cbiAgICAgKiAgICAgdGhlIGBvbnJlamVjdGVkYCBoYW5kbGVyIHdpbGwgc3RpbGwgYmUgaW52b2tlZCB3aXRoIHRoZSBwYXJlbnQncyBgQ2FuY2VsRXJyb3JgLFxuICAgICAqICAgICBidXQgaXRzIHJlc3VsdCB3aWxsIGJlIGRpc2NhcmRlZFxuICAgICAqICAgICBhbmQgdGhlIHJldHVybmVkIHByb21pc2Ugd2lsbCByZWplY3Qgd2l0aCBhIGBDYW5jZWxFcnJvcmAgYXMgd2VsbC5cbiAgICAgKlxuICAgICAqIFRoZSBwcm9taXNlIHJldHVybmVkIGZyb20ge0BsaW5rIGNhbmNlbH0gd2lsbCBmdWxmaWxsIG9ubHkgYWZ0ZXIgYWxsIGF0dGFjaGVkIGhhbmRsZXJzXG4gICAgICogdXAgdGhlIGVudGlyZSBwcm9taXNlIGNoYWluIGhhdmUgYmVlbiBydW4uXG4gICAgICpcbiAgICAgKiBJZiBlaXRoZXIgY2FsbGJhY2sgcmV0dXJucyBhIGNhbmNlbGxhYmxlIHByb21pc2UsXG4gICAgICogY2FuY2VsbGF0aW9uIHJlcXVlc3RzIHdpbGwgYmUgZGl2ZXJ0ZWQgdG8gaXQsXG4gICAgICogYW5kIHRoZSBzcGVjaWZpZWQgYG9uY2FuY2VsbGVkYCBjYWxsYmFjayB3aWxsIGJlIGRpc2NhcmRlZC5cbiAgICAgKi9cbiAgICB0aGVuPFRSZXN1bHQxID0gVCwgVFJlc3VsdDIgPSBuZXZlcj4ob25mdWxmaWxsZWQ/OiAoKHZhbHVlOiBUKSA9PiBUUmVzdWx0MSB8IFByb21pc2VMaWtlPFRSZXN1bHQxPiB8IENhbmNlbGxhYmxlUHJvbWlzZUxpa2U8VFJlc3VsdDE+KSB8IHVuZGVmaW5lZCB8IG51bGwsIG9ucmVqZWN0ZWQ/OiAoKHJlYXNvbjogYW55KSA9PiBUUmVzdWx0MiB8IFByb21pc2VMaWtlPFRSZXN1bHQyPiB8IENhbmNlbGxhYmxlUHJvbWlzZUxpa2U8VFJlc3VsdDI+KSB8IHVuZGVmaW5lZCB8IG51bGwsIG9uY2FuY2VsbGVkPzogQ2FuY2VsbGFibGVQcm9taXNlQ2FuY2VsbGVyKTogQ2FuY2VsbGFibGVQcm9taXNlPFRSZXN1bHQxIHwgVFJlc3VsdDI+IHtcbiAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIENhbmNlbGxhYmxlUHJvbWlzZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5jZWxsYWJsZVByb21pc2UucHJvdG90eXBlLnRoZW4gY2FsbGVkIG9uIGFuIGludmFsaWQgb2JqZWN0LlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5PVEU6IFR5cGVTY3JpcHQncyBidWlsdC1pbiB0eXBlIGZvciB0aGVuIGlzIGJyb2tlbixcbiAgICAgICAgLy8gYXMgaXQgYWxsb3dzIHNwZWNpZnlpbmcgYW4gYXJiaXRyYXJ5IFRSZXN1bHQxICE9IFQgZXZlbiB3aGVuIG9uZnVsZmlsbGVkIGlzIG5vdCBhIGZ1bmN0aW9uLlxuICAgICAgICAvLyBXZSBjYW5ub3QgZml4IGl0IGlmIHdlIHdhbnQgdG8gQ2FuY2VsbGFibGVQcm9taXNlIHRvIGltcGxlbWVudCBQcm9taXNlTGlrZTxUPi5cblxuICAgICAgICBpZiAoIWlzQ2FsbGFibGUob25mdWxmaWxsZWQpKSB7IG9uZnVsZmlsbGVkID0gaWRlbnRpdHkgYXMgYW55OyB9XG4gICAgICAgIGlmICghaXNDYWxsYWJsZShvbnJlamVjdGVkKSkgeyBvbnJlamVjdGVkID0gdGhyb3dlcjsgfVxuXG4gICAgICAgIGlmIChvbmZ1bGZpbGxlZCA9PT0gaWRlbnRpdHkgJiYgb25yZWplY3RlZCA9PSB0aHJvd2VyKSB7XG4gICAgICAgICAgICAvLyBTaG9ydGN1dCBmb3IgdHJpdmlhbCBhcmd1bWVudHMuXG4gICAgICAgICAgICByZXR1cm4gbmV3IENhbmNlbGxhYmxlUHJvbWlzZSgocmVzb2x2ZSkgPT4gcmVzb2x2ZSh0aGlzIGFzIGFueSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYmFycmllcjogUGFydGlhbDxQcm9taXNlV2l0aFJlc29sdmVyczx2b2lkPj4gPSB7fTtcbiAgICAgICAgdGhpc1tiYXJyaWVyU3ltXSA9IGJhcnJpZXI7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBDYW5jZWxsYWJsZVByb21pc2U8VFJlc3VsdDEgfCBUUmVzdWx0Mj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdm9pZCBzdXBlci50aGVuKFxuICAgICAgICAgICAgICAgICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpc1tiYXJyaWVyU3ltXSA9PT0gYmFycmllcikgeyB0aGlzW2JhcnJpZXJTeW1dID0gbnVsbDsgfVxuICAgICAgICAgICAgICAgICAgICBiYXJyaWVyLnJlc29sdmU/LigpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG9uZnVsZmlsbGVkISh2YWx1ZSkpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAocmVhc29uPykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpc1tiYXJyaWVyU3ltXSA9PT0gYmFycmllcikgeyB0aGlzW2JhcnJpZXJTeW1dID0gbnVsbDsgfVxuICAgICAgICAgICAgICAgICAgICBiYXJyaWVyLnJlc29sdmU/LigpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG9ucmVqZWN0ZWQhKHJlYXNvbikpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSwgYXN5bmMgKGNhdXNlPykgPT4ge1xuICAgICAgICAgICAgLy9jYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb25jYW5jZWxsZWQ/LihjYXVzZSk7XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY2FuY2VsKGNhdXNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXR0YWNoZXMgYSBjYWxsYmFjayBmb3Igb25seSB0aGUgcmVqZWN0aW9uIG9mIHRoZSBQcm9taXNlLlxuICAgICAqXG4gICAgICogVGhlIG9wdGlvbmFsIGBvbmNhbmNlbGxlZGAgYXJndW1lbnQgd2lsbCBiZSBpbnZva2VkIHdoZW4gdGhlIHJldHVybmVkIHByb21pc2UgaXMgY2FuY2VsbGVkLFxuICAgICAqIHdpdGggdGhlIHNhbWUgc2VtYW50aWNzIGFzIHRoZSBgb25jYW5jZWxsZWRgIGFyZ3VtZW50IG9mIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgKiBXaGVuIHRoZSBwYXJlbnQgcHJvbWlzZSByZWplY3RzIG9yIGlzIGNhbmNlbGxlZCwgdGhlIGBvbnJlamVjdGVkYCBjYWxsYmFjayB3aWxsIHJ1bixcbiAgICAgKiBfZXZlbiBhZnRlciB0aGUgcmV0dXJuZWQgcHJvbWlzZSBoYXMgYmVlbiBjYW5jZWxsZWQ6X1xuICAgICAqIGluIHRoYXQgY2FzZSwgc2hvdWxkIGl0IHJlamVjdCBvciB0aHJvdywgdGhlIHJlYXNvbiB3aWxsIGJlIHdyYXBwZWRcbiAgICAgKiBpbiBhIHtAbGluayBDYW5jZWxsZWRSZWplY3Rpb25FcnJvcn0gYW5kIGJ1YmJsZWQgdXAgYXMgYW4gdW5oYW5kbGVkIHJlamVjdGlvbi5cbiAgICAgKlxuICAgICAqIEl0IGlzIGVxdWl2YWxlbnQgdG9cbiAgICAgKiBgYGB0c1xuICAgICAqIGNhbmNlbGxhYmxlUHJvbWlzZS50aGVuKHVuZGVmaW5lZCwgb25yZWplY3RlZCwgb25jYW5jZWxsZWQpO1xuICAgICAqIGBgYFxuICAgICAqIGFuZCB0aGUgc2FtZSBjYXZlYXRzIGFwcGx5LlxuICAgICAqXG4gICAgICogQHJldHVybnMgQSBQcm9taXNlIGZvciB0aGUgY29tcGxldGlvbiBvZiB0aGUgY2FsbGJhY2suXG4gICAgICogQ2FuY2VsbGF0aW9uIHJlcXVlc3RzIG9uIHRoZSByZXR1cm5lZCBwcm9taXNlXG4gICAgICogd2lsbCBwcm9wYWdhdGUgdXAgdGhlIGNoYWluIHRvIHRoZSBwYXJlbnQgcHJvbWlzZSxcbiAgICAgKiBidXQgbm90IGluIHRoZSBvdGhlciBkaXJlY3Rpb24uXG4gICAgICpcbiAgICAgKiBUaGUgcHJvbWlzZSByZXR1cm5lZCBmcm9tIHtAbGluayBjYW5jZWx9IHdpbGwgZnVsZmlsbCBvbmx5IGFmdGVyIGFsbCBhdHRhY2hlZCBoYW5kbGVyc1xuICAgICAqIHVwIHRoZSBlbnRpcmUgcHJvbWlzZSBjaGFpbiBoYXZlIGJlZW4gcnVuLlxuICAgICAqXG4gICAgICogSWYgYG9ucmVqZWN0ZWRgIHJldHVybnMgYSBjYW5jZWxsYWJsZSBwcm9taXNlLFxuICAgICAqIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyB3aWxsIGJlIGRpdmVydGVkIHRvIGl0LFxuICAgICAqIGFuZCB0aGUgc3BlY2lmaWVkIGBvbmNhbmNlbGxlZGAgY2FsbGJhY2sgd2lsbCBiZSBkaXNjYXJkZWQuXG4gICAgICogU2VlIHtAbGluayB0aGVufSBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqL1xuICAgIGNhdGNoPFRSZXN1bHQgPSBuZXZlcj4ob25yZWplY3RlZD86ICgocmVhc29uOiBhbnkpID0+IChQcm9taXNlTGlrZTxUUmVzdWx0PiB8IFRSZXN1bHQpKSB8IHVuZGVmaW5lZCB8IG51bGwsIG9uY2FuY2VsbGVkPzogQ2FuY2VsbGFibGVQcm9taXNlQ2FuY2VsbGVyKTogQ2FuY2VsbGFibGVQcm9taXNlPFQgfCBUUmVzdWx0PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRoZW4odW5kZWZpbmVkLCBvbnJlamVjdGVkLCBvbmNhbmNlbGxlZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXR0YWNoZXMgYSBjYWxsYmFjayB0aGF0IGlzIGludm9rZWQgd2hlbiB0aGUgQ2FuY2VsbGFibGVQcm9taXNlIGlzIHNldHRsZWQgKGZ1bGZpbGxlZCBvciByZWplY3RlZCkuIFRoZVxuICAgICAqIHJlc29sdmVkIHZhbHVlIGNhbm5vdCBiZSBhY2Nlc3NlZCBvciBtb2RpZmllZCBmcm9tIHRoZSBjYWxsYmFjay5cbiAgICAgKiBUaGUgcmV0dXJuZWQgcHJvbWlzZSB3aWxsIHNldHRsZSBpbiB0aGUgc2FtZSBzdGF0ZSBhcyB0aGUgb3JpZ2luYWwgb25lXG4gICAgICogYWZ0ZXIgdGhlIHByb3ZpZGVkIGNhbGxiYWNrIGhhcyBjb21wbGV0ZWQgZXhlY3V0aW9uLFxuICAgICAqIHVubGVzcyB0aGUgY2FsbGJhY2sgdGhyb3dzIG9yIHJldHVybnMgYSByZWplY3RpbmcgcHJvbWlzZSxcbiAgICAgKiBpbiB3aGljaCBjYXNlIHRoZSByZXR1cm5lZCBwcm9taXNlIHdpbGwgcmVqZWN0IGFzIHdlbGwuXG4gICAgICpcbiAgICAgKiBUaGUgb3B0aW9uYWwgYG9uY2FuY2VsbGVkYCBhcmd1bWVudCB3aWxsIGJlIGludm9rZWQgd2hlbiB0aGUgcmV0dXJuZWQgcHJvbWlzZSBpcyBjYW5jZWxsZWQsXG4gICAgICogd2l0aCB0aGUgc2FtZSBzZW1hbnRpY3MgYXMgdGhlIGBvbmNhbmNlbGxlZGAgYXJndW1lbnQgb2YgdGhlIGNvbnN0cnVjdG9yLlxuICAgICAqIE9uY2UgdGhlIHBhcmVudCBwcm9taXNlIHNldHRsZXMsIHRoZSBgb25maW5hbGx5YCBjYWxsYmFjayB3aWxsIHJ1bixcbiAgICAgKiBfZXZlbiBhZnRlciB0aGUgcmV0dXJuZWQgcHJvbWlzZSBoYXMgYmVlbiBjYW5jZWxsZWQ6X1xuICAgICAqIGluIHRoYXQgY2FzZSwgc2hvdWxkIGl0IHJlamVjdCBvciB0aHJvdywgdGhlIHJlYXNvbiB3aWxsIGJlIHdyYXBwZWRcbiAgICAgKiBpbiBhIHtAbGluayBDYW5jZWxsZWRSZWplY3Rpb25FcnJvcn0gYW5kIGJ1YmJsZWQgdXAgYXMgYW4gdW5oYW5kbGVkIHJlamVjdGlvbi5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIHtAbGluayB0aGVufSBhbmQgdGhlIHNhbWUgY2F2ZWF0cyBhcHBseS5cbiAgICAgKiBJdCBpcyBwb2x5ZmlsbGVkLCBoZW5jZSBhdmFpbGFibGUgaW4gZXZlcnkgT1Mvd2VidmlldyB2ZXJzaW9uLlxuICAgICAqXG4gICAgICogQHJldHVybnMgQSBQcm9taXNlIGZvciB0aGUgY29tcGxldGlvbiBvZiB0aGUgY2FsbGJhY2suXG4gICAgICogQ2FuY2VsbGF0aW9uIHJlcXVlc3RzIG9uIHRoZSByZXR1cm5lZCBwcm9taXNlXG4gICAgICogd2lsbCBwcm9wYWdhdGUgdXAgdGhlIGNoYWluIHRvIHRoZSBwYXJlbnQgcHJvbWlzZSxcbiAgICAgKiBidXQgbm90IGluIHRoZSBvdGhlciBkaXJlY3Rpb24uXG4gICAgICpcbiAgICAgKiBUaGUgcHJvbWlzZSByZXR1cm5lZCBmcm9tIHtAbGluayBjYW5jZWx9IHdpbGwgZnVsZmlsbCBvbmx5IGFmdGVyIGFsbCBhdHRhY2hlZCBoYW5kbGVyc1xuICAgICAqIHVwIHRoZSBlbnRpcmUgcHJvbWlzZSBjaGFpbiBoYXZlIGJlZW4gcnVuLlxuICAgICAqXG4gICAgICogSWYgYG9uZmluYWxseWAgcmV0dXJucyBhIGNhbmNlbGxhYmxlIHByb21pc2UsXG4gICAgICogY2FuY2VsbGF0aW9uIHJlcXVlc3RzIHdpbGwgYmUgZGl2ZXJ0ZWQgdG8gaXQsXG4gICAgICogYW5kIHRoZSBzcGVjaWZpZWQgYG9uY2FuY2VsbGVkYCBjYWxsYmFjayB3aWxsIGJlIGRpc2NhcmRlZC5cbiAgICAgKiBTZWUge0BsaW5rIHRoZW59IGZvciBtb3JlIGRldGFpbHMuXG4gICAgICovXG4gICAgZmluYWxseShvbmZpbmFsbHk/OiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWQgfCBudWxsLCBvbmNhbmNlbGxlZD86IENhbmNlbGxhYmxlUHJvbWlzZUNhbmNlbGxlcik6IENhbmNlbGxhYmxlUHJvbWlzZTxUPiB7XG4gICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBDYW5jZWxsYWJsZVByb21pc2UpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2FuY2VsbGFibGVQcm9taXNlLnByb3RvdHlwZS5maW5hbGx5IGNhbGxlZCBvbiBhbiBpbnZhbGlkIG9iamVjdC5cIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzQ2FsbGFibGUob25maW5hbGx5KSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudGhlbihvbmZpbmFsbHksIG9uZmluYWxseSwgb25jYW5jZWxsZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudGhlbihcbiAgICAgICAgICAgICh2YWx1ZSkgPT4gQ2FuY2VsbGFibGVQcm9taXNlLnJlc29sdmUob25maW5hbGx5KCkpLnRoZW4oKCkgPT4gdmFsdWUpLFxuICAgICAgICAgICAgKHJlYXNvbj8pID0+IENhbmNlbGxhYmxlUHJvbWlzZS5yZXNvbHZlKG9uZmluYWxseSgpKS50aGVuKCgpID0+IHsgdGhyb3cgcmVhc29uOyB9KSxcbiAgICAgICAgICAgIG9uY2FuY2VsbGVkLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdlIHVzZSB0aGUgYFtTeW1ib2wuc3BlY2llc11gIHN0YXRpYyBwcm9wZXJ0eSwgaWYgYXZhaWxhYmxlLFxuICAgICAqIHRvIGRpc2FibGUgdGhlIGJ1aWx0LWluIGF1dG9tYXRpYyBzdWJjbGFzc2luZyBmZWF0dXJlcyBmcm9tIHtAbGluayBQcm9taXNlfS5cbiAgICAgKiBJdCBpcyBjcml0aWNhbCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucyB0aGF0IGV4dGVuZGVycyBkbyBub3Qgb3ZlcnJpZGUgdGhpcy5cbiAgICAgKiBPbmNlIHRoZSBwcm9wb3NhbCBhdCBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1ybS1idWlsdGluLXN1YmNsYXNzaW5nXG4gICAgICogaXMgZWl0aGVyIGFjY2VwdGVkIG9yIHJldGlyZWQsIHRoaXMgaW1wbGVtZW50YXRpb24gd2lsbCBoYXZlIHRvIGJlIHJldmlzZWQgYWNjb3JkaW5nbHkuXG4gICAgICpcbiAgICAgKiBAaWdub3JlXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgc3RhdGljIGdldCBbc3BlY2llc10oKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBDYW5jZWxsYWJsZVByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoIGFuIGFycmF5IG9mIHJlc3VsdHNcbiAgICAgKiB3aGVuIGFsbCBvZiB0aGUgcHJvdmlkZWQgUHJvbWlzZXMgcmVzb2x2ZSwgb3IgcmVqZWN0ZWQgd2hlbiBhbnkgUHJvbWlzZSBpcyByZWplY3RlZC5cbiAgICAgKlxuICAgICAqIEV2ZXJ5IG9uZSBvZiB0aGUgcHJvdmlkZWQgb2JqZWN0cyB0aGF0IGlzIGEgdGhlbmFibGUgX2FuZF8gY2FuY2VsbGFibGUgb2JqZWN0XG4gICAgICogd2lsbCBiZSBjYW5jZWxsZWQgd2hlbiB0aGUgcmV0dXJuZWQgcHJvbWlzZSBpcyBjYW5jZWxsZWQsIHdpdGggdGhlIHNhbWUgY2F1c2UuXG4gICAgICpcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcbiAgICAgKi9cbiAgICBzdGF0aWMgYWxsPFQ+KHZhbHVlczogSXRlcmFibGU8VCB8IFByb21pc2VMaWtlPFQ+Pik6IENhbmNlbGxhYmxlUHJvbWlzZTxBd2FpdGVkPFQ+W10+O1xuICAgIHN0YXRpYyBhbGw8VCBleHRlbmRzIHJlYWRvbmx5IHVua25vd25bXSB8IFtdPih2YWx1ZXM6IFQpOiBDYW5jZWxsYWJsZVByb21pc2U8eyAtcmVhZG9ubHkgW1AgaW4ga2V5b2YgVF06IEF3YWl0ZWQ8VFtQXT47IH0+O1xuICAgIHN0YXRpYyBhbGw8VCBleHRlbmRzIEl0ZXJhYmxlPHVua25vd24+IHwgQXJyYXlMaWtlPHVua25vd24+Pih2YWx1ZXM6IFQpOiBDYW5jZWxsYWJsZVByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICBsZXQgY29sbGVjdGVkID0gQXJyYXkuZnJvbSh2YWx1ZXMpO1xuICAgICAgICBjb25zdCBwcm9taXNlID0gY29sbGVjdGVkLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgPyBDYW5jZWxsYWJsZVByb21pc2UucmVzb2x2ZShjb2xsZWN0ZWQpXG4gICAgICAgICAgICA6IG5ldyBDYW5jZWxsYWJsZVByb21pc2U8dW5rbm93bj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHZvaWQgUHJvbWlzZS5hbGwoY29sbGVjdGVkKS50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgICB9LCAoY2F1c2U/KTogUHJvbWlzZTx2b2lkPiA9PiBjYW5jZWxBbGwocHJvbWlzZSwgY29sbGVjdGVkLCBjYXVzZSkpO1xuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgQ2FuY2VsbGFibGVQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aCBhbiBhcnJheSBvZiByZXN1bHRzXG4gICAgICogd2hlbiBhbGwgb2YgdGhlIHByb3ZpZGVkIFByb21pc2VzIHJlc29sdmUgb3IgcmVqZWN0LlxuICAgICAqXG4gICAgICogRXZlcnkgb25lIG9mIHRoZSBwcm92aWRlZCBvYmplY3RzIHRoYXQgaXMgYSB0aGVuYWJsZSBfYW5kXyBjYW5jZWxsYWJsZSBvYmplY3RcbiAgICAgKiB3aWxsIGJlIGNhbmNlbGxlZCB3aGVuIHRoZSByZXR1cm5lZCBwcm9taXNlIGlzIGNhbmNlbGxlZCwgd2l0aCB0aGUgc2FtZSBjYXVzZS5cbiAgICAgKlxuICAgICAqIEBncm91cCBTdGF0aWMgTWV0aG9kc1xuICAgICAqL1xuICAgIHN0YXRpYyBhbGxTZXR0bGVkPFQ+KHZhbHVlczogSXRlcmFibGU8VCB8IFByb21pc2VMaWtlPFQ+Pik6IENhbmNlbGxhYmxlUHJvbWlzZTxQcm9taXNlU2V0dGxlZFJlc3VsdDxBd2FpdGVkPFQ+PltdPjtcbiAgICBzdGF0aWMgYWxsU2V0dGxlZDxUIGV4dGVuZHMgcmVhZG9ubHkgdW5rbm93bltdIHwgW10+KHZhbHVlczogVCk6IENhbmNlbGxhYmxlUHJvbWlzZTx7IC1yZWFkb25seSBbUCBpbiBrZXlvZiBUXTogUHJvbWlzZVNldHRsZWRSZXN1bHQ8QXdhaXRlZDxUW1BdPj47IH0+O1xuICAgIHN0YXRpYyBhbGxTZXR0bGVkPFQgZXh0ZW5kcyBJdGVyYWJsZTx1bmtub3duPiB8IEFycmF5TGlrZTx1bmtub3duPj4odmFsdWVzOiBUKTogQ2FuY2VsbGFibGVQcm9taXNlPHVua25vd24+IHtcbiAgICAgICAgbGV0IGNvbGxlY3RlZCA9IEFycmF5LmZyb20odmFsdWVzKTtcbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IGNvbGxlY3RlZC5sZW5ndGggPT09IDBcbiAgICAgICAgICAgID8gQ2FuY2VsbGFibGVQcm9taXNlLnJlc29sdmUoY29sbGVjdGVkKVxuICAgICAgICAgICAgOiBuZXcgQ2FuY2VsbGFibGVQcm9taXNlPHVua25vd24+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICB2b2lkIFByb21pc2UuYWxsU2V0dGxlZChjb2xsZWN0ZWQpLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICAgIH0sIChjYXVzZT8pOiBQcm9taXNlPHZvaWQ+ID0+IGNhbmNlbEFsbChwcm9taXNlLCBjb2xsZWN0ZWQsIGNhdXNlKSk7XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBhbnkgZnVuY3Rpb24gcmV0dXJucyBhIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgYnkgdGhlIGZpcnN0IGdpdmVuIHByb21pc2UgdG8gYmUgZnVsZmlsbGVkLFxuICAgICAqIG9yIHJlamVjdGVkIHdpdGggYW4gQWdncmVnYXRlRXJyb3IgY29udGFpbmluZyBhbiBhcnJheSBvZiByZWplY3Rpb24gcmVhc29uc1xuICAgICAqIGlmIGFsbCBvZiB0aGUgZ2l2ZW4gcHJvbWlzZXMgYXJlIHJlamVjdGVkLlxuICAgICAqIEl0IHJlc29sdmVzIGFsbCBlbGVtZW50cyBvZiB0aGUgcGFzc2VkIGl0ZXJhYmxlIHRvIHByb21pc2VzIGFzIGl0IHJ1bnMgdGhpcyBhbGdvcml0aG0uXG4gICAgICpcbiAgICAgKiBFdmVyeSBvbmUgb2YgdGhlIHByb3ZpZGVkIG9iamVjdHMgdGhhdCBpcyBhIHRoZW5hYmxlIF9hbmRfIGNhbmNlbGxhYmxlIG9iamVjdFxuICAgICAqIHdpbGwgYmUgY2FuY2VsbGVkIHdoZW4gdGhlIHJldHVybmVkIHByb21pc2UgaXMgY2FuY2VsbGVkLCB3aXRoIHRoZSBzYW1lIGNhdXNlLlxuICAgICAqXG4gICAgICogQGdyb3VwIFN0YXRpYyBNZXRob2RzXG4gICAgICovXG4gICAgc3RhdGljIGFueTxUPih2YWx1ZXM6IEl0ZXJhYmxlPFQgfCBQcm9taXNlTGlrZTxUPj4pOiBDYW5jZWxsYWJsZVByb21pc2U8QXdhaXRlZDxUPj47XG4gICAgc3RhdGljIGFueTxUIGV4dGVuZHMgcmVhZG9ubHkgdW5rbm93bltdIHwgW10+KHZhbHVlczogVCk6IENhbmNlbGxhYmxlUHJvbWlzZTxBd2FpdGVkPFRbbnVtYmVyXT4+O1xuICAgIHN0YXRpYyBhbnk8VCBleHRlbmRzIEl0ZXJhYmxlPHVua25vd24+IHwgQXJyYXlMaWtlPHVua25vd24+Pih2YWx1ZXM6IFQpOiBDYW5jZWxsYWJsZVByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICBsZXQgY29sbGVjdGVkID0gQXJyYXkuZnJvbSh2YWx1ZXMpO1xuICAgICAgICBjb25zdCBwcm9taXNlID0gY29sbGVjdGVkLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgPyBDYW5jZWxsYWJsZVByb21pc2UucmVzb2x2ZShjb2xsZWN0ZWQpXG4gICAgICAgICAgICA6IG5ldyBDYW5jZWxsYWJsZVByb21pc2U8dW5rbm93bj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHZvaWQgUHJvbWlzZS5hbnkoY29sbGVjdGVkKS50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgICB9LCAoY2F1c2U/KTogUHJvbWlzZTx2b2lkPiA9PiBjYW5jZWxBbGwocHJvbWlzZSwgY29sbGVjdGVkLCBjYXVzZSkpO1xuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIG9yIHJlamVjdGVkIHdoZW4gYW55IG9mIHRoZSBwcm92aWRlZCBQcm9taXNlcyBhcmUgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQuXG4gICAgICpcbiAgICAgKiBFdmVyeSBvbmUgb2YgdGhlIHByb3ZpZGVkIG9iamVjdHMgdGhhdCBpcyBhIHRoZW5hYmxlIF9hbmRfIGNhbmNlbGxhYmxlIG9iamVjdFxuICAgICAqIHdpbGwgYmUgY2FuY2VsbGVkIHdoZW4gdGhlIHJldHVybmVkIHByb21pc2UgaXMgY2FuY2VsbGVkLCB3aXRoIHRoZSBzYW1lIGNhdXNlLlxuICAgICAqXG4gICAgICogQGdyb3VwIFN0YXRpYyBNZXRob2RzXG4gICAgICovXG4gICAgc3RhdGljIHJhY2U8VD4odmFsdWVzOiBJdGVyYWJsZTxUIHwgUHJvbWlzZUxpa2U8VD4+KTogQ2FuY2VsbGFibGVQcm9taXNlPEF3YWl0ZWQ8VD4+O1xuICAgIHN0YXRpYyByYWNlPFQgZXh0ZW5kcyByZWFkb25seSB1bmtub3duW10gfCBbXT4odmFsdWVzOiBUKTogQ2FuY2VsbGFibGVQcm9taXNlPEF3YWl0ZWQ8VFtudW1iZXJdPj47XG4gICAgc3RhdGljIHJhY2U8VCBleHRlbmRzIEl0ZXJhYmxlPHVua25vd24+IHwgQXJyYXlMaWtlPHVua25vd24+Pih2YWx1ZXM6IFQpOiBDYW5jZWxsYWJsZVByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICBsZXQgY29sbGVjdGVkID0gQXJyYXkuZnJvbSh2YWx1ZXMpO1xuICAgICAgICBjb25zdCBwcm9taXNlID0gbmV3IENhbmNlbGxhYmxlUHJvbWlzZTx1bmtub3duPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB2b2lkIFByb21pc2UucmFjZShjb2xsZWN0ZWQpLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSwgKGNhdXNlPyk6IFByb21pc2U8dm9pZD4gPT4gY2FuY2VsQWxsKHByb21pc2UsIGNvbGxlY3RlZCwgY2F1c2UpKTtcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBjYW5jZWxsZWQgQ2FuY2VsbGFibGVQcm9taXNlIGZvciB0aGUgcHJvdmlkZWQgY2F1c2UuXG4gICAgICpcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcbiAgICAgKi9cbiAgICBzdGF0aWMgY2FuY2VsPFQgPSBuZXZlcj4oY2F1c2U/OiBhbnkpOiBDYW5jZWxsYWJsZVByb21pc2U8VD4ge1xuICAgICAgICBjb25zdCBwID0gbmV3IENhbmNlbGxhYmxlUHJvbWlzZTxUPigoKSA9PiB7fSk7XG4gICAgICAgIHAuY2FuY2VsKGNhdXNlKTtcbiAgICAgICAgcmV0dXJuIHA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBDYW5jZWxsYWJsZVByb21pc2UgdGhhdCBjYW5jZWxzXG4gICAgICogYWZ0ZXIgdGhlIHNwZWNpZmllZCB0aW1lb3V0LCB3aXRoIHRoZSBwcm92aWRlZCBjYXVzZS5cbiAgICAgKlxuICAgICAqIElmIHRoZSB7QGxpbmsgQWJvcnRTaWduYWwudGltZW91dH0gZmFjdG9yeSBtZXRob2QgaXMgYXZhaWxhYmxlLFxuICAgICAqIGl0IGlzIHVzZWQgdG8gYmFzZSB0aGUgdGltZW91dCBvbiBfYWN0aXZlXyB0aW1lIHJhdGhlciB0aGFuIF9lbGFwc2VkXyB0aW1lLlxuICAgICAqIE90aGVyd2lzZSwgYHRpbWVvdXRgIGZhbGxzIGJhY2sgdG8ge0BsaW5rIHNldFRpbWVvdXR9LlxuICAgICAqXG4gICAgICogQGdyb3VwIFN0YXRpYyBNZXRob2RzXG4gICAgICovXG4gICAgc3RhdGljIHRpbWVvdXQ8VCA9IG5ldmVyPihtaWxsaXNlY29uZHM6IG51bWJlciwgY2F1c2U/OiBhbnkpOiBDYW5jZWxsYWJsZVByb21pc2U8VD4ge1xuICAgICAgICBjb25zdCBwcm9taXNlID0gbmV3IENhbmNlbGxhYmxlUHJvbWlzZTxUPigoKSA9PiB7fSk7XG4gICAgICAgIGlmIChBYm9ydFNpZ25hbCAmJiB0eXBlb2YgQWJvcnRTaWduYWwgPT09ICdmdW5jdGlvbicgJiYgQWJvcnRTaWduYWwudGltZW91dCAmJiB0eXBlb2YgQWJvcnRTaWduYWwudGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgQWJvcnRTaWduYWwudGltZW91dChtaWxsaXNlY29uZHMpLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgKCkgPT4gdm9pZCBwcm9taXNlLmNhbmNlbChjYXVzZSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB2b2lkIHByb21pc2UuY2FuY2VsKGNhdXNlKSwgbWlsbGlzZWNvbmRzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IENhbmNlbGxhYmxlUHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIHRoZSBzcGVjaWZpZWQgdGltZW91dC5cbiAgICAgKiBUaGUgcmV0dXJuZWQgcHJvbWlzZSBjYW4gYmUgY2FuY2VsbGVkIHdpdGhvdXQgY29uc2VxdWVuY2VzLlxuICAgICAqXG4gICAgICogQGdyb3VwIFN0YXRpYyBNZXRob2RzXG4gICAgICovXG4gICAgc3RhdGljIHNsZWVwKG1pbGxpc2Vjb25kczogbnVtYmVyKTogQ2FuY2VsbGFibGVQcm9taXNlPHZvaWQ+O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ2FuY2VsbGFibGVQcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXJcbiAgICAgKiB0aGUgc3BlY2lmaWVkIHRpbWVvdXQsIHdpdGggdGhlIHByb3ZpZGVkIHZhbHVlLlxuICAgICAqIFRoZSByZXR1cm5lZCBwcm9taXNlIGNhbiBiZSBjYW5jZWxsZWQgd2l0aG91dCBjb25zZXF1ZW5jZXMuXG4gICAgICpcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcbiAgICAgKi9cbiAgICBzdGF0aWMgc2xlZXA8VD4obWlsbGlzZWNvbmRzOiBudW1iZXIsIHZhbHVlOiBUKTogQ2FuY2VsbGFibGVQcm9taXNlPFQ+O1xuICAgIHN0YXRpYyBzbGVlcDxUID0gdm9pZD4obWlsbGlzZWNvbmRzOiBudW1iZXIsIHZhbHVlPzogVCk6IENhbmNlbGxhYmxlUHJvbWlzZTxUPiB7XG4gICAgICAgIHJldHVybiBuZXcgQ2FuY2VsbGFibGVQcm9taXNlPFQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHJlc29sdmUodmFsdWUhKSwgbWlsbGlzZWNvbmRzKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyByZWplY3RlZCBDYW5jZWxsYWJsZVByb21pc2UgZm9yIHRoZSBwcm92aWRlZCByZWFzb24uXG4gICAgICpcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcbiAgICAgKi9cbiAgICBzdGF0aWMgcmVqZWN0PFQgPSBuZXZlcj4ocmVhc29uPzogYW55KTogQ2FuY2VsbGFibGVQcm9taXNlPFQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBDYW5jZWxsYWJsZVByb21pc2U8VD4oKF8sIHJlamVjdCkgPT4gcmVqZWN0KHJlYXNvbikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgcmVzb2x2ZWQgQ2FuY2VsbGFibGVQcm9taXNlLlxuICAgICAqXG4gICAgICogQGdyb3VwIFN0YXRpYyBNZXRob2RzXG4gICAgICovXG4gICAgc3RhdGljIHJlc29sdmUoKTogQ2FuY2VsbGFibGVQcm9taXNlPHZvaWQ+O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgcmVzb2x2ZWQgQ2FuY2VsbGFibGVQcm9taXNlIGZvciB0aGUgcHJvdmlkZWQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcbiAgICAgKi9cbiAgICBzdGF0aWMgcmVzb2x2ZTxUPih2YWx1ZTogVCk6IENhbmNlbGxhYmxlUHJvbWlzZTxBd2FpdGVkPFQ+PjtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHJlc29sdmVkIENhbmNlbGxhYmxlUHJvbWlzZSBmb3IgdGhlIHByb3ZpZGVkIHZhbHVlLlxuICAgICAqXG4gICAgICogQGdyb3VwIFN0YXRpYyBNZXRob2RzXG4gICAgICovXG4gICAgc3RhdGljIHJlc29sdmU8VD4odmFsdWU6IFQgfCBQcm9taXNlTGlrZTxUPik6IENhbmNlbGxhYmxlUHJvbWlzZTxBd2FpdGVkPFQ+PjtcbiAgICBzdGF0aWMgcmVzb2x2ZTxUID0gdm9pZD4odmFsdWU/OiBUIHwgUHJvbWlzZUxpa2U8VD4pOiBDYW5jZWxsYWJsZVByb21pc2U8QXdhaXRlZDxUPj4ge1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBDYW5jZWxsYWJsZVByb21pc2UpIHtcbiAgICAgICAgICAgIC8vIE9wdGltaXNlIGZvciBjYW5jZWxsYWJsZSBwcm9taXNlcy5cbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IENhbmNlbGxhYmxlUHJvbWlzZTxhbnk+KChyZXNvbHZlKSA9PiByZXNvbHZlKHZhbHVlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBDYW5jZWxsYWJsZVByb21pc2UgYW5kIHJldHVybnMgaXQgaW4gYW4gb2JqZWN0LCBhbG9uZyB3aXRoIGl0cyByZXNvbHZlIGFuZCByZWplY3QgZnVuY3Rpb25zXG4gICAgICogYW5kIGEgZ2V0dGVyL3NldHRlciBmb3IgdGhlIGNhbmNlbGxhdGlvbiBjYWxsYmFjay5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHBvbHlmaWxsZWQsIGhlbmNlIGF2YWlsYWJsZSBpbiBldmVyeSBPUy93ZWJ2aWV3IHZlcnNpb24uXG4gICAgICpcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcbiAgICAgKi9cbiAgICBzdGF0aWMgd2l0aFJlc29sdmVyczxUPigpOiBDYW5jZWxsYWJsZVByb21pc2VXaXRoUmVzb2x2ZXJzPFQ+IHtcbiAgICAgICAgbGV0IHJlc3VsdDogQ2FuY2VsbGFibGVQcm9taXNlV2l0aFJlc29sdmVyczxUPiA9IHsgb25jYW5jZWxsZWQ6IG51bGwgfSBhcyBhbnk7XG4gICAgICAgIHJlc3VsdC5wcm9taXNlID0gbmV3IENhbmNlbGxhYmxlUHJvbWlzZTxUPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICByZXN1bHQucmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgICAgICByZXN1bHQucmVqZWN0ID0gcmVqZWN0O1xuICAgICAgICB9LCAoY2F1c2U/OiBhbnkpID0+IHsgcmVzdWx0Lm9uY2FuY2VsbGVkPy4oY2F1c2UpOyB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGNhbGxiYWNrIHRoYXQgaW1wbGVtZW50cyB0aGUgY2FuY2VsbGF0aW9uIGFsZ29yaXRobSBmb3IgdGhlIGdpdmVuIGNhbmNlbGxhYmxlIHByb21pc2UuXG4gKiBUaGUgcHJvbWlzZSByZXR1cm5lZCBmcm9tIHRoZSByZXN1bHRpbmcgZnVuY3Rpb24gZG9lcyBub3QgcmVqZWN0LlxuICovXG5mdW5jdGlvbiBjYW5jZWxsZXJGb3I8VD4ocHJvbWlzZTogQ2FuY2VsbGFibGVQcm9taXNlV2l0aFJlc29sdmVyczxUPiwgc3RhdGU6IENhbmNlbGxhYmxlUHJvbWlzZVN0YXRlKSB7XG4gICAgbGV0IGNhbmNlbGxhdGlvblByb21pc2U6IHZvaWQgfCBQcm9taXNlTGlrZTx2b2lkPiA9IHVuZGVmaW5lZDtcblxuICAgIHJldHVybiAocmVhc29uOiBDYW5jZWxFcnJvcik6IHZvaWQgfCBQcm9taXNlTGlrZTx2b2lkPiA9PiB7XG4gICAgICAgIGlmICghc3RhdGUuc2V0dGxlZCkge1xuICAgICAgICAgICAgc3RhdGUuc2V0dGxlZCA9IHRydWU7XG4gICAgICAgICAgICBzdGF0ZS5yZWFzb24gPSByZWFzb247XG4gICAgICAgICAgICBwcm9taXNlLnJlamVjdChyZWFzb24pO1xuXG4gICAgICAgICAgICAvLyBBdHRhY2ggYW4gZXJyb3IgaGFuZGxlciB0aGF0IGlnbm9yZXMgdGhpcyBzcGVjaWZpYyByZWplY3Rpb24gcmVhc29uIGFuZCBub3RoaW5nIGVsc2UuXG4gICAgICAgICAgICAvLyBJbiB0aGVvcnksIGEgc2FuZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIGF0IHRoaXMgcG9pbnRcbiAgICAgICAgICAgIC8vIHNob3VsZCBhbHdheXMgcmVqZWN0IHdpdGggb3VyIGNhbmNlbGxhdGlvbiByZWFzb24sXG4gICAgICAgICAgICAvLyBoZW5jZSB0aGUgaGFuZGxlciB3aWxsIG5ldmVyIHRocm93LlxuICAgICAgICAgICAgdm9pZCBQcm9taXNlLnByb3RvdHlwZS50aGVuLmNhbGwocHJvbWlzZS5wcm9taXNlLCB1bmRlZmluZWQsIChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyICE9PSByZWFzb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgcmVhc29uIGlzIG5vdCBzZXQsIHRoZSBwcm9taXNlIHJlc29sdmVkIHJlZ3VsYXJseSwgaGVuY2Ugd2UgbXVzdCBub3QgY2FsbCBvbmNhbmNlbGxlZC5cbiAgICAgICAgLy8gSWYgb25jYW5jZWxsZWQgaXMgdW5zZXQsIG5vIG5lZWQgdG8gZ28gYW55IGZ1cnRoZXIuXG4gICAgICAgIGlmICghc3RhdGUucmVhc29uIHx8ICFwcm9taXNlLm9uY2FuY2VsbGVkKSB7IHJldHVybjsgfVxuXG4gICAgICAgIGNhbmNlbGxhdGlvblByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHByb21pc2Uub25jYW5jZWxsZWQhKHN0YXRlLnJlYXNvbiEuY2F1c2UpKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIFByb21pc2UucmVqZWN0KG5ldyBDYW5jZWxsZWRSZWplY3Rpb25FcnJvcihwcm9taXNlLnByb21pc2UsIGVyciwgXCJVbmhhbmRsZWQgZXhjZXB0aW9uIGluIG9uY2FuY2VsbGVkIGNhbGxiYWNrLlwiKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pLmNhdGNoKChyZWFzb24/KSA9PiB7XG4gICAgICAgICAgICBQcm9taXNlLnJlamVjdChuZXcgQ2FuY2VsbGVkUmVqZWN0aW9uRXJyb3IocHJvbWlzZS5wcm9taXNlLCByZWFzb24sIFwiVW5oYW5kbGVkIHJlamVjdGlvbiBpbiBvbmNhbmNlbGxlZCBjYWxsYmFjay5cIikpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBVbnNldCBvbmNhbmNlbGxlZCB0byBwcmV2ZW50IHJlcGVhdGVkIGNhbGxzLlxuICAgICAgICBwcm9taXNlLm9uY2FuY2VsbGVkID0gbnVsbDtcblxuICAgICAgICByZXR1cm4gY2FuY2VsbGF0aW9uUHJvbWlzZTtcbiAgICB9XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGNhbGxiYWNrIHRoYXQgaW1wbGVtZW50cyB0aGUgcmVzb2x1dGlvbiBhbGdvcml0aG0gZm9yIHRoZSBnaXZlbiBjYW5jZWxsYWJsZSBwcm9taXNlLlxuICovXG5mdW5jdGlvbiByZXNvbHZlckZvcjxUPihwcm9taXNlOiBDYW5jZWxsYWJsZVByb21pc2VXaXRoUmVzb2x2ZXJzPFQ+LCBzdGF0ZTogQ2FuY2VsbGFibGVQcm9taXNlU3RhdGUpOiBDYW5jZWxsYWJsZVByb21pc2VSZXNvbHZlcjxUPiB7XG4gICAgcmV0dXJuICh2YWx1ZSkgPT4ge1xuICAgICAgICBpZiAoc3RhdGUucmVzb2x2aW5nKSB7IHJldHVybjsgfVxuICAgICAgICBzdGF0ZS5yZXNvbHZpbmcgPSB0cnVlO1xuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gcHJvbWlzZS5wcm9taXNlKSB7XG4gICAgICAgICAgICBpZiAoc3RhdGUuc2V0dGxlZCkgeyByZXR1cm47IH1cbiAgICAgICAgICAgIHN0YXRlLnNldHRsZWQgPSB0cnVlO1xuICAgICAgICAgICAgcHJvbWlzZS5yZWplY3QobmV3IFR5cGVFcnJvcihcIkEgcHJvbWlzZSBjYW5ub3QgYmUgcmVzb2x2ZWQgd2l0aCBpdHNlbGYuXCIpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgICAgICAgIGxldCB0aGVuOiBhbnk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoZW4gPSAodmFsdWUgYXMgYW55KS50aGVuO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgc3RhdGUuc2V0dGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgcHJvbWlzZS5yZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpc0NhbGxhYmxlKHRoZW4pKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNhbmNlbCA9ICh2YWx1ZSBhcyBhbnkpLmNhbmNlbDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ2FsbGFibGUoY2FuY2VsKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb25jYW5jZWxsZWQgPSAoY2F1c2U/OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZsZWN0LmFwcGx5KGNhbmNlbCwgdmFsdWUsIFtjYXVzZV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5yZWFzb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBhbHJlYWR5IGNhbmNlbGxlZCwgcHJvcGFnYXRlIGNhbmNlbGxhdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcHJvbWlzZSByZXR1cm5lZCBmcm9tIHRoZSBjYW5jZWxsZXIgYWxnb3JpdGhtIGRvZXMgbm90IHJlamVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIGl0IGNhbiBiZSBkaXNjYXJkZWQgc2FmZWx5LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgY2FuY2VsbGVyRm9yKHsgLi4ucHJvbWlzZSwgb25jYW5jZWxsZWQgfSwgc3RhdGUpKHN0YXRlLnJlYXNvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2Uub25jYW5jZWxsZWQgPSBvbmNhbmNlbGxlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2gge31cblxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1N0YXRlOiBDYW5jZWxsYWJsZVByb21pc2VTdGF0ZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgcm9vdDogc3RhdGUucm9vdCxcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2aW5nOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgZ2V0IHNldHRsZWQoKSB7IHJldHVybiB0aGlzLnJvb3Quc2V0dGxlZCB9LFxuICAgICAgICAgICAgICAgICAgICBzZXQgc2V0dGxlZCh2YWx1ZSkgeyB0aGlzLnJvb3Quc2V0dGxlZCA9IHZhbHVlOyB9LFxuICAgICAgICAgICAgICAgICAgICBnZXQgcmVhc29uKCkgeyByZXR1cm4gdGhpcy5yb290LnJlYXNvbiB9XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlamVjdG9yID0gcmVqZWN0b3JGb3IocHJvbWlzZSwgbmV3U3RhdGUpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIFJlZmxlY3QuYXBwbHkodGhlbiwgdmFsdWUsIFtyZXNvbHZlckZvcihwcm9taXNlLCBuZXdTdGF0ZSksIHJlamVjdG9yXSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdG9yKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjsgLy8gSU1QT1JUQU5UIVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0YXRlLnNldHRsZWQpIHsgcmV0dXJuOyB9XG4gICAgICAgIHN0YXRlLnNldHRsZWQgPSB0cnVlO1xuICAgICAgICBwcm9taXNlLnJlc29sdmUodmFsdWUpO1xuICAgIH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGNhbGxiYWNrIHRoYXQgaW1wbGVtZW50cyB0aGUgcmVqZWN0aW9uIGFsZ29yaXRobSBmb3IgdGhlIGdpdmVuIGNhbmNlbGxhYmxlIHByb21pc2UuXG4gKi9cbmZ1bmN0aW9uIHJlamVjdG9yRm9yPFQ+KHByb21pc2U6IENhbmNlbGxhYmxlUHJvbWlzZVdpdGhSZXNvbHZlcnM8VD4sIHN0YXRlOiBDYW5jZWxsYWJsZVByb21pc2VTdGF0ZSk6IENhbmNlbGxhYmxlUHJvbWlzZVJlamVjdG9yIHtcbiAgICByZXR1cm4gKHJlYXNvbj8pID0+IHtcbiAgICAgICAgaWYgKHN0YXRlLnJlc29sdmluZykgeyByZXR1cm47IH1cbiAgICAgICAgc3RhdGUucmVzb2x2aW5nID0gdHJ1ZTtcblxuICAgICAgICBpZiAoc3RhdGUuc2V0dGxlZCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAocmVhc29uIGluc3RhbmNlb2YgQ2FuY2VsRXJyb3IgJiYgc3RhdGUucmVhc29uIGluc3RhbmNlb2YgQ2FuY2VsRXJyb3IgJiYgT2JqZWN0LmlzKHJlYXNvbi5jYXVzZSwgc3RhdGUucmVhc29uLmNhdXNlKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTd2FsbG93IGxhdGUgcmVqZWN0aW9ucyB0aGF0IGFyZSBDYW5jZWxFcnJvcnMgd2hvc2UgY2FuY2VsbGF0aW9uIGNhdXNlIGlzIHRoZSBzYW1lIGFzIG91cnMuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIHt9XG5cbiAgICAgICAgICAgIHZvaWQgUHJvbWlzZS5yZWplY3QobmV3IENhbmNlbGxlZFJlamVjdGlvbkVycm9yKHByb21pc2UucHJvbWlzZSwgcmVhc29uKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdGF0ZS5zZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHByb21pc2UucmVqZWN0KHJlYXNvbik7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogQ2FuY2VscyBhbGwgdmFsdWVzIGluIGFuIGFycmF5IHRoYXQgbG9vayBsaWtlIGNhbmNlbGxhYmxlIHRoZW5hYmxlcy5cbiAqIFJldHVybnMgYSBwcm9taXNlIHRoYXQgZnVsZmlsbHMgb25jZSBhbGwgY2FuY2VsbGF0aW9uIHByb2NlZHVyZXMgZm9yIHRoZSBnaXZlbiB2YWx1ZXMgaGF2ZSBzZXR0bGVkLlxuICovXG5mdW5jdGlvbiBjYW5jZWxBbGwocGFyZW50OiBDYW5jZWxsYWJsZVByb21pc2U8dW5rbm93bj4sIHZhbHVlczogYW55W10sIGNhdXNlPzogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcmVzdWx0cyA9IFtdO1xuXG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgICAgbGV0IGNhbmNlbDogQ2FuY2VsbGFibGVQcm9taXNlQ2FuY2VsbGVyO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCFpc0NhbGxhYmxlKHZhbHVlLnRoZW4pKSB7IGNvbnRpbnVlOyB9XG4gICAgICAgICAgICBjYW5jZWwgPSB2YWx1ZS5jYW5jZWw7XG4gICAgICAgICAgICBpZiAoIWlzQ2FsbGFibGUoY2FuY2VsKSkgeyBjb250aW51ZTsgfVxuICAgICAgICB9IGNhdGNoIHsgY29udGludWU7IH1cblxuICAgICAgICBsZXQgcmVzdWx0OiB2b2lkIHwgUHJvbWlzZUxpa2U8dm9pZD47XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXN1bHQgPSBSZWZsZWN0LmFwcGx5KGNhbmNlbCwgdmFsdWUsIFtjYXVzZV0pO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIFByb21pc2UucmVqZWN0KG5ldyBDYW5jZWxsZWRSZWplY3Rpb25FcnJvcihwYXJlbnQsIGVyciwgXCJVbmhhbmRsZWQgZXhjZXB0aW9uIGluIGNhbmNlbCBtZXRob2QuXCIpKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFyZXN1bHQpIHsgY29udGludWU7IH1cbiAgICAgICAgcmVzdWx0cy5wdXNoKFxuICAgICAgICAgICAgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UgID8gcmVzdWx0IDogUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkpLmNhdGNoKChyZWFzb24/KSA9PiB7XG4gICAgICAgICAgICAgICAgUHJvbWlzZS5yZWplY3QobmV3IENhbmNlbGxlZFJlamVjdGlvbkVycm9yKHBhcmVudCwgcmVhc29uLCBcIlVuaGFuZGxlZCByZWplY3Rpb24gaW4gY2FuY2VsIG1ldGhvZC5cIikpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gUHJvbWlzZS5hbGwocmVzdWx0cykgYXMgYW55O1xufVxuXG4vKipcbiAqIFJldHVybnMgaXRzIGFyZ3VtZW50LlxuICovXG5mdW5jdGlvbiBpZGVudGl0eTxUPih4OiBUKTogVCB7XG4gICAgcmV0dXJuIHg7XG59XG5cbi8qKlxuICogVGhyb3dzIGl0cyBhcmd1bWVudC5cbiAqL1xuZnVuY3Rpb24gdGhyb3dlcihyZWFzb24/OiBhbnkpOiBuZXZlciB7XG4gICAgdGhyb3cgcmVhc29uO1xufVxuXG4vKipcbiAqIEF0dGVtcHRzIHZhcmlvdXMgc3RyYXRlZ2llcyB0byBjb252ZXJ0IGFuIGVycm9yIHRvIGEgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBlcnJvck1lc3NhZ2UoZXJyOiBhbnkpOiBzdHJpbmcge1xuICAgIHRyeSB7XG4gICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBFcnJvciB8fCB0eXBlb2YgZXJyICE9PSAnb2JqZWN0JyB8fCBlcnIudG9TdHJpbmcgIT09IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBcIlwiICsgZXJyO1xuICAgICAgICB9XG4gICAgfSBjYXRjaCB7fVxuXG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGVycik7XG4gICAgfSBjYXRjaCB7fVxuXG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlcnIpO1xuICAgIH0gY2F0Y2gge31cblxuICAgIHJldHVybiBcIjxjb3VsZCBub3QgY29udmVydCBlcnJvciB0byBzdHJpbmc+XCI7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgY3VycmVudCBiYXJyaWVyIHByb21pc2UgZm9yIHRoZSBnaXZlbiBjYW5jZWxsYWJsZSBwcm9taXNlLiBJZiBuZWNlc3NhcnksIGluaXRpYWxpc2VzIHRoZSBiYXJyaWVyLlxuICovXG5mdW5jdGlvbiBjdXJyZW50QmFycmllcjxUPihwcm9taXNlOiBDYW5jZWxsYWJsZVByb21pc2U8VD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgcHdyOiBQYXJ0aWFsPFByb21pc2VXaXRoUmVzb2x2ZXJzPHZvaWQ+PiA9IHByb21pc2VbYmFycmllclN5bV0gPz8ge307XG4gICAgaWYgKCEoJ3Byb21pc2UnIGluIHB3cikpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihwd3IsIHByb21pc2VXaXRoUmVzb2x2ZXJzPHZvaWQ+KCkpO1xuICAgIH1cbiAgICBpZiAocHJvbWlzZVtiYXJyaWVyU3ltXSA9PSBudWxsKSB7XG4gICAgICAgIHB3ci5yZXNvbHZlISgpO1xuICAgICAgICBwcm9taXNlW2JhcnJpZXJTeW1dID0gcHdyO1xuICAgIH1cbiAgICByZXR1cm4gcHdyLnByb21pc2UhO1xufVxuXG4vLyBQb2x5ZmlsbCBQcm9taXNlLndpdGhSZXNvbHZlcnMuXG5sZXQgcHJvbWlzZVdpdGhSZXNvbHZlcnMgPSBQcm9taXNlLndpdGhSZXNvbHZlcnM7XG5pZiAocHJvbWlzZVdpdGhSZXNvbHZlcnMgJiYgdHlwZW9mIHByb21pc2VXaXRoUmVzb2x2ZXJzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcHJvbWlzZVdpdGhSZXNvbHZlcnMgPSBwcm9taXNlV2l0aFJlc29sdmVycy5iaW5kKFByb21pc2UpO1xufSBlbHNlIHtcbiAgICBwcm9taXNlV2l0aFJlc29sdmVycyA9IGZ1bmN0aW9uIDxUPigpOiBQcm9taXNlV2l0aFJlc29sdmVyczxUPiB7XG4gICAgICAgIGxldCByZXNvbHZlITogKHZhbHVlOiBUIHwgUHJvbWlzZUxpa2U8VD4pID0+IHZvaWQ7XG4gICAgICAgIGxldCByZWplY3QhOiAocmVhc29uPzogYW55KSA9PiB2b2lkO1xuICAgICAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2U8VD4oKHJlcywgcmVqKSA9PiB7IHJlc29sdmUgPSByZXM7IHJlamVjdCA9IHJlajsgfSk7XG4gICAgICAgIHJldHVybiB7IHByb21pc2UsIHJlc29sdmUsIHJlamVjdCB9O1xuICAgIH1cbn0iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbmltcG9ydCB7bmV3UnVudGltZUNhbGxlciwgb2JqZWN0TmFtZXN9IGZyb20gXCIuL3J1bnRpbWUuanNcIjtcblxuY29uc3QgY2FsbCA9IG5ld1J1bnRpbWVDYWxsZXIob2JqZWN0TmFtZXMuQ2xpcGJvYXJkKTtcblxuY29uc3QgQ2xpcGJvYXJkU2V0VGV4dCA9IDA7XG5jb25zdCBDbGlwYm9hcmRUZXh0ID0gMTtcblxuLyoqXG4gKiBTZXRzIHRoZSB0ZXh0IHRvIHRoZSBDbGlwYm9hcmQuXG4gKlxuICogQHBhcmFtIHRleHQgLSBUaGUgdGV4dCB0byBiZSBzZXQgdG8gdGhlIENsaXBib2FyZC5cbiAqIEByZXR1cm4gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgb3BlcmF0aW9uIGlzIHN1Y2Nlc3NmdWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBTZXRUZXh0KHRleHQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBjYWxsKENsaXBib2FyZFNldFRleHQsIHt0ZXh0fSk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBDbGlwYm9hcmQgdGV4dFxuICpcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHRleHQgZnJvbSB0aGUgQ2xpcGJvYXJkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gVGV4dCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBjYWxsKENsaXBib2FyZFRleHQpO1xufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vKipcbiAqIEFueSBpcyBhIGR1bW15IGNyZWF0aW9uIGZ1bmN0aW9uIGZvciBzaW1wbGUgb3IgdW5rbm93biB0eXBlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEFueTxUPihzb3VyY2U6IGFueSk6IFQge1xuICAgIHJldHVybiBzb3VyY2U7XG59XG5cbi8qKlxuICogQnl0ZVNsaWNlIGlzIGEgY3JlYXRpb24gZnVuY3Rpb24gdGhhdCByZXBsYWNlc1xuICogbnVsbCBzdHJpbmdzIHdpdGggZW1wdHkgc3RyaW5ncy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEJ5dGVTbGljZShzb3VyY2U6IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuICgoc291cmNlID09IG51bGwpID8gXCJcIiA6IHNvdXJjZSk7XG59XG5cbi8qKlxuICogQXJyYXkgdGFrZXMgYSBjcmVhdGlvbiBmdW5jdGlvbiBmb3IgYW4gYXJiaXRyYXJ5IHR5cGVcbiAqIGFuZCByZXR1cm5zIGFuIGluLXBsYWNlIGNyZWF0aW9uIGZ1bmN0aW9uIGZvciBhbiBhcnJheVxuICogd2hvc2UgZWxlbWVudHMgYXJlIG9mIHRoYXQgdHlwZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEFycmF5PFQ+KGVsZW1lbnQ6IChzb3VyY2U6IGFueSkgPT4gVCk6IChzb3VyY2U6IGFueSkgPT4gVFtdIHtcbiAgICBpZiAoZWxlbWVudCA9PT0gQW55KSB7XG4gICAgICAgIHJldHVybiAoc291cmNlKSA9PiAoc291cmNlID09PSBudWxsID8gW10gOiBzb3VyY2UpO1xuICAgIH1cblxuICAgIHJldHVybiAoc291cmNlKSA9PiB7XG4gICAgICAgIGlmIChzb3VyY2UgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNvdXJjZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgc291cmNlW2ldID0gZWxlbWVudChzb3VyY2VbaV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgfTtcbn1cblxuLyoqXG4gKiBNYXAgdGFrZXMgY3JlYXRpb24gZnVuY3Rpb25zIGZvciB0d28gYXJiaXRyYXJ5IHR5cGVzXG4gKiBhbmQgcmV0dXJucyBhbiBpbi1wbGFjZSBjcmVhdGlvbiBmdW5jdGlvbiBmb3IgYW4gb2JqZWN0XG4gKiB3aG9zZSBrZXlzIGFuZCB2YWx1ZXMgYXJlIG9mIHRob3NlIHR5cGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gTWFwPFY+KGtleTogKHNvdXJjZTogYW55KSA9PiBzdHJpbmcsIHZhbHVlOiAoc291cmNlOiBhbnkpID0+IFYpOiAoc291cmNlOiBhbnkpID0+IFJlY29yZDxzdHJpbmcsIFY+IHtcbiAgICBpZiAodmFsdWUgPT09IEFueSkge1xuICAgICAgICByZXR1cm4gKHNvdXJjZSkgPT4gKHNvdXJjZSA9PT0gbnVsbCA/IHt9IDogc291cmNlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKHNvdXJjZSkgPT4ge1xuICAgICAgICBpZiAoc291cmNlID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgICAgICBzb3VyY2Vba2V5XSA9IHZhbHVlKHNvdXJjZVtrZXldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc291cmNlO1xuICAgIH07XG59XG5cbi8qKlxuICogTnVsbGFibGUgdGFrZXMgYSBjcmVhdGlvbiBmdW5jdGlvbiBmb3IgYW4gYXJiaXRyYXJ5IHR5cGVcbiAqIGFuZCByZXR1cm5zIGEgY3JlYXRpb24gZnVuY3Rpb24gZm9yIGEgbnVsbGFibGUgdmFsdWUgb2YgdGhhdCB0eXBlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gTnVsbGFibGU8VD4oZWxlbWVudDogKHNvdXJjZTogYW55KSA9PiBUKTogKHNvdXJjZTogYW55KSA9PiAoVCB8IG51bGwpIHtcbiAgICBpZiAoZWxlbWVudCA9PT0gQW55KSB7XG4gICAgICAgIHJldHVybiBBbnk7XG4gICAgfVxuXG4gICAgcmV0dXJuIChzb3VyY2UpID0+IChzb3VyY2UgPT09IG51bGwgPyBudWxsIDogZWxlbWVudChzb3VyY2UpKTtcbn1cblxuLyoqXG4gKiBTdHJ1Y3QgdGFrZXMgYW4gb2JqZWN0IG1hcHBpbmcgZmllbGQgbmFtZXMgdG8gY3JlYXRpb24gZnVuY3Rpb25zXG4gKiBhbmQgcmV0dXJucyBhbiBpbi1wbGFjZSBjcmVhdGlvbiBmdW5jdGlvbiBmb3IgYSBzdHJ1Y3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBTdHJ1Y3Q8XG4gICAgVCBleHRlbmRzIHsgW186IHN0cmluZ106ICgoc291cmNlOiBhbnkpID0+IGFueSkgfSxcbiAgICBVIGV4dGVuZHMgeyBbS2V5IGluIGtleW9mIFRdPzogUmV0dXJuVHlwZTxUW0tleV0+IH1cbj4oY3JlYXRlRmllbGQ6IFQpOiAoc291cmNlOiBhbnkpID0+IFUge1xuICAgIGxldCBhbGxBbnkgPSB0cnVlO1xuICAgIGZvciAoY29uc3QgbmFtZSBpbiBjcmVhdGVGaWVsZCkge1xuICAgICAgICBpZiAoY3JlYXRlRmllbGRbbmFtZV0gIT09IEFueSkge1xuICAgICAgICAgICAgYWxsQW55ID0gZmFsc2U7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoYWxsQW55KSB7XG4gICAgICAgIHJldHVybiBBbnk7XG4gICAgfVxuXG4gICAgcmV0dXJuIChzb3VyY2UpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBuYW1lIGluIGNyZWF0ZUZpZWxkKSB7XG4gICAgICAgICAgICBpZiAobmFtZSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBzb3VyY2VbbmFtZV0gPSBjcmVhdGVGaWVsZFtuYW1lXShzb3VyY2VbbmFtZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgfTtcbn1cbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuZXhwb3J0IGludGVyZmFjZSBTaXplIHtcbiAgICAvKiogVGhlIHdpZHRoIG9mIGEgcmVjdGFuZ3VsYXIgYXJlYS4gKi9cbiAgICBXaWR0aDogbnVtYmVyO1xuICAgIC8qKiBUaGUgaGVpZ2h0IG9mIGEgcmVjdGFuZ3VsYXIgYXJlYS4gKi9cbiAgICBIZWlnaHQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWN0IHtcbiAgICAvKiogVGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgb3JpZ2luLiAqL1xuICAgIFg6IG51bWJlcjtcbiAgICAvKiogVGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgb3JpZ2luLiAqL1xuICAgIFk6IG51bWJlcjtcbiAgICAvKiogVGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUuICovXG4gICAgV2lkdGg6IG51bWJlcjtcbiAgICAvKiogVGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLiAqL1xuICAgIEhlaWdodDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNjcmVlbiB7XG4gICAgLyoqIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgc2NyZWVuLiAqL1xuICAgIElEOiBzdHJpbmc7XG4gICAgLyoqIEh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIHNjcmVlbi4gKi9cbiAgICBOYW1lOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBzY2FsZSBmYWN0b3Igb2YgdGhlIHNjcmVlbiAoRFBJLzk2KS4gMSA9IHN0YW5kYXJkIERQSSwgMiA9IEhpRFBJIChSZXRpbmEpLCBldGMuICovXG4gICAgU2NhbGVGYWN0b3I6IG51bWJlcjtcbiAgICAvKiogVGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgc2NyZWVuLiAqL1xuICAgIFg6IG51bWJlcjtcbiAgICAvKiogVGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgc2NyZWVuLiAqL1xuICAgIFk6IG51bWJlcjtcbiAgICAvKiogQ29udGFpbnMgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIHNjcmVlbi4gKi9cbiAgICBTaXplOiBTaXplO1xuICAgIC8qKiBDb250YWlucyB0aGUgYm91bmRzIG9mIHRoZSBzY3JlZW4gaW4gdGVybXMgb2YgWCwgWSwgV2lkdGgsIGFuZCBIZWlnaHQuICovXG4gICAgQm91bmRzOiBSZWN0O1xuICAgIC8qKiBDb250YWlucyB0aGUgcGh5c2ljYWwgYm91bmRzIG9mIHRoZSBzY3JlZW4gaW4gdGVybXMgb2YgWCwgWSwgV2lkdGgsIGFuZCBIZWlnaHQgKGJlZm9yZSBzY2FsaW5nKS4gKi9cbiAgICBQaHlzaWNhbEJvdW5kczogUmVjdDtcbiAgICAvKiogQ29udGFpbnMgdGhlIGFyZWEgb2YgdGhlIHNjcmVlbiB0aGF0IGlzIGFjdHVhbGx5IHVzYWJsZSAoZXhjbHVkaW5nIHRhc2tiYXIgYW5kIG90aGVyIHN5c3RlbSBVSSkuICovXG4gICAgV29ya0FyZWE6IFJlY3Q7XG4gICAgLyoqIENvbnRhaW5zIHRoZSBwaHlzaWNhbCBXb3JrQXJlYSBvZiB0aGUgc2NyZWVuIChiZWZvcmUgc2NhbGluZykuICovXG4gICAgUGh5c2ljYWxXb3JrQXJlYTogUmVjdDtcbiAgICAvKiogVHJ1ZSBpZiB0aGlzIGlzIHRoZSBwcmltYXJ5IG1vbml0b3Igc2VsZWN0ZWQgYnkgdGhlIHVzZXIgaW4gdGhlIG9wZXJhdGluZyBzeXN0ZW0uICovXG4gICAgSXNQcmltYXJ5OiBib29sZWFuO1xuICAgIC8qKiBUaGUgcm90YXRpb24gb2YgdGhlIHNjcmVlbi4gKi9cbiAgICBSb3RhdGlvbjogbnVtYmVyO1xufVxuXG5pbXBvcnQgeyBuZXdSdW50aW1lQ2FsbGVyLCBvYmplY3ROYW1lcyB9IGZyb20gXCIuL3J1bnRpbWUuanNcIjtcbmNvbnN0IGNhbGwgPSBuZXdSdW50aW1lQ2FsbGVyKG9iamVjdE5hbWVzLlNjcmVlbnMpO1xuXG5jb25zdCBnZXRBbGwgPSAwO1xuY29uc3QgZ2V0UHJpbWFyeSA9IDE7XG5jb25zdCBnZXRDdXJyZW50ID0gMjtcblxuLyoqXG4gKiBHZXRzIGFsbCBzY3JlZW5zLlxuICpcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IG9mIFNjcmVlbiBvYmplY3RzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gR2V0QWxsKCk6IFByb21pc2U8U2NyZWVuW10+IHtcbiAgICByZXR1cm4gY2FsbChnZXRBbGwpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIHByaW1hcnkgc2NyZWVuLlxuICpcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBwcmltYXJ5IHNjcmVlbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEdldFByaW1hcnkoKTogUHJvbWlzZTxTY3JlZW4+IHtcbiAgICByZXR1cm4gY2FsbChnZXRQcmltYXJ5KTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBjdXJyZW50IGFjdGl2ZSBzY3JlZW4uXG4gKlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgY3VycmVudCBhY3RpdmUgc2NyZWVuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gR2V0Q3VycmVudCgpOiBQcm9taXNlPFNjcmVlbj4ge1xuICAgIHJldHVybiBjYWxsKGdldEN1cnJlbnQpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7QUNBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7QUNBQTtBQUFBO0FBQUE7QUFBQTs7O0FDNkJBLElB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O0FBQUEsSUFDdEMsb0NBQW9DO0FBQUEsSUFDcEMsMENBQTBDO0FBQUEsSUFDMUMsMkJBQTJCO0FBQUEsSUFDM0IsK0JBQStCO0FBQUEsSUFDL0Isb0JBQW9CO0FBQUEsSUFDcEIsNEJBQTRCO0FBQUEsSUFDNUIsc0JBQXNCO0FBQUEsSUFDdEIsc0JBQXNCO0FBQUEsSUFDdEIsK0JBQStCO0FBQUEsSUFDL0IsNkJBQTZCO0FBQUEsSUFDN0IsZ0NBQWdDO0FBQUEsSUFDaEMscUJBQXFCO0FBQUEsSUFDckIsNkJBQTZCO0FBQUEsSUFDN0IsMEJBQTBCO0FBQUEsSUFDMUIsdUJBQXVCO0FBQUEsSUFDdkIsdUJBQXVCO0FBQUEsSUFDdkIsZ0JBQWdCO0FBQUEsSUFDaEIsc0JBQXNCO0FBQUEsSUFDdEIsY0FBYztBQUFBLElBQ2Qsb0JBQW9CO0FBQUEsSUFDcEIsb0JBQW9CO0FBQUEsSUFDcEIsc0JBQXNCO0FBQUEsSUFDdEIsYUFBYTtBQUFBLElBQ2IsY0FBYztBQUFBLElBQ2QsbUJBQW1CO0FBQUEsSUFDbkIsbUJBQW1CO0FBQUEsSUFDbkIseUJBQXlCO0FBQUEsSUFDekIsZUFBZTtBQUFBLElBQ2YsaUJBQWlCO0FBQUEsSUFDakIsdUJBQXVCO0FBQUEsSUFDdkIscUJBQXFCO0FBQUEsSUFDckIscUJBQXFCO0FBQUEsSUFDckIsdUJBQXVCO0FBQUEsSUFDdkIsY0FBYztBQUFBLElBQ2QsZUFBZTtBQUFBLElBQ2Ysb0JBQW9CO0FBQUEsSUFDcEIsb0JBQW9CO0FBQUEsSUFDcEIsMEJBQTBCO0FBQUEsSUFDMUIsZ0JBQWdCO0FBQUEsSUFDaEIsNEJBQTRCO0FBQUEsSUFDNUIsNEJBQTRCO0FBQUEsSUFDNUIseURBQXlEO0FBQUEsSUFDekQsc0NBQXNDO0FBQUEsSUFDdEMsb0JBQW9CO0FBQUEsSUFDcEIscUJBQXFCO0FBQUEsSUFDckIscUJBQXFCO0FBQUEsSUFDckIsc0JBQXNCO0FBQUEsSUFDdEIsZ0NBQWdDO0FBQUEsSUFDaEMsa0NBQWtDO0FBQUEsSUFDbEMsbUNBQW1DO0FBQUEsSUFDbkMsb0NBQW9DO0FBQUEsSUFDcEMsK0JBQStCO0FBQUEsSUFDL0IsNkJBQTZCO0FBQUEsSUFDN0IsdUJBQXVCO0FBQUEsSUFDdkIsaUNBQWlDO0FBQUEsSUFDakMsOEJBQThCO0FBQUEsSUFDOUIsNEJBQTRCO0FBQUEsSUFDNUIsc0NBQXNDO0FBQUEsSUFDdEMsNEJBQTRCO0FBQUEsSUFDNUIsc0JBQXNCO0FBQUEsSUFDdEIsa0NBQWtDO0FBQUEsSUFDbEMsc0JBQXNCO0FBQUEsSUFDdEIsd0JBQXdCO0FBQUEsSUFDeEIsd0JBQXdCO0FBQUEsSUFDeEIsbUJBQW1CO0FBQUEsSUFDbkIsMEJBQTBCO0FBQUEsSUFDMUIsOEJBQThCO0FBQUEsSUFDOUIseUJBQXlCO0FBQUEsSUFDekIsNkJBQTZCO0FBQUEsSUFDN0IsaUJBQWlCO0FBQUEsSUFDakIsZ0JBQWdCO0FBQUEsSUFDaEIsc0JBQXNCO0FBQUEsSUFDdEIsZUFBZTtBQUFBLElBQ2YseUJBQXlCO0FBQUEsSUFDekIsd0JBQXdCO0FBQUEsSUFDeEIsb0JBQW9CO0FBQUEsSUFDcEIscUJBQXFCO0FBQUEsSUFDckIsaUJBQWlCO0FBQUEsSUFDakIsaUJBQWlCO0FBQUEsSUFDakIsc0JBQXNCO0FBQUEsSUFDdEIsbUNBQW1DO0FBQUEsSUFDbkMscUNBQXFDO0FBQUEsSUFDckMsdUJBQXVCO0FBQUEsSUFDdkIsc0JBQXNCO0FBQUEsSUFDdEIsd0JBQXdCO0FBQUEsSUFDeEIsZUFBZTtBQUFBLElBQ2YsMkJBQTJCO0FBQUEsSUFDM0IsMEJBQTBCO0FBQUEsSUFDMUIsNkJBQTZCO0FBQUEsSUFDN0IsWUFBWTtBQUFBLElBQ1osZ0JBQWdCO0FBQUEsSUFDaEIsa0JBQWtCO0FBQUEsSUFDbEIsZ0JBQWdCO0FBQUEsSUFDaEIsa0JBQWtCO0FBQUEsSUFDbEIsbUJBQW1CO0FBQUEsSUFDbkIsWUFBWTtBQUFBLElBQ1oscUJBQXFCO0FBQUEsSUFDckIsc0JBQXNCO0FBQUEsSUFDdEIsc0JBQXNCO0FBQUEsSUFDdEIsOEJBQThCO0FBQUEsSUFDOUIsaUJBQWlCO0FBQUEsSUFDakIs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LElBQUksSUFBSSxZQUFZLElBQUksRUFBRSxPQUFPLElBQUksQ0FBQztBQUFBLE1BQ2pEO0FBQUEsSUFDSjtBQUNBLFdBQU87QUFBQSxFQUNYO0FBQ0o7OztBQzFHQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUF3REEsSUFBTUMsUUFBTyxpQkFBaUIsWUFBWSxPQUFPO0FBRWpELElBQU0sU0FBUztBQUNmLElBQU0sYUFBYTtBQUNuQixJQUFNLGFBQWE7QUFPWixTQUFTLFNBQTRCO0FBQ3hDLFNBQU9BLE1BQUssTUFBTTtBQUN0QjtBQU9PLFNBQVMsYUFBOEI7QUFDMUMsU0FBT0EsTUFBSyxVQUFVO0FBQzFCO0FBT08sU0FBUyxhQUE4QjtBQUMxQyxTQUFPQSxNQUFLLFVBQVU7QUFDMUI7OztBdEI1RUEsT0FBTyxTQUFTLE9BQU8sVUFBVSxDQUFDO0FBNENsQyxPQUFPLE9BQU8sU0FBZ0I7QUFDdkIsT0FBTyxxQkFBcUI7IiwKICAibmFtZXMiOiBbIl9hIiwgIkVycm9yIiwgImNhbGwiLCAiX2EiLCAiRXJyb3IiLCAiY2FsbCIsICJfYSIsICJyZXNpemFibGUiLCAiY2FsbCIsICJfYSIsICJjYWxsIiwgImNhbGwiLCAiSGlkZU1ldGhvZCIsICJTaG93TWV0aG9kIiwgImlzRG9jdW1lbnREb3RBbGwiLCAiX2EiLCAicmVhc29uIiwgInZhbHVlIiwgImNhbGwiLCAiZ2V0QW5kRGVsZXRlUmVzcG9uc2UiLCAiZ2VuZXJhdGVJRCIsICJjYWxsIiwgIkFycmF5IiwgIk1hcCIsICJBcnJheSIsICJNYXAiLCAia2V5IiwgImNhbGwiXQp9Cg== +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2luZGV4LnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy93bWwudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2Jyb3dzZXIudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL25hbm9pZC50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvcnVudGltZS50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvZGlhbG9ncy50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvZXZlbnRzLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9saXN0ZW5lci50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvZXZlbnRfdHlwZXMudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3V0aWxzLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy93aW5kb3cudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL2NvbXBpbGVkL21haW4uanMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3N5c3RlbS50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvY29udGV4dG1lbnUudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2ZsYWdzLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9kcmFnLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9hcHBsaWNhdGlvbi50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvY2FsbHMudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2NhbGxhYmxlLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9jYW5jZWxsYWJsZS50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvY2xpcGJvYXJkLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9jcmVhdGUudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3NjcmVlbnMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vLyBTZXR1cFxud2luZG93Ll93YWlscyA9IHdpbmRvdy5fd2FpbHMgfHwge307XG5cbmltcG9ydCBcIi4vY29udGV4dG1lbnUuanNcIjtcbmltcG9ydCBcIi4vZHJhZy5qc1wiO1xuXG4vLyBSZS1leHBvcnQgcHVibGljIEFQSVxuaW1wb3J0ICogYXMgQXBwbGljYXRpb24gZnJvbSBcIi4vYXBwbGljYXRpb24uanNcIjtcbmltcG9ydCAqIGFzIEJyb3dzZXIgZnJvbSBcIi4vYnJvd3Nlci5qc1wiO1xuaW1wb3J0ICogYXMgQ2FsbCBmcm9tIFwiLi9jYWxscy5qc1wiO1xuaW1wb3J0ICogYXMgQ2xpcGJvYXJkIGZyb20gXCIuL2NsaXBib2FyZC5qc1wiO1xuaW1wb3J0ICogYXMgQ3JlYXRlIGZyb20gXCIuL2NyZWF0ZS5qc1wiO1xuaW1wb3J0ICogYXMgRGlhbG9ncyBmcm9tIFwiLi9kaWFsb2dzLmpzXCI7XG5pbXBvcnQgKiBhcyBFdmVudHMgZnJvbSBcIi4vZXZlbnRzLmpzXCI7XG5pbXBvcnQgKiBhcyBGbGFncyBmcm9tIFwiLi9mbGFncy5qc1wiO1xuaW1wb3J0ICogYXMgU2NyZWVucyBmcm9tIFwiLi9zY3JlZW5zLmpzXCI7XG5pbXBvcnQgKiBhcyBTeXN0ZW0gZnJvbSBcIi4vc3lzdGVtLmpzXCI7XG5pbXBvcnQgV2luZG93IGZyb20gXCIuL3dpbmRvdy5qc1wiO1xuaW1wb3J0ICogYXMgV01MIGZyb20gXCIuL3dtbC5qc1wiO1xuXG5leHBvcnQge1xuICAgIEFwcGxpY2F0aW9uLFxuICAgIEJyb3dzZXIsXG4gICAgQ2FsbCxcbiAgICBDbGlwYm9hcmQsXG4gICAgRGlhbG9ncyxcbiAgICBFdmVudHMsXG4gICAgRmxhZ3MsXG4gICAgU2NyZWVucyxcbiAgICBTeXN0ZW0sXG4gICAgV2luZG93LFxuICAgIFdNTFxufTtcblxuLyoqXG4gKiBBbiBpbnRlcm5hbCB1dGlsaXR5IGNvbnN1bWVkIGJ5IHRoZSBiaW5kaW5nIGdlbmVyYXRvci5cbiAqXG4gKiBAaWdub3JlXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IHsgQ3JlYXRlIH07XG5cbmV4cG9ydCAqIGZyb20gXCIuL2NhbmNlbGxhYmxlLmpzXCI7XG5cbi8vIE5vdGlmeSBiYWNrZW5kXG53aW5kb3cuX3dhaWxzLmludm9rZSA9IFN5c3RlbS5pbnZva2U7XG5TeXN0ZW0uaW52b2tlKFwid2FpbHM6cnVudGltZTpyZWFkeVwiKTtcbiIsICIvKlxuIF8gICAgIF9fICAgICBfIF9fXG58IHwgIC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuaW1wb3J0IHsgT3BlblVSTCB9IGZyb20gXCIuL2Jyb3dzZXIuanNcIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4vZGlhbG9ncy5qc1wiO1xuaW1wb3J0IHsgRW1pdCwgV2FpbHNFdmVudCB9IGZyb20gXCIuL2V2ZW50cy5qc1wiO1xuaW1wb3J0IHsgY2FuQWJvcnRMaXN0ZW5lcnMsIHdoZW5SZWFkeSB9IGZyb20gXCIuL3V0aWxzLmpzXCI7XG5pbXBvcnQgV2luZG93IGZyb20gXCIuL3dpbmRvdy5qc1wiO1xuXG4vKipcbiAqIFNlbmRzIGFuIGV2ZW50IHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIG9wdGlvbmFsIGRhdGEuXG4gKlxuICogQHBhcmFtIGV2ZW50TmFtZSAtIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIHNlbmQuXG4gKiBAcGFyYW0gW2RhdGE9bnVsbF0gLSAtIE9wdGlvbmFsIGRhdGEgdG8gc2VuZCBhbG9uZyB3aXRoIHRoZSBldmVudC5cbiAqL1xuZnVuY3Rpb24gc2VuZEV2ZW50KGV2ZW50TmFtZTogc3RyaW5nLCBkYXRhOiBhbnkgPSBudWxsKTogdm9pZCB7XG4gICAgRW1pdChuZXcgV2FpbHNFdmVudChldmVudE5hbWUsIGRhdGEpKTtcbn1cblxuLyoqXG4gKiBDYWxscyBhIG1ldGhvZCBvbiBhIHNwZWNpZmllZCB3aW5kb3cuXG4gKlxuICogQHBhcmFtIHdpbmRvd05hbWUgLSBUaGUgbmFtZSBvZiB0aGUgd2luZG93IHRvIGNhbGwgdGhlIG1ldGhvZCBvbi5cbiAqIEBwYXJhbSBtZXRob2ROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0byBjYWxsLlxuICovXG5mdW5jdGlvbiBjYWxsV2luZG93TWV0aG9kKHdpbmRvd05hbWU6IHN0cmluZywgbWV0aG9kTmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgdGFyZ2V0V2luZG93ID0gV2luZG93LkdldCh3aW5kb3dOYW1lKTtcbiAgICBjb25zdCBtZXRob2QgPSAodGFyZ2V0V2luZG93IGFzIGFueSlbbWV0aG9kTmFtZV07XG5cbiAgICBpZiAodHlwZW9mIG1ldGhvZCAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFdpbmRvdyBtZXRob2QgJyR7bWV0aG9kTmFtZX0nIG5vdCBmb3VuZGApO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgICAgbWV0aG9kLmNhbGwodGFyZ2V0V2luZG93KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIGNhbGxpbmcgd2luZG93IG1ldGhvZCAnJHttZXRob2ROYW1lfSc6IGAsIGUpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZXNwb25kcyB0byBhIHRyaWdnZXJpbmcgZXZlbnQgYnkgcnVubmluZyBhcHByb3ByaWF0ZSBXTUwgYWN0aW9ucyBmb3IgdGhlIGN1cnJlbnQgdGFyZ2V0LlxuICovXG5mdW5jdGlvbiBvbldNTFRyaWdnZXJlZChldjogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBlbGVtZW50ID0gZXYuY3VycmVudFRhcmdldCBhcyBFbGVtZW50O1xuXG4gICAgZnVuY3Rpb24gcnVuRWZmZWN0KGNob2ljZSA9IFwiWWVzXCIpIHtcbiAgICAgICAgaWYgKGNob2ljZSAhPT0gXCJZZXNcIilcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjb25zdCBldmVudFR5cGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnd21sLWV2ZW50JykgfHwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtd21sLWV2ZW50Jyk7XG4gICAgICAgIGNvbnN0IHRhcmdldFdpbmRvdyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd3bWwtdGFyZ2V0LXdpbmRvdycpIHx8IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXdtbC10YXJnZXQtd2luZG93JykgfHwgXCJcIjtcbiAgICAgICAgY29uc3Qgd2luZG93TWV0aG9kID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3dtbC13aW5kb3cnKSB8fCBlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS13bWwtd2luZG93Jyk7XG4gICAgICAgIGNvbnN0IHVybCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd3bWwtb3BlbnVybCcpIHx8IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXdtbC1vcGVudXJsJyk7XG5cbiAgICAgICAgaWYgKGV2ZW50VHlwZSAhPT0gbnVsbClcbiAgICAgICAgICAgIHNlbmRFdmVudChldmVudFR5cGUpO1xuICAgICAgICBpZiAod2luZG93TWV0aG9kICE9PSBudWxsKVxuICAgICAgICAgICAgY2FsbFdpbmRvd01ldGhvZCh0YXJnZXRXaW5kb3csIHdpbmRvd01ldGhvZCk7XG4gICAgICAgIGlmICh1cmwgIT09IG51bGwpXG4gICAgICAgICAgICB2b2lkIE9wZW5VUkwodXJsKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb25maXJtID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3dtbC1jb25maXJtJykgfHwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtd21sLWNvbmZpcm0nKTtcblxuICAgIGlmIChjb25maXJtKSB7XG4gICAgICAgIFF1ZXN0aW9uKHtcbiAgICAgICAgICAgIFRpdGxlOiBcIkNvbmZpcm1cIixcbiAgICAgICAgICAgIE1lc3NhZ2U6IGNvbmZpcm0sXG4gICAgICAgICAgICBEZXRhY2hlZDogZmFsc2UsXG4gICAgICAgICAgICBCdXR0b25zOiBbXG4gICAgICAgICAgICAgICAgeyBMYWJlbDogXCJZZXNcIiB9LFxuICAgICAgICAgICAgICAgIHsgTGFiZWw6IFwiTm9cIiwgSXNEZWZhdWx0OiB0cnVlIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSkudGhlbihydW5FZmZlY3QpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJ1bkVmZmVjdCgpO1xuICAgIH1cbn1cblxuLy8gUHJpdmF0ZSBmaWVsZCBuYW1lcy5cbmNvbnN0IGNvbnRyb2xsZXJTeW0gPSBTeW1ib2woXCJjb250cm9sbGVyXCIpO1xuY29uc3QgdHJpZ2dlck1hcFN5bSA9IFN5bWJvbChcInRyaWdnZXJNYXBcIik7XG5jb25zdCBlbGVtZW50Q291bnRTeW0gPSBTeW1ib2woXCJlbGVtZW50Q291bnRcIik7XG5cbi8qKlxuICogQWJvcnRDb250cm9sbGVyUmVnaXN0cnkgZG9lcyBub3QgYWN0dWFsbHkgcmVtZW1iZXIgYWN0aXZlIGV2ZW50IGxpc3RlbmVyczogaW5zdGVhZFxuICogaXQgdGllcyB0aGVtIHRvIGFuIEFib3J0U2lnbmFsIGFuZCB1c2VzIGFuIEFib3J0Q29udHJvbGxlciB0byByZW1vdmUgdGhlbSBhbGwgYXQgb25jZS5cbiAqL1xuY2xhc3MgQWJvcnRDb250cm9sbGVyUmVnaXN0cnkge1xuICAgIC8vIFByaXZhdGUgZmllbGRzLlxuICAgIFtjb250cm9sbGVyU3ltXTogQWJvcnRDb250cm9sbGVyO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXNbY29udHJvbGxlclN5bV0gPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBvcHRpb25zIG9iamVjdCBmb3IgYWRkRXZlbnRMaXN0ZW5lciB0aGF0IHRpZXMgdGhlIGxpc3RlbmVyXG4gICAgICogdG8gdGhlIEFib3J0U2lnbmFsIGZyb20gdGhlIGN1cnJlbnQgQWJvcnRDb250cm9sbGVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVsZW1lbnQgLSBBbiBIVE1MIGVsZW1lbnRcbiAgICAgKiBAcGFyYW0gdHJpZ2dlcnMgLSBUaGUgbGlzdCBvZiBhY3RpdmUgV01MIHRyaWdnZXIgZXZlbnRzIGZvciB0aGUgc3BlY2lmaWVkIGVsZW1lbnRzXG4gICAgICovXG4gICAgc2V0KGVsZW1lbnQ6IEVsZW1lbnQsIHRyaWdnZXJzOiBzdHJpbmdbXSk6IEFkZEV2ZW50TGlzdGVuZXJPcHRpb25zIHtcbiAgICAgICAgcmV0dXJuIHsgc2lnbmFsOiB0aGlzW2NvbnRyb2xsZXJTeW1dLnNpZ25hbCB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIHJlZ2lzdGVyZWQgZXZlbnQgbGlzdGVuZXJzIGFuZCByZXNldHMgdGhlIHJlZ2lzdHJ5LlxuICAgICAqL1xuICAgIHJlc2V0KCk6IHZvaWQge1xuICAgICAgICB0aGlzW2NvbnRyb2xsZXJTeW1dLmFib3J0KCk7XG4gICAgICAgIHRoaXNbY29udHJvbGxlclN5bV0gPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgfVxufVxuXG4vKipcbiAqIFdlYWtNYXBSZWdpc3RyeSBtYXBzIGFjdGl2ZSB0cmlnZ2VyIGV2ZW50cyB0byBlYWNoIERPTSBlbGVtZW50IHRocm91Z2ggYSBXZWFrTWFwLlxuICogVGhpcyBlbnN1cmVzIHRoYXQgdGhlIG1hcHBpbmcgcmVtYWlucyBwcml2YXRlIHRvIHRoaXMgbW9kdWxlLCB3aGlsZSBzdGlsbCBhbGxvd2luZyBnYXJiYWdlXG4gKiBjb2xsZWN0aW9uIG9mIHRoZSBpbnZvbHZlZCBlbGVtZW50cy5cbiAqL1xuY2xhc3MgV2Vha01hcFJlZ2lzdHJ5IHtcbiAgICAvKiogU3RvcmVzIHRoZSBjdXJyZW50IGVsZW1lbnQtdG8tdHJpZ2dlciBtYXBwaW5nLiAqL1xuICAgIFt0cmlnZ2VyTWFwU3ltXTogV2Vha01hcDxFbGVtZW50LCBzdHJpbmdbXT47XG4gICAgLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHdpdGggYWN0aXZlIFdNTCB0cmlnZ2Vycy4gKi9cbiAgICBbZWxlbWVudENvdW50U3ltXTogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXNbdHJpZ2dlck1hcFN5bV0gPSBuZXcgV2Vha01hcCgpO1xuICAgICAgICB0aGlzW2VsZW1lbnRDb3VudFN5bV0gPSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgYWN0aXZlIHRyaWdnZXJzIGZvciB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZWxlbWVudCAtIEFuIEhUTUwgZWxlbWVudFxuICAgICAqIEBwYXJhbSB0cmlnZ2VycyAtIFRoZSBsaXN0IG9mIGFjdGl2ZSBXTUwgdHJpZ2dlciBldmVudHMgZm9yIHRoZSBzcGVjaWZpZWQgZWxlbWVudFxuICAgICAqL1xuICAgIHNldChlbGVtZW50OiBFbGVtZW50LCB0cmlnZ2Vyczogc3RyaW5nW10pOiBBZGRFdmVudExpc3RlbmVyT3B0aW9ucyB7XG4gICAgICAgIGlmICghdGhpc1t0cmlnZ2VyTWFwU3ltXS5oYXMoZWxlbWVudCkpIHsgdGhpc1tlbGVtZW50Q291bnRTeW1dKys7IH1cbiAgICAgICAgdGhpc1t0cmlnZ2VyTWFwU3ltXS5zZXQoZWxlbWVudCwgdHJpZ2dlcnMpO1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwgcmVnaXN0ZXJlZCBldmVudCBsaXN0ZW5lcnMuXG4gICAgICovXG4gICAgcmVzZXQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzW2VsZW1lbnRDb3VudFN5bV0gPD0gMClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZG9jdW1lbnQuYm9keS5xdWVyeVNlbGVjdG9yQWxsKCcqJykpIHtcbiAgICAgICAgICAgIGlmICh0aGlzW2VsZW1lbnRDb3VudFN5bV0gPD0gMClcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY29uc3QgdHJpZ2dlcnMgPSB0aGlzW3RyaWdnZXJNYXBTeW1dLmdldChlbGVtZW50KTtcbiAgICAgICAgICAgIGlmICh0cmlnZ2VycyAhPSBudWxsKSB7IHRoaXNbZWxlbWVudENvdW50U3ltXS0tOyB9XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgdHJpZ2dlciBvZiB0cmlnZ2VycyB8fCBbXSlcbiAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodHJpZ2dlciwgb25XTUxUcmlnZ2VyZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpc1t0cmlnZ2VyTWFwU3ltXSA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgIHRoaXNbZWxlbWVudENvdW50U3ltXSA9IDA7XG4gICAgfVxufVxuXG5jb25zdCB0cmlnZ2VyUmVnaXN0cnkgPSBjYW5BYm9ydExpc3RlbmVycygpID8gbmV3IEFib3J0Q29udHJvbGxlclJlZ2lzdHJ5KCkgOiBuZXcgV2Vha01hcFJlZ2lzdHJ5KCk7XG5cbi8qKlxuICogQWRkcyBldmVudCBsaXN0ZW5lcnMgdG8gdGhlIHNwZWNpZmllZCBlbGVtZW50LlxuICovXG5mdW5jdGlvbiBhZGRXTUxMaXN0ZW5lcnMoZWxlbWVudDogRWxlbWVudCk6IHZvaWQge1xuICAgIGNvbnN0IHRyaWdnZXJSZWdFeHAgPSAvXFxTKy9nO1xuICAgIGNvbnN0IHRyaWdnZXJBdHRyID0gKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd3bWwtdHJpZ2dlcicpIHx8IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXdtbC10cmlnZ2VyJykgfHwgXCJjbGlja1wiKTtcbiAgICBjb25zdCB0cmlnZ2Vyczogc3RyaW5nW10gPSBbXTtcblxuICAgIGxldCBtYXRjaDtcbiAgICB3aGlsZSAoKG1hdGNoID0gdHJpZ2dlclJlZ0V4cC5leGVjKHRyaWdnZXJBdHRyKSkgIT09IG51bGwpXG4gICAgICAgIHRyaWdnZXJzLnB1c2gobWF0Y2hbMF0pO1xuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHRyaWdnZXJSZWdpc3RyeS5zZXQoZWxlbWVudCwgdHJpZ2dlcnMpO1xuICAgIGZvciAoY29uc3QgdHJpZ2dlciBvZiB0cmlnZ2VycylcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHRyaWdnZXIsIG9uV01MVHJpZ2dlcmVkLCBvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBTY2hlZHVsZXMgYW4gYXV0b21hdGljIHJlbG9hZCBvZiBXTUwgdG8gYmUgcGVyZm9ybWVkIGFzIHNvb24gYXMgdGhlIGRvY3VtZW50IGlzIGZ1bGx5IGxvYWRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEVuYWJsZSgpOiB2b2lkIHtcbiAgICB3aGVuUmVhZHkoUmVsb2FkKTtcbn1cblxuLyoqXG4gKiBSZWxvYWRzIHRoZSBXTUwgcGFnZSBieSBhZGRpbmcgbmVjZXNzYXJ5IGV2ZW50IGxpc3RlbmVycyBhbmQgYnJvd3NlciBsaXN0ZW5lcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBSZWxvYWQoKTogdm9pZCB7XG4gICAgdHJpZ2dlclJlZ2lzdHJ5LnJlc2V0KCk7XG4gICAgZG9jdW1lbnQuYm9keS5xdWVyeVNlbGVjdG9yQWxsKCdbd21sLWV2ZW50XSwgW3dtbC13aW5kb3ddLCBbd21sLW9wZW51cmxdLCBbZGF0YS13bWwtZXZlbnRdLCBbZGF0YS13bWwtd2luZG93XSwgW2RhdGEtd21sLW9wZW51cmxdJykuZm9yRWFjaChhZGRXTUxMaXN0ZW5lcnMpO1xufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5pbXBvcnQgeyBuZXdSdW50aW1lQ2FsbGVyLCBvYmplY3ROYW1lcyB9IGZyb20gXCIuL3J1bnRpbWUuanNcIjtcblxuY29uc3QgY2FsbCA9IG5ld1J1bnRpbWVDYWxsZXIob2JqZWN0TmFtZXMuQnJvd3Nlcik7XG5cbmNvbnN0IEJyb3dzZXJPcGVuVVJMID0gMDtcblxuLyoqXG4gKiBPcGVuIGEgYnJvd3NlciB3aW5kb3cgdG8gdGhlIGdpdmVuIFVSTC5cbiAqXG4gKiBAcGFyYW0gdXJsIC0gVGhlIFVSTCB0byBvcGVuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBPcGVuVVJMKHVybDogc3RyaW5nIHwgVVJMKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIGNhbGwoQnJvd3Nlck9wZW5VUkwsIHt1cmw6IHVybC50b1N0cmluZygpfSk7XG59XG4iLCAiLy8gU291cmNlOiBodHRwczovL2dpdGh1Yi5jb20vYWkvbmFub2lkXG5cbi8vIFRoZSBNSVQgTGljZW5zZSAoTUlUKVxuLy9cbi8vIENvcHlyaWdodCAyMDE3IEFuZHJleSBTaXRuaWsgPGFuZHJleUBzaXRuaWsucnU+XG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZlxuLy8gdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpblxuLy8gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0b1xuLy8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2Zcbi8vIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbyxcbi8vICAgICBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyAgICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4vLyBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vICAgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTU1xuLy8gRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SXG4vLyBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVJcbi8vIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOXG4vLyBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBUaGlzIGFscGhhYmV0IHVzZXMgYEEtWmEtejAtOV8tYCBzeW1ib2xzLlxuLy8gVGhlIG9yZGVyIG9mIGNoYXJhY3RlcnMgaXMgb3B0aW1pemVkIGZvciBiZXR0ZXIgZ3ppcCBhbmQgYnJvdGxpIGNvbXByZXNzaW9uLlxuLy8gUmVmZXJlbmNlcyB0byB0aGUgc2FtZSBmaWxlICh3b3JrcyBib3RoIGZvciBnemlwIGFuZCBicm90bGkpOlxuLy8gYCd1c2VgLCBgYW5kb21gLCBhbmQgYHJpY3QnYFxuLy8gUmVmZXJlbmNlcyB0byB0aGUgYnJvdGxpIGRlZmF1bHQgZGljdGlvbmFyeTpcbi8vIGAtMjZUYCwgYDE5ODNgLCBgNDBweGAsIGA3NXB4YCwgYGJ1c2hgLCBgamFja2AsIGBtaW5kYCwgYHZlcnlgLCBhbmQgYHdvbGZgXG5jb25zdCB1cmxBbHBoYWJldCA9XG4gICAgJ3VzZWFuZG9tLTI2VDE5ODM0MFBYNzVweEpBQ0tWRVJZTUlOREJVU0hXT0xGX0dRWmJmZ2hqa2xxdnd5enJpY3QnXG5cbmV4cG9ydCBmdW5jdGlvbiBuYW5vaWQoc2l6ZTogbnVtYmVyID0gMjEpOiBzdHJpbmcge1xuICAgIGxldCBpZCA9ICcnXG4gICAgLy8gQSBjb21wYWN0IGFsdGVybmF0aXZlIGZvciBgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGVwOyBpKyspYC5cbiAgICBsZXQgaSA9IHNpemUgfCAwXG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgICAvLyBgfCAwYCBpcyBtb3JlIGNvbXBhY3QgYW5kIGZhc3RlciB0aGFuIGBNYXRoLmZsb29yKClgLlxuICAgICAgICBpZCArPSB1cmxBbHBoYWJldFsoTWF0aC5yYW5kb20oKSAqIDY0KSB8IDBdXG4gICAgfVxuICAgIHJldHVybiBpZFxufVxuIiwgIi8qXG4gXyAgICAgX18gICAgIF8gX19cbnwgfCAgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5pbXBvcnQgeyBuYW5vaWQgfSBmcm9tICcuL25hbm9pZC5qcyc7XG5cbmNvbnN0IHJ1bnRpbWVVUkwgPSB3aW5kb3cubG9jYXRpb24ub3JpZ2luICsgXCIvd2FpbHMvcnVudGltZVwiO1xuXG4vLyBPYmplY3QgTmFtZXNcbmV4cG9ydCBjb25zdCBvYmplY3ROYW1lcyA9IE9iamVjdC5mcmVlemUoe1xuICAgIENhbGw6IDAsXG4gICAgQ2xpcGJvYXJkOiAxLFxuICAgIEFwcGxpY2F0aW9uOiAyLFxuICAgIEV2ZW50czogMyxcbiAgICBDb250ZXh0TWVudTogNCxcbiAgICBEaWFsb2c6IDUsXG4gICAgV2luZG93OiA2LFxuICAgIFNjcmVlbnM6IDcsXG4gICAgU3lzdGVtOiA4LFxuICAgIEJyb3dzZXI6IDksXG4gICAgQ2FuY2VsQ2FsbDogMTAsXG59KTtcbmV4cG9ydCBsZXQgY2xpZW50SWQgPSBuYW5vaWQoKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHJ1bnRpbWUgY2FsbGVyIHdpdGggc3BlY2lmaWVkIElELlxuICpcbiAqIEBwYXJhbSBvYmplY3QgLSBUaGUgb2JqZWN0IHRvIGludm9rZSB0aGUgbWV0aG9kIG9uLlxuICogQHBhcmFtIHdpbmRvd05hbWUgLSBUaGUgbmFtZSBvZiB0aGUgd2luZG93LlxuICogQHJldHVybiBUaGUgbmV3IHJ1bnRpbWUgY2FsbGVyIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbmV3UnVudGltZUNhbGxlcihvYmplY3Q6IG51bWJlciwgd2luZG93TmFtZTogc3RyaW5nID0gJycpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG1ldGhvZDogbnVtYmVyLCBhcmdzOiBhbnkgPSBudWxsKSB7XG4gICAgICAgIHJldHVybiBydW50aW1lQ2FsbFdpdGhJRChvYmplY3QsIG1ldGhvZCwgd2luZG93TmFtZSwgYXJncyk7XG4gICAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVudGltZUNhbGxXaXRoSUQob2JqZWN0SUQ6IG51bWJlciwgbWV0aG9kOiBudW1iZXIsIHdpbmRvd05hbWU6IHN0cmluZywgYXJnczogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICBsZXQgdXJsID0gbmV3IFVSTChydW50aW1lVVJMKTtcbiAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChcIm9iamVjdFwiLCBvYmplY3RJRC50b1N0cmluZygpKTtcbiAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChcIm1ldGhvZFwiLCBtZXRob2QudG9TdHJpbmcoKSk7XG4gICAgaWYgKGFyZ3MpIHsgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoXCJhcmdzXCIsIEpTT04uc3RyaW5naWZ5KGFyZ3MpKTsgfVxuXG4gICAgbGV0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgIFtcIngtd2FpbHMtY2xpZW50LWlkXCJdOiBjbGllbnRJZFxuICAgIH1cbiAgICBpZiAod2luZG93TmFtZSkge1xuICAgICAgICBoZWFkZXJzW1wieC13YWlscy13aW5kb3ctbmFtZVwiXSA9IHdpbmRvd05hbWU7XG4gICAgfVxuXG4gICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7IGhlYWRlcnMgfSk7XG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYXdhaXQgcmVzcG9uc2UudGV4dCgpKTtcbiAgICB9XG5cbiAgICBpZiAoKHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiQ29udGVudC1UeXBlXCIpPy5pbmRleE9mKFwiYXBwbGljYXRpb24vanNvblwiKSA/PyAtMSkgIT09IC0xKSB7XG4gICAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKTtcbiAgICB9XG59XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbmltcG9ydCB7bmV3UnVudGltZUNhbGxlciwgb2JqZWN0TmFtZXN9IGZyb20gXCIuL3J1bnRpbWUuanNcIjtcbmltcG9ydCB7IG5hbm9pZCB9IGZyb20gJy4vbmFub2lkLmpzJztcblxuLy8gc2V0dXBcbndpbmRvdy5fd2FpbHMgPSB3aW5kb3cuX3dhaWxzIHx8IHt9O1xud2luZG93Ll93YWlscy5kaWFsb2dFcnJvckNhbGxiYWNrID0gZGlhbG9nRXJyb3JDYWxsYmFjaztcbndpbmRvdy5fd2FpbHMuZGlhbG9nUmVzdWx0Q2FsbGJhY2sgPSBkaWFsb2dSZXN1bHRDYWxsYmFjaztcblxudHlwZSBQcm9taXNlUmVzb2x2ZXJzID0gT21pdDxQcm9taXNlV2l0aFJlc29sdmVyczxhbnk+LCBcInByb21pc2VcIj47XG5cbmNvbnN0IGNhbGwgPSBuZXdSdW50aW1lQ2FsbGVyKG9iamVjdE5hbWVzLkRpYWxvZyk7XG5jb25zdCBkaWFsb2dSZXNwb25zZXMgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZVJlc29sdmVycz4oKTtcblxuLy8gRGVmaW5lIGNvbnN0YW50cyBmcm9tIHRoZSBgbWV0aG9kc2Agb2JqZWN0IGluIFRpdGxlIENhc2VcbmNvbnN0IERpYWxvZ0luZm8gPSAwO1xuY29uc3QgRGlhbG9nV2FybmluZyA9IDE7XG5jb25zdCBEaWFsb2dFcnJvciA9IDI7XG5jb25zdCBEaWFsb2dRdWVzdGlvbiA9IDM7XG5jb25zdCBEaWFsb2dPcGVuRmlsZSA9IDQ7XG5jb25zdCBEaWFsb2dTYXZlRmlsZSA9IDU7XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3BlbkZpbGVEaWFsb2dPcHRpb25zIHtcbiAgICAvKiogSW5kaWNhdGVzIGlmIGRpcmVjdG9yaWVzIGNhbiBiZSBjaG9zZW4uICovXG4gICAgQ2FuQ2hvb3NlRGlyZWN0b3JpZXM/OiBib29sZWFuO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgZmlsZXMgY2FuIGJlIGNob3Nlbi4gKi9cbiAgICBDYW5DaG9vc2VGaWxlcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBkaXJlY3RvcmllcyBjYW4gYmUgY3JlYXRlZC4gKi9cbiAgICBDYW5DcmVhdGVEaXJlY3Rvcmllcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBoaWRkZW4gZmlsZXMgc2hvdWxkIGJlIHNob3duLiAqL1xuICAgIFNob3dIaWRkZW5GaWxlcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBhbGlhc2VzIHNob3VsZCBiZSByZXNvbHZlZC4gKi9cbiAgICBSZXNvbHZlc0FsaWFzZXM/OiBib29sZWFuO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgbXVsdGlwbGUgc2VsZWN0aW9uIGlzIGFsbG93ZWQuICovXG4gICAgQWxsb3dzTXVsdGlwbGVTZWxlY3Rpb24/OiBib29sZWFuO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgdGhlIGV4dGVuc2lvbiBzaG91bGQgYmUgaGlkZGVuLiAqL1xuICAgIEhpZGVFeHRlbnNpb24/OiBib29sZWFuO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgaGlkZGVuIGV4dGVuc2lvbnMgY2FuIGJlIHNlbGVjdGVkLiAqL1xuICAgIENhblNlbGVjdEhpZGRlbkV4dGVuc2lvbj86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBmaWxlIHBhY2thZ2VzIHNob3VsZCBiZSB0cmVhdGVkIGFzIGRpcmVjdG9yaWVzLiAqL1xuICAgIFRyZWF0c0ZpbGVQYWNrYWdlc0FzRGlyZWN0b3JpZXM/OiBib29sZWFuO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgb3RoZXIgZmlsZSB0eXBlcyBhcmUgYWxsb3dlZC4gKi9cbiAgICBBbGxvd3NPdGhlckZpbGV0eXBlcz86IGJvb2xlYW47XG4gICAgLyoqIEFycmF5IG9mIGZpbGUgZmlsdGVycy4gKi9cbiAgICBGaWx0ZXJzPzogRmlsZUZpbHRlcltdO1xuICAgIC8qKiBUaXRsZSBvZiB0aGUgZGlhbG9nLiAqL1xuICAgIFRpdGxlPzogc3RyaW5nO1xuICAgIC8qKiBNZXNzYWdlIHRvIHNob3cgaW4gdGhlIGRpYWxvZy4gKi9cbiAgICBNZXNzYWdlPzogc3RyaW5nO1xuICAgIC8qKiBUZXh0IHRvIGRpc3BsYXkgb24gdGhlIGJ1dHRvbi4gKi9cbiAgICBCdXR0b25UZXh0Pzogc3RyaW5nO1xuICAgIC8qKiBEaXJlY3RvcnkgdG8gb3BlbiBpbiB0aGUgZGlhbG9nLiAqL1xuICAgIERpcmVjdG9yeT86IHN0cmluZztcbiAgICAvKiogSW5kaWNhdGVzIGlmIHRoZSBkaWFsb2cgc2hvdWxkIGFwcGVhciBkZXRhY2hlZCBmcm9tIHRoZSBtYWluIHdpbmRvdy4gKi9cbiAgICBEZXRhY2hlZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2F2ZUZpbGVEaWFsb2dPcHRpb25zIHtcbiAgICAvKiogRGVmYXVsdCBmaWxlbmFtZSB0byB1c2UgaW4gdGhlIGRpYWxvZy4gKi9cbiAgICBGaWxlbmFtZT86IHN0cmluZztcbiAgICAvKiogSW5kaWNhdGVzIGlmIGRpcmVjdG9yaWVzIGNhbiBiZSBjaG9zZW4uICovXG4gICAgQ2FuQ2hvb3NlRGlyZWN0b3JpZXM/OiBib29sZWFuO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgZmlsZXMgY2FuIGJlIGNob3Nlbi4gKi9cbiAgICBDYW5DaG9vc2VGaWxlcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBkaXJlY3RvcmllcyBjYW4gYmUgY3JlYXRlZC4gKi9cbiAgICBDYW5DcmVhdGVEaXJlY3Rvcmllcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBoaWRkZW4gZmlsZXMgc2hvdWxkIGJlIHNob3duLiAqL1xuICAgIFNob3dIaWRkZW5GaWxlcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBhbGlhc2VzIHNob3VsZCBiZSByZXNvbHZlZC4gKi9cbiAgICBSZXNvbHZlc0FsaWFzZXM/OiBib29sZWFuO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgdGhlIGV4dGVuc2lvbiBzaG91bGQgYmUgaGlkZGVuLiAqL1xuICAgIEhpZGVFeHRlbnNpb24/OiBib29sZWFuO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgaGlkZGVuIGV4dGVuc2lvbnMgY2FuIGJlIHNlbGVjdGVkLiAqL1xuICAgIENhblNlbGVjdEhpZGRlbkV4dGVuc2lvbj86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBmaWxlIHBhY2thZ2VzIHNob3VsZCBiZSB0cmVhdGVkIGFzIGRpcmVjdG9yaWVzLiAqL1xuICAgIFRyZWF0c0ZpbGVQYWNrYWdlc0FzRGlyZWN0b3JpZXM/OiBib29sZWFuO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgb3RoZXIgZmlsZSB0eXBlcyBhcmUgYWxsb3dlZC4gKi9cbiAgICBBbGxvd3NPdGhlckZpbGV0eXBlcz86IGJvb2xlYW47XG4gICAgLyoqIEFycmF5IG9mIGZpbGUgZmlsdGVycy4gKi9cbiAgICBGaWx0ZXJzPzogRmlsZUZpbHRlcltdO1xuICAgIC8qKiBUaXRsZSBvZiB0aGUgZGlhbG9nLiAqL1xuICAgIFRpdGxlPzogc3RyaW5nO1xuICAgIC8qKiBNZXNzYWdlIHRvIHNob3cgaW4gdGhlIGRpYWxvZy4gKi9cbiAgICBNZXNzYWdlPzogc3RyaW5nO1xuICAgIC8qKiBUZXh0IHRvIGRpc3BsYXkgb24gdGhlIGJ1dHRvbi4gKi9cbiAgICBCdXR0b25UZXh0Pzogc3RyaW5nO1xuICAgIC8qKiBEaXJlY3RvcnkgdG8gb3BlbiBpbiB0aGUgZGlhbG9nLiAqL1xuICAgIERpcmVjdG9yeT86IHN0cmluZztcbiAgICAvKiogSW5kaWNhdGVzIGlmIHRoZSBkaWFsb2cgc2hvdWxkIGFwcGVhciBkZXRhY2hlZCBmcm9tIHRoZSBtYWluIHdpbmRvdy4gKi9cbiAgICBEZXRhY2hlZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWVzc2FnZURpYWxvZ09wdGlvbnMge1xuICAgIC8qKiBUaGUgdGl0bGUgb2YgdGhlIGRpYWxvZyB3aW5kb3cuICovXG4gICAgVGl0bGU/OiBzdHJpbmc7XG4gICAgLyoqIFRoZSBtYWluIG1lc3NhZ2UgdG8gc2hvdyBpbiB0aGUgZGlhbG9nLiAqL1xuICAgIE1lc3NhZ2U/OiBzdHJpbmc7XG4gICAgLyoqIEFycmF5IG9mIGJ1dHRvbiBvcHRpb25zIHRvIHNob3cgaW4gdGhlIGRpYWxvZy4gKi9cbiAgICBCdXR0b25zPzogQnV0dG9uW107XG4gICAgLyoqIFRydWUgaWYgdGhlIGRpYWxvZyBzaG91bGQgYXBwZWFyIGRldGFjaGVkIGZyb20gdGhlIG1haW4gd2luZG93IChpZiBhcHBsaWNhYmxlKS4gKi9cbiAgICBEZXRhY2hlZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnV0dG9uIHtcbiAgICAvKiogVGV4dCB0aGF0IGFwcGVhcnMgd2l0aGluIHRoZSBidXR0b24uICovXG4gICAgTGFiZWw/OiBzdHJpbmc7XG4gICAgLyoqIFRydWUgaWYgdGhlIGJ1dHRvbiBzaG91bGQgY2FuY2VsIGFuIG9wZXJhdGlvbiB3aGVuIGNsaWNrZWQuICovXG4gICAgSXNDYW5jZWw/OiBib29sZWFuO1xuICAgIC8qKiBUcnVlIGlmIHRoZSBidXR0b24gc2hvdWxkIGJlIHRoZSBkZWZhdWx0IGFjdGlvbiB3aGVuIHRoZSB1c2VyIHByZXNzZXMgZW50ZXIuICovXG4gICAgSXNEZWZhdWx0PzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWxlRmlsdGVyIHtcbiAgICAvKiogRGlzcGxheSBuYW1lIGZvciB0aGUgZmlsdGVyLCBpdCBjb3VsZCBiZSBcIlRleHQgRmlsZXNcIiwgXCJJbWFnZXNcIiBldGMuICovXG4gICAgRGlzcGxheU5hbWU/OiBzdHJpbmc7XG4gICAgLyoqIFBhdHRlcm4gdG8gbWF0Y2ggZm9yIHRoZSBmaWx0ZXIsIGUuZy4gXCIqLnR4dDsqLm1kXCIgZm9yIHRleHQgbWFya2Rvd24gZmlsZXMuICovXG4gICAgUGF0dGVybj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBIYW5kbGVzIHRoZSByZXN1bHQgb2YgYSBkaWFsb2cgcmVxdWVzdC5cbiAqXG4gKiBAcGFyYW0gaWQgLSBUaGUgaWQgb2YgdGhlIHJlcXVlc3QgdG8gaGFuZGxlIHRoZSByZXN1bHQgZm9yLlxuICogQHBhcmFtIGRhdGEgLSBUaGUgcmVzdWx0IGRhdGEgb2YgdGhlIHJlcXVlc3QuXG4gKiBAcGFyYW0gaXNKU09OIC0gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRhdGEgaXMgSlNPTiBvciBub3QuXG4gKi9cbmZ1bmN0aW9uIGRpYWxvZ1Jlc3VsdENhbGxiYWNrKGlkOiBzdHJpbmcsIGRhdGE6IHN0cmluZywgaXNKU09OOiBib29sZWFuKTogdm9pZCB7XG4gICAgbGV0IHJlc29sdmVycyA9IGdldEFuZERlbGV0ZVJlc3BvbnNlKGlkKTtcbiAgICBpZiAoIXJlc29sdmVycykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGlzSlNPTikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzb2x2ZXJzLnJlc29sdmUoSlNPTi5wYXJzZShkYXRhKSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgICAgICByZXNvbHZlcnMucmVqZWN0KG5ldyBUeXBlRXJyb3IoXCJjb3VsZCBub3QgcGFyc2UgcmVzdWx0OiBcIiArIGVyci5tZXNzYWdlLCB7IGNhdXNlOiBlcnIgfSkpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZXJzLnJlc29sdmUoZGF0YSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEhhbmRsZXMgdGhlIGVycm9yIGZyb20gYSBkaWFsb2cgcmVxdWVzdC5cbiAqXG4gKiBAcGFyYW0gaWQgLSBUaGUgaWQgb2YgdGhlIHByb21pc2UgaGFuZGxlci5cbiAqIEBwYXJhbSBtZXNzYWdlIC0gQW4gZXJyb3IgbWVzc2FnZS5cbiAqL1xuZnVuY3Rpb24gZGlhbG9nRXJyb3JDYWxsYmFjayhpZDogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBnZXRBbmREZWxldGVSZXNwb25zZShpZCk/LnJlamVjdChuZXcgd2luZG93LkVycm9yKG1lc3NhZ2UpKTtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgYW5kIHJlbW92ZXMgdGhlIHJlc3BvbnNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gSUQgZnJvbSB0aGUgZGlhbG9nUmVzcG9uc2VzIG1hcC5cbiAqXG4gKiBAcGFyYW0gaWQgLSBUaGUgSUQgb2YgdGhlIHJlc3BvbnNlIHRvIGJlIHJldHJpZXZlZCBhbmQgcmVtb3ZlZC5cbiAqIEByZXR1cm5zIFRoZSByZXNwb25zZSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBJRCwgaWYgYW55LlxuICovXG5mdW5jdGlvbiBnZXRBbmREZWxldGVSZXNwb25zZShpZDogc3RyaW5nKTogUHJvbWlzZVJlc29sdmVycyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBkaWFsb2dSZXNwb25zZXMuZ2V0KGlkKTtcbiAgICBkaWFsb2dSZXNwb25zZXMuZGVsZXRlKGlkKTtcbiAgICByZXR1cm4gcmVzcG9uc2U7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgdW5pcXVlIElEIHVzaW5nIHRoZSBuYW5vaWQgbGlicmFyeS5cbiAqXG4gKiBAcmV0dXJucyBBIHVuaXF1ZSBJRCB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBkaWFsb2dSZXNwb25zZXMgc2V0LlxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZUlEKCk6IHN0cmluZyB7XG4gICAgbGV0IHJlc3VsdDtcbiAgICBkbyB7XG4gICAgICAgIHJlc3VsdCA9IG5hbm9pZCgpO1xuICAgIH0gd2hpbGUgKGRpYWxvZ1Jlc3BvbnNlcy5oYXMocmVzdWx0KSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBQcmVzZW50cyBhIGRpYWxvZyBvZiBzcGVjaWZpZWQgdHlwZSB3aXRoIHRoZSBnaXZlbiBvcHRpb25zLlxuICpcbiAqIEBwYXJhbSB0eXBlIC0gRGlhbG9nIHR5cGUuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIHRoZSBkaWFsb2cuXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHJlc3VsdCBvZiBkaWFsb2cuXG4gKi9cbmZ1bmN0aW9uIGRpYWxvZyh0eXBlOiBudW1iZXIsIG9wdGlvbnM6IE1lc3NhZ2VEaWFsb2dPcHRpb25zIHwgT3BlbkZpbGVEaWFsb2dPcHRpb25zIHwgU2F2ZUZpbGVEaWFsb2dPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IGlkID0gZ2VuZXJhdGVJRCgpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGRpYWxvZ1Jlc3BvbnNlcy5zZXQoaWQsIHsgcmVzb2x2ZSwgcmVqZWN0IH0pO1xuICAgICAgICBjYWxsKHR5cGUsIE9iamVjdC5hc3NpZ24oeyBcImRpYWxvZy1pZFwiOiBpZCB9LCBvcHRpb25zKSkuY2F0Y2goKGVycjogYW55KSA9PiB7XG4gICAgICAgICAgICBkaWFsb2dSZXNwb25zZXMuZGVsZXRlKGlkKTtcbiAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBQcmVzZW50cyBhbiBpbmZvIGRpYWxvZy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIERpYWxvZyBvcHRpb25zXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBsYWJlbCBvZiB0aGUgY2hvc2VuIGJ1dHRvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEluZm8ob3B0aW9uczogTWVzc2FnZURpYWxvZ09wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4geyByZXR1cm4gZGlhbG9nKERpYWxvZ0luZm8sIG9wdGlvbnMpOyB9XG5cbi8qKlxuICogUHJlc2VudHMgYSB3YXJuaW5nIGRpYWxvZy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIERpYWxvZyBvcHRpb25zLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgbGFiZWwgb2YgdGhlIGNob3NlbiBidXR0b24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBXYXJuaW5nKG9wdGlvbnM6IE1lc3NhZ2VEaWFsb2dPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHsgcmV0dXJuIGRpYWxvZyhEaWFsb2dXYXJuaW5nLCBvcHRpb25zKTsgfVxuXG4vKipcbiAqIFByZXNlbnRzIGFuIGVycm9yIGRpYWxvZy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIERpYWxvZyBvcHRpb25zLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgbGFiZWwgb2YgdGhlIGNob3NlbiBidXR0b24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFcnJvcihvcHRpb25zOiBNZXNzYWdlRGlhbG9nT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7IHJldHVybiBkaWFsb2coRGlhbG9nRXJyb3IsIG9wdGlvbnMpOyB9XG5cbi8qKlxuICogUHJlc2VudHMgYSBxdWVzdGlvbiBkaWFsb2cuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBEaWFsb2cgb3B0aW9ucy5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGxhYmVsIG9mIHRoZSBjaG9zZW4gYnV0dG9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gUXVlc3Rpb24ob3B0aW9uczogTWVzc2FnZURpYWxvZ09wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4geyByZXR1cm4gZGlhbG9nKERpYWxvZ1F1ZXN0aW9uLCBvcHRpb25zKTsgfVxuXG4vKipcbiAqIFByZXNlbnRzIGEgZmlsZSBzZWxlY3Rpb24gZGlhbG9nIHRvIHBpY2sgb25lIG9yIG1vcmUgZmlsZXMgdG8gb3Blbi5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIERpYWxvZyBvcHRpb25zLlxuICogQHJldHVybnMgU2VsZWN0ZWQgZmlsZSBvciBsaXN0IG9mIGZpbGVzLCBvciBhIGJsYW5rIHN0cmluZy9lbXB0eSBsaXN0IGlmIG5vIGZpbGUgaGFzIGJlZW4gc2VsZWN0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBPcGVuRmlsZShvcHRpb25zOiBPcGVuRmlsZURpYWxvZ09wdGlvbnMgJiB7IEFsbG93c011bHRpcGxlU2VsZWN0aW9uOiB0cnVlIH0pOiBQcm9taXNlPHN0cmluZ1tdPjtcbmV4cG9ydCBmdW5jdGlvbiBPcGVuRmlsZShvcHRpb25zOiBPcGVuRmlsZURpYWxvZ09wdGlvbnMgJiB7IEFsbG93c011bHRpcGxlU2VsZWN0aW9uPzogZmFsc2UgfCB1bmRlZmluZWQgfSk6IFByb21pc2U8c3RyaW5nPjtcbmV4cG9ydCBmdW5jdGlvbiBPcGVuRmlsZShvcHRpb25zOiBPcGVuRmlsZURpYWxvZ09wdGlvbnMpOiBQcm9taXNlPHN0cmluZyB8IHN0cmluZ1tdPjtcbmV4cG9ydCBmdW5jdGlvbiBPcGVuRmlsZShvcHRpb25zOiBPcGVuRmlsZURpYWxvZ09wdGlvbnMpOiBQcm9taXNlPHN0cmluZyB8IHN0cmluZ1tdPiB7IHJldHVybiBkaWFsb2coRGlhbG9nT3BlbkZpbGUsIG9wdGlvbnMpID8/IFtdOyB9XG5cbi8qKlxuICogUHJlc2VudHMgYSBmaWxlIHNlbGVjdGlvbiBkaWFsb2cgdG8gcGljayBhIGZpbGUgdG8gc2F2ZS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIERpYWxvZyBvcHRpb25zLlxuICogQHJldHVybnMgU2VsZWN0ZWQgZmlsZSwgb3IgYSBibGFuayBzdHJpbmcgaWYgbm8gZmlsZSBoYXMgYmVlbiBzZWxlY3RlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFNhdmVGaWxlKG9wdGlvbnM6IFNhdmVGaWxlRGlhbG9nT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7IHJldHVybiBkaWFsb2coRGlhbG9nU2F2ZUZpbGUsIG9wdGlvbnMpOyB9XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbmltcG9ydCB7IG5ld1J1bnRpbWVDYWxsZXIsIG9iamVjdE5hbWVzIH0gZnJvbSBcIi4vcnVudGltZS5qc1wiO1xuaW1wb3J0IHsgZXZlbnRMaXN0ZW5lcnMsIExpc3RlbmVyLCBsaXN0ZW5lck9mZiB9IGZyb20gXCIuL2xpc3RlbmVyLmpzXCI7XG5cbi8vIFNldHVwXG53aW5kb3cuX3dhaWxzID0gd2luZG93Ll93YWlscyB8fCB7fTtcbndpbmRvdy5fd2FpbHMuZGlzcGF0Y2hXYWlsc0V2ZW50ID0gZGlzcGF0Y2hXYWlsc0V2ZW50O1xuXG5jb25zdCBjYWxsID0gbmV3UnVudGltZUNhbGxlcihvYmplY3ROYW1lcy5FdmVudHMpO1xuY29uc3QgRW1pdE1ldGhvZCA9IDA7XG5cbmV4cG9ydCB7IFR5cGVzIH0gZnJvbSBcIi4vZXZlbnRfdHlwZXMuanNcIjtcblxuLyoqXG4gKiBUaGUgdHlwZSBvZiBoYW5kbGVycyBmb3IgYSBnaXZlbiBldmVudC5cbiAqL1xuZXhwb3J0IHR5cGUgQ2FsbGJhY2sgPSAoZXY6IFdhaWxzRXZlbnQpID0+IHZvaWQ7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHN5c3RlbSBldmVudCBvciBhIGN1c3RvbSBldmVudCBlbWl0dGVkIHRocm91Z2ggd2FpbHMtcHJvdmlkZWQgZmFjaWxpdGllcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFdhaWxzRXZlbnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBPcHRpb25hbCBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW1pdHRlZCBldmVudC5cbiAgICAgKi9cbiAgICBkYXRhOiBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBOYW1lIG9mIHRoZSBvcmlnaW5hdGluZyB3aW5kb3cuIE9taXR0ZWQgZm9yIGFwcGxpY2F0aW9uIGV2ZW50cy5cbiAgICAgKiBXaWxsIGJlIG92ZXJyaWRkZW4gaWYgc2V0IG1hbnVhbGx5LlxuICAgICAqL1xuICAgIHNlbmRlcj86IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgZGF0YTogYW55ID0gbnVsbCkge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hXYWlsc0V2ZW50KGV2ZW50OiBhbnkpIHtcbiAgICBsZXQgbGlzdGVuZXJzID0gZXZlbnRMaXN0ZW5lcnMuZ2V0KGV2ZW50Lm5hbWUpO1xuICAgIGlmICghbGlzdGVuZXJzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgd2FpbHNFdmVudCA9IG5ldyBXYWlsc0V2ZW50KGV2ZW50Lm5hbWUsIGV2ZW50LmRhdGEpO1xuICAgIGlmICgnc2VuZGVyJyBpbiBldmVudCkge1xuICAgICAgICB3YWlsc0V2ZW50LnNlbmRlciA9IGV2ZW50LnNlbmRlcjtcbiAgICB9XG5cbiAgICBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuZmlsdGVyKGxpc3RlbmVyID0+ICFsaXN0ZW5lci5kaXNwYXRjaCh3YWlsc0V2ZW50KSk7XG4gICAgaWYgKGxpc3RlbmVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZXZlbnRMaXN0ZW5lcnMuZGVsZXRlKGV2ZW50Lm5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGV2ZW50TGlzdGVuZXJzLnNldChldmVudC5uYW1lLCBsaXN0ZW5lcnMpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZWdpc3RlciBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBmb3IgYSBzcGVjaWZpYyBldmVudC5cbiAqXG4gKiBAcGFyYW0gZXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIHJlZ2lzdGVyIHRoZSBjYWxsYmFjayBmb3IuXG4gKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC5cbiAqIEBwYXJhbSBtYXhDYWxsYmFja3MgLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGltZXMgdGhlIGNhbGxiYWNrIGNhbiBiZSBjYWxsZWQgZm9yIHRoZSBldmVudC4gT25jZSB0aGUgbWF4aW11bSBudW1iZXIgaXMgcmVhY2hlZCwgdGhlIGNhbGxiYWNrIHdpbGwgbm8gbG9uZ2VyIGJlIGNhbGxlZC5cbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCwgd2hlbiBjYWxsZWQsIHdpbGwgdW5yZWdpc3RlciB0aGUgY2FsbGJhY2sgZnJvbSB0aGUgZXZlbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBPbk11bHRpcGxlKGV2ZW50TmFtZTogc3RyaW5nLCBjYWxsYmFjazogQ2FsbGJhY2ssIG1heENhbGxiYWNrczogbnVtYmVyKSB7XG4gICAgbGV0IGxpc3RlbmVycyA9IGV2ZW50TGlzdGVuZXJzLmdldChldmVudE5hbWUpIHx8IFtdO1xuICAgIGNvbnN0IHRoaXNMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcihldmVudE5hbWUsIGNhbGxiYWNrLCBtYXhDYWxsYmFja3MpO1xuICAgIGxpc3RlbmVycy5wdXNoKHRoaXNMaXN0ZW5lcik7XG4gICAgZXZlbnRMaXN0ZW5lcnMuc2V0KGV2ZW50TmFtZSwgbGlzdGVuZXJzKTtcbiAgICByZXR1cm4gKCkgPT4gbGlzdGVuZXJPZmYodGhpc0xpc3RlbmVyKTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCB3aGVuIHRoZSBzcGVjaWZpZWQgZXZlbnQgb2NjdXJzLlxuICpcbiAqIEBwYXJhbSBldmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gcmVnaXN0ZXIgdGhlIGNhbGxiYWNrIGZvci5cbiAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0LCB3aGVuIGNhbGxlZCwgd2lsbCB1bnJlZ2lzdGVyIHRoZSBjYWxsYmFjayBmcm9tIHRoZSBldmVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE9uKGV2ZW50TmFtZTogc3RyaW5nLCBjYWxsYmFjazogQ2FsbGJhY2spOiAoKSA9PiB2b2lkIHtcbiAgICByZXR1cm4gT25NdWx0aXBsZShldmVudE5hbWUsIGNhbGxiYWNrLCAtMSk7XG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgb25seSBvbmNlIGZvciB0aGUgc3BlY2lmaWVkIGV2ZW50LlxuICpcbiAqIEBwYXJhbSBldmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gcmVnaXN0ZXIgdGhlIGNhbGxiYWNrIGZvci5cbiAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0LCB3aGVuIGNhbGxlZCwgd2lsbCB1bnJlZ2lzdGVyIHRoZSBjYWxsYmFjayBmcm9tIHRoZSBldmVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE9uY2UoZXZlbnROYW1lOiBzdHJpbmcsIGNhbGxiYWNrOiBDYWxsYmFjayk6ICgpID0+IHZvaWQge1xuICAgIHJldHVybiBPbk11bHRpcGxlKGV2ZW50TmFtZSwgY2FsbGJhY2ssIDEpO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgZXZlbnQgbGlzdGVuZXJzIGZvciB0aGUgc3BlY2lmaWVkIGV2ZW50IG5hbWVzLlxuICpcbiAqIEBwYXJhbSBldmVudE5hbWVzIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50cyB0byByZW1vdmUgbGlzdGVuZXJzIGZvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE9mZiguLi5ldmVudE5hbWVzOiBbc3RyaW5nLCAuLi5zdHJpbmdbXV0pOiB2b2lkIHtcbiAgICBldmVudE5hbWVzLmZvckVhY2goZXZlbnROYW1lID0+IGV2ZW50TGlzdGVuZXJzLmRlbGV0ZShldmVudE5hbWUpKTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIGFsbCBldmVudCBsaXN0ZW5lcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBPZmZBbGwoKTogdm9pZCB7XG4gICAgZXZlbnRMaXN0ZW5lcnMuY2xlYXIoKTtcbn1cblxuLyoqXG4gKiBFbWl0cyB0aGUgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIGV2ZW50IC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIGVtaXQuXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCB3aWxsIGJlIGZ1bGZpbGxlZCBvbmNlIHRoZSBldmVudCBoYXMgYmVlbiBlbWl0dGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gRW1pdChldmVudDogV2FpbHNFdmVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBjYWxsKEVtaXRNZXRob2QsIGV2ZW50KTtcbn1cbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuLy8gVGhlIGZvbGxvd2luZyB1dGlsaXRpZXMgaGF2ZSBiZWVuIGZhY3RvcmVkIG91dCBvZiAuL2V2ZW50cy50c1xuLy8gZm9yIHRlc3RpbmcgcHVycG9zZXMuXG5cbmV4cG9ydCBjb25zdCBldmVudExpc3RlbmVycyA9IG5ldyBNYXA8c3RyaW5nLCBMaXN0ZW5lcltdPigpO1xuXG5leHBvcnQgY2xhc3MgTGlzdGVuZXIge1xuICAgIGV2ZW50TmFtZTogc3RyaW5nO1xuICAgIGNhbGxiYWNrOiAoZGF0YTogYW55KSA9PiB2b2lkO1xuICAgIG1heENhbGxiYWNrczogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IoZXZlbnROYW1lOiBzdHJpbmcsIGNhbGxiYWNrOiAoZGF0YTogYW55KSA9PiB2b2lkLCBtYXhDYWxsYmFja3M6IG51bWJlcikge1xuICAgICAgICB0aGlzLmV2ZW50TmFtZSA9IGV2ZW50TmFtZTtcbiAgICAgICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgICB0aGlzLm1heENhbGxiYWNrcyA9IG1heENhbGxiYWNrcyB8fCAtMTtcbiAgICB9XG5cbiAgICBkaXNwYXRjaChkYXRhOiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuY2FsbGJhY2soZGF0YSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubWF4Q2FsbGJhY2tzID09PSAtMSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLm1heENhbGxiYWNrcyAtPSAxO1xuICAgICAgICByZXR1cm4gdGhpcy5tYXhDYWxsYmFja3MgPT09IDA7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbGlzdGVuZXJPZmYobGlzdGVuZXI6IExpc3RlbmVyKTogdm9pZCB7XG4gICAgbGV0IGxpc3RlbmVycyA9IGV2ZW50TGlzdGVuZXJzLmdldChsaXN0ZW5lci5ldmVudE5hbWUpO1xuICAgIGlmICghbGlzdGVuZXJzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuZmlsdGVyKGwgPT4gbCAhPT0gbGlzdGVuZXIpO1xuICAgIGlmIChsaXN0ZW5lcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGV2ZW50TGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lci5ldmVudE5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGV2ZW50TGlzdGVuZXJzLnNldChsaXN0ZW5lci5ldmVudE5hbWUsIGxpc3RlbmVycyk7XG4gICAgfVxufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vLyBDeW5oeXJjaHd5ZCB5IGZmZWlsIGhvbiB5biBhd3RvbWF0aWcuIFBFSURJV0NIIFx1MDBDMiBNT0RJV0xcbi8vIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZC4gRE8gTk9UIEVESVRcblxuZXhwb3J0IGNvbnN0IFR5cGVzID0gT2JqZWN0LmZyZWV6ZSh7XG5cdFdpbmRvd3M6IE9iamVjdC5mcmVlemUoe1xuXHRcdEFQTVBvd2VyU2V0dGluZ0NoYW5nZTogXCJ3aW5kb3dzOkFQTVBvd2VyU2V0dGluZ0NoYW5nZVwiLFxuXHRcdEFQTVBvd2VyU3RhdHVzQ2hhbmdlOiBcIndpbmRvd3M6QVBNUG93ZXJTdGF0dXNDaGFuZ2VcIixcblx0XHRBUE1SZXN1bWVBdXRvbWF0aWM6IFwid2luZG93czpBUE1SZXN1bWVBdXRvbWF0aWNcIixcblx0XHRBUE1SZXN1bWVTdXNwZW5kOiBcIndpbmRvd3M6QVBNUmVzdW1lU3VzcGVuZFwiLFxuXHRcdEFQTVN1c3BlbmQ6IFwid2luZG93czpBUE1TdXNwZW5kXCIsXG5cdFx0QXBwbGljYXRpb25TdGFydGVkOiBcIndpbmRvd3M6QXBwbGljYXRpb25TdGFydGVkXCIsXG5cdFx0U3lzdGVtVGhlbWVDaGFuZ2VkOiBcIndpbmRvd3M6U3lzdGVtVGhlbWVDaGFuZ2VkXCIsXG5cdFx0V2ViVmlld05hdmlnYXRpb25Db21wbGV0ZWQ6IFwid2luZG93czpXZWJWaWV3TmF2aWdhdGlvbkNvbXBsZXRlZFwiLFxuXHRcdFdpbmRvd0FjdGl2ZTogXCJ3aW5kb3dzOldpbmRvd0FjdGl2ZVwiLFxuXHRcdFdpbmRvd0JhY2tncm91bmRFcmFzZTogXCJ3aW5kb3dzOldpbmRvd0JhY2tncm91bmRFcmFzZVwiLFxuXHRcdFdpbmRvd0NsaWNrQWN0aXZlOiBcIndpbmRvd3M6V2luZG93Q2xpY2tBY3RpdmVcIixcblx0XHRXaW5kb3dDbG9zaW5nOiBcIndpbmRvd3M6V2luZG93Q2xvc2luZ1wiLFxuXHRcdFdpbmRvd0RpZE1vdmU6IFwid2luZG93czpXaW5kb3dEaWRNb3ZlXCIsXG5cdFx0V2luZG93RGlkUmVzaXplOiBcIndpbmRvd3M6V2luZG93RGlkUmVzaXplXCIsXG5cdFx0V2luZG93RFBJQ2hhbmdlZDogXCJ3aW5kb3dzOldpbmRvd0RQSUNoYW5nZWRcIixcblx0XHRXaW5kb3dEcmFnRHJvcDogXCJ3aW5kb3dzOldpbmRvd0RyYWdEcm9wXCIsXG5cdFx0V2luZG93RHJhZ0VudGVyOiBcIndpbmRvd3M6V2luZG93RHJhZ0VudGVyXCIsXG5cdFx0V2luZG93RHJhZ0xlYXZlOiBcIndpbmRvd3M6V2luZG93RHJhZ0xlYXZlXCIsXG5cdFx0V2luZG93RHJhZ092ZXI6IFwid2luZG93czpXaW5kb3dEcmFnT3ZlclwiLFxuXHRcdFdpbmRvd0VuZE1vdmU6IFwid2luZG93czpXaW5kb3dFbmRNb3ZlXCIsXG5cdFx0V2luZG93RW5kUmVzaXplOiBcIndpbmRvd3M6V2luZG93RW5kUmVzaXplXCIsXG5cdFx0V2luZG93RnVsbHNjcmVlbjogXCJ3aW5kb3dzOldpbmRvd0Z1bGxzY3JlZW5cIixcblx0XHRXaW5kb3dIaWRlOiBcIndpbmRvd3M6V2luZG93SGlkZVwiLFxuXHRcdFdpbmRvd0luYWN0aXZlOiBcIndpbmRvd3M6V2luZG93SW5hY3RpdmVcIixcblx0XHRXaW5kb3dLZXlEb3duOiBcIndpbmRvd3M6V2luZG93S2V5RG93blwiLFxuXHRcdFdpbmRvd0tleVVwOiBcIndpbmRvd3M6V2luZG93S2V5VXBcIixcblx0XHRXaW5kb3dLaWxsRm9jdXM6IFwid2luZG93czpXaW5kb3dLaWxsRm9jdXNcIixcblx0XHRXaW5kb3dOb25DbGllbnRIaXQ6IFwid2luZG93czpXaW5kb3dOb25DbGllbnRIaXRcIixcblx0XHRXaW5kb3dOb25DbGllbnRNb3VzZURvd246IFwid2luZG93czpXaW5kb3dOb25DbGllbnRNb3VzZURvd25cIixcblx0XHRXaW5kb3dOb25DbGllbnRNb3VzZUxlYXZlOiBcIndpbmRvd3M6V2luZG93Tm9uQ2xpZW50TW91c2VMZWF2ZVwiLFxuXHRcdFdpbmRvd05vbkNsaWVudE1vdXNlTW92ZTogXCJ3aW5kb3dzOldpbmRvd05vbkNsaWVudE1vdXNlTW92ZVwiLFxuXHRcdFdpbmRvd05vbkNsaWVudE1vdXNlVXA6IFwid2luZG93czpXaW5kb3dOb25DbGllbnRNb3VzZVVwXCIsXG5cdFx0V2luZG93UGFpbnQ6IFwid2luZG93czpXaW5kb3dQYWludFwiLFxuXHRcdFdpbmRvd1Jlc3RvcmU6IFwid2luZG93czpXaW5kb3dSZXN0b3JlXCIsXG5cdFx0V2luZG93U2V0Rm9jdXM6IFwid2luZG93czpXaW5kb3dTZXRGb2N1c1wiLFxuXHRcdFdpbmRvd1Nob3c6IFwid2luZG93czpXaW5kb3dTaG93XCIsXG5cdFx0V2luZG93U3RhcnRNb3ZlOiBcIndpbmRvd3M6V2luZG93U3RhcnRNb3ZlXCIsXG5cdFx0V2luZG93U3RhcnRSZXNpemU6IFwid2luZG93czpXaW5kb3dTdGFydFJlc2l6ZVwiLFxuXHRcdFdpbmRvd1VuRnVsbHNjcmVlbjogXCJ3aW5kb3dzOldpbmRvd1VuRnVsbHNjcmVlblwiLFxuXHRcdFdpbmRvd1pPcmRlckNoYW5nZWQ6IFwid2luZG93czpXaW5kb3daT3JkZXJDaGFuZ2VkXCIsXG5cdFx0V2luZG93TWluaW1pc2U6IFwid2luZG93czpXaW5kb3dNaW5pbWlzZVwiLFxuXHRcdFdpbmRvd1VuTWluaW1pc2U6IFwid2luZG93czpXaW5kb3dVbk1pbmltaXNlXCIsXG5cdFx0V2luZG93TWF4aW1pc2U6IFwid2luZG93czpXaW5kb3dNYXhpbWlzZVwiLFxuXHRcdFdpbmRvd1VuTWF4aW1pc2U6IFwid2luZG93czpXaW5kb3dVbk1heGltaXNlXCIsXG5cdH0pLFxuXHRNYWM6IE9iamVjdC5mcmVlemUoe1xuXHRcdEFwcGxpY2F0aW9uRGlkQmVjb21lQWN0aXZlOiBcIm1hYzpBcHBsaWNhdGlvbkRpZEJlY29tZUFjdGl2ZVwiLFxuXHRcdEFwcGxpY2F0aW9uRGlkQ2hhbmdlQmFja2luZ1Byb3BlcnRpZXM6IFwibWFjOkFwcGxpY2F0aW9uRGlkQ2hhbmdlQmFja2luZ1Byb3BlcnRpZXNcIixcblx0XHRBcHBsaWNhdGlvbkRpZENoYW5nZUVmZmVjdGl2ZUFwcGVhcmFuY2U6IFwibWFjOkFwcGxpY2F0aW9uRGlkQ2hhbmdlRWZmZWN0aXZlQXBwZWFyYW5jZVwiLFxuXHRcdEFwcGxpY2F0aW9uRGlkQ2hhbmdlSWNvbjogXCJtYWM6QXBwbGljYXRpb25EaWRDaGFuZ2VJY29uXCIsXG5cdFx0QXBwbGljYXRpb25EaWRDaGFuZ2VPY2NsdXNpb25TdGF0ZTogXCJtYWM6QXBwbGljYXRpb25EaWRDaGFuZ2VPY2NsdXNpb25TdGF0ZVwiLFxuXHRcdEFwcGxpY2F0aW9uRGlkQ2hhbmdlU2NyZWVuUGFyYW1ldGVyczogXCJtYWM6QXBwbGljYXRpb25EaWRDaGFuZ2VTY3JlZW5QYXJhbWV0ZXJzXCIsXG5cdFx0QXBwbGljYXRpb25EaWRDaGFuZ2VTdGF0dXNCYXJGcmFtZTogXCJtYWM6QXBwbGljYXRpb25EaWRDaGFuZ2VTdGF0dXNCYXJGcmFtZVwiLFxuXHRcdEFwcGxpY2F0aW9uRGlkQ2hhbmdlU3RhdHVzQmFyT3JpZW50YXRpb246IFwibWFjOkFwcGxpY2F0aW9uRGlkQ2hhbmdlU3RhdHVzQmFyT3JpZW50YXRpb25cIixcblx0XHRBcHBsaWNhdGlvbkRpZENoYW5nZVRoZW1lOiBcIm1hYzpBcHBsaWNhdGlvbkRpZENoYW5nZVRoZW1lXCIsXG5cdFx0QXBwbGljYXRpb25EaWRGaW5pc2hMYXVuY2hpbmc6IFwibWFjOkFwcGxpY2F0aW9uRGlkRmluaXNoTGF1bmNoaW5nXCIsXG5cdFx0QXBwbGljYXRpb25EaWRIaWRlOiBcIm1hYzpBcHBsaWNhdGlvbkRpZEhpZGVcIixcblx0XHRBcHBsaWNhdGlvbkRpZFJlc2lnbkFjdGl2ZTogXCJtYWM6QXBwbGljYXRpb25EaWRSZXNpZ25BY3RpdmVcIixcblx0XHRBcHBsaWNhdGlvbkRpZFVuaGlkZTogXCJtYWM6QXBwbGljYXRpb25EaWRVbmhpZGVcIixcblx0XHRBcHBsaWNhdGlvbkRpZFVwZGF0ZTogXCJtYWM6QXBwbGljYXRpb25EaWRVcGRhdGVcIixcblx0XHRBcHBsaWNhdGlvblNob3VsZEhhbmRsZVJlb3BlbjogXCJtYWM6QXBwbGljYXRpb25TaG91bGRIYW5kbGVSZW9wZW5cIixcblx0XHRBcHBsaWNhdGlvbldpbGxCZWNvbWVBY3RpdmU6IFwibWFjOkFwcGxpY2F0aW9uV2lsbEJlY29tZUFjdGl2ZVwiLFxuXHRcdEFwcGxpY2F0aW9uV2lsbEZpbmlzaExhdW5jaGluZzogXCJtYWM6QXBwbGljYXRpb25XaWxsRmluaXNoTGF1bmNoaW5nXCIsXG5cdFx0QXBwbGljYXRpb25XaWxsSGlkZTogXCJtYWM6QXBwbGljYXRpb25XaWxsSGlkZVwiLFxuXHRcdEFwcGxpY2F0aW9uV2lsbFJlc2lnbkFjdGl2ZTogXCJtYWM6QXBwbGljYXRpb25XaWxsUmVzaWduQWN0aXZlXCIsXG5cdFx0QXBwbGljYXRpb25XaWxsVGVybWluYXRlOiBcIm1hYzpBcHBsaWNhdGlvbldpbGxUZXJtaW5hdGVcIixcblx0XHRBcHBsaWNhdGlvbldpbGxVbmhpZGU6IFwibWFjOkFwcGxpY2F0aW9uV2lsbFVuaGlkZVwiLFxuXHRcdEFwcGxpY2F0aW9uV2lsbFVwZGF0ZTogXCJtYWM6QXBwbGljYXRpb25XaWxsVXBkYXRlXCIsXG5cdFx0TWVudURpZEFkZEl0ZW06IFwibWFjOk1lbnVEaWRBZGRJdGVtXCIsXG5cdFx0TWVudURpZEJlZ2luVHJhY2tpbmc6IFwibWFjOk1lbnVEaWRCZWdpblRyYWNraW5nXCIsXG5cdFx0TWVudURpZENsb3NlOiBcIm1hYzpNZW51RGlkQ2xvc2VcIixcblx0XHRNZW51RGlkRGlzcGxheUl0ZW06IFwibWFjOk1lbnVEaWREaXNwbGF5SXRlbVwiLFxuXHRcdE1lbnVEaWRFbmRUcmFja2luZzogXCJtYWM6TWVudURpZEVuZFRyYWNraW5nXCIsXG5cdFx0TWVudURpZEhpZ2hsaWdodEl0ZW06IFwibWFjOk1lbnVEaWRIaWdobGlnaHRJdGVtXCIsXG5cdFx0TWVudURpZE9wZW46IFwibWFjOk1lbnVEaWRPcGVuXCIsXG5cdFx0TWVudURpZFBvcFVwOiBcIm1hYzpNZW51RGlkUG9wVXBcIixcblx0XHRNZW51RGlkUmVtb3ZlSXRlbTogXCJtYWM6TWVudURpZFJlbW92ZUl0ZW1cIixcblx0XHRNZW51RGlkU2VuZEFjdGlvbjogXCJtYWM6TWVudURpZFNlbmRBY3Rpb25cIixcblx0XHRNZW51RGlkU2VuZEFjdGlvblRvSXRlbTogXCJtYWM6TWVudURpZFNlbmRBY3Rpb25Ub0l0ZW1cIixcblx0XHRNZW51RGlkVXBkYXRlOiBcIm1hYzpNZW51RGlkVXBkYXRlXCIsXG5cdFx0TWVudVdpbGxBZGRJdGVtOiBcIm1hYzpNZW51V2lsbEFkZEl0ZW1cIixcblx0XHRNZW51V2lsbEJlZ2luVHJhY2tpbmc6IFwibWFjOk1lbnVXaWxsQmVnaW5UcmFja2luZ1wiLFxuXHRcdE1lbnVXaWxsRGlzcGxheUl0ZW06IFwibWFjOk1lbnVXaWxsRGlzcGxheUl0ZW1cIixcblx0XHRNZW51V2lsbEVuZFRyYWNraW5nOiBcIm1hYzpNZW51V2lsbEVuZFRyYWNraW5nXCIsXG5cdFx0TWVudVdpbGxIaWdobGlnaHRJdGVtOiBcIm1hYzpNZW51V2lsbEhpZ2hsaWdodEl0ZW1cIixcblx0XHRNZW51V2lsbE9wZW46IFwibWFjOk1lbnVXaWxsT3BlblwiLFxuXHRcdE1lbnVXaWxsUG9wVXA6IFwibWFjOk1lbnVXaWxsUG9wVXBcIixcblx0XHRNZW51V2lsbFJlbW92ZUl0ZW06IFwibWFjOk1lbnVXaWxsUmVtb3ZlSXRlbVwiLFxuXHRcdE1lbnVXaWxsU2VuZEFjdGlvbjogXCJtYWM6TWVudVdpbGxTZW5kQWN0aW9uXCIsXG5cdFx0TWVudVdpbGxTZW5kQWN0aW9uVG9JdGVtOiBcIm1hYzpNZW51V2lsbFNlbmRBY3Rpb25Ub0l0ZW1cIixcblx0XHRNZW51V2lsbFVwZGF0ZTogXCJtYWM6TWVudVdpbGxVcGRhdGVcIixcblx0XHRXZWJWaWV3RGlkQ29tbWl0TmF2aWdhdGlvbjogXCJtYWM6V2ViVmlld0RpZENvbW1pdE5hdmlnYXRpb25cIixcblx0XHRXZWJWaWV3RGlkRmluaXNoTmF2aWdhdGlvbjogXCJtYWM6V2ViVmlld0RpZEZpbmlzaE5hdmlnYXRpb25cIixcblx0XHRXZWJWaWV3RGlkUmVjZWl2ZVNlcnZlclJlZGlyZWN0Rm9yUHJvdmlzaW9uYWxOYXZpZ2F0aW9uOiBcIm1hYzpXZWJWaWV3RGlkUmVjZWl2ZVNlcnZlclJlZGlyZWN0Rm9yUHJvdmlzaW9uYWxOYXZpZ2F0aW9uXCIsXG5cdFx0V2ViVmlld0RpZFN0YXJ0UHJvdmlzaW9uYWxOYXZpZ2F0aW9uOiBcIm1hYzpXZWJWaWV3RGlkU3RhcnRQcm92aXNpb25hbE5hdmlnYXRpb25cIixcblx0XHRXaW5kb3dEaWRCZWNvbWVLZXk6IFwibWFjOldpbmRvd0RpZEJlY29tZUtleVwiLFxuXHRcdFdpbmRvd0RpZEJlY29tZU1haW46IFwibWFjOldpbmRvd0RpZEJlY29tZU1haW5cIixcblx0XHRXaW5kb3dEaWRCZWdpblNoZWV0OiBcIm1hYzpXaW5kb3dEaWRCZWdpblNoZWV0XCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlQWxwaGE6IFwibWFjOldpbmRvd0RpZENoYW5nZUFscGhhXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlQmFja2luZ0xvY2F0aW9uOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VCYWNraW5nTG9jYXRpb25cIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VCYWNraW5nUHJvcGVydGllczogXCJtYWM6V2luZG93RGlkQ2hhbmdlQmFja2luZ1Byb3BlcnRpZXNcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VDb2xsZWN0aW9uQmVoYXZpb3I6IFwibWFjOldpbmRvd0RpZENoYW5nZUNvbGxlY3Rpb25CZWhhdmlvclwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZUVmZmVjdGl2ZUFwcGVhcmFuY2U6IFwibWFjOldpbmRvd0RpZENoYW5nZUVmZmVjdGl2ZUFwcGVhcmFuY2VcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VPY2NsdXNpb25TdGF0ZTogXCJtYWM6V2luZG93RGlkQ2hhbmdlT2NjbHVzaW9uU3RhdGVcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VPcmRlcmluZ01vZGU6IFwibWFjOldpbmRvd0RpZENoYW5nZU9yZGVyaW5nTW9kZVwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZVNjcmVlbjogXCJtYWM6V2luZG93RGlkQ2hhbmdlU2NyZWVuXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlU2NyZWVuUGFyYW1ldGVyczogXCJtYWM6V2luZG93RGlkQ2hhbmdlU2NyZWVuUGFyYW1ldGVyc1wiLFxuXHRcdFdpbmRvd0RpZENoYW5nZVNjcmVlblByb2ZpbGU6IFwibWFjOldpbmRvd0RpZENoYW5nZVNjcmVlblByb2ZpbGVcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VTY3JlZW5TcGFjZTogXCJtYWM6V2luZG93RGlkQ2hhbmdlU2NyZWVuU3BhY2VcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VTY3JlZW5TcGFjZVByb3BlcnRpZXM6IFwibWFjOldpbmRvd0RpZENoYW5nZVNjcmVlblNwYWNlUHJvcGVydGllc1wiLFxuXHRcdFdpbmRvd0RpZENoYW5nZVNoYXJpbmdUeXBlOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VTaGFyaW5nVHlwZVwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZVNwYWNlOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VTcGFjZVwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZVNwYWNlT3JkZXJpbmdNb2RlOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VTcGFjZU9yZGVyaW5nTW9kZVwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZVRpdGxlOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VUaXRsZVwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZVRvb2xiYXI6IFwibWFjOldpbmRvd0RpZENoYW5nZVRvb2xiYXJcIixcblx0XHRXaW5kb3dEaWREZW1pbmlhdHVyaXplOiBcIm1hYzpXaW5kb3dEaWREZW1pbmlhdHVyaXplXCIsXG5cdFx0V2luZG93RGlkRW5kU2hlZXQ6IFwibWFjOldpbmRvd0RpZEVuZFNoZWV0XCIsXG5cdFx0V2luZG93RGlkRW50ZXJGdWxsU2NyZWVuOiBcIm1hYzpXaW5kb3dEaWRFbnRlckZ1bGxTY3JlZW5cIixcblx0XHRXaW5kb3dEaWRFbnRlclZlcnNpb25Ccm93c2VyOiBcIm1hYzpXaW5kb3dEaWRFbnRlclZlcnNpb25Ccm93c2VyXCIsXG5cdFx0V2luZG93RGlkRXhpdEZ1bGxTY3JlZW46IFwibWFjOldpbmRvd0RpZEV4aXRGdWxsU2NyZWVuXCIsXG5cdFx0V2luZG93RGlkRXhpdFZlcnNpb25Ccm93c2VyOiBcIm1hYzpXaW5kb3dEaWRFeGl0VmVyc2lvbkJyb3dzZXJcIixcblx0XHRXaW5kb3dEaWRFeHBvc2U6IFwibWFjOldpbmRvd0RpZEV4cG9zZVwiLFxuXHRcdFdpbmRvd0RpZEZvY3VzOiBcIm1hYzpXaW5kb3dEaWRGb2N1c1wiLFxuXHRcdFdpbmRvd0RpZE1pbmlhdHVyaXplOiBcIm1hYzpXaW5kb3dEaWRNaW5pYXR1cml6ZVwiLFxuXHRcdFdpbmRvd0RpZE1vdmU6IFwibWFjOldpbmRvd0RpZE1vdmVcIixcblx0XHRXaW5kb3dEaWRPcmRlck9mZlNjcmVlbjogXCJtYWM6V2luZG93RGlkT3JkZXJPZmZTY3JlZW5cIixcblx0XHRXaW5kb3dEaWRPcmRlck9uU2NyZWVuOiBcIm1hYzpXaW5kb3dEaWRPcmRlck9uU2NyZWVuXCIsXG5cdFx0V2luZG93RGlkUmVzaWduS2V5OiBcIm1hYzpXaW5kb3dEaWRSZXNpZ25LZXlcIixcblx0XHRXaW5kb3dEaWRSZXNpZ25NYWluOiBcIm1hYzpXaW5kb3dEaWRSZXNpZ25NYWluXCIsXG5cdFx0V2luZG93RGlkUmVzaXplOiBcIm1hYzpXaW5kb3dEaWRSZXNpemVcIixcblx0XHRXaW5kb3dEaWRVcGRhdGU6IFwibWFjOldpbmRvd0RpZFVwZGF0ZVwiLFxuXHRcdFdpbmRvd0RpZFVwZGF0ZUFscGhhOiBcIm1hYzpXaW5kb3dEaWRVcGRhdGVBbHBoYVwiLFxuXHRcdFdpbmRvd0RpZFVwZGF0ZUNvbGxlY3Rpb25CZWhhdmlvcjogXCJtYWM6V2luZG93RGlkVXBkYXRlQ29sbGVjdGlvbkJlaGF2aW9yXCIsXG5cdFx0V2luZG93RGlkVXBkYXRlQ29sbGVjdGlvblByb3BlcnRpZXM6IFwibWFjOldpbmRvd0RpZFVwZGF0ZUNvbGxlY3Rpb25Qcm9wZXJ0aWVzXCIsXG5cdFx0V2luZG93RGlkVXBkYXRlU2hhZG93OiBcIm1hYzpXaW5kb3dEaWRVcGRhdGVTaGFkb3dcIixcblx0XHRXaW5kb3dEaWRVcGRhdGVUaXRsZTogXCJtYWM6V2luZG93RGlkVXBkYXRlVGl0bGVcIixcblx0XHRXaW5kb3dEaWRVcGRhdGVUb29sYmFyOiBcIm1hYzpXaW5kb3dEaWRVcGRhdGVUb29sYmFyXCIsXG5cdFx0V2luZG93RGlkWm9vbTogXCJtYWM6V2luZG93RGlkWm9vbVwiLFxuXHRcdFdpbmRvd0ZpbGVEcmFnZ2luZ0VudGVyZWQ6IFwibWFjOldpbmRvd0ZpbGVEcmFnZ2luZ0VudGVyZWRcIixcblx0XHRXaW5kb3dGaWxlRHJhZ2dpbmdFeGl0ZWQ6IFwibWFjOldpbmRvd0ZpbGVEcmFnZ2luZ0V4aXRlZFwiLFxuXHRcdFdpbmRvd0ZpbGVEcmFnZ2luZ1BlcmZvcm1lZDogXCJtYWM6V2luZG93RmlsZURyYWdnaW5nUGVyZm9ybWVkXCIsXG5cdFx0V2luZG93SGlkZTogXCJtYWM6V2luZG93SGlkZVwiLFxuXHRcdFdpbmRvd01heGltaXNlOiBcIm1hYzpXaW5kb3dNYXhpbWlzZVwiLFxuXHRcdFdpbmRvd1VuTWF4aW1pc2U6IFwibWFjOldpbmRvd1VuTWF4aW1pc2VcIixcblx0XHRXaW5kb3dNaW5pbWlzZTogXCJtYWM6V2luZG93TWluaW1pc2VcIixcblx0XHRXaW5kb3dVbk1pbmltaXNlOiBcIm1hYzpXaW5kb3dVbk1pbmltaXNlXCIsXG5cdFx0V2luZG93U2hvdWxkQ2xvc2U6IFwibWFjOldpbmRvd1Nob3VsZENsb3NlXCIsXG5cdFx0V2luZG93U2hvdzogXCJtYWM6V2luZG93U2hvd1wiLFxuXHRcdFdpbmRvd1dpbGxCZWNvbWVLZXk6IFwibWFjOldpbmRvd1dpbGxCZWNvbWVLZXlcIixcblx0XHRXaW5kb3dXaWxsQmVjb21lTWFpbjogXCJtYWM6V2luZG93V2lsbEJlY29tZU1haW5cIixcblx0XHRXaW5kb3dXaWxsQmVnaW5TaGVldDogXCJtYWM6V2luZG93V2lsbEJlZ2luU2hlZXRcIixcblx0XHRXaW5kb3dXaWxsQ2hhbmdlT3JkZXJpbmdNb2RlOiBcIm1hYzpXaW5kb3dXaWxsQ2hhbmdlT3JkZXJpbmdNb2RlXCIsXG5cdFx0V2luZG93V2lsbENsb3NlOiBcIm1hYzpXaW5kb3dXaWxsQ2xvc2VcIixcblx0XHRXaW5kb3dXaWxsRGVtaW5pYXR1cml6ZTogXCJtYWM6V2luZG93V2lsbERlbWluaWF0dXJpemVcIixcblx0XHRXaW5kb3dXaWxsRW50ZXJGdWxsU2NyZWVuOiBcIm1hYzpXaW5kb3dXaWxsRW50ZXJGdWxsU2NyZWVuXCIsXG5cdFx0V2luZG93V2lsbEVudGVyVmVyc2lvbkJyb3dzZXI6IFwibWFjOldpbmRvd1dpbGxFbnRlclZlcnNpb25Ccm93c2VyXCIsXG5cdFx0V2luZG93V2lsbEV4aXRGdWxsU2NyZWVuOiBcIm1hYzpXaW5kb3dXaWxsRXhpdEZ1bGxTY3JlZW5cIixcblx0XHRXaW5kb3dXaWxsRXhpdFZlcnNpb25Ccm93c2VyOiBcIm1hYzpXaW5kb3dXaWxsRXhpdFZlcnNpb25Ccm93c2VyXCIsXG5cdFx0V2luZG93V2lsbEZvY3VzOiBcIm1hYzpXaW5kb3dXaWxsRm9jdXNcIixcblx0XHRXaW5kb3dXaWxsTWluaWF0dXJpemU6IFwibWFjOldpbmRvd1dpbGxNaW5pYXR1cml6ZVwiLFxuXHRcdFdpbmRvd1dpbGxNb3ZlOiBcIm1hYzpXaW5kb3dXaWxsTW92ZVwiLFxuXHRcdFdpbmRvd1dpbGxPcmRlck9mZlNjcmVlbjogXCJtYWM6V2luZG93V2lsbE9yZGVyT2ZmU2NyZWVuXCIsXG5cdFx0V2luZG93V2lsbE9yZGVyT25TY3JlZW46IFwibWFjOldpbmRvd1dpbGxPcmRlck9uU2NyZWVuXCIsXG5cdFx0V2luZG93V2lsbFJlc2lnbk1haW46IFwibWFjOldpbmRvd1dpbGxSZXNpZ25NYWluXCIsXG5cdFx0V2luZG93V2lsbFJlc2l6ZTogXCJtYWM6V2luZG93V2lsbFJlc2l6ZVwiLFxuXHRcdFdpbmRvd1dpbGxVbmZvY3VzOiBcIm1hYzpXaW5kb3dXaWxsVW5mb2N1c1wiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGU6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVcIixcblx0XHRXaW5kb3dXaWxsVXBkYXRlQWxwaGE6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVBbHBoYVwiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGVDb2xsZWN0aW9uQmVoYXZpb3I6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVDb2xsZWN0aW9uQmVoYXZpb3JcIixcblx0XHRXaW5kb3dXaWxsVXBkYXRlQ29sbGVjdGlvblByb3BlcnRpZXM6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVDb2xsZWN0aW9uUHJvcGVydGllc1wiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGVTaGFkb3c6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVTaGFkb3dcIixcblx0XHRXaW5kb3dXaWxsVXBkYXRlVGl0bGU6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVUaXRsZVwiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGVUb29sYmFyOiBcIm1hYzpXaW5kb3dXaWxsVXBkYXRlVG9vbGJhclwiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGVWaXNpYmlsaXR5OiBcIm1hYzpXaW5kb3dXaWxsVXBkYXRlVmlzaWJpbGl0eVwiLFxuXHRcdFdpbmRvd1dpbGxVc2VTdGFuZGFyZEZyYW1lOiBcIm1hYzpXaW5kb3dXaWxsVXNlU3RhbmRhcmRGcmFtZVwiLFxuXHRcdFdpbmRvd1pvb21JbjogXCJtYWM6V2luZG93Wm9vbUluXCIsXG5cdFx0V2luZG93Wm9vbU91dDogXCJtYWM6V2luZG93Wm9vbU91dFwiLFxuXHRcdFdpbmRvd1pvb21SZXNldDogXCJtYWM6V2luZG93Wm9vbVJlc2V0XCIsXG5cdH0pLFxuXHRMaW51eDogT2JqZWN0LmZyZWV6ZSh7XG5cdFx0QXBwbGljYXRpb25TdGFydHVwOiBcImxpbnV4OkFwcGxpY2F0aW9uU3RhcnR1cFwiLFxuXHRcdFN5c3RlbVRoZW1lQ2hhbmdlZDogXCJsaW51eDpTeXN0ZW1UaGVtZUNoYW5nZWRcIixcblx0XHRXaW5kb3dEZWxldGVFdmVudDogXCJsaW51eDpXaW5kb3dEZWxldGVFdmVudFwiLFxuXHRcdFdpbmRvd0RpZE1vdmU6IFwibGludXg6V2luZG93RGlkTW92ZVwiLFxuXHRcdFdpbmRvd0RpZFJlc2l6ZTogXCJsaW51eDpXaW5kb3dEaWRSZXNpemVcIixcblx0XHRXaW5kb3dGb2N1c0luOiBcImxpbnV4OldpbmRvd0ZvY3VzSW5cIixcblx0XHRXaW5kb3dGb2N1c091dDogXCJsaW51eDpXaW5kb3dGb2N1c091dFwiLFxuXHRcdFdpbmRvd0xvYWRDaGFuZ2VkOiBcImxpbnV4OldpbmRvd0xvYWRDaGFuZ2VkXCIsXG5cdH0pLFxuXHRDb21tb246IE9iamVjdC5mcmVlemUoe1xuXHRcdEFwcGxpY2F0aW9uT3BlbmVkV2l0aEZpbGU6IFwiY29tbW9uOkFwcGxpY2F0aW9uT3BlbmVkV2l0aEZpbGVcIixcblx0XHRBcHBsaWNhdGlvblN0YXJ0ZWQ6IFwiY29tbW9uOkFwcGxpY2F0aW9uU3RhcnRlZFwiLFxuXHRcdFRoZW1lQ2hhbmdlZDogXCJjb21tb246VGhlbWVDaGFuZ2VkXCIsXG5cdFx0V2luZG93Q2xvc2luZzogXCJjb21tb246V2luZG93Q2xvc2luZ1wiLFxuXHRcdFdpbmRvd0RpZE1vdmU6IFwiY29tbW9uOldpbmRvd0RpZE1vdmVcIixcblx0XHRXaW5kb3dEaWRSZXNpemU6IFwiY29tbW9uOldpbmRvd0RpZFJlc2l6ZVwiLFxuXHRcdFdpbmRvd0RQSUNoYW5nZWQ6IFwiY29tbW9uOldpbmRvd0RQSUNoYW5nZWRcIixcblx0XHRXaW5kb3dGaWxlc0Ryb3BwZWQ6IFwiY29tbW9uOldpbmRvd0ZpbGVzRHJvcHBlZFwiLFxuXHRcdFdpbmRvd0ZvY3VzOiBcImNvbW1vbjpXaW5kb3dGb2N1c1wiLFxuXHRcdFdpbmRvd0Z1bGxzY3JlZW46IFwiY29tbW9uOldpbmRvd0Z1bGxzY3JlZW5cIixcblx0XHRXaW5kb3dIaWRlOiBcImNvbW1vbjpXaW5kb3dIaWRlXCIsXG5cdFx0V2luZG93TG9zdEZvY3VzOiBcImNvbW1vbjpXaW5kb3dMb3N0Rm9jdXNcIixcblx0XHRXaW5kb3dNYXhpbWlzZTogXCJjb21tb246V2luZG93TWF4aW1pc2VcIixcblx0XHRXaW5kb3dNaW5pbWlzZTogXCJjb21tb246V2luZG93TWluaW1pc2VcIixcblx0XHRXaW5kb3dSZXN0b3JlOiBcImNvbW1vbjpXaW5kb3dSZXN0b3JlXCIsXG5cdFx0V2luZG93UnVudGltZVJlYWR5OiBcImNvbW1vbjpXaW5kb3dSdW50aW1lUmVhZHlcIixcblx0XHRXaW5kb3dTaG93OiBcImNvbW1vbjpXaW5kb3dTaG93XCIsXG5cdFx0V2luZG93VW5GdWxsc2NyZWVuOiBcImNvbW1vbjpXaW5kb3dVbkZ1bGxzY3JlZW5cIixcblx0XHRXaW5kb3dVbk1heGltaXNlOiBcImNvbW1vbjpXaW5kb3dVbk1heGltaXNlXCIsXG5cdFx0V2luZG93VW5NaW5pbWlzZTogXCJjb21tb246V2luZG93VW5NaW5pbWlzZVwiLFxuXHRcdFdpbmRvd1pvb206IFwiY29tbW9uOldpbmRvd1pvb21cIixcblx0XHRXaW5kb3dab29tSW46IFwiY29tbW9uOldpbmRvd1pvb21JblwiLFxuXHRcdFdpbmRvd1pvb21PdXQ6IFwiY29tbW9uOldpbmRvd1pvb21PdXRcIixcblx0XHRXaW5kb3dab29tUmVzZXQ6IFwiY29tbW9uOldpbmRvd1pvb21SZXNldFwiLFxuXHR9KSxcbn0pO1xuIiwgIi8qXG4gXyAgICAgX18gICAgIF8gX19cbnwgfCAgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vKipcbiAqIExvZ3MgYSBtZXNzYWdlIHRvIHRoZSBjb25zb2xlIHdpdGggY3VzdG9tIGZvcm1hdHRpbmcuXG4gKlxuICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWJ1Z0xvZyhtZXNzYWdlOiBhbnkpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgJyVjIHdhaWxzMyAlYyAnICsgbWVzc2FnZSArICcgJyxcbiAgICAgICAgJ2JhY2tncm91bmQ6ICNhYTAwMDA7IGNvbG9yOiAjZmZmOyBib3JkZXItcmFkaXVzOiAzcHggMHB4IDBweCAzcHg7IHBhZGRpbmc6IDFweDsgZm9udC1zaXplOiAwLjdyZW0nLFxuICAgICAgICAnYmFja2dyb3VuZDogIzAwOTkwMDsgY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDBweCAzcHggM3B4IDBweDsgcGFkZGluZzogMXB4OyBmb250LXNpemU6IDAuN3JlbSdcbiAgICApO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSB3ZWJ2aWV3IHN1cHBvcnRzIHRoZSB7QGxpbmsgTW91c2VFdmVudCNidXR0b25zfSBwcm9wZXJ0eS5cbiAqIExvb2tpbmcgYXQgeW91IG1hY09TIEhpZ2ggU2llcnJhIVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FuVHJhY2tCdXR0b25zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAobmV3IE1vdXNlRXZlbnQoJ21vdXNlZG93bicpKS5idXR0b25zID09PSAwO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBicm93c2VyIHN1cHBvcnRzIHJlbW92aW5nIGxpc3RlbmVycyBieSB0cmlnZ2VyaW5nIGFuIEFib3J0U2lnbmFsXG4gKiAoc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FdmVudFRhcmdldC9hZGRFdmVudExpc3RlbmVyI3NpZ25hbCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYW5BYm9ydExpc3RlbmVycygpIHtcbiAgICBpZiAoIUV2ZW50VGFyZ2V0IHx8ICFBYm9ydFNpZ25hbCB8fCAhQWJvcnRDb250cm9sbGVyKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBsZXQgcmVzdWx0ID0gdHJ1ZTtcblxuICAgIGNvbnN0IHRhcmdldCA9IG5ldyBFdmVudFRhcmdldCgpO1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCAoKSA9PiB7IHJlc3VsdCA9IGZhbHNlOyB9LCB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfSk7XG4gICAgY29udHJvbGxlci5hYm9ydCgpO1xuICAgIHRhcmdldC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgndGVzdCcpKTtcblxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIGNsb3Nlc3QgSFRNTEVsZW1lbnQgYW5jZXN0b3Igb2YgYW4gZXZlbnQncyB0YXJnZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBldmVudFRhcmdldChldmVudDogRXZlbnQpOiBIVE1MRWxlbWVudCB7XG4gICAgaWYgKGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBldmVudC50YXJnZXQ7XG4gICAgfSBlbHNlIGlmICghKGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSAmJiBldmVudC50YXJnZXQgaW5zdGFuY2VvZiBOb2RlKSB7XG4gICAgICAgIHJldHVybiBldmVudC50YXJnZXQucGFyZW50RWxlbWVudCA/PyBkb2N1bWVudC5ib2R5O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBkb2N1bWVudC5ib2R5O1xuICAgIH1cbn1cblxuLyoqKlxuIFRoaXMgdGVjaG5pcXVlIGZvciBwcm9wZXIgbG9hZCBkZXRlY3Rpb24gaXMgdGFrZW4gZnJvbSBIVE1YOlxuXG4gQlNEIDItQ2xhdXNlIExpY2Vuc2VcblxuIENvcHlyaWdodCAoYykgMjAyMCwgQmlnIFNreSBTb2Z0d2FyZVxuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cbiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcblxuIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuXG4gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb25cbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cblxuIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4gQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEVcbiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTFxuIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SXG4gU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVJcbiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLFxuIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFXG4gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cblxuICoqKi9cblxubGV0IGlzUmVhZHkgPSBmYWxzZTtcbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB7IGlzUmVhZHkgPSB0cnVlIH0pO1xuXG5leHBvcnQgZnVuY3Rpb24gd2hlblJlYWR5KGNhbGxiYWNrOiAoKSA9PiB2b2lkKSB7XG4gICAgaWYgKGlzUmVhZHkgfHwgZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJykge1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBjYWxsYmFjayk7XG4gICAgfVxufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5pbXBvcnQge25ld1J1bnRpbWVDYWxsZXIsIG9iamVjdE5hbWVzfSBmcm9tIFwiLi9ydW50aW1lLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNjcmVlbiB9IGZyb20gXCIuL3NjcmVlbnMuanNcIjtcblxuY29uc3QgUG9zaXRpb25NZXRob2QgICAgICAgICAgICAgICAgICAgID0gMDtcbmNvbnN0IENlbnRlck1ldGhvZCAgICAgICAgICAgICAgICAgICAgICA9IDE7XG5jb25zdCBDbG9zZU1ldGhvZCAgICAgICAgICAgICAgICAgICAgICAgPSAyO1xuY29uc3QgRGlzYWJsZVNpemVDb25zdHJhaW50c01ldGhvZCAgICAgID0gMztcbmNvbnN0IEVuYWJsZVNpemVDb25zdHJhaW50c01ldGhvZCAgICAgICA9IDQ7XG5jb25zdCBGb2N1c01ldGhvZCAgICAgICAgICAgICAgICAgICAgICAgPSA1O1xuY29uc3QgRm9yY2VSZWxvYWRNZXRob2QgICAgICAgICAgICAgICAgID0gNjtcbmNvbnN0IEZ1bGxzY3JlZW5NZXRob2QgICAgICAgICAgICAgICAgICA9IDc7XG5jb25zdCBHZXRTY3JlZW5NZXRob2QgICAgICAgICAgICAgICAgICAgPSA4O1xuY29uc3QgR2V0Wm9vbU1ldGhvZCAgICAgICAgICAgICAgICAgICAgID0gOTtcbmNvbnN0IEhlaWdodE1ldGhvZCAgICAgICAgICAgICAgICAgICAgICA9IDEwO1xuY29uc3QgSGlkZU1ldGhvZCAgICAgICAgICAgICAgICAgICAgICAgID0gMTE7XG5jb25zdCBJc0ZvY3VzZWRNZXRob2QgICAgICAgICAgICAgICAgICAgPSAxMjtcbmNvbnN0IElzRnVsbHNjcmVlbk1ldGhvZCAgICAgICAgICAgICAgICA9IDEzO1xuY29uc3QgSXNNYXhpbWlzZWRNZXRob2QgICAgICAgICAgICAgICAgID0gMTQ7XG5jb25zdCBJc01pbmltaXNlZE1ldGhvZCAgICAgICAgICAgICAgICAgPSAxNTtcbmNvbnN0IE1heGltaXNlTWV0aG9kICAgICAgICAgICAgICAgICAgICA9IDE2O1xuY29uc3QgTWluaW1pc2VNZXRob2QgICAgICAgICAgICAgICAgICAgID0gMTc7XG5jb25zdCBOYW1lTWV0aG9kICAgICAgICAgICAgICAgICAgICAgICAgPSAxODtcbmNvbnN0IE9wZW5EZXZUb29sc01ldGhvZCAgICAgICAgICAgICAgICA9IDE5O1xuY29uc3QgUmVsYXRpdmVQb3NpdGlvbk1ldGhvZCAgICAgICAgICAgID0gMjA7XG5jb25zdCBSZWxvYWRNZXRob2QgICAgICAgICAgICAgICAgICAgICAgPSAyMTtcbmNvbnN0IFJlc2l6YWJsZU1ldGhvZCAgICAgICAgICAgICAgICAgICA9IDIyO1xuY29uc3QgUmVzdG9yZU1ldGhvZCAgICAgICAgICAgICAgICAgICAgID0gMjM7XG5jb25zdCBTZXRQb3NpdGlvbk1ldGhvZCAgICAgICAgICAgICAgICAgPSAyNDtcbmNvbnN0IFNldEFsd2F5c09uVG9wTWV0aG9kICAgICAgICAgICAgICA9IDI1O1xuY29uc3QgU2V0QmFja2dyb3VuZENvbG91ck1ldGhvZCAgICAgICAgID0gMjY7XG5jb25zdCBTZXRGcmFtZWxlc3NNZXRob2QgICAgICAgICAgICAgICAgPSAyNztcbmNvbnN0IFNldEZ1bGxzY3JlZW5CdXR0b25FbmFibGVkTWV0aG9kICA9IDI4O1xuY29uc3QgU2V0TWF4U2l6ZU1ldGhvZCAgICAgICAgICAgICAgICAgID0gMjk7XG5jb25zdCBTZXRNaW5TaXplTWV0aG9kICAgICAgICAgICAgICAgICAgPSAzMDtcbmNvbnN0IFNldFJlbGF0aXZlUG9zaXRpb25NZXRob2QgICAgICAgICA9IDMxO1xuY29uc3QgU2V0UmVzaXphYmxlTWV0aG9kICAgICAgICAgICAgICAgID0gMzI7XG5jb25zdCBTZXRTaXplTWV0aG9kICAgICAgICAgICAgICAgICAgICAgPSAzMztcbmNvbnN0IFNldFRpdGxlTWV0aG9kICAgICAgICAgICAgICAgICAgICA9IDM0O1xuY29uc3QgU2V0Wm9vbU1ldGhvZCAgICAgICAgICAgICAgICAgICAgID0gMzU7XG5jb25zdCBTaG93TWV0aG9kICAgICAgICAgICAgICAgICAgICAgICAgPSAzNjtcbmNvbnN0IFNpemVNZXRob2QgICAgICAgICAgICAgICAgICAgICAgICA9IDM3O1xuY29uc3QgVG9nZ2xlRnVsbHNjcmVlbk1ldGhvZCAgICAgICAgICAgID0gMzg7XG5jb25zdCBUb2dnbGVNYXhpbWlzZU1ldGhvZCAgICAgICAgICAgICAgPSAzOTtcbmNvbnN0IFVuRnVsbHNjcmVlbk1ldGhvZCAgICAgICAgICAgICAgICA9IDQwO1xuY29uc3QgVW5NYXhpbWlzZU1ldGhvZCAgICAgICAgICAgICAgICAgID0gNDE7XG5jb25zdCBVbk1pbmltaXNlTWV0aG9kICAgICAgICAgICAgICAgICAgPSA0MjtcbmNvbnN0IFdpZHRoTWV0aG9kICAgICAgICAgICAgICAgICAgICAgICA9IDQzO1xuY29uc3QgWm9vbU1ldGhvZCAgICAgICAgICAgICAgICAgICAgICAgID0gNDQ7XG5jb25zdCBab29tSW5NZXRob2QgICAgICAgICAgICAgICAgICAgICAgPSA0NTtcbmNvbnN0IFpvb21PdXRNZXRob2QgICAgICAgICAgICAgICAgICAgICA9IDQ2O1xuY29uc3QgWm9vbVJlc2V0TWV0aG9kICAgICAgICAgICAgICAgICAgID0gNDc7XG5cbi8qKlxuICogQSByZWNvcmQgZGVzY3JpYmluZyB0aGUgcG9zaXRpb24gb2YgYSB3aW5kb3cuXG4gKi9cbmludGVyZmFjZSBQb3NpdGlvbiB7XG4gICAgLyoqIFRoZSBob3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoZSB3aW5kb3cuICovXG4gICAgeDogbnVtYmVyO1xuICAgIC8qKiBUaGUgdmVydGljYWwgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy4gKi9cbiAgICB5OiBudW1iZXI7XG59XG5cbi8qKlxuICogQSByZWNvcmQgZGVzY3JpYmluZyB0aGUgc2l6ZSBvZiBhIHdpbmRvdy5cbiAqL1xuaW50ZXJmYWNlIFNpemUge1xuICAgIC8qKiBUaGUgd2lkdGggb2YgdGhlIHdpbmRvdy4gKi9cbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIC8qKiBUaGUgaGVpZ2h0IG9mIHRoZSB3aW5kb3cuICovXG4gICAgaGVpZ2h0OiBudW1iZXI7XG59XG5cbi8vIFByaXZhdGUgZmllbGQgbmFtZXMuXG5jb25zdCBjYWxsZXJTeW0gPSBTeW1ib2woXCJjYWxsZXJcIik7XG5cbmNsYXNzIFdpbmRvdyB7XG4gICAgLy8gUHJpdmF0ZSBmaWVsZHMuXG4gICAgcHJpdmF0ZSBbY2FsbGVyU3ltXTogKG1lc3NhZ2U6IG51bWJlciwgYXJncz86IGFueSkgPT4gUHJvbWlzZTxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGlzZXMgYSB3aW5kb3cgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YXJnZXQgd2luZG93LlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZyA9ICcnKSB7XG4gICAgICAgIHRoaXNbY2FsbGVyU3ltXSA9IG5ld1J1bnRpbWVDYWxsZXIob2JqZWN0TmFtZXMuV2luZG93LCBuYW1lKVxuXG4gICAgICAgIC8vIGJpbmQgaW5zdGFuY2UgbWV0aG9kIHRvIG1ha2UgdGhlbSBlYXNpbHkgdXNhYmxlIGluIGV2ZW50IGhhbmRsZXJzXG4gICAgICAgIGZvciAoY29uc3QgbWV0aG9kIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKFdpbmRvdy5wcm90b3R5cGUpKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgbWV0aG9kICE9PSBcImNvbnN0cnVjdG9yXCJcbiAgICAgICAgICAgICAgICAmJiB0eXBlb2YgKHRoaXMgYXMgYW55KVttZXRob2RdID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICh0aGlzIGFzIGFueSlbbWV0aG9kXSA9ICh0aGlzIGFzIGFueSlbbWV0aG9kXS5iaW5kKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgc3BlY2lmaWVkIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHdpbmRvdyB0byBnZXQuXG4gICAgICogQHJldHVybnMgVGhlIGNvcnJlc3BvbmRpbmcgd2luZG93IG9iamVjdC5cbiAgICAgKi9cbiAgICBHZXQobmFtZTogc3RyaW5nKTogV2luZG93IHtcbiAgICAgICAgcmV0dXJuIG5ldyBXaW5kb3cobmFtZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IGFic29sdXRlIHBvc2l0aW9uIG9mIHRoZSB3aW5kb3cuXG4gICAgICovXG4gICAgUG9zaXRpb24oKTogUHJvbWlzZTxQb3NpdGlvbj4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFBvc2l0aW9uTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDZW50ZXJzIHRoZSB3aW5kb3cgb24gdGhlIHNjcmVlbi5cbiAgICAgKi9cbiAgICBDZW50ZXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oQ2VudGVyTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBDbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShDbG9zZU1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZXMgbWluL21heCBzaXplIGNvbnN0cmFpbnRzLlxuICAgICAqL1xuICAgIERpc2FibGVTaXplQ29uc3RyYWludHMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oRGlzYWJsZVNpemVDb25zdHJhaW50c01ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyBtaW4vbWF4IHNpemUgY29uc3RyYWludHMuXG4gICAgICovXG4gICAgRW5hYmxlU2l6ZUNvbnN0cmFpbnRzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEVuYWJsZVNpemVDb25zdHJhaW50c01ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9jdXNlcyB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIEZvY3VzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEZvY3VzTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JjZXMgdGhlIHdpbmRvdyB0byByZWxvYWQgdGhlIHBhZ2UgYXNzZXRzLlxuICAgICAqL1xuICAgIEZvcmNlUmVsb2FkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEZvcmNlUmVsb2FkTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTd2l0Y2hlcyB0aGUgd2luZG93IHRvIGZ1bGxzY3JlZW4gbW9kZS5cbiAgICAgKi9cbiAgICBGdWxsc2NyZWVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEZ1bGxzY3JlZW5NZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHNjcmVlbiB0aGF0IHRoZSB3aW5kb3cgaXMgb24uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgc2NyZWVuIHRoZSB3aW5kb3cgaXMgY3VycmVudGx5IG9uLlxuICAgICAqL1xuICAgIEdldFNjcmVlbigpOiBQcm9taXNlPFNjcmVlbj4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEdldFNjcmVlbk1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudCB6b29tIGxldmVsIG9mIHRoZSB3aW5kb3cuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCB6b29tIGxldmVsLlxuICAgICAqL1xuICAgIEdldFpvb20oKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShHZXRab29tTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBoZWlnaHQgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IGhlaWdodCBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIEhlaWdodCgpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEhlaWdodE1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGlkZXMgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBIaWRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEhpZGVNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgd2luZG93IGlzIGZvY3VzZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSB3aW5kb3cgaXMgY3VycmVudGx5IGZvY3VzZWQuXG4gICAgICovXG4gICAgSXNGb2N1c2VkKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKElzRm9jdXNlZE1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB3aW5kb3cgaXMgZnVsbHNjcmVlbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIHdpbmRvdyBpcyBjdXJyZW50bHkgZnVsbHNjcmVlbi5cbiAgICAgKi9cbiAgICBJc0Z1bGxzY3JlZW4oKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oSXNGdWxsc2NyZWVuTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHdpbmRvdyBpcyBtYXhpbWlzZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSB3aW5kb3cgaXMgY3VycmVudGx5IG1heGltaXNlZC5cbiAgICAgKi9cbiAgICBJc01heGltaXNlZCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShJc01heGltaXNlZE1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB3aW5kb3cgaXMgbWluaW1pc2VkLlxuICAgICAqXG4gICAgICogQHJldHVybnMgV2hldGhlciB0aGUgd2luZG93IGlzIGN1cnJlbnRseSBtaW5pbWlzZWQuXG4gICAgICovXG4gICAgSXNNaW5pbWlzZWQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oSXNNaW5pbWlzZWRNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1heGltaXNlcyB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIE1heGltaXNlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKE1heGltaXNlTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNaW5pbWlzZXMgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBNaW5pbWlzZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShNaW5pbWlzZU1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgd2luZG93LlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIG5hbWUgb2YgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBOYW1lKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oTmFtZU1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3BlbnMgdGhlIGRldmVsb3BtZW50IHRvb2xzIHBhbmUuXG4gICAgICovXG4gICAgT3BlbkRldlRvb2xzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKE9wZW5EZXZUb29sc01ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcmVsYXRpdmUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdyB0byB0aGUgc2NyZWVuLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIGN1cnJlbnQgcmVsYXRpdmUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBSZWxhdGl2ZVBvc2l0aW9uKCk6IFByb21pc2U8UG9zaXRpb24+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShSZWxhdGl2ZVBvc2l0aW9uTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWxvYWRzIHRoZSBwYWdlIGFzc2V0cy5cbiAgICAgKi9cbiAgICBSZWxvYWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oUmVsb2FkTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHdpbmRvdyBpcyByZXNpemFibGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSB3aW5kb3cgaXMgY3VycmVudGx5IHJlc2l6YWJsZS5cbiAgICAgKi9cbiAgICBSZXNpemFibGUoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oUmVzaXphYmxlTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXN0b3JlcyB0aGUgd2luZG93IHRvIGl0cyBwcmV2aW91cyBzdGF0ZSBpZiBpdCB3YXMgcHJldmlvdXNseSBtaW5pbWlzZWQsIG1heGltaXNlZCBvciBmdWxsc2NyZWVuLlxuICAgICAqL1xuICAgIFJlc3RvcmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oUmVzdG9yZU1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB4IC0gVGhlIGRlc2lyZWQgaG9yaXpvbnRhbCBhYnNvbHV0ZSBwb3NpdGlvbiBvZiB0aGUgd2luZG93LlxuICAgICAqIEBwYXJhbSB5IC0gVGhlIGRlc2lyZWQgdmVydGljYWwgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBTZXRQb3NpdGlvbih4OiBudW1iZXIsIHk6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFNldFBvc2l0aW9uTWV0aG9kLCB7IHgsIHkgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgd2luZG93IHRvIGJlIGFsd2F5cyBvbiB0b3AuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYWx3YXlzT25Ub3AgLSBXaGV0aGVyIHRoZSB3aW5kb3cgc2hvdWxkIHN0YXkgb24gdG9wLlxuICAgICAqL1xuICAgIFNldEFsd2F5c09uVG9wKGFsd2F5c09uVG9wOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2V0QWx3YXlzT25Ub3BNZXRob2QsIHsgYWx3YXlzT25Ub3AgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgYmFja2dyb3VuZCBjb2xvdXIgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByIC0gVGhlIGRlc2lyZWQgcmVkIGNvbXBvbmVudCBvZiB0aGUgd2luZG93IGJhY2tncm91bmQuXG4gICAgICogQHBhcmFtIGcgLSBUaGUgZGVzaXJlZCBncmVlbiBjb21wb25lbnQgb2YgdGhlIHdpbmRvdyBiYWNrZ3JvdW5kLlxuICAgICAqIEBwYXJhbSBiIC0gVGhlIGRlc2lyZWQgYmx1ZSBjb21wb25lbnQgb2YgdGhlIHdpbmRvdyBiYWNrZ3JvdW5kLlxuICAgICAqIEBwYXJhbSBhIC0gVGhlIGRlc2lyZWQgYWxwaGEgY29tcG9uZW50IG9mIHRoZSB3aW5kb3cgYmFja2dyb3VuZC5cbiAgICAgKi9cbiAgICBTZXRCYWNrZ3JvdW5kQ29sb3VyKHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIsIGE6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFNldEJhY2tncm91bmRDb2xvdXJNZXRob2QsIHsgciwgZywgYiwgYSB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSB3aW5kb3cgZnJhbWUgYW5kIHRpdGxlIGJhci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmcmFtZWxlc3MgLSBXaGV0aGVyIHRoZSB3aW5kb3cgc2hvdWxkIGJlIGZyYW1lbGVzcy5cbiAgICAgKi9cbiAgICBTZXRGcmFtZWxlc3MoZnJhbWVsZXNzOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2V0RnJhbWVsZXNzTWV0aG9kLCB7IGZyYW1lbGVzcyB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlcyB0aGUgc3lzdGVtIGZ1bGxzY3JlZW4gYnV0dG9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVuYWJsZWQgLSBXaGV0aGVyIHRoZSBmdWxsc2NyZWVuIGJ1dHRvbiBzaG91bGQgYmUgZW5hYmxlZC5cbiAgICAgKi9cbiAgICBTZXRGdWxsc2NyZWVuQnV0dG9uRW5hYmxlZChlbmFibGVkOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2V0RnVsbHNjcmVlbkJ1dHRvbkVuYWJsZWRNZXRob2QsIHsgZW5hYmxlZCB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB3aWR0aCAtIFRoZSBkZXNpcmVkIG1heGltdW0gd2lkdGggb2YgdGhlIHdpbmRvdy5cbiAgICAgKiBAcGFyYW0gaGVpZ2h0IC0gVGhlIGRlc2lyZWQgbWF4aW11bSBoZWlnaHQgb2YgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBTZXRNYXhTaXplKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2V0TWF4U2l6ZU1ldGhvZCwgeyB3aWR0aCwgaGVpZ2h0IH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIG1pbmltdW0gc2l6ZSBvZiB0aGUgd2luZG93LlxuICAgICAqXG4gICAgICogQHBhcmFtIHdpZHRoIC0gVGhlIGRlc2lyZWQgbWluaW11bSB3aWR0aCBvZiB0aGUgd2luZG93LlxuICAgICAqIEBwYXJhbSBoZWlnaHQgLSBUaGUgZGVzaXJlZCBtaW5pbXVtIGhlaWdodCBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFNldE1pblNpemUod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShTZXRNaW5TaXplTWV0aG9kLCB7IHdpZHRoLCBoZWlnaHQgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcmVsYXRpdmUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdyB0byB0aGUgc2NyZWVuLlxuICAgICAqXG4gICAgICogQHBhcmFtIHggLSBUaGUgZGVzaXJlZCBob3Jpem9udGFsIHJlbGF0aXZlIHBvc2l0aW9uIG9mIHRoZSB3aW5kb3cuXG4gICAgICogQHBhcmFtIHkgLSBUaGUgZGVzaXJlZCB2ZXJ0aWNhbCByZWxhdGl2ZSBwb3NpdGlvbiBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFNldFJlbGF0aXZlUG9zaXRpb24oeDogbnVtYmVyLCB5OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShTZXRSZWxhdGl2ZVBvc2l0aW9uTWV0aG9kLCB7IHgsIHkgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB3aGV0aGVyIHRoZSB3aW5kb3cgaXMgcmVzaXphYmxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlc2l6YWJsZSAtIFdoZXRoZXIgdGhlIHdpbmRvdyBzaG91bGQgYmUgcmVzaXphYmxlLlxuICAgICAqL1xuICAgIFNldFJlc2l6YWJsZShyZXNpemFibGU6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShTZXRSZXNpemFibGVNZXRob2QsIHsgcmVzaXphYmxlIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHNpemUgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB3aWR0aCAtIFRoZSBkZXNpcmVkIHdpZHRoIG9mIHRoZSB3aW5kb3cuXG4gICAgICogQHBhcmFtIGhlaWdodCAtIFRoZSBkZXNpcmVkIGhlaWdodCBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFNldFNpemUod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShTZXRTaXplTWV0aG9kLCB7IHdpZHRoLCBoZWlnaHQgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdGl0bGUgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0aXRsZSAtIFRoZSBkZXNpcmVkIHRpdGxlIG9mIHRoZSB3aW5kb3cuXG4gICAgICovXG4gICAgU2V0VGl0bGUodGl0bGU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFNldFRpdGxlTWV0aG9kLCB7IHRpdGxlIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHpvb20gbGV2ZWwgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB6b29tIC0gVGhlIGRlc2lyZWQgem9vbSBsZXZlbC5cbiAgICAgKi9cbiAgICBTZXRab29tKHpvb206IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFNldFpvb21NZXRob2QsIHsgem9vbSB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTaG93cyB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFNob3coKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2hvd01ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgd2luZG93LlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFNpemUoKTogUHJvbWlzZTxTaXplPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2l6ZU1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG9nZ2xlcyB0aGUgd2luZG93IGJldHdlZW4gZnVsbHNjcmVlbiBhbmQgbm9ybWFsLlxuICAgICAqL1xuICAgIFRvZ2dsZUZ1bGxzY3JlZW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oVG9nZ2xlRnVsbHNjcmVlbk1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG9nZ2xlcyB0aGUgd2luZG93IGJldHdlZW4gbWF4aW1pc2VkIGFuZCBub3JtYWwuXG4gICAgICovXG4gICAgVG9nZ2xlTWF4aW1pc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oVG9nZ2xlTWF4aW1pc2VNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVuLWZ1bGxzY3JlZW5zIHRoZSB3aW5kb3cuXG4gICAgICovXG4gICAgVW5GdWxsc2NyZWVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFVuRnVsbHNjcmVlbk1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVW4tbWF4aW1pc2VzIHRoZSB3aW5kb3cuXG4gICAgICovXG4gICAgVW5NYXhpbWlzZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShVbk1heGltaXNlTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVbi1taW5pbWlzZXMgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBVbk1pbmltaXNlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFVuTWluaW1pc2VNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHdpZHRoIG9mIHRoZSB3aW5kb3cuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCB3aWR0aCBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFdpZHRoKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oV2lkdGhNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFpvb21zIHRoZSB3aW5kb3cuXG4gICAgICovXG4gICAgWm9vbSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShab29tTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbmNyZWFzZXMgdGhlIHpvb20gbGV2ZWwgb2YgdGhlIHdlYnZpZXcgY29udGVudC5cbiAgICAgKi9cbiAgICBab29tSW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oWm9vbUluTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWNyZWFzZXMgdGhlIHpvb20gbGV2ZWwgb2YgdGhlIHdlYnZpZXcgY29udGVudC5cbiAgICAgKi9cbiAgICBab29tT3V0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFpvb21PdXRNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUgem9vbSBsZXZlbCBvZiB0aGUgd2VidmlldyBjb250ZW50LlxuICAgICAqL1xuICAgIFpvb21SZXNldCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShab29tUmVzZXRNZXRob2QpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBUaGUgd2luZG93IHdpdGhpbiB3aGljaCB0aGUgc2NyaXB0IGlzIHJ1bm5pbmcuXG4gKi9cbmNvbnN0IHRoaXNXaW5kb3cgPSBuZXcgV2luZG93KCcnKTtcblxuZXhwb3J0IGRlZmF1bHQgdGhpc1dpbmRvdztcbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuaW1wb3J0ICogYXMgUnVudGltZSBmcm9tIFwiLi4vQHdhaWxzaW8vcnVudGltZS9zcmNcIjtcblxuLy8gTk9URTogdGhlIGZvbGxvd2luZyBtZXRob2RzIE1VU1QgYmUgaW1wb3J0ZWQgZXhwbGljaXRseSBiZWNhdXNlIG9mIGhvdyBlc2J1aWxkIGluamVjdGlvbiB3b3Jrc1xuaW1wb3J0IHsgRW5hYmxlIGFzIEVuYWJsZVdNTCB9IGZyb20gXCIuLi9Ad2FpbHNpby9ydW50aW1lL3NyYy93bWxcIjtcbmltcG9ydCB7IGRlYnVnTG9nIH0gZnJvbSBcIi4uL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3V0aWxzXCI7XG5cbndpbmRvdy53YWlscyA9IFJ1bnRpbWU7XG5FbmFibGVXTUwoKTtcblxuaWYgKERFQlVHKSB7XG4gICAgZGVidWdMb2coXCJXYWlscyBSdW50aW1lIExvYWRlZFwiKVxufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5pbXBvcnQgeyBuZXdSdW50aW1lQ2FsbGVyLCBvYmplY3ROYW1lcyB9IGZyb20gXCIuL3J1bnRpbWUuanNcIjtcblxuY29uc3QgY2FsbCA9IG5ld1J1bnRpbWVDYWxsZXIob2JqZWN0TmFtZXMuU3lzdGVtKTtcblxuY29uc3QgU3lzdGVtSXNEYXJrTW9kZSA9IDA7XG5jb25zdCBTeXN0ZW1FbnZpcm9ubWVudCA9IDE7XG5cbmNvbnN0IF9pbnZva2UgPSAoZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICgod2luZG93IGFzIGFueSkuY2hyb21lPy53ZWJ2aWV3Py5wb3N0TWVzc2FnZSkge1xuICAgICAgICAgICAgcmV0dXJuICh3aW5kb3cgYXMgYW55KS5jaHJvbWUud2Vidmlldy5wb3N0TWVzc2FnZS5iaW5kKCh3aW5kb3cgYXMgYW55KS5jaHJvbWUud2Vidmlldyk7XG4gICAgICAgIH0gZWxzZSBpZiAoKHdpbmRvdyBhcyBhbnkpLndlYmtpdD8ubWVzc2FnZUhhbmRsZXJzPy5bJ2V4dGVybmFsJ10/LnBvc3RNZXNzYWdlKSB7XG4gICAgICAgICAgICByZXR1cm4gKHdpbmRvdyBhcyBhbnkpLndlYmtpdC5tZXNzYWdlSGFuZGxlcnNbJ2V4dGVybmFsJ10ucG9zdE1lc3NhZ2UuYmluZCgod2luZG93IGFzIGFueSkud2Via2l0Lm1lc3NhZ2VIYW5kbGVyc1snZXh0ZXJuYWwnXSk7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoKGUpIHt9XG5cbiAgICBjb25zb2xlLndhcm4oJ1xcbiVjXHUyNkEwXHVGRTBGIEJyb3dzZXIgRW52aXJvbm1lbnQgRGV0ZWN0ZWQgJWNcXG5cXG4lY09ubHkgVUkgcHJldmlld3MgYXJlIGF2YWlsYWJsZSBpbiB0aGUgYnJvd3Nlci4gRm9yIGZ1bGwgZnVuY3Rpb25hbGl0eSwgcGxlYXNlIHJ1biB0aGUgYXBwbGljYXRpb24gaW4gZGVza3RvcCBtb2RlLlxcbk1vcmUgaW5mb3JtYXRpb24gYXQ6IGh0dHBzOi8vdjMud2FpbHMuaW8vbGVhcm4vYnVpbGQvI3VzaW5nLWEtYnJvd3Nlci1mb3ItZGV2ZWxvcG1lbnRcXG4nLFxuICAgICAgICAnYmFja2dyb3VuZDogI2ZmZmZmZjsgY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyBwYWRkaW5nOiA0cHggOHB4OyBib3JkZXItcmFkaXVzOiA0cHg7IGJvcmRlcjogMnB4IHNvbGlkICMwMDAwMDA7JyxcbiAgICAgICAgJ2JhY2tncm91bmQ6IHRyYW5zcGFyZW50OycsXG4gICAgICAgICdjb2xvcjogI2ZmZmZmZjsgZm9udC1zdHlsZTogaXRhbGljOyBmb250LXdlaWdodDogYm9sZDsnKTtcbiAgICByZXR1cm4gbnVsbDtcbn0pKCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnZva2UobXNnOiBhbnkpOiB2b2lkIHtcbiAgICBfaW52b2tlPy4obXNnKTtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIHN5c3RlbSBkYXJrIG1vZGUgc3RhdHVzLlxuICpcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGEgYm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIGlmIHRoZSBzeXN0ZW0gaXMgaW4gZGFyayBtb2RlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSXNEYXJrTW9kZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gY2FsbChTeXN0ZW1Jc0RhcmtNb2RlKTtcbn1cblxuLyoqXG4gKiBGZXRjaGVzIHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhlIGFwcGxpY2F0aW9uIGZyb20gdGhlIHNlcnZlci5cbiAqXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgY2FwYWJpbGl0aWVzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gQ2FwYWJpbGl0aWVzKCk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGxldCByZXNwb25zZSA9IGF3YWl0IGZldGNoKFwiL3dhaWxzL2NhcGFiaWxpdGllc1wiKTtcbiAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjb3VsZCBub3QgZmV0Y2ggY2FwYWJpbGl0aWVzOiBcIiArIHJlc3BvbnNlLnN0YXR1c1RleHQpO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBPU0luZm8ge1xuICAgIC8qKiBUaGUgYnJhbmRpbmcgb2YgdGhlIE9TLiAqL1xuICAgIEJyYW5kaW5nOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBJRCBvZiB0aGUgT1MuICovXG4gICAgSUQ6IHN0cmluZztcbiAgICAvKiogVGhlIG5hbWUgb2YgdGhlIE9TLiAqL1xuICAgIE5hbWU6IHN0cmluZztcbiAgICAvKiogVGhlIHZlcnNpb24gb2YgdGhlIE9TLiAqL1xuICAgIFZlcnNpb246IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbnZpcm9ubWVudEluZm8ge1xuICAgIC8qKiBUaGUgYXJjaGl0ZWN0dXJlIG9mIHRoZSBzeXN0ZW0uICovXG4gICAgQXJjaDogc3RyaW5nO1xuICAgIC8qKiBUcnVlIGlmIHRoZSBhcHBsaWNhdGlvbiBpcyBydW5uaW5nIGluIGRlYnVnIG1vZGUsIG90aGVyd2lzZSBmYWxzZS4gKi9cbiAgICBEZWJ1ZzogYm9vbGVhbjtcbiAgICAvKiogVGhlIG9wZXJhdGluZyBzeXN0ZW0gaW4gdXNlLiAqL1xuICAgIE9TOiBzdHJpbmc7XG4gICAgLyoqIERldGFpbHMgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0uICovXG4gICAgT1NJbmZvOiBPU0luZm87XG4gICAgLyoqIEFkZGl0aW9uYWwgcGxhdGZvcm0gaW5mb3JtYXRpb24uICovXG4gICAgUGxhdGZvcm1JbmZvOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyBlbnZpcm9ubWVudCBkZXRhaWxzLlxuICpcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIG9iamVjdCBjb250YWluaW5nIE9TIGFuZCBzeXN0ZW0gYXJjaGl0ZWN0dXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gRW52aXJvbm1lbnQoKTogUHJvbWlzZTxFbnZpcm9ubWVudEluZm8+IHtcbiAgICByZXR1cm4gY2FsbChTeXN0ZW1FbnZpcm9ubWVudCk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBjdXJyZW50IG9wZXJhdGluZyBzeXN0ZW0gaXMgV2luZG93cy5cbiAqXG4gKiBAcmV0dXJuIFRydWUgaWYgdGhlIG9wZXJhdGluZyBzeXN0ZW0gaXMgV2luZG93cywgb3RoZXJ3aXNlIGZhbHNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSXNXaW5kb3dzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB3aW5kb3cuX3dhaWxzLmVudmlyb25tZW50Lk9TID09PSBcIndpbmRvd3NcIjtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGN1cnJlbnQgb3BlcmF0aW5nIHN5c3RlbSBpcyBMaW51eC5cbiAqXG4gKiBAcmV0dXJucyBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgb3BlcmF0aW5nIHN5c3RlbSBpcyBMaW51eCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSXNMaW51eCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gd2luZG93Ll93YWlscy5lbnZpcm9ubWVudC5PUyA9PT0gXCJsaW51eFwiO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgY3VycmVudCBlbnZpcm9ubWVudCBpcyBhIG1hY09TIG9wZXJhdGluZyBzeXN0ZW0uXG4gKlxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgZW52aXJvbm1lbnQgaXMgbWFjT1MsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIElzTWFjKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB3aW5kb3cuX3dhaWxzLmVudmlyb25tZW50Lk9TID09PSBcImRhcndpblwiO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgY3VycmVudCBlbnZpcm9ubWVudCBhcmNoaXRlY3R1cmUgaXMgQU1ENjQuXG4gKlxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgY3VycmVudCBlbnZpcm9ubWVudCBhcmNoaXRlY3R1cmUgaXMgQU1ENjQsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIElzQU1ENjQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHdpbmRvdy5fd2FpbHMuZW52aXJvbm1lbnQuQXJjaCA9PT0gXCJhbWQ2NFwiO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgY3VycmVudCBhcmNoaXRlY3R1cmUgaXMgQVJNLlxuICpcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGN1cnJlbnQgYXJjaGl0ZWN0dXJlIGlzIEFSTSwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSXNBUk0oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHdpbmRvdy5fd2FpbHMuZW52aXJvbm1lbnQuQXJjaCA9PT0gXCJhcm1cIjtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgaXMgQVJNNjQgYXJjaGl0ZWN0dXJlLlxuICpcbiAqIEByZXR1cm5zIFJldHVybnMgdHJ1ZSBpZiB0aGUgZW52aXJvbm1lbnQgaXMgQVJNNjQgYXJjaGl0ZWN0dXJlLCBvdGhlcndpc2UgcmV0dXJucyBmYWxzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIElzQVJNNjQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHdpbmRvdy5fd2FpbHMuZW52aXJvbm1lbnQuQXJjaCA9PT0gXCJhcm02NFwiO1xufVxuXG4vKipcbiAqIFJlcG9ydHMgd2hldGhlciB0aGUgYXBwIGlzIGJlaW5nIHJ1biBpbiBkZWJ1ZyBtb2RlLlxuICpcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGFwcCBpcyBiZWluZyBydW4gaW4gZGVidWcgbW9kZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIElzRGVidWcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEJvb2xlYW4od2luZG93Ll93YWlscy5lbnZpcm9ubWVudC5EZWJ1Zyk7XG59XG5cbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuaW1wb3J0IHsgbmV3UnVudGltZUNhbGxlciwgb2JqZWN0TmFtZXMgfSBmcm9tIFwiLi9ydW50aW1lLmpzXCI7XG5pbXBvcnQgeyBJc0RlYnVnIH0gZnJvbSBcIi4vc3lzdGVtLmpzXCI7XG5pbXBvcnQgeyBldmVudFRhcmdldCB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbi8vIHNldHVwXG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCBjb250ZXh0TWVudUhhbmRsZXIpO1xuXG5jb25zdCBjYWxsID0gbmV3UnVudGltZUNhbGxlcihvYmplY3ROYW1lcy5Db250ZXh0TWVudSk7XG5cbmNvbnN0IENvbnRleHRNZW51T3BlbiA9IDA7XG5cbmZ1bmN0aW9uIG9wZW5Db250ZXh0TWVudShpZDogc3RyaW5nLCB4OiBudW1iZXIsIHk6IG51bWJlciwgZGF0YTogYW55KTogdm9pZCB7XG4gICAgdm9pZCBjYWxsKENvbnRleHRNZW51T3Blbiwge2lkLCB4LCB5LCBkYXRhfSk7XG59XG5cbmZ1bmN0aW9uIGNvbnRleHRNZW51SGFuZGxlcihldmVudDogTW91c2VFdmVudCkge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50VGFyZ2V0KGV2ZW50KTtcblxuICAgIC8vIENoZWNrIGZvciBjdXN0b20gY29udGV4dCBtZW51XG4gICAgY29uc3QgY3VzdG9tQ29udGV4dE1lbnUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXQpLmdldFByb3BlcnR5VmFsdWUoXCItLWN1c3RvbS1jb250ZXh0bWVudVwiKS50cmltKCk7XG5cbiAgICBpZiAoY3VzdG9tQ29udGV4dE1lbnUpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRhcmdldCkuZ2V0UHJvcGVydHlWYWx1ZShcIi0tY3VzdG9tLWNvbnRleHRtZW51LWRhdGFcIik7XG4gICAgICAgIG9wZW5Db250ZXh0TWVudShjdXN0b21Db250ZXh0TWVudSwgZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSwgZGF0YSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcHJvY2Vzc0RlZmF1bHRDb250ZXh0TWVudShldmVudCwgdGFyZ2V0KTtcbiAgICB9XG59XG5cblxuLypcbi0tZGVmYXVsdC1jb250ZXh0bWVudTogYXV0bzsgKGRlZmF1bHQpIHdpbGwgc2hvdyB0aGUgZGVmYXVsdCBjb250ZXh0IG1lbnUgaWYgY29udGVudEVkaXRhYmxlIGlzIHRydWUgT1IgdGV4dCBoYXMgYmVlbiBzZWxlY3RlZCBPUiBlbGVtZW50IGlzIGlucHV0IG9yIHRleHRhcmVhXG4tLWRlZmF1bHQtY29udGV4dG1lbnU6IHNob3c7IHdpbGwgYWx3YXlzIHNob3cgdGhlIGRlZmF1bHQgY29udGV4dCBtZW51XG4tLWRlZmF1bHQtY29udGV4dG1lbnU6IGhpZGU7IHdpbGwgYWx3YXlzIGhpZGUgdGhlIGRlZmF1bHQgY29udGV4dCBtZW51XG5cblRoaXMgcnVsZSBpcyBpbmhlcml0ZWQgbGlrZSBub3JtYWwgQ1NTIHJ1bGVzLCBzbyBuZXN0aW5nIHdvcmtzIGFzIGV4cGVjdGVkXG4qL1xuZnVuY3Rpb24gcHJvY2Vzc0RlZmF1bHRDb250ZXh0TWVudShldmVudDogTW91c2VFdmVudCwgdGFyZ2V0OiBIVE1MRWxlbWVudCkge1xuICAgIC8vIERlYnVnIGJ1aWxkcyBhbHdheXMgc2hvdyB0aGUgbWVudVxuICAgIGlmIChJc0RlYnVnKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFByb2Nlc3MgZGVmYXVsdCBjb250ZXh0IG1lbnVcbiAgICBzd2l0Y2ggKHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRhcmdldCkuZ2V0UHJvcGVydHlWYWx1ZShcIi0tZGVmYXVsdC1jb250ZXh0bWVudVwiKS50cmltKCkpIHtcbiAgICAgICAgY2FzZSAnc2hvdyc6XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgJ2hpZGUnOlxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBjb250ZW50RWRpdGFibGUgaXMgdHJ1ZVxuICAgIGlmICh0YXJnZXQuaXNDb250ZW50RWRpdGFibGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHRleHQgaGFzIGJlZW4gc2VsZWN0ZWRcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgY29uc3QgaGFzU2VsZWN0aW9uID0gc2VsZWN0aW9uICYmIHNlbGVjdGlvbi50b1N0cmluZygpLmxlbmd0aCA+IDA7XG4gICAgaWYgKGhhc1NlbGVjdGlvbikge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlbGVjdGlvbi5yYW5nZUNvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoaSk7XG4gICAgICAgICAgICBjb25zdCByZWN0cyA9IHJhbmdlLmdldENsaWVudFJlY3RzKCk7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJlY3RzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVjdCA9IHJlY3RzW2pdO1xuICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KHJlY3QubGVmdCwgcmVjdC50b3ApID09PSB0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHRhZyBpcyBpbnB1dCBvciB0ZXh0YXJlYS5cbiAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCB8fCB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MVGV4dEFyZWFFbGVtZW50KSB7XG4gICAgICAgIGlmIChoYXNTZWxlY3Rpb24gfHwgKCF0YXJnZXQucmVhZE9ubHkgJiYgIXRhcmdldC5kaXNhYmxlZCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGhpZGUgZGVmYXVsdCBjb250ZXh0IG1lbnVcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IGZyb20gdGhlIGZsYWcgbWFwLlxuICpcbiAqIEBwYXJhbSBrZXkgLSBUaGUga2V5IHRvIHJldHJpZXZlIHRoZSB2YWx1ZSBmb3IuXG4gKiBAcmV0dXJuIFRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBrZXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBHZXRGbGFnKGtleTogc3RyaW5nKTogYW55IHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gd2luZG93Ll93YWlscy5mbGFnc1trZXldO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5hYmxlIHRvIHJldHJpZXZlIGZsYWcgJ1wiICsga2V5ICsgXCInOiBcIiArIGUsIHsgY2F1c2U6IGUgfSk7XG4gICAgfVxufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5pbXBvcnQgeyBpbnZva2UsIElzV2luZG93cyB9IGZyb20gXCIuL3N5c3RlbS5qc1wiO1xuaW1wb3J0IHsgR2V0RmxhZyB9IGZyb20gXCIuL2ZsYWdzLmpzXCI7XG5pbXBvcnQgeyBjYW5UcmFja0J1dHRvbnMsIGV2ZW50VGFyZ2V0IH0gZnJvbSBcIi4vdXRpbHMuanNcIjtcblxuLy8gU2V0dXBcbmxldCBjYW5EcmFnID0gZmFsc2U7XG5sZXQgZHJhZ2dpbmcgPSBmYWxzZTtcblxubGV0IHJlc2l6YWJsZSA9IGZhbHNlO1xubGV0IGNhblJlc2l6ZSA9IGZhbHNlO1xubGV0IHJlc2l6aW5nID0gZmFsc2U7XG5sZXQgcmVzaXplRWRnZTogc3RyaW5nID0gXCJcIjtcbmxldCBkZWZhdWx0Q3Vyc29yID0gXCJhdXRvXCI7XG5cbmxldCBidXR0b25zID0gMDtcbmNvbnN0IGJ1dHRvbnNUcmFja2VkID0gY2FuVHJhY2tCdXR0b25zKCk7XG5cbndpbmRvdy5fd2FpbHMgPSB3aW5kb3cuX3dhaWxzIHx8IHt9O1xud2luZG93Ll93YWlscy5zZXRSZXNpemFibGUgPSAodmFsdWU6IGJvb2xlYW4pOiB2b2lkID0+IHtcbiAgICByZXNpemFibGUgPSB2YWx1ZTtcbiAgICBpZiAoIXJlc2l6YWJsZSkge1xuICAgICAgICAvLyBTdG9wIHJlc2l6aW5nIGlmIGluIHByb2dyZXNzLlxuICAgICAgICBjYW5SZXNpemUgPSByZXNpemluZyA9IGZhbHNlO1xuICAgICAgICBzZXRSZXNpemUoKTtcbiAgICB9XG59O1xuXG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdXBkYXRlLCB7IGNhcHR1cmU6IHRydWUgfSk7XG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdXBkYXRlLCB7IGNhcHR1cmU6IHRydWUgfSk7XG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHVwZGF0ZSwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuZm9yIChjb25zdCBldiBvZiBbJ2NsaWNrJywgJ2NvbnRleHRtZW51JywgJ2RibGNsaWNrJ10pIHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihldiwgc3VwcHJlc3NFdmVudCwgeyBjYXB0dXJlOiB0cnVlIH0pO1xufVxuXG5mdW5jdGlvbiBzdXBwcmVzc0V2ZW50KGV2ZW50OiBFdmVudCkge1xuICAgIC8vIFN1cHByZXNzIGNsaWNrIGV2ZW50cyB3aGlsZSByZXNpemluZyBvciBkcmFnZ2luZy5cbiAgICBpZiAoZHJhZ2dpbmcgfHwgcmVzaXppbmcpIHtcbiAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbn1cblxuLy8gVXNlIGNvbnN0YW50cyB0byBhdm9pZCBjb21wYXJpbmcgc3RyaW5ncyBtdWx0aXBsZSB0aW1lcy5cbmNvbnN0IE1vdXNlRG93biA9IDA7XG5jb25zdCBNb3VzZVVwICAgPSAxO1xuY29uc3QgTW91c2VNb3ZlID0gMjtcblxuZnVuY3Rpb24gdXBkYXRlKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgLy8gV2luZG93cyBzdXBwcmVzc2VzIG1vdXNlIGV2ZW50cyBhdCB0aGUgZW5kIG9mIGRyYWdnaW5nIG9yIHJlc2l6aW5nLFxuICAgIC8vIHNvIHdlIG5lZWQgdG8gYmUgc21hcnQgYW5kIHN5bnRoZXNpemUgYnV0dG9uIGV2ZW50cy5cblxuICAgIGxldCBldmVudFR5cGU6IG51bWJlciwgZXZlbnRCdXR0b25zID0gZXZlbnQuYnV0dG9ucztcbiAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHtcbiAgICAgICAgY2FzZSAnbW91c2Vkb3duJzpcbiAgICAgICAgICAgIGV2ZW50VHlwZSA9IE1vdXNlRG93bjtcbiAgICAgICAgICAgIGlmICghYnV0dG9uc1RyYWNrZWQpIHsgZXZlbnRCdXR0b25zID0gYnV0dG9ucyB8ICgxIDw8IGV2ZW50LmJ1dHRvbik7IH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdtb3VzZXVwJzpcbiAgICAgICAgICAgIGV2ZW50VHlwZSA9IE1vdXNlVXA7XG4gICAgICAgICAgICBpZiAoIWJ1dHRvbnNUcmFja2VkKSB7IGV2ZW50QnV0dG9ucyA9IGJ1dHRvbnMgJiB+KDEgPDwgZXZlbnQuYnV0dG9uKTsgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBldmVudFR5cGUgPSBNb3VzZU1vdmU7XG4gICAgICAgICAgICBpZiAoIWJ1dHRvbnNUcmFja2VkKSB7IGV2ZW50QnV0dG9ucyA9IGJ1dHRvbnM7IH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGxldCByZWxlYXNlZCA9IGJ1dHRvbnMgJiB+ZXZlbnRCdXR0b25zO1xuICAgIGxldCBwcmVzc2VkID0gZXZlbnRCdXR0b25zICYgfmJ1dHRvbnM7XG5cbiAgICBidXR0b25zID0gZXZlbnRCdXR0b25zO1xuXG4gICAgLy8gU3ludGhlc2l6ZSBhIHJlbGVhc2UtcHJlc3Mgc2VxdWVuY2UgaWYgd2UgZGV0ZWN0IGEgcHJlc3Mgb2YgYW4gYWxyZWFkeSBwcmVzc2VkIGJ1dHRvbi5cbiAgICBpZiAoZXZlbnRUeXBlID09PSBNb3VzZURvd24gJiYgIShwcmVzc2VkICYgZXZlbnQuYnV0dG9uKSkge1xuICAgICAgICByZWxlYXNlZCB8PSAoMSA8PCBldmVudC5idXR0b24pO1xuICAgICAgICBwcmVzc2VkIHw9ICgxIDw8IGV2ZW50LmJ1dHRvbik7XG4gICAgfVxuXG4gICAgLy8gU3VwcHJlc3MgYWxsIGJ1dHRvbiBldmVudHMgZHVyaW5nIGRyYWdnaW5nIGFuZCByZXNpemluZyxcbiAgICAvLyB1bmxlc3MgdGhpcyBpcyBhIG1vdXNldXAgZXZlbnQgdGhhdCBpcyBlbmRpbmcgYSBkcmFnIGFjdGlvbi5cbiAgICBpZiAoXG4gICAgICAgIGV2ZW50VHlwZSAhPT0gTW91c2VNb3ZlIC8vIEZhc3QgcGF0aCBmb3IgbW91c2Vtb3ZlXG4gICAgICAgICYmIHJlc2l6aW5nXG4gICAgICAgIHx8IChcbiAgICAgICAgICAgIGRyYWdnaW5nXG4gICAgICAgICAgICAmJiAoXG4gICAgICAgICAgICAgICAgZXZlbnRUeXBlID09PSBNb3VzZURvd25cbiAgICAgICAgICAgICAgICB8fCBldmVudC5idXR0b24gIT09IDBcbiAgICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICkge1xuICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHJlbGVhc2VzXG4gICAgaWYgKHJlbGVhc2VkICYgMSkgeyBwcmltYXJ5VXAoZXZlbnQpOyB9XG4gICAgLy8gSGFuZGxlIHByZXNzZXNcbiAgICBpZiAocHJlc3NlZCAmIDEpIHsgcHJpbWFyeURvd24oZXZlbnQpOyB9XG5cbiAgICAvLyBIYW5kbGUgbW91c2Vtb3ZlXG4gICAgaWYgKGV2ZW50VHlwZSA9PT0gTW91c2VNb3ZlKSB7IG9uTW91c2VNb3ZlKGV2ZW50KTsgfTtcbn1cblxuZnVuY3Rpb24gcHJpbWFyeURvd24oZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBSZXNldCByZWFkaW5lc3Mgc3RhdGUuXG4gICAgY2FuRHJhZyA9IGZhbHNlO1xuICAgIGNhblJlc2l6ZSA9IGZhbHNlO1xuXG4gICAgLy8gSWdub3JlIHJlcGVhdGVkIGNsaWNrcyBvbiBtYWNPUyBhbmQgTGludXguXG4gICAgaWYgKCFJc1dpbmRvd3MoKSkge1xuICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ21vdXNlZG93bicgJiYgZXZlbnQuYnV0dG9uID09PSAwICYmIGV2ZW50LmRldGFpbCAhPT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJlc2l6ZUVkZ2UpIHtcbiAgICAgICAgLy8gUmVhZHkgdG8gcmVzaXplIGlmIHRoZSBwcmltYXJ5IGJ1dHRvbiB3YXMgcHJlc3NlZCBmb3IgdGhlIGZpcnN0IHRpbWUuXG4gICAgICAgIGNhblJlc2l6ZSA9IHRydWU7XG4gICAgICAgIC8vIERvIG5vdCBzdGFydCBkcmFnIG9wZXJhdGlvbnMgd2hlbiBvbiByZXNpemUgZWRnZXMuXG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBSZXRyaWV2ZSB0YXJnZXQgZWxlbWVudFxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50VGFyZ2V0KGV2ZW50KTtcblxuICAgIC8vIFJlYWR5IHRvIGRyYWcgaWYgdGhlIHByaW1hcnkgYnV0dG9uIHdhcyBwcmVzc2VkIGZvciB0aGUgZmlyc3QgdGltZSBvbiBhIGRyYWdnYWJsZSBlbGVtZW50LlxuICAgIC8vIElnbm9yZSBjbGlja3Mgb24gdGhlIHNjcm9sbGJhci5cbiAgICBjb25zdCBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRhcmdldCk7XG4gICAgY2FuRHJhZyA9IChcbiAgICAgICAgc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShcIi0td2FpbHMtZHJhZ2dhYmxlXCIpLnRyaW0oKSA9PT0gXCJkcmFnXCJcbiAgICAgICAgJiYgKFxuICAgICAgICAgICAgZXZlbnQub2Zmc2V0WCAtIHBhcnNlRmxvYXQoc3R5bGUucGFkZGluZ0xlZnQpIDwgdGFyZ2V0LmNsaWVudFdpZHRoXG4gICAgICAgICAgICAmJiBldmVudC5vZmZzZXRZIC0gcGFyc2VGbG9hdChzdHlsZS5wYWRkaW5nVG9wKSA8IHRhcmdldC5jbGllbnRIZWlnaHRcbiAgICAgICAgKVxuICAgICk7XG59XG5cbmZ1bmN0aW9uIHByaW1hcnlVcChldmVudDogTW91c2VFdmVudCkge1xuICAgIC8vIFN0b3AgZHJhZ2dpbmcgYW5kIHJlc2l6aW5nLlxuICAgIGNhbkRyYWcgPSBmYWxzZTtcbiAgICBkcmFnZ2luZyA9IGZhbHNlO1xuICAgIGNhblJlc2l6ZSA9IGZhbHNlO1xuICAgIHJlc2l6aW5nID0gZmFsc2U7XG59XG5cbmNvbnN0IGN1cnNvckZvckVkZ2UgPSBPYmplY3QuZnJlZXplKHtcbiAgICBcInNlLXJlc2l6ZVwiOiBcIm53c2UtcmVzaXplXCIsXG4gICAgXCJzdy1yZXNpemVcIjogXCJuZXN3LXJlc2l6ZVwiLFxuICAgIFwibnctcmVzaXplXCI6IFwibndzZS1yZXNpemVcIixcbiAgICBcIm5lLXJlc2l6ZVwiOiBcIm5lc3ctcmVzaXplXCIsXG4gICAgXCJ3LXJlc2l6ZVwiOiBcImV3LXJlc2l6ZVwiLFxuICAgIFwibi1yZXNpemVcIjogXCJucy1yZXNpemVcIixcbiAgICBcInMtcmVzaXplXCI6IFwibnMtcmVzaXplXCIsXG4gICAgXCJlLXJlc2l6ZVwiOiBcImV3LXJlc2l6ZVwiLFxufSlcblxuZnVuY3Rpb24gc2V0UmVzaXplKGVkZ2U/OiBrZXlvZiB0eXBlb2YgY3Vyc29yRm9yRWRnZSk6IHZvaWQge1xuICAgIGlmIChlZGdlKSB7XG4gICAgICAgIGlmICghcmVzaXplRWRnZSkgeyBkZWZhdWx0Q3Vyc29yID0gZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3I7IH1cbiAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3IgPSBjdXJzb3JGb3JFZGdlW2VkZ2VdO1xuICAgIH0gZWxzZSBpZiAoIWVkZ2UgJiYgcmVzaXplRWRnZSkge1xuICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLmN1cnNvciA9IGRlZmF1bHRDdXJzb3I7XG4gICAgfVxuXG4gICAgcmVzaXplRWRnZSA9IGVkZ2UgfHwgXCJcIjtcbn1cblxuZnVuY3Rpb24gb25Nb3VzZU1vdmUoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoY2FuUmVzaXplICYmIHJlc2l6ZUVkZ2UpIHtcbiAgICAgICAgLy8gU3RhcnQgcmVzaXppbmcuXG4gICAgICAgIHJlc2l6aW5nID0gdHJ1ZTtcbiAgICAgICAgaW52b2tlKFwid2FpbHM6cmVzaXplOlwiICsgcmVzaXplRWRnZSk7XG4gICAgfSBlbHNlIGlmIChjYW5EcmFnKSB7XG4gICAgICAgIC8vIFN0YXJ0IGRyYWdnaW5nLlxuICAgICAgICBkcmFnZ2luZyA9IHRydWU7XG4gICAgICAgIGludm9rZShcIndhaWxzOmRyYWdcIik7XG4gICAgfVxuXG4gICAgaWYgKGRyYWdnaW5nIHx8IHJlc2l6aW5nKSB7XG4gICAgICAgIC8vIEVpdGhlciBkcmFnIG9yIHJlc2l6ZSBpcyBvbmdvaW5nLFxuICAgICAgICAvLyByZXNldCByZWFkaW5lc3MgYW5kIHN0b3AgcHJvY2Vzc2luZy5cbiAgICAgICAgY2FuRHJhZyA9IGNhblJlc2l6ZSA9IGZhbHNlO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFyZXNpemFibGUgfHwgIUlzV2luZG93cygpKSB7XG4gICAgICAgIGlmIChyZXNpemVFZGdlKSB7IHNldFJlc2l6ZSgpOyB9XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZXNpemVIYW5kbGVIZWlnaHQgPSBHZXRGbGFnKFwic3lzdGVtLnJlc2l6ZUhhbmRsZUhlaWdodFwiKSB8fCA1O1xuICAgIGNvbnN0IHJlc2l6ZUhhbmRsZVdpZHRoID0gR2V0RmxhZyhcInN5c3RlbS5yZXNpemVIYW5kbGVXaWR0aFwiKSB8fCA1O1xuXG4gICAgLy8gRXh0cmEgcGl4ZWxzIGZvciB0aGUgY29ybmVyIGFyZWFzLlxuICAgIGNvbnN0IGNvcm5lckV4dHJhID0gR2V0RmxhZyhcInJlc2l6ZUNvcm5lckV4dHJhXCIpIHx8IDEwO1xuXG4gICAgY29uc3QgcmlnaHRCb3JkZXIgPSAod2luZG93Lm91dGVyV2lkdGggLSBldmVudC5jbGllbnRYKSA8IHJlc2l6ZUhhbmRsZVdpZHRoO1xuICAgIGNvbnN0IGxlZnRCb3JkZXIgPSBldmVudC5jbGllbnRYIDwgcmVzaXplSGFuZGxlV2lkdGg7XG4gICAgY29uc3QgdG9wQm9yZGVyID0gZXZlbnQuY2xpZW50WSA8IHJlc2l6ZUhhbmRsZUhlaWdodDtcbiAgICBjb25zdCBib3R0b21Cb3JkZXIgPSAod2luZG93Lm91dGVySGVpZ2h0IC0gZXZlbnQuY2xpZW50WSkgPCByZXNpemVIYW5kbGVIZWlnaHQ7XG5cbiAgICAvLyBBZGp1c3QgZm9yIGNvcm5lciBhcmVhcy5cbiAgICBjb25zdCByaWdodENvcm5lciA9ICh3aW5kb3cub3V0ZXJXaWR0aCAtIGV2ZW50LmNsaWVudFgpIDwgKHJlc2l6ZUhhbmRsZVdpZHRoICsgY29ybmVyRXh0cmEpO1xuICAgIGNvbnN0IGxlZnRDb3JuZXIgPSBldmVudC5jbGllbnRYIDwgKHJlc2l6ZUhhbmRsZVdpZHRoICsgY29ybmVyRXh0cmEpO1xuICAgIGNvbnN0IHRvcENvcm5lciA9IGV2ZW50LmNsaWVudFkgPCAocmVzaXplSGFuZGxlSGVpZ2h0ICsgY29ybmVyRXh0cmEpO1xuICAgIGNvbnN0IGJvdHRvbUNvcm5lciA9ICh3aW5kb3cub3V0ZXJIZWlnaHQgLSBldmVudC5jbGllbnRZKSA8IChyZXNpemVIYW5kbGVIZWlnaHQgKyBjb3JuZXJFeHRyYSk7XG5cbiAgICBpZiAoIWxlZnRDb3JuZXIgJiYgIXRvcENvcm5lciAmJiAhYm90dG9tQ29ybmVyICYmICFyaWdodENvcm5lcikge1xuICAgICAgICAvLyBPcHRpbWlzYXRpb246IG91dCBvZiBhbGwgY29ybmVyIGFyZWFzIGltcGxpZXMgb3V0IG9mIGJvcmRlcnMuXG4gICAgICAgIHNldFJlc2l6ZSgpO1xuICAgIH1cbiAgICAvLyBEZXRlY3QgY29ybmVycy5cbiAgICBlbHNlIGlmIChyaWdodENvcm5lciAmJiBib3R0b21Db3JuZXIpIHNldFJlc2l6ZShcInNlLXJlc2l6ZVwiKTtcbiAgICBlbHNlIGlmIChsZWZ0Q29ybmVyICYmIGJvdHRvbUNvcm5lcikgc2V0UmVzaXplKFwic3ctcmVzaXplXCIpO1xuICAgIGVsc2UgaWYgKGxlZnRDb3JuZXIgJiYgdG9wQ29ybmVyKSBzZXRSZXNpemUoXCJudy1yZXNpemVcIik7XG4gICAgZWxzZSBpZiAodG9wQ29ybmVyICYmIHJpZ2h0Q29ybmVyKSBzZXRSZXNpemUoXCJuZS1yZXNpemVcIik7XG4gICAgLy8gRGV0ZWN0IGJvcmRlcnMuXG4gICAgZWxzZSBpZiAobGVmdEJvcmRlcikgc2V0UmVzaXplKFwidy1yZXNpemVcIik7XG4gICAgZWxzZSBpZiAodG9wQm9yZGVyKSBzZXRSZXNpemUoXCJuLXJlc2l6ZVwiKTtcbiAgICBlbHNlIGlmIChib3R0b21Cb3JkZXIpIHNldFJlc2l6ZShcInMtcmVzaXplXCIpO1xuICAgIGVsc2UgaWYgKHJpZ2h0Qm9yZGVyKSBzZXRSZXNpemUoXCJlLXJlc2l6ZVwiKTtcbiAgICAvLyBPdXQgb2YgYm9yZGVyIGFyZWEuXG4gICAgZWxzZSBzZXRSZXNpemUoKTtcbn1cbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuaW1wb3J0IHsgbmV3UnVudGltZUNhbGxlciwgb2JqZWN0TmFtZXMgfSBmcm9tIFwiLi9ydW50aW1lLmpzXCI7XG5jb25zdCBjYWxsID0gbmV3UnVudGltZUNhbGxlcihvYmplY3ROYW1lcy5BcHBsaWNhdGlvbik7XG5cbmNvbnN0IEhpZGVNZXRob2QgPSAwO1xuY29uc3QgU2hvd01ldGhvZCA9IDE7XG5jb25zdCBRdWl0TWV0aG9kID0gMjtcblxuLyoqXG4gKiBIaWRlcyBhIGNlcnRhaW4gbWV0aG9kIGJ5IGNhbGxpbmcgdGhlIEhpZGVNZXRob2QgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBIaWRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBjYWxsKEhpZGVNZXRob2QpO1xufVxuXG4vKipcbiAqIENhbGxzIHRoZSBTaG93TWV0aG9kIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBTaG93KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBjYWxsKFNob3dNZXRob2QpO1xufVxuXG4vKipcbiAqIENhbGxzIHRoZSBRdWl0TWV0aG9kIHRvIHRlcm1pbmF0ZSB0aGUgcHJvZ3JhbS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFF1aXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIGNhbGwoUXVpdE1ldGhvZCk7XG59XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbmltcG9ydCB7IENhbmNlbGxhYmxlUHJvbWlzZSwgdHlwZSBDYW5jZWxsYWJsZVByb21pc2VXaXRoUmVzb2x2ZXJzIH0gZnJvbSBcIi4vY2FuY2VsbGFibGUuanNcIjtcbmltcG9ydCB7IG5ld1J1bnRpbWVDYWxsZXIsIG9iamVjdE5hbWVzIH0gZnJvbSBcIi4vcnVudGltZS5qc1wiO1xuaW1wb3J0IHsgbmFub2lkIH0gZnJvbSBcIi4vbmFub2lkLmpzXCI7XG5cbi8vIFNldHVwXG53aW5kb3cuX3dhaWxzID0gd2luZG93Ll93YWlscyB8fCB7fTtcbndpbmRvdy5fd2FpbHMuY2FsbFJlc3VsdEhhbmRsZXIgPSByZXN1bHRIYW5kbGVyO1xud2luZG93Ll93YWlscy5jYWxsRXJyb3JIYW5kbGVyID0gZXJyb3JIYW5kbGVyO1xuXG50eXBlIFByb21pc2VSZXNvbHZlcnMgPSBPbWl0PENhbmNlbGxhYmxlUHJvbWlzZVdpdGhSZXNvbHZlcnM8YW55PiwgXCJwcm9taXNlXCIgfCBcIm9uY2FuY2VsbGVkXCI+XG5cbmNvbnN0IGNhbGwgPSBuZXdSdW50aW1lQ2FsbGVyKG9iamVjdE5hbWVzLkNhbGwpO1xuY29uc3QgY2FuY2VsQ2FsbCA9IG5ld1J1bnRpbWVDYWxsZXIob2JqZWN0TmFtZXMuQ2FuY2VsQ2FsbCk7XG5jb25zdCBjYWxsUmVzcG9uc2VzID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2VSZXNvbHZlcnM+KCk7XG5cbmNvbnN0IENhbGxCaW5kaW5nID0gMDtcbmNvbnN0IENhbmNlbE1ldGhvZCA9IDBcblxuLyoqXG4gKiBIb2xkcyBhbGwgcmVxdWlyZWQgaW5mb3JtYXRpb24gZm9yIGEgYmluZGluZyBjYWxsLlxuICogTWF5IHByb3ZpZGUgZWl0aGVyIGEgbWV0aG9kIElEIG9yIGEgbWV0aG9kIG5hbWUsIGJ1dCBub3QgYm90aC5cbiAqL1xuZXhwb3J0IHR5cGUgQ2FsbE9wdGlvbnMgPSB7XG4gICAgLyoqIFRoZSBudW1lcmljIElEIG9mIHRoZSBib3VuZCBtZXRob2QgdG8gY2FsbC4gKi9cbiAgICBtZXRob2RJRDogbnVtYmVyO1xuICAgIC8qKiBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGJvdW5kIG1ldGhvZCB0byBjYWxsLiAqL1xuICAgIG1ldGhvZE5hbWU/OiBuZXZlcjtcbiAgICAvKiogQXJndW1lbnRzIHRvIGJlIHBhc3NlZCBpbnRvIHRoZSBib3VuZCBtZXRob2QuICovXG4gICAgYXJnczogYW55W107XG59IHwge1xuICAgIC8qKiBUaGUgbnVtZXJpYyBJRCBvZiB0aGUgYm91bmQgbWV0aG9kIHRvIGNhbGwuICovXG4gICAgbWV0aG9kSUQ/OiBuZXZlcjtcbiAgICAvKiogVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBib3VuZCBtZXRob2QgdG8gY2FsbC4gKi9cbiAgICBtZXRob2ROYW1lOiBzdHJpbmc7XG4gICAgLyoqIEFyZ3VtZW50cyB0byBiZSBwYXNzZWQgaW50byB0aGUgYm91bmQgbWV0aG9kLiAqL1xuICAgIGFyZ3M6IGFueVtdO1xufTtcblxuLyoqXG4gKiBFeGNlcHRpb24gY2xhc3MgdGhhdCB3aWxsIGJlIHRocm93biBpbiBjYXNlIHRoZSBib3VuZCBtZXRob2QgcmV0dXJucyBhbiBlcnJvci5cbiAqIFRoZSB2YWx1ZSBvZiB0aGUge0BsaW5rIFJ1bnRpbWVFcnJvciNuYW1lfSBwcm9wZXJ0eSBpcyBcIlJ1bnRpbWVFcnJvclwiLlxuICovXG5leHBvcnQgY2xhc3MgUnVudGltZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgYSBuZXcgUnVudGltZUVycm9yIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSBtZXNzYWdlIC0gVGhlIGVycm9yIG1lc3NhZ2UuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIGJlIGZvcndhcmRlZCB0byB0aGUgRXJyb3IgY29uc3RydWN0b3IuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobWVzc2FnZT86IHN0cmluZywgb3B0aW9ucz86IEVycm9yT3B0aW9ucykge1xuICAgICAgICBzdXBlcihtZXNzYWdlLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5uYW1lID0gXCJSdW50aW1lRXJyb3JcIjtcbiAgICB9XG59XG5cbi8qKlxuICogSGFuZGxlcyB0aGUgcmVzdWx0IG9mIGEgY2FsbCByZXF1ZXN0LlxuICpcbiAqIEBwYXJhbSBpZCAtIFRoZSBpZCBvZiB0aGUgcmVxdWVzdCB0byBoYW5kbGUgdGhlIHJlc3VsdCBmb3IuXG4gKiBAcGFyYW0gZGF0YSAtIFRoZSByZXN1bHQgZGF0YSBvZiB0aGUgcmVxdWVzdC5cbiAqIEBwYXJhbSBpc0pTT04gLSBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZGF0YSBpcyBKU09OIG9yIG5vdC5cbiAqL1xuZnVuY3Rpb24gcmVzdWx0SGFuZGxlcihpZDogc3RyaW5nLCBkYXRhOiBzdHJpbmcsIGlzSlNPTjogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IHJlc29sdmVycyA9IGdldEFuZERlbGV0ZVJlc3BvbnNlKGlkKTtcbiAgICBpZiAoIXJlc29sdmVycykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICAgIHJlc29sdmVycy5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgfSBlbHNlIGlmICghaXNKU09OKSB7XG4gICAgICAgIHJlc29sdmVycy5yZXNvbHZlKGRhdGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXNvbHZlcnMucmVzb2x2ZShKU09OLnBhcnNlKGRhdGEpKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgICAgIHJlc29sdmVycy5yZWplY3QobmV3IFR5cGVFcnJvcihcImNvdWxkIG5vdCBwYXJzZSByZXN1bHQ6IFwiICsgZXJyLm1lc3NhZ2UsIHsgY2F1c2U6IGVyciB9KSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogSGFuZGxlcyB0aGUgZXJyb3IgZnJvbSBhIGNhbGwgcmVxdWVzdC5cbiAqXG4gKiBAcGFyYW0gaWQgLSBUaGUgaWQgb2YgdGhlIHByb21pc2UgaGFuZGxlci5cbiAqIEBwYXJhbSBkYXRhIC0gVGhlIGVycm9yIGRhdGEgdG8gcmVqZWN0IHRoZSBwcm9taXNlIGhhbmRsZXIgd2l0aC5cbiAqIEBwYXJhbSBpc0pTT04gLSBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZGF0YSBpcyBKU09OIG9yIG5vdC5cbiAqL1xuZnVuY3Rpb24gZXJyb3JIYW5kbGVyKGlkOiBzdHJpbmcsIGRhdGE6IHN0cmluZywgaXNKU09OOiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgcmVzb2x2ZXJzID0gZ2V0QW5kRGVsZXRlUmVzcG9uc2UoaWQpO1xuICAgIGlmICghcmVzb2x2ZXJzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWlzSlNPTikge1xuICAgICAgICByZXNvbHZlcnMucmVqZWN0KG5ldyBFcnJvcihkYXRhKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IGVycm9yOiBhbnk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBlcnJvciA9IEpTT04ucGFyc2UoZGF0YSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgICAgICByZXNvbHZlcnMucmVqZWN0KG5ldyBUeXBlRXJyb3IoXCJjb3VsZCBub3QgcGFyc2UgZXJyb3I6IFwiICsgZXJyLm1lc3NhZ2UsIHsgY2F1c2U6IGVyciB9KSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgb3B0aW9uczogRXJyb3JPcHRpb25zID0ge307XG4gICAgICAgIGlmIChlcnJvci5jYXVzZSkge1xuICAgICAgICAgICAgb3B0aW9ucy5jYXVzZSA9IGVycm9yLmNhdXNlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGV4Y2VwdGlvbjtcbiAgICAgICAgc3dpdGNoIChlcnJvci5raW5kKSB7XG4gICAgICAgICAgICBjYXNlIFwiUmVmZXJlbmNlRXJyb3JcIjpcbiAgICAgICAgICAgICAgICBleGNlcHRpb24gPSBuZXcgUmVmZXJlbmNlRXJyb3IoZXJyb3IubWVzc2FnZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiVHlwZUVycm9yXCI6XG4gICAgICAgICAgICAgICAgZXhjZXB0aW9uID0gbmV3IFR5cGVFcnJvcihlcnJvci5tZXNzYWdlLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJSdW50aW1lRXJyb3JcIjpcbiAgICAgICAgICAgICAgICBleGNlcHRpb24gPSBuZXcgUnVudGltZUVycm9yKGVycm9yLm1lc3NhZ2UsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBleGNlcHRpb24gPSBuZXcgRXJyb3IoZXJyb3IubWVzc2FnZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICByZXNvbHZlcnMucmVqZWN0KGV4Y2VwdGlvbik7XG4gICAgfVxufVxuXG4vKipcbiAqIFJldHJpZXZlcyBhbmQgcmVtb3ZlcyB0aGUgcmVzcG9uc2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBJRCBmcm9tIHRoZSBjYWxsUmVzcG9uc2VzIG1hcC5cbiAqXG4gKiBAcGFyYW0gaWQgLSBUaGUgSUQgb2YgdGhlIHJlc3BvbnNlIHRvIGJlIHJldHJpZXZlZCBhbmQgcmVtb3ZlZC5cbiAqIEByZXR1cm5zIFRoZSByZXNwb25zZSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBJRCwgaWYgYW55LlxuICovXG5mdW5jdGlvbiBnZXRBbmREZWxldGVSZXNwb25zZShpZDogc3RyaW5nKTogUHJvbWlzZVJlc29sdmVycyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBjYWxsUmVzcG9uc2VzLmdldChpZCk7XG4gICAgY2FsbFJlc3BvbnNlcy5kZWxldGUoaWQpO1xuICAgIHJldHVybiByZXNwb25zZTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSB1bmlxdWUgSUQgdXNpbmcgdGhlIG5hbm9pZCBsaWJyYXJ5LlxuICpcbiAqIEByZXR1cm5zIEEgdW5pcXVlIElEIHRoYXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGNhbGxSZXNwb25zZXMgc2V0LlxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZUlEKCk6IHN0cmluZyB7XG4gICAgbGV0IHJlc3VsdDtcbiAgICBkbyB7XG4gICAgICAgIHJlc3VsdCA9IG5hbm9pZCgpO1xuICAgIH0gd2hpbGUgKGNhbGxSZXNwb25zZXMuaGFzKHJlc3VsdCkpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQ2FsbCBhIGJvdW5kIG1ldGhvZCBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIGNhbGwgb3B0aW9ucy5cbiAqXG4gKiBJbiBjYXNlIG9mIGZhaWx1cmUsIHRoZSByZXR1cm5lZCBwcm9taXNlIHdpbGwgcmVqZWN0IHdpdGggYW4gZXhjZXB0aW9uXG4gKiBhbW9uZyBSZWZlcmVuY2VFcnJvciAodW5rbm93biBtZXRob2QpLCBUeXBlRXJyb3IgKHdyb25nIGFyZ3VtZW50IGNvdW50IG9yIHR5cGUpLFxuICoge0BsaW5rIFJ1bnRpbWVFcnJvcn0gKG1ldGhvZCByZXR1cm5lZCBhbiBlcnJvciksIG9yIG90aGVyIChuZXR3b3JrIG9yIGludGVybmFsIGVycm9ycykuXG4gKiBUaGUgZXhjZXB0aW9uIG1pZ2h0IGhhdmUgYSBcImNhdXNlXCIgZmllbGQgd2l0aCB0aGUgdmFsdWUgcmV0dXJuZWRcbiAqIGJ5IHRoZSBhcHBsaWNhdGlvbi0gb3Igc2VydmljZS1sZXZlbCBlcnJvciBtYXJzaGFsaW5nIGZ1bmN0aW9ucy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEEgbWV0aG9kIGNhbGwgZGVzY3JpcHRvci5cbiAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgdGhlIGNhbGwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDYWxsKG9wdGlvbnM6IENhbGxPcHRpb25zKTogQ2FuY2VsbGFibGVQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IGlkID0gZ2VuZXJhdGVJRCgpO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gQ2FuY2VsbGFibGVQcm9taXNlLndpdGhSZXNvbHZlcnM8YW55PigpO1xuICAgIGNhbGxSZXNwb25zZXMuc2V0KGlkLCB7IHJlc29sdmU6IHJlc3VsdC5yZXNvbHZlLCByZWplY3Q6IHJlc3VsdC5yZWplY3QgfSk7XG5cbiAgICBjb25zdCByZXF1ZXN0ID0gY2FsbChDYWxsQmluZGluZywgT2JqZWN0LmFzc2lnbih7IFwiY2FsbC1pZFwiOiBpZCB9LCBvcHRpb25zKSk7XG4gICAgbGV0IHJ1bm5pbmcgPSBmYWxzZTtcblxuICAgIHJlcXVlc3QudGhlbigoKSA9PiB7XG4gICAgICAgIHJ1bm5pbmcgPSB0cnVlO1xuICAgIH0sIChlcnIpID0+IHtcbiAgICAgICAgY2FsbFJlc3BvbnNlcy5kZWxldGUoaWQpO1xuICAgICAgICByZXN1bHQucmVqZWN0KGVycik7XG4gICAgfSk7XG5cbiAgICBjb25zdCBjYW5jZWwgPSAoKSA9PiB7XG4gICAgICAgIGNhbGxSZXNwb25zZXMuZGVsZXRlKGlkKTtcbiAgICAgICAgcmV0dXJuIGNhbmNlbENhbGwoQ2FuY2VsTWV0aG9kLCB7XCJjYWxsLWlkXCI6IGlkfSkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIHdoaWxlIHJlcXVlc3RpbmcgYmluZGluZyBjYWxsIGNhbmNlbGxhdGlvbjpcIiwgZXJyKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJlc3VsdC5vbmNhbmNlbGxlZCA9ICgpID0+IHtcbiAgICAgICAgaWYgKHJ1bm5pbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBjYW5jZWwoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByZXF1ZXN0LnRoZW4oY2FuY2VsKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gcmVzdWx0LnByb21pc2U7XG59XG5cbi8qKlxuICogQ2FsbHMgYSBib3VuZCBtZXRob2QgYnkgbmFtZSB3aXRoIHRoZSBzcGVjaWZpZWQgYXJndW1lbnRzLlxuICogU2VlIHtAbGluayBDYWxsfSBmb3IgZGV0YWlscy5cbiAqXG4gKiBAcGFyYW0gbWV0aG9kTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBtZXRob2QgaW4gdGhlIGZvcm1hdCAncGFja2FnZS5zdHJ1Y3QubWV0aG9kJy5cbiAqIEBwYXJhbSBhcmdzIC0gVGhlIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBtZXRob2QuXG4gKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIHRoZSBtZXRob2QgY2FsbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEJ5TmFtZShtZXRob2ROYW1lOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogQ2FuY2VsbGFibGVQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBDYWxsKHsgbWV0aG9kTmFtZSwgYXJncyB9KTtcbn1cblxuLyoqXG4gKiBDYWxscyBhIG1ldGhvZCBieSBpdHMgbnVtZXJpYyBJRCB3aXRoIHRoZSBzcGVjaWZpZWQgYXJndW1lbnRzLlxuICogU2VlIHtAbGluayBDYWxsfSBmb3IgZGV0YWlscy5cbiAqXG4gKiBAcGFyYW0gbWV0aG9kSUQgLSBUaGUgSUQgb2YgdGhlIG1ldGhvZCB0byBjYWxsLlxuICogQHBhcmFtIGFyZ3MgLSBUaGUgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIG1ldGhvZC5cbiAqIEByZXR1cm4gVGhlIHJlc3VsdCBvZiB0aGUgbWV0aG9kIGNhbGwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBCeUlEKG1ldGhvZElEOiBudW1iZXIsIC4uLmFyZ3M6IGFueVtdKTogQ2FuY2VsbGFibGVQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBDYWxsKHsgbWV0aG9kSUQsIGFyZ3MgfSk7XG59XG4iLCAiLy8gU291cmNlOiBodHRwczovL2dpdGh1Yi5jb20vaW5zcGVjdC1qcy9pcy1jYWxsYWJsZVxuXG4vLyBUaGUgTUlUIExpY2Vuc2UgKE1JVClcbi8vXG4vLyBDb3B5cmlnaHQgKGMpIDIwMTUgSm9yZGFuIEhhcmJhbmRcbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4vLyBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbi8vIFNPRlRXQVJFLlxuXG52YXIgZm5Ub1N0ciA9IEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZztcbnZhciByZWZsZWN0QXBwbHk6IHR5cGVvZiBSZWZsZWN0LmFwcGx5IHwgZmFsc2UgfCBudWxsID0gdHlwZW9mIFJlZmxlY3QgPT09ICdvYmplY3QnICYmIFJlZmxlY3QgIT09IG51bGwgJiYgUmVmbGVjdC5hcHBseTtcbnZhciBiYWRBcnJheUxpa2U6IGFueTtcbnZhciBpc0NhbGxhYmxlTWFya2VyOiBhbnk7XG5pZiAodHlwZW9mIHJlZmxlY3RBcHBseSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgT2JqZWN0LmRlZmluZVByb3BlcnR5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgYmFkQXJyYXlMaWtlID0gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAnbGVuZ3RoJywge1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgaXNDYWxsYWJsZU1hcmtlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlzQ2FsbGFibGVNYXJrZXIgPSB7fTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXRocm93LWxpdGVyYWxcbiAgICAgICAgcmVmbGVjdEFwcGx5KGZ1bmN0aW9uICgpIHsgdGhyb3cgNDI7IH0sIG51bGwsIGJhZEFycmF5TGlrZSk7XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgICBpZiAoXyAhPT0gaXNDYWxsYWJsZU1hcmtlcikge1xuICAgICAgICAgICAgcmVmbGVjdEFwcGx5ID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn0gZWxzZSB7XG4gICAgcmVmbGVjdEFwcGx5ID0gbnVsbDtcbn1cblxudmFyIGNvbnN0cnVjdG9yUmVnZXggPSAvXlxccypjbGFzc1xcYi87XG52YXIgaXNFUzZDbGFzc0ZuID0gZnVuY3Rpb24gaXNFUzZDbGFzc0Z1bmN0aW9uKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgICB2YXIgZm5TdHIgPSBmblRvU3RyLmNhbGwodmFsdWUpO1xuICAgICAgICByZXR1cm4gY29uc3RydWN0b3JSZWdleC50ZXN0KGZuU3RyKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTsgLy8gbm90IGEgZnVuY3Rpb25cbiAgICB9XG59O1xuXG52YXIgdHJ5RnVuY3Rpb25PYmplY3QgPSBmdW5jdGlvbiB0cnlGdW5jdGlvblRvU3RyKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAoaXNFUzZDbGFzc0ZuKHZhbHVlKSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAgICAgZm5Ub1N0ci5jYWxsKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufTtcbnZhciB0b1N0ciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgb2JqZWN0Q2xhc3MgPSAnW29iamVjdCBPYmplY3RdJztcbnZhciBmbkNsYXNzID0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbnZhciBnZW5DbGFzcyA9ICdbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSc7XG52YXIgZGRhQ2xhc3MgPSAnW29iamVjdCBIVE1MQWxsQ29sbGVjdGlvbl0nOyAvLyBJRSAxMVxudmFyIGRkYUNsYXNzMiA9ICdbb2JqZWN0IEhUTUwgZG9jdW1lbnQuYWxsIGNsYXNzXSc7XG52YXIgZGRhQ2xhc3MzID0gJ1tvYmplY3QgSFRNTENvbGxlY3Rpb25dJzsgLy8gSUUgOS0xMFxudmFyIGhhc1RvU3RyaW5nVGFnID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiAhIVN5bWJvbC50b1N0cmluZ1RhZzsgLy8gYmV0dGVyOiB1c2UgYGhhcy10b3N0cmluZ3RhZ2BcblxudmFyIGlzSUU2OCA9ICEoMCBpbiBbLF0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNwYXJzZS1hcnJheXMsIGNvbW1hLXNwYWNpbmdcblxudmFyIGlzRERBOiAodmFsdWU6IGFueSkgPT4gYm9vbGVhbiA9IGZ1bmN0aW9uIGlzRG9jdW1lbnREb3RBbGwoKSB7IHJldHVybiBmYWxzZTsgfTtcbmlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICdvYmplY3QnKSB7XG4gICAgLy8gRmlyZWZveCAzIGNhbm9uaWNhbGl6ZXMgRERBIHRvIHVuZGVmaW5lZCB3aGVuIGl0J3Mgbm90IGFjY2Vzc2VkIGRpcmVjdGx5XG4gICAgdmFyIGFsbCA9IGRvY3VtZW50LmFsbDtcbiAgICBpZiAodG9TdHIuY2FsbChhbGwpID09PSB0b1N0ci5jYWxsKGRvY3VtZW50LmFsbCkpIHtcbiAgICAgICAgaXNEREEgPSBmdW5jdGlvbiBpc0RvY3VtZW50RG90QWxsKHZhbHVlKSB7XG4gICAgICAgICAgICAvKiBnbG9iYWxzIGRvY3VtZW50OiBmYWxzZSAqL1xuICAgICAgICAgICAgLy8gaW4gSUUgNi04LCB0eXBlb2YgZG9jdW1lbnQuYWxsIGlzIFwib2JqZWN0XCIgYW5kIGl0J3MgdHJ1dGh5XG4gICAgICAgICAgICBpZiAoKGlzSUU2OCB8fCAhdmFsdWUpICYmICh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ciA9IHRvU3RyLmNhbGwodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RyID09PSBkZGFDbGFzc1xuICAgICAgICAgICAgICAgICAgICAgICAgfHwgc3RyID09PSBkZGFDbGFzczJcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IHN0ciA9PT0gZGRhQ2xhc3MzIC8vIG9wZXJhIDEyLjE2XG4gICAgICAgICAgICAgICAgICAgICAgICB8fCBzdHIgPT09IG9iamVjdENsYXNzIC8vIElFIDYtOFxuICAgICAgICAgICAgICAgICAgICApICYmIHZhbHVlKCcnKSA9PSBudWxsOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGVxZXFlcVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgLyoqLyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH07XG4gICAgfVxufVxuXG5mdW5jdGlvbiBpc0NhbGxhYmxlUmVmQXBwbHk8VD4odmFsdWU6IFQgfCB1bmtub3duKTogdmFsdWUgaXMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkgIHtcbiAgICBpZiAoaXNEREEodmFsdWUpKSB7IHJldHVybiB0cnVlOyB9XG4gICAgaWYgKCF2YWx1ZSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgdHJ5IHtcbiAgICAgICAgKHJlZmxlY3RBcHBseSBhcyBhbnkpKHZhbHVlLCBudWxsLCBiYWRBcnJheUxpa2UpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGUgIT09IGlzQ2FsbGFibGVNYXJrZXIpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgfVxuICAgIHJldHVybiAhaXNFUzZDbGFzc0ZuKHZhbHVlKSAmJiB0cnlGdW5jdGlvbk9iamVjdCh2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIGlzQ2FsbGFibGVOb1JlZkFwcGx5PFQ+KHZhbHVlOiBUIHwgdW5rbm93bik6IHZhbHVlIGlzICguLi5hcmdzOiBhbnlbXSkgPT4gYW55IHtcbiAgICBpZiAoaXNEREEodmFsdWUpKSB7IHJldHVybiB0cnVlOyB9XG4gICAgaWYgKCF2YWx1ZSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgaWYgKGhhc1RvU3RyaW5nVGFnKSB7IHJldHVybiB0cnlGdW5jdGlvbk9iamVjdCh2YWx1ZSk7IH1cbiAgICBpZiAoaXNFUzZDbGFzc0ZuKHZhbHVlKSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICB2YXIgc3RyQ2xhc3MgPSB0b1N0ci5jYWxsKHZhbHVlKTtcbiAgICBpZiAoc3RyQ2xhc3MgIT09IGZuQ2xhc3MgJiYgc3RyQ2xhc3MgIT09IGdlbkNsYXNzICYmICEoL15cXFtvYmplY3QgSFRNTC8pLnRlc3Qoc3RyQ2xhc3MpKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIHJldHVybiB0cnlGdW5jdGlvbk9iamVjdCh2YWx1ZSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCByZWZsZWN0QXBwbHkgPyBpc0NhbGxhYmxlUmVmQXBwbHkgOiBpc0NhbGxhYmxlTm9SZWZBcHBseTtcbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuaW1wb3J0IGlzQ2FsbGFibGUgZnJvbSBcIi4vY2FsbGFibGUuanNcIjtcblxuLyoqXG4gKiBFeGNlcHRpb24gY2xhc3MgdGhhdCB3aWxsIGJlIHVzZWQgYXMgcmVqZWN0aW9uIHJlYXNvblxuICogaW4gY2FzZSBhIHtAbGluayBDYW5jZWxsYWJsZVByb21pc2V9IGlzIGNhbmNlbGxlZCBzdWNjZXNzZnVsbHkuXG4gKlxuICogVGhlIHZhbHVlIG9mIHRoZSB7QGxpbmsgbmFtZX0gcHJvcGVydHkgaXMgdGhlIHN0cmluZyBgXCJDYW5jZWxFcnJvclwiYC5cbiAqIFRoZSB2YWx1ZSBvZiB0aGUge0BsaW5rIGNhdXNlfSBwcm9wZXJ0eSBpcyB0aGUgY2F1c2UgcGFzc2VkIHRvIHRoZSBjYW5jZWwgbWV0aG9kLCBpZiBhbnkuXG4gKi9cbmV4cG9ydCBjbGFzcyBDYW5jZWxFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGBDYW5jZWxFcnJvcmAgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgZXJyb3IgbWVzc2FnZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gYmUgZm9yd2FyZGVkIHRvIHRoZSBFcnJvciBjb25zdHJ1Y3Rvci5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlPzogc3RyaW5nLCBvcHRpb25zPzogRXJyb3JPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLm5hbWUgPSBcIkNhbmNlbEVycm9yXCI7XG4gICAgfVxufVxuXG4vKipcbiAqIEV4Y2VwdGlvbiBjbGFzcyB0aGF0IHdpbGwgYmUgcmVwb3J0ZWQgYXMgYW4gdW5oYW5kbGVkIHJlamVjdGlvblxuICogaW4gY2FzZSBhIHtAbGluayBDYW5jZWxsYWJsZVByb21pc2V9IHJlamVjdHMgYWZ0ZXIgYmVpbmcgY2FuY2VsbGVkLFxuICogb3Igd2hlbiB0aGUgYG9uY2FuY2VsbGVkYCBjYWxsYmFjayB0aHJvd3Mgb3IgcmVqZWN0cy5cbiAqXG4gKiBUaGUgdmFsdWUgb2YgdGhlIHtAbGluayBuYW1lfSBwcm9wZXJ0eSBpcyB0aGUgc3RyaW5nIGBcIkNhbmNlbGxlZFJlamVjdGlvbkVycm9yXCJgLlxuICogVGhlIHZhbHVlIG9mIHRoZSB7QGxpbmsgY2F1c2V9IHByb3BlcnR5IGlzIHRoZSByZWFzb24gdGhlIHByb21pc2UgcmVqZWN0ZWQgd2l0aC5cbiAqXG4gKiBCZWNhdXNlIHRoZSBvcmlnaW5hbCBwcm9taXNlIHdhcyBjYW5jZWxsZWQsXG4gKiBhIHdyYXBwZXIgcHJvbWlzZSB3aWxsIGJlIHBhc3NlZCB0byB0aGUgdW5oYW5kbGVkIHJlamVjdGlvbiBsaXN0ZW5lciBpbnN0ZWFkLlxuICogVGhlIHtAbGluayBwcm9taXNlfSBwcm9wZXJ0eSBob2xkcyBhIHJlZmVyZW5jZSB0byB0aGUgb3JpZ2luYWwgcHJvbWlzZS5cbiAqL1xuZXhwb3J0IGNsYXNzIENhbmNlbGxlZFJlamVjdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIC8qKlxuICAgICAqIEhvbGRzIGEgcmVmZXJlbmNlIHRvIHRoZSBwcm9taXNlIHRoYXQgd2FzIGNhbmNlbGxlZCBhbmQgdGhlbiByZWplY3RlZC5cbiAgICAgKi9cbiAgICBwcm9taXNlOiBDYW5jZWxsYWJsZVByb21pc2U8dW5rbm93bj47XG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGBDYW5jZWxsZWRSZWplY3Rpb25FcnJvcmAgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHByb21pc2UgLSBUaGUgcHJvbWlzZSB0aGF0IGNhdXNlZCB0aGUgZXJyb3Igb3JpZ2luYWxseS5cbiAgICAgKiBAcGFyYW0gcmVhc29uIC0gVGhlIHJlamVjdGlvbiByZWFzb24uXG4gICAgICogQHBhcmFtIGluZm8gLSBBbiBvcHRpb25hbCBpbmZvcm1hdGl2ZSBtZXNzYWdlIHNwZWNpZnlpbmcgdGhlIGNpcmN1bXN0YW5jZXMgaW4gd2hpY2ggdGhlIGVycm9yIHdhcyB0aHJvd24uXG4gICAgICogICAgICAgICAgICAgICBEZWZhdWx0cyB0byB0aGUgc3RyaW5nIGBcIlVuaGFuZGxlZCByZWplY3Rpb24gaW4gY2FuY2VsbGVkIHByb21pc2UuXCJgLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHByb21pc2U6IENhbmNlbGxhYmxlUHJvbWlzZTx1bmtub3duPiwgcmVhc29uPzogYW55LCBpbmZvPzogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKChpbmZvID8/IFwiVW5oYW5kbGVkIHJlamVjdGlvbiBpbiBjYW5jZWxsZWQgcHJvbWlzZS5cIikgKyBcIiBSZWFzb246IFwiICsgZXJyb3JNZXNzYWdlKHJlYXNvbiksIHsgY2F1c2U6IHJlYXNvbiB9KTtcbiAgICAgICAgdGhpcy5wcm9taXNlID0gcHJvbWlzZTtcbiAgICAgICAgdGhpcy5uYW1lID0gXCJDYW5jZWxsZWRSZWplY3Rpb25FcnJvclwiO1xuICAgIH1cbn1cblxudHlwZSBDYW5jZWxsYWJsZVByb21pc2VSZXNvbHZlcjxUPiA9ICh2YWx1ZTogVCB8IFByb21pc2VMaWtlPFQ+IHwgQ2FuY2VsbGFibGVQcm9taXNlTGlrZTxUPikgPT4gdm9pZDtcbnR5cGUgQ2FuY2VsbGFibGVQcm9taXNlUmVqZWN0b3IgPSAocmVhc29uPzogYW55KSA9PiB2b2lkO1xudHlwZSBDYW5jZWxsYWJsZVByb21pc2VDYW5jZWxsZXIgPSAoY2F1c2U/OiBhbnkpID0+IHZvaWQgfCBQcm9taXNlTGlrZTx2b2lkPjtcbnR5cGUgQ2FuY2VsbGFibGVQcm9taXNlRXhlY3V0b3I8VD4gPSAocmVzb2x2ZTogQ2FuY2VsbGFibGVQcm9taXNlUmVzb2x2ZXI8VD4sIHJlamVjdDogQ2FuY2VsbGFibGVQcm9taXNlUmVqZWN0b3IpID0+IHZvaWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FuY2VsbGFibGVQcm9taXNlTGlrZTxUPiB7XG4gICAgdGhlbjxUUmVzdWx0MSA9IFQsIFRSZXN1bHQyID0gbmV2ZXI+KG9uZnVsZmlsbGVkPzogKCh2YWx1ZTogVCkgPT4gVFJlc3VsdDEgfCBQcm9taXNlTGlrZTxUUmVzdWx0MT4gfCBDYW5jZWxsYWJsZVByb21pc2VMaWtlPFRSZXN1bHQxPikgfCB1bmRlZmluZWQgfCBudWxsLCBvbnJlamVjdGVkPzogKChyZWFzb246IGFueSkgPT4gVFJlc3VsdDIgfCBQcm9taXNlTGlrZTxUUmVzdWx0Mj4gfCBDYW5jZWxsYWJsZVByb21pc2VMaWtlPFRSZXN1bHQyPikgfCB1bmRlZmluZWQgfCBudWxsKTogQ2FuY2VsbGFibGVQcm9taXNlTGlrZTxUUmVzdWx0MSB8IFRSZXN1bHQyPjtcbiAgICBjYW5jZWwoY2F1c2U/OiBhbnkpOiB2b2lkIHwgUHJvbWlzZUxpa2U8dm9pZD47XG59XG5cbi8qKlxuICogV3JhcHMgYSBjYW5jZWxsYWJsZSBwcm9taXNlIGFsb25nIHdpdGggaXRzIHJlc29sdXRpb24gbWV0aG9kcy5cbiAqIFRoZSBgb25jYW5jZWxsZWRgIGZpZWxkIHdpbGwgYmUgbnVsbCBpbml0aWFsbHkgYnV0IG1heSBiZSBzZXQgdG8gcHJvdmlkZSBhIGN1c3RvbSBjYW5jZWxsYXRpb24gZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FuY2VsbGFibGVQcm9taXNlV2l0aFJlc29sdmVyczxUPiB7XG4gICAgcHJvbWlzZTogQ2FuY2VsbGFibGVQcm9taXNlPFQ+O1xuICAgIHJlc29sdmU6IENhbmNlbGxhYmxlUHJvbWlzZVJlc29sdmVyPFQ+O1xuICAgIHJlamVjdDogQ2FuY2VsbGFibGVQcm9taXNlUmVqZWN0b3I7XG4gICAgb25jYW5jZWxsZWQ6IENhbmNlbGxhYmxlUHJvbWlzZUNhbmNlbGxlciB8IG51bGw7XG59XG5cbmludGVyZmFjZSBDYW5jZWxsYWJsZVByb21pc2VTdGF0ZSB7XG4gICAgcmVhZG9ubHkgcm9vdDogQ2FuY2VsbGFibGVQcm9taXNlU3RhdGU7XG4gICAgcmVzb2x2aW5nOiBib29sZWFuO1xuICAgIHNldHRsZWQ6IGJvb2xlYW47XG4gICAgcmVhc29uPzogQ2FuY2VsRXJyb3I7XG59XG5cbi8vIFByaXZhdGUgZmllbGQgbmFtZXMuXG5jb25zdCBiYXJyaWVyU3ltID0gU3ltYm9sKFwiYmFycmllclwiKTtcbmNvbnN0IGNhbmNlbEltcGxTeW0gPSBTeW1ib2woXCJjYW5jZWxJbXBsXCIpO1xuY29uc3Qgc3BlY2llcyA9IFN5bWJvbC5zcGVjaWVzID8/IFN5bWJvbChcInNwZWNpZXNQb2x5ZmlsbFwiKTtcblxuLyoqXG4gKiBBIHByb21pc2Ugd2l0aCBhbiBhdHRhY2hlZCBtZXRob2QgZm9yIGNhbmNlbGxpbmcgbG9uZy1ydW5uaW5nIG9wZXJhdGlvbnMgKHNlZSB7QGxpbmsgQ2FuY2VsbGFibGVQcm9taXNlI2NhbmNlbH0pLlxuICogQ2FuY2VsbGF0aW9uIGNhbiBvcHRpb25hbGx5IGJlIGJvdW5kIHRvIGFuIHtAbGluayBBYm9ydFNpZ25hbH1cbiAqIGZvciBiZXR0ZXIgY29tcG9zYWJpbGl0eSAoc2VlIHtAbGluayBDYW5jZWxsYWJsZVByb21pc2UjY2FuY2VsT259KS5cbiAqXG4gKiBDYW5jZWxsaW5nIGEgcGVuZGluZyBwcm9taXNlIHdpbGwgcmVzdWx0IGluIGFuIGltbWVkaWF0ZSByZWplY3Rpb25cbiAqIHdpdGggYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIENhbmNlbEVycm9yfSBhcyByZWFzb24sXG4gKiBidXQgd2hvZXZlciBzdGFydGVkIHRoZSBwcm9taXNlIHdpbGwgYmUgcmVzcG9uc2libGVcbiAqIGZvciBhY3R1YWxseSBhYm9ydGluZyB0aGUgdW5kZXJseWluZyBvcGVyYXRpb24uXG4gKiBUbyB0aGlzIHB1cnBvc2UsIHRoZSBjb25zdHJ1Y3RvciBhbmQgYWxsIGNoYWluaW5nIG1ldGhvZHNcbiAqIGFjY2VwdCBvcHRpb25hbCBjYW5jZWxsYXRpb24gY2FsbGJhY2tzLlxuICpcbiAqIElmIGEgYENhbmNlbGxhYmxlUHJvbWlzZWAgc3RpbGwgcmVzb2x2ZXMgYWZ0ZXIgaGF2aW5nIGJlZW4gY2FuY2VsbGVkLFxuICogdGhlIHJlc3VsdCB3aWxsIGJlIGRpc2NhcmRlZC4gSWYgaXQgcmVqZWN0cywgdGhlIHJlYXNvblxuICogd2lsbCBiZSByZXBvcnRlZCBhcyBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uLFxuICogd3JhcHBlZCBpbiBhIHtAbGluayBDYW5jZWxsZWRSZWplY3Rpb25FcnJvcn0gaW5zdGFuY2UuXG4gKiBUbyBmYWNpbGl0YXRlIHRoZSBoYW5kbGluZyBvZiBjYW5jZWxsYXRpb24gcmVxdWVzdHMsXG4gKiBjYW5jZWxsZWQgYENhbmNlbGxhYmxlUHJvbWlzZWBzIHdpbGwgX25vdF8gcmVwb3J0IHVuaGFuZGxlZCBgQ2FuY2VsRXJyb3Jgc1xuICogd2hvc2UgYGNhdXNlYCBmaWVsZCBpcyB0aGUgc2FtZSBhcyB0aGUgb25lIHdpdGggd2hpY2ggdGhlIGN1cnJlbnQgcHJvbWlzZSB3YXMgY2FuY2VsbGVkLlxuICpcbiAqIEFsbCB1c3VhbCBwcm9taXNlIG1ldGhvZHMgYXJlIGRlZmluZWQgYW5kIHJldHVybiBhIGBDYW5jZWxsYWJsZVByb21pc2VgXG4gKiB3aG9zZSBjYW5jZWwgbWV0aG9kIHdpbGwgY2FuY2VsIHRoZSBwYXJlbnQgb3BlcmF0aW9uIGFzIHdlbGwsIHByb3BhZ2F0aW5nIHRoZSBjYW5jZWxsYXRpb24gcmVhc29uXG4gKiB1cHdhcmRzIHRocm91Z2ggcHJvbWlzZSBjaGFpbnMuXG4gKiBDb252ZXJzZWx5LCBjYW5jZWxsaW5nIGEgcHJvbWlzZSB3aWxsIG5vdCBhdXRvbWF0aWNhbGx5IGNhbmNlbCBkZXBlbmRlbnQgcHJvbWlzZXMgZG93bnN0cmVhbTpcbiAqIGBgYHRzXG4gKiBsZXQgcm9vdCA9IG5ldyBDYW5jZWxsYWJsZVByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4geyAuLi4gfSk7XG4gKiBsZXQgY2hpbGQxID0gcm9vdC50aGVuKCgpID0+IHsgLi4uIH0pO1xuICogbGV0IGNoaWxkMiA9IGNoaWxkMS50aGVuKCgpID0+IHsgLi4uIH0pO1xuICogbGV0IGNoaWxkMyA9IHJvb3QuY2F0Y2goKCkgPT4geyAuLi4gfSk7XG4gKiBjaGlsZDEuY2FuY2VsKCk7IC8vIENhbmNlbHMgY2hpbGQxIGFuZCByb290LCBidXQgbm90IGNoaWxkMiBvciBjaGlsZDNcbiAqIGBgYFxuICogQ2FuY2VsbGluZyBhIHByb21pc2UgdGhhdCBoYXMgYWxyZWFkeSBzZXR0bGVkIGlzIHNhZmUgYW5kIGhhcyBubyBjb25zZXF1ZW5jZS5cbiAqXG4gKiBUaGUgYGNhbmNlbGAgbWV0aG9kIHJldHVybnMgYSBwcm9taXNlIHRoYXQgX2Fsd2F5cyBmdWxmaWxsc19cbiAqIGFmdGVyIHRoZSB3aG9sZSBjaGFpbiBoYXMgcHJvY2Vzc2VkIHRoZSBjYW5jZWwgcmVxdWVzdFxuICogYW5kIGFsbCBhdHRhY2hlZCBjYWxsYmFja3MgdXAgdG8gdGhhdCBtb21lbnQgaGF2ZSBydW4uXG4gKlxuICogQWxsIEVTMjAyNCBwcm9taXNlIG1ldGhvZHMgKHN0YXRpYyBhbmQgaW5zdGFuY2UpIGFyZSBkZWZpbmVkIG9uIENhbmNlbGxhYmxlUHJvbWlzZSxcbiAqIGJ1dCBhY3R1YWwgYXZhaWxhYmlsaXR5IG1heSB2YXJ5IHdpdGggT1Mvd2VidmlldyB2ZXJzaW9uLlxuICpcbiAqIEluIGxpbmUgd2l0aCB0aGUgcHJvcG9zYWwgYXQgaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtcm0tYnVpbHRpbi1zdWJjbGFzc2luZyxcbiAqIGBDYW5jZWxsYWJsZVByb21pc2VgIGRvZXMgbm90IHN1cHBvcnQgdHJhbnNwYXJlbnQgc3ViY2xhc3NpbmcuXG4gKiBFeHRlbmRlcnMgc2hvdWxkIHRha2UgY2FyZSB0byBwcm92aWRlIHRoZWlyIG93biBtZXRob2QgaW1wbGVtZW50YXRpb25zLlxuICogVGhpcyBtaWdodCBiZSByZWNvbnNpZGVyZWQgaW4gY2FzZSB0aGUgcHJvcG9zYWwgaXMgcmV0aXJlZC5cbiAqXG4gKiBDYW5jZWxsYWJsZVByb21pc2UgaXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgRE9NIFByb21pc2Ugb2JqZWN0XG4gKiBhbmQgaXMgY29tcGxpYW50IHdpdGggdGhlIFtQcm9taXNlcy9BKyBzcGVjaWZpY2F0aW9uXShodHRwczovL3Byb21pc2VzYXBsdXMuY29tLylcbiAqIChpdCBwYXNzZXMgdGhlIFtjb21wbGlhbmNlIHN1aXRlXShodHRwczovL2dpdGh1Yi5jb20vcHJvbWlzZXMtYXBsdXMvcHJvbWlzZXMtdGVzdHMpKVxuICogaWYgc28gaXMgdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBDYW5jZWxsYWJsZVByb21pc2U8VD4gZXh0ZW5kcyBQcm9taXNlPFQ+IGltcGxlbWVudHMgUHJvbWlzZUxpa2U8VD4sIENhbmNlbGxhYmxlUHJvbWlzZUxpa2U8VD4ge1xuICAgIC8vIFByaXZhdGUgZmllbGRzLlxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBwcml2YXRlIFtiYXJyaWVyU3ltXSE6IFBhcnRpYWw8UHJvbWlzZVdpdGhSZXNvbHZlcnM8dm9pZD4+IHwgbnVsbDtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBbY2FuY2VsSW1wbFN5bV0hOiAocmVhc29uOiBDYW5jZWxFcnJvcikgPT4gdm9pZCB8IFByb21pc2VMaWtlPHZvaWQ+O1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBgQ2FuY2VsbGFibGVQcm9taXNlYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBleGVjdXRvciAtIEEgY2FsbGJhY2sgdXNlZCB0byBpbml0aWFsaXplIHRoZSBwcm9taXNlLiBUaGlzIGNhbGxiYWNrIGlzIHBhc3NlZCB0d28gYXJndW1lbnRzOlxuICAgICAqICAgICAgICAgICAgICAgICAgIGEgYHJlc29sdmVgIGNhbGxiYWNrIHVzZWQgdG8gcmVzb2x2ZSB0aGUgcHJvbWlzZSB3aXRoIGEgdmFsdWVcbiAgICAgKiAgICAgICAgICAgICAgICAgICBvciB0aGUgcmVzdWx0IG9mIGFub3RoZXIgcHJvbWlzZSAocG9zc2libHkgY2FuY2VsbGFibGUpLFxuICAgICAqICAgICAgICAgICAgICAgICAgIGFuZCBhIGByZWplY3RgIGNhbGxiYWNrIHVzZWQgdG8gcmVqZWN0IHRoZSBwcm9taXNlIHdpdGggYSBwcm92aWRlZCByZWFzb24gb3IgZXJyb3IuXG4gICAgICogICAgICAgICAgICAgICAgICAgSWYgdGhlIHZhbHVlIHByb3ZpZGVkIHRvIHRoZSBgcmVzb2x2ZWAgY2FsbGJhY2sgaXMgYSB0aGVuYWJsZSBfYW5kXyBjYW5jZWxsYWJsZSBvYmplY3RcbiAgICAgKiAgICAgICAgICAgICAgICAgICAoaXQgaGFzIGEgYHRoZW5gIF9hbmRfIGEgYGNhbmNlbGAgbWV0aG9kKSxcbiAgICAgKiAgICAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb24gcmVxdWVzdHMgd2lsbCBiZSBmb3J3YXJkZWQgdG8gdGhhdCBvYmplY3QgYW5kIHRoZSBvbmNhbmNlbGxlZCB3aWxsIG5vdCBiZSBpbnZva2VkIGFueW1vcmUuXG4gICAgICogICAgICAgICAgICAgICAgICAgSWYgYW55IG9uZSBvZiB0aGUgdHdvIGNhbGxiYWNrcyBpcyBjYWxsZWQgX2FmdGVyXyB0aGUgcHJvbWlzZSBoYXMgYmVlbiBjYW5jZWxsZWQsXG4gICAgICogICAgICAgICAgICAgICAgICAgdGhlIHByb3ZpZGVkIHZhbHVlcyB3aWxsIGJlIGNhbmNlbGxlZCBhbmQgcmVzb2x2ZWQgYXMgdXN1YWwsXG4gICAgICogICAgICAgICAgICAgICAgICAgYnV0IHRoZWlyIHJlc3VsdHMgd2lsbCBiZSBkaXNjYXJkZWQuXG4gICAgICogICAgICAgICAgICAgICAgICAgSG93ZXZlciwgaWYgdGhlIHJlc29sdXRpb24gcHJvY2VzcyB1bHRpbWF0ZWx5IGVuZHMgdXAgaW4gYSByZWplY3Rpb25cbiAgICAgKiAgICAgICAgICAgICAgICAgICB0aGF0IGlzIG5vdCBkdWUgdG8gY2FuY2VsbGF0aW9uLCB0aGUgcmVqZWN0aW9uIHJlYXNvblxuICAgICAqICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgd3JhcHBlZCBpbiBhIHtAbGluayBDYW5jZWxsZWRSZWplY3Rpb25FcnJvcn1cbiAgICAgKiAgICAgICAgICAgICAgICAgICBhbmQgYnViYmxlZCB1cCBhcyBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uLlxuICAgICAqIEBwYXJhbSBvbmNhbmNlbGxlZCAtIEl0IGlzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBlbnN1cmUgdGhhdCBhbnkgb3BlcmF0aW9uXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgc3RhcnRlZCBieSB0aGUgZXhlY3V0b3IgaXMgcHJvcGVybHkgaGFsdGVkIHVwb24gY2FuY2VsbGF0aW9uLlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIFRoaXMgb3B0aW9uYWwgY2FsbGJhY2sgY2FuIGJlIHVzZWQgdG8gdGhhdCBwdXJwb3NlLlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIEl0IHdpbGwgYmUgY2FsbGVkIF9zeW5jaHJvbm91c2x5XyB3aXRoIGEgY2FuY2VsbGF0aW9uIGNhdXNlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgd2hlbiBjYW5jZWxsYXRpb24gaXMgcmVxdWVzdGVkLCBfYWZ0ZXJfIHRoZSBwcm9taXNlIGhhcyBhbHJlYWR5IHJlamVjdGVkXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgd2l0aCBhIHtAbGluayBDYW5jZWxFcnJvcn0sIGJ1dCBfYmVmb3JlX1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgIGFueSB7QGxpbmsgdGhlbn0ve0BsaW5rIGNhdGNofS97QGxpbmsgZmluYWxseX0gY2FsbGJhY2sgcnVucy5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgY2FsbGJhY2sgcmV0dXJucyBhIHRoZW5hYmxlLCB0aGUgcHJvbWlzZSByZXR1cm5lZCBmcm9tIHtAbGluayBjYW5jZWx9XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgd2lsbCBvbmx5IGZ1bGZpbGwgYWZ0ZXIgdGhlIGZvcm1lciBoYXMgc2V0dGxlZC5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBVbmhhbmRsZWQgZXhjZXB0aW9ucyBvciByZWplY3Rpb25zIGZyb20gdGhlIGNhbGxiYWNrIHdpbGwgYmUgd3JhcHBlZFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIGluIGEge0BsaW5rIENhbmNlbGxlZFJlamVjdGlvbkVycm9yfSBhbmQgYnViYmxlZCB1cCBhcyB1bmhhbmRsZWQgcmVqZWN0aW9ucy5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgYHJlc29sdmVgIGNhbGxiYWNrIGlzIGNhbGxlZCBiZWZvcmUgY2FuY2VsbGF0aW9uIHdpdGggYSBjYW5jZWxsYWJsZSBwcm9taXNlLFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyBvbiB0aGlzIHByb21pc2Ugd2lsbCBiZSBkaXZlcnRlZCB0byB0aGF0IHByb21pc2UsXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZSBvcmlnaW5hbCBgb25jYW5jZWxsZWRgIGNhbGxiYWNrIHdpbGwgYmUgZGlzY2FyZGVkLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGV4ZWN1dG9yOiBDYW5jZWxsYWJsZVByb21pc2VFeGVjdXRvcjxUPiwgb25jYW5jZWxsZWQ/OiBDYW5jZWxsYWJsZVByb21pc2VDYW5jZWxsZXIpIHtcbiAgICAgICAgbGV0IHJlc29sdmUhOiAodmFsdWU6IFQgfCBQcm9taXNlTGlrZTxUPikgPT4gdm9pZDtcbiAgICAgICAgbGV0IHJlamVjdCE6IChyZWFzb24/OiBhbnkpID0+IHZvaWQ7XG4gICAgICAgIHN1cGVyKChyZXMsIHJlaikgPT4geyByZXNvbHZlID0gcmVzOyByZWplY3QgPSByZWo7IH0pO1xuXG4gICAgICAgIGlmICgodGhpcy5jb25zdHJ1Y3RvciBhcyBhbnkpW3NwZWNpZXNdICE9PSBQcm9taXNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2FuY2VsbGFibGVQcm9taXNlIGRvZXMgbm90IHN1cHBvcnQgdHJhbnNwYXJlbnQgc3ViY2xhc3NpbmcuIFBsZWFzZSByZWZyYWluIGZyb20gb3ZlcnJpZGluZyB0aGUgW1N5bWJvbC5zcGVjaWVzXSBzdGF0aWMgcHJvcGVydHkuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHByb21pc2U6IENhbmNlbGxhYmxlUHJvbWlzZVdpdGhSZXNvbHZlcnM8VD4gPSB7XG4gICAgICAgICAgICBwcm9taXNlOiB0aGlzLFxuICAgICAgICAgICAgcmVzb2x2ZSxcbiAgICAgICAgICAgIHJlamVjdCxcbiAgICAgICAgICAgIGdldCBvbmNhbmNlbGxlZCgpIHsgcmV0dXJuIG9uY2FuY2VsbGVkID8/IG51bGw7IH0sXG4gICAgICAgICAgICBzZXQgb25jYW5jZWxsZWQoY2IpIHsgb25jYW5jZWxsZWQgPSBjYiA/PyB1bmRlZmluZWQ7IH1cbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBzdGF0ZTogQ2FuY2VsbGFibGVQcm9taXNlU3RhdGUgPSB7XG4gICAgICAgICAgICBnZXQgcm9vdCgpIHsgcmV0dXJuIHN0YXRlOyB9LFxuICAgICAgICAgICAgcmVzb2x2aW5nOiBmYWxzZSxcbiAgICAgICAgICAgIHNldHRsZWQ6IGZhbHNlXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gU2V0dXAgY2FuY2VsbGF0aW9uIHN5c3RlbS5cbiAgICAgICAgdm9pZCBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgICAgICAgICBbYmFycmllclN5bV06IHtcbiAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW2NhbmNlbEltcGxTeW1dOiB7XG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGNhbmNlbGxlckZvcihwcm9taXNlLCBzdGF0ZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUnVuIHRoZSBhY3R1YWwgZXhlY3V0b3IuXG4gICAgICAgIGNvbnN0IHJlamVjdG9yID0gcmVqZWN0b3JGb3IocHJvbWlzZSwgc3RhdGUpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZXhlY3V0b3IocmVzb2x2ZXJGb3IocHJvbWlzZSwgc3RhdGUpLCByZWplY3Rvcik7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKHN0YXRlLnJlc29sdmluZykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVW5oYW5kbGVkIGV4Y2VwdGlvbiBpbiBDYW5jZWxsYWJsZVByb21pc2UgZXhlY3V0b3IuXCIsIGVycik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlamVjdG9yKGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYW5jZWxzIGltbWVkaWF0ZWx5IHRoZSBleGVjdXRpb24gb2YgdGhlIG9wZXJhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBwcm9taXNlLlxuICAgICAqIFRoZSBwcm9taXNlIHJlamVjdHMgd2l0aCBhIHtAbGluayBDYW5jZWxFcnJvcn0gaW5zdGFuY2UgYXMgcmVhc29uLFxuICAgICAqIHdpdGggdGhlIHtAbGluayBDYW5jZWxFcnJvciNjYXVzZX0gcHJvcGVydHkgc2V0IHRvIHRoZSBnaXZlbiBhcmd1bWVudCwgaWYgYW55LlxuICAgICAqXG4gICAgICogSGFzIG5vIGVmZmVjdCBpZiBjYWxsZWQgYWZ0ZXIgdGhlIHByb21pc2UgaGFzIGFscmVhZHkgc2V0dGxlZDtcbiAgICAgKiByZXBlYXRlZCBjYWxscyBpbiBwYXJ0aWN1bGFyIGFyZSBzYWZlLCBidXQgb25seSB0aGUgZmlyc3Qgb25lXG4gICAgICogd2lsbCBzZXQgdGhlIGNhbmNlbGxhdGlvbiBjYXVzZS5cbiAgICAgKlxuICAgICAqIFRoZSBgQ2FuY2VsRXJyb3JgIGV4Y2VwdGlvbiBfbmVlZCBub3RfIGJlIGhhbmRsZWQgZXhwbGljaXRseSBfb24gdGhlIHByb21pc2VzIHRoYXQgYXJlIGJlaW5nIGNhbmNlbGxlZDpfXG4gICAgICogY2FuY2VsbGluZyBhIHByb21pc2Ugd2l0aCBubyBhdHRhY2hlZCByZWplY3Rpb24gaGFuZGxlciBkb2VzIG5vdCB0cmlnZ2VyIGFuIHVuaGFuZGxlZCByZWplY3Rpb24gZXZlbnQuXG4gICAgICogVGhlcmVmb3JlLCB0aGUgZm9sbG93aW5nIGlkaW9tcyBhcmUgYWxsIGVxdWFsbHkgY29ycmVjdDpcbiAgICAgKiBgYGB0c1xuICAgICAqIG5ldyBDYW5jZWxsYWJsZVByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4geyAuLi4gfSkuY2FuY2VsKCk7XG4gICAgICogbmV3IENhbmNlbGxhYmxlUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7IC4uLiB9KS50aGVuKC4uLikuY2FuY2VsKCk7XG4gICAgICogbmV3IENhbmNlbGxhYmxlUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7IC4uLiB9KS50aGVuKC4uLikuY2F0Y2goLi4uKS5jYW5jZWwoKTtcbiAgICAgKiBgYGBcbiAgICAgKiBXaGVuZXZlciBzb21lIGNhbmNlbGxlZCBwcm9taXNlIGluIGEgY2hhaW4gcmVqZWN0cyB3aXRoIGEgYENhbmNlbEVycm9yYFxuICAgICAqIHdpdGggdGhlIHNhbWUgY2FuY2VsbGF0aW9uIGNhdXNlIGFzIGl0c2VsZiwgdGhlIGVycm9yIHdpbGwgYmUgZGlzY2FyZGVkIHNpbGVudGx5LlxuICAgICAqIEhvd2V2ZXIsIHRoZSBgQ2FuY2VsRXJyb3JgIF93aWxsIHN0aWxsIGJlIGRlbGl2ZXJlZF8gdG8gYWxsIGF0dGFjaGVkIHJlamVjdGlvbiBoYW5kbGVyc1xuICAgICAqIGFkZGVkIGJ5IHtAbGluayB0aGVufSBhbmQgcmVsYXRlZCBtZXRob2RzOlxuICAgICAqIGBgYHRzXG4gICAgICogbGV0IGNhbmNlbGxhYmxlID0gbmV3IENhbmNlbGxhYmxlUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7IC4uLiB9KTtcbiAgICAgKiBjYW5jZWxsYWJsZS50aGVuKCgpID0+IHsgLi4uIH0pLmNhdGNoKGNvbnNvbGUubG9nKTtcbiAgICAgKiBjYW5jZWxsYWJsZS5jYW5jZWwoKTsgLy8gQSBDYW5jZWxFcnJvciBpcyBwcmludGVkIHRvIHRoZSBjb25zb2xlLlxuICAgICAqIGBgYFxuICAgICAqIElmIHRoZSBgQ2FuY2VsRXJyb3JgIGlzIG5vdCBoYW5kbGVkIGRvd25zdHJlYW0gYnkgdGhlIHRpbWUgaXQgcmVhY2hlc1xuICAgICAqIGEgX25vbi1jYW5jZWxsZWRfIHByb21pc2UsIGl0IF93aWxsXyB0cmlnZ2VyIGFuIHVuaGFuZGxlZCByZWplY3Rpb24gZXZlbnQsXG4gICAgICoganVzdCBsaWtlIG5vcm1hbCByZWplY3Rpb25zIHdvdWxkOlxuICAgICAqIGBgYHRzXG4gICAgICogbGV0IGNhbmNlbGxhYmxlID0gbmV3IENhbmNlbGxhYmxlUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7IC4uLiB9KTtcbiAgICAgKiBsZXQgY2hhaW5lZCA9IGNhbmNlbGxhYmxlLnRoZW4oKCkgPT4geyAuLi4gfSkudGhlbigoKSA9PiB7IC4uLiB9KTsgLy8gTm8gY2F0Y2guLi5cbiAgICAgKiBjYW5jZWxsYWJsZS5jYW5jZWwoKTsgLy8gVW5oYW5kbGVkIHJlamVjdGlvbiBldmVudCBvbiBjaGFpbmVkIVxuICAgICAqIGBgYFxuICAgICAqIFRoZXJlZm9yZSwgaXQgaXMgaW1wb3J0YW50IHRvIGVpdGhlciBjYW5jZWwgd2hvbGUgcHJvbWlzZSBjaGFpbnMgZnJvbSB0aGVpciB0YWlsLFxuICAgICAqIGFzIHNob3duIGluIHRoZSBjb3JyZWN0IGlkaW9tcyBhYm92ZSwgb3IgdGFrZSBjYXJlIG9mIGhhbmRsaW5nIGVycm9ycyBldmVyeXdoZXJlLlxuICAgICAqXG4gICAgICogQHJldHVybnMgQSBjYW5jZWxsYWJsZSBwcm9taXNlIHRoYXQgX2Z1bGZpbGxzXyBhZnRlciB0aGUgY2FuY2VsIGNhbGxiYWNrIChpZiBhbnkpXG4gICAgICogYW5kIGFsbCBoYW5kbGVycyBhdHRhY2hlZCB1cCB0byB0aGUgY2FsbCB0byBjYW5jZWwgaGF2ZSBydW4uXG4gICAgICogSWYgdGhlIGNhbmNlbCBjYWxsYmFjayByZXR1cm5zIGEgdGhlbmFibGUsIHRoZSBwcm9taXNlIHJldHVybmVkIGJ5IGBjYW5jZWxgXG4gICAgICogd2lsbCBhbHNvIHdhaXQgZm9yIHRoYXQgdGhlbmFibGUgdG8gc2V0dGxlLlxuICAgICAqIFRoaXMgZW5hYmxlcyBjYWxsZXJzIHRvIHdhaXQgZm9yIHRoZSBjYW5jZWxsZWQgb3BlcmF0aW9uIHRvIHRlcm1pbmF0ZVxuICAgICAqIHdpdGhvdXQgYmVpbmcgZm9yY2VkIHRvIGhhbmRsZSBwb3RlbnRpYWwgZXJyb3JzIGF0IHRoZSBjYWxsIHNpdGUuXG4gICAgICogYGBgdHNcbiAgICAgKiBjYW5jZWxsYWJsZS5jYW5jZWwoKS50aGVuKCgpID0+IHtcbiAgICAgKiAgICAgLy8gQ2xlYW51cCBmaW5pc2hlZCwgaXQncyBzYWZlIHRvIGRvIHNvbWV0aGluZyBlbHNlLlxuICAgICAqIH0sIChlcnIpID0+IHtcbiAgICAgKiAgICAgLy8gVW5yZWFjaGFibGU6IHRoZSBwcm9taXNlIHJldHVybmVkIGZyb20gY2FuY2VsIHdpbGwgbmV2ZXIgcmVqZWN0LlxuICAgICAqIH0pO1xuICAgICAqIGBgYFxuICAgICAqIE5vdGUgdGhhdCB0aGUgcmV0dXJuZWQgcHJvbWlzZSB3aWxsIF9ub3RfIGhhbmRsZSBpbXBsaWNpdGx5IGFueSByZWplY3Rpb25cbiAgICAgKiB0aGF0IG1pZ2h0IGhhdmUgb2NjdXJyZWQgYWxyZWFkeSBpbiB0aGUgY2FuY2VsbGVkIGNoYWluLlxuICAgICAqIEl0IHdpbGwganVzdCB0cmFjayB3aGV0aGVyIHJlZ2lzdGVyZWQgaGFuZGxlcnMgaGF2ZSBiZWVuIGV4ZWN1dGVkIG9yIG5vdC5cbiAgICAgKiBUaGVyZWZvcmUsIHVuaGFuZGxlZCByZWplY3Rpb25zIHdpbGwgbmV2ZXIgYmUgc2lsZW50bHkgaGFuZGxlZCBieSBjYWxsaW5nIGNhbmNlbC5cbiAgICAgKi9cbiAgICBjYW5jZWwoY2F1c2U/OiBhbnkpOiBDYW5jZWxsYWJsZVByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gbmV3IENhbmNlbGxhYmxlUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgLy8gSU5WQVJJQU5UOiB0aGUgcmVzdWx0IG9mIHRoaXNbY2FuY2VsSW1wbFN5bV0gYW5kIHRoZSBiYXJyaWVyIGRvIG5vdCBldmVyIHJlamVjdC5cbiAgICAgICAgICAgIC8vIFVuZm9ydHVuYXRlbHkgbWFjT1MgSGlnaCBTaWVycmEgZG9lcyBub3Qgc3VwcG9ydCBQcm9taXNlLmFsbFNldHRsZWQuXG4gICAgICAgICAgICBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgdGhpc1tjYW5jZWxJbXBsU3ltXShuZXcgQ2FuY2VsRXJyb3IoXCJQcm9taXNlIGNhbmNlbGxlZC5cIiwgeyBjYXVzZSB9KSksXG4gICAgICAgICAgICAgICAgY3VycmVudEJhcnJpZXIodGhpcylcbiAgICAgICAgICAgIF0pLnRoZW4oKCkgPT4gcmVzb2x2ZSgpLCAoKSA9PiByZXNvbHZlKCkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCaW5kcyBwcm9taXNlIGNhbmNlbGxhdGlvbiB0byB0aGUgYWJvcnQgZXZlbnQgb2YgdGhlIGdpdmVuIHtAbGluayBBYm9ydFNpZ25hbH0uXG4gICAgICogSWYgdGhlIHNpZ25hbCBoYXMgYWxyZWFkeSBhYm9ydGVkLCB0aGUgcHJvbWlzZSB3aWxsIGJlIGNhbmNlbGxlZCBpbW1lZGlhdGVseS5cbiAgICAgKiBXaGVuIGVpdGhlciBjb25kaXRpb24gaXMgdmVyaWZpZWQsIHRoZSBjYW5jZWxsYXRpb24gY2F1c2Ugd2lsbCBiZSBzZXRcbiAgICAgKiB0byB0aGUgc2lnbmFsJ3MgYWJvcnQgcmVhc29uIChzZWUge0BsaW5rIEFib3J0U2lnbmFsI3JlYXNvbn0pLlxuICAgICAqXG4gICAgICogSGFzIG5vIGVmZmVjdCBpZiBjYWxsZWQgKG9yIGlmIHRoZSBzaWduYWwgYWJvcnRzKSBfYWZ0ZXJfIHRoZSBwcm9taXNlIGhhcyBhbHJlYWR5IHNldHRsZWQuXG4gICAgICogT25seSB0aGUgZmlyc3Qgc2lnbmFsIHRvIGFib3J0IHdpbGwgc2V0IHRoZSBjYW5jZWxsYXRpb24gY2F1c2UuXG4gICAgICpcbiAgICAgKiBGb3IgbW9yZSBkZXRhaWxzIGFib3V0IHRoZSBjYW5jZWxsYXRpb24gcHJvY2VzcyxcbiAgICAgKiBzZWUge0BsaW5rIGNhbmNlbH0gYW5kIHRoZSBgQ2FuY2VsbGFibGVQcm9taXNlYCBjb25zdHJ1Y3Rvci5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGVuYWJsZXMgYGF3YWl0YGluZyBjYW5jZWxsYWJsZSBwcm9taXNlcyB3aXRob3V0IGhhdmluZ1xuICAgICAqIHRvIHN0b3JlIHRoZW0gZm9yIGZ1dHVyZSBjYW5jZWxsYXRpb24sIGUuZy46XG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBsb25nUnVubmluZ09wZXJhdGlvbigpLmNhbmNlbE9uKHNpZ25hbCk7XG4gICAgICogYGBgXG4gICAgICogaW5zdGVhZCBvZjpcbiAgICAgKiBgYGB0c1xuICAgICAqIGxldCBwcm9taXNlVG9CZUNhbmNlbGxlZCA9IGxvbmdSdW5uaW5nT3BlcmF0aW9uKCk7XG4gICAgICogYXdhaXQgcHJvbWlzZVRvQmVDYW5jZWxsZWQ7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGlzIHByb21pc2UsIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICovXG4gICAgY2FuY2VsT24oc2lnbmFsOiBBYm9ydFNpZ25hbCk6IENhbmNlbGxhYmxlUHJvbWlzZTxUPiB7XG4gICAgICAgIGlmIChzaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgICAgdm9pZCB0aGlzLmNhbmNlbChzaWduYWwucmVhc29uKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgKCkgPT4gdm9pZCB0aGlzLmNhbmNlbChzaWduYWwucmVhc29uKSwge2NhcHR1cmU6IHRydWV9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEF0dGFjaGVzIGNhbGxiYWNrcyBmb3IgdGhlIHJlc29sdXRpb24gYW5kL29yIHJlamVjdGlvbiBvZiB0aGUgYENhbmNlbGxhYmxlUHJvbWlzZWAuXG4gICAgICpcbiAgICAgKiBUaGUgb3B0aW9uYWwgYG9uY2FuY2VsbGVkYCBhcmd1bWVudCB3aWxsIGJlIGludm9rZWQgd2hlbiB0aGUgcmV0dXJuZWQgcHJvbWlzZSBpcyBjYW5jZWxsZWQsXG4gICAgICogd2l0aCB0aGUgc2FtZSBzZW1hbnRpY3MgYXMgdGhlIGBvbmNhbmNlbGxlZGAgYXJndW1lbnQgb2YgdGhlIGNvbnN0cnVjdG9yLlxuICAgICAqIFdoZW4gdGhlIHBhcmVudCBwcm9taXNlIHJlamVjdHMgb3IgaXMgY2FuY2VsbGVkLCB0aGUgYG9ucmVqZWN0ZWRgIGNhbGxiYWNrIHdpbGwgcnVuLFxuICAgICAqIF9ldmVuIGFmdGVyIHRoZSByZXR1cm5lZCBwcm9taXNlIGhhcyBiZWVuIGNhbmNlbGxlZDpfXG4gICAgICogaW4gdGhhdCBjYXNlLCBzaG91bGQgaXQgcmVqZWN0IG9yIHRocm93LCB0aGUgcmVhc29uIHdpbGwgYmUgd3JhcHBlZFxuICAgICAqIGluIGEge0BsaW5rIENhbmNlbGxlZFJlamVjdGlvbkVycm9yfSBhbmQgYnViYmxlZCB1cCBhcyBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9uZnVsZmlsbGVkIFRoZSBjYWxsYmFjayB0byBleGVjdXRlIHdoZW4gdGhlIFByb21pc2UgaXMgcmVzb2x2ZWQuXG4gICAgICogQHBhcmFtIG9ucmVqZWN0ZWQgVGhlIGNhbGxiYWNrIHRvIGV4ZWN1dGUgd2hlbiB0aGUgUHJvbWlzZSBpcyByZWplY3RlZC5cbiAgICAgKiBAcmV0dXJucyBBIGBDYW5jZWxsYWJsZVByb21pc2VgIGZvciB0aGUgY29tcGxldGlvbiBvZiB3aGljaGV2ZXIgY2FsbGJhY2sgaXMgZXhlY3V0ZWQuXG4gICAgICogVGhlIHJldHVybmVkIHByb21pc2UgaXMgaG9va2VkIHVwIHRvIHByb3BhZ2F0ZSBjYW5jZWxsYXRpb24gcmVxdWVzdHMgdXAgdGhlIGNoYWluLCBidXQgbm90IGRvd246XG4gICAgICpcbiAgICAgKiAgIC0gaWYgdGhlIHBhcmVudCBwcm9taXNlIGlzIGNhbmNlbGxlZCwgdGhlIGBvbnJlamVjdGVkYCBoYW5kbGVyIHdpbGwgYmUgaW52b2tlZCB3aXRoIGEgYENhbmNlbEVycm9yYFxuICAgICAqICAgICBhbmQgdGhlIHJldHVybmVkIHByb21pc2UgX3dpbGwgcmVzb2x2ZSByZWd1bGFybHlfIHdpdGggaXRzIHJlc3VsdDtcbiAgICAgKiAgIC0gY29udmVyc2VseSwgaWYgdGhlIHJldHVybmVkIHByb21pc2UgaXMgY2FuY2VsbGVkLCBfdGhlIHBhcmVudCBwcm9taXNlIGlzIGNhbmNlbGxlZCB0b287X1xuICAgICAqICAgICB0aGUgYG9ucmVqZWN0ZWRgIGhhbmRsZXIgd2lsbCBzdGlsbCBiZSBpbnZva2VkIHdpdGggdGhlIHBhcmVudCdzIGBDYW5jZWxFcnJvcmAsXG4gICAgICogICAgIGJ1dCBpdHMgcmVzdWx0IHdpbGwgYmUgZGlzY2FyZGVkXG4gICAgICogICAgIGFuZCB0aGUgcmV0dXJuZWQgcHJvbWlzZSB3aWxsIHJlamVjdCB3aXRoIGEgYENhbmNlbEVycm9yYCBhcyB3ZWxsLlxuICAgICAqXG4gICAgICogVGhlIHByb21pc2UgcmV0dXJuZWQgZnJvbSB7QGxpbmsgY2FuY2VsfSB3aWxsIGZ1bGZpbGwgb25seSBhZnRlciBhbGwgYXR0YWNoZWQgaGFuZGxlcnNcbiAgICAgKiB1cCB0aGUgZW50aXJlIHByb21pc2UgY2hhaW4gaGF2ZSBiZWVuIHJ1bi5cbiAgICAgKlxuICAgICAqIElmIGVpdGhlciBjYWxsYmFjayByZXR1cm5zIGEgY2FuY2VsbGFibGUgcHJvbWlzZSxcbiAgICAgKiBjYW5jZWxsYXRpb24gcmVxdWVzdHMgd2lsbCBiZSBkaXZlcnRlZCB0byBpdCxcbiAgICAgKiBhbmQgdGhlIHNwZWNpZmllZCBgb25jYW5jZWxsZWRgIGNhbGxiYWNrIHdpbGwgYmUgZGlzY2FyZGVkLlxuICAgICAqL1xuICAgIHRoZW48VFJlc3VsdDEgPSBULCBUUmVzdWx0MiA9IG5ldmVyPihvbmZ1bGZpbGxlZD86ICgodmFsdWU6IFQpID0+IFRSZXN1bHQxIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDE+IHwgQ2FuY2VsbGFibGVQcm9taXNlTGlrZTxUUmVzdWx0MT4pIHwgdW5kZWZpbmVkIHwgbnVsbCwgb25yZWplY3RlZD86ICgocmVhc29uOiBhbnkpID0+IFRSZXN1bHQyIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDI+IHwgQ2FuY2VsbGFibGVQcm9taXNlTGlrZTxUUmVzdWx0Mj4pIHwgdW5kZWZpbmVkIHwgbnVsbCwgb25jYW5jZWxsZWQ/OiBDYW5jZWxsYWJsZVByb21pc2VDYW5jZWxsZXIpOiBDYW5jZWxsYWJsZVByb21pc2U8VFJlc3VsdDEgfCBUUmVzdWx0Mj4ge1xuICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgQ2FuY2VsbGFibGVQcm9taXNlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbmNlbGxhYmxlUHJvbWlzZS5wcm90b3R5cGUudGhlbiBjYWxsZWQgb24gYW4gaW52YWxpZCBvYmplY3QuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTk9URTogVHlwZVNjcmlwdCdzIGJ1aWx0LWluIHR5cGUgZm9yIHRoZW4gaXMgYnJva2VuLFxuICAgICAgICAvLyBhcyBpdCBhbGxvd3Mgc3BlY2lmeWluZyBhbiBhcmJpdHJhcnkgVFJlc3VsdDEgIT0gVCBldmVuIHdoZW4gb25mdWxmaWxsZWQgaXMgbm90IGEgZnVuY3Rpb24uXG4gICAgICAgIC8vIFdlIGNhbm5vdCBmaXggaXQgaWYgd2Ugd2FudCB0byBDYW5jZWxsYWJsZVByb21pc2UgdG8gaW1wbGVtZW50IFByb21pc2VMaWtlPFQ+LlxuXG4gICAgICAgIGlmICghaXNDYWxsYWJsZShvbmZ1bGZpbGxlZCkpIHsgb25mdWxmaWxsZWQgPSBpZGVudGl0eSBhcyBhbnk7IH1cbiAgICAgICAgaWYgKCFpc0NhbGxhYmxlKG9ucmVqZWN0ZWQpKSB7IG9ucmVqZWN0ZWQgPSB0aHJvd2VyOyB9XG5cbiAgICAgICAgaWYgKG9uZnVsZmlsbGVkID09PSBpZGVudGl0eSAmJiBvbnJlamVjdGVkID09IHRocm93ZXIpIHtcbiAgICAgICAgICAgIC8vIFNob3J0Y3V0IGZvciB0cml2aWFsIGFyZ3VtZW50cy5cbiAgICAgICAgICAgIHJldHVybiBuZXcgQ2FuY2VsbGFibGVQcm9taXNlKChyZXNvbHZlKSA9PiByZXNvbHZlKHRoaXMgYXMgYW55KSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBiYXJyaWVyOiBQYXJ0aWFsPFByb21pc2VXaXRoUmVzb2x2ZXJzPHZvaWQ+PiA9IHt9O1xuICAgICAgICB0aGlzW2JhcnJpZXJTeW1dID0gYmFycmllcjtcblxuICAgICAgICByZXR1cm4gbmV3IENhbmNlbGxhYmxlUHJvbWlzZTxUUmVzdWx0MSB8IFRSZXN1bHQyPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB2b2lkIHN1cGVyLnRoZW4oXG4gICAgICAgICAgICAgICAgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzW2JhcnJpZXJTeW1dID09PSBiYXJyaWVyKSB7IHRoaXNbYmFycmllclN5bV0gPSBudWxsOyB9XG4gICAgICAgICAgICAgICAgICAgIGJhcnJpZXIucmVzb2x2ZT8uKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUob25mdWxmaWxsZWQhKHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIChyZWFzb24/KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzW2JhcnJpZXJTeW1dID09PSBiYXJyaWVyKSB7IHRoaXNbYmFycmllclN5bV0gPSBudWxsOyB9XG4gICAgICAgICAgICAgICAgICAgIGJhcnJpZXIucmVzb2x2ZT8uKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUob25yZWplY3RlZCEocmVhc29uKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9LCBhc3luYyAoY2F1c2U/KSA9PiB7XG4gICAgICAgICAgICAvL2NhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvbmNhbmNlbGxlZD8uKGNhdXNlKTtcbiAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jYW5jZWwoY2F1c2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBdHRhY2hlcyBhIGNhbGxiYWNrIGZvciBvbmx5IHRoZSByZWplY3Rpb24gb2YgdGhlIFByb21pc2UuXG4gICAgICpcbiAgICAgKiBUaGUgb3B0aW9uYWwgYG9uY2FuY2VsbGVkYCBhcmd1bWVudCB3aWxsIGJlIGludm9rZWQgd2hlbiB0aGUgcmV0dXJuZWQgcHJvbWlzZSBpcyBjYW5jZWxsZWQsXG4gICAgICogd2l0aCB0aGUgc2FtZSBzZW1hbnRpY3MgYXMgdGhlIGBvbmNhbmNlbGxlZGAgYXJndW1lbnQgb2YgdGhlIGNvbnN0cnVjdG9yLlxuICAgICAqIFdoZW4gdGhlIHBhcmVudCBwcm9taXNlIHJlamVjdHMgb3IgaXMgY2FuY2VsbGVkLCB0aGUgYG9ucmVqZWN0ZWRgIGNhbGxiYWNrIHdpbGwgcnVuLFxuICAgICAqIF9ldmVuIGFmdGVyIHRoZSByZXR1cm5lZCBwcm9taXNlIGhhcyBiZWVuIGNhbmNlbGxlZDpfXG4gICAgICogaW4gdGhhdCBjYXNlLCBzaG91bGQgaXQgcmVqZWN0IG9yIHRocm93LCB0aGUgcmVhc29uIHdpbGwgYmUgd3JhcHBlZFxuICAgICAqIGluIGEge0BsaW5rIENhbmNlbGxlZFJlamVjdGlvbkVycm9yfSBhbmQgYnViYmxlZCB1cCBhcyBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uLlxuICAgICAqXG4gICAgICogSXQgaXMgZXF1aXZhbGVudCB0b1xuICAgICAqIGBgYHRzXG4gICAgICogY2FuY2VsbGFibGVQcm9taXNlLnRoZW4odW5kZWZpbmVkLCBvbnJlamVjdGVkLCBvbmNhbmNlbGxlZCk7XG4gICAgICogYGBgXG4gICAgICogYW5kIHRoZSBzYW1lIGNhdmVhdHMgYXBwbHkuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBIFByb21pc2UgZm9yIHRoZSBjb21wbGV0aW9uIG9mIHRoZSBjYWxsYmFjay5cbiAgICAgKiBDYW5jZWxsYXRpb24gcmVxdWVzdHMgb24gdGhlIHJldHVybmVkIHByb21pc2VcbiAgICAgKiB3aWxsIHByb3BhZ2F0ZSB1cCB0aGUgY2hhaW4gdG8gdGhlIHBhcmVudCBwcm9taXNlLFxuICAgICAqIGJ1dCBub3QgaW4gdGhlIG90aGVyIGRpcmVjdGlvbi5cbiAgICAgKlxuICAgICAqIFRoZSBwcm9taXNlIHJldHVybmVkIGZyb20ge0BsaW5rIGNhbmNlbH0gd2lsbCBmdWxmaWxsIG9ubHkgYWZ0ZXIgYWxsIGF0dGFjaGVkIGhhbmRsZXJzXG4gICAgICogdXAgdGhlIGVudGlyZSBwcm9taXNlIGNoYWluIGhhdmUgYmVlbiBydW4uXG4gICAgICpcbiAgICAgKiBJZiBgb25yZWplY3RlZGAgcmV0dXJucyBhIGNhbmNlbGxhYmxlIHByb21pc2UsXG4gICAgICogY2FuY2VsbGF0aW9uIHJlcXVlc3RzIHdpbGwgYmUgZGl2ZXJ0ZWQgdG8gaXQsXG4gICAgICogYW5kIHRoZSBzcGVjaWZpZWQgYG9uY2FuY2VsbGVkYCBjYWxsYmFjayB3aWxsIGJlIGRpc2NhcmRlZC5cbiAgICAgKiBTZWUge0BsaW5rIHRoZW59IGZvciBtb3JlIGRldGFpbHMuXG4gICAgICovXG4gICAgY2F0Y2g8VFJlc3VsdCA9IG5ldmVyPihvbnJlamVjdGVkPzogKChyZWFzb246IGFueSkgPT4gKFByb21pc2VMaWtlPFRSZXN1bHQ+IHwgVFJlc3VsdCkpIHwgdW5kZWZpbmVkIHwgbnVsbCwgb25jYW5jZWxsZWQ/OiBDYW5jZWxsYWJsZVByb21pc2VDYW5jZWxsZXIpOiBDYW5jZWxsYWJsZVByb21pc2U8VCB8IFRSZXN1bHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGhlbih1bmRlZmluZWQsIG9ucmVqZWN0ZWQsIG9uY2FuY2VsbGVkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBdHRhY2hlcyBhIGNhbGxiYWNrIHRoYXQgaXMgaW52b2tlZCB3aGVuIHRoZSBDYW5jZWxsYWJsZVByb21pc2UgaXMgc2V0dGxlZCAoZnVsZmlsbGVkIG9yIHJlamVjdGVkKS4gVGhlXG4gICAgICogcmVzb2x2ZWQgdmFsdWUgY2Fubm90IGJlIGFjY2Vzc2VkIG9yIG1vZGlmaWVkIGZyb20gdGhlIGNhbGxiYWNrLlxuICAgICAqIFRoZSByZXR1cm5lZCBwcm9taXNlIHdpbGwgc2V0dGxlIGluIHRoZSBzYW1lIHN0YXRlIGFzIHRoZSBvcmlnaW5hbCBvbmVcbiAgICAgKiBhZnRlciB0aGUgcHJvdmlkZWQgY2FsbGJhY2sgaGFzIGNvbXBsZXRlZCBleGVjdXRpb24sXG4gICAgICogdW5sZXNzIHRoZSBjYWxsYmFjayB0aHJvd3Mgb3IgcmV0dXJucyBhIHJlamVjdGluZyBwcm9taXNlLFxuICAgICAqIGluIHdoaWNoIGNhc2UgdGhlIHJldHVybmVkIHByb21pc2Ugd2lsbCByZWplY3QgYXMgd2VsbC5cbiAgICAgKlxuICAgICAqIFRoZSBvcHRpb25hbCBgb25jYW5jZWxsZWRgIGFyZ3VtZW50IHdpbGwgYmUgaW52b2tlZCB3aGVuIHRoZSByZXR1cm5lZCBwcm9taXNlIGlzIGNhbmNlbGxlZCxcbiAgICAgKiB3aXRoIHRoZSBzYW1lIHNlbWFudGljcyBhcyB0aGUgYG9uY2FuY2VsbGVkYCBhcmd1bWVudCBvZiB0aGUgY29uc3RydWN0b3IuXG4gICAgICogT25jZSB0aGUgcGFyZW50IHByb21pc2Ugc2V0dGxlcywgdGhlIGBvbmZpbmFsbHlgIGNhbGxiYWNrIHdpbGwgcnVuLFxuICAgICAqIF9ldmVuIGFmdGVyIHRoZSByZXR1cm5lZCBwcm9taXNlIGhhcyBiZWVuIGNhbmNlbGxlZDpfXG4gICAgICogaW4gdGhhdCBjYXNlLCBzaG91bGQgaXQgcmVqZWN0IG9yIHRocm93LCB0aGUgcmVhc29uIHdpbGwgYmUgd3JhcHBlZFxuICAgICAqIGluIGEge0BsaW5rIENhbmNlbGxlZFJlamVjdGlvbkVycm9yfSBhbmQgYnViYmxlZCB1cCBhcyBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgaXMgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2Yge0BsaW5rIHRoZW59IGFuZCB0aGUgc2FtZSBjYXZlYXRzIGFwcGx5LlxuICAgICAqIEl0IGlzIHBvbHlmaWxsZWQsIGhlbmNlIGF2YWlsYWJsZSBpbiBldmVyeSBPUy93ZWJ2aWV3IHZlcnNpb24uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBIFByb21pc2UgZm9yIHRoZSBjb21wbGV0aW9uIG9mIHRoZSBjYWxsYmFjay5cbiAgICAgKiBDYW5jZWxsYXRpb24gcmVxdWVzdHMgb24gdGhlIHJldHVybmVkIHByb21pc2VcbiAgICAgKiB3aWxsIHByb3BhZ2F0ZSB1cCB0aGUgY2hhaW4gdG8gdGhlIHBhcmVudCBwcm9taXNlLFxuICAgICAqIGJ1dCBub3QgaW4gdGhlIG90aGVyIGRpcmVjdGlvbi5cbiAgICAgKlxuICAgICAqIFRoZSBwcm9taXNlIHJldHVybmVkIGZyb20ge0BsaW5rIGNhbmNlbH0gd2lsbCBmdWxmaWxsIG9ubHkgYWZ0ZXIgYWxsIGF0dGFjaGVkIGhhbmRsZXJzXG4gICAgICogdXAgdGhlIGVudGlyZSBwcm9taXNlIGNoYWluIGhhdmUgYmVlbiBydW4uXG4gICAgICpcbiAgICAgKiBJZiBgb25maW5hbGx5YCByZXR1cm5zIGEgY2FuY2VsbGFibGUgcHJvbWlzZSxcbiAgICAgKiBjYW5jZWxsYXRpb24gcmVxdWVzdHMgd2lsbCBiZSBkaXZlcnRlZCB0byBpdCxcbiAgICAgKiBhbmQgdGhlIHNwZWNpZmllZCBgb25jYW5jZWxsZWRgIGNhbGxiYWNrIHdpbGwgYmUgZGlzY2FyZGVkLlxuICAgICAqIFNlZSB7QGxpbmsgdGhlbn0gZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKi9cbiAgICBmaW5hbGx5KG9uZmluYWxseT86ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZCB8IG51bGwsIG9uY2FuY2VsbGVkPzogQ2FuY2VsbGFibGVQcm9taXNlQ2FuY2VsbGVyKTogQ2FuY2VsbGFibGVQcm9taXNlPFQ+IHtcbiAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIENhbmNlbGxhYmxlUHJvbWlzZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5jZWxsYWJsZVByb21pc2UucHJvdG90eXBlLmZpbmFsbHkgY2FsbGVkIG9uIGFuIGludmFsaWQgb2JqZWN0LlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNDYWxsYWJsZShvbmZpbmFsbHkpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50aGVuKG9uZmluYWxseSwgb25maW5hbGx5LCBvbmNhbmNlbGxlZCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy50aGVuKFxuICAgICAgICAgICAgKHZhbHVlKSA9PiBDYW5jZWxsYWJsZVByb21pc2UucmVzb2x2ZShvbmZpbmFsbHkoKSkudGhlbigoKSA9PiB2YWx1ZSksXG4gICAgICAgICAgICAocmVhc29uPykgPT4gQ2FuY2VsbGFibGVQcm9taXNlLnJlc29sdmUob25maW5hbGx5KCkpLnRoZW4oKCkgPT4geyB0aHJvdyByZWFzb247IH0pLFxuICAgICAgICAgICAgb25jYW5jZWxsZWQsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2UgdXNlIHRoZSBgW1N5bWJvbC5zcGVjaWVzXWAgc3RhdGljIHByb3BlcnR5LCBpZiBhdmFpbGFibGUsXG4gICAgICogdG8gZGlzYWJsZSB0aGUgYnVpbHQtaW4gYXV0b21hdGljIHN1YmNsYXNzaW5nIGZlYXR1cmVzIGZyb20ge0BsaW5rIFByb21pc2V9LlxuICAgICAqIEl0IGlzIGNyaXRpY2FsIGZvciBwZXJmb3JtYW5jZSByZWFzb25zIHRoYXQgZXh0ZW5kZXJzIGRvIG5vdCBvdmVycmlkZSB0aGlzLlxuICAgICAqIE9uY2UgdGhlIHByb3Bvc2FsIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXJtLWJ1aWx0aW4tc3ViY2xhc3NpbmdcbiAgICAgKiBpcyBlaXRoZXIgYWNjZXB0ZWQgb3IgcmV0aXJlZCwgdGhpcyBpbXBsZW1lbnRhdGlvbiB3aWxsIGhhdmUgdG8gYmUgcmV2aXNlZCBhY2NvcmRpbmdseS5cbiAgICAgKlxuICAgICAqIEBpZ25vcmVcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFtzcGVjaWVzXSgpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIENhbmNlbGxhYmxlUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggYW4gYXJyYXkgb2YgcmVzdWx0c1xuICAgICAqIHdoZW4gYWxsIG9mIHRoZSBwcm92aWRlZCBQcm9taXNlcyByZXNvbHZlLCBvciByZWplY3RlZCB3aGVuIGFueSBQcm9taXNlIGlzIHJlamVjdGVkLlxuICAgICAqXG4gICAgICogRXZlcnkgb25lIG9mIHRoZSBwcm92aWRlZCBvYmplY3RzIHRoYXQgaXMgYSB0aGVuYWJsZSBfYW5kXyBjYW5jZWxsYWJsZSBvYmplY3RcbiAgICAgKiB3aWxsIGJlIGNhbmNlbGxlZCB3aGVuIHRoZSByZXR1cm5lZCBwcm9taXNlIGlzIGNhbmNlbGxlZCwgd2l0aCB0aGUgc2FtZSBjYXVzZS5cbiAgICAgKlxuICAgICAqIEBncm91cCBTdGF0aWMgTWV0aG9kc1xuICAgICAqL1xuICAgIHN0YXRpYyBhbGw8VD4odmFsdWVzOiBJdGVyYWJsZTxUIHwgUHJvbWlzZUxpa2U8VD4+KTogQ2FuY2VsbGFibGVQcm9taXNlPEF3YWl0ZWQ8VD5bXT47XG4gICAgc3RhdGljIGFsbDxUIGV4dGVuZHMgcmVhZG9ubHkgdW5rbm93bltdIHwgW10+KHZhbHVlczogVCk6IENhbmNlbGxhYmxlUHJvbWlzZTx7IC1yZWFkb25seSBbUCBpbiBrZXlvZiBUXTogQXdhaXRlZDxUW1BdPjsgfT47XG4gICAgc3RhdGljIGFsbDxUIGV4dGVuZHMgSXRlcmFibGU8dW5rbm93bj4gfCBBcnJheUxpa2U8dW5rbm93bj4+KHZhbHVlczogVCk6IENhbmNlbGxhYmxlUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIGxldCBjb2xsZWN0ZWQgPSBBcnJheS5mcm9tKHZhbHVlcyk7XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBjb2xsZWN0ZWQubGVuZ3RoID09PSAwXG4gICAgICAgICAgICA/IENhbmNlbGxhYmxlUHJvbWlzZS5yZXNvbHZlKGNvbGxlY3RlZClcbiAgICAgICAgICAgIDogbmV3IENhbmNlbGxhYmxlUHJvbWlzZTx1bmtub3duPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgdm9pZCBQcm9taXNlLmFsbChjb2xsZWN0ZWQpLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICAgIH0sIChjYXVzZT8pOiBQcm9taXNlPHZvaWQ+ID0+IGNhbmNlbEFsbChwcm9taXNlLCBjb2xsZWN0ZWQsIGNhdXNlKSk7XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBDYW5jZWxsYWJsZVByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoIGFuIGFycmF5IG9mIHJlc3VsdHNcbiAgICAgKiB3aGVuIGFsbCBvZiB0aGUgcHJvdmlkZWQgUHJvbWlzZXMgcmVzb2x2ZSBvciByZWplY3QuXG4gICAgICpcbiAgICAgKiBFdmVyeSBvbmUgb2YgdGhlIHByb3ZpZGVkIG9iamVjdHMgdGhhdCBpcyBhIHRoZW5hYmxlIF9hbmRfIGNhbmNlbGxhYmxlIG9iamVjdFxuICAgICAqIHdpbGwgYmUgY2FuY2VsbGVkIHdoZW4gdGhlIHJldHVybmVkIHByb21pc2UgaXMgY2FuY2VsbGVkLCB3aXRoIHRoZSBzYW1lIGNhdXNlLlxuICAgICAqXG4gICAgICogQGdyb3VwIFN0YXRpYyBNZXRob2RzXG4gICAgICovXG4gICAgc3RhdGljIGFsbFNldHRsZWQ8VD4odmFsdWVzOiBJdGVyYWJsZTxUIHwgUHJvbWlzZUxpa2U8VD4+KTogQ2FuY2VsbGFibGVQcm9taXNlPFByb21pc2VTZXR0bGVkUmVzdWx0PEF3YWl0ZWQ8VD4+W10+O1xuICAgIHN0YXRpYyBhbGxTZXR0bGVkPFQgZXh0ZW5kcyByZWFkb25seSB1bmtub3duW10gfCBbXT4odmFsdWVzOiBUKTogQ2FuY2VsbGFibGVQcm9taXNlPHsgLXJlYWRvbmx5IFtQIGluIGtleW9mIFRdOiBQcm9taXNlU2V0dGxlZFJlc3VsdDxBd2FpdGVkPFRbUF0+PjsgfT47XG4gICAgc3RhdGljIGFsbFNldHRsZWQ8VCBleHRlbmRzIEl0ZXJhYmxlPHVua25vd24+IHwgQXJyYXlMaWtlPHVua25vd24+Pih2YWx1ZXM6IFQpOiBDYW5jZWxsYWJsZVByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICBsZXQgY29sbGVjdGVkID0gQXJyYXkuZnJvbSh2YWx1ZXMpO1xuICAgICAgICBjb25zdCBwcm9taXNlID0gY29sbGVjdGVkLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgPyBDYW5jZWxsYWJsZVByb21pc2UucmVzb2x2ZShjb2xsZWN0ZWQpXG4gICAgICAgICAgICA6IG5ldyBDYW5jZWxsYWJsZVByb21pc2U8dW5rbm93bj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHZvaWQgUHJvbWlzZS5hbGxTZXR0bGVkKGNvbGxlY3RlZCkudGhlbihyZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgICAgfSwgKGNhdXNlPyk6IFByb21pc2U8dm9pZD4gPT4gY2FuY2VsQWxsKHByb21pc2UsIGNvbGxlY3RlZCwgY2F1c2UpKTtcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGFueSBmdW5jdGlvbiByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCBieSB0aGUgZmlyc3QgZ2l2ZW4gcHJvbWlzZSB0byBiZSBmdWxmaWxsZWQsXG4gICAgICogb3IgcmVqZWN0ZWQgd2l0aCBhbiBBZ2dyZWdhdGVFcnJvciBjb250YWluaW5nIGFuIGFycmF5IG9mIHJlamVjdGlvbiByZWFzb25zXG4gICAgICogaWYgYWxsIG9mIHRoZSBnaXZlbiBwcm9taXNlcyBhcmUgcmVqZWN0ZWQuXG4gICAgICogSXQgcmVzb2x2ZXMgYWxsIGVsZW1lbnRzIG9mIHRoZSBwYXNzZWQgaXRlcmFibGUgdG8gcHJvbWlzZXMgYXMgaXQgcnVucyB0aGlzIGFsZ29yaXRobS5cbiAgICAgKlxuICAgICAqIEV2ZXJ5IG9uZSBvZiB0aGUgcHJvdmlkZWQgb2JqZWN0cyB0aGF0IGlzIGEgdGhlbmFibGUgX2FuZF8gY2FuY2VsbGFibGUgb2JqZWN0XG4gICAgICogd2lsbCBiZSBjYW5jZWxsZWQgd2hlbiB0aGUgcmV0dXJuZWQgcHJvbWlzZSBpcyBjYW5jZWxsZWQsIHdpdGggdGhlIHNhbWUgY2F1c2UuXG4gICAgICpcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcbiAgICAgKi9cbiAgICBzdGF0aWMgYW55PFQ+KHZhbHVlczogSXRlcmFibGU8VCB8IFByb21pc2VMaWtlPFQ+Pik6IENhbmNlbGxhYmxlUHJvbWlzZTxBd2FpdGVkPFQ+PjtcbiAgICBzdGF0aWMgYW55PFQgZXh0ZW5kcyByZWFkb25seSB1bmtub3duW10gfCBbXT4odmFsdWVzOiBUKTogQ2FuY2VsbGFibGVQcm9taXNlPEF3YWl0ZWQ8VFtudW1iZXJdPj47XG4gICAgc3RhdGljIGFueTxUIGV4dGVuZHMgSXRlcmFibGU8dW5rbm93bj4gfCBBcnJheUxpa2U8dW5rbm93bj4+KHZhbHVlczogVCk6IENhbmNlbGxhYmxlUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIGxldCBjb2xsZWN0ZWQgPSBBcnJheS5mcm9tKHZhbHVlcyk7XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBjb2xsZWN0ZWQubGVuZ3RoID09PSAwXG4gICAgICAgICAgICA/IENhbmNlbGxhYmxlUHJvbWlzZS5yZXNvbHZlKGNvbGxlY3RlZClcbiAgICAgICAgICAgIDogbmV3IENhbmNlbGxhYmxlUHJvbWlzZTx1bmtub3duPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgdm9pZCBQcm9taXNlLmFueShjb2xsZWN0ZWQpLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICAgIH0sIChjYXVzZT8pOiBQcm9taXNlPHZvaWQ+ID0+IGNhbmNlbEFsbChwcm9taXNlLCBjb2xsZWN0ZWQsIGNhdXNlKSk7XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQgd2hlbiBhbnkgb2YgdGhlIHByb3ZpZGVkIFByb21pc2VzIGFyZSByZXNvbHZlZCBvciByZWplY3RlZC5cbiAgICAgKlxuICAgICAqIEV2ZXJ5IG9uZSBvZiB0aGUgcHJvdmlkZWQgb2JqZWN0cyB0aGF0IGlzIGEgdGhlbmFibGUgX2FuZF8gY2FuY2VsbGFibGUgb2JqZWN0XG4gICAgICogd2lsbCBiZSBjYW5jZWxsZWQgd2hlbiB0aGUgcmV0dXJuZWQgcHJvbWlzZSBpcyBjYW5jZWxsZWQsIHdpdGggdGhlIHNhbWUgY2F1c2UuXG4gICAgICpcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcbiAgICAgKi9cbiAgICBzdGF0aWMgcmFjZTxUPih2YWx1ZXM6IEl0ZXJhYmxlPFQgfCBQcm9taXNlTGlrZTxUPj4pOiBDYW5jZWxsYWJsZVByb21pc2U8QXdhaXRlZDxUPj47XG4gICAgc3RhdGljIHJhY2U8VCBleHRlbmRzIHJlYWRvbmx5IHVua25vd25bXSB8IFtdPih2YWx1ZXM6IFQpOiBDYW5jZWxsYWJsZVByb21pc2U8QXdhaXRlZDxUW251bWJlcl0+PjtcbiAgICBzdGF0aWMgcmFjZTxUIGV4dGVuZHMgSXRlcmFibGU8dW5rbm93bj4gfCBBcnJheUxpa2U8dW5rbm93bj4+KHZhbHVlczogVCk6IENhbmNlbGxhYmxlUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIGxldCBjb2xsZWN0ZWQgPSBBcnJheS5mcm9tKHZhbHVlcyk7XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBuZXcgQ2FuY2VsbGFibGVQcm9taXNlPHVua25vd24+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHZvaWQgUHJvbWlzZS5yYWNlKGNvbGxlY3RlZCkudGhlbihyZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9LCAoY2F1c2U/KTogUHJvbWlzZTx2b2lkPiA9PiBjYW5jZWxBbGwocHJvbWlzZSwgY29sbGVjdGVkLCBjYXVzZSkpO1xuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGNhbmNlbGxlZCBDYW5jZWxsYWJsZVByb21pc2UgZm9yIHRoZSBwcm92aWRlZCBjYXVzZS5cbiAgICAgKlxuICAgICAqIEBncm91cCBTdGF0aWMgTWV0aG9kc1xuICAgICAqL1xuICAgIHN0YXRpYyBjYW5jZWw8VCA9IG5ldmVyPihjYXVzZT86IGFueSk6IENhbmNlbGxhYmxlUHJvbWlzZTxUPiB7XG4gICAgICAgIGNvbnN0IHAgPSBuZXcgQ2FuY2VsbGFibGVQcm9taXNlPFQ+KCgpID0+IHt9KTtcbiAgICAgICAgcC5jYW5jZWwoY2F1c2UpO1xuICAgICAgICByZXR1cm4gcDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IENhbmNlbGxhYmxlUHJvbWlzZSB0aGF0IGNhbmNlbHNcbiAgICAgKiBhZnRlciB0aGUgc3BlY2lmaWVkIHRpbWVvdXQsIHdpdGggdGhlIHByb3ZpZGVkIGNhdXNlLlxuICAgICAqXG4gICAgICogSWYgdGhlIHtAbGluayBBYm9ydFNpZ25hbC50aW1lb3V0fSBmYWN0b3J5IG1ldGhvZCBpcyBhdmFpbGFibGUsXG4gICAgICogaXQgaXMgdXNlZCB0byBiYXNlIHRoZSB0aW1lb3V0IG9uIF9hY3RpdmVfIHRpbWUgcmF0aGVyIHRoYW4gX2VsYXBzZWRfIHRpbWUuXG4gICAgICogT3RoZXJ3aXNlLCBgdGltZW91dGAgZmFsbHMgYmFjayB0byB7QGxpbmsgc2V0VGltZW91dH0uXG4gICAgICpcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcbiAgICAgKi9cbiAgICBzdGF0aWMgdGltZW91dDxUID0gbmV2ZXI+KG1pbGxpc2Vjb25kczogbnVtYmVyLCBjYXVzZT86IGFueSk6IENhbmNlbGxhYmxlUHJvbWlzZTxUPiB7XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBuZXcgQ2FuY2VsbGFibGVQcm9taXNlPFQ+KCgpID0+IHt9KTtcbiAgICAgICAgaWYgKEFib3J0U2lnbmFsICYmIHR5cGVvZiBBYm9ydFNpZ25hbCA9PT0gJ2Z1bmN0aW9uJyAmJiBBYm9ydFNpZ25hbC50aW1lb3V0ICYmIHR5cGVvZiBBYm9ydFNpZ25hbC50aW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBBYm9ydFNpZ25hbC50aW1lb3V0KG1pbGxpc2Vjb25kcykuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PiB2b2lkIHByb21pc2UuY2FuY2VsKGNhdXNlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHZvaWQgcHJvbWlzZS5jYW5jZWwoY2F1c2UpLCBtaWxsaXNlY29uZHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ2FuY2VsbGFibGVQcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgdGhlIHNwZWNpZmllZCB0aW1lb3V0LlxuICAgICAqIFRoZSByZXR1cm5lZCBwcm9taXNlIGNhbiBiZSBjYW5jZWxsZWQgd2l0aG91dCBjb25zZXF1ZW5jZXMuXG4gICAgICpcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcbiAgICAgKi9cbiAgICBzdGF0aWMgc2xlZXAobWlsbGlzZWNvbmRzOiBudW1iZXIpOiBDYW5jZWxsYWJsZVByb21pc2U8dm9pZD47XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBDYW5jZWxsYWJsZVByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlclxuICAgICAqIHRoZSBzcGVjaWZpZWQgdGltZW91dCwgd2l0aCB0aGUgcHJvdmlkZWQgdmFsdWUuXG4gICAgICogVGhlIHJldHVybmVkIHByb21pc2UgY2FuIGJlIGNhbmNlbGxlZCB3aXRob3V0IGNvbnNlcXVlbmNlcy5cbiAgICAgKlxuICAgICAqIEBncm91cCBTdGF0aWMgTWV0aG9kc1xuICAgICAqL1xuICAgIHN0YXRpYyBzbGVlcDxUPihtaWxsaXNlY29uZHM6IG51bWJlciwgdmFsdWU6IFQpOiBDYW5jZWxsYWJsZVByb21pc2U8VD47XG4gICAgc3RhdGljIHNsZWVwPFQgPSB2b2lkPihtaWxsaXNlY29uZHM6IG51bWJlciwgdmFsdWU/OiBUKTogQ2FuY2VsbGFibGVQcm9taXNlPFQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBDYW5jZWxsYWJsZVByb21pc2U8VD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZSh2YWx1ZSEpLCBtaWxsaXNlY29uZHMpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHJlamVjdGVkIENhbmNlbGxhYmxlUHJvbWlzZSBmb3IgdGhlIHByb3ZpZGVkIHJlYXNvbi5cbiAgICAgKlxuICAgICAqIEBncm91cCBTdGF0aWMgTWV0aG9kc1xuICAgICAqL1xuICAgIHN0YXRpYyByZWplY3Q8VCA9IG5ldmVyPihyZWFzb24/OiBhbnkpOiBDYW5jZWxsYWJsZVByb21pc2U8VD4ge1xuICAgICAgICByZXR1cm4gbmV3IENhbmNlbGxhYmxlUHJvbWlzZTxUPigoXywgcmVqZWN0KSA9PiByZWplY3QocmVhc29uKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyByZXNvbHZlZCBDYW5jZWxsYWJsZVByb21pc2UuXG4gICAgICpcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcbiAgICAgKi9cbiAgICBzdGF0aWMgcmVzb2x2ZSgpOiBDYW5jZWxsYWJsZVByb21pc2U8dm9pZD47XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyByZXNvbHZlZCBDYW5jZWxsYWJsZVByb21pc2UgZm9yIHRoZSBwcm92aWRlZCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBncm91cCBTdGF0aWMgTWV0aG9kc1xuICAgICAqL1xuICAgIHN0YXRpYyByZXNvbHZlPFQ+KHZhbHVlOiBUKTogQ2FuY2VsbGFibGVQcm9taXNlPEF3YWl0ZWQ8VD4+O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgcmVzb2x2ZWQgQ2FuY2VsbGFibGVQcm9taXNlIGZvciB0aGUgcHJvdmlkZWQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcbiAgICAgKi9cbiAgICBzdGF0aWMgcmVzb2x2ZTxUPih2YWx1ZTogVCB8IFByb21pc2VMaWtlPFQ+KTogQ2FuY2VsbGFibGVQcm9taXNlPEF3YWl0ZWQ8VD4+O1xuICAgIHN0YXRpYyByZXNvbHZlPFQgPSB2b2lkPih2YWx1ZT86IFQgfCBQcm9taXNlTGlrZTxUPik6IENhbmNlbGxhYmxlUHJvbWlzZTxBd2FpdGVkPFQ+PiB7XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIENhbmNlbGxhYmxlUHJvbWlzZSkge1xuICAgICAgICAgICAgLy8gT3B0aW1pc2UgZm9yIGNhbmNlbGxhYmxlIHByb21pc2VzLlxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQ2FuY2VsbGFibGVQcm9taXNlPGFueT4oKHJlc29sdmUpID0+IHJlc29sdmUodmFsdWUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IENhbmNlbGxhYmxlUHJvbWlzZSBhbmQgcmV0dXJucyBpdCBpbiBhbiBvYmplY3QsIGFsb25nIHdpdGggaXRzIHJlc29sdmUgYW5kIHJlamVjdCBmdW5jdGlvbnNcbiAgICAgKiBhbmQgYSBnZXR0ZXIvc2V0dGVyIGZvciB0aGUgY2FuY2VsbGF0aW9uIGNhbGxiYWNrLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgaXMgcG9seWZpbGxlZCwgaGVuY2UgYXZhaWxhYmxlIGluIGV2ZXJ5IE9TL3dlYnZpZXcgdmVyc2lvbi5cbiAgICAgKlxuICAgICAqIEBncm91cCBTdGF0aWMgTWV0aG9kc1xuICAgICAqL1xuICAgIHN0YXRpYyB3aXRoUmVzb2x2ZXJzPFQ+KCk6IENhbmNlbGxhYmxlUHJvbWlzZVdpdGhSZXNvbHZlcnM8VD4ge1xuICAgICAgICBsZXQgcmVzdWx0OiBDYW5jZWxsYWJsZVByb21pc2VXaXRoUmVzb2x2ZXJzPFQ+ID0geyBvbmNhbmNlbGxlZDogbnVsbCB9IGFzIGFueTtcbiAgICAgICAgcmVzdWx0LnByb21pc2UgPSBuZXcgQ2FuY2VsbGFibGVQcm9taXNlPFQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHJlc3VsdC5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgICAgIHJlc3VsdC5yZWplY3QgPSByZWplY3Q7XG4gICAgICAgIH0sIChjYXVzZT86IGFueSkgPT4geyByZXN1bHQub25jYW5jZWxsZWQ/LihjYXVzZSk7IH0pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgY2FsbGJhY2sgdGhhdCBpbXBsZW1lbnRzIHRoZSBjYW5jZWxsYXRpb24gYWxnb3JpdGhtIGZvciB0aGUgZ2l2ZW4gY2FuY2VsbGFibGUgcHJvbWlzZS5cbiAqIFRoZSBwcm9taXNlIHJldHVybmVkIGZyb20gdGhlIHJlc3VsdGluZyBmdW5jdGlvbiBkb2VzIG5vdCByZWplY3QuXG4gKi9cbmZ1bmN0aW9uIGNhbmNlbGxlckZvcjxUPihwcm9taXNlOiBDYW5jZWxsYWJsZVByb21pc2VXaXRoUmVzb2x2ZXJzPFQ+LCBzdGF0ZTogQ2FuY2VsbGFibGVQcm9taXNlU3RhdGUpIHtcbiAgICBsZXQgY2FuY2VsbGF0aW9uUHJvbWlzZTogdm9pZCB8IFByb21pc2VMaWtlPHZvaWQ+ID0gdW5kZWZpbmVkO1xuXG4gICAgcmV0dXJuIChyZWFzb246IENhbmNlbEVycm9yKTogdm9pZCB8IFByb21pc2VMaWtlPHZvaWQ+ID0+IHtcbiAgICAgICAgaWYgKCFzdGF0ZS5zZXR0bGVkKSB7XG4gICAgICAgICAgICBzdGF0ZS5zZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHN0YXRlLnJlYXNvbiA9IHJlYXNvbjtcbiAgICAgICAgICAgIHByb21pc2UucmVqZWN0KHJlYXNvbik7XG5cbiAgICAgICAgICAgIC8vIEF0dGFjaCBhbiBlcnJvciBoYW5kbGVyIHRoYXQgaWdub3JlcyB0aGlzIHNwZWNpZmljIHJlamVjdGlvbiByZWFzb24gYW5kIG5vdGhpbmcgZWxzZS5cbiAgICAgICAgICAgIC8vIEluIHRoZW9yeSwgYSBzYW5lIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gYXQgdGhpcyBwb2ludFxuICAgICAgICAgICAgLy8gc2hvdWxkIGFsd2F5cyByZWplY3Qgd2l0aCBvdXIgY2FuY2VsbGF0aW9uIHJlYXNvbixcbiAgICAgICAgICAgIC8vIGhlbmNlIHRoZSBoYW5kbGVyIHdpbGwgbmV2ZXIgdGhyb3cuXG4gICAgICAgICAgICB2b2lkIFByb21pc2UucHJvdG90eXBlLnRoZW4uY2FsbChwcm9taXNlLnByb21pc2UsIHVuZGVmaW5lZCwgKGVycikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlcnIgIT09IHJlYXNvbikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiByZWFzb24gaXMgbm90IHNldCwgdGhlIHByb21pc2UgcmVzb2x2ZWQgcmVndWxhcmx5LCBoZW5jZSB3ZSBtdXN0IG5vdCBjYWxsIG9uY2FuY2VsbGVkLlxuICAgICAgICAvLyBJZiBvbmNhbmNlbGxlZCBpcyB1bnNldCwgbm8gbmVlZCB0byBnbyBhbnkgZnVydGhlci5cbiAgICAgICAgaWYgKCFzdGF0ZS5yZWFzb24gfHwgIXByb21pc2Uub25jYW5jZWxsZWQpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgY2FuY2VsbGF0aW9uUHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUocHJvbWlzZS5vbmNhbmNlbGxlZCEoc3RhdGUucmVhc29uIS5jYXVzZSkpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgUHJvbWlzZS5yZWplY3QobmV3IENhbmNlbGxlZFJlamVjdGlvbkVycm9yKHByb21pc2UucHJvbWlzZSwgZXJyLCBcIlVuaGFuZGxlZCBleGNlcHRpb24gaW4gb25jYW5jZWxsZWQgY2FsbGJhY2suXCIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkuY2F0Y2goKHJlYXNvbj8pID0+IHtcbiAgICAgICAgICAgIFByb21pc2UucmVqZWN0KG5ldyBDYW5jZWxsZWRSZWplY3Rpb25FcnJvcihwcm9taXNlLnByb21pc2UsIHJlYXNvbiwgXCJVbmhhbmRsZWQgcmVqZWN0aW9uIGluIG9uY2FuY2VsbGVkIGNhbGxiYWNrLlwiKSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFVuc2V0IG9uY2FuY2VsbGVkIHRvIHByZXZlbnQgcmVwZWF0ZWQgY2FsbHMuXG4gICAgICAgIHByb21pc2Uub25jYW5jZWxsZWQgPSBudWxsO1xuXG4gICAgICAgIHJldHVybiBjYW5jZWxsYXRpb25Qcm9taXNlO1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgY2FsbGJhY2sgdGhhdCBpbXBsZW1lbnRzIHRoZSByZXNvbHV0aW9uIGFsZ29yaXRobSBmb3IgdGhlIGdpdmVuIGNhbmNlbGxhYmxlIHByb21pc2UuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVyRm9yPFQ+KHByb21pc2U6IENhbmNlbGxhYmxlUHJvbWlzZVdpdGhSZXNvbHZlcnM8VD4sIHN0YXRlOiBDYW5jZWxsYWJsZVByb21pc2VTdGF0ZSk6IENhbmNlbGxhYmxlUHJvbWlzZVJlc29sdmVyPFQ+IHtcbiAgICByZXR1cm4gKHZhbHVlKSA9PiB7XG4gICAgICAgIGlmIChzdGF0ZS5yZXNvbHZpbmcpIHsgcmV0dXJuOyB9XG4gICAgICAgIHN0YXRlLnJlc29sdmluZyA9IHRydWU7XG5cbiAgICAgICAgaWYgKHZhbHVlID09PSBwcm9taXNlLnByb21pc2UpIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZS5zZXR0bGVkKSB7IHJldHVybjsgfVxuICAgICAgICAgICAgc3RhdGUuc2V0dGxlZCA9IHRydWU7XG4gICAgICAgICAgICBwcm9taXNlLnJlamVjdChuZXcgVHlwZUVycm9yKFwiQSBwcm9taXNlIGNhbm5vdCBiZSByZXNvbHZlZCB3aXRoIGl0c2VsZi5cIikpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSkge1xuICAgICAgICAgICAgbGV0IHRoZW46IGFueTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhlbiA9ICh2YWx1ZSBhcyBhbnkpLnRoZW47XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBzdGF0ZS5zZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBwcm9taXNlLnJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlzQ2FsbGFibGUodGhlbikpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY2FuY2VsID0gKHZhbHVlIGFzIGFueSkuY2FuY2VsO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNDYWxsYWJsZShjYW5jZWwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvbmNhbmNlbGxlZCA9IChjYXVzZT86IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZmxlY3QuYXBwbHkoY2FuY2VsLCB2YWx1ZSwgW2NhdXNlXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLnJlYXNvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGFscmVhZHkgY2FuY2VsbGVkLCBwcm9wYWdhdGUgY2FuY2VsbGF0aW9uLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBwcm9taXNlIHJldHVybmVkIGZyb20gdGhlIGNhbmNlbGxlciBhbGdvcml0aG0gZG9lcyBub3QgcmVqZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gaXQgY2FuIGJlIGRpc2NhcmRlZCBzYWZlbHkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCBjYW5jZWxsZXJGb3IoeyAuLi5wcm9taXNlLCBvbmNhbmNlbGxlZCB9LCBzdGF0ZSkoc3RhdGUucmVhc29uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZS5vbmNhbmNlbGxlZCA9IG9uY2FuY2VsbGVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCB7fVxuXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3U3RhdGU6IENhbmNlbGxhYmxlUHJvbWlzZVN0YXRlID0ge1xuICAgICAgICAgICAgICAgICAgICByb290OiBzdGF0ZS5yb290LFxuICAgICAgICAgICAgICAgICAgICByZXNvbHZpbmc6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBnZXQgc2V0dGxlZCgpIHsgcmV0dXJuIHRoaXMucm9vdC5zZXR0bGVkIH0sXG4gICAgICAgICAgICAgICAgICAgIHNldCBzZXR0bGVkKHZhbHVlKSB7IHRoaXMucm9vdC5zZXR0bGVkID0gdmFsdWU7IH0sXG4gICAgICAgICAgICAgICAgICAgIGdldCByZWFzb24oKSB7IHJldHVybiB0aGlzLnJvb3QucmVhc29uIH1cbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVqZWN0b3IgPSByZWplY3RvckZvcihwcm9taXNlLCBuZXdTdGF0ZSk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgUmVmbGVjdC5hcHBseSh0aGVuLCB2YWx1ZSwgW3Jlc29sdmVyRm9yKHByb21pc2UsIG5ld1N0YXRlKSwgcmVqZWN0b3JdKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0b3IoZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBJTVBPUlRBTlQhXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RhdGUuc2V0dGxlZCkgeyByZXR1cm47IH1cbiAgICAgICAgc3RhdGUuc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIHByb21pc2UucmVzb2x2ZSh2YWx1ZSk7XG4gICAgfTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgY2FsbGJhY2sgdGhhdCBpbXBsZW1lbnRzIHRoZSByZWplY3Rpb24gYWxnb3JpdGhtIGZvciB0aGUgZ2l2ZW4gY2FuY2VsbGFibGUgcHJvbWlzZS5cbiAqL1xuZnVuY3Rpb24gcmVqZWN0b3JGb3I8VD4ocHJvbWlzZTogQ2FuY2VsbGFibGVQcm9taXNlV2l0aFJlc29sdmVyczxUPiwgc3RhdGU6IENhbmNlbGxhYmxlUHJvbWlzZVN0YXRlKTogQ2FuY2VsbGFibGVQcm9taXNlUmVqZWN0b3Ige1xuICAgIHJldHVybiAocmVhc29uPykgPT4ge1xuICAgICAgICBpZiAoc3RhdGUucmVzb2x2aW5nKSB7IHJldHVybjsgfVxuICAgICAgICBzdGF0ZS5yZXNvbHZpbmcgPSB0cnVlO1xuXG4gICAgICAgIGlmIChzdGF0ZS5zZXR0bGVkKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBDYW5jZWxFcnJvciAmJiBzdGF0ZS5yZWFzb24gaW5zdGFuY2VvZiBDYW5jZWxFcnJvciAmJiBPYmplY3QuaXMocmVhc29uLmNhdXNlLCBzdGF0ZS5yZWFzb24uY2F1c2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFN3YWxsb3cgbGF0ZSByZWplY3Rpb25zIHRoYXQgYXJlIENhbmNlbEVycm9ycyB3aG9zZSBjYW5jZWxsYXRpb24gY2F1c2UgaXMgdGhlIHNhbWUgYXMgb3Vycy5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2gge31cblxuICAgICAgICAgICAgdm9pZCBQcm9taXNlLnJlamVjdChuZXcgQ2FuY2VsbGVkUmVqZWN0aW9uRXJyb3IocHJvbWlzZS5wcm9taXNlLCByZWFzb24pKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YXRlLnNldHRsZWQgPSB0cnVlO1xuICAgICAgICAgICAgcHJvbWlzZS5yZWplY3QocmVhc29uKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBDYW5jZWxzIGFsbCB2YWx1ZXMgaW4gYW4gYXJyYXkgdGhhdCBsb29rIGxpa2UgY2FuY2VsbGFibGUgdGhlbmFibGVzLlxuICogUmV0dXJucyBhIHByb21pc2UgdGhhdCBmdWxmaWxscyBvbmNlIGFsbCBjYW5jZWxsYXRpb24gcHJvY2VkdXJlcyBmb3IgdGhlIGdpdmVuIHZhbHVlcyBoYXZlIHNldHRsZWQuXG4gKi9cbmZ1bmN0aW9uIGNhbmNlbEFsbChwYXJlbnQ6IENhbmNlbGxhYmxlUHJvbWlzZTx1bmtub3duPiwgdmFsdWVzOiBhbnlbXSwgY2F1c2U/OiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZXN1bHRzID0gW107XG5cbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgICBsZXQgY2FuY2VsOiBDYW5jZWxsYWJsZVByb21pc2VDYW5jZWxsZXI7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIWlzQ2FsbGFibGUodmFsdWUudGhlbikpIHsgY29udGludWU7IH1cbiAgICAgICAgICAgIGNhbmNlbCA9IHZhbHVlLmNhbmNlbDtcbiAgICAgICAgICAgIGlmICghaXNDYWxsYWJsZShjYW5jZWwpKSB7IGNvbnRpbnVlOyB9XG4gICAgICAgIH0gY2F0Y2ggeyBjb250aW51ZTsgfVxuXG4gICAgICAgIGxldCByZXN1bHQ6IHZvaWQgfCBQcm9taXNlTGlrZTx2b2lkPjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlc3VsdCA9IFJlZmxlY3QuYXBwbHkoY2FuY2VsLCB2YWx1ZSwgW2NhdXNlXSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgUHJvbWlzZS5yZWplY3QobmV3IENhbmNlbGxlZFJlamVjdGlvbkVycm9yKHBhcmVudCwgZXJyLCBcIlVuaGFuZGxlZCBleGNlcHRpb24gaW4gY2FuY2VsIG1ldGhvZC5cIikpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXJlc3VsdCkgeyBjb250aW51ZTsgfVxuICAgICAgICByZXN1bHRzLnB1c2goXG4gICAgICAgICAgICAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSAgPyByZXN1bHQgOiBQcm9taXNlLnJlc29sdmUocmVzdWx0KSkuY2F0Y2goKHJlYXNvbj8pID0+IHtcbiAgICAgICAgICAgICAgICBQcm9taXNlLnJlamVjdChuZXcgQ2FuY2VsbGVkUmVqZWN0aW9uRXJyb3IocGFyZW50LCByZWFzb24sIFwiVW5oYW5kbGVkIHJlamVjdGlvbiBpbiBjYW5jZWwgbWV0aG9kLlwiKSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLmFsbChyZXN1bHRzKSBhcyBhbnk7XG59XG5cbi8qKlxuICogUmV0dXJucyBpdHMgYXJndW1lbnQuXG4gKi9cbmZ1bmN0aW9uIGlkZW50aXR5PFQ+KHg6IFQpOiBUIHtcbiAgICByZXR1cm4geDtcbn1cblxuLyoqXG4gKiBUaHJvd3MgaXRzIGFyZ3VtZW50LlxuICovXG5mdW5jdGlvbiB0aHJvd2VyKHJlYXNvbj86IGFueSk6IG5ldmVyIHtcbiAgICB0aHJvdyByZWFzb247XG59XG5cbi8qKlxuICogQXR0ZW1wdHMgdmFyaW91cyBzdHJhdGVnaWVzIHRvIGNvbnZlcnQgYW4gZXJyb3IgdG8gYSBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGVycm9yTWVzc2FnZShlcnI6IGFueSk6IHN0cmluZyB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIEVycm9yIHx8IHR5cGVvZiBlcnIgIT09ICdvYmplY3QnIHx8IGVyci50b1N0cmluZyAhPT0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIFwiXCIgKyBlcnI7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIHt9XG5cbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZXJyKTtcbiAgICB9IGNhdGNoIHt9XG5cbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGVycik7XG4gICAgfSBjYXRjaCB7fVxuXG4gICAgcmV0dXJuIFwiPGNvdWxkIG5vdCBjb252ZXJ0IGVycm9yIHRvIHN0cmluZz5cIjtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBjdXJyZW50IGJhcnJpZXIgcHJvbWlzZSBmb3IgdGhlIGdpdmVuIGNhbmNlbGxhYmxlIHByb21pc2UuIElmIG5lY2Vzc2FyeSwgaW5pdGlhbGlzZXMgdGhlIGJhcnJpZXIuXG4gKi9cbmZ1bmN0aW9uIGN1cnJlbnRCYXJyaWVyPFQ+KHByb21pc2U6IENhbmNlbGxhYmxlUHJvbWlzZTxUPik6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBwd3I6IFBhcnRpYWw8UHJvbWlzZVdpdGhSZXNvbHZlcnM8dm9pZD4+ID0gcHJvbWlzZVtiYXJyaWVyU3ltXSA/PyB7fTtcbiAgICBpZiAoISgncHJvbWlzZScgaW4gcHdyKSkge1xuICAgICAgICBPYmplY3QuYXNzaWduKHB3ciwgcHJvbWlzZVdpdGhSZXNvbHZlcnM8dm9pZD4oKSk7XG4gICAgfVxuICAgIGlmIChwcm9taXNlW2JhcnJpZXJTeW1dID09IG51bGwpIHtcbiAgICAgICAgcHdyLnJlc29sdmUhKCk7XG4gICAgICAgIHByb21pc2VbYmFycmllclN5bV0gPSBwd3I7XG4gICAgfVxuICAgIHJldHVybiBwd3IucHJvbWlzZSE7XG59XG5cbi8vIFBvbHlmaWxsIFByb21pc2Uud2l0aFJlc29sdmVycy5cbmxldCBwcm9taXNlV2l0aFJlc29sdmVycyA9IFByb21pc2Uud2l0aFJlc29sdmVycztcbmlmIChwcm9taXNlV2l0aFJlc29sdmVycyAmJiB0eXBlb2YgcHJvbWlzZVdpdGhSZXNvbHZlcnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBwcm9taXNlV2l0aFJlc29sdmVycyA9IHByb21pc2VXaXRoUmVzb2x2ZXJzLmJpbmQoUHJvbWlzZSk7XG59IGVsc2Uge1xuICAgIHByb21pc2VXaXRoUmVzb2x2ZXJzID0gZnVuY3Rpb24gPFQ+KCk6IFByb21pc2VXaXRoUmVzb2x2ZXJzPFQ+IHtcbiAgICAgICAgbGV0IHJlc29sdmUhOiAodmFsdWU6IFQgfCBQcm9taXNlTGlrZTxUPikgPT4gdm9pZDtcbiAgICAgICAgbGV0IHJlamVjdCE6IChyZWFzb24/OiBhbnkpID0+IHZvaWQ7XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZTxUPigocmVzLCByZWopID0+IHsgcmVzb2x2ZSA9IHJlczsgcmVqZWN0ID0gcmVqOyB9KTtcbiAgICAgICAgcmV0dXJuIHsgcHJvbWlzZSwgcmVzb2x2ZSwgcmVqZWN0IH07XG4gICAgfVxufSIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuaW1wb3J0IHtuZXdSdW50aW1lQ2FsbGVyLCBvYmplY3ROYW1lc30gZnJvbSBcIi4vcnVudGltZS5qc1wiO1xuXG5jb25zdCBjYWxsID0gbmV3UnVudGltZUNhbGxlcihvYmplY3ROYW1lcy5DbGlwYm9hcmQpO1xuXG5jb25zdCBDbGlwYm9hcmRTZXRUZXh0ID0gMDtcbmNvbnN0IENsaXBib2FyZFRleHQgPSAxO1xuXG4vKipcbiAqIFNldHMgdGhlIHRleHQgdG8gdGhlIENsaXBib2FyZC5cbiAqXG4gKiBAcGFyYW0gdGV4dCAtIFRoZSB0ZXh0IHRvIGJlIHNldCB0byB0aGUgQ2xpcGJvYXJkLlxuICogQHJldHVybiBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFNldFRleHQodGV4dDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIGNhbGwoQ2xpcGJvYXJkU2V0VGV4dCwge3RleHR9KTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIENsaXBib2FyZCB0ZXh0XG4gKlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgdGV4dCBmcm9tIHRoZSBDbGlwYm9hcmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBUZXh0KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIGNhbGwoQ2xpcGJvYXJkVGV4dCk7XG59XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbi8qKlxuICogQW55IGlzIGEgZHVtbXkgY3JlYXRpb24gZnVuY3Rpb24gZm9yIHNpbXBsZSBvciB1bmtub3duIHR5cGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQW55PFQ+KHNvdXJjZTogYW55KTogVCB7XG4gICAgcmV0dXJuIHNvdXJjZTtcbn1cblxuLyoqXG4gKiBCeXRlU2xpY2UgaXMgYSBjcmVhdGlvbiBmdW5jdGlvbiB0aGF0IHJlcGxhY2VzXG4gKiBudWxsIHN0cmluZ3Mgd2l0aCBlbXB0eSBzdHJpbmdzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQnl0ZVNsaWNlKHNvdXJjZTogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gKChzb3VyY2UgPT0gbnVsbCkgPyBcIlwiIDogc291cmNlKTtcbn1cblxuLyoqXG4gKiBBcnJheSB0YWtlcyBhIGNyZWF0aW9uIGZ1bmN0aW9uIGZvciBhbiBhcmJpdHJhcnkgdHlwZVxuICogYW5kIHJldHVybnMgYW4gaW4tcGxhY2UgY3JlYXRpb24gZnVuY3Rpb24gZm9yIGFuIGFycmF5XG4gKiB3aG9zZSBlbGVtZW50cyBhcmUgb2YgdGhhdCB0eXBlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQXJyYXk8VD4oZWxlbWVudDogKHNvdXJjZTogYW55KSA9PiBUKTogKHNvdXJjZTogYW55KSA9PiBUW10ge1xuICAgIGlmIChlbGVtZW50ID09PSBBbnkpIHtcbiAgICAgICAgcmV0dXJuIChzb3VyY2UpID0+IChzb3VyY2UgPT09IG51bGwgPyBbXSA6IHNvdXJjZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIChzb3VyY2UpID0+IHtcbiAgICAgICAgaWYgKHNvdXJjZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc291cmNlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBzb3VyY2VbaV0gPSBlbGVtZW50KHNvdXJjZVtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICB9O1xufVxuXG4vKipcbiAqIE1hcCB0YWtlcyBjcmVhdGlvbiBmdW5jdGlvbnMgZm9yIHR3byBhcmJpdHJhcnkgdHlwZXNcbiAqIGFuZCByZXR1cm5zIGFuIGluLXBsYWNlIGNyZWF0aW9uIGZ1bmN0aW9uIGZvciBhbiBvYmplY3RcbiAqIHdob3NlIGtleXMgYW5kIHZhbHVlcyBhcmUgb2YgdGhvc2UgdHlwZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBNYXA8Vj4oa2V5OiAoc291cmNlOiBhbnkpID0+IHN0cmluZywgdmFsdWU6IChzb3VyY2U6IGFueSkgPT4gVik6IChzb3VyY2U6IGFueSkgPT4gUmVjb3JkPHN0cmluZywgVj4ge1xuICAgIGlmICh2YWx1ZSA9PT0gQW55KSB7XG4gICAgICAgIHJldHVybiAoc291cmNlKSA9PiAoc291cmNlID09PSBudWxsID8ge30gOiBzb3VyY2UpO1xuICAgIH1cblxuICAgIHJldHVybiAoc291cmNlKSA9PiB7XG4gICAgICAgIGlmIChzb3VyY2UgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgIHNvdXJjZVtrZXldID0gdmFsdWUoc291cmNlW2tleV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgfTtcbn1cblxuLyoqXG4gKiBOdWxsYWJsZSB0YWtlcyBhIGNyZWF0aW9uIGZ1bmN0aW9uIGZvciBhbiBhcmJpdHJhcnkgdHlwZVxuICogYW5kIHJldHVybnMgYSBjcmVhdGlvbiBmdW5jdGlvbiBmb3IgYSBudWxsYWJsZSB2YWx1ZSBvZiB0aGF0IHR5cGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBOdWxsYWJsZTxUPihlbGVtZW50OiAoc291cmNlOiBhbnkpID0+IFQpOiAoc291cmNlOiBhbnkpID0+IChUIHwgbnVsbCkge1xuICAgIGlmIChlbGVtZW50ID09PSBBbnkpIHtcbiAgICAgICAgcmV0dXJuIEFueTtcbiAgICB9XG5cbiAgICByZXR1cm4gKHNvdXJjZSkgPT4gKHNvdXJjZSA9PT0gbnVsbCA/IG51bGwgOiBlbGVtZW50KHNvdXJjZSkpO1xufVxuXG4vKipcbiAqIFN0cnVjdCB0YWtlcyBhbiBvYmplY3QgbWFwcGluZyBmaWVsZCBuYW1lcyB0byBjcmVhdGlvbiBmdW5jdGlvbnNcbiAqIGFuZCByZXR1cm5zIGFuIGluLXBsYWNlIGNyZWF0aW9uIGZ1bmN0aW9uIGZvciBhIHN0cnVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFN0cnVjdDxcbiAgICBUIGV4dGVuZHMgeyBbXzogc3RyaW5nXTogKChzb3VyY2U6IGFueSkgPT4gYW55KSB9LFxuICAgIFUgZXh0ZW5kcyB7IFtLZXkgaW4ga2V5b2YgVF0/OiBSZXR1cm5UeXBlPFRbS2V5XT4gfVxuPihjcmVhdGVGaWVsZDogVCk6IChzb3VyY2U6IGFueSkgPT4gVSB7XG4gICAgbGV0IGFsbEFueSA9IHRydWU7XG4gICAgZm9yIChjb25zdCBuYW1lIGluIGNyZWF0ZUZpZWxkKSB7XG4gICAgICAgIGlmIChjcmVhdGVGaWVsZFtuYW1lXSAhPT0gQW55KSB7XG4gICAgICAgICAgICBhbGxBbnkgPSBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChhbGxBbnkpIHtcbiAgICAgICAgcmV0dXJuIEFueTtcbiAgICB9XG5cbiAgICByZXR1cm4gKHNvdXJjZSkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgaW4gY3JlYXRlRmllbGQpIHtcbiAgICAgICAgICAgIGlmIChuYW1lIGluIHNvdXJjZSkge1xuICAgICAgICAgICAgICAgIHNvdXJjZVtuYW1lXSA9IGNyZWF0ZUZpZWxkW25hbWVdKHNvdXJjZVtuYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICB9O1xufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5leHBvcnQgaW50ZXJmYWNlIFNpemUge1xuICAgIC8qKiBUaGUgd2lkdGggb2YgYSByZWN0YW5ndWxhciBhcmVhLiAqL1xuICAgIFdpZHRoOiBudW1iZXI7XG4gICAgLyoqIFRoZSBoZWlnaHQgb2YgYSByZWN0YW5ndWxhciBhcmVhLiAqL1xuICAgIEhlaWdodDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlY3Qge1xuICAgIC8qKiBUaGUgWCBjb29yZGluYXRlIG9mIHRoZSBvcmlnaW4uICovXG4gICAgWDogbnVtYmVyO1xuICAgIC8qKiBUaGUgWSBjb29yZGluYXRlIG9mIHRoZSBvcmlnaW4uICovXG4gICAgWTogbnVtYmVyO1xuICAgIC8qKiBUaGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZS4gKi9cbiAgICBXaWR0aDogbnVtYmVyO1xuICAgIC8qKiBUaGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUuICovXG4gICAgSGVpZ2h0OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2NyZWVuIHtcbiAgICAvKiogVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBzY3JlZW4uICovXG4gICAgSUQ6IHN0cmluZztcbiAgICAvKiogSHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgc2NyZWVuLiAqL1xuICAgIE5hbWU6IHN0cmluZztcbiAgICAvKiogVGhlIHNjYWxlIGZhY3RvciBvZiB0aGUgc2NyZWVuIChEUEkvOTYpLiAxID0gc3RhbmRhcmQgRFBJLCAyID0gSGlEUEkgKFJldGluYSksIGV0Yy4gKi9cbiAgICBTY2FsZUZhY3RvcjogbnVtYmVyO1xuICAgIC8qKiBUaGUgWCBjb29yZGluYXRlIG9mIHRoZSBzY3JlZW4uICovXG4gICAgWDogbnVtYmVyO1xuICAgIC8qKiBUaGUgWSBjb29yZGluYXRlIG9mIHRoZSBzY3JlZW4uICovXG4gICAgWTogbnVtYmVyO1xuICAgIC8qKiBDb250YWlucyB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgc2NyZWVuLiAqL1xuICAgIFNpemU6IFNpemU7XG4gICAgLyoqIENvbnRhaW5zIHRoZSBib3VuZHMgb2YgdGhlIHNjcmVlbiBpbiB0ZXJtcyBvZiBYLCBZLCBXaWR0aCwgYW5kIEhlaWdodC4gKi9cbiAgICBCb3VuZHM6IFJlY3Q7XG4gICAgLyoqIENvbnRhaW5zIHRoZSBwaHlzaWNhbCBib3VuZHMgb2YgdGhlIHNjcmVlbiBpbiB0ZXJtcyBvZiBYLCBZLCBXaWR0aCwgYW5kIEhlaWdodCAoYmVmb3JlIHNjYWxpbmcpLiAqL1xuICAgIFBoeXNpY2FsQm91bmRzOiBSZWN0O1xuICAgIC8qKiBDb250YWlucyB0aGUgYXJlYSBvZiB0aGUgc2NyZWVuIHRoYXQgaXMgYWN0dWFsbHkgdXNhYmxlIChleGNsdWRpbmcgdGFza2JhciBhbmQgb3RoZXIgc3lzdGVtIFVJKS4gKi9cbiAgICBXb3JrQXJlYTogUmVjdDtcbiAgICAvKiogQ29udGFpbnMgdGhlIHBoeXNpY2FsIFdvcmtBcmVhIG9mIHRoZSBzY3JlZW4gKGJlZm9yZSBzY2FsaW5nKS4gKi9cbiAgICBQaHlzaWNhbFdvcmtBcmVhOiBSZWN0O1xuICAgIC8qKiBUcnVlIGlmIHRoaXMgaXMgdGhlIHByaW1hcnkgbW9uaXRvciBzZWxlY3RlZCBieSB0aGUgdXNlciBpbiB0aGUgb3BlcmF0aW5nIHN5c3RlbS4gKi9cbiAgICBJc1ByaW1hcnk6IGJvb2xlYW47XG4gICAgLyoqIFRoZSByb3RhdGlvbiBvZiB0aGUgc2NyZWVuLiAqL1xuICAgIFJvdGF0aW9uOiBudW1iZXI7XG59XG5cbmltcG9ydCB7IG5ld1J1bnRpbWVDYWxsZXIsIG9iamVjdE5hbWVzIH0gZnJvbSBcIi4vcnVudGltZS5qc1wiO1xuY29uc3QgY2FsbCA9IG5ld1J1bnRpbWVDYWxsZXIob2JqZWN0TmFtZXMuU2NyZWVucyk7XG5cbmNvbnN0IGdldEFsbCA9IDA7XG5jb25zdCBnZXRQcmltYXJ5ID0gMTtcbmNvbnN0IGdldEN1cnJlbnQgPSAyO1xuXG4vKipcbiAqIEdldHMgYWxsIHNjcmVlbnMuXG4gKlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgb2YgU2NyZWVuIG9iamVjdHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBHZXRBbGwoKTogUHJvbWlzZTxTY3JlZW5bXT4ge1xuICAgIHJldHVybiBjYWxsKGdldEFsbCk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgcHJpbWFyeSBzY3JlZW4uXG4gKlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHByaW1hcnkgc2NyZWVuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gR2V0UHJpbWFyeSgpOiBQcm9taXNlPFNjcmVlbj4ge1xuICAgIHJldHVybiBjYWxsKGdldFByaW1hcnkpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGN1cnJlbnQgYWN0aXZlIHNjcmVlbi5cbiAqXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBjdXJyZW50IGFjdGl2ZSBzY3JlZW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBHZXRDdXJyZW50KCk6IFByb21pc2U8U2NyZWVuPiB7XG4gICAgcmV0dXJuIGNhbGwoZ2V0Q3VycmVudCk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7OztBQ0FBO0FBQUE7QUFBQTtBQUFBO0FBQUE7OztBQ0FBO0FBQUE7QUFBQTtBQUFBOzs7QUM2QkEs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QU8sSUFBSSxJQUFJLFlBQVksSUFBSSxFQUFFLE9BQU8sSUFBSSxDQUFDO0FBQUEsTUFDakQ7QUFBQSxJQUNKO0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFDSjs7O0FDMUdBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQXdEQSxJQUFNQyxRQUFPLGlCQUFpQixZQUFZLE9BQU87QUFFakQsSUFBTSxTQUFTO0FBQ2YsSUFBTSxhQUFhO0FBQ25CLElBQU0sYUFBYTtBQU9aLFNBQVMsU0FBNEI7QUFDeEMsU0FBT0EsTUFBSyxNQUFNO0FBQ3RCO0FBT08sU0FBUyxhQUE4QjtBQUMxQyxTQUFPQSxNQUFLLFVBQVU7QUFDMUI7QUFPTyxTQUFTLGFBQThCO0FBQzFDLFNBQU9BLE1BQUssVUFBVTtBQUMxQjs7O0F0QjVFQSxPQUFPLFNBQVMsT0FBTyxVQUFVLENBQUM7QUE0Q2xDLE9BQU8sT0FBTyxTQUFnQjtBQUN2QixPQUFPLHFCQUFxQjsiLAogICJuYW1lcyI6IFsiX2EiLCAiRXJyb3IiLCAiY2FsbCIsICJfYSIsICJFcnJvciIsICJjYWxsIiwgIl9hIiwgInJlc2l6YWJsZSIsICJjYWxsIiwgIl9hIiwgImNhbGwiLCAiY2FsbCIsICJIaWRlTWV0aG9kIiwgIlNob3dNZXRob2QiLCAiaXNEb2N1bWVudERvdEFsbCIsICJfYSIsICJyZWFzb24iLCAidmFsdWUiLCAiY2FsbCIsICJnZXRBbmREZWxldGVSZXNwb25zZSIsICJnZW5lcmF0ZUlEIiwgImNhbGwiLCAiQXJyYXkiLCAiTWFwIiwgIkFycmF5IiwgIk1hcCIsICJrZXkiLCAiY2FsbCJdCn0K diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/system.ts b/v3/internal/runtime/desktop/@wailsio/runtime/src/system.ts index cc160d03b..aa95ecd24 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/src/system.ts +++ b/v3/internal/runtime/desktop/@wailsio/runtime/src/system.ts @@ -10,7 +10,7 @@ The electron alternative for Go import { newRuntimeCaller, objectNames } from "./runtime.js"; -let call = newRuntimeCaller(objectNames.System); +const call = newRuntimeCaller(objectNames.System); const SystemIsDarkMode = 0; const SystemEnvironment = 1; From f769fb3953ea25c19b033d14e49e939de1e219f9 Mon Sep 17 00:00:00 2001 From: Fabio Massaioli Date: Tue, 25 Feb 2025 19:12:54 +0100 Subject: [PATCH 073/374] Update node action version --- .github/workflows/publish-npm.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish-npm.yml b/.github/workflows/publish-npm.yml index ec592edff..93089d3d8 100644 --- a/.github/workflows/publish-npm.yml +++ b/.github/workflows/publish-npm.yml @@ -25,7 +25,7 @@ jobs: repo-token: ${{ secrets.GITHUB_TOKEN }} - name: Use Node.js 20 - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: "20" From fa498f1c5e758e3d7c35c7cbf29bf005ae422978 Mon Sep 17 00:00:00 2001 From: Zach Botterman Date: Tue, 25 Feb 2025 11:20:43 -0800 Subject: [PATCH 074/374] encode user data on windows --- .../services/notifications/notifications.go | 6 +- .../notifications/notifications_windows.go | 76 ++++++++++++++----- 2 files changed, 58 insertions(+), 24 deletions(-) diff --git a/v3/pkg/services/notifications/notifications.go b/v3/pkg/services/notifications/notifications.go index 1a3102a08..a40177af2 100644 --- a/v3/pkg/services/notifications/notifications.go +++ b/v3/pkg/services/notifications/notifications.go @@ -12,7 +12,7 @@ var NotificationService *Service type NotificationAction = struct { ID string `json:"id,omitempty"` Title string `json:"title,omitempty"` - Destructive bool `json:"destructive,omitempty"` // macOS only + Destructive bool `json:"destructive,omitempty"` // (macOS-specific) } // NotificationCategory groups actions for notifications @@ -28,7 +28,7 @@ type NotificationCategory = struct { type NotificationOptions = struct { ID string `json:"id,omitempty"` Title string `json:"title,omitempty"` - Subtitle string `json:"subtitle,omitempty"` + Subtitle string `json:"subtitle,omitempty"` // (macOS-specific) Body string `json:"body,omitempty"` CategoryID string `json:"categoryId,omitempty"` Data map[string]interface{} `json:"data,omitempty"` @@ -42,7 +42,7 @@ type NotificationResponse = struct { ActionIdentifier string `json:"actionIdentifier,omitempty"` CategoryID string `json:"categoryIdentifier,omitempty"` Title string `json:"title,omitempty"` - Subtitle string `json:"subtitle,omitempty"` + Subtitle string `json:"subtitle,omitempty"` // (macOS-specific) Body string `json:"body,omitempty"` UserText string `json:"userText,omitempty"` UserInfo map[string]interface{} `json:"userInfo,omitempty"` diff --git a/v3/pkg/services/notifications/notifications_windows.go b/v3/pkg/services/notifications/notifications_windows.go index 04dd6bc72..390679b06 100644 --- a/v3/pkg/services/notifications/notifications_windows.go +++ b/v3/pkg/services/notifications/notifications_windows.go @@ -4,6 +4,7 @@ package notifications import ( "context" + "encoding/base64" "encoding/json" "fmt" "os" @@ -19,9 +20,11 @@ import ( var NotificationLock sync.RWMutex var NotificationCategories = make(map[string]NotificationCategory) -const ( - dataSeparator = ":::" -) +// NotificationPayload combines the action ID and user data into a single structure +type NotificationPayload struct { + Action string `json:"action"` + Data map[string]interface{} `json:"data,omitempty"` +} // Creates a new Notifications Service. func New() *Service { @@ -103,17 +106,13 @@ func (ns *Service) SendNotification(options NotificationOptions) error { } if options.Data != nil { - jsonData, err := json.Marshal(options.Data) + encodedPayload, err := encodePayload(DefaultActionIdentifier, options.Data) if err == nil { - n.ActivationArguments = DefaultActionIdentifier + dataSeparator + strings.ReplaceAll(string(jsonData), "\"", "'") + n.ActivationArguments = encodedPayload } } - err := n.Push() - if err != nil { - return err - } - return nil + return n.Push() } // SendNotificationWithActions sends a notification with additional actions and inputs. @@ -142,7 +141,6 @@ func (ns *Service) SendNotificationWithActions(options NotificationOptions) erro if nCategory.HasReplyField { n.Inputs = append(n.Inputs, toast.Input{ ID: "userText", - Title: nCategory.ReplyButtonTitle, Placeholder: nCategory.ReplyPlaceholder, }) @@ -154,11 +152,10 @@ func (ns *Service) SendNotificationWithActions(options NotificationOptions) erro } if options.Data != nil { - jsonData, err := json.Marshal(options.Data) - if err == nil { - n.ActivationArguments = DefaultActionIdentifier + dataSeparator + strings.ReplaceAll(string(jsonData), "\"", "'") - for index := range n.Actions { - n.Actions[index].Arguments = n.Actions[index].Arguments + dataSeparator + strings.ReplaceAll(string(jsonData), "\"", "'") + for index := range n.Actions { + encodedPayload, err := encodePayload(n.Actions[index].Arguments, options.Data) + if err == nil { + n.Actions[index].Arguments = encodedPayload } } } @@ -225,12 +222,49 @@ func (ns *Service) RemoveNotification(identifier string) error { return nil } -func parseNotificationResponse(response string) (action string, data string) { - parts := strings.Split(response, dataSeparator) - if len(parts) == 1 { - return parts[0], "" +// encodePayload combines an action ID and user data into a single encoded string +func encodePayload(actionID string, data map[string]interface{}) (string, error) { + payload := NotificationPayload{ + Action: actionID, + Data: data, } - return parts[0], parts[1] + + jsonData, err := json.Marshal(payload) + if err != nil { + return actionID, err + } + + encodedPayload := base64.StdEncoding.EncodeToString(jsonData) + return encodedPayload, nil +} + +// decodePayload extracts the action ID and user data from an encoded payload +func decodePayload(encodedString string) (string, map[string]interface{}, error) { + jsonData, err := base64.StdEncoding.DecodeString(encodedString) + if err != nil { + return encodedString, nil, nil + } + + var payload NotificationPayload + if err := json.Unmarshal(jsonData, &payload); err != nil { + return encodedString, nil, nil + } + + return payload.Action, payload.Data, nil +} + +// parseNotificationResponse updated to use structured payload decoding +func parseNotificationResponse(response string) (action string, data string) { + actionID, userData, _ := decodePayload(response) + + if userData != nil { + userDataJSON, err := json.Marshal(userData) + if err == nil { + return actionID, string(userDataJSON) + } + } + + return actionID, "" } // Is there a better way for me to grab this from the Wails config? From 050e4ef1a81cf545b1f6753ec0f022ac9281c8ab Mon Sep 17 00:00:00 2001 From: Zach Botterman Date: Tue, 25 Feb 2025 11:27:54 -0800 Subject: [PATCH 075/374] fix default complex action --- v3/examples/notifications/main.go | 20 +++++-------------- .../notifications/notifications_windows.go | 7 +++---- 2 files changed, 8 insertions(+), 19 deletions(-) diff --git a/v3/examples/notifications/main.go b/v3/examples/notifications/main.go index a1d34dd5e..9dbc07c23 100644 --- a/v3/examples/notifications/main.go +++ b/v3/examples/notifications/main.go @@ -19,7 +19,7 @@ func main() { notificationService := notifications.New() app := application.New(application.Options{ - Name: "notifications_demo", + Name: "Notifications", Description: "A demo of using raw HTML & CSS", Services: []application.Service{ application.NewService(notificationService), @@ -33,7 +33,7 @@ func main() { }) app.NewWebviewWindowWithOptions(application.WebviewWindowOptions{ - Title: "Window 1", + Title: "Notifications", Mac: application.MacWindow{ InvisibleTitleBarHeight: 50, Backdrop: application.MacBackdropTranslucent, @@ -58,13 +58,8 @@ func main() { }) time.Sleep(time.Second * 2) - var uuid1 string = "Wails Notification Demo" - if application.Get().Environment().OS == "darwin" { - uuid1 = "uuid1" - } - notificationService.SendNotification(notifications.NotificationOptions{ - ID: uuid1, + ID: "uuid1", Title: "Title!", Body: "Body!", Data: map[string]interface{}{ @@ -76,11 +71,6 @@ func main() { time.Sleep(time.Second * 2) - var uuid2 string = "Wails Notification Demo" - if application.Get().Environment().OS == "darwin" { - uuid2 = "uuid2" - } - notificationService.RegisterNotificationCategory(notifications.NotificationCategory{ ID: "BACKEND_NOTIF", Actions: []notifications.NotificationAction{ @@ -94,9 +84,9 @@ func main() { }) notificationService.SendNotificationWithActions(notifications.NotificationOptions{ - ID: uuid2, + ID: "uuid2", Title: "Complex Backend Notification", - Subtitle: "Should not show on Windows", + Subtitle: "From: Jane Doe", Body: "Is it raining today where you are?", CategoryID: "BACKEND_NOTIF", Data: map[string]interface{}{ diff --git a/v3/pkg/services/notifications/notifications_windows.go b/v3/pkg/services/notifications/notifications_windows.go index 390679b06..f19b9035e 100644 --- a/v3/pkg/services/notifications/notifications_windows.go +++ b/v3/pkg/services/notifications/notifications_windows.go @@ -152,11 +152,10 @@ func (ns *Service) SendNotificationWithActions(options NotificationOptions) erro } if options.Data != nil { + n.ActivationArguments, _ = encodePayload(n.ActivationArguments, options.Data) + for index := range n.Actions { - encodedPayload, err := encodePayload(n.Actions[index].Arguments, options.Data) - if err == nil { - n.Actions[index].Arguments = encodedPayload - } + n.Actions[index].Arguments, _ = encodePayload(n.Actions[index].Arguments, options.Data) } } From 60c1a866f3fc54bc14a0975276789caff15712f8 Mon Sep 17 00:00:00 2001 From: Zach Botterman Date: Tue, 25 Feb 2025 11:37:11 -0800 Subject: [PATCH 076/374] update example --- .../v3/pkg/services/notifications/models.js | 4 +- .../v3/pkg/services/notifications/service.js | 47 +++++++++++++------ v3/examples/notifications/frontend/main.js | 10 ++-- 3 files changed, 39 insertions(+), 22 deletions(-) diff --git a/v3/examples/notifications/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/models.js b/v3/examples/notifications/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/models.js index c52cbf1c2..1b53de966 100644 --- a/v3/examples/notifications/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/models.js +++ b/v3/examples/notifications/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/models.js @@ -11,7 +11,7 @@ import {Create as $Create} from "@wailsio/runtime"; * @typedef {Object} NotificationAction * @property {string} [id] * @property {string} [title] - * @property {boolean} [destructive] - macOS only + * @property {boolean} [destructive] - (macOS-specific) */ /** @@ -29,7 +29,7 @@ import {Create as $Create} from "@wailsio/runtime"; * @typedef {Object} NotificationOptions * @property {string} [id] * @property {string} [title] - * @property {string} [subtitle] + * @property {string} [subtitle] - (macOS-specific) * @property {string} [body] * @property {string} [categoryId] * @property {{ [_: string]: any }} [data] diff --git a/v3/examples/notifications/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/service.js b/v3/examples/notifications/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/service.js index ef81ee81a..85e54340f 100644 --- a/v3/examples/notifications/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/service.js +++ b/v3/examples/notifications/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/service.js @@ -16,7 +16,8 @@ import {Call as $Call, Create as $Create} from "@wailsio/runtime"; import * as $models from "./models.js"; /** - * CheckNotificationAuthorization checks current notification permission status. + * CheckNotificationAuthorization is a Windows stub that always returns true. + * (user authorization is macOS-specific) * @returns {Promise & { cancel(): void }} */ export function CheckNotificationAuthorization() { @@ -47,7 +48,8 @@ export function RegisterNotificationCategory(category) { } /** - * RemoveAllDeliveredNotifications removes all delivered notifications. + * RemoveAllDeliveredNotifications is a Windows stub that always returns nil. + * (macOS-specific) * @returns {Promise & { cancel(): void }} */ export function RemoveAllDeliveredNotifications() { @@ -56,7 +58,8 @@ export function RemoveAllDeliveredNotifications() { } /** - * RemoveAllPendingNotifications removes all pending notifications. + * RemoveAllPendingNotifications is a Windows stub that always returns nil. + * (macOS-specific) * @returns {Promise & { cancel(): void }} */ export function RemoveAllPendingNotifications() { @@ -65,17 +68,29 @@ export function RemoveAllPendingNotifications() { } /** - * RemoveDeliveredNotification removes a delivered notification matching the unique identifier. - * @param {string} identifier + * RemoveDeliveredNotification is a Windows stub that always returns nil. + * (macOS-specific) + * @param {string} $0 * @returns {Promise & { cancel(): void }} */ -export function RemoveDeliveredNotification(identifier) { - let $resultPromise = /** @type {any} */($Call.ByID(149440045, identifier)); +export function RemoveDeliveredNotification($0) { + let $resultPromise = /** @type {any} */($Call.ByID(149440045, $0)); return $resultPromise; } /** - * RemoveNotificationCategory remove a previously registered NotificationCategory. + * RemoveNotification is a Windows stub that always returns nil. + * (Linux-specific) + * @param {string} identifier + * @returns {Promise & { cancel(): void }} + */ +export function RemoveNotification(identifier) { + let $resultPromise = /** @type {any} */($Call.ByID(3702062929, identifier)); + return $resultPromise; +} + +/** + * RemoveNotificationCategory removes a previously registered NotificationCategory. * @param {string} categoryId * @returns {Promise & { cancel(): void }} */ @@ -85,17 +100,19 @@ export function RemoveNotificationCategory(categoryId) { } /** - * RemovePendingNotification removes a pending notification matching the unique identifier. - * @param {string} identifier + * RemovePendingNotification is a Windows stub that always returns nil. + * (macOS-specific) + * @param {string} $0 * @returns {Promise & { cancel(): void }} */ -export function RemovePendingNotification(identifier) { - let $resultPromise = /** @type {any} */($Call.ByID(3872412470, identifier)); +export function RemovePendingNotification($0) { + let $resultPromise = /** @type {any} */($Call.ByID(3872412470, $0)); return $resultPromise; } /** - * RequestUserNotificationAuthorization requests permission for notifications. + * RequestUserNotificationAuthorization is a Windows stub that always returns true, nil. + * (user authorization is macOS-specific) * @returns {Promise & { cancel(): void }} */ export function RequestUserNotificationAuthorization() { @@ -104,7 +121,8 @@ export function RequestUserNotificationAuthorization() { } /** - * SendNotification sends a basic notification with a unique identifier, title, subtitle, and body. + * SendNotification sends a basic notification with a name, title, and body. All other options are ignored on Windows. + * (subtitle and category id are only available on macOS) * @param {$models.NotificationOptions} options * @returns {Promise & { cancel(): void }} */ @@ -117,6 +135,7 @@ export function SendNotification(options) { * SendNotificationWithActions sends a notification with additional actions and inputs. * A NotificationCategory must be registered with RegisterNotificationCategory first. The `CategoryID` must match the registered category. * If a NotificationCategory is not registered a basic notification will be sent. + * (subtitle and category id are only available on macOS) * @param {$models.NotificationOptions} options * @returns {Promise & { cancel(): void }} */ diff --git a/v3/examples/notifications/frontend/main.js b/v3/examples/notifications/frontend/main.js index 64624f34b..718a9fb4f 100644 --- a/v3/examples/notifications/frontend/main.js +++ b/v3/examples/notifications/frontend/main.js @@ -1,14 +1,13 @@ import * as Notifications from "./bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/service"; -import { Events, System } from "@wailsio/runtime"; +import { Events } from "@wailsio/runtime"; const notificationsElement = document.getElementById('notifications'); window.sendNotification = async () => { const granted = await Notifications.RequestUserNotificationAuthorization(); if (granted) { - const id = System.IsWindows() ? "Wails Notification Demo" : crypto.randomUUID() await Notifications.SendNotification({ - id, + id: crypto.randomUUID(), title: "Title", body: "Body!", data: { @@ -33,10 +32,9 @@ window.sendComplexNotification = async () => { replyButtonTitle: "Reply", replyPlaceholder: "Reply to frontend...", }); - - const id = System.IsWindows() ? "Wails Notification Demo" : crypto.randomUUID() + await Notifications.SendNotificationWithActions({ - id, + id: crypto.randomUUID(), title: "Complex Frontend Notification", subtitle: "From: Jane Doe", body: "Is it rainging today where you are?", From ed8cdfa0f6b62f6392b9c935e678a8499ed6cb84 Mon Sep 17 00:00:00 2001 From: Fabio Massaioli Date: Tue, 25 Feb 2025 21:43:35 +0100 Subject: [PATCH 077/374] Support older module resolution approaches --- .github/workflows/build-and-test-v3.yml | 2 +- .github/workflows/publish-npm.yml | 2 +- v3/internal/runtime/desktop/@wailsio/runtime/package.json | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-and-test-v3.yml b/.github/workflows/build-and-test-v3.yml index b7bb78f67..1e585618d 100644 --- a/.github/workflows/build-and-test-v3.yml +++ b/.github/workflows/build-and-test-v3.yml @@ -167,7 +167,7 @@ jobs: - name: Check that the bundled runtime builds working-directory: v3 run: | - npx --yes -p esbuild@latest exit + npx --yes esbuild@latest --version task runtime:build - name: Check that the npm package builds diff --git a/.github/workflows/publish-npm.yml b/.github/workflows/publish-npm.yml index 93089d3d8..b3af5107d 100644 --- a/.github/workflows/publish-npm.yml +++ b/.github/workflows/publish-npm.yml @@ -36,7 +36,7 @@ jobs: - name: Build bundled runtime working-directory: v3 run: | - npx --yes -p esbuild@latest exit + npx --yes esbuild@latest --version task runtime:build - name: Test+Build npm package diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/package.json b/v3/internal/runtime/desktop/@wailsio/runtime/package.json index 4836a125c..6d9e0305c 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/package.json +++ b/v3/internal/runtime/desktop/@wailsio/runtime/package.json @@ -3,6 +3,7 @@ "type": "module", "version": "3.0.0-alpha.57", "description": "Wails Runtime", + "types": "types/index.d.ts", "exports": { "types": "./types/index.d.ts", "import": "./dist/index.js" From 10ae1f6029c61a4ea9d8140828c881f89ec7da8b Mon Sep 17 00:00:00 2001 From: Zach Botterman Date: Tue, 25 Feb 2025 15:04:05 -0800 Subject: [PATCH 078/374] export config from app --- v3/pkg/application/application.go | 4 ++ .../notifications/notifications_windows.go | 52 ++++++++++++++++--- 2 files changed, 50 insertions(+), 6 deletions(-) diff --git a/v3/pkg/application/application.go b/v3/pkg/application/application.go index 21c0792cc..b3a8f6f34 100644 --- a/v3/pkg/application/application.go +++ b/v3/pkg/application/application.go @@ -345,6 +345,10 @@ type App struct { singleInstanceManager *singleInstanceManager } +func (a *App) Config() Options { + return a.options +} + func (a *App) handleWarning(msg string) { if a.options.WarningHandler != nil { a.options.WarningHandler(msg) diff --git a/v3/pkg/services/notifications/notifications_windows.go b/v3/pkg/services/notifications/notifications_windows.go index f19b9035e..63ce34017 100644 --- a/v3/pkg/services/notifications/notifications_windows.go +++ b/v3/pkg/services/notifications/notifications_windows.go @@ -13,6 +13,7 @@ import ( "sync" "git.sr.ht/~jackmordaunt/go-toast/v2" + "github.com/google/uuid" "github.com/wailsapp/wails/v3/pkg/application" "golang.org/x/sys/windows/registry" ) @@ -37,13 +38,20 @@ func New() *Service { // ServiceStartup is called when the service is loaded // Sets an activation callback to emit an event when notifications are interacted with. func (ns *Service) ServiceStartup(ctx context.Context, options application.ServiceOptions) error { - // Need to get App Name and generate a UUID on first launch - // How do we grab the app icon properly? + appName := application.Get().Config().Name + icon := application.Get().Config().Icon + + println(icon) + + guid, err := getGUID(appName) + if err != nil { + return err + } + toast.SetAppData(toast.AppData{ - AppID: "Notifications", - GUID: "{8F2E1A3D-C497-42B6-9E5D-72F8A169B051}", - IconPath: "C:\\Users\\Zach\\Development\\notifications_demo\\build\\appicon.ico", - ActivationExe: "C:\\Users\\Zach\\Development\\notifications_demo\\bin\\Notifications.exe", + AppID: appName, + GUID: guid, + IconPath: "C:\\Users\\Zach\\Development\\notifications_demo\\build\\appicon.ico", }) toast.SetActivationCallback(func(args string, data []toast.UserData) { @@ -348,3 +356,35 @@ func getUserText(data []toast.UserData) (string, bool) { } return "", false } + +func getGUID(name string) (string, error) { + keyPath := `Software\Classes\AppUserModelId\` + name + + k, err := registry.OpenKey(registry.CURRENT_USER, keyPath, registry.QUERY_VALUE) + if err == nil { + guid, _, err := k.GetStringValue("CustomActivator") + k.Close() + if err == nil && guid != "" { + return guid, nil + } + } + + guid := generateGUID() + + k, _, err = registry.CreateKey(registry.CURRENT_USER, keyPath, registry.WRITE) + if err != nil { + return "", fmt.Errorf("failed to create registry key: %w", err) + } + defer k.Close() + + if err := k.SetStringValue("CustomActivator", guid); err != nil { + return "", fmt.Errorf("failed to write GUID to registry: %w", err) + } + + return guid, nil +} + +func generateGUID() string { + guid := uuid.New() + return fmt.Sprintf("{%s}", guid.String()) +} From a4c4ab6c8fcfa4c5c40446ab387ad233fdada100 Mon Sep 17 00:00:00 2001 From: Zach Botterman Date: Tue, 25 Feb 2025 15:55:28 -0800 Subject: [PATCH 079/374] add id to macOS payload --- v3/pkg/services/notifications/notifications_darwin.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v3/pkg/services/notifications/notifications_darwin.m b/v3/pkg/services/notifications/notifications_darwin.m index 3a52bd34b..4a1514e06 100644 --- a/v3/pkg/services/notifications/notifications_darwin.m +++ b/v3/pkg/services/notifications/notifications_darwin.m @@ -24,7 +24,7 @@ didReceiveNotificationResponse:(UNNotificationResponse *)response NSMutableDictionary *payload = [NSMutableDictionary dictionary]; - [payload setObject:response.notification.request.identifier forKey:@"identifier"]; + [payload setObject:response.notification.request.identifier forKey:@"id"]; [payload setObject:response.actionIdentifier forKey:@"actionIdentifier"]; [payload setObject:response.notification.request.content.title ?: @"" forKey:@"title"]; [payload setObject:response.notification.request.content.body ?: @"" forKey:@"body"]; From acad85e6037a40925aa49fff97a61d3fe51ff0bc Mon Sep 17 00:00:00 2001 From: Zach Botterman Date: Tue, 25 Feb 2025 15:59:27 -0800 Subject: [PATCH 080/374] update example --- v3/examples/notifications/main.go | 7 +++++-- v3/pkg/services/notifications/notifications_linux.go | 5 ++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/v3/examples/notifications/main.go b/v3/examples/notifications/main.go index 9dbc07c23..34d711f3e 100644 --- a/v3/examples/notifications/main.go +++ b/v3/examples/notifications/main.go @@ -30,6 +30,9 @@ func main() { Mac: application.MacOptions{ ApplicationShouldTerminateAfterLastWindowClosed: true, }, + Windows: application.WindowsOptions{ + WndClass: "Notifications", + }, }) app.NewWebviewWindowWithOptions(application.WebviewWindowOptions{ @@ -65,7 +68,7 @@ func main() { Data: map[string]interface{}{ "messageId": "msg-123", "senderId": "user-123", - "timestamp": time.Now().String(), + "timestamp": time.Now().Unix(), }, }) @@ -92,7 +95,7 @@ func main() { Data: map[string]interface{}{ "messageId": "msg-456", "senderId": "user-456", - "timestamp": time.Now().String(), + "timestamp": time.Now().Unix(), }, }) } diff --git a/v3/pkg/services/notifications/notifications_linux.go b/v3/pkg/services/notifications/notifications_linux.go index 0248b8bcd..0d97691ff 100644 --- a/v3/pkg/services/notifications/notifications_linux.go +++ b/v3/pkg/services/notifications/notifications_linux.go @@ -38,7 +38,7 @@ func (ns *Service) ServiceStartup(ctx context.Context, options application.Servi return fmt.Errorf("failed to connect to D-Bus session bus: %v", err) } - appName := "Wails Application" + appName := application.Get().Config().Name var iconPath string @@ -52,14 +52,13 @@ func (ns *Service) ServiceStartup(ctx context.Context, options application.Servi ActionIdentifier: action, } - if action == "default" { + if action == "" { response.ActionIdentifier = DefaultActionIdentifier } if target.Signature().String() == "s" { var targetStr string if err := target.Store(&targetStr); err == nil { - // Try to parse as JSON var userInfo map[string]interface{} if err := json.Unmarshal([]byte(targetStr), &userInfo); err == nil { response.UserInfo = userInfo From 60ae0c15985feb466817ccc1d1b4369e6ca3ed51 Mon Sep 17 00:00:00 2001 From: Zach Botterman Date: Tue, 25 Feb 2025 16:25:06 -0800 Subject: [PATCH 081/374] test linux userInfo --- .../notifications/notifications_linux.go | 42 +++++++++---------- .../notifications/notifications_windows.go | 3 +- 2 files changed, 22 insertions(+), 23 deletions(-) diff --git a/v3/pkg/services/notifications/notifications_linux.go b/v3/pkg/services/notifications/notifications_linux.go index 0d97691ff..e63fb6bf3 100644 --- a/v3/pkg/services/notifications/notifications_linux.go +++ b/v3/pkg/services/notifications/notifications_linux.go @@ -4,6 +4,7 @@ package notifications import ( "context" + "encoding/base64" "encoding/json" "fmt" "os" @@ -18,6 +19,7 @@ import ( var NotificationLock sync.RWMutex var NotificationCategories = make(map[string]NotificationCategory) var Notifier shout.Notifier +var appName = application.Get().Config().Name // Creates a new Notifications Service. func New() *Service { @@ -38,8 +40,6 @@ func (ns *Service) ServiceStartup(ctx context.Context, options application.Servi return fmt.Errorf("failed to connect to D-Bus session bus: %v", err) } - appName := application.Get().Config().Name - var iconPath string Notifier, err = shout.NewNotifier(conn, appName, iconPath, func(notificationID, action string, platformData map[string]dbus.Variant, target, notifierResponse dbus.Variant, err error) { @@ -52,26 +52,28 @@ func (ns *Service) ServiceStartup(ctx context.Context, options application.Servi ActionIdentifier: action, } - if action == "" { - response.ActionIdentifier = DefaultActionIdentifier - } - if target.Signature().String() == "s" { var targetStr string if err := target.Store(&targetStr); err == nil { var userInfo map[string]interface{} - if err := json.Unmarshal([]byte(targetStr), &userInfo); err == nil { + userInfoStr, err := base64.StdEncoding.DecodeString(targetStr) + if err != nil { + if err := json.Unmarshal([]byte(targetStr), &userInfo); err == nil { + response.UserInfo = userInfo + } + } + if err := json.Unmarshal(userInfoStr, &userInfo); err == nil { response.UserInfo = userInfo } } } - if notifierResponse.Signature().String() == "s" { - var userText string - if err := notifierResponse.Store(&userText); err == nil { - response.UserText = userText - } - } + // if notifierResponse.Signature().String() == "s" { + // var userText string + // if err := notifierResponse.Store(&userText); err == nil { + // response.UserText = userText + // } + // } if NotificationService != nil { NotificationService.handleNotificationResponse(response) @@ -114,13 +116,13 @@ func (ns *Service) SendNotification(options NotificationOptions) error { Title: options.Title, Body: options.Body, Priority: shout.Normal, - DefaultAction: "default", + DefaultAction: DefaultActionIdentifier, } if options.Data != nil { jsonData, err := json.Marshal(options.Data) if err == nil { - notification.DefaultActionTarget = dbus.MakeVariant(string(jsonData)) + notification.DefaultActionTarget = dbus.MakeVariant(base64.StdEncoding.EncodeToString(jsonData)) } } @@ -141,13 +143,13 @@ func (ns *Service) SendNotificationWithActions(options NotificationOptions) erro Title: options.Title, Body: options.Body, Priority: shout.Normal, - DefaultAction: "default", + DefaultAction: DefaultActionIdentifier, } if options.Data != nil { jsonData, err := json.Marshal(options.Data) if err == nil { - notification.DefaultActionTarget = dbus.MakeVariant(string(jsonData)) + notification.DefaultActionTarget = dbus.MakeVariant(base64.StdEncoding.EncodeToString(jsonData)) } } @@ -162,8 +164,8 @@ func (ns *Service) SendNotificationWithActions(options NotificationOptions) erro if options.Data != nil { jsonData, err := json.Marshal(options.Data) if err == nil { - for i := range notification.Buttons { - notification.Buttons[i].Target = string(jsonData) + for index := range notification.Buttons { + notification.Buttons[index].Target = string(jsonData) } } } @@ -223,8 +225,6 @@ func getConfigFilePath() (string, error) { return "", fmt.Errorf("failed to get user config directory: %v", err) } - appName := "Wails Application" - appConfigDir := filepath.Join(configDir, appName) if err := os.MkdirAll(appConfigDir, 0755); err != nil { return "", fmt.Errorf("failed to create config directory: %v", err) diff --git a/v3/pkg/services/notifications/notifications_windows.go b/v3/pkg/services/notifications/notifications_windows.go index 63ce34017..1e1cf7f9e 100644 --- a/v3/pkg/services/notifications/notifications_windows.go +++ b/v3/pkg/services/notifications/notifications_windows.go @@ -61,9 +61,8 @@ func (ns *Service) ServiceStartup(ctx context.Context, options application.Servi } if userInfo != "" { - jsonStr := strings.ReplaceAll(userInfo, "'", "\"") var userInfoMap map[string]interface{} - if err := json.Unmarshal([]byte(jsonStr), &userInfoMap); err == nil { + if err := json.Unmarshal([]byte(userInfo), &userInfoMap); err == nil { response.UserInfo = userInfoMap } } From 47e5b109c08db3684c9ff1442e45caca0e39a7c3 Mon Sep 17 00:00:00 2001 From: Zach Date: Tue, 25 Feb 2025 16:32:10 -0800 Subject: [PATCH 082/374] add debug --- v3/pkg/services/notifications/notifications_linux.go | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/v3/pkg/services/notifications/notifications_linux.go b/v3/pkg/services/notifications/notifications_linux.go index e63fb6bf3..51bcabb5f 100644 --- a/v3/pkg/services/notifications/notifications_linux.go +++ b/v3/pkg/services/notifications/notifications_linux.go @@ -19,7 +19,7 @@ import ( var NotificationLock sync.RWMutex var NotificationCategories = make(map[string]NotificationCategory) var Notifier shout.Notifier -var appName = application.Get().Config().Name +var appName string // Creates a new Notifications Service. func New() *Service { @@ -31,6 +31,8 @@ func New() *Service { // ServiceStartup is called when the service is loaded func (ns *Service) ServiceStartup(ctx context.Context, options application.ServiceOptions) error { + appName = application.Get().Config().Name + if err := loadCategories(); err != nil { fmt.Printf("Failed to load notification categories: %v\n", err) } @@ -47,6 +49,14 @@ func (ns *Service) ServiceStartup(ctx context.Context, options application.Servi return } + fmt.Printf("\n---------- NOTIFICATION RESPONSE DEBUG ----------\n") + fmt.Printf("notificationID: %s\n", notificationID) + fmt.Printf("action: %s\n", action) + fmt.Printf("platformData: %+v\n", platformData) + fmt.Printf("target: %+v (signature: %s)\n", target, target.Signature()) + fmt.Printf("response: %+v (signature: %s)\n", notifierResponse, notifierResponse.Signature()) + fmt.Printf("----------------------------------------------\n") + response := NotificationResponse{ ID: notificationID, ActionIdentifier: action, From 5ad3d73001b33f8fe3eb6968db36ede702590f54 Mon Sep 17 00:00:00 2001 From: Zach Botterman Date: Tue, 25 Feb 2025 16:40:14 -0800 Subject: [PATCH 083/374] wrangle variants --- .../notifications/notifications_linux.go | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/v3/pkg/services/notifications/notifications_linux.go b/v3/pkg/services/notifications/notifications_linux.go index 51bcabb5f..c6734e83f 100644 --- a/v3/pkg/services/notifications/notifications_linux.go +++ b/v3/pkg/services/notifications/notifications_linux.go @@ -164,22 +164,19 @@ func (ns *Service) SendNotificationWithActions(options NotificationOptions) erro } for _, action := range category.Actions { + var targetStr string = "" + if options.Data != nil { + if jsonData, err := json.Marshal(options.Data); err == nil { + targetStr = base64.StdEncoding.EncodeToString(jsonData) + } + } notification.Buttons = append(notification.Buttons, shout.Button{ Label: action.Title, Action: action.ID, - Target: "", // Will be set below if we have user data + Target: targetStr, }) } - if options.Data != nil { - jsonData, err := json.Marshal(options.Data) - if err == nil { - for index := range notification.Buttons { - notification.Buttons[index].Target = string(jsonData) - } - } - } - return Notifier.Send(options.ID, notification) } From e86cf68b179b013b497ffd1d4e8c3f3ea49ae774 Mon Sep 17 00:00:00 2001 From: Zach Date: Tue, 25 Feb 2025 17:58:24 -0800 Subject: [PATCH 084/374] linux? --- .../notifications/notifications_linux.go | 566 ++++++++++++++---- 1 file changed, 455 insertions(+), 111 deletions(-) diff --git a/v3/pkg/services/notifications/notifications_linux.go b/v3/pkg/services/notifications/notifications_linux.go index c6734e83f..3d575dda6 100644 --- a/v3/pkg/services/notifications/notifications_linux.go +++ b/v3/pkg/services/notifications/notifications_linux.go @@ -4,24 +4,79 @@ package notifications import ( "context" - "encoding/base64" "encoding/json" + "errors" "fmt" "os" + "os/exec" "path/filepath" "sync" - "git.sr.ht/~whereswaldon/shout" "github.com/godbus/dbus/v5" "github.com/wailsapp/wails/v3/pkg/application" ) -var NotificationLock sync.RWMutex -var NotificationCategories = make(map[string]NotificationCategory) -var Notifier shout.Notifier -var appName string +const ( + dbusObjectPath = "/org/freedesktop/Notifications" + dbusNotificationsInterface = "org.freedesktop.Notifications" + signalNotificationClosed = "org.freedesktop.Notifications.NotificationClosed" + signalActionInvoked = "org.freedesktop.Notifications.ActionInvoked" + callGetCapabilities = "org.freedesktop.Notifications.GetCapabilities" + callCloseNotification = "org.freedesktop.Notifications.CloseNotification" -// Creates a new Notifications Service. + MethodNotifySend = "notify-send" + MethodDbus = "dbus" + MethodKdialog = "kdialog" + + notifyChannelBufferSize = 25 +) + +var ( + notificationLock sync.RWMutex + notificationCategories = make(map[string]NotificationCategory) + appName string + initOnce sync.Once +) + +type closedReason uint32 + +func (r closedReason) string() string { + switch r { + case 1: + return "expired" + case 2: + return "dismissed-by-user" + case 3: + return "closed-by-call" + case 4: + return "unknown" + case 5: + return "activated-by-user" + default: + return "other" + } +} + +// internalNotifier handles the actual notification sending via dbus or command line +type notificationContext struct { + ID string + SystemID uint32 + Actions map[string]string // Maps action keys to display labels + UserData map[string]interface{} // The original user data +} + +type internalNotifier struct { + sync.Mutex + method string + dbusConn *dbus.Conn + sendPath string + activeNotifs map[string]uint32 // Maps our notification IDs to system IDs + contexts map[string]*notificationContext // Stores notification contexts by our ID +} + +var notifier *internalNotifier + +// New creates a new Notifications Service func New() *Service { if NotificationService == nil { NotificationService = &Service{} @@ -37,78 +92,236 @@ func (ns *Service) ServiceStartup(ctx context.Context, options application.Servi fmt.Printf("Failed to load notification categories: %v\n", err) } - conn, err := dbus.SessionBus() - if err != nil { - return fmt.Errorf("failed to connect to D-Bus session bus: %v", err) + notifier = &internalNotifier{ + activeNotifs: make(map[string]uint32), + contexts: make(map[string]*notificationContext), } - var iconPath string - - Notifier, err = shout.NewNotifier(conn, appName, iconPath, func(notificationID, action string, platformData map[string]dbus.Variant, target, notifierResponse dbus.Variant, err error) { - if err != nil { - return - } - - fmt.Printf("\n---------- NOTIFICATION RESPONSE DEBUG ----------\n") - fmt.Printf("notificationID: %s\n", notificationID) - fmt.Printf("action: %s\n", action) - fmt.Printf("platformData: %+v\n", platformData) - fmt.Printf("target: %+v (signature: %s)\n", target, target.Signature()) - fmt.Printf("response: %+v (signature: %s)\n", notifierResponse, notifierResponse.Signature()) - fmt.Printf("----------------------------------------------\n") - - response := NotificationResponse{ - ID: notificationID, - ActionIdentifier: action, - } - - if target.Signature().String() == "s" { - var targetStr string - if err := target.Store(&targetStr); err == nil { - var userInfo map[string]interface{} - userInfoStr, err := base64.StdEncoding.DecodeString(targetStr) - if err != nil { - if err := json.Unmarshal([]byte(targetStr), &userInfo); err == nil { - response.UserInfo = userInfo - } - } - if err := json.Unmarshal(userInfoStr, &userInfo); err == nil { - response.UserInfo = userInfo - } - } - } - - // if notifierResponse.Signature().String() == "s" { - // var userText string - // if err := notifierResponse.Store(&userText); err == nil { - // response.UserText = userText - // } - // } - - if NotificationService != nil { - NotificationService.handleNotificationResponse(response) - } + var err error + initOnce.Do(func() { + err = notifier.init() }) - if err != nil { - return fmt.Errorf("failed to create notifier: %v", err) - } - - return nil + return err } // ServiceShutdown is called when the service is unloaded func (ns *Service) ServiceShutdown() error { + if notifier != nil && notifier.dbusConn != nil { + notifier.dbusConn.Close() + } return saveCategories() } +// Initialize the notifier and choose the best available notification method +func (n *internalNotifier) init() error { + var err error + + checkDbus := func() (*dbus.Conn, error) { + conn, err := dbus.SessionBusPrivate() + if err != nil { + return conn, err + } + + if err = conn.Auth(nil); err != nil { + return conn, err + } + + if err = conn.Hello(); err != nil { + return conn, err + } + + obj := conn.Object(dbusNotificationsInterface, dbusObjectPath) + call := obj.Call(callGetCapabilities, 0) + if call.Err != nil { + return conn, call.Err + } + + var ret []string + err = call.Store(&ret) + if err != nil { + return conn, err + } + + // Add a listener for notification signals + err = conn.AddMatchSignal( + dbus.WithMatchObjectPath(dbusObjectPath), + dbus.WithMatchInterface(dbusNotificationsInterface), + ) + if err != nil { + return nil, err + } + + return conn, nil + } + + // Try dbus first + n.dbusConn, err = checkDbus() + if err == nil { + n.method = MethodDbus + // Start the dbus signal listener + go n.startDBusListener() + return nil + } + if n.dbusConn != nil { + n.dbusConn.Close() + n.dbusConn = nil + } + + // Try notify-send + send, err := exec.LookPath("notify-send") + if err == nil { + n.sendPath = send + n.method = MethodNotifySend + return nil + } + + // Try sw-notify-send + send, err = exec.LookPath("sw-notify-send") + if err == nil { + n.sendPath = send + n.method = MethodNotifySend + return nil + } + + // No method available + n.method = "none" + n.sendPath = "" + + return errors.New("no notification method is available") +} + +// startDBusListener listens for DBus signals for notification actions and closures +func (n *internalNotifier) startDBusListener() { + signal := make(chan *dbus.Signal, notifyChannelBufferSize) + n.dbusConn.Signal(signal) + + for s := range signal { + if s == nil || len(s.Body) < 2 { + continue + } + + switch s.Name { + case signalNotificationClosed: + systemID := s.Body[0].(uint32) + reason := closedReason(s.Body[1].(uint32)).string() + n.handleNotificationClosed(systemID, reason) + case signalActionInvoked: + systemID := s.Body[0].(uint32) + actionKey := s.Body[1].(string) + n.handleActionInvoked(systemID, actionKey) + } + } +} + +// handleNotificationClosed processes notification closed signals +func (n *internalNotifier) handleNotificationClosed(systemID uint32, reason string) { + // Find our notification ID for this system ID + var notifID string + var userData map[string]interface{} + + n.Lock() + for id, sysID := range n.activeNotifs { + if sysID == systemID { + notifID = id + // Get the user data from context if available + if ctx, exists := n.contexts[id]; exists { + userData = ctx.UserData + } + break + } + } + n.Unlock() + + if notifID != "" && NotificationService != nil { + response := NotificationResponse{ + ID: notifID, + ActionIdentifier: DefaultActionIdentifier, + UserInfo: userData, + } + + // Add reason to UserInfo or create it if none exists + if response.UserInfo == nil { + response.UserInfo = map[string]interface{}{ + "reason": reason, + } + } else { + response.UserInfo["reason"] = reason + } + + NotificationService.handleNotificationResponse(response) + + // Clean up the context + n.Lock() + delete(n.contexts, notifID) + delete(n.activeNotifs, notifID) + n.Unlock() + } +} + +// handleActionInvoked processes action invoked signals +func (n *internalNotifier) handleActionInvoked(systemID uint32, actionKey string) { + // Find our notification ID and context for this system ID + var notifID string + var ctx *notificationContext + + n.Lock() + for id, sysID := range n.activeNotifs { + if sysID == systemID { + notifID = id + ctx = n.contexts[id] + break + } + } + n.Unlock() + + if notifID != "" && NotificationService != nil { + // First, send the action response with the user data + response := NotificationResponse{ + ID: notifID, + ActionIdentifier: actionKey, + } + + // Include the user data if we have it + if ctx != nil { + response.UserInfo = ctx.UserData + } + + NotificationService.handleNotificationResponse(response) + + // Then, trigger a closed event with "activated-by-user" reason + closeResponse := NotificationResponse{ + ID: notifID, + ActionIdentifier: DefaultActionIdentifier, + } + + // Include the same user data in the close response + if ctx != nil { + closeResponse.UserInfo = ctx.UserData + } else { + closeResponse.UserInfo = map[string]interface{}{} + } + + // Add the reason to the user info + closeResponse.UserInfo["reason"] = closedReason(5).string() // "activated-by-user" + + NotificationService.handleNotificationResponse(closeResponse) + + // Clean up the context + n.Lock() + delete(n.contexts, notifID) + delete(n.activeNotifs, notifID) + n.Unlock() + } +} + // CheckBundleIdentifier is a Linux stub that always returns true. // (bundle identifiers are macOS-specific) -func CheckBundleIdentifier() bool { +func (ns *Service) CheckBundleIdentifier() bool { return true } -// RequestUserNotificationAuthorization is a Linux stub that always returns true, nil. +// RequestUserNotificationAuthorization is a Linux stub that always returns true. // (user authorization is macOS-specific) func (ns *Service) RequestUserNotificationAuthorization() (bool, error) { return true, nil @@ -122,77 +335,191 @@ func (ns *Service) CheckNotificationAuthorization() (bool, error) { // SendNotification sends a basic notification with a unique identifier, title, subtitle, and body. func (ns *Service) SendNotification(options NotificationOptions) error { - notification := shout.Notification{ - Title: options.Title, - Body: options.Body, - Priority: shout.Normal, - DefaultAction: DefaultActionIdentifier, + if notifier == nil { + return errors.New("notification service not initialized") } - if options.Data != nil { - jsonData, err := json.Marshal(options.Data) - if err == nil { - notification.DefaultActionTarget = dbus.MakeVariant(base64.StdEncoding.EncodeToString(jsonData)) + notifier.Lock() + defer notifier.Unlock() + + var ( + systemID uint32 + err error + ) + + switch notifier.method { + case MethodDbus: + systemID, err = notifier.sendViaDbus(options, nil) + case MethodNotifySend: + systemID, err = notifier.sendViaNotifySend(options) + default: + err = errors.New("no notification method is available") + } + + if err == nil && systemID > 0 { + // Store the system ID mapping + notifier.activeNotifs[options.ID] = systemID + + // Create and store the notification context + ctx := ¬ificationContext{ + ID: options.ID, + SystemID: systemID, + UserData: options.Data, } + notifier.contexts[options.ID] = ctx } - return Notifier.Send(options.ID, notification) + return err } -// SendNotificationWithActions sends a notification with additional actions and inputs. +// SendNotificationWithActions sends a notification with additional actions. func (ns *Service) SendNotificationWithActions(options NotificationOptions) error { - NotificationLock.RLock() - category, exists := NotificationCategories[options.CategoryID] - NotificationLock.RUnlock() + if notifier == nil { + return errors.New("notification service not initialized") + } + + notificationLock.RLock() + category, exists := notificationCategories[options.CategoryID] + notificationLock.RUnlock() if !exists { return ns.SendNotification(options) } - notification := shout.Notification{ - Title: options.Title, - Body: options.Body, - Priority: shout.Normal, - DefaultAction: DefaultActionIdentifier, + notifier.Lock() + defer notifier.Unlock() + + var ( + systemID uint32 + err error + ) + + switch notifier.method { + case MethodDbus: + systemID, err = notifier.sendViaDbus(options, &category) + case MethodNotifySend: + // notify-send doesn't support actions, fall back to basic notification + systemID, err = notifier.sendViaNotifySend(options) + default: + err = errors.New("no notification method is available") } - if options.Data != nil { - jsonData, err := json.Marshal(options.Data) - if err == nil { - notification.DefaultActionTarget = dbus.MakeVariant(base64.StdEncoding.EncodeToString(jsonData)) + if err == nil && systemID > 0 { + // Store the system ID mapping + notifier.activeNotifs[options.ID] = systemID + + // Create and store the notification context with actions + ctx := ¬ificationContext{ + ID: options.ID, + SystemID: systemID, + UserData: options.Data, + Actions: make(map[string]string), } - } - for _, action := range category.Actions { - var targetStr string = "" - if options.Data != nil { - if jsonData, err := json.Marshal(options.Data); err == nil { - targetStr = base64.StdEncoding.EncodeToString(jsonData) + // Store action mappings + if exists { + for _, action := range category.Actions { + ctx.Actions[action.ID] = action.Title } } - notification.Buttons = append(notification.Buttons, shout.Button{ - Label: action.Title, - Action: action.ID, - Target: targetStr, - }) + + notifier.contexts[options.ID] = ctx } - return Notifier.Send(options.ID, notification) + return err +} + +// sendViaDbus sends a notification via dbus +func (n *internalNotifier) sendViaDbus(options NotificationOptions, category *NotificationCategory) (result uint32, err error) { + // Prepare actions + var actions []string + if category != nil { + for _, action := range category.Actions { + actions = append(actions, action.ID, action.Title) + } + } + + // Default timeout (-1 means use system default) + timeout := int32(-1) + + // Prepare hints + hints := map[string]dbus.Variant{ + // Normal urgency by default + "urgency": dbus.MakeVariant(byte(1)), + } + + // Add user data to hints if available + if options.Data != nil { + if userData, err := json.Marshal(options.Data); err == nil { + hints["x-wails-user-data"] = dbus.MakeVariant(string(userData)) + } + } + + // Send the notification + obj := n.dbusConn.Object(dbusNotificationsInterface, dbusObjectPath) + dbusArgs := []interface{}{ + appName, // App name + uint32(0), // Replaces ID (0 means new notification) + "", // App icon (empty for now) + options.Title, // Title + options.Body, // Body + actions, // Actions + hints, // Hints + timeout, // Timeout + } + + call := obj.Call("org.freedesktop.Notifications.Notify", 0, dbusArgs...) + if call.Err != nil { + return 0, fmt.Errorf("dbus notification error: %v", call.Err) + } + + err = call.Store(&result) + if err != nil { + return 0, err + } + + return result, nil +} + +// sendViaNotifySend sends a notification via notify-send command +func (n *internalNotifier) sendViaNotifySend(options NotificationOptions) (uint32, error) { + args := []string{ + options.Title, + options.Body, + } + + // Add icon if eventually supported + // if options.Icon != "" { ... } + + // Add urgency (normal by default) + args = append(args, "--urgency=normal") + + // Execute the command + cmd := exec.Command(n.sendPath, args...) + err := cmd.Run() + if err != nil { + return 0, fmt.Errorf("notify-send error: %v", err) + } + + // notify-send doesn't return IDs, so we use 0 + return 0, nil } // RegisterNotificationCategory registers a new NotificationCategory to be used with SendNotificationWithActions. func (ns *Service) RegisterNotificationCategory(category NotificationCategory) error { - NotificationLock.Lock() - NotificationCategories[category.ID] = category - NotificationLock.Unlock() + notificationLock.Lock() + notificationCategories[category.ID] = category + notificationLock.Unlock() + return saveCategories() } // RemoveNotificationCategory removes a previously registered NotificationCategory. func (ns *Service) RemoveNotificationCategory(categoryId string) error { - NotificationLock.Lock() - delete(NotificationCategories, categoryId) - NotificationLock.Unlock() + notificationLock.Lock() + delete(notificationCategories, categoryId) + notificationLock.Unlock() + return saveCategories() } @@ -222,7 +549,24 @@ func (ns *Service) RemoveDeliveredNotification(_ string) error { // RemoveNotification removes a notification by ID (Linux-specific) func (ns *Service) RemoveNotification(identifier string) error { - return Notifier.Remove(identifier) + if notifier == nil || notifier.method != MethodDbus || notifier.dbusConn == nil { + return errors.New("dbus not available for closing notifications") + } + + // Get the system ID for this notification + notifier.Lock() + systemID, exists := notifier.activeNotifs[identifier] + notifier.Unlock() + + if !exists { + return nil // Already closed or unknown + } + + // Call CloseNotification on dbus + obj := notifier.dbusConn.Object(dbusNotificationsInterface, dbusObjectPath) + call := obj.Call(callCloseNotification, 0, systemID) + + return call.Err } // getConfigFilePath returns the path to the configuration file for storing notification categories @@ -247,9 +591,9 @@ func saveCategories() error { return err } - NotificationLock.RLock() - data, err := json.Marshal(NotificationCategories) - NotificationLock.RUnlock() + notificationLock.RLock() + data, err := json.Marshal(notificationCategories) + notificationLock.RUnlock() if err != nil { return fmt.Errorf("failed to marshal notification categories: %v", err) @@ -287,9 +631,9 @@ func loadCategories() error { return fmt.Errorf("failed to unmarshal notification categories: %v", err) } - NotificationLock.Lock() - NotificationCategories = categories - NotificationLock.Unlock() + notificationLock.Lock() + notificationCategories = categories + notificationLock.Unlock() return nil } From db2cab7b7cfd3101e03cc0485a29b01000b55753 Mon Sep 17 00:00:00 2001 From: Zach Botterman Date: Tue, 25 Feb 2025 18:04:08 -0800 Subject: [PATCH 085/374] grab icon from app for notifications on windows --- .../notifications/notifications_windows.go | 41 ++++++++++++------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/v3/pkg/services/notifications/notifications_windows.go b/v3/pkg/services/notifications/notifications_windows.go index 1e1cf7f9e..53a879522 100644 --- a/v3/pkg/services/notifications/notifications_windows.go +++ b/v3/pkg/services/notifications/notifications_windows.go @@ -9,7 +9,6 @@ import ( "fmt" "os" "path/filepath" - "strings" "sync" "git.sr.ht/~jackmordaunt/go-toast/v2" @@ -39,9 +38,6 @@ func New() *Service { // Sets an activation callback to emit an event when notifications are interacted with. func (ns *Service) ServiceStartup(ctx context.Context, options application.ServiceOptions) error { appName := application.Get().Config().Name - icon := application.Get().Config().Icon - - println(icon) guid, err := getGUID(appName) if err != nil { @@ -51,7 +47,7 @@ func (ns *Service) ServiceStartup(ctx context.Context, options application.Servi toast.SetAppData(toast.AppData{ AppID: appName, GUID: guid, - IconPath: "C:\\Users\\Zach\\Development\\notifications_demo\\build\\appicon.ico", + IconPath: filepath.Join(os.TempDir(), appName+guid+".png"), }) toast.SetActivationCallback(func(args string, data []toast.UserData) { @@ -105,11 +101,14 @@ func (ns *Service) CheckNotificationAuthorization() bool { // SendNotification sends a basic notification with a name, title, and body. All other options are ignored on Windows. // (subtitle and category id are only available on macOS) func (ns *Service) SendNotification(options NotificationOptions) error { + if err := saveIconToDir(); err != nil { + fmt.Printf("Error saving icon: %v\n", err) + } + n := toast.Notification{ Title: options.Title, Body: options.Body, ActivationArguments: DefaultActionIdentifier, - Audio: toast.IM, } if options.Data != nil { @@ -127,6 +126,10 @@ func (ns *Service) SendNotification(options NotificationOptions) error { // If a NotificationCategory is not registered a basic notification will be sent. // (subtitle and category id are only available on macOS) func (ns *Service) SendNotificationWithActions(options NotificationOptions) error { + if err := saveIconToDir(); err != nil { + fmt.Printf("Error saving icon: %v\n", err) + } + NotificationLock.RLock() nCategory := NotificationCategories[options.CategoryID] NotificationLock.RUnlock() @@ -135,7 +138,6 @@ func (ns *Service) SendNotificationWithActions(options NotificationOptions) erro Title: options.Title, Body: options.Body, ActivationArguments: DefaultActionIdentifier, - Audio: toast.IM, } for _, action := range nCategory.Actions { @@ -273,18 +275,27 @@ func parseNotificationResponse(response string) (action string, data string) { return actionID, "" } -// Is there a better way for me to grab this from the Wails config? -func getExeName() string { - executable, err := os.Executable() - if err != nil { - return "" +func saveIconToDir() error { + options := application.Get().Config() + appName := options.Name + icon := options.Icon + + if len(icon) == 0 { + return fmt.Errorf("failed to retrieve icon from application") } - return strings.TrimSuffix(filepath.Base(executable), filepath.Ext(executable)) + guid, err := getGUID(appName) + if err != nil { + return fmt.Errorf("failed to retrieve application guid from registry") + } + + iconPath := filepath.Join(os.TempDir(), appName+guid+".png") + + return os.WriteFile(iconPath, icon, 0644) } func saveCategoriesToRegistry() error { - appName := getExeName() + appName := application.Get().Config().Name if appName == "" { return fmt.Errorf("failed to save categories to registry: empty executable name") } @@ -311,7 +322,7 @@ func saveCategoriesToRegistry() error { } func loadCategoriesFromRegistry() error { - appName := getExeName() + appName := application.Get().Config().Name if appName == "" { return fmt.Errorf("failed to save categories to registry: empty executable name") } From e216b3e513acf59f340b32ce6d36b8e105befcd1 Mon Sep 17 00:00:00 2001 From: Zach Botterman Date: Wed, 26 Feb 2025 09:32:32 -0800 Subject: [PATCH 086/374] set icon --- .../notifications/notifications_darwin.go | 7 ++++- .../notifications/notifications_linux.go | 2 ++ .../notifications/notifications_windows.go | 26 ++++++++++++------- 3 files changed, 24 insertions(+), 11 deletions(-) diff --git a/v3/pkg/services/notifications/notifications_darwin.go b/v3/pkg/services/notifications/notifications_darwin.go index f001d6fde..81b6364c4 100644 --- a/v3/pkg/services/notifications/notifications_darwin.go +++ b/v3/pkg/services/notifications/notifications_darwin.go @@ -212,6 +212,11 @@ func (ns *Service) RemoveNotification(identifier string) error { return nil } +// SetIcon is a macOS stub. The application icon is used automatically. +func (ns *Service) SetIcon(_ []byte) { + return +} + //export didReceiveNotificationResponse func didReceiveNotificationResponse(jsonPayload *C.char) { payload := C.GoString(jsonPayload) @@ -221,7 +226,7 @@ func didReceiveNotificationResponse(jsonPayload *C.char) { return } - if response.ActionIdentifier == "com.apple.UNNotificationDefaultActionIdentifier" { + if response.ActionIdentifier == AppleDefaultActionIdentifier { response.ActionIdentifier = DefaultActionIdentifier } diff --git a/v3/pkg/services/notifications/notifications_linux.go b/v3/pkg/services/notifications/notifications_linux.go index c6734e83f..29c5270af 100644 --- a/v3/pkg/services/notifications/notifications_linux.go +++ b/v3/pkg/services/notifications/notifications_linux.go @@ -1,5 +1,7 @@ //go:build linux +// WIP - WILL NOT WORK PROPERLY + package notifications import ( diff --git a/v3/pkg/services/notifications/notifications_windows.go b/v3/pkg/services/notifications/notifications_windows.go index 53a879522..51de4311c 100644 --- a/v3/pkg/services/notifications/notifications_windows.go +++ b/v3/pkg/services/notifications/notifications_windows.go @@ -4,6 +4,7 @@ package notifications import ( "context" + _ "embed" "encoding/base64" "encoding/json" "fmt" @@ -19,6 +20,7 @@ import ( var NotificationLock sync.RWMutex var NotificationCategories = make(map[string]NotificationCategory) +var Icon []byte // NotificationPayload combines the action ID and user data into a single structure type NotificationPayload struct { @@ -101,8 +103,10 @@ func (ns *Service) CheckNotificationAuthorization() bool { // SendNotification sends a basic notification with a name, title, and body. All other options are ignored on Windows. // (subtitle and category id are only available on macOS) func (ns *Service) SendNotification(options NotificationOptions) error { - if err := saveIconToDir(); err != nil { - fmt.Printf("Error saving icon: %v\n", err) + if len(Icon) > 0 { + if err := saveIconToDir(); err != nil { + fmt.Printf("Error saving icon: %v\n", err) + } } n := toast.Notification{ @@ -126,8 +130,10 @@ func (ns *Service) SendNotification(options NotificationOptions) error { // If a NotificationCategory is not registered a basic notification will be sent. // (subtitle and category id are only available on macOS) func (ns *Service) SendNotificationWithActions(options NotificationOptions) error { - if err := saveIconToDir(); err != nil { - fmt.Printf("Error saving icon: %v\n", err) + if len(Icon) > 0 { + if err := saveIconToDir(); err != nil { + fmt.Printf("Error saving icon: %v\n", err) + } } NotificationLock.RLock() @@ -230,6 +236,11 @@ func (ns *Service) RemoveNotification(identifier string) error { return nil } +// SetIcon sets the notifications icon. +func (ns *Service) SetIcon(icon []byte) { + Icon = icon +} + // encodePayload combines an action ID and user data into a single encoded string func encodePayload(actionID string, data map[string]interface{}) (string, error) { payload := NotificationPayload{ @@ -278,11 +289,6 @@ func parseNotificationResponse(response string) (action string, data string) { func saveIconToDir() error { options := application.Get().Config() appName := options.Name - icon := options.Icon - - if len(icon) == 0 { - return fmt.Errorf("failed to retrieve icon from application") - } guid, err := getGUID(appName) if err != nil { @@ -291,7 +297,7 @@ func saveIconToDir() error { iconPath := filepath.Join(os.TempDir(), appName+guid+".png") - return os.WriteFile(iconPath, icon, 0644) + return os.WriteFile(iconPath, Icon, 0644) } func saveCategoriesToRegistry() error { From 6c34e74f0ad3937af94311b9c854b581d92d8d08 Mon Sep 17 00:00:00 2001 From: Fabio Massaioli Date: Wed, 26 Feb 2025 15:36:53 +0100 Subject: [PATCH 087/374] Build runtime before running go tests --- .github/workflows/build-and-test-v3.yml | 114 +++++++++++++++--------- .github/workflows/publish-npm.yml | 13 +-- 2 files changed, 80 insertions(+), 47 deletions(-) diff --git a/.github/workflows/build-and-test-v3.yml b/.github/workflows/build-and-test-v3.yml index 1e585618d..9a4d32f43 100644 --- a/.github/workflows/build-and-test-v3.yml +++ b/.github/workflows/build-and-test-v3.yml @@ -66,9 +66,67 @@ jobs: { title: 'This PR includes changes to runtime build artifacts' } ); + test_js: + name: Run JS Tests + needs: check_approval + runs-on: ubuntu-latest + strategy: + matrix: + node-version: [20.x] + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node-version }} + + - name: Install Task + uses: arduino/setup-task@v2 + with: + version: 3.x + repo-token: ${{ secrets.GITHUB_TOKEN }} + + - name: Install dependencies + working-directory: v3/internal/runtime/desktop/@wailsio/runtime + run: | + npm ci + npx --yes esbuild@latest --version + + - name: Clean build artifacts + working-directory: v3/internal/runtime/desktop/@wailsio/runtime + run: npm run clean + + - name: Type-check runtime + working-directory: v3 + run: task runtime:check + + - name: Test runtime + working-directory: v3 + run: task runtime:test + + - name: Check that the bundled runtime builds + working-directory: v3 + run: task runtime:build + + - name: Check that the npm package builds + working-directory: v3/internal/runtime/desktop/@wailsio/runtime + run: npm run build + + - name: Store runtime build artifacts + uses: actions/upload-artifact@v4 + with: + name: runtime-build-artifacts + path: | + v3/internal/runtime/desktop/@wailsio/runtime/dist/ + v3/internal/runtime/desktop/@wailsio/runtime/types/ + v3/internal/runtime/desktop/@wailsio/runtime/tsconfig.tsbuildinfo + test_go: name: Run Go Tests - needs: check_approval + needs: [check_approval, test_js] runs-on: ${{ matrix.os }} strategy: fail-fast: false @@ -99,6 +157,12 @@ jobs: version: 3.x repo-token: ${{ secrets.GITHUB_TOKEN }} + - name: Retrieve runtime build artifacts + uses: actions/download-artifact@v4 + with: + name: runtime-build-artifacts + path: v3/internal/runtime/desktop/@wailsio/runtime/ + - name: Build Examples working-directory: v3 run: task test:examples @@ -129,50 +193,16 @@ jobs: working-directory: v3 run: task generator:test:check - test_js: - name: Run JS Tests - needs: check_approval + cleanup: + name: Cleanup build artifacts + if: always() + needs: [test_js, test_go] runs-on: ubuntu-latest - strategy: - matrix: - node-version: [20.x] - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v4 + - uses: geekyeggo/delete-artifact@v5 with: - node-version: ${{ matrix.node-version }} - - - name: Install Task - uses: arduino/setup-task@v2 - with: - version: 3.x - repo-token: ${{ secrets.GITHUB_TOKEN }} - - - name: Clean build artifacts - working-directory: v3/internal/runtime/desktop/@wailsio/runtime - run: npm run clean - - - name: Type-check runtime - working-directory: v3 - run: task runtime:check - - - name: Test runtime - working-directory: v3 - run: task runtime:test - - - name: Check that the bundled runtime builds - working-directory: v3 - run: | - npx --yes esbuild@latest --version - task runtime:build - - - name: Check that the npm package builds - working-directory: v3/internal/runtime/desktop/@wailsio/runtime - run: npm run prepack + name: runtime-build-artifacts + failOnError: false test_templates: name: Test Templates diff --git a/.github/workflows/publish-npm.yml b/.github/workflows/publish-npm.yml index b3af5107d..cdf794a2b 100644 --- a/.github/workflows/publish-npm.yml +++ b/.github/workflows/publish-npm.yml @@ -29,22 +29,25 @@ jobs: with: node-version: "20" + - name: Install dependencies + working-directory: v3/internal/runtime/desktop/@wailsio/runtime + run: | + npm ci + npx --yes esbuild@latest --version + - name: Clean build artifacts working-directory: v3/internal/runtime/desktop/@wailsio/runtime run: npm run clean - name: Build bundled runtime working-directory: v3 - run: | - npx --yes esbuild@latest --version - task runtime:build + run: task runtime:build - name: Test+Build npm package working-directory: v3/internal/runtime/desktop/@wailsio/runtime run: | - npm ci npm test - npm run prepack + npm run build - name: Detect npm package changes uses: tj-actions/verify-changed-files@v20 From 5da789c24f59f5709f41c3072fb14b9f073d9112 Mon Sep 17 00:00:00 2001 From: Fabio Massaioli Date: Wed, 26 Feb 2025 16:41:51 +0100 Subject: [PATCH 088/374] Fix creation function types --- v3/internal/generator/render/info.go | 3 +++ .../generator/render/templates/models.js.tmpl | 5 ++++- .../generator/render/templates/models.ts.tmpl | 7 ++++++- .../desktop/@wailsio/runtime/src/create.ts | 15 +++++++-------- 4 files changed, 20 insertions(+), 10 deletions(-) diff --git a/v3/internal/generator/render/info.go b/v3/internal/generator/render/info.go index b3305e3f8..3947f117a 100644 --- a/v3/internal/generator/render/info.go +++ b/v3/internal/generator/render/info.go @@ -50,11 +50,14 @@ func modelinfo(model *collect.ModelInfo, useInterfaces bool) (info modelInfo) { createList.WriteRune('(') for i, param := range model.TypeParams { + param = typeparam(i, param) + if i > 0 { params.WriteRune(',') paramList.WriteString(", ") createList.WriteString(", ") } + params.WriteString(param) paramList.WriteString(param) diff --git a/v3/internal/generator/render/templates/models.js.tmpl b/v3/internal/generator/render/templates/models.js.tmpl index 5fe0db83c..6c0e98b8b 100644 --- a/v3/internal/generator/render/templates/models.js.tmpl +++ b/v3/internal/generator/render/templates/models.js.tmpl @@ -147,7 +147,10 @@ export class {{jsid $model.Name}} { * Given creation functions for each type parameter, * returns a creation function for a concrete instance * of the generic class {{jsid $model.Name}}. - * @template {{$template.Params}} + {{- range $i, $param := $model.TypeParams}} + {{- $param = (typeparam $i $param)}} + * @template [{{$param}}=any] + {{- end}} {{- range $i, $param := $model.TypeParams}} {{- $param = (typeparam $i $param)}} * @param {(source: any) => {{$param -}} } $$createParam{{$param}} diff --git a/v3/internal/generator/render/templates/models.ts.tmpl b/v3/internal/generator/render/templates/models.ts.tmpl index d5ec2a971..a6073af08 100644 --- a/v3/internal/generator/render/templates/models.ts.tmpl +++ b/v3/internal/generator/render/templates/models.ts.tmpl @@ -139,7 +139,12 @@ export {{if $info.IsInterface}}interface{{else}}class{{end}} {{jsid $model.Name} * Creates a new {{jsid $model.Name}} instance from a string or object. {{- end}} */ - static createFrom{{$template.ParamList}}({{if $template.ParamList}} + static createFrom{{if $template.ParamList}}< + {{- range $i, $param := $model.TypeParams}} + {{- $param = (typeparam $i $param)}} + {{- if gt $i 0}}, {{end -}} + {{$param}} = any + {{- end}}>{{end}}({{if $template.ParamList}} {{- range $i, $param := $model.TypeParams}} {{- $param = (typeparam $i $param)}} {{- if gt $i 0}}, {{end -}} diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/create.ts b/v3/internal/runtime/desktop/@wailsio/runtime/src/create.ts index dc3db4aad..72965eaa6 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/src/create.ts +++ b/v3/internal/runtime/desktop/@wailsio/runtime/src/create.ts @@ -11,7 +11,7 @@ The electron alternative for Go /** * Any is a dummy creation function for simple or unknown types. */ -export function Any(source: any): T { +export function Any(source: any): T { return source; } @@ -28,7 +28,7 @@ export function ByteSlice(source: any): string { * and returns an in-place creation function for an array * whose elements are of that type. */ -export function Array(element: (source: any) => T): (source: any) => T[] { +export function Array(element: (source: any) => T): (source: any) => T[] { if (element === Any) { return (source) => (source === null ? [] : source); } @@ -49,7 +49,7 @@ export function Array(element: (source: any) => T): (source: any) => T[] { * and returns an in-place creation function for an object * whose keys and values are of those types. */ -export function Map(key: (source: any) => string, value: (source: any) => V): (source: any) => Record { +export function Map(key: (source: any) => string, value: (source: any) => V): (source: any) => Record { if (value === Any) { return (source) => (source === null ? {} : source); } @@ -69,7 +69,7 @@ export function Map(key: (source: any) => string, value: (source: any) => V): * Nullable takes a creation function for an arbitrary type * and returns a creation function for a nullable value of that type. */ -export function Nullable(element: (source: any) => T): (source: any) => (T | null) { +export function Nullable(element: (source: any) => T): (source: any) => (T | null) { if (element === Any) { return Any; } @@ -81,10 +81,9 @@ export function Nullable(element: (source: any) => T): (source: any) => (T | * Struct takes an object mapping field names to creation functions * and returns an in-place creation function for a struct. */ -export function Struct< - T extends { [_: string]: ((source: any) => any) }, - U extends { [Key in keyof T]?: ReturnType } ->(createField: T): (source: any) => U { +export function Struct(createField: Record any>): + = any>(source: any) => U +{ let allAny = true; for (const name in createField) { if (createField[name] !== Any) { From 368678ca6b35dad2cc4f778cfbe92aa943312d66 Mon Sep 17 00:00:00 2001 From: Fabio Massaioli Date: Wed, 26 Feb 2025 17:36:45 +0100 Subject: [PATCH 089/374] Update changelog --- .github/workflows/build-and-test-v3.yml | 2 +- docs/src/content/docs/changelog.mdx | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build-and-test-v3.yml b/.github/workflows/build-and-test-v3.yml index 9a4d32f43..457ef8dd2 100644 --- a/.github/workflows/build-and-test-v3.yml +++ b/.github/workflows/build-and-test-v3.yml @@ -61,7 +61,7 @@ jobs: 'Please run the following command (or equivalent) in your local wails repo\n' + 'to revert all build artifact changes; then update the PR:\n\n' + ' cd v3/internal/runtime/desktop/@wailsio/runtime &&\n' + - ` git restore -s ${process.env.MERGE_BASE_SHA} -W -S -- dist types &&${"\n"}` + + ` git restore -s ${process.env.MERGE_BASE_SHA} -W -S -- dist types &&\n` + ' git commit -m "Revert build artifact changes"\n', { title: 'This PR includes changes to runtime build artifacts' } ); diff --git a/docs/src/content/docs/changelog.mdx b/docs/src/content/docs/changelog.mdx index db6121866..bd0a924eb 100644 --- a/docs/src/content/docs/changelog.mdx +++ b/docs/src/content/docs/changelog.mdx @@ -94,6 +94,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 -  Fixed skipped service shutdown when quitting application by [@fbbdev](https://github.com/fbbdev) in [#4066](https://github.com/wailsapp/wails/pull/4066) -  Ensure menu updates occur on the main thread by [@leaanthony](https://github.com/leaanthony) - The dragging and resizing mechanism is now more robust and matches expected platform behaviour more closely by [@fbbdev](https://github.com/fbbdev) in [#4100](https://github.com/wailsapp/wails/pull/4100) +- Fixed [#4097](https://github.com/wailsapp/wails/issues/4097) Webpack/angular discards runtime init code by [@fbbdev](https://github.com/fbbdev) in [#4100](https://github.com/wailsapp/wails/pull/4100) ### Changed From 3bdb3ddba359c99a07b38bc06cda61f7adea645e Mon Sep 17 00:00:00 2001 From: Zach Botterman Date: Wed, 26 Feb 2025 12:30:31 -0800 Subject: [PATCH 090/374] use app icon --- .../notifications/notifications_windows.go | 81 ++++---- .../notifications_windows_icon.go | 173 ++++++++++++++++++ 2 files changed, 210 insertions(+), 44 deletions(-) create mode 100644 v3/pkg/services/notifications/notifications_windows_icon.go diff --git a/v3/pkg/services/notifications/notifications_windows.go b/v3/pkg/services/notifications/notifications_windows.go index 51de4311c..ddb71f528 100644 --- a/v3/pkg/services/notifications/notifications_windows.go +++ b/v3/pkg/services/notifications/notifications_windows.go @@ -15,12 +15,24 @@ import ( "git.sr.ht/~jackmordaunt/go-toast/v2" "github.com/google/uuid" "github.com/wailsapp/wails/v3/pkg/application" + "github.com/wailsapp/wails/v3/pkg/w32" "golang.org/x/sys/windows/registry" ) -var NotificationLock sync.RWMutex -var NotificationCategories = make(map[string]NotificationCategory) -var Icon []byte +var ( + NotificationLock sync.RWMutex + NotificationCategories = make(map[string]NotificationCategory) + AppName string + AppGUID string + IconPath string +) + +const ( + ToastRegistryPath = `Software\Classes\AppUserModelId\` + ToastRegistryGuidKey = "CustomActivator" + NotificationCategoriesRegistryPath = `SOFTWARE\%s\NotificationCategories` + NotificationCategoriesRegistryKey = "Categories" +) // NotificationPayload combines the action ID and user data into a single structure type NotificationPayload struct { @@ -39,17 +51,20 @@ func New() *Service { // ServiceStartup is called when the service is loaded // Sets an activation callback to emit an event when notifications are interacted with. func (ns *Service) ServiceStartup(ctx context.Context, options application.ServiceOptions) error { - appName := application.Get().Config().Name + AppName = application.Get().Config().Name - guid, err := getGUID(appName) + guid, err := getGUID() if err != nil { return err } + AppGUID = guid + + IconPath = filepath.Join(os.TempDir(), AppName+guid+".png") toast.SetAppData(toast.AppData{ - AppID: appName, + AppID: AppName, GUID: guid, - IconPath: filepath.Join(os.TempDir(), appName+guid+".png"), + IconPath: IconPath, }) toast.SetActivationCallback(func(args string, data []toast.UserData) { @@ -103,10 +118,8 @@ func (ns *Service) CheckNotificationAuthorization() bool { // SendNotification sends a basic notification with a name, title, and body. All other options are ignored on Windows. // (subtitle and category id are only available on macOS) func (ns *Service) SendNotification(options NotificationOptions) error { - if len(Icon) > 0 { - if err := saveIconToDir(); err != nil { - fmt.Printf("Error saving icon: %v\n", err) - } + if err := saveIconToDir(); err != nil { + fmt.Printf("Error saving icon: %v\n", err) } n := toast.Notification{ @@ -130,10 +143,8 @@ func (ns *Service) SendNotification(options NotificationOptions) error { // If a NotificationCategory is not registered a basic notification will be sent. // (subtitle and category id are only available on macOS) func (ns *Service) SendNotificationWithActions(options NotificationOptions) error { - if len(Icon) > 0 { - if err := saveIconToDir(); err != nil { - fmt.Printf("Error saving icon: %v\n", err) - } + if err := saveIconToDir(); err != nil { + fmt.Printf("Error saving icon: %v\n", err) } NotificationLock.RLock() @@ -236,11 +247,6 @@ func (ns *Service) RemoveNotification(identifier string) error { return nil } -// SetIcon sets the notifications icon. -func (ns *Service) SetIcon(icon []byte) { - Icon = icon -} - // encodePayload combines an action ID and user data into a single encoded string func encodePayload(actionID string, data map[string]interface{}) (string, error) { payload := NotificationPayload{ @@ -287,25 +293,16 @@ func parseNotificationResponse(response string) (action string, data string) { } func saveIconToDir() error { - options := application.Get().Config() - appName := options.Name - - guid, err := getGUID(appName) + icon, err := application.NewIconFromResource(w32.GetModuleHandle(""), uint16(3)) if err != nil { - return fmt.Errorf("failed to retrieve application guid from registry") + return fmt.Errorf("failed to retrieve application icon") } - iconPath := filepath.Join(os.TempDir(), appName+guid+".png") - - return os.WriteFile(iconPath, Icon, 0644) + return saveHIconAsPNG(icon, IconPath) } func saveCategoriesToRegistry() error { - appName := application.Get().Config().Name - if appName == "" { - return fmt.Errorf("failed to save categories to registry: empty executable name") - } - registryPath := fmt.Sprintf(`SOFTWARE\%s\NotificationCategories`, appName) + registryPath := fmt.Sprintf(NotificationCategoriesRegistryPath, AppName) key, _, err := registry.CreateKey( registry.CURRENT_USER, @@ -324,15 +321,11 @@ func saveCategoriesToRegistry() error { return err } - return key.SetStringValue("Categories", string(data)) + return key.SetStringValue(NotificationCategoriesRegistryKey, string(data)) } func loadCategoriesFromRegistry() error { - appName := application.Get().Config().Name - if appName == "" { - return fmt.Errorf("failed to save categories to registry: empty executable name") - } - registryPath := fmt.Sprintf(`SOFTWARE\%s\NotificationCategories`, appName) + registryPath := fmt.Sprintf(NotificationCategoriesRegistryPath, AppName) key, err := registry.OpenKey( registry.CURRENT_USER, @@ -347,7 +340,7 @@ func loadCategoriesFromRegistry() error { } defer key.Close() - data, _, err := key.GetStringValue("Categories") + data, _, err := key.GetStringValue(NotificationCategoriesRegistryKey) if err != nil { return err } @@ -373,12 +366,12 @@ func getUserText(data []toast.UserData) (string, bool) { return "", false } -func getGUID(name string) (string, error) { - keyPath := `Software\Classes\AppUserModelId\` + name +func getGUID() (string, error) { + keyPath := ToastRegistryPath + AppName k, err := registry.OpenKey(registry.CURRENT_USER, keyPath, registry.QUERY_VALUE) if err == nil { - guid, _, err := k.GetStringValue("CustomActivator") + guid, _, err := k.GetStringValue(ToastRegistryGuidKey) k.Close() if err == nil && guid != "" { return guid, nil @@ -393,7 +386,7 @@ func getGUID(name string) (string, error) { } defer k.Close() - if err := k.SetStringValue("CustomActivator", guid); err != nil { + if err := k.SetStringValue(ToastRegistryGuidKey, guid); err != nil { return "", fmt.Errorf("failed to write GUID to registry: %w", err) } diff --git a/v3/pkg/services/notifications/notifications_windows_icon.go b/v3/pkg/services/notifications/notifications_windows_icon.go new file mode 100644 index 000000000..aed560594 --- /dev/null +++ b/v3/pkg/services/notifications/notifications_windows_icon.go @@ -0,0 +1,173 @@ +//go:build windows + +package notifications + +import ( + "image" + "image/color" + "image/png" + "os" + "syscall" + "unsafe" + + "github.com/wailsapp/wails/v3/pkg/w32" +) + +// Windows API constants +const ( + SRCCOPY = 0x00CC0020 + BI_RGB = 0 + DIB_RGB_COLORS = 0 +) + +// Windows structures +type ICONINFO struct { + FIcon int32 + XHotspot int32 + YHotspot int32 + HbmMask syscall.Handle + HbmColor syscall.Handle +} + +type BITMAP struct { + BmType int32 + BmWidth int32 + BmHeight int32 + BmWidthBytes int32 + BmPlanes uint16 + BmBitsPixel uint16 + BmBits uintptr +} + +type BITMAPINFOHEADER struct { + BiSize uint32 + BiWidth int32 + BiHeight int32 + BiPlanes uint16 + BiBitCount uint16 + BiCompression uint32 + BiSizeImage uint32 + BiXPelsPerMeter int32 + BiYPelsPerMeter int32 + BiClrUsed uint32 + BiClrImportant uint32 +} + +type RGBQUAD struct { + RgbBlue byte + RgbGreen byte + RgbRed byte + RgbReserved byte +} + +type BITMAPINFO struct { + BmiHeader BITMAPINFOHEADER + BmiColors [1]RGBQUAD +} + +func saveHIconAsPNG(hIcon w32.HICON, filePath string) error { + // Load necessary DLLs + user32 := syscall.NewLazyDLL("user32.dll") + gdi32 := syscall.NewLazyDLL("gdi32.dll") + + // Get procedures + getIconInfo := user32.NewProc("GetIconInfo") + getObject := gdi32.NewProc("GetObjectW") + createCompatibleDC := gdi32.NewProc("CreateCompatibleDC") + selectObject := gdi32.NewProc("SelectObject") + getDIBits := gdi32.NewProc("GetDIBits") + deleteObject := gdi32.NewProc("DeleteObject") + deleteDC := gdi32.NewProc("DeleteDC") + + // Get icon info + var iconInfo ICONINFO + ret, _, err := getIconInfo.Call( + uintptr(hIcon), + uintptr(unsafe.Pointer(&iconInfo)), + ) + if ret == 0 { + return err + } + defer deleteObject.Call(uintptr(iconInfo.HbmMask)) + defer deleteObject.Call(uintptr(iconInfo.HbmColor)) + + // Get bitmap info + var bmp BITMAP + ret, _, err = getObject.Call( + uintptr(iconInfo.HbmColor), + unsafe.Sizeof(bmp), + uintptr(unsafe.Pointer(&bmp)), + ) + if ret == 0 { + return err + } + + // Create DC + hdc, _, _ := createCompatibleDC.Call(0) + if hdc == 0 { + return syscall.EINVAL + } + defer deleteDC.Call(hdc) + + // Select bitmap into DC + oldBitmap, _, _ := selectObject.Call(hdc, uintptr(iconInfo.HbmColor)) + defer selectObject.Call(hdc, oldBitmap) + + // Prepare bitmap info header + var bi BITMAPINFO + bi.BmiHeader.BiSize = uint32(unsafe.Sizeof(bi.BmiHeader)) + bi.BmiHeader.BiWidth = bmp.BmWidth + bi.BmiHeader.BiHeight = bmp.BmHeight + bi.BmiHeader.BiPlanes = 1 + bi.BmiHeader.BiBitCount = 32 + bi.BmiHeader.BiCompression = BI_RGB + + // Allocate memory for bitmap bits + width, height := int(bmp.BmWidth), int(bmp.BmHeight) + bufferSize := width * height * 4 + bits := make([]byte, bufferSize) + + // Get bitmap bits + ret, _, err = getDIBits.Call( + hdc, + uintptr(iconInfo.HbmColor), + 0, + uintptr(bmp.BmHeight), + uintptr(unsafe.Pointer(&bits[0])), + uintptr(unsafe.Pointer(&bi)), + DIB_RGB_COLORS, + ) + if ret == 0 { + return err + } + + // Create Go image + img := image.NewRGBA(image.Rect(0, 0, width, height)) + + // Convert DIB to RGBA + for y := 0; y < height; y++ { + for x := 0; x < width; x++ { + // DIB is bottom-up, so we need to invert Y + dibIndex := ((height-1-y)*width + x) * 4 + + // BGRA to RGBA + b := bits[dibIndex] + g := bits[dibIndex+1] + r := bits[dibIndex+2] + a := bits[dibIndex+3] + + // Set pixel in the image + img.Set(x, y, color.RGBA{R: r, G: g, B: b, A: a}) + } + } + + // Create output file + outFile, err := os.Create(filePath) + if err != nil { + return err + } + defer outFile.Close() + + // Encode and save the image + return png.Encode(outFile, img) +} From db9e520f08c8348c16fa2a221c2bc0e742630f2f Mon Sep 17 00:00:00 2001 From: Fabio Massaioli Date: Thu, 27 Feb 2025 00:30:48 +0100 Subject: [PATCH 091/374] Use safari11 as esbuild target for High Sierra support --- docs/src/content/docs/changelog.mdx | 2 +- .../bundledassets/runtime.debug.js | 96 +++++++------------ .../assetserver/bundledassets/runtime.js | 2 +- v3/internal/runtime/Taskfile.yaml | 4 +- 4 files changed, 40 insertions(+), 64 deletions(-) diff --git a/docs/src/content/docs/changelog.mdx b/docs/src/content/docs/changelog.mdx index bd0a924eb..67c21f762 100644 --- a/docs/src/content/docs/changelog.mdx +++ b/docs/src/content/docs/changelog.mdx @@ -117,7 +117,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Binding and dialog calls from JS now reject with error objects instead of strings by [@fbbdev](https://github.com/fbbdev) in [#4066](https://github.com/wailsapp/wails/pull/4066) - The JS runtime has been ported to TypeScript by [@fbbdev](https://github.com/fbbdev) in [#4100](https://github.com/wailsapp/wails/pull/4100) - The runtime initialises as soon as it is imported, no need to wait for the window to load by [@fbbdev](https://github.com/fbbdev) in [#4100](https://github.com/wailsapp/wails/pull/4100) -- The runtime does not export an init method anymore. A side-effects import can be used to initialise it by [@fbbdev](https://github.com/fbbdev) in [#4100](https://github.com/wailsapp/wails/pull/4100) +- The runtime does not export an init method anymore. A side effects import can be used to initialise it by [@fbbdev](https://github.com/fbbdev) in [#4100](https://github.com/wailsapp/wails/pull/4100) - Bound methods now return a `CancellablePromise` that rejects with a `CancelError` if cancelled. The actual result of the call is discarded by [@fbbdev](https://github.com/fbbdev) in [#4100](https://github.com/wailsapp/wails/pull/4100) ## v3.0.0-alpha.9 - 2025-01-13 diff --git a/v3/internal/assetserver/bundledassets/runtime.debug.js b/v3/internal/assetserver/bundledassets/runtime.debug.js index 8882ba9ef..fc1340c40 100644 --- a/v3/internal/assetserver/bundledassets/runtime.debug.js +++ b/v3/internal/assetserver/bundledassets/runtime.debug.js @@ -21,26 +21,6 @@ var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; -var __async = (__this, __arguments, generator) => { - return new Promise((resolve, reject) => { - var fulfilled = (value) => { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - }; - var rejected = (value) => { - try { - step(generator.throw(value)); - } catch (e) { - reject(e); - } - }; - var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected); - step((generator = generator.apply(__this, __arguments)).next()); - }); -}; // desktop/@wailsio/runtime/src/index.ts var index_exports = {}; @@ -107,31 +87,29 @@ function newRuntimeCaller(object, windowName = "") { return runtimeCallWithID(object, method, windowName, args); }; } -function runtimeCallWithID(objectID, method, windowName, args) { - return __async(this, null, function* () { - var _a2, _b; - let url = new URL(runtimeURL); - url.searchParams.append("object", objectID.toString()); - url.searchParams.append("method", method.toString()); - if (args) { - url.searchParams.append("args", JSON.stringify(args)); - } - let headers = { - ["x-wails-client-id"]: clientId - }; - if (windowName) { - headers["x-wails-window-name"] = windowName; - } - let response = yield fetch(url, { headers }); - if (!response.ok) { - throw new Error(yield response.text()); - } - if (((_b = (_a2 = response.headers.get("Content-Type")) == null ? void 0 : _a2.indexOf("application/json")) != null ? _b : -1) !== -1) { - return response.json(); - } else { - return response.text(); - } - }); +async function runtimeCallWithID(objectID, method, windowName, args) { + var _a2, _b; + let url = new URL(runtimeURL); + url.searchParams.append("object", objectID.toString()); + url.searchParams.append("method", method.toString()); + if (args) { + url.searchParams.append("args", JSON.stringify(args)); + } + let headers = { + ["x-wails-client-id"]: clientId + }; + if (windowName) { + headers["x-wails-window-name"] = windowName; + } + let response = await fetch(url, { headers }); + if (!response.ok) { + throw new Error(await response.text()); + } + if (((_b = (_a2 = response.headers.get("Content-Type")) == null ? void 0 : _a2.indexOf("application/json")) != null ? _b : -1) !== -1) { + return response.json(); + } else { + return response.text(); + } } // desktop/@wailsio/runtime/src/browser.ts @@ -1018,13 +996,13 @@ function callWindowMethod(windowName, methodName) { const targetWindow = window_default.Get(windowName); const method = targetWindow[methodName]; if (typeof method !== "function") { - console.error(`Window method '${methodName}' not found`); + console.error("Window method '".concat(methodName, "' not found")); return; } try { method.call(targetWindow); } catch (e) { - console.error(`Error calling window method '${methodName}': `, e); + console.error("Error calling window method '".concat(methodName, "': "), e); } } function onWMLTriggered(ev) { @@ -1192,15 +1170,13 @@ function invoke(msg) { function IsDarkMode() { return call4(SystemIsDarkMode); } -function Capabilities() { - return __async(this, null, function* () { - let response = yield fetch("/wails/capabilities"); - if (response.ok) { - return response.json(); - } else { - throw new Error("could not fetch capabilities: " + response.statusText); - } - }); +async function Capabilities() { + let response = await fetch("/wails/capabilities"); + if (response.ok) { + return response.json(); + } else { + throw new Error("could not fetch capabilities: " + response.statusText); + } } function Environment() { return call4(SystemEnvironment); @@ -1886,13 +1862,13 @@ var CancellablePromise = class _CancellablePromise extends Promise { } } ); - }, (cause) => __async(this, null, function* () { + }, async (cause) => { try { return oncancelled == null ? void 0 : oncancelled(cause); } finally { - yield this.cancel(cause); + await this.cancel(cause); } - })); + }); } /** * Attaches a callback for only the rejection of the Promise. @@ -2531,4 +2507,4 @@ export { wml_exports as WML, window_default as Window }; -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2luZGV4LnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy93bWwudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2Jyb3dzZXIudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL25hbm9pZC50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvcnVudGltZS50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvZGlhbG9ncy50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvZXZlbnRzLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9saXN0ZW5lci50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvZXZlbnRfdHlwZXMudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3V0aWxzLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy93aW5kb3cudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL2NvbXBpbGVkL21haW4uanMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3N5c3RlbS50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvY29udGV4dG1lbnUudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2ZsYWdzLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9kcmFnLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9hcHBsaWNhdGlvbi50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvY2FsbHMudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2NhbGxhYmxlLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9jYW5jZWxsYWJsZS50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvY2xpcGJvYXJkLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9jcmVhdGUudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3NjcmVlbnMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vLyBTZXR1cFxud2luZG93Ll93YWlscyA9IHdpbmRvdy5fd2FpbHMgfHwge307XG5cbmltcG9ydCBcIi4vY29udGV4dG1lbnUuanNcIjtcbmltcG9ydCBcIi4vZHJhZy5qc1wiO1xuXG4vLyBSZS1leHBvcnQgcHVibGljIEFQSVxuaW1wb3J0ICogYXMgQXBwbGljYXRpb24gZnJvbSBcIi4vYXBwbGljYXRpb24uanNcIjtcbmltcG9ydCAqIGFzIEJyb3dzZXIgZnJvbSBcIi4vYnJvd3Nlci5qc1wiO1xuaW1wb3J0ICogYXMgQ2FsbCBmcm9tIFwiLi9jYWxscy5qc1wiO1xuaW1wb3J0ICogYXMgQ2xpcGJvYXJkIGZyb20gXCIuL2NsaXBib2FyZC5qc1wiO1xuaW1wb3J0ICogYXMgQ3JlYXRlIGZyb20gXCIuL2NyZWF0ZS5qc1wiO1xuaW1wb3J0ICogYXMgRGlhbG9ncyBmcm9tIFwiLi9kaWFsb2dzLmpzXCI7XG5pbXBvcnQgKiBhcyBFdmVudHMgZnJvbSBcIi4vZXZlbnRzLmpzXCI7XG5pbXBvcnQgKiBhcyBGbGFncyBmcm9tIFwiLi9mbGFncy5qc1wiO1xuaW1wb3J0ICogYXMgU2NyZWVucyBmcm9tIFwiLi9zY3JlZW5zLmpzXCI7XG5pbXBvcnQgKiBhcyBTeXN0ZW0gZnJvbSBcIi4vc3lzdGVtLmpzXCI7XG5pbXBvcnQgV2luZG93IGZyb20gXCIuL3dpbmRvdy5qc1wiO1xuaW1wb3J0ICogYXMgV01MIGZyb20gXCIuL3dtbC5qc1wiO1xuXG5leHBvcnQge1xuICAgIEFwcGxpY2F0aW9uLFxuICAgIEJyb3dzZXIsXG4gICAgQ2FsbCxcbiAgICBDbGlwYm9hcmQsXG4gICAgRGlhbG9ncyxcbiAgICBFdmVudHMsXG4gICAgRmxhZ3MsXG4gICAgU2NyZWVucyxcbiAgICBTeXN0ZW0sXG4gICAgV2luZG93LFxuICAgIFdNTFxufTtcblxuLyoqXG4gKiBBbiBpbnRlcm5hbCB1dGlsaXR5IGNvbnN1bWVkIGJ5IHRoZSBiaW5kaW5nIGdlbmVyYXRvci5cbiAqXG4gKiBAaWdub3JlXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IHsgQ3JlYXRlIH07XG5cbmV4cG9ydCAqIGZyb20gXCIuL2NhbmNlbGxhYmxlLmpzXCI7XG5cbi8vIE5vdGlmeSBiYWNrZW5kXG53aW5kb3cuX3dhaWxzLmludm9rZSA9IFN5c3RlbS5pbnZva2U7XG5TeXN0ZW0uaW52b2tlKFwid2FpbHM6cnVudGltZTpyZWFkeVwiKTtcbiIsICIvKlxuIF8gICAgIF9fICAgICBfIF9fXG58IHwgIC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuaW1wb3J0IHsgT3BlblVSTCB9IGZyb20gXCIuL2Jyb3dzZXIuanNcIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4vZGlhbG9ncy5qc1wiO1xuaW1wb3J0IHsgRW1pdCwgV2FpbHNFdmVudCB9IGZyb20gXCIuL2V2ZW50cy5qc1wiO1xuaW1wb3J0IHsgY2FuQWJvcnRMaXN0ZW5lcnMsIHdoZW5SZWFkeSB9IGZyb20gXCIuL3V0aWxzLmpzXCI7XG5pbXBvcnQgV2luZG93IGZyb20gXCIuL3dpbmRvdy5qc1wiO1xuXG4vKipcbiAqIFNlbmRzIGFuIGV2ZW50IHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIG9wdGlvbmFsIGRhdGEuXG4gKlxuICogQHBhcmFtIGV2ZW50TmFtZSAtIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIHNlbmQuXG4gKiBAcGFyYW0gW2RhdGE9bnVsbF0gLSAtIE9wdGlvbmFsIGRhdGEgdG8gc2VuZCBhbG9uZyB3aXRoIHRoZSBldmVudC5cbiAqL1xuZnVuY3Rpb24gc2VuZEV2ZW50KGV2ZW50TmFtZTogc3RyaW5nLCBkYXRhOiBhbnkgPSBudWxsKTogdm9pZCB7XG4gICAgRW1pdChuZXcgV2FpbHNFdmVudChldmVudE5hbWUsIGRhdGEpKTtcbn1cblxuLyoqXG4gKiBDYWxscyBhIG1ldGhvZCBvbiBhIHNwZWNpZmllZCB3aW5kb3cuXG4gKlxuICogQHBhcmFtIHdpbmRvd05hbWUgLSBUaGUgbmFtZSBvZiB0aGUgd2luZG93IHRvIGNhbGwgdGhlIG1ldGhvZCBvbi5cbiAqIEBwYXJhbSBtZXRob2ROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0byBjYWxsLlxuICovXG5mdW5jdGlvbiBjYWxsV2luZG93TWV0aG9kKHdpbmRvd05hbWU6IHN0cmluZywgbWV0aG9kTmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgdGFyZ2V0V2luZG93ID0gV2luZG93LkdldCh3aW5kb3dOYW1lKTtcbiAgICBjb25zdCBtZXRob2QgPSAodGFyZ2V0V2luZG93IGFzIGFueSlbbWV0aG9kTmFtZV07XG5cbiAgICBpZiAodHlwZW9mIG1ldGhvZCAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFdpbmRvdyBtZXRob2QgJyR7bWV0aG9kTmFtZX0nIG5vdCBmb3VuZGApO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgICAgbWV0aG9kLmNhbGwodGFyZ2V0V2luZG93KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIGNhbGxpbmcgd2luZG93IG1ldGhvZCAnJHttZXRob2ROYW1lfSc6IGAsIGUpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZXNwb25kcyB0byBhIHRyaWdnZXJpbmcgZXZlbnQgYnkgcnVubmluZyBhcHByb3ByaWF0ZSBXTUwgYWN0aW9ucyBmb3IgdGhlIGN1cnJlbnQgdGFyZ2V0LlxuICovXG5mdW5jdGlvbiBvbldNTFRyaWdnZXJlZChldjogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBlbGVtZW50ID0gZXYuY3VycmVudFRhcmdldCBhcyBFbGVtZW50O1xuXG4gICAgZnVuY3Rpb24gcnVuRWZmZWN0KGNob2ljZSA9IFwiWWVzXCIpIHtcbiAgICAgICAgaWYgKGNob2ljZSAhPT0gXCJZZXNcIilcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjb25zdCBldmVudFR5cGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnd21sLWV2ZW50JykgfHwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtd21sLWV2ZW50Jyk7XG4gICAgICAgIGNvbnN0IHRhcmdldFdpbmRvdyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd3bWwtdGFyZ2V0LXdpbmRvdycpIHx8IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXdtbC10YXJnZXQtd2luZG93JykgfHwgXCJcIjtcbiAgICAgICAgY29uc3Qgd2luZG93TWV0aG9kID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3dtbC13aW5kb3cnKSB8fCBlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS13bWwtd2luZG93Jyk7XG4gICAgICAgIGNvbnN0IHVybCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd3bWwtb3BlbnVybCcpIHx8IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXdtbC1vcGVudXJsJyk7XG5cbiAgICAgICAgaWYgKGV2ZW50VHlwZSAhPT0gbnVsbClcbiAgICAgICAgICAgIHNlbmRFdmVudChldmVudFR5cGUpO1xuICAgICAgICBpZiAod2luZG93TWV0aG9kICE9PSBudWxsKVxuICAgICAgICAgICAgY2FsbFdpbmRvd01ldGhvZCh0YXJnZXRXaW5kb3csIHdpbmRvd01ldGhvZCk7XG4gICAgICAgIGlmICh1cmwgIT09IG51bGwpXG4gICAgICAgICAgICB2b2lkIE9wZW5VUkwodXJsKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb25maXJtID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3dtbC1jb25maXJtJykgfHwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtd21sLWNvbmZpcm0nKTtcblxuICAgIGlmIChjb25maXJtKSB7XG4gICAgICAgIFF1ZXN0aW9uKHtcbiAgICAgICAgICAgIFRpdGxlOiBcIkNvbmZpcm1cIixcbiAgICAgICAgICAgIE1lc3NhZ2U6IGNvbmZpcm0sXG4gICAgICAgICAgICBEZXRhY2hlZDogZmFsc2UsXG4gICAgICAgICAgICBCdXR0b25zOiBbXG4gICAgICAgICAgICAgICAgeyBMYWJlbDogXCJZZXNcIiB9LFxuICAgICAgICAgICAgICAgIHsgTGFiZWw6IFwiTm9cIiwgSXNEZWZhdWx0OiB0cnVlIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSkudGhlbihydW5FZmZlY3QpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJ1bkVmZmVjdCgpO1xuICAgIH1cbn1cblxuLy8gUHJpdmF0ZSBmaWVsZCBuYW1lcy5cbmNvbnN0IGNvbnRyb2xsZXJTeW0gPSBTeW1ib2woXCJjb250cm9sbGVyXCIpO1xuY29uc3QgdHJpZ2dlck1hcFN5bSA9IFN5bWJvbChcInRyaWdnZXJNYXBcIik7XG5jb25zdCBlbGVtZW50Q291bnRTeW0gPSBTeW1ib2woXCJlbGVtZW50Q291bnRcIik7XG5cbi8qKlxuICogQWJvcnRDb250cm9sbGVyUmVnaXN0cnkgZG9lcyBub3QgYWN0dWFsbHkgcmVtZW1iZXIgYWN0aXZlIGV2ZW50IGxpc3RlbmVyczogaW5zdGVhZFxuICogaXQgdGllcyB0aGVtIHRvIGFuIEFib3J0U2lnbmFsIGFuZCB1c2VzIGFuIEFib3J0Q29udHJvbGxlciB0byByZW1vdmUgdGhlbSBhbGwgYXQgb25jZS5cbiAqL1xuY2xhc3MgQWJvcnRDb250cm9sbGVyUmVnaXN0cnkge1xuICAgIC8vIFByaXZhdGUgZmllbGRzLlxuICAgIFtjb250cm9sbGVyU3ltXTogQWJvcnRDb250cm9sbGVyO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXNbY29udHJvbGxlclN5bV0gPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBvcHRpb25zIG9iamVjdCBmb3IgYWRkRXZlbnRMaXN0ZW5lciB0aGF0IHRpZXMgdGhlIGxpc3RlbmVyXG4gICAgICogdG8gdGhlIEFib3J0U2lnbmFsIGZyb20gdGhlIGN1cnJlbnQgQWJvcnRDb250cm9sbGVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVsZW1lbnQgLSBBbiBIVE1MIGVsZW1lbnRcbiAgICAgKiBAcGFyYW0gdHJpZ2dlcnMgLSBUaGUgbGlzdCBvZiBhY3RpdmUgV01MIHRyaWdnZXIgZXZlbnRzIGZvciB0aGUgc3BlY2lmaWVkIGVsZW1lbnRzXG4gICAgICovXG4gICAgc2V0KGVsZW1lbnQ6IEVsZW1lbnQsIHRyaWdnZXJzOiBzdHJpbmdbXSk6IEFkZEV2ZW50TGlzdGVuZXJPcHRpb25zIHtcbiAgICAgICAgcmV0dXJuIHsgc2lnbmFsOiB0aGlzW2NvbnRyb2xsZXJTeW1dLnNpZ25hbCB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIHJlZ2lzdGVyZWQgZXZlbnQgbGlzdGVuZXJzIGFuZCByZXNldHMgdGhlIHJlZ2lzdHJ5LlxuICAgICAqL1xuICAgIHJlc2V0KCk6IHZvaWQge1xuICAgICAgICB0aGlzW2NvbnRyb2xsZXJTeW1dLmFib3J0KCk7XG4gICAgICAgIHRoaXNbY29udHJvbGxlclN5bV0gPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgfVxufVxuXG4vKipcbiAqIFdlYWtNYXBSZWdpc3RyeSBtYXBzIGFjdGl2ZSB0cmlnZ2VyIGV2ZW50cyB0byBlYWNoIERPTSBlbGVtZW50IHRocm91Z2ggYSBXZWFrTWFwLlxuICogVGhpcyBlbnN1cmVzIHRoYXQgdGhlIG1hcHBpbmcgcmVtYWlucyBwcml2YXRlIHRvIHRoaXMgbW9kdWxlLCB3aGlsZSBzdGlsbCBhbGxvd2luZyBnYXJiYWdlXG4gKiBjb2xsZWN0aW9uIG9mIHRoZSBpbnZvbHZlZCBlbGVtZW50cy5cbiAqL1xuY2xhc3MgV2Vha01hcFJlZ2lzdHJ5IHtcbiAgICAvKiogU3RvcmVzIHRoZSBjdXJyZW50IGVsZW1lbnQtdG8tdHJpZ2dlciBtYXBwaW5nLiAqL1xuICAgIFt0cmlnZ2VyTWFwU3ltXTogV2Vha01hcDxFbGVtZW50LCBzdHJpbmdbXT47XG4gICAgLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHdpdGggYWN0aXZlIFdNTCB0cmlnZ2Vycy4gKi9cbiAgICBbZWxlbWVudENvdW50U3ltXTogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXNbdHJpZ2dlck1hcFN5bV0gPSBuZXcgV2Vha01hcCgpO1xuICAgICAgICB0aGlzW2VsZW1lbnRDb3VudFN5bV0gPSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgYWN0aXZlIHRyaWdnZXJzIGZvciB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZWxlbWVudCAtIEFuIEhUTUwgZWxlbWVudFxuICAgICAqIEBwYXJhbSB0cmlnZ2VycyAtIFRoZSBsaXN0IG9mIGFjdGl2ZSBXTUwgdHJpZ2dlciBldmVudHMgZm9yIHRoZSBzcGVjaWZpZWQgZWxlbWVudFxuICAgICAqL1xuICAgIHNldChlbGVtZW50OiBFbGVtZW50LCB0cmlnZ2Vyczogc3RyaW5nW10pOiBBZGRFdmVudExpc3RlbmVyT3B0aW9ucyB7XG4gICAgICAgIGlmICghdGhpc1t0cmlnZ2VyTWFwU3ltXS5oYXMoZWxlbWVudCkpIHsgdGhpc1tlbGVtZW50Q291bnRTeW1dKys7IH1cbiAgICAgICAgdGhpc1t0cmlnZ2VyTWFwU3ltXS5zZXQoZWxlbWVudCwgdHJpZ2dlcnMpO1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwgcmVnaXN0ZXJlZCBldmVudCBsaXN0ZW5lcnMuXG4gICAgICovXG4gICAgcmVzZXQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzW2VsZW1lbnRDb3VudFN5bV0gPD0gMClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZG9jdW1lbnQuYm9keS5xdWVyeVNlbGVjdG9yQWxsKCcqJykpIHtcbiAgICAgICAgICAgIGlmICh0aGlzW2VsZW1lbnRDb3VudFN5bV0gPD0gMClcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY29uc3QgdHJpZ2dlcnMgPSB0aGlzW3RyaWdnZXJNYXBTeW1dLmdldChlbGVtZW50KTtcbiAgICAgICAgICAgIGlmICh0cmlnZ2VycyAhPSBudWxsKSB7IHRoaXNbZWxlbWVudENvdW50U3ltXS0tOyB9XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgdHJpZ2dlciBvZiB0cmlnZ2VycyB8fCBbXSlcbiAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodHJpZ2dlciwgb25XTUxUcmlnZ2VyZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpc1t0cmlnZ2VyTWFwU3ltXSA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgIHRoaXNbZWxlbWVudENvdW50U3ltXSA9IDA7XG4gICAgfVxufVxuXG5jb25zdCB0cmlnZ2VyUmVnaXN0cnkgPSBjYW5BYm9ydExpc3RlbmVycygpID8gbmV3IEFib3J0Q29udHJvbGxlclJlZ2lzdHJ5KCkgOiBuZXcgV2Vha01hcFJlZ2lzdHJ5KCk7XG5cbi8qKlxuICogQWRkcyBldmVudCBsaXN0ZW5lcnMgdG8gdGhlIHNwZWNpZmllZCBlbGVtZW50LlxuICovXG5mdW5jdGlvbiBhZGRXTUxMaXN0ZW5lcnMoZWxlbWVudDogRWxlbWVudCk6IHZvaWQge1xuICAgIGNvbnN0IHRyaWdnZXJSZWdFeHAgPSAvXFxTKy9nO1xuICAgIGNvbnN0IHRyaWdnZXJBdHRyID0gKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd3bWwtdHJpZ2dlcicpIHx8IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXdtbC10cmlnZ2VyJykgfHwgXCJjbGlja1wiKTtcbiAgICBjb25zdCB0cmlnZ2Vyczogc3RyaW5nW10gPSBbXTtcblxuICAgIGxldCBtYXRjaDtcbiAgICB3aGlsZSAoKG1hdGNoID0gdHJpZ2dlclJlZ0V4cC5leGVjKHRyaWdnZXJBdHRyKSkgIT09IG51bGwpXG4gICAgICAgIHRyaWdnZXJzLnB1c2gobWF0Y2hbMF0pO1xuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHRyaWdnZXJSZWdpc3RyeS5zZXQoZWxlbWVudCwgdHJpZ2dlcnMpO1xuICAgIGZvciAoY29uc3QgdHJpZ2dlciBvZiB0cmlnZ2VycylcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHRyaWdnZXIsIG9uV01MVHJpZ2dlcmVkLCBvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBTY2hlZHVsZXMgYW4gYXV0b21hdGljIHJlbG9hZCBvZiBXTUwgdG8gYmUgcGVyZm9ybWVkIGFzIHNvb24gYXMgdGhlIGRvY3VtZW50IGlzIGZ1bGx5IGxvYWRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEVuYWJsZSgpOiB2b2lkIHtcbiAgICB3aGVuUmVhZHkoUmVsb2FkKTtcbn1cblxuLyoqXG4gKiBSZWxvYWRzIHRoZSBXTUwgcGFnZSBieSBhZGRpbmcgbmVjZXNzYXJ5IGV2ZW50IGxpc3RlbmVycyBhbmQgYnJvd3NlciBsaXN0ZW5lcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBSZWxvYWQoKTogdm9pZCB7XG4gICAgdHJpZ2dlclJlZ2lzdHJ5LnJlc2V0KCk7XG4gICAgZG9jdW1lbnQuYm9keS5xdWVyeVNlbGVjdG9yQWxsKCdbd21sLWV2ZW50XSwgW3dtbC13aW5kb3ddLCBbd21sLW9wZW51cmxdLCBbZGF0YS13bWwtZXZlbnRdLCBbZGF0YS13bWwtd2luZG93XSwgW2RhdGEtd21sLW9wZW51cmxdJykuZm9yRWFjaChhZGRXTUxMaXN0ZW5lcnMpO1xufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5pbXBvcnQgeyBuZXdSdW50aW1lQ2FsbGVyLCBvYmplY3ROYW1lcyB9IGZyb20gXCIuL3J1bnRpbWUuanNcIjtcblxuY29uc3QgY2FsbCA9IG5ld1J1bnRpbWVDYWxsZXIob2JqZWN0TmFtZXMuQnJvd3Nlcik7XG5cbmNvbnN0IEJyb3dzZXJPcGVuVVJMID0gMDtcblxuLyoqXG4gKiBPcGVuIGEgYnJvd3NlciB3aW5kb3cgdG8gdGhlIGdpdmVuIFVSTC5cbiAqXG4gKiBAcGFyYW0gdXJsIC0gVGhlIFVSTCB0byBvcGVuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBPcGVuVVJMKHVybDogc3RyaW5nIHwgVVJMKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIGNhbGwoQnJvd3Nlck9wZW5VUkwsIHt1cmw6IHVybC50b1N0cmluZygpfSk7XG59XG4iLCAiLy8gU291cmNlOiBodHRwczovL2dpdGh1Yi5jb20vYWkvbmFub2lkXG5cbi8vIFRoZSBNSVQgTGljZW5zZSAoTUlUKVxuLy9cbi8vIENvcHlyaWdodCAyMDE3IEFuZHJleSBTaXRuaWsgPGFuZHJleUBzaXRuaWsucnU+XG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZlxuLy8gdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpblxuLy8gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0b1xuLy8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2Zcbi8vIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbyxcbi8vICAgICBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyAgICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4vLyBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vICAgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTU1xuLy8gRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SXG4vLyBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVJcbi8vIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOXG4vLyBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBUaGlzIGFscGhhYmV0IHVzZXMgYEEtWmEtejAtOV8tYCBzeW1ib2xzLlxuLy8gVGhlIG9yZGVyIG9mIGNoYXJhY3RlcnMgaXMgb3B0aW1pemVkIGZvciBiZXR0ZXIgZ3ppcCBhbmQgYnJvdGxpIGNvbXByZXNzaW9uLlxuLy8gUmVmZXJlbmNlcyB0byB0aGUgc2FtZSBmaWxlICh3b3JrcyBib3RoIGZvciBnemlwIGFuZCBicm90bGkpOlxuLy8gYCd1c2VgLCBgYW5kb21gLCBhbmQgYHJpY3QnYFxuLy8gUmVmZXJlbmNlcyB0byB0aGUgYnJvdGxpIGRlZmF1bHQgZGljdGlvbmFyeTpcbi8vIGAtMjZUYCwgYDE5ODNgLCBgNDBweGAsIGA3NXB4YCwgYGJ1c2hgLCBgamFja2AsIGBtaW5kYCwgYHZlcnlgLCBhbmQgYHdvbGZgXG5jb25zdCB1cmxBbHBoYWJldCA9XG4gICAgJ3VzZWFuZG9tLTI2VDE5ODM0MFBYNzVweEpBQ0tWRVJZTUlOREJVU0hXT0xGX0dRWmJmZ2hqa2xxdnd5enJpY3QnXG5cbmV4cG9ydCBmdW5jdGlvbiBuYW5vaWQoc2l6ZTogbnVtYmVyID0gMjEpOiBzdHJpbmcge1xuICAgIGxldCBpZCA9ICcnXG4gICAgLy8gQSBjb21wYWN0IGFsdGVybmF0aXZlIGZvciBgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGVwOyBpKyspYC5cbiAgICBsZXQgaSA9IHNpemUgfCAwXG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgICAvLyBgfCAwYCBpcyBtb3JlIGNvbXBhY3QgYW5kIGZhc3RlciB0aGFuIGBNYXRoLmZsb29yKClgLlxuICAgICAgICBpZCArPSB1cmxBbHBoYWJldFsoTWF0aC5yYW5kb20oKSAqIDY0KSB8IDBdXG4gICAgfVxuICAgIHJldHVybiBpZFxufVxuIiwgIi8qXG4gXyAgICAgX18gICAgIF8gX19cbnwgfCAgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5pbXBvcnQgeyBuYW5vaWQgfSBmcm9tICcuL25hbm9pZC5qcyc7XG5cbmNvbnN0IHJ1bnRpbWVVUkwgPSB3aW5kb3cubG9jYXRpb24ub3JpZ2luICsgXCIvd2FpbHMvcnVudGltZVwiO1xuXG4vLyBPYmplY3QgTmFtZXNcbmV4cG9ydCBjb25zdCBvYmplY3ROYW1lcyA9IE9iamVjdC5mcmVlemUoe1xuICAgIENhbGw6IDAsXG4gICAgQ2xpcGJvYXJkOiAxLFxuICAgIEFwcGxpY2F0aW9uOiAyLFxuICAgIEV2ZW50czogMyxcbiAgICBDb250ZXh0TWVudTogNCxcbiAgICBEaWFsb2c6IDUsXG4gICAgV2luZG93OiA2LFxuICAgIFNjcmVlbnM6IDcsXG4gICAgU3lzdGVtOiA4LFxuICAgIEJyb3dzZXI6IDksXG4gICAgQ2FuY2VsQ2FsbDogMTAsXG59KTtcbmV4cG9ydCBsZXQgY2xpZW50SWQgPSBuYW5vaWQoKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHJ1bnRpbWUgY2FsbGVyIHdpdGggc3BlY2lmaWVkIElELlxuICpcbiAqIEBwYXJhbSBvYmplY3QgLSBUaGUgb2JqZWN0IHRvIGludm9rZSB0aGUgbWV0aG9kIG9uLlxuICogQHBhcmFtIHdpbmRvd05hbWUgLSBUaGUgbmFtZSBvZiB0aGUgd2luZG93LlxuICogQHJldHVybiBUaGUgbmV3IHJ1bnRpbWUgY2FsbGVyIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbmV3UnVudGltZUNhbGxlcihvYmplY3Q6IG51bWJlciwgd2luZG93TmFtZTogc3RyaW5nID0gJycpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG1ldGhvZDogbnVtYmVyLCBhcmdzOiBhbnkgPSBudWxsKSB7XG4gICAgICAgIHJldHVybiBydW50aW1lQ2FsbFdpdGhJRChvYmplY3QsIG1ldGhvZCwgd2luZG93TmFtZSwgYXJncyk7XG4gICAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVudGltZUNhbGxXaXRoSUQob2JqZWN0SUQ6IG51bWJlciwgbWV0aG9kOiBudW1iZXIsIHdpbmRvd05hbWU6IHN0cmluZywgYXJnczogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICBsZXQgdXJsID0gbmV3IFVSTChydW50aW1lVVJMKTtcbiAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChcIm9iamVjdFwiLCBvYmplY3RJRC50b1N0cmluZygpKTtcbiAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChcIm1ldGhvZFwiLCBtZXRob2QudG9TdHJpbmcoKSk7XG4gICAgaWYgKGFyZ3MpIHsgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoXCJhcmdzXCIsIEpTT04uc3RyaW5naWZ5KGFyZ3MpKTsgfVxuXG4gICAgbGV0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgIFtcIngtd2FpbHMtY2xpZW50LWlkXCJdOiBjbGllbnRJZFxuICAgIH1cbiAgICBpZiAod2luZG93TmFtZSkge1xuICAgICAgICBoZWFkZXJzW1wieC13YWlscy13aW5kb3ctbmFtZVwiXSA9IHdpbmRvd05hbWU7XG4gICAgfVxuXG4gICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7IGhlYWRlcnMgfSk7XG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYXdhaXQgcmVzcG9uc2UudGV4dCgpKTtcbiAgICB9XG5cbiAgICBpZiAoKHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiQ29udGVudC1UeXBlXCIpPy5pbmRleE9mKFwiYXBwbGljYXRpb24vanNvblwiKSA/PyAtMSkgIT09IC0xKSB7XG4gICAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKTtcbiAgICB9XG59XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbmltcG9ydCB7bmV3UnVudGltZUNhbGxlciwgb2JqZWN0TmFtZXN9IGZyb20gXCIuL3J1bnRpbWUuanNcIjtcbmltcG9ydCB7IG5hbm9pZCB9IGZyb20gJy4vbmFub2lkLmpzJztcblxuLy8gc2V0dXBcbndpbmRvdy5fd2FpbHMgPSB3aW5kb3cuX3dhaWxzIHx8IHt9O1xud2luZG93Ll93YWlscy5kaWFsb2dFcnJvckNhbGxiYWNrID0gZGlhbG9nRXJyb3JDYWxsYmFjaztcbndpbmRvdy5fd2FpbHMuZGlhbG9nUmVzdWx0Q2FsbGJhY2sgPSBkaWFsb2dSZXN1bHRDYWxsYmFjaztcblxudHlwZSBQcm9taXNlUmVzb2x2ZXJzID0gT21pdDxQcm9taXNlV2l0aFJlc29sdmVyczxhbnk+LCBcInByb21pc2VcIj47XG5cbmNvbnN0IGNhbGwgPSBuZXdSdW50aW1lQ2FsbGVyKG9iamVjdE5hbWVzLkRpYWxvZyk7XG5jb25zdCBkaWFsb2dSZXNwb25zZXMgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZVJlc29sdmVycz4oKTtcblxuLy8gRGVmaW5lIGNvbnN0YW50cyBmcm9tIHRoZSBgbWV0aG9kc2Agb2JqZWN0IGluIFRpdGxlIENhc2VcbmNvbnN0IERpYWxvZ0luZm8gPSAwO1xuY29uc3QgRGlhbG9nV2FybmluZyA9IDE7XG5jb25zdCBEaWFsb2dFcnJvciA9IDI7XG5jb25zdCBEaWFsb2dRdWVzdGlvbiA9IDM7XG5jb25zdCBEaWFsb2dPcGVuRmlsZSA9IDQ7XG5jb25zdCBEaWFsb2dTYXZlRmlsZSA9IDU7XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3BlbkZpbGVEaWFsb2dPcHRpb25zIHtcbiAgICAvKiogSW5kaWNhdGVzIGlmIGRpcmVjdG9yaWVzIGNhbiBiZSBjaG9zZW4uICovXG4gICAgQ2FuQ2hvb3NlRGlyZWN0b3JpZXM/OiBib29sZWFuO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgZmlsZXMgY2FuIGJlIGNob3Nlbi4gKi9cbiAgICBDYW5DaG9vc2VGaWxlcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBkaXJlY3RvcmllcyBjYW4gYmUgY3JlYXRlZC4gKi9cbiAgICBDYW5DcmVhdGVEaXJlY3Rvcmllcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBoaWRkZW4gZmlsZXMgc2hvdWxkIGJlIHNob3duLiAqL1xuICAgIFNob3dIaWRkZW5GaWxlcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBhbGlhc2VzIHNob3VsZCBiZSByZXNvbHZlZC4gKi9cbiAgICBSZXNvbHZlc0FsaWFzZXM/OiBib29sZWFuO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgbXVsdGlwbGUgc2VsZWN0aW9uIGlzIGFsbG93ZWQuICovXG4gICAgQWxsb3dzTXVsdGlwbGVTZWxlY3Rpb24/OiBib29sZWFuO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgdGhlIGV4dGVuc2lvbiBzaG91bGQgYmUgaGlkZGVuLiAqL1xuICAgIEhpZGVFeHRlbnNpb24/OiBib29sZWFuO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgaGlkZGVuIGV4dGVuc2lvbnMgY2FuIGJlIHNlbGVjdGVkLiAqL1xuICAgIENhblNlbGVjdEhpZGRlbkV4dGVuc2lvbj86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBmaWxlIHBhY2thZ2VzIHNob3VsZCBiZSB0cmVhdGVkIGFzIGRpcmVjdG9yaWVzLiAqL1xuICAgIFRyZWF0c0ZpbGVQYWNrYWdlc0FzRGlyZWN0b3JpZXM/OiBib29sZWFuO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgb3RoZXIgZmlsZSB0eXBlcyBhcmUgYWxsb3dlZC4gKi9cbiAgICBBbGxvd3NPdGhlckZpbGV0eXBlcz86IGJvb2xlYW47XG4gICAgLyoqIEFycmF5IG9mIGZpbGUgZmlsdGVycy4gKi9cbiAgICBGaWx0ZXJzPzogRmlsZUZpbHRlcltdO1xuICAgIC8qKiBUaXRsZSBvZiB0aGUgZGlhbG9nLiAqL1xuICAgIFRpdGxlPzogc3RyaW5nO1xuICAgIC8qKiBNZXNzYWdlIHRvIHNob3cgaW4gdGhlIGRpYWxvZy4gKi9cbiAgICBNZXNzYWdlPzogc3RyaW5nO1xuICAgIC8qKiBUZXh0IHRvIGRpc3BsYXkgb24gdGhlIGJ1dHRvbi4gKi9cbiAgICBCdXR0b25UZXh0Pzogc3RyaW5nO1xuICAgIC8qKiBEaXJlY3RvcnkgdG8gb3BlbiBpbiB0aGUgZGlhbG9nLiAqL1xuICAgIERpcmVjdG9yeT86IHN0cmluZztcbiAgICAvKiogSW5kaWNhdGVzIGlmIHRoZSBkaWFsb2cgc2hvdWxkIGFwcGVhciBkZXRhY2hlZCBmcm9tIHRoZSBtYWluIHdpbmRvdy4gKi9cbiAgICBEZXRhY2hlZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2F2ZUZpbGVEaWFsb2dPcHRpb25zIHtcbiAgICAvKiogRGVmYXVsdCBmaWxlbmFtZSB0byB1c2UgaW4gdGhlIGRpYWxvZy4gKi9cbiAgICBGaWxlbmFtZT86IHN0cmluZztcbiAgICAvKiogSW5kaWNhdGVzIGlmIGRpcmVjdG9yaWVzIGNhbiBiZSBjaG9zZW4uICovXG4gICAgQ2FuQ2hvb3NlRGlyZWN0b3JpZXM/OiBib29sZWFuO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgZmlsZXMgY2FuIGJlIGNob3Nlbi4gKi9cbiAgICBDYW5DaG9vc2VGaWxlcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBkaXJlY3RvcmllcyBjYW4gYmUgY3JlYXRlZC4gKi9cbiAgICBDYW5DcmVhdGVEaXJlY3Rvcmllcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBoaWRkZW4gZmlsZXMgc2hvdWxkIGJlIHNob3duLiAqL1xuICAgIFNob3dIaWRkZW5GaWxlcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBhbGlhc2VzIHNob3VsZCBiZSByZXNvbHZlZC4gKi9cbiAgICBSZXNvbHZlc0FsaWFzZXM/OiBib29sZWFuO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgdGhlIGV4dGVuc2lvbiBzaG91bGQgYmUgaGlkZGVuLiAqL1xuICAgIEhpZGVFeHRlbnNpb24/OiBib29sZWFuO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgaGlkZGVuIGV4dGVuc2lvbnMgY2FuIGJlIHNlbGVjdGVkLiAqL1xuICAgIENhblNlbGVjdEhpZGRlbkV4dGVuc2lvbj86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBmaWxlIHBhY2thZ2VzIHNob3VsZCBiZSB0cmVhdGVkIGFzIGRpcmVjdG9yaWVzLiAqL1xuICAgIFRyZWF0c0ZpbGVQYWNrYWdlc0FzRGlyZWN0b3JpZXM/OiBib29sZWFuO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgb3RoZXIgZmlsZSB0eXBlcyBhcmUgYWxsb3dlZC4gKi9cbiAgICBBbGxvd3NPdGhlckZpbGV0eXBlcz86IGJvb2xlYW47XG4gICAgLyoqIEFycmF5IG9mIGZpbGUgZmlsdGVycy4gKi9cbiAgICBGaWx0ZXJzPzogRmlsZUZpbHRlcltdO1xuICAgIC8qKiBUaXRsZSBvZiB0aGUgZGlhbG9nLiAqL1xuICAgIFRpdGxlPzogc3RyaW5nO1xuICAgIC8qKiBNZXNzYWdlIHRvIHNob3cgaW4gdGhlIGRpYWxvZy4gKi9cbiAgICBNZXNzYWdlPzogc3RyaW5nO1xuICAgIC8qKiBUZXh0IHRvIGRpc3BsYXkgb24gdGhlIGJ1dHRvbi4gKi9cbiAgICBCdXR0b25UZXh0Pzogc3RyaW5nO1xuICAgIC8qKiBEaXJlY3RvcnkgdG8gb3BlbiBpbiB0aGUgZGlhbG9nLiAqL1xuICAgIERpcmVjdG9yeT86IHN0cmluZztcbiAgICAvKiogSW5kaWNhdGVzIGlmIHRoZSBkaWFsb2cgc2hvdWxkIGFwcGVhciBkZXRhY2hlZCBmcm9tIHRoZSBtYWluIHdpbmRvdy4gKi9cbiAgICBEZXRhY2hlZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWVzc2FnZURpYWxvZ09wdGlvbnMge1xuICAgIC8qKiBUaGUgdGl0bGUgb2YgdGhlIGRpYWxvZyB3aW5kb3cuICovXG4gICAgVGl0bGU/OiBzdHJpbmc7XG4gICAgLyoqIFRoZSBtYWluIG1lc3NhZ2UgdG8gc2hvdyBpbiB0aGUgZGlhbG9nLiAqL1xuICAgIE1lc3NhZ2U/OiBzdHJpbmc7XG4gICAgLyoqIEFycmF5IG9mIGJ1dHRvbiBvcHRpb25zIHRvIHNob3cgaW4gdGhlIGRpYWxvZy4gKi9cbiAgICBCdXR0b25zPzogQnV0dG9uW107XG4gICAgLyoqIFRydWUgaWYgdGhlIGRpYWxvZyBzaG91bGQgYXBwZWFyIGRldGFjaGVkIGZyb20gdGhlIG1haW4gd2luZG93IChpZiBhcHBsaWNhYmxlKS4gKi9cbiAgICBEZXRhY2hlZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnV0dG9uIHtcbiAgICAvKiogVGV4dCB0aGF0IGFwcGVhcnMgd2l0aGluIHRoZSBidXR0b24uICovXG4gICAgTGFiZWw/OiBzdHJpbmc7XG4gICAgLyoqIFRydWUgaWYgdGhlIGJ1dHRvbiBzaG91bGQgY2FuY2VsIGFuIG9wZXJhdGlvbiB3aGVuIGNsaWNrZWQuICovXG4gICAgSXNDYW5jZWw/OiBib29sZWFuO1xuICAgIC8qKiBUcnVlIGlmIHRoZSBidXR0b24gc2hvdWxkIGJlIHRoZSBkZWZhdWx0IGFjdGlvbiB3aGVuIHRoZSB1c2VyIHByZXNzZXMgZW50ZXIuICovXG4gICAgSXNEZWZhdWx0PzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWxlRmlsdGVyIHtcbiAgICAvKiogRGlzcGxheSBuYW1lIGZvciB0aGUgZmlsdGVyLCBpdCBjb3VsZCBiZSBcIlRleHQgRmlsZXNcIiwgXCJJbWFnZXNcIiBldGMuICovXG4gICAgRGlzcGxheU5hbWU/OiBzdHJpbmc7XG4gICAgLyoqIFBhdHRlcm4gdG8gbWF0Y2ggZm9yIHRoZSBmaWx0ZXIsIGUuZy4gXCIqLnR4dDsqLm1kXCIgZm9yIHRleHQgbWFya2Rvd24gZmlsZXMuICovXG4gICAgUGF0dGVybj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBIYW5kbGVzIHRoZSByZXN1bHQgb2YgYSBkaWFsb2cgcmVxdWVzdC5cbiAqXG4gKiBAcGFyYW0gaWQgLSBUaGUgaWQgb2YgdGhlIHJlcXVlc3QgdG8gaGFuZGxlIHRoZSByZXN1bHQgZm9yLlxuICogQHBhcmFtIGRhdGEgLSBUaGUgcmVzdWx0IGRhdGEgb2YgdGhlIHJlcXVlc3QuXG4gKiBAcGFyYW0gaXNKU09OIC0gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRhdGEgaXMgSlNPTiBvciBub3QuXG4gKi9cbmZ1bmN0aW9uIGRpYWxvZ1Jlc3VsdENhbGxiYWNrKGlkOiBzdHJpbmcsIGRhdGE6IHN0cmluZywgaXNKU09OOiBib29sZWFuKTogdm9pZCB7XG4gICAgbGV0IHJlc29sdmVycyA9IGdldEFuZERlbGV0ZVJlc3BvbnNlKGlkKTtcbiAgICBpZiAoIXJlc29sdmVycykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGlzSlNPTikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzb2x2ZXJzLnJlc29sdmUoSlNPTi5wYXJzZShkYXRhKSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgICAgICByZXNvbHZlcnMucmVqZWN0KG5ldyBUeXBlRXJyb3IoXCJjb3VsZCBub3QgcGFyc2UgcmVzdWx0OiBcIiArIGVyci5tZXNzYWdlLCB7IGNhdXNlOiBlcnIgfSkpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZXJzLnJlc29sdmUoZGF0YSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEhhbmRsZXMgdGhlIGVycm9yIGZyb20gYSBkaWFsb2cgcmVxdWVzdC5cbiAqXG4gKiBAcGFyYW0gaWQgLSBUaGUgaWQgb2YgdGhlIHByb21pc2UgaGFuZGxlci5cbiAqIEBwYXJhbSBtZXNzYWdlIC0gQW4gZXJyb3IgbWVzc2FnZS5cbiAqL1xuZnVuY3Rpb24gZGlhbG9nRXJyb3JDYWxsYmFjayhpZDogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBnZXRBbmREZWxldGVSZXNwb25zZShpZCk/LnJlamVjdChuZXcgd2luZG93LkVycm9yKG1lc3NhZ2UpKTtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgYW5kIHJlbW92ZXMgdGhlIHJlc3BvbnNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gSUQgZnJvbSB0aGUgZGlhbG9nUmVzcG9uc2VzIG1hcC5cbiAqXG4gKiBAcGFyYW0gaWQgLSBUaGUgSUQgb2YgdGhlIHJlc3BvbnNlIHRvIGJlIHJldHJpZXZlZCBhbmQgcmVtb3ZlZC5cbiAqIEByZXR1cm5zIFRoZSByZXNwb25zZSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBJRCwgaWYgYW55LlxuICovXG5mdW5jdGlvbiBnZXRBbmREZWxldGVSZXNwb25zZShpZDogc3RyaW5nKTogUHJvbWlzZVJlc29sdmVycyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBkaWFsb2dSZXNwb25zZXMuZ2V0KGlkKTtcbiAgICBkaWFsb2dSZXNwb25zZXMuZGVsZXRlKGlkKTtcbiAgICByZXR1cm4gcmVzcG9uc2U7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgdW5pcXVlIElEIHVzaW5nIHRoZSBuYW5vaWQgbGlicmFyeS5cbiAqXG4gKiBAcmV0dXJucyBBIHVuaXF1ZSBJRCB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBkaWFsb2dSZXNwb25zZXMgc2V0LlxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZUlEKCk6IHN0cmluZyB7XG4gICAgbGV0IHJlc3VsdDtcbiAgICBkbyB7XG4gICAgICAgIHJlc3VsdCA9IG5hbm9pZCgpO1xuICAgIH0gd2hpbGUgKGRpYWxvZ1Jlc3BvbnNlcy5oYXMocmVzdWx0KSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBQcmVzZW50cyBhIGRpYWxvZyBvZiBzcGVjaWZpZWQgdHlwZSB3aXRoIHRoZSBnaXZlbiBvcHRpb25zLlxuICpcbiAqIEBwYXJhbSB0eXBlIC0gRGlhbG9nIHR5cGUuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIHRoZSBkaWFsb2cuXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHJlc3VsdCBvZiBkaWFsb2cuXG4gKi9cbmZ1bmN0aW9uIGRpYWxvZyh0eXBlOiBudW1iZXIsIG9wdGlvbnM6IE1lc3NhZ2VEaWFsb2dPcHRpb25zIHwgT3BlbkZpbGVEaWFsb2dPcHRpb25zIHwgU2F2ZUZpbGVEaWFsb2dPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IGlkID0gZ2VuZXJhdGVJRCgpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGRpYWxvZ1Jlc3BvbnNlcy5zZXQoaWQsIHsgcmVzb2x2ZSwgcmVqZWN0IH0pO1xuICAgICAgICBjYWxsKHR5cGUsIE9iamVjdC5hc3NpZ24oeyBcImRpYWxvZy1pZFwiOiBpZCB9LCBvcHRpb25zKSkuY2F0Y2goKGVycjogYW55KSA9PiB7XG4gICAgICAgICAgICBkaWFsb2dSZXNwb25zZXMuZGVsZXRlKGlkKTtcbiAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBQcmVzZW50cyBhbiBpbmZvIGRpYWxvZy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIERpYWxvZyBvcHRpb25zXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBsYWJlbCBvZiB0aGUgY2hvc2VuIGJ1dHRvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEluZm8ob3B0aW9uczogTWVzc2FnZURpYWxvZ09wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4geyByZXR1cm4gZGlhbG9nKERpYWxvZ0luZm8sIG9wdGlvbnMpOyB9XG5cbi8qKlxuICogUHJlc2VudHMgYSB3YXJuaW5nIGRpYWxvZy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIERpYWxvZyBvcHRpb25zLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgbGFiZWwgb2YgdGhlIGNob3NlbiBidXR0b24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBXYXJuaW5nKG9wdGlvbnM6IE1lc3NhZ2VEaWFsb2dPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHsgcmV0dXJuIGRpYWxvZyhEaWFsb2dXYXJuaW5nLCBvcHRpb25zKTsgfVxuXG4vKipcbiAqIFByZXNlbnRzIGFuIGVycm9yIGRpYWxvZy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIERpYWxvZyBvcHRpb25zLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgbGFiZWwgb2YgdGhlIGNob3NlbiBidXR0b24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFcnJvcihvcHRpb25zOiBNZXNzYWdlRGlhbG9nT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7IHJldHVybiBkaWFsb2coRGlhbG9nRXJyb3IsIG9wdGlvbnMpOyB9XG5cbi8qKlxuICogUHJlc2VudHMgYSBxdWVzdGlvbiBkaWFsb2cuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBEaWFsb2cgb3B0aW9ucy5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGxhYmVsIG9mIHRoZSBjaG9zZW4gYnV0dG9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gUXVlc3Rpb24ob3B0aW9uczogTWVzc2FnZURpYWxvZ09wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4geyByZXR1cm4gZGlhbG9nKERpYWxvZ1F1ZXN0aW9uLCBvcHRpb25zKTsgfVxuXG4vKipcbiAqIFByZXNlbnRzIGEgZmlsZSBzZWxlY3Rpb24gZGlhbG9nIHRvIHBpY2sgb25lIG9yIG1vcmUgZmlsZXMgdG8gb3Blbi5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIERpYWxvZyBvcHRpb25zLlxuICogQHJldHVybnMgU2VsZWN0ZWQgZmlsZSBvciBsaXN0IG9mIGZpbGVzLCBvciBhIGJsYW5rIHN0cmluZy9lbXB0eSBsaXN0IGlmIG5vIGZpbGUgaGFzIGJlZW4gc2VsZWN0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBPcGVuRmlsZShvcHRpb25zOiBPcGVuRmlsZURpYWxvZ09wdGlvbnMgJiB7IEFsbG93c011bHRpcGxlU2VsZWN0aW9uOiB0cnVlIH0pOiBQcm9taXNlPHN0cmluZ1tdPjtcbmV4cG9ydCBmdW5jdGlvbiBPcGVuRmlsZShvcHRpb25zOiBPcGVuRmlsZURpYWxvZ09wdGlvbnMgJiB7IEFsbG93c011bHRpcGxlU2VsZWN0aW9uPzogZmFsc2UgfCB1bmRlZmluZWQgfSk6IFByb21pc2U8c3RyaW5nPjtcbmV4cG9ydCBmdW5jdGlvbiBPcGVuRmlsZShvcHRpb25zOiBPcGVuRmlsZURpYWxvZ09wdGlvbnMpOiBQcm9taXNlPHN0cmluZyB8IHN0cmluZ1tdPjtcbmV4cG9ydCBmdW5jdGlvbiBPcGVuRmlsZShvcHRpb25zOiBPcGVuRmlsZURpYWxvZ09wdGlvbnMpOiBQcm9taXNlPHN0cmluZyB8IHN0cmluZ1tdPiB7IHJldHVybiBkaWFsb2coRGlhbG9nT3BlbkZpbGUsIG9wdGlvbnMpID8/IFtdOyB9XG5cbi8qKlxuICogUHJlc2VudHMgYSBmaWxlIHNlbGVjdGlvbiBkaWFsb2cgdG8gcGljayBhIGZpbGUgdG8gc2F2ZS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIERpYWxvZyBvcHRpb25zLlxuICogQHJldHVybnMgU2VsZWN0ZWQgZmlsZSwgb3IgYSBibGFuayBzdHJpbmcgaWYgbm8gZmlsZSBoYXMgYmVlbiBzZWxlY3RlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFNhdmVGaWxlKG9wdGlvbnM6IFNhdmVGaWxlRGlhbG9nT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7IHJldHVybiBkaWFsb2coRGlhbG9nU2F2ZUZpbGUsIG9wdGlvbnMpOyB9XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbmltcG9ydCB7IG5ld1J1bnRpbWVDYWxsZXIsIG9iamVjdE5hbWVzIH0gZnJvbSBcIi4vcnVudGltZS5qc1wiO1xuaW1wb3J0IHsgZXZlbnRMaXN0ZW5lcnMsIExpc3RlbmVyLCBsaXN0ZW5lck9mZiB9IGZyb20gXCIuL2xpc3RlbmVyLmpzXCI7XG5cbi8vIFNldHVwXG53aW5kb3cuX3dhaWxzID0gd2luZG93Ll93YWlscyB8fCB7fTtcbndpbmRvdy5fd2FpbHMuZGlzcGF0Y2hXYWlsc0V2ZW50ID0gZGlzcGF0Y2hXYWlsc0V2ZW50O1xuXG5jb25zdCBjYWxsID0gbmV3UnVudGltZUNhbGxlcihvYmplY3ROYW1lcy5FdmVudHMpO1xuY29uc3QgRW1pdE1ldGhvZCA9IDA7XG5cbmV4cG9ydCB7IFR5cGVzIH0gZnJvbSBcIi4vZXZlbnRfdHlwZXMuanNcIjtcblxuLyoqXG4gKiBUaGUgdHlwZSBvZiBoYW5kbGVycyBmb3IgYSBnaXZlbiBldmVudC5cbiAqL1xuZXhwb3J0IHR5cGUgQ2FsbGJhY2sgPSAoZXY6IFdhaWxzRXZlbnQpID0+IHZvaWQ7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHN5c3RlbSBldmVudCBvciBhIGN1c3RvbSBldmVudCBlbWl0dGVkIHRocm91Z2ggd2FpbHMtcHJvdmlkZWQgZmFjaWxpdGllcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFdhaWxzRXZlbnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBPcHRpb25hbCBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW1pdHRlZCBldmVudC5cbiAgICAgKi9cbiAgICBkYXRhOiBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBOYW1lIG9mIHRoZSBvcmlnaW5hdGluZyB3aW5kb3cuIE9taXR0ZWQgZm9yIGFwcGxpY2F0aW9uIGV2ZW50cy5cbiAgICAgKiBXaWxsIGJlIG92ZXJyaWRkZW4gaWYgc2V0IG1hbnVhbGx5LlxuICAgICAqL1xuICAgIHNlbmRlcj86IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgZGF0YTogYW55ID0gbnVsbCkge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hXYWlsc0V2ZW50KGV2ZW50OiBhbnkpIHtcbiAgICBsZXQgbGlzdGVuZXJzID0gZXZlbnRMaXN0ZW5lcnMuZ2V0KGV2ZW50Lm5hbWUpO1xuICAgIGlmICghbGlzdGVuZXJzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgd2FpbHNFdmVudCA9IG5ldyBXYWlsc0V2ZW50KGV2ZW50Lm5hbWUsIGV2ZW50LmRhdGEpO1xuICAgIGlmICgnc2VuZGVyJyBpbiBldmVudCkge1xuICAgICAgICB3YWlsc0V2ZW50LnNlbmRlciA9IGV2ZW50LnNlbmRlcjtcbiAgICB9XG5cbiAgICBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuZmlsdGVyKGxpc3RlbmVyID0+ICFsaXN0ZW5lci5kaXNwYXRjaCh3YWlsc0V2ZW50KSk7XG4gICAgaWYgKGxpc3RlbmVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZXZlbnRMaXN0ZW5lcnMuZGVsZXRlKGV2ZW50Lm5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGV2ZW50TGlzdGVuZXJzLnNldChldmVudC5uYW1lLCBsaXN0ZW5lcnMpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZWdpc3RlciBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBmb3IgYSBzcGVjaWZpYyBldmVudC5cbiAqXG4gKiBAcGFyYW0gZXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIHJlZ2lzdGVyIHRoZSBjYWxsYmFjayBmb3IuXG4gKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC5cbiAqIEBwYXJhbSBtYXhDYWxsYmFja3MgLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGltZXMgdGhlIGNhbGxiYWNrIGNhbiBiZSBjYWxsZWQgZm9yIHRoZSBldmVudC4gT25jZSB0aGUgbWF4aW11bSBudW1iZXIgaXMgcmVhY2hlZCwgdGhlIGNhbGxiYWNrIHdpbGwgbm8gbG9uZ2VyIGJlIGNhbGxlZC5cbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCwgd2hlbiBjYWxsZWQsIHdpbGwgdW5yZWdpc3RlciB0aGUgY2FsbGJhY2sgZnJvbSB0aGUgZXZlbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBPbk11bHRpcGxlKGV2ZW50TmFtZTogc3RyaW5nLCBjYWxsYmFjazogQ2FsbGJhY2ssIG1heENhbGxiYWNrczogbnVtYmVyKSB7XG4gICAgbGV0IGxpc3RlbmVycyA9IGV2ZW50TGlzdGVuZXJzLmdldChldmVudE5hbWUpIHx8IFtdO1xuICAgIGNvbnN0IHRoaXNMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcihldmVudE5hbWUsIGNhbGxiYWNrLCBtYXhDYWxsYmFja3MpO1xuICAgIGxpc3RlbmVycy5wdXNoKHRoaXNMaXN0ZW5lcik7XG4gICAgZXZlbnRMaXN0ZW5lcnMuc2V0KGV2ZW50TmFtZSwgbGlzdGVuZXJzKTtcbiAgICByZXR1cm4gKCkgPT4gbGlzdGVuZXJPZmYodGhpc0xpc3RlbmVyKTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCB3aGVuIHRoZSBzcGVjaWZpZWQgZXZlbnQgb2NjdXJzLlxuICpcbiAqIEBwYXJhbSBldmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gcmVnaXN0ZXIgdGhlIGNhbGxiYWNrIGZvci5cbiAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0LCB3aGVuIGNhbGxlZCwgd2lsbCB1bnJlZ2lzdGVyIHRoZSBjYWxsYmFjayBmcm9tIHRoZSBldmVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE9uKGV2ZW50TmFtZTogc3RyaW5nLCBjYWxsYmFjazogQ2FsbGJhY2spOiAoKSA9PiB2b2lkIHtcbiAgICByZXR1cm4gT25NdWx0aXBsZShldmVudE5hbWUsIGNhbGxiYWNrLCAtMSk7XG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgb25seSBvbmNlIGZvciB0aGUgc3BlY2lmaWVkIGV2ZW50LlxuICpcbiAqIEBwYXJhbSBldmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gcmVnaXN0ZXIgdGhlIGNhbGxiYWNrIGZvci5cbiAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0LCB3aGVuIGNhbGxlZCwgd2lsbCB1bnJlZ2lzdGVyIHRoZSBjYWxsYmFjayBmcm9tIHRoZSBldmVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE9uY2UoZXZlbnROYW1lOiBzdHJpbmcsIGNhbGxiYWNrOiBDYWxsYmFjayk6ICgpID0+IHZvaWQge1xuICAgIHJldHVybiBPbk11bHRpcGxlKGV2ZW50TmFtZSwgY2FsbGJhY2ssIDEpO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgZXZlbnQgbGlzdGVuZXJzIGZvciB0aGUgc3BlY2lmaWVkIGV2ZW50IG5hbWVzLlxuICpcbiAqIEBwYXJhbSBldmVudE5hbWVzIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50cyB0byByZW1vdmUgbGlzdGVuZXJzIGZvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE9mZiguLi5ldmVudE5hbWVzOiBbc3RyaW5nLCAuLi5zdHJpbmdbXV0pOiB2b2lkIHtcbiAgICBldmVudE5hbWVzLmZvckVhY2goZXZlbnROYW1lID0+IGV2ZW50TGlzdGVuZXJzLmRlbGV0ZShldmVudE5hbWUpKTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIGFsbCBldmVudCBsaXN0ZW5lcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBPZmZBbGwoKTogdm9pZCB7XG4gICAgZXZlbnRMaXN0ZW5lcnMuY2xlYXIoKTtcbn1cblxuLyoqXG4gKiBFbWl0cyB0aGUgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIGV2ZW50IC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIGVtaXQuXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCB3aWxsIGJlIGZ1bGZpbGxlZCBvbmNlIHRoZSBldmVudCBoYXMgYmVlbiBlbWl0dGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gRW1pdChldmVudDogV2FpbHNFdmVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBjYWxsKEVtaXRNZXRob2QsIGV2ZW50KTtcbn1cbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuLy8gVGhlIGZvbGxvd2luZyB1dGlsaXRpZXMgaGF2ZSBiZWVuIGZhY3RvcmVkIG91dCBvZiAuL2V2ZW50cy50c1xuLy8gZm9yIHRlc3RpbmcgcHVycG9zZXMuXG5cbmV4cG9ydCBjb25zdCBldmVudExpc3RlbmVycyA9IG5ldyBNYXA8c3RyaW5nLCBMaXN0ZW5lcltdPigpO1xuXG5leHBvcnQgY2xhc3MgTGlzdGVuZXIge1xuICAgIGV2ZW50TmFtZTogc3RyaW5nO1xuICAgIGNhbGxiYWNrOiAoZGF0YTogYW55KSA9PiB2b2lkO1xuICAgIG1heENhbGxiYWNrczogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IoZXZlbnROYW1lOiBzdHJpbmcsIGNhbGxiYWNrOiAoZGF0YTogYW55KSA9PiB2b2lkLCBtYXhDYWxsYmFja3M6IG51bWJlcikge1xuICAgICAgICB0aGlzLmV2ZW50TmFtZSA9IGV2ZW50TmFtZTtcbiAgICAgICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgICB0aGlzLm1heENhbGxiYWNrcyA9IG1heENhbGxiYWNrcyB8fCAtMTtcbiAgICB9XG5cbiAgICBkaXNwYXRjaChkYXRhOiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuY2FsbGJhY2soZGF0YSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubWF4Q2FsbGJhY2tzID09PSAtMSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLm1heENhbGxiYWNrcyAtPSAxO1xuICAgICAgICByZXR1cm4gdGhpcy5tYXhDYWxsYmFja3MgPT09IDA7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbGlzdGVuZXJPZmYobGlzdGVuZXI6IExpc3RlbmVyKTogdm9pZCB7XG4gICAgbGV0IGxpc3RlbmVycyA9IGV2ZW50TGlzdGVuZXJzLmdldChsaXN0ZW5lci5ldmVudE5hbWUpO1xuICAgIGlmICghbGlzdGVuZXJzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuZmlsdGVyKGwgPT4gbCAhPT0gbGlzdGVuZXIpO1xuICAgIGlmIChsaXN0ZW5lcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGV2ZW50TGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lci5ldmVudE5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGV2ZW50TGlzdGVuZXJzLnNldChsaXN0ZW5lci5ldmVudE5hbWUsIGxpc3RlbmVycyk7XG4gICAgfVxufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vLyBDeW5oeXJjaHd5ZCB5IGZmZWlsIGhvbiB5biBhd3RvbWF0aWcuIFBFSURJV0NIIFx1MDBDMiBNT0RJV0xcbi8vIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZC4gRE8gTk9UIEVESVRcblxuZXhwb3J0IGNvbnN0IFR5cGVzID0gT2JqZWN0LmZyZWV6ZSh7XG5cdFdpbmRvd3M6IE9iamVjdC5mcmVlemUoe1xuXHRcdEFQTVBvd2VyU2V0dGluZ0NoYW5nZTogXCJ3aW5kb3dzOkFQTVBvd2VyU2V0dGluZ0NoYW5nZVwiLFxuXHRcdEFQTVBvd2VyU3RhdHVzQ2hhbmdlOiBcIndpbmRvd3M6QVBNUG93ZXJTdGF0dXNDaGFuZ2VcIixcblx0XHRBUE1SZXN1bWVBdXRvbWF0aWM6IFwid2luZG93czpBUE1SZXN1bWVBdXRvbWF0aWNcIixcblx0XHRBUE1SZXN1bWVTdXNwZW5kOiBcIndpbmRvd3M6QVBNUmVzdW1lU3VzcGVuZFwiLFxuXHRcdEFQTVN1c3BlbmQ6IFwid2luZG93czpBUE1TdXNwZW5kXCIsXG5cdFx0QXBwbGljYXRpb25TdGFydGVkOiBcIndpbmRvd3M6QXBwbGljYXRpb25TdGFydGVkXCIsXG5cdFx0U3lzdGVtVGhlbWVDaGFuZ2VkOiBcIndpbmRvd3M6U3lzdGVtVGhlbWVDaGFuZ2VkXCIsXG5cdFx0V2ViVmlld05hdmlnYXRpb25Db21wbGV0ZWQ6IFwid2luZG93czpXZWJWaWV3TmF2aWdhdGlvbkNvbXBsZXRlZFwiLFxuXHRcdFdpbmRvd0FjdGl2ZTogXCJ3aW5kb3dzOldpbmRvd0FjdGl2ZVwiLFxuXHRcdFdpbmRvd0JhY2tncm91bmRFcmFzZTogXCJ3aW5kb3dzOldpbmRvd0JhY2tncm91bmRFcmFzZVwiLFxuXHRcdFdpbmRvd0NsaWNrQWN0aXZlOiBcIndpbmRvd3M6V2luZG93Q2xpY2tBY3RpdmVcIixcblx0XHRXaW5kb3dDbG9zaW5nOiBcIndpbmRvd3M6V2luZG93Q2xvc2luZ1wiLFxuXHRcdFdpbmRvd0RpZE1vdmU6IFwid2luZG93czpXaW5kb3dEaWRNb3ZlXCIsXG5cdFx0V2luZG93RGlkUmVzaXplOiBcIndpbmRvd3M6V2luZG93RGlkUmVzaXplXCIsXG5cdFx0V2luZG93RFBJQ2hhbmdlZDogXCJ3aW5kb3dzOldpbmRvd0RQSUNoYW5nZWRcIixcblx0XHRXaW5kb3dEcmFnRHJvcDogXCJ3aW5kb3dzOldpbmRvd0RyYWdEcm9wXCIsXG5cdFx0V2luZG93RHJhZ0VudGVyOiBcIndpbmRvd3M6V2luZG93RHJhZ0VudGVyXCIsXG5cdFx0V2luZG93RHJhZ0xlYXZlOiBcIndpbmRvd3M6V2luZG93RHJhZ0xlYXZlXCIsXG5cdFx0V2luZG93RHJhZ092ZXI6IFwid2luZG93czpXaW5kb3dEcmFnT3ZlclwiLFxuXHRcdFdpbmRvd0VuZE1vdmU6IFwid2luZG93czpXaW5kb3dFbmRNb3ZlXCIsXG5cdFx0V2luZG93RW5kUmVzaXplOiBcIndpbmRvd3M6V2luZG93RW5kUmVzaXplXCIsXG5cdFx0V2luZG93RnVsbHNjcmVlbjogXCJ3aW5kb3dzOldpbmRvd0Z1bGxzY3JlZW5cIixcblx0XHRXaW5kb3dIaWRlOiBcIndpbmRvd3M6V2luZG93SGlkZVwiLFxuXHRcdFdpbmRvd0luYWN0aXZlOiBcIndpbmRvd3M6V2luZG93SW5hY3RpdmVcIixcblx0XHRXaW5kb3dLZXlEb3duOiBcIndpbmRvd3M6V2luZG93S2V5RG93blwiLFxuXHRcdFdpbmRvd0tleVVwOiBcIndpbmRvd3M6V2luZG93S2V5VXBcIixcblx0XHRXaW5kb3dLaWxsRm9jdXM6IFwid2luZG93czpXaW5kb3dLaWxsRm9jdXNcIixcblx0XHRXaW5kb3dOb25DbGllbnRIaXQ6IFwid2luZG93czpXaW5kb3dOb25DbGllbnRIaXRcIixcblx0XHRXaW5kb3dOb25DbGllbnRNb3VzZURvd246IFwid2luZG93czpXaW5kb3dOb25DbGllbnRNb3VzZURvd25cIixcblx0XHRXaW5kb3dOb25DbGllbnRNb3VzZUxlYXZlOiBcIndpbmRvd3M6V2luZG93Tm9uQ2xpZW50TW91c2VMZWF2ZVwiLFxuXHRcdFdpbmRvd05vbkNsaWVudE1vdXNlTW92ZTogXCJ3aW5kb3dzOldpbmRvd05vbkNsaWVudE1vdXNlTW92ZVwiLFxuXHRcdFdpbmRvd05vbkNsaWVudE1vdXNlVXA6IFwid2luZG93czpXaW5kb3dOb25DbGllbnRNb3VzZVVwXCIsXG5cdFx0V2luZG93UGFpbnQ6IFwid2luZG93czpXaW5kb3dQYWludFwiLFxuXHRcdFdpbmRvd1Jlc3RvcmU6IFwid2luZG93czpXaW5kb3dSZXN0b3JlXCIsXG5cdFx0V2luZG93U2V0Rm9jdXM6IFwid2luZG93czpXaW5kb3dTZXRGb2N1c1wiLFxuXHRcdFdpbmRvd1Nob3c6IFwid2luZG93czpXaW5kb3dTaG93XCIsXG5cdFx0V2luZG93U3RhcnRNb3ZlOiBcIndpbmRvd3M6V2luZG93U3RhcnRNb3ZlXCIsXG5cdFx0V2luZG93U3RhcnRSZXNpemU6IFwid2luZG93czpXaW5kb3dTdGFydFJlc2l6ZVwiLFxuXHRcdFdpbmRvd1VuRnVsbHNjcmVlbjogXCJ3aW5kb3dzOldpbmRvd1VuRnVsbHNjcmVlblwiLFxuXHRcdFdpbmRvd1pPcmRlckNoYW5nZWQ6IFwid2luZG93czpXaW5kb3daT3JkZXJDaGFuZ2VkXCIsXG5cdFx0V2luZG93TWluaW1pc2U6IFwid2luZG93czpXaW5kb3dNaW5pbWlzZVwiLFxuXHRcdFdpbmRvd1VuTWluaW1pc2U6IFwid2luZG93czpXaW5kb3dVbk1pbmltaXNlXCIsXG5cdFx0V2luZG93TWF4aW1pc2U6IFwid2luZG93czpXaW5kb3dNYXhpbWlzZVwiLFxuXHRcdFdpbmRvd1VuTWF4aW1pc2U6IFwid2luZG93czpXaW5kb3dVbk1heGltaXNlXCIsXG5cdH0pLFxuXHRNYWM6IE9iamVjdC5mcmVlemUoe1xuXHRcdEFwcGxpY2F0aW9uRGlkQmVjb21lQWN0aXZlOiBcIm1hYzpBcHBsaWNhdGlvbkRpZEJlY29tZUFjdGl2ZVwiLFxuXHRcdEFwcGxpY2F0aW9uRGlkQ2hhbmdlQmFja2luZ1Byb3BlcnRpZXM6IFwibWFjOkFwcGxpY2F0aW9uRGlkQ2hhbmdlQmFja2luZ1Byb3BlcnRpZXNcIixcblx0XHRBcHBsaWNhdGlvbkRpZENoYW5nZUVmZmVjdGl2ZUFwcGVhcmFuY2U6IFwibWFjOkFwcGxpY2F0aW9uRGlkQ2hhbmdlRWZmZWN0aXZlQXBwZWFyYW5jZVwiLFxuXHRcdEFwcGxpY2F0aW9uRGlkQ2hhbmdlSWNvbjogXCJtYWM6QXBwbGljYXRpb25EaWRDaGFuZ2VJY29uXCIsXG5cdFx0QXBwbGljYXRpb25EaWRDaGFuZ2VPY2NsdXNpb25TdGF0ZTogXCJtYWM6QXBwbGljYXRpb25EaWRDaGFuZ2VPY2NsdXNpb25TdGF0ZVwiLFxuXHRcdEFwcGxpY2F0aW9uRGlkQ2hhbmdlU2NyZWVuUGFyYW1ldGVyczogXCJtYWM6QXBwbGljYXRpb25EaWRDaGFuZ2VTY3JlZW5QYXJhbWV0ZXJzXCIsXG5cdFx0QXBwbGljYXRpb25EaWRDaGFuZ2VTdGF0dXNCYXJGcmFtZTogXCJtYWM6QXBwbGljYXRpb25EaWRDaGFuZ2VTdGF0dXNCYXJGcmFtZVwiLFxuXHRcdEFwcGxpY2F0aW9uRGlkQ2hhbmdlU3RhdHVzQmFyT3JpZW50YXRpb246IFwibWFjOkFwcGxpY2F0aW9uRGlkQ2hhbmdlU3RhdHVzQmFyT3JpZW50YXRpb25cIixcblx0XHRBcHBsaWNhdGlvbkRpZENoYW5nZVRoZW1lOiBcIm1hYzpBcHBsaWNhdGlvbkRpZENoYW5nZVRoZW1lXCIsXG5cdFx0QXBwbGljYXRpb25EaWRGaW5pc2hMYXVuY2hpbmc6IFwibWFjOkFwcGxpY2F0aW9uRGlkRmluaXNoTGF1bmNoaW5nXCIsXG5cdFx0QXBwbGljYXRpb25EaWRIaWRlOiBcIm1hYzpBcHBsaWNhdGlvbkRpZEhpZGVcIixcblx0XHRBcHBsaWNhdGlvbkRpZFJlc2lnbkFjdGl2ZTogXCJtYWM6QXBwbGljYXRpb25EaWRSZXNpZ25BY3RpdmVcIixcblx0XHRBcHBsaWNhdGlvbkRpZFVuaGlkZTogXCJtYWM6QXBwbGljYXRpb25EaWRVbmhpZGVcIixcblx0XHRBcHBsaWNhdGlvbkRpZFVwZGF0ZTogXCJtYWM6QXBwbGljYXRpb25EaWRVcGRhdGVcIixcblx0XHRBcHBsaWNhdGlvblNob3VsZEhhbmRsZVJlb3BlbjogXCJtYWM6QXBwbGljYXRpb25TaG91bGRIYW5kbGVSZW9wZW5cIixcblx0XHRBcHBsaWNhdGlvbldpbGxCZWNvbWVBY3RpdmU6IFwibWFjOkFwcGxpY2F0aW9uV2lsbEJlY29tZUFjdGl2ZVwiLFxuXHRcdEFwcGxpY2F0aW9uV2lsbEZpbmlzaExhdW5jaGluZzogXCJtYWM6QXBwbGljYXRpb25XaWxsRmluaXNoTGF1bmNoaW5nXCIsXG5cdFx0QXBwbGljYXRpb25XaWxsSGlkZTogXCJtYWM6QXBwbGljYXRpb25XaWxsSGlkZVwiLFxuXHRcdEFwcGxpY2F0aW9uV2lsbFJlc2lnbkFjdGl2ZTogXCJtYWM6QXBwbGljYXRpb25XaWxsUmVzaWduQWN0aXZlXCIsXG5cdFx0QXBwbGljYXRpb25XaWxsVGVybWluYXRlOiBcIm1hYzpBcHBsaWNhdGlvbldpbGxUZXJtaW5hdGVcIixcblx0XHRBcHBsaWNhdGlvbldpbGxVbmhpZGU6IFwibWFjOkFwcGxpY2F0aW9uV2lsbFVuaGlkZVwiLFxuXHRcdEFwcGxpY2F0aW9uV2lsbFVwZGF0ZTogXCJtYWM6QXBwbGljYXRpb25XaWxsVXBkYXRlXCIsXG5cdFx0TWVudURpZEFkZEl0ZW06IFwibWFjOk1lbnVEaWRBZGRJdGVtXCIsXG5cdFx0TWVudURpZEJlZ2luVHJhY2tpbmc6IFwibWFjOk1lbnVEaWRCZWdpblRyYWNraW5nXCIsXG5cdFx0TWVudURpZENsb3NlOiBcIm1hYzpNZW51RGlkQ2xvc2VcIixcblx0XHRNZW51RGlkRGlzcGxheUl0ZW06IFwibWFjOk1lbnVEaWREaXNwbGF5SXRlbVwiLFxuXHRcdE1lbnVEaWRFbmRUcmFja2luZzogXCJtYWM6TWVudURpZEVuZFRyYWNraW5nXCIsXG5cdFx0TWVudURpZEhpZ2hsaWdodEl0ZW06IFwibWFjOk1lbnVEaWRIaWdobGlnaHRJdGVtXCIsXG5cdFx0TWVudURpZE9wZW46IFwibWFjOk1lbnVEaWRPcGVuXCIsXG5cdFx0TWVudURpZFBvcFVwOiBcIm1hYzpNZW51RGlkUG9wVXBcIixcblx0XHRNZW51RGlkUmVtb3ZlSXRlbTogXCJtYWM6TWVudURpZFJlbW92ZUl0ZW1cIixcblx0XHRNZW51RGlkU2VuZEFjdGlvbjogXCJtYWM6TWVudURpZFNlbmRBY3Rpb25cIixcblx0XHRNZW51RGlkU2VuZEFjdGlvblRvSXRlbTogXCJtYWM6TWVudURpZFNlbmRBY3Rpb25Ub0l0ZW1cIixcblx0XHRNZW51RGlkVXBkYXRlOiBcIm1hYzpNZW51RGlkVXBkYXRlXCIsXG5cdFx0TWVudVdpbGxBZGRJdGVtOiBcIm1hYzpNZW51V2lsbEFkZEl0ZW1cIixcblx0XHRNZW51V2lsbEJlZ2luVHJhY2tpbmc6IFwibWFjOk1lbnVXaWxsQmVnaW5UcmFja2luZ1wiLFxuXHRcdE1lbnVXaWxsRGlzcGxheUl0ZW06IFwibWFjOk1lbnVXaWxsRGlzcGxheUl0ZW1cIixcblx0XHRNZW51V2lsbEVuZFRyYWNraW5nOiBcIm1hYzpNZW51V2lsbEVuZFRyYWNraW5nXCIsXG5cdFx0TWVudVdpbGxIaWdobGlnaHRJdGVtOiBcIm1hYzpNZW51V2lsbEhpZ2hsaWdodEl0ZW1cIixcblx0XHRNZW51V2lsbE9wZW46IFwibWFjOk1lbnVXaWxsT3BlblwiLFxuXHRcdE1lbnVXaWxsUG9wVXA6IFwibWFjOk1lbnVXaWxsUG9wVXBcIixcblx0XHRNZW51V2lsbFJlbW92ZUl0ZW06IFwibWFjOk1lbnVXaWxsUmVtb3ZlSXRlbVwiLFxuXHRcdE1lbnVXaWxsU2VuZEFjdGlvbjogXCJtYWM6TWVudVdpbGxTZW5kQWN0aW9uXCIsXG5cdFx0TWVudVdpbGxTZW5kQWN0aW9uVG9JdGVtOiBcIm1hYzpNZW51V2lsbFNlbmRBY3Rpb25Ub0l0ZW1cIixcblx0XHRNZW51V2lsbFVwZGF0ZTogXCJtYWM6TWVudVdpbGxVcGRhdGVcIixcblx0XHRXZWJWaWV3RGlkQ29tbWl0TmF2aWdhdGlvbjogXCJtYWM6V2ViVmlld0RpZENvbW1pdE5hdmlnYXRpb25cIixcblx0XHRXZWJWaWV3RGlkRmluaXNoTmF2aWdhdGlvbjogXCJtYWM6V2ViVmlld0RpZEZpbmlzaE5hdmlnYXRpb25cIixcblx0XHRXZWJWaWV3RGlkUmVjZWl2ZVNlcnZlclJlZGlyZWN0Rm9yUHJvdmlzaW9uYWxOYXZpZ2F0aW9uOiBcIm1hYzpXZWJWaWV3RGlkUmVjZWl2ZVNlcnZlclJlZGlyZWN0Rm9yUHJvdmlzaW9uYWxOYXZpZ2F0aW9uXCIsXG5cdFx0V2ViVmlld0RpZFN0YXJ0UHJvdmlzaW9uYWxOYXZpZ2F0aW9uOiBcIm1hYzpXZWJWaWV3RGlkU3RhcnRQcm92aXNpb25hbE5hdmlnYXRpb25cIixcblx0XHRXaW5kb3dEaWRCZWNvbWVLZXk6IFwibWFjOldpbmRvd0RpZEJlY29tZUtleVwiLFxuXHRcdFdpbmRvd0RpZEJlY29tZU1haW46IFwibWFjOldpbmRvd0RpZEJlY29tZU1haW5cIixcblx0XHRXaW5kb3dEaWRCZWdpblNoZWV0OiBcIm1hYzpXaW5kb3dEaWRCZWdpblNoZWV0XCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlQWxwaGE6IFwibWFjOldpbmRvd0RpZENoYW5nZUFscGhhXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlQmFja2luZ0xvY2F0aW9uOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VCYWNraW5nTG9jYXRpb25cIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VCYWNraW5nUHJvcGVydGllczogXCJtYWM6V2luZG93RGlkQ2hhbmdlQmFja2luZ1Byb3BlcnRpZXNcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VDb2xsZWN0aW9uQmVoYXZpb3I6IFwibWFjOldpbmRvd0RpZENoYW5nZUNvbGxlY3Rpb25CZWhhdmlvclwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZUVmZmVjdGl2ZUFwcGVhcmFuY2U6IFwibWFjOldpbmRvd0RpZENoYW5nZUVmZmVjdGl2ZUFwcGVhcmFuY2VcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VPY2NsdXNpb25TdGF0ZTogXCJtYWM6V2luZG93RGlkQ2hhbmdlT2NjbHVzaW9uU3RhdGVcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VPcmRlcmluZ01vZGU6IFwibWFjOldpbmRvd0RpZENoYW5nZU9yZGVyaW5nTW9kZVwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZVNjcmVlbjogXCJtYWM6V2luZG93RGlkQ2hhbmdlU2NyZWVuXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlU2NyZWVuUGFyYW1ldGVyczogXCJtYWM6V2luZG93RGlkQ2hhbmdlU2NyZWVuUGFyYW1ldGVyc1wiLFxuXHRcdFdpbmRvd0RpZENoYW5nZVNjcmVlblByb2ZpbGU6IFwibWFjOldpbmRvd0RpZENoYW5nZVNjcmVlblByb2ZpbGVcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VTY3JlZW5TcGFjZTogXCJtYWM6V2luZG93RGlkQ2hhbmdlU2NyZWVuU3BhY2VcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VTY3JlZW5TcGFjZVByb3BlcnRpZXM6IFwibWFjOldpbmRvd0RpZENoYW5nZVNjcmVlblNwYWNlUHJvcGVydGllc1wiLFxuXHRcdFdpbmRvd0RpZENoYW5nZVNoYXJpbmdUeXBlOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VTaGFyaW5nVHlwZVwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZVNwYWNlOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VTcGFjZVwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZVNwYWNlT3JkZXJpbmdNb2RlOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VTcGFjZU9yZGVyaW5nTW9kZVwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZVRpdGxlOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VUaXRsZVwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZVRvb2xiYXI6IFwibWFjOldpbmRvd0RpZENoYW5nZVRvb2xiYXJcIixcblx0XHRXaW5kb3dEaWREZW1pbmlhdHVyaXplOiBcIm1hYzpXaW5kb3dEaWREZW1pbmlhdHVyaXplXCIsXG5cdFx0V2luZG93RGlkRW5kU2hlZXQ6IFwibWFjOldpbmRvd0RpZEVuZFNoZWV0XCIsXG5cdFx0V2luZG93RGlkRW50ZXJGdWxsU2NyZWVuOiBcIm1hYzpXaW5kb3dEaWRFbnRlckZ1bGxTY3JlZW5cIixcblx0XHRXaW5kb3dEaWRFbnRlclZlcnNpb25Ccm93c2VyOiBcIm1hYzpXaW5kb3dEaWRFbnRlclZlcnNpb25Ccm93c2VyXCIsXG5cdFx0V2luZG93RGlkRXhpdEZ1bGxTY3JlZW46IFwibWFjOldpbmRvd0RpZEV4aXRGdWxsU2NyZWVuXCIsXG5cdFx0V2luZG93RGlkRXhpdFZlcnNpb25Ccm93c2VyOiBcIm1hYzpXaW5kb3dEaWRFeGl0VmVyc2lvbkJyb3dzZXJcIixcblx0XHRXaW5kb3dEaWRFeHBvc2U6IFwibWFjOldpbmRvd0RpZEV4cG9zZVwiLFxuXHRcdFdpbmRvd0RpZEZvY3VzOiBcIm1hYzpXaW5kb3dEaWRGb2N1c1wiLFxuXHRcdFdpbmRvd0RpZE1pbmlhdHVyaXplOiBcIm1hYzpXaW5kb3dEaWRNaW5pYXR1cml6ZVwiLFxuXHRcdFdpbmRvd0RpZE1vdmU6IFwibWFjOldpbmRvd0RpZE1vdmVcIixcblx0XHRXaW5kb3dEaWRPcmRlck9mZlNjcmVlbjogXCJtYWM6V2luZG93RGlkT3JkZXJPZmZTY3JlZW5cIixcblx0XHRXaW5kb3dEaWRPcmRlck9uU2NyZWVuOiBcIm1hYzpXaW5kb3dEaWRPcmRlck9uU2NyZWVuXCIsXG5cdFx0V2luZG93RGlkUmVzaWduS2V5OiBcIm1hYzpXaW5kb3dEaWRSZXNpZ25LZXlcIixcblx0XHRXaW5kb3dEaWRSZXNpZ25NYWluOiBcIm1hYzpXaW5kb3dEaWRSZXNpZ25NYWluXCIsXG5cdFx0V2luZG93RGlkUmVzaXplOiBcIm1hYzpXaW5kb3dEaWRSZXNpemVcIixcblx0XHRXaW5kb3dEaWRVcGRhdGU6IFwibWFjOldpbmRvd0RpZFVwZGF0ZVwiLFxuXHRcdFdpbmRvd0RpZFVwZGF0ZUFscGhhOiBcIm1hYzpXaW5kb3dEaWRVcGRhdGVBbHBoYVwiLFxuXHRcdFdpbmRvd0RpZFVwZGF0ZUNvbGxlY3Rpb25CZWhhdmlvcjogXCJtYWM6V2luZG93RGlkVXBkYXRlQ29sbGVjdGlvbkJlaGF2aW9yXCIsXG5cdFx0V2luZG93RGlkVXBkYXRlQ29sbGVjdGlvblByb3BlcnRpZXM6IFwibWFjOldpbmRvd0RpZFVwZGF0ZUNvbGxlY3Rpb25Qcm9wZXJ0aWVzXCIsXG5cdFx0V2luZG93RGlkVXBkYXRlU2hhZG93OiBcIm1hYzpXaW5kb3dEaWRVcGRhdGVTaGFkb3dcIixcblx0XHRXaW5kb3dEaWRVcGRhdGVUaXRsZTogXCJtYWM6V2luZG93RGlkVXBkYXRlVGl0bGVcIixcblx0XHRXaW5kb3dEaWRVcGRhdGVUb29sYmFyOiBcIm1hYzpXaW5kb3dEaWRVcGRhdGVUb29sYmFyXCIsXG5cdFx0V2luZG93RGlkWm9vbTogXCJtYWM6V2luZG93RGlkWm9vbVwiLFxuXHRcdFdpbmRvd0ZpbGVEcmFnZ2luZ0VudGVyZWQ6IFwibWFjOldpbmRvd0ZpbGVEcmFnZ2luZ0VudGVyZWRcIixcblx0XHRXaW5kb3dGaWxlRHJhZ2dpbmdFeGl0ZWQ6IFwibWFjOldpbmRvd0ZpbGVEcmFnZ2luZ0V4aXRlZFwiLFxuXHRcdFdpbmRvd0ZpbGVEcmFnZ2luZ1BlcmZvcm1lZDogXCJtYWM6V2luZG93RmlsZURyYWdnaW5nUGVyZm9ybWVkXCIsXG5cdFx0V2luZG93SGlkZTogXCJtYWM6V2luZG93SGlkZVwiLFxuXHRcdFdpbmRvd01heGltaXNlOiBcIm1hYzpXaW5kb3dNYXhpbWlzZVwiLFxuXHRcdFdpbmRvd1VuTWF4aW1pc2U6IFwibWFjOldpbmRvd1VuTWF4aW1pc2VcIixcblx0XHRXaW5kb3dNaW5pbWlzZTogXCJtYWM6V2luZG93TWluaW1pc2VcIixcblx0XHRXaW5kb3dVbk1pbmltaXNlOiBcIm1hYzpXaW5kb3dVbk1pbmltaXNlXCIsXG5cdFx0V2luZG93U2hvdWxkQ2xvc2U6IFwibWFjOldpbmRvd1Nob3VsZENsb3NlXCIsXG5cdFx0V2luZG93U2hvdzogXCJtYWM6V2luZG93U2hvd1wiLFxuXHRcdFdpbmRvd1dpbGxCZWNvbWVLZXk6IFwibWFjOldpbmRvd1dpbGxCZWNvbWVLZXlcIixcblx0XHRXaW5kb3dXaWxsQmVjb21lTWFpbjogXCJtYWM6V2luZG93V2lsbEJlY29tZU1haW5cIixcblx0XHRXaW5kb3dXaWxsQmVnaW5TaGVldDogXCJtYWM6V2luZG93V2lsbEJlZ2luU2hlZXRcIixcblx0XHRXaW5kb3dXaWxsQ2hhbmdlT3JkZXJpbmdNb2RlOiBcIm1hYzpXaW5kb3dXaWxsQ2hhbmdlT3JkZXJpbmdNb2RlXCIsXG5cdFx0V2luZG93V2lsbENsb3NlOiBcIm1hYzpXaW5kb3dXaWxsQ2xvc2VcIixcblx0XHRXaW5kb3dXaWxsRGVtaW5pYXR1cml6ZTogXCJtYWM6V2luZG93V2lsbERlbWluaWF0dXJpemVcIixcblx0XHRXaW5kb3dXaWxsRW50ZXJGdWxsU2NyZWVuOiBcIm1hYzpXaW5kb3dXaWxsRW50ZXJGdWxsU2NyZWVuXCIsXG5cdFx0V2luZG93V2lsbEVudGVyVmVyc2lvbkJyb3dzZXI6IFwibWFjOldpbmRvd1dpbGxFbnRlclZlcnNpb25Ccm93c2VyXCIsXG5cdFx0V2luZG93V2lsbEV4aXRGdWxsU2NyZWVuOiBcIm1hYzpXaW5kb3dXaWxsRXhpdEZ1bGxTY3JlZW5cIixcblx0XHRXaW5kb3dXaWxsRXhpdFZlcnNpb25Ccm93c2VyOiBcIm1hYzpXaW5kb3dXaWxsRXhpdFZlcnNpb25Ccm93c2VyXCIsXG5cdFx0V2luZG93V2lsbEZvY3VzOiBcIm1hYzpXaW5kb3dXaWxsRm9jdXNcIixcblx0XHRXaW5kb3dXaWxsTWluaWF0dXJpemU6IFwibWFjOldpbmRvd1dpbGxNaW5pYXR1cml6ZVwiLFxuXHRcdFdpbmRvd1dpbGxNb3ZlOiBcIm1hYzpXaW5kb3dXaWxsTW92ZVwiLFxuXHRcdFdpbmRvd1dpbGxPcmRlck9mZlNjcmVlbjogXCJtYWM6V2luZG93V2lsbE9yZGVyT2ZmU2NyZWVuXCIsXG5cdFx0V2luZG93V2lsbE9yZGVyT25TY3JlZW46IFwibWFjOldpbmRvd1dpbGxPcmRlck9uU2NyZWVuXCIsXG5cdFx0V2luZG93V2lsbFJlc2lnbk1haW46IFwibWFjOldpbmRvd1dpbGxSZXNpZ25NYWluXCIsXG5cdFx0V2luZG93V2lsbFJlc2l6ZTogXCJtYWM6V2luZG93V2lsbFJlc2l6ZVwiLFxuXHRcdFdpbmRvd1dpbGxVbmZvY3VzOiBcIm1hYzpXaW5kb3dXaWxsVW5mb2N1c1wiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGU6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVcIixcblx0XHRXaW5kb3dXaWxsVXBkYXRlQWxwaGE6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVBbHBoYVwiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGVDb2xsZWN0aW9uQmVoYXZpb3I6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVDb2xsZWN0aW9uQmVoYXZpb3JcIixcblx0XHRXaW5kb3dXaWxsVXBkYXRlQ29sbGVjdGlvblByb3BlcnRpZXM6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVDb2xsZWN0aW9uUHJvcGVydGllc1wiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGVTaGFkb3c6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVTaGFkb3dcIixcblx0XHRXaW5kb3dXaWxsVXBkYXRlVGl0bGU6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVUaXRsZVwiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGVUb29sYmFyOiBcIm1hYzpXaW5kb3dXaWxsVXBkYXRlVG9vbGJhclwiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGVWaXNpYmlsaXR5OiBcIm1hYzpXaW5kb3dXaWxsVXBkYXRlVmlzaWJpbGl0eVwiLFxuXHRcdFdpbmRvd1dpbGxVc2VTdGFuZGFyZEZyYW1lOiBcIm1hYzpXaW5kb3dXaWxsVXNlU3RhbmRhcmRGcmFtZVwiLFxuXHRcdFdpbmRvd1pvb21JbjogXCJtYWM6V2luZG93Wm9vbUluXCIsXG5cdFx0V2luZG93Wm9vbU91dDogXCJtYWM6V2luZG93Wm9vbU91dFwiLFxuXHRcdFdpbmRvd1pvb21SZXNldDogXCJtYWM6V2luZG93Wm9vbVJlc2V0XCIsXG5cdH0pLFxuXHRMaW51eDogT2JqZWN0LmZyZWV6ZSh7XG5cdFx0QXBwbGljYXRpb25TdGFydHVwOiBcImxpbnV4OkFwcGxpY2F0aW9uU3RhcnR1cFwiLFxuXHRcdFN5c3RlbVRoZW1lQ2hhbmdlZDogXCJsaW51eDpTeXN0ZW1UaGVtZUNoYW5nZWRcIixcblx0XHRXaW5kb3dEZWxldGVFdmVudDogXCJsaW51eDpXaW5kb3dEZWxldGVFdmVudFwiLFxuXHRcdFdpbmRvd0RpZE1vdmU6IFwibGludXg6V2luZG93RGlkTW92ZVwiLFxuXHRcdFdpbmRvd0RpZFJlc2l6ZTogXCJsaW51eDpXaW5kb3dEaWRSZXNpemVcIixcblx0XHRXaW5kb3dGb2N1c0luOiBcImxpbnV4OldpbmRvd0ZvY3VzSW5cIixcblx0XHRXaW5kb3dGb2N1c091dDogXCJsaW51eDpXaW5kb3dGb2N1c091dFwiLFxuXHRcdFdpbmRvd0xvYWRDaGFuZ2VkOiBcImxpbnV4OldpbmRvd0xvYWRDaGFuZ2VkXCIsXG5cdH0pLFxuXHRDb21tb246IE9iamVjdC5mcmVlemUoe1xuXHRcdEFwcGxpY2F0aW9uT3BlbmVkV2l0aEZpbGU6IFwiY29tbW9uOkFwcGxpY2F0aW9uT3BlbmVkV2l0aEZpbGVcIixcblx0XHRBcHBsaWNhdGlvblN0YXJ0ZWQ6IFwiY29tbW9uOkFwcGxpY2F0aW9uU3RhcnRlZFwiLFxuXHRcdFRoZW1lQ2hhbmdlZDogXCJjb21tb246VGhlbWVDaGFuZ2VkXCIsXG5cdFx0V2luZG93Q2xvc2luZzogXCJjb21tb246V2luZG93Q2xvc2luZ1wiLFxuXHRcdFdpbmRvd0RpZE1vdmU6IFwiY29tbW9uOldpbmRvd0RpZE1vdmVcIixcblx0XHRXaW5kb3dEaWRSZXNpemU6IFwiY29tbW9uOldpbmRvd0RpZFJlc2l6ZVwiLFxuXHRcdFdpbmRvd0RQSUNoYW5nZWQ6IFwiY29tbW9uOldpbmRvd0RQSUNoYW5nZWRcIixcblx0XHRXaW5kb3dGaWxlc0Ryb3BwZWQ6IFwiY29tbW9uOldpbmRvd0ZpbGVzRHJvcHBlZFwiLFxuXHRcdFdpbmRvd0ZvY3VzOiBcImNvbW1vbjpXaW5kb3dGb2N1c1wiLFxuXHRcdFdpbmRvd0Z1bGxzY3JlZW46IFwiY29tbW9uOldpbmRvd0Z1bGxzY3JlZW5cIixcblx0XHRXaW5kb3dIaWRlOiBcImNvbW1vbjpXaW5kb3dIaWRlXCIsXG5cdFx0V2luZG93TG9zdEZvY3VzOiBcImNvbW1vbjpXaW5kb3dMb3N0Rm9jdXNcIixcblx0XHRXaW5kb3dNYXhpbWlzZTogXCJjb21tb246V2luZG93TWF4aW1pc2VcIixcblx0XHRXaW5kb3dNaW5pbWlzZTogXCJjb21tb246V2luZG93TWluaW1pc2VcIixcblx0XHRXaW5kb3dSZXN0b3JlOiBcImNvbW1vbjpXaW5kb3dSZXN0b3JlXCIsXG5cdFx0V2luZG93UnVudGltZVJlYWR5OiBcImNvbW1vbjpXaW5kb3dSdW50aW1lUmVhZHlcIixcblx0XHRXaW5kb3dTaG93OiBcImNvbW1vbjpXaW5kb3dTaG93XCIsXG5cdFx0V2luZG93VW5GdWxsc2NyZWVuOiBcImNvbW1vbjpXaW5kb3dVbkZ1bGxzY3JlZW5cIixcblx0XHRXaW5kb3dVbk1heGltaXNlOiBcImNvbW1vbjpXaW5kb3dVbk1heGltaXNlXCIsXG5cdFx0V2luZG93VW5NaW5pbWlzZTogXCJjb21tb246V2luZG93VW5NaW5pbWlzZVwiLFxuXHRcdFdpbmRvd1pvb206IFwiY29tbW9uOldpbmRvd1pvb21cIixcblx0XHRXaW5kb3dab29tSW46IFwiY29tbW9uOldpbmRvd1pvb21JblwiLFxuXHRcdFdpbmRvd1pvb21PdXQ6IFwiY29tbW9uOldpbmRvd1pvb21PdXRcIixcblx0XHRXaW5kb3dab29tUmVzZXQ6IFwiY29tbW9uOldpbmRvd1pvb21SZXNldFwiLFxuXHR9KSxcbn0pO1xuIiwgIi8qXG4gXyAgICAgX18gICAgIF8gX19cbnwgfCAgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vKipcbiAqIExvZ3MgYSBtZXNzYWdlIHRvIHRoZSBjb25zb2xlIHdpdGggY3VzdG9tIGZvcm1hdHRpbmcuXG4gKlxuICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWJ1Z0xvZyhtZXNzYWdlOiBhbnkpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgJyVjIHdhaWxzMyAlYyAnICsgbWVzc2FnZSArICcgJyxcbiAgICAgICAgJ2JhY2tncm91bmQ6ICNhYTAwMDA7IGNvbG9yOiAjZmZmOyBib3JkZXItcmFkaXVzOiAzcHggMHB4IDBweCAzcHg7IHBhZGRpbmc6IDFweDsgZm9udC1zaXplOiAwLjdyZW0nLFxuICAgICAgICAnYmFja2dyb3VuZDogIzAwOTkwMDsgY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDBweCAzcHggM3B4IDBweDsgcGFkZGluZzogMXB4OyBmb250LXNpemU6IDAuN3JlbSdcbiAgICApO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSB3ZWJ2aWV3IHN1cHBvcnRzIHRoZSB7QGxpbmsgTW91c2VFdmVudCNidXR0b25zfSBwcm9wZXJ0eS5cbiAqIExvb2tpbmcgYXQgeW91IG1hY09TIEhpZ2ggU2llcnJhIVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FuVHJhY2tCdXR0b25zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAobmV3IE1vdXNlRXZlbnQoJ21vdXNlZG93bicpKS5idXR0b25zID09PSAwO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBicm93c2VyIHN1cHBvcnRzIHJlbW92aW5nIGxpc3RlbmVycyBieSB0cmlnZ2VyaW5nIGFuIEFib3J0U2lnbmFsXG4gKiAoc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FdmVudFRhcmdldC9hZGRFdmVudExpc3RlbmVyI3NpZ25hbCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYW5BYm9ydExpc3RlbmVycygpIHtcbiAgICBpZiAoIUV2ZW50VGFyZ2V0IHx8ICFBYm9ydFNpZ25hbCB8fCAhQWJvcnRDb250cm9sbGVyKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBsZXQgcmVzdWx0ID0gdHJ1ZTtcblxuICAgIGNvbnN0IHRhcmdldCA9IG5ldyBFdmVudFRhcmdldCgpO1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCAoKSA9PiB7IHJlc3VsdCA9IGZhbHNlOyB9LCB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfSk7XG4gICAgY29udHJvbGxlci5hYm9ydCgpO1xuICAgIHRhcmdldC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgndGVzdCcpKTtcblxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIGNsb3Nlc3QgSFRNTEVsZW1lbnQgYW5jZXN0b3Igb2YgYW4gZXZlbnQncyB0YXJnZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBldmVudFRhcmdldChldmVudDogRXZlbnQpOiBIVE1MRWxlbWVudCB7XG4gICAgaWYgKGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBldmVudC50YXJnZXQ7XG4gICAgfSBlbHNlIGlmICghKGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSAmJiBldmVudC50YXJnZXQgaW5zdGFuY2VvZiBOb2RlKSB7XG4gICAgICAgIHJldHVybiBldmVudC50YXJnZXQucGFyZW50RWxlbWVudCA/PyBkb2N1bWVudC5ib2R5O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBkb2N1bWVudC5ib2R5O1xuICAgIH1cbn1cblxuLyoqKlxuIFRoaXMgdGVjaG5pcXVlIGZvciBwcm9wZXIgbG9hZCBkZXRlY3Rpb24gaXMgdGFrZW4gZnJvbSBIVE1YOlxuXG4gQlNEIDItQ2xhdXNlIExpY2Vuc2VcblxuIENvcHlyaWdodCAoYykgMjAyMCwgQmlnIFNreSBTb2Z0d2FyZVxuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cbiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcblxuIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuXG4gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb25cbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cblxuIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4gQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEVcbiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTFxuIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SXG4gU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVJcbiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLFxuIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFXG4gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cblxuICoqKi9cblxubGV0IGlzUmVhZHkgPSBmYWxzZTtcbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB7IGlzUmVhZHkgPSB0cnVlIH0pO1xuXG5leHBvcnQgZnVuY3Rpb24gd2hlblJlYWR5KGNhbGxiYWNrOiAoKSA9PiB2b2lkKSB7XG4gICAgaWYgKGlzUmVhZHkgfHwgZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJykge1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBjYWxsYmFjayk7XG4gICAgfVxufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5pbXBvcnQge25ld1J1bnRpbWVDYWxsZXIsIG9iamVjdE5hbWVzfSBmcm9tIFwiLi9ydW50aW1lLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNjcmVlbiB9IGZyb20gXCIuL3NjcmVlbnMuanNcIjtcblxuY29uc3QgUG9zaXRpb25NZXRob2QgICAgICAgICAgICAgICAgICAgID0gMDtcbmNvbnN0IENlbnRlck1ldGhvZCAgICAgICAgICAgICAgICAgICAgICA9IDE7XG5jb25zdCBDbG9zZU1ldGhvZCAgICAgICAgICAgICAgICAgICAgICAgPSAyO1xuY29uc3QgRGlzYWJsZVNpemVDb25zdHJhaW50c01ldGhvZCAgICAgID0gMztcbmNvbnN0IEVuYWJsZVNpemVDb25zdHJhaW50c01ldGhvZCAgICAgICA9IDQ7XG5jb25zdCBGb2N1c01ldGhvZCAgICAgICAgICAgICAgICAgICAgICAgPSA1O1xuY29uc3QgRm9yY2VSZWxvYWRNZXRob2QgICAgICAgICAgICAgICAgID0gNjtcbmNvbnN0IEZ1bGxzY3JlZW5NZXRob2QgICAgICAgICAgICAgICAgICA9IDc7XG5jb25zdCBHZXRTY3JlZW5NZXRob2QgICAgICAgICAgICAgICAgICAgPSA4O1xuY29uc3QgR2V0Wm9vbU1ldGhvZCAgICAgICAgICAgICAgICAgICAgID0gOTtcbmNvbnN0IEhlaWdodE1ldGhvZCAgICAgICAgICAgICAgICAgICAgICA9IDEwO1xuY29uc3QgSGlkZU1ldGhvZCAgICAgICAgICAgICAgICAgICAgICAgID0gMTE7XG5jb25zdCBJc0ZvY3VzZWRNZXRob2QgICAgICAgICAgICAgICAgICAgPSAxMjtcbmNvbnN0IElzRnVsbHNjcmVlbk1ldGhvZCAgICAgICAgICAgICAgICA9IDEzO1xuY29uc3QgSXNNYXhpbWlzZWRNZXRob2QgICAgICAgICAgICAgICAgID0gMTQ7XG5jb25zdCBJc01pbmltaXNlZE1ldGhvZCAgICAgICAgICAgICAgICAgPSAxNTtcbmNvbnN0IE1heGltaXNlTWV0aG9kICAgICAgICAgICAgICAgICAgICA9IDE2O1xuY29uc3QgTWluaW1pc2VNZXRob2QgICAgICAgICAgICAgICAgICAgID0gMTc7XG5jb25zdCBOYW1lTWV0aG9kICAgICAgICAgICAgICAgICAgICAgICAgPSAxODtcbmNvbnN0IE9wZW5EZXZUb29sc01ldGhvZCAgICAgICAgICAgICAgICA9IDE5O1xuY29uc3QgUmVsYXRpdmVQb3NpdGlvbk1ldGhvZCAgICAgICAgICAgID0gMjA7XG5jb25zdCBSZWxvYWRNZXRob2QgICAgICAgICAgICAgICAgICAgICAgPSAyMTtcbmNvbnN0IFJlc2l6YWJsZU1ldGhvZCAgICAgICAgICAgICAgICAgICA9IDIyO1xuY29uc3QgUmVzdG9yZU1ldGhvZCAgICAgICAgICAgICAgICAgICAgID0gMjM7XG5jb25zdCBTZXRQb3NpdGlvbk1ldGhvZCAgICAgICAgICAgICAgICAgPSAyNDtcbmNvbnN0IFNldEFsd2F5c09uVG9wTWV0aG9kICAgICAgICAgICAgICA9IDI1O1xuY29uc3QgU2V0QmFja2dyb3VuZENvbG91ck1ldGhvZCAgICAgICAgID0gMjY7XG5jb25zdCBTZXRGcmFtZWxlc3NNZXRob2QgICAgICAgICAgICAgICAgPSAyNztcbmNvbnN0IFNldEZ1bGxzY3JlZW5CdXR0b25FbmFibGVkTWV0aG9kICA9IDI4O1xuY29uc3QgU2V0TWF4U2l6ZU1ldGhvZCAgICAgICAgICAgICAgICAgID0gMjk7XG5jb25zdCBTZXRNaW5TaXplTWV0aG9kICAgICAgICAgICAgICAgICAgPSAzMDtcbmNvbnN0IFNldFJlbGF0aXZlUG9zaXRpb25NZXRob2QgICAgICAgICA9IDMxO1xuY29uc3QgU2V0UmVzaXphYmxlTWV0aG9kICAgICAgICAgICAgICAgID0gMzI7XG5jb25zdCBTZXRTaXplTWV0aG9kICAgICAgICAgICAgICAgICAgICAgPSAzMztcbmNvbnN0IFNldFRpdGxlTWV0aG9kICAgICAgICAgICAgICAgICAgICA9IDM0O1xuY29uc3QgU2V0Wm9vbU1ldGhvZCAgICAgICAgICAgICAgICAgICAgID0gMzU7XG5jb25zdCBTaG93TWV0aG9kICAgICAgICAgICAgICAgICAgICAgICAgPSAzNjtcbmNvbnN0IFNpemVNZXRob2QgICAgICAgICAgICAgICAgICAgICAgICA9IDM3O1xuY29uc3QgVG9nZ2xlRnVsbHNjcmVlbk1ldGhvZCAgICAgICAgICAgID0gMzg7XG5jb25zdCBUb2dnbGVNYXhpbWlzZU1ldGhvZCAgICAgICAgICAgICAgPSAzOTtcbmNvbnN0IFVuRnVsbHNjcmVlbk1ldGhvZCAgICAgICAgICAgICAgICA9IDQwO1xuY29uc3QgVW5NYXhpbWlzZU1ldGhvZCAgICAgICAgICAgICAgICAgID0gNDE7XG5jb25zdCBVbk1pbmltaXNlTWV0aG9kICAgICAgICAgICAgICAgICAgPSA0MjtcbmNvbnN0IFdpZHRoTWV0aG9kICAgICAgICAgICAgICAgICAgICAgICA9IDQzO1xuY29uc3QgWm9vbU1ldGhvZCAgICAgICAgICAgICAgICAgICAgICAgID0gNDQ7XG5jb25zdCBab29tSW5NZXRob2QgICAgICAgICAgICAgICAgICAgICAgPSA0NTtcbmNvbnN0IFpvb21PdXRNZXRob2QgICAgICAgICAgICAgICAgICAgICA9IDQ2O1xuY29uc3QgWm9vbVJlc2V0TWV0aG9kICAgICAgICAgICAgICAgICAgID0gNDc7XG5cbi8qKlxuICogQSByZWNvcmQgZGVzY3JpYmluZyB0aGUgcG9zaXRpb24gb2YgYSB3aW5kb3cuXG4gKi9cbmludGVyZmFjZSBQb3NpdGlvbiB7XG4gICAgLyoqIFRoZSBob3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoZSB3aW5kb3cuICovXG4gICAgeDogbnVtYmVyO1xuICAgIC8qKiBUaGUgdmVydGljYWwgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy4gKi9cbiAgICB5OiBudW1iZXI7XG59XG5cbi8qKlxuICogQSByZWNvcmQgZGVzY3JpYmluZyB0aGUgc2l6ZSBvZiBhIHdpbmRvdy5cbiAqL1xuaW50ZXJmYWNlIFNpemUge1xuICAgIC8qKiBUaGUgd2lkdGggb2YgdGhlIHdpbmRvdy4gKi9cbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIC8qKiBUaGUgaGVpZ2h0IG9mIHRoZSB3aW5kb3cuICovXG4gICAgaGVpZ2h0OiBudW1iZXI7XG59XG5cbi8vIFByaXZhdGUgZmllbGQgbmFtZXMuXG5jb25zdCBjYWxsZXJTeW0gPSBTeW1ib2woXCJjYWxsZXJcIik7XG5cbmNsYXNzIFdpbmRvdyB7XG4gICAgLy8gUHJpdmF0ZSBmaWVsZHMuXG4gICAgcHJpdmF0ZSBbY2FsbGVyU3ltXTogKG1lc3NhZ2U6IG51bWJlciwgYXJncz86IGFueSkgPT4gUHJvbWlzZTxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGlzZXMgYSB3aW5kb3cgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YXJnZXQgd2luZG93LlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZyA9ICcnKSB7XG4gICAgICAgIHRoaXNbY2FsbGVyU3ltXSA9IG5ld1J1bnRpbWVDYWxsZXIob2JqZWN0TmFtZXMuV2luZG93LCBuYW1lKVxuXG4gICAgICAgIC8vIGJpbmQgaW5zdGFuY2UgbWV0aG9kIHRvIG1ha2UgdGhlbSBlYXNpbHkgdXNhYmxlIGluIGV2ZW50IGhhbmRsZXJzXG4gICAgICAgIGZvciAoY29uc3QgbWV0aG9kIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKFdpbmRvdy5wcm90b3R5cGUpKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgbWV0aG9kICE9PSBcImNvbnN0cnVjdG9yXCJcbiAgICAgICAgICAgICAgICAmJiB0eXBlb2YgKHRoaXMgYXMgYW55KVttZXRob2RdID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICh0aGlzIGFzIGFueSlbbWV0aG9kXSA9ICh0aGlzIGFzIGFueSlbbWV0aG9kXS5iaW5kKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgc3BlY2lmaWVkIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHdpbmRvdyB0byBnZXQuXG4gICAgICogQHJldHVybnMgVGhlIGNvcnJlc3BvbmRpbmcgd2luZG93IG9iamVjdC5cbiAgICAgKi9cbiAgICBHZXQobmFtZTogc3RyaW5nKTogV2luZG93IHtcbiAgICAgICAgcmV0dXJuIG5ldyBXaW5kb3cobmFtZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IGFic29sdXRlIHBvc2l0aW9uIG9mIHRoZSB3aW5kb3cuXG4gICAgICovXG4gICAgUG9zaXRpb24oKTogUHJvbWlzZTxQb3NpdGlvbj4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFBvc2l0aW9uTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDZW50ZXJzIHRoZSB3aW5kb3cgb24gdGhlIHNjcmVlbi5cbiAgICAgKi9cbiAgICBDZW50ZXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oQ2VudGVyTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBDbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShDbG9zZU1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZXMgbWluL21heCBzaXplIGNvbnN0cmFpbnRzLlxuICAgICAqL1xuICAgIERpc2FibGVTaXplQ29uc3RyYWludHMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oRGlzYWJsZVNpemVDb25zdHJhaW50c01ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyBtaW4vbWF4IHNpemUgY29uc3RyYWludHMuXG4gICAgICovXG4gICAgRW5hYmxlU2l6ZUNvbnN0cmFpbnRzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEVuYWJsZVNpemVDb25zdHJhaW50c01ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9jdXNlcyB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIEZvY3VzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEZvY3VzTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JjZXMgdGhlIHdpbmRvdyB0byByZWxvYWQgdGhlIHBhZ2UgYXNzZXRzLlxuICAgICAqL1xuICAgIEZvcmNlUmVsb2FkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEZvcmNlUmVsb2FkTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTd2l0Y2hlcyB0aGUgd2luZG93IHRvIGZ1bGxzY3JlZW4gbW9kZS5cbiAgICAgKi9cbiAgICBGdWxsc2NyZWVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEZ1bGxzY3JlZW5NZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHNjcmVlbiB0aGF0IHRoZSB3aW5kb3cgaXMgb24uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgc2NyZWVuIHRoZSB3aW5kb3cgaXMgY3VycmVudGx5IG9uLlxuICAgICAqL1xuICAgIEdldFNjcmVlbigpOiBQcm9taXNlPFNjcmVlbj4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEdldFNjcmVlbk1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudCB6b29tIGxldmVsIG9mIHRoZSB3aW5kb3cuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCB6b29tIGxldmVsLlxuICAgICAqL1xuICAgIEdldFpvb20oKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShHZXRab29tTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBoZWlnaHQgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IGhlaWdodCBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIEhlaWdodCgpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEhlaWdodE1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGlkZXMgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBIaWRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEhpZGVNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgd2luZG93IGlzIGZvY3VzZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSB3aW5kb3cgaXMgY3VycmVudGx5IGZvY3VzZWQuXG4gICAgICovXG4gICAgSXNGb2N1c2VkKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKElzRm9jdXNlZE1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB3aW5kb3cgaXMgZnVsbHNjcmVlbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIHdpbmRvdyBpcyBjdXJyZW50bHkgZnVsbHNjcmVlbi5cbiAgICAgKi9cbiAgICBJc0Z1bGxzY3JlZW4oKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oSXNGdWxsc2NyZWVuTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHdpbmRvdyBpcyBtYXhpbWlzZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSB3aW5kb3cgaXMgY3VycmVudGx5IG1heGltaXNlZC5cbiAgICAgKi9cbiAgICBJc01heGltaXNlZCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShJc01heGltaXNlZE1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB3aW5kb3cgaXMgbWluaW1pc2VkLlxuICAgICAqXG4gICAgICogQHJldHVybnMgV2hldGhlciB0aGUgd2luZG93IGlzIGN1cnJlbnRseSBtaW5pbWlzZWQuXG4gICAgICovXG4gICAgSXNNaW5pbWlzZWQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oSXNNaW5pbWlzZWRNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1heGltaXNlcyB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIE1heGltaXNlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKE1heGltaXNlTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNaW5pbWlzZXMgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBNaW5pbWlzZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShNaW5pbWlzZU1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgd2luZG93LlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIG5hbWUgb2YgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBOYW1lKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oTmFtZU1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3BlbnMgdGhlIGRldmVsb3BtZW50IHRvb2xzIHBhbmUuXG4gICAgICovXG4gICAgT3BlbkRldlRvb2xzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKE9wZW5EZXZUb29sc01ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcmVsYXRpdmUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdyB0byB0aGUgc2NyZWVuLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIGN1cnJlbnQgcmVsYXRpdmUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBSZWxhdGl2ZVBvc2l0aW9uKCk6IFByb21pc2U8UG9zaXRpb24+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShSZWxhdGl2ZVBvc2l0aW9uTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWxvYWRzIHRoZSBwYWdlIGFzc2V0cy5cbiAgICAgKi9cbiAgICBSZWxvYWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oUmVsb2FkTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHdpbmRvdyBpcyByZXNpemFibGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSB3aW5kb3cgaXMgY3VycmVudGx5IHJlc2l6YWJsZS5cbiAgICAgKi9cbiAgICBSZXNpemFibGUoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oUmVzaXphYmxlTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXN0b3JlcyB0aGUgd2luZG93IHRvIGl0cyBwcmV2aW91cyBzdGF0ZSBpZiBpdCB3YXMgcHJldmlvdXNseSBtaW5pbWlzZWQsIG1heGltaXNlZCBvciBmdWxsc2NyZWVuLlxuICAgICAqL1xuICAgIFJlc3RvcmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oUmVzdG9yZU1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB4IC0gVGhlIGRlc2lyZWQgaG9yaXpvbnRhbCBhYnNvbHV0ZSBwb3NpdGlvbiBvZiB0aGUgd2luZG93LlxuICAgICAqIEBwYXJhbSB5IC0gVGhlIGRlc2lyZWQgdmVydGljYWwgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBTZXRQb3NpdGlvbih4OiBudW1iZXIsIHk6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFNldFBvc2l0aW9uTWV0aG9kLCB7IHgsIHkgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgd2luZG93IHRvIGJlIGFsd2F5cyBvbiB0b3AuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYWx3YXlzT25Ub3AgLSBXaGV0aGVyIHRoZSB3aW5kb3cgc2hvdWxkIHN0YXkgb24gdG9wLlxuICAgICAqL1xuICAgIFNldEFsd2F5c09uVG9wKGFsd2F5c09uVG9wOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2V0QWx3YXlzT25Ub3BNZXRob2QsIHsgYWx3YXlzT25Ub3AgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgYmFja2dyb3VuZCBjb2xvdXIgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByIC0gVGhlIGRlc2lyZWQgcmVkIGNvbXBvbmVudCBvZiB0aGUgd2luZG93IGJhY2tncm91bmQuXG4gICAgICogQHBhcmFtIGcgLSBUaGUgZGVzaXJlZCBncmVlbiBjb21wb25lbnQgb2YgdGhlIHdpbmRvdyBiYWNrZ3JvdW5kLlxuICAgICAqIEBwYXJhbSBiIC0gVGhlIGRlc2lyZWQgYmx1ZSBjb21wb25lbnQgb2YgdGhlIHdpbmRvdyBiYWNrZ3JvdW5kLlxuICAgICAqIEBwYXJhbSBhIC0gVGhlIGRlc2lyZWQgYWxwaGEgY29tcG9uZW50IG9mIHRoZSB3aW5kb3cgYmFja2dyb3VuZC5cbiAgICAgKi9cbiAgICBTZXRCYWNrZ3JvdW5kQ29sb3VyKHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIsIGE6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFNldEJhY2tncm91bmRDb2xvdXJNZXRob2QsIHsgciwgZywgYiwgYSB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSB3aW5kb3cgZnJhbWUgYW5kIHRpdGxlIGJhci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmcmFtZWxlc3MgLSBXaGV0aGVyIHRoZSB3aW5kb3cgc2hvdWxkIGJlIGZyYW1lbGVzcy5cbiAgICAgKi9cbiAgICBTZXRGcmFtZWxlc3MoZnJhbWVsZXNzOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2V0RnJhbWVsZXNzTWV0aG9kLCB7IGZyYW1lbGVzcyB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlcyB0aGUgc3lzdGVtIGZ1bGxzY3JlZW4gYnV0dG9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVuYWJsZWQgLSBXaGV0aGVyIHRoZSBmdWxsc2NyZWVuIGJ1dHRvbiBzaG91bGQgYmUgZW5hYmxlZC5cbiAgICAgKi9cbiAgICBTZXRGdWxsc2NyZWVuQnV0dG9uRW5hYmxlZChlbmFibGVkOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2V0RnVsbHNjcmVlbkJ1dHRvbkVuYWJsZWRNZXRob2QsIHsgZW5hYmxlZCB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB3aWR0aCAtIFRoZSBkZXNpcmVkIG1heGltdW0gd2lkdGggb2YgdGhlIHdpbmRvdy5cbiAgICAgKiBAcGFyYW0gaGVpZ2h0IC0gVGhlIGRlc2lyZWQgbWF4aW11bSBoZWlnaHQgb2YgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBTZXRNYXhTaXplKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2V0TWF4U2l6ZU1ldGhvZCwgeyB3aWR0aCwgaGVpZ2h0IH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIG1pbmltdW0gc2l6ZSBvZiB0aGUgd2luZG93LlxuICAgICAqXG4gICAgICogQHBhcmFtIHdpZHRoIC0gVGhlIGRlc2lyZWQgbWluaW11bSB3aWR0aCBvZiB0aGUgd2luZG93LlxuICAgICAqIEBwYXJhbSBoZWlnaHQgLSBUaGUgZGVzaXJlZCBtaW5pbXVtIGhlaWdodCBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFNldE1pblNpemUod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShTZXRNaW5TaXplTWV0aG9kLCB7IHdpZHRoLCBoZWlnaHQgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcmVsYXRpdmUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdyB0byB0aGUgc2NyZWVuLlxuICAgICAqXG4gICAgICogQHBhcmFtIHggLSBUaGUgZGVzaXJlZCBob3Jpem9udGFsIHJlbGF0aXZlIHBvc2l0aW9uIG9mIHRoZSB3aW5kb3cuXG4gICAgICogQHBhcmFtIHkgLSBUaGUgZGVzaXJlZCB2ZXJ0aWNhbCByZWxhdGl2ZSBwb3NpdGlvbiBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFNldFJlbGF0aXZlUG9zaXRpb24oeDogbnVtYmVyLCB5OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShTZXRSZWxhdGl2ZVBvc2l0aW9uTWV0aG9kLCB7IHgsIHkgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB3aGV0aGVyIHRoZSB3aW5kb3cgaXMgcmVzaXphYmxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlc2l6YWJsZSAtIFdoZXRoZXIgdGhlIHdpbmRvdyBzaG91bGQgYmUgcmVzaXphYmxlLlxuICAgICAqL1xuICAgIFNldFJlc2l6YWJsZShyZXNpemFibGU6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShTZXRSZXNpemFibGVNZXRob2QsIHsgcmVzaXphYmxlIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHNpemUgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB3aWR0aCAtIFRoZSBkZXNpcmVkIHdpZHRoIG9mIHRoZSB3aW5kb3cuXG4gICAgICogQHBhcmFtIGhlaWdodCAtIFRoZSBkZXNpcmVkIGhlaWdodCBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFNldFNpemUod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShTZXRTaXplTWV0aG9kLCB7IHdpZHRoLCBoZWlnaHQgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdGl0bGUgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0aXRsZSAtIFRoZSBkZXNpcmVkIHRpdGxlIG9mIHRoZSB3aW5kb3cuXG4gICAgICovXG4gICAgU2V0VGl0bGUodGl0bGU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFNldFRpdGxlTWV0aG9kLCB7IHRpdGxlIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHpvb20gbGV2ZWwgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB6b29tIC0gVGhlIGRlc2lyZWQgem9vbSBsZXZlbC5cbiAgICAgKi9cbiAgICBTZXRab29tKHpvb206IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFNldFpvb21NZXRob2QsIHsgem9vbSB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTaG93cyB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFNob3coKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2hvd01ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgd2luZG93LlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFNpemUoKTogUHJvbWlzZTxTaXplPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2l6ZU1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG9nZ2xlcyB0aGUgd2luZG93IGJldHdlZW4gZnVsbHNjcmVlbiBhbmQgbm9ybWFsLlxuICAgICAqL1xuICAgIFRvZ2dsZUZ1bGxzY3JlZW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oVG9nZ2xlRnVsbHNjcmVlbk1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG9nZ2xlcyB0aGUgd2luZG93IGJldHdlZW4gbWF4aW1pc2VkIGFuZCBub3JtYWwuXG4gICAgICovXG4gICAgVG9nZ2xlTWF4aW1pc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oVG9nZ2xlTWF4aW1pc2VNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVuLWZ1bGxzY3JlZW5zIHRoZSB3aW5kb3cuXG4gICAgICovXG4gICAgVW5GdWxsc2NyZWVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFVuRnVsbHNjcmVlbk1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVW4tbWF4aW1pc2VzIHRoZSB3aW5kb3cuXG4gICAgICovXG4gICAgVW5NYXhpbWlzZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShVbk1heGltaXNlTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVbi1taW5pbWlzZXMgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBVbk1pbmltaXNlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFVuTWluaW1pc2VNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHdpZHRoIG9mIHRoZSB3aW5kb3cuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCB3aWR0aCBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFdpZHRoKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oV2lkdGhNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFpvb21zIHRoZSB3aW5kb3cuXG4gICAgICovXG4gICAgWm9vbSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShab29tTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbmNyZWFzZXMgdGhlIHpvb20gbGV2ZWwgb2YgdGhlIHdlYnZpZXcgY29udGVudC5cbiAgICAgKi9cbiAgICBab29tSW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oWm9vbUluTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWNyZWFzZXMgdGhlIHpvb20gbGV2ZWwgb2YgdGhlIHdlYnZpZXcgY29udGVudC5cbiAgICAgKi9cbiAgICBab29tT3V0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFpvb21PdXRNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUgem9vbSBsZXZlbCBvZiB0aGUgd2VidmlldyBjb250ZW50LlxuICAgICAqL1xuICAgIFpvb21SZXNldCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShab29tUmVzZXRNZXRob2QpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBUaGUgd2luZG93IHdpdGhpbiB3aGljaCB0aGUgc2NyaXB0IGlzIHJ1bm5pbmcuXG4gKi9cbmNvbnN0IHRoaXNXaW5kb3cgPSBuZXcgV2luZG93KCcnKTtcblxuZXhwb3J0IGRlZmF1bHQgdGhpc1dpbmRvdztcbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuaW1wb3J0ICogYXMgUnVudGltZSBmcm9tIFwiLi4vQHdhaWxzaW8vcnVudGltZS9zcmNcIjtcblxuLy8gTk9URTogdGhlIGZvbGxvd2luZyBtZXRob2RzIE1VU1QgYmUgaW1wb3J0ZWQgZXhwbGljaXRseSBiZWNhdXNlIG9mIGhvdyBlc2J1aWxkIGluamVjdGlvbiB3b3Jrc1xuaW1wb3J0IHsgRW5hYmxlIGFzIEVuYWJsZVdNTCB9IGZyb20gXCIuLi9Ad2FpbHNpby9ydW50aW1lL3NyYy93bWxcIjtcbmltcG9ydCB7IGRlYnVnTG9nIH0gZnJvbSBcIi4uL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3V0aWxzXCI7XG5cbndpbmRvdy53YWlscyA9IFJ1bnRpbWU7XG5FbmFibGVXTUwoKTtcblxuaWYgKERFQlVHKSB7XG4gICAgZGVidWdMb2coXCJXYWlscyBSdW50aW1lIExvYWRlZFwiKVxufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5pbXBvcnQgeyBuZXdSdW50aW1lQ2FsbGVyLCBvYmplY3ROYW1lcyB9IGZyb20gXCIuL3J1bnRpbWUuanNcIjtcblxuY29uc3QgY2FsbCA9IG5ld1J1bnRpbWVDYWxsZXIob2JqZWN0TmFtZXMuU3lzdGVtKTtcblxuY29uc3QgU3lzdGVtSXNEYXJrTW9kZSA9IDA7XG5jb25zdCBTeXN0ZW1FbnZpcm9ubWVudCA9IDE7XG5cbmNvbnN0IF9pbnZva2UgPSAoZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICgod2luZG93IGFzIGFueSkuY2hyb21lPy53ZWJ2aWV3Py5wb3N0TWVzc2FnZSkge1xuICAgICAgICAgICAgcmV0dXJuICh3aW5kb3cgYXMgYW55KS5jaHJvbWUud2Vidmlldy5wb3N0TWVzc2FnZS5iaW5kKCh3aW5kb3cgYXMgYW55KS5jaHJvbWUud2Vidmlldyk7XG4gICAgICAgIH0gZWxzZSBpZiAoKHdpbmRvdyBhcyBhbnkpLndlYmtpdD8ubWVzc2FnZUhhbmRsZXJzPy5bJ2V4dGVybmFsJ10/LnBvc3RNZXNzYWdlKSB7XG4gICAgICAgICAgICByZXR1cm4gKHdpbmRvdyBhcyBhbnkpLndlYmtpdC5tZXNzYWdlSGFuZGxlcnNbJ2V4dGVybmFsJ10ucG9zdE1lc3NhZ2UuYmluZCgod2luZG93IGFzIGFueSkud2Via2l0Lm1lc3NhZ2VIYW5kbGVyc1snZXh0ZXJuYWwnXSk7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoKGUpIHt9XG5cbiAgICBjb25zb2xlLndhcm4oJ1xcbiVjXHUyNkEwXHVGRTBGIEJyb3dzZXIgRW52aXJvbm1lbnQgRGV0ZWN0ZWQgJWNcXG5cXG4lY09ubHkgVUkgcHJldmlld3MgYXJlIGF2YWlsYWJsZSBpbiB0aGUgYnJvd3Nlci4gRm9yIGZ1bGwgZnVuY3Rpb25hbGl0eSwgcGxlYXNlIHJ1biB0aGUgYXBwbGljYXRpb24gaW4gZGVza3RvcCBtb2RlLlxcbk1vcmUgaW5mb3JtYXRpb24gYXQ6IGh0dHBzOi8vdjMud2FpbHMuaW8vbGVhcm4vYnVpbGQvI3VzaW5nLWEtYnJvd3Nlci1mb3ItZGV2ZWxvcG1lbnRcXG4nLFxuICAgICAgICAnYmFja2dyb3VuZDogI2ZmZmZmZjsgY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyBwYWRkaW5nOiA0cHggOHB4OyBib3JkZXItcmFkaXVzOiA0cHg7IGJvcmRlcjogMnB4IHNvbGlkICMwMDAwMDA7JyxcbiAgICAgICAgJ2JhY2tncm91bmQ6IHRyYW5zcGFyZW50OycsXG4gICAgICAgICdjb2xvcjogI2ZmZmZmZjsgZm9udC1zdHlsZTogaXRhbGljOyBmb250LXdlaWdodDogYm9sZDsnKTtcbiAgICByZXR1cm4gbnVsbDtcbn0pKCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnZva2UobXNnOiBhbnkpOiB2b2lkIHtcbiAgICBfaW52b2tlPy4obXNnKTtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIHN5c3RlbSBkYXJrIG1vZGUgc3RhdHVzLlxuICpcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGEgYm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIGlmIHRoZSBzeXN0ZW0gaXMgaW4gZGFyayBtb2RlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSXNEYXJrTW9kZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gY2FsbChTeXN0ZW1Jc0RhcmtNb2RlKTtcbn1cblxuLyoqXG4gKiBGZXRjaGVzIHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhlIGFwcGxpY2F0aW9uIGZyb20gdGhlIHNlcnZlci5cbiAqXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgY2FwYWJpbGl0aWVzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gQ2FwYWJpbGl0aWVzKCk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGxldCByZXNwb25zZSA9IGF3YWl0IGZldGNoKFwiL3dhaWxzL2NhcGFiaWxpdGllc1wiKTtcbiAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjb3VsZCBub3QgZmV0Y2ggY2FwYWJpbGl0aWVzOiBcIiArIHJlc3BvbnNlLnN0YXR1c1RleHQpO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBPU0luZm8ge1xuICAgIC8qKiBUaGUgYnJhbmRpbmcgb2YgdGhlIE9TLiAqL1xuICAgIEJyYW5kaW5nOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBJRCBvZiB0aGUgT1MuICovXG4gICAgSUQ6IHN0cmluZztcbiAgICAvKiogVGhlIG5hbWUgb2YgdGhlIE9TLiAqL1xuICAgIE5hbWU6IHN0cmluZztcbiAgICAvKiogVGhlIHZlcnNpb24gb2YgdGhlIE9TLiAqL1xuICAgIFZlcnNpb246IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbnZpcm9ubWVudEluZm8ge1xuICAgIC8qKiBUaGUgYXJjaGl0ZWN0dXJlIG9mIHRoZSBzeXN0ZW0uICovXG4gICAgQXJjaDogc3RyaW5nO1xuICAgIC8qKiBUcnVlIGlmIHRoZSBhcHBsaWNhdGlvbiBpcyBydW5uaW5nIGluIGRlYnVnIG1vZGUsIG90aGVyd2lzZSBmYWxzZS4gKi9cbiAgICBEZWJ1ZzogYm9vbGVhbjtcbiAgICAvKiogVGhlIG9wZXJhdGluZyBzeXN0ZW0gaW4gdXNlLiAqL1xuICAgIE9TOiBzdHJpbmc7XG4gICAgLyoqIERldGFpbHMgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0uICovXG4gICAgT1NJbmZvOiBPU0luZm87XG4gICAgLyoqIEFkZGl0aW9uYWwgcGxhdGZvcm0gaW5mb3JtYXRpb24uICovXG4gICAgUGxhdGZvcm1JbmZvOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyBlbnZpcm9ubWVudCBkZXRhaWxzLlxuICpcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIG9iamVjdCBjb250YWluaW5nIE9TIGFuZCBzeXN0ZW0gYXJjaGl0ZWN0dXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gRW52aXJvbm1lbnQoKTogUHJvbWlzZTxFbnZpcm9ubWVudEluZm8+IHtcbiAgICByZXR1cm4gY2FsbChTeXN0ZW1FbnZpcm9ubWVudCk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBjdXJyZW50IG9wZXJhdGluZyBzeXN0ZW0gaXMgV2luZG93cy5cbiAqXG4gKiBAcmV0dXJuIFRydWUgaWYgdGhlIG9wZXJhdGluZyBzeXN0ZW0gaXMgV2luZG93cywgb3RoZXJ3aXNlIGZhbHNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSXNXaW5kb3dzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB3aW5kb3cuX3dhaWxzLmVudmlyb25tZW50Lk9TID09PSBcIndpbmRvd3NcIjtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGN1cnJlbnQgb3BlcmF0aW5nIHN5c3RlbSBpcyBMaW51eC5cbiAqXG4gKiBAcmV0dXJucyBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgb3BlcmF0aW5nIHN5c3RlbSBpcyBMaW51eCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSXNMaW51eCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gd2luZG93Ll93YWlscy5lbnZpcm9ubWVudC5PUyA9PT0gXCJsaW51eFwiO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgY3VycmVudCBlbnZpcm9ubWVudCBpcyBhIG1hY09TIG9wZXJhdGluZyBzeXN0ZW0uXG4gKlxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgZW52aXJvbm1lbnQgaXMgbWFjT1MsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIElzTWFjKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB3aW5kb3cuX3dhaWxzLmVudmlyb25tZW50Lk9TID09PSBcImRhcndpblwiO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgY3VycmVudCBlbnZpcm9ubWVudCBhcmNoaXRlY3R1cmUgaXMgQU1ENjQuXG4gKlxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgY3VycmVudCBlbnZpcm9ubWVudCBhcmNoaXRlY3R1cmUgaXMgQU1ENjQsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIElzQU1ENjQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHdpbmRvdy5fd2FpbHMuZW52aXJvbm1lbnQuQXJjaCA9PT0gXCJhbWQ2NFwiO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgY3VycmVudCBhcmNoaXRlY3R1cmUgaXMgQVJNLlxuICpcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGN1cnJlbnQgYXJjaGl0ZWN0dXJlIGlzIEFSTSwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSXNBUk0oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHdpbmRvdy5fd2FpbHMuZW52aXJvbm1lbnQuQXJjaCA9PT0gXCJhcm1cIjtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgaXMgQVJNNjQgYXJjaGl0ZWN0dXJlLlxuICpcbiAqIEByZXR1cm5zIFJldHVybnMgdHJ1ZSBpZiB0aGUgZW52aXJvbm1lbnQgaXMgQVJNNjQgYXJjaGl0ZWN0dXJlLCBvdGhlcndpc2UgcmV0dXJucyBmYWxzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIElzQVJNNjQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHdpbmRvdy5fd2FpbHMuZW52aXJvbm1lbnQuQXJjaCA9PT0gXCJhcm02NFwiO1xufVxuXG4vKipcbiAqIFJlcG9ydHMgd2hldGhlciB0aGUgYXBwIGlzIGJlaW5nIHJ1biBpbiBkZWJ1ZyBtb2RlLlxuICpcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGFwcCBpcyBiZWluZyBydW4gaW4gZGVidWcgbW9kZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIElzRGVidWcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEJvb2xlYW4od2luZG93Ll93YWlscy5lbnZpcm9ubWVudC5EZWJ1Zyk7XG59XG5cbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuaW1wb3J0IHsgbmV3UnVudGltZUNhbGxlciwgb2JqZWN0TmFtZXMgfSBmcm9tIFwiLi9ydW50aW1lLmpzXCI7XG5pbXBvcnQgeyBJc0RlYnVnIH0gZnJvbSBcIi4vc3lzdGVtLmpzXCI7XG5pbXBvcnQgeyBldmVudFRhcmdldCB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbi8vIHNldHVwXG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCBjb250ZXh0TWVudUhhbmRsZXIpO1xuXG5jb25zdCBjYWxsID0gbmV3UnVudGltZUNhbGxlcihvYmplY3ROYW1lcy5Db250ZXh0TWVudSk7XG5cbmNvbnN0IENvbnRleHRNZW51T3BlbiA9IDA7XG5cbmZ1bmN0aW9uIG9wZW5Db250ZXh0TWVudShpZDogc3RyaW5nLCB4OiBudW1iZXIsIHk6IG51bWJlciwgZGF0YTogYW55KTogdm9pZCB7XG4gICAgdm9pZCBjYWxsKENvbnRleHRNZW51T3Blbiwge2lkLCB4LCB5LCBkYXRhfSk7XG59XG5cbmZ1bmN0aW9uIGNvbnRleHRNZW51SGFuZGxlcihldmVudDogTW91c2VFdmVudCkge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50VGFyZ2V0KGV2ZW50KTtcblxuICAgIC8vIENoZWNrIGZvciBjdXN0b20gY29udGV4dCBtZW51XG4gICAgY29uc3QgY3VzdG9tQ29udGV4dE1lbnUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXQpLmdldFByb3BlcnR5VmFsdWUoXCItLWN1c3RvbS1jb250ZXh0bWVudVwiKS50cmltKCk7XG5cbiAgICBpZiAoY3VzdG9tQ29udGV4dE1lbnUpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRhcmdldCkuZ2V0UHJvcGVydHlWYWx1ZShcIi0tY3VzdG9tLWNvbnRleHRtZW51LWRhdGFcIik7XG4gICAgICAgIG9wZW5Db250ZXh0TWVudShjdXN0b21Db250ZXh0TWVudSwgZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSwgZGF0YSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcHJvY2Vzc0RlZmF1bHRDb250ZXh0TWVudShldmVudCwgdGFyZ2V0KTtcbiAgICB9XG59XG5cblxuLypcbi0tZGVmYXVsdC1jb250ZXh0bWVudTogYXV0bzsgKGRlZmF1bHQpIHdpbGwgc2hvdyB0aGUgZGVmYXVsdCBjb250ZXh0IG1lbnUgaWYgY29udGVudEVkaXRhYmxlIGlzIHRydWUgT1IgdGV4dCBoYXMgYmVlbiBzZWxlY3RlZCBPUiBlbGVtZW50IGlzIGlucHV0IG9yIHRleHRhcmVhXG4tLWRlZmF1bHQtY29udGV4dG1lbnU6IHNob3c7IHdpbGwgYWx3YXlzIHNob3cgdGhlIGRlZmF1bHQgY29udGV4dCBtZW51XG4tLWRlZmF1bHQtY29udGV4dG1lbnU6IGhpZGU7IHdpbGwgYWx3YXlzIGhpZGUgdGhlIGRlZmF1bHQgY29udGV4dCBtZW51XG5cblRoaXMgcnVsZSBpcyBpbmhlcml0ZWQgbGlrZSBub3JtYWwgQ1NTIHJ1bGVzLCBzbyBuZXN0aW5nIHdvcmtzIGFzIGV4cGVjdGVkXG4qL1xuZnVuY3Rpb24gcHJvY2Vzc0RlZmF1bHRDb250ZXh0TWVudShldmVudDogTW91c2VFdmVudCwgdGFyZ2V0OiBIVE1MRWxlbWVudCkge1xuICAgIC8vIERlYnVnIGJ1aWxkcyBhbHdheXMgc2hvdyB0aGUgbWVudVxuICAgIGlmIChJc0RlYnVnKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFByb2Nlc3MgZGVmYXVsdCBjb250ZXh0IG1lbnVcbiAgICBzd2l0Y2ggKHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRhcmdldCkuZ2V0UHJvcGVydHlWYWx1ZShcIi0tZGVmYXVsdC1jb250ZXh0bWVudVwiKS50cmltKCkpIHtcbiAgICAgICAgY2FzZSAnc2hvdyc6XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgJ2hpZGUnOlxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBjb250ZW50RWRpdGFibGUgaXMgdHJ1ZVxuICAgIGlmICh0YXJnZXQuaXNDb250ZW50RWRpdGFibGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHRleHQgaGFzIGJlZW4gc2VsZWN0ZWRcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgY29uc3QgaGFzU2VsZWN0aW9uID0gc2VsZWN0aW9uICYmIHNlbGVjdGlvbi50b1N0cmluZygpLmxlbmd0aCA+IDA7XG4gICAgaWYgKGhhc1NlbGVjdGlvbikge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlbGVjdGlvbi5yYW5nZUNvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoaSk7XG4gICAgICAgICAgICBjb25zdCByZWN0cyA9IHJhbmdlLmdldENsaWVudFJlY3RzKCk7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJlY3RzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVjdCA9IHJlY3RzW2pdO1xuICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KHJlY3QubGVmdCwgcmVjdC50b3ApID09PSB0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHRhZyBpcyBpbnB1dCBvciB0ZXh0YXJlYS5cbiAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCB8fCB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MVGV4dEFyZWFFbGVtZW50KSB7XG4gICAgICAgIGlmIChoYXNTZWxlY3Rpb24gfHwgKCF0YXJnZXQucmVhZE9ubHkgJiYgIXRhcmdldC5kaXNhYmxlZCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGhpZGUgZGVmYXVsdCBjb250ZXh0IG1lbnVcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IGZyb20gdGhlIGZsYWcgbWFwLlxuICpcbiAqIEBwYXJhbSBrZXkgLSBUaGUga2V5IHRvIHJldHJpZXZlIHRoZSB2YWx1ZSBmb3IuXG4gKiBAcmV0dXJuIFRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBrZXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBHZXRGbGFnKGtleTogc3RyaW5nKTogYW55IHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gd2luZG93Ll93YWlscy5mbGFnc1trZXldO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5hYmxlIHRvIHJldHJpZXZlIGZsYWcgJ1wiICsga2V5ICsgXCInOiBcIiArIGUsIHsgY2F1c2U6IGUgfSk7XG4gICAgfVxufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5pbXBvcnQgeyBpbnZva2UsIElzV2luZG93cyB9IGZyb20gXCIuL3N5c3RlbS5qc1wiO1xuaW1wb3J0IHsgR2V0RmxhZyB9IGZyb20gXCIuL2ZsYWdzLmpzXCI7XG5pbXBvcnQgeyBjYW5UcmFja0J1dHRvbnMsIGV2ZW50VGFyZ2V0IH0gZnJvbSBcIi4vdXRpbHMuanNcIjtcblxuLy8gU2V0dXBcbmxldCBjYW5EcmFnID0gZmFsc2U7XG5sZXQgZHJhZ2dpbmcgPSBmYWxzZTtcblxubGV0IHJlc2l6YWJsZSA9IGZhbHNlO1xubGV0IGNhblJlc2l6ZSA9IGZhbHNlO1xubGV0IHJlc2l6aW5nID0gZmFsc2U7XG5sZXQgcmVzaXplRWRnZTogc3RyaW5nID0gXCJcIjtcbmxldCBkZWZhdWx0Q3Vyc29yID0gXCJhdXRvXCI7XG5cbmxldCBidXR0b25zID0gMDtcbmNvbnN0IGJ1dHRvbnNUcmFja2VkID0gY2FuVHJhY2tCdXR0b25zKCk7XG5cbndpbmRvdy5fd2FpbHMgPSB3aW5kb3cuX3dhaWxzIHx8IHt9O1xud2luZG93Ll93YWlscy5zZXRSZXNpemFibGUgPSAodmFsdWU6IGJvb2xlYW4pOiB2b2lkID0+IHtcbiAgICByZXNpemFibGUgPSB2YWx1ZTtcbiAgICBpZiAoIXJlc2l6YWJsZSkge1xuICAgICAgICAvLyBTdG9wIHJlc2l6aW5nIGlmIGluIHByb2dyZXNzLlxuICAgICAgICBjYW5SZXNpemUgPSByZXNpemluZyA9IGZhbHNlO1xuICAgICAgICBzZXRSZXNpemUoKTtcbiAgICB9XG59O1xuXG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdXBkYXRlLCB7IGNhcHR1cmU6IHRydWUgfSk7XG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdXBkYXRlLCB7IGNhcHR1cmU6IHRydWUgfSk7XG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHVwZGF0ZSwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuZm9yIChjb25zdCBldiBvZiBbJ2NsaWNrJywgJ2NvbnRleHRtZW51JywgJ2RibGNsaWNrJ10pIHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihldiwgc3VwcHJlc3NFdmVudCwgeyBjYXB0dXJlOiB0cnVlIH0pO1xufVxuXG5mdW5jdGlvbiBzdXBwcmVzc0V2ZW50KGV2ZW50OiBFdmVudCkge1xuICAgIC8vIFN1cHByZXNzIGNsaWNrIGV2ZW50cyB3aGlsZSByZXNpemluZyBvciBkcmFnZ2luZy5cbiAgICBpZiAoZHJhZ2dpbmcgfHwgcmVzaXppbmcpIHtcbiAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbn1cblxuLy8gVXNlIGNvbnN0YW50cyB0byBhdm9pZCBjb21wYXJpbmcgc3RyaW5ncyBtdWx0aXBsZSB0aW1lcy5cbmNvbnN0IE1vdXNlRG93biA9IDA7XG5jb25zdCBNb3VzZVVwICAgPSAxO1xuY29uc3QgTW91c2VNb3ZlID0gMjtcblxuZnVuY3Rpb24gdXBkYXRlKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgLy8gV2luZG93cyBzdXBwcmVzc2VzIG1vdXNlIGV2ZW50cyBhdCB0aGUgZW5kIG9mIGRyYWdnaW5nIG9yIHJlc2l6aW5nLFxuICAgIC8vIHNvIHdlIG5lZWQgdG8gYmUgc21hcnQgYW5kIHN5bnRoZXNpemUgYnV0dG9uIGV2ZW50cy5cblxuICAgIGxldCBldmVudFR5cGU6IG51bWJlciwgZXZlbnRCdXR0b25zID0gZXZlbnQuYnV0dG9ucztcbiAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHtcbiAgICAgICAgY2FzZSAnbW91c2Vkb3duJzpcbiAgICAgICAgICAgIGV2ZW50VHlwZSA9IE1vdXNlRG93bjtcbiAgICAgICAgICAgIGlmICghYnV0dG9uc1RyYWNrZWQpIHsgZXZlbnRCdXR0b25zID0gYnV0dG9ucyB8ICgxIDw8IGV2ZW50LmJ1dHRvbik7IH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdtb3VzZXVwJzpcbiAgICAgICAgICAgIGV2ZW50VHlwZSA9IE1vdXNlVXA7XG4gICAgICAgICAgICBpZiAoIWJ1dHRvbnNUcmFja2VkKSB7IGV2ZW50QnV0dG9ucyA9IGJ1dHRvbnMgJiB+KDEgPDwgZXZlbnQuYnV0dG9uKTsgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBldmVudFR5cGUgPSBNb3VzZU1vdmU7XG4gICAgICAgICAgICBpZiAoIWJ1dHRvbnNUcmFja2VkKSB7IGV2ZW50QnV0dG9ucyA9IGJ1dHRvbnM7IH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGxldCByZWxlYXNlZCA9IGJ1dHRvbnMgJiB+ZXZlbnRCdXR0b25zO1xuICAgIGxldCBwcmVzc2VkID0gZXZlbnRCdXR0b25zICYgfmJ1dHRvbnM7XG5cbiAgICBidXR0b25zID0gZXZlbnRCdXR0b25zO1xuXG4gICAgLy8gU3ludGhlc2l6ZSBhIHJlbGVhc2UtcHJlc3Mgc2VxdWVuY2UgaWYgd2UgZGV0ZWN0IGEgcHJlc3Mgb2YgYW4gYWxyZWFkeSBwcmVzc2VkIGJ1dHRvbi5cbiAgICBpZiAoZXZlbnRUeXBlID09PSBNb3VzZURvd24gJiYgIShwcmVzc2VkICYgZXZlbnQuYnV0dG9uKSkge1xuICAgICAgICByZWxlYXNlZCB8PSAoMSA8PCBldmVudC5idXR0b24pO1xuICAgICAgICBwcmVzc2VkIHw9ICgxIDw8IGV2ZW50LmJ1dHRvbik7XG4gICAgfVxuXG4gICAgLy8gU3VwcHJlc3MgYWxsIGJ1dHRvbiBldmVudHMgZHVyaW5nIGRyYWdnaW5nIGFuZCByZXNpemluZyxcbiAgICAvLyB1bmxlc3MgdGhpcyBpcyBhIG1vdXNldXAgZXZlbnQgdGhhdCBpcyBlbmRpbmcgYSBkcmFnIGFjdGlvbi5cbiAgICBpZiAoXG4gICAgICAgIGV2ZW50VHlwZSAhPT0gTW91c2VNb3ZlIC8vIEZhc3QgcGF0aCBmb3IgbW91c2Vtb3ZlXG4gICAgICAgICYmIHJlc2l6aW5nXG4gICAgICAgIHx8IChcbiAgICAgICAgICAgIGRyYWdnaW5nXG4gICAgICAgICAgICAmJiAoXG4gICAgICAgICAgICAgICAgZXZlbnRUeXBlID09PSBNb3VzZURvd25cbiAgICAgICAgICAgICAgICB8fCBldmVudC5idXR0b24gIT09IDBcbiAgICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICkge1xuICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHJlbGVhc2VzXG4gICAgaWYgKHJlbGVhc2VkICYgMSkgeyBwcmltYXJ5VXAoZXZlbnQpOyB9XG4gICAgLy8gSGFuZGxlIHByZXNzZXNcbiAgICBpZiAocHJlc3NlZCAmIDEpIHsgcHJpbWFyeURvd24oZXZlbnQpOyB9XG5cbiAgICAvLyBIYW5kbGUgbW91c2Vtb3ZlXG4gICAgaWYgKGV2ZW50VHlwZSA9PT0gTW91c2VNb3ZlKSB7IG9uTW91c2VNb3ZlKGV2ZW50KTsgfTtcbn1cblxuZnVuY3Rpb24gcHJpbWFyeURvd24oZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBSZXNldCByZWFkaW5lc3Mgc3RhdGUuXG4gICAgY2FuRHJhZyA9IGZhbHNlO1xuICAgIGNhblJlc2l6ZSA9IGZhbHNlO1xuXG4gICAgLy8gSWdub3JlIHJlcGVhdGVkIGNsaWNrcyBvbiBtYWNPUyBhbmQgTGludXguXG4gICAgaWYgKCFJc1dpbmRvd3MoKSkge1xuICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ21vdXNlZG93bicgJiYgZXZlbnQuYnV0dG9uID09PSAwICYmIGV2ZW50LmRldGFpbCAhPT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJlc2l6ZUVkZ2UpIHtcbiAgICAgICAgLy8gUmVhZHkgdG8gcmVzaXplIGlmIHRoZSBwcmltYXJ5IGJ1dHRvbiB3YXMgcHJlc3NlZCBmb3IgdGhlIGZpcnN0IHRpbWUuXG4gICAgICAgIGNhblJlc2l6ZSA9IHRydWU7XG4gICAgICAgIC8vIERvIG5vdCBzdGFydCBkcmFnIG9wZXJhdGlvbnMgd2hlbiBvbiByZXNpemUgZWRnZXMuXG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBSZXRyaWV2ZSB0YXJnZXQgZWxlbWVudFxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50VGFyZ2V0KGV2ZW50KTtcblxuICAgIC8vIFJlYWR5IHRvIGRyYWcgaWYgdGhlIHByaW1hcnkgYnV0dG9uIHdhcyBwcmVzc2VkIGZvciB0aGUgZmlyc3QgdGltZSBvbiBhIGRyYWdnYWJsZSBlbGVtZW50LlxuICAgIC8vIElnbm9yZSBjbGlja3Mgb24gdGhlIHNjcm9sbGJhci5cbiAgICBjb25zdCBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRhcmdldCk7XG4gICAgY2FuRHJhZyA9IChcbiAgICAgICAgc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShcIi0td2FpbHMtZHJhZ2dhYmxlXCIpLnRyaW0oKSA9PT0gXCJkcmFnXCJcbiAgICAgICAgJiYgKFxuICAgICAgICAgICAgZXZlbnQub2Zmc2V0WCAtIHBhcnNlRmxvYXQoc3R5bGUucGFkZGluZ0xlZnQpIDwgdGFyZ2V0LmNsaWVudFdpZHRoXG4gICAgICAgICAgICAmJiBldmVudC5vZmZzZXRZIC0gcGFyc2VGbG9hdChzdHlsZS5wYWRkaW5nVG9wKSA8IHRhcmdldC5jbGllbnRIZWlnaHRcbiAgICAgICAgKVxuICAgICk7XG59XG5cbmZ1bmN0aW9uIHByaW1hcnlVcChldmVudDogTW91c2VFdmVudCkge1xuICAgIC8vIFN0b3AgZHJhZ2dpbmcgYW5kIHJlc2l6aW5nLlxuICAgIGNhbkRyYWcgPSBmYWxzZTtcbiAgICBkcmFnZ2luZyA9IGZhbHNlO1xuICAgIGNhblJlc2l6ZSA9IGZhbHNlO1xuICAgIHJlc2l6aW5nID0gZmFsc2U7XG59XG5cbmNvbnN0IGN1cnNvckZvckVkZ2UgPSBPYmplY3QuZnJlZXplKHtcbiAgICBcInNlLXJlc2l6ZVwiOiBcIm53c2UtcmVzaXplXCIsXG4gICAgXCJzdy1yZXNpemVcIjogXCJuZXN3LXJlc2l6ZVwiLFxuICAgIFwibnctcmVzaXplXCI6IFwibndzZS1yZXNpemVcIixcbiAgICBcIm5lLXJlc2l6ZVwiOiBcIm5lc3ctcmVzaXplXCIsXG4gICAgXCJ3LXJlc2l6ZVwiOiBcImV3LXJlc2l6ZVwiLFxuICAgIFwibi1yZXNpemVcIjogXCJucy1yZXNpemVcIixcbiAgICBcInMtcmVzaXplXCI6IFwibnMtcmVzaXplXCIsXG4gICAgXCJlLXJlc2l6ZVwiOiBcImV3LXJlc2l6ZVwiLFxufSlcblxuZnVuY3Rpb24gc2V0UmVzaXplKGVkZ2U/OiBrZXlvZiB0eXBlb2YgY3Vyc29yRm9yRWRnZSk6IHZvaWQge1xuICAgIGlmIChlZGdlKSB7XG4gICAgICAgIGlmICghcmVzaXplRWRnZSkgeyBkZWZhdWx0Q3Vyc29yID0gZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3I7IH1cbiAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3IgPSBjdXJzb3JGb3JFZGdlW2VkZ2VdO1xuICAgIH0gZWxzZSBpZiAoIWVkZ2UgJiYgcmVzaXplRWRnZSkge1xuICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLmN1cnNvciA9IGRlZmF1bHRDdXJzb3I7XG4gICAgfVxuXG4gICAgcmVzaXplRWRnZSA9IGVkZ2UgfHwgXCJcIjtcbn1cblxuZnVuY3Rpb24gb25Nb3VzZU1vdmUoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoY2FuUmVzaXplICYmIHJlc2l6ZUVkZ2UpIHtcbiAgICAgICAgLy8gU3RhcnQgcmVzaXppbmcuXG4gICAgICAgIHJlc2l6aW5nID0gdHJ1ZTtcbiAgICAgICAgaW52b2tlKFwid2FpbHM6cmVzaXplOlwiICsgcmVzaXplRWRnZSk7XG4gICAgfSBlbHNlIGlmIChjYW5EcmFnKSB7XG4gICAgICAgIC8vIFN0YXJ0IGRyYWdnaW5nLlxuICAgICAgICBkcmFnZ2luZyA9IHRydWU7XG4gICAgICAgIGludm9rZShcIndhaWxzOmRyYWdcIik7XG4gICAgfVxuXG4gICAgaWYgKGRyYWdnaW5nIHx8IHJlc2l6aW5nKSB7XG4gICAgICAgIC8vIEVpdGhlciBkcmFnIG9yIHJlc2l6ZSBpcyBvbmdvaW5nLFxuICAgICAgICAvLyByZXNldCByZWFkaW5lc3MgYW5kIHN0b3AgcHJvY2Vzc2luZy5cbiAgICAgICAgY2FuRHJhZyA9IGNhblJlc2l6ZSA9IGZhbHNlO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFyZXNpemFibGUgfHwgIUlzV2luZG93cygpKSB7XG4gICAgICAgIGlmIChyZXNpemVFZGdlKSB7IHNldFJlc2l6ZSgpOyB9XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZXNpemVIYW5kbGVIZWlnaHQgPSBHZXRGbGFnKFwic3lzdGVtLnJlc2l6ZUhhbmRsZUhlaWdodFwiKSB8fCA1O1xuICAgIGNvbnN0IHJlc2l6ZUhhbmRsZVdpZHRoID0gR2V0RmxhZyhcInN5c3RlbS5yZXNpemVIYW5kbGVXaWR0aFwiKSB8fCA1O1xuXG4gICAgLy8gRXh0cmEgcGl4ZWxzIGZvciB0aGUgY29ybmVyIGFyZWFzLlxuICAgIGNvbnN0IGNvcm5lckV4dHJhID0gR2V0RmxhZyhcInJlc2l6ZUNvcm5lckV4dHJhXCIpIHx8IDEwO1xuXG4gICAgY29uc3QgcmlnaHRCb3JkZXIgPSAod2luZG93Lm91dGVyV2lkdGggLSBldmVudC5jbGllbnRYKSA8IHJlc2l6ZUhhbmRsZVdpZHRoO1xuICAgIGNvbnN0IGxlZnRCb3JkZXIgPSBldmVudC5jbGllbnRYIDwgcmVzaXplSGFuZGxlV2lkdGg7XG4gICAgY29uc3QgdG9wQm9yZGVyID0gZXZlbnQuY2xpZW50WSA8IHJlc2l6ZUhhbmRsZUhlaWdodDtcbiAgICBjb25zdCBib3R0b21Cb3JkZXIgPSAod2luZG93Lm91dGVySGVpZ2h0IC0gZXZlbnQuY2xpZW50WSkgPCByZXNpemVIYW5kbGVIZWlnaHQ7XG5cbiAgICAvLyBBZGp1c3QgZm9yIGNvcm5lciBhcmVhcy5cbiAgICBjb25zdCByaWdodENvcm5lciA9ICh3aW5kb3cub3V0ZXJXaWR0aCAtIGV2ZW50LmNsaWVudFgpIDwgKHJlc2l6ZUhhbmRsZVdpZHRoICsgY29ybmVyRXh0cmEpO1xuICAgIGNvbnN0IGxlZnRDb3JuZXIgPSBldmVudC5jbGllbnRYIDwgKHJlc2l6ZUhhbmRsZVdpZHRoICsgY29ybmVyRXh0cmEpO1xuICAgIGNvbnN0IHRvcENvcm5lciA9IGV2ZW50LmNsaWVudFkgPCAocmVzaXplSGFuZGxlSGVpZ2h0ICsgY29ybmVyRXh0cmEpO1xuICAgIGNvbnN0IGJvdHRvbUNvcm5lciA9ICh3aW5kb3cub3V0ZXJIZWlnaHQgLSBldmVudC5jbGllbnRZKSA8IChyZXNpemVIYW5kbGVIZWlnaHQgKyBjb3JuZXJFeHRyYSk7XG5cbiAgICBpZiAoIWxlZnRDb3JuZXIgJiYgIXRvcENvcm5lciAmJiAhYm90dG9tQ29ybmVyICYmICFyaWdodENvcm5lcikge1xuICAgICAgICAvLyBPcHRpbWlzYXRpb246IG91dCBvZiBhbGwgY29ybmVyIGFyZWFzIGltcGxpZXMgb3V0IG9mIGJvcmRlcnMuXG4gICAgICAgIHNldFJlc2l6ZSgpO1xuICAgIH1cbiAgICAvLyBEZXRlY3QgY29ybmVycy5cbiAgICBlbHNlIGlmIChyaWdodENvcm5lciAmJiBib3R0b21Db3JuZXIpIHNldFJlc2l6ZShcInNlLXJlc2l6ZVwiKTtcbiAgICBlbHNlIGlmIChsZWZ0Q29ybmVyICYmIGJvdHRvbUNvcm5lcikgc2V0UmVzaXplKFwic3ctcmVzaXplXCIpO1xuICAgIGVsc2UgaWYgKGxlZnRDb3JuZXIgJiYgdG9wQ29ybmVyKSBzZXRSZXNpemUoXCJudy1yZXNpemVcIik7XG4gICAgZWxzZSBpZiAodG9wQ29ybmVyICYmIHJpZ2h0Q29ybmVyKSBzZXRSZXNpemUoXCJuZS1yZXNpemVcIik7XG4gICAgLy8gRGV0ZWN0IGJvcmRlcnMuXG4gICAgZWxzZSBpZiAobGVmdEJvcmRlcikgc2V0UmVzaXplKFwidy1yZXNpemVcIik7XG4gICAgZWxzZSBpZiAodG9wQm9yZGVyKSBzZXRSZXNpemUoXCJuLXJlc2l6ZVwiKTtcbiAgICBlbHNlIGlmIChib3R0b21Cb3JkZXIpIHNldFJlc2l6ZShcInMtcmVzaXplXCIpO1xuICAgIGVsc2UgaWYgKHJpZ2h0Qm9yZGVyKSBzZXRSZXNpemUoXCJlLXJlc2l6ZVwiKTtcbiAgICAvLyBPdXQgb2YgYm9yZGVyIGFyZWEuXG4gICAgZWxzZSBzZXRSZXNpemUoKTtcbn1cbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuaW1wb3J0IHsgbmV3UnVudGltZUNhbGxlciwgb2JqZWN0TmFtZXMgfSBmcm9tIFwiLi9ydW50aW1lLmpzXCI7XG5jb25zdCBjYWxsID0gbmV3UnVudGltZUNhbGxlcihvYmplY3ROYW1lcy5BcHBsaWNhdGlvbik7XG5cbmNvbnN0IEhpZGVNZXRob2QgPSAwO1xuY29uc3QgU2hvd01ldGhvZCA9IDE7XG5jb25zdCBRdWl0TWV0aG9kID0gMjtcblxuLyoqXG4gKiBIaWRlcyBhIGNlcnRhaW4gbWV0aG9kIGJ5IGNhbGxpbmcgdGhlIEhpZGVNZXRob2QgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBIaWRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBjYWxsKEhpZGVNZXRob2QpO1xufVxuXG4vKipcbiAqIENhbGxzIHRoZSBTaG93TWV0aG9kIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBTaG93KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBjYWxsKFNob3dNZXRob2QpO1xufVxuXG4vKipcbiAqIENhbGxzIHRoZSBRdWl0TWV0aG9kIHRvIHRlcm1pbmF0ZSB0aGUgcHJvZ3JhbS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFF1aXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIGNhbGwoUXVpdE1ldGhvZCk7XG59XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbmltcG9ydCB7IENhbmNlbGxhYmxlUHJvbWlzZSwgdHlwZSBDYW5jZWxsYWJsZVByb21pc2VXaXRoUmVzb2x2ZXJzIH0gZnJvbSBcIi4vY2FuY2VsbGFibGUuanNcIjtcbmltcG9ydCB7IG5ld1J1bnRpbWVDYWxsZXIsIG9iamVjdE5hbWVzIH0gZnJvbSBcIi4vcnVudGltZS5qc1wiO1xuaW1wb3J0IHsgbmFub2lkIH0gZnJvbSBcIi4vbmFub2lkLmpzXCI7XG5cbi8vIFNldHVwXG53aW5kb3cuX3dhaWxzID0gd2luZG93Ll93YWlscyB8fCB7fTtcbndpbmRvdy5fd2FpbHMuY2FsbFJlc3VsdEhhbmRsZXIgPSByZXN1bHRIYW5kbGVyO1xud2luZG93Ll93YWlscy5jYWxsRXJyb3JIYW5kbGVyID0gZXJyb3JIYW5kbGVyO1xuXG50eXBlIFByb21pc2VSZXNvbHZlcnMgPSBPbWl0PENhbmNlbGxhYmxlUHJvbWlzZVdpdGhSZXNvbHZlcnM8YW55PiwgXCJwcm9taXNlXCIgfCBcIm9uY2FuY2VsbGVkXCI+XG5cbmNvbnN0IGNhbGwgPSBuZXdSdW50aW1lQ2FsbGVyKG9iamVjdE5hbWVzLkNhbGwpO1xuY29uc3QgY2FuY2VsQ2FsbCA9IG5ld1J1bnRpbWVDYWxsZXIob2JqZWN0TmFtZXMuQ2FuY2VsQ2FsbCk7XG5jb25zdCBjYWxsUmVzcG9uc2VzID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2VSZXNvbHZlcnM+KCk7XG5cbmNvbnN0IENhbGxCaW5kaW5nID0gMDtcbmNvbnN0IENhbmNlbE1ldGhvZCA9IDBcblxuLyoqXG4gKiBIb2xkcyBhbGwgcmVxdWlyZWQgaW5mb3JtYXRpb24gZm9yIGEgYmluZGluZyBjYWxsLlxuICogTWF5IHByb3ZpZGUgZWl0aGVyIGEgbWV0aG9kIElEIG9yIGEgbWV0aG9kIG5hbWUsIGJ1dCBub3QgYm90aC5cbiAqL1xuZXhwb3J0IHR5cGUgQ2FsbE9wdGlvbnMgPSB7XG4gICAgLyoqIFRoZSBudW1lcmljIElEIG9mIHRoZSBib3VuZCBtZXRob2QgdG8gY2FsbC4gKi9cbiAgICBtZXRob2RJRDogbnVtYmVyO1xuICAgIC8qKiBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGJvdW5kIG1ldGhvZCB0byBjYWxsLiAqL1xuICAgIG1ldGhvZE5hbWU/OiBuZXZlcjtcbiAgICAvKiogQXJndW1lbnRzIHRvIGJlIHBhc3NlZCBpbnRvIHRoZSBib3VuZCBtZXRob2QuICovXG4gICAgYXJnczogYW55W107XG59IHwge1xuICAgIC8qKiBUaGUgbnVtZXJpYyBJRCBvZiB0aGUgYm91bmQgbWV0aG9kIHRvIGNhbGwuICovXG4gICAgbWV0aG9kSUQ/OiBuZXZlcjtcbiAgICAvKiogVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBib3VuZCBtZXRob2QgdG8gY2FsbC4gKi9cbiAgICBtZXRob2ROYW1lOiBzdHJpbmc7XG4gICAgLyoqIEFyZ3VtZW50cyB0byBiZSBwYXNzZWQgaW50byB0aGUgYm91bmQgbWV0aG9kLiAqL1xuICAgIGFyZ3M6IGFueVtdO1xufTtcblxuLyoqXG4gKiBFeGNlcHRpb24gY2xhc3MgdGhhdCB3aWxsIGJlIHRocm93biBpbiBjYXNlIHRoZSBib3VuZCBtZXRob2QgcmV0dXJucyBhbiBlcnJvci5cbiAqIFRoZSB2YWx1ZSBvZiB0aGUge0BsaW5rIFJ1bnRpbWVFcnJvciNuYW1lfSBwcm9wZXJ0eSBpcyBcIlJ1bnRpbWVFcnJvclwiLlxuICovXG5leHBvcnQgY2xhc3MgUnVudGltZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgYSBuZXcgUnVudGltZUVycm9yIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSBtZXNzYWdlIC0gVGhlIGVycm9yIG1lc3NhZ2UuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIGJlIGZvcndhcmRlZCB0byB0aGUgRXJyb3IgY29uc3RydWN0b3IuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobWVzc2FnZT86IHN0cmluZywgb3B0aW9ucz86IEVycm9yT3B0aW9ucykge1xuICAgICAgICBzdXBlcihtZXNzYWdlLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5uYW1lID0gXCJSdW50aW1lRXJyb3JcIjtcbiAgICB9XG59XG5cbi8qKlxuICogSGFuZGxlcyB0aGUgcmVzdWx0IG9mIGEgY2FsbCByZXF1ZXN0LlxuICpcbiAqIEBwYXJhbSBpZCAtIFRoZSBpZCBvZiB0aGUgcmVxdWVzdCB0byBoYW5kbGUgdGhlIHJlc3VsdCBmb3IuXG4gKiBAcGFyYW0gZGF0YSAtIFRoZSByZXN1bHQgZGF0YSBvZiB0aGUgcmVxdWVzdC5cbiAqIEBwYXJhbSBpc0pTT04gLSBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZGF0YSBpcyBKU09OIG9yIG5vdC5cbiAqL1xuZnVuY3Rpb24gcmVzdWx0SGFuZGxlcihpZDogc3RyaW5nLCBkYXRhOiBzdHJpbmcsIGlzSlNPTjogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IHJlc29sdmVycyA9IGdldEFuZERlbGV0ZVJlc3BvbnNlKGlkKTtcbiAgICBpZiAoIXJlc29sdmVycykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICAgIHJlc29sdmVycy5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgfSBlbHNlIGlmICghaXNKU09OKSB7XG4gICAgICAgIHJlc29sdmVycy5yZXNvbHZlKGRhdGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXNvbHZlcnMucmVzb2x2ZShKU09OLnBhcnNlKGRhdGEpKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgICAgIHJlc29sdmVycy5yZWplY3QobmV3IFR5cGVFcnJvcihcImNvdWxkIG5vdCBwYXJzZSByZXN1bHQ6IFwiICsgZXJyLm1lc3NhZ2UsIHsgY2F1c2U6IGVyciB9KSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogSGFuZGxlcyB0aGUgZXJyb3IgZnJvbSBhIGNhbGwgcmVxdWVzdC5cbiAqXG4gKiBAcGFyYW0gaWQgLSBUaGUgaWQgb2YgdGhlIHByb21pc2UgaGFuZGxlci5cbiAqIEBwYXJhbSBkYXRhIC0gVGhlIGVycm9yIGRhdGEgdG8gcmVqZWN0IHRoZSBwcm9taXNlIGhhbmRsZXIgd2l0aC5cbiAqIEBwYXJhbSBpc0pTT04gLSBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZGF0YSBpcyBKU09OIG9yIG5vdC5cbiAqL1xuZnVuY3Rpb24gZXJyb3JIYW5kbGVyKGlkOiBzdHJpbmcsIGRhdGE6IHN0cmluZywgaXNKU09OOiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgcmVzb2x2ZXJzID0gZ2V0QW5kRGVsZXRlUmVzcG9uc2UoaWQpO1xuICAgIGlmICghcmVzb2x2ZXJzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWlzSlNPTikge1xuICAgICAgICByZXNvbHZlcnMucmVqZWN0KG5ldyBFcnJvcihkYXRhKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IGVycm9yOiBhbnk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBlcnJvciA9IEpTT04ucGFyc2UoZGF0YSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgICAgICByZXNvbHZlcnMucmVqZWN0KG5ldyBUeXBlRXJyb3IoXCJjb3VsZCBub3QgcGFyc2UgZXJyb3I6IFwiICsgZXJyLm1lc3NhZ2UsIHsgY2F1c2U6IGVyciB9KSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgb3B0aW9uczogRXJyb3JPcHRpb25zID0ge307XG4gICAgICAgIGlmIChlcnJvci5jYXVzZSkge1xuICAgICAgICAgICAgb3B0aW9ucy5jYXVzZSA9IGVycm9yLmNhdXNlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGV4Y2VwdGlvbjtcbiAgICAgICAgc3dpdGNoIChlcnJvci5raW5kKSB7XG4gICAgICAgICAgICBjYXNlIFwiUmVmZXJlbmNlRXJyb3JcIjpcbiAgICAgICAgICAgICAgICBleGNlcHRpb24gPSBuZXcgUmVmZXJlbmNlRXJyb3IoZXJyb3IubWVzc2FnZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiVHlwZUVycm9yXCI6XG4gICAgICAgICAgICAgICAgZXhjZXB0aW9uID0gbmV3IFR5cGVFcnJvcihlcnJvci5tZXNzYWdlLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJSdW50aW1lRXJyb3JcIjpcbiAgICAgICAgICAgICAgICBleGNlcHRpb24gPSBuZXcgUnVudGltZUVycm9yKGVycm9yLm1lc3NhZ2UsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBleGNlcHRpb24gPSBuZXcgRXJyb3IoZXJyb3IubWVzc2FnZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICByZXNvbHZlcnMucmVqZWN0KGV4Y2VwdGlvbik7XG4gICAgfVxufVxuXG4vKipcbiAqIFJldHJpZXZlcyBhbmQgcmVtb3ZlcyB0aGUgcmVzcG9uc2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBJRCBmcm9tIHRoZSBjYWxsUmVzcG9uc2VzIG1hcC5cbiAqXG4gKiBAcGFyYW0gaWQgLSBUaGUgSUQgb2YgdGhlIHJlc3BvbnNlIHRvIGJlIHJldHJpZXZlZCBhbmQgcmVtb3ZlZC5cbiAqIEByZXR1cm5zIFRoZSByZXNwb25zZSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBJRCwgaWYgYW55LlxuICovXG5mdW5jdGlvbiBnZXRBbmREZWxldGVSZXNwb25zZShpZDogc3RyaW5nKTogUHJvbWlzZVJlc29sdmVycyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBjYWxsUmVzcG9uc2VzLmdldChpZCk7XG4gICAgY2FsbFJlc3BvbnNlcy5kZWxldGUoaWQpO1xuICAgIHJldHVybiByZXNwb25zZTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSB1bmlxdWUgSUQgdXNpbmcgdGhlIG5hbm9pZCBsaWJyYXJ5LlxuICpcbiAqIEByZXR1cm5zIEEgdW5pcXVlIElEIHRoYXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGNhbGxSZXNwb25zZXMgc2V0LlxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZUlEKCk6IHN0cmluZyB7XG4gICAgbGV0IHJlc3VsdDtcbiAgICBkbyB7XG4gICAgICAgIHJlc3VsdCA9IG5hbm9pZCgpO1xuICAgIH0gd2hpbGUgKGNhbGxSZXNwb25zZXMuaGFzKHJlc3VsdCkpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQ2FsbCBhIGJvdW5kIG1ldGhvZCBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIGNhbGwgb3B0aW9ucy5cbiAqXG4gKiBJbiBjYXNlIG9mIGZhaWx1cmUsIHRoZSByZXR1cm5lZCBwcm9taXNlIHdpbGwgcmVqZWN0IHdpdGggYW4gZXhjZXB0aW9uXG4gKiBhbW9uZyBSZWZlcmVuY2VFcnJvciAodW5rbm93biBtZXRob2QpLCBUeXBlRXJyb3IgKHdyb25nIGFyZ3VtZW50IGNvdW50IG9yIHR5cGUpLFxuICoge0BsaW5rIFJ1bnRpbWVFcnJvcn0gKG1ldGhvZCByZXR1cm5lZCBhbiBlcnJvciksIG9yIG90aGVyIChuZXR3b3JrIG9yIGludGVybmFsIGVycm9ycykuXG4gKiBUaGUgZXhjZXB0aW9uIG1pZ2h0IGhhdmUgYSBcImNhdXNlXCIgZmllbGQgd2l0aCB0aGUgdmFsdWUgcmV0dXJuZWRcbiAqIGJ5IHRoZSBhcHBsaWNhdGlvbi0gb3Igc2VydmljZS1sZXZlbCBlcnJvciBtYXJzaGFsaW5nIGZ1bmN0aW9ucy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEEgbWV0aG9kIGNhbGwgZGVzY3JpcHRvci5cbiAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgdGhlIGNhbGwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDYWxsKG9wdGlvbnM6IENhbGxPcHRpb25zKTogQ2FuY2VsbGFibGVQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IGlkID0gZ2VuZXJhdGVJRCgpO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gQ2FuY2VsbGFibGVQcm9taXNlLndpdGhSZXNvbHZlcnM8YW55PigpO1xuICAgIGNhbGxSZXNwb25zZXMuc2V0KGlkLCB7IHJlc29sdmU6IHJlc3VsdC5yZXNvbHZlLCByZWplY3Q6IHJlc3VsdC5yZWplY3QgfSk7XG5cbiAgICBjb25zdCByZXF1ZXN0ID0gY2FsbChDYWxsQmluZGluZywgT2JqZWN0LmFzc2lnbih7IFwiY2FsbC1pZFwiOiBpZCB9LCBvcHRpb25zKSk7XG4gICAgbGV0IHJ1bm5pbmcgPSBmYWxzZTtcblxuICAgIHJlcXVlc3QudGhlbigoKSA9PiB7XG4gICAgICAgIHJ1bm5pbmcgPSB0cnVlO1xuICAgIH0sIChlcnIpID0+IHtcbiAgICAgICAgY2FsbFJlc3BvbnNlcy5kZWxldGUoaWQpO1xuICAgICAgICByZXN1bHQucmVqZWN0KGVycik7XG4gICAgfSk7XG5cbiAgICBjb25zdCBjYW5jZWwgPSAoKSA9PiB7XG4gICAgICAgIGNhbGxSZXNwb25zZXMuZGVsZXRlKGlkKTtcbiAgICAgICAgcmV0dXJuIGNhbmNlbENhbGwoQ2FuY2VsTWV0aG9kLCB7XCJjYWxsLWlkXCI6IGlkfSkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIHdoaWxlIHJlcXVlc3RpbmcgYmluZGluZyBjYWxsIGNhbmNlbGxhdGlvbjpcIiwgZXJyKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJlc3VsdC5vbmNhbmNlbGxlZCA9ICgpID0+IHtcbiAgICAgICAgaWYgKHJ1bm5pbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBjYW5jZWwoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByZXF1ZXN0LnRoZW4oY2FuY2VsKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gcmVzdWx0LnByb21pc2U7XG59XG5cbi8qKlxuICogQ2FsbHMgYSBib3VuZCBtZXRob2QgYnkgbmFtZSB3aXRoIHRoZSBzcGVjaWZpZWQgYXJndW1lbnRzLlxuICogU2VlIHtAbGluayBDYWxsfSBmb3IgZGV0YWlscy5cbiAqXG4gKiBAcGFyYW0gbWV0aG9kTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBtZXRob2QgaW4gdGhlIGZvcm1hdCAncGFja2FnZS5zdHJ1Y3QubWV0aG9kJy5cbiAqIEBwYXJhbSBhcmdzIC0gVGhlIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBtZXRob2QuXG4gKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIHRoZSBtZXRob2QgY2FsbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEJ5TmFtZShtZXRob2ROYW1lOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogQ2FuY2VsbGFibGVQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBDYWxsKHsgbWV0aG9kTmFtZSwgYXJncyB9KTtcbn1cblxuLyoqXG4gKiBDYWxscyBhIG1ldGhvZCBieSBpdHMgbnVtZXJpYyBJRCB3aXRoIHRoZSBzcGVjaWZpZWQgYXJndW1lbnRzLlxuICogU2VlIHtAbGluayBDYWxsfSBmb3IgZGV0YWlscy5cbiAqXG4gKiBAcGFyYW0gbWV0aG9kSUQgLSBUaGUgSUQgb2YgdGhlIG1ldGhvZCB0byBjYWxsLlxuICogQHBhcmFtIGFyZ3MgLSBUaGUgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIG1ldGhvZC5cbiAqIEByZXR1cm4gVGhlIHJlc3VsdCBvZiB0aGUgbWV0aG9kIGNhbGwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBCeUlEKG1ldGhvZElEOiBudW1iZXIsIC4uLmFyZ3M6IGFueVtdKTogQ2FuY2VsbGFibGVQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBDYWxsKHsgbWV0aG9kSUQsIGFyZ3MgfSk7XG59XG4iLCAiLy8gU291cmNlOiBodHRwczovL2dpdGh1Yi5jb20vaW5zcGVjdC1qcy9pcy1jYWxsYWJsZVxuXG4vLyBUaGUgTUlUIExpY2Vuc2UgKE1JVClcbi8vXG4vLyBDb3B5cmlnaHQgKGMpIDIwMTUgSm9yZGFuIEhhcmJhbmRcbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4vLyBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbi8vIFNPRlRXQVJFLlxuXG52YXIgZm5Ub1N0ciA9IEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZztcbnZhciByZWZsZWN0QXBwbHk6IHR5cGVvZiBSZWZsZWN0LmFwcGx5IHwgZmFsc2UgfCBudWxsID0gdHlwZW9mIFJlZmxlY3QgPT09ICdvYmplY3QnICYmIFJlZmxlY3QgIT09IG51bGwgJiYgUmVmbGVjdC5hcHBseTtcbnZhciBiYWRBcnJheUxpa2U6IGFueTtcbnZhciBpc0NhbGxhYmxlTWFya2VyOiBhbnk7XG5pZiAodHlwZW9mIHJlZmxlY3RBcHBseSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgT2JqZWN0LmRlZmluZVByb3BlcnR5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgYmFkQXJyYXlMaWtlID0gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAnbGVuZ3RoJywge1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgaXNDYWxsYWJsZU1hcmtlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlzQ2FsbGFibGVNYXJrZXIgPSB7fTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXRocm93LWxpdGVyYWxcbiAgICAgICAgcmVmbGVjdEFwcGx5KGZ1bmN0aW9uICgpIHsgdGhyb3cgNDI7IH0sIG51bGwsIGJhZEFycmF5TGlrZSk7XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgICBpZiAoXyAhPT0gaXNDYWxsYWJsZU1hcmtlcikge1xuICAgICAgICAgICAgcmVmbGVjdEFwcGx5ID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn0gZWxzZSB7XG4gICAgcmVmbGVjdEFwcGx5ID0gbnVsbDtcbn1cblxudmFyIGNvbnN0cnVjdG9yUmVnZXggPSAvXlxccypjbGFzc1xcYi87XG52YXIgaXNFUzZDbGFzc0ZuID0gZnVuY3Rpb24gaXNFUzZDbGFzc0Z1bmN0aW9uKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgICB2YXIgZm5TdHIgPSBmblRvU3RyLmNhbGwodmFsdWUpO1xuICAgICAgICByZXR1cm4gY29uc3RydWN0b3JSZWdleC50ZXN0KGZuU3RyKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTsgLy8gbm90IGEgZnVuY3Rpb25cbiAgICB9XG59O1xuXG52YXIgdHJ5RnVuY3Rpb25PYmplY3QgPSBmdW5jdGlvbiB0cnlGdW5jdGlvblRvU3RyKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAoaXNFUzZDbGFzc0ZuKHZhbHVlKSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAgICAgZm5Ub1N0ci5jYWxsKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufTtcbnZhciB0b1N0ciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgb2JqZWN0Q2xhc3MgPSAnW29iamVjdCBPYmplY3RdJztcbnZhciBmbkNsYXNzID0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbnZhciBnZW5DbGFzcyA9ICdbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSc7XG52YXIgZGRhQ2xhc3MgPSAnW29iamVjdCBIVE1MQWxsQ29sbGVjdGlvbl0nOyAvLyBJRSAxMVxudmFyIGRkYUNsYXNzMiA9ICdbb2JqZWN0IEhUTUwgZG9jdW1lbnQuYWxsIGNsYXNzXSc7XG52YXIgZGRhQ2xhc3MzID0gJ1tvYmplY3QgSFRNTENvbGxlY3Rpb25dJzsgLy8gSUUgOS0xMFxudmFyIGhhc1RvU3RyaW5nVGFnID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiAhIVN5bWJvbC50b1N0cmluZ1RhZzsgLy8gYmV0dGVyOiB1c2UgYGhhcy10b3N0cmluZ3RhZ2BcblxudmFyIGlzSUU2OCA9ICEoMCBpbiBbLF0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNwYXJzZS1hcnJheXMsIGNvbW1hLXNwYWNpbmdcblxudmFyIGlzRERBOiAodmFsdWU6IGFueSkgPT4gYm9vbGVhbiA9IGZ1bmN0aW9uIGlzRG9jdW1lbnREb3RBbGwoKSB7IHJldHVybiBmYWxzZTsgfTtcbmlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICdvYmplY3QnKSB7XG4gICAgLy8gRmlyZWZveCAzIGNhbm9uaWNhbGl6ZXMgRERBIHRvIHVuZGVmaW5lZCB3aGVuIGl0J3Mgbm90IGFjY2Vzc2VkIGRpcmVjdGx5XG4gICAgdmFyIGFsbCA9IGRvY3VtZW50LmFsbDtcbiAgICBpZiAodG9TdHIuY2FsbChhbGwpID09PSB0b1N0ci5jYWxsKGRvY3VtZW50LmFsbCkpIHtcbiAgICAgICAgaXNEREEgPSBmdW5jdGlvbiBpc0RvY3VtZW50RG90QWxsKHZhbHVlKSB7XG4gICAgICAgICAgICAvKiBnbG9iYWxzIGRvY3VtZW50OiBmYWxzZSAqL1xuICAgICAgICAgICAgLy8gaW4gSUUgNi04LCB0eXBlb2YgZG9jdW1lbnQuYWxsIGlzIFwib2JqZWN0XCIgYW5kIGl0J3MgdHJ1dGh5XG4gICAgICAgICAgICBpZiAoKGlzSUU2OCB8fCAhdmFsdWUpICYmICh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ciA9IHRvU3RyLmNhbGwodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RyID09PSBkZGFDbGFzc1xuICAgICAgICAgICAgICAgICAgICAgICAgfHwgc3RyID09PSBkZGFDbGFzczJcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IHN0ciA9PT0gZGRhQ2xhc3MzIC8vIG9wZXJhIDEyLjE2XG4gICAgICAgICAgICAgICAgICAgICAgICB8fCBzdHIgPT09IG9iamVjdENsYXNzIC8vIElFIDYtOFxuICAgICAgICAgICAgICAgICAgICApICYmIHZhbHVlKCcnKSA9PSBudWxsOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGVxZXFlcVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgLyoqLyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH07XG4gICAgfVxufVxuXG5mdW5jdGlvbiBpc0NhbGxhYmxlUmVmQXBwbHk8VD4odmFsdWU6IFQgfCB1bmtub3duKTogdmFsdWUgaXMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkgIHtcbiAgICBpZiAoaXNEREEodmFsdWUpKSB7IHJldHVybiB0cnVlOyB9XG4gICAgaWYgKCF2YWx1ZSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgdHJ5IHtcbiAgICAgICAgKHJlZmxlY3RBcHBseSBhcyBhbnkpKHZhbHVlLCBudWxsLCBiYWRBcnJheUxpa2UpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGUgIT09IGlzQ2FsbGFibGVNYXJrZXIpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgfVxuICAgIHJldHVybiAhaXNFUzZDbGFzc0ZuKHZhbHVlKSAmJiB0cnlGdW5jdGlvbk9iamVjdCh2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIGlzQ2FsbGFibGVOb1JlZkFwcGx5PFQ+KHZhbHVlOiBUIHwgdW5rbm93bik6IHZhbHVlIGlzICguLi5hcmdzOiBhbnlbXSkgPT4gYW55IHtcbiAgICBpZiAoaXNEREEodmFsdWUpKSB7IHJldHVybiB0cnVlOyB9XG4gICAgaWYgKCF2YWx1ZSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgaWYgKGhhc1RvU3RyaW5nVGFnKSB7IHJldHVybiB0cnlGdW5jdGlvbk9iamVjdCh2YWx1ZSk7IH1cbiAgICBpZiAoaXNFUzZDbGFzc0ZuKHZhbHVlKSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICB2YXIgc3RyQ2xhc3MgPSB0b1N0ci5jYWxsKHZhbHVlKTtcbiAgICBpZiAoc3RyQ2xhc3MgIT09IGZuQ2xhc3MgJiYgc3RyQ2xhc3MgIT09IGdlbkNsYXNzICYmICEoL15cXFtvYmplY3QgSFRNTC8pLnRlc3Qoc3RyQ2xhc3MpKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIHJldHVybiB0cnlGdW5jdGlvbk9iamVjdCh2YWx1ZSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCByZWZsZWN0QXBwbHkgPyBpc0NhbGxhYmxlUmVmQXBwbHkgOiBpc0NhbGxhYmxlTm9SZWZBcHBseTtcbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuaW1wb3J0IGlzQ2FsbGFibGUgZnJvbSBcIi4vY2FsbGFibGUuanNcIjtcblxuLyoqXG4gKiBFeGNlcHRpb24gY2xhc3MgdGhhdCB3aWxsIGJlIHVzZWQgYXMgcmVqZWN0aW9uIHJlYXNvblxuICogaW4gY2FzZSBhIHtAbGluayBDYW5jZWxsYWJsZVByb21pc2V9IGlzIGNhbmNlbGxlZCBzdWNjZXNzZnVsbHkuXG4gKlxuICogVGhlIHZhbHVlIG9mIHRoZSB7QGxpbmsgbmFtZX0gcHJvcGVydHkgaXMgdGhlIHN0cmluZyBgXCJDYW5jZWxFcnJvclwiYC5cbiAqIFRoZSB2YWx1ZSBvZiB0aGUge0BsaW5rIGNhdXNlfSBwcm9wZXJ0eSBpcyB0aGUgY2F1c2UgcGFzc2VkIHRvIHRoZSBjYW5jZWwgbWV0aG9kLCBpZiBhbnkuXG4gKi9cbmV4cG9ydCBjbGFzcyBDYW5jZWxFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGBDYW5jZWxFcnJvcmAgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgZXJyb3IgbWVzc2FnZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gYmUgZm9yd2FyZGVkIHRvIHRoZSBFcnJvciBjb25zdHJ1Y3Rvci5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlPzogc3RyaW5nLCBvcHRpb25zPzogRXJyb3JPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLm5hbWUgPSBcIkNhbmNlbEVycm9yXCI7XG4gICAgfVxufVxuXG4vKipcbiAqIEV4Y2VwdGlvbiBjbGFzcyB0aGF0IHdpbGwgYmUgcmVwb3J0ZWQgYXMgYW4gdW5oYW5kbGVkIHJlamVjdGlvblxuICogaW4gY2FzZSBhIHtAbGluayBDYW5jZWxsYWJsZVByb21pc2V9IHJlamVjdHMgYWZ0ZXIgYmVpbmcgY2FuY2VsbGVkLFxuICogb3Igd2hlbiB0aGUgYG9uY2FuY2VsbGVkYCBjYWxsYmFjayB0aHJvd3Mgb3IgcmVqZWN0cy5cbiAqXG4gKiBUaGUgdmFsdWUgb2YgdGhlIHtAbGluayBuYW1lfSBwcm9wZXJ0eSBpcyB0aGUgc3RyaW5nIGBcIkNhbmNlbGxlZFJlamVjdGlvbkVycm9yXCJgLlxuICogVGhlIHZhbHVlIG9mIHRoZSB7QGxpbmsgY2F1c2V9IHByb3BlcnR5IGlzIHRoZSByZWFzb24gdGhlIHByb21pc2UgcmVqZWN0ZWQgd2l0aC5cbiAqXG4gKiBCZWNhdXNlIHRoZSBvcmlnaW5hbCBwcm9taXNlIHdhcyBjYW5jZWxsZWQsXG4gKiBhIHdyYXBwZXIgcHJvbWlzZSB3aWxsIGJlIHBhc3NlZCB0byB0aGUgdW5oYW5kbGVkIHJlamVjdGlvbiBsaXN0ZW5lciBpbnN0ZWFkLlxuICogVGhlIHtAbGluayBwcm9taXNlfSBwcm9wZXJ0eSBob2xkcyBhIHJlZmVyZW5jZSB0byB0aGUgb3JpZ2luYWwgcHJvbWlzZS5cbiAqL1xuZXhwb3J0IGNsYXNzIENhbmNlbGxlZFJlamVjdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIC8qKlxuICAgICAqIEhvbGRzIGEgcmVmZXJlbmNlIHRvIHRoZSBwcm9taXNlIHRoYXQgd2FzIGNhbmNlbGxlZCBhbmQgdGhlbiByZWplY3RlZC5cbiAgICAgKi9cbiAgICBwcm9taXNlOiBDYW5jZWxsYWJsZVByb21pc2U8dW5rbm93bj47XG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGBDYW5jZWxsZWRSZWplY3Rpb25FcnJvcmAgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHByb21pc2UgLSBUaGUgcHJvbWlzZSB0aGF0IGNhdXNlZCB0aGUgZXJyb3Igb3JpZ2luYWxseS5cbiAgICAgKiBAcGFyYW0gcmVhc29uIC0gVGhlIHJlamVjdGlvbiByZWFzb24uXG4gICAgICogQHBhcmFtIGluZm8gLSBBbiBvcHRpb25hbCBpbmZvcm1hdGl2ZSBtZXNzYWdlIHNwZWNpZnlpbmcgdGhlIGNpcmN1bXN0YW5jZXMgaW4gd2hpY2ggdGhlIGVycm9yIHdhcyB0aHJvd24uXG4gICAgICogICAgICAgICAgICAgICBEZWZhdWx0cyB0byB0aGUgc3RyaW5nIGBcIlVuaGFuZGxlZCByZWplY3Rpb24gaW4gY2FuY2VsbGVkIHByb21pc2UuXCJgLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHByb21pc2U6IENhbmNlbGxhYmxlUHJvbWlzZTx1bmtub3duPiwgcmVhc29uPzogYW55LCBpbmZvPzogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKChpbmZvID8/IFwiVW5oYW5kbGVkIHJlamVjdGlvbiBpbiBjYW5jZWxsZWQgcHJvbWlzZS5cIikgKyBcIiBSZWFzb246IFwiICsgZXJyb3JNZXNzYWdlKHJlYXNvbiksIHsgY2F1c2U6IHJlYXNvbiB9KTtcbiAgICAgICAgdGhpcy5wcm9taXNlID0gcHJvbWlzZTtcbiAgICAgICAgdGhpcy5uYW1lID0gXCJDYW5jZWxsZWRSZWplY3Rpb25FcnJvclwiO1xuICAgIH1cbn1cblxudHlwZSBDYW5jZWxsYWJsZVByb21pc2VSZXNvbHZlcjxUPiA9ICh2YWx1ZTogVCB8IFByb21pc2VMaWtlPFQ+IHwgQ2FuY2VsbGFibGVQcm9taXNlTGlrZTxUPikgPT4gdm9pZDtcbnR5cGUgQ2FuY2VsbGFibGVQcm9taXNlUmVqZWN0b3IgPSAocmVhc29uPzogYW55KSA9PiB2b2lkO1xudHlwZSBDYW5jZWxsYWJsZVByb21pc2VDYW5jZWxsZXIgPSAoY2F1c2U/OiBhbnkpID0+IHZvaWQgfCBQcm9taXNlTGlrZTx2b2lkPjtcbnR5cGUgQ2FuY2VsbGFibGVQcm9taXNlRXhlY3V0b3I8VD4gPSAocmVzb2x2ZTogQ2FuY2VsbGFibGVQcm9taXNlUmVzb2x2ZXI8VD4sIHJlamVjdDogQ2FuY2VsbGFibGVQcm9taXNlUmVqZWN0b3IpID0+IHZvaWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FuY2VsbGFibGVQcm9taXNlTGlrZTxUPiB7XG4gICAgdGhlbjxUUmVzdWx0MSA9IFQsIFRSZXN1bHQyID0gbmV2ZXI+KG9uZnVsZmlsbGVkPzogKCh2YWx1ZTogVCkgPT4gVFJlc3VsdDEgfCBQcm9taXNlTGlrZTxUUmVzdWx0MT4gfCBDYW5jZWxsYWJsZVByb21pc2VMaWtlPFRSZXN1bHQxPikgfCB1bmRlZmluZWQgfCBudWxsLCBvbnJlamVjdGVkPzogKChyZWFzb246IGFueSkgPT4gVFJlc3VsdDIgfCBQcm9taXNlTGlrZTxUUmVzdWx0Mj4gfCBDYW5jZWxsYWJsZVByb21pc2VMaWtlPFRSZXN1bHQyPikgfCB1bmRlZmluZWQgfCBudWxsKTogQ2FuY2VsbGFibGVQcm9taXNlTGlrZTxUUmVzdWx0MSB8IFRSZXN1bHQyPjtcbiAgICBjYW5jZWwoY2F1c2U/OiBhbnkpOiB2b2lkIHwgUHJvbWlzZUxpa2U8dm9pZD47XG59XG5cbi8qKlxuICogV3JhcHMgYSBjYW5jZWxsYWJsZSBwcm9taXNlIGFsb25nIHdpdGggaXRzIHJlc29sdXRpb24gbWV0aG9kcy5cbiAqIFRoZSBgb25jYW5jZWxsZWRgIGZpZWxkIHdpbGwgYmUgbnVsbCBpbml0aWFsbHkgYnV0IG1heSBiZSBzZXQgdG8gcHJvdmlkZSBhIGN1c3RvbSBjYW5jZWxsYXRpb24gZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FuY2VsbGFibGVQcm9taXNlV2l0aFJlc29sdmVyczxUPiB7XG4gICAgcHJvbWlzZTogQ2FuY2VsbGFibGVQcm9taXNlPFQ+O1xuICAgIHJlc29sdmU6IENhbmNlbGxhYmxlUHJvbWlzZVJlc29sdmVyPFQ+O1xuICAgIHJlamVjdDogQ2FuY2VsbGFibGVQcm9taXNlUmVqZWN0b3I7XG4gICAgb25jYW5jZWxsZWQ6IENhbmNlbGxhYmxlUHJvbWlzZUNhbmNlbGxlciB8IG51bGw7XG59XG5cbmludGVyZmFjZSBDYW5jZWxsYWJsZVByb21pc2VTdGF0ZSB7XG4gICAgcmVhZG9ubHkgcm9vdDogQ2FuY2VsbGFibGVQcm9taXNlU3RhdGU7XG4gICAgcmVzb2x2aW5nOiBib29sZWFuO1xuICAgIHNldHRsZWQ6IGJvb2xlYW47XG4gICAgcmVhc29uPzogQ2FuY2VsRXJyb3I7XG59XG5cbi8vIFByaXZhdGUgZmllbGQgbmFtZXMuXG5jb25zdCBiYXJyaWVyU3ltID0gU3ltYm9sKFwiYmFycmllclwiKTtcbmNvbnN0IGNhbmNlbEltcGxTeW0gPSBTeW1ib2woXCJjYW5jZWxJbXBsXCIpO1xuY29uc3Qgc3BlY2llcyA9IFN5bWJvbC5zcGVjaWVzID8/IFN5bWJvbChcInNwZWNpZXNQb2x5ZmlsbFwiKTtcblxuLyoqXG4gKiBBIHByb21pc2Ugd2l0aCBhbiBhdHRhY2hlZCBtZXRob2QgZm9yIGNhbmNlbGxpbmcgbG9uZy1ydW5uaW5nIG9wZXJhdGlvbnMgKHNlZSB7QGxpbmsgQ2FuY2VsbGFibGVQcm9taXNlI2NhbmNlbH0pLlxuICogQ2FuY2VsbGF0aW9uIGNhbiBvcHRpb25hbGx5IGJlIGJvdW5kIHRvIGFuIHtAbGluayBBYm9ydFNpZ25hbH1cbiAqIGZvciBiZXR0ZXIgY29tcG9zYWJpbGl0eSAoc2VlIHtAbGluayBDYW5jZWxsYWJsZVByb21pc2UjY2FuY2VsT259KS5cbiAqXG4gKiBDYW5jZWxsaW5nIGEgcGVuZGluZyBwcm9taXNlIHdpbGwgcmVzdWx0IGluIGFuIGltbWVkaWF0ZSByZWplY3Rpb25cbiAqIHdpdGggYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIENhbmNlbEVycm9yfSBhcyByZWFzb24sXG4gKiBidXQgd2hvZXZlciBzdGFydGVkIHRoZSBwcm9taXNlIHdpbGwgYmUgcmVzcG9uc2libGVcbiAqIGZvciBhY3R1YWxseSBhYm9ydGluZyB0aGUgdW5kZXJseWluZyBvcGVyYXRpb24uXG4gKiBUbyB0aGlzIHB1cnBvc2UsIHRoZSBjb25zdHJ1Y3RvciBhbmQgYWxsIGNoYWluaW5nIG1ldGhvZHNcbiAqIGFjY2VwdCBvcHRpb25hbCBjYW5jZWxsYXRpb24gY2FsbGJhY2tzLlxuICpcbiAqIElmIGEgYENhbmNlbGxhYmxlUHJvbWlzZWAgc3RpbGwgcmVzb2x2ZXMgYWZ0ZXIgaGF2aW5nIGJlZW4gY2FuY2VsbGVkLFxuICogdGhlIHJlc3VsdCB3aWxsIGJlIGRpc2NhcmRlZC4gSWYgaXQgcmVqZWN0cywgdGhlIHJlYXNvblxuICogd2lsbCBiZSByZXBvcnRlZCBhcyBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uLFxuICogd3JhcHBlZCBpbiBhIHtAbGluayBDYW5jZWxsZWRSZWplY3Rpb25FcnJvcn0gaW5zdGFuY2UuXG4gKiBUbyBmYWNpbGl0YXRlIHRoZSBoYW5kbGluZyBvZiBjYW5jZWxsYXRpb24gcmVxdWVzdHMsXG4gKiBjYW5jZWxsZWQgYENhbmNlbGxhYmxlUHJvbWlzZWBzIHdpbGwgX25vdF8gcmVwb3J0IHVuaGFuZGxlZCBgQ2FuY2VsRXJyb3Jgc1xuICogd2hvc2UgYGNhdXNlYCBmaWVsZCBpcyB0aGUgc2FtZSBhcyB0aGUgb25lIHdpdGggd2hpY2ggdGhlIGN1cnJlbnQgcHJvbWlzZSB3YXMgY2FuY2VsbGVkLlxuICpcbiAqIEFsbCB1c3VhbCBwcm9taXNlIG1ldGhvZHMgYXJlIGRlZmluZWQgYW5kIHJldHVybiBhIGBDYW5jZWxsYWJsZVByb21pc2VgXG4gKiB3aG9zZSBjYW5jZWwgbWV0aG9kIHdpbGwgY2FuY2VsIHRoZSBwYXJlbnQgb3BlcmF0aW9uIGFzIHdlbGwsIHByb3BhZ2F0aW5nIHRoZSBjYW5jZWxsYXRpb24gcmVhc29uXG4gKiB1cHdhcmRzIHRocm91Z2ggcHJvbWlzZSBjaGFpbnMuXG4gKiBDb252ZXJzZWx5LCBjYW5jZWxsaW5nIGEgcHJvbWlzZSB3aWxsIG5vdCBhdXRvbWF0aWNhbGx5IGNhbmNlbCBkZXBlbmRlbnQgcHJvbWlzZXMgZG93bnN0cmVhbTpcbiAqIGBgYHRzXG4gKiBsZXQgcm9vdCA9IG5ldyBDYW5jZWxsYWJsZVByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4geyAuLi4gfSk7XG4gKiBsZXQgY2hpbGQxID0gcm9vdC50aGVuKCgpID0+IHsgLi4uIH0pO1xuICogbGV0IGNoaWxkMiA9IGNoaWxkMS50aGVuKCgpID0+IHsgLi4uIH0pO1xuICogbGV0IGNoaWxkMyA9IHJvb3QuY2F0Y2goKCkgPT4geyAuLi4gfSk7XG4gKiBjaGlsZDEuY2FuY2VsKCk7IC8vIENhbmNlbHMgY2hpbGQxIGFuZCByb290LCBidXQgbm90IGNoaWxkMiBvciBjaGlsZDNcbiAqIGBgYFxuICogQ2FuY2VsbGluZyBhIHByb21pc2UgdGhhdCBoYXMgYWxyZWFkeSBzZXR0bGVkIGlzIHNhZmUgYW5kIGhhcyBubyBjb25zZXF1ZW5jZS5cbiAqXG4gKiBUaGUgYGNhbmNlbGAgbWV0aG9kIHJldHVybnMgYSBwcm9taXNlIHRoYXQgX2Fsd2F5cyBmdWxmaWxsc19cbiAqIGFmdGVyIHRoZSB3aG9sZSBjaGFpbiBoYXMgcHJvY2Vzc2VkIHRoZSBjYW5jZWwgcmVxdWVzdFxuICogYW5kIGFsbCBhdHRhY2hlZCBjYWxsYmFja3MgdXAgdG8gdGhhdCBtb21lbnQgaGF2ZSBydW4uXG4gKlxuICogQWxsIEVTMjAyNCBwcm9taXNlIG1ldGhvZHMgKHN0YXRpYyBhbmQgaW5zdGFuY2UpIGFyZSBkZWZpbmVkIG9uIENhbmNlbGxhYmxlUHJvbWlzZSxcbiAqIGJ1dCBhY3R1YWwgYXZhaWxhYmlsaXR5IG1heSB2YXJ5IHdpdGggT1Mvd2VidmlldyB2ZXJzaW9uLlxuICpcbiAqIEluIGxpbmUgd2l0aCB0aGUgcHJvcG9zYWwgYXQgaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtcm0tYnVpbHRpbi1zdWJjbGFzc2luZyxcbiAqIGBDYW5jZWxsYWJsZVByb21pc2VgIGRvZXMgbm90IHN1cHBvcnQgdHJhbnNwYXJlbnQgc3ViY2xhc3NpbmcuXG4gKiBFeHRlbmRlcnMgc2hvdWxkIHRha2UgY2FyZSB0byBwcm92aWRlIHRoZWlyIG93biBtZXRob2QgaW1wbGVtZW50YXRpb25zLlxuICogVGhpcyBtaWdodCBiZSByZWNvbnNpZGVyZWQgaW4gY2FzZSB0aGUgcHJvcG9zYWwgaXMgcmV0aXJlZC5cbiAqXG4gKiBDYW5jZWxsYWJsZVByb21pc2UgaXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgRE9NIFByb21pc2Ugb2JqZWN0XG4gKiBhbmQgaXMgY29tcGxpYW50IHdpdGggdGhlIFtQcm9taXNlcy9BKyBzcGVjaWZpY2F0aW9uXShodHRwczovL3Byb21pc2VzYXBsdXMuY29tLylcbiAqIChpdCBwYXNzZXMgdGhlIFtjb21wbGlhbmNlIHN1aXRlXShodHRwczovL2dpdGh1Yi5jb20vcHJvbWlzZXMtYXBsdXMvcHJvbWlzZXMtdGVzdHMpKVxuICogaWYgc28gaXMgdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBDYW5jZWxsYWJsZVByb21pc2U8VD4gZXh0ZW5kcyBQcm9taXNlPFQ+IGltcGxlbWVudHMgUHJvbWlzZUxpa2U8VD4sIENhbmNlbGxhYmxlUHJvbWlzZUxpa2U8VD4ge1xuICAgIC8vIFByaXZhdGUgZmllbGRzLlxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBwcml2YXRlIFtiYXJyaWVyU3ltXSE6IFBhcnRpYWw8UHJvbWlzZVdpdGhSZXNvbHZlcnM8dm9pZD4+IHwgbnVsbDtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBbY2FuY2VsSW1wbFN5bV0hOiAocmVhc29uOiBDYW5jZWxFcnJvcikgPT4gdm9pZCB8IFByb21pc2VMaWtlPHZvaWQ+O1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBgQ2FuY2VsbGFibGVQcm9taXNlYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBleGVjdXRvciAtIEEgY2FsbGJhY2sgdXNlZCB0byBpbml0aWFsaXplIHRoZSBwcm9taXNlLiBUaGlzIGNhbGxiYWNrIGlzIHBhc3NlZCB0d28gYXJndW1lbnRzOlxuICAgICAqICAgICAgICAgICAgICAgICAgIGEgYHJlc29sdmVgIGNhbGxiYWNrIHVzZWQgdG8gcmVzb2x2ZSB0aGUgcHJvbWlzZSB3aXRoIGEgdmFsdWVcbiAgICAgKiAgICAgICAgICAgICAgICAgICBvciB0aGUgcmVzdWx0IG9mIGFub3RoZXIgcHJvbWlzZSAocG9zc2libHkgY2FuY2VsbGFibGUpLFxuICAgICAqICAgICAgICAgICAgICAgICAgIGFuZCBhIGByZWplY3RgIGNhbGxiYWNrIHVzZWQgdG8gcmVqZWN0IHRoZSBwcm9taXNlIHdpdGggYSBwcm92aWRlZCByZWFzb24gb3IgZXJyb3IuXG4gICAgICogICAgICAgICAgICAgICAgICAgSWYgdGhlIHZhbHVlIHByb3ZpZGVkIHRvIHRoZSBgcmVzb2x2ZWAgY2FsbGJhY2sgaXMgYSB0aGVuYWJsZSBfYW5kXyBjYW5jZWxsYWJsZSBvYmplY3RcbiAgICAgKiAgICAgICAgICAgICAgICAgICAoaXQgaGFzIGEgYHRoZW5gIF9hbmRfIGEgYGNhbmNlbGAgbWV0aG9kKSxcbiAgICAgKiAgICAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb24gcmVxdWVzdHMgd2lsbCBiZSBmb3J3YXJkZWQgdG8gdGhhdCBvYmplY3QgYW5kIHRoZSBvbmNhbmNlbGxlZCB3aWxsIG5vdCBiZSBpbnZva2VkIGFueW1vcmUuXG4gICAgICogICAgICAgICAgICAgICAgICAgSWYgYW55IG9uZSBvZiB0aGUgdHdvIGNhbGxiYWNrcyBpcyBjYWxsZWQgX2FmdGVyXyB0aGUgcHJvbWlzZSBoYXMgYmVlbiBjYW5jZWxsZWQsXG4gICAgICogICAgICAgICAgICAgICAgICAgdGhlIHByb3ZpZGVkIHZhbHVlcyB3aWxsIGJlIGNhbmNlbGxlZCBhbmQgcmVzb2x2ZWQgYXMgdXN1YWwsXG4gICAgICogICAgICAgICAgICAgICAgICAgYnV0IHRoZWlyIHJlc3VsdHMgd2lsbCBiZSBkaXNjYXJkZWQuXG4gICAgICogICAgICAgICAgICAgICAgICAgSG93ZXZlciwgaWYgdGhlIHJlc29sdXRpb24gcHJvY2VzcyB1bHRpbWF0ZWx5IGVuZHMgdXAgaW4gYSByZWplY3Rpb25cbiAgICAgKiAgICAgICAgICAgICAgICAgICB0aGF0IGlzIG5vdCBkdWUgdG8gY2FuY2VsbGF0aW9uLCB0aGUgcmVqZWN0aW9uIHJlYXNvblxuICAgICAqICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgd3JhcHBlZCBpbiBhIHtAbGluayBDYW5jZWxsZWRSZWplY3Rpb25FcnJvcn1cbiAgICAgKiAgICAgICAgICAgICAgICAgICBhbmQgYnViYmxlZCB1cCBhcyBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uLlxuICAgICAqIEBwYXJhbSBvbmNhbmNlbGxlZCAtIEl0IGlzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBlbnN1cmUgdGhhdCBhbnkgb3BlcmF0aW9uXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgc3RhcnRlZCBieSB0aGUgZXhlY3V0b3IgaXMgcHJvcGVybHkgaGFsdGVkIHVwb24gY2FuY2VsbGF0aW9uLlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIFRoaXMgb3B0aW9uYWwgY2FsbGJhY2sgY2FuIGJlIHVzZWQgdG8gdGhhdCBwdXJwb3NlLlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIEl0IHdpbGwgYmUgY2FsbGVkIF9zeW5jaHJvbm91c2x5XyB3aXRoIGEgY2FuY2VsbGF0aW9uIGNhdXNlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgd2hlbiBjYW5jZWxsYXRpb24gaXMgcmVxdWVzdGVkLCBfYWZ0ZXJfIHRoZSBwcm9taXNlIGhhcyBhbHJlYWR5IHJlamVjdGVkXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgd2l0aCBhIHtAbGluayBDYW5jZWxFcnJvcn0sIGJ1dCBfYmVmb3JlX1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgIGFueSB7QGxpbmsgdGhlbn0ve0BsaW5rIGNhdGNofS97QGxpbmsgZmluYWxseX0gY2FsbGJhY2sgcnVucy5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgY2FsbGJhY2sgcmV0dXJucyBhIHRoZW5hYmxlLCB0aGUgcHJvbWlzZSByZXR1cm5lZCBmcm9tIHtAbGluayBjYW5jZWx9XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgd2lsbCBvbmx5IGZ1bGZpbGwgYWZ0ZXIgdGhlIGZvcm1lciBoYXMgc2V0dGxlZC5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBVbmhhbmRsZWQgZXhjZXB0aW9ucyBvciByZWplY3Rpb25zIGZyb20gdGhlIGNhbGxiYWNrIHdpbGwgYmUgd3JhcHBlZFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIGluIGEge0BsaW5rIENhbmNlbGxlZFJlamVjdGlvbkVycm9yfSBhbmQgYnViYmxlZCB1cCBhcyB1bmhhbmRsZWQgcmVqZWN0aW9ucy5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgYHJlc29sdmVgIGNhbGxiYWNrIGlzIGNhbGxlZCBiZWZvcmUgY2FuY2VsbGF0aW9uIHdpdGggYSBjYW5jZWxsYWJsZSBwcm9taXNlLFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyBvbiB0aGlzIHByb21pc2Ugd2lsbCBiZSBkaXZlcnRlZCB0byB0aGF0IHByb21pc2UsXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZSBvcmlnaW5hbCBgb25jYW5jZWxsZWRgIGNhbGxiYWNrIHdpbGwgYmUgZGlzY2FyZGVkLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGV4ZWN1dG9yOiBDYW5jZWxsYWJsZVByb21pc2VFeGVjdXRvcjxUPiwgb25jYW5jZWxsZWQ/OiBDYW5jZWxsYWJsZVByb21pc2VDYW5jZWxsZXIpIHtcbiAgICAgICAgbGV0IHJlc29sdmUhOiAodmFsdWU6IFQgfCBQcm9taXNlTGlrZTxUPikgPT4gdm9pZDtcbiAgICAgICAgbGV0IHJlamVjdCE6IChyZWFzb24/OiBhbnkpID0+IHZvaWQ7XG4gICAgICAgIHN1cGVyKChyZXMsIHJlaikgPT4geyByZXNvbHZlID0gcmVzOyByZWplY3QgPSByZWo7IH0pO1xuXG4gICAgICAgIGlmICgodGhpcy5jb25zdHJ1Y3RvciBhcyBhbnkpW3NwZWNpZXNdICE9PSBQcm9taXNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2FuY2VsbGFibGVQcm9taXNlIGRvZXMgbm90IHN1cHBvcnQgdHJhbnNwYXJlbnQgc3ViY2xhc3NpbmcuIFBsZWFzZSByZWZyYWluIGZyb20gb3ZlcnJpZGluZyB0aGUgW1N5bWJvbC5zcGVjaWVzXSBzdGF0aWMgcHJvcGVydHkuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHByb21pc2U6IENhbmNlbGxhYmxlUHJvbWlzZVdpdGhSZXNvbHZlcnM8VD4gPSB7XG4gICAgICAgICAgICBwcm9taXNlOiB0aGlzLFxuICAgICAgICAgICAgcmVzb2x2ZSxcbiAgICAgICAgICAgIHJlamVjdCxcbiAgICAgICAgICAgIGdldCBvbmNhbmNlbGxlZCgpIHsgcmV0dXJuIG9uY2FuY2VsbGVkID8/IG51bGw7IH0sXG4gICAgICAgICAgICBzZXQgb25jYW5jZWxsZWQoY2IpIHsgb25jYW5jZWxsZWQgPSBjYiA/PyB1bmRlZmluZWQ7IH1cbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBzdGF0ZTogQ2FuY2VsbGFibGVQcm9taXNlU3RhdGUgPSB7XG4gICAgICAgICAgICBnZXQgcm9vdCgpIHsgcmV0dXJuIHN0YXRlOyB9LFxuICAgICAgICAgICAgcmVzb2x2aW5nOiBmYWxzZSxcbiAgICAgICAgICAgIHNldHRsZWQ6IGZhbHNlXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gU2V0dXAgY2FuY2VsbGF0aW9uIHN5c3RlbS5cbiAgICAgICAgdm9pZCBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgICAgICAgICBbYmFycmllclN5bV06IHtcbiAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW2NhbmNlbEltcGxTeW1dOiB7XG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGNhbmNlbGxlckZvcihwcm9taXNlLCBzdGF0ZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUnVuIHRoZSBhY3R1YWwgZXhlY3V0b3IuXG4gICAgICAgIGNvbnN0IHJlamVjdG9yID0gcmVqZWN0b3JGb3IocHJvbWlzZSwgc3RhdGUpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZXhlY3V0b3IocmVzb2x2ZXJGb3IocHJvbWlzZSwgc3RhdGUpLCByZWplY3Rvcik7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKHN0YXRlLnJlc29sdmluZykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVW5oYW5kbGVkIGV4Y2VwdGlvbiBpbiBDYW5jZWxsYWJsZVByb21pc2UgZXhlY3V0b3IuXCIsIGVycik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlamVjdG9yKGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYW5jZWxzIGltbWVkaWF0ZWx5IHRoZSBleGVjdXRpb24gb2YgdGhlIG9wZXJhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBwcm9taXNlLlxuICAgICAqIFRoZSBwcm9taXNlIHJlamVjdHMgd2l0aCBhIHtAbGluayBDYW5jZWxFcnJvcn0gaW5zdGFuY2UgYXMgcmVhc29uLFxuICAgICAqIHdpdGggdGhlIHtAbGluayBDYW5jZWxFcnJvciNjYXVzZX0gcHJvcGVydHkgc2V0IHRvIHRoZSBnaXZlbiBhcmd1bWVudCwgaWYgYW55LlxuICAgICAqXG4gICAgICogSGFzIG5vIGVmZmVjdCBpZiBjYWxsZWQgYWZ0ZXIgdGhlIHByb21pc2UgaGFzIGFscmVhZHkgc2V0dGxlZDtcbiAgICAgKiByZXBlYXRlZCBjYWxscyBpbiBwYXJ0aWN1bGFyIGFyZSBzYWZlLCBidXQgb25seSB0aGUgZmlyc3Qgb25lXG4gICAgICogd2lsbCBzZXQgdGhlIGNhbmNlbGxhdGlvbiBjYXVzZS5cbiAgICAgKlxuICAgICAqIFRoZSBgQ2FuY2VsRXJyb3JgIGV4Y2VwdGlvbiBfbmVlZCBub3RfIGJlIGhhbmRsZWQgZXhwbGljaXRseSBfb24gdGhlIHByb21pc2VzIHRoYXQgYXJlIGJlaW5nIGNhbmNlbGxlZDpfXG4gICAgICogY2FuY2VsbGluZyBhIHByb21pc2Ugd2l0aCBubyBhdHRhY2hlZCByZWplY3Rpb24gaGFuZGxlciBkb2VzIG5vdCB0cmlnZ2VyIGFuIHVuaGFuZGxlZCByZWplY3Rpb24gZXZlbnQuXG4gICAgICogVGhlcmVmb3JlLCB0aGUgZm9sbG93aW5nIGlkaW9tcyBhcmUgYWxsIGVxdWFsbHkgY29ycmVjdDpcbiAgICAgKiBgYGB0c1xuICAgICAqIG5ldyBDYW5jZWxsYWJsZVByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4geyAuLi4gfSkuY2FuY2VsKCk7XG4gICAgICogbmV3IENhbmNlbGxhYmxlUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7IC4uLiB9KS50aGVuKC4uLikuY2FuY2VsKCk7XG4gICAgICogbmV3IENhbmNlbGxhYmxlUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7IC4uLiB9KS50aGVuKC4uLikuY2F0Y2goLi4uKS5jYW5jZWwoKTtcbiAgICAgKiBgYGBcbiAgICAgKiBXaGVuZXZlciBzb21lIGNhbmNlbGxlZCBwcm9taXNlIGluIGEgY2hhaW4gcmVqZWN0cyB3aXRoIGEgYENhbmNlbEVycm9yYFxuICAgICAqIHdpdGggdGhlIHNhbWUgY2FuY2VsbGF0aW9uIGNhdXNlIGFzIGl0c2VsZiwgdGhlIGVycm9yIHdpbGwgYmUgZGlzY2FyZGVkIHNpbGVudGx5LlxuICAgICAqIEhvd2V2ZXIsIHRoZSBgQ2FuY2VsRXJyb3JgIF93aWxsIHN0aWxsIGJlIGRlbGl2ZXJlZF8gdG8gYWxsIGF0dGFjaGVkIHJlamVjdGlvbiBoYW5kbGVyc1xuICAgICAqIGFkZGVkIGJ5IHtAbGluayB0aGVufSBhbmQgcmVsYXRlZCBtZXRob2RzOlxuICAgICAqIGBgYHRzXG4gICAgICogbGV0IGNhbmNlbGxhYmxlID0gbmV3IENhbmNlbGxhYmxlUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7IC4uLiB9KTtcbiAgICAgKiBjYW5jZWxsYWJsZS50aGVuKCgpID0+IHsgLi4uIH0pLmNhdGNoKGNvbnNvbGUubG9nKTtcbiAgICAgKiBjYW5jZWxsYWJsZS5jYW5jZWwoKTsgLy8gQSBDYW5jZWxFcnJvciBpcyBwcmludGVkIHRvIHRoZSBjb25zb2xlLlxuICAgICAqIGBgYFxuICAgICAqIElmIHRoZSBgQ2FuY2VsRXJyb3JgIGlzIG5vdCBoYW5kbGVkIGRvd25zdHJlYW0gYnkgdGhlIHRpbWUgaXQgcmVhY2hlc1xuICAgICAqIGEgX25vbi1jYW5jZWxsZWRfIHByb21pc2UsIGl0IF93aWxsXyB0cmlnZ2VyIGFuIHVuaGFuZGxlZCByZWplY3Rpb24gZXZlbnQsXG4gICAgICoganVzdCBsaWtlIG5vcm1hbCByZWplY3Rpb25zIHdvdWxkOlxuICAgICAqIGBgYHRzXG4gICAgICogbGV0IGNhbmNlbGxhYmxlID0gbmV3IENhbmNlbGxhYmxlUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7IC4uLiB9KTtcbiAgICAgKiBsZXQgY2hhaW5lZCA9IGNhbmNlbGxhYmxlLnRoZW4oKCkgPT4geyAuLi4gfSkudGhlbigoKSA9PiB7IC4uLiB9KTsgLy8gTm8gY2F0Y2guLi5cbiAgICAgKiBjYW5jZWxsYWJsZS5jYW5jZWwoKTsgLy8gVW5oYW5kbGVkIHJlamVjdGlvbiBldmVudCBvbiBjaGFpbmVkIVxuICAgICAqIGBgYFxuICAgICAqIFRoZXJlZm9yZSwgaXQgaXMgaW1wb3J0YW50IHRvIGVpdGhlciBjYW5jZWwgd2hvbGUgcHJvbWlzZSBjaGFpbnMgZnJvbSB0aGVpciB0YWlsLFxuICAgICAqIGFzIHNob3duIGluIHRoZSBjb3JyZWN0IGlkaW9tcyBhYm92ZSwgb3IgdGFrZSBjYXJlIG9mIGhhbmRsaW5nIGVycm9ycyBldmVyeXdoZXJlLlxuICAgICAqXG4gICAgICogQHJldHVybnMgQSBjYW5jZWxsYWJsZSBwcm9taXNlIHRoYXQgX2Z1bGZpbGxzXyBhZnRlciB0aGUgY2FuY2VsIGNhbGxiYWNrIChpZiBhbnkpXG4gICAgICogYW5kIGFsbCBoYW5kbGVycyBhdHRhY2hlZCB1cCB0byB0aGUgY2FsbCB0byBjYW5jZWwgaGF2ZSBydW4uXG4gICAgICogSWYgdGhlIGNhbmNlbCBjYWxsYmFjayByZXR1cm5zIGEgdGhlbmFibGUsIHRoZSBwcm9taXNlIHJldHVybmVkIGJ5IGBjYW5jZWxgXG4gICAgICogd2lsbCBhbHNvIHdhaXQgZm9yIHRoYXQgdGhlbmFibGUgdG8gc2V0dGxlLlxuICAgICAqIFRoaXMgZW5hYmxlcyBjYWxsZXJzIHRvIHdhaXQgZm9yIHRoZSBjYW5jZWxsZWQgb3BlcmF0aW9uIHRvIHRlcm1pbmF0ZVxuICAgICAqIHdpdGhvdXQgYmVpbmcgZm9yY2VkIHRvIGhhbmRsZSBwb3RlbnRpYWwgZXJyb3JzIGF0IHRoZSBjYWxsIHNpdGUuXG4gICAgICogYGBgdHNcbiAgICAgKiBjYW5jZWxsYWJsZS5jYW5jZWwoKS50aGVuKCgpID0+IHtcbiAgICAgKiAgICAgLy8gQ2xlYW51cCBmaW5pc2hlZCwgaXQncyBzYWZlIHRvIGRvIHNvbWV0aGluZyBlbHNlLlxuICAgICAqIH0sIChlcnIpID0+IHtcbiAgICAgKiAgICAgLy8gVW5yZWFjaGFibGU6IHRoZSBwcm9taXNlIHJldHVybmVkIGZyb20gY2FuY2VsIHdpbGwgbmV2ZXIgcmVqZWN0LlxuICAgICAqIH0pO1xuICAgICAqIGBgYFxuICAgICAqIE5vdGUgdGhhdCB0aGUgcmV0dXJuZWQgcHJvbWlzZSB3aWxsIF9ub3RfIGhhbmRsZSBpbXBsaWNpdGx5IGFueSByZWplY3Rpb25cbiAgICAgKiB0aGF0IG1pZ2h0IGhhdmUgb2NjdXJyZWQgYWxyZWFkeSBpbiB0aGUgY2FuY2VsbGVkIGNoYWluLlxuICAgICAqIEl0IHdpbGwganVzdCB0cmFjayB3aGV0aGVyIHJlZ2lzdGVyZWQgaGFuZGxlcnMgaGF2ZSBiZWVuIGV4ZWN1dGVkIG9yIG5vdC5cbiAgICAgKiBUaGVyZWZvcmUsIHVuaGFuZGxlZCByZWplY3Rpb25zIHdpbGwgbmV2ZXIgYmUgc2lsZW50bHkgaGFuZGxlZCBieSBjYWxsaW5nIGNhbmNlbC5cbiAgICAgKi9cbiAgICBjYW5jZWwoY2F1c2U/OiBhbnkpOiBDYW5jZWxsYWJsZVByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gbmV3IENhbmNlbGxhYmxlUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgLy8gSU5WQVJJQU5UOiB0aGUgcmVzdWx0IG9mIHRoaXNbY2FuY2VsSW1wbFN5bV0gYW5kIHRoZSBiYXJyaWVyIGRvIG5vdCBldmVyIHJlamVjdC5cbiAgICAgICAgICAgIC8vIFVuZm9ydHVuYXRlbHkgbWFjT1MgSGlnaCBTaWVycmEgZG9lcyBub3Qgc3VwcG9ydCBQcm9taXNlLmFsbFNldHRsZWQuXG4gICAgICAgICAgICBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgdGhpc1tjYW5jZWxJbXBsU3ltXShuZXcgQ2FuY2VsRXJyb3IoXCJQcm9taXNlIGNhbmNlbGxlZC5cIiwgeyBjYXVzZSB9KSksXG4gICAgICAgICAgICAgICAgY3VycmVudEJhcnJpZXIodGhpcylcbiAgICAgICAgICAgIF0pLnRoZW4oKCkgPT4gcmVzb2x2ZSgpLCAoKSA9PiByZXNvbHZlKCkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCaW5kcyBwcm9taXNlIGNhbmNlbGxhdGlvbiB0byB0aGUgYWJvcnQgZXZlbnQgb2YgdGhlIGdpdmVuIHtAbGluayBBYm9ydFNpZ25hbH0uXG4gICAgICogSWYgdGhlIHNpZ25hbCBoYXMgYWxyZWFkeSBhYm9ydGVkLCB0aGUgcHJvbWlzZSB3aWxsIGJlIGNhbmNlbGxlZCBpbW1lZGlhdGVseS5cbiAgICAgKiBXaGVuIGVpdGhlciBjb25kaXRpb24gaXMgdmVyaWZpZWQsIHRoZSBjYW5jZWxsYXRpb24gY2F1c2Ugd2lsbCBiZSBzZXRcbiAgICAgKiB0byB0aGUgc2lnbmFsJ3MgYWJvcnQgcmVhc29uIChzZWUge0BsaW5rIEFib3J0U2lnbmFsI3JlYXNvbn0pLlxuICAgICAqXG4gICAgICogSGFzIG5vIGVmZmVjdCBpZiBjYWxsZWQgKG9yIGlmIHRoZSBzaWduYWwgYWJvcnRzKSBfYWZ0ZXJfIHRoZSBwcm9taXNlIGhhcyBhbHJlYWR5IHNldHRsZWQuXG4gICAgICogT25seSB0aGUgZmlyc3Qgc2lnbmFsIHRvIGFib3J0IHdpbGwgc2V0IHRoZSBjYW5jZWxsYXRpb24gY2F1c2UuXG4gICAgICpcbiAgICAgKiBGb3IgbW9yZSBkZXRhaWxzIGFib3V0IHRoZSBjYW5jZWxsYXRpb24gcHJvY2VzcyxcbiAgICAgKiBzZWUge0BsaW5rIGNhbmNlbH0gYW5kIHRoZSBgQ2FuY2VsbGFibGVQcm9taXNlYCBjb25zdHJ1Y3Rvci5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGVuYWJsZXMgYGF3YWl0YGluZyBjYW5jZWxsYWJsZSBwcm9taXNlcyB3aXRob3V0IGhhdmluZ1xuICAgICAqIHRvIHN0b3JlIHRoZW0gZm9yIGZ1dHVyZSBjYW5jZWxsYXRpb24sIGUuZy46XG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBsb25nUnVubmluZ09wZXJhdGlvbigpLmNhbmNlbE9uKHNpZ25hbCk7XG4gICAgICogYGBgXG4gICAgICogaW5zdGVhZCBvZjpcbiAgICAgKiBgYGB0c1xuICAgICAqIGxldCBwcm9taXNlVG9CZUNhbmNlbGxlZCA9IGxvbmdSdW5uaW5nT3BlcmF0aW9uKCk7XG4gICAgICogYXdhaXQgcHJvbWlzZVRvQmVDYW5jZWxsZWQ7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGlzIHByb21pc2UsIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICovXG4gICAgY2FuY2VsT24oc2lnbmFsOiBBYm9ydFNpZ25hbCk6IENhbmNlbGxhYmxlUHJvbWlzZTxUPiB7XG4gICAgICAgIGlmIChzaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgICAgdm9pZCB0aGlzLmNhbmNlbChzaWduYWwucmVhc29uKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgKCkgPT4gdm9pZCB0aGlzLmNhbmNlbChzaWduYWwucmVhc29uKSwge2NhcHR1cmU6IHRydWV9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEF0dGFjaGVzIGNhbGxiYWNrcyBmb3IgdGhlIHJlc29sdXRpb24gYW5kL29yIHJlamVjdGlvbiBvZiB0aGUgYENhbmNlbGxhYmxlUHJvbWlzZWAuXG4gICAgICpcbiAgICAgKiBUaGUgb3B0aW9uYWwgYG9uY2FuY2VsbGVkYCBhcmd1bWVudCB3aWxsIGJlIGludm9rZWQgd2hlbiB0aGUgcmV0dXJuZWQgcHJvbWlzZSBpcyBjYW5jZWxsZWQsXG4gICAgICogd2l0aCB0aGUgc2FtZSBzZW1hbnRpY3MgYXMgdGhlIGBvbmNhbmNlbGxlZGAgYXJndW1lbnQgb2YgdGhlIGNvbnN0cnVjdG9yLlxuICAgICAqIFdoZW4gdGhlIHBhcmVudCBwcm9taXNlIHJlamVjdHMgb3IgaXMgY2FuY2VsbGVkLCB0aGUgYG9ucmVqZWN0ZWRgIGNhbGxiYWNrIHdpbGwgcnVuLFxuICAgICAqIF9ldmVuIGFmdGVyIHRoZSByZXR1cm5lZCBwcm9taXNlIGhhcyBiZWVuIGNhbmNlbGxlZDpfXG4gICAgICogaW4gdGhhdCBjYXNlLCBzaG91bGQgaXQgcmVqZWN0IG9yIHRocm93LCB0aGUgcmVhc29uIHdpbGwgYmUgd3JhcHBlZFxuICAgICAqIGluIGEge0BsaW5rIENhbmNlbGxlZFJlamVjdGlvbkVycm9yfSBhbmQgYnViYmxlZCB1cCBhcyBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9uZnVsZmlsbGVkIFRoZSBjYWxsYmFjayB0byBleGVjdXRlIHdoZW4gdGhlIFByb21pc2UgaXMgcmVzb2x2ZWQuXG4gICAgICogQHBhcmFtIG9ucmVqZWN0ZWQgVGhlIGNhbGxiYWNrIHRvIGV4ZWN1dGUgd2hlbiB0aGUgUHJvbWlzZSBpcyByZWplY3RlZC5cbiAgICAgKiBAcmV0dXJucyBBIGBDYW5jZWxsYWJsZVByb21pc2VgIGZvciB0aGUgY29tcGxldGlvbiBvZiB3aGljaGV2ZXIgY2FsbGJhY2sgaXMgZXhlY3V0ZWQuXG4gICAgICogVGhlIHJldHVybmVkIHByb21pc2UgaXMgaG9va2VkIHVwIHRvIHByb3BhZ2F0ZSBjYW5jZWxsYXRpb24gcmVxdWVzdHMgdXAgdGhlIGNoYWluLCBidXQgbm90IGRvd246XG4gICAgICpcbiAgICAgKiAgIC0gaWYgdGhlIHBhcmVudCBwcm9taXNlIGlzIGNhbmNlbGxlZCwgdGhlIGBvbnJlamVjdGVkYCBoYW5kbGVyIHdpbGwgYmUgaW52b2tlZCB3aXRoIGEgYENhbmNlbEVycm9yYFxuICAgICAqICAgICBhbmQgdGhlIHJldHVybmVkIHByb21pc2UgX3dpbGwgcmVzb2x2ZSByZWd1bGFybHlfIHdpdGggaXRzIHJlc3VsdDtcbiAgICAgKiAgIC0gY29udmVyc2VseSwgaWYgdGhlIHJldHVybmVkIHByb21pc2UgaXMgY2FuY2VsbGVkLCBfdGhlIHBhcmVudCBwcm9taXNlIGlzIGNhbmNlbGxlZCB0b287X1xuICAgICAqICAgICB0aGUgYG9ucmVqZWN0ZWRgIGhhbmRsZXIgd2lsbCBzdGlsbCBiZSBpbnZva2VkIHdpdGggdGhlIHBhcmVudCdzIGBDYW5jZWxFcnJvcmAsXG4gICAgICogICAgIGJ1dCBpdHMgcmVzdWx0IHdpbGwgYmUgZGlzY2FyZGVkXG4gICAgICogICAgIGFuZCB0aGUgcmV0dXJuZWQgcHJvbWlzZSB3aWxsIHJlamVjdCB3aXRoIGEgYENhbmNlbEVycm9yYCBhcyB3ZWxsLlxuICAgICAqXG4gICAgICogVGhlIHByb21pc2UgcmV0dXJuZWQgZnJvbSB7QGxpbmsgY2FuY2VsfSB3aWxsIGZ1bGZpbGwgb25seSBhZnRlciBhbGwgYXR0YWNoZWQgaGFuZGxlcnNcbiAgICAgKiB1cCB0aGUgZW50aXJlIHByb21pc2UgY2hhaW4gaGF2ZSBiZWVuIHJ1bi5cbiAgICAgKlxuICAgICAqIElmIGVpdGhlciBjYWxsYmFjayByZXR1cm5zIGEgY2FuY2VsbGFibGUgcHJvbWlzZSxcbiAgICAgKiBjYW5jZWxsYXRpb24gcmVxdWVzdHMgd2lsbCBiZSBkaXZlcnRlZCB0byBpdCxcbiAgICAgKiBhbmQgdGhlIHNwZWNpZmllZCBgb25jYW5jZWxsZWRgIGNhbGxiYWNrIHdpbGwgYmUgZGlzY2FyZGVkLlxuICAgICAqL1xuICAgIHRoZW48VFJlc3VsdDEgPSBULCBUUmVzdWx0MiA9IG5ldmVyPihvbmZ1bGZpbGxlZD86ICgodmFsdWU6IFQpID0+IFRSZXN1bHQxIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDE+IHwgQ2FuY2VsbGFibGVQcm9taXNlTGlrZTxUUmVzdWx0MT4pIHwgdW5kZWZpbmVkIHwgbnVsbCwgb25yZWplY3RlZD86ICgocmVhc29uOiBhbnkpID0+IFRSZXN1bHQyIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDI+IHwgQ2FuY2VsbGFibGVQcm9taXNlTGlrZTxUUmVzdWx0Mj4pIHwgdW5kZWZpbmVkIHwgbnVsbCwgb25jYW5jZWxsZWQ/OiBDYW5jZWxsYWJsZVByb21pc2VDYW5jZWxsZXIpOiBDYW5jZWxsYWJsZVByb21pc2U8VFJlc3VsdDEgfCBUUmVzdWx0Mj4ge1xuICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgQ2FuY2VsbGFibGVQcm9taXNlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbmNlbGxhYmxlUHJvbWlzZS5wcm90b3R5cGUudGhlbiBjYWxsZWQgb24gYW4gaW52YWxpZCBvYmplY3QuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTk9URTogVHlwZVNjcmlwdCdzIGJ1aWx0LWluIHR5cGUgZm9yIHRoZW4gaXMgYnJva2VuLFxuICAgICAgICAvLyBhcyBpdCBhbGxvd3Mgc3BlY2lmeWluZyBhbiBhcmJpdHJhcnkgVFJlc3VsdDEgIT0gVCBldmVuIHdoZW4gb25mdWxmaWxsZWQgaXMgbm90IGEgZnVuY3Rpb24uXG4gICAgICAgIC8vIFdlIGNhbm5vdCBmaXggaXQgaWYgd2Ugd2FudCB0byBDYW5jZWxsYWJsZVByb21pc2UgdG8gaW1wbGVtZW50IFByb21pc2VMaWtlPFQ+LlxuXG4gICAgICAgIGlmICghaXNDYWxsYWJsZShvbmZ1bGZpbGxlZCkpIHsgb25mdWxmaWxsZWQgPSBpZGVudGl0eSBhcyBhbnk7IH1cbiAgICAgICAgaWYgKCFpc0NhbGxhYmxlKG9ucmVqZWN0ZWQpKSB7IG9ucmVqZWN0ZWQgPSB0aHJvd2VyOyB9XG5cbiAgICAgICAgaWYgKG9uZnVsZmlsbGVkID09PSBpZGVudGl0eSAmJiBvbnJlamVjdGVkID09IHRocm93ZXIpIHtcbiAgICAgICAgICAgIC8vIFNob3J0Y3V0IGZvciB0cml2aWFsIGFyZ3VtZW50cy5cbiAgICAgICAgICAgIHJldHVybiBuZXcgQ2FuY2VsbGFibGVQcm9taXNlKChyZXNvbHZlKSA9PiByZXNvbHZlKHRoaXMgYXMgYW55KSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBiYXJyaWVyOiBQYXJ0aWFsPFByb21pc2VXaXRoUmVzb2x2ZXJzPHZvaWQ+PiA9IHt9O1xuICAgICAgICB0aGlzW2JhcnJpZXJTeW1dID0gYmFycmllcjtcblxuICAgICAgICByZXR1cm4gbmV3IENhbmNlbGxhYmxlUHJvbWlzZTxUUmVzdWx0MSB8IFRSZXN1bHQyPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB2b2lkIHN1cGVyLnRoZW4oXG4gICAgICAgICAgICAgICAgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzW2JhcnJpZXJTeW1dID09PSBiYXJyaWVyKSB7IHRoaXNbYmFycmllclN5bV0gPSBudWxsOyB9XG4gICAgICAgICAgICAgICAgICAgIGJhcnJpZXIucmVzb2x2ZT8uKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUob25mdWxmaWxsZWQhKHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIChyZWFzb24/KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzW2JhcnJpZXJTeW1dID09PSBiYXJyaWVyKSB7IHRoaXNbYmFycmllclN5bV0gPSBudWxsOyB9XG4gICAgICAgICAgICAgICAgICAgIGJhcnJpZXIucmVzb2x2ZT8uKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUob25yZWplY3RlZCEocmVhc29uKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9LCBhc3luYyAoY2F1c2U/KSA9PiB7XG4gICAgICAgICAgICAvL2NhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvbmNhbmNlbGxlZD8uKGNhdXNlKTtcbiAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jYW5jZWwoY2F1c2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBdHRhY2hlcyBhIGNhbGxiYWNrIGZvciBvbmx5IHRoZSByZWplY3Rpb24gb2YgdGhlIFByb21pc2UuXG4gICAgICpcbiAgICAgKiBUaGUgb3B0aW9uYWwgYG9uY2FuY2VsbGVkYCBhcmd1bWVudCB3aWxsIGJlIGludm9rZWQgd2hlbiB0aGUgcmV0dXJuZWQgcHJvbWlzZSBpcyBjYW5jZWxsZWQsXG4gICAgICogd2l0aCB0aGUgc2FtZSBzZW1hbnRpY3MgYXMgdGhlIGBvbmNhbmNlbGxlZGAgYXJndW1lbnQgb2YgdGhlIGNvbnN0cnVjdG9yLlxuICAgICAqIFdoZW4gdGhlIHBhcmVudCBwcm9taXNlIHJlamVjdHMgb3IgaXMgY2FuY2VsbGVkLCB0aGUgYG9ucmVqZWN0ZWRgIGNhbGxiYWNrIHdpbGwgcnVuLFxuICAgICAqIF9ldmVuIGFmdGVyIHRoZSByZXR1cm5lZCBwcm9taXNlIGhhcyBiZWVuIGNhbmNlbGxlZDpfXG4gICAgICogaW4gdGhhdCBjYXNlLCBzaG91bGQgaXQgcmVqZWN0IG9yIHRocm93LCB0aGUgcmVhc29uIHdpbGwgYmUgd3JhcHBlZFxuICAgICAqIGluIGEge0BsaW5rIENhbmNlbGxlZFJlamVjdGlvbkVycm9yfSBhbmQgYnViYmxlZCB1cCBhcyBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uLlxuICAgICAqXG4gICAgICogSXQgaXMgZXF1aXZhbGVudCB0b1xuICAgICAqIGBgYHRzXG4gICAgICogY2FuY2VsbGFibGVQcm9taXNlLnRoZW4odW5kZWZpbmVkLCBvbnJlamVjdGVkLCBvbmNhbmNlbGxlZCk7XG4gICAgICogYGBgXG4gICAgICogYW5kIHRoZSBzYW1lIGNhdmVhdHMgYXBwbHkuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBIFByb21pc2UgZm9yIHRoZSBjb21wbGV0aW9uIG9mIHRoZSBjYWxsYmFjay5cbiAgICAgKiBDYW5jZWxsYXRpb24gcmVxdWVzdHMgb24gdGhlIHJldHVybmVkIHByb21pc2VcbiAgICAgKiB3aWxsIHByb3BhZ2F0ZSB1cCB0aGUgY2hhaW4gdG8gdGhlIHBhcmVudCBwcm9taXNlLFxuICAgICAqIGJ1dCBub3QgaW4gdGhlIG90aGVyIGRpcmVjdGlvbi5cbiAgICAgKlxuICAgICAqIFRoZSBwcm9taXNlIHJldHVybmVkIGZyb20ge0BsaW5rIGNhbmNlbH0gd2lsbCBmdWxmaWxsIG9ubHkgYWZ0ZXIgYWxsIGF0dGFjaGVkIGhhbmRsZXJzXG4gICAgICogdXAgdGhlIGVudGlyZSBwcm9taXNlIGNoYWluIGhhdmUgYmVlbiBydW4uXG4gICAgICpcbiAgICAgKiBJZiBgb25yZWplY3RlZGAgcmV0dXJucyBhIGNhbmNlbGxhYmxlIHByb21pc2UsXG4gICAgICogY2FuY2VsbGF0aW9uIHJlcXVlc3RzIHdpbGwgYmUgZGl2ZXJ0ZWQgdG8gaXQsXG4gICAgICogYW5kIHRoZSBzcGVjaWZpZWQgYG9uY2FuY2VsbGVkYCBjYWxsYmFjayB3aWxsIGJlIGRpc2NhcmRlZC5cbiAgICAgKiBTZWUge0BsaW5rIHRoZW59IGZvciBtb3JlIGRldGFpbHMuXG4gICAgICovXG4gICAgY2F0Y2g8VFJlc3VsdCA9IG5ldmVyPihvbnJlamVjdGVkPzogKChyZWFzb246IGFueSkgPT4gKFByb21pc2VMaWtlPFRSZXN1bHQ+IHwgVFJlc3VsdCkpIHwgdW5kZWZpbmVkIHwgbnVsbCwgb25jYW5jZWxsZWQ/OiBDYW5jZWxsYWJsZVByb21pc2VDYW5jZWxsZXIpOiBDYW5jZWxsYWJsZVByb21pc2U8VCB8IFRSZXN1bHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGhlbih1bmRlZmluZWQsIG9ucmVqZWN0ZWQsIG9uY2FuY2VsbGVkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBdHRhY2hlcyBhIGNhbGxiYWNrIHRoYXQgaXMgaW52b2tlZCB3aGVuIHRoZSBDYW5jZWxsYWJsZVByb21pc2UgaXMgc2V0dGxlZCAoZnVsZmlsbGVkIG9yIHJlamVjdGVkKS4gVGhlXG4gICAgICogcmVzb2x2ZWQgdmFsdWUgY2Fubm90IGJlIGFjY2Vzc2VkIG9yIG1vZGlmaWVkIGZyb20gdGhlIGNhbGxiYWNrLlxuICAgICAqIFRoZSByZXR1cm5lZCBwcm9taXNlIHdpbGwgc2V0dGxlIGluIHRoZSBzYW1lIHN0YXRlIGFzIHRoZSBvcmlnaW5hbCBvbmVcbiAgICAgKiBhZnRlciB0aGUgcHJvdmlkZWQgY2FsbGJhY2sgaGFzIGNvbXBsZXRlZCBleGVjdXRpb24sXG4gICAgICogdW5sZXNzIHRoZSBjYWxsYmFjayB0aHJvd3Mgb3IgcmV0dXJucyBhIHJlamVjdGluZyBwcm9taXNlLFxuICAgICAqIGluIHdoaWNoIGNhc2UgdGhlIHJldHVybmVkIHByb21pc2Ugd2lsbCByZWplY3QgYXMgd2VsbC5cbiAgICAgKlxuICAgICAqIFRoZSBvcHRpb25hbCBgb25jYW5jZWxsZWRgIGFyZ3VtZW50IHdpbGwgYmUgaW52b2tlZCB3aGVuIHRoZSByZXR1cm5lZCBwcm9taXNlIGlzIGNhbmNlbGxlZCxcbiAgICAgKiB3aXRoIHRoZSBzYW1lIHNlbWFudGljcyBhcyB0aGUgYG9uY2FuY2VsbGVkYCBhcmd1bWVudCBvZiB0aGUgY29uc3RydWN0b3IuXG4gICAgICogT25jZSB0aGUgcGFyZW50IHByb21pc2Ugc2V0dGxlcywgdGhlIGBvbmZpbmFsbHlgIGNhbGxiYWNrIHdpbGwgcnVuLFxuICAgICAqIF9ldmVuIGFmdGVyIHRoZSByZXR1cm5lZCBwcm9taXNlIGhhcyBiZWVuIGNhbmNlbGxlZDpfXG4gICAgICogaW4gdGhhdCBjYXNlLCBzaG91bGQgaXQgcmVqZWN0IG9yIHRocm93LCB0aGUgcmVhc29uIHdpbGwgYmUgd3JhcHBlZFxuICAgICAqIGluIGEge0BsaW5rIENhbmNlbGxlZFJlamVjdGlvbkVycm9yfSBhbmQgYnViYmxlZCB1cCBhcyBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgaXMgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2Yge0BsaW5rIHRoZW59IGFuZCB0aGUgc2FtZSBjYXZlYXRzIGFwcGx5LlxuICAgICAqIEl0IGlzIHBvbHlmaWxsZWQsIGhlbmNlIGF2YWlsYWJsZSBpbiBldmVyeSBPUy93ZWJ2aWV3IHZlcnNpb24uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBIFByb21pc2UgZm9yIHRoZSBjb21wbGV0aW9uIG9mIHRoZSBjYWxsYmFjay5cbiAgICAgKiBDYW5jZWxsYXRpb24gcmVxdWVzdHMgb24gdGhlIHJldHVybmVkIHByb21pc2VcbiAgICAgKiB3aWxsIHByb3BhZ2F0ZSB1cCB0aGUgY2hhaW4gdG8gdGhlIHBhcmVudCBwcm9taXNlLFxuICAgICAqIGJ1dCBub3QgaW4gdGhlIG90aGVyIGRpcmVjdGlvbi5cbiAgICAgKlxuICAgICAqIFRoZSBwcm9taXNlIHJldHVybmVkIGZyb20ge0BsaW5rIGNhbmNlbH0gd2lsbCBmdWxmaWxsIG9ubHkgYWZ0ZXIgYWxsIGF0dGFjaGVkIGhhbmRsZXJzXG4gICAgICogdXAgdGhlIGVudGlyZSBwcm9taXNlIGNoYWluIGhhdmUgYmVlbiBydW4uXG4gICAgICpcbiAgICAgKiBJZiBgb25maW5hbGx5YCByZXR1cm5zIGEgY2FuY2VsbGFibGUgcHJvbWlzZSxcbiAgICAgKiBjYW5jZWxsYXRpb24gcmVxdWVzdHMgd2lsbCBiZSBkaXZlcnRlZCB0byBpdCxcbiAgICAgKiBhbmQgdGhlIHNwZWNpZmllZCBgb25jYW5jZWxsZWRgIGNhbGxiYWNrIHdpbGwgYmUgZGlzY2FyZGVkLlxuICAgICAqIFNlZSB7QGxpbmsgdGhlbn0gZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKi9cbiAgICBmaW5hbGx5KG9uZmluYWxseT86ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZCB8IG51bGwsIG9uY2FuY2VsbGVkPzogQ2FuY2VsbGFibGVQcm9taXNlQ2FuY2VsbGVyKTogQ2FuY2VsbGFibGVQcm9taXNlPFQ+IHtcbiAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIENhbmNlbGxhYmxlUHJvbWlzZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5jZWxsYWJsZVByb21pc2UucHJvdG90eXBlLmZpbmFsbHkgY2FsbGVkIG9uIGFuIGludmFsaWQgb2JqZWN0LlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNDYWxsYWJsZShvbmZpbmFsbHkpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50aGVuKG9uZmluYWxseSwgb25maW5hbGx5LCBvbmNhbmNlbGxlZCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy50aGVuKFxuICAgICAgICAgICAgKHZhbHVlKSA9PiBDYW5jZWxsYWJsZVByb21pc2UucmVzb2x2ZShvbmZpbmFsbHkoKSkudGhlbigoKSA9PiB2YWx1ZSksXG4gICAgICAgICAgICAocmVhc29uPykgPT4gQ2FuY2VsbGFibGVQcm9taXNlLnJlc29sdmUob25maW5hbGx5KCkpLnRoZW4oKCkgPT4geyB0aHJvdyByZWFzb247IH0pLFxuICAgICAgICAgICAgb25jYW5jZWxsZWQsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2UgdXNlIHRoZSBgW1N5bWJvbC5zcGVjaWVzXWAgc3RhdGljIHByb3BlcnR5LCBpZiBhdmFpbGFibGUsXG4gICAgICogdG8gZGlzYWJsZSB0aGUgYnVpbHQtaW4gYXV0b21hdGljIHN1YmNsYXNzaW5nIGZlYXR1cmVzIGZyb20ge0BsaW5rIFByb21pc2V9LlxuICAgICAqIEl0IGlzIGNyaXRpY2FsIGZvciBwZXJmb3JtYW5jZSByZWFzb25zIHRoYXQgZXh0ZW5kZXJzIGRvIG5vdCBvdmVycmlkZSB0aGlzLlxuICAgICAqIE9uY2UgdGhlIHByb3Bvc2FsIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXJtLWJ1aWx0aW4tc3ViY2xhc3NpbmdcbiAgICAgKiBpcyBlaXRoZXIgYWNjZXB0ZWQgb3IgcmV0aXJlZCwgdGhpcyBpbXBsZW1lbnRhdGlvbiB3aWxsIGhhdmUgdG8gYmUgcmV2aXNlZCBhY2NvcmRpbmdseS5cbiAgICAgKlxuICAgICAqIEBpZ25vcmVcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFtzcGVjaWVzXSgpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIENhbmNlbGxhYmxlUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggYW4gYXJyYXkgb2YgcmVzdWx0c1xuICAgICAqIHdoZW4gYWxsIG9mIHRoZSBwcm92aWRlZCBQcm9taXNlcyByZXNvbHZlLCBvciByZWplY3RlZCB3aGVuIGFueSBQcm9taXNlIGlzIHJlamVjdGVkLlxuICAgICAqXG4gICAgICogRXZlcnkgb25lIG9mIHRoZSBwcm92aWRlZCBvYmplY3RzIHRoYXQgaXMgYSB0aGVuYWJsZSBfYW5kXyBjYW5jZWxsYWJsZSBvYmplY3RcbiAgICAgKiB3aWxsIGJlIGNhbmNlbGxlZCB3aGVuIHRoZSByZXR1cm5lZCBwcm9taXNlIGlzIGNhbmNlbGxlZCwgd2l0aCB0aGUgc2FtZSBjYXVzZS5cbiAgICAgKlxuICAgICAqIEBncm91cCBTdGF0aWMgTWV0aG9kc1xuICAgICAqL1xuICAgIHN0YXRpYyBhbGw8VD4odmFsdWVzOiBJdGVyYWJsZTxUIHwgUHJvbWlzZUxpa2U8VD4+KTogQ2FuY2VsbGFibGVQcm9taXNlPEF3YWl0ZWQ8VD5bXT47XG4gICAgc3RhdGljIGFsbDxUIGV4dGVuZHMgcmVhZG9ubHkgdW5rbm93bltdIHwgW10+KHZhbHVlczogVCk6IENhbmNlbGxhYmxlUHJvbWlzZTx7IC1yZWFkb25seSBbUCBpbiBrZXlvZiBUXTogQXdhaXRlZDxUW1BdPjsgfT47XG4gICAgc3RhdGljIGFsbDxUIGV4dGVuZHMgSXRlcmFibGU8dW5rbm93bj4gfCBBcnJheUxpa2U8dW5rbm93bj4+KHZhbHVlczogVCk6IENhbmNlbGxhYmxlUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIGxldCBjb2xsZWN0ZWQgPSBBcnJheS5mcm9tKHZhbHVlcyk7XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBjb2xsZWN0ZWQubGVuZ3RoID09PSAwXG4gICAgICAgICAgICA/IENhbmNlbGxhYmxlUHJvbWlzZS5yZXNvbHZlKGNvbGxlY3RlZClcbiAgICAgICAgICAgIDogbmV3IENhbmNlbGxhYmxlUHJvbWlzZTx1bmtub3duPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgdm9pZCBQcm9taXNlLmFsbChjb2xsZWN0ZWQpLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICAgIH0sIChjYXVzZT8pOiBQcm9taXNlPHZvaWQ+ID0+IGNhbmNlbEFsbChwcm9taXNlLCBjb2xsZWN0ZWQsIGNhdXNlKSk7XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBDYW5jZWxsYWJsZVByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoIGFuIGFycmF5IG9mIHJlc3VsdHNcbiAgICAgKiB3aGVuIGFsbCBvZiB0aGUgcHJvdmlkZWQgUHJvbWlzZXMgcmVzb2x2ZSBvciByZWplY3QuXG4gICAgICpcbiAgICAgKiBFdmVyeSBvbmUgb2YgdGhlIHByb3ZpZGVkIG9iamVjdHMgdGhhdCBpcyBhIHRoZW5hYmxlIF9hbmRfIGNhbmNlbGxhYmxlIG9iamVjdFxuICAgICAqIHdpbGwgYmUgY2FuY2VsbGVkIHdoZW4gdGhlIHJldHVybmVkIHByb21pc2UgaXMgY2FuY2VsbGVkLCB3aXRoIHRoZSBzYW1lIGNhdXNlLlxuICAgICAqXG4gICAgICogQGdyb3VwIFN0YXRpYyBNZXRob2RzXG4gICAgICovXG4gICAgc3RhdGljIGFsbFNldHRsZWQ8VD4odmFsdWVzOiBJdGVyYWJsZTxUIHwgUHJvbWlzZUxpa2U8VD4+KTogQ2FuY2VsbGFibGVQcm9taXNlPFByb21pc2VTZXR0bGVkUmVzdWx0PEF3YWl0ZWQ8VD4+W10+O1xuICAgIHN0YXRpYyBhbGxTZXR0bGVkPFQgZXh0ZW5kcyByZWFkb25seSB1bmtub3duW10gfCBbXT4odmFsdWVzOiBUKTogQ2FuY2VsbGFibGVQcm9taXNlPHsgLXJlYWRvbmx5IFtQIGluIGtleW9mIFRdOiBQcm9taXNlU2V0dGxlZFJlc3VsdDxBd2FpdGVkPFRbUF0+PjsgfT47XG4gICAgc3RhdGljIGFsbFNldHRsZWQ8VCBleHRlbmRzIEl0ZXJhYmxlPHVua25vd24+IHwgQXJyYXlMaWtlPHVua25vd24+Pih2YWx1ZXM6IFQpOiBDYW5jZWxsYWJsZVByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICBsZXQgY29sbGVjdGVkID0gQXJyYXkuZnJvbSh2YWx1ZXMpO1xuICAgICAgICBjb25zdCBwcm9taXNlID0gY29sbGVjdGVkLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgPyBDYW5jZWxsYWJsZVByb21pc2UucmVzb2x2ZShjb2xsZWN0ZWQpXG4gICAgICAgICAgICA6IG5ldyBDYW5jZWxsYWJsZVByb21pc2U8dW5rbm93bj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHZvaWQgUHJvbWlzZS5hbGxTZXR0bGVkKGNvbGxlY3RlZCkudGhlbihyZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgICAgfSwgKGNhdXNlPyk6IFByb21pc2U8dm9pZD4gPT4gY2FuY2VsQWxsKHByb21pc2UsIGNvbGxlY3RlZCwgY2F1c2UpKTtcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGFueSBmdW5jdGlvbiByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCBieSB0aGUgZmlyc3QgZ2l2ZW4gcHJvbWlzZSB0byBiZSBmdWxmaWxsZWQsXG4gICAgICogb3IgcmVqZWN0ZWQgd2l0aCBhbiBBZ2dyZWdhdGVFcnJvciBjb250YWluaW5nIGFuIGFycmF5IG9mIHJlamVjdGlvbiByZWFzb25zXG4gICAgICogaWYgYWxsIG9mIHRoZSBnaXZlbiBwcm9taXNlcyBhcmUgcmVqZWN0ZWQuXG4gICAgICogSXQgcmVzb2x2ZXMgYWxsIGVsZW1lbnRzIG9mIHRoZSBwYXNzZWQgaXRlcmFibGUgdG8gcHJvbWlzZXMgYXMgaXQgcnVucyB0aGlzIGFsZ29yaXRobS5cbiAgICAgKlxuICAgICAqIEV2ZXJ5IG9uZSBvZiB0aGUgcHJvdmlkZWQgb2JqZWN0cyB0aGF0IGlzIGEgdGhlbmFibGUgX2FuZF8gY2FuY2VsbGFibGUgb2JqZWN0XG4gICAgICogd2lsbCBiZSBjYW5jZWxsZWQgd2hlbiB0aGUgcmV0dXJuZWQgcHJvbWlzZSBpcyBjYW5jZWxsZWQsIHdpdGggdGhlIHNhbWUgY2F1c2UuXG4gICAgICpcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcbiAgICAgKi9cbiAgICBzdGF0aWMgYW55PFQ+KHZhbHVlczogSXRlcmFibGU8VCB8IFByb21pc2VMaWtlPFQ+Pik6IENhbmNlbGxhYmxlUHJvbWlzZTxBd2FpdGVkPFQ+PjtcbiAgICBzdGF0aWMgYW55PFQgZXh0ZW5kcyByZWFkb25seSB1bmtub3duW10gfCBbXT4odmFsdWVzOiBUKTogQ2FuY2VsbGFibGVQcm9taXNlPEF3YWl0ZWQ8VFtudW1iZXJdPj47XG4gICAgc3RhdGljIGFueTxUIGV4dGVuZHMgSXRlcmFibGU8dW5rbm93bj4gfCBBcnJheUxpa2U8dW5rbm93bj4+KHZhbHVlczogVCk6IENhbmNlbGxhYmxlUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIGxldCBjb2xsZWN0ZWQgPSBBcnJheS5mcm9tKHZhbHVlcyk7XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBjb2xsZWN0ZWQubGVuZ3RoID09PSAwXG4gICAgICAgICAgICA/IENhbmNlbGxhYmxlUHJvbWlzZS5yZXNvbHZlKGNvbGxlY3RlZClcbiAgICAgICAgICAgIDogbmV3IENhbmNlbGxhYmxlUHJvbWlzZTx1bmtub3duPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgdm9pZCBQcm9taXNlLmFueShjb2xsZWN0ZWQpLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICAgIH0sIChjYXVzZT8pOiBQcm9taXNlPHZvaWQ+ID0+IGNhbmNlbEFsbChwcm9taXNlLCBjb2xsZWN0ZWQsIGNhdXNlKSk7XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQgd2hlbiBhbnkgb2YgdGhlIHByb3ZpZGVkIFByb21pc2VzIGFyZSByZXNvbHZlZCBvciByZWplY3RlZC5cbiAgICAgKlxuICAgICAqIEV2ZXJ5IG9uZSBvZiB0aGUgcHJvdmlkZWQgb2JqZWN0cyB0aGF0IGlzIGEgdGhlbmFibGUgX2FuZF8gY2FuY2VsbGFibGUgb2JqZWN0XG4gICAgICogd2lsbCBiZSBjYW5jZWxsZWQgd2hlbiB0aGUgcmV0dXJuZWQgcHJvbWlzZSBpcyBjYW5jZWxsZWQsIHdpdGggdGhlIHNhbWUgY2F1c2UuXG4gICAgICpcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcbiAgICAgKi9cbiAgICBzdGF0aWMgcmFjZTxUPih2YWx1ZXM6IEl0ZXJhYmxlPFQgfCBQcm9taXNlTGlrZTxUPj4pOiBDYW5jZWxsYWJsZVByb21pc2U8QXdhaXRlZDxUPj47XG4gICAgc3RhdGljIHJhY2U8VCBleHRlbmRzIHJlYWRvbmx5IHVua25vd25bXSB8IFtdPih2YWx1ZXM6IFQpOiBDYW5jZWxsYWJsZVByb21pc2U8QXdhaXRlZDxUW251bWJlcl0+PjtcbiAgICBzdGF0aWMgcmFjZTxUIGV4dGVuZHMgSXRlcmFibGU8dW5rbm93bj4gfCBBcnJheUxpa2U8dW5rbm93bj4+KHZhbHVlczogVCk6IENhbmNlbGxhYmxlUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIGxldCBjb2xsZWN0ZWQgPSBBcnJheS5mcm9tKHZhbHVlcyk7XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBuZXcgQ2FuY2VsbGFibGVQcm9taXNlPHVua25vd24+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHZvaWQgUHJvbWlzZS5yYWNlKGNvbGxlY3RlZCkudGhlbihyZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9LCAoY2F1c2U/KTogUHJvbWlzZTx2b2lkPiA9PiBjYW5jZWxBbGwocHJvbWlzZSwgY29sbGVjdGVkLCBjYXVzZSkpO1xuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGNhbmNlbGxlZCBDYW5jZWxsYWJsZVByb21pc2UgZm9yIHRoZSBwcm92aWRlZCBjYXVzZS5cbiAgICAgKlxuICAgICAqIEBncm91cCBTdGF0aWMgTWV0aG9kc1xuICAgICAqL1xuICAgIHN0YXRpYyBjYW5jZWw8VCA9IG5ldmVyPihjYXVzZT86IGFueSk6IENhbmNlbGxhYmxlUHJvbWlzZTxUPiB7XG4gICAgICAgIGNvbnN0IHAgPSBuZXcgQ2FuY2VsbGFibGVQcm9taXNlPFQ+KCgpID0+IHt9KTtcbiAgICAgICAgcC5jYW5jZWwoY2F1c2UpO1xuICAgICAgICByZXR1cm4gcDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IENhbmNlbGxhYmxlUHJvbWlzZSB0aGF0IGNhbmNlbHNcbiAgICAgKiBhZnRlciB0aGUgc3BlY2lmaWVkIHRpbWVvdXQsIHdpdGggdGhlIHByb3ZpZGVkIGNhdXNlLlxuICAgICAqXG4gICAgICogSWYgdGhlIHtAbGluayBBYm9ydFNpZ25hbC50aW1lb3V0fSBmYWN0b3J5IG1ldGhvZCBpcyBhdmFpbGFibGUsXG4gICAgICogaXQgaXMgdXNlZCB0byBiYXNlIHRoZSB0aW1lb3V0IG9uIF9hY3RpdmVfIHRpbWUgcmF0aGVyIHRoYW4gX2VsYXBzZWRfIHRpbWUuXG4gICAgICogT3RoZXJ3aXNlLCBgdGltZW91dGAgZmFsbHMgYmFjayB0byB7QGxpbmsgc2V0VGltZW91dH0uXG4gICAgICpcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcbiAgICAgKi9cbiAgICBzdGF0aWMgdGltZW91dDxUID0gbmV2ZXI+KG1pbGxpc2Vjb25kczogbnVtYmVyLCBjYXVzZT86IGFueSk6IENhbmNlbGxhYmxlUHJvbWlzZTxUPiB7XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBuZXcgQ2FuY2VsbGFibGVQcm9taXNlPFQ+KCgpID0+IHt9KTtcbiAgICAgICAgaWYgKEFib3J0U2lnbmFsICYmIHR5cGVvZiBBYm9ydFNpZ25hbCA9PT0gJ2Z1bmN0aW9uJyAmJiBBYm9ydFNpZ25hbC50aW1lb3V0ICYmIHR5cGVvZiBBYm9ydFNpZ25hbC50aW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBBYm9ydFNpZ25hbC50aW1lb3V0KG1pbGxpc2Vjb25kcykuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PiB2b2lkIHByb21pc2UuY2FuY2VsKGNhdXNlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHZvaWQgcHJvbWlzZS5jYW5jZWwoY2F1c2UpLCBtaWxsaXNlY29uZHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ2FuY2VsbGFibGVQcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgdGhlIHNwZWNpZmllZCB0aW1lb3V0LlxuICAgICAqIFRoZSByZXR1cm5lZCBwcm9taXNlIGNhbiBiZSBjYW5jZWxsZWQgd2l0aG91dCBjb25zZXF1ZW5jZXMuXG4gICAgICpcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcbiAgICAgKi9cbiAgICBzdGF0aWMgc2xlZXAobWlsbGlzZWNvbmRzOiBudW1iZXIpOiBDYW5jZWxsYWJsZVByb21pc2U8dm9pZD47XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBDYW5jZWxsYWJsZVByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlclxuICAgICAqIHRoZSBzcGVjaWZpZWQgdGltZW91dCwgd2l0aCB0aGUgcHJvdmlkZWQgdmFsdWUuXG4gICAgICogVGhlIHJldHVybmVkIHByb21pc2UgY2FuIGJlIGNhbmNlbGxlZCB3aXRob3V0IGNvbnNlcXVlbmNlcy5cbiAgICAgKlxuICAgICAqIEBncm91cCBTdGF0aWMgTWV0aG9kc1xuICAgICAqL1xuICAgIHN0YXRpYyBzbGVlcDxUPihtaWxsaXNlY29uZHM6IG51bWJlciwgdmFsdWU6IFQpOiBDYW5jZWxsYWJsZVByb21pc2U8VD47XG4gICAgc3RhdGljIHNsZWVwPFQgPSB2b2lkPihtaWxsaXNlY29uZHM6IG51bWJlciwgdmFsdWU/OiBUKTogQ2FuY2VsbGFibGVQcm9taXNlPFQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBDYW5jZWxsYWJsZVByb21pc2U8VD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZSh2YWx1ZSEpLCBtaWxsaXNlY29uZHMpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHJlamVjdGVkIENhbmNlbGxhYmxlUHJvbWlzZSBmb3IgdGhlIHByb3ZpZGVkIHJlYXNvbi5cbiAgICAgKlxuICAgICAqIEBncm91cCBTdGF0aWMgTWV0aG9kc1xuICAgICAqL1xuICAgIHN0YXRpYyByZWplY3Q8VCA9IG5ldmVyPihyZWFzb24/OiBhbnkpOiBDYW5jZWxsYWJsZVByb21pc2U8VD4ge1xuICAgICAgICByZXR1cm4gbmV3IENhbmNlbGxhYmxlUHJvbWlzZTxUPigoXywgcmVqZWN0KSA9PiByZWplY3QocmVhc29uKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyByZXNvbHZlZCBDYW5jZWxsYWJsZVByb21pc2UuXG4gICAgICpcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcbiAgICAgKi9cbiAgICBzdGF0aWMgcmVzb2x2ZSgpOiBDYW5jZWxsYWJsZVByb21pc2U8dm9pZD47XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyByZXNvbHZlZCBDYW5jZWxsYWJsZVByb21pc2UgZm9yIHRoZSBwcm92aWRlZCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBncm91cCBTdGF0aWMgTWV0aG9kc1xuICAgICAqL1xuICAgIHN0YXRpYyByZXNvbHZlPFQ+KHZhbHVlOiBUKTogQ2FuY2VsbGFibGVQcm9taXNlPEF3YWl0ZWQ8VD4+O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgcmVzb2x2ZWQgQ2FuY2VsbGFibGVQcm9taXNlIGZvciB0aGUgcHJvdmlkZWQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcbiAgICAgKi9cbiAgICBzdGF0aWMgcmVzb2x2ZTxUPih2YWx1ZTogVCB8IFByb21pc2VMaWtlPFQ+KTogQ2FuY2VsbGFibGVQcm9taXNlPEF3YWl0ZWQ8VD4+O1xuICAgIHN0YXRpYyByZXNvbHZlPFQgPSB2b2lkPih2YWx1ZT86IFQgfCBQcm9taXNlTGlrZTxUPik6IENhbmNlbGxhYmxlUHJvbWlzZTxBd2FpdGVkPFQ+PiB7XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIENhbmNlbGxhYmxlUHJvbWlzZSkge1xuICAgICAgICAgICAgLy8gT3B0aW1pc2UgZm9yIGNhbmNlbGxhYmxlIHByb21pc2VzLlxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQ2FuY2VsbGFibGVQcm9taXNlPGFueT4oKHJlc29sdmUpID0+IHJlc29sdmUodmFsdWUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IENhbmNlbGxhYmxlUHJvbWlzZSBhbmQgcmV0dXJucyBpdCBpbiBhbiBvYmplY3QsIGFsb25nIHdpdGggaXRzIHJlc29sdmUgYW5kIHJlamVjdCBmdW5jdGlvbnNcbiAgICAgKiBhbmQgYSBnZXR0ZXIvc2V0dGVyIGZvciB0aGUgY2FuY2VsbGF0aW9uIGNhbGxiYWNrLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgaXMgcG9seWZpbGxlZCwgaGVuY2UgYXZhaWxhYmxlIGluIGV2ZXJ5IE9TL3dlYnZpZXcgdmVyc2lvbi5cbiAgICAgKlxuICAgICAqIEBncm91cCBTdGF0aWMgTWV0aG9kc1xuICAgICAqL1xuICAgIHN0YXRpYyB3aXRoUmVzb2x2ZXJzPFQ+KCk6IENhbmNlbGxhYmxlUHJvbWlzZVdpdGhSZXNvbHZlcnM8VD4ge1xuICAgICAgICBsZXQgcmVzdWx0OiBDYW5jZWxsYWJsZVByb21pc2VXaXRoUmVzb2x2ZXJzPFQ+ID0geyBvbmNhbmNlbGxlZDogbnVsbCB9IGFzIGFueTtcbiAgICAgICAgcmVzdWx0LnByb21pc2UgPSBuZXcgQ2FuY2VsbGFibGVQcm9taXNlPFQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHJlc3VsdC5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgICAgIHJlc3VsdC5yZWplY3QgPSByZWplY3Q7XG4gICAgICAgIH0sIChjYXVzZT86IGFueSkgPT4geyByZXN1bHQub25jYW5jZWxsZWQ/LihjYXVzZSk7IH0pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgY2FsbGJhY2sgdGhhdCBpbXBsZW1lbnRzIHRoZSBjYW5jZWxsYXRpb24gYWxnb3JpdGhtIGZvciB0aGUgZ2l2ZW4gY2FuY2VsbGFibGUgcHJvbWlzZS5cbiAqIFRoZSBwcm9taXNlIHJldHVybmVkIGZyb20gdGhlIHJlc3VsdGluZyBmdW5jdGlvbiBkb2VzIG5vdCByZWplY3QuXG4gKi9cbmZ1bmN0aW9uIGNhbmNlbGxlckZvcjxUPihwcm9taXNlOiBDYW5jZWxsYWJsZVByb21pc2VXaXRoUmVzb2x2ZXJzPFQ+LCBzdGF0ZTogQ2FuY2VsbGFibGVQcm9taXNlU3RhdGUpIHtcbiAgICBsZXQgY2FuY2VsbGF0aW9uUHJvbWlzZTogdm9pZCB8IFByb21pc2VMaWtlPHZvaWQ+ID0gdW5kZWZpbmVkO1xuXG4gICAgcmV0dXJuIChyZWFzb246IENhbmNlbEVycm9yKTogdm9pZCB8IFByb21pc2VMaWtlPHZvaWQ+ID0+IHtcbiAgICAgICAgaWYgKCFzdGF0ZS5zZXR0bGVkKSB7XG4gICAgICAgICAgICBzdGF0ZS5zZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHN0YXRlLnJlYXNvbiA9IHJlYXNvbjtcbiAgICAgICAgICAgIHByb21pc2UucmVqZWN0KHJlYXNvbik7XG5cbiAgICAgICAgICAgIC8vIEF0dGFjaCBhbiBlcnJvciBoYW5kbGVyIHRoYXQgaWdub3JlcyB0aGlzIHNwZWNpZmljIHJlamVjdGlvbiByZWFzb24gYW5kIG5vdGhpbmcgZWxzZS5cbiAgICAgICAgICAgIC8vIEluIHRoZW9yeSwgYSBzYW5lIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gYXQgdGhpcyBwb2ludFxuICAgICAgICAgICAgLy8gc2hvdWxkIGFsd2F5cyByZWplY3Qgd2l0aCBvdXIgY2FuY2VsbGF0aW9uIHJlYXNvbixcbiAgICAgICAgICAgIC8vIGhlbmNlIHRoZSBoYW5kbGVyIHdpbGwgbmV2ZXIgdGhyb3cuXG4gICAgICAgICAgICB2b2lkIFByb21pc2UucHJvdG90eXBlLnRoZW4uY2FsbChwcm9taXNlLnByb21pc2UsIHVuZGVmaW5lZCwgKGVycikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlcnIgIT09IHJlYXNvbikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiByZWFzb24gaXMgbm90IHNldCwgdGhlIHByb21pc2UgcmVzb2x2ZWQgcmVndWxhcmx5LCBoZW5jZSB3ZSBtdXN0IG5vdCBjYWxsIG9uY2FuY2VsbGVkLlxuICAgICAgICAvLyBJZiBvbmNhbmNlbGxlZCBpcyB1bnNldCwgbm8gbmVlZCB0byBnbyBhbnkgZnVydGhlci5cbiAgICAgICAgaWYgKCFzdGF0ZS5yZWFzb24gfHwgIXByb21pc2Uub25jYW5jZWxsZWQpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgY2FuY2VsbGF0aW9uUHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUocHJvbWlzZS5vbmNhbmNlbGxlZCEoc3RhdGUucmVhc29uIS5jYXVzZSkpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgUHJvbWlzZS5yZWplY3QobmV3IENhbmNlbGxlZFJlamVjdGlvbkVycm9yKHByb21pc2UucHJvbWlzZSwgZXJyLCBcIlVuaGFuZGxlZCBleGNlcHRpb24gaW4gb25jYW5jZWxsZWQgY2FsbGJhY2suXCIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkuY2F0Y2goKHJlYXNvbj8pID0+IHtcbiAgICAgICAgICAgIFByb21pc2UucmVqZWN0KG5ldyBDYW5jZWxsZWRSZWplY3Rpb25FcnJvcihwcm9taXNlLnByb21pc2UsIHJlYXNvbiwgXCJVbmhhbmRsZWQgcmVqZWN0aW9uIGluIG9uY2FuY2VsbGVkIGNhbGxiYWNrLlwiKSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFVuc2V0IG9uY2FuY2VsbGVkIHRvIHByZXZlbnQgcmVwZWF0ZWQgY2FsbHMuXG4gICAgICAgIHByb21pc2Uub25jYW5jZWxsZWQgPSBudWxsO1xuXG4gICAgICAgIHJldHVybiBjYW5jZWxsYXRpb25Qcm9taXNlO1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgY2FsbGJhY2sgdGhhdCBpbXBsZW1lbnRzIHRoZSByZXNvbHV0aW9uIGFsZ29yaXRobSBmb3IgdGhlIGdpdmVuIGNhbmNlbGxhYmxlIHByb21pc2UuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVyRm9yPFQ+KHByb21pc2U6IENhbmNlbGxhYmxlUHJvbWlzZVdpdGhSZXNvbHZlcnM8VD4sIHN0YXRlOiBDYW5jZWxsYWJsZVByb21pc2VTdGF0ZSk6IENhbmNlbGxhYmxlUHJvbWlzZVJlc29sdmVyPFQ+IHtcbiAgICByZXR1cm4gKHZhbHVlKSA9PiB7XG4gICAgICAgIGlmIChzdGF0ZS5yZXNvbHZpbmcpIHsgcmV0dXJuOyB9XG4gICAgICAgIHN0YXRlLnJlc29sdmluZyA9IHRydWU7XG5cbiAgICAgICAgaWYgKHZhbHVlID09PSBwcm9taXNlLnByb21pc2UpIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZS5zZXR0bGVkKSB7IHJldHVybjsgfVxuICAgICAgICAgICAgc3RhdGUuc2V0dGxlZCA9IHRydWU7XG4gICAgICAgICAgICBwcm9taXNlLnJlamVjdChuZXcgVHlwZUVycm9yKFwiQSBwcm9taXNlIGNhbm5vdCBiZSByZXNvbHZlZCB3aXRoIGl0c2VsZi5cIikpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSkge1xuICAgICAgICAgICAgbGV0IHRoZW46IGFueTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhlbiA9ICh2YWx1ZSBhcyBhbnkpLnRoZW47XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBzdGF0ZS5zZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBwcm9taXNlLnJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlzQ2FsbGFibGUodGhlbikpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY2FuY2VsID0gKHZhbHVlIGFzIGFueSkuY2FuY2VsO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNDYWxsYWJsZShjYW5jZWwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvbmNhbmNlbGxlZCA9IChjYXVzZT86IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZmxlY3QuYXBwbHkoY2FuY2VsLCB2YWx1ZSwgW2NhdXNlXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLnJlYXNvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGFscmVhZHkgY2FuY2VsbGVkLCBwcm9wYWdhdGUgY2FuY2VsbGF0aW9uLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBwcm9taXNlIHJldHVybmVkIGZyb20gdGhlIGNhbmNlbGxlciBhbGdvcml0aG0gZG9lcyBub3QgcmVqZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gaXQgY2FuIGJlIGRpc2NhcmRlZCBzYWZlbHkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCBjYW5jZWxsZXJGb3IoeyAuLi5wcm9taXNlLCBvbmNhbmNlbGxlZCB9LCBzdGF0ZSkoc3RhdGUucmVhc29uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZS5vbmNhbmNlbGxlZCA9IG9uY2FuY2VsbGVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCB7fVxuXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3U3RhdGU6IENhbmNlbGxhYmxlUHJvbWlzZVN0YXRlID0ge1xuICAgICAgICAgICAgICAgICAgICByb290OiBzdGF0ZS5yb290LFxuICAgICAgICAgICAgICAgICAgICByZXNvbHZpbmc6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBnZXQgc2V0dGxlZCgpIHsgcmV0dXJuIHRoaXMucm9vdC5zZXR0bGVkIH0sXG4gICAgICAgICAgICAgICAgICAgIHNldCBzZXR0bGVkKHZhbHVlKSB7IHRoaXMucm9vdC5zZXR0bGVkID0gdmFsdWU7IH0sXG4gICAgICAgICAgICAgICAgICAgIGdldCByZWFzb24oKSB7IHJldHVybiB0aGlzLnJvb3QucmVhc29uIH1cbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVqZWN0b3IgPSByZWplY3RvckZvcihwcm9taXNlLCBuZXdTdGF0ZSk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgUmVmbGVjdC5hcHBseSh0aGVuLCB2YWx1ZSwgW3Jlc29sdmVyRm9yKHByb21pc2UsIG5ld1N0YXRlKSwgcmVqZWN0b3JdKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0b3IoZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBJTVBPUlRBTlQhXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RhdGUuc2V0dGxlZCkgeyByZXR1cm47IH1cbiAgICAgICAgc3RhdGUuc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIHByb21pc2UucmVzb2x2ZSh2YWx1ZSk7XG4gICAgfTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgY2FsbGJhY2sgdGhhdCBpbXBsZW1lbnRzIHRoZSByZWplY3Rpb24gYWxnb3JpdGhtIGZvciB0aGUgZ2l2ZW4gY2FuY2VsbGFibGUgcHJvbWlzZS5cbiAqL1xuZnVuY3Rpb24gcmVqZWN0b3JGb3I8VD4ocHJvbWlzZTogQ2FuY2VsbGFibGVQcm9taXNlV2l0aFJlc29sdmVyczxUPiwgc3RhdGU6IENhbmNlbGxhYmxlUHJvbWlzZVN0YXRlKTogQ2FuY2VsbGFibGVQcm9taXNlUmVqZWN0b3Ige1xuICAgIHJldHVybiAocmVhc29uPykgPT4ge1xuICAgICAgICBpZiAoc3RhdGUucmVzb2x2aW5nKSB7IHJldHVybjsgfVxuICAgICAgICBzdGF0ZS5yZXNvbHZpbmcgPSB0cnVlO1xuXG4gICAgICAgIGlmIChzdGF0ZS5zZXR0bGVkKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBDYW5jZWxFcnJvciAmJiBzdGF0ZS5yZWFzb24gaW5zdGFuY2VvZiBDYW5jZWxFcnJvciAmJiBPYmplY3QuaXMocmVhc29uLmNhdXNlLCBzdGF0ZS5yZWFzb24uY2F1c2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFN3YWxsb3cgbGF0ZSByZWplY3Rpb25zIHRoYXQgYXJlIENhbmNlbEVycm9ycyB3aG9zZSBjYW5jZWxsYXRpb24gY2F1c2UgaXMgdGhlIHNhbWUgYXMgb3Vycy5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2gge31cblxuICAgICAgICAgICAgdm9pZCBQcm9taXNlLnJlamVjdChuZXcgQ2FuY2VsbGVkUmVqZWN0aW9uRXJyb3IocHJvbWlzZS5wcm9taXNlLCByZWFzb24pKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YXRlLnNldHRsZWQgPSB0cnVlO1xuICAgICAgICAgICAgcHJvbWlzZS5yZWplY3QocmVhc29uKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBDYW5jZWxzIGFsbCB2YWx1ZXMgaW4gYW4gYXJyYXkgdGhhdCBsb29rIGxpa2UgY2FuY2VsbGFibGUgdGhlbmFibGVzLlxuICogUmV0dXJucyBhIHByb21pc2UgdGhhdCBmdWxmaWxscyBvbmNlIGFsbCBjYW5jZWxsYXRpb24gcHJvY2VkdXJlcyBmb3IgdGhlIGdpdmVuIHZhbHVlcyBoYXZlIHNldHRsZWQuXG4gKi9cbmZ1bmN0aW9uIGNhbmNlbEFsbChwYXJlbnQ6IENhbmNlbGxhYmxlUHJvbWlzZTx1bmtub3duPiwgdmFsdWVzOiBhbnlbXSwgY2F1c2U/OiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZXN1bHRzID0gW107XG5cbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgICBsZXQgY2FuY2VsOiBDYW5jZWxsYWJsZVByb21pc2VDYW5jZWxsZXI7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIWlzQ2FsbGFibGUodmFsdWUudGhlbikpIHsgY29udGludWU7IH1cbiAgICAgICAgICAgIGNhbmNlbCA9IHZhbHVlLmNhbmNlbDtcbiAgICAgICAgICAgIGlmICghaXNDYWxsYWJsZShjYW5jZWwpKSB7IGNvbnRpbnVlOyB9XG4gICAgICAgIH0gY2F0Y2ggeyBjb250aW51ZTsgfVxuXG4gICAgICAgIGxldCByZXN1bHQ6IHZvaWQgfCBQcm9taXNlTGlrZTx2b2lkPjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlc3VsdCA9IFJlZmxlY3QuYXBwbHkoY2FuY2VsLCB2YWx1ZSwgW2NhdXNlXSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgUHJvbWlzZS5yZWplY3QobmV3IENhbmNlbGxlZFJlamVjdGlvbkVycm9yKHBhcmVudCwgZXJyLCBcIlVuaGFuZGxlZCBleGNlcHRpb24gaW4gY2FuY2VsIG1ldGhvZC5cIikpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXJlc3VsdCkgeyBjb250aW51ZTsgfVxuICAgICAgICByZXN1bHRzLnB1c2goXG4gICAgICAgICAgICAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSAgPyByZXN1bHQgOiBQcm9taXNlLnJlc29sdmUocmVzdWx0KSkuY2F0Y2goKHJlYXNvbj8pID0+IHtcbiAgICAgICAgICAgICAgICBQcm9taXNlLnJlamVjdChuZXcgQ2FuY2VsbGVkUmVqZWN0aW9uRXJyb3IocGFyZW50LCByZWFzb24sIFwiVW5oYW5kbGVkIHJlamVjdGlvbiBpbiBjYW5jZWwgbWV0aG9kLlwiKSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLmFsbChyZXN1bHRzKSBhcyBhbnk7XG59XG5cbi8qKlxuICogUmV0dXJucyBpdHMgYXJndW1lbnQuXG4gKi9cbmZ1bmN0aW9uIGlkZW50aXR5PFQ+KHg6IFQpOiBUIHtcbiAgICByZXR1cm4geDtcbn1cblxuLyoqXG4gKiBUaHJvd3MgaXRzIGFyZ3VtZW50LlxuICovXG5mdW5jdGlvbiB0aHJvd2VyKHJlYXNvbj86IGFueSk6IG5ldmVyIHtcbiAgICB0aHJvdyByZWFzb247XG59XG5cbi8qKlxuICogQXR0ZW1wdHMgdmFyaW91cyBzdHJhdGVnaWVzIHRvIGNvbnZlcnQgYW4gZXJyb3IgdG8gYSBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGVycm9yTWVzc2FnZShlcnI6IGFueSk6IHN0cmluZyB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIEVycm9yIHx8IHR5cGVvZiBlcnIgIT09ICdvYmplY3QnIHx8IGVyci50b1N0cmluZyAhPT0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIFwiXCIgKyBlcnI7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIHt9XG5cbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZXJyKTtcbiAgICB9IGNhdGNoIHt9XG5cbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGVycik7XG4gICAgfSBjYXRjaCB7fVxuXG4gICAgcmV0dXJuIFwiPGNvdWxkIG5vdCBjb252ZXJ0IGVycm9yIHRvIHN0cmluZz5cIjtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBjdXJyZW50IGJhcnJpZXIgcHJvbWlzZSBmb3IgdGhlIGdpdmVuIGNhbmNlbGxhYmxlIHByb21pc2UuIElmIG5lY2Vzc2FyeSwgaW5pdGlhbGlzZXMgdGhlIGJhcnJpZXIuXG4gKi9cbmZ1bmN0aW9uIGN1cnJlbnRCYXJyaWVyPFQ+KHByb21pc2U6IENhbmNlbGxhYmxlUHJvbWlzZTxUPik6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBwd3I6IFBhcnRpYWw8UHJvbWlzZVdpdGhSZXNvbHZlcnM8dm9pZD4+ID0gcHJvbWlzZVtiYXJyaWVyU3ltXSA/PyB7fTtcbiAgICBpZiAoISgncHJvbWlzZScgaW4gcHdyKSkge1xuICAgICAgICBPYmplY3QuYXNzaWduKHB3ciwgcHJvbWlzZVdpdGhSZXNvbHZlcnM8dm9pZD4oKSk7XG4gICAgfVxuICAgIGlmIChwcm9taXNlW2JhcnJpZXJTeW1dID09IG51bGwpIHtcbiAgICAgICAgcHdyLnJlc29sdmUhKCk7XG4gICAgICAgIHByb21pc2VbYmFycmllclN5bV0gPSBwd3I7XG4gICAgfVxuICAgIHJldHVybiBwd3IucHJvbWlzZSE7XG59XG5cbi8vIFBvbHlmaWxsIFByb21pc2Uud2l0aFJlc29sdmVycy5cbmxldCBwcm9taXNlV2l0aFJlc29sdmVycyA9IFByb21pc2Uud2l0aFJlc29sdmVycztcbmlmIChwcm9taXNlV2l0aFJlc29sdmVycyAmJiB0eXBlb2YgcHJvbWlzZVdpdGhSZXNvbHZlcnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBwcm9taXNlV2l0aFJlc29sdmVycyA9IHByb21pc2VXaXRoUmVzb2x2ZXJzLmJpbmQoUHJvbWlzZSk7XG59IGVsc2Uge1xuICAgIHByb21pc2VXaXRoUmVzb2x2ZXJzID0gZnVuY3Rpb24gPFQ+KCk6IFByb21pc2VXaXRoUmVzb2x2ZXJzPFQ+IHtcbiAgICAgICAgbGV0IHJlc29sdmUhOiAodmFsdWU6IFQgfCBQcm9taXNlTGlrZTxUPikgPT4gdm9pZDtcbiAgICAgICAgbGV0IHJlamVjdCE6IChyZWFzb24/OiBhbnkpID0+IHZvaWQ7XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZTxUPigocmVzLCByZWopID0+IHsgcmVzb2x2ZSA9IHJlczsgcmVqZWN0ID0gcmVqOyB9KTtcbiAgICAgICAgcmV0dXJuIHsgcHJvbWlzZSwgcmVzb2x2ZSwgcmVqZWN0IH07XG4gICAgfVxufSIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuaW1wb3J0IHtuZXdSdW50aW1lQ2FsbGVyLCBvYmplY3ROYW1lc30gZnJvbSBcIi4vcnVudGltZS5qc1wiO1xuXG5jb25zdCBjYWxsID0gbmV3UnVudGltZUNhbGxlcihvYmplY3ROYW1lcy5DbGlwYm9hcmQpO1xuXG5jb25zdCBDbGlwYm9hcmRTZXRUZXh0ID0gMDtcbmNvbnN0IENsaXBib2FyZFRleHQgPSAxO1xuXG4vKipcbiAqIFNldHMgdGhlIHRleHQgdG8gdGhlIENsaXBib2FyZC5cbiAqXG4gKiBAcGFyYW0gdGV4dCAtIFRoZSB0ZXh0IHRvIGJlIHNldCB0byB0aGUgQ2xpcGJvYXJkLlxuICogQHJldHVybiBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFNldFRleHQodGV4dDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIGNhbGwoQ2xpcGJvYXJkU2V0VGV4dCwge3RleHR9KTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIENsaXBib2FyZCB0ZXh0XG4gKlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgdGV4dCBmcm9tIHRoZSBDbGlwYm9hcmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBUZXh0KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIGNhbGwoQ2xpcGJvYXJkVGV4dCk7XG59XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbi8qKlxuICogQW55IGlzIGEgZHVtbXkgY3JlYXRpb24gZnVuY3Rpb24gZm9yIHNpbXBsZSBvciB1bmtub3duIHR5cGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQW55PFQ+KHNvdXJjZTogYW55KTogVCB7XG4gICAgcmV0dXJuIHNvdXJjZTtcbn1cblxuLyoqXG4gKiBCeXRlU2xpY2UgaXMgYSBjcmVhdGlvbiBmdW5jdGlvbiB0aGF0IHJlcGxhY2VzXG4gKiBudWxsIHN0cmluZ3Mgd2l0aCBlbXB0eSBzdHJpbmdzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQnl0ZVNsaWNlKHNvdXJjZTogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gKChzb3VyY2UgPT0gbnVsbCkgPyBcIlwiIDogc291cmNlKTtcbn1cblxuLyoqXG4gKiBBcnJheSB0YWtlcyBhIGNyZWF0aW9uIGZ1bmN0aW9uIGZvciBhbiBhcmJpdHJhcnkgdHlwZVxuICogYW5kIHJldHVybnMgYW4gaW4tcGxhY2UgY3JlYXRpb24gZnVuY3Rpb24gZm9yIGFuIGFycmF5XG4gKiB3aG9zZSBlbGVtZW50cyBhcmUgb2YgdGhhdCB0eXBlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQXJyYXk8VD4oZWxlbWVudDogKHNvdXJjZTogYW55KSA9PiBUKTogKHNvdXJjZTogYW55KSA9PiBUW10ge1xuICAgIGlmIChlbGVtZW50ID09PSBBbnkpIHtcbiAgICAgICAgcmV0dXJuIChzb3VyY2UpID0+IChzb3VyY2UgPT09IG51bGwgPyBbXSA6IHNvdXJjZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIChzb3VyY2UpID0+IHtcbiAgICAgICAgaWYgKHNvdXJjZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc291cmNlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBzb3VyY2VbaV0gPSBlbGVtZW50KHNvdXJjZVtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICB9O1xufVxuXG4vKipcbiAqIE1hcCB0YWtlcyBjcmVhdGlvbiBmdW5jdGlvbnMgZm9yIHR3byBhcmJpdHJhcnkgdHlwZXNcbiAqIGFuZCByZXR1cm5zIGFuIGluLXBsYWNlIGNyZWF0aW9uIGZ1bmN0aW9uIGZvciBhbiBvYmplY3RcbiAqIHdob3NlIGtleXMgYW5kIHZhbHVlcyBhcmUgb2YgdGhvc2UgdHlwZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBNYXA8Vj4oa2V5OiAoc291cmNlOiBhbnkpID0+IHN0cmluZywgdmFsdWU6IChzb3VyY2U6IGFueSkgPT4gVik6IChzb3VyY2U6IGFueSkgPT4gUmVjb3JkPHN0cmluZywgVj4ge1xuICAgIGlmICh2YWx1ZSA9PT0gQW55KSB7XG4gICAgICAgIHJldHVybiAoc291cmNlKSA9PiAoc291cmNlID09PSBudWxsID8ge30gOiBzb3VyY2UpO1xuICAgIH1cblxuICAgIHJldHVybiAoc291cmNlKSA9PiB7XG4gICAgICAgIGlmIChzb3VyY2UgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgIHNvdXJjZVtrZXldID0gdmFsdWUoc291cmNlW2tleV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgfTtcbn1cblxuLyoqXG4gKiBOdWxsYWJsZSB0YWtlcyBhIGNyZWF0aW9uIGZ1bmN0aW9uIGZvciBhbiBhcmJpdHJhcnkgdHlwZVxuICogYW5kIHJldHVybnMgYSBjcmVhdGlvbiBmdW5jdGlvbiBmb3IgYSBudWxsYWJsZSB2YWx1ZSBvZiB0aGF0IHR5cGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBOdWxsYWJsZTxUPihlbGVtZW50OiAoc291cmNlOiBhbnkpID0+IFQpOiAoc291cmNlOiBhbnkpID0+IChUIHwgbnVsbCkge1xuICAgIGlmIChlbGVtZW50ID09PSBBbnkpIHtcbiAgICAgICAgcmV0dXJuIEFueTtcbiAgICB9XG5cbiAgICByZXR1cm4gKHNvdXJjZSkgPT4gKHNvdXJjZSA9PT0gbnVsbCA/IG51bGwgOiBlbGVtZW50KHNvdXJjZSkpO1xufVxuXG4vKipcbiAqIFN0cnVjdCB0YWtlcyBhbiBvYmplY3QgbWFwcGluZyBmaWVsZCBuYW1lcyB0byBjcmVhdGlvbiBmdW5jdGlvbnNcbiAqIGFuZCByZXR1cm5zIGFuIGluLXBsYWNlIGNyZWF0aW9uIGZ1bmN0aW9uIGZvciBhIHN0cnVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFN0cnVjdDxcbiAgICBUIGV4dGVuZHMgeyBbXzogc3RyaW5nXTogKChzb3VyY2U6IGFueSkgPT4gYW55KSB9LFxuICAgIFUgZXh0ZW5kcyB7IFtLZXkgaW4ga2V5b2YgVF0/OiBSZXR1cm5UeXBlPFRbS2V5XT4gfVxuPihjcmVhdGVGaWVsZDogVCk6IChzb3VyY2U6IGFueSkgPT4gVSB7XG4gICAgbGV0IGFsbEFueSA9IHRydWU7XG4gICAgZm9yIChjb25zdCBuYW1lIGluIGNyZWF0ZUZpZWxkKSB7XG4gICAgICAgIGlmIChjcmVhdGVGaWVsZFtuYW1lXSAhPT0gQW55KSB7XG4gICAgICAgICAgICBhbGxBbnkgPSBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChhbGxBbnkpIHtcbiAgICAgICAgcmV0dXJuIEFueTtcbiAgICB9XG5cbiAgICByZXR1cm4gKHNvdXJjZSkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgaW4gY3JlYXRlRmllbGQpIHtcbiAgICAgICAgICAgIGlmIChuYW1lIGluIHNvdXJjZSkge1xuICAgICAgICAgICAgICAgIHNvdXJjZVtuYW1lXSA9IGNyZWF0ZUZpZWxkW25hbWVdKHNvdXJjZVtuYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICB9O1xufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5leHBvcnQgaW50ZXJmYWNlIFNpemUge1xuICAgIC8qKiBUaGUgd2lkdGggb2YgYSByZWN0YW5ndWxhciBhcmVhLiAqL1xuICAgIFdpZHRoOiBudW1iZXI7XG4gICAgLyoqIFRoZSBoZWlnaHQgb2YgYSByZWN0YW5ndWxhciBhcmVhLiAqL1xuICAgIEhlaWdodDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlY3Qge1xuICAgIC8qKiBUaGUgWCBjb29yZGluYXRlIG9mIHRoZSBvcmlnaW4uICovXG4gICAgWDogbnVtYmVyO1xuICAgIC8qKiBUaGUgWSBjb29yZGluYXRlIG9mIHRoZSBvcmlnaW4uICovXG4gICAgWTogbnVtYmVyO1xuICAgIC8qKiBUaGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZS4gKi9cbiAgICBXaWR0aDogbnVtYmVyO1xuICAgIC8qKiBUaGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUuICovXG4gICAgSGVpZ2h0OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2NyZWVuIHtcbiAgICAvKiogVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBzY3JlZW4uICovXG4gICAgSUQ6IHN0cmluZztcbiAgICAvKiogSHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgc2NyZWVuLiAqL1xuICAgIE5hbWU6IHN0cmluZztcbiAgICAvKiogVGhlIHNjYWxlIGZhY3RvciBvZiB0aGUgc2NyZWVuIChEUEkvOTYpLiAxID0gc3RhbmRhcmQgRFBJLCAyID0gSGlEUEkgKFJldGluYSksIGV0Yy4gKi9cbiAgICBTY2FsZUZhY3RvcjogbnVtYmVyO1xuICAgIC8qKiBUaGUgWCBjb29yZGluYXRlIG9mIHRoZSBzY3JlZW4uICovXG4gICAgWDogbnVtYmVyO1xuICAgIC8qKiBUaGUgWSBjb29yZGluYXRlIG9mIHRoZSBzY3JlZW4uICovXG4gICAgWTogbnVtYmVyO1xuICAgIC8qKiBDb250YWlucyB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgc2NyZWVuLiAqL1xuICAgIFNpemU6IFNpemU7XG4gICAgLyoqIENvbnRhaW5zIHRoZSBib3VuZHMgb2YgdGhlIHNjcmVlbiBpbiB0ZXJtcyBvZiBYLCBZLCBXaWR0aCwgYW5kIEhlaWdodC4gKi9cbiAgICBCb3VuZHM6IFJlY3Q7XG4gICAgLyoqIENvbnRhaW5zIHRoZSBwaHlzaWNhbCBib3VuZHMgb2YgdGhlIHNjcmVlbiBpbiB0ZXJtcyBvZiBYLCBZLCBXaWR0aCwgYW5kIEhlaWdodCAoYmVmb3JlIHNjYWxpbmcpLiAqL1xuICAgIFBoeXNpY2FsQm91bmRzOiBSZWN0O1xuICAgIC8qKiBDb250YWlucyB0aGUgYXJlYSBvZiB0aGUgc2NyZWVuIHRoYXQgaXMgYWN0dWFsbHkgdXNhYmxlIChleGNsdWRpbmcgdGFza2JhciBhbmQgb3RoZXIgc3lzdGVtIFVJKS4gKi9cbiAgICBXb3JrQXJlYTogUmVjdDtcbiAgICAvKiogQ29udGFpbnMgdGhlIHBoeXNpY2FsIFdvcmtBcmVhIG9mIHRoZSBzY3JlZW4gKGJlZm9yZSBzY2FsaW5nKS4gKi9cbiAgICBQaHlzaWNhbFdvcmtBcmVhOiBSZWN0O1xuICAgIC8qKiBUcnVlIGlmIHRoaXMgaXMgdGhlIHByaW1hcnkgbW9uaXRvciBzZWxlY3RlZCBieSB0aGUgdXNlciBpbiB0aGUgb3BlcmF0aW5nIHN5c3RlbS4gKi9cbiAgICBJc1ByaW1hcnk6IGJvb2xlYW47XG4gICAgLyoqIFRoZSByb3RhdGlvbiBvZiB0aGUgc2NyZWVuLiAqL1xuICAgIFJvdGF0aW9uOiBudW1iZXI7XG59XG5cbmltcG9ydCB7IG5ld1J1bnRpbWVDYWxsZXIsIG9iamVjdE5hbWVzIH0gZnJvbSBcIi4vcnVudGltZS5qc1wiO1xuY29uc3QgY2FsbCA9IG5ld1J1bnRpbWVDYWxsZXIob2JqZWN0TmFtZXMuU2NyZWVucyk7XG5cbmNvbnN0IGdldEFsbCA9IDA7XG5jb25zdCBnZXRQcmltYXJ5ID0gMTtcbmNvbnN0IGdldEN1cnJlbnQgPSAyO1xuXG4vKipcbiAqIEdldHMgYWxsIHNjcmVlbnMuXG4gKlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgb2YgU2NyZWVuIG9iamVjdHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBHZXRBbGwoKTogUHJvbWlzZTxTY3JlZW5bXT4ge1xuICAgIHJldHVybiBjYWxsKGdldEFsbCk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgcHJpbWFyeSBzY3JlZW4uXG4gKlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHByaW1hcnkgc2NyZWVuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gR2V0UHJpbWFyeSgpOiBQcm9taXNlPFNjcmVlbj4ge1xuICAgIHJldHVybiBjYWxsKGdldFByaW1hcnkpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGN1cnJlbnQgYWN0aXZlIHNjcmVlbi5cbiAqXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBjdXJyZW50IGFjdGl2ZSBzY3JlZW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBHZXRDdXJyZW50KCk6IFByb21pc2U8U2NyZWVuPiB7XG4gICAgcmV0dXJuIGNhbGwoZ2V0Q3VycmVudCk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7OztBQ0FBO0FBQUE7QUFBQTtBQUFBO0FBQUE7OztBQ0FBO0FBQUE7QUFBQTtBQUFBOzs7QUM2QkEs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QU8sSUFBSSxJQUFJLFlBQVksSUFBSSxFQUFFLE9BQU8sSUFBSSxDQUFDO0FBQUEsTUFDakQ7QUFBQSxJQUNKO0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFDSjs7O0FDMUdBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQXdEQSxJQUFNQyxRQUFPLGlCQUFpQixZQUFZLE9BQU87QUFFakQsSUFBTSxTQUFTO0FBQ2YsSUFBTSxhQUFhO0FBQ25CLElBQU0sYUFBYTtBQU9aLFNBQVMsU0FBNEI7QUFDeEMsU0FBT0EsTUFBSyxNQUFNO0FBQ3RCO0FBT08sU0FBUyxhQUE4QjtBQUMxQyxTQUFPQSxNQUFLLFVBQVU7QUFDMUI7QUFPTyxTQUFTLGFBQThCO0FBQzFDLFNBQU9BLE1BQUssVUFBVTtBQUMxQjs7O0F0QjVFQSxPQUFPLFNBQVMsT0FBTyxVQUFVLENBQUM7QUE0Q2xDLE9BQU8sT0FBTyxTQUFnQjtBQUN2QixPQUFPLHFCQUFxQjsiLAogICJuYW1lcyI6IFsiX2EiLCAiRXJyb3IiLCAiY2FsbCIsICJfYSIsICJFcnJvciIsICJjYWxsIiwgIl9hIiwgInJlc2l6YWJsZSIsICJjYWxsIiwgIl9hIiwgImNhbGwiLCAiY2FsbCIsICJIaWRlTWV0aG9kIiwgIlNob3dNZXRob2QiLCAiaXNEb2N1bWVudERvdEFsbCIsICJfYSIsICJyZWFzb24iLCAidmFsdWUiLCAiY2FsbCIsICJnZXRBbmREZWxldGVSZXNwb25zZSIsICJnZW5lcmF0ZUlEIiwgImNhbGwiLCAiQXJyYXkiLCAiTWFwIiwgIkFycmF5IiwgIk1hcCIsICJrZXkiLCAiY2FsbCJdCn0K +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2luZGV4LnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy93bWwudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2Jyb3dzZXIudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL25hbm9pZC50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvcnVudGltZS50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvZGlhbG9ncy50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvZXZlbnRzLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9saXN0ZW5lci50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvZXZlbnRfdHlwZXMudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3V0aWxzLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy93aW5kb3cudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL2NvbXBpbGVkL21haW4uanMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3N5c3RlbS50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvY29udGV4dG1lbnUudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2ZsYWdzLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9kcmFnLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9hcHBsaWNhdGlvbi50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvY2FsbHMudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2NhbGxhYmxlLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9jYW5jZWxsYWJsZS50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvY2xpcGJvYXJkLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9jcmVhdGUudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3NjcmVlbnMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vLyBTZXR1cFxud2luZG93Ll93YWlscyA9IHdpbmRvdy5fd2FpbHMgfHwge307XG5cbmltcG9ydCBcIi4vY29udGV4dG1lbnUuanNcIjtcbmltcG9ydCBcIi4vZHJhZy5qc1wiO1xuXG4vLyBSZS1leHBvcnQgcHVibGljIEFQSVxuaW1wb3J0ICogYXMgQXBwbGljYXRpb24gZnJvbSBcIi4vYXBwbGljYXRpb24uanNcIjtcbmltcG9ydCAqIGFzIEJyb3dzZXIgZnJvbSBcIi4vYnJvd3Nlci5qc1wiO1xuaW1wb3J0ICogYXMgQ2FsbCBmcm9tIFwiLi9jYWxscy5qc1wiO1xuaW1wb3J0ICogYXMgQ2xpcGJvYXJkIGZyb20gXCIuL2NsaXBib2FyZC5qc1wiO1xuaW1wb3J0ICogYXMgQ3JlYXRlIGZyb20gXCIuL2NyZWF0ZS5qc1wiO1xuaW1wb3J0ICogYXMgRGlhbG9ncyBmcm9tIFwiLi9kaWFsb2dzLmpzXCI7XG5pbXBvcnQgKiBhcyBFdmVudHMgZnJvbSBcIi4vZXZlbnRzLmpzXCI7XG5pbXBvcnQgKiBhcyBGbGFncyBmcm9tIFwiLi9mbGFncy5qc1wiO1xuaW1wb3J0ICogYXMgU2NyZWVucyBmcm9tIFwiLi9zY3JlZW5zLmpzXCI7XG5pbXBvcnQgKiBhcyBTeXN0ZW0gZnJvbSBcIi4vc3lzdGVtLmpzXCI7XG5pbXBvcnQgV2luZG93IGZyb20gXCIuL3dpbmRvdy5qc1wiO1xuaW1wb3J0ICogYXMgV01MIGZyb20gXCIuL3dtbC5qc1wiO1xuXG5leHBvcnQge1xuICAgIEFwcGxpY2F0aW9uLFxuICAgIEJyb3dzZXIsXG4gICAgQ2FsbCxcbiAgICBDbGlwYm9hcmQsXG4gICAgRGlhbG9ncyxcbiAgICBFdmVudHMsXG4gICAgRmxhZ3MsXG4gICAgU2NyZWVucyxcbiAgICBTeXN0ZW0sXG4gICAgV2luZG93LFxuICAgIFdNTFxufTtcblxuLyoqXG4gKiBBbiBpbnRlcm5hbCB1dGlsaXR5IGNvbnN1bWVkIGJ5IHRoZSBiaW5kaW5nIGdlbmVyYXRvci5cbiAqXG4gKiBAaWdub3JlXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IHsgQ3JlYXRlIH07XG5cbmV4cG9ydCAqIGZyb20gXCIuL2NhbmNlbGxhYmxlLmpzXCI7XG5cbi8vIE5vdGlmeSBiYWNrZW5kXG53aW5kb3cuX3dhaWxzLmludm9rZSA9IFN5c3RlbS5pbnZva2U7XG5TeXN0ZW0uaW52b2tlKFwid2FpbHM6cnVudGltZTpyZWFkeVwiKTtcbiIsICIvKlxuIF8gICAgIF9fICAgICBfIF9fXG58IHwgIC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuaW1wb3J0IHsgT3BlblVSTCB9IGZyb20gXCIuL2Jyb3dzZXIuanNcIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4vZGlhbG9ncy5qc1wiO1xuaW1wb3J0IHsgRW1pdCwgV2FpbHNFdmVudCB9IGZyb20gXCIuL2V2ZW50cy5qc1wiO1xuaW1wb3J0IHsgY2FuQWJvcnRMaXN0ZW5lcnMsIHdoZW5SZWFkeSB9IGZyb20gXCIuL3V0aWxzLmpzXCI7XG5pbXBvcnQgV2luZG93IGZyb20gXCIuL3dpbmRvdy5qc1wiO1xuXG4vKipcbiAqIFNlbmRzIGFuIGV2ZW50IHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIG9wdGlvbmFsIGRhdGEuXG4gKlxuICogQHBhcmFtIGV2ZW50TmFtZSAtIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIHNlbmQuXG4gKiBAcGFyYW0gW2RhdGE9bnVsbF0gLSAtIE9wdGlvbmFsIGRhdGEgdG8gc2VuZCBhbG9uZyB3aXRoIHRoZSBldmVudC5cbiAqL1xuZnVuY3Rpb24gc2VuZEV2ZW50KGV2ZW50TmFtZTogc3RyaW5nLCBkYXRhOiBhbnkgPSBudWxsKTogdm9pZCB7XG4gICAgRW1pdChuZXcgV2FpbHNFdmVudChldmVudE5hbWUsIGRhdGEpKTtcbn1cblxuLyoqXG4gKiBDYWxscyBhIG1ldGhvZCBvbiBhIHNwZWNpZmllZCB3aW5kb3cuXG4gKlxuICogQHBhcmFtIHdpbmRvd05hbWUgLSBUaGUgbmFtZSBvZiB0aGUgd2luZG93IHRvIGNhbGwgdGhlIG1ldGhvZCBvbi5cbiAqIEBwYXJhbSBtZXRob2ROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0byBjYWxsLlxuICovXG5mdW5jdGlvbiBjYWxsV2luZG93TWV0aG9kKHdpbmRvd05hbWU6IHN0cmluZywgbWV0aG9kTmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgdGFyZ2V0V2luZG93ID0gV2luZG93LkdldCh3aW5kb3dOYW1lKTtcbiAgICBjb25zdCBtZXRob2QgPSAodGFyZ2V0V2luZG93IGFzIGFueSlbbWV0aG9kTmFtZV07XG5cbiAgICBpZiAodHlwZW9mIG1ldGhvZCAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFdpbmRvdyBtZXRob2QgJyR7bWV0aG9kTmFtZX0nIG5vdCBmb3VuZGApO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgICAgbWV0aG9kLmNhbGwodGFyZ2V0V2luZG93KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIGNhbGxpbmcgd2luZG93IG1ldGhvZCAnJHttZXRob2ROYW1lfSc6IGAsIGUpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZXNwb25kcyB0byBhIHRyaWdnZXJpbmcgZXZlbnQgYnkgcnVubmluZyBhcHByb3ByaWF0ZSBXTUwgYWN0aW9ucyBmb3IgdGhlIGN1cnJlbnQgdGFyZ2V0LlxuICovXG5mdW5jdGlvbiBvbldNTFRyaWdnZXJlZChldjogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBlbGVtZW50ID0gZXYuY3VycmVudFRhcmdldCBhcyBFbGVtZW50O1xuXG4gICAgZnVuY3Rpb24gcnVuRWZmZWN0KGNob2ljZSA9IFwiWWVzXCIpIHtcbiAgICAgICAgaWYgKGNob2ljZSAhPT0gXCJZZXNcIilcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjb25zdCBldmVudFR5cGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnd21sLWV2ZW50JykgfHwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtd21sLWV2ZW50Jyk7XG4gICAgICAgIGNvbnN0IHRhcmdldFdpbmRvdyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd3bWwtdGFyZ2V0LXdpbmRvdycpIHx8IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXdtbC10YXJnZXQtd2luZG93JykgfHwgXCJcIjtcbiAgICAgICAgY29uc3Qgd2luZG93TWV0aG9kID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3dtbC13aW5kb3cnKSB8fCBlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS13bWwtd2luZG93Jyk7XG4gICAgICAgIGNvbnN0IHVybCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd3bWwtb3BlbnVybCcpIHx8IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXdtbC1vcGVudXJsJyk7XG5cbiAgICAgICAgaWYgKGV2ZW50VHlwZSAhPT0gbnVsbClcbiAgICAgICAgICAgIHNlbmRFdmVudChldmVudFR5cGUpO1xuICAgICAgICBpZiAod2luZG93TWV0aG9kICE9PSBudWxsKVxuICAgICAgICAgICAgY2FsbFdpbmRvd01ldGhvZCh0YXJnZXRXaW5kb3csIHdpbmRvd01ldGhvZCk7XG4gICAgICAgIGlmICh1cmwgIT09IG51bGwpXG4gICAgICAgICAgICB2b2lkIE9wZW5VUkwodXJsKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb25maXJtID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3dtbC1jb25maXJtJykgfHwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtd21sLWNvbmZpcm0nKTtcblxuICAgIGlmIChjb25maXJtKSB7XG4gICAgICAgIFF1ZXN0aW9uKHtcbiAgICAgICAgICAgIFRpdGxlOiBcIkNvbmZpcm1cIixcbiAgICAgICAgICAgIE1lc3NhZ2U6IGNvbmZpcm0sXG4gICAgICAgICAgICBEZXRhY2hlZDogZmFsc2UsXG4gICAgICAgICAgICBCdXR0b25zOiBbXG4gICAgICAgICAgICAgICAgeyBMYWJlbDogXCJZZXNcIiB9LFxuICAgICAgICAgICAgICAgIHsgTGFiZWw6IFwiTm9cIiwgSXNEZWZhdWx0OiB0cnVlIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSkudGhlbihydW5FZmZlY3QpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJ1bkVmZmVjdCgpO1xuICAgIH1cbn1cblxuLy8gUHJpdmF0ZSBmaWVsZCBuYW1lcy5cbmNvbnN0IGNvbnRyb2xsZXJTeW0gPSBTeW1ib2woXCJjb250cm9sbGVyXCIpO1xuY29uc3QgdHJpZ2dlck1hcFN5bSA9IFN5bWJvbChcInRyaWdnZXJNYXBcIik7XG5jb25zdCBlbGVtZW50Q291bnRTeW0gPSBTeW1ib2woXCJlbGVtZW50Q291bnRcIik7XG5cbi8qKlxuICogQWJvcnRDb250cm9sbGVyUmVnaXN0cnkgZG9lcyBub3QgYWN0dWFsbHkgcmVtZW1iZXIgYWN0aXZlIGV2ZW50IGxpc3RlbmVyczogaW5zdGVhZFxuICogaXQgdGllcyB0aGVtIHRvIGFuIEFib3J0U2lnbmFsIGFuZCB1c2VzIGFuIEFib3J0Q29udHJvbGxlciB0byByZW1vdmUgdGhlbSBhbGwgYXQgb25jZS5cbiAqL1xuY2xhc3MgQWJvcnRDb250cm9sbGVyUmVnaXN0cnkge1xuICAgIC8vIFByaXZhdGUgZmllbGRzLlxuICAgIFtjb250cm9sbGVyU3ltXTogQWJvcnRDb250cm9sbGVyO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXNbY29udHJvbGxlclN5bV0gPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBvcHRpb25zIG9iamVjdCBmb3IgYWRkRXZlbnRMaXN0ZW5lciB0aGF0IHRpZXMgdGhlIGxpc3RlbmVyXG4gICAgICogdG8gdGhlIEFib3J0U2lnbmFsIGZyb20gdGhlIGN1cnJlbnQgQWJvcnRDb250cm9sbGVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVsZW1lbnQgLSBBbiBIVE1MIGVsZW1lbnRcbiAgICAgKiBAcGFyYW0gdHJpZ2dlcnMgLSBUaGUgbGlzdCBvZiBhY3RpdmUgV01MIHRyaWdnZXIgZXZlbnRzIGZvciB0aGUgc3BlY2lmaWVkIGVsZW1lbnRzXG4gICAgICovXG4gICAgc2V0KGVsZW1lbnQ6IEVsZW1lbnQsIHRyaWdnZXJzOiBzdHJpbmdbXSk6IEFkZEV2ZW50TGlzdGVuZXJPcHRpb25zIHtcbiAgICAgICAgcmV0dXJuIHsgc2lnbmFsOiB0aGlzW2NvbnRyb2xsZXJTeW1dLnNpZ25hbCB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIHJlZ2lzdGVyZWQgZXZlbnQgbGlzdGVuZXJzIGFuZCByZXNldHMgdGhlIHJlZ2lzdHJ5LlxuICAgICAqL1xuICAgIHJlc2V0KCk6IHZvaWQge1xuICAgICAgICB0aGlzW2NvbnRyb2xsZXJTeW1dLmFib3J0KCk7XG4gICAgICAgIHRoaXNbY29udHJvbGxlclN5bV0gPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgfVxufVxuXG4vKipcbiAqIFdlYWtNYXBSZWdpc3RyeSBtYXBzIGFjdGl2ZSB0cmlnZ2VyIGV2ZW50cyB0byBlYWNoIERPTSBlbGVtZW50IHRocm91Z2ggYSBXZWFrTWFwLlxuICogVGhpcyBlbnN1cmVzIHRoYXQgdGhlIG1hcHBpbmcgcmVtYWlucyBwcml2YXRlIHRvIHRoaXMgbW9kdWxlLCB3aGlsZSBzdGlsbCBhbGxvd2luZyBnYXJiYWdlXG4gKiBjb2xsZWN0aW9uIG9mIHRoZSBpbnZvbHZlZCBlbGVtZW50cy5cbiAqL1xuY2xhc3MgV2Vha01hcFJlZ2lzdHJ5IHtcbiAgICAvKiogU3RvcmVzIHRoZSBjdXJyZW50IGVsZW1lbnQtdG8tdHJpZ2dlciBtYXBwaW5nLiAqL1xuICAgIFt0cmlnZ2VyTWFwU3ltXTogV2Vha01hcDxFbGVtZW50LCBzdHJpbmdbXT47XG4gICAgLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHdpdGggYWN0aXZlIFdNTCB0cmlnZ2Vycy4gKi9cbiAgICBbZWxlbWVudENvdW50U3ltXTogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXNbdHJpZ2dlck1hcFN5bV0gPSBuZXcgV2Vha01hcCgpO1xuICAgICAgICB0aGlzW2VsZW1lbnRDb3VudFN5bV0gPSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgYWN0aXZlIHRyaWdnZXJzIGZvciB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZWxlbWVudCAtIEFuIEhUTUwgZWxlbWVudFxuICAgICAqIEBwYXJhbSB0cmlnZ2VycyAtIFRoZSBsaXN0IG9mIGFjdGl2ZSBXTUwgdHJpZ2dlciBldmVudHMgZm9yIHRoZSBzcGVjaWZpZWQgZWxlbWVudFxuICAgICAqL1xuICAgIHNldChlbGVtZW50OiBFbGVtZW50LCB0cmlnZ2Vyczogc3RyaW5nW10pOiBBZGRFdmVudExpc3RlbmVyT3B0aW9ucyB7XG4gICAgICAgIGlmICghdGhpc1t0cmlnZ2VyTWFwU3ltXS5oYXMoZWxlbWVudCkpIHsgdGhpc1tlbGVtZW50Q291bnRTeW1dKys7IH1cbiAgICAgICAgdGhpc1t0cmlnZ2VyTWFwU3ltXS5zZXQoZWxlbWVudCwgdHJpZ2dlcnMpO1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwgcmVnaXN0ZXJlZCBldmVudCBsaXN0ZW5lcnMuXG4gICAgICovXG4gICAgcmVzZXQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzW2VsZW1lbnRDb3VudFN5bV0gPD0gMClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZG9jdW1lbnQuYm9keS5xdWVyeVNlbGVjdG9yQWxsKCcqJykpIHtcbiAgICAgICAgICAgIGlmICh0aGlzW2VsZW1lbnRDb3VudFN5bV0gPD0gMClcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY29uc3QgdHJpZ2dlcnMgPSB0aGlzW3RyaWdnZXJNYXBTeW1dLmdldChlbGVtZW50KTtcbiAgICAgICAgICAgIGlmICh0cmlnZ2VycyAhPSBudWxsKSB7IHRoaXNbZWxlbWVudENvdW50U3ltXS0tOyB9XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgdHJpZ2dlciBvZiB0cmlnZ2VycyB8fCBbXSlcbiAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodHJpZ2dlciwgb25XTUxUcmlnZ2VyZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpc1t0cmlnZ2VyTWFwU3ltXSA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgIHRoaXNbZWxlbWVudENvdW50U3ltXSA9IDA7XG4gICAgfVxufVxuXG5jb25zdCB0cmlnZ2VyUmVnaXN0cnkgPSBjYW5BYm9ydExpc3RlbmVycygpID8gbmV3IEFib3J0Q29udHJvbGxlclJlZ2lzdHJ5KCkgOiBuZXcgV2Vha01hcFJlZ2lzdHJ5KCk7XG5cbi8qKlxuICogQWRkcyBldmVudCBsaXN0ZW5lcnMgdG8gdGhlIHNwZWNpZmllZCBlbGVtZW50LlxuICovXG5mdW5jdGlvbiBhZGRXTUxMaXN0ZW5lcnMoZWxlbWVudDogRWxlbWVudCk6IHZvaWQge1xuICAgIGNvbnN0IHRyaWdnZXJSZWdFeHAgPSAvXFxTKy9nO1xuICAgIGNvbnN0IHRyaWdnZXJBdHRyID0gKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd3bWwtdHJpZ2dlcicpIHx8IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXdtbC10cmlnZ2VyJykgfHwgXCJjbGlja1wiKTtcbiAgICBjb25zdCB0cmlnZ2Vyczogc3RyaW5nW10gPSBbXTtcblxuICAgIGxldCBtYXRjaDtcbiAgICB3aGlsZSAoKG1hdGNoID0gdHJpZ2dlclJlZ0V4cC5leGVjKHRyaWdnZXJBdHRyKSkgIT09IG51bGwpXG4gICAgICAgIHRyaWdnZXJzLnB1c2gobWF0Y2hbMF0pO1xuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHRyaWdnZXJSZWdpc3RyeS5zZXQoZWxlbWVudCwgdHJpZ2dlcnMpO1xuICAgIGZvciAoY29uc3QgdHJpZ2dlciBvZiB0cmlnZ2VycylcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHRyaWdnZXIsIG9uV01MVHJpZ2dlcmVkLCBvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBTY2hlZHVsZXMgYW4gYXV0b21hdGljIHJlbG9hZCBvZiBXTUwgdG8gYmUgcGVyZm9ybWVkIGFzIHNvb24gYXMgdGhlIGRvY3VtZW50IGlzIGZ1bGx5IGxvYWRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEVuYWJsZSgpOiB2b2lkIHtcbiAgICB3aGVuUmVhZHkoUmVsb2FkKTtcbn1cblxuLyoqXG4gKiBSZWxvYWRzIHRoZSBXTUwgcGFnZSBieSBhZGRpbmcgbmVjZXNzYXJ5IGV2ZW50IGxpc3RlbmVycyBhbmQgYnJvd3NlciBsaXN0ZW5lcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBSZWxvYWQoKTogdm9pZCB7XG4gICAgdHJpZ2dlclJlZ2lzdHJ5LnJlc2V0KCk7XG4gICAgZG9jdW1lbnQuYm9keS5xdWVyeVNlbGVjdG9yQWxsKCdbd21sLWV2ZW50XSwgW3dtbC13aW5kb3ddLCBbd21sLW9wZW51cmxdLCBbZGF0YS13bWwtZXZlbnRdLCBbZGF0YS13bWwtd2luZG93XSwgW2RhdGEtd21sLW9wZW51cmxdJykuZm9yRWFjaChhZGRXTUxMaXN0ZW5lcnMpO1xufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5pbXBvcnQgeyBuZXdSdW50aW1lQ2FsbGVyLCBvYmplY3ROYW1lcyB9IGZyb20gXCIuL3J1bnRpbWUuanNcIjtcblxuY29uc3QgY2FsbCA9IG5ld1J1bnRpbWVDYWxsZXIob2JqZWN0TmFtZXMuQnJvd3Nlcik7XG5cbmNvbnN0IEJyb3dzZXJPcGVuVVJMID0gMDtcblxuLyoqXG4gKiBPcGVuIGEgYnJvd3NlciB3aW5kb3cgdG8gdGhlIGdpdmVuIFVSTC5cbiAqXG4gKiBAcGFyYW0gdXJsIC0gVGhlIFVSTCB0byBvcGVuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBPcGVuVVJMKHVybDogc3RyaW5nIHwgVVJMKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIGNhbGwoQnJvd3Nlck9wZW5VUkwsIHt1cmw6IHVybC50b1N0cmluZygpfSk7XG59XG4iLCAiLy8gU291cmNlOiBodHRwczovL2dpdGh1Yi5jb20vYWkvbmFub2lkXG5cbi8vIFRoZSBNSVQgTGljZW5zZSAoTUlUKVxuLy9cbi8vIENvcHlyaWdodCAyMDE3IEFuZHJleSBTaXRuaWsgPGFuZHJleUBzaXRuaWsucnU+XG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZlxuLy8gdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpblxuLy8gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0b1xuLy8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2Zcbi8vIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbyxcbi8vICAgICBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyAgICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4vLyBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vICAgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTU1xuLy8gRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SXG4vLyBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVJcbi8vIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOXG4vLyBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBUaGlzIGFscGhhYmV0IHVzZXMgYEEtWmEtejAtOV8tYCBzeW1ib2xzLlxuLy8gVGhlIG9yZGVyIG9mIGNoYXJhY3RlcnMgaXMgb3B0aW1pemVkIGZvciBiZXR0ZXIgZ3ppcCBhbmQgYnJvdGxpIGNvbXByZXNzaW9uLlxuLy8gUmVmZXJlbmNlcyB0byB0aGUgc2FtZSBmaWxlICh3b3JrcyBib3RoIGZvciBnemlwIGFuZCBicm90bGkpOlxuLy8gYCd1c2VgLCBgYW5kb21gLCBhbmQgYHJpY3QnYFxuLy8gUmVmZXJlbmNlcyB0byB0aGUgYnJvdGxpIGRlZmF1bHQgZGljdGlvbmFyeTpcbi8vIGAtMjZUYCwgYDE5ODNgLCBgNDBweGAsIGA3NXB4YCwgYGJ1c2hgLCBgamFja2AsIGBtaW5kYCwgYHZlcnlgLCBhbmQgYHdvbGZgXG5jb25zdCB1cmxBbHBoYWJldCA9XG4gICAgJ3VzZWFuZG9tLTI2VDE5ODM0MFBYNzVweEpBQ0tWRVJZTUlOREJVU0hXT0xGX0dRWmJmZ2hqa2xxdnd5enJpY3QnXG5cbmV4cG9ydCBmdW5jdGlvbiBuYW5vaWQoc2l6ZTogbnVtYmVyID0gMjEpOiBzdHJpbmcge1xuICAgIGxldCBpZCA9ICcnXG4gICAgLy8gQSBjb21wYWN0IGFsdGVybmF0aXZlIGZvciBgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGVwOyBpKyspYC5cbiAgICBsZXQgaSA9IHNpemUgfCAwXG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgICAvLyBgfCAwYCBpcyBtb3JlIGNvbXBhY3QgYW5kIGZhc3RlciB0aGFuIGBNYXRoLmZsb29yKClgLlxuICAgICAgICBpZCArPSB1cmxBbHBoYWJldFsoTWF0aC5yYW5kb20oKSAqIDY0KSB8IDBdXG4gICAgfVxuICAgIHJldHVybiBpZFxufVxuIiwgIi8qXG4gXyAgICAgX18gICAgIF8gX19cbnwgfCAgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5pbXBvcnQgeyBuYW5vaWQgfSBmcm9tICcuL25hbm9pZC5qcyc7XG5cbmNvbnN0IHJ1bnRpbWVVUkwgPSB3aW5kb3cubG9jYXRpb24ub3JpZ2luICsgXCIvd2FpbHMvcnVudGltZVwiO1xuXG4vLyBPYmplY3QgTmFtZXNcbmV4cG9ydCBjb25zdCBvYmplY3ROYW1lcyA9IE9iamVjdC5mcmVlemUoe1xuICAgIENhbGw6IDAsXG4gICAgQ2xpcGJvYXJkOiAxLFxuICAgIEFwcGxpY2F0aW9uOiAyLFxuICAgIEV2ZW50czogMyxcbiAgICBDb250ZXh0TWVudTogNCxcbiAgICBEaWFsb2c6IDUsXG4gICAgV2luZG93OiA2LFxuICAgIFNjcmVlbnM6IDcsXG4gICAgU3lzdGVtOiA4LFxuICAgIEJyb3dzZXI6IDksXG4gICAgQ2FuY2VsQ2FsbDogMTAsXG59KTtcbmV4cG9ydCBsZXQgY2xpZW50SWQgPSBuYW5vaWQoKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHJ1bnRpbWUgY2FsbGVyIHdpdGggc3BlY2lmaWVkIElELlxuICpcbiAqIEBwYXJhbSBvYmplY3QgLSBUaGUgb2JqZWN0IHRvIGludm9rZSB0aGUgbWV0aG9kIG9uLlxuICogQHBhcmFtIHdpbmRvd05hbWUgLSBUaGUgbmFtZSBvZiB0aGUgd2luZG93LlxuICogQHJldHVybiBUaGUgbmV3IHJ1bnRpbWUgY2FsbGVyIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbmV3UnVudGltZUNhbGxlcihvYmplY3Q6IG51bWJlciwgd2luZG93TmFtZTogc3RyaW5nID0gJycpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG1ldGhvZDogbnVtYmVyLCBhcmdzOiBhbnkgPSBudWxsKSB7XG4gICAgICAgIHJldHVybiBydW50aW1lQ2FsbFdpdGhJRChvYmplY3QsIG1ldGhvZCwgd2luZG93TmFtZSwgYXJncyk7XG4gICAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVudGltZUNhbGxXaXRoSUQob2JqZWN0SUQ6IG51bWJlciwgbWV0aG9kOiBudW1iZXIsIHdpbmRvd05hbWU6IHN0cmluZywgYXJnczogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICBsZXQgdXJsID0gbmV3IFVSTChydW50aW1lVVJMKTtcbiAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChcIm9iamVjdFwiLCBvYmplY3RJRC50b1N0cmluZygpKTtcbiAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChcIm1ldGhvZFwiLCBtZXRob2QudG9TdHJpbmcoKSk7XG4gICAgaWYgKGFyZ3MpIHsgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoXCJhcmdzXCIsIEpTT04uc3RyaW5naWZ5KGFyZ3MpKTsgfVxuXG4gICAgbGV0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgIFtcIngtd2FpbHMtY2xpZW50LWlkXCJdOiBjbGllbnRJZFxuICAgIH1cbiAgICBpZiAod2luZG93TmFtZSkge1xuICAgICAgICBoZWFkZXJzW1wieC13YWlscy13aW5kb3ctbmFtZVwiXSA9IHdpbmRvd05hbWU7XG4gICAgfVxuXG4gICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7IGhlYWRlcnMgfSk7XG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYXdhaXQgcmVzcG9uc2UudGV4dCgpKTtcbiAgICB9XG5cbiAgICBpZiAoKHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiQ29udGVudC1UeXBlXCIpPy5pbmRleE9mKFwiYXBwbGljYXRpb24vanNvblwiKSA/PyAtMSkgIT09IC0xKSB7XG4gICAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKTtcbiAgICB9XG59XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbmltcG9ydCB7bmV3UnVudGltZUNhbGxlciwgb2JqZWN0TmFtZXN9IGZyb20gXCIuL3J1bnRpbWUuanNcIjtcbmltcG9ydCB7IG5hbm9pZCB9IGZyb20gJy4vbmFub2lkLmpzJztcblxuLy8gc2V0dXBcbndpbmRvdy5fd2FpbHMgPSB3aW5kb3cuX3dhaWxzIHx8IHt9O1xud2luZG93Ll93YWlscy5kaWFsb2dFcnJvckNhbGxiYWNrID0gZGlhbG9nRXJyb3JDYWxsYmFjaztcbndpbmRvdy5fd2FpbHMuZGlhbG9nUmVzdWx0Q2FsbGJhY2sgPSBkaWFsb2dSZXN1bHRDYWxsYmFjaztcblxudHlwZSBQcm9taXNlUmVzb2x2ZXJzID0gT21pdDxQcm9taXNlV2l0aFJlc29sdmVyczxhbnk+LCBcInByb21pc2VcIj47XG5cbmNvbnN0IGNhbGwgPSBuZXdSdW50aW1lQ2FsbGVyKG9iamVjdE5hbWVzLkRpYWxvZyk7XG5jb25zdCBkaWFsb2dSZXNwb25zZXMgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZVJlc29sdmVycz4oKTtcblxuLy8gRGVmaW5lIGNvbnN0YW50cyBmcm9tIHRoZSBgbWV0aG9kc2Agb2JqZWN0IGluIFRpdGxlIENhc2VcbmNvbnN0IERpYWxvZ0luZm8gPSAwO1xuY29uc3QgRGlhbG9nV2FybmluZyA9IDE7XG5jb25zdCBEaWFsb2dFcnJvciA9IDI7XG5jb25zdCBEaWFsb2dRdWVzdGlvbiA9IDM7XG5jb25zdCBEaWFsb2dPcGVuRmlsZSA9IDQ7XG5jb25zdCBEaWFsb2dTYXZlRmlsZSA9IDU7XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3BlbkZpbGVEaWFsb2dPcHRpb25zIHtcbiAgICAvKiogSW5kaWNhdGVzIGlmIGRpcmVjdG9yaWVzIGNhbiBiZSBjaG9zZW4uICovXG4gICAgQ2FuQ2hvb3NlRGlyZWN0b3JpZXM/OiBib29sZWFuO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgZmlsZXMgY2FuIGJlIGNob3Nlbi4gKi9cbiAgICBDYW5DaG9vc2VGaWxlcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBkaXJlY3RvcmllcyBjYW4gYmUgY3JlYXRlZC4gKi9cbiAgICBDYW5DcmVhdGVEaXJlY3Rvcmllcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBoaWRkZW4gZmlsZXMgc2hvdWxkIGJlIHNob3duLiAqL1xuICAgIFNob3dIaWRkZW5GaWxlcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBhbGlhc2VzIHNob3VsZCBiZSByZXNvbHZlZC4gKi9cbiAgICBSZXNvbHZlc0FsaWFzZXM/OiBib29sZWFuO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgbXVsdGlwbGUgc2VsZWN0aW9uIGlzIGFsbG93ZWQuICovXG4gICAgQWxsb3dzTXVsdGlwbGVTZWxlY3Rpb24/OiBib29sZWFuO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgdGhlIGV4dGVuc2lvbiBzaG91bGQgYmUgaGlkZGVuLiAqL1xuICAgIEhpZGVFeHRlbnNpb24/OiBib29sZWFuO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgaGlkZGVuIGV4dGVuc2lvbnMgY2FuIGJlIHNlbGVjdGVkLiAqL1xuICAgIENhblNlbGVjdEhpZGRlbkV4dGVuc2lvbj86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBmaWxlIHBhY2thZ2VzIHNob3VsZCBiZSB0cmVhdGVkIGFzIGRpcmVjdG9yaWVzLiAqL1xuICAgIFRyZWF0c0ZpbGVQYWNrYWdlc0FzRGlyZWN0b3JpZXM/OiBib29sZWFuO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgb3RoZXIgZmlsZSB0eXBlcyBhcmUgYWxsb3dlZC4gKi9cbiAgICBBbGxvd3NPdGhlckZpbGV0eXBlcz86IGJvb2xlYW47XG4gICAgLyoqIEFycmF5IG9mIGZpbGUgZmlsdGVycy4gKi9cbiAgICBGaWx0ZXJzPzogRmlsZUZpbHRlcltdO1xuICAgIC8qKiBUaXRsZSBvZiB0aGUgZGlhbG9nLiAqL1xuICAgIFRpdGxlPzogc3RyaW5nO1xuICAgIC8qKiBNZXNzYWdlIHRvIHNob3cgaW4gdGhlIGRpYWxvZy4gKi9cbiAgICBNZXNzYWdlPzogc3RyaW5nO1xuICAgIC8qKiBUZXh0IHRvIGRpc3BsYXkgb24gdGhlIGJ1dHRvbi4gKi9cbiAgICBCdXR0b25UZXh0Pzogc3RyaW5nO1xuICAgIC8qKiBEaXJlY3RvcnkgdG8gb3BlbiBpbiB0aGUgZGlhbG9nLiAqL1xuICAgIERpcmVjdG9yeT86IHN0cmluZztcbiAgICAvKiogSW5kaWNhdGVzIGlmIHRoZSBkaWFsb2cgc2hvdWxkIGFwcGVhciBkZXRhY2hlZCBmcm9tIHRoZSBtYWluIHdpbmRvdy4gKi9cbiAgICBEZXRhY2hlZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2F2ZUZpbGVEaWFsb2dPcHRpb25zIHtcbiAgICAvKiogRGVmYXVsdCBmaWxlbmFtZSB0byB1c2UgaW4gdGhlIGRpYWxvZy4gKi9cbiAgICBGaWxlbmFtZT86IHN0cmluZztcbiAgICAvKiogSW5kaWNhdGVzIGlmIGRpcmVjdG9yaWVzIGNhbiBiZSBjaG9zZW4uICovXG4gICAgQ2FuQ2hvb3NlRGlyZWN0b3JpZXM/OiBib29sZWFuO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgZmlsZXMgY2FuIGJlIGNob3Nlbi4gKi9cbiAgICBDYW5DaG9vc2VGaWxlcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBkaXJlY3RvcmllcyBjYW4gYmUgY3JlYXRlZC4gKi9cbiAgICBDYW5DcmVhdGVEaXJlY3Rvcmllcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBoaWRkZW4gZmlsZXMgc2hvdWxkIGJlIHNob3duLiAqL1xuICAgIFNob3dIaWRkZW5GaWxlcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBhbGlhc2VzIHNob3VsZCBiZSByZXNvbHZlZC4gKi9cbiAgICBSZXNvbHZlc0FsaWFzZXM/OiBib29sZWFuO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgdGhlIGV4dGVuc2lvbiBzaG91bGQgYmUgaGlkZGVuLiAqL1xuICAgIEhpZGVFeHRlbnNpb24/OiBib29sZWFuO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgaGlkZGVuIGV4dGVuc2lvbnMgY2FuIGJlIHNlbGVjdGVkLiAqL1xuICAgIENhblNlbGVjdEhpZGRlbkV4dGVuc2lvbj86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBmaWxlIHBhY2thZ2VzIHNob3VsZCBiZSB0cmVhdGVkIGFzIGRpcmVjdG9yaWVzLiAqL1xuICAgIFRyZWF0c0ZpbGVQYWNrYWdlc0FzRGlyZWN0b3JpZXM/OiBib29sZWFuO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgb3RoZXIgZmlsZSB0eXBlcyBhcmUgYWxsb3dlZC4gKi9cbiAgICBBbGxvd3NPdGhlckZpbGV0eXBlcz86IGJvb2xlYW47XG4gICAgLyoqIEFycmF5IG9mIGZpbGUgZmlsdGVycy4gKi9cbiAgICBGaWx0ZXJzPzogRmlsZUZpbHRlcltdO1xuICAgIC8qKiBUaXRsZSBvZiB0aGUgZGlhbG9nLiAqL1xuICAgIFRpdGxlPzogc3RyaW5nO1xuICAgIC8qKiBNZXNzYWdlIHRvIHNob3cgaW4gdGhlIGRpYWxvZy4gKi9cbiAgICBNZXNzYWdlPzogc3RyaW5nO1xuICAgIC8qKiBUZXh0IHRvIGRpc3BsYXkgb24gdGhlIGJ1dHRvbi4gKi9cbiAgICBCdXR0b25UZXh0Pzogc3RyaW5nO1xuICAgIC8qKiBEaXJlY3RvcnkgdG8gb3BlbiBpbiB0aGUgZGlhbG9nLiAqL1xuICAgIERpcmVjdG9yeT86IHN0cmluZztcbiAgICAvKiogSW5kaWNhdGVzIGlmIHRoZSBkaWFsb2cgc2hvdWxkIGFwcGVhciBkZXRhY2hlZCBmcm9tIHRoZSBtYWluIHdpbmRvdy4gKi9cbiAgICBEZXRhY2hlZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWVzc2FnZURpYWxvZ09wdGlvbnMge1xuICAgIC8qKiBUaGUgdGl0bGUgb2YgdGhlIGRpYWxvZyB3aW5kb3cuICovXG4gICAgVGl0bGU/OiBzdHJpbmc7XG4gICAgLyoqIFRoZSBtYWluIG1lc3NhZ2UgdG8gc2hvdyBpbiB0aGUgZGlhbG9nLiAqL1xuICAgIE1lc3NhZ2U/OiBzdHJpbmc7XG4gICAgLyoqIEFycmF5IG9mIGJ1dHRvbiBvcHRpb25zIHRvIHNob3cgaW4gdGhlIGRpYWxvZy4gKi9cbiAgICBCdXR0b25zPzogQnV0dG9uW107XG4gICAgLyoqIFRydWUgaWYgdGhlIGRpYWxvZyBzaG91bGQgYXBwZWFyIGRldGFjaGVkIGZyb20gdGhlIG1haW4gd2luZG93IChpZiBhcHBsaWNhYmxlKS4gKi9cbiAgICBEZXRhY2hlZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnV0dG9uIHtcbiAgICAvKiogVGV4dCB0aGF0IGFwcGVhcnMgd2l0aGluIHRoZSBidXR0b24uICovXG4gICAgTGFiZWw/OiBzdHJpbmc7XG4gICAgLyoqIFRydWUgaWYgdGhlIGJ1dHRvbiBzaG91bGQgY2FuY2VsIGFuIG9wZXJhdGlvbiB3aGVuIGNsaWNrZWQuICovXG4gICAgSXNDYW5jZWw/OiBib29sZWFuO1xuICAgIC8qKiBUcnVlIGlmIHRoZSBidXR0b24gc2hvdWxkIGJlIHRoZSBkZWZhdWx0IGFjdGlvbiB3aGVuIHRoZSB1c2VyIHByZXNzZXMgZW50ZXIuICovXG4gICAgSXNEZWZhdWx0PzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWxlRmlsdGVyIHtcbiAgICAvKiogRGlzcGxheSBuYW1lIGZvciB0aGUgZmlsdGVyLCBpdCBjb3VsZCBiZSBcIlRleHQgRmlsZXNcIiwgXCJJbWFnZXNcIiBldGMuICovXG4gICAgRGlzcGxheU5hbWU/OiBzdHJpbmc7XG4gICAgLyoqIFBhdHRlcm4gdG8gbWF0Y2ggZm9yIHRoZSBmaWx0ZXIsIGUuZy4gXCIqLnR4dDsqLm1kXCIgZm9yIHRleHQgbWFya2Rvd24gZmlsZXMuICovXG4gICAgUGF0dGVybj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBIYW5kbGVzIHRoZSByZXN1bHQgb2YgYSBkaWFsb2cgcmVxdWVzdC5cbiAqXG4gKiBAcGFyYW0gaWQgLSBUaGUgaWQgb2YgdGhlIHJlcXVlc3QgdG8gaGFuZGxlIHRoZSByZXN1bHQgZm9yLlxuICogQHBhcmFtIGRhdGEgLSBUaGUgcmVzdWx0IGRhdGEgb2YgdGhlIHJlcXVlc3QuXG4gKiBAcGFyYW0gaXNKU09OIC0gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRhdGEgaXMgSlNPTiBvciBub3QuXG4gKi9cbmZ1bmN0aW9uIGRpYWxvZ1Jlc3VsdENhbGxiYWNrKGlkOiBzdHJpbmcsIGRhdGE6IHN0cmluZywgaXNKU09OOiBib29sZWFuKTogdm9pZCB7XG4gICAgbGV0IHJlc29sdmVycyA9IGdldEFuZERlbGV0ZVJlc3BvbnNlKGlkKTtcbiAgICBpZiAoIXJlc29sdmVycykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGlzSlNPTikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzb2x2ZXJzLnJlc29sdmUoSlNPTi5wYXJzZShkYXRhKSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgICAgICByZXNvbHZlcnMucmVqZWN0KG5ldyBUeXBlRXJyb3IoXCJjb3VsZCBub3QgcGFyc2UgcmVzdWx0OiBcIiArIGVyci5tZXNzYWdlLCB7IGNhdXNlOiBlcnIgfSkpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZXJzLnJlc29sdmUoZGF0YSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEhhbmRsZXMgdGhlIGVycm9yIGZyb20gYSBkaWFsb2cgcmVxdWVzdC5cbiAqXG4gKiBAcGFyYW0gaWQgLSBUaGUgaWQgb2YgdGhlIHByb21pc2UgaGFuZGxlci5cbiAqIEBwYXJhbSBtZXNzYWdlIC0gQW4gZXJyb3IgbWVzc2FnZS5cbiAqL1xuZnVuY3Rpb24gZGlhbG9nRXJyb3JDYWxsYmFjayhpZDogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBnZXRBbmREZWxldGVSZXNwb25zZShpZCk/LnJlamVjdChuZXcgd2luZG93LkVycm9yKG1lc3NhZ2UpKTtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgYW5kIHJlbW92ZXMgdGhlIHJlc3BvbnNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gSUQgZnJvbSB0aGUgZGlhbG9nUmVzcG9uc2VzIG1hcC5cbiAqXG4gKiBAcGFyYW0gaWQgLSBUaGUgSUQgb2YgdGhlIHJlc3BvbnNlIHRvIGJlIHJldHJpZXZlZCBhbmQgcmVtb3ZlZC5cbiAqIEByZXR1cm5zIFRoZSByZXNwb25zZSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBJRCwgaWYgYW55LlxuICovXG5mdW5jdGlvbiBnZXRBbmREZWxldGVSZXNwb25zZShpZDogc3RyaW5nKTogUHJvbWlzZVJlc29sdmVycyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBkaWFsb2dSZXNwb25zZXMuZ2V0KGlkKTtcbiAgICBkaWFsb2dSZXNwb25zZXMuZGVsZXRlKGlkKTtcbiAgICByZXR1cm4gcmVzcG9uc2U7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgdW5pcXVlIElEIHVzaW5nIHRoZSBuYW5vaWQgbGlicmFyeS5cbiAqXG4gKiBAcmV0dXJucyBBIHVuaXF1ZSBJRCB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBkaWFsb2dSZXNwb25zZXMgc2V0LlxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZUlEKCk6IHN0cmluZyB7XG4gICAgbGV0IHJlc3VsdDtcbiAgICBkbyB7XG4gICAgICAgIHJlc3VsdCA9IG5hbm9pZCgpO1xuICAgIH0gd2hpbGUgKGRpYWxvZ1Jlc3BvbnNlcy5oYXMocmVzdWx0KSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBQcmVzZW50cyBhIGRpYWxvZyBvZiBzcGVjaWZpZWQgdHlwZSB3aXRoIHRoZSBnaXZlbiBvcHRpb25zLlxuICpcbiAqIEBwYXJhbSB0eXBlIC0gRGlhbG9nIHR5cGUuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIHRoZSBkaWFsb2cuXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHJlc3VsdCBvZiBkaWFsb2cuXG4gKi9cbmZ1bmN0aW9uIGRpYWxvZyh0eXBlOiBudW1iZXIsIG9wdGlvbnM6IE1lc3NhZ2VEaWFsb2dPcHRpb25zIHwgT3BlbkZpbGVEaWFsb2dPcHRpb25zIHwgU2F2ZUZpbGVEaWFsb2dPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IGlkID0gZ2VuZXJhdGVJRCgpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGRpYWxvZ1Jlc3BvbnNlcy5zZXQoaWQsIHsgcmVzb2x2ZSwgcmVqZWN0IH0pO1xuICAgICAgICBjYWxsKHR5cGUsIE9iamVjdC5hc3NpZ24oeyBcImRpYWxvZy1pZFwiOiBpZCB9LCBvcHRpb25zKSkuY2F0Y2goKGVycjogYW55KSA9PiB7XG4gICAgICAgICAgICBkaWFsb2dSZXNwb25zZXMuZGVsZXRlKGlkKTtcbiAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBQcmVzZW50cyBhbiBpbmZvIGRpYWxvZy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIERpYWxvZyBvcHRpb25zXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBsYWJlbCBvZiB0aGUgY2hvc2VuIGJ1dHRvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEluZm8ob3B0aW9uczogTWVzc2FnZURpYWxvZ09wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4geyByZXR1cm4gZGlhbG9nKERpYWxvZ0luZm8sIG9wdGlvbnMpOyB9XG5cbi8qKlxuICogUHJlc2VudHMgYSB3YXJuaW5nIGRpYWxvZy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIERpYWxvZyBvcHRpb25zLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgbGFiZWwgb2YgdGhlIGNob3NlbiBidXR0b24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBXYXJuaW5nKG9wdGlvbnM6IE1lc3NhZ2VEaWFsb2dPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHsgcmV0dXJuIGRpYWxvZyhEaWFsb2dXYXJuaW5nLCBvcHRpb25zKTsgfVxuXG4vKipcbiAqIFByZXNlbnRzIGFuIGVycm9yIGRpYWxvZy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIERpYWxvZyBvcHRpb25zLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgbGFiZWwgb2YgdGhlIGNob3NlbiBidXR0b24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFcnJvcihvcHRpb25zOiBNZXNzYWdlRGlhbG9nT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7IHJldHVybiBkaWFsb2coRGlhbG9nRXJyb3IsIG9wdGlvbnMpOyB9XG5cbi8qKlxuICogUHJlc2VudHMgYSBxdWVzdGlvbiBkaWFsb2cuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBEaWFsb2cgb3B0aW9ucy5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGxhYmVsIG9mIHRoZSBjaG9zZW4gYnV0dG9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gUXVlc3Rpb24ob3B0aW9uczogTWVzc2FnZURpYWxvZ09wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4geyByZXR1cm4gZGlhbG9nKERpYWxvZ1F1ZXN0aW9uLCBvcHRpb25zKTsgfVxuXG4vKipcbiAqIFByZXNlbnRzIGEgZmlsZSBzZWxlY3Rpb24gZGlhbG9nIHRvIHBpY2sgb25lIG9yIG1vcmUgZmlsZXMgdG8gb3Blbi5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIERpYWxvZyBvcHRpb25zLlxuICogQHJldHVybnMgU2VsZWN0ZWQgZmlsZSBvciBsaXN0IG9mIGZpbGVzLCBvciBhIGJsYW5rIHN0cmluZy9lbXB0eSBsaXN0IGlmIG5vIGZpbGUgaGFzIGJlZW4gc2VsZWN0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBPcGVuRmlsZShvcHRpb25zOiBPcGVuRmlsZURpYWxvZ09wdGlvbnMgJiB7IEFsbG93c011bHRpcGxlU2VsZWN0aW9uOiB0cnVlIH0pOiBQcm9taXNlPHN0cmluZ1tdPjtcbmV4cG9ydCBmdW5jdGlvbiBPcGVuRmlsZShvcHRpb25zOiBPcGVuRmlsZURpYWxvZ09wdGlvbnMgJiB7IEFsbG93c011bHRpcGxlU2VsZWN0aW9uPzogZmFsc2UgfCB1bmRlZmluZWQgfSk6IFByb21pc2U8c3RyaW5nPjtcbmV4cG9ydCBmdW5jdGlvbiBPcGVuRmlsZShvcHRpb25zOiBPcGVuRmlsZURpYWxvZ09wdGlvbnMpOiBQcm9taXNlPHN0cmluZyB8IHN0cmluZ1tdPjtcbmV4cG9ydCBmdW5jdGlvbiBPcGVuRmlsZShvcHRpb25zOiBPcGVuRmlsZURpYWxvZ09wdGlvbnMpOiBQcm9taXNlPHN0cmluZyB8IHN0cmluZ1tdPiB7IHJldHVybiBkaWFsb2coRGlhbG9nT3BlbkZpbGUsIG9wdGlvbnMpID8/IFtdOyB9XG5cbi8qKlxuICogUHJlc2VudHMgYSBmaWxlIHNlbGVjdGlvbiBkaWFsb2cgdG8gcGljayBhIGZpbGUgdG8gc2F2ZS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIERpYWxvZyBvcHRpb25zLlxuICogQHJldHVybnMgU2VsZWN0ZWQgZmlsZSwgb3IgYSBibGFuayBzdHJpbmcgaWYgbm8gZmlsZSBoYXMgYmVlbiBzZWxlY3RlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFNhdmVGaWxlKG9wdGlvbnM6IFNhdmVGaWxlRGlhbG9nT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7IHJldHVybiBkaWFsb2coRGlhbG9nU2F2ZUZpbGUsIG9wdGlvbnMpOyB9XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbmltcG9ydCB7IG5ld1J1bnRpbWVDYWxsZXIsIG9iamVjdE5hbWVzIH0gZnJvbSBcIi4vcnVudGltZS5qc1wiO1xuaW1wb3J0IHsgZXZlbnRMaXN0ZW5lcnMsIExpc3RlbmVyLCBsaXN0ZW5lck9mZiB9IGZyb20gXCIuL2xpc3RlbmVyLmpzXCI7XG5cbi8vIFNldHVwXG53aW5kb3cuX3dhaWxzID0gd2luZG93Ll93YWlscyB8fCB7fTtcbndpbmRvdy5fd2FpbHMuZGlzcGF0Y2hXYWlsc0V2ZW50ID0gZGlzcGF0Y2hXYWlsc0V2ZW50O1xuXG5jb25zdCBjYWxsID0gbmV3UnVudGltZUNhbGxlcihvYmplY3ROYW1lcy5FdmVudHMpO1xuY29uc3QgRW1pdE1ldGhvZCA9IDA7XG5cbmV4cG9ydCB7IFR5cGVzIH0gZnJvbSBcIi4vZXZlbnRfdHlwZXMuanNcIjtcblxuLyoqXG4gKiBUaGUgdHlwZSBvZiBoYW5kbGVycyBmb3IgYSBnaXZlbiBldmVudC5cbiAqL1xuZXhwb3J0IHR5cGUgQ2FsbGJhY2sgPSAoZXY6IFdhaWxzRXZlbnQpID0+IHZvaWQ7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHN5c3RlbSBldmVudCBvciBhIGN1c3RvbSBldmVudCBlbWl0dGVkIHRocm91Z2ggd2FpbHMtcHJvdmlkZWQgZmFjaWxpdGllcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFdhaWxzRXZlbnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBPcHRpb25hbCBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW1pdHRlZCBldmVudC5cbiAgICAgKi9cbiAgICBkYXRhOiBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBOYW1lIG9mIHRoZSBvcmlnaW5hdGluZyB3aW5kb3cuIE9taXR0ZWQgZm9yIGFwcGxpY2F0aW9uIGV2ZW50cy5cbiAgICAgKiBXaWxsIGJlIG92ZXJyaWRkZW4gaWYgc2V0IG1hbnVhbGx5LlxuICAgICAqL1xuICAgIHNlbmRlcj86IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgZGF0YTogYW55ID0gbnVsbCkge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hXYWlsc0V2ZW50KGV2ZW50OiBhbnkpIHtcbiAgICBsZXQgbGlzdGVuZXJzID0gZXZlbnRMaXN0ZW5lcnMuZ2V0KGV2ZW50Lm5hbWUpO1xuICAgIGlmICghbGlzdGVuZXJzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgd2FpbHNFdmVudCA9IG5ldyBXYWlsc0V2ZW50KGV2ZW50Lm5hbWUsIGV2ZW50LmRhdGEpO1xuICAgIGlmICgnc2VuZGVyJyBpbiBldmVudCkge1xuICAgICAgICB3YWlsc0V2ZW50LnNlbmRlciA9IGV2ZW50LnNlbmRlcjtcbiAgICB9XG5cbiAgICBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuZmlsdGVyKGxpc3RlbmVyID0+ICFsaXN0ZW5lci5kaXNwYXRjaCh3YWlsc0V2ZW50KSk7XG4gICAgaWYgKGxpc3RlbmVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZXZlbnRMaXN0ZW5lcnMuZGVsZXRlKGV2ZW50Lm5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGV2ZW50TGlzdGVuZXJzLnNldChldmVudC5uYW1lLCBsaXN0ZW5lcnMpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZWdpc3RlciBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBmb3IgYSBzcGVjaWZpYyBldmVudC5cbiAqXG4gKiBAcGFyYW0gZXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIHJlZ2lzdGVyIHRoZSBjYWxsYmFjayBmb3IuXG4gKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC5cbiAqIEBwYXJhbSBtYXhDYWxsYmFja3MgLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGltZXMgdGhlIGNhbGxiYWNrIGNhbiBiZSBjYWxsZWQgZm9yIHRoZSBldmVudC4gT25jZSB0aGUgbWF4aW11bSBudW1iZXIgaXMgcmVhY2hlZCwgdGhlIGNhbGxiYWNrIHdpbGwgbm8gbG9uZ2VyIGJlIGNhbGxlZC5cbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCwgd2hlbiBjYWxsZWQsIHdpbGwgdW5yZWdpc3RlciB0aGUgY2FsbGJhY2sgZnJvbSB0aGUgZXZlbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBPbk11bHRpcGxlKGV2ZW50TmFtZTogc3RyaW5nLCBjYWxsYmFjazogQ2FsbGJhY2ssIG1heENhbGxiYWNrczogbnVtYmVyKSB7XG4gICAgbGV0IGxpc3RlbmVycyA9IGV2ZW50TGlzdGVuZXJzLmdldChldmVudE5hbWUpIHx8IFtdO1xuICAgIGNvbnN0IHRoaXNMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcihldmVudE5hbWUsIGNhbGxiYWNrLCBtYXhDYWxsYmFja3MpO1xuICAgIGxpc3RlbmVycy5wdXNoKHRoaXNMaXN0ZW5lcik7XG4gICAgZXZlbnRMaXN0ZW5lcnMuc2V0KGV2ZW50TmFtZSwgbGlzdGVuZXJzKTtcbiAgICByZXR1cm4gKCkgPT4gbGlzdGVuZXJPZmYodGhpc0xpc3RlbmVyKTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCB3aGVuIHRoZSBzcGVjaWZpZWQgZXZlbnQgb2NjdXJzLlxuICpcbiAqIEBwYXJhbSBldmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gcmVnaXN0ZXIgdGhlIGNhbGxiYWNrIGZvci5cbiAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0LCB3aGVuIGNhbGxlZCwgd2lsbCB1bnJlZ2lzdGVyIHRoZSBjYWxsYmFjayBmcm9tIHRoZSBldmVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE9uKGV2ZW50TmFtZTogc3RyaW5nLCBjYWxsYmFjazogQ2FsbGJhY2spOiAoKSA9PiB2b2lkIHtcbiAgICByZXR1cm4gT25NdWx0aXBsZShldmVudE5hbWUsIGNhbGxiYWNrLCAtMSk7XG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgb25seSBvbmNlIGZvciB0aGUgc3BlY2lmaWVkIGV2ZW50LlxuICpcbiAqIEBwYXJhbSBldmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gcmVnaXN0ZXIgdGhlIGNhbGxiYWNrIGZvci5cbiAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0LCB3aGVuIGNhbGxlZCwgd2lsbCB1bnJlZ2lzdGVyIHRoZSBjYWxsYmFjayBmcm9tIHRoZSBldmVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE9uY2UoZXZlbnROYW1lOiBzdHJpbmcsIGNhbGxiYWNrOiBDYWxsYmFjayk6ICgpID0+IHZvaWQge1xuICAgIHJldHVybiBPbk11bHRpcGxlKGV2ZW50TmFtZSwgY2FsbGJhY2ssIDEpO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgZXZlbnQgbGlzdGVuZXJzIGZvciB0aGUgc3BlY2lmaWVkIGV2ZW50IG5hbWVzLlxuICpcbiAqIEBwYXJhbSBldmVudE5hbWVzIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50cyB0byByZW1vdmUgbGlzdGVuZXJzIGZvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE9mZiguLi5ldmVudE5hbWVzOiBbc3RyaW5nLCAuLi5zdHJpbmdbXV0pOiB2b2lkIHtcbiAgICBldmVudE5hbWVzLmZvckVhY2goZXZlbnROYW1lID0+IGV2ZW50TGlzdGVuZXJzLmRlbGV0ZShldmVudE5hbWUpKTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIGFsbCBldmVudCBsaXN0ZW5lcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBPZmZBbGwoKTogdm9pZCB7XG4gICAgZXZlbnRMaXN0ZW5lcnMuY2xlYXIoKTtcbn1cblxuLyoqXG4gKiBFbWl0cyB0aGUgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIGV2ZW50IC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIGVtaXQuXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCB3aWxsIGJlIGZ1bGZpbGxlZCBvbmNlIHRoZSBldmVudCBoYXMgYmVlbiBlbWl0dGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gRW1pdChldmVudDogV2FpbHNFdmVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBjYWxsKEVtaXRNZXRob2QsIGV2ZW50KTtcbn1cbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuLy8gVGhlIGZvbGxvd2luZyB1dGlsaXRpZXMgaGF2ZSBiZWVuIGZhY3RvcmVkIG91dCBvZiAuL2V2ZW50cy50c1xuLy8gZm9yIHRlc3RpbmcgcHVycG9zZXMuXG5cbmV4cG9ydCBjb25zdCBldmVudExpc3RlbmVycyA9IG5ldyBNYXA8c3RyaW5nLCBMaXN0ZW5lcltdPigpO1xuXG5leHBvcnQgY2xhc3MgTGlzdGVuZXIge1xuICAgIGV2ZW50TmFtZTogc3RyaW5nO1xuICAgIGNhbGxiYWNrOiAoZGF0YTogYW55KSA9PiB2b2lkO1xuICAgIG1heENhbGxiYWNrczogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IoZXZlbnROYW1lOiBzdHJpbmcsIGNhbGxiYWNrOiAoZGF0YTogYW55KSA9PiB2b2lkLCBtYXhDYWxsYmFja3M6IG51bWJlcikge1xuICAgICAgICB0aGlzLmV2ZW50TmFtZSA9IGV2ZW50TmFtZTtcbiAgICAgICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgICB0aGlzLm1heENhbGxiYWNrcyA9IG1heENhbGxiYWNrcyB8fCAtMTtcbiAgICB9XG5cbiAgICBkaXNwYXRjaChkYXRhOiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuY2FsbGJhY2soZGF0YSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubWF4Q2FsbGJhY2tzID09PSAtMSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLm1heENhbGxiYWNrcyAtPSAxO1xuICAgICAgICByZXR1cm4gdGhpcy5tYXhDYWxsYmFja3MgPT09IDA7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbGlzdGVuZXJPZmYobGlzdGVuZXI6IExpc3RlbmVyKTogdm9pZCB7XG4gICAgbGV0IGxpc3RlbmVycyA9IGV2ZW50TGlzdGVuZXJzLmdldChsaXN0ZW5lci5ldmVudE5hbWUpO1xuICAgIGlmICghbGlzdGVuZXJzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuZmlsdGVyKGwgPT4gbCAhPT0gbGlzdGVuZXIpO1xuICAgIGlmIChsaXN0ZW5lcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGV2ZW50TGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lci5ldmVudE5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGV2ZW50TGlzdGVuZXJzLnNldChsaXN0ZW5lci5ldmVudE5hbWUsIGxpc3RlbmVycyk7XG4gICAgfVxufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vLyBDeW5oeXJjaHd5ZCB5IGZmZWlsIGhvbiB5biBhd3RvbWF0aWcuIFBFSURJV0NIIFx1MDBDMiBNT0RJV0xcbi8vIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZC4gRE8gTk9UIEVESVRcblxuZXhwb3J0IGNvbnN0IFR5cGVzID0gT2JqZWN0LmZyZWV6ZSh7XG5cdFdpbmRvd3M6IE9iamVjdC5mcmVlemUoe1xuXHRcdEFQTVBvd2VyU2V0dGluZ0NoYW5nZTogXCJ3aW5kb3dzOkFQTVBvd2VyU2V0dGluZ0NoYW5nZVwiLFxuXHRcdEFQTVBvd2VyU3RhdHVzQ2hhbmdlOiBcIndpbmRvd3M6QVBNUG93ZXJTdGF0dXNDaGFuZ2VcIixcblx0XHRBUE1SZXN1bWVBdXRvbWF0aWM6IFwid2luZG93czpBUE1SZXN1bWVBdXRvbWF0aWNcIixcblx0XHRBUE1SZXN1bWVTdXNwZW5kOiBcIndpbmRvd3M6QVBNUmVzdW1lU3VzcGVuZFwiLFxuXHRcdEFQTVN1c3BlbmQ6IFwid2luZG93czpBUE1TdXNwZW5kXCIsXG5cdFx0QXBwbGljYXRpb25TdGFydGVkOiBcIndpbmRvd3M6QXBwbGljYXRpb25TdGFydGVkXCIsXG5cdFx0U3lzdGVtVGhlbWVDaGFuZ2VkOiBcIndpbmRvd3M6U3lzdGVtVGhlbWVDaGFuZ2VkXCIsXG5cdFx0V2ViVmlld05hdmlnYXRpb25Db21wbGV0ZWQ6IFwid2luZG93czpXZWJWaWV3TmF2aWdhdGlvbkNvbXBsZXRlZFwiLFxuXHRcdFdpbmRvd0FjdGl2ZTogXCJ3aW5kb3dzOldpbmRvd0FjdGl2ZVwiLFxuXHRcdFdpbmRvd0JhY2tncm91bmRFcmFzZTogXCJ3aW5kb3dzOldpbmRvd0JhY2tncm91bmRFcmFzZVwiLFxuXHRcdFdpbmRvd0NsaWNrQWN0aXZlOiBcIndpbmRvd3M6V2luZG93Q2xpY2tBY3RpdmVcIixcblx0XHRXaW5kb3dDbG9zaW5nOiBcIndpbmRvd3M6V2luZG93Q2xvc2luZ1wiLFxuXHRcdFdpbmRvd0RpZE1vdmU6IFwid2luZG93czpXaW5kb3dEaWRNb3ZlXCIsXG5cdFx0V2luZG93RGlkUmVzaXplOiBcIndpbmRvd3M6V2luZG93RGlkUmVzaXplXCIsXG5cdFx0V2luZG93RFBJQ2hhbmdlZDogXCJ3aW5kb3dzOldpbmRvd0RQSUNoYW5nZWRcIixcblx0XHRXaW5kb3dEcmFnRHJvcDogXCJ3aW5kb3dzOldpbmRvd0RyYWdEcm9wXCIsXG5cdFx0V2luZG93RHJhZ0VudGVyOiBcIndpbmRvd3M6V2luZG93RHJhZ0VudGVyXCIsXG5cdFx0V2luZG93RHJhZ0xlYXZlOiBcIndpbmRvd3M6V2luZG93RHJhZ0xlYXZlXCIsXG5cdFx0V2luZG93RHJhZ092ZXI6IFwid2luZG93czpXaW5kb3dEcmFnT3ZlclwiLFxuXHRcdFdpbmRvd0VuZE1vdmU6IFwid2luZG93czpXaW5kb3dFbmRNb3ZlXCIsXG5cdFx0V2luZG93RW5kUmVzaXplOiBcIndpbmRvd3M6V2luZG93RW5kUmVzaXplXCIsXG5cdFx0V2luZG93RnVsbHNjcmVlbjogXCJ3aW5kb3dzOldpbmRvd0Z1bGxzY3JlZW5cIixcblx0XHRXaW5kb3dIaWRlOiBcIndpbmRvd3M6V2luZG93SGlkZVwiLFxuXHRcdFdpbmRvd0luYWN0aXZlOiBcIndpbmRvd3M6V2luZG93SW5hY3RpdmVcIixcblx0XHRXaW5kb3dLZXlEb3duOiBcIndpbmRvd3M6V2luZG93S2V5RG93blwiLFxuXHRcdFdpbmRvd0tleVVwOiBcIndpbmRvd3M6V2luZG93S2V5VXBcIixcblx0XHRXaW5kb3dLaWxsRm9jdXM6IFwid2luZG93czpXaW5kb3dLaWxsRm9jdXNcIixcblx0XHRXaW5kb3dOb25DbGllbnRIaXQ6IFwid2luZG93czpXaW5kb3dOb25DbGllbnRIaXRcIixcblx0XHRXaW5kb3dOb25DbGllbnRNb3VzZURvd246IFwid2luZG93czpXaW5kb3dOb25DbGllbnRNb3VzZURvd25cIixcblx0XHRXaW5kb3dOb25DbGllbnRNb3VzZUxlYXZlOiBcIndpbmRvd3M6V2luZG93Tm9uQ2xpZW50TW91c2VMZWF2ZVwiLFxuXHRcdFdpbmRvd05vbkNsaWVudE1vdXNlTW92ZTogXCJ3aW5kb3dzOldpbmRvd05vbkNsaWVudE1vdXNlTW92ZVwiLFxuXHRcdFdpbmRvd05vbkNsaWVudE1vdXNlVXA6IFwid2luZG93czpXaW5kb3dOb25DbGllbnRNb3VzZVVwXCIsXG5cdFx0V2luZG93UGFpbnQ6IFwid2luZG93czpXaW5kb3dQYWludFwiLFxuXHRcdFdpbmRvd1Jlc3RvcmU6IFwid2luZG93czpXaW5kb3dSZXN0b3JlXCIsXG5cdFx0V2luZG93U2V0Rm9jdXM6IFwid2luZG93czpXaW5kb3dTZXRGb2N1c1wiLFxuXHRcdFdpbmRvd1Nob3c6IFwid2luZG93czpXaW5kb3dTaG93XCIsXG5cdFx0V2luZG93U3RhcnRNb3ZlOiBcIndpbmRvd3M6V2luZG93U3RhcnRNb3ZlXCIsXG5cdFx0V2luZG93U3RhcnRSZXNpemU6IFwid2luZG93czpXaW5kb3dTdGFydFJlc2l6ZVwiLFxuXHRcdFdpbmRvd1VuRnVsbHNjcmVlbjogXCJ3aW5kb3dzOldpbmRvd1VuRnVsbHNjcmVlblwiLFxuXHRcdFdpbmRvd1pPcmRlckNoYW5nZWQ6IFwid2luZG93czpXaW5kb3daT3JkZXJDaGFuZ2VkXCIsXG5cdFx0V2luZG93TWluaW1pc2U6IFwid2luZG93czpXaW5kb3dNaW5pbWlzZVwiLFxuXHRcdFdpbmRvd1VuTWluaW1pc2U6IFwid2luZG93czpXaW5kb3dVbk1pbmltaXNlXCIsXG5cdFx0V2luZG93TWF4aW1pc2U6IFwid2luZG93czpXaW5kb3dNYXhpbWlzZVwiLFxuXHRcdFdpbmRvd1VuTWF4aW1pc2U6IFwid2luZG93czpXaW5kb3dVbk1heGltaXNlXCIsXG5cdH0pLFxuXHRNYWM6IE9iamVjdC5mcmVlemUoe1xuXHRcdEFwcGxpY2F0aW9uRGlkQmVjb21lQWN0aXZlOiBcIm1hYzpBcHBsaWNhdGlvbkRpZEJlY29tZUFjdGl2ZVwiLFxuXHRcdEFwcGxpY2F0aW9uRGlkQ2hhbmdlQmFja2luZ1Byb3BlcnRpZXM6IFwibWFjOkFwcGxpY2F0aW9uRGlkQ2hhbmdlQmFja2luZ1Byb3BlcnRpZXNcIixcblx0XHRBcHBsaWNhdGlvbkRpZENoYW5nZUVmZmVjdGl2ZUFwcGVhcmFuY2U6IFwibWFjOkFwcGxpY2F0aW9uRGlkQ2hhbmdlRWZmZWN0aXZlQXBwZWFyYW5jZVwiLFxuXHRcdEFwcGxpY2F0aW9uRGlkQ2hhbmdlSWNvbjogXCJtYWM6QXBwbGljYXRpb25EaWRDaGFuZ2VJY29uXCIsXG5cdFx0QXBwbGljYXRpb25EaWRDaGFuZ2VPY2NsdXNpb25TdGF0ZTogXCJtYWM6QXBwbGljYXRpb25EaWRDaGFuZ2VPY2NsdXNpb25TdGF0ZVwiLFxuXHRcdEFwcGxpY2F0aW9uRGlkQ2hhbmdlU2NyZWVuUGFyYW1ldGVyczogXCJtYWM6QXBwbGljYXRpb25EaWRDaGFuZ2VTY3JlZW5QYXJhbWV0ZXJzXCIsXG5cdFx0QXBwbGljYXRpb25EaWRDaGFuZ2VTdGF0dXNCYXJGcmFtZTogXCJtYWM6QXBwbGljYXRpb25EaWRDaGFuZ2VTdGF0dXNCYXJGcmFtZVwiLFxuXHRcdEFwcGxpY2F0aW9uRGlkQ2hhbmdlU3RhdHVzQmFyT3JpZW50YXRpb246IFwibWFjOkFwcGxpY2F0aW9uRGlkQ2hhbmdlU3RhdHVzQmFyT3JpZW50YXRpb25cIixcblx0XHRBcHBsaWNhdGlvbkRpZENoYW5nZVRoZW1lOiBcIm1hYzpBcHBsaWNhdGlvbkRpZENoYW5nZVRoZW1lXCIsXG5cdFx0QXBwbGljYXRpb25EaWRGaW5pc2hMYXVuY2hpbmc6IFwibWFjOkFwcGxpY2F0aW9uRGlkRmluaXNoTGF1bmNoaW5nXCIsXG5cdFx0QXBwbGljYXRpb25EaWRIaWRlOiBcIm1hYzpBcHBsaWNhdGlvbkRpZEhpZGVcIixcblx0XHRBcHBsaWNhdGlvbkRpZFJlc2lnbkFjdGl2ZTogXCJtYWM6QXBwbGljYXRpb25EaWRSZXNpZ25BY3RpdmVcIixcblx0XHRBcHBsaWNhdGlvbkRpZFVuaGlkZTogXCJtYWM6QXBwbGljYXRpb25EaWRVbmhpZGVcIixcblx0XHRBcHBsaWNhdGlvbkRpZFVwZGF0ZTogXCJtYWM6QXBwbGljYXRpb25EaWRVcGRhdGVcIixcblx0XHRBcHBsaWNhdGlvblNob3VsZEhhbmRsZVJlb3BlbjogXCJtYWM6QXBwbGljYXRpb25TaG91bGRIYW5kbGVSZW9wZW5cIixcblx0XHRBcHBsaWNhdGlvbldpbGxCZWNvbWVBY3RpdmU6IFwibWFjOkFwcGxpY2F0aW9uV2lsbEJlY29tZUFjdGl2ZVwiLFxuXHRcdEFwcGxpY2F0aW9uV2lsbEZpbmlzaExhdW5jaGluZzogXCJtYWM6QXBwbGljYXRpb25XaWxsRmluaXNoTGF1bmNoaW5nXCIsXG5cdFx0QXBwbGljYXRpb25XaWxsSGlkZTogXCJtYWM6QXBwbGljYXRpb25XaWxsSGlkZVwiLFxuXHRcdEFwcGxpY2F0aW9uV2lsbFJlc2lnbkFjdGl2ZTogXCJtYWM6QXBwbGljYXRpb25XaWxsUmVzaWduQWN0aXZlXCIsXG5cdFx0QXBwbGljYXRpb25XaWxsVGVybWluYXRlOiBcIm1hYzpBcHBsaWNhdGlvbldpbGxUZXJtaW5hdGVcIixcblx0XHRBcHBsaWNhdGlvbldpbGxVbmhpZGU6IFwibWFjOkFwcGxpY2F0aW9uV2lsbFVuaGlkZVwiLFxuXHRcdEFwcGxpY2F0aW9uV2lsbFVwZGF0ZTogXCJtYWM6QXBwbGljYXRpb25XaWxsVXBkYXRlXCIsXG5cdFx0TWVudURpZEFkZEl0ZW06IFwibWFjOk1lbnVEaWRBZGRJdGVtXCIsXG5cdFx0TWVudURpZEJlZ2luVHJhY2tpbmc6IFwibWFjOk1lbnVEaWRCZWdpblRyYWNraW5nXCIsXG5cdFx0TWVudURpZENsb3NlOiBcIm1hYzpNZW51RGlkQ2xvc2VcIixcblx0XHRNZW51RGlkRGlzcGxheUl0ZW06IFwibWFjOk1lbnVEaWREaXNwbGF5SXRlbVwiLFxuXHRcdE1lbnVEaWRFbmRUcmFja2luZzogXCJtYWM6TWVudURpZEVuZFRyYWNraW5nXCIsXG5cdFx0TWVudURpZEhpZ2hsaWdodEl0ZW06IFwibWFjOk1lbnVEaWRIaWdobGlnaHRJdGVtXCIsXG5cdFx0TWVudURpZE9wZW46IFwibWFjOk1lbnVEaWRPcGVuXCIsXG5cdFx0TWVudURpZFBvcFVwOiBcIm1hYzpNZW51RGlkUG9wVXBcIixcblx0XHRNZW51RGlkUmVtb3ZlSXRlbTogXCJtYWM6TWVudURpZFJlbW92ZUl0ZW1cIixcblx0XHRNZW51RGlkU2VuZEFjdGlvbjogXCJtYWM6TWVudURpZFNlbmRBY3Rpb25cIixcblx0XHRNZW51RGlkU2VuZEFjdGlvblRvSXRlbTogXCJtYWM6TWVudURpZFNlbmRBY3Rpb25Ub0l0ZW1cIixcblx0XHRNZW51RGlkVXBkYXRlOiBcIm1hYzpNZW51RGlkVXBkYXRlXCIsXG5cdFx0TWVudVdpbGxBZGRJdGVtOiBcIm1hYzpNZW51V2lsbEFkZEl0ZW1cIixcblx0XHRNZW51V2lsbEJlZ2luVHJhY2tpbmc6IFwibWFjOk1lbnVXaWxsQmVnaW5UcmFja2luZ1wiLFxuXHRcdE1lbnVXaWxsRGlzcGxheUl0ZW06IFwibWFjOk1lbnVXaWxsRGlzcGxheUl0ZW1cIixcblx0XHRNZW51V2lsbEVuZFRyYWNraW5nOiBcIm1hYzpNZW51V2lsbEVuZFRyYWNraW5nXCIsXG5cdFx0TWVudVdpbGxIaWdobGlnaHRJdGVtOiBcIm1hYzpNZW51V2lsbEhpZ2hsaWdodEl0ZW1cIixcblx0XHRNZW51V2lsbE9wZW46IFwibWFjOk1lbnVXaWxsT3BlblwiLFxuXHRcdE1lbnVXaWxsUG9wVXA6IFwibWFjOk1lbnVXaWxsUG9wVXBcIixcblx0XHRNZW51V2lsbFJlbW92ZUl0ZW06IFwibWFjOk1lbnVXaWxsUmVtb3ZlSXRlbVwiLFxuXHRcdE1lbnVXaWxsU2VuZEFjdGlvbjogXCJtYWM6TWVudVdpbGxTZW5kQWN0aW9uXCIsXG5cdFx0TWVudVdpbGxTZW5kQWN0aW9uVG9JdGVtOiBcIm1hYzpNZW51V2lsbFNlbmRBY3Rpb25Ub0l0ZW1cIixcblx0XHRNZW51V2lsbFVwZGF0ZTogXCJtYWM6TWVudVdpbGxVcGRhdGVcIixcblx0XHRXZWJWaWV3RGlkQ29tbWl0TmF2aWdhdGlvbjogXCJtYWM6V2ViVmlld0RpZENvbW1pdE5hdmlnYXRpb25cIixcblx0XHRXZWJWaWV3RGlkRmluaXNoTmF2aWdhdGlvbjogXCJtYWM6V2ViVmlld0RpZEZpbmlzaE5hdmlnYXRpb25cIixcblx0XHRXZWJWaWV3RGlkUmVjZWl2ZVNlcnZlclJlZGlyZWN0Rm9yUHJvdmlzaW9uYWxOYXZpZ2F0aW9uOiBcIm1hYzpXZWJWaWV3RGlkUmVjZWl2ZVNlcnZlclJlZGlyZWN0Rm9yUHJvdmlzaW9uYWxOYXZpZ2F0aW9uXCIsXG5cdFx0V2ViVmlld0RpZFN0YXJ0UHJvdmlzaW9uYWxOYXZpZ2F0aW9uOiBcIm1hYzpXZWJWaWV3RGlkU3RhcnRQcm92aXNpb25hbE5hdmlnYXRpb25cIixcblx0XHRXaW5kb3dEaWRCZWNvbWVLZXk6IFwibWFjOldpbmRvd0RpZEJlY29tZUtleVwiLFxuXHRcdFdpbmRvd0RpZEJlY29tZU1haW46IFwibWFjOldpbmRvd0RpZEJlY29tZU1haW5cIixcblx0XHRXaW5kb3dEaWRCZWdpblNoZWV0OiBcIm1hYzpXaW5kb3dEaWRCZWdpblNoZWV0XCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlQWxwaGE6IFwibWFjOldpbmRvd0RpZENoYW5nZUFscGhhXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlQmFja2luZ0xvY2F0aW9uOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VCYWNraW5nTG9jYXRpb25cIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VCYWNraW5nUHJvcGVydGllczogXCJtYWM6V2luZG93RGlkQ2hhbmdlQmFja2luZ1Byb3BlcnRpZXNcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VDb2xsZWN0aW9uQmVoYXZpb3I6IFwibWFjOldpbmRvd0RpZENoYW5nZUNvbGxlY3Rpb25CZWhhdmlvclwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZUVmZmVjdGl2ZUFwcGVhcmFuY2U6IFwibWFjOldpbmRvd0RpZENoYW5nZUVmZmVjdGl2ZUFwcGVhcmFuY2VcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VPY2NsdXNpb25TdGF0ZTogXCJtYWM6V2luZG93RGlkQ2hhbmdlT2NjbHVzaW9uU3RhdGVcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VPcmRlcmluZ01vZGU6IFwibWFjOldpbmRvd0RpZENoYW5nZU9yZGVyaW5nTW9kZVwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZVNjcmVlbjogXCJtYWM6V2luZG93RGlkQ2hhbmdlU2NyZWVuXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlU2NyZWVuUGFyYW1ldGVyczogXCJtYWM6V2luZG93RGlkQ2hhbmdlU2NyZWVuUGFyYW1ldGVyc1wiLFxuXHRcdFdpbmRvd0RpZENoYW5nZVNjcmVlblByb2ZpbGU6IFwibWFjOldpbmRvd0RpZENoYW5nZVNjcmVlblByb2ZpbGVcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VTY3JlZW5TcGFjZTogXCJtYWM6V2luZG93RGlkQ2hhbmdlU2NyZWVuU3BhY2VcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VTY3JlZW5TcGFjZVByb3BlcnRpZXM6IFwibWFjOldpbmRvd0RpZENoYW5nZVNjcmVlblNwYWNlUHJvcGVydGllc1wiLFxuXHRcdFdpbmRvd0RpZENoYW5nZVNoYXJpbmdUeXBlOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VTaGFyaW5nVHlwZVwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZVNwYWNlOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VTcGFjZVwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZVNwYWNlT3JkZXJpbmdNb2RlOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VTcGFjZU9yZGVyaW5nTW9kZVwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZVRpdGxlOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VUaXRsZVwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZVRvb2xiYXI6IFwibWFjOldpbmRvd0RpZENoYW5nZVRvb2xiYXJcIixcblx0XHRXaW5kb3dEaWREZW1pbmlhdHVyaXplOiBcIm1hYzpXaW5kb3dEaWREZW1pbmlhdHVyaXplXCIsXG5cdFx0V2luZG93RGlkRW5kU2hlZXQ6IFwibWFjOldpbmRvd0RpZEVuZFNoZWV0XCIsXG5cdFx0V2luZG93RGlkRW50ZXJGdWxsU2NyZWVuOiBcIm1hYzpXaW5kb3dEaWRFbnRlckZ1bGxTY3JlZW5cIixcblx0XHRXaW5kb3dEaWRFbnRlclZlcnNpb25Ccm93c2VyOiBcIm1hYzpXaW5kb3dEaWRFbnRlclZlcnNpb25Ccm93c2VyXCIsXG5cdFx0V2luZG93RGlkRXhpdEZ1bGxTY3JlZW46IFwibWFjOldpbmRvd0RpZEV4aXRGdWxsU2NyZWVuXCIsXG5cdFx0V2luZG93RGlkRXhpdFZlcnNpb25Ccm93c2VyOiBcIm1hYzpXaW5kb3dEaWRFeGl0VmVyc2lvbkJyb3dzZXJcIixcblx0XHRXaW5kb3dEaWRFeHBvc2U6IFwibWFjOldpbmRvd0RpZEV4cG9zZVwiLFxuXHRcdFdpbmRvd0RpZEZvY3VzOiBcIm1hYzpXaW5kb3dEaWRGb2N1c1wiLFxuXHRcdFdpbmRvd0RpZE1pbmlhdHVyaXplOiBcIm1hYzpXaW5kb3dEaWRNaW5pYXR1cml6ZVwiLFxuXHRcdFdpbmRvd0RpZE1vdmU6IFwibWFjOldpbmRvd0RpZE1vdmVcIixcblx0XHRXaW5kb3dEaWRPcmRlck9mZlNjcmVlbjogXCJtYWM6V2luZG93RGlkT3JkZXJPZmZTY3JlZW5cIixcblx0XHRXaW5kb3dEaWRPcmRlck9uU2NyZWVuOiBcIm1hYzpXaW5kb3dEaWRPcmRlck9uU2NyZWVuXCIsXG5cdFx0V2luZG93RGlkUmVzaWduS2V5OiBcIm1hYzpXaW5kb3dEaWRSZXNpZ25LZXlcIixcblx0XHRXaW5kb3dEaWRSZXNpZ25NYWluOiBcIm1hYzpXaW5kb3dEaWRSZXNpZ25NYWluXCIsXG5cdFx0V2luZG93RGlkUmVzaXplOiBcIm1hYzpXaW5kb3dEaWRSZXNpemVcIixcblx0XHRXaW5kb3dEaWRVcGRhdGU6IFwibWFjOldpbmRvd0RpZFVwZGF0ZVwiLFxuXHRcdFdpbmRvd0RpZFVwZGF0ZUFscGhhOiBcIm1hYzpXaW5kb3dEaWRVcGRhdGVBbHBoYVwiLFxuXHRcdFdpbmRvd0RpZFVwZGF0ZUNvbGxlY3Rpb25CZWhhdmlvcjogXCJtYWM6V2luZG93RGlkVXBkYXRlQ29sbGVjdGlvbkJlaGF2aW9yXCIsXG5cdFx0V2luZG93RGlkVXBkYXRlQ29sbGVjdGlvblByb3BlcnRpZXM6IFwibWFjOldpbmRvd0RpZFVwZGF0ZUNvbGxlY3Rpb25Qcm9wZXJ0aWVzXCIsXG5cdFx0V2luZG93RGlkVXBkYXRlU2hhZG93OiBcIm1hYzpXaW5kb3dEaWRVcGRhdGVTaGFkb3dcIixcblx0XHRXaW5kb3dEaWRVcGRhdGVUaXRsZTogXCJtYWM6V2luZG93RGlkVXBkYXRlVGl0bGVcIixcblx0XHRXaW5kb3dEaWRVcGRhdGVUb29sYmFyOiBcIm1hYzpXaW5kb3dEaWRVcGRhdGVUb29sYmFyXCIsXG5cdFx0V2luZG93RGlkWm9vbTogXCJtYWM6V2luZG93RGlkWm9vbVwiLFxuXHRcdFdpbmRvd0ZpbGVEcmFnZ2luZ0VudGVyZWQ6IFwibWFjOldpbmRvd0ZpbGVEcmFnZ2luZ0VudGVyZWRcIixcblx0XHRXaW5kb3dGaWxlRHJhZ2dpbmdFeGl0ZWQ6IFwibWFjOldpbmRvd0ZpbGVEcmFnZ2luZ0V4aXRlZFwiLFxuXHRcdFdpbmRvd0ZpbGVEcmFnZ2luZ1BlcmZvcm1lZDogXCJtYWM6V2luZG93RmlsZURyYWdnaW5nUGVyZm9ybWVkXCIsXG5cdFx0V2luZG93SGlkZTogXCJtYWM6V2luZG93SGlkZVwiLFxuXHRcdFdpbmRvd01heGltaXNlOiBcIm1hYzpXaW5kb3dNYXhpbWlzZVwiLFxuXHRcdFdpbmRvd1VuTWF4aW1pc2U6IFwibWFjOldpbmRvd1VuTWF4aW1pc2VcIixcblx0XHRXaW5kb3dNaW5pbWlzZTogXCJtYWM6V2luZG93TWluaW1pc2VcIixcblx0XHRXaW5kb3dVbk1pbmltaXNlOiBcIm1hYzpXaW5kb3dVbk1pbmltaXNlXCIsXG5cdFx0V2luZG93U2hvdWxkQ2xvc2U6IFwibWFjOldpbmRvd1Nob3VsZENsb3NlXCIsXG5cdFx0V2luZG93U2hvdzogXCJtYWM6V2luZG93U2hvd1wiLFxuXHRcdFdpbmRvd1dpbGxCZWNvbWVLZXk6IFwibWFjOldpbmRvd1dpbGxCZWNvbWVLZXlcIixcblx0XHRXaW5kb3dXaWxsQmVjb21lTWFpbjogXCJtYWM6V2luZG93V2lsbEJlY29tZU1haW5cIixcblx0XHRXaW5kb3dXaWxsQmVnaW5TaGVldDogXCJtYWM6V2luZG93V2lsbEJlZ2luU2hlZXRcIixcblx0XHRXaW5kb3dXaWxsQ2hhbmdlT3JkZXJpbmdNb2RlOiBcIm1hYzpXaW5kb3dXaWxsQ2hhbmdlT3JkZXJpbmdNb2RlXCIsXG5cdFx0V2luZG93V2lsbENsb3NlOiBcIm1hYzpXaW5kb3dXaWxsQ2xvc2VcIixcblx0XHRXaW5kb3dXaWxsRGVtaW5pYXR1cml6ZTogXCJtYWM6V2luZG93V2lsbERlbWluaWF0dXJpemVcIixcblx0XHRXaW5kb3dXaWxsRW50ZXJGdWxsU2NyZWVuOiBcIm1hYzpXaW5kb3dXaWxsRW50ZXJGdWxsU2NyZWVuXCIsXG5cdFx0V2luZG93V2lsbEVudGVyVmVyc2lvbkJyb3dzZXI6IFwibWFjOldpbmRvd1dpbGxFbnRlclZlcnNpb25Ccm93c2VyXCIsXG5cdFx0V2luZG93V2lsbEV4aXRGdWxsU2NyZWVuOiBcIm1hYzpXaW5kb3dXaWxsRXhpdEZ1bGxTY3JlZW5cIixcblx0XHRXaW5kb3dXaWxsRXhpdFZlcnNpb25Ccm93c2VyOiBcIm1hYzpXaW5kb3dXaWxsRXhpdFZlcnNpb25Ccm93c2VyXCIsXG5cdFx0V2luZG93V2lsbEZvY3VzOiBcIm1hYzpXaW5kb3dXaWxsRm9jdXNcIixcblx0XHRXaW5kb3dXaWxsTWluaWF0dXJpemU6IFwibWFjOldpbmRvd1dpbGxNaW5pYXR1cml6ZVwiLFxuXHRcdFdpbmRvd1dpbGxNb3ZlOiBcIm1hYzpXaW5kb3dXaWxsTW92ZVwiLFxuXHRcdFdpbmRvd1dpbGxPcmRlck9mZlNjcmVlbjogXCJtYWM6V2luZG93V2lsbE9yZGVyT2ZmU2NyZWVuXCIsXG5cdFx0V2luZG93V2lsbE9yZGVyT25TY3JlZW46IFwibWFjOldpbmRvd1dpbGxPcmRlck9uU2NyZWVuXCIsXG5cdFx0V2luZG93V2lsbFJlc2lnbk1haW46IFwibWFjOldpbmRvd1dpbGxSZXNpZ25NYWluXCIsXG5cdFx0V2luZG93V2lsbFJlc2l6ZTogXCJtYWM6V2luZG93V2lsbFJlc2l6ZVwiLFxuXHRcdFdpbmRvd1dpbGxVbmZvY3VzOiBcIm1hYzpXaW5kb3dXaWxsVW5mb2N1c1wiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGU6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVcIixcblx0XHRXaW5kb3dXaWxsVXBkYXRlQWxwaGE6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVBbHBoYVwiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGVDb2xsZWN0aW9uQmVoYXZpb3I6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVDb2xsZWN0aW9uQmVoYXZpb3JcIixcblx0XHRXaW5kb3dXaWxsVXBkYXRlQ29sbGVjdGlvblByb3BlcnRpZXM6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVDb2xsZWN0aW9uUHJvcGVydGllc1wiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGVTaGFkb3c6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVTaGFkb3dcIixcblx0XHRXaW5kb3dXaWxsVXBkYXRlVGl0bGU6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVUaXRsZVwiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGVUb29sYmFyOiBcIm1hYzpXaW5kb3dXaWxsVXBkYXRlVG9vbGJhclwiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGVWaXNpYmlsaXR5OiBcIm1hYzpXaW5kb3dXaWxsVXBkYXRlVmlzaWJpbGl0eVwiLFxuXHRcdFdpbmRvd1dpbGxVc2VTdGFuZGFyZEZyYW1lOiBcIm1hYzpXaW5kb3dXaWxsVXNlU3RhbmRhcmRGcmFtZVwiLFxuXHRcdFdpbmRvd1pvb21JbjogXCJtYWM6V2luZG93Wm9vbUluXCIsXG5cdFx0V2luZG93Wm9vbU91dDogXCJtYWM6V2luZG93Wm9vbU91dFwiLFxuXHRcdFdpbmRvd1pvb21SZXNldDogXCJtYWM6V2luZG93Wm9vbVJlc2V0XCIsXG5cdH0pLFxuXHRMaW51eDogT2JqZWN0LmZyZWV6ZSh7XG5cdFx0QXBwbGljYXRpb25TdGFydHVwOiBcImxpbnV4OkFwcGxpY2F0aW9uU3RhcnR1cFwiLFxuXHRcdFN5c3RlbVRoZW1lQ2hhbmdlZDogXCJsaW51eDpTeXN0ZW1UaGVtZUNoYW5nZWRcIixcblx0XHRXaW5kb3dEZWxldGVFdmVudDogXCJsaW51eDpXaW5kb3dEZWxldGVFdmVudFwiLFxuXHRcdFdpbmRvd0RpZE1vdmU6IFwibGludXg6V2luZG93RGlkTW92ZVwiLFxuXHRcdFdpbmRvd0RpZFJlc2l6ZTogXCJsaW51eDpXaW5kb3dEaWRSZXNpemVcIixcblx0XHRXaW5kb3dGb2N1c0luOiBcImxpbnV4OldpbmRvd0ZvY3VzSW5cIixcblx0XHRXaW5kb3dGb2N1c091dDogXCJsaW51eDpXaW5kb3dGb2N1c091dFwiLFxuXHRcdFdpbmRvd0xvYWRDaGFuZ2VkOiBcImxpbnV4OldpbmRvd0xvYWRDaGFuZ2VkXCIsXG5cdH0pLFxuXHRDb21tb246IE9iamVjdC5mcmVlemUoe1xuXHRcdEFwcGxpY2F0aW9uT3BlbmVkV2l0aEZpbGU6IFwiY29tbW9uOkFwcGxpY2F0aW9uT3BlbmVkV2l0aEZpbGVcIixcblx0XHRBcHBsaWNhdGlvblN0YXJ0ZWQ6IFwiY29tbW9uOkFwcGxpY2F0aW9uU3RhcnRlZFwiLFxuXHRcdFRoZW1lQ2hhbmdlZDogXCJjb21tb246VGhlbWVDaGFuZ2VkXCIsXG5cdFx0V2luZG93Q2xvc2luZzogXCJjb21tb246V2luZG93Q2xvc2luZ1wiLFxuXHRcdFdpbmRvd0RpZE1vdmU6IFwiY29tbW9uOldpbmRvd0RpZE1vdmVcIixcblx0XHRXaW5kb3dEaWRSZXNpemU6IFwiY29tbW9uOldpbmRvd0RpZFJlc2l6ZVwiLFxuXHRcdFdpbmRvd0RQSUNoYW5nZWQ6IFwiY29tbW9uOldpbmRvd0RQSUNoYW5nZWRcIixcblx0XHRXaW5kb3dGaWxlc0Ryb3BwZWQ6IFwiY29tbW9uOldpbmRvd0ZpbGVzRHJvcHBlZFwiLFxuXHRcdFdpbmRvd0ZvY3VzOiBcImNvbW1vbjpXaW5kb3dGb2N1c1wiLFxuXHRcdFdpbmRvd0Z1bGxzY3JlZW46IFwiY29tbW9uOldpbmRvd0Z1bGxzY3JlZW5cIixcblx0XHRXaW5kb3dIaWRlOiBcImNvbW1vbjpXaW5kb3dIaWRlXCIsXG5cdFx0V2luZG93TG9zdEZvY3VzOiBcImNvbW1vbjpXaW5kb3dMb3N0Rm9jdXNcIixcblx0XHRXaW5kb3dNYXhpbWlzZTogXCJjb21tb246V2luZG93TWF4aW1pc2VcIixcblx0XHRXaW5kb3dNaW5pbWlzZTogXCJjb21tb246V2luZG93TWluaW1pc2VcIixcblx0XHRXaW5kb3dSZXN0b3JlOiBcImNvbW1vbjpXaW5kb3dSZXN0b3JlXCIsXG5cdFx0V2luZG93UnVudGltZVJlYWR5OiBcImNvbW1vbjpXaW5kb3dSdW50aW1lUmVhZHlcIixcblx0XHRXaW5kb3dTaG93OiBcImNvbW1vbjpXaW5kb3dTaG93XCIsXG5cdFx0V2luZG93VW5GdWxsc2NyZWVuOiBcImNvbW1vbjpXaW5kb3dVbkZ1bGxzY3JlZW5cIixcblx0XHRXaW5kb3dVbk1heGltaXNlOiBcImNvbW1vbjpXaW5kb3dVbk1heGltaXNlXCIsXG5cdFx0V2luZG93VW5NaW5pbWlzZTogXCJjb21tb246V2luZG93VW5NaW5pbWlzZVwiLFxuXHRcdFdpbmRvd1pvb206IFwiY29tbW9uOldpbmRvd1pvb21cIixcblx0XHRXaW5kb3dab29tSW46IFwiY29tbW9uOldpbmRvd1pvb21JblwiLFxuXHRcdFdpbmRvd1pvb21PdXQ6IFwiY29tbW9uOldpbmRvd1pvb21PdXRcIixcblx0XHRXaW5kb3dab29tUmVzZXQ6IFwiY29tbW9uOldpbmRvd1pvb21SZXNldFwiLFxuXHR9KSxcbn0pO1xuIiwgIi8qXG4gXyAgICAgX18gICAgIF8gX19cbnwgfCAgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vKipcbiAqIExvZ3MgYSBtZXNzYWdlIHRvIHRoZSBjb25zb2xlIHdpdGggY3VzdG9tIGZvcm1hdHRpbmcuXG4gKlxuICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWJ1Z0xvZyhtZXNzYWdlOiBhbnkpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgJyVjIHdhaWxzMyAlYyAnICsgbWVzc2FnZSArICcgJyxcbiAgICAgICAgJ2JhY2tncm91bmQ6ICNhYTAwMDA7IGNvbG9yOiAjZmZmOyBib3JkZXItcmFkaXVzOiAzcHggMHB4IDBweCAzcHg7IHBhZGRpbmc6IDFweDsgZm9udC1zaXplOiAwLjdyZW0nLFxuICAgICAgICAnYmFja2dyb3VuZDogIzAwOTkwMDsgY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDBweCAzcHggM3B4IDBweDsgcGFkZGluZzogMXB4OyBmb250LXNpemU6IDAuN3JlbSdcbiAgICApO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSB3ZWJ2aWV3IHN1cHBvcnRzIHRoZSB7QGxpbmsgTW91c2VFdmVudCNidXR0b25zfSBwcm9wZXJ0eS5cbiAqIExvb2tpbmcgYXQgeW91IG1hY09TIEhpZ2ggU2llcnJhIVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FuVHJhY2tCdXR0b25zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAobmV3IE1vdXNlRXZlbnQoJ21vdXNlZG93bicpKS5idXR0b25zID09PSAwO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBicm93c2VyIHN1cHBvcnRzIHJlbW92aW5nIGxpc3RlbmVycyBieSB0cmlnZ2VyaW5nIGFuIEFib3J0U2lnbmFsXG4gKiAoc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FdmVudFRhcmdldC9hZGRFdmVudExpc3RlbmVyI3NpZ25hbCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYW5BYm9ydExpc3RlbmVycygpIHtcbiAgICBpZiAoIUV2ZW50VGFyZ2V0IHx8ICFBYm9ydFNpZ25hbCB8fCAhQWJvcnRDb250cm9sbGVyKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBsZXQgcmVzdWx0ID0gdHJ1ZTtcblxuICAgIGNvbnN0IHRhcmdldCA9IG5ldyBFdmVudFRhcmdldCgpO1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCAoKSA9PiB7IHJlc3VsdCA9IGZhbHNlOyB9LCB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfSk7XG4gICAgY29udHJvbGxlci5hYm9ydCgpO1xuICAgIHRhcmdldC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgndGVzdCcpKTtcblxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIGNsb3Nlc3QgSFRNTEVsZW1lbnQgYW5jZXN0b3Igb2YgYW4gZXZlbnQncyB0YXJnZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBldmVudFRhcmdldChldmVudDogRXZlbnQpOiBIVE1MRWxlbWVudCB7XG4gICAgaWYgKGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBldmVudC50YXJnZXQ7XG4gICAgfSBlbHNlIGlmICghKGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSAmJiBldmVudC50YXJnZXQgaW5zdGFuY2VvZiBOb2RlKSB7XG4gICAgICAgIHJldHVybiBldmVudC50YXJnZXQucGFyZW50RWxlbWVudCA/PyBkb2N1bWVudC5ib2R5O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBkb2N1bWVudC5ib2R5O1xuICAgIH1cbn1cblxuLyoqKlxuIFRoaXMgdGVjaG5pcXVlIGZvciBwcm9wZXIgbG9hZCBkZXRlY3Rpb24gaXMgdGFrZW4gZnJvbSBIVE1YOlxuXG4gQlNEIDItQ2xhdXNlIExpY2Vuc2VcblxuIENvcHlyaWdodCAoYykgMjAyMCwgQmlnIFNreSBTb2Z0d2FyZVxuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cbiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcblxuIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuXG4gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb25cbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cblxuIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4gQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEVcbiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTFxuIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SXG4gU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVJcbiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLFxuIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFXG4gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cblxuICoqKi9cblxubGV0IGlzUmVhZHkgPSBmYWxzZTtcbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB7IGlzUmVhZHkgPSB0cnVlIH0pO1xuXG5leHBvcnQgZnVuY3Rpb24gd2hlblJlYWR5KGNhbGxiYWNrOiAoKSA9PiB2b2lkKSB7XG4gICAgaWYgKGlzUmVhZHkgfHwgZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJykge1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBjYWxsYmFjayk7XG4gICAgfVxufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5pbXBvcnQge25ld1J1bnRpbWVDYWxsZXIsIG9iamVjdE5hbWVzfSBmcm9tIFwiLi9ydW50aW1lLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNjcmVlbiB9IGZyb20gXCIuL3NjcmVlbnMuanNcIjtcblxuY29uc3QgUG9zaXRpb25NZXRob2QgICAgICAgICAgICAgICAgICAgID0gMDtcbmNvbnN0IENlbnRlck1ldGhvZCAgICAgICAgICAgICAgICAgICAgICA9IDE7XG5jb25zdCBDbG9zZU1ldGhvZCAgICAgICAgICAgICAgICAgICAgICAgPSAyO1xuY29uc3QgRGlzYWJsZVNpemVDb25zdHJhaW50c01ldGhvZCAgICAgID0gMztcbmNvbnN0IEVuYWJsZVNpemVDb25zdHJhaW50c01ldGhvZCAgICAgICA9IDQ7XG5jb25zdCBGb2N1c01ldGhvZCAgICAgICAgICAgICAgICAgICAgICAgPSA1O1xuY29uc3QgRm9yY2VSZWxvYWRNZXRob2QgICAgICAgICAgICAgICAgID0gNjtcbmNvbnN0IEZ1bGxzY3JlZW5NZXRob2QgICAgICAgICAgICAgICAgICA9IDc7XG5jb25zdCBHZXRTY3JlZW5NZXRob2QgICAgICAgICAgICAgICAgICAgPSA4O1xuY29uc3QgR2V0Wm9vbU1ldGhvZCAgICAgICAgICAgICAgICAgICAgID0gOTtcbmNvbnN0IEhlaWdodE1ldGhvZCAgICAgICAgICAgICAgICAgICAgICA9IDEwO1xuY29uc3QgSGlkZU1ldGhvZCAgICAgICAgICAgICAgICAgICAgICAgID0gMTE7XG5jb25zdCBJc0ZvY3VzZWRNZXRob2QgICAgICAgICAgICAgICAgICAgPSAxMjtcbmNvbnN0IElzRnVsbHNjcmVlbk1ldGhvZCAgICAgICAgICAgICAgICA9IDEzO1xuY29uc3QgSXNNYXhpbWlzZWRNZXRob2QgICAgICAgICAgICAgICAgID0gMTQ7XG5jb25zdCBJc01pbmltaXNlZE1ldGhvZCAgICAgICAgICAgICAgICAgPSAxNTtcbmNvbnN0IE1heGltaXNlTWV0aG9kICAgICAgICAgICAgICAgICAgICA9IDE2O1xuY29uc3QgTWluaW1pc2VNZXRob2QgICAgICAgICAgICAgICAgICAgID0gMTc7XG5jb25zdCBOYW1lTWV0aG9kICAgICAgICAgICAgICAgICAgICAgICAgPSAxODtcbmNvbnN0IE9wZW5EZXZUb29sc01ldGhvZCAgICAgICAgICAgICAgICA9IDE5O1xuY29uc3QgUmVsYXRpdmVQb3NpdGlvbk1ldGhvZCAgICAgICAgICAgID0gMjA7XG5jb25zdCBSZWxvYWRNZXRob2QgICAgICAgICAgICAgICAgICAgICAgPSAyMTtcbmNvbnN0IFJlc2l6YWJsZU1ldGhvZCAgICAgICAgICAgICAgICAgICA9IDIyO1xuY29uc3QgUmVzdG9yZU1ldGhvZCAgICAgICAgICAgICAgICAgICAgID0gMjM7XG5jb25zdCBTZXRQb3NpdGlvbk1ldGhvZCAgICAgICAgICAgICAgICAgPSAyNDtcbmNvbnN0IFNldEFsd2F5c09uVG9wTWV0aG9kICAgICAgICAgICAgICA9IDI1O1xuY29uc3QgU2V0QmFja2dyb3VuZENvbG91ck1ldGhvZCAgICAgICAgID0gMjY7XG5jb25zdCBTZXRGcmFtZWxlc3NNZXRob2QgICAgICAgICAgICAgICAgPSAyNztcbmNvbnN0IFNldEZ1bGxzY3JlZW5CdXR0b25FbmFibGVkTWV0aG9kICA9IDI4O1xuY29uc3QgU2V0TWF4U2l6ZU1ldGhvZCAgICAgICAgICAgICAgICAgID0gMjk7XG5jb25zdCBTZXRNaW5TaXplTWV0aG9kICAgICAgICAgICAgICAgICAgPSAzMDtcbmNvbnN0IFNldFJlbGF0aXZlUG9zaXRpb25NZXRob2QgICAgICAgICA9IDMxO1xuY29uc3QgU2V0UmVzaXphYmxlTWV0aG9kICAgICAgICAgICAgICAgID0gMzI7XG5jb25zdCBTZXRTaXplTWV0aG9kICAgICAgICAgICAgICAgICAgICAgPSAzMztcbmNvbnN0IFNldFRpdGxlTWV0aG9kICAgICAgICAgICAgICAgICAgICA9IDM0O1xuY29uc3QgU2V0Wm9vbU1ldGhvZCAgICAgICAgICAgICAgICAgICAgID0gMzU7XG5jb25zdCBTaG93TWV0aG9kICAgICAgICAgICAgICAgICAgICAgICAgPSAzNjtcbmNvbnN0IFNpemVNZXRob2QgICAgICAgICAgICAgICAgICAgICAgICA9IDM3O1xuY29uc3QgVG9nZ2xlRnVsbHNjcmVlbk1ldGhvZCAgICAgICAgICAgID0gMzg7XG5jb25zdCBUb2dnbGVNYXhpbWlzZU1ldGhvZCAgICAgICAgICAgICAgPSAzOTtcbmNvbnN0IFVuRnVsbHNjcmVlbk1ldGhvZCAgICAgICAgICAgICAgICA9IDQwO1xuY29uc3QgVW5NYXhpbWlzZU1ldGhvZCAgICAgICAgICAgICAgICAgID0gNDE7XG5jb25zdCBVbk1pbmltaXNlTWV0aG9kICAgICAgICAgICAgICAgICAgPSA0MjtcbmNvbnN0IFdpZHRoTWV0aG9kICAgICAgICAgICAgICAgICAgICAgICA9IDQzO1xuY29uc3QgWm9vbU1ldGhvZCAgICAgICAgICAgICAgICAgICAgICAgID0gNDQ7XG5jb25zdCBab29tSW5NZXRob2QgICAgICAgICAgICAgICAgICAgICAgPSA0NTtcbmNvbnN0IFpvb21PdXRNZXRob2QgICAgICAgICAgICAgICAgICAgICA9IDQ2O1xuY29uc3QgWm9vbVJlc2V0TWV0aG9kICAgICAgICAgICAgICAgICAgID0gNDc7XG5cbi8qKlxuICogQSByZWNvcmQgZGVzY3JpYmluZyB0aGUgcG9zaXRpb24gb2YgYSB3aW5kb3cuXG4gKi9cbmludGVyZmFjZSBQb3NpdGlvbiB7XG4gICAgLyoqIFRoZSBob3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoZSB3aW5kb3cuICovXG4gICAgeDogbnVtYmVyO1xuICAgIC8qKiBUaGUgdmVydGljYWwgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy4gKi9cbiAgICB5OiBudW1iZXI7XG59XG5cbi8qKlxuICogQSByZWNvcmQgZGVzY3JpYmluZyB0aGUgc2l6ZSBvZiBhIHdpbmRvdy5cbiAqL1xuaW50ZXJmYWNlIFNpemUge1xuICAgIC8qKiBUaGUgd2lkdGggb2YgdGhlIHdpbmRvdy4gKi9cbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIC8qKiBUaGUgaGVpZ2h0IG9mIHRoZSB3aW5kb3cuICovXG4gICAgaGVpZ2h0OiBudW1iZXI7XG59XG5cbi8vIFByaXZhdGUgZmllbGQgbmFtZXMuXG5jb25zdCBjYWxsZXJTeW0gPSBTeW1ib2woXCJjYWxsZXJcIik7XG5cbmNsYXNzIFdpbmRvdyB7XG4gICAgLy8gUHJpdmF0ZSBmaWVsZHMuXG4gICAgcHJpdmF0ZSBbY2FsbGVyU3ltXTogKG1lc3NhZ2U6IG51bWJlciwgYXJncz86IGFueSkgPT4gUHJvbWlzZTxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGlzZXMgYSB3aW5kb3cgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YXJnZXQgd2luZG93LlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZyA9ICcnKSB7XG4gICAgICAgIHRoaXNbY2FsbGVyU3ltXSA9IG5ld1J1bnRpbWVDYWxsZXIob2JqZWN0TmFtZXMuV2luZG93LCBuYW1lKVxuXG4gICAgICAgIC8vIGJpbmQgaW5zdGFuY2UgbWV0aG9kIHRvIG1ha2UgdGhlbSBlYXNpbHkgdXNhYmxlIGluIGV2ZW50IGhhbmRsZXJzXG4gICAgICAgIGZvciAoY29uc3QgbWV0aG9kIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKFdpbmRvdy5wcm90b3R5cGUpKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgbWV0aG9kICE9PSBcImNvbnN0cnVjdG9yXCJcbiAgICAgICAgICAgICAgICAmJiB0eXBlb2YgKHRoaXMgYXMgYW55KVttZXRob2RdID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICh0aGlzIGFzIGFueSlbbWV0aG9kXSA9ICh0aGlzIGFzIGFueSlbbWV0aG9kXS5iaW5kKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgc3BlY2lmaWVkIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHdpbmRvdyB0byBnZXQuXG4gICAgICogQHJldHVybnMgVGhlIGNvcnJlc3BvbmRpbmcgd2luZG93IG9iamVjdC5cbiAgICAgKi9cbiAgICBHZXQobmFtZTogc3RyaW5nKTogV2luZG93IHtcbiAgICAgICAgcmV0dXJuIG5ldyBXaW5kb3cobmFtZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IGFic29sdXRlIHBvc2l0aW9uIG9mIHRoZSB3aW5kb3cuXG4gICAgICovXG4gICAgUG9zaXRpb24oKTogUHJvbWlzZTxQb3NpdGlvbj4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFBvc2l0aW9uTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDZW50ZXJzIHRoZSB3aW5kb3cgb24gdGhlIHNjcmVlbi5cbiAgICAgKi9cbiAgICBDZW50ZXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oQ2VudGVyTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBDbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShDbG9zZU1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZXMgbWluL21heCBzaXplIGNvbnN0cmFpbnRzLlxuICAgICAqL1xuICAgIERpc2FibGVTaXplQ29uc3RyYWludHMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oRGlzYWJsZVNpemVDb25zdHJhaW50c01ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyBtaW4vbWF4IHNpemUgY29uc3RyYWludHMuXG4gICAgICovXG4gICAgRW5hYmxlU2l6ZUNvbnN0cmFpbnRzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEVuYWJsZVNpemVDb25zdHJhaW50c01ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9jdXNlcyB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIEZvY3VzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEZvY3VzTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JjZXMgdGhlIHdpbmRvdyB0byByZWxvYWQgdGhlIHBhZ2UgYXNzZXRzLlxuICAgICAqL1xuICAgIEZvcmNlUmVsb2FkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEZvcmNlUmVsb2FkTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTd2l0Y2hlcyB0aGUgd2luZG93IHRvIGZ1bGxzY3JlZW4gbW9kZS5cbiAgICAgKi9cbiAgICBGdWxsc2NyZWVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEZ1bGxzY3JlZW5NZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHNjcmVlbiB0aGF0IHRoZSB3aW5kb3cgaXMgb24uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgc2NyZWVuIHRoZSB3aW5kb3cgaXMgY3VycmVudGx5IG9uLlxuICAgICAqL1xuICAgIEdldFNjcmVlbigpOiBQcm9taXNlPFNjcmVlbj4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEdldFNjcmVlbk1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudCB6b29tIGxldmVsIG9mIHRoZSB3aW5kb3cuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCB6b29tIGxldmVsLlxuICAgICAqL1xuICAgIEdldFpvb20oKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShHZXRab29tTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBoZWlnaHQgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IGhlaWdodCBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIEhlaWdodCgpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEhlaWdodE1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGlkZXMgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBIaWRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEhpZGVNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgd2luZG93IGlzIGZvY3VzZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSB3aW5kb3cgaXMgY3VycmVudGx5IGZvY3VzZWQuXG4gICAgICovXG4gICAgSXNGb2N1c2VkKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKElzRm9jdXNlZE1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB3aW5kb3cgaXMgZnVsbHNjcmVlbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIHdpbmRvdyBpcyBjdXJyZW50bHkgZnVsbHNjcmVlbi5cbiAgICAgKi9cbiAgICBJc0Z1bGxzY3JlZW4oKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oSXNGdWxsc2NyZWVuTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHdpbmRvdyBpcyBtYXhpbWlzZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSB3aW5kb3cgaXMgY3VycmVudGx5IG1heGltaXNlZC5cbiAgICAgKi9cbiAgICBJc01heGltaXNlZCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShJc01heGltaXNlZE1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB3aW5kb3cgaXMgbWluaW1pc2VkLlxuICAgICAqXG4gICAgICogQHJldHVybnMgV2hldGhlciB0aGUgd2luZG93IGlzIGN1cnJlbnRseSBtaW5pbWlzZWQuXG4gICAgICovXG4gICAgSXNNaW5pbWlzZWQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oSXNNaW5pbWlzZWRNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1heGltaXNlcyB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIE1heGltaXNlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKE1heGltaXNlTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNaW5pbWlzZXMgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBNaW5pbWlzZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShNaW5pbWlzZU1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgd2luZG93LlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIG5hbWUgb2YgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBOYW1lKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oTmFtZU1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3BlbnMgdGhlIGRldmVsb3BtZW50IHRvb2xzIHBhbmUuXG4gICAgICovXG4gICAgT3BlbkRldlRvb2xzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKE9wZW5EZXZUb29sc01ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcmVsYXRpdmUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdyB0byB0aGUgc2NyZWVuLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIGN1cnJlbnQgcmVsYXRpdmUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBSZWxhdGl2ZVBvc2l0aW9uKCk6IFByb21pc2U8UG9zaXRpb24+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShSZWxhdGl2ZVBvc2l0aW9uTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWxvYWRzIHRoZSBwYWdlIGFzc2V0cy5cbiAgICAgKi9cbiAgICBSZWxvYWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oUmVsb2FkTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHdpbmRvdyBpcyByZXNpemFibGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSB3aW5kb3cgaXMgY3VycmVudGx5IHJlc2l6YWJsZS5cbiAgICAgKi9cbiAgICBSZXNpemFibGUoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oUmVzaXphYmxlTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXN0b3JlcyB0aGUgd2luZG93IHRvIGl0cyBwcmV2aW91cyBzdGF0ZSBpZiBpdCB3YXMgcHJldmlvdXNseSBtaW5pbWlzZWQsIG1heGltaXNlZCBvciBmdWxsc2NyZWVuLlxuICAgICAqL1xuICAgIFJlc3RvcmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oUmVzdG9yZU1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB4IC0gVGhlIGRlc2lyZWQgaG9yaXpvbnRhbCBhYnNvbHV0ZSBwb3NpdGlvbiBvZiB0aGUgd2luZG93LlxuICAgICAqIEBwYXJhbSB5IC0gVGhlIGRlc2lyZWQgdmVydGljYWwgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBTZXRQb3NpdGlvbih4OiBudW1iZXIsIHk6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFNldFBvc2l0aW9uTWV0aG9kLCB7IHgsIHkgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgd2luZG93IHRvIGJlIGFsd2F5cyBvbiB0b3AuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYWx3YXlzT25Ub3AgLSBXaGV0aGVyIHRoZSB3aW5kb3cgc2hvdWxkIHN0YXkgb24gdG9wLlxuICAgICAqL1xuICAgIFNldEFsd2F5c09uVG9wKGFsd2F5c09uVG9wOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2V0QWx3YXlzT25Ub3BNZXRob2QsIHsgYWx3YXlzT25Ub3AgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgYmFja2dyb3VuZCBjb2xvdXIgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByIC0gVGhlIGRlc2lyZWQgcmVkIGNvbXBvbmVudCBvZiB0aGUgd2luZG93IGJhY2tncm91bmQuXG4gICAgICogQHBhcmFtIGcgLSBUaGUgZGVzaXJlZCBncmVlbiBjb21wb25lbnQgb2YgdGhlIHdpbmRvdyBiYWNrZ3JvdW5kLlxuICAgICAqIEBwYXJhbSBiIC0gVGhlIGRlc2lyZWQgYmx1ZSBjb21wb25lbnQgb2YgdGhlIHdpbmRvdyBiYWNrZ3JvdW5kLlxuICAgICAqIEBwYXJhbSBhIC0gVGhlIGRlc2lyZWQgYWxwaGEgY29tcG9uZW50IG9mIHRoZSB3aW5kb3cgYmFja2dyb3VuZC5cbiAgICAgKi9cbiAgICBTZXRCYWNrZ3JvdW5kQ29sb3VyKHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIsIGE6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFNldEJhY2tncm91bmRDb2xvdXJNZXRob2QsIHsgciwgZywgYiwgYSB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSB3aW5kb3cgZnJhbWUgYW5kIHRpdGxlIGJhci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmcmFtZWxlc3MgLSBXaGV0aGVyIHRoZSB3aW5kb3cgc2hvdWxkIGJlIGZyYW1lbGVzcy5cbiAgICAgKi9cbiAgICBTZXRGcmFtZWxlc3MoZnJhbWVsZXNzOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2V0RnJhbWVsZXNzTWV0aG9kLCB7IGZyYW1lbGVzcyB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlcyB0aGUgc3lzdGVtIGZ1bGxzY3JlZW4gYnV0dG9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVuYWJsZWQgLSBXaGV0aGVyIHRoZSBmdWxsc2NyZWVuIGJ1dHRvbiBzaG91bGQgYmUgZW5hYmxlZC5cbiAgICAgKi9cbiAgICBTZXRGdWxsc2NyZWVuQnV0dG9uRW5hYmxlZChlbmFibGVkOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2V0RnVsbHNjcmVlbkJ1dHRvbkVuYWJsZWRNZXRob2QsIHsgZW5hYmxlZCB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB3aWR0aCAtIFRoZSBkZXNpcmVkIG1heGltdW0gd2lkdGggb2YgdGhlIHdpbmRvdy5cbiAgICAgKiBAcGFyYW0gaGVpZ2h0IC0gVGhlIGRlc2lyZWQgbWF4aW11bSBoZWlnaHQgb2YgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBTZXRNYXhTaXplKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2V0TWF4U2l6ZU1ldGhvZCwgeyB3aWR0aCwgaGVpZ2h0IH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIG1pbmltdW0gc2l6ZSBvZiB0aGUgd2luZG93LlxuICAgICAqXG4gICAgICogQHBhcmFtIHdpZHRoIC0gVGhlIGRlc2lyZWQgbWluaW11bSB3aWR0aCBvZiB0aGUgd2luZG93LlxuICAgICAqIEBwYXJhbSBoZWlnaHQgLSBUaGUgZGVzaXJlZCBtaW5pbXVtIGhlaWdodCBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFNldE1pblNpemUod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShTZXRNaW5TaXplTWV0aG9kLCB7IHdpZHRoLCBoZWlnaHQgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcmVsYXRpdmUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdyB0byB0aGUgc2NyZWVuLlxuICAgICAqXG4gICAgICogQHBhcmFtIHggLSBUaGUgZGVzaXJlZCBob3Jpem9udGFsIHJlbGF0aXZlIHBvc2l0aW9uIG9mIHRoZSB3aW5kb3cuXG4gICAgICogQHBhcmFtIHkgLSBUaGUgZGVzaXJlZCB2ZXJ0aWNhbCByZWxhdGl2ZSBwb3NpdGlvbiBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFNldFJlbGF0aXZlUG9zaXRpb24oeDogbnVtYmVyLCB5OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShTZXRSZWxhdGl2ZVBvc2l0aW9uTWV0aG9kLCB7IHgsIHkgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB3aGV0aGVyIHRoZSB3aW5kb3cgaXMgcmVzaXphYmxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlc2l6YWJsZSAtIFdoZXRoZXIgdGhlIHdpbmRvdyBzaG91bGQgYmUgcmVzaXphYmxlLlxuICAgICAqL1xuICAgIFNldFJlc2l6YWJsZShyZXNpemFibGU6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShTZXRSZXNpemFibGVNZXRob2QsIHsgcmVzaXphYmxlIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHNpemUgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB3aWR0aCAtIFRoZSBkZXNpcmVkIHdpZHRoIG9mIHRoZSB3aW5kb3cuXG4gICAgICogQHBhcmFtIGhlaWdodCAtIFRoZSBkZXNpcmVkIGhlaWdodCBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFNldFNpemUod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShTZXRTaXplTWV0aG9kLCB7IHdpZHRoLCBoZWlnaHQgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdGl0bGUgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0aXRsZSAtIFRoZSBkZXNpcmVkIHRpdGxlIG9mIHRoZSB3aW5kb3cuXG4gICAgICovXG4gICAgU2V0VGl0bGUodGl0bGU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFNldFRpdGxlTWV0aG9kLCB7IHRpdGxlIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHpvb20gbGV2ZWwgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB6b29tIC0gVGhlIGRlc2lyZWQgem9vbSBsZXZlbC5cbiAgICAgKi9cbiAgICBTZXRab29tKHpvb206IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFNldFpvb21NZXRob2QsIHsgem9vbSB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTaG93cyB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFNob3coKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2hvd01ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgd2luZG93LlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFNpemUoKTogUHJvbWlzZTxTaXplPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2l6ZU1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG9nZ2xlcyB0aGUgd2luZG93IGJldHdlZW4gZnVsbHNjcmVlbiBhbmQgbm9ybWFsLlxuICAgICAqL1xuICAgIFRvZ2dsZUZ1bGxzY3JlZW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oVG9nZ2xlRnVsbHNjcmVlbk1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG9nZ2xlcyB0aGUgd2luZG93IGJldHdlZW4gbWF4aW1pc2VkIGFuZCBub3JtYWwuXG4gICAgICovXG4gICAgVG9nZ2xlTWF4aW1pc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oVG9nZ2xlTWF4aW1pc2VNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVuLWZ1bGxzY3JlZW5zIHRoZSB3aW5kb3cuXG4gICAgICovXG4gICAgVW5GdWxsc2NyZWVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFVuRnVsbHNjcmVlbk1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVW4tbWF4aW1pc2VzIHRoZSB3aW5kb3cuXG4gICAgICovXG4gICAgVW5NYXhpbWlzZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShVbk1heGltaXNlTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVbi1taW5pbWlzZXMgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBVbk1pbmltaXNlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFVuTWluaW1pc2VNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHdpZHRoIG9mIHRoZSB3aW5kb3cuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCB3aWR0aCBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFdpZHRoKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oV2lkdGhNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFpvb21zIHRoZSB3aW5kb3cuXG4gICAgICovXG4gICAgWm9vbSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShab29tTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbmNyZWFzZXMgdGhlIHpvb20gbGV2ZWwgb2YgdGhlIHdlYnZpZXcgY29udGVudC5cbiAgICAgKi9cbiAgICBab29tSW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oWm9vbUluTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWNyZWFzZXMgdGhlIHpvb20gbGV2ZWwgb2YgdGhlIHdlYnZpZXcgY29udGVudC5cbiAgICAgKi9cbiAgICBab29tT3V0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFpvb21PdXRNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUgem9vbSBsZXZlbCBvZiB0aGUgd2VidmlldyBjb250ZW50LlxuICAgICAqL1xuICAgIFpvb21SZXNldCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShab29tUmVzZXRNZXRob2QpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBUaGUgd2luZG93IHdpdGhpbiB3aGljaCB0aGUgc2NyaXB0IGlzIHJ1bm5pbmcuXG4gKi9cbmNvbnN0IHRoaXNXaW5kb3cgPSBuZXcgV2luZG93KCcnKTtcblxuZXhwb3J0IGRlZmF1bHQgdGhpc1dpbmRvdztcbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuaW1wb3J0ICogYXMgUnVudGltZSBmcm9tIFwiLi4vQHdhaWxzaW8vcnVudGltZS9zcmNcIjtcblxuLy8gTk9URTogdGhlIGZvbGxvd2luZyBtZXRob2RzIE1VU1QgYmUgaW1wb3J0ZWQgZXhwbGljaXRseSBiZWNhdXNlIG9mIGhvdyBlc2J1aWxkIGluamVjdGlvbiB3b3Jrc1xuaW1wb3J0IHsgRW5hYmxlIGFzIEVuYWJsZVdNTCB9IGZyb20gXCIuLi9Ad2FpbHNpby9ydW50aW1lL3NyYy93bWxcIjtcbmltcG9ydCB7IGRlYnVnTG9nIH0gZnJvbSBcIi4uL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3V0aWxzXCI7XG5cbndpbmRvdy53YWlscyA9IFJ1bnRpbWU7XG5FbmFibGVXTUwoKTtcblxuaWYgKERFQlVHKSB7XG4gICAgZGVidWdMb2coXCJXYWlscyBSdW50aW1lIExvYWRlZFwiKVxufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5pbXBvcnQgeyBuZXdSdW50aW1lQ2FsbGVyLCBvYmplY3ROYW1lcyB9IGZyb20gXCIuL3J1bnRpbWUuanNcIjtcblxuY29uc3QgY2FsbCA9IG5ld1J1bnRpbWVDYWxsZXIob2JqZWN0TmFtZXMuU3lzdGVtKTtcblxuY29uc3QgU3lzdGVtSXNEYXJrTW9kZSA9IDA7XG5jb25zdCBTeXN0ZW1FbnZpcm9ubWVudCA9IDE7XG5cbmNvbnN0IF9pbnZva2UgPSAoZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICgod2luZG93IGFzIGFueSkuY2hyb21lPy53ZWJ2aWV3Py5wb3N0TWVzc2FnZSkge1xuICAgICAgICAgICAgcmV0dXJuICh3aW5kb3cgYXMgYW55KS5jaHJvbWUud2Vidmlldy5wb3N0TWVzc2FnZS5iaW5kKCh3aW5kb3cgYXMgYW55KS5jaHJvbWUud2Vidmlldyk7XG4gICAgICAgIH0gZWxzZSBpZiAoKHdpbmRvdyBhcyBhbnkpLndlYmtpdD8ubWVzc2FnZUhhbmRsZXJzPy5bJ2V4dGVybmFsJ10/LnBvc3RNZXNzYWdlKSB7XG4gICAgICAgICAgICByZXR1cm4gKHdpbmRvdyBhcyBhbnkpLndlYmtpdC5tZXNzYWdlSGFuZGxlcnNbJ2V4dGVybmFsJ10ucG9zdE1lc3NhZ2UuYmluZCgod2luZG93IGFzIGFueSkud2Via2l0Lm1lc3NhZ2VIYW5kbGVyc1snZXh0ZXJuYWwnXSk7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoKGUpIHt9XG5cbiAgICBjb25zb2xlLndhcm4oJ1xcbiVjXHUyNkEwXHVGRTBGIEJyb3dzZXIgRW52aXJvbm1lbnQgRGV0ZWN0ZWQgJWNcXG5cXG4lY09ubHkgVUkgcHJldmlld3MgYXJlIGF2YWlsYWJsZSBpbiB0aGUgYnJvd3Nlci4gRm9yIGZ1bGwgZnVuY3Rpb25hbGl0eSwgcGxlYXNlIHJ1biB0aGUgYXBwbGljYXRpb24gaW4gZGVza3RvcCBtb2RlLlxcbk1vcmUgaW5mb3JtYXRpb24gYXQ6IGh0dHBzOi8vdjMud2FpbHMuaW8vbGVhcm4vYnVpbGQvI3VzaW5nLWEtYnJvd3Nlci1mb3ItZGV2ZWxvcG1lbnRcXG4nLFxuICAgICAgICAnYmFja2dyb3VuZDogI2ZmZmZmZjsgY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyBwYWRkaW5nOiA0cHggOHB4OyBib3JkZXItcmFkaXVzOiA0cHg7IGJvcmRlcjogMnB4IHNvbGlkICMwMDAwMDA7JyxcbiAgICAgICAgJ2JhY2tncm91bmQ6IHRyYW5zcGFyZW50OycsXG4gICAgICAgICdjb2xvcjogI2ZmZmZmZjsgZm9udC1zdHlsZTogaXRhbGljOyBmb250LXdlaWdodDogYm9sZDsnKTtcbiAgICByZXR1cm4gbnVsbDtcbn0pKCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnZva2UobXNnOiBhbnkpOiB2b2lkIHtcbiAgICBfaW52b2tlPy4obXNnKTtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIHN5c3RlbSBkYXJrIG1vZGUgc3RhdHVzLlxuICpcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGEgYm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIGlmIHRoZSBzeXN0ZW0gaXMgaW4gZGFyayBtb2RlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSXNEYXJrTW9kZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gY2FsbChTeXN0ZW1Jc0RhcmtNb2RlKTtcbn1cblxuLyoqXG4gKiBGZXRjaGVzIHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhlIGFwcGxpY2F0aW9uIGZyb20gdGhlIHNlcnZlci5cbiAqXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgY2FwYWJpbGl0aWVzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gQ2FwYWJpbGl0aWVzKCk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGxldCByZXNwb25zZSA9IGF3YWl0IGZldGNoKFwiL3dhaWxzL2NhcGFiaWxpdGllc1wiKTtcbiAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjb3VsZCBub3QgZmV0Y2ggY2FwYWJpbGl0aWVzOiBcIiArIHJlc3BvbnNlLnN0YXR1c1RleHQpO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBPU0luZm8ge1xuICAgIC8qKiBUaGUgYnJhbmRpbmcgb2YgdGhlIE9TLiAqL1xuICAgIEJyYW5kaW5nOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBJRCBvZiB0aGUgT1MuICovXG4gICAgSUQ6IHN0cmluZztcbiAgICAvKiogVGhlIG5hbWUgb2YgdGhlIE9TLiAqL1xuICAgIE5hbWU6IHN0cmluZztcbiAgICAvKiogVGhlIHZlcnNpb24gb2YgdGhlIE9TLiAqL1xuICAgIFZlcnNpb246IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbnZpcm9ubWVudEluZm8ge1xuICAgIC8qKiBUaGUgYXJjaGl0ZWN0dXJlIG9mIHRoZSBzeXN0ZW0uICovXG4gICAgQXJjaDogc3RyaW5nO1xuICAgIC8qKiBUcnVlIGlmIHRoZSBhcHBsaWNhdGlvbiBpcyBydW5uaW5nIGluIGRlYnVnIG1vZGUsIG90aGVyd2lzZSBmYWxzZS4gKi9cbiAgICBEZWJ1ZzogYm9vbGVhbjtcbiAgICAvKiogVGhlIG9wZXJhdGluZyBzeXN0ZW0gaW4gdXNlLiAqL1xuICAgIE9TOiBzdHJpbmc7XG4gICAgLyoqIERldGFpbHMgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0uICovXG4gICAgT1NJbmZvOiBPU0luZm87XG4gICAgLyoqIEFkZGl0aW9uYWwgcGxhdGZvcm0gaW5mb3JtYXRpb24uICovXG4gICAgUGxhdGZvcm1JbmZvOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyBlbnZpcm9ubWVudCBkZXRhaWxzLlxuICpcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIG9iamVjdCBjb250YWluaW5nIE9TIGFuZCBzeXN0ZW0gYXJjaGl0ZWN0dXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gRW52aXJvbm1lbnQoKTogUHJvbWlzZTxFbnZpcm9ubWVudEluZm8+IHtcbiAgICByZXR1cm4gY2FsbChTeXN0ZW1FbnZpcm9ubWVudCk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBjdXJyZW50IG9wZXJhdGluZyBzeXN0ZW0gaXMgV2luZG93cy5cbiAqXG4gKiBAcmV0dXJuIFRydWUgaWYgdGhlIG9wZXJhdGluZyBzeXN0ZW0gaXMgV2luZG93cywgb3RoZXJ3aXNlIGZhbHNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSXNXaW5kb3dzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB3aW5kb3cuX3dhaWxzLmVudmlyb25tZW50Lk9TID09PSBcIndpbmRvd3NcIjtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGN1cnJlbnQgb3BlcmF0aW5nIHN5c3RlbSBpcyBMaW51eC5cbiAqXG4gKiBAcmV0dXJucyBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgb3BlcmF0aW5nIHN5c3RlbSBpcyBMaW51eCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSXNMaW51eCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gd2luZG93Ll93YWlscy5lbnZpcm9ubWVudC5PUyA9PT0gXCJsaW51eFwiO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgY3VycmVudCBlbnZpcm9ubWVudCBpcyBhIG1hY09TIG9wZXJhdGluZyBzeXN0ZW0uXG4gKlxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgZW52aXJvbm1lbnQgaXMgbWFjT1MsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIElzTWFjKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB3aW5kb3cuX3dhaWxzLmVudmlyb25tZW50Lk9TID09PSBcImRhcndpblwiO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgY3VycmVudCBlbnZpcm9ubWVudCBhcmNoaXRlY3R1cmUgaXMgQU1ENjQuXG4gKlxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgY3VycmVudCBlbnZpcm9ubWVudCBhcmNoaXRlY3R1cmUgaXMgQU1ENjQsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIElzQU1ENjQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHdpbmRvdy5fd2FpbHMuZW52aXJvbm1lbnQuQXJjaCA9PT0gXCJhbWQ2NFwiO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgY3VycmVudCBhcmNoaXRlY3R1cmUgaXMgQVJNLlxuICpcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGN1cnJlbnQgYXJjaGl0ZWN0dXJlIGlzIEFSTSwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSXNBUk0oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHdpbmRvdy5fd2FpbHMuZW52aXJvbm1lbnQuQXJjaCA9PT0gXCJhcm1cIjtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgaXMgQVJNNjQgYXJjaGl0ZWN0dXJlLlxuICpcbiAqIEByZXR1cm5zIFJldHVybnMgdHJ1ZSBpZiB0aGUgZW52aXJvbm1lbnQgaXMgQVJNNjQgYXJjaGl0ZWN0dXJlLCBvdGhlcndpc2UgcmV0dXJucyBmYWxzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIElzQVJNNjQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHdpbmRvdy5fd2FpbHMuZW52aXJvbm1lbnQuQXJjaCA9PT0gXCJhcm02NFwiO1xufVxuXG4vKipcbiAqIFJlcG9ydHMgd2hldGhlciB0aGUgYXBwIGlzIGJlaW5nIHJ1biBpbiBkZWJ1ZyBtb2RlLlxuICpcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGFwcCBpcyBiZWluZyBydW4gaW4gZGVidWcgbW9kZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIElzRGVidWcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEJvb2xlYW4od2luZG93Ll93YWlscy5lbnZpcm9ubWVudC5EZWJ1Zyk7XG59XG5cbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuaW1wb3J0IHsgbmV3UnVudGltZUNhbGxlciwgb2JqZWN0TmFtZXMgfSBmcm9tIFwiLi9ydW50aW1lLmpzXCI7XG5pbXBvcnQgeyBJc0RlYnVnIH0gZnJvbSBcIi4vc3lzdGVtLmpzXCI7XG5pbXBvcnQgeyBldmVudFRhcmdldCB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbi8vIHNldHVwXG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCBjb250ZXh0TWVudUhhbmRsZXIpO1xuXG5jb25zdCBjYWxsID0gbmV3UnVudGltZUNhbGxlcihvYmplY3ROYW1lcy5Db250ZXh0TWVudSk7XG5cbmNvbnN0IENvbnRleHRNZW51T3BlbiA9IDA7XG5cbmZ1bmN0aW9uIG9wZW5Db250ZXh0TWVudShpZDogc3RyaW5nLCB4OiBudW1iZXIsIHk6IG51bWJlciwgZGF0YTogYW55KTogdm9pZCB7XG4gICAgdm9pZCBjYWxsKENvbnRleHRNZW51T3Blbiwge2lkLCB4LCB5LCBkYXRhfSk7XG59XG5cbmZ1bmN0aW9uIGNvbnRleHRNZW51SGFuZGxlcihldmVudDogTW91c2VFdmVudCkge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50VGFyZ2V0KGV2ZW50KTtcblxuICAgIC8vIENoZWNrIGZvciBjdXN0b20gY29udGV4dCBtZW51XG4gICAgY29uc3QgY3VzdG9tQ29udGV4dE1lbnUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXQpLmdldFByb3BlcnR5VmFsdWUoXCItLWN1c3RvbS1jb250ZXh0bWVudVwiKS50cmltKCk7XG5cbiAgICBpZiAoY3VzdG9tQ29udGV4dE1lbnUpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRhcmdldCkuZ2V0UHJvcGVydHlWYWx1ZShcIi0tY3VzdG9tLWNvbnRleHRtZW51LWRhdGFcIik7XG4gICAgICAgIG9wZW5Db250ZXh0TWVudShjdXN0b21Db250ZXh0TWVudSwgZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSwgZGF0YSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcHJvY2Vzc0RlZmF1bHRDb250ZXh0TWVudShldmVudCwgdGFyZ2V0KTtcbiAgICB9XG59XG5cblxuLypcbi0tZGVmYXVsdC1jb250ZXh0bWVudTogYXV0bzsgKGRlZmF1bHQpIHdpbGwgc2hvdyB0aGUgZGVmYXVsdCBjb250ZXh0IG1lbnUgaWYgY29udGVudEVkaXRhYmxlIGlzIHRydWUgT1IgdGV4dCBoYXMgYmVlbiBzZWxlY3RlZCBPUiBlbGVtZW50IGlzIGlucHV0IG9yIHRleHRhcmVhXG4tLWRlZmF1bHQtY29udGV4dG1lbnU6IHNob3c7IHdpbGwgYWx3YXlzIHNob3cgdGhlIGRlZmF1bHQgY29udGV4dCBtZW51XG4tLWRlZmF1bHQtY29udGV4dG1lbnU6IGhpZGU7IHdpbGwgYWx3YXlzIGhpZGUgdGhlIGRlZmF1bHQgY29udGV4dCBtZW51XG5cblRoaXMgcnVsZSBpcyBpbmhlcml0ZWQgbGlrZSBub3JtYWwgQ1NTIHJ1bGVzLCBzbyBuZXN0aW5nIHdvcmtzIGFzIGV4cGVjdGVkXG4qL1xuZnVuY3Rpb24gcHJvY2Vzc0RlZmF1bHRDb250ZXh0TWVudShldmVudDogTW91c2VFdmVudCwgdGFyZ2V0OiBIVE1MRWxlbWVudCkge1xuICAgIC8vIERlYnVnIGJ1aWxkcyBhbHdheXMgc2hvdyB0aGUgbWVudVxuICAgIGlmIChJc0RlYnVnKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFByb2Nlc3MgZGVmYXVsdCBjb250ZXh0IG1lbnVcbiAgICBzd2l0Y2ggKHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRhcmdldCkuZ2V0UHJvcGVydHlWYWx1ZShcIi0tZGVmYXVsdC1jb250ZXh0bWVudVwiKS50cmltKCkpIHtcbiAgICAgICAgY2FzZSAnc2hvdyc6XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgJ2hpZGUnOlxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBjb250ZW50RWRpdGFibGUgaXMgdHJ1ZVxuICAgIGlmICh0YXJnZXQuaXNDb250ZW50RWRpdGFibGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHRleHQgaGFzIGJlZW4gc2VsZWN0ZWRcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgY29uc3QgaGFzU2VsZWN0aW9uID0gc2VsZWN0aW9uICYmIHNlbGVjdGlvbi50b1N0cmluZygpLmxlbmd0aCA+IDA7XG4gICAgaWYgKGhhc1NlbGVjdGlvbikge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlbGVjdGlvbi5yYW5nZUNvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoaSk7XG4gICAgICAgICAgICBjb25zdCByZWN0cyA9IHJhbmdlLmdldENsaWVudFJlY3RzKCk7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJlY3RzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVjdCA9IHJlY3RzW2pdO1xuICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KHJlY3QubGVmdCwgcmVjdC50b3ApID09PSB0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHRhZyBpcyBpbnB1dCBvciB0ZXh0YXJlYS5cbiAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCB8fCB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MVGV4dEFyZWFFbGVtZW50KSB7XG4gICAgICAgIGlmIChoYXNTZWxlY3Rpb24gfHwgKCF0YXJnZXQucmVhZE9ubHkgJiYgIXRhcmdldC5kaXNhYmxlZCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGhpZGUgZGVmYXVsdCBjb250ZXh0IG1lbnVcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IGZyb20gdGhlIGZsYWcgbWFwLlxuICpcbiAqIEBwYXJhbSBrZXkgLSBUaGUga2V5IHRvIHJldHJpZXZlIHRoZSB2YWx1ZSBmb3IuXG4gKiBAcmV0dXJuIFRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBrZXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBHZXRGbGFnKGtleTogc3RyaW5nKTogYW55IHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gd2luZG93Ll93YWlscy5mbGFnc1trZXldO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5hYmxlIHRvIHJldHJpZXZlIGZsYWcgJ1wiICsga2V5ICsgXCInOiBcIiArIGUsIHsgY2F1c2U6IGUgfSk7XG4gICAgfVxufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5pbXBvcnQgeyBpbnZva2UsIElzV2luZG93cyB9IGZyb20gXCIuL3N5c3RlbS5qc1wiO1xuaW1wb3J0IHsgR2V0RmxhZyB9IGZyb20gXCIuL2ZsYWdzLmpzXCI7XG5pbXBvcnQgeyBjYW5UcmFja0J1dHRvbnMsIGV2ZW50VGFyZ2V0IH0gZnJvbSBcIi4vdXRpbHMuanNcIjtcblxuLy8gU2V0dXBcbmxldCBjYW5EcmFnID0gZmFsc2U7XG5sZXQgZHJhZ2dpbmcgPSBmYWxzZTtcblxubGV0IHJlc2l6YWJsZSA9IGZhbHNlO1xubGV0IGNhblJlc2l6ZSA9IGZhbHNlO1xubGV0IHJlc2l6aW5nID0gZmFsc2U7XG5sZXQgcmVzaXplRWRnZTogc3RyaW5nID0gXCJcIjtcbmxldCBkZWZhdWx0Q3Vyc29yID0gXCJhdXRvXCI7XG5cbmxldCBidXR0b25zID0gMDtcbmNvbnN0IGJ1dHRvbnNUcmFja2VkID0gY2FuVHJhY2tCdXR0b25zKCk7XG5cbndpbmRvdy5fd2FpbHMgPSB3aW5kb3cuX3dhaWxzIHx8IHt9O1xud2luZG93Ll93YWlscy5zZXRSZXNpemFibGUgPSAodmFsdWU6IGJvb2xlYW4pOiB2b2lkID0+IHtcbiAgICByZXNpemFibGUgPSB2YWx1ZTtcbiAgICBpZiAoIXJlc2l6YWJsZSkge1xuICAgICAgICAvLyBTdG9wIHJlc2l6aW5nIGlmIGluIHByb2dyZXNzLlxuICAgICAgICBjYW5SZXNpemUgPSByZXNpemluZyA9IGZhbHNlO1xuICAgICAgICBzZXRSZXNpemUoKTtcbiAgICB9XG59O1xuXG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdXBkYXRlLCB7IGNhcHR1cmU6IHRydWUgfSk7XG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdXBkYXRlLCB7IGNhcHR1cmU6IHRydWUgfSk7XG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHVwZGF0ZSwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuZm9yIChjb25zdCBldiBvZiBbJ2NsaWNrJywgJ2NvbnRleHRtZW51JywgJ2RibGNsaWNrJ10pIHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihldiwgc3VwcHJlc3NFdmVudCwgeyBjYXB0dXJlOiB0cnVlIH0pO1xufVxuXG5mdW5jdGlvbiBzdXBwcmVzc0V2ZW50KGV2ZW50OiBFdmVudCkge1xuICAgIC8vIFN1cHByZXNzIGNsaWNrIGV2ZW50cyB3aGlsZSByZXNpemluZyBvciBkcmFnZ2luZy5cbiAgICBpZiAoZHJhZ2dpbmcgfHwgcmVzaXppbmcpIHtcbiAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbn1cblxuLy8gVXNlIGNvbnN0YW50cyB0byBhdm9pZCBjb21wYXJpbmcgc3RyaW5ncyBtdWx0aXBsZSB0aW1lcy5cbmNvbnN0IE1vdXNlRG93biA9IDA7XG5jb25zdCBNb3VzZVVwICAgPSAxO1xuY29uc3QgTW91c2VNb3ZlID0gMjtcblxuZnVuY3Rpb24gdXBkYXRlKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgLy8gV2luZG93cyBzdXBwcmVzc2VzIG1vdXNlIGV2ZW50cyBhdCB0aGUgZW5kIG9mIGRyYWdnaW5nIG9yIHJlc2l6aW5nLFxuICAgIC8vIHNvIHdlIG5lZWQgdG8gYmUgc21hcnQgYW5kIHN5bnRoZXNpemUgYnV0dG9uIGV2ZW50cy5cblxuICAgIGxldCBldmVudFR5cGU6IG51bWJlciwgZXZlbnRCdXR0b25zID0gZXZlbnQuYnV0dG9ucztcbiAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHtcbiAgICAgICAgY2FzZSAnbW91c2Vkb3duJzpcbiAgICAgICAgICAgIGV2ZW50VHlwZSA9IE1vdXNlRG93bjtcbiAgICAgICAgICAgIGlmICghYnV0dG9uc1RyYWNrZWQpIHsgZXZlbnRCdXR0b25zID0gYnV0dG9ucyB8ICgxIDw8IGV2ZW50LmJ1dHRvbik7IH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdtb3VzZXVwJzpcbiAgICAgICAgICAgIGV2ZW50VHlwZSA9IE1vdXNlVXA7XG4gICAgICAgICAgICBpZiAoIWJ1dHRvbnNUcmFja2VkKSB7IGV2ZW50QnV0dG9ucyA9IGJ1dHRvbnMgJiB+KDEgPDwgZXZlbnQuYnV0dG9uKTsgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBldmVudFR5cGUgPSBNb3VzZU1vdmU7XG4gICAgICAgICAgICBpZiAoIWJ1dHRvbnNUcmFja2VkKSB7IGV2ZW50QnV0dG9ucyA9IGJ1dHRvbnM7IH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGxldCByZWxlYXNlZCA9IGJ1dHRvbnMgJiB+ZXZlbnRCdXR0b25zO1xuICAgIGxldCBwcmVzc2VkID0gZXZlbnRCdXR0b25zICYgfmJ1dHRvbnM7XG5cbiAgICBidXR0b25zID0gZXZlbnRCdXR0b25zO1xuXG4gICAgLy8gU3ludGhlc2l6ZSBhIHJlbGVhc2UtcHJlc3Mgc2VxdWVuY2UgaWYgd2UgZGV0ZWN0IGEgcHJlc3Mgb2YgYW4gYWxyZWFkeSBwcmVzc2VkIGJ1dHRvbi5cbiAgICBpZiAoZXZlbnRUeXBlID09PSBNb3VzZURvd24gJiYgIShwcmVzc2VkICYgZXZlbnQuYnV0dG9uKSkge1xuICAgICAgICByZWxlYXNlZCB8PSAoMSA8PCBldmVudC5idXR0b24pO1xuICAgICAgICBwcmVzc2VkIHw9ICgxIDw8IGV2ZW50LmJ1dHRvbik7XG4gICAgfVxuXG4gICAgLy8gU3VwcHJlc3MgYWxsIGJ1dHRvbiBldmVudHMgZHVyaW5nIGRyYWdnaW5nIGFuZCByZXNpemluZyxcbiAgICAvLyB1bmxlc3MgdGhpcyBpcyBhIG1vdXNldXAgZXZlbnQgdGhhdCBpcyBlbmRpbmcgYSBkcmFnIGFjdGlvbi5cbiAgICBpZiAoXG4gICAgICAgIGV2ZW50VHlwZSAhPT0gTW91c2VNb3ZlIC8vIEZhc3QgcGF0aCBmb3IgbW91c2Vtb3ZlXG4gICAgICAgICYmIHJlc2l6aW5nXG4gICAgICAgIHx8IChcbiAgICAgICAgICAgIGRyYWdnaW5nXG4gICAgICAgICAgICAmJiAoXG4gICAgICAgICAgICAgICAgZXZlbnRUeXBlID09PSBNb3VzZURvd25cbiAgICAgICAgICAgICAgICB8fCBldmVudC5idXR0b24gIT09IDBcbiAgICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICkge1xuICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHJlbGVhc2VzXG4gICAgaWYgKHJlbGVhc2VkICYgMSkgeyBwcmltYXJ5VXAoZXZlbnQpOyB9XG4gICAgLy8gSGFuZGxlIHByZXNzZXNcbiAgICBpZiAocHJlc3NlZCAmIDEpIHsgcHJpbWFyeURvd24oZXZlbnQpOyB9XG5cbiAgICAvLyBIYW5kbGUgbW91c2Vtb3ZlXG4gICAgaWYgKGV2ZW50VHlwZSA9PT0gTW91c2VNb3ZlKSB7IG9uTW91c2VNb3ZlKGV2ZW50KTsgfTtcbn1cblxuZnVuY3Rpb24gcHJpbWFyeURvd24oZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBSZXNldCByZWFkaW5lc3Mgc3RhdGUuXG4gICAgY2FuRHJhZyA9IGZhbHNlO1xuICAgIGNhblJlc2l6ZSA9IGZhbHNlO1xuXG4gICAgLy8gSWdub3JlIHJlcGVhdGVkIGNsaWNrcyBvbiBtYWNPUyBhbmQgTGludXguXG4gICAgaWYgKCFJc1dpbmRvd3MoKSkge1xuICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ21vdXNlZG93bicgJiYgZXZlbnQuYnV0dG9uID09PSAwICYmIGV2ZW50LmRldGFpbCAhPT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJlc2l6ZUVkZ2UpIHtcbiAgICAgICAgLy8gUmVhZHkgdG8gcmVzaXplIGlmIHRoZSBwcmltYXJ5IGJ1dHRvbiB3YXMgcHJlc3NlZCBmb3IgdGhlIGZpcnN0IHRpbWUuXG4gICAgICAgIGNhblJlc2l6ZSA9IHRydWU7XG4gICAgICAgIC8vIERvIG5vdCBzdGFydCBkcmFnIG9wZXJhdGlvbnMgd2hlbiBvbiByZXNpemUgZWRnZXMuXG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBSZXRyaWV2ZSB0YXJnZXQgZWxlbWVudFxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50VGFyZ2V0KGV2ZW50KTtcblxuICAgIC8vIFJlYWR5IHRvIGRyYWcgaWYgdGhlIHByaW1hcnkgYnV0dG9uIHdhcyBwcmVzc2VkIGZvciB0aGUgZmlyc3QgdGltZSBvbiBhIGRyYWdnYWJsZSBlbGVtZW50LlxuICAgIC8vIElnbm9yZSBjbGlja3Mgb24gdGhlIHNjcm9sbGJhci5cbiAgICBjb25zdCBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRhcmdldCk7XG4gICAgY2FuRHJhZyA9IChcbiAgICAgICAgc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShcIi0td2FpbHMtZHJhZ2dhYmxlXCIpLnRyaW0oKSA9PT0gXCJkcmFnXCJcbiAgICAgICAgJiYgKFxuICAgICAgICAgICAgZXZlbnQub2Zmc2V0WCAtIHBhcnNlRmxvYXQoc3R5bGUucGFkZGluZ0xlZnQpIDwgdGFyZ2V0LmNsaWVudFdpZHRoXG4gICAgICAgICAgICAmJiBldmVudC5vZmZzZXRZIC0gcGFyc2VGbG9hdChzdHlsZS5wYWRkaW5nVG9wKSA8IHRhcmdldC5jbGllbnRIZWlnaHRcbiAgICAgICAgKVxuICAgICk7XG59XG5cbmZ1bmN0aW9uIHByaW1hcnlVcChldmVudDogTW91c2VFdmVudCkge1xuICAgIC8vIFN0b3AgZHJhZ2dpbmcgYW5kIHJlc2l6aW5nLlxuICAgIGNhbkRyYWcgPSBmYWxzZTtcbiAgICBkcmFnZ2luZyA9IGZhbHNlO1xuICAgIGNhblJlc2l6ZSA9IGZhbHNlO1xuICAgIHJlc2l6aW5nID0gZmFsc2U7XG59XG5cbmNvbnN0IGN1cnNvckZvckVkZ2UgPSBPYmplY3QuZnJlZXplKHtcbiAgICBcInNlLXJlc2l6ZVwiOiBcIm53c2UtcmVzaXplXCIsXG4gICAgXCJzdy1yZXNpemVcIjogXCJuZXN3LXJlc2l6ZVwiLFxuICAgIFwibnctcmVzaXplXCI6IFwibndzZS1yZXNpemVcIixcbiAgICBcIm5lLXJlc2l6ZVwiOiBcIm5lc3ctcmVzaXplXCIsXG4gICAgXCJ3LXJlc2l6ZVwiOiBcImV3LXJlc2l6ZVwiLFxuICAgIFwibi1yZXNpemVcIjogXCJucy1yZXNpemVcIixcbiAgICBcInMtcmVzaXplXCI6IFwibnMtcmVzaXplXCIsXG4gICAgXCJlLXJlc2l6ZVwiOiBcImV3LXJlc2l6ZVwiLFxufSlcblxuZnVuY3Rpb24gc2V0UmVzaXplKGVkZ2U/OiBrZXlvZiB0eXBlb2YgY3Vyc29yRm9yRWRnZSk6IHZvaWQge1xuICAgIGlmIChlZGdlKSB7XG4gICAgICAgIGlmICghcmVzaXplRWRnZSkgeyBkZWZhdWx0Q3Vyc29yID0gZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3I7IH1cbiAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3IgPSBjdXJzb3JGb3JFZGdlW2VkZ2VdO1xuICAgIH0gZWxzZSBpZiAoIWVkZ2UgJiYgcmVzaXplRWRnZSkge1xuICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLmN1cnNvciA9IGRlZmF1bHRDdXJzb3I7XG4gICAgfVxuXG4gICAgcmVzaXplRWRnZSA9IGVkZ2UgfHwgXCJcIjtcbn1cblxuZnVuY3Rpb24gb25Nb3VzZU1vdmUoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoY2FuUmVzaXplICYmIHJlc2l6ZUVkZ2UpIHtcbiAgICAgICAgLy8gU3RhcnQgcmVzaXppbmcuXG4gICAgICAgIHJlc2l6aW5nID0gdHJ1ZTtcbiAgICAgICAgaW52b2tlKFwid2FpbHM6cmVzaXplOlwiICsgcmVzaXplRWRnZSk7XG4gICAgfSBlbHNlIGlmIChjYW5EcmFnKSB7XG4gICAgICAgIC8vIFN0YXJ0IGRyYWdnaW5nLlxuICAgICAgICBkcmFnZ2luZyA9IHRydWU7XG4gICAgICAgIGludm9rZShcIndhaWxzOmRyYWdcIik7XG4gICAgfVxuXG4gICAgaWYgKGRyYWdnaW5nIHx8IHJlc2l6aW5nKSB7XG4gICAgICAgIC8vIEVpdGhlciBkcmFnIG9yIHJlc2l6ZSBpcyBvbmdvaW5nLFxuICAgICAgICAvLyByZXNldCByZWFkaW5lc3MgYW5kIHN0b3AgcHJvY2Vzc2luZy5cbiAgICAgICAgY2FuRHJhZyA9IGNhblJlc2l6ZSA9IGZhbHNlO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFyZXNpemFibGUgfHwgIUlzV2luZG93cygpKSB7XG4gICAgICAgIGlmIChyZXNpemVFZGdlKSB7IHNldFJlc2l6ZSgpOyB9XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZXNpemVIYW5kbGVIZWlnaHQgPSBHZXRGbGFnKFwic3lzdGVtLnJlc2l6ZUhhbmRsZUhlaWdodFwiKSB8fCA1O1xuICAgIGNvbnN0IHJlc2l6ZUhhbmRsZVdpZHRoID0gR2V0RmxhZyhcInN5c3RlbS5yZXNpemVIYW5kbGVXaWR0aFwiKSB8fCA1O1xuXG4gICAgLy8gRXh0cmEgcGl4ZWxzIGZvciB0aGUgY29ybmVyIGFyZWFzLlxuICAgIGNvbnN0IGNvcm5lckV4dHJhID0gR2V0RmxhZyhcInJlc2l6ZUNvcm5lckV4dHJhXCIpIHx8IDEwO1xuXG4gICAgY29uc3QgcmlnaHRCb3JkZXIgPSAod2luZG93Lm91dGVyV2lkdGggLSBldmVudC5jbGllbnRYKSA8IHJlc2l6ZUhhbmRsZVdpZHRoO1xuICAgIGNvbnN0IGxlZnRCb3JkZXIgPSBldmVudC5jbGllbnRYIDwgcmVzaXplSGFuZGxlV2lkdGg7XG4gICAgY29uc3QgdG9wQm9yZGVyID0gZXZlbnQuY2xpZW50WSA8IHJlc2l6ZUhhbmRsZUhlaWdodDtcbiAgICBjb25zdCBib3R0b21Cb3JkZXIgPSAod2luZG93Lm91dGVySGVpZ2h0IC0gZXZlbnQuY2xpZW50WSkgPCByZXNpemVIYW5kbGVIZWlnaHQ7XG5cbiAgICAvLyBBZGp1c3QgZm9yIGNvcm5lciBhcmVhcy5cbiAgICBjb25zdCByaWdodENvcm5lciA9ICh3aW5kb3cub3V0ZXJXaWR0aCAtIGV2ZW50LmNsaWVudFgpIDwgKHJlc2l6ZUhhbmRsZVdpZHRoICsgY29ybmVyRXh0cmEpO1xuICAgIGNvbnN0IGxlZnRDb3JuZXIgPSBldmVudC5jbGllbnRYIDwgKHJlc2l6ZUhhbmRsZVdpZHRoICsgY29ybmVyRXh0cmEpO1xuICAgIGNvbnN0IHRvcENvcm5lciA9IGV2ZW50LmNsaWVudFkgPCAocmVzaXplSGFuZGxlSGVpZ2h0ICsgY29ybmVyRXh0cmEpO1xuICAgIGNvbnN0IGJvdHRvbUNvcm5lciA9ICh3aW5kb3cub3V0ZXJIZWlnaHQgLSBldmVudC5jbGllbnRZKSA8IChyZXNpemVIYW5kbGVIZWlnaHQgKyBjb3JuZXJFeHRyYSk7XG5cbiAgICBpZiAoIWxlZnRDb3JuZXIgJiYgIXRvcENvcm5lciAmJiAhYm90dG9tQ29ybmVyICYmICFyaWdodENvcm5lcikge1xuICAgICAgICAvLyBPcHRpbWlzYXRpb246IG91dCBvZiBhbGwgY29ybmVyIGFyZWFzIGltcGxpZXMgb3V0IG9mIGJvcmRlcnMuXG4gICAgICAgIHNldFJlc2l6ZSgpO1xuICAgIH1cbiAgICAvLyBEZXRlY3QgY29ybmVycy5cbiAgICBlbHNlIGlmIChyaWdodENvcm5lciAmJiBib3R0b21Db3JuZXIpIHNldFJlc2l6ZShcInNlLXJlc2l6ZVwiKTtcbiAgICBlbHNlIGlmIChsZWZ0Q29ybmVyICYmIGJvdHRvbUNvcm5lcikgc2V0UmVzaXplKFwic3ctcmVzaXplXCIpO1xuICAgIGVsc2UgaWYgKGxlZnRDb3JuZXIgJiYgdG9wQ29ybmVyKSBzZXRSZXNpemUoXCJudy1yZXNpemVcIik7XG4gICAgZWxzZSBpZiAodG9wQ29ybmVyICYmIHJpZ2h0Q29ybmVyKSBzZXRSZXNpemUoXCJuZS1yZXNpemVcIik7XG4gICAgLy8gRGV0ZWN0IGJvcmRlcnMuXG4gICAgZWxzZSBpZiAobGVmdEJvcmRlcikgc2V0UmVzaXplKFwidy1yZXNpemVcIik7XG4gICAgZWxzZSBpZiAodG9wQm9yZGVyKSBzZXRSZXNpemUoXCJuLXJlc2l6ZVwiKTtcbiAgICBlbHNlIGlmIChib3R0b21Cb3JkZXIpIHNldFJlc2l6ZShcInMtcmVzaXplXCIpO1xuICAgIGVsc2UgaWYgKHJpZ2h0Qm9yZGVyKSBzZXRSZXNpemUoXCJlLXJlc2l6ZVwiKTtcbiAgICAvLyBPdXQgb2YgYm9yZGVyIGFyZWEuXG4gICAgZWxzZSBzZXRSZXNpemUoKTtcbn1cbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuaW1wb3J0IHsgbmV3UnVudGltZUNhbGxlciwgb2JqZWN0TmFtZXMgfSBmcm9tIFwiLi9ydW50aW1lLmpzXCI7XG5jb25zdCBjYWxsID0gbmV3UnVudGltZUNhbGxlcihvYmplY3ROYW1lcy5BcHBsaWNhdGlvbik7XG5cbmNvbnN0IEhpZGVNZXRob2QgPSAwO1xuY29uc3QgU2hvd01ldGhvZCA9IDE7XG5jb25zdCBRdWl0TWV0aG9kID0gMjtcblxuLyoqXG4gKiBIaWRlcyBhIGNlcnRhaW4gbWV0aG9kIGJ5IGNhbGxpbmcgdGhlIEhpZGVNZXRob2QgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBIaWRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBjYWxsKEhpZGVNZXRob2QpO1xufVxuXG4vKipcbiAqIENhbGxzIHRoZSBTaG93TWV0aG9kIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBTaG93KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBjYWxsKFNob3dNZXRob2QpO1xufVxuXG4vKipcbiAqIENhbGxzIHRoZSBRdWl0TWV0aG9kIHRvIHRlcm1pbmF0ZSB0aGUgcHJvZ3JhbS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFF1aXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIGNhbGwoUXVpdE1ldGhvZCk7XG59XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbmltcG9ydCB7IENhbmNlbGxhYmxlUHJvbWlzZSwgdHlwZSBDYW5jZWxsYWJsZVByb21pc2VXaXRoUmVzb2x2ZXJzIH0gZnJvbSBcIi4vY2FuY2VsbGFibGUuanNcIjtcbmltcG9ydCB7IG5ld1J1bnRpbWVDYWxsZXIsIG9iamVjdE5hbWVzIH0gZnJvbSBcIi4vcnVudGltZS5qc1wiO1xuaW1wb3J0IHsgbmFub2lkIH0gZnJvbSBcIi4vbmFub2lkLmpzXCI7XG5cbi8vIFNldHVwXG53aW5kb3cuX3dhaWxzID0gd2luZG93Ll93YWlscyB8fCB7fTtcbndpbmRvdy5fd2FpbHMuY2FsbFJlc3VsdEhhbmRsZXIgPSByZXN1bHRIYW5kbGVyO1xud2luZG93Ll93YWlscy5jYWxsRXJyb3JIYW5kbGVyID0gZXJyb3JIYW5kbGVyO1xuXG50eXBlIFByb21pc2VSZXNvbHZlcnMgPSBPbWl0PENhbmNlbGxhYmxlUHJvbWlzZVdpdGhSZXNvbHZlcnM8YW55PiwgXCJwcm9taXNlXCIgfCBcIm9uY2FuY2VsbGVkXCI+XG5cbmNvbnN0IGNhbGwgPSBuZXdSdW50aW1lQ2FsbGVyKG9iamVjdE5hbWVzLkNhbGwpO1xuY29uc3QgY2FuY2VsQ2FsbCA9IG5ld1J1bnRpbWVDYWxsZXIob2JqZWN0TmFtZXMuQ2FuY2VsQ2FsbCk7XG5jb25zdCBjYWxsUmVzcG9uc2VzID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2VSZXNvbHZlcnM+KCk7XG5cbmNvbnN0IENhbGxCaW5kaW5nID0gMDtcbmNvbnN0IENhbmNlbE1ldGhvZCA9IDBcblxuLyoqXG4gKiBIb2xkcyBhbGwgcmVxdWlyZWQgaW5mb3JtYXRpb24gZm9yIGEgYmluZGluZyBjYWxsLlxuICogTWF5IHByb3ZpZGUgZWl0aGVyIGEgbWV0aG9kIElEIG9yIGEgbWV0aG9kIG5hbWUsIGJ1dCBub3QgYm90aC5cbiAqL1xuZXhwb3J0IHR5cGUgQ2FsbE9wdGlvbnMgPSB7XG4gICAgLyoqIFRoZSBudW1lcmljIElEIG9mIHRoZSBib3VuZCBtZXRob2QgdG8gY2FsbC4gKi9cbiAgICBtZXRob2RJRDogbnVtYmVyO1xuICAgIC8qKiBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGJvdW5kIG1ldGhvZCB0byBjYWxsLiAqL1xuICAgIG1ldGhvZE5hbWU/OiBuZXZlcjtcbiAgICAvKiogQXJndW1lbnRzIHRvIGJlIHBhc3NlZCBpbnRvIHRoZSBib3VuZCBtZXRob2QuICovXG4gICAgYXJnczogYW55W107XG59IHwge1xuICAgIC8qKiBUaGUgbnVtZXJpYyBJRCBvZiB0aGUgYm91bmQgbWV0aG9kIHRvIGNhbGwuICovXG4gICAgbWV0aG9kSUQ/OiBuZXZlcjtcbiAgICAvKiogVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBib3VuZCBtZXRob2QgdG8gY2FsbC4gKi9cbiAgICBtZXRob2ROYW1lOiBzdHJpbmc7XG4gICAgLyoqIEFyZ3VtZW50cyB0byBiZSBwYXNzZWQgaW50byB0aGUgYm91bmQgbWV0aG9kLiAqL1xuICAgIGFyZ3M6IGFueVtdO1xufTtcblxuLyoqXG4gKiBFeGNlcHRpb24gY2xhc3MgdGhhdCB3aWxsIGJlIHRocm93biBpbiBjYXNlIHRoZSBib3VuZCBtZXRob2QgcmV0dXJucyBhbiBlcnJvci5cbiAqIFRoZSB2YWx1ZSBvZiB0aGUge0BsaW5rIFJ1bnRpbWVFcnJvciNuYW1lfSBwcm9wZXJ0eSBpcyBcIlJ1bnRpbWVFcnJvclwiLlxuICovXG5leHBvcnQgY2xhc3MgUnVudGltZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgYSBuZXcgUnVudGltZUVycm9yIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSBtZXNzYWdlIC0gVGhlIGVycm9yIG1lc3NhZ2UuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIGJlIGZvcndhcmRlZCB0byB0aGUgRXJyb3IgY29uc3RydWN0b3IuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobWVzc2FnZT86IHN0cmluZywgb3B0aW9ucz86IEVycm9yT3B0aW9ucykge1xuICAgICAgICBzdXBlcihtZXNzYWdlLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5uYW1lID0gXCJSdW50aW1lRXJyb3JcIjtcbiAgICB9XG59XG5cbi8qKlxuICogSGFuZGxlcyB0aGUgcmVzdWx0IG9mIGEgY2FsbCByZXF1ZXN0LlxuICpcbiAqIEBwYXJhbSBpZCAtIFRoZSBpZCBvZiB0aGUgcmVxdWVzdCB0byBoYW5kbGUgdGhlIHJlc3VsdCBmb3IuXG4gKiBAcGFyYW0gZGF0YSAtIFRoZSByZXN1bHQgZGF0YSBvZiB0aGUgcmVxdWVzdC5cbiAqIEBwYXJhbSBpc0pTT04gLSBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZGF0YSBpcyBKU09OIG9yIG5vdC5cbiAqL1xuZnVuY3Rpb24gcmVzdWx0SGFuZGxlcihpZDogc3RyaW5nLCBkYXRhOiBzdHJpbmcsIGlzSlNPTjogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IHJlc29sdmVycyA9IGdldEFuZERlbGV0ZVJlc3BvbnNlKGlkKTtcbiAgICBpZiAoIXJlc29sdmVycykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICAgIHJlc29sdmVycy5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgfSBlbHNlIGlmICghaXNKU09OKSB7XG4gICAgICAgIHJlc29sdmVycy5yZXNvbHZlKGRhdGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXNvbHZlcnMucmVzb2x2ZShKU09OLnBhcnNlKGRhdGEpKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgICAgIHJlc29sdmVycy5yZWplY3QobmV3IFR5cGVFcnJvcihcImNvdWxkIG5vdCBwYXJzZSByZXN1bHQ6IFwiICsgZXJyLm1lc3NhZ2UsIHsgY2F1c2U6IGVyciB9KSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogSGFuZGxlcyB0aGUgZXJyb3IgZnJvbSBhIGNhbGwgcmVxdWVzdC5cbiAqXG4gKiBAcGFyYW0gaWQgLSBUaGUgaWQgb2YgdGhlIHByb21pc2UgaGFuZGxlci5cbiAqIEBwYXJhbSBkYXRhIC0gVGhlIGVycm9yIGRhdGEgdG8gcmVqZWN0IHRoZSBwcm9taXNlIGhhbmRsZXIgd2l0aC5cbiAqIEBwYXJhbSBpc0pTT04gLSBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZGF0YSBpcyBKU09OIG9yIG5vdC5cbiAqL1xuZnVuY3Rpb24gZXJyb3JIYW5kbGVyKGlkOiBzdHJpbmcsIGRhdGE6IHN0cmluZywgaXNKU09OOiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgcmVzb2x2ZXJzID0gZ2V0QW5kRGVsZXRlUmVzcG9uc2UoaWQpO1xuICAgIGlmICghcmVzb2x2ZXJzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWlzSlNPTikge1xuICAgICAgICByZXNvbHZlcnMucmVqZWN0KG5ldyBFcnJvcihkYXRhKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IGVycm9yOiBhbnk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBlcnJvciA9IEpTT04ucGFyc2UoZGF0YSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgICAgICByZXNvbHZlcnMucmVqZWN0KG5ldyBUeXBlRXJyb3IoXCJjb3VsZCBub3QgcGFyc2UgZXJyb3I6IFwiICsgZXJyLm1lc3NhZ2UsIHsgY2F1c2U6IGVyciB9KSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgb3B0aW9uczogRXJyb3JPcHRpb25zID0ge307XG4gICAgICAgIGlmIChlcnJvci5jYXVzZSkge1xuICAgICAgICAgICAgb3B0aW9ucy5jYXVzZSA9IGVycm9yLmNhdXNlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGV4Y2VwdGlvbjtcbiAgICAgICAgc3dpdGNoIChlcnJvci5raW5kKSB7XG4gICAgICAgICAgICBjYXNlIFwiUmVmZXJlbmNlRXJyb3JcIjpcbiAgICAgICAgICAgICAgICBleGNlcHRpb24gPSBuZXcgUmVmZXJlbmNlRXJyb3IoZXJyb3IubWVzc2FnZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiVHlwZUVycm9yXCI6XG4gICAgICAgICAgICAgICAgZXhjZXB0aW9uID0gbmV3IFR5cGVFcnJvcihlcnJvci5tZXNzYWdlLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJSdW50aW1lRXJyb3JcIjpcbiAgICAgICAgICAgICAgICBleGNlcHRpb24gPSBuZXcgUnVudGltZUVycm9yKGVycm9yLm1lc3NhZ2UsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBleGNlcHRpb24gPSBuZXcgRXJyb3IoZXJyb3IubWVzc2FnZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICByZXNvbHZlcnMucmVqZWN0KGV4Y2VwdGlvbik7XG4gICAgfVxufVxuXG4vKipcbiAqIFJldHJpZXZlcyBhbmQgcmVtb3ZlcyB0aGUgcmVzcG9uc2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBJRCBmcm9tIHRoZSBjYWxsUmVzcG9uc2VzIG1hcC5cbiAqXG4gKiBAcGFyYW0gaWQgLSBUaGUgSUQgb2YgdGhlIHJlc3BvbnNlIHRvIGJlIHJldHJpZXZlZCBhbmQgcmVtb3ZlZC5cbiAqIEByZXR1cm5zIFRoZSByZXNwb25zZSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBJRCwgaWYgYW55LlxuICovXG5mdW5jdGlvbiBnZXRBbmREZWxldGVSZXNwb25zZShpZDogc3RyaW5nKTogUHJvbWlzZVJlc29sdmVycyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBjYWxsUmVzcG9uc2VzLmdldChpZCk7XG4gICAgY2FsbFJlc3BvbnNlcy5kZWxldGUoaWQpO1xuICAgIHJldHVybiByZXNwb25zZTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSB1bmlxdWUgSUQgdXNpbmcgdGhlIG5hbm9pZCBsaWJyYXJ5LlxuICpcbiAqIEByZXR1cm5zIEEgdW5pcXVlIElEIHRoYXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGNhbGxSZXNwb25zZXMgc2V0LlxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZUlEKCk6IHN0cmluZyB7XG4gICAgbGV0IHJlc3VsdDtcbiAgICBkbyB7XG4gICAgICAgIHJlc3VsdCA9IG5hbm9pZCgpO1xuICAgIH0gd2hpbGUgKGNhbGxSZXNwb25zZXMuaGFzKHJlc3VsdCkpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQ2FsbCBhIGJvdW5kIG1ldGhvZCBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIGNhbGwgb3B0aW9ucy5cbiAqXG4gKiBJbiBjYXNlIG9mIGZhaWx1cmUsIHRoZSByZXR1cm5lZCBwcm9taXNlIHdpbGwgcmVqZWN0IHdpdGggYW4gZXhjZXB0aW9uXG4gKiBhbW9uZyBSZWZlcmVuY2VFcnJvciAodW5rbm93biBtZXRob2QpLCBUeXBlRXJyb3IgKHdyb25nIGFyZ3VtZW50IGNvdW50IG9yIHR5cGUpLFxuICoge0BsaW5rIFJ1bnRpbWVFcnJvcn0gKG1ldGhvZCByZXR1cm5lZCBhbiBlcnJvciksIG9yIG90aGVyIChuZXR3b3JrIG9yIGludGVybmFsIGVycm9ycykuXG4gKiBUaGUgZXhjZXB0aW9uIG1pZ2h0IGhhdmUgYSBcImNhdXNlXCIgZmllbGQgd2l0aCB0aGUgdmFsdWUgcmV0dXJuZWRcbiAqIGJ5IHRoZSBhcHBsaWNhdGlvbi0gb3Igc2VydmljZS1sZXZlbCBlcnJvciBtYXJzaGFsaW5nIGZ1bmN0aW9ucy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEEgbWV0aG9kIGNhbGwgZGVzY3JpcHRvci5cbiAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgdGhlIGNhbGwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDYWxsKG9wdGlvbnM6IENhbGxPcHRpb25zKTogQ2FuY2VsbGFibGVQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IGlkID0gZ2VuZXJhdGVJRCgpO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gQ2FuY2VsbGFibGVQcm9taXNlLndpdGhSZXNvbHZlcnM8YW55PigpO1xuICAgIGNhbGxSZXNwb25zZXMuc2V0KGlkLCB7IHJlc29sdmU6IHJlc3VsdC5yZXNvbHZlLCByZWplY3Q6IHJlc3VsdC5yZWplY3QgfSk7XG5cbiAgICBjb25zdCByZXF1ZXN0ID0gY2FsbChDYWxsQmluZGluZywgT2JqZWN0LmFzc2lnbih7IFwiY2FsbC1pZFwiOiBpZCB9LCBvcHRpb25zKSk7XG4gICAgbGV0IHJ1bm5pbmcgPSBmYWxzZTtcblxuICAgIHJlcXVlc3QudGhlbigoKSA9PiB7XG4gICAgICAgIHJ1bm5pbmcgPSB0cnVlO1xuICAgIH0sIChlcnIpID0+IHtcbiAgICAgICAgY2FsbFJlc3BvbnNlcy5kZWxldGUoaWQpO1xuICAgICAgICByZXN1bHQucmVqZWN0KGVycik7XG4gICAgfSk7XG5cbiAgICBjb25zdCBjYW5jZWwgPSAoKSA9PiB7XG4gICAgICAgIGNhbGxSZXNwb25zZXMuZGVsZXRlKGlkKTtcbiAgICAgICAgcmV0dXJuIGNhbmNlbENhbGwoQ2FuY2VsTWV0aG9kLCB7XCJjYWxsLWlkXCI6IGlkfSkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIHdoaWxlIHJlcXVlc3RpbmcgYmluZGluZyBjYWxsIGNhbmNlbGxhdGlvbjpcIiwgZXJyKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJlc3VsdC5vbmNhbmNlbGxlZCA9ICgpID0+IHtcbiAgICAgICAgaWYgKHJ1bm5pbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBjYW5jZWwoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByZXF1ZXN0LnRoZW4oY2FuY2VsKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gcmVzdWx0LnByb21pc2U7XG59XG5cbi8qKlxuICogQ2FsbHMgYSBib3VuZCBtZXRob2QgYnkgbmFtZSB3aXRoIHRoZSBzcGVjaWZpZWQgYXJndW1lbnRzLlxuICogU2VlIHtAbGluayBDYWxsfSBmb3IgZGV0YWlscy5cbiAqXG4gKiBAcGFyYW0gbWV0aG9kTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBtZXRob2QgaW4gdGhlIGZvcm1hdCAncGFja2FnZS5zdHJ1Y3QubWV0aG9kJy5cbiAqIEBwYXJhbSBhcmdzIC0gVGhlIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBtZXRob2QuXG4gKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIHRoZSBtZXRob2QgY2FsbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEJ5TmFtZShtZXRob2ROYW1lOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogQ2FuY2VsbGFibGVQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBDYWxsKHsgbWV0aG9kTmFtZSwgYXJncyB9KTtcbn1cblxuLyoqXG4gKiBDYWxscyBhIG1ldGhvZCBieSBpdHMgbnVtZXJpYyBJRCB3aXRoIHRoZSBzcGVjaWZpZWQgYXJndW1lbnRzLlxuICogU2VlIHtAbGluayBDYWxsfSBmb3IgZGV0YWlscy5cbiAqXG4gKiBAcGFyYW0gbWV0aG9kSUQgLSBUaGUgSUQgb2YgdGhlIG1ldGhvZCB0byBjYWxsLlxuICogQHBhcmFtIGFyZ3MgLSBUaGUgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIG1ldGhvZC5cbiAqIEByZXR1cm4gVGhlIHJlc3VsdCBvZiB0aGUgbWV0aG9kIGNhbGwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBCeUlEKG1ldGhvZElEOiBudW1iZXIsIC4uLmFyZ3M6IGFueVtdKTogQ2FuY2VsbGFibGVQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBDYWxsKHsgbWV0aG9kSUQsIGFyZ3MgfSk7XG59XG4iLCAiLy8gU291cmNlOiBodHRwczovL2dpdGh1Yi5jb20vaW5zcGVjdC1qcy9pcy1jYWxsYWJsZVxuXG4vLyBUaGUgTUlUIExpY2Vuc2UgKE1JVClcbi8vXG4vLyBDb3B5cmlnaHQgKGMpIDIwMTUgSm9yZGFuIEhhcmJhbmRcbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4vLyBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbi8vIFNPRlRXQVJFLlxuXG52YXIgZm5Ub1N0ciA9IEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZztcbnZhciByZWZsZWN0QXBwbHk6IHR5cGVvZiBSZWZsZWN0LmFwcGx5IHwgZmFsc2UgfCBudWxsID0gdHlwZW9mIFJlZmxlY3QgPT09ICdvYmplY3QnICYmIFJlZmxlY3QgIT09IG51bGwgJiYgUmVmbGVjdC5hcHBseTtcbnZhciBiYWRBcnJheUxpa2U6IGFueTtcbnZhciBpc0NhbGxhYmxlTWFya2VyOiBhbnk7XG5pZiAodHlwZW9mIHJlZmxlY3RBcHBseSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgT2JqZWN0LmRlZmluZVByb3BlcnR5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgYmFkQXJyYXlMaWtlID0gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAnbGVuZ3RoJywge1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgaXNDYWxsYWJsZU1hcmtlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlzQ2FsbGFibGVNYXJrZXIgPSB7fTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXRocm93LWxpdGVyYWxcbiAgICAgICAgcmVmbGVjdEFwcGx5KGZ1bmN0aW9uICgpIHsgdGhyb3cgNDI7IH0sIG51bGwsIGJhZEFycmF5TGlrZSk7XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgICBpZiAoXyAhPT0gaXNDYWxsYWJsZU1hcmtlcikge1xuICAgICAgICAgICAgcmVmbGVjdEFwcGx5ID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn0gZWxzZSB7XG4gICAgcmVmbGVjdEFwcGx5ID0gbnVsbDtcbn1cblxudmFyIGNvbnN0cnVjdG9yUmVnZXggPSAvXlxccypjbGFzc1xcYi87XG52YXIgaXNFUzZDbGFzc0ZuID0gZnVuY3Rpb24gaXNFUzZDbGFzc0Z1bmN0aW9uKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgICB2YXIgZm5TdHIgPSBmblRvU3RyLmNhbGwodmFsdWUpO1xuICAgICAgICByZXR1cm4gY29uc3RydWN0b3JSZWdleC50ZXN0KGZuU3RyKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTsgLy8gbm90IGEgZnVuY3Rpb25cbiAgICB9XG59O1xuXG52YXIgdHJ5RnVuY3Rpb25PYmplY3QgPSBmdW5jdGlvbiB0cnlGdW5jdGlvblRvU3RyKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAoaXNFUzZDbGFzc0ZuKHZhbHVlKSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAgICAgZm5Ub1N0ci5jYWxsKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufTtcbnZhciB0b1N0ciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgb2JqZWN0Q2xhc3MgPSAnW29iamVjdCBPYmplY3RdJztcbnZhciBmbkNsYXNzID0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbnZhciBnZW5DbGFzcyA9ICdbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSc7XG52YXIgZGRhQ2xhc3MgPSAnW29iamVjdCBIVE1MQWxsQ29sbGVjdGlvbl0nOyAvLyBJRSAxMVxudmFyIGRkYUNsYXNzMiA9ICdbb2JqZWN0IEhUTUwgZG9jdW1lbnQuYWxsIGNsYXNzXSc7XG52YXIgZGRhQ2xhc3MzID0gJ1tvYmplY3QgSFRNTENvbGxlY3Rpb25dJzsgLy8gSUUgOS0xMFxudmFyIGhhc1RvU3RyaW5nVGFnID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiAhIVN5bWJvbC50b1N0cmluZ1RhZzsgLy8gYmV0dGVyOiB1c2UgYGhhcy10b3N0cmluZ3RhZ2BcblxudmFyIGlzSUU2OCA9ICEoMCBpbiBbLF0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNwYXJzZS1hcnJheXMsIGNvbW1hLXNwYWNpbmdcblxudmFyIGlzRERBOiAodmFsdWU6IGFueSkgPT4gYm9vbGVhbiA9IGZ1bmN0aW9uIGlzRG9jdW1lbnREb3RBbGwoKSB7IHJldHVybiBmYWxzZTsgfTtcbmlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICdvYmplY3QnKSB7XG4gICAgLy8gRmlyZWZveCAzIGNhbm9uaWNhbGl6ZXMgRERBIHRvIHVuZGVmaW5lZCB3aGVuIGl0J3Mgbm90IGFjY2Vzc2VkIGRpcmVjdGx5XG4gICAgdmFyIGFsbCA9IGRvY3VtZW50LmFsbDtcbiAgICBpZiAodG9TdHIuY2FsbChhbGwpID09PSB0b1N0ci5jYWxsKGRvY3VtZW50LmFsbCkpIHtcbiAgICAgICAgaXNEREEgPSBmdW5jdGlvbiBpc0RvY3VtZW50RG90QWxsKHZhbHVlKSB7XG4gICAgICAgICAgICAvKiBnbG9iYWxzIGRvY3VtZW50OiBmYWxzZSAqL1xuICAgICAgICAgICAgLy8gaW4gSUUgNi04LCB0eXBlb2YgZG9jdW1lbnQuYWxsIGlzIFwib2JqZWN0XCIgYW5kIGl0J3MgdHJ1dGh5XG4gICAgICAgICAgICBpZiAoKGlzSUU2OCB8fCAhdmFsdWUpICYmICh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ciA9IHRvU3RyLmNhbGwodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RyID09PSBkZGFDbGFzc1xuICAgICAgICAgICAgICAgICAgICAgICAgfHwgc3RyID09PSBkZGFDbGFzczJcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IHN0ciA9PT0gZGRhQ2xhc3MzIC8vIG9wZXJhIDEyLjE2XG4gICAgICAgICAgICAgICAgICAgICAgICB8fCBzdHIgPT09IG9iamVjdENsYXNzIC8vIElFIDYtOFxuICAgICAgICAgICAgICAgICAgICApICYmIHZhbHVlKCcnKSA9PSBudWxsOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGVxZXFlcVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgLyoqLyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH07XG4gICAgfVxufVxuXG5mdW5jdGlvbiBpc0NhbGxhYmxlUmVmQXBwbHk8VD4odmFsdWU6IFQgfCB1bmtub3duKTogdmFsdWUgaXMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkgIHtcbiAgICBpZiAoaXNEREEodmFsdWUpKSB7IHJldHVybiB0cnVlOyB9XG4gICAgaWYgKCF2YWx1ZSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgdHJ5IHtcbiAgICAgICAgKHJlZmxlY3RBcHBseSBhcyBhbnkpKHZhbHVlLCBudWxsLCBiYWRBcnJheUxpa2UpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGUgIT09IGlzQ2FsbGFibGVNYXJrZXIpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgfVxuICAgIHJldHVybiAhaXNFUzZDbGFzc0ZuKHZhbHVlKSAmJiB0cnlGdW5jdGlvbk9iamVjdCh2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIGlzQ2FsbGFibGVOb1JlZkFwcGx5PFQ+KHZhbHVlOiBUIHwgdW5rbm93bik6IHZhbHVlIGlzICguLi5hcmdzOiBhbnlbXSkgPT4gYW55IHtcbiAgICBpZiAoaXNEREEodmFsdWUpKSB7IHJldHVybiB0cnVlOyB9XG4gICAgaWYgKCF2YWx1ZSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgaWYgKGhhc1RvU3RyaW5nVGFnKSB7IHJldHVybiB0cnlGdW5jdGlvbk9iamVjdCh2YWx1ZSk7IH1cbiAgICBpZiAoaXNFUzZDbGFzc0ZuKHZhbHVlKSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICB2YXIgc3RyQ2xhc3MgPSB0b1N0ci5jYWxsKHZhbHVlKTtcbiAgICBpZiAoc3RyQ2xhc3MgIT09IGZuQ2xhc3MgJiYgc3RyQ2xhc3MgIT09IGdlbkNsYXNzICYmICEoL15cXFtvYmplY3QgSFRNTC8pLnRlc3Qoc3RyQ2xhc3MpKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIHJldHVybiB0cnlGdW5jdGlvbk9iamVjdCh2YWx1ZSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCByZWZsZWN0QXBwbHkgPyBpc0NhbGxhYmxlUmVmQXBwbHkgOiBpc0NhbGxhYmxlTm9SZWZBcHBseTtcbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuaW1wb3J0IGlzQ2FsbGFibGUgZnJvbSBcIi4vY2FsbGFibGUuanNcIjtcblxuLyoqXG4gKiBFeGNlcHRpb24gY2xhc3MgdGhhdCB3aWxsIGJlIHVzZWQgYXMgcmVqZWN0aW9uIHJlYXNvblxuICogaW4gY2FzZSBhIHtAbGluayBDYW5jZWxsYWJsZVByb21pc2V9IGlzIGNhbmNlbGxlZCBzdWNjZXNzZnVsbHkuXG4gKlxuICogVGhlIHZhbHVlIG9mIHRoZSB7QGxpbmsgbmFtZX0gcHJvcGVydHkgaXMgdGhlIHN0cmluZyBgXCJDYW5jZWxFcnJvclwiYC5cbiAqIFRoZSB2YWx1ZSBvZiB0aGUge0BsaW5rIGNhdXNlfSBwcm9wZXJ0eSBpcyB0aGUgY2F1c2UgcGFzc2VkIHRvIHRoZSBjYW5jZWwgbWV0aG9kLCBpZiBhbnkuXG4gKi9cbmV4cG9ydCBjbGFzcyBDYW5jZWxFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGBDYW5jZWxFcnJvcmAgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgZXJyb3IgbWVzc2FnZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gYmUgZm9yd2FyZGVkIHRvIHRoZSBFcnJvciBjb25zdHJ1Y3Rvci5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlPzogc3RyaW5nLCBvcHRpb25zPzogRXJyb3JPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLm5hbWUgPSBcIkNhbmNlbEVycm9yXCI7XG4gICAgfVxufVxuXG4vKipcbiAqIEV4Y2VwdGlvbiBjbGFzcyB0aGF0IHdpbGwgYmUgcmVwb3J0ZWQgYXMgYW4gdW5oYW5kbGVkIHJlamVjdGlvblxuICogaW4gY2FzZSBhIHtAbGluayBDYW5jZWxsYWJsZVByb21pc2V9IHJlamVjdHMgYWZ0ZXIgYmVpbmcgY2FuY2VsbGVkLFxuICogb3Igd2hlbiB0aGUgYG9uY2FuY2VsbGVkYCBjYWxsYmFjayB0aHJvd3Mgb3IgcmVqZWN0cy5cbiAqXG4gKiBUaGUgdmFsdWUgb2YgdGhlIHtAbGluayBuYW1lfSBwcm9wZXJ0eSBpcyB0aGUgc3RyaW5nIGBcIkNhbmNlbGxlZFJlamVjdGlvbkVycm9yXCJgLlxuICogVGhlIHZhbHVlIG9mIHRoZSB7QGxpbmsgY2F1c2V9IHByb3BlcnR5IGlzIHRoZSByZWFzb24gdGhlIHByb21pc2UgcmVqZWN0ZWQgd2l0aC5cbiAqXG4gKiBCZWNhdXNlIHRoZSBvcmlnaW5hbCBwcm9taXNlIHdhcyBjYW5jZWxsZWQsXG4gKiBhIHdyYXBwZXIgcHJvbWlzZSB3aWxsIGJlIHBhc3NlZCB0byB0aGUgdW5oYW5kbGVkIHJlamVjdGlvbiBsaXN0ZW5lciBpbnN0ZWFkLlxuICogVGhlIHtAbGluayBwcm9taXNlfSBwcm9wZXJ0eSBob2xkcyBhIHJlZmVyZW5jZSB0byB0aGUgb3JpZ2luYWwgcHJvbWlzZS5cbiAqL1xuZXhwb3J0IGNsYXNzIENhbmNlbGxlZFJlamVjdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIC8qKlxuICAgICAqIEhvbGRzIGEgcmVmZXJlbmNlIHRvIHRoZSBwcm9taXNlIHRoYXQgd2FzIGNhbmNlbGxlZCBhbmQgdGhlbiByZWplY3RlZC5cbiAgICAgKi9cbiAgICBwcm9taXNlOiBDYW5jZWxsYWJsZVByb21pc2U8dW5rbm93bj47XG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGBDYW5jZWxsZWRSZWplY3Rpb25FcnJvcmAgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHByb21pc2UgLSBUaGUgcHJvbWlzZSB0aGF0IGNhdXNlZCB0aGUgZXJyb3Igb3JpZ2luYWxseS5cbiAgICAgKiBAcGFyYW0gcmVhc29uIC0gVGhlIHJlamVjdGlvbiByZWFzb24uXG4gICAgICogQHBhcmFtIGluZm8gLSBBbiBvcHRpb25hbCBpbmZvcm1hdGl2ZSBtZXNzYWdlIHNwZWNpZnlpbmcgdGhlIGNpcmN1bXN0YW5jZXMgaW4gd2hpY2ggdGhlIGVycm9yIHdhcyB0aHJvd24uXG4gICAgICogICAgICAgICAgICAgICBEZWZhdWx0cyB0byB0aGUgc3RyaW5nIGBcIlVuaGFuZGxlZCByZWplY3Rpb24gaW4gY2FuY2VsbGVkIHByb21pc2UuXCJgLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHByb21pc2U6IENhbmNlbGxhYmxlUHJvbWlzZTx1bmtub3duPiwgcmVhc29uPzogYW55LCBpbmZvPzogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKChpbmZvID8/IFwiVW5oYW5kbGVkIHJlamVjdGlvbiBpbiBjYW5jZWxsZWQgcHJvbWlzZS5cIikgKyBcIiBSZWFzb246IFwiICsgZXJyb3JNZXNzYWdlKHJlYXNvbiksIHsgY2F1c2U6IHJlYXNvbiB9KTtcbiAgICAgICAgdGhpcy5wcm9taXNlID0gcHJvbWlzZTtcbiAgICAgICAgdGhpcy5uYW1lID0gXCJDYW5jZWxsZWRSZWplY3Rpb25FcnJvclwiO1xuICAgIH1cbn1cblxudHlwZSBDYW5jZWxsYWJsZVByb21pc2VSZXNvbHZlcjxUPiA9ICh2YWx1ZTogVCB8IFByb21pc2VMaWtlPFQ+IHwgQ2FuY2VsbGFibGVQcm9taXNlTGlrZTxUPikgPT4gdm9pZDtcbnR5cGUgQ2FuY2VsbGFibGVQcm9taXNlUmVqZWN0b3IgPSAocmVhc29uPzogYW55KSA9PiB2b2lkO1xudHlwZSBDYW5jZWxsYWJsZVByb21pc2VDYW5jZWxsZXIgPSAoY2F1c2U/OiBhbnkpID0+IHZvaWQgfCBQcm9taXNlTGlrZTx2b2lkPjtcbnR5cGUgQ2FuY2VsbGFibGVQcm9taXNlRXhlY3V0b3I8VD4gPSAocmVzb2x2ZTogQ2FuY2VsbGFibGVQcm9taXNlUmVzb2x2ZXI8VD4sIHJlamVjdDogQ2FuY2VsbGFibGVQcm9taXNlUmVqZWN0b3IpID0+IHZvaWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FuY2VsbGFibGVQcm9taXNlTGlrZTxUPiB7XG4gICAgdGhlbjxUUmVzdWx0MSA9IFQsIFRSZXN1bHQyID0gbmV2ZXI+KG9uZnVsZmlsbGVkPzogKCh2YWx1ZTogVCkgPT4gVFJlc3VsdDEgfCBQcm9taXNlTGlrZTxUUmVzdWx0MT4gfCBDYW5jZWxsYWJsZVByb21pc2VMaWtlPFRSZXN1bHQxPikgfCB1bmRlZmluZWQgfCBudWxsLCBvbnJlamVjdGVkPzogKChyZWFzb246IGFueSkgPT4gVFJlc3VsdDIgfCBQcm9taXNlTGlrZTxUUmVzdWx0Mj4gfCBDYW5jZWxsYWJsZVByb21pc2VMaWtlPFRSZXN1bHQyPikgfCB1bmRlZmluZWQgfCBudWxsKTogQ2FuY2VsbGFibGVQcm9taXNlTGlrZTxUUmVzdWx0MSB8IFRSZXN1bHQyPjtcbiAgICBjYW5jZWwoY2F1c2U/OiBhbnkpOiB2b2lkIHwgUHJvbWlzZUxpa2U8dm9pZD47XG59XG5cbi8qKlxuICogV3JhcHMgYSBjYW5jZWxsYWJsZSBwcm9taXNlIGFsb25nIHdpdGggaXRzIHJlc29sdXRpb24gbWV0aG9kcy5cbiAqIFRoZSBgb25jYW5jZWxsZWRgIGZpZWxkIHdpbGwgYmUgbnVsbCBpbml0aWFsbHkgYnV0IG1heSBiZSBzZXQgdG8gcHJvdmlkZSBhIGN1c3RvbSBjYW5jZWxsYXRpb24gZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FuY2VsbGFibGVQcm9taXNlV2l0aFJlc29sdmVyczxUPiB7XG4gICAgcHJvbWlzZTogQ2FuY2VsbGFibGVQcm9taXNlPFQ+O1xuICAgIHJlc29sdmU6IENhbmNlbGxhYmxlUHJvbWlzZVJlc29sdmVyPFQ+O1xuICAgIHJlamVjdDogQ2FuY2VsbGFibGVQcm9taXNlUmVqZWN0b3I7XG4gICAgb25jYW5jZWxsZWQ6IENhbmNlbGxhYmxlUHJvbWlzZUNhbmNlbGxlciB8IG51bGw7XG59XG5cbmludGVyZmFjZSBDYW5jZWxsYWJsZVByb21pc2VTdGF0ZSB7XG4gICAgcmVhZG9ubHkgcm9vdDogQ2FuY2VsbGFibGVQcm9taXNlU3RhdGU7XG4gICAgcmVzb2x2aW5nOiBib29sZWFuO1xuICAgIHNldHRsZWQ6IGJvb2xlYW47XG4gICAgcmVhc29uPzogQ2FuY2VsRXJyb3I7XG59XG5cbi8vIFByaXZhdGUgZmllbGQgbmFtZXMuXG5jb25zdCBiYXJyaWVyU3ltID0gU3ltYm9sKFwiYmFycmllclwiKTtcbmNvbnN0IGNhbmNlbEltcGxTeW0gPSBTeW1ib2woXCJjYW5jZWxJbXBsXCIpO1xuY29uc3Qgc3BlY2llcyA9IFN5bWJvbC5zcGVjaWVzID8/IFN5bWJvbChcInNwZWNpZXNQb2x5ZmlsbFwiKTtcblxuLyoqXG4gKiBBIHByb21pc2Ugd2l0aCBhbiBhdHRhY2hlZCBtZXRob2QgZm9yIGNhbmNlbGxpbmcgbG9uZy1ydW5uaW5nIG9wZXJhdGlvbnMgKHNlZSB7QGxpbmsgQ2FuY2VsbGFibGVQcm9taXNlI2NhbmNlbH0pLlxuICogQ2FuY2VsbGF0aW9uIGNhbiBvcHRpb25hbGx5IGJlIGJvdW5kIHRvIGFuIHtAbGluayBBYm9ydFNpZ25hbH1cbiAqIGZvciBiZXR0ZXIgY29tcG9zYWJpbGl0eSAoc2VlIHtAbGluayBDYW5jZWxsYWJsZVByb21pc2UjY2FuY2VsT259KS5cbiAqXG4gKiBDYW5jZWxsaW5nIGEgcGVuZGluZyBwcm9taXNlIHdpbGwgcmVzdWx0IGluIGFuIGltbWVkaWF0ZSByZWplY3Rpb25cbiAqIHdpdGggYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIENhbmNlbEVycm9yfSBhcyByZWFzb24sXG4gKiBidXQgd2hvZXZlciBzdGFydGVkIHRoZSBwcm9taXNlIHdpbGwgYmUgcmVzcG9uc2libGVcbiAqIGZvciBhY3R1YWxseSBhYm9ydGluZyB0aGUgdW5kZXJseWluZyBvcGVyYXRpb24uXG4gKiBUbyB0aGlzIHB1cnBvc2UsIHRoZSBjb25zdHJ1Y3RvciBhbmQgYWxsIGNoYWluaW5nIG1ldGhvZHNcbiAqIGFjY2VwdCBvcHRpb25hbCBjYW5jZWxsYXRpb24gY2FsbGJhY2tzLlxuICpcbiAqIElmIGEgYENhbmNlbGxhYmxlUHJvbWlzZWAgc3RpbGwgcmVzb2x2ZXMgYWZ0ZXIgaGF2aW5nIGJlZW4gY2FuY2VsbGVkLFxuICogdGhlIHJlc3VsdCB3aWxsIGJlIGRpc2NhcmRlZC4gSWYgaXQgcmVqZWN0cywgdGhlIHJlYXNvblxuICogd2lsbCBiZSByZXBvcnRlZCBhcyBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uLFxuICogd3JhcHBlZCBpbiBhIHtAbGluayBDYW5jZWxsZWRSZWplY3Rpb25FcnJvcn0gaW5zdGFuY2UuXG4gKiBUbyBmYWNpbGl0YXRlIHRoZSBoYW5kbGluZyBvZiBjYW5jZWxsYXRpb24gcmVxdWVzdHMsXG4gKiBjYW5jZWxsZWQgYENhbmNlbGxhYmxlUHJvbWlzZWBzIHdpbGwgX25vdF8gcmVwb3J0IHVuaGFuZGxlZCBgQ2FuY2VsRXJyb3Jgc1xuICogd2hvc2UgYGNhdXNlYCBmaWVsZCBpcyB0aGUgc2FtZSBhcyB0aGUgb25lIHdpdGggd2hpY2ggdGhlIGN1cnJlbnQgcHJvbWlzZSB3YXMgY2FuY2VsbGVkLlxuICpcbiAqIEFsbCB1c3VhbCBwcm9taXNlIG1ldGhvZHMgYXJlIGRlZmluZWQgYW5kIHJldHVybiBhIGBDYW5jZWxsYWJsZVByb21pc2VgXG4gKiB3aG9zZSBjYW5jZWwgbWV0aG9kIHdpbGwgY2FuY2VsIHRoZSBwYXJlbnQgb3BlcmF0aW9uIGFzIHdlbGwsIHByb3BhZ2F0aW5nIHRoZSBjYW5jZWxsYXRpb24gcmVhc29uXG4gKiB1cHdhcmRzIHRocm91Z2ggcHJvbWlzZSBjaGFpbnMuXG4gKiBDb252ZXJzZWx5LCBjYW5jZWxsaW5nIGEgcHJvbWlzZSB3aWxsIG5vdCBhdXRvbWF0aWNhbGx5IGNhbmNlbCBkZXBlbmRlbnQgcHJvbWlzZXMgZG93bnN0cmVhbTpcbiAqIGBgYHRzXG4gKiBsZXQgcm9vdCA9IG5ldyBDYW5jZWxsYWJsZVByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4geyAuLi4gfSk7XG4gKiBsZXQgY2hpbGQxID0gcm9vdC50aGVuKCgpID0+IHsgLi4uIH0pO1xuICogbGV0IGNoaWxkMiA9IGNoaWxkMS50aGVuKCgpID0+IHsgLi4uIH0pO1xuICogbGV0IGNoaWxkMyA9IHJvb3QuY2F0Y2goKCkgPT4geyAuLi4gfSk7XG4gKiBjaGlsZDEuY2FuY2VsKCk7IC8vIENhbmNlbHMgY2hpbGQxIGFuZCByb290LCBidXQgbm90IGNoaWxkMiBvciBjaGlsZDNcbiAqIGBgYFxuICogQ2FuY2VsbGluZyBhIHByb21pc2UgdGhhdCBoYXMgYWxyZWFkeSBzZXR0bGVkIGlzIHNhZmUgYW5kIGhhcyBubyBjb25zZXF1ZW5jZS5cbiAqXG4gKiBUaGUgYGNhbmNlbGAgbWV0aG9kIHJldHVybnMgYSBwcm9taXNlIHRoYXQgX2Fsd2F5cyBmdWxmaWxsc19cbiAqIGFmdGVyIHRoZSB3aG9sZSBjaGFpbiBoYXMgcHJvY2Vzc2VkIHRoZSBjYW5jZWwgcmVxdWVzdFxuICogYW5kIGFsbCBhdHRhY2hlZCBjYWxsYmFja3MgdXAgdG8gdGhhdCBtb21lbnQgaGF2ZSBydW4uXG4gKlxuICogQWxsIEVTMjAyNCBwcm9taXNlIG1ldGhvZHMgKHN0YXRpYyBhbmQgaW5zdGFuY2UpIGFyZSBkZWZpbmVkIG9uIENhbmNlbGxhYmxlUHJvbWlzZSxcbiAqIGJ1dCBhY3R1YWwgYXZhaWxhYmlsaXR5IG1heSB2YXJ5IHdpdGggT1Mvd2VidmlldyB2ZXJzaW9uLlxuICpcbiAqIEluIGxpbmUgd2l0aCB0aGUgcHJvcG9zYWwgYXQgaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtcm0tYnVpbHRpbi1zdWJjbGFzc2luZyxcbiAqIGBDYW5jZWxsYWJsZVByb21pc2VgIGRvZXMgbm90IHN1cHBvcnQgdHJhbnNwYXJlbnQgc3ViY2xhc3NpbmcuXG4gKiBFeHRlbmRlcnMgc2hvdWxkIHRha2UgY2FyZSB0byBwcm92aWRlIHRoZWlyIG93biBtZXRob2QgaW1wbGVtZW50YXRpb25zLlxuICogVGhpcyBtaWdodCBiZSByZWNvbnNpZGVyZWQgaW4gY2FzZSB0aGUgcHJvcG9zYWwgaXMgcmV0aXJlZC5cbiAqXG4gKiBDYW5jZWxsYWJsZVByb21pc2UgaXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgRE9NIFByb21pc2Ugb2JqZWN0XG4gKiBhbmQgaXMgY29tcGxpYW50IHdpdGggdGhlIFtQcm9taXNlcy9BKyBzcGVjaWZpY2F0aW9uXShodHRwczovL3Byb21pc2VzYXBsdXMuY29tLylcbiAqIChpdCBwYXNzZXMgdGhlIFtjb21wbGlhbmNlIHN1aXRlXShodHRwczovL2dpdGh1Yi5jb20vcHJvbWlzZXMtYXBsdXMvcHJvbWlzZXMtdGVzdHMpKVxuICogaWYgc28gaXMgdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBDYW5jZWxsYWJsZVByb21pc2U8VD4gZXh0ZW5kcyBQcm9taXNlPFQ+IGltcGxlbWVudHMgUHJvbWlzZUxpa2U8VD4sIENhbmNlbGxhYmxlUHJvbWlzZUxpa2U8VD4ge1xuICAgIC8vIFByaXZhdGUgZmllbGRzLlxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBwcml2YXRlIFtiYXJyaWVyU3ltXSE6IFBhcnRpYWw8UHJvbWlzZVdpdGhSZXNvbHZlcnM8dm9pZD4+IHwgbnVsbDtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBbY2FuY2VsSW1wbFN5bV0hOiAocmVhc29uOiBDYW5jZWxFcnJvcikgPT4gdm9pZCB8IFByb21pc2VMaWtlPHZvaWQ+O1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBgQ2FuY2VsbGFibGVQcm9taXNlYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBleGVjdXRvciAtIEEgY2FsbGJhY2sgdXNlZCB0byBpbml0aWFsaXplIHRoZSBwcm9taXNlLiBUaGlzIGNhbGxiYWNrIGlzIHBhc3NlZCB0d28gYXJndW1lbnRzOlxuICAgICAqICAgICAgICAgICAgICAgICAgIGEgYHJlc29sdmVgIGNhbGxiYWNrIHVzZWQgdG8gcmVzb2x2ZSB0aGUgcHJvbWlzZSB3aXRoIGEgdmFsdWVcbiAgICAgKiAgICAgICAgICAgICAgICAgICBvciB0aGUgcmVzdWx0IG9mIGFub3RoZXIgcHJvbWlzZSAocG9zc2libHkgY2FuY2VsbGFibGUpLFxuICAgICAqICAgICAgICAgICAgICAgICAgIGFuZCBhIGByZWplY3RgIGNhbGxiYWNrIHVzZWQgdG8gcmVqZWN0IHRoZSBwcm9taXNlIHdpdGggYSBwcm92aWRlZCByZWFzb24gb3IgZXJyb3IuXG4gICAgICogICAgICAgICAgICAgICAgICAgSWYgdGhlIHZhbHVlIHByb3ZpZGVkIHRvIHRoZSBgcmVzb2x2ZWAgY2FsbGJhY2sgaXMgYSB0aGVuYWJsZSBfYW5kXyBjYW5jZWxsYWJsZSBvYmplY3RcbiAgICAgKiAgICAgICAgICAgICAgICAgICAoaXQgaGFzIGEgYHRoZW5gIF9hbmRfIGEgYGNhbmNlbGAgbWV0aG9kKSxcbiAgICAgKiAgICAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb24gcmVxdWVzdHMgd2lsbCBiZSBmb3J3YXJkZWQgdG8gdGhhdCBvYmplY3QgYW5kIHRoZSBvbmNhbmNlbGxlZCB3aWxsIG5vdCBiZSBpbnZva2VkIGFueW1vcmUuXG4gICAgICogICAgICAgICAgICAgICAgICAgSWYgYW55IG9uZSBvZiB0aGUgdHdvIGNhbGxiYWNrcyBpcyBjYWxsZWQgX2FmdGVyXyB0aGUgcHJvbWlzZSBoYXMgYmVlbiBjYW5jZWxsZWQsXG4gICAgICogICAgICAgICAgICAgICAgICAgdGhlIHByb3ZpZGVkIHZhbHVlcyB3aWxsIGJlIGNhbmNlbGxlZCBhbmQgcmVzb2x2ZWQgYXMgdXN1YWwsXG4gICAgICogICAgICAgICAgICAgICAgICAgYnV0IHRoZWlyIHJlc3VsdHMgd2lsbCBiZSBkaXNjYXJkZWQuXG4gICAgICogICAgICAgICAgICAgICAgICAgSG93ZXZlciwgaWYgdGhlIHJlc29sdXRpb24gcHJvY2VzcyB1bHRpbWF0ZWx5IGVuZHMgdXAgaW4gYSByZWplY3Rpb25cbiAgICAgKiAgICAgICAgICAgICAgICAgICB0aGF0IGlzIG5vdCBkdWUgdG8gY2FuY2VsbGF0aW9uLCB0aGUgcmVqZWN0aW9uIHJlYXNvblxuICAgICAqICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgd3JhcHBlZCBpbiBhIHtAbGluayBDYW5jZWxsZWRSZWplY3Rpb25FcnJvcn1cbiAgICAgKiAgICAgICAgICAgICAgICAgICBhbmQgYnViYmxlZCB1cCBhcyBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uLlxuICAgICAqIEBwYXJhbSBvbmNhbmNlbGxlZCAtIEl0IGlzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBlbnN1cmUgdGhhdCBhbnkgb3BlcmF0aW9uXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgc3RhcnRlZCBieSB0aGUgZXhlY3V0b3IgaXMgcHJvcGVybHkgaGFsdGVkIHVwb24gY2FuY2VsbGF0aW9uLlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIFRoaXMgb3B0aW9uYWwgY2FsbGJhY2sgY2FuIGJlIHVzZWQgdG8gdGhhdCBwdXJwb3NlLlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIEl0IHdpbGwgYmUgY2FsbGVkIF9zeW5jaHJvbm91c2x5XyB3aXRoIGEgY2FuY2VsbGF0aW9uIGNhdXNlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgd2hlbiBjYW5jZWxsYXRpb24gaXMgcmVxdWVzdGVkLCBfYWZ0ZXJfIHRoZSBwcm9taXNlIGhhcyBhbHJlYWR5IHJlamVjdGVkXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgd2l0aCBhIHtAbGluayBDYW5jZWxFcnJvcn0sIGJ1dCBfYmVmb3JlX1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgIGFueSB7QGxpbmsgdGhlbn0ve0BsaW5rIGNhdGNofS97QGxpbmsgZmluYWxseX0gY2FsbGJhY2sgcnVucy5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgY2FsbGJhY2sgcmV0dXJucyBhIHRoZW5hYmxlLCB0aGUgcHJvbWlzZSByZXR1cm5lZCBmcm9tIHtAbGluayBjYW5jZWx9XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgd2lsbCBvbmx5IGZ1bGZpbGwgYWZ0ZXIgdGhlIGZvcm1lciBoYXMgc2V0dGxlZC5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBVbmhhbmRsZWQgZXhjZXB0aW9ucyBvciByZWplY3Rpb25zIGZyb20gdGhlIGNhbGxiYWNrIHdpbGwgYmUgd3JhcHBlZFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIGluIGEge0BsaW5rIENhbmNlbGxlZFJlamVjdGlvbkVycm9yfSBhbmQgYnViYmxlZCB1cCBhcyB1bmhhbmRsZWQgcmVqZWN0aW9ucy5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgYHJlc29sdmVgIGNhbGxiYWNrIGlzIGNhbGxlZCBiZWZvcmUgY2FuY2VsbGF0aW9uIHdpdGggYSBjYW5jZWxsYWJsZSBwcm9taXNlLFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyBvbiB0aGlzIHByb21pc2Ugd2lsbCBiZSBkaXZlcnRlZCB0byB0aGF0IHByb21pc2UsXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZSBvcmlnaW5hbCBgb25jYW5jZWxsZWRgIGNhbGxiYWNrIHdpbGwgYmUgZGlzY2FyZGVkLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGV4ZWN1dG9yOiBDYW5jZWxsYWJsZVByb21pc2VFeGVjdXRvcjxUPiwgb25jYW5jZWxsZWQ/OiBDYW5jZWxsYWJsZVByb21pc2VDYW5jZWxsZXIpIHtcbiAgICAgICAgbGV0IHJlc29sdmUhOiAodmFsdWU6IFQgfCBQcm9taXNlTGlrZTxUPikgPT4gdm9pZDtcbiAgICAgICAgbGV0IHJlamVjdCE6IChyZWFzb24/OiBhbnkpID0+IHZvaWQ7XG4gICAgICAgIHN1cGVyKChyZXMsIHJlaikgPT4geyByZXNvbHZlID0gcmVzOyByZWplY3QgPSByZWo7IH0pO1xuXG4gICAgICAgIGlmICgodGhpcy5jb25zdHJ1Y3RvciBhcyBhbnkpW3NwZWNpZXNdICE9PSBQcm9taXNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2FuY2VsbGFibGVQcm9taXNlIGRvZXMgbm90IHN1cHBvcnQgdHJhbnNwYXJlbnQgc3ViY2xhc3NpbmcuIFBsZWFzZSByZWZyYWluIGZyb20gb3ZlcnJpZGluZyB0aGUgW1N5bWJvbC5zcGVjaWVzXSBzdGF0aWMgcHJvcGVydHkuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHByb21pc2U6IENhbmNlbGxhYmxlUHJvbWlzZVdpdGhSZXNvbHZlcnM8VD4gPSB7XG4gICAgICAgICAgICBwcm9taXNlOiB0aGlzLFxuICAgICAgICAgICAgcmVzb2x2ZSxcbiAgICAgICAgICAgIHJlamVjdCxcbiAgICAgICAgICAgIGdldCBvbmNhbmNlbGxlZCgpIHsgcmV0dXJuIG9uY2FuY2VsbGVkID8/IG51bGw7IH0sXG4gICAgICAgICAgICBzZXQgb25jYW5jZWxsZWQoY2IpIHsgb25jYW5jZWxsZWQgPSBjYiA/PyB1bmRlZmluZWQ7IH1cbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBzdGF0ZTogQ2FuY2VsbGFibGVQcm9taXNlU3RhdGUgPSB7XG4gICAgICAgICAgICBnZXQgcm9vdCgpIHsgcmV0dXJuIHN0YXRlOyB9LFxuICAgICAgICAgICAgcmVzb2x2aW5nOiBmYWxzZSxcbiAgICAgICAgICAgIHNldHRsZWQ6IGZhbHNlXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gU2V0dXAgY2FuY2VsbGF0aW9uIHN5c3RlbS5cbiAgICAgICAgdm9pZCBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgICAgICAgICBbYmFycmllclN5bV06IHtcbiAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW2NhbmNlbEltcGxTeW1dOiB7XG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGNhbmNlbGxlckZvcihwcm9taXNlLCBzdGF0ZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUnVuIHRoZSBhY3R1YWwgZXhlY3V0b3IuXG4gICAgICAgIGNvbnN0IHJlamVjdG9yID0gcmVqZWN0b3JGb3IocHJvbWlzZSwgc3RhdGUpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZXhlY3V0b3IocmVzb2x2ZXJGb3IocHJvbWlzZSwgc3RhdGUpLCByZWplY3Rvcik7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKHN0YXRlLnJlc29sdmluZykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVW5oYW5kbGVkIGV4Y2VwdGlvbiBpbiBDYW5jZWxsYWJsZVByb21pc2UgZXhlY3V0b3IuXCIsIGVycik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlamVjdG9yKGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYW5jZWxzIGltbWVkaWF0ZWx5IHRoZSBleGVjdXRpb24gb2YgdGhlIG9wZXJhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBwcm9taXNlLlxuICAgICAqIFRoZSBwcm9taXNlIHJlamVjdHMgd2l0aCBhIHtAbGluayBDYW5jZWxFcnJvcn0gaW5zdGFuY2UgYXMgcmVhc29uLFxuICAgICAqIHdpdGggdGhlIHtAbGluayBDYW5jZWxFcnJvciNjYXVzZX0gcHJvcGVydHkgc2V0IHRvIHRoZSBnaXZlbiBhcmd1bWVudCwgaWYgYW55LlxuICAgICAqXG4gICAgICogSGFzIG5vIGVmZmVjdCBpZiBjYWxsZWQgYWZ0ZXIgdGhlIHByb21pc2UgaGFzIGFscmVhZHkgc2V0dGxlZDtcbiAgICAgKiByZXBlYXRlZCBjYWxscyBpbiBwYXJ0aWN1bGFyIGFyZSBzYWZlLCBidXQgb25seSB0aGUgZmlyc3Qgb25lXG4gICAgICogd2lsbCBzZXQgdGhlIGNhbmNlbGxhdGlvbiBjYXVzZS5cbiAgICAgKlxuICAgICAqIFRoZSBgQ2FuY2VsRXJyb3JgIGV4Y2VwdGlvbiBfbmVlZCBub3RfIGJlIGhhbmRsZWQgZXhwbGljaXRseSBfb24gdGhlIHByb21pc2VzIHRoYXQgYXJlIGJlaW5nIGNhbmNlbGxlZDpfXG4gICAgICogY2FuY2VsbGluZyBhIHByb21pc2Ugd2l0aCBubyBhdHRhY2hlZCByZWplY3Rpb24gaGFuZGxlciBkb2VzIG5vdCB0cmlnZ2VyIGFuIHVuaGFuZGxlZCByZWplY3Rpb24gZXZlbnQuXG4gICAgICogVGhlcmVmb3JlLCB0aGUgZm9sbG93aW5nIGlkaW9tcyBhcmUgYWxsIGVxdWFsbHkgY29ycmVjdDpcbiAgICAgKiBgYGB0c1xuICAgICAqIG5ldyBDYW5jZWxsYWJsZVByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4geyAuLi4gfSkuY2FuY2VsKCk7XG4gICAgICogbmV3IENhbmNlbGxhYmxlUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7IC4uLiB9KS50aGVuKC4uLikuY2FuY2VsKCk7XG4gICAgICogbmV3IENhbmNlbGxhYmxlUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7IC4uLiB9KS50aGVuKC4uLikuY2F0Y2goLi4uKS5jYW5jZWwoKTtcbiAgICAgKiBgYGBcbiAgICAgKiBXaGVuZXZlciBzb21lIGNhbmNlbGxlZCBwcm9taXNlIGluIGEgY2hhaW4gcmVqZWN0cyB3aXRoIGEgYENhbmNlbEVycm9yYFxuICAgICAqIHdpdGggdGhlIHNhbWUgY2FuY2VsbGF0aW9uIGNhdXNlIGFzIGl0c2VsZiwgdGhlIGVycm9yIHdpbGwgYmUgZGlzY2FyZGVkIHNpbGVudGx5LlxuICAgICAqIEhvd2V2ZXIsIHRoZSBgQ2FuY2VsRXJyb3JgIF93aWxsIHN0aWxsIGJlIGRlbGl2ZXJlZF8gdG8gYWxsIGF0dGFjaGVkIHJlamVjdGlvbiBoYW5kbGVyc1xuICAgICAqIGFkZGVkIGJ5IHtAbGluayB0aGVufSBhbmQgcmVsYXRlZCBtZXRob2RzOlxuICAgICAqIGBgYHRzXG4gICAgICogbGV0IGNhbmNlbGxhYmxlID0gbmV3IENhbmNlbGxhYmxlUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7IC4uLiB9KTtcbiAgICAgKiBjYW5jZWxsYWJsZS50aGVuKCgpID0+IHsgLi4uIH0pLmNhdGNoKGNvbnNvbGUubG9nKTtcbiAgICAgKiBjYW5jZWxsYWJsZS5jYW5jZWwoKTsgLy8gQSBDYW5jZWxFcnJvciBpcyBwcmludGVkIHRvIHRoZSBjb25zb2xlLlxuICAgICAqIGBgYFxuICAgICAqIElmIHRoZSBgQ2FuY2VsRXJyb3JgIGlzIG5vdCBoYW5kbGVkIGRvd25zdHJlYW0gYnkgdGhlIHRpbWUgaXQgcmVhY2hlc1xuICAgICAqIGEgX25vbi1jYW5jZWxsZWRfIHByb21pc2UsIGl0IF93aWxsXyB0cmlnZ2VyIGFuIHVuaGFuZGxlZCByZWplY3Rpb24gZXZlbnQsXG4gICAgICoganVzdCBsaWtlIG5vcm1hbCByZWplY3Rpb25zIHdvdWxkOlxuICAgICAqIGBgYHRzXG4gICAgICogbGV0IGNhbmNlbGxhYmxlID0gbmV3IENhbmNlbGxhYmxlUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7IC4uLiB9KTtcbiAgICAgKiBsZXQgY2hhaW5lZCA9IGNhbmNlbGxhYmxlLnRoZW4oKCkgPT4geyAuLi4gfSkudGhlbigoKSA9PiB7IC4uLiB9KTsgLy8gTm8gY2F0Y2guLi5cbiAgICAgKiBjYW5jZWxsYWJsZS5jYW5jZWwoKTsgLy8gVW5oYW5kbGVkIHJlamVjdGlvbiBldmVudCBvbiBjaGFpbmVkIVxuICAgICAqIGBgYFxuICAgICAqIFRoZXJlZm9yZSwgaXQgaXMgaW1wb3J0YW50IHRvIGVpdGhlciBjYW5jZWwgd2hvbGUgcHJvbWlzZSBjaGFpbnMgZnJvbSB0aGVpciB0YWlsLFxuICAgICAqIGFzIHNob3duIGluIHRoZSBjb3JyZWN0IGlkaW9tcyBhYm92ZSwgb3IgdGFrZSBjYXJlIG9mIGhhbmRsaW5nIGVycm9ycyBldmVyeXdoZXJlLlxuICAgICAqXG4gICAgICogQHJldHVybnMgQSBjYW5jZWxsYWJsZSBwcm9taXNlIHRoYXQgX2Z1bGZpbGxzXyBhZnRlciB0aGUgY2FuY2VsIGNhbGxiYWNrIChpZiBhbnkpXG4gICAgICogYW5kIGFsbCBoYW5kbGVycyBhdHRhY2hlZCB1cCB0byB0aGUgY2FsbCB0byBjYW5jZWwgaGF2ZSBydW4uXG4gICAgICogSWYgdGhlIGNhbmNlbCBjYWxsYmFjayByZXR1cm5zIGEgdGhlbmFibGUsIHRoZSBwcm9taXNlIHJldHVybmVkIGJ5IGBjYW5jZWxgXG4gICAgICogd2lsbCBhbHNvIHdhaXQgZm9yIHRoYXQgdGhlbmFibGUgdG8gc2V0dGxlLlxuICAgICAqIFRoaXMgZW5hYmxlcyBjYWxsZXJzIHRvIHdhaXQgZm9yIHRoZSBjYW5jZWxsZWQgb3BlcmF0aW9uIHRvIHRlcm1pbmF0ZVxuICAgICAqIHdpdGhvdXQgYmVpbmcgZm9yY2VkIHRvIGhhbmRsZSBwb3RlbnRpYWwgZXJyb3JzIGF0IHRoZSBjYWxsIHNpdGUuXG4gICAgICogYGBgdHNcbiAgICAgKiBjYW5jZWxsYWJsZS5jYW5jZWwoKS50aGVuKCgpID0+IHtcbiAgICAgKiAgICAgLy8gQ2xlYW51cCBmaW5pc2hlZCwgaXQncyBzYWZlIHRvIGRvIHNvbWV0aGluZyBlbHNlLlxuICAgICAqIH0sIChlcnIpID0+IHtcbiAgICAgKiAgICAgLy8gVW5yZWFjaGFibGU6IHRoZSBwcm9taXNlIHJldHVybmVkIGZyb20gY2FuY2VsIHdpbGwgbmV2ZXIgcmVqZWN0LlxuICAgICAqIH0pO1xuICAgICAqIGBgYFxuICAgICAqIE5vdGUgdGhhdCB0aGUgcmV0dXJuZWQgcHJvbWlzZSB3aWxsIF9ub3RfIGhhbmRsZSBpbXBsaWNpdGx5IGFueSByZWplY3Rpb25cbiAgICAgKiB0aGF0IG1pZ2h0IGhhdmUgb2NjdXJyZWQgYWxyZWFkeSBpbiB0aGUgY2FuY2VsbGVkIGNoYWluLlxuICAgICAqIEl0IHdpbGwganVzdCB0cmFjayB3aGV0aGVyIHJlZ2lzdGVyZWQgaGFuZGxlcnMgaGF2ZSBiZWVuIGV4ZWN1dGVkIG9yIG5vdC5cbiAgICAgKiBUaGVyZWZvcmUsIHVuaGFuZGxlZCByZWplY3Rpb25zIHdpbGwgbmV2ZXIgYmUgc2lsZW50bHkgaGFuZGxlZCBieSBjYWxsaW5nIGNhbmNlbC5cbiAgICAgKi9cbiAgICBjYW5jZWwoY2F1c2U/OiBhbnkpOiBDYW5jZWxsYWJsZVByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gbmV3IENhbmNlbGxhYmxlUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgLy8gSU5WQVJJQU5UOiB0aGUgcmVzdWx0IG9mIHRoaXNbY2FuY2VsSW1wbFN5bV0gYW5kIHRoZSBiYXJyaWVyIGRvIG5vdCBldmVyIHJlamVjdC5cbiAgICAgICAgICAgIC8vIFVuZm9ydHVuYXRlbHkgbWFjT1MgSGlnaCBTaWVycmEgZG9lcyBub3Qgc3VwcG9ydCBQcm9taXNlLmFsbFNldHRsZWQuXG4gICAgICAgICAgICBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgdGhpc1tjYW5jZWxJbXBsU3ltXShuZXcgQ2FuY2VsRXJyb3IoXCJQcm9taXNlIGNhbmNlbGxlZC5cIiwgeyBjYXVzZSB9KSksXG4gICAgICAgICAgICAgICAgY3VycmVudEJhcnJpZXIodGhpcylcbiAgICAgICAgICAgIF0pLnRoZW4oKCkgPT4gcmVzb2x2ZSgpLCAoKSA9PiByZXNvbHZlKCkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCaW5kcyBwcm9taXNlIGNhbmNlbGxhdGlvbiB0byB0aGUgYWJvcnQgZXZlbnQgb2YgdGhlIGdpdmVuIHtAbGluayBBYm9ydFNpZ25hbH0uXG4gICAgICogSWYgdGhlIHNpZ25hbCBoYXMgYWxyZWFkeSBhYm9ydGVkLCB0aGUgcHJvbWlzZSB3aWxsIGJlIGNhbmNlbGxlZCBpbW1lZGlhdGVseS5cbiAgICAgKiBXaGVuIGVpdGhlciBjb25kaXRpb24gaXMgdmVyaWZpZWQsIHRoZSBjYW5jZWxsYXRpb24gY2F1c2Ugd2lsbCBiZSBzZXRcbiAgICAgKiB0byB0aGUgc2lnbmFsJ3MgYWJvcnQgcmVhc29uIChzZWUge0BsaW5rIEFib3J0U2lnbmFsI3JlYXNvbn0pLlxuICAgICAqXG4gICAgICogSGFzIG5vIGVmZmVjdCBpZiBjYWxsZWQgKG9yIGlmIHRoZSBzaWduYWwgYWJvcnRzKSBfYWZ0ZXJfIHRoZSBwcm9taXNlIGhhcyBhbHJlYWR5IHNldHRsZWQuXG4gICAgICogT25seSB0aGUgZmlyc3Qgc2lnbmFsIHRvIGFib3J0IHdpbGwgc2V0IHRoZSBjYW5jZWxsYXRpb24gY2F1c2UuXG4gICAgICpcbiAgICAgKiBGb3IgbW9yZSBkZXRhaWxzIGFib3V0IHRoZSBjYW5jZWxsYXRpb24gcHJvY2VzcyxcbiAgICAgKiBzZWUge0BsaW5rIGNhbmNlbH0gYW5kIHRoZSBgQ2FuY2VsbGFibGVQcm9taXNlYCBjb25zdHJ1Y3Rvci5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGVuYWJsZXMgYGF3YWl0YGluZyBjYW5jZWxsYWJsZSBwcm9taXNlcyB3aXRob3V0IGhhdmluZ1xuICAgICAqIHRvIHN0b3JlIHRoZW0gZm9yIGZ1dHVyZSBjYW5jZWxsYXRpb24sIGUuZy46XG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBsb25nUnVubmluZ09wZXJhdGlvbigpLmNhbmNlbE9uKHNpZ25hbCk7XG4gICAgICogYGBgXG4gICAgICogaW5zdGVhZCBvZjpcbiAgICAgKiBgYGB0c1xuICAgICAqIGxldCBwcm9taXNlVG9CZUNhbmNlbGxlZCA9IGxvbmdSdW5uaW5nT3BlcmF0aW9uKCk7XG4gICAgICogYXdhaXQgcHJvbWlzZVRvQmVDYW5jZWxsZWQ7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGlzIHByb21pc2UsIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICovXG4gICAgY2FuY2VsT24oc2lnbmFsOiBBYm9ydFNpZ25hbCk6IENhbmNlbGxhYmxlUHJvbWlzZTxUPiB7XG4gICAgICAgIGlmIChzaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgICAgdm9pZCB0aGlzLmNhbmNlbChzaWduYWwucmVhc29uKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgKCkgPT4gdm9pZCB0aGlzLmNhbmNlbChzaWduYWwucmVhc29uKSwge2NhcHR1cmU6IHRydWV9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEF0dGFjaGVzIGNhbGxiYWNrcyBmb3IgdGhlIHJlc29sdXRpb24gYW5kL29yIHJlamVjdGlvbiBvZiB0aGUgYENhbmNlbGxhYmxlUHJvbWlzZWAuXG4gICAgICpcbiAgICAgKiBUaGUgb3B0aW9uYWwgYG9uY2FuY2VsbGVkYCBhcmd1bWVudCB3aWxsIGJlIGludm9rZWQgd2hlbiB0aGUgcmV0dXJuZWQgcHJvbWlzZSBpcyBjYW5jZWxsZWQsXG4gICAgICogd2l0aCB0aGUgc2FtZSBzZW1hbnRpY3MgYXMgdGhlIGBvbmNhbmNlbGxlZGAgYXJndW1lbnQgb2YgdGhlIGNvbnN0cnVjdG9yLlxuICAgICAqIFdoZW4gdGhlIHBhcmVudCBwcm9taXNlIHJlamVjdHMgb3IgaXMgY2FuY2VsbGVkLCB0aGUgYG9ucmVqZWN0ZWRgIGNhbGxiYWNrIHdpbGwgcnVuLFxuICAgICAqIF9ldmVuIGFmdGVyIHRoZSByZXR1cm5lZCBwcm9taXNlIGhhcyBiZWVuIGNhbmNlbGxlZDpfXG4gICAgICogaW4gdGhhdCBjYXNlLCBzaG91bGQgaXQgcmVqZWN0IG9yIHRocm93LCB0aGUgcmVhc29uIHdpbGwgYmUgd3JhcHBlZFxuICAgICAqIGluIGEge0BsaW5rIENhbmNlbGxlZFJlamVjdGlvbkVycm9yfSBhbmQgYnViYmxlZCB1cCBhcyBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9uZnVsZmlsbGVkIFRoZSBjYWxsYmFjayB0byBleGVjdXRlIHdoZW4gdGhlIFByb21pc2UgaXMgcmVzb2x2ZWQuXG4gICAgICogQHBhcmFtIG9ucmVqZWN0ZWQgVGhlIGNhbGxiYWNrIHRvIGV4ZWN1dGUgd2hlbiB0aGUgUHJvbWlzZSBpcyByZWplY3RlZC5cbiAgICAgKiBAcmV0dXJucyBBIGBDYW5jZWxsYWJsZVByb21pc2VgIGZvciB0aGUgY29tcGxldGlvbiBvZiB3aGljaGV2ZXIgY2FsbGJhY2sgaXMgZXhlY3V0ZWQuXG4gICAgICogVGhlIHJldHVybmVkIHByb21pc2UgaXMgaG9va2VkIHVwIHRvIHByb3BhZ2F0ZSBjYW5jZWxsYXRpb24gcmVxdWVzdHMgdXAgdGhlIGNoYWluLCBidXQgbm90IGRvd246XG4gICAgICpcbiAgICAgKiAgIC0gaWYgdGhlIHBhcmVudCBwcm9taXNlIGlzIGNhbmNlbGxlZCwgdGhlIGBvbnJlamVjdGVkYCBoYW5kbGVyIHdpbGwgYmUgaW52b2tlZCB3aXRoIGEgYENhbmNlbEVycm9yYFxuICAgICAqICAgICBhbmQgdGhlIHJldHVybmVkIHByb21pc2UgX3dpbGwgcmVzb2x2ZSByZWd1bGFybHlfIHdpdGggaXRzIHJlc3VsdDtcbiAgICAgKiAgIC0gY29udmVyc2VseSwgaWYgdGhlIHJldHVybmVkIHByb21pc2UgaXMgY2FuY2VsbGVkLCBfdGhlIHBhcmVudCBwcm9taXNlIGlzIGNhbmNlbGxlZCB0b287X1xuICAgICAqICAgICB0aGUgYG9ucmVqZWN0ZWRgIGhhbmRsZXIgd2lsbCBzdGlsbCBiZSBpbnZva2VkIHdpdGggdGhlIHBhcmVudCdzIGBDYW5jZWxFcnJvcmAsXG4gICAgICogICAgIGJ1dCBpdHMgcmVzdWx0IHdpbGwgYmUgZGlzY2FyZGVkXG4gICAgICogICAgIGFuZCB0aGUgcmV0dXJuZWQgcHJvbWlzZSB3aWxsIHJlamVjdCB3aXRoIGEgYENhbmNlbEVycm9yYCBhcyB3ZWxsLlxuICAgICAqXG4gICAgICogVGhlIHByb21pc2UgcmV0dXJuZWQgZnJvbSB7QGxpbmsgY2FuY2VsfSB3aWxsIGZ1bGZpbGwgb25seSBhZnRlciBhbGwgYXR0YWNoZWQgaGFuZGxlcnNcbiAgICAgKiB1cCB0aGUgZW50aXJlIHByb21pc2UgY2hhaW4gaGF2ZSBiZWVuIHJ1bi5cbiAgICAgKlxuICAgICAqIElmIGVpdGhlciBjYWxsYmFjayByZXR1cm5zIGEgY2FuY2VsbGFibGUgcHJvbWlzZSxcbiAgICAgKiBjYW5jZWxsYXRpb24gcmVxdWVzdHMgd2lsbCBiZSBkaXZlcnRlZCB0byBpdCxcbiAgICAgKiBhbmQgdGhlIHNwZWNpZmllZCBgb25jYW5jZWxsZWRgIGNhbGxiYWNrIHdpbGwgYmUgZGlzY2FyZGVkLlxuICAgICAqL1xuICAgIHRoZW48VFJlc3VsdDEgPSBULCBUUmVzdWx0MiA9IG5ldmVyPihvbmZ1bGZpbGxlZD86ICgodmFsdWU6IFQpID0+IFRSZXN1bHQxIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDE+IHwgQ2FuY2VsbGFibGVQcm9taXNlTGlrZTxUUmVzdWx0MT4pIHwgdW5kZWZpbmVkIHwgbnVsbCwgb25yZWplY3RlZD86ICgocmVhc29uOiBhbnkpID0+IFRSZXN1bHQyIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDI+IHwgQ2FuY2VsbGFibGVQcm9taXNlTGlrZTxUUmVzdWx0Mj4pIHwgdW5kZWZpbmVkIHwgbnVsbCwgb25jYW5jZWxsZWQ/OiBDYW5jZWxsYWJsZVByb21pc2VDYW5jZWxsZXIpOiBDYW5jZWxsYWJsZVByb21pc2U8VFJlc3VsdDEgfCBUUmVzdWx0Mj4ge1xuICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgQ2FuY2VsbGFibGVQcm9taXNlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbmNlbGxhYmxlUHJvbWlzZS5wcm90b3R5cGUudGhlbiBjYWxsZWQgb24gYW4gaW52YWxpZCBvYmplY3QuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTk9URTogVHlwZVNjcmlwdCdzIGJ1aWx0LWluIHR5cGUgZm9yIHRoZW4gaXMgYnJva2VuLFxuICAgICAgICAvLyBhcyBpdCBhbGxvd3Mgc3BlY2lmeWluZyBhbiBhcmJpdHJhcnkgVFJlc3VsdDEgIT0gVCBldmVuIHdoZW4gb25mdWxmaWxsZWQgaXMgbm90IGEgZnVuY3Rpb24uXG4gICAgICAgIC8vIFdlIGNhbm5vdCBmaXggaXQgaWYgd2Ugd2FudCB0byBDYW5jZWxsYWJsZVByb21pc2UgdG8gaW1wbGVtZW50IFByb21pc2VMaWtlPFQ+LlxuXG4gICAgICAgIGlmICghaXNDYWxsYWJsZShvbmZ1bGZpbGxlZCkpIHsgb25mdWxmaWxsZWQgPSBpZGVudGl0eSBhcyBhbnk7IH1cbiAgICAgICAgaWYgKCFpc0NhbGxhYmxlKG9ucmVqZWN0ZWQpKSB7IG9ucmVqZWN0ZWQgPSB0aHJvd2VyOyB9XG5cbiAgICAgICAgaWYgKG9uZnVsZmlsbGVkID09PSBpZGVudGl0eSAmJiBvbnJlamVjdGVkID09IHRocm93ZXIpIHtcbiAgICAgICAgICAgIC8vIFNob3J0Y3V0IGZvciB0cml2aWFsIGFyZ3VtZW50cy5cbiAgICAgICAgICAgIHJldHVybiBuZXcgQ2FuY2VsbGFibGVQcm9taXNlKChyZXNvbHZlKSA9PiByZXNvbHZlKHRoaXMgYXMgYW55KSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBiYXJyaWVyOiBQYXJ0aWFsPFByb21pc2VXaXRoUmVzb2x2ZXJzPHZvaWQ+PiA9IHt9O1xuICAgICAgICB0aGlzW2JhcnJpZXJTeW1dID0gYmFycmllcjtcblxuICAgICAgICByZXR1cm4gbmV3IENhbmNlbGxhYmxlUHJvbWlzZTxUUmVzdWx0MSB8IFRSZXN1bHQyPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB2b2lkIHN1cGVyLnRoZW4oXG4gICAgICAgICAgICAgICAgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzW2JhcnJpZXJTeW1dID09PSBiYXJyaWVyKSB7IHRoaXNbYmFycmllclN5bV0gPSBudWxsOyB9XG4gICAgICAgICAgICAgICAgICAgIGJhcnJpZXIucmVzb2x2ZT8uKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUob25mdWxmaWxsZWQhKHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIChyZWFzb24/KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzW2JhcnJpZXJTeW1dID09PSBiYXJyaWVyKSB7IHRoaXNbYmFycmllclN5bV0gPSBudWxsOyB9XG4gICAgICAgICAgICAgICAgICAgIGJhcnJpZXIucmVzb2x2ZT8uKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUob25yZWplY3RlZCEocmVhc29uKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9LCBhc3luYyAoY2F1c2U/KSA9PiB7XG4gICAgICAgICAgICAvL2NhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvbmNhbmNlbGxlZD8uKGNhdXNlKTtcbiAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jYW5jZWwoY2F1c2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBdHRhY2hlcyBhIGNhbGxiYWNrIGZvciBvbmx5IHRoZSByZWplY3Rpb24gb2YgdGhlIFByb21pc2UuXG4gICAgICpcbiAgICAgKiBUaGUgb3B0aW9uYWwgYG9uY2FuY2VsbGVkYCBhcmd1bWVudCB3aWxsIGJlIGludm9rZWQgd2hlbiB0aGUgcmV0dXJuZWQgcHJvbWlzZSBpcyBjYW5jZWxsZWQsXG4gICAgICogd2l0aCB0aGUgc2FtZSBzZW1hbnRpY3MgYXMgdGhlIGBvbmNhbmNlbGxlZGAgYXJndW1lbnQgb2YgdGhlIGNvbnN0cnVjdG9yLlxuICAgICAqIFdoZW4gdGhlIHBhcmVudCBwcm9taXNlIHJlamVjdHMgb3IgaXMgY2FuY2VsbGVkLCB0aGUgYG9ucmVqZWN0ZWRgIGNhbGxiYWNrIHdpbGwgcnVuLFxuICAgICAqIF9ldmVuIGFmdGVyIHRoZSByZXR1cm5lZCBwcm9taXNlIGhhcyBiZWVuIGNhbmNlbGxlZDpfXG4gICAgICogaW4gdGhhdCBjYXNlLCBzaG91bGQgaXQgcmVqZWN0IG9yIHRocm93LCB0aGUgcmVhc29uIHdpbGwgYmUgd3JhcHBlZFxuICAgICAqIGluIGEge0BsaW5rIENhbmNlbGxlZFJlamVjdGlvbkVycm9yfSBhbmQgYnViYmxlZCB1cCBhcyBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uLlxuICAgICAqXG4gICAgICogSXQgaXMgZXF1aXZhbGVudCB0b1xuICAgICAqIGBgYHRzXG4gICAgICogY2FuY2VsbGFibGVQcm9taXNlLnRoZW4odW5kZWZpbmVkLCBvbnJlamVjdGVkLCBvbmNhbmNlbGxlZCk7XG4gICAgICogYGBgXG4gICAgICogYW5kIHRoZSBzYW1lIGNhdmVhdHMgYXBwbHkuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBIFByb21pc2UgZm9yIHRoZSBjb21wbGV0aW9uIG9mIHRoZSBjYWxsYmFjay5cbiAgICAgKiBDYW5jZWxsYXRpb24gcmVxdWVzdHMgb24gdGhlIHJldHVybmVkIHByb21pc2VcbiAgICAgKiB3aWxsIHByb3BhZ2F0ZSB1cCB0aGUgY2hhaW4gdG8gdGhlIHBhcmVudCBwcm9taXNlLFxuICAgICAqIGJ1dCBub3QgaW4gdGhlIG90aGVyIGRpcmVjdGlvbi5cbiAgICAgKlxuICAgICAqIFRoZSBwcm9taXNlIHJldHVybmVkIGZyb20ge0BsaW5rIGNhbmNlbH0gd2lsbCBmdWxmaWxsIG9ubHkgYWZ0ZXIgYWxsIGF0dGFjaGVkIGhhbmRsZXJzXG4gICAgICogdXAgdGhlIGVudGlyZSBwcm9taXNlIGNoYWluIGhhdmUgYmVlbiBydW4uXG4gICAgICpcbiAgICAgKiBJZiBgb25yZWplY3RlZGAgcmV0dXJucyBhIGNhbmNlbGxhYmxlIHByb21pc2UsXG4gICAgICogY2FuY2VsbGF0aW9uIHJlcXVlc3RzIHdpbGwgYmUgZGl2ZXJ0ZWQgdG8gaXQsXG4gICAgICogYW5kIHRoZSBzcGVjaWZpZWQgYG9uY2FuY2VsbGVkYCBjYWxsYmFjayB3aWxsIGJlIGRpc2NhcmRlZC5cbiAgICAgKiBTZWUge0BsaW5rIHRoZW59IGZvciBtb3JlIGRldGFpbHMuXG4gICAgICovXG4gICAgY2F0Y2g8VFJlc3VsdCA9IG5ldmVyPihvbnJlamVjdGVkPzogKChyZWFzb246IGFueSkgPT4gKFByb21pc2VMaWtlPFRSZXN1bHQ+IHwgVFJlc3VsdCkpIHwgdW5kZWZpbmVkIHwgbnVsbCwgb25jYW5jZWxsZWQ/OiBDYW5jZWxsYWJsZVByb21pc2VDYW5jZWxsZXIpOiBDYW5jZWxsYWJsZVByb21pc2U8VCB8IFRSZXN1bHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGhlbih1bmRlZmluZWQsIG9ucmVqZWN0ZWQsIG9uY2FuY2VsbGVkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBdHRhY2hlcyBhIGNhbGxiYWNrIHRoYXQgaXMgaW52b2tlZCB3aGVuIHRoZSBDYW5jZWxsYWJsZVByb21pc2UgaXMgc2V0dGxlZCAoZnVsZmlsbGVkIG9yIHJlamVjdGVkKS4gVGhlXG4gICAgICogcmVzb2x2ZWQgdmFsdWUgY2Fubm90IGJlIGFjY2Vzc2VkIG9yIG1vZGlmaWVkIGZyb20gdGhlIGNhbGxiYWNrLlxuICAgICAqIFRoZSByZXR1cm5lZCBwcm9taXNlIHdpbGwgc2V0dGxlIGluIHRoZSBzYW1lIHN0YXRlIGFzIHRoZSBvcmlnaW5hbCBvbmVcbiAgICAgKiBhZnRlciB0aGUgcHJvdmlkZWQgY2FsbGJhY2sgaGFzIGNvbXBsZXRlZCBleGVjdXRpb24sXG4gICAgICogdW5sZXNzIHRoZSBjYWxsYmFjayB0aHJvd3Mgb3IgcmV0dXJucyBhIHJlamVjdGluZyBwcm9taXNlLFxuICAgICAqIGluIHdoaWNoIGNhc2UgdGhlIHJldHVybmVkIHByb21pc2Ugd2lsbCByZWplY3QgYXMgd2VsbC5cbiAgICAgKlxuICAgICAqIFRoZSBvcHRpb25hbCBgb25jYW5jZWxsZWRgIGFyZ3VtZW50IHdpbGwgYmUgaW52b2tlZCB3aGVuIHRoZSByZXR1cm5lZCBwcm9taXNlIGlzIGNhbmNlbGxlZCxcbiAgICAgKiB3aXRoIHRoZSBzYW1lIHNlbWFudGljcyBhcyB0aGUgYG9uY2FuY2VsbGVkYCBhcmd1bWVudCBvZiB0aGUgY29uc3RydWN0b3IuXG4gICAgICogT25jZSB0aGUgcGFyZW50IHByb21pc2Ugc2V0dGxlcywgdGhlIGBvbmZpbmFsbHlgIGNhbGxiYWNrIHdpbGwgcnVuLFxuICAgICAqIF9ldmVuIGFmdGVyIHRoZSByZXR1cm5lZCBwcm9taXNlIGhhcyBiZWVuIGNhbmNlbGxlZDpfXG4gICAgICogaW4gdGhhdCBjYXNlLCBzaG91bGQgaXQgcmVqZWN0IG9yIHRocm93LCB0aGUgcmVhc29uIHdpbGwgYmUgd3JhcHBlZFxuICAgICAqIGluIGEge0BsaW5rIENhbmNlbGxlZFJlamVjdGlvbkVycm9yfSBhbmQgYnViYmxlZCB1cCBhcyBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgaXMgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2Yge0BsaW5rIHRoZW59IGFuZCB0aGUgc2FtZSBjYXZlYXRzIGFwcGx5LlxuICAgICAqIEl0IGlzIHBvbHlmaWxsZWQsIGhlbmNlIGF2YWlsYWJsZSBpbiBldmVyeSBPUy93ZWJ2aWV3IHZlcnNpb24uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBIFByb21pc2UgZm9yIHRoZSBjb21wbGV0aW9uIG9mIHRoZSBjYWxsYmFjay5cbiAgICAgKiBDYW5jZWxsYXRpb24gcmVxdWVzdHMgb24gdGhlIHJldHVybmVkIHByb21pc2VcbiAgICAgKiB3aWxsIHByb3BhZ2F0ZSB1cCB0aGUgY2hhaW4gdG8gdGhlIHBhcmVudCBwcm9taXNlLFxuICAgICAqIGJ1dCBub3QgaW4gdGhlIG90aGVyIGRpcmVjdGlvbi5cbiAgICAgKlxuICAgICAqIFRoZSBwcm9taXNlIHJldHVybmVkIGZyb20ge0BsaW5rIGNhbmNlbH0gd2lsbCBmdWxmaWxsIG9ubHkgYWZ0ZXIgYWxsIGF0dGFjaGVkIGhhbmRsZXJzXG4gICAgICogdXAgdGhlIGVudGlyZSBwcm9taXNlIGNoYWluIGhhdmUgYmVlbiBydW4uXG4gICAgICpcbiAgICAgKiBJZiBgb25maW5hbGx5YCByZXR1cm5zIGEgY2FuY2VsbGFibGUgcHJvbWlzZSxcbiAgICAgKiBjYW5jZWxsYXRpb24gcmVxdWVzdHMgd2lsbCBiZSBkaXZlcnRlZCB0byBpdCxcbiAgICAgKiBhbmQgdGhlIHNwZWNpZmllZCBgb25jYW5jZWxsZWRgIGNhbGxiYWNrIHdpbGwgYmUgZGlzY2FyZGVkLlxuICAgICAqIFNlZSB7QGxpbmsgdGhlbn0gZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKi9cbiAgICBmaW5hbGx5KG9uZmluYWxseT86ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZCB8IG51bGwsIG9uY2FuY2VsbGVkPzogQ2FuY2VsbGFibGVQcm9taXNlQ2FuY2VsbGVyKTogQ2FuY2VsbGFibGVQcm9taXNlPFQ+IHtcbiAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIENhbmNlbGxhYmxlUHJvbWlzZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5jZWxsYWJsZVByb21pc2UucHJvdG90eXBlLmZpbmFsbHkgY2FsbGVkIG9uIGFuIGludmFsaWQgb2JqZWN0LlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNDYWxsYWJsZShvbmZpbmFsbHkpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50aGVuKG9uZmluYWxseSwgb25maW5hbGx5LCBvbmNhbmNlbGxlZCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy50aGVuKFxuICAgICAgICAgICAgKHZhbHVlKSA9PiBDYW5jZWxsYWJsZVByb21pc2UucmVzb2x2ZShvbmZpbmFsbHkoKSkudGhlbigoKSA9PiB2YWx1ZSksXG4gICAgICAgICAgICAocmVhc29uPykgPT4gQ2FuY2VsbGFibGVQcm9taXNlLnJlc29sdmUob25maW5hbGx5KCkpLnRoZW4oKCkgPT4geyB0aHJvdyByZWFzb247IH0pLFxuICAgICAgICAgICAgb25jYW5jZWxsZWQsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2UgdXNlIHRoZSBgW1N5bWJvbC5zcGVjaWVzXWAgc3RhdGljIHByb3BlcnR5LCBpZiBhdmFpbGFibGUsXG4gICAgICogdG8gZGlzYWJsZSB0aGUgYnVpbHQtaW4gYXV0b21hdGljIHN1YmNsYXNzaW5nIGZlYXR1cmVzIGZyb20ge0BsaW5rIFByb21pc2V9LlxuICAgICAqIEl0IGlzIGNyaXRpY2FsIGZvciBwZXJmb3JtYW5jZSByZWFzb25zIHRoYXQgZXh0ZW5kZXJzIGRvIG5vdCBvdmVycmlkZSB0aGlzLlxuICAgICAqIE9uY2UgdGhlIHByb3Bvc2FsIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXJtLWJ1aWx0aW4tc3ViY2xhc3NpbmdcbiAgICAgKiBpcyBlaXRoZXIgYWNjZXB0ZWQgb3IgcmV0aXJlZCwgdGhpcyBpbXBsZW1lbnRhdGlvbiB3aWxsIGhhdmUgdG8gYmUgcmV2aXNlZCBhY2NvcmRpbmdseS5cbiAgICAgKlxuICAgICAqIEBpZ25vcmVcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFtzcGVjaWVzXSgpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIENhbmNlbGxhYmxlUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggYW4gYXJyYXkgb2YgcmVzdWx0c1xuICAgICAqIHdoZW4gYWxsIG9mIHRoZSBwcm92aWRlZCBQcm9taXNlcyByZXNvbHZlLCBvciByZWplY3RlZCB3aGVuIGFueSBQcm9taXNlIGlzIHJlamVjdGVkLlxuICAgICAqXG4gICAgICogRXZlcnkgb25lIG9mIHRoZSBwcm92aWRlZCBvYmplY3RzIHRoYXQgaXMgYSB0aGVuYWJsZSBfYW5kXyBjYW5jZWxsYWJsZSBvYmplY3RcbiAgICAgKiB3aWxsIGJlIGNhbmNlbGxlZCB3aGVuIHRoZSByZXR1cm5lZCBwcm9taXNlIGlzIGNhbmNlbGxlZCwgd2l0aCB0aGUgc2FtZSBjYXVzZS5cbiAgICAgKlxuICAgICAqIEBncm91cCBTdGF0aWMgTWV0aG9kc1xuICAgICAqL1xuICAgIHN0YXRpYyBhbGw8VD4odmFsdWVzOiBJdGVyYWJsZTxUIHwgUHJvbWlzZUxpa2U8VD4+KTogQ2FuY2VsbGFibGVQcm9taXNlPEF3YWl0ZWQ8VD5bXT47XG4gICAgc3RhdGljIGFsbDxUIGV4dGVuZHMgcmVhZG9ubHkgdW5rbm93bltdIHwgW10+KHZhbHVlczogVCk6IENhbmNlbGxhYmxlUHJvbWlzZTx7IC1yZWFkb25seSBbUCBpbiBrZXlvZiBUXTogQXdhaXRlZDxUW1BdPjsgfT47XG4gICAgc3RhdGljIGFsbDxUIGV4dGVuZHMgSXRlcmFibGU8dW5rbm93bj4gfCBBcnJheUxpa2U8dW5rbm93bj4+KHZhbHVlczogVCk6IENhbmNlbGxhYmxlUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIGxldCBjb2xsZWN0ZWQgPSBBcnJheS5mcm9tKHZhbHVlcyk7XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBjb2xsZWN0ZWQubGVuZ3RoID09PSAwXG4gICAgICAgICAgICA/IENhbmNlbGxhYmxlUHJvbWlzZS5yZXNvbHZlKGNvbGxlY3RlZClcbiAgICAgICAgICAgIDogbmV3IENhbmNlbGxhYmxlUHJvbWlzZTx1bmtub3duPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgdm9pZCBQcm9taXNlLmFsbChjb2xsZWN0ZWQpLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICAgIH0sIChjYXVzZT8pOiBQcm9taXNlPHZvaWQ+ID0+IGNhbmNlbEFsbChwcm9taXNlLCBjb2xsZWN0ZWQsIGNhdXNlKSk7XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBDYW5jZWxsYWJsZVByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoIGFuIGFycmF5IG9mIHJlc3VsdHNcbiAgICAgKiB3aGVuIGFsbCBvZiB0aGUgcHJvdmlkZWQgUHJvbWlzZXMgcmVzb2x2ZSBvciByZWplY3QuXG4gICAgICpcbiAgICAgKiBFdmVyeSBvbmUgb2YgdGhlIHByb3ZpZGVkIG9iamVjdHMgdGhhdCBpcyBhIHRoZW5hYmxlIF9hbmRfIGNhbmNlbGxhYmxlIG9iamVjdFxuICAgICAqIHdpbGwgYmUgY2FuY2VsbGVkIHdoZW4gdGhlIHJldHVybmVkIHByb21pc2UgaXMgY2FuY2VsbGVkLCB3aXRoIHRoZSBzYW1lIGNhdXNlLlxuICAgICAqXG4gICAgICogQGdyb3VwIFN0YXRpYyBNZXRob2RzXG4gICAgICovXG4gICAgc3RhdGljIGFsbFNldHRsZWQ8VD4odmFsdWVzOiBJdGVyYWJsZTxUIHwgUHJvbWlzZUxpa2U8VD4+KTogQ2FuY2VsbGFibGVQcm9taXNlPFByb21pc2VTZXR0bGVkUmVzdWx0PEF3YWl0ZWQ8VD4+W10+O1xuICAgIHN0YXRpYyBhbGxTZXR0bGVkPFQgZXh0ZW5kcyByZWFkb25seSB1bmtub3duW10gfCBbXT4odmFsdWVzOiBUKTogQ2FuY2VsbGFibGVQcm9taXNlPHsgLXJlYWRvbmx5IFtQIGluIGtleW9mIFRdOiBQcm9taXNlU2V0dGxlZFJlc3VsdDxBd2FpdGVkPFRbUF0+PjsgfT47XG4gICAgc3RhdGljIGFsbFNldHRsZWQ8VCBleHRlbmRzIEl0ZXJhYmxlPHVua25vd24+IHwgQXJyYXlMaWtlPHVua25vd24+Pih2YWx1ZXM6IFQpOiBDYW5jZWxsYWJsZVByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICBsZXQgY29sbGVjdGVkID0gQXJyYXkuZnJvbSh2YWx1ZXMpO1xuICAgICAgICBjb25zdCBwcm9taXNlID0gY29sbGVjdGVkLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgPyBDYW5jZWxsYWJsZVByb21pc2UucmVzb2x2ZShjb2xsZWN0ZWQpXG4gICAgICAgICAgICA6IG5ldyBDYW5jZWxsYWJsZVByb21pc2U8dW5rbm93bj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHZvaWQgUHJvbWlzZS5hbGxTZXR0bGVkKGNvbGxlY3RlZCkudGhlbihyZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgICAgfSwgKGNhdXNlPyk6IFByb21pc2U8dm9pZD4gPT4gY2FuY2VsQWxsKHByb21pc2UsIGNvbGxlY3RlZCwgY2F1c2UpKTtcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGFueSBmdW5jdGlvbiByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCBieSB0aGUgZmlyc3QgZ2l2ZW4gcHJvbWlzZSB0byBiZSBmdWxmaWxsZWQsXG4gICAgICogb3IgcmVqZWN0ZWQgd2l0aCBhbiBBZ2dyZWdhdGVFcnJvciBjb250YWluaW5nIGFuIGFycmF5IG9mIHJlamVjdGlvbiByZWFzb25zXG4gICAgICogaWYgYWxsIG9mIHRoZSBnaXZlbiBwcm9taXNlcyBhcmUgcmVqZWN0ZWQuXG4gICAgICogSXQgcmVzb2x2ZXMgYWxsIGVsZW1lbnRzIG9mIHRoZSBwYXNzZWQgaXRlcmFibGUgdG8gcHJvbWlzZXMgYXMgaXQgcnVucyB0aGlzIGFsZ29yaXRobS5cbiAgICAgKlxuICAgICAqIEV2ZXJ5IG9uZSBvZiB0aGUgcHJvdmlkZWQgb2JqZWN0cyB0aGF0IGlzIGEgdGhlbmFibGUgX2FuZF8gY2FuY2VsbGFibGUgb2JqZWN0XG4gICAgICogd2lsbCBiZSBjYW5jZWxsZWQgd2hlbiB0aGUgcmV0dXJuZWQgcHJvbWlzZSBpcyBjYW5jZWxsZWQsIHdpdGggdGhlIHNhbWUgY2F1c2UuXG4gICAgICpcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcbiAgICAgKi9cbiAgICBzdGF0aWMgYW55PFQ+KHZhbHVlczogSXRlcmFibGU8VCB8IFByb21pc2VMaWtlPFQ+Pik6IENhbmNlbGxhYmxlUHJvbWlzZTxBd2FpdGVkPFQ+PjtcbiAgICBzdGF0aWMgYW55PFQgZXh0ZW5kcyByZWFkb25seSB1bmtub3duW10gfCBbXT4odmFsdWVzOiBUKTogQ2FuY2VsbGFibGVQcm9taXNlPEF3YWl0ZWQ8VFtudW1iZXJdPj47XG4gICAgc3RhdGljIGFueTxUIGV4dGVuZHMgSXRlcmFibGU8dW5rbm93bj4gfCBBcnJheUxpa2U8dW5rbm93bj4+KHZhbHVlczogVCk6IENhbmNlbGxhYmxlUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIGxldCBjb2xsZWN0ZWQgPSBBcnJheS5mcm9tKHZhbHVlcyk7XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBjb2xsZWN0ZWQubGVuZ3RoID09PSAwXG4gICAgICAgICAgICA/IENhbmNlbGxhYmxlUHJvbWlzZS5yZXNvbHZlKGNvbGxlY3RlZClcbiAgICAgICAgICAgIDogbmV3IENhbmNlbGxhYmxlUHJvbWlzZTx1bmtub3duPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgdm9pZCBQcm9taXNlLmFueShjb2xsZWN0ZWQpLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICAgIH0sIChjYXVzZT8pOiBQcm9taXNlPHZvaWQ+ID0+IGNhbmNlbEFsbChwcm9taXNlLCBjb2xsZWN0ZWQsIGNhdXNlKSk7XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQgd2hlbiBhbnkgb2YgdGhlIHByb3ZpZGVkIFByb21pc2VzIGFyZSByZXNvbHZlZCBvciByZWplY3RlZC5cbiAgICAgKlxuICAgICAqIEV2ZXJ5IG9uZSBvZiB0aGUgcHJvdmlkZWQgb2JqZWN0cyB0aGF0IGlzIGEgdGhlbmFibGUgX2FuZF8gY2FuY2VsbGFibGUgb2JqZWN0XG4gICAgICogd2lsbCBiZSBjYW5jZWxsZWQgd2hlbiB0aGUgcmV0dXJuZWQgcHJvbWlzZSBpcyBjYW5jZWxsZWQsIHdpdGggdGhlIHNhbWUgY2F1c2UuXG4gICAgICpcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcbiAgICAgKi9cbiAgICBzdGF0aWMgcmFjZTxUPih2YWx1ZXM6IEl0ZXJhYmxlPFQgfCBQcm9taXNlTGlrZTxUPj4pOiBDYW5jZWxsYWJsZVByb21pc2U8QXdhaXRlZDxUPj47XG4gICAgc3RhdGljIHJhY2U8VCBleHRlbmRzIHJlYWRvbmx5IHVua25vd25bXSB8IFtdPih2YWx1ZXM6IFQpOiBDYW5jZWxsYWJsZVByb21pc2U8QXdhaXRlZDxUW251bWJlcl0+PjtcbiAgICBzdGF0aWMgcmFjZTxUIGV4dGVuZHMgSXRlcmFibGU8dW5rbm93bj4gfCBBcnJheUxpa2U8dW5rbm93bj4+KHZhbHVlczogVCk6IENhbmNlbGxhYmxlUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIGxldCBjb2xsZWN0ZWQgPSBBcnJheS5mcm9tKHZhbHVlcyk7XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBuZXcgQ2FuY2VsbGFibGVQcm9taXNlPHVua25vd24+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHZvaWQgUHJvbWlzZS5yYWNlKGNvbGxlY3RlZCkudGhlbihyZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9LCAoY2F1c2U/KTogUHJvbWlzZTx2b2lkPiA9PiBjYW5jZWxBbGwocHJvbWlzZSwgY29sbGVjdGVkLCBjYXVzZSkpO1xuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGNhbmNlbGxlZCBDYW5jZWxsYWJsZVByb21pc2UgZm9yIHRoZSBwcm92aWRlZCBjYXVzZS5cbiAgICAgKlxuICAgICAqIEBncm91cCBTdGF0aWMgTWV0aG9kc1xuICAgICAqL1xuICAgIHN0YXRpYyBjYW5jZWw8VCA9IG5ldmVyPihjYXVzZT86IGFueSk6IENhbmNlbGxhYmxlUHJvbWlzZTxUPiB7XG4gICAgICAgIGNvbnN0IHAgPSBuZXcgQ2FuY2VsbGFibGVQcm9taXNlPFQ+KCgpID0+IHt9KTtcbiAgICAgICAgcC5jYW5jZWwoY2F1c2UpO1xuICAgICAgICByZXR1cm4gcDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IENhbmNlbGxhYmxlUHJvbWlzZSB0aGF0IGNhbmNlbHNcbiAgICAgKiBhZnRlciB0aGUgc3BlY2lmaWVkIHRpbWVvdXQsIHdpdGggdGhlIHByb3ZpZGVkIGNhdXNlLlxuICAgICAqXG4gICAgICogSWYgdGhlIHtAbGluayBBYm9ydFNpZ25hbC50aW1lb3V0fSBmYWN0b3J5IG1ldGhvZCBpcyBhdmFpbGFibGUsXG4gICAgICogaXQgaXMgdXNlZCB0byBiYXNlIHRoZSB0aW1lb3V0IG9uIF9hY3RpdmVfIHRpbWUgcmF0aGVyIHRoYW4gX2VsYXBzZWRfIHRpbWUuXG4gICAgICogT3RoZXJ3aXNlLCBgdGltZW91dGAgZmFsbHMgYmFjayB0byB7QGxpbmsgc2V0VGltZW91dH0uXG4gICAgICpcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcbiAgICAgKi9cbiAgICBzdGF0aWMgdGltZW91dDxUID0gbmV2ZXI+KG1pbGxpc2Vjb25kczogbnVtYmVyLCBjYXVzZT86IGFueSk6IENhbmNlbGxhYmxlUHJvbWlzZTxUPiB7XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBuZXcgQ2FuY2VsbGFibGVQcm9taXNlPFQ+KCgpID0+IHt9KTtcbiAgICAgICAgaWYgKEFib3J0U2lnbmFsICYmIHR5cGVvZiBBYm9ydFNpZ25hbCA9PT0gJ2Z1bmN0aW9uJyAmJiBBYm9ydFNpZ25hbC50aW1lb3V0ICYmIHR5cGVvZiBBYm9ydFNpZ25hbC50aW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBBYm9ydFNpZ25hbC50aW1lb3V0KG1pbGxpc2Vjb25kcykuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PiB2b2lkIHByb21pc2UuY2FuY2VsKGNhdXNlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHZvaWQgcHJvbWlzZS5jYW5jZWwoY2F1c2UpLCBtaWxsaXNlY29uZHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ2FuY2VsbGFibGVQcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgdGhlIHNwZWNpZmllZCB0aW1lb3V0LlxuICAgICAqIFRoZSByZXR1cm5lZCBwcm9taXNlIGNhbiBiZSBjYW5jZWxsZWQgd2l0aG91dCBjb25zZXF1ZW5jZXMuXG4gICAgICpcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcbiAgICAgKi9cbiAgICBzdGF0aWMgc2xlZXAobWlsbGlzZWNvbmRzOiBudW1iZXIpOiBDYW5jZWxsYWJsZVByb21pc2U8dm9pZD47XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBDYW5jZWxsYWJsZVByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlclxuICAgICAqIHRoZSBzcGVjaWZpZWQgdGltZW91dCwgd2l0aCB0aGUgcHJvdmlkZWQgdmFsdWUuXG4gICAgICogVGhlIHJldHVybmVkIHByb21pc2UgY2FuIGJlIGNhbmNlbGxlZCB3aXRob3V0IGNvbnNlcXVlbmNlcy5cbiAgICAgKlxuICAgICAqIEBncm91cCBTdGF0aWMgTWV0aG9kc1xuICAgICAqL1xuICAgIHN0YXRpYyBzbGVlcDxUPihtaWxsaXNlY29uZHM6IG51bWJlciwgdmFsdWU6IFQpOiBDYW5jZWxsYWJsZVByb21pc2U8VD47XG4gICAgc3RhdGljIHNsZWVwPFQgPSB2b2lkPihtaWxsaXNlY29uZHM6IG51bWJlciwgdmFsdWU/OiBUKTogQ2FuY2VsbGFibGVQcm9taXNlPFQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBDYW5jZWxsYWJsZVByb21pc2U8VD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZSh2YWx1ZSEpLCBtaWxsaXNlY29uZHMpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHJlamVjdGVkIENhbmNlbGxhYmxlUHJvbWlzZSBmb3IgdGhlIHByb3ZpZGVkIHJlYXNvbi5cbiAgICAgKlxuICAgICAqIEBncm91cCBTdGF0aWMgTWV0aG9kc1xuICAgICAqL1xuICAgIHN0YXRpYyByZWplY3Q8VCA9IG5ldmVyPihyZWFzb24/OiBhbnkpOiBDYW5jZWxsYWJsZVByb21pc2U8VD4ge1xuICAgICAgICByZXR1cm4gbmV3IENhbmNlbGxhYmxlUHJvbWlzZTxUPigoXywgcmVqZWN0KSA9PiByZWplY3QocmVhc29uKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyByZXNvbHZlZCBDYW5jZWxsYWJsZVByb21pc2UuXG4gICAgICpcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcbiAgICAgKi9cbiAgICBzdGF0aWMgcmVzb2x2ZSgpOiBDYW5jZWxsYWJsZVByb21pc2U8dm9pZD47XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyByZXNvbHZlZCBDYW5jZWxsYWJsZVByb21pc2UgZm9yIHRoZSBwcm92aWRlZCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBncm91cCBTdGF0aWMgTWV0aG9kc1xuICAgICAqL1xuICAgIHN0YXRpYyByZXNvbHZlPFQ+KHZhbHVlOiBUKTogQ2FuY2VsbGFibGVQcm9taXNlPEF3YWl0ZWQ8VD4+O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgcmVzb2x2ZWQgQ2FuY2VsbGFibGVQcm9taXNlIGZvciB0aGUgcHJvdmlkZWQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcbiAgICAgKi9cbiAgICBzdGF0aWMgcmVzb2x2ZTxUPih2YWx1ZTogVCB8IFByb21pc2VMaWtlPFQ+KTogQ2FuY2VsbGFibGVQcm9taXNlPEF3YWl0ZWQ8VD4+O1xuICAgIHN0YXRpYyByZXNvbHZlPFQgPSB2b2lkPih2YWx1ZT86IFQgfCBQcm9taXNlTGlrZTxUPik6IENhbmNlbGxhYmxlUHJvbWlzZTxBd2FpdGVkPFQ+PiB7XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIENhbmNlbGxhYmxlUHJvbWlzZSkge1xuICAgICAgICAgICAgLy8gT3B0aW1pc2UgZm9yIGNhbmNlbGxhYmxlIHByb21pc2VzLlxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQ2FuY2VsbGFibGVQcm9taXNlPGFueT4oKHJlc29sdmUpID0+IHJlc29sdmUodmFsdWUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IENhbmNlbGxhYmxlUHJvbWlzZSBhbmQgcmV0dXJucyBpdCBpbiBhbiBvYmplY3QsIGFsb25nIHdpdGggaXRzIHJlc29sdmUgYW5kIHJlamVjdCBmdW5jdGlvbnNcbiAgICAgKiBhbmQgYSBnZXR0ZXIvc2V0dGVyIGZvciB0aGUgY2FuY2VsbGF0aW9uIGNhbGxiYWNrLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgaXMgcG9seWZpbGxlZCwgaGVuY2UgYXZhaWxhYmxlIGluIGV2ZXJ5IE9TL3dlYnZpZXcgdmVyc2lvbi5cbiAgICAgKlxuICAgICAqIEBncm91cCBTdGF0aWMgTWV0aG9kc1xuICAgICAqL1xuICAgIHN0YXRpYyB3aXRoUmVzb2x2ZXJzPFQ+KCk6IENhbmNlbGxhYmxlUHJvbWlzZVdpdGhSZXNvbHZlcnM8VD4ge1xuICAgICAgICBsZXQgcmVzdWx0OiBDYW5jZWxsYWJsZVByb21pc2VXaXRoUmVzb2x2ZXJzPFQ+ID0geyBvbmNhbmNlbGxlZDogbnVsbCB9IGFzIGFueTtcbiAgICAgICAgcmVzdWx0LnByb21pc2UgPSBuZXcgQ2FuY2VsbGFibGVQcm9taXNlPFQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHJlc3VsdC5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgICAgIHJlc3VsdC5yZWplY3QgPSByZWplY3Q7XG4gICAgICAgIH0sIChjYXVzZT86IGFueSkgPT4geyByZXN1bHQub25jYW5jZWxsZWQ/LihjYXVzZSk7IH0pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgY2FsbGJhY2sgdGhhdCBpbXBsZW1lbnRzIHRoZSBjYW5jZWxsYXRpb24gYWxnb3JpdGhtIGZvciB0aGUgZ2l2ZW4gY2FuY2VsbGFibGUgcHJvbWlzZS5cbiAqIFRoZSBwcm9taXNlIHJldHVybmVkIGZyb20gdGhlIHJlc3VsdGluZyBmdW5jdGlvbiBkb2VzIG5vdCByZWplY3QuXG4gKi9cbmZ1bmN0aW9uIGNhbmNlbGxlckZvcjxUPihwcm9taXNlOiBDYW5jZWxsYWJsZVByb21pc2VXaXRoUmVzb2x2ZXJzPFQ+LCBzdGF0ZTogQ2FuY2VsbGFibGVQcm9taXNlU3RhdGUpIHtcbiAgICBsZXQgY2FuY2VsbGF0aW9uUHJvbWlzZTogdm9pZCB8IFByb21pc2VMaWtlPHZvaWQ+ID0gdW5kZWZpbmVkO1xuXG4gICAgcmV0dXJuIChyZWFzb246IENhbmNlbEVycm9yKTogdm9pZCB8IFByb21pc2VMaWtlPHZvaWQ+ID0+IHtcbiAgICAgICAgaWYgKCFzdGF0ZS5zZXR0bGVkKSB7XG4gICAgICAgICAgICBzdGF0ZS5zZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHN0YXRlLnJlYXNvbiA9IHJlYXNvbjtcbiAgICAgICAgICAgIHByb21pc2UucmVqZWN0KHJlYXNvbik7XG5cbiAgICAgICAgICAgIC8vIEF0dGFjaCBhbiBlcnJvciBoYW5kbGVyIHRoYXQgaWdub3JlcyB0aGlzIHNwZWNpZmljIHJlamVjdGlvbiByZWFzb24gYW5kIG5vdGhpbmcgZWxzZS5cbiAgICAgICAgICAgIC8vIEluIHRoZW9yeSwgYSBzYW5lIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gYXQgdGhpcyBwb2ludFxuICAgICAgICAgICAgLy8gc2hvdWxkIGFsd2F5cyByZWplY3Qgd2l0aCBvdXIgY2FuY2VsbGF0aW9uIHJlYXNvbixcbiAgICAgICAgICAgIC8vIGhlbmNlIHRoZSBoYW5kbGVyIHdpbGwgbmV2ZXIgdGhyb3cuXG4gICAgICAgICAgICB2b2lkIFByb21pc2UucHJvdG90eXBlLnRoZW4uY2FsbChwcm9taXNlLnByb21pc2UsIHVuZGVmaW5lZCwgKGVycikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlcnIgIT09IHJlYXNvbikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiByZWFzb24gaXMgbm90IHNldCwgdGhlIHByb21pc2UgcmVzb2x2ZWQgcmVndWxhcmx5LCBoZW5jZSB3ZSBtdXN0IG5vdCBjYWxsIG9uY2FuY2VsbGVkLlxuICAgICAgICAvLyBJZiBvbmNhbmNlbGxlZCBpcyB1bnNldCwgbm8gbmVlZCB0byBnbyBhbnkgZnVydGhlci5cbiAgICAgICAgaWYgKCFzdGF0ZS5yZWFzb24gfHwgIXByb21pc2Uub25jYW5jZWxsZWQpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgY2FuY2VsbGF0aW9uUHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUocHJvbWlzZS5vbmNhbmNlbGxlZCEoc3RhdGUucmVhc29uIS5jYXVzZSkpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgUHJvbWlzZS5yZWplY3QobmV3IENhbmNlbGxlZFJlamVjdGlvbkVycm9yKHByb21pc2UucHJvbWlzZSwgZXJyLCBcIlVuaGFuZGxlZCBleGNlcHRpb24gaW4gb25jYW5jZWxsZWQgY2FsbGJhY2suXCIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkuY2F0Y2goKHJlYXNvbj8pID0+IHtcbiAgICAgICAgICAgIFByb21pc2UucmVqZWN0KG5ldyBDYW5jZWxsZWRSZWplY3Rpb25FcnJvcihwcm9taXNlLnByb21pc2UsIHJlYXNvbiwgXCJVbmhhbmRsZWQgcmVqZWN0aW9uIGluIG9uY2FuY2VsbGVkIGNhbGxiYWNrLlwiKSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFVuc2V0IG9uY2FuY2VsbGVkIHRvIHByZXZlbnQgcmVwZWF0ZWQgY2FsbHMuXG4gICAgICAgIHByb21pc2Uub25jYW5jZWxsZWQgPSBudWxsO1xuXG4gICAgICAgIHJldHVybiBjYW5jZWxsYXRpb25Qcm9taXNlO1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgY2FsbGJhY2sgdGhhdCBpbXBsZW1lbnRzIHRoZSByZXNvbHV0aW9uIGFsZ29yaXRobSBmb3IgdGhlIGdpdmVuIGNhbmNlbGxhYmxlIHByb21pc2UuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVyRm9yPFQ+KHByb21pc2U6IENhbmNlbGxhYmxlUHJvbWlzZVdpdGhSZXNvbHZlcnM8VD4sIHN0YXRlOiBDYW5jZWxsYWJsZVByb21pc2VTdGF0ZSk6IENhbmNlbGxhYmxlUHJvbWlzZVJlc29sdmVyPFQ+IHtcbiAgICByZXR1cm4gKHZhbHVlKSA9PiB7XG4gICAgICAgIGlmIChzdGF0ZS5yZXNvbHZpbmcpIHsgcmV0dXJuOyB9XG4gICAgICAgIHN0YXRlLnJlc29sdmluZyA9IHRydWU7XG5cbiAgICAgICAgaWYgKHZhbHVlID09PSBwcm9taXNlLnByb21pc2UpIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZS5zZXR0bGVkKSB7IHJldHVybjsgfVxuICAgICAgICAgICAgc3RhdGUuc2V0dGxlZCA9IHRydWU7XG4gICAgICAgICAgICBwcm9taXNlLnJlamVjdChuZXcgVHlwZUVycm9yKFwiQSBwcm9taXNlIGNhbm5vdCBiZSByZXNvbHZlZCB3aXRoIGl0c2VsZi5cIikpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSkge1xuICAgICAgICAgICAgbGV0IHRoZW46IGFueTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhlbiA9ICh2YWx1ZSBhcyBhbnkpLnRoZW47XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBzdGF0ZS5zZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBwcm9taXNlLnJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlzQ2FsbGFibGUodGhlbikpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY2FuY2VsID0gKHZhbHVlIGFzIGFueSkuY2FuY2VsO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNDYWxsYWJsZShjYW5jZWwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvbmNhbmNlbGxlZCA9IChjYXVzZT86IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZmxlY3QuYXBwbHkoY2FuY2VsLCB2YWx1ZSwgW2NhdXNlXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLnJlYXNvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGFscmVhZHkgY2FuY2VsbGVkLCBwcm9wYWdhdGUgY2FuY2VsbGF0aW9uLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBwcm9taXNlIHJldHVybmVkIGZyb20gdGhlIGNhbmNlbGxlciBhbGdvcml0aG0gZG9lcyBub3QgcmVqZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gaXQgY2FuIGJlIGRpc2NhcmRlZCBzYWZlbHkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCBjYW5jZWxsZXJGb3IoeyAuLi5wcm9taXNlLCBvbmNhbmNlbGxlZCB9LCBzdGF0ZSkoc3RhdGUucmVhc29uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZS5vbmNhbmNlbGxlZCA9IG9uY2FuY2VsbGVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCB7fVxuXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3U3RhdGU6IENhbmNlbGxhYmxlUHJvbWlzZVN0YXRlID0ge1xuICAgICAgICAgICAgICAgICAgICByb290OiBzdGF0ZS5yb290LFxuICAgICAgICAgICAgICAgICAgICByZXNvbHZpbmc6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBnZXQgc2V0dGxlZCgpIHsgcmV0dXJuIHRoaXMucm9vdC5zZXR0bGVkIH0sXG4gICAgICAgICAgICAgICAgICAgIHNldCBzZXR0bGVkKHZhbHVlKSB7IHRoaXMucm9vdC5zZXR0bGVkID0gdmFsdWU7IH0sXG4gICAgICAgICAgICAgICAgICAgIGdldCByZWFzb24oKSB7IHJldHVybiB0aGlzLnJvb3QucmVhc29uIH1cbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVqZWN0b3IgPSByZWplY3RvckZvcihwcm9taXNlLCBuZXdTdGF0ZSk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgUmVmbGVjdC5hcHBseSh0aGVuLCB2YWx1ZSwgW3Jlc29sdmVyRm9yKHByb21pc2UsIG5ld1N0YXRlKSwgcmVqZWN0b3JdKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0b3IoZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBJTVBPUlRBTlQhXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RhdGUuc2V0dGxlZCkgeyByZXR1cm47IH1cbiAgICAgICAgc3RhdGUuc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIHByb21pc2UucmVzb2x2ZSh2YWx1ZSk7XG4gICAgfTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgY2FsbGJhY2sgdGhhdCBpbXBsZW1lbnRzIHRoZSByZWplY3Rpb24gYWxnb3JpdGhtIGZvciB0aGUgZ2l2ZW4gY2FuY2VsbGFibGUgcHJvbWlzZS5cbiAqL1xuZnVuY3Rpb24gcmVqZWN0b3JGb3I8VD4ocHJvbWlzZTogQ2FuY2VsbGFibGVQcm9taXNlV2l0aFJlc29sdmVyczxUPiwgc3RhdGU6IENhbmNlbGxhYmxlUHJvbWlzZVN0YXRlKTogQ2FuY2VsbGFibGVQcm9taXNlUmVqZWN0b3Ige1xuICAgIHJldHVybiAocmVhc29uPykgPT4ge1xuICAgICAgICBpZiAoc3RhdGUucmVzb2x2aW5nKSB7IHJldHVybjsgfVxuICAgICAgICBzdGF0ZS5yZXNvbHZpbmcgPSB0cnVlO1xuXG4gICAgICAgIGlmIChzdGF0ZS5zZXR0bGVkKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBDYW5jZWxFcnJvciAmJiBzdGF0ZS5yZWFzb24gaW5zdGFuY2VvZiBDYW5jZWxFcnJvciAmJiBPYmplY3QuaXMocmVhc29uLmNhdXNlLCBzdGF0ZS5yZWFzb24uY2F1c2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFN3YWxsb3cgbGF0ZSByZWplY3Rpb25zIHRoYXQgYXJlIENhbmNlbEVycm9ycyB3aG9zZSBjYW5jZWxsYXRpb24gY2F1c2UgaXMgdGhlIHNhbWUgYXMgb3Vycy5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2gge31cblxuICAgICAgICAgICAgdm9pZCBQcm9taXNlLnJlamVjdChuZXcgQ2FuY2VsbGVkUmVqZWN0aW9uRXJyb3IocHJvbWlzZS5wcm9taXNlLCByZWFzb24pKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YXRlLnNldHRsZWQgPSB0cnVlO1xuICAgICAgICAgICAgcHJvbWlzZS5yZWplY3QocmVhc29uKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBDYW5jZWxzIGFsbCB2YWx1ZXMgaW4gYW4gYXJyYXkgdGhhdCBsb29rIGxpa2UgY2FuY2VsbGFibGUgdGhlbmFibGVzLlxuICogUmV0dXJucyBhIHByb21pc2UgdGhhdCBmdWxmaWxscyBvbmNlIGFsbCBjYW5jZWxsYXRpb24gcHJvY2VkdXJlcyBmb3IgdGhlIGdpdmVuIHZhbHVlcyBoYXZlIHNldHRsZWQuXG4gKi9cbmZ1bmN0aW9uIGNhbmNlbEFsbChwYXJlbnQ6IENhbmNlbGxhYmxlUHJvbWlzZTx1bmtub3duPiwgdmFsdWVzOiBhbnlbXSwgY2F1c2U/OiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZXN1bHRzID0gW107XG5cbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgICBsZXQgY2FuY2VsOiBDYW5jZWxsYWJsZVByb21pc2VDYW5jZWxsZXI7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIWlzQ2FsbGFibGUodmFsdWUudGhlbikpIHsgY29udGludWU7IH1cbiAgICAgICAgICAgIGNhbmNlbCA9IHZhbHVlLmNhbmNlbDtcbiAgICAgICAgICAgIGlmICghaXNDYWxsYWJsZShjYW5jZWwpKSB7IGNvbnRpbnVlOyB9XG4gICAgICAgIH0gY2F0Y2ggeyBjb250aW51ZTsgfVxuXG4gICAgICAgIGxldCByZXN1bHQ6IHZvaWQgfCBQcm9taXNlTGlrZTx2b2lkPjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlc3VsdCA9IFJlZmxlY3QuYXBwbHkoY2FuY2VsLCB2YWx1ZSwgW2NhdXNlXSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgUHJvbWlzZS5yZWplY3QobmV3IENhbmNlbGxlZFJlamVjdGlvbkVycm9yKHBhcmVudCwgZXJyLCBcIlVuaGFuZGxlZCBleGNlcHRpb24gaW4gY2FuY2VsIG1ldGhvZC5cIikpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXJlc3VsdCkgeyBjb250aW51ZTsgfVxuICAgICAgICByZXN1bHRzLnB1c2goXG4gICAgICAgICAgICAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSAgPyByZXN1bHQgOiBQcm9taXNlLnJlc29sdmUocmVzdWx0KSkuY2F0Y2goKHJlYXNvbj8pID0+IHtcbiAgICAgICAgICAgICAgICBQcm9taXNlLnJlamVjdChuZXcgQ2FuY2VsbGVkUmVqZWN0aW9uRXJyb3IocGFyZW50LCByZWFzb24sIFwiVW5oYW5kbGVkIHJlamVjdGlvbiBpbiBjYW5jZWwgbWV0aG9kLlwiKSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLmFsbChyZXN1bHRzKSBhcyBhbnk7XG59XG5cbi8qKlxuICogUmV0dXJucyBpdHMgYXJndW1lbnQuXG4gKi9cbmZ1bmN0aW9uIGlkZW50aXR5PFQ+KHg6IFQpOiBUIHtcbiAgICByZXR1cm4geDtcbn1cblxuLyoqXG4gKiBUaHJvd3MgaXRzIGFyZ3VtZW50LlxuICovXG5mdW5jdGlvbiB0aHJvd2VyKHJlYXNvbj86IGFueSk6IG5ldmVyIHtcbiAgICB0aHJvdyByZWFzb247XG59XG5cbi8qKlxuICogQXR0ZW1wdHMgdmFyaW91cyBzdHJhdGVnaWVzIHRvIGNvbnZlcnQgYW4gZXJyb3IgdG8gYSBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGVycm9yTWVzc2FnZShlcnI6IGFueSk6IHN0cmluZyB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIEVycm9yIHx8IHR5cGVvZiBlcnIgIT09ICdvYmplY3QnIHx8IGVyci50b1N0cmluZyAhPT0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIFwiXCIgKyBlcnI7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIHt9XG5cbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZXJyKTtcbiAgICB9IGNhdGNoIHt9XG5cbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGVycik7XG4gICAgfSBjYXRjaCB7fVxuXG4gICAgcmV0dXJuIFwiPGNvdWxkIG5vdCBjb252ZXJ0IGVycm9yIHRvIHN0cmluZz5cIjtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBjdXJyZW50IGJhcnJpZXIgcHJvbWlzZSBmb3IgdGhlIGdpdmVuIGNhbmNlbGxhYmxlIHByb21pc2UuIElmIG5lY2Vzc2FyeSwgaW5pdGlhbGlzZXMgdGhlIGJhcnJpZXIuXG4gKi9cbmZ1bmN0aW9uIGN1cnJlbnRCYXJyaWVyPFQ+KHByb21pc2U6IENhbmNlbGxhYmxlUHJvbWlzZTxUPik6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBwd3I6IFBhcnRpYWw8UHJvbWlzZVdpdGhSZXNvbHZlcnM8dm9pZD4+ID0gcHJvbWlzZVtiYXJyaWVyU3ltXSA/PyB7fTtcbiAgICBpZiAoISgncHJvbWlzZScgaW4gcHdyKSkge1xuICAgICAgICBPYmplY3QuYXNzaWduKHB3ciwgcHJvbWlzZVdpdGhSZXNvbHZlcnM8dm9pZD4oKSk7XG4gICAgfVxuICAgIGlmIChwcm9taXNlW2JhcnJpZXJTeW1dID09IG51bGwpIHtcbiAgICAgICAgcHdyLnJlc29sdmUhKCk7XG4gICAgICAgIHByb21pc2VbYmFycmllclN5bV0gPSBwd3I7XG4gICAgfVxuICAgIHJldHVybiBwd3IucHJvbWlzZSE7XG59XG5cbi8vIFBvbHlmaWxsIFByb21pc2Uud2l0aFJlc29sdmVycy5cbmxldCBwcm9taXNlV2l0aFJlc29sdmVycyA9IFByb21pc2Uud2l0aFJlc29sdmVycztcbmlmIChwcm9taXNlV2l0aFJlc29sdmVycyAmJiB0eXBlb2YgcHJvbWlzZVdpdGhSZXNvbHZlcnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBwcm9taXNlV2l0aFJlc29sdmVycyA9IHByb21pc2VXaXRoUmVzb2x2ZXJzLmJpbmQoUHJvbWlzZSk7XG59IGVsc2Uge1xuICAgIHByb21pc2VXaXRoUmVzb2x2ZXJzID0gZnVuY3Rpb24gPFQ+KCk6IFByb21pc2VXaXRoUmVzb2x2ZXJzPFQ+IHtcbiAgICAgICAgbGV0IHJlc29sdmUhOiAodmFsdWU6IFQgfCBQcm9taXNlTGlrZTxUPikgPT4gdm9pZDtcbiAgICAgICAgbGV0IHJlamVjdCE6IChyZWFzb24/OiBhbnkpID0+IHZvaWQ7XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZTxUPigocmVzLCByZWopID0+IHsgcmVzb2x2ZSA9IHJlczsgcmVqZWN0ID0gcmVqOyB9KTtcbiAgICAgICAgcmV0dXJuIHsgcHJvbWlzZSwgcmVzb2x2ZSwgcmVqZWN0IH07XG4gICAgfVxufSIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuaW1wb3J0IHtuZXdSdW50aW1lQ2FsbGVyLCBvYmplY3ROYW1lc30gZnJvbSBcIi4vcnVudGltZS5qc1wiO1xuXG5jb25zdCBjYWxsID0gbmV3UnVudGltZUNhbGxlcihvYmplY3ROYW1lcy5DbGlwYm9hcmQpO1xuXG5jb25zdCBDbGlwYm9hcmRTZXRUZXh0ID0gMDtcbmNvbnN0IENsaXBib2FyZFRleHQgPSAxO1xuXG4vKipcbiAqIFNldHMgdGhlIHRleHQgdG8gdGhlIENsaXBib2FyZC5cbiAqXG4gKiBAcGFyYW0gdGV4dCAtIFRoZSB0ZXh0IHRvIGJlIHNldCB0byB0aGUgQ2xpcGJvYXJkLlxuICogQHJldHVybiBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFNldFRleHQodGV4dDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIGNhbGwoQ2xpcGJvYXJkU2V0VGV4dCwge3RleHR9KTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIENsaXBib2FyZCB0ZXh0XG4gKlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgdGV4dCBmcm9tIHRoZSBDbGlwYm9hcmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBUZXh0KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIGNhbGwoQ2xpcGJvYXJkVGV4dCk7XG59XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbi8qKlxuICogQW55IGlzIGEgZHVtbXkgY3JlYXRpb24gZnVuY3Rpb24gZm9yIHNpbXBsZSBvciB1bmtub3duIHR5cGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQW55PFQgPSBhbnk+KHNvdXJjZTogYW55KTogVCB7XG4gICAgcmV0dXJuIHNvdXJjZTtcbn1cblxuLyoqXG4gKiBCeXRlU2xpY2UgaXMgYSBjcmVhdGlvbiBmdW5jdGlvbiB0aGF0IHJlcGxhY2VzXG4gKiBudWxsIHN0cmluZ3Mgd2l0aCBlbXB0eSBzdHJpbmdzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQnl0ZVNsaWNlKHNvdXJjZTogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gKChzb3VyY2UgPT0gbnVsbCkgPyBcIlwiIDogc291cmNlKTtcbn1cblxuLyoqXG4gKiBBcnJheSB0YWtlcyBhIGNyZWF0aW9uIGZ1bmN0aW9uIGZvciBhbiBhcmJpdHJhcnkgdHlwZVxuICogYW5kIHJldHVybnMgYW4gaW4tcGxhY2UgY3JlYXRpb24gZnVuY3Rpb24gZm9yIGFuIGFycmF5XG4gKiB3aG9zZSBlbGVtZW50cyBhcmUgb2YgdGhhdCB0eXBlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQXJyYXk8VCA9IGFueT4oZWxlbWVudDogKHNvdXJjZTogYW55KSA9PiBUKTogKHNvdXJjZTogYW55KSA9PiBUW10ge1xuICAgIGlmIChlbGVtZW50ID09PSBBbnkpIHtcbiAgICAgICAgcmV0dXJuIChzb3VyY2UpID0+IChzb3VyY2UgPT09IG51bGwgPyBbXSA6IHNvdXJjZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIChzb3VyY2UpID0+IHtcbiAgICAgICAgaWYgKHNvdXJjZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc291cmNlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBzb3VyY2VbaV0gPSBlbGVtZW50KHNvdXJjZVtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICB9O1xufVxuXG4vKipcbiAqIE1hcCB0YWtlcyBjcmVhdGlvbiBmdW5jdGlvbnMgZm9yIHR3byBhcmJpdHJhcnkgdHlwZXNcbiAqIGFuZCByZXR1cm5zIGFuIGluLXBsYWNlIGNyZWF0aW9uIGZ1bmN0aW9uIGZvciBhbiBvYmplY3RcbiAqIHdob3NlIGtleXMgYW5kIHZhbHVlcyBhcmUgb2YgdGhvc2UgdHlwZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBNYXA8ViA9IGFueT4oa2V5OiAoc291cmNlOiBhbnkpID0+IHN0cmluZywgdmFsdWU6IChzb3VyY2U6IGFueSkgPT4gVik6IChzb3VyY2U6IGFueSkgPT4gUmVjb3JkPHN0cmluZywgVj4ge1xuICAgIGlmICh2YWx1ZSA9PT0gQW55KSB7XG4gICAgICAgIHJldHVybiAoc291cmNlKSA9PiAoc291cmNlID09PSBudWxsID8ge30gOiBzb3VyY2UpO1xuICAgIH1cblxuICAgIHJldHVybiAoc291cmNlKSA9PiB7XG4gICAgICAgIGlmIChzb3VyY2UgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgIHNvdXJjZVtrZXldID0gdmFsdWUoc291cmNlW2tleV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgfTtcbn1cblxuLyoqXG4gKiBOdWxsYWJsZSB0YWtlcyBhIGNyZWF0aW9uIGZ1bmN0aW9uIGZvciBhbiBhcmJpdHJhcnkgdHlwZVxuICogYW5kIHJldHVybnMgYSBjcmVhdGlvbiBmdW5jdGlvbiBmb3IgYSBudWxsYWJsZSB2YWx1ZSBvZiB0aGF0IHR5cGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBOdWxsYWJsZTxUID0gYW55PihlbGVtZW50OiAoc291cmNlOiBhbnkpID0+IFQpOiAoc291cmNlOiBhbnkpID0+IChUIHwgbnVsbCkge1xuICAgIGlmIChlbGVtZW50ID09PSBBbnkpIHtcbiAgICAgICAgcmV0dXJuIEFueTtcbiAgICB9XG5cbiAgICByZXR1cm4gKHNvdXJjZSkgPT4gKHNvdXJjZSA9PT0gbnVsbCA/IG51bGwgOiBlbGVtZW50KHNvdXJjZSkpO1xufVxuXG4vKipcbiAqIFN0cnVjdCB0YWtlcyBhbiBvYmplY3QgbWFwcGluZyBmaWVsZCBuYW1lcyB0byBjcmVhdGlvbiBmdW5jdGlvbnNcbiAqIGFuZCByZXR1cm5zIGFuIGluLXBsYWNlIGNyZWF0aW9uIGZ1bmN0aW9uIGZvciBhIHN0cnVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFN0cnVjdChjcmVhdGVGaWVsZDogUmVjb3JkPHN0cmluZywgKHNvdXJjZTogYW55KSA9PiBhbnk+KTpcbiAgICA8VSBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBhbnk+KHNvdXJjZTogYW55KSA9PiBVXG57XG4gICAgbGV0IGFsbEFueSA9IHRydWU7XG4gICAgZm9yIChjb25zdCBuYW1lIGluIGNyZWF0ZUZpZWxkKSB7XG4gICAgICAgIGlmIChjcmVhdGVGaWVsZFtuYW1lXSAhPT0gQW55KSB7XG4gICAgICAgICAgICBhbGxBbnkgPSBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChhbGxBbnkpIHtcbiAgICAgICAgcmV0dXJuIEFueTtcbiAgICB9XG5cbiAgICByZXR1cm4gKHNvdXJjZSkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgaW4gY3JlYXRlRmllbGQpIHtcbiAgICAgICAgICAgIGlmIChuYW1lIGluIHNvdXJjZSkge1xuICAgICAgICAgICAgICAgIHNvdXJjZVtuYW1lXSA9IGNyZWF0ZUZpZWxkW25hbWVdKHNvdXJjZVtuYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICB9O1xufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5leHBvcnQgaW50ZXJmYWNlIFNpemUge1xuICAgIC8qKiBUaGUgd2lkdGggb2YgYSByZWN0YW5ndWxhciBhcmVhLiAqL1xuICAgIFdpZHRoOiBudW1iZXI7XG4gICAgLyoqIFRoZSBoZWlnaHQgb2YgYSByZWN0YW5ndWxhciBhcmVhLiAqL1xuICAgIEhlaWdodDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlY3Qge1xuICAgIC8qKiBUaGUgWCBjb29yZGluYXRlIG9mIHRoZSBvcmlnaW4uICovXG4gICAgWDogbnVtYmVyO1xuICAgIC8qKiBUaGUgWSBjb29yZGluYXRlIG9mIHRoZSBvcmlnaW4uICovXG4gICAgWTogbnVtYmVyO1xuICAgIC8qKiBUaGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZS4gKi9cbiAgICBXaWR0aDogbnVtYmVyO1xuICAgIC8qKiBUaGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUuICovXG4gICAgSGVpZ2h0OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2NyZWVuIHtcbiAgICAvKiogVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBzY3JlZW4uICovXG4gICAgSUQ6IHN0cmluZztcbiAgICAvKiogSHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgc2NyZWVuLiAqL1xuICAgIE5hbWU6IHN0cmluZztcbiAgICAvKiogVGhlIHNjYWxlIGZhY3RvciBvZiB0aGUgc2NyZWVuIChEUEkvOTYpLiAxID0gc3RhbmRhcmQgRFBJLCAyID0gSGlEUEkgKFJldGluYSksIGV0Yy4gKi9cbiAgICBTY2FsZUZhY3RvcjogbnVtYmVyO1xuICAgIC8qKiBUaGUgWCBjb29yZGluYXRlIG9mIHRoZSBzY3JlZW4uICovXG4gICAgWDogbnVtYmVyO1xuICAgIC8qKiBUaGUgWSBjb29yZGluYXRlIG9mIHRoZSBzY3JlZW4uICovXG4gICAgWTogbnVtYmVyO1xuICAgIC8qKiBDb250YWlucyB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgc2NyZWVuLiAqL1xuICAgIFNpemU6IFNpemU7XG4gICAgLyoqIENvbnRhaW5zIHRoZSBib3VuZHMgb2YgdGhlIHNjcmVlbiBpbiB0ZXJtcyBvZiBYLCBZLCBXaWR0aCwgYW5kIEhlaWdodC4gKi9cbiAgICBCb3VuZHM6IFJlY3Q7XG4gICAgLyoqIENvbnRhaW5zIHRoZSBwaHlzaWNhbCBib3VuZHMgb2YgdGhlIHNjcmVlbiBpbiB0ZXJtcyBvZiBYLCBZLCBXaWR0aCwgYW5kIEhlaWdodCAoYmVmb3JlIHNjYWxpbmcpLiAqL1xuICAgIFBoeXNpY2FsQm91bmRzOiBSZWN0O1xuICAgIC8qKiBDb250YWlucyB0aGUgYXJlYSBvZiB0aGUgc2NyZWVuIHRoYXQgaXMgYWN0dWFsbHkgdXNhYmxlIChleGNsdWRpbmcgdGFza2JhciBhbmQgb3RoZXIgc3lzdGVtIFVJKS4gKi9cbiAgICBXb3JrQXJlYTogUmVjdDtcbiAgICAvKiogQ29udGFpbnMgdGhlIHBoeXNpY2FsIFdvcmtBcmVhIG9mIHRoZSBzY3JlZW4gKGJlZm9yZSBzY2FsaW5nKS4gKi9cbiAgICBQaHlzaWNhbFdvcmtBcmVhOiBSZWN0O1xuICAgIC8qKiBUcnVlIGlmIHRoaXMgaXMgdGhlIHByaW1hcnkgbW9uaXRvciBzZWxlY3RlZCBieSB0aGUgdXNlciBpbiB0aGUgb3BlcmF0aW5nIHN5c3RlbS4gKi9cbiAgICBJc1ByaW1hcnk6IGJvb2xlYW47XG4gICAgLyoqIFRoZSByb3RhdGlvbiBvZiB0aGUgc2NyZWVuLiAqL1xuICAgIFJvdGF0aW9uOiBudW1iZXI7XG59XG5cbmltcG9ydCB7IG5ld1J1bnRpbWVDYWxsZXIsIG9iamVjdE5hbWVzIH0gZnJvbSBcIi4vcnVudGltZS5qc1wiO1xuY29uc3QgY2FsbCA9IG5ld1J1bnRpbWVDYWxsZXIob2JqZWN0TmFtZXMuU2NyZWVucyk7XG5cbmNvbnN0IGdldEFsbCA9IDA7XG5jb25zdCBnZXRQcmltYXJ5ID0gMTtcbmNvbnN0IGdldEN1cnJlbnQgPSAyO1xuXG4vKipcbiAqIEdldHMgYWxsIHNjcmVlbnMuXG4gKlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgb2YgU2NyZWVuIG9iamVjdHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBHZXRBbGwoKTogUHJvbWlzZTxTY3JlZW5bXT4ge1xuICAgIHJldHVybiBjYWxsKGdldEFsbCk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgcHJpbWFyeSBzY3JlZW4uXG4gKlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHByaW1hcnkgc2NyZWVuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gR2V0UHJpbWFyeSgpOiBQcm9taXNlPFNjcmVlbj4ge1xuICAgIHJldHVybiBjYWxsKGdldFByaW1hcnkpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGN1cnJlbnQgYWN0aXZlIHNjcmVlbi5cbiAqXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBjdXJyZW50IGFjdGl2ZSBzY3JlZW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBHZXRDdXJyZW50KCk6IFByb21pc2U8U2NyZWVuPiB7XG4gICAgcmV0dXJuIGNhbGwoZ2V0Q3VycmVudCk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7QUNBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7QUNBQTtBQUFBO0FBQUE7QUFBQTs7O0FDNkJBLElBQU0sY0FDRjtBQUVHLFNBQVMsT0FBTyxPQUFlLElBQVk7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MkJBQTJCO0FBQUEsSUFDM0IsK0JBQStCO0FBQUEsSUFDL0Isb0JBQW9CO0FBQUEsSUFDcEIsNEJBQTRCO0FBQUEsSUFDNUIsc0JBQXNCO0FBQUEsSUFDdEIsc0JBQXNCO0FBQUEsSUFDdEIsK0JBQStCO0FBQUEsSUFDL0IsNkJBQTZCO0FBQUEsSUFDN0IsZ0NBQWdDO0FBQUEsSUFDaEMscUJBQXFCO0FBQUEsSUFDckIsNkJBQTZCO0FBQUEsSUFDN0IsMEJBQTBCO0FBQUEsSUFDMUIsdUJBQXVCO0FBQUEsSUFDdkIsdUJBQXVCO0FBQUEsSUFDdkIsZ0JBQWdCO0FBQUEsSUFDaEIsc0JBQXNCO0FBQUEsSUFDdEIsY0FBYztBQUFBLElBQ2Qsb0JBQW9CO0FBQUEsSUFDcEIsb0JBQW9CO0FBQUEsSUFDcEIsc0JBQXNCO0FBQUEsSUFDdEIsYUFBYTtBQUFBLElBQ2IsY0FBYztBQUFBLElBQ2QsbUJBQW1CO0FBQUEsSUFDbkIsbUJBQW1CO0FBQUEsSUFDbkIseUJBQXlCO0FBQUEsSUFDekIsZUFBZTtBQUFBLElBQ2YsaUJBQWlCO0FBQUEsSUFDakIsdUJBQXVCO0FBQUEsSUFDdkIscUJBQXFCO0FBQUEsSUFDckIscUJBQXFCO0FBQUEsSUFDckIsdUJBQXVCO0FBQUEsSUFDdkIsY0FBYztBQUFBLElBQ2QsZUFBZTtBQUFBLElBQ2Ysb0JBQW9CO0FBQUEsSUFDcEIsb0JBQW9CO0FBQUEsSUFDcEIsMEJBQTBCO0FBQUEsSUFDMUIsZ0JBQWdCO0FBQUEsSUFDaEIsNEJBQTRCO0FBQUEsSUFDNUIsNEJBQTRCO0FBQUEsSUFDNUIseURBQXlEO0FBQUEsSUFDekQsc0NBQXNDO0FBQUEsSUFDdEMsb0JBQW9CO0FBQUEsSUFDcEIscUJBQXFCO0FBQUEsSUFDckIscUJBQXFCO0FBQUEsSUFDckIsc0JBQXNCO0FBQUEsSUFDdEIsZ0NBQWdDO0FBQUEsSUFDaEMsa0NBQWtDO0FBQUEsSUFDbEMsbUNBQW1DO0FBQUEsSUFDbkMsb0NBQW9DO0FBQUEsSUFDcEMsK0JBQStCO0FBQUEsSUFDL0IsNkJBQTZCO0FBQUEsSUFDN0IsdUJBQXVCO0FBQUEsSUFDdkIsaUNBQWlDO0FBQUEsSUFDakMsOEJBQThCO0FBQUEsSUFDOUIsNEJBQTRCO0FBQUEsSUFDNUIsc0NBQXNDO0FBQUEsSUFDdEMsNEJBQTRCO0FBQUEsSUFDNUIsc0JBQXNCO0FBQUEsSUFDdEIsa0NBQWtDO0FBQUEsSUFDbEMsc0JBQXNCO0FBQUEsSUFDdEIsd0JBQXdCO0FBQUEsSUFDeEIsd0JBQXdCO0FBQUEsSUFDeEIsbUJBQW1CO0FBQUEsSUFDbkIsMEJBQTBCO0FBQUEsSUFDMUIsOEJBQThCO0FBQUEsSUFDOUIseUJBQXlCO0FBQUEsSUFDekIsNkJBQTZCO0FBQUEsSUFDN0IsaUJBQWlCO0FBQUEsSUFDakIsZ0JBQWdCO0FBQUEsSUFDaEIsc0JBQXNCO0FBQUEsSUFDdEIsZUFBZTtBQUFBLElBQ2YseUJBQXlCO0FBQUEsSUFDekIsd0JBQXdCO0FBQUEsSUFDeEIsb0JBQW9CO0FBQUEsSUFDcEIscUJBQXFCO0FBQUEsSUFDckIsaUJBQWlCO0FBQUEsSUFDakIsaUJBQWlCO0FBQUEsSUFDakIsc0JBQXNCO0FBQUEsSUFDdEIsbUNBQW1DO0FBQUEsSUFDbkMscUNBQXFDO0FBQUEsSUFDckMsdUJBQXVCO0FBQUEsSUFDdkIsc0JBQXNCO0FBQUEsSUFDdEIsd0JBQXdCO0FBQUEsSUFDeEIsZUFBZTtBQUFBLElBQ2YsMkJBQTJCO0FBQUEsSUFDM0IsMEJBQTBCO0FBQUEsSUFDMUIsNkJBQTZCO0FBQUEsSUFDN0IsWUFBWTtBQUFBLElBQ1osZ0JBQWdCO0FBQUEsSUFDaEIsa0JBQWtCO0FBQUEsSUFDbEIsZ0JBQWdCO0FBQUEsSUFDaEIsa0JBQWtCO0FBQUEsSUFDbEIsbUJBQW1CO0FBQUEsSUFDbkIsWUFBWTtBQUFBLElBQ1oscUJBQXFCO0FBQUEsSUFDckIsc0JBQXNCO0FBQUEsSUFDdEIsc0JBQXNCO0FBQUEsSUFDdEIsOEJBQThCO0FBQUEsSUFDOUIsaUJBQWlCO0FBQUEsSUFDakIseUJBQXlCO0FBQUEsSUFDekIsMkJBQTJCO0FBQUEsSUFDM0IsK0JBQStCO0FBQUEs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O0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFDSjs7O0FDekdBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQXdEQSxJQUFNQyxRQUFPLGlCQUFpQixZQUFZLE9BQU87QUFFakQsSUFBTSxTQUFTO0FBQ2YsSUFBTSxhQUFhO0FBQ25CLElBQU0sYUFBYTtBQU9aLFNBQVMsU0FBNEI7QUFDeEMsU0FBT0EsTUFBSyxNQUFNO0FBQ3RCO0FBT08sU0FBUyxhQUE4QjtBQUMxQyxTQUFPQSxNQUFLLFVBQVU7QUFDMUI7QUFPTyxTQUFTLGFBQThCO0FBQzFDLFNBQU9BLE1BQUssVUFBVTtBQUMxQjs7O0F0QjVFQSxPQUFPLFNBQVMsT0FBTyxVQUFVLENBQUM7QUE0Q2xDLE9BQU8sT0FBTyxTQUFnQjtBQUN2QixPQUFPLHFCQUFxQjsiLAogICJuYW1lcyI6IFsiX2EiLCAiRXJyb3IiLCAiY2FsbCIsICJfYSIsICJFcnJvciIsICJjYWxsIiwgIl9hIiwgInJlc2l6YWJsZSIsICJjYWxsIiwgIl9hIiwgImNhbGwiLCAiY2FsbCIsICJIaWRlTWV0aG9kIiwgIlNob3dNZXRob2QiLCAiaXNEb2N1bWVudERvdEFsbCIsICJfYSIsICJyZWFzb24iLCAidmFsdWUiLCAiY2FsbCIsICJnZXRBbmREZWxldGVSZXNwb25zZSIsICJnZW5lcmF0ZUlEIiwgImNhbGwiLCAiQXJyYXkiLCAiTWFwIiwgIkFycmF5IiwgIk1hcCIsICJrZXkiLCAiY2FsbCJdCn0K diff --git a/v3/internal/assetserver/bundledassets/runtime.js b/v3/internal/assetserver/bundledassets/runtime.js index 25de50230..25dea97a0 100644 --- a/v3/internal/assetserver/bundledassets/runtime.js +++ b/v3/internal/assetserver/bundledassets/runtime.js @@ -1 +1 @@ -var Le=Object.defineProperty,ln=Object.defineProperties;var cn=Object.getOwnPropertyDescriptors;var Oe=Object.getOwnPropertySymbols;var dn=Object.prototype.hasOwnProperty,mn=Object.prototype.propertyIsEnumerable;var Fe=(n,e,i)=>e in n?Le(n,e,{enumerable:!0,configurable:!0,writable:!0,value:i}):n[e]=i,Ue=(n,e)=>{for(var i in e||(e={}))dn.call(e,i)&&Fe(n,i,e[i]);if(Oe)for(var i of Oe(e))mn.call(e,i)&&Fe(n,i,e[i]);return n},Ie=(n,e)=>ln(n,cn(e));var w=(n,e)=>{for(var i in e)Le(n,i,{get:e[i],enumerable:!0})};var P=(n,e,i)=>new Promise((o,t)=>{var r=l=>{try{c(i.next(l))}catch(u){t(u)}},a=l=>{try{c(i.throw(l))}catch(u){t(u)}},c=l=>l.done?o(l.value):Promise.resolve(l.value).then(r,a);c((i=i.apply(n,e)).next())});var de={};w(de,{Application:()=>ye,Browser:()=>$,Call:()=>xe,CancelError:()=>O,CancellablePromise:()=>B,CancelledRejectionError:()=>W,Clipboard:()=>Ae,Create:()=>Re,Dialogs:()=>ne,Events:()=>te,Flags:()=>pe,Screens:()=>ke,System:()=>we,WML:()=>ce,Window:()=>V});var ce={};w(ce,{Enable:()=>le,Reload:()=>Ye});var $={};w($,{OpenURL:()=>_});var un="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";function D(n=21){let e="",i=n|0;for(;i--;)e+=un[Math.random()*64|0];return e}var wn=window.location.origin+"/wails/runtime",d=Object.freeze({Call:0,Clipboard:1,Application:2,Events:3,ContextMenu:4,Dialog:5,Window:6,Screens:7,System:8,Browser:9,CancelCall:10}),pn=D();function m(n,e=""){return function(i,o=null){return fn(n,i,e,o)}}function fn(n,e,i,o){return P(this,null,function*(){var c,l;let t=new URL(wn);t.searchParams.append("object",n.toString()),t.searchParams.append("method",e.toString()),o&&t.searchParams.append("args",JSON.stringify(o));let r={"x-wails-client-id":pn};i&&(r["x-wails-window-name"]=i);let a=yield fetch(t,{headers:r});if(!a.ok)throw new Error(yield a.text());return((l=(c=a.headers.get("Content-Type"))==null?void 0:c.indexOf("application/json"))!=null?l:-1)!==-1?a.json():a.text()})}var gn=m(d.Browser),hn=0;function _(n){return gn(hn,{url:n.toString()})}var ne={};w(ne,{Error:()=>Rn,Info:()=>xn,OpenFile:()=>En,Question:()=>ee,SaveFile:()=>kn,Warning:()=>An});window._wails=window._wails||{};window._wails.dialogErrorCallback=Sn;window._wails.dialogResultCallback=Mn;var Wn=m(d.Dialog),L=new Map,bn=0,vn=1,yn=2,Cn=3,Pn=4,Dn=5;function Mn(n,e,i){let o=ze(n);if(o)if(i)try{o.resolve(JSON.parse(e))}catch(t){o.reject(new TypeError("could not parse result: "+t.message,{cause:t}))}else o.resolve(e)}function Sn(n,e){var i;(i=ze(n))==null||i.reject(new window.Error(e))}function ze(n){let e=L.get(n);return L.delete(n),e}function Tn(){let n;do n=D();while(L.has(n));return n}function M(n,e={}){let i=Tn();return new Promise((o,t)=>{L.set(i,{resolve:o,reject:t}),Wn(n,Object.assign({"dialog-id":i},e)).catch(r=>{L.delete(i),t(r)})})}function xn(n){return M(bn,n)}function An(n){return M(vn,n)}function Rn(n){return M(yn,n)}function ee(n){return M(Cn,n)}function En(n){var e;return(e=M(Pn,n))!=null?e:[]}function kn(n){return M(Dn,n)}var te={};w(te,{Emit:()=>oe,Off:()=>zn,OffAll:()=>jn,On:()=>Un,OnMultiple:()=>ie,Once:()=>In,Types:()=>Be,WailsEvent:()=>S});var f=new Map,H=class{constructor(e,i,o){this.eventName=e,this.callback=i,this.maxCallbacks=o||-1}dispatch(e){try{this.callback(e)}catch(i){}return this.maxCallbacks===-1?!1:(this.maxCallbacks-=1,this.maxCallbacks===0)}};function je(n){let e=f.get(n.eventName);e&&(e=e.filter(i=>i!==n),e.length===0?f.delete(n.eventName):f.set(n.eventName,e))}var Be=Object.freeze({Windows:Object.freeze({APMPowerSettingChange:"windows:APMPowerSettingChange",APMPowerStatusChange:"windows:APMPowerStatusChange",APMResumeAutomatic:"windows:APMResumeAutomatic",APMResumeSuspend:"windows:APMResumeSuspend",APMSuspend:"windows:APMSuspend",ApplicationStarted:"windows:ApplicationStarted",SystemThemeChanged:"windows:SystemThemeChanged",WebViewNavigationCompleted:"windows:WebViewNavigationCompleted",WindowActive:"windows:WindowActive",WindowBackgroundErase:"windows:WindowBackgroundErase",WindowClickActive:"windows:WindowClickActive",WindowClosing:"windows:WindowClosing",WindowDidMove:"windows:WindowDidMove",WindowDidResize:"windows:WindowDidResize",WindowDPIChanged:"windows:WindowDPIChanged",WindowDragDrop:"windows:WindowDragDrop",WindowDragEnter:"windows:WindowDragEnter",WindowDragLeave:"windows:WindowDragLeave",WindowDragOver:"windows:WindowDragOver",WindowEndMove:"windows:WindowEndMove",WindowEndResize:"windows:WindowEndResize",WindowFullscreen:"windows:WindowFullscreen",WindowHide:"windows:WindowHide",WindowInactive:"windows:WindowInactive",WindowKeyDown:"windows:WindowKeyDown",WindowKeyUp:"windows:WindowKeyUp",WindowKillFocus:"windows:WindowKillFocus",WindowNonClientHit:"windows:WindowNonClientHit",WindowNonClientMouseDown:"windows:WindowNonClientMouseDown",WindowNonClientMouseLeave:"windows:WindowNonClientMouseLeave",WindowNonClientMouseMove:"windows:WindowNonClientMouseMove",WindowNonClientMouseUp:"windows:WindowNonClientMouseUp",WindowPaint:"windows:WindowPaint",WindowRestore:"windows:WindowRestore",WindowSetFocus:"windows:WindowSetFocus",WindowShow:"windows:WindowShow",WindowStartMove:"windows:WindowStartMove",WindowStartResize:"windows:WindowStartResize",WindowUnFullscreen:"windows:WindowUnFullscreen",WindowZOrderChanged:"windows:WindowZOrderChanged",WindowMinimise:"windows:WindowMinimise",WindowUnMinimise:"windows:WindowUnMinimise",WindowMaximise:"windows:WindowMaximise",WindowUnMaximise:"windows:WindowUnMaximise"}),Mac:Object.freeze({ApplicationDidBecomeActive:"mac:ApplicationDidBecomeActive",ApplicationDidChangeBackingProperties:"mac:ApplicationDidChangeBackingProperties",ApplicationDidChangeEffectiveAppearance:"mac:ApplicationDidChangeEffectiveAppearance",ApplicationDidChangeIcon:"mac:ApplicationDidChangeIcon",ApplicationDidChangeOcclusionState:"mac:ApplicationDidChangeOcclusionState",ApplicationDidChangeScreenParameters:"mac:ApplicationDidChangeScreenParameters",ApplicationDidChangeStatusBarFrame:"mac:ApplicationDidChangeStatusBarFrame",ApplicationDidChangeStatusBarOrientation:"mac:ApplicationDidChangeStatusBarOrientation",ApplicationDidChangeTheme:"mac:ApplicationDidChangeTheme",ApplicationDidFinishLaunching:"mac:ApplicationDidFinishLaunching",ApplicationDidHide:"mac:ApplicationDidHide",ApplicationDidResignActive:"mac:ApplicationDidResignActive",ApplicationDidUnhide:"mac:ApplicationDidUnhide",ApplicationDidUpdate:"mac:ApplicationDidUpdate",ApplicationShouldHandleReopen:"mac:ApplicationShouldHandleReopen",ApplicationWillBecomeActive:"mac:ApplicationWillBecomeActive",ApplicationWillFinishLaunching:"mac:ApplicationWillFinishLaunching",ApplicationWillHide:"mac:ApplicationWillHide",ApplicationWillResignActive:"mac:ApplicationWillResignActive",ApplicationWillTerminate:"mac:ApplicationWillTerminate",ApplicationWillUnhide:"mac:ApplicationWillUnhide",ApplicationWillUpdate:"mac:ApplicationWillUpdate",MenuDidAddItem:"mac:MenuDidAddItem",MenuDidBeginTracking:"mac:MenuDidBeginTracking",MenuDidClose:"mac:MenuDidClose",MenuDidDisplayItem:"mac:MenuDidDisplayItem",MenuDidEndTracking:"mac:MenuDidEndTracking",MenuDidHighlightItem:"mac:MenuDidHighlightItem",MenuDidOpen:"mac:MenuDidOpen",MenuDidPopUp:"mac:MenuDidPopUp",MenuDidRemoveItem:"mac:MenuDidRemoveItem",MenuDidSendAction:"mac:MenuDidSendAction",MenuDidSendActionToItem:"mac:MenuDidSendActionToItem",MenuDidUpdate:"mac:MenuDidUpdate",MenuWillAddItem:"mac:MenuWillAddItem",MenuWillBeginTracking:"mac:MenuWillBeginTracking",MenuWillDisplayItem:"mac:MenuWillDisplayItem",MenuWillEndTracking:"mac:MenuWillEndTracking",MenuWillHighlightItem:"mac:MenuWillHighlightItem",MenuWillOpen:"mac:MenuWillOpen",MenuWillPopUp:"mac:MenuWillPopUp",MenuWillRemoveItem:"mac:MenuWillRemoveItem",MenuWillSendAction:"mac:MenuWillSendAction",MenuWillSendActionToItem:"mac:MenuWillSendActionToItem",MenuWillUpdate:"mac:MenuWillUpdate",WebViewDidCommitNavigation:"mac:WebViewDidCommitNavigation",WebViewDidFinishNavigation:"mac:WebViewDidFinishNavigation",WebViewDidReceiveServerRedirectForProvisionalNavigation:"mac:WebViewDidReceiveServerRedirectForProvisionalNavigation",WebViewDidStartProvisionalNavigation:"mac:WebViewDidStartProvisionalNavigation",WindowDidBecomeKey:"mac:WindowDidBecomeKey",WindowDidBecomeMain:"mac:WindowDidBecomeMain",WindowDidBeginSheet:"mac:WindowDidBeginSheet",WindowDidChangeAlpha:"mac:WindowDidChangeAlpha",WindowDidChangeBackingLocation:"mac:WindowDidChangeBackingLocation",WindowDidChangeBackingProperties:"mac:WindowDidChangeBackingProperties",WindowDidChangeCollectionBehavior:"mac:WindowDidChangeCollectionBehavior",WindowDidChangeEffectiveAppearance:"mac:WindowDidChangeEffectiveAppearance",WindowDidChangeOcclusionState:"mac:WindowDidChangeOcclusionState",WindowDidChangeOrderingMode:"mac:WindowDidChangeOrderingMode",WindowDidChangeScreen:"mac:WindowDidChangeScreen",WindowDidChangeScreenParameters:"mac:WindowDidChangeScreenParameters",WindowDidChangeScreenProfile:"mac:WindowDidChangeScreenProfile",WindowDidChangeScreenSpace:"mac:WindowDidChangeScreenSpace",WindowDidChangeScreenSpaceProperties:"mac:WindowDidChangeScreenSpaceProperties",WindowDidChangeSharingType:"mac:WindowDidChangeSharingType",WindowDidChangeSpace:"mac:WindowDidChangeSpace",WindowDidChangeSpaceOrderingMode:"mac:WindowDidChangeSpaceOrderingMode",WindowDidChangeTitle:"mac:WindowDidChangeTitle",WindowDidChangeToolbar:"mac:WindowDidChangeToolbar",WindowDidDeminiaturize:"mac:WindowDidDeminiaturize",WindowDidEndSheet:"mac:WindowDidEndSheet",WindowDidEnterFullScreen:"mac:WindowDidEnterFullScreen",WindowDidEnterVersionBrowser:"mac:WindowDidEnterVersionBrowser",WindowDidExitFullScreen:"mac:WindowDidExitFullScreen",WindowDidExitVersionBrowser:"mac:WindowDidExitVersionBrowser",WindowDidExpose:"mac:WindowDidExpose",WindowDidFocus:"mac:WindowDidFocus",WindowDidMiniaturize:"mac:WindowDidMiniaturize",WindowDidMove:"mac:WindowDidMove",WindowDidOrderOffScreen:"mac:WindowDidOrderOffScreen",WindowDidOrderOnScreen:"mac:WindowDidOrderOnScreen",WindowDidResignKey:"mac:WindowDidResignKey",WindowDidResignMain:"mac:WindowDidResignMain",WindowDidResize:"mac:WindowDidResize",WindowDidUpdate:"mac:WindowDidUpdate",WindowDidUpdateAlpha:"mac:WindowDidUpdateAlpha",WindowDidUpdateCollectionBehavior:"mac:WindowDidUpdateCollectionBehavior",WindowDidUpdateCollectionProperties:"mac:WindowDidUpdateCollectionProperties",WindowDidUpdateShadow:"mac:WindowDidUpdateShadow",WindowDidUpdateTitle:"mac:WindowDidUpdateTitle",WindowDidUpdateToolbar:"mac:WindowDidUpdateToolbar",WindowDidZoom:"mac:WindowDidZoom",WindowFileDraggingEntered:"mac:WindowFileDraggingEntered",WindowFileDraggingExited:"mac:WindowFileDraggingExited",WindowFileDraggingPerformed:"mac:WindowFileDraggingPerformed",WindowHide:"mac:WindowHide",WindowMaximise:"mac:WindowMaximise",WindowUnMaximise:"mac:WindowUnMaximise",WindowMinimise:"mac:WindowMinimise",WindowUnMinimise:"mac:WindowUnMinimise",WindowShouldClose:"mac:WindowShouldClose",WindowShow:"mac:WindowShow",WindowWillBecomeKey:"mac:WindowWillBecomeKey",WindowWillBecomeMain:"mac:WindowWillBecomeMain",WindowWillBeginSheet:"mac:WindowWillBeginSheet",WindowWillChangeOrderingMode:"mac:WindowWillChangeOrderingMode",WindowWillClose:"mac:WindowWillClose",WindowWillDeminiaturize:"mac:WindowWillDeminiaturize",WindowWillEnterFullScreen:"mac:WindowWillEnterFullScreen",WindowWillEnterVersionBrowser:"mac:WindowWillEnterVersionBrowser",WindowWillExitFullScreen:"mac:WindowWillExitFullScreen",WindowWillExitVersionBrowser:"mac:WindowWillExitVersionBrowser",WindowWillFocus:"mac:WindowWillFocus",WindowWillMiniaturize:"mac:WindowWillMiniaturize",WindowWillMove:"mac:WindowWillMove",WindowWillOrderOffScreen:"mac:WindowWillOrderOffScreen",WindowWillOrderOnScreen:"mac:WindowWillOrderOnScreen",WindowWillResignMain:"mac:WindowWillResignMain",WindowWillResize:"mac:WindowWillResize",WindowWillUnfocus:"mac:WindowWillUnfocus",WindowWillUpdate:"mac:WindowWillUpdate",WindowWillUpdateAlpha:"mac:WindowWillUpdateAlpha",WindowWillUpdateCollectionBehavior:"mac:WindowWillUpdateCollectionBehavior",WindowWillUpdateCollectionProperties:"mac:WindowWillUpdateCollectionProperties",WindowWillUpdateShadow:"mac:WindowWillUpdateShadow",WindowWillUpdateTitle:"mac:WindowWillUpdateTitle",WindowWillUpdateToolbar:"mac:WindowWillUpdateToolbar",WindowWillUpdateVisibility:"mac:WindowWillUpdateVisibility",WindowWillUseStandardFrame:"mac:WindowWillUseStandardFrame",WindowZoomIn:"mac:WindowZoomIn",WindowZoomOut:"mac:WindowZoomOut",WindowZoomReset:"mac:WindowZoomReset"}),Linux:Object.freeze({ApplicationStartup:"linux:ApplicationStartup",SystemThemeChanged:"linux:SystemThemeChanged",WindowDeleteEvent:"linux:WindowDeleteEvent",WindowDidMove:"linux:WindowDidMove",WindowDidResize:"linux:WindowDidResize",WindowFocusIn:"linux:WindowFocusIn",WindowFocusOut:"linux:WindowFocusOut",WindowLoadChanged:"linux:WindowLoadChanged"}),Common:Object.freeze({ApplicationOpenedWithFile:"common:ApplicationOpenedWithFile",ApplicationStarted:"common:ApplicationStarted",ThemeChanged:"common:ThemeChanged",WindowClosing:"common:WindowClosing",WindowDidMove:"common:WindowDidMove",WindowDidResize:"common:WindowDidResize",WindowDPIChanged:"common:WindowDPIChanged",WindowFilesDropped:"common:WindowFilesDropped",WindowFocus:"common:WindowFocus",WindowFullscreen:"common:WindowFullscreen",WindowHide:"common:WindowHide",WindowLostFocus:"common:WindowLostFocus",WindowMaximise:"common:WindowMaximise",WindowMinimise:"common:WindowMinimise",WindowRestore:"common:WindowRestore",WindowRuntimeReady:"common:WindowRuntimeReady",WindowShow:"common:WindowShow",WindowUnFullscreen:"common:WindowUnFullscreen",WindowUnMaximise:"common:WindowUnMaximise",WindowUnMinimise:"common:WindowUnMinimise",WindowZoom:"common:WindowZoom",WindowZoomIn:"common:WindowZoomIn",WindowZoomOut:"common:WindowZoomOut",WindowZoomReset:"common:WindowZoomReset"})});window._wails=window._wails||{};window._wails.dispatchWailsEvent=Ln;var On=m(d.Events),Fn=0,S=class{constructor(e,i=null){this.name=e,this.data=i}};function Ln(n){let e=f.get(n.name);if(!e)return;let i=new S(n.name,n.data);"sender"in n&&(i.sender=n.sender),e=e.filter(o=>!o.dispatch(i)),e.length===0?f.delete(n.name):f.set(n.name,e)}function ie(n,e,i){let o=f.get(n)||[],t=new H(n,e,i);return o.push(t),f.set(n,o),()=>je(t)}function Un(n,e){return ie(n,e,-1)}function In(n,e){return ie(n,e,1)}function zn(...n){n.forEach(e=>f.delete(e))}function jn(){f.clear()}function oe(n){return On(Fn,n)}function He(){return new MouseEvent("mousedown").buttons===0}function Ne(){if(!EventTarget||!AbortSignal||!AbortController)return!1;let n=!0,e=new EventTarget,i=new AbortController;return e.addEventListener("test",()=>{n=!1},{signal:i.signal}),i.abort(),e.dispatchEvent(new CustomEvent("test")),n}function N(n){var e;return n.target instanceof HTMLElement?n.target:!(n.target instanceof HTMLElement)&&n.target instanceof Node&&(e=n.target.parentElement)!=null?e:document.body}var Ze=!1;document.addEventListener("DOMContentLoaded",()=>{Ze=!0});function Ve(n){Ze||document.readyState==="complete"?n():document.addEventListener("DOMContentLoaded",n)}var Bn=0,Hn=1,Nn=2,Zn=3,Vn=4,Kn=5,Gn=6,Yn=7,Xn=8,Jn=9,Qn=10,qn=11,_n=12,$n=13,ei=14,ni=15,ii=16,oi=17,ti=18,ri=19,si=20,ai=21,li=22,ci=23,di=24,mi=25,ui=26,wi=27,pi=28,fi=29,gi=30,hi=31,Wi=32,bi=33,vi=34,yi=35,Ci=36,Pi=37,Di=38,Mi=39,Si=40,Ti=41,xi=42,Ai=43,Ri=44,Ei=45,ki=46,Oi=47,s=Symbol("caller");s;var Z=class Z{constructor(e=""){this[s]=m(d.Window,e);for(let i of Object.getOwnPropertyNames(Z.prototype))i!=="constructor"&&typeof this[i]=="function"&&(this[i]=this[i].bind(this))}Get(e){return new Z(e)}Position(){return this[s](Bn)}Center(){return this[s](Hn)}Close(){return this[s](Nn)}DisableSizeConstraints(){return this[s](Zn)}EnableSizeConstraints(){return this[s](Vn)}Focus(){return this[s](Kn)}ForceReload(){return this[s](Gn)}Fullscreen(){return this[s](Yn)}GetScreen(){return this[s](Xn)}GetZoom(){return this[s](Jn)}Height(){return this[s](Qn)}Hide(){return this[s](qn)}IsFocused(){return this[s](_n)}IsFullscreen(){return this[s]($n)}IsMaximised(){return this[s](ei)}IsMinimised(){return this[s](ni)}Maximise(){return this[s](ii)}Minimise(){return this[s](oi)}Name(){return this[s](ti)}OpenDevTools(){return this[s](ri)}RelativePosition(){return this[s](si)}Reload(){return this[s](ai)}Resizable(){return this[s](li)}Restore(){return this[s](ci)}SetPosition(e,i){return this[s](di,{x:e,y:i})}SetAlwaysOnTop(e){return this[s](mi,{alwaysOnTop:e})}SetBackgroundColour(e,i,o,t){return this[s](ui,{r:e,g:i,b:o,a:t})}SetFrameless(e){return this[s](wi,{frameless:e})}SetFullscreenButtonEnabled(e){return this[s](pi,{enabled:e})}SetMaxSize(e,i){return this[s](fi,{width:e,height:i})}SetMinSize(e,i){return this[s](gi,{width:e,height:i})}SetRelativePosition(e,i){return this[s](hi,{x:e,y:i})}SetResizable(e){return this[s](Wi,{resizable:e})}SetSize(e,i){return this[s](bi,{width:e,height:i})}SetTitle(e){return this[s](vi,{title:e})}SetZoom(e){return this[s](yi,{zoom:e})}Show(){return this[s](Ci)}Size(){return this[s](Pi)}ToggleFullscreen(){return this[s](Di)}ToggleMaximise(){return this[s](Mi)}UnFullscreen(){return this[s](Si)}UnMaximise(){return this[s](Ti)}UnMinimise(){return this[s](xi)}Width(){return this[s](Ai)}Zoom(){return this[s](Ri)}ZoomIn(){return this[s](Ei)}ZoomOut(){return this[s](ki)}ZoomReset(){return this[s](Oi)}},re=Z,Fi=new re(""),V=Fi;function Li(n,e=null){oe(new S(n,e))}function Ui(n,e){let i=V.Get(n),o=i[e];if(typeof o=="function")try{o.call(i)}catch(t){}}function Ke(n){let e=n.currentTarget;function i(t="Yes"){if(t!=="Yes")return;let r=e.getAttribute("wml-event")||e.getAttribute("data-wml-event"),a=e.getAttribute("wml-target-window")||e.getAttribute("data-wml-target-window")||"",c=e.getAttribute("wml-window")||e.getAttribute("data-wml-window"),l=e.getAttribute("wml-openurl")||e.getAttribute("data-wml-openurl");r!==null&&Li(r),c!==null&&Ui(a,c),l!==null&&_(l)}let o=e.getAttribute("wml-confirm")||e.getAttribute("data-wml-confirm");o?ee({Title:"Confirm",Message:o,Detached:!1,Buttons:[{Label:"Yes"},{Label:"No",IsDefault:!0}]}).then(i):i()}var U=Symbol("controller"),T=Symbol("triggerMap"),b=Symbol("elementCount");U;var se=class{constructor(){this[U]=new AbortController}set(e,i){return{signal:this[U].signal}}reset(){this[U].abort(),this[U]=new AbortController}};T,b;var ae=class{constructor(){this[T]=new WeakMap,this[b]=0}set(e,i){return this[T].has(e)||this[b]++,this[T].set(e,i),{}}reset(){if(!(this[b]<=0)){for(let e of document.body.querySelectorAll("*")){if(this[b]<=0)break;let i=this[T].get(e);i!=null&&this[b]--;for(let o of i||[])e.removeEventListener(o,Ke)}this[T]=new WeakMap,this[b]=0}}},Ge=Ne()?new se:new ae;function Ii(n){let e=/\S+/g,i=n.getAttribute("wml-trigger")||n.getAttribute("data-wml-trigger")||"click",o=[],t;for(;(t=e.exec(i))!==null;)o.push(t[0]);let r=Ge.set(n,o);for(let a of o)n.addEventListener(a,Ke,r)}function le(){Ve(Ye)}function Ye(){Ge.reset(),document.body.querySelectorAll("[wml-event], [wml-window], [wml-openurl], [data-wml-event], [data-wml-window], [data-wml-openurl]").forEach(Ii)}window.wails=de;le();var we={};w(we,{Capabilities:()=>Hi,Environment:()=>Ni,IsAMD64:()=>Ki,IsARM:()=>Gi,IsARM64:()=>Yi,IsDarkMode:()=>Bi,IsDebug:()=>ue,IsLinux:()=>Zi,IsMac:()=>Vi,IsWindows:()=>K,invoke:()=>v});var Xe=m(d.System),zi=0,ji=1,me=function(){var n,e,i,o,t;try{if((e=(n=window.chrome)==null?void 0:n.webview)!=null&&e.postMessage)return window.chrome.webview.postMessage.bind(window.chrome.webview);if((t=(o=(i=window.webkit)==null?void 0:i.messageHandlers)==null?void 0:o.external)!=null&&t.postMessage)return window.webkit.messageHandlers.external.postMessage.bind(window.webkit.messageHandlers.external)}catch(r){}return null}();function v(n){me==null||me(n)}function Bi(){return Xe(zi)}function Hi(){return P(this,null,function*(){let n=yield fetch("/wails/capabilities");if(n.ok)return n.json();throw new Error("could not fetch capabilities: "+n.statusText)})}function Ni(){return Xe(ji)}function K(){return window._wails.environment.OS==="windows"}function Zi(){return window._wails.environment.OS==="linux"}function Vi(){return window._wails.environment.OS==="darwin"}function Ki(){return window._wails.environment.Arch==="amd64"}function Gi(){return window._wails.environment.Arch==="arm"}function Yi(){return window._wails.environment.Arch==="arm64"}function ue(){return!!window._wails.environment.Debug}window.addEventListener("contextmenu",qi);var Xi=m(d.ContextMenu),Ji=0;function Qi(n,e,i,o){Xi(Ji,{id:n,x:e,y:i,data:o})}function qi(n){let e=N(n),i=window.getComputedStyle(e).getPropertyValue("--custom-contextmenu").trim();if(i){n.preventDefault();let o=window.getComputedStyle(e).getPropertyValue("--custom-contextmenu-data");Qi(i,n.clientX,n.clientY,o)}else _i(n,e)}function _i(n,e){if(ue())return;switch(window.getComputedStyle(e).getPropertyValue("--default-contextmenu").trim()){case"show":return;case"hide":n.preventDefault();return}if(e.isContentEditable)return;let i=window.getSelection(),o=i&&i.toString().length>0;if(o)for(let t=0;tI});function I(n){try{return window._wails.flags[n]}catch(e){throw new Error("Unable to retrieve flag '"+n+"': "+e,{cause:e})}}var z=!1,j=!1,We=!1,A=!1,R=!1,y="",Je="auto",x=0,fe=He();window._wails=window._wails||{};window._wails.setResizable=n=>{We=n,We||(A=R=!1,p())};window.addEventListener("mousedown",be,{capture:!0});window.addEventListener("mousemove",be,{capture:!0});window.addEventListener("mouseup",be,{capture:!0});for(let n of["click","contextmenu","dblclick"])window.addEventListener(n,$i,{capture:!0});function $i(n){(j||R)&&(n.stopImmediatePropagation(),n.stopPropagation(),n.preventDefault())}var ge=0,eo=1,he=2;function be(n){let e,i=n.buttons;switch(n.type){case"mousedown":e=ge,fe||(i=x|1<lo,Quit:()=>mo,Show:()=>co});var ve=m(d.Application),ro=0,so=1,ao=2;function lo(){return ve(ro)}function co(){return ve(so)}function mo(){return ve(ao)}var xe={};w(xe,{ByID:()=>Oo,ByName:()=>ko,Call:()=>Te,RuntimeError:()=>J});var qe=Function.prototype.toString,E=typeof Reflect=="object"&&Reflect!==null&&Reflect.apply,Ce,G;if(typeof E=="function"&&typeof Object.defineProperty=="function")try{Ce=Object.defineProperty({},"length",{get:function(){throw G}}),G={},E(function(){throw 42},null,Ce)}catch(n){n!==G&&(E=null)}else E=null;var uo=/^\s*class\b/,De=function(e){try{var i=qe.call(e);return uo.test(i)}catch(o){return!1}},Pe=function(e){try{return De(e)?!1:(qe.call(e),!0)}catch(i){return!1}},Y=Object.prototype.toString,wo="[object Object]",po="[object Function]",fo="[object GeneratorFunction]",go="[object HTMLAllCollection]",ho="[object HTML document.all class]",Wo="[object HTMLCollection]",bo=typeof Symbol=="function"&&!!Symbol.toStringTag,vo=!(0 in[,]),Me=function(){return!1};typeof document=="object"&&(Qe=document.all,Y.call(Qe)===Y.call(document.all)&&(Me=function(e){if((vo||!e)&&(typeof e=="undefined"||typeof e=="object"))try{var i=Y.call(e);return(i===go||i===ho||i===Wo||i===wo)&&e("")==null}catch(o){}return!1}));var Qe;function yo(n){if(Me(n))return!0;if(!n||typeof n!="function"&&typeof n!="object")return!1;try{E(n,null,Ce)}catch(e){if(e!==G)return!1}return!De(n)&&Pe(n)}function Co(n){if(Me(n))return!0;if(!n||typeof n!="function"&&typeof n!="object")return!1;if(bo)return Pe(n);if(De(n))return!1;var e=Y.call(n);return e!==po&&e!==fo&&!/^\[object HTML/.test(e)?!1:Pe(n)}var h=E?yo:Co;var O=class extends Error{constructor(e,i){super(e,i),this.name="CancelError"}},W=class extends Error{constructor(e,i,o){super((o!=null?o:"Unhandled rejection in cancelled promise.")+" Reason: "+Po(i),{cause:i}),this.promise=e,this.name="CancelledRejectionError"}},g=Symbol("barrier"),Se=Symbol("cancelImpl"),nn,_e=(nn=Symbol.species)!=null?nn:Symbol("speciesPolyfill"),B=class n extends Promise{constructor(e,i){let o,t;if(super((l,u)=>{o=l,t=u}),this.constructor[_e]!==Promise)throw new TypeError("CancellablePromise does not support transparent subclassing. Please refrain from overriding the [Symbol.species] static property.");let r={promise:this,resolve:o,reject:t,get oncancelled(){return i!=null?i:null},set oncancelled(l){i=l!=null?l:void 0}},a={get root(){return a},resolving:!1,settled:!1};Object.defineProperties(this,{[g]:{configurable:!1,enumerable:!1,writable:!0,value:null},[Se]:{configurable:!1,enumerable:!1,writable:!1,value:on(r,a)}});let c=rn(r,a);try{e(tn(r,a),c)}catch(l){a.resolving||c(l)}}cancel(e){return new n(i=>{Promise.all([this[Se](new O("Promise cancelled.",{cause:e})),Do(this)]).then(()=>i(),()=>i())})}cancelOn(e){return e.aborted?this.cancel(e.reason):e.addEventListener("abort",()=>void this.cancel(e.reason),{capture:!0}),this}then(e,i,o){if(!(this instanceof n))throw new TypeError("CancellablePromise.prototype.then called on an invalid object.");if(h(e)||(e=$e),h(i)||(i=en),e===$e&&i==en)return new n(r=>r(this));let t={};return this[g]=t,new n((r,a)=>{super.then(c=>{var l;this[g]===t&&(this[g]=null),(l=t.resolve)==null||l.call(t);try{r(e(c))}catch(u){a(u)}},c=>{var l;this[g]===t&&(this[g]=null),(l=t.resolve)==null||l.call(t);try{r(i(c))}catch(u){a(u)}})},r=>P(this,null,function*(){try{return o==null?void 0:o(r)}finally{yield this.cancel(r)}}))}catch(e,i){return this.then(void 0,e,i)}finally(e,i){if(!(this instanceof n))throw new TypeError("CancellablePromise.prototype.finally called on an invalid object.");return h(e)?this.then(o=>n.resolve(e()).then(()=>o),o=>n.resolve(e()).then(()=>{throw o}),i):this.then(e,e,i)}static get[(g,Se,_e)](){return Promise}static all(e){let i=Array.from(e),o=i.length===0?n.resolve(i):new n((t,r)=>{Promise.all(i).then(t,r)},t=>X(o,i,t));return o}static allSettled(e){let i=Array.from(e),o=i.length===0?n.resolve(i):new n((t,r)=>{Promise.allSettled(i).then(t,r)},t=>X(o,i,t));return o}static any(e){let i=Array.from(e),o=i.length===0?n.resolve(i):new n((t,r)=>{Promise.any(i).then(t,r)},t=>X(o,i,t));return o}static race(e){let i=Array.from(e),o=new n((t,r)=>{Promise.race(i).then(t,r)},t=>X(o,i,t));return o}static cancel(e){let i=new n(()=>{});return i.cancel(e),i}static timeout(e,i){let o=new n(()=>{});return AbortSignal&&typeof AbortSignal=="function"&&AbortSignal.timeout&&typeof AbortSignal.timeout=="function"?AbortSignal.timeout(e).addEventListener("abort",()=>void o.cancel(i)):setTimeout(()=>void o.cancel(i),e),o}static sleep(e,i){return new n(o=>{setTimeout(()=>o(i),e)})}static reject(e){return new n((i,o)=>o(e))}static resolve(e){return e instanceof n?e:new n(i=>i(e))}static withResolvers(){let e={oncancelled:null};return e.promise=new n((i,o)=>{e.resolve=i,e.reject=o},i=>{var o;(o=e.oncancelled)==null||o.call(e,i)}),e}};function on(n,e){let i;return o=>{if(e.settled||(e.settled=!0,e.reason=o,n.reject(o),Promise.prototype.then.call(n.promise,void 0,t=>{if(t!==o)throw t})),!(!e.reason||!n.oncancelled))return i=new Promise(t=>{try{t(n.oncancelled(e.reason.cause))}catch(r){Promise.reject(new W(n.promise,r,"Unhandled exception in oncancelled callback."))}}).catch(t=>{Promise.reject(new W(n.promise,t,"Unhandled rejection in oncancelled callback."))}),n.oncancelled=null,i}}function tn(n,e){return i=>{if(!e.resolving){if(e.resolving=!0,i===n.promise){if(e.settled)return;e.settled=!0,n.reject(new TypeError("A promise cannot be resolved with itself."));return}if(i!=null&&(typeof i=="object"||typeof i=="function")){let o;try{o=i.then}catch(t){e.settled=!0,n.reject(t);return}if(h(o)){try{let a=i.cancel;if(h(a)){let c=l=>{Reflect.apply(a,i,[l])};e.reason?on(Ie(Ue({},n),{oncancelled:c}),e)(e.reason):n.oncancelled=c}}catch(a){}let t={root:e.root,resolving:!1,get settled(){return this.root.settled},set settled(a){this.root.settled=a},get reason(){return this.root.reason}},r=rn(n,t);try{Reflect.apply(o,i,[tn(n,t),r])}catch(a){r(a)}return}}e.settled||(e.settled=!0,n.resolve(i))}}}function rn(n,e){return i=>{if(!e.resolving)if(e.resolving=!0,e.settled){try{if(i instanceof O&&e.reason instanceof O&&Object.is(i.cause,e.reason.cause))return}catch(o){}Promise.reject(new W(n.promise,i))}else e.settled=!0,n.reject(i)}}function X(n,e,i){let o=[];for(let t of e){let r;try{if(!h(t.then)||(r=t.cancel,!h(r)))continue}catch(c){continue}let a;try{a=Reflect.apply(r,t,[i])}catch(c){Promise.reject(new W(n,c,"Unhandled exception in cancel method."));continue}a&&o.push((a instanceof Promise?a:Promise.resolve(a)).catch(c=>{Promise.reject(new W(n,c,"Unhandled rejection in cancel method."))}))}return Promise.all(o)}function $e(n){return n}function en(n){throw n}function Po(n){try{if(n instanceof Error||typeof n!="object"||n.toString!==Object.prototype.toString)return""+n}catch(e){}try{return JSON.stringify(n)}catch(e){}try{return Object.prototype.toString.call(n)}catch(e){}return""}function Do(n){var i;let e=(i=n[g])!=null?i:{};return"promise"in e||Object.assign(e,k()),n[g]==null&&(e.resolve(),n[g]=e),e.promise}var k=Promise.withResolvers;k&&typeof k=="function"?k=k.bind(Promise):k=function(){let n,e;return{promise:new Promise((o,t)=>{n=o,e=t}),resolve:n,reject:e}};window._wails=window._wails||{};window._wails.callResultHandler=Ao;window._wails.callErrorHandler=Ro;var Mo=m(d.Call),So=m(d.CancelCall),F=new Map,To=0,xo=0,J=class extends Error{constructor(e,i){super(e,i),this.name="RuntimeError"}};function Ao(n,e,i){let o=sn(n);if(o)if(!e)o.resolve(void 0);else if(!i)o.resolve(e);else try{o.resolve(JSON.parse(e))}catch(t){o.reject(new TypeError("could not parse result: "+t.message,{cause:t}))}}function Ro(n,e,i){let o=sn(n);if(o)if(!i)o.reject(new Error(e));else{let t;try{t=JSON.parse(e)}catch(c){o.reject(new TypeError("could not parse error: "+c.message,{cause:c}));return}let r={};t.cause&&(r.cause=t.cause);let a;switch(t.kind){case"ReferenceError":a=new ReferenceError(t.message,r);break;case"TypeError":a=new TypeError(t.message,r);break;case"RuntimeError":a=new J(t.message,r);break;default:a=new Error(t.message,r);break}o.reject(a)}}function sn(n){let e=F.get(n);return F.delete(n),e}function Eo(){let n;do n=D();while(F.has(n));return n}function Te(n){let e=Eo(),i=B.withResolvers();F.set(e,{resolve:i.resolve,reject:i.reject});let o=Mo(To,Object.assign({"call-id":e},n)),t=!1;o.then(()=>{t=!0},a=>{F.delete(e),i.reject(a)});let r=()=>(F.delete(e),So(xo,{"call-id":e}).catch(a=>{}));return i.oncancelled=()=>t?r():o.then(r),i.promise}function ko(n,...e){return Te({methodName:n,args:e})}function Oo(n,...e){return Te({methodID:n,args:e})}var Ae={};w(Ae,{SetText:()=>Uo,Text:()=>Io});var an=m(d.Clipboard),Fo=0,Lo=1;function Uo(n){return an(Fo,{text:n})}function Io(){return an(Lo)}var Re={};w(Re,{Any:()=>C,Array:()=>jo,ByteSlice:()=>zo,Map:()=>Bo,Nullable:()=>Ho,Struct:()=>No});function C(n){return n}function zo(n){return n==null?"":n}function jo(n){return n===C?e=>e===null?[]:e:e=>{if(e===null)return[];for(let i=0;ii===null?{}:i:i=>{if(i===null)return{};for(let o in i)i[o]=e(i[o]);return i}}function Ho(n){return n===C?C:e=>e===null?null:n(e)}function No(n){let e=!0;for(let i in n)if(n[i]!==C){e=!1;break}return e?C:i=>{for(let o in n)o in i&&(i[o]=n[o](i[o]));return i}}var ke={};w(ke,{GetAll:()=>Go,GetCurrent:()=>Xo,GetPrimary:()=>Yo});var Ee=m(d.Screens),Zo=0,Vo=1,Ko=2;function Go(){return Ee(Zo)}function Yo(){return Ee(Vo)}function Xo(){return Ee(Ko)}window._wails=window._wails||{};window._wails.invoke=v;v("wails:runtime:ready");export{ye as Application,$ as Browser,xe as Call,O as CancelError,B as CancellablePromise,W as CancelledRejectionError,Ae as Clipboard,Re as Create,ne as Dialogs,te as Events,pe as Flags,ke as Screens,we as System,ce as WML,V as Window}; +var Fe=Object.defineProperty,an=Object.defineProperties;var ln=Object.getOwnPropertyDescriptors;var ke=Object.getOwnPropertySymbols;var cn=Object.prototype.hasOwnProperty,dn=Object.prototype.propertyIsEnumerable;var Oe=(n,e,i)=>e in n?Fe(n,e,{enumerable:!0,configurable:!0,writable:!0,value:i}):n[e]=i,Le=(n,e)=>{for(var i in e||(e={}))cn.call(e,i)&&Oe(n,i,e[i]);if(ke)for(var i of ke(e))dn.call(e,i)&&Oe(n,i,e[i]);return n},Ue=(n,e)=>an(n,ln(e));var u=(n,e)=>{for(var i in e)Fe(n,i,{get:e[i],enumerable:!0})};var ce={};u(ce,{Application:()=>ve,Browser:()=>_,Call:()=>Te,CancelError:()=>k,CancellablePromise:()=>j,CancelledRejectionError:()=>W,Clipboard:()=>xe,Create:()=>Ae,Dialogs:()=>ee,Events:()=>oe,Flags:()=>we,Screens:()=>Ee,System:()=>ue,WML:()=>le,Window:()=>Z});var le={};u(le,{Enable:()=>ae,Reload:()=>Ke});var _={};u(_,{OpenURL:()=>q});var mn="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";function P(n=21){let e="",i=n|0;for(;i--;)e+=mn[Math.random()*64|0];return e}var un=window.location.origin+"/wails/runtime",d=Object.freeze({Call:0,Clipboard:1,Application:2,Events:3,ContextMenu:4,Dialog:5,Window:6,Screens:7,System:8,Browser:9,CancelCall:10}),wn=P();function m(n,e=""){return function(i,o=null){return pn(n,i,e,o)}}async function pn(n,e,i,o){var l,c;let t=new URL(un);t.searchParams.append("object",n.toString()),t.searchParams.append("method",e.toString()),o&&t.searchParams.append("args",JSON.stringify(o));let r={"x-wails-client-id":wn};i&&(r["x-wails-window-name"]=i);let a=await fetch(t,{headers:r});if(!a.ok)throw new Error(await a.text());return((c=(l=a.headers.get("Content-Type"))==null?void 0:l.indexOf("application/json"))!=null?c:-1)!==-1?a.json():a.text()}var fn=m(d.Browser),gn=0;function q(n){return fn(gn,{url:n.toString()})}var ee={};u(ee,{Error:()=>An,Info:()=>Tn,OpenFile:()=>Rn,Question:()=>$,SaveFile:()=>En,Warning:()=>xn});window._wails=window._wails||{};window._wails.dialogErrorCallback=Mn;window._wails.dialogResultCallback=Dn;var hn=m(d.Dialog),F=new Map,Wn=0,bn=1,vn=2,yn=3,Cn=4,Pn=5;function Dn(n,e,i){let o=Ie(n);if(o)if(i)try{o.resolve(JSON.parse(e))}catch(t){o.reject(new TypeError("could not parse result: "+t.message,{cause:t}))}else o.resolve(e)}function Mn(n,e){var i;(i=Ie(n))==null||i.reject(new window.Error(e))}function Ie(n){let e=F.get(n);return F.delete(n),e}function Sn(){let n;do n=P();while(F.has(n));return n}function D(n,e={}){let i=Sn();return new Promise((o,t)=>{F.set(i,{resolve:o,reject:t}),hn(n,Object.assign({"dialog-id":i},e)).catch(r=>{F.delete(i),t(r)})})}function Tn(n){return D(Wn,n)}function xn(n){return D(bn,n)}function An(n){return D(vn,n)}function $(n){return D(yn,n)}function Rn(n){var e;return(e=D(Cn,n))!=null?e:[]}function En(n){return D(Pn,n)}var oe={};u(oe,{Emit:()=>ie,Off:()=>In,OffAll:()=>zn,On:()=>Ln,OnMultiple:()=>ne,Once:()=>Un,Types:()=>je,WailsEvent:()=>M});var p=new Map,B=class{constructor(e,i,o){this.eventName=e,this.callback=i,this.maxCallbacks=o||-1}dispatch(e){try{this.callback(e)}catch(i){}return this.maxCallbacks===-1?!1:(this.maxCallbacks-=1,this.maxCallbacks===0)}};function ze(n){let e=p.get(n.eventName);e&&(e=e.filter(i=>i!==n),e.length===0?p.delete(n.eventName):p.set(n.eventName,e))}var je=Object.freeze({Windows:Object.freeze({APMPowerSettingChange:"windows:APMPowerSettingChange",APMPowerStatusChange:"windows:APMPowerStatusChange",APMResumeAutomatic:"windows:APMResumeAutomatic",APMResumeSuspend:"windows:APMResumeSuspend",APMSuspend:"windows:APMSuspend",ApplicationStarted:"windows:ApplicationStarted",SystemThemeChanged:"windows:SystemThemeChanged",WebViewNavigationCompleted:"windows:WebViewNavigationCompleted",WindowActive:"windows:WindowActive",WindowBackgroundErase:"windows:WindowBackgroundErase",WindowClickActive:"windows:WindowClickActive",WindowClosing:"windows:WindowClosing",WindowDidMove:"windows:WindowDidMove",WindowDidResize:"windows:WindowDidResize",WindowDPIChanged:"windows:WindowDPIChanged",WindowDragDrop:"windows:WindowDragDrop",WindowDragEnter:"windows:WindowDragEnter",WindowDragLeave:"windows:WindowDragLeave",WindowDragOver:"windows:WindowDragOver",WindowEndMove:"windows:WindowEndMove",WindowEndResize:"windows:WindowEndResize",WindowFullscreen:"windows:WindowFullscreen",WindowHide:"windows:WindowHide",WindowInactive:"windows:WindowInactive",WindowKeyDown:"windows:WindowKeyDown",WindowKeyUp:"windows:WindowKeyUp",WindowKillFocus:"windows:WindowKillFocus",WindowNonClientHit:"windows:WindowNonClientHit",WindowNonClientMouseDown:"windows:WindowNonClientMouseDown",WindowNonClientMouseLeave:"windows:WindowNonClientMouseLeave",WindowNonClientMouseMove:"windows:WindowNonClientMouseMove",WindowNonClientMouseUp:"windows:WindowNonClientMouseUp",WindowPaint:"windows:WindowPaint",WindowRestore:"windows:WindowRestore",WindowSetFocus:"windows:WindowSetFocus",WindowShow:"windows:WindowShow",WindowStartMove:"windows:WindowStartMove",WindowStartResize:"windows:WindowStartResize",WindowUnFullscreen:"windows:WindowUnFullscreen",WindowZOrderChanged:"windows:WindowZOrderChanged",WindowMinimise:"windows:WindowMinimise",WindowUnMinimise:"windows:WindowUnMinimise",WindowMaximise:"windows:WindowMaximise",WindowUnMaximise:"windows:WindowUnMaximise"}),Mac:Object.freeze({ApplicationDidBecomeActive:"mac:ApplicationDidBecomeActive",ApplicationDidChangeBackingProperties:"mac:ApplicationDidChangeBackingProperties",ApplicationDidChangeEffectiveAppearance:"mac:ApplicationDidChangeEffectiveAppearance",ApplicationDidChangeIcon:"mac:ApplicationDidChangeIcon",ApplicationDidChangeOcclusionState:"mac:ApplicationDidChangeOcclusionState",ApplicationDidChangeScreenParameters:"mac:ApplicationDidChangeScreenParameters",ApplicationDidChangeStatusBarFrame:"mac:ApplicationDidChangeStatusBarFrame",ApplicationDidChangeStatusBarOrientation:"mac:ApplicationDidChangeStatusBarOrientation",ApplicationDidChangeTheme:"mac:ApplicationDidChangeTheme",ApplicationDidFinishLaunching:"mac:ApplicationDidFinishLaunching",ApplicationDidHide:"mac:ApplicationDidHide",ApplicationDidResignActive:"mac:ApplicationDidResignActive",ApplicationDidUnhide:"mac:ApplicationDidUnhide",ApplicationDidUpdate:"mac:ApplicationDidUpdate",ApplicationShouldHandleReopen:"mac:ApplicationShouldHandleReopen",ApplicationWillBecomeActive:"mac:ApplicationWillBecomeActive",ApplicationWillFinishLaunching:"mac:ApplicationWillFinishLaunching",ApplicationWillHide:"mac:ApplicationWillHide",ApplicationWillResignActive:"mac:ApplicationWillResignActive",ApplicationWillTerminate:"mac:ApplicationWillTerminate",ApplicationWillUnhide:"mac:ApplicationWillUnhide",ApplicationWillUpdate:"mac:ApplicationWillUpdate",MenuDidAddItem:"mac:MenuDidAddItem",MenuDidBeginTracking:"mac:MenuDidBeginTracking",MenuDidClose:"mac:MenuDidClose",MenuDidDisplayItem:"mac:MenuDidDisplayItem",MenuDidEndTracking:"mac:MenuDidEndTracking",MenuDidHighlightItem:"mac:MenuDidHighlightItem",MenuDidOpen:"mac:MenuDidOpen",MenuDidPopUp:"mac:MenuDidPopUp",MenuDidRemoveItem:"mac:MenuDidRemoveItem",MenuDidSendAction:"mac:MenuDidSendAction",MenuDidSendActionToItem:"mac:MenuDidSendActionToItem",MenuDidUpdate:"mac:MenuDidUpdate",MenuWillAddItem:"mac:MenuWillAddItem",MenuWillBeginTracking:"mac:MenuWillBeginTracking",MenuWillDisplayItem:"mac:MenuWillDisplayItem",MenuWillEndTracking:"mac:MenuWillEndTracking",MenuWillHighlightItem:"mac:MenuWillHighlightItem",MenuWillOpen:"mac:MenuWillOpen",MenuWillPopUp:"mac:MenuWillPopUp",MenuWillRemoveItem:"mac:MenuWillRemoveItem",MenuWillSendAction:"mac:MenuWillSendAction",MenuWillSendActionToItem:"mac:MenuWillSendActionToItem",MenuWillUpdate:"mac:MenuWillUpdate",WebViewDidCommitNavigation:"mac:WebViewDidCommitNavigation",WebViewDidFinishNavigation:"mac:WebViewDidFinishNavigation",WebViewDidReceiveServerRedirectForProvisionalNavigation:"mac:WebViewDidReceiveServerRedirectForProvisionalNavigation",WebViewDidStartProvisionalNavigation:"mac:WebViewDidStartProvisionalNavigation",WindowDidBecomeKey:"mac:WindowDidBecomeKey",WindowDidBecomeMain:"mac:WindowDidBecomeMain",WindowDidBeginSheet:"mac:WindowDidBeginSheet",WindowDidChangeAlpha:"mac:WindowDidChangeAlpha",WindowDidChangeBackingLocation:"mac:WindowDidChangeBackingLocation",WindowDidChangeBackingProperties:"mac:WindowDidChangeBackingProperties",WindowDidChangeCollectionBehavior:"mac:WindowDidChangeCollectionBehavior",WindowDidChangeEffectiveAppearance:"mac:WindowDidChangeEffectiveAppearance",WindowDidChangeOcclusionState:"mac:WindowDidChangeOcclusionState",WindowDidChangeOrderingMode:"mac:WindowDidChangeOrderingMode",WindowDidChangeScreen:"mac:WindowDidChangeScreen",WindowDidChangeScreenParameters:"mac:WindowDidChangeScreenParameters",WindowDidChangeScreenProfile:"mac:WindowDidChangeScreenProfile",WindowDidChangeScreenSpace:"mac:WindowDidChangeScreenSpace",WindowDidChangeScreenSpaceProperties:"mac:WindowDidChangeScreenSpaceProperties",WindowDidChangeSharingType:"mac:WindowDidChangeSharingType",WindowDidChangeSpace:"mac:WindowDidChangeSpace",WindowDidChangeSpaceOrderingMode:"mac:WindowDidChangeSpaceOrderingMode",WindowDidChangeTitle:"mac:WindowDidChangeTitle",WindowDidChangeToolbar:"mac:WindowDidChangeToolbar",WindowDidDeminiaturize:"mac:WindowDidDeminiaturize",WindowDidEndSheet:"mac:WindowDidEndSheet",WindowDidEnterFullScreen:"mac:WindowDidEnterFullScreen",WindowDidEnterVersionBrowser:"mac:WindowDidEnterVersionBrowser",WindowDidExitFullScreen:"mac:WindowDidExitFullScreen",WindowDidExitVersionBrowser:"mac:WindowDidExitVersionBrowser",WindowDidExpose:"mac:WindowDidExpose",WindowDidFocus:"mac:WindowDidFocus",WindowDidMiniaturize:"mac:WindowDidMiniaturize",WindowDidMove:"mac:WindowDidMove",WindowDidOrderOffScreen:"mac:WindowDidOrderOffScreen",WindowDidOrderOnScreen:"mac:WindowDidOrderOnScreen",WindowDidResignKey:"mac:WindowDidResignKey",WindowDidResignMain:"mac:WindowDidResignMain",WindowDidResize:"mac:WindowDidResize",WindowDidUpdate:"mac:WindowDidUpdate",WindowDidUpdateAlpha:"mac:WindowDidUpdateAlpha",WindowDidUpdateCollectionBehavior:"mac:WindowDidUpdateCollectionBehavior",WindowDidUpdateCollectionProperties:"mac:WindowDidUpdateCollectionProperties",WindowDidUpdateShadow:"mac:WindowDidUpdateShadow",WindowDidUpdateTitle:"mac:WindowDidUpdateTitle",WindowDidUpdateToolbar:"mac:WindowDidUpdateToolbar",WindowDidZoom:"mac:WindowDidZoom",WindowFileDraggingEntered:"mac:WindowFileDraggingEntered",WindowFileDraggingExited:"mac:WindowFileDraggingExited",WindowFileDraggingPerformed:"mac:WindowFileDraggingPerformed",WindowHide:"mac:WindowHide",WindowMaximise:"mac:WindowMaximise",WindowUnMaximise:"mac:WindowUnMaximise",WindowMinimise:"mac:WindowMinimise",WindowUnMinimise:"mac:WindowUnMinimise",WindowShouldClose:"mac:WindowShouldClose",WindowShow:"mac:WindowShow",WindowWillBecomeKey:"mac:WindowWillBecomeKey",WindowWillBecomeMain:"mac:WindowWillBecomeMain",WindowWillBeginSheet:"mac:WindowWillBeginSheet",WindowWillChangeOrderingMode:"mac:WindowWillChangeOrderingMode",WindowWillClose:"mac:WindowWillClose",WindowWillDeminiaturize:"mac:WindowWillDeminiaturize",WindowWillEnterFullScreen:"mac:WindowWillEnterFullScreen",WindowWillEnterVersionBrowser:"mac:WindowWillEnterVersionBrowser",WindowWillExitFullScreen:"mac:WindowWillExitFullScreen",WindowWillExitVersionBrowser:"mac:WindowWillExitVersionBrowser",WindowWillFocus:"mac:WindowWillFocus",WindowWillMiniaturize:"mac:WindowWillMiniaturize",WindowWillMove:"mac:WindowWillMove",WindowWillOrderOffScreen:"mac:WindowWillOrderOffScreen",WindowWillOrderOnScreen:"mac:WindowWillOrderOnScreen",WindowWillResignMain:"mac:WindowWillResignMain",WindowWillResize:"mac:WindowWillResize",WindowWillUnfocus:"mac:WindowWillUnfocus",WindowWillUpdate:"mac:WindowWillUpdate",WindowWillUpdateAlpha:"mac:WindowWillUpdateAlpha",WindowWillUpdateCollectionBehavior:"mac:WindowWillUpdateCollectionBehavior",WindowWillUpdateCollectionProperties:"mac:WindowWillUpdateCollectionProperties",WindowWillUpdateShadow:"mac:WindowWillUpdateShadow",WindowWillUpdateTitle:"mac:WindowWillUpdateTitle",WindowWillUpdateToolbar:"mac:WindowWillUpdateToolbar",WindowWillUpdateVisibility:"mac:WindowWillUpdateVisibility",WindowWillUseStandardFrame:"mac:WindowWillUseStandardFrame",WindowZoomIn:"mac:WindowZoomIn",WindowZoomOut:"mac:WindowZoomOut",WindowZoomReset:"mac:WindowZoomReset"}),Linux:Object.freeze({ApplicationStartup:"linux:ApplicationStartup",SystemThemeChanged:"linux:SystemThemeChanged",WindowDeleteEvent:"linux:WindowDeleteEvent",WindowDidMove:"linux:WindowDidMove",WindowDidResize:"linux:WindowDidResize",WindowFocusIn:"linux:WindowFocusIn",WindowFocusOut:"linux:WindowFocusOut",WindowLoadChanged:"linux:WindowLoadChanged"}),Common:Object.freeze({ApplicationOpenedWithFile:"common:ApplicationOpenedWithFile",ApplicationStarted:"common:ApplicationStarted",ThemeChanged:"common:ThemeChanged",WindowClosing:"common:WindowClosing",WindowDidMove:"common:WindowDidMove",WindowDidResize:"common:WindowDidResize",WindowDPIChanged:"common:WindowDPIChanged",WindowFilesDropped:"common:WindowFilesDropped",WindowFocus:"common:WindowFocus",WindowFullscreen:"common:WindowFullscreen",WindowHide:"common:WindowHide",WindowLostFocus:"common:WindowLostFocus",WindowMaximise:"common:WindowMaximise",WindowMinimise:"common:WindowMinimise",WindowRestore:"common:WindowRestore",WindowRuntimeReady:"common:WindowRuntimeReady",WindowShow:"common:WindowShow",WindowUnFullscreen:"common:WindowUnFullscreen",WindowUnMaximise:"common:WindowUnMaximise",WindowUnMinimise:"common:WindowUnMinimise",WindowZoom:"common:WindowZoom",WindowZoomIn:"common:WindowZoomIn",WindowZoomOut:"common:WindowZoomOut",WindowZoomReset:"common:WindowZoomReset"})});window._wails=window._wails||{};window._wails.dispatchWailsEvent=Fn;var kn=m(d.Events),On=0,M=class{constructor(e,i=null){this.name=e,this.data=i}};function Fn(n){let e=p.get(n.name);if(!e)return;let i=new M(n.name,n.data);"sender"in n&&(i.sender=n.sender),e=e.filter(o=>!o.dispatch(i)),e.length===0?p.delete(n.name):p.set(n.name,e)}function ne(n,e,i){let o=p.get(n)||[],t=new B(n,e,i);return o.push(t),p.set(n,o),()=>ze(t)}function Ln(n,e){return ne(n,e,-1)}function Un(n,e){return ne(n,e,1)}function In(...n){n.forEach(e=>p.delete(e))}function zn(){p.clear()}function ie(n){return kn(On,n)}function Be(){return new MouseEvent("mousedown").buttons===0}function He(){if(!EventTarget||!AbortSignal||!AbortController)return!1;let n=!0,e=new EventTarget,i=new AbortController;return e.addEventListener("test",()=>{n=!1},{signal:i.signal}),i.abort(),e.dispatchEvent(new CustomEvent("test")),n}function H(n){var e;return n.target instanceof HTMLElement?n.target:!(n.target instanceof HTMLElement)&&n.target instanceof Node&&(e=n.target.parentElement)!=null?e:document.body}var Ne=!1;document.addEventListener("DOMContentLoaded",()=>{Ne=!0});function Ze(n){Ne||document.readyState==="complete"?n():document.addEventListener("DOMContentLoaded",n)}var jn=0,Bn=1,Hn=2,Nn=3,Zn=4,Vn=5,Gn=6,Kn=7,Yn=8,Xn=9,Jn=10,Qn=11,qn=12,_n=13,$n=14,ei=15,ni=16,ii=17,oi=18,ti=19,ri=20,si=21,ai=22,li=23,ci=24,di=25,mi=26,ui=27,wi=28,pi=29,fi=30,gi=31,hi=32,Wi=33,bi=34,vi=35,yi=36,Ci=37,Pi=38,Di=39,Mi=40,Si=41,Ti=42,xi=43,Ai=44,Ri=45,Ei=46,ki=47,s=Symbol("caller");s;var N=class N{constructor(e=""){this[s]=m(d.Window,e);for(let i of Object.getOwnPropertyNames(N.prototype))i!=="constructor"&&typeof this[i]=="function"&&(this[i]=this[i].bind(this))}Get(e){return new N(e)}Position(){return this[s](jn)}Center(){return this[s](Bn)}Close(){return this[s](Hn)}DisableSizeConstraints(){return this[s](Nn)}EnableSizeConstraints(){return this[s](Zn)}Focus(){return this[s](Vn)}ForceReload(){return this[s](Gn)}Fullscreen(){return this[s](Kn)}GetScreen(){return this[s](Yn)}GetZoom(){return this[s](Xn)}Height(){return this[s](Jn)}Hide(){return this[s](Qn)}IsFocused(){return this[s](qn)}IsFullscreen(){return this[s](_n)}IsMaximised(){return this[s]($n)}IsMinimised(){return this[s](ei)}Maximise(){return this[s](ni)}Minimise(){return this[s](ii)}Name(){return this[s](oi)}OpenDevTools(){return this[s](ti)}RelativePosition(){return this[s](ri)}Reload(){return this[s](si)}Resizable(){return this[s](ai)}Restore(){return this[s](li)}SetPosition(e,i){return this[s](ci,{x:e,y:i})}SetAlwaysOnTop(e){return this[s](di,{alwaysOnTop:e})}SetBackgroundColour(e,i,o,t){return this[s](mi,{r:e,g:i,b:o,a:t})}SetFrameless(e){return this[s](ui,{frameless:e})}SetFullscreenButtonEnabled(e){return this[s](wi,{enabled:e})}SetMaxSize(e,i){return this[s](pi,{width:e,height:i})}SetMinSize(e,i){return this[s](fi,{width:e,height:i})}SetRelativePosition(e,i){return this[s](gi,{x:e,y:i})}SetResizable(e){return this[s](hi,{resizable:e})}SetSize(e,i){return this[s](Wi,{width:e,height:i})}SetTitle(e){return this[s](bi,{title:e})}SetZoom(e){return this[s](vi,{zoom:e})}Show(){return this[s](yi)}Size(){return this[s](Ci)}ToggleFullscreen(){return this[s](Pi)}ToggleMaximise(){return this[s](Di)}UnFullscreen(){return this[s](Mi)}UnMaximise(){return this[s](Si)}UnMinimise(){return this[s](Ti)}Width(){return this[s](xi)}Zoom(){return this[s](Ai)}ZoomIn(){return this[s](Ri)}ZoomOut(){return this[s](Ei)}ZoomReset(){return this[s](ki)}},te=N,Oi=new te(""),Z=Oi;function Fi(n,e=null){ie(new M(n,e))}function Li(n,e){let i=Z.Get(n),o=i[e];if(typeof o=="function")try{o.call(i)}catch(t){}}function Ve(n){let e=n.currentTarget;function i(t="Yes"){if(t!=="Yes")return;let r=e.getAttribute("wml-event")||e.getAttribute("data-wml-event"),a=e.getAttribute("wml-target-window")||e.getAttribute("data-wml-target-window")||"",l=e.getAttribute("wml-window")||e.getAttribute("data-wml-window"),c=e.getAttribute("wml-openurl")||e.getAttribute("data-wml-openurl");r!==null&&Fi(r),l!==null&&Li(a,l),c!==null&&q(c)}let o=e.getAttribute("wml-confirm")||e.getAttribute("data-wml-confirm");o?$({Title:"Confirm",Message:o,Detached:!1,Buttons:[{Label:"Yes"},{Label:"No",IsDefault:!0}]}).then(i):i()}var L=Symbol("controller"),S=Symbol("triggerMap"),b=Symbol("elementCount");L;var re=class{constructor(){this[L]=new AbortController}set(e,i){return{signal:this[L].signal}}reset(){this[L].abort(),this[L]=new AbortController}};S,b;var se=class{constructor(){this[S]=new WeakMap,this[b]=0}set(e,i){return this[S].has(e)||this[b]++,this[S].set(e,i),{}}reset(){if(!(this[b]<=0)){for(let e of document.body.querySelectorAll("*")){if(this[b]<=0)break;let i=this[S].get(e);i!=null&&this[b]--;for(let o of i||[])e.removeEventListener(o,Ve)}this[S]=new WeakMap,this[b]=0}}},Ge=He()?new re:new se;function Ui(n){let e=/\S+/g,i=n.getAttribute("wml-trigger")||n.getAttribute("data-wml-trigger")||"click",o=[],t;for(;(t=e.exec(i))!==null;)o.push(t[0]);let r=Ge.set(n,o);for(let a of o)n.addEventListener(a,Ve,r)}function ae(){Ze(Ke)}function Ke(){Ge.reset(),document.body.querySelectorAll("[wml-event], [wml-window], [wml-openurl], [data-wml-event], [data-wml-window], [data-wml-openurl]").forEach(Ui)}window.wails=ce;ae();var ue={};u(ue,{Capabilities:()=>Bi,Environment:()=>Hi,IsAMD64:()=>Vi,IsARM:()=>Gi,IsARM64:()=>Ki,IsDarkMode:()=>ji,IsDebug:()=>me,IsLinux:()=>Ni,IsMac:()=>Zi,IsWindows:()=>V,invoke:()=>v});var Ye=m(d.System),Ii=0,zi=1,de=function(){var n,e,i,o,t;try{if((e=(n=window.chrome)==null?void 0:n.webview)!=null&&e.postMessage)return window.chrome.webview.postMessage.bind(window.chrome.webview);if((t=(o=(i=window.webkit)==null?void 0:i.messageHandlers)==null?void 0:o.external)!=null&&t.postMessage)return window.webkit.messageHandlers.external.postMessage.bind(window.webkit.messageHandlers.external)}catch(r){}return null}();function v(n){de==null||de(n)}function ji(){return Ye(Ii)}async function Bi(){let n=await fetch("/wails/capabilities");if(n.ok)return n.json();throw new Error("could not fetch capabilities: "+n.statusText)}function Hi(){return Ye(zi)}function V(){return window._wails.environment.OS==="windows"}function Ni(){return window._wails.environment.OS==="linux"}function Zi(){return window._wails.environment.OS==="darwin"}function Vi(){return window._wails.environment.Arch==="amd64"}function Gi(){return window._wails.environment.Arch==="arm"}function Ki(){return window._wails.environment.Arch==="arm64"}function me(){return!!window._wails.environment.Debug}window.addEventListener("contextmenu",Qi);var Yi=m(d.ContextMenu),Xi=0;function Ji(n,e,i,o){Yi(Xi,{id:n,x:e,y:i,data:o})}function Qi(n){let e=H(n),i=window.getComputedStyle(e).getPropertyValue("--custom-contextmenu").trim();if(i){n.preventDefault();let o=window.getComputedStyle(e).getPropertyValue("--custom-contextmenu-data");Ji(i,n.clientX,n.clientY,o)}else qi(n,e)}function qi(n,e){if(me())return;switch(window.getComputedStyle(e).getPropertyValue("--default-contextmenu").trim()){case"show":return;case"hide":n.preventDefault();return}if(e.isContentEditable)return;let i=window.getSelection(),o=i&&i.toString().length>0;if(o)for(let t=0;tU});function U(n){try{return window._wails.flags[n]}catch(e){throw new Error("Unable to retrieve flag '"+n+"': "+e,{cause:e})}}var I=!1,z=!1,he=!1,x=!1,A=!1,y="",Xe="auto",T=0,pe=Be();window._wails=window._wails||{};window._wails.setResizable=n=>{he=n,he||(x=A=!1,w())};window.addEventListener("mousedown",We,{capture:!0});window.addEventListener("mousemove",We,{capture:!0});window.addEventListener("mouseup",We,{capture:!0});for(let n of["click","contextmenu","dblclick"])window.addEventListener(n,_i,{capture:!0});function _i(n){(z||A)&&(n.stopImmediatePropagation(),n.stopPropagation(),n.preventDefault())}var fe=0,$i=1,ge=2;function We(n){let e,i=n.buttons;switch(n.type){case"mousedown":e=fe,pe||(i=T|1<ao,Quit:()=>co,Show:()=>lo});var be=m(d.Application),to=0,ro=1,so=2;function ao(){return be(to)}function lo(){return be(ro)}function co(){return be(so)}var Te={};u(Te,{ByID:()=>ko,ByName:()=>Eo,Call:()=>Se,RuntimeError:()=>X});var Qe=Function.prototype.toString,R=typeof Reflect=="object"&&Reflect!==null&&Reflect.apply,ye,G;if(typeof R=="function"&&typeof Object.defineProperty=="function")try{ye=Object.defineProperty({},"length",{get:function(){throw G}}),G={},R(function(){throw 42},null,ye)}catch(n){n!==G&&(R=null)}else R=null;var mo=/^\s*class\b/,Pe=function(e){try{var i=Qe.call(e);return mo.test(i)}catch(o){return!1}},Ce=function(e){try{return Pe(e)?!1:(Qe.call(e),!0)}catch(i){return!1}},K=Object.prototype.toString,uo="[object Object]",wo="[object Function]",po="[object GeneratorFunction]",fo="[object HTMLAllCollection]",go="[object HTML document.all class]",ho="[object HTMLCollection]",Wo=typeof Symbol=="function"&&!!Symbol.toStringTag,bo=!(0 in[,]),De=function(){return!1};typeof document=="object"&&(Je=document.all,K.call(Je)===K.call(document.all)&&(De=function(e){if((bo||!e)&&(typeof e>"u"||typeof e=="object"))try{var i=K.call(e);return(i===fo||i===go||i===ho||i===uo)&&e("")==null}catch(o){}return!1}));var Je;function vo(n){if(De(n))return!0;if(!n||typeof n!="function"&&typeof n!="object")return!1;try{R(n,null,ye)}catch(e){if(e!==G)return!1}return!Pe(n)&&Ce(n)}function yo(n){if(De(n))return!0;if(!n||typeof n!="function"&&typeof n!="object")return!1;if(Wo)return Ce(n);if(Pe(n))return!1;var e=K.call(n);return e!==wo&&e!==po&&!/^\[object HTML/.test(e)?!1:Ce(n)}var h=R?vo:yo;var k=class extends Error{constructor(e,i){super(e,i),this.name="CancelError"}},W=class extends Error{constructor(e,i,o){super((o!=null?o:"Unhandled rejection in cancelled promise.")+" Reason: "+Co(i),{cause:i}),this.promise=e,this.name="CancelledRejectionError"}},f=Symbol("barrier"),Me=Symbol("cancelImpl"),en,qe=(en=Symbol.species)!=null?en:Symbol("speciesPolyfill"),j=class n extends Promise{constructor(e,i){let o,t;if(super((c,g)=>{o=c,t=g}),this.constructor[qe]!==Promise)throw new TypeError("CancellablePromise does not support transparent subclassing. Please refrain from overriding the [Symbol.species] static property.");let r={promise:this,resolve:o,reject:t,get oncancelled(){return i!=null?i:null},set oncancelled(c){i=c!=null?c:void 0}},a={get root(){return a},resolving:!1,settled:!1};Object.defineProperties(this,{[f]:{configurable:!1,enumerable:!1,writable:!0,value:null},[Me]:{configurable:!1,enumerable:!1,writable:!1,value:nn(r,a)}});let l=tn(r,a);try{e(on(r,a),l)}catch(c){a.resolving||l(c)}}cancel(e){return new n(i=>{Promise.all([this[Me](new k("Promise cancelled.",{cause:e})),Po(this)]).then(()=>i(),()=>i())})}cancelOn(e){return e.aborted?this.cancel(e.reason):e.addEventListener("abort",()=>void this.cancel(e.reason),{capture:!0}),this}then(e,i,o){if(!(this instanceof n))throw new TypeError("CancellablePromise.prototype.then called on an invalid object.");if(h(e)||(e=_e),h(i)||(i=$e),e===_e&&i==$e)return new n(r=>r(this));let t={};return this[f]=t,new n((r,a)=>{super.then(l=>{var c;this[f]===t&&(this[f]=null),(c=t.resolve)==null||c.call(t);try{r(e(l))}catch(g){a(g)}},l=>{var c;this[f]===t&&(this[f]=null),(c=t.resolve)==null||c.call(t);try{r(i(l))}catch(g){a(g)}})},async r=>{try{return o==null?void 0:o(r)}finally{await this.cancel(r)}})}catch(e,i){return this.then(void 0,e,i)}finally(e,i){if(!(this instanceof n))throw new TypeError("CancellablePromise.prototype.finally called on an invalid object.");return h(e)?this.then(o=>n.resolve(e()).then(()=>o),o=>n.resolve(e()).then(()=>{throw o}),i):this.then(e,e,i)}static get[(f,Me,qe)](){return Promise}static all(e){let i=Array.from(e),o=i.length===0?n.resolve(i):new n((t,r)=>{Promise.all(i).then(t,r)},t=>Y(o,i,t));return o}static allSettled(e){let i=Array.from(e),o=i.length===0?n.resolve(i):new n((t,r)=>{Promise.allSettled(i).then(t,r)},t=>Y(o,i,t));return o}static any(e){let i=Array.from(e),o=i.length===0?n.resolve(i):new n((t,r)=>{Promise.any(i).then(t,r)},t=>Y(o,i,t));return o}static race(e){let i=Array.from(e),o=new n((t,r)=>{Promise.race(i).then(t,r)},t=>Y(o,i,t));return o}static cancel(e){let i=new n(()=>{});return i.cancel(e),i}static timeout(e,i){let o=new n(()=>{});return AbortSignal&&typeof AbortSignal=="function"&&AbortSignal.timeout&&typeof AbortSignal.timeout=="function"?AbortSignal.timeout(e).addEventListener("abort",()=>void o.cancel(i)):setTimeout(()=>void o.cancel(i),e),o}static sleep(e,i){return new n(o=>{setTimeout(()=>o(i),e)})}static reject(e){return new n((i,o)=>o(e))}static resolve(e){return e instanceof n?e:new n(i=>i(e))}static withResolvers(){let e={oncancelled:null};return e.promise=new n((i,o)=>{e.resolve=i,e.reject=o},i=>{var o;(o=e.oncancelled)==null||o.call(e,i)}),e}};function nn(n,e){let i;return o=>{if(e.settled||(e.settled=!0,e.reason=o,n.reject(o),Promise.prototype.then.call(n.promise,void 0,t=>{if(t!==o)throw t})),!(!e.reason||!n.oncancelled))return i=new Promise(t=>{try{t(n.oncancelled(e.reason.cause))}catch(r){Promise.reject(new W(n.promise,r,"Unhandled exception in oncancelled callback."))}}).catch(t=>{Promise.reject(new W(n.promise,t,"Unhandled rejection in oncancelled callback."))}),n.oncancelled=null,i}}function on(n,e){return i=>{if(!e.resolving){if(e.resolving=!0,i===n.promise){if(e.settled)return;e.settled=!0,n.reject(new TypeError("A promise cannot be resolved with itself."));return}if(i!=null&&(typeof i=="object"||typeof i=="function")){let o;try{o=i.then}catch(t){e.settled=!0,n.reject(t);return}if(h(o)){try{let a=i.cancel;if(h(a)){let l=c=>{Reflect.apply(a,i,[c])};e.reason?nn(Ue(Le({},n),{oncancelled:l}),e)(e.reason):n.oncancelled=l}}catch(a){}let t={root:e.root,resolving:!1,get settled(){return this.root.settled},set settled(a){this.root.settled=a},get reason(){return this.root.reason}},r=tn(n,t);try{Reflect.apply(o,i,[on(n,t),r])}catch(a){r(a)}return}}e.settled||(e.settled=!0,n.resolve(i))}}}function tn(n,e){return i=>{if(!e.resolving)if(e.resolving=!0,e.settled){try{if(i instanceof k&&e.reason instanceof k&&Object.is(i.cause,e.reason.cause))return}catch(o){}Promise.reject(new W(n.promise,i))}else e.settled=!0,n.reject(i)}}function Y(n,e,i){let o=[];for(let t of e){let r;try{if(!h(t.then)||(r=t.cancel,!h(r)))continue}catch(l){continue}let a;try{a=Reflect.apply(r,t,[i])}catch(l){Promise.reject(new W(n,l,"Unhandled exception in cancel method."));continue}a&&o.push((a instanceof Promise?a:Promise.resolve(a)).catch(l=>{Promise.reject(new W(n,l,"Unhandled rejection in cancel method."))}))}return Promise.all(o)}function _e(n){return n}function $e(n){throw n}function Co(n){try{if(n instanceof Error||typeof n!="object"||n.toString!==Object.prototype.toString)return""+n}catch(e){}try{return JSON.stringify(n)}catch(e){}try{return Object.prototype.toString.call(n)}catch(e){}return""}function Po(n){var i;let e=(i=n[f])!=null?i:{};return"promise"in e||Object.assign(e,E()),n[f]==null&&(e.resolve(),n[f]=e),e.promise}var E=Promise.withResolvers;E&&typeof E=="function"?E=E.bind(Promise):E=function(){let n,e;return{promise:new Promise((o,t)=>{n=o,e=t}),resolve:n,reject:e}};window._wails=window._wails||{};window._wails.callResultHandler=xo;window._wails.callErrorHandler=Ao;var Do=m(d.Call),Mo=m(d.CancelCall),O=new Map,So=0,To=0,X=class extends Error{constructor(e,i){super(e,i),this.name="RuntimeError"}};function xo(n,e,i){let o=rn(n);if(o)if(!e)o.resolve(void 0);else if(!i)o.resolve(e);else try{o.resolve(JSON.parse(e))}catch(t){o.reject(new TypeError("could not parse result: "+t.message,{cause:t}))}}function Ao(n,e,i){let o=rn(n);if(o)if(!i)o.reject(new Error(e));else{let t;try{t=JSON.parse(e)}catch(l){o.reject(new TypeError("could not parse error: "+l.message,{cause:l}));return}let r={};t.cause&&(r.cause=t.cause);let a;switch(t.kind){case"ReferenceError":a=new ReferenceError(t.message,r);break;case"TypeError":a=new TypeError(t.message,r);break;case"RuntimeError":a=new X(t.message,r);break;default:a=new Error(t.message,r);break}o.reject(a)}}function rn(n){let e=O.get(n);return O.delete(n),e}function Ro(){let n;do n=P();while(O.has(n));return n}function Se(n){let e=Ro(),i=j.withResolvers();O.set(e,{resolve:i.resolve,reject:i.reject});let o=Do(So,Object.assign({"call-id":e},n)),t=!1;o.then(()=>{t=!0},a=>{O.delete(e),i.reject(a)});let r=()=>(O.delete(e),Mo(To,{"call-id":e}).catch(a=>{}));return i.oncancelled=()=>t?r():o.then(r),i.promise}function Eo(n,...e){return Se({methodName:n,args:e})}function ko(n,...e){return Se({methodID:n,args:e})}var xe={};u(xe,{SetText:()=>Lo,Text:()=>Uo});var sn=m(d.Clipboard),Oo=0,Fo=1;function Lo(n){return sn(Oo,{text:n})}function Uo(){return sn(Fo)}var Ae={};u(Ae,{Any:()=>C,Array:()=>zo,ByteSlice:()=>Io,Map:()=>jo,Nullable:()=>Bo,Struct:()=>Ho});function C(n){return n}function Io(n){return n==null?"":n}function zo(n){return n===C?e=>e===null?[]:e:e=>{if(e===null)return[];for(let i=0;ii===null?{}:i:i=>{if(i===null)return{};for(let o in i)i[o]=e(i[o]);return i}}function Bo(n){return n===C?C:e=>e===null?null:n(e)}function Ho(n){let e=!0;for(let i in n)if(n[i]!==C){e=!1;break}return e?C:i=>{for(let o in n)o in i&&(i[o]=n[o](i[o]));return i}}var Ee={};u(Ee,{GetAll:()=>Go,GetCurrent:()=>Yo,GetPrimary:()=>Ko});var Re=m(d.Screens),No=0,Zo=1,Vo=2;function Go(){return Re(No)}function Ko(){return Re(Zo)}function Yo(){return Re(Vo)}window._wails=window._wails||{};window._wails.invoke=v;v("wails:runtime:ready");export{ve as Application,_ as Browser,Te as Call,k as CancelError,j as CancellablePromise,W as CancelledRejectionError,xe as Clipboard,Ae as Create,ee as Dialogs,oe as Events,we as Flags,Ee as Screens,ue as System,le as WML,Z as Window}; diff --git a/v3/internal/runtime/Taskfile.yaml b/v3/internal/runtime/Taskfile.yaml index d343bcf4f..47877d4ef 100644 --- a/v3/internal/runtime/Taskfile.yaml +++ b/v3/internal/runtime/Taskfile.yaml @@ -28,12 +28,12 @@ tasks: build:debug: internal: true cmds: - - npx esbuild@latest desktop/@wailsio/runtime/src/index.ts --inject:desktop/compiled/main.js --format=esm --target=es2015 --bundle --ignore-annotations --tree-shaking=true --sourcemap=inline --outfile=../assetserver/bundledassets/runtime.debug.js --define:DEBUG=true + - npx esbuild@latest desktop/@wailsio/runtime/src/index.ts --inject:desktop/compiled/main.js --format=esm --target=safari11 --bundle --ignore-annotations --tree-shaking=true --sourcemap=inline --outfile=../assetserver/bundledassets/runtime.debug.js --define:DEBUG=true build:production: internal: true cmds: - - npx esbuild@latest desktop/@wailsio/runtime/src/index.ts --inject:desktop/compiled/main.js --format=esm --target=es2015 --bundle --ignore-annotations --tree-shaking=true --minify --outfile=../assetserver/bundledassets/runtime.js --define:DEBUG=false --drop:console + - npx esbuild@latest desktop/@wailsio/runtime/src/index.ts --inject:desktop/compiled/main.js --format=esm --target=safari11 --bundle --ignore-annotations --tree-shaking=true --minify --outfile=../assetserver/bundledassets/runtime.js --define:DEBUG=false --drop:console build:all: internal: true From 698f9cac391e75c7d64515a44c18684a5f3ccff4 Mon Sep 17 00:00:00 2001 From: Fabio Massaioli Date: Thu, 27 Feb 2025 00:46:37 +0100 Subject: [PATCH 092/374] Relax typescript compile target --- v3/internal/runtime/desktop/@wailsio/runtime/tsconfig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/tsconfig.json b/v3/internal/runtime/desktop/@wailsio/runtime/tsconfig.json index 63db7a091..1175a4af4 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/tsconfig.json +++ b/v3/internal/runtime/desktop/@wailsio/runtime/tsconfig.json @@ -13,7 +13,7 @@ "outDir": "dist", "rootDir": "src", - "target": "ES2015", + "target": "ES2017", "module": "ES2015", "moduleResolution": "bundler", "isolatedModules": true, From a807c269cca0d629dca14f9efbd3d8f588177aae Mon Sep 17 00:00:00 2001 From: Zach Botterman Date: Wed, 26 Feb 2025 18:45:46 -0800 Subject: [PATCH 093/374] better interop with obj-c --- .../services/notifications/notifications.go | 27 ++-- .../notifications/notifications_darwin.go | 133 ++++++++++++++++-- .../notifications/notifications_darwin.h | 8 +- .../notifications/notifications_darwin.m | 38 ++--- .../notifications/notifications_windows.go | 51 +++---- 5 files changed, 183 insertions(+), 74 deletions(-) diff --git a/v3/pkg/services/notifications/notifications.go b/v3/pkg/services/notifications/notifications.go index a40177af2..d971959ac 100644 --- a/v3/pkg/services/notifications/notifications.go +++ b/v3/pkg/services/notifications/notifications.go @@ -1,12 +1,17 @@ package notifications +import "sync" + // Service represents the notifications service type Service struct { - // Callback is called when a notification response is received - Callback func(response NotificationResponse) + // notificationResponseCallback is called when a notification response is received + notificationResponseCallback func(response NotificationResponse) + + callbackLock sync.RWMutex } var NotificationService *Service +var notificationServiceLock sync.RWMutex // NotificationAction represents an action button for a notification type NotificationAction = struct { @@ -54,18 +59,22 @@ func (ns *Service) ServiceName() string { } // OnNotificationResponse registers a callback function that will be called when -// a notification response is received from the user +// a notification response is received from the user. func (ns *Service) OnNotificationResponse(callback func(response NotificationResponse)) { - if ns.Callback != nil { - return - } - ns.Callback = callback + ns.callbackLock.Lock() + defer ns.callbackLock.Unlock() + + ns.notificationResponseCallback = callback } // handleNotificationResponse is an internal method to handle notification responses // and invoke the registered callback if one exists func (ns *Service) handleNotificationResponse(response NotificationResponse) { - if ns.Callback != nil { - ns.Callback(response) + ns.callbackLock.RLock() + callback := ns.notificationResponseCallback + ns.callbackLock.RUnlock() + + if callback != nil { + callback(response) } } diff --git a/v3/pkg/services/notifications/notifications_darwin.go b/v3/pkg/services/notifications/notifications_darwin.go index 81b6364c4..2781ceb7c 100644 --- a/v3/pkg/services/notifications/notifications_darwin.go +++ b/v3/pkg/services/notifications/notifications_darwin.go @@ -12,16 +12,32 @@ import ( "context" "encoding/json" "fmt" + "sync" "unsafe" "github.com/wailsapp/wails/v3/pkg/application" ) -var AppleDefaultActionIdentifier = "com.apple.UNNotificationDefaultActionIdentifier" +type notificationChannel struct { + authorized bool + err error +} + +var ( + notificationChannels = make(map[int]chan notificationChannel) + notificationChannelsLock sync.Mutex + nextChannelID int +) + +const AppleDefaultActionIdentifier = "com.apple.UNNotificationDefaultActionIdentifier" +const BundleIdentifierError = fmt.Errorf("notifications require a bundled application with a unique bundle identifier") // Creates a new Notifications Service. // Your app must be packaged and signed for this feature to work. func New() *Service { + notificationServiceLock.Lock() + defer notificationServiceLock.Unlock() + if NotificationService == nil { NotificationService = &Service{} } @@ -31,7 +47,7 @@ func New() *Service { // ServiceStartup is called when the service is loaded. func (ns *Service) ServiceStartup(ctx context.Context, options application.ServiceOptions) error { if !CheckBundleIdentifier() { - return fmt.Errorf("notifications require a bundled application with a unique bundle identifier") + return BundleIdentifierError } return nil } @@ -45,21 +61,32 @@ func CheckBundleIdentifier() bool { return bool(C.checkBundleIdentifier()) } -// RequestUserNotificationAuthorization requests permission for notifications. -func (ns *Service) RequestUserNotificationAuthorization() (bool, error) { +// RequestNotificationAuthorization requests permission for notifications. +func (ns *Service) RequestNotificationAuthorization() (bool, err) { if !CheckBundleIdentifier() { - return false, fmt.Errorf("notifications require a bundled application with a unique bundle identifier") + return false, BundleIdentifierError } - result := C.requestUserNotificationAuthorization(nil) - return result == true, nil + + id, resultCh := registerChannel() + + C.requestNotificationAuthorization(C.int(id)) + + result := <-resultCh + return result.authorized, result.err } // CheckNotificationAuthorization checks current notification permission status. -func (ns *Service) CheckNotificationAuthorization() (bool, error) { +func (ns *Service) CheckNotificationAuthorization() (bool, err) { if !CheckBundleIdentifier() { - return false, fmt.Errorf("notifications require a bundled application with a unique bundle identifier") + return false, BundleIdentifierError } - return bool(C.checkNotificationAuthorization()), nil + + id, resultCh := registerChannel() + + C.checkNotificationAuthorization(C.int(id)) + + result := <-resultCh + return result.authorized, result.err } // SendNotification sends a basic notification with a unique identifier, title, subtitle, and body. @@ -212,9 +239,48 @@ func (ns *Service) RemoveNotification(identifier string) error { return nil } -// SetIcon is a macOS stub. The application icon is used automatically. -func (ns *Service) SetIcon(_ []byte) { - return +//export requestNotificationAuthorizationResponse +func requestNotificationAuthorizationResponse(channelID C.int, authorized C.bool, errorMsg *C.char) { + resultCh, exists := getAndDeleteChannel(int(channelID)) + if !exists { + // handle this + return + } + + var err error + if errorMsg != nil { + err = fmt.Errorf("%s", C.GoString(errorMsg)) + C.free(unsafe.Pointer(errorMsg)) + } + + resultCh <- notificationChannel{ + authorized: bool(authorized), + err: err, + } + + close(resultCh) +} + +//export checkNotificationAuthorizationResponse +func checkNotificationAuthorizationResponse(channelID C.int, authorized C.bool, errorMsg *C.char) { + resultCh, exists := getAndDeleteChannel(int(channelID)) + if !exists { + // handle this + return + } + + var err error + if errorMsg != nil { + err = fmt.Errorf("%s", C.GoString(errorMsg)) + C.free(unsafe.Pointer(errorMsg)) + } + + resultCh <- notificationChannel{ + authorized: bool(authorized), + err: err, + } + + close(resultCh) } //export didReceiveNotificationResponse @@ -230,7 +296,44 @@ func didReceiveNotificationResponse(jsonPayload *C.char) { response.ActionIdentifier = DefaultActionIdentifier } - if NotificationService != nil { - NotificationService.handleNotificationResponse(response) + notificationServiceLock.RLock() + ns := NotificationService + notificationServiceLock.RUnlock() + + if service != nil { + ns.callbackLock.RLock() + callback := ns.notificationResponseCallback + ns.callbackLock.RUnlock() + + if callback != nil { + callback(response) + } } } + +func registerChannel() (int, chan notificationChannel) { + notificationChannelsLock.Lock() + defer notificationChannelsLock.Unlock() + + id := nextChannelID + nextChannelID++ + + resultCh := make(chan notificationChannel{ + authorized bool + err error + }, 1) + + notificationChannels[id] = resultCh + return id, resultCh +} + +func getChannel(id int) (chan notificationChannel, bool) { + notificationChannelsLock.Lock() + defer notificationChannelsLock.Unlock() + + ch, exists := notificationChannels[id] + if exists { + delete(notificationChannels, id) + } + return ch, exists +} diff --git a/v3/pkg/services/notifications/notifications_darwin.h b/v3/pkg/services/notifications/notifications_darwin.h index 21a210289..9b2bb6774 100644 --- a/v3/pkg/services/notifications/notifications_darwin.h +++ b/v3/pkg/services/notifications/notifications_darwin.h @@ -6,8 +6,8 @@ #import bool checkBundleIdentifier(void); -bool requestUserNotificationAuthorization(void *completion); -bool checkNotificationAuthorization(void); +bool requestNotificationAuthorization(void *channelPtr); +bool checkNotificationAuthorization(void *channelPtr); void sendNotification(const char *identifier, const char *title, const char *subtitle, const char *body, const char *data_json, void *completion); void sendNotificationWithActions(const char *identifier, const char *title, const char *subtitle, const char *body, const char *categoryId, const char *actions_json, void *completion); void registerNotificationCategory(const char *categoryId, const char *actions_json, bool hasReplyField, const char *replyPlaceholder, const char *replyButtonTitle); @@ -17,4 +17,8 @@ void removePendingNotification(const char *identifier); void removeAllDeliveredNotifications(void); void removeDeliveredNotification(const char *identifier); +extern void requestNotificationAuthorizationResponse(int channelID, bool authorized, const char* error); +extern void checkNotificationAuthorizationResponse(int channelID, bool authorized, const char* error); +extern void didReceiveNotificationResponse(const char *jsonPayload); + #endif /* NOTIFICATIONS_DARWIN_H */ \ No newline at end of file diff --git a/v3/pkg/services/notifications/notifications_darwin.m b/v3/pkg/services/notifications/notifications_darwin.m index 4a1514e06..3469d69d4 100644 --- a/v3/pkg/services/notifications/notifications_darwin.m +++ b/v3/pkg/services/notifications/notifications_darwin.m @@ -2,8 +2,6 @@ #import #import -extern void didReceiveNotificationResponse(const char *jsonPayload); - @interface NotificationsDelegate : NSObject @end @@ -71,8 +69,8 @@ static void ensureDelegateInitialized(void) { bool checkBundleIdentifier(void) { NSBundle *main = [NSBundle mainBundle]; if (main.bundleIdentifier == nil) { - NSLog(@"Error: Cannot use notifications in development mode.\n" - " Notifications require the app to be properly bundled with a bundle identifier.\n" + NSLog(@"Error: Cannot use the notification API in development mode.\n" + " Notifications require the app to be properly bundled with a bundle identifier and signed.\n" " To test notifications:\n" " 1. Build and package your app using 'wails3 package'\n" " 2. Sign the packaged .app\n" @@ -82,40 +80,32 @@ bool checkBundleIdentifier(void) { return true; } -bool requestUserNotificationAuthorization(void *completion) { - if (!checkBundleIdentifier()) { - return false; - } - +bool requestNotificationAuthorization(int channelID) { ensureDelegateInitialized(); UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; UNAuthorizationOptions options = UNAuthorizationOptionAlert | UNAuthorizationOptionSound | UNAuthorizationOptionBadge; + UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; + UNAuthorizationOptions options = UNAuthorizationOptionAlert | UNAuthorizationOptionSound | UNAuthorizationOptionBadge; + [center requestAuthorizationWithOptions:options completionHandler:^(BOOL granted, NSError * _Nullable error) { - if (completion != NULL) { - void (^callback)(NSError *, BOOL) = completion; - callback(error, granted); + if (error) { + requestNotificationAuthorizationResponse(channelID, false, [[error localizedDescription] UTF8String]); + } else { + requestNotificationAuthorizationResponse(channelID, granted, NULL); } }]; - return true; } -bool checkNotificationAuthorization(void) { +bool checkNotificationAuthorization(int channelID) { ensureDelegateInitialized(); - __block BOOL isAuthorized = NO; - dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); - UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; - [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) { - isAuthorized = (settings.authorizationStatus == UNAuthorizationStatusAuthorized); - dispatch_semaphore_signal(semaphore); + [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings *settings) { + BOOL isAuthorized = (settings.authorizationStatus == UNAuthorizationStatusAuthorized); + checkNotificationAuthorizationResponse(channelID, isAuthorized, NULL); }]; - - // Wait for response with a timeout - dispatch_semaphore_wait(semaphore, dispatch_time(DISPATCH_TIME_NOW, 3 * NSEC_PER_SEC)); - return isAuthorized; } void sendNotification(const char *identifier, const char *title, const char *subtitle, const char *body, const char *data_json, void *completion) { diff --git a/v3/pkg/services/notifications/notifications_windows.go b/v3/pkg/services/notifications/notifications_windows.go index ddb71f528..36466de94 100644 --- a/v3/pkg/services/notifications/notifications_windows.go +++ b/v3/pkg/services/notifications/notifications_windows.go @@ -20,11 +20,11 @@ import ( ) var ( - NotificationLock sync.RWMutex - NotificationCategories = make(map[string]NotificationCategory) - AppName string - AppGUID string - IconPath string + NotificationCategories = make(map[string]NotificationCategory) + notificationCategoriesLock sync.RWMutex + appName string + appGUID string + iconPath string ) const ( @@ -42,6 +42,9 @@ type NotificationPayload struct { // Creates a new Notifications Service. func New() *Service { + notificationServiceLock.Lock() + defer notificationServiceLock.Unlock() + if NotificationService == nil { NotificationService = &Service{} } @@ -51,20 +54,20 @@ func New() *Service { // ServiceStartup is called when the service is loaded // Sets an activation callback to emit an event when notifications are interacted with. func (ns *Service) ServiceStartup(ctx context.Context, options application.ServiceOptions) error { - AppName = application.Get().Config().Name + appName = application.Get().Config().Name guid, err := getGUID() if err != nil { return err } - AppGUID = guid + appGUID = guid - IconPath = filepath.Join(os.TempDir(), AppName+guid+".png") + iconPath = filepath.Join(os.TempDir(), appName+appGUID+".png") toast.SetAppData(toast.AppData{ - AppID: AppName, + AppID: appName, GUID: guid, - IconPath: IconPath, + IconPath: iconPath, }) toast.SetActivationCallback(func(args string, data []toast.UserData) { @@ -147,9 +150,9 @@ func (ns *Service) SendNotificationWithActions(options NotificationOptions) erro fmt.Printf("Error saving icon: %v\n", err) } - NotificationLock.RLock() + notificationCategoriesLock.RLock() nCategory := NotificationCategories[options.CategoryID] - NotificationLock.RUnlock() + notificationCategoriesLock.RUnlock() n := toast.Notification{ Title: options.Title, @@ -195,7 +198,7 @@ func (ns *Service) SendNotificationWithActions(options NotificationOptions) erro // RegisterNotificationCategory registers a new NotificationCategory to be used with SendNotificationWithActions. // Registering a category with the same name as a previously registered NotificationCategory will override it. func (ns *Service) RegisterNotificationCategory(category NotificationCategory) error { - NotificationLock.Lock() + notificationCategoriesLock.Lock() NotificationCategories[category.ID] = NotificationCategory{ ID: category.ID, Actions: category.Actions, @@ -203,16 +206,16 @@ func (ns *Service) RegisterNotificationCategory(category NotificationCategory) e ReplyPlaceholder: category.ReplyPlaceholder, ReplyButtonTitle: category.ReplyButtonTitle, } - NotificationLock.Unlock() + notificationCategoriesLock.Unlock() return saveCategoriesToRegistry() } // RemoveNotificationCategory removes a previously registered NotificationCategory. func (ns *Service) RemoveNotificationCategory(categoryId string) error { - NotificationLock.Lock() + notificationCategoriesLock.Lock() delete(NotificationCategories, categoryId) - NotificationLock.Unlock() + notificationCategoriesLock.Unlock() return saveCategoriesToRegistry() } @@ -298,11 +301,11 @@ func saveIconToDir() error { return fmt.Errorf("failed to retrieve application icon") } - return saveHIconAsPNG(icon, IconPath) + return saveHIconAsPNG(icon, iconPath) } func saveCategoriesToRegistry() error { - registryPath := fmt.Sprintf(NotificationCategoriesRegistryPath, AppName) + registryPath := fmt.Sprintf(NotificationCategoriesRegistryPath, appName) key, _, err := registry.CreateKey( registry.CURRENT_USER, @@ -314,9 +317,9 @@ func saveCategoriesToRegistry() error { } defer key.Close() - NotificationLock.RLock() + notificationCategoriesLock.RLock() data, err := json.Marshal(NotificationCategories) - NotificationLock.RUnlock() + notificationCategoriesLock.RUnlock() if err != nil { return err } @@ -325,7 +328,7 @@ func saveCategoriesToRegistry() error { } func loadCategoriesFromRegistry() error { - registryPath := fmt.Sprintf(NotificationCategoriesRegistryPath, AppName) + registryPath := fmt.Sprintf(NotificationCategoriesRegistryPath, appName) key, err := registry.OpenKey( registry.CURRENT_USER, @@ -350,9 +353,9 @@ func loadCategoriesFromRegistry() error { return err } - NotificationLock.Lock() + notificationCategoriesLock.Lock() NotificationCategories = categories - NotificationLock.Unlock() + notificationCategoriesLock.Unlock() return nil } @@ -367,7 +370,7 @@ func getUserText(data []toast.UserData) (string, bool) { } func getGUID() (string, error) { - keyPath := ToastRegistryPath + AppName + keyPath := ToastRegistryPath + appName k, err := registry.OpenKey(registry.CURRENT_USER, keyPath, registry.QUERY_VALUE) if err == nil { From ad749721e90cfa5d998dfa0f078ded3afd8cca21 Mon Sep 17 00:00:00 2001 From: popaprozac Date: Wed, 26 Feb 2025 19:57:21 -0800 Subject: [PATCH 094/374] can you tell i'm not a go programmer? --- .../notifications/notifications_darwin.go | 33 +++++++++---------- .../notifications/notifications_darwin.h | 8 ++--- .../notifications/notifications_darwin.m | 11 ++++--- 3 files changed, 23 insertions(+), 29 deletions(-) diff --git a/v3/pkg/services/notifications/notifications_darwin.go b/v3/pkg/services/notifications/notifications_darwin.go index 2781ceb7c..2789324ae 100644 --- a/v3/pkg/services/notifications/notifications_darwin.go +++ b/v3/pkg/services/notifications/notifications_darwin.go @@ -28,9 +28,9 @@ var ( notificationChannelsLock sync.Mutex nextChannelID int ) +var BundleIdentifierError = fmt.Errorf("notifications require a bundled application with a unique bundle identifier") const AppleDefaultActionIdentifier = "com.apple.UNNotificationDefaultActionIdentifier" -const BundleIdentifierError = fmt.Errorf("notifications require a bundled application with a unique bundle identifier") // Creates a new Notifications Service. // Your app must be packaged and signed for this feature to work. @@ -62,7 +62,7 @@ func CheckBundleIdentifier() bool { } // RequestNotificationAuthorization requests permission for notifications. -func (ns *Service) RequestNotificationAuthorization() (bool, err) { +func (ns *Service) RequestNotificationAuthorization() (bool, error) { if !CheckBundleIdentifier() { return false, BundleIdentifierError } @@ -76,7 +76,7 @@ func (ns *Service) RequestNotificationAuthorization() (bool, err) { } // CheckNotificationAuthorization checks current notification permission status. -func (ns *Service) CheckNotificationAuthorization() (bool, err) { +func (ns *Service) CheckNotificationAuthorization() (bool, error) { if !CheckBundleIdentifier() { return false, BundleIdentifierError } @@ -241,17 +241,17 @@ func (ns *Service) RemoveNotification(identifier string) error { //export requestNotificationAuthorizationResponse func requestNotificationAuthorizationResponse(channelID C.int, authorized C.bool, errorMsg *C.char) { - resultCh, exists := getAndDeleteChannel(int(channelID)) + resultCh, exists := getChannel(int(channelID)) if !exists { // handle this return } var err error - if errorMsg != nil { - err = fmt.Errorf("%s", C.GoString(errorMsg)) - C.free(unsafe.Pointer(errorMsg)) - } + if errorMsg != nil { + err = fmt.Errorf("%s", C.GoString(errorMsg)) + C.free(unsafe.Pointer(errorMsg)) + } resultCh <- notificationChannel{ authorized: bool(authorized), @@ -263,17 +263,17 @@ func requestNotificationAuthorizationResponse(channelID C.int, authorized C.bool //export checkNotificationAuthorizationResponse func checkNotificationAuthorizationResponse(channelID C.int, authorized C.bool, errorMsg *C.char) { - resultCh, exists := getAndDeleteChannel(int(channelID)) + resultCh, exists := getChannel(int(channelID)) if !exists { // handle this return } var err error - if errorMsg != nil { - err = fmt.Errorf("%s", C.GoString(errorMsg)) - C.free(unsafe.Pointer(errorMsg)) - } + if errorMsg != nil { + err = fmt.Errorf("%s", C.GoString(errorMsg)) + C.free(unsafe.Pointer(errorMsg)) + } resultCh <- notificationChannel{ authorized: bool(authorized), @@ -300,7 +300,7 @@ func didReceiveNotificationResponse(jsonPayload *C.char) { ns := NotificationService notificationServiceLock.RUnlock() - if service != nil { + if ns != nil { ns.callbackLock.RLock() callback := ns.notificationResponseCallback ns.callbackLock.RUnlock() @@ -318,10 +318,7 @@ func registerChannel() (int, chan notificationChannel) { id := nextChannelID nextChannelID++ - resultCh := make(chan notificationChannel{ - authorized bool - err error - }, 1) + resultCh := make(chan notificationChannel, 1) notificationChannels[id] = resultCh return id, resultCh diff --git a/v3/pkg/services/notifications/notifications_darwin.h b/v3/pkg/services/notifications/notifications_darwin.h index 9b2bb6774..c6bacaf79 100644 --- a/v3/pkg/services/notifications/notifications_darwin.h +++ b/v3/pkg/services/notifications/notifications_darwin.h @@ -6,8 +6,8 @@ #import bool checkBundleIdentifier(void); -bool requestNotificationAuthorization(void *channelPtr); -bool checkNotificationAuthorization(void *channelPtr); +void requestNotificationAuthorization(int channelID); +void checkNotificationAuthorization(int channelID); void sendNotification(const char *identifier, const char *title, const char *subtitle, const char *body, const char *data_json, void *completion); void sendNotificationWithActions(const char *identifier, const char *title, const char *subtitle, const char *body, const char *categoryId, const char *actions_json, void *completion); void registerNotificationCategory(const char *categoryId, const char *actions_json, bool hasReplyField, const char *replyPlaceholder, const char *replyButtonTitle); @@ -17,8 +17,4 @@ void removePendingNotification(const char *identifier); void removeAllDeliveredNotifications(void); void removeDeliveredNotification(const char *identifier); -extern void requestNotificationAuthorizationResponse(int channelID, bool authorized, const char* error); -extern void checkNotificationAuthorizationResponse(int channelID, bool authorized, const char* error); -extern void didReceiveNotificationResponse(const char *jsonPayload); - #endif /* NOTIFICATIONS_DARWIN_H */ \ No newline at end of file diff --git a/v3/pkg/services/notifications/notifications_darwin.m b/v3/pkg/services/notifications/notifications_darwin.m index 3469d69d4..5ac99c0a3 100644 --- a/v3/pkg/services/notifications/notifications_darwin.m +++ b/v3/pkg/services/notifications/notifications_darwin.m @@ -2,6 +2,10 @@ #import #import +extern void requestNotificationAuthorizationResponse(int channelID, bool authorized, const char* error); +extern void checkNotificationAuthorizationResponse(int channelID, bool authorized, const char* error); +extern void didReceiveNotificationResponse(const char *jsonPayload); + @interface NotificationsDelegate : NSObject @end @@ -80,15 +84,12 @@ bool checkBundleIdentifier(void) { return true; } -bool requestNotificationAuthorization(int channelID) { +void requestNotificationAuthorization(int channelID) { ensureDelegateInitialized(); UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; UNAuthorizationOptions options = UNAuthorizationOptionAlert | UNAuthorizationOptionSound | UNAuthorizationOptionBadge; - UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; - UNAuthorizationOptions options = UNAuthorizationOptionAlert | UNAuthorizationOptionSound | UNAuthorizationOptionBadge; - [center requestAuthorizationWithOptions:options completionHandler:^(BOOL granted, NSError * _Nullable error) { if (error) { requestNotificationAuthorizationResponse(channelID, false, [[error localizedDescription] UTF8String]); @@ -98,7 +99,7 @@ bool requestNotificationAuthorization(int channelID) { }]; } -bool checkNotificationAuthorization(int channelID) { +void checkNotificationAuthorization(int channelID) { ensureDelegateInitialized(); UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; From b2c43c034fa55ae3254da30735f21cce0d53d016 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Thu, 27 Feb 2025 21:01:14 +1100 Subject: [PATCH 095/374] [windows]Better popup menu positioning --- docs/src/content/docs/changelog.mdx | 1 + v3/pkg/application/popupmenu_windows.go | 22 +++++++++++++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/docs/src/content/docs/changelog.mdx b/docs/src/content/docs/changelog.mdx index 5047a6feb..c4d990635 100644 --- a/docs/src/content/docs/changelog.mdx +++ b/docs/src/content/docs/changelog.mdx @@ -110,6 +110,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `ServiceStartup` hooks are now invoked when `App.Run` is called, not in `application.New` by [@fbbdev](https://github.com/fbbdev) in [#4066](https://github.com/wailsapp/wails/pull/4066) - `ServiceStartup` errors are now returned from `App.Run` instead of terminating the process by [@fbbdev](https://github.com/fbbdev) in [#4066](https://github.com/wailsapp/wails/pull/4066) - Binding and dialog calls from JS now reject with error objects instead of strings by [@fbbdev](https://github.com/fbbdev) in [#4066](https://github.com/wailsapp/wails/pull/4066) +- Improved systray menu positioning on Windows by [@leaanthony](https://github.com/leaanthony) ## v3.0.0-alpha.9 - 2025-01-13 diff --git a/v3/pkg/application/popupmenu_windows.go b/v3/pkg/application/popupmenu_windows.go index 34bee3995..fbfd5eef9 100644 --- a/v3/pkg/application/popupmenu_windows.go +++ b/v3/pkg/application/popupmenu_windows.go @@ -2,6 +2,7 @@ package application import ( "github.com/wailsapp/wails/v3/pkg/w32" + "unsafe" ) const ( @@ -191,7 +192,26 @@ func (p *Win32Menu) ShowAt(x int, y int) { p.onMenuOpen() } - if !w32.TrackPopupMenuEx(p.menu, w32.TPM_LEFTALIGN, int32(x), int32(y-5), p.parent, nil) { + // Get screen dimensions to determine menu positioning + monitor := w32.MonitorFromWindow(p.parent, w32.MONITOR_DEFAULTTONEAREST) + var monitorInfo w32.MONITORINFO + monitorInfo.CbSize = uint32(unsafe.Sizeof(monitorInfo)) + if !w32.GetMonitorInfo(monitor, &monitorInfo) { + globalApplication.fatal("GetMonitorInfo failed") + } + + // Set flags to always position the menu above the cursor + menuFlags := uint32(w32.TPM_LEFTALIGN | w32.TPM_BOTTOMALIGN) + + // Check if we're close to the right edge of the screen + // If so, right-align the menu with some padding + if x > int(monitorInfo.RcWork.Right)-200 { // Assuming 200px as a reasonable menu width + menuFlags = uint32(w32.TPM_RIGHTALIGN | w32.TPM_BOTTOMALIGN) + // Add a small padding (10px) from the right edge + x = int(monitorInfo.RcWork.Right) - 10 + } + + if !w32.TrackPopupMenuEx(p.menu, menuFlags, int32(x), int32(y), p.parent, nil) { globalApplication.fatal("TrackPopupMenu failed") } From 28d22f7bfa4e752e68cc340a2f802dc16beb7b17 Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Thu, 27 Feb 2025 10:02:02 +0000 Subject: [PATCH 096/374] [skip ci] Publish @wailsio/runtime 3.0.0-alpha.58 --- .../docs/classes/Call.RuntimeError.html | 4 +-- .../docs/classes/Events.WailsEvent.html | 4 +-- .../docs/functions/Application.Hide.html | 2 +- .../docs/functions/Application.Quit.html | 2 +- .../docs/functions/Application.Show.html | 2 +- .../docs/functions/Browser.OpenURL.html | 2 +- .../runtime/docs/functions/Call.ByID.html | 2 +- .../runtime/docs/functions/Call.ByName.html | 2 +- .../runtime/docs/functions/Call.Call.html | 2 +- .../docs/functions/Clipboard.SetText.html | 2 +- .../docs/functions/Clipboard.Text.html | 2 +- .../runtime/docs/functions/Create.Any.html | 2 +- .../runtime/docs/functions/Create.Array.html | 2 +- .../docs/functions/Create.ByteSlice.html | 2 +- .../runtime/docs/functions/Create.Map.html | 2 +- .../docs/functions/Create.Nullable.html | 2 +- .../runtime/docs/functions/Create.Struct.html | 2 +- .../runtime/docs/functions/Dialogs.Error.html | 2 +- .../runtime/docs/functions/Dialogs.Info.html | 2 +- .../docs/functions/Dialogs.OpenFile.html | 2 +- .../docs/functions/Dialogs.Question.html | 2 +- .../docs/functions/Dialogs.SaveFile.html | 2 +- .../docs/functions/Dialogs.Warning.html | 2 +- .../runtime/docs/functions/Events.Emit.html | 2 +- .../runtime/docs/functions/Events.Off.html | 2 +- .../runtime/docs/functions/Events.OffAll.html | 2 +- .../runtime/docs/functions/Events.On.html | 2 +- .../docs/functions/Events.OnMultiple.html | 2 +- .../runtime/docs/functions/Events.Once.html | 2 +- .../runtime/docs/functions/Events.setup.html | 2 +- .../runtime/docs/functions/Flags.GetFlag.html | 2 +- .../docs/functions/Screens.GetAll.html | 2 +- .../docs/functions/Screens.GetCurrent.html | 2 +- .../docs/functions/Screens.GetPrimary.html | 2 +- .../docs/functions/System.Capabilities.html | 2 +- .../docs/functions/System.Environment.html | 2 +- .../docs/functions/System.IsAMD64.html | 2 +- .../runtime/docs/functions/System.IsARM.html | 2 +- .../docs/functions/System.IsARM64.html | 2 +- .../docs/functions/System.IsDarkMode.html | 2 +- .../docs/functions/System.IsDebug.html | 2 +- .../docs/functions/System.IsLinux.html | 2 +- .../runtime/docs/functions/System.IsMac.html | 2 +- .../docs/functions/System.IsWindows.html | 2 +- .../runtime/docs/functions/System.invoke.html | 2 +- .../runtime/docs/functions/WML.Enable.html | 2 +- .../runtime/docs/functions/WML.Reload.html | 2 +- .../@wailsio/runtime/docs/functions/init.html | 2 +- .../docs/interfaces/Call.CallOptions.html | 8 ++--- .../docs/interfaces/Dialogs.Button.html | 8 ++--- .../docs/interfaces/Dialogs.FileFilter.html | 6 ++-- .../Dialogs.MessageDialogOptions.html | 10 +++--- .../Dialogs.OpenFileDialogOptions.html | 34 +++++++++--------- .../Dialogs.SaveFileDialogOptions.html | 36 +++++++++---------- .../runtime/docs/interfaces/Screens.Rect.html | 10 +++--- .../docs/interfaces/Screens.Screen.html | 26 +++++++------- .../runtime/docs/interfaces/Screens.Size.html | 6 ++-- .../interfaces/System.EnvironmentInfo.html | 12 +++---- .../docs/interfaces/System.OSInfo.html | 10 +++--- .../runtime/docs/modules/Application.html | 2 +- .../runtime/docs/modules/Browser.html | 2 +- .../@wailsio/runtime/docs/modules/Call.html | 2 +- .../runtime/docs/modules/Clipboard.html | 2 +- .../@wailsio/runtime/docs/modules/Create.html | 2 +- .../runtime/docs/modules/Dialogs.html | 2 +- .../@wailsio/runtime/docs/modules/Events.html | 2 +- .../@wailsio/runtime/docs/modules/Flags.html | 2 +- .../runtime/docs/modules/Screens.html | 2 +- .../@wailsio/runtime/docs/modules/System.html | 2 +- .../@wailsio/runtime/docs/modules/WML.html | 2 +- .../runtime/docs/variables/Events.Types.html | 2 +- .../runtime/docs/variables/Window.html | 2 +- .../desktop/@wailsio/runtime/package.json | 2 +- 73 files changed, 147 insertions(+), 147 deletions(-) diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Call.RuntimeError.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Call.RuntimeError.html index 0a3c47496..8be63de1a 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Call.RuntimeError.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Call.RuntimeError.html @@ -1,6 +1,6 @@ RuntimeError | @wailsio/runtime

    Exception class that will be thrown in case the bound method returns an error. The value of the RuntimeError#name property is "RuntimeError".

    -

    Hierarchy

    • Error
      • RuntimeError

    Constructors

    Hierarchy

    • Error
      • RuntimeError

    Constructors

    Properties

    cause? message name @@ -8,4 +8,4 @@ The value of the

    Constructors

    • Constructs a new RuntimeError instance.

      Parameters

      • message: string

        The error message.

      • Rest ...args: any[]

        Optional arguments for the Error constructor.

        -

      Returns RuntimeError

    Properties

    cause?: unknown
    message: string
    name: string
    stack?: string

    Generated using TypeDoc

    \ No newline at end of file +

    Returns RuntimeError

    Properties

    cause?: unknown
    message: string
    name: string
    stack?: string

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Events.WailsEvent.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Events.WailsEvent.html index df9e89a3f..2fdcef19a 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Events.WailsEvent.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Events.WailsEvent.html @@ -1,4 +1,4 @@ -WailsEvent | @wailsio/runtime

    Constructors

    constructor +WailsEvent | @wailsio/runtime

    Constructors

    Properties

    Constructors

    Properties

    data: any
    name: any

    Generated using TypeDoc

    \ No newline at end of file +

    Constructors

    Properties

    data: any
    name: any

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Hide.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Hide.html index 3c599547b..82498f495 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Hide.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Hide.html @@ -1,2 +1,2 @@ Hide | @wailsio/runtime
    • Hides a certain method by calling the HideMethod function.

      -

      Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file +

    Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Quit.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Quit.html index 58f8b8876..5276f9cfd 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Quit.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Quit.html @@ -1,2 +1,2 @@ Quit | @wailsio/runtime
    • Calls the QuitMethod to terminate the program.

      -

      Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file +

    Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Show.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Show.html index 546052e05..8efd8b2af 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Show.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Show.html @@ -1,2 +1,2 @@ Show | @wailsio/runtime
    • Calls the ShowMethod and returns the result.

      -

      Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file +

    Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Browser.OpenURL.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Browser.OpenURL.html index 7c1e2a846..e58e7ea97 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Browser.OpenURL.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Browser.OpenURL.html @@ -1,3 +1,3 @@ OpenURL | @wailsio/runtime
    • Open a browser window to the given URL

      Parameters

      • url: string

        The URL to open

        -

      Returns Promise<string>

    Generated using TypeDoc

    \ No newline at end of file +

    Returns Promise<string>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByID.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByID.html index be1007fab..c63a69932 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByID.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByID.html @@ -5,4 +5,4 @@ See Call for details.

    Returns Promise<any>

    • The result of the method call.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByName.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByName.html index 2b9c980d8..af5e54d94 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByName.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByName.html @@ -3,4 +3,4 @@ See Call for details.

    Parameters

    • methodName: string

      The name of the method in the format 'package.struct.method'.

    • Rest ...args: any[]

      The arguments to pass to the method.

    Returns Promise<any>

    The result of the method call.

    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.Call.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.Call.html index 6cb45c0ac..9c808a90b 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.Call.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.Call.html @@ -8,4 +8,4 @@ by the application- or service-level error marshaling functions.

    Returns Promise<any>

    • The result of the call.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.SetText.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.SetText.html index 25c0256f6..ee2b91c04 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.SetText.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.SetText.html @@ -3,4 +3,4 @@

    Returns Promise<any>

    • A Promise that resolves when the operation is successful.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.Text.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.Text.html index 43a3b1dcc..d7903ce64 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.Text.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.Text.html @@ -1,3 +1,3 @@ Text | @wailsio/runtime
    • Get the Clipboard text

      Returns Promise<string>

      A promise that resolves with the text from the Clipboard.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Any.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Any.html index a8ef5b801..53272faca 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Any.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Any.html @@ -1,2 +1,2 @@ Any | @wailsio/runtime
    • Any is a dummy creation function for simple or unknown types.

      -

      Type Parameters

      • T

      Parameters

      • source: any

      Returns T

    Generated using TypeDoc

    \ No newline at end of file +

    Type Parameters

    • T

    Parameters

    • source: any

    Returns T

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Array.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Array.html index 438177f63..820261045 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Array.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Array.html @@ -1,4 +1,4 @@ Array | @wailsio/runtime
    • Array takes a creation function for an arbitrary type and returns an in-place creation function for an array whose elements are of that type.

      -

      Type Parameters

      • T

      Parameters

      • element: ((source) => T)
          • (source): T
          • Parameters

            • source: any

            Returns T

      Returns ((source) => T[])

        • (source): T[]
        • Parameters

          • source: any

          Returns T[]

    Generated using TypeDoc

    \ No newline at end of file +

    Type Parameters

    • T

    Parameters

    • element: ((source) => T)
        • (source): T
        • Parameters

          • source: any

          Returns T

    Returns ((source) => T[])

      • (source): T[]
      • Parameters

        • source: any

        Returns T[]

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.ByteSlice.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.ByteSlice.html index d4f7c30b9..29fa872b9 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.ByteSlice.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.ByteSlice.html @@ -1,3 +1,3 @@ ByteSlice | @wailsio/runtime
    • ByteSlice is a creation function that replaces null strings with empty strings.

      -

      Parameters

      • source: any

      Returns string

    Generated using TypeDoc

    \ No newline at end of file +

    Parameters

    • source: any

    Returns string

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Map.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Map.html index 390ece492..f952af5eb 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Map.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Map.html @@ -1,4 +1,4 @@ Map | @wailsio/runtime
    • Map takes creation functions for two arbitrary types and returns an in-place creation function for an object whose keys and values are of those types.

      -

      Type Parameters

      • K
      • V

      Parameters

      • key: ((source) => K)
          • (source): K
          • Parameters

            • source: any

            Returns K

      • value: ((source) => V)
          • (source): V
          • Parameters

            • source: any

            Returns V

      Returns ((source) => {
          [_: K]: V;
      })

        • (source): {
              [_: K]: V;
          }
        • Parameters

          • source: any

          Returns {
              [_: K]: V;
          }

    Generated using TypeDoc

    \ No newline at end of file +

    Type Parameters

    • K
    • V

    Parameters

    • key: ((source) => K)
        • (source): K
        • Parameters

          • source: any

          Returns K

    • value: ((source) => V)
        • (source): V
        • Parameters

          • source: any

          Returns V

    Returns ((source) => {
        [_: K]: V;
    })

      • (source): {
            [_: K]: V;
        }
      • Parameters

        • source: any

        Returns {
            [_: K]: V;
        }

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Nullable.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Nullable.html index fc29033a7..4bc09bc89 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Nullable.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Nullable.html @@ -1,3 +1,3 @@ Nullable | @wailsio/runtime
    • Nullable takes a creation function for an arbitrary type and returns a creation function for a nullable value of that type.

      -

      Type Parameters

      • T

      Parameters

      • element: ((source) => T)
          • (source): T
          • Parameters

            • source: any

            Returns T

      Returns ((source) => null | T)

        • (source): null | T
        • Parameters

          • source: any

          Returns null | T

    Generated using TypeDoc

    \ No newline at end of file +

    Type Parameters

    • T

    Parameters

    • element: ((source) => T)
        • (source): T
        • Parameters

          • source: any

          Returns T

    Returns ((source) => null | T)

      • (source): null | T
      • Parameters

        • source: any

        Returns null | T

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Struct.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Struct.html index d53e16c34..bfcce5c1f 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Struct.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Struct.html @@ -1,3 +1,3 @@ Struct | @wailsio/runtime
    • Struct takes an object mapping field names to creation functions and returns an in-place creation function for a struct.

      -

      Type Parameters

      • T extends {
            [_: string]: ((source) => any);
        }
      • U extends {
            [Key in string | number | symbol]?: ReturnType<T[Key]>
        }

      Parameters

      • createField: T

      Returns ((source) => U)

        • (source): U
        • Parameters

          • source: any

          Returns U

    Generated using TypeDoc

    \ No newline at end of file +

    Type Parameters

    • T extends {
          [_: string]: ((source) => any);
      }
    • U extends {
          [Key in string | number | symbol]?: ReturnType<T[Key]>
      }

    Parameters

    • createField: T

    Returns ((source) => U)

      • (source): U
      • Parameters

        • source: any

        Returns U

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Error.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Error.html index dbf1d7730..cc3166f22 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Error.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Error.html @@ -2,4 +2,4 @@

    Returns Promise<string>

    • The label of the button pressed
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Info.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Info.html index 426c01d13..d7cc6a411 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Info.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Info.html @@ -2,4 +2,4 @@

    Returns Promise<string>

    • The label of the button pressed
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.OpenFile.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.OpenFile.html index 492671fba..81cd49417 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.OpenFile.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.OpenFile.html @@ -1,3 +1,3 @@ OpenFile | @wailsio/runtime
    • Parameters

      Returns Promise<string | string[]>

      Returns selected file or list of files. Returns blank string if no file is selected.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Question.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Question.html index a78560b64..a4f05279a 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Question.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Question.html @@ -2,4 +2,4 @@

    Returns Promise<string>

    • The label of the button pressed
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.SaveFile.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.SaveFile.html index 12832bda3..7187f1f8f 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.SaveFile.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.SaveFile.html @@ -1,3 +1,3 @@ SaveFile | @wailsio/runtime
    • Parameters

      Returns Promise<string>

      Returns the selected file. Returns blank string if no file is selected.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Warning.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Warning.html index 506f997f6..050e75212 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Warning.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Warning.html @@ -2,4 +2,4 @@

    Returns Promise<string>

    • The label of the button pressed
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Emit.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Emit.html index 84bd90913..924e0dfe1 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Emit.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Emit.html @@ -3,4 +3,4 @@

    Returns any

    • The result of the emitted event.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Off.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Off.html index aadda585c..986146db9 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Off.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Off.html @@ -1,4 +1,4 @@ Off | @wailsio/runtime
    • Removes event listeners for the specified event names.

      Parameters

      • eventName: string

        The name of the event to remove listeners for.

      • Rest ...additionalEventNames: string[]

        Additional event names to remove listeners for.

        -

      Returns undefined

    Generated using TypeDoc

    \ No newline at end of file +

    Returns undefined

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OffAll.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OffAll.html index 1eaaa3177..b381ff2d7 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OffAll.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OffAll.html @@ -1,3 +1,3 @@ OffAll | @wailsio/runtime
    • Removes all event listeners.

      Returns void

      Function

      OffAll

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.On.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.On.html index f2be25dd5..7662e117a 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.On.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.On.html @@ -4,4 +4,4 @@

    Returns Function

    • A function that, when called, will unregister the callback from the event.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OnMultiple.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OnMultiple.html index e973a5a4f..129c7e471 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OnMultiple.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OnMultiple.html @@ -5,4 +5,4 @@

    Returns Function

    • A function that, when called, will unregister the callback from the event.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Once.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Once.html index 0014783c2..1bc9c2d50 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Once.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Once.html @@ -4,4 +4,4 @@

    Returns Function

    • A function that, when called, will unregister the callback from the event.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.setup.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.setup.html index aa8bc1214..eab83280f 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.setup.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.setup.html @@ -1 +1 @@ -setup | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file +setup | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Flags.GetFlag.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Flags.GetFlag.html index 12ab6466f..630dd4441 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Flags.GetFlag.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Flags.GetFlag.html @@ -3,4 +3,4 @@

    Returns any

    • The value associated with the specified key.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetAll.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetAll.html index 30f5f6fd4..91e47b8b2 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetAll.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetAll.html @@ -1,3 +1,3 @@ GetAll | @wailsio/runtime
    • Gets all screens.

      Returns Promise<Screen[]>

      A promise that resolves to an array of Screen objects.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetCurrent.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetCurrent.html index a60aa183c..0410cd72d 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetCurrent.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetCurrent.html @@ -1,3 +1,3 @@ GetCurrent | @wailsio/runtime
    • Gets the current active screen.

      Returns Promise<Screen>

      A promise that resolves with the current active screen.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetPrimary.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetPrimary.html index a612a8717..9b302e99d 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetPrimary.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetPrimary.html @@ -1,3 +1,3 @@ GetPrimary | @wailsio/runtime
    • Gets the primary screen.

      Returns Promise<Screen>

      A promise that resolves to the primary screen.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Capabilities.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Capabilities.html index dffb74a65..88f7ae6d6 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Capabilities.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Capabilities.html @@ -1,4 +1,4 @@ Capabilities | @wailsio/runtime
    • Fetches the capabilities of the application from the server.

      Returns Promise<Object>

      A promise that resolves to an object containing the capabilities.

      Async

      Function

      Capabilities

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Environment.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Environment.html index 6540a0dbc..d3ce717ba 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Environment.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Environment.html @@ -2,4 +2,4 @@
  • A promise that resolves to an object containing OS and system architecture.
  • Function

    Retrieves environment details.

    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsAMD64.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsAMD64.html index 7767f6103..dc0220ca9 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsAMD64.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsAMD64.html @@ -1,3 +1,3 @@ IsAMD64 | @wailsio/runtime
    • Checks if the current environment architecture is AMD64.

      Returns boolean

      True if the current environment architecture is AMD64, false otherwise.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM.html index 61e505d27..60a78774f 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM.html @@ -1,3 +1,3 @@ IsARM | @wailsio/runtime
    • Checks if the current architecture is ARM.

      Returns boolean

      True if the current architecture is ARM, false otherwise.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM64.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM64.html index 8ffdf93da..fd78272cf 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM64.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM64.html @@ -2,4 +2,4 @@

    Returns boolean

    • Returns true if the environment is ARM64 architecture, otherwise returns false.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDarkMode.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDarkMode.html index f16b4910a..a0fb265a1 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDarkMode.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDarkMode.html @@ -2,4 +2,4 @@
  • A promise that resolves to a boolean value indicating if the system is in dark mode.
  • Function

    Retrieves the system dark mode status.

    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDebug.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDebug.html index 133a618fd..484a00352 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDebug.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDebug.html @@ -1 +1 @@ -IsDebug | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file +IsDebug | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsLinux.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsLinux.html index 1c6ba957f..4be7ddfdb 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsLinux.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsLinux.html @@ -1,3 +1,3 @@ IsLinux | @wailsio/runtime
    • Checks if the current operating system is Linux.

      Returns boolean

      Returns true if the current operating system is Linux, false otherwise.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsMac.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsMac.html index 7095ba7c3..7432977d2 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsMac.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsMac.html @@ -1,3 +1,3 @@ IsMac | @wailsio/runtime
    • Checks if the current environment is a macOS operating system.

      Returns boolean

      True if the environment is macOS, false otherwise.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsWindows.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsWindows.html index 54e7738e0..d308687a2 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsWindows.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsWindows.html @@ -1,3 +1,3 @@ IsWindows | @wailsio/runtime
    • Checks if the current operating system is Windows.

      Returns boolean

      True if the operating system is Windows, otherwise false.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.invoke.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.invoke.html index fff5174b9..ed9b05b3c 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.invoke.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.invoke.html @@ -1 +1 @@ -invoke | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file +invoke | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Enable.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Enable.html index 9dd233b3b..96607e20e 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Enable.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Enable.html @@ -1,2 +1,2 @@ Enable | @wailsio/runtime
    • Schedules an automatic reload of WML to be performed as soon as the document is fully loaded.

      -

      Returns void

    Generated using TypeDoc

    \ No newline at end of file +

    Returns void

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Reload.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Reload.html index 7c4dcce8c..dda46c9bd 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Reload.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Reload.html @@ -1,2 +1,2 @@ Reload | @wailsio/runtime
    • Reloads the WML page by adding necessary event listeners and browser listeners.

      -

      Returns void

    Generated using TypeDoc

    \ No newline at end of file +

    Returns void

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/init.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/init.html index 82122482a..f68c18b13 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/init.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/init.html @@ -1 +1 @@ -init | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file +init | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Call.CallOptions.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Call.CallOptions.html index 29d829e19..77b0c27a5 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Call.CallOptions.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Call.CallOptions.html @@ -1,7 +1,7 @@ -CallOptions | @wailsio/runtime

    Interface CallOptions

    interface CallOptions {
        args: any[];
        methodID: undefined | number;
        methodName: undefined | string;
    }

    Properties

    args +CallOptions | @wailsio/runtime

    Interface CallOptions

    interface CallOptions {
        args: any[];
        methodID: undefined | number;
        methodName: undefined | string;
    }

    Properties

    args: any[]

    Arguments to be passed into the bound method.

    -
    methodID: undefined | number

    The numeric ID of the bound method to call.

    -
    methodName: undefined | string

    The fully qualified name of the bound method to call.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    methodID: undefined | number

    The numeric ID of the bound method to call.

    +
    methodName: undefined | string

    The fully qualified name of the bound method to call.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.Button.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.Button.html index 33d3bc025..6ab3eb519 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.Button.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.Button.html @@ -1,7 +1,7 @@ -Button | @wailsio/runtime
    interface Button {
        IsCancel: undefined | boolean;
        IsDefault: undefined | boolean;
        Label: undefined | string;
    }

    Properties

    IsCancel +Button | @wailsio/runtime
    interface Button {
        IsCancel: undefined | boolean;
        IsDefault: undefined | boolean;
        Label: undefined | string;
    }

    Properties

    IsCancel: undefined | boolean

    True if the button should cancel an operation when clicked.

    -
    IsDefault: undefined | boolean

    True if the button should be the default action when the user presses enter.

    -
    Label: undefined | string

    Text that appears within the button.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    IsDefault: undefined | boolean

    True if the button should be the default action when the user presses enter.

    +
    Label: undefined | string

    Text that appears within the button.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.FileFilter.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.FileFilter.html index cb7bac3e7..dc090f0db 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.FileFilter.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.FileFilter.html @@ -1,5 +1,5 @@ -FileFilter | @wailsio/runtime
    interface FileFilter {
        DisplayName: undefined | string;
        Pattern: undefined | string;
    }

    Properties

    DisplayName +FileFilter | @wailsio/runtime
    interface FileFilter {
        DisplayName: undefined | string;
        Pattern: undefined | string;
    }

    Properties

    Properties

    DisplayName: undefined | string

    Display name for the filter, it could be "Text Files", "Images" etc.

    -
    Pattern: undefined | string

    Pattern to match for the filter, e.g. ".txt;.md" for text markdown files.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    Pattern: undefined | string

    Pattern to match for the filter, e.g. ".txt;.md" for text markdown files.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.MessageDialogOptions.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.MessageDialogOptions.html index 7d6e2d854..394f96bd7 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.MessageDialogOptions.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.MessageDialogOptions.html @@ -1,9 +1,9 @@ -MessageDialogOptions | @wailsio/runtime

    Interface MessageDialogOptions

    interface MessageDialogOptions {
        Buttons: undefined | Button[];
        Detached: undefined | boolean;
        Message: undefined | string;
        Title: undefined | string;
    }

    Properties

    Buttons +MessageDialogOptions | @wailsio/runtime

    Interface MessageDialogOptions

    interface MessageDialogOptions {
        Buttons: undefined | Button[];
        Detached: undefined | boolean;
        Message: undefined | string;
        Title: undefined | string;
    }

    Properties

    Buttons: undefined | Button[]

    Array of button options to show in the dialog.

    -
    Detached: undefined | boolean

    True if the dialog should appear detached from the main window (if applicable).

    -
    Message: undefined | string

    The main message to show in the dialog.

    -
    Title: undefined | string

    The title of the dialog window.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    Detached: undefined | boolean

    True if the dialog should appear detached from the main window (if applicable).

    +
    Message: undefined | string

    The main message to show in the dialog.

    +
    Title: undefined | string

    The title of the dialog window.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.OpenFileDialogOptions.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.OpenFileDialogOptions.html index 983f5d9cf..f9f370621 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.OpenFileDialogOptions.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.OpenFileDialogOptions.html @@ -1,4 +1,4 @@ -OpenFileDialogOptions | @wailsio/runtime

    Interface OpenFileDialogOptions

    interface OpenFileDialogOptions {
        AllowsMultipleSelection: undefined | boolean;
        AllowsOtherFiletypes: undefined | boolean;
        ButtonText: undefined | string;
        CanChooseDirectories: undefined | boolean;
        CanChooseFiles: undefined | boolean;
        CanCreateDirectories: undefined | boolean;
        CanSelectHiddenExtension: undefined | boolean;
        Detached: undefined | boolean;
        Directory: undefined | string;
        Filters: undefined | FileFilter[];
        HideExtension: undefined | boolean;
        Message: undefined | string;
        ResolvesAliases: undefined | boolean;
        ShowHiddenFiles: undefined | boolean;
        Title: undefined | string;
        TreatsFilePackagesAsDirectories: undefined | boolean;
    }

    Properties

    AllowsMultipleSelection +OpenFileDialogOptions | @wailsio/runtime

    Interface OpenFileDialogOptions

    interface OpenFileDialogOptions {
        AllowsMultipleSelection: undefined | boolean;
        AllowsOtherFiletypes: undefined | boolean;
        ButtonText: undefined | string;
        CanChooseDirectories: undefined | boolean;
        CanChooseFiles: undefined | boolean;
        CanCreateDirectories: undefined | boolean;
        CanSelectHiddenExtension: undefined | boolean;
        Detached: undefined | boolean;
        Directory: undefined | string;
        Filters: undefined | FileFilter[];
        HideExtension: undefined | boolean;
        Message: undefined | string;
        ResolvesAliases: undefined | boolean;
        ShowHiddenFiles: undefined | boolean;
        Title: undefined | string;
        TreatsFilePackagesAsDirectories: undefined | boolean;
    }

    Properties

    AllowsMultipleSelection: undefined | boolean

    Indicates if multiple selection is allowed.

    -
    AllowsOtherFiletypes: undefined | boolean

    Indicates if other file types are allowed.

    -
    ButtonText: undefined | string

    Text to display on the button.

    -
    CanChooseDirectories: undefined | boolean

    Indicates if directories can be chosen.

    -
    CanChooseFiles: undefined | boolean

    Indicates if files can be chosen.

    -
    CanCreateDirectories: undefined | boolean

    Indicates if directories can be created.

    -
    CanSelectHiddenExtension: undefined | boolean

    Indicates if hidden extensions can be selected.

    -
    Detached: undefined | boolean

    Indicates if the dialog should appear detached from the main window.

    -
    Directory: undefined | string

    Directory to open in the dialog.

    -
    Filters: undefined | FileFilter[]

    Array of file filters.

    -
    HideExtension: undefined | boolean

    Indicates if the extension should be hidden.

    -
    Message: undefined | string

    Message to show in the dialog.

    -
    ResolvesAliases: undefined | boolean

    Indicates if aliases should be resolved.

    -
    ShowHiddenFiles: undefined | boolean

    Indicates if hidden files should be shown.

    -
    Title: undefined | string

    Title of the dialog.

    -
    TreatsFilePackagesAsDirectories: undefined | boolean

    Indicates if file packages should be treated as directories.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    AllowsOtherFiletypes: undefined | boolean

    Indicates if other file types are allowed.

    +
    ButtonText: undefined | string

    Text to display on the button.

    +
    CanChooseDirectories: undefined | boolean

    Indicates if directories can be chosen.

    +
    CanChooseFiles: undefined | boolean

    Indicates if files can be chosen.

    +
    CanCreateDirectories: undefined | boolean

    Indicates if directories can be created.

    +
    CanSelectHiddenExtension: undefined | boolean

    Indicates if hidden extensions can be selected.

    +
    Detached: undefined | boolean

    Indicates if the dialog should appear detached from the main window.

    +
    Directory: undefined | string

    Directory to open in the dialog.

    +
    Filters: undefined | FileFilter[]

    Array of file filters.

    +
    HideExtension: undefined | boolean

    Indicates if the extension should be hidden.

    +
    Message: undefined | string

    Message to show in the dialog.

    +
    ResolvesAliases: undefined | boolean

    Indicates if aliases should be resolved.

    +
    ShowHiddenFiles: undefined | boolean

    Indicates if hidden files should be shown.

    +
    Title: undefined | string

    Title of the dialog.

    +
    TreatsFilePackagesAsDirectories: undefined | boolean

    Indicates if file packages should be treated as directories.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.SaveFileDialogOptions.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.SaveFileDialogOptions.html index f1e203ea0..9c18d7d92 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.SaveFileDialogOptions.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.SaveFileDialogOptions.html @@ -1,4 +1,4 @@ -SaveFileDialogOptions | @wailsio/runtime

    Interface SaveFileDialogOptions

    interface SaveFileDialogOptions {
        AllowsMultipleSelection: undefined | boolean;
        AllowsOtherFiletypes: undefined | boolean;
        ButtonText: undefined | string;
        CanChooseDirectories: undefined | boolean;
        CanChooseFiles: undefined | boolean;
        CanCreateDirectories: undefined | boolean;
        CanSelectHiddenExtension: undefined | boolean;
        Detached: undefined | boolean;
        Directory: undefined | string;
        Filename: undefined | string;
        Filters: undefined | FileFilter[];
        HideExtension: undefined | boolean;
        Message: undefined | string;
        ResolvesAliases: undefined | boolean;
        ShowHiddenFiles: undefined | boolean;
        Title: undefined | string;
        TreatsFilePackagesAsDirectories: undefined | boolean;
    }

    Properties

    AllowsMultipleSelection +SaveFileDialogOptions | @wailsio/runtime

    Interface SaveFileDialogOptions

    interface SaveFileDialogOptions {
        AllowsMultipleSelection: undefined | boolean;
        AllowsOtherFiletypes: undefined | boolean;
        ButtonText: undefined | string;
        CanChooseDirectories: undefined | boolean;
        CanChooseFiles: undefined | boolean;
        CanCreateDirectories: undefined | boolean;
        CanSelectHiddenExtension: undefined | boolean;
        Detached: undefined | boolean;
        Directory: undefined | string;
        Filename: undefined | string;
        Filters: undefined | FileFilter[];
        HideExtension: undefined | boolean;
        Message: undefined | string;
        ResolvesAliases: undefined | boolean;
        ShowHiddenFiles: undefined | boolean;
        Title: undefined | string;
        TreatsFilePackagesAsDirectories: undefined | boolean;
    }

    Properties

    AllowsMultipleSelection: undefined | boolean

    Indicates if multiple selection is allowed.

    -
    AllowsOtherFiletypes: undefined | boolean

    Indicates if other file types are allowed.

    -
    ButtonText: undefined | string

    Text to display on the button.

    -
    CanChooseDirectories: undefined | boolean

    Indicates if directories can be chosen.

    -
    CanChooseFiles: undefined | boolean

    Indicates if files can be chosen.

    -
    CanCreateDirectories: undefined | boolean

    Indicates if directories can be created.

    -
    CanSelectHiddenExtension: undefined | boolean

    Indicates if hidden extensions can be selected.

    -
    Detached: undefined | boolean

    Indicates if the dialog should appear detached from the main window.

    -
    Directory: undefined | string

    Directory to open in the dialog.

    -
    Filename: undefined | string

    Default filename to use in the dialog.

    -
    Filters: undefined | FileFilter[]

    Array of file filters.

    -
    HideExtension: undefined | boolean

    Indicates if the extension should be hidden.

    -
    Message: undefined | string

    Message to show in the dialog.

    -
    ResolvesAliases: undefined | boolean

    Indicates if aliases should be resolved.

    -
    ShowHiddenFiles: undefined | boolean

    Indicates if hidden files should be shown.

    -
    Title: undefined | string

    Title of the dialog.

    -
    TreatsFilePackagesAsDirectories: undefined | boolean

    Indicates if file packages should be treated as directories.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    AllowsOtherFiletypes: undefined | boolean

    Indicates if other file types are allowed.

    +
    ButtonText: undefined | string

    Text to display on the button.

    +
    CanChooseDirectories: undefined | boolean

    Indicates if directories can be chosen.

    +
    CanChooseFiles: undefined | boolean

    Indicates if files can be chosen.

    +
    CanCreateDirectories: undefined | boolean

    Indicates if directories can be created.

    +
    CanSelectHiddenExtension: undefined | boolean

    Indicates if hidden extensions can be selected.

    +
    Detached: undefined | boolean

    Indicates if the dialog should appear detached from the main window.

    +
    Directory: undefined | string

    Directory to open in the dialog.

    +
    Filename: undefined | string

    Default filename to use in the dialog.

    +
    Filters: undefined | FileFilter[]

    Array of file filters.

    +
    HideExtension: undefined | boolean

    Indicates if the extension should be hidden.

    +
    Message: undefined | string

    Message to show in the dialog.

    +
    ResolvesAliases: undefined | boolean

    Indicates if aliases should be resolved.

    +
    ShowHiddenFiles: undefined | boolean

    Indicates if hidden files should be shown.

    +
    Title: undefined | string

    Title of the dialog.

    +
    TreatsFilePackagesAsDirectories: undefined | boolean

    Indicates if file packages should be treated as directories.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Rect.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Rect.html index 8daab6225..0f5d9d0c6 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Rect.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Rect.html @@ -1,9 +1,9 @@ -Rect | @wailsio/runtime
    interface Rect {
        Height: number;
        Width: number;
        X: number;
        Y: number;
    }

    Properties

    Height +Rect | @wailsio/runtime
    interface Rect {
        Height: number;
        Width: number;
        X: number;
        Y: number;
    }

    Properties

    Properties

    Height: number

    The height of the rectangle.

    -
    Width: number

    The width of the rectangle.

    -
    X: number

    The X coordinate of the origin.

    -
    Y: number

    The Y coordinate of the origin.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    Width: number

    The width of the rectangle.

    +
    X: number

    The X coordinate of the origin.

    +
    Y: number

    The Y coordinate of the origin.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Screen.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Screen.html index 4b7d841cd..021012a8c 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Screen.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Screen.html @@ -1,4 +1,4 @@ -Screen | @wailsio/runtime
    interface Screen {
        Bounds: Rect;
        ID: string;
        IsPrimary: boolean;
        Name: string;
        PhysicalBounds: Rect;
        PhysicalWorkArea: Rect;
        Rotation: number;
        ScaleFactor: number;
        Size: Size;
        WorkArea: Rect;
        X: number;
        Y: number;
    }

    Properties

    Bounds +Screen | @wailsio/runtime
    interface Screen {
        Bounds: Rect;
        ID: string;
        IsPrimary: boolean;
        Name: string;
        PhysicalBounds: Rect;
        PhysicalWorkArea: Rect;
        Rotation: number;
        ScaleFactor: number;
        Size: Size;
        WorkArea: Rect;
        X: number;
        Y: number;
    }

    Properties

    Bounds ID IsPrimary Name @@ -11,15 +11,15 @@ X Y

    Properties

    Bounds: Rect

    Contains the bounds of the screen in terms of X, Y, Width, and Height.

    -
    ID: string

    Unique identifier for the screen.

    -
    IsPrimary: boolean

    True if this is the primary monitor selected by the user in the operating system.

    -
    Name: string

    Human readable name of the screen.

    -
    PhysicalBounds: Rect

    Contains the physical bounds of the screen in terms of X, Y, Width, and Height (before scaling).

    -
    PhysicalWorkArea: Rect

    Contains the physical WorkArea of the screen (before scaling).

    -
    Rotation: number

    The rotation of the screen.

    -
    ScaleFactor: number

    The scale factor of the screen (DPI/96). 1 = standard DPI, 2 = HiDPI (Retina), etc.

    -
    Size: Size

    Contains the width and height of the screen.

    -
    WorkArea: Rect

    Contains the area of the screen that is actually usable (excluding taskbar and other system UI).

    -
    X: number

    The X coordinate of the screen.

    -
    Y: number

    The Y coordinate of the screen.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    ID: string

    Unique identifier for the screen.

    +
    IsPrimary: boolean

    True if this is the primary monitor selected by the user in the operating system.

    +
    Name: string

    Human readable name of the screen.

    +
    PhysicalBounds: Rect

    Contains the physical bounds of the screen in terms of X, Y, Width, and Height (before scaling).

    +
    PhysicalWorkArea: Rect

    Contains the physical WorkArea of the screen (before scaling).

    +
    Rotation: number

    The rotation of the screen.

    +
    ScaleFactor: number

    The scale factor of the screen (DPI/96). 1 = standard DPI, 2 = HiDPI (Retina), etc.

    +
    Size: Size

    Contains the width and height of the screen.

    +
    WorkArea: Rect

    Contains the area of the screen that is actually usable (excluding taskbar and other system UI).

    +
    X: number

    The X coordinate of the screen.

    +
    Y: number

    The Y coordinate of the screen.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Size.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Size.html index 04412497b..4ff328bd8 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Size.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Size.html @@ -1,5 +1,5 @@ -Size | @wailsio/runtime
    interface Size {
        Height: number;
        Width: number;
    }

    Properties

    Height +Size | @wailsio/runtime
    interface Size {
        Height: number;
        Width: number;
    }

    Properties

    Properties

    Height: number

    The height.

    -
    Width: number

    The width.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    Width: number

    The width.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.EnvironmentInfo.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.EnvironmentInfo.html index 781443461..a91f72a06 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.EnvironmentInfo.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.EnvironmentInfo.html @@ -1,11 +1,11 @@ -EnvironmentInfo | @wailsio/runtime

    Interface EnvironmentInfo

    interface EnvironmentInfo {
        Arch: string;
        Debug: boolean;
        OS: string;
        OSInfo: OSInfo;
        PlatformInfo: Object;
    }

    Properties

    Arch +EnvironmentInfo | @wailsio/runtime

    Interface EnvironmentInfo

    interface EnvironmentInfo {
        Arch: string;
        Debug: boolean;
        OS: string;
        OSInfo: OSInfo;
        PlatformInfo: Object;
    }

    Properties

    Arch: string

    The architecture of the system.

    -
    Debug: boolean

    True if the application is running in debug mode, otherwise false.

    -
    OS: string

    The operating system in use.

    -
    OSInfo: OSInfo

    Details of the operating system.

    -
    PlatformInfo: Object

    Additional platform information.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    Debug: boolean

    True if the application is running in debug mode, otherwise false.

    +
    OS: string

    The operating system in use.

    +
    OSInfo: OSInfo

    Details of the operating system.

    +
    PlatformInfo: Object

    Additional platform information.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.OSInfo.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.OSInfo.html index bfc63c548..e4cff39d4 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.OSInfo.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.OSInfo.html @@ -1,9 +1,9 @@ -OSInfo | @wailsio/runtime
    interface OSInfo {
        Branding: string;
        ID: string;
        Name: string;
        Version: string;
    }

    Properties

    Branding +OSInfo | @wailsio/runtime
    interface OSInfo {
        Branding: string;
        ID: string;
        Name: string;
        Version: string;
    }

    Properties

    Properties

    Branding: string

    The branding of the OS.

    -
    ID: string

    The ID of the OS.

    -
    Name: string

    The name of the OS.

    -
    Version: string

    The version of the OS.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    ID: string

    The ID of the OS.

    +
    Name: string

    The name of the OS.

    +
    Version: string

    The version of the OS.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Application.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Application.html index 9fab8f8e7..6ee3e0da3 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Application.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Application.html @@ -1,4 +1,4 @@ -Application | @wailsio/runtime

    Namespace Application

    Index

    Functions

    Hide +Application | @wailsio/runtime

    Namespace Application

    Index

    Functions

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Browser.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Browser.html index e57b18c15..014464ffd 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Browser.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Browser.html @@ -1,2 +1,2 @@ -Browser | @wailsio/runtime

    Namespace Browser

    Index

    Functions

    OpenURL +Browser | @wailsio/runtime

    Namespace Browser

    Index

    Functions

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Call.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Call.html index a7f6bc039..e0b4719c2 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Call.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Call.html @@ -1,4 +1,4 @@ -Call | @wailsio/runtime

    Namespace Call

    Index

    Classes

    RuntimeError +Call | @wailsio/runtime

    Namespace Call

    Index

    Classes

    Interfaces

    Functions

    ByID ByName diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Clipboard.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Clipboard.html index 56e44f9f7..54c4e2dce 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Clipboard.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Clipboard.html @@ -1,3 +1,3 @@ -Clipboard | @wailsio/runtime

    Namespace Clipboard

    Index

    Functions

    SetText +Clipboard | @wailsio/runtime

    Namespace Clipboard

    Index

    Functions

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Create.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Create.html index 50bace8da..3f7199faa 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Create.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Create.html @@ -1,4 +1,4 @@ -Create | @wailsio/runtime

    Namespace Create

    Index

    Functions

    Any +Create | @wailsio/runtime

    Namespace Create

    Index

    Functions

    Any Array ByteSlice Map diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Dialogs.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Dialogs.html index f54953bb9..061f48910 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Dialogs.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Dialogs.html @@ -1,4 +1,4 @@ -Dialogs | @wailsio/runtime

    Namespace Dialogs

    Index

    Interfaces

    Button +Dialogs | @wailsio/runtime

    Namespace Dialogs

    Index

    Interfaces

    Button FileFilter MessageDialogOptions OpenFileDialogOptions diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Events.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Events.html index 0a82c22f4..7dbc52dca 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Events.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Events.html @@ -1,4 +1,4 @@ -Events | @wailsio/runtime

    Namespace Events

    Index

    Classes

    WailsEvent +Events | @wailsio/runtime

    Namespace Events

    Index

    Classes

    Variables

    Functions

    Emit Off diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Flags.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Flags.html index e4c19b365..ba56c1dad 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Flags.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Flags.html @@ -1,2 +1,2 @@ -Flags | @wailsio/runtime

    Namespace Flags

    Index

    Functions

    GetFlag +Flags | @wailsio/runtime

    Namespace Flags

    Index

    Functions

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Screens.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Screens.html index ba24910e5..1a3858967 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Screens.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Screens.html @@ -1,4 +1,4 @@ -Screens | @wailsio/runtime

    Namespace Screens

    Index

    Interfaces

    Rect +Screens | @wailsio/runtime

    Namespace Screens

    Index

    Interfaces

    Functions

    GetAll diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/System.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/System.html index 3bad2e75e..910674610 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/System.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/System.html @@ -1,4 +1,4 @@ -System | @wailsio/runtime

    Namespace System

    Index

    Interfaces

    EnvironmentInfo +System | @wailsio/runtime

    Namespace System

    Index

    Interfaces

    Functions

    Capabilities Environment diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/WML.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/WML.html index a8cafba66..fcb7a7c4d 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/WML.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/WML.html @@ -1,3 +1,3 @@ -WML | @wailsio/runtime

    Namespace WML

    Index

    Functions

    Enable +WML | @wailsio/runtime

    Namespace WML

    Index

    Functions

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Events.Types.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Events.Types.html index 7f0fbd1fd..fc5825db3 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Events.Types.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Events.Types.html @@ -1 +1 @@ -Types | @wailsio/runtime

    Variable TypesConst

    Types: {
        Common: {
            ApplicationOpenedWithFile: string;
            ApplicationStarted: string;
            ThemeChanged: string;
            WindowClosing: string;
            WindowDPIChanged: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowFilesDropped: string;
            WindowFocus: string;
            WindowFullscreen: string;
            WindowHide: string;
            WindowLostFocus: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowRestore: string;
            WindowRuntimeReady: string;
            WindowShow: string;
            WindowUnFullscreen: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowZoom: string;
            WindowZoomIn: string;
            WindowZoomOut: string;
            WindowZoomReset: string;
        };
        Linux: {
            ApplicationStartup: string;
            SystemThemeChanged: string;
            WindowDeleteEvent: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowFocusIn: string;
            WindowFocusOut: string;
            WindowLoadChanged: string;
        };
        Mac: {
            ApplicationDidBecomeActive: string;
            ApplicationDidChangeBackingProperties: string;
            ApplicationDidChangeEffectiveAppearance: string;
            ApplicationDidChangeIcon: string;
            ApplicationDidChangeOcclusionState: string;
            ApplicationDidChangeScreenParameters: string;
            ApplicationDidChangeStatusBarFrame: string;
            ApplicationDidChangeStatusBarOrientation: string;
            ApplicationDidChangeTheme: string;
            ApplicationDidFinishLaunching: string;
            ApplicationDidHide: string;
            ApplicationDidResignActive: string;
            ApplicationDidUnhide: string;
            ApplicationDidUpdate: string;
            ApplicationShouldHandleReopen: string;
            ApplicationWillBecomeActive: string;
            ApplicationWillFinishLaunching: string;
            ApplicationWillHide: string;
            ApplicationWillResignActive: string;
            ApplicationWillTerminate: string;
            ApplicationWillUnhide: string;
            ApplicationWillUpdate: string;
            MenuDidAddItem: string;
            MenuDidBeginTracking: string;
            MenuDidClose: string;
            MenuDidDisplayItem: string;
            MenuDidEndTracking: string;
            MenuDidHighlightItem: string;
            MenuDidOpen: string;
            MenuDidPopUp: string;
            MenuDidRemoveItem: string;
            MenuDidSendAction: string;
            MenuDidSendActionToItem: string;
            MenuDidUpdate: string;
            MenuWillAddItem: string;
            MenuWillBeginTracking: string;
            MenuWillDisplayItem: string;
            MenuWillEndTracking: string;
            MenuWillHighlightItem: string;
            MenuWillOpen: string;
            MenuWillPopUp: string;
            MenuWillRemoveItem: string;
            MenuWillSendAction: string;
            MenuWillSendActionToItem: string;
            MenuWillUpdate: string;
            WebViewDidCommitNavigation: string;
            WebViewDidFinishNavigation: string;
            WebViewDidReceiveServerRedirectForProvisionalNavigation: string;
            WebViewDidStartProvisionalNavigation: string;
            WindowDidBecomeKey: string;
            WindowDidBecomeMain: string;
            WindowDidBeginSheet: string;
            WindowDidChangeAlpha: string;
            WindowDidChangeBackingLocation: string;
            WindowDidChangeBackingProperties: string;
            WindowDidChangeCollectionBehavior: string;
            WindowDidChangeEffectiveAppearance: string;
            WindowDidChangeOcclusionState: string;
            WindowDidChangeOrderingMode: string;
            WindowDidChangeScreen: string;
            WindowDidChangeScreenParameters: string;
            WindowDidChangeScreenProfile: string;
            WindowDidChangeScreenSpace: string;
            WindowDidChangeScreenSpaceProperties: string;
            WindowDidChangeSharingType: string;
            WindowDidChangeSpace: string;
            WindowDidChangeSpaceOrderingMode: string;
            WindowDidChangeTitle: string;
            WindowDidChangeToolbar: string;
            WindowDidDeminiaturize: string;
            WindowDidEndSheet: string;
            WindowDidEnterFullScreen: string;
            WindowDidEnterVersionBrowser: string;
            WindowDidExitFullScreen: string;
            WindowDidExitVersionBrowser: string;
            WindowDidExpose: string;
            WindowDidFocus: string;
            WindowDidMiniaturize: string;
            WindowDidMove: string;
            WindowDidOrderOffScreen: string;
            WindowDidOrderOnScreen: string;
            WindowDidResignKey: string;
            WindowDidResignMain: string;
            WindowDidResize: string;
            WindowDidUpdate: string;
            WindowDidUpdateAlpha: string;
            WindowDidUpdateCollectionBehavior: string;
            WindowDidUpdateCollectionProperties: string;
            WindowDidUpdateShadow: string;
            WindowDidUpdateTitle: string;
            WindowDidUpdateToolbar: string;
            WindowDidZoom: string;
            WindowFileDraggingEntered: string;
            WindowFileDraggingExited: string;
            WindowFileDraggingPerformed: string;
            WindowHide: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowShouldClose: string;
            WindowShow: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowWillBecomeKey: string;
            WindowWillBecomeMain: string;
            WindowWillBeginSheet: string;
            WindowWillChangeOrderingMode: string;
            WindowWillClose: string;
            WindowWillDeminiaturize: string;
            WindowWillEnterFullScreen: string;
            WindowWillEnterVersionBrowser: string;
            WindowWillExitFullScreen: string;
            WindowWillExitVersionBrowser: string;
            WindowWillFocus: string;
            WindowWillMiniaturize: string;
            WindowWillMove: string;
            WindowWillOrderOffScreen: string;
            WindowWillOrderOnScreen: string;
            WindowWillResignMain: string;
            WindowWillResize: string;
            WindowWillUnfocus: string;
            WindowWillUpdate: string;
            WindowWillUpdateAlpha: string;
            WindowWillUpdateCollectionBehavior: string;
            WindowWillUpdateCollectionProperties: string;
            WindowWillUpdateShadow: string;
            WindowWillUpdateTitle: string;
            WindowWillUpdateToolbar: string;
            WindowWillUpdateVisibility: string;
            WindowWillUseStandardFrame: string;
            WindowZoomIn: string;
            WindowZoomOut: string;
            WindowZoomReset: string;
        };
        Windows: {
            APMPowerSettingChange: string;
            APMPowerStatusChange: string;
            APMResumeAutomatic: string;
            APMResumeSuspend: string;
            APMSuspend: string;
            ApplicationStarted: string;
            SystemThemeChanged: string;
            WebViewNavigationCompleted: string;
            WindowActive: string;
            WindowBackgroundErase: string;
            WindowClickActive: string;
            WindowClosing: string;
            WindowDPIChanged: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowDragDrop: string;
            WindowDragEnter: string;
            WindowDragLeave: string;
            WindowDragOver: string;
            WindowEndMove: string;
            WindowEndResize: string;
            WindowFullscreen: string;
            WindowHide: string;
            WindowInactive: string;
            WindowKeyDown: string;
            WindowKeyUp: string;
            WindowKillFocus: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowNonClientHit: string;
            WindowNonClientMouseDown: string;
            WindowNonClientMouseLeave: string;
            WindowNonClientMouseMove: string;
            WindowNonClientMouseUp: string;
            WindowPaint: string;
            WindowRestore: string;
            WindowSetFocus: string;
            WindowShow: string;
            WindowStartMove: string;
            WindowStartResize: string;
            WindowUnFullscreen: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowZOrderChanged: string;
        };
    } = EventTypes

    Type declaration

    • Common: {
          ApplicationOpenedWithFile: string;
          ApplicationStarted: string;
          ThemeChanged: string;
          WindowClosing: string;
          WindowDPIChanged: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowFilesDropped: string;
          WindowFocus: string;
          WindowFullscreen: string;
          WindowHide: string;
          WindowLostFocus: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowRestore: string;
          WindowRuntimeReady: string;
          WindowShow: string;
          WindowUnFullscreen: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowZoom: string;
          WindowZoomIn: string;
          WindowZoomOut: string;
          WindowZoomReset: string;
      }
      • ApplicationOpenedWithFile: string
      • ApplicationStarted: string
      • ThemeChanged: string
      • WindowClosing: string
      • WindowDPIChanged: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowFilesDropped: string
      • WindowFocus: string
      • WindowFullscreen: string
      • WindowHide: string
      • WindowLostFocus: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowRestore: string
      • WindowRuntimeReady: string
      • WindowShow: string
      • WindowUnFullscreen: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowZoom: string
      • WindowZoomIn: string
      • WindowZoomOut: string
      • WindowZoomReset: string
    • Linux: {
          ApplicationStartup: string;
          SystemThemeChanged: string;
          WindowDeleteEvent: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowFocusIn: string;
          WindowFocusOut: string;
          WindowLoadChanged: string;
      }
      • ApplicationStartup: string
      • SystemThemeChanged: string
      • WindowDeleteEvent: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowFocusIn: string
      • WindowFocusOut: string
      • WindowLoadChanged: string
    • Mac: {
          ApplicationDidBecomeActive: string;
          ApplicationDidChangeBackingProperties: string;
          ApplicationDidChangeEffectiveAppearance: string;
          ApplicationDidChangeIcon: string;
          ApplicationDidChangeOcclusionState: string;
          ApplicationDidChangeScreenParameters: string;
          ApplicationDidChangeStatusBarFrame: string;
          ApplicationDidChangeStatusBarOrientation: string;
          ApplicationDidChangeTheme: string;
          ApplicationDidFinishLaunching: string;
          ApplicationDidHide: string;
          ApplicationDidResignActive: string;
          ApplicationDidUnhide: string;
          ApplicationDidUpdate: string;
          ApplicationShouldHandleReopen: string;
          ApplicationWillBecomeActive: string;
          ApplicationWillFinishLaunching: string;
          ApplicationWillHide: string;
          ApplicationWillResignActive: string;
          ApplicationWillTerminate: string;
          ApplicationWillUnhide: string;
          ApplicationWillUpdate: string;
          MenuDidAddItem: string;
          MenuDidBeginTracking: string;
          MenuDidClose: string;
          MenuDidDisplayItem: string;
          MenuDidEndTracking: string;
          MenuDidHighlightItem: string;
          MenuDidOpen: string;
          MenuDidPopUp: string;
          MenuDidRemoveItem: string;
          MenuDidSendAction: string;
          MenuDidSendActionToItem: string;
          MenuDidUpdate: string;
          MenuWillAddItem: string;
          MenuWillBeginTracking: string;
          MenuWillDisplayItem: string;
          MenuWillEndTracking: string;
          MenuWillHighlightItem: string;
          MenuWillOpen: string;
          MenuWillPopUp: string;
          MenuWillRemoveItem: string;
          MenuWillSendAction: string;
          MenuWillSendActionToItem: string;
          MenuWillUpdate: string;
          WebViewDidCommitNavigation: string;
          WebViewDidFinishNavigation: string;
          WebViewDidReceiveServerRedirectForProvisionalNavigation: string;
          WebViewDidStartProvisionalNavigation: string;
          WindowDidBecomeKey: string;
          WindowDidBecomeMain: string;
          WindowDidBeginSheet: string;
          WindowDidChangeAlpha: string;
          WindowDidChangeBackingLocation: string;
          WindowDidChangeBackingProperties: string;
          WindowDidChangeCollectionBehavior: string;
          WindowDidChangeEffectiveAppearance: string;
          WindowDidChangeOcclusionState: string;
          WindowDidChangeOrderingMode: string;
          WindowDidChangeScreen: string;
          WindowDidChangeScreenParameters: string;
          WindowDidChangeScreenProfile: string;
          WindowDidChangeScreenSpace: string;
          WindowDidChangeScreenSpaceProperties: string;
          WindowDidChangeSharingType: string;
          WindowDidChangeSpace: string;
          WindowDidChangeSpaceOrderingMode: string;
          WindowDidChangeTitle: string;
          WindowDidChangeToolbar: string;
          WindowDidDeminiaturize: string;
          WindowDidEndSheet: string;
          WindowDidEnterFullScreen: string;
          WindowDidEnterVersionBrowser: string;
          WindowDidExitFullScreen: string;
          WindowDidExitVersionBrowser: string;
          WindowDidExpose: string;
          WindowDidFocus: string;
          WindowDidMiniaturize: string;
          WindowDidMove: string;
          WindowDidOrderOffScreen: string;
          WindowDidOrderOnScreen: string;
          WindowDidResignKey: string;
          WindowDidResignMain: string;
          WindowDidResize: string;
          WindowDidUpdate: string;
          WindowDidUpdateAlpha: string;
          WindowDidUpdateCollectionBehavior: string;
          WindowDidUpdateCollectionProperties: string;
          WindowDidUpdateShadow: string;
          WindowDidUpdateTitle: string;
          WindowDidUpdateToolbar: string;
          WindowDidZoom: string;
          WindowFileDraggingEntered: string;
          WindowFileDraggingExited: string;
          WindowFileDraggingPerformed: string;
          WindowHide: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowShouldClose: string;
          WindowShow: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowWillBecomeKey: string;
          WindowWillBecomeMain: string;
          WindowWillBeginSheet: string;
          WindowWillChangeOrderingMode: string;
          WindowWillClose: string;
          WindowWillDeminiaturize: string;
          WindowWillEnterFullScreen: string;
          WindowWillEnterVersionBrowser: string;
          WindowWillExitFullScreen: string;
          WindowWillExitVersionBrowser: string;
          WindowWillFocus: string;
          WindowWillMiniaturize: string;
          WindowWillMove: string;
          WindowWillOrderOffScreen: string;
          WindowWillOrderOnScreen: string;
          WindowWillResignMain: string;
          WindowWillResize: string;
          WindowWillUnfocus: string;
          WindowWillUpdate: string;
          WindowWillUpdateAlpha: string;
          WindowWillUpdateCollectionBehavior: string;
          WindowWillUpdateCollectionProperties: string;
          WindowWillUpdateShadow: string;
          WindowWillUpdateTitle: string;
          WindowWillUpdateToolbar: string;
          WindowWillUpdateVisibility: string;
          WindowWillUseStandardFrame: string;
          WindowZoomIn: string;
          WindowZoomOut: string;
          WindowZoomReset: string;
      }
      • ApplicationDidBecomeActive: string
      • ApplicationDidChangeBackingProperties: string
      • ApplicationDidChangeEffectiveAppearance: string
      • ApplicationDidChangeIcon: string
      • ApplicationDidChangeOcclusionState: string
      • ApplicationDidChangeScreenParameters: string
      • ApplicationDidChangeStatusBarFrame: string
      • ApplicationDidChangeStatusBarOrientation: string
      • ApplicationDidChangeTheme: string
      • ApplicationDidFinishLaunching: string
      • ApplicationDidHide: string
      • ApplicationDidResignActive: string
      • ApplicationDidUnhide: string
      • ApplicationDidUpdate: string
      • ApplicationShouldHandleReopen: string
      • ApplicationWillBecomeActive: string
      • ApplicationWillFinishLaunching: string
      • ApplicationWillHide: string
      • ApplicationWillResignActive: string
      • ApplicationWillTerminate: string
      • ApplicationWillUnhide: string
      • ApplicationWillUpdate: string
      • MenuDidAddItem: string
      • MenuDidBeginTracking: string
      • MenuDidClose: string
      • MenuDidDisplayItem: string
      • MenuDidEndTracking: string
      • MenuDidHighlightItem: string
      • MenuDidOpen: string
      • MenuDidPopUp: string
      • MenuDidRemoveItem: string
      • MenuDidSendAction: string
      • MenuDidSendActionToItem: string
      • MenuDidUpdate: string
      • MenuWillAddItem: string
      • MenuWillBeginTracking: string
      • MenuWillDisplayItem: string
      • MenuWillEndTracking: string
      • MenuWillHighlightItem: string
      • MenuWillOpen: string
      • MenuWillPopUp: string
      • MenuWillRemoveItem: string
      • MenuWillSendAction: string
      • MenuWillSendActionToItem: string
      • MenuWillUpdate: string
      • WebViewDidCommitNavigation: string
      • WebViewDidFinishNavigation: string
      • WebViewDidReceiveServerRedirectForProvisionalNavigation: string
      • WebViewDidStartProvisionalNavigation: string
      • WindowDidBecomeKey: string
      • WindowDidBecomeMain: string
      • WindowDidBeginSheet: string
      • WindowDidChangeAlpha: string
      • WindowDidChangeBackingLocation: string
      • WindowDidChangeBackingProperties: string
      • WindowDidChangeCollectionBehavior: string
      • WindowDidChangeEffectiveAppearance: string
      • WindowDidChangeOcclusionState: string
      • WindowDidChangeOrderingMode: string
      • WindowDidChangeScreen: string
      • WindowDidChangeScreenParameters: string
      • WindowDidChangeScreenProfile: string
      • WindowDidChangeScreenSpace: string
      • WindowDidChangeScreenSpaceProperties: string
      • WindowDidChangeSharingType: string
      • WindowDidChangeSpace: string
      • WindowDidChangeSpaceOrderingMode: string
      • WindowDidChangeTitle: string
      • WindowDidChangeToolbar: string
      • WindowDidDeminiaturize: string
      • WindowDidEndSheet: string
      • WindowDidEnterFullScreen: string
      • WindowDidEnterVersionBrowser: string
      • WindowDidExitFullScreen: string
      • WindowDidExitVersionBrowser: string
      • WindowDidExpose: string
      • WindowDidFocus: string
      • WindowDidMiniaturize: string
      • WindowDidMove: string
      • WindowDidOrderOffScreen: string
      • WindowDidOrderOnScreen: string
      • WindowDidResignKey: string
      • WindowDidResignMain: string
      • WindowDidResize: string
      • WindowDidUpdate: string
      • WindowDidUpdateAlpha: string
      • WindowDidUpdateCollectionBehavior: string
      • WindowDidUpdateCollectionProperties: string
      • WindowDidUpdateShadow: string
      • WindowDidUpdateTitle: string
      • WindowDidUpdateToolbar: string
      • WindowDidZoom: string
      • WindowFileDraggingEntered: string
      • WindowFileDraggingExited: string
      • WindowFileDraggingPerformed: string
      • WindowHide: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowShouldClose: string
      • WindowShow: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowWillBecomeKey: string
      • WindowWillBecomeMain: string
      • WindowWillBeginSheet: string
      • WindowWillChangeOrderingMode: string
      • WindowWillClose: string
      • WindowWillDeminiaturize: string
      • WindowWillEnterFullScreen: string
      • WindowWillEnterVersionBrowser: string
      • WindowWillExitFullScreen: string
      • WindowWillExitVersionBrowser: string
      • WindowWillFocus: string
      • WindowWillMiniaturize: string
      • WindowWillMove: string
      • WindowWillOrderOffScreen: string
      • WindowWillOrderOnScreen: string
      • WindowWillResignMain: string
      • WindowWillResize: string
      • WindowWillUnfocus: string
      • WindowWillUpdate: string
      • WindowWillUpdateAlpha: string
      • WindowWillUpdateCollectionBehavior: string
      • WindowWillUpdateCollectionProperties: string
      • WindowWillUpdateShadow: string
      • WindowWillUpdateTitle: string
      • WindowWillUpdateToolbar: string
      • WindowWillUpdateVisibility: string
      • WindowWillUseStandardFrame: string
      • WindowZoomIn: string
      • WindowZoomOut: string
      • WindowZoomReset: string
    • Windows: {
          APMPowerSettingChange: string;
          APMPowerStatusChange: string;
          APMResumeAutomatic: string;
          APMResumeSuspend: string;
          APMSuspend: string;
          ApplicationStarted: string;
          SystemThemeChanged: string;
          WebViewNavigationCompleted: string;
          WindowActive: string;
          WindowBackgroundErase: string;
          WindowClickActive: string;
          WindowClosing: string;
          WindowDPIChanged: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowDragDrop: string;
          WindowDragEnter: string;
          WindowDragLeave: string;
          WindowDragOver: string;
          WindowEndMove: string;
          WindowEndResize: string;
          WindowFullscreen: string;
          WindowHide: string;
          WindowInactive: string;
          WindowKeyDown: string;
          WindowKeyUp: string;
          WindowKillFocus: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowNonClientHit: string;
          WindowNonClientMouseDown: string;
          WindowNonClientMouseLeave: string;
          WindowNonClientMouseMove: string;
          WindowNonClientMouseUp: string;
          WindowPaint: string;
          WindowRestore: string;
          WindowSetFocus: string;
          WindowShow: string;
          WindowStartMove: string;
          WindowStartResize: string;
          WindowUnFullscreen: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowZOrderChanged: string;
      }
      • APMPowerSettingChange: string
      • APMPowerStatusChange: string
      • APMResumeAutomatic: string
      • APMResumeSuspend: string
      • APMSuspend: string
      • ApplicationStarted: string
      • SystemThemeChanged: string
      • WebViewNavigationCompleted: string
      • WindowActive: string
      • WindowBackgroundErase: string
      • WindowClickActive: string
      • WindowClosing: string
      • WindowDPIChanged: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowDragDrop: string
      • WindowDragEnter: string
      • WindowDragLeave: string
      • WindowDragOver: string
      • WindowEndMove: string
      • WindowEndResize: string
      • WindowFullscreen: string
      • WindowHide: string
      • WindowInactive: string
      • WindowKeyDown: string
      • WindowKeyUp: string
      • WindowKillFocus: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowNonClientHit: string
      • WindowNonClientMouseDown: string
      • WindowNonClientMouseLeave: string
      • WindowNonClientMouseMove: string
      • WindowNonClientMouseUp: string
      • WindowPaint: string
      • WindowRestore: string
      • WindowSetFocus: string
      • WindowShow: string
      • WindowStartMove: string
      • WindowStartResize: string
      • WindowUnFullscreen: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowZOrderChanged: string

    Generated using TypeDoc

    \ No newline at end of file +Types | @wailsio/runtime

    Variable TypesConst

    Types: {
        Common: {
            ApplicationOpenedWithFile: string;
            ApplicationStarted: string;
            ThemeChanged: string;
            WindowClosing: string;
            WindowDPIChanged: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowFilesDropped: string;
            WindowFocus: string;
            WindowFullscreen: string;
            WindowHide: string;
            WindowLostFocus: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowRestore: string;
            WindowRuntimeReady: string;
            WindowShow: string;
            WindowUnFullscreen: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowZoom: string;
            WindowZoomIn: string;
            WindowZoomOut: string;
            WindowZoomReset: string;
        };
        Linux: {
            ApplicationStartup: string;
            SystemThemeChanged: string;
            WindowDeleteEvent: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowFocusIn: string;
            WindowFocusOut: string;
            WindowLoadChanged: string;
        };
        Mac: {
            ApplicationDidBecomeActive: string;
            ApplicationDidChangeBackingProperties: string;
            ApplicationDidChangeEffectiveAppearance: string;
            ApplicationDidChangeIcon: string;
            ApplicationDidChangeOcclusionState: string;
            ApplicationDidChangeScreenParameters: string;
            ApplicationDidChangeStatusBarFrame: string;
            ApplicationDidChangeStatusBarOrientation: string;
            ApplicationDidChangeTheme: string;
            ApplicationDidFinishLaunching: string;
            ApplicationDidHide: string;
            ApplicationDidResignActive: string;
            ApplicationDidUnhide: string;
            ApplicationDidUpdate: string;
            ApplicationShouldHandleReopen: string;
            ApplicationWillBecomeActive: string;
            ApplicationWillFinishLaunching: string;
            ApplicationWillHide: string;
            ApplicationWillResignActive: string;
            ApplicationWillTerminate: string;
            ApplicationWillUnhide: string;
            ApplicationWillUpdate: string;
            MenuDidAddItem: string;
            MenuDidBeginTracking: string;
            MenuDidClose: string;
            MenuDidDisplayItem: string;
            MenuDidEndTracking: string;
            MenuDidHighlightItem: string;
            MenuDidOpen: string;
            MenuDidPopUp: string;
            MenuDidRemoveItem: string;
            MenuDidSendAction: string;
            MenuDidSendActionToItem: string;
            MenuDidUpdate: string;
            MenuWillAddItem: string;
            MenuWillBeginTracking: string;
            MenuWillDisplayItem: string;
            MenuWillEndTracking: string;
            MenuWillHighlightItem: string;
            MenuWillOpen: string;
            MenuWillPopUp: string;
            MenuWillRemoveItem: string;
            MenuWillSendAction: string;
            MenuWillSendActionToItem: string;
            MenuWillUpdate: string;
            WebViewDidCommitNavigation: string;
            WebViewDidFinishNavigation: string;
            WebViewDidReceiveServerRedirectForProvisionalNavigation: string;
            WebViewDidStartProvisionalNavigation: string;
            WindowDidBecomeKey: string;
            WindowDidBecomeMain: string;
            WindowDidBeginSheet: string;
            WindowDidChangeAlpha: string;
            WindowDidChangeBackingLocation: string;
            WindowDidChangeBackingProperties: string;
            WindowDidChangeCollectionBehavior: string;
            WindowDidChangeEffectiveAppearance: string;
            WindowDidChangeOcclusionState: string;
            WindowDidChangeOrderingMode: string;
            WindowDidChangeScreen: string;
            WindowDidChangeScreenParameters: string;
            WindowDidChangeScreenProfile: string;
            WindowDidChangeScreenSpace: string;
            WindowDidChangeScreenSpaceProperties: string;
            WindowDidChangeSharingType: string;
            WindowDidChangeSpace: string;
            WindowDidChangeSpaceOrderingMode: string;
            WindowDidChangeTitle: string;
            WindowDidChangeToolbar: string;
            WindowDidDeminiaturize: string;
            WindowDidEndSheet: string;
            WindowDidEnterFullScreen: string;
            WindowDidEnterVersionBrowser: string;
            WindowDidExitFullScreen: string;
            WindowDidExitVersionBrowser: string;
            WindowDidExpose: string;
            WindowDidFocus: string;
            WindowDidMiniaturize: string;
            WindowDidMove: string;
            WindowDidOrderOffScreen: string;
            WindowDidOrderOnScreen: string;
            WindowDidResignKey: string;
            WindowDidResignMain: string;
            WindowDidResize: string;
            WindowDidUpdate: string;
            WindowDidUpdateAlpha: string;
            WindowDidUpdateCollectionBehavior: string;
            WindowDidUpdateCollectionProperties: string;
            WindowDidUpdateShadow: string;
            WindowDidUpdateTitle: string;
            WindowDidUpdateToolbar: string;
            WindowDidZoom: string;
            WindowFileDraggingEntered: string;
            WindowFileDraggingExited: string;
            WindowFileDraggingPerformed: string;
            WindowHide: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowShouldClose: string;
            WindowShow: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowWillBecomeKey: string;
            WindowWillBecomeMain: string;
            WindowWillBeginSheet: string;
            WindowWillChangeOrderingMode: string;
            WindowWillClose: string;
            WindowWillDeminiaturize: string;
            WindowWillEnterFullScreen: string;
            WindowWillEnterVersionBrowser: string;
            WindowWillExitFullScreen: string;
            WindowWillExitVersionBrowser: string;
            WindowWillFocus: string;
            WindowWillMiniaturize: string;
            WindowWillMove: string;
            WindowWillOrderOffScreen: string;
            WindowWillOrderOnScreen: string;
            WindowWillResignMain: string;
            WindowWillResize: string;
            WindowWillUnfocus: string;
            WindowWillUpdate: string;
            WindowWillUpdateAlpha: string;
            WindowWillUpdateCollectionBehavior: string;
            WindowWillUpdateCollectionProperties: string;
            WindowWillUpdateShadow: string;
            WindowWillUpdateTitle: string;
            WindowWillUpdateToolbar: string;
            WindowWillUpdateVisibility: string;
            WindowWillUseStandardFrame: string;
            WindowZoomIn: string;
            WindowZoomOut: string;
            WindowZoomReset: string;
        };
        Windows: {
            APMPowerSettingChange: string;
            APMPowerStatusChange: string;
            APMResumeAutomatic: string;
            APMResumeSuspend: string;
            APMSuspend: string;
            ApplicationStarted: string;
            SystemThemeChanged: string;
            WebViewNavigationCompleted: string;
            WindowActive: string;
            WindowBackgroundErase: string;
            WindowClickActive: string;
            WindowClosing: string;
            WindowDPIChanged: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowDragDrop: string;
            WindowDragEnter: string;
            WindowDragLeave: string;
            WindowDragOver: string;
            WindowEndMove: string;
            WindowEndResize: string;
            WindowFullscreen: string;
            WindowHide: string;
            WindowInactive: string;
            WindowKeyDown: string;
            WindowKeyUp: string;
            WindowKillFocus: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowNonClientHit: string;
            WindowNonClientMouseDown: string;
            WindowNonClientMouseLeave: string;
            WindowNonClientMouseMove: string;
            WindowNonClientMouseUp: string;
            WindowPaint: string;
            WindowRestore: string;
            WindowSetFocus: string;
            WindowShow: string;
            WindowStartMove: string;
            WindowStartResize: string;
            WindowUnFullscreen: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowZOrderChanged: string;
        };
    } = EventTypes

    Type declaration

    • Common: {
          ApplicationOpenedWithFile: string;
          ApplicationStarted: string;
          ThemeChanged: string;
          WindowClosing: string;
          WindowDPIChanged: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowFilesDropped: string;
          WindowFocus: string;
          WindowFullscreen: string;
          WindowHide: string;
          WindowLostFocus: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowRestore: string;
          WindowRuntimeReady: string;
          WindowShow: string;
          WindowUnFullscreen: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowZoom: string;
          WindowZoomIn: string;
          WindowZoomOut: string;
          WindowZoomReset: string;
      }
      • ApplicationOpenedWithFile: string
      • ApplicationStarted: string
      • ThemeChanged: string
      • WindowClosing: string
      • WindowDPIChanged: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowFilesDropped: string
      • WindowFocus: string
      • WindowFullscreen: string
      • WindowHide: string
      • WindowLostFocus: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowRestore: string
      • WindowRuntimeReady: string
      • WindowShow: string
      • WindowUnFullscreen: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowZoom: string
      • WindowZoomIn: string
      • WindowZoomOut: string
      • WindowZoomReset: string
    • Linux: {
          ApplicationStartup: string;
          SystemThemeChanged: string;
          WindowDeleteEvent: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowFocusIn: string;
          WindowFocusOut: string;
          WindowLoadChanged: string;
      }
      • ApplicationStartup: string
      • SystemThemeChanged: string
      • WindowDeleteEvent: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowFocusIn: string
      • WindowFocusOut: string
      • WindowLoadChanged: string
    • Mac: {
          ApplicationDidBecomeActive: string;
          ApplicationDidChangeBackingProperties: string;
          ApplicationDidChangeEffectiveAppearance: string;
          ApplicationDidChangeIcon: string;
          ApplicationDidChangeOcclusionState: string;
          ApplicationDidChangeScreenParameters: string;
          ApplicationDidChangeStatusBarFrame: string;
          ApplicationDidChangeStatusBarOrientation: string;
          ApplicationDidChangeTheme: string;
          ApplicationDidFinishLaunching: string;
          ApplicationDidHide: string;
          ApplicationDidResignActive: string;
          ApplicationDidUnhide: string;
          ApplicationDidUpdate: string;
          ApplicationShouldHandleReopen: string;
          ApplicationWillBecomeActive: string;
          ApplicationWillFinishLaunching: string;
          ApplicationWillHide: string;
          ApplicationWillResignActive: string;
          ApplicationWillTerminate: string;
          ApplicationWillUnhide: string;
          ApplicationWillUpdate: string;
          MenuDidAddItem: string;
          MenuDidBeginTracking: string;
          MenuDidClose: string;
          MenuDidDisplayItem: string;
          MenuDidEndTracking: string;
          MenuDidHighlightItem: string;
          MenuDidOpen: string;
          MenuDidPopUp: string;
          MenuDidRemoveItem: string;
          MenuDidSendAction: string;
          MenuDidSendActionToItem: string;
          MenuDidUpdate: string;
          MenuWillAddItem: string;
          MenuWillBeginTracking: string;
          MenuWillDisplayItem: string;
          MenuWillEndTracking: string;
          MenuWillHighlightItem: string;
          MenuWillOpen: string;
          MenuWillPopUp: string;
          MenuWillRemoveItem: string;
          MenuWillSendAction: string;
          MenuWillSendActionToItem: string;
          MenuWillUpdate: string;
          WebViewDidCommitNavigation: string;
          WebViewDidFinishNavigation: string;
          WebViewDidReceiveServerRedirectForProvisionalNavigation: string;
          WebViewDidStartProvisionalNavigation: string;
          WindowDidBecomeKey: string;
          WindowDidBecomeMain: string;
          WindowDidBeginSheet: string;
          WindowDidChangeAlpha: string;
          WindowDidChangeBackingLocation: string;
          WindowDidChangeBackingProperties: string;
          WindowDidChangeCollectionBehavior: string;
          WindowDidChangeEffectiveAppearance: string;
          WindowDidChangeOcclusionState: string;
          WindowDidChangeOrderingMode: string;
          WindowDidChangeScreen: string;
          WindowDidChangeScreenParameters: string;
          WindowDidChangeScreenProfile: string;
          WindowDidChangeScreenSpace: string;
          WindowDidChangeScreenSpaceProperties: string;
          WindowDidChangeSharingType: string;
          WindowDidChangeSpace: string;
          WindowDidChangeSpaceOrderingMode: string;
          WindowDidChangeTitle: string;
          WindowDidChangeToolbar: string;
          WindowDidDeminiaturize: string;
          WindowDidEndSheet: string;
          WindowDidEnterFullScreen: string;
          WindowDidEnterVersionBrowser: string;
          WindowDidExitFullScreen: string;
          WindowDidExitVersionBrowser: string;
          WindowDidExpose: string;
          WindowDidFocus: string;
          WindowDidMiniaturize: string;
          WindowDidMove: string;
          WindowDidOrderOffScreen: string;
          WindowDidOrderOnScreen: string;
          WindowDidResignKey: string;
          WindowDidResignMain: string;
          WindowDidResize: string;
          WindowDidUpdate: string;
          WindowDidUpdateAlpha: string;
          WindowDidUpdateCollectionBehavior: string;
          WindowDidUpdateCollectionProperties: string;
          WindowDidUpdateShadow: string;
          WindowDidUpdateTitle: string;
          WindowDidUpdateToolbar: string;
          WindowDidZoom: string;
          WindowFileDraggingEntered: string;
          WindowFileDraggingExited: string;
          WindowFileDraggingPerformed: string;
          WindowHide: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowShouldClose: string;
          WindowShow: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowWillBecomeKey: string;
          WindowWillBecomeMain: string;
          WindowWillBeginSheet: string;
          WindowWillChangeOrderingMode: string;
          WindowWillClose: string;
          WindowWillDeminiaturize: string;
          WindowWillEnterFullScreen: string;
          WindowWillEnterVersionBrowser: string;
          WindowWillExitFullScreen: string;
          WindowWillExitVersionBrowser: string;
          WindowWillFocus: string;
          WindowWillMiniaturize: string;
          WindowWillMove: string;
          WindowWillOrderOffScreen: string;
          WindowWillOrderOnScreen: string;
          WindowWillResignMain: string;
          WindowWillResize: string;
          WindowWillUnfocus: string;
          WindowWillUpdate: string;
          WindowWillUpdateAlpha: string;
          WindowWillUpdateCollectionBehavior: string;
          WindowWillUpdateCollectionProperties: string;
          WindowWillUpdateShadow: string;
          WindowWillUpdateTitle: string;
          WindowWillUpdateToolbar: string;
          WindowWillUpdateVisibility: string;
          WindowWillUseStandardFrame: string;
          WindowZoomIn: string;
          WindowZoomOut: string;
          WindowZoomReset: string;
      }
      • ApplicationDidBecomeActive: string
      • ApplicationDidChangeBackingProperties: string
      • ApplicationDidChangeEffectiveAppearance: string
      • ApplicationDidChangeIcon: string
      • ApplicationDidChangeOcclusionState: string
      • ApplicationDidChangeScreenParameters: string
      • ApplicationDidChangeStatusBarFrame: string
      • ApplicationDidChangeStatusBarOrientation: string
      • ApplicationDidChangeTheme: string
      • ApplicationDidFinishLaunching: string
      • ApplicationDidHide: string
      • ApplicationDidResignActive: string
      • ApplicationDidUnhide: string
      • ApplicationDidUpdate: string
      • ApplicationShouldHandleReopen: string
      • ApplicationWillBecomeActive: string
      • ApplicationWillFinishLaunching: string
      • ApplicationWillHide: string
      • ApplicationWillResignActive: string
      • ApplicationWillTerminate: string
      • ApplicationWillUnhide: string
      • ApplicationWillUpdate: string
      • MenuDidAddItem: string
      • MenuDidBeginTracking: string
      • MenuDidClose: string
      • MenuDidDisplayItem: string
      • MenuDidEndTracking: string
      • MenuDidHighlightItem: string
      • MenuDidOpen: string
      • MenuDidPopUp: string
      • MenuDidRemoveItem: string
      • MenuDidSendAction: string
      • MenuDidSendActionToItem: string
      • MenuDidUpdate: string
      • MenuWillAddItem: string
      • MenuWillBeginTracking: string
      • MenuWillDisplayItem: string
      • MenuWillEndTracking: string
      • MenuWillHighlightItem: string
      • MenuWillOpen: string
      • MenuWillPopUp: string
      • MenuWillRemoveItem: string
      • MenuWillSendAction: string
      • MenuWillSendActionToItem: string
      • MenuWillUpdate: string
      • WebViewDidCommitNavigation: string
      • WebViewDidFinishNavigation: string
      • WebViewDidReceiveServerRedirectForProvisionalNavigation: string
      • WebViewDidStartProvisionalNavigation: string
      • WindowDidBecomeKey: string
      • WindowDidBecomeMain: string
      • WindowDidBeginSheet: string
      • WindowDidChangeAlpha: string
      • WindowDidChangeBackingLocation: string
      • WindowDidChangeBackingProperties: string
      • WindowDidChangeCollectionBehavior: string
      • WindowDidChangeEffectiveAppearance: string
      • WindowDidChangeOcclusionState: string
      • WindowDidChangeOrderingMode: string
      • WindowDidChangeScreen: string
      • WindowDidChangeScreenParameters: string
      • WindowDidChangeScreenProfile: string
      • WindowDidChangeScreenSpace: string
      • WindowDidChangeScreenSpaceProperties: string
      • WindowDidChangeSharingType: string
      • WindowDidChangeSpace: string
      • WindowDidChangeSpaceOrderingMode: string
      • WindowDidChangeTitle: string
      • WindowDidChangeToolbar: string
      • WindowDidDeminiaturize: string
      • WindowDidEndSheet: string
      • WindowDidEnterFullScreen: string
      • WindowDidEnterVersionBrowser: string
      • WindowDidExitFullScreen: string
      • WindowDidExitVersionBrowser: string
      • WindowDidExpose: string
      • WindowDidFocus: string
      • WindowDidMiniaturize: string
      • WindowDidMove: string
      • WindowDidOrderOffScreen: string
      • WindowDidOrderOnScreen: string
      • WindowDidResignKey: string
      • WindowDidResignMain: string
      • WindowDidResize: string
      • WindowDidUpdate: string
      • WindowDidUpdateAlpha: string
      • WindowDidUpdateCollectionBehavior: string
      • WindowDidUpdateCollectionProperties: string
      • WindowDidUpdateShadow: string
      • WindowDidUpdateTitle: string
      • WindowDidUpdateToolbar: string
      • WindowDidZoom: string
      • WindowFileDraggingEntered: string
      • WindowFileDraggingExited: string
      • WindowFileDraggingPerformed: string
      • WindowHide: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowShouldClose: string
      • WindowShow: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowWillBecomeKey: string
      • WindowWillBecomeMain: string
      • WindowWillBeginSheet: string
      • WindowWillChangeOrderingMode: string
      • WindowWillClose: string
      • WindowWillDeminiaturize: string
      • WindowWillEnterFullScreen: string
      • WindowWillEnterVersionBrowser: string
      • WindowWillExitFullScreen: string
      • WindowWillExitVersionBrowser: string
      • WindowWillFocus: string
      • WindowWillMiniaturize: string
      • WindowWillMove: string
      • WindowWillOrderOffScreen: string
      • WindowWillOrderOnScreen: string
      • WindowWillResignMain: string
      • WindowWillResize: string
      • WindowWillUnfocus: string
      • WindowWillUpdate: string
      • WindowWillUpdateAlpha: string
      • WindowWillUpdateCollectionBehavior: string
      • WindowWillUpdateCollectionProperties: string
      • WindowWillUpdateShadow: string
      • WindowWillUpdateTitle: string
      • WindowWillUpdateToolbar: string
      • WindowWillUpdateVisibility: string
      • WindowWillUseStandardFrame: string
      • WindowZoomIn: string
      • WindowZoomOut: string
      • WindowZoomReset: string
    • Windows: {
          APMPowerSettingChange: string;
          APMPowerStatusChange: string;
          APMResumeAutomatic: string;
          APMResumeSuspend: string;
          APMSuspend: string;
          ApplicationStarted: string;
          SystemThemeChanged: string;
          WebViewNavigationCompleted: string;
          WindowActive: string;
          WindowBackgroundErase: string;
          WindowClickActive: string;
          WindowClosing: string;
          WindowDPIChanged: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowDragDrop: string;
          WindowDragEnter: string;
          WindowDragLeave: string;
          WindowDragOver: string;
          WindowEndMove: string;
          WindowEndResize: string;
          WindowFullscreen: string;
          WindowHide: string;
          WindowInactive: string;
          WindowKeyDown: string;
          WindowKeyUp: string;
          WindowKillFocus: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowNonClientHit: string;
          WindowNonClientMouseDown: string;
          WindowNonClientMouseLeave: string;
          WindowNonClientMouseMove: string;
          WindowNonClientMouseUp: string;
          WindowPaint: string;
          WindowRestore: string;
          WindowSetFocus: string;
          WindowShow: string;
          WindowStartMove: string;
          WindowStartResize: string;
          WindowUnFullscreen: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowZOrderChanged: string;
      }
      • APMPowerSettingChange: string
      • APMPowerStatusChange: string
      • APMResumeAutomatic: string
      • APMResumeSuspend: string
      • APMSuspend: string
      • ApplicationStarted: string
      • SystemThemeChanged: string
      • WebViewNavigationCompleted: string
      • WindowActive: string
      • WindowBackgroundErase: string
      • WindowClickActive: string
      • WindowClosing: string
      • WindowDPIChanged: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowDragDrop: string
      • WindowDragEnter: string
      • WindowDragLeave: string
      • WindowDragOver: string
      • WindowEndMove: string
      • WindowEndResize: string
      • WindowFullscreen: string
      • WindowHide: string
      • WindowInactive: string
      • WindowKeyDown: string
      • WindowKeyUp: string
      • WindowKillFocus: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowNonClientHit: string
      • WindowNonClientMouseDown: string
      • WindowNonClientMouseLeave: string
      • WindowNonClientMouseMove: string
      • WindowNonClientMouseUp: string
      • WindowPaint: string
      • WindowRestore: string
      • WindowSetFocus: string
      • WindowShow: string
      • WindowStartMove: string
      • WindowStartResize: string
      • WindowUnFullscreen: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowZOrderChanged: string

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Window.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Window.html index bdd80efb8..17062c97c 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Window.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Window.html @@ -1,2 +1,2 @@ Window | @wailsio/runtime

    Variable WindowConst

    Window: Window = ...

    The window within which the script is running.

    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/package.json b/v3/internal/runtime/desktop/@wailsio/runtime/package.json index 7412db923..ae1fd6853 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/package.json +++ b/v3/internal/runtime/desktop/@wailsio/runtime/package.json @@ -1,7 +1,7 @@ { "name": "@wailsio/runtime", "type": "module", - "version": "3.0.0-alpha.57", + "version": "3.0.0-alpha.58", "description": "Wails Runtime", "types": "types/index.d.ts", "exports": { From 0a0592a52ed7423611168c6236224280027c9f41 Mon Sep 17 00:00:00 2001 From: Fabio Massaioli Date: Thu, 27 Feb 2025 11:51:46 +0100 Subject: [PATCH 097/374] Fix npm ci --- .github/workflows/publish-npm.yml | 11 +++++----- v3/tasks/events/generate.go | 35 ------------------------------- 2 files changed, 5 insertions(+), 41 deletions(-) diff --git a/.github/workflows/publish-npm.yml b/.github/workflows/publish-npm.yml index 0db261abe..c93d3f92e 100644 --- a/.github/workflows/publish-npm.yml +++ b/.github/workflows/publish-npm.yml @@ -41,18 +41,17 @@ jobs: v3/internal/runtime/desktop/@wailsio/runtime/types/*.d.ts v3/internal/runtime/desktop/@wailsio/runtime/docs/**/*.* - - name: test action + - name: Bump version if: steps.verify-changed-files.outputs.files_changed == 'true' - id: get-version - uses: beaconbrigade/package-json-version@v0.3.2 - with: - path: v3/internal/runtime/desktop/@wailsio/runtime + id: bump-version + working-directory: v3/internal/runtime/desktop/@wailsio/runtime + run: echo "version=$(npm --no-git-tag-version --force version prerelease)" >> "$GITHUB_OUTPUT" - name: Commit changes if: steps.verify-changed-files.outputs.files_changed == 'true' run: | git add . - git commit -m "[skip ci] Publish @wailsio/runtime ${{ steps.get-version.outputs.version }}" + git commit -m "[skip ci] Publish @wailsio/runtime ${{ steps.bump-version.outputs.version }}" git push - uses: JS-DevTools/npm-publish@v3 diff --git a/v3/tasks/events/generate.go b/v3/tasks/events/generate.go index e643db182..f9ef3119f 100644 --- a/v3/tasks/events/generate.go +++ b/v3/tasks/events/generate.go @@ -2,9 +2,6 @@ package main import ( "bytes" - "github.com/Masterminds/semver/v3" - "github.com/tidwall/gjson" - "github.com/tidwall/sjson" "os" "strconv" "strings" @@ -402,36 +399,4 @@ func main() { if err != nil { panic(err) } - - // Load the runtime package.json - packageJsonFilename := "../../internal/runtime/desktop/@wailsio/runtime/package.json" - packageJSON, err := os.ReadFile(packageJsonFilename) - if err != nil { - panic(err) - } - version := gjson.Get(string(packageJSON), "version").String() - // Parse and increment version - v := semver.MustParse(version) - prerelease := v.Prerelease() - // Split the prerelease by the "." and increment the last part by 1 - parts := strings.Split(prerelease, ".") - prereleaseDigits, err := strconv.Atoi(parts[len(parts)-1]) - if err != nil { - panic(err) - } - prereleaseNumber := strconv.Itoa(prereleaseDigits + 1) - parts[len(parts)-1] = prereleaseNumber - prerelease = strings.Join(parts, ".") - newVersion, err := v.SetPrerelease(prerelease) - if err != nil { - panic(err) - } - - // Set new version using sjson - newJSON, err := sjson.Set(string(packageJSON), "version", newVersion.String()) - if err != nil { - panic(err) - } - - err = os.WriteFile(packageJsonFilename, []byte(newJSON), 0644) } From 30f0ec4e9c58be1c66ca737d2db5d2555cb33d96 Mon Sep 17 00:00:00 2001 From: Fabio Massaioli Date: Thu, 27 Feb 2025 12:05:54 +0100 Subject: [PATCH 098/374] Go mod tidy --- v3/tasks/events/go.mod | 13 +------------ v3/tasks/events/go.sum | 11 ----------- 2 files changed, 1 insertion(+), 23 deletions(-) delete mode 100644 v3/tasks/events/go.sum diff --git a/v3/tasks/events/go.mod b/v3/tasks/events/go.mod index 8b0f46531..55ed969ca 100644 --- a/v3/tasks/events/go.mod +++ b/v3/tasks/events/go.mod @@ -1,14 +1,3 @@ module events -go 1.22 - -require ( - github.com/Masterminds/semver/v3 v3.3.0 - github.com/tidwall/gjson v1.18.0 - github.com/tidwall/sjson v1.2.5 -) - -require ( - github.com/tidwall/match v1.1.1 // indirect - github.com/tidwall/pretty v1.2.0 // indirect -) +go 1.24 diff --git a/v3/tasks/events/go.sum b/v3/tasks/events/go.sum deleted file mode 100644 index 2379260c6..000000000 --- a/v3/tasks/events/go.sum +++ /dev/null @@ -1,11 +0,0 @@ -github.com/Masterminds/semver/v3 v3.3.0 h1:B8LGeaivUe71a5qox1ICM/JLl0NqZSW5CHyL+hmvYS0= -github.com/Masterminds/semver/v3 v3.3.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= -github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= -github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= -github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= -github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= -github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= -github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= From dee22c18ee999bc1244ef6f89f6f7143626a5af2 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Fri, 28 Feb 2025 06:07:09 +1100 Subject: [PATCH 099/374] [ci] update PR Checks conditions --- .github/workflows/pr.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index c70050276..9e981bf1d 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -2,8 +2,12 @@ name: PR Checks on: pull_request: + branches: + - master pull_request_review: types: [submitted] + branches: + - master jobs: check_docs: From c96b7c693c9f8aa169861194e848d57a19e019e8 Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Thu, 27 Feb 2025 19:07:58 +0000 Subject: [PATCH 100/374] [skip ci] Publish @wailsio/runtime 3.0.0-alpha.59 --- .../docs/classes/Call.RuntimeError.html | 4 +-- .../docs/classes/Events.WailsEvent.html | 4 +-- .../docs/functions/Application.Hide.html | 2 +- .../docs/functions/Application.Quit.html | 2 +- .../docs/functions/Application.Show.html | 2 +- .../docs/functions/Browser.OpenURL.html | 2 +- .../runtime/docs/functions/Call.ByID.html | 2 +- .../runtime/docs/functions/Call.ByName.html | 2 +- .../runtime/docs/functions/Call.Call.html | 2 +- .../docs/functions/Clipboard.SetText.html | 2 +- .../docs/functions/Clipboard.Text.html | 2 +- .../runtime/docs/functions/Create.Any.html | 2 +- .../runtime/docs/functions/Create.Array.html | 2 +- .../docs/functions/Create.ByteSlice.html | 2 +- .../runtime/docs/functions/Create.Map.html | 2 +- .../docs/functions/Create.Nullable.html | 2 +- .../runtime/docs/functions/Create.Struct.html | 2 +- .../runtime/docs/functions/Dialogs.Error.html | 2 +- .../runtime/docs/functions/Dialogs.Info.html | 2 +- .../docs/functions/Dialogs.OpenFile.html | 2 +- .../docs/functions/Dialogs.Question.html | 2 +- .../docs/functions/Dialogs.SaveFile.html | 2 +- .../docs/functions/Dialogs.Warning.html | 2 +- .../runtime/docs/functions/Events.Emit.html | 2 +- .../runtime/docs/functions/Events.Off.html | 2 +- .../runtime/docs/functions/Events.OffAll.html | 2 +- .../runtime/docs/functions/Events.On.html | 2 +- .../docs/functions/Events.OnMultiple.html | 2 +- .../runtime/docs/functions/Events.Once.html | 2 +- .../runtime/docs/functions/Events.setup.html | 2 +- .../runtime/docs/functions/Flags.GetFlag.html | 2 +- .../docs/functions/Screens.GetAll.html | 2 +- .../docs/functions/Screens.GetCurrent.html | 2 +- .../docs/functions/Screens.GetPrimary.html | 2 +- .../docs/functions/System.Capabilities.html | 2 +- .../docs/functions/System.Environment.html | 2 +- .../docs/functions/System.IsAMD64.html | 2 +- .../runtime/docs/functions/System.IsARM.html | 2 +- .../docs/functions/System.IsARM64.html | 2 +- .../docs/functions/System.IsDarkMode.html | 2 +- .../docs/functions/System.IsDebug.html | 2 +- .../docs/functions/System.IsLinux.html | 2 +- .../runtime/docs/functions/System.IsMac.html | 2 +- .../docs/functions/System.IsWindows.html | 2 +- .../runtime/docs/functions/System.invoke.html | 2 +- .../runtime/docs/functions/WML.Enable.html | 2 +- .../runtime/docs/functions/WML.Reload.html | 2 +- .../@wailsio/runtime/docs/functions/init.html | 2 +- .../docs/interfaces/Call.CallOptions.html | 8 ++--- .../docs/interfaces/Dialogs.Button.html | 8 ++--- .../docs/interfaces/Dialogs.FileFilter.html | 6 ++-- .../Dialogs.MessageDialogOptions.html | 10 +++--- .../Dialogs.OpenFileDialogOptions.html | 34 +++++++++--------- .../Dialogs.SaveFileDialogOptions.html | 36 +++++++++---------- .../runtime/docs/interfaces/Screens.Rect.html | 10 +++--- .../docs/interfaces/Screens.Screen.html | 26 +++++++------- .../runtime/docs/interfaces/Screens.Size.html | 6 ++-- .../interfaces/System.EnvironmentInfo.html | 12 +++---- .../docs/interfaces/System.OSInfo.html | 10 +++--- .../runtime/docs/modules/Application.html | 2 +- .../runtime/docs/modules/Browser.html | 2 +- .../@wailsio/runtime/docs/modules/Call.html | 2 +- .../runtime/docs/modules/Clipboard.html | 2 +- .../@wailsio/runtime/docs/modules/Create.html | 2 +- .../runtime/docs/modules/Dialogs.html | 2 +- .../@wailsio/runtime/docs/modules/Events.html | 2 +- .../@wailsio/runtime/docs/modules/Flags.html | 2 +- .../runtime/docs/modules/Screens.html | 2 +- .../@wailsio/runtime/docs/modules/System.html | 2 +- .../@wailsio/runtime/docs/modules/WML.html | 2 +- .../runtime/docs/variables/Events.Types.html | 2 +- .../runtime/docs/variables/Window.html | 2 +- .../desktop/@wailsio/runtime/package.json | 2 +- 73 files changed, 147 insertions(+), 147 deletions(-) diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Call.RuntimeError.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Call.RuntimeError.html index 8be63de1a..5c924c060 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Call.RuntimeError.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Call.RuntimeError.html @@ -1,6 +1,6 @@ RuntimeError | @wailsio/runtime

    Exception class that will be thrown in case the bound method returns an error. The value of the RuntimeError#name property is "RuntimeError".

    -

    Hierarchy

    • Error
      • RuntimeError

    Constructors

    Hierarchy

    • Error
      • RuntimeError

    Constructors

    Properties

    cause? message name @@ -8,4 +8,4 @@ The value of the

    Constructors

    • Constructs a new RuntimeError instance.

      Parameters

      • message: string

        The error message.

      • Rest ...args: any[]

        Optional arguments for the Error constructor.

        -

      Returns RuntimeError

    Properties

    cause?: unknown
    message: string
    name: string
    stack?: string

    Generated using TypeDoc

    \ No newline at end of file +

    Returns RuntimeError

    Properties

    cause?: unknown
    message: string
    name: string
    stack?: string

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Events.WailsEvent.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Events.WailsEvent.html index 2fdcef19a..24e9770fb 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Events.WailsEvent.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Events.WailsEvent.html @@ -1,4 +1,4 @@ -WailsEvent | @wailsio/runtime

    Constructors

    constructor +WailsEvent | @wailsio/runtime

    Constructors

    Properties

    Constructors

    Properties

    data: any
    name: any

    Generated using TypeDoc

    \ No newline at end of file +

    Constructors

    Properties

    data: any
    name: any

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Hide.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Hide.html index 82498f495..637c9c990 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Hide.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Hide.html @@ -1,2 +1,2 @@ Hide | @wailsio/runtime
    • Hides a certain method by calling the HideMethod function.

      -

      Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file +

    Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Quit.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Quit.html index 5276f9cfd..b34c5ad5d 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Quit.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Quit.html @@ -1,2 +1,2 @@ Quit | @wailsio/runtime
    • Calls the QuitMethod to terminate the program.

      -

      Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file +

    Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Show.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Show.html index 8efd8b2af..98d8d11ac 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Show.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Show.html @@ -1,2 +1,2 @@ Show | @wailsio/runtime
    • Calls the ShowMethod and returns the result.

      -

      Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file +

    Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Browser.OpenURL.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Browser.OpenURL.html index e58e7ea97..734238239 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Browser.OpenURL.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Browser.OpenURL.html @@ -1,3 +1,3 @@ OpenURL | @wailsio/runtime
    • Open a browser window to the given URL

      Parameters

      • url: string

        The URL to open

        -

      Returns Promise<string>

    Generated using TypeDoc

    \ No newline at end of file +

    Returns Promise<string>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByID.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByID.html index c63a69932..8de8bebe0 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByID.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByID.html @@ -5,4 +5,4 @@ See Call for details.

    Returns Promise<any>

    • The result of the method call.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByName.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByName.html index af5e54d94..4e9570a4f 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByName.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByName.html @@ -3,4 +3,4 @@ See Call for details.

    Parameters

    • methodName: string

      The name of the method in the format 'package.struct.method'.

    • Rest ...args: any[]

      The arguments to pass to the method.

    Returns Promise<any>

    The result of the method call.

    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.Call.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.Call.html index 9c808a90b..935fa7232 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.Call.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.Call.html @@ -8,4 +8,4 @@ by the application- or service-level error marshaling functions.

    Returns Promise<any>

    • The result of the call.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.SetText.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.SetText.html index ee2b91c04..2ce10c908 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.SetText.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.SetText.html @@ -3,4 +3,4 @@

    Returns Promise<any>

    • A Promise that resolves when the operation is successful.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.Text.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.Text.html index d7903ce64..1061c0c19 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.Text.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.Text.html @@ -1,3 +1,3 @@ Text | @wailsio/runtime
    • Get the Clipboard text

      Returns Promise<string>

      A promise that resolves with the text from the Clipboard.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Any.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Any.html index 53272faca..1d32fc792 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Any.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Any.html @@ -1,2 +1,2 @@ Any | @wailsio/runtime
    • Any is a dummy creation function for simple or unknown types.

      -

      Type Parameters

      • T

      Parameters

      • source: any

      Returns T

    Generated using TypeDoc

    \ No newline at end of file +

    Type Parameters

    • T

    Parameters

    • source: any

    Returns T

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Array.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Array.html index 820261045..11bc26fb3 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Array.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Array.html @@ -1,4 +1,4 @@ Array | @wailsio/runtime
    • Array takes a creation function for an arbitrary type and returns an in-place creation function for an array whose elements are of that type.

      -

      Type Parameters

      • T

      Parameters

      • element: ((source) => T)
          • (source): T
          • Parameters

            • source: any

            Returns T

      Returns ((source) => T[])

        • (source): T[]
        • Parameters

          • source: any

          Returns T[]

    Generated using TypeDoc

    \ No newline at end of file +

    Type Parameters

    • T

    Parameters

    • element: ((source) => T)
        • (source): T
        • Parameters

          • source: any

          Returns T

    Returns ((source) => T[])

      • (source): T[]
      • Parameters

        • source: any

        Returns T[]

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.ByteSlice.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.ByteSlice.html index 29fa872b9..48b2a9f32 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.ByteSlice.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.ByteSlice.html @@ -1,3 +1,3 @@ ByteSlice | @wailsio/runtime
    • ByteSlice is a creation function that replaces null strings with empty strings.

      -

      Parameters

      • source: any

      Returns string

    Generated using TypeDoc

    \ No newline at end of file +

    Parameters

    • source: any

    Returns string

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Map.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Map.html index f952af5eb..f8fbe1aaf 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Map.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Map.html @@ -1,4 +1,4 @@ Map | @wailsio/runtime
    • Map takes creation functions for two arbitrary types and returns an in-place creation function for an object whose keys and values are of those types.

      -

      Type Parameters

      • K
      • V

      Parameters

      • key: ((source) => K)
          • (source): K
          • Parameters

            • source: any

            Returns K

      • value: ((source) => V)
          • (source): V
          • Parameters

            • source: any

            Returns V

      Returns ((source) => {
          [_: K]: V;
      })

        • (source): {
              [_: K]: V;
          }
        • Parameters

          • source: any

          Returns {
              [_: K]: V;
          }

    Generated using TypeDoc

    \ No newline at end of file +

    Type Parameters

    • K
    • V

    Parameters

    • key: ((source) => K)
        • (source): K
        • Parameters

          • source: any

          Returns K

    • value: ((source) => V)
        • (source): V
        • Parameters

          • source: any

          Returns V

    Returns ((source) => {
        [_: K]: V;
    })

      • (source): {
            [_: K]: V;
        }
      • Parameters

        • source: any

        Returns {
            [_: K]: V;
        }

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Nullable.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Nullable.html index 4bc09bc89..94b8fde19 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Nullable.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Nullable.html @@ -1,3 +1,3 @@ Nullable | @wailsio/runtime
    • Nullable takes a creation function for an arbitrary type and returns a creation function for a nullable value of that type.

      -

      Type Parameters

      • T

      Parameters

      • element: ((source) => T)
          • (source): T
          • Parameters

            • source: any

            Returns T

      Returns ((source) => null | T)

        • (source): null | T
        • Parameters

          • source: any

          Returns null | T

    Generated using TypeDoc

    \ No newline at end of file +

    Type Parameters

    • T

    Parameters

    • element: ((source) => T)
        • (source): T
        • Parameters

          • source: any

          Returns T

    Returns ((source) => null | T)

      • (source): null | T
      • Parameters

        • source: any

        Returns null | T

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Struct.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Struct.html index bfcce5c1f..3d567c03f 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Struct.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Struct.html @@ -1,3 +1,3 @@ Struct | @wailsio/runtime
    • Struct takes an object mapping field names to creation functions and returns an in-place creation function for a struct.

      -

      Type Parameters

      • T extends {
            [_: string]: ((source) => any);
        }
      • U extends {
            [Key in string | number | symbol]?: ReturnType<T[Key]>
        }

      Parameters

      • createField: T

      Returns ((source) => U)

        • (source): U
        • Parameters

          • source: any

          Returns U

    Generated using TypeDoc

    \ No newline at end of file +

    Type Parameters

    • T extends {
          [_: string]: ((source) => any);
      }
    • U extends {
          [Key in string | number | symbol]?: ReturnType<T[Key]>
      }

    Parameters

    • createField: T

    Returns ((source) => U)

      • (source): U
      • Parameters

        • source: any

        Returns U

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Error.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Error.html index cc3166f22..4ae894e02 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Error.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Error.html @@ -2,4 +2,4 @@

    Returns Promise<string>

    • The label of the button pressed
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Info.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Info.html index d7cc6a411..02621c41d 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Info.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Info.html @@ -2,4 +2,4 @@

    Returns Promise<string>

    • The label of the button pressed
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.OpenFile.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.OpenFile.html index 81cd49417..dab59add4 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.OpenFile.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.OpenFile.html @@ -1,3 +1,3 @@ OpenFile | @wailsio/runtime
    • Parameters

      Returns Promise<string | string[]>

      Returns selected file or list of files. Returns blank string if no file is selected.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Question.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Question.html index a4f05279a..29f618f14 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Question.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Question.html @@ -2,4 +2,4 @@

    Returns Promise<string>

    • The label of the button pressed
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.SaveFile.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.SaveFile.html index 7187f1f8f..2d183b929 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.SaveFile.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.SaveFile.html @@ -1,3 +1,3 @@ SaveFile | @wailsio/runtime
    • Parameters

      Returns Promise<string>

      Returns the selected file. Returns blank string if no file is selected.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Warning.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Warning.html index 050e75212..b50818794 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Warning.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Warning.html @@ -2,4 +2,4 @@

    Returns Promise<string>

    • The label of the button pressed
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Emit.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Emit.html index 924e0dfe1..aa7dca39b 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Emit.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Emit.html @@ -3,4 +3,4 @@

    Returns any

    • The result of the emitted event.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Off.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Off.html index 986146db9..dc879a52b 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Off.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Off.html @@ -1,4 +1,4 @@ Off | @wailsio/runtime
    • Removes event listeners for the specified event names.

      Parameters

      • eventName: string

        The name of the event to remove listeners for.

      • Rest ...additionalEventNames: string[]

        Additional event names to remove listeners for.

        -

      Returns undefined

    Generated using TypeDoc

    \ No newline at end of file +

    Returns undefined

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OffAll.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OffAll.html index b381ff2d7..50d9a392f 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OffAll.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OffAll.html @@ -1,3 +1,3 @@ OffAll | @wailsio/runtime
    • Removes all event listeners.

      Returns void

      Function

      OffAll

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.On.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.On.html index 7662e117a..38a162f3a 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.On.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.On.html @@ -4,4 +4,4 @@

    Returns Function

    • A function that, when called, will unregister the callback from the event.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OnMultiple.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OnMultiple.html index 129c7e471..6a1b371dd 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OnMultiple.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OnMultiple.html @@ -5,4 +5,4 @@

    Returns Function

    • A function that, when called, will unregister the callback from the event.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Once.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Once.html index 1bc9c2d50..b8e48ba9b 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Once.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Once.html @@ -4,4 +4,4 @@

    Returns Function

    • A function that, when called, will unregister the callback from the event.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.setup.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.setup.html index eab83280f..e07257746 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.setup.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.setup.html @@ -1 +1 @@ -setup | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file +setup | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Flags.GetFlag.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Flags.GetFlag.html index 630dd4441..3a8a4785c 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Flags.GetFlag.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Flags.GetFlag.html @@ -3,4 +3,4 @@

    Returns any

    • The value associated with the specified key.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetAll.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetAll.html index 91e47b8b2..a76031416 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetAll.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetAll.html @@ -1,3 +1,3 @@ GetAll | @wailsio/runtime
    • Gets all screens.

      Returns Promise<Screen[]>

      A promise that resolves to an array of Screen objects.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetCurrent.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetCurrent.html index 0410cd72d..47bd9b743 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetCurrent.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetCurrent.html @@ -1,3 +1,3 @@ GetCurrent | @wailsio/runtime
    • Gets the current active screen.

      Returns Promise<Screen>

      A promise that resolves with the current active screen.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetPrimary.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetPrimary.html index 9b302e99d..b2ff1bdd6 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetPrimary.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetPrimary.html @@ -1,3 +1,3 @@ GetPrimary | @wailsio/runtime
    • Gets the primary screen.

      Returns Promise<Screen>

      A promise that resolves to the primary screen.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Capabilities.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Capabilities.html index 88f7ae6d6..a742087e9 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Capabilities.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Capabilities.html @@ -1,4 +1,4 @@ Capabilities | @wailsio/runtime
    • Fetches the capabilities of the application from the server.

      Returns Promise<Object>

      A promise that resolves to an object containing the capabilities.

      Async

      Function

      Capabilities

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Environment.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Environment.html index d3ce717ba..38c1fc9c7 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Environment.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Environment.html @@ -2,4 +2,4 @@
  • A promise that resolves to an object containing OS and system architecture.
  • Function

    Retrieves environment details.

    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsAMD64.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsAMD64.html index dc0220ca9..95d91956b 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsAMD64.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsAMD64.html @@ -1,3 +1,3 @@ IsAMD64 | @wailsio/runtime
    • Checks if the current environment architecture is AMD64.

      Returns boolean

      True if the current environment architecture is AMD64, false otherwise.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM.html index 60a78774f..148cf555a 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM.html @@ -1,3 +1,3 @@ IsARM | @wailsio/runtime
    • Checks if the current architecture is ARM.

      Returns boolean

      True if the current architecture is ARM, false otherwise.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM64.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM64.html index fd78272cf..cfa4aaaa0 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM64.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM64.html @@ -2,4 +2,4 @@

    Returns boolean

    • Returns true if the environment is ARM64 architecture, otherwise returns false.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDarkMode.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDarkMode.html index a0fb265a1..f0119dfc6 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDarkMode.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDarkMode.html @@ -2,4 +2,4 @@
  • A promise that resolves to a boolean value indicating if the system is in dark mode.
  • Function

    Retrieves the system dark mode status.

    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDebug.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDebug.html index 484a00352..7b8101b08 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDebug.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDebug.html @@ -1 +1 @@ -IsDebug | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file +IsDebug | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsLinux.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsLinux.html index 4be7ddfdb..85db1e171 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsLinux.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsLinux.html @@ -1,3 +1,3 @@ IsLinux | @wailsio/runtime
    • Checks if the current operating system is Linux.

      Returns boolean

      Returns true if the current operating system is Linux, false otherwise.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsMac.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsMac.html index 7432977d2..47c550634 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsMac.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsMac.html @@ -1,3 +1,3 @@ IsMac | @wailsio/runtime
    • Checks if the current environment is a macOS operating system.

      Returns boolean

      True if the environment is macOS, false otherwise.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsWindows.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsWindows.html index d308687a2..d0c715b5d 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsWindows.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsWindows.html @@ -1,3 +1,3 @@ IsWindows | @wailsio/runtime
    • Checks if the current operating system is Windows.

      Returns boolean

      True if the operating system is Windows, otherwise false.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.invoke.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.invoke.html index ed9b05b3c..5868f5492 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.invoke.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.invoke.html @@ -1 +1 @@ -invoke | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file +invoke | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Enable.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Enable.html index 96607e20e..914650375 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Enable.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Enable.html @@ -1,2 +1,2 @@ Enable | @wailsio/runtime
    • Schedules an automatic reload of WML to be performed as soon as the document is fully loaded.

      -

      Returns void

    Generated using TypeDoc

    \ No newline at end of file +

    Returns void

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Reload.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Reload.html index dda46c9bd..b63b6ec82 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Reload.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Reload.html @@ -1,2 +1,2 @@ Reload | @wailsio/runtime
    • Reloads the WML page by adding necessary event listeners and browser listeners.

      -

      Returns void

    Generated using TypeDoc

    \ No newline at end of file +

    Returns void

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/init.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/init.html index f68c18b13..66dee77b5 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/init.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/init.html @@ -1 +1 @@ -init | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file +init | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Call.CallOptions.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Call.CallOptions.html index 77b0c27a5..aeea66598 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Call.CallOptions.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Call.CallOptions.html @@ -1,7 +1,7 @@ -CallOptions | @wailsio/runtime

    Interface CallOptions

    interface CallOptions {
        args: any[];
        methodID: undefined | number;
        methodName: undefined | string;
    }

    Properties

    args +CallOptions | @wailsio/runtime

    Interface CallOptions

    interface CallOptions {
        args: any[];
        methodID: undefined | number;
        methodName: undefined | string;
    }

    Properties

    args: any[]

    Arguments to be passed into the bound method.

    -
    methodID: undefined | number

    The numeric ID of the bound method to call.

    -
    methodName: undefined | string

    The fully qualified name of the bound method to call.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    methodID: undefined | number

    The numeric ID of the bound method to call.

    +
    methodName: undefined | string

    The fully qualified name of the bound method to call.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.Button.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.Button.html index 6ab3eb519..f188f2662 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.Button.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.Button.html @@ -1,7 +1,7 @@ -Button | @wailsio/runtime
    interface Button {
        IsCancel: undefined | boolean;
        IsDefault: undefined | boolean;
        Label: undefined | string;
    }

    Properties

    IsCancel +Button | @wailsio/runtime
    interface Button {
        IsCancel: undefined | boolean;
        IsDefault: undefined | boolean;
        Label: undefined | string;
    }

    Properties

    IsCancel: undefined | boolean

    True if the button should cancel an operation when clicked.

    -
    IsDefault: undefined | boolean

    True if the button should be the default action when the user presses enter.

    -
    Label: undefined | string

    Text that appears within the button.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    IsDefault: undefined | boolean

    True if the button should be the default action when the user presses enter.

    +
    Label: undefined | string

    Text that appears within the button.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.FileFilter.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.FileFilter.html index dc090f0db..dfb026277 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.FileFilter.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.FileFilter.html @@ -1,5 +1,5 @@ -FileFilter | @wailsio/runtime
    interface FileFilter {
        DisplayName: undefined | string;
        Pattern: undefined | string;
    }

    Properties

    DisplayName +FileFilter | @wailsio/runtime
    interface FileFilter {
        DisplayName: undefined | string;
        Pattern: undefined | string;
    }

    Properties

    Properties

    DisplayName: undefined | string

    Display name for the filter, it could be "Text Files", "Images" etc.

    -
    Pattern: undefined | string

    Pattern to match for the filter, e.g. ".txt;.md" for text markdown files.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    Pattern: undefined | string

    Pattern to match for the filter, e.g. ".txt;.md" for text markdown files.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.MessageDialogOptions.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.MessageDialogOptions.html index 394f96bd7..ff6b112f6 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.MessageDialogOptions.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.MessageDialogOptions.html @@ -1,9 +1,9 @@ -MessageDialogOptions | @wailsio/runtime

    Interface MessageDialogOptions

    interface MessageDialogOptions {
        Buttons: undefined | Button[];
        Detached: undefined | boolean;
        Message: undefined | string;
        Title: undefined | string;
    }

    Properties

    Buttons +MessageDialogOptions | @wailsio/runtime

    Interface MessageDialogOptions

    interface MessageDialogOptions {
        Buttons: undefined | Button[];
        Detached: undefined | boolean;
        Message: undefined | string;
        Title: undefined | string;
    }

    Properties

    Buttons: undefined | Button[]

    Array of button options to show in the dialog.

    -
    Detached: undefined | boolean

    True if the dialog should appear detached from the main window (if applicable).

    -
    Message: undefined | string

    The main message to show in the dialog.

    -
    Title: undefined | string

    The title of the dialog window.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    Detached: undefined | boolean

    True if the dialog should appear detached from the main window (if applicable).

    +
    Message: undefined | string

    The main message to show in the dialog.

    +
    Title: undefined | string

    The title of the dialog window.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.OpenFileDialogOptions.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.OpenFileDialogOptions.html index f9f370621..ec078e5d0 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.OpenFileDialogOptions.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.OpenFileDialogOptions.html @@ -1,4 +1,4 @@ -OpenFileDialogOptions | @wailsio/runtime

    Interface OpenFileDialogOptions

    interface OpenFileDialogOptions {
        AllowsMultipleSelection: undefined | boolean;
        AllowsOtherFiletypes: undefined | boolean;
        ButtonText: undefined | string;
        CanChooseDirectories: undefined | boolean;
        CanChooseFiles: undefined | boolean;
        CanCreateDirectories: undefined | boolean;
        CanSelectHiddenExtension: undefined | boolean;
        Detached: undefined | boolean;
        Directory: undefined | string;
        Filters: undefined | FileFilter[];
        HideExtension: undefined | boolean;
        Message: undefined | string;
        ResolvesAliases: undefined | boolean;
        ShowHiddenFiles: undefined | boolean;
        Title: undefined | string;
        TreatsFilePackagesAsDirectories: undefined | boolean;
    }

    Properties

    AllowsMultipleSelection +OpenFileDialogOptions | @wailsio/runtime

    Interface OpenFileDialogOptions

    interface OpenFileDialogOptions {
        AllowsMultipleSelection: undefined | boolean;
        AllowsOtherFiletypes: undefined | boolean;
        ButtonText: undefined | string;
        CanChooseDirectories: undefined | boolean;
        CanChooseFiles: undefined | boolean;
        CanCreateDirectories: undefined | boolean;
        CanSelectHiddenExtension: undefined | boolean;
        Detached: undefined | boolean;
        Directory: undefined | string;
        Filters: undefined | FileFilter[];
        HideExtension: undefined | boolean;
        Message: undefined | string;
        ResolvesAliases: undefined | boolean;
        ShowHiddenFiles: undefined | boolean;
        Title: undefined | string;
        TreatsFilePackagesAsDirectories: undefined | boolean;
    }

    Properties

    AllowsMultipleSelection: undefined | boolean

    Indicates if multiple selection is allowed.

    -
    AllowsOtherFiletypes: undefined | boolean

    Indicates if other file types are allowed.

    -
    ButtonText: undefined | string

    Text to display on the button.

    -
    CanChooseDirectories: undefined | boolean

    Indicates if directories can be chosen.

    -
    CanChooseFiles: undefined | boolean

    Indicates if files can be chosen.

    -
    CanCreateDirectories: undefined | boolean

    Indicates if directories can be created.

    -
    CanSelectHiddenExtension: undefined | boolean

    Indicates if hidden extensions can be selected.

    -
    Detached: undefined | boolean

    Indicates if the dialog should appear detached from the main window.

    -
    Directory: undefined | string

    Directory to open in the dialog.

    -
    Filters: undefined | FileFilter[]

    Array of file filters.

    -
    HideExtension: undefined | boolean

    Indicates if the extension should be hidden.

    -
    Message: undefined | string

    Message to show in the dialog.

    -
    ResolvesAliases: undefined | boolean

    Indicates if aliases should be resolved.

    -
    ShowHiddenFiles: undefined | boolean

    Indicates if hidden files should be shown.

    -
    Title: undefined | string

    Title of the dialog.

    -
    TreatsFilePackagesAsDirectories: undefined | boolean

    Indicates if file packages should be treated as directories.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    AllowsOtherFiletypes: undefined | boolean

    Indicates if other file types are allowed.

    +
    ButtonText: undefined | string

    Text to display on the button.

    +
    CanChooseDirectories: undefined | boolean

    Indicates if directories can be chosen.

    +
    CanChooseFiles: undefined | boolean

    Indicates if files can be chosen.

    +
    CanCreateDirectories: undefined | boolean

    Indicates if directories can be created.

    +
    CanSelectHiddenExtension: undefined | boolean

    Indicates if hidden extensions can be selected.

    +
    Detached: undefined | boolean

    Indicates if the dialog should appear detached from the main window.

    +
    Directory: undefined | string

    Directory to open in the dialog.

    +
    Filters: undefined | FileFilter[]

    Array of file filters.

    +
    HideExtension: undefined | boolean

    Indicates if the extension should be hidden.

    +
    Message: undefined | string

    Message to show in the dialog.

    +
    ResolvesAliases: undefined | boolean

    Indicates if aliases should be resolved.

    +
    ShowHiddenFiles: undefined | boolean

    Indicates if hidden files should be shown.

    +
    Title: undefined | string

    Title of the dialog.

    +
    TreatsFilePackagesAsDirectories: undefined | boolean

    Indicates if file packages should be treated as directories.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.SaveFileDialogOptions.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.SaveFileDialogOptions.html index 9c18d7d92..d4f058d56 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.SaveFileDialogOptions.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.SaveFileDialogOptions.html @@ -1,4 +1,4 @@ -SaveFileDialogOptions | @wailsio/runtime

    Interface SaveFileDialogOptions

    interface SaveFileDialogOptions {
        AllowsMultipleSelection: undefined | boolean;
        AllowsOtherFiletypes: undefined | boolean;
        ButtonText: undefined | string;
        CanChooseDirectories: undefined | boolean;
        CanChooseFiles: undefined | boolean;
        CanCreateDirectories: undefined | boolean;
        CanSelectHiddenExtension: undefined | boolean;
        Detached: undefined | boolean;
        Directory: undefined | string;
        Filename: undefined | string;
        Filters: undefined | FileFilter[];
        HideExtension: undefined | boolean;
        Message: undefined | string;
        ResolvesAliases: undefined | boolean;
        ShowHiddenFiles: undefined | boolean;
        Title: undefined | string;
        TreatsFilePackagesAsDirectories: undefined | boolean;
    }

    Properties

    AllowsMultipleSelection +SaveFileDialogOptions | @wailsio/runtime

    Interface SaveFileDialogOptions

    interface SaveFileDialogOptions {
        AllowsMultipleSelection: undefined | boolean;
        AllowsOtherFiletypes: undefined | boolean;
        ButtonText: undefined | string;
        CanChooseDirectories: undefined | boolean;
        CanChooseFiles: undefined | boolean;
        CanCreateDirectories: undefined | boolean;
        CanSelectHiddenExtension: undefined | boolean;
        Detached: undefined | boolean;
        Directory: undefined | string;
        Filename: undefined | string;
        Filters: undefined | FileFilter[];
        HideExtension: undefined | boolean;
        Message: undefined | string;
        ResolvesAliases: undefined | boolean;
        ShowHiddenFiles: undefined | boolean;
        Title: undefined | string;
        TreatsFilePackagesAsDirectories: undefined | boolean;
    }

    Properties

    AllowsMultipleSelection: undefined | boolean

    Indicates if multiple selection is allowed.

    -
    AllowsOtherFiletypes: undefined | boolean

    Indicates if other file types are allowed.

    -
    ButtonText: undefined | string

    Text to display on the button.

    -
    CanChooseDirectories: undefined | boolean

    Indicates if directories can be chosen.

    -
    CanChooseFiles: undefined | boolean

    Indicates if files can be chosen.

    -
    CanCreateDirectories: undefined | boolean

    Indicates if directories can be created.

    -
    CanSelectHiddenExtension: undefined | boolean

    Indicates if hidden extensions can be selected.

    -
    Detached: undefined | boolean

    Indicates if the dialog should appear detached from the main window.

    -
    Directory: undefined | string

    Directory to open in the dialog.

    -
    Filename: undefined | string

    Default filename to use in the dialog.

    -
    Filters: undefined | FileFilter[]

    Array of file filters.

    -
    HideExtension: undefined | boolean

    Indicates if the extension should be hidden.

    -
    Message: undefined | string

    Message to show in the dialog.

    -
    ResolvesAliases: undefined | boolean

    Indicates if aliases should be resolved.

    -
    ShowHiddenFiles: undefined | boolean

    Indicates if hidden files should be shown.

    -
    Title: undefined | string

    Title of the dialog.

    -
    TreatsFilePackagesAsDirectories: undefined | boolean

    Indicates if file packages should be treated as directories.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    AllowsOtherFiletypes: undefined | boolean

    Indicates if other file types are allowed.

    +
    ButtonText: undefined | string

    Text to display on the button.

    +
    CanChooseDirectories: undefined | boolean

    Indicates if directories can be chosen.

    +
    CanChooseFiles: undefined | boolean

    Indicates if files can be chosen.

    +
    CanCreateDirectories: undefined | boolean

    Indicates if directories can be created.

    +
    CanSelectHiddenExtension: undefined | boolean

    Indicates if hidden extensions can be selected.

    +
    Detached: undefined | boolean

    Indicates if the dialog should appear detached from the main window.

    +
    Directory: undefined | string

    Directory to open in the dialog.

    +
    Filename: undefined | string

    Default filename to use in the dialog.

    +
    Filters: undefined | FileFilter[]

    Array of file filters.

    +
    HideExtension: undefined | boolean

    Indicates if the extension should be hidden.

    +
    Message: undefined | string

    Message to show in the dialog.

    +
    ResolvesAliases: undefined | boolean

    Indicates if aliases should be resolved.

    +
    ShowHiddenFiles: undefined | boolean

    Indicates if hidden files should be shown.

    +
    Title: undefined | string

    Title of the dialog.

    +
    TreatsFilePackagesAsDirectories: undefined | boolean

    Indicates if file packages should be treated as directories.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Rect.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Rect.html index 0f5d9d0c6..1c8f1ee6e 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Rect.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Rect.html @@ -1,9 +1,9 @@ -Rect | @wailsio/runtime
    interface Rect {
        Height: number;
        Width: number;
        X: number;
        Y: number;
    }

    Properties

    Height +Rect | @wailsio/runtime
    interface Rect {
        Height: number;
        Width: number;
        X: number;
        Y: number;
    }

    Properties

    Properties

    Height: number

    The height of the rectangle.

    -
    Width: number

    The width of the rectangle.

    -
    X: number

    The X coordinate of the origin.

    -
    Y: number

    The Y coordinate of the origin.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    Width: number

    The width of the rectangle.

    +
    X: number

    The X coordinate of the origin.

    +
    Y: number

    The Y coordinate of the origin.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Screen.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Screen.html index 021012a8c..5f55b9a51 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Screen.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Screen.html @@ -1,4 +1,4 @@ -Screen | @wailsio/runtime
    interface Screen {
        Bounds: Rect;
        ID: string;
        IsPrimary: boolean;
        Name: string;
        PhysicalBounds: Rect;
        PhysicalWorkArea: Rect;
        Rotation: number;
        ScaleFactor: number;
        Size: Size;
        WorkArea: Rect;
        X: number;
        Y: number;
    }

    Properties

    Bounds +Screen | @wailsio/runtime
    interface Screen {
        Bounds: Rect;
        ID: string;
        IsPrimary: boolean;
        Name: string;
        PhysicalBounds: Rect;
        PhysicalWorkArea: Rect;
        Rotation: number;
        ScaleFactor: number;
        Size: Size;
        WorkArea: Rect;
        X: number;
        Y: number;
    }

    Properties

    Bounds ID IsPrimary Name @@ -11,15 +11,15 @@ X Y

    Properties

    Bounds: Rect

    Contains the bounds of the screen in terms of X, Y, Width, and Height.

    -
    ID: string

    Unique identifier for the screen.

    -
    IsPrimary: boolean

    True if this is the primary monitor selected by the user in the operating system.

    -
    Name: string

    Human readable name of the screen.

    -
    PhysicalBounds: Rect

    Contains the physical bounds of the screen in terms of X, Y, Width, and Height (before scaling).

    -
    PhysicalWorkArea: Rect

    Contains the physical WorkArea of the screen (before scaling).

    -
    Rotation: number

    The rotation of the screen.

    -
    ScaleFactor: number

    The scale factor of the screen (DPI/96). 1 = standard DPI, 2 = HiDPI (Retina), etc.

    -
    Size: Size

    Contains the width and height of the screen.

    -
    WorkArea: Rect

    Contains the area of the screen that is actually usable (excluding taskbar and other system UI).

    -
    X: number

    The X coordinate of the screen.

    -
    Y: number

    The Y coordinate of the screen.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    ID: string

    Unique identifier for the screen.

    +
    IsPrimary: boolean

    True if this is the primary monitor selected by the user in the operating system.

    +
    Name: string

    Human readable name of the screen.

    +
    PhysicalBounds: Rect

    Contains the physical bounds of the screen in terms of X, Y, Width, and Height (before scaling).

    +
    PhysicalWorkArea: Rect

    Contains the physical WorkArea of the screen (before scaling).

    +
    Rotation: number

    The rotation of the screen.

    +
    ScaleFactor: number

    The scale factor of the screen (DPI/96). 1 = standard DPI, 2 = HiDPI (Retina), etc.

    +
    Size: Size

    Contains the width and height of the screen.

    +
    WorkArea: Rect

    Contains the area of the screen that is actually usable (excluding taskbar and other system UI).

    +
    X: number

    The X coordinate of the screen.

    +
    Y: number

    The Y coordinate of the screen.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Size.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Size.html index 4ff328bd8..77dfa4df8 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Size.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Size.html @@ -1,5 +1,5 @@ -Size | @wailsio/runtime
    interface Size {
        Height: number;
        Width: number;
    }

    Properties

    Height +Size | @wailsio/runtime
    interface Size {
        Height: number;
        Width: number;
    }

    Properties

    Properties

    Height: number

    The height.

    -
    Width: number

    The width.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    Width: number

    The width.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.EnvironmentInfo.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.EnvironmentInfo.html index a91f72a06..fdc4e75ef 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.EnvironmentInfo.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.EnvironmentInfo.html @@ -1,11 +1,11 @@ -EnvironmentInfo | @wailsio/runtime

    Interface EnvironmentInfo

    interface EnvironmentInfo {
        Arch: string;
        Debug: boolean;
        OS: string;
        OSInfo: OSInfo;
        PlatformInfo: Object;
    }

    Properties

    Arch +EnvironmentInfo | @wailsio/runtime

    Interface EnvironmentInfo

    interface EnvironmentInfo {
        Arch: string;
        Debug: boolean;
        OS: string;
        OSInfo: OSInfo;
        PlatformInfo: Object;
    }

    Properties

    Arch: string

    The architecture of the system.

    -
    Debug: boolean

    True if the application is running in debug mode, otherwise false.

    -
    OS: string

    The operating system in use.

    -
    OSInfo: OSInfo

    Details of the operating system.

    -
    PlatformInfo: Object

    Additional platform information.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    Debug: boolean

    True if the application is running in debug mode, otherwise false.

    +
    OS: string

    The operating system in use.

    +
    OSInfo: OSInfo

    Details of the operating system.

    +
    PlatformInfo: Object

    Additional platform information.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.OSInfo.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.OSInfo.html index e4cff39d4..db7366c5a 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.OSInfo.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.OSInfo.html @@ -1,9 +1,9 @@ -OSInfo | @wailsio/runtime
    interface OSInfo {
        Branding: string;
        ID: string;
        Name: string;
        Version: string;
    }

    Properties

    Branding +OSInfo | @wailsio/runtime
    interface OSInfo {
        Branding: string;
        ID: string;
        Name: string;
        Version: string;
    }

    Properties

    Properties

    Branding: string

    The branding of the OS.

    -
    ID: string

    The ID of the OS.

    -
    Name: string

    The name of the OS.

    -
    Version: string

    The version of the OS.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    ID: string

    The ID of the OS.

    +
    Name: string

    The name of the OS.

    +
    Version: string

    The version of the OS.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Application.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Application.html index 6ee3e0da3..d0747cd3d 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Application.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Application.html @@ -1,4 +1,4 @@ -Application | @wailsio/runtime

    Namespace Application

    Index

    Functions

    Hide +Application | @wailsio/runtime

    Namespace Application

    Index

    Functions

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Browser.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Browser.html index 014464ffd..d17953d4f 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Browser.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Browser.html @@ -1,2 +1,2 @@ -Browser | @wailsio/runtime

    Namespace Browser

    Index

    Functions

    OpenURL +Browser | @wailsio/runtime

    Namespace Browser

    Index

    Functions

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Call.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Call.html index e0b4719c2..929ef8bc1 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Call.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Call.html @@ -1,4 +1,4 @@ -Call | @wailsio/runtime

    Namespace Call

    Index

    Classes

    RuntimeError +Call | @wailsio/runtime

    Namespace Call

    Index

    Classes

    Interfaces

    Functions

    ByID ByName diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Clipboard.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Clipboard.html index 54c4e2dce..5ebcba3d6 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Clipboard.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Clipboard.html @@ -1,3 +1,3 @@ -Clipboard | @wailsio/runtime

    Namespace Clipboard

    Index

    Functions

    SetText +Clipboard | @wailsio/runtime

    Namespace Clipboard

    Index

    Functions

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Create.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Create.html index 3f7199faa..7c2a30be3 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Create.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Create.html @@ -1,4 +1,4 @@ -Create | @wailsio/runtime

    Namespace Create

    Index

    Functions

    Any +Create | @wailsio/runtime

    Namespace Create

    Index

    Functions

    Any Array ByteSlice Map diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Dialogs.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Dialogs.html index 061f48910..1761825a6 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Dialogs.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Dialogs.html @@ -1,4 +1,4 @@ -Dialogs | @wailsio/runtime

    Namespace Dialogs

    Index

    Interfaces

    Button +Dialogs | @wailsio/runtime

    Namespace Dialogs

    Index

    Interfaces

    Button FileFilter MessageDialogOptions OpenFileDialogOptions diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Events.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Events.html index 7dbc52dca..33cf3acfa 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Events.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Events.html @@ -1,4 +1,4 @@ -Events | @wailsio/runtime

    Namespace Events

    Index

    Classes

    WailsEvent +Events | @wailsio/runtime

    Namespace Events

    Index

    Classes

    Variables

    Functions

    Emit Off diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Flags.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Flags.html index ba56c1dad..0b1dd1ae5 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Flags.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Flags.html @@ -1,2 +1,2 @@ -Flags | @wailsio/runtime

    Namespace Flags

    Index

    Functions

    GetFlag +Flags | @wailsio/runtime

    Namespace Flags

    Index

    Functions

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Screens.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Screens.html index 1a3858967..c5203a448 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Screens.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Screens.html @@ -1,4 +1,4 @@ -Screens | @wailsio/runtime

    Namespace Screens

    Index

    Interfaces

    Rect +Screens | @wailsio/runtime

    Namespace Screens

    Index

    Interfaces

    Functions

    GetAll diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/System.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/System.html index 910674610..dd0778a5d 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/System.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/System.html @@ -1,4 +1,4 @@ -System | @wailsio/runtime

    Namespace System

    Index

    Interfaces

    EnvironmentInfo +System | @wailsio/runtime

    Namespace System

    Index

    Interfaces

    Functions

    Capabilities Environment diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/WML.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/WML.html index fcb7a7c4d..2ae34fb48 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/WML.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/WML.html @@ -1,3 +1,3 @@ -WML | @wailsio/runtime

    Namespace WML

    Index

    Functions

    Enable +WML | @wailsio/runtime

    Namespace WML

    Index

    Functions

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Events.Types.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Events.Types.html index fc5825db3..4b56461ca 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Events.Types.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Events.Types.html @@ -1 +1 @@ -Types | @wailsio/runtime

    Variable TypesConst

    Types: {
        Common: {
            ApplicationOpenedWithFile: string;
            ApplicationStarted: string;
            ThemeChanged: string;
            WindowClosing: string;
            WindowDPIChanged: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowFilesDropped: string;
            WindowFocus: string;
            WindowFullscreen: string;
            WindowHide: string;
            WindowLostFocus: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowRestore: string;
            WindowRuntimeReady: string;
            WindowShow: string;
            WindowUnFullscreen: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowZoom: string;
            WindowZoomIn: string;
            WindowZoomOut: string;
            WindowZoomReset: string;
        };
        Linux: {
            ApplicationStartup: string;
            SystemThemeChanged: string;
            WindowDeleteEvent: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowFocusIn: string;
            WindowFocusOut: string;
            WindowLoadChanged: string;
        };
        Mac: {
            ApplicationDidBecomeActive: string;
            ApplicationDidChangeBackingProperties: string;
            ApplicationDidChangeEffectiveAppearance: string;
            ApplicationDidChangeIcon: string;
            ApplicationDidChangeOcclusionState: string;
            ApplicationDidChangeScreenParameters: string;
            ApplicationDidChangeStatusBarFrame: string;
            ApplicationDidChangeStatusBarOrientation: string;
            ApplicationDidChangeTheme: string;
            ApplicationDidFinishLaunching: string;
            ApplicationDidHide: string;
            ApplicationDidResignActive: string;
            ApplicationDidUnhide: string;
            ApplicationDidUpdate: string;
            ApplicationShouldHandleReopen: string;
            ApplicationWillBecomeActive: string;
            ApplicationWillFinishLaunching: string;
            ApplicationWillHide: string;
            ApplicationWillResignActive: string;
            ApplicationWillTerminate: string;
            ApplicationWillUnhide: string;
            ApplicationWillUpdate: string;
            MenuDidAddItem: string;
            MenuDidBeginTracking: string;
            MenuDidClose: string;
            MenuDidDisplayItem: string;
            MenuDidEndTracking: string;
            MenuDidHighlightItem: string;
            MenuDidOpen: string;
            MenuDidPopUp: string;
            MenuDidRemoveItem: string;
            MenuDidSendAction: string;
            MenuDidSendActionToItem: string;
            MenuDidUpdate: string;
            MenuWillAddItem: string;
            MenuWillBeginTracking: string;
            MenuWillDisplayItem: string;
            MenuWillEndTracking: string;
            MenuWillHighlightItem: string;
            MenuWillOpen: string;
            MenuWillPopUp: string;
            MenuWillRemoveItem: string;
            MenuWillSendAction: string;
            MenuWillSendActionToItem: string;
            MenuWillUpdate: string;
            WebViewDidCommitNavigation: string;
            WebViewDidFinishNavigation: string;
            WebViewDidReceiveServerRedirectForProvisionalNavigation: string;
            WebViewDidStartProvisionalNavigation: string;
            WindowDidBecomeKey: string;
            WindowDidBecomeMain: string;
            WindowDidBeginSheet: string;
            WindowDidChangeAlpha: string;
            WindowDidChangeBackingLocation: string;
            WindowDidChangeBackingProperties: string;
            WindowDidChangeCollectionBehavior: string;
            WindowDidChangeEffectiveAppearance: string;
            WindowDidChangeOcclusionState: string;
            WindowDidChangeOrderingMode: string;
            WindowDidChangeScreen: string;
            WindowDidChangeScreenParameters: string;
            WindowDidChangeScreenProfile: string;
            WindowDidChangeScreenSpace: string;
            WindowDidChangeScreenSpaceProperties: string;
            WindowDidChangeSharingType: string;
            WindowDidChangeSpace: string;
            WindowDidChangeSpaceOrderingMode: string;
            WindowDidChangeTitle: string;
            WindowDidChangeToolbar: string;
            WindowDidDeminiaturize: string;
            WindowDidEndSheet: string;
            WindowDidEnterFullScreen: string;
            WindowDidEnterVersionBrowser: string;
            WindowDidExitFullScreen: string;
            WindowDidExitVersionBrowser: string;
            WindowDidExpose: string;
            WindowDidFocus: string;
            WindowDidMiniaturize: string;
            WindowDidMove: string;
            WindowDidOrderOffScreen: string;
            WindowDidOrderOnScreen: string;
            WindowDidResignKey: string;
            WindowDidResignMain: string;
            WindowDidResize: string;
            WindowDidUpdate: string;
            WindowDidUpdateAlpha: string;
            WindowDidUpdateCollectionBehavior: string;
            WindowDidUpdateCollectionProperties: string;
            WindowDidUpdateShadow: string;
            WindowDidUpdateTitle: string;
            WindowDidUpdateToolbar: string;
            WindowDidZoom: string;
            WindowFileDraggingEntered: string;
            WindowFileDraggingExited: string;
            WindowFileDraggingPerformed: string;
            WindowHide: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowShouldClose: string;
            WindowShow: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowWillBecomeKey: string;
            WindowWillBecomeMain: string;
            WindowWillBeginSheet: string;
            WindowWillChangeOrderingMode: string;
            WindowWillClose: string;
            WindowWillDeminiaturize: string;
            WindowWillEnterFullScreen: string;
            WindowWillEnterVersionBrowser: string;
            WindowWillExitFullScreen: string;
            WindowWillExitVersionBrowser: string;
            WindowWillFocus: string;
            WindowWillMiniaturize: string;
            WindowWillMove: string;
            WindowWillOrderOffScreen: string;
            WindowWillOrderOnScreen: string;
            WindowWillResignMain: string;
            WindowWillResize: string;
            WindowWillUnfocus: string;
            WindowWillUpdate: string;
            WindowWillUpdateAlpha: string;
            WindowWillUpdateCollectionBehavior: string;
            WindowWillUpdateCollectionProperties: string;
            WindowWillUpdateShadow: string;
            WindowWillUpdateTitle: string;
            WindowWillUpdateToolbar: string;
            WindowWillUpdateVisibility: string;
            WindowWillUseStandardFrame: string;
            WindowZoomIn: string;
            WindowZoomOut: string;
            WindowZoomReset: string;
        };
        Windows: {
            APMPowerSettingChange: string;
            APMPowerStatusChange: string;
            APMResumeAutomatic: string;
            APMResumeSuspend: string;
            APMSuspend: string;
            ApplicationStarted: string;
            SystemThemeChanged: string;
            WebViewNavigationCompleted: string;
            WindowActive: string;
            WindowBackgroundErase: string;
            WindowClickActive: string;
            WindowClosing: string;
            WindowDPIChanged: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowDragDrop: string;
            WindowDragEnter: string;
            WindowDragLeave: string;
            WindowDragOver: string;
            WindowEndMove: string;
            WindowEndResize: string;
            WindowFullscreen: string;
            WindowHide: string;
            WindowInactive: string;
            WindowKeyDown: string;
            WindowKeyUp: string;
            WindowKillFocus: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowNonClientHit: string;
            WindowNonClientMouseDown: string;
            WindowNonClientMouseLeave: string;
            WindowNonClientMouseMove: string;
            WindowNonClientMouseUp: string;
            WindowPaint: string;
            WindowRestore: string;
            WindowSetFocus: string;
            WindowShow: string;
            WindowStartMove: string;
            WindowStartResize: string;
            WindowUnFullscreen: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowZOrderChanged: string;
        };
    } = EventTypes

    Type declaration

    • Common: {
          ApplicationOpenedWithFile: string;
          ApplicationStarted: string;
          ThemeChanged: string;
          WindowClosing: string;
          WindowDPIChanged: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowFilesDropped: string;
          WindowFocus: string;
          WindowFullscreen: string;
          WindowHide: string;
          WindowLostFocus: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowRestore: string;
          WindowRuntimeReady: string;
          WindowShow: string;
          WindowUnFullscreen: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowZoom: string;
          WindowZoomIn: string;
          WindowZoomOut: string;
          WindowZoomReset: string;
      }
      • ApplicationOpenedWithFile: string
      • ApplicationStarted: string
      • ThemeChanged: string
      • WindowClosing: string
      • WindowDPIChanged: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowFilesDropped: string
      • WindowFocus: string
      • WindowFullscreen: string
      • WindowHide: string
      • WindowLostFocus: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowRestore: string
      • WindowRuntimeReady: string
      • WindowShow: string
      • WindowUnFullscreen: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowZoom: string
      • WindowZoomIn: string
      • WindowZoomOut: string
      • WindowZoomReset: string
    • Linux: {
          ApplicationStartup: string;
          SystemThemeChanged: string;
          WindowDeleteEvent: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowFocusIn: string;
          WindowFocusOut: string;
          WindowLoadChanged: string;
      }
      • ApplicationStartup: string
      • SystemThemeChanged: string
      • WindowDeleteEvent: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowFocusIn: string
      • WindowFocusOut: string
      • WindowLoadChanged: string
    • Mac: {
          ApplicationDidBecomeActive: string;
          ApplicationDidChangeBackingProperties: string;
          ApplicationDidChangeEffectiveAppearance: string;
          ApplicationDidChangeIcon: string;
          ApplicationDidChangeOcclusionState: string;
          ApplicationDidChangeScreenParameters: string;
          ApplicationDidChangeStatusBarFrame: string;
          ApplicationDidChangeStatusBarOrientation: string;
          ApplicationDidChangeTheme: string;
          ApplicationDidFinishLaunching: string;
          ApplicationDidHide: string;
          ApplicationDidResignActive: string;
          ApplicationDidUnhide: string;
          ApplicationDidUpdate: string;
          ApplicationShouldHandleReopen: string;
          ApplicationWillBecomeActive: string;
          ApplicationWillFinishLaunching: string;
          ApplicationWillHide: string;
          ApplicationWillResignActive: string;
          ApplicationWillTerminate: string;
          ApplicationWillUnhide: string;
          ApplicationWillUpdate: string;
          MenuDidAddItem: string;
          MenuDidBeginTracking: string;
          MenuDidClose: string;
          MenuDidDisplayItem: string;
          MenuDidEndTracking: string;
          MenuDidHighlightItem: string;
          MenuDidOpen: string;
          MenuDidPopUp: string;
          MenuDidRemoveItem: string;
          MenuDidSendAction: string;
          MenuDidSendActionToItem: string;
          MenuDidUpdate: string;
          MenuWillAddItem: string;
          MenuWillBeginTracking: string;
          MenuWillDisplayItem: string;
          MenuWillEndTracking: string;
          MenuWillHighlightItem: string;
          MenuWillOpen: string;
          MenuWillPopUp: string;
          MenuWillRemoveItem: string;
          MenuWillSendAction: string;
          MenuWillSendActionToItem: string;
          MenuWillUpdate: string;
          WebViewDidCommitNavigation: string;
          WebViewDidFinishNavigation: string;
          WebViewDidReceiveServerRedirectForProvisionalNavigation: string;
          WebViewDidStartProvisionalNavigation: string;
          WindowDidBecomeKey: string;
          WindowDidBecomeMain: string;
          WindowDidBeginSheet: string;
          WindowDidChangeAlpha: string;
          WindowDidChangeBackingLocation: string;
          WindowDidChangeBackingProperties: string;
          WindowDidChangeCollectionBehavior: string;
          WindowDidChangeEffectiveAppearance: string;
          WindowDidChangeOcclusionState: string;
          WindowDidChangeOrderingMode: string;
          WindowDidChangeScreen: string;
          WindowDidChangeScreenParameters: string;
          WindowDidChangeScreenProfile: string;
          WindowDidChangeScreenSpace: string;
          WindowDidChangeScreenSpaceProperties: string;
          WindowDidChangeSharingType: string;
          WindowDidChangeSpace: string;
          WindowDidChangeSpaceOrderingMode: string;
          WindowDidChangeTitle: string;
          WindowDidChangeToolbar: string;
          WindowDidDeminiaturize: string;
          WindowDidEndSheet: string;
          WindowDidEnterFullScreen: string;
          WindowDidEnterVersionBrowser: string;
          WindowDidExitFullScreen: string;
          WindowDidExitVersionBrowser: string;
          WindowDidExpose: string;
          WindowDidFocus: string;
          WindowDidMiniaturize: string;
          WindowDidMove: string;
          WindowDidOrderOffScreen: string;
          WindowDidOrderOnScreen: string;
          WindowDidResignKey: string;
          WindowDidResignMain: string;
          WindowDidResize: string;
          WindowDidUpdate: string;
          WindowDidUpdateAlpha: string;
          WindowDidUpdateCollectionBehavior: string;
          WindowDidUpdateCollectionProperties: string;
          WindowDidUpdateShadow: string;
          WindowDidUpdateTitle: string;
          WindowDidUpdateToolbar: string;
          WindowDidZoom: string;
          WindowFileDraggingEntered: string;
          WindowFileDraggingExited: string;
          WindowFileDraggingPerformed: string;
          WindowHide: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowShouldClose: string;
          WindowShow: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowWillBecomeKey: string;
          WindowWillBecomeMain: string;
          WindowWillBeginSheet: string;
          WindowWillChangeOrderingMode: string;
          WindowWillClose: string;
          WindowWillDeminiaturize: string;
          WindowWillEnterFullScreen: string;
          WindowWillEnterVersionBrowser: string;
          WindowWillExitFullScreen: string;
          WindowWillExitVersionBrowser: string;
          WindowWillFocus: string;
          WindowWillMiniaturize: string;
          WindowWillMove: string;
          WindowWillOrderOffScreen: string;
          WindowWillOrderOnScreen: string;
          WindowWillResignMain: string;
          WindowWillResize: string;
          WindowWillUnfocus: string;
          WindowWillUpdate: string;
          WindowWillUpdateAlpha: string;
          WindowWillUpdateCollectionBehavior: string;
          WindowWillUpdateCollectionProperties: string;
          WindowWillUpdateShadow: string;
          WindowWillUpdateTitle: string;
          WindowWillUpdateToolbar: string;
          WindowWillUpdateVisibility: string;
          WindowWillUseStandardFrame: string;
          WindowZoomIn: string;
          WindowZoomOut: string;
          WindowZoomReset: string;
      }
      • ApplicationDidBecomeActive: string
      • ApplicationDidChangeBackingProperties: string
      • ApplicationDidChangeEffectiveAppearance: string
      • ApplicationDidChangeIcon: string
      • ApplicationDidChangeOcclusionState: string
      • ApplicationDidChangeScreenParameters: string
      • ApplicationDidChangeStatusBarFrame: string
      • ApplicationDidChangeStatusBarOrientation: string
      • ApplicationDidChangeTheme: string
      • ApplicationDidFinishLaunching: string
      • ApplicationDidHide: string
      • ApplicationDidResignActive: string
      • ApplicationDidUnhide: string
      • ApplicationDidUpdate: string
      • ApplicationShouldHandleReopen: string
      • ApplicationWillBecomeActive: string
      • ApplicationWillFinishLaunching: string
      • ApplicationWillHide: string
      • ApplicationWillResignActive: string
      • ApplicationWillTerminate: string
      • ApplicationWillUnhide: string
      • ApplicationWillUpdate: string
      • MenuDidAddItem: string
      • MenuDidBeginTracking: string
      • MenuDidClose: string
      • MenuDidDisplayItem: string
      • MenuDidEndTracking: string
      • MenuDidHighlightItem: string
      • MenuDidOpen: string
      • MenuDidPopUp: string
      • MenuDidRemoveItem: string
      • MenuDidSendAction: string
      • MenuDidSendActionToItem: string
      • MenuDidUpdate: string
      • MenuWillAddItem: string
      • MenuWillBeginTracking: string
      • MenuWillDisplayItem: string
      • MenuWillEndTracking: string
      • MenuWillHighlightItem: string
      • MenuWillOpen: string
      • MenuWillPopUp: string
      • MenuWillRemoveItem: string
      • MenuWillSendAction: string
      • MenuWillSendActionToItem: string
      • MenuWillUpdate: string
      • WebViewDidCommitNavigation: string
      • WebViewDidFinishNavigation: string
      • WebViewDidReceiveServerRedirectForProvisionalNavigation: string
      • WebViewDidStartProvisionalNavigation: string
      • WindowDidBecomeKey: string
      • WindowDidBecomeMain: string
      • WindowDidBeginSheet: string
      • WindowDidChangeAlpha: string
      • WindowDidChangeBackingLocation: string
      • WindowDidChangeBackingProperties: string
      • WindowDidChangeCollectionBehavior: string
      • WindowDidChangeEffectiveAppearance: string
      • WindowDidChangeOcclusionState: string
      • WindowDidChangeOrderingMode: string
      • WindowDidChangeScreen: string
      • WindowDidChangeScreenParameters: string
      • WindowDidChangeScreenProfile: string
      • WindowDidChangeScreenSpace: string
      • WindowDidChangeScreenSpaceProperties: string
      • WindowDidChangeSharingType: string
      • WindowDidChangeSpace: string
      • WindowDidChangeSpaceOrderingMode: string
      • WindowDidChangeTitle: string
      • WindowDidChangeToolbar: string
      • WindowDidDeminiaturize: string
      • WindowDidEndSheet: string
      • WindowDidEnterFullScreen: string
      • WindowDidEnterVersionBrowser: string
      • WindowDidExitFullScreen: string
      • WindowDidExitVersionBrowser: string
      • WindowDidExpose: string
      • WindowDidFocus: string
      • WindowDidMiniaturize: string
      • WindowDidMove: string
      • WindowDidOrderOffScreen: string
      • WindowDidOrderOnScreen: string
      • WindowDidResignKey: string
      • WindowDidResignMain: string
      • WindowDidResize: string
      • WindowDidUpdate: string
      • WindowDidUpdateAlpha: string
      • WindowDidUpdateCollectionBehavior: string
      • WindowDidUpdateCollectionProperties: string
      • WindowDidUpdateShadow: string
      • WindowDidUpdateTitle: string
      • WindowDidUpdateToolbar: string
      • WindowDidZoom: string
      • WindowFileDraggingEntered: string
      • WindowFileDraggingExited: string
      • WindowFileDraggingPerformed: string
      • WindowHide: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowShouldClose: string
      • WindowShow: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowWillBecomeKey: string
      • WindowWillBecomeMain: string
      • WindowWillBeginSheet: string
      • WindowWillChangeOrderingMode: string
      • WindowWillClose: string
      • WindowWillDeminiaturize: string
      • WindowWillEnterFullScreen: string
      • WindowWillEnterVersionBrowser: string
      • WindowWillExitFullScreen: string
      • WindowWillExitVersionBrowser: string
      • WindowWillFocus: string
      • WindowWillMiniaturize: string
      • WindowWillMove: string
      • WindowWillOrderOffScreen: string
      • WindowWillOrderOnScreen: string
      • WindowWillResignMain: string
      • WindowWillResize: string
      • WindowWillUnfocus: string
      • WindowWillUpdate: string
      • WindowWillUpdateAlpha: string
      • WindowWillUpdateCollectionBehavior: string
      • WindowWillUpdateCollectionProperties: string
      • WindowWillUpdateShadow: string
      • WindowWillUpdateTitle: string
      • WindowWillUpdateToolbar: string
      • WindowWillUpdateVisibility: string
      • WindowWillUseStandardFrame: string
      • WindowZoomIn: string
      • WindowZoomOut: string
      • WindowZoomReset: string
    • Windows: {
          APMPowerSettingChange: string;
          APMPowerStatusChange: string;
          APMResumeAutomatic: string;
          APMResumeSuspend: string;
          APMSuspend: string;
          ApplicationStarted: string;
          SystemThemeChanged: string;
          WebViewNavigationCompleted: string;
          WindowActive: string;
          WindowBackgroundErase: string;
          WindowClickActive: string;
          WindowClosing: string;
          WindowDPIChanged: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowDragDrop: string;
          WindowDragEnter: string;
          WindowDragLeave: string;
          WindowDragOver: string;
          WindowEndMove: string;
          WindowEndResize: string;
          WindowFullscreen: string;
          WindowHide: string;
          WindowInactive: string;
          WindowKeyDown: string;
          WindowKeyUp: string;
          WindowKillFocus: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowNonClientHit: string;
          WindowNonClientMouseDown: string;
          WindowNonClientMouseLeave: string;
          WindowNonClientMouseMove: string;
          WindowNonClientMouseUp: string;
          WindowPaint: string;
          WindowRestore: string;
          WindowSetFocus: string;
          WindowShow: string;
          WindowStartMove: string;
          WindowStartResize: string;
          WindowUnFullscreen: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowZOrderChanged: string;
      }
      • APMPowerSettingChange: string
      • APMPowerStatusChange: string
      • APMResumeAutomatic: string
      • APMResumeSuspend: string
      • APMSuspend: string
      • ApplicationStarted: string
      • SystemThemeChanged: string
      • WebViewNavigationCompleted: string
      • WindowActive: string
      • WindowBackgroundErase: string
      • WindowClickActive: string
      • WindowClosing: string
      • WindowDPIChanged: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowDragDrop: string
      • WindowDragEnter: string
      • WindowDragLeave: string
      • WindowDragOver: string
      • WindowEndMove: string
      • WindowEndResize: string
      • WindowFullscreen: string
      • WindowHide: string
      • WindowInactive: string
      • WindowKeyDown: string
      • WindowKeyUp: string
      • WindowKillFocus: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowNonClientHit: string
      • WindowNonClientMouseDown: string
      • WindowNonClientMouseLeave: string
      • WindowNonClientMouseMove: string
      • WindowNonClientMouseUp: string
      • WindowPaint: string
      • WindowRestore: string
      • WindowSetFocus: string
      • WindowShow: string
      • WindowStartMove: string
      • WindowStartResize: string
      • WindowUnFullscreen: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowZOrderChanged: string

    Generated using TypeDoc

    \ No newline at end of file +Types | @wailsio/runtime

    Variable TypesConst

    Types: {
        Common: {
            ApplicationOpenedWithFile: string;
            ApplicationStarted: string;
            ThemeChanged: string;
            WindowClosing: string;
            WindowDPIChanged: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowFilesDropped: string;
            WindowFocus: string;
            WindowFullscreen: string;
            WindowHide: string;
            WindowLostFocus: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowRestore: string;
            WindowRuntimeReady: string;
            WindowShow: string;
            WindowUnFullscreen: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowZoom: string;
            WindowZoomIn: string;
            WindowZoomOut: string;
            WindowZoomReset: string;
        };
        Linux: {
            ApplicationStartup: string;
            SystemThemeChanged: string;
            WindowDeleteEvent: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowFocusIn: string;
            WindowFocusOut: string;
            WindowLoadChanged: string;
        };
        Mac: {
            ApplicationDidBecomeActive: string;
            ApplicationDidChangeBackingProperties: string;
            ApplicationDidChangeEffectiveAppearance: string;
            ApplicationDidChangeIcon: string;
            ApplicationDidChangeOcclusionState: string;
            ApplicationDidChangeScreenParameters: string;
            ApplicationDidChangeStatusBarFrame: string;
            ApplicationDidChangeStatusBarOrientation: string;
            ApplicationDidChangeTheme: string;
            ApplicationDidFinishLaunching: string;
            ApplicationDidHide: string;
            ApplicationDidResignActive: string;
            ApplicationDidUnhide: string;
            ApplicationDidUpdate: string;
            ApplicationShouldHandleReopen: string;
            ApplicationWillBecomeActive: string;
            ApplicationWillFinishLaunching: string;
            ApplicationWillHide: string;
            ApplicationWillResignActive: string;
            ApplicationWillTerminate: string;
            ApplicationWillUnhide: string;
            ApplicationWillUpdate: string;
            MenuDidAddItem: string;
            MenuDidBeginTracking: string;
            MenuDidClose: string;
            MenuDidDisplayItem: string;
            MenuDidEndTracking: string;
            MenuDidHighlightItem: string;
            MenuDidOpen: string;
            MenuDidPopUp: string;
            MenuDidRemoveItem: string;
            MenuDidSendAction: string;
            MenuDidSendActionToItem: string;
            MenuDidUpdate: string;
            MenuWillAddItem: string;
            MenuWillBeginTracking: string;
            MenuWillDisplayItem: string;
            MenuWillEndTracking: string;
            MenuWillHighlightItem: string;
            MenuWillOpen: string;
            MenuWillPopUp: string;
            MenuWillRemoveItem: string;
            MenuWillSendAction: string;
            MenuWillSendActionToItem: string;
            MenuWillUpdate: string;
            WebViewDidCommitNavigation: string;
            WebViewDidFinishNavigation: string;
            WebViewDidReceiveServerRedirectForProvisionalNavigation: string;
            WebViewDidStartProvisionalNavigation: string;
            WindowDidBecomeKey: string;
            WindowDidBecomeMain: string;
            WindowDidBeginSheet: string;
            WindowDidChangeAlpha: string;
            WindowDidChangeBackingLocation: string;
            WindowDidChangeBackingProperties: string;
            WindowDidChangeCollectionBehavior: string;
            WindowDidChangeEffectiveAppearance: string;
            WindowDidChangeOcclusionState: string;
            WindowDidChangeOrderingMode: string;
            WindowDidChangeScreen: string;
            WindowDidChangeScreenParameters: string;
            WindowDidChangeScreenProfile: string;
            WindowDidChangeScreenSpace: string;
            WindowDidChangeScreenSpaceProperties: string;
            WindowDidChangeSharingType: string;
            WindowDidChangeSpace: string;
            WindowDidChangeSpaceOrderingMode: string;
            WindowDidChangeTitle: string;
            WindowDidChangeToolbar: string;
            WindowDidDeminiaturize: string;
            WindowDidEndSheet: string;
            WindowDidEnterFullScreen: string;
            WindowDidEnterVersionBrowser: string;
            WindowDidExitFullScreen: string;
            WindowDidExitVersionBrowser: string;
            WindowDidExpose: string;
            WindowDidFocus: string;
            WindowDidMiniaturize: string;
            WindowDidMove: string;
            WindowDidOrderOffScreen: string;
            WindowDidOrderOnScreen: string;
            WindowDidResignKey: string;
            WindowDidResignMain: string;
            WindowDidResize: string;
            WindowDidUpdate: string;
            WindowDidUpdateAlpha: string;
            WindowDidUpdateCollectionBehavior: string;
            WindowDidUpdateCollectionProperties: string;
            WindowDidUpdateShadow: string;
            WindowDidUpdateTitle: string;
            WindowDidUpdateToolbar: string;
            WindowDidZoom: string;
            WindowFileDraggingEntered: string;
            WindowFileDraggingExited: string;
            WindowFileDraggingPerformed: string;
            WindowHide: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowShouldClose: string;
            WindowShow: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowWillBecomeKey: string;
            WindowWillBecomeMain: string;
            WindowWillBeginSheet: string;
            WindowWillChangeOrderingMode: string;
            WindowWillClose: string;
            WindowWillDeminiaturize: string;
            WindowWillEnterFullScreen: string;
            WindowWillEnterVersionBrowser: string;
            WindowWillExitFullScreen: string;
            WindowWillExitVersionBrowser: string;
            WindowWillFocus: string;
            WindowWillMiniaturize: string;
            WindowWillMove: string;
            WindowWillOrderOffScreen: string;
            WindowWillOrderOnScreen: string;
            WindowWillResignMain: string;
            WindowWillResize: string;
            WindowWillUnfocus: string;
            WindowWillUpdate: string;
            WindowWillUpdateAlpha: string;
            WindowWillUpdateCollectionBehavior: string;
            WindowWillUpdateCollectionProperties: string;
            WindowWillUpdateShadow: string;
            WindowWillUpdateTitle: string;
            WindowWillUpdateToolbar: string;
            WindowWillUpdateVisibility: string;
            WindowWillUseStandardFrame: string;
            WindowZoomIn: string;
            WindowZoomOut: string;
            WindowZoomReset: string;
        };
        Windows: {
            APMPowerSettingChange: string;
            APMPowerStatusChange: string;
            APMResumeAutomatic: string;
            APMResumeSuspend: string;
            APMSuspend: string;
            ApplicationStarted: string;
            SystemThemeChanged: string;
            WebViewNavigationCompleted: string;
            WindowActive: string;
            WindowBackgroundErase: string;
            WindowClickActive: string;
            WindowClosing: string;
            WindowDPIChanged: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowDragDrop: string;
            WindowDragEnter: string;
            WindowDragLeave: string;
            WindowDragOver: string;
            WindowEndMove: string;
            WindowEndResize: string;
            WindowFullscreen: string;
            WindowHide: string;
            WindowInactive: string;
            WindowKeyDown: string;
            WindowKeyUp: string;
            WindowKillFocus: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowNonClientHit: string;
            WindowNonClientMouseDown: string;
            WindowNonClientMouseLeave: string;
            WindowNonClientMouseMove: string;
            WindowNonClientMouseUp: string;
            WindowPaint: string;
            WindowRestore: string;
            WindowSetFocus: string;
            WindowShow: string;
            WindowStartMove: string;
            WindowStartResize: string;
            WindowUnFullscreen: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowZOrderChanged: string;
        };
    } = EventTypes

    Type declaration

    • Common: {
          ApplicationOpenedWithFile: string;
          ApplicationStarted: string;
          ThemeChanged: string;
          WindowClosing: string;
          WindowDPIChanged: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowFilesDropped: string;
          WindowFocus: string;
          WindowFullscreen: string;
          WindowHide: string;
          WindowLostFocus: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowRestore: string;
          WindowRuntimeReady: string;
          WindowShow: string;
          WindowUnFullscreen: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowZoom: string;
          WindowZoomIn: string;
          WindowZoomOut: string;
          WindowZoomReset: string;
      }
      • ApplicationOpenedWithFile: string
      • ApplicationStarted: string
      • ThemeChanged: string
      • WindowClosing: string
      • WindowDPIChanged: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowFilesDropped: string
      • WindowFocus: string
      • WindowFullscreen: string
      • WindowHide: string
      • WindowLostFocus: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowRestore: string
      • WindowRuntimeReady: string
      • WindowShow: string
      • WindowUnFullscreen: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowZoom: string
      • WindowZoomIn: string
      • WindowZoomOut: string
      • WindowZoomReset: string
    • Linux: {
          ApplicationStartup: string;
          SystemThemeChanged: string;
          WindowDeleteEvent: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowFocusIn: string;
          WindowFocusOut: string;
          WindowLoadChanged: string;
      }
      • ApplicationStartup: string
      • SystemThemeChanged: string
      • WindowDeleteEvent: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowFocusIn: string
      • WindowFocusOut: string
      • WindowLoadChanged: string
    • Mac: {
          ApplicationDidBecomeActive: string;
          ApplicationDidChangeBackingProperties: string;
          ApplicationDidChangeEffectiveAppearance: string;
          ApplicationDidChangeIcon: string;
          ApplicationDidChangeOcclusionState: string;
          ApplicationDidChangeScreenParameters: string;
          ApplicationDidChangeStatusBarFrame: string;
          ApplicationDidChangeStatusBarOrientation: string;
          ApplicationDidChangeTheme: string;
          ApplicationDidFinishLaunching: string;
          ApplicationDidHide: string;
          ApplicationDidResignActive: string;
          ApplicationDidUnhide: string;
          ApplicationDidUpdate: string;
          ApplicationShouldHandleReopen: string;
          ApplicationWillBecomeActive: string;
          ApplicationWillFinishLaunching: string;
          ApplicationWillHide: string;
          ApplicationWillResignActive: string;
          ApplicationWillTerminate: string;
          ApplicationWillUnhide: string;
          ApplicationWillUpdate: string;
          MenuDidAddItem: string;
          MenuDidBeginTracking: string;
          MenuDidClose: string;
          MenuDidDisplayItem: string;
          MenuDidEndTracking: string;
          MenuDidHighlightItem: string;
          MenuDidOpen: string;
          MenuDidPopUp: string;
          MenuDidRemoveItem: string;
          MenuDidSendAction: string;
          MenuDidSendActionToItem: string;
          MenuDidUpdate: string;
          MenuWillAddItem: string;
          MenuWillBeginTracking: string;
          MenuWillDisplayItem: string;
          MenuWillEndTracking: string;
          MenuWillHighlightItem: string;
          MenuWillOpen: string;
          MenuWillPopUp: string;
          MenuWillRemoveItem: string;
          MenuWillSendAction: string;
          MenuWillSendActionToItem: string;
          MenuWillUpdate: string;
          WebViewDidCommitNavigation: string;
          WebViewDidFinishNavigation: string;
          WebViewDidReceiveServerRedirectForProvisionalNavigation: string;
          WebViewDidStartProvisionalNavigation: string;
          WindowDidBecomeKey: string;
          WindowDidBecomeMain: string;
          WindowDidBeginSheet: string;
          WindowDidChangeAlpha: string;
          WindowDidChangeBackingLocation: string;
          WindowDidChangeBackingProperties: string;
          WindowDidChangeCollectionBehavior: string;
          WindowDidChangeEffectiveAppearance: string;
          WindowDidChangeOcclusionState: string;
          WindowDidChangeOrderingMode: string;
          WindowDidChangeScreen: string;
          WindowDidChangeScreenParameters: string;
          WindowDidChangeScreenProfile: string;
          WindowDidChangeScreenSpace: string;
          WindowDidChangeScreenSpaceProperties: string;
          WindowDidChangeSharingType: string;
          WindowDidChangeSpace: string;
          WindowDidChangeSpaceOrderingMode: string;
          WindowDidChangeTitle: string;
          WindowDidChangeToolbar: string;
          WindowDidDeminiaturize: string;
          WindowDidEndSheet: string;
          WindowDidEnterFullScreen: string;
          WindowDidEnterVersionBrowser: string;
          WindowDidExitFullScreen: string;
          WindowDidExitVersionBrowser: string;
          WindowDidExpose: string;
          WindowDidFocus: string;
          WindowDidMiniaturize: string;
          WindowDidMove: string;
          WindowDidOrderOffScreen: string;
          WindowDidOrderOnScreen: string;
          WindowDidResignKey: string;
          WindowDidResignMain: string;
          WindowDidResize: string;
          WindowDidUpdate: string;
          WindowDidUpdateAlpha: string;
          WindowDidUpdateCollectionBehavior: string;
          WindowDidUpdateCollectionProperties: string;
          WindowDidUpdateShadow: string;
          WindowDidUpdateTitle: string;
          WindowDidUpdateToolbar: string;
          WindowDidZoom: string;
          WindowFileDraggingEntered: string;
          WindowFileDraggingExited: string;
          WindowFileDraggingPerformed: string;
          WindowHide: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowShouldClose: string;
          WindowShow: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowWillBecomeKey: string;
          WindowWillBecomeMain: string;
          WindowWillBeginSheet: string;
          WindowWillChangeOrderingMode: string;
          WindowWillClose: string;
          WindowWillDeminiaturize: string;
          WindowWillEnterFullScreen: string;
          WindowWillEnterVersionBrowser: string;
          WindowWillExitFullScreen: string;
          WindowWillExitVersionBrowser: string;
          WindowWillFocus: string;
          WindowWillMiniaturize: string;
          WindowWillMove: string;
          WindowWillOrderOffScreen: string;
          WindowWillOrderOnScreen: string;
          WindowWillResignMain: string;
          WindowWillResize: string;
          WindowWillUnfocus: string;
          WindowWillUpdate: string;
          WindowWillUpdateAlpha: string;
          WindowWillUpdateCollectionBehavior: string;
          WindowWillUpdateCollectionProperties: string;
          WindowWillUpdateShadow: string;
          WindowWillUpdateTitle: string;
          WindowWillUpdateToolbar: string;
          WindowWillUpdateVisibility: string;
          WindowWillUseStandardFrame: string;
          WindowZoomIn: string;
          WindowZoomOut: string;
          WindowZoomReset: string;
      }
      • ApplicationDidBecomeActive: string
      • ApplicationDidChangeBackingProperties: string
      • ApplicationDidChangeEffectiveAppearance: string
      • ApplicationDidChangeIcon: string
      • ApplicationDidChangeOcclusionState: string
      • ApplicationDidChangeScreenParameters: string
      • ApplicationDidChangeStatusBarFrame: string
      • ApplicationDidChangeStatusBarOrientation: string
      • ApplicationDidChangeTheme: string
      • ApplicationDidFinishLaunching: string
      • ApplicationDidHide: string
      • ApplicationDidResignActive: string
      • ApplicationDidUnhide: string
      • ApplicationDidUpdate: string
      • ApplicationShouldHandleReopen: string
      • ApplicationWillBecomeActive: string
      • ApplicationWillFinishLaunching: string
      • ApplicationWillHide: string
      • ApplicationWillResignActive: string
      • ApplicationWillTerminate: string
      • ApplicationWillUnhide: string
      • ApplicationWillUpdate: string
      • MenuDidAddItem: string
      • MenuDidBeginTracking: string
      • MenuDidClose: string
      • MenuDidDisplayItem: string
      • MenuDidEndTracking: string
      • MenuDidHighlightItem: string
      • MenuDidOpen: string
      • MenuDidPopUp: string
      • MenuDidRemoveItem: string
      • MenuDidSendAction: string
      • MenuDidSendActionToItem: string
      • MenuDidUpdate: string
      • MenuWillAddItem: string
      • MenuWillBeginTracking: string
      • MenuWillDisplayItem: string
      • MenuWillEndTracking: string
      • MenuWillHighlightItem: string
      • MenuWillOpen: string
      • MenuWillPopUp: string
      • MenuWillRemoveItem: string
      • MenuWillSendAction: string
      • MenuWillSendActionToItem: string
      • MenuWillUpdate: string
      • WebViewDidCommitNavigation: string
      • WebViewDidFinishNavigation: string
      • WebViewDidReceiveServerRedirectForProvisionalNavigation: string
      • WebViewDidStartProvisionalNavigation: string
      • WindowDidBecomeKey: string
      • WindowDidBecomeMain: string
      • WindowDidBeginSheet: string
      • WindowDidChangeAlpha: string
      • WindowDidChangeBackingLocation: string
      • WindowDidChangeBackingProperties: string
      • WindowDidChangeCollectionBehavior: string
      • WindowDidChangeEffectiveAppearance: string
      • WindowDidChangeOcclusionState: string
      • WindowDidChangeOrderingMode: string
      • WindowDidChangeScreen: string
      • WindowDidChangeScreenParameters: string
      • WindowDidChangeScreenProfile: string
      • WindowDidChangeScreenSpace: string
      • WindowDidChangeScreenSpaceProperties: string
      • WindowDidChangeSharingType: string
      • WindowDidChangeSpace: string
      • WindowDidChangeSpaceOrderingMode: string
      • WindowDidChangeTitle: string
      • WindowDidChangeToolbar: string
      • WindowDidDeminiaturize: string
      • WindowDidEndSheet: string
      • WindowDidEnterFullScreen: string
      • WindowDidEnterVersionBrowser: string
      • WindowDidExitFullScreen: string
      • WindowDidExitVersionBrowser: string
      • WindowDidExpose: string
      • WindowDidFocus: string
      • WindowDidMiniaturize: string
      • WindowDidMove: string
      • WindowDidOrderOffScreen: string
      • WindowDidOrderOnScreen: string
      • WindowDidResignKey: string
      • WindowDidResignMain: string
      • WindowDidResize: string
      • WindowDidUpdate: string
      • WindowDidUpdateAlpha: string
      • WindowDidUpdateCollectionBehavior: string
      • WindowDidUpdateCollectionProperties: string
      • WindowDidUpdateShadow: string
      • WindowDidUpdateTitle: string
      • WindowDidUpdateToolbar: string
      • WindowDidZoom: string
      • WindowFileDraggingEntered: string
      • WindowFileDraggingExited: string
      • WindowFileDraggingPerformed: string
      • WindowHide: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowShouldClose: string
      • WindowShow: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowWillBecomeKey: string
      • WindowWillBecomeMain: string
      • WindowWillBeginSheet: string
      • WindowWillChangeOrderingMode: string
      • WindowWillClose: string
      • WindowWillDeminiaturize: string
      • WindowWillEnterFullScreen: string
      • WindowWillEnterVersionBrowser: string
      • WindowWillExitFullScreen: string
      • WindowWillExitVersionBrowser: string
      • WindowWillFocus: string
      • WindowWillMiniaturize: string
      • WindowWillMove: string
      • WindowWillOrderOffScreen: string
      • WindowWillOrderOnScreen: string
      • WindowWillResignMain: string
      • WindowWillResize: string
      • WindowWillUnfocus: string
      • WindowWillUpdate: string
      • WindowWillUpdateAlpha: string
      • WindowWillUpdateCollectionBehavior: string
      • WindowWillUpdateCollectionProperties: string
      • WindowWillUpdateShadow: string
      • WindowWillUpdateTitle: string
      • WindowWillUpdateToolbar: string
      • WindowWillUpdateVisibility: string
      • WindowWillUseStandardFrame: string
      • WindowZoomIn: string
      • WindowZoomOut: string
      • WindowZoomReset: string
    • Windows: {
          APMPowerSettingChange: string;
          APMPowerStatusChange: string;
          APMResumeAutomatic: string;
          APMResumeSuspend: string;
          APMSuspend: string;
          ApplicationStarted: string;
          SystemThemeChanged: string;
          WebViewNavigationCompleted: string;
          WindowActive: string;
          WindowBackgroundErase: string;
          WindowClickActive: string;
          WindowClosing: string;
          WindowDPIChanged: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowDragDrop: string;
          WindowDragEnter: string;
          WindowDragLeave: string;
          WindowDragOver: string;
          WindowEndMove: string;
          WindowEndResize: string;
          WindowFullscreen: string;
          WindowHide: string;
          WindowInactive: string;
          WindowKeyDown: string;
          WindowKeyUp: string;
          WindowKillFocus: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowNonClientHit: string;
          WindowNonClientMouseDown: string;
          WindowNonClientMouseLeave: string;
          WindowNonClientMouseMove: string;
          WindowNonClientMouseUp: string;
          WindowPaint: string;
          WindowRestore: string;
          WindowSetFocus: string;
          WindowShow: string;
          WindowStartMove: string;
          WindowStartResize: string;
          WindowUnFullscreen: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowZOrderChanged: string;
      }
      • APMPowerSettingChange: string
      • APMPowerStatusChange: string
      • APMResumeAutomatic: string
      • APMResumeSuspend: string
      • APMSuspend: string
      • ApplicationStarted: string
      • SystemThemeChanged: string
      • WebViewNavigationCompleted: string
      • WindowActive: string
      • WindowBackgroundErase: string
      • WindowClickActive: string
      • WindowClosing: string
      • WindowDPIChanged: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowDragDrop: string
      • WindowDragEnter: string
      • WindowDragLeave: string
      • WindowDragOver: string
      • WindowEndMove: string
      • WindowEndResize: string
      • WindowFullscreen: string
      • WindowHide: string
      • WindowInactive: string
      • WindowKeyDown: string
      • WindowKeyUp: string
      • WindowKillFocus: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowNonClientHit: string
      • WindowNonClientMouseDown: string
      • WindowNonClientMouseLeave: string
      • WindowNonClientMouseMove: string
      • WindowNonClientMouseUp: string
      • WindowPaint: string
      • WindowRestore: string
      • WindowSetFocus: string
      • WindowShow: string
      • WindowStartMove: string
      • WindowStartResize: string
      • WindowUnFullscreen: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowZOrderChanged: string

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Window.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Window.html index 17062c97c..e9774d5c3 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Window.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Window.html @@ -1,2 +1,2 @@ Window | @wailsio/runtime

    Variable WindowConst

    Window: Window = ...

    The window within which the script is running.

    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/package.json b/v3/internal/runtime/desktop/@wailsio/runtime/package.json index ae1fd6853..122cf4ada 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/package.json +++ b/v3/internal/runtime/desktop/@wailsio/runtime/package.json @@ -1,7 +1,7 @@ { "name": "@wailsio/runtime", "type": "module", - "version": "3.0.0-alpha.58", + "version": "3.0.0-alpha.59", "description": "Wails Runtime", "types": "types/index.d.ts", "exports": { From 151bc6d36bc3d0074dc7cfee01c103f0ea479eaa Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Thu, 27 Feb 2025 19:14:31 +0000 Subject: [PATCH 101/374] [skip ci] Publish @wailsio/runtime v3.0.0-alpha.60 --- .../docs/classes/Call.RuntimeError.html | 4 +-- .../docs/classes/Events.WailsEvent.html | 4 +-- .../docs/functions/Application.Hide.html | 2 +- .../docs/functions/Application.Quit.html | 2 +- .../docs/functions/Application.Show.html | 2 +- .../docs/functions/Browser.OpenURL.html | 2 +- .../runtime/docs/functions/Call.ByID.html | 2 +- .../runtime/docs/functions/Call.ByName.html | 2 +- .../runtime/docs/functions/Call.Call.html | 2 +- .../docs/functions/Clipboard.SetText.html | 2 +- .../docs/functions/Clipboard.Text.html | 2 +- .../runtime/docs/functions/Create.Any.html | 2 +- .../runtime/docs/functions/Create.Array.html | 2 +- .../docs/functions/Create.ByteSlice.html | 2 +- .../runtime/docs/functions/Create.Map.html | 2 +- .../docs/functions/Create.Nullable.html | 2 +- .../runtime/docs/functions/Create.Struct.html | 2 +- .../runtime/docs/functions/Dialogs.Error.html | 2 +- .../runtime/docs/functions/Dialogs.Info.html | 2 +- .../docs/functions/Dialogs.OpenFile.html | 2 +- .../docs/functions/Dialogs.Question.html | 2 +- .../docs/functions/Dialogs.SaveFile.html | 2 +- .../docs/functions/Dialogs.Warning.html | 2 +- .../runtime/docs/functions/Events.Emit.html | 2 +- .../runtime/docs/functions/Events.Off.html | 2 +- .../runtime/docs/functions/Events.OffAll.html | 2 +- .../runtime/docs/functions/Events.On.html | 2 +- .../docs/functions/Events.OnMultiple.html | 2 +- .../runtime/docs/functions/Events.Once.html | 2 +- .../runtime/docs/functions/Events.setup.html | 2 +- .../runtime/docs/functions/Flags.GetFlag.html | 2 +- .../docs/functions/Screens.GetAll.html | 2 +- .../docs/functions/Screens.GetCurrent.html | 2 +- .../docs/functions/Screens.GetPrimary.html | 2 +- .../docs/functions/System.Capabilities.html | 2 +- .../docs/functions/System.Environment.html | 2 +- .../docs/functions/System.IsAMD64.html | 2 +- .../runtime/docs/functions/System.IsARM.html | 2 +- .../docs/functions/System.IsARM64.html | 2 +- .../docs/functions/System.IsDarkMode.html | 2 +- .../docs/functions/System.IsDebug.html | 2 +- .../docs/functions/System.IsLinux.html | 2 +- .../runtime/docs/functions/System.IsMac.html | 2 +- .../docs/functions/System.IsWindows.html | 2 +- .../runtime/docs/functions/System.invoke.html | 2 +- .../runtime/docs/functions/WML.Enable.html | 2 +- .../runtime/docs/functions/WML.Reload.html | 2 +- .../@wailsio/runtime/docs/functions/init.html | 2 +- .../docs/interfaces/Call.CallOptions.html | 8 ++--- .../docs/interfaces/Dialogs.Button.html | 8 ++--- .../docs/interfaces/Dialogs.FileFilter.html | 6 ++-- .../Dialogs.MessageDialogOptions.html | 10 +++--- .../Dialogs.OpenFileDialogOptions.html | 34 +++++++++--------- .../Dialogs.SaveFileDialogOptions.html | 36 +++++++++---------- .../runtime/docs/interfaces/Screens.Rect.html | 10 +++--- .../docs/interfaces/Screens.Screen.html | 26 +++++++------- .../runtime/docs/interfaces/Screens.Size.html | 6 ++-- .../interfaces/System.EnvironmentInfo.html | 12 +++---- .../docs/interfaces/System.OSInfo.html | 10 +++--- .../runtime/docs/modules/Application.html | 2 +- .../runtime/docs/modules/Browser.html | 2 +- .../@wailsio/runtime/docs/modules/Call.html | 2 +- .../runtime/docs/modules/Clipboard.html | 2 +- .../@wailsio/runtime/docs/modules/Create.html | 2 +- .../runtime/docs/modules/Dialogs.html | 2 +- .../@wailsio/runtime/docs/modules/Events.html | 2 +- .../@wailsio/runtime/docs/modules/Flags.html | 2 +- .../runtime/docs/modules/Screens.html | 2 +- .../@wailsio/runtime/docs/modules/System.html | 2 +- .../@wailsio/runtime/docs/modules/WML.html | 2 +- .../runtime/docs/variables/Events.Types.html | 2 +- .../runtime/docs/variables/Window.html | 2 +- .../@wailsio/runtime/package-lock.json | 4 +-- .../desktop/@wailsio/runtime/package.json | 2 +- 74 files changed, 149 insertions(+), 149 deletions(-) diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Call.RuntimeError.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Call.RuntimeError.html index 5c924c060..43a152d4b 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Call.RuntimeError.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Call.RuntimeError.html @@ -1,6 +1,6 @@ RuntimeError | @wailsio/runtime

    Exception class that will be thrown in case the bound method returns an error. The value of the RuntimeError#name property is "RuntimeError".

    -

    Hierarchy

    • Error
      • RuntimeError

    Constructors

    Hierarchy

    • Error
      • RuntimeError

    Constructors

    Properties

    cause? message name @@ -8,4 +8,4 @@ The value of the

    Constructors

    • Constructs a new RuntimeError instance.

      Parameters

      • message: string

        The error message.

      • Rest ...args: any[]

        Optional arguments for the Error constructor.

        -

      Returns RuntimeError

    Properties

    cause?: unknown
    message: string
    name: string
    stack?: string

    Generated using TypeDoc

    \ No newline at end of file +

    Returns RuntimeError

    Properties

    cause?: unknown
    message: string
    name: string
    stack?: string

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Events.WailsEvent.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Events.WailsEvent.html index 24e9770fb..0cb098600 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Events.WailsEvent.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Events.WailsEvent.html @@ -1,4 +1,4 @@ -WailsEvent | @wailsio/runtime

    Constructors

    constructor +WailsEvent | @wailsio/runtime

    Constructors

    Properties

    Constructors

    Properties

    data: any
    name: any

    Generated using TypeDoc

    \ No newline at end of file +

    Constructors

    Properties

    data: any
    name: any

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Hide.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Hide.html index 637c9c990..a0dd5da46 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Hide.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Hide.html @@ -1,2 +1,2 @@ Hide | @wailsio/runtime
    • Hides a certain method by calling the HideMethod function.

      -

      Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file +

    Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Quit.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Quit.html index b34c5ad5d..084afaf35 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Quit.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Quit.html @@ -1,2 +1,2 @@ Quit | @wailsio/runtime
    • Calls the QuitMethod to terminate the program.

      -

      Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file +

    Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Show.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Show.html index 98d8d11ac..a8c352048 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Show.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Show.html @@ -1,2 +1,2 @@ Show | @wailsio/runtime
    • Calls the ShowMethod and returns the result.

      -

      Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file +

    Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Browser.OpenURL.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Browser.OpenURL.html index 734238239..0ca034158 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Browser.OpenURL.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Browser.OpenURL.html @@ -1,3 +1,3 @@ OpenURL | @wailsio/runtime
    • Open a browser window to the given URL

      Parameters

      • url: string

        The URL to open

        -

      Returns Promise<string>

    Generated using TypeDoc

    \ No newline at end of file +

    Returns Promise<string>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByID.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByID.html index 8de8bebe0..9f0159763 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByID.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByID.html @@ -5,4 +5,4 @@ See Call for details.

    Returns Promise<any>

    • The result of the method call.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByName.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByName.html index 4e9570a4f..a16e692fb 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByName.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByName.html @@ -3,4 +3,4 @@ See Call for details.

    Parameters

    • methodName: string

      The name of the method in the format 'package.struct.method'.

    • Rest ...args: any[]

      The arguments to pass to the method.

    Returns Promise<any>

    The result of the method call.

    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.Call.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.Call.html index 935fa7232..67498f305 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.Call.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.Call.html @@ -8,4 +8,4 @@ by the application- or service-level error marshaling functions.

    Returns Promise<any>

    • The result of the call.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.SetText.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.SetText.html index 2ce10c908..8cdb5c107 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.SetText.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.SetText.html @@ -3,4 +3,4 @@

    Returns Promise<any>

    • A Promise that resolves when the operation is successful.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.Text.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.Text.html index 1061c0c19..66f0ca9fa 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.Text.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.Text.html @@ -1,3 +1,3 @@ Text | @wailsio/runtime
    • Get the Clipboard text

      Returns Promise<string>

      A promise that resolves with the text from the Clipboard.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Any.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Any.html index 1d32fc792..c95400723 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Any.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Any.html @@ -1,2 +1,2 @@ Any | @wailsio/runtime
    • Any is a dummy creation function for simple or unknown types.

      -

      Type Parameters

      • T

      Parameters

      • source: any

      Returns T

    Generated using TypeDoc

    \ No newline at end of file +

    Type Parameters

    • T

    Parameters

    • source: any

    Returns T

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Array.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Array.html index 11bc26fb3..5d4758c74 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Array.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Array.html @@ -1,4 +1,4 @@ Array | @wailsio/runtime
    • Array takes a creation function for an arbitrary type and returns an in-place creation function for an array whose elements are of that type.

      -

      Type Parameters

      • T

      Parameters

      • element: ((source) => T)
          • (source): T
          • Parameters

            • source: any

            Returns T

      Returns ((source) => T[])

        • (source): T[]
        • Parameters

          • source: any

          Returns T[]

    Generated using TypeDoc

    \ No newline at end of file +

    Type Parameters

    • T

    Parameters

    • element: ((source) => T)
        • (source): T
        • Parameters

          • source: any

          Returns T

    Returns ((source) => T[])

      • (source): T[]
      • Parameters

        • source: any

        Returns T[]

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.ByteSlice.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.ByteSlice.html index 48b2a9f32..3cb1098e4 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.ByteSlice.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.ByteSlice.html @@ -1,3 +1,3 @@ ByteSlice | @wailsio/runtime
    • ByteSlice is a creation function that replaces null strings with empty strings.

      -

      Parameters

      • source: any

      Returns string

    Generated using TypeDoc

    \ No newline at end of file +

    Parameters

    • source: any

    Returns string

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Map.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Map.html index f8fbe1aaf..a8af254eb 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Map.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Map.html @@ -1,4 +1,4 @@ Map | @wailsio/runtime
    • Map takes creation functions for two arbitrary types and returns an in-place creation function for an object whose keys and values are of those types.

      -

      Type Parameters

      • K
      • V

      Parameters

      • key: ((source) => K)
          • (source): K
          • Parameters

            • source: any

            Returns K

      • value: ((source) => V)
          • (source): V
          • Parameters

            • source: any

            Returns V

      Returns ((source) => {
          [_: K]: V;
      })

        • (source): {
              [_: K]: V;
          }
        • Parameters

          • source: any

          Returns {
              [_: K]: V;
          }

    Generated using TypeDoc

    \ No newline at end of file +

    Type Parameters

    • K
    • V

    Parameters

    • key: ((source) => K)
        • (source): K
        • Parameters

          • source: any

          Returns K

    • value: ((source) => V)
        • (source): V
        • Parameters

          • source: any

          Returns V

    Returns ((source) => {
        [_: K]: V;
    })

      • (source): {
            [_: K]: V;
        }
      • Parameters

        • source: any

        Returns {
            [_: K]: V;
        }

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Nullable.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Nullable.html index 94b8fde19..8ede5ffa0 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Nullable.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Nullable.html @@ -1,3 +1,3 @@ Nullable | @wailsio/runtime
    • Nullable takes a creation function for an arbitrary type and returns a creation function for a nullable value of that type.

      -

      Type Parameters

      • T

      Parameters

      • element: ((source) => T)
          • (source): T
          • Parameters

            • source: any

            Returns T

      Returns ((source) => null | T)

        • (source): null | T
        • Parameters

          • source: any

          Returns null | T

    Generated using TypeDoc

    \ No newline at end of file +

    Type Parameters

    • T

    Parameters

    • element: ((source) => T)
        • (source): T
        • Parameters

          • source: any

          Returns T

    Returns ((source) => null | T)

      • (source): null | T
      • Parameters

        • source: any

        Returns null | T

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Struct.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Struct.html index 3d567c03f..837112f79 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Struct.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Struct.html @@ -1,3 +1,3 @@ Struct | @wailsio/runtime
    • Struct takes an object mapping field names to creation functions and returns an in-place creation function for a struct.

      -

      Type Parameters

      • T extends {
            [_: string]: ((source) => any);
        }
      • U extends {
            [Key in string | number | symbol]?: ReturnType<T[Key]>
        }

      Parameters

      • createField: T

      Returns ((source) => U)

        • (source): U
        • Parameters

          • source: any

          Returns U

    Generated using TypeDoc

    \ No newline at end of file +

    Type Parameters

    • T extends {
          [_: string]: ((source) => any);
      }
    • U extends {
          [Key in string | number | symbol]?: ReturnType<T[Key]>
      }

    Parameters

    • createField: T

    Returns ((source) => U)

      • (source): U
      • Parameters

        • source: any

        Returns U

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Error.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Error.html index 4ae894e02..18c1465fb 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Error.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Error.html @@ -2,4 +2,4 @@

    Returns Promise<string>

    • The label of the button pressed
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Info.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Info.html index 02621c41d..08d4bc138 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Info.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Info.html @@ -2,4 +2,4 @@

    Returns Promise<string>

    • The label of the button pressed
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.OpenFile.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.OpenFile.html index dab59add4..d2fa4ad46 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.OpenFile.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.OpenFile.html @@ -1,3 +1,3 @@ OpenFile | @wailsio/runtime
    • Parameters

      Returns Promise<string | string[]>

      Returns selected file or list of files. Returns blank string if no file is selected.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Question.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Question.html index 29f618f14..8ffebf4e9 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Question.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Question.html @@ -2,4 +2,4 @@

    Returns Promise<string>

    • The label of the button pressed
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.SaveFile.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.SaveFile.html index 2d183b929..39d84c6b0 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.SaveFile.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.SaveFile.html @@ -1,3 +1,3 @@ SaveFile | @wailsio/runtime
    • Parameters

      Returns Promise<string>

      Returns the selected file. Returns blank string if no file is selected.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Warning.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Warning.html index b50818794..1f64ccea9 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Warning.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Warning.html @@ -2,4 +2,4 @@

    Returns Promise<string>

    • The label of the button pressed
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Emit.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Emit.html index aa7dca39b..21a11b796 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Emit.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Emit.html @@ -3,4 +3,4 @@

    Returns any

    • The result of the emitted event.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Off.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Off.html index dc879a52b..3f5c94e03 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Off.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Off.html @@ -1,4 +1,4 @@ Off | @wailsio/runtime
    • Removes event listeners for the specified event names.

      Parameters

      • eventName: string

        The name of the event to remove listeners for.

      • Rest ...additionalEventNames: string[]

        Additional event names to remove listeners for.

        -

      Returns undefined

    Generated using TypeDoc

    \ No newline at end of file +

    Returns undefined

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OffAll.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OffAll.html index 50d9a392f..d0cc815c1 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OffAll.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OffAll.html @@ -1,3 +1,3 @@ OffAll | @wailsio/runtime
    • Removes all event listeners.

      Returns void

      Function

      OffAll

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.On.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.On.html index 38a162f3a..89b06da7c 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.On.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.On.html @@ -4,4 +4,4 @@

    Returns Function

    • A function that, when called, will unregister the callback from the event.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OnMultiple.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OnMultiple.html index 6a1b371dd..ae2e8460d 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OnMultiple.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OnMultiple.html @@ -5,4 +5,4 @@

    Returns Function

    • A function that, when called, will unregister the callback from the event.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Once.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Once.html index b8e48ba9b..e8769c2ed 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Once.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Once.html @@ -4,4 +4,4 @@

    Returns Function

    • A function that, when called, will unregister the callback from the event.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.setup.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.setup.html index e07257746..6653aaf54 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.setup.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.setup.html @@ -1 +1 @@ -setup | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file +setup | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Flags.GetFlag.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Flags.GetFlag.html index 3a8a4785c..4a5e365b2 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Flags.GetFlag.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Flags.GetFlag.html @@ -3,4 +3,4 @@

    Returns any

    • The value associated with the specified key.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetAll.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetAll.html index a76031416..c89e9d57d 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetAll.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetAll.html @@ -1,3 +1,3 @@ GetAll | @wailsio/runtime
    • Gets all screens.

      Returns Promise<Screen[]>

      A promise that resolves to an array of Screen objects.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetCurrent.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetCurrent.html index 47bd9b743..e591e3223 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetCurrent.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetCurrent.html @@ -1,3 +1,3 @@ GetCurrent | @wailsio/runtime
    • Gets the current active screen.

      Returns Promise<Screen>

      A promise that resolves with the current active screen.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetPrimary.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetPrimary.html index b2ff1bdd6..4207aa6b4 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetPrimary.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetPrimary.html @@ -1,3 +1,3 @@ GetPrimary | @wailsio/runtime
    • Gets the primary screen.

      Returns Promise<Screen>

      A promise that resolves to the primary screen.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Capabilities.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Capabilities.html index a742087e9..d373c6765 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Capabilities.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Capabilities.html @@ -1,4 +1,4 @@ Capabilities | @wailsio/runtime
    • Fetches the capabilities of the application from the server.

      Returns Promise<Object>

      A promise that resolves to an object containing the capabilities.

      Async

      Function

      Capabilities

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Environment.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Environment.html index 38c1fc9c7..26325a5a3 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Environment.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Environment.html @@ -2,4 +2,4 @@
  • A promise that resolves to an object containing OS and system architecture.
  • Function

    Retrieves environment details.

    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsAMD64.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsAMD64.html index 95d91956b..4e0128d14 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsAMD64.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsAMD64.html @@ -1,3 +1,3 @@ IsAMD64 | @wailsio/runtime
    • Checks if the current environment architecture is AMD64.

      Returns boolean

      True if the current environment architecture is AMD64, false otherwise.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM.html index 148cf555a..7ed935470 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM.html @@ -1,3 +1,3 @@ IsARM | @wailsio/runtime
    • Checks if the current architecture is ARM.

      Returns boolean

      True if the current architecture is ARM, false otherwise.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM64.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM64.html index cfa4aaaa0..c952632d0 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM64.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM64.html @@ -2,4 +2,4 @@

    Returns boolean

    • Returns true if the environment is ARM64 architecture, otherwise returns false.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDarkMode.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDarkMode.html index f0119dfc6..ac866f167 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDarkMode.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDarkMode.html @@ -2,4 +2,4 @@
  • A promise that resolves to a boolean value indicating if the system is in dark mode.
  • Function

    Retrieves the system dark mode status.

    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDebug.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDebug.html index 7b8101b08..ada72f900 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDebug.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDebug.html @@ -1 +1 @@ -IsDebug | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file +IsDebug | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsLinux.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsLinux.html index 85db1e171..8226f0ea5 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsLinux.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsLinux.html @@ -1,3 +1,3 @@ IsLinux | @wailsio/runtime
    • Checks if the current operating system is Linux.

      Returns boolean

      Returns true if the current operating system is Linux, false otherwise.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsMac.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsMac.html index 47c550634..8c5b66a20 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsMac.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsMac.html @@ -1,3 +1,3 @@ IsMac | @wailsio/runtime
    • Checks if the current environment is a macOS operating system.

      Returns boolean

      True if the environment is macOS, false otherwise.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsWindows.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsWindows.html index d0c715b5d..7e7281508 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsWindows.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsWindows.html @@ -1,3 +1,3 @@ IsWindows | @wailsio/runtime
    • Checks if the current operating system is Windows.

      Returns boolean

      True if the operating system is Windows, otherwise false.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.invoke.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.invoke.html index 5868f5492..b48f948ca 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.invoke.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.invoke.html @@ -1 +1 @@ -invoke | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file +invoke | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Enable.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Enable.html index 914650375..1a1d32d91 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Enable.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Enable.html @@ -1,2 +1,2 @@ Enable | @wailsio/runtime
    • Schedules an automatic reload of WML to be performed as soon as the document is fully loaded.

      -

      Returns void

    Generated using TypeDoc

    \ No newline at end of file +

    Returns void

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Reload.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Reload.html index b63b6ec82..050d47f08 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Reload.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Reload.html @@ -1,2 +1,2 @@ Reload | @wailsio/runtime
    • Reloads the WML page by adding necessary event listeners and browser listeners.

      -

      Returns void

    Generated using TypeDoc

    \ No newline at end of file +

    Returns void

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/init.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/init.html index 66dee77b5..7bbac9404 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/init.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/init.html @@ -1 +1 @@ -init | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file +init | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Call.CallOptions.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Call.CallOptions.html index aeea66598..55c2e1248 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Call.CallOptions.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Call.CallOptions.html @@ -1,7 +1,7 @@ -CallOptions | @wailsio/runtime

    Interface CallOptions

    interface CallOptions {
        args: any[];
        methodID: undefined | number;
        methodName: undefined | string;
    }

    Properties

    args +CallOptions | @wailsio/runtime

    Interface CallOptions

    interface CallOptions {
        args: any[];
        methodID: undefined | number;
        methodName: undefined | string;
    }

    Properties

    args: any[]

    Arguments to be passed into the bound method.

    -
    methodID: undefined | number

    The numeric ID of the bound method to call.

    -
    methodName: undefined | string

    The fully qualified name of the bound method to call.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    methodID: undefined | number

    The numeric ID of the bound method to call.

    +
    methodName: undefined | string

    The fully qualified name of the bound method to call.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.Button.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.Button.html index f188f2662..c89c1e816 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.Button.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.Button.html @@ -1,7 +1,7 @@ -Button | @wailsio/runtime
    interface Button {
        IsCancel: undefined | boolean;
        IsDefault: undefined | boolean;
        Label: undefined | string;
    }

    Properties

    IsCancel +Button | @wailsio/runtime
    interface Button {
        IsCancel: undefined | boolean;
        IsDefault: undefined | boolean;
        Label: undefined | string;
    }

    Properties

    IsCancel: undefined | boolean

    True if the button should cancel an operation when clicked.

    -
    IsDefault: undefined | boolean

    True if the button should be the default action when the user presses enter.

    -
    Label: undefined | string

    Text that appears within the button.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    IsDefault: undefined | boolean

    True if the button should be the default action when the user presses enter.

    +
    Label: undefined | string

    Text that appears within the button.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.FileFilter.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.FileFilter.html index dfb026277..f3a8f81a9 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.FileFilter.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.FileFilter.html @@ -1,5 +1,5 @@ -FileFilter | @wailsio/runtime
    interface FileFilter {
        DisplayName: undefined | string;
        Pattern: undefined | string;
    }

    Properties

    DisplayName +FileFilter | @wailsio/runtime
    interface FileFilter {
        DisplayName: undefined | string;
        Pattern: undefined | string;
    }

    Properties

    Properties

    DisplayName: undefined | string

    Display name for the filter, it could be "Text Files", "Images" etc.

    -
    Pattern: undefined | string

    Pattern to match for the filter, e.g. ".txt;.md" for text markdown files.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    Pattern: undefined | string

    Pattern to match for the filter, e.g. ".txt;.md" for text markdown files.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.MessageDialogOptions.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.MessageDialogOptions.html index ff6b112f6..d08ec5c6f 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.MessageDialogOptions.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.MessageDialogOptions.html @@ -1,9 +1,9 @@ -MessageDialogOptions | @wailsio/runtime

    Interface MessageDialogOptions

    interface MessageDialogOptions {
        Buttons: undefined | Button[];
        Detached: undefined | boolean;
        Message: undefined | string;
        Title: undefined | string;
    }

    Properties

    Buttons +MessageDialogOptions | @wailsio/runtime

    Interface MessageDialogOptions

    interface MessageDialogOptions {
        Buttons: undefined | Button[];
        Detached: undefined | boolean;
        Message: undefined | string;
        Title: undefined | string;
    }

    Properties

    Buttons: undefined | Button[]

    Array of button options to show in the dialog.

    -
    Detached: undefined | boolean

    True if the dialog should appear detached from the main window (if applicable).

    -
    Message: undefined | string

    The main message to show in the dialog.

    -
    Title: undefined | string

    The title of the dialog window.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    Detached: undefined | boolean

    True if the dialog should appear detached from the main window (if applicable).

    +
    Message: undefined | string

    The main message to show in the dialog.

    +
    Title: undefined | string

    The title of the dialog window.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.OpenFileDialogOptions.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.OpenFileDialogOptions.html index ec078e5d0..b0560bb5a 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.OpenFileDialogOptions.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.OpenFileDialogOptions.html @@ -1,4 +1,4 @@ -OpenFileDialogOptions | @wailsio/runtime

    Interface OpenFileDialogOptions

    interface OpenFileDialogOptions {
        AllowsMultipleSelection: undefined | boolean;
        AllowsOtherFiletypes: undefined | boolean;
        ButtonText: undefined | string;
        CanChooseDirectories: undefined | boolean;
        CanChooseFiles: undefined | boolean;
        CanCreateDirectories: undefined | boolean;
        CanSelectHiddenExtension: undefined | boolean;
        Detached: undefined | boolean;
        Directory: undefined | string;
        Filters: undefined | FileFilter[];
        HideExtension: undefined | boolean;
        Message: undefined | string;
        ResolvesAliases: undefined | boolean;
        ShowHiddenFiles: undefined | boolean;
        Title: undefined | string;
        TreatsFilePackagesAsDirectories: undefined | boolean;
    }

    Properties

    AllowsMultipleSelection +OpenFileDialogOptions | @wailsio/runtime

    Interface OpenFileDialogOptions

    interface OpenFileDialogOptions {
        AllowsMultipleSelection: undefined | boolean;
        AllowsOtherFiletypes: undefined | boolean;
        ButtonText: undefined | string;
        CanChooseDirectories: undefined | boolean;
        CanChooseFiles: undefined | boolean;
        CanCreateDirectories: undefined | boolean;
        CanSelectHiddenExtension: undefined | boolean;
        Detached: undefined | boolean;
        Directory: undefined | string;
        Filters: undefined | FileFilter[];
        HideExtension: undefined | boolean;
        Message: undefined | string;
        ResolvesAliases: undefined | boolean;
        ShowHiddenFiles: undefined | boolean;
        Title: undefined | string;
        TreatsFilePackagesAsDirectories: undefined | boolean;
    }

    Properties

    AllowsMultipleSelection: undefined | boolean

    Indicates if multiple selection is allowed.

    -
    AllowsOtherFiletypes: undefined | boolean

    Indicates if other file types are allowed.

    -
    ButtonText: undefined | string

    Text to display on the button.

    -
    CanChooseDirectories: undefined | boolean

    Indicates if directories can be chosen.

    -
    CanChooseFiles: undefined | boolean

    Indicates if files can be chosen.

    -
    CanCreateDirectories: undefined | boolean

    Indicates if directories can be created.

    -
    CanSelectHiddenExtension: undefined | boolean

    Indicates if hidden extensions can be selected.

    -
    Detached: undefined | boolean

    Indicates if the dialog should appear detached from the main window.

    -
    Directory: undefined | string

    Directory to open in the dialog.

    -
    Filters: undefined | FileFilter[]

    Array of file filters.

    -
    HideExtension: undefined | boolean

    Indicates if the extension should be hidden.

    -
    Message: undefined | string

    Message to show in the dialog.

    -
    ResolvesAliases: undefined | boolean

    Indicates if aliases should be resolved.

    -
    ShowHiddenFiles: undefined | boolean

    Indicates if hidden files should be shown.

    -
    Title: undefined | string

    Title of the dialog.

    -
    TreatsFilePackagesAsDirectories: undefined | boolean

    Indicates if file packages should be treated as directories.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    AllowsOtherFiletypes: undefined | boolean

    Indicates if other file types are allowed.

    +
    ButtonText: undefined | string

    Text to display on the button.

    +
    CanChooseDirectories: undefined | boolean

    Indicates if directories can be chosen.

    +
    CanChooseFiles: undefined | boolean

    Indicates if files can be chosen.

    +
    CanCreateDirectories: undefined | boolean

    Indicates if directories can be created.

    +
    CanSelectHiddenExtension: undefined | boolean

    Indicates if hidden extensions can be selected.

    +
    Detached: undefined | boolean

    Indicates if the dialog should appear detached from the main window.

    +
    Directory: undefined | string

    Directory to open in the dialog.

    +
    Filters: undefined | FileFilter[]

    Array of file filters.

    +
    HideExtension: undefined | boolean

    Indicates if the extension should be hidden.

    +
    Message: undefined | string

    Message to show in the dialog.

    +
    ResolvesAliases: undefined | boolean

    Indicates if aliases should be resolved.

    +
    ShowHiddenFiles: undefined | boolean

    Indicates if hidden files should be shown.

    +
    Title: undefined | string

    Title of the dialog.

    +
    TreatsFilePackagesAsDirectories: undefined | boolean

    Indicates if file packages should be treated as directories.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.SaveFileDialogOptions.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.SaveFileDialogOptions.html index d4f058d56..ea364bcf5 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.SaveFileDialogOptions.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.SaveFileDialogOptions.html @@ -1,4 +1,4 @@ -SaveFileDialogOptions | @wailsio/runtime

    Interface SaveFileDialogOptions

    interface SaveFileDialogOptions {
        AllowsMultipleSelection: undefined | boolean;
        AllowsOtherFiletypes: undefined | boolean;
        ButtonText: undefined | string;
        CanChooseDirectories: undefined | boolean;
        CanChooseFiles: undefined | boolean;
        CanCreateDirectories: undefined | boolean;
        CanSelectHiddenExtension: undefined | boolean;
        Detached: undefined | boolean;
        Directory: undefined | string;
        Filename: undefined | string;
        Filters: undefined | FileFilter[];
        HideExtension: undefined | boolean;
        Message: undefined | string;
        ResolvesAliases: undefined | boolean;
        ShowHiddenFiles: undefined | boolean;
        Title: undefined | string;
        TreatsFilePackagesAsDirectories: undefined | boolean;
    }

    Properties

    AllowsMultipleSelection +SaveFileDialogOptions | @wailsio/runtime

    Interface SaveFileDialogOptions

    interface SaveFileDialogOptions {
        AllowsMultipleSelection: undefined | boolean;
        AllowsOtherFiletypes: undefined | boolean;
        ButtonText: undefined | string;
        CanChooseDirectories: undefined | boolean;
        CanChooseFiles: undefined | boolean;
        CanCreateDirectories: undefined | boolean;
        CanSelectHiddenExtension: undefined | boolean;
        Detached: undefined | boolean;
        Directory: undefined | string;
        Filename: undefined | string;
        Filters: undefined | FileFilter[];
        HideExtension: undefined | boolean;
        Message: undefined | string;
        ResolvesAliases: undefined | boolean;
        ShowHiddenFiles: undefined | boolean;
        Title: undefined | string;
        TreatsFilePackagesAsDirectories: undefined | boolean;
    }

    Properties

    AllowsMultipleSelection: undefined | boolean

    Indicates if multiple selection is allowed.

    -
    AllowsOtherFiletypes: undefined | boolean

    Indicates if other file types are allowed.

    -
    ButtonText: undefined | string

    Text to display on the button.

    -
    CanChooseDirectories: undefined | boolean

    Indicates if directories can be chosen.

    -
    CanChooseFiles: undefined | boolean

    Indicates if files can be chosen.

    -
    CanCreateDirectories: undefined | boolean

    Indicates if directories can be created.

    -
    CanSelectHiddenExtension: undefined | boolean

    Indicates if hidden extensions can be selected.

    -
    Detached: undefined | boolean

    Indicates if the dialog should appear detached from the main window.

    -
    Directory: undefined | string

    Directory to open in the dialog.

    -
    Filename: undefined | string

    Default filename to use in the dialog.

    -
    Filters: undefined | FileFilter[]

    Array of file filters.

    -
    HideExtension: undefined | boolean

    Indicates if the extension should be hidden.

    -
    Message: undefined | string

    Message to show in the dialog.

    -
    ResolvesAliases: undefined | boolean

    Indicates if aliases should be resolved.

    -
    ShowHiddenFiles: undefined | boolean

    Indicates if hidden files should be shown.

    -
    Title: undefined | string

    Title of the dialog.

    -
    TreatsFilePackagesAsDirectories: undefined | boolean

    Indicates if file packages should be treated as directories.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    AllowsOtherFiletypes: undefined | boolean

    Indicates if other file types are allowed.

    +
    ButtonText: undefined | string

    Text to display on the button.

    +
    CanChooseDirectories: undefined | boolean

    Indicates if directories can be chosen.

    +
    CanChooseFiles: undefined | boolean

    Indicates if files can be chosen.

    +
    CanCreateDirectories: undefined | boolean

    Indicates if directories can be created.

    +
    CanSelectHiddenExtension: undefined | boolean

    Indicates if hidden extensions can be selected.

    +
    Detached: undefined | boolean

    Indicates if the dialog should appear detached from the main window.

    +
    Directory: undefined | string

    Directory to open in the dialog.

    +
    Filename: undefined | string

    Default filename to use in the dialog.

    +
    Filters: undefined | FileFilter[]

    Array of file filters.

    +
    HideExtension: undefined | boolean

    Indicates if the extension should be hidden.

    +
    Message: undefined | string

    Message to show in the dialog.

    +
    ResolvesAliases: undefined | boolean

    Indicates if aliases should be resolved.

    +
    ShowHiddenFiles: undefined | boolean

    Indicates if hidden files should be shown.

    +
    Title: undefined | string

    Title of the dialog.

    +
    TreatsFilePackagesAsDirectories: undefined | boolean

    Indicates if file packages should be treated as directories.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Rect.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Rect.html index 1c8f1ee6e..7da7c2ab7 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Rect.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Rect.html @@ -1,9 +1,9 @@ -Rect | @wailsio/runtime
    interface Rect {
        Height: number;
        Width: number;
        X: number;
        Y: number;
    }

    Properties

    Height +Rect | @wailsio/runtime
    interface Rect {
        Height: number;
        Width: number;
        X: number;
        Y: number;
    }

    Properties

    Properties

    Height: number

    The height of the rectangle.

    -
    Width: number

    The width of the rectangle.

    -
    X: number

    The X coordinate of the origin.

    -
    Y: number

    The Y coordinate of the origin.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    Width: number

    The width of the rectangle.

    +
    X: number

    The X coordinate of the origin.

    +
    Y: number

    The Y coordinate of the origin.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Screen.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Screen.html index 5f55b9a51..823fda888 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Screen.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Screen.html @@ -1,4 +1,4 @@ -Screen | @wailsio/runtime
    interface Screen {
        Bounds: Rect;
        ID: string;
        IsPrimary: boolean;
        Name: string;
        PhysicalBounds: Rect;
        PhysicalWorkArea: Rect;
        Rotation: number;
        ScaleFactor: number;
        Size: Size;
        WorkArea: Rect;
        X: number;
        Y: number;
    }

    Properties

    Bounds +Screen | @wailsio/runtime
    interface Screen {
        Bounds: Rect;
        ID: string;
        IsPrimary: boolean;
        Name: string;
        PhysicalBounds: Rect;
        PhysicalWorkArea: Rect;
        Rotation: number;
        ScaleFactor: number;
        Size: Size;
        WorkArea: Rect;
        X: number;
        Y: number;
    }

    Properties

    Bounds ID IsPrimary Name @@ -11,15 +11,15 @@ X Y

    Properties

    Bounds: Rect

    Contains the bounds of the screen in terms of X, Y, Width, and Height.

    -
    ID: string

    Unique identifier for the screen.

    -
    IsPrimary: boolean

    True if this is the primary monitor selected by the user in the operating system.

    -
    Name: string

    Human readable name of the screen.

    -
    PhysicalBounds: Rect

    Contains the physical bounds of the screen in terms of X, Y, Width, and Height (before scaling).

    -
    PhysicalWorkArea: Rect

    Contains the physical WorkArea of the screen (before scaling).

    -
    Rotation: number

    The rotation of the screen.

    -
    ScaleFactor: number

    The scale factor of the screen (DPI/96). 1 = standard DPI, 2 = HiDPI (Retina), etc.

    -
    Size: Size

    Contains the width and height of the screen.

    -
    WorkArea: Rect

    Contains the area of the screen that is actually usable (excluding taskbar and other system UI).

    -
    X: number

    The X coordinate of the screen.

    -
    Y: number

    The Y coordinate of the screen.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    ID: string

    Unique identifier for the screen.

    +
    IsPrimary: boolean

    True if this is the primary monitor selected by the user in the operating system.

    +
    Name: string

    Human readable name of the screen.

    +
    PhysicalBounds: Rect

    Contains the physical bounds of the screen in terms of X, Y, Width, and Height (before scaling).

    +
    PhysicalWorkArea: Rect

    Contains the physical WorkArea of the screen (before scaling).

    +
    Rotation: number

    The rotation of the screen.

    +
    ScaleFactor: number

    The scale factor of the screen (DPI/96). 1 = standard DPI, 2 = HiDPI (Retina), etc.

    +
    Size: Size

    Contains the width and height of the screen.

    +
    WorkArea: Rect

    Contains the area of the screen that is actually usable (excluding taskbar and other system UI).

    +
    X: number

    The X coordinate of the screen.

    +
    Y: number

    The Y coordinate of the screen.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Size.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Size.html index 77dfa4df8..205e22a7a 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Size.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Size.html @@ -1,5 +1,5 @@ -Size | @wailsio/runtime
    interface Size {
        Height: number;
        Width: number;
    }

    Properties

    Height +Size | @wailsio/runtime
    interface Size {
        Height: number;
        Width: number;
    }

    Properties

    Properties

    Height: number

    The height.

    -
    Width: number

    The width.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    Width: number

    The width.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.EnvironmentInfo.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.EnvironmentInfo.html index fdc4e75ef..4103bd059 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.EnvironmentInfo.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.EnvironmentInfo.html @@ -1,11 +1,11 @@ -EnvironmentInfo | @wailsio/runtime

    Interface EnvironmentInfo

    interface EnvironmentInfo {
        Arch: string;
        Debug: boolean;
        OS: string;
        OSInfo: OSInfo;
        PlatformInfo: Object;
    }

    Properties

    Arch +EnvironmentInfo | @wailsio/runtime

    Interface EnvironmentInfo

    interface EnvironmentInfo {
        Arch: string;
        Debug: boolean;
        OS: string;
        OSInfo: OSInfo;
        PlatformInfo: Object;
    }

    Properties

    Arch: string

    The architecture of the system.

    -
    Debug: boolean

    True if the application is running in debug mode, otherwise false.

    -
    OS: string

    The operating system in use.

    -
    OSInfo: OSInfo

    Details of the operating system.

    -
    PlatformInfo: Object

    Additional platform information.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    Debug: boolean

    True if the application is running in debug mode, otherwise false.

    +
    OS: string

    The operating system in use.

    +
    OSInfo: OSInfo

    Details of the operating system.

    +
    PlatformInfo: Object

    Additional platform information.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.OSInfo.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.OSInfo.html index db7366c5a..7f6e0d5c1 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.OSInfo.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.OSInfo.html @@ -1,9 +1,9 @@ -OSInfo | @wailsio/runtime
    interface OSInfo {
        Branding: string;
        ID: string;
        Name: string;
        Version: string;
    }

    Properties

    Branding +OSInfo | @wailsio/runtime
    interface OSInfo {
        Branding: string;
        ID: string;
        Name: string;
        Version: string;
    }

    Properties

    Properties

    Branding: string

    The branding of the OS.

    -
    ID: string

    The ID of the OS.

    -
    Name: string

    The name of the OS.

    -
    Version: string

    The version of the OS.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    ID: string

    The ID of the OS.

    +
    Name: string

    The name of the OS.

    +
    Version: string

    The version of the OS.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Application.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Application.html index d0747cd3d..ddeb9811f 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Application.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Application.html @@ -1,4 +1,4 @@ -Application | @wailsio/runtime

    Namespace Application

    Index

    Functions

    Hide +Application | @wailsio/runtime

    Namespace Application

    Index

    Functions

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Browser.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Browser.html index d17953d4f..55f5798b9 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Browser.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Browser.html @@ -1,2 +1,2 @@ -Browser | @wailsio/runtime

    Namespace Browser

    Index

    Functions

    OpenURL +Browser | @wailsio/runtime

    Namespace Browser

    Index

    Functions

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Call.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Call.html index 929ef8bc1..7a3b3eee2 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Call.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Call.html @@ -1,4 +1,4 @@ -Call | @wailsio/runtime

    Namespace Call

    Index

    Classes

    RuntimeError +Call | @wailsio/runtime

    Namespace Call

    Index

    Classes

    Interfaces

    Functions

    ByID ByName diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Clipboard.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Clipboard.html index 5ebcba3d6..b339afb5f 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Clipboard.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Clipboard.html @@ -1,3 +1,3 @@ -Clipboard | @wailsio/runtime

    Namespace Clipboard

    Index

    Functions

    SetText +Clipboard | @wailsio/runtime

    Namespace Clipboard

    Index

    Functions

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Create.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Create.html index 7c2a30be3..6fbb8b41f 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Create.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Create.html @@ -1,4 +1,4 @@ -Create | @wailsio/runtime

    Namespace Create

    Index

    Functions

    Any +Create | @wailsio/runtime

    Namespace Create

    Index

    Functions

    Any Array ByteSlice Map diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Dialogs.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Dialogs.html index 1761825a6..9cc541f94 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Dialogs.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Dialogs.html @@ -1,4 +1,4 @@ -Dialogs | @wailsio/runtime

    Namespace Dialogs

    Index

    Interfaces

    Button +Dialogs | @wailsio/runtime

    Namespace Dialogs

    Index

    Interfaces

    Button FileFilter MessageDialogOptions OpenFileDialogOptions diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Events.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Events.html index 33cf3acfa..b44acdeb9 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Events.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Events.html @@ -1,4 +1,4 @@ -Events | @wailsio/runtime

    Namespace Events

    Index

    Classes

    WailsEvent +Events | @wailsio/runtime

    Namespace Events

    Index

    Classes

    Variables

    Functions

    Emit Off diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Flags.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Flags.html index 0b1dd1ae5..ff7622363 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Flags.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Flags.html @@ -1,2 +1,2 @@ -Flags | @wailsio/runtime

    Namespace Flags

    Index

    Functions

    GetFlag +Flags | @wailsio/runtime

    Namespace Flags

    Index

    Functions

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Screens.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Screens.html index c5203a448..0c5bce324 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Screens.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Screens.html @@ -1,4 +1,4 @@ -Screens | @wailsio/runtime

    Namespace Screens

    Index

    Interfaces

    Rect +Screens | @wailsio/runtime

    Namespace Screens

    Index

    Interfaces

    Functions

    GetAll diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/System.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/System.html index dd0778a5d..5ab2b4d7c 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/System.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/System.html @@ -1,4 +1,4 @@ -System | @wailsio/runtime

    Namespace System

    Index

    Interfaces

    EnvironmentInfo +System | @wailsio/runtime

    Namespace System

    Index

    Interfaces

    Functions

    Capabilities Environment diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/WML.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/WML.html index 2ae34fb48..69cff875d 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/WML.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/WML.html @@ -1,3 +1,3 @@ -WML | @wailsio/runtime

    Namespace WML

    Index

    Functions

    Enable +WML | @wailsio/runtime

    Namespace WML

    Index

    Functions

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Events.Types.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Events.Types.html index 4b56461ca..8c4daaf20 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Events.Types.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Events.Types.html @@ -1 +1 @@ -Types | @wailsio/runtime

    Variable TypesConst

    Types: {
        Common: {
            ApplicationOpenedWithFile: string;
            ApplicationStarted: string;
            ThemeChanged: string;
            WindowClosing: string;
            WindowDPIChanged: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowFilesDropped: string;
            WindowFocus: string;
            WindowFullscreen: string;
            WindowHide: string;
            WindowLostFocus: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowRestore: string;
            WindowRuntimeReady: string;
            WindowShow: string;
            WindowUnFullscreen: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowZoom: string;
            WindowZoomIn: string;
            WindowZoomOut: string;
            WindowZoomReset: string;
        };
        Linux: {
            ApplicationStartup: string;
            SystemThemeChanged: string;
            WindowDeleteEvent: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowFocusIn: string;
            WindowFocusOut: string;
            WindowLoadChanged: string;
        };
        Mac: {
            ApplicationDidBecomeActive: string;
            ApplicationDidChangeBackingProperties: string;
            ApplicationDidChangeEffectiveAppearance: string;
            ApplicationDidChangeIcon: string;
            ApplicationDidChangeOcclusionState: string;
            ApplicationDidChangeScreenParameters: string;
            ApplicationDidChangeStatusBarFrame: string;
            ApplicationDidChangeStatusBarOrientation: string;
            ApplicationDidChangeTheme: string;
            ApplicationDidFinishLaunching: string;
            ApplicationDidHide: string;
            ApplicationDidResignActive: string;
            ApplicationDidUnhide: string;
            ApplicationDidUpdate: string;
            ApplicationShouldHandleReopen: string;
            ApplicationWillBecomeActive: string;
            ApplicationWillFinishLaunching: string;
            ApplicationWillHide: string;
            ApplicationWillResignActive: string;
            ApplicationWillTerminate: string;
            ApplicationWillUnhide: string;
            ApplicationWillUpdate: string;
            MenuDidAddItem: string;
            MenuDidBeginTracking: string;
            MenuDidClose: string;
            MenuDidDisplayItem: string;
            MenuDidEndTracking: string;
            MenuDidHighlightItem: string;
            MenuDidOpen: string;
            MenuDidPopUp: string;
            MenuDidRemoveItem: string;
            MenuDidSendAction: string;
            MenuDidSendActionToItem: string;
            MenuDidUpdate: string;
            MenuWillAddItem: string;
            MenuWillBeginTracking: string;
            MenuWillDisplayItem: string;
            MenuWillEndTracking: string;
            MenuWillHighlightItem: string;
            MenuWillOpen: string;
            MenuWillPopUp: string;
            MenuWillRemoveItem: string;
            MenuWillSendAction: string;
            MenuWillSendActionToItem: string;
            MenuWillUpdate: string;
            WebViewDidCommitNavigation: string;
            WebViewDidFinishNavigation: string;
            WebViewDidReceiveServerRedirectForProvisionalNavigation: string;
            WebViewDidStartProvisionalNavigation: string;
            WindowDidBecomeKey: string;
            WindowDidBecomeMain: string;
            WindowDidBeginSheet: string;
            WindowDidChangeAlpha: string;
            WindowDidChangeBackingLocation: string;
            WindowDidChangeBackingProperties: string;
            WindowDidChangeCollectionBehavior: string;
            WindowDidChangeEffectiveAppearance: string;
            WindowDidChangeOcclusionState: string;
            WindowDidChangeOrderingMode: string;
            WindowDidChangeScreen: string;
            WindowDidChangeScreenParameters: string;
            WindowDidChangeScreenProfile: string;
            WindowDidChangeScreenSpace: string;
            WindowDidChangeScreenSpaceProperties: string;
            WindowDidChangeSharingType: string;
            WindowDidChangeSpace: string;
            WindowDidChangeSpaceOrderingMode: string;
            WindowDidChangeTitle: string;
            WindowDidChangeToolbar: string;
            WindowDidDeminiaturize: string;
            WindowDidEndSheet: string;
            WindowDidEnterFullScreen: string;
            WindowDidEnterVersionBrowser: string;
            WindowDidExitFullScreen: string;
            WindowDidExitVersionBrowser: string;
            WindowDidExpose: string;
            WindowDidFocus: string;
            WindowDidMiniaturize: string;
            WindowDidMove: string;
            WindowDidOrderOffScreen: string;
            WindowDidOrderOnScreen: string;
            WindowDidResignKey: string;
            WindowDidResignMain: string;
            WindowDidResize: string;
            WindowDidUpdate: string;
            WindowDidUpdateAlpha: string;
            WindowDidUpdateCollectionBehavior: string;
            WindowDidUpdateCollectionProperties: string;
            WindowDidUpdateShadow: string;
            WindowDidUpdateTitle: string;
            WindowDidUpdateToolbar: string;
            WindowDidZoom: string;
            WindowFileDraggingEntered: string;
            WindowFileDraggingExited: string;
            WindowFileDraggingPerformed: string;
            WindowHide: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowShouldClose: string;
            WindowShow: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowWillBecomeKey: string;
            WindowWillBecomeMain: string;
            WindowWillBeginSheet: string;
            WindowWillChangeOrderingMode: string;
            WindowWillClose: string;
            WindowWillDeminiaturize: string;
            WindowWillEnterFullScreen: string;
            WindowWillEnterVersionBrowser: string;
            WindowWillExitFullScreen: string;
            WindowWillExitVersionBrowser: string;
            WindowWillFocus: string;
            WindowWillMiniaturize: string;
            WindowWillMove: string;
            WindowWillOrderOffScreen: string;
            WindowWillOrderOnScreen: string;
            WindowWillResignMain: string;
            WindowWillResize: string;
            WindowWillUnfocus: string;
            WindowWillUpdate: string;
            WindowWillUpdateAlpha: string;
            WindowWillUpdateCollectionBehavior: string;
            WindowWillUpdateCollectionProperties: string;
            WindowWillUpdateShadow: string;
            WindowWillUpdateTitle: string;
            WindowWillUpdateToolbar: string;
            WindowWillUpdateVisibility: string;
            WindowWillUseStandardFrame: string;
            WindowZoomIn: string;
            WindowZoomOut: string;
            WindowZoomReset: string;
        };
        Windows: {
            APMPowerSettingChange: string;
            APMPowerStatusChange: string;
            APMResumeAutomatic: string;
            APMResumeSuspend: string;
            APMSuspend: string;
            ApplicationStarted: string;
            SystemThemeChanged: string;
            WebViewNavigationCompleted: string;
            WindowActive: string;
            WindowBackgroundErase: string;
            WindowClickActive: string;
            WindowClosing: string;
            WindowDPIChanged: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowDragDrop: string;
            WindowDragEnter: string;
            WindowDragLeave: string;
            WindowDragOver: string;
            WindowEndMove: string;
            WindowEndResize: string;
            WindowFullscreen: string;
            WindowHide: string;
            WindowInactive: string;
            WindowKeyDown: string;
            WindowKeyUp: string;
            WindowKillFocus: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowNonClientHit: string;
            WindowNonClientMouseDown: string;
            WindowNonClientMouseLeave: string;
            WindowNonClientMouseMove: string;
            WindowNonClientMouseUp: string;
            WindowPaint: string;
            WindowRestore: string;
            WindowSetFocus: string;
            WindowShow: string;
            WindowStartMove: string;
            WindowStartResize: string;
            WindowUnFullscreen: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowZOrderChanged: string;
        };
    } = EventTypes

    Type declaration

    • Common: {
          ApplicationOpenedWithFile: string;
          ApplicationStarted: string;
          ThemeChanged: string;
          WindowClosing: string;
          WindowDPIChanged: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowFilesDropped: string;
          WindowFocus: string;
          WindowFullscreen: string;
          WindowHide: string;
          WindowLostFocus: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowRestore: string;
          WindowRuntimeReady: string;
          WindowShow: string;
          WindowUnFullscreen: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowZoom: string;
          WindowZoomIn: string;
          WindowZoomOut: string;
          WindowZoomReset: string;
      }
      • ApplicationOpenedWithFile: string
      • ApplicationStarted: string
      • ThemeChanged: string
      • WindowClosing: string
      • WindowDPIChanged: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowFilesDropped: string
      • WindowFocus: string
      • WindowFullscreen: string
      • WindowHide: string
      • WindowLostFocus: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowRestore: string
      • WindowRuntimeReady: string
      • WindowShow: string
      • WindowUnFullscreen: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowZoom: string
      • WindowZoomIn: string
      • WindowZoomOut: string
      • WindowZoomReset: string
    • Linux: {
          ApplicationStartup: string;
          SystemThemeChanged: string;
          WindowDeleteEvent: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowFocusIn: string;
          WindowFocusOut: string;
          WindowLoadChanged: string;
      }
      • ApplicationStartup: string
      • SystemThemeChanged: string
      • WindowDeleteEvent: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowFocusIn: string
      • WindowFocusOut: string
      • WindowLoadChanged: string
    • Mac: {
          ApplicationDidBecomeActive: string;
          ApplicationDidChangeBackingProperties: string;
          ApplicationDidChangeEffectiveAppearance: string;
          ApplicationDidChangeIcon: string;
          ApplicationDidChangeOcclusionState: string;
          ApplicationDidChangeScreenParameters: string;
          ApplicationDidChangeStatusBarFrame: string;
          ApplicationDidChangeStatusBarOrientation: string;
          ApplicationDidChangeTheme: string;
          ApplicationDidFinishLaunching: string;
          ApplicationDidHide: string;
          ApplicationDidResignActive: string;
          ApplicationDidUnhide: string;
          ApplicationDidUpdate: string;
          ApplicationShouldHandleReopen: string;
          ApplicationWillBecomeActive: string;
          ApplicationWillFinishLaunching: string;
          ApplicationWillHide: string;
          ApplicationWillResignActive: string;
          ApplicationWillTerminate: string;
          ApplicationWillUnhide: string;
          ApplicationWillUpdate: string;
          MenuDidAddItem: string;
          MenuDidBeginTracking: string;
          MenuDidClose: string;
          MenuDidDisplayItem: string;
          MenuDidEndTracking: string;
          MenuDidHighlightItem: string;
          MenuDidOpen: string;
          MenuDidPopUp: string;
          MenuDidRemoveItem: string;
          MenuDidSendAction: string;
          MenuDidSendActionToItem: string;
          MenuDidUpdate: string;
          MenuWillAddItem: string;
          MenuWillBeginTracking: string;
          MenuWillDisplayItem: string;
          MenuWillEndTracking: string;
          MenuWillHighlightItem: string;
          MenuWillOpen: string;
          MenuWillPopUp: string;
          MenuWillRemoveItem: string;
          MenuWillSendAction: string;
          MenuWillSendActionToItem: string;
          MenuWillUpdate: string;
          WebViewDidCommitNavigation: string;
          WebViewDidFinishNavigation: string;
          WebViewDidReceiveServerRedirectForProvisionalNavigation: string;
          WebViewDidStartProvisionalNavigation: string;
          WindowDidBecomeKey: string;
          WindowDidBecomeMain: string;
          WindowDidBeginSheet: string;
          WindowDidChangeAlpha: string;
          WindowDidChangeBackingLocation: string;
          WindowDidChangeBackingProperties: string;
          WindowDidChangeCollectionBehavior: string;
          WindowDidChangeEffectiveAppearance: string;
          WindowDidChangeOcclusionState: string;
          WindowDidChangeOrderingMode: string;
          WindowDidChangeScreen: string;
          WindowDidChangeScreenParameters: string;
          WindowDidChangeScreenProfile: string;
          WindowDidChangeScreenSpace: string;
          WindowDidChangeScreenSpaceProperties: string;
          WindowDidChangeSharingType: string;
          WindowDidChangeSpace: string;
          WindowDidChangeSpaceOrderingMode: string;
          WindowDidChangeTitle: string;
          WindowDidChangeToolbar: string;
          WindowDidDeminiaturize: string;
          WindowDidEndSheet: string;
          WindowDidEnterFullScreen: string;
          WindowDidEnterVersionBrowser: string;
          WindowDidExitFullScreen: string;
          WindowDidExitVersionBrowser: string;
          WindowDidExpose: string;
          WindowDidFocus: string;
          WindowDidMiniaturize: string;
          WindowDidMove: string;
          WindowDidOrderOffScreen: string;
          WindowDidOrderOnScreen: string;
          WindowDidResignKey: string;
          WindowDidResignMain: string;
          WindowDidResize: string;
          WindowDidUpdate: string;
          WindowDidUpdateAlpha: string;
          WindowDidUpdateCollectionBehavior: string;
          WindowDidUpdateCollectionProperties: string;
          WindowDidUpdateShadow: string;
          WindowDidUpdateTitle: string;
          WindowDidUpdateToolbar: string;
          WindowDidZoom: string;
          WindowFileDraggingEntered: string;
          WindowFileDraggingExited: string;
          WindowFileDraggingPerformed: string;
          WindowHide: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowShouldClose: string;
          WindowShow: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowWillBecomeKey: string;
          WindowWillBecomeMain: string;
          WindowWillBeginSheet: string;
          WindowWillChangeOrderingMode: string;
          WindowWillClose: string;
          WindowWillDeminiaturize: string;
          WindowWillEnterFullScreen: string;
          WindowWillEnterVersionBrowser: string;
          WindowWillExitFullScreen: string;
          WindowWillExitVersionBrowser: string;
          WindowWillFocus: string;
          WindowWillMiniaturize: string;
          WindowWillMove: string;
          WindowWillOrderOffScreen: string;
          WindowWillOrderOnScreen: string;
          WindowWillResignMain: string;
          WindowWillResize: string;
          WindowWillUnfocus: string;
          WindowWillUpdate: string;
          WindowWillUpdateAlpha: string;
          WindowWillUpdateCollectionBehavior: string;
          WindowWillUpdateCollectionProperties: string;
          WindowWillUpdateShadow: string;
          WindowWillUpdateTitle: string;
          WindowWillUpdateToolbar: string;
          WindowWillUpdateVisibility: string;
          WindowWillUseStandardFrame: string;
          WindowZoomIn: string;
          WindowZoomOut: string;
          WindowZoomReset: string;
      }
      • ApplicationDidBecomeActive: string
      • ApplicationDidChangeBackingProperties: string
      • ApplicationDidChangeEffectiveAppearance: string
      • ApplicationDidChangeIcon: string
      • ApplicationDidChangeOcclusionState: string
      • ApplicationDidChangeScreenParameters: string
      • ApplicationDidChangeStatusBarFrame: string
      • ApplicationDidChangeStatusBarOrientation: string
      • ApplicationDidChangeTheme: string
      • ApplicationDidFinishLaunching: string
      • ApplicationDidHide: string
      • ApplicationDidResignActive: string
      • ApplicationDidUnhide: string
      • ApplicationDidUpdate: string
      • ApplicationShouldHandleReopen: string
      • ApplicationWillBecomeActive: string
      • ApplicationWillFinishLaunching: string
      • ApplicationWillHide: string
      • ApplicationWillResignActive: string
      • ApplicationWillTerminate: string
      • ApplicationWillUnhide: string
      • ApplicationWillUpdate: string
      • MenuDidAddItem: string
      • MenuDidBeginTracking: string
      • MenuDidClose: string
      • MenuDidDisplayItem: string
      • MenuDidEndTracking: string
      • MenuDidHighlightItem: string
      • MenuDidOpen: string
      • MenuDidPopUp: string
      • MenuDidRemoveItem: string
      • MenuDidSendAction: string
      • MenuDidSendActionToItem: string
      • MenuDidUpdate: string
      • MenuWillAddItem: string
      • MenuWillBeginTracking: string
      • MenuWillDisplayItem: string
      • MenuWillEndTracking: string
      • MenuWillHighlightItem: string
      • MenuWillOpen: string
      • MenuWillPopUp: string
      • MenuWillRemoveItem: string
      • MenuWillSendAction: string
      • MenuWillSendActionToItem: string
      • MenuWillUpdate: string
      • WebViewDidCommitNavigation: string
      • WebViewDidFinishNavigation: string
      • WebViewDidReceiveServerRedirectForProvisionalNavigation: string
      • WebViewDidStartProvisionalNavigation: string
      • WindowDidBecomeKey: string
      • WindowDidBecomeMain: string
      • WindowDidBeginSheet: string
      • WindowDidChangeAlpha: string
      • WindowDidChangeBackingLocation: string
      • WindowDidChangeBackingProperties: string
      • WindowDidChangeCollectionBehavior: string
      • WindowDidChangeEffectiveAppearance: string
      • WindowDidChangeOcclusionState: string
      • WindowDidChangeOrderingMode: string
      • WindowDidChangeScreen: string
      • WindowDidChangeScreenParameters: string
      • WindowDidChangeScreenProfile: string
      • WindowDidChangeScreenSpace: string
      • WindowDidChangeScreenSpaceProperties: string
      • WindowDidChangeSharingType: string
      • WindowDidChangeSpace: string
      • WindowDidChangeSpaceOrderingMode: string
      • WindowDidChangeTitle: string
      • WindowDidChangeToolbar: string
      • WindowDidDeminiaturize: string
      • WindowDidEndSheet: string
      • WindowDidEnterFullScreen: string
      • WindowDidEnterVersionBrowser: string
      • WindowDidExitFullScreen: string
      • WindowDidExitVersionBrowser: string
      • WindowDidExpose: string
      • WindowDidFocus: string
      • WindowDidMiniaturize: string
      • WindowDidMove: string
      • WindowDidOrderOffScreen: string
      • WindowDidOrderOnScreen: string
      • WindowDidResignKey: string
      • WindowDidResignMain: string
      • WindowDidResize: string
      • WindowDidUpdate: string
      • WindowDidUpdateAlpha: string
      • WindowDidUpdateCollectionBehavior: string
      • WindowDidUpdateCollectionProperties: string
      • WindowDidUpdateShadow: string
      • WindowDidUpdateTitle: string
      • WindowDidUpdateToolbar: string
      • WindowDidZoom: string
      • WindowFileDraggingEntered: string
      • WindowFileDraggingExited: string
      • WindowFileDraggingPerformed: string
      • WindowHide: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowShouldClose: string
      • WindowShow: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowWillBecomeKey: string
      • WindowWillBecomeMain: string
      • WindowWillBeginSheet: string
      • WindowWillChangeOrderingMode: string
      • WindowWillClose: string
      • WindowWillDeminiaturize: string
      • WindowWillEnterFullScreen: string
      • WindowWillEnterVersionBrowser: string
      • WindowWillExitFullScreen: string
      • WindowWillExitVersionBrowser: string
      • WindowWillFocus: string
      • WindowWillMiniaturize: string
      • WindowWillMove: string
      • WindowWillOrderOffScreen: string
      • WindowWillOrderOnScreen: string
      • WindowWillResignMain: string
      • WindowWillResize: string
      • WindowWillUnfocus: string
      • WindowWillUpdate: string
      • WindowWillUpdateAlpha: string
      • WindowWillUpdateCollectionBehavior: string
      • WindowWillUpdateCollectionProperties: string
      • WindowWillUpdateShadow: string
      • WindowWillUpdateTitle: string
      • WindowWillUpdateToolbar: string
      • WindowWillUpdateVisibility: string
      • WindowWillUseStandardFrame: string
      • WindowZoomIn: string
      • WindowZoomOut: string
      • WindowZoomReset: string
    • Windows: {
          APMPowerSettingChange: string;
          APMPowerStatusChange: string;
          APMResumeAutomatic: string;
          APMResumeSuspend: string;
          APMSuspend: string;
          ApplicationStarted: string;
          SystemThemeChanged: string;
          WebViewNavigationCompleted: string;
          WindowActive: string;
          WindowBackgroundErase: string;
          WindowClickActive: string;
          WindowClosing: string;
          WindowDPIChanged: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowDragDrop: string;
          WindowDragEnter: string;
          WindowDragLeave: string;
          WindowDragOver: string;
          WindowEndMove: string;
          WindowEndResize: string;
          WindowFullscreen: string;
          WindowHide: string;
          WindowInactive: string;
          WindowKeyDown: string;
          WindowKeyUp: string;
          WindowKillFocus: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowNonClientHit: string;
          WindowNonClientMouseDown: string;
          WindowNonClientMouseLeave: string;
          WindowNonClientMouseMove: string;
          WindowNonClientMouseUp: string;
          WindowPaint: string;
          WindowRestore: string;
          WindowSetFocus: string;
          WindowShow: string;
          WindowStartMove: string;
          WindowStartResize: string;
          WindowUnFullscreen: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowZOrderChanged: string;
      }
      • APMPowerSettingChange: string
      • APMPowerStatusChange: string
      • APMResumeAutomatic: string
      • APMResumeSuspend: string
      • APMSuspend: string
      • ApplicationStarted: string
      • SystemThemeChanged: string
      • WebViewNavigationCompleted: string
      • WindowActive: string
      • WindowBackgroundErase: string
      • WindowClickActive: string
      • WindowClosing: string
      • WindowDPIChanged: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowDragDrop: string
      • WindowDragEnter: string
      • WindowDragLeave: string
      • WindowDragOver: string
      • WindowEndMove: string
      • WindowEndResize: string
      • WindowFullscreen: string
      • WindowHide: string
      • WindowInactive: string
      • WindowKeyDown: string
      • WindowKeyUp: string
      • WindowKillFocus: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowNonClientHit: string
      • WindowNonClientMouseDown: string
      • WindowNonClientMouseLeave: string
      • WindowNonClientMouseMove: string
      • WindowNonClientMouseUp: string
      • WindowPaint: string
      • WindowRestore: string
      • WindowSetFocus: string
      • WindowShow: string
      • WindowStartMove: string
      • WindowStartResize: string
      • WindowUnFullscreen: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowZOrderChanged: string

    Generated using TypeDoc

    \ No newline at end of file +Types | @wailsio/runtime

    Variable TypesConst

    Types: {
        Common: {
            ApplicationOpenedWithFile: string;
            ApplicationStarted: string;
            ThemeChanged: string;
            WindowClosing: string;
            WindowDPIChanged: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowFilesDropped: string;
            WindowFocus: string;
            WindowFullscreen: string;
            WindowHide: string;
            WindowLostFocus: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowRestore: string;
            WindowRuntimeReady: string;
            WindowShow: string;
            WindowUnFullscreen: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowZoom: string;
            WindowZoomIn: string;
            WindowZoomOut: string;
            WindowZoomReset: string;
        };
        Linux: {
            ApplicationStartup: string;
            SystemThemeChanged: string;
            WindowDeleteEvent: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowFocusIn: string;
            WindowFocusOut: string;
            WindowLoadChanged: string;
        };
        Mac: {
            ApplicationDidBecomeActive: string;
            ApplicationDidChangeBackingProperties: string;
            ApplicationDidChangeEffectiveAppearance: string;
            ApplicationDidChangeIcon: string;
            ApplicationDidChangeOcclusionState: string;
            ApplicationDidChangeScreenParameters: string;
            ApplicationDidChangeStatusBarFrame: string;
            ApplicationDidChangeStatusBarOrientation: string;
            ApplicationDidChangeTheme: string;
            ApplicationDidFinishLaunching: string;
            ApplicationDidHide: string;
            ApplicationDidResignActive: string;
            ApplicationDidUnhide: string;
            ApplicationDidUpdate: string;
            ApplicationShouldHandleReopen: string;
            ApplicationWillBecomeActive: string;
            ApplicationWillFinishLaunching: string;
            ApplicationWillHide: string;
            ApplicationWillResignActive: string;
            ApplicationWillTerminate: string;
            ApplicationWillUnhide: string;
            ApplicationWillUpdate: string;
            MenuDidAddItem: string;
            MenuDidBeginTracking: string;
            MenuDidClose: string;
            MenuDidDisplayItem: string;
            MenuDidEndTracking: string;
            MenuDidHighlightItem: string;
            MenuDidOpen: string;
            MenuDidPopUp: string;
            MenuDidRemoveItem: string;
            MenuDidSendAction: string;
            MenuDidSendActionToItem: string;
            MenuDidUpdate: string;
            MenuWillAddItem: string;
            MenuWillBeginTracking: string;
            MenuWillDisplayItem: string;
            MenuWillEndTracking: string;
            MenuWillHighlightItem: string;
            MenuWillOpen: string;
            MenuWillPopUp: string;
            MenuWillRemoveItem: string;
            MenuWillSendAction: string;
            MenuWillSendActionToItem: string;
            MenuWillUpdate: string;
            WebViewDidCommitNavigation: string;
            WebViewDidFinishNavigation: string;
            WebViewDidReceiveServerRedirectForProvisionalNavigation: string;
            WebViewDidStartProvisionalNavigation: string;
            WindowDidBecomeKey: string;
            WindowDidBecomeMain: string;
            WindowDidBeginSheet: string;
            WindowDidChangeAlpha: string;
            WindowDidChangeBackingLocation: string;
            WindowDidChangeBackingProperties: string;
            WindowDidChangeCollectionBehavior: string;
            WindowDidChangeEffectiveAppearance: string;
            WindowDidChangeOcclusionState: string;
            WindowDidChangeOrderingMode: string;
            WindowDidChangeScreen: string;
            WindowDidChangeScreenParameters: string;
            WindowDidChangeScreenProfile: string;
            WindowDidChangeScreenSpace: string;
            WindowDidChangeScreenSpaceProperties: string;
            WindowDidChangeSharingType: string;
            WindowDidChangeSpace: string;
            WindowDidChangeSpaceOrderingMode: string;
            WindowDidChangeTitle: string;
            WindowDidChangeToolbar: string;
            WindowDidDeminiaturize: string;
            WindowDidEndSheet: string;
            WindowDidEnterFullScreen: string;
            WindowDidEnterVersionBrowser: string;
            WindowDidExitFullScreen: string;
            WindowDidExitVersionBrowser: string;
            WindowDidExpose: string;
            WindowDidFocus: string;
            WindowDidMiniaturize: string;
            WindowDidMove: string;
            WindowDidOrderOffScreen: string;
            WindowDidOrderOnScreen: string;
            WindowDidResignKey: string;
            WindowDidResignMain: string;
            WindowDidResize: string;
            WindowDidUpdate: string;
            WindowDidUpdateAlpha: string;
            WindowDidUpdateCollectionBehavior: string;
            WindowDidUpdateCollectionProperties: string;
            WindowDidUpdateShadow: string;
            WindowDidUpdateTitle: string;
            WindowDidUpdateToolbar: string;
            WindowDidZoom: string;
            WindowFileDraggingEntered: string;
            WindowFileDraggingExited: string;
            WindowFileDraggingPerformed: string;
            WindowHide: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowShouldClose: string;
            WindowShow: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowWillBecomeKey: string;
            WindowWillBecomeMain: string;
            WindowWillBeginSheet: string;
            WindowWillChangeOrderingMode: string;
            WindowWillClose: string;
            WindowWillDeminiaturize: string;
            WindowWillEnterFullScreen: string;
            WindowWillEnterVersionBrowser: string;
            WindowWillExitFullScreen: string;
            WindowWillExitVersionBrowser: string;
            WindowWillFocus: string;
            WindowWillMiniaturize: string;
            WindowWillMove: string;
            WindowWillOrderOffScreen: string;
            WindowWillOrderOnScreen: string;
            WindowWillResignMain: string;
            WindowWillResize: string;
            WindowWillUnfocus: string;
            WindowWillUpdate: string;
            WindowWillUpdateAlpha: string;
            WindowWillUpdateCollectionBehavior: string;
            WindowWillUpdateCollectionProperties: string;
            WindowWillUpdateShadow: string;
            WindowWillUpdateTitle: string;
            WindowWillUpdateToolbar: string;
            WindowWillUpdateVisibility: string;
            WindowWillUseStandardFrame: string;
            WindowZoomIn: string;
            WindowZoomOut: string;
            WindowZoomReset: string;
        };
        Windows: {
            APMPowerSettingChange: string;
            APMPowerStatusChange: string;
            APMResumeAutomatic: string;
            APMResumeSuspend: string;
            APMSuspend: string;
            ApplicationStarted: string;
            SystemThemeChanged: string;
            WebViewNavigationCompleted: string;
            WindowActive: string;
            WindowBackgroundErase: string;
            WindowClickActive: string;
            WindowClosing: string;
            WindowDPIChanged: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowDragDrop: string;
            WindowDragEnter: string;
            WindowDragLeave: string;
            WindowDragOver: string;
            WindowEndMove: string;
            WindowEndResize: string;
            WindowFullscreen: string;
            WindowHide: string;
            WindowInactive: string;
            WindowKeyDown: string;
            WindowKeyUp: string;
            WindowKillFocus: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowNonClientHit: string;
            WindowNonClientMouseDown: string;
            WindowNonClientMouseLeave: string;
            WindowNonClientMouseMove: string;
            WindowNonClientMouseUp: string;
            WindowPaint: string;
            WindowRestore: string;
            WindowSetFocus: string;
            WindowShow: string;
            WindowStartMove: string;
            WindowStartResize: string;
            WindowUnFullscreen: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowZOrderChanged: string;
        };
    } = EventTypes

    Type declaration

    • Common: {
          ApplicationOpenedWithFile: string;
          ApplicationStarted: string;
          ThemeChanged: string;
          WindowClosing: string;
          WindowDPIChanged: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowFilesDropped: string;
          WindowFocus: string;
          WindowFullscreen: string;
          WindowHide: string;
          WindowLostFocus: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowRestore: string;
          WindowRuntimeReady: string;
          WindowShow: string;
          WindowUnFullscreen: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowZoom: string;
          WindowZoomIn: string;
          WindowZoomOut: string;
          WindowZoomReset: string;
      }
      • ApplicationOpenedWithFile: string
      • ApplicationStarted: string
      • ThemeChanged: string
      • WindowClosing: string
      • WindowDPIChanged: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowFilesDropped: string
      • WindowFocus: string
      • WindowFullscreen: string
      • WindowHide: string
      • WindowLostFocus: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowRestore: string
      • WindowRuntimeReady: string
      • WindowShow: string
      • WindowUnFullscreen: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowZoom: string
      • WindowZoomIn: string
      • WindowZoomOut: string
      • WindowZoomReset: string
    • Linux: {
          ApplicationStartup: string;
          SystemThemeChanged: string;
          WindowDeleteEvent: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowFocusIn: string;
          WindowFocusOut: string;
          WindowLoadChanged: string;
      }
      • ApplicationStartup: string
      • SystemThemeChanged: string
      • WindowDeleteEvent: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowFocusIn: string
      • WindowFocusOut: string
      • WindowLoadChanged: string
    • Mac: {
          ApplicationDidBecomeActive: string;
          ApplicationDidChangeBackingProperties: string;
          ApplicationDidChangeEffectiveAppearance: string;
          ApplicationDidChangeIcon: string;
          ApplicationDidChangeOcclusionState: string;
          ApplicationDidChangeScreenParameters: string;
          ApplicationDidChangeStatusBarFrame: string;
          ApplicationDidChangeStatusBarOrientation: string;
          ApplicationDidChangeTheme: string;
          ApplicationDidFinishLaunching: string;
          ApplicationDidHide: string;
          ApplicationDidResignActive: string;
          ApplicationDidUnhide: string;
          ApplicationDidUpdate: string;
          ApplicationShouldHandleReopen: string;
          ApplicationWillBecomeActive: string;
          ApplicationWillFinishLaunching: string;
          ApplicationWillHide: string;
          ApplicationWillResignActive: string;
          ApplicationWillTerminate: string;
          ApplicationWillUnhide: string;
          ApplicationWillUpdate: string;
          MenuDidAddItem: string;
          MenuDidBeginTracking: string;
          MenuDidClose: string;
          MenuDidDisplayItem: string;
          MenuDidEndTracking: string;
          MenuDidHighlightItem: string;
          MenuDidOpen: string;
          MenuDidPopUp: string;
          MenuDidRemoveItem: string;
          MenuDidSendAction: string;
          MenuDidSendActionToItem: string;
          MenuDidUpdate: string;
          MenuWillAddItem: string;
          MenuWillBeginTracking: string;
          MenuWillDisplayItem: string;
          MenuWillEndTracking: string;
          MenuWillHighlightItem: string;
          MenuWillOpen: string;
          MenuWillPopUp: string;
          MenuWillRemoveItem: string;
          MenuWillSendAction: string;
          MenuWillSendActionToItem: string;
          MenuWillUpdate: string;
          WebViewDidCommitNavigation: string;
          WebViewDidFinishNavigation: string;
          WebViewDidReceiveServerRedirectForProvisionalNavigation: string;
          WebViewDidStartProvisionalNavigation: string;
          WindowDidBecomeKey: string;
          WindowDidBecomeMain: string;
          WindowDidBeginSheet: string;
          WindowDidChangeAlpha: string;
          WindowDidChangeBackingLocation: string;
          WindowDidChangeBackingProperties: string;
          WindowDidChangeCollectionBehavior: string;
          WindowDidChangeEffectiveAppearance: string;
          WindowDidChangeOcclusionState: string;
          WindowDidChangeOrderingMode: string;
          WindowDidChangeScreen: string;
          WindowDidChangeScreenParameters: string;
          WindowDidChangeScreenProfile: string;
          WindowDidChangeScreenSpace: string;
          WindowDidChangeScreenSpaceProperties: string;
          WindowDidChangeSharingType: string;
          WindowDidChangeSpace: string;
          WindowDidChangeSpaceOrderingMode: string;
          WindowDidChangeTitle: string;
          WindowDidChangeToolbar: string;
          WindowDidDeminiaturize: string;
          WindowDidEndSheet: string;
          WindowDidEnterFullScreen: string;
          WindowDidEnterVersionBrowser: string;
          WindowDidExitFullScreen: string;
          WindowDidExitVersionBrowser: string;
          WindowDidExpose: string;
          WindowDidFocus: string;
          WindowDidMiniaturize: string;
          WindowDidMove: string;
          WindowDidOrderOffScreen: string;
          WindowDidOrderOnScreen: string;
          WindowDidResignKey: string;
          WindowDidResignMain: string;
          WindowDidResize: string;
          WindowDidUpdate: string;
          WindowDidUpdateAlpha: string;
          WindowDidUpdateCollectionBehavior: string;
          WindowDidUpdateCollectionProperties: string;
          WindowDidUpdateShadow: string;
          WindowDidUpdateTitle: string;
          WindowDidUpdateToolbar: string;
          WindowDidZoom: string;
          WindowFileDraggingEntered: string;
          WindowFileDraggingExited: string;
          WindowFileDraggingPerformed: string;
          WindowHide: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowShouldClose: string;
          WindowShow: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowWillBecomeKey: string;
          WindowWillBecomeMain: string;
          WindowWillBeginSheet: string;
          WindowWillChangeOrderingMode: string;
          WindowWillClose: string;
          WindowWillDeminiaturize: string;
          WindowWillEnterFullScreen: string;
          WindowWillEnterVersionBrowser: string;
          WindowWillExitFullScreen: string;
          WindowWillExitVersionBrowser: string;
          WindowWillFocus: string;
          WindowWillMiniaturize: string;
          WindowWillMove: string;
          WindowWillOrderOffScreen: string;
          WindowWillOrderOnScreen: string;
          WindowWillResignMain: string;
          WindowWillResize: string;
          WindowWillUnfocus: string;
          WindowWillUpdate: string;
          WindowWillUpdateAlpha: string;
          WindowWillUpdateCollectionBehavior: string;
          WindowWillUpdateCollectionProperties: string;
          WindowWillUpdateShadow: string;
          WindowWillUpdateTitle: string;
          WindowWillUpdateToolbar: string;
          WindowWillUpdateVisibility: string;
          WindowWillUseStandardFrame: string;
          WindowZoomIn: string;
          WindowZoomOut: string;
          WindowZoomReset: string;
      }
      • ApplicationDidBecomeActive: string
      • ApplicationDidChangeBackingProperties: string
      • ApplicationDidChangeEffectiveAppearance: string
      • ApplicationDidChangeIcon: string
      • ApplicationDidChangeOcclusionState: string
      • ApplicationDidChangeScreenParameters: string
      • ApplicationDidChangeStatusBarFrame: string
      • ApplicationDidChangeStatusBarOrientation: string
      • ApplicationDidChangeTheme: string
      • ApplicationDidFinishLaunching: string
      • ApplicationDidHide: string
      • ApplicationDidResignActive: string
      • ApplicationDidUnhide: string
      • ApplicationDidUpdate: string
      • ApplicationShouldHandleReopen: string
      • ApplicationWillBecomeActive: string
      • ApplicationWillFinishLaunching: string
      • ApplicationWillHide: string
      • ApplicationWillResignActive: string
      • ApplicationWillTerminate: string
      • ApplicationWillUnhide: string
      • ApplicationWillUpdate: string
      • MenuDidAddItem: string
      • MenuDidBeginTracking: string
      • MenuDidClose: string
      • MenuDidDisplayItem: string
      • MenuDidEndTracking: string
      • MenuDidHighlightItem: string
      • MenuDidOpen: string
      • MenuDidPopUp: string
      • MenuDidRemoveItem: string
      • MenuDidSendAction: string
      • MenuDidSendActionToItem: string
      • MenuDidUpdate: string
      • MenuWillAddItem: string
      • MenuWillBeginTracking: string
      • MenuWillDisplayItem: string
      • MenuWillEndTracking: string
      • MenuWillHighlightItem: string
      • MenuWillOpen: string
      • MenuWillPopUp: string
      • MenuWillRemoveItem: string
      • MenuWillSendAction: string
      • MenuWillSendActionToItem: string
      • MenuWillUpdate: string
      • WebViewDidCommitNavigation: string
      • WebViewDidFinishNavigation: string
      • WebViewDidReceiveServerRedirectForProvisionalNavigation: string
      • WebViewDidStartProvisionalNavigation: string
      • WindowDidBecomeKey: string
      • WindowDidBecomeMain: string
      • WindowDidBeginSheet: string
      • WindowDidChangeAlpha: string
      • WindowDidChangeBackingLocation: string
      • WindowDidChangeBackingProperties: string
      • WindowDidChangeCollectionBehavior: string
      • WindowDidChangeEffectiveAppearance: string
      • WindowDidChangeOcclusionState: string
      • WindowDidChangeOrderingMode: string
      • WindowDidChangeScreen: string
      • WindowDidChangeScreenParameters: string
      • WindowDidChangeScreenProfile: string
      • WindowDidChangeScreenSpace: string
      • WindowDidChangeScreenSpaceProperties: string
      • WindowDidChangeSharingType: string
      • WindowDidChangeSpace: string
      • WindowDidChangeSpaceOrderingMode: string
      • WindowDidChangeTitle: string
      • WindowDidChangeToolbar: string
      • WindowDidDeminiaturize: string
      • WindowDidEndSheet: string
      • WindowDidEnterFullScreen: string
      • WindowDidEnterVersionBrowser: string
      • WindowDidExitFullScreen: string
      • WindowDidExitVersionBrowser: string
      • WindowDidExpose: string
      • WindowDidFocus: string
      • WindowDidMiniaturize: string
      • WindowDidMove: string
      • WindowDidOrderOffScreen: string
      • WindowDidOrderOnScreen: string
      • WindowDidResignKey: string
      • WindowDidResignMain: string
      • WindowDidResize: string
      • WindowDidUpdate: string
      • WindowDidUpdateAlpha: string
      • WindowDidUpdateCollectionBehavior: string
      • WindowDidUpdateCollectionProperties: string
      • WindowDidUpdateShadow: string
      • WindowDidUpdateTitle: string
      • WindowDidUpdateToolbar: string
      • WindowDidZoom: string
      • WindowFileDraggingEntered: string
      • WindowFileDraggingExited: string
      • WindowFileDraggingPerformed: string
      • WindowHide: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowShouldClose: string
      • WindowShow: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowWillBecomeKey: string
      • WindowWillBecomeMain: string
      • WindowWillBeginSheet: string
      • WindowWillChangeOrderingMode: string
      • WindowWillClose: string
      • WindowWillDeminiaturize: string
      • WindowWillEnterFullScreen: string
      • WindowWillEnterVersionBrowser: string
      • WindowWillExitFullScreen: string
      • WindowWillExitVersionBrowser: string
      • WindowWillFocus: string
      • WindowWillMiniaturize: string
      • WindowWillMove: string
      • WindowWillOrderOffScreen: string
      • WindowWillOrderOnScreen: string
      • WindowWillResignMain: string
      • WindowWillResize: string
      • WindowWillUnfocus: string
      • WindowWillUpdate: string
      • WindowWillUpdateAlpha: string
      • WindowWillUpdateCollectionBehavior: string
      • WindowWillUpdateCollectionProperties: string
      • WindowWillUpdateShadow: string
      • WindowWillUpdateTitle: string
      • WindowWillUpdateToolbar: string
      • WindowWillUpdateVisibility: string
      • WindowWillUseStandardFrame: string
      • WindowZoomIn: string
      • WindowZoomOut: string
      • WindowZoomReset: string
    • Windows: {
          APMPowerSettingChange: string;
          APMPowerStatusChange: string;
          APMResumeAutomatic: string;
          APMResumeSuspend: string;
          APMSuspend: string;
          ApplicationStarted: string;
          SystemThemeChanged: string;
          WebViewNavigationCompleted: string;
          WindowActive: string;
          WindowBackgroundErase: string;
          WindowClickActive: string;
          WindowClosing: string;
          WindowDPIChanged: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowDragDrop: string;
          WindowDragEnter: string;
          WindowDragLeave: string;
          WindowDragOver: string;
          WindowEndMove: string;
          WindowEndResize: string;
          WindowFullscreen: string;
          WindowHide: string;
          WindowInactive: string;
          WindowKeyDown: string;
          WindowKeyUp: string;
          WindowKillFocus: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowNonClientHit: string;
          WindowNonClientMouseDown: string;
          WindowNonClientMouseLeave: string;
          WindowNonClientMouseMove: string;
          WindowNonClientMouseUp: string;
          WindowPaint: string;
          WindowRestore: string;
          WindowSetFocus: string;
          WindowShow: string;
          WindowStartMove: string;
          WindowStartResize: string;
          WindowUnFullscreen: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowZOrderChanged: string;
      }
      • APMPowerSettingChange: string
      • APMPowerStatusChange: string
      • APMResumeAutomatic: string
      • APMResumeSuspend: string
      • APMSuspend: string
      • ApplicationStarted: string
      • SystemThemeChanged: string
      • WebViewNavigationCompleted: string
      • WindowActive: string
      • WindowBackgroundErase: string
      • WindowClickActive: string
      • WindowClosing: string
      • WindowDPIChanged: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowDragDrop: string
      • WindowDragEnter: string
      • WindowDragLeave: string
      • WindowDragOver: string
      • WindowEndMove: string
      • WindowEndResize: string
      • WindowFullscreen: string
      • WindowHide: string
      • WindowInactive: string
      • WindowKeyDown: string
      • WindowKeyUp: string
      • WindowKillFocus: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowNonClientHit: string
      • WindowNonClientMouseDown: string
      • WindowNonClientMouseLeave: string
      • WindowNonClientMouseMove: string
      • WindowNonClientMouseUp: string
      • WindowPaint: string
      • WindowRestore: string
      • WindowSetFocus: string
      • WindowShow: string
      • WindowStartMove: string
      • WindowStartResize: string
      • WindowUnFullscreen: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowZOrderChanged: string

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Window.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Window.html index e9774d5c3..fe8bec18d 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Window.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Window.html @@ -1,2 +1,2 @@ Window | @wailsio/runtime

    Variable WindowConst

    Window: Window = ...

    The window within which the script is running.

    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/package-lock.json b/v3/internal/runtime/desktop/@wailsio/runtime/package-lock.json index 9f8307460..62e3542b3 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/package-lock.json +++ b/v3/internal/runtime/desktop/@wailsio/runtime/package-lock.json @@ -1,12 +1,12 @@ { "name": "@wailsio/runtime", - "version": "3.0.0-alpha.55", + "version": "3.0.0-alpha.60", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@wailsio/runtime", - "version": "3.0.0-alpha.55", + "version": "3.0.0-alpha.60", "license": "MIT", "devDependencies": { "rimraf": "^5.0.5", diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/package.json b/v3/internal/runtime/desktop/@wailsio/runtime/package.json index 122cf4ada..09d2b2f96 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/package.json +++ b/v3/internal/runtime/desktop/@wailsio/runtime/package.json @@ -1,7 +1,7 @@ { "name": "@wailsio/runtime", "type": "module", - "version": "3.0.0-alpha.59", + "version": "3.0.0-alpha.60", "description": "Wails Runtime", "types": "types/index.d.ts", "exports": { From 9ee2ca51d43c2f1c580f660bbd33154f3baa7d93 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Fri, 28 Feb 2025 07:06:23 +1100 Subject: [PATCH 102/374] [ci] update PR Checks conditions --- .github/workflows/build-and-test-v3.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/build-and-test-v3.yml b/.github/workflows/build-and-test-v3.yml index ad773fb68..c3278f6e1 100644 --- a/.github/workflows/build-and-test-v3.yml +++ b/.github/workflows/build-and-test-v3.yml @@ -3,8 +3,12 @@ name: Build + Test v3 on: pull_request: types: [opened, synchronize, reopened, ready_for_review] + branches: + - v3-alpha pull_request_review: types: [submitted] + branches: + - v3-alpha jobs: check_approval: From 2dcd35f181e03fe5a20556c4d8221fbea788fdac Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Thu, 27 Feb 2025 20:07:10 +0000 Subject: [PATCH 103/374] [skip ci] Publish @wailsio/runtime v3.0.0-alpha.61 --- .../docs/classes/Call.RuntimeError.html | 4 +-- .../docs/classes/Events.WailsEvent.html | 4 +-- .../docs/functions/Application.Hide.html | 2 +- .../docs/functions/Application.Quit.html | 2 +- .../docs/functions/Application.Show.html | 2 +- .../docs/functions/Browser.OpenURL.html | 2 +- .../runtime/docs/functions/Call.ByID.html | 2 +- .../runtime/docs/functions/Call.ByName.html | 2 +- .../runtime/docs/functions/Call.Call.html | 2 +- .../docs/functions/Clipboard.SetText.html | 2 +- .../docs/functions/Clipboard.Text.html | 2 +- .../runtime/docs/functions/Create.Any.html | 2 +- .../runtime/docs/functions/Create.Array.html | 2 +- .../docs/functions/Create.ByteSlice.html | 2 +- .../runtime/docs/functions/Create.Map.html | 2 +- .../docs/functions/Create.Nullable.html | 2 +- .../runtime/docs/functions/Create.Struct.html | 2 +- .../runtime/docs/functions/Dialogs.Error.html | 2 +- .../runtime/docs/functions/Dialogs.Info.html | 2 +- .../docs/functions/Dialogs.OpenFile.html | 2 +- .../docs/functions/Dialogs.Question.html | 2 +- .../docs/functions/Dialogs.SaveFile.html | 2 +- .../docs/functions/Dialogs.Warning.html | 2 +- .../runtime/docs/functions/Events.Emit.html | 2 +- .../runtime/docs/functions/Events.Off.html | 2 +- .../runtime/docs/functions/Events.OffAll.html | 2 +- .../runtime/docs/functions/Events.On.html | 2 +- .../docs/functions/Events.OnMultiple.html | 2 +- .../runtime/docs/functions/Events.Once.html | 2 +- .../runtime/docs/functions/Events.setup.html | 2 +- .../runtime/docs/functions/Flags.GetFlag.html | 2 +- .../docs/functions/Screens.GetAll.html | 2 +- .../docs/functions/Screens.GetCurrent.html | 2 +- .../docs/functions/Screens.GetPrimary.html | 2 +- .../docs/functions/System.Capabilities.html | 2 +- .../docs/functions/System.Environment.html | 2 +- .../docs/functions/System.IsAMD64.html | 2 +- .../runtime/docs/functions/System.IsARM.html | 2 +- .../docs/functions/System.IsARM64.html | 2 +- .../docs/functions/System.IsDarkMode.html | 2 +- .../docs/functions/System.IsDebug.html | 2 +- .../docs/functions/System.IsLinux.html | 2 +- .../runtime/docs/functions/System.IsMac.html | 2 +- .../docs/functions/System.IsWindows.html | 2 +- .../runtime/docs/functions/System.invoke.html | 2 +- .../runtime/docs/functions/WML.Enable.html | 2 +- .../runtime/docs/functions/WML.Reload.html | 2 +- .../@wailsio/runtime/docs/functions/init.html | 2 +- .../docs/interfaces/Call.CallOptions.html | 8 ++--- .../docs/interfaces/Dialogs.Button.html | 8 ++--- .../docs/interfaces/Dialogs.FileFilter.html | 6 ++-- .../Dialogs.MessageDialogOptions.html | 10 +++--- .../Dialogs.OpenFileDialogOptions.html | 34 +++++++++--------- .../Dialogs.SaveFileDialogOptions.html | 36 +++++++++---------- .../runtime/docs/interfaces/Screens.Rect.html | 10 +++--- .../docs/interfaces/Screens.Screen.html | 26 +++++++------- .../runtime/docs/interfaces/Screens.Size.html | 6 ++-- .../interfaces/System.EnvironmentInfo.html | 12 +++---- .../docs/interfaces/System.OSInfo.html | 10 +++--- .../runtime/docs/modules/Application.html | 2 +- .../runtime/docs/modules/Browser.html | 2 +- .../@wailsio/runtime/docs/modules/Call.html | 2 +- .../runtime/docs/modules/Clipboard.html | 2 +- .../@wailsio/runtime/docs/modules/Create.html | 2 +- .../runtime/docs/modules/Dialogs.html | 2 +- .../@wailsio/runtime/docs/modules/Events.html | 2 +- .../@wailsio/runtime/docs/modules/Flags.html | 2 +- .../runtime/docs/modules/Screens.html | 2 +- .../@wailsio/runtime/docs/modules/System.html | 2 +- .../@wailsio/runtime/docs/modules/WML.html | 2 +- .../runtime/docs/variables/Events.Types.html | 2 +- .../runtime/docs/variables/Window.html | 2 +- .../@wailsio/runtime/package-lock.json | 4 +-- .../desktop/@wailsio/runtime/package.json | 2 +- 74 files changed, 149 insertions(+), 149 deletions(-) diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Call.RuntimeError.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Call.RuntimeError.html index 43a152d4b..8b7aa6d26 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Call.RuntimeError.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Call.RuntimeError.html @@ -1,6 +1,6 @@ RuntimeError | @wailsio/runtime

    Exception class that will be thrown in case the bound method returns an error. The value of the RuntimeError#name property is "RuntimeError".

    -

    Hierarchy

    • Error
      • RuntimeError

    Constructors

    Hierarchy

    • Error
      • RuntimeError

    Constructors

    Properties

    cause? message name @@ -8,4 +8,4 @@ The value of the

    Constructors

    • Constructs a new RuntimeError instance.

      Parameters

      • message: string

        The error message.

      • Rest ...args: any[]

        Optional arguments for the Error constructor.

        -

      Returns RuntimeError

    Properties

    cause?: unknown
    message: string
    name: string
    stack?: string

    Generated using TypeDoc

    \ No newline at end of file +

    Returns RuntimeError

    Properties

    cause?: unknown
    message: string
    name: string
    stack?: string

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Events.WailsEvent.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Events.WailsEvent.html index 0cb098600..c59223749 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Events.WailsEvent.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Events.WailsEvent.html @@ -1,4 +1,4 @@ -WailsEvent | @wailsio/runtime

    Constructors

    constructor +WailsEvent | @wailsio/runtime

    Constructors

    Properties

    Constructors

    Properties

    data: any
    name: any

    Generated using TypeDoc

    \ No newline at end of file +

    Constructors

    Properties

    data: any
    name: any

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Hide.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Hide.html index a0dd5da46..3d8968c8a 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Hide.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Hide.html @@ -1,2 +1,2 @@ Hide | @wailsio/runtime
    • Hides a certain method by calling the HideMethod function.

      -

      Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file +

    Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Quit.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Quit.html index 084afaf35..30b32a250 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Quit.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Quit.html @@ -1,2 +1,2 @@ Quit | @wailsio/runtime
    • Calls the QuitMethod to terminate the program.

      -

      Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file +

    Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Show.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Show.html index a8c352048..fe3a53432 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Show.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Show.html @@ -1,2 +1,2 @@ Show | @wailsio/runtime
    • Calls the ShowMethod and returns the result.

      -

      Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file +

    Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Browser.OpenURL.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Browser.OpenURL.html index 0ca034158..51086c535 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Browser.OpenURL.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Browser.OpenURL.html @@ -1,3 +1,3 @@ OpenURL | @wailsio/runtime
    • Open a browser window to the given URL

      Parameters

      • url: string

        The URL to open

        -

      Returns Promise<string>

    Generated using TypeDoc

    \ No newline at end of file +

    Returns Promise<string>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByID.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByID.html index 9f0159763..c7f8efc47 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByID.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByID.html @@ -5,4 +5,4 @@ See Call for details.

    Returns Promise<any>

    • The result of the method call.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByName.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByName.html index a16e692fb..f3c0a30ee 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByName.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByName.html @@ -3,4 +3,4 @@ See Call for details.

    Parameters

    • methodName: string

      The name of the method in the format 'package.struct.method'.

    • Rest ...args: any[]

      The arguments to pass to the method.

    Returns Promise<any>

    The result of the method call.

    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.Call.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.Call.html index 67498f305..0b030274f 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.Call.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.Call.html @@ -8,4 +8,4 @@ by the application- or service-level error marshaling functions.

    Returns Promise<any>

    • The result of the call.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.SetText.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.SetText.html index 8cdb5c107..44ca80c1d 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.SetText.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.SetText.html @@ -3,4 +3,4 @@

    Returns Promise<any>

    • A Promise that resolves when the operation is successful.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.Text.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.Text.html index 66f0ca9fa..67a12bda3 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.Text.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.Text.html @@ -1,3 +1,3 @@ Text | @wailsio/runtime
    • Get the Clipboard text

      Returns Promise<string>

      A promise that resolves with the text from the Clipboard.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Any.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Any.html index c95400723..ab31d1985 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Any.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Any.html @@ -1,2 +1,2 @@ Any | @wailsio/runtime
    • Any is a dummy creation function for simple or unknown types.

      -

      Type Parameters

      • T

      Parameters

      • source: any

      Returns T

    Generated using TypeDoc

    \ No newline at end of file +

    Type Parameters

    • T

    Parameters

    • source: any

    Returns T

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Array.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Array.html index 5d4758c74..c453e6fe8 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Array.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Array.html @@ -1,4 +1,4 @@ Array | @wailsio/runtime
    • Array takes a creation function for an arbitrary type and returns an in-place creation function for an array whose elements are of that type.

      -

      Type Parameters

      • T

      Parameters

      • element: ((source) => T)
          • (source): T
          • Parameters

            • source: any

            Returns T

      Returns ((source) => T[])

        • (source): T[]
        • Parameters

          • source: any

          Returns T[]

    Generated using TypeDoc

    \ No newline at end of file +

    Type Parameters

    • T

    Parameters

    • element: ((source) => T)
        • (source): T
        • Parameters

          • source: any

          Returns T

    Returns ((source) => T[])

      • (source): T[]
      • Parameters

        • source: any

        Returns T[]

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.ByteSlice.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.ByteSlice.html index 3cb1098e4..e8e8164d0 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.ByteSlice.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.ByteSlice.html @@ -1,3 +1,3 @@ ByteSlice | @wailsio/runtime
    • ByteSlice is a creation function that replaces null strings with empty strings.

      -

      Parameters

      • source: any

      Returns string

    Generated using TypeDoc

    \ No newline at end of file +

    Parameters

    • source: any

    Returns string

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Map.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Map.html index a8af254eb..56e7e3bf4 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Map.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Map.html @@ -1,4 +1,4 @@ Map | @wailsio/runtime
    • Map takes creation functions for two arbitrary types and returns an in-place creation function for an object whose keys and values are of those types.

      -

      Type Parameters

      • K
      • V

      Parameters

      • key: ((source) => K)
          • (source): K
          • Parameters

            • source: any

            Returns K

      • value: ((source) => V)
          • (source): V
          • Parameters

            • source: any

            Returns V

      Returns ((source) => {
          [_: K]: V;
      })

        • (source): {
              [_: K]: V;
          }
        • Parameters

          • source: any

          Returns {
              [_: K]: V;
          }

    Generated using TypeDoc

    \ No newline at end of file +

    Type Parameters

    • K
    • V

    Parameters

    • key: ((source) => K)
        • (source): K
        • Parameters

          • source: any

          Returns K

    • value: ((source) => V)
        • (source): V
        • Parameters

          • source: any

          Returns V

    Returns ((source) => {
        [_: K]: V;
    })

      • (source): {
            [_: K]: V;
        }
      • Parameters

        • source: any

        Returns {
            [_: K]: V;
        }

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Nullable.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Nullable.html index 8ede5ffa0..062327e16 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Nullable.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Nullable.html @@ -1,3 +1,3 @@ Nullable | @wailsio/runtime
    • Nullable takes a creation function for an arbitrary type and returns a creation function for a nullable value of that type.

      -

      Type Parameters

      • T

      Parameters

      • element: ((source) => T)
          • (source): T
          • Parameters

            • source: any

            Returns T

      Returns ((source) => null | T)

        • (source): null | T
        • Parameters

          • source: any

          Returns null | T

    Generated using TypeDoc

    \ No newline at end of file +

    Type Parameters

    • T

    Parameters

    • element: ((source) => T)
        • (source): T
        • Parameters

          • source: any

          Returns T

    Returns ((source) => null | T)

      • (source): null | T
      • Parameters

        • source: any

        Returns null | T

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Struct.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Struct.html index 837112f79..5b679d33a 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Struct.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Struct.html @@ -1,3 +1,3 @@ Struct | @wailsio/runtime
    • Struct takes an object mapping field names to creation functions and returns an in-place creation function for a struct.

      -

      Type Parameters

      • T extends {
            [_: string]: ((source) => any);
        }
      • U extends {
            [Key in string | number | symbol]?: ReturnType<T[Key]>
        }

      Parameters

      • createField: T

      Returns ((source) => U)

        • (source): U
        • Parameters

          • source: any

          Returns U

    Generated using TypeDoc

    \ No newline at end of file +

    Type Parameters

    • T extends {
          [_: string]: ((source) => any);
      }
    • U extends {
          [Key in string | number | symbol]?: ReturnType<T[Key]>
      }

    Parameters

    • createField: T

    Returns ((source) => U)

      • (source): U
      • Parameters

        • source: any

        Returns U

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Error.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Error.html index 18c1465fb..de60e46b4 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Error.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Error.html @@ -2,4 +2,4 @@

    Returns Promise<string>

    • The label of the button pressed
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Info.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Info.html index 08d4bc138..45d8e42e4 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Info.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Info.html @@ -2,4 +2,4 @@

    Returns Promise<string>

    • The label of the button pressed
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.OpenFile.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.OpenFile.html index d2fa4ad46..a98c2f5d9 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.OpenFile.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.OpenFile.html @@ -1,3 +1,3 @@ OpenFile | @wailsio/runtime
    • Parameters

      Returns Promise<string | string[]>

      Returns selected file or list of files. Returns blank string if no file is selected.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Question.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Question.html index 8ffebf4e9..c2dad387e 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Question.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Question.html @@ -2,4 +2,4 @@

    Returns Promise<string>

    • The label of the button pressed
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.SaveFile.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.SaveFile.html index 39d84c6b0..39596be60 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.SaveFile.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.SaveFile.html @@ -1,3 +1,3 @@ SaveFile | @wailsio/runtime
    • Parameters

      Returns Promise<string>

      Returns the selected file. Returns blank string if no file is selected.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Warning.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Warning.html index 1f64ccea9..d71f0638e 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Warning.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Warning.html @@ -2,4 +2,4 @@

    Returns Promise<string>

    • The label of the button pressed
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Emit.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Emit.html index 21a11b796..90164c159 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Emit.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Emit.html @@ -3,4 +3,4 @@

    Returns any

    • The result of the emitted event.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Off.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Off.html index 3f5c94e03..2b59d7d2b 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Off.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Off.html @@ -1,4 +1,4 @@ Off | @wailsio/runtime
    • Removes event listeners for the specified event names.

      Parameters

      • eventName: string

        The name of the event to remove listeners for.

      • Rest ...additionalEventNames: string[]

        Additional event names to remove listeners for.

        -

      Returns undefined

    Generated using TypeDoc

    \ No newline at end of file +

    Returns undefined

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OffAll.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OffAll.html index d0cc815c1..3ce065483 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OffAll.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OffAll.html @@ -1,3 +1,3 @@ OffAll | @wailsio/runtime
    • Removes all event listeners.

      Returns void

      Function

      OffAll

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.On.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.On.html index 89b06da7c..a6141e0bb 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.On.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.On.html @@ -4,4 +4,4 @@

    Returns Function

    • A function that, when called, will unregister the callback from the event.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OnMultiple.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OnMultiple.html index ae2e8460d..942230728 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OnMultiple.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OnMultiple.html @@ -5,4 +5,4 @@

    Returns Function

    • A function that, when called, will unregister the callback from the event.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Once.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Once.html index e8769c2ed..5aec085aa 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Once.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Once.html @@ -4,4 +4,4 @@

    Returns Function

    • A function that, when called, will unregister the callback from the event.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.setup.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.setup.html index 6653aaf54..3f2f7b71c 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.setup.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.setup.html @@ -1 +1 @@ -setup | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file +setup | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Flags.GetFlag.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Flags.GetFlag.html index 4a5e365b2..7c941b2a8 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Flags.GetFlag.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Flags.GetFlag.html @@ -3,4 +3,4 @@

    Returns any

    • The value associated with the specified key.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetAll.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetAll.html index c89e9d57d..1c937a629 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetAll.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetAll.html @@ -1,3 +1,3 @@ GetAll | @wailsio/runtime
    • Gets all screens.

      Returns Promise<Screen[]>

      A promise that resolves to an array of Screen objects.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetCurrent.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetCurrent.html index e591e3223..3cc606bb2 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetCurrent.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetCurrent.html @@ -1,3 +1,3 @@ GetCurrent | @wailsio/runtime
    • Gets the current active screen.

      Returns Promise<Screen>

      A promise that resolves with the current active screen.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetPrimary.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetPrimary.html index 4207aa6b4..a1647a3a8 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetPrimary.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetPrimary.html @@ -1,3 +1,3 @@ GetPrimary | @wailsio/runtime
    • Gets the primary screen.

      Returns Promise<Screen>

      A promise that resolves to the primary screen.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Capabilities.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Capabilities.html index d373c6765..a5885798f 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Capabilities.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Capabilities.html @@ -1,4 +1,4 @@ Capabilities | @wailsio/runtime
    • Fetches the capabilities of the application from the server.

      Returns Promise<Object>

      A promise that resolves to an object containing the capabilities.

      Async

      Function

      Capabilities

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Environment.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Environment.html index 26325a5a3..881e06d9a 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Environment.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Environment.html @@ -2,4 +2,4 @@
  • A promise that resolves to an object containing OS and system architecture.
  • Function

    Retrieves environment details.

    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsAMD64.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsAMD64.html index 4e0128d14..69cf77c4e 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsAMD64.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsAMD64.html @@ -1,3 +1,3 @@ IsAMD64 | @wailsio/runtime
    • Checks if the current environment architecture is AMD64.

      Returns boolean

      True if the current environment architecture is AMD64, false otherwise.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM.html index 7ed935470..02ce11523 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM.html @@ -1,3 +1,3 @@ IsARM | @wailsio/runtime
    • Checks if the current architecture is ARM.

      Returns boolean

      True if the current architecture is ARM, false otherwise.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM64.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM64.html index c952632d0..05425fbc7 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM64.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM64.html @@ -2,4 +2,4 @@

    Returns boolean

    • Returns true if the environment is ARM64 architecture, otherwise returns false.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDarkMode.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDarkMode.html index ac866f167..202d59362 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDarkMode.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDarkMode.html @@ -2,4 +2,4 @@
  • A promise that resolves to a boolean value indicating if the system is in dark mode.
  • Function

    Retrieves the system dark mode status.

    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDebug.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDebug.html index ada72f900..3c6920684 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDebug.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDebug.html @@ -1 +1 @@ -IsDebug | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file +IsDebug | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsLinux.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsLinux.html index 8226f0ea5..46847b3fd 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsLinux.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsLinux.html @@ -1,3 +1,3 @@ IsLinux | @wailsio/runtime
    • Checks if the current operating system is Linux.

      Returns boolean

      Returns true if the current operating system is Linux, false otherwise.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsMac.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsMac.html index 8c5b66a20..2df0ca1ff 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsMac.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsMac.html @@ -1,3 +1,3 @@ IsMac | @wailsio/runtime
    • Checks if the current environment is a macOS operating system.

      Returns boolean

      True if the environment is macOS, false otherwise.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsWindows.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsWindows.html index 7e7281508..e062bb048 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsWindows.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsWindows.html @@ -1,3 +1,3 @@ IsWindows | @wailsio/runtime
    • Checks if the current operating system is Windows.

      Returns boolean

      True if the operating system is Windows, otherwise false.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.invoke.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.invoke.html index b48f948ca..7fe355563 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.invoke.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.invoke.html @@ -1 +1 @@ -invoke | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file +invoke | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Enable.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Enable.html index 1a1d32d91..832eeaebb 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Enable.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Enable.html @@ -1,2 +1,2 @@ Enable | @wailsio/runtime
    • Schedules an automatic reload of WML to be performed as soon as the document is fully loaded.

      -

      Returns void

    Generated using TypeDoc

    \ No newline at end of file +

    Returns void

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Reload.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Reload.html index 050d47f08..9db9cd32b 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Reload.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Reload.html @@ -1,2 +1,2 @@ Reload | @wailsio/runtime
    • Reloads the WML page by adding necessary event listeners and browser listeners.

      -

      Returns void

    Generated using TypeDoc

    \ No newline at end of file +

    Returns void

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/init.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/init.html index 7bbac9404..3887f26f4 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/init.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/init.html @@ -1 +1 @@ -init | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file +init | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Call.CallOptions.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Call.CallOptions.html index 55c2e1248..972d12835 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Call.CallOptions.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Call.CallOptions.html @@ -1,7 +1,7 @@ -CallOptions | @wailsio/runtime

    Interface CallOptions

    interface CallOptions {
        args: any[];
        methodID: undefined | number;
        methodName: undefined | string;
    }

    Properties

    args +CallOptions | @wailsio/runtime

    Interface CallOptions

    interface CallOptions {
        args: any[];
        methodID: undefined | number;
        methodName: undefined | string;
    }

    Properties

    args: any[]

    Arguments to be passed into the bound method.

    -
    methodID: undefined | number

    The numeric ID of the bound method to call.

    -
    methodName: undefined | string

    The fully qualified name of the bound method to call.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    methodID: undefined | number

    The numeric ID of the bound method to call.

    +
    methodName: undefined | string

    The fully qualified name of the bound method to call.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.Button.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.Button.html index c89c1e816..7694277e8 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.Button.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.Button.html @@ -1,7 +1,7 @@ -Button | @wailsio/runtime
    interface Button {
        IsCancel: undefined | boolean;
        IsDefault: undefined | boolean;
        Label: undefined | string;
    }

    Properties

    IsCancel +Button | @wailsio/runtime
    interface Button {
        IsCancel: undefined | boolean;
        IsDefault: undefined | boolean;
        Label: undefined | string;
    }

    Properties

    IsCancel: undefined | boolean

    True if the button should cancel an operation when clicked.

    -
    IsDefault: undefined | boolean

    True if the button should be the default action when the user presses enter.

    -
    Label: undefined | string

    Text that appears within the button.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    IsDefault: undefined | boolean

    True if the button should be the default action when the user presses enter.

    +
    Label: undefined | string

    Text that appears within the button.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.FileFilter.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.FileFilter.html index f3a8f81a9..2dabb1e04 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.FileFilter.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.FileFilter.html @@ -1,5 +1,5 @@ -FileFilter | @wailsio/runtime
    interface FileFilter {
        DisplayName: undefined | string;
        Pattern: undefined | string;
    }

    Properties

    DisplayName +FileFilter | @wailsio/runtime
    interface FileFilter {
        DisplayName: undefined | string;
        Pattern: undefined | string;
    }

    Properties

    Properties

    DisplayName: undefined | string

    Display name for the filter, it could be "Text Files", "Images" etc.

    -
    Pattern: undefined | string

    Pattern to match for the filter, e.g. ".txt;.md" for text markdown files.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    Pattern: undefined | string

    Pattern to match for the filter, e.g. ".txt;.md" for text markdown files.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.MessageDialogOptions.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.MessageDialogOptions.html index d08ec5c6f..741c0ed50 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.MessageDialogOptions.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.MessageDialogOptions.html @@ -1,9 +1,9 @@ -MessageDialogOptions | @wailsio/runtime

    Interface MessageDialogOptions

    interface MessageDialogOptions {
        Buttons: undefined | Button[];
        Detached: undefined | boolean;
        Message: undefined | string;
        Title: undefined | string;
    }

    Properties

    Buttons +MessageDialogOptions | @wailsio/runtime

    Interface MessageDialogOptions

    interface MessageDialogOptions {
        Buttons: undefined | Button[];
        Detached: undefined | boolean;
        Message: undefined | string;
        Title: undefined | string;
    }

    Properties

    Buttons: undefined | Button[]

    Array of button options to show in the dialog.

    -
    Detached: undefined | boolean

    True if the dialog should appear detached from the main window (if applicable).

    -
    Message: undefined | string

    The main message to show in the dialog.

    -
    Title: undefined | string

    The title of the dialog window.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    Detached: undefined | boolean

    True if the dialog should appear detached from the main window (if applicable).

    +
    Message: undefined | string

    The main message to show in the dialog.

    +
    Title: undefined | string

    The title of the dialog window.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.OpenFileDialogOptions.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.OpenFileDialogOptions.html index b0560bb5a..936399213 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.OpenFileDialogOptions.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.OpenFileDialogOptions.html @@ -1,4 +1,4 @@ -OpenFileDialogOptions | @wailsio/runtime

    Interface OpenFileDialogOptions

    interface OpenFileDialogOptions {
        AllowsMultipleSelection: undefined | boolean;
        AllowsOtherFiletypes: undefined | boolean;
        ButtonText: undefined | string;
        CanChooseDirectories: undefined | boolean;
        CanChooseFiles: undefined | boolean;
        CanCreateDirectories: undefined | boolean;
        CanSelectHiddenExtension: undefined | boolean;
        Detached: undefined | boolean;
        Directory: undefined | string;
        Filters: undefined | FileFilter[];
        HideExtension: undefined | boolean;
        Message: undefined | string;
        ResolvesAliases: undefined | boolean;
        ShowHiddenFiles: undefined | boolean;
        Title: undefined | string;
        TreatsFilePackagesAsDirectories: undefined | boolean;
    }

    Properties

    AllowsMultipleSelection +OpenFileDialogOptions | @wailsio/runtime

    Interface OpenFileDialogOptions

    interface OpenFileDialogOptions {
        AllowsMultipleSelection: undefined | boolean;
        AllowsOtherFiletypes: undefined | boolean;
        ButtonText: undefined | string;
        CanChooseDirectories: undefined | boolean;
        CanChooseFiles: undefined | boolean;
        CanCreateDirectories: undefined | boolean;
        CanSelectHiddenExtension: undefined | boolean;
        Detached: undefined | boolean;
        Directory: undefined | string;
        Filters: undefined | FileFilter[];
        HideExtension: undefined | boolean;
        Message: undefined | string;
        ResolvesAliases: undefined | boolean;
        ShowHiddenFiles: undefined | boolean;
        Title: undefined | string;
        TreatsFilePackagesAsDirectories: undefined | boolean;
    }

    Properties

    AllowsMultipleSelection: undefined | boolean

    Indicates if multiple selection is allowed.

    -
    AllowsOtherFiletypes: undefined | boolean

    Indicates if other file types are allowed.

    -
    ButtonText: undefined | string

    Text to display on the button.

    -
    CanChooseDirectories: undefined | boolean

    Indicates if directories can be chosen.

    -
    CanChooseFiles: undefined | boolean

    Indicates if files can be chosen.

    -
    CanCreateDirectories: undefined | boolean

    Indicates if directories can be created.

    -
    CanSelectHiddenExtension: undefined | boolean

    Indicates if hidden extensions can be selected.

    -
    Detached: undefined | boolean

    Indicates if the dialog should appear detached from the main window.

    -
    Directory: undefined | string

    Directory to open in the dialog.

    -
    Filters: undefined | FileFilter[]

    Array of file filters.

    -
    HideExtension: undefined | boolean

    Indicates if the extension should be hidden.

    -
    Message: undefined | string

    Message to show in the dialog.

    -
    ResolvesAliases: undefined | boolean

    Indicates if aliases should be resolved.

    -
    ShowHiddenFiles: undefined | boolean

    Indicates if hidden files should be shown.

    -
    Title: undefined | string

    Title of the dialog.

    -
    TreatsFilePackagesAsDirectories: undefined | boolean

    Indicates if file packages should be treated as directories.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    AllowsOtherFiletypes: undefined | boolean

    Indicates if other file types are allowed.

    +
    ButtonText: undefined | string

    Text to display on the button.

    +
    CanChooseDirectories: undefined | boolean

    Indicates if directories can be chosen.

    +
    CanChooseFiles: undefined | boolean

    Indicates if files can be chosen.

    +
    CanCreateDirectories: undefined | boolean

    Indicates if directories can be created.

    +
    CanSelectHiddenExtension: undefined | boolean

    Indicates if hidden extensions can be selected.

    +
    Detached: undefined | boolean

    Indicates if the dialog should appear detached from the main window.

    +
    Directory: undefined | string

    Directory to open in the dialog.

    +
    Filters: undefined | FileFilter[]

    Array of file filters.

    +
    HideExtension: undefined | boolean

    Indicates if the extension should be hidden.

    +
    Message: undefined | string

    Message to show in the dialog.

    +
    ResolvesAliases: undefined | boolean

    Indicates if aliases should be resolved.

    +
    ShowHiddenFiles: undefined | boolean

    Indicates if hidden files should be shown.

    +
    Title: undefined | string

    Title of the dialog.

    +
    TreatsFilePackagesAsDirectories: undefined | boolean

    Indicates if file packages should be treated as directories.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.SaveFileDialogOptions.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.SaveFileDialogOptions.html index ea364bcf5..5f417616a 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.SaveFileDialogOptions.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.SaveFileDialogOptions.html @@ -1,4 +1,4 @@ -SaveFileDialogOptions | @wailsio/runtime

    Interface SaveFileDialogOptions

    interface SaveFileDialogOptions {
        AllowsMultipleSelection: undefined | boolean;
        AllowsOtherFiletypes: undefined | boolean;
        ButtonText: undefined | string;
        CanChooseDirectories: undefined | boolean;
        CanChooseFiles: undefined | boolean;
        CanCreateDirectories: undefined | boolean;
        CanSelectHiddenExtension: undefined | boolean;
        Detached: undefined | boolean;
        Directory: undefined | string;
        Filename: undefined | string;
        Filters: undefined | FileFilter[];
        HideExtension: undefined | boolean;
        Message: undefined | string;
        ResolvesAliases: undefined | boolean;
        ShowHiddenFiles: undefined | boolean;
        Title: undefined | string;
        TreatsFilePackagesAsDirectories: undefined | boolean;
    }

    Properties

    AllowsMultipleSelection +SaveFileDialogOptions | @wailsio/runtime

    Interface SaveFileDialogOptions

    interface SaveFileDialogOptions {
        AllowsMultipleSelection: undefined | boolean;
        AllowsOtherFiletypes: undefined | boolean;
        ButtonText: undefined | string;
        CanChooseDirectories: undefined | boolean;
        CanChooseFiles: undefined | boolean;
        CanCreateDirectories: undefined | boolean;
        CanSelectHiddenExtension: undefined | boolean;
        Detached: undefined | boolean;
        Directory: undefined | string;
        Filename: undefined | string;
        Filters: undefined | FileFilter[];
        HideExtension: undefined | boolean;
        Message: undefined | string;
        ResolvesAliases: undefined | boolean;
        ShowHiddenFiles: undefined | boolean;
        Title: undefined | string;
        TreatsFilePackagesAsDirectories: undefined | boolean;
    }

    Properties

    AllowsMultipleSelection: undefined | boolean

    Indicates if multiple selection is allowed.

    -
    AllowsOtherFiletypes: undefined | boolean

    Indicates if other file types are allowed.

    -
    ButtonText: undefined | string

    Text to display on the button.

    -
    CanChooseDirectories: undefined | boolean

    Indicates if directories can be chosen.

    -
    CanChooseFiles: undefined | boolean

    Indicates if files can be chosen.

    -
    CanCreateDirectories: undefined | boolean

    Indicates if directories can be created.

    -
    CanSelectHiddenExtension: undefined | boolean

    Indicates if hidden extensions can be selected.

    -
    Detached: undefined | boolean

    Indicates if the dialog should appear detached from the main window.

    -
    Directory: undefined | string

    Directory to open in the dialog.

    -
    Filename: undefined | string

    Default filename to use in the dialog.

    -
    Filters: undefined | FileFilter[]

    Array of file filters.

    -
    HideExtension: undefined | boolean

    Indicates if the extension should be hidden.

    -
    Message: undefined | string

    Message to show in the dialog.

    -
    ResolvesAliases: undefined | boolean

    Indicates if aliases should be resolved.

    -
    ShowHiddenFiles: undefined | boolean

    Indicates if hidden files should be shown.

    -
    Title: undefined | string

    Title of the dialog.

    -
    TreatsFilePackagesAsDirectories: undefined | boolean

    Indicates if file packages should be treated as directories.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    AllowsOtherFiletypes: undefined | boolean

    Indicates if other file types are allowed.

    +
    ButtonText: undefined | string

    Text to display on the button.

    +
    CanChooseDirectories: undefined | boolean

    Indicates if directories can be chosen.

    +
    CanChooseFiles: undefined | boolean

    Indicates if files can be chosen.

    +
    CanCreateDirectories: undefined | boolean

    Indicates if directories can be created.

    +
    CanSelectHiddenExtension: undefined | boolean

    Indicates if hidden extensions can be selected.

    +
    Detached: undefined | boolean

    Indicates if the dialog should appear detached from the main window.

    +
    Directory: undefined | string

    Directory to open in the dialog.

    +
    Filename: undefined | string

    Default filename to use in the dialog.

    +
    Filters: undefined | FileFilter[]

    Array of file filters.

    +
    HideExtension: undefined | boolean

    Indicates if the extension should be hidden.

    +
    Message: undefined | string

    Message to show in the dialog.

    +
    ResolvesAliases: undefined | boolean

    Indicates if aliases should be resolved.

    +
    ShowHiddenFiles: undefined | boolean

    Indicates if hidden files should be shown.

    +
    Title: undefined | string

    Title of the dialog.

    +
    TreatsFilePackagesAsDirectories: undefined | boolean

    Indicates if file packages should be treated as directories.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Rect.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Rect.html index 7da7c2ab7..b2ba0e8e2 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Rect.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Rect.html @@ -1,9 +1,9 @@ -Rect | @wailsio/runtime
    interface Rect {
        Height: number;
        Width: number;
        X: number;
        Y: number;
    }

    Properties

    Height +Rect | @wailsio/runtime
    interface Rect {
        Height: number;
        Width: number;
        X: number;
        Y: number;
    }

    Properties

    Properties

    Height: number

    The height of the rectangle.

    -
    Width: number

    The width of the rectangle.

    -
    X: number

    The X coordinate of the origin.

    -
    Y: number

    The Y coordinate of the origin.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    Width: number

    The width of the rectangle.

    +
    X: number

    The X coordinate of the origin.

    +
    Y: number

    The Y coordinate of the origin.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Screen.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Screen.html index 823fda888..a9af505a9 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Screen.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Screen.html @@ -1,4 +1,4 @@ -Screen | @wailsio/runtime
    interface Screen {
        Bounds: Rect;
        ID: string;
        IsPrimary: boolean;
        Name: string;
        PhysicalBounds: Rect;
        PhysicalWorkArea: Rect;
        Rotation: number;
        ScaleFactor: number;
        Size: Size;
        WorkArea: Rect;
        X: number;
        Y: number;
    }

    Properties

    Bounds +Screen | @wailsio/runtime
    interface Screen {
        Bounds: Rect;
        ID: string;
        IsPrimary: boolean;
        Name: string;
        PhysicalBounds: Rect;
        PhysicalWorkArea: Rect;
        Rotation: number;
        ScaleFactor: number;
        Size: Size;
        WorkArea: Rect;
        X: number;
        Y: number;
    }

    Properties

    Bounds ID IsPrimary Name @@ -11,15 +11,15 @@ X Y

    Properties

    Bounds: Rect

    Contains the bounds of the screen in terms of X, Y, Width, and Height.

    -
    ID: string

    Unique identifier for the screen.

    -
    IsPrimary: boolean

    True if this is the primary monitor selected by the user in the operating system.

    -
    Name: string

    Human readable name of the screen.

    -
    PhysicalBounds: Rect

    Contains the physical bounds of the screen in terms of X, Y, Width, and Height (before scaling).

    -
    PhysicalWorkArea: Rect

    Contains the physical WorkArea of the screen (before scaling).

    -
    Rotation: number

    The rotation of the screen.

    -
    ScaleFactor: number

    The scale factor of the screen (DPI/96). 1 = standard DPI, 2 = HiDPI (Retina), etc.

    -
    Size: Size

    Contains the width and height of the screen.

    -
    WorkArea: Rect

    Contains the area of the screen that is actually usable (excluding taskbar and other system UI).

    -
    X: number

    The X coordinate of the screen.

    -
    Y: number

    The Y coordinate of the screen.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    ID: string

    Unique identifier for the screen.

    +
    IsPrimary: boolean

    True if this is the primary monitor selected by the user in the operating system.

    +
    Name: string

    Human readable name of the screen.

    +
    PhysicalBounds: Rect

    Contains the physical bounds of the screen in terms of X, Y, Width, and Height (before scaling).

    +
    PhysicalWorkArea: Rect

    Contains the physical WorkArea of the screen (before scaling).

    +
    Rotation: number

    The rotation of the screen.

    +
    ScaleFactor: number

    The scale factor of the screen (DPI/96). 1 = standard DPI, 2 = HiDPI (Retina), etc.

    +
    Size: Size

    Contains the width and height of the screen.

    +
    WorkArea: Rect

    Contains the area of the screen that is actually usable (excluding taskbar and other system UI).

    +
    X: number

    The X coordinate of the screen.

    +
    Y: number

    The Y coordinate of the screen.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Size.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Size.html index 205e22a7a..c34bdced3 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Size.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Size.html @@ -1,5 +1,5 @@ -Size | @wailsio/runtime
    interface Size {
        Height: number;
        Width: number;
    }

    Properties

    Height +Size | @wailsio/runtime
    interface Size {
        Height: number;
        Width: number;
    }

    Properties

    Properties

    Height: number

    The height.

    -
    Width: number

    The width.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    Width: number

    The width.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.EnvironmentInfo.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.EnvironmentInfo.html index 4103bd059..fd42208ac 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.EnvironmentInfo.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.EnvironmentInfo.html @@ -1,11 +1,11 @@ -EnvironmentInfo | @wailsio/runtime

    Interface EnvironmentInfo

    interface EnvironmentInfo {
        Arch: string;
        Debug: boolean;
        OS: string;
        OSInfo: OSInfo;
        PlatformInfo: Object;
    }

    Properties

    Arch +EnvironmentInfo | @wailsio/runtime

    Interface EnvironmentInfo

    interface EnvironmentInfo {
        Arch: string;
        Debug: boolean;
        OS: string;
        OSInfo: OSInfo;
        PlatformInfo: Object;
    }

    Properties

    Arch: string

    The architecture of the system.

    -
    Debug: boolean

    True if the application is running in debug mode, otherwise false.

    -
    OS: string

    The operating system in use.

    -
    OSInfo: OSInfo

    Details of the operating system.

    -
    PlatformInfo: Object

    Additional platform information.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    Debug: boolean

    True if the application is running in debug mode, otherwise false.

    +
    OS: string

    The operating system in use.

    +
    OSInfo: OSInfo

    Details of the operating system.

    +
    PlatformInfo: Object

    Additional platform information.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.OSInfo.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.OSInfo.html index 7f6e0d5c1..a7e96cb57 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.OSInfo.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.OSInfo.html @@ -1,9 +1,9 @@ -OSInfo | @wailsio/runtime
    interface OSInfo {
        Branding: string;
        ID: string;
        Name: string;
        Version: string;
    }

    Properties

    Branding +OSInfo | @wailsio/runtime
    interface OSInfo {
        Branding: string;
        ID: string;
        Name: string;
        Version: string;
    }

    Properties

    Properties

    Branding: string

    The branding of the OS.

    -
    ID: string

    The ID of the OS.

    -
    Name: string

    The name of the OS.

    -
    Version: string

    The version of the OS.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    ID: string

    The ID of the OS.

    +
    Name: string

    The name of the OS.

    +
    Version: string

    The version of the OS.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Application.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Application.html index ddeb9811f..c31f437ee 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Application.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Application.html @@ -1,4 +1,4 @@ -Application | @wailsio/runtime

    Namespace Application

    Index

    Functions

    Hide +Application | @wailsio/runtime

    Namespace Application

    Index

    Functions

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Browser.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Browser.html index 55f5798b9..a5f0d2d59 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Browser.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Browser.html @@ -1,2 +1,2 @@ -Browser | @wailsio/runtime

    Namespace Browser

    Index

    Functions

    OpenURL +Browser | @wailsio/runtime

    Namespace Browser

    Index

    Functions

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Call.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Call.html index 7a3b3eee2..11e23c0bd 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Call.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Call.html @@ -1,4 +1,4 @@ -Call | @wailsio/runtime

    Namespace Call

    Index

    Classes

    RuntimeError +Call | @wailsio/runtime

    Namespace Call

    Index

    Classes

    Interfaces

    Functions

    ByID ByName diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Clipboard.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Clipboard.html index b339afb5f..a30577764 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Clipboard.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Clipboard.html @@ -1,3 +1,3 @@ -Clipboard | @wailsio/runtime

    Namespace Clipboard

    Index

    Functions

    SetText +Clipboard | @wailsio/runtime

    Namespace Clipboard

    Index

    Functions

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Create.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Create.html index 6fbb8b41f..979f8ca69 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Create.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Create.html @@ -1,4 +1,4 @@ -Create | @wailsio/runtime

    Namespace Create

    Index

    Functions

    Any +Create | @wailsio/runtime

    Namespace Create

    Index

    Functions

    Any Array ByteSlice Map diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Dialogs.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Dialogs.html index 9cc541f94..ebfb212d3 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Dialogs.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Dialogs.html @@ -1,4 +1,4 @@ -Dialogs | @wailsio/runtime

    Namespace Dialogs

    Index

    Interfaces

    Button +Dialogs | @wailsio/runtime

    Namespace Dialogs

    Index

    Interfaces

    Button FileFilter MessageDialogOptions OpenFileDialogOptions diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Events.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Events.html index b44acdeb9..b0fc9eb85 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Events.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Events.html @@ -1,4 +1,4 @@ -Events | @wailsio/runtime

    Namespace Events

    Index

    Classes

    WailsEvent +Events | @wailsio/runtime

    Namespace Events

    Index

    Classes

    Variables

    Functions

    Emit Off diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Flags.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Flags.html index ff7622363..8529c304c 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Flags.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Flags.html @@ -1,2 +1,2 @@ -Flags | @wailsio/runtime

    Namespace Flags

    Index

    Functions

    GetFlag +Flags | @wailsio/runtime

    Namespace Flags

    Index

    Functions

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Screens.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Screens.html index 0c5bce324..37907bce6 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Screens.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Screens.html @@ -1,4 +1,4 @@ -Screens | @wailsio/runtime

    Namespace Screens

    Index

    Interfaces

    Rect +Screens | @wailsio/runtime

    Namespace Screens

    Index

    Interfaces

    Functions

    GetAll diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/System.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/System.html index 5ab2b4d7c..38a49196b 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/System.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/System.html @@ -1,4 +1,4 @@ -System | @wailsio/runtime

    Namespace System

    Index

    Interfaces

    EnvironmentInfo +System | @wailsio/runtime

    Namespace System

    Index

    Interfaces

    Functions

    Capabilities Environment diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/WML.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/WML.html index 69cff875d..aa75f96e1 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/WML.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/WML.html @@ -1,3 +1,3 @@ -WML | @wailsio/runtime

    Namespace WML

    Index

    Functions

    Enable +WML | @wailsio/runtime

    Namespace WML

    Index

    Functions

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Events.Types.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Events.Types.html index 8c4daaf20..36096ca29 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Events.Types.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Events.Types.html @@ -1 +1 @@ -Types | @wailsio/runtime

    Variable TypesConst

    Types: {
        Common: {
            ApplicationOpenedWithFile: string;
            ApplicationStarted: string;
            ThemeChanged: string;
            WindowClosing: string;
            WindowDPIChanged: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowFilesDropped: string;
            WindowFocus: string;
            WindowFullscreen: string;
            WindowHide: string;
            WindowLostFocus: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowRestore: string;
            WindowRuntimeReady: string;
            WindowShow: string;
            WindowUnFullscreen: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowZoom: string;
            WindowZoomIn: string;
            WindowZoomOut: string;
            WindowZoomReset: string;
        };
        Linux: {
            ApplicationStartup: string;
            SystemThemeChanged: string;
            WindowDeleteEvent: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowFocusIn: string;
            WindowFocusOut: string;
            WindowLoadChanged: string;
        };
        Mac: {
            ApplicationDidBecomeActive: string;
            ApplicationDidChangeBackingProperties: string;
            ApplicationDidChangeEffectiveAppearance: string;
            ApplicationDidChangeIcon: string;
            ApplicationDidChangeOcclusionState: string;
            ApplicationDidChangeScreenParameters: string;
            ApplicationDidChangeStatusBarFrame: string;
            ApplicationDidChangeStatusBarOrientation: string;
            ApplicationDidChangeTheme: string;
            ApplicationDidFinishLaunching: string;
            ApplicationDidHide: string;
            ApplicationDidResignActive: string;
            ApplicationDidUnhide: string;
            ApplicationDidUpdate: string;
            ApplicationShouldHandleReopen: string;
            ApplicationWillBecomeActive: string;
            ApplicationWillFinishLaunching: string;
            ApplicationWillHide: string;
            ApplicationWillResignActive: string;
            ApplicationWillTerminate: string;
            ApplicationWillUnhide: string;
            ApplicationWillUpdate: string;
            MenuDidAddItem: string;
            MenuDidBeginTracking: string;
            MenuDidClose: string;
            MenuDidDisplayItem: string;
            MenuDidEndTracking: string;
            MenuDidHighlightItem: string;
            MenuDidOpen: string;
            MenuDidPopUp: string;
            MenuDidRemoveItem: string;
            MenuDidSendAction: string;
            MenuDidSendActionToItem: string;
            MenuDidUpdate: string;
            MenuWillAddItem: string;
            MenuWillBeginTracking: string;
            MenuWillDisplayItem: string;
            MenuWillEndTracking: string;
            MenuWillHighlightItem: string;
            MenuWillOpen: string;
            MenuWillPopUp: string;
            MenuWillRemoveItem: string;
            MenuWillSendAction: string;
            MenuWillSendActionToItem: string;
            MenuWillUpdate: string;
            WebViewDidCommitNavigation: string;
            WebViewDidFinishNavigation: string;
            WebViewDidReceiveServerRedirectForProvisionalNavigation: string;
            WebViewDidStartProvisionalNavigation: string;
            WindowDidBecomeKey: string;
            WindowDidBecomeMain: string;
            WindowDidBeginSheet: string;
            WindowDidChangeAlpha: string;
            WindowDidChangeBackingLocation: string;
            WindowDidChangeBackingProperties: string;
            WindowDidChangeCollectionBehavior: string;
            WindowDidChangeEffectiveAppearance: string;
            WindowDidChangeOcclusionState: string;
            WindowDidChangeOrderingMode: string;
            WindowDidChangeScreen: string;
            WindowDidChangeScreenParameters: string;
            WindowDidChangeScreenProfile: string;
            WindowDidChangeScreenSpace: string;
            WindowDidChangeScreenSpaceProperties: string;
            WindowDidChangeSharingType: string;
            WindowDidChangeSpace: string;
            WindowDidChangeSpaceOrderingMode: string;
            WindowDidChangeTitle: string;
            WindowDidChangeToolbar: string;
            WindowDidDeminiaturize: string;
            WindowDidEndSheet: string;
            WindowDidEnterFullScreen: string;
            WindowDidEnterVersionBrowser: string;
            WindowDidExitFullScreen: string;
            WindowDidExitVersionBrowser: string;
            WindowDidExpose: string;
            WindowDidFocus: string;
            WindowDidMiniaturize: string;
            WindowDidMove: string;
            WindowDidOrderOffScreen: string;
            WindowDidOrderOnScreen: string;
            WindowDidResignKey: string;
            WindowDidResignMain: string;
            WindowDidResize: string;
            WindowDidUpdate: string;
            WindowDidUpdateAlpha: string;
            WindowDidUpdateCollectionBehavior: string;
            WindowDidUpdateCollectionProperties: string;
            WindowDidUpdateShadow: string;
            WindowDidUpdateTitle: string;
            WindowDidUpdateToolbar: string;
            WindowDidZoom: string;
            WindowFileDraggingEntered: string;
            WindowFileDraggingExited: string;
            WindowFileDraggingPerformed: string;
            WindowHide: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowShouldClose: string;
            WindowShow: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowWillBecomeKey: string;
            WindowWillBecomeMain: string;
            WindowWillBeginSheet: string;
            WindowWillChangeOrderingMode: string;
            WindowWillClose: string;
            WindowWillDeminiaturize: string;
            WindowWillEnterFullScreen: string;
            WindowWillEnterVersionBrowser: string;
            WindowWillExitFullScreen: string;
            WindowWillExitVersionBrowser: string;
            WindowWillFocus: string;
            WindowWillMiniaturize: string;
            WindowWillMove: string;
            WindowWillOrderOffScreen: string;
            WindowWillOrderOnScreen: string;
            WindowWillResignMain: string;
            WindowWillResize: string;
            WindowWillUnfocus: string;
            WindowWillUpdate: string;
            WindowWillUpdateAlpha: string;
            WindowWillUpdateCollectionBehavior: string;
            WindowWillUpdateCollectionProperties: string;
            WindowWillUpdateShadow: string;
            WindowWillUpdateTitle: string;
            WindowWillUpdateToolbar: string;
            WindowWillUpdateVisibility: string;
            WindowWillUseStandardFrame: string;
            WindowZoomIn: string;
            WindowZoomOut: string;
            WindowZoomReset: string;
        };
        Windows: {
            APMPowerSettingChange: string;
            APMPowerStatusChange: string;
            APMResumeAutomatic: string;
            APMResumeSuspend: string;
            APMSuspend: string;
            ApplicationStarted: string;
            SystemThemeChanged: string;
            WebViewNavigationCompleted: string;
            WindowActive: string;
            WindowBackgroundErase: string;
            WindowClickActive: string;
            WindowClosing: string;
            WindowDPIChanged: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowDragDrop: string;
            WindowDragEnter: string;
            WindowDragLeave: string;
            WindowDragOver: string;
            WindowEndMove: string;
            WindowEndResize: string;
            WindowFullscreen: string;
            WindowHide: string;
            WindowInactive: string;
            WindowKeyDown: string;
            WindowKeyUp: string;
            WindowKillFocus: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowNonClientHit: string;
            WindowNonClientMouseDown: string;
            WindowNonClientMouseLeave: string;
            WindowNonClientMouseMove: string;
            WindowNonClientMouseUp: string;
            WindowPaint: string;
            WindowRestore: string;
            WindowSetFocus: string;
            WindowShow: string;
            WindowStartMove: string;
            WindowStartResize: string;
            WindowUnFullscreen: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowZOrderChanged: string;
        };
    } = EventTypes

    Type declaration

    • Common: {
          ApplicationOpenedWithFile: string;
          ApplicationStarted: string;
          ThemeChanged: string;
          WindowClosing: string;
          WindowDPIChanged: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowFilesDropped: string;
          WindowFocus: string;
          WindowFullscreen: string;
          WindowHide: string;
          WindowLostFocus: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowRestore: string;
          WindowRuntimeReady: string;
          WindowShow: string;
          WindowUnFullscreen: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowZoom: string;
          WindowZoomIn: string;
          WindowZoomOut: string;
          WindowZoomReset: string;
      }
      • ApplicationOpenedWithFile: string
      • ApplicationStarted: string
      • ThemeChanged: string
      • WindowClosing: string
      • WindowDPIChanged: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowFilesDropped: string
      • WindowFocus: string
      • WindowFullscreen: string
      • WindowHide: string
      • WindowLostFocus: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowRestore: string
      • WindowRuntimeReady: string
      • WindowShow: string
      • WindowUnFullscreen: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowZoom: string
      • WindowZoomIn: string
      • WindowZoomOut: string
      • WindowZoomReset: string
    • Linux: {
          ApplicationStartup: string;
          SystemThemeChanged: string;
          WindowDeleteEvent: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowFocusIn: string;
          WindowFocusOut: string;
          WindowLoadChanged: string;
      }
      • ApplicationStartup: string
      • SystemThemeChanged: string
      • WindowDeleteEvent: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowFocusIn: string
      • WindowFocusOut: string
      • WindowLoadChanged: string
    • Mac: {
          ApplicationDidBecomeActive: string;
          ApplicationDidChangeBackingProperties: string;
          ApplicationDidChangeEffectiveAppearance: string;
          ApplicationDidChangeIcon: string;
          ApplicationDidChangeOcclusionState: string;
          ApplicationDidChangeScreenParameters: string;
          ApplicationDidChangeStatusBarFrame: string;
          ApplicationDidChangeStatusBarOrientation: string;
          ApplicationDidChangeTheme: string;
          ApplicationDidFinishLaunching: string;
          ApplicationDidHide: string;
          ApplicationDidResignActive: string;
          ApplicationDidUnhide: string;
          ApplicationDidUpdate: string;
          ApplicationShouldHandleReopen: string;
          ApplicationWillBecomeActive: string;
          ApplicationWillFinishLaunching: string;
          ApplicationWillHide: string;
          ApplicationWillResignActive: string;
          ApplicationWillTerminate: string;
          ApplicationWillUnhide: string;
          ApplicationWillUpdate: string;
          MenuDidAddItem: string;
          MenuDidBeginTracking: string;
          MenuDidClose: string;
          MenuDidDisplayItem: string;
          MenuDidEndTracking: string;
          MenuDidHighlightItem: string;
          MenuDidOpen: string;
          MenuDidPopUp: string;
          MenuDidRemoveItem: string;
          MenuDidSendAction: string;
          MenuDidSendActionToItem: string;
          MenuDidUpdate: string;
          MenuWillAddItem: string;
          MenuWillBeginTracking: string;
          MenuWillDisplayItem: string;
          MenuWillEndTracking: string;
          MenuWillHighlightItem: string;
          MenuWillOpen: string;
          MenuWillPopUp: string;
          MenuWillRemoveItem: string;
          MenuWillSendAction: string;
          MenuWillSendActionToItem: string;
          MenuWillUpdate: string;
          WebViewDidCommitNavigation: string;
          WebViewDidFinishNavigation: string;
          WebViewDidReceiveServerRedirectForProvisionalNavigation: string;
          WebViewDidStartProvisionalNavigation: string;
          WindowDidBecomeKey: string;
          WindowDidBecomeMain: string;
          WindowDidBeginSheet: string;
          WindowDidChangeAlpha: string;
          WindowDidChangeBackingLocation: string;
          WindowDidChangeBackingProperties: string;
          WindowDidChangeCollectionBehavior: string;
          WindowDidChangeEffectiveAppearance: string;
          WindowDidChangeOcclusionState: string;
          WindowDidChangeOrderingMode: string;
          WindowDidChangeScreen: string;
          WindowDidChangeScreenParameters: string;
          WindowDidChangeScreenProfile: string;
          WindowDidChangeScreenSpace: string;
          WindowDidChangeScreenSpaceProperties: string;
          WindowDidChangeSharingType: string;
          WindowDidChangeSpace: string;
          WindowDidChangeSpaceOrderingMode: string;
          WindowDidChangeTitle: string;
          WindowDidChangeToolbar: string;
          WindowDidDeminiaturize: string;
          WindowDidEndSheet: string;
          WindowDidEnterFullScreen: string;
          WindowDidEnterVersionBrowser: string;
          WindowDidExitFullScreen: string;
          WindowDidExitVersionBrowser: string;
          WindowDidExpose: string;
          WindowDidFocus: string;
          WindowDidMiniaturize: string;
          WindowDidMove: string;
          WindowDidOrderOffScreen: string;
          WindowDidOrderOnScreen: string;
          WindowDidResignKey: string;
          WindowDidResignMain: string;
          WindowDidResize: string;
          WindowDidUpdate: string;
          WindowDidUpdateAlpha: string;
          WindowDidUpdateCollectionBehavior: string;
          WindowDidUpdateCollectionProperties: string;
          WindowDidUpdateShadow: string;
          WindowDidUpdateTitle: string;
          WindowDidUpdateToolbar: string;
          WindowDidZoom: string;
          WindowFileDraggingEntered: string;
          WindowFileDraggingExited: string;
          WindowFileDraggingPerformed: string;
          WindowHide: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowShouldClose: string;
          WindowShow: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowWillBecomeKey: string;
          WindowWillBecomeMain: string;
          WindowWillBeginSheet: string;
          WindowWillChangeOrderingMode: string;
          WindowWillClose: string;
          WindowWillDeminiaturize: string;
          WindowWillEnterFullScreen: string;
          WindowWillEnterVersionBrowser: string;
          WindowWillExitFullScreen: string;
          WindowWillExitVersionBrowser: string;
          WindowWillFocus: string;
          WindowWillMiniaturize: string;
          WindowWillMove: string;
          WindowWillOrderOffScreen: string;
          WindowWillOrderOnScreen: string;
          WindowWillResignMain: string;
          WindowWillResize: string;
          WindowWillUnfocus: string;
          WindowWillUpdate: string;
          WindowWillUpdateAlpha: string;
          WindowWillUpdateCollectionBehavior: string;
          WindowWillUpdateCollectionProperties: string;
          WindowWillUpdateShadow: string;
          WindowWillUpdateTitle: string;
          WindowWillUpdateToolbar: string;
          WindowWillUpdateVisibility: string;
          WindowWillUseStandardFrame: string;
          WindowZoomIn: string;
          WindowZoomOut: string;
          WindowZoomReset: string;
      }
      • ApplicationDidBecomeActive: string
      • ApplicationDidChangeBackingProperties: string
      • ApplicationDidChangeEffectiveAppearance: string
      • ApplicationDidChangeIcon: string
      • ApplicationDidChangeOcclusionState: string
      • ApplicationDidChangeScreenParameters: string
      • ApplicationDidChangeStatusBarFrame: string
      • ApplicationDidChangeStatusBarOrientation: string
      • ApplicationDidChangeTheme: string
      • ApplicationDidFinishLaunching: string
      • ApplicationDidHide: string
      • ApplicationDidResignActive: string
      • ApplicationDidUnhide: string
      • ApplicationDidUpdate: string
      • ApplicationShouldHandleReopen: string
      • ApplicationWillBecomeActive: string
      • ApplicationWillFinishLaunching: string
      • ApplicationWillHide: string
      • ApplicationWillResignActive: string
      • ApplicationWillTerminate: string
      • ApplicationWillUnhide: string
      • ApplicationWillUpdate: string
      • MenuDidAddItem: string
      • MenuDidBeginTracking: string
      • MenuDidClose: string
      • MenuDidDisplayItem: string
      • MenuDidEndTracking: string
      • MenuDidHighlightItem: string
      • MenuDidOpen: string
      • MenuDidPopUp: string
      • MenuDidRemoveItem: string
      • MenuDidSendAction: string
      • MenuDidSendActionToItem: string
      • MenuDidUpdate: string
      • MenuWillAddItem: string
      • MenuWillBeginTracking: string
      • MenuWillDisplayItem: string
      • MenuWillEndTracking: string
      • MenuWillHighlightItem: string
      • MenuWillOpen: string
      • MenuWillPopUp: string
      • MenuWillRemoveItem: string
      • MenuWillSendAction: string
      • MenuWillSendActionToItem: string
      • MenuWillUpdate: string
      • WebViewDidCommitNavigation: string
      • WebViewDidFinishNavigation: string
      • WebViewDidReceiveServerRedirectForProvisionalNavigation: string
      • WebViewDidStartProvisionalNavigation: string
      • WindowDidBecomeKey: string
      • WindowDidBecomeMain: string
      • WindowDidBeginSheet: string
      • WindowDidChangeAlpha: string
      • WindowDidChangeBackingLocation: string
      • WindowDidChangeBackingProperties: string
      • WindowDidChangeCollectionBehavior: string
      • WindowDidChangeEffectiveAppearance: string
      • WindowDidChangeOcclusionState: string
      • WindowDidChangeOrderingMode: string
      • WindowDidChangeScreen: string
      • WindowDidChangeScreenParameters: string
      • WindowDidChangeScreenProfile: string
      • WindowDidChangeScreenSpace: string
      • WindowDidChangeScreenSpaceProperties: string
      • WindowDidChangeSharingType: string
      • WindowDidChangeSpace: string
      • WindowDidChangeSpaceOrderingMode: string
      • WindowDidChangeTitle: string
      • WindowDidChangeToolbar: string
      • WindowDidDeminiaturize: string
      • WindowDidEndSheet: string
      • WindowDidEnterFullScreen: string
      • WindowDidEnterVersionBrowser: string
      • WindowDidExitFullScreen: string
      • WindowDidExitVersionBrowser: string
      • WindowDidExpose: string
      • WindowDidFocus: string
      • WindowDidMiniaturize: string
      • WindowDidMove: string
      • WindowDidOrderOffScreen: string
      • WindowDidOrderOnScreen: string
      • WindowDidResignKey: string
      • WindowDidResignMain: string
      • WindowDidResize: string
      • WindowDidUpdate: string
      • WindowDidUpdateAlpha: string
      • WindowDidUpdateCollectionBehavior: string
      • WindowDidUpdateCollectionProperties: string
      • WindowDidUpdateShadow: string
      • WindowDidUpdateTitle: string
      • WindowDidUpdateToolbar: string
      • WindowDidZoom: string
      • WindowFileDraggingEntered: string
      • WindowFileDraggingExited: string
      • WindowFileDraggingPerformed: string
      • WindowHide: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowShouldClose: string
      • WindowShow: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowWillBecomeKey: string
      • WindowWillBecomeMain: string
      • WindowWillBeginSheet: string
      • WindowWillChangeOrderingMode: string
      • WindowWillClose: string
      • WindowWillDeminiaturize: string
      • WindowWillEnterFullScreen: string
      • WindowWillEnterVersionBrowser: string
      • WindowWillExitFullScreen: string
      • WindowWillExitVersionBrowser: string
      • WindowWillFocus: string
      • WindowWillMiniaturize: string
      • WindowWillMove: string
      • WindowWillOrderOffScreen: string
      • WindowWillOrderOnScreen: string
      • WindowWillResignMain: string
      • WindowWillResize: string
      • WindowWillUnfocus: string
      • WindowWillUpdate: string
      • WindowWillUpdateAlpha: string
      • WindowWillUpdateCollectionBehavior: string
      • WindowWillUpdateCollectionProperties: string
      • WindowWillUpdateShadow: string
      • WindowWillUpdateTitle: string
      • WindowWillUpdateToolbar: string
      • WindowWillUpdateVisibility: string
      • WindowWillUseStandardFrame: string
      • WindowZoomIn: string
      • WindowZoomOut: string
      • WindowZoomReset: string
    • Windows: {
          APMPowerSettingChange: string;
          APMPowerStatusChange: string;
          APMResumeAutomatic: string;
          APMResumeSuspend: string;
          APMSuspend: string;
          ApplicationStarted: string;
          SystemThemeChanged: string;
          WebViewNavigationCompleted: string;
          WindowActive: string;
          WindowBackgroundErase: string;
          WindowClickActive: string;
          WindowClosing: string;
          WindowDPIChanged: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowDragDrop: string;
          WindowDragEnter: string;
          WindowDragLeave: string;
          WindowDragOver: string;
          WindowEndMove: string;
          WindowEndResize: string;
          WindowFullscreen: string;
          WindowHide: string;
          WindowInactive: string;
          WindowKeyDown: string;
          WindowKeyUp: string;
          WindowKillFocus: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowNonClientHit: string;
          WindowNonClientMouseDown: string;
          WindowNonClientMouseLeave: string;
          WindowNonClientMouseMove: string;
          WindowNonClientMouseUp: string;
          WindowPaint: string;
          WindowRestore: string;
          WindowSetFocus: string;
          WindowShow: string;
          WindowStartMove: string;
          WindowStartResize: string;
          WindowUnFullscreen: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowZOrderChanged: string;
      }
      • APMPowerSettingChange: string
      • APMPowerStatusChange: string
      • APMResumeAutomatic: string
      • APMResumeSuspend: string
      • APMSuspend: string
      • ApplicationStarted: string
      • SystemThemeChanged: string
      • WebViewNavigationCompleted: string
      • WindowActive: string
      • WindowBackgroundErase: string
      • WindowClickActive: string
      • WindowClosing: string
      • WindowDPIChanged: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowDragDrop: string
      • WindowDragEnter: string
      • WindowDragLeave: string
      • WindowDragOver: string
      • WindowEndMove: string
      • WindowEndResize: string
      • WindowFullscreen: string
      • WindowHide: string
      • WindowInactive: string
      • WindowKeyDown: string
      • WindowKeyUp: string
      • WindowKillFocus: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowNonClientHit: string
      • WindowNonClientMouseDown: string
      • WindowNonClientMouseLeave: string
      • WindowNonClientMouseMove: string
      • WindowNonClientMouseUp: string
      • WindowPaint: string
      • WindowRestore: string
      • WindowSetFocus: string
      • WindowShow: string
      • WindowStartMove: string
      • WindowStartResize: string
      • WindowUnFullscreen: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowZOrderChanged: string

    Generated using TypeDoc

    \ No newline at end of file +Types | @wailsio/runtime

    Variable TypesConst

    Types: {
        Common: {
            ApplicationOpenedWithFile: string;
            ApplicationStarted: string;
            ThemeChanged: string;
            WindowClosing: string;
            WindowDPIChanged: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowFilesDropped: string;
            WindowFocus: string;
            WindowFullscreen: string;
            WindowHide: string;
            WindowLostFocus: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowRestore: string;
            WindowRuntimeReady: string;
            WindowShow: string;
            WindowUnFullscreen: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowZoom: string;
            WindowZoomIn: string;
            WindowZoomOut: string;
            WindowZoomReset: string;
        };
        Linux: {
            ApplicationStartup: string;
            SystemThemeChanged: string;
            WindowDeleteEvent: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowFocusIn: string;
            WindowFocusOut: string;
            WindowLoadChanged: string;
        };
        Mac: {
            ApplicationDidBecomeActive: string;
            ApplicationDidChangeBackingProperties: string;
            ApplicationDidChangeEffectiveAppearance: string;
            ApplicationDidChangeIcon: string;
            ApplicationDidChangeOcclusionState: string;
            ApplicationDidChangeScreenParameters: string;
            ApplicationDidChangeStatusBarFrame: string;
            ApplicationDidChangeStatusBarOrientation: string;
            ApplicationDidChangeTheme: string;
            ApplicationDidFinishLaunching: string;
            ApplicationDidHide: string;
            ApplicationDidResignActive: string;
            ApplicationDidUnhide: string;
            ApplicationDidUpdate: string;
            ApplicationShouldHandleReopen: string;
            ApplicationWillBecomeActive: string;
            ApplicationWillFinishLaunching: string;
            ApplicationWillHide: string;
            ApplicationWillResignActive: string;
            ApplicationWillTerminate: string;
            ApplicationWillUnhide: string;
            ApplicationWillUpdate: string;
            MenuDidAddItem: string;
            MenuDidBeginTracking: string;
            MenuDidClose: string;
            MenuDidDisplayItem: string;
            MenuDidEndTracking: string;
            MenuDidHighlightItem: string;
            MenuDidOpen: string;
            MenuDidPopUp: string;
            MenuDidRemoveItem: string;
            MenuDidSendAction: string;
            MenuDidSendActionToItem: string;
            MenuDidUpdate: string;
            MenuWillAddItem: string;
            MenuWillBeginTracking: string;
            MenuWillDisplayItem: string;
            MenuWillEndTracking: string;
            MenuWillHighlightItem: string;
            MenuWillOpen: string;
            MenuWillPopUp: string;
            MenuWillRemoveItem: string;
            MenuWillSendAction: string;
            MenuWillSendActionToItem: string;
            MenuWillUpdate: string;
            WebViewDidCommitNavigation: string;
            WebViewDidFinishNavigation: string;
            WebViewDidReceiveServerRedirectForProvisionalNavigation: string;
            WebViewDidStartProvisionalNavigation: string;
            WindowDidBecomeKey: string;
            WindowDidBecomeMain: string;
            WindowDidBeginSheet: string;
            WindowDidChangeAlpha: string;
            WindowDidChangeBackingLocation: string;
            WindowDidChangeBackingProperties: string;
            WindowDidChangeCollectionBehavior: string;
            WindowDidChangeEffectiveAppearance: string;
            WindowDidChangeOcclusionState: string;
            WindowDidChangeOrderingMode: string;
            WindowDidChangeScreen: string;
            WindowDidChangeScreenParameters: string;
            WindowDidChangeScreenProfile: string;
            WindowDidChangeScreenSpace: string;
            WindowDidChangeScreenSpaceProperties: string;
            WindowDidChangeSharingType: string;
            WindowDidChangeSpace: string;
            WindowDidChangeSpaceOrderingMode: string;
            WindowDidChangeTitle: string;
            WindowDidChangeToolbar: string;
            WindowDidDeminiaturize: string;
            WindowDidEndSheet: string;
            WindowDidEnterFullScreen: string;
            WindowDidEnterVersionBrowser: string;
            WindowDidExitFullScreen: string;
            WindowDidExitVersionBrowser: string;
            WindowDidExpose: string;
            WindowDidFocus: string;
            WindowDidMiniaturize: string;
            WindowDidMove: string;
            WindowDidOrderOffScreen: string;
            WindowDidOrderOnScreen: string;
            WindowDidResignKey: string;
            WindowDidResignMain: string;
            WindowDidResize: string;
            WindowDidUpdate: string;
            WindowDidUpdateAlpha: string;
            WindowDidUpdateCollectionBehavior: string;
            WindowDidUpdateCollectionProperties: string;
            WindowDidUpdateShadow: string;
            WindowDidUpdateTitle: string;
            WindowDidUpdateToolbar: string;
            WindowDidZoom: string;
            WindowFileDraggingEntered: string;
            WindowFileDraggingExited: string;
            WindowFileDraggingPerformed: string;
            WindowHide: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowShouldClose: string;
            WindowShow: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowWillBecomeKey: string;
            WindowWillBecomeMain: string;
            WindowWillBeginSheet: string;
            WindowWillChangeOrderingMode: string;
            WindowWillClose: string;
            WindowWillDeminiaturize: string;
            WindowWillEnterFullScreen: string;
            WindowWillEnterVersionBrowser: string;
            WindowWillExitFullScreen: string;
            WindowWillExitVersionBrowser: string;
            WindowWillFocus: string;
            WindowWillMiniaturize: string;
            WindowWillMove: string;
            WindowWillOrderOffScreen: string;
            WindowWillOrderOnScreen: string;
            WindowWillResignMain: string;
            WindowWillResize: string;
            WindowWillUnfocus: string;
            WindowWillUpdate: string;
            WindowWillUpdateAlpha: string;
            WindowWillUpdateCollectionBehavior: string;
            WindowWillUpdateCollectionProperties: string;
            WindowWillUpdateShadow: string;
            WindowWillUpdateTitle: string;
            WindowWillUpdateToolbar: string;
            WindowWillUpdateVisibility: string;
            WindowWillUseStandardFrame: string;
            WindowZoomIn: string;
            WindowZoomOut: string;
            WindowZoomReset: string;
        };
        Windows: {
            APMPowerSettingChange: string;
            APMPowerStatusChange: string;
            APMResumeAutomatic: string;
            APMResumeSuspend: string;
            APMSuspend: string;
            ApplicationStarted: string;
            SystemThemeChanged: string;
            WebViewNavigationCompleted: string;
            WindowActive: string;
            WindowBackgroundErase: string;
            WindowClickActive: string;
            WindowClosing: string;
            WindowDPIChanged: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowDragDrop: string;
            WindowDragEnter: string;
            WindowDragLeave: string;
            WindowDragOver: string;
            WindowEndMove: string;
            WindowEndResize: string;
            WindowFullscreen: string;
            WindowHide: string;
            WindowInactive: string;
            WindowKeyDown: string;
            WindowKeyUp: string;
            WindowKillFocus: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowNonClientHit: string;
            WindowNonClientMouseDown: string;
            WindowNonClientMouseLeave: string;
            WindowNonClientMouseMove: string;
            WindowNonClientMouseUp: string;
            WindowPaint: string;
            WindowRestore: string;
            WindowSetFocus: string;
            WindowShow: string;
            WindowStartMove: string;
            WindowStartResize: string;
            WindowUnFullscreen: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowZOrderChanged: string;
        };
    } = EventTypes

    Type declaration

    • Common: {
          ApplicationOpenedWithFile: string;
          ApplicationStarted: string;
          ThemeChanged: string;
          WindowClosing: string;
          WindowDPIChanged: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowFilesDropped: string;
          WindowFocus: string;
          WindowFullscreen: string;
          WindowHide: string;
          WindowLostFocus: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowRestore: string;
          WindowRuntimeReady: string;
          WindowShow: string;
          WindowUnFullscreen: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowZoom: string;
          WindowZoomIn: string;
          WindowZoomOut: string;
          WindowZoomReset: string;
      }
      • ApplicationOpenedWithFile: string
      • ApplicationStarted: string
      • ThemeChanged: string
      • WindowClosing: string
      • WindowDPIChanged: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowFilesDropped: string
      • WindowFocus: string
      • WindowFullscreen: string
      • WindowHide: string
      • WindowLostFocus: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowRestore: string
      • WindowRuntimeReady: string
      • WindowShow: string
      • WindowUnFullscreen: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowZoom: string
      • WindowZoomIn: string
      • WindowZoomOut: string
      • WindowZoomReset: string
    • Linux: {
          ApplicationStartup: string;
          SystemThemeChanged: string;
          WindowDeleteEvent: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowFocusIn: string;
          WindowFocusOut: string;
          WindowLoadChanged: string;
      }
      • ApplicationStartup: string
      • SystemThemeChanged: string
      • WindowDeleteEvent: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowFocusIn: string
      • WindowFocusOut: string
      • WindowLoadChanged: string
    • Mac: {
          ApplicationDidBecomeActive: string;
          ApplicationDidChangeBackingProperties: string;
          ApplicationDidChangeEffectiveAppearance: string;
          ApplicationDidChangeIcon: string;
          ApplicationDidChangeOcclusionState: string;
          ApplicationDidChangeScreenParameters: string;
          ApplicationDidChangeStatusBarFrame: string;
          ApplicationDidChangeStatusBarOrientation: string;
          ApplicationDidChangeTheme: string;
          ApplicationDidFinishLaunching: string;
          ApplicationDidHide: string;
          ApplicationDidResignActive: string;
          ApplicationDidUnhide: string;
          ApplicationDidUpdate: string;
          ApplicationShouldHandleReopen: string;
          ApplicationWillBecomeActive: string;
          ApplicationWillFinishLaunching: string;
          ApplicationWillHide: string;
          ApplicationWillResignActive: string;
          ApplicationWillTerminate: string;
          ApplicationWillUnhide: string;
          ApplicationWillUpdate: string;
          MenuDidAddItem: string;
          MenuDidBeginTracking: string;
          MenuDidClose: string;
          MenuDidDisplayItem: string;
          MenuDidEndTracking: string;
          MenuDidHighlightItem: string;
          MenuDidOpen: string;
          MenuDidPopUp: string;
          MenuDidRemoveItem: string;
          MenuDidSendAction: string;
          MenuDidSendActionToItem: string;
          MenuDidUpdate: string;
          MenuWillAddItem: string;
          MenuWillBeginTracking: string;
          MenuWillDisplayItem: string;
          MenuWillEndTracking: string;
          MenuWillHighlightItem: string;
          MenuWillOpen: string;
          MenuWillPopUp: string;
          MenuWillRemoveItem: string;
          MenuWillSendAction: string;
          MenuWillSendActionToItem: string;
          MenuWillUpdate: string;
          WebViewDidCommitNavigation: string;
          WebViewDidFinishNavigation: string;
          WebViewDidReceiveServerRedirectForProvisionalNavigation: string;
          WebViewDidStartProvisionalNavigation: string;
          WindowDidBecomeKey: string;
          WindowDidBecomeMain: string;
          WindowDidBeginSheet: string;
          WindowDidChangeAlpha: string;
          WindowDidChangeBackingLocation: string;
          WindowDidChangeBackingProperties: string;
          WindowDidChangeCollectionBehavior: string;
          WindowDidChangeEffectiveAppearance: string;
          WindowDidChangeOcclusionState: string;
          WindowDidChangeOrderingMode: string;
          WindowDidChangeScreen: string;
          WindowDidChangeScreenParameters: string;
          WindowDidChangeScreenProfile: string;
          WindowDidChangeScreenSpace: string;
          WindowDidChangeScreenSpaceProperties: string;
          WindowDidChangeSharingType: string;
          WindowDidChangeSpace: string;
          WindowDidChangeSpaceOrderingMode: string;
          WindowDidChangeTitle: string;
          WindowDidChangeToolbar: string;
          WindowDidDeminiaturize: string;
          WindowDidEndSheet: string;
          WindowDidEnterFullScreen: string;
          WindowDidEnterVersionBrowser: string;
          WindowDidExitFullScreen: string;
          WindowDidExitVersionBrowser: string;
          WindowDidExpose: string;
          WindowDidFocus: string;
          WindowDidMiniaturize: string;
          WindowDidMove: string;
          WindowDidOrderOffScreen: string;
          WindowDidOrderOnScreen: string;
          WindowDidResignKey: string;
          WindowDidResignMain: string;
          WindowDidResize: string;
          WindowDidUpdate: string;
          WindowDidUpdateAlpha: string;
          WindowDidUpdateCollectionBehavior: string;
          WindowDidUpdateCollectionProperties: string;
          WindowDidUpdateShadow: string;
          WindowDidUpdateTitle: string;
          WindowDidUpdateToolbar: string;
          WindowDidZoom: string;
          WindowFileDraggingEntered: string;
          WindowFileDraggingExited: string;
          WindowFileDraggingPerformed: string;
          WindowHide: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowShouldClose: string;
          WindowShow: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowWillBecomeKey: string;
          WindowWillBecomeMain: string;
          WindowWillBeginSheet: string;
          WindowWillChangeOrderingMode: string;
          WindowWillClose: string;
          WindowWillDeminiaturize: string;
          WindowWillEnterFullScreen: string;
          WindowWillEnterVersionBrowser: string;
          WindowWillExitFullScreen: string;
          WindowWillExitVersionBrowser: string;
          WindowWillFocus: string;
          WindowWillMiniaturize: string;
          WindowWillMove: string;
          WindowWillOrderOffScreen: string;
          WindowWillOrderOnScreen: string;
          WindowWillResignMain: string;
          WindowWillResize: string;
          WindowWillUnfocus: string;
          WindowWillUpdate: string;
          WindowWillUpdateAlpha: string;
          WindowWillUpdateCollectionBehavior: string;
          WindowWillUpdateCollectionProperties: string;
          WindowWillUpdateShadow: string;
          WindowWillUpdateTitle: string;
          WindowWillUpdateToolbar: string;
          WindowWillUpdateVisibility: string;
          WindowWillUseStandardFrame: string;
          WindowZoomIn: string;
          WindowZoomOut: string;
          WindowZoomReset: string;
      }
      • ApplicationDidBecomeActive: string
      • ApplicationDidChangeBackingProperties: string
      • ApplicationDidChangeEffectiveAppearance: string
      • ApplicationDidChangeIcon: string
      • ApplicationDidChangeOcclusionState: string
      • ApplicationDidChangeScreenParameters: string
      • ApplicationDidChangeStatusBarFrame: string
      • ApplicationDidChangeStatusBarOrientation: string
      • ApplicationDidChangeTheme: string
      • ApplicationDidFinishLaunching: string
      • ApplicationDidHide: string
      • ApplicationDidResignActive: string
      • ApplicationDidUnhide: string
      • ApplicationDidUpdate: string
      • ApplicationShouldHandleReopen: string
      • ApplicationWillBecomeActive: string
      • ApplicationWillFinishLaunching: string
      • ApplicationWillHide: string
      • ApplicationWillResignActive: string
      • ApplicationWillTerminate: string
      • ApplicationWillUnhide: string
      • ApplicationWillUpdate: string
      • MenuDidAddItem: string
      • MenuDidBeginTracking: string
      • MenuDidClose: string
      • MenuDidDisplayItem: string
      • MenuDidEndTracking: string
      • MenuDidHighlightItem: string
      • MenuDidOpen: string
      • MenuDidPopUp: string
      • MenuDidRemoveItem: string
      • MenuDidSendAction: string
      • MenuDidSendActionToItem: string
      • MenuDidUpdate: string
      • MenuWillAddItem: string
      • MenuWillBeginTracking: string
      • MenuWillDisplayItem: string
      • MenuWillEndTracking: string
      • MenuWillHighlightItem: string
      • MenuWillOpen: string
      • MenuWillPopUp: string
      • MenuWillRemoveItem: string
      • MenuWillSendAction: string
      • MenuWillSendActionToItem: string
      • MenuWillUpdate: string
      • WebViewDidCommitNavigation: string
      • WebViewDidFinishNavigation: string
      • WebViewDidReceiveServerRedirectForProvisionalNavigation: string
      • WebViewDidStartProvisionalNavigation: string
      • WindowDidBecomeKey: string
      • WindowDidBecomeMain: string
      • WindowDidBeginSheet: string
      • WindowDidChangeAlpha: string
      • WindowDidChangeBackingLocation: string
      • WindowDidChangeBackingProperties: string
      • WindowDidChangeCollectionBehavior: string
      • WindowDidChangeEffectiveAppearance: string
      • WindowDidChangeOcclusionState: string
      • WindowDidChangeOrderingMode: string
      • WindowDidChangeScreen: string
      • WindowDidChangeScreenParameters: string
      • WindowDidChangeScreenProfile: string
      • WindowDidChangeScreenSpace: string
      • WindowDidChangeScreenSpaceProperties: string
      • WindowDidChangeSharingType: string
      • WindowDidChangeSpace: string
      • WindowDidChangeSpaceOrderingMode: string
      • WindowDidChangeTitle: string
      • WindowDidChangeToolbar: string
      • WindowDidDeminiaturize: string
      • WindowDidEndSheet: string
      • WindowDidEnterFullScreen: string
      • WindowDidEnterVersionBrowser: string
      • WindowDidExitFullScreen: string
      • WindowDidExitVersionBrowser: string
      • WindowDidExpose: string
      • WindowDidFocus: string
      • WindowDidMiniaturize: string
      • WindowDidMove: string
      • WindowDidOrderOffScreen: string
      • WindowDidOrderOnScreen: string
      • WindowDidResignKey: string
      • WindowDidResignMain: string
      • WindowDidResize: string
      • WindowDidUpdate: string
      • WindowDidUpdateAlpha: string
      • WindowDidUpdateCollectionBehavior: string
      • WindowDidUpdateCollectionProperties: string
      • WindowDidUpdateShadow: string
      • WindowDidUpdateTitle: string
      • WindowDidUpdateToolbar: string
      • WindowDidZoom: string
      • WindowFileDraggingEntered: string
      • WindowFileDraggingExited: string
      • WindowFileDraggingPerformed: string
      • WindowHide: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowShouldClose: string
      • WindowShow: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowWillBecomeKey: string
      • WindowWillBecomeMain: string
      • WindowWillBeginSheet: string
      • WindowWillChangeOrderingMode: string
      • WindowWillClose: string
      • WindowWillDeminiaturize: string
      • WindowWillEnterFullScreen: string
      • WindowWillEnterVersionBrowser: string
      • WindowWillExitFullScreen: string
      • WindowWillExitVersionBrowser: string
      • WindowWillFocus: string
      • WindowWillMiniaturize: string
      • WindowWillMove: string
      • WindowWillOrderOffScreen: string
      • WindowWillOrderOnScreen: string
      • WindowWillResignMain: string
      • WindowWillResize: string
      • WindowWillUnfocus: string
      • WindowWillUpdate: string
      • WindowWillUpdateAlpha: string
      • WindowWillUpdateCollectionBehavior: string
      • WindowWillUpdateCollectionProperties: string
      • WindowWillUpdateShadow: string
      • WindowWillUpdateTitle: string
      • WindowWillUpdateToolbar: string
      • WindowWillUpdateVisibility: string
      • WindowWillUseStandardFrame: string
      • WindowZoomIn: string
      • WindowZoomOut: string
      • WindowZoomReset: string
    • Windows: {
          APMPowerSettingChange: string;
          APMPowerStatusChange: string;
          APMResumeAutomatic: string;
          APMResumeSuspend: string;
          APMSuspend: string;
          ApplicationStarted: string;
          SystemThemeChanged: string;
          WebViewNavigationCompleted: string;
          WindowActive: string;
          WindowBackgroundErase: string;
          WindowClickActive: string;
          WindowClosing: string;
          WindowDPIChanged: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowDragDrop: string;
          WindowDragEnter: string;
          WindowDragLeave: string;
          WindowDragOver: string;
          WindowEndMove: string;
          WindowEndResize: string;
          WindowFullscreen: string;
          WindowHide: string;
          WindowInactive: string;
          WindowKeyDown: string;
          WindowKeyUp: string;
          WindowKillFocus: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowNonClientHit: string;
          WindowNonClientMouseDown: string;
          WindowNonClientMouseLeave: string;
          WindowNonClientMouseMove: string;
          WindowNonClientMouseUp: string;
          WindowPaint: string;
          WindowRestore: string;
          WindowSetFocus: string;
          WindowShow: string;
          WindowStartMove: string;
          WindowStartResize: string;
          WindowUnFullscreen: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowZOrderChanged: string;
      }
      • APMPowerSettingChange: string
      • APMPowerStatusChange: string
      • APMResumeAutomatic: string
      • APMResumeSuspend: string
      • APMSuspend: string
      • ApplicationStarted: string
      • SystemThemeChanged: string
      • WebViewNavigationCompleted: string
      • WindowActive: string
      • WindowBackgroundErase: string
      • WindowClickActive: string
      • WindowClosing: string
      • WindowDPIChanged: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowDragDrop: string
      • WindowDragEnter: string
      • WindowDragLeave: string
      • WindowDragOver: string
      • WindowEndMove: string
      • WindowEndResize: string
      • WindowFullscreen: string
      • WindowHide: string
      • WindowInactive: string
      • WindowKeyDown: string
      • WindowKeyUp: string
      • WindowKillFocus: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowNonClientHit: string
      • WindowNonClientMouseDown: string
      • WindowNonClientMouseLeave: string
      • WindowNonClientMouseMove: string
      • WindowNonClientMouseUp: string
      • WindowPaint: string
      • WindowRestore: string
      • WindowSetFocus: string
      • WindowShow: string
      • WindowStartMove: string
      • WindowStartResize: string
      • WindowUnFullscreen: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowZOrderChanged: string

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Window.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Window.html index fe8bec18d..a28337313 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Window.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Window.html @@ -1,2 +1,2 @@ Window | @wailsio/runtime

    Variable WindowConst

    Window: Window = ...

    The window within which the script is running.

    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/package-lock.json b/v3/internal/runtime/desktop/@wailsio/runtime/package-lock.json index 62e3542b3..cd0547ca5 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/package-lock.json +++ b/v3/internal/runtime/desktop/@wailsio/runtime/package-lock.json @@ -1,12 +1,12 @@ { "name": "@wailsio/runtime", - "version": "3.0.0-alpha.60", + "version": "3.0.0-alpha.61", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@wailsio/runtime", - "version": "3.0.0-alpha.60", + "version": "3.0.0-alpha.61", "license": "MIT", "devDependencies": { "rimraf": "^5.0.5", diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/package.json b/v3/internal/runtime/desktop/@wailsio/runtime/package.json index 09d2b2f96..c75f97992 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/package.json +++ b/v3/internal/runtime/desktop/@wailsio/runtime/package.json @@ -1,7 +1,7 @@ { "name": "@wailsio/runtime", "type": "module", - "version": "3.0.0-alpha.60", + "version": "3.0.0-alpha.61", "description": "Wails Runtime", "types": "types/index.d.ts", "exports": { From 3b045ada7b212e439af1b8387e75311f5b58ee67 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Fri, 28 Feb 2025 07:07:43 +1100 Subject: [PATCH 104/374] [ci] update PR Checks conditions --- .github/workflows/build-and-test-v3.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-and-test-v3.yml b/.github/workflows/build-and-test-v3.yml index c3278f6e1..b8eede071 100644 --- a/.github/workflows/build-and-test-v3.yml +++ b/.github/workflows/build-and-test-v3.yml @@ -27,7 +27,7 @@ jobs: fi test_go: - name: Run Go Tests + name: Run Go Tests v3 needs: check_approval runs-on: ${{ matrix.os }} strategy: From e4f0b64630eed2ba7a4f012922169aeb9c94f44b Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Thu, 27 Feb 2025 20:09:11 +0000 Subject: [PATCH 105/374] [skip ci] Publish @wailsio/runtime v3.0.0-alpha.62 --- .../docs/classes/Call.RuntimeError.html | 4 +-- .../docs/classes/Events.WailsEvent.html | 4 +-- .../docs/functions/Application.Hide.html | 2 +- .../docs/functions/Application.Quit.html | 2 +- .../docs/functions/Application.Show.html | 2 +- .../docs/functions/Browser.OpenURL.html | 2 +- .../runtime/docs/functions/Call.ByID.html | 2 +- .../runtime/docs/functions/Call.ByName.html | 2 +- .../runtime/docs/functions/Call.Call.html | 2 +- .../docs/functions/Clipboard.SetText.html | 2 +- .../docs/functions/Clipboard.Text.html | 2 +- .../runtime/docs/functions/Create.Any.html | 2 +- .../runtime/docs/functions/Create.Array.html | 2 +- .../docs/functions/Create.ByteSlice.html | 2 +- .../runtime/docs/functions/Create.Map.html | 2 +- .../docs/functions/Create.Nullable.html | 2 +- .../runtime/docs/functions/Create.Struct.html | 2 +- .../runtime/docs/functions/Dialogs.Error.html | 2 +- .../runtime/docs/functions/Dialogs.Info.html | 2 +- .../docs/functions/Dialogs.OpenFile.html | 2 +- .../docs/functions/Dialogs.Question.html | 2 +- .../docs/functions/Dialogs.SaveFile.html | 2 +- .../docs/functions/Dialogs.Warning.html | 2 +- .../runtime/docs/functions/Events.Emit.html | 2 +- .../runtime/docs/functions/Events.Off.html | 2 +- .../runtime/docs/functions/Events.OffAll.html | 2 +- .../runtime/docs/functions/Events.On.html | 2 +- .../docs/functions/Events.OnMultiple.html | 2 +- .../runtime/docs/functions/Events.Once.html | 2 +- .../runtime/docs/functions/Events.setup.html | 2 +- .../runtime/docs/functions/Flags.GetFlag.html | 2 +- .../docs/functions/Screens.GetAll.html | 2 +- .../docs/functions/Screens.GetCurrent.html | 2 +- .../docs/functions/Screens.GetPrimary.html | 2 +- .../docs/functions/System.Capabilities.html | 2 +- .../docs/functions/System.Environment.html | 2 +- .../docs/functions/System.IsAMD64.html | 2 +- .../runtime/docs/functions/System.IsARM.html | 2 +- .../docs/functions/System.IsARM64.html | 2 +- .../docs/functions/System.IsDarkMode.html | 2 +- .../docs/functions/System.IsDebug.html | 2 +- .../docs/functions/System.IsLinux.html | 2 +- .../runtime/docs/functions/System.IsMac.html | 2 +- .../docs/functions/System.IsWindows.html | 2 +- .../runtime/docs/functions/System.invoke.html | 2 +- .../runtime/docs/functions/WML.Enable.html | 2 +- .../runtime/docs/functions/WML.Reload.html | 2 +- .../@wailsio/runtime/docs/functions/init.html | 2 +- .../docs/interfaces/Call.CallOptions.html | 8 ++--- .../docs/interfaces/Dialogs.Button.html | 8 ++--- .../docs/interfaces/Dialogs.FileFilter.html | 6 ++-- .../Dialogs.MessageDialogOptions.html | 10 +++--- .../Dialogs.OpenFileDialogOptions.html | 34 +++++++++--------- .../Dialogs.SaveFileDialogOptions.html | 36 +++++++++---------- .../runtime/docs/interfaces/Screens.Rect.html | 10 +++--- .../docs/interfaces/Screens.Screen.html | 26 +++++++------- .../runtime/docs/interfaces/Screens.Size.html | 6 ++-- .../interfaces/System.EnvironmentInfo.html | 12 +++---- .../docs/interfaces/System.OSInfo.html | 10 +++--- .../runtime/docs/modules/Application.html | 2 +- .../runtime/docs/modules/Browser.html | 2 +- .../@wailsio/runtime/docs/modules/Call.html | 2 +- .../runtime/docs/modules/Clipboard.html | 2 +- .../@wailsio/runtime/docs/modules/Create.html | 2 +- .../runtime/docs/modules/Dialogs.html | 2 +- .../@wailsio/runtime/docs/modules/Events.html | 2 +- .../@wailsio/runtime/docs/modules/Flags.html | 2 +- .../runtime/docs/modules/Screens.html | 2 +- .../@wailsio/runtime/docs/modules/System.html | 2 +- .../@wailsio/runtime/docs/modules/WML.html | 2 +- .../runtime/docs/variables/Events.Types.html | 2 +- .../runtime/docs/variables/Window.html | 2 +- .../@wailsio/runtime/package-lock.json | 4 +-- .../desktop/@wailsio/runtime/package.json | 2 +- 74 files changed, 149 insertions(+), 149 deletions(-) diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Call.RuntimeError.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Call.RuntimeError.html index 8b7aa6d26..48388cf63 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Call.RuntimeError.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Call.RuntimeError.html @@ -1,6 +1,6 @@ RuntimeError | @wailsio/runtime

    Exception class that will be thrown in case the bound method returns an error. The value of the RuntimeError#name property is "RuntimeError".

    -

    Hierarchy

    • Error
      • RuntimeError

    Constructors

    Hierarchy

    • Error
      • RuntimeError

    Constructors

    Properties

    cause? message name @@ -8,4 +8,4 @@ The value of the

    Constructors

    • Constructs a new RuntimeError instance.

      Parameters

      • message: string

        The error message.

      • Rest ...args: any[]

        Optional arguments for the Error constructor.

        -

      Returns RuntimeError

    Properties

    cause?: unknown
    message: string
    name: string
    stack?: string

    Generated using TypeDoc

    \ No newline at end of file +

    Returns RuntimeError

    Properties

    cause?: unknown
    message: string
    name: string
    stack?: string

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Events.WailsEvent.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Events.WailsEvent.html index c59223749..371bf58dc 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Events.WailsEvent.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Events.WailsEvent.html @@ -1,4 +1,4 @@ -WailsEvent | @wailsio/runtime

    Constructors

    constructor +WailsEvent | @wailsio/runtime

    Constructors

    Properties

    Constructors

    Properties

    data: any
    name: any

    Generated using TypeDoc

    \ No newline at end of file +

    Constructors

    Properties

    data: any
    name: any

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Hide.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Hide.html index 3d8968c8a..cebce5498 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Hide.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Hide.html @@ -1,2 +1,2 @@ Hide | @wailsio/runtime
    • Hides a certain method by calling the HideMethod function.

      -

      Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file +

    Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Quit.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Quit.html index 30b32a250..de8a503bb 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Quit.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Quit.html @@ -1,2 +1,2 @@ Quit | @wailsio/runtime
    • Calls the QuitMethod to terminate the program.

      -

      Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file +

    Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Show.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Show.html index fe3a53432..ae90eed04 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Show.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Show.html @@ -1,2 +1,2 @@ Show | @wailsio/runtime
    • Calls the ShowMethod and returns the result.

      -

      Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file +

    Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Browser.OpenURL.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Browser.OpenURL.html index 51086c535..6a7c37f35 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Browser.OpenURL.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Browser.OpenURL.html @@ -1,3 +1,3 @@ OpenURL | @wailsio/runtime
    • Open a browser window to the given URL

      Parameters

      • url: string

        The URL to open

        -

      Returns Promise<string>

    Generated using TypeDoc

    \ No newline at end of file +

    Returns Promise<string>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByID.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByID.html index c7f8efc47..d10964bc5 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByID.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByID.html @@ -5,4 +5,4 @@ See Call for details.

    Returns Promise<any>

    • The result of the method call.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByName.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByName.html index f3c0a30ee..e4a3fc69c 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByName.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByName.html @@ -3,4 +3,4 @@ See Call for details.

    Parameters

    • methodName: string

      The name of the method in the format 'package.struct.method'.

    • Rest ...args: any[]

      The arguments to pass to the method.

    Returns Promise<any>

    The result of the method call.

    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.Call.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.Call.html index 0b030274f..1c0da1bb0 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.Call.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.Call.html @@ -8,4 +8,4 @@ by the application- or service-level error marshaling functions.

    Returns Promise<any>

    • The result of the call.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.SetText.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.SetText.html index 44ca80c1d..b1aaab33a 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.SetText.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.SetText.html @@ -3,4 +3,4 @@

    Returns Promise<any>

    • A Promise that resolves when the operation is successful.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.Text.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.Text.html index 67a12bda3..5380aae54 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.Text.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.Text.html @@ -1,3 +1,3 @@ Text | @wailsio/runtime
    • Get the Clipboard text

      Returns Promise<string>

      A promise that resolves with the text from the Clipboard.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Any.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Any.html index ab31d1985..9aad4ab64 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Any.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Any.html @@ -1,2 +1,2 @@ Any | @wailsio/runtime
    • Any is a dummy creation function for simple or unknown types.

      -

      Type Parameters

      • T

      Parameters

      • source: any

      Returns T

    Generated using TypeDoc

    \ No newline at end of file +

    Type Parameters

    • T

    Parameters

    • source: any

    Returns T

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Array.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Array.html index c453e6fe8..432db339b 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Array.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Array.html @@ -1,4 +1,4 @@ Array | @wailsio/runtime
    • Array takes a creation function for an arbitrary type and returns an in-place creation function for an array whose elements are of that type.

      -

      Type Parameters

      • T

      Parameters

      • element: ((source) => T)
          • (source): T
          • Parameters

            • source: any

            Returns T

      Returns ((source) => T[])

        • (source): T[]
        • Parameters

          • source: any

          Returns T[]

    Generated using TypeDoc

    \ No newline at end of file +

    Type Parameters

    • T

    Parameters

    • element: ((source) => T)
        • (source): T
        • Parameters

          • source: any

          Returns T

    Returns ((source) => T[])

      • (source): T[]
      • Parameters

        • source: any

        Returns T[]

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.ByteSlice.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.ByteSlice.html index e8e8164d0..975e4835a 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.ByteSlice.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.ByteSlice.html @@ -1,3 +1,3 @@ ByteSlice | @wailsio/runtime
    • ByteSlice is a creation function that replaces null strings with empty strings.

      -

      Parameters

      • source: any

      Returns string

    Generated using TypeDoc

    \ No newline at end of file +

    Parameters

    • source: any

    Returns string

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Map.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Map.html index 56e7e3bf4..feb42a619 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Map.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Map.html @@ -1,4 +1,4 @@ Map | @wailsio/runtime
    • Map takes creation functions for two arbitrary types and returns an in-place creation function for an object whose keys and values are of those types.

      -

      Type Parameters

      • K
      • V

      Parameters

      • key: ((source) => K)
          • (source): K
          • Parameters

            • source: any

            Returns K

      • value: ((source) => V)
          • (source): V
          • Parameters

            • source: any

            Returns V

      Returns ((source) => {
          [_: K]: V;
      })

        • (source): {
              [_: K]: V;
          }
        • Parameters

          • source: any

          Returns {
              [_: K]: V;
          }

    Generated using TypeDoc

    \ No newline at end of file +

    Type Parameters

    • K
    • V

    Parameters

    • key: ((source) => K)
        • (source): K
        • Parameters

          • source: any

          Returns K

    • value: ((source) => V)
        • (source): V
        • Parameters

          • source: any

          Returns V

    Returns ((source) => {
        [_: K]: V;
    })

      • (source): {
            [_: K]: V;
        }
      • Parameters

        • source: any

        Returns {
            [_: K]: V;
        }

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Nullable.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Nullable.html index 062327e16..05aa540c2 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Nullable.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Nullable.html @@ -1,3 +1,3 @@ Nullable | @wailsio/runtime
    • Nullable takes a creation function for an arbitrary type and returns a creation function for a nullable value of that type.

      -

      Type Parameters

      • T

      Parameters

      • element: ((source) => T)
          • (source): T
          • Parameters

            • source: any

            Returns T

      Returns ((source) => null | T)

        • (source): null | T
        • Parameters

          • source: any

          Returns null | T

    Generated using TypeDoc

    \ No newline at end of file +

    Type Parameters

    • T

    Parameters

    • element: ((source) => T)
        • (source): T
        • Parameters

          • source: any

          Returns T

    Returns ((source) => null | T)

      • (source): null | T
      • Parameters

        • source: any

        Returns null | T

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Struct.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Struct.html index 5b679d33a..be9e29caa 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Struct.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Struct.html @@ -1,3 +1,3 @@ Struct | @wailsio/runtime
    • Struct takes an object mapping field names to creation functions and returns an in-place creation function for a struct.

      -

      Type Parameters

      • T extends {
            [_: string]: ((source) => any);
        }
      • U extends {
            [Key in string | number | symbol]?: ReturnType<T[Key]>
        }

      Parameters

      • createField: T

      Returns ((source) => U)

        • (source): U
        • Parameters

          • source: any

          Returns U

    Generated using TypeDoc

    \ No newline at end of file +

    Type Parameters

    • T extends {
          [_: string]: ((source) => any);
      }
    • U extends {
          [Key in string | number | symbol]?: ReturnType<T[Key]>
      }

    Parameters

    • createField: T

    Returns ((source) => U)

      • (source): U
      • Parameters

        • source: any

        Returns U

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Error.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Error.html index de60e46b4..4e8fd55e4 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Error.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Error.html @@ -2,4 +2,4 @@

    Returns Promise<string>

    • The label of the button pressed
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Info.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Info.html index 45d8e42e4..fe0a46f8e 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Info.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Info.html @@ -2,4 +2,4 @@

    Returns Promise<string>

    • The label of the button pressed
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.OpenFile.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.OpenFile.html index a98c2f5d9..db6f6f867 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.OpenFile.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.OpenFile.html @@ -1,3 +1,3 @@ OpenFile | @wailsio/runtime
    • Parameters

      Returns Promise<string | string[]>

      Returns selected file or list of files. Returns blank string if no file is selected.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Question.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Question.html index c2dad387e..76edeafea 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Question.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Question.html @@ -2,4 +2,4 @@

    Returns Promise<string>

    • The label of the button pressed
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.SaveFile.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.SaveFile.html index 39596be60..49d1f0ae1 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.SaveFile.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.SaveFile.html @@ -1,3 +1,3 @@ SaveFile | @wailsio/runtime
    • Parameters

      Returns Promise<string>

      Returns the selected file. Returns blank string if no file is selected.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Warning.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Warning.html index d71f0638e..07e6530f4 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Warning.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Warning.html @@ -2,4 +2,4 @@

    Returns Promise<string>

    • The label of the button pressed
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Emit.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Emit.html index 90164c159..9b979d7c0 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Emit.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Emit.html @@ -3,4 +3,4 @@

    Returns any

    • The result of the emitted event.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Off.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Off.html index 2b59d7d2b..a607f396b 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Off.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Off.html @@ -1,4 +1,4 @@ Off | @wailsio/runtime
    • Removes event listeners for the specified event names.

      Parameters

      • eventName: string

        The name of the event to remove listeners for.

      • Rest ...additionalEventNames: string[]

        Additional event names to remove listeners for.

        -

      Returns undefined

    Generated using TypeDoc

    \ No newline at end of file +

    Returns undefined

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OffAll.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OffAll.html index 3ce065483..90a056e43 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OffAll.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OffAll.html @@ -1,3 +1,3 @@ OffAll | @wailsio/runtime
    • Removes all event listeners.

      Returns void

      Function

      OffAll

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.On.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.On.html index a6141e0bb..b068bc255 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.On.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.On.html @@ -4,4 +4,4 @@

    Returns Function

    • A function that, when called, will unregister the callback from the event.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OnMultiple.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OnMultiple.html index 942230728..d18299d05 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OnMultiple.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OnMultiple.html @@ -5,4 +5,4 @@

    Returns Function

    • A function that, when called, will unregister the callback from the event.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Once.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Once.html index 5aec085aa..8622b13fd 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Once.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Once.html @@ -4,4 +4,4 @@

    Returns Function

    • A function that, when called, will unregister the callback from the event.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.setup.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.setup.html index 3f2f7b71c..091a037f3 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.setup.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.setup.html @@ -1 +1 @@ -setup | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file +setup | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Flags.GetFlag.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Flags.GetFlag.html index 7c941b2a8..c668ee102 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Flags.GetFlag.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Flags.GetFlag.html @@ -3,4 +3,4 @@

    Returns any

    • The value associated with the specified key.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetAll.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetAll.html index 1c937a629..5a7476d5c 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetAll.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetAll.html @@ -1,3 +1,3 @@ GetAll | @wailsio/runtime
    • Gets all screens.

      Returns Promise<Screen[]>

      A promise that resolves to an array of Screen objects.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetCurrent.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetCurrent.html index 3cc606bb2..90549ea41 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetCurrent.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetCurrent.html @@ -1,3 +1,3 @@ GetCurrent | @wailsio/runtime
    • Gets the current active screen.

      Returns Promise<Screen>

      A promise that resolves with the current active screen.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetPrimary.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetPrimary.html index a1647a3a8..cb4eb0ec1 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetPrimary.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetPrimary.html @@ -1,3 +1,3 @@ GetPrimary | @wailsio/runtime
    • Gets the primary screen.

      Returns Promise<Screen>

      A promise that resolves to the primary screen.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Capabilities.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Capabilities.html index a5885798f..9cbc97e12 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Capabilities.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Capabilities.html @@ -1,4 +1,4 @@ Capabilities | @wailsio/runtime
    • Fetches the capabilities of the application from the server.

      Returns Promise<Object>

      A promise that resolves to an object containing the capabilities.

      Async

      Function

      Capabilities

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Environment.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Environment.html index 881e06d9a..06f50b91b 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Environment.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Environment.html @@ -2,4 +2,4 @@
  • A promise that resolves to an object containing OS and system architecture.
  • Function

    Retrieves environment details.

    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsAMD64.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsAMD64.html index 69cf77c4e..e4e39340a 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsAMD64.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsAMD64.html @@ -1,3 +1,3 @@ IsAMD64 | @wailsio/runtime
    • Checks if the current environment architecture is AMD64.

      Returns boolean

      True if the current environment architecture is AMD64, false otherwise.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM.html index 02ce11523..41ebfc6d5 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM.html @@ -1,3 +1,3 @@ IsARM | @wailsio/runtime
    • Checks if the current architecture is ARM.

      Returns boolean

      True if the current architecture is ARM, false otherwise.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM64.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM64.html index 05425fbc7..ef201f01b 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM64.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM64.html @@ -2,4 +2,4 @@

    Returns boolean

    • Returns true if the environment is ARM64 architecture, otherwise returns false.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDarkMode.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDarkMode.html index 202d59362..aa253aadc 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDarkMode.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDarkMode.html @@ -2,4 +2,4 @@
  • A promise that resolves to a boolean value indicating if the system is in dark mode.
  • Function

    Retrieves the system dark mode status.

    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDebug.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDebug.html index 3c6920684..850979afd 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDebug.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDebug.html @@ -1 +1 @@ -IsDebug | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file +IsDebug | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsLinux.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsLinux.html index 46847b3fd..b94c3f81e 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsLinux.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsLinux.html @@ -1,3 +1,3 @@ IsLinux | @wailsio/runtime
    • Checks if the current operating system is Linux.

      Returns boolean

      Returns true if the current operating system is Linux, false otherwise.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsMac.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsMac.html index 2df0ca1ff..9143d24d9 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsMac.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsMac.html @@ -1,3 +1,3 @@ IsMac | @wailsio/runtime
    • Checks if the current environment is a macOS operating system.

      Returns boolean

      True if the environment is macOS, false otherwise.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsWindows.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsWindows.html index e062bb048..7aea1f724 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsWindows.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsWindows.html @@ -1,3 +1,3 @@ IsWindows | @wailsio/runtime
    • Checks if the current operating system is Windows.

      Returns boolean

      True if the operating system is Windows, otherwise false.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.invoke.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.invoke.html index 7fe355563..5fd008ae2 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.invoke.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.invoke.html @@ -1 +1 @@ -invoke | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file +invoke | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Enable.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Enable.html index 832eeaebb..ff18b880e 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Enable.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Enable.html @@ -1,2 +1,2 @@ Enable | @wailsio/runtime
    • Schedules an automatic reload of WML to be performed as soon as the document is fully loaded.

      -

      Returns void

    Generated using TypeDoc

    \ No newline at end of file +

    Returns void

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Reload.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Reload.html index 9db9cd32b..dd7322ec7 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Reload.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Reload.html @@ -1,2 +1,2 @@ Reload | @wailsio/runtime
    • Reloads the WML page by adding necessary event listeners and browser listeners.

      -

      Returns void

    Generated using TypeDoc

    \ No newline at end of file +

    Returns void

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/init.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/init.html index 3887f26f4..75bf6cb6c 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/init.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/init.html @@ -1 +1 @@ -init | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file +init | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Call.CallOptions.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Call.CallOptions.html index 972d12835..0d427d8c5 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Call.CallOptions.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Call.CallOptions.html @@ -1,7 +1,7 @@ -CallOptions | @wailsio/runtime

    Interface CallOptions

    interface CallOptions {
        args: any[];
        methodID: undefined | number;
        methodName: undefined | string;
    }

    Properties

    args +CallOptions | @wailsio/runtime

    Interface CallOptions

    interface CallOptions {
        args: any[];
        methodID: undefined | number;
        methodName: undefined | string;
    }

    Properties

    args: any[]

    Arguments to be passed into the bound method.

    -
    methodID: undefined | number

    The numeric ID of the bound method to call.

    -
    methodName: undefined | string

    The fully qualified name of the bound method to call.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    methodID: undefined | number

    The numeric ID of the bound method to call.

    +
    methodName: undefined | string

    The fully qualified name of the bound method to call.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.Button.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.Button.html index 7694277e8..f378d46c0 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.Button.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.Button.html @@ -1,7 +1,7 @@ -Button | @wailsio/runtime
    interface Button {
        IsCancel: undefined | boolean;
        IsDefault: undefined | boolean;
        Label: undefined | string;
    }

    Properties

    IsCancel +Button | @wailsio/runtime
    interface Button {
        IsCancel: undefined | boolean;
        IsDefault: undefined | boolean;
        Label: undefined | string;
    }

    Properties

    IsCancel: undefined | boolean

    True if the button should cancel an operation when clicked.

    -
    IsDefault: undefined | boolean

    True if the button should be the default action when the user presses enter.

    -
    Label: undefined | string

    Text that appears within the button.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    IsDefault: undefined | boolean

    True if the button should be the default action when the user presses enter.

    +
    Label: undefined | string

    Text that appears within the button.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.FileFilter.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.FileFilter.html index 2dabb1e04..25b89fbbb 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.FileFilter.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.FileFilter.html @@ -1,5 +1,5 @@ -FileFilter | @wailsio/runtime
    interface FileFilter {
        DisplayName: undefined | string;
        Pattern: undefined | string;
    }

    Properties

    DisplayName +FileFilter | @wailsio/runtime
    interface FileFilter {
        DisplayName: undefined | string;
        Pattern: undefined | string;
    }

    Properties

    Properties

    DisplayName: undefined | string

    Display name for the filter, it could be "Text Files", "Images" etc.

    -
    Pattern: undefined | string

    Pattern to match for the filter, e.g. ".txt;.md" for text markdown files.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    Pattern: undefined | string

    Pattern to match for the filter, e.g. ".txt;.md" for text markdown files.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.MessageDialogOptions.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.MessageDialogOptions.html index 741c0ed50..2f751fe96 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.MessageDialogOptions.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.MessageDialogOptions.html @@ -1,9 +1,9 @@ -MessageDialogOptions | @wailsio/runtime

    Interface MessageDialogOptions

    interface MessageDialogOptions {
        Buttons: undefined | Button[];
        Detached: undefined | boolean;
        Message: undefined | string;
        Title: undefined | string;
    }

    Properties

    Buttons +MessageDialogOptions | @wailsio/runtime

    Interface MessageDialogOptions

    interface MessageDialogOptions {
        Buttons: undefined | Button[];
        Detached: undefined | boolean;
        Message: undefined | string;
        Title: undefined | string;
    }

    Properties

    Buttons: undefined | Button[]

    Array of button options to show in the dialog.

    -
    Detached: undefined | boolean

    True if the dialog should appear detached from the main window (if applicable).

    -
    Message: undefined | string

    The main message to show in the dialog.

    -
    Title: undefined | string

    The title of the dialog window.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    Detached: undefined | boolean

    True if the dialog should appear detached from the main window (if applicable).

    +
    Message: undefined | string

    The main message to show in the dialog.

    +
    Title: undefined | string

    The title of the dialog window.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.OpenFileDialogOptions.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.OpenFileDialogOptions.html index 936399213..21375465c 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.OpenFileDialogOptions.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.OpenFileDialogOptions.html @@ -1,4 +1,4 @@ -OpenFileDialogOptions | @wailsio/runtime

    Interface OpenFileDialogOptions

    interface OpenFileDialogOptions {
        AllowsMultipleSelection: undefined | boolean;
        AllowsOtherFiletypes: undefined | boolean;
        ButtonText: undefined | string;
        CanChooseDirectories: undefined | boolean;
        CanChooseFiles: undefined | boolean;
        CanCreateDirectories: undefined | boolean;
        CanSelectHiddenExtension: undefined | boolean;
        Detached: undefined | boolean;
        Directory: undefined | string;
        Filters: undefined | FileFilter[];
        HideExtension: undefined | boolean;
        Message: undefined | string;
        ResolvesAliases: undefined | boolean;
        ShowHiddenFiles: undefined | boolean;
        Title: undefined | string;
        TreatsFilePackagesAsDirectories: undefined | boolean;
    }

    Properties

    AllowsMultipleSelection +OpenFileDialogOptions | @wailsio/runtime

    Interface OpenFileDialogOptions

    interface OpenFileDialogOptions {
        AllowsMultipleSelection: undefined | boolean;
        AllowsOtherFiletypes: undefined | boolean;
        ButtonText: undefined | string;
        CanChooseDirectories: undefined | boolean;
        CanChooseFiles: undefined | boolean;
        CanCreateDirectories: undefined | boolean;
        CanSelectHiddenExtension: undefined | boolean;
        Detached: undefined | boolean;
        Directory: undefined | string;
        Filters: undefined | FileFilter[];
        HideExtension: undefined | boolean;
        Message: undefined | string;
        ResolvesAliases: undefined | boolean;
        ShowHiddenFiles: undefined | boolean;
        Title: undefined | string;
        TreatsFilePackagesAsDirectories: undefined | boolean;
    }

    Properties

    AllowsMultipleSelection: undefined | boolean

    Indicates if multiple selection is allowed.

    -
    AllowsOtherFiletypes: undefined | boolean

    Indicates if other file types are allowed.

    -
    ButtonText: undefined | string

    Text to display on the button.

    -
    CanChooseDirectories: undefined | boolean

    Indicates if directories can be chosen.

    -
    CanChooseFiles: undefined | boolean

    Indicates if files can be chosen.

    -
    CanCreateDirectories: undefined | boolean

    Indicates if directories can be created.

    -
    CanSelectHiddenExtension: undefined | boolean

    Indicates if hidden extensions can be selected.

    -
    Detached: undefined | boolean

    Indicates if the dialog should appear detached from the main window.

    -
    Directory: undefined | string

    Directory to open in the dialog.

    -
    Filters: undefined | FileFilter[]

    Array of file filters.

    -
    HideExtension: undefined | boolean

    Indicates if the extension should be hidden.

    -
    Message: undefined | string

    Message to show in the dialog.

    -
    ResolvesAliases: undefined | boolean

    Indicates if aliases should be resolved.

    -
    ShowHiddenFiles: undefined | boolean

    Indicates if hidden files should be shown.

    -
    Title: undefined | string

    Title of the dialog.

    -
    TreatsFilePackagesAsDirectories: undefined | boolean

    Indicates if file packages should be treated as directories.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    AllowsOtherFiletypes: undefined | boolean

    Indicates if other file types are allowed.

    +
    ButtonText: undefined | string

    Text to display on the button.

    +
    CanChooseDirectories: undefined | boolean

    Indicates if directories can be chosen.

    +
    CanChooseFiles: undefined | boolean

    Indicates if files can be chosen.

    +
    CanCreateDirectories: undefined | boolean

    Indicates if directories can be created.

    +
    CanSelectHiddenExtension: undefined | boolean

    Indicates if hidden extensions can be selected.

    +
    Detached: undefined | boolean

    Indicates if the dialog should appear detached from the main window.

    +
    Directory: undefined | string

    Directory to open in the dialog.

    +
    Filters: undefined | FileFilter[]

    Array of file filters.

    +
    HideExtension: undefined | boolean

    Indicates if the extension should be hidden.

    +
    Message: undefined | string

    Message to show in the dialog.

    +
    ResolvesAliases: undefined | boolean

    Indicates if aliases should be resolved.

    +
    ShowHiddenFiles: undefined | boolean

    Indicates if hidden files should be shown.

    +
    Title: undefined | string

    Title of the dialog.

    +
    TreatsFilePackagesAsDirectories: undefined | boolean

    Indicates if file packages should be treated as directories.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.SaveFileDialogOptions.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.SaveFileDialogOptions.html index 5f417616a..d3f8671c2 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.SaveFileDialogOptions.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.SaveFileDialogOptions.html @@ -1,4 +1,4 @@ -SaveFileDialogOptions | @wailsio/runtime

    Interface SaveFileDialogOptions

    interface SaveFileDialogOptions {
        AllowsMultipleSelection: undefined | boolean;
        AllowsOtherFiletypes: undefined | boolean;
        ButtonText: undefined | string;
        CanChooseDirectories: undefined | boolean;
        CanChooseFiles: undefined | boolean;
        CanCreateDirectories: undefined | boolean;
        CanSelectHiddenExtension: undefined | boolean;
        Detached: undefined | boolean;
        Directory: undefined | string;
        Filename: undefined | string;
        Filters: undefined | FileFilter[];
        HideExtension: undefined | boolean;
        Message: undefined | string;
        ResolvesAliases: undefined | boolean;
        ShowHiddenFiles: undefined | boolean;
        Title: undefined | string;
        TreatsFilePackagesAsDirectories: undefined | boolean;
    }

    Properties

    AllowsMultipleSelection +SaveFileDialogOptions | @wailsio/runtime

    Interface SaveFileDialogOptions

    interface SaveFileDialogOptions {
        AllowsMultipleSelection: undefined | boolean;
        AllowsOtherFiletypes: undefined | boolean;
        ButtonText: undefined | string;
        CanChooseDirectories: undefined | boolean;
        CanChooseFiles: undefined | boolean;
        CanCreateDirectories: undefined | boolean;
        CanSelectHiddenExtension: undefined | boolean;
        Detached: undefined | boolean;
        Directory: undefined | string;
        Filename: undefined | string;
        Filters: undefined | FileFilter[];
        HideExtension: undefined | boolean;
        Message: undefined | string;
        ResolvesAliases: undefined | boolean;
        ShowHiddenFiles: undefined | boolean;
        Title: undefined | string;
        TreatsFilePackagesAsDirectories: undefined | boolean;
    }

    Properties

    AllowsMultipleSelection: undefined | boolean

    Indicates if multiple selection is allowed.

    -
    AllowsOtherFiletypes: undefined | boolean

    Indicates if other file types are allowed.

    -
    ButtonText: undefined | string

    Text to display on the button.

    -
    CanChooseDirectories: undefined | boolean

    Indicates if directories can be chosen.

    -
    CanChooseFiles: undefined | boolean

    Indicates if files can be chosen.

    -
    CanCreateDirectories: undefined | boolean

    Indicates if directories can be created.

    -
    CanSelectHiddenExtension: undefined | boolean

    Indicates if hidden extensions can be selected.

    -
    Detached: undefined | boolean

    Indicates if the dialog should appear detached from the main window.

    -
    Directory: undefined | string

    Directory to open in the dialog.

    -
    Filename: undefined | string

    Default filename to use in the dialog.

    -
    Filters: undefined | FileFilter[]

    Array of file filters.

    -
    HideExtension: undefined | boolean

    Indicates if the extension should be hidden.

    -
    Message: undefined | string

    Message to show in the dialog.

    -
    ResolvesAliases: undefined | boolean

    Indicates if aliases should be resolved.

    -
    ShowHiddenFiles: undefined | boolean

    Indicates if hidden files should be shown.

    -
    Title: undefined | string

    Title of the dialog.

    -
    TreatsFilePackagesAsDirectories: undefined | boolean

    Indicates if file packages should be treated as directories.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    AllowsOtherFiletypes: undefined | boolean

    Indicates if other file types are allowed.

    +
    ButtonText: undefined | string

    Text to display on the button.

    +
    CanChooseDirectories: undefined | boolean

    Indicates if directories can be chosen.

    +
    CanChooseFiles: undefined | boolean

    Indicates if files can be chosen.

    +
    CanCreateDirectories: undefined | boolean

    Indicates if directories can be created.

    +
    CanSelectHiddenExtension: undefined | boolean

    Indicates if hidden extensions can be selected.

    +
    Detached: undefined | boolean

    Indicates if the dialog should appear detached from the main window.

    +
    Directory: undefined | string

    Directory to open in the dialog.

    +
    Filename: undefined | string

    Default filename to use in the dialog.

    +
    Filters: undefined | FileFilter[]

    Array of file filters.

    +
    HideExtension: undefined | boolean

    Indicates if the extension should be hidden.

    +
    Message: undefined | string

    Message to show in the dialog.

    +
    ResolvesAliases: undefined | boolean

    Indicates if aliases should be resolved.

    +
    ShowHiddenFiles: undefined | boolean

    Indicates if hidden files should be shown.

    +
    Title: undefined | string

    Title of the dialog.

    +
    TreatsFilePackagesAsDirectories: undefined | boolean

    Indicates if file packages should be treated as directories.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Rect.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Rect.html index b2ba0e8e2..df662ad09 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Rect.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Rect.html @@ -1,9 +1,9 @@ -Rect | @wailsio/runtime
    interface Rect {
        Height: number;
        Width: number;
        X: number;
        Y: number;
    }

    Properties

    Height +Rect | @wailsio/runtime
    interface Rect {
        Height: number;
        Width: number;
        X: number;
        Y: number;
    }

    Properties

    Properties

    Height: number

    The height of the rectangle.

    -
    Width: number

    The width of the rectangle.

    -
    X: number

    The X coordinate of the origin.

    -
    Y: number

    The Y coordinate of the origin.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    Width: number

    The width of the rectangle.

    +
    X: number

    The X coordinate of the origin.

    +
    Y: number

    The Y coordinate of the origin.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Screen.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Screen.html index a9af505a9..ade9f63ad 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Screen.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Screen.html @@ -1,4 +1,4 @@ -Screen | @wailsio/runtime
    interface Screen {
        Bounds: Rect;
        ID: string;
        IsPrimary: boolean;
        Name: string;
        PhysicalBounds: Rect;
        PhysicalWorkArea: Rect;
        Rotation: number;
        ScaleFactor: number;
        Size: Size;
        WorkArea: Rect;
        X: number;
        Y: number;
    }

    Properties

    Bounds +Screen | @wailsio/runtime
    interface Screen {
        Bounds: Rect;
        ID: string;
        IsPrimary: boolean;
        Name: string;
        PhysicalBounds: Rect;
        PhysicalWorkArea: Rect;
        Rotation: number;
        ScaleFactor: number;
        Size: Size;
        WorkArea: Rect;
        X: number;
        Y: number;
    }

    Properties

    Bounds ID IsPrimary Name @@ -11,15 +11,15 @@ X Y

    Properties

    Bounds: Rect

    Contains the bounds of the screen in terms of X, Y, Width, and Height.

    -
    ID: string

    Unique identifier for the screen.

    -
    IsPrimary: boolean

    True if this is the primary monitor selected by the user in the operating system.

    -
    Name: string

    Human readable name of the screen.

    -
    PhysicalBounds: Rect

    Contains the physical bounds of the screen in terms of X, Y, Width, and Height (before scaling).

    -
    PhysicalWorkArea: Rect

    Contains the physical WorkArea of the screen (before scaling).

    -
    Rotation: number

    The rotation of the screen.

    -
    ScaleFactor: number

    The scale factor of the screen (DPI/96). 1 = standard DPI, 2 = HiDPI (Retina), etc.

    -
    Size: Size

    Contains the width and height of the screen.

    -
    WorkArea: Rect

    Contains the area of the screen that is actually usable (excluding taskbar and other system UI).

    -
    X: number

    The X coordinate of the screen.

    -
    Y: number

    The Y coordinate of the screen.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    ID: string

    Unique identifier for the screen.

    +
    IsPrimary: boolean

    True if this is the primary monitor selected by the user in the operating system.

    +
    Name: string

    Human readable name of the screen.

    +
    PhysicalBounds: Rect

    Contains the physical bounds of the screen in terms of X, Y, Width, and Height (before scaling).

    +
    PhysicalWorkArea: Rect

    Contains the physical WorkArea of the screen (before scaling).

    +
    Rotation: number

    The rotation of the screen.

    +
    ScaleFactor: number

    The scale factor of the screen (DPI/96). 1 = standard DPI, 2 = HiDPI (Retina), etc.

    +
    Size: Size

    Contains the width and height of the screen.

    +
    WorkArea: Rect

    Contains the area of the screen that is actually usable (excluding taskbar and other system UI).

    +
    X: number

    The X coordinate of the screen.

    +
    Y: number

    The Y coordinate of the screen.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Size.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Size.html index c34bdced3..aaff1f331 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Size.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Size.html @@ -1,5 +1,5 @@ -Size | @wailsio/runtime
    interface Size {
        Height: number;
        Width: number;
    }

    Properties

    Height +Size | @wailsio/runtime
    interface Size {
        Height: number;
        Width: number;
    }

    Properties

    Properties

    Height: number

    The height.

    -
    Width: number

    The width.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    Width: number

    The width.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.EnvironmentInfo.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.EnvironmentInfo.html index fd42208ac..370cec485 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.EnvironmentInfo.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.EnvironmentInfo.html @@ -1,11 +1,11 @@ -EnvironmentInfo | @wailsio/runtime

    Interface EnvironmentInfo

    interface EnvironmentInfo {
        Arch: string;
        Debug: boolean;
        OS: string;
        OSInfo: OSInfo;
        PlatformInfo: Object;
    }

    Properties

    Arch +EnvironmentInfo | @wailsio/runtime

    Interface EnvironmentInfo

    interface EnvironmentInfo {
        Arch: string;
        Debug: boolean;
        OS: string;
        OSInfo: OSInfo;
        PlatformInfo: Object;
    }

    Properties

    Arch: string

    The architecture of the system.

    -
    Debug: boolean

    True if the application is running in debug mode, otherwise false.

    -
    OS: string

    The operating system in use.

    -
    OSInfo: OSInfo

    Details of the operating system.

    -
    PlatformInfo: Object

    Additional platform information.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    Debug: boolean

    True if the application is running in debug mode, otherwise false.

    +
    OS: string

    The operating system in use.

    +
    OSInfo: OSInfo

    Details of the operating system.

    +
    PlatformInfo: Object

    Additional platform information.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.OSInfo.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.OSInfo.html index a7e96cb57..8cdc8ec1b 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.OSInfo.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.OSInfo.html @@ -1,9 +1,9 @@ -OSInfo | @wailsio/runtime
    interface OSInfo {
        Branding: string;
        ID: string;
        Name: string;
        Version: string;
    }

    Properties

    Branding +OSInfo | @wailsio/runtime
    interface OSInfo {
        Branding: string;
        ID: string;
        Name: string;
        Version: string;
    }

    Properties

    Properties

    Branding: string

    The branding of the OS.

    -
    ID: string

    The ID of the OS.

    -
    Name: string

    The name of the OS.

    -
    Version: string

    The version of the OS.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    ID: string

    The ID of the OS.

    +
    Name: string

    The name of the OS.

    +
    Version: string

    The version of the OS.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Application.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Application.html index c31f437ee..2f18cc27a 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Application.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Application.html @@ -1,4 +1,4 @@ -Application | @wailsio/runtime

    Namespace Application

    Index

    Functions

    Hide +Application | @wailsio/runtime

    Namespace Application

    Index

    Functions

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Browser.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Browser.html index a5f0d2d59..6540a5866 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Browser.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Browser.html @@ -1,2 +1,2 @@ -Browser | @wailsio/runtime

    Namespace Browser

    Index

    Functions

    OpenURL +Browser | @wailsio/runtime

    Namespace Browser

    Index

    Functions

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Call.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Call.html index 11e23c0bd..c1de164e8 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Call.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Call.html @@ -1,4 +1,4 @@ -Call | @wailsio/runtime

    Namespace Call

    Index

    Classes

    RuntimeError +Call | @wailsio/runtime

    Namespace Call

    Index

    Classes

    Interfaces

    Functions

    ByID ByName diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Clipboard.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Clipboard.html index a30577764..fc8d10336 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Clipboard.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Clipboard.html @@ -1,3 +1,3 @@ -Clipboard | @wailsio/runtime

    Namespace Clipboard

    Index

    Functions

    SetText +Clipboard | @wailsio/runtime

    Namespace Clipboard

    Index

    Functions

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Create.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Create.html index 979f8ca69..e6f12452a 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Create.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Create.html @@ -1,4 +1,4 @@ -Create | @wailsio/runtime

    Namespace Create

    Index

    Functions

    Any +Create | @wailsio/runtime

    Namespace Create

    Index

    Functions

    Any Array ByteSlice Map diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Dialogs.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Dialogs.html index ebfb212d3..bbed62462 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Dialogs.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Dialogs.html @@ -1,4 +1,4 @@ -Dialogs | @wailsio/runtime

    Namespace Dialogs

    Index

    Interfaces

    Button +Dialogs | @wailsio/runtime

    Namespace Dialogs

    Index

    Interfaces

    Button FileFilter MessageDialogOptions OpenFileDialogOptions diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Events.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Events.html index b0fc9eb85..5fc2b7a97 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Events.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Events.html @@ -1,4 +1,4 @@ -Events | @wailsio/runtime

    Namespace Events

    Index

    Classes

    WailsEvent +Events | @wailsio/runtime

    Namespace Events

    Index

    Classes

    Variables

    Functions

    Emit Off diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Flags.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Flags.html index 8529c304c..359d13a24 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Flags.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Flags.html @@ -1,2 +1,2 @@ -Flags | @wailsio/runtime

    Namespace Flags

    Index

    Functions

    GetFlag +Flags | @wailsio/runtime

    Namespace Flags

    Index

    Functions

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Screens.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Screens.html index 37907bce6..2ddfa2ff9 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Screens.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Screens.html @@ -1,4 +1,4 @@ -Screens | @wailsio/runtime

    Namespace Screens

    Index

    Interfaces

    Rect +Screens | @wailsio/runtime

    Namespace Screens

    Index

    Interfaces

    Functions

    GetAll diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/System.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/System.html index 38a49196b..9430372f4 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/System.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/System.html @@ -1,4 +1,4 @@ -System | @wailsio/runtime

    Namespace System

    Index

    Interfaces

    EnvironmentInfo +System | @wailsio/runtime

    Namespace System

    Index

    Interfaces

    Functions

    Capabilities Environment diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/WML.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/WML.html index aa75f96e1..53acfb009 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/WML.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/WML.html @@ -1,3 +1,3 @@ -WML | @wailsio/runtime

    Namespace WML

    Index

    Functions

    Enable +WML | @wailsio/runtime

    Namespace WML

    Index

    Functions

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Events.Types.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Events.Types.html index 36096ca29..d2311e0bd 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Events.Types.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Events.Types.html @@ -1 +1 @@ -Types | @wailsio/runtime

    Variable TypesConst

    Types: {
        Common: {
            ApplicationOpenedWithFile: string;
            ApplicationStarted: string;
            ThemeChanged: string;
            WindowClosing: string;
            WindowDPIChanged: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowFilesDropped: string;
            WindowFocus: string;
            WindowFullscreen: string;
            WindowHide: string;
            WindowLostFocus: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowRestore: string;
            WindowRuntimeReady: string;
            WindowShow: string;
            WindowUnFullscreen: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowZoom: string;
            WindowZoomIn: string;
            WindowZoomOut: string;
            WindowZoomReset: string;
        };
        Linux: {
            ApplicationStartup: string;
            SystemThemeChanged: string;
            WindowDeleteEvent: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowFocusIn: string;
            WindowFocusOut: string;
            WindowLoadChanged: string;
        };
        Mac: {
            ApplicationDidBecomeActive: string;
            ApplicationDidChangeBackingProperties: string;
            ApplicationDidChangeEffectiveAppearance: string;
            ApplicationDidChangeIcon: string;
            ApplicationDidChangeOcclusionState: string;
            ApplicationDidChangeScreenParameters: string;
            ApplicationDidChangeStatusBarFrame: string;
            ApplicationDidChangeStatusBarOrientation: string;
            ApplicationDidChangeTheme: string;
            ApplicationDidFinishLaunching: string;
            ApplicationDidHide: string;
            ApplicationDidResignActive: string;
            ApplicationDidUnhide: string;
            ApplicationDidUpdate: string;
            ApplicationShouldHandleReopen: string;
            ApplicationWillBecomeActive: string;
            ApplicationWillFinishLaunching: string;
            ApplicationWillHide: string;
            ApplicationWillResignActive: string;
            ApplicationWillTerminate: string;
            ApplicationWillUnhide: string;
            ApplicationWillUpdate: string;
            MenuDidAddItem: string;
            MenuDidBeginTracking: string;
            MenuDidClose: string;
            MenuDidDisplayItem: string;
            MenuDidEndTracking: string;
            MenuDidHighlightItem: string;
            MenuDidOpen: string;
            MenuDidPopUp: string;
            MenuDidRemoveItem: string;
            MenuDidSendAction: string;
            MenuDidSendActionToItem: string;
            MenuDidUpdate: string;
            MenuWillAddItem: string;
            MenuWillBeginTracking: string;
            MenuWillDisplayItem: string;
            MenuWillEndTracking: string;
            MenuWillHighlightItem: string;
            MenuWillOpen: string;
            MenuWillPopUp: string;
            MenuWillRemoveItem: string;
            MenuWillSendAction: string;
            MenuWillSendActionToItem: string;
            MenuWillUpdate: string;
            WebViewDidCommitNavigation: string;
            WebViewDidFinishNavigation: string;
            WebViewDidReceiveServerRedirectForProvisionalNavigation: string;
            WebViewDidStartProvisionalNavigation: string;
            WindowDidBecomeKey: string;
            WindowDidBecomeMain: string;
            WindowDidBeginSheet: string;
            WindowDidChangeAlpha: string;
            WindowDidChangeBackingLocation: string;
            WindowDidChangeBackingProperties: string;
            WindowDidChangeCollectionBehavior: string;
            WindowDidChangeEffectiveAppearance: string;
            WindowDidChangeOcclusionState: string;
            WindowDidChangeOrderingMode: string;
            WindowDidChangeScreen: string;
            WindowDidChangeScreenParameters: string;
            WindowDidChangeScreenProfile: string;
            WindowDidChangeScreenSpace: string;
            WindowDidChangeScreenSpaceProperties: string;
            WindowDidChangeSharingType: string;
            WindowDidChangeSpace: string;
            WindowDidChangeSpaceOrderingMode: string;
            WindowDidChangeTitle: string;
            WindowDidChangeToolbar: string;
            WindowDidDeminiaturize: string;
            WindowDidEndSheet: string;
            WindowDidEnterFullScreen: string;
            WindowDidEnterVersionBrowser: string;
            WindowDidExitFullScreen: string;
            WindowDidExitVersionBrowser: string;
            WindowDidExpose: string;
            WindowDidFocus: string;
            WindowDidMiniaturize: string;
            WindowDidMove: string;
            WindowDidOrderOffScreen: string;
            WindowDidOrderOnScreen: string;
            WindowDidResignKey: string;
            WindowDidResignMain: string;
            WindowDidResize: string;
            WindowDidUpdate: string;
            WindowDidUpdateAlpha: string;
            WindowDidUpdateCollectionBehavior: string;
            WindowDidUpdateCollectionProperties: string;
            WindowDidUpdateShadow: string;
            WindowDidUpdateTitle: string;
            WindowDidUpdateToolbar: string;
            WindowDidZoom: string;
            WindowFileDraggingEntered: string;
            WindowFileDraggingExited: string;
            WindowFileDraggingPerformed: string;
            WindowHide: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowShouldClose: string;
            WindowShow: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowWillBecomeKey: string;
            WindowWillBecomeMain: string;
            WindowWillBeginSheet: string;
            WindowWillChangeOrderingMode: string;
            WindowWillClose: string;
            WindowWillDeminiaturize: string;
            WindowWillEnterFullScreen: string;
            WindowWillEnterVersionBrowser: string;
            WindowWillExitFullScreen: string;
            WindowWillExitVersionBrowser: string;
            WindowWillFocus: string;
            WindowWillMiniaturize: string;
            WindowWillMove: string;
            WindowWillOrderOffScreen: string;
            WindowWillOrderOnScreen: string;
            WindowWillResignMain: string;
            WindowWillResize: string;
            WindowWillUnfocus: string;
            WindowWillUpdate: string;
            WindowWillUpdateAlpha: string;
            WindowWillUpdateCollectionBehavior: string;
            WindowWillUpdateCollectionProperties: string;
            WindowWillUpdateShadow: string;
            WindowWillUpdateTitle: string;
            WindowWillUpdateToolbar: string;
            WindowWillUpdateVisibility: string;
            WindowWillUseStandardFrame: string;
            WindowZoomIn: string;
            WindowZoomOut: string;
            WindowZoomReset: string;
        };
        Windows: {
            APMPowerSettingChange: string;
            APMPowerStatusChange: string;
            APMResumeAutomatic: string;
            APMResumeSuspend: string;
            APMSuspend: string;
            ApplicationStarted: string;
            SystemThemeChanged: string;
            WebViewNavigationCompleted: string;
            WindowActive: string;
            WindowBackgroundErase: string;
            WindowClickActive: string;
            WindowClosing: string;
            WindowDPIChanged: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowDragDrop: string;
            WindowDragEnter: string;
            WindowDragLeave: string;
            WindowDragOver: string;
            WindowEndMove: string;
            WindowEndResize: string;
            WindowFullscreen: string;
            WindowHide: string;
            WindowInactive: string;
            WindowKeyDown: string;
            WindowKeyUp: string;
            WindowKillFocus: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowNonClientHit: string;
            WindowNonClientMouseDown: string;
            WindowNonClientMouseLeave: string;
            WindowNonClientMouseMove: string;
            WindowNonClientMouseUp: string;
            WindowPaint: string;
            WindowRestore: string;
            WindowSetFocus: string;
            WindowShow: string;
            WindowStartMove: string;
            WindowStartResize: string;
            WindowUnFullscreen: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowZOrderChanged: string;
        };
    } = EventTypes

    Type declaration

    • Common: {
          ApplicationOpenedWithFile: string;
          ApplicationStarted: string;
          ThemeChanged: string;
          WindowClosing: string;
          WindowDPIChanged: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowFilesDropped: string;
          WindowFocus: string;
          WindowFullscreen: string;
          WindowHide: string;
          WindowLostFocus: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowRestore: string;
          WindowRuntimeReady: string;
          WindowShow: string;
          WindowUnFullscreen: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowZoom: string;
          WindowZoomIn: string;
          WindowZoomOut: string;
          WindowZoomReset: string;
      }
      • ApplicationOpenedWithFile: string
      • ApplicationStarted: string
      • ThemeChanged: string
      • WindowClosing: string
      • WindowDPIChanged: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowFilesDropped: string
      • WindowFocus: string
      • WindowFullscreen: string
      • WindowHide: string
      • WindowLostFocus: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowRestore: string
      • WindowRuntimeReady: string
      • WindowShow: string
      • WindowUnFullscreen: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowZoom: string
      • WindowZoomIn: string
      • WindowZoomOut: string
      • WindowZoomReset: string
    • Linux: {
          ApplicationStartup: string;
          SystemThemeChanged: string;
          WindowDeleteEvent: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowFocusIn: string;
          WindowFocusOut: string;
          WindowLoadChanged: string;
      }
      • ApplicationStartup: string
      • SystemThemeChanged: string
      • WindowDeleteEvent: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowFocusIn: string
      • WindowFocusOut: string
      • WindowLoadChanged: string
    • Mac: {
          ApplicationDidBecomeActive: string;
          ApplicationDidChangeBackingProperties: string;
          ApplicationDidChangeEffectiveAppearance: string;
          ApplicationDidChangeIcon: string;
          ApplicationDidChangeOcclusionState: string;
          ApplicationDidChangeScreenParameters: string;
          ApplicationDidChangeStatusBarFrame: string;
          ApplicationDidChangeStatusBarOrientation: string;
          ApplicationDidChangeTheme: string;
          ApplicationDidFinishLaunching: string;
          ApplicationDidHide: string;
          ApplicationDidResignActive: string;
          ApplicationDidUnhide: string;
          ApplicationDidUpdate: string;
          ApplicationShouldHandleReopen: string;
          ApplicationWillBecomeActive: string;
          ApplicationWillFinishLaunching: string;
          ApplicationWillHide: string;
          ApplicationWillResignActive: string;
          ApplicationWillTerminate: string;
          ApplicationWillUnhide: string;
          ApplicationWillUpdate: string;
          MenuDidAddItem: string;
          MenuDidBeginTracking: string;
          MenuDidClose: string;
          MenuDidDisplayItem: string;
          MenuDidEndTracking: string;
          MenuDidHighlightItem: string;
          MenuDidOpen: string;
          MenuDidPopUp: string;
          MenuDidRemoveItem: string;
          MenuDidSendAction: string;
          MenuDidSendActionToItem: string;
          MenuDidUpdate: string;
          MenuWillAddItem: string;
          MenuWillBeginTracking: string;
          MenuWillDisplayItem: string;
          MenuWillEndTracking: string;
          MenuWillHighlightItem: string;
          MenuWillOpen: string;
          MenuWillPopUp: string;
          MenuWillRemoveItem: string;
          MenuWillSendAction: string;
          MenuWillSendActionToItem: string;
          MenuWillUpdate: string;
          WebViewDidCommitNavigation: string;
          WebViewDidFinishNavigation: string;
          WebViewDidReceiveServerRedirectForProvisionalNavigation: string;
          WebViewDidStartProvisionalNavigation: string;
          WindowDidBecomeKey: string;
          WindowDidBecomeMain: string;
          WindowDidBeginSheet: string;
          WindowDidChangeAlpha: string;
          WindowDidChangeBackingLocation: string;
          WindowDidChangeBackingProperties: string;
          WindowDidChangeCollectionBehavior: string;
          WindowDidChangeEffectiveAppearance: string;
          WindowDidChangeOcclusionState: string;
          WindowDidChangeOrderingMode: string;
          WindowDidChangeScreen: string;
          WindowDidChangeScreenParameters: string;
          WindowDidChangeScreenProfile: string;
          WindowDidChangeScreenSpace: string;
          WindowDidChangeScreenSpaceProperties: string;
          WindowDidChangeSharingType: string;
          WindowDidChangeSpace: string;
          WindowDidChangeSpaceOrderingMode: string;
          WindowDidChangeTitle: string;
          WindowDidChangeToolbar: string;
          WindowDidDeminiaturize: string;
          WindowDidEndSheet: string;
          WindowDidEnterFullScreen: string;
          WindowDidEnterVersionBrowser: string;
          WindowDidExitFullScreen: string;
          WindowDidExitVersionBrowser: string;
          WindowDidExpose: string;
          WindowDidFocus: string;
          WindowDidMiniaturize: string;
          WindowDidMove: string;
          WindowDidOrderOffScreen: string;
          WindowDidOrderOnScreen: string;
          WindowDidResignKey: string;
          WindowDidResignMain: string;
          WindowDidResize: string;
          WindowDidUpdate: string;
          WindowDidUpdateAlpha: string;
          WindowDidUpdateCollectionBehavior: string;
          WindowDidUpdateCollectionProperties: string;
          WindowDidUpdateShadow: string;
          WindowDidUpdateTitle: string;
          WindowDidUpdateToolbar: string;
          WindowDidZoom: string;
          WindowFileDraggingEntered: string;
          WindowFileDraggingExited: string;
          WindowFileDraggingPerformed: string;
          WindowHide: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowShouldClose: string;
          WindowShow: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowWillBecomeKey: string;
          WindowWillBecomeMain: string;
          WindowWillBeginSheet: string;
          WindowWillChangeOrderingMode: string;
          WindowWillClose: string;
          WindowWillDeminiaturize: string;
          WindowWillEnterFullScreen: string;
          WindowWillEnterVersionBrowser: string;
          WindowWillExitFullScreen: string;
          WindowWillExitVersionBrowser: string;
          WindowWillFocus: string;
          WindowWillMiniaturize: string;
          WindowWillMove: string;
          WindowWillOrderOffScreen: string;
          WindowWillOrderOnScreen: string;
          WindowWillResignMain: string;
          WindowWillResize: string;
          WindowWillUnfocus: string;
          WindowWillUpdate: string;
          WindowWillUpdateAlpha: string;
          WindowWillUpdateCollectionBehavior: string;
          WindowWillUpdateCollectionProperties: string;
          WindowWillUpdateShadow: string;
          WindowWillUpdateTitle: string;
          WindowWillUpdateToolbar: string;
          WindowWillUpdateVisibility: string;
          WindowWillUseStandardFrame: string;
          WindowZoomIn: string;
          WindowZoomOut: string;
          WindowZoomReset: string;
      }
      • ApplicationDidBecomeActive: string
      • ApplicationDidChangeBackingProperties: string
      • ApplicationDidChangeEffectiveAppearance: string
      • ApplicationDidChangeIcon: string
      • ApplicationDidChangeOcclusionState: string
      • ApplicationDidChangeScreenParameters: string
      • ApplicationDidChangeStatusBarFrame: string
      • ApplicationDidChangeStatusBarOrientation: string
      • ApplicationDidChangeTheme: string
      • ApplicationDidFinishLaunching: string
      • ApplicationDidHide: string
      • ApplicationDidResignActive: string
      • ApplicationDidUnhide: string
      • ApplicationDidUpdate: string
      • ApplicationShouldHandleReopen: string
      • ApplicationWillBecomeActive: string
      • ApplicationWillFinishLaunching: string
      • ApplicationWillHide: string
      • ApplicationWillResignActive: string
      • ApplicationWillTerminate: string
      • ApplicationWillUnhide: string
      • ApplicationWillUpdate: string
      • MenuDidAddItem: string
      • MenuDidBeginTracking: string
      • MenuDidClose: string
      • MenuDidDisplayItem: string
      • MenuDidEndTracking: string
      • MenuDidHighlightItem: string
      • MenuDidOpen: string
      • MenuDidPopUp: string
      • MenuDidRemoveItem: string
      • MenuDidSendAction: string
      • MenuDidSendActionToItem: string
      • MenuDidUpdate: string
      • MenuWillAddItem: string
      • MenuWillBeginTracking: string
      • MenuWillDisplayItem: string
      • MenuWillEndTracking: string
      • MenuWillHighlightItem: string
      • MenuWillOpen: string
      • MenuWillPopUp: string
      • MenuWillRemoveItem: string
      • MenuWillSendAction: string
      • MenuWillSendActionToItem: string
      • MenuWillUpdate: string
      • WebViewDidCommitNavigation: string
      • WebViewDidFinishNavigation: string
      • WebViewDidReceiveServerRedirectForProvisionalNavigation: string
      • WebViewDidStartProvisionalNavigation: string
      • WindowDidBecomeKey: string
      • WindowDidBecomeMain: string
      • WindowDidBeginSheet: string
      • WindowDidChangeAlpha: string
      • WindowDidChangeBackingLocation: string
      • WindowDidChangeBackingProperties: string
      • WindowDidChangeCollectionBehavior: string
      • WindowDidChangeEffectiveAppearance: string
      • WindowDidChangeOcclusionState: string
      • WindowDidChangeOrderingMode: string
      • WindowDidChangeScreen: string
      • WindowDidChangeScreenParameters: string
      • WindowDidChangeScreenProfile: string
      • WindowDidChangeScreenSpace: string
      • WindowDidChangeScreenSpaceProperties: string
      • WindowDidChangeSharingType: string
      • WindowDidChangeSpace: string
      • WindowDidChangeSpaceOrderingMode: string
      • WindowDidChangeTitle: string
      • WindowDidChangeToolbar: string
      • WindowDidDeminiaturize: string
      • WindowDidEndSheet: string
      • WindowDidEnterFullScreen: string
      • WindowDidEnterVersionBrowser: string
      • WindowDidExitFullScreen: string
      • WindowDidExitVersionBrowser: string
      • WindowDidExpose: string
      • WindowDidFocus: string
      • WindowDidMiniaturize: string
      • WindowDidMove: string
      • WindowDidOrderOffScreen: string
      • WindowDidOrderOnScreen: string
      • WindowDidResignKey: string
      • WindowDidResignMain: string
      • WindowDidResize: string
      • WindowDidUpdate: string
      • WindowDidUpdateAlpha: string
      • WindowDidUpdateCollectionBehavior: string
      • WindowDidUpdateCollectionProperties: string
      • WindowDidUpdateShadow: string
      • WindowDidUpdateTitle: string
      • WindowDidUpdateToolbar: string
      • WindowDidZoom: string
      • WindowFileDraggingEntered: string
      • WindowFileDraggingExited: string
      • WindowFileDraggingPerformed: string
      • WindowHide: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowShouldClose: string
      • WindowShow: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowWillBecomeKey: string
      • WindowWillBecomeMain: string
      • WindowWillBeginSheet: string
      • WindowWillChangeOrderingMode: string
      • WindowWillClose: string
      • WindowWillDeminiaturize: string
      • WindowWillEnterFullScreen: string
      • WindowWillEnterVersionBrowser: string
      • WindowWillExitFullScreen: string
      • WindowWillExitVersionBrowser: string
      • WindowWillFocus: string
      • WindowWillMiniaturize: string
      • WindowWillMove: string
      • WindowWillOrderOffScreen: string
      • WindowWillOrderOnScreen: string
      • WindowWillResignMain: string
      • WindowWillResize: string
      • WindowWillUnfocus: string
      • WindowWillUpdate: string
      • WindowWillUpdateAlpha: string
      • WindowWillUpdateCollectionBehavior: string
      • WindowWillUpdateCollectionProperties: string
      • WindowWillUpdateShadow: string
      • WindowWillUpdateTitle: string
      • WindowWillUpdateToolbar: string
      • WindowWillUpdateVisibility: string
      • WindowWillUseStandardFrame: string
      • WindowZoomIn: string
      • WindowZoomOut: string
      • WindowZoomReset: string
    • Windows: {
          APMPowerSettingChange: string;
          APMPowerStatusChange: string;
          APMResumeAutomatic: string;
          APMResumeSuspend: string;
          APMSuspend: string;
          ApplicationStarted: string;
          SystemThemeChanged: string;
          WebViewNavigationCompleted: string;
          WindowActive: string;
          WindowBackgroundErase: string;
          WindowClickActive: string;
          WindowClosing: string;
          WindowDPIChanged: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowDragDrop: string;
          WindowDragEnter: string;
          WindowDragLeave: string;
          WindowDragOver: string;
          WindowEndMove: string;
          WindowEndResize: string;
          WindowFullscreen: string;
          WindowHide: string;
          WindowInactive: string;
          WindowKeyDown: string;
          WindowKeyUp: string;
          WindowKillFocus: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowNonClientHit: string;
          WindowNonClientMouseDown: string;
          WindowNonClientMouseLeave: string;
          WindowNonClientMouseMove: string;
          WindowNonClientMouseUp: string;
          WindowPaint: string;
          WindowRestore: string;
          WindowSetFocus: string;
          WindowShow: string;
          WindowStartMove: string;
          WindowStartResize: string;
          WindowUnFullscreen: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowZOrderChanged: string;
      }
      • APMPowerSettingChange: string
      • APMPowerStatusChange: string
      • APMResumeAutomatic: string
      • APMResumeSuspend: string
      • APMSuspend: string
      • ApplicationStarted: string
      • SystemThemeChanged: string
      • WebViewNavigationCompleted: string
      • WindowActive: string
      • WindowBackgroundErase: string
      • WindowClickActive: string
      • WindowClosing: string
      • WindowDPIChanged: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowDragDrop: string
      • WindowDragEnter: string
      • WindowDragLeave: string
      • WindowDragOver: string
      • WindowEndMove: string
      • WindowEndResize: string
      • WindowFullscreen: string
      • WindowHide: string
      • WindowInactive: string
      • WindowKeyDown: string
      • WindowKeyUp: string
      • WindowKillFocus: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowNonClientHit: string
      • WindowNonClientMouseDown: string
      • WindowNonClientMouseLeave: string
      • WindowNonClientMouseMove: string
      • WindowNonClientMouseUp: string
      • WindowPaint: string
      • WindowRestore: string
      • WindowSetFocus: string
      • WindowShow: string
      • WindowStartMove: string
      • WindowStartResize: string
      • WindowUnFullscreen: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowZOrderChanged: string

    Generated using TypeDoc

    \ No newline at end of file +Types | @wailsio/runtime

    Variable TypesConst

    Types: {
        Common: {
            ApplicationOpenedWithFile: string;
            ApplicationStarted: string;
            ThemeChanged: string;
            WindowClosing: string;
            WindowDPIChanged: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowFilesDropped: string;
            WindowFocus: string;
            WindowFullscreen: string;
            WindowHide: string;
            WindowLostFocus: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowRestore: string;
            WindowRuntimeReady: string;
            WindowShow: string;
            WindowUnFullscreen: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowZoom: string;
            WindowZoomIn: string;
            WindowZoomOut: string;
            WindowZoomReset: string;
        };
        Linux: {
            ApplicationStartup: string;
            SystemThemeChanged: string;
            WindowDeleteEvent: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowFocusIn: string;
            WindowFocusOut: string;
            WindowLoadChanged: string;
        };
        Mac: {
            ApplicationDidBecomeActive: string;
            ApplicationDidChangeBackingProperties: string;
            ApplicationDidChangeEffectiveAppearance: string;
            ApplicationDidChangeIcon: string;
            ApplicationDidChangeOcclusionState: string;
            ApplicationDidChangeScreenParameters: string;
            ApplicationDidChangeStatusBarFrame: string;
            ApplicationDidChangeStatusBarOrientation: string;
            ApplicationDidChangeTheme: string;
            ApplicationDidFinishLaunching: string;
            ApplicationDidHide: string;
            ApplicationDidResignActive: string;
            ApplicationDidUnhide: string;
            ApplicationDidUpdate: string;
            ApplicationShouldHandleReopen: string;
            ApplicationWillBecomeActive: string;
            ApplicationWillFinishLaunching: string;
            ApplicationWillHide: string;
            ApplicationWillResignActive: string;
            ApplicationWillTerminate: string;
            ApplicationWillUnhide: string;
            ApplicationWillUpdate: string;
            MenuDidAddItem: string;
            MenuDidBeginTracking: string;
            MenuDidClose: string;
            MenuDidDisplayItem: string;
            MenuDidEndTracking: string;
            MenuDidHighlightItem: string;
            MenuDidOpen: string;
            MenuDidPopUp: string;
            MenuDidRemoveItem: string;
            MenuDidSendAction: string;
            MenuDidSendActionToItem: string;
            MenuDidUpdate: string;
            MenuWillAddItem: string;
            MenuWillBeginTracking: string;
            MenuWillDisplayItem: string;
            MenuWillEndTracking: string;
            MenuWillHighlightItem: string;
            MenuWillOpen: string;
            MenuWillPopUp: string;
            MenuWillRemoveItem: string;
            MenuWillSendAction: string;
            MenuWillSendActionToItem: string;
            MenuWillUpdate: string;
            WebViewDidCommitNavigation: string;
            WebViewDidFinishNavigation: string;
            WebViewDidReceiveServerRedirectForProvisionalNavigation: string;
            WebViewDidStartProvisionalNavigation: string;
            WindowDidBecomeKey: string;
            WindowDidBecomeMain: string;
            WindowDidBeginSheet: string;
            WindowDidChangeAlpha: string;
            WindowDidChangeBackingLocation: string;
            WindowDidChangeBackingProperties: string;
            WindowDidChangeCollectionBehavior: string;
            WindowDidChangeEffectiveAppearance: string;
            WindowDidChangeOcclusionState: string;
            WindowDidChangeOrderingMode: string;
            WindowDidChangeScreen: string;
            WindowDidChangeScreenParameters: string;
            WindowDidChangeScreenProfile: string;
            WindowDidChangeScreenSpace: string;
            WindowDidChangeScreenSpaceProperties: string;
            WindowDidChangeSharingType: string;
            WindowDidChangeSpace: string;
            WindowDidChangeSpaceOrderingMode: string;
            WindowDidChangeTitle: string;
            WindowDidChangeToolbar: string;
            WindowDidDeminiaturize: string;
            WindowDidEndSheet: string;
            WindowDidEnterFullScreen: string;
            WindowDidEnterVersionBrowser: string;
            WindowDidExitFullScreen: string;
            WindowDidExitVersionBrowser: string;
            WindowDidExpose: string;
            WindowDidFocus: string;
            WindowDidMiniaturize: string;
            WindowDidMove: string;
            WindowDidOrderOffScreen: string;
            WindowDidOrderOnScreen: string;
            WindowDidResignKey: string;
            WindowDidResignMain: string;
            WindowDidResize: string;
            WindowDidUpdate: string;
            WindowDidUpdateAlpha: string;
            WindowDidUpdateCollectionBehavior: string;
            WindowDidUpdateCollectionProperties: string;
            WindowDidUpdateShadow: string;
            WindowDidUpdateTitle: string;
            WindowDidUpdateToolbar: string;
            WindowDidZoom: string;
            WindowFileDraggingEntered: string;
            WindowFileDraggingExited: string;
            WindowFileDraggingPerformed: string;
            WindowHide: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowShouldClose: string;
            WindowShow: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowWillBecomeKey: string;
            WindowWillBecomeMain: string;
            WindowWillBeginSheet: string;
            WindowWillChangeOrderingMode: string;
            WindowWillClose: string;
            WindowWillDeminiaturize: string;
            WindowWillEnterFullScreen: string;
            WindowWillEnterVersionBrowser: string;
            WindowWillExitFullScreen: string;
            WindowWillExitVersionBrowser: string;
            WindowWillFocus: string;
            WindowWillMiniaturize: string;
            WindowWillMove: string;
            WindowWillOrderOffScreen: string;
            WindowWillOrderOnScreen: string;
            WindowWillResignMain: string;
            WindowWillResize: string;
            WindowWillUnfocus: string;
            WindowWillUpdate: string;
            WindowWillUpdateAlpha: string;
            WindowWillUpdateCollectionBehavior: string;
            WindowWillUpdateCollectionProperties: string;
            WindowWillUpdateShadow: string;
            WindowWillUpdateTitle: string;
            WindowWillUpdateToolbar: string;
            WindowWillUpdateVisibility: string;
            WindowWillUseStandardFrame: string;
            WindowZoomIn: string;
            WindowZoomOut: string;
            WindowZoomReset: string;
        };
        Windows: {
            APMPowerSettingChange: string;
            APMPowerStatusChange: string;
            APMResumeAutomatic: string;
            APMResumeSuspend: string;
            APMSuspend: string;
            ApplicationStarted: string;
            SystemThemeChanged: string;
            WebViewNavigationCompleted: string;
            WindowActive: string;
            WindowBackgroundErase: string;
            WindowClickActive: string;
            WindowClosing: string;
            WindowDPIChanged: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowDragDrop: string;
            WindowDragEnter: string;
            WindowDragLeave: string;
            WindowDragOver: string;
            WindowEndMove: string;
            WindowEndResize: string;
            WindowFullscreen: string;
            WindowHide: string;
            WindowInactive: string;
            WindowKeyDown: string;
            WindowKeyUp: string;
            WindowKillFocus: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowNonClientHit: string;
            WindowNonClientMouseDown: string;
            WindowNonClientMouseLeave: string;
            WindowNonClientMouseMove: string;
            WindowNonClientMouseUp: string;
            WindowPaint: string;
            WindowRestore: string;
            WindowSetFocus: string;
            WindowShow: string;
            WindowStartMove: string;
            WindowStartResize: string;
            WindowUnFullscreen: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowZOrderChanged: string;
        };
    } = EventTypes

    Type declaration

    • Common: {
          ApplicationOpenedWithFile: string;
          ApplicationStarted: string;
          ThemeChanged: string;
          WindowClosing: string;
          WindowDPIChanged: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowFilesDropped: string;
          WindowFocus: string;
          WindowFullscreen: string;
          WindowHide: string;
          WindowLostFocus: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowRestore: string;
          WindowRuntimeReady: string;
          WindowShow: string;
          WindowUnFullscreen: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowZoom: string;
          WindowZoomIn: string;
          WindowZoomOut: string;
          WindowZoomReset: string;
      }
      • ApplicationOpenedWithFile: string
      • ApplicationStarted: string
      • ThemeChanged: string
      • WindowClosing: string
      • WindowDPIChanged: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowFilesDropped: string
      • WindowFocus: string
      • WindowFullscreen: string
      • WindowHide: string
      • WindowLostFocus: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowRestore: string
      • WindowRuntimeReady: string
      • WindowShow: string
      • WindowUnFullscreen: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowZoom: string
      • WindowZoomIn: string
      • WindowZoomOut: string
      • WindowZoomReset: string
    • Linux: {
          ApplicationStartup: string;
          SystemThemeChanged: string;
          WindowDeleteEvent: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowFocusIn: string;
          WindowFocusOut: string;
          WindowLoadChanged: string;
      }
      • ApplicationStartup: string
      • SystemThemeChanged: string
      • WindowDeleteEvent: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowFocusIn: string
      • WindowFocusOut: string
      • WindowLoadChanged: string
    • Mac: {
          ApplicationDidBecomeActive: string;
          ApplicationDidChangeBackingProperties: string;
          ApplicationDidChangeEffectiveAppearance: string;
          ApplicationDidChangeIcon: string;
          ApplicationDidChangeOcclusionState: string;
          ApplicationDidChangeScreenParameters: string;
          ApplicationDidChangeStatusBarFrame: string;
          ApplicationDidChangeStatusBarOrientation: string;
          ApplicationDidChangeTheme: string;
          ApplicationDidFinishLaunching: string;
          ApplicationDidHide: string;
          ApplicationDidResignActive: string;
          ApplicationDidUnhide: string;
          ApplicationDidUpdate: string;
          ApplicationShouldHandleReopen: string;
          ApplicationWillBecomeActive: string;
          ApplicationWillFinishLaunching: string;
          ApplicationWillHide: string;
          ApplicationWillResignActive: string;
          ApplicationWillTerminate: string;
          ApplicationWillUnhide: string;
          ApplicationWillUpdate: string;
          MenuDidAddItem: string;
          MenuDidBeginTracking: string;
          MenuDidClose: string;
          MenuDidDisplayItem: string;
          MenuDidEndTracking: string;
          MenuDidHighlightItem: string;
          MenuDidOpen: string;
          MenuDidPopUp: string;
          MenuDidRemoveItem: string;
          MenuDidSendAction: string;
          MenuDidSendActionToItem: string;
          MenuDidUpdate: string;
          MenuWillAddItem: string;
          MenuWillBeginTracking: string;
          MenuWillDisplayItem: string;
          MenuWillEndTracking: string;
          MenuWillHighlightItem: string;
          MenuWillOpen: string;
          MenuWillPopUp: string;
          MenuWillRemoveItem: string;
          MenuWillSendAction: string;
          MenuWillSendActionToItem: string;
          MenuWillUpdate: string;
          WebViewDidCommitNavigation: string;
          WebViewDidFinishNavigation: string;
          WebViewDidReceiveServerRedirectForProvisionalNavigation: string;
          WebViewDidStartProvisionalNavigation: string;
          WindowDidBecomeKey: string;
          WindowDidBecomeMain: string;
          WindowDidBeginSheet: string;
          WindowDidChangeAlpha: string;
          WindowDidChangeBackingLocation: string;
          WindowDidChangeBackingProperties: string;
          WindowDidChangeCollectionBehavior: string;
          WindowDidChangeEffectiveAppearance: string;
          WindowDidChangeOcclusionState: string;
          WindowDidChangeOrderingMode: string;
          WindowDidChangeScreen: string;
          WindowDidChangeScreenParameters: string;
          WindowDidChangeScreenProfile: string;
          WindowDidChangeScreenSpace: string;
          WindowDidChangeScreenSpaceProperties: string;
          WindowDidChangeSharingType: string;
          WindowDidChangeSpace: string;
          WindowDidChangeSpaceOrderingMode: string;
          WindowDidChangeTitle: string;
          WindowDidChangeToolbar: string;
          WindowDidDeminiaturize: string;
          WindowDidEndSheet: string;
          WindowDidEnterFullScreen: string;
          WindowDidEnterVersionBrowser: string;
          WindowDidExitFullScreen: string;
          WindowDidExitVersionBrowser: string;
          WindowDidExpose: string;
          WindowDidFocus: string;
          WindowDidMiniaturize: string;
          WindowDidMove: string;
          WindowDidOrderOffScreen: string;
          WindowDidOrderOnScreen: string;
          WindowDidResignKey: string;
          WindowDidResignMain: string;
          WindowDidResize: string;
          WindowDidUpdate: string;
          WindowDidUpdateAlpha: string;
          WindowDidUpdateCollectionBehavior: string;
          WindowDidUpdateCollectionProperties: string;
          WindowDidUpdateShadow: string;
          WindowDidUpdateTitle: string;
          WindowDidUpdateToolbar: string;
          WindowDidZoom: string;
          WindowFileDraggingEntered: string;
          WindowFileDraggingExited: string;
          WindowFileDraggingPerformed: string;
          WindowHide: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowShouldClose: string;
          WindowShow: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowWillBecomeKey: string;
          WindowWillBecomeMain: string;
          WindowWillBeginSheet: string;
          WindowWillChangeOrderingMode: string;
          WindowWillClose: string;
          WindowWillDeminiaturize: string;
          WindowWillEnterFullScreen: string;
          WindowWillEnterVersionBrowser: string;
          WindowWillExitFullScreen: string;
          WindowWillExitVersionBrowser: string;
          WindowWillFocus: string;
          WindowWillMiniaturize: string;
          WindowWillMove: string;
          WindowWillOrderOffScreen: string;
          WindowWillOrderOnScreen: string;
          WindowWillResignMain: string;
          WindowWillResize: string;
          WindowWillUnfocus: string;
          WindowWillUpdate: string;
          WindowWillUpdateAlpha: string;
          WindowWillUpdateCollectionBehavior: string;
          WindowWillUpdateCollectionProperties: string;
          WindowWillUpdateShadow: string;
          WindowWillUpdateTitle: string;
          WindowWillUpdateToolbar: string;
          WindowWillUpdateVisibility: string;
          WindowWillUseStandardFrame: string;
          WindowZoomIn: string;
          WindowZoomOut: string;
          WindowZoomReset: string;
      }
      • ApplicationDidBecomeActive: string
      • ApplicationDidChangeBackingProperties: string
      • ApplicationDidChangeEffectiveAppearance: string
      • ApplicationDidChangeIcon: string
      • ApplicationDidChangeOcclusionState: string
      • ApplicationDidChangeScreenParameters: string
      • ApplicationDidChangeStatusBarFrame: string
      • ApplicationDidChangeStatusBarOrientation: string
      • ApplicationDidChangeTheme: string
      • ApplicationDidFinishLaunching: string
      • ApplicationDidHide: string
      • ApplicationDidResignActive: string
      • ApplicationDidUnhide: string
      • ApplicationDidUpdate: string
      • ApplicationShouldHandleReopen: string
      • ApplicationWillBecomeActive: string
      • ApplicationWillFinishLaunching: string
      • ApplicationWillHide: string
      • ApplicationWillResignActive: string
      • ApplicationWillTerminate: string
      • ApplicationWillUnhide: string
      • ApplicationWillUpdate: string
      • MenuDidAddItem: string
      • MenuDidBeginTracking: string
      • MenuDidClose: string
      • MenuDidDisplayItem: string
      • MenuDidEndTracking: string
      • MenuDidHighlightItem: string
      • MenuDidOpen: string
      • MenuDidPopUp: string
      • MenuDidRemoveItem: string
      • MenuDidSendAction: string
      • MenuDidSendActionToItem: string
      • MenuDidUpdate: string
      • MenuWillAddItem: string
      • MenuWillBeginTracking: string
      • MenuWillDisplayItem: string
      • MenuWillEndTracking: string
      • MenuWillHighlightItem: string
      • MenuWillOpen: string
      • MenuWillPopUp: string
      • MenuWillRemoveItem: string
      • MenuWillSendAction: string
      • MenuWillSendActionToItem: string
      • MenuWillUpdate: string
      • WebViewDidCommitNavigation: string
      • WebViewDidFinishNavigation: string
      • WebViewDidReceiveServerRedirectForProvisionalNavigation: string
      • WebViewDidStartProvisionalNavigation: string
      • WindowDidBecomeKey: string
      • WindowDidBecomeMain: string
      • WindowDidBeginSheet: string
      • WindowDidChangeAlpha: string
      • WindowDidChangeBackingLocation: string
      • WindowDidChangeBackingProperties: string
      • WindowDidChangeCollectionBehavior: string
      • WindowDidChangeEffectiveAppearance: string
      • WindowDidChangeOcclusionState: string
      • WindowDidChangeOrderingMode: string
      • WindowDidChangeScreen: string
      • WindowDidChangeScreenParameters: string
      • WindowDidChangeScreenProfile: string
      • WindowDidChangeScreenSpace: string
      • WindowDidChangeScreenSpaceProperties: string
      • WindowDidChangeSharingType: string
      • WindowDidChangeSpace: string
      • WindowDidChangeSpaceOrderingMode: string
      • WindowDidChangeTitle: string
      • WindowDidChangeToolbar: string
      • WindowDidDeminiaturize: string
      • WindowDidEndSheet: string
      • WindowDidEnterFullScreen: string
      • WindowDidEnterVersionBrowser: string
      • WindowDidExitFullScreen: string
      • WindowDidExitVersionBrowser: string
      • WindowDidExpose: string
      • WindowDidFocus: string
      • WindowDidMiniaturize: string
      • WindowDidMove: string
      • WindowDidOrderOffScreen: string
      • WindowDidOrderOnScreen: string
      • WindowDidResignKey: string
      • WindowDidResignMain: string
      • WindowDidResize: string
      • WindowDidUpdate: string
      • WindowDidUpdateAlpha: string
      • WindowDidUpdateCollectionBehavior: string
      • WindowDidUpdateCollectionProperties: string
      • WindowDidUpdateShadow: string
      • WindowDidUpdateTitle: string
      • WindowDidUpdateToolbar: string
      • WindowDidZoom: string
      • WindowFileDraggingEntered: string
      • WindowFileDraggingExited: string
      • WindowFileDraggingPerformed: string
      • WindowHide: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowShouldClose: string
      • WindowShow: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowWillBecomeKey: string
      • WindowWillBecomeMain: string
      • WindowWillBeginSheet: string
      • WindowWillChangeOrderingMode: string
      • WindowWillClose: string
      • WindowWillDeminiaturize: string
      • WindowWillEnterFullScreen: string
      • WindowWillEnterVersionBrowser: string
      • WindowWillExitFullScreen: string
      • WindowWillExitVersionBrowser: string
      • WindowWillFocus: string
      • WindowWillMiniaturize: string
      • WindowWillMove: string
      • WindowWillOrderOffScreen: string
      • WindowWillOrderOnScreen: string
      • WindowWillResignMain: string
      • WindowWillResize: string
      • WindowWillUnfocus: string
      • WindowWillUpdate: string
      • WindowWillUpdateAlpha: string
      • WindowWillUpdateCollectionBehavior: string
      • WindowWillUpdateCollectionProperties: string
      • WindowWillUpdateShadow: string
      • WindowWillUpdateTitle: string
      • WindowWillUpdateToolbar: string
      • WindowWillUpdateVisibility: string
      • WindowWillUseStandardFrame: string
      • WindowZoomIn: string
      • WindowZoomOut: string
      • WindowZoomReset: string
    • Windows: {
          APMPowerSettingChange: string;
          APMPowerStatusChange: string;
          APMResumeAutomatic: string;
          APMResumeSuspend: string;
          APMSuspend: string;
          ApplicationStarted: string;
          SystemThemeChanged: string;
          WebViewNavigationCompleted: string;
          WindowActive: string;
          WindowBackgroundErase: string;
          WindowClickActive: string;
          WindowClosing: string;
          WindowDPIChanged: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowDragDrop: string;
          WindowDragEnter: string;
          WindowDragLeave: string;
          WindowDragOver: string;
          WindowEndMove: string;
          WindowEndResize: string;
          WindowFullscreen: string;
          WindowHide: string;
          WindowInactive: string;
          WindowKeyDown: string;
          WindowKeyUp: string;
          WindowKillFocus: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowNonClientHit: string;
          WindowNonClientMouseDown: string;
          WindowNonClientMouseLeave: string;
          WindowNonClientMouseMove: string;
          WindowNonClientMouseUp: string;
          WindowPaint: string;
          WindowRestore: string;
          WindowSetFocus: string;
          WindowShow: string;
          WindowStartMove: string;
          WindowStartResize: string;
          WindowUnFullscreen: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowZOrderChanged: string;
      }
      • APMPowerSettingChange: string
      • APMPowerStatusChange: string
      • APMResumeAutomatic: string
      • APMResumeSuspend: string
      • APMSuspend: string
      • ApplicationStarted: string
      • SystemThemeChanged: string
      • WebViewNavigationCompleted: string
      • WindowActive: string
      • WindowBackgroundErase: string
      • WindowClickActive: string
      • WindowClosing: string
      • WindowDPIChanged: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowDragDrop: string
      • WindowDragEnter: string
      • WindowDragLeave: string
      • WindowDragOver: string
      • WindowEndMove: string
      • WindowEndResize: string
      • WindowFullscreen: string
      • WindowHide: string
      • WindowInactive: string
      • WindowKeyDown: string
      • WindowKeyUp: string
      • WindowKillFocus: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowNonClientHit: string
      • WindowNonClientMouseDown: string
      • WindowNonClientMouseLeave: string
      • WindowNonClientMouseMove: string
      • WindowNonClientMouseUp: string
      • WindowPaint: string
      • WindowRestore: string
      • WindowSetFocus: string
      • WindowShow: string
      • WindowStartMove: string
      • WindowStartResize: string
      • WindowUnFullscreen: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowZOrderChanged: string

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Window.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Window.html index a28337313..39300dc73 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Window.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Window.html @@ -1,2 +1,2 @@ Window | @wailsio/runtime

    Variable WindowConst

    Window: Window = ...

    The window within which the script is running.

    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/package-lock.json b/v3/internal/runtime/desktop/@wailsio/runtime/package-lock.json index cd0547ca5..454ff83a7 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/package-lock.json +++ b/v3/internal/runtime/desktop/@wailsio/runtime/package-lock.json @@ -1,12 +1,12 @@ { "name": "@wailsio/runtime", - "version": "3.0.0-alpha.61", + "version": "3.0.0-alpha.62", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@wailsio/runtime", - "version": "3.0.0-alpha.61", + "version": "3.0.0-alpha.62", "license": "MIT", "devDependencies": { "rimraf": "^5.0.5", diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/package.json b/v3/internal/runtime/desktop/@wailsio/runtime/package.json index c75f97992..6aecdb7d1 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/package.json +++ b/v3/internal/runtime/desktop/@wailsio/runtime/package.json @@ -1,7 +1,7 @@ { "name": "@wailsio/runtime", "type": "module", - "version": "3.0.0-alpha.61", + "version": "3.0.0-alpha.62", "description": "Wails Runtime", "types": "types/index.d.ts", "exports": { From 9988b7eca874d839b650d5d4bd5992313ab37105 Mon Sep 17 00:00:00 2001 From: Fabio Massaioli Date: Thu, 27 Feb 2025 21:21:51 +0100 Subject: [PATCH 106/374] [v3] Binding generator tests for Go 1.24 features (#4068) * Enable go1.24 tests This reverts commit e38684e7885c9c7b5ad3f704ad500c39bbce7715. * Testdata for go1.24 This reverts commit 7ed397dc452f420551dfdd05dfe0c6a7646b3ba4. * Require go 1.24 * Update changelog * Add test for omitzero --------- Co-authored-by: Lea Anthony --- docs/src/content/docs/changelog.mdx | 1 + .../generator/testcases/aliases/main.go | 45 +- .../complex_instantiations/bound_types.json | 2 + .../testcases/complex_instantiations/main.go | 4 +- .../generator/testcases/complex_json/main.go | 2 +- .../generator/testcases/map_keys/main.go | 148 ++-- .../testcases/aliases/greetservice.js | 27 +- .../generator/testcases/aliases/index.js | 24 +- .../generator/testcases/aliases/models.js | 168 +++++ .../generator/testcases/map_keys/index.js | 35 + .../generator/testcases/map_keys/models.js | 710 ++++++++++++++++++ .../UseNames=false/warnings.log | 23 + .../testcases/aliases/greetservice.js | 27 +- .../generator/testcases/aliases/index.js | 24 +- .../generator/testcases/aliases/models.js | 168 +++++ .../generator/testcases/map_keys/index.js | 35 + .../generator/testcases/map_keys/models.js | 710 ++++++++++++++++++ .../UseNames=true/warnings.log | 23 + .../testcases/aliases/greetservice.js | 8 + .../generator/testcases/aliases/index.js | 39 + .../generator/testcases/aliases/models.js | 47 ++ .../generator/testcases/map_keys/index.js | 35 + .../generator/testcases/map_keys/models.js | 91 +++ .../UseNames=false/warnings.log | 23 + .../testcases/aliases/greetservice.js | 8 + .../generator/testcases/aliases/index.js | 39 + .../generator/testcases/aliases/models.js | 47 ++ .../generator/testcases/map_keys/index.js | 35 + .../generator/testcases/map_keys/models.js | 91 +++ .../UseNames=true/warnings.log | 23 + .../testcases/aliases/greetservice.ts | 24 +- .../generator/testcases/aliases/index.ts | 9 +- .../generator/testcases/aliases/models.ts | 136 ++++ .../generator/testcases/map_keys/index.ts | 7 + .../generator/testcases/map_keys/models.ts | 689 +++++++++++++++++ .../UseNames=false/warnings.log | 23 + .../testcases/aliases/greetservice.ts | 24 +- .../generator/testcases/aliases/index.ts | 9 +- .../generator/testcases/aliases/models.ts | 136 ++++ .../generator/testcases/map_keys/index.ts | 7 + .../generator/testcases/map_keys/models.ts | 689 +++++++++++++++++ .../UseNames=true/warnings.log | 23 + .../testcases/aliases/greetservice.ts | 5 + .../generator/testcases/aliases/index.ts | 9 +- .../generator/testcases/aliases/models.ts | 44 ++ .../generator/testcases/map_keys/index.ts | 7 + .../generator/testcases/map_keys/models.ts | 294 ++++++++ .../UseNames=false/warnings.log | 23 + .../testcases/aliases/greetservice.ts | 5 + .../generator/testcases/aliases/index.ts | 9 +- .../generator/testcases/aliases/models.ts | 44 ++ .../generator/testcases/map_keys/index.ts | 7 + .../generator/testcases/map_keys/models.ts | 294 ++++++++ .../UseNames=true/warnings.log | 23 + 54 files changed, 5069 insertions(+), 133 deletions(-) diff --git a/docs/src/content/docs/changelog.mdx b/docs/src/content/docs/changelog.mdx index c4d990635..c1db72067 100644 --- a/docs/src/content/docs/changelog.mdx +++ b/docs/src/content/docs/changelog.mdx @@ -53,6 +53,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Add `//wails:ignore` directive to prevent binding generation for chosen service methods by [@fbbdev](https://github.com/fbbdev) in [#4045](https://github.com/wailsapp/wails/pull/4045) - Add `//wails:internal` directive on services and models to allow for types that are exported in Go but not in JS/TS by [@fbbdev](https://github.com/fbbdev) in [#4045](https://github.com/wailsapp/wails/pull/4045) - Add binding generator support for constants of alias type to allow for weakly typed enums by [@fbbdev](https://github.com/fbbdev) in [#4045](https://github.com/wailsapp/wails/pull/4045) +- Add binding generator tests for Go 1.24 features by [@fbbdev](https://github.com/fbbdev) in [#4068](https://github.com/wailsapp/wails/pull/4068) - Add support for macOS 15 "Sequoia" to `OSInfo.Branding` for improved OS version detection in [#4065](https://github.com/wailsapp/wails/pull/4065) - Add `PostShutdown` hook for running custom code after the shutdown process completes by [@fbbdev](https://github.com/fbbdev) in [#4066](https://github.com/wailsapp/wails/pull/4066) - Add `FatalError` struct to support detection of fatal errors in custom error handlers by [@fbbdev](https://github.com/fbbdev) in [#4066](https://github.com/wailsapp/wails/pull/4066) diff --git a/v3/internal/generator/testcases/aliases/main.go b/v3/internal/generator/testcases/aliases/main.go index 7695d625c..8655425e9 100644 --- a/v3/internal/generator/testcases/aliases/main.go +++ b/v3/internal/generator/testcases/aliases/main.go @@ -2,6 +2,7 @@ package main import ( _ "embed" + "encoding" "log" nobindingshere "github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here" @@ -54,37 +55,37 @@ type GenericPerson[T any] struct { type StrangelyAliasedPerson = Person // A generic alias that forwards to a type parameter. -// type GenericAlias[T any] = T +type GenericAlias[T any] = T // A generic alias that wraps a pointer type. -// type GenericPtrAlias[T any] = *GenericAlias[T] +type GenericPtrAlias[T any] = *GenericAlias[T] // A generic alias that wraps a map. -// type GenericMapAlias[T interface { -// comparable -// encoding.TextMarshaler -// }, U any] = map[T]U +type GenericMapAlias[T interface { + comparable + encoding.TextMarshaler +}, U any] = map[T]U // A generic alias that wraps a generic struct. -// type GenericPersonAlias[T any] = GenericPerson[[]GenericPtrAlias[T]] +type GenericPersonAlias[T any] = GenericPerson[[]GenericPtrAlias[T]] // An alias that wraps a class through a non-typeparam alias. -// type IndirectPersonAlias = GenericPersonAlias[bool] +type IndirectPersonAlias = GenericPersonAlias[bool] // An alias that wraps a class through a typeparam alias. -// type TPIndirectPersonAlias = GenericAlias[GenericPerson[bool]] +type TPIndirectPersonAlias = GenericAlias[GenericPerson[bool]] // A class whose fields have various aliased types. -// type AliasGroup struct { -// GAi GenericAlias[int] -// GAP GenericAlias[GenericPerson[bool]] -// GPAs GenericPtrAlias[[]string] -// GPAP GenericPtrAlias[GenericPerson[[]int]] -// GMA GenericMapAlias[struct{ encoding.TextMarshaler }, float32] -// GPA GenericPersonAlias[bool] -// IPA IndirectPersonAlias -// TPIPA TPIndirectPersonAlias -// } +type AliasGroup struct { + GAi GenericAlias[int] + GAP GenericAlias[GenericPerson[bool]] + GPAs GenericPtrAlias[[]string] + GPAP GenericPtrAlias[GenericPerson[[]int]] + GMA GenericMapAlias[struct{ encoding.TextMarshaler }, float32] + GPA GenericPersonAlias[bool] + IPA IndirectPersonAlias + TPIPA TPIndirectPersonAlias +} // Get someone. func (GreetService) Get(aliasValue Alias) Person { @@ -105,9 +106,9 @@ func (GreetService) GetButForeignPrivateAlias() (_ nobindingshere.PrivatePerson) return } -// func (GreetService) GetButGenericAliases() (_ AliasGroup) { -// return -// } +func (GreetService) GetButGenericAliases() (_ AliasGroup) { + return +} // Greet a lot of unusual things. func (GreetService) Greet(EmptyAliasStruct, EmptyStruct) AliasStruct { diff --git a/v3/internal/generator/testcases/complex_instantiations/bound_types.json b/v3/internal/generator/testcases/complex_instantiations/bound_types.json index 442ec1501..663519c0c 100644 --- a/v3/internal/generator/testcases/complex_instantiations/bound_types.json +++ b/v3/internal/generator/testcases/complex_instantiations/bound_types.json @@ -12,5 +12,7 @@ ".Service11", ".Service12", ".Service13", + ".Service14", + ".Service15", "/other.Service16" ] diff --git a/v3/internal/generator/testcases/complex_instantiations/main.go b/v3/internal/generator/testcases/complex_instantiations/main.go index a934421c1..02e63e21c 100644 --- a/v3/internal/generator/testcases/complex_instantiations/main.go +++ b/v3/internal/generator/testcases/complex_instantiations/main.go @@ -24,7 +24,7 @@ type Service13 struct{} type Service14 struct{} type Service15 struct{} -// type SimplifiedFactory[T any] = Factory[T, Service15] +type SimplifiedFactory[T any] = Factory[T, Service15] func main() { factory := NewFactory[Service1, Service2]() @@ -42,7 +42,7 @@ func main() { other.CustomNewService(Service7{}), other.ServiceInitialiser[Service8]()(&Service8{}), application.NewServiceWithOptions(&Service13{}, application.ServiceOptions{Name: "custom name"}), - // SimplifiedFactory[Service14]{}.Get(), + SimplifiedFactory[Service14]{}.Get(), other.LocalService, }, CustomNewServices[Service9, Service10]()...), diff --git a/v3/internal/generator/testcases/complex_json/main.go b/v3/internal/generator/testcases/complex_json/main.go index 18ee6720f..2eac2eba7 100644 --- a/v3/internal/generator/testcases/complex_json/main.go +++ b/v3/internal/generator/testcases/complex_json/main.go @@ -52,7 +52,7 @@ type Embedded3 string // Person represents a person type Person struct { // Titles is optional in JSON - Titles []Title `json:",omitempty"` + Titles []Title `json:",omitzero"` // Names has a // multiline comment diff --git a/v3/internal/generator/testcases/map_keys/main.go b/v3/internal/generator/testcases/map_keys/main.go index 1ed2608a3..833630100 100644 --- a/v3/internal/generator/testcases/map_keys/main.go +++ b/v3/internal/generator/testcases/map_keys/main.go @@ -106,24 +106,24 @@ type InterfacePtrType *encoding.TextMarshaler type InterfaceAlias = encoding.TextMarshaler type InterfacePtrAlias = *encoding.TextMarshaler -// type ComparableCstrAlias[R comparable] = R -// type ComparableCstrPtrAlias[R comparable] = *R -// type BasicCstrAlias[S BasicConstraint] = S -// type BasicCstrPtrAlias[S BasicConstraint] = *S -// type BadTildeCstrAlias[T BadTildeConstraint] = T -// type BadTildeCstrPtrAlias[T BadTildeConstraint] = *T -// type GoodTildeCstrAlias[U GoodTildeConstraint] = U -// type GoodTildeCstrPtrAlias[U GoodTildeConstraint] = *U -// type NonBasicCstrAlias[V NonBasicConstraint] = V -// type NonBasicCstrPtrAlias[V NonBasicConstraint] = *V -// type PointableCstrAlias[W PointableConstraint] = W -// type PointableCstrPtrAlias[W PointableConstraint] = *W -// type MixedCstrAlias[X MixedConstraint] = X -// type MixedCstrPtrAlias[X MixedConstraint] = *X -// type InterfaceCstrAlias[Y InterfaceConstraint] = Y -// type InterfaceCstrPtrAlias[Y InterfaceConstraint] = *Y -// type PointerCstrAlias[R comparable, Z PointerConstraint[R]] = Z -// type PointerCstrPtrAlias[R comparable, Z PointerConstraint[R]] = *Z +type ComparableCstrAlias[R comparable] = R +type ComparableCstrPtrAlias[R comparable] = *R +type BasicCstrAlias[S BasicConstraint] = S +type BasicCstrPtrAlias[S BasicConstraint] = *S +type BadTildeCstrAlias[T BadTildeConstraint] = T +type BadTildeCstrPtrAlias[T BadTildeConstraint] = *T +type GoodTildeCstrAlias[U GoodTildeConstraint] = U +type GoodTildeCstrPtrAlias[U GoodTildeConstraint] = *U +type NonBasicCstrAlias[V NonBasicConstraint] = V +type NonBasicCstrPtrAlias[V NonBasicConstraint] = *V +type PointableCstrAlias[W PointableConstraint] = W +type PointableCstrPtrAlias[W PointableConstraint] = *W +type MixedCstrAlias[X MixedConstraint] = X +type MixedCstrPtrAlias[X MixedConstraint] = *X +type InterfaceCstrAlias[Y InterfaceConstraint] = Y +type InterfaceCstrPtrAlias[Y InterfaceConstraint] = *Y +type PointerCstrAlias[R comparable, Z PointerConstraint[R]] = Z +type PointerCstrPtrAlias[R comparable, Z PointerConstraint[R]] = *Z type Maps[R comparable, S BasicConstraint, T BadTildeConstraint, U GoodTildeConstraint, V NonBasicConstraint, W PointableConstraint, X MixedConstraint, Y InterfaceConstraint, Z PointerConstraint[R]] struct { Bool map[bool]int // Reject @@ -226,63 +226,63 @@ type Maps[R comparable, S BasicConstraint, T BadTildeConstraint, U GoodTildeCons TPZ map[Z]int // Accept, hide TPZPtr map[*Z]int // Soft reject - // GAR map[ComparableCstrAlias[R]]int // Soft reject - // GARPtr map[ComparableCstrPtrAlias[R]]int // Soft reject - // GAS map[BasicCstrAlias[S]]int // Accept, hide - // GASPtr map[BasicCstrPtrAlias[S]]int // Soft reject - // GAT map[BadTildeCstrAlias[T]]int // Soft reject - // GATPtr map[BadTildeCstrPtrAlias[T]]int // Soft reject - // GAU map[GoodTildeCstrAlias[U]]int // Accept, hide - // GAUPtr map[GoodTildeCstrPtrAlias[U]]int // Soft reject - // GAV map[NonBasicCstrAlias[V]]int // Accept, hide - // GAVPtr map[NonBasicCstrPtrAlias[V]]int // Soft reject - // GAW map[PointableCstrAlias[W]]int // Soft reject - // GAWPtr map[PointableCstrPtrAlias[W]]int // Accept, hide - // GAX map[MixedCstrAlias[X]]int // Accept, hide - // GAXPtr map[MixedCstrPtrAlias[X]]int // Soft reject - // GAY map[InterfaceCstrAlias[Y]]int // Accept, hide - // GAYPtr map[InterfaceCstrPtrAlias[Y]]int // Soft reject - // GAZ map[PointerCstrAlias[R, Z]]int // Accept, hide - // GAZPtr map[PointerCstrPtrAlias[R, Z]]int // Soft reject + GAR map[ComparableCstrAlias[R]]int // Soft reject + GARPtr map[ComparableCstrPtrAlias[R]]int // Soft reject + GAS map[BasicCstrAlias[S]]int // Accept, hide + GASPtr map[BasicCstrPtrAlias[S]]int // Soft reject + GAT map[BadTildeCstrAlias[T]]int // Soft reject + GATPtr map[BadTildeCstrPtrAlias[T]]int // Soft reject + GAU map[GoodTildeCstrAlias[U]]int // Accept, hide + GAUPtr map[GoodTildeCstrPtrAlias[U]]int // Soft reject + GAV map[NonBasicCstrAlias[V]]int // Accept, hide + GAVPtr map[NonBasicCstrPtrAlias[V]]int // Soft reject + GAW map[PointableCstrAlias[W]]int // Soft reject + GAWPtr map[PointableCstrPtrAlias[W]]int // Accept, hide + GAX map[MixedCstrAlias[X]]int // Accept, hide + GAXPtr map[MixedCstrPtrAlias[X]]int // Soft reject + GAY map[InterfaceCstrAlias[Y]]int // Accept, hide + GAYPtr map[InterfaceCstrPtrAlias[Y]]int // Soft reject + GAZ map[PointerCstrAlias[R, Z]]int // Accept, hide + GAZPtr map[PointerCstrPtrAlias[R, Z]]int // Soft reject - // GACi map[ComparableCstrAlias[int]]int // Accept, hide - // GACV map[ComparableCstrAlias[ValueTextMarshaler]]int // Accept - // GACP map[ComparableCstrAlias[PointerTextMarshaler]]int // Reject - // GACiPtr map[ComparableCstrPtrAlias[int]]int // Reject - // GACVPtr map[ComparableCstrPtrAlias[ValueTextMarshaler]]int // Accept, hide - // GACPPtr map[ComparableCstrPtrAlias[PointerTextMarshaler]]int // Accept, hide - // GABi map[BasicCstrAlias[int]]int // Accept, hide - // GABs map[BasicCstrAlias[string]]int // Accept - // GABiPtr map[BasicCstrPtrAlias[int]]int // Reject - // GABT map[BadTildeCstrAlias[struct{}]]int // Reject - // GABTPtr map[BadTildeCstrPtrAlias[struct{}]]int // Reject - // GAGT map[GoodTildeCstrAlias[ValueTextMarshaler]]int // Accept - // GAGTPtr map[GoodTildeCstrPtrAlias[ValueTextMarshaler]]int // Accept, hide - // GANBV map[NonBasicCstrAlias[ValueTextMarshaler]]int // Accept - // GANBP map[NonBasicCstrAlias[*PointerTextMarshaler]]int // Accept, hide - // GANBVPtr map[NonBasicCstrPtrAlias[ValueTextMarshaler]]int // Accept, hide - // GANBPPtr map[NonBasicCstrPtrAlias[*PointerTextMarshaler]]int // Reject - // GAPlV1 map[PointableCstrAlias[ValueTextMarshaler]]int // Accept - // GAPlV2 map[*PointableCstrAlias[ValueTextMarshaler]]int // Accept - // GAPlP1 map[PointableCstrAlias[PointerTextMarshaler]]int // Reject - // GAPlP2 map[*PointableCstrAlias[PointerTextMarshaler]]int // Accept - // GAPlVPtr map[PointableCstrPtrAlias[ValueTextMarshaler]]int // Accept, hide - // GAPlPPtr map[PointableCstrPtrAlias[PointerTextMarshaler]]int // Accept, hide - // GAMi map[MixedCstrAlias[uint]]int // Accept, hide - // GAMS map[MixedCstrAlias[StringType]]int // Accept - // GAMV map[MixedCstrAlias[ValueTextMarshaler]]int // Accept - // GAMSPtr map[MixedCstrPtrAlias[StringType]]int // Reject - // GAMVPtr map[MixedCstrPtrAlias[ValueTextMarshaler]]int // Accept, hide - // GAII map[InterfaceCstrAlias[encoding.TextMarshaler]]int // Accept, hide - // GAIV map[InterfaceCstrAlias[ValueTextMarshaler]]int // Accept - // GAIP map[InterfaceCstrAlias[*PointerTextMarshaler]]int // Accept, hide - // GAIIPtr map[InterfaceCstrPtrAlias[encoding.TextMarshaler]]int // Reject - // GAIVPtr map[InterfaceCstrPtrAlias[ValueTextMarshaler]]int // Accept, hide - // GAIPPtr map[InterfaceCstrPtrAlias[*PointerTextMarshaler]]int // Reject - // GAPrV map[PointerCstrAlias[ValueTextMarshaler, *ValueTextMarshaler]]int // Accept, hide - // GAPrP map[PointerCstrAlias[PointerTextMarshaler, *PointerTextMarshaler]]int // Accept, hide - // GAPrVPtr map[PointerCstrPtrAlias[ValueTextMarshaler, *ValueTextMarshaler]]int // Reject - // GAPrPPtr map[PointerCstrPtrAlias[PointerTextMarshaler, *PointerTextMarshaler]]int // Reject + GACi map[ComparableCstrAlias[int]]int // Accept, hide + GACV map[ComparableCstrAlias[ValueTextMarshaler]]int // Accept + GACP map[ComparableCstrAlias[PointerTextMarshaler]]int // Reject + GACiPtr map[ComparableCstrPtrAlias[int]]int // Reject + GACVPtr map[ComparableCstrPtrAlias[ValueTextMarshaler]]int // Accept, hide + GACPPtr map[ComparableCstrPtrAlias[PointerTextMarshaler]]int // Accept, hide + GABi map[BasicCstrAlias[int]]int // Accept, hide + GABs map[BasicCstrAlias[string]]int // Accept + GABiPtr map[BasicCstrPtrAlias[int]]int // Reject + GABT map[BadTildeCstrAlias[struct{}]]int // Reject + GABTPtr map[BadTildeCstrPtrAlias[struct{}]]int // Reject + GAGT map[GoodTildeCstrAlias[ValueTextMarshaler]]int // Accept + GAGTPtr map[GoodTildeCstrPtrAlias[ValueTextMarshaler]]int // Accept, hide + GANBV map[NonBasicCstrAlias[ValueTextMarshaler]]int // Accept + GANBP map[NonBasicCstrAlias[*PointerTextMarshaler]]int // Accept, hide + GANBVPtr map[NonBasicCstrPtrAlias[ValueTextMarshaler]]int // Accept, hide + GANBPPtr map[NonBasicCstrPtrAlias[*PointerTextMarshaler]]int // Reject + GAPlV1 map[PointableCstrAlias[ValueTextMarshaler]]int // Accept + GAPlV2 map[*PointableCstrAlias[ValueTextMarshaler]]int // Accept + GAPlP1 map[PointableCstrAlias[PointerTextMarshaler]]int // Reject + GAPlP2 map[*PointableCstrAlias[PointerTextMarshaler]]int // Accept + GAPlVPtr map[PointableCstrPtrAlias[ValueTextMarshaler]]int // Accept, hide + GAPlPPtr map[PointableCstrPtrAlias[PointerTextMarshaler]]int // Accept, hide + GAMi map[MixedCstrAlias[uint]]int // Accept, hide + GAMS map[MixedCstrAlias[StringType]]int // Accept + GAMV map[MixedCstrAlias[ValueTextMarshaler]]int // Accept + GAMSPtr map[MixedCstrPtrAlias[StringType]]int // Reject + GAMVPtr map[MixedCstrPtrAlias[ValueTextMarshaler]]int // Accept, hide + GAII map[InterfaceCstrAlias[encoding.TextMarshaler]]int // Accept, hide + GAIV map[InterfaceCstrAlias[ValueTextMarshaler]]int // Accept + GAIP map[InterfaceCstrAlias[*PointerTextMarshaler]]int // Accept, hide + GAIIPtr map[InterfaceCstrPtrAlias[encoding.TextMarshaler]]int // Reject + GAIVPtr map[InterfaceCstrPtrAlias[ValueTextMarshaler]]int // Accept, hide + GAIPPtr map[InterfaceCstrPtrAlias[*PointerTextMarshaler]]int // Reject + GAPrV map[PointerCstrAlias[ValueTextMarshaler, *ValueTextMarshaler]]int // Accept, hide + GAPrP map[PointerCstrAlias[PointerTextMarshaler, *PointerTextMarshaler]]int // Accept, hide + GAPrVPtr map[PointerCstrPtrAlias[ValueTextMarshaler, *ValueTextMarshaler]]int // Reject + GAPrPPtr map[PointerCstrPtrAlias[PointerTextMarshaler, *PointerTextMarshaler]]int // Reject } func (*Service) Method() (_ Maps[PointerTextMarshaler, int, int, ValueTextMarshaler, *PointerTextMarshaler, ValueTextMarshaler, StringType, ValueTextMarshaler, *PointerTextMarshaler]) { diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.js index 761df70f4..50edc1ec1 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.js @@ -72,6 +72,18 @@ export function GetButForeignPrivateAlias() { return $typingPromise; } +/** + * @returns {Promise<$models.AliasGroup> & { cancel(): void }} + */ +export function GetButGenericAliases() { + let $resultPromise = /** @type {any} */($Call.ByID(914093800)); + let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $$createType3($result); + })); + $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); + return $typingPromise; +} + /** * Greet a lot of unusual things. * @param {$models.EmptyAliasStruct} $0 @@ -81,7 +93,7 @@ export function GetButForeignPrivateAlias() { export function Greet($0, $1) { let $resultPromise = /** @type {any} */($Call.ByID(1411160069, $0, $1)); let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { - return $$createType6($result); + return $$createType7($result); })); $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); return $typingPromise; @@ -91,12 +103,13 @@ export function Greet($0, $1) { const $$createType0 = $models.Person.createFrom; const $$createType1 = $models.GenericPerson.createFrom($Create.Any); const $$createType2 = nobindingshere$0.personImpl.createFrom; -const $$createType3 = $Create.Array($Create.Any); +const $$createType3 = $models.AliasGroup.createFrom; const $$createType4 = $Create.Array($Create.Any); -const $$createType5 = $Create.Struct({ - "NoMoreIdeas": $$createType4, -}); +const $$createType5 = $Create.Array($Create.Any); const $$createType6 = $Create.Struct({ - "Foo": $$createType3, - "Other": $$createType5, + "NoMoreIdeas": $$createType5, +}); +const $$createType7 = $Create.Struct({ + "Foo": $$createType4, + "Other": $$createType6, }); diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/index.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/index.js index 10aa9e917..4278c7958 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/index.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/index.js @@ -8,11 +8,15 @@ export { }; export { + AliasGroup, AliasedPerson, EmptyStruct, GenericPerson, + GenericPersonAlias, + IndirectPersonAlias, Person, - StrangelyAliasedPerson + StrangelyAliasedPerson, + TPIndirectPersonAlias } from "./models.js"; import * as $models from "./models.js"; @@ -33,6 +37,24 @@ import * as $models from "./models.js"; * @typedef {$models.EmptyAliasStruct} EmptyAliasStruct */ +/** + * A generic alias that forwards to a type parameter. + * @template T + * @typedef {$models.GenericAlias} GenericAlias + */ + +/** + * A generic alias that wraps a map. + * @template T,U + * @typedef {$models.GenericMapAlias} GenericMapAlias + */ + +/** + * A generic alias that wraps a pointer type. + * @template T + * @typedef {$models.GenericPtrAlias} GenericPtrAlias + */ + /** * Another struct alias. * @typedef {$models.OtherAliasStruct} OtherAliasStruct diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/models.js index 5c69d0005..977ad4722 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/models.js @@ -11,6 +11,114 @@ import {Create as $Create} from "/wails/runtime.js"; * @typedef {number} Alias */ +/** + * A class whose fields have various aliased types. + */ +export class AliasGroup { + /** + * Creates a new AliasGroup instance. + * @param {Partial} [$$source = {}] - The source object to create the AliasGroup. + */ + constructor($$source = {}) { + if (!("GAi" in $$source)) { + /** + * @member + * @type {GenericAlias} + */ + this["GAi"] = 0; + } + if (!("GAP" in $$source)) { + /** + * @member + * @type {GenericAlias>} + */ + this["GAP"] = (new GenericPerson()); + } + if (!("GPAs" in $$source)) { + /** + * @member + * @type {GenericPtrAlias} + */ + this["GPAs"] = null; + } + if (!("GPAP" in $$source)) { + /** + * @member + * @type {GenericPtrAlias>} + */ + this["GPAP"] = null; + } + if (!("GMA" in $$source)) { + /** + * @member + * @type {GenericMapAlias} + */ + this["GMA"] = {}; + } + if (!("GPA" in $$source)) { + /** + * @member + * @type {GenericPersonAlias} + */ + this["GPA"] = (new GenericPersonAlias()); + } + if (!("IPA" in $$source)) { + /** + * @member + * @type {IndirectPersonAlias} + */ + this["IPA"] = (new IndirectPersonAlias()); + } + if (!("TPIPA" in $$source)) { + /** + * @member + * @type {TPIndirectPersonAlias} + */ + this["TPIPA"] = (new TPIndirectPersonAlias()); + } + + Object.assign(this, $$source); + } + + /** + * Creates a new AliasGroup instance from a string or object. + * @param {any} [$$source = {}] + * @returns {AliasGroup} + */ + static createFrom($$source = {}) { + const $$createField1_0 = $$createType0; + const $$createField2_0 = $$createType2; + const $$createField3_0 = $$createType5; + const $$createField4_0 = $$createType6; + const $$createField5_0 = $$createType8; + const $$createField6_0 = $$createType8; + const $$createField7_0 = $$createType0; + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + if ("GAP" in $$parsedSource) { + $$parsedSource["GAP"] = $$createField1_0($$parsedSource["GAP"]); + } + if ("GPAs" in $$parsedSource) { + $$parsedSource["GPAs"] = $$createField2_0($$parsedSource["GPAs"]); + } + if ("GPAP" in $$parsedSource) { + $$parsedSource["GPAP"] = $$createField3_0($$parsedSource["GPAP"]); + } + if ("GMA" in $$parsedSource) { + $$parsedSource["GMA"] = $$createField4_0($$parsedSource["GMA"]); + } + if ("GPA" in $$parsedSource) { + $$parsedSource["GPA"] = $$createField5_0($$parsedSource["GPA"]); + } + if ("IPA" in $$parsedSource) { + $$parsedSource["IPA"] = $$createField6_0($$parsedSource["IPA"]); + } + if ("TPIPA" in $$parsedSource) { + $$parsedSource["TPIPA"] = $$createField7_0($$parsedSource["TPIPA"]); + } + return new AliasGroup(/** @type {Partial} */($$parsedSource)); + } +} + /** * A struct alias. * This should be rendered as a typedef or interface in every mode. @@ -51,6 +159,18 @@ export class EmptyStruct { } } +/** + * A generic alias that forwards to a type parameter. + * @template T + * @typedef {T} GenericAlias + */ + +/** + * A generic alias that wraps a map. + * @template T,U + * @typedef {{ [_: string]: U }} GenericMapAlias + */ + /** * A generic struct containing an alias. * @template T @@ -99,6 +219,33 @@ export class GenericPerson { } } +/** + * A generic alias that wraps a generic struct. + */ +export const GenericPersonAlias = GenericPerson; + +/** + * A generic alias that wraps a generic struct. + * @template T + * @typedef {GenericPerson[]>} GenericPersonAlias + */ + +/** + * A generic alias that wraps a pointer type. + * @template T + * @typedef {GenericAlias | null} GenericPtrAlias + */ + +/** + * An alias that wraps a class through a non-typeparam alias. + */ +export const IndirectPersonAlias = GenericPersonAlias; + +/** + * An alias that wraps a class through a non-typeparam alias. + * @typedef {GenericPersonAlias} IndirectPersonAlias + */ + /** * Another struct alias. * @typedef {Object} OtherAliasStruct @@ -164,3 +311,24 @@ export const StrangelyAliasedPerson = Person; * Another class alias, but ordered after its aliased class. * @typedef {Person} StrangelyAliasedPerson */ + +/** + * An alias that wraps a class through a typeparam alias. + */ +export const TPIndirectPersonAlias = GenericPerson; + +/** + * An alias that wraps a class through a typeparam alias. + * @typedef {GenericAlias>} TPIndirectPersonAlias + */ + +// Private type creation functions +const $$createType0 = GenericPerson.createFrom($Create.Any); +const $$createType1 = $Create.Array($Create.Any); +const $$createType2 = $Create.Nullable($$createType1); +const $$createType3 = $Create.Array($Create.Any); +const $$createType4 = GenericPerson.createFrom($$createType3); +const $$createType5 = $Create.Nullable($$createType4); +const $$createType6 = $Create.Map($Create.Any, $Create.Any); +const $$createType7 = $Create.Array($Create.Any); +const $$createType8 = GenericPerson.createFrom($$createType7); diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/index.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/index.js index 3c20ebc43..9fd9745c1 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/index.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/index.js @@ -13,6 +13,16 @@ export { import * as $models from "./models.js"; +/** + * @template S + * @typedef {$models.BasicCstrAlias} BasicCstrAlias + */ + +/** + * @template R + * @typedef {$models.ComparableCstrAlias} ComparableCstrAlias + */ + /** * @typedef {$models.EmbeddedCustomInterface} EmbeddedCustomInterface */ @@ -37,6 +47,31 @@ import * as $models from "./models.js"; * @typedef {$models.EmbeddedValuePtr} EmbeddedValuePtr */ +/** + * @template U + * @typedef {$models.GoodTildeCstrAlias} GoodTildeCstrAlias + */ + +/** + * @template Y + * @typedef {$models.InterfaceCstrAlias} InterfaceCstrAlias + */ + +/** + * @template X + * @typedef {$models.MixedCstrAlias} MixedCstrAlias + */ + +/** + * @template V + * @typedef {$models.NonBasicCstrAlias} NonBasicCstrAlias + */ + +/** + * @template W + * @typedef {$models.PointableCstrAlias} PointableCstrAlias + */ + /** * @typedef {$models.PointerAlias} PointerAlias */ diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/models.js index c715dd484..960844103 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/models.js @@ -6,6 +6,16 @@ // @ts-ignore: Unused imports import {Create as $Create} from "/wails/runtime.js"; +/** + * @template S + * @typedef {S} BasicCstrAlias + */ + +/** + * @template R + * @typedef {R} ComparableCstrAlias + */ + /** * @typedef {string} EmbeddedCustomInterface */ @@ -30,6 +40,16 @@ import {Create as $Create} from "/wails/runtime.js"; * @typedef {string} EmbeddedValuePtr */ +/** + * @template U + * @typedef {U} GoodTildeCstrAlias + */ + +/** + * @template Y + * @typedef {Y} InterfaceCstrAlias + */ + /** * @template R,S,T,U,V,W,X,Y,Z */ @@ -751,6 +771,454 @@ export class Maps { */ this["TPZPtr"] = {}; } + if (!("GAR" in $$source)) { + /** + * Soft reject + * @member + * @type {{ [_: string]: number }} + */ + this["GAR"] = {}; + } + if (!("GARPtr" in $$source)) { + /** + * Soft reject + * @member + * @type {{ [_: string]: number }} + */ + this["GARPtr"] = {}; + } + if (!("GAS" in $$source)) { + /** + * Accept, hide + * @member + * @type {{ [_: string]: number }} + */ + this["GAS"] = {}; + } + if (!("GASPtr" in $$source)) { + /** + * Soft reject + * @member + * @type {{ [_: string]: number }} + */ + this["GASPtr"] = {}; + } + if (!("GAT" in $$source)) { + /** + * Soft reject + * @member + * @type {{ [_: string]: number }} + */ + this["GAT"] = {}; + } + if (!("GATPtr" in $$source)) { + /** + * Soft reject + * @member + * @type {{ [_: string]: number }} + */ + this["GATPtr"] = {}; + } + if (!("GAU" in $$source)) { + /** + * Accept, hide + * @member + * @type {{ [_: string]: number }} + */ + this["GAU"] = {}; + } + if (!("GAUPtr" in $$source)) { + /** + * Soft reject + * @member + * @type {{ [_: string]: number }} + */ + this["GAUPtr"] = {}; + } + if (!("GAV" in $$source)) { + /** + * Accept, hide + * @member + * @type {{ [_: string]: number }} + */ + this["GAV"] = {}; + } + if (!("GAVPtr" in $$source)) { + /** + * Soft reject + * @member + * @type {{ [_: string]: number }} + */ + this["GAVPtr"] = {}; + } + if (!("GAW" in $$source)) { + /** + * Soft reject + * @member + * @type {{ [_: string]: number }} + */ + this["GAW"] = {}; + } + if (!("GAWPtr" in $$source)) { + /** + * Accept, hide + * @member + * @type {{ [_: string]: number }} + */ + this["GAWPtr"] = {}; + } + if (!("GAX" in $$source)) { + /** + * Accept, hide + * @member + * @type {{ [_: string]: number }} + */ + this["GAX"] = {}; + } + if (!("GAXPtr" in $$source)) { + /** + * Soft reject + * @member + * @type {{ [_: string]: number }} + */ + this["GAXPtr"] = {}; + } + if (!("GAY" in $$source)) { + /** + * Accept, hide + * @member + * @type {{ [_: string]: number }} + */ + this["GAY"] = {}; + } + if (!("GAYPtr" in $$source)) { + /** + * Soft reject + * @member + * @type {{ [_: string]: number }} + */ + this["GAYPtr"] = {}; + } + if (!("GAZ" in $$source)) { + /** + * Accept, hide + * @member + * @type {{ [_: string]: number }} + */ + this["GAZ"] = {}; + } + if (!("GAZPtr" in $$source)) { + /** + * Soft reject + * @member + * @type {{ [_: string]: number }} + */ + this["GAZPtr"] = {}; + } + if (!("GACi" in $$source)) { + /** + * Accept, hide + * @member + * @type {{ [_: `${number}`]: number }} + */ + this["GACi"] = {}; + } + if (!("GACV" in $$source)) { + /** + * Accept + * @member + * @type {{ [_: ComparableCstrAlias]: number }} + */ + this["GACV"] = {}; + } + if (!("GACP" in $$source)) { + /** + * Reject + * @member + * @type {{ [_: string]: number }} + */ + this["GACP"] = {}; + } + if (!("GACiPtr" in $$source)) { + /** + * Reject + * @member + * @type {{ [_: string]: number }} + */ + this["GACiPtr"] = {}; + } + if (!("GACVPtr" in $$source)) { + /** + * Accept, hide + * @member + * @type {{ [_: string]: number }} + */ + this["GACVPtr"] = {}; + } + if (!("GACPPtr" in $$source)) { + /** + * Accept, hide + * @member + * @type {{ [_: string]: number }} + */ + this["GACPPtr"] = {}; + } + if (!("GABi" in $$source)) { + /** + * Accept, hide + * @member + * @type {{ [_: `${number}`]: number }} + */ + this["GABi"] = {}; + } + if (!("GABs" in $$source)) { + /** + * Accept + * @member + * @type {{ [_: BasicCstrAlias]: number }} + */ + this["GABs"] = {}; + } + if (!("GABiPtr" in $$source)) { + /** + * Reject + * @member + * @type {{ [_: string]: number }} + */ + this["GABiPtr"] = {}; + } + if (!("GABT" in $$source)) { + /** + * Reject + * @member + * @type {{ [_: string]: number }} + */ + this["GABT"] = {}; + } + if (!("GABTPtr" in $$source)) { + /** + * Reject + * @member + * @type {{ [_: string]: number }} + */ + this["GABTPtr"] = {}; + } + if (!("GAGT" in $$source)) { + /** + * Accept + * @member + * @type {{ [_: GoodTildeCstrAlias]: number }} + */ + this["GAGT"] = {}; + } + if (!("GAGTPtr" in $$source)) { + /** + * Accept, hide + * @member + * @type {{ [_: string]: number }} + */ + this["GAGTPtr"] = {}; + } + if (!("GANBV" in $$source)) { + /** + * Accept + * @member + * @type {{ [_: NonBasicCstrAlias]: number }} + */ + this["GANBV"] = {}; + } + if (!("GANBP" in $$source)) { + /** + * Accept, hide + * @member + * @type {{ [_: string]: number }} + */ + this["GANBP"] = {}; + } + if (!("GANBVPtr" in $$source)) { + /** + * Accept, hide + * @member + * @type {{ [_: string]: number }} + */ + this["GANBVPtr"] = {}; + } + if (!("GANBPPtr" in $$source)) { + /** + * Reject + * @member + * @type {{ [_: string]: number }} + */ + this["GANBPPtr"] = {}; + } + if (!("GAPlV1" in $$source)) { + /** + * Accept + * @member + * @type {{ [_: PointableCstrAlias]: number }} + */ + this["GAPlV1"] = {}; + } + if (!("GAPlV2" in $$source)) { + /** + * Accept + * @member + * @type {{ [_: PointableCstrAlias]: number }} + */ + this["GAPlV2"] = {}; + } + if (!("GAPlP1" in $$source)) { + /** + * Reject + * @member + * @type {{ [_: string]: number }} + */ + this["GAPlP1"] = {}; + } + if (!("GAPlP2" in $$source)) { + /** + * Accept + * @member + * @type {{ [_: PointableCstrAlias]: number }} + */ + this["GAPlP2"] = {}; + } + if (!("GAPlVPtr" in $$source)) { + /** + * Accept, hide + * @member + * @type {{ [_: string]: number }} + */ + this["GAPlVPtr"] = {}; + } + if (!("GAPlPPtr" in $$source)) { + /** + * Accept, hide + * @member + * @type {{ [_: string]: number }} + */ + this["GAPlPPtr"] = {}; + } + if (!("GAMi" in $$source)) { + /** + * Accept, hide + * @member + * @type {{ [_: `${number}`]: number }} + */ + this["GAMi"] = {}; + } + if (!("GAMS" in $$source)) { + /** + * Accept + * @member + * @type {{ [_: MixedCstrAlias]: number }} + */ + this["GAMS"] = {}; + } + if (!("GAMV" in $$source)) { + /** + * Accept + * @member + * @type {{ [_: MixedCstrAlias]: number }} + */ + this["GAMV"] = {}; + } + if (!("GAMSPtr" in $$source)) { + /** + * Reject + * @member + * @type {{ [_: string]: number }} + */ + this["GAMSPtr"] = {}; + } + if (!("GAMVPtr" in $$source)) { + /** + * Accept, hide + * @member + * @type {{ [_: string]: number }} + */ + this["GAMVPtr"] = {}; + } + if (!("GAII" in $$source)) { + /** + * Accept, hide + * @member + * @type {{ [_: string]: number }} + */ + this["GAII"] = {}; + } + if (!("GAIV" in $$source)) { + /** + * Accept + * @member + * @type {{ [_: InterfaceCstrAlias]: number }} + */ + this["GAIV"] = {}; + } + if (!("GAIP" in $$source)) { + /** + * Accept, hide + * @member + * @type {{ [_: string]: number }} + */ + this["GAIP"] = {}; + } + if (!("GAIIPtr" in $$source)) { + /** + * Reject + * @member + * @type {{ [_: string]: number }} + */ + this["GAIIPtr"] = {}; + } + if (!("GAIVPtr" in $$source)) { + /** + * Accept, hide + * @member + * @type {{ [_: string]: number }} + */ + this["GAIVPtr"] = {}; + } + if (!("GAIPPtr" in $$source)) { + /** + * Reject + * @member + * @type {{ [_: string]: number }} + */ + this["GAIPPtr"] = {}; + } + if (!("GAPrV" in $$source)) { + /** + * Accept, hide + * @member + * @type {{ [_: string]: number }} + */ + this["GAPrV"] = {}; + } + if (!("GAPrP" in $$source)) { + /** + * Accept, hide + * @member + * @type {{ [_: string]: number }} + */ + this["GAPrP"] = {}; + } + if (!("GAPrVPtr" in $$source)) { + /** + * Reject + * @member + * @type {{ [_: string]: number }} + */ + this["GAPrVPtr"] = {}; + } + if (!("GAPrPPtr" in $$source)) { + /** + * Reject + * @member + * @type {{ [_: string]: number }} + */ + this["GAPrPPtr"] = {}; + } Object.assign(this, $$source); } @@ -861,6 +1329,62 @@ export class Maps { const $$createField86_0 = $$createType74($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); const $$createField87_0 = $$createType75($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); const $$createField88_0 = $$createType76($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField89_0 = $$createType59($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField90_0 = $$createType60($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField91_0 = $$createType61($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField92_0 = $$createType62($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField93_0 = $$createType63($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField94_0 = $$createType64($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField95_0 = $$createType65($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField96_0 = $$createType66($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField97_0 = $$createType67($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField98_0 = $$createType68($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField99_0 = $$createType69($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField100_0 = $$createType70($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField101_0 = $$createType71($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField102_0 = $$createType72($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField103_0 = $$createType73($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField104_0 = $$createType74($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField105_0 = $$createType75($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField106_0 = $$createType76($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField107_0 = $$createType1; + const $$createField108_0 = $$createType15; + const $$createField109_0 = $$createType17; + const $$createField110_0 = $$createType8; + const $$createField111_0 = $$createType16; + const $$createField112_0 = $$createType18; + const $$createField113_0 = $$createType1; + const $$createField114_0 = $$createType7; + const $$createField115_0 = $$createType8; + const $$createField116_0 = $$createType77; + const $$createField117_0 = $$createType78; + const $$createField118_0 = $$createType15; + const $$createField119_0 = $$createType16; + const $$createField120_0 = $$createType15; + const $$createField121_0 = $$createType18; + const $$createField122_0 = $$createType16; + const $$createField123_0 = $$createType53; + const $$createField124_0 = $$createType15; + const $$createField125_0 = $$createType16; + const $$createField126_0 = $$createType17; + const $$createField127_0 = $$createType18; + const $$createField128_0 = $$createType16; + const $$createField129_0 = $$createType18; + const $$createField130_0 = $$createType2; + const $$createField131_0 = $$createType42; + const $$createField132_0 = $$createType15; + const $$createField133_0 = $$createType79; + const $$createField134_0 = $$createType16; + const $$createField135_0 = $$createType23; + const $$createField136_0 = $$createType15; + const $$createField137_0 = $$createType18; + const $$createField138_0 = $$createType24; + const $$createField139_0 = $$createType16; + const $$createField140_0 = $$createType53; + const $$createField141_0 = $$createType16; + const $$createField142_0 = $$createType18; + const $$createField143_0 = $$createType48; + const $$createField144_0 = $$createType53; return ($$source = {}) => { let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; if ("Bool" in $$parsedSource) { @@ -1130,11 +1654,194 @@ export class Maps { if ("TPZPtr" in $$parsedSource) { $$parsedSource["TPZPtr"] = $$createField88_0($$parsedSource["TPZPtr"]); } + if ("GAR" in $$parsedSource) { + $$parsedSource["GAR"] = $$createField89_0($$parsedSource["GAR"]); + } + if ("GARPtr" in $$parsedSource) { + $$parsedSource["GARPtr"] = $$createField90_0($$parsedSource["GARPtr"]); + } + if ("GAS" in $$parsedSource) { + $$parsedSource["GAS"] = $$createField91_0($$parsedSource["GAS"]); + } + if ("GASPtr" in $$parsedSource) { + $$parsedSource["GASPtr"] = $$createField92_0($$parsedSource["GASPtr"]); + } + if ("GAT" in $$parsedSource) { + $$parsedSource["GAT"] = $$createField93_0($$parsedSource["GAT"]); + } + if ("GATPtr" in $$parsedSource) { + $$parsedSource["GATPtr"] = $$createField94_0($$parsedSource["GATPtr"]); + } + if ("GAU" in $$parsedSource) { + $$parsedSource["GAU"] = $$createField95_0($$parsedSource["GAU"]); + } + if ("GAUPtr" in $$parsedSource) { + $$parsedSource["GAUPtr"] = $$createField96_0($$parsedSource["GAUPtr"]); + } + if ("GAV" in $$parsedSource) { + $$parsedSource["GAV"] = $$createField97_0($$parsedSource["GAV"]); + } + if ("GAVPtr" in $$parsedSource) { + $$parsedSource["GAVPtr"] = $$createField98_0($$parsedSource["GAVPtr"]); + } + if ("GAW" in $$parsedSource) { + $$parsedSource["GAW"] = $$createField99_0($$parsedSource["GAW"]); + } + if ("GAWPtr" in $$parsedSource) { + $$parsedSource["GAWPtr"] = $$createField100_0($$parsedSource["GAWPtr"]); + } + if ("GAX" in $$parsedSource) { + $$parsedSource["GAX"] = $$createField101_0($$parsedSource["GAX"]); + } + if ("GAXPtr" in $$parsedSource) { + $$parsedSource["GAXPtr"] = $$createField102_0($$parsedSource["GAXPtr"]); + } + if ("GAY" in $$parsedSource) { + $$parsedSource["GAY"] = $$createField103_0($$parsedSource["GAY"]); + } + if ("GAYPtr" in $$parsedSource) { + $$parsedSource["GAYPtr"] = $$createField104_0($$parsedSource["GAYPtr"]); + } + if ("GAZ" in $$parsedSource) { + $$parsedSource["GAZ"] = $$createField105_0($$parsedSource["GAZ"]); + } + if ("GAZPtr" in $$parsedSource) { + $$parsedSource["GAZPtr"] = $$createField106_0($$parsedSource["GAZPtr"]); + } + if ("GACi" in $$parsedSource) { + $$parsedSource["GACi"] = $$createField107_0($$parsedSource["GACi"]); + } + if ("GACV" in $$parsedSource) { + $$parsedSource["GACV"] = $$createField108_0($$parsedSource["GACV"]); + } + if ("GACP" in $$parsedSource) { + $$parsedSource["GACP"] = $$createField109_0($$parsedSource["GACP"]); + } + if ("GACiPtr" in $$parsedSource) { + $$parsedSource["GACiPtr"] = $$createField110_0($$parsedSource["GACiPtr"]); + } + if ("GACVPtr" in $$parsedSource) { + $$parsedSource["GACVPtr"] = $$createField111_0($$parsedSource["GACVPtr"]); + } + if ("GACPPtr" in $$parsedSource) { + $$parsedSource["GACPPtr"] = $$createField112_0($$parsedSource["GACPPtr"]); + } + if ("GABi" in $$parsedSource) { + $$parsedSource["GABi"] = $$createField113_0($$parsedSource["GABi"]); + } + if ("GABs" in $$parsedSource) { + $$parsedSource["GABs"] = $$createField114_0($$parsedSource["GABs"]); + } + if ("GABiPtr" in $$parsedSource) { + $$parsedSource["GABiPtr"] = $$createField115_0($$parsedSource["GABiPtr"]); + } + if ("GABT" in $$parsedSource) { + $$parsedSource["GABT"] = $$createField116_0($$parsedSource["GABT"]); + } + if ("GABTPtr" in $$parsedSource) { + $$parsedSource["GABTPtr"] = $$createField117_0($$parsedSource["GABTPtr"]); + } + if ("GAGT" in $$parsedSource) { + $$parsedSource["GAGT"] = $$createField118_0($$parsedSource["GAGT"]); + } + if ("GAGTPtr" in $$parsedSource) { + $$parsedSource["GAGTPtr"] = $$createField119_0($$parsedSource["GAGTPtr"]); + } + if ("GANBV" in $$parsedSource) { + $$parsedSource["GANBV"] = $$createField120_0($$parsedSource["GANBV"]); + } + if ("GANBP" in $$parsedSource) { + $$parsedSource["GANBP"] = $$createField121_0($$parsedSource["GANBP"]); + } + if ("GANBVPtr" in $$parsedSource) { + $$parsedSource["GANBVPtr"] = $$createField122_0($$parsedSource["GANBVPtr"]); + } + if ("GANBPPtr" in $$parsedSource) { + $$parsedSource["GANBPPtr"] = $$createField123_0($$parsedSource["GANBPPtr"]); + } + if ("GAPlV1" in $$parsedSource) { + $$parsedSource["GAPlV1"] = $$createField124_0($$parsedSource["GAPlV1"]); + } + if ("GAPlV2" in $$parsedSource) { + $$parsedSource["GAPlV2"] = $$createField125_0($$parsedSource["GAPlV2"]); + } + if ("GAPlP1" in $$parsedSource) { + $$parsedSource["GAPlP1"] = $$createField126_0($$parsedSource["GAPlP1"]); + } + if ("GAPlP2" in $$parsedSource) { + $$parsedSource["GAPlP2"] = $$createField127_0($$parsedSource["GAPlP2"]); + } + if ("GAPlVPtr" in $$parsedSource) { + $$parsedSource["GAPlVPtr"] = $$createField128_0($$parsedSource["GAPlVPtr"]); + } + if ("GAPlPPtr" in $$parsedSource) { + $$parsedSource["GAPlPPtr"] = $$createField129_0($$parsedSource["GAPlPPtr"]); + } + if ("GAMi" in $$parsedSource) { + $$parsedSource["GAMi"] = $$createField130_0($$parsedSource["GAMi"]); + } + if ("GAMS" in $$parsedSource) { + $$parsedSource["GAMS"] = $$createField131_0($$parsedSource["GAMS"]); + } + if ("GAMV" in $$parsedSource) { + $$parsedSource["GAMV"] = $$createField132_0($$parsedSource["GAMV"]); + } + if ("GAMSPtr" in $$parsedSource) { + $$parsedSource["GAMSPtr"] = $$createField133_0($$parsedSource["GAMSPtr"]); + } + if ("GAMVPtr" in $$parsedSource) { + $$parsedSource["GAMVPtr"] = $$createField134_0($$parsedSource["GAMVPtr"]); + } + if ("GAII" in $$parsedSource) { + $$parsedSource["GAII"] = $$createField135_0($$parsedSource["GAII"]); + } + if ("GAIV" in $$parsedSource) { + $$parsedSource["GAIV"] = $$createField136_0($$parsedSource["GAIV"]); + } + if ("GAIP" in $$parsedSource) { + $$parsedSource["GAIP"] = $$createField137_0($$parsedSource["GAIP"]); + } + if ("GAIIPtr" in $$parsedSource) { + $$parsedSource["GAIIPtr"] = $$createField138_0($$parsedSource["GAIIPtr"]); + } + if ("GAIVPtr" in $$parsedSource) { + $$parsedSource["GAIVPtr"] = $$createField139_0($$parsedSource["GAIVPtr"]); + } + if ("GAIPPtr" in $$parsedSource) { + $$parsedSource["GAIPPtr"] = $$createField140_0($$parsedSource["GAIPPtr"]); + } + if ("GAPrV" in $$parsedSource) { + $$parsedSource["GAPrV"] = $$createField141_0($$parsedSource["GAPrV"]); + } + if ("GAPrP" in $$parsedSource) { + $$parsedSource["GAPrP"] = $$createField142_0($$parsedSource["GAPrP"]); + } + if ("GAPrVPtr" in $$parsedSource) { + $$parsedSource["GAPrVPtr"] = $$createField143_0($$parsedSource["GAPrVPtr"]); + } + if ("GAPrPPtr" in $$parsedSource) { + $$parsedSource["GAPrPPtr"] = $$createField144_0($$parsedSource["GAPrPPtr"]); + } return new Maps(/** @type {Partial>} */($$parsedSource)); }; } } +/** + * @template X + * @typedef {X} MixedCstrAlias + */ + +/** + * @template V + * @typedef {V} NonBasicCstrAlias + */ + +/** + * @template W + * @typedef {W} PointableCstrAlias + */ + /** * @typedef {PointerTextMarshaler} PointerAlias */ @@ -1237,3 +1944,6 @@ const $$createType73 = ($$createParamR, $$createParamS, $$createParamT, $$create const $$createType74 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); const $$createType75 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); const $$createType76 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); +const $$createType77 = $Create.Map($Create.Any, $Create.Any); +const $$createType78 = $Create.Map($Create.Any, $Create.Any); +const $$createType79 = $Create.Map($Create.Any, $Create.Any); diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/warnings.log b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/warnings.log index dbefd8749..e802b6b63 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/warnings.log +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/warnings.log @@ -33,11 +33,34 @@ package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type bool is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type complex64 is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type float32 is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.BadTildeCstrAlias[T] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.BadTildeCstrAlias[struct{}] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.BadTildeCstrPtrAlias[T] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.BadTildeCstrPtrAlias[struct{}] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.BasicCstrPtrAlias[S] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.BasicCstrPtrAlias[int] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.ComparableCstrAlias[R] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.ComparableCstrAlias[github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerTextMarshaler] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.ComparableCstrPtrAlias[R] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.ComparableCstrPtrAlias[int] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.EmbeddedPointer is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.GoodTildeCstrPtrAlias[U] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.InterfaceCstrPtrAlias[*github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerTextMarshaler] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.InterfaceCstrPtrAlias[Y] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.InterfaceCstrPtrAlias[encoding.TextMarshaler] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.InterfacePtrAlias is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.InterfacePtrType is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.MixedCstrPtrAlias[X] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.MixedCstrPtrAlias[github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.StringType] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.NonBasicCstrPtrAlias[*github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerTextMarshaler] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.NonBasicCstrPtrAlias[V] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.NonTextMarshaler is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointableCstrAlias[W] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointableCstrAlias[github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerTextMarshaler] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerAlias is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerCstrPtrAlias[R, Z] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerCstrPtrAlias[github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerTextMarshaler, *github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerTextMarshaler] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerCstrPtrAlias[github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.ValueTextMarshaler, *github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.ValueTextMarshaler] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerPtrType is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerTextMarshaler is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerType is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.js index 41565b11b..05944bc02 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.js @@ -72,6 +72,18 @@ export function GetButForeignPrivateAlias() { return $typingPromise; } +/** + * @returns {Promise<$models.AliasGroup> & { cancel(): void }} + */ +export function GetButGenericAliases() { + let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.GetButGenericAliases")); + let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $$createType3($result); + })); + $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); + return $typingPromise; +} + /** * Greet a lot of unusual things. * @param {$models.EmptyAliasStruct} $0 @@ -81,7 +93,7 @@ export function GetButForeignPrivateAlias() { export function Greet($0, $1) { let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Greet", $0, $1)); let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { - return $$createType6($result); + return $$createType7($result); })); $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); return $typingPromise; @@ -91,12 +103,13 @@ export function Greet($0, $1) { const $$createType0 = $models.Person.createFrom; const $$createType1 = $models.GenericPerson.createFrom($Create.Any); const $$createType2 = nobindingshere$0.personImpl.createFrom; -const $$createType3 = $Create.Array($Create.Any); +const $$createType3 = $models.AliasGroup.createFrom; const $$createType4 = $Create.Array($Create.Any); -const $$createType5 = $Create.Struct({ - "NoMoreIdeas": $$createType4, -}); +const $$createType5 = $Create.Array($Create.Any); const $$createType6 = $Create.Struct({ - "Foo": $$createType3, - "Other": $$createType5, + "NoMoreIdeas": $$createType5, +}); +const $$createType7 = $Create.Struct({ + "Foo": $$createType4, + "Other": $$createType6, }); diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/index.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/index.js index 10aa9e917..4278c7958 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/index.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/index.js @@ -8,11 +8,15 @@ export { }; export { + AliasGroup, AliasedPerson, EmptyStruct, GenericPerson, + GenericPersonAlias, + IndirectPersonAlias, Person, - StrangelyAliasedPerson + StrangelyAliasedPerson, + TPIndirectPersonAlias } from "./models.js"; import * as $models from "./models.js"; @@ -33,6 +37,24 @@ import * as $models from "./models.js"; * @typedef {$models.EmptyAliasStruct} EmptyAliasStruct */ +/** + * A generic alias that forwards to a type parameter. + * @template T + * @typedef {$models.GenericAlias} GenericAlias + */ + +/** + * A generic alias that wraps a map. + * @template T,U + * @typedef {$models.GenericMapAlias} GenericMapAlias + */ + +/** + * A generic alias that wraps a pointer type. + * @template T + * @typedef {$models.GenericPtrAlias} GenericPtrAlias + */ + /** * Another struct alias. * @typedef {$models.OtherAliasStruct} OtherAliasStruct diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/models.js index 5c69d0005..977ad4722 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/models.js @@ -11,6 +11,114 @@ import {Create as $Create} from "/wails/runtime.js"; * @typedef {number} Alias */ +/** + * A class whose fields have various aliased types. + */ +export class AliasGroup { + /** + * Creates a new AliasGroup instance. + * @param {Partial} [$$source = {}] - The source object to create the AliasGroup. + */ + constructor($$source = {}) { + if (!("GAi" in $$source)) { + /** + * @member + * @type {GenericAlias} + */ + this["GAi"] = 0; + } + if (!("GAP" in $$source)) { + /** + * @member + * @type {GenericAlias>} + */ + this["GAP"] = (new GenericPerson()); + } + if (!("GPAs" in $$source)) { + /** + * @member + * @type {GenericPtrAlias} + */ + this["GPAs"] = null; + } + if (!("GPAP" in $$source)) { + /** + * @member + * @type {GenericPtrAlias>} + */ + this["GPAP"] = null; + } + if (!("GMA" in $$source)) { + /** + * @member + * @type {GenericMapAlias} + */ + this["GMA"] = {}; + } + if (!("GPA" in $$source)) { + /** + * @member + * @type {GenericPersonAlias} + */ + this["GPA"] = (new GenericPersonAlias()); + } + if (!("IPA" in $$source)) { + /** + * @member + * @type {IndirectPersonAlias} + */ + this["IPA"] = (new IndirectPersonAlias()); + } + if (!("TPIPA" in $$source)) { + /** + * @member + * @type {TPIndirectPersonAlias} + */ + this["TPIPA"] = (new TPIndirectPersonAlias()); + } + + Object.assign(this, $$source); + } + + /** + * Creates a new AliasGroup instance from a string or object. + * @param {any} [$$source = {}] + * @returns {AliasGroup} + */ + static createFrom($$source = {}) { + const $$createField1_0 = $$createType0; + const $$createField2_0 = $$createType2; + const $$createField3_0 = $$createType5; + const $$createField4_0 = $$createType6; + const $$createField5_0 = $$createType8; + const $$createField6_0 = $$createType8; + const $$createField7_0 = $$createType0; + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + if ("GAP" in $$parsedSource) { + $$parsedSource["GAP"] = $$createField1_0($$parsedSource["GAP"]); + } + if ("GPAs" in $$parsedSource) { + $$parsedSource["GPAs"] = $$createField2_0($$parsedSource["GPAs"]); + } + if ("GPAP" in $$parsedSource) { + $$parsedSource["GPAP"] = $$createField3_0($$parsedSource["GPAP"]); + } + if ("GMA" in $$parsedSource) { + $$parsedSource["GMA"] = $$createField4_0($$parsedSource["GMA"]); + } + if ("GPA" in $$parsedSource) { + $$parsedSource["GPA"] = $$createField5_0($$parsedSource["GPA"]); + } + if ("IPA" in $$parsedSource) { + $$parsedSource["IPA"] = $$createField6_0($$parsedSource["IPA"]); + } + if ("TPIPA" in $$parsedSource) { + $$parsedSource["TPIPA"] = $$createField7_0($$parsedSource["TPIPA"]); + } + return new AliasGroup(/** @type {Partial} */($$parsedSource)); + } +} + /** * A struct alias. * This should be rendered as a typedef or interface in every mode. @@ -51,6 +159,18 @@ export class EmptyStruct { } } +/** + * A generic alias that forwards to a type parameter. + * @template T + * @typedef {T} GenericAlias + */ + +/** + * A generic alias that wraps a map. + * @template T,U + * @typedef {{ [_: string]: U }} GenericMapAlias + */ + /** * A generic struct containing an alias. * @template T @@ -99,6 +219,33 @@ export class GenericPerson { } } +/** + * A generic alias that wraps a generic struct. + */ +export const GenericPersonAlias = GenericPerson; + +/** + * A generic alias that wraps a generic struct. + * @template T + * @typedef {GenericPerson[]>} GenericPersonAlias + */ + +/** + * A generic alias that wraps a pointer type. + * @template T + * @typedef {GenericAlias | null} GenericPtrAlias + */ + +/** + * An alias that wraps a class through a non-typeparam alias. + */ +export const IndirectPersonAlias = GenericPersonAlias; + +/** + * An alias that wraps a class through a non-typeparam alias. + * @typedef {GenericPersonAlias} IndirectPersonAlias + */ + /** * Another struct alias. * @typedef {Object} OtherAliasStruct @@ -164,3 +311,24 @@ export const StrangelyAliasedPerson = Person; * Another class alias, but ordered after its aliased class. * @typedef {Person} StrangelyAliasedPerson */ + +/** + * An alias that wraps a class through a typeparam alias. + */ +export const TPIndirectPersonAlias = GenericPerson; + +/** + * An alias that wraps a class through a typeparam alias. + * @typedef {GenericAlias>} TPIndirectPersonAlias + */ + +// Private type creation functions +const $$createType0 = GenericPerson.createFrom($Create.Any); +const $$createType1 = $Create.Array($Create.Any); +const $$createType2 = $Create.Nullable($$createType1); +const $$createType3 = $Create.Array($Create.Any); +const $$createType4 = GenericPerson.createFrom($$createType3); +const $$createType5 = $Create.Nullable($$createType4); +const $$createType6 = $Create.Map($Create.Any, $Create.Any); +const $$createType7 = $Create.Array($Create.Any); +const $$createType8 = GenericPerson.createFrom($$createType7); diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/index.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/index.js index 3c20ebc43..9fd9745c1 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/index.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/index.js @@ -13,6 +13,16 @@ export { import * as $models from "./models.js"; +/** + * @template S + * @typedef {$models.BasicCstrAlias} BasicCstrAlias + */ + +/** + * @template R + * @typedef {$models.ComparableCstrAlias} ComparableCstrAlias + */ + /** * @typedef {$models.EmbeddedCustomInterface} EmbeddedCustomInterface */ @@ -37,6 +47,31 @@ import * as $models from "./models.js"; * @typedef {$models.EmbeddedValuePtr} EmbeddedValuePtr */ +/** + * @template U + * @typedef {$models.GoodTildeCstrAlias} GoodTildeCstrAlias + */ + +/** + * @template Y + * @typedef {$models.InterfaceCstrAlias} InterfaceCstrAlias + */ + +/** + * @template X + * @typedef {$models.MixedCstrAlias} MixedCstrAlias + */ + +/** + * @template V + * @typedef {$models.NonBasicCstrAlias} NonBasicCstrAlias + */ + +/** + * @template W + * @typedef {$models.PointableCstrAlias} PointableCstrAlias + */ + /** * @typedef {$models.PointerAlias} PointerAlias */ diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/models.js index c715dd484..960844103 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/models.js @@ -6,6 +6,16 @@ // @ts-ignore: Unused imports import {Create as $Create} from "/wails/runtime.js"; +/** + * @template S + * @typedef {S} BasicCstrAlias + */ + +/** + * @template R + * @typedef {R} ComparableCstrAlias + */ + /** * @typedef {string} EmbeddedCustomInterface */ @@ -30,6 +40,16 @@ import {Create as $Create} from "/wails/runtime.js"; * @typedef {string} EmbeddedValuePtr */ +/** + * @template U + * @typedef {U} GoodTildeCstrAlias + */ + +/** + * @template Y + * @typedef {Y} InterfaceCstrAlias + */ + /** * @template R,S,T,U,V,W,X,Y,Z */ @@ -751,6 +771,454 @@ export class Maps { */ this["TPZPtr"] = {}; } + if (!("GAR" in $$source)) { + /** + * Soft reject + * @member + * @type {{ [_: string]: number }} + */ + this["GAR"] = {}; + } + if (!("GARPtr" in $$source)) { + /** + * Soft reject + * @member + * @type {{ [_: string]: number }} + */ + this["GARPtr"] = {}; + } + if (!("GAS" in $$source)) { + /** + * Accept, hide + * @member + * @type {{ [_: string]: number }} + */ + this["GAS"] = {}; + } + if (!("GASPtr" in $$source)) { + /** + * Soft reject + * @member + * @type {{ [_: string]: number }} + */ + this["GASPtr"] = {}; + } + if (!("GAT" in $$source)) { + /** + * Soft reject + * @member + * @type {{ [_: string]: number }} + */ + this["GAT"] = {}; + } + if (!("GATPtr" in $$source)) { + /** + * Soft reject + * @member + * @type {{ [_: string]: number }} + */ + this["GATPtr"] = {}; + } + if (!("GAU" in $$source)) { + /** + * Accept, hide + * @member + * @type {{ [_: string]: number }} + */ + this["GAU"] = {}; + } + if (!("GAUPtr" in $$source)) { + /** + * Soft reject + * @member + * @type {{ [_: string]: number }} + */ + this["GAUPtr"] = {}; + } + if (!("GAV" in $$source)) { + /** + * Accept, hide + * @member + * @type {{ [_: string]: number }} + */ + this["GAV"] = {}; + } + if (!("GAVPtr" in $$source)) { + /** + * Soft reject + * @member + * @type {{ [_: string]: number }} + */ + this["GAVPtr"] = {}; + } + if (!("GAW" in $$source)) { + /** + * Soft reject + * @member + * @type {{ [_: string]: number }} + */ + this["GAW"] = {}; + } + if (!("GAWPtr" in $$source)) { + /** + * Accept, hide + * @member + * @type {{ [_: string]: number }} + */ + this["GAWPtr"] = {}; + } + if (!("GAX" in $$source)) { + /** + * Accept, hide + * @member + * @type {{ [_: string]: number }} + */ + this["GAX"] = {}; + } + if (!("GAXPtr" in $$source)) { + /** + * Soft reject + * @member + * @type {{ [_: string]: number }} + */ + this["GAXPtr"] = {}; + } + if (!("GAY" in $$source)) { + /** + * Accept, hide + * @member + * @type {{ [_: string]: number }} + */ + this["GAY"] = {}; + } + if (!("GAYPtr" in $$source)) { + /** + * Soft reject + * @member + * @type {{ [_: string]: number }} + */ + this["GAYPtr"] = {}; + } + if (!("GAZ" in $$source)) { + /** + * Accept, hide + * @member + * @type {{ [_: string]: number }} + */ + this["GAZ"] = {}; + } + if (!("GAZPtr" in $$source)) { + /** + * Soft reject + * @member + * @type {{ [_: string]: number }} + */ + this["GAZPtr"] = {}; + } + if (!("GACi" in $$source)) { + /** + * Accept, hide + * @member + * @type {{ [_: `${number}`]: number }} + */ + this["GACi"] = {}; + } + if (!("GACV" in $$source)) { + /** + * Accept + * @member + * @type {{ [_: ComparableCstrAlias]: number }} + */ + this["GACV"] = {}; + } + if (!("GACP" in $$source)) { + /** + * Reject + * @member + * @type {{ [_: string]: number }} + */ + this["GACP"] = {}; + } + if (!("GACiPtr" in $$source)) { + /** + * Reject + * @member + * @type {{ [_: string]: number }} + */ + this["GACiPtr"] = {}; + } + if (!("GACVPtr" in $$source)) { + /** + * Accept, hide + * @member + * @type {{ [_: string]: number }} + */ + this["GACVPtr"] = {}; + } + if (!("GACPPtr" in $$source)) { + /** + * Accept, hide + * @member + * @type {{ [_: string]: number }} + */ + this["GACPPtr"] = {}; + } + if (!("GABi" in $$source)) { + /** + * Accept, hide + * @member + * @type {{ [_: `${number}`]: number }} + */ + this["GABi"] = {}; + } + if (!("GABs" in $$source)) { + /** + * Accept + * @member + * @type {{ [_: BasicCstrAlias]: number }} + */ + this["GABs"] = {}; + } + if (!("GABiPtr" in $$source)) { + /** + * Reject + * @member + * @type {{ [_: string]: number }} + */ + this["GABiPtr"] = {}; + } + if (!("GABT" in $$source)) { + /** + * Reject + * @member + * @type {{ [_: string]: number }} + */ + this["GABT"] = {}; + } + if (!("GABTPtr" in $$source)) { + /** + * Reject + * @member + * @type {{ [_: string]: number }} + */ + this["GABTPtr"] = {}; + } + if (!("GAGT" in $$source)) { + /** + * Accept + * @member + * @type {{ [_: GoodTildeCstrAlias]: number }} + */ + this["GAGT"] = {}; + } + if (!("GAGTPtr" in $$source)) { + /** + * Accept, hide + * @member + * @type {{ [_: string]: number }} + */ + this["GAGTPtr"] = {}; + } + if (!("GANBV" in $$source)) { + /** + * Accept + * @member + * @type {{ [_: NonBasicCstrAlias]: number }} + */ + this["GANBV"] = {}; + } + if (!("GANBP" in $$source)) { + /** + * Accept, hide + * @member + * @type {{ [_: string]: number }} + */ + this["GANBP"] = {}; + } + if (!("GANBVPtr" in $$source)) { + /** + * Accept, hide + * @member + * @type {{ [_: string]: number }} + */ + this["GANBVPtr"] = {}; + } + if (!("GANBPPtr" in $$source)) { + /** + * Reject + * @member + * @type {{ [_: string]: number }} + */ + this["GANBPPtr"] = {}; + } + if (!("GAPlV1" in $$source)) { + /** + * Accept + * @member + * @type {{ [_: PointableCstrAlias]: number }} + */ + this["GAPlV1"] = {}; + } + if (!("GAPlV2" in $$source)) { + /** + * Accept + * @member + * @type {{ [_: PointableCstrAlias]: number }} + */ + this["GAPlV2"] = {}; + } + if (!("GAPlP1" in $$source)) { + /** + * Reject + * @member + * @type {{ [_: string]: number }} + */ + this["GAPlP1"] = {}; + } + if (!("GAPlP2" in $$source)) { + /** + * Accept + * @member + * @type {{ [_: PointableCstrAlias]: number }} + */ + this["GAPlP2"] = {}; + } + if (!("GAPlVPtr" in $$source)) { + /** + * Accept, hide + * @member + * @type {{ [_: string]: number }} + */ + this["GAPlVPtr"] = {}; + } + if (!("GAPlPPtr" in $$source)) { + /** + * Accept, hide + * @member + * @type {{ [_: string]: number }} + */ + this["GAPlPPtr"] = {}; + } + if (!("GAMi" in $$source)) { + /** + * Accept, hide + * @member + * @type {{ [_: `${number}`]: number }} + */ + this["GAMi"] = {}; + } + if (!("GAMS" in $$source)) { + /** + * Accept + * @member + * @type {{ [_: MixedCstrAlias]: number }} + */ + this["GAMS"] = {}; + } + if (!("GAMV" in $$source)) { + /** + * Accept + * @member + * @type {{ [_: MixedCstrAlias]: number }} + */ + this["GAMV"] = {}; + } + if (!("GAMSPtr" in $$source)) { + /** + * Reject + * @member + * @type {{ [_: string]: number }} + */ + this["GAMSPtr"] = {}; + } + if (!("GAMVPtr" in $$source)) { + /** + * Accept, hide + * @member + * @type {{ [_: string]: number }} + */ + this["GAMVPtr"] = {}; + } + if (!("GAII" in $$source)) { + /** + * Accept, hide + * @member + * @type {{ [_: string]: number }} + */ + this["GAII"] = {}; + } + if (!("GAIV" in $$source)) { + /** + * Accept + * @member + * @type {{ [_: InterfaceCstrAlias]: number }} + */ + this["GAIV"] = {}; + } + if (!("GAIP" in $$source)) { + /** + * Accept, hide + * @member + * @type {{ [_: string]: number }} + */ + this["GAIP"] = {}; + } + if (!("GAIIPtr" in $$source)) { + /** + * Reject + * @member + * @type {{ [_: string]: number }} + */ + this["GAIIPtr"] = {}; + } + if (!("GAIVPtr" in $$source)) { + /** + * Accept, hide + * @member + * @type {{ [_: string]: number }} + */ + this["GAIVPtr"] = {}; + } + if (!("GAIPPtr" in $$source)) { + /** + * Reject + * @member + * @type {{ [_: string]: number }} + */ + this["GAIPPtr"] = {}; + } + if (!("GAPrV" in $$source)) { + /** + * Accept, hide + * @member + * @type {{ [_: string]: number }} + */ + this["GAPrV"] = {}; + } + if (!("GAPrP" in $$source)) { + /** + * Accept, hide + * @member + * @type {{ [_: string]: number }} + */ + this["GAPrP"] = {}; + } + if (!("GAPrVPtr" in $$source)) { + /** + * Reject + * @member + * @type {{ [_: string]: number }} + */ + this["GAPrVPtr"] = {}; + } + if (!("GAPrPPtr" in $$source)) { + /** + * Reject + * @member + * @type {{ [_: string]: number }} + */ + this["GAPrPPtr"] = {}; + } Object.assign(this, $$source); } @@ -861,6 +1329,62 @@ export class Maps { const $$createField86_0 = $$createType74($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); const $$createField87_0 = $$createType75($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); const $$createField88_0 = $$createType76($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField89_0 = $$createType59($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField90_0 = $$createType60($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField91_0 = $$createType61($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField92_0 = $$createType62($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField93_0 = $$createType63($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField94_0 = $$createType64($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField95_0 = $$createType65($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField96_0 = $$createType66($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField97_0 = $$createType67($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField98_0 = $$createType68($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField99_0 = $$createType69($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField100_0 = $$createType70($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField101_0 = $$createType71($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField102_0 = $$createType72($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField103_0 = $$createType73($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField104_0 = $$createType74($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField105_0 = $$createType75($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField106_0 = $$createType76($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField107_0 = $$createType1; + const $$createField108_0 = $$createType15; + const $$createField109_0 = $$createType17; + const $$createField110_0 = $$createType8; + const $$createField111_0 = $$createType16; + const $$createField112_0 = $$createType18; + const $$createField113_0 = $$createType1; + const $$createField114_0 = $$createType7; + const $$createField115_0 = $$createType8; + const $$createField116_0 = $$createType77; + const $$createField117_0 = $$createType78; + const $$createField118_0 = $$createType15; + const $$createField119_0 = $$createType16; + const $$createField120_0 = $$createType15; + const $$createField121_0 = $$createType18; + const $$createField122_0 = $$createType16; + const $$createField123_0 = $$createType53; + const $$createField124_0 = $$createType15; + const $$createField125_0 = $$createType16; + const $$createField126_0 = $$createType17; + const $$createField127_0 = $$createType18; + const $$createField128_0 = $$createType16; + const $$createField129_0 = $$createType18; + const $$createField130_0 = $$createType2; + const $$createField131_0 = $$createType42; + const $$createField132_0 = $$createType15; + const $$createField133_0 = $$createType79; + const $$createField134_0 = $$createType16; + const $$createField135_0 = $$createType23; + const $$createField136_0 = $$createType15; + const $$createField137_0 = $$createType18; + const $$createField138_0 = $$createType24; + const $$createField139_0 = $$createType16; + const $$createField140_0 = $$createType53; + const $$createField141_0 = $$createType16; + const $$createField142_0 = $$createType18; + const $$createField143_0 = $$createType48; + const $$createField144_0 = $$createType53; return ($$source = {}) => { let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; if ("Bool" in $$parsedSource) { @@ -1130,11 +1654,194 @@ export class Maps { if ("TPZPtr" in $$parsedSource) { $$parsedSource["TPZPtr"] = $$createField88_0($$parsedSource["TPZPtr"]); } + if ("GAR" in $$parsedSource) { + $$parsedSource["GAR"] = $$createField89_0($$parsedSource["GAR"]); + } + if ("GARPtr" in $$parsedSource) { + $$parsedSource["GARPtr"] = $$createField90_0($$parsedSource["GARPtr"]); + } + if ("GAS" in $$parsedSource) { + $$parsedSource["GAS"] = $$createField91_0($$parsedSource["GAS"]); + } + if ("GASPtr" in $$parsedSource) { + $$parsedSource["GASPtr"] = $$createField92_0($$parsedSource["GASPtr"]); + } + if ("GAT" in $$parsedSource) { + $$parsedSource["GAT"] = $$createField93_0($$parsedSource["GAT"]); + } + if ("GATPtr" in $$parsedSource) { + $$parsedSource["GATPtr"] = $$createField94_0($$parsedSource["GATPtr"]); + } + if ("GAU" in $$parsedSource) { + $$parsedSource["GAU"] = $$createField95_0($$parsedSource["GAU"]); + } + if ("GAUPtr" in $$parsedSource) { + $$parsedSource["GAUPtr"] = $$createField96_0($$parsedSource["GAUPtr"]); + } + if ("GAV" in $$parsedSource) { + $$parsedSource["GAV"] = $$createField97_0($$parsedSource["GAV"]); + } + if ("GAVPtr" in $$parsedSource) { + $$parsedSource["GAVPtr"] = $$createField98_0($$parsedSource["GAVPtr"]); + } + if ("GAW" in $$parsedSource) { + $$parsedSource["GAW"] = $$createField99_0($$parsedSource["GAW"]); + } + if ("GAWPtr" in $$parsedSource) { + $$parsedSource["GAWPtr"] = $$createField100_0($$parsedSource["GAWPtr"]); + } + if ("GAX" in $$parsedSource) { + $$parsedSource["GAX"] = $$createField101_0($$parsedSource["GAX"]); + } + if ("GAXPtr" in $$parsedSource) { + $$parsedSource["GAXPtr"] = $$createField102_0($$parsedSource["GAXPtr"]); + } + if ("GAY" in $$parsedSource) { + $$parsedSource["GAY"] = $$createField103_0($$parsedSource["GAY"]); + } + if ("GAYPtr" in $$parsedSource) { + $$parsedSource["GAYPtr"] = $$createField104_0($$parsedSource["GAYPtr"]); + } + if ("GAZ" in $$parsedSource) { + $$parsedSource["GAZ"] = $$createField105_0($$parsedSource["GAZ"]); + } + if ("GAZPtr" in $$parsedSource) { + $$parsedSource["GAZPtr"] = $$createField106_0($$parsedSource["GAZPtr"]); + } + if ("GACi" in $$parsedSource) { + $$parsedSource["GACi"] = $$createField107_0($$parsedSource["GACi"]); + } + if ("GACV" in $$parsedSource) { + $$parsedSource["GACV"] = $$createField108_0($$parsedSource["GACV"]); + } + if ("GACP" in $$parsedSource) { + $$parsedSource["GACP"] = $$createField109_0($$parsedSource["GACP"]); + } + if ("GACiPtr" in $$parsedSource) { + $$parsedSource["GACiPtr"] = $$createField110_0($$parsedSource["GACiPtr"]); + } + if ("GACVPtr" in $$parsedSource) { + $$parsedSource["GACVPtr"] = $$createField111_0($$parsedSource["GACVPtr"]); + } + if ("GACPPtr" in $$parsedSource) { + $$parsedSource["GACPPtr"] = $$createField112_0($$parsedSource["GACPPtr"]); + } + if ("GABi" in $$parsedSource) { + $$parsedSource["GABi"] = $$createField113_0($$parsedSource["GABi"]); + } + if ("GABs" in $$parsedSource) { + $$parsedSource["GABs"] = $$createField114_0($$parsedSource["GABs"]); + } + if ("GABiPtr" in $$parsedSource) { + $$parsedSource["GABiPtr"] = $$createField115_0($$parsedSource["GABiPtr"]); + } + if ("GABT" in $$parsedSource) { + $$parsedSource["GABT"] = $$createField116_0($$parsedSource["GABT"]); + } + if ("GABTPtr" in $$parsedSource) { + $$parsedSource["GABTPtr"] = $$createField117_0($$parsedSource["GABTPtr"]); + } + if ("GAGT" in $$parsedSource) { + $$parsedSource["GAGT"] = $$createField118_0($$parsedSource["GAGT"]); + } + if ("GAGTPtr" in $$parsedSource) { + $$parsedSource["GAGTPtr"] = $$createField119_0($$parsedSource["GAGTPtr"]); + } + if ("GANBV" in $$parsedSource) { + $$parsedSource["GANBV"] = $$createField120_0($$parsedSource["GANBV"]); + } + if ("GANBP" in $$parsedSource) { + $$parsedSource["GANBP"] = $$createField121_0($$parsedSource["GANBP"]); + } + if ("GANBVPtr" in $$parsedSource) { + $$parsedSource["GANBVPtr"] = $$createField122_0($$parsedSource["GANBVPtr"]); + } + if ("GANBPPtr" in $$parsedSource) { + $$parsedSource["GANBPPtr"] = $$createField123_0($$parsedSource["GANBPPtr"]); + } + if ("GAPlV1" in $$parsedSource) { + $$parsedSource["GAPlV1"] = $$createField124_0($$parsedSource["GAPlV1"]); + } + if ("GAPlV2" in $$parsedSource) { + $$parsedSource["GAPlV2"] = $$createField125_0($$parsedSource["GAPlV2"]); + } + if ("GAPlP1" in $$parsedSource) { + $$parsedSource["GAPlP1"] = $$createField126_0($$parsedSource["GAPlP1"]); + } + if ("GAPlP2" in $$parsedSource) { + $$parsedSource["GAPlP2"] = $$createField127_0($$parsedSource["GAPlP2"]); + } + if ("GAPlVPtr" in $$parsedSource) { + $$parsedSource["GAPlVPtr"] = $$createField128_0($$parsedSource["GAPlVPtr"]); + } + if ("GAPlPPtr" in $$parsedSource) { + $$parsedSource["GAPlPPtr"] = $$createField129_0($$parsedSource["GAPlPPtr"]); + } + if ("GAMi" in $$parsedSource) { + $$parsedSource["GAMi"] = $$createField130_0($$parsedSource["GAMi"]); + } + if ("GAMS" in $$parsedSource) { + $$parsedSource["GAMS"] = $$createField131_0($$parsedSource["GAMS"]); + } + if ("GAMV" in $$parsedSource) { + $$parsedSource["GAMV"] = $$createField132_0($$parsedSource["GAMV"]); + } + if ("GAMSPtr" in $$parsedSource) { + $$parsedSource["GAMSPtr"] = $$createField133_0($$parsedSource["GAMSPtr"]); + } + if ("GAMVPtr" in $$parsedSource) { + $$parsedSource["GAMVPtr"] = $$createField134_0($$parsedSource["GAMVPtr"]); + } + if ("GAII" in $$parsedSource) { + $$parsedSource["GAII"] = $$createField135_0($$parsedSource["GAII"]); + } + if ("GAIV" in $$parsedSource) { + $$parsedSource["GAIV"] = $$createField136_0($$parsedSource["GAIV"]); + } + if ("GAIP" in $$parsedSource) { + $$parsedSource["GAIP"] = $$createField137_0($$parsedSource["GAIP"]); + } + if ("GAIIPtr" in $$parsedSource) { + $$parsedSource["GAIIPtr"] = $$createField138_0($$parsedSource["GAIIPtr"]); + } + if ("GAIVPtr" in $$parsedSource) { + $$parsedSource["GAIVPtr"] = $$createField139_0($$parsedSource["GAIVPtr"]); + } + if ("GAIPPtr" in $$parsedSource) { + $$parsedSource["GAIPPtr"] = $$createField140_0($$parsedSource["GAIPPtr"]); + } + if ("GAPrV" in $$parsedSource) { + $$parsedSource["GAPrV"] = $$createField141_0($$parsedSource["GAPrV"]); + } + if ("GAPrP" in $$parsedSource) { + $$parsedSource["GAPrP"] = $$createField142_0($$parsedSource["GAPrP"]); + } + if ("GAPrVPtr" in $$parsedSource) { + $$parsedSource["GAPrVPtr"] = $$createField143_0($$parsedSource["GAPrVPtr"]); + } + if ("GAPrPPtr" in $$parsedSource) { + $$parsedSource["GAPrPPtr"] = $$createField144_0($$parsedSource["GAPrPPtr"]); + } return new Maps(/** @type {Partial>} */($$parsedSource)); }; } } +/** + * @template X + * @typedef {X} MixedCstrAlias + */ + +/** + * @template V + * @typedef {V} NonBasicCstrAlias + */ + +/** + * @template W + * @typedef {W} PointableCstrAlias + */ + /** * @typedef {PointerTextMarshaler} PointerAlias */ @@ -1237,3 +1944,6 @@ const $$createType73 = ($$createParamR, $$createParamS, $$createParamT, $$create const $$createType74 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); const $$createType75 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); const $$createType76 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); +const $$createType77 = $Create.Map($Create.Any, $Create.Any); +const $$createType78 = $Create.Map($Create.Any, $Create.Any); +const $$createType79 = $Create.Map($Create.Any, $Create.Any); diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/warnings.log b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/warnings.log index dbefd8749..e802b6b63 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/warnings.log +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/warnings.log @@ -33,11 +33,34 @@ package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type bool is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type complex64 is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type float32 is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.BadTildeCstrAlias[T] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.BadTildeCstrAlias[struct{}] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.BadTildeCstrPtrAlias[T] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.BadTildeCstrPtrAlias[struct{}] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.BasicCstrPtrAlias[S] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.BasicCstrPtrAlias[int] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.ComparableCstrAlias[R] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.ComparableCstrAlias[github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerTextMarshaler] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.ComparableCstrPtrAlias[R] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.ComparableCstrPtrAlias[int] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.EmbeddedPointer is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.GoodTildeCstrPtrAlias[U] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.InterfaceCstrPtrAlias[*github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerTextMarshaler] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.InterfaceCstrPtrAlias[Y] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.InterfaceCstrPtrAlias[encoding.TextMarshaler] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.InterfacePtrAlias is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.InterfacePtrType is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.MixedCstrPtrAlias[X] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.MixedCstrPtrAlias[github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.StringType] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.NonBasicCstrPtrAlias[*github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerTextMarshaler] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.NonBasicCstrPtrAlias[V] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.NonTextMarshaler is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointableCstrAlias[W] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointableCstrAlias[github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerTextMarshaler] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerAlias is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerCstrPtrAlias[R, Z] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerCstrPtrAlias[github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerTextMarshaler, *github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerTextMarshaler] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerCstrPtrAlias[github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.ValueTextMarshaler, *github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.ValueTextMarshaler] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerPtrType is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerTextMarshaler is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerType is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.js index bb83e6cd3..ef8919860 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.js @@ -56,6 +56,14 @@ export function GetButForeignPrivateAlias() { return $resultPromise; } +/** + * @returns {Promise<$models.AliasGroup> & { cancel(): void }} + */ +export function GetButGenericAliases() { + let $resultPromise = /** @type {any} */($Call.ByID(914093800)); + return $resultPromise; +} + /** * Greet a lot of unusual things. * @param {$models.EmptyAliasStruct} $0 diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/index.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/index.js index 25e37feb0..5a5c62644 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/index.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/index.js @@ -14,6 +14,11 @@ import * as $models from "./models.js"; * @typedef {$models.Alias} Alias */ +/** + * A class whose fields have various aliased types. + * @typedef {$models.AliasGroup} AliasGroup + */ + /** * A struct alias. * This should be rendered as a typedef or interface in every mode. @@ -35,12 +40,41 @@ import * as $models from "./models.js"; * @typedef {$models.EmptyStruct} EmptyStruct */ +/** + * A generic alias that forwards to a type parameter. + * @template T + * @typedef {$models.GenericAlias} GenericAlias + */ + +/** + * A generic alias that wraps a map. + * @template T,U + * @typedef {$models.GenericMapAlias} GenericMapAlias + */ + /** * A generic struct containing an alias. * @template T * @typedef {$models.GenericPerson} GenericPerson */ +/** + * A generic alias that wraps a generic struct. + * @template T + * @typedef {$models.GenericPersonAlias} GenericPersonAlias + */ + +/** + * A generic alias that wraps a pointer type. + * @template T + * @typedef {$models.GenericPtrAlias} GenericPtrAlias + */ + +/** + * An alias that wraps a class through a non-typeparam alias. + * @typedef {$models.IndirectPersonAlias} IndirectPersonAlias + */ + /** * Another struct alias. * @typedef {$models.OtherAliasStruct} OtherAliasStruct @@ -55,3 +89,8 @@ import * as $models from "./models.js"; * Another class alias, but ordered after its aliased class. * @typedef {$models.StrangelyAliasedPerson} StrangelyAliasedPerson */ + +/** + * An alias that wraps a class through a typeparam alias. + * @typedef {$models.TPIndirectPersonAlias} TPIndirectPersonAlias + */ diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/models.js index 4f343cb4a..1ba2af395 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/models.js @@ -7,6 +7,19 @@ * @typedef {number} Alias */ +/** + * A class whose fields have various aliased types. + * @typedef {Object} AliasGroup + * @property {GenericAlias} GAi + * @property {GenericAlias>} GAP + * @property {GenericPtrAlias} GPAs + * @property {GenericPtrAlias>} GPAP + * @property {GenericMapAlias} GMA + * @property {GenericPersonAlias} GPA + * @property {IndirectPersonAlias} IPA + * @property {TPIndirectPersonAlias} TPIPA + */ + /** * A struct alias. * This should be rendered as a typedef or interface in every mode. @@ -34,6 +47,18 @@ * } } EmptyStruct */ +/** + * A generic alias that forwards to a type parameter. + * @template T + * @typedef {T} GenericAlias + */ + +/** + * A generic alias that wraps a map. + * @template T,U + * @typedef {{ [_: string]: U } | null} GenericMapAlias + */ + /** * A generic struct containing an alias. * @template T @@ -42,6 +67,23 @@ * @property {Alias} AliasedField */ +/** + * A generic alias that wraps a generic struct. + * @template T + * @typedef {GenericPerson[] | null>} GenericPersonAlias + */ + +/** + * A generic alias that wraps a pointer type. + * @template T + * @typedef {GenericAlias | null} GenericPtrAlias + */ + +/** + * An alias that wraps a class through a non-typeparam alias. + * @typedef {GenericPersonAlias} IndirectPersonAlias + */ + /** * Another struct alias. * @typedef {Object} OtherAliasStruct @@ -60,6 +102,11 @@ * @typedef {Person} StrangelyAliasedPerson */ +/** + * An alias that wraps a class through a typeparam alias. + * @typedef {GenericAlias>} TPIndirectPersonAlias + */ + // In interface mode, this file is likely to contain just comments. // We add a dummy export statement to ensure it is recognised as an ES module. export {}; diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/index.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/index.js index f9c0ff658..80fdcd24c 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/index.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/index.js @@ -9,6 +9,16 @@ export { import * as $models from "./models.js"; +/** + * @template S + * @typedef {$models.BasicCstrAlias} BasicCstrAlias + */ + +/** + * @template R + * @typedef {$models.ComparableCstrAlias} ComparableCstrAlias + */ + /** * @typedef {$models.EmbeddedCustomInterface} EmbeddedCustomInterface */ @@ -33,11 +43,36 @@ import * as $models from "./models.js"; * @typedef {$models.EmbeddedValuePtr} EmbeddedValuePtr */ +/** + * @template U + * @typedef {$models.GoodTildeCstrAlias} GoodTildeCstrAlias + */ + +/** + * @template Y + * @typedef {$models.InterfaceCstrAlias} InterfaceCstrAlias + */ + /** * @template R,S,T,U,V,W,X,Y,Z * @typedef {$models.Maps} Maps */ +/** + * @template X + * @typedef {$models.MixedCstrAlias} MixedCstrAlias + */ + +/** + * @template V + * @typedef {$models.NonBasicCstrAlias} NonBasicCstrAlias + */ + +/** + * @template W + * @typedef {$models.PointableCstrAlias} PointableCstrAlias + */ + /** * @typedef {$models.PointerAlias} PointerAlias */ diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/models.js index c9ea922a3..cee61a5e4 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/models.js @@ -2,6 +2,16 @@ // Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL // This file is automatically generated. DO NOT EDIT +/** + * @template S + * @typedef {S} BasicCstrAlias + */ + +/** + * @template R + * @typedef {R} ComparableCstrAlias + */ + /** * @typedef {string} EmbeddedCustomInterface */ @@ -26,6 +36,16 @@ * @typedef {string} EmbeddedValuePtr */ +/** + * @template U + * @typedef {U} GoodTildeCstrAlias + */ + +/** + * @template Y + * @typedef {Y} InterfaceCstrAlias + */ + /** * @template R,S,T,U,V,W,X,Y,Z * @typedef {Object} Maps @@ -118,6 +138,77 @@ * @property {{ [_: string]: number } | null} TPYPtr - Soft reject * @property {{ [_: string]: number } | null} TPZ - Accept, hide * @property {{ [_: string]: number } | null} TPZPtr - Soft reject + * @property {{ [_: string]: number } | null} GAR - Soft reject + * @property {{ [_: string]: number } | null} GARPtr - Soft reject + * @property {{ [_: string]: number } | null} GAS - Accept, hide + * @property {{ [_: string]: number } | null} GASPtr - Soft reject + * @property {{ [_: string]: number } | null} GAT - Soft reject + * @property {{ [_: string]: number } | null} GATPtr - Soft reject + * @property {{ [_: string]: number } | null} GAU - Accept, hide + * @property {{ [_: string]: number } | null} GAUPtr - Soft reject + * @property {{ [_: string]: number } | null} GAV - Accept, hide + * @property {{ [_: string]: number } | null} GAVPtr - Soft reject + * @property {{ [_: string]: number } | null} GAW - Soft reject + * @property {{ [_: string]: number } | null} GAWPtr - Accept, hide + * @property {{ [_: string]: number } | null} GAX - Accept, hide + * @property {{ [_: string]: number } | null} GAXPtr - Soft reject + * @property {{ [_: string]: number } | null} GAY - Accept, hide + * @property {{ [_: string]: number } | null} GAYPtr - Soft reject + * @property {{ [_: string]: number } | null} GAZ - Accept, hide + * @property {{ [_: string]: number } | null} GAZPtr - Soft reject + * @property {{ [_: `${number}`]: number } | null} GACi - Accept, hide + * @property {{ [_: ComparableCstrAlias]: number } | null} GACV - Accept + * @property {{ [_: string]: number } | null} GACP - Reject + * @property {{ [_: string]: number } | null} GACiPtr - Reject + * @property {{ [_: string]: number } | null} GACVPtr - Accept, hide + * @property {{ [_: string]: number } | null} GACPPtr - Accept, hide + * @property {{ [_: `${number}`]: number } | null} GABi - Accept, hide + * @property {{ [_: BasicCstrAlias]: number } | null} GABs - Accept + * @property {{ [_: string]: number } | null} GABiPtr - Reject + * @property {{ [_: string]: number } | null} GABT - Reject + * @property {{ [_: string]: number } | null} GABTPtr - Reject + * @property {{ [_: GoodTildeCstrAlias]: number } | null} GAGT - Accept + * @property {{ [_: string]: number } | null} GAGTPtr - Accept, hide + * @property {{ [_: NonBasicCstrAlias]: number } | null} GANBV - Accept + * @property {{ [_: string]: number } | null} GANBP - Accept, hide + * @property {{ [_: string]: number } | null} GANBVPtr - Accept, hide + * @property {{ [_: string]: number } | null} GANBPPtr - Reject + * @property {{ [_: PointableCstrAlias]: number } | null} GAPlV1 - Accept + * @property {{ [_: PointableCstrAlias]: number } | null} GAPlV2 - Accept + * @property {{ [_: string]: number } | null} GAPlP1 - Reject + * @property {{ [_: PointableCstrAlias]: number } | null} GAPlP2 - Accept + * @property {{ [_: string]: number } | null} GAPlVPtr - Accept, hide + * @property {{ [_: string]: number } | null} GAPlPPtr - Accept, hide + * @property {{ [_: `${number}`]: number } | null} GAMi - Accept, hide + * @property {{ [_: MixedCstrAlias]: number } | null} GAMS - Accept + * @property {{ [_: MixedCstrAlias]: number } | null} GAMV - Accept + * @property {{ [_: string]: number } | null} GAMSPtr - Reject + * @property {{ [_: string]: number } | null} GAMVPtr - Accept, hide + * @property {{ [_: string]: number } | null} GAII - Accept, hide + * @property {{ [_: InterfaceCstrAlias]: number } | null} GAIV - Accept + * @property {{ [_: string]: number } | null} GAIP - Accept, hide + * @property {{ [_: string]: number } | null} GAIIPtr - Reject + * @property {{ [_: string]: number } | null} GAIVPtr - Accept, hide + * @property {{ [_: string]: number } | null} GAIPPtr - Reject + * @property {{ [_: string]: number } | null} GAPrV - Accept, hide + * @property {{ [_: string]: number } | null} GAPrP - Accept, hide + * @property {{ [_: string]: number } | null} GAPrVPtr - Reject + * @property {{ [_: string]: number } | null} GAPrPPtr - Reject + */ + +/** + * @template X + * @typedef {X} MixedCstrAlias + */ + +/** + * @template V + * @typedef {V} NonBasicCstrAlias + */ + +/** + * @template W + * @typedef {W} PointableCstrAlias */ /** diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/warnings.log b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/warnings.log index dbefd8749..e802b6b63 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/warnings.log +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/warnings.log @@ -33,11 +33,34 @@ package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type bool is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type complex64 is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type float32 is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.BadTildeCstrAlias[T] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.BadTildeCstrAlias[struct{}] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.BadTildeCstrPtrAlias[T] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.BadTildeCstrPtrAlias[struct{}] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.BasicCstrPtrAlias[S] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.BasicCstrPtrAlias[int] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.ComparableCstrAlias[R] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.ComparableCstrAlias[github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerTextMarshaler] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.ComparableCstrPtrAlias[R] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.ComparableCstrPtrAlias[int] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.EmbeddedPointer is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.GoodTildeCstrPtrAlias[U] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.InterfaceCstrPtrAlias[*github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerTextMarshaler] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.InterfaceCstrPtrAlias[Y] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.InterfaceCstrPtrAlias[encoding.TextMarshaler] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.InterfacePtrAlias is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.InterfacePtrType is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.MixedCstrPtrAlias[X] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.MixedCstrPtrAlias[github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.StringType] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.NonBasicCstrPtrAlias[*github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerTextMarshaler] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.NonBasicCstrPtrAlias[V] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.NonTextMarshaler is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointableCstrAlias[W] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointableCstrAlias[github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerTextMarshaler] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerAlias is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerCstrPtrAlias[R, Z] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerCstrPtrAlias[github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerTextMarshaler, *github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerTextMarshaler] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerCstrPtrAlias[github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.ValueTextMarshaler, *github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.ValueTextMarshaler] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerPtrType is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerTextMarshaler is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerType is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.js index 791d85e39..b006e17a5 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.js @@ -56,6 +56,14 @@ export function GetButForeignPrivateAlias() { return $resultPromise; } +/** + * @returns {Promise<$models.AliasGroup> & { cancel(): void }} + */ +export function GetButGenericAliases() { + let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.GetButGenericAliases")); + return $resultPromise; +} + /** * Greet a lot of unusual things. * @param {$models.EmptyAliasStruct} $0 diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/index.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/index.js index 25e37feb0..5a5c62644 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/index.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/index.js @@ -14,6 +14,11 @@ import * as $models from "./models.js"; * @typedef {$models.Alias} Alias */ +/** + * A class whose fields have various aliased types. + * @typedef {$models.AliasGroup} AliasGroup + */ + /** * A struct alias. * This should be rendered as a typedef or interface in every mode. @@ -35,12 +40,41 @@ import * as $models from "./models.js"; * @typedef {$models.EmptyStruct} EmptyStruct */ +/** + * A generic alias that forwards to a type parameter. + * @template T + * @typedef {$models.GenericAlias} GenericAlias + */ + +/** + * A generic alias that wraps a map. + * @template T,U + * @typedef {$models.GenericMapAlias} GenericMapAlias + */ + /** * A generic struct containing an alias. * @template T * @typedef {$models.GenericPerson} GenericPerson */ +/** + * A generic alias that wraps a generic struct. + * @template T + * @typedef {$models.GenericPersonAlias} GenericPersonAlias + */ + +/** + * A generic alias that wraps a pointer type. + * @template T + * @typedef {$models.GenericPtrAlias} GenericPtrAlias + */ + +/** + * An alias that wraps a class through a non-typeparam alias. + * @typedef {$models.IndirectPersonAlias} IndirectPersonAlias + */ + /** * Another struct alias. * @typedef {$models.OtherAliasStruct} OtherAliasStruct @@ -55,3 +89,8 @@ import * as $models from "./models.js"; * Another class alias, but ordered after its aliased class. * @typedef {$models.StrangelyAliasedPerson} StrangelyAliasedPerson */ + +/** + * An alias that wraps a class through a typeparam alias. + * @typedef {$models.TPIndirectPersonAlias} TPIndirectPersonAlias + */ diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/models.js index 4f343cb4a..1ba2af395 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/models.js @@ -7,6 +7,19 @@ * @typedef {number} Alias */ +/** + * A class whose fields have various aliased types. + * @typedef {Object} AliasGroup + * @property {GenericAlias} GAi + * @property {GenericAlias>} GAP + * @property {GenericPtrAlias} GPAs + * @property {GenericPtrAlias>} GPAP + * @property {GenericMapAlias} GMA + * @property {GenericPersonAlias} GPA + * @property {IndirectPersonAlias} IPA + * @property {TPIndirectPersonAlias} TPIPA + */ + /** * A struct alias. * This should be rendered as a typedef or interface in every mode. @@ -34,6 +47,18 @@ * } } EmptyStruct */ +/** + * A generic alias that forwards to a type parameter. + * @template T + * @typedef {T} GenericAlias + */ + +/** + * A generic alias that wraps a map. + * @template T,U + * @typedef {{ [_: string]: U } | null} GenericMapAlias + */ + /** * A generic struct containing an alias. * @template T @@ -42,6 +67,23 @@ * @property {Alias} AliasedField */ +/** + * A generic alias that wraps a generic struct. + * @template T + * @typedef {GenericPerson[] | null>} GenericPersonAlias + */ + +/** + * A generic alias that wraps a pointer type. + * @template T + * @typedef {GenericAlias | null} GenericPtrAlias + */ + +/** + * An alias that wraps a class through a non-typeparam alias. + * @typedef {GenericPersonAlias} IndirectPersonAlias + */ + /** * Another struct alias. * @typedef {Object} OtherAliasStruct @@ -60,6 +102,11 @@ * @typedef {Person} StrangelyAliasedPerson */ +/** + * An alias that wraps a class through a typeparam alias. + * @typedef {GenericAlias>} TPIndirectPersonAlias + */ + // In interface mode, this file is likely to contain just comments. // We add a dummy export statement to ensure it is recognised as an ES module. export {}; diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/index.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/index.js index f9c0ff658..80fdcd24c 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/index.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/index.js @@ -9,6 +9,16 @@ export { import * as $models from "./models.js"; +/** + * @template S + * @typedef {$models.BasicCstrAlias} BasicCstrAlias + */ + +/** + * @template R + * @typedef {$models.ComparableCstrAlias} ComparableCstrAlias + */ + /** * @typedef {$models.EmbeddedCustomInterface} EmbeddedCustomInterface */ @@ -33,11 +43,36 @@ import * as $models from "./models.js"; * @typedef {$models.EmbeddedValuePtr} EmbeddedValuePtr */ +/** + * @template U + * @typedef {$models.GoodTildeCstrAlias} GoodTildeCstrAlias + */ + +/** + * @template Y + * @typedef {$models.InterfaceCstrAlias} InterfaceCstrAlias + */ + /** * @template R,S,T,U,V,W,X,Y,Z * @typedef {$models.Maps} Maps */ +/** + * @template X + * @typedef {$models.MixedCstrAlias} MixedCstrAlias + */ + +/** + * @template V + * @typedef {$models.NonBasicCstrAlias} NonBasicCstrAlias + */ + +/** + * @template W + * @typedef {$models.PointableCstrAlias} PointableCstrAlias + */ + /** * @typedef {$models.PointerAlias} PointerAlias */ diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/models.js index c9ea922a3..cee61a5e4 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/models.js @@ -2,6 +2,16 @@ // Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL // This file is automatically generated. DO NOT EDIT +/** + * @template S + * @typedef {S} BasicCstrAlias + */ + +/** + * @template R + * @typedef {R} ComparableCstrAlias + */ + /** * @typedef {string} EmbeddedCustomInterface */ @@ -26,6 +36,16 @@ * @typedef {string} EmbeddedValuePtr */ +/** + * @template U + * @typedef {U} GoodTildeCstrAlias + */ + +/** + * @template Y + * @typedef {Y} InterfaceCstrAlias + */ + /** * @template R,S,T,U,V,W,X,Y,Z * @typedef {Object} Maps @@ -118,6 +138,77 @@ * @property {{ [_: string]: number } | null} TPYPtr - Soft reject * @property {{ [_: string]: number } | null} TPZ - Accept, hide * @property {{ [_: string]: number } | null} TPZPtr - Soft reject + * @property {{ [_: string]: number } | null} GAR - Soft reject + * @property {{ [_: string]: number } | null} GARPtr - Soft reject + * @property {{ [_: string]: number } | null} GAS - Accept, hide + * @property {{ [_: string]: number } | null} GASPtr - Soft reject + * @property {{ [_: string]: number } | null} GAT - Soft reject + * @property {{ [_: string]: number } | null} GATPtr - Soft reject + * @property {{ [_: string]: number } | null} GAU - Accept, hide + * @property {{ [_: string]: number } | null} GAUPtr - Soft reject + * @property {{ [_: string]: number } | null} GAV - Accept, hide + * @property {{ [_: string]: number } | null} GAVPtr - Soft reject + * @property {{ [_: string]: number } | null} GAW - Soft reject + * @property {{ [_: string]: number } | null} GAWPtr - Accept, hide + * @property {{ [_: string]: number } | null} GAX - Accept, hide + * @property {{ [_: string]: number } | null} GAXPtr - Soft reject + * @property {{ [_: string]: number } | null} GAY - Accept, hide + * @property {{ [_: string]: number } | null} GAYPtr - Soft reject + * @property {{ [_: string]: number } | null} GAZ - Accept, hide + * @property {{ [_: string]: number } | null} GAZPtr - Soft reject + * @property {{ [_: `${number}`]: number } | null} GACi - Accept, hide + * @property {{ [_: ComparableCstrAlias]: number } | null} GACV - Accept + * @property {{ [_: string]: number } | null} GACP - Reject + * @property {{ [_: string]: number } | null} GACiPtr - Reject + * @property {{ [_: string]: number } | null} GACVPtr - Accept, hide + * @property {{ [_: string]: number } | null} GACPPtr - Accept, hide + * @property {{ [_: `${number}`]: number } | null} GABi - Accept, hide + * @property {{ [_: BasicCstrAlias]: number } | null} GABs - Accept + * @property {{ [_: string]: number } | null} GABiPtr - Reject + * @property {{ [_: string]: number } | null} GABT - Reject + * @property {{ [_: string]: number } | null} GABTPtr - Reject + * @property {{ [_: GoodTildeCstrAlias]: number } | null} GAGT - Accept + * @property {{ [_: string]: number } | null} GAGTPtr - Accept, hide + * @property {{ [_: NonBasicCstrAlias]: number } | null} GANBV - Accept + * @property {{ [_: string]: number } | null} GANBP - Accept, hide + * @property {{ [_: string]: number } | null} GANBVPtr - Accept, hide + * @property {{ [_: string]: number } | null} GANBPPtr - Reject + * @property {{ [_: PointableCstrAlias]: number } | null} GAPlV1 - Accept + * @property {{ [_: PointableCstrAlias]: number } | null} GAPlV2 - Accept + * @property {{ [_: string]: number } | null} GAPlP1 - Reject + * @property {{ [_: PointableCstrAlias]: number } | null} GAPlP2 - Accept + * @property {{ [_: string]: number } | null} GAPlVPtr - Accept, hide + * @property {{ [_: string]: number } | null} GAPlPPtr - Accept, hide + * @property {{ [_: `${number}`]: number } | null} GAMi - Accept, hide + * @property {{ [_: MixedCstrAlias]: number } | null} GAMS - Accept + * @property {{ [_: MixedCstrAlias]: number } | null} GAMV - Accept + * @property {{ [_: string]: number } | null} GAMSPtr - Reject + * @property {{ [_: string]: number } | null} GAMVPtr - Accept, hide + * @property {{ [_: string]: number } | null} GAII - Accept, hide + * @property {{ [_: InterfaceCstrAlias]: number } | null} GAIV - Accept + * @property {{ [_: string]: number } | null} GAIP - Accept, hide + * @property {{ [_: string]: number } | null} GAIIPtr - Reject + * @property {{ [_: string]: number } | null} GAIVPtr - Accept, hide + * @property {{ [_: string]: number } | null} GAIPPtr - Reject + * @property {{ [_: string]: number } | null} GAPrV - Accept, hide + * @property {{ [_: string]: number } | null} GAPrP - Accept, hide + * @property {{ [_: string]: number } | null} GAPrVPtr - Reject + * @property {{ [_: string]: number } | null} GAPrPPtr - Reject + */ + +/** + * @template X + * @typedef {X} MixedCstrAlias + */ + +/** + * @template V + * @typedef {V} NonBasicCstrAlias + */ + +/** + * @template W + * @typedef {W} PointableCstrAlias */ /** diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/warnings.log b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/warnings.log index dbefd8749..e802b6b63 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/warnings.log +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/warnings.log @@ -33,11 +33,34 @@ package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type bool is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type complex64 is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type float32 is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.BadTildeCstrAlias[T] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.BadTildeCstrAlias[struct{}] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.BadTildeCstrPtrAlias[T] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.BadTildeCstrPtrAlias[struct{}] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.BasicCstrPtrAlias[S] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.BasicCstrPtrAlias[int] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.ComparableCstrAlias[R] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.ComparableCstrAlias[github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerTextMarshaler] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.ComparableCstrPtrAlias[R] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.ComparableCstrPtrAlias[int] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.EmbeddedPointer is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.GoodTildeCstrPtrAlias[U] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.InterfaceCstrPtrAlias[*github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerTextMarshaler] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.InterfaceCstrPtrAlias[Y] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.InterfaceCstrPtrAlias[encoding.TextMarshaler] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.InterfacePtrAlias is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.InterfacePtrType is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.MixedCstrPtrAlias[X] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.MixedCstrPtrAlias[github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.StringType] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.NonBasicCstrPtrAlias[*github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerTextMarshaler] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.NonBasicCstrPtrAlias[V] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.NonTextMarshaler is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointableCstrAlias[W] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointableCstrAlias[github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerTextMarshaler] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerAlias is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerCstrPtrAlias[R, Z] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerCstrPtrAlias[github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerTextMarshaler, *github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerTextMarshaler] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerCstrPtrAlias[github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.ValueTextMarshaler, *github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.ValueTextMarshaler] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerPtrType is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerTextMarshaler is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerType is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.ts index 019d99750..14b0f1878 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.ts @@ -63,13 +63,22 @@ export function GetButForeignPrivateAlias(): Promise & { cancel(): void } { + let $resultPromise = $Call.ByID(914093800) as any; + let $typingPromise = $resultPromise.then(($result: any) => { + return $$createType3($result); + }) as any; + $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); + return $typingPromise; +} + /** * Greet a lot of unusual things. */ export function Greet($0: $models.EmptyAliasStruct, $1: $models.EmptyStruct): Promise<$models.AliasStruct> & { cancel(): void } { let $resultPromise = $Call.ByID(1411160069, $0, $1) as any; let $typingPromise = $resultPromise.then(($result: any) => { - return $$createType6($result); + return $$createType7($result); }) as any; $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); return $typingPromise; @@ -79,12 +88,13 @@ export function Greet($0: $models.EmptyAliasStruct, $1: $models.EmptyStruct): Pr const $$createType0 = $models.Person.createFrom; const $$createType1 = $models.GenericPerson.createFrom($Create.Any); const $$createType2 = nobindingshere$0.personImpl.createFrom; -const $$createType3 = $Create.Array($Create.Any); +const $$createType3 = $models.AliasGroup.createFrom; const $$createType4 = $Create.Array($Create.Any); -const $$createType5 = $Create.Struct({ - "NoMoreIdeas": $$createType4, -}); +const $$createType5 = $Create.Array($Create.Any); const $$createType6 = $Create.Struct({ - "Foo": $$createType3, - "Other": $$createType5, + "NoMoreIdeas": $$createType5, +}); +const $$createType7 = $Create.Struct({ + "Foo": $$createType4, + "Other": $$createType6, }); diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/index.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/index.ts index b0e392853..13f61da0f 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/index.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/index.ts @@ -7,16 +7,23 @@ export { }; export { + AliasGroup, AliasedPerson, EmptyStruct, GenericPerson, + GenericPersonAlias, + IndirectPersonAlias, Person, - StrangelyAliasedPerson + StrangelyAliasedPerson, + TPIndirectPersonAlias } from "./models.js"; export type { Alias, AliasStruct, EmptyAliasStruct, + GenericAlias, + GenericMapAlias, + GenericPtrAlias, OtherAliasStruct } from "./models.js"; diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/models.ts index 481c39bda..1f048ba57 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/models.ts @@ -10,6 +10,86 @@ import {Create as $Create} from "/wails/runtime.js"; */ export type Alias = number; +/** + * A class whose fields have various aliased types. + */ +export class AliasGroup { + "GAi": GenericAlias; + "GAP": GenericAlias>; + "GPAs": GenericPtrAlias; + "GPAP": GenericPtrAlias>; + "GMA": GenericMapAlias; + "GPA": GenericPersonAlias; + "IPA": IndirectPersonAlias; + "TPIPA": TPIndirectPersonAlias; + + /** Creates a new AliasGroup instance. */ + constructor($$source: Partial = {}) { + if (!("GAi" in $$source)) { + this["GAi"] = 0; + } + if (!("GAP" in $$source)) { + this["GAP"] = (new GenericPerson()); + } + if (!("GPAs" in $$source)) { + this["GPAs"] = null; + } + if (!("GPAP" in $$source)) { + this["GPAP"] = null; + } + if (!("GMA" in $$source)) { + this["GMA"] = {}; + } + if (!("GPA" in $$source)) { + this["GPA"] = (new GenericPersonAlias()); + } + if (!("IPA" in $$source)) { + this["IPA"] = (new IndirectPersonAlias()); + } + if (!("TPIPA" in $$source)) { + this["TPIPA"] = (new TPIndirectPersonAlias()); + } + + Object.assign(this, $$source); + } + + /** + * Creates a new AliasGroup instance from a string or object. + */ + static createFrom($$source: any = {}): AliasGroup { + const $$createField1_0 = $$createType0; + const $$createField2_0 = $$createType2; + const $$createField3_0 = $$createType5; + const $$createField4_0 = $$createType6; + const $$createField5_0 = $$createType8; + const $$createField6_0 = $$createType8; + const $$createField7_0 = $$createType0; + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + if ("GAP" in $$parsedSource) { + $$parsedSource["GAP"] = $$createField1_0($$parsedSource["GAP"]); + } + if ("GPAs" in $$parsedSource) { + $$parsedSource["GPAs"] = $$createField2_0($$parsedSource["GPAs"]); + } + if ("GPAP" in $$parsedSource) { + $$parsedSource["GPAP"] = $$createField3_0($$parsedSource["GPAP"]); + } + if ("GMA" in $$parsedSource) { + $$parsedSource["GMA"] = $$createField4_0($$parsedSource["GMA"]); + } + if ("GPA" in $$parsedSource) { + $$parsedSource["GPA"] = $$createField5_0($$parsedSource["GPA"]); + } + if ("IPA" in $$parsedSource) { + $$parsedSource["IPA"] = $$createField6_0($$parsedSource["IPA"]); + } + if ("TPIPA" in $$parsedSource) { + $$parsedSource["TPIPA"] = $$createField7_0($$parsedSource["TPIPA"]); + } + return new AliasGroup($$parsedSource as Partial); + } +} + /** * A struct alias. * This should be rendered as a typedef or interface in every mode. @@ -58,6 +138,16 @@ export class EmptyStruct { } } +/** + * A generic alias that forwards to a type parameter. + */ +export type GenericAlias = T; + +/** + * A generic alias that wraps a map. + */ +export type GenericMapAlias = { [_: string]: U }; + /** * A generic struct containing an alias. */ @@ -91,6 +181,31 @@ export class GenericPerson { } } +/** + * A generic alias that wraps a generic struct. + */ +export const GenericPersonAlias = GenericPerson; + +/** + * A generic alias that wraps a generic struct. + */ +export type GenericPersonAlias = GenericPerson[]>; + +/** + * A generic alias that wraps a pointer type. + */ +export type GenericPtrAlias = GenericAlias | null; + +/** + * An alias that wraps a class through a non-typeparam alias. + */ +export const IndirectPersonAlias = GenericPersonAlias; + +/** + * An alias that wraps a class through a non-typeparam alias. + */ +export type IndirectPersonAlias = GenericPersonAlias; + /** * Another struct alias. */ @@ -152,3 +267,24 @@ export const StrangelyAliasedPerson = Person; * Another class alias, but ordered after its aliased class. */ export type StrangelyAliasedPerson = Person; + +/** + * An alias that wraps a class through a typeparam alias. + */ +export const TPIndirectPersonAlias = GenericPerson; + +/** + * An alias that wraps a class through a typeparam alias. + */ +export type TPIndirectPersonAlias = GenericAlias>; + +// Private type creation functions +const $$createType0 = GenericPerson.createFrom($Create.Any); +const $$createType1 = $Create.Array($Create.Any); +const $$createType2 = $Create.Nullable($$createType1); +const $$createType3 = $Create.Array($Create.Any); +const $$createType4 = GenericPerson.createFrom($$createType3); +const $$createType5 = $Create.Nullable($$createType4); +const $$createType6 = $Create.Map($Create.Any, $Create.Any); +const $$createType7 = $Create.Array($Create.Any); +const $$createType8 = GenericPerson.createFrom($$createType7); diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/index.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/index.ts index 1f4f65dda..b5890af28 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/index.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/index.ts @@ -11,12 +11,19 @@ export { } from "./models.js"; export type { + BasicCstrAlias, + ComparableCstrAlias, EmbeddedCustomInterface, EmbeddedOriginalInterface, EmbeddedPointer, EmbeddedPointerPtr, EmbeddedValue, EmbeddedValuePtr, + GoodTildeCstrAlias, + InterfaceCstrAlias, + MixedCstrAlias, + NonBasicCstrAlias, + PointableCstrAlias, PointerAlias, PointerTextMarshaler, StringAlias, diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/models.ts index d858ddf9a..81b54bc2e 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/models.ts @@ -5,6 +5,10 @@ // @ts-ignore: Unused imports import {Create as $Create} from "/wails/runtime.js"; +export type BasicCstrAlias = S; + +export type ComparableCstrAlias = R; + export type EmbeddedCustomInterface = string; export type EmbeddedOriginalInterface = string; @@ -17,6 +21,10 @@ export type EmbeddedValue = string; export type EmbeddedValuePtr = string; +export type GoodTildeCstrAlias = U; + +export type InterfaceCstrAlias = Y; + export class Maps { /** * Reject @@ -463,6 +471,286 @@ export class Maps { */ "TPZPtr": { [_: string]: number }; + /** + * Soft reject + */ + "GAR": { [_: string]: number }; + + /** + * Soft reject + */ + "GARPtr": { [_: string]: number }; + + /** + * Accept, hide + */ + "GAS": { [_: string]: number }; + + /** + * Soft reject + */ + "GASPtr": { [_: string]: number }; + + /** + * Soft reject + */ + "GAT": { [_: string]: number }; + + /** + * Soft reject + */ + "GATPtr": { [_: string]: number }; + + /** + * Accept, hide + */ + "GAU": { [_: string]: number }; + + /** + * Soft reject + */ + "GAUPtr": { [_: string]: number }; + + /** + * Accept, hide + */ + "GAV": { [_: string]: number }; + + /** + * Soft reject + */ + "GAVPtr": { [_: string]: number }; + + /** + * Soft reject + */ + "GAW": { [_: string]: number }; + + /** + * Accept, hide + */ + "GAWPtr": { [_: string]: number }; + + /** + * Accept, hide + */ + "GAX": { [_: string]: number }; + + /** + * Soft reject + */ + "GAXPtr": { [_: string]: number }; + + /** + * Accept, hide + */ + "GAY": { [_: string]: number }; + + /** + * Soft reject + */ + "GAYPtr": { [_: string]: number }; + + /** + * Accept, hide + */ + "GAZ": { [_: string]: number }; + + /** + * Soft reject + */ + "GAZPtr": { [_: string]: number }; + + /** + * Accept, hide + */ + "GACi": { [_: `${number}`]: number }; + + /** + * Accept + */ + "GACV": { [_: ComparableCstrAlias]: number }; + + /** + * Reject + */ + "GACP": { [_: string]: number }; + + /** + * Reject + */ + "GACiPtr": { [_: string]: number }; + + /** + * Accept, hide + */ + "GACVPtr": { [_: string]: number }; + + /** + * Accept, hide + */ + "GACPPtr": { [_: string]: number }; + + /** + * Accept, hide + */ + "GABi": { [_: `${number}`]: number }; + + /** + * Accept + */ + "GABs": { [_: BasicCstrAlias]: number }; + + /** + * Reject + */ + "GABiPtr": { [_: string]: number }; + + /** + * Reject + */ + "GABT": { [_: string]: number }; + + /** + * Reject + */ + "GABTPtr": { [_: string]: number }; + + /** + * Accept + */ + "GAGT": { [_: GoodTildeCstrAlias]: number }; + + /** + * Accept, hide + */ + "GAGTPtr": { [_: string]: number }; + + /** + * Accept + */ + "GANBV": { [_: NonBasicCstrAlias]: number }; + + /** + * Accept, hide + */ + "GANBP": { [_: string]: number }; + + /** + * Accept, hide + */ + "GANBVPtr": { [_: string]: number }; + + /** + * Reject + */ + "GANBPPtr": { [_: string]: number }; + + /** + * Accept + */ + "GAPlV1": { [_: PointableCstrAlias]: number }; + + /** + * Accept + */ + "GAPlV2": { [_: PointableCstrAlias]: number }; + + /** + * Reject + */ + "GAPlP1": { [_: string]: number }; + + /** + * Accept + */ + "GAPlP2": { [_: PointableCstrAlias]: number }; + + /** + * Accept, hide + */ + "GAPlVPtr": { [_: string]: number }; + + /** + * Accept, hide + */ + "GAPlPPtr": { [_: string]: number }; + + /** + * Accept, hide + */ + "GAMi": { [_: `${number}`]: number }; + + /** + * Accept + */ + "GAMS": { [_: MixedCstrAlias]: number }; + + /** + * Accept + */ + "GAMV": { [_: MixedCstrAlias]: number }; + + /** + * Reject + */ + "GAMSPtr": { [_: string]: number }; + + /** + * Accept, hide + */ + "GAMVPtr": { [_: string]: number }; + + /** + * Accept, hide + */ + "GAII": { [_: string]: number }; + + /** + * Accept + */ + "GAIV": { [_: InterfaceCstrAlias]: number }; + + /** + * Accept, hide + */ + "GAIP": { [_: string]: number }; + + /** + * Reject + */ + "GAIIPtr": { [_: string]: number }; + + /** + * Accept, hide + */ + "GAIVPtr": { [_: string]: number }; + + /** + * Reject + */ + "GAIPPtr": { [_: string]: number }; + + /** + * Accept, hide + */ + "GAPrV": { [_: string]: number }; + + /** + * Accept, hide + */ + "GAPrP": { [_: string]: number }; + + /** + * Reject + */ + "GAPrVPtr": { [_: string]: number }; + + /** + * Reject + */ + "GAPrPPtr": { [_: string]: number }; + /** Creates a new Maps instance. */ constructor($$source: Partial> = {}) { if (!("Bool" in $$source)) { @@ -732,6 +1020,174 @@ export class Maps { if (!("TPZPtr" in $$source)) { this["TPZPtr"] = {}; } + if (!("GAR" in $$source)) { + this["GAR"] = {}; + } + if (!("GARPtr" in $$source)) { + this["GARPtr"] = {}; + } + if (!("GAS" in $$source)) { + this["GAS"] = {}; + } + if (!("GASPtr" in $$source)) { + this["GASPtr"] = {}; + } + if (!("GAT" in $$source)) { + this["GAT"] = {}; + } + if (!("GATPtr" in $$source)) { + this["GATPtr"] = {}; + } + if (!("GAU" in $$source)) { + this["GAU"] = {}; + } + if (!("GAUPtr" in $$source)) { + this["GAUPtr"] = {}; + } + if (!("GAV" in $$source)) { + this["GAV"] = {}; + } + if (!("GAVPtr" in $$source)) { + this["GAVPtr"] = {}; + } + if (!("GAW" in $$source)) { + this["GAW"] = {}; + } + if (!("GAWPtr" in $$source)) { + this["GAWPtr"] = {}; + } + if (!("GAX" in $$source)) { + this["GAX"] = {}; + } + if (!("GAXPtr" in $$source)) { + this["GAXPtr"] = {}; + } + if (!("GAY" in $$source)) { + this["GAY"] = {}; + } + if (!("GAYPtr" in $$source)) { + this["GAYPtr"] = {}; + } + if (!("GAZ" in $$source)) { + this["GAZ"] = {}; + } + if (!("GAZPtr" in $$source)) { + this["GAZPtr"] = {}; + } + if (!("GACi" in $$source)) { + this["GACi"] = {}; + } + if (!("GACV" in $$source)) { + this["GACV"] = {}; + } + if (!("GACP" in $$source)) { + this["GACP"] = {}; + } + if (!("GACiPtr" in $$source)) { + this["GACiPtr"] = {}; + } + if (!("GACVPtr" in $$source)) { + this["GACVPtr"] = {}; + } + if (!("GACPPtr" in $$source)) { + this["GACPPtr"] = {}; + } + if (!("GABi" in $$source)) { + this["GABi"] = {}; + } + if (!("GABs" in $$source)) { + this["GABs"] = {}; + } + if (!("GABiPtr" in $$source)) { + this["GABiPtr"] = {}; + } + if (!("GABT" in $$source)) { + this["GABT"] = {}; + } + if (!("GABTPtr" in $$source)) { + this["GABTPtr"] = {}; + } + if (!("GAGT" in $$source)) { + this["GAGT"] = {}; + } + if (!("GAGTPtr" in $$source)) { + this["GAGTPtr"] = {}; + } + if (!("GANBV" in $$source)) { + this["GANBV"] = {}; + } + if (!("GANBP" in $$source)) { + this["GANBP"] = {}; + } + if (!("GANBVPtr" in $$source)) { + this["GANBVPtr"] = {}; + } + if (!("GANBPPtr" in $$source)) { + this["GANBPPtr"] = {}; + } + if (!("GAPlV1" in $$source)) { + this["GAPlV1"] = {}; + } + if (!("GAPlV2" in $$source)) { + this["GAPlV2"] = {}; + } + if (!("GAPlP1" in $$source)) { + this["GAPlP1"] = {}; + } + if (!("GAPlP2" in $$source)) { + this["GAPlP2"] = {}; + } + if (!("GAPlVPtr" in $$source)) { + this["GAPlVPtr"] = {}; + } + if (!("GAPlPPtr" in $$source)) { + this["GAPlPPtr"] = {}; + } + if (!("GAMi" in $$source)) { + this["GAMi"] = {}; + } + if (!("GAMS" in $$source)) { + this["GAMS"] = {}; + } + if (!("GAMV" in $$source)) { + this["GAMV"] = {}; + } + if (!("GAMSPtr" in $$source)) { + this["GAMSPtr"] = {}; + } + if (!("GAMVPtr" in $$source)) { + this["GAMVPtr"] = {}; + } + if (!("GAII" in $$source)) { + this["GAII"] = {}; + } + if (!("GAIV" in $$source)) { + this["GAIV"] = {}; + } + if (!("GAIP" in $$source)) { + this["GAIP"] = {}; + } + if (!("GAIIPtr" in $$source)) { + this["GAIIPtr"] = {}; + } + if (!("GAIVPtr" in $$source)) { + this["GAIVPtr"] = {}; + } + if (!("GAIPPtr" in $$source)) { + this["GAIPPtr"] = {}; + } + if (!("GAPrV" in $$source)) { + this["GAPrV"] = {}; + } + if (!("GAPrP" in $$source)) { + this["GAPrP"] = {}; + } + if (!("GAPrVPtr" in $$source)) { + this["GAPrVPtr"] = {}; + } + if (!("GAPrPPtr" in $$source)) { + this["GAPrPPtr"] = {}; + } Object.assign(this, $$source); } @@ -831,6 +1287,62 @@ export class Maps { const $$createField86_0 = $$createType74($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); const $$createField87_0 = $$createType75($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); const $$createField88_0 = $$createType76($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField89_0 = $$createType59($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField90_0 = $$createType60($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField91_0 = $$createType61($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField92_0 = $$createType62($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField93_0 = $$createType63($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField94_0 = $$createType64($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField95_0 = $$createType65($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField96_0 = $$createType66($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField97_0 = $$createType67($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField98_0 = $$createType68($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField99_0 = $$createType69($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField100_0 = $$createType70($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField101_0 = $$createType71($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField102_0 = $$createType72($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField103_0 = $$createType73($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField104_0 = $$createType74($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField105_0 = $$createType75($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField106_0 = $$createType76($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField107_0 = $$createType1; + const $$createField108_0 = $$createType15; + const $$createField109_0 = $$createType17; + const $$createField110_0 = $$createType8; + const $$createField111_0 = $$createType16; + const $$createField112_0 = $$createType18; + const $$createField113_0 = $$createType1; + const $$createField114_0 = $$createType7; + const $$createField115_0 = $$createType8; + const $$createField116_0 = $$createType77; + const $$createField117_0 = $$createType78; + const $$createField118_0 = $$createType15; + const $$createField119_0 = $$createType16; + const $$createField120_0 = $$createType15; + const $$createField121_0 = $$createType18; + const $$createField122_0 = $$createType16; + const $$createField123_0 = $$createType53; + const $$createField124_0 = $$createType15; + const $$createField125_0 = $$createType16; + const $$createField126_0 = $$createType17; + const $$createField127_0 = $$createType18; + const $$createField128_0 = $$createType16; + const $$createField129_0 = $$createType18; + const $$createField130_0 = $$createType2; + const $$createField131_0 = $$createType42; + const $$createField132_0 = $$createType15; + const $$createField133_0 = $$createType79; + const $$createField134_0 = $$createType16; + const $$createField135_0 = $$createType23; + const $$createField136_0 = $$createType15; + const $$createField137_0 = $$createType18; + const $$createField138_0 = $$createType24; + const $$createField139_0 = $$createType16; + const $$createField140_0 = $$createType53; + const $$createField141_0 = $$createType16; + const $$createField142_0 = $$createType18; + const $$createField143_0 = $$createType48; + const $$createField144_0 = $$createType53; return ($$source: any = {}) => { let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; if ("Bool" in $$parsedSource) { @@ -1100,11 +1612,185 @@ export class Maps { if ("TPZPtr" in $$parsedSource) { $$parsedSource["TPZPtr"] = $$createField88_0($$parsedSource["TPZPtr"]); } + if ("GAR" in $$parsedSource) { + $$parsedSource["GAR"] = $$createField89_0($$parsedSource["GAR"]); + } + if ("GARPtr" in $$parsedSource) { + $$parsedSource["GARPtr"] = $$createField90_0($$parsedSource["GARPtr"]); + } + if ("GAS" in $$parsedSource) { + $$parsedSource["GAS"] = $$createField91_0($$parsedSource["GAS"]); + } + if ("GASPtr" in $$parsedSource) { + $$parsedSource["GASPtr"] = $$createField92_0($$parsedSource["GASPtr"]); + } + if ("GAT" in $$parsedSource) { + $$parsedSource["GAT"] = $$createField93_0($$parsedSource["GAT"]); + } + if ("GATPtr" in $$parsedSource) { + $$parsedSource["GATPtr"] = $$createField94_0($$parsedSource["GATPtr"]); + } + if ("GAU" in $$parsedSource) { + $$parsedSource["GAU"] = $$createField95_0($$parsedSource["GAU"]); + } + if ("GAUPtr" in $$parsedSource) { + $$parsedSource["GAUPtr"] = $$createField96_0($$parsedSource["GAUPtr"]); + } + if ("GAV" in $$parsedSource) { + $$parsedSource["GAV"] = $$createField97_0($$parsedSource["GAV"]); + } + if ("GAVPtr" in $$parsedSource) { + $$parsedSource["GAVPtr"] = $$createField98_0($$parsedSource["GAVPtr"]); + } + if ("GAW" in $$parsedSource) { + $$parsedSource["GAW"] = $$createField99_0($$parsedSource["GAW"]); + } + if ("GAWPtr" in $$parsedSource) { + $$parsedSource["GAWPtr"] = $$createField100_0($$parsedSource["GAWPtr"]); + } + if ("GAX" in $$parsedSource) { + $$parsedSource["GAX"] = $$createField101_0($$parsedSource["GAX"]); + } + if ("GAXPtr" in $$parsedSource) { + $$parsedSource["GAXPtr"] = $$createField102_0($$parsedSource["GAXPtr"]); + } + if ("GAY" in $$parsedSource) { + $$parsedSource["GAY"] = $$createField103_0($$parsedSource["GAY"]); + } + if ("GAYPtr" in $$parsedSource) { + $$parsedSource["GAYPtr"] = $$createField104_0($$parsedSource["GAYPtr"]); + } + if ("GAZ" in $$parsedSource) { + $$parsedSource["GAZ"] = $$createField105_0($$parsedSource["GAZ"]); + } + if ("GAZPtr" in $$parsedSource) { + $$parsedSource["GAZPtr"] = $$createField106_0($$parsedSource["GAZPtr"]); + } + if ("GACi" in $$parsedSource) { + $$parsedSource["GACi"] = $$createField107_0($$parsedSource["GACi"]); + } + if ("GACV" in $$parsedSource) { + $$parsedSource["GACV"] = $$createField108_0($$parsedSource["GACV"]); + } + if ("GACP" in $$parsedSource) { + $$parsedSource["GACP"] = $$createField109_0($$parsedSource["GACP"]); + } + if ("GACiPtr" in $$parsedSource) { + $$parsedSource["GACiPtr"] = $$createField110_0($$parsedSource["GACiPtr"]); + } + if ("GACVPtr" in $$parsedSource) { + $$parsedSource["GACVPtr"] = $$createField111_0($$parsedSource["GACVPtr"]); + } + if ("GACPPtr" in $$parsedSource) { + $$parsedSource["GACPPtr"] = $$createField112_0($$parsedSource["GACPPtr"]); + } + if ("GABi" in $$parsedSource) { + $$parsedSource["GABi"] = $$createField113_0($$parsedSource["GABi"]); + } + if ("GABs" in $$parsedSource) { + $$parsedSource["GABs"] = $$createField114_0($$parsedSource["GABs"]); + } + if ("GABiPtr" in $$parsedSource) { + $$parsedSource["GABiPtr"] = $$createField115_0($$parsedSource["GABiPtr"]); + } + if ("GABT" in $$parsedSource) { + $$parsedSource["GABT"] = $$createField116_0($$parsedSource["GABT"]); + } + if ("GABTPtr" in $$parsedSource) { + $$parsedSource["GABTPtr"] = $$createField117_0($$parsedSource["GABTPtr"]); + } + if ("GAGT" in $$parsedSource) { + $$parsedSource["GAGT"] = $$createField118_0($$parsedSource["GAGT"]); + } + if ("GAGTPtr" in $$parsedSource) { + $$parsedSource["GAGTPtr"] = $$createField119_0($$parsedSource["GAGTPtr"]); + } + if ("GANBV" in $$parsedSource) { + $$parsedSource["GANBV"] = $$createField120_0($$parsedSource["GANBV"]); + } + if ("GANBP" in $$parsedSource) { + $$parsedSource["GANBP"] = $$createField121_0($$parsedSource["GANBP"]); + } + if ("GANBVPtr" in $$parsedSource) { + $$parsedSource["GANBVPtr"] = $$createField122_0($$parsedSource["GANBVPtr"]); + } + if ("GANBPPtr" in $$parsedSource) { + $$parsedSource["GANBPPtr"] = $$createField123_0($$parsedSource["GANBPPtr"]); + } + if ("GAPlV1" in $$parsedSource) { + $$parsedSource["GAPlV1"] = $$createField124_0($$parsedSource["GAPlV1"]); + } + if ("GAPlV2" in $$parsedSource) { + $$parsedSource["GAPlV2"] = $$createField125_0($$parsedSource["GAPlV2"]); + } + if ("GAPlP1" in $$parsedSource) { + $$parsedSource["GAPlP1"] = $$createField126_0($$parsedSource["GAPlP1"]); + } + if ("GAPlP2" in $$parsedSource) { + $$parsedSource["GAPlP2"] = $$createField127_0($$parsedSource["GAPlP2"]); + } + if ("GAPlVPtr" in $$parsedSource) { + $$parsedSource["GAPlVPtr"] = $$createField128_0($$parsedSource["GAPlVPtr"]); + } + if ("GAPlPPtr" in $$parsedSource) { + $$parsedSource["GAPlPPtr"] = $$createField129_0($$parsedSource["GAPlPPtr"]); + } + if ("GAMi" in $$parsedSource) { + $$parsedSource["GAMi"] = $$createField130_0($$parsedSource["GAMi"]); + } + if ("GAMS" in $$parsedSource) { + $$parsedSource["GAMS"] = $$createField131_0($$parsedSource["GAMS"]); + } + if ("GAMV" in $$parsedSource) { + $$parsedSource["GAMV"] = $$createField132_0($$parsedSource["GAMV"]); + } + if ("GAMSPtr" in $$parsedSource) { + $$parsedSource["GAMSPtr"] = $$createField133_0($$parsedSource["GAMSPtr"]); + } + if ("GAMVPtr" in $$parsedSource) { + $$parsedSource["GAMVPtr"] = $$createField134_0($$parsedSource["GAMVPtr"]); + } + if ("GAII" in $$parsedSource) { + $$parsedSource["GAII"] = $$createField135_0($$parsedSource["GAII"]); + } + if ("GAIV" in $$parsedSource) { + $$parsedSource["GAIV"] = $$createField136_0($$parsedSource["GAIV"]); + } + if ("GAIP" in $$parsedSource) { + $$parsedSource["GAIP"] = $$createField137_0($$parsedSource["GAIP"]); + } + if ("GAIIPtr" in $$parsedSource) { + $$parsedSource["GAIIPtr"] = $$createField138_0($$parsedSource["GAIIPtr"]); + } + if ("GAIVPtr" in $$parsedSource) { + $$parsedSource["GAIVPtr"] = $$createField139_0($$parsedSource["GAIVPtr"]); + } + if ("GAIPPtr" in $$parsedSource) { + $$parsedSource["GAIPPtr"] = $$createField140_0($$parsedSource["GAIPPtr"]); + } + if ("GAPrV" in $$parsedSource) { + $$parsedSource["GAPrV"] = $$createField141_0($$parsedSource["GAPrV"]); + } + if ("GAPrP" in $$parsedSource) { + $$parsedSource["GAPrP"] = $$createField142_0($$parsedSource["GAPrP"]); + } + if ("GAPrVPtr" in $$parsedSource) { + $$parsedSource["GAPrVPtr"] = $$createField143_0($$parsedSource["GAPrVPtr"]); + } + if ("GAPrPPtr" in $$parsedSource) { + $$parsedSource["GAPrPPtr"] = $$createField144_0($$parsedSource["GAPrPPtr"]); + } return new Maps($$parsedSource as Partial>); }; } } +export type MixedCstrAlias = X; + +export type NonBasicCstrAlias = V; + +export type PointableCstrAlias = W; + export type PointerAlias = PointerTextMarshaler; export type PointerTextMarshaler = string; @@ -1195,3 +1881,6 @@ const $$createType73 = ($$createParamR, $$createParamS, $$createParamT, $$create const $$createType74 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); const $$createType75 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); const $$createType76 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); +const $$createType77 = $Create.Map($Create.Any, $Create.Any); +const $$createType78 = $Create.Map($Create.Any, $Create.Any); +const $$createType79 = $Create.Map($Create.Any, $Create.Any); diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/warnings.log b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/warnings.log index dbefd8749..e802b6b63 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/warnings.log +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/warnings.log @@ -33,11 +33,34 @@ package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type bool is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type complex64 is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type float32 is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.BadTildeCstrAlias[T] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.BadTildeCstrAlias[struct{}] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.BadTildeCstrPtrAlias[T] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.BadTildeCstrPtrAlias[struct{}] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.BasicCstrPtrAlias[S] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.BasicCstrPtrAlias[int] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.ComparableCstrAlias[R] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.ComparableCstrAlias[github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerTextMarshaler] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.ComparableCstrPtrAlias[R] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.ComparableCstrPtrAlias[int] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.EmbeddedPointer is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.GoodTildeCstrPtrAlias[U] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.InterfaceCstrPtrAlias[*github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerTextMarshaler] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.InterfaceCstrPtrAlias[Y] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.InterfaceCstrPtrAlias[encoding.TextMarshaler] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.InterfacePtrAlias is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.InterfacePtrType is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.MixedCstrPtrAlias[X] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.MixedCstrPtrAlias[github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.StringType] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.NonBasicCstrPtrAlias[*github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerTextMarshaler] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.NonBasicCstrPtrAlias[V] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.NonTextMarshaler is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointableCstrAlias[W] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointableCstrAlias[github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerTextMarshaler] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerAlias is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerCstrPtrAlias[R, Z] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerCstrPtrAlias[github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerTextMarshaler, *github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerTextMarshaler] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerCstrPtrAlias[github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.ValueTextMarshaler, *github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.ValueTextMarshaler] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerPtrType is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerTextMarshaler is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerType is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.ts index fec08acb4..32630459f 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.ts @@ -63,13 +63,22 @@ export function GetButForeignPrivateAlias(): Promise & { cancel(): void } { + let $resultPromise = $Call.ByName("main.GreetService.GetButGenericAliases") as any; + let $typingPromise = $resultPromise.then(($result: any) => { + return $$createType3($result); + }) as any; + $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); + return $typingPromise; +} + /** * Greet a lot of unusual things. */ export function Greet($0: $models.EmptyAliasStruct, $1: $models.EmptyStruct): Promise<$models.AliasStruct> & { cancel(): void } { let $resultPromise = $Call.ByName("main.GreetService.Greet", $0, $1) as any; let $typingPromise = $resultPromise.then(($result: any) => { - return $$createType6($result); + return $$createType7($result); }) as any; $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); return $typingPromise; @@ -79,12 +88,13 @@ export function Greet($0: $models.EmptyAliasStruct, $1: $models.EmptyStruct): Pr const $$createType0 = $models.Person.createFrom; const $$createType1 = $models.GenericPerson.createFrom($Create.Any); const $$createType2 = nobindingshere$0.personImpl.createFrom; -const $$createType3 = $Create.Array($Create.Any); +const $$createType3 = $models.AliasGroup.createFrom; const $$createType4 = $Create.Array($Create.Any); -const $$createType5 = $Create.Struct({ - "NoMoreIdeas": $$createType4, -}); +const $$createType5 = $Create.Array($Create.Any); const $$createType6 = $Create.Struct({ - "Foo": $$createType3, - "Other": $$createType5, + "NoMoreIdeas": $$createType5, +}); +const $$createType7 = $Create.Struct({ + "Foo": $$createType4, + "Other": $$createType6, }); diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/index.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/index.ts index b0e392853..13f61da0f 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/index.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/index.ts @@ -7,16 +7,23 @@ export { }; export { + AliasGroup, AliasedPerson, EmptyStruct, GenericPerson, + GenericPersonAlias, + IndirectPersonAlias, Person, - StrangelyAliasedPerson + StrangelyAliasedPerson, + TPIndirectPersonAlias } from "./models.js"; export type { Alias, AliasStruct, EmptyAliasStruct, + GenericAlias, + GenericMapAlias, + GenericPtrAlias, OtherAliasStruct } from "./models.js"; diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/models.ts index 481c39bda..1f048ba57 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/models.ts @@ -10,6 +10,86 @@ import {Create as $Create} from "/wails/runtime.js"; */ export type Alias = number; +/** + * A class whose fields have various aliased types. + */ +export class AliasGroup { + "GAi": GenericAlias; + "GAP": GenericAlias>; + "GPAs": GenericPtrAlias; + "GPAP": GenericPtrAlias>; + "GMA": GenericMapAlias; + "GPA": GenericPersonAlias; + "IPA": IndirectPersonAlias; + "TPIPA": TPIndirectPersonAlias; + + /** Creates a new AliasGroup instance. */ + constructor($$source: Partial = {}) { + if (!("GAi" in $$source)) { + this["GAi"] = 0; + } + if (!("GAP" in $$source)) { + this["GAP"] = (new GenericPerson()); + } + if (!("GPAs" in $$source)) { + this["GPAs"] = null; + } + if (!("GPAP" in $$source)) { + this["GPAP"] = null; + } + if (!("GMA" in $$source)) { + this["GMA"] = {}; + } + if (!("GPA" in $$source)) { + this["GPA"] = (new GenericPersonAlias()); + } + if (!("IPA" in $$source)) { + this["IPA"] = (new IndirectPersonAlias()); + } + if (!("TPIPA" in $$source)) { + this["TPIPA"] = (new TPIndirectPersonAlias()); + } + + Object.assign(this, $$source); + } + + /** + * Creates a new AliasGroup instance from a string or object. + */ + static createFrom($$source: any = {}): AliasGroup { + const $$createField1_0 = $$createType0; + const $$createField2_0 = $$createType2; + const $$createField3_0 = $$createType5; + const $$createField4_0 = $$createType6; + const $$createField5_0 = $$createType8; + const $$createField6_0 = $$createType8; + const $$createField7_0 = $$createType0; + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + if ("GAP" in $$parsedSource) { + $$parsedSource["GAP"] = $$createField1_0($$parsedSource["GAP"]); + } + if ("GPAs" in $$parsedSource) { + $$parsedSource["GPAs"] = $$createField2_0($$parsedSource["GPAs"]); + } + if ("GPAP" in $$parsedSource) { + $$parsedSource["GPAP"] = $$createField3_0($$parsedSource["GPAP"]); + } + if ("GMA" in $$parsedSource) { + $$parsedSource["GMA"] = $$createField4_0($$parsedSource["GMA"]); + } + if ("GPA" in $$parsedSource) { + $$parsedSource["GPA"] = $$createField5_0($$parsedSource["GPA"]); + } + if ("IPA" in $$parsedSource) { + $$parsedSource["IPA"] = $$createField6_0($$parsedSource["IPA"]); + } + if ("TPIPA" in $$parsedSource) { + $$parsedSource["TPIPA"] = $$createField7_0($$parsedSource["TPIPA"]); + } + return new AliasGroup($$parsedSource as Partial); + } +} + /** * A struct alias. * This should be rendered as a typedef or interface in every mode. @@ -58,6 +138,16 @@ export class EmptyStruct { } } +/** + * A generic alias that forwards to a type parameter. + */ +export type GenericAlias = T; + +/** + * A generic alias that wraps a map. + */ +export type GenericMapAlias = { [_: string]: U }; + /** * A generic struct containing an alias. */ @@ -91,6 +181,31 @@ export class GenericPerson { } } +/** + * A generic alias that wraps a generic struct. + */ +export const GenericPersonAlias = GenericPerson; + +/** + * A generic alias that wraps a generic struct. + */ +export type GenericPersonAlias = GenericPerson[]>; + +/** + * A generic alias that wraps a pointer type. + */ +export type GenericPtrAlias = GenericAlias | null; + +/** + * An alias that wraps a class through a non-typeparam alias. + */ +export const IndirectPersonAlias = GenericPersonAlias; + +/** + * An alias that wraps a class through a non-typeparam alias. + */ +export type IndirectPersonAlias = GenericPersonAlias; + /** * Another struct alias. */ @@ -152,3 +267,24 @@ export const StrangelyAliasedPerson = Person; * Another class alias, but ordered after its aliased class. */ export type StrangelyAliasedPerson = Person; + +/** + * An alias that wraps a class through a typeparam alias. + */ +export const TPIndirectPersonAlias = GenericPerson; + +/** + * An alias that wraps a class through a typeparam alias. + */ +export type TPIndirectPersonAlias = GenericAlias>; + +// Private type creation functions +const $$createType0 = GenericPerson.createFrom($Create.Any); +const $$createType1 = $Create.Array($Create.Any); +const $$createType2 = $Create.Nullable($$createType1); +const $$createType3 = $Create.Array($Create.Any); +const $$createType4 = GenericPerson.createFrom($$createType3); +const $$createType5 = $Create.Nullable($$createType4); +const $$createType6 = $Create.Map($Create.Any, $Create.Any); +const $$createType7 = $Create.Array($Create.Any); +const $$createType8 = GenericPerson.createFrom($$createType7); diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/index.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/index.ts index 1f4f65dda..b5890af28 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/index.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/index.ts @@ -11,12 +11,19 @@ export { } from "./models.js"; export type { + BasicCstrAlias, + ComparableCstrAlias, EmbeddedCustomInterface, EmbeddedOriginalInterface, EmbeddedPointer, EmbeddedPointerPtr, EmbeddedValue, EmbeddedValuePtr, + GoodTildeCstrAlias, + InterfaceCstrAlias, + MixedCstrAlias, + NonBasicCstrAlias, + PointableCstrAlias, PointerAlias, PointerTextMarshaler, StringAlias, diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/models.ts index d858ddf9a..81b54bc2e 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/models.ts @@ -5,6 +5,10 @@ // @ts-ignore: Unused imports import {Create as $Create} from "/wails/runtime.js"; +export type BasicCstrAlias = S; + +export type ComparableCstrAlias = R; + export type EmbeddedCustomInterface = string; export type EmbeddedOriginalInterface = string; @@ -17,6 +21,10 @@ export type EmbeddedValue = string; export type EmbeddedValuePtr = string; +export type GoodTildeCstrAlias = U; + +export type InterfaceCstrAlias = Y; + export class Maps { /** * Reject @@ -463,6 +471,286 @@ export class Maps { */ "TPZPtr": { [_: string]: number }; + /** + * Soft reject + */ + "GAR": { [_: string]: number }; + + /** + * Soft reject + */ + "GARPtr": { [_: string]: number }; + + /** + * Accept, hide + */ + "GAS": { [_: string]: number }; + + /** + * Soft reject + */ + "GASPtr": { [_: string]: number }; + + /** + * Soft reject + */ + "GAT": { [_: string]: number }; + + /** + * Soft reject + */ + "GATPtr": { [_: string]: number }; + + /** + * Accept, hide + */ + "GAU": { [_: string]: number }; + + /** + * Soft reject + */ + "GAUPtr": { [_: string]: number }; + + /** + * Accept, hide + */ + "GAV": { [_: string]: number }; + + /** + * Soft reject + */ + "GAVPtr": { [_: string]: number }; + + /** + * Soft reject + */ + "GAW": { [_: string]: number }; + + /** + * Accept, hide + */ + "GAWPtr": { [_: string]: number }; + + /** + * Accept, hide + */ + "GAX": { [_: string]: number }; + + /** + * Soft reject + */ + "GAXPtr": { [_: string]: number }; + + /** + * Accept, hide + */ + "GAY": { [_: string]: number }; + + /** + * Soft reject + */ + "GAYPtr": { [_: string]: number }; + + /** + * Accept, hide + */ + "GAZ": { [_: string]: number }; + + /** + * Soft reject + */ + "GAZPtr": { [_: string]: number }; + + /** + * Accept, hide + */ + "GACi": { [_: `${number}`]: number }; + + /** + * Accept + */ + "GACV": { [_: ComparableCstrAlias]: number }; + + /** + * Reject + */ + "GACP": { [_: string]: number }; + + /** + * Reject + */ + "GACiPtr": { [_: string]: number }; + + /** + * Accept, hide + */ + "GACVPtr": { [_: string]: number }; + + /** + * Accept, hide + */ + "GACPPtr": { [_: string]: number }; + + /** + * Accept, hide + */ + "GABi": { [_: `${number}`]: number }; + + /** + * Accept + */ + "GABs": { [_: BasicCstrAlias]: number }; + + /** + * Reject + */ + "GABiPtr": { [_: string]: number }; + + /** + * Reject + */ + "GABT": { [_: string]: number }; + + /** + * Reject + */ + "GABTPtr": { [_: string]: number }; + + /** + * Accept + */ + "GAGT": { [_: GoodTildeCstrAlias]: number }; + + /** + * Accept, hide + */ + "GAGTPtr": { [_: string]: number }; + + /** + * Accept + */ + "GANBV": { [_: NonBasicCstrAlias]: number }; + + /** + * Accept, hide + */ + "GANBP": { [_: string]: number }; + + /** + * Accept, hide + */ + "GANBVPtr": { [_: string]: number }; + + /** + * Reject + */ + "GANBPPtr": { [_: string]: number }; + + /** + * Accept + */ + "GAPlV1": { [_: PointableCstrAlias]: number }; + + /** + * Accept + */ + "GAPlV2": { [_: PointableCstrAlias]: number }; + + /** + * Reject + */ + "GAPlP1": { [_: string]: number }; + + /** + * Accept + */ + "GAPlP2": { [_: PointableCstrAlias]: number }; + + /** + * Accept, hide + */ + "GAPlVPtr": { [_: string]: number }; + + /** + * Accept, hide + */ + "GAPlPPtr": { [_: string]: number }; + + /** + * Accept, hide + */ + "GAMi": { [_: `${number}`]: number }; + + /** + * Accept + */ + "GAMS": { [_: MixedCstrAlias]: number }; + + /** + * Accept + */ + "GAMV": { [_: MixedCstrAlias]: number }; + + /** + * Reject + */ + "GAMSPtr": { [_: string]: number }; + + /** + * Accept, hide + */ + "GAMVPtr": { [_: string]: number }; + + /** + * Accept, hide + */ + "GAII": { [_: string]: number }; + + /** + * Accept + */ + "GAIV": { [_: InterfaceCstrAlias]: number }; + + /** + * Accept, hide + */ + "GAIP": { [_: string]: number }; + + /** + * Reject + */ + "GAIIPtr": { [_: string]: number }; + + /** + * Accept, hide + */ + "GAIVPtr": { [_: string]: number }; + + /** + * Reject + */ + "GAIPPtr": { [_: string]: number }; + + /** + * Accept, hide + */ + "GAPrV": { [_: string]: number }; + + /** + * Accept, hide + */ + "GAPrP": { [_: string]: number }; + + /** + * Reject + */ + "GAPrVPtr": { [_: string]: number }; + + /** + * Reject + */ + "GAPrPPtr": { [_: string]: number }; + /** Creates a new Maps instance. */ constructor($$source: Partial> = {}) { if (!("Bool" in $$source)) { @@ -732,6 +1020,174 @@ export class Maps { if (!("TPZPtr" in $$source)) { this["TPZPtr"] = {}; } + if (!("GAR" in $$source)) { + this["GAR"] = {}; + } + if (!("GARPtr" in $$source)) { + this["GARPtr"] = {}; + } + if (!("GAS" in $$source)) { + this["GAS"] = {}; + } + if (!("GASPtr" in $$source)) { + this["GASPtr"] = {}; + } + if (!("GAT" in $$source)) { + this["GAT"] = {}; + } + if (!("GATPtr" in $$source)) { + this["GATPtr"] = {}; + } + if (!("GAU" in $$source)) { + this["GAU"] = {}; + } + if (!("GAUPtr" in $$source)) { + this["GAUPtr"] = {}; + } + if (!("GAV" in $$source)) { + this["GAV"] = {}; + } + if (!("GAVPtr" in $$source)) { + this["GAVPtr"] = {}; + } + if (!("GAW" in $$source)) { + this["GAW"] = {}; + } + if (!("GAWPtr" in $$source)) { + this["GAWPtr"] = {}; + } + if (!("GAX" in $$source)) { + this["GAX"] = {}; + } + if (!("GAXPtr" in $$source)) { + this["GAXPtr"] = {}; + } + if (!("GAY" in $$source)) { + this["GAY"] = {}; + } + if (!("GAYPtr" in $$source)) { + this["GAYPtr"] = {}; + } + if (!("GAZ" in $$source)) { + this["GAZ"] = {}; + } + if (!("GAZPtr" in $$source)) { + this["GAZPtr"] = {}; + } + if (!("GACi" in $$source)) { + this["GACi"] = {}; + } + if (!("GACV" in $$source)) { + this["GACV"] = {}; + } + if (!("GACP" in $$source)) { + this["GACP"] = {}; + } + if (!("GACiPtr" in $$source)) { + this["GACiPtr"] = {}; + } + if (!("GACVPtr" in $$source)) { + this["GACVPtr"] = {}; + } + if (!("GACPPtr" in $$source)) { + this["GACPPtr"] = {}; + } + if (!("GABi" in $$source)) { + this["GABi"] = {}; + } + if (!("GABs" in $$source)) { + this["GABs"] = {}; + } + if (!("GABiPtr" in $$source)) { + this["GABiPtr"] = {}; + } + if (!("GABT" in $$source)) { + this["GABT"] = {}; + } + if (!("GABTPtr" in $$source)) { + this["GABTPtr"] = {}; + } + if (!("GAGT" in $$source)) { + this["GAGT"] = {}; + } + if (!("GAGTPtr" in $$source)) { + this["GAGTPtr"] = {}; + } + if (!("GANBV" in $$source)) { + this["GANBV"] = {}; + } + if (!("GANBP" in $$source)) { + this["GANBP"] = {}; + } + if (!("GANBVPtr" in $$source)) { + this["GANBVPtr"] = {}; + } + if (!("GANBPPtr" in $$source)) { + this["GANBPPtr"] = {}; + } + if (!("GAPlV1" in $$source)) { + this["GAPlV1"] = {}; + } + if (!("GAPlV2" in $$source)) { + this["GAPlV2"] = {}; + } + if (!("GAPlP1" in $$source)) { + this["GAPlP1"] = {}; + } + if (!("GAPlP2" in $$source)) { + this["GAPlP2"] = {}; + } + if (!("GAPlVPtr" in $$source)) { + this["GAPlVPtr"] = {}; + } + if (!("GAPlPPtr" in $$source)) { + this["GAPlPPtr"] = {}; + } + if (!("GAMi" in $$source)) { + this["GAMi"] = {}; + } + if (!("GAMS" in $$source)) { + this["GAMS"] = {}; + } + if (!("GAMV" in $$source)) { + this["GAMV"] = {}; + } + if (!("GAMSPtr" in $$source)) { + this["GAMSPtr"] = {}; + } + if (!("GAMVPtr" in $$source)) { + this["GAMVPtr"] = {}; + } + if (!("GAII" in $$source)) { + this["GAII"] = {}; + } + if (!("GAIV" in $$source)) { + this["GAIV"] = {}; + } + if (!("GAIP" in $$source)) { + this["GAIP"] = {}; + } + if (!("GAIIPtr" in $$source)) { + this["GAIIPtr"] = {}; + } + if (!("GAIVPtr" in $$source)) { + this["GAIVPtr"] = {}; + } + if (!("GAIPPtr" in $$source)) { + this["GAIPPtr"] = {}; + } + if (!("GAPrV" in $$source)) { + this["GAPrV"] = {}; + } + if (!("GAPrP" in $$source)) { + this["GAPrP"] = {}; + } + if (!("GAPrVPtr" in $$source)) { + this["GAPrVPtr"] = {}; + } + if (!("GAPrPPtr" in $$source)) { + this["GAPrPPtr"] = {}; + } Object.assign(this, $$source); } @@ -831,6 +1287,62 @@ export class Maps { const $$createField86_0 = $$createType74($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); const $$createField87_0 = $$createType75($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); const $$createField88_0 = $$createType76($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField89_0 = $$createType59($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField90_0 = $$createType60($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField91_0 = $$createType61($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField92_0 = $$createType62($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField93_0 = $$createType63($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField94_0 = $$createType64($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField95_0 = $$createType65($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField96_0 = $$createType66($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField97_0 = $$createType67($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField98_0 = $$createType68($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField99_0 = $$createType69($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField100_0 = $$createType70($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField101_0 = $$createType71($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField102_0 = $$createType72($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField103_0 = $$createType73($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField104_0 = $$createType74($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField105_0 = $$createType75($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField106_0 = $$createType76($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ); + const $$createField107_0 = $$createType1; + const $$createField108_0 = $$createType15; + const $$createField109_0 = $$createType17; + const $$createField110_0 = $$createType8; + const $$createField111_0 = $$createType16; + const $$createField112_0 = $$createType18; + const $$createField113_0 = $$createType1; + const $$createField114_0 = $$createType7; + const $$createField115_0 = $$createType8; + const $$createField116_0 = $$createType77; + const $$createField117_0 = $$createType78; + const $$createField118_0 = $$createType15; + const $$createField119_0 = $$createType16; + const $$createField120_0 = $$createType15; + const $$createField121_0 = $$createType18; + const $$createField122_0 = $$createType16; + const $$createField123_0 = $$createType53; + const $$createField124_0 = $$createType15; + const $$createField125_0 = $$createType16; + const $$createField126_0 = $$createType17; + const $$createField127_0 = $$createType18; + const $$createField128_0 = $$createType16; + const $$createField129_0 = $$createType18; + const $$createField130_0 = $$createType2; + const $$createField131_0 = $$createType42; + const $$createField132_0 = $$createType15; + const $$createField133_0 = $$createType79; + const $$createField134_0 = $$createType16; + const $$createField135_0 = $$createType23; + const $$createField136_0 = $$createType15; + const $$createField137_0 = $$createType18; + const $$createField138_0 = $$createType24; + const $$createField139_0 = $$createType16; + const $$createField140_0 = $$createType53; + const $$createField141_0 = $$createType16; + const $$createField142_0 = $$createType18; + const $$createField143_0 = $$createType48; + const $$createField144_0 = $$createType53; return ($$source: any = {}) => { let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; if ("Bool" in $$parsedSource) { @@ -1100,11 +1612,185 @@ export class Maps { if ("TPZPtr" in $$parsedSource) { $$parsedSource["TPZPtr"] = $$createField88_0($$parsedSource["TPZPtr"]); } + if ("GAR" in $$parsedSource) { + $$parsedSource["GAR"] = $$createField89_0($$parsedSource["GAR"]); + } + if ("GARPtr" in $$parsedSource) { + $$parsedSource["GARPtr"] = $$createField90_0($$parsedSource["GARPtr"]); + } + if ("GAS" in $$parsedSource) { + $$parsedSource["GAS"] = $$createField91_0($$parsedSource["GAS"]); + } + if ("GASPtr" in $$parsedSource) { + $$parsedSource["GASPtr"] = $$createField92_0($$parsedSource["GASPtr"]); + } + if ("GAT" in $$parsedSource) { + $$parsedSource["GAT"] = $$createField93_0($$parsedSource["GAT"]); + } + if ("GATPtr" in $$parsedSource) { + $$parsedSource["GATPtr"] = $$createField94_0($$parsedSource["GATPtr"]); + } + if ("GAU" in $$parsedSource) { + $$parsedSource["GAU"] = $$createField95_0($$parsedSource["GAU"]); + } + if ("GAUPtr" in $$parsedSource) { + $$parsedSource["GAUPtr"] = $$createField96_0($$parsedSource["GAUPtr"]); + } + if ("GAV" in $$parsedSource) { + $$parsedSource["GAV"] = $$createField97_0($$parsedSource["GAV"]); + } + if ("GAVPtr" in $$parsedSource) { + $$parsedSource["GAVPtr"] = $$createField98_0($$parsedSource["GAVPtr"]); + } + if ("GAW" in $$parsedSource) { + $$parsedSource["GAW"] = $$createField99_0($$parsedSource["GAW"]); + } + if ("GAWPtr" in $$parsedSource) { + $$parsedSource["GAWPtr"] = $$createField100_0($$parsedSource["GAWPtr"]); + } + if ("GAX" in $$parsedSource) { + $$parsedSource["GAX"] = $$createField101_0($$parsedSource["GAX"]); + } + if ("GAXPtr" in $$parsedSource) { + $$parsedSource["GAXPtr"] = $$createField102_0($$parsedSource["GAXPtr"]); + } + if ("GAY" in $$parsedSource) { + $$parsedSource["GAY"] = $$createField103_0($$parsedSource["GAY"]); + } + if ("GAYPtr" in $$parsedSource) { + $$parsedSource["GAYPtr"] = $$createField104_0($$parsedSource["GAYPtr"]); + } + if ("GAZ" in $$parsedSource) { + $$parsedSource["GAZ"] = $$createField105_0($$parsedSource["GAZ"]); + } + if ("GAZPtr" in $$parsedSource) { + $$parsedSource["GAZPtr"] = $$createField106_0($$parsedSource["GAZPtr"]); + } + if ("GACi" in $$parsedSource) { + $$parsedSource["GACi"] = $$createField107_0($$parsedSource["GACi"]); + } + if ("GACV" in $$parsedSource) { + $$parsedSource["GACV"] = $$createField108_0($$parsedSource["GACV"]); + } + if ("GACP" in $$parsedSource) { + $$parsedSource["GACP"] = $$createField109_0($$parsedSource["GACP"]); + } + if ("GACiPtr" in $$parsedSource) { + $$parsedSource["GACiPtr"] = $$createField110_0($$parsedSource["GACiPtr"]); + } + if ("GACVPtr" in $$parsedSource) { + $$parsedSource["GACVPtr"] = $$createField111_0($$parsedSource["GACVPtr"]); + } + if ("GACPPtr" in $$parsedSource) { + $$parsedSource["GACPPtr"] = $$createField112_0($$parsedSource["GACPPtr"]); + } + if ("GABi" in $$parsedSource) { + $$parsedSource["GABi"] = $$createField113_0($$parsedSource["GABi"]); + } + if ("GABs" in $$parsedSource) { + $$parsedSource["GABs"] = $$createField114_0($$parsedSource["GABs"]); + } + if ("GABiPtr" in $$parsedSource) { + $$parsedSource["GABiPtr"] = $$createField115_0($$parsedSource["GABiPtr"]); + } + if ("GABT" in $$parsedSource) { + $$parsedSource["GABT"] = $$createField116_0($$parsedSource["GABT"]); + } + if ("GABTPtr" in $$parsedSource) { + $$parsedSource["GABTPtr"] = $$createField117_0($$parsedSource["GABTPtr"]); + } + if ("GAGT" in $$parsedSource) { + $$parsedSource["GAGT"] = $$createField118_0($$parsedSource["GAGT"]); + } + if ("GAGTPtr" in $$parsedSource) { + $$parsedSource["GAGTPtr"] = $$createField119_0($$parsedSource["GAGTPtr"]); + } + if ("GANBV" in $$parsedSource) { + $$parsedSource["GANBV"] = $$createField120_0($$parsedSource["GANBV"]); + } + if ("GANBP" in $$parsedSource) { + $$parsedSource["GANBP"] = $$createField121_0($$parsedSource["GANBP"]); + } + if ("GANBVPtr" in $$parsedSource) { + $$parsedSource["GANBVPtr"] = $$createField122_0($$parsedSource["GANBVPtr"]); + } + if ("GANBPPtr" in $$parsedSource) { + $$parsedSource["GANBPPtr"] = $$createField123_0($$parsedSource["GANBPPtr"]); + } + if ("GAPlV1" in $$parsedSource) { + $$parsedSource["GAPlV1"] = $$createField124_0($$parsedSource["GAPlV1"]); + } + if ("GAPlV2" in $$parsedSource) { + $$parsedSource["GAPlV2"] = $$createField125_0($$parsedSource["GAPlV2"]); + } + if ("GAPlP1" in $$parsedSource) { + $$parsedSource["GAPlP1"] = $$createField126_0($$parsedSource["GAPlP1"]); + } + if ("GAPlP2" in $$parsedSource) { + $$parsedSource["GAPlP2"] = $$createField127_0($$parsedSource["GAPlP2"]); + } + if ("GAPlVPtr" in $$parsedSource) { + $$parsedSource["GAPlVPtr"] = $$createField128_0($$parsedSource["GAPlVPtr"]); + } + if ("GAPlPPtr" in $$parsedSource) { + $$parsedSource["GAPlPPtr"] = $$createField129_0($$parsedSource["GAPlPPtr"]); + } + if ("GAMi" in $$parsedSource) { + $$parsedSource["GAMi"] = $$createField130_0($$parsedSource["GAMi"]); + } + if ("GAMS" in $$parsedSource) { + $$parsedSource["GAMS"] = $$createField131_0($$parsedSource["GAMS"]); + } + if ("GAMV" in $$parsedSource) { + $$parsedSource["GAMV"] = $$createField132_0($$parsedSource["GAMV"]); + } + if ("GAMSPtr" in $$parsedSource) { + $$parsedSource["GAMSPtr"] = $$createField133_0($$parsedSource["GAMSPtr"]); + } + if ("GAMVPtr" in $$parsedSource) { + $$parsedSource["GAMVPtr"] = $$createField134_0($$parsedSource["GAMVPtr"]); + } + if ("GAII" in $$parsedSource) { + $$parsedSource["GAII"] = $$createField135_0($$parsedSource["GAII"]); + } + if ("GAIV" in $$parsedSource) { + $$parsedSource["GAIV"] = $$createField136_0($$parsedSource["GAIV"]); + } + if ("GAIP" in $$parsedSource) { + $$parsedSource["GAIP"] = $$createField137_0($$parsedSource["GAIP"]); + } + if ("GAIIPtr" in $$parsedSource) { + $$parsedSource["GAIIPtr"] = $$createField138_0($$parsedSource["GAIIPtr"]); + } + if ("GAIVPtr" in $$parsedSource) { + $$parsedSource["GAIVPtr"] = $$createField139_0($$parsedSource["GAIVPtr"]); + } + if ("GAIPPtr" in $$parsedSource) { + $$parsedSource["GAIPPtr"] = $$createField140_0($$parsedSource["GAIPPtr"]); + } + if ("GAPrV" in $$parsedSource) { + $$parsedSource["GAPrV"] = $$createField141_0($$parsedSource["GAPrV"]); + } + if ("GAPrP" in $$parsedSource) { + $$parsedSource["GAPrP"] = $$createField142_0($$parsedSource["GAPrP"]); + } + if ("GAPrVPtr" in $$parsedSource) { + $$parsedSource["GAPrVPtr"] = $$createField143_0($$parsedSource["GAPrVPtr"]); + } + if ("GAPrPPtr" in $$parsedSource) { + $$parsedSource["GAPrPPtr"] = $$createField144_0($$parsedSource["GAPrPPtr"]); + } return new Maps($$parsedSource as Partial>); }; } } +export type MixedCstrAlias = X; + +export type NonBasicCstrAlias = V; + +export type PointableCstrAlias = W; + export type PointerAlias = PointerTextMarshaler; export type PointerTextMarshaler = string; @@ -1195,3 +1881,6 @@ const $$createType73 = ($$createParamR, $$createParamS, $$createParamT, $$create const $$createType74 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); const $$createType75 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); const $$createType76 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); +const $$createType77 = $Create.Map($Create.Any, $Create.Any); +const $$createType78 = $Create.Map($Create.Any, $Create.Any); +const $$createType79 = $Create.Map($Create.Any, $Create.Any); diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/warnings.log b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/warnings.log index dbefd8749..e802b6b63 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/warnings.log +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/warnings.log @@ -33,11 +33,34 @@ package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type bool is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type complex64 is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type float32 is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.BadTildeCstrAlias[T] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.BadTildeCstrAlias[struct{}] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.BadTildeCstrPtrAlias[T] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.BadTildeCstrPtrAlias[struct{}] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.BasicCstrPtrAlias[S] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.BasicCstrPtrAlias[int] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.ComparableCstrAlias[R] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.ComparableCstrAlias[github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerTextMarshaler] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.ComparableCstrPtrAlias[R] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.ComparableCstrPtrAlias[int] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.EmbeddedPointer is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.GoodTildeCstrPtrAlias[U] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.InterfaceCstrPtrAlias[*github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerTextMarshaler] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.InterfaceCstrPtrAlias[Y] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.InterfaceCstrPtrAlias[encoding.TextMarshaler] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.InterfacePtrAlias is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.InterfacePtrType is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.MixedCstrPtrAlias[X] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.MixedCstrPtrAlias[github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.StringType] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.NonBasicCstrPtrAlias[*github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerTextMarshaler] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.NonBasicCstrPtrAlias[V] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.NonTextMarshaler is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointableCstrAlias[W] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointableCstrAlias[github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerTextMarshaler] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerAlias is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerCstrPtrAlias[R, Z] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerCstrPtrAlias[github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerTextMarshaler, *github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerTextMarshaler] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerCstrPtrAlias[github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.ValueTextMarshaler, *github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.ValueTextMarshaler] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerPtrType is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerTextMarshaler is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerType is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.ts index 85e56fa47..8f77379d9 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.ts @@ -47,6 +47,11 @@ export function GetButForeignPrivateAlias(): Promise & { cancel(): void } { + let $resultPromise = $Call.ByID(914093800) as any; + return $resultPromise; +} + /** * Greet a lot of unusual things. */ diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/index.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/index.ts index dc8c81e2a..75cbdc737 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/index.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/index.ts @@ -8,12 +8,19 @@ export { export type { Alias, + AliasGroup, AliasStruct, AliasedPerson, EmptyAliasStruct, EmptyStruct, + GenericAlias, + GenericMapAlias, GenericPerson, + GenericPersonAlias, + GenericPtrAlias, + IndirectPersonAlias, OtherAliasStruct, Person, - StrangelyAliasedPerson + StrangelyAliasedPerson, + TPIndirectPersonAlias } from "./models.js"; diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/models.ts index e5b3f2b1b..26b204c1f 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/models.ts @@ -6,6 +6,20 @@ */ export type Alias = number; +/** + * A class whose fields have various aliased types. + */ +export interface AliasGroup { + "GAi": GenericAlias; + "GAP": GenericAlias>; + "GPAs": GenericPtrAlias; + "GPAP": GenericPtrAlias>; + "GMA": GenericMapAlias; + "GPA": GenericPersonAlias; + "IPA": IndirectPersonAlias; + "TPIPA": TPIndirectPersonAlias; +} + /** * A struct alias. * This should be rendered as a typedef or interface in every mode. @@ -45,6 +59,16 @@ export interface EmptyAliasStruct { export interface EmptyStruct { } +/** + * A generic alias that forwards to a type parameter. + */ +export type GenericAlias = T; + +/** + * A generic alias that wraps a map. + */ +export type GenericMapAlias = { [_: string]: U } | null; + /** * A generic struct containing an alias. */ @@ -53,6 +77,21 @@ export interface GenericPerson { "AliasedField": Alias; } +/** + * A generic alias that wraps a generic struct. + */ +export type GenericPersonAlias = GenericPerson[] | null>; + +/** + * A generic alias that wraps a pointer type. + */ +export type GenericPtrAlias = GenericAlias | null; + +/** + * An alias that wraps a class through a non-typeparam alias. + */ +export type IndirectPersonAlias = GenericPersonAlias; + /** * Another struct alias. */ @@ -79,3 +118,8 @@ export interface Person { * Another class alias, but ordered after its aliased class. */ export type StrangelyAliasedPerson = Person; + +/** + * An alias that wraps a class through a typeparam alias. + */ +export type TPIndirectPersonAlias = GenericAlias>; diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/index.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/index.ts index 1dcdadc91..e3aeb8a64 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/index.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/index.ts @@ -7,13 +7,20 @@ export { }; export type { + BasicCstrAlias, + ComparableCstrAlias, EmbeddedCustomInterface, EmbeddedOriginalInterface, EmbeddedPointer, EmbeddedPointerPtr, EmbeddedValue, EmbeddedValuePtr, + GoodTildeCstrAlias, + InterfaceCstrAlias, Maps, + MixedCstrAlias, + NonBasicCstrAlias, + PointableCstrAlias, PointerAlias, PointerTextMarshaler, StringAlias, diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/models.ts index 9a9db9f4a..aaabd3502 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/models.ts @@ -1,6 +1,10 @@ // Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL // This file is automatically generated. DO NOT EDIT +export type BasicCstrAlias = S; + +export type ComparableCstrAlias = R; + export type EmbeddedCustomInterface = string; export type EmbeddedOriginalInterface = string; @@ -13,6 +17,10 @@ export type EmbeddedValue = string; export type EmbeddedValuePtr = string; +export type GoodTildeCstrAlias = U; + +export type InterfaceCstrAlias = Y; + export interface Maps { /** * Reject @@ -458,8 +466,294 @@ export interface Maps { * Soft reject */ "TPZPtr": { [_: string]: number } | null; + + /** + * Soft reject + */ + "GAR": { [_: string]: number } | null; + + /** + * Soft reject + */ + "GARPtr": { [_: string]: number } | null; + + /** + * Accept, hide + */ + "GAS": { [_: string]: number } | null; + + /** + * Soft reject + */ + "GASPtr": { [_: string]: number } | null; + + /** + * Soft reject + */ + "GAT": { [_: string]: number } | null; + + /** + * Soft reject + */ + "GATPtr": { [_: string]: number } | null; + + /** + * Accept, hide + */ + "GAU": { [_: string]: number } | null; + + /** + * Soft reject + */ + "GAUPtr": { [_: string]: number } | null; + + /** + * Accept, hide + */ + "GAV": { [_: string]: number } | null; + + /** + * Soft reject + */ + "GAVPtr": { [_: string]: number } | null; + + /** + * Soft reject + */ + "GAW": { [_: string]: number } | null; + + /** + * Accept, hide + */ + "GAWPtr": { [_: string]: number } | null; + + /** + * Accept, hide + */ + "GAX": { [_: string]: number } | null; + + /** + * Soft reject + */ + "GAXPtr": { [_: string]: number } | null; + + /** + * Accept, hide + */ + "GAY": { [_: string]: number } | null; + + /** + * Soft reject + */ + "GAYPtr": { [_: string]: number } | null; + + /** + * Accept, hide + */ + "GAZ": { [_: string]: number } | null; + + /** + * Soft reject + */ + "GAZPtr": { [_: string]: number } | null; + + /** + * Accept, hide + */ + "GACi": { [_: `${number}`]: number } | null; + + /** + * Accept + */ + "GACV": { [_: ComparableCstrAlias]: number } | null; + + /** + * Reject + */ + "GACP": { [_: string]: number } | null; + + /** + * Reject + */ + "GACiPtr": { [_: string]: number } | null; + + /** + * Accept, hide + */ + "GACVPtr": { [_: string]: number } | null; + + /** + * Accept, hide + */ + "GACPPtr": { [_: string]: number } | null; + + /** + * Accept, hide + */ + "GABi": { [_: `${number}`]: number } | null; + + /** + * Accept + */ + "GABs": { [_: BasicCstrAlias]: number } | null; + + /** + * Reject + */ + "GABiPtr": { [_: string]: number } | null; + + /** + * Reject + */ + "GABT": { [_: string]: number } | null; + + /** + * Reject + */ + "GABTPtr": { [_: string]: number } | null; + + /** + * Accept + */ + "GAGT": { [_: GoodTildeCstrAlias]: number } | null; + + /** + * Accept, hide + */ + "GAGTPtr": { [_: string]: number } | null; + + /** + * Accept + */ + "GANBV": { [_: NonBasicCstrAlias]: number } | null; + + /** + * Accept, hide + */ + "GANBP": { [_: string]: number } | null; + + /** + * Accept, hide + */ + "GANBVPtr": { [_: string]: number } | null; + + /** + * Reject + */ + "GANBPPtr": { [_: string]: number } | null; + + /** + * Accept + */ + "GAPlV1": { [_: PointableCstrAlias]: number } | null; + + /** + * Accept + */ + "GAPlV2": { [_: PointableCstrAlias]: number } | null; + + /** + * Reject + */ + "GAPlP1": { [_: string]: number } | null; + + /** + * Accept + */ + "GAPlP2": { [_: PointableCstrAlias]: number } | null; + + /** + * Accept, hide + */ + "GAPlVPtr": { [_: string]: number } | null; + + /** + * Accept, hide + */ + "GAPlPPtr": { [_: string]: number } | null; + + /** + * Accept, hide + */ + "GAMi": { [_: `${number}`]: number } | null; + + /** + * Accept + */ + "GAMS": { [_: MixedCstrAlias]: number } | null; + + /** + * Accept + */ + "GAMV": { [_: MixedCstrAlias]: number } | null; + + /** + * Reject + */ + "GAMSPtr": { [_: string]: number } | null; + + /** + * Accept, hide + */ + "GAMVPtr": { [_: string]: number } | null; + + /** + * Accept, hide + */ + "GAII": { [_: string]: number } | null; + + /** + * Accept + */ + "GAIV": { [_: InterfaceCstrAlias]: number } | null; + + /** + * Accept, hide + */ + "GAIP": { [_: string]: number } | null; + + /** + * Reject + */ + "GAIIPtr": { [_: string]: number } | null; + + /** + * Accept, hide + */ + "GAIVPtr": { [_: string]: number } | null; + + /** + * Reject + */ + "GAIPPtr": { [_: string]: number } | null; + + /** + * Accept, hide + */ + "GAPrV": { [_: string]: number } | null; + + /** + * Accept, hide + */ + "GAPrP": { [_: string]: number } | null; + + /** + * Reject + */ + "GAPrVPtr": { [_: string]: number } | null; + + /** + * Reject + */ + "GAPrPPtr": { [_: string]: number } | null; } +export type MixedCstrAlias = X; + +export type NonBasicCstrAlias = V; + +export type PointableCstrAlias = W; + export type PointerAlias = PointerTextMarshaler; export type PointerTextMarshaler = string; diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/warnings.log b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/warnings.log index dbefd8749..e802b6b63 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/warnings.log +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/warnings.log @@ -33,11 +33,34 @@ package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type bool is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type complex64 is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type float32 is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.BadTildeCstrAlias[T] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.BadTildeCstrAlias[struct{}] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.BadTildeCstrPtrAlias[T] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.BadTildeCstrPtrAlias[struct{}] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.BasicCstrPtrAlias[S] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.BasicCstrPtrAlias[int] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.ComparableCstrAlias[R] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.ComparableCstrAlias[github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerTextMarshaler] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.ComparableCstrPtrAlias[R] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.ComparableCstrPtrAlias[int] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.EmbeddedPointer is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.GoodTildeCstrPtrAlias[U] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.InterfaceCstrPtrAlias[*github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerTextMarshaler] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.InterfaceCstrPtrAlias[Y] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.InterfaceCstrPtrAlias[encoding.TextMarshaler] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.InterfacePtrAlias is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.InterfacePtrType is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.MixedCstrPtrAlias[X] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.MixedCstrPtrAlias[github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.StringType] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.NonBasicCstrPtrAlias[*github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerTextMarshaler] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.NonBasicCstrPtrAlias[V] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.NonTextMarshaler is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointableCstrAlias[W] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointableCstrAlias[github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerTextMarshaler] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerAlias is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerCstrPtrAlias[R, Z] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerCstrPtrAlias[github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerTextMarshaler, *github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerTextMarshaler] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerCstrPtrAlias[github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.ValueTextMarshaler, *github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.ValueTextMarshaler] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerPtrType is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerTextMarshaler is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerType is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.ts index a07b47c37..0b074ac0b 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.ts @@ -47,6 +47,11 @@ export function GetButForeignPrivateAlias(): Promise & { cancel(): void } { + let $resultPromise = $Call.ByName("main.GreetService.GetButGenericAliases") as any; + return $resultPromise; +} + /** * Greet a lot of unusual things. */ diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/index.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/index.ts index dc8c81e2a..75cbdc737 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/index.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/index.ts @@ -8,12 +8,19 @@ export { export type { Alias, + AliasGroup, AliasStruct, AliasedPerson, EmptyAliasStruct, EmptyStruct, + GenericAlias, + GenericMapAlias, GenericPerson, + GenericPersonAlias, + GenericPtrAlias, + IndirectPersonAlias, OtherAliasStruct, Person, - StrangelyAliasedPerson + StrangelyAliasedPerson, + TPIndirectPersonAlias } from "./models.js"; diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/models.ts index e5b3f2b1b..26b204c1f 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/models.ts @@ -6,6 +6,20 @@ */ export type Alias = number; +/** + * A class whose fields have various aliased types. + */ +export interface AliasGroup { + "GAi": GenericAlias; + "GAP": GenericAlias>; + "GPAs": GenericPtrAlias; + "GPAP": GenericPtrAlias>; + "GMA": GenericMapAlias; + "GPA": GenericPersonAlias; + "IPA": IndirectPersonAlias; + "TPIPA": TPIndirectPersonAlias; +} + /** * A struct alias. * This should be rendered as a typedef or interface in every mode. @@ -45,6 +59,16 @@ export interface EmptyAliasStruct { export interface EmptyStruct { } +/** + * A generic alias that forwards to a type parameter. + */ +export type GenericAlias = T; + +/** + * A generic alias that wraps a map. + */ +export type GenericMapAlias = { [_: string]: U } | null; + /** * A generic struct containing an alias. */ @@ -53,6 +77,21 @@ export interface GenericPerson { "AliasedField": Alias; } +/** + * A generic alias that wraps a generic struct. + */ +export type GenericPersonAlias = GenericPerson[] | null>; + +/** + * A generic alias that wraps a pointer type. + */ +export type GenericPtrAlias = GenericAlias | null; + +/** + * An alias that wraps a class through a non-typeparam alias. + */ +export type IndirectPersonAlias = GenericPersonAlias; + /** * Another struct alias. */ @@ -79,3 +118,8 @@ export interface Person { * Another class alias, but ordered after its aliased class. */ export type StrangelyAliasedPerson = Person; + +/** + * An alias that wraps a class through a typeparam alias. + */ +export type TPIndirectPersonAlias = GenericAlias>; diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/index.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/index.ts index 1dcdadc91..e3aeb8a64 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/index.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/index.ts @@ -7,13 +7,20 @@ export { }; export type { + BasicCstrAlias, + ComparableCstrAlias, EmbeddedCustomInterface, EmbeddedOriginalInterface, EmbeddedPointer, EmbeddedPointerPtr, EmbeddedValue, EmbeddedValuePtr, + GoodTildeCstrAlias, + InterfaceCstrAlias, Maps, + MixedCstrAlias, + NonBasicCstrAlias, + PointableCstrAlias, PointerAlias, PointerTextMarshaler, StringAlias, diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/models.ts index 9a9db9f4a..aaabd3502 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/models.ts @@ -1,6 +1,10 @@ // Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL // This file is automatically generated. DO NOT EDIT +export type BasicCstrAlias = S; + +export type ComparableCstrAlias = R; + export type EmbeddedCustomInterface = string; export type EmbeddedOriginalInterface = string; @@ -13,6 +17,10 @@ export type EmbeddedValue = string; export type EmbeddedValuePtr = string; +export type GoodTildeCstrAlias = U; + +export type InterfaceCstrAlias = Y; + export interface Maps { /** * Reject @@ -458,8 +466,294 @@ export interface Maps { * Soft reject */ "TPZPtr": { [_: string]: number } | null; + + /** + * Soft reject + */ + "GAR": { [_: string]: number } | null; + + /** + * Soft reject + */ + "GARPtr": { [_: string]: number } | null; + + /** + * Accept, hide + */ + "GAS": { [_: string]: number } | null; + + /** + * Soft reject + */ + "GASPtr": { [_: string]: number } | null; + + /** + * Soft reject + */ + "GAT": { [_: string]: number } | null; + + /** + * Soft reject + */ + "GATPtr": { [_: string]: number } | null; + + /** + * Accept, hide + */ + "GAU": { [_: string]: number } | null; + + /** + * Soft reject + */ + "GAUPtr": { [_: string]: number } | null; + + /** + * Accept, hide + */ + "GAV": { [_: string]: number } | null; + + /** + * Soft reject + */ + "GAVPtr": { [_: string]: number } | null; + + /** + * Soft reject + */ + "GAW": { [_: string]: number } | null; + + /** + * Accept, hide + */ + "GAWPtr": { [_: string]: number } | null; + + /** + * Accept, hide + */ + "GAX": { [_: string]: number } | null; + + /** + * Soft reject + */ + "GAXPtr": { [_: string]: number } | null; + + /** + * Accept, hide + */ + "GAY": { [_: string]: number } | null; + + /** + * Soft reject + */ + "GAYPtr": { [_: string]: number } | null; + + /** + * Accept, hide + */ + "GAZ": { [_: string]: number } | null; + + /** + * Soft reject + */ + "GAZPtr": { [_: string]: number } | null; + + /** + * Accept, hide + */ + "GACi": { [_: `${number}`]: number } | null; + + /** + * Accept + */ + "GACV": { [_: ComparableCstrAlias]: number } | null; + + /** + * Reject + */ + "GACP": { [_: string]: number } | null; + + /** + * Reject + */ + "GACiPtr": { [_: string]: number } | null; + + /** + * Accept, hide + */ + "GACVPtr": { [_: string]: number } | null; + + /** + * Accept, hide + */ + "GACPPtr": { [_: string]: number } | null; + + /** + * Accept, hide + */ + "GABi": { [_: `${number}`]: number } | null; + + /** + * Accept + */ + "GABs": { [_: BasicCstrAlias]: number } | null; + + /** + * Reject + */ + "GABiPtr": { [_: string]: number } | null; + + /** + * Reject + */ + "GABT": { [_: string]: number } | null; + + /** + * Reject + */ + "GABTPtr": { [_: string]: number } | null; + + /** + * Accept + */ + "GAGT": { [_: GoodTildeCstrAlias]: number } | null; + + /** + * Accept, hide + */ + "GAGTPtr": { [_: string]: number } | null; + + /** + * Accept + */ + "GANBV": { [_: NonBasicCstrAlias]: number } | null; + + /** + * Accept, hide + */ + "GANBP": { [_: string]: number } | null; + + /** + * Accept, hide + */ + "GANBVPtr": { [_: string]: number } | null; + + /** + * Reject + */ + "GANBPPtr": { [_: string]: number } | null; + + /** + * Accept + */ + "GAPlV1": { [_: PointableCstrAlias]: number } | null; + + /** + * Accept + */ + "GAPlV2": { [_: PointableCstrAlias]: number } | null; + + /** + * Reject + */ + "GAPlP1": { [_: string]: number } | null; + + /** + * Accept + */ + "GAPlP2": { [_: PointableCstrAlias]: number } | null; + + /** + * Accept, hide + */ + "GAPlVPtr": { [_: string]: number } | null; + + /** + * Accept, hide + */ + "GAPlPPtr": { [_: string]: number } | null; + + /** + * Accept, hide + */ + "GAMi": { [_: `${number}`]: number } | null; + + /** + * Accept + */ + "GAMS": { [_: MixedCstrAlias]: number } | null; + + /** + * Accept + */ + "GAMV": { [_: MixedCstrAlias]: number } | null; + + /** + * Reject + */ + "GAMSPtr": { [_: string]: number } | null; + + /** + * Accept, hide + */ + "GAMVPtr": { [_: string]: number } | null; + + /** + * Accept, hide + */ + "GAII": { [_: string]: number } | null; + + /** + * Accept + */ + "GAIV": { [_: InterfaceCstrAlias]: number } | null; + + /** + * Accept, hide + */ + "GAIP": { [_: string]: number } | null; + + /** + * Reject + */ + "GAIIPtr": { [_: string]: number } | null; + + /** + * Accept, hide + */ + "GAIVPtr": { [_: string]: number } | null; + + /** + * Reject + */ + "GAIPPtr": { [_: string]: number } | null; + + /** + * Accept, hide + */ + "GAPrV": { [_: string]: number } | null; + + /** + * Accept, hide + */ + "GAPrP": { [_: string]: number } | null; + + /** + * Reject + */ + "GAPrVPtr": { [_: string]: number } | null; + + /** + * Reject + */ + "GAPrPPtr": { [_: string]: number } | null; } +export type MixedCstrAlias = X; + +export type NonBasicCstrAlias = V; + +export type PointableCstrAlias = W; + export type PointerAlias = PointerTextMarshaler; export type PointerTextMarshaler = string; diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/warnings.log b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/warnings.log index dbefd8749..e802b6b63 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/warnings.log +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/warnings.log @@ -33,11 +33,34 @@ package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type bool is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type complex64 is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type float32 is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.BadTildeCstrAlias[T] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.BadTildeCstrAlias[struct{}] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.BadTildeCstrPtrAlias[T] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.BadTildeCstrPtrAlias[struct{}] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.BasicCstrPtrAlias[S] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.BasicCstrPtrAlias[int] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.ComparableCstrAlias[R] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.ComparableCstrAlias[github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerTextMarshaler] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.ComparableCstrPtrAlias[R] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.ComparableCstrPtrAlias[int] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.EmbeddedPointer is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.GoodTildeCstrPtrAlias[U] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.InterfaceCstrPtrAlias[*github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerTextMarshaler] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.InterfaceCstrPtrAlias[Y] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.InterfaceCstrPtrAlias[encoding.TextMarshaler] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.InterfacePtrAlias is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.InterfacePtrType is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.MixedCstrPtrAlias[X] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.MixedCstrPtrAlias[github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.StringType] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.NonBasicCstrPtrAlias[*github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerTextMarshaler] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.NonBasicCstrPtrAlias[V] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.NonTextMarshaler is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointableCstrAlias[W] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointableCstrAlias[github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerTextMarshaler] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerAlias is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerCstrPtrAlias[R, Z] is used as a map key, but some of its instantiations might not implement encoding.TextMarshaler: this might result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerCstrPtrAlias[github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerTextMarshaler, *github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerTextMarshaler] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors +package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerCstrPtrAlias[github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.ValueTextMarshaler, *github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.ValueTextMarshaler] is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerPtrType is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerTextMarshaler is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors package github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys: type github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys.PointerType is used as a map key, but does not implement encoding.TextMarshaler: this will likely result in runtime errors From 183abde39433854885d7ad292ea347a08513b597 Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Thu, 27 Feb 2025 20:22:29 +0000 Subject: [PATCH 107/374] [skip ci] Publish @wailsio/runtime v3.0.0-alpha.63 --- .../docs/classes/Call.RuntimeError.html | 4 +-- .../docs/classes/Events.WailsEvent.html | 4 +-- .../docs/functions/Application.Hide.html | 2 +- .../docs/functions/Application.Quit.html | 2 +- .../docs/functions/Application.Show.html | 2 +- .../docs/functions/Browser.OpenURL.html | 2 +- .../runtime/docs/functions/Call.ByID.html | 2 +- .../runtime/docs/functions/Call.ByName.html | 2 +- .../runtime/docs/functions/Call.Call.html | 2 +- .../docs/functions/Clipboard.SetText.html | 2 +- .../docs/functions/Clipboard.Text.html | 2 +- .../runtime/docs/functions/Create.Any.html | 2 +- .../runtime/docs/functions/Create.Array.html | 2 +- .../docs/functions/Create.ByteSlice.html | 2 +- .../runtime/docs/functions/Create.Map.html | 2 +- .../docs/functions/Create.Nullable.html | 2 +- .../runtime/docs/functions/Create.Struct.html | 2 +- .../runtime/docs/functions/Dialogs.Error.html | 2 +- .../runtime/docs/functions/Dialogs.Info.html | 2 +- .../docs/functions/Dialogs.OpenFile.html | 2 +- .../docs/functions/Dialogs.Question.html | 2 +- .../docs/functions/Dialogs.SaveFile.html | 2 +- .../docs/functions/Dialogs.Warning.html | 2 +- .../runtime/docs/functions/Events.Emit.html | 2 +- .../runtime/docs/functions/Events.Off.html | 2 +- .../runtime/docs/functions/Events.OffAll.html | 2 +- .../runtime/docs/functions/Events.On.html | 2 +- .../docs/functions/Events.OnMultiple.html | 2 +- .../runtime/docs/functions/Events.Once.html | 2 +- .../runtime/docs/functions/Events.setup.html | 2 +- .../runtime/docs/functions/Flags.GetFlag.html | 2 +- .../docs/functions/Screens.GetAll.html | 2 +- .../docs/functions/Screens.GetCurrent.html | 2 +- .../docs/functions/Screens.GetPrimary.html | 2 +- .../docs/functions/System.Capabilities.html | 2 +- .../docs/functions/System.Environment.html | 2 +- .../docs/functions/System.IsAMD64.html | 2 +- .../runtime/docs/functions/System.IsARM.html | 2 +- .../docs/functions/System.IsARM64.html | 2 +- .../docs/functions/System.IsDarkMode.html | 2 +- .../docs/functions/System.IsDebug.html | 2 +- .../docs/functions/System.IsLinux.html | 2 +- .../runtime/docs/functions/System.IsMac.html | 2 +- .../docs/functions/System.IsWindows.html | 2 +- .../runtime/docs/functions/System.invoke.html | 2 +- .../runtime/docs/functions/WML.Enable.html | 2 +- .../runtime/docs/functions/WML.Reload.html | 2 +- .../@wailsio/runtime/docs/functions/init.html | 2 +- .../docs/interfaces/Call.CallOptions.html | 8 ++--- .../docs/interfaces/Dialogs.Button.html | 8 ++--- .../docs/interfaces/Dialogs.FileFilter.html | 6 ++-- .../Dialogs.MessageDialogOptions.html | 10 +++--- .../Dialogs.OpenFileDialogOptions.html | 34 +++++++++--------- .../Dialogs.SaveFileDialogOptions.html | 36 +++++++++---------- .../runtime/docs/interfaces/Screens.Rect.html | 10 +++--- .../docs/interfaces/Screens.Screen.html | 26 +++++++------- .../runtime/docs/interfaces/Screens.Size.html | 6 ++-- .../interfaces/System.EnvironmentInfo.html | 12 +++---- .../docs/interfaces/System.OSInfo.html | 10 +++--- .../runtime/docs/modules/Application.html | 2 +- .../runtime/docs/modules/Browser.html | 2 +- .../@wailsio/runtime/docs/modules/Call.html | 2 +- .../runtime/docs/modules/Clipboard.html | 2 +- .../@wailsio/runtime/docs/modules/Create.html | 2 +- .../runtime/docs/modules/Dialogs.html | 2 +- .../@wailsio/runtime/docs/modules/Events.html | 2 +- .../@wailsio/runtime/docs/modules/Flags.html | 2 +- .../runtime/docs/modules/Screens.html | 2 +- .../@wailsio/runtime/docs/modules/System.html | 2 +- .../@wailsio/runtime/docs/modules/WML.html | 2 +- .../runtime/docs/variables/Events.Types.html | 2 +- .../runtime/docs/variables/Window.html | 2 +- .../@wailsio/runtime/package-lock.json | 4 +-- .../desktop/@wailsio/runtime/package.json | 2 +- 74 files changed, 149 insertions(+), 149 deletions(-) diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Call.RuntimeError.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Call.RuntimeError.html index 48388cf63..602369672 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Call.RuntimeError.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Call.RuntimeError.html @@ -1,6 +1,6 @@ RuntimeError | @wailsio/runtime

    Exception class that will be thrown in case the bound method returns an error. The value of the RuntimeError#name property is "RuntimeError".

    -

    Hierarchy

    • Error
      • RuntimeError

    Constructors

    Hierarchy

    • Error
      • RuntimeError

    Constructors

    Properties

    cause? message name @@ -8,4 +8,4 @@ The value of the

    Constructors

    • Constructs a new RuntimeError instance.

      Parameters

      • message: string

        The error message.

      • Rest ...args: any[]

        Optional arguments for the Error constructor.

        -

      Returns RuntimeError

    Properties

    cause?: unknown
    message: string
    name: string
    stack?: string

    Generated using TypeDoc

    \ No newline at end of file +

    Returns RuntimeError

    Properties

    cause?: unknown
    message: string
    name: string
    stack?: string

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Events.WailsEvent.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Events.WailsEvent.html index 371bf58dc..4689be5ee 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Events.WailsEvent.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Events.WailsEvent.html @@ -1,4 +1,4 @@ -WailsEvent | @wailsio/runtime

    Constructors

    constructor +WailsEvent | @wailsio/runtime

    Constructors

    Properties

    Constructors

    Properties

    data: any
    name: any

    Generated using TypeDoc

    \ No newline at end of file +

    Constructors

    Properties

    data: any
    name: any

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Hide.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Hide.html index cebce5498..65cd5a1e9 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Hide.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Hide.html @@ -1,2 +1,2 @@ Hide | @wailsio/runtime
    • Hides a certain method by calling the HideMethod function.

      -

      Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file +

    Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Quit.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Quit.html index de8a503bb..49980fd4b 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Quit.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Quit.html @@ -1,2 +1,2 @@ Quit | @wailsio/runtime
    • Calls the QuitMethod to terminate the program.

      -

      Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file +

    Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Show.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Show.html index ae90eed04..cf34da36a 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Show.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Show.html @@ -1,2 +1,2 @@ Show | @wailsio/runtime
    • Calls the ShowMethod and returns the result.

      -

      Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file +

    Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Browser.OpenURL.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Browser.OpenURL.html index 6a7c37f35..b9b6da401 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Browser.OpenURL.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Browser.OpenURL.html @@ -1,3 +1,3 @@ OpenURL | @wailsio/runtime
    • Open a browser window to the given URL

      Parameters

      • url: string

        The URL to open

        -

      Returns Promise<string>

    Generated using TypeDoc

    \ No newline at end of file +

    Returns Promise<string>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByID.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByID.html index d10964bc5..e990592a5 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByID.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByID.html @@ -5,4 +5,4 @@ See Call for details.

    Returns Promise<any>

    • The result of the method call.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByName.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByName.html index e4a3fc69c..dd557eb7d 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByName.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByName.html @@ -3,4 +3,4 @@ See Call for details.

    Parameters

    • methodName: string

      The name of the method in the format 'package.struct.method'.

    • Rest ...args: any[]

      The arguments to pass to the method.

    Returns Promise<any>

    The result of the method call.

    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.Call.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.Call.html index 1c0da1bb0..09da4e257 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.Call.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.Call.html @@ -8,4 +8,4 @@ by the application- or service-level error marshaling functions.

    Returns Promise<any>

    • The result of the call.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.SetText.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.SetText.html index b1aaab33a..78251cceb 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.SetText.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.SetText.html @@ -3,4 +3,4 @@

    Returns Promise<any>

    • A Promise that resolves when the operation is successful.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.Text.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.Text.html index 5380aae54..f71287cc9 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.Text.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.Text.html @@ -1,3 +1,3 @@ Text | @wailsio/runtime
    • Get the Clipboard text

      Returns Promise<string>

      A promise that resolves with the text from the Clipboard.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Any.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Any.html index 9aad4ab64..940f9fbd5 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Any.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Any.html @@ -1,2 +1,2 @@ Any | @wailsio/runtime
    • Any is a dummy creation function for simple or unknown types.

      -

      Type Parameters

      • T

      Parameters

      • source: any

      Returns T

    Generated using TypeDoc

    \ No newline at end of file +

    Type Parameters

    • T

    Parameters

    • source: any

    Returns T

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Array.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Array.html index 432db339b..ba201e603 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Array.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Array.html @@ -1,4 +1,4 @@ Array | @wailsio/runtime
    • Array takes a creation function for an arbitrary type and returns an in-place creation function for an array whose elements are of that type.

      -

      Type Parameters

      • T

      Parameters

      • element: ((source) => T)
          • (source): T
          • Parameters

            • source: any

            Returns T

      Returns ((source) => T[])

        • (source): T[]
        • Parameters

          • source: any

          Returns T[]

    Generated using TypeDoc

    \ No newline at end of file +

    Type Parameters

    • T

    Parameters

    • element: ((source) => T)
        • (source): T
        • Parameters

          • source: any

          Returns T

    Returns ((source) => T[])

      • (source): T[]
      • Parameters

        • source: any

        Returns T[]

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.ByteSlice.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.ByteSlice.html index 975e4835a..0dd07f9c1 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.ByteSlice.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.ByteSlice.html @@ -1,3 +1,3 @@ ByteSlice | @wailsio/runtime
    • ByteSlice is a creation function that replaces null strings with empty strings.

      -

      Parameters

      • source: any

      Returns string

    Generated using TypeDoc

    \ No newline at end of file +

    Parameters

    • source: any

    Returns string

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Map.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Map.html index feb42a619..ef6a9928c 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Map.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Map.html @@ -1,4 +1,4 @@ Map | @wailsio/runtime
    • Map takes creation functions for two arbitrary types and returns an in-place creation function for an object whose keys and values are of those types.

      -

      Type Parameters

      • K
      • V

      Parameters

      • key: ((source) => K)
          • (source): K
          • Parameters

            • source: any

            Returns K

      • value: ((source) => V)
          • (source): V
          • Parameters

            • source: any

            Returns V

      Returns ((source) => {
          [_: K]: V;
      })

        • (source): {
              [_: K]: V;
          }
        • Parameters

          • source: any

          Returns {
              [_: K]: V;
          }

    Generated using TypeDoc

    \ No newline at end of file +

    Type Parameters

    • K
    • V

    Parameters

    • key: ((source) => K)
        • (source): K
        • Parameters

          • source: any

          Returns K

    • value: ((source) => V)
        • (source): V
        • Parameters

          • source: any

          Returns V

    Returns ((source) => {
        [_: K]: V;
    })

      • (source): {
            [_: K]: V;
        }
      • Parameters

        • source: any

        Returns {
            [_: K]: V;
        }

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Nullable.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Nullable.html index 05aa540c2..23ae04065 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Nullable.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Nullable.html @@ -1,3 +1,3 @@ Nullable | @wailsio/runtime
    • Nullable takes a creation function for an arbitrary type and returns a creation function for a nullable value of that type.

      -

      Type Parameters

      • T

      Parameters

      • element: ((source) => T)
          • (source): T
          • Parameters

            • source: any

            Returns T

      Returns ((source) => null | T)

        • (source): null | T
        • Parameters

          • source: any

          Returns null | T

    Generated using TypeDoc

    \ No newline at end of file +

    Type Parameters

    • T

    Parameters

    • element: ((source) => T)
        • (source): T
        • Parameters

          • source: any

          Returns T

    Returns ((source) => null | T)

      • (source): null | T
      • Parameters

        • source: any

        Returns null | T

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Struct.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Struct.html index be9e29caa..4bc059759 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Struct.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Struct.html @@ -1,3 +1,3 @@ Struct | @wailsio/runtime
    • Struct takes an object mapping field names to creation functions and returns an in-place creation function for a struct.

      -

      Type Parameters

      • T extends {
            [_: string]: ((source) => any);
        }
      • U extends {
            [Key in string | number | symbol]?: ReturnType<T[Key]>
        }

      Parameters

      • createField: T

      Returns ((source) => U)

        • (source): U
        • Parameters

          • source: any

          Returns U

    Generated using TypeDoc

    \ No newline at end of file +

    Type Parameters

    • T extends {
          [_: string]: ((source) => any);
      }
    • U extends {
          [Key in string | number | symbol]?: ReturnType<T[Key]>
      }

    Parameters

    • createField: T

    Returns ((source) => U)

      • (source): U
      • Parameters

        • source: any

        Returns U

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Error.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Error.html index 4e8fd55e4..6f3048e4b 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Error.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Error.html @@ -2,4 +2,4 @@

    Returns Promise<string>

    • The label of the button pressed
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Info.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Info.html index fe0a46f8e..caf1269b3 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Info.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Info.html @@ -2,4 +2,4 @@

    Returns Promise<string>

    • The label of the button pressed
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.OpenFile.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.OpenFile.html index db6f6f867..5b30a4ee7 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.OpenFile.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.OpenFile.html @@ -1,3 +1,3 @@ OpenFile | @wailsio/runtime
    • Parameters

      Returns Promise<string | string[]>

      Returns selected file or list of files. Returns blank string if no file is selected.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Question.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Question.html index 76edeafea..8af24273c 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Question.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Question.html @@ -2,4 +2,4 @@

    Returns Promise<string>

    • The label of the button pressed
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.SaveFile.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.SaveFile.html index 49d1f0ae1..9139757c0 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.SaveFile.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.SaveFile.html @@ -1,3 +1,3 @@ SaveFile | @wailsio/runtime
    • Parameters

      Returns Promise<string>

      Returns the selected file. Returns blank string if no file is selected.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Warning.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Warning.html index 07e6530f4..78fa0a77a 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Warning.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Warning.html @@ -2,4 +2,4 @@

    Returns Promise<string>

    • The label of the button pressed
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Emit.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Emit.html index 9b979d7c0..259afe415 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Emit.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Emit.html @@ -3,4 +3,4 @@

    Returns any

    • The result of the emitted event.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Off.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Off.html index a607f396b..c26214528 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Off.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Off.html @@ -1,4 +1,4 @@ Off | @wailsio/runtime
    • Removes event listeners for the specified event names.

      Parameters

      • eventName: string

        The name of the event to remove listeners for.

      • Rest ...additionalEventNames: string[]

        Additional event names to remove listeners for.

        -

      Returns undefined

    Generated using TypeDoc

    \ No newline at end of file +

    Returns undefined

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OffAll.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OffAll.html index 90a056e43..d9bfd8cc3 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OffAll.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OffAll.html @@ -1,3 +1,3 @@ OffAll | @wailsio/runtime
    • Removes all event listeners.

      Returns void

      Function

      OffAll

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.On.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.On.html index b068bc255..e7cc267f0 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.On.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.On.html @@ -4,4 +4,4 @@

    Returns Function

    • A function that, when called, will unregister the callback from the event.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OnMultiple.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OnMultiple.html index d18299d05..b2a786508 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OnMultiple.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OnMultiple.html @@ -5,4 +5,4 @@

    Returns Function

    • A function that, when called, will unregister the callback from the event.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Once.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Once.html index 8622b13fd..9051c4958 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Once.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Once.html @@ -4,4 +4,4 @@

    Returns Function

    • A function that, when called, will unregister the callback from the event.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.setup.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.setup.html index 091a037f3..74af7565e 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.setup.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.setup.html @@ -1 +1 @@ -setup | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file +setup | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Flags.GetFlag.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Flags.GetFlag.html index c668ee102..fd755cb1c 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Flags.GetFlag.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Flags.GetFlag.html @@ -3,4 +3,4 @@

    Returns any

    • The value associated with the specified key.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetAll.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetAll.html index 5a7476d5c..500db8d08 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetAll.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetAll.html @@ -1,3 +1,3 @@ GetAll | @wailsio/runtime
    • Gets all screens.

      Returns Promise<Screen[]>

      A promise that resolves to an array of Screen objects.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetCurrent.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetCurrent.html index 90549ea41..e4fba9c94 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetCurrent.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetCurrent.html @@ -1,3 +1,3 @@ GetCurrent | @wailsio/runtime
    • Gets the current active screen.

      Returns Promise<Screen>

      A promise that resolves with the current active screen.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetPrimary.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetPrimary.html index cb4eb0ec1..9634da511 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetPrimary.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetPrimary.html @@ -1,3 +1,3 @@ GetPrimary | @wailsio/runtime
    • Gets the primary screen.

      Returns Promise<Screen>

      A promise that resolves to the primary screen.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Capabilities.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Capabilities.html index 9cbc97e12..54d746eff 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Capabilities.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Capabilities.html @@ -1,4 +1,4 @@ Capabilities | @wailsio/runtime
    • Fetches the capabilities of the application from the server.

      Returns Promise<Object>

      A promise that resolves to an object containing the capabilities.

      Async

      Function

      Capabilities

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Environment.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Environment.html index 06f50b91b..b49ba20cc 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Environment.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Environment.html @@ -2,4 +2,4 @@
  • A promise that resolves to an object containing OS and system architecture.
  • Function

    Retrieves environment details.

    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsAMD64.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsAMD64.html index e4e39340a..37a885d94 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsAMD64.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsAMD64.html @@ -1,3 +1,3 @@ IsAMD64 | @wailsio/runtime
    • Checks if the current environment architecture is AMD64.

      Returns boolean

      True if the current environment architecture is AMD64, false otherwise.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM.html index 41ebfc6d5..b20f5d87e 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM.html @@ -1,3 +1,3 @@ IsARM | @wailsio/runtime
    • Checks if the current architecture is ARM.

      Returns boolean

      True if the current architecture is ARM, false otherwise.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM64.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM64.html index ef201f01b..acb3841a6 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM64.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM64.html @@ -2,4 +2,4 @@

    Returns boolean

    • Returns true if the environment is ARM64 architecture, otherwise returns false.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDarkMode.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDarkMode.html index aa253aadc..620afc3ce 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDarkMode.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDarkMode.html @@ -2,4 +2,4 @@
  • A promise that resolves to a boolean value indicating if the system is in dark mode.
  • Function

    Retrieves the system dark mode status.

    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDebug.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDebug.html index 850979afd..0670c693e 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDebug.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDebug.html @@ -1 +1 @@ -IsDebug | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file +IsDebug | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsLinux.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsLinux.html index b94c3f81e..c1738bc3b 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsLinux.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsLinux.html @@ -1,3 +1,3 @@ IsLinux | @wailsio/runtime
    • Checks if the current operating system is Linux.

      Returns boolean

      Returns true if the current operating system is Linux, false otherwise.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsMac.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsMac.html index 9143d24d9..26faf8a94 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsMac.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsMac.html @@ -1,3 +1,3 @@ IsMac | @wailsio/runtime
    • Checks if the current environment is a macOS operating system.

      Returns boolean

      True if the environment is macOS, false otherwise.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsWindows.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsWindows.html index 7aea1f724..5630846b7 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsWindows.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsWindows.html @@ -1,3 +1,3 @@ IsWindows | @wailsio/runtime
    • Checks if the current operating system is Windows.

      Returns boolean

      True if the operating system is Windows, otherwise false.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.invoke.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.invoke.html index 5fd008ae2..41a9c9016 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.invoke.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.invoke.html @@ -1 +1 @@ -invoke | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file +invoke | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Enable.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Enable.html index ff18b880e..2db32f932 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Enable.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Enable.html @@ -1,2 +1,2 @@ Enable | @wailsio/runtime
    • Schedules an automatic reload of WML to be performed as soon as the document is fully loaded.

      -

      Returns void

    Generated using TypeDoc

    \ No newline at end of file +

    Returns void

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Reload.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Reload.html index dd7322ec7..030549259 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Reload.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Reload.html @@ -1,2 +1,2 @@ Reload | @wailsio/runtime
    • Reloads the WML page by adding necessary event listeners and browser listeners.

      -

      Returns void

    Generated using TypeDoc

    \ No newline at end of file +

    Returns void

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/init.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/init.html index 75bf6cb6c..bcd60c3d3 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/init.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/init.html @@ -1 +1 @@ -init | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file +init | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Call.CallOptions.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Call.CallOptions.html index 0d427d8c5..f602f876e 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Call.CallOptions.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Call.CallOptions.html @@ -1,7 +1,7 @@ -CallOptions | @wailsio/runtime

    Interface CallOptions

    interface CallOptions {
        args: any[];
        methodID: undefined | number;
        methodName: undefined | string;
    }

    Properties

    args +CallOptions | @wailsio/runtime

    Interface CallOptions

    interface CallOptions {
        args: any[];
        methodID: undefined | number;
        methodName: undefined | string;
    }

    Properties

    args: any[]

    Arguments to be passed into the bound method.

    -
    methodID: undefined | number

    The numeric ID of the bound method to call.

    -
    methodName: undefined | string

    The fully qualified name of the bound method to call.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    methodID: undefined | number

    The numeric ID of the bound method to call.

    +
    methodName: undefined | string

    The fully qualified name of the bound method to call.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.Button.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.Button.html index f378d46c0..6e3951126 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.Button.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.Button.html @@ -1,7 +1,7 @@ -Button | @wailsio/runtime
    interface Button {
        IsCancel: undefined | boolean;
        IsDefault: undefined | boolean;
        Label: undefined | string;
    }

    Properties

    IsCancel +Button | @wailsio/runtime
    interface Button {
        IsCancel: undefined | boolean;
        IsDefault: undefined | boolean;
        Label: undefined | string;
    }

    Properties

    IsCancel: undefined | boolean

    True if the button should cancel an operation when clicked.

    -
    IsDefault: undefined | boolean

    True if the button should be the default action when the user presses enter.

    -
    Label: undefined | string

    Text that appears within the button.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    IsDefault: undefined | boolean

    True if the button should be the default action when the user presses enter.

    +
    Label: undefined | string

    Text that appears within the button.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.FileFilter.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.FileFilter.html index 25b89fbbb..3ce8b5a34 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.FileFilter.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.FileFilter.html @@ -1,5 +1,5 @@ -FileFilter | @wailsio/runtime
    interface FileFilter {
        DisplayName: undefined | string;
        Pattern: undefined | string;
    }

    Properties

    DisplayName +FileFilter | @wailsio/runtime
    interface FileFilter {
        DisplayName: undefined | string;
        Pattern: undefined | string;
    }

    Properties

    Properties

    DisplayName: undefined | string

    Display name for the filter, it could be "Text Files", "Images" etc.

    -
    Pattern: undefined | string

    Pattern to match for the filter, e.g. ".txt;.md" for text markdown files.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    Pattern: undefined | string

    Pattern to match for the filter, e.g. ".txt;.md" for text markdown files.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.MessageDialogOptions.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.MessageDialogOptions.html index 2f751fe96..661b1efe0 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.MessageDialogOptions.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.MessageDialogOptions.html @@ -1,9 +1,9 @@ -MessageDialogOptions | @wailsio/runtime

    Interface MessageDialogOptions

    interface MessageDialogOptions {
        Buttons: undefined | Button[];
        Detached: undefined | boolean;
        Message: undefined | string;
        Title: undefined | string;
    }

    Properties

    Buttons +MessageDialogOptions | @wailsio/runtime

    Interface MessageDialogOptions

    interface MessageDialogOptions {
        Buttons: undefined | Button[];
        Detached: undefined | boolean;
        Message: undefined | string;
        Title: undefined | string;
    }

    Properties

    Buttons: undefined | Button[]

    Array of button options to show in the dialog.

    -
    Detached: undefined | boolean

    True if the dialog should appear detached from the main window (if applicable).

    -
    Message: undefined | string

    The main message to show in the dialog.

    -
    Title: undefined | string

    The title of the dialog window.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    Detached: undefined | boolean

    True if the dialog should appear detached from the main window (if applicable).

    +
    Message: undefined | string

    The main message to show in the dialog.

    +
    Title: undefined | string

    The title of the dialog window.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.OpenFileDialogOptions.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.OpenFileDialogOptions.html index 21375465c..455bf1780 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.OpenFileDialogOptions.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.OpenFileDialogOptions.html @@ -1,4 +1,4 @@ -OpenFileDialogOptions | @wailsio/runtime

    Interface OpenFileDialogOptions

    interface OpenFileDialogOptions {
        AllowsMultipleSelection: undefined | boolean;
        AllowsOtherFiletypes: undefined | boolean;
        ButtonText: undefined | string;
        CanChooseDirectories: undefined | boolean;
        CanChooseFiles: undefined | boolean;
        CanCreateDirectories: undefined | boolean;
        CanSelectHiddenExtension: undefined | boolean;
        Detached: undefined | boolean;
        Directory: undefined | string;
        Filters: undefined | FileFilter[];
        HideExtension: undefined | boolean;
        Message: undefined | string;
        ResolvesAliases: undefined | boolean;
        ShowHiddenFiles: undefined | boolean;
        Title: undefined | string;
        TreatsFilePackagesAsDirectories: undefined | boolean;
    }

    Properties

    AllowsMultipleSelection +OpenFileDialogOptions | @wailsio/runtime

    Interface OpenFileDialogOptions

    interface OpenFileDialogOptions {
        AllowsMultipleSelection: undefined | boolean;
        AllowsOtherFiletypes: undefined | boolean;
        ButtonText: undefined | string;
        CanChooseDirectories: undefined | boolean;
        CanChooseFiles: undefined | boolean;
        CanCreateDirectories: undefined | boolean;
        CanSelectHiddenExtension: undefined | boolean;
        Detached: undefined | boolean;
        Directory: undefined | string;
        Filters: undefined | FileFilter[];
        HideExtension: undefined | boolean;
        Message: undefined | string;
        ResolvesAliases: undefined | boolean;
        ShowHiddenFiles: undefined | boolean;
        Title: undefined | string;
        TreatsFilePackagesAsDirectories: undefined | boolean;
    }

    Properties

    AllowsMultipleSelection: undefined | boolean

    Indicates if multiple selection is allowed.

    -
    AllowsOtherFiletypes: undefined | boolean

    Indicates if other file types are allowed.

    -
    ButtonText: undefined | string

    Text to display on the button.

    -
    CanChooseDirectories: undefined | boolean

    Indicates if directories can be chosen.

    -
    CanChooseFiles: undefined | boolean

    Indicates if files can be chosen.

    -
    CanCreateDirectories: undefined | boolean

    Indicates if directories can be created.

    -
    CanSelectHiddenExtension: undefined | boolean

    Indicates if hidden extensions can be selected.

    -
    Detached: undefined | boolean

    Indicates if the dialog should appear detached from the main window.

    -
    Directory: undefined | string

    Directory to open in the dialog.

    -
    Filters: undefined | FileFilter[]

    Array of file filters.

    -
    HideExtension: undefined | boolean

    Indicates if the extension should be hidden.

    -
    Message: undefined | string

    Message to show in the dialog.

    -
    ResolvesAliases: undefined | boolean

    Indicates if aliases should be resolved.

    -
    ShowHiddenFiles: undefined | boolean

    Indicates if hidden files should be shown.

    -
    Title: undefined | string

    Title of the dialog.

    -
    TreatsFilePackagesAsDirectories: undefined | boolean

    Indicates if file packages should be treated as directories.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    AllowsOtherFiletypes: undefined | boolean

    Indicates if other file types are allowed.

    +
    ButtonText: undefined | string

    Text to display on the button.

    +
    CanChooseDirectories: undefined | boolean

    Indicates if directories can be chosen.

    +
    CanChooseFiles: undefined | boolean

    Indicates if files can be chosen.

    +
    CanCreateDirectories: undefined | boolean

    Indicates if directories can be created.

    +
    CanSelectHiddenExtension: undefined | boolean

    Indicates if hidden extensions can be selected.

    +
    Detached: undefined | boolean

    Indicates if the dialog should appear detached from the main window.

    +
    Directory: undefined | string

    Directory to open in the dialog.

    +
    Filters: undefined | FileFilter[]

    Array of file filters.

    +
    HideExtension: undefined | boolean

    Indicates if the extension should be hidden.

    +
    Message: undefined | string

    Message to show in the dialog.

    +
    ResolvesAliases: undefined | boolean

    Indicates if aliases should be resolved.

    +
    ShowHiddenFiles: undefined | boolean

    Indicates if hidden files should be shown.

    +
    Title: undefined | string

    Title of the dialog.

    +
    TreatsFilePackagesAsDirectories: undefined | boolean

    Indicates if file packages should be treated as directories.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.SaveFileDialogOptions.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.SaveFileDialogOptions.html index d3f8671c2..0417b185c 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.SaveFileDialogOptions.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.SaveFileDialogOptions.html @@ -1,4 +1,4 @@ -SaveFileDialogOptions | @wailsio/runtime

    Interface SaveFileDialogOptions

    interface SaveFileDialogOptions {
        AllowsMultipleSelection: undefined | boolean;
        AllowsOtherFiletypes: undefined | boolean;
        ButtonText: undefined | string;
        CanChooseDirectories: undefined | boolean;
        CanChooseFiles: undefined | boolean;
        CanCreateDirectories: undefined | boolean;
        CanSelectHiddenExtension: undefined | boolean;
        Detached: undefined | boolean;
        Directory: undefined | string;
        Filename: undefined | string;
        Filters: undefined | FileFilter[];
        HideExtension: undefined | boolean;
        Message: undefined | string;
        ResolvesAliases: undefined | boolean;
        ShowHiddenFiles: undefined | boolean;
        Title: undefined | string;
        TreatsFilePackagesAsDirectories: undefined | boolean;
    }

    Properties

    AllowsMultipleSelection +SaveFileDialogOptions | @wailsio/runtime

    Interface SaveFileDialogOptions

    interface SaveFileDialogOptions {
        AllowsMultipleSelection: undefined | boolean;
        AllowsOtherFiletypes: undefined | boolean;
        ButtonText: undefined | string;
        CanChooseDirectories: undefined | boolean;
        CanChooseFiles: undefined | boolean;
        CanCreateDirectories: undefined | boolean;
        CanSelectHiddenExtension: undefined | boolean;
        Detached: undefined | boolean;
        Directory: undefined | string;
        Filename: undefined | string;
        Filters: undefined | FileFilter[];
        HideExtension: undefined | boolean;
        Message: undefined | string;
        ResolvesAliases: undefined | boolean;
        ShowHiddenFiles: undefined | boolean;
        Title: undefined | string;
        TreatsFilePackagesAsDirectories: undefined | boolean;
    }

    Properties

    AllowsMultipleSelection: undefined | boolean

    Indicates if multiple selection is allowed.

    -
    AllowsOtherFiletypes: undefined | boolean

    Indicates if other file types are allowed.

    -
    ButtonText: undefined | string

    Text to display on the button.

    -
    CanChooseDirectories: undefined | boolean

    Indicates if directories can be chosen.

    -
    CanChooseFiles: undefined | boolean

    Indicates if files can be chosen.

    -
    CanCreateDirectories: undefined | boolean

    Indicates if directories can be created.

    -
    CanSelectHiddenExtension: undefined | boolean

    Indicates if hidden extensions can be selected.

    -
    Detached: undefined | boolean

    Indicates if the dialog should appear detached from the main window.

    -
    Directory: undefined | string

    Directory to open in the dialog.

    -
    Filename: undefined | string

    Default filename to use in the dialog.

    -
    Filters: undefined | FileFilter[]

    Array of file filters.

    -
    HideExtension: undefined | boolean

    Indicates if the extension should be hidden.

    -
    Message: undefined | string

    Message to show in the dialog.

    -
    ResolvesAliases: undefined | boolean

    Indicates if aliases should be resolved.

    -
    ShowHiddenFiles: undefined | boolean

    Indicates if hidden files should be shown.

    -
    Title: undefined | string

    Title of the dialog.

    -
    TreatsFilePackagesAsDirectories: undefined | boolean

    Indicates if file packages should be treated as directories.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    AllowsOtherFiletypes: undefined | boolean

    Indicates if other file types are allowed.

    +
    ButtonText: undefined | string

    Text to display on the button.

    +
    CanChooseDirectories: undefined | boolean

    Indicates if directories can be chosen.

    +
    CanChooseFiles: undefined | boolean

    Indicates if files can be chosen.

    +
    CanCreateDirectories: undefined | boolean

    Indicates if directories can be created.

    +
    CanSelectHiddenExtension: undefined | boolean

    Indicates if hidden extensions can be selected.

    +
    Detached: undefined | boolean

    Indicates if the dialog should appear detached from the main window.

    +
    Directory: undefined | string

    Directory to open in the dialog.

    +
    Filename: undefined | string

    Default filename to use in the dialog.

    +
    Filters: undefined | FileFilter[]

    Array of file filters.

    +
    HideExtension: undefined | boolean

    Indicates if the extension should be hidden.

    +
    Message: undefined | string

    Message to show in the dialog.

    +
    ResolvesAliases: undefined | boolean

    Indicates if aliases should be resolved.

    +
    ShowHiddenFiles: undefined | boolean

    Indicates if hidden files should be shown.

    +
    Title: undefined | string

    Title of the dialog.

    +
    TreatsFilePackagesAsDirectories: undefined | boolean

    Indicates if file packages should be treated as directories.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Rect.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Rect.html index df662ad09..fc8396193 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Rect.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Rect.html @@ -1,9 +1,9 @@ -Rect | @wailsio/runtime
    interface Rect {
        Height: number;
        Width: number;
        X: number;
        Y: number;
    }

    Properties

    Height +Rect | @wailsio/runtime
    interface Rect {
        Height: number;
        Width: number;
        X: number;
        Y: number;
    }

    Properties

    Properties

    Height: number

    The height of the rectangle.

    -
    Width: number

    The width of the rectangle.

    -
    X: number

    The X coordinate of the origin.

    -
    Y: number

    The Y coordinate of the origin.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    Width: number

    The width of the rectangle.

    +
    X: number

    The X coordinate of the origin.

    +
    Y: number

    The Y coordinate of the origin.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Screen.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Screen.html index ade9f63ad..3d527004a 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Screen.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Screen.html @@ -1,4 +1,4 @@ -Screen | @wailsio/runtime
    interface Screen {
        Bounds: Rect;
        ID: string;
        IsPrimary: boolean;
        Name: string;
        PhysicalBounds: Rect;
        PhysicalWorkArea: Rect;
        Rotation: number;
        ScaleFactor: number;
        Size: Size;
        WorkArea: Rect;
        X: number;
        Y: number;
    }

    Properties

    Bounds +Screen | @wailsio/runtime
    interface Screen {
        Bounds: Rect;
        ID: string;
        IsPrimary: boolean;
        Name: string;
        PhysicalBounds: Rect;
        PhysicalWorkArea: Rect;
        Rotation: number;
        ScaleFactor: number;
        Size: Size;
        WorkArea: Rect;
        X: number;
        Y: number;
    }

    Properties

    Bounds ID IsPrimary Name @@ -11,15 +11,15 @@ X Y

    Properties

    Bounds: Rect

    Contains the bounds of the screen in terms of X, Y, Width, and Height.

    -
    ID: string

    Unique identifier for the screen.

    -
    IsPrimary: boolean

    True if this is the primary monitor selected by the user in the operating system.

    -
    Name: string

    Human readable name of the screen.

    -
    PhysicalBounds: Rect

    Contains the physical bounds of the screen in terms of X, Y, Width, and Height (before scaling).

    -
    PhysicalWorkArea: Rect

    Contains the physical WorkArea of the screen (before scaling).

    -
    Rotation: number

    The rotation of the screen.

    -
    ScaleFactor: number

    The scale factor of the screen (DPI/96). 1 = standard DPI, 2 = HiDPI (Retina), etc.

    -
    Size: Size

    Contains the width and height of the screen.

    -
    WorkArea: Rect

    Contains the area of the screen that is actually usable (excluding taskbar and other system UI).

    -
    X: number

    The X coordinate of the screen.

    -
    Y: number

    The Y coordinate of the screen.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    ID: string

    Unique identifier for the screen.

    +
    IsPrimary: boolean

    True if this is the primary monitor selected by the user in the operating system.

    +
    Name: string

    Human readable name of the screen.

    +
    PhysicalBounds: Rect

    Contains the physical bounds of the screen in terms of X, Y, Width, and Height (before scaling).

    +
    PhysicalWorkArea: Rect

    Contains the physical WorkArea of the screen (before scaling).

    +
    Rotation: number

    The rotation of the screen.

    +
    ScaleFactor: number

    The scale factor of the screen (DPI/96). 1 = standard DPI, 2 = HiDPI (Retina), etc.

    +
    Size: Size

    Contains the width and height of the screen.

    +
    WorkArea: Rect

    Contains the area of the screen that is actually usable (excluding taskbar and other system UI).

    +
    X: number

    The X coordinate of the screen.

    +
    Y: number

    The Y coordinate of the screen.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Size.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Size.html index aaff1f331..d0ce4d079 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Size.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Size.html @@ -1,5 +1,5 @@ -Size | @wailsio/runtime
    interface Size {
        Height: number;
        Width: number;
    }

    Properties

    Height +Size | @wailsio/runtime
    interface Size {
        Height: number;
        Width: number;
    }

    Properties

    Properties

    Height: number

    The height.

    -
    Width: number

    The width.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    Width: number

    The width.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.EnvironmentInfo.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.EnvironmentInfo.html index 370cec485..0afdfa49d 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.EnvironmentInfo.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.EnvironmentInfo.html @@ -1,11 +1,11 @@ -EnvironmentInfo | @wailsio/runtime

    Interface EnvironmentInfo

    interface EnvironmentInfo {
        Arch: string;
        Debug: boolean;
        OS: string;
        OSInfo: OSInfo;
        PlatformInfo: Object;
    }

    Properties

    Arch +EnvironmentInfo | @wailsio/runtime

    Interface EnvironmentInfo

    interface EnvironmentInfo {
        Arch: string;
        Debug: boolean;
        OS: string;
        OSInfo: OSInfo;
        PlatformInfo: Object;
    }

    Properties

    Arch: string

    The architecture of the system.

    -
    Debug: boolean

    True if the application is running in debug mode, otherwise false.

    -
    OS: string

    The operating system in use.

    -
    OSInfo: OSInfo

    Details of the operating system.

    -
    PlatformInfo: Object

    Additional platform information.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    Debug: boolean

    True if the application is running in debug mode, otherwise false.

    +
    OS: string

    The operating system in use.

    +
    OSInfo: OSInfo

    Details of the operating system.

    +
    PlatformInfo: Object

    Additional platform information.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.OSInfo.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.OSInfo.html index 8cdc8ec1b..229a31dec 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.OSInfo.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.OSInfo.html @@ -1,9 +1,9 @@ -OSInfo | @wailsio/runtime
    interface OSInfo {
        Branding: string;
        ID: string;
        Name: string;
        Version: string;
    }

    Properties

    Branding +OSInfo | @wailsio/runtime
    interface OSInfo {
        Branding: string;
        ID: string;
        Name: string;
        Version: string;
    }

    Properties

    Properties

    Branding: string

    The branding of the OS.

    -
    ID: string

    The ID of the OS.

    -
    Name: string

    The name of the OS.

    -
    Version: string

    The version of the OS.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    ID: string

    The ID of the OS.

    +
    Name: string

    The name of the OS.

    +
    Version: string

    The version of the OS.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Application.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Application.html index 2f18cc27a..3d90d6c44 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Application.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Application.html @@ -1,4 +1,4 @@ -Application | @wailsio/runtime

    Namespace Application

    Index

    Functions

    Hide +Application | @wailsio/runtime

    Namespace Application

    Index

    Functions

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Browser.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Browser.html index 6540a5866..77a8cdd17 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Browser.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Browser.html @@ -1,2 +1,2 @@ -Browser | @wailsio/runtime

    Namespace Browser

    Index

    Functions

    OpenURL +Browser | @wailsio/runtime

    Namespace Browser

    Index

    Functions

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Call.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Call.html index c1de164e8..600f3d2ea 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Call.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Call.html @@ -1,4 +1,4 @@ -Call | @wailsio/runtime

    Namespace Call

    Index

    Classes

    RuntimeError +Call | @wailsio/runtime

    Namespace Call

    Index

    Classes

    Interfaces

    Functions

    ByID ByName diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Clipboard.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Clipboard.html index fc8d10336..2b315ac79 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Clipboard.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Clipboard.html @@ -1,3 +1,3 @@ -Clipboard | @wailsio/runtime

    Namespace Clipboard

    Index

    Functions

    SetText +Clipboard | @wailsio/runtime

    Namespace Clipboard

    Index

    Functions

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Create.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Create.html index e6f12452a..c61072bd1 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Create.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Create.html @@ -1,4 +1,4 @@ -Create | @wailsio/runtime

    Namespace Create

    Index

    Functions

    Any +Create | @wailsio/runtime

    Namespace Create

    Index

    Functions

    Any Array ByteSlice Map diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Dialogs.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Dialogs.html index bbed62462..b0a5bf345 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Dialogs.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Dialogs.html @@ -1,4 +1,4 @@ -Dialogs | @wailsio/runtime

    Namespace Dialogs

    Index

    Interfaces

    Button +Dialogs | @wailsio/runtime

    Namespace Dialogs

    Index

    Interfaces

    Button FileFilter MessageDialogOptions OpenFileDialogOptions diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Events.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Events.html index 5fc2b7a97..d4fe00296 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Events.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Events.html @@ -1,4 +1,4 @@ -Events | @wailsio/runtime

    Namespace Events

    Index

    Classes

    WailsEvent +Events | @wailsio/runtime

    Namespace Events

    Index

    Classes

    Variables

    Functions

    Emit Off diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Flags.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Flags.html index 359d13a24..e6a8eb1c4 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Flags.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Flags.html @@ -1,2 +1,2 @@ -Flags | @wailsio/runtime

    Namespace Flags

    Index

    Functions

    GetFlag +Flags | @wailsio/runtime

    Namespace Flags

    Index

    Functions

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Screens.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Screens.html index 2ddfa2ff9..dce388503 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Screens.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Screens.html @@ -1,4 +1,4 @@ -Screens | @wailsio/runtime

    Namespace Screens

    Index

    Interfaces

    Rect +Screens | @wailsio/runtime

    Namespace Screens

    Index

    Interfaces

    Functions

    GetAll diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/System.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/System.html index 9430372f4..cc624c92f 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/System.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/System.html @@ -1,4 +1,4 @@ -System | @wailsio/runtime

    Namespace System

    Index

    Interfaces

    EnvironmentInfo +System | @wailsio/runtime

    Namespace System

    Index

    Interfaces

    Functions

    Capabilities Environment diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/WML.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/WML.html index 53acfb009..b592696af 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/WML.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/WML.html @@ -1,3 +1,3 @@ -WML | @wailsio/runtime

    Namespace WML

    Index

    Functions

    Enable +WML | @wailsio/runtime

    Namespace WML

    Index

    Functions

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Events.Types.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Events.Types.html index d2311e0bd..08b19fd84 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Events.Types.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Events.Types.html @@ -1 +1 @@ -Types | @wailsio/runtime

    Variable TypesConst

    Types: {
        Common: {
            ApplicationOpenedWithFile: string;
            ApplicationStarted: string;
            ThemeChanged: string;
            WindowClosing: string;
            WindowDPIChanged: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowFilesDropped: string;
            WindowFocus: string;
            WindowFullscreen: string;
            WindowHide: string;
            WindowLostFocus: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowRestore: string;
            WindowRuntimeReady: string;
            WindowShow: string;
            WindowUnFullscreen: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowZoom: string;
            WindowZoomIn: string;
            WindowZoomOut: string;
            WindowZoomReset: string;
        };
        Linux: {
            ApplicationStartup: string;
            SystemThemeChanged: string;
            WindowDeleteEvent: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowFocusIn: string;
            WindowFocusOut: string;
            WindowLoadChanged: string;
        };
        Mac: {
            ApplicationDidBecomeActive: string;
            ApplicationDidChangeBackingProperties: string;
            ApplicationDidChangeEffectiveAppearance: string;
            ApplicationDidChangeIcon: string;
            ApplicationDidChangeOcclusionState: string;
            ApplicationDidChangeScreenParameters: string;
            ApplicationDidChangeStatusBarFrame: string;
            ApplicationDidChangeStatusBarOrientation: string;
            ApplicationDidChangeTheme: string;
            ApplicationDidFinishLaunching: string;
            ApplicationDidHide: string;
            ApplicationDidResignActive: string;
            ApplicationDidUnhide: string;
            ApplicationDidUpdate: string;
            ApplicationShouldHandleReopen: string;
            ApplicationWillBecomeActive: string;
            ApplicationWillFinishLaunching: string;
            ApplicationWillHide: string;
            ApplicationWillResignActive: string;
            ApplicationWillTerminate: string;
            ApplicationWillUnhide: string;
            ApplicationWillUpdate: string;
            MenuDidAddItem: string;
            MenuDidBeginTracking: string;
            MenuDidClose: string;
            MenuDidDisplayItem: string;
            MenuDidEndTracking: string;
            MenuDidHighlightItem: string;
            MenuDidOpen: string;
            MenuDidPopUp: string;
            MenuDidRemoveItem: string;
            MenuDidSendAction: string;
            MenuDidSendActionToItem: string;
            MenuDidUpdate: string;
            MenuWillAddItem: string;
            MenuWillBeginTracking: string;
            MenuWillDisplayItem: string;
            MenuWillEndTracking: string;
            MenuWillHighlightItem: string;
            MenuWillOpen: string;
            MenuWillPopUp: string;
            MenuWillRemoveItem: string;
            MenuWillSendAction: string;
            MenuWillSendActionToItem: string;
            MenuWillUpdate: string;
            WebViewDidCommitNavigation: string;
            WebViewDidFinishNavigation: string;
            WebViewDidReceiveServerRedirectForProvisionalNavigation: string;
            WebViewDidStartProvisionalNavigation: string;
            WindowDidBecomeKey: string;
            WindowDidBecomeMain: string;
            WindowDidBeginSheet: string;
            WindowDidChangeAlpha: string;
            WindowDidChangeBackingLocation: string;
            WindowDidChangeBackingProperties: string;
            WindowDidChangeCollectionBehavior: string;
            WindowDidChangeEffectiveAppearance: string;
            WindowDidChangeOcclusionState: string;
            WindowDidChangeOrderingMode: string;
            WindowDidChangeScreen: string;
            WindowDidChangeScreenParameters: string;
            WindowDidChangeScreenProfile: string;
            WindowDidChangeScreenSpace: string;
            WindowDidChangeScreenSpaceProperties: string;
            WindowDidChangeSharingType: string;
            WindowDidChangeSpace: string;
            WindowDidChangeSpaceOrderingMode: string;
            WindowDidChangeTitle: string;
            WindowDidChangeToolbar: string;
            WindowDidDeminiaturize: string;
            WindowDidEndSheet: string;
            WindowDidEnterFullScreen: string;
            WindowDidEnterVersionBrowser: string;
            WindowDidExitFullScreen: string;
            WindowDidExitVersionBrowser: string;
            WindowDidExpose: string;
            WindowDidFocus: string;
            WindowDidMiniaturize: string;
            WindowDidMove: string;
            WindowDidOrderOffScreen: string;
            WindowDidOrderOnScreen: string;
            WindowDidResignKey: string;
            WindowDidResignMain: string;
            WindowDidResize: string;
            WindowDidUpdate: string;
            WindowDidUpdateAlpha: string;
            WindowDidUpdateCollectionBehavior: string;
            WindowDidUpdateCollectionProperties: string;
            WindowDidUpdateShadow: string;
            WindowDidUpdateTitle: string;
            WindowDidUpdateToolbar: string;
            WindowDidZoom: string;
            WindowFileDraggingEntered: string;
            WindowFileDraggingExited: string;
            WindowFileDraggingPerformed: string;
            WindowHide: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowShouldClose: string;
            WindowShow: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowWillBecomeKey: string;
            WindowWillBecomeMain: string;
            WindowWillBeginSheet: string;
            WindowWillChangeOrderingMode: string;
            WindowWillClose: string;
            WindowWillDeminiaturize: string;
            WindowWillEnterFullScreen: string;
            WindowWillEnterVersionBrowser: string;
            WindowWillExitFullScreen: string;
            WindowWillExitVersionBrowser: string;
            WindowWillFocus: string;
            WindowWillMiniaturize: string;
            WindowWillMove: string;
            WindowWillOrderOffScreen: string;
            WindowWillOrderOnScreen: string;
            WindowWillResignMain: string;
            WindowWillResize: string;
            WindowWillUnfocus: string;
            WindowWillUpdate: string;
            WindowWillUpdateAlpha: string;
            WindowWillUpdateCollectionBehavior: string;
            WindowWillUpdateCollectionProperties: string;
            WindowWillUpdateShadow: string;
            WindowWillUpdateTitle: string;
            WindowWillUpdateToolbar: string;
            WindowWillUpdateVisibility: string;
            WindowWillUseStandardFrame: string;
            WindowZoomIn: string;
            WindowZoomOut: string;
            WindowZoomReset: string;
        };
        Windows: {
            APMPowerSettingChange: string;
            APMPowerStatusChange: string;
            APMResumeAutomatic: string;
            APMResumeSuspend: string;
            APMSuspend: string;
            ApplicationStarted: string;
            SystemThemeChanged: string;
            WebViewNavigationCompleted: string;
            WindowActive: string;
            WindowBackgroundErase: string;
            WindowClickActive: string;
            WindowClosing: string;
            WindowDPIChanged: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowDragDrop: string;
            WindowDragEnter: string;
            WindowDragLeave: string;
            WindowDragOver: string;
            WindowEndMove: string;
            WindowEndResize: string;
            WindowFullscreen: string;
            WindowHide: string;
            WindowInactive: string;
            WindowKeyDown: string;
            WindowKeyUp: string;
            WindowKillFocus: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowNonClientHit: string;
            WindowNonClientMouseDown: string;
            WindowNonClientMouseLeave: string;
            WindowNonClientMouseMove: string;
            WindowNonClientMouseUp: string;
            WindowPaint: string;
            WindowRestore: string;
            WindowSetFocus: string;
            WindowShow: string;
            WindowStartMove: string;
            WindowStartResize: string;
            WindowUnFullscreen: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowZOrderChanged: string;
        };
    } = EventTypes

    Type declaration

    • Common: {
          ApplicationOpenedWithFile: string;
          ApplicationStarted: string;
          ThemeChanged: string;
          WindowClosing: string;
          WindowDPIChanged: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowFilesDropped: string;
          WindowFocus: string;
          WindowFullscreen: string;
          WindowHide: string;
          WindowLostFocus: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowRestore: string;
          WindowRuntimeReady: string;
          WindowShow: string;
          WindowUnFullscreen: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowZoom: string;
          WindowZoomIn: string;
          WindowZoomOut: string;
          WindowZoomReset: string;
      }
      • ApplicationOpenedWithFile: string
      • ApplicationStarted: string
      • ThemeChanged: string
      • WindowClosing: string
      • WindowDPIChanged: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowFilesDropped: string
      • WindowFocus: string
      • WindowFullscreen: string
      • WindowHide: string
      • WindowLostFocus: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowRestore: string
      • WindowRuntimeReady: string
      • WindowShow: string
      • WindowUnFullscreen: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowZoom: string
      • WindowZoomIn: string
      • WindowZoomOut: string
      • WindowZoomReset: string
    • Linux: {
          ApplicationStartup: string;
          SystemThemeChanged: string;
          WindowDeleteEvent: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowFocusIn: string;
          WindowFocusOut: string;
          WindowLoadChanged: string;
      }
      • ApplicationStartup: string
      • SystemThemeChanged: string
      • WindowDeleteEvent: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowFocusIn: string
      • WindowFocusOut: string
      • WindowLoadChanged: string
    • Mac: {
          ApplicationDidBecomeActive: string;
          ApplicationDidChangeBackingProperties: string;
          ApplicationDidChangeEffectiveAppearance: string;
          ApplicationDidChangeIcon: string;
          ApplicationDidChangeOcclusionState: string;
          ApplicationDidChangeScreenParameters: string;
          ApplicationDidChangeStatusBarFrame: string;
          ApplicationDidChangeStatusBarOrientation: string;
          ApplicationDidChangeTheme: string;
          ApplicationDidFinishLaunching: string;
          ApplicationDidHide: string;
          ApplicationDidResignActive: string;
          ApplicationDidUnhide: string;
          ApplicationDidUpdate: string;
          ApplicationShouldHandleReopen: string;
          ApplicationWillBecomeActive: string;
          ApplicationWillFinishLaunching: string;
          ApplicationWillHide: string;
          ApplicationWillResignActive: string;
          ApplicationWillTerminate: string;
          ApplicationWillUnhide: string;
          ApplicationWillUpdate: string;
          MenuDidAddItem: string;
          MenuDidBeginTracking: string;
          MenuDidClose: string;
          MenuDidDisplayItem: string;
          MenuDidEndTracking: string;
          MenuDidHighlightItem: string;
          MenuDidOpen: string;
          MenuDidPopUp: string;
          MenuDidRemoveItem: string;
          MenuDidSendAction: string;
          MenuDidSendActionToItem: string;
          MenuDidUpdate: string;
          MenuWillAddItem: string;
          MenuWillBeginTracking: string;
          MenuWillDisplayItem: string;
          MenuWillEndTracking: string;
          MenuWillHighlightItem: string;
          MenuWillOpen: string;
          MenuWillPopUp: string;
          MenuWillRemoveItem: string;
          MenuWillSendAction: string;
          MenuWillSendActionToItem: string;
          MenuWillUpdate: string;
          WebViewDidCommitNavigation: string;
          WebViewDidFinishNavigation: string;
          WebViewDidReceiveServerRedirectForProvisionalNavigation: string;
          WebViewDidStartProvisionalNavigation: string;
          WindowDidBecomeKey: string;
          WindowDidBecomeMain: string;
          WindowDidBeginSheet: string;
          WindowDidChangeAlpha: string;
          WindowDidChangeBackingLocation: string;
          WindowDidChangeBackingProperties: string;
          WindowDidChangeCollectionBehavior: string;
          WindowDidChangeEffectiveAppearance: string;
          WindowDidChangeOcclusionState: string;
          WindowDidChangeOrderingMode: string;
          WindowDidChangeScreen: string;
          WindowDidChangeScreenParameters: string;
          WindowDidChangeScreenProfile: string;
          WindowDidChangeScreenSpace: string;
          WindowDidChangeScreenSpaceProperties: string;
          WindowDidChangeSharingType: string;
          WindowDidChangeSpace: string;
          WindowDidChangeSpaceOrderingMode: string;
          WindowDidChangeTitle: string;
          WindowDidChangeToolbar: string;
          WindowDidDeminiaturize: string;
          WindowDidEndSheet: string;
          WindowDidEnterFullScreen: string;
          WindowDidEnterVersionBrowser: string;
          WindowDidExitFullScreen: string;
          WindowDidExitVersionBrowser: string;
          WindowDidExpose: string;
          WindowDidFocus: string;
          WindowDidMiniaturize: string;
          WindowDidMove: string;
          WindowDidOrderOffScreen: string;
          WindowDidOrderOnScreen: string;
          WindowDidResignKey: string;
          WindowDidResignMain: string;
          WindowDidResize: string;
          WindowDidUpdate: string;
          WindowDidUpdateAlpha: string;
          WindowDidUpdateCollectionBehavior: string;
          WindowDidUpdateCollectionProperties: string;
          WindowDidUpdateShadow: string;
          WindowDidUpdateTitle: string;
          WindowDidUpdateToolbar: string;
          WindowDidZoom: string;
          WindowFileDraggingEntered: string;
          WindowFileDraggingExited: string;
          WindowFileDraggingPerformed: string;
          WindowHide: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowShouldClose: string;
          WindowShow: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowWillBecomeKey: string;
          WindowWillBecomeMain: string;
          WindowWillBeginSheet: string;
          WindowWillChangeOrderingMode: string;
          WindowWillClose: string;
          WindowWillDeminiaturize: string;
          WindowWillEnterFullScreen: string;
          WindowWillEnterVersionBrowser: string;
          WindowWillExitFullScreen: string;
          WindowWillExitVersionBrowser: string;
          WindowWillFocus: string;
          WindowWillMiniaturize: string;
          WindowWillMove: string;
          WindowWillOrderOffScreen: string;
          WindowWillOrderOnScreen: string;
          WindowWillResignMain: string;
          WindowWillResize: string;
          WindowWillUnfocus: string;
          WindowWillUpdate: string;
          WindowWillUpdateAlpha: string;
          WindowWillUpdateCollectionBehavior: string;
          WindowWillUpdateCollectionProperties: string;
          WindowWillUpdateShadow: string;
          WindowWillUpdateTitle: string;
          WindowWillUpdateToolbar: string;
          WindowWillUpdateVisibility: string;
          WindowWillUseStandardFrame: string;
          WindowZoomIn: string;
          WindowZoomOut: string;
          WindowZoomReset: string;
      }
      • ApplicationDidBecomeActive: string
      • ApplicationDidChangeBackingProperties: string
      • ApplicationDidChangeEffectiveAppearance: string
      • ApplicationDidChangeIcon: string
      • ApplicationDidChangeOcclusionState: string
      • ApplicationDidChangeScreenParameters: string
      • ApplicationDidChangeStatusBarFrame: string
      • ApplicationDidChangeStatusBarOrientation: string
      • ApplicationDidChangeTheme: string
      • ApplicationDidFinishLaunching: string
      • ApplicationDidHide: string
      • ApplicationDidResignActive: string
      • ApplicationDidUnhide: string
      • ApplicationDidUpdate: string
      • ApplicationShouldHandleReopen: string
      • ApplicationWillBecomeActive: string
      • ApplicationWillFinishLaunching: string
      • ApplicationWillHide: string
      • ApplicationWillResignActive: string
      • ApplicationWillTerminate: string
      • ApplicationWillUnhide: string
      • ApplicationWillUpdate: string
      • MenuDidAddItem: string
      • MenuDidBeginTracking: string
      • MenuDidClose: string
      • MenuDidDisplayItem: string
      • MenuDidEndTracking: string
      • MenuDidHighlightItem: string
      • MenuDidOpen: string
      • MenuDidPopUp: string
      • MenuDidRemoveItem: string
      • MenuDidSendAction: string
      • MenuDidSendActionToItem: string
      • MenuDidUpdate: string
      • MenuWillAddItem: string
      • MenuWillBeginTracking: string
      • MenuWillDisplayItem: string
      • MenuWillEndTracking: string
      • MenuWillHighlightItem: string
      • MenuWillOpen: string
      • MenuWillPopUp: string
      • MenuWillRemoveItem: string
      • MenuWillSendAction: string
      • MenuWillSendActionToItem: string
      • MenuWillUpdate: string
      • WebViewDidCommitNavigation: string
      • WebViewDidFinishNavigation: string
      • WebViewDidReceiveServerRedirectForProvisionalNavigation: string
      • WebViewDidStartProvisionalNavigation: string
      • WindowDidBecomeKey: string
      • WindowDidBecomeMain: string
      • WindowDidBeginSheet: string
      • WindowDidChangeAlpha: string
      • WindowDidChangeBackingLocation: string
      • WindowDidChangeBackingProperties: string
      • WindowDidChangeCollectionBehavior: string
      • WindowDidChangeEffectiveAppearance: string
      • WindowDidChangeOcclusionState: string
      • WindowDidChangeOrderingMode: string
      • WindowDidChangeScreen: string
      • WindowDidChangeScreenParameters: string
      • WindowDidChangeScreenProfile: string
      • WindowDidChangeScreenSpace: string
      • WindowDidChangeScreenSpaceProperties: string
      • WindowDidChangeSharingType: string
      • WindowDidChangeSpace: string
      • WindowDidChangeSpaceOrderingMode: string
      • WindowDidChangeTitle: string
      • WindowDidChangeToolbar: string
      • WindowDidDeminiaturize: string
      • WindowDidEndSheet: string
      • WindowDidEnterFullScreen: string
      • WindowDidEnterVersionBrowser: string
      • WindowDidExitFullScreen: string
      • WindowDidExitVersionBrowser: string
      • WindowDidExpose: string
      • WindowDidFocus: string
      • WindowDidMiniaturize: string
      • WindowDidMove: string
      • WindowDidOrderOffScreen: string
      • WindowDidOrderOnScreen: string
      • WindowDidResignKey: string
      • WindowDidResignMain: string
      • WindowDidResize: string
      • WindowDidUpdate: string
      • WindowDidUpdateAlpha: string
      • WindowDidUpdateCollectionBehavior: string
      • WindowDidUpdateCollectionProperties: string
      • WindowDidUpdateShadow: string
      • WindowDidUpdateTitle: string
      • WindowDidUpdateToolbar: string
      • WindowDidZoom: string
      • WindowFileDraggingEntered: string
      • WindowFileDraggingExited: string
      • WindowFileDraggingPerformed: string
      • WindowHide: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowShouldClose: string
      • WindowShow: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowWillBecomeKey: string
      • WindowWillBecomeMain: string
      • WindowWillBeginSheet: string
      • WindowWillChangeOrderingMode: string
      • WindowWillClose: string
      • WindowWillDeminiaturize: string
      • WindowWillEnterFullScreen: string
      • WindowWillEnterVersionBrowser: string
      • WindowWillExitFullScreen: string
      • WindowWillExitVersionBrowser: string
      • WindowWillFocus: string
      • WindowWillMiniaturize: string
      • WindowWillMove: string
      • WindowWillOrderOffScreen: string
      • WindowWillOrderOnScreen: string
      • WindowWillResignMain: string
      • WindowWillResize: string
      • WindowWillUnfocus: string
      • WindowWillUpdate: string
      • WindowWillUpdateAlpha: string
      • WindowWillUpdateCollectionBehavior: string
      • WindowWillUpdateCollectionProperties: string
      • WindowWillUpdateShadow: string
      • WindowWillUpdateTitle: string
      • WindowWillUpdateToolbar: string
      • WindowWillUpdateVisibility: string
      • WindowWillUseStandardFrame: string
      • WindowZoomIn: string
      • WindowZoomOut: string
      • WindowZoomReset: string
    • Windows: {
          APMPowerSettingChange: string;
          APMPowerStatusChange: string;
          APMResumeAutomatic: string;
          APMResumeSuspend: string;
          APMSuspend: string;
          ApplicationStarted: string;
          SystemThemeChanged: string;
          WebViewNavigationCompleted: string;
          WindowActive: string;
          WindowBackgroundErase: string;
          WindowClickActive: string;
          WindowClosing: string;
          WindowDPIChanged: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowDragDrop: string;
          WindowDragEnter: string;
          WindowDragLeave: string;
          WindowDragOver: string;
          WindowEndMove: string;
          WindowEndResize: string;
          WindowFullscreen: string;
          WindowHide: string;
          WindowInactive: string;
          WindowKeyDown: string;
          WindowKeyUp: string;
          WindowKillFocus: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowNonClientHit: string;
          WindowNonClientMouseDown: string;
          WindowNonClientMouseLeave: string;
          WindowNonClientMouseMove: string;
          WindowNonClientMouseUp: string;
          WindowPaint: string;
          WindowRestore: string;
          WindowSetFocus: string;
          WindowShow: string;
          WindowStartMove: string;
          WindowStartResize: string;
          WindowUnFullscreen: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowZOrderChanged: string;
      }
      • APMPowerSettingChange: string
      • APMPowerStatusChange: string
      • APMResumeAutomatic: string
      • APMResumeSuspend: string
      • APMSuspend: string
      • ApplicationStarted: string
      • SystemThemeChanged: string
      • WebViewNavigationCompleted: string
      • WindowActive: string
      • WindowBackgroundErase: string
      • WindowClickActive: string
      • WindowClosing: string
      • WindowDPIChanged: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowDragDrop: string
      • WindowDragEnter: string
      • WindowDragLeave: string
      • WindowDragOver: string
      • WindowEndMove: string
      • WindowEndResize: string
      • WindowFullscreen: string
      • WindowHide: string
      • WindowInactive: string
      • WindowKeyDown: string
      • WindowKeyUp: string
      • WindowKillFocus: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowNonClientHit: string
      • WindowNonClientMouseDown: string
      • WindowNonClientMouseLeave: string
      • WindowNonClientMouseMove: string
      • WindowNonClientMouseUp: string
      • WindowPaint: string
      • WindowRestore: string
      • WindowSetFocus: string
      • WindowShow: string
      • WindowStartMove: string
      • WindowStartResize: string
      • WindowUnFullscreen: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowZOrderChanged: string

    Generated using TypeDoc

    \ No newline at end of file +Types | @wailsio/runtime

    Variable TypesConst

    Types: {
        Common: {
            ApplicationOpenedWithFile: string;
            ApplicationStarted: string;
            ThemeChanged: string;
            WindowClosing: string;
            WindowDPIChanged: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowFilesDropped: string;
            WindowFocus: string;
            WindowFullscreen: string;
            WindowHide: string;
            WindowLostFocus: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowRestore: string;
            WindowRuntimeReady: string;
            WindowShow: string;
            WindowUnFullscreen: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowZoom: string;
            WindowZoomIn: string;
            WindowZoomOut: string;
            WindowZoomReset: string;
        };
        Linux: {
            ApplicationStartup: string;
            SystemThemeChanged: string;
            WindowDeleteEvent: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowFocusIn: string;
            WindowFocusOut: string;
            WindowLoadChanged: string;
        };
        Mac: {
            ApplicationDidBecomeActive: string;
            ApplicationDidChangeBackingProperties: string;
            ApplicationDidChangeEffectiveAppearance: string;
            ApplicationDidChangeIcon: string;
            ApplicationDidChangeOcclusionState: string;
            ApplicationDidChangeScreenParameters: string;
            ApplicationDidChangeStatusBarFrame: string;
            ApplicationDidChangeStatusBarOrientation: string;
            ApplicationDidChangeTheme: string;
            ApplicationDidFinishLaunching: string;
            ApplicationDidHide: string;
            ApplicationDidResignActive: string;
            ApplicationDidUnhide: string;
            ApplicationDidUpdate: string;
            ApplicationShouldHandleReopen: string;
            ApplicationWillBecomeActive: string;
            ApplicationWillFinishLaunching: string;
            ApplicationWillHide: string;
            ApplicationWillResignActive: string;
            ApplicationWillTerminate: string;
            ApplicationWillUnhide: string;
            ApplicationWillUpdate: string;
            MenuDidAddItem: string;
            MenuDidBeginTracking: string;
            MenuDidClose: string;
            MenuDidDisplayItem: string;
            MenuDidEndTracking: string;
            MenuDidHighlightItem: string;
            MenuDidOpen: string;
            MenuDidPopUp: string;
            MenuDidRemoveItem: string;
            MenuDidSendAction: string;
            MenuDidSendActionToItem: string;
            MenuDidUpdate: string;
            MenuWillAddItem: string;
            MenuWillBeginTracking: string;
            MenuWillDisplayItem: string;
            MenuWillEndTracking: string;
            MenuWillHighlightItem: string;
            MenuWillOpen: string;
            MenuWillPopUp: string;
            MenuWillRemoveItem: string;
            MenuWillSendAction: string;
            MenuWillSendActionToItem: string;
            MenuWillUpdate: string;
            WebViewDidCommitNavigation: string;
            WebViewDidFinishNavigation: string;
            WebViewDidReceiveServerRedirectForProvisionalNavigation: string;
            WebViewDidStartProvisionalNavigation: string;
            WindowDidBecomeKey: string;
            WindowDidBecomeMain: string;
            WindowDidBeginSheet: string;
            WindowDidChangeAlpha: string;
            WindowDidChangeBackingLocation: string;
            WindowDidChangeBackingProperties: string;
            WindowDidChangeCollectionBehavior: string;
            WindowDidChangeEffectiveAppearance: string;
            WindowDidChangeOcclusionState: string;
            WindowDidChangeOrderingMode: string;
            WindowDidChangeScreen: string;
            WindowDidChangeScreenParameters: string;
            WindowDidChangeScreenProfile: string;
            WindowDidChangeScreenSpace: string;
            WindowDidChangeScreenSpaceProperties: string;
            WindowDidChangeSharingType: string;
            WindowDidChangeSpace: string;
            WindowDidChangeSpaceOrderingMode: string;
            WindowDidChangeTitle: string;
            WindowDidChangeToolbar: string;
            WindowDidDeminiaturize: string;
            WindowDidEndSheet: string;
            WindowDidEnterFullScreen: string;
            WindowDidEnterVersionBrowser: string;
            WindowDidExitFullScreen: string;
            WindowDidExitVersionBrowser: string;
            WindowDidExpose: string;
            WindowDidFocus: string;
            WindowDidMiniaturize: string;
            WindowDidMove: string;
            WindowDidOrderOffScreen: string;
            WindowDidOrderOnScreen: string;
            WindowDidResignKey: string;
            WindowDidResignMain: string;
            WindowDidResize: string;
            WindowDidUpdate: string;
            WindowDidUpdateAlpha: string;
            WindowDidUpdateCollectionBehavior: string;
            WindowDidUpdateCollectionProperties: string;
            WindowDidUpdateShadow: string;
            WindowDidUpdateTitle: string;
            WindowDidUpdateToolbar: string;
            WindowDidZoom: string;
            WindowFileDraggingEntered: string;
            WindowFileDraggingExited: string;
            WindowFileDraggingPerformed: string;
            WindowHide: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowShouldClose: string;
            WindowShow: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowWillBecomeKey: string;
            WindowWillBecomeMain: string;
            WindowWillBeginSheet: string;
            WindowWillChangeOrderingMode: string;
            WindowWillClose: string;
            WindowWillDeminiaturize: string;
            WindowWillEnterFullScreen: string;
            WindowWillEnterVersionBrowser: string;
            WindowWillExitFullScreen: string;
            WindowWillExitVersionBrowser: string;
            WindowWillFocus: string;
            WindowWillMiniaturize: string;
            WindowWillMove: string;
            WindowWillOrderOffScreen: string;
            WindowWillOrderOnScreen: string;
            WindowWillResignMain: string;
            WindowWillResize: string;
            WindowWillUnfocus: string;
            WindowWillUpdate: string;
            WindowWillUpdateAlpha: string;
            WindowWillUpdateCollectionBehavior: string;
            WindowWillUpdateCollectionProperties: string;
            WindowWillUpdateShadow: string;
            WindowWillUpdateTitle: string;
            WindowWillUpdateToolbar: string;
            WindowWillUpdateVisibility: string;
            WindowWillUseStandardFrame: string;
            WindowZoomIn: string;
            WindowZoomOut: string;
            WindowZoomReset: string;
        };
        Windows: {
            APMPowerSettingChange: string;
            APMPowerStatusChange: string;
            APMResumeAutomatic: string;
            APMResumeSuspend: string;
            APMSuspend: string;
            ApplicationStarted: string;
            SystemThemeChanged: string;
            WebViewNavigationCompleted: string;
            WindowActive: string;
            WindowBackgroundErase: string;
            WindowClickActive: string;
            WindowClosing: string;
            WindowDPIChanged: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowDragDrop: string;
            WindowDragEnter: string;
            WindowDragLeave: string;
            WindowDragOver: string;
            WindowEndMove: string;
            WindowEndResize: string;
            WindowFullscreen: string;
            WindowHide: string;
            WindowInactive: string;
            WindowKeyDown: string;
            WindowKeyUp: string;
            WindowKillFocus: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowNonClientHit: string;
            WindowNonClientMouseDown: string;
            WindowNonClientMouseLeave: string;
            WindowNonClientMouseMove: string;
            WindowNonClientMouseUp: string;
            WindowPaint: string;
            WindowRestore: string;
            WindowSetFocus: string;
            WindowShow: string;
            WindowStartMove: string;
            WindowStartResize: string;
            WindowUnFullscreen: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowZOrderChanged: string;
        };
    } = EventTypes

    Type declaration

    • Common: {
          ApplicationOpenedWithFile: string;
          ApplicationStarted: string;
          ThemeChanged: string;
          WindowClosing: string;
          WindowDPIChanged: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowFilesDropped: string;
          WindowFocus: string;
          WindowFullscreen: string;
          WindowHide: string;
          WindowLostFocus: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowRestore: string;
          WindowRuntimeReady: string;
          WindowShow: string;
          WindowUnFullscreen: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowZoom: string;
          WindowZoomIn: string;
          WindowZoomOut: string;
          WindowZoomReset: string;
      }
      • ApplicationOpenedWithFile: string
      • ApplicationStarted: string
      • ThemeChanged: string
      • WindowClosing: string
      • WindowDPIChanged: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowFilesDropped: string
      • WindowFocus: string
      • WindowFullscreen: string
      • WindowHide: string
      • WindowLostFocus: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowRestore: string
      • WindowRuntimeReady: string
      • WindowShow: string
      • WindowUnFullscreen: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowZoom: string
      • WindowZoomIn: string
      • WindowZoomOut: string
      • WindowZoomReset: string
    • Linux: {
          ApplicationStartup: string;
          SystemThemeChanged: string;
          WindowDeleteEvent: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowFocusIn: string;
          WindowFocusOut: string;
          WindowLoadChanged: string;
      }
      • ApplicationStartup: string
      • SystemThemeChanged: string
      • WindowDeleteEvent: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowFocusIn: string
      • WindowFocusOut: string
      • WindowLoadChanged: string
    • Mac: {
          ApplicationDidBecomeActive: string;
          ApplicationDidChangeBackingProperties: string;
          ApplicationDidChangeEffectiveAppearance: string;
          ApplicationDidChangeIcon: string;
          ApplicationDidChangeOcclusionState: string;
          ApplicationDidChangeScreenParameters: string;
          ApplicationDidChangeStatusBarFrame: string;
          ApplicationDidChangeStatusBarOrientation: string;
          ApplicationDidChangeTheme: string;
          ApplicationDidFinishLaunching: string;
          ApplicationDidHide: string;
          ApplicationDidResignActive: string;
          ApplicationDidUnhide: string;
          ApplicationDidUpdate: string;
          ApplicationShouldHandleReopen: string;
          ApplicationWillBecomeActive: string;
          ApplicationWillFinishLaunching: string;
          ApplicationWillHide: string;
          ApplicationWillResignActive: string;
          ApplicationWillTerminate: string;
          ApplicationWillUnhide: string;
          ApplicationWillUpdate: string;
          MenuDidAddItem: string;
          MenuDidBeginTracking: string;
          MenuDidClose: string;
          MenuDidDisplayItem: string;
          MenuDidEndTracking: string;
          MenuDidHighlightItem: string;
          MenuDidOpen: string;
          MenuDidPopUp: string;
          MenuDidRemoveItem: string;
          MenuDidSendAction: string;
          MenuDidSendActionToItem: string;
          MenuDidUpdate: string;
          MenuWillAddItem: string;
          MenuWillBeginTracking: string;
          MenuWillDisplayItem: string;
          MenuWillEndTracking: string;
          MenuWillHighlightItem: string;
          MenuWillOpen: string;
          MenuWillPopUp: string;
          MenuWillRemoveItem: string;
          MenuWillSendAction: string;
          MenuWillSendActionToItem: string;
          MenuWillUpdate: string;
          WebViewDidCommitNavigation: string;
          WebViewDidFinishNavigation: string;
          WebViewDidReceiveServerRedirectForProvisionalNavigation: string;
          WebViewDidStartProvisionalNavigation: string;
          WindowDidBecomeKey: string;
          WindowDidBecomeMain: string;
          WindowDidBeginSheet: string;
          WindowDidChangeAlpha: string;
          WindowDidChangeBackingLocation: string;
          WindowDidChangeBackingProperties: string;
          WindowDidChangeCollectionBehavior: string;
          WindowDidChangeEffectiveAppearance: string;
          WindowDidChangeOcclusionState: string;
          WindowDidChangeOrderingMode: string;
          WindowDidChangeScreen: string;
          WindowDidChangeScreenParameters: string;
          WindowDidChangeScreenProfile: string;
          WindowDidChangeScreenSpace: string;
          WindowDidChangeScreenSpaceProperties: string;
          WindowDidChangeSharingType: string;
          WindowDidChangeSpace: string;
          WindowDidChangeSpaceOrderingMode: string;
          WindowDidChangeTitle: string;
          WindowDidChangeToolbar: string;
          WindowDidDeminiaturize: string;
          WindowDidEndSheet: string;
          WindowDidEnterFullScreen: string;
          WindowDidEnterVersionBrowser: string;
          WindowDidExitFullScreen: string;
          WindowDidExitVersionBrowser: string;
          WindowDidExpose: string;
          WindowDidFocus: string;
          WindowDidMiniaturize: string;
          WindowDidMove: string;
          WindowDidOrderOffScreen: string;
          WindowDidOrderOnScreen: string;
          WindowDidResignKey: string;
          WindowDidResignMain: string;
          WindowDidResize: string;
          WindowDidUpdate: string;
          WindowDidUpdateAlpha: string;
          WindowDidUpdateCollectionBehavior: string;
          WindowDidUpdateCollectionProperties: string;
          WindowDidUpdateShadow: string;
          WindowDidUpdateTitle: string;
          WindowDidUpdateToolbar: string;
          WindowDidZoom: string;
          WindowFileDraggingEntered: string;
          WindowFileDraggingExited: string;
          WindowFileDraggingPerformed: string;
          WindowHide: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowShouldClose: string;
          WindowShow: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowWillBecomeKey: string;
          WindowWillBecomeMain: string;
          WindowWillBeginSheet: string;
          WindowWillChangeOrderingMode: string;
          WindowWillClose: string;
          WindowWillDeminiaturize: string;
          WindowWillEnterFullScreen: string;
          WindowWillEnterVersionBrowser: string;
          WindowWillExitFullScreen: string;
          WindowWillExitVersionBrowser: string;
          WindowWillFocus: string;
          WindowWillMiniaturize: string;
          WindowWillMove: string;
          WindowWillOrderOffScreen: string;
          WindowWillOrderOnScreen: string;
          WindowWillResignMain: string;
          WindowWillResize: string;
          WindowWillUnfocus: string;
          WindowWillUpdate: string;
          WindowWillUpdateAlpha: string;
          WindowWillUpdateCollectionBehavior: string;
          WindowWillUpdateCollectionProperties: string;
          WindowWillUpdateShadow: string;
          WindowWillUpdateTitle: string;
          WindowWillUpdateToolbar: string;
          WindowWillUpdateVisibility: string;
          WindowWillUseStandardFrame: string;
          WindowZoomIn: string;
          WindowZoomOut: string;
          WindowZoomReset: string;
      }
      • ApplicationDidBecomeActive: string
      • ApplicationDidChangeBackingProperties: string
      • ApplicationDidChangeEffectiveAppearance: string
      • ApplicationDidChangeIcon: string
      • ApplicationDidChangeOcclusionState: string
      • ApplicationDidChangeScreenParameters: string
      • ApplicationDidChangeStatusBarFrame: string
      • ApplicationDidChangeStatusBarOrientation: string
      • ApplicationDidChangeTheme: string
      • ApplicationDidFinishLaunching: string
      • ApplicationDidHide: string
      • ApplicationDidResignActive: string
      • ApplicationDidUnhide: string
      • ApplicationDidUpdate: string
      • ApplicationShouldHandleReopen: string
      • ApplicationWillBecomeActive: string
      • ApplicationWillFinishLaunching: string
      • ApplicationWillHide: string
      • ApplicationWillResignActive: string
      • ApplicationWillTerminate: string
      • ApplicationWillUnhide: string
      • ApplicationWillUpdate: string
      • MenuDidAddItem: string
      • MenuDidBeginTracking: string
      • MenuDidClose: string
      • MenuDidDisplayItem: string
      • MenuDidEndTracking: string
      • MenuDidHighlightItem: string
      • MenuDidOpen: string
      • MenuDidPopUp: string
      • MenuDidRemoveItem: string
      • MenuDidSendAction: string
      • MenuDidSendActionToItem: string
      • MenuDidUpdate: string
      • MenuWillAddItem: string
      • MenuWillBeginTracking: string
      • MenuWillDisplayItem: string
      • MenuWillEndTracking: string
      • MenuWillHighlightItem: string
      • MenuWillOpen: string
      • MenuWillPopUp: string
      • MenuWillRemoveItem: string
      • MenuWillSendAction: string
      • MenuWillSendActionToItem: string
      • MenuWillUpdate: string
      • WebViewDidCommitNavigation: string
      • WebViewDidFinishNavigation: string
      • WebViewDidReceiveServerRedirectForProvisionalNavigation: string
      • WebViewDidStartProvisionalNavigation: string
      • WindowDidBecomeKey: string
      • WindowDidBecomeMain: string
      • WindowDidBeginSheet: string
      • WindowDidChangeAlpha: string
      • WindowDidChangeBackingLocation: string
      • WindowDidChangeBackingProperties: string
      • WindowDidChangeCollectionBehavior: string
      • WindowDidChangeEffectiveAppearance: string
      • WindowDidChangeOcclusionState: string
      • WindowDidChangeOrderingMode: string
      • WindowDidChangeScreen: string
      • WindowDidChangeScreenParameters: string
      • WindowDidChangeScreenProfile: string
      • WindowDidChangeScreenSpace: string
      • WindowDidChangeScreenSpaceProperties: string
      • WindowDidChangeSharingType: string
      • WindowDidChangeSpace: string
      • WindowDidChangeSpaceOrderingMode: string
      • WindowDidChangeTitle: string
      • WindowDidChangeToolbar: string
      • WindowDidDeminiaturize: string
      • WindowDidEndSheet: string
      • WindowDidEnterFullScreen: string
      • WindowDidEnterVersionBrowser: string
      • WindowDidExitFullScreen: string
      • WindowDidExitVersionBrowser: string
      • WindowDidExpose: string
      • WindowDidFocus: string
      • WindowDidMiniaturize: string
      • WindowDidMove: string
      • WindowDidOrderOffScreen: string
      • WindowDidOrderOnScreen: string
      • WindowDidResignKey: string
      • WindowDidResignMain: string
      • WindowDidResize: string
      • WindowDidUpdate: string
      • WindowDidUpdateAlpha: string
      • WindowDidUpdateCollectionBehavior: string
      • WindowDidUpdateCollectionProperties: string
      • WindowDidUpdateShadow: string
      • WindowDidUpdateTitle: string
      • WindowDidUpdateToolbar: string
      • WindowDidZoom: string
      • WindowFileDraggingEntered: string
      • WindowFileDraggingExited: string
      • WindowFileDraggingPerformed: string
      • WindowHide: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowShouldClose: string
      • WindowShow: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowWillBecomeKey: string
      • WindowWillBecomeMain: string
      • WindowWillBeginSheet: string
      • WindowWillChangeOrderingMode: string
      • WindowWillClose: string
      • WindowWillDeminiaturize: string
      • WindowWillEnterFullScreen: string
      • WindowWillEnterVersionBrowser: string
      • WindowWillExitFullScreen: string
      • WindowWillExitVersionBrowser: string
      • WindowWillFocus: string
      • WindowWillMiniaturize: string
      • WindowWillMove: string
      • WindowWillOrderOffScreen: string
      • WindowWillOrderOnScreen: string
      • WindowWillResignMain: string
      • WindowWillResize: string
      • WindowWillUnfocus: string
      • WindowWillUpdate: string
      • WindowWillUpdateAlpha: string
      • WindowWillUpdateCollectionBehavior: string
      • WindowWillUpdateCollectionProperties: string
      • WindowWillUpdateShadow: string
      • WindowWillUpdateTitle: string
      • WindowWillUpdateToolbar: string
      • WindowWillUpdateVisibility: string
      • WindowWillUseStandardFrame: string
      • WindowZoomIn: string
      • WindowZoomOut: string
      • WindowZoomReset: string
    • Windows: {
          APMPowerSettingChange: string;
          APMPowerStatusChange: string;
          APMResumeAutomatic: string;
          APMResumeSuspend: string;
          APMSuspend: string;
          ApplicationStarted: string;
          SystemThemeChanged: string;
          WebViewNavigationCompleted: string;
          WindowActive: string;
          WindowBackgroundErase: string;
          WindowClickActive: string;
          WindowClosing: string;
          WindowDPIChanged: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowDragDrop: string;
          WindowDragEnter: string;
          WindowDragLeave: string;
          WindowDragOver: string;
          WindowEndMove: string;
          WindowEndResize: string;
          WindowFullscreen: string;
          WindowHide: string;
          WindowInactive: string;
          WindowKeyDown: string;
          WindowKeyUp: string;
          WindowKillFocus: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowNonClientHit: string;
          WindowNonClientMouseDown: string;
          WindowNonClientMouseLeave: string;
          WindowNonClientMouseMove: string;
          WindowNonClientMouseUp: string;
          WindowPaint: string;
          WindowRestore: string;
          WindowSetFocus: string;
          WindowShow: string;
          WindowStartMove: string;
          WindowStartResize: string;
          WindowUnFullscreen: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowZOrderChanged: string;
      }
      • APMPowerSettingChange: string
      • APMPowerStatusChange: string
      • APMResumeAutomatic: string
      • APMResumeSuspend: string
      • APMSuspend: string
      • ApplicationStarted: string
      • SystemThemeChanged: string
      • WebViewNavigationCompleted: string
      • WindowActive: string
      • WindowBackgroundErase: string
      • WindowClickActive: string
      • WindowClosing: string
      • WindowDPIChanged: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowDragDrop: string
      • WindowDragEnter: string
      • WindowDragLeave: string
      • WindowDragOver: string
      • WindowEndMove: string
      • WindowEndResize: string
      • WindowFullscreen: string
      • WindowHide: string
      • WindowInactive: string
      • WindowKeyDown: string
      • WindowKeyUp: string
      • WindowKillFocus: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowNonClientHit: string
      • WindowNonClientMouseDown: string
      • WindowNonClientMouseLeave: string
      • WindowNonClientMouseMove: string
      • WindowNonClientMouseUp: string
      • WindowPaint: string
      • WindowRestore: string
      • WindowSetFocus: string
      • WindowShow: string
      • WindowStartMove: string
      • WindowStartResize: string
      • WindowUnFullscreen: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowZOrderChanged: string

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Window.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Window.html index 39300dc73..70120076c 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Window.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Window.html @@ -1,2 +1,2 @@ Window | @wailsio/runtime

    Variable WindowConst

    Window: Window = ...

    The window within which the script is running.

    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/package-lock.json b/v3/internal/runtime/desktop/@wailsio/runtime/package-lock.json index 454ff83a7..e163bd8ee 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/package-lock.json +++ b/v3/internal/runtime/desktop/@wailsio/runtime/package-lock.json @@ -1,12 +1,12 @@ { "name": "@wailsio/runtime", - "version": "3.0.0-alpha.62", + "version": "3.0.0-alpha.63", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@wailsio/runtime", - "version": "3.0.0-alpha.62", + "version": "3.0.0-alpha.63", "license": "MIT", "devDependencies": { "rimraf": "^5.0.5", diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/package.json b/v3/internal/runtime/desktop/@wailsio/runtime/package.json index 6aecdb7d1..89d4f30c3 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/package.json +++ b/v3/internal/runtime/desktop/@wailsio/runtime/package.json @@ -1,7 +1,7 @@ { "name": "@wailsio/runtime", "type": "module", - "version": "3.0.0-alpha.62", + "version": "3.0.0-alpha.63", "description": "Wails Runtime", "types": "types/index.d.ts", "exports": { From 01a51f74e41d05003fafc52b85589e45dd31e0f2 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Fri, 28 Feb 2025 07:33:13 +1100 Subject: [PATCH 108/374] [ci] Better PR checks --- .github/workflows/build-and-test-v3.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/.github/workflows/build-and-test-v3.yml b/.github/workflows/build-and-test-v3.yml index b8eede071..61cb9dde9 100644 --- a/.github/workflows/build-and-test-v3.yml +++ b/.github/workflows/build-and-test-v3.yml @@ -172,3 +172,17 @@ jobs: wails3 init -n ${{ matrix.template }} -t ${{ matrix.template }} cd ${{ matrix.template }} wails3 build + + results: + if: ${{ always() }} + runs-on: ubuntu-latest + name: v3 Build Results + needs: [test_go, test_js, test_templates] + steps: + - run: | + result="${{ needs.build.result }}" + if [[ $result == "success" || $result == "skipped" ]]; then + exit 0 + else + exit 1 + fi \ No newline at end of file From e1a296c68e1a78310e43ad507f9bd039fc143cd8 Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Thu, 27 Feb 2025 20:33:57 +0000 Subject: [PATCH 109/374] [skip ci] Publish @wailsio/runtime v3.0.0-alpha.64 --- .../docs/classes/Call.RuntimeError.html | 4 +-- .../docs/classes/Events.WailsEvent.html | 4 +-- .../docs/functions/Application.Hide.html | 2 +- .../docs/functions/Application.Quit.html | 2 +- .../docs/functions/Application.Show.html | 2 +- .../docs/functions/Browser.OpenURL.html | 2 +- .../runtime/docs/functions/Call.ByID.html | 2 +- .../runtime/docs/functions/Call.ByName.html | 2 +- .../runtime/docs/functions/Call.Call.html | 2 +- .../docs/functions/Clipboard.SetText.html | 2 +- .../docs/functions/Clipboard.Text.html | 2 +- .../runtime/docs/functions/Create.Any.html | 2 +- .../runtime/docs/functions/Create.Array.html | 2 +- .../docs/functions/Create.ByteSlice.html | 2 +- .../runtime/docs/functions/Create.Map.html | 2 +- .../docs/functions/Create.Nullable.html | 2 +- .../runtime/docs/functions/Create.Struct.html | 2 +- .../runtime/docs/functions/Dialogs.Error.html | 2 +- .../runtime/docs/functions/Dialogs.Info.html | 2 +- .../docs/functions/Dialogs.OpenFile.html | 2 +- .../docs/functions/Dialogs.Question.html | 2 +- .../docs/functions/Dialogs.SaveFile.html | 2 +- .../docs/functions/Dialogs.Warning.html | 2 +- .../runtime/docs/functions/Events.Emit.html | 2 +- .../runtime/docs/functions/Events.Off.html | 2 +- .../runtime/docs/functions/Events.OffAll.html | 2 +- .../runtime/docs/functions/Events.On.html | 2 +- .../docs/functions/Events.OnMultiple.html | 2 +- .../runtime/docs/functions/Events.Once.html | 2 +- .../runtime/docs/functions/Events.setup.html | 2 +- .../runtime/docs/functions/Flags.GetFlag.html | 2 +- .../docs/functions/Screens.GetAll.html | 2 +- .../docs/functions/Screens.GetCurrent.html | 2 +- .../docs/functions/Screens.GetPrimary.html | 2 +- .../docs/functions/System.Capabilities.html | 2 +- .../docs/functions/System.Environment.html | 2 +- .../docs/functions/System.IsAMD64.html | 2 +- .../runtime/docs/functions/System.IsARM.html | 2 +- .../docs/functions/System.IsARM64.html | 2 +- .../docs/functions/System.IsDarkMode.html | 2 +- .../docs/functions/System.IsDebug.html | 2 +- .../docs/functions/System.IsLinux.html | 2 +- .../runtime/docs/functions/System.IsMac.html | 2 +- .../docs/functions/System.IsWindows.html | 2 +- .../runtime/docs/functions/System.invoke.html | 2 +- .../runtime/docs/functions/WML.Enable.html | 2 +- .../runtime/docs/functions/WML.Reload.html | 2 +- .../@wailsio/runtime/docs/functions/init.html | 2 +- .../docs/interfaces/Call.CallOptions.html | 8 ++--- .../docs/interfaces/Dialogs.Button.html | 8 ++--- .../docs/interfaces/Dialogs.FileFilter.html | 6 ++-- .../Dialogs.MessageDialogOptions.html | 10 +++--- .../Dialogs.OpenFileDialogOptions.html | 34 +++++++++--------- .../Dialogs.SaveFileDialogOptions.html | 36 +++++++++---------- .../runtime/docs/interfaces/Screens.Rect.html | 10 +++--- .../docs/interfaces/Screens.Screen.html | 26 +++++++------- .../runtime/docs/interfaces/Screens.Size.html | 6 ++-- .../interfaces/System.EnvironmentInfo.html | 12 +++---- .../docs/interfaces/System.OSInfo.html | 10 +++--- .../runtime/docs/modules/Application.html | 2 +- .../runtime/docs/modules/Browser.html | 2 +- .../@wailsio/runtime/docs/modules/Call.html | 2 +- .../runtime/docs/modules/Clipboard.html | 2 +- .../@wailsio/runtime/docs/modules/Create.html | 2 +- .../runtime/docs/modules/Dialogs.html | 2 +- .../@wailsio/runtime/docs/modules/Events.html | 2 +- .../@wailsio/runtime/docs/modules/Flags.html | 2 +- .../runtime/docs/modules/Screens.html | 2 +- .../@wailsio/runtime/docs/modules/System.html | 2 +- .../@wailsio/runtime/docs/modules/WML.html | 2 +- .../runtime/docs/variables/Events.Types.html | 2 +- .../runtime/docs/variables/Window.html | 2 +- .../@wailsio/runtime/package-lock.json | 4 +-- .../desktop/@wailsio/runtime/package.json | 2 +- 74 files changed, 149 insertions(+), 149 deletions(-) diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Call.RuntimeError.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Call.RuntimeError.html index 602369672..f576a1307 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Call.RuntimeError.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Call.RuntimeError.html @@ -1,6 +1,6 @@ RuntimeError | @wailsio/runtime

    Exception class that will be thrown in case the bound method returns an error. The value of the RuntimeError#name property is "RuntimeError".

    -

    Hierarchy

    • Error
      • RuntimeError

    Constructors

    Hierarchy

    • Error
      • RuntimeError

    Constructors

    Properties

    cause? message name @@ -8,4 +8,4 @@ The value of the

    Constructors

    • Constructs a new RuntimeError instance.

      Parameters

      • message: string

        The error message.

      • Rest ...args: any[]

        Optional arguments for the Error constructor.

        -

      Returns RuntimeError

    Properties

    cause?: unknown
    message: string
    name: string
    stack?: string

    Generated using TypeDoc

    \ No newline at end of file +

    Returns RuntimeError

    Properties

    cause?: unknown
    message: string
    name: string
    stack?: string

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Events.WailsEvent.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Events.WailsEvent.html index 4689be5ee..a9b6ec306 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Events.WailsEvent.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Events.WailsEvent.html @@ -1,4 +1,4 @@ -WailsEvent | @wailsio/runtime

    Constructors

    constructor +WailsEvent | @wailsio/runtime

    Constructors

    Properties

    Constructors

    Properties

    data: any
    name: any

    Generated using TypeDoc

    \ No newline at end of file +

    Constructors

    Properties

    data: any
    name: any

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Hide.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Hide.html index 65cd5a1e9..d9aad5db4 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Hide.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Hide.html @@ -1,2 +1,2 @@ Hide | @wailsio/runtime
    • Hides a certain method by calling the HideMethod function.

      -

      Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file +

    Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Quit.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Quit.html index 49980fd4b..2e4b1968b 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Quit.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Quit.html @@ -1,2 +1,2 @@ Quit | @wailsio/runtime
    • Calls the QuitMethod to terminate the program.

      -

      Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file +

    Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Show.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Show.html index cf34da36a..09f9ccb0a 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Show.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Show.html @@ -1,2 +1,2 @@ Show | @wailsio/runtime
    • Calls the ShowMethod and returns the result.

      -

      Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file +

    Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Browser.OpenURL.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Browser.OpenURL.html index b9b6da401..924c511ac 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Browser.OpenURL.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Browser.OpenURL.html @@ -1,3 +1,3 @@ OpenURL | @wailsio/runtime
    • Open a browser window to the given URL

      Parameters

      • url: string

        The URL to open

        -

      Returns Promise<string>

    Generated using TypeDoc

    \ No newline at end of file +

    Returns Promise<string>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByID.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByID.html index e990592a5..4ed223ea1 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByID.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByID.html @@ -5,4 +5,4 @@ See Call for details.

    Returns Promise<any>

    • The result of the method call.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByName.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByName.html index dd557eb7d..4d55affab 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByName.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByName.html @@ -3,4 +3,4 @@ See Call for details.

    Parameters

    • methodName: string

      The name of the method in the format 'package.struct.method'.

    • Rest ...args: any[]

      The arguments to pass to the method.

    Returns Promise<any>

    The result of the method call.

    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.Call.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.Call.html index 09da4e257..742831636 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.Call.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.Call.html @@ -8,4 +8,4 @@ by the application- or service-level error marshaling functions.

    Returns Promise<any>

    • The result of the call.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.SetText.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.SetText.html index 78251cceb..efff4ae38 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.SetText.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.SetText.html @@ -3,4 +3,4 @@

    Returns Promise<any>

    • A Promise that resolves when the operation is successful.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.Text.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.Text.html index f71287cc9..a1f7fdc97 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.Text.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.Text.html @@ -1,3 +1,3 @@ Text | @wailsio/runtime
    • Get the Clipboard text

      Returns Promise<string>

      A promise that resolves with the text from the Clipboard.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Any.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Any.html index 940f9fbd5..28f357def 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Any.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Any.html @@ -1,2 +1,2 @@ Any | @wailsio/runtime
    • Any is a dummy creation function for simple or unknown types.

      -

      Type Parameters

      • T

      Parameters

      • source: any

      Returns T

    Generated using TypeDoc

    \ No newline at end of file +

    Type Parameters

    • T

    Parameters

    • source: any

    Returns T

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Array.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Array.html index ba201e603..4c3899dbc 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Array.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Array.html @@ -1,4 +1,4 @@ Array | @wailsio/runtime
    • Array takes a creation function for an arbitrary type and returns an in-place creation function for an array whose elements are of that type.

      -

      Type Parameters

      • T

      Parameters

      • element: ((source) => T)
          • (source): T
          • Parameters

            • source: any

            Returns T

      Returns ((source) => T[])

        • (source): T[]
        • Parameters

          • source: any

          Returns T[]

    Generated using TypeDoc

    \ No newline at end of file +

    Type Parameters

    • T

    Parameters

    • element: ((source) => T)
        • (source): T
        • Parameters

          • source: any

          Returns T

    Returns ((source) => T[])

      • (source): T[]
      • Parameters

        • source: any

        Returns T[]

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.ByteSlice.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.ByteSlice.html index 0dd07f9c1..111ee04b1 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.ByteSlice.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.ByteSlice.html @@ -1,3 +1,3 @@ ByteSlice | @wailsio/runtime
    • ByteSlice is a creation function that replaces null strings with empty strings.

      -

      Parameters

      • source: any

      Returns string

    Generated using TypeDoc

    \ No newline at end of file +

    Parameters

    • source: any

    Returns string

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Map.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Map.html index ef6a9928c..3f5714ab9 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Map.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Map.html @@ -1,4 +1,4 @@ Map | @wailsio/runtime
    • Map takes creation functions for two arbitrary types and returns an in-place creation function for an object whose keys and values are of those types.

      -

      Type Parameters

      • K
      • V

      Parameters

      • key: ((source) => K)
          • (source): K
          • Parameters

            • source: any

            Returns K

      • value: ((source) => V)
          • (source): V
          • Parameters

            • source: any

            Returns V

      Returns ((source) => {
          [_: K]: V;
      })

        • (source): {
              [_: K]: V;
          }
        • Parameters

          • source: any

          Returns {
              [_: K]: V;
          }

    Generated using TypeDoc

    \ No newline at end of file +

    Type Parameters

    • K
    • V

    Parameters

    • key: ((source) => K)
        • (source): K
        • Parameters

          • source: any

          Returns K

    • value: ((source) => V)
        • (source): V
        • Parameters

          • source: any

          Returns V

    Returns ((source) => {
        [_: K]: V;
    })

      • (source): {
            [_: K]: V;
        }
      • Parameters

        • source: any

        Returns {
            [_: K]: V;
        }

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Nullable.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Nullable.html index 23ae04065..2d2650b8a 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Nullable.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Nullable.html @@ -1,3 +1,3 @@ Nullable | @wailsio/runtime
    • Nullable takes a creation function for an arbitrary type and returns a creation function for a nullable value of that type.

      -

      Type Parameters

      • T

      Parameters

      • element: ((source) => T)
          • (source): T
          • Parameters

            • source: any

            Returns T

      Returns ((source) => null | T)

        • (source): null | T
        • Parameters

          • source: any

          Returns null | T

    Generated using TypeDoc

    \ No newline at end of file +

    Type Parameters

    • T

    Parameters

    • element: ((source) => T)
        • (source): T
        • Parameters

          • source: any

          Returns T

    Returns ((source) => null | T)

      • (source): null | T
      • Parameters

        • source: any

        Returns null | T

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Struct.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Struct.html index 4bc059759..0df214cb6 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Struct.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Struct.html @@ -1,3 +1,3 @@ Struct | @wailsio/runtime
    • Struct takes an object mapping field names to creation functions and returns an in-place creation function for a struct.

      -

      Type Parameters

      • T extends {
            [_: string]: ((source) => any);
        }
      • U extends {
            [Key in string | number | symbol]?: ReturnType<T[Key]>
        }

      Parameters

      • createField: T

      Returns ((source) => U)

        • (source): U
        • Parameters

          • source: any

          Returns U

    Generated using TypeDoc

    \ No newline at end of file +

    Type Parameters

    • T extends {
          [_: string]: ((source) => any);
      }
    • U extends {
          [Key in string | number | symbol]?: ReturnType<T[Key]>
      }

    Parameters

    • createField: T

    Returns ((source) => U)

      • (source): U
      • Parameters

        • source: any

        Returns U

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Error.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Error.html index 6f3048e4b..13e3d578b 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Error.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Error.html @@ -2,4 +2,4 @@

    Returns Promise<string>

    • The label of the button pressed
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Info.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Info.html index caf1269b3..7d757fac8 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Info.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Info.html @@ -2,4 +2,4 @@

    Returns Promise<string>

    • The label of the button pressed
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.OpenFile.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.OpenFile.html index 5b30a4ee7..55de05e73 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.OpenFile.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.OpenFile.html @@ -1,3 +1,3 @@ OpenFile | @wailsio/runtime
    • Parameters

      Returns Promise<string | string[]>

      Returns selected file or list of files. Returns blank string if no file is selected.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Question.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Question.html index 8af24273c..11b6dc98b 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Question.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Question.html @@ -2,4 +2,4 @@

    Returns Promise<string>

    • The label of the button pressed
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.SaveFile.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.SaveFile.html index 9139757c0..3084811a3 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.SaveFile.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.SaveFile.html @@ -1,3 +1,3 @@ SaveFile | @wailsio/runtime
    • Parameters

      Returns Promise<string>

      Returns the selected file. Returns blank string if no file is selected.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Warning.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Warning.html index 78fa0a77a..2ee135d07 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Warning.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Warning.html @@ -2,4 +2,4 @@

    Returns Promise<string>

    • The label of the button pressed
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Emit.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Emit.html index 259afe415..420439be0 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Emit.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Emit.html @@ -3,4 +3,4 @@

    Returns any

    • The result of the emitted event.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Off.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Off.html index c26214528..48338e53b 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Off.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Off.html @@ -1,4 +1,4 @@ Off | @wailsio/runtime
    • Removes event listeners for the specified event names.

      Parameters

      • eventName: string

        The name of the event to remove listeners for.

      • Rest ...additionalEventNames: string[]

        Additional event names to remove listeners for.

        -

      Returns undefined

    Generated using TypeDoc

    \ No newline at end of file +

    Returns undefined

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OffAll.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OffAll.html index d9bfd8cc3..9a6e301b1 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OffAll.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OffAll.html @@ -1,3 +1,3 @@ OffAll | @wailsio/runtime
    • Removes all event listeners.

      Returns void

      Function

      OffAll

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.On.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.On.html index e7cc267f0..a070df215 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.On.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.On.html @@ -4,4 +4,4 @@

    Returns Function

    • A function that, when called, will unregister the callback from the event.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OnMultiple.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OnMultiple.html index b2a786508..6b8dddc2d 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OnMultiple.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OnMultiple.html @@ -5,4 +5,4 @@

    Returns Function

    • A function that, when called, will unregister the callback from the event.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Once.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Once.html index 9051c4958..fc4e6606e 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Once.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Once.html @@ -4,4 +4,4 @@

    Returns Function

    • A function that, when called, will unregister the callback from the event.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.setup.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.setup.html index 74af7565e..ffec815e1 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.setup.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.setup.html @@ -1 +1 @@ -setup | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file +setup | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Flags.GetFlag.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Flags.GetFlag.html index fd755cb1c..1818913f1 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Flags.GetFlag.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Flags.GetFlag.html @@ -3,4 +3,4 @@

    Returns any

    • The value associated with the specified key.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetAll.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetAll.html index 500db8d08..5a367a7dc 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetAll.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetAll.html @@ -1,3 +1,3 @@ GetAll | @wailsio/runtime
    • Gets all screens.

      Returns Promise<Screen[]>

      A promise that resolves to an array of Screen objects.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetCurrent.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetCurrent.html index e4fba9c94..703aa2636 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetCurrent.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetCurrent.html @@ -1,3 +1,3 @@ GetCurrent | @wailsio/runtime
    • Gets the current active screen.

      Returns Promise<Screen>

      A promise that resolves with the current active screen.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetPrimary.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetPrimary.html index 9634da511..1e71b9f77 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetPrimary.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetPrimary.html @@ -1,3 +1,3 @@ GetPrimary | @wailsio/runtime
    • Gets the primary screen.

      Returns Promise<Screen>

      A promise that resolves to the primary screen.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Capabilities.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Capabilities.html index 54d746eff..3baa6d1e9 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Capabilities.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Capabilities.html @@ -1,4 +1,4 @@ Capabilities | @wailsio/runtime
    • Fetches the capabilities of the application from the server.

      Returns Promise<Object>

      A promise that resolves to an object containing the capabilities.

      Async

      Function

      Capabilities

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Environment.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Environment.html index b49ba20cc..6eddbdc9e 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Environment.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Environment.html @@ -2,4 +2,4 @@
  • A promise that resolves to an object containing OS and system architecture.
  • Function

    Retrieves environment details.

    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsAMD64.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsAMD64.html index 37a885d94..261861e3e 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsAMD64.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsAMD64.html @@ -1,3 +1,3 @@ IsAMD64 | @wailsio/runtime
    • Checks if the current environment architecture is AMD64.

      Returns boolean

      True if the current environment architecture is AMD64, false otherwise.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM.html index b20f5d87e..942943970 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM.html @@ -1,3 +1,3 @@ IsARM | @wailsio/runtime
    • Checks if the current architecture is ARM.

      Returns boolean

      True if the current architecture is ARM, false otherwise.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM64.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM64.html index acb3841a6..69eca7bc7 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM64.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM64.html @@ -2,4 +2,4 @@

    Returns boolean

    • Returns true if the environment is ARM64 architecture, otherwise returns false.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDarkMode.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDarkMode.html index 620afc3ce..522358524 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDarkMode.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDarkMode.html @@ -2,4 +2,4 @@
  • A promise that resolves to a boolean value indicating if the system is in dark mode.
  • Function

    Retrieves the system dark mode status.

    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDebug.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDebug.html index 0670c693e..2c7cb9cc2 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDebug.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDebug.html @@ -1 +1 @@ -IsDebug | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file +IsDebug | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsLinux.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsLinux.html index c1738bc3b..1b0c5547a 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsLinux.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsLinux.html @@ -1,3 +1,3 @@ IsLinux | @wailsio/runtime
    • Checks if the current operating system is Linux.

      Returns boolean

      Returns true if the current operating system is Linux, false otherwise.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsMac.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsMac.html index 26faf8a94..29985ed3a 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsMac.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsMac.html @@ -1,3 +1,3 @@ IsMac | @wailsio/runtime
    • Checks if the current environment is a macOS operating system.

      Returns boolean

      True if the environment is macOS, false otherwise.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsWindows.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsWindows.html index 5630846b7..41dce20d9 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsWindows.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsWindows.html @@ -1,3 +1,3 @@ IsWindows | @wailsio/runtime
    • Checks if the current operating system is Windows.

      Returns boolean

      True if the operating system is Windows, otherwise false.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.invoke.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.invoke.html index 41a9c9016..e4044cdd3 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.invoke.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.invoke.html @@ -1 +1 @@ -invoke | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file +invoke | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Enable.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Enable.html index 2db32f932..112e5bf2c 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Enable.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Enable.html @@ -1,2 +1,2 @@ Enable | @wailsio/runtime
    • Schedules an automatic reload of WML to be performed as soon as the document is fully loaded.

      -

      Returns void

    Generated using TypeDoc

    \ No newline at end of file +

    Returns void

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Reload.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Reload.html index 030549259..1f864defd 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Reload.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Reload.html @@ -1,2 +1,2 @@ Reload | @wailsio/runtime
    • Reloads the WML page by adding necessary event listeners and browser listeners.

      -

      Returns void

    Generated using TypeDoc

    \ No newline at end of file +

    Returns void

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/init.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/init.html index bcd60c3d3..b3afefb7d 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/init.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/init.html @@ -1 +1 @@ -init | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file +init | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Call.CallOptions.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Call.CallOptions.html index f602f876e..9e4130c5c 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Call.CallOptions.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Call.CallOptions.html @@ -1,7 +1,7 @@ -CallOptions | @wailsio/runtime

    Interface CallOptions

    interface CallOptions {
        args: any[];
        methodID: undefined | number;
        methodName: undefined | string;
    }

    Properties

    args +CallOptions | @wailsio/runtime

    Interface CallOptions

    interface CallOptions {
        args: any[];
        methodID: undefined | number;
        methodName: undefined | string;
    }

    Properties

    args: any[]

    Arguments to be passed into the bound method.

    -
    methodID: undefined | number

    The numeric ID of the bound method to call.

    -
    methodName: undefined | string

    The fully qualified name of the bound method to call.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    methodID: undefined | number

    The numeric ID of the bound method to call.

    +
    methodName: undefined | string

    The fully qualified name of the bound method to call.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.Button.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.Button.html index 6e3951126..81813e6b2 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.Button.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.Button.html @@ -1,7 +1,7 @@ -Button | @wailsio/runtime
    interface Button {
        IsCancel: undefined | boolean;
        IsDefault: undefined | boolean;
        Label: undefined | string;
    }

    Properties

    IsCancel +Button | @wailsio/runtime
    interface Button {
        IsCancel: undefined | boolean;
        IsDefault: undefined | boolean;
        Label: undefined | string;
    }

    Properties

    IsCancel: undefined | boolean

    True if the button should cancel an operation when clicked.

    -
    IsDefault: undefined | boolean

    True if the button should be the default action when the user presses enter.

    -
    Label: undefined | string

    Text that appears within the button.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    IsDefault: undefined | boolean

    True if the button should be the default action when the user presses enter.

    +
    Label: undefined | string

    Text that appears within the button.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.FileFilter.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.FileFilter.html index 3ce8b5a34..4195a04cb 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.FileFilter.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.FileFilter.html @@ -1,5 +1,5 @@ -FileFilter | @wailsio/runtime
    interface FileFilter {
        DisplayName: undefined | string;
        Pattern: undefined | string;
    }

    Properties

    DisplayName +FileFilter | @wailsio/runtime
    interface FileFilter {
        DisplayName: undefined | string;
        Pattern: undefined | string;
    }

    Properties

    Properties

    DisplayName: undefined | string

    Display name for the filter, it could be "Text Files", "Images" etc.

    -
    Pattern: undefined | string

    Pattern to match for the filter, e.g. ".txt;.md" for text markdown files.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    Pattern: undefined | string

    Pattern to match for the filter, e.g. ".txt;.md" for text markdown files.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.MessageDialogOptions.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.MessageDialogOptions.html index 661b1efe0..e9b3e778b 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.MessageDialogOptions.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.MessageDialogOptions.html @@ -1,9 +1,9 @@ -MessageDialogOptions | @wailsio/runtime

    Interface MessageDialogOptions

    interface MessageDialogOptions {
        Buttons: undefined | Button[];
        Detached: undefined | boolean;
        Message: undefined | string;
        Title: undefined | string;
    }

    Properties

    Buttons +MessageDialogOptions | @wailsio/runtime

    Interface MessageDialogOptions

    interface MessageDialogOptions {
        Buttons: undefined | Button[];
        Detached: undefined | boolean;
        Message: undefined | string;
        Title: undefined | string;
    }

    Properties

    Buttons: undefined | Button[]

    Array of button options to show in the dialog.

    -
    Detached: undefined | boolean

    True if the dialog should appear detached from the main window (if applicable).

    -
    Message: undefined | string

    The main message to show in the dialog.

    -
    Title: undefined | string

    The title of the dialog window.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    Detached: undefined | boolean

    True if the dialog should appear detached from the main window (if applicable).

    +
    Message: undefined | string

    The main message to show in the dialog.

    +
    Title: undefined | string

    The title of the dialog window.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.OpenFileDialogOptions.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.OpenFileDialogOptions.html index 455bf1780..e27b958e6 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.OpenFileDialogOptions.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.OpenFileDialogOptions.html @@ -1,4 +1,4 @@ -OpenFileDialogOptions | @wailsio/runtime

    Interface OpenFileDialogOptions

    interface OpenFileDialogOptions {
        AllowsMultipleSelection: undefined | boolean;
        AllowsOtherFiletypes: undefined | boolean;
        ButtonText: undefined | string;
        CanChooseDirectories: undefined | boolean;
        CanChooseFiles: undefined | boolean;
        CanCreateDirectories: undefined | boolean;
        CanSelectHiddenExtension: undefined | boolean;
        Detached: undefined | boolean;
        Directory: undefined | string;
        Filters: undefined | FileFilter[];
        HideExtension: undefined | boolean;
        Message: undefined | string;
        ResolvesAliases: undefined | boolean;
        ShowHiddenFiles: undefined | boolean;
        Title: undefined | string;
        TreatsFilePackagesAsDirectories: undefined | boolean;
    }

    Properties

    AllowsMultipleSelection +OpenFileDialogOptions | @wailsio/runtime

    Interface OpenFileDialogOptions

    interface OpenFileDialogOptions {
        AllowsMultipleSelection: undefined | boolean;
        AllowsOtherFiletypes: undefined | boolean;
        ButtonText: undefined | string;
        CanChooseDirectories: undefined | boolean;
        CanChooseFiles: undefined | boolean;
        CanCreateDirectories: undefined | boolean;
        CanSelectHiddenExtension: undefined | boolean;
        Detached: undefined | boolean;
        Directory: undefined | string;
        Filters: undefined | FileFilter[];
        HideExtension: undefined | boolean;
        Message: undefined | string;
        ResolvesAliases: undefined | boolean;
        ShowHiddenFiles: undefined | boolean;
        Title: undefined | string;
        TreatsFilePackagesAsDirectories: undefined | boolean;
    }

    Properties

    AllowsMultipleSelection: undefined | boolean

    Indicates if multiple selection is allowed.

    -
    AllowsOtherFiletypes: undefined | boolean

    Indicates if other file types are allowed.

    -
    ButtonText: undefined | string

    Text to display on the button.

    -
    CanChooseDirectories: undefined | boolean

    Indicates if directories can be chosen.

    -
    CanChooseFiles: undefined | boolean

    Indicates if files can be chosen.

    -
    CanCreateDirectories: undefined | boolean

    Indicates if directories can be created.

    -
    CanSelectHiddenExtension: undefined | boolean

    Indicates if hidden extensions can be selected.

    -
    Detached: undefined | boolean

    Indicates if the dialog should appear detached from the main window.

    -
    Directory: undefined | string

    Directory to open in the dialog.

    -
    Filters: undefined | FileFilter[]

    Array of file filters.

    -
    HideExtension: undefined | boolean

    Indicates if the extension should be hidden.

    -
    Message: undefined | string

    Message to show in the dialog.

    -
    ResolvesAliases: undefined | boolean

    Indicates if aliases should be resolved.

    -
    ShowHiddenFiles: undefined | boolean

    Indicates if hidden files should be shown.

    -
    Title: undefined | string

    Title of the dialog.

    -
    TreatsFilePackagesAsDirectories: undefined | boolean

    Indicates if file packages should be treated as directories.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    AllowsOtherFiletypes: undefined | boolean

    Indicates if other file types are allowed.

    +
    ButtonText: undefined | string

    Text to display on the button.

    +
    CanChooseDirectories: undefined | boolean

    Indicates if directories can be chosen.

    +
    CanChooseFiles: undefined | boolean

    Indicates if files can be chosen.

    +
    CanCreateDirectories: undefined | boolean

    Indicates if directories can be created.

    +
    CanSelectHiddenExtension: undefined | boolean

    Indicates if hidden extensions can be selected.

    +
    Detached: undefined | boolean

    Indicates if the dialog should appear detached from the main window.

    +
    Directory: undefined | string

    Directory to open in the dialog.

    +
    Filters: undefined | FileFilter[]

    Array of file filters.

    +
    HideExtension: undefined | boolean

    Indicates if the extension should be hidden.

    +
    Message: undefined | string

    Message to show in the dialog.

    +
    ResolvesAliases: undefined | boolean

    Indicates if aliases should be resolved.

    +
    ShowHiddenFiles: undefined | boolean

    Indicates if hidden files should be shown.

    +
    Title: undefined | string

    Title of the dialog.

    +
    TreatsFilePackagesAsDirectories: undefined | boolean

    Indicates if file packages should be treated as directories.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.SaveFileDialogOptions.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.SaveFileDialogOptions.html index 0417b185c..1ea91cb9c 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.SaveFileDialogOptions.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.SaveFileDialogOptions.html @@ -1,4 +1,4 @@ -SaveFileDialogOptions | @wailsio/runtime

    Interface SaveFileDialogOptions

    interface SaveFileDialogOptions {
        AllowsMultipleSelection: undefined | boolean;
        AllowsOtherFiletypes: undefined | boolean;
        ButtonText: undefined | string;
        CanChooseDirectories: undefined | boolean;
        CanChooseFiles: undefined | boolean;
        CanCreateDirectories: undefined | boolean;
        CanSelectHiddenExtension: undefined | boolean;
        Detached: undefined | boolean;
        Directory: undefined | string;
        Filename: undefined | string;
        Filters: undefined | FileFilter[];
        HideExtension: undefined | boolean;
        Message: undefined | string;
        ResolvesAliases: undefined | boolean;
        ShowHiddenFiles: undefined | boolean;
        Title: undefined | string;
        TreatsFilePackagesAsDirectories: undefined | boolean;
    }

    Properties

    AllowsMultipleSelection +SaveFileDialogOptions | @wailsio/runtime

    Interface SaveFileDialogOptions

    interface SaveFileDialogOptions {
        AllowsMultipleSelection: undefined | boolean;
        AllowsOtherFiletypes: undefined | boolean;
        ButtonText: undefined | string;
        CanChooseDirectories: undefined | boolean;
        CanChooseFiles: undefined | boolean;
        CanCreateDirectories: undefined | boolean;
        CanSelectHiddenExtension: undefined | boolean;
        Detached: undefined | boolean;
        Directory: undefined | string;
        Filename: undefined | string;
        Filters: undefined | FileFilter[];
        HideExtension: undefined | boolean;
        Message: undefined | string;
        ResolvesAliases: undefined | boolean;
        ShowHiddenFiles: undefined | boolean;
        Title: undefined | string;
        TreatsFilePackagesAsDirectories: undefined | boolean;
    }

    Properties

    AllowsMultipleSelection: undefined | boolean

    Indicates if multiple selection is allowed.

    -
    AllowsOtherFiletypes: undefined | boolean

    Indicates if other file types are allowed.

    -
    ButtonText: undefined | string

    Text to display on the button.

    -
    CanChooseDirectories: undefined | boolean

    Indicates if directories can be chosen.

    -
    CanChooseFiles: undefined | boolean

    Indicates if files can be chosen.

    -
    CanCreateDirectories: undefined | boolean

    Indicates if directories can be created.

    -
    CanSelectHiddenExtension: undefined | boolean

    Indicates if hidden extensions can be selected.

    -
    Detached: undefined | boolean

    Indicates if the dialog should appear detached from the main window.

    -
    Directory: undefined | string

    Directory to open in the dialog.

    -
    Filename: undefined | string

    Default filename to use in the dialog.

    -
    Filters: undefined | FileFilter[]

    Array of file filters.

    -
    HideExtension: undefined | boolean

    Indicates if the extension should be hidden.

    -
    Message: undefined | string

    Message to show in the dialog.

    -
    ResolvesAliases: undefined | boolean

    Indicates if aliases should be resolved.

    -
    ShowHiddenFiles: undefined | boolean

    Indicates if hidden files should be shown.

    -
    Title: undefined | string

    Title of the dialog.

    -
    TreatsFilePackagesAsDirectories: undefined | boolean

    Indicates if file packages should be treated as directories.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    AllowsOtherFiletypes: undefined | boolean

    Indicates if other file types are allowed.

    +
    ButtonText: undefined | string

    Text to display on the button.

    +
    CanChooseDirectories: undefined | boolean

    Indicates if directories can be chosen.

    +
    CanChooseFiles: undefined | boolean

    Indicates if files can be chosen.

    +
    CanCreateDirectories: undefined | boolean

    Indicates if directories can be created.

    +
    CanSelectHiddenExtension: undefined | boolean

    Indicates if hidden extensions can be selected.

    +
    Detached: undefined | boolean

    Indicates if the dialog should appear detached from the main window.

    +
    Directory: undefined | string

    Directory to open in the dialog.

    +
    Filename: undefined | string

    Default filename to use in the dialog.

    +
    Filters: undefined | FileFilter[]

    Array of file filters.

    +
    HideExtension: undefined | boolean

    Indicates if the extension should be hidden.

    +
    Message: undefined | string

    Message to show in the dialog.

    +
    ResolvesAliases: undefined | boolean

    Indicates if aliases should be resolved.

    +
    ShowHiddenFiles: undefined | boolean

    Indicates if hidden files should be shown.

    +
    Title: undefined | string

    Title of the dialog.

    +
    TreatsFilePackagesAsDirectories: undefined | boolean

    Indicates if file packages should be treated as directories.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Rect.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Rect.html index fc8396193..bf5980ee3 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Rect.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Rect.html @@ -1,9 +1,9 @@ -Rect | @wailsio/runtime
    interface Rect {
        Height: number;
        Width: number;
        X: number;
        Y: number;
    }

    Properties

    Height +Rect | @wailsio/runtime
    interface Rect {
        Height: number;
        Width: number;
        X: number;
        Y: number;
    }

    Properties

    Properties

    Height: number

    The height of the rectangle.

    -
    Width: number

    The width of the rectangle.

    -
    X: number

    The X coordinate of the origin.

    -
    Y: number

    The Y coordinate of the origin.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    Width: number

    The width of the rectangle.

    +
    X: number

    The X coordinate of the origin.

    +
    Y: number

    The Y coordinate of the origin.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Screen.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Screen.html index 3d527004a..b85d6fc1d 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Screen.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Screen.html @@ -1,4 +1,4 @@ -Screen | @wailsio/runtime
    interface Screen {
        Bounds: Rect;
        ID: string;
        IsPrimary: boolean;
        Name: string;
        PhysicalBounds: Rect;
        PhysicalWorkArea: Rect;
        Rotation: number;
        ScaleFactor: number;
        Size: Size;
        WorkArea: Rect;
        X: number;
        Y: number;
    }

    Properties

    Bounds +Screen | @wailsio/runtime
    interface Screen {
        Bounds: Rect;
        ID: string;
        IsPrimary: boolean;
        Name: string;
        PhysicalBounds: Rect;
        PhysicalWorkArea: Rect;
        Rotation: number;
        ScaleFactor: number;
        Size: Size;
        WorkArea: Rect;
        X: number;
        Y: number;
    }

    Properties

    Bounds ID IsPrimary Name @@ -11,15 +11,15 @@ X Y

    Properties

    Bounds: Rect

    Contains the bounds of the screen in terms of X, Y, Width, and Height.

    -
    ID: string

    Unique identifier for the screen.

    -
    IsPrimary: boolean

    True if this is the primary monitor selected by the user in the operating system.

    -
    Name: string

    Human readable name of the screen.

    -
    PhysicalBounds: Rect

    Contains the physical bounds of the screen in terms of X, Y, Width, and Height (before scaling).

    -
    PhysicalWorkArea: Rect

    Contains the physical WorkArea of the screen (before scaling).

    -
    Rotation: number

    The rotation of the screen.

    -
    ScaleFactor: number

    The scale factor of the screen (DPI/96). 1 = standard DPI, 2 = HiDPI (Retina), etc.

    -
    Size: Size

    Contains the width and height of the screen.

    -
    WorkArea: Rect

    Contains the area of the screen that is actually usable (excluding taskbar and other system UI).

    -
    X: number

    The X coordinate of the screen.

    -
    Y: number

    The Y coordinate of the screen.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    ID: string

    Unique identifier for the screen.

    +
    IsPrimary: boolean

    True if this is the primary monitor selected by the user in the operating system.

    +
    Name: string

    Human readable name of the screen.

    +
    PhysicalBounds: Rect

    Contains the physical bounds of the screen in terms of X, Y, Width, and Height (before scaling).

    +
    PhysicalWorkArea: Rect

    Contains the physical WorkArea of the screen (before scaling).

    +
    Rotation: number

    The rotation of the screen.

    +
    ScaleFactor: number

    The scale factor of the screen (DPI/96). 1 = standard DPI, 2 = HiDPI (Retina), etc.

    +
    Size: Size

    Contains the width and height of the screen.

    +
    WorkArea: Rect

    Contains the area of the screen that is actually usable (excluding taskbar and other system UI).

    +
    X: number

    The X coordinate of the screen.

    +
    Y: number

    The Y coordinate of the screen.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Size.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Size.html index d0ce4d079..7a66eee62 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Size.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Size.html @@ -1,5 +1,5 @@ -Size | @wailsio/runtime
    interface Size {
        Height: number;
        Width: number;
    }

    Properties

    Height +Size | @wailsio/runtime
    interface Size {
        Height: number;
        Width: number;
    }

    Properties

    Properties

    Height: number

    The height.

    -
    Width: number

    The width.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    Width: number

    The width.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.EnvironmentInfo.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.EnvironmentInfo.html index 0afdfa49d..cc8c476a7 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.EnvironmentInfo.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.EnvironmentInfo.html @@ -1,11 +1,11 @@ -EnvironmentInfo | @wailsio/runtime

    Interface EnvironmentInfo

    interface EnvironmentInfo {
        Arch: string;
        Debug: boolean;
        OS: string;
        OSInfo: OSInfo;
        PlatformInfo: Object;
    }

    Properties

    Arch +EnvironmentInfo | @wailsio/runtime

    Interface EnvironmentInfo

    interface EnvironmentInfo {
        Arch: string;
        Debug: boolean;
        OS: string;
        OSInfo: OSInfo;
        PlatformInfo: Object;
    }

    Properties

    Arch: string

    The architecture of the system.

    -
    Debug: boolean

    True if the application is running in debug mode, otherwise false.

    -
    OS: string

    The operating system in use.

    -
    OSInfo: OSInfo

    Details of the operating system.

    -
    PlatformInfo: Object

    Additional platform information.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    Debug: boolean

    True if the application is running in debug mode, otherwise false.

    +
    OS: string

    The operating system in use.

    +
    OSInfo: OSInfo

    Details of the operating system.

    +
    PlatformInfo: Object

    Additional platform information.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.OSInfo.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.OSInfo.html index 229a31dec..7b8db2b02 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.OSInfo.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.OSInfo.html @@ -1,9 +1,9 @@ -OSInfo | @wailsio/runtime
    interface OSInfo {
        Branding: string;
        ID: string;
        Name: string;
        Version: string;
    }

    Properties

    Branding +OSInfo | @wailsio/runtime
    interface OSInfo {
        Branding: string;
        ID: string;
        Name: string;
        Version: string;
    }

    Properties

    Properties

    Branding: string

    The branding of the OS.

    -
    ID: string

    The ID of the OS.

    -
    Name: string

    The name of the OS.

    -
    Version: string

    The version of the OS.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    ID: string

    The ID of the OS.

    +
    Name: string

    The name of the OS.

    +
    Version: string

    The version of the OS.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Application.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Application.html index 3d90d6c44..8d0c53d6e 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Application.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Application.html @@ -1,4 +1,4 @@ -Application | @wailsio/runtime

    Namespace Application

    Index

    Functions

    Hide +Application | @wailsio/runtime

    Namespace Application

    Index

    Functions

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Browser.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Browser.html index 77a8cdd17..2d0027aa2 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Browser.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Browser.html @@ -1,2 +1,2 @@ -Browser | @wailsio/runtime

    Namespace Browser

    Index

    Functions

    OpenURL +Browser | @wailsio/runtime

    Namespace Browser

    Index

    Functions

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Call.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Call.html index 600f3d2ea..f180a0aec 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Call.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Call.html @@ -1,4 +1,4 @@ -Call | @wailsio/runtime

    Namespace Call

    Index

    Classes

    RuntimeError +Call | @wailsio/runtime

    Namespace Call

    Index

    Classes

    Interfaces

    Functions

    ByID ByName diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Clipboard.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Clipboard.html index 2b315ac79..1c415c420 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Clipboard.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Clipboard.html @@ -1,3 +1,3 @@ -Clipboard | @wailsio/runtime

    Namespace Clipboard

    Index

    Functions

    SetText +Clipboard | @wailsio/runtime

    Namespace Clipboard

    Index

    Functions

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Create.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Create.html index c61072bd1..96efeea65 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Create.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Create.html @@ -1,4 +1,4 @@ -Create | @wailsio/runtime

    Namespace Create

    Index

    Functions

    Any +Create | @wailsio/runtime

    Namespace Create

    Index

    Functions

    Any Array ByteSlice Map diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Dialogs.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Dialogs.html index b0a5bf345..72fbe9af9 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Dialogs.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Dialogs.html @@ -1,4 +1,4 @@ -Dialogs | @wailsio/runtime

    Namespace Dialogs

    Index

    Interfaces

    Button +Dialogs | @wailsio/runtime

    Namespace Dialogs

    Index

    Interfaces

    Button FileFilter MessageDialogOptions OpenFileDialogOptions diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Events.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Events.html index d4fe00296..5ed2507b9 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Events.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Events.html @@ -1,4 +1,4 @@ -Events | @wailsio/runtime

    Namespace Events

    Index

    Classes

    WailsEvent +Events | @wailsio/runtime

    Namespace Events

    Index

    Classes

    Variables

    Functions

    Emit Off diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Flags.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Flags.html index e6a8eb1c4..05f25a026 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Flags.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Flags.html @@ -1,2 +1,2 @@ -Flags | @wailsio/runtime

    Namespace Flags

    Index

    Functions

    GetFlag +Flags | @wailsio/runtime

    Namespace Flags

    Index

    Functions

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Screens.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Screens.html index dce388503..4dfa14f27 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Screens.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Screens.html @@ -1,4 +1,4 @@ -Screens | @wailsio/runtime

    Namespace Screens

    Index

    Interfaces

    Rect +Screens | @wailsio/runtime

    Namespace Screens

    Index

    Interfaces

    Functions

    GetAll diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/System.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/System.html index cc624c92f..cd08729b2 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/System.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/System.html @@ -1,4 +1,4 @@ -System | @wailsio/runtime

    Namespace System

    Index

    Interfaces

    EnvironmentInfo +System | @wailsio/runtime

    Namespace System

    Index

    Interfaces

    Functions

    Capabilities Environment diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/WML.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/WML.html index b592696af..f4fa9b9a1 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/WML.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/WML.html @@ -1,3 +1,3 @@ -WML | @wailsio/runtime

    Namespace WML

    Index

    Functions

    Enable +WML | @wailsio/runtime

    Namespace WML

    Index

    Functions

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Events.Types.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Events.Types.html index 08b19fd84..c4c73cf87 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Events.Types.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Events.Types.html @@ -1 +1 @@ -Types | @wailsio/runtime

    Variable TypesConst

    Types: {
        Common: {
            ApplicationOpenedWithFile: string;
            ApplicationStarted: string;
            ThemeChanged: string;
            WindowClosing: string;
            WindowDPIChanged: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowFilesDropped: string;
            WindowFocus: string;
            WindowFullscreen: string;
            WindowHide: string;
            WindowLostFocus: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowRestore: string;
            WindowRuntimeReady: string;
            WindowShow: string;
            WindowUnFullscreen: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowZoom: string;
            WindowZoomIn: string;
            WindowZoomOut: string;
            WindowZoomReset: string;
        };
        Linux: {
            ApplicationStartup: string;
            SystemThemeChanged: string;
            WindowDeleteEvent: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowFocusIn: string;
            WindowFocusOut: string;
            WindowLoadChanged: string;
        };
        Mac: {
            ApplicationDidBecomeActive: string;
            ApplicationDidChangeBackingProperties: string;
            ApplicationDidChangeEffectiveAppearance: string;
            ApplicationDidChangeIcon: string;
            ApplicationDidChangeOcclusionState: string;
            ApplicationDidChangeScreenParameters: string;
            ApplicationDidChangeStatusBarFrame: string;
            ApplicationDidChangeStatusBarOrientation: string;
            ApplicationDidChangeTheme: string;
            ApplicationDidFinishLaunching: string;
            ApplicationDidHide: string;
            ApplicationDidResignActive: string;
            ApplicationDidUnhide: string;
            ApplicationDidUpdate: string;
            ApplicationShouldHandleReopen: string;
            ApplicationWillBecomeActive: string;
            ApplicationWillFinishLaunching: string;
            ApplicationWillHide: string;
            ApplicationWillResignActive: string;
            ApplicationWillTerminate: string;
            ApplicationWillUnhide: string;
            ApplicationWillUpdate: string;
            MenuDidAddItem: string;
            MenuDidBeginTracking: string;
            MenuDidClose: string;
            MenuDidDisplayItem: string;
            MenuDidEndTracking: string;
            MenuDidHighlightItem: string;
            MenuDidOpen: string;
            MenuDidPopUp: string;
            MenuDidRemoveItem: string;
            MenuDidSendAction: string;
            MenuDidSendActionToItem: string;
            MenuDidUpdate: string;
            MenuWillAddItem: string;
            MenuWillBeginTracking: string;
            MenuWillDisplayItem: string;
            MenuWillEndTracking: string;
            MenuWillHighlightItem: string;
            MenuWillOpen: string;
            MenuWillPopUp: string;
            MenuWillRemoveItem: string;
            MenuWillSendAction: string;
            MenuWillSendActionToItem: string;
            MenuWillUpdate: string;
            WebViewDidCommitNavigation: string;
            WebViewDidFinishNavigation: string;
            WebViewDidReceiveServerRedirectForProvisionalNavigation: string;
            WebViewDidStartProvisionalNavigation: string;
            WindowDidBecomeKey: string;
            WindowDidBecomeMain: string;
            WindowDidBeginSheet: string;
            WindowDidChangeAlpha: string;
            WindowDidChangeBackingLocation: string;
            WindowDidChangeBackingProperties: string;
            WindowDidChangeCollectionBehavior: string;
            WindowDidChangeEffectiveAppearance: string;
            WindowDidChangeOcclusionState: string;
            WindowDidChangeOrderingMode: string;
            WindowDidChangeScreen: string;
            WindowDidChangeScreenParameters: string;
            WindowDidChangeScreenProfile: string;
            WindowDidChangeScreenSpace: string;
            WindowDidChangeScreenSpaceProperties: string;
            WindowDidChangeSharingType: string;
            WindowDidChangeSpace: string;
            WindowDidChangeSpaceOrderingMode: string;
            WindowDidChangeTitle: string;
            WindowDidChangeToolbar: string;
            WindowDidDeminiaturize: string;
            WindowDidEndSheet: string;
            WindowDidEnterFullScreen: string;
            WindowDidEnterVersionBrowser: string;
            WindowDidExitFullScreen: string;
            WindowDidExitVersionBrowser: string;
            WindowDidExpose: string;
            WindowDidFocus: string;
            WindowDidMiniaturize: string;
            WindowDidMove: string;
            WindowDidOrderOffScreen: string;
            WindowDidOrderOnScreen: string;
            WindowDidResignKey: string;
            WindowDidResignMain: string;
            WindowDidResize: string;
            WindowDidUpdate: string;
            WindowDidUpdateAlpha: string;
            WindowDidUpdateCollectionBehavior: string;
            WindowDidUpdateCollectionProperties: string;
            WindowDidUpdateShadow: string;
            WindowDidUpdateTitle: string;
            WindowDidUpdateToolbar: string;
            WindowDidZoom: string;
            WindowFileDraggingEntered: string;
            WindowFileDraggingExited: string;
            WindowFileDraggingPerformed: string;
            WindowHide: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowShouldClose: string;
            WindowShow: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowWillBecomeKey: string;
            WindowWillBecomeMain: string;
            WindowWillBeginSheet: string;
            WindowWillChangeOrderingMode: string;
            WindowWillClose: string;
            WindowWillDeminiaturize: string;
            WindowWillEnterFullScreen: string;
            WindowWillEnterVersionBrowser: string;
            WindowWillExitFullScreen: string;
            WindowWillExitVersionBrowser: string;
            WindowWillFocus: string;
            WindowWillMiniaturize: string;
            WindowWillMove: string;
            WindowWillOrderOffScreen: string;
            WindowWillOrderOnScreen: string;
            WindowWillResignMain: string;
            WindowWillResize: string;
            WindowWillUnfocus: string;
            WindowWillUpdate: string;
            WindowWillUpdateAlpha: string;
            WindowWillUpdateCollectionBehavior: string;
            WindowWillUpdateCollectionProperties: string;
            WindowWillUpdateShadow: string;
            WindowWillUpdateTitle: string;
            WindowWillUpdateToolbar: string;
            WindowWillUpdateVisibility: string;
            WindowWillUseStandardFrame: string;
            WindowZoomIn: string;
            WindowZoomOut: string;
            WindowZoomReset: string;
        };
        Windows: {
            APMPowerSettingChange: string;
            APMPowerStatusChange: string;
            APMResumeAutomatic: string;
            APMResumeSuspend: string;
            APMSuspend: string;
            ApplicationStarted: string;
            SystemThemeChanged: string;
            WebViewNavigationCompleted: string;
            WindowActive: string;
            WindowBackgroundErase: string;
            WindowClickActive: string;
            WindowClosing: string;
            WindowDPIChanged: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowDragDrop: string;
            WindowDragEnter: string;
            WindowDragLeave: string;
            WindowDragOver: string;
            WindowEndMove: string;
            WindowEndResize: string;
            WindowFullscreen: string;
            WindowHide: string;
            WindowInactive: string;
            WindowKeyDown: string;
            WindowKeyUp: string;
            WindowKillFocus: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowNonClientHit: string;
            WindowNonClientMouseDown: string;
            WindowNonClientMouseLeave: string;
            WindowNonClientMouseMove: string;
            WindowNonClientMouseUp: string;
            WindowPaint: string;
            WindowRestore: string;
            WindowSetFocus: string;
            WindowShow: string;
            WindowStartMove: string;
            WindowStartResize: string;
            WindowUnFullscreen: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowZOrderChanged: string;
        };
    } = EventTypes

    Type declaration

    • Common: {
          ApplicationOpenedWithFile: string;
          ApplicationStarted: string;
          ThemeChanged: string;
          WindowClosing: string;
          WindowDPIChanged: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowFilesDropped: string;
          WindowFocus: string;
          WindowFullscreen: string;
          WindowHide: string;
          WindowLostFocus: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowRestore: string;
          WindowRuntimeReady: string;
          WindowShow: string;
          WindowUnFullscreen: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowZoom: string;
          WindowZoomIn: string;
          WindowZoomOut: string;
          WindowZoomReset: string;
      }
      • ApplicationOpenedWithFile: string
      • ApplicationStarted: string
      • ThemeChanged: string
      • WindowClosing: string
      • WindowDPIChanged: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowFilesDropped: string
      • WindowFocus: string
      • WindowFullscreen: string
      • WindowHide: string
      • WindowLostFocus: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowRestore: string
      • WindowRuntimeReady: string
      • WindowShow: string
      • WindowUnFullscreen: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowZoom: string
      • WindowZoomIn: string
      • WindowZoomOut: string
      • WindowZoomReset: string
    • Linux: {
          ApplicationStartup: string;
          SystemThemeChanged: string;
          WindowDeleteEvent: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowFocusIn: string;
          WindowFocusOut: string;
          WindowLoadChanged: string;
      }
      • ApplicationStartup: string
      • SystemThemeChanged: string
      • WindowDeleteEvent: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowFocusIn: string
      • WindowFocusOut: string
      • WindowLoadChanged: string
    • Mac: {
          ApplicationDidBecomeActive: string;
          ApplicationDidChangeBackingProperties: string;
          ApplicationDidChangeEffectiveAppearance: string;
          ApplicationDidChangeIcon: string;
          ApplicationDidChangeOcclusionState: string;
          ApplicationDidChangeScreenParameters: string;
          ApplicationDidChangeStatusBarFrame: string;
          ApplicationDidChangeStatusBarOrientation: string;
          ApplicationDidChangeTheme: string;
          ApplicationDidFinishLaunching: string;
          ApplicationDidHide: string;
          ApplicationDidResignActive: string;
          ApplicationDidUnhide: string;
          ApplicationDidUpdate: string;
          ApplicationShouldHandleReopen: string;
          ApplicationWillBecomeActive: string;
          ApplicationWillFinishLaunching: string;
          ApplicationWillHide: string;
          ApplicationWillResignActive: string;
          ApplicationWillTerminate: string;
          ApplicationWillUnhide: string;
          ApplicationWillUpdate: string;
          MenuDidAddItem: string;
          MenuDidBeginTracking: string;
          MenuDidClose: string;
          MenuDidDisplayItem: string;
          MenuDidEndTracking: string;
          MenuDidHighlightItem: string;
          MenuDidOpen: string;
          MenuDidPopUp: string;
          MenuDidRemoveItem: string;
          MenuDidSendAction: string;
          MenuDidSendActionToItem: string;
          MenuDidUpdate: string;
          MenuWillAddItem: string;
          MenuWillBeginTracking: string;
          MenuWillDisplayItem: string;
          MenuWillEndTracking: string;
          MenuWillHighlightItem: string;
          MenuWillOpen: string;
          MenuWillPopUp: string;
          MenuWillRemoveItem: string;
          MenuWillSendAction: string;
          MenuWillSendActionToItem: string;
          MenuWillUpdate: string;
          WebViewDidCommitNavigation: string;
          WebViewDidFinishNavigation: string;
          WebViewDidReceiveServerRedirectForProvisionalNavigation: string;
          WebViewDidStartProvisionalNavigation: string;
          WindowDidBecomeKey: string;
          WindowDidBecomeMain: string;
          WindowDidBeginSheet: string;
          WindowDidChangeAlpha: string;
          WindowDidChangeBackingLocation: string;
          WindowDidChangeBackingProperties: string;
          WindowDidChangeCollectionBehavior: string;
          WindowDidChangeEffectiveAppearance: string;
          WindowDidChangeOcclusionState: string;
          WindowDidChangeOrderingMode: string;
          WindowDidChangeScreen: string;
          WindowDidChangeScreenParameters: string;
          WindowDidChangeScreenProfile: string;
          WindowDidChangeScreenSpace: string;
          WindowDidChangeScreenSpaceProperties: string;
          WindowDidChangeSharingType: string;
          WindowDidChangeSpace: string;
          WindowDidChangeSpaceOrderingMode: string;
          WindowDidChangeTitle: string;
          WindowDidChangeToolbar: string;
          WindowDidDeminiaturize: string;
          WindowDidEndSheet: string;
          WindowDidEnterFullScreen: string;
          WindowDidEnterVersionBrowser: string;
          WindowDidExitFullScreen: string;
          WindowDidExitVersionBrowser: string;
          WindowDidExpose: string;
          WindowDidFocus: string;
          WindowDidMiniaturize: string;
          WindowDidMove: string;
          WindowDidOrderOffScreen: string;
          WindowDidOrderOnScreen: string;
          WindowDidResignKey: string;
          WindowDidResignMain: string;
          WindowDidResize: string;
          WindowDidUpdate: string;
          WindowDidUpdateAlpha: string;
          WindowDidUpdateCollectionBehavior: string;
          WindowDidUpdateCollectionProperties: string;
          WindowDidUpdateShadow: string;
          WindowDidUpdateTitle: string;
          WindowDidUpdateToolbar: string;
          WindowDidZoom: string;
          WindowFileDraggingEntered: string;
          WindowFileDraggingExited: string;
          WindowFileDraggingPerformed: string;
          WindowHide: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowShouldClose: string;
          WindowShow: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowWillBecomeKey: string;
          WindowWillBecomeMain: string;
          WindowWillBeginSheet: string;
          WindowWillChangeOrderingMode: string;
          WindowWillClose: string;
          WindowWillDeminiaturize: string;
          WindowWillEnterFullScreen: string;
          WindowWillEnterVersionBrowser: string;
          WindowWillExitFullScreen: string;
          WindowWillExitVersionBrowser: string;
          WindowWillFocus: string;
          WindowWillMiniaturize: string;
          WindowWillMove: string;
          WindowWillOrderOffScreen: string;
          WindowWillOrderOnScreen: string;
          WindowWillResignMain: string;
          WindowWillResize: string;
          WindowWillUnfocus: string;
          WindowWillUpdate: string;
          WindowWillUpdateAlpha: string;
          WindowWillUpdateCollectionBehavior: string;
          WindowWillUpdateCollectionProperties: string;
          WindowWillUpdateShadow: string;
          WindowWillUpdateTitle: string;
          WindowWillUpdateToolbar: string;
          WindowWillUpdateVisibility: string;
          WindowWillUseStandardFrame: string;
          WindowZoomIn: string;
          WindowZoomOut: string;
          WindowZoomReset: string;
      }
      • ApplicationDidBecomeActive: string
      • ApplicationDidChangeBackingProperties: string
      • ApplicationDidChangeEffectiveAppearance: string
      • ApplicationDidChangeIcon: string
      • ApplicationDidChangeOcclusionState: string
      • ApplicationDidChangeScreenParameters: string
      • ApplicationDidChangeStatusBarFrame: string
      • ApplicationDidChangeStatusBarOrientation: string
      • ApplicationDidChangeTheme: string
      • ApplicationDidFinishLaunching: string
      • ApplicationDidHide: string
      • ApplicationDidResignActive: string
      • ApplicationDidUnhide: string
      • ApplicationDidUpdate: string
      • ApplicationShouldHandleReopen: string
      • ApplicationWillBecomeActive: string
      • ApplicationWillFinishLaunching: string
      • ApplicationWillHide: string
      • ApplicationWillResignActive: string
      • ApplicationWillTerminate: string
      • ApplicationWillUnhide: string
      • ApplicationWillUpdate: string
      • MenuDidAddItem: string
      • MenuDidBeginTracking: string
      • MenuDidClose: string
      • MenuDidDisplayItem: string
      • MenuDidEndTracking: string
      • MenuDidHighlightItem: string
      • MenuDidOpen: string
      • MenuDidPopUp: string
      • MenuDidRemoveItem: string
      • MenuDidSendAction: string
      • MenuDidSendActionToItem: string
      • MenuDidUpdate: string
      • MenuWillAddItem: string
      • MenuWillBeginTracking: string
      • MenuWillDisplayItem: string
      • MenuWillEndTracking: string
      • MenuWillHighlightItem: string
      • MenuWillOpen: string
      • MenuWillPopUp: string
      • MenuWillRemoveItem: string
      • MenuWillSendAction: string
      • MenuWillSendActionToItem: string
      • MenuWillUpdate: string
      • WebViewDidCommitNavigation: string
      • WebViewDidFinishNavigation: string
      • WebViewDidReceiveServerRedirectForProvisionalNavigation: string
      • WebViewDidStartProvisionalNavigation: string
      • WindowDidBecomeKey: string
      • WindowDidBecomeMain: string
      • WindowDidBeginSheet: string
      • WindowDidChangeAlpha: string
      • WindowDidChangeBackingLocation: string
      • WindowDidChangeBackingProperties: string
      • WindowDidChangeCollectionBehavior: string
      • WindowDidChangeEffectiveAppearance: string
      • WindowDidChangeOcclusionState: string
      • WindowDidChangeOrderingMode: string
      • WindowDidChangeScreen: string
      • WindowDidChangeScreenParameters: string
      • WindowDidChangeScreenProfile: string
      • WindowDidChangeScreenSpace: string
      • WindowDidChangeScreenSpaceProperties: string
      • WindowDidChangeSharingType: string
      • WindowDidChangeSpace: string
      • WindowDidChangeSpaceOrderingMode: string
      • WindowDidChangeTitle: string
      • WindowDidChangeToolbar: string
      • WindowDidDeminiaturize: string
      • WindowDidEndSheet: string
      • WindowDidEnterFullScreen: string
      • WindowDidEnterVersionBrowser: string
      • WindowDidExitFullScreen: string
      • WindowDidExitVersionBrowser: string
      • WindowDidExpose: string
      • WindowDidFocus: string
      • WindowDidMiniaturize: string
      • WindowDidMove: string
      • WindowDidOrderOffScreen: string
      • WindowDidOrderOnScreen: string
      • WindowDidResignKey: string
      • WindowDidResignMain: string
      • WindowDidResize: string
      • WindowDidUpdate: string
      • WindowDidUpdateAlpha: string
      • WindowDidUpdateCollectionBehavior: string
      • WindowDidUpdateCollectionProperties: string
      • WindowDidUpdateShadow: string
      • WindowDidUpdateTitle: string
      • WindowDidUpdateToolbar: string
      • WindowDidZoom: string
      • WindowFileDraggingEntered: string
      • WindowFileDraggingExited: string
      • WindowFileDraggingPerformed: string
      • WindowHide: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowShouldClose: string
      • WindowShow: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowWillBecomeKey: string
      • WindowWillBecomeMain: string
      • WindowWillBeginSheet: string
      • WindowWillChangeOrderingMode: string
      • WindowWillClose: string
      • WindowWillDeminiaturize: string
      • WindowWillEnterFullScreen: string
      • WindowWillEnterVersionBrowser: string
      • WindowWillExitFullScreen: string
      • WindowWillExitVersionBrowser: string
      • WindowWillFocus: string
      • WindowWillMiniaturize: string
      • WindowWillMove: string
      • WindowWillOrderOffScreen: string
      • WindowWillOrderOnScreen: string
      • WindowWillResignMain: string
      • WindowWillResize: string
      • WindowWillUnfocus: string
      • WindowWillUpdate: string
      • WindowWillUpdateAlpha: string
      • WindowWillUpdateCollectionBehavior: string
      • WindowWillUpdateCollectionProperties: string
      • WindowWillUpdateShadow: string
      • WindowWillUpdateTitle: string
      • WindowWillUpdateToolbar: string
      • WindowWillUpdateVisibility: string
      • WindowWillUseStandardFrame: string
      • WindowZoomIn: string
      • WindowZoomOut: string
      • WindowZoomReset: string
    • Windows: {
          APMPowerSettingChange: string;
          APMPowerStatusChange: string;
          APMResumeAutomatic: string;
          APMResumeSuspend: string;
          APMSuspend: string;
          ApplicationStarted: string;
          SystemThemeChanged: string;
          WebViewNavigationCompleted: string;
          WindowActive: string;
          WindowBackgroundErase: string;
          WindowClickActive: string;
          WindowClosing: string;
          WindowDPIChanged: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowDragDrop: string;
          WindowDragEnter: string;
          WindowDragLeave: string;
          WindowDragOver: string;
          WindowEndMove: string;
          WindowEndResize: string;
          WindowFullscreen: string;
          WindowHide: string;
          WindowInactive: string;
          WindowKeyDown: string;
          WindowKeyUp: string;
          WindowKillFocus: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowNonClientHit: string;
          WindowNonClientMouseDown: string;
          WindowNonClientMouseLeave: string;
          WindowNonClientMouseMove: string;
          WindowNonClientMouseUp: string;
          WindowPaint: string;
          WindowRestore: string;
          WindowSetFocus: string;
          WindowShow: string;
          WindowStartMove: string;
          WindowStartResize: string;
          WindowUnFullscreen: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowZOrderChanged: string;
      }
      • APMPowerSettingChange: string
      • APMPowerStatusChange: string
      • APMResumeAutomatic: string
      • APMResumeSuspend: string
      • APMSuspend: string
      • ApplicationStarted: string
      • SystemThemeChanged: string
      • WebViewNavigationCompleted: string
      • WindowActive: string
      • WindowBackgroundErase: string
      • WindowClickActive: string
      • WindowClosing: string
      • WindowDPIChanged: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowDragDrop: string
      • WindowDragEnter: string
      • WindowDragLeave: string
      • WindowDragOver: string
      • WindowEndMove: string
      • WindowEndResize: string
      • WindowFullscreen: string
      • WindowHide: string
      • WindowInactive: string
      • WindowKeyDown: string
      • WindowKeyUp: string
      • WindowKillFocus: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowNonClientHit: string
      • WindowNonClientMouseDown: string
      • WindowNonClientMouseLeave: string
      • WindowNonClientMouseMove: string
      • WindowNonClientMouseUp: string
      • WindowPaint: string
      • WindowRestore: string
      • WindowSetFocus: string
      • WindowShow: string
      • WindowStartMove: string
      • WindowStartResize: string
      • WindowUnFullscreen: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowZOrderChanged: string

    Generated using TypeDoc

    \ No newline at end of file +Types | @wailsio/runtime

    Variable TypesConst

    Types: {
        Common: {
            ApplicationOpenedWithFile: string;
            ApplicationStarted: string;
            ThemeChanged: string;
            WindowClosing: string;
            WindowDPIChanged: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowFilesDropped: string;
            WindowFocus: string;
            WindowFullscreen: string;
            WindowHide: string;
            WindowLostFocus: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowRestore: string;
            WindowRuntimeReady: string;
            WindowShow: string;
            WindowUnFullscreen: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowZoom: string;
            WindowZoomIn: string;
            WindowZoomOut: string;
            WindowZoomReset: string;
        };
        Linux: {
            ApplicationStartup: string;
            SystemThemeChanged: string;
            WindowDeleteEvent: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowFocusIn: string;
            WindowFocusOut: string;
            WindowLoadChanged: string;
        };
        Mac: {
            ApplicationDidBecomeActive: string;
            ApplicationDidChangeBackingProperties: string;
            ApplicationDidChangeEffectiveAppearance: string;
            ApplicationDidChangeIcon: string;
            ApplicationDidChangeOcclusionState: string;
            ApplicationDidChangeScreenParameters: string;
            ApplicationDidChangeStatusBarFrame: string;
            ApplicationDidChangeStatusBarOrientation: string;
            ApplicationDidChangeTheme: string;
            ApplicationDidFinishLaunching: string;
            ApplicationDidHide: string;
            ApplicationDidResignActive: string;
            ApplicationDidUnhide: string;
            ApplicationDidUpdate: string;
            ApplicationShouldHandleReopen: string;
            ApplicationWillBecomeActive: string;
            ApplicationWillFinishLaunching: string;
            ApplicationWillHide: string;
            ApplicationWillResignActive: string;
            ApplicationWillTerminate: string;
            ApplicationWillUnhide: string;
            ApplicationWillUpdate: string;
            MenuDidAddItem: string;
            MenuDidBeginTracking: string;
            MenuDidClose: string;
            MenuDidDisplayItem: string;
            MenuDidEndTracking: string;
            MenuDidHighlightItem: string;
            MenuDidOpen: string;
            MenuDidPopUp: string;
            MenuDidRemoveItem: string;
            MenuDidSendAction: string;
            MenuDidSendActionToItem: string;
            MenuDidUpdate: string;
            MenuWillAddItem: string;
            MenuWillBeginTracking: string;
            MenuWillDisplayItem: string;
            MenuWillEndTracking: string;
            MenuWillHighlightItem: string;
            MenuWillOpen: string;
            MenuWillPopUp: string;
            MenuWillRemoveItem: string;
            MenuWillSendAction: string;
            MenuWillSendActionToItem: string;
            MenuWillUpdate: string;
            WebViewDidCommitNavigation: string;
            WebViewDidFinishNavigation: string;
            WebViewDidReceiveServerRedirectForProvisionalNavigation: string;
            WebViewDidStartProvisionalNavigation: string;
            WindowDidBecomeKey: string;
            WindowDidBecomeMain: string;
            WindowDidBeginSheet: string;
            WindowDidChangeAlpha: string;
            WindowDidChangeBackingLocation: string;
            WindowDidChangeBackingProperties: string;
            WindowDidChangeCollectionBehavior: string;
            WindowDidChangeEffectiveAppearance: string;
            WindowDidChangeOcclusionState: string;
            WindowDidChangeOrderingMode: string;
            WindowDidChangeScreen: string;
            WindowDidChangeScreenParameters: string;
            WindowDidChangeScreenProfile: string;
            WindowDidChangeScreenSpace: string;
            WindowDidChangeScreenSpaceProperties: string;
            WindowDidChangeSharingType: string;
            WindowDidChangeSpace: string;
            WindowDidChangeSpaceOrderingMode: string;
            WindowDidChangeTitle: string;
            WindowDidChangeToolbar: string;
            WindowDidDeminiaturize: string;
            WindowDidEndSheet: string;
            WindowDidEnterFullScreen: string;
            WindowDidEnterVersionBrowser: string;
            WindowDidExitFullScreen: string;
            WindowDidExitVersionBrowser: string;
            WindowDidExpose: string;
            WindowDidFocus: string;
            WindowDidMiniaturize: string;
            WindowDidMove: string;
            WindowDidOrderOffScreen: string;
            WindowDidOrderOnScreen: string;
            WindowDidResignKey: string;
            WindowDidResignMain: string;
            WindowDidResize: string;
            WindowDidUpdate: string;
            WindowDidUpdateAlpha: string;
            WindowDidUpdateCollectionBehavior: string;
            WindowDidUpdateCollectionProperties: string;
            WindowDidUpdateShadow: string;
            WindowDidUpdateTitle: string;
            WindowDidUpdateToolbar: string;
            WindowDidZoom: string;
            WindowFileDraggingEntered: string;
            WindowFileDraggingExited: string;
            WindowFileDraggingPerformed: string;
            WindowHide: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowShouldClose: string;
            WindowShow: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowWillBecomeKey: string;
            WindowWillBecomeMain: string;
            WindowWillBeginSheet: string;
            WindowWillChangeOrderingMode: string;
            WindowWillClose: string;
            WindowWillDeminiaturize: string;
            WindowWillEnterFullScreen: string;
            WindowWillEnterVersionBrowser: string;
            WindowWillExitFullScreen: string;
            WindowWillExitVersionBrowser: string;
            WindowWillFocus: string;
            WindowWillMiniaturize: string;
            WindowWillMove: string;
            WindowWillOrderOffScreen: string;
            WindowWillOrderOnScreen: string;
            WindowWillResignMain: string;
            WindowWillResize: string;
            WindowWillUnfocus: string;
            WindowWillUpdate: string;
            WindowWillUpdateAlpha: string;
            WindowWillUpdateCollectionBehavior: string;
            WindowWillUpdateCollectionProperties: string;
            WindowWillUpdateShadow: string;
            WindowWillUpdateTitle: string;
            WindowWillUpdateToolbar: string;
            WindowWillUpdateVisibility: string;
            WindowWillUseStandardFrame: string;
            WindowZoomIn: string;
            WindowZoomOut: string;
            WindowZoomReset: string;
        };
        Windows: {
            APMPowerSettingChange: string;
            APMPowerStatusChange: string;
            APMResumeAutomatic: string;
            APMResumeSuspend: string;
            APMSuspend: string;
            ApplicationStarted: string;
            SystemThemeChanged: string;
            WebViewNavigationCompleted: string;
            WindowActive: string;
            WindowBackgroundErase: string;
            WindowClickActive: string;
            WindowClosing: string;
            WindowDPIChanged: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowDragDrop: string;
            WindowDragEnter: string;
            WindowDragLeave: string;
            WindowDragOver: string;
            WindowEndMove: string;
            WindowEndResize: string;
            WindowFullscreen: string;
            WindowHide: string;
            WindowInactive: string;
            WindowKeyDown: string;
            WindowKeyUp: string;
            WindowKillFocus: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowNonClientHit: string;
            WindowNonClientMouseDown: string;
            WindowNonClientMouseLeave: string;
            WindowNonClientMouseMove: string;
            WindowNonClientMouseUp: string;
            WindowPaint: string;
            WindowRestore: string;
            WindowSetFocus: string;
            WindowShow: string;
            WindowStartMove: string;
            WindowStartResize: string;
            WindowUnFullscreen: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowZOrderChanged: string;
        };
    } = EventTypes

    Type declaration

    • Common: {
          ApplicationOpenedWithFile: string;
          ApplicationStarted: string;
          ThemeChanged: string;
          WindowClosing: string;
          WindowDPIChanged: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowFilesDropped: string;
          WindowFocus: string;
          WindowFullscreen: string;
          WindowHide: string;
          WindowLostFocus: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowRestore: string;
          WindowRuntimeReady: string;
          WindowShow: string;
          WindowUnFullscreen: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowZoom: string;
          WindowZoomIn: string;
          WindowZoomOut: string;
          WindowZoomReset: string;
      }
      • ApplicationOpenedWithFile: string
      • ApplicationStarted: string
      • ThemeChanged: string
      • WindowClosing: string
      • WindowDPIChanged: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowFilesDropped: string
      • WindowFocus: string
      • WindowFullscreen: string
      • WindowHide: string
      • WindowLostFocus: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowRestore: string
      • WindowRuntimeReady: string
      • WindowShow: string
      • WindowUnFullscreen: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowZoom: string
      • WindowZoomIn: string
      • WindowZoomOut: string
      • WindowZoomReset: string
    • Linux: {
          ApplicationStartup: string;
          SystemThemeChanged: string;
          WindowDeleteEvent: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowFocusIn: string;
          WindowFocusOut: string;
          WindowLoadChanged: string;
      }
      • ApplicationStartup: string
      • SystemThemeChanged: string
      • WindowDeleteEvent: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowFocusIn: string
      • WindowFocusOut: string
      • WindowLoadChanged: string
    • Mac: {
          ApplicationDidBecomeActive: string;
          ApplicationDidChangeBackingProperties: string;
          ApplicationDidChangeEffectiveAppearance: string;
          ApplicationDidChangeIcon: string;
          ApplicationDidChangeOcclusionState: string;
          ApplicationDidChangeScreenParameters: string;
          ApplicationDidChangeStatusBarFrame: string;
          ApplicationDidChangeStatusBarOrientation: string;
          ApplicationDidChangeTheme: string;
          ApplicationDidFinishLaunching: string;
          ApplicationDidHide: string;
          ApplicationDidResignActive: string;
          ApplicationDidUnhide: string;
          ApplicationDidUpdate: string;
          ApplicationShouldHandleReopen: string;
          ApplicationWillBecomeActive: string;
          ApplicationWillFinishLaunching: string;
          ApplicationWillHide: string;
          ApplicationWillResignActive: string;
          ApplicationWillTerminate: string;
          ApplicationWillUnhide: string;
          ApplicationWillUpdate: string;
          MenuDidAddItem: string;
          MenuDidBeginTracking: string;
          MenuDidClose: string;
          MenuDidDisplayItem: string;
          MenuDidEndTracking: string;
          MenuDidHighlightItem: string;
          MenuDidOpen: string;
          MenuDidPopUp: string;
          MenuDidRemoveItem: string;
          MenuDidSendAction: string;
          MenuDidSendActionToItem: string;
          MenuDidUpdate: string;
          MenuWillAddItem: string;
          MenuWillBeginTracking: string;
          MenuWillDisplayItem: string;
          MenuWillEndTracking: string;
          MenuWillHighlightItem: string;
          MenuWillOpen: string;
          MenuWillPopUp: string;
          MenuWillRemoveItem: string;
          MenuWillSendAction: string;
          MenuWillSendActionToItem: string;
          MenuWillUpdate: string;
          WebViewDidCommitNavigation: string;
          WebViewDidFinishNavigation: string;
          WebViewDidReceiveServerRedirectForProvisionalNavigation: string;
          WebViewDidStartProvisionalNavigation: string;
          WindowDidBecomeKey: string;
          WindowDidBecomeMain: string;
          WindowDidBeginSheet: string;
          WindowDidChangeAlpha: string;
          WindowDidChangeBackingLocation: string;
          WindowDidChangeBackingProperties: string;
          WindowDidChangeCollectionBehavior: string;
          WindowDidChangeEffectiveAppearance: string;
          WindowDidChangeOcclusionState: string;
          WindowDidChangeOrderingMode: string;
          WindowDidChangeScreen: string;
          WindowDidChangeScreenParameters: string;
          WindowDidChangeScreenProfile: string;
          WindowDidChangeScreenSpace: string;
          WindowDidChangeScreenSpaceProperties: string;
          WindowDidChangeSharingType: string;
          WindowDidChangeSpace: string;
          WindowDidChangeSpaceOrderingMode: string;
          WindowDidChangeTitle: string;
          WindowDidChangeToolbar: string;
          WindowDidDeminiaturize: string;
          WindowDidEndSheet: string;
          WindowDidEnterFullScreen: string;
          WindowDidEnterVersionBrowser: string;
          WindowDidExitFullScreen: string;
          WindowDidExitVersionBrowser: string;
          WindowDidExpose: string;
          WindowDidFocus: string;
          WindowDidMiniaturize: string;
          WindowDidMove: string;
          WindowDidOrderOffScreen: string;
          WindowDidOrderOnScreen: string;
          WindowDidResignKey: string;
          WindowDidResignMain: string;
          WindowDidResize: string;
          WindowDidUpdate: string;
          WindowDidUpdateAlpha: string;
          WindowDidUpdateCollectionBehavior: string;
          WindowDidUpdateCollectionProperties: string;
          WindowDidUpdateShadow: string;
          WindowDidUpdateTitle: string;
          WindowDidUpdateToolbar: string;
          WindowDidZoom: string;
          WindowFileDraggingEntered: string;
          WindowFileDraggingExited: string;
          WindowFileDraggingPerformed: string;
          WindowHide: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowShouldClose: string;
          WindowShow: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowWillBecomeKey: string;
          WindowWillBecomeMain: string;
          WindowWillBeginSheet: string;
          WindowWillChangeOrderingMode: string;
          WindowWillClose: string;
          WindowWillDeminiaturize: string;
          WindowWillEnterFullScreen: string;
          WindowWillEnterVersionBrowser: string;
          WindowWillExitFullScreen: string;
          WindowWillExitVersionBrowser: string;
          WindowWillFocus: string;
          WindowWillMiniaturize: string;
          WindowWillMove: string;
          WindowWillOrderOffScreen: string;
          WindowWillOrderOnScreen: string;
          WindowWillResignMain: string;
          WindowWillResize: string;
          WindowWillUnfocus: string;
          WindowWillUpdate: string;
          WindowWillUpdateAlpha: string;
          WindowWillUpdateCollectionBehavior: string;
          WindowWillUpdateCollectionProperties: string;
          WindowWillUpdateShadow: string;
          WindowWillUpdateTitle: string;
          WindowWillUpdateToolbar: string;
          WindowWillUpdateVisibility: string;
          WindowWillUseStandardFrame: string;
          WindowZoomIn: string;
          WindowZoomOut: string;
          WindowZoomReset: string;
      }
      • ApplicationDidBecomeActive: string
      • ApplicationDidChangeBackingProperties: string
      • ApplicationDidChangeEffectiveAppearance: string
      • ApplicationDidChangeIcon: string
      • ApplicationDidChangeOcclusionState: string
      • ApplicationDidChangeScreenParameters: string
      • ApplicationDidChangeStatusBarFrame: string
      • ApplicationDidChangeStatusBarOrientation: string
      • ApplicationDidChangeTheme: string
      • ApplicationDidFinishLaunching: string
      • ApplicationDidHide: string
      • ApplicationDidResignActive: string
      • ApplicationDidUnhide: string
      • ApplicationDidUpdate: string
      • ApplicationShouldHandleReopen: string
      • ApplicationWillBecomeActive: string
      • ApplicationWillFinishLaunching: string
      • ApplicationWillHide: string
      • ApplicationWillResignActive: string
      • ApplicationWillTerminate: string
      • ApplicationWillUnhide: string
      • ApplicationWillUpdate: string
      • MenuDidAddItem: string
      • MenuDidBeginTracking: string
      • MenuDidClose: string
      • MenuDidDisplayItem: string
      • MenuDidEndTracking: string
      • MenuDidHighlightItem: string
      • MenuDidOpen: string
      • MenuDidPopUp: string
      • MenuDidRemoveItem: string
      • MenuDidSendAction: string
      • MenuDidSendActionToItem: string
      • MenuDidUpdate: string
      • MenuWillAddItem: string
      • MenuWillBeginTracking: string
      • MenuWillDisplayItem: string
      • MenuWillEndTracking: string
      • MenuWillHighlightItem: string
      • MenuWillOpen: string
      • MenuWillPopUp: string
      • MenuWillRemoveItem: string
      • MenuWillSendAction: string
      • MenuWillSendActionToItem: string
      • MenuWillUpdate: string
      • WebViewDidCommitNavigation: string
      • WebViewDidFinishNavigation: string
      • WebViewDidReceiveServerRedirectForProvisionalNavigation: string
      • WebViewDidStartProvisionalNavigation: string
      • WindowDidBecomeKey: string
      • WindowDidBecomeMain: string
      • WindowDidBeginSheet: string
      • WindowDidChangeAlpha: string
      • WindowDidChangeBackingLocation: string
      • WindowDidChangeBackingProperties: string
      • WindowDidChangeCollectionBehavior: string
      • WindowDidChangeEffectiveAppearance: string
      • WindowDidChangeOcclusionState: string
      • WindowDidChangeOrderingMode: string
      • WindowDidChangeScreen: string
      • WindowDidChangeScreenParameters: string
      • WindowDidChangeScreenProfile: string
      • WindowDidChangeScreenSpace: string
      • WindowDidChangeScreenSpaceProperties: string
      • WindowDidChangeSharingType: string
      • WindowDidChangeSpace: string
      • WindowDidChangeSpaceOrderingMode: string
      • WindowDidChangeTitle: string
      • WindowDidChangeToolbar: string
      • WindowDidDeminiaturize: string
      • WindowDidEndSheet: string
      • WindowDidEnterFullScreen: string
      • WindowDidEnterVersionBrowser: string
      • WindowDidExitFullScreen: string
      • WindowDidExitVersionBrowser: string
      • WindowDidExpose: string
      • WindowDidFocus: string
      • WindowDidMiniaturize: string
      • WindowDidMove: string
      • WindowDidOrderOffScreen: string
      • WindowDidOrderOnScreen: string
      • WindowDidResignKey: string
      • WindowDidResignMain: string
      • WindowDidResize: string
      • WindowDidUpdate: string
      • WindowDidUpdateAlpha: string
      • WindowDidUpdateCollectionBehavior: string
      • WindowDidUpdateCollectionProperties: string
      • WindowDidUpdateShadow: string
      • WindowDidUpdateTitle: string
      • WindowDidUpdateToolbar: string
      • WindowDidZoom: string
      • WindowFileDraggingEntered: string
      • WindowFileDraggingExited: string
      • WindowFileDraggingPerformed: string
      • WindowHide: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowShouldClose: string
      • WindowShow: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowWillBecomeKey: string
      • WindowWillBecomeMain: string
      • WindowWillBeginSheet: string
      • WindowWillChangeOrderingMode: string
      • WindowWillClose: string
      • WindowWillDeminiaturize: string
      • WindowWillEnterFullScreen: string
      • WindowWillEnterVersionBrowser: string
      • WindowWillExitFullScreen: string
      • WindowWillExitVersionBrowser: string
      • WindowWillFocus: string
      • WindowWillMiniaturize: string
      • WindowWillMove: string
      • WindowWillOrderOffScreen: string
      • WindowWillOrderOnScreen: string
      • WindowWillResignMain: string
      • WindowWillResize: string
      • WindowWillUnfocus: string
      • WindowWillUpdate: string
      • WindowWillUpdateAlpha: string
      • WindowWillUpdateCollectionBehavior: string
      • WindowWillUpdateCollectionProperties: string
      • WindowWillUpdateShadow: string
      • WindowWillUpdateTitle: string
      • WindowWillUpdateToolbar: string
      • WindowWillUpdateVisibility: string
      • WindowWillUseStandardFrame: string
      • WindowZoomIn: string
      • WindowZoomOut: string
      • WindowZoomReset: string
    • Windows: {
          APMPowerSettingChange: string;
          APMPowerStatusChange: string;
          APMResumeAutomatic: string;
          APMResumeSuspend: string;
          APMSuspend: string;
          ApplicationStarted: string;
          SystemThemeChanged: string;
          WebViewNavigationCompleted: string;
          WindowActive: string;
          WindowBackgroundErase: string;
          WindowClickActive: string;
          WindowClosing: string;
          WindowDPIChanged: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowDragDrop: string;
          WindowDragEnter: string;
          WindowDragLeave: string;
          WindowDragOver: string;
          WindowEndMove: string;
          WindowEndResize: string;
          WindowFullscreen: string;
          WindowHide: string;
          WindowInactive: string;
          WindowKeyDown: string;
          WindowKeyUp: string;
          WindowKillFocus: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowNonClientHit: string;
          WindowNonClientMouseDown: string;
          WindowNonClientMouseLeave: string;
          WindowNonClientMouseMove: string;
          WindowNonClientMouseUp: string;
          WindowPaint: string;
          WindowRestore: string;
          WindowSetFocus: string;
          WindowShow: string;
          WindowStartMove: string;
          WindowStartResize: string;
          WindowUnFullscreen: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowZOrderChanged: string;
      }
      • APMPowerSettingChange: string
      • APMPowerStatusChange: string
      • APMResumeAutomatic: string
      • APMResumeSuspend: string
      • APMSuspend: string
      • ApplicationStarted: string
      • SystemThemeChanged: string
      • WebViewNavigationCompleted: string
      • WindowActive: string
      • WindowBackgroundErase: string
      • WindowClickActive: string
      • WindowClosing: string
      • WindowDPIChanged: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowDragDrop: string
      • WindowDragEnter: string
      • WindowDragLeave: string
      • WindowDragOver: string
      • WindowEndMove: string
      • WindowEndResize: string
      • WindowFullscreen: string
      • WindowHide: string
      • WindowInactive: string
      • WindowKeyDown: string
      • WindowKeyUp: string
      • WindowKillFocus: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowNonClientHit: string
      • WindowNonClientMouseDown: string
      • WindowNonClientMouseLeave: string
      • WindowNonClientMouseMove: string
      • WindowNonClientMouseUp: string
      • WindowPaint: string
      • WindowRestore: string
      • WindowSetFocus: string
      • WindowShow: string
      • WindowStartMove: string
      • WindowStartResize: string
      • WindowUnFullscreen: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowZOrderChanged: string

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Window.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Window.html index 70120076c..e21e91c08 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Window.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Window.html @@ -1,2 +1,2 @@ Window | @wailsio/runtime

    Variable WindowConst

    Window: Window = ...

    The window within which the script is running.

    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/package-lock.json b/v3/internal/runtime/desktop/@wailsio/runtime/package-lock.json index e163bd8ee..8591d7d71 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/package-lock.json +++ b/v3/internal/runtime/desktop/@wailsio/runtime/package-lock.json @@ -1,12 +1,12 @@ { "name": "@wailsio/runtime", - "version": "3.0.0-alpha.63", + "version": "3.0.0-alpha.64", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@wailsio/runtime", - "version": "3.0.0-alpha.63", + "version": "3.0.0-alpha.64", "license": "MIT", "devDependencies": { "rimraf": "^5.0.5", diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/package.json b/v3/internal/runtime/desktop/@wailsio/runtime/package.json index 89d4f30c3..0ce6274f5 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/package.json +++ b/v3/internal/runtime/desktop/@wailsio/runtime/package.json @@ -1,7 +1,7 @@ { "name": "@wailsio/runtime", "type": "module", - "version": "3.0.0-alpha.63", + "version": "3.0.0-alpha.64", "description": "Wails Runtime", "types": "types/index.d.ts", "exports": { From 835fcbecc8de2deb8ad941236de95af7d6fbfe62 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Fri, 28 Feb 2025 07:49:00 +1100 Subject: [PATCH 110/374] [ci] Try warpbuild --- .github/workflows/build-and-test-v3.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-and-test-v3.yml b/.github/workflows/build-and-test-v3.yml index 61cb9dde9..e77c6190a 100644 --- a/.github/workflows/build-and-test-v3.yml +++ b/.github/workflows/build-and-test-v3.yml @@ -33,7 +33,7 @@ jobs: strategy: fail-fast: false matrix: - os: [windows-latest, macos-latest, ubuntu-latest] + os: [warp-windows-latest-x64-2x, warp-macos-15-arm64-6x, warp-ubuntu-latest-x64-2x] go-version: [1.24] steps: From 73da97053e5875c1bb5ef98ee0568490c73a98d5 Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Thu, 27 Feb 2025 20:49:51 +0000 Subject: [PATCH 111/374] [skip ci] Publish @wailsio/runtime v3.0.0-alpha.65 --- .../docs/classes/Call.RuntimeError.html | 4 +-- .../docs/classes/Events.WailsEvent.html | 4 +-- .../docs/functions/Application.Hide.html | 2 +- .../docs/functions/Application.Quit.html | 2 +- .../docs/functions/Application.Show.html | 2 +- .../docs/functions/Browser.OpenURL.html | 2 +- .../runtime/docs/functions/Call.ByID.html | 2 +- .../runtime/docs/functions/Call.ByName.html | 2 +- .../runtime/docs/functions/Call.Call.html | 2 +- .../docs/functions/Clipboard.SetText.html | 2 +- .../docs/functions/Clipboard.Text.html | 2 +- .../runtime/docs/functions/Create.Any.html | 2 +- .../runtime/docs/functions/Create.Array.html | 2 +- .../docs/functions/Create.ByteSlice.html | 2 +- .../runtime/docs/functions/Create.Map.html | 2 +- .../docs/functions/Create.Nullable.html | 2 +- .../runtime/docs/functions/Create.Struct.html | 2 +- .../runtime/docs/functions/Dialogs.Error.html | 2 +- .../runtime/docs/functions/Dialogs.Info.html | 2 +- .../docs/functions/Dialogs.OpenFile.html | 2 +- .../docs/functions/Dialogs.Question.html | 2 +- .../docs/functions/Dialogs.SaveFile.html | 2 +- .../docs/functions/Dialogs.Warning.html | 2 +- .../runtime/docs/functions/Events.Emit.html | 2 +- .../runtime/docs/functions/Events.Off.html | 2 +- .../runtime/docs/functions/Events.OffAll.html | 2 +- .../runtime/docs/functions/Events.On.html | 2 +- .../docs/functions/Events.OnMultiple.html | 2 +- .../runtime/docs/functions/Events.Once.html | 2 +- .../runtime/docs/functions/Events.setup.html | 2 +- .../runtime/docs/functions/Flags.GetFlag.html | 2 +- .../docs/functions/Screens.GetAll.html | 2 +- .../docs/functions/Screens.GetCurrent.html | 2 +- .../docs/functions/Screens.GetPrimary.html | 2 +- .../docs/functions/System.Capabilities.html | 2 +- .../docs/functions/System.Environment.html | 2 +- .../docs/functions/System.IsAMD64.html | 2 +- .../runtime/docs/functions/System.IsARM.html | 2 +- .../docs/functions/System.IsARM64.html | 2 +- .../docs/functions/System.IsDarkMode.html | 2 +- .../docs/functions/System.IsDebug.html | 2 +- .../docs/functions/System.IsLinux.html | 2 +- .../runtime/docs/functions/System.IsMac.html | 2 +- .../docs/functions/System.IsWindows.html | 2 +- .../runtime/docs/functions/System.invoke.html | 2 +- .../runtime/docs/functions/WML.Enable.html | 2 +- .../runtime/docs/functions/WML.Reload.html | 2 +- .../@wailsio/runtime/docs/functions/init.html | 2 +- .../docs/interfaces/Call.CallOptions.html | 8 ++--- .../docs/interfaces/Dialogs.Button.html | 8 ++--- .../docs/interfaces/Dialogs.FileFilter.html | 6 ++-- .../Dialogs.MessageDialogOptions.html | 10 +++--- .../Dialogs.OpenFileDialogOptions.html | 34 +++++++++--------- .../Dialogs.SaveFileDialogOptions.html | 36 +++++++++---------- .../runtime/docs/interfaces/Screens.Rect.html | 10 +++--- .../docs/interfaces/Screens.Screen.html | 26 +++++++------- .../runtime/docs/interfaces/Screens.Size.html | 6 ++-- .../interfaces/System.EnvironmentInfo.html | 12 +++---- .../docs/interfaces/System.OSInfo.html | 10 +++--- .../runtime/docs/modules/Application.html | 2 +- .../runtime/docs/modules/Browser.html | 2 +- .../@wailsio/runtime/docs/modules/Call.html | 2 +- .../runtime/docs/modules/Clipboard.html | 2 +- .../@wailsio/runtime/docs/modules/Create.html | 2 +- .../runtime/docs/modules/Dialogs.html | 2 +- .../@wailsio/runtime/docs/modules/Events.html | 2 +- .../@wailsio/runtime/docs/modules/Flags.html | 2 +- .../runtime/docs/modules/Screens.html | 2 +- .../@wailsio/runtime/docs/modules/System.html | 2 +- .../@wailsio/runtime/docs/modules/WML.html | 2 +- .../runtime/docs/variables/Events.Types.html | 2 +- .../runtime/docs/variables/Window.html | 2 +- .../@wailsio/runtime/package-lock.json | 4 +-- .../desktop/@wailsio/runtime/package.json | 2 +- 74 files changed, 149 insertions(+), 149 deletions(-) diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Call.RuntimeError.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Call.RuntimeError.html index f576a1307..0d9e1bcc2 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Call.RuntimeError.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Call.RuntimeError.html @@ -1,6 +1,6 @@ RuntimeError | @wailsio/runtime

    Exception class that will be thrown in case the bound method returns an error. The value of the RuntimeError#name property is "RuntimeError".

    -

    Hierarchy

    • Error
      • RuntimeError

    Constructors

    Hierarchy

    • Error
      • RuntimeError

    Constructors

    Properties

    cause? message name @@ -8,4 +8,4 @@ The value of the

    Constructors

    • Constructs a new RuntimeError instance.

      Parameters

      • message: string

        The error message.

      • Rest ...args: any[]

        Optional arguments for the Error constructor.

        -

      Returns RuntimeError

    Properties

    cause?: unknown
    message: string
    name: string
    stack?: string

    Generated using TypeDoc

    \ No newline at end of file +

    Returns RuntimeError

    Properties

    cause?: unknown
    message: string
    name: string
    stack?: string

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Events.WailsEvent.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Events.WailsEvent.html index a9b6ec306..6a3105148 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Events.WailsEvent.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Events.WailsEvent.html @@ -1,4 +1,4 @@ -WailsEvent | @wailsio/runtime

    Constructors

    constructor +WailsEvent | @wailsio/runtime

    Constructors

    Properties

    Constructors

    Properties

    data: any
    name: any

    Generated using TypeDoc

    \ No newline at end of file +

    Constructors

    Properties

    data: any
    name: any

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Hide.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Hide.html index d9aad5db4..7f129ce69 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Hide.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Hide.html @@ -1,2 +1,2 @@ Hide | @wailsio/runtime
    • Hides a certain method by calling the HideMethod function.

      -

      Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file +

    Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Quit.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Quit.html index 2e4b1968b..5fe5e1404 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Quit.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Quit.html @@ -1,2 +1,2 @@ Quit | @wailsio/runtime
    • Calls the QuitMethod to terminate the program.

      -

      Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file +

    Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Show.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Show.html index 09f9ccb0a..22c82d584 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Show.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Show.html @@ -1,2 +1,2 @@ Show | @wailsio/runtime
    • Calls the ShowMethod and returns the result.

      -

      Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file +

    Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Browser.OpenURL.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Browser.OpenURL.html index 924c511ac..1ca83c77c 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Browser.OpenURL.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Browser.OpenURL.html @@ -1,3 +1,3 @@ OpenURL | @wailsio/runtime
    • Open a browser window to the given URL

      Parameters

      • url: string

        The URL to open

        -

      Returns Promise<string>

    Generated using TypeDoc

    \ No newline at end of file +

    Returns Promise<string>

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByID.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByID.html index 4ed223ea1..b0d87a730 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByID.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByID.html @@ -5,4 +5,4 @@ See Call for details.

    Returns Promise<any>

    • The result of the method call.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByName.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByName.html index 4d55affab..1e43aee17 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByName.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByName.html @@ -3,4 +3,4 @@ See Call for details.

    Parameters

    • methodName: string

      The name of the method in the format 'package.struct.method'.

    • Rest ...args: any[]

      The arguments to pass to the method.

    Returns Promise<any>

    The result of the method call.

    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.Call.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.Call.html index 742831636..6771fe7aa 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.Call.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.Call.html @@ -8,4 +8,4 @@ by the application- or service-level error marshaling functions.

    Returns Promise<any>

    • The result of the call.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.SetText.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.SetText.html index efff4ae38..bf72c6ec1 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.SetText.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.SetText.html @@ -3,4 +3,4 @@

    Returns Promise<any>

    • A Promise that resolves when the operation is successful.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.Text.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.Text.html index a1f7fdc97..9b4cf3f9b 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.Text.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.Text.html @@ -1,3 +1,3 @@ Text | @wailsio/runtime
    • Get the Clipboard text

      Returns Promise<string>

      A promise that resolves with the text from the Clipboard.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Any.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Any.html index 28f357def..8d776ae38 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Any.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Any.html @@ -1,2 +1,2 @@ Any | @wailsio/runtime
    • Any is a dummy creation function for simple or unknown types.

      -

      Type Parameters

      • T

      Parameters

      • source: any

      Returns T

    Generated using TypeDoc

    \ No newline at end of file +

    Type Parameters

    • T

    Parameters

    • source: any

    Returns T

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Array.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Array.html index 4c3899dbc..7da180aa9 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Array.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Array.html @@ -1,4 +1,4 @@ Array | @wailsio/runtime
    • Array takes a creation function for an arbitrary type and returns an in-place creation function for an array whose elements are of that type.

      -

      Type Parameters

      • T

      Parameters

      • element: ((source) => T)
          • (source): T
          • Parameters

            • source: any

            Returns T

      Returns ((source) => T[])

        • (source): T[]
        • Parameters

          • source: any

          Returns T[]

    Generated using TypeDoc

    \ No newline at end of file +

    Type Parameters

    • T

    Parameters

    • element: ((source) => T)
        • (source): T
        • Parameters

          • source: any

          Returns T

    Returns ((source) => T[])

      • (source): T[]
      • Parameters

        • source: any

        Returns T[]

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.ByteSlice.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.ByteSlice.html index 111ee04b1..8dd0170b8 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.ByteSlice.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.ByteSlice.html @@ -1,3 +1,3 @@ ByteSlice | @wailsio/runtime
    • ByteSlice is a creation function that replaces null strings with empty strings.

      -

      Parameters

      • source: any

      Returns string

    Generated using TypeDoc

    \ No newline at end of file +

    Parameters

    • source: any

    Returns string

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Map.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Map.html index 3f5714ab9..a34b7cb25 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Map.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Map.html @@ -1,4 +1,4 @@ Map | @wailsio/runtime
    • Map takes creation functions for two arbitrary types and returns an in-place creation function for an object whose keys and values are of those types.

      -

      Type Parameters

      • K
      • V

      Parameters

      • key: ((source) => K)
          • (source): K
          • Parameters

            • source: any

            Returns K

      • value: ((source) => V)
          • (source): V
          • Parameters

            • source: any

            Returns V

      Returns ((source) => {
          [_: K]: V;
      })

        • (source): {
              [_: K]: V;
          }
        • Parameters

          • source: any

          Returns {
              [_: K]: V;
          }

    Generated using TypeDoc

    \ No newline at end of file +

    Type Parameters

    • K
    • V

    Parameters

    • key: ((source) => K)
        • (source): K
        • Parameters

          • source: any

          Returns K

    • value: ((source) => V)
        • (source): V
        • Parameters

          • source: any

          Returns V

    Returns ((source) => {
        [_: K]: V;
    })

      • (source): {
            [_: K]: V;
        }
      • Parameters

        • source: any

        Returns {
            [_: K]: V;
        }

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Nullable.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Nullable.html index 2d2650b8a..5c065657b 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Nullable.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Nullable.html @@ -1,3 +1,3 @@ Nullable | @wailsio/runtime
    • Nullable takes a creation function for an arbitrary type and returns a creation function for a nullable value of that type.

      -

      Type Parameters

      • T

      Parameters

      • element: ((source) => T)
          • (source): T
          • Parameters

            • source: any

            Returns T

      Returns ((source) => null | T)

        • (source): null | T
        • Parameters

          • source: any

          Returns null | T

    Generated using TypeDoc

    \ No newline at end of file +

    Type Parameters

    • T

    Parameters

    • element: ((source) => T)
        • (source): T
        • Parameters

          • source: any

          Returns T

    Returns ((source) => null | T)

      • (source): null | T
      • Parameters

        • source: any

        Returns null | T

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Struct.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Struct.html index 0df214cb6..503d912bd 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Struct.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Struct.html @@ -1,3 +1,3 @@ Struct | @wailsio/runtime
    • Struct takes an object mapping field names to creation functions and returns an in-place creation function for a struct.

      -

      Type Parameters

      • T extends {
            [_: string]: ((source) => any);
        }
      • U extends {
            [Key in string | number | symbol]?: ReturnType<T[Key]>
        }

      Parameters

      • createField: T

      Returns ((source) => U)

        • (source): U
        • Parameters

          • source: any

          Returns U

    Generated using TypeDoc

    \ No newline at end of file +

    Type Parameters

    • T extends {
          [_: string]: ((source) => any);
      }
    • U extends {
          [Key in string | number | symbol]?: ReturnType<T[Key]>
      }

    Parameters

    • createField: T

    Returns ((source) => U)

      • (source): U
      • Parameters

        • source: any

        Returns U

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Error.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Error.html index 13e3d578b..cb362294f 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Error.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Error.html @@ -2,4 +2,4 @@

    Returns Promise<string>

    • The label of the button pressed
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Info.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Info.html index 7d757fac8..ced72886f 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Info.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Info.html @@ -2,4 +2,4 @@

    Returns Promise<string>

    • The label of the button pressed
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.OpenFile.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.OpenFile.html index 55de05e73..07118f814 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.OpenFile.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.OpenFile.html @@ -1,3 +1,3 @@ OpenFile | @wailsio/runtime
    • Parameters

      Returns Promise<string | string[]>

      Returns selected file or list of files. Returns blank string if no file is selected.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Question.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Question.html index 11b6dc98b..e632a73f9 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Question.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Question.html @@ -2,4 +2,4 @@

    Returns Promise<string>

    • The label of the button pressed
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.SaveFile.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.SaveFile.html index 3084811a3..08a5e1f96 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.SaveFile.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.SaveFile.html @@ -1,3 +1,3 @@ SaveFile | @wailsio/runtime
    • Parameters

      Returns Promise<string>

      Returns the selected file. Returns blank string if no file is selected.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Warning.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Warning.html index 2ee135d07..8a8a29157 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Warning.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Warning.html @@ -2,4 +2,4 @@

    Returns Promise<string>

    • The label of the button pressed
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Emit.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Emit.html index 420439be0..4554d4ea2 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Emit.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Emit.html @@ -3,4 +3,4 @@

    Returns any

    • The result of the emitted event.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Off.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Off.html index 48338e53b..791f0bcf6 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Off.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Off.html @@ -1,4 +1,4 @@ Off | @wailsio/runtime
    • Removes event listeners for the specified event names.

      Parameters

      • eventName: string

        The name of the event to remove listeners for.

      • Rest ...additionalEventNames: string[]

        Additional event names to remove listeners for.

        -

      Returns undefined

    Generated using TypeDoc

    \ No newline at end of file +

    Returns undefined

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OffAll.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OffAll.html index 9a6e301b1..fd59705d9 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OffAll.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OffAll.html @@ -1,3 +1,3 @@ OffAll | @wailsio/runtime
    • Removes all event listeners.

      Returns void

      Function

      OffAll

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.On.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.On.html index a070df215..98b06131c 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.On.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.On.html @@ -4,4 +4,4 @@

    Returns Function

    • A function that, when called, will unregister the callback from the event.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OnMultiple.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OnMultiple.html index 6b8dddc2d..0d03e56fc 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OnMultiple.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OnMultiple.html @@ -5,4 +5,4 @@

    Returns Function

    • A function that, when called, will unregister the callback from the event.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Once.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Once.html index fc4e6606e..4ee3b22d2 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Once.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Once.html @@ -4,4 +4,4 @@

    Returns Function

    • A function that, when called, will unregister the callback from the event.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.setup.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.setup.html index ffec815e1..243255a83 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.setup.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.setup.html @@ -1 +1 @@ -setup | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file +setup | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Flags.GetFlag.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Flags.GetFlag.html index 1818913f1..da51ebf3f 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Flags.GetFlag.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Flags.GetFlag.html @@ -3,4 +3,4 @@

    Returns any

    • The value associated with the specified key.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetAll.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetAll.html index 5a367a7dc..59fa1a594 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetAll.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetAll.html @@ -1,3 +1,3 @@ GetAll | @wailsio/runtime
    • Gets all screens.

      Returns Promise<Screen[]>

      A promise that resolves to an array of Screen objects.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetCurrent.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetCurrent.html index 703aa2636..ffaac30a9 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetCurrent.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetCurrent.html @@ -1,3 +1,3 @@ GetCurrent | @wailsio/runtime
    • Gets the current active screen.

      Returns Promise<Screen>

      A promise that resolves with the current active screen.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetPrimary.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetPrimary.html index 1e71b9f77..0492eccc8 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetPrimary.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetPrimary.html @@ -1,3 +1,3 @@ GetPrimary | @wailsio/runtime
    • Gets the primary screen.

      Returns Promise<Screen>

      A promise that resolves to the primary screen.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Capabilities.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Capabilities.html index 3baa6d1e9..0c486a53f 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Capabilities.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Capabilities.html @@ -1,4 +1,4 @@ Capabilities | @wailsio/runtime
    • Fetches the capabilities of the application from the server.

      Returns Promise<Object>

      A promise that resolves to an object containing the capabilities.

      Async

      Function

      Capabilities

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Environment.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Environment.html index 6eddbdc9e..b401510bf 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Environment.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Environment.html @@ -2,4 +2,4 @@
  • A promise that resolves to an object containing OS and system architecture.
  • Function

    Retrieves environment details.

    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsAMD64.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsAMD64.html index 261861e3e..68826c47b 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsAMD64.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsAMD64.html @@ -1,3 +1,3 @@ IsAMD64 | @wailsio/runtime
    • Checks if the current environment architecture is AMD64.

      Returns boolean

      True if the current environment architecture is AMD64, false otherwise.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM.html index 942943970..c995b8def 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM.html @@ -1,3 +1,3 @@ IsARM | @wailsio/runtime
    • Checks if the current architecture is ARM.

      Returns boolean

      True if the current architecture is ARM, false otherwise.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM64.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM64.html index 69eca7bc7..71deca676 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM64.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM64.html @@ -2,4 +2,4 @@

    Returns boolean

    • Returns true if the environment is ARM64 architecture, otherwise returns false.
    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDarkMode.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDarkMode.html index 522358524..271fbbd2c 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDarkMode.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDarkMode.html @@ -2,4 +2,4 @@
  • A promise that resolves to a boolean value indicating if the system is in dark mode.
  • Function

    Retrieves the system dark mode status.

    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDebug.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDebug.html index 2c7cb9cc2..a77110244 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDebug.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDebug.html @@ -1 +1 @@ -IsDebug | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file +IsDebug | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsLinux.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsLinux.html index 1b0c5547a..86aa98f6c 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsLinux.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsLinux.html @@ -1,3 +1,3 @@ IsLinux | @wailsio/runtime
    • Checks if the current operating system is Linux.

      Returns boolean

      Returns true if the current operating system is Linux, false otherwise.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsMac.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsMac.html index 29985ed3a..4735f0676 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsMac.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsMac.html @@ -1,3 +1,3 @@ IsMac | @wailsio/runtime
    • Checks if the current environment is a macOS operating system.

      Returns boolean

      True if the environment is macOS, false otherwise.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsWindows.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsWindows.html index 41dce20d9..695320b29 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsWindows.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsWindows.html @@ -1,3 +1,3 @@ IsWindows | @wailsio/runtime
    • Checks if the current operating system is Windows.

      Returns boolean

      True if the operating system is Windows, otherwise false.

      -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.invoke.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.invoke.html index e4044cdd3..03fcc2da0 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.invoke.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.invoke.html @@ -1 +1 @@ -invoke | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file +invoke | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Enable.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Enable.html index 112e5bf2c..74ca9b159 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Enable.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Enable.html @@ -1,2 +1,2 @@ Enable | @wailsio/runtime
    • Schedules an automatic reload of WML to be performed as soon as the document is fully loaded.

      -

      Returns void

    Generated using TypeDoc

    \ No newline at end of file +

    Returns void

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Reload.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Reload.html index 1f864defd..1b585e9ec 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Reload.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Reload.html @@ -1,2 +1,2 @@ Reload | @wailsio/runtime
    • Reloads the WML page by adding necessary event listeners and browser listeners.

      -

      Returns void

    Generated using TypeDoc

    \ No newline at end of file +

    Returns void

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/init.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/init.html index b3afefb7d..cc4d4a42f 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/init.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/init.html @@ -1 +1 @@ -init | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file +init | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Call.CallOptions.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Call.CallOptions.html index 9e4130c5c..8e4991955 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Call.CallOptions.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Call.CallOptions.html @@ -1,7 +1,7 @@ -CallOptions | @wailsio/runtime

    Interface CallOptions

    interface CallOptions {
        args: any[];
        methodID: undefined | number;
        methodName: undefined | string;
    }

    Properties

    args +CallOptions | @wailsio/runtime

    Interface CallOptions

    interface CallOptions {
        args: any[];
        methodID: undefined | number;
        methodName: undefined | string;
    }

    Properties

    args: any[]

    Arguments to be passed into the bound method.

    -
    methodID: undefined | number

    The numeric ID of the bound method to call.

    -
    methodName: undefined | string

    The fully qualified name of the bound method to call.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    methodID: undefined | number

    The numeric ID of the bound method to call.

    +
    methodName: undefined | string

    The fully qualified name of the bound method to call.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.Button.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.Button.html index 81813e6b2..e9345df4f 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.Button.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.Button.html @@ -1,7 +1,7 @@ -Button | @wailsio/runtime
    interface Button {
        IsCancel: undefined | boolean;
        IsDefault: undefined | boolean;
        Label: undefined | string;
    }

    Properties

    IsCancel +Button | @wailsio/runtime
    interface Button {
        IsCancel: undefined | boolean;
        IsDefault: undefined | boolean;
        Label: undefined | string;
    }

    Properties

    IsCancel: undefined | boolean

    True if the button should cancel an operation when clicked.

    -
    IsDefault: undefined | boolean

    True if the button should be the default action when the user presses enter.

    -
    Label: undefined | string

    Text that appears within the button.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    IsDefault: undefined | boolean

    True if the button should be the default action when the user presses enter.

    +
    Label: undefined | string

    Text that appears within the button.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.FileFilter.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.FileFilter.html index 4195a04cb..79c4d1b98 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.FileFilter.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.FileFilter.html @@ -1,5 +1,5 @@ -FileFilter | @wailsio/runtime
    interface FileFilter {
        DisplayName: undefined | string;
        Pattern: undefined | string;
    }

    Properties

    DisplayName +FileFilter | @wailsio/runtime
    interface FileFilter {
        DisplayName: undefined | string;
        Pattern: undefined | string;
    }

    Properties

    Properties

    DisplayName: undefined | string

    Display name for the filter, it could be "Text Files", "Images" etc.

    -
    Pattern: undefined | string

    Pattern to match for the filter, e.g. ".txt;.md" for text markdown files.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    Pattern: undefined | string

    Pattern to match for the filter, e.g. ".txt;.md" for text markdown files.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.MessageDialogOptions.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.MessageDialogOptions.html index e9b3e778b..0ece76e45 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.MessageDialogOptions.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.MessageDialogOptions.html @@ -1,9 +1,9 @@ -MessageDialogOptions | @wailsio/runtime

    Interface MessageDialogOptions

    interface MessageDialogOptions {
        Buttons: undefined | Button[];
        Detached: undefined | boolean;
        Message: undefined | string;
        Title: undefined | string;
    }

    Properties

    Buttons +MessageDialogOptions | @wailsio/runtime

    Interface MessageDialogOptions

    interface MessageDialogOptions {
        Buttons: undefined | Button[];
        Detached: undefined | boolean;
        Message: undefined | string;
        Title: undefined | string;
    }

    Properties

    Buttons: undefined | Button[]

    Array of button options to show in the dialog.

    -
    Detached: undefined | boolean

    True if the dialog should appear detached from the main window (if applicable).

    -
    Message: undefined | string

    The main message to show in the dialog.

    -
    Title: undefined | string

    The title of the dialog window.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    Detached: undefined | boolean

    True if the dialog should appear detached from the main window (if applicable).

    +
    Message: undefined | string

    The main message to show in the dialog.

    +
    Title: undefined | string

    The title of the dialog window.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.OpenFileDialogOptions.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.OpenFileDialogOptions.html index e27b958e6..478b976ff 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.OpenFileDialogOptions.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.OpenFileDialogOptions.html @@ -1,4 +1,4 @@ -OpenFileDialogOptions | @wailsio/runtime

    Interface OpenFileDialogOptions

    interface OpenFileDialogOptions {
        AllowsMultipleSelection: undefined | boolean;
        AllowsOtherFiletypes: undefined | boolean;
        ButtonText: undefined | string;
        CanChooseDirectories: undefined | boolean;
        CanChooseFiles: undefined | boolean;
        CanCreateDirectories: undefined | boolean;
        CanSelectHiddenExtension: undefined | boolean;
        Detached: undefined | boolean;
        Directory: undefined | string;
        Filters: undefined | FileFilter[];
        HideExtension: undefined | boolean;
        Message: undefined | string;
        ResolvesAliases: undefined | boolean;
        ShowHiddenFiles: undefined | boolean;
        Title: undefined | string;
        TreatsFilePackagesAsDirectories: undefined | boolean;
    }

    Properties

    AllowsMultipleSelection +OpenFileDialogOptions | @wailsio/runtime

    Interface OpenFileDialogOptions

    interface OpenFileDialogOptions {
        AllowsMultipleSelection: undefined | boolean;
        AllowsOtherFiletypes: undefined | boolean;
        ButtonText: undefined | string;
        CanChooseDirectories: undefined | boolean;
        CanChooseFiles: undefined | boolean;
        CanCreateDirectories: undefined | boolean;
        CanSelectHiddenExtension: undefined | boolean;
        Detached: undefined | boolean;
        Directory: undefined | string;
        Filters: undefined | FileFilter[];
        HideExtension: undefined | boolean;
        Message: undefined | string;
        ResolvesAliases: undefined | boolean;
        ShowHiddenFiles: undefined | boolean;
        Title: undefined | string;
        TreatsFilePackagesAsDirectories: undefined | boolean;
    }

    Properties

    AllowsMultipleSelection: undefined | boolean

    Indicates if multiple selection is allowed.

    -
    AllowsOtherFiletypes: undefined | boolean

    Indicates if other file types are allowed.

    -
    ButtonText: undefined | string

    Text to display on the button.

    -
    CanChooseDirectories: undefined | boolean

    Indicates if directories can be chosen.

    -
    CanChooseFiles: undefined | boolean

    Indicates if files can be chosen.

    -
    CanCreateDirectories: undefined | boolean

    Indicates if directories can be created.

    -
    CanSelectHiddenExtension: undefined | boolean

    Indicates if hidden extensions can be selected.

    -
    Detached: undefined | boolean

    Indicates if the dialog should appear detached from the main window.

    -
    Directory: undefined | string

    Directory to open in the dialog.

    -
    Filters: undefined | FileFilter[]

    Array of file filters.

    -
    HideExtension: undefined | boolean

    Indicates if the extension should be hidden.

    -
    Message: undefined | string

    Message to show in the dialog.

    -
    ResolvesAliases: undefined | boolean

    Indicates if aliases should be resolved.

    -
    ShowHiddenFiles: undefined | boolean

    Indicates if hidden files should be shown.

    -
    Title: undefined | string

    Title of the dialog.

    -
    TreatsFilePackagesAsDirectories: undefined | boolean

    Indicates if file packages should be treated as directories.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    AllowsOtherFiletypes: undefined | boolean

    Indicates if other file types are allowed.

    +
    ButtonText: undefined | string

    Text to display on the button.

    +
    CanChooseDirectories: undefined | boolean

    Indicates if directories can be chosen.

    +
    CanChooseFiles: undefined | boolean

    Indicates if files can be chosen.

    +
    CanCreateDirectories: undefined | boolean

    Indicates if directories can be created.

    +
    CanSelectHiddenExtension: undefined | boolean

    Indicates if hidden extensions can be selected.

    +
    Detached: undefined | boolean

    Indicates if the dialog should appear detached from the main window.

    +
    Directory: undefined | string

    Directory to open in the dialog.

    +
    Filters: undefined | FileFilter[]

    Array of file filters.

    +
    HideExtension: undefined | boolean

    Indicates if the extension should be hidden.

    +
    Message: undefined | string

    Message to show in the dialog.

    +
    ResolvesAliases: undefined | boolean

    Indicates if aliases should be resolved.

    +
    ShowHiddenFiles: undefined | boolean

    Indicates if hidden files should be shown.

    +
    Title: undefined | string

    Title of the dialog.

    +
    TreatsFilePackagesAsDirectories: undefined | boolean

    Indicates if file packages should be treated as directories.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.SaveFileDialogOptions.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.SaveFileDialogOptions.html index 1ea91cb9c..535122e51 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.SaveFileDialogOptions.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.SaveFileDialogOptions.html @@ -1,4 +1,4 @@ -SaveFileDialogOptions | @wailsio/runtime

    Interface SaveFileDialogOptions

    interface SaveFileDialogOptions {
        AllowsMultipleSelection: undefined | boolean;
        AllowsOtherFiletypes: undefined | boolean;
        ButtonText: undefined | string;
        CanChooseDirectories: undefined | boolean;
        CanChooseFiles: undefined | boolean;
        CanCreateDirectories: undefined | boolean;
        CanSelectHiddenExtension: undefined | boolean;
        Detached: undefined | boolean;
        Directory: undefined | string;
        Filename: undefined | string;
        Filters: undefined | FileFilter[];
        HideExtension: undefined | boolean;
        Message: undefined | string;
        ResolvesAliases: undefined | boolean;
        ShowHiddenFiles: undefined | boolean;
        Title: undefined | string;
        TreatsFilePackagesAsDirectories: undefined | boolean;
    }

    Properties

    AllowsMultipleSelection +SaveFileDialogOptions | @wailsio/runtime

    Interface SaveFileDialogOptions

    interface SaveFileDialogOptions {
        AllowsMultipleSelection: undefined | boolean;
        AllowsOtherFiletypes: undefined | boolean;
        ButtonText: undefined | string;
        CanChooseDirectories: undefined | boolean;
        CanChooseFiles: undefined | boolean;
        CanCreateDirectories: undefined | boolean;
        CanSelectHiddenExtension: undefined | boolean;
        Detached: undefined | boolean;
        Directory: undefined | string;
        Filename: undefined | string;
        Filters: undefined | FileFilter[];
        HideExtension: undefined | boolean;
        Message: undefined | string;
        ResolvesAliases: undefined | boolean;
        ShowHiddenFiles: undefined | boolean;
        Title: undefined | string;
        TreatsFilePackagesAsDirectories: undefined | boolean;
    }

    Properties

    AllowsMultipleSelection: undefined | boolean

    Indicates if multiple selection is allowed.

    -
    AllowsOtherFiletypes: undefined | boolean

    Indicates if other file types are allowed.

    -
    ButtonText: undefined | string

    Text to display on the button.

    -
    CanChooseDirectories: undefined | boolean

    Indicates if directories can be chosen.

    -
    CanChooseFiles: undefined | boolean

    Indicates if files can be chosen.

    -
    CanCreateDirectories: undefined | boolean

    Indicates if directories can be created.

    -
    CanSelectHiddenExtension: undefined | boolean

    Indicates if hidden extensions can be selected.

    -
    Detached: undefined | boolean

    Indicates if the dialog should appear detached from the main window.

    -
    Directory: undefined | string

    Directory to open in the dialog.

    -
    Filename: undefined | string

    Default filename to use in the dialog.

    -
    Filters: undefined | FileFilter[]

    Array of file filters.

    -
    HideExtension: undefined | boolean

    Indicates if the extension should be hidden.

    -
    Message: undefined | string

    Message to show in the dialog.

    -
    ResolvesAliases: undefined | boolean

    Indicates if aliases should be resolved.

    -
    ShowHiddenFiles: undefined | boolean

    Indicates if hidden files should be shown.

    -
    Title: undefined | string

    Title of the dialog.

    -
    TreatsFilePackagesAsDirectories: undefined | boolean

    Indicates if file packages should be treated as directories.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    AllowsOtherFiletypes: undefined | boolean

    Indicates if other file types are allowed.

    +
    ButtonText: undefined | string

    Text to display on the button.

    +
    CanChooseDirectories: undefined | boolean

    Indicates if directories can be chosen.

    +
    CanChooseFiles: undefined | boolean

    Indicates if files can be chosen.

    +
    CanCreateDirectories: undefined | boolean

    Indicates if directories can be created.

    +
    CanSelectHiddenExtension: undefined | boolean

    Indicates if hidden extensions can be selected.

    +
    Detached: undefined | boolean

    Indicates if the dialog should appear detached from the main window.

    +
    Directory: undefined | string

    Directory to open in the dialog.

    +
    Filename: undefined | string

    Default filename to use in the dialog.

    +
    Filters: undefined | FileFilter[]

    Array of file filters.

    +
    HideExtension: undefined | boolean

    Indicates if the extension should be hidden.

    +
    Message: undefined | string

    Message to show in the dialog.

    +
    ResolvesAliases: undefined | boolean

    Indicates if aliases should be resolved.

    +
    ShowHiddenFiles: undefined | boolean

    Indicates if hidden files should be shown.

    +
    Title: undefined | string

    Title of the dialog.

    +
    TreatsFilePackagesAsDirectories: undefined | boolean

    Indicates if file packages should be treated as directories.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Rect.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Rect.html index bf5980ee3..ef90dd394 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Rect.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Rect.html @@ -1,9 +1,9 @@ -Rect | @wailsio/runtime
    interface Rect {
        Height: number;
        Width: number;
        X: number;
        Y: number;
    }

    Properties

    Height +Rect | @wailsio/runtime
    interface Rect {
        Height: number;
        Width: number;
        X: number;
        Y: number;
    }

    Properties

    Properties

    Height: number

    The height of the rectangle.

    -
    Width: number

    The width of the rectangle.

    -
    X: number

    The X coordinate of the origin.

    -
    Y: number

    The Y coordinate of the origin.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    Width: number

    The width of the rectangle.

    +
    X: number

    The X coordinate of the origin.

    +
    Y: number

    The Y coordinate of the origin.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Screen.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Screen.html index b85d6fc1d..626cd2914 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Screen.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Screen.html @@ -1,4 +1,4 @@ -Screen | @wailsio/runtime
    interface Screen {
        Bounds: Rect;
        ID: string;
        IsPrimary: boolean;
        Name: string;
        PhysicalBounds: Rect;
        PhysicalWorkArea: Rect;
        Rotation: number;
        ScaleFactor: number;
        Size: Size;
        WorkArea: Rect;
        X: number;
        Y: number;
    }

    Properties

    Bounds +Screen | @wailsio/runtime
    interface Screen {
        Bounds: Rect;
        ID: string;
        IsPrimary: boolean;
        Name: string;
        PhysicalBounds: Rect;
        PhysicalWorkArea: Rect;
        Rotation: number;
        ScaleFactor: number;
        Size: Size;
        WorkArea: Rect;
        X: number;
        Y: number;
    }

    Properties

    Bounds ID IsPrimary Name @@ -11,15 +11,15 @@ X Y

    Properties

    Bounds: Rect

    Contains the bounds of the screen in terms of X, Y, Width, and Height.

    -
    ID: string

    Unique identifier for the screen.

    -
    IsPrimary: boolean

    True if this is the primary monitor selected by the user in the operating system.

    -
    Name: string

    Human readable name of the screen.

    -
    PhysicalBounds: Rect

    Contains the physical bounds of the screen in terms of X, Y, Width, and Height (before scaling).

    -
    PhysicalWorkArea: Rect

    Contains the physical WorkArea of the screen (before scaling).

    -
    Rotation: number

    The rotation of the screen.

    -
    ScaleFactor: number

    The scale factor of the screen (DPI/96). 1 = standard DPI, 2 = HiDPI (Retina), etc.

    -
    Size: Size

    Contains the width and height of the screen.

    -
    WorkArea: Rect

    Contains the area of the screen that is actually usable (excluding taskbar and other system UI).

    -
    X: number

    The X coordinate of the screen.

    -
    Y: number

    The Y coordinate of the screen.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    ID: string

    Unique identifier for the screen.

    +
    IsPrimary: boolean

    True if this is the primary monitor selected by the user in the operating system.

    +
    Name: string

    Human readable name of the screen.

    +
    PhysicalBounds: Rect

    Contains the physical bounds of the screen in terms of X, Y, Width, and Height (before scaling).

    +
    PhysicalWorkArea: Rect

    Contains the physical WorkArea of the screen (before scaling).

    +
    Rotation: number

    The rotation of the screen.

    +
    ScaleFactor: number

    The scale factor of the screen (DPI/96). 1 = standard DPI, 2 = HiDPI (Retina), etc.

    +
    Size: Size

    Contains the width and height of the screen.

    +
    WorkArea: Rect

    Contains the area of the screen that is actually usable (excluding taskbar and other system UI).

    +
    X: number

    The X coordinate of the screen.

    +
    Y: number

    The Y coordinate of the screen.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Size.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Size.html index 7a66eee62..06c8787b0 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Size.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Size.html @@ -1,5 +1,5 @@ -Size | @wailsio/runtime
    interface Size {
        Height: number;
        Width: number;
    }

    Properties

    Height +Size | @wailsio/runtime
    interface Size {
        Height: number;
        Width: number;
    }

    Properties

    Properties

    Height: number

    The height.

    -
    Width: number

    The width.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    Width: number

    The width.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.EnvironmentInfo.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.EnvironmentInfo.html index cc8c476a7..5f05fee9a 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.EnvironmentInfo.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.EnvironmentInfo.html @@ -1,11 +1,11 @@ -EnvironmentInfo | @wailsio/runtime

    Interface EnvironmentInfo

    interface EnvironmentInfo {
        Arch: string;
        Debug: boolean;
        OS: string;
        OSInfo: OSInfo;
        PlatformInfo: Object;
    }

    Properties

    Arch +EnvironmentInfo | @wailsio/runtime

    Interface EnvironmentInfo

    interface EnvironmentInfo {
        Arch: string;
        Debug: boolean;
        OS: string;
        OSInfo: OSInfo;
        PlatformInfo: Object;
    }

    Properties

    Arch: string

    The architecture of the system.

    -
    Debug: boolean

    True if the application is running in debug mode, otherwise false.

    -
    OS: string

    The operating system in use.

    -
    OSInfo: OSInfo

    Details of the operating system.

    -
    PlatformInfo: Object

    Additional platform information.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    Debug: boolean

    True if the application is running in debug mode, otherwise false.

    +
    OS: string

    The operating system in use.

    +
    OSInfo: OSInfo

    Details of the operating system.

    +
    PlatformInfo: Object

    Additional platform information.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.OSInfo.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.OSInfo.html index 7b8db2b02..dac847d9f 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.OSInfo.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.OSInfo.html @@ -1,9 +1,9 @@ -OSInfo | @wailsio/runtime
    interface OSInfo {
        Branding: string;
        ID: string;
        Name: string;
        Version: string;
    }

    Properties

    Branding +OSInfo | @wailsio/runtime
    interface OSInfo {
        Branding: string;
        ID: string;
        Name: string;
        Version: string;
    }

    Properties

    Properties

    Branding: string

    The branding of the OS.

    -
    ID: string

    The ID of the OS.

    -
    Name: string

    The name of the OS.

    -
    Version: string

    The version of the OS.

    -

    Generated using TypeDoc

    \ No newline at end of file +
    ID: string

    The ID of the OS.

    +
    Name: string

    The name of the OS.

    +
    Version: string

    The version of the OS.

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Application.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Application.html index 8d0c53d6e..774d89b63 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Application.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Application.html @@ -1,4 +1,4 @@ -Application | @wailsio/runtime

    Namespace Application

    Index

    Functions

    Hide +Application | @wailsio/runtime

    Namespace Application

    Index

    Functions

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Browser.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Browser.html index 2d0027aa2..0145e67d0 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Browser.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Browser.html @@ -1,2 +1,2 @@ -Browser | @wailsio/runtime

    Namespace Browser

    Index

    Functions

    OpenURL +Browser | @wailsio/runtime

    Namespace Browser

    Index

    Functions

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Call.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Call.html index f180a0aec..9ab08dc0d 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Call.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Call.html @@ -1,4 +1,4 @@ -Call | @wailsio/runtime

    Namespace Call

    Index

    Classes

    RuntimeError +Call | @wailsio/runtime

    Namespace Call

    Index

    Classes

    Interfaces

    Functions

    ByID ByName diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Clipboard.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Clipboard.html index 1c415c420..16f8524c6 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Clipboard.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Clipboard.html @@ -1,3 +1,3 @@ -Clipboard | @wailsio/runtime

    Namespace Clipboard

    Index

    Functions

    SetText +Clipboard | @wailsio/runtime

    Namespace Clipboard

    Index

    Functions

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Create.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Create.html index 96efeea65..b04a1718b 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Create.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Create.html @@ -1,4 +1,4 @@ -Create | @wailsio/runtime

    Namespace Create

    Index

    Functions

    Any +Create | @wailsio/runtime

    Namespace Create

    Index

    Functions

    Any Array ByteSlice Map diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Dialogs.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Dialogs.html index 72fbe9af9..738840302 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Dialogs.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Dialogs.html @@ -1,4 +1,4 @@ -Dialogs | @wailsio/runtime

    Namespace Dialogs

    Index

    Interfaces

    Button +Dialogs | @wailsio/runtime

    Namespace Dialogs

    Index

    Interfaces

    Button FileFilter MessageDialogOptions OpenFileDialogOptions diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Events.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Events.html index 5ed2507b9..664854f17 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Events.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Events.html @@ -1,4 +1,4 @@ -Events | @wailsio/runtime

    Namespace Events

    Index

    Classes

    WailsEvent +Events | @wailsio/runtime

    Namespace Events

    Index

    Classes

    Variables

    Functions

    Emit Off diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Flags.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Flags.html index 05f25a026..a4421fba6 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Flags.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Flags.html @@ -1,2 +1,2 @@ -Flags | @wailsio/runtime

    Namespace Flags

    Index

    Functions

    GetFlag +Flags | @wailsio/runtime

    Namespace Flags

    Index

    Functions

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Screens.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Screens.html index 4dfa14f27..f38ad0a9c 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Screens.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Screens.html @@ -1,4 +1,4 @@ -Screens | @wailsio/runtime

    Namespace Screens

    Index

    Interfaces

    Rect +Screens | @wailsio/runtime

    Namespace Screens

    Index

    Interfaces

    Functions

    GetAll diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/System.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/System.html index cd08729b2..e76d409db 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/System.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/System.html @@ -1,4 +1,4 @@ -System | @wailsio/runtime

    Namespace System

    Index

    Interfaces

    EnvironmentInfo +System | @wailsio/runtime

    Namespace System

    Index

    Interfaces

    Functions

    Capabilities Environment diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/WML.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/WML.html index f4fa9b9a1..48865bdfb 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/WML.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/WML.html @@ -1,3 +1,3 @@ -WML | @wailsio/runtime

    Namespace WML

    Index

    Functions

    Enable +WML | @wailsio/runtime

    Namespace WML

    Index

    Functions

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Events.Types.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Events.Types.html index c4c73cf87..b16f0175f 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Events.Types.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Events.Types.html @@ -1 +1 @@ -Types | @wailsio/runtime

    Variable TypesConst

    Types: {
        Common: {
            ApplicationOpenedWithFile: string;
            ApplicationStarted: string;
            ThemeChanged: string;
            WindowClosing: string;
            WindowDPIChanged: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowFilesDropped: string;
            WindowFocus: string;
            WindowFullscreen: string;
            WindowHide: string;
            WindowLostFocus: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowRestore: string;
            WindowRuntimeReady: string;
            WindowShow: string;
            WindowUnFullscreen: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowZoom: string;
            WindowZoomIn: string;
            WindowZoomOut: string;
            WindowZoomReset: string;
        };
        Linux: {
            ApplicationStartup: string;
            SystemThemeChanged: string;
            WindowDeleteEvent: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowFocusIn: string;
            WindowFocusOut: string;
            WindowLoadChanged: string;
        };
        Mac: {
            ApplicationDidBecomeActive: string;
            ApplicationDidChangeBackingProperties: string;
            ApplicationDidChangeEffectiveAppearance: string;
            ApplicationDidChangeIcon: string;
            ApplicationDidChangeOcclusionState: string;
            ApplicationDidChangeScreenParameters: string;
            ApplicationDidChangeStatusBarFrame: string;
            ApplicationDidChangeStatusBarOrientation: string;
            ApplicationDidChangeTheme: string;
            ApplicationDidFinishLaunching: string;
            ApplicationDidHide: string;
            ApplicationDidResignActive: string;
            ApplicationDidUnhide: string;
            ApplicationDidUpdate: string;
            ApplicationShouldHandleReopen: string;
            ApplicationWillBecomeActive: string;
            ApplicationWillFinishLaunching: string;
            ApplicationWillHide: string;
            ApplicationWillResignActive: string;
            ApplicationWillTerminate: string;
            ApplicationWillUnhide: string;
            ApplicationWillUpdate: string;
            MenuDidAddItem: string;
            MenuDidBeginTracking: string;
            MenuDidClose: string;
            MenuDidDisplayItem: string;
            MenuDidEndTracking: string;
            MenuDidHighlightItem: string;
            MenuDidOpen: string;
            MenuDidPopUp: string;
            MenuDidRemoveItem: string;
            MenuDidSendAction: string;
            MenuDidSendActionToItem: string;
            MenuDidUpdate: string;
            MenuWillAddItem: string;
            MenuWillBeginTracking: string;
            MenuWillDisplayItem: string;
            MenuWillEndTracking: string;
            MenuWillHighlightItem: string;
            MenuWillOpen: string;
            MenuWillPopUp: string;
            MenuWillRemoveItem: string;
            MenuWillSendAction: string;
            MenuWillSendActionToItem: string;
            MenuWillUpdate: string;
            WebViewDidCommitNavigation: string;
            WebViewDidFinishNavigation: string;
            WebViewDidReceiveServerRedirectForProvisionalNavigation: string;
            WebViewDidStartProvisionalNavigation: string;
            WindowDidBecomeKey: string;
            WindowDidBecomeMain: string;
            WindowDidBeginSheet: string;
            WindowDidChangeAlpha: string;
            WindowDidChangeBackingLocation: string;
            WindowDidChangeBackingProperties: string;
            WindowDidChangeCollectionBehavior: string;
            WindowDidChangeEffectiveAppearance: string;
            WindowDidChangeOcclusionState: string;
            WindowDidChangeOrderingMode: string;
            WindowDidChangeScreen: string;
            WindowDidChangeScreenParameters: string;
            WindowDidChangeScreenProfile: string;
            WindowDidChangeScreenSpace: string;
            WindowDidChangeScreenSpaceProperties: string;
            WindowDidChangeSharingType: string;
            WindowDidChangeSpace: string;
            WindowDidChangeSpaceOrderingMode: string;
            WindowDidChangeTitle: string;
            WindowDidChangeToolbar: string;
            WindowDidDeminiaturize: string;
            WindowDidEndSheet: string;
            WindowDidEnterFullScreen: string;
            WindowDidEnterVersionBrowser: string;
            WindowDidExitFullScreen: string;
            WindowDidExitVersionBrowser: string;
            WindowDidExpose: string;
            WindowDidFocus: string;
            WindowDidMiniaturize: string;
            WindowDidMove: string;
            WindowDidOrderOffScreen: string;
            WindowDidOrderOnScreen: string;
            WindowDidResignKey: string;
            WindowDidResignMain: string;
            WindowDidResize: string;
            WindowDidUpdate: string;
            WindowDidUpdateAlpha: string;
            WindowDidUpdateCollectionBehavior: string;
            WindowDidUpdateCollectionProperties: string;
            WindowDidUpdateShadow: string;
            WindowDidUpdateTitle: string;
            WindowDidUpdateToolbar: string;
            WindowDidZoom: string;
            WindowFileDraggingEntered: string;
            WindowFileDraggingExited: string;
            WindowFileDraggingPerformed: string;
            WindowHide: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowShouldClose: string;
            WindowShow: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowWillBecomeKey: string;
            WindowWillBecomeMain: string;
            WindowWillBeginSheet: string;
            WindowWillChangeOrderingMode: string;
            WindowWillClose: string;
            WindowWillDeminiaturize: string;
            WindowWillEnterFullScreen: string;
            WindowWillEnterVersionBrowser: string;
            WindowWillExitFullScreen: string;
            WindowWillExitVersionBrowser: string;
            WindowWillFocus: string;
            WindowWillMiniaturize: string;
            WindowWillMove: string;
            WindowWillOrderOffScreen: string;
            WindowWillOrderOnScreen: string;
            WindowWillResignMain: string;
            WindowWillResize: string;
            WindowWillUnfocus: string;
            WindowWillUpdate: string;
            WindowWillUpdateAlpha: string;
            WindowWillUpdateCollectionBehavior: string;
            WindowWillUpdateCollectionProperties: string;
            WindowWillUpdateShadow: string;
            WindowWillUpdateTitle: string;
            WindowWillUpdateToolbar: string;
            WindowWillUpdateVisibility: string;
            WindowWillUseStandardFrame: string;
            WindowZoomIn: string;
            WindowZoomOut: string;
            WindowZoomReset: string;
        };
        Windows: {
            APMPowerSettingChange: string;
            APMPowerStatusChange: string;
            APMResumeAutomatic: string;
            APMResumeSuspend: string;
            APMSuspend: string;
            ApplicationStarted: string;
            SystemThemeChanged: string;
            WebViewNavigationCompleted: string;
            WindowActive: string;
            WindowBackgroundErase: string;
            WindowClickActive: string;
            WindowClosing: string;
            WindowDPIChanged: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowDragDrop: string;
            WindowDragEnter: string;
            WindowDragLeave: string;
            WindowDragOver: string;
            WindowEndMove: string;
            WindowEndResize: string;
            WindowFullscreen: string;
            WindowHide: string;
            WindowInactive: string;
            WindowKeyDown: string;
            WindowKeyUp: string;
            WindowKillFocus: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowNonClientHit: string;
            WindowNonClientMouseDown: string;
            WindowNonClientMouseLeave: string;
            WindowNonClientMouseMove: string;
            WindowNonClientMouseUp: string;
            WindowPaint: string;
            WindowRestore: string;
            WindowSetFocus: string;
            WindowShow: string;
            WindowStartMove: string;
            WindowStartResize: string;
            WindowUnFullscreen: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowZOrderChanged: string;
        };
    } = EventTypes

    Type declaration

    • Common: {
          ApplicationOpenedWithFile: string;
          ApplicationStarted: string;
          ThemeChanged: string;
          WindowClosing: string;
          WindowDPIChanged: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowFilesDropped: string;
          WindowFocus: string;
          WindowFullscreen: string;
          WindowHide: string;
          WindowLostFocus: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowRestore: string;
          WindowRuntimeReady: string;
          WindowShow: string;
          WindowUnFullscreen: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowZoom: string;
          WindowZoomIn: string;
          WindowZoomOut: string;
          WindowZoomReset: string;
      }
      • ApplicationOpenedWithFile: string
      • ApplicationStarted: string
      • ThemeChanged: string
      • WindowClosing: string
      • WindowDPIChanged: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowFilesDropped: string
      • WindowFocus: string
      • WindowFullscreen: string
      • WindowHide: string
      • WindowLostFocus: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowRestore: string
      • WindowRuntimeReady: string
      • WindowShow: string
      • WindowUnFullscreen: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowZoom: string
      • WindowZoomIn: string
      • WindowZoomOut: string
      • WindowZoomReset: string
    • Linux: {
          ApplicationStartup: string;
          SystemThemeChanged: string;
          WindowDeleteEvent: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowFocusIn: string;
          WindowFocusOut: string;
          WindowLoadChanged: string;
      }
      • ApplicationStartup: string
      • SystemThemeChanged: string
      • WindowDeleteEvent: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowFocusIn: string
      • WindowFocusOut: string
      • WindowLoadChanged: string
    • Mac: {
          ApplicationDidBecomeActive: string;
          ApplicationDidChangeBackingProperties: string;
          ApplicationDidChangeEffectiveAppearance: string;
          ApplicationDidChangeIcon: string;
          ApplicationDidChangeOcclusionState: string;
          ApplicationDidChangeScreenParameters: string;
          ApplicationDidChangeStatusBarFrame: string;
          ApplicationDidChangeStatusBarOrientation: string;
          ApplicationDidChangeTheme: string;
          ApplicationDidFinishLaunching: string;
          ApplicationDidHide: string;
          ApplicationDidResignActive: string;
          ApplicationDidUnhide: string;
          ApplicationDidUpdate: string;
          ApplicationShouldHandleReopen: string;
          ApplicationWillBecomeActive: string;
          ApplicationWillFinishLaunching: string;
          ApplicationWillHide: string;
          ApplicationWillResignActive: string;
          ApplicationWillTerminate: string;
          ApplicationWillUnhide: string;
          ApplicationWillUpdate: string;
          MenuDidAddItem: string;
          MenuDidBeginTracking: string;
          MenuDidClose: string;
          MenuDidDisplayItem: string;
          MenuDidEndTracking: string;
          MenuDidHighlightItem: string;
          MenuDidOpen: string;
          MenuDidPopUp: string;
          MenuDidRemoveItem: string;
          MenuDidSendAction: string;
          MenuDidSendActionToItem: string;
          MenuDidUpdate: string;
          MenuWillAddItem: string;
          MenuWillBeginTracking: string;
          MenuWillDisplayItem: string;
          MenuWillEndTracking: string;
          MenuWillHighlightItem: string;
          MenuWillOpen: string;
          MenuWillPopUp: string;
          MenuWillRemoveItem: string;
          MenuWillSendAction: string;
          MenuWillSendActionToItem: string;
          MenuWillUpdate: string;
          WebViewDidCommitNavigation: string;
          WebViewDidFinishNavigation: string;
          WebViewDidReceiveServerRedirectForProvisionalNavigation: string;
          WebViewDidStartProvisionalNavigation: string;
          WindowDidBecomeKey: string;
          WindowDidBecomeMain: string;
          WindowDidBeginSheet: string;
          WindowDidChangeAlpha: string;
          WindowDidChangeBackingLocation: string;
          WindowDidChangeBackingProperties: string;
          WindowDidChangeCollectionBehavior: string;
          WindowDidChangeEffectiveAppearance: string;
          WindowDidChangeOcclusionState: string;
          WindowDidChangeOrderingMode: string;
          WindowDidChangeScreen: string;
          WindowDidChangeScreenParameters: string;
          WindowDidChangeScreenProfile: string;
          WindowDidChangeScreenSpace: string;
          WindowDidChangeScreenSpaceProperties: string;
          WindowDidChangeSharingType: string;
          WindowDidChangeSpace: string;
          WindowDidChangeSpaceOrderingMode: string;
          WindowDidChangeTitle: string;
          WindowDidChangeToolbar: string;
          WindowDidDeminiaturize: string;
          WindowDidEndSheet: string;
          WindowDidEnterFullScreen: string;
          WindowDidEnterVersionBrowser: string;
          WindowDidExitFullScreen: string;
          WindowDidExitVersionBrowser: string;
          WindowDidExpose: string;
          WindowDidFocus: string;
          WindowDidMiniaturize: string;
          WindowDidMove: string;
          WindowDidOrderOffScreen: string;
          WindowDidOrderOnScreen: string;
          WindowDidResignKey: string;
          WindowDidResignMain: string;
          WindowDidResize: string;
          WindowDidUpdate: string;
          WindowDidUpdateAlpha: string;
          WindowDidUpdateCollectionBehavior: string;
          WindowDidUpdateCollectionProperties: string;
          WindowDidUpdateShadow: string;
          WindowDidUpdateTitle: string;
          WindowDidUpdateToolbar: string;
          WindowDidZoom: string;
          WindowFileDraggingEntered: string;
          WindowFileDraggingExited: string;
          WindowFileDraggingPerformed: string;
          WindowHide: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowShouldClose: string;
          WindowShow: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowWillBecomeKey: string;
          WindowWillBecomeMain: string;
          WindowWillBeginSheet: string;
          WindowWillChangeOrderingMode: string;
          WindowWillClose: string;
          WindowWillDeminiaturize: string;
          WindowWillEnterFullScreen: string;
          WindowWillEnterVersionBrowser: string;
          WindowWillExitFullScreen: string;
          WindowWillExitVersionBrowser: string;
          WindowWillFocus: string;
          WindowWillMiniaturize: string;
          WindowWillMove: string;
          WindowWillOrderOffScreen: string;
          WindowWillOrderOnScreen: string;
          WindowWillResignMain: string;
          WindowWillResize: string;
          WindowWillUnfocus: string;
          WindowWillUpdate: string;
          WindowWillUpdateAlpha: string;
          WindowWillUpdateCollectionBehavior: string;
          WindowWillUpdateCollectionProperties: string;
          WindowWillUpdateShadow: string;
          WindowWillUpdateTitle: string;
          WindowWillUpdateToolbar: string;
          WindowWillUpdateVisibility: string;
          WindowWillUseStandardFrame: string;
          WindowZoomIn: string;
          WindowZoomOut: string;
          WindowZoomReset: string;
      }
      • ApplicationDidBecomeActive: string
      • ApplicationDidChangeBackingProperties: string
      • ApplicationDidChangeEffectiveAppearance: string
      • ApplicationDidChangeIcon: string
      • ApplicationDidChangeOcclusionState: string
      • ApplicationDidChangeScreenParameters: string
      • ApplicationDidChangeStatusBarFrame: string
      • ApplicationDidChangeStatusBarOrientation: string
      • ApplicationDidChangeTheme: string
      • ApplicationDidFinishLaunching: string
      • ApplicationDidHide: string
      • ApplicationDidResignActive: string
      • ApplicationDidUnhide: string
      • ApplicationDidUpdate: string
      • ApplicationShouldHandleReopen: string
      • ApplicationWillBecomeActive: string
      • ApplicationWillFinishLaunching: string
      • ApplicationWillHide: string
      • ApplicationWillResignActive: string
      • ApplicationWillTerminate: string
      • ApplicationWillUnhide: string
      • ApplicationWillUpdate: string
      • MenuDidAddItem: string
      • MenuDidBeginTracking: string
      • MenuDidClose: string
      • MenuDidDisplayItem: string
      • MenuDidEndTracking: string
      • MenuDidHighlightItem: string
      • MenuDidOpen: string
      • MenuDidPopUp: string
      • MenuDidRemoveItem: string
      • MenuDidSendAction: string
      • MenuDidSendActionToItem: string
      • MenuDidUpdate: string
      • MenuWillAddItem: string
      • MenuWillBeginTracking: string
      • MenuWillDisplayItem: string
      • MenuWillEndTracking: string
      • MenuWillHighlightItem: string
      • MenuWillOpen: string
      • MenuWillPopUp: string
      • MenuWillRemoveItem: string
      • MenuWillSendAction: string
      • MenuWillSendActionToItem: string
      • MenuWillUpdate: string
      • WebViewDidCommitNavigation: string
      • WebViewDidFinishNavigation: string
      • WebViewDidReceiveServerRedirectForProvisionalNavigation: string
      • WebViewDidStartProvisionalNavigation: string
      • WindowDidBecomeKey: string
      • WindowDidBecomeMain: string
      • WindowDidBeginSheet: string
      • WindowDidChangeAlpha: string
      • WindowDidChangeBackingLocation: string
      • WindowDidChangeBackingProperties: string
      • WindowDidChangeCollectionBehavior: string
      • WindowDidChangeEffectiveAppearance: string
      • WindowDidChangeOcclusionState: string
      • WindowDidChangeOrderingMode: string
      • WindowDidChangeScreen: string
      • WindowDidChangeScreenParameters: string
      • WindowDidChangeScreenProfile: string
      • WindowDidChangeScreenSpace: string
      • WindowDidChangeScreenSpaceProperties: string
      • WindowDidChangeSharingType: string
      • WindowDidChangeSpace: string
      • WindowDidChangeSpaceOrderingMode: string
      • WindowDidChangeTitle: string
      • WindowDidChangeToolbar: string
      • WindowDidDeminiaturize: string
      • WindowDidEndSheet: string
      • WindowDidEnterFullScreen: string
      • WindowDidEnterVersionBrowser: string
      • WindowDidExitFullScreen: string
      • WindowDidExitVersionBrowser: string
      • WindowDidExpose: string
      • WindowDidFocus: string
      • WindowDidMiniaturize: string
      • WindowDidMove: string
      • WindowDidOrderOffScreen: string
      • WindowDidOrderOnScreen: string
      • WindowDidResignKey: string
      • WindowDidResignMain: string
      • WindowDidResize: string
      • WindowDidUpdate: string
      • WindowDidUpdateAlpha: string
      • WindowDidUpdateCollectionBehavior: string
      • WindowDidUpdateCollectionProperties: string
      • WindowDidUpdateShadow: string
      • WindowDidUpdateTitle: string
      • WindowDidUpdateToolbar: string
      • WindowDidZoom: string
      • WindowFileDraggingEntered: string
      • WindowFileDraggingExited: string
      • WindowFileDraggingPerformed: string
      • WindowHide: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowShouldClose: string
      • WindowShow: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowWillBecomeKey: string
      • WindowWillBecomeMain: string
      • WindowWillBeginSheet: string
      • WindowWillChangeOrderingMode: string
      • WindowWillClose: string
      • WindowWillDeminiaturize: string
      • WindowWillEnterFullScreen: string
      • WindowWillEnterVersionBrowser: string
      • WindowWillExitFullScreen: string
      • WindowWillExitVersionBrowser: string
      • WindowWillFocus: string
      • WindowWillMiniaturize: string
      • WindowWillMove: string
      • WindowWillOrderOffScreen: string
      • WindowWillOrderOnScreen: string
      • WindowWillResignMain: string
      • WindowWillResize: string
      • WindowWillUnfocus: string
      • WindowWillUpdate: string
      • WindowWillUpdateAlpha: string
      • WindowWillUpdateCollectionBehavior: string
      • WindowWillUpdateCollectionProperties: string
      • WindowWillUpdateShadow: string
      • WindowWillUpdateTitle: string
      • WindowWillUpdateToolbar: string
      • WindowWillUpdateVisibility: string
      • WindowWillUseStandardFrame: string
      • WindowZoomIn: string
      • WindowZoomOut: string
      • WindowZoomReset: string
    • Windows: {
          APMPowerSettingChange: string;
          APMPowerStatusChange: string;
          APMResumeAutomatic: string;
          APMResumeSuspend: string;
          APMSuspend: string;
          ApplicationStarted: string;
          SystemThemeChanged: string;
          WebViewNavigationCompleted: string;
          WindowActive: string;
          WindowBackgroundErase: string;
          WindowClickActive: string;
          WindowClosing: string;
          WindowDPIChanged: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowDragDrop: string;
          WindowDragEnter: string;
          WindowDragLeave: string;
          WindowDragOver: string;
          WindowEndMove: string;
          WindowEndResize: string;
          WindowFullscreen: string;
          WindowHide: string;
          WindowInactive: string;
          WindowKeyDown: string;
          WindowKeyUp: string;
          WindowKillFocus: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowNonClientHit: string;
          WindowNonClientMouseDown: string;
          WindowNonClientMouseLeave: string;
          WindowNonClientMouseMove: string;
          WindowNonClientMouseUp: string;
          WindowPaint: string;
          WindowRestore: string;
          WindowSetFocus: string;
          WindowShow: string;
          WindowStartMove: string;
          WindowStartResize: string;
          WindowUnFullscreen: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowZOrderChanged: string;
      }
      • APMPowerSettingChange: string
      • APMPowerStatusChange: string
      • APMResumeAutomatic: string
      • APMResumeSuspend: string
      • APMSuspend: string
      • ApplicationStarted: string
      • SystemThemeChanged: string
      • WebViewNavigationCompleted: string
      • WindowActive: string
      • WindowBackgroundErase: string
      • WindowClickActive: string
      • WindowClosing: string
      • WindowDPIChanged: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowDragDrop: string
      • WindowDragEnter: string
      • WindowDragLeave: string
      • WindowDragOver: string
      • WindowEndMove: string
      • WindowEndResize: string
      • WindowFullscreen: string
      • WindowHide: string
      • WindowInactive: string
      • WindowKeyDown: string
      • WindowKeyUp: string
      • WindowKillFocus: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowNonClientHit: string
      • WindowNonClientMouseDown: string
      • WindowNonClientMouseLeave: string
      • WindowNonClientMouseMove: string
      • WindowNonClientMouseUp: string
      • WindowPaint: string
      • WindowRestore: string
      • WindowSetFocus: string
      • WindowShow: string
      • WindowStartMove: string
      • WindowStartResize: string
      • WindowUnFullscreen: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowZOrderChanged: string

    Generated using TypeDoc

    \ No newline at end of file +Types | @wailsio/runtime

    Variable TypesConst

    Types: {
        Common: {
            ApplicationOpenedWithFile: string;
            ApplicationStarted: string;
            ThemeChanged: string;
            WindowClosing: string;
            WindowDPIChanged: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowFilesDropped: string;
            WindowFocus: string;
            WindowFullscreen: string;
            WindowHide: string;
            WindowLostFocus: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowRestore: string;
            WindowRuntimeReady: string;
            WindowShow: string;
            WindowUnFullscreen: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowZoom: string;
            WindowZoomIn: string;
            WindowZoomOut: string;
            WindowZoomReset: string;
        };
        Linux: {
            ApplicationStartup: string;
            SystemThemeChanged: string;
            WindowDeleteEvent: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowFocusIn: string;
            WindowFocusOut: string;
            WindowLoadChanged: string;
        };
        Mac: {
            ApplicationDidBecomeActive: string;
            ApplicationDidChangeBackingProperties: string;
            ApplicationDidChangeEffectiveAppearance: string;
            ApplicationDidChangeIcon: string;
            ApplicationDidChangeOcclusionState: string;
            ApplicationDidChangeScreenParameters: string;
            ApplicationDidChangeStatusBarFrame: string;
            ApplicationDidChangeStatusBarOrientation: string;
            ApplicationDidChangeTheme: string;
            ApplicationDidFinishLaunching: string;
            ApplicationDidHide: string;
            ApplicationDidResignActive: string;
            ApplicationDidUnhide: string;
            ApplicationDidUpdate: string;
            ApplicationShouldHandleReopen: string;
            ApplicationWillBecomeActive: string;
            ApplicationWillFinishLaunching: string;
            ApplicationWillHide: string;
            ApplicationWillResignActive: string;
            ApplicationWillTerminate: string;
            ApplicationWillUnhide: string;
            ApplicationWillUpdate: string;
            MenuDidAddItem: string;
            MenuDidBeginTracking: string;
            MenuDidClose: string;
            MenuDidDisplayItem: string;
            MenuDidEndTracking: string;
            MenuDidHighlightItem: string;
            MenuDidOpen: string;
            MenuDidPopUp: string;
            MenuDidRemoveItem: string;
            MenuDidSendAction: string;
            MenuDidSendActionToItem: string;
            MenuDidUpdate: string;
            MenuWillAddItem: string;
            MenuWillBeginTracking: string;
            MenuWillDisplayItem: string;
            MenuWillEndTracking: string;
            MenuWillHighlightItem: string;
            MenuWillOpen: string;
            MenuWillPopUp: string;
            MenuWillRemoveItem: string;
            MenuWillSendAction: string;
            MenuWillSendActionToItem: string;
            MenuWillUpdate: string;
            WebViewDidCommitNavigation: string;
            WebViewDidFinishNavigation: string;
            WebViewDidReceiveServerRedirectForProvisionalNavigation: string;
            WebViewDidStartProvisionalNavigation: string;
            WindowDidBecomeKey: string;
            WindowDidBecomeMain: string;
            WindowDidBeginSheet: string;
            WindowDidChangeAlpha: string;
            WindowDidChangeBackingLocation: string;
            WindowDidChangeBackingProperties: string;
            WindowDidChangeCollectionBehavior: string;
            WindowDidChangeEffectiveAppearance: string;
            WindowDidChangeOcclusionState: string;
            WindowDidChangeOrderingMode: string;
            WindowDidChangeScreen: string;
            WindowDidChangeScreenParameters: string;
            WindowDidChangeScreenProfile: string;
            WindowDidChangeScreenSpace: string;
            WindowDidChangeScreenSpaceProperties: string;
            WindowDidChangeSharingType: string;
            WindowDidChangeSpace: string;
            WindowDidChangeSpaceOrderingMode: string;
            WindowDidChangeTitle: string;
            WindowDidChangeToolbar: string;
            WindowDidDeminiaturize: string;
            WindowDidEndSheet: string;
            WindowDidEnterFullScreen: string;
            WindowDidEnterVersionBrowser: string;
            WindowDidExitFullScreen: string;
            WindowDidExitVersionBrowser: string;
            WindowDidExpose: string;
            WindowDidFocus: string;
            WindowDidMiniaturize: string;
            WindowDidMove: string;
            WindowDidOrderOffScreen: string;
            WindowDidOrderOnScreen: string;
            WindowDidResignKey: string;
            WindowDidResignMain: string;
            WindowDidResize: string;
            WindowDidUpdate: string;
            WindowDidUpdateAlpha: string;
            WindowDidUpdateCollectionBehavior: string;
            WindowDidUpdateCollectionProperties: string;
            WindowDidUpdateShadow: string;
            WindowDidUpdateTitle: string;
            WindowDidUpdateToolbar: string;
            WindowDidZoom: string;
            WindowFileDraggingEntered: string;
            WindowFileDraggingExited: string;
            WindowFileDraggingPerformed: string;
            WindowHide: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowShouldClose: string;
            WindowShow: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowWillBecomeKey: string;
            WindowWillBecomeMain: string;
            WindowWillBeginSheet: string;
            WindowWillChangeOrderingMode: string;
            WindowWillClose: string;
            WindowWillDeminiaturize: string;
            WindowWillEnterFullScreen: string;
            WindowWillEnterVersionBrowser: string;
            WindowWillExitFullScreen: string;
            WindowWillExitVersionBrowser: string;
            WindowWillFocus: string;
            WindowWillMiniaturize: string;
            WindowWillMove: string;
            WindowWillOrderOffScreen: string;
            WindowWillOrderOnScreen: string;
            WindowWillResignMain: string;
            WindowWillResize: string;
            WindowWillUnfocus: string;
            WindowWillUpdate: string;
            WindowWillUpdateAlpha: string;
            WindowWillUpdateCollectionBehavior: string;
            WindowWillUpdateCollectionProperties: string;
            WindowWillUpdateShadow: string;
            WindowWillUpdateTitle: string;
            WindowWillUpdateToolbar: string;
            WindowWillUpdateVisibility: string;
            WindowWillUseStandardFrame: string;
            WindowZoomIn: string;
            WindowZoomOut: string;
            WindowZoomReset: string;
        };
        Windows: {
            APMPowerSettingChange: string;
            APMPowerStatusChange: string;
            APMResumeAutomatic: string;
            APMResumeSuspend: string;
            APMSuspend: string;
            ApplicationStarted: string;
            SystemThemeChanged: string;
            WebViewNavigationCompleted: string;
            WindowActive: string;
            WindowBackgroundErase: string;
            WindowClickActive: string;
            WindowClosing: string;
            WindowDPIChanged: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowDragDrop: string;
            WindowDragEnter: string;
            WindowDragLeave: string;
            WindowDragOver: string;
            WindowEndMove: string;
            WindowEndResize: string;
            WindowFullscreen: string;
            WindowHide: string;
            WindowInactive: string;
            WindowKeyDown: string;
            WindowKeyUp: string;
            WindowKillFocus: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowNonClientHit: string;
            WindowNonClientMouseDown: string;
            WindowNonClientMouseLeave: string;
            WindowNonClientMouseMove: string;
            WindowNonClientMouseUp: string;
            WindowPaint: string;
            WindowRestore: string;
            WindowSetFocus: string;
            WindowShow: string;
            WindowStartMove: string;
            WindowStartResize: string;
            WindowUnFullscreen: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowZOrderChanged: string;
        };
    } = EventTypes

    Type declaration

    • Common: {
          ApplicationOpenedWithFile: string;
          ApplicationStarted: string;
          ThemeChanged: string;
          WindowClosing: string;
          WindowDPIChanged: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowFilesDropped: string;
          WindowFocus: string;
          WindowFullscreen: string;
          WindowHide: string;
          WindowLostFocus: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowRestore: string;
          WindowRuntimeReady: string;
          WindowShow: string;
          WindowUnFullscreen: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowZoom: string;
          WindowZoomIn: string;
          WindowZoomOut: string;
          WindowZoomReset: string;
      }
      • ApplicationOpenedWithFile: string
      • ApplicationStarted: string
      • ThemeChanged: string
      • WindowClosing: string
      • WindowDPIChanged: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowFilesDropped: string
      • WindowFocus: string
      • WindowFullscreen: string
      • WindowHide: string
      • WindowLostFocus: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowRestore: string
      • WindowRuntimeReady: string
      • WindowShow: string
      • WindowUnFullscreen: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowZoom: string
      • WindowZoomIn: string
      • WindowZoomOut: string
      • WindowZoomReset: string
    • Linux: {
          ApplicationStartup: string;
          SystemThemeChanged: string;
          WindowDeleteEvent: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowFocusIn: string;
          WindowFocusOut: string;
          WindowLoadChanged: string;
      }
      • ApplicationStartup: string
      • SystemThemeChanged: string
      • WindowDeleteEvent: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowFocusIn: string
      • WindowFocusOut: string
      • WindowLoadChanged: string
    • Mac: {
          ApplicationDidBecomeActive: string;
          ApplicationDidChangeBackingProperties: string;
          ApplicationDidChangeEffectiveAppearance: string;
          ApplicationDidChangeIcon: string;
          ApplicationDidChangeOcclusionState: string;
          ApplicationDidChangeScreenParameters: string;
          ApplicationDidChangeStatusBarFrame: string;
          ApplicationDidChangeStatusBarOrientation: string;
          ApplicationDidChangeTheme: string;
          ApplicationDidFinishLaunching: string;
          ApplicationDidHide: string;
          ApplicationDidResignActive: string;
          ApplicationDidUnhide: string;
          ApplicationDidUpdate: string;
          ApplicationShouldHandleReopen: string;
          ApplicationWillBecomeActive: string;
          ApplicationWillFinishLaunching: string;
          ApplicationWillHide: string;
          ApplicationWillResignActive: string;
          ApplicationWillTerminate: string;
          ApplicationWillUnhide: string;
          ApplicationWillUpdate: string;
          MenuDidAddItem: string;
          MenuDidBeginTracking: string;
          MenuDidClose: string;
          MenuDidDisplayItem: string;
          MenuDidEndTracking: string;
          MenuDidHighlightItem: string;
          MenuDidOpen: string;
          MenuDidPopUp: string;
          MenuDidRemoveItem: string;
          MenuDidSendAction: string;
          MenuDidSendActionToItem: string;
          MenuDidUpdate: string;
          MenuWillAddItem: string;
          MenuWillBeginTracking: string;
          MenuWillDisplayItem: string;
          MenuWillEndTracking: string;
          MenuWillHighlightItem: string;
          MenuWillOpen: string;
          MenuWillPopUp: string;
          MenuWillRemoveItem: string;
          MenuWillSendAction: string;
          MenuWillSendActionToItem: string;
          MenuWillUpdate: string;
          WebViewDidCommitNavigation: string;
          WebViewDidFinishNavigation: string;
          WebViewDidReceiveServerRedirectForProvisionalNavigation: string;
          WebViewDidStartProvisionalNavigation: string;
          WindowDidBecomeKey: string;
          WindowDidBecomeMain: string;
          WindowDidBeginSheet: string;
          WindowDidChangeAlpha: string;
          WindowDidChangeBackingLocation: string;
          WindowDidChangeBackingProperties: string;
          WindowDidChangeCollectionBehavior: string;
          WindowDidChangeEffectiveAppearance: string;
          WindowDidChangeOcclusionState: string;
          WindowDidChangeOrderingMode: string;
          WindowDidChangeScreen: string;
          WindowDidChangeScreenParameters: string;
          WindowDidChangeScreenProfile: string;
          WindowDidChangeScreenSpace: string;
          WindowDidChangeScreenSpaceProperties: string;
          WindowDidChangeSharingType: string;
          WindowDidChangeSpace: string;
          WindowDidChangeSpaceOrderingMode: string;
          WindowDidChangeTitle: string;
          WindowDidChangeToolbar: string;
          WindowDidDeminiaturize: string;
          WindowDidEndSheet: string;
          WindowDidEnterFullScreen: string;
          WindowDidEnterVersionBrowser: string;
          WindowDidExitFullScreen: string;
          WindowDidExitVersionBrowser: string;
          WindowDidExpose: string;
          WindowDidFocus: string;
          WindowDidMiniaturize: string;
          WindowDidMove: string;
          WindowDidOrderOffScreen: string;
          WindowDidOrderOnScreen: string;
          WindowDidResignKey: string;
          WindowDidResignMain: string;
          WindowDidResize: string;
          WindowDidUpdate: string;
          WindowDidUpdateAlpha: string;
          WindowDidUpdateCollectionBehavior: string;
          WindowDidUpdateCollectionProperties: string;
          WindowDidUpdateShadow: string;
          WindowDidUpdateTitle: string;
          WindowDidUpdateToolbar: string;
          WindowDidZoom: string;
          WindowFileDraggingEntered: string;
          WindowFileDraggingExited: string;
          WindowFileDraggingPerformed: string;
          WindowHide: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowShouldClose: string;
          WindowShow: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowWillBecomeKey: string;
          WindowWillBecomeMain: string;
          WindowWillBeginSheet: string;
          WindowWillChangeOrderingMode: string;
          WindowWillClose: string;
          WindowWillDeminiaturize: string;
          WindowWillEnterFullScreen: string;
          WindowWillEnterVersionBrowser: string;
          WindowWillExitFullScreen: string;
          WindowWillExitVersionBrowser: string;
          WindowWillFocus: string;
          WindowWillMiniaturize: string;
          WindowWillMove: string;
          WindowWillOrderOffScreen: string;
          WindowWillOrderOnScreen: string;
          WindowWillResignMain: string;
          WindowWillResize: string;
          WindowWillUnfocus: string;
          WindowWillUpdate: string;
          WindowWillUpdateAlpha: string;
          WindowWillUpdateCollectionBehavior: string;
          WindowWillUpdateCollectionProperties: string;
          WindowWillUpdateShadow: string;
          WindowWillUpdateTitle: string;
          WindowWillUpdateToolbar: string;
          WindowWillUpdateVisibility: string;
          WindowWillUseStandardFrame: string;
          WindowZoomIn: string;
          WindowZoomOut: string;
          WindowZoomReset: string;
      }
      • ApplicationDidBecomeActive: string
      • ApplicationDidChangeBackingProperties: string
      • ApplicationDidChangeEffectiveAppearance: string
      • ApplicationDidChangeIcon: string
      • ApplicationDidChangeOcclusionState: string
      • ApplicationDidChangeScreenParameters: string
      • ApplicationDidChangeStatusBarFrame: string
      • ApplicationDidChangeStatusBarOrientation: string
      • ApplicationDidChangeTheme: string
      • ApplicationDidFinishLaunching: string
      • ApplicationDidHide: string
      • ApplicationDidResignActive: string
      • ApplicationDidUnhide: string
      • ApplicationDidUpdate: string
      • ApplicationShouldHandleReopen: string
      • ApplicationWillBecomeActive: string
      • ApplicationWillFinishLaunching: string
      • ApplicationWillHide: string
      • ApplicationWillResignActive: string
      • ApplicationWillTerminate: string
      • ApplicationWillUnhide: string
      • ApplicationWillUpdate: string
      • MenuDidAddItem: string
      • MenuDidBeginTracking: string
      • MenuDidClose: string
      • MenuDidDisplayItem: string
      • MenuDidEndTracking: string
      • MenuDidHighlightItem: string
      • MenuDidOpen: string
      • MenuDidPopUp: string
      • MenuDidRemoveItem: string
      • MenuDidSendAction: string
      • MenuDidSendActionToItem: string
      • MenuDidUpdate: string
      • MenuWillAddItem: string
      • MenuWillBeginTracking: string
      • MenuWillDisplayItem: string
      • MenuWillEndTracking: string
      • MenuWillHighlightItem: string
      • MenuWillOpen: string
      • MenuWillPopUp: string
      • MenuWillRemoveItem: string
      • MenuWillSendAction: string
      • MenuWillSendActionToItem: string
      • MenuWillUpdate: string
      • WebViewDidCommitNavigation: string
      • WebViewDidFinishNavigation: string
      • WebViewDidReceiveServerRedirectForProvisionalNavigation: string
      • WebViewDidStartProvisionalNavigation: string
      • WindowDidBecomeKey: string
      • WindowDidBecomeMain: string
      • WindowDidBeginSheet: string
      • WindowDidChangeAlpha: string
      • WindowDidChangeBackingLocation: string
      • WindowDidChangeBackingProperties: string
      • WindowDidChangeCollectionBehavior: string
      • WindowDidChangeEffectiveAppearance: string
      • WindowDidChangeOcclusionState: string
      • WindowDidChangeOrderingMode: string
      • WindowDidChangeScreen: string
      • WindowDidChangeScreenParameters: string
      • WindowDidChangeScreenProfile: string
      • WindowDidChangeScreenSpace: string
      • WindowDidChangeScreenSpaceProperties: string
      • WindowDidChangeSharingType: string
      • WindowDidChangeSpace: string
      • WindowDidChangeSpaceOrderingMode: string
      • WindowDidChangeTitle: string
      • WindowDidChangeToolbar: string
      • WindowDidDeminiaturize: string
      • WindowDidEndSheet: string
      • WindowDidEnterFullScreen: string
      • WindowDidEnterVersionBrowser: string
      • WindowDidExitFullScreen: string
      • WindowDidExitVersionBrowser: string
      • WindowDidExpose: string
      • WindowDidFocus: string
      • WindowDidMiniaturize: string
      • WindowDidMove: string
      • WindowDidOrderOffScreen: string
      • WindowDidOrderOnScreen: string
      • WindowDidResignKey: string
      • WindowDidResignMain: string
      • WindowDidResize: string
      • WindowDidUpdate: string
      • WindowDidUpdateAlpha: string
      • WindowDidUpdateCollectionBehavior: string
      • WindowDidUpdateCollectionProperties: string
      • WindowDidUpdateShadow: string
      • WindowDidUpdateTitle: string
      • WindowDidUpdateToolbar: string
      • WindowDidZoom: string
      • WindowFileDraggingEntered: string
      • WindowFileDraggingExited: string
      • WindowFileDraggingPerformed: string
      • WindowHide: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowShouldClose: string
      • WindowShow: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowWillBecomeKey: string
      • WindowWillBecomeMain: string
      • WindowWillBeginSheet: string
      • WindowWillChangeOrderingMode: string
      • WindowWillClose: string
      • WindowWillDeminiaturize: string
      • WindowWillEnterFullScreen: string
      • WindowWillEnterVersionBrowser: string
      • WindowWillExitFullScreen: string
      • WindowWillExitVersionBrowser: string
      • WindowWillFocus: string
      • WindowWillMiniaturize: string
      • WindowWillMove: string
      • WindowWillOrderOffScreen: string
      • WindowWillOrderOnScreen: string
      • WindowWillResignMain: string
      • WindowWillResize: string
      • WindowWillUnfocus: string
      • WindowWillUpdate: string
      • WindowWillUpdateAlpha: string
      • WindowWillUpdateCollectionBehavior: string
      • WindowWillUpdateCollectionProperties: string
      • WindowWillUpdateShadow: string
      • WindowWillUpdateTitle: string
      • WindowWillUpdateToolbar: string
      • WindowWillUpdateVisibility: string
      • WindowWillUseStandardFrame: string
      • WindowZoomIn: string
      • WindowZoomOut: string
      • WindowZoomReset: string
    • Windows: {
          APMPowerSettingChange: string;
          APMPowerStatusChange: string;
          APMResumeAutomatic: string;
          APMResumeSuspend: string;
          APMSuspend: string;
          ApplicationStarted: string;
          SystemThemeChanged: string;
          WebViewNavigationCompleted: string;
          WindowActive: string;
          WindowBackgroundErase: string;
          WindowClickActive: string;
          WindowClosing: string;
          WindowDPIChanged: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowDragDrop: string;
          WindowDragEnter: string;
          WindowDragLeave: string;
          WindowDragOver: string;
          WindowEndMove: string;
          WindowEndResize: string;
          WindowFullscreen: string;
          WindowHide: string;
          WindowInactive: string;
          WindowKeyDown: string;
          WindowKeyUp: string;
          WindowKillFocus: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowNonClientHit: string;
          WindowNonClientMouseDown: string;
          WindowNonClientMouseLeave: string;
          WindowNonClientMouseMove: string;
          WindowNonClientMouseUp: string;
          WindowPaint: string;
          WindowRestore: string;
          WindowSetFocus: string;
          WindowShow: string;
          WindowStartMove: string;
          WindowStartResize: string;
          WindowUnFullscreen: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowZOrderChanged: string;
      }
      • APMPowerSettingChange: string
      • APMPowerStatusChange: string
      • APMResumeAutomatic: string
      • APMResumeSuspend: string
      • APMSuspend: string
      • ApplicationStarted: string
      • SystemThemeChanged: string
      • WebViewNavigationCompleted: string
      • WindowActive: string
      • WindowBackgroundErase: string
      • WindowClickActive: string
      • WindowClosing: string
      • WindowDPIChanged: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowDragDrop: string
      • WindowDragEnter: string
      • WindowDragLeave: string
      • WindowDragOver: string
      • WindowEndMove: string
      • WindowEndResize: string
      • WindowFullscreen: string
      • WindowHide: string
      • WindowInactive: string
      • WindowKeyDown: string
      • WindowKeyUp: string
      • WindowKillFocus: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowNonClientHit: string
      • WindowNonClientMouseDown: string
      • WindowNonClientMouseLeave: string
      • WindowNonClientMouseMove: string
      • WindowNonClientMouseUp: string
      • WindowPaint: string
      • WindowRestore: string
      • WindowSetFocus: string
      • WindowShow: string
      • WindowStartMove: string
      • WindowStartResize: string
      • WindowUnFullscreen: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowZOrderChanged: string

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Window.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Window.html index e21e91c08..37e94be24 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Window.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Window.html @@ -1,2 +1,2 @@ Window | @wailsio/runtime

    Variable WindowConst

    Window: Window = ...

    The window within which the script is running.

    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/package-lock.json b/v3/internal/runtime/desktop/@wailsio/runtime/package-lock.json index 8591d7d71..6d2d6cd8a 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/package-lock.json +++ b/v3/internal/runtime/desktop/@wailsio/runtime/package-lock.json @@ -1,12 +1,12 @@ { "name": "@wailsio/runtime", - "version": "3.0.0-alpha.64", + "version": "3.0.0-alpha.65", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@wailsio/runtime", - "version": "3.0.0-alpha.64", + "version": "3.0.0-alpha.65", "license": "MIT", "devDependencies": { "rimraf": "^5.0.5", diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/package.json b/v3/internal/runtime/desktop/@wailsio/runtime/package.json index 0ce6274f5..0617b4b68 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/package.json +++ b/v3/internal/runtime/desktop/@wailsio/runtime/package.json @@ -1,7 +1,7 @@ { "name": "@wailsio/runtime", "type": "module", - "version": "3.0.0-alpha.64", + "version": "3.0.0-alpha.65", "description": "Wails Runtime", "types": "types/index.d.ts", "exports": { From fc0eb760cd49c3e0c588c0c827399dc8ce5639da Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Thu, 27 Feb 2025 20:52:35 +0000 Subject: [PATCH 112/374] [skip ci] Publish @wailsio/runtime v3.0.0-alpha.66 --- .../@wailsio/runtime/dist/application.js | 32 + .../desktop/@wailsio/runtime/dist/browser.js | 20 + .../desktop/@wailsio/runtime/dist/callable.js | 144 + .../desktop/@wailsio/runtime/dist/calls.js | 194 ++ .../@wailsio/runtime/dist/cancellable.js | 792 +++++ .../@wailsio/runtime/dist/clipboard.js | 30 + .../@wailsio/runtime/dist/contextmenu.js | 80 + .../desktop/@wailsio/runtime/dist/create.js | 94 + .../desktop/@wailsio/runtime/dist/dialogs.js | 134 + .../desktop/@wailsio/runtime/dist/drag.js | 222 ++ .../@wailsio/runtime/dist/event_types.js | 229 ++ .../desktop/@wailsio/runtime/dist/events.js | 101 + .../desktop/@wailsio/runtime/dist/flags.js | 23 + .../desktop/@wailsio/runtime/dist/index.js | 38 + .../desktop/@wailsio/runtime/dist/listener.js | 44 + .../desktop/@wailsio/runtime/dist/nanoid.js | 38 + .../desktop/@wailsio/runtime/dist/runtime.js | 63 + .../desktop/@wailsio/runtime/dist/screens.js | 38 + .../desktop/@wailsio/runtime/dist/system.js | 116 + .../desktop/@wailsio/runtime/dist/utils.js | 95 + .../desktop/@wailsio/runtime/dist/window.js | 438 +++ .../desktop/@wailsio/runtime/dist/wml.js | 179 ++ .../@wailsio/runtime/docs/assets/hierarchy.js | 1 + .../runtime/docs/assets/highlight.css | 42 + .../@wailsio/runtime/docs/assets/icons.js | 31 +- .../@wailsio/runtime/docs/assets/icons.svg | 2 +- .../@wailsio/runtime/docs/assets/main.js | 9 +- .../runtime/docs/assets/navigation.js | 2 +- .../@wailsio/runtime/docs/assets/search.js | 2 +- .../@wailsio/runtime/docs/assets/style.css | 2800 +++++++++-------- .../docs/classes/Call.RuntimeError.html | 20 +- .../runtime/docs/classes/CancelError.html | 13 + .../docs/classes/CancellablePromise.html | 263 ++ .../docs/classes/CancelledRejectionError.html | 21 + .../docs/classes/Events.WailsEvent.html | 14 +- .../docs/classes/_internal_.Window.html | 134 + .../docs/functions/Application.Hide.html | 4 +- .../docs/functions/Application.Quit.html | 4 +- .../docs/functions/Application.Show.html | 4 +- .../docs/functions/Browser.OpenURL.html | 6 +- .../runtime/docs/functions/Call.ByID.html | 10 +- .../runtime/docs/functions/Call.ByName.html | 10 +- .../runtime/docs/functions/Call.Call.html | 10 +- .../docs/functions/Clipboard.SetText.html | 8 +- .../docs/functions/Clipboard.Text.html | 6 +- .../runtime/docs/functions/Create.Any.html | 2 - .../runtime/docs/functions/Create.Array.html | 4 - .../docs/functions/Create.ByteSlice.html | 3 - .../runtime/docs/functions/Create.Map.html | 4 - .../docs/functions/Create.Nullable.html | 3 - .../runtime/docs/functions/Create.Struct.html | 3 - .../runtime/docs/functions/Dialogs.Error.html | 9 +- .../runtime/docs/functions/Dialogs.Info.html | 9 +- .../docs/functions/Dialogs.OpenFile.html | 13 +- .../docs/functions/Dialogs.Question.html | 9 +- .../docs/functions/Dialogs.SaveFile.html | 7 +- .../docs/functions/Dialogs.Warning.html | 9 +- .../runtime/docs/functions/Events.Emit.html | 8 +- .../runtime/docs/functions/Events.Off.html | 7 +- .../runtime/docs/functions/Events.OffAll.html | 5 +- .../runtime/docs/functions/Events.On.html | 12 +- .../docs/functions/Events.OnMultiple.html | 10 +- .../runtime/docs/functions/Events.Once.html | 12 +- .../runtime/docs/functions/Events.setup.html | 1 - .../runtime/docs/functions/Flags.GetFlag.html | 10 +- .../docs/functions/Screens.GetAll.html | 6 +- .../docs/functions/Screens.GetCurrent.html | 6 +- .../docs/functions/Screens.GetPrimary.html | 6 +- .../docs/functions/System.Capabilities.html | 7 +- .../docs/functions/System.Environment.html | 8 +- .../docs/functions/System.IsAMD64.html | 4 +- .../runtime/docs/functions/System.IsARM.html | 4 +- .../docs/functions/System.IsARM64.html | 8 +- .../docs/functions/System.IsDarkMode.html | 8 +- .../docs/functions/System.IsDebug.html | 4 +- .../docs/functions/System.IsLinux.html | 4 +- .../runtime/docs/functions/System.IsMac.html | 4 +- .../docs/functions/System.IsWindows.html | 4 +- .../runtime/docs/functions/System.invoke.html | 2 +- .../runtime/docs/functions/WML.Enable.html | 4 +- .../runtime/docs/functions/WML.Reload.html | 4 +- .../@wailsio/runtime/docs/functions/init.html | 1 - .../@wailsio/runtime/docs/hierarchy.html | 1 + .../desktop/@wailsio/runtime/docs/index.html | 8 +- .../docs/interfaces/Call.CallOptions.html | 7 - .../interfaces/CancellablePromiseLike.html | 3 + .../CancellablePromiseWithResolvers.html | 7 + .../docs/interfaces/Dialogs.Button.html | 14 +- .../docs/interfaces/Dialogs.FileFilter.html | 10 +- .../Dialogs.MessageDialogOptions.html | 18 +- .../Dialogs.OpenFileDialogOptions.html | 66 +- .../Dialogs.SaveFileDialogOptions.html | 68 +- .../runtime/docs/interfaces/Screens.Rect.html | 18 +- .../docs/interfaces/Screens.Screen.html | 50 +- .../runtime/docs/interfaces/Screens.Size.html | 10 +- .../interfaces/System.EnvironmentInfo.html | 22 +- .../docs/interfaces/System.OSInfo.html | 18 +- .../_internal_.AddEventListenerOptions.html | 5 + .../_internal_.ArrayBufferView.html | 7 + .../docs/interfaces/_internal_.Blob.html | 17 + .../_internal_.BlobPropertyBag.html | 3 + .../interfaces/_internal_.ErrorOptions.html | 2 + .../docs/interfaces/_internal_.Event.html | 57 + .../docs/interfaces/_internal_.EventInit.html | 4 + .../interfaces/_internal_.EventListener.html | 1 + .../_internal_.EventListenerObject.html | 2 + .../_internal_.EventListenerOptions.html | 2 + .../interfaces/_internal_.EventTarget.html | 18 + .../docs/interfaces/_internal_.Iterable.html | 2 + .../interfaces/_internal_.MediaSource.html | 49 + .../_internal_.MediaSourceEventMap.html | 4 + .../docs/interfaces/_internal_.Position.html | 6 + .../_internal_.PromiseFulfilledResult.html | 3 + .../interfaces/_internal_.PromiseLike.html | 6 + .../_internal_.PromiseRejectedResult.html | 3 + .../_internal_.PromiseWithResolvers.html | 4 + .../_internal_.QueuingStrategy.html | 3 + .../_internal_.QueuingStrategySize.html | 1 + ...nternal_.ReadableByteStreamController.html | 12 + .../interfaces/_internal_.ReadableStream.html | 15 + .../_internal_.ReadableStreamBYOBReader.html | 10 + .../_internal_.ReadableStreamBYOBRequest.html | 8 + ...rnal_.ReadableStreamDefaultController.html | 10 + ...internal_.ReadableStreamDefaultReader.html | 10 + ...internal_.ReadableStreamGenericReader.html | 5 + ...ernal_.ReadableStreamGetReaderOptions.html | 4 + ...nternal_.ReadableStreamReadDoneResult.html | 3 + ...ternal_.ReadableStreamReadValueResult.html | 3 + .../_internal_.ReadableWritablePair.html | 5 + .../docs/interfaces/_internal_.Size.html | 6 + .../interfaces/_internal_.SourceBuffer.html | 53 + .../_internal_.SourceBufferEventMap.html | 6 + .../_internal_.StreamPipeOptions.html | 13 + .../interfaces/_internal_.TimeRanges.html | 14 + .../docs/interfaces/_internal_.URL.html | 30 + .../_internal_.UnderlyingByteSource.html | 6 + .../_internal_.UnderlyingDefaultSource.html | 5 + .../interfaces/_internal_.UnderlyingSink.html | 6 + ...internal_.UnderlyingSinkAbortCallback.html | 1 + ...internal_.UnderlyingSinkCloseCallback.html | 1 + ...internal_.UnderlyingSinkStartCallback.html | 1 + ...internal_.UnderlyingSinkWriteCallback.html | 1 + .../_internal_.UnderlyingSource.html | 6 + ...ernal_.UnderlyingSourceCancelCallback.html | 1 + ...nternal_.UnderlyingSourcePullCallback.html | 1 + ...ternal_.UnderlyingSourceStartCallback.html | 1 + .../interfaces/_internal_.WritableStream.html | 11 + ...rnal_.WritableStreamDefaultController.html | 7 + ...internal_.WritableStreamDefaultWriter.html | 17 + .../@wailsio/runtime/docs/modules.html | 15 +- .../runtime/docs/modules/Application.html | 5 +- .../runtime/docs/modules/Browser.html | 3 +- .../@wailsio/runtime/docs/modules/Call.html | 7 +- .../runtime/docs/modules/Clipboard.html | 4 +- .../@wailsio/runtime/docs/modules/Create.html | 7 - .../runtime/docs/modules/Dialogs.html | 13 +- .../@wailsio/runtime/docs/modules/Events.html | 11 +- .../@wailsio/runtime/docs/modules/Flags.html | 3 +- .../runtime/docs/modules/Screens.html | 8 +- .../@wailsio/runtime/docs/modules/System.html | 15 +- .../@wailsio/runtime/docs/modules/WML.html | 4 +- .../runtime/docs/modules/_internal_.html | 1 + .../runtime/docs/types/Call.CallOptions.html | 9 + .../runtime/docs/types/Events.Callback.html | 2 + .../docs/types/_internal_.AppendMode.html | 1 + .../types/_internal_.ArrayBufferLike.html | 1 + .../docs/types/_internal_.Awaited.html | 2 + .../docs/types/_internal_.BlobPart.html | 1 + .../docs/types/_internal_.BufferSource.html | 1 + ...internal_.CancellablePromiseCanceller.html | 1 + ..._internal_.CancellablePromiseExecutor.html | 1 + ..._internal_.CancellablePromiseRejector.html | 1 + ..._internal_.CancellablePromiseResolver.html | 1 + .../types/_internal_.EndOfStreamError.html | 1 + .../docs/types/_internal_.EndingType.html | 1 + ...l_.EventListenerOrEventListenerObject.html | 1 + .../docs/types/_internal_.Partial.html | 2 + .../_internal_.PromiseSettledResult.html | 1 + .../_internal_.ReadableStreamController.html | 1 + .../_internal_.ReadableStreamReadResult.html | 1 + .../_internal_.ReadableStreamReader.html | 1 + .../docs/types/_internal_.Readonly.html | 2 + .../docs/types/_internal_.ReadyState.html | 1 + .../runtime/docs/types/_internal_.Record.html | 2 + .../runtime/docs/variables/Events.Types.html | 2 +- .../runtime/docs/variables/Window.html | 4 +- .../docs/variables/_internal_.Blob-1.html | 1 + .../docs/variables/_internal_.Event-1.html | 1 + .../variables/_internal_.EventTarget-1.html | 1 + .../variables/_internal_.MediaSource-1.html | 3 + ...ernal_.ReadableByteStreamController-1.html | 1 + .../_internal_.ReadableStream-1.html | 1 + ..._internal_.ReadableStreamBYOBReader-1.html | 1 + ...internal_.ReadableStreamBYOBRequest-1.html | 1 + ...al_.ReadableStreamDefaultController-1.html | 1 + ...ternal_.ReadableStreamDefaultReader-1.html | 1 + .../variables/_internal_.SourceBuffer-1.html | 1 + .../variables/_internal_.TimeRanges-1.html | 1 + .../docs/variables/_internal_.URL-1.html | 5 + .../_internal_.WritableStream-1.html | 1 + ...al_.WritableStreamDefaultController-1.html | 1 + ...ternal_.WritableStreamDefaultWriter-1.html | 1 + .../@wailsio/runtime/package-lock.json | 4 +- .../desktop/@wailsio/runtime/package.json | 2 +- .../@wailsio/runtime/types/application.d.ts | 13 +- .../@wailsio/runtime/types/browser.d.ts | 8 +- .../@wailsio/runtime/types/callable.d.ts | 3 + .../desktop/@wailsio/runtime/types/calls.d.ts | 92 +- .../@wailsio/runtime/types/cancellable.d.ts | 434 +++ .../@wailsio/runtime/types/clipboard.d.ts | 11 +- .../@wailsio/runtime/types/create.d.ts | 33 +- .../@wailsio/runtime/types/dialogs.d.ts | 242 +- .../@wailsio/runtime/types/event_types.d.ts | 437 ++- .../@wailsio/runtime/types/events.d.ts | 295 +- .../desktop/@wailsio/runtime/types/flags.d.ts | 6 +- .../desktop/@wailsio/runtime/types/index.d.ts | 30 +- .../@wailsio/runtime/types/listener.d.ts | 9 + .../@wailsio/runtime/types/nanoid.d.ts | 2 +- .../@wailsio/runtime/types/runtime.d.ts | 44 +- .../@wailsio/runtime/types/screens.d.ts | 134 +- .../@wailsio/runtime/types/system.d.ts | 129 +- .../desktop/@wailsio/runtime/types/utils.d.ts | 23 +- .../@wailsio/runtime/types/window.d.ts | 335 +- .../desktop/@wailsio/runtime/types/wml.d.ts | 8 +- 224 files changed, 7127 insertions(+), 2901 deletions(-) create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/dist/application.js create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/dist/browser.js create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/dist/callable.js create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/dist/calls.js create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/dist/cancellable.js create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/dist/clipboard.js create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/dist/contextmenu.js create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/dist/create.js create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/dist/dialogs.js create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/dist/drag.js create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/dist/event_types.js create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/dist/events.js create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/dist/flags.js create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/dist/index.js create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/dist/listener.js create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/dist/nanoid.js create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/dist/runtime.js create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/dist/screens.js create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/dist/system.js create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/dist/utils.js create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/dist/window.js create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/dist/wml.js create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/assets/hierarchy.js create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/CancelError.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/CancellablePromise.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/CancelledRejectionError.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/_internal_.Window.html delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Any.html delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Array.html delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.ByteSlice.html delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Map.html delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Nullable.html delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Struct.html delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.setup.html delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/init.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/hierarchy.html delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Call.CallOptions.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/CancellablePromiseLike.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/CancellablePromiseWithResolvers.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.AddEventListenerOptions.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.ArrayBufferView.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.Blob.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.BlobPropertyBag.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.ErrorOptions.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.Event.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.EventInit.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.EventListener.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.EventListenerObject.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.EventListenerOptions.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.EventTarget.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.Iterable.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.MediaSource.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.MediaSourceEventMap.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.Position.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.PromiseFulfilledResult.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.PromiseLike.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.PromiseRejectedResult.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.PromiseWithResolvers.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.QueuingStrategy.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.QueuingStrategySize.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.ReadableByteStreamController.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.ReadableStream.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.ReadableStreamBYOBReader.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.ReadableStreamBYOBRequest.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.ReadableStreamDefaultController.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.ReadableStreamDefaultReader.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.ReadableStreamGenericReader.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.ReadableStreamGetReaderOptions.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.ReadableStreamReadDoneResult.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.ReadableStreamReadValueResult.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.ReadableWritablePair.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.Size.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.SourceBuffer.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.SourceBufferEventMap.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.StreamPipeOptions.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.TimeRanges.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.URL.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.UnderlyingByteSource.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.UnderlyingDefaultSource.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.UnderlyingSink.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.UnderlyingSinkAbortCallback.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.UnderlyingSinkCloseCallback.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.UnderlyingSinkStartCallback.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.UnderlyingSinkWriteCallback.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.UnderlyingSource.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.UnderlyingSourceCancelCallback.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.UnderlyingSourcePullCallback.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.UnderlyingSourceStartCallback.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.WritableStream.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.WritableStreamDefaultController.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.WritableStreamDefaultWriter.html delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Create.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/_internal_.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/types/Call.CallOptions.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/types/Events.Callback.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.AppendMode.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.ArrayBufferLike.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.Awaited.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.BlobPart.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.BufferSource.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.CancellablePromiseCanceller.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.CancellablePromiseExecutor.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.CancellablePromiseRejector.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.CancellablePromiseResolver.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.EndOfStreamError.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.EndingType.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.EventListenerOrEventListenerObject.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.Partial.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.PromiseSettledResult.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.ReadableStreamController.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.ReadableStreamReadResult.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.ReadableStreamReader.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.Readonly.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.ReadyState.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.Record.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.Blob-1.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.Event-1.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.EventTarget-1.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.MediaSource-1.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.ReadableByteStreamController-1.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.ReadableStream-1.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.ReadableStreamBYOBReader-1.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.ReadableStreamBYOBRequest-1.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.ReadableStreamDefaultController-1.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.ReadableStreamDefaultReader-1.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.SourceBuffer-1.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.TimeRanges-1.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.URL-1.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.WritableStream-1.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.WritableStreamDefaultController-1.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.WritableStreamDefaultWriter-1.html create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/types/callable.d.ts create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/types/cancellable.d.ts create mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/types/listener.d.ts diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/dist/application.js b/v3/internal/runtime/desktop/@wailsio/runtime/dist/application.js new file mode 100644 index 000000000..a017d4aa4 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/dist/application.js @@ -0,0 +1,32 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ +import { newRuntimeCaller, objectNames } from "./runtime.js"; +const call = newRuntimeCaller(objectNames.Application); +const HideMethod = 0; +const ShowMethod = 1; +const QuitMethod = 2; +/** + * Hides a certain method by calling the HideMethod function. + */ +export function Hide() { + return call(HideMethod); +} +/** + * Calls the ShowMethod and returns the result. + */ +export function Show() { + return call(ShowMethod); +} +/** + * Calls the QuitMethod to terminate the program. + */ +export function Quit() { + return call(QuitMethod); +} diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/dist/browser.js b/v3/internal/runtime/desktop/@wailsio/runtime/dist/browser.js new file mode 100644 index 000000000..633989016 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/dist/browser.js @@ -0,0 +1,20 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ +import { newRuntimeCaller, objectNames } from "./runtime.js"; +const call = newRuntimeCaller(objectNames.Browser); +const BrowserOpenURL = 0; +/** + * Open a browser window to the given URL. + * + * @param url - The URL to open + */ +export function OpenURL(url) { + return call(BrowserOpenURL, { url: url.toString() }); +} diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/dist/callable.js b/v3/internal/runtime/desktop/@wailsio/runtime/dist/callable.js new file mode 100644 index 000000000..c38273532 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/dist/callable.js @@ -0,0 +1,144 @@ +// Source: https://github.com/inspect-js/is-callable +// The MIT License (MIT) +// +// Copyright (c) 2015 Jordan Harband +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +var fnToStr = Function.prototype.toString; +var reflectApply = typeof Reflect === 'object' && Reflect !== null && Reflect.apply; +var badArrayLike; +var isCallableMarker; +if (typeof reflectApply === 'function' && typeof Object.defineProperty === 'function') { + try { + badArrayLike = Object.defineProperty({}, 'length', { + get: function () { + throw isCallableMarker; + } + }); + isCallableMarker = {}; + // eslint-disable-next-line no-throw-literal + reflectApply(function () { throw 42; }, null, badArrayLike); + } + catch (_) { + if (_ !== isCallableMarker) { + reflectApply = null; + } + } +} +else { + reflectApply = null; +} +var constructorRegex = /^\s*class\b/; +var isES6ClassFn = function isES6ClassFunction(value) { + try { + var fnStr = fnToStr.call(value); + return constructorRegex.test(fnStr); + } + catch (e) { + return false; // not a function + } +}; +var tryFunctionObject = function tryFunctionToStr(value) { + try { + if (isES6ClassFn(value)) { + return false; + } + fnToStr.call(value); + return true; + } + catch (e) { + return false; + } +}; +var toStr = Object.prototype.toString; +var objectClass = '[object Object]'; +var fnClass = '[object Function]'; +var genClass = '[object GeneratorFunction]'; +var ddaClass = '[object HTMLAllCollection]'; // IE 11 +var ddaClass2 = '[object HTML document.all class]'; +var ddaClass3 = '[object HTMLCollection]'; // IE 9-10 +var hasToStringTag = typeof Symbol === 'function' && !!Symbol.toStringTag; // better: use `has-tostringtag` +var isIE68 = !(0 in [,]); // eslint-disable-line no-sparse-arrays, comma-spacing +var isDDA = function isDocumentDotAll() { return false; }; +if (typeof document === 'object') { + // Firefox 3 canonicalizes DDA to undefined when it's not accessed directly + var all = document.all; + if (toStr.call(all) === toStr.call(document.all)) { + isDDA = function isDocumentDotAll(value) { + /* globals document: false */ + // in IE 6-8, typeof document.all is "object" and it's truthy + if ((isIE68 || !value) && (typeof value === 'undefined' || typeof value === 'object')) { + try { + var str = toStr.call(value); + return (str === ddaClass + || str === ddaClass2 + || str === ddaClass3 // opera 12.16 + || str === objectClass // IE 6-8 + ) && value('') == null; // eslint-disable-line eqeqeq + } + catch (e) { /**/ } + } + return false; + }; + } +} +function isCallableRefApply(value) { + if (isDDA(value)) { + return true; + } + if (!value) { + return false; + } + if (typeof value !== 'function' && typeof value !== 'object') { + return false; + } + try { + reflectApply(value, null, badArrayLike); + } + catch (e) { + if (e !== isCallableMarker) { + return false; + } + } + return !isES6ClassFn(value) && tryFunctionObject(value); +} +function isCallableNoRefApply(value) { + if (isDDA(value)) { + return true; + } + if (!value) { + return false; + } + if (typeof value !== 'function' && typeof value !== 'object') { + return false; + } + if (hasToStringTag) { + return tryFunctionObject(value); + } + if (isES6ClassFn(value)) { + return false; + } + var strClass = toStr.call(value); + if (strClass !== fnClass && strClass !== genClass && !(/^\[object HTML/).test(strClass)) { + return false; + } + return tryFunctionObject(value); +} +; +export default reflectApply ? isCallableRefApply : isCallableNoRefApply; diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/dist/calls.js b/v3/internal/runtime/desktop/@wailsio/runtime/dist/calls.js new file mode 100644 index 000000000..a6777fa42 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/dist/calls.js @@ -0,0 +1,194 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ +import { CancellablePromise } from "./cancellable.js"; +import { newRuntimeCaller, objectNames } from "./runtime.js"; +import { nanoid } from "./nanoid.js"; +// Setup +window._wails = window._wails || {}; +window._wails.callResultHandler = resultHandler; +window._wails.callErrorHandler = errorHandler; +const call = newRuntimeCaller(objectNames.Call); +const cancelCall = newRuntimeCaller(objectNames.CancelCall); +const callResponses = new Map(); +const CallBinding = 0; +const CancelMethod = 0; +/** + * Exception class that will be thrown in case the bound method returns an error. + * The value of the {@link RuntimeError#name} property is "RuntimeError". + */ +export class RuntimeError extends Error { + /** + * Constructs a new RuntimeError instance. + * @param message - The error message. + * @param options - Options to be forwarded to the Error constructor. + */ + constructor(message, options) { + super(message, options); + this.name = "RuntimeError"; + } +} +/** + * Handles the result of a call request. + * + * @param id - The id of the request to handle the result for. + * @param data - The result data of the request. + * @param isJSON - Indicates whether the data is JSON or not. + */ +function resultHandler(id, data, isJSON) { + const resolvers = getAndDeleteResponse(id); + if (!resolvers) { + return; + } + if (!data) { + resolvers.resolve(undefined); + } + else if (!isJSON) { + resolvers.resolve(data); + } + else { + try { + resolvers.resolve(JSON.parse(data)); + } + catch (err) { + resolvers.reject(new TypeError("could not parse result: " + err.message, { cause: err })); + } + } +} +/** + * Handles the error from a call request. + * + * @param id - The id of the promise handler. + * @param data - The error data to reject the promise handler with. + * @param isJSON - Indicates whether the data is JSON or not. + */ +function errorHandler(id, data, isJSON) { + const resolvers = getAndDeleteResponse(id); + if (!resolvers) { + return; + } + if (!isJSON) { + resolvers.reject(new Error(data)); + } + else { + let error; + try { + error = JSON.parse(data); + } + catch (err) { + resolvers.reject(new TypeError("could not parse error: " + err.message, { cause: err })); + return; + } + let options = {}; + if (error.cause) { + options.cause = error.cause; + } + let exception; + switch (error.kind) { + case "ReferenceError": + exception = new ReferenceError(error.message, options); + break; + case "TypeError": + exception = new TypeError(error.message, options); + break; + case "RuntimeError": + exception = new RuntimeError(error.message, options); + break; + default: + exception = new Error(error.message, options); + break; + } + resolvers.reject(exception); + } +} +/** + * Retrieves and removes the response associated with the given ID from the callResponses map. + * + * @param id - The ID of the response to be retrieved and removed. + * @returns The response object associated with the given ID, if any. + */ +function getAndDeleteResponse(id) { + const response = callResponses.get(id); + callResponses.delete(id); + return response; +} +/** + * Generates a unique ID using the nanoid library. + * + * @returns A unique ID that does not exist in the callResponses set. + */ +function generateID() { + let result; + do { + result = nanoid(); + } while (callResponses.has(result)); + return result; +} +/** + * Call a bound method according to the given call options. + * + * In case of failure, the returned promise will reject with an exception + * among ReferenceError (unknown method), TypeError (wrong argument count or type), + * {@link RuntimeError} (method returned an error), or other (network or internal errors). + * The exception might have a "cause" field with the value returned + * by the application- or service-level error marshaling functions. + * + * @param options - A method call descriptor. + * @returns The result of the call. + */ +export function Call(options) { + const id = generateID(); + const result = CancellablePromise.withResolvers(); + callResponses.set(id, { resolve: result.resolve, reject: result.reject }); + const request = call(CallBinding, Object.assign({ "call-id": id }, options)); + let running = false; + request.then(() => { + running = true; + }, (err) => { + callResponses.delete(id); + result.reject(err); + }); + const cancel = () => { + callResponses.delete(id); + return cancelCall(CancelMethod, { "call-id": id }).catch((err) => { + console.error("Error while requesting binding call cancellation:", err); + }); + }; + result.oncancelled = () => { + if (running) { + return cancel(); + } + else { + return request.then(cancel); + } + }; + return result.promise; +} +/** + * Calls a bound method by name with the specified arguments. + * See {@link Call} for details. + * + * @param methodName - The name of the method in the format 'package.struct.method'. + * @param args - The arguments to pass to the method. + * @returns The result of the method call. + */ +export function ByName(methodName, ...args) { + return Call({ methodName, args }); +} +/** + * Calls a method by its numeric ID with the specified arguments. + * See {@link Call} for details. + * + * @param methodID - The ID of the method to call. + * @param args - The arguments to pass to the method. + * @return The result of the method call. + */ +export function ByID(methodID, ...args) { + return Call({ methodID, args }); +} diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/dist/cancellable.js b/v3/internal/runtime/desktop/@wailsio/runtime/dist/cancellable.js new file mode 100644 index 000000000..834cb9412 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/dist/cancellable.js @@ -0,0 +1,792 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ +var _a; +import isCallable from "./callable.js"; +/** + * Exception class that will be used as rejection reason + * in case a {@link CancellablePromise} is cancelled successfully. + * + * The value of the {@link name} property is the string `"CancelError"`. + * The value of the {@link cause} property is the cause passed to the cancel method, if any. + */ +export class CancelError extends Error { + /** + * Constructs a new `CancelError` instance. + * @param message - The error message. + * @param options - Options to be forwarded to the Error constructor. + */ + constructor(message, options) { + super(message, options); + this.name = "CancelError"; + } +} +/** + * Exception class that will be reported as an unhandled rejection + * in case a {@link CancellablePromise} rejects after being cancelled, + * or when the `oncancelled` callback throws or rejects. + * + * The value of the {@link name} property is the string `"CancelledRejectionError"`. + * The value of the {@link cause} property is the reason the promise rejected with. + * + * Because the original promise was cancelled, + * a wrapper promise will be passed to the unhandled rejection listener instead. + * The {@link promise} property holds a reference to the original promise. + */ +export class CancelledRejectionError extends Error { + /** + * Constructs a new `CancelledRejectionError` instance. + * @param promise - The promise that caused the error originally. + * @param reason - The rejection reason. + * @param info - An optional informative message specifying the circumstances in which the error was thrown. + * Defaults to the string `"Unhandled rejection in cancelled promise."`. + */ + constructor(promise, reason, info) { + super((info !== null && info !== void 0 ? info : "Unhandled rejection in cancelled promise.") + " Reason: " + errorMessage(reason), { cause: reason }); + this.promise = promise; + this.name = "CancelledRejectionError"; + } +} +// Private field names. +const barrierSym = Symbol("barrier"); +const cancelImplSym = Symbol("cancelImpl"); +const species = (_a = Symbol.species) !== null && _a !== void 0 ? _a : Symbol("speciesPolyfill"); +/** + * A promise with an attached method for cancelling long-running operations (see {@link CancellablePromise#cancel}). + * Cancellation can optionally be bound to an {@link AbortSignal} + * for better composability (see {@link CancellablePromise#cancelOn}). + * + * Cancelling a pending promise will result in an immediate rejection + * with an instance of {@link CancelError} as reason, + * but whoever started the promise will be responsible + * for actually aborting the underlying operation. + * To this purpose, the constructor and all chaining methods + * accept optional cancellation callbacks. + * + * If a `CancellablePromise` still resolves after having been cancelled, + * the result will be discarded. If it rejects, the reason + * will be reported as an unhandled rejection, + * wrapped in a {@link CancelledRejectionError} instance. + * To facilitate the handling of cancellation requests, + * cancelled `CancellablePromise`s will _not_ report unhandled `CancelError`s + * whose `cause` field is the same as the one with which the current promise was cancelled. + * + * All usual promise methods are defined and return a `CancellablePromise` + * whose cancel method will cancel the parent operation as well, propagating the cancellation reason + * upwards through promise chains. + * Conversely, cancelling a promise will not automatically cancel dependent promises downstream: + * ```ts + * let root = new CancellablePromise((resolve, reject) => { ... }); + * let child1 = root.then(() => { ... }); + * let child2 = child1.then(() => { ... }); + * let child3 = root.catch(() => { ... }); + * child1.cancel(); // Cancels child1 and root, but not child2 or child3 + * ``` + * Cancelling a promise that has already settled is safe and has no consequence. + * + * The `cancel` method returns a promise that _always fulfills_ + * after the whole chain has processed the cancel request + * and all attached callbacks up to that moment have run. + * + * All ES2024 promise methods (static and instance) are defined on CancellablePromise, + * but actual availability may vary with OS/webview version. + * + * In line with the proposal at https://github.com/tc39/proposal-rm-builtin-subclassing, + * `CancellablePromise` does not support transparent subclassing. + * Extenders should take care to provide their own method implementations. + * This might be reconsidered in case the proposal is retired. + * + * CancellablePromise is a wrapper around the DOM Promise object + * and is compliant with the [Promises/A+ specification](https://promisesaplus.com/) + * (it passes the [compliance suite](https://github.com/promises-aplus/promises-tests)) + * if so is the underlying implementation. + */ +export class CancellablePromise extends Promise { + /** + * Creates a new `CancellablePromise`. + * + * @param executor - A callback used to initialize the promise. This callback is passed two arguments: + * a `resolve` callback used to resolve the promise with a value + * or the result of another promise (possibly cancellable), + * and a `reject` callback used to reject the promise with a provided reason or error. + * If the value provided to the `resolve` callback is a thenable _and_ cancellable object + * (it has a `then` _and_ a `cancel` method), + * cancellation requests will be forwarded to that object and the oncancelled will not be invoked anymore. + * If any one of the two callbacks is called _after_ the promise has been cancelled, + * the provided values will be cancelled and resolved as usual, + * but their results will be discarded. + * However, if the resolution process ultimately ends up in a rejection + * that is not due to cancellation, the rejection reason + * will be wrapped in a {@link CancelledRejectionError} + * and bubbled up as an unhandled rejection. + * @param oncancelled - It is the caller's responsibility to ensure that any operation + * started by the executor is properly halted upon cancellation. + * This optional callback can be used to that purpose. + * It will be called _synchronously_ with a cancellation cause + * when cancellation is requested, _after_ the promise has already rejected + * with a {@link CancelError}, but _before_ + * any {@link then}/{@link catch}/{@link finally} callback runs. + * If the callback returns a thenable, the promise returned from {@link cancel} + * will only fulfill after the former has settled. + * Unhandled exceptions or rejections from the callback will be wrapped + * in a {@link CancelledRejectionError} and bubbled up as unhandled rejections. + * If the `resolve` callback is called before cancellation with a cancellable promise, + * cancellation requests on this promise will be diverted to that promise, + * and the original `oncancelled` callback will be discarded. + */ + constructor(executor, oncancelled) { + let resolve; + let reject; + super((res, rej) => { resolve = res; reject = rej; }); + if (this.constructor[species] !== Promise) { + throw new TypeError("CancellablePromise does not support transparent subclassing. Please refrain from overriding the [Symbol.species] static property."); + } + let promise = { + promise: this, + resolve, + reject, + get oncancelled() { return oncancelled !== null && oncancelled !== void 0 ? oncancelled : null; }, + set oncancelled(cb) { oncancelled = cb !== null && cb !== void 0 ? cb : undefined; } + }; + const state = { + get root() { return state; }, + resolving: false, + settled: false + }; + // Setup cancellation system. + void Object.defineProperties(this, { + [barrierSym]: { + configurable: false, + enumerable: false, + writable: true, + value: null + }, + [cancelImplSym]: { + configurable: false, + enumerable: false, + writable: false, + value: cancellerFor(promise, state) + } + }); + // Run the actual executor. + const rejector = rejectorFor(promise, state); + try { + executor(resolverFor(promise, state), rejector); + } + catch (err) { + if (state.resolving) { + console.log("Unhandled exception in CancellablePromise executor.", err); + } + else { + rejector(err); + } + } + } + /** + * Cancels immediately the execution of the operation associated with this promise. + * The promise rejects with a {@link CancelError} instance as reason, + * with the {@link CancelError#cause} property set to the given argument, if any. + * + * Has no effect if called after the promise has already settled; + * repeated calls in particular are safe, but only the first one + * will set the cancellation cause. + * + * The `CancelError` exception _need not_ be handled explicitly _on the promises that are being cancelled:_ + * cancelling a promise with no attached rejection handler does not trigger an unhandled rejection event. + * Therefore, the following idioms are all equally correct: + * ```ts + * new CancellablePromise((resolve, reject) => { ... }).cancel(); + * new CancellablePromise((resolve, reject) => { ... }).then(...).cancel(); + * new CancellablePromise((resolve, reject) => { ... }).then(...).catch(...).cancel(); + * ``` + * Whenever some cancelled promise in a chain rejects with a `CancelError` + * with the same cancellation cause as itself, the error will be discarded silently. + * However, the `CancelError` _will still be delivered_ to all attached rejection handlers + * added by {@link then} and related methods: + * ```ts + * let cancellable = new CancellablePromise((resolve, reject) => { ... }); + * cancellable.then(() => { ... }).catch(console.log); + * cancellable.cancel(); // A CancelError is printed to the console. + * ``` + * If the `CancelError` is not handled downstream by the time it reaches + * a _non-cancelled_ promise, it _will_ trigger an unhandled rejection event, + * just like normal rejections would: + * ```ts + * let cancellable = new CancellablePromise((resolve, reject) => { ... }); + * let chained = cancellable.then(() => { ... }).then(() => { ... }); // No catch... + * cancellable.cancel(); // Unhandled rejection event on chained! + * ``` + * Therefore, it is important to either cancel whole promise chains from their tail, + * as shown in the correct idioms above, or take care of handling errors everywhere. + * + * @returns A cancellable promise that _fulfills_ after the cancel callback (if any) + * and all handlers attached up to the call to cancel have run. + * If the cancel callback returns a thenable, the promise returned by `cancel` + * will also wait for that thenable to settle. + * This enables callers to wait for the cancelled operation to terminate + * without being forced to handle potential errors at the call site. + * ```ts + * cancellable.cancel().then(() => { + * // Cleanup finished, it's safe to do something else. + * }, (err) => { + * // Unreachable: the promise returned from cancel will never reject. + * }); + * ``` + * Note that the returned promise will _not_ handle implicitly any rejection + * that might have occurred already in the cancelled chain. + * It will just track whether registered handlers have been executed or not. + * Therefore, unhandled rejections will never be silently handled by calling cancel. + */ + cancel(cause) { + return new CancellablePromise((resolve) => { + // INVARIANT: the result of this[cancelImplSym] and the barrier do not ever reject. + // Unfortunately macOS High Sierra does not support Promise.allSettled. + Promise.all([ + this[cancelImplSym](new CancelError("Promise cancelled.", { cause })), + currentBarrier(this) + ]).then(() => resolve(), () => resolve()); + }); + } + /** + * Binds promise cancellation to the abort event of the given {@link AbortSignal}. + * If the signal has already aborted, the promise will be cancelled immediately. + * When either condition is verified, the cancellation cause will be set + * to the signal's abort reason (see {@link AbortSignal#reason}). + * + * Has no effect if called (or if the signal aborts) _after_ the promise has already settled. + * Only the first signal to abort will set the cancellation cause. + * + * For more details about the cancellation process, + * see {@link cancel} and the `CancellablePromise` constructor. + * + * This method enables `await`ing cancellable promises without having + * to store them for future cancellation, e.g.: + * ```ts + * await longRunningOperation().cancelOn(signal); + * ``` + * instead of: + * ```ts + * let promiseToBeCancelled = longRunningOperation(); + * await promiseToBeCancelled; + * ``` + * + * @returns This promise, for method chaining. + */ + cancelOn(signal) { + if (signal.aborted) { + void this.cancel(signal.reason); + } + else { + signal.addEventListener('abort', () => void this.cancel(signal.reason), { capture: true }); + } + return this; + } + /** + * Attaches callbacks for the resolution and/or rejection of the `CancellablePromise`. + * + * The optional `oncancelled` argument will be invoked when the returned promise is cancelled, + * with the same semantics as the `oncancelled` argument of the constructor. + * When the parent promise rejects or is cancelled, the `onrejected` callback will run, + * _even after the returned promise has been cancelled:_ + * in that case, should it reject or throw, the reason will be wrapped + * in a {@link CancelledRejectionError} and bubbled up as an unhandled rejection. + * + * @param onfulfilled The callback to execute when the Promise is resolved. + * @param onrejected The callback to execute when the Promise is rejected. + * @returns A `CancellablePromise` for the completion of whichever callback is executed. + * The returned promise is hooked up to propagate cancellation requests up the chain, but not down: + * + * - if the parent promise is cancelled, the `onrejected` handler will be invoked with a `CancelError` + * and the returned promise _will resolve regularly_ with its result; + * - conversely, if the returned promise is cancelled, _the parent promise is cancelled too;_ + * the `onrejected` handler will still be invoked with the parent's `CancelError`, + * but its result will be discarded + * and the returned promise will reject with a `CancelError` as well. + * + * The promise returned from {@link cancel} will fulfill only after all attached handlers + * up the entire promise chain have been run. + * + * If either callback returns a cancellable promise, + * cancellation requests will be diverted to it, + * and the specified `oncancelled` callback will be discarded. + */ + then(onfulfilled, onrejected, oncancelled) { + if (!(this instanceof CancellablePromise)) { + throw new TypeError("CancellablePromise.prototype.then called on an invalid object."); + } + // NOTE: TypeScript's built-in type for then is broken, + // as it allows specifying an arbitrary TResult1 != T even when onfulfilled is not a function. + // We cannot fix it if we want to CancellablePromise to implement PromiseLike. + if (!isCallable(onfulfilled)) { + onfulfilled = identity; + } + if (!isCallable(onrejected)) { + onrejected = thrower; + } + if (onfulfilled === identity && onrejected == thrower) { + // Shortcut for trivial arguments. + return new CancellablePromise((resolve) => resolve(this)); + } + const barrier = {}; + this[barrierSym] = barrier; + return new CancellablePromise((resolve, reject) => { + void super.then((value) => { + var _a; + if (this[barrierSym] === barrier) { + this[barrierSym] = null; + } + (_a = barrier.resolve) === null || _a === void 0 ? void 0 : _a.call(barrier); + try { + resolve(onfulfilled(value)); + } + catch (err) { + reject(err); + } + }, (reason) => { + var _a; + if (this[barrierSym] === barrier) { + this[barrierSym] = null; + } + (_a = barrier.resolve) === null || _a === void 0 ? void 0 : _a.call(barrier); + try { + resolve(onrejected(reason)); + } + catch (err) { + reject(err); + } + }); + }, async (cause) => { + //cancelled = true; + try { + return oncancelled === null || oncancelled === void 0 ? void 0 : oncancelled(cause); + } + finally { + await this.cancel(cause); + } + }); + } + /** + * Attaches a callback for only the rejection of the Promise. + * + * The optional `oncancelled` argument will be invoked when the returned promise is cancelled, + * with the same semantics as the `oncancelled` argument of the constructor. + * When the parent promise rejects or is cancelled, the `onrejected` callback will run, + * _even after the returned promise has been cancelled:_ + * in that case, should it reject or throw, the reason will be wrapped + * in a {@link CancelledRejectionError} and bubbled up as an unhandled rejection. + * + * It is equivalent to + * ```ts + * cancellablePromise.then(undefined, onrejected, oncancelled); + * ``` + * and the same caveats apply. + * + * @returns A Promise for the completion of the callback. + * Cancellation requests on the returned promise + * will propagate up the chain to the parent promise, + * but not in the other direction. + * + * The promise returned from {@link cancel} will fulfill only after all attached handlers + * up the entire promise chain have been run. + * + * If `onrejected` returns a cancellable promise, + * cancellation requests will be diverted to it, + * and the specified `oncancelled` callback will be discarded. + * See {@link then} for more details. + */ + catch(onrejected, oncancelled) { + return this.then(undefined, onrejected, oncancelled); + } + /** + * Attaches a callback that is invoked when the CancellablePromise is settled (fulfilled or rejected). The + * resolved value cannot be accessed or modified from the callback. + * The returned promise will settle in the same state as the original one + * after the provided callback has completed execution, + * unless the callback throws or returns a rejecting promise, + * in which case the returned promise will reject as well. + * + * The optional `oncancelled` argument will be invoked when the returned promise is cancelled, + * with the same semantics as the `oncancelled` argument of the constructor. + * Once the parent promise settles, the `onfinally` callback will run, + * _even after the returned promise has been cancelled:_ + * in that case, should it reject or throw, the reason will be wrapped + * in a {@link CancelledRejectionError} and bubbled up as an unhandled rejection. + * + * This method is implemented in terms of {@link then} and the same caveats apply. + * It is polyfilled, hence available in every OS/webview version. + * + * @returns A Promise for the completion of the callback. + * Cancellation requests on the returned promise + * will propagate up the chain to the parent promise, + * but not in the other direction. + * + * The promise returned from {@link cancel} will fulfill only after all attached handlers + * up the entire promise chain have been run. + * + * If `onfinally` returns a cancellable promise, + * cancellation requests will be diverted to it, + * and the specified `oncancelled` callback will be discarded. + * See {@link then} for more details. + */ + finally(onfinally, oncancelled) { + if (!(this instanceof CancellablePromise)) { + throw new TypeError("CancellablePromise.prototype.finally called on an invalid object."); + } + if (!isCallable(onfinally)) { + return this.then(onfinally, onfinally, oncancelled); + } + return this.then((value) => CancellablePromise.resolve(onfinally()).then(() => value), (reason) => CancellablePromise.resolve(onfinally()).then(() => { throw reason; }), oncancelled); + } + /** + * We use the `[Symbol.species]` static property, if available, + * to disable the built-in automatic subclassing features from {@link Promise}. + * It is critical for performance reasons that extenders do not override this. + * Once the proposal at https://github.com/tc39/proposal-rm-builtin-subclassing + * is either accepted or retired, this implementation will have to be revised accordingly. + * + * @ignore + * @internal + */ + static get [species]() { + return Promise; + } + static all(values) { + let collected = Array.from(values); + const promise = collected.length === 0 + ? CancellablePromise.resolve(collected) + : new CancellablePromise((resolve, reject) => { + void Promise.all(collected).then(resolve, reject); + }, (cause) => cancelAll(promise, collected, cause)); + return promise; + } + static allSettled(values) { + let collected = Array.from(values); + const promise = collected.length === 0 + ? CancellablePromise.resolve(collected) + : new CancellablePromise((resolve, reject) => { + void Promise.allSettled(collected).then(resolve, reject); + }, (cause) => cancelAll(promise, collected, cause)); + return promise; + } + static any(values) { + let collected = Array.from(values); + const promise = collected.length === 0 + ? CancellablePromise.resolve(collected) + : new CancellablePromise((resolve, reject) => { + void Promise.any(collected).then(resolve, reject); + }, (cause) => cancelAll(promise, collected, cause)); + return promise; + } + static race(values) { + let collected = Array.from(values); + const promise = new CancellablePromise((resolve, reject) => { + void Promise.race(collected).then(resolve, reject); + }, (cause) => cancelAll(promise, collected, cause)); + return promise; + } + /** + * Creates a new cancelled CancellablePromise for the provided cause. + * + * @group Static Methods + */ + static cancel(cause) { + const p = new CancellablePromise(() => { }); + p.cancel(cause); + return p; + } + /** + * Creates a new CancellablePromise that cancels + * after the specified timeout, with the provided cause. + * + * If the {@link AbortSignal.timeout} factory method is available, + * it is used to base the timeout on _active_ time rather than _elapsed_ time. + * Otherwise, `timeout` falls back to {@link setTimeout}. + * + * @group Static Methods + */ + static timeout(milliseconds, cause) { + const promise = new CancellablePromise(() => { }); + if (AbortSignal && typeof AbortSignal === 'function' && AbortSignal.timeout && typeof AbortSignal.timeout === 'function') { + AbortSignal.timeout(milliseconds).addEventListener('abort', () => void promise.cancel(cause)); + } + else { + setTimeout(() => void promise.cancel(cause), milliseconds); + } + return promise; + } + static sleep(milliseconds, value) { + return new CancellablePromise((resolve) => { + setTimeout(() => resolve(value), milliseconds); + }); + } + /** + * Creates a new rejected CancellablePromise for the provided reason. + * + * @group Static Methods + */ + static reject(reason) { + return new CancellablePromise((_, reject) => reject(reason)); + } + static resolve(value) { + if (value instanceof CancellablePromise) { + // Optimise for cancellable promises. + return value; + } + return new CancellablePromise((resolve) => resolve(value)); + } + /** + * Creates a new CancellablePromise and returns it in an object, along with its resolve and reject functions + * and a getter/setter for the cancellation callback. + * + * This method is polyfilled, hence available in every OS/webview version. + * + * @group Static Methods + */ + static withResolvers() { + let result = { oncancelled: null }; + result.promise = new CancellablePromise((resolve, reject) => { + result.resolve = resolve; + result.reject = reject; + }, (cause) => { var _a; (_a = result.oncancelled) === null || _a === void 0 ? void 0 : _a.call(result, cause); }); + return result; + } +} +/** + * Returns a callback that implements the cancellation algorithm for the given cancellable promise. + * The promise returned from the resulting function does not reject. + */ +function cancellerFor(promise, state) { + let cancellationPromise = undefined; + return (reason) => { + if (!state.settled) { + state.settled = true; + state.reason = reason; + promise.reject(reason); + // Attach an error handler that ignores this specific rejection reason and nothing else. + // In theory, a sane underlying implementation at this point + // should always reject with our cancellation reason, + // hence the handler will never throw. + void Promise.prototype.then.call(promise.promise, undefined, (err) => { + if (err !== reason) { + throw err; + } + }); + } + // If reason is not set, the promise resolved regularly, hence we must not call oncancelled. + // If oncancelled is unset, no need to go any further. + if (!state.reason || !promise.oncancelled) { + return; + } + cancellationPromise = new Promise((resolve) => { + try { + resolve(promise.oncancelled(state.reason.cause)); + } + catch (err) { + Promise.reject(new CancelledRejectionError(promise.promise, err, "Unhandled exception in oncancelled callback.")); + } + }).catch((reason) => { + Promise.reject(new CancelledRejectionError(promise.promise, reason, "Unhandled rejection in oncancelled callback.")); + }); + // Unset oncancelled to prevent repeated calls. + promise.oncancelled = null; + return cancellationPromise; + }; +} +/** + * Returns a callback that implements the resolution algorithm for the given cancellable promise. + */ +function resolverFor(promise, state) { + return (value) => { + if (state.resolving) { + return; + } + state.resolving = true; + if (value === promise.promise) { + if (state.settled) { + return; + } + state.settled = true; + promise.reject(new TypeError("A promise cannot be resolved with itself.")); + return; + } + if (value != null && (typeof value === 'object' || typeof value === 'function')) { + let then; + try { + then = value.then; + } + catch (err) { + state.settled = true; + promise.reject(err); + return; + } + if (isCallable(then)) { + try { + let cancel = value.cancel; + if (isCallable(cancel)) { + const oncancelled = (cause) => { + Reflect.apply(cancel, value, [cause]); + }; + if (state.reason) { + // If already cancelled, propagate cancellation. + // The promise returned from the canceller algorithm does not reject + // so it can be discarded safely. + void cancellerFor(Object.assign(Object.assign({}, promise), { oncancelled }), state)(state.reason); + } + else { + promise.oncancelled = oncancelled; + } + } + } + catch (_a) { } + const newState = { + root: state.root, + resolving: false, + get settled() { return this.root.settled; }, + set settled(value) { this.root.settled = value; }, + get reason() { return this.root.reason; } + }; + const rejector = rejectorFor(promise, newState); + try { + Reflect.apply(then, value, [resolverFor(promise, newState), rejector]); + } + catch (err) { + rejector(err); + } + return; // IMPORTANT! + } + } + if (state.settled) { + return; + } + state.settled = true; + promise.resolve(value); + }; +} +/** + * Returns a callback that implements the rejection algorithm for the given cancellable promise. + */ +function rejectorFor(promise, state) { + return (reason) => { + if (state.resolving) { + return; + } + state.resolving = true; + if (state.settled) { + try { + if (reason instanceof CancelError && state.reason instanceof CancelError && Object.is(reason.cause, state.reason.cause)) { + // Swallow late rejections that are CancelErrors whose cancellation cause is the same as ours. + return; + } + } + catch (_a) { } + void Promise.reject(new CancelledRejectionError(promise.promise, reason)); + } + else { + state.settled = true; + promise.reject(reason); + } + }; +} +/** + * Cancels all values in an array that look like cancellable thenables. + * Returns a promise that fulfills once all cancellation procedures for the given values have settled. + */ +function cancelAll(parent, values, cause) { + const results = []; + for (const value of values) { + let cancel; + try { + if (!isCallable(value.then)) { + continue; + } + cancel = value.cancel; + if (!isCallable(cancel)) { + continue; + } + } + catch (_a) { + continue; + } + let result; + try { + result = Reflect.apply(cancel, value, [cause]); + } + catch (err) { + Promise.reject(new CancelledRejectionError(parent, err, "Unhandled exception in cancel method.")); + continue; + } + if (!result) { + continue; + } + results.push((result instanceof Promise ? result : Promise.resolve(result)).catch((reason) => { + Promise.reject(new CancelledRejectionError(parent, reason, "Unhandled rejection in cancel method.")); + })); + } + return Promise.all(results); +} +/** + * Returns its argument. + */ +function identity(x) { + return x; +} +/** + * Throws its argument. + */ +function thrower(reason) { + throw reason; +} +/** + * Attempts various strategies to convert an error to a string. + */ +function errorMessage(err) { + try { + if (err instanceof Error || typeof err !== 'object' || err.toString !== Object.prototype.toString) { + return "" + err; + } + } + catch (_a) { } + try { + return JSON.stringify(err); + } + catch (_b) { } + try { + return Object.prototype.toString.call(err); + } + catch (_c) { } + return ""; +} +/** + * Gets the current barrier promise for the given cancellable promise. If necessary, initialises the barrier. + */ +function currentBarrier(promise) { + var _a; + let pwr = (_a = promise[barrierSym]) !== null && _a !== void 0 ? _a : {}; + if (!('promise' in pwr)) { + Object.assign(pwr, promiseWithResolvers()); + } + if (promise[barrierSym] == null) { + pwr.resolve(); + promise[barrierSym] = pwr; + } + return pwr.promise; +} +// Polyfill Promise.withResolvers. +let promiseWithResolvers = Promise.withResolvers; +if (promiseWithResolvers && typeof promiseWithResolvers === 'function') { + promiseWithResolvers = promiseWithResolvers.bind(Promise); +} +else { + promiseWithResolvers = function () { + let resolve; + let reject; + const promise = new Promise((res, rej) => { resolve = res; reject = rej; }); + return { promise, resolve, reject }; + }; +} diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/dist/clipboard.js b/v3/internal/runtime/desktop/@wailsio/runtime/dist/clipboard.js new file mode 100644 index 000000000..d579d4bb3 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/dist/clipboard.js @@ -0,0 +1,30 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ +import { newRuntimeCaller, objectNames } from "./runtime.js"; +const call = newRuntimeCaller(objectNames.Clipboard); +const ClipboardSetText = 0; +const ClipboardText = 1; +/** + * Sets the text to the Clipboard. + * + * @param text - The text to be set to the Clipboard. + * @return A Promise that resolves when the operation is successful. + */ +export function SetText(text) { + return call(ClipboardSetText, { text }); +} +/** + * Get the Clipboard text + * + * @returns A promise that resolves with the text from the Clipboard. + */ +export function Text() { + return call(ClipboardText); +} diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/dist/contextmenu.js b/v3/internal/runtime/desktop/@wailsio/runtime/dist/contextmenu.js new file mode 100644 index 000000000..1485c3aea --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/dist/contextmenu.js @@ -0,0 +1,80 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ +import { newRuntimeCaller, objectNames } from "./runtime.js"; +import { IsDebug } from "./system.js"; +import { eventTarget } from "./utils"; +// setup +window.addEventListener('contextmenu', contextMenuHandler); +const call = newRuntimeCaller(objectNames.ContextMenu); +const ContextMenuOpen = 0; +function openContextMenu(id, x, y, data) { + void call(ContextMenuOpen, { id, x, y, data }); +} +function contextMenuHandler(event) { + const target = eventTarget(event); + // Check for custom context menu + const customContextMenu = window.getComputedStyle(target).getPropertyValue("--custom-contextmenu").trim(); + if (customContextMenu) { + event.preventDefault(); + const data = window.getComputedStyle(target).getPropertyValue("--custom-contextmenu-data"); + openContextMenu(customContextMenu, event.clientX, event.clientY, data); + } + else { + processDefaultContextMenu(event, target); + } +} +/* +--default-contextmenu: auto; (default) will show the default context menu if contentEditable is true OR text has been selected OR element is input or textarea +--default-contextmenu: show; will always show the default context menu +--default-contextmenu: hide; will always hide the default context menu + +This rule is inherited like normal CSS rules, so nesting works as expected +*/ +function processDefaultContextMenu(event, target) { + // Debug builds always show the menu + if (IsDebug()) { + return; + } + // Process default context menu + switch (window.getComputedStyle(target).getPropertyValue("--default-contextmenu").trim()) { + case 'show': + return; + case 'hide': + event.preventDefault(); + return; + } + // Check if contentEditable is true + if (target.isContentEditable) { + return; + } + // Check if text has been selected + const selection = window.getSelection(); + const hasSelection = selection && selection.toString().length > 0; + if (hasSelection) { + for (let i = 0; i < selection.rangeCount; i++) { + const range = selection.getRangeAt(i); + const rects = range.getClientRects(); + for (let j = 0; j < rects.length; j++) { + const rect = rects[j]; + if (document.elementFromPoint(rect.left, rect.top) === target) { + return; + } + } + } + } + // Check if tag is input or textarea. + if (target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement) { + if (hasSelection || (!target.readOnly && !target.disabled)) { + return; + } + } + // hide default context menu + event.preventDefault(); +} diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/dist/create.js b/v3/internal/runtime/desktop/@wailsio/runtime/dist/create.js new file mode 100644 index 000000000..610362500 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/dist/create.js @@ -0,0 +1,94 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ +/** + * Any is a dummy creation function for simple or unknown types. + */ +export function Any(source) { + return source; +} +/** + * ByteSlice is a creation function that replaces + * null strings with empty strings. + */ +export function ByteSlice(source) { + return ((source == null) ? "" : source); +} +/** + * Array takes a creation function for an arbitrary type + * and returns an in-place creation function for an array + * whose elements are of that type. + */ +export function Array(element) { + if (element === Any) { + return (source) => (source === null ? [] : source); + } + return (source) => { + if (source === null) { + return []; + } + for (let i = 0; i < source.length; i++) { + source[i] = element(source[i]); + } + return source; + }; +} +/** + * Map takes creation functions for two arbitrary types + * and returns an in-place creation function for an object + * whose keys and values are of those types. + */ +export function Map(key, value) { + if (value === Any) { + return (source) => (source === null ? {} : source); + } + return (source) => { + if (source === null) { + return {}; + } + for (const key in source) { + source[key] = value(source[key]); + } + return source; + }; +} +/** + * Nullable takes a creation function for an arbitrary type + * and returns a creation function for a nullable value of that type. + */ +export function Nullable(element) { + if (element === Any) { + return Any; + } + return (source) => (source === null ? null : element(source)); +} +/** + * Struct takes an object mapping field names to creation functions + * and returns an in-place creation function for a struct. + */ +export function Struct(createField) { + let allAny = true; + for (const name in createField) { + if (createField[name] !== Any) { + allAny = false; + break; + } + } + if (allAny) { + return Any; + } + return (source) => { + for (const name in createField) { + if (name in source) { + source[name] = createField[name](source[name]); + } + } + return source; + }; +} diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/dist/dialogs.js b/v3/internal/runtime/desktop/@wailsio/runtime/dist/dialogs.js new file mode 100644 index 000000000..2cfa4751d --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/dist/dialogs.js @@ -0,0 +1,134 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ +import { newRuntimeCaller, objectNames } from "./runtime.js"; +import { nanoid } from './nanoid.js'; +// setup +window._wails = window._wails || {}; +window._wails.dialogErrorCallback = dialogErrorCallback; +window._wails.dialogResultCallback = dialogResultCallback; +const call = newRuntimeCaller(objectNames.Dialog); +const dialogResponses = new Map(); +// Define constants from the `methods` object in Title Case +const DialogInfo = 0; +const DialogWarning = 1; +const DialogError = 2; +const DialogQuestion = 3; +const DialogOpenFile = 4; +const DialogSaveFile = 5; +/** + * Handles the result of a dialog request. + * + * @param id - The id of the request to handle the result for. + * @param data - The result data of the request. + * @param isJSON - Indicates whether the data is JSON or not. + */ +function dialogResultCallback(id, data, isJSON) { + let resolvers = getAndDeleteResponse(id); + if (!resolvers) { + return; + } + if (isJSON) { + try { + resolvers.resolve(JSON.parse(data)); + } + catch (err) { + resolvers.reject(new TypeError("could not parse result: " + err.message, { cause: err })); + } + } + else { + resolvers.resolve(data); + } +} +/** + * Handles the error from a dialog request. + * + * @param id - The id of the promise handler. + * @param message - An error message. + */ +function dialogErrorCallback(id, message) { + var _a; + (_a = getAndDeleteResponse(id)) === null || _a === void 0 ? void 0 : _a.reject(new window.Error(message)); +} +/** + * Retrieves and removes the response associated with the given ID from the dialogResponses map. + * + * @param id - The ID of the response to be retrieved and removed. + * @returns The response object associated with the given ID, if any. + */ +function getAndDeleteResponse(id) { + const response = dialogResponses.get(id); + dialogResponses.delete(id); + return response; +} +/** + * Generates a unique ID using the nanoid library. + * + * @returns A unique ID that does not exist in the dialogResponses set. + */ +function generateID() { + let result; + do { + result = nanoid(); + } while (dialogResponses.has(result)); + return result; +} +/** + * Presents a dialog of specified type with the given options. + * + * @param type - Dialog type. + * @param options - Options for the dialog. + * @returns A promise that resolves with result of dialog. + */ +function dialog(type, options = {}) { + const id = generateID(); + return new Promise((resolve, reject) => { + dialogResponses.set(id, { resolve, reject }); + call(type, Object.assign({ "dialog-id": id }, options)).catch((err) => { + dialogResponses.delete(id); + reject(err); + }); + }); +} +/** + * Presents an info dialog. + * + * @param options - Dialog options + * @returns A promise that resolves with the label of the chosen button. + */ +export function Info(options) { return dialog(DialogInfo, options); } +/** + * Presents a warning dialog. + * + * @param options - Dialog options. + * @returns A promise that resolves with the label of the chosen button. + */ +export function Warning(options) { return dialog(DialogWarning, options); } +/** + * Presents an error dialog. + * + * @param options - Dialog options. + * @returns A promise that resolves with the label of the chosen button. + */ +export function Error(options) { return dialog(DialogError, options); } +/** + * Presents a question dialog. + * + * @param options - Dialog options. + * @returns A promise that resolves with the label of the chosen button. + */ +export function Question(options) { return dialog(DialogQuestion, options); } +export function OpenFile(options) { var _a; return (_a = dialog(DialogOpenFile, options)) !== null && _a !== void 0 ? _a : []; } +/** + * Presents a file selection dialog to pick a file to save. + * + * @param options - Dialog options. + * @returns Selected file, or a blank string if no file has been selected. + */ +export function SaveFile(options) { return dialog(DialogSaveFile, options); } diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/dist/drag.js b/v3/internal/runtime/desktop/@wailsio/runtime/dist/drag.js new file mode 100644 index 000000000..ae4ecc364 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/dist/drag.js @@ -0,0 +1,222 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ +import { invoke, IsWindows } from "./system.js"; +import { GetFlag } from "./flags.js"; +import { canTrackButtons, eventTarget } from "./utils.js"; +// Setup +let canDrag = false; +let dragging = false; +let resizable = false; +let canResize = false; +let resizing = false; +let resizeEdge = ""; +let defaultCursor = "auto"; +let buttons = 0; +const buttonsTracked = canTrackButtons(); +window._wails = window._wails || {}; +window._wails.setResizable = (value) => { + resizable = value; + if (!resizable) { + // Stop resizing if in progress. + canResize = resizing = false; + setResize(); + } +}; +window.addEventListener('mousedown', update, { capture: true }); +window.addEventListener('mousemove', update, { capture: true }); +window.addEventListener('mouseup', update, { capture: true }); +for (const ev of ['click', 'contextmenu', 'dblclick']) { + window.addEventListener(ev, suppressEvent, { capture: true }); +} +function suppressEvent(event) { + // Suppress click events while resizing or dragging. + if (dragging || resizing) { + event.stopImmediatePropagation(); + event.stopPropagation(); + event.preventDefault(); + } +} +// Use constants to avoid comparing strings multiple times. +const MouseDown = 0; +const MouseUp = 1; +const MouseMove = 2; +function update(event) { + // Windows suppresses mouse events at the end of dragging or resizing, + // so we need to be smart and synthesize button events. + let eventType, eventButtons = event.buttons; + switch (event.type) { + case 'mousedown': + eventType = MouseDown; + if (!buttonsTracked) { + eventButtons = buttons | (1 << event.button); + } + break; + case 'mouseup': + eventType = MouseUp; + if (!buttonsTracked) { + eventButtons = buttons & ~(1 << event.button); + } + break; + default: + eventType = MouseMove; + if (!buttonsTracked) { + eventButtons = buttons; + } + break; + } + let released = buttons & ~eventButtons; + let pressed = eventButtons & ~buttons; + buttons = eventButtons; + // Synthesize a release-press sequence if we detect a press of an already pressed button. + if (eventType === MouseDown && !(pressed & event.button)) { + released |= (1 << event.button); + pressed |= (1 << event.button); + } + // Suppress all button events during dragging and resizing, + // unless this is a mouseup event that is ending a drag action. + if (eventType !== MouseMove // Fast path for mousemove + && resizing + || (dragging + && (eventType === MouseDown + || event.button !== 0))) { + event.stopImmediatePropagation(); + event.stopPropagation(); + event.preventDefault(); + } + // Handle releases + if (released & 1) { + primaryUp(event); + } + // Handle presses + if (pressed & 1) { + primaryDown(event); + } + // Handle mousemove + if (eventType === MouseMove) { + onMouseMove(event); + } + ; +} +function primaryDown(event) { + // Reset readiness state. + canDrag = false; + canResize = false; + // Ignore repeated clicks on macOS and Linux. + if (!IsWindows()) { + if (event.type === 'mousedown' && event.button === 0 && event.detail !== 1) { + return; + } + } + if (resizeEdge) { + // Ready to resize if the primary button was pressed for the first time. + canResize = true; + // Do not start drag operations when on resize edges. + return; + } + // Retrieve target element + const target = eventTarget(event); + // Ready to drag if the primary button was pressed for the first time on a draggable element. + // Ignore clicks on the scrollbar. + const style = window.getComputedStyle(target); + canDrag = (style.getPropertyValue("--wails-draggable").trim() === "drag" + && (event.offsetX - parseFloat(style.paddingLeft) < target.clientWidth + && event.offsetY - parseFloat(style.paddingTop) < target.clientHeight)); +} +function primaryUp(event) { + // Stop dragging and resizing. + canDrag = false; + dragging = false; + canResize = false; + resizing = false; +} +const cursorForEdge = Object.freeze({ + "se-resize": "nwse-resize", + "sw-resize": "nesw-resize", + "nw-resize": "nwse-resize", + "ne-resize": "nesw-resize", + "w-resize": "ew-resize", + "n-resize": "ns-resize", + "s-resize": "ns-resize", + "e-resize": "ew-resize", +}); +function setResize(edge) { + if (edge) { + if (!resizeEdge) { + defaultCursor = document.body.style.cursor; + } + document.body.style.cursor = cursorForEdge[edge]; + } + else if (!edge && resizeEdge) { + document.body.style.cursor = defaultCursor; + } + resizeEdge = edge || ""; +} +function onMouseMove(event) { + if (canResize && resizeEdge) { + // Start resizing. + resizing = true; + invoke("wails:resize:" + resizeEdge); + } + else if (canDrag) { + // Start dragging. + dragging = true; + invoke("wails:drag"); + } + if (dragging || resizing) { + // Either drag or resize is ongoing, + // reset readiness and stop processing. + canDrag = canResize = false; + return; + } + if (!resizable || !IsWindows()) { + if (resizeEdge) { + setResize(); + } + return; + } + const resizeHandleHeight = GetFlag("system.resizeHandleHeight") || 5; + const resizeHandleWidth = GetFlag("system.resizeHandleWidth") || 5; + // Extra pixels for the corner areas. + const cornerExtra = GetFlag("resizeCornerExtra") || 10; + const rightBorder = (window.outerWidth - event.clientX) < resizeHandleWidth; + const leftBorder = event.clientX < resizeHandleWidth; + const topBorder = event.clientY < resizeHandleHeight; + const bottomBorder = (window.outerHeight - event.clientY) < resizeHandleHeight; + // Adjust for corner areas. + const rightCorner = (window.outerWidth - event.clientX) < (resizeHandleWidth + cornerExtra); + const leftCorner = event.clientX < (resizeHandleWidth + cornerExtra); + const topCorner = event.clientY < (resizeHandleHeight + cornerExtra); + const bottomCorner = (window.outerHeight - event.clientY) < (resizeHandleHeight + cornerExtra); + if (!leftCorner && !topCorner && !bottomCorner && !rightCorner) { + // Optimisation: out of all corner areas implies out of borders. + setResize(); + } + // Detect corners. + else if (rightCorner && bottomCorner) + setResize("se-resize"); + else if (leftCorner && bottomCorner) + setResize("sw-resize"); + else if (leftCorner && topCorner) + setResize("nw-resize"); + else if (topCorner && rightCorner) + setResize("ne-resize"); + // Detect borders. + else if (leftBorder) + setResize("w-resize"); + else if (topBorder) + setResize("n-resize"); + else if (bottomBorder) + setResize("s-resize"); + else if (rightBorder) + setResize("e-resize"); + // Out of border area. + else + setResize(); +} diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/dist/event_types.js b/v3/internal/runtime/desktop/@wailsio/runtime/dist/event_types.js new file mode 100644 index 000000000..6cf95d629 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/dist/event_types.js @@ -0,0 +1,229 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT +export const Types = Object.freeze({ + Windows: Object.freeze({ + APMPowerSettingChange: "windows:APMPowerSettingChange", + APMPowerStatusChange: "windows:APMPowerStatusChange", + APMResumeAutomatic: "windows:APMResumeAutomatic", + APMResumeSuspend: "windows:APMResumeSuspend", + APMSuspend: "windows:APMSuspend", + ApplicationStarted: "windows:ApplicationStarted", + SystemThemeChanged: "windows:SystemThemeChanged", + WebViewNavigationCompleted: "windows:WebViewNavigationCompleted", + WindowActive: "windows:WindowActive", + WindowBackgroundErase: "windows:WindowBackgroundErase", + WindowClickActive: "windows:WindowClickActive", + WindowClosing: "windows:WindowClosing", + WindowDidMove: "windows:WindowDidMove", + WindowDidResize: "windows:WindowDidResize", + WindowDPIChanged: "windows:WindowDPIChanged", + WindowDragDrop: "windows:WindowDragDrop", + WindowDragEnter: "windows:WindowDragEnter", + WindowDragLeave: "windows:WindowDragLeave", + WindowDragOver: "windows:WindowDragOver", + WindowEndMove: "windows:WindowEndMove", + WindowEndResize: "windows:WindowEndResize", + WindowFullscreen: "windows:WindowFullscreen", + WindowHide: "windows:WindowHide", + WindowInactive: "windows:WindowInactive", + WindowKeyDown: "windows:WindowKeyDown", + WindowKeyUp: "windows:WindowKeyUp", + WindowKillFocus: "windows:WindowKillFocus", + WindowNonClientHit: "windows:WindowNonClientHit", + WindowNonClientMouseDown: "windows:WindowNonClientMouseDown", + WindowNonClientMouseLeave: "windows:WindowNonClientMouseLeave", + WindowNonClientMouseMove: "windows:WindowNonClientMouseMove", + WindowNonClientMouseUp: "windows:WindowNonClientMouseUp", + WindowPaint: "windows:WindowPaint", + WindowRestore: "windows:WindowRestore", + WindowSetFocus: "windows:WindowSetFocus", + WindowShow: "windows:WindowShow", + WindowStartMove: "windows:WindowStartMove", + WindowStartResize: "windows:WindowStartResize", + WindowUnFullscreen: "windows:WindowUnFullscreen", + WindowZOrderChanged: "windows:WindowZOrderChanged", + WindowMinimise: "windows:WindowMinimise", + WindowUnMinimise: "windows:WindowUnMinimise", + WindowMaximise: "windows:WindowMaximise", + WindowUnMaximise: "windows:WindowUnMaximise", + }), + Mac: Object.freeze({ + ApplicationDidBecomeActive: "mac:ApplicationDidBecomeActive", + ApplicationDidChangeBackingProperties: "mac:ApplicationDidChangeBackingProperties", + ApplicationDidChangeEffectiveAppearance: "mac:ApplicationDidChangeEffectiveAppearance", + ApplicationDidChangeIcon: "mac:ApplicationDidChangeIcon", + ApplicationDidChangeOcclusionState: "mac:ApplicationDidChangeOcclusionState", + ApplicationDidChangeScreenParameters: "mac:ApplicationDidChangeScreenParameters", + ApplicationDidChangeStatusBarFrame: "mac:ApplicationDidChangeStatusBarFrame", + ApplicationDidChangeStatusBarOrientation: "mac:ApplicationDidChangeStatusBarOrientation", + ApplicationDidChangeTheme: "mac:ApplicationDidChangeTheme", + ApplicationDidFinishLaunching: "mac:ApplicationDidFinishLaunching", + ApplicationDidHide: "mac:ApplicationDidHide", + ApplicationDidResignActive: "mac:ApplicationDidResignActive", + ApplicationDidUnhide: "mac:ApplicationDidUnhide", + ApplicationDidUpdate: "mac:ApplicationDidUpdate", + ApplicationShouldHandleReopen: "mac:ApplicationShouldHandleReopen", + ApplicationWillBecomeActive: "mac:ApplicationWillBecomeActive", + ApplicationWillFinishLaunching: "mac:ApplicationWillFinishLaunching", + ApplicationWillHide: "mac:ApplicationWillHide", + ApplicationWillResignActive: "mac:ApplicationWillResignActive", + ApplicationWillTerminate: "mac:ApplicationWillTerminate", + ApplicationWillUnhide: "mac:ApplicationWillUnhide", + ApplicationWillUpdate: "mac:ApplicationWillUpdate", + MenuDidAddItem: "mac:MenuDidAddItem", + MenuDidBeginTracking: "mac:MenuDidBeginTracking", + MenuDidClose: "mac:MenuDidClose", + MenuDidDisplayItem: "mac:MenuDidDisplayItem", + MenuDidEndTracking: "mac:MenuDidEndTracking", + MenuDidHighlightItem: "mac:MenuDidHighlightItem", + MenuDidOpen: "mac:MenuDidOpen", + MenuDidPopUp: "mac:MenuDidPopUp", + MenuDidRemoveItem: "mac:MenuDidRemoveItem", + MenuDidSendAction: "mac:MenuDidSendAction", + MenuDidSendActionToItem: "mac:MenuDidSendActionToItem", + MenuDidUpdate: "mac:MenuDidUpdate", + MenuWillAddItem: "mac:MenuWillAddItem", + MenuWillBeginTracking: "mac:MenuWillBeginTracking", + MenuWillDisplayItem: "mac:MenuWillDisplayItem", + MenuWillEndTracking: "mac:MenuWillEndTracking", + MenuWillHighlightItem: "mac:MenuWillHighlightItem", + MenuWillOpen: "mac:MenuWillOpen", + MenuWillPopUp: "mac:MenuWillPopUp", + MenuWillRemoveItem: "mac:MenuWillRemoveItem", + MenuWillSendAction: "mac:MenuWillSendAction", + MenuWillSendActionToItem: "mac:MenuWillSendActionToItem", + MenuWillUpdate: "mac:MenuWillUpdate", + WebViewDidCommitNavigation: "mac:WebViewDidCommitNavigation", + WebViewDidFinishNavigation: "mac:WebViewDidFinishNavigation", + WebViewDidReceiveServerRedirectForProvisionalNavigation: "mac:WebViewDidReceiveServerRedirectForProvisionalNavigation", + WebViewDidStartProvisionalNavigation: "mac:WebViewDidStartProvisionalNavigation", + WindowDidBecomeKey: "mac:WindowDidBecomeKey", + WindowDidBecomeMain: "mac:WindowDidBecomeMain", + WindowDidBeginSheet: "mac:WindowDidBeginSheet", + WindowDidChangeAlpha: "mac:WindowDidChangeAlpha", + WindowDidChangeBackingLocation: "mac:WindowDidChangeBackingLocation", + WindowDidChangeBackingProperties: "mac:WindowDidChangeBackingProperties", + WindowDidChangeCollectionBehavior: "mac:WindowDidChangeCollectionBehavior", + WindowDidChangeEffectiveAppearance: "mac:WindowDidChangeEffectiveAppearance", + WindowDidChangeOcclusionState: "mac:WindowDidChangeOcclusionState", + WindowDidChangeOrderingMode: "mac:WindowDidChangeOrderingMode", + WindowDidChangeScreen: "mac:WindowDidChangeScreen", + WindowDidChangeScreenParameters: "mac:WindowDidChangeScreenParameters", + WindowDidChangeScreenProfile: "mac:WindowDidChangeScreenProfile", + WindowDidChangeScreenSpace: "mac:WindowDidChangeScreenSpace", + WindowDidChangeScreenSpaceProperties: "mac:WindowDidChangeScreenSpaceProperties", + WindowDidChangeSharingType: "mac:WindowDidChangeSharingType", + WindowDidChangeSpace: "mac:WindowDidChangeSpace", + WindowDidChangeSpaceOrderingMode: "mac:WindowDidChangeSpaceOrderingMode", + WindowDidChangeTitle: "mac:WindowDidChangeTitle", + WindowDidChangeToolbar: "mac:WindowDidChangeToolbar", + WindowDidDeminiaturize: "mac:WindowDidDeminiaturize", + WindowDidEndSheet: "mac:WindowDidEndSheet", + WindowDidEnterFullScreen: "mac:WindowDidEnterFullScreen", + WindowDidEnterVersionBrowser: "mac:WindowDidEnterVersionBrowser", + WindowDidExitFullScreen: "mac:WindowDidExitFullScreen", + WindowDidExitVersionBrowser: "mac:WindowDidExitVersionBrowser", + WindowDidExpose: "mac:WindowDidExpose", + WindowDidFocus: "mac:WindowDidFocus", + WindowDidMiniaturize: "mac:WindowDidMiniaturize", + WindowDidMove: "mac:WindowDidMove", + WindowDidOrderOffScreen: "mac:WindowDidOrderOffScreen", + WindowDidOrderOnScreen: "mac:WindowDidOrderOnScreen", + WindowDidResignKey: "mac:WindowDidResignKey", + WindowDidResignMain: "mac:WindowDidResignMain", + WindowDidResize: "mac:WindowDidResize", + WindowDidUpdate: "mac:WindowDidUpdate", + WindowDidUpdateAlpha: "mac:WindowDidUpdateAlpha", + WindowDidUpdateCollectionBehavior: "mac:WindowDidUpdateCollectionBehavior", + WindowDidUpdateCollectionProperties: "mac:WindowDidUpdateCollectionProperties", + WindowDidUpdateShadow: "mac:WindowDidUpdateShadow", + WindowDidUpdateTitle: "mac:WindowDidUpdateTitle", + WindowDidUpdateToolbar: "mac:WindowDidUpdateToolbar", + WindowDidZoom: "mac:WindowDidZoom", + WindowFileDraggingEntered: "mac:WindowFileDraggingEntered", + WindowFileDraggingExited: "mac:WindowFileDraggingExited", + WindowFileDraggingPerformed: "mac:WindowFileDraggingPerformed", + WindowHide: "mac:WindowHide", + WindowMaximise: "mac:WindowMaximise", + WindowUnMaximise: "mac:WindowUnMaximise", + WindowMinimise: "mac:WindowMinimise", + WindowUnMinimise: "mac:WindowUnMinimise", + WindowShouldClose: "mac:WindowShouldClose", + WindowShow: "mac:WindowShow", + WindowWillBecomeKey: "mac:WindowWillBecomeKey", + WindowWillBecomeMain: "mac:WindowWillBecomeMain", + WindowWillBeginSheet: "mac:WindowWillBeginSheet", + WindowWillChangeOrderingMode: "mac:WindowWillChangeOrderingMode", + WindowWillClose: "mac:WindowWillClose", + WindowWillDeminiaturize: "mac:WindowWillDeminiaturize", + WindowWillEnterFullScreen: "mac:WindowWillEnterFullScreen", + WindowWillEnterVersionBrowser: "mac:WindowWillEnterVersionBrowser", + WindowWillExitFullScreen: "mac:WindowWillExitFullScreen", + WindowWillExitVersionBrowser: "mac:WindowWillExitVersionBrowser", + WindowWillFocus: "mac:WindowWillFocus", + WindowWillMiniaturize: "mac:WindowWillMiniaturize", + WindowWillMove: "mac:WindowWillMove", + WindowWillOrderOffScreen: "mac:WindowWillOrderOffScreen", + WindowWillOrderOnScreen: "mac:WindowWillOrderOnScreen", + WindowWillResignMain: "mac:WindowWillResignMain", + WindowWillResize: "mac:WindowWillResize", + WindowWillUnfocus: "mac:WindowWillUnfocus", + WindowWillUpdate: "mac:WindowWillUpdate", + WindowWillUpdateAlpha: "mac:WindowWillUpdateAlpha", + WindowWillUpdateCollectionBehavior: "mac:WindowWillUpdateCollectionBehavior", + WindowWillUpdateCollectionProperties: "mac:WindowWillUpdateCollectionProperties", + WindowWillUpdateShadow: "mac:WindowWillUpdateShadow", + WindowWillUpdateTitle: "mac:WindowWillUpdateTitle", + WindowWillUpdateToolbar: "mac:WindowWillUpdateToolbar", + WindowWillUpdateVisibility: "mac:WindowWillUpdateVisibility", + WindowWillUseStandardFrame: "mac:WindowWillUseStandardFrame", + WindowZoomIn: "mac:WindowZoomIn", + WindowZoomOut: "mac:WindowZoomOut", + WindowZoomReset: "mac:WindowZoomReset", + }), + Linux: Object.freeze({ + ApplicationStartup: "linux:ApplicationStartup", + SystemThemeChanged: "linux:SystemThemeChanged", + WindowDeleteEvent: "linux:WindowDeleteEvent", + WindowDidMove: "linux:WindowDidMove", + WindowDidResize: "linux:WindowDidResize", + WindowFocusIn: "linux:WindowFocusIn", + WindowFocusOut: "linux:WindowFocusOut", + WindowLoadChanged: "linux:WindowLoadChanged", + }), + Common: Object.freeze({ + ApplicationOpenedWithFile: "common:ApplicationOpenedWithFile", + ApplicationStarted: "common:ApplicationStarted", + ThemeChanged: "common:ThemeChanged", + WindowClosing: "common:WindowClosing", + WindowDidMove: "common:WindowDidMove", + WindowDidResize: "common:WindowDidResize", + WindowDPIChanged: "common:WindowDPIChanged", + WindowFilesDropped: "common:WindowFilesDropped", + WindowFocus: "common:WindowFocus", + WindowFullscreen: "common:WindowFullscreen", + WindowHide: "common:WindowHide", + WindowLostFocus: "common:WindowLostFocus", + WindowMaximise: "common:WindowMaximise", + WindowMinimise: "common:WindowMinimise", + WindowRestore: "common:WindowRestore", + WindowRuntimeReady: "common:WindowRuntimeReady", + WindowShow: "common:WindowShow", + WindowUnFullscreen: "common:WindowUnFullscreen", + WindowUnMaximise: "common:WindowUnMaximise", + WindowUnMinimise: "common:WindowUnMinimise", + WindowZoom: "common:WindowZoom", + WindowZoomIn: "common:WindowZoomIn", + WindowZoomOut: "common:WindowZoomOut", + WindowZoomReset: "common:WindowZoomReset", + }), +}); diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/dist/events.js b/v3/internal/runtime/desktop/@wailsio/runtime/dist/events.js new file mode 100644 index 000000000..ba8b2d36c --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/dist/events.js @@ -0,0 +1,101 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ +import { newRuntimeCaller, objectNames } from "./runtime.js"; +import { eventListeners, Listener, listenerOff } from "./listener.js"; +// Setup +window._wails = window._wails || {}; +window._wails.dispatchWailsEvent = dispatchWailsEvent; +const call = newRuntimeCaller(objectNames.Events); +const EmitMethod = 0; +export { Types } from "./event_types.js"; +/** + * Represents a system event or a custom event emitted through wails-provided facilities. + */ +export class WailsEvent { + constructor(name, data = null) { + this.name = name; + this.data = data; + } +} +function dispatchWailsEvent(event) { + let listeners = eventListeners.get(event.name); + if (!listeners) { + return; + } + let wailsEvent = new WailsEvent(event.name, event.data); + if ('sender' in event) { + wailsEvent.sender = event.sender; + } + listeners = listeners.filter(listener => !listener.dispatch(wailsEvent)); + if (listeners.length === 0) { + eventListeners.delete(event.name); + } + else { + eventListeners.set(event.name, listeners); + } +} +/** + * Register a callback function to be called multiple times for a specific event. + * + * @param eventName - The name of the event to register the callback for. + * @param callback - The callback function to be called when the event is triggered. + * @param maxCallbacks - The maximum number of times the callback can be called for the event. Once the maximum number is reached, the callback will no longer be called. + * @returns A function that, when called, will unregister the callback from the event. + */ +export function OnMultiple(eventName, callback, maxCallbacks) { + let listeners = eventListeners.get(eventName) || []; + const thisListener = new Listener(eventName, callback, maxCallbacks); + listeners.push(thisListener); + eventListeners.set(eventName, listeners); + return () => listenerOff(thisListener); +} +/** + * Registers a callback function to be executed when the specified event occurs. + * + * @param eventName - The name of the event to register the callback for. + * @param callback - The callback function to be called when the event is triggered. + * @returns A function that, when called, will unregister the callback from the event. + */ +export function On(eventName, callback) { + return OnMultiple(eventName, callback, -1); +} +/** + * Registers a callback function to be executed only once for the specified event. + * + * @param eventName - The name of the event to register the callback for. + * @param callback - The callback function to be called when the event is triggered. + * @returns A function that, when called, will unregister the callback from the event. + */ +export function Once(eventName, callback) { + return OnMultiple(eventName, callback, 1); +} +/** + * Removes event listeners for the specified event names. + * + * @param eventNames - The name of the events to remove listeners for. + */ +export function Off(...eventNames) { + eventNames.forEach(eventName => eventListeners.delete(eventName)); +} +/** + * Removes all event listeners. + */ +export function OffAll() { + eventListeners.clear(); +} +/** + * Emits the given event. + * + * @param event - The name of the event to emit. + * @returns A promise that will be fulfilled once the event has been emitted. + */ +export function Emit(event) { + return call(EmitMethod, event); +} diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/dist/flags.js b/v3/internal/runtime/desktop/@wailsio/runtime/dist/flags.js new file mode 100644 index 000000000..31071c28d --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/dist/flags.js @@ -0,0 +1,23 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ +/** + * Retrieves the value associated with the specified key from the flag map. + * + * @param key - The key to retrieve the value for. + * @return The value associated with the specified key. + */ +export function GetFlag(key) { + try { + return window._wails.flags[key]; + } + catch (e) { + throw new Error("Unable to retrieve flag '" + key + "': " + e, { cause: e }); + } +} diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/dist/index.js b/v3/internal/runtime/desktop/@wailsio/runtime/dist/index.js new file mode 100644 index 000000000..34f741b89 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/dist/index.js @@ -0,0 +1,38 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ +// Setup +window._wails = window._wails || {}; +import "./contextmenu.js"; +import "./drag.js"; +// Re-export public API +import * as Application from "./application.js"; +import * as Browser from "./browser.js"; +import * as Call from "./calls.js"; +import * as Clipboard from "./clipboard.js"; +import * as Create from "./create.js"; +import * as Dialogs from "./dialogs.js"; +import * as Events from "./events.js"; +import * as Flags from "./flags.js"; +import * as Screens from "./screens.js"; +import * as System from "./system.js"; +import Window from "./window.js"; +import * as WML from "./wml.js"; +export { Application, Browser, Call, Clipboard, Dialogs, Events, Flags, Screens, System, Window, WML }; +/** + * An internal utility consumed by the binding generator. + * + * @ignore + * @internal + */ +export { Create }; +export * from "./cancellable.js"; +// Notify backend +window._wails.invoke = System.invoke; +System.invoke("wails:runtime:ready"); diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/dist/listener.js b/v3/internal/runtime/desktop/@wailsio/runtime/dist/listener.js new file mode 100644 index 000000000..960408867 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/dist/listener.js @@ -0,0 +1,44 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ +// The following utilities have been factored out of ./events.ts +// for testing purposes. +export const eventListeners = new Map(); +export class Listener { + constructor(eventName, callback, maxCallbacks) { + this.eventName = eventName; + this.callback = callback; + this.maxCallbacks = maxCallbacks || -1; + } + dispatch(data) { + try { + this.callback(data); + } + catch (err) { + console.error(err); + } + if (this.maxCallbacks === -1) + return false; + this.maxCallbacks -= 1; + return this.maxCallbacks === 0; + } +} +export function listenerOff(listener) { + let listeners = eventListeners.get(listener.eventName); + if (!listeners) { + return; + } + listeners = listeners.filter(l => l !== listener); + if (listeners.length === 0) { + eventListeners.delete(listener.eventName); + } + else { + eventListeners.set(listener.eventName, listeners); + } +} diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/dist/nanoid.js b/v3/internal/runtime/desktop/@wailsio/runtime/dist/nanoid.js new file mode 100644 index 000000000..c0d5e2411 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/dist/nanoid.js @@ -0,0 +1,38 @@ +// Source: https://github.com/ai/nanoid +// The MIT License (MIT) +// +// Copyright 2017 Andrey Sitnik +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// This alphabet uses `A-Za-z0-9_-` symbols. +// The order of characters is optimized for better gzip and brotli compression. +// References to the same file (works both for gzip and brotli): +// `'use`, `andom`, and `rict'` +// References to the brotli default dictionary: +// `-26T`, `1983`, `40px`, `75px`, `bush`, `jack`, `mind`, `very`, and `wolf` +const urlAlphabet = 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'; +export function nanoid(size = 21) { + let id = ''; + // A compact alternative for `for (var i = 0; i < step; i++)`. + let i = size | 0; + while (i--) { + // `| 0` is more compact and faster than `Math.floor()`. + id += urlAlphabet[(Math.random() * 64) | 0]; + } + return id; +} diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/dist/runtime.js b/v3/internal/runtime/desktop/@wailsio/runtime/dist/runtime.js new file mode 100644 index 000000000..f11df1c2e --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/dist/runtime.js @@ -0,0 +1,63 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ +import { nanoid } from './nanoid.js'; +const runtimeURL = window.location.origin + "/wails/runtime"; +// Object Names +export const objectNames = Object.freeze({ + Call: 0, + Clipboard: 1, + Application: 2, + Events: 3, + ContextMenu: 4, + Dialog: 5, + Window: 6, + Screens: 7, + System: 8, + Browser: 9, + CancelCall: 10, +}); +export let clientId = nanoid(); +/** + * Creates a new runtime caller with specified ID. + * + * @param object - The object to invoke the method on. + * @param windowName - The name of the window. + * @return The new runtime caller function. + */ +export function newRuntimeCaller(object, windowName = '') { + return function (method, args = null) { + return runtimeCallWithID(object, method, windowName, args); + }; +} +async function runtimeCallWithID(objectID, method, windowName, args) { + var _a, _b; + let url = new URL(runtimeURL); + url.searchParams.append("object", objectID.toString()); + url.searchParams.append("method", method.toString()); + if (args) { + url.searchParams.append("args", JSON.stringify(args)); + } + let headers = { + ["x-wails-client-id"]: clientId + }; + if (windowName) { + headers["x-wails-window-name"] = windowName; + } + let response = await fetch(url, { headers }); + if (!response.ok) { + throw new Error(await response.text()); + } + if (((_b = (_a = response.headers.get("Content-Type")) === null || _a === void 0 ? void 0 : _a.indexOf("application/json")) !== null && _b !== void 0 ? _b : -1) !== -1) { + return response.json(); + } + else { + return response.text(); + } +} diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/dist/screens.js b/v3/internal/runtime/desktop/@wailsio/runtime/dist/screens.js new file mode 100644 index 000000000..b09dc581d --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/dist/screens.js @@ -0,0 +1,38 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ +import { newRuntimeCaller, objectNames } from "./runtime.js"; +const call = newRuntimeCaller(objectNames.Screens); +const getAll = 0; +const getPrimary = 1; +const getCurrent = 2; +/** + * Gets all screens. + * + * @returns A promise that resolves to an array of Screen objects. + */ +export function GetAll() { + return call(getAll); +} +/** + * Gets the primary screen. + * + * @returns A promise that resolves to the primary screen. + */ +export function GetPrimary() { + return call(getPrimary); +} +/** + * Gets the current active screen. + * + * @returns A promise that resolves with the current active screen. + */ +export function GetCurrent() { + return call(getCurrent); +} diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/dist/system.js b/v3/internal/runtime/desktop/@wailsio/runtime/dist/system.js new file mode 100644 index 000000000..4d51cf8a4 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/dist/system.js @@ -0,0 +1,116 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ +import { newRuntimeCaller, objectNames } from "./runtime.js"; +const call = newRuntimeCaller(objectNames.System); +const SystemIsDarkMode = 0; +const SystemEnvironment = 1; +const _invoke = (function () { + var _a, _b, _c, _d, _e; + try { + if ((_b = (_a = window.chrome) === null || _a === void 0 ? void 0 : _a.webview) === null || _b === void 0 ? void 0 : _b.postMessage) { + return window.chrome.webview.postMessage.bind(window.chrome.webview); + } + else if ((_e = (_d = (_c = window.webkit) === null || _c === void 0 ? void 0 : _c.messageHandlers) === null || _d === void 0 ? void 0 : _d['external']) === null || _e === void 0 ? void 0 : _e.postMessage) { + return window.webkit.messageHandlers['external'].postMessage.bind(window.webkit.messageHandlers['external']); + } + } + catch (e) { } + console.warn('\n%c⚠️ Browser Environment Detected %c\n\n%cOnly UI previews are available in the browser. For full functionality, please run the application in desktop mode.\nMore information at: https://v3.wails.io/learn/build/#using-a-browser-for-development\n', 'background: #ffffff; color: #000000; font-weight: bold; padding: 4px 8px; border-radius: 4px; border: 2px solid #000000;', 'background: transparent;', 'color: #ffffff; font-style: italic; font-weight: bold;'); + return null; +})(); +export function invoke(msg) { + _invoke === null || _invoke === void 0 ? void 0 : _invoke(msg); +} +/** + * Retrieves the system dark mode status. + * + * @returns A promise that resolves to a boolean value indicating if the system is in dark mode. + */ +export function IsDarkMode() { + return call(SystemIsDarkMode); +} +/** + * Fetches the capabilities of the application from the server. + * + * @returns A promise that resolves to an object containing the capabilities. + */ +export async function Capabilities() { + let response = await fetch("/wails/capabilities"); + if (response.ok) { + return response.json(); + } + else { + throw new Error("could not fetch capabilities: " + response.statusText); + } +} +/** + * Retrieves environment details. + * + * @returns A promise that resolves to an object containing OS and system architecture. + */ +export function Environment() { + return call(SystemEnvironment); +} +/** + * Checks if the current operating system is Windows. + * + * @return True if the operating system is Windows, otherwise false. + */ +export function IsWindows() { + return window._wails.environment.OS === "windows"; +} +/** + * Checks if the current operating system is Linux. + * + * @returns Returns true if the current operating system is Linux, false otherwise. + */ +export function IsLinux() { + return window._wails.environment.OS === "linux"; +} +/** + * Checks if the current environment is a macOS operating system. + * + * @returns True if the environment is macOS, false otherwise. + */ +export function IsMac() { + return window._wails.environment.OS === "darwin"; +} +/** + * Checks if the current environment architecture is AMD64. + * + * @returns True if the current environment architecture is AMD64, false otherwise. + */ +export function IsAMD64() { + return window._wails.environment.Arch === "amd64"; +} +/** + * Checks if the current architecture is ARM. + * + * @returns True if the current architecture is ARM, false otherwise. + */ +export function IsARM() { + return window._wails.environment.Arch === "arm"; +} +/** + * Checks if the current environment is ARM64 architecture. + * + * @returns Returns true if the environment is ARM64 architecture, otherwise returns false. + */ +export function IsARM64() { + return window._wails.environment.Arch === "arm64"; +} +/** + * Reports whether the app is being run in debug mode. + * + * @returns True if the app is being run in debug mode. + */ +export function IsDebug() { + return Boolean(window._wails.environment.Debug); +} diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/dist/utils.js b/v3/internal/runtime/desktop/@wailsio/runtime/dist/utils.js new file mode 100644 index 000000000..4752828c8 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/dist/utils.js @@ -0,0 +1,95 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ +/** + * Logs a message to the console with custom formatting. + * + * @param message - The message to be logged. + */ +export function debugLog(message) { + // eslint-disable-next-line + console.log('%c wails3 %c ' + message + ' ', 'background: #aa0000; color: #fff; border-radius: 3px 0px 0px 3px; padding: 1px; font-size: 0.7rem', 'background: #009900; color: #fff; border-radius: 0px 3px 3px 0px; padding: 1px; font-size: 0.7rem'); +} +/** + * Checks whether the webview supports the {@link MouseEvent#buttons} property. + * Looking at you macOS High Sierra! + */ +export function canTrackButtons() { + return (new MouseEvent('mousedown')).buttons === 0; +} +/** + * Checks whether the browser supports removing listeners by triggering an AbortSignal + * (see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#signal). + */ +export function canAbortListeners() { + if (!EventTarget || !AbortSignal || !AbortController) + return false; + let result = true; + const target = new EventTarget(); + const controller = new AbortController(); + target.addEventListener('test', () => { result = false; }, { signal: controller.signal }); + controller.abort(); + target.dispatchEvent(new CustomEvent('test')); + return result; +} +/** + * Resolves the closest HTMLElement ancestor of an event's target. + */ +export function eventTarget(event) { + var _a; + if (event.target instanceof HTMLElement) { + return event.target; + } + else if (!(event.target instanceof HTMLElement) && event.target instanceof Node) { + return (_a = event.target.parentElement) !== null && _a !== void 0 ? _a : document.body; + } + else { + return document.body; + } +} +/*** + This technique for proper load detection is taken from HTMX: + + BSD 2-Clause License + + Copyright (c) 2020, Big Sky Software + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + ***/ +let isReady = false; +document.addEventListener('DOMContentLoaded', () => { isReady = true; }); +export function whenReady(callback) { + if (isReady || document.readyState === 'complete') { + callback(); + } + else { + document.addEventListener('DOMContentLoaded', callback); + } +} diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/dist/window.js b/v3/internal/runtime/desktop/@wailsio/runtime/dist/window.js new file mode 100644 index 000000000..c44d1ee71 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/dist/window.js @@ -0,0 +1,438 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ +import { newRuntimeCaller, objectNames } from "./runtime.js"; +const PositionMethod = 0; +const CenterMethod = 1; +const CloseMethod = 2; +const DisableSizeConstraintsMethod = 3; +const EnableSizeConstraintsMethod = 4; +const FocusMethod = 5; +const ForceReloadMethod = 6; +const FullscreenMethod = 7; +const GetScreenMethod = 8; +const GetZoomMethod = 9; +const HeightMethod = 10; +const HideMethod = 11; +const IsFocusedMethod = 12; +const IsFullscreenMethod = 13; +const IsMaximisedMethod = 14; +const IsMinimisedMethod = 15; +const MaximiseMethod = 16; +const MinimiseMethod = 17; +const NameMethod = 18; +const OpenDevToolsMethod = 19; +const RelativePositionMethod = 20; +const ReloadMethod = 21; +const ResizableMethod = 22; +const RestoreMethod = 23; +const SetPositionMethod = 24; +const SetAlwaysOnTopMethod = 25; +const SetBackgroundColourMethod = 26; +const SetFramelessMethod = 27; +const SetFullscreenButtonEnabledMethod = 28; +const SetMaxSizeMethod = 29; +const SetMinSizeMethod = 30; +const SetRelativePositionMethod = 31; +const SetResizableMethod = 32; +const SetSizeMethod = 33; +const SetTitleMethod = 34; +const SetZoomMethod = 35; +const ShowMethod = 36; +const SizeMethod = 37; +const ToggleFullscreenMethod = 38; +const ToggleMaximiseMethod = 39; +const UnFullscreenMethod = 40; +const UnMaximiseMethod = 41; +const UnMinimiseMethod = 42; +const WidthMethod = 43; +const ZoomMethod = 44; +const ZoomInMethod = 45; +const ZoomOutMethod = 46; +const ZoomResetMethod = 47; +// Private field names. +const callerSym = Symbol("caller"); +class Window { + /** + * Initialises a window object with the specified name. + * + * @private + * @param name - The name of the target window. + */ + constructor(name = '') { + this[callerSym] = newRuntimeCaller(objectNames.Window, name); + // bind instance method to make them easily usable in event handlers + for (const method of Object.getOwnPropertyNames(Window.prototype)) { + if (method !== "constructor" + && typeof this[method] === "function") { + this[method] = this[method].bind(this); + } + } + } + /** + * Gets the specified window. + * + * @param name - The name of the window to get. + * @returns The corresponding window object. + */ + Get(name) { + return new Window(name); + } + /** + * Returns the absolute position of the window. + * + * @returns The current absolute position of the window. + */ + Position() { + return this[callerSym](PositionMethod); + } + /** + * Centers the window on the screen. + */ + Center() { + return this[callerSym](CenterMethod); + } + /** + * Closes the window. + */ + Close() { + return this[callerSym](CloseMethod); + } + /** + * Disables min/max size constraints. + */ + DisableSizeConstraints() { + return this[callerSym](DisableSizeConstraintsMethod); + } + /** + * Enables min/max size constraints. + */ + EnableSizeConstraints() { + return this[callerSym](EnableSizeConstraintsMethod); + } + /** + * Focuses the window. + */ + Focus() { + return this[callerSym](FocusMethod); + } + /** + * Forces the window to reload the page assets. + */ + ForceReload() { + return this[callerSym](ForceReloadMethod); + } + /** + * Switches the window to fullscreen mode. + */ + Fullscreen() { + return this[callerSym](FullscreenMethod); + } + /** + * Returns the screen that the window is on. + * + * @returns The screen the window is currently on. + */ + GetScreen() { + return this[callerSym](GetScreenMethod); + } + /** + * Returns the current zoom level of the window. + * + * @returns The current zoom level. + */ + GetZoom() { + return this[callerSym](GetZoomMethod); + } + /** + * Returns the height of the window. + * + * @returns The current height of the window. + */ + Height() { + return this[callerSym](HeightMethod); + } + /** + * Hides the window. + */ + Hide() { + return this[callerSym](HideMethod); + } + /** + * Returns true if the window is focused. + * + * @returns Whether the window is currently focused. + */ + IsFocused() { + return this[callerSym](IsFocusedMethod); + } + /** + * Returns true if the window is fullscreen. + * + * @returns Whether the window is currently fullscreen. + */ + IsFullscreen() { + return this[callerSym](IsFullscreenMethod); + } + /** + * Returns true if the window is maximised. + * + * @returns Whether the window is currently maximised. + */ + IsMaximised() { + return this[callerSym](IsMaximisedMethod); + } + /** + * Returns true if the window is minimised. + * + * @returns Whether the window is currently minimised. + */ + IsMinimised() { + return this[callerSym](IsMinimisedMethod); + } + /** + * Maximises the window. + */ + Maximise() { + return this[callerSym](MaximiseMethod); + } + /** + * Minimises the window. + */ + Minimise() { + return this[callerSym](MinimiseMethod); + } + /** + * Returns the name of the window. + * + * @returns The name of the window. + */ + Name() { + return this[callerSym](NameMethod); + } + /** + * Opens the development tools pane. + */ + OpenDevTools() { + return this[callerSym](OpenDevToolsMethod); + } + /** + * Returns the relative position of the window to the screen. + * + * @returns The current relative position of the window. + */ + RelativePosition() { + return this[callerSym](RelativePositionMethod); + } + /** + * Reloads the page assets. + */ + Reload() { + return this[callerSym](ReloadMethod); + } + /** + * Returns true if the window is resizable. + * + * @returns Whether the window is currently resizable. + */ + Resizable() { + return this[callerSym](ResizableMethod); + } + /** + * Restores the window to its previous state if it was previously minimised, maximised or fullscreen. + */ + Restore() { + return this[callerSym](RestoreMethod); + } + /** + * Sets the absolute position of the window. + * + * @param x - The desired horizontal absolute position of the window. + * @param y - The desired vertical absolute position of the window. + */ + SetPosition(x, y) { + return this[callerSym](SetPositionMethod, { x, y }); + } + /** + * Sets the window to be always on top. + * + * @param alwaysOnTop - Whether the window should stay on top. + */ + SetAlwaysOnTop(alwaysOnTop) { + return this[callerSym](SetAlwaysOnTopMethod, { alwaysOnTop }); + } + /** + * Sets the background colour of the window. + * + * @param r - The desired red component of the window background. + * @param g - The desired green component of the window background. + * @param b - The desired blue component of the window background. + * @param a - The desired alpha component of the window background. + */ + SetBackgroundColour(r, g, b, a) { + return this[callerSym](SetBackgroundColourMethod, { r, g, b, a }); + } + /** + * Removes the window frame and title bar. + * + * @param frameless - Whether the window should be frameless. + */ + SetFrameless(frameless) { + return this[callerSym](SetFramelessMethod, { frameless }); + } + /** + * Disables the system fullscreen button. + * + * @param enabled - Whether the fullscreen button should be enabled. + */ + SetFullscreenButtonEnabled(enabled) { + return this[callerSym](SetFullscreenButtonEnabledMethod, { enabled }); + } + /** + * Sets the maximum size of the window. + * + * @param width - The desired maximum width of the window. + * @param height - The desired maximum height of the window. + */ + SetMaxSize(width, height) { + return this[callerSym](SetMaxSizeMethod, { width, height }); + } + /** + * Sets the minimum size of the window. + * + * @param width - The desired minimum width of the window. + * @param height - The desired minimum height of the window. + */ + SetMinSize(width, height) { + return this[callerSym](SetMinSizeMethod, { width, height }); + } + /** + * Sets the relative position of the window to the screen. + * + * @param x - The desired horizontal relative position of the window. + * @param y - The desired vertical relative position of the window. + */ + SetRelativePosition(x, y) { + return this[callerSym](SetRelativePositionMethod, { x, y }); + } + /** + * Sets whether the window is resizable. + * + * @param resizable - Whether the window should be resizable. + */ + SetResizable(resizable) { + return this[callerSym](SetResizableMethod, { resizable }); + } + /** + * Sets the size of the window. + * + * @param width - The desired width of the window. + * @param height - The desired height of the window. + */ + SetSize(width, height) { + return this[callerSym](SetSizeMethod, { width, height }); + } + /** + * Sets the title of the window. + * + * @param title - The desired title of the window. + */ + SetTitle(title) { + return this[callerSym](SetTitleMethod, { title }); + } + /** + * Sets the zoom level of the window. + * + * @param zoom - The desired zoom level. + */ + SetZoom(zoom) { + return this[callerSym](SetZoomMethod, { zoom }); + } + /** + * Shows the window. + */ + Show() { + return this[callerSym](ShowMethod); + } + /** + * Returns the size of the window. + * + * @returns The current size of the window. + */ + Size() { + return this[callerSym](SizeMethod); + } + /** + * Toggles the window between fullscreen and normal. + */ + ToggleFullscreen() { + return this[callerSym](ToggleFullscreenMethod); + } + /** + * Toggles the window between maximised and normal. + */ + ToggleMaximise() { + return this[callerSym](ToggleMaximiseMethod); + } + /** + * Un-fullscreens the window. + */ + UnFullscreen() { + return this[callerSym](UnFullscreenMethod); + } + /** + * Un-maximises the window. + */ + UnMaximise() { + return this[callerSym](UnMaximiseMethod); + } + /** + * Un-minimises the window. + */ + UnMinimise() { + return this[callerSym](UnMinimiseMethod); + } + /** + * Returns the width of the window. + * + * @returns The current width of the window. + */ + Width() { + return this[callerSym](WidthMethod); + } + /** + * Zooms the window. + */ + Zoom() { + return this[callerSym](ZoomMethod); + } + /** + * Increases the zoom level of the webview content. + */ + ZoomIn() { + return this[callerSym](ZoomInMethod); + } + /** + * Decreases the zoom level of the webview content. + */ + ZoomOut() { + return this[callerSym](ZoomOutMethod); + } + /** + * Resets the zoom level of the webview content. + */ + ZoomReset() { + return this[callerSym](ZoomResetMethod); + } +} +/** + * The window within which the script is running. + */ +const thisWindow = new Window(''); +export default thisWindow; diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/dist/wml.js b/v3/internal/runtime/desktop/@wailsio/runtime/dist/wml.js new file mode 100644 index 000000000..993928237 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/dist/wml.js @@ -0,0 +1,179 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ +import { OpenURL } from "./browser.js"; +import { Question } from "./dialogs.js"; +import { Emit, WailsEvent } from "./events.js"; +import { canAbortListeners, whenReady } from "./utils.js"; +import Window from "./window.js"; +/** + * Sends an event with the given name and optional data. + * + * @param eventName - - The name of the event to send. + * @param [data=null] - - Optional data to send along with the event. + */ +function sendEvent(eventName, data = null) { + Emit(new WailsEvent(eventName, data)); +} +/** + * Calls a method on a specified window. + * + * @param windowName - The name of the window to call the method on. + * @param methodName - The name of the method to call. + */ +function callWindowMethod(windowName, methodName) { + const targetWindow = Window.Get(windowName); + const method = targetWindow[methodName]; + if (typeof method !== "function") { + console.error(`Window method '${methodName}' not found`); + return; + } + try { + method.call(targetWindow); + } + catch (e) { + console.error(`Error calling window method '${methodName}': `, e); + } +} +/** + * Responds to a triggering event by running appropriate WML actions for the current target. + */ +function onWMLTriggered(ev) { + const element = ev.currentTarget; + function runEffect(choice = "Yes") { + if (choice !== "Yes") + return; + const eventType = element.getAttribute('wml-event') || element.getAttribute('data-wml-event'); + const targetWindow = element.getAttribute('wml-target-window') || element.getAttribute('data-wml-target-window') || ""; + const windowMethod = element.getAttribute('wml-window') || element.getAttribute('data-wml-window'); + const url = element.getAttribute('wml-openurl') || element.getAttribute('data-wml-openurl'); + if (eventType !== null) + sendEvent(eventType); + if (windowMethod !== null) + callWindowMethod(targetWindow, windowMethod); + if (url !== null) + void OpenURL(url); + } + const confirm = element.getAttribute('wml-confirm') || element.getAttribute('data-wml-confirm'); + if (confirm) { + Question({ + Title: "Confirm", + Message: confirm, + Detached: false, + Buttons: [ + { Label: "Yes" }, + { Label: "No", IsDefault: true } + ] + }).then(runEffect); + } + else { + runEffect(); + } +} +// Private field names. +const controllerSym = Symbol("controller"); +const triggerMapSym = Symbol("triggerMap"); +const elementCountSym = Symbol("elementCount"); +/** + * AbortControllerRegistry does not actually remember active event listeners: instead + * it ties them to an AbortSignal and uses an AbortController to remove them all at once. + */ +class AbortControllerRegistry { + constructor() { + this[controllerSym] = new AbortController(); + } + /** + * Returns an options object for addEventListener that ties the listener + * to the AbortSignal from the current AbortController. + * + * @param element - An HTML element + * @param triggers - The list of active WML trigger events for the specified elements + */ + set(element, triggers) { + return { signal: this[controllerSym].signal }; + } + /** + * Removes all registered event listeners and resets the registry. + */ + reset() { + this[controllerSym].abort(); + this[controllerSym] = new AbortController(); + } +} +/** + * WeakMapRegistry maps active trigger events to each DOM element through a WeakMap. + * This ensures that the mapping remains private to this module, while still allowing garbage + * collection of the involved elements. + */ +class WeakMapRegistry { + constructor() { + this[triggerMapSym] = new WeakMap(); + this[elementCountSym] = 0; + } + /** + * Sets active triggers for the specified element. + * + * @param element - An HTML element + * @param triggers - The list of active WML trigger events for the specified element + */ + set(element, triggers) { + if (!this[triggerMapSym].has(element)) { + this[elementCountSym]++; + } + this[triggerMapSym].set(element, triggers); + return {}; + } + /** + * Removes all registered event listeners. + */ + reset() { + if (this[elementCountSym] <= 0) + return; + for (const element of document.body.querySelectorAll('*')) { + if (this[elementCountSym] <= 0) + break; + const triggers = this[triggerMapSym].get(element); + if (triggers != null) { + this[elementCountSym]--; + } + for (const trigger of triggers || []) + element.removeEventListener(trigger, onWMLTriggered); + } + this[triggerMapSym] = new WeakMap(); + this[elementCountSym] = 0; + } +} +const triggerRegistry = canAbortListeners() ? new AbortControllerRegistry() : new WeakMapRegistry(); +/** + * Adds event listeners to the specified element. + */ +function addWMLListeners(element) { + const triggerRegExp = /\S+/g; + const triggerAttr = (element.getAttribute('wml-trigger') || element.getAttribute('data-wml-trigger') || "click"); + const triggers = []; + let match; + while ((match = triggerRegExp.exec(triggerAttr)) !== null) + triggers.push(match[0]); + const options = triggerRegistry.set(element, triggers); + for (const trigger of triggers) + element.addEventListener(trigger, onWMLTriggered, options); +} +/** + * Schedules an automatic reload of WML to be performed as soon as the document is fully loaded. + */ +export function Enable() { + whenReady(Reload); +} +/** + * Reloads the WML page by adding necessary event listeners and browser listeners. + */ +export function Reload() { + triggerRegistry.reset(); + document.body.querySelectorAll('[wml-event], [wml-window], [wml-openurl], [data-wml-event], [data-wml-window], [data-wml-openurl]').forEach(addWMLListeners); +} diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/assets/hierarchy.js b/v3/internal/runtime/desktop/@wailsio/runtime/docs/assets/hierarchy.js new file mode 100644 index 000000000..6eb336562 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/assets/hierarchy.js @@ -0,0 +1 @@ +window.hierarchyData = "eJylk09PAjEQxb/LnAvSsv/Ym6jxgsGIF2MIqbuz0tDtmrZ4IfvdTSGSYljThVObNm/m9+a1O9BNYw3k7zGLCKWThNBRPCIZSwgdp9mSgMZKYmFFowzkO4hZ5BbFa4Qc7rgqUEr+IfFZN7UwOBMbBAIboUrIWZwQ2GoJOQhlUVe8QHNzXjRc21oCgUJyYyAHa8qBqzI4Kt3lWshSo3LAUbpsCcRR+i/PkYWy7Jdl3+IsSCfE4aAlkLHE6xduerXfKy5Xw+tNTxj1IJ6wFHzRbHXRA8ITBUC0BNy78Jo+fKOyr1x/og1v6on6Op8wSiilI2ffrR7KwcV0W1Wow1l8VeAE6MRve1uWez8zYSwq1POvwycJJugoEAyT/I3jYpILMU4CctPZh8Mif0ovyEv3wRZWI6+nb/OpO+kTVFeFwDmxOO3EuceKb6W9juikSCDUOM06oR5dCKK4DuqkSO8oWTQibnDLtm1/AIRmEWo=" \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/assets/highlight.css b/v3/internal/runtime/desktop/@wailsio/runtime/docs/assets/highlight.css index 5674cf392..878117697 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/assets/highlight.css +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/assets/highlight.css @@ -1,22 +1,64 @@ :root { + --light-hl-0: #0000FF; + --dark-hl-0: #569CD6; + --light-hl-1: #000000; + --dark-hl-1: #D4D4D4; + --light-hl-2: #001080; + --dark-hl-2: #9CDCFE; + --light-hl-3: #795E26; + --dark-hl-3: #DCDCAA; + --light-hl-4: #008000; + --dark-hl-4: #6A9955; + --light-hl-5: #AF00DB; + --dark-hl-5: #C586C0; --light-code-background: #FFFFFF; --dark-code-background: #1E1E1E; } @media (prefers-color-scheme: light) { :root { + --hl-0: var(--light-hl-0); + --hl-1: var(--light-hl-1); + --hl-2: var(--light-hl-2); + --hl-3: var(--light-hl-3); + --hl-4: var(--light-hl-4); + --hl-5: var(--light-hl-5); --code-background: var(--light-code-background); } } @media (prefers-color-scheme: dark) { :root { + --hl-0: var(--dark-hl-0); + --hl-1: var(--dark-hl-1); + --hl-2: var(--dark-hl-2); + --hl-3: var(--dark-hl-3); + --hl-4: var(--dark-hl-4); + --hl-5: var(--dark-hl-5); --code-background: var(--dark-code-background); } } :root[data-theme='light'] { + --hl-0: var(--light-hl-0); + --hl-1: var(--light-hl-1); + --hl-2: var(--light-hl-2); + --hl-3: var(--light-hl-3); + --hl-4: var(--light-hl-4); + --hl-5: var(--light-hl-5); --code-background: var(--light-code-background); } :root[data-theme='dark'] { + --hl-0: var(--dark-hl-0); + --hl-1: var(--dark-hl-1); + --hl-2: var(--dark-hl-2); + --hl-3: var(--dark-hl-3); + --hl-4: var(--dark-hl-4); + --hl-5: var(--dark-hl-5); --code-background: var(--dark-code-background); } +.hl-0 { color: var(--hl-0); } +.hl-1 { color: var(--hl-1); } +.hl-2 { color: var(--hl-2); } +.hl-3 { color: var(--hl-3); } +.hl-4 { color: var(--hl-4); } +.hl-5 { color: var(--hl-5); } pre, code { background: var(--code-background); } diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/assets/icons.js b/v3/internal/runtime/desktop/@wailsio/runtime/docs/assets/icons.js index b79c9e89f..58882d76d 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/assets/icons.js +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/assets/icons.js @@ -1,15 +1,18 @@ -(function(svg) { - svg.innerHTML = ``; - svg.style.display = 'none'; - if (location.protocol === 'file:') { - if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', updateUseElements); - else updateUseElements() - function updateUseElements() { - document.querySelectorAll('use').forEach(el => { - if (el.getAttribute('href').includes('#icon-')) { - el.setAttribute('href', el.getAttribute('href').replace(/.*#/, '#')); - } - }); - } +(function() { + addIcons(); + function addIcons() { + if (document.readyState === "loading") return document.addEventListener("DOMContentLoaded", addIcons); + const svg = document.body.appendChild(document.createElementNS("http://www.w3.org/2000/svg", "svg")); + svg.innerHTML = `MMNEPVFCICPMFPCPTTAAATR`; + svg.style.display = "none"; + if (location.protocol === "file:") updateUseElements(); } -})(document.body.appendChild(document.createElementNS('http://www.w3.org/2000/svg', 'svg'))) \ No newline at end of file + + function updateUseElements() { + document.querySelectorAll("use").forEach(el => { + if (el.getAttribute("href").includes("#icon-")) { + el.setAttribute("href", el.getAttribute("href").replace(/.*#/, "#")); + } + }); + } +})() \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/assets/icons.svg b/v3/internal/runtime/desktop/@wailsio/runtime/docs/assets/icons.svg index 7dead6118..50ad5799d 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/assets/icons.svg +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/assets/icons.svg @@ -1 +1 @@ - \ No newline at end of file +MMNEPVFCICPMFPCPTTAAATR \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/assets/main.js b/v3/internal/runtime/desktop/@wailsio/runtime/docs/assets/main.js index 1daeb6900..2363f64c2 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/assets/main.js +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/assets/main.js @@ -1,8 +1,9 @@ "use strict"; -"use strict";(()=>{var Ce=Object.create;var ne=Object.defineProperty;var Pe=Object.getOwnPropertyDescriptor;var Oe=Object.getOwnPropertyNames;var _e=Object.getPrototypeOf,Re=Object.prototype.hasOwnProperty;var Me=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var Fe=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Oe(e))!Re.call(t,i)&&i!==n&&ne(t,i,{get:()=>e[i],enumerable:!(r=Pe(e,i))||r.enumerable});return t};var De=(t,e,n)=>(n=t!=null?Ce(_e(t)):{},Fe(e||!t||!t.__esModule?ne(n,"default",{value:t,enumerable:!0}):n,t));var ae=Me((se,oe)=>{(function(){var t=function(e){var n=new t.Builder;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),n.searchPipeline.add(t.stemmer),e.call(n,n),n.build()};t.version="2.3.9";t.utils={},t.utils.warn=function(e){return function(n){e.console&&console.warn&&console.warn(n)}}(this),t.utils.asString=function(e){return e==null?"":e.toString()},t.utils.clone=function(e){if(e==null)return e;for(var n=Object.create(null),r=Object.keys(e),i=0;i0){var d=t.utils.clone(n)||{};d.position=[a,u],d.index=s.length,s.push(new t.Token(r.slice(a,o),d))}a=o+1}}return s},t.tokenizer.separator=/[\s\-]+/;t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions=Object.create(null),t.Pipeline.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn(`Function is not registered with pipeline. This may cause problems when serialising the index. -`,e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(r){var i=t.Pipeline.registeredFunctions[r];if(i)n.add(i);else throw new Error("Cannot load unregistered function: "+r)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(n){t.Pipeline.warnIfFunctionNotRegistered(n),this._stack.push(n)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");r=r+1,this._stack.splice(r,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");this._stack.splice(r,0,n)},t.Pipeline.prototype.remove=function(e){var n=this._stack.indexOf(e);n!=-1&&this._stack.splice(n,1)},t.Pipeline.prototype.run=function(e){for(var n=this._stack.length,r=0;r1&&(oe&&(r=s),o!=e);)i=r-n,s=n+Math.floor(i/2),o=this.elements[s*2];if(o==e||o>e)return s*2;if(ol?d+=2:a==l&&(n+=r[u+1]*i[d+1],u+=2,d+=2);return n},t.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},t.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),n=1,r=0;n0){var o=s.str.charAt(0),a;o in s.node.edges?a=s.node.edges[o]:(a=new t.TokenSet,s.node.edges[o]=a),s.str.length==1&&(a.final=!0),i.push({node:a,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(s.editsRemaining!=0){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new t.TokenSet;s.node.edges["*"]=l}if(s.str.length==0&&(l.final=!0),i.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&i.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),s.str.length==1&&(s.node.final=!0),s.str.length>=1){if("*"in s.node.edges)var u=s.node.edges["*"];else{var u=new t.TokenSet;s.node.edges["*"]=u}s.str.length==1&&(u.final=!0),i.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var d=s.str.charAt(0),y=s.str.charAt(1),p;y in s.node.edges?p=s.node.edges[y]:(p=new t.TokenSet,s.node.edges[y]=p),s.str.length==1&&(p.final=!0),i.push({node:p,editsRemaining:s.editsRemaining-1,str:d+s.str.slice(2)})}}}return r},t.TokenSet.fromString=function(e){for(var n=new t.TokenSet,r=n,i=0,s=e.length;i=e;n--){var r=this.uncheckedNodes[n],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r.char]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}};t.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},t.Index.prototype.search=function(e){return this.query(function(n){var r=new t.QueryParser(e,n);r.parse()})},t.Index.prototype.query=function(e){for(var n=new t.Query(this.fields),r=Object.create(null),i=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),l=0;l1?this._b=1:this._b=e},t.Builder.prototype.k1=function(e){this._k1=e},t.Builder.prototype.add=function(e,n){var r=e[this._ref],i=Object.keys(this._fields);this._documents[r]=n||{},this.documentCount+=1;for(var s=0;s=this.length)return t.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},t.QueryLexer.prototype.width=function(){return this.pos-this.start},t.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},t.QueryLexer.prototype.backup=function(){this.pos-=1},t.QueryLexer.prototype.acceptDigitRun=function(){var e,n;do e=this.next(),n=e.charCodeAt(0);while(n>47&&n<58);e!=t.QueryLexer.EOS&&this.backup()},t.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(t.QueryLexer.TERM)),e.ignore(),e.more())return t.QueryLexer.lexText},t.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.EDIT_DISTANCE),t.QueryLexer.lexText},t.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.BOOST),t.QueryLexer.lexText},t.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(t.QueryLexer.TERM)},t.QueryLexer.termSeparator=t.tokenizer.separator,t.QueryLexer.lexText=function(e){for(;;){var n=e.next();if(n==t.QueryLexer.EOS)return t.QueryLexer.lexEOS;if(n.charCodeAt(0)==92){e.escapeCharacter();continue}if(n==":")return t.QueryLexer.lexField;if(n=="~")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexEditDistance;if(n=="^")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexBoost;if(n=="+"&&e.width()===1||n=="-"&&e.width()===1)return e.emit(t.QueryLexer.PRESENCE),t.QueryLexer.lexText;if(n.match(t.QueryLexer.termSeparator))return t.QueryLexer.lexTerm}},t.QueryParser=function(e,n){this.lexer=new t.QueryLexer(e),this.query=n,this.currentClause={},this.lexemeIdx=0},t.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=t.QueryParser.parseClause;e;)e=e(this);return this.query},t.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},t.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},t.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},t.QueryParser.parseClause=function(e){var n=e.peekLexeme();if(n!=null)switch(n.type){case t.QueryLexer.PRESENCE:return t.QueryParser.parsePresence;case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expected either a field or a term, found "+n.type;throw n.str.length>=1&&(r+=" with value '"+n.str+"'"),new t.QueryParseError(r,n.start,n.end)}},t.QueryParser.parsePresence=function(e){var n=e.consumeLexeme();if(n!=null){switch(n.str){case"-":e.currentClause.presence=t.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=t.Query.presence.REQUIRED;break;default:var r="unrecognised presence operator'"+n.str+"'";throw new t.QueryParseError(r,n.start,n.end)}var i=e.peekLexeme();if(i==null){var r="expecting term or field, found nothing";throw new t.QueryParseError(r,n.start,n.end)}switch(i.type){case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expecting term or field, found '"+i.type+"'";throw new t.QueryParseError(r,i.start,i.end)}}},t.QueryParser.parseField=function(e){var n=e.consumeLexeme();if(n!=null){if(e.query.allFields.indexOf(n.str)==-1){var r=e.query.allFields.map(function(o){return"'"+o+"'"}).join(", "),i="unrecognised field '"+n.str+"', possible fields: "+r;throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.fields=[n.str];var s=e.peekLexeme();if(s==null){var i="expecting term, found nothing";throw new t.QueryParseError(i,n.start,n.end)}switch(s.type){case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var i="expecting term, found '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseTerm=function(e){var n=e.consumeLexeme();if(n!=null){e.currentClause.term=n.str.toLowerCase(),n.str.indexOf("*")!=-1&&(e.currentClause.usePipeline=!1);var r=e.peekLexeme();if(r==null){e.nextClause();return}switch(r.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+r.type+"'";throw new t.QueryParseError(i,r.start,r.end)}}},t.QueryParser.parseEditDistance=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="edit distance must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.editDistance=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseBoost=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="boost must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.boost=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},function(e,n){typeof define=="function"&&define.amd?define(n):typeof se=="object"?oe.exports=n():e.lunr=n()}(this,function(){return t})})()});var re=[];function G(t,e){re.push({selector:e,constructor:t})}var U=class{constructor(){this.alwaysVisibleMember=null;this.createComponents(document.body),this.ensureFocusedElementVisible(),this.listenForCodeCopies(),window.addEventListener("hashchange",()=>this.ensureFocusedElementVisible()),document.body.style.display||(this.scrollToHash(),this.updateIndexVisibility())}createComponents(e){re.forEach(n=>{e.querySelectorAll(n.selector).forEach(r=>{r.dataset.hasInstance||(new n.constructor({el:r,app:this}),r.dataset.hasInstance=String(!0))})})}filterChanged(){this.ensureFocusedElementVisible()}showPage(){document.body.style.display&&(document.body.style.removeProperty("display"),this.scrollToHash(),this.updateIndexVisibility())}scrollToHash(){if(location.hash){let e=document.getElementById(location.hash.substring(1));if(!e)return;e.scrollIntoView({behavior:"instant",block:"start"})}}ensureActivePageVisible(){let e=document.querySelector(".tsd-navigation .current"),n=e?.parentElement;for(;n&&!n.classList.contains(".tsd-navigation");)n instanceof HTMLDetailsElement&&(n.open=!0),n=n.parentElement;if(e&&!e.checkVisibility()){let r=e.getBoundingClientRect().top-document.documentElement.clientHeight/4;document.querySelector(".site-menu").scrollTop=r}}updateIndexVisibility(){let e=document.querySelector(".tsd-index-content"),n=e?.open;e&&(e.open=!0),document.querySelectorAll(".tsd-index-section").forEach(r=>{r.style.display="block";let i=Array.from(r.querySelectorAll(".tsd-index-link")).every(s=>s.offsetParent==null);r.style.display=i?"none":"block"}),e&&(e.open=n)}ensureFocusedElementVisible(){if(this.alwaysVisibleMember&&(this.alwaysVisibleMember.classList.remove("always-visible"),this.alwaysVisibleMember.firstElementChild.remove(),this.alwaysVisibleMember=null),!location.hash)return;let e=document.getElementById(location.hash.substring(1));if(!e)return;let n=e.parentElement;for(;n&&n.tagName!=="SECTION";)n=n.parentElement;if(n&&n.offsetParent==null){this.alwaysVisibleMember=n,n.classList.add("always-visible");let r=document.createElement("p");r.classList.add("warning"),r.textContent="This member is normally hidden due to your filter settings.",n.prepend(r)}}listenForCodeCopies(){document.querySelectorAll("pre > button").forEach(e=>{let n;e.addEventListener("click",()=>{e.previousElementSibling instanceof HTMLElement&&navigator.clipboard.writeText(e.previousElementSibling.innerText.trim()),e.textContent="Copied!",e.classList.add("visible"),clearTimeout(n),n=setTimeout(()=>{e.classList.remove("visible"),n=setTimeout(()=>{e.textContent="Copy"},100)},1e3)})})}};var ie=(t,e=100)=>{let n;return()=>{clearTimeout(n),n=setTimeout(()=>t(),e)}};var de=De(ae());async function le(t,e){if(!window.searchData)return;let n=await fetch(window.searchData),r=new Blob([await n.arrayBuffer()]).stream().pipeThrough(new DecompressionStream("gzip")),i=await new Response(r).json();t.data=i,t.index=de.Index.load(i.index),e.classList.remove("loading"),e.classList.add("ready")}function he(){let t=document.getElementById("tsd-search");if(!t)return;let e={base:t.dataset.base+"/"},n=document.getElementById("tsd-search-script");t.classList.add("loading"),n&&(n.addEventListener("error",()=>{t.classList.remove("loading"),t.classList.add("failure")}),n.addEventListener("load",()=>{le(e,t)}),le(e,t));let r=document.querySelector("#tsd-search input"),i=document.querySelector("#tsd-search .results");if(!r||!i)throw new Error("The input field or the result list wrapper was not found");let s=!1;i.addEventListener("mousedown",()=>s=!0),i.addEventListener("mouseup",()=>{s=!1,t.classList.remove("has-focus")}),r.addEventListener("focus",()=>t.classList.add("has-focus")),r.addEventListener("blur",()=>{s||(s=!1,t.classList.remove("has-focus"))}),Ae(t,i,r,e)}function Ae(t,e,n,r){n.addEventListener("input",ie(()=>{Ne(t,e,n,r)},200));let i=!1;n.addEventListener("keydown",s=>{i=!0,s.key=="Enter"?Ve(e,n):s.key=="Escape"?n.blur():s.key=="ArrowUp"?ue(e,-1):s.key==="ArrowDown"?ue(e,1):i=!1}),n.addEventListener("keypress",s=>{i&&s.preventDefault()}),document.body.addEventListener("keydown",s=>{s.altKey||s.ctrlKey||s.metaKey||!n.matches(":focus")&&s.key==="/"&&(n.focus(),s.preventDefault())})}function Ne(t,e,n,r){if(!r.index||!r.data)return;e.textContent="";let i=n.value.trim(),s;if(i){let o=i.split(" ").map(a=>a.length?`*${a}*`:"").join(" ");s=r.index.search(o)}else s=[];for(let o=0;oa.score-o.score);for(let o=0,a=Math.min(10,s.length);o`,d=ce(l.name,i);globalThis.DEBUG_SEARCH_WEIGHTS&&(d+=` (score: ${s[o].score.toFixed(2)})`),l.parent&&(d=` - ${ce(l.parent,i)}.${d}`);let y=document.createElement("li");y.classList.value=l.classes??"";let p=document.createElement("a");p.href=r.base+l.url,p.innerHTML=u+d,y.append(p),e.appendChild(y)}}function ue(t,e){let n=t.querySelector(".current");if(!n)n=t.querySelector(e==1?"li:first-child":"li:last-child"),n&&n.classList.add("current");else{let r=n;if(e===1)do r=r.nextElementSibling??void 0;while(r instanceof HTMLElement&&r.offsetParent==null);else do r=r.previousElementSibling??void 0;while(r instanceof HTMLElement&&r.offsetParent==null);r&&(n.classList.remove("current"),r.classList.add("current"))}}function Ve(t,e){let n=t.querySelector(".current");if(n||(n=t.querySelector("li:first-child")),n){let r=n.querySelector("a");r&&(window.location.href=r.href),e.blur()}}function ce(t,e){if(e==="")return t;let n=t.toLocaleLowerCase(),r=e.toLocaleLowerCase(),i=[],s=0,o=n.indexOf(r);for(;o!=-1;)i.push(K(t.substring(s,o)),`${K(t.substring(o,o+r.length))}`),s=o+r.length,o=n.indexOf(r,s);return i.push(K(t.substring(s))),i.join("")}var He={"&":"&","<":"<",">":">","'":"'",'"':"""};function K(t){return t.replace(/[&<>"'"]/g,e=>He[e])}var I=class{constructor(e){this.el=e.el,this.app=e.app}};var F="mousedown",fe="mousemove",H="mouseup",J={x:0,y:0},pe=!1,ee=!1,Be=!1,D=!1,me=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);document.documentElement.classList.add(me?"is-mobile":"not-mobile");me&&"ontouchstart"in document.documentElement&&(Be=!0,F="touchstart",fe="touchmove",H="touchend");document.addEventListener(F,t=>{ee=!0,D=!1;let e=F=="touchstart"?t.targetTouches[0]:t;J.y=e.pageY||0,J.x=e.pageX||0});document.addEventListener(fe,t=>{if(ee&&!D){let e=F=="touchstart"?t.targetTouches[0]:t,n=J.x-(e.pageX||0),r=J.y-(e.pageY||0);D=Math.sqrt(n*n+r*r)>10}});document.addEventListener(H,()=>{ee=!1});document.addEventListener("click",t=>{pe&&(t.preventDefault(),t.stopImmediatePropagation(),pe=!1)});var X=class extends I{constructor(e){super(e),this.className=this.el.dataset.toggle||"",this.el.addEventListener(H,n=>this.onPointerUp(n)),this.el.addEventListener("click",n=>n.preventDefault()),document.addEventListener(F,n=>this.onDocumentPointerDown(n)),document.addEventListener(H,n=>this.onDocumentPointerUp(n))}setActive(e){if(this.active==e)return;this.active=e,document.documentElement.classList.toggle("has-"+this.className,e),this.el.classList.toggle("active",e);let n=(this.active?"to-has-":"from-has-")+this.className;document.documentElement.classList.add(n),setTimeout(()=>document.documentElement.classList.remove(n),500)}onPointerUp(e){D||(this.setActive(!0),e.preventDefault())}onDocumentPointerDown(e){if(this.active){if(e.target.closest(".col-sidebar, .tsd-filter-group"))return;this.setActive(!1)}}onDocumentPointerUp(e){if(!D&&this.active&&e.target.closest(".col-sidebar")){let n=e.target.closest("a");if(n){let r=window.location.href;r.indexOf("#")!=-1&&(r=r.substring(0,r.indexOf("#"))),n.href.substring(0,r.length)==r&&setTimeout(()=>this.setActive(!1),250)}}}};var te;try{te=localStorage}catch{te={getItem(){return null},setItem(){}}}var Q=te;var ye=document.head.appendChild(document.createElement("style"));ye.dataset.for="filters";var Y=class extends I{constructor(e){super(e),this.key=`filter-${this.el.name}`,this.value=this.el.checked,this.el.addEventListener("change",()=>{this.setLocalStorage(this.el.checked)}),this.setLocalStorage(this.fromLocalStorage()),ye.innerHTML+=`html:not(.${this.key}) .tsd-is-${this.el.name} { display: none; } -`,this.app.updateIndexVisibility()}fromLocalStorage(){let e=Q.getItem(this.key);return e?e==="true":this.el.checked}setLocalStorage(e){Q.setItem(this.key,e.toString()),this.value=e,this.handleValueChange()}handleValueChange(){this.el.checked=this.value,document.documentElement.classList.toggle(this.key,this.value),this.app.filterChanged(),this.app.updateIndexVisibility()}};var Z=class extends I{constructor(e){super(e),this.summary=this.el.querySelector(".tsd-accordion-summary"),this.icon=this.summary.querySelector("svg"),this.key=`tsd-accordion-${this.summary.dataset.key??this.summary.textContent.trim().replace(/\s+/g,"-").toLowerCase()}`;let n=Q.getItem(this.key);this.el.open=n?n==="true":this.el.open,this.el.addEventListener("toggle",()=>this.update());let r=this.summary.querySelector("a");r&&r.addEventListener("click",()=>{location.assign(r.href)}),this.update()}update(){this.icon.style.transform=`rotate(${this.el.open?0:-90}deg)`,Q.setItem(this.key,this.el.open.toString())}};function ge(t){let e=Q.getItem("tsd-theme")||"os";t.value=e,ve(e),t.addEventListener("change",()=>{Q.setItem("tsd-theme",t.value),ve(t.value)})}function ve(t){document.documentElement.dataset.theme=t}var Le;function be(){let t=document.getElementById("tsd-nav-script");t&&(t.addEventListener("load",xe),xe())}async function xe(){let t=document.getElementById("tsd-nav-container");if(!t||!window.navigationData)return;let n=await(await fetch(window.navigationData)).arrayBuffer(),r=new Blob([n]).stream().pipeThrough(new DecompressionStream("gzip")),i=await new Response(r).json();Le=t.dataset.base+"/",t.innerHTML="";for(let s of i)we(s,t,[]);window.app.createComponents(t),window.app.showPage(),window.app.ensureActivePageVisible()}function we(t,e,n){let r=e.appendChild(document.createElement("li"));if(t.children){let i=[...n,t.text],s=r.appendChild(document.createElement("details"));s.className=t.class?`${t.class} tsd-index-accordion`:"tsd-index-accordion",s.dataset.key=i.join("$");let o=s.appendChild(document.createElement("summary"));o.className="tsd-accordion-summary",o.innerHTML='',Ee(t,o);let a=s.appendChild(document.createElement("div"));a.className="tsd-accordion-details";let l=a.appendChild(document.createElement("ul"));l.className="tsd-nested-navigation";for(let u of t.children)we(u,l,i)}else Ee(t,r,t.class)}function Ee(t,e,n){if(t.path){let r=e.appendChild(document.createElement("a"));r.href=Le+t.path,n&&(r.className=n),location.pathname===r.pathname&&r.classList.add("current"),t.kind&&(r.innerHTML=``),r.appendChild(document.createElement("span")).textContent=t.text}else e.appendChild(document.createElement("span")).textContent=t.text}G(X,"a[data-toggle]");G(Z,".tsd-index-accordion");G(Y,".tsd-filter-item input[type=checkbox]");var Se=document.getElementById("tsd-theme");Se&&ge(Se);var je=new U;Object.defineProperty(window,"app",{value:je});he();be();})(); +window.translations={"copy":"Copy","copied":"Copied!","normally_hidden":"This member is normally hidden due to your filter settings.","hierarchy_expand":"Expand","hierarchy_collapse":"Collapse","folder":"Folder","kind_1":"Project","kind_2":"Module","kind_4":"Namespace","kind_8":"Enumeration","kind_16":"Enumeration Member","kind_32":"Variable","kind_64":"Function","kind_128":"Class","kind_256":"Interface","kind_512":"Constructor","kind_1024":"Property","kind_2048":"Method","kind_4096":"Call Signature","kind_8192":"Index Signature","kind_16384":"Constructor Signature","kind_32768":"Parameter","kind_65536":"Type Literal","kind_131072":"Type Parameter","kind_262144":"Accessor","kind_524288":"Get Signature","kind_1048576":"Set Signature","kind_2097152":"Type Alias","kind_4194304":"Reference","kind_8388608":"Document"}; +"use strict";(()=>{var De=Object.create;var le=Object.defineProperty;var Fe=Object.getOwnPropertyDescriptor;var Ne=Object.getOwnPropertyNames;var Ve=Object.getPrototypeOf,Be=Object.prototype.hasOwnProperty;var qe=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var je=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Ne(e))!Be.call(t,i)&&i!==n&&le(t,i,{get:()=>e[i],enumerable:!(r=Fe(e,i))||r.enumerable});return t};var $e=(t,e,n)=>(n=t!=null?De(Ve(t)):{},je(e||!t||!t.__esModule?le(n,"default",{value:t,enumerable:!0}):n,t));var pe=qe((de,he)=>{(function(){var t=function(e){var n=new t.Builder;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),n.searchPipeline.add(t.stemmer),e.call(n,n),n.build()};t.version="2.3.9";t.utils={},t.utils.warn=function(e){return function(n){e.console&&console.warn&&console.warn(n)}}(this),t.utils.asString=function(e){return e==null?"":e.toString()},t.utils.clone=function(e){if(e==null)return e;for(var n=Object.create(null),r=Object.keys(e),i=0;i0){var d=t.utils.clone(n)||{};d.position=[a,c],d.index=s.length,s.push(new t.Token(r.slice(a,o),d))}a=o+1}}return s},t.tokenizer.separator=/[\s\-]+/;t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions=Object.create(null),t.Pipeline.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn(`Function is not registered with pipeline. This may cause problems when serialising the index. +`,e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(r){var i=t.Pipeline.registeredFunctions[r];if(i)n.add(i);else throw new Error("Cannot load unregistered function: "+r)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(n){t.Pipeline.warnIfFunctionNotRegistered(n),this._stack.push(n)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");r=r+1,this._stack.splice(r,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");this._stack.splice(r,0,n)},t.Pipeline.prototype.remove=function(e){var n=this._stack.indexOf(e);n!=-1&&this._stack.splice(n,1)},t.Pipeline.prototype.run=function(e){for(var n=this._stack.length,r=0;r1&&(oe&&(r=s),o!=e);)i=r-n,s=n+Math.floor(i/2),o=this.elements[s*2];if(o==e||o>e)return s*2;if(ol?d+=2:a==l&&(n+=r[c+1]*i[d+1],c+=2,d+=2);return n},t.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},t.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),n=1,r=0;n0){var o=s.str.charAt(0),a;o in s.node.edges?a=s.node.edges[o]:(a=new t.TokenSet,s.node.edges[o]=a),s.str.length==1&&(a.final=!0),i.push({node:a,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(s.editsRemaining!=0){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new t.TokenSet;s.node.edges["*"]=l}if(s.str.length==0&&(l.final=!0),i.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&i.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),s.str.length==1&&(s.node.final=!0),s.str.length>=1){if("*"in s.node.edges)var c=s.node.edges["*"];else{var c=new t.TokenSet;s.node.edges["*"]=c}s.str.length==1&&(c.final=!0),i.push({node:c,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var d=s.str.charAt(0),m=s.str.charAt(1),p;m in s.node.edges?p=s.node.edges[m]:(p=new t.TokenSet,s.node.edges[m]=p),s.str.length==1&&(p.final=!0),i.push({node:p,editsRemaining:s.editsRemaining-1,str:d+s.str.slice(2)})}}}return r},t.TokenSet.fromString=function(e){for(var n=new t.TokenSet,r=n,i=0,s=e.length;i=e;n--){var r=this.uncheckedNodes[n],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r.char]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}};t.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},t.Index.prototype.search=function(e){return this.query(function(n){var r=new t.QueryParser(e,n);r.parse()})},t.Index.prototype.query=function(e){for(var n=new t.Query(this.fields),r=Object.create(null),i=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),l=0;l1?this._b=1:this._b=e},t.Builder.prototype.k1=function(e){this._k1=e},t.Builder.prototype.add=function(e,n){var r=e[this._ref],i=Object.keys(this._fields);this._documents[r]=n||{},this.documentCount+=1;for(var s=0;s=this.length)return t.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},t.QueryLexer.prototype.width=function(){return this.pos-this.start},t.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},t.QueryLexer.prototype.backup=function(){this.pos-=1},t.QueryLexer.prototype.acceptDigitRun=function(){var e,n;do e=this.next(),n=e.charCodeAt(0);while(n>47&&n<58);e!=t.QueryLexer.EOS&&this.backup()},t.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(t.QueryLexer.TERM)),e.ignore(),e.more())return t.QueryLexer.lexText},t.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.EDIT_DISTANCE),t.QueryLexer.lexText},t.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.BOOST),t.QueryLexer.lexText},t.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(t.QueryLexer.TERM)},t.QueryLexer.termSeparator=t.tokenizer.separator,t.QueryLexer.lexText=function(e){for(;;){var n=e.next();if(n==t.QueryLexer.EOS)return t.QueryLexer.lexEOS;if(n.charCodeAt(0)==92){e.escapeCharacter();continue}if(n==":")return t.QueryLexer.lexField;if(n=="~")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexEditDistance;if(n=="^")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexBoost;if(n=="+"&&e.width()===1||n=="-"&&e.width()===1)return e.emit(t.QueryLexer.PRESENCE),t.QueryLexer.lexText;if(n.match(t.QueryLexer.termSeparator))return t.QueryLexer.lexTerm}},t.QueryParser=function(e,n){this.lexer=new t.QueryLexer(e),this.query=n,this.currentClause={},this.lexemeIdx=0},t.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=t.QueryParser.parseClause;e;)e=e(this);return this.query},t.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},t.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},t.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},t.QueryParser.parseClause=function(e){var n=e.peekLexeme();if(n!=null)switch(n.type){case t.QueryLexer.PRESENCE:return t.QueryParser.parsePresence;case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expected either a field or a term, found "+n.type;throw n.str.length>=1&&(r+=" with value '"+n.str+"'"),new t.QueryParseError(r,n.start,n.end)}},t.QueryParser.parsePresence=function(e){var n=e.consumeLexeme();if(n!=null){switch(n.str){case"-":e.currentClause.presence=t.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=t.Query.presence.REQUIRED;break;default:var r="unrecognised presence operator'"+n.str+"'";throw new t.QueryParseError(r,n.start,n.end)}var i=e.peekLexeme();if(i==null){var r="expecting term or field, found nothing";throw new t.QueryParseError(r,n.start,n.end)}switch(i.type){case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expecting term or field, found '"+i.type+"'";throw new t.QueryParseError(r,i.start,i.end)}}},t.QueryParser.parseField=function(e){var n=e.consumeLexeme();if(n!=null){if(e.query.allFields.indexOf(n.str)==-1){var r=e.query.allFields.map(function(o){return"'"+o+"'"}).join(", "),i="unrecognised field '"+n.str+"', possible fields: "+r;throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.fields=[n.str];var s=e.peekLexeme();if(s==null){var i="expecting term, found nothing";throw new t.QueryParseError(i,n.start,n.end)}switch(s.type){case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var i="expecting term, found '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseTerm=function(e){var n=e.consumeLexeme();if(n!=null){e.currentClause.term=n.str.toLowerCase(),n.str.indexOf("*")!=-1&&(e.currentClause.usePipeline=!1);var r=e.peekLexeme();if(r==null){e.nextClause();return}switch(r.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+r.type+"'";throw new t.QueryParseError(i,r.start,r.end)}}},t.QueryParser.parseEditDistance=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="edit distance must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.editDistance=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseBoost=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="boost must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.boost=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},function(e,n){typeof define=="function"&&define.amd?define(n):typeof de=="object"?he.exports=n():e.lunr=n()}(this,function(){return t})})()});window.translations||={copy:"Copy",copied:"Copied!",normally_hidden:"This member is normally hidden due to your filter settings.",hierarchy_expand:"Expand",hierarchy_collapse:"Collapse",folder:"Folder",kind_1:"Project",kind_2:"Module",kind_4:"Namespace",kind_8:"Enumeration",kind_16:"Enumeration Member",kind_32:"Variable",kind_64:"Function",kind_128:"Class",kind_256:"Interface",kind_512:"Constructor",kind_1024:"Property",kind_2048:"Method",kind_4096:"Call Signature",kind_8192:"Index Signature",kind_16384:"Constructor Signature",kind_32768:"Parameter",kind_65536:"Type Literal",kind_131072:"Type Parameter",kind_262144:"Accessor",kind_524288:"Get Signature",kind_1048576:"Set Signature",kind_2097152:"Type Alias",kind_4194304:"Reference",kind_8388608:"Document"};var ce=[];function G(t,e){ce.push({selector:e,constructor:t})}var J=class{alwaysVisibleMember=null;constructor(){this.createComponents(document.body),this.ensureFocusedElementVisible(),this.listenForCodeCopies(),window.addEventListener("hashchange",()=>this.ensureFocusedElementVisible()),document.body.style.display||(this.ensureFocusedElementVisible(),this.updateIndexVisibility(),this.scrollToHash())}createComponents(e){ce.forEach(n=>{e.querySelectorAll(n.selector).forEach(r=>{r.dataset.hasInstance||(new n.constructor({el:r,app:this}),r.dataset.hasInstance=String(!0))})})}filterChanged(){this.ensureFocusedElementVisible()}showPage(){document.body.style.display&&(document.body.style.removeProperty("display"),this.ensureFocusedElementVisible(),this.updateIndexVisibility(),this.scrollToHash())}scrollToHash(){if(location.hash){let e=document.getElementById(location.hash.substring(1));if(!e)return;e.scrollIntoView({behavior:"instant",block:"start"})}}ensureActivePageVisible(){let e=document.querySelector(".tsd-navigation .current"),n=e?.parentElement;for(;n&&!n.classList.contains(".tsd-navigation");)n instanceof HTMLDetailsElement&&(n.open=!0),n=n.parentElement;if(e&&!ze(e)){let r=e.getBoundingClientRect().top-document.documentElement.clientHeight/4;document.querySelector(".site-menu").scrollTop=r,document.querySelector(".col-sidebar").scrollTop=r}}updateIndexVisibility(){let e=document.querySelector(".tsd-index-content"),n=e?.open;e&&(e.open=!0),document.querySelectorAll(".tsd-index-section").forEach(r=>{r.style.display="block";let i=Array.from(r.querySelectorAll(".tsd-index-link")).every(s=>s.offsetParent==null);r.style.display=i?"none":"block"}),e&&(e.open=n)}ensureFocusedElementVisible(){if(this.alwaysVisibleMember&&(this.alwaysVisibleMember.classList.remove("always-visible"),this.alwaysVisibleMember.firstElementChild.remove(),this.alwaysVisibleMember=null),!location.hash)return;let e=document.getElementById(location.hash.substring(1));if(!e)return;let n=e.parentElement;for(;n&&n.tagName!=="SECTION";)n=n.parentElement;if(!n)return;let r=n.offsetParent==null,i=n;for(;i!==document.body;)i instanceof HTMLDetailsElement&&(i.open=!0),i=i.parentElement;if(n.offsetParent==null){this.alwaysVisibleMember=n,n.classList.add("always-visible");let s=document.createElement("p");s.classList.add("warning"),s.textContent=window.translations.normally_hidden,n.prepend(s)}r&&e.scrollIntoView()}listenForCodeCopies(){document.querySelectorAll("pre > button").forEach(e=>{let n;e.addEventListener("click",()=>{e.previousElementSibling instanceof HTMLElement&&navigator.clipboard.writeText(e.previousElementSibling.innerText.trim()),e.textContent=window.translations.copied,e.classList.add("visible"),clearTimeout(n),n=setTimeout(()=>{e.classList.remove("visible"),n=setTimeout(()=>{e.textContent=window.translations.copy},100)},1e3)})})}};function ze(t){let e=t.getBoundingClientRect(),n=Math.max(document.documentElement.clientHeight,window.innerHeight);return!(e.bottom<0||e.top-n>=0)}var ue=(t,e=100)=>{let n;return()=>{clearTimeout(n),n=setTimeout(()=>t(),e)}};var ge=$e(pe(),1);async function A(t){let e=Uint8Array.from(atob(t),s=>s.charCodeAt(0)),r=new Blob([e]).stream().pipeThrough(new DecompressionStream("deflate")),i=await new Response(r).text();return JSON.parse(i)}async function fe(t,e){if(!window.searchData)return;let n=await A(window.searchData);t.data=n,t.index=ge.Index.load(n.index),e.classList.remove("loading"),e.classList.add("ready")}function ve(){let t=document.getElementById("tsd-search");if(!t)return;let e={base:document.documentElement.dataset.base+"/"},n=document.getElementById("tsd-search-script");t.classList.add("loading"),n&&(n.addEventListener("error",()=>{t.classList.remove("loading"),t.classList.add("failure")}),n.addEventListener("load",()=>{fe(e,t)}),fe(e,t));let r=document.querySelector("#tsd-search input"),i=document.querySelector("#tsd-search .results");if(!r||!i)throw new Error("The input field or the result list wrapper was not found");i.addEventListener("mouseup",()=>{re(t)}),r.addEventListener("focus",()=>t.classList.add("has-focus")),We(t,i,r,e)}function We(t,e,n,r){n.addEventListener("input",ue(()=>{Ue(t,e,n,r)},200)),n.addEventListener("keydown",i=>{i.key=="Enter"?Je(e,t):i.key=="ArrowUp"?(me(e,n,-1),i.preventDefault()):i.key==="ArrowDown"&&(me(e,n,1),i.preventDefault())}),document.body.addEventListener("keypress",i=>{i.altKey||i.ctrlKey||i.metaKey||!n.matches(":focus")&&i.key==="/"&&(i.preventDefault(),n.focus())}),document.body.addEventListener("keyup",i=>{t.classList.contains("has-focus")&&(i.key==="Escape"||!e.matches(":focus-within")&&!n.matches(":focus"))&&(n.blur(),re(t))})}function re(t){t.classList.remove("has-focus")}function Ue(t,e,n,r){if(!r.index||!r.data)return;e.textContent="";let i=n.value.trim(),s;if(i){let o=i.split(" ").map(a=>a.length?`*${a}*`:"").join(" ");s=r.index.search(o)}else s=[];for(let o=0;oa.score-o.score);for(let o=0,a=Math.min(10,s.length);o`,d=ye(l.name,i);globalThis.DEBUG_SEARCH_WEIGHTS&&(d+=` (score: ${s[o].score.toFixed(2)})`),l.parent&&(d=` + ${ye(l.parent,i)}.${d}`);let m=document.createElement("li");m.classList.value=l.classes??"";let p=document.createElement("a");p.href=r.base+l.url,p.innerHTML=c+d,m.append(p),p.addEventListener("focus",()=>{e.querySelector(".current")?.classList.remove("current"),m.classList.add("current")}),e.appendChild(m)}}function me(t,e,n){let r=t.querySelector(".current");if(!r)r=t.querySelector(n==1?"li:first-child":"li:last-child"),r&&r.classList.add("current");else{let i=r;if(n===1)do i=i.nextElementSibling??void 0;while(i instanceof HTMLElement&&i.offsetParent==null);else do i=i.previousElementSibling??void 0;while(i instanceof HTMLElement&&i.offsetParent==null);i?(r.classList.remove("current"),i.classList.add("current")):n===-1&&(r.classList.remove("current"),e.focus())}}function Je(t,e){let n=t.querySelector(".current");if(n||(n=t.querySelector("li:first-child")),n){let r=n.querySelector("a");r&&(window.location.href=r.href),re(e)}}function ye(t,e){if(e==="")return t;let n=t.toLocaleLowerCase(),r=e.toLocaleLowerCase(),i=[],s=0,o=n.indexOf(r);for(;o!=-1;)i.push(ne(t.substring(s,o)),`${ne(t.substring(o,o+r.length))}`),s=o+r.length,o=n.indexOf(r,s);return i.push(ne(t.substring(s))),i.join("")}var Ge={"&":"&","<":"<",">":">","'":"'",'"':"""};function ne(t){return t.replace(/[&<>"'"]/g,e=>Ge[e])}var I=class{el;app;constructor(e){this.el=e.el,this.app=e.app}};var H="mousedown",Ee="mousemove",B="mouseup",X={x:0,y:0},xe=!1,ie=!1,Xe=!1,D=!1,be=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);document.documentElement.classList.add(be?"is-mobile":"not-mobile");be&&"ontouchstart"in document.documentElement&&(Xe=!0,H="touchstart",Ee="touchmove",B="touchend");document.addEventListener(H,t=>{ie=!0,D=!1;let e=H=="touchstart"?t.targetTouches[0]:t;X.y=e.pageY||0,X.x=e.pageX||0});document.addEventListener(Ee,t=>{if(ie&&!D){let e=H=="touchstart"?t.targetTouches[0]:t,n=X.x-(e.pageX||0),r=X.y-(e.pageY||0);D=Math.sqrt(n*n+r*r)>10}});document.addEventListener(B,()=>{ie=!1});document.addEventListener("click",t=>{xe&&(t.preventDefault(),t.stopImmediatePropagation(),xe=!1)});var Y=class extends I{active;className;constructor(e){super(e),this.className=this.el.dataset.toggle||"",this.el.addEventListener(B,n=>this.onPointerUp(n)),this.el.addEventListener("click",n=>n.preventDefault()),document.addEventListener(H,n=>this.onDocumentPointerDown(n)),document.addEventListener(B,n=>this.onDocumentPointerUp(n))}setActive(e){if(this.active==e)return;this.active=e,document.documentElement.classList.toggle("has-"+this.className,e),this.el.classList.toggle("active",e);let n=(this.active?"to-has-":"from-has-")+this.className;document.documentElement.classList.add(n),setTimeout(()=>document.documentElement.classList.remove(n),500)}onPointerUp(e){D||(this.setActive(!0),e.preventDefault())}onDocumentPointerDown(e){if(this.active){if(e.target.closest(".col-sidebar, .tsd-filter-group"))return;this.setActive(!1)}}onDocumentPointerUp(e){if(!D&&this.active&&e.target.closest(".col-sidebar")){let n=e.target.closest("a");if(n){let r=window.location.href;r.indexOf("#")!=-1&&(r=r.substring(0,r.indexOf("#"))),n.href.substring(0,r.length)==r&&setTimeout(()=>this.setActive(!1),250)}}}};var se;try{se=localStorage}catch{se={getItem(){return null},setItem(){}}}var C=se;var Le=document.head.appendChild(document.createElement("style"));Le.dataset.for="filters";var Z=class extends I{key;value;constructor(e){super(e),this.key=`filter-${this.el.name}`,this.value=this.el.checked,this.el.addEventListener("change",()=>{this.setLocalStorage(this.el.checked)}),this.setLocalStorage(this.fromLocalStorage()),Le.innerHTML+=`html:not(.${this.key}) .tsd-is-${this.el.name} { display: none; } +`,this.app.updateIndexVisibility()}fromLocalStorage(){let e=C.getItem(this.key);return e?e==="true":this.el.checked}setLocalStorage(e){C.setItem(this.key,e.toString()),this.value=e,this.handleValueChange()}handleValueChange(){this.el.checked=this.value,document.documentElement.classList.toggle(this.key,this.value),this.app.filterChanged(),this.app.updateIndexVisibility()}};var oe=new Map,ae=class{open;accordions=[];key;constructor(e,n){this.key=e,this.open=n}add(e){this.accordions.push(e),e.open=this.open,e.addEventListener("toggle",()=>{this.toggle(e.open)})}toggle(e){for(let n of this.accordions)n.open=e;C.setItem(this.key,e.toString())}},K=class extends I{constructor(e){super(e);let n=this.el.querySelector("summary"),r=n.querySelector("a");r&&r.addEventListener("click",()=>{location.assign(r.href)});let i=`tsd-accordion-${n.dataset.key??n.textContent.trim().replace(/\s+/g,"-").toLowerCase()}`,s;if(oe.has(i))s=oe.get(i);else{let o=C.getItem(i),a=o?o==="true":this.el.open;s=new ae(i,a),oe.set(i,s)}s.add(this.el)}};function Se(t){let e=C.getItem("tsd-theme")||"os";t.value=e,we(e),t.addEventListener("change",()=>{C.setItem("tsd-theme",t.value),we(t.value)})}function we(t){document.documentElement.dataset.theme=t}var ee;function Ce(){let t=document.getElementById("tsd-nav-script");t&&(t.addEventListener("load",Te),Te())}async function Te(){let t=document.getElementById("tsd-nav-container");if(!t||!window.navigationData)return;let e=await A(window.navigationData);ee=document.documentElement.dataset.base,ee.endsWith("/")||(ee+="/"),t.innerHTML="";for(let n of e)Ie(n,t,[]);window.app.createComponents(t),window.app.showPage(),window.app.ensureActivePageVisible()}function Ie(t,e,n){let r=e.appendChild(document.createElement("li"));if(t.children){let i=[...n,t.text],s=r.appendChild(document.createElement("details"));s.className=t.class?`${t.class} tsd-accordion`:"tsd-accordion";let o=s.appendChild(document.createElement("summary"));o.className="tsd-accordion-summary",o.dataset.key=i.join("$"),o.innerHTML='',ke(t,o);let a=s.appendChild(document.createElement("div"));a.className="tsd-accordion-details";let l=a.appendChild(document.createElement("ul"));l.className="tsd-nested-navigation";for(let c of t.children)Ie(c,l,i)}else ke(t,r,t.class)}function ke(t,e,n){if(t.path){let r=e.appendChild(document.createElement("a"));if(r.href=ee+t.path,n&&(r.className=n),location.pathname===r.pathname&&!r.href.includes("#")&&r.classList.add("current"),t.kind){let i=window.translations[`kind_${t.kind}`].replaceAll('"',""");r.innerHTML=``}r.appendChild(document.createElement("span")).textContent=t.text}else{let r=e.appendChild(document.createElement("span")),i=window.translations.folder.replaceAll('"',""");r.innerHTML=``,r.appendChild(document.createElement("span")).textContent=t.text}}var te=document.documentElement.dataset.base;te.endsWith("/")||(te+="/");function Pe(){document.querySelector(".tsd-full-hierarchy")?Ye():document.querySelector(".tsd-hierarchy")&&Ze()}function Ye(){document.addEventListener("click",r=>{let i=r.target;for(;i.parentElement&&i.parentElement.tagName!="LI";)i=i.parentElement;i.dataset.dropdown&&(i.dataset.dropdown=String(i.dataset.dropdown!=="true"))});let t=new Map,e=new Set;for(let r of document.querySelectorAll(".tsd-full-hierarchy [data-refl]")){let i=r.querySelector("ul");t.has(r.dataset.refl)?e.add(r.dataset.refl):i&&t.set(r.dataset.refl,i)}for(let r of e)n(r);function n(r){let i=t.get(r).cloneNode(!0);i.querySelectorAll("[id]").forEach(s=>{s.removeAttribute("id")}),i.querySelectorAll("[data-dropdown]").forEach(s=>{s.dataset.dropdown="false"});for(let s of document.querySelectorAll(`[data-refl="${r}"]`)){let o=tt(),a=s.querySelector("ul");s.insertBefore(o,a),o.dataset.dropdown=String(!!a),a||s.appendChild(i.cloneNode(!0))}}}function Ze(){let t=document.getElementById("tsd-hierarchy-script");t&&(t.addEventListener("load",Qe),Qe())}async function Qe(){let t=document.querySelector(".tsd-panel.tsd-hierarchy:has(h4 a)");if(!t||!window.hierarchyData)return;let e=+t.dataset.refl,n=await A(window.hierarchyData),r=t.querySelector("ul"),i=document.createElement("ul");if(i.classList.add("tsd-hierarchy"),Ke(i,n,e),r.querySelectorAll("li").length==i.querySelectorAll("li").length)return;let s=document.createElement("span");s.classList.add("tsd-hierarchy-toggle"),s.textContent=window.translations.hierarchy_expand,t.querySelector("h4 a")?.insertAdjacentElement("afterend",s),s.insertAdjacentText("beforebegin",", "),s.addEventListener("click",()=>{s.textContent===window.translations.hierarchy_expand?(r.insertAdjacentElement("afterend",i),r.remove(),s.textContent=window.translations.hierarchy_collapse):(i.insertAdjacentElement("afterend",r),i.remove(),s.textContent=window.translations.hierarchy_expand)})}function Ke(t,e,n){let r=e.roots.filter(i=>et(e,i,n));for(let i of r)t.appendChild(_e(e,i,n))}function _e(t,e,n,r=new Set){if(r.has(e))return;r.add(e);let i=t.reflections[e],s=document.createElement("li");if(s.classList.add("tsd-hierarchy-item"),e===n){let o=s.appendChild(document.createElement("span"));o.textContent=i.name,o.classList.add("tsd-hierarchy-target")}else{for(let a of i.uniqueNameParents||[]){let l=t.reflections[a],c=s.appendChild(document.createElement("a"));c.textContent=l.name,c.href=te+l.url,c.className=l.class+" tsd-signature-type",s.append(document.createTextNode("."))}let o=s.appendChild(document.createElement("a"));o.textContent=t.reflections[e].name,o.href=te+i.url,o.className=i.class+" tsd-signature-type"}if(i.children){let o=s.appendChild(document.createElement("ul"));o.classList.add("tsd-hierarchy");for(let a of i.children){let l=_e(t,a,n,r);l&&o.appendChild(l)}}return r.delete(e),s}function et(t,e,n){if(e===n)return!0;let r=new Set,i=[t.reflections[e]];for(;i.length;){let s=i.pop();if(!r.has(s)){r.add(s);for(let o of s.children||[]){if(o===n)return!0;i.push(t.reflections[o])}}}return!1}function tt(){let t=document.createElementNS("http://www.w3.org/2000/svg","svg");return t.setAttribute("width","20"),t.setAttribute("height","20"),t.setAttribute("viewBox","0 0 24 24"),t.setAttribute("fill","none"),t.innerHTML='',t}G(Y,"a[data-toggle]");G(K,".tsd-accordion");G(Z,".tsd-filter-item input[type=checkbox]");var Oe=document.getElementById("tsd-theme");Oe&&Se(Oe);var nt=new J;Object.defineProperty(window,"app",{value:nt});ve();Ce();Pe();})(); /*! Bundled license information: lunr/lunr.js: diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/assets/navigation.js b/v3/internal/runtime/desktop/@wailsio/runtime/docs/assets/navigation.js index afd558a28..671dd0d8a 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/assets/navigation.js +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/assets/navigation.js @@ -1 +1 @@ -window.navigationData = "data:application/octet-stream;base64,H4sIAAAAAAAAA5WYUU/bMBDHv0ue0aYxhibeCgWGRGBrN/UB7cFNr2DhOJHjFMq07z45jlOnOf7NnkC5//18Pp/vDA9/EkuvNjlLJmWpZCasLHRylJTCPiVnSV6sakXVx8j44cnmKjlKnqVeJWcnR0n2JNXKkE7OHjrYN7miHWVd68y59jlO04ednvw96hA/amkPIZwGIOZPxcshhNMMEL8jyLkpXioyw5y0hlH5uC9J/5rdcsEETCuBsVwIpYaBuK+jopjV2sqcLo0pov1kSlRVwMSSPvPT8de9SO7LZgc7ktSWzFpkARaJ+qzjL6dxhrc3Uy4zDcMZwRGfb+9EzpZa6+3MwL+f0T3vYWL3z0PJclkIs2IOJZhGncyc7E/3GxdJB2pFYDeHGSygtyVDwhKzn+b7qM1M9JYNwhMmegt2MDFGQG9nh/Vgaa5kxpeEZ3QawElFCQipKIHvXa2UWCoUQpCg5mVNnfGn6RleAA9zKoUqHqvhabaGUcd5Xlsbz4TolgeMl6A7fiUVXUll40bKgHYyBEupqsQjeSfUhQKWc0ALuF7sQhm/AuuBlpiLDf3fEqwHWmKvz+8KKBCZLt8rwRu9LpC/swP3kBOECBr4EKCq/yoZYoIG3ac2fQgTNACzEEZL/YgorQTezMsNactcTP991L1cCKmqRj+c5S1mJ0Gz/Oe2pCiUjTDS9aaO0tj7gM/H8V5y/qXWujszqpL1Gjjfr9fYd8LP7537hJnhEYEtq+CN6ulep7WysuQrqiMEESTx46pjwElVka3ZWdW6N3ZYi1dKcDOi+TyqEq/JOjEXhIe0AhjFPDNEmomjNYx74VI8MqMmGiBOANtyo4MI/xNC5BthhHwjBLgm+05dB4JXgLK4JntRG9PrDiymVWHUdyNzYdiHWYRqVfiYt5WlnDnl5vuoQ77UG2kKnZO2/QkVZ9rj9qRw5s8PwbwCMS5EKZZSSSvjhhrlyoNiGch7FDyARSo0yqtJOj09AZxWgRmzFBNm6SH/QzE4BWRMhXlOC/7fCx0miDCJljXbtHYYp4CMW6nrV8hoFJCRigwSUpFB/4XUq+IFFVynARypN8UzyqoXwMu9SG+HN3uR3o681u/90eQI3grin5EqxOo9d2/FwTcp4t5B3gJeQFLzLyD3fbjmP+Wr38F0EwAA" \ No newline at end of file +window.navigationData = "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" \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/assets/search.js b/v3/internal/runtime/desktop/@wailsio/runtime/docs/assets/search.js index ba19b9dbf..075d3a4de 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/assets/search.js +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/assets/search.js @@ -1 +1 @@ -window.searchData = "data:application/octet-stream;base64,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"; \ No newline at end of file +window.searchData = "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"; \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/assets/style.css b/v3/internal/runtime/desktop/@wailsio/runtime/docs/assets/style.css index 072daed85..2ab8b836e 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/assets/style.css +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/assets/style.css @@ -1,87 +1,247 @@ -:root { - /* Light */ - --light-color-background: #f2f4f8; - --light-color-background-secondary: #eff0f1; - --light-color-warning-text: #222; - --light-color-background-warning: #e6e600; - --light-color-icon-background: var(--light-color-background); - --light-color-accent: #c5c7c9; - --light-color-active-menu-item: var(--light-color-accent); - --light-color-text: #222; - --light-color-text-aside: #6e6e6e; - --light-color-link: #1f70c2; - - --light-color-ts-keyword: #056bd6; - --light-color-ts-project: #b111c9; - --light-color-ts-module: var(--light-color-ts-project); - --light-color-ts-namespace: var(--light-color-ts-project); - --light-color-ts-enum: #7e6f15; - --light-color-ts-enum-member: var(--light-color-ts-enum); - --light-color-ts-variable: #4760ec; - --light-color-ts-function: #572be7; - --light-color-ts-class: #1f70c2; - --light-color-ts-interface: #108024; - --light-color-ts-constructor: var(--light-color-ts-class); - --light-color-ts-property: var(--light-color-ts-variable); - --light-color-ts-method: var(--light-color-ts-function); - --light-color-ts-call-signature: var(--light-color-ts-method); - --light-color-ts-index-signature: var(--light-color-ts-property); - --light-color-ts-constructor-signature: var(--light-color-ts-constructor); - --light-color-ts-parameter: var(--light-color-ts-variable); - /* type literal not included as links will never be generated to it */ - --light-color-ts-type-parameter: #a55c0e; - --light-color-ts-accessor: var(--light-color-ts-property); - --light-color-ts-get-signature: var(--light-color-ts-accessor); - --light-color-ts-set-signature: var(--light-color-ts-accessor); - --light-color-ts-type-alias: #d51270; - /* reference not included as links will be colored with the kind that it points to */ - - --light-external-icon: url("data:image/svg+xml;utf8,"); - --light-color-scheme: light; - - /* Dark */ - --dark-color-background: #2b2e33; - --dark-color-background-secondary: #1e2024; - --dark-color-background-warning: #bebe00; - --dark-color-warning-text: #222; - --dark-color-icon-background: var(--dark-color-background-secondary); - --dark-color-accent: #9096a2; - --dark-color-active-menu-item: #5d5d6a; - --dark-color-text: #f5f5f5; - --dark-color-text-aside: #dddddd; - --dark-color-link: #00aff4; - - --dark-color-ts-keyword: #3399ff; - --dark-color-ts-project: #e358ff; - --dark-color-ts-module: var(--dark-color-ts-project); - --dark-color-ts-namespace: var(--dark-color-ts-project); - --dark-color-ts-enum: #f4d93e; - --dark-color-ts-enum-member: var(--dark-color-ts-enum); - --dark-color-ts-variable: #798dff; - --dark-color-ts-function: #a280ff; - --dark-color-ts-class: #8ac4ff; - --dark-color-ts-interface: #6cff87; - --dark-color-ts-constructor: var(--dark-color-ts-class); - --dark-color-ts-property: var(--dark-color-ts-variable); - --dark-color-ts-method: var(--dark-color-ts-function); - --dark-color-ts-call-signature: var(--dark-color-ts-method); - --dark-color-ts-index-signature: var(--dark-color-ts-property); - --dark-color-ts-constructor-signature: var(--dark-color-ts-constructor); - --dark-color-ts-parameter: var(--dark-color-ts-variable); - /* type literal not included as links will never be generated to it */ - --dark-color-ts-type-parameter: #e07d13; - --dark-color-ts-accessor: var(--dark-color-ts-property); - --dark-color-ts-get-signature: var(--dark-color-ts-accessor); - --dark-color-ts-set-signature: var(--dark-color-ts-accessor); - --dark-color-ts-type-alias: #ff6492; - /* reference not included as links will be colored with the kind that it points to */ - - --dark-external-icon: url("data:image/svg+xml;utf8,"); - --dark-color-scheme: dark; -} - -@media (prefers-color-scheme: light) { +@layer typedoc { :root { + /* Light */ + --light-color-background: #f2f4f8; + --light-color-background-secondary: #eff0f1; + --light-color-warning-text: #222; + --light-color-background-warning: #e6e600; + --light-color-accent: #c5c7c9; + --light-color-active-menu-item: var(--light-color-accent); + --light-color-text: #222; + --light-color-text-aside: #6e6e6e; + + --light-color-icon-background: var(--light-color-background); + --light-color-icon-text: var(--light-color-text); + + --light-color-comment-tag-text: var(--light-color-text); + --light-color-comment-tag: var(--light-color-background); + + --light-color-link: #1f70c2; + --light-color-focus-outline: #3584e4; + + --light-color-ts-keyword: #056bd6; + --light-color-ts-project: #b111c9; + --light-color-ts-module: var(--light-color-ts-project); + --light-color-ts-namespace: var(--light-color-ts-project); + --light-color-ts-enum: #7e6f15; + --light-color-ts-enum-member: var(--light-color-ts-enum); + --light-color-ts-variable: #4760ec; + --light-color-ts-function: #572be7; + --light-color-ts-class: #1f70c2; + --light-color-ts-interface: #108024; + --light-color-ts-constructor: var(--light-color-ts-class); + --light-color-ts-property: #9f5f30; + --light-color-ts-method: #be3989; + --light-color-ts-reference: #ff4d82; + --light-color-ts-call-signature: var(--light-color-ts-method); + --light-color-ts-index-signature: var(--light-color-ts-property); + --light-color-ts-constructor-signature: var( + --light-color-ts-constructor + ); + --light-color-ts-parameter: var(--light-color-ts-variable); + /* type literal not included as links will never be generated to it */ + --light-color-ts-type-parameter: #a55c0e; + --light-color-ts-accessor: #c73c3c; + --light-color-ts-get-signature: var(--light-color-ts-accessor); + --light-color-ts-set-signature: var(--light-color-ts-accessor); + --light-color-ts-type-alias: #d51270; + /* reference not included as links will be colored with the kind that it points to */ + --light-color-document: #000000; + + --light-color-alert-note: #0969d9; + --light-color-alert-tip: #1a7f37; + --light-color-alert-important: #8250df; + --light-color-alert-warning: #9a6700; + --light-color-alert-caution: #cf222e; + + --light-external-icon: url("data:image/svg+xml;utf8,"); + --light-color-scheme: light; + + /* Dark */ + --dark-color-background: #2b2e33; + --dark-color-background-secondary: #1e2024; + --dark-color-background-warning: #bebe00; + --dark-color-warning-text: #222; + --dark-color-accent: #9096a2; + --dark-color-active-menu-item: #5d5d6a; + --dark-color-text: #f5f5f5; + --dark-color-text-aside: #dddddd; + + --dark-color-icon-background: var(--dark-color-background-secondary); + --dark-color-icon-text: var(--dark-color-text); + + --dark-color-comment-tag-text: var(--dark-color-text); + --dark-color-comment-tag: var(--dark-color-background); + + --dark-color-link: #00aff4; + --dark-color-focus-outline: #4c97f2; + + --dark-color-ts-keyword: #3399ff; + --dark-color-ts-project: #e358ff; + --dark-color-ts-module: var(--dark-color-ts-project); + --dark-color-ts-namespace: var(--dark-color-ts-project); + --dark-color-ts-enum: #f4d93e; + --dark-color-ts-enum-member: var(--dark-color-ts-enum); + --dark-color-ts-variable: #798dff; + --dark-color-ts-function: #a280ff; + --dark-color-ts-class: #8ac4ff; + --dark-color-ts-interface: #6cff87; + --dark-color-ts-constructor: var(--dark-color-ts-class); + --dark-color-ts-property: #ff984d; + --dark-color-ts-method: #ff4db8; + --dark-color-ts-reference: #ff4d82; + --dark-color-ts-call-signature: var(--dark-color-ts-method); + --dark-color-ts-index-signature: var(--dark-color-ts-property); + --dark-color-ts-constructor-signature: var(--dark-color-ts-constructor); + --dark-color-ts-parameter: var(--dark-color-ts-variable); + /* type literal not included as links will never be generated to it */ + --dark-color-ts-type-parameter: #e07d13; + --dark-color-ts-accessor: #ff6060; + --dark-color-ts-get-signature: var(--dark-color-ts-accessor); + --dark-color-ts-set-signature: var(--dark-color-ts-accessor); + --dark-color-ts-type-alias: #ff6492; + /* reference not included as links will be colored with the kind that it points to */ + --dark-color-document: #ffffff; + + --dark-color-alert-note: #0969d9; + --dark-color-alert-tip: #1a7f37; + --dark-color-alert-important: #8250df; + --dark-color-alert-warning: #9a6700; + --dark-color-alert-caution: #cf222e; + + --dark-external-icon: url("data:image/svg+xml;utf8,"); + --dark-color-scheme: dark; + } + + @media (prefers-color-scheme: light) { + :root { + --color-background: var(--light-color-background); + --color-background-secondary: var( + --light-color-background-secondary + ); + --color-background-warning: var(--light-color-background-warning); + --color-warning-text: var(--light-color-warning-text); + --color-accent: var(--light-color-accent); + --color-active-menu-item: var(--light-color-active-menu-item); + --color-text: var(--light-color-text); + --color-text-aside: var(--light-color-text-aside); + + --color-icon-background: var(--light-color-icon-background); + --color-icon-text: var(--light-color-icon-text); + + --color-comment-tag-text: var(--light-color-text); + --color-comment-tag: var(--light-color-background); + + --color-link: var(--light-color-link); + --color-focus-outline: var(--light-color-focus-outline); + + --color-ts-keyword: var(--light-color-ts-keyword); + --color-ts-project: var(--light-color-ts-project); + --color-ts-module: var(--light-color-ts-module); + --color-ts-namespace: var(--light-color-ts-namespace); + --color-ts-enum: var(--light-color-ts-enum); + --color-ts-enum-member: var(--light-color-ts-enum-member); + --color-ts-variable: var(--light-color-ts-variable); + --color-ts-function: var(--light-color-ts-function); + --color-ts-class: var(--light-color-ts-class); + --color-ts-interface: var(--light-color-ts-interface); + --color-ts-constructor: var(--light-color-ts-constructor); + --color-ts-property: var(--light-color-ts-property); + --color-ts-method: var(--light-color-ts-method); + --color-ts-reference: var(--light-color-ts-reference); + --color-ts-call-signature: var(--light-color-ts-call-signature); + --color-ts-index-signature: var(--light-color-ts-index-signature); + --color-ts-constructor-signature: var( + --light-color-ts-constructor-signature + ); + --color-ts-parameter: var(--light-color-ts-parameter); + --color-ts-type-parameter: var(--light-color-ts-type-parameter); + --color-ts-accessor: var(--light-color-ts-accessor); + --color-ts-get-signature: var(--light-color-ts-get-signature); + --color-ts-set-signature: var(--light-color-ts-set-signature); + --color-ts-type-alias: var(--light-color-ts-type-alias); + --color-document: var(--light-color-document); + + --color-alert-note: var(--light-color-alert-note); + --color-alert-tip: var(--light-color-alert-tip); + --color-alert-important: var(--light-color-alert-important); + --color-alert-warning: var(--light-color-alert-warning); + --color-alert-caution: var(--light-color-alert-caution); + + --external-icon: var(--light-external-icon); + --color-scheme: var(--light-color-scheme); + } + } + + @media (prefers-color-scheme: dark) { + :root { + --color-background: var(--dark-color-background); + --color-background-secondary: var( + --dark-color-background-secondary + ); + --color-background-warning: var(--dark-color-background-warning); + --color-warning-text: var(--dark-color-warning-text); + --color-accent: var(--dark-color-accent); + --color-active-menu-item: var(--dark-color-active-menu-item); + --color-text: var(--dark-color-text); + --color-text-aside: var(--dark-color-text-aside); + + --color-icon-background: var(--dark-color-icon-background); + --color-icon-text: var(--dark-color-icon-text); + + --color-comment-tag-text: var(--dark-color-text); + --color-comment-tag: var(--dark-color-background); + + --color-link: var(--dark-color-link); + --color-focus-outline: var(--dark-color-focus-outline); + + --color-ts-keyword: var(--dark-color-ts-keyword); + --color-ts-project: var(--dark-color-ts-project); + --color-ts-module: var(--dark-color-ts-module); + --color-ts-namespace: var(--dark-color-ts-namespace); + --color-ts-enum: var(--dark-color-ts-enum); + --color-ts-enum-member: var(--dark-color-ts-enum-member); + --color-ts-variable: var(--dark-color-ts-variable); + --color-ts-function: var(--dark-color-ts-function); + --color-ts-class: var(--dark-color-ts-class); + --color-ts-interface: var(--dark-color-ts-interface); + --color-ts-constructor: var(--dark-color-ts-constructor); + --color-ts-property: var(--dark-color-ts-property); + --color-ts-method: var(--dark-color-ts-method); + --color-ts-reference: var(--dark-color-ts-reference); + --color-ts-call-signature: var(--dark-color-ts-call-signature); + --color-ts-index-signature: var(--dark-color-ts-index-signature); + --color-ts-constructor-signature: var( + --dark-color-ts-constructor-signature + ); + --color-ts-parameter: var(--dark-color-ts-parameter); + --color-ts-type-parameter: var(--dark-color-ts-type-parameter); + --color-ts-accessor: var(--dark-color-ts-accessor); + --color-ts-get-signature: var(--dark-color-ts-get-signature); + --color-ts-set-signature: var(--dark-color-ts-set-signature); + --color-ts-type-alias: var(--dark-color-ts-type-alias); + --color-document: var(--dark-color-document); + + --color-alert-note: var(--dark-color-alert-note); + --color-alert-tip: var(--dark-color-alert-tip); + --color-alert-important: var(--dark-color-alert-important); + --color-alert-warning: var(--dark-color-alert-warning); + --color-alert-caution: var(--dark-color-alert-caution); + + --external-icon: var(--dark-external-icon); + --color-scheme: var(--dark-color-scheme); + } + } + + html { + color-scheme: var(--color-scheme); + } + + body { + margin: 0; + } + + :root[data-theme="light"] { --color-background: var(--light-color-background); --color-background-secondary: var(--light-color-background-secondary); --color-background-warning: var(--light-color-background-warning); @@ -91,9 +251,16 @@ --color-active-menu-item: var(--light-color-active-menu-item); --color-text: var(--light-color-text); --color-text-aside: var(--light-color-text-aside); + --color-icon-text: var(--light-color-icon-text); + + --color-comment-tag-text: var(--light-color-text); + --color-comment-tag: var(--light-color-background); + --color-link: var(--light-color-link); + --color-focus-outline: var(--light-color-focus-outline); --color-ts-keyword: var(--light-color-ts-keyword); + --color-ts-project: var(--light-color-ts-project); --color-ts-module: var(--light-color-ts-module); --color-ts-namespace: var(--light-color-ts-namespace); --color-ts-enum: var(--light-color-ts-enum); @@ -105,6 +272,7 @@ --color-ts-constructor: var(--light-color-ts-constructor); --color-ts-property: var(--light-color-ts-property); --color-ts-method: var(--light-color-ts-method); + --color-ts-reference: var(--light-color-ts-reference); --color-ts-call-signature: var(--light-color-ts-call-signature); --color-ts-index-signature: var(--light-color-ts-index-signature); --color-ts-constructor-signature: var( @@ -116,14 +284,19 @@ --color-ts-get-signature: var(--light-color-ts-get-signature); --color-ts-set-signature: var(--light-color-ts-set-signature); --color-ts-type-alias: var(--light-color-ts-type-alias); + --color-document: var(--light-color-document); + + --color-note: var(--light-color-note); + --color-tip: var(--light-color-tip); + --color-important: var(--light-color-important); + --color-warning: var(--light-color-warning); + --color-caution: var(--light-color-caution); --external-icon: var(--light-external-icon); --color-scheme: var(--light-color-scheme); } -} -@media (prefers-color-scheme: dark) { - :root { + :root[data-theme="dark"] { --color-background: var(--dark-color-background); --color-background-secondary: var(--dark-color-background-secondary); --color-background-warning: var(--dark-color-background-warning); @@ -133,9 +306,16 @@ --color-active-menu-item: var(--dark-color-active-menu-item); --color-text: var(--dark-color-text); --color-text-aside: var(--dark-color-text-aside); + --color-icon-text: var(--dark-color-icon-text); + + --color-comment-tag-text: var(--dark-color-text); + --color-comment-tag: var(--dark-color-background); + --color-link: var(--dark-color-link); + --color-focus-outline: var(--dark-color-focus-outline); --color-ts-keyword: var(--dark-color-ts-keyword); + --color-ts-project: var(--dark-color-ts-project); --color-ts-module: var(--dark-color-ts-module); --color-ts-namespace: var(--dark-color-ts-namespace); --color-ts-enum: var(--dark-color-ts-enum); @@ -147,6 +327,7 @@ --color-ts-constructor: var(--dark-color-ts-constructor); --color-ts-property: var(--dark-color-ts-property); --color-ts-method: var(--dark-color-ts-method); + --color-ts-reference: var(--dark-color-ts-reference); --color-ts-call-signature: var(--dark-color-ts-call-signature); --color-ts-index-signature: var(--dark-color-ts-index-signature); --color-ts-constructor-signature: var( @@ -158,1258 +339,1273 @@ --color-ts-get-signature: var(--dark-color-ts-get-signature); --color-ts-set-signature: var(--dark-color-ts-set-signature); --color-ts-type-alias: var(--dark-color-ts-type-alias); + --color-document: var(--dark-color-document); + + --color-note: var(--dark-color-note); + --color-tip: var(--dark-color-tip); + --color-important: var(--dark-color-important); + --color-warning: var(--dark-color-warning); + --color-caution: var(--dark-color-caution); --external-icon: var(--dark-external-icon); --color-scheme: var(--dark-color-scheme); } -} -html { - color-scheme: var(--color-scheme); -} - -body { - margin: 0; -} - -:root[data-theme="light"] { - --color-background: var(--light-color-background); - --color-background-secondary: var(--light-color-background-secondary); - --color-background-warning: var(--light-color-background-warning); - --color-warning-text: var(--light-color-warning-text); - --color-icon-background: var(--light-color-icon-background); - --color-accent: var(--light-color-accent); - --color-active-menu-item: var(--light-color-active-menu-item); - --color-text: var(--light-color-text); - --color-text-aside: var(--light-color-text-aside); - --color-link: var(--light-color-link); - - --color-ts-keyword: var(--light-color-ts-keyword); - --color-ts-module: var(--light-color-ts-module); - --color-ts-namespace: var(--light-color-ts-namespace); - --color-ts-enum: var(--light-color-ts-enum); - --color-ts-enum-member: var(--light-color-ts-enum-member); - --color-ts-variable: var(--light-color-ts-variable); - --color-ts-function: var(--light-color-ts-function); - --color-ts-class: var(--light-color-ts-class); - --color-ts-interface: var(--light-color-ts-interface); - --color-ts-constructor: var(--light-color-ts-constructor); - --color-ts-property: var(--light-color-ts-property); - --color-ts-method: var(--light-color-ts-method); - --color-ts-call-signature: var(--light-color-ts-call-signature); - --color-ts-index-signature: var(--light-color-ts-index-signature); - --color-ts-constructor-signature: var( - --light-color-ts-constructor-signature - ); - --color-ts-parameter: var(--light-color-ts-parameter); - --color-ts-type-parameter: var(--light-color-ts-type-parameter); - --color-ts-accessor: var(--light-color-ts-accessor); - --color-ts-get-signature: var(--light-color-ts-get-signature); - --color-ts-set-signature: var(--light-color-ts-set-signature); - --color-ts-type-alias: var(--light-color-ts-type-alias); - - --external-icon: var(--light-external-icon); - --color-scheme: var(--light-color-scheme); -} - -:root[data-theme="dark"] { - --color-background: var(--dark-color-background); - --color-background-secondary: var(--dark-color-background-secondary); - --color-background-warning: var(--dark-color-background-warning); - --color-warning-text: var(--dark-color-warning-text); - --color-icon-background: var(--dark-color-icon-background); - --color-accent: var(--dark-color-accent); - --color-active-menu-item: var(--dark-color-active-menu-item); - --color-text: var(--dark-color-text); - --color-text-aside: var(--dark-color-text-aside); - --color-link: var(--dark-color-link); - - --color-ts-keyword: var(--dark-color-ts-keyword); - --color-ts-module: var(--dark-color-ts-module); - --color-ts-namespace: var(--dark-color-ts-namespace); - --color-ts-enum: var(--dark-color-ts-enum); - --color-ts-enum-member: var(--dark-color-ts-enum-member); - --color-ts-variable: var(--dark-color-ts-variable); - --color-ts-function: var(--dark-color-ts-function); - --color-ts-class: var(--dark-color-ts-class); - --color-ts-interface: var(--dark-color-ts-interface); - --color-ts-constructor: var(--dark-color-ts-constructor); - --color-ts-property: var(--dark-color-ts-property); - --color-ts-method: var(--dark-color-ts-method); - --color-ts-call-signature: var(--dark-color-ts-call-signature); - --color-ts-index-signature: var(--dark-color-ts-index-signature); - --color-ts-constructor-signature: var( - --dark-color-ts-constructor-signature - ); - --color-ts-parameter: var(--dark-color-ts-parameter); - --color-ts-type-parameter: var(--dark-color-ts-type-parameter); - --color-ts-accessor: var(--dark-color-ts-accessor); - --color-ts-get-signature: var(--dark-color-ts-get-signature); - --color-ts-set-signature: var(--dark-color-ts-set-signature); - --color-ts-type-alias: var(--dark-color-ts-type-alias); - - --external-icon: var(--dark-external-icon); - --color-scheme: var(--dark-color-scheme); -} - -.always-visible, -.always-visible .tsd-signatures { - display: inherit !important; -} - -h1, -h2, -h3, -h4, -h5, -h6 { - line-height: 1.2; -} - -h1 > a:not(.link), -h2 > a:not(.link), -h3 > a:not(.link), -h4 > a:not(.link), -h5 > a:not(.link), -h6 > a:not(.link) { - text-decoration: none; - color: var(--color-text); -} - -h1 { - font-size: 1.875rem; - margin: 0.67rem 0; -} - -h2 { - font-size: 1.5rem; - margin: 0.83rem 0; -} - -h3 { - font-size: 1.25rem; - margin: 1rem 0; -} - -h4 { - font-size: 1.05rem; - margin: 1.33rem 0; -} - -h5 { - font-size: 1rem; - margin: 1.5rem 0; -} - -h6 { - font-size: 0.875rem; - margin: 2.33rem 0; -} - -.uppercase { - text-transform: uppercase; -} - -dl, -menu, -ol, -ul { - margin: 1em 0; -} - -dd { - margin: 0 0 0 40px; -} - -.container { - max-width: 1700px; - padding: 0 2rem; -} - -/* Footer */ -.tsd-generator { - border-top: 1px solid var(--color-accent); - padding-top: 1rem; - padding-bottom: 1rem; - max-height: 3.5rem; -} - -.tsd-generator > p { - margin-top: 0; - margin-bottom: 0; - padding: 0 1rem; -} - -.container-main { - margin: 0 auto; - /* toolbar, footer, margin */ - min-height: calc(100vh - 41px - 56px - 4rem); -} - -@keyframes fade-in { - from { - opacity: 0; + *:focus-visible, + .tsd-accordion-summary:focus-visible svg { + outline: 2px solid var(--color-focus-outline); } - to { + + .always-visible, + .always-visible .tsd-signatures { + display: inherit !important; + } + + h1, + h2, + h3, + h4, + h5, + h6 { + line-height: 1.2; + } + + h1 { + font-size: 1.875rem; + margin: 0.67rem 0; + } + + h2 { + font-size: 1.5rem; + margin: 0.83rem 0; + } + + h3 { + font-size: 1.25rem; + margin: 1rem 0; + } + + h4 { + font-size: 1.05rem; + margin: 1.33rem 0; + } + + h5 { + font-size: 1rem; + margin: 1.5rem 0; + } + + h6 { + font-size: 0.875rem; + margin: 2.33rem 0; + } + + dl, + menu, + ol, + ul { + margin: 1em 0; + } + + dd { + margin: 0 0 0 34px; + } + + .container { + max-width: 1700px; + padding: 0 2rem; + } + + /* Footer */ + footer { + border-top: 1px solid var(--color-accent); + padding-top: 1rem; + padding-bottom: 1rem; + max-height: 3.5rem; + } + footer > p { + margin: 0 1em; + } + + .container-main { + margin: 0 auto; + /* toolbar, footer, margin */ + min-height: calc(100vh - 41px - 56px - 4rem); + } + + @keyframes fade-in { + from { + opacity: 0; + } + to { + opacity: 1; + } + } + @keyframes fade-out { + from { + opacity: 1; + visibility: visible; + } + to { + opacity: 0; + } + } + @keyframes fade-in-delayed { + 0% { + opacity: 0; + } + 33% { + opacity: 0; + } + 100% { + opacity: 1; + } + } + @keyframes fade-out-delayed { + 0% { + opacity: 1; + visibility: visible; + } + 66% { + opacity: 0; + } + 100% { + opacity: 0; + } + } + @keyframes pop-in-from-right { + from { + transform: translate(100%, 0); + } + to { + transform: translate(0, 0); + } + } + @keyframes pop-out-to-right { + from { + transform: translate(0, 0); + visibility: visible; + } + to { + transform: translate(100%, 0); + } + } + body { + background: var(--color-background); + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", + Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; + font-size: 16px; + color: var(--color-text); + } + + a { + color: var(--color-link); + text-decoration: none; + } + a:hover { + text-decoration: underline; + } + a.external[target="_blank"] { + background-image: var(--external-icon); + background-position: top 3px right; + background-repeat: no-repeat; + padding-right: 13px; + } + a.tsd-anchor-link { + color: var(--color-text); + } + + code, + pre { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + padding: 0.2em; + margin: 0; + font-size: 0.875rem; + border-radius: 0.8em; + } + + pre { + position: relative; + white-space: pre-wrap; + word-wrap: break-word; + padding: 10px; + border: 1px solid var(--color-accent); + margin-bottom: 8px; + } + pre code { + padding: 0; + font-size: 100%; + } + pre > button { + position: absolute; + top: 10px; + right: 10px; + opacity: 0; + transition: opacity 0.1s; + box-sizing: border-box; + } + pre:hover > button, + pre > button.visible { opacity: 1; } -} -@keyframes fade-out { - from { - opacity: 1; - visibility: visible; + + blockquote { + margin: 1em 0; + padding-left: 1em; + border-left: 4px solid gray; } - to { + + .tsd-typography { + line-height: 1.333em; + } + .tsd-typography ul { + list-style: square; + padding: 0 0 0 20px; + margin: 0; + } + .tsd-typography .tsd-index-panel h3, + .tsd-index-panel .tsd-typography h3, + .tsd-typography h4, + .tsd-typography h5, + .tsd-typography h6 { + font-size: 1em; + } + .tsd-typography h5, + .tsd-typography h6 { + font-weight: normal; + } + .tsd-typography p, + .tsd-typography ul, + .tsd-typography ol { + margin: 1em 0; + } + .tsd-typography table { + border-collapse: collapse; + border: none; + } + .tsd-typography td, + .tsd-typography th { + padding: 6px 13px; + border: 1px solid var(--color-accent); + } + .tsd-typography thead, + .tsd-typography tr:nth-child(even) { + background-color: var(--color-background-secondary); + } + + .tsd-alert { + padding: 8px 16px; + margin-bottom: 16px; + border-left: 0.25em solid var(--alert-color); + } + .tsd-alert blockquote > :last-child, + .tsd-alert > :last-child { + margin-bottom: 0; + } + .tsd-alert-title { + color: var(--alert-color); + display: inline-flex; + align-items: center; + } + .tsd-alert-title span { + margin-left: 4px; + } + + .tsd-alert-note { + --alert-color: var(--color-alert-note); + } + .tsd-alert-tip { + --alert-color: var(--color-alert-tip); + } + .tsd-alert-important { + --alert-color: var(--color-alert-important); + } + .tsd-alert-warning { + --alert-color: var(--color-alert-warning); + } + .tsd-alert-caution { + --alert-color: var(--color-alert-caution); + } + + .tsd-breadcrumb { + margin: 0; + padding: 0; + color: var(--color-text-aside); + } + .tsd-breadcrumb a { + color: var(--color-text-aside); + text-decoration: none; + } + .tsd-breadcrumb a:hover { + text-decoration: underline; + } + .tsd-breadcrumb li { + display: inline; + } + .tsd-breadcrumb li:after { + content: " / "; + } + + .tsd-comment-tags { + display: flex; + flex-direction: column; + } + dl.tsd-comment-tag-group { + display: flex; + align-items: center; + overflow: hidden; + margin: 0.5em 0; + } + dl.tsd-comment-tag-group dt { + display: flex; + margin-right: 0.5em; + font-size: 0.875em; + font-weight: normal; + } + dl.tsd-comment-tag-group dd { + margin: 0; + } + code.tsd-tag { + padding: 0.25em 0.4em; + border: 0.1em solid var(--color-accent); + margin-right: 0.25em; + font-size: 70%; + } + h1 code.tsd-tag:first-of-type { + margin-left: 0.25em; + } + + dl.tsd-comment-tag-group dd:before, + dl.tsd-comment-tag-group dd:after { + content: " "; + } + dl.tsd-comment-tag-group dd pre, + dl.tsd-comment-tag-group dd:after { + clear: both; + } + dl.tsd-comment-tag-group p { + margin: 0; + } + + .tsd-panel.tsd-comment .lead { + font-size: 1.1em; + line-height: 1.333em; + margin-bottom: 2em; + } + .tsd-panel.tsd-comment .lead:last-child { + margin-bottom: 0; + } + + .tsd-filter-visibility h4 { + font-size: 1rem; + padding-top: 0.75rem; + padding-bottom: 0.5rem; + margin: 0; + } + .tsd-filter-item:not(:last-child) { + margin-bottom: 0.5rem; + } + .tsd-filter-input { + display: flex; + width: -moz-fit-content; + width: fit-content; + align-items: center; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + } + .tsd-filter-input input[type="checkbox"] { + cursor: pointer; + position: absolute; + width: 1.5em; + height: 1.5em; opacity: 0; } -} -@keyframes fade-in-delayed { - 0% { - opacity: 0; + .tsd-filter-input input[type="checkbox"]:disabled { + pointer-events: none; } - 33% { - opacity: 0; - } - 100% { - opacity: 1; - } -} -@keyframes fade-out-delayed { - 0% { - opacity: 1; - visibility: visible; - } - 66% { - opacity: 0; - } - 100% { - opacity: 0; - } -} -@keyframes pop-in-from-right { - from { - transform: translate(100%, 0); - } - to { - transform: translate(0, 0); - } -} -@keyframes pop-out-to-right { - from { - transform: translate(0, 0); - visibility: visible; - } - to { - transform: translate(100%, 0); - } -} -body { - background: var(--color-background); - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", - Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; - font-size: 16px; - color: var(--color-text); -} - -a { - color: var(--color-link); - text-decoration: none; -} -a:hover { - text-decoration: underline; -} -a.external[target="_blank"] { - background-image: var(--external-icon); - background-position: top 3px right; - background-repeat: no-repeat; - padding-right: 13px; -} - -code, -pre { - font-family: Menlo, Monaco, Consolas, "Courier New", monospace; - padding: 0.2em; - margin: 0; - font-size: 0.875rem; - border-radius: 0.8em; -} - -pre { - position: relative; - white-space: pre; - white-space: pre-wrap; - word-wrap: break-word; - padding: 10px; - border: 1px solid var(--color-accent); -} -pre code { - padding: 0; - font-size: 100%; -} -pre > button { - position: absolute; - top: 10px; - right: 10px; - opacity: 0; - transition: opacity 0.1s; - box-sizing: border-box; -} -pre:hover > button, -pre > button.visible { - opacity: 1; -} - -blockquote { - margin: 1em 0; - padding-left: 1em; - border-left: 4px solid gray; -} - -.tsd-typography { - line-height: 1.333em; -} -.tsd-typography ul { - list-style: square; - padding: 0 0 0 20px; - margin: 0; -} -.tsd-typography .tsd-index-panel h3, -.tsd-index-panel .tsd-typography h3, -.tsd-typography h4, -.tsd-typography h5, -.tsd-typography h6 { - font-size: 1em; -} -.tsd-typography h5, -.tsd-typography h6 { - font-weight: normal; -} -.tsd-typography p, -.tsd-typography ul, -.tsd-typography ol { - margin: 1em 0; -} -.tsd-typography table { - border-collapse: collapse; - border: none; -} -.tsd-typography td, -.tsd-typography th { - padding: 6px 13px; - border: 1px solid var(--color-accent); -} -.tsd-typography thead, -.tsd-typography tr:nth-child(even) { - background-color: var(--color-background-secondary); -} - -.tsd-breadcrumb { - margin: 0; - padding: 0; - color: var(--color-text-aside); -} -.tsd-breadcrumb a { - color: var(--color-text-aside); - text-decoration: none; -} -.tsd-breadcrumb a:hover { - text-decoration: underline; -} -.tsd-breadcrumb li { - display: inline; -} -.tsd-breadcrumb li:after { - content: " / "; -} - -.tsd-comment-tags { - display: flex; - flex-direction: column; -} -dl.tsd-comment-tag-group { - display: flex; - align-items: center; - overflow: hidden; - margin: 0.5em 0; -} -dl.tsd-comment-tag-group dt { - display: flex; - margin-right: 0.5em; - font-size: 0.875em; - font-weight: normal; -} -dl.tsd-comment-tag-group dd { - margin: 0; -} -code.tsd-tag { - padding: 0.25em 0.4em; - border: 0.1em solid var(--color-accent); - margin-right: 0.25em; - font-size: 70%; -} -h1 code.tsd-tag:first-of-type { - margin-left: 0.25em; -} - -dl.tsd-comment-tag-group dd:before, -dl.tsd-comment-tag-group dd:after { - content: " "; -} -dl.tsd-comment-tag-group dd pre, -dl.tsd-comment-tag-group dd:after { - clear: both; -} -dl.tsd-comment-tag-group p { - margin: 0; -} - -.tsd-panel.tsd-comment .lead { - font-size: 1.1em; - line-height: 1.333em; - margin-bottom: 2em; -} -.tsd-panel.tsd-comment .lead:last-child { - margin-bottom: 0; -} - -.tsd-filter-visibility h4 { - font-size: 1rem; - padding-top: 0.75rem; - padding-bottom: 0.5rem; - margin: 0; -} -.tsd-filter-item:not(:last-child) { - margin-bottom: 0.5rem; -} -.tsd-filter-input { - display: flex; - width: fit-content; - width: -moz-fit-content; - align-items: center; - user-select: none; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - cursor: pointer; -} -.tsd-filter-input input[type="checkbox"] { - cursor: pointer; - position: absolute; - width: 1.5em; - height: 1.5em; - opacity: 0; -} -.tsd-filter-input input[type="checkbox"]:disabled { - pointer-events: none; -} -.tsd-filter-input svg { - cursor: pointer; - width: 1.5em; - height: 1.5em; - margin-right: 0.5em; - border-radius: 0.33em; - /* Leaving this at full opacity breaks event listeners on Firefox. + .tsd-filter-input svg { + cursor: pointer; + width: 1.5em; + height: 1.5em; + margin-right: 0.5em; + border-radius: 0.33em; + /* Leaving this at full opacity breaks event listeners on Firefox. Don't remove unless you know what you're doing. */ - opacity: 0.99; -} -.tsd-filter-input input[type="checkbox"]:focus + svg { - transform: scale(0.95); -} -.tsd-filter-input input[type="checkbox"]:focus:not(:focus-visible) + svg { - transform: scale(1); -} -.tsd-checkbox-background { - fill: var(--color-accent); -} -input[type="checkbox"]:checked ~ svg .tsd-checkbox-checkmark { - stroke: var(--color-text); -} -.tsd-filter-input input:disabled ~ svg > .tsd-checkbox-background { - fill: var(--color-background); - stroke: var(--color-accent); - stroke-width: 0.25rem; -} -.tsd-filter-input input:disabled ~ svg > .tsd-checkbox-checkmark { - stroke: var(--color-accent); -} - -.tsd-theme-toggle { - padding-top: 0.75rem; -} -.tsd-theme-toggle > h4 { - display: inline; - vertical-align: middle; - margin-right: 0.75rem; -} - -.tsd-hierarchy { - list-style: square; - margin: 0; -} -.tsd-hierarchy .target { - font-weight: bold; -} - -.tsd-full-hierarchy:not(:last-child) { - margin-bottom: 1em; - padding-bottom: 1em; - border-bottom: 1px solid var(--color-accent); -} -.tsd-full-hierarchy, -.tsd-full-hierarchy ul { - list-style: none; - margin: 0; - padding: 0; -} -.tsd-full-hierarchy ul { - padding-left: 1.5rem; -} -.tsd-full-hierarchy a { - padding: 0.25rem 0 !important; - font-size: 1rem; - display: inline-flex; - align-items: center; - color: var(--color-text); -} - -.tsd-panel-group.tsd-index-group { - margin-bottom: 0; -} -.tsd-index-panel .tsd-index-list { - list-style: none; - line-height: 1.333em; - margin: 0; - padding: 0.25rem 0 0 0; - overflow: hidden; - display: grid; - grid-template-columns: repeat(3, 1fr); - column-gap: 1rem; - grid-template-rows: auto; -} -@media (max-width: 1024px) { - .tsd-index-panel .tsd-index-list { - grid-template-columns: repeat(2, 1fr); + opacity: 0.99; } -} -@media (max-width: 768px) { - .tsd-index-panel .tsd-index-list { - grid-template-columns: repeat(1, 1fr); + .tsd-filter-input input[type="checkbox"]:focus-visible + svg { + outline: 2px solid var(--color-focus-outline); + } + .tsd-checkbox-background { + fill: var(--color-accent); + } + input[type="checkbox"]:checked ~ svg .tsd-checkbox-checkmark { + stroke: var(--color-text); + } + .tsd-filter-input input:disabled ~ svg > .tsd-checkbox-background { + fill: var(--color-background); + stroke: var(--color-accent); + stroke-width: 0.25rem; + } + .tsd-filter-input input:disabled ~ svg > .tsd-checkbox-checkmark { + stroke: var(--color-accent); } -} -.tsd-index-panel .tsd-index-list li { - -webkit-page-break-inside: avoid; - -moz-page-break-inside: avoid; - -ms-page-break-inside: avoid; - -o-page-break-inside: avoid; - page-break-inside: avoid; -} -.tsd-flag { - display: inline-block; - padding: 0.25em 0.4em; - border-radius: 4px; - color: var(--color-comment-tag-text); - background-color: var(--color-comment-tag); - text-indent: 0; - font-size: 75%; - line-height: 1; - font-weight: normal; -} - -.tsd-anchor { - position: relative; - top: -100px; -} - -.tsd-member { - position: relative; -} -.tsd-member .tsd-anchor + h3 { - display: flex; - align-items: center; - margin-top: 0; - margin-bottom: 0; - border-bottom: none; -} - -.tsd-navigation.settings { - margin: 1rem 0; -} -.tsd-navigation > a, -.tsd-navigation .tsd-accordion-summary { - width: calc(100% - 0.25rem); - display: flex; - align-items: center; -} -.tsd-navigation a, -.tsd-navigation summary > span, -.tsd-page-navigation a { - display: flex; - width: calc(100% - 0.25rem); - align-items: center; - padding: 0.25rem; - color: var(--color-text); - text-decoration: none; - box-sizing: border-box; -} -.tsd-navigation a.current, -.tsd-page-navigation a.current { - background: var(--color-active-menu-item); -} -.tsd-navigation a:hover, -.tsd-page-navigation a:hover { - text-decoration: underline; -} -.tsd-navigation ul, -.tsd-page-navigation ul { - margin-top: 0; - margin-bottom: 0; - padding: 0; - list-style: none; -} -.tsd-navigation li, -.tsd-page-navigation li { - padding: 0; - max-width: 100%; -} -.tsd-nested-navigation { - margin-left: 3rem; -} -.tsd-nested-navigation > li > details { - margin-left: -1.5rem; -} -.tsd-small-nested-navigation { - margin-left: 1.5rem; -} -.tsd-small-nested-navigation > li > details { - margin-left: -1.5rem; -} - -.tsd-page-navigation ul { - padding-left: 1.75rem; -} - -#tsd-sidebar-links a { - margin-top: 0; - margin-bottom: 0.5rem; - line-height: 1.25rem; -} -#tsd-sidebar-links a:last-of-type { - margin-bottom: 0; -} - -a.tsd-index-link { - padding: 0.25rem 0 !important; - font-size: 1rem; - line-height: 1.25rem; - display: inline-flex; - align-items: center; - color: var(--color-text); -} -.tsd-accordion-summary { - list-style-type: none; /* hide marker on non-safari */ - outline: none; /* broken on safari, so just hide it */ -} -.tsd-accordion-summary::-webkit-details-marker { - display: none; /* hide marker on safari */ -} -.tsd-accordion-summary, -.tsd-accordion-summary a { - user-select: none; - -moz-user-select: none; - -webkit-user-select: none; - -ms-user-select: none; - - cursor: pointer; -} -.tsd-accordion-summary a { - width: calc(100% - 1.5rem); -} -.tsd-accordion-summary > * { - margin-top: 0; - margin-bottom: 0; - padding-top: 0; - padding-bottom: 0; -} -.tsd-index-accordion .tsd-accordion-summary > svg { - margin-left: 0.25rem; -} -.tsd-index-content > :not(:first-child) { - margin-top: 0.75rem; -} -.tsd-index-heading { - margin-top: 1.5rem; - margin-bottom: 0.75rem; -} - -.tsd-kind-icon { - margin-right: 0.5rem; - width: 1.25rem; - height: 1.25rem; - min-width: 1.25rem; - min-height: 1.25rem; -} -.tsd-kind-icon path { - transform-origin: center; - transform: scale(1.1); -} -.tsd-signature > .tsd-kind-icon { - margin-right: 0.8rem; -} - -.tsd-panel { - margin-bottom: 2.5rem; -} -.tsd-panel.tsd-member { - margin-bottom: 4rem; -} -.tsd-panel:empty { - display: none; -} -.tsd-panel > h1, -.tsd-panel > h2, -.tsd-panel > h3 { - margin: 1.5rem -1.5rem 0.75rem -1.5rem; - padding: 0 1.5rem 0.75rem 1.5rem; -} -.tsd-panel > h1.tsd-before-signature, -.tsd-panel > h2.tsd-before-signature, -.tsd-panel > h3.tsd-before-signature { - margin-bottom: 0; - border-bottom: none; -} - -.tsd-panel-group { - margin: 4rem 0; -} -.tsd-panel-group.tsd-index-group { - margin: 2rem 0; -} -.tsd-panel-group.tsd-index-group details { - margin: 2rem 0; -} - -#tsd-search { - transition: background-color 0.2s; -} -#tsd-search .title { - position: relative; - z-index: 2; -} -#tsd-search .field { - position: absolute; - left: 0; - top: 0; - right: 2.5rem; - height: 100%; -} -#tsd-search .field input { - box-sizing: border-box; - position: relative; - top: -50px; - z-index: 1; - width: 100%; - padding: 0 10px; - opacity: 0; - outline: 0; - border: 0; - background: transparent; - color: var(--color-text); -} -#tsd-search .field label { - position: absolute; - overflow: hidden; - right: -40px; -} -#tsd-search .field input, -#tsd-search .title, -#tsd-toolbar-links a { - transition: opacity 0.2s; -} -#tsd-search .results { - position: absolute; - visibility: hidden; - top: 40px; - width: 100%; - margin: 0; - padding: 0; - list-style: none; - box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); -} -#tsd-search .results li { - background-color: var(--color-background); - line-height: initial; - padding: 4px; -} -#tsd-search .results li:nth-child(even) { - background-color: var(--color-background-secondary); -} -#tsd-search .results li.state { - display: none; -} -#tsd-search .results li.current:not(.no-results), -#tsd-search .results li:hover:not(.no-results) { - background-color: var(--color-accent); -} -#tsd-search .results a { - display: flex; - align-items: center; - padding: 0.25rem; - box-sizing: border-box; -} -#tsd-search .results a:before { - top: 10px; -} -#tsd-search .results span.parent { - color: var(--color-text-aside); - font-weight: normal; -} -#tsd-search.has-focus { - background-color: var(--color-accent); -} -#tsd-search.has-focus .field input { - top: 0; - opacity: 1; -} -#tsd-search.has-focus .title, -#tsd-search.has-focus #tsd-toolbar-links a { - z-index: 0; - opacity: 0; -} -#tsd-search.has-focus .results { - visibility: visible; -} -#tsd-search.loading .results li.state.loading { - display: block; -} -#tsd-search.failure .results li.state.failure { - display: block; -} - -#tsd-toolbar-links { - position: absolute; - top: 0; - right: 2rem; - height: 100%; - display: flex; - align-items: center; - justify-content: flex-end; -} -#tsd-toolbar-links a { - margin-left: 1.5rem; -} -#tsd-toolbar-links a:hover { - text-decoration: underline; -} - -.tsd-signature { - margin: 0 0 1rem 0; - padding: 1rem 0.5rem; - border: 1px solid var(--color-accent); - font-family: Menlo, Monaco, Consolas, "Courier New", monospace; - font-size: 14px; - overflow-x: auto; -} - -.tsd-signature-keyword { - color: var(--color-ts-keyword); - font-weight: normal; -} - -.tsd-signature-symbol { - color: var(--color-text-aside); - font-weight: normal; -} - -.tsd-signature-type { - font-style: italic; - font-weight: normal; -} - -.tsd-signatures { - padding: 0; - margin: 0 0 1em 0; - list-style-type: none; -} -.tsd-signatures .tsd-signature { - margin: 0; - border-color: var(--color-accent); - border-width: 1px 0; - transition: background-color 0.1s; -} -.tsd-description .tsd-signatures .tsd-signature { - border-width: 1px; -} - -ul.tsd-parameter-list, -ul.tsd-type-parameter-list { - list-style: square; - margin: 0; - padding-left: 20px; -} -ul.tsd-parameter-list > li.tsd-parameter-signature, -ul.tsd-type-parameter-list > li.tsd-parameter-signature { - list-style: none; - margin-left: -20px; -} -ul.tsd-parameter-list h5, -ul.tsd-type-parameter-list h5 { - font-size: 16px; - margin: 1em 0 0.5em 0; -} -.tsd-sources { - margin-top: 1rem; - font-size: 0.875em; -} -.tsd-sources a { - color: var(--color-text-aside); - text-decoration: underline; -} -.tsd-sources ul { - list-style: none; - padding: 0; -} - -.tsd-page-toolbar { - position: sticky; - z-index: 1; - top: 0; - left: 0; - width: 100%; - color: var(--color-text); - background: var(--color-background-secondary); - border-bottom: 1px var(--color-accent) solid; - transition: transform 0.3s ease-in-out; -} -.tsd-page-toolbar a { - color: var(--color-text); - text-decoration: none; -} -.tsd-page-toolbar a.title { - font-weight: bold; -} -.tsd-page-toolbar a.title:hover { - text-decoration: underline; -} -.tsd-page-toolbar .tsd-toolbar-contents { - display: flex; - justify-content: space-between; - height: 2.5rem; - margin: 0 auto; -} -.tsd-page-toolbar .table-cell { - position: relative; - white-space: nowrap; - line-height: 40px; -} -.tsd-page-toolbar .table-cell:first-child { - width: 100%; -} -.tsd-page-toolbar .tsd-toolbar-icon { - box-sizing: border-box; - line-height: 0; - padding: 12px 0; -} - -.tsd-widget { - display: inline-block; - overflow: hidden; - opacity: 0.8; - height: 40px; - transition: - opacity 0.1s, - background-color 0.2s; - vertical-align: bottom; - cursor: pointer; -} -.tsd-widget:hover { - opacity: 0.9; -} -.tsd-widget.active { - opacity: 1; - background-color: var(--color-accent); -} -.tsd-widget.no-caption { - width: 40px; -} -.tsd-widget.no-caption:before { - margin: 0; -} - -.tsd-widget.options, -.tsd-widget.menu { - display: none; -} -input[type="checkbox"] + .tsd-widget:before { - background-position: -120px 0; -} -input[type="checkbox"]:checked + .tsd-widget:before { - background-position: -160px 0; -} - -img { - max-width: 100%; -} - -.tsd-anchor-icon { - display: inline-flex; - align-items: center; - margin-left: 0.5rem; - vertical-align: middle; - color: var(--color-text); -} - -.tsd-anchor-icon svg { - width: 1em; - height: 1em; - visibility: hidden; -} - -.tsd-anchor-link:hover > .tsd-anchor-icon svg { - visibility: visible; -} - -.deprecated { - text-decoration: line-through !important; -} - -.warning { - padding: 1rem; - color: var(--color-warning-text); - background: var(--color-background-warning); -} - -.tsd-kind-project { - color: var(--color-ts-project); -} -.tsd-kind-module { - color: var(--color-ts-module); -} -.tsd-kind-namespace { - color: var(--color-ts-namespace); -} -.tsd-kind-enum { - color: var(--color-ts-enum); -} -.tsd-kind-enum-member { - color: var(--color-ts-enum-member); -} -.tsd-kind-variable { - color: var(--color-ts-variable); -} -.tsd-kind-function { - color: var(--color-ts-function); -} -.tsd-kind-class { - color: var(--color-ts-class); -} -.tsd-kind-interface { - color: var(--color-ts-interface); -} -.tsd-kind-constructor { - color: var(--color-ts-constructor); -} -.tsd-kind-property { - color: var(--color-ts-property); -} -.tsd-kind-method { - color: var(--color-ts-method); -} -.tsd-kind-call-signature { - color: var(--color-ts-call-signature); -} -.tsd-kind-index-signature { - color: var(--color-ts-index-signature); -} -.tsd-kind-constructor-signature { - color: var(--color-ts-constructor-signature); -} -.tsd-kind-parameter { - color: var(--color-ts-parameter); -} -.tsd-kind-type-literal { - color: var(--color-ts-type-literal); -} -.tsd-kind-type-parameter { - color: var(--color-ts-type-parameter); -} -.tsd-kind-accessor { - color: var(--color-ts-accessor); -} -.tsd-kind-get-signature { - color: var(--color-ts-get-signature); -} -.tsd-kind-set-signature { - color: var(--color-ts-set-signature); -} -.tsd-kind-type-alias { - color: var(--color-ts-type-alias); -} - -/* if we have a kind icon, don't color the text by kind */ -.tsd-kind-icon ~ span { - color: var(--color-text); -} - -* { - scrollbar-width: thin; - scrollbar-color: var(--color-accent) var(--color-icon-background); -} - -*::-webkit-scrollbar { - width: 0.75rem; -} - -*::-webkit-scrollbar-track { - background: var(--color-icon-background); -} - -*::-webkit-scrollbar-thumb { - background-color: var(--color-accent); - border-radius: 999rem; - border: 0.25rem solid var(--color-icon-background); -} - -/* mobile */ -@media (max-width: 769px) { - .tsd-widget.options, - .tsd-widget.menu { + .settings-label { + font-weight: bold; + text-transform: uppercase; display: inline-block; } - .container-main { + .tsd-filter-visibility .settings-label { + margin: 0.75rem 0 0.5rem 0; + } + + .tsd-theme-toggle .settings-label { + margin: 0.75rem 0.75rem 0 0; + } + + .tsd-hierarchy h4 label:hover span { + text-decoration: underline; + } + + .tsd-hierarchy { + list-style: square; + margin: 0; + } + .tsd-hierarchy-target { + font-weight: bold; + } + .tsd-hierarchy-toggle { + color: var(--color-link); + cursor: pointer; + } + + .tsd-full-hierarchy:not(:last-child) { + margin-bottom: 1em; + padding-bottom: 1em; + border-bottom: 1px solid var(--color-accent); + } + .tsd-full-hierarchy, + .tsd-full-hierarchy ul { + list-style: none; + margin: 0; + padding: 0; + } + .tsd-full-hierarchy ul { + padding-left: 1.5rem; + } + .tsd-full-hierarchy a { + padding: 0.25rem 0 !important; + font-size: 1rem; + display: inline-flex; + align-items: center; + color: var(--color-text); + } + .tsd-full-hierarchy svg[data-dropdown] { + cursor: pointer; + } + .tsd-full-hierarchy svg[data-dropdown="false"] { + transform: rotate(-90deg); + } + .tsd-full-hierarchy svg[data-dropdown="false"] ~ ul { + display: none; + } + + .tsd-panel-group.tsd-index-group { + margin-bottom: 0; + } + .tsd-index-panel .tsd-index-list { + list-style: none; + line-height: 1.333em; + margin: 0; + padding: 0.25rem 0 0 0; + overflow: hidden; + display: grid; + grid-template-columns: repeat(3, 1fr); + column-gap: 1rem; + grid-template-rows: auto; + } + @media (max-width: 1024px) { + .tsd-index-panel .tsd-index-list { + grid-template-columns: repeat(2, 1fr); + } + } + @media (max-width: 768px) { + .tsd-index-panel .tsd-index-list { + grid-template-columns: repeat(1, 1fr); + } + } + .tsd-index-panel .tsd-index-list li { + -webkit-page-break-inside: avoid; + -moz-page-break-inside: avoid; + -ms-page-break-inside: avoid; + -o-page-break-inside: avoid; + page-break-inside: avoid; + } + + .tsd-flag { + display: inline-block; + padding: 0.25em 0.4em; + border-radius: 4px; + color: var(--color-comment-tag-text); + background-color: var(--color-comment-tag); + text-indent: 0; + font-size: 75%; + line-height: 1; + font-weight: normal; + } + + .tsd-anchor { + position: relative; + top: -100px; + } + + .tsd-member { + position: relative; + } + .tsd-member .tsd-anchor + h3 { display: flex; + align-items: center; + margin-top: 0; + margin-bottom: 0; + border-bottom: none; } - html .col-content { - float: none; + + .tsd-navigation.settings { + margin: 1rem 0; + } + .tsd-navigation > a, + .tsd-navigation .tsd-accordion-summary { + width: calc(100% - 0.25rem); + display: flex; + align-items: center; + } + .tsd-navigation a, + .tsd-navigation summary > span, + .tsd-page-navigation a { + display: flex; + width: calc(100% - 0.25rem); + align-items: center; + padding: 0.25rem; + color: var(--color-text); + text-decoration: none; + box-sizing: border-box; + } + .tsd-navigation a.current, + .tsd-page-navigation a.current { + background: var(--color-active-menu-item); + } + .tsd-navigation a:hover, + .tsd-page-navigation a:hover { + text-decoration: underline; + } + .tsd-navigation ul, + .tsd-page-navigation ul { + margin-top: 0; + margin-bottom: 0; + padding: 0; + list-style: none; + } + .tsd-navigation li, + .tsd-page-navigation li { + padding: 0; max-width: 100%; + } + .tsd-navigation .tsd-nav-link { + display: none; + } + .tsd-nested-navigation { + margin-left: 3rem; + } + .tsd-nested-navigation > li > details { + margin-left: -1.5rem; + } + .tsd-small-nested-navigation { + margin-left: 1.5rem; + } + .tsd-small-nested-navigation > li > details { + margin-left: -1.5rem; + } + + .tsd-page-navigation-section { + margin-left: 10px; + } + .tsd-page-navigation-section > summary { + padding: 0.25rem; + } + .tsd-page-navigation-section > div { + margin-left: 20px; + } + .tsd-page-navigation ul { + padding-left: 1.75rem; + } + + #tsd-sidebar-links a { + margin-top: 0; + margin-bottom: 0.5rem; + line-height: 1.25rem; + } + #tsd-sidebar-links a:last-of-type { + margin-bottom: 0; + } + + a.tsd-index-link { + padding: 0.25rem 0 !important; + font-size: 1rem; + line-height: 1.25rem; + display: inline-flex; + align-items: center; + color: var(--color-text); + } + .tsd-accordion-summary { + list-style-type: none; /* hide marker on non-safari */ + outline: none; /* broken on safari, so just hide it */ + } + .tsd-accordion-summary::-webkit-details-marker { + display: none; /* hide marker on safari */ + } + .tsd-accordion-summary, + .tsd-accordion-summary a { + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; + + cursor: pointer; + } + .tsd-accordion-summary a { + width: calc(100% - 1.5rem); + } + .tsd-accordion-summary > * { + margin-top: 0; + margin-bottom: 0; + padding-top: 0; + padding-bottom: 0; + } + .tsd-accordion .tsd-accordion-summary > svg { + margin-left: 0.25rem; + vertical-align: text-top; + } + /* + * We need to be careful to target the arrow indicating whether the accordion + * is open, but not any other SVGs included in the details element. + */ + .tsd-accordion:not([open]) > .tsd-accordion-summary > svg:first-child, + .tsd-accordion:not([open]) > .tsd-accordion-summary > h1 > svg:first-child, + .tsd-accordion:not([open]) > .tsd-accordion-summary > h2 > svg:first-child, + .tsd-accordion:not([open]) > .tsd-accordion-summary > h3 > svg:first-child, + .tsd-accordion:not([open]) > .tsd-accordion-summary > h4 > svg:first-child, + .tsd-accordion:not([open]) > .tsd-accordion-summary > h5 > svg:first-child { + transform: rotate(-90deg); + } + .tsd-index-content > :not(:first-child) { + margin-top: 0.75rem; + } + .tsd-index-heading { + margin-top: 1.5rem; + margin-bottom: 0.75rem; + } + + .tsd-no-select { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + } + .tsd-kind-icon { + margin-right: 0.5rem; + width: 1.25rem; + height: 1.25rem; + min-width: 1.25rem; + min-height: 1.25rem; + } + .tsd-signature > .tsd-kind-icon { + margin-right: 0.8rem; + } + + .tsd-panel { + margin-bottom: 2.5rem; + } + .tsd-panel.tsd-member { + margin-bottom: 4rem; + } + .tsd-panel:empty { + display: none; + } + .tsd-panel > h1, + .tsd-panel > h2, + .tsd-panel > h3 { + margin: 1.5rem -1.5rem 0.75rem -1.5rem; + padding: 0 1.5rem 0.75rem 1.5rem; + } + .tsd-panel > h1.tsd-before-signature, + .tsd-panel > h2.tsd-before-signature, + .tsd-panel > h3.tsd-before-signature { + margin-bottom: 0; + border-bottom: none; + } + + .tsd-panel-group { + margin: 2rem 0; + } + .tsd-panel-group.tsd-index-group { + margin: 2rem 0; + } + .tsd-panel-group.tsd-index-group details { + margin: 2rem 0; + } + .tsd-panel-group > .tsd-accordion-summary { + margin-bottom: 1rem; + } + + #tsd-search { + transition: background-color 0.2s; + } + #tsd-search .title { + position: relative; + z-index: 2; + } + #tsd-search .field { + position: absolute; + left: 0; + top: 0; + right: 2.5rem; + height: 100%; + } + #tsd-search .field input { + box-sizing: border-box; + position: relative; + top: -50px; + z-index: 1; width: 100%; + padding: 0 10px; + opacity: 0; + outline: 0; + border: 0; + background: transparent; + color: var(--color-text); } - html .col-sidebar { - position: fixed !important; - overflow-y: auto; - -webkit-overflow-scrolling: touch; - z-index: 1024; - top: 0 !important; - bottom: 0 !important; - left: auto !important; - right: 0 !important; - padding: 1.5rem 1.5rem 0 0; - width: 75vw; + #tsd-search .field label { + position: absolute; + overflow: hidden; + right: -40px; + } + #tsd-search .field input, + #tsd-search .title, + #tsd-toolbar-links a { + transition: opacity 0.2s; + } + #tsd-search .results { + position: absolute; visibility: hidden; + top: 40px; + width: 100%; + margin: 0; + padding: 0; + list-style: none; + box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); + } + #tsd-search .results li { background-color: var(--color-background); - transform: translate(100%, 0); + line-height: initial; + padding: 4px; } - html .col-sidebar > *:last-child { - padding-bottom: 20px; + #tsd-search .results li:nth-child(even) { + background-color: var(--color-background-secondary); } - html .overlay { - content: ""; + #tsd-search .results li.state { + display: none; + } + #tsd-search .results li.current:not(.no-results), + #tsd-search .results li:hover:not(.no-results) { + background-color: var(--color-accent); + } + #tsd-search .results a { + display: flex; + align-items: center; + padding: 0.25rem; + box-sizing: border-box; + } + #tsd-search .results a:before { + top: 10px; + } + #tsd-search .results span.parent { + color: var(--color-text-aside); + font-weight: normal; + } + #tsd-search.has-focus { + background-color: var(--color-accent); + } + #tsd-search.has-focus .field input { + top: 0; + opacity: 1; + } + #tsd-search.has-focus .title, + #tsd-search.has-focus #tsd-toolbar-links a { + z-index: 0; + opacity: 0; + } + #tsd-search.has-focus .results { + visibility: visible; + } + #tsd-search.loading .results li.state.loading { display: block; - position: fixed; - z-index: 1023; + } + #tsd-search.failure .results li.state.failure { + display: block; + } + + #tsd-toolbar-links { + position: absolute; + top: 0; + right: 2rem; + height: 100%; + display: flex; + align-items: center; + justify-content: flex-end; + } + #tsd-toolbar-links a { + margin-left: 1.5rem; + } + #tsd-toolbar-links a:hover { + text-decoration: underline; + } + + .tsd-signature { + margin: 0 0 1rem 0; + padding: 1rem 0.5rem; + border: 1px solid var(--color-accent); + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + font-size: 14px; + overflow-x: auto; + } + + .tsd-signature-keyword { + color: var(--color-ts-keyword); + font-weight: normal; + } + + .tsd-signature-symbol { + color: var(--color-text-aside); + font-weight: normal; + } + + .tsd-signature-type { + font-style: italic; + font-weight: normal; + } + + .tsd-signatures { + padding: 0; + margin: 0 0 1em 0; + list-style-type: none; + } + .tsd-signatures .tsd-signature { + margin: 0; + border-color: var(--color-accent); + border-width: 1px 0; + transition: background-color 0.1s; + } + .tsd-signatures .tsd-index-signature:not(:last-child) { + margin-bottom: 1em; + } + .tsd-signatures .tsd-index-signature .tsd-signature { + border-width: 1px; + } + .tsd-description .tsd-signatures .tsd-signature { + border-width: 1px; + } + + ul.tsd-parameter-list, + ul.tsd-type-parameter-list { + list-style: square; + margin: 0; + padding-left: 20px; + } + ul.tsd-parameter-list > li.tsd-parameter-signature, + ul.tsd-type-parameter-list > li.tsd-parameter-signature { + list-style: none; + margin-left: -20px; + } + ul.tsd-parameter-list h5, + ul.tsd-type-parameter-list h5 { + font-size: 16px; + margin: 1em 0 0.5em 0; + } + .tsd-sources { + margin-top: 1rem; + font-size: 0.875em; + } + .tsd-sources a { + color: var(--color-text-aside); + text-decoration: underline; + } + .tsd-sources ul { + list-style: none; + padding: 0; + } + + .tsd-page-toolbar { + position: sticky; + z-index: 1; top: 0; left: 0; - right: 0; - bottom: 0; - background-color: rgba(0, 0, 0, 0.75); + width: 100%; + color: var(--color-text); + background: var(--color-background-secondary); + border-bottom: 1px var(--color-accent) solid; + transition: transform 0.3s ease-in-out; + } + .tsd-page-toolbar a { + color: var(--color-text); + text-decoration: none; + } + .tsd-page-toolbar a.title { + font-weight: bold; + } + .tsd-page-toolbar a.title:hover { + text-decoration: underline; + } + .tsd-page-toolbar .tsd-toolbar-contents { + display: flex; + justify-content: space-between; + height: 2.5rem; + margin: 0 auto; + } + .tsd-page-toolbar .table-cell { + position: relative; + white-space: nowrap; + line-height: 40px; + } + .tsd-page-toolbar .table-cell:first-child { + width: 100%; + } + .tsd-page-toolbar .tsd-toolbar-icon { + box-sizing: border-box; + line-height: 0; + padding: 12px 0; + } + + .tsd-widget { + display: inline-block; + overflow: hidden; + opacity: 0.8; + height: 40px; + transition: + opacity 0.1s, + background-color 0.2s; + vertical-align: bottom; + cursor: pointer; + } + .tsd-widget:hover { + opacity: 0.9; + } + .tsd-widget.active { + opacity: 1; + background-color: var(--color-accent); + } + .tsd-widget.no-caption { + width: 40px; + } + .tsd-widget.no-caption:before { + margin: 0; + } + + .tsd-widget.options, + .tsd-widget.menu { + display: none; + } + input[type="checkbox"] + .tsd-widget:before { + background-position: -120px 0; + } + input[type="checkbox"]:checked + .tsd-widget:before { + background-position: -160px 0; + } + + img { + max-width: 100%; + } + + .tsd-member-summary-name { + display: inline-flex; + align-items: center; + padding: 0.25rem; + text-decoration: none; + } + + .tsd-anchor-icon { + display: inline-flex; + align-items: center; + margin-left: 0.5rem; + color: var(--color-text); + } + + .tsd-anchor-icon svg { + width: 1em; + height: 1em; visibility: hidden; } - .to-has-menu .overlay { - animation: fade-in 0.4s; - } - - .to-has-menu .col-sidebar { - animation: pop-in-from-right 0.4s; - } - - .from-has-menu .overlay { - animation: fade-out 0.4s; - } - - .from-has-menu .col-sidebar { - animation: pop-out-to-right 0.4s; - } - - .has-menu body { - overflow: hidden; - } - .has-menu .overlay { + .tsd-member-summary-name:hover > .tsd-anchor-icon svg, + .tsd-anchor-link:hover > .tsd-anchor-icon svg { visibility: visible; } - .has-menu .col-sidebar { - visibility: visible; - transform: translate(0, 0); - display: flex; - flex-direction: column; - gap: 1.5rem; - max-height: 100vh; - padding: 1rem 2rem; + + .deprecated { + text-decoration: line-through !important; } - .has-menu .tsd-navigation { - max-height: 100%; - } -} - -/* one sidebar */ -@media (min-width: 770px) { - .container-main { - display: grid; - grid-template-columns: minmax(0, 1fr) minmax(0, 2fr); - grid-template-areas: "sidebar content"; - margin: 2rem auto; - } - - .col-sidebar { - grid-area: sidebar; - } - .col-content { - grid-area: content; - padding: 0 1rem; - } -} -@media (min-width: 770px) and (max-width: 1399px) { - .col-sidebar { - max-height: calc(100vh - 2rem - 42px); - overflow: auto; - position: sticky; - top: 42px; - padding-top: 1rem; - } - .site-menu { - margin-top: 1rem; - } -} - -/* two sidebars */ -@media (min-width: 1200px) { - .container-main { - grid-template-columns: minmax(0, 1fr) minmax(0, 2.5fr) minmax(0, 20rem); - grid-template-areas: "sidebar content toc"; - } - - .col-sidebar { - display: contents; - } - - .page-menu { - grid-area: toc; - padding-left: 1rem; - } - .site-menu { - grid-area: sidebar; - } - - .site-menu { - margin-top: 1rem 0; - } - - .page-menu, - .site-menu { - max-height: calc(100vh - 2rem - 42px); - overflow: auto; - position: sticky; - top: 42px; + + .warning { + padding: 1rem; + color: var(--color-warning-text); + background: var(--color-background-warning); + } + + .tsd-kind-project { + color: var(--color-ts-project); + } + .tsd-kind-module { + color: var(--color-ts-module); + } + .tsd-kind-namespace { + color: var(--color-ts-namespace); + } + .tsd-kind-enum { + color: var(--color-ts-enum); + } + .tsd-kind-enum-member { + color: var(--color-ts-enum-member); + } + .tsd-kind-variable { + color: var(--color-ts-variable); + } + .tsd-kind-function { + color: var(--color-ts-function); + } + .tsd-kind-class { + color: var(--color-ts-class); + } + .tsd-kind-interface { + color: var(--color-ts-interface); + } + .tsd-kind-constructor { + color: var(--color-ts-constructor); + } + .tsd-kind-property { + color: var(--color-ts-property); + } + .tsd-kind-method { + color: var(--color-ts-method); + } + .tsd-kind-reference { + color: var(--color-ts-reference); + } + .tsd-kind-call-signature { + color: var(--color-ts-call-signature); + } + .tsd-kind-index-signature { + color: var(--color-ts-index-signature); + } + .tsd-kind-constructor-signature { + color: var(--color-ts-constructor-signature); + } + .tsd-kind-parameter { + color: var(--color-ts-parameter); + } + .tsd-kind-type-parameter { + color: var(--color-ts-type-parameter); + } + .tsd-kind-accessor { + color: var(--color-ts-accessor); + } + .tsd-kind-get-signature { + color: var(--color-ts-get-signature); + } + .tsd-kind-set-signature { + color: var(--color-ts-set-signature); + } + .tsd-kind-type-alias { + color: var(--color-ts-type-alias); + } + + /* if we have a kind icon, don't color the text by kind */ + .tsd-kind-icon ~ span { + color: var(--color-text); + } + + * { + scrollbar-width: thin; + scrollbar-color: var(--color-accent) var(--color-icon-background); + } + + *::-webkit-scrollbar { + width: 0.75rem; + } + + *::-webkit-scrollbar-track { + background: var(--color-icon-background); + } + + *::-webkit-scrollbar-thumb { + background-color: var(--color-accent); + border-radius: 999rem; + border: 0.25rem solid var(--color-icon-background); + } + + /* mobile */ + @media (max-width: 769px) { + .tsd-widget.options, + .tsd-widget.menu { + display: inline-block; + } + + .container-main { + display: flex; + } + html .col-content { + float: none; + max-width: 100%; + width: 100%; + } + html .col-sidebar { + position: fixed !important; + overflow-y: auto; + -webkit-overflow-scrolling: touch; + z-index: 1024; + top: 0 !important; + bottom: 0 !important; + left: auto !important; + right: 0 !important; + padding: 1.5rem 1.5rem 0 0; + width: 75vw; + visibility: hidden; + background-color: var(--color-background); + transform: translate(100%, 0); + } + html .col-sidebar > *:last-child { + padding-bottom: 20px; + } + html .overlay { + content: ""; + display: block; + position: fixed; + z-index: 1023; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.75); + visibility: hidden; + } + + .to-has-menu .overlay { + animation: fade-in 0.4s; + } + + .to-has-menu .col-sidebar { + animation: pop-in-from-right 0.4s; + } + + .from-has-menu .overlay { + animation: fade-out 0.4s; + } + + .from-has-menu .col-sidebar { + animation: pop-out-to-right 0.4s; + } + + .has-menu body { + overflow: hidden; + } + .has-menu .overlay { + visibility: visible; + } + .has-menu .col-sidebar { + visibility: visible; + transform: translate(0, 0); + display: flex; + flex-direction: column; + gap: 1.5rem; + max-height: 100vh; + padding: 1rem 2rem; + } + .has-menu .tsd-navigation { + max-height: 100%; + } + #tsd-toolbar-links { + display: none; + } + .tsd-navigation .tsd-nav-link { + display: flex; + } + } + + /* one sidebar */ + @media (min-width: 770px) { + .container-main { + display: grid; + grid-template-columns: minmax(0, 1fr) minmax(0, 2fr); + grid-template-areas: "sidebar content"; + margin: 2rem auto; + } + + .col-sidebar { + grid-area: sidebar; + } + .col-content { + grid-area: content; + padding: 0 1rem; + } + } + @media (min-width: 770px) and (max-width: 1399px) { + .col-sidebar { + max-height: calc(100vh - 2rem - 42px); + overflow: auto; + position: sticky; + top: 42px; + padding-top: 1rem; + } + .site-menu { + margin-top: 1rem; + } + } + + /* two sidebars */ + @media (min-width: 1200px) { + .container-main { + grid-template-columns: minmax(0, 1fr) minmax(0, 2.5fr) minmax( + 0, + 20rem + ); + grid-template-areas: "sidebar content toc"; + } + + .col-sidebar { + display: contents; + } + + .page-menu { + grid-area: toc; + padding-left: 1rem; + } + .site-menu { + grid-area: sidebar; + } + + .site-menu { + margin-top: 1rem; + } + + .page-menu, + .site-menu { + max-height: calc(100vh - 2rem - 42px); + overflow: auto; + position: sticky; + top: 42px; + } } } diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Call.RuntimeError.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Call.RuntimeError.html index 0d9e1bcc2..ca5cfd551 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Call.RuntimeError.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Call.RuntimeError.html @@ -1,11 +1,11 @@ -RuntimeError | @wailsio/runtime

    Exception class that will be thrown in case the bound method returns an error. +RuntimeError | @wailsio/runtime

    Exception class that will be thrown in case the bound method returns an error. The value of the RuntimeError#name property is "RuntimeError".

    -

    Hierarchy

    • Error
      • RuntimeError

    Constructors

    Properties

    Constructors

    • Constructs a new RuntimeError instance.

      -

      Parameters

      • message: string

        The error message.

        -
      • Rest ...args: any[]

        Optional arguments for the Error constructor.

        -

      Returns RuntimeError

    Properties

    cause?: unknown
    message: string
    name: string
    stack?: string

    Generated using TypeDoc

    \ No newline at end of file +

    Hierarchy

    Constructors

    Properties

    Constructors

    • Constructs a new RuntimeError instance.

      +

      Parameters

      • Optionalmessage: string

        The error message.

        +
      • Optionaloptions: ErrorOptions

        Options to be forwarded to the Error constructor.

        +

      Returns RuntimeError

    Properties

    cause?: unknown
    message: string
    name: string
    stack?: string
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/CancelError.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/CancelError.html new file mode 100644 index 000000000..f58023ef1 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/CancelError.html @@ -0,0 +1,13 @@ +CancelError | @wailsio/runtime

    Exception class that will be used as rejection reason +in case a CancellablePromise is cancelled successfully.

    +

    The value of the name property is the string "CancelError". +The value of the cause property is the cause passed to the cancel method, if any.

    +

    Hierarchy

    Constructors

    Properties

    Constructors

    Properties

    cause?: unknown
    message: string
    name: string
    stack?: string
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/CancellablePromise.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/CancellablePromise.html new file mode 100644 index 000000000..3d6cdb828 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/CancellablePromise.html @@ -0,0 +1,263 @@ +CancellablePromise | @wailsio/runtime

    Class CancellablePromise<T>

    A promise with an attached method for cancelling long-running operations (see CancellablePromise#cancel). +Cancellation can optionally be bound to an AbortSignal +for better composability (see CancellablePromise#cancelOn).

    +

    Cancelling a pending promise will result in an immediate rejection +with an instance of CancelError as reason, +but whoever started the promise will be responsible +for actually aborting the underlying operation. +To this purpose, the constructor and all chaining methods +accept optional cancellation callbacks.

    +

    If a CancellablePromise still resolves after having been cancelled, +the result will be discarded. If it rejects, the reason +will be reported as an unhandled rejection, +wrapped in a CancelledRejectionError instance. +To facilitate the handling of cancellation requests, +cancelled CancellablePromises will not report unhandled CancelErrors +whose cause field is the same as the one with which the current promise was cancelled.

    +

    All usual promise methods are defined and return a CancellablePromise +whose cancel method will cancel the parent operation as well, propagating the cancellation reason +upwards through promise chains. +Conversely, cancelling a promise will not automatically cancel dependent promises downstream:

    +
    let root = new CancellablePromise((resolve, reject) => { ... });
    let child1 = root.then(() => { ... });
    let child2 = child1.then(() => { ... });
    let child3 = root.catch(() => { ... });
    child1.cancel(); // Cancels child1 and root, but not child2 or child3 +
    + +

    Cancelling a promise that has already settled is safe and has no consequence.

    +

    The cancel method returns a promise that always fulfills +after the whole chain has processed the cancel request +and all attached callbacks up to that moment have run.

    +

    All ES2024 promise methods (static and instance) are defined on CancellablePromise, +but actual availability may vary with OS/webview version.

    +

    In line with the proposal at https://github.com/tc39/proposal-rm-builtin-subclassing, +CancellablePromise does not support transparent subclassing. +Extenders should take care to provide their own method implementations. +This might be reconsidered in case the proposal is retired.

    +

    CancellablePromise is a wrapper around the DOM Promise object +and is compliant with the Promises/A+ specification +(it passes the compliance suite) +if so is the underlying implementation.

    +

    Type Parameters

    • T

    Hierarchy

    Implements

    Constructors

    • Creates a new CancellablePromise.

      +

      Type Parameters

      • T

      Parameters

      • executor: CancellablePromiseExecutor<T>

        A callback used to initialize the promise. This callback is passed two arguments: +a resolve callback used to resolve the promise with a value +or the result of another promise (possibly cancellable), +and a reject callback used to reject the promise with a provided reason or error. +If the value provided to the resolve callback is a thenable and cancellable object +(it has a then and a cancel method), +cancellation requests will be forwarded to that object and the oncancelled will not be invoked anymore. +If any one of the two callbacks is called after the promise has been cancelled, +the provided values will be cancelled and resolved as usual, +but their results will be discarded. +However, if the resolution process ultimately ends up in a rejection +that is not due to cancellation, the rejection reason +will be wrapped in a CancelledRejectionError +and bubbled up as an unhandled rejection.

        +
      • Optionaloncancelled: CancellablePromiseCanceller

        It is the caller's responsibility to ensure that any operation +started by the executor is properly halted upon cancellation. +This optional callback can be used to that purpose. +It will be called synchronously with a cancellation cause +when cancellation is requested, after the promise has already rejected +with a CancelError, but before +any then/catch/finally callback runs. +If the callback returns a thenable, the promise returned from cancel +will only fulfill after the former has settled. +Unhandled exceptions or rejections from the callback will be wrapped +in a CancelledRejectionError and bubbled up as unhandled rejections. +If the resolve callback is called before cancellation with a cancellable promise, +cancellation requests on this promise will be diverted to that promise, +and the original oncancelled callback will be discarded.

        +

      Returns CancellablePromise<T>

    Properties

    "[toStringTag]": string
    "[species]": PromiseConstructor

    Methods

    • Cancels immediately the execution of the operation associated with this promise. +The promise rejects with a CancelError instance as reason, +with the CancelError#cause property set to the given argument, if any.

      +

      Has no effect if called after the promise has already settled; +repeated calls in particular are safe, but only the first one +will set the cancellation cause.

      +

      The CancelError exception need not be handled explicitly on the promises that are being cancelled: +cancelling a promise with no attached rejection handler does not trigger an unhandled rejection event. +Therefore, the following idioms are all equally correct:

      +
      new CancellablePromise((resolve, reject) => { ... }).cancel();
      new CancellablePromise((resolve, reject) => { ... }).then(...).cancel();
      new CancellablePromise((resolve, reject) => { ... }).then(...).catch(...).cancel(); +
      + +

      Whenever some cancelled promise in a chain rejects with a CancelError +with the same cancellation cause as itself, the error will be discarded silently. +However, the CancelError will still be delivered to all attached rejection handlers +added by then and related methods:

      +
      let cancellable = new CancellablePromise((resolve, reject) => { ... });
      cancellable.then(() => { ... }).catch(console.log);
      cancellable.cancel(); // A CancelError is printed to the console. +
      + +

      If the CancelError is not handled downstream by the time it reaches +a non-cancelled promise, it will trigger an unhandled rejection event, +just like normal rejections would:

      +
      let cancellable = new CancellablePromise((resolve, reject) => { ... });
      let chained = cancellable.then(() => { ... }).then(() => { ... }); // No catch...
      cancellable.cancel(); // Unhandled rejection event on chained! +
      + +

      Therefore, it is important to either cancel whole promise chains from their tail, +as shown in the correct idioms above, or take care of handling errors everywhere.

      +

      Parameters

      • Optionalcause: any

      Returns CancellablePromise<void>

      A cancellable promise that fulfills after the cancel callback (if any) +and all handlers attached up to the call to cancel have run. +If the cancel callback returns a thenable, the promise returned by cancel +will also wait for that thenable to settle. +This enables callers to wait for the cancelled operation to terminate +without being forced to handle potential errors at the call site.

      +
      cancellable.cancel().then(() => {
      // Cleanup finished, it's safe to do something else.
      }, (err) => {
      // Unreachable: the promise returned from cancel will never reject.
      }); +
      + +

      Note that the returned promise will not handle implicitly any rejection +that might have occurred already in the cancelled chain. +It will just track whether registered handlers have been executed or not. +Therefore, unhandled rejections will never be silently handled by calling cancel.

      +
    • Binds promise cancellation to the abort event of the given AbortSignal. +If the signal has already aborted, the promise will be cancelled immediately. +When either condition is verified, the cancellation cause will be set +to the signal's abort reason (see AbortSignal.reason).

      +

      Has no effect if called (or if the signal aborts) after the promise has already settled. +Only the first signal to abort will set the cancellation cause.

      +

      For more details about the cancellation process, +see cancel and the CancellablePromise constructor.

      +

      This method enables awaiting cancellable promises without having +to store them for future cancellation, e.g.:

      +
      await longRunningOperation().cancelOn(signal);
      +
      + +

      instead of:

      +
      let promiseToBeCancelled = longRunningOperation();
      await promiseToBeCancelled; +
      + +

      Parameters

      Returns CancellablePromise<T>

      This promise, for method chaining.

      +
    • Attaches a callback for only the rejection of the Promise.

      +

      The optional oncancelled argument will be invoked when the returned promise is cancelled, +with the same semantics as the oncancelled argument of the constructor. +When the parent promise rejects or is cancelled, the onrejected callback will run, +even after the returned promise has been cancelled: +in that case, should it reject or throw, the reason will be wrapped +in a CancelledRejectionError and bubbled up as an unhandled rejection.

      +

      It is equivalent to

      +
      cancellablePromise.then(undefined, onrejected, oncancelled);
      +
      + +

      and the same caveats apply.

      +

      Type Parameters

      • TResult = never

      Parameters

      Returns CancellablePromise<T | TResult>

      A Promise for the completion of the callback. +Cancellation requests on the returned promise +will propagate up the chain to the parent promise, +but not in the other direction.

      +

      The promise returned from cancel will fulfill only after all attached handlers +up the entire promise chain have been run.

      +

      If onrejected returns a cancellable promise, +cancellation requests will be diverted to it, +and the specified oncancelled callback will be discarded. +See then for more details.

      +
    • Attaches a callback that is invoked when the CancellablePromise is settled (fulfilled or rejected). The +resolved value cannot be accessed or modified from the callback. +The returned promise will settle in the same state as the original one +after the provided callback has completed execution, +unless the callback throws or returns a rejecting promise, +in which case the returned promise will reject as well.

      +

      The optional oncancelled argument will be invoked when the returned promise is cancelled, +with the same semantics as the oncancelled argument of the constructor. +Once the parent promise settles, the onfinally callback will run, +even after the returned promise has been cancelled: +in that case, should it reject or throw, the reason will be wrapped +in a CancelledRejectionError and bubbled up as an unhandled rejection.

      +

      This method is implemented in terms of then and the same caveats apply. +It is polyfilled, hence available in every OS/webview version.

      +

      Parameters

      Returns CancellablePromise<T>

      A Promise for the completion of the callback. +Cancellation requests on the returned promise +will propagate up the chain to the parent promise, +but not in the other direction.

      +

      The promise returned from cancel will fulfill only after all attached handlers +up the entire promise chain have been run.

      +

      If onfinally returns a cancellable promise, +cancellation requests will be diverted to it, +and the specified oncancelled callback will be discarded. +See then for more details.

      +
    • Attaches callbacks for the resolution and/or rejection of the CancellablePromise.

      +

      The optional oncancelled argument will be invoked when the returned promise is cancelled, +with the same semantics as the oncancelled argument of the constructor. +When the parent promise rejects or is cancelled, the onrejected callback will run, +even after the returned promise has been cancelled: +in that case, should it reject or throw, the reason will be wrapped +in a CancelledRejectionError and bubbled up as an unhandled rejection.

      +

      Type Parameters

      • TResult1 = T
      • TResult2 = never

      Parameters

      Returns CancellablePromise<TResult1 | TResult2>

      A CancellablePromise for the completion of whichever callback is executed. +The returned promise is hooked up to propagate cancellation requests up the chain, but not down:

      +
        +
      • if the parent promise is cancelled, the onrejected handler will be invoked with a CancelError +and the returned promise will resolve regularly with its result;
      • +
      • conversely, if the returned promise is cancelled, the parent promise is cancelled too; +the onrejected handler will still be invoked with the parent's CancelError, +but its result will be discarded +and the returned promise will reject with a CancelError as well.
      • +
      +

      The promise returned from cancel will fulfill only after all attached handlers +up the entire promise chain have been run.

      +

      If either callback returns a cancellable promise, +cancellation requests will be diverted to it, +and the specified oncancelled callback will be discarded.

      +

    Static Methods

    • Creates a CancellablePromise that is resolved with an array of results +when all of the provided Promises resolve, or rejected when any Promise is rejected.

      +

      Every one of the provided objects that is a thenable and cancellable object +will be cancelled when the returned promise is cancelled, with the same cause.

      +

      Type Parameters

      • T

      Parameters

      Returns CancellablePromise<Awaited<T>[]>

    • Creates a Promise that is resolved with an array of results when all of the provided Promises +resolve, or rejected when any Promise is rejected.

      +

      Type Parameters

      • T extends [] | readonly unknown[]

      Parameters

      • values: T

        An array of Promises.

        +

      Returns CancellablePromise<
          { -readonly [P in string
          | number
          | symbol]: Awaited<T[P<P>]> },
      >

      A new Promise.

      +
    • The any function returns a promise that is fulfilled by the first given promise to be fulfilled, +or rejected with an AggregateError containing an array of rejection reasons +if all of the given promises are rejected. +It resolves all elements of the passed iterable to promises as it runs this algorithm.

      +

      Every one of the provided objects that is a thenable and cancellable object +will be cancelled when the returned promise is cancelled, with the same cause.

      +

      Type Parameters

      • T

      Parameters

      Returns CancellablePromise<Awaited<T>>

    • The any function returns a promise that is fulfilled by the first given promise to be fulfilled, or rejected with an AggregateError containing an array of rejection reasons if all of the given promises are rejected. It resolves all elements of the passed iterable to promises as it runs this algorithm.

      +

      Type Parameters

      • T extends [] | readonly unknown[]

      Parameters

      • values: T

        An array or iterable of Promises.

        +

      Returns CancellablePromise<Awaited<T[number]>>

      A new Promise.

      +
    • Creates a new CancellablePromise that resolves after the specified timeout. +The returned promise can be cancelled without consequences.

      +

      Parameters

      • milliseconds: number

      Returns CancellablePromise<void>

    • Creates a new CancellablePromise that resolves after +the specified timeout, with the provided value. +The returned promise can be cancelled without consequences.

      +

      Type Parameters

      • T

      Parameters

      • milliseconds: number
      • value: T

      Returns CancellablePromise<T>

    • Creates a new CancellablePromise that cancels +after the specified timeout, with the provided cause.

      +

      If the AbortSignal.timeout factory method is available, +it is used to base the timeout on active time rather than elapsed time. +Otherwise, timeout falls back to setTimeout.

      +

      Type Parameters

      • T = never

      Parameters

      • milliseconds: number
      • Optionalcause: any

      Returns CancellablePromise<T>

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/CancelledRejectionError.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/CancelledRejectionError.html new file mode 100644 index 000000000..583de7b96 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/CancelledRejectionError.html @@ -0,0 +1,21 @@ +CancelledRejectionError | @wailsio/runtime

    Class CancelledRejectionError

    Exception class that will be reported as an unhandled rejection +in case a CancellablePromise rejects after being cancelled, +or when the oncancelled callback throws or rejects.

    +

    The value of the name property is the string "CancelledRejectionError". +The value of the cause property is the reason the promise rejected with.

    +

    Because the original promise was cancelled, +a wrapper promise will be passed to the unhandled rejection listener instead. +The promise property holds a reference to the original promise.

    +

    Hierarchy

    • Error
      • CancelledRejectionError

    Constructors

    Properties

    Constructors

    • Constructs a new CancelledRejectionError instance.

      +

      Parameters

      • promise: CancellablePromise<unknown>

        The promise that caused the error originally.

        +
      • Optionalreason: any

        The rejection reason.

        +
      • Optionalinfo: string

        An optional informative message specifying the circumstances in which the error was thrown. +Defaults to the string "Unhandled rejection in cancelled promise.".

        +

      Returns CancelledRejectionError

    Properties

    cause?: unknown
    message: string
    name: string
    promise: CancellablePromise<unknown>

    Holds a reference to the promise that was cancelled and then rejected.

    +
    stack?: string
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Events.WailsEvent.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Events.WailsEvent.html index 6a3105148..df6d0afe7 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Events.WailsEvent.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Events.WailsEvent.html @@ -1,4 +1,10 @@ -WailsEvent | @wailsio/runtime

    Constructors

    Properties

    Constructors

    Properties

    data: any
    name: any

    Generated using TypeDoc

    \ No newline at end of file +WailsEvent | @wailsio/runtime

    Represents a system event or a custom event emitted through wails-provided facilities.

    +

    Constructors

    Properties

    Constructors

    Properties

    data: any

    Optional data associated with the emitted event.

    +
    name: string

    The name of the event.

    +
    sender?: string

    Name of the originating window. Omitted for application events. +Will be overridden if set manually.

    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/_internal_.Window.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/_internal_.Window.html new file mode 100644 index 000000000..609e1f21b --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/_internal_.Window.html @@ -0,0 +1,134 @@ +Window | @wailsio/runtime

    Methods

    • Gets the specified window.

      +

      Parameters

      • name: string

        The name of the window to get.

        +

      Returns Window

      The corresponding window object.

      +
    • Returns true if the window is focused.

      +

      Returns Promise<boolean>

      Whether the window is currently focused.

      +
    • Returns true if the window is fullscreen.

      +

      Returns Promise<boolean>

      Whether the window is currently fullscreen.

      +
    • Returns true if the window is maximised.

      +

      Returns Promise<boolean>

      Whether the window is currently maximised.

      +
    • Returns true if the window is minimised.

      +

      Returns Promise<boolean>

      Whether the window is currently minimised.

      +
    • Returns true if the window is resizable.

      +

      Returns Promise<boolean>

      Whether the window is currently resizable.

      +
    • Restores the window to its previous state if it was previously minimised, maximised or fullscreen.

      +

      Returns Promise<void>

    • Sets the window to be always on top.

      +

      Parameters

      • alwaysOnTop: boolean

        Whether the window should stay on top.

        +

      Returns Promise<void>

    • Sets the background colour of the window.

      +

      Parameters

      • r: number

        The desired red component of the window background.

        +
      • g: number

        The desired green component of the window background.

        +
      • b: number

        The desired blue component of the window background.

        +
      • a: number

        The desired alpha component of the window background.

        +

      Returns Promise<void>

    • Removes the window frame and title bar.

      +

      Parameters

      • frameless: boolean

        Whether the window should be frameless.

        +

      Returns Promise<void>

    • Disables the system fullscreen button.

      +

      Parameters

      • enabled: boolean

        Whether the fullscreen button should be enabled.

        +

      Returns Promise<void>

    • Sets the maximum size of the window.

      +

      Parameters

      • width: number

        The desired maximum width of the window.

        +
      • height: number

        The desired maximum height of the window.

        +

      Returns Promise<void>

    • Sets the minimum size of the window.

      +

      Parameters

      • width: number

        The desired minimum width of the window.

        +
      • height: number

        The desired minimum height of the window.

        +

      Returns Promise<void>

    • Sets the absolute position of the window.

      +

      Parameters

      • x: number

        The desired horizontal absolute position of the window.

        +
      • y: number

        The desired vertical absolute position of the window.

        +

      Returns Promise<void>

    • Sets the relative position of the window to the screen.

      +

      Parameters

      • x: number

        The desired horizontal relative position of the window.

        +
      • y: number

        The desired vertical relative position of the window.

        +

      Returns Promise<void>

    • Sets whether the window is resizable.

      +

      Parameters

      • resizable: boolean

        Whether the window should be resizable.

        +

      Returns Promise<void>

    • Sets the size of the window.

      +

      Parameters

      • width: number

        The desired width of the window.

        +
      • height: number

        The desired height of the window.

        +

      Returns Promise<void>

    • Sets the title of the window.

      +

      Parameters

      • title: string

        The desired title of the window.

        +

      Returns Promise<void>

    • Sets the zoom level of the window.

      +

      Parameters

      • zoom: number

        The desired zoom level.

        +

      Returns Promise<void>

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Hide.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Hide.html index 7f129ce69..7f2061908 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Hide.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Hide.html @@ -1,2 +1,2 @@ -Hide | @wailsio/runtime
    • Hides a certain method by calling the HideMethod function.

      -

      Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file +Hide | @wailsio/runtime
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Quit.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Quit.html index 5fe5e1404..7350cfb7f 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Quit.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Quit.html @@ -1,2 +1,2 @@ -Quit | @wailsio/runtime
    • Calls the QuitMethod to terminate the program.

      -

      Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file +Quit | @wailsio/runtime
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Show.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Show.html index 22c82d584..5c885e54f 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Show.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Show.html @@ -1,2 +1,2 @@ -Show | @wailsio/runtime
    • Calls the ShowMethod and returns the result.

      -

      Returns Promise<void>

    Generated using TypeDoc

    \ No newline at end of file +Show | @wailsio/runtime
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Browser.OpenURL.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Browser.OpenURL.html index 1ca83c77c..d8e9d2292 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Browser.OpenURL.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Browser.OpenURL.html @@ -1,3 +1,3 @@ -OpenURL | @wailsio/runtime
    • Open a browser window to the given URL

      -

      Parameters

      • url: string

        The URL to open

        -

      Returns Promise<string>

    Generated using TypeDoc

    \ No newline at end of file +OpenURL | @wailsio/runtime
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByID.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByID.html index b0d87a730..70e252457 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByID.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByID.html @@ -1,8 +1,6 @@ -ByID | @wailsio/runtime
    • Calls a method by its numeric ID with the specified arguments. +ByID | @wailsio/runtime

      • Calls a method by its numeric ID with the specified arguments. See Call for details.

        Parameters

        • methodID: number

          The ID of the method to call.

          -
        • Rest ...args: any[]

          The arguments to pass to the method.

          -

        Returns Promise<any>

          -
        • The result of the method call.
        • -
        -

      Generated using TypeDoc

      \ No newline at end of file +
    • ...args: any[]

      The arguments to pass to the method.

      +

    Returns CancellablePromise<any>

    The result of the method call.

    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByName.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByName.html index 1e43aee17..41c05d873 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByName.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByName.html @@ -1,6 +1,6 @@ -ByName | @wailsio/runtime
    • Calls a bound method by name with the specified arguments. +ByName | @wailsio/runtime

      • Calls a bound method by name with the specified arguments. See Call for details.

        -

        Parameters

        • methodName: string

          The name of the method in the format 'package.struct.method'.

          -
        • Rest ...args: any[]

          The arguments to pass to the method.

          -

        Returns Promise<any>

        The result of the method call.

        -

      Generated using TypeDoc

      \ No newline at end of file +

      Parameters

      • methodName: string

        The name of the method in the format 'package.struct.method'.

        +
      • ...args: any[]

        The arguments to pass to the method.

        +

      Returns CancellablePromise<any>

      The result of the method call.

      +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.Call.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.Call.html index 6771fe7aa..ded96e319 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.Call.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.Call.html @@ -1,11 +1,9 @@ -Call | @wailsio/runtime
    • Call a bound method according to the given call options.

      +Call | @wailsio/runtime
      • Call a bound method according to the given call options.

        In case of failure, the returned promise will reject with an exception among ReferenceError (unknown method), TypeError (wrong argument count or type), RuntimeError (method returned an error), or other (network or internal errors). The exception might have a "cause" field with the value returned by the application- or service-level error marshaling functions.

        -

        Parameters

        Returns Promise<any>

          -
        • The result of the call.
        • -
        -

      Generated using TypeDoc

      \ No newline at end of file +

      Parameters

      Returns CancellablePromise<any>

      The result of the call.

      +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.SetText.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.SetText.html index bf72c6ec1..da2582dd7 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.SetText.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.SetText.html @@ -1,6 +1,4 @@ -SetText | @wailsio/runtime
    • Sets the text to the Clipboard.

      +SetText | @wailsio/runtime
      • Sets the text to the Clipboard.

        Parameters

        • text: string

          The text to be set to the Clipboard.

          -

        Returns Promise<any>

          -
        • A Promise that resolves when the operation is successful.
        • -
        -

      Generated using TypeDoc

      \ No newline at end of file +

    Returns Promise<void>

    A Promise that resolves when the operation is successful.

    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.Text.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.Text.html index 9b4cf3f9b..cb58a2930 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.Text.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.Text.html @@ -1,3 +1,3 @@ -Text | @wailsio/runtime
    • Get the Clipboard text

      -

      Returns Promise<string>

      A promise that resolves with the text from the Clipboard.

      -

    Generated using TypeDoc

    \ No newline at end of file +Text | @wailsio/runtime
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Any.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Any.html deleted file mode 100644 index 8d776ae38..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Any.html +++ /dev/null @@ -1,2 +0,0 @@ -Any | @wailsio/runtime
    • Any is a dummy creation function for simple or unknown types.

      -

      Type Parameters

      • T

      Parameters

      • source: any

      Returns T

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Array.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Array.html deleted file mode 100644 index 7da180aa9..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Array.html +++ /dev/null @@ -1,4 +0,0 @@ -Array | @wailsio/runtime
    • Array takes a creation function for an arbitrary type -and returns an in-place creation function for an array -whose elements are of that type.

      -

      Type Parameters

      • T

      Parameters

      • element: ((source) => T)
          • (source): T
          • Parameters

            • source: any

            Returns T

      Returns ((source) => T[])

        • (source): T[]
        • Parameters

          • source: any

          Returns T[]

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.ByteSlice.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.ByteSlice.html deleted file mode 100644 index 8dd0170b8..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.ByteSlice.html +++ /dev/null @@ -1,3 +0,0 @@ -ByteSlice | @wailsio/runtime
    • ByteSlice is a creation function that replaces -null strings with empty strings.

      -

      Parameters

      • source: any

      Returns string

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Map.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Map.html deleted file mode 100644 index a34b7cb25..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Map.html +++ /dev/null @@ -1,4 +0,0 @@ -Map | @wailsio/runtime
    • Map takes creation functions for two arbitrary types -and returns an in-place creation function for an object -whose keys and values are of those types.

      -

      Type Parameters

      • K
      • V

      Parameters

      • key: ((source) => K)
          • (source): K
          • Parameters

            • source: any

            Returns K

      • value: ((source) => V)
          • (source): V
          • Parameters

            • source: any

            Returns V

      Returns ((source) => {
          [_: K]: V;
      })

        • (source): {
              [_: K]: V;
          }
        • Parameters

          • source: any

          Returns {
              [_: K]: V;
          }

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Nullable.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Nullable.html deleted file mode 100644 index 5c065657b..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Nullable.html +++ /dev/null @@ -1,3 +0,0 @@ -Nullable | @wailsio/runtime
    • Nullable takes a creation function for an arbitrary type -and returns a creation function for a nullable value of that type.

      -

      Type Parameters

      • T

      Parameters

      • element: ((source) => T)
          • (source): T
          • Parameters

            • source: any

            Returns T

      Returns ((source) => null | T)

        • (source): null | T
        • Parameters

          • source: any

          Returns null | T

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Struct.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Struct.html deleted file mode 100644 index 503d912bd..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Create.Struct.html +++ /dev/null @@ -1,3 +0,0 @@ -Struct | @wailsio/runtime
    • Struct takes an object mapping field names to creation functions -and returns an in-place creation function for a struct.

      -

      Type Parameters

      • T extends {
            [_: string]: ((source) => any);
        }
      • U extends {
            [Key in string | number | symbol]?: ReturnType<T[Key]>
        }

      Parameters

      • createField: T

      Returns ((source) => U)

        • (source): U
        • Parameters

          • source: any

          Returns U

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Error.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Error.html index cb362294f..f9df8a693 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Error.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Error.html @@ -1,5 +1,4 @@ -Error | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file +Error | @wailsio/runtime
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Info.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Info.html index ced72886f..d751a8f42 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Info.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Info.html @@ -1,5 +1,4 @@ -Info | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file +Info | @wailsio/runtime
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.OpenFile.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.OpenFile.html index 07118f814..34406d0f2 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.OpenFile.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.OpenFile.html @@ -1,3 +1,10 @@ -OpenFile | @wailsio/runtime
    • Parameters

      Returns Promise<string | string[]>

      Returns selected file or list of files. Returns blank string if no file is selected.

      -

    Generated using TypeDoc

    \ No newline at end of file +OpenFile | @wailsio/runtime
    • Presents a file selection dialog to pick one or more files to open.

      +

      Parameters

      Returns Promise<string[]>

      Selected file or list of files, or a blank string/empty list if no file has been selected.

      +
    • Presents a file selection dialog to pick one or more files to open.

      +

      Parameters

      Returns Promise<string>

      Selected file or list of files, or a blank string/empty list if no file has been selected.

      +
    • Presents a file selection dialog to pick one or more files to open.

      +

      Parameters

      Returns Promise<string | string[]>

      Selected file or list of files, or a blank string/empty list if no file has been selected.

      +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Question.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Question.html index e632a73f9..ffe292169 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Question.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Question.html @@ -1,5 +1,4 @@ -Question | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file +Question | @wailsio/runtime
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.SaveFile.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.SaveFile.html index 08a5e1f96..d6c5d2644 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.SaveFile.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.SaveFile.html @@ -1,3 +1,4 @@ -SaveFile | @wailsio/runtime
    • Parameters

      Returns Promise<string>

      Returns the selected file. Returns blank string if no file is selected.

      -

    Generated using TypeDoc

    \ No newline at end of file +SaveFile | @wailsio/runtime
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Warning.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Warning.html index 8a8a29157..3849593ed 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Warning.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Warning.html @@ -1,5 +1,4 @@ -Warning | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file +Warning | @wailsio/runtime
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Emit.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Emit.html index 4554d4ea2..4b1585a0b 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Emit.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Emit.html @@ -1,6 +1,4 @@ -Emit | @wailsio/runtime
    • Emits an event using the given event name.

      +Emit | @wailsio/runtime

      Generated using TypeDoc

      \ No newline at end of file +

    Returns Promise<void>

    A promise that will be fulfilled once the event has been emitted.

    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Off.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Off.html index 791f0bcf6..a740a6027 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Off.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Off.html @@ -1,4 +1,3 @@ -Off | @wailsio/runtime
    • Removes event listeners for the specified event names.

      -

      Parameters

      • eventName: string

        The name of the event to remove listeners for.

        -
      • Rest ...additionalEventNames: string[]

        Additional event names to remove listeners for.

        -

      Returns undefined

    Generated using TypeDoc

    \ No newline at end of file +Off | @wailsio/runtime
    • Removes event listeners for the specified event names.

      +

      Parameters

      • ...eventNames: [string, ...string[]]

        The name of the events to remove listeners for.

        +

      Returns void

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OffAll.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OffAll.html index fd59705d9..68baa6387 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OffAll.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OffAll.html @@ -1,3 +1,2 @@ -OffAll | @wailsio/runtime
    • Removes all event listeners.

      -

      Returns void

      Function

      OffAll

      -

    Generated using TypeDoc

    \ No newline at end of file +OffAll | @wailsio/runtime
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.On.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.On.html index 98b06131c..eb0203c7c 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.On.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.On.html @@ -1,7 +1,5 @@ -On | @wailsio/runtime
    • Registers a callback function to be executed when the specified event occurs.

      -

      Parameters

      • eventName: string

        The name of the event.

        -
      • callback: Function

        The callback function to be executed. It takes no parameters.

        -

      Returns Function

        -
      • A function that, when called, will unregister the callback from the event.
      • -
      -

    Generated using TypeDoc

    \ No newline at end of file +On | @wailsio/runtime
    • Registers a callback function to be executed when the specified event occurs.

      +

      Parameters

      • eventName: string

        The name of the event to register the callback for.

        +
      • callback: Callback

        The callback function to be called when the event is triggered.

        +

      Returns () => void

      A function that, when called, will unregister the callback from the event.

      +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OnMultiple.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OnMultiple.html index 0d03e56fc..29118f3f7 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OnMultiple.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OnMultiple.html @@ -1,8 +1,6 @@ -OnMultiple | @wailsio/runtime
    • Register a callback function to be called multiple times for a specific event.

      +OnMultiple | @wailsio/runtime
      • Register a callback function to be called multiple times for a specific event.

        Parameters

        • eventName: string

          The name of the event to register the callback for.

          -
        • callback: Function

          The callback function to be called when the event is triggered.

          +
        • callback: Callback

          The callback function to be called when the event is triggered.

        • maxCallbacks: number

          The maximum number of times the callback can be called for the event. Once the maximum number is reached, the callback will no longer be called.

          -

        Returns Function

          -
        • A function that, when called, will unregister the callback from the event.
        • -
        -

      Generated using TypeDoc

      \ No newline at end of file +

    Returns () => void

    A function that, when called, will unregister the callback from the event.

    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Once.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Once.html index 4ee3b22d2..6acc7279f 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Once.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Once.html @@ -1,7 +1,5 @@ -Once | @wailsio/runtime
    • Registers a callback function to be executed only once for the specified event.

      -

      Parameters

      • eventName: string

        The name of the event.

        -
      • callback: Function

        The function to be executed when the event occurs.

        -

      Returns Function

        -
      • A function that, when called, will unregister the callback from the event.
      • -
      -

    Generated using TypeDoc

    \ No newline at end of file +Once | @wailsio/runtime
    • Registers a callback function to be executed only once for the specified event.

      +

      Parameters

      • eventName: string

        The name of the event to register the callback for.

        +
      • callback: Callback

        The callback function to be called when the event is triggered.

        +

      Returns () => void

      A function that, when called, will unregister the callback from the event.

      +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.setup.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.setup.html deleted file mode 100644 index 243255a83..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.setup.html +++ /dev/null @@ -1 +0,0 @@ -setup | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Flags.GetFlag.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Flags.GetFlag.html index da51ebf3f..e2c9aba48 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Flags.GetFlag.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Flags.GetFlag.html @@ -1,6 +1,4 @@ -GetFlag | @wailsio/runtime
    • Retrieves the value associated with the specified key from the flag map.

      -

      Parameters

      • keyString: string

        The key to retrieve the value for.

        -

      Returns any

        -
      • The value associated with the specified key.
      • -
      -

    Generated using TypeDoc

    \ No newline at end of file +GetFlag | @wailsio/runtime
    • Retrieves the value associated with the specified key from the flag map.

      +

      Parameters

      • key: string

        The key to retrieve the value for.

        +

      Returns any

      The value associated with the specified key.

      +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetAll.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetAll.html index 59fa1a594..2d37fb8ed 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetAll.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetAll.html @@ -1,3 +1,3 @@ -GetAll | @wailsio/runtime
    • Gets all screens.

      -

      Returns Promise<Screen[]>

      A promise that resolves to an array of Screen objects.

      -

    Generated using TypeDoc

    \ No newline at end of file +GetAll | @wailsio/runtime
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetCurrent.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetCurrent.html index ffaac30a9..3fb2fe93e 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetCurrent.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetCurrent.html @@ -1,3 +1,3 @@ -GetCurrent | @wailsio/runtime
    • Gets the current active screen.

      -

      Returns Promise<Screen>

      A promise that resolves with the current active screen.

      -

    Generated using TypeDoc

    \ No newline at end of file +GetCurrent | @wailsio/runtime
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetPrimary.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetPrimary.html index 0492eccc8..1c5dc871c 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetPrimary.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetPrimary.html @@ -1,3 +1,3 @@ -GetPrimary | @wailsio/runtime
    • Gets the primary screen.

      -

      Returns Promise<Screen>

      A promise that resolves to the primary screen.

      -

    Generated using TypeDoc

    \ No newline at end of file +GetPrimary | @wailsio/runtime
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Capabilities.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Capabilities.html index 0c486a53f..0942ab6c4 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Capabilities.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Capabilities.html @@ -1,4 +1,3 @@ -Capabilities | @wailsio/runtime
    • Fetches the capabilities of the application from the server.

      -

      Returns Promise<Object>

      A promise that resolves to an object containing the capabilities.

      -

      Async

      Function

      Capabilities

      -

    Generated using TypeDoc

    \ No newline at end of file +Capabilities | @wailsio/runtime
    • Fetches the capabilities of the application from the server.

      +

      Returns Promise<Record<string, any>>

      A promise that resolves to an object containing the capabilities.

      +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Environment.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Environment.html index b401510bf..ddef570a3 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Environment.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Environment.html @@ -1,5 +1,3 @@ -Environment | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file +Environment | @wailsio/runtime
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsAMD64.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsAMD64.html index 68826c47b..54d67e121 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsAMD64.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsAMD64.html @@ -1,3 +1,3 @@ -IsAMD64 | @wailsio/runtime
    • Checks if the current environment architecture is AMD64.

      +IsAMD64 | @wailsio/runtime
      • Checks if the current environment architecture is AMD64.

        Returns boolean

        True if the current environment architecture is AMD64, false otherwise.

        -

      Generated using TypeDoc

      \ No newline at end of file +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM.html index c995b8def..60517d83f 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM.html @@ -1,3 +1,3 @@ -IsARM | @wailsio/runtime
    • Checks if the current architecture is ARM.

      +IsARM | @wailsio/runtime
      • Checks if the current architecture is ARM.

        Returns boolean

        True if the current architecture is ARM, false otherwise.

        -

      Generated using TypeDoc

      \ No newline at end of file +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM64.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM64.html index 71deca676..0203192bc 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM64.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM64.html @@ -1,5 +1,3 @@ -IsARM64 | @wailsio/runtime
    • Checks if the current environment is ARM64 architecture.

      -

      Returns boolean

        -
      • Returns true if the environment is ARM64 architecture, otherwise returns false.
      • -
      -

    Generated using TypeDoc

    \ No newline at end of file +IsARM64 | @wailsio/runtime
    • Checks if the current environment is ARM64 architecture.

      +

      Returns boolean

      Returns true if the environment is ARM64 architecture, otherwise returns false.

      +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDarkMode.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDarkMode.html index 271fbbd2c..0667df68b 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDarkMode.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDarkMode.html @@ -1,5 +1,3 @@ -IsDarkMode | @wailsio/runtime
    • Returns Promise<boolean>

        -
      • A promise that resolves to a boolean value indicating if the system is in dark mode.
      • -
      -

      Function

      Retrieves the system dark mode status.

      -

    Generated using TypeDoc

    \ No newline at end of file +IsDarkMode | @wailsio/runtime
    • Retrieves the system dark mode status.

      +

      Returns Promise<boolean>

      A promise that resolves to a boolean value indicating if the system is in dark mode.

      +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDebug.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDebug.html index a77110244..dea3c4d8f 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDebug.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDebug.html @@ -1 +1,3 @@ -IsDebug | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file +IsDebug | @wailsio/runtime
    • Reports whether the app is being run in debug mode.

      +

      Returns boolean

      True if the app is being run in debug mode.

      +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsLinux.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsLinux.html index 86aa98f6c..950e608c2 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsLinux.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsLinux.html @@ -1,3 +1,3 @@ -IsLinux | @wailsio/runtime
    • Checks if the current operating system is Linux.

      +IsLinux | @wailsio/runtime
      • Checks if the current operating system is Linux.

        Returns boolean

        Returns true if the current operating system is Linux, false otherwise.

        -

      Generated using TypeDoc

      \ No newline at end of file +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsMac.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsMac.html index 4735f0676..e924ffca7 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsMac.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsMac.html @@ -1,3 +1,3 @@ -IsMac | @wailsio/runtime
    • Checks if the current environment is a macOS operating system.

      +IsMac | @wailsio/runtime
      • Checks if the current environment is a macOS operating system.

        Returns boolean

        True if the environment is macOS, false otherwise.

        -

      Generated using TypeDoc

      \ No newline at end of file +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsWindows.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsWindows.html index 695320b29..51ce008d3 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsWindows.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsWindows.html @@ -1,3 +1,3 @@ -IsWindows | @wailsio/runtime
    • Checks if the current operating system is Windows.

      +IsWindows | @wailsio/runtime
      • Checks if the current operating system is Windows.

        Returns boolean

        True if the operating system is Windows, otherwise false.

        -

      Generated using TypeDoc

      \ No newline at end of file +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.invoke.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.invoke.html index 03fcc2da0..1990b1ac5 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.invoke.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.invoke.html @@ -1 +1 @@ -invoke | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file +invoke | @wailsio/runtime
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Enable.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Enable.html index 74ca9b159..c45e617fd 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Enable.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Enable.html @@ -1,2 +1,2 @@ -Enable | @wailsio/runtime
    • Schedules an automatic reload of WML to be performed as soon as the document is fully loaded.

      -

      Returns void

    Generated using TypeDoc

    \ No newline at end of file +Enable | @wailsio/runtime
    • Schedules an automatic reload of WML to be performed as soon as the document is fully loaded.

      +

      Returns void

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Reload.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Reload.html index 1b585e9ec..b20325018 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Reload.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Reload.html @@ -1,2 +1,2 @@ -Reload | @wailsio/runtime
    • Reloads the WML page by adding necessary event listeners and browser listeners.

      -

      Returns void

    Generated using TypeDoc

    \ No newline at end of file +Reload | @wailsio/runtime
    • Reloads the WML page by adding necessary event listeners and browser listeners.

      +

      Returns void

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/init.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/init.html deleted file mode 100644 index cc4d4a42f..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/init.html +++ /dev/null @@ -1 +0,0 @@ -init | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/hierarchy.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/hierarchy.html new file mode 100644 index 000000000..860256700 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/hierarchy.html @@ -0,0 +1 @@ +@wailsio/runtime
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/index.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/index.html index eba5c3b45..90f345405 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/index.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/index.html @@ -1,5 +1,7 @@ -@wailsio/runtime

    @wailsio/runtime

    README

    The main.js file in this directory is the entrypoint for the runtime.js file that may be +@wailsio/runtime

    @wailsio/runtime

    README

    The index.js file in the compiled directory is the entrypoint for the runtime.js file that may be loaded at runtime. This will add window.wails and window._wails to the global scope.

    NOTE: It is preferable to use the @wailsio/runtime package to use the runtime.

    -

    After updating any files in this directory, you must run wails3 task build:runtime to regenerate the compiled JS.

    -

    Generated using TypeDoc

    \ No newline at end of file +

    ⚠️ Do not rebuild the runtime manually after updating TS code: +the CI pipeline will take care of this. +PRs that touch build artifacts will be blocked from merging.

    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Call.CallOptions.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Call.CallOptions.html deleted file mode 100644 index 8e4991955..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Call.CallOptions.html +++ /dev/null @@ -1,7 +0,0 @@ -CallOptions | @wailsio/runtime

    Interface CallOptions

    interface CallOptions {
        args: any[];
        methodID: undefined | number;
        methodName: undefined | string;
    }

    Properties

    Properties

    args: any[]

    Arguments to be passed into the bound method.

    -
    methodID: undefined | number

    The numeric ID of the bound method to call.

    -
    methodName: undefined | string

    The fully qualified name of the bound method to call.

    -

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/CancellablePromiseLike.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/CancellablePromiseLike.html new file mode 100644 index 000000000..a65b1b218 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/CancellablePromiseLike.html @@ -0,0 +1,3 @@ +CancellablePromiseLike | @wailsio/runtime

    Interface CancellablePromiseLike<T>

    interface CancellablePromiseLike<T> {
        cancel(cause?: any): void | PromiseLike<void>;
        then<TResult1 = T, TResult2 = never>(
            onfulfilled?:
                | null
                | (
                    value: T,
                ) => TResult1 | PromiseLike<TResult1> | CancellablePromiseLike<TResult1>,
            onrejected?:
                | null
                | (
                    reason: any,
                ) => TResult2 | PromiseLike<TResult2> | CancellablePromiseLike<TResult2>,
        ): CancellablePromiseLike<TResult1 | TResult2>;
    }

    Type Parameters

    • T

    Implemented by

    Methods

    Methods

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/CancellablePromiseWithResolvers.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/CancellablePromiseWithResolvers.html new file mode 100644 index 000000000..19ea7eeb6 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/CancellablePromiseWithResolvers.html @@ -0,0 +1,7 @@ +CancellablePromiseWithResolvers | @wailsio/runtime

    Interface CancellablePromiseWithResolvers<T>

    Wraps a cancellable promise along with its resolution methods. +The oncancelled field will be null initially but may be set to provide a custom cancellation function.

    +
    interface CancellablePromiseWithResolvers<T> {
        oncancelled: null | CancellablePromiseCanceller;
        promise: CancellablePromise<T>;
        reject: CancellablePromiseRejector;
        resolve: CancellablePromiseResolver<T>;
    }

    Type Parameters

    • T

    Properties

    oncancelled: null | CancellablePromiseCanceller
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.Button.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.Button.html index e9345df4f..9ba223601 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.Button.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.Button.html @@ -1,7 +1,7 @@ -Button | @wailsio/runtime
    interface Button {
        IsCancel: undefined | boolean;
        IsDefault: undefined | boolean;
        Label: undefined | string;
    }

    Properties

    Properties

    IsCancel: undefined | boolean

    True if the button should cancel an operation when clicked.

    -
    IsDefault: undefined | boolean

    True if the button should be the default action when the user presses enter.

    -
    Label: undefined | string

    Text that appears within the button.

    -

    Generated using TypeDoc

    \ No newline at end of file +Button | @wailsio/runtime
    interface Button {
        IsCancel?: boolean;
        IsDefault?: boolean;
        Label?: string;
    }

    Properties

    IsCancel?: boolean

    True if the button should cancel an operation when clicked.

    +
    IsDefault?: boolean

    True if the button should be the default action when the user presses enter.

    +
    Label?: string

    Text that appears within the button.

    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.FileFilter.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.FileFilter.html index 79c4d1b98..c2e603664 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.FileFilter.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.FileFilter.html @@ -1,5 +1,5 @@ -FileFilter | @wailsio/runtime
    interface FileFilter {
        DisplayName: undefined | string;
        Pattern: undefined | string;
    }

    Properties

    Properties

    DisplayName: undefined | string

    Display name for the filter, it could be "Text Files", "Images" etc.

    -
    Pattern: undefined | string

    Pattern to match for the filter, e.g. ".txt;.md" for text markdown files.

    -

    Generated using TypeDoc

    \ No newline at end of file +FileFilter | @wailsio/runtime
    interface FileFilter {
        DisplayName?: string;
        Pattern?: string;
    }

    Properties

    Properties

    DisplayName?: string

    Display name for the filter, it could be "Text Files", "Images" etc.

    +
    Pattern?: string

    Pattern to match for the filter, e.g. ".txt;.md" for text markdown files.

    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.MessageDialogOptions.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.MessageDialogOptions.html index 0ece76e45..0b4bc0f29 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.MessageDialogOptions.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.MessageDialogOptions.html @@ -1,9 +1,9 @@ -MessageDialogOptions | @wailsio/runtime

    Interface MessageDialogOptions

    interface MessageDialogOptions {
        Buttons: undefined | Button[];
        Detached: undefined | boolean;
        Message: undefined | string;
        Title: undefined | string;
    }

    Properties

    Properties

    Buttons: undefined | Button[]

    Array of button options to show in the dialog.

    -
    Detached: undefined | boolean

    True if the dialog should appear detached from the main window (if applicable).

    -
    Message: undefined | string

    The main message to show in the dialog.

    -
    Title: undefined | string

    The title of the dialog window.

    -

    Generated using TypeDoc

    \ No newline at end of file +MessageDialogOptions | @wailsio/runtime

    Interface MessageDialogOptions

    interface MessageDialogOptions {
        Buttons?: Button[];
        Detached?: boolean;
        Message?: string;
        Title?: string;
    }

    Properties

    Buttons?: Button[]

    Array of button options to show in the dialog.

    +
    Detached?: boolean

    True if the dialog should appear detached from the main window (if applicable).

    +
    Message?: string

    The main message to show in the dialog.

    +
    Title?: string

    The title of the dialog window.

    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.OpenFileDialogOptions.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.OpenFileDialogOptions.html index 478b976ff..a9d22d556 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.OpenFileDialogOptions.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.OpenFileDialogOptions.html @@ -1,33 +1,33 @@ -OpenFileDialogOptions | @wailsio/runtime

    Interface OpenFileDialogOptions

    interface OpenFileDialogOptions {
        AllowsMultipleSelection: undefined | boolean;
        AllowsOtherFiletypes: undefined | boolean;
        ButtonText: undefined | string;
        CanChooseDirectories: undefined | boolean;
        CanChooseFiles: undefined | boolean;
        CanCreateDirectories: undefined | boolean;
        CanSelectHiddenExtension: undefined | boolean;
        Detached: undefined | boolean;
        Directory: undefined | string;
        Filters: undefined | FileFilter[];
        HideExtension: undefined | boolean;
        Message: undefined | string;
        ResolvesAliases: undefined | boolean;
        ShowHiddenFiles: undefined | boolean;
        Title: undefined | string;
        TreatsFilePackagesAsDirectories: undefined | boolean;
    }

    Properties

    AllowsMultipleSelection: undefined | boolean

    Indicates if multiple selection is allowed.

    -
    AllowsOtherFiletypes: undefined | boolean

    Indicates if other file types are allowed.

    -
    ButtonText: undefined | string

    Text to display on the button.

    -
    CanChooseDirectories: undefined | boolean

    Indicates if directories can be chosen.

    -
    CanChooseFiles: undefined | boolean

    Indicates if files can be chosen.

    -
    CanCreateDirectories: undefined | boolean

    Indicates if directories can be created.

    -
    CanSelectHiddenExtension: undefined | boolean

    Indicates if hidden extensions can be selected.

    -
    Detached: undefined | boolean

    Indicates if the dialog should appear detached from the main window.

    -
    Directory: undefined | string

    Directory to open in the dialog.

    -
    Filters: undefined | FileFilter[]

    Array of file filters.

    -
    HideExtension: undefined | boolean

    Indicates if the extension should be hidden.

    -
    Message: undefined | string

    Message to show in the dialog.

    -
    ResolvesAliases: undefined | boolean

    Indicates if aliases should be resolved.

    -
    ShowHiddenFiles: undefined | boolean

    Indicates if hidden files should be shown.

    -
    Title: undefined | string

    Title of the dialog.

    -
    TreatsFilePackagesAsDirectories: undefined | boolean

    Indicates if file packages should be treated as directories.

    -

    Generated using TypeDoc

    \ No newline at end of file +OpenFileDialogOptions | @wailsio/runtime

    Interface OpenFileDialogOptions

    interface OpenFileDialogOptions {
        AllowsMultipleSelection?: boolean;
        AllowsOtherFiletypes?: boolean;
        ButtonText?: string;
        CanChooseDirectories?: boolean;
        CanChooseFiles?: boolean;
        CanCreateDirectories?: boolean;
        CanSelectHiddenExtension?: boolean;
        Detached?: boolean;
        Directory?: string;
        Filters?: FileFilter[];
        HideExtension?: boolean;
        Message?: string;
        ResolvesAliases?: boolean;
        ShowHiddenFiles?: boolean;
        Title?: string;
        TreatsFilePackagesAsDirectories?: boolean;
    }

    Properties

    AllowsMultipleSelection?: boolean

    Indicates if multiple selection is allowed.

    +
    AllowsOtherFiletypes?: boolean

    Indicates if other file types are allowed.

    +
    ButtonText?: string

    Text to display on the button.

    +
    CanChooseDirectories?: boolean

    Indicates if directories can be chosen.

    +
    CanChooseFiles?: boolean

    Indicates if files can be chosen.

    +
    CanCreateDirectories?: boolean

    Indicates if directories can be created.

    +
    CanSelectHiddenExtension?: boolean

    Indicates if hidden extensions can be selected.

    +
    Detached?: boolean

    Indicates if the dialog should appear detached from the main window.

    +
    Directory?: string

    Directory to open in the dialog.

    +
    Filters?: FileFilter[]

    Array of file filters.

    +
    HideExtension?: boolean

    Indicates if the extension should be hidden.

    +
    Message?: string

    Message to show in the dialog.

    +
    ResolvesAliases?: boolean

    Indicates if aliases should be resolved.

    +
    ShowHiddenFiles?: boolean

    Indicates if hidden files should be shown.

    +
    Title?: string

    Title of the dialog.

    +
    TreatsFilePackagesAsDirectories?: boolean

    Indicates if file packages should be treated as directories.

    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.SaveFileDialogOptions.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.SaveFileDialogOptions.html index 535122e51..3a8611dab 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.SaveFileDialogOptions.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.SaveFileDialogOptions.html @@ -1,35 +1,33 @@ -SaveFileDialogOptions | @wailsio/runtime

    Interface SaveFileDialogOptions

    interface SaveFileDialogOptions {
        AllowsMultipleSelection: undefined | boolean;
        AllowsOtherFiletypes: undefined | boolean;
        ButtonText: undefined | string;
        CanChooseDirectories: undefined | boolean;
        CanChooseFiles: undefined | boolean;
        CanCreateDirectories: undefined | boolean;
        CanSelectHiddenExtension: undefined | boolean;
        Detached: undefined | boolean;
        Directory: undefined | string;
        Filename: undefined | string;
        Filters: undefined | FileFilter[];
        HideExtension: undefined | boolean;
        Message: undefined | string;
        ResolvesAliases: undefined | boolean;
        ShowHiddenFiles: undefined | boolean;
        Title: undefined | string;
        TreatsFilePackagesAsDirectories: undefined | boolean;
    }

    Properties

    AllowsMultipleSelection: undefined | boolean

    Indicates if multiple selection is allowed.

    -
    AllowsOtherFiletypes: undefined | boolean

    Indicates if other file types are allowed.

    -
    ButtonText: undefined | string

    Text to display on the button.

    -
    CanChooseDirectories: undefined | boolean

    Indicates if directories can be chosen.

    -
    CanChooseFiles: undefined | boolean

    Indicates if files can be chosen.

    -
    CanCreateDirectories: undefined | boolean

    Indicates if directories can be created.

    -
    CanSelectHiddenExtension: undefined | boolean

    Indicates if hidden extensions can be selected.

    -
    Detached: undefined | boolean

    Indicates if the dialog should appear detached from the main window.

    -
    Directory: undefined | string

    Directory to open in the dialog.

    -
    Filename: undefined | string

    Default filename to use in the dialog.

    -
    Filters: undefined | FileFilter[]

    Array of file filters.

    -
    HideExtension: undefined | boolean

    Indicates if the extension should be hidden.

    -
    Message: undefined | string

    Message to show in the dialog.

    -
    ResolvesAliases: undefined | boolean

    Indicates if aliases should be resolved.

    -
    ShowHiddenFiles: undefined | boolean

    Indicates if hidden files should be shown.

    -
    Title: undefined | string

    Title of the dialog.

    -
    TreatsFilePackagesAsDirectories: undefined | boolean

    Indicates if file packages should be treated as directories.

    -

    Generated using TypeDoc

    \ No newline at end of file +SaveFileDialogOptions | @wailsio/runtime

    Interface SaveFileDialogOptions

    interface SaveFileDialogOptions {
        AllowsOtherFiletypes?: boolean;
        ButtonText?: string;
        CanChooseDirectories?: boolean;
        CanChooseFiles?: boolean;
        CanCreateDirectories?: boolean;
        CanSelectHiddenExtension?: boolean;
        Detached?: boolean;
        Directory?: string;
        Filename?: string;
        Filters?: FileFilter[];
        HideExtension?: boolean;
        Message?: string;
        ResolvesAliases?: boolean;
        ShowHiddenFiles?: boolean;
        Title?: string;
        TreatsFilePackagesAsDirectories?: boolean;
    }

    Properties

    AllowsOtherFiletypes?: boolean

    Indicates if other file types are allowed.

    +
    ButtonText?: string

    Text to display on the button.

    +
    CanChooseDirectories?: boolean

    Indicates if directories can be chosen.

    +
    CanChooseFiles?: boolean

    Indicates if files can be chosen.

    +
    CanCreateDirectories?: boolean

    Indicates if directories can be created.

    +
    CanSelectHiddenExtension?: boolean

    Indicates if hidden extensions can be selected.

    +
    Detached?: boolean

    Indicates if the dialog should appear detached from the main window.

    +
    Directory?: string

    Directory to open in the dialog.

    +
    Filename?: string

    Default filename to use in the dialog.

    +
    Filters?: FileFilter[]

    Array of file filters.

    +
    HideExtension?: boolean

    Indicates if the extension should be hidden.

    +
    Message?: string

    Message to show in the dialog.

    +
    ResolvesAliases?: boolean

    Indicates if aliases should be resolved.

    +
    ShowHiddenFiles?: boolean

    Indicates if hidden files should be shown.

    +
    Title?: string

    Title of the dialog.

    +
    TreatsFilePackagesAsDirectories?: boolean

    Indicates if file packages should be treated as directories.

    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Rect.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Rect.html index ef90dd394..f8f873f49 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Rect.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Rect.html @@ -1,9 +1,9 @@ -Rect | @wailsio/runtime
    interface Rect {
        Height: number;
        Width: number;
        X: number;
        Y: number;
    }

    Properties

    Properties

    Height: number

    The height of the rectangle.

    -
    Width: number

    The width of the rectangle.

    -
    X: number

    The X coordinate of the origin.

    -
    Y: number

    The Y coordinate of the origin.

    -

    Generated using TypeDoc

    \ No newline at end of file +Rect | @wailsio/runtime
    interface Rect {
        Height: number;
        Width: number;
        X: number;
        Y: number;
    }

    Properties

    Properties

    Height: number

    The height of the rectangle.

    +
    Width: number

    The width of the rectangle.

    +
    X: number

    The X coordinate of the origin.

    +
    Y: number

    The Y coordinate of the origin.

    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Screen.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Screen.html index 626cd2914..e8500345f 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Screen.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Screen.html @@ -1,25 +1,25 @@ -Screen | @wailsio/runtime
    interface Screen {
        Bounds: Rect;
        ID: string;
        IsPrimary: boolean;
        Name: string;
        PhysicalBounds: Rect;
        PhysicalWorkArea: Rect;
        Rotation: number;
        ScaleFactor: number;
        Size: Size;
        WorkArea: Rect;
        X: number;
        Y: number;
    }

    Properties

    Bounds: Rect

    Contains the bounds of the screen in terms of X, Y, Width, and Height.

    -
    ID: string

    Unique identifier for the screen.

    -
    IsPrimary: boolean

    True if this is the primary monitor selected by the user in the operating system.

    -
    Name: string

    Human readable name of the screen.

    -
    PhysicalBounds: Rect

    Contains the physical bounds of the screen in terms of X, Y, Width, and Height (before scaling).

    -
    PhysicalWorkArea: Rect

    Contains the physical WorkArea of the screen (before scaling).

    -
    Rotation: number

    The rotation of the screen.

    -
    ScaleFactor: number

    The scale factor of the screen (DPI/96). 1 = standard DPI, 2 = HiDPI (Retina), etc.

    -
    Size: Size

    Contains the width and height of the screen.

    -
    WorkArea: Rect

    Contains the area of the screen that is actually usable (excluding taskbar and other system UI).

    -
    X: number

    The X coordinate of the screen.

    -
    Y: number

    The Y coordinate of the screen.

    -

    Generated using TypeDoc

    \ No newline at end of file +Screen | @wailsio/runtime
    interface Screen {
        Bounds: Rect;
        ID: string;
        IsPrimary: boolean;
        Name: string;
        PhysicalBounds: Rect;
        PhysicalWorkArea: Rect;
        Rotation: number;
        ScaleFactor: number;
        Size: Screens.Size;
        WorkArea: Rect;
        X: number;
        Y: number;
    }

    Properties

    Bounds: Rect

    Contains the bounds of the screen in terms of X, Y, Width, and Height.

    +
    ID: string

    Unique identifier for the screen.

    +
    IsPrimary: boolean

    True if this is the primary monitor selected by the user in the operating system.

    +
    Name: string

    Human-readable name of the screen.

    +
    PhysicalBounds: Rect

    Contains the physical bounds of the screen in terms of X, Y, Width, and Height (before scaling).

    +
    PhysicalWorkArea: Rect

    Contains the physical WorkArea of the screen (before scaling).

    +
    Rotation: number

    The rotation of the screen.

    +
    ScaleFactor: number

    The scale factor of the screen (DPI/96). 1 = standard DPI, 2 = HiDPI (Retina), etc.

    +

    Contains the width and height of the screen.

    +
    WorkArea: Rect

    Contains the area of the screen that is actually usable (excluding taskbar and other system UI).

    +
    X: number

    The X coordinate of the screen.

    +
    Y: number

    The Y coordinate of the screen.

    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Size.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Size.html index 06c8787b0..850d4eea4 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Size.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Size.html @@ -1,5 +1,5 @@ -Size | @wailsio/runtime
    interface Size {
        Height: number;
        Width: number;
    }

    Properties

    Properties

    Height: number

    The height.

    -
    Width: number

    The width.

    -

    Generated using TypeDoc

    \ No newline at end of file +Size | @wailsio/runtime
    interface Size {
        Height: number;
        Width: number;
    }

    Properties

    Properties

    Height: number

    The height of a rectangular area.

    +
    Width: number

    The width of a rectangular area.

    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.EnvironmentInfo.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.EnvironmentInfo.html index 5f05fee9a..1465b378f 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.EnvironmentInfo.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.EnvironmentInfo.html @@ -1,11 +1,11 @@ -EnvironmentInfo | @wailsio/runtime

    Interface EnvironmentInfo

    interface EnvironmentInfo {
        Arch: string;
        Debug: boolean;
        OS: string;
        OSInfo: OSInfo;
        PlatformInfo: Object;
    }

    Properties

    Properties

    Arch: string

    The architecture of the system.

    -
    Debug: boolean

    True if the application is running in debug mode, otherwise false.

    -
    OS: string

    The operating system in use.

    -
    OSInfo: OSInfo

    Details of the operating system.

    -
    PlatformInfo: Object

    Additional platform information.

    -

    Generated using TypeDoc

    \ No newline at end of file +EnvironmentInfo | @wailsio/runtime

    Interface EnvironmentInfo

    interface EnvironmentInfo {
        Arch: string;
        Debug: boolean;
        OS: string;
        OSInfo: OSInfo;
        PlatformInfo: Record<string, any>;
    }

    Properties

    Properties

    Arch: string

    The architecture of the system.

    +
    Debug: boolean

    True if the application is running in debug mode, otherwise false.

    +
    OS: string

    The operating system in use.

    +
    OSInfo: OSInfo

    Details of the operating system.

    +
    PlatformInfo: Record<string, any>

    Additional platform information.

    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.OSInfo.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.OSInfo.html index dac847d9f..9fe3cb690 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.OSInfo.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.OSInfo.html @@ -1,9 +1,9 @@ -OSInfo | @wailsio/runtime
    interface OSInfo {
        Branding: string;
        ID: string;
        Name: string;
        Version: string;
    }

    Properties

    Properties

    Branding: string

    The branding of the OS.

    -
    ID: string

    The ID of the OS.

    -
    Name: string

    The name of the OS.

    -
    Version: string

    The version of the OS.

    -

    Generated using TypeDoc

    \ No newline at end of file +OSInfo | @wailsio/runtime
    interface OSInfo {
        Branding: string;
        ID: string;
        Name: string;
        Version: string;
    }

    Properties

    Properties

    Branding: string

    The branding of the OS.

    +
    ID: string

    The ID of the OS.

    +
    Name: string

    The name of the OS.

    +
    Version: string

    The version of the OS.

    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.AddEventListenerOptions.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.AddEventListenerOptions.html new file mode 100644 index 000000000..7ea29bc1b --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.AddEventListenerOptions.html @@ -0,0 +1,5 @@ +AddEventListenerOptions | @wailsio/runtime

    Interface AddEventListenerOptions

    interface AddEventListenerOptions {
        capture?: boolean;
        once?: boolean;
        passive?: boolean;
        signal?: AbortSignal;
    }

    Hierarchy (View Summary)

    Properties

    capture?: boolean
    once?: boolean
    passive?: boolean
    signal?: AbortSignal
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.ArrayBufferView.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.ArrayBufferView.html new file mode 100644 index 000000000..34cc95d72 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.ArrayBufferView.html @@ -0,0 +1,7 @@ +ArrayBufferView | @wailsio/runtime

    Interface ArrayBufferView<TArrayBuffer>

    interface ArrayBufferView<
        TArrayBuffer extends ArrayBufferLike = ArrayBufferLike,
    > {
        buffer: TArrayBuffer;
        byteLength: number;
        byteOffset: number;
    }

    Type Parameters

    Properties

    buffer: TArrayBuffer

    The ArrayBuffer instance referenced by the array.

    +
    byteLength: number

    The length in bytes of the array.

    +
    byteOffset: number

    The offset in bytes of the array.

    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.Blob.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.Blob.html new file mode 100644 index 000000000..051fea2a3 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.Blob.html @@ -0,0 +1,17 @@ +Blob | @wailsio/runtime

    A file-like object of immutable, raw data. Blobs represent data that isn't necessarily in a JavaScript-native format. The File interface is based on Blob, inheriting blob functionality and expanding it to support files on the user's system.

    +

    MDN Reference

    +
    interface Blob {
        size: number;
        type: string;
        arrayBuffer(): Promise<ArrayBuffer>;
        bytes(): Promise<Uint8Array<ArrayBufferLike>>;
        slice(start?: number, end?: number, contentType?: string): Blob;
        stream(): ReadableStream<Uint8Array<ArrayBufferLike>>;
        text(): Promise<string>;
    }

    Properties

    Methods

    Properties

    size: number
    type: string

    Methods

    • Parameters

      • Optionalstart: number
      • Optionalend: number
      • OptionalcontentType: string

      Returns Blob

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.BlobPropertyBag.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.BlobPropertyBag.html new file mode 100644 index 000000000..6fdfdc2d7 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.BlobPropertyBag.html @@ -0,0 +1,3 @@ +BlobPropertyBag | @wailsio/runtime
    interface BlobPropertyBag {
        endings?: EndingType;
        type?: string;
    }

    Properties

    Properties

    endings?: EndingType
    type?: string
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.ErrorOptions.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.ErrorOptions.html new file mode 100644 index 000000000..12c1c1dec --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.ErrorOptions.html @@ -0,0 +1,2 @@ +ErrorOptions | @wailsio/runtime
    interface ErrorOptions {
        cause?: unknown;
    }

    Properties

    Properties

    cause?: unknown
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.Event.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.Event.html new file mode 100644 index 000000000..658cc399a --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.Event.html @@ -0,0 +1,57 @@ +Event | @wailsio/runtime

    An event which takes place in the DOM.

    +

    MDN Reference

    +
    interface Event {
        AT_TARGET: 2;
        bubbles: boolean;
        BUBBLING_PHASE: 3;
        cancelable: boolean;
        cancelBubble: boolean;
        CAPTURING_PHASE: 1;
        composed: boolean;
        currentTarget: null | EventTarget;
        defaultPrevented: boolean;
        eventPhase: number;
        isTrusted: boolean;
        NONE: 0;
        returnValue: boolean;
        srcElement: null | EventTarget;
        target: null | EventTarget;
        timeStamp: number;
        type: string;
        composedPath(): EventTarget[];
        initEvent(type: string, bubbles?: boolean, cancelable?: boolean): void;
        preventDefault(): void;
        stopImmediatePropagation(): void;
        stopPropagation(): void;
    }

    Properties

    AT_TARGET: 2
    bubbles: boolean

    Returns true or false depending on how event was initialized. True if event goes through its target's ancestors in reverse tree order, and false otherwise.

    +

    MDN Reference

    +
    BUBBLING_PHASE: 3
    cancelable: boolean

    Returns true or false depending on how event was initialized. Its return value does not always carry meaning, but true can indicate that part of the operation during which event was dispatched, can be canceled by invoking the preventDefault() method.

    +

    MDN Reference

    +
    cancelBubble: boolean

    MDN Reference

    +
    CAPTURING_PHASE: 1
    composed: boolean

    Returns true or false depending on how event was initialized. True if event invokes listeners past a ShadowRoot node that is the root of its target, and false otherwise.

    +

    MDN Reference

    +
    currentTarget: null | EventTarget

    Returns the object whose event listener's callback is currently being invoked.

    +

    MDN Reference

    +
    defaultPrevented: boolean

    Returns true if preventDefault() was invoked successfully to indicate cancelation, and false otherwise.

    +

    MDN Reference

    +
    eventPhase: number

    Returns the event's phase, which is one of NONE, CAPTURING_PHASE, AT_TARGET, and BUBBLING_PHASE.

    +

    MDN Reference

    +
    isTrusted: boolean

    Returns true if event was dispatched by the user agent, and false otherwise.

    +

    MDN Reference

    +
    NONE: 0
    returnValue: boolean

    MDN Reference

    +
    srcElement: null | EventTarget

    MDN Reference

    +
    target: null | EventTarget

    Returns the object to which event is dispatched (its target).

    +

    MDN Reference

    +
    timeStamp: number

    Returns the event's timestamp as the number of milliseconds measured relative to the time origin.

    +

    MDN Reference

    +
    type: string

    Returns the type of event, e.g. "click", "hashchange", or "submit".

    +

    MDN Reference

    +

    Methods

    • Returns the invocation target objects of event's path (objects on which listeners will be invoked), except for any nodes in shadow trees of which the shadow root's mode is "closed" that are not reachable from event's currentTarget.

      +

      MDN Reference

      +

      Returns EventTarget[]

    • Parameters

      • type: string
      • Optionalbubbles: boolean
      • Optionalcancelable: boolean

      Returns void

      MDN Reference

      +
    • If invoked when the cancelable attribute value is true, and while executing a listener for the event with passive set to false, signals to the operation that caused event to be dispatched that it needs to be canceled.

      +

      MDN Reference

      +

      Returns void

    • Invoking this method prevents event from reaching any registered event listeners after the current one finishes running and, when dispatched in a tree, also prevents event from reaching any other objects.

      +

      MDN Reference

      +

      Returns void

    • When dispatched in a tree, invoking this method prevents event from reaching any objects other than the current object.

      +

      MDN Reference

      +

      Returns void

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.EventInit.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.EventInit.html new file mode 100644 index 000000000..27cc94ba8 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.EventInit.html @@ -0,0 +1,4 @@ +EventInit | @wailsio/runtime
    interface EventInit {
        bubbles?: boolean;
        cancelable?: boolean;
        composed?: boolean;
    }

    Properties

    bubbles?: boolean
    cancelable?: boolean
    composed?: boolean
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.EventListener.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.EventListener.html new file mode 100644 index 000000000..aa2f55376 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.EventListener.html @@ -0,0 +1 @@ +EventListener | @wailsio/runtime
    • Parameters

      Returns void

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.EventListenerObject.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.EventListenerObject.html new file mode 100644 index 000000000..c644929fd --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.EventListenerObject.html @@ -0,0 +1,2 @@ +EventListenerObject | @wailsio/runtime
    interface EventListenerObject {
        handleEvent(object: Event): void;
    }

    Methods

    Methods

    • Parameters

      Returns void

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.EventListenerOptions.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.EventListenerOptions.html new file mode 100644 index 000000000..4554d1cfd --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.EventListenerOptions.html @@ -0,0 +1,2 @@ +EventListenerOptions | @wailsio/runtime
    interface EventListenerOptions {
        capture?: boolean;
    }

    Hierarchy (View Summary)

    Properties

    Properties

    capture?: boolean
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.EventTarget.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.EventTarget.html new file mode 100644 index 000000000..c2d97cd5f --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.EventTarget.html @@ -0,0 +1,18 @@ +EventTarget | @wailsio/runtime

    EventTarget is a DOM interface implemented by objects that can receive events and may have listeners for them.

    +

    MDN Reference

    +
    interface EventTarget {
        addEventListener(
            type: string,
            callback: null | EventListenerOrEventListenerObject,
            options?: boolean | AddEventListenerOptions,
        ): void;
        dispatchEvent(event: Event): boolean;
        removeEventListener(
            type: string,
            callback: null | EventListenerOrEventListenerObject,
            options?: boolean | EventListenerOptions,
        ): void;
    }

    Hierarchy (View Summary)

    Methods

    • Appends an event listener for events whose type attribute value is type. The callback argument sets the callback that will be invoked when the event is dispatched.

      +

      The options argument sets listener-specific options. For compatibility this can be a boolean, in which case the method behaves exactly as if the value was specified as options's capture.

      +

      When set to true, options's capture prevents callback from being invoked when the event's eventPhase attribute value is BUBBLING_PHASE. When false (or not present), callback will not be invoked when event's eventPhase attribute value is CAPTURING_PHASE. Either way, callback will be invoked if event's eventPhase attribute value is AT_TARGET.

      +

      When set to true, options's passive indicates that the callback will not cancel the event by invoking preventDefault(). This is used to enable performance optimizations described in § 2.8 Observing event listeners.

      +

      When set to true, options's once indicates that the callback will only be invoked once after which the event listener will be removed.

      +

      If an AbortSignal is passed for options's signal, then the event listener will be removed when signal is aborted.

      +

      The event listener is appended to target's event listener list and is not appended if it has the same type, callback, and capture.

      +

      MDN Reference

      +

      Parameters

      Returns void

    • Dispatches a synthetic event event to target and returns true if either event's cancelable attribute value is false or its preventDefault() method was not invoked, and false otherwise.

      +

      MDN Reference

      +

      Parameters

      Returns boolean

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.Iterable.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.Iterable.html new file mode 100644 index 000000000..02cc4cf80 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.Iterable.html @@ -0,0 +1,2 @@ +Iterable | @wailsio/runtime

    Interface Iterable<T, TReturn, TNext>

    interface Iterable<T, TReturn = any, TNext = any> {
        "[iterator]"(): Iterator<T, TReturn, TNext>;
    }

    Type Parameters

    • T
    • TReturn = any
    • TNext = any

    Methods

    Methods

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.MediaSource.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.MediaSource.html new file mode 100644 index 000000000..b277e5271 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.MediaSource.html @@ -0,0 +1,49 @@ +MediaSource | @wailsio/runtime

    This Media Source Extensions API interface represents a source of media data for an HTMLMediaElement object. A MediaSource object can be attached to a HTMLMediaElement to be played in the user agent.

    +

    MDN Reference

    +
    interface MediaSource {
        activeSourceBuffers: SourceBufferList;
        duration: number;
        onsourceclose: null | (this: MediaSource, ev: Event) => any;
        onsourceended: null | (this: MediaSource, ev: Event) => any;
        onsourceopen: null | (this: MediaSource, ev: Event) => any;
        readyState: ReadyState;
        sourceBuffers: SourceBufferList;
        addEventListener<K extends keyof MediaSourceEventMap>(
            type: K,
            listener: (this: MediaSource, ev: MediaSourceEventMap[K]) => any,
            options?: boolean | AddEventListenerOptions,
        ): void;
        addEventListener(
            type: string,
            listener: EventListenerOrEventListenerObject,
            options?: boolean | AddEventListenerOptions,
        ): void;
        addSourceBuffer(type: string): SourceBuffer;
        clearLiveSeekableRange(): void;
        dispatchEvent(event: Event): boolean;
        endOfStream(error?: EndOfStreamError): void;
        removeEventListener<K extends keyof MediaSourceEventMap>(
            type: K,
            listener: (this: MediaSource, ev: MediaSourceEventMap[K]) => any,
            options?: boolean | EventListenerOptions,
        ): void;
        removeEventListener(
            type: string,
            listener: EventListenerOrEventListenerObject,
            options?: boolean | EventListenerOptions,
        ): void;
        removeSourceBuffer(sourceBuffer: SourceBuffer): void;
        setLiveSeekableRange(start: number, end: number): void;
    }

    Hierarchy (View Summary)

    Properties

    activeSourceBuffers: SourceBufferList
    duration: number
    onsourceclose: null | (this: MediaSource, ev: Event) => any
    onsourceended: null | (this: MediaSource, ev: Event) => any
    onsourceopen: null | (this: MediaSource, ev: Event) => any
    readyState: ReadyState
    sourceBuffers: SourceBufferList

    Methods

    • Appends an event listener for events whose type attribute value is type. The callback argument sets the callback that will be invoked when the event is dispatched.

      +

      The options argument sets listener-specific options. For compatibility this can be a boolean, in which case the method behaves exactly as if the value was specified as options's capture.

      +

      When set to true, options's capture prevents callback from being invoked when the event's eventPhase attribute value is BUBBLING_PHASE. When false (or not present), callback will not be invoked when event's eventPhase attribute value is CAPTURING_PHASE. Either way, callback will be invoked if event's eventPhase attribute value is AT_TARGET.

      +

      When set to true, options's passive indicates that the callback will not cancel the event by invoking preventDefault(). This is used to enable performance optimizations described in § 2.8 Observing event listeners.

      +

      When set to true, options's once indicates that the callback will only be invoked once after which the event listener will be removed.

      +

      If an AbortSignal is passed for options's signal, then the event listener will be removed when signal is aborted.

      +

      The event listener is appended to target's event listener list and is not appended if it has the same type, callback, and capture.

      +

      MDN Reference

      +

      Type Parameters

      Parameters

      Returns void

    • Appends an event listener for events whose type attribute value is type. The callback argument sets the callback that will be invoked when the event is dispatched.

      +

      The options argument sets listener-specific options. For compatibility this can be a boolean, in which case the method behaves exactly as if the value was specified as options's capture.

      +

      When set to true, options's capture prevents callback from being invoked when the event's eventPhase attribute value is BUBBLING_PHASE. When false (or not present), callback will not be invoked when event's eventPhase attribute value is CAPTURING_PHASE. Either way, callback will be invoked if event's eventPhase attribute value is AT_TARGET.

      +

      When set to true, options's passive indicates that the callback will not cancel the event by invoking preventDefault(). This is used to enable performance optimizations described in § 2.8 Observing event listeners.

      +

      When set to true, options's once indicates that the callback will only be invoked once after which the event listener will be removed.

      +

      If an AbortSignal is passed for options's signal, then the event listener will be removed when signal is aborted.

      +

      The event listener is appended to target's event listener list and is not appended if it has the same type, callback, and capture.

      +

      MDN Reference

      +

      Parameters

      Returns void

    • Returns void

    • Dispatches a synthetic event event to target and returns true if either event's cancelable attribute value is false or its preventDefault() method was not invoked, and false otherwise.

      +

      MDN Reference

      +

      Parameters

      Returns boolean

    • Parameters

      • start: number
      • end: number

      Returns void

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.MediaSourceEventMap.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.MediaSourceEventMap.html new file mode 100644 index 000000000..ece981957 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.MediaSourceEventMap.html @@ -0,0 +1,4 @@ +MediaSourceEventMap | @wailsio/runtime
    interface MediaSourceEventMap {
        sourceclose: Event;
        sourceended: Event;
        sourceopen: Event;
    }

    Properties

    sourceclose: Event
    sourceended: Event
    sourceopen: Event
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.Position.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.Position.html new file mode 100644 index 000000000..9ca564221 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.Position.html @@ -0,0 +1,6 @@ +Position | @wailsio/runtime

    A record describing the position of a window.

    +
    interface Position {
        x: number;
        y: number;
    }

    Properties

    x +y +

    Properties

    x: number

    The horizontal position of the window.

    +
    y: number

    The vertical position of the window.

    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.PromiseFulfilledResult.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.PromiseFulfilledResult.html new file mode 100644 index 000000000..0f1002ee8 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.PromiseFulfilledResult.html @@ -0,0 +1,3 @@ +PromiseFulfilledResult | @wailsio/runtime

    Interface PromiseFulfilledResult<T>

    interface PromiseFulfilledResult<T> {
        status: "fulfilled";
        value: T;
    }

    Type Parameters

    • T

    Properties

    Properties

    status: "fulfilled"
    value: T
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.PromiseLike.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.PromiseLike.html new file mode 100644 index 000000000..4add9f58e --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.PromiseLike.html @@ -0,0 +1,6 @@ +PromiseLike | @wailsio/runtime
    interface PromiseLike<T> {
        then<TResult1 = T, TResult2 = never>(
            onfulfilled?: null | (value: T) => TResult1 | PromiseLike<TResult1>,
            onrejected?: null | (reason: any) => TResult2 | PromiseLike<TResult2>,
        ): PromiseLike<TResult1 | TResult2>;
    }

    Type Parameters

    • T

    Implemented by

    Methods

    Methods

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.PromiseRejectedResult.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.PromiseRejectedResult.html new file mode 100644 index 000000000..a364e257f --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.PromiseRejectedResult.html @@ -0,0 +1,3 @@ +PromiseRejectedResult | @wailsio/runtime
    interface PromiseRejectedResult {
        reason: any;
        status: "rejected";
    }

    Properties

    Properties

    reason: any
    status: "rejected"
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.PromiseWithResolvers.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.PromiseWithResolvers.html new file mode 100644 index 000000000..b942f497b --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.PromiseWithResolvers.html @@ -0,0 +1,4 @@ +PromiseWithResolvers | @wailsio/runtime

    Interface PromiseWithResolvers<T>

    interface PromiseWithResolvers<T> {
        promise: Promise<T>;
        reject: (reason?: any) => void;
        resolve: (value: T | PromiseLike<T>) => void;
    }

    Type Parameters

    • T

    Properties

    Properties

    promise: Promise<T>
    reject: (reason?: any) => void
    resolve: (value: T | PromiseLike<T>) => void
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.QueuingStrategy.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.QueuingStrategy.html new file mode 100644 index 000000000..149c55d8c --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.QueuingStrategy.html @@ -0,0 +1,3 @@ +QueuingStrategy | @wailsio/runtime

    Interface QueuingStrategy<T>

    interface QueuingStrategy<T = any> {
        highWaterMark?: number;
        size?: QueuingStrategySize<T>;
    }

    Type Parameters

    • T = any

    Properties

    Properties

    highWaterMark?: number
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.QueuingStrategySize.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.QueuingStrategySize.html new file mode 100644 index 000000000..5f653c14e --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.QueuingStrategySize.html @@ -0,0 +1 @@ +QueuingStrategySize | @wailsio/runtime

    Interface QueuingStrategySize<T>

    Type Parameters

    • T = any
    • Parameters

      • chunk: T

      Returns number

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.ReadableByteStreamController.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.ReadableByteStreamController.html new file mode 100644 index 000000000..5dce85cc7 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.ReadableByteStreamController.html @@ -0,0 +1,12 @@ +ReadableByteStreamController | @wailsio/runtime

    Interface ReadableByteStreamController

    interface ReadableByteStreamController {
        byobRequest: null | ReadableStreamBYOBRequest;
        desiredSize: null | number;
        close(): void;
        enqueue(chunk: ArrayBufferView): void;
        error(e?: any): void;
    }

    Properties

    Methods

    Properties

    byobRequest: null | ReadableStreamBYOBRequest
    desiredSize: null | number

    Methods

    • Returns void

    • Parameters

      • Optionale: any

      Returns void

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.ReadableStream.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.ReadableStream.html new file mode 100644 index 000000000..b7d1939f3 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.ReadableStream.html @@ -0,0 +1,15 @@ +ReadableStream | @wailsio/runtime

    Interface ReadableStream<R>

    This Streams API interface represents a readable stream of byte data. The Fetch API offers a concrete instance of a ReadableStream through the body property of a Response object.

    +

    MDN Reference

    +
    interface ReadableStream<R = any> {
        locked: boolean;
        cancel(reason?: any): Promise<void>;
        getReader(options: { mode: "byob" }): ReadableStreamBYOBReader;
        getReader(): ReadableStreamDefaultReader<R>;
        getReader(
            options?: ReadableStreamGetReaderOptions,
        ): ReadableStreamReader<R>;
        pipeThrough<T>(
            transform: ReadableWritablePair<T, R>,
            options?: StreamPipeOptions,
        ): ReadableStream<T>;
        pipeTo(
            destination: WritableStream<R>,
            options?: StreamPipeOptions,
        ): Promise<void>;
        tee(): [ReadableStream<R>, ReadableStream<R>];
    }

    Type Parameters

    • R = any

    Properties

    Methods

    Properties

    locked: boolean

    Methods

    • Parameters

      • Optionalreason: any

      Returns Promise<void>

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.ReadableStreamBYOBReader.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.ReadableStreamBYOBReader.html new file mode 100644 index 000000000..75028ddd9 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.ReadableStreamBYOBReader.html @@ -0,0 +1,10 @@ +ReadableStreamBYOBReader | @wailsio/runtime

    Interface ReadableStreamBYOBReader

    interface ReadableStreamBYOBReader {
        closed: Promise<undefined>;
        cancel(reason?: any): Promise<void>;
        read<T extends ArrayBufferView<ArrayBufferLike>>(
            view: T,
        ): Promise<ReadableStreamReadResult<T>>;
        releaseLock(): void;
    }

    Hierarchy (View Summary)

    Properties

    Methods

    Properties

    closed: Promise<undefined>

    Methods

    • Returns void

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.ReadableStreamBYOBRequest.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.ReadableStreamBYOBRequest.html new file mode 100644 index 000000000..a0085f9a8 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.ReadableStreamBYOBRequest.html @@ -0,0 +1,8 @@ +ReadableStreamBYOBRequest | @wailsio/runtime

    Interface ReadableStreamBYOBRequest

    interface ReadableStreamBYOBRequest {
        view: null | ArrayBufferView<ArrayBufferLike>;
        respond(bytesWritten: number): void;
        respondWithNewView(view: ArrayBufferView): void;
    }

    Properties

    Methods

    Properties

    Methods

    • Parameters

      • bytesWritten: number

      Returns void

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.ReadableStreamDefaultController.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.ReadableStreamDefaultController.html new file mode 100644 index 000000000..0dc9a2850 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.ReadableStreamDefaultController.html @@ -0,0 +1,10 @@ +ReadableStreamDefaultController | @wailsio/runtime

    Interface ReadableStreamDefaultController<R>

    interface ReadableStreamDefaultController<R = any> {
        desiredSize: null | number;
        close(): void;
        enqueue(chunk?: R): void;
        error(e?: any): void;
    }

    Type Parameters

    • R = any

    Properties

    Methods

    Properties

    desiredSize: null | number

    Methods

    • Returns void

    • Parameters

      • Optionalchunk: R

      Returns void

    • Parameters

      • Optionale: any

      Returns void

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.ReadableStreamDefaultReader.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.ReadableStreamDefaultReader.html new file mode 100644 index 000000000..06db8c0bb --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.ReadableStreamDefaultReader.html @@ -0,0 +1,10 @@ +ReadableStreamDefaultReader | @wailsio/runtime

    Interface ReadableStreamDefaultReader<R>

    interface ReadableStreamDefaultReader<R = any> {
        closed: Promise<undefined>;
        cancel(reason?: any): Promise<void>;
        read(): Promise<ReadableStreamReadResult<R>>;
        releaseLock(): void;
    }

    Type Parameters

    • R = any

    Hierarchy (View Summary)

    Properties

    Methods

    Properties

    closed: Promise<undefined>

    Methods

    • Returns void

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.ReadableStreamGenericReader.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.ReadableStreamGenericReader.html new file mode 100644 index 000000000..556ee2394 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.ReadableStreamGenericReader.html @@ -0,0 +1,5 @@ +ReadableStreamGenericReader | @wailsio/runtime

    Interface ReadableStreamGenericReader

    interface ReadableStreamGenericReader {
        closed: Promise<undefined>;
        cancel(reason?: any): Promise<void>;
    }

    Hierarchy (View Summary)

    Properties

    Methods

    Properties

    closed: Promise<undefined>

    Methods

    • Parameters

      • Optionalreason: any

      Returns Promise<void>

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.ReadableStreamGetReaderOptions.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.ReadableStreamGetReaderOptions.html new file mode 100644 index 000000000..f71b8b580 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.ReadableStreamGetReaderOptions.html @@ -0,0 +1,4 @@ +ReadableStreamGetReaderOptions | @wailsio/runtime

    Interface ReadableStreamGetReaderOptions

    interface ReadableStreamGetReaderOptions {
        mode?: "byob";
    }

    Properties

    Properties

    mode?: "byob"

    Creates a ReadableStreamBYOBReader and locks the stream to the new reader.

    +

    This call behaves the same way as the no-argument variant, except that it only works on readable byte streams, i.e. streams which were constructed specifically with the ability to handle "bring your own buffer" reading. The returned BYOB reader provides the ability to directly read individual chunks from the stream via its read() method, into developer-supplied buffers, allowing more precise control over allocation.

    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.ReadableStreamReadDoneResult.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.ReadableStreamReadDoneResult.html new file mode 100644 index 000000000..d844ef013 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.ReadableStreamReadDoneResult.html @@ -0,0 +1,3 @@ +ReadableStreamReadDoneResult | @wailsio/runtime

    Interface ReadableStreamReadDoneResult<T>

    interface ReadableStreamReadDoneResult<T> {
        done: true;
        value?: T;
    }

    Type Parameters

    • T

    Properties

    Properties

    done: true
    value?: T
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.ReadableStreamReadValueResult.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.ReadableStreamReadValueResult.html new file mode 100644 index 000000000..a9b44ff4e --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.ReadableStreamReadValueResult.html @@ -0,0 +1,3 @@ +ReadableStreamReadValueResult | @wailsio/runtime

    Interface ReadableStreamReadValueResult<T>

    interface ReadableStreamReadValueResult<T> {
        done: false;
        value: T;
    }

    Type Parameters

    • T

    Properties

    Properties

    done: false
    value: T
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.ReadableWritablePair.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.ReadableWritablePair.html new file mode 100644 index 000000000..33668f35b --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.ReadableWritablePair.html @@ -0,0 +1,5 @@ +ReadableWritablePair | @wailsio/runtime

    Interface ReadableWritablePair<R, W>

    interface ReadableWritablePair<R = any, W = any> {
        readable: ReadableStream<R>;
        writable: WritableStream<W>;
    }

    Type Parameters

    • R = any
    • W = any

    Properties

    Properties

    readable: ReadableStream<R>
    writable: WritableStream<W>

    Provides a convenient, chainable way of piping this readable stream through a transform stream (or any other { writable, readable } pair). It simply pipes the stream into the writable side of the supplied pair, and returns the readable side for further use.

    +

    Piping a stream will lock it for the duration of the pipe, preventing any other consumer from acquiring a reader.

    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.Size.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.Size.html new file mode 100644 index 000000000..5b479462c --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.Size.html @@ -0,0 +1,6 @@ +Size | @wailsio/runtime

    A record describing the size of a window.

    +
    interface Size {
        height: number;
        width: number;
    }

    Properties

    Properties

    height: number

    The height of the window.

    +
    width: number

    The width of the window.

    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.SourceBuffer.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.SourceBuffer.html new file mode 100644 index 000000000..97fa41789 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.SourceBuffer.html @@ -0,0 +1,53 @@ +SourceBuffer | @wailsio/runtime

    A chunk of media to be passed into an HTMLMediaElement and played, via a MediaSource object. This can be made up of one or several media segments.

    +

    MDN Reference

    +
    interface SourceBuffer {
        appendWindowEnd: number;
        appendWindowStart: number;
        buffered: TimeRanges;
        mode: AppendMode;
        onabort: null | (this: SourceBuffer, ev: Event) => any;
        onerror: null | (this: SourceBuffer, ev: Event) => any;
        onupdate: null | (this: SourceBuffer, ev: Event) => any;
        onupdateend: null | (this: SourceBuffer, ev: Event) => any;
        onupdatestart: null | (this: SourceBuffer, ev: Event) => any;
        timestampOffset: number;
        updating: boolean;
        abort(): void;
        addEventListener<K extends keyof SourceBufferEventMap>(
            type: K,
            listener: (this: SourceBuffer, ev: SourceBufferEventMap[K]) => any,
            options?: boolean | AddEventListenerOptions,
        ): void;
        addEventListener(
            type: string,
            listener: EventListenerOrEventListenerObject,
            options?: boolean | AddEventListenerOptions,
        ): void;
        appendBuffer(data: BufferSource): void;
        changeType(type: string): void;
        dispatchEvent(event: Event): boolean;
        remove(start: number, end: number): void;
        removeEventListener<K extends keyof SourceBufferEventMap>(
            type: K,
            listener: (this: SourceBuffer, ev: SourceBufferEventMap[K]) => any,
            options?: boolean | EventListenerOptions,
        ): void;
        removeEventListener(
            type: string,
            listener: EventListenerOrEventListenerObject,
            options?: boolean | EventListenerOptions,
        ): void;
    }

    Hierarchy (View Summary)

    Properties

    appendWindowEnd: number
    appendWindowStart: number
    buffered: TimeRanges
    onabort: null | (this: SourceBuffer, ev: Event) => any
    onerror: null | (this: SourceBuffer, ev: Event) => any
    onupdate: null | (this: SourceBuffer, ev: Event) => any
    onupdateend: null | (this: SourceBuffer, ev: Event) => any
    onupdatestart: null | (this: SourceBuffer, ev: Event) => any
    timestampOffset: number
    updating: boolean

    Methods

    • Returns void

    • Appends an event listener for events whose type attribute value is type. The callback argument sets the callback that will be invoked when the event is dispatched.

      +

      The options argument sets listener-specific options. For compatibility this can be a boolean, in which case the method behaves exactly as if the value was specified as options's capture.

      +

      When set to true, options's capture prevents callback from being invoked when the event's eventPhase attribute value is BUBBLING_PHASE. When false (or not present), callback will not be invoked when event's eventPhase attribute value is CAPTURING_PHASE. Either way, callback will be invoked if event's eventPhase attribute value is AT_TARGET.

      +

      When set to true, options's passive indicates that the callback will not cancel the event by invoking preventDefault(). This is used to enable performance optimizations described in § 2.8 Observing event listeners.

      +

      When set to true, options's once indicates that the callback will only be invoked once after which the event listener will be removed.

      +

      If an AbortSignal is passed for options's signal, then the event listener will be removed when signal is aborted.

      +

      The event listener is appended to target's event listener list and is not appended if it has the same type, callback, and capture.

      +

      MDN Reference

      +

      Type Parameters

      Parameters

      Returns void

    • Appends an event listener for events whose type attribute value is type. The callback argument sets the callback that will be invoked when the event is dispatched.

      +

      The options argument sets listener-specific options. For compatibility this can be a boolean, in which case the method behaves exactly as if the value was specified as options's capture.

      +

      When set to true, options's capture prevents callback from being invoked when the event's eventPhase attribute value is BUBBLING_PHASE. When false (or not present), callback will not be invoked when event's eventPhase attribute value is CAPTURING_PHASE. Either way, callback will be invoked if event's eventPhase attribute value is AT_TARGET.

      +

      When set to true, options's passive indicates that the callback will not cancel the event by invoking preventDefault(). This is used to enable performance optimizations described in § 2.8 Observing event listeners.

      +

      When set to true, options's once indicates that the callback will only be invoked once after which the event listener will be removed.

      +

      If an AbortSignal is passed for options's signal, then the event listener will be removed when signal is aborted.

      +

      The event listener is appended to target's event listener list and is not appended if it has the same type, callback, and capture.

      +

      MDN Reference

      +

      Parameters

      Returns void

    • Parameters

      • type: string

      Returns void

    • Dispatches a synthetic event event to target and returns true if either event's cancelable attribute value is false or its preventDefault() method was not invoked, and false otherwise.

      +

      MDN Reference

      +

      Parameters

      Returns boolean

    • Parameters

      • start: number
      • end: number

      Returns void

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.SourceBufferEventMap.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.SourceBufferEventMap.html new file mode 100644 index 000000000..95e9fee8d --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.SourceBufferEventMap.html @@ -0,0 +1,6 @@ +SourceBufferEventMap | @wailsio/runtime
    interface SourceBufferEventMap {
        abort: Event;
        error: Event;
        update: Event;
        updateend: Event;
        updatestart: Event;
    }

    Properties

    abort: Event
    error: Event
    update: Event
    updateend: Event
    updatestart: Event
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.StreamPipeOptions.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.StreamPipeOptions.html new file mode 100644 index 000000000..ec92b448b --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.StreamPipeOptions.html @@ -0,0 +1,13 @@ +StreamPipeOptions | @wailsio/runtime
    interface StreamPipeOptions {
        preventAbort?: boolean;
        preventCancel?: boolean;
        preventClose?: boolean;
        signal?: AbortSignal;
    }

    Properties

    preventAbort?: boolean
    preventCancel?: boolean
    preventClose?: boolean

    Pipes this readable stream to a given writable stream destination. The way in which the piping process behaves under various error conditions can be customized with a number of passed options. It returns a promise that fulfills when the piping process completes successfully, or rejects if any errors were encountered.

    +

    Piping a stream will lock it for the duration of the pipe, preventing any other consumer from acquiring a reader.

    +

    Errors and closures of the source and destination streams propagate as follows:

    +

    An error in this source readable stream will abort destination, unless preventAbort is truthy. The returned promise will be rejected with the source's error, or with any error that occurs during aborting the destination.

    +

    An error in destination will cancel this source readable stream, unless preventCancel is truthy. The returned promise will be rejected with the destination's error, or with any error that occurs during canceling the source.

    +

    When this source readable stream closes, destination will be closed, unless preventClose is truthy. The returned promise will be fulfilled once this process completes, unless an error is encountered while closing the destination, in which case it will be rejected with that error.

    +

    If destination starts out closed or closing, this source readable stream will be canceled, unless preventCancel is true. The returned promise will be rejected with an error indicating piping to a closed stream failed, or with any error that occurs during canceling the source.

    +

    The signal option can be set to an AbortSignal to allow aborting an ongoing pipe operation via the corresponding AbortController. In this case, this source readable stream will be canceled, and destination aborted, unless the respective options preventCancel or preventAbort are set.

    +
    signal?: AbortSignal
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.TimeRanges.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.TimeRanges.html new file mode 100644 index 000000000..f93dd4e77 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.TimeRanges.html @@ -0,0 +1,14 @@ +TimeRanges | @wailsio/runtime

    Used to represent a set of time ranges, primarily for the purpose of tracking which portions of media have been buffered when loading it for use by the

    +

    MDN Reference

    +
    interface TimeRanges {
        length: number;
        end(index: number): number;
        start(index: number): number;
    }

    Properties

    Methods

    Properties

    length: number

    Returns the number of ranges in the object.

    +

    MDN Reference

    +

    Methods

    • Returns the time for the end of the range with the given index.

      +

      Throws an "IndexSizeError" DOMException if the index is out of range.

      +

      MDN Reference

      +

      Parameters

      • index: number

      Returns number

    • Returns the time for the start of the range with the given index.

      +

      Throws an "IndexSizeError" DOMException if the index is out of range.

      +

      MDN Reference

      +

      Parameters

      • index: number

      Returns number

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.URL.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.URL.html new file mode 100644 index 000000000..171f46a55 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.URL.html @@ -0,0 +1,30 @@ +URL | @wailsio/runtime

    The URL interface represents an object providing static methods used for creating object URLs.

    +

    MDN Reference

    +
    interface URL {
        hash: string;
        host: string;
        hostname: string;
        href: string;
        origin: string;
        password: string;
        pathname: string;
        port: string;
        protocol: string;
        search: string;
        searchParams: URLSearchParams;
        username: string;
        toJSON(): string;
        toString(): string;
    }

    Properties

    hash: string
    host: string
    hostname: string
    href: string
    origin: string
    password: string
    pathname: string
    port: string
    protocol: string
    search: string
    searchParams: URLSearchParams
    username: string

    Methods

    • Returns string

    • Returns string

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.UnderlyingByteSource.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.UnderlyingByteSource.html new file mode 100644 index 000000000..f4d07fbf6 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.UnderlyingByteSource.html @@ -0,0 +1,6 @@ +UnderlyingByteSource | @wailsio/runtime
    interface UnderlyingByteSource {
        autoAllocateChunkSize?: number;
        cancel?: UnderlyingSourceCancelCallback;
        pull?: (
            controller: ReadableByteStreamController,
        ) => void | PromiseLike<void>;
        start?: (controller: ReadableByteStreamController) => any;
        type: "bytes";
    }

    Properties

    autoAllocateChunkSize?: number
    pull?: (controller: ReadableByteStreamController) => void | PromiseLike<void>
    start?: (controller: ReadableByteStreamController) => any
    type: "bytes"
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.UnderlyingDefaultSource.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.UnderlyingDefaultSource.html new file mode 100644 index 000000000..d282894c4 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.UnderlyingDefaultSource.html @@ -0,0 +1,5 @@ +UnderlyingDefaultSource | @wailsio/runtime

    Interface UnderlyingDefaultSource<R>

    interface UnderlyingDefaultSource<R = any> {
        cancel?: UnderlyingSourceCancelCallback;
        pull?: (
            controller: ReadableStreamDefaultController<R>,
        ) => void | PromiseLike<void>;
        start?: (controller: ReadableStreamDefaultController<R>) => any;
        type?: undefined;
    }

    Type Parameters

    • R = any

    Properties

    Properties

    pull?: (
        controller: ReadableStreamDefaultController<R>,
    ) => void | PromiseLike<void>
    start?: (controller: ReadableStreamDefaultController<R>) => any
    type?: undefined
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.UnderlyingSink.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.UnderlyingSink.html new file mode 100644 index 000000000..d6da3c8d4 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.UnderlyingSink.html @@ -0,0 +1,6 @@ +UnderlyingSink | @wailsio/runtime

    Interface UnderlyingSink<W>

    interface UnderlyingSink<W = any> {
        abort?: UnderlyingSinkAbortCallback;
        close?: UnderlyingSinkCloseCallback;
        start?: UnderlyingSinkStartCallback;
        type?: undefined;
        write?: UnderlyingSinkWriteCallback<W>;
    }

    Type Parameters

    • W = any

    Properties

    Properties

    type?: undefined
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.UnderlyingSinkAbortCallback.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.UnderlyingSinkAbortCallback.html new file mode 100644 index 000000000..e45d9d445 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.UnderlyingSinkAbortCallback.html @@ -0,0 +1 @@ +UnderlyingSinkAbortCallback | @wailsio/runtime

    Interface UnderlyingSinkAbortCallback

    • Parameters

      • Optionalreason: any

      Returns void | PromiseLike<void>

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.UnderlyingSinkCloseCallback.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.UnderlyingSinkCloseCallback.html new file mode 100644 index 000000000..06c0a3608 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.UnderlyingSinkCloseCallback.html @@ -0,0 +1 @@ +UnderlyingSinkCloseCallback | @wailsio/runtime

    Interface UnderlyingSinkCloseCallback

    • Returns void | PromiseLike<void>

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.UnderlyingSinkStartCallback.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.UnderlyingSinkStartCallback.html new file mode 100644 index 000000000..b3fa49c5c --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.UnderlyingSinkStartCallback.html @@ -0,0 +1 @@ +UnderlyingSinkStartCallback | @wailsio/runtime

    Interface UnderlyingSinkStartCallback

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.UnderlyingSinkWriteCallback.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.UnderlyingSinkWriteCallback.html new file mode 100644 index 000000000..81ad323e5 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.UnderlyingSinkWriteCallback.html @@ -0,0 +1 @@ +UnderlyingSinkWriteCallback | @wailsio/runtime

    Interface UnderlyingSinkWriteCallback<W>

    Type Parameters

    • W
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.UnderlyingSource.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.UnderlyingSource.html new file mode 100644 index 000000000..c95e2903c --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.UnderlyingSource.html @@ -0,0 +1,6 @@ +UnderlyingSource | @wailsio/runtime

    Interface UnderlyingSource<R>

    interface UnderlyingSource<R = any> {
        autoAllocateChunkSize?: number;
        cancel?: UnderlyingSourceCancelCallback;
        pull?: UnderlyingSourcePullCallback<R>;
        start?: UnderlyingSourceStartCallback<R>;
        type?: "bytes";
    }

    Type Parameters

    • R = any

    Properties

    autoAllocateChunkSize?: number
    type?: "bytes"
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.UnderlyingSourceCancelCallback.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.UnderlyingSourceCancelCallback.html new file mode 100644 index 000000000..978b039e9 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.UnderlyingSourceCancelCallback.html @@ -0,0 +1 @@ +UnderlyingSourceCancelCallback | @wailsio/runtime

    Interface UnderlyingSourceCancelCallback

    • Parameters

      • Optionalreason: any

      Returns void | PromiseLike<void>

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.UnderlyingSourcePullCallback.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.UnderlyingSourcePullCallback.html new file mode 100644 index 000000000..8779e3a64 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.UnderlyingSourcePullCallback.html @@ -0,0 +1 @@ +UnderlyingSourcePullCallback | @wailsio/runtime

    Interface UnderlyingSourcePullCallback<R>

    Type Parameters

    • R
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.UnderlyingSourceStartCallback.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.UnderlyingSourceStartCallback.html new file mode 100644 index 000000000..acfdef628 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.UnderlyingSourceStartCallback.html @@ -0,0 +1 @@ +UnderlyingSourceStartCallback | @wailsio/runtime

    Interface UnderlyingSourceStartCallback<R>

    Type Parameters

    • R
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.WritableStream.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.WritableStream.html new file mode 100644 index 000000000..fcaeff279 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.WritableStream.html @@ -0,0 +1,11 @@ +WritableStream | @wailsio/runtime

    Interface WritableStream<W>

    This Streams API interface provides a standard abstraction for writing streaming data to a destination, known as a sink. This object comes with built-in backpressure and queuing.

    +

    MDN Reference

    +
    interface WritableStream<W = any> {
        locked: boolean;
        abort(reason?: any): Promise<void>;
        close(): Promise<void>;
        getWriter(): WritableStreamDefaultWriter<W>;
    }

    Type Parameters

    • W = any

    Properties

    Methods

    Properties

    locked: boolean

    Methods

    • Parameters

      • Optionalreason: any

      Returns Promise<void>

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.WritableStreamDefaultController.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.WritableStreamDefaultController.html new file mode 100644 index 000000000..c51cc6c16 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.WritableStreamDefaultController.html @@ -0,0 +1,7 @@ +WritableStreamDefaultController | @wailsio/runtime

    Interface WritableStreamDefaultController

    This Streams API interface represents a controller allowing control of a WritableStream's state. When constructing a WritableStream, the underlying sink is given a corresponding WritableStreamDefaultController instance to manipulate.

    +

    MDN Reference

    +
    interface WritableStreamDefaultController {
        signal: AbortSignal;
        error(e?: any): void;
    }

    Properties

    Methods

    Properties

    signal: AbortSignal

    Methods

    • Parameters

      • Optionale: any

      Returns void

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.WritableStreamDefaultWriter.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.WritableStreamDefaultWriter.html new file mode 100644 index 000000000..d0d4f5ed7 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.WritableStreamDefaultWriter.html @@ -0,0 +1,17 @@ +WritableStreamDefaultWriter | @wailsio/runtime

    Interface WritableStreamDefaultWriter<W>

    This Streams API interface is the object returned by WritableStream.getWriter() and once created locks the < writer to the WritableStream ensuring that no other streams can write to the underlying sink.

    +

    MDN Reference

    +
    interface WritableStreamDefaultWriter<W = any> {
        closed: Promise<undefined>;
        desiredSize: null | number;
        ready: Promise<undefined>;
        abort(reason?: any): Promise<void>;
        close(): Promise<void>;
        releaseLock(): void;
        write(chunk?: W): Promise<void>;
    }

    Type Parameters

    • W = any

    Properties

    closed: Promise<undefined>
    desiredSize: null | number
    ready: Promise<undefined>

    Methods

    • Parameters

      • Optionalreason: any

      Returns Promise<void>

    • Returns void

    • Parameters

      • Optionalchunk: W

      Returns Promise<void>

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules.html index 8f724e236..4248cf28d 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules.html @@ -1,14 +1 @@ -@wailsio/runtime

    @wailsio/runtime

    Index

    Namespaces

    Variables

    Functions

    Generated using TypeDoc

    \ No newline at end of file +@wailsio/runtime
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Application.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Application.html index 774d89b63..e6b5d57c5 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Application.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Application.html @@ -1,4 +1 @@ -Application | @wailsio/runtime

    Namespace Application

    Index

    Functions

    Generated using TypeDoc

    \ No newline at end of file +Application | @wailsio/runtime

    Namespace Application

    Functions

    Hide
    Quit
    Show
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Browser.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Browser.html index 0145e67d0..757bf8469 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Browser.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Browser.html @@ -1,2 +1 @@ -Browser | @wailsio/runtime

    Namespace Browser

    Index

    Functions

    Generated using TypeDoc

    \ No newline at end of file +Browser | @wailsio/runtime

    Namespace Browser

    Functions

    OpenURL
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Call.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Call.html index 9ab08dc0d..8d06195ea 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Call.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Call.html @@ -1,6 +1 @@ -Call | @wailsio/runtime

    Namespace Call

    Index

    Classes

    Interfaces

    Functions

    Generated using TypeDoc

    \ No newline at end of file +Call | @wailsio/runtime

    Namespace Call

    Classes

    RuntimeError

    Type Aliases

    CallOptions

    Functions

    ByID
    ByName
    Call
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Clipboard.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Clipboard.html index 16f8524c6..1d15bfa14 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Clipboard.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Clipboard.html @@ -1,3 +1 @@ -Clipboard | @wailsio/runtime

    Namespace Clipboard

    Index

    Functions

    Generated using TypeDoc

    \ No newline at end of file +Clipboard | @wailsio/runtime

    Namespace Clipboard

    Functions

    SetText
    Text
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Create.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Create.html deleted file mode 100644 index b04a1718b..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Create.html +++ /dev/null @@ -1,7 +0,0 @@ -Create | @wailsio/runtime

    Namespace Create

    Index

    Functions

    Generated using TypeDoc

    \ No newline at end of file diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Dialogs.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Dialogs.html index 738840302..256f30a47 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Dialogs.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Dialogs.html @@ -1,12 +1 @@ -Dialogs | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file +Dialogs | @wailsio/runtime
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Events.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Events.html index 664854f17..cd12fa65d 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Events.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Events.html @@ -1,10 +1 @@ -Events | @wailsio/runtime

    Namespace Events

    Index

    Classes

    Variables

    Functions

    Generated using TypeDoc

    \ No newline at end of file +Events | @wailsio/runtime

    Namespace Events

    Classes

    WailsEvent

    Type Aliases

    Callback

    Variables

    Types

    Functions

    Emit
    Off
    OffAll
    On
    Once
    OnMultiple
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Flags.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Flags.html index a4421fba6..2004c8692 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Flags.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Flags.html @@ -1,2 +1 @@ -Flags | @wailsio/runtime

    Namespace Flags

    Index

    Functions

    Generated using TypeDoc

    \ No newline at end of file +Flags | @wailsio/runtime

    Namespace Flags

    Functions

    GetFlag
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Screens.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Screens.html index f38ad0a9c..f25eaabb3 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Screens.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/Screens.html @@ -1,7 +1 @@ -Screens | @wailsio/runtime

    Namespace Screens

    Index

    Interfaces

    Functions

    Generated using TypeDoc

    \ No newline at end of file +Screens | @wailsio/runtime
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/System.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/System.html index e76d409db..bc891a645 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/System.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/System.html @@ -1,14 +1 @@ -System | @wailsio/runtime

    Generated using TypeDoc

    \ No newline at end of file +System | @wailsio/runtime
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/WML.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/WML.html index 48865bdfb..e2d7d3912 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/WML.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/WML.html @@ -1,3 +1 @@ -WML | @wailsio/runtime

    Namespace WML

    Index

    Functions

    Generated using TypeDoc

    \ No newline at end of file +WML | @wailsio/runtime

    Namespace WML

    Functions

    Enable
    Reload
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/_internal_.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/_internal_.html new file mode 100644 index 000000000..9707760fd --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/modules/_internal_.html @@ -0,0 +1 @@ +<internal> | @wailsio/runtime

    Classes

    Window

    Interfaces

    AddEventListenerOptions
    ArrayBufferView
    Blob
    BlobPropertyBag
    ErrorOptions
    Event
    EventInit
    EventListener
    EventListenerObject
    EventListenerOptions
    EventTarget
    Iterable
    MediaSource
    MediaSourceEventMap
    Position
    PromiseFulfilledResult
    PromiseLike
    PromiseRejectedResult
    PromiseWithResolvers
    QueuingStrategy
    QueuingStrategySize
    ReadableByteStreamController
    ReadableStream
    ReadableStreamBYOBReader
    ReadableStreamBYOBRequest
    ReadableStreamDefaultController
    ReadableStreamDefaultReader
    ReadableStreamGenericReader
    ReadableStreamGetReaderOptions
    ReadableStreamReadDoneResult
    ReadableStreamReadValueResult
    ReadableWritablePair
    Size
    SourceBuffer
    SourceBufferEventMap
    StreamPipeOptions
    TimeRanges
    UnderlyingByteSource
    UnderlyingDefaultSource
    UnderlyingSink
    UnderlyingSinkAbortCallback
    UnderlyingSinkCloseCallback
    UnderlyingSinkStartCallback
    UnderlyingSinkWriteCallback
    UnderlyingSource
    UnderlyingSourceCancelCallback
    UnderlyingSourcePullCallback
    UnderlyingSourceStartCallback
    URL
    WritableStream
    WritableStreamDefaultController
    WritableStreamDefaultWriter

    Type Aliases

    AppendMode
    ArrayBufferLike
    Awaited
    BlobPart
    BufferSource
    CancellablePromiseCanceller
    CancellablePromiseExecutor
    CancellablePromiseRejector
    CancellablePromiseResolver
    EndingType
    EndOfStreamError
    EventListenerOrEventListenerObject
    Partial
    PromiseSettledResult
    ReadableStreamController
    ReadableStreamReader
    ReadableStreamReadResult
    Readonly
    ReadyState
    Record

    Variables

    Blob
    Event
    EventTarget
    MediaSource
    ReadableByteStreamController
    ReadableStream
    ReadableStreamBYOBReader
    ReadableStreamBYOBRequest
    ReadableStreamDefaultController
    ReadableStreamDefaultReader
    SourceBuffer
    TimeRanges
    URL
    WritableStream
    WritableStreamDefaultController
    WritableStreamDefaultWriter
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/Call.CallOptions.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/Call.CallOptions.html new file mode 100644 index 000000000..6a68da485 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/Call.CallOptions.html @@ -0,0 +1,9 @@ +CallOptions | @wailsio/runtime

    Type Alias CallOptions

    CallOptions:
        | { args: any[]; methodID: number; methodName?: never }
        | { args: any[]; methodID?: never; methodName: string }

    Holds all required information for a binding call. +May provide either a method ID or a method name, but not both.

    +

    Type declaration

    • { args: any[]; methodID: number; methodName?: never }
      • args: any[]

        Arguments to be passed into the bound method.

        +
      • methodID: number

        The numeric ID of the bound method to call.

        +
      • OptionalmethodName?: never

        The fully qualified name of the bound method to call.

        +
    • { args: any[]; methodID?: never; methodName: string }
      • args: any[]

        Arguments to be passed into the bound method.

        +
      • OptionalmethodID?: never

        The numeric ID of the bound method to call.

        +
      • methodName: string

        The fully qualified name of the bound method to call.

        +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/Events.Callback.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/Events.Callback.html new file mode 100644 index 000000000..4a648b247 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/Events.Callback.html @@ -0,0 +1,2 @@ +Callback | @wailsio/runtime
    Callback: (ev: WailsEvent) => void

    The type of handlers for a given event.

    +

    Type declaration

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.AppendMode.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.AppendMode.html new file mode 100644 index 000000000..21279131a --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.AppendMode.html @@ -0,0 +1 @@ +AppendMode | @wailsio/runtime
    AppendMode: "segments" | "sequence"
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.ArrayBufferLike.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.ArrayBufferLike.html new file mode 100644 index 000000000..27533a820 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.ArrayBufferLike.html @@ -0,0 +1 @@ +ArrayBufferLike | @wailsio/runtime
    ArrayBufferLike: ArrayBufferTypes[keyof ArrayBufferTypes]
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.Awaited.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.Awaited.html new file mode 100644 index 000000000..7d51c3785 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.Awaited.html @@ -0,0 +1,2 @@ +Awaited | @wailsio/runtime
    Awaited: T extends null
    | undefined
        ? T
        : T extends object & { then(onfulfilled: F, ...args: _): any }
            ? F extends (value: infer V, ...args: infer _) => any
                ? Awaited<V>
                : never
            : T

    Recursively unwraps the "awaited type" of a type. Non-promise "thenables" should resolve to never. This emulates the behavior of await.

    +

    Type Parameters

    • T
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.BlobPart.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.BlobPart.html new file mode 100644 index 000000000..116be5557 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.BlobPart.html @@ -0,0 +1 @@ +BlobPart | @wailsio/runtime
    BlobPart: BufferSource | Blob | string
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.BufferSource.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.BufferSource.html new file mode 100644 index 000000000..c4ad275f4 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.BufferSource.html @@ -0,0 +1 @@ +BufferSource | @wailsio/runtime
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.CancellablePromiseCanceller.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.CancellablePromiseCanceller.html new file mode 100644 index 000000000..5b7750405 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.CancellablePromiseCanceller.html @@ -0,0 +1 @@ +CancellablePromiseCanceller | @wailsio/runtime

    Type Alias CancellablePromiseCanceller

    CancellablePromiseCanceller: (cause?: any) => void | PromiseLike<void>

    Type declaration

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.CancellablePromiseExecutor.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.CancellablePromiseExecutor.html new file mode 100644 index 000000000..f102891c1 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.CancellablePromiseExecutor.html @@ -0,0 +1 @@ +CancellablePromiseExecutor | @wailsio/runtime

    Type Alias CancellablePromiseExecutor<T>

    CancellablePromiseExecutor: (
        resolve: CancellablePromiseResolver<T>,
        reject: CancellablePromiseRejector,
    ) => void

    Type Parameters

    • T

    Type declaration

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.CancellablePromiseRejector.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.CancellablePromiseRejector.html new file mode 100644 index 000000000..92c3be544 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.CancellablePromiseRejector.html @@ -0,0 +1 @@ +CancellablePromiseRejector | @wailsio/runtime

    Type Alias CancellablePromiseRejector

    CancellablePromiseRejector: (reason?: any) => void

    Type declaration

      • (reason?: any): void
      • Parameters

        • Optionalreason: any

        Returns void

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.CancellablePromiseResolver.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.CancellablePromiseResolver.html new file mode 100644 index 000000000..7bfde4a45 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.CancellablePromiseResolver.html @@ -0,0 +1 @@ +CancellablePromiseResolver | @wailsio/runtime

    Type Alias CancellablePromiseResolver<T>

    CancellablePromiseResolver: (
        value: T | PromiseLike<T> | CancellablePromiseLike<T>,
    ) => void

    Type Parameters

    • T

    Type declaration

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.EndOfStreamError.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.EndOfStreamError.html new file mode 100644 index 000000000..df2e1e6b6 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.EndOfStreamError.html @@ -0,0 +1 @@ +EndOfStreamError | @wailsio/runtime
    EndOfStreamError: "decode" | "network"
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.EndingType.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.EndingType.html new file mode 100644 index 000000000..97b2a0bfe --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.EndingType.html @@ -0,0 +1 @@ +EndingType | @wailsio/runtime
    EndingType: "native" | "transparent"
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.EventListenerOrEventListenerObject.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.EventListenerOrEventListenerObject.html new file mode 100644 index 000000000..c0e2bfa6d --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.EventListenerOrEventListenerObject.html @@ -0,0 +1 @@ +EventListenerOrEventListenerObject | @wailsio/runtime

    Type Alias EventListenerOrEventListenerObject

    EventListenerOrEventListenerObject: EventListener | EventListenerObject
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.Partial.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.Partial.html new file mode 100644 index 000000000..c2c89e799 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.Partial.html @@ -0,0 +1,2 @@ +Partial | @wailsio/runtime
    Partial: { [P in keyof T]?: T[P] }

    Make all properties in T optional

    +

    Type Parameters

    • T
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.PromiseSettledResult.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.PromiseSettledResult.html new file mode 100644 index 000000000..c71a7894b --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.PromiseSettledResult.html @@ -0,0 +1 @@ +PromiseSettledResult | @wailsio/runtime

    Type Alias PromiseSettledResult<T>

    Type Parameters

    • T
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.ReadableStreamController.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.ReadableStreamController.html new file mode 100644 index 000000000..03ff250f6 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.ReadableStreamController.html @@ -0,0 +1 @@ +ReadableStreamController | @wailsio/runtime

    Type Alias ReadableStreamController<T>

    ReadableStreamController:
        | ReadableStreamDefaultController<T>
        | ReadableByteStreamController

    Type Parameters

    • T
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.ReadableStreamReadResult.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.ReadableStreamReadResult.html new file mode 100644 index 000000000..300a4a370 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.ReadableStreamReadResult.html @@ -0,0 +1 @@ +ReadableStreamReadResult | @wailsio/runtime

    Type Alias ReadableStreamReadResult<T>

    ReadableStreamReadResult:
        | ReadableStreamReadValueResult<T>
        | ReadableStreamReadDoneResult<T>

    Type Parameters

    • T
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.ReadableStreamReader.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.ReadableStreamReader.html new file mode 100644 index 000000000..a6eb2921a --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.ReadableStreamReader.html @@ -0,0 +1 @@ +ReadableStreamReader | @wailsio/runtime

    Type Alias ReadableStreamReader<T>

    Type Parameters

    • T
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.Readonly.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.Readonly.html new file mode 100644 index 000000000..3f66bd1ba --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.Readonly.html @@ -0,0 +1,2 @@ +Readonly | @wailsio/runtime
    Readonly: { readonly [P in keyof T]: T[P] }

    Make all properties in T readonly

    +

    Type Parameters

    • T
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.ReadyState.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.ReadyState.html new file mode 100644 index 000000000..cab35e873 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.ReadyState.html @@ -0,0 +1 @@ +ReadyState | @wailsio/runtime
    ReadyState: "closed" | "ended" | "open"
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.Record.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.Record.html new file mode 100644 index 000000000..8930f14b9 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.Record.html @@ -0,0 +1,2 @@ +Record | @wailsio/runtime

    Type Alias Record<K, T>

    Record: { [P in K]: T }

    Construct a type with a set of properties K of type T

    +

    Type Parameters

    • K extends keyof any
    • T
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Events.Types.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Events.Types.html index b16f0175f..8637877ed 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Events.Types.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Events.Types.html @@ -1 +1 @@ -Types | @wailsio/runtime

    Variable TypesConst

    Types: {
        Common: {
            ApplicationOpenedWithFile: string;
            ApplicationStarted: string;
            ThemeChanged: string;
            WindowClosing: string;
            WindowDPIChanged: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowFilesDropped: string;
            WindowFocus: string;
            WindowFullscreen: string;
            WindowHide: string;
            WindowLostFocus: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowRestore: string;
            WindowRuntimeReady: string;
            WindowShow: string;
            WindowUnFullscreen: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowZoom: string;
            WindowZoomIn: string;
            WindowZoomOut: string;
            WindowZoomReset: string;
        };
        Linux: {
            ApplicationStartup: string;
            SystemThemeChanged: string;
            WindowDeleteEvent: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowFocusIn: string;
            WindowFocusOut: string;
            WindowLoadChanged: string;
        };
        Mac: {
            ApplicationDidBecomeActive: string;
            ApplicationDidChangeBackingProperties: string;
            ApplicationDidChangeEffectiveAppearance: string;
            ApplicationDidChangeIcon: string;
            ApplicationDidChangeOcclusionState: string;
            ApplicationDidChangeScreenParameters: string;
            ApplicationDidChangeStatusBarFrame: string;
            ApplicationDidChangeStatusBarOrientation: string;
            ApplicationDidChangeTheme: string;
            ApplicationDidFinishLaunching: string;
            ApplicationDidHide: string;
            ApplicationDidResignActive: string;
            ApplicationDidUnhide: string;
            ApplicationDidUpdate: string;
            ApplicationShouldHandleReopen: string;
            ApplicationWillBecomeActive: string;
            ApplicationWillFinishLaunching: string;
            ApplicationWillHide: string;
            ApplicationWillResignActive: string;
            ApplicationWillTerminate: string;
            ApplicationWillUnhide: string;
            ApplicationWillUpdate: string;
            MenuDidAddItem: string;
            MenuDidBeginTracking: string;
            MenuDidClose: string;
            MenuDidDisplayItem: string;
            MenuDidEndTracking: string;
            MenuDidHighlightItem: string;
            MenuDidOpen: string;
            MenuDidPopUp: string;
            MenuDidRemoveItem: string;
            MenuDidSendAction: string;
            MenuDidSendActionToItem: string;
            MenuDidUpdate: string;
            MenuWillAddItem: string;
            MenuWillBeginTracking: string;
            MenuWillDisplayItem: string;
            MenuWillEndTracking: string;
            MenuWillHighlightItem: string;
            MenuWillOpen: string;
            MenuWillPopUp: string;
            MenuWillRemoveItem: string;
            MenuWillSendAction: string;
            MenuWillSendActionToItem: string;
            MenuWillUpdate: string;
            WebViewDidCommitNavigation: string;
            WebViewDidFinishNavigation: string;
            WebViewDidReceiveServerRedirectForProvisionalNavigation: string;
            WebViewDidStartProvisionalNavigation: string;
            WindowDidBecomeKey: string;
            WindowDidBecomeMain: string;
            WindowDidBeginSheet: string;
            WindowDidChangeAlpha: string;
            WindowDidChangeBackingLocation: string;
            WindowDidChangeBackingProperties: string;
            WindowDidChangeCollectionBehavior: string;
            WindowDidChangeEffectiveAppearance: string;
            WindowDidChangeOcclusionState: string;
            WindowDidChangeOrderingMode: string;
            WindowDidChangeScreen: string;
            WindowDidChangeScreenParameters: string;
            WindowDidChangeScreenProfile: string;
            WindowDidChangeScreenSpace: string;
            WindowDidChangeScreenSpaceProperties: string;
            WindowDidChangeSharingType: string;
            WindowDidChangeSpace: string;
            WindowDidChangeSpaceOrderingMode: string;
            WindowDidChangeTitle: string;
            WindowDidChangeToolbar: string;
            WindowDidDeminiaturize: string;
            WindowDidEndSheet: string;
            WindowDidEnterFullScreen: string;
            WindowDidEnterVersionBrowser: string;
            WindowDidExitFullScreen: string;
            WindowDidExitVersionBrowser: string;
            WindowDidExpose: string;
            WindowDidFocus: string;
            WindowDidMiniaturize: string;
            WindowDidMove: string;
            WindowDidOrderOffScreen: string;
            WindowDidOrderOnScreen: string;
            WindowDidResignKey: string;
            WindowDidResignMain: string;
            WindowDidResize: string;
            WindowDidUpdate: string;
            WindowDidUpdateAlpha: string;
            WindowDidUpdateCollectionBehavior: string;
            WindowDidUpdateCollectionProperties: string;
            WindowDidUpdateShadow: string;
            WindowDidUpdateTitle: string;
            WindowDidUpdateToolbar: string;
            WindowDidZoom: string;
            WindowFileDraggingEntered: string;
            WindowFileDraggingExited: string;
            WindowFileDraggingPerformed: string;
            WindowHide: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowShouldClose: string;
            WindowShow: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowWillBecomeKey: string;
            WindowWillBecomeMain: string;
            WindowWillBeginSheet: string;
            WindowWillChangeOrderingMode: string;
            WindowWillClose: string;
            WindowWillDeminiaturize: string;
            WindowWillEnterFullScreen: string;
            WindowWillEnterVersionBrowser: string;
            WindowWillExitFullScreen: string;
            WindowWillExitVersionBrowser: string;
            WindowWillFocus: string;
            WindowWillMiniaturize: string;
            WindowWillMove: string;
            WindowWillOrderOffScreen: string;
            WindowWillOrderOnScreen: string;
            WindowWillResignMain: string;
            WindowWillResize: string;
            WindowWillUnfocus: string;
            WindowWillUpdate: string;
            WindowWillUpdateAlpha: string;
            WindowWillUpdateCollectionBehavior: string;
            WindowWillUpdateCollectionProperties: string;
            WindowWillUpdateShadow: string;
            WindowWillUpdateTitle: string;
            WindowWillUpdateToolbar: string;
            WindowWillUpdateVisibility: string;
            WindowWillUseStandardFrame: string;
            WindowZoomIn: string;
            WindowZoomOut: string;
            WindowZoomReset: string;
        };
        Windows: {
            APMPowerSettingChange: string;
            APMPowerStatusChange: string;
            APMResumeAutomatic: string;
            APMResumeSuspend: string;
            APMSuspend: string;
            ApplicationStarted: string;
            SystemThemeChanged: string;
            WebViewNavigationCompleted: string;
            WindowActive: string;
            WindowBackgroundErase: string;
            WindowClickActive: string;
            WindowClosing: string;
            WindowDPIChanged: string;
            WindowDidMove: string;
            WindowDidResize: string;
            WindowDragDrop: string;
            WindowDragEnter: string;
            WindowDragLeave: string;
            WindowDragOver: string;
            WindowEndMove: string;
            WindowEndResize: string;
            WindowFullscreen: string;
            WindowHide: string;
            WindowInactive: string;
            WindowKeyDown: string;
            WindowKeyUp: string;
            WindowKillFocus: string;
            WindowMaximise: string;
            WindowMinimise: string;
            WindowNonClientHit: string;
            WindowNonClientMouseDown: string;
            WindowNonClientMouseLeave: string;
            WindowNonClientMouseMove: string;
            WindowNonClientMouseUp: string;
            WindowPaint: string;
            WindowRestore: string;
            WindowSetFocus: string;
            WindowShow: string;
            WindowStartMove: string;
            WindowStartResize: string;
            WindowUnFullscreen: string;
            WindowUnMaximise: string;
            WindowUnMinimise: string;
            WindowZOrderChanged: string;
        };
    } = EventTypes

    Type declaration

    • Common: {
          ApplicationOpenedWithFile: string;
          ApplicationStarted: string;
          ThemeChanged: string;
          WindowClosing: string;
          WindowDPIChanged: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowFilesDropped: string;
          WindowFocus: string;
          WindowFullscreen: string;
          WindowHide: string;
          WindowLostFocus: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowRestore: string;
          WindowRuntimeReady: string;
          WindowShow: string;
          WindowUnFullscreen: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowZoom: string;
          WindowZoomIn: string;
          WindowZoomOut: string;
          WindowZoomReset: string;
      }
      • ApplicationOpenedWithFile: string
      • ApplicationStarted: string
      • ThemeChanged: string
      • WindowClosing: string
      • WindowDPIChanged: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowFilesDropped: string
      • WindowFocus: string
      • WindowFullscreen: string
      • WindowHide: string
      • WindowLostFocus: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowRestore: string
      • WindowRuntimeReady: string
      • WindowShow: string
      • WindowUnFullscreen: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowZoom: string
      • WindowZoomIn: string
      • WindowZoomOut: string
      • WindowZoomReset: string
    • Linux: {
          ApplicationStartup: string;
          SystemThemeChanged: string;
          WindowDeleteEvent: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowFocusIn: string;
          WindowFocusOut: string;
          WindowLoadChanged: string;
      }
      • ApplicationStartup: string
      • SystemThemeChanged: string
      • WindowDeleteEvent: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowFocusIn: string
      • WindowFocusOut: string
      • WindowLoadChanged: string
    • Mac: {
          ApplicationDidBecomeActive: string;
          ApplicationDidChangeBackingProperties: string;
          ApplicationDidChangeEffectiveAppearance: string;
          ApplicationDidChangeIcon: string;
          ApplicationDidChangeOcclusionState: string;
          ApplicationDidChangeScreenParameters: string;
          ApplicationDidChangeStatusBarFrame: string;
          ApplicationDidChangeStatusBarOrientation: string;
          ApplicationDidChangeTheme: string;
          ApplicationDidFinishLaunching: string;
          ApplicationDidHide: string;
          ApplicationDidResignActive: string;
          ApplicationDidUnhide: string;
          ApplicationDidUpdate: string;
          ApplicationShouldHandleReopen: string;
          ApplicationWillBecomeActive: string;
          ApplicationWillFinishLaunching: string;
          ApplicationWillHide: string;
          ApplicationWillResignActive: string;
          ApplicationWillTerminate: string;
          ApplicationWillUnhide: string;
          ApplicationWillUpdate: string;
          MenuDidAddItem: string;
          MenuDidBeginTracking: string;
          MenuDidClose: string;
          MenuDidDisplayItem: string;
          MenuDidEndTracking: string;
          MenuDidHighlightItem: string;
          MenuDidOpen: string;
          MenuDidPopUp: string;
          MenuDidRemoveItem: string;
          MenuDidSendAction: string;
          MenuDidSendActionToItem: string;
          MenuDidUpdate: string;
          MenuWillAddItem: string;
          MenuWillBeginTracking: string;
          MenuWillDisplayItem: string;
          MenuWillEndTracking: string;
          MenuWillHighlightItem: string;
          MenuWillOpen: string;
          MenuWillPopUp: string;
          MenuWillRemoveItem: string;
          MenuWillSendAction: string;
          MenuWillSendActionToItem: string;
          MenuWillUpdate: string;
          WebViewDidCommitNavigation: string;
          WebViewDidFinishNavigation: string;
          WebViewDidReceiveServerRedirectForProvisionalNavigation: string;
          WebViewDidStartProvisionalNavigation: string;
          WindowDidBecomeKey: string;
          WindowDidBecomeMain: string;
          WindowDidBeginSheet: string;
          WindowDidChangeAlpha: string;
          WindowDidChangeBackingLocation: string;
          WindowDidChangeBackingProperties: string;
          WindowDidChangeCollectionBehavior: string;
          WindowDidChangeEffectiveAppearance: string;
          WindowDidChangeOcclusionState: string;
          WindowDidChangeOrderingMode: string;
          WindowDidChangeScreen: string;
          WindowDidChangeScreenParameters: string;
          WindowDidChangeScreenProfile: string;
          WindowDidChangeScreenSpace: string;
          WindowDidChangeScreenSpaceProperties: string;
          WindowDidChangeSharingType: string;
          WindowDidChangeSpace: string;
          WindowDidChangeSpaceOrderingMode: string;
          WindowDidChangeTitle: string;
          WindowDidChangeToolbar: string;
          WindowDidDeminiaturize: string;
          WindowDidEndSheet: string;
          WindowDidEnterFullScreen: string;
          WindowDidEnterVersionBrowser: string;
          WindowDidExitFullScreen: string;
          WindowDidExitVersionBrowser: string;
          WindowDidExpose: string;
          WindowDidFocus: string;
          WindowDidMiniaturize: string;
          WindowDidMove: string;
          WindowDidOrderOffScreen: string;
          WindowDidOrderOnScreen: string;
          WindowDidResignKey: string;
          WindowDidResignMain: string;
          WindowDidResize: string;
          WindowDidUpdate: string;
          WindowDidUpdateAlpha: string;
          WindowDidUpdateCollectionBehavior: string;
          WindowDidUpdateCollectionProperties: string;
          WindowDidUpdateShadow: string;
          WindowDidUpdateTitle: string;
          WindowDidUpdateToolbar: string;
          WindowDidZoom: string;
          WindowFileDraggingEntered: string;
          WindowFileDraggingExited: string;
          WindowFileDraggingPerformed: string;
          WindowHide: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowShouldClose: string;
          WindowShow: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowWillBecomeKey: string;
          WindowWillBecomeMain: string;
          WindowWillBeginSheet: string;
          WindowWillChangeOrderingMode: string;
          WindowWillClose: string;
          WindowWillDeminiaturize: string;
          WindowWillEnterFullScreen: string;
          WindowWillEnterVersionBrowser: string;
          WindowWillExitFullScreen: string;
          WindowWillExitVersionBrowser: string;
          WindowWillFocus: string;
          WindowWillMiniaturize: string;
          WindowWillMove: string;
          WindowWillOrderOffScreen: string;
          WindowWillOrderOnScreen: string;
          WindowWillResignMain: string;
          WindowWillResize: string;
          WindowWillUnfocus: string;
          WindowWillUpdate: string;
          WindowWillUpdateAlpha: string;
          WindowWillUpdateCollectionBehavior: string;
          WindowWillUpdateCollectionProperties: string;
          WindowWillUpdateShadow: string;
          WindowWillUpdateTitle: string;
          WindowWillUpdateToolbar: string;
          WindowWillUpdateVisibility: string;
          WindowWillUseStandardFrame: string;
          WindowZoomIn: string;
          WindowZoomOut: string;
          WindowZoomReset: string;
      }
      • ApplicationDidBecomeActive: string
      • ApplicationDidChangeBackingProperties: string
      • ApplicationDidChangeEffectiveAppearance: string
      • ApplicationDidChangeIcon: string
      • ApplicationDidChangeOcclusionState: string
      • ApplicationDidChangeScreenParameters: string
      • ApplicationDidChangeStatusBarFrame: string
      • ApplicationDidChangeStatusBarOrientation: string
      • ApplicationDidChangeTheme: string
      • ApplicationDidFinishLaunching: string
      • ApplicationDidHide: string
      • ApplicationDidResignActive: string
      • ApplicationDidUnhide: string
      • ApplicationDidUpdate: string
      • ApplicationShouldHandleReopen: string
      • ApplicationWillBecomeActive: string
      • ApplicationWillFinishLaunching: string
      • ApplicationWillHide: string
      • ApplicationWillResignActive: string
      • ApplicationWillTerminate: string
      • ApplicationWillUnhide: string
      • ApplicationWillUpdate: string
      • MenuDidAddItem: string
      • MenuDidBeginTracking: string
      • MenuDidClose: string
      • MenuDidDisplayItem: string
      • MenuDidEndTracking: string
      • MenuDidHighlightItem: string
      • MenuDidOpen: string
      • MenuDidPopUp: string
      • MenuDidRemoveItem: string
      • MenuDidSendAction: string
      • MenuDidSendActionToItem: string
      • MenuDidUpdate: string
      • MenuWillAddItem: string
      • MenuWillBeginTracking: string
      • MenuWillDisplayItem: string
      • MenuWillEndTracking: string
      • MenuWillHighlightItem: string
      • MenuWillOpen: string
      • MenuWillPopUp: string
      • MenuWillRemoveItem: string
      • MenuWillSendAction: string
      • MenuWillSendActionToItem: string
      • MenuWillUpdate: string
      • WebViewDidCommitNavigation: string
      • WebViewDidFinishNavigation: string
      • WebViewDidReceiveServerRedirectForProvisionalNavigation: string
      • WebViewDidStartProvisionalNavigation: string
      • WindowDidBecomeKey: string
      • WindowDidBecomeMain: string
      • WindowDidBeginSheet: string
      • WindowDidChangeAlpha: string
      • WindowDidChangeBackingLocation: string
      • WindowDidChangeBackingProperties: string
      • WindowDidChangeCollectionBehavior: string
      • WindowDidChangeEffectiveAppearance: string
      • WindowDidChangeOcclusionState: string
      • WindowDidChangeOrderingMode: string
      • WindowDidChangeScreen: string
      • WindowDidChangeScreenParameters: string
      • WindowDidChangeScreenProfile: string
      • WindowDidChangeScreenSpace: string
      • WindowDidChangeScreenSpaceProperties: string
      • WindowDidChangeSharingType: string
      • WindowDidChangeSpace: string
      • WindowDidChangeSpaceOrderingMode: string
      • WindowDidChangeTitle: string
      • WindowDidChangeToolbar: string
      • WindowDidDeminiaturize: string
      • WindowDidEndSheet: string
      • WindowDidEnterFullScreen: string
      • WindowDidEnterVersionBrowser: string
      • WindowDidExitFullScreen: string
      • WindowDidExitVersionBrowser: string
      • WindowDidExpose: string
      • WindowDidFocus: string
      • WindowDidMiniaturize: string
      • WindowDidMove: string
      • WindowDidOrderOffScreen: string
      • WindowDidOrderOnScreen: string
      • WindowDidResignKey: string
      • WindowDidResignMain: string
      • WindowDidResize: string
      • WindowDidUpdate: string
      • WindowDidUpdateAlpha: string
      • WindowDidUpdateCollectionBehavior: string
      • WindowDidUpdateCollectionProperties: string
      • WindowDidUpdateShadow: string
      • WindowDidUpdateTitle: string
      • WindowDidUpdateToolbar: string
      • WindowDidZoom: string
      • WindowFileDraggingEntered: string
      • WindowFileDraggingExited: string
      • WindowFileDraggingPerformed: string
      • WindowHide: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowShouldClose: string
      • WindowShow: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowWillBecomeKey: string
      • WindowWillBecomeMain: string
      • WindowWillBeginSheet: string
      • WindowWillChangeOrderingMode: string
      • WindowWillClose: string
      • WindowWillDeminiaturize: string
      • WindowWillEnterFullScreen: string
      • WindowWillEnterVersionBrowser: string
      • WindowWillExitFullScreen: string
      • WindowWillExitVersionBrowser: string
      • WindowWillFocus: string
      • WindowWillMiniaturize: string
      • WindowWillMove: string
      • WindowWillOrderOffScreen: string
      • WindowWillOrderOnScreen: string
      • WindowWillResignMain: string
      • WindowWillResize: string
      • WindowWillUnfocus: string
      • WindowWillUpdate: string
      • WindowWillUpdateAlpha: string
      • WindowWillUpdateCollectionBehavior: string
      • WindowWillUpdateCollectionProperties: string
      • WindowWillUpdateShadow: string
      • WindowWillUpdateTitle: string
      • WindowWillUpdateToolbar: string
      • WindowWillUpdateVisibility: string
      • WindowWillUseStandardFrame: string
      • WindowZoomIn: string
      • WindowZoomOut: string
      • WindowZoomReset: string
    • Windows: {
          APMPowerSettingChange: string;
          APMPowerStatusChange: string;
          APMResumeAutomatic: string;
          APMResumeSuspend: string;
          APMSuspend: string;
          ApplicationStarted: string;
          SystemThemeChanged: string;
          WebViewNavigationCompleted: string;
          WindowActive: string;
          WindowBackgroundErase: string;
          WindowClickActive: string;
          WindowClosing: string;
          WindowDPIChanged: string;
          WindowDidMove: string;
          WindowDidResize: string;
          WindowDragDrop: string;
          WindowDragEnter: string;
          WindowDragLeave: string;
          WindowDragOver: string;
          WindowEndMove: string;
          WindowEndResize: string;
          WindowFullscreen: string;
          WindowHide: string;
          WindowInactive: string;
          WindowKeyDown: string;
          WindowKeyUp: string;
          WindowKillFocus: string;
          WindowMaximise: string;
          WindowMinimise: string;
          WindowNonClientHit: string;
          WindowNonClientMouseDown: string;
          WindowNonClientMouseLeave: string;
          WindowNonClientMouseMove: string;
          WindowNonClientMouseUp: string;
          WindowPaint: string;
          WindowRestore: string;
          WindowSetFocus: string;
          WindowShow: string;
          WindowStartMove: string;
          WindowStartResize: string;
          WindowUnFullscreen: string;
          WindowUnMaximise: string;
          WindowUnMinimise: string;
          WindowZOrderChanged: string;
      }
      • APMPowerSettingChange: string
      • APMPowerStatusChange: string
      • APMResumeAutomatic: string
      • APMResumeSuspend: string
      • APMSuspend: string
      • ApplicationStarted: string
      • SystemThemeChanged: string
      • WebViewNavigationCompleted: string
      • WindowActive: string
      • WindowBackgroundErase: string
      • WindowClickActive: string
      • WindowClosing: string
      • WindowDPIChanged: string
      • WindowDidMove: string
      • WindowDidResize: string
      • WindowDragDrop: string
      • WindowDragEnter: string
      • WindowDragLeave: string
      • WindowDragOver: string
      • WindowEndMove: string
      • WindowEndResize: string
      • WindowFullscreen: string
      • WindowHide: string
      • WindowInactive: string
      • WindowKeyDown: string
      • WindowKeyUp: string
      • WindowKillFocus: string
      • WindowMaximise: string
      • WindowMinimise: string
      • WindowNonClientHit: string
      • WindowNonClientMouseDown: string
      • WindowNonClientMouseLeave: string
      • WindowNonClientMouseMove: string
      • WindowNonClientMouseUp: string
      • WindowPaint: string
      • WindowRestore: string
      • WindowSetFocus: string
      • WindowShow: string
      • WindowStartMove: string
      • WindowStartResize: string
      • WindowUnFullscreen: string
      • WindowUnMaximise: string
      • WindowUnMinimise: string
      • WindowZOrderChanged: string

    Generated using TypeDoc

    \ No newline at end of file +Types | @wailsio/runtime

    Variable TypesConst

    Types: Readonly<
        {
            Common: Readonly<
                {
                    ApplicationOpenedWithFile: "common:ApplicationOpenedWithFile";
                    ApplicationStarted: "common:ApplicationStarted";
                    ThemeChanged: "common:ThemeChanged";
                    WindowClosing: "common:WindowClosing";
                    WindowDidMove: "common:WindowDidMove";
                    WindowDidResize: "common:WindowDidResize";
                    WindowDPIChanged: "common:WindowDPIChanged";
                    WindowFilesDropped: "common:WindowFilesDropped";
                    WindowFocus: "common:WindowFocus";
                    WindowFullscreen: "common:WindowFullscreen";
                    WindowHide: "common:WindowHide";
                    WindowLostFocus: "common:WindowLostFocus";
                    WindowMaximise: "common:WindowMaximise";
                    WindowMinimise: "common:WindowMinimise";
                    WindowRestore: "common:WindowRestore";
                    WindowRuntimeReady: "common:WindowRuntimeReady";
                    WindowShow: "common:WindowShow";
                    WindowUnFullscreen: "common:WindowUnFullscreen";
                    WindowUnMaximise: "common:WindowUnMaximise";
                    WindowUnMinimise: "common:WindowUnMinimise";
                    WindowZoom: "common:WindowZoom";
                    WindowZoomIn: "common:WindowZoomIn";
                    WindowZoomOut: "common:WindowZoomOut";
                    WindowZoomReset: "common:WindowZoomReset";
                },
            >;
            Linux: Readonly<
                {
                    ApplicationStartup: "linux:ApplicationStartup";
                    SystemThemeChanged: "linux:SystemThemeChanged";
                    WindowDeleteEvent: "linux:WindowDeleteEvent";
                    WindowDidMove: "linux:WindowDidMove";
                    WindowDidResize: "linux:WindowDidResize";
                    WindowFocusIn: "linux:WindowFocusIn";
                    WindowFocusOut: "linux:WindowFocusOut";
                    WindowLoadChanged: "linux:WindowLoadChanged";
                },
            >;
            Mac: Readonly<
                {
                    ApplicationDidBecomeActive: "mac:ApplicationDidBecomeActive";
                    ApplicationDidChangeBackingProperties: "mac:ApplicationDidChangeBackingProperties";
                    ApplicationDidChangeEffectiveAppearance: "mac:ApplicationDidChangeEffectiveAppearance";
                    ApplicationDidChangeIcon: "mac:ApplicationDidChangeIcon";
                    ApplicationDidChangeOcclusionState: "mac:ApplicationDidChangeOcclusionState";
                    ApplicationDidChangeScreenParameters: "mac:ApplicationDidChangeScreenParameters";
                    ApplicationDidChangeStatusBarFrame: "mac:ApplicationDidChangeStatusBarFrame";
                    ApplicationDidChangeStatusBarOrientation: "mac:ApplicationDidChangeStatusBarOrientation";
                    ApplicationDidChangeTheme: "mac:ApplicationDidChangeTheme";
                    ApplicationDidFinishLaunching: "mac:ApplicationDidFinishLaunching";
                    ApplicationDidHide: "mac:ApplicationDidHide";
                    ApplicationDidResignActive: "mac:ApplicationDidResignActive";
                    ApplicationDidUnhide: "mac:ApplicationDidUnhide";
                    ApplicationDidUpdate: "mac:ApplicationDidUpdate";
                    ApplicationShouldHandleReopen: "mac:ApplicationShouldHandleReopen";
                    ApplicationWillBecomeActive: "mac:ApplicationWillBecomeActive";
                    ApplicationWillFinishLaunching: "mac:ApplicationWillFinishLaunching";
                    ApplicationWillHide: "mac:ApplicationWillHide";
                    ApplicationWillResignActive: "mac:ApplicationWillResignActive";
                    ApplicationWillTerminate: "mac:ApplicationWillTerminate";
                    ApplicationWillUnhide: "mac:ApplicationWillUnhide";
                    ApplicationWillUpdate: "mac:ApplicationWillUpdate";
                    MenuDidAddItem: "mac:MenuDidAddItem";
                    MenuDidBeginTracking: "mac:MenuDidBeginTracking";
                    MenuDidClose: "mac:MenuDidClose";
                    MenuDidDisplayItem: "mac:MenuDidDisplayItem";
                    MenuDidEndTracking: "mac:MenuDidEndTracking";
                    MenuDidHighlightItem: "mac:MenuDidHighlightItem";
                    MenuDidOpen: "mac:MenuDidOpen";
                    MenuDidPopUp: "mac:MenuDidPopUp";
                    MenuDidRemoveItem: "mac:MenuDidRemoveItem";
                    MenuDidSendAction: "mac:MenuDidSendAction";
                    MenuDidSendActionToItem: "mac:MenuDidSendActionToItem";
                    MenuDidUpdate: "mac:MenuDidUpdate";
                    MenuWillAddItem: "mac:MenuWillAddItem";
                    MenuWillBeginTracking: "mac:MenuWillBeginTracking";
                    MenuWillDisplayItem: "mac:MenuWillDisplayItem";
                    MenuWillEndTracking: "mac:MenuWillEndTracking";
                    MenuWillHighlightItem: "mac:MenuWillHighlightItem";
                    MenuWillOpen: "mac:MenuWillOpen";
                    MenuWillPopUp: "mac:MenuWillPopUp";
                    MenuWillRemoveItem: "mac:MenuWillRemoveItem";
                    MenuWillSendAction: "mac:MenuWillSendAction";
                    MenuWillSendActionToItem: "mac:MenuWillSendActionToItem";
                    MenuWillUpdate: "mac:MenuWillUpdate";
                    WebViewDidCommitNavigation: "mac:WebViewDidCommitNavigation";
                    WebViewDidFinishNavigation: "mac:WebViewDidFinishNavigation";
                    WebViewDidReceiveServerRedirectForProvisionalNavigation: "mac:WebViewDidReceiveServerRedirectForProvisionalNavigation";
                    WebViewDidStartProvisionalNavigation: "mac:WebViewDidStartProvisionalNavigation";
                    WindowDidBecomeKey: "mac:WindowDidBecomeKey";
                    WindowDidBecomeMain: "mac:WindowDidBecomeMain";
                    WindowDidBeginSheet: "mac:WindowDidBeginSheet";
                    WindowDidChangeAlpha: "mac:WindowDidChangeAlpha";
                    WindowDidChangeBackingLocation: "mac:WindowDidChangeBackingLocation";
                    WindowDidChangeBackingProperties: "mac:WindowDidChangeBackingProperties";
                    WindowDidChangeCollectionBehavior: "mac:WindowDidChangeCollectionBehavior";
                    WindowDidChangeEffectiveAppearance: "mac:WindowDidChangeEffectiveAppearance";
                    WindowDidChangeOcclusionState: "mac:WindowDidChangeOcclusionState";
                    WindowDidChangeOrderingMode: "mac:WindowDidChangeOrderingMode";
                    WindowDidChangeScreen: "mac:WindowDidChangeScreen";
                    WindowDidChangeScreenParameters: "mac:WindowDidChangeScreenParameters";
                    WindowDidChangeScreenProfile: "mac:WindowDidChangeScreenProfile";
                    WindowDidChangeScreenSpace: "mac:WindowDidChangeScreenSpace";
                    WindowDidChangeScreenSpaceProperties: "mac:WindowDidChangeScreenSpaceProperties";
                    WindowDidChangeSharingType: "mac:WindowDidChangeSharingType";
                    WindowDidChangeSpace: "mac:WindowDidChangeSpace";
                    WindowDidChangeSpaceOrderingMode: "mac:WindowDidChangeSpaceOrderingMode";
                    WindowDidChangeTitle: "mac:WindowDidChangeTitle";
                    WindowDidChangeToolbar: "mac:WindowDidChangeToolbar";
                    WindowDidDeminiaturize: "mac:WindowDidDeminiaturize";
                    WindowDidEndSheet: "mac:WindowDidEndSheet";
                    WindowDidEnterFullScreen: "mac:WindowDidEnterFullScreen";
                    WindowDidEnterVersionBrowser: "mac:WindowDidEnterVersionBrowser";
                    WindowDidExitFullScreen: "mac:WindowDidExitFullScreen";
                    WindowDidExitVersionBrowser: "mac:WindowDidExitVersionBrowser";
                    WindowDidExpose: "mac:WindowDidExpose";
                    WindowDidFocus: "mac:WindowDidFocus";
                    WindowDidMiniaturize: "mac:WindowDidMiniaturize";
                    WindowDidMove: "mac:WindowDidMove";
                    WindowDidOrderOffScreen: "mac:WindowDidOrderOffScreen";
                    WindowDidOrderOnScreen: "mac:WindowDidOrderOnScreen";
                    WindowDidResignKey: "mac:WindowDidResignKey";
                    WindowDidResignMain: "mac:WindowDidResignMain";
                    WindowDidResize: "mac:WindowDidResize";
                    WindowDidUpdate: "mac:WindowDidUpdate";
                    WindowDidUpdateAlpha: "mac:WindowDidUpdateAlpha";
                    WindowDidUpdateCollectionBehavior: "mac:WindowDidUpdateCollectionBehavior";
                    WindowDidUpdateCollectionProperties: "mac:WindowDidUpdateCollectionProperties";
                    WindowDidUpdateShadow: "mac:WindowDidUpdateShadow";
                    WindowDidUpdateTitle: "mac:WindowDidUpdateTitle";
                    WindowDidUpdateToolbar: "mac:WindowDidUpdateToolbar";
                    WindowDidZoom: "mac:WindowDidZoom";
                    WindowFileDraggingEntered: "mac:WindowFileDraggingEntered";
                    WindowFileDraggingExited: "mac:WindowFileDraggingExited";
                    WindowFileDraggingPerformed: "mac:WindowFileDraggingPerformed";
                    WindowHide: "mac:WindowHide";
                    WindowMaximise: "mac:WindowMaximise";
                    WindowMinimise: "mac:WindowMinimise";
                    WindowShouldClose: "mac:WindowShouldClose";
                    WindowShow: "mac:WindowShow";
                    WindowUnMaximise: "mac:WindowUnMaximise";
                    WindowUnMinimise: "mac:WindowUnMinimise";
                    WindowWillBecomeKey: "mac:WindowWillBecomeKey";
                    WindowWillBecomeMain: "mac:WindowWillBecomeMain";
                    WindowWillBeginSheet: "mac:WindowWillBeginSheet";
                    WindowWillChangeOrderingMode: "mac:WindowWillChangeOrderingMode";
                    WindowWillClose: "mac:WindowWillClose";
                    WindowWillDeminiaturize: "mac:WindowWillDeminiaturize";
                    WindowWillEnterFullScreen: "mac:WindowWillEnterFullScreen";
                    WindowWillEnterVersionBrowser: "mac:WindowWillEnterVersionBrowser";
                    WindowWillExitFullScreen: "mac:WindowWillExitFullScreen";
                    WindowWillExitVersionBrowser: "mac:WindowWillExitVersionBrowser";
                    WindowWillFocus: "mac:WindowWillFocus";
                    WindowWillMiniaturize: "mac:WindowWillMiniaturize";
                    WindowWillMove: "mac:WindowWillMove";
                    WindowWillOrderOffScreen: "mac:WindowWillOrderOffScreen";
                    WindowWillOrderOnScreen: "mac:WindowWillOrderOnScreen";
                    WindowWillResignMain: "mac:WindowWillResignMain";
                    WindowWillResize: "mac:WindowWillResize";
                    WindowWillUnfocus: "mac:WindowWillUnfocus";
                    WindowWillUpdate: "mac:WindowWillUpdate";
                    WindowWillUpdateAlpha: "mac:WindowWillUpdateAlpha";
                    WindowWillUpdateCollectionBehavior: "mac:WindowWillUpdateCollectionBehavior";
                    WindowWillUpdateCollectionProperties: "mac:WindowWillUpdateCollectionProperties";
                    WindowWillUpdateShadow: "mac:WindowWillUpdateShadow";
                    WindowWillUpdateTitle: "mac:WindowWillUpdateTitle";
                    WindowWillUpdateToolbar: "mac:WindowWillUpdateToolbar";
                    WindowWillUpdateVisibility: "mac:WindowWillUpdateVisibility";
                    WindowWillUseStandardFrame: "mac:WindowWillUseStandardFrame";
                    WindowZoomIn: "mac:WindowZoomIn";
                    WindowZoomOut: "mac:WindowZoomOut";
                    WindowZoomReset: "mac:WindowZoomReset";
                },
            >;
            Windows: Readonly<
                {
                    APMPowerSettingChange: "windows:APMPowerSettingChange";
                    APMPowerStatusChange: "windows:APMPowerStatusChange";
                    APMResumeAutomatic: "windows:APMResumeAutomatic";
                    APMResumeSuspend: "windows:APMResumeSuspend";
                    APMSuspend: "windows:APMSuspend";
                    ApplicationStarted: "windows:ApplicationStarted";
                    SystemThemeChanged: "windows:SystemThemeChanged";
                    WebViewNavigationCompleted: "windows:WebViewNavigationCompleted";
                    WindowActive: "windows:WindowActive";
                    WindowBackgroundErase: "windows:WindowBackgroundErase";
                    WindowClickActive: "windows:WindowClickActive";
                    WindowClosing: "windows:WindowClosing";
                    WindowDidMove: "windows:WindowDidMove";
                    WindowDidResize: "windows:WindowDidResize";
                    WindowDPIChanged: "windows:WindowDPIChanged";
                    WindowDragDrop: "windows:WindowDragDrop";
                    WindowDragEnter: "windows:WindowDragEnter";
                    WindowDragLeave: "windows:WindowDragLeave";
                    WindowDragOver: "windows:WindowDragOver";
                    WindowEndMove: "windows:WindowEndMove";
                    WindowEndResize: "windows:WindowEndResize";
                    WindowFullscreen: "windows:WindowFullscreen";
                    WindowHide: "windows:WindowHide";
                    WindowInactive: "windows:WindowInactive";
                    WindowKeyDown: "windows:WindowKeyDown";
                    WindowKeyUp: "windows:WindowKeyUp";
                    WindowKillFocus: "windows:WindowKillFocus";
                    WindowMaximise: "windows:WindowMaximise";
                    WindowMinimise: "windows:WindowMinimise";
                    WindowNonClientHit: "windows:WindowNonClientHit";
                    WindowNonClientMouseDown: "windows:WindowNonClientMouseDown";
                    WindowNonClientMouseLeave: "windows:WindowNonClientMouseLeave";
                    WindowNonClientMouseMove: "windows:WindowNonClientMouseMove";
                    WindowNonClientMouseUp: "windows:WindowNonClientMouseUp";
                    WindowPaint: "windows:WindowPaint";
                    WindowRestore: "windows:WindowRestore";
                    WindowSetFocus: "windows:WindowSetFocus";
                    WindowShow: "windows:WindowShow";
                    WindowStartMove: "windows:WindowStartMove";
                    WindowStartResize: "windows:WindowStartResize";
                    WindowUnFullscreen: "windows:WindowUnFullscreen";
                    WindowUnMaximise: "windows:WindowUnMaximise";
                    WindowUnMinimise: "windows:WindowUnMinimise";
                    WindowZOrderChanged: "windows:WindowZOrderChanged";
                },
            >;
        },
    > = ...
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Window.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Window.html index 37e94be24..8ac8b45fe 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Window.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Window.html @@ -1,2 +1,2 @@ -Window | @wailsio/runtime

    Variable WindowConst

    Window: Window = ...

    The window within which the script is running.

    -

    Generated using TypeDoc

    \ No newline at end of file +Window | @wailsio/runtime

    Variable WindowConst

    Window: Window = ...

    The window within which the script is running.

    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.Blob-1.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.Blob-1.html new file mode 100644 index 000000000..7a6dca0a7 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.Blob-1.html @@ -0,0 +1 @@ +Blob | @wailsio/runtime
    Blob: {
        prototype: Blob;
        new (blobParts?: BlobPart[], options?: BlobPropertyBag): Blob;
    }

    Type declaration

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.Event-1.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.Event-1.html new file mode 100644 index 000000000..10a91c579 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.Event-1.html @@ -0,0 +1 @@ +Event | @wailsio/runtime
    Event: {
        AT_TARGET: 2;
        BUBBLING_PHASE: 3;
        CAPTURING_PHASE: 1;
        NONE: 0;
        prototype: Event;
        new (type: string, eventInitDict?: EventInit): Event;
    }

    Type declaration

    • ReadonlyAT_TARGET: 2
    • ReadonlyBUBBLING_PHASE: 3
    • ReadonlyCAPTURING_PHASE: 1
    • ReadonlyNONE: 0
    • prototype: Event
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.EventTarget-1.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.EventTarget-1.html new file mode 100644 index 000000000..b260ea11e --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.EventTarget-1.html @@ -0,0 +1 @@ +EventTarget | @wailsio/runtime
    EventTarget: { prototype: EventTarget; new (): EventTarget }

    Type declaration

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.MediaSource-1.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.MediaSource-1.html new file mode 100644 index 000000000..ff20149ac --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.MediaSource-1.html @@ -0,0 +1,3 @@ +MediaSource | @wailsio/runtime
    MediaSource: {
        canConstructInDedicatedWorker: boolean;
        prototype: MediaSource;
        isTypeSupported(type: string): boolean;
        new (): MediaSource;
    }

    Type declaration

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.ReadableByteStreamController-1.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.ReadableByteStreamController-1.html new file mode 100644 index 000000000..03abf22d0 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.ReadableByteStreamController-1.html @@ -0,0 +1 @@ +ReadableByteStreamController | @wailsio/runtime

    Variable ReadableByteStreamController

    ReadableByteStreamController: {
        prototype: ReadableByteStreamController;
        new (): ReadableByteStreamController;
    }
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.ReadableStream-1.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.ReadableStream-1.html new file mode 100644 index 000000000..ff895225a --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.ReadableStream-1.html @@ -0,0 +1 @@ +ReadableStream | @wailsio/runtime
    ReadableStream: {
        prototype: ReadableStream;
        new (
            underlyingSource: UnderlyingByteSource,
            strategy?: { highWaterMark?: number },
        ): ReadableStream<Uint8Array<ArrayBufferLike>>;
        new <R = any>(
            underlyingSource: UnderlyingDefaultSource<R>,
            strategy?: QueuingStrategy<R>,
        ): ReadableStream<R>;
        new <R = any>(
            underlyingSource?: UnderlyingSource<R>,
            strategy?: QueuingStrategy<R>,
        ): ReadableStream<R>;
    }

    Type declaration

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.ReadableStreamBYOBReader-1.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.ReadableStreamBYOBReader-1.html new file mode 100644 index 000000000..97d078bc2 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.ReadableStreamBYOBReader-1.html @@ -0,0 +1 @@ +ReadableStreamBYOBReader | @wailsio/runtime
    ReadableStreamBYOBReader: {
        prototype: ReadableStreamBYOBReader;
        new (
            stream: ReadableStream<Uint8Array<ArrayBufferLike>>,
        ): ReadableStreamBYOBReader;
    }
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.ReadableStreamBYOBRequest-1.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.ReadableStreamBYOBRequest-1.html new file mode 100644 index 000000000..bcda606c6 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.ReadableStreamBYOBRequest-1.html @@ -0,0 +1 @@ +ReadableStreamBYOBRequest | @wailsio/runtime

    Variable ReadableStreamBYOBRequest

    ReadableStreamBYOBRequest: {
        prototype: ReadableStreamBYOBRequest;
        new (): ReadableStreamBYOBRequest;
    }
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.ReadableStreamDefaultController-1.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.ReadableStreamDefaultController-1.html new file mode 100644 index 000000000..b96ea63f8 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.ReadableStreamDefaultController-1.html @@ -0,0 +1 @@ +ReadableStreamDefaultController | @wailsio/runtime

    Variable ReadableStreamDefaultController

    ReadableStreamDefaultController: {
        prototype: ReadableStreamDefaultController;
        new (): ReadableStreamDefaultController;
    }
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.ReadableStreamDefaultReader-1.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.ReadableStreamDefaultReader-1.html new file mode 100644 index 000000000..a7d746f8d --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.ReadableStreamDefaultReader-1.html @@ -0,0 +1 @@ +ReadableStreamDefaultReader | @wailsio/runtime

    Variable ReadableStreamDefaultReader

    ReadableStreamDefaultReader: {
        prototype: ReadableStreamDefaultReader;
        new <R = any>(stream: ReadableStream<R>): ReadableStreamDefaultReader<R>;
    }

    Type declaration

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.SourceBuffer-1.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.SourceBuffer-1.html new file mode 100644 index 000000000..ca7e84af9 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.SourceBuffer-1.html @@ -0,0 +1 @@ +SourceBuffer | @wailsio/runtime
    SourceBuffer: { prototype: SourceBuffer; new (): SourceBuffer }

    Type declaration

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.TimeRanges-1.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.TimeRanges-1.html new file mode 100644 index 000000000..9d9e6fa1b --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.TimeRanges-1.html @@ -0,0 +1 @@ +TimeRanges | @wailsio/runtime
    TimeRanges: { prototype: TimeRanges; new (): TimeRanges }

    Type declaration

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.URL-1.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.URL-1.html new file mode 100644 index 000000000..a0f9adf7d --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.URL-1.html @@ -0,0 +1,5 @@ +URL | @wailsio/runtime
    URL: {
        prototype: URL;
        canParse(url: string | URL, base?: string | URL): boolean;
        createObjectURL(obj: Blob | MediaSource): string;
        parse(url: string | URL, base?: string | URL): null | URL;
        revokeObjectURL(url: string): void;
        new (url: string | URL, base?: string | URL): URL;
    }

    Type declaration

      • new (url: string | URL, base?: string | URL): URL
      • Parameters

        • url: string | URL
        • Optionalbase: string | URL

        Returns URL

    • prototype: URL
    • canParse:function
      • Parameters

        • url: string | URL
        • Optionalbase: string | URL

        Returns boolean

    • createObjectURL:function
    • parse:function
      • Parameters

        • url: string | URL
        • Optionalbase: string | URL

        Returns null | URL

    • revokeObjectURL:function
      • Parameters

        • url: string

        Returns void

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.WritableStream-1.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.WritableStream-1.html new file mode 100644 index 000000000..e31a06f97 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.WritableStream-1.html @@ -0,0 +1 @@ +WritableStream | @wailsio/runtime
    WritableStream: {
        prototype: WritableStream;
        new <W = any>(
            underlyingSink?: UnderlyingSink<W>,
            strategy?: QueuingStrategy<W>,
        ): WritableStream<W>;
    }

    Type declaration

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.WritableStreamDefaultController-1.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.WritableStreamDefaultController-1.html new file mode 100644 index 000000000..98ec3ec27 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.WritableStreamDefaultController-1.html @@ -0,0 +1 @@ +WritableStreamDefaultController | @wailsio/runtime

    Variable WritableStreamDefaultController

    WritableStreamDefaultController: {
        prototype: WritableStreamDefaultController;
        new (): WritableStreamDefaultController;
    }
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.WritableStreamDefaultWriter-1.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.WritableStreamDefaultWriter-1.html new file mode 100644 index 000000000..286db85ef --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/_internal_.WritableStreamDefaultWriter-1.html @@ -0,0 +1 @@ +WritableStreamDefaultWriter | @wailsio/runtime

    Variable WritableStreamDefaultWriter

    WritableStreamDefaultWriter: {
        prototype: WritableStreamDefaultWriter;
        new <W = any>(stream: WritableStream<W>): WritableStreamDefaultWriter<W>;
    }

    Type declaration

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/package-lock.json b/v3/internal/runtime/desktop/@wailsio/runtime/package-lock.json index b508f7dce..91cee4fe9 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/package-lock.json +++ b/v3/internal/runtime/desktop/@wailsio/runtime/package-lock.json @@ -1,12 +1,12 @@ { "name": "@wailsio/runtime", - "version": "3.0.0-alpha.65", + "version": "3.0.0-alpha.66", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@wailsio/runtime", - "version": "3.0.0-alpha.65", + "version": "3.0.0-alpha.66", "license": "MIT", "devDependencies": { "happy-dom": "^17.1.1", diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/package.json b/v3/internal/runtime/desktop/@wailsio/runtime/package.json index 915ddaf18..495abe27b 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/package.json +++ b/v3/internal/runtime/desktop/@wailsio/runtime/package.json @@ -1,7 +1,7 @@ { "name": "@wailsio/runtime", "type": "module", - "version": "3.0.0-alpha.65", + "version": "3.0.0-alpha.66", "description": "Wails Runtime", "types": "types/index.d.ts", "exports": { diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/types/application.d.ts b/v3/internal/runtime/desktop/@wailsio/runtime/types/application.d.ts index 5794550c0..bfab64a85 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/types/application.d.ts +++ b/v3/internal/runtime/desktop/@wailsio/runtime/types/application.d.ts @@ -1,19 +1,12 @@ /** * Hides a certain method by calling the HideMethod function. - * - * @return {Promise} - * */ -export function Hide(): Promise; +export declare function Hide(): Promise; /** * Calls the ShowMethod and returns the result. - * - * @return {Promise} */ -export function Show(): Promise; +export declare function Show(): Promise; /** * Calls the QuitMethod to terminate the program. - * - * @return {Promise} */ -export function Quit(): Promise; +export declare function Quit(): Promise; diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/types/browser.d.ts b/v3/internal/runtime/desktop/@wailsio/runtime/types/browser.d.ts index 95e0ba377..799a457fb 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/types/browser.d.ts +++ b/v3/internal/runtime/desktop/@wailsio/runtime/types/browser.d.ts @@ -1,6 +1,6 @@ /** - * Open a browser window to the given URL - * @param {string} url - The URL to open - * @returns {Promise} + * Open a browser window to the given URL. + * + * @param url - The URL to open */ -export function OpenURL(url: string): Promise; +export declare function OpenURL(url: string | URL): Promise; diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/types/callable.d.ts b/v3/internal/runtime/desktop/@wailsio/runtime/types/callable.d.ts new file mode 100644 index 000000000..54a1c6cf4 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/types/callable.d.ts @@ -0,0 +1,3 @@ +declare function isCallableRefApply(value: T | unknown): value is (...args: any[]) => any; +declare const _default: typeof isCallableRefApply; +export default _default; diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/types/calls.d.ts b/v3/internal/runtime/desktop/@wailsio/runtime/types/calls.d.ts index 1ef9a7dc0..a96fa8013 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/types/calls.d.ts +++ b/v3/internal/runtime/desktop/@wailsio/runtime/types/calls.d.ts @@ -1,3 +1,35 @@ +import { CancellablePromise } from "./cancellable.js"; +/** + * Holds all required information for a binding call. + * May provide either a method ID or a method name, but not both. + */ +export type CallOptions = { + /** The numeric ID of the bound method to call. */ + methodID: number; + /** The fully qualified name of the bound method to call. */ + methodName?: never; + /** Arguments to be passed into the bound method. */ + args: any[]; +} | { + /** The numeric ID of the bound method to call. */ + methodID?: never; + /** The fully qualified name of the bound method to call. */ + methodName: string; + /** Arguments to be passed into the bound method. */ + args: any[]; +}; +/** + * Exception class that will be thrown in case the bound method returns an error. + * The value of the {@link RuntimeError#name} property is "RuntimeError". + */ +export declare class RuntimeError extends Error { + /** + * Constructs a new RuntimeError instance. + * @param message - The error message. + * @param options - Options to be forwarded to the Error constructor. + */ + constructor(message?: string, options?: ErrorOptions); +} /** * Call a bound method according to the given call options. * @@ -7,63 +39,25 @@ * The exception might have a "cause" field with the value returned * by the application- or service-level error marshaling functions. * - * @param {CallOptions} options - A method call descriptor. - * @returns {Promise} - The result of the call. + * @param options - A method call descriptor. + * @returns The result of the call. */ -export function Call(options: CallOptions): Promise; +export declare function Call(options: CallOptions): CancellablePromise; /** * Calls a bound method by name with the specified arguments. * See {@link Call} for details. * - * @param {string} methodName - The name of the method in the format 'package.struct.method'. - * @param {any[]} args - The arguments to pass to the method. - * @returns {Promise} The result of the method call. + * @param methodName - The name of the method in the format 'package.struct.method'. + * @param args - The arguments to pass to the method. + * @returns The result of the method call. */ -export function ByName(methodName: string, ...args: any[]): Promise; +export declare function ByName(methodName: string, ...args: any[]): CancellablePromise; /** * Calls a method by its numeric ID with the specified arguments. * See {@link Call} for details. * - * @param {number} methodID - The ID of the method to call. - * @param {any[]} args - The arguments to pass to the method. - * @return {Promise} - The result of the method call. + * @param methodID - The ID of the method to call. + * @param args - The arguments to pass to the method. + * @return The result of the method call. */ -export function ByID(methodID: number, ...args: any[]): Promise; -/** - * Collects all required information for a binding call. - * - * @typedef {Object} CallOptions - * @property {number} [methodID] - The numeric ID of the bound method to call. - * @property {string} [methodName] - The fully qualified name of the bound method to call. - * @property {any[]} args - Arguments to be passed into the bound method. - */ -/** - * Exception class that will be thrown in case the bound method returns an error. - * The value of the {@link RuntimeError#name} property is "RuntimeError". - */ -export class RuntimeError extends Error { - /** - * Constructs a new RuntimeError instance. - * - * @param {string} message - The error message. - * @param {any[]} args - Optional arguments for the Error constructor. - */ - constructor(message: string, ...args: any[]); -} -/** - * Collects all required information for a binding call. - */ -export type CallOptions = { - /** - * - The numeric ID of the bound method to call. - */ - methodID?: number; - /** - * - The fully qualified name of the bound method to call. - */ - methodName?: string; - /** - * - Arguments to be passed into the bound method. - */ - args: any[]; -}; +export declare function ByID(methodID: number, ...args: any[]): CancellablePromise; diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/types/cancellable.d.ts b/v3/internal/runtime/desktop/@wailsio/runtime/types/cancellable.d.ts new file mode 100644 index 000000000..a65a2ba7e --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/types/cancellable.d.ts @@ -0,0 +1,434 @@ +/** + * Exception class that will be used as rejection reason + * in case a {@link CancellablePromise} is cancelled successfully. + * + * The value of the {@link name} property is the string `"CancelError"`. + * The value of the {@link cause} property is the cause passed to the cancel method, if any. + */ +export declare class CancelError extends Error { + /** + * Constructs a new `CancelError` instance. + * @param message - The error message. + * @param options - Options to be forwarded to the Error constructor. + */ + constructor(message?: string, options?: ErrorOptions); +} +/** + * Exception class that will be reported as an unhandled rejection + * in case a {@link CancellablePromise} rejects after being cancelled, + * or when the `oncancelled` callback throws or rejects. + * + * The value of the {@link name} property is the string `"CancelledRejectionError"`. + * The value of the {@link cause} property is the reason the promise rejected with. + * + * Because the original promise was cancelled, + * a wrapper promise will be passed to the unhandled rejection listener instead. + * The {@link promise} property holds a reference to the original promise. + */ +export declare class CancelledRejectionError extends Error { + /** + * Holds a reference to the promise that was cancelled and then rejected. + */ + promise: CancellablePromise; + /** + * Constructs a new `CancelledRejectionError` instance. + * @param promise - The promise that caused the error originally. + * @param reason - The rejection reason. + * @param info - An optional informative message specifying the circumstances in which the error was thrown. + * Defaults to the string `"Unhandled rejection in cancelled promise."`. + */ + constructor(promise: CancellablePromise, reason?: any, info?: string); +} +type CancellablePromiseResolver = (value: T | PromiseLike | CancellablePromiseLike) => void; +type CancellablePromiseRejector = (reason?: any) => void; +type CancellablePromiseCanceller = (cause?: any) => void | PromiseLike; +type CancellablePromiseExecutor = (resolve: CancellablePromiseResolver, reject: CancellablePromiseRejector) => void; +export interface CancellablePromiseLike { + then(onfulfilled?: ((value: T) => TResult1 | PromiseLike | CancellablePromiseLike) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike | CancellablePromiseLike) | undefined | null): CancellablePromiseLike; + cancel(cause?: any): void | PromiseLike; +} +/** + * Wraps a cancellable promise along with its resolution methods. + * The `oncancelled` field will be null initially but may be set to provide a custom cancellation function. + */ +export interface CancellablePromiseWithResolvers { + promise: CancellablePromise; + resolve: CancellablePromiseResolver; + reject: CancellablePromiseRejector; + oncancelled: CancellablePromiseCanceller | null; +} +/** + * A promise with an attached method for cancelling long-running operations (see {@link CancellablePromise#cancel}). + * Cancellation can optionally be bound to an {@link AbortSignal} + * for better composability (see {@link CancellablePromise#cancelOn}). + * + * Cancelling a pending promise will result in an immediate rejection + * with an instance of {@link CancelError} as reason, + * but whoever started the promise will be responsible + * for actually aborting the underlying operation. + * To this purpose, the constructor and all chaining methods + * accept optional cancellation callbacks. + * + * If a `CancellablePromise` still resolves after having been cancelled, + * the result will be discarded. If it rejects, the reason + * will be reported as an unhandled rejection, + * wrapped in a {@link CancelledRejectionError} instance. + * To facilitate the handling of cancellation requests, + * cancelled `CancellablePromise`s will _not_ report unhandled `CancelError`s + * whose `cause` field is the same as the one with which the current promise was cancelled. + * + * All usual promise methods are defined and return a `CancellablePromise` + * whose cancel method will cancel the parent operation as well, propagating the cancellation reason + * upwards through promise chains. + * Conversely, cancelling a promise will not automatically cancel dependent promises downstream: + * ```ts + * let root = new CancellablePromise((resolve, reject) => { ... }); + * let child1 = root.then(() => { ... }); + * let child2 = child1.then(() => { ... }); + * let child3 = root.catch(() => { ... }); + * child1.cancel(); // Cancels child1 and root, but not child2 or child3 + * ``` + * Cancelling a promise that has already settled is safe and has no consequence. + * + * The `cancel` method returns a promise that _always fulfills_ + * after the whole chain has processed the cancel request + * and all attached callbacks up to that moment have run. + * + * All ES2024 promise methods (static and instance) are defined on CancellablePromise, + * but actual availability may vary with OS/webview version. + * + * In line with the proposal at https://github.com/tc39/proposal-rm-builtin-subclassing, + * `CancellablePromise` does not support transparent subclassing. + * Extenders should take care to provide their own method implementations. + * This might be reconsidered in case the proposal is retired. + * + * CancellablePromise is a wrapper around the DOM Promise object + * and is compliant with the [Promises/A+ specification](https://promisesaplus.com/) + * (it passes the [compliance suite](https://github.com/promises-aplus/promises-tests)) + * if so is the underlying implementation. + */ +export declare class CancellablePromise extends Promise implements PromiseLike, CancellablePromiseLike { + static [x: symbol]: PromiseConstructor; + /** + * Creates a new `CancellablePromise`. + * + * @param executor - A callback used to initialize the promise. This callback is passed two arguments: + * a `resolve` callback used to resolve the promise with a value + * or the result of another promise (possibly cancellable), + * and a `reject` callback used to reject the promise with a provided reason or error. + * If the value provided to the `resolve` callback is a thenable _and_ cancellable object + * (it has a `then` _and_ a `cancel` method), + * cancellation requests will be forwarded to that object and the oncancelled will not be invoked anymore. + * If any one of the two callbacks is called _after_ the promise has been cancelled, + * the provided values will be cancelled and resolved as usual, + * but their results will be discarded. + * However, if the resolution process ultimately ends up in a rejection + * that is not due to cancellation, the rejection reason + * will be wrapped in a {@link CancelledRejectionError} + * and bubbled up as an unhandled rejection. + * @param oncancelled - It is the caller's responsibility to ensure that any operation + * started by the executor is properly halted upon cancellation. + * This optional callback can be used to that purpose. + * It will be called _synchronously_ with a cancellation cause + * when cancellation is requested, _after_ the promise has already rejected + * with a {@link CancelError}, but _before_ + * any {@link then}/{@link catch}/{@link finally} callback runs. + * If the callback returns a thenable, the promise returned from {@link cancel} + * will only fulfill after the former has settled. + * Unhandled exceptions or rejections from the callback will be wrapped + * in a {@link CancelledRejectionError} and bubbled up as unhandled rejections. + * If the `resolve` callback is called before cancellation with a cancellable promise, + * cancellation requests on this promise will be diverted to that promise, + * and the original `oncancelled` callback will be discarded. + */ + constructor(executor: CancellablePromiseExecutor, oncancelled?: CancellablePromiseCanceller); + /** + * Cancels immediately the execution of the operation associated with this promise. + * The promise rejects with a {@link CancelError} instance as reason, + * with the {@link CancelError#cause} property set to the given argument, if any. + * + * Has no effect if called after the promise has already settled; + * repeated calls in particular are safe, but only the first one + * will set the cancellation cause. + * + * The `CancelError` exception _need not_ be handled explicitly _on the promises that are being cancelled:_ + * cancelling a promise with no attached rejection handler does not trigger an unhandled rejection event. + * Therefore, the following idioms are all equally correct: + * ```ts + * new CancellablePromise((resolve, reject) => { ... }).cancel(); + * new CancellablePromise((resolve, reject) => { ... }).then(...).cancel(); + * new CancellablePromise((resolve, reject) => { ... }).then(...).catch(...).cancel(); + * ``` + * Whenever some cancelled promise in a chain rejects with a `CancelError` + * with the same cancellation cause as itself, the error will be discarded silently. + * However, the `CancelError` _will still be delivered_ to all attached rejection handlers + * added by {@link then} and related methods: + * ```ts + * let cancellable = new CancellablePromise((resolve, reject) => { ... }); + * cancellable.then(() => { ... }).catch(console.log); + * cancellable.cancel(); // A CancelError is printed to the console. + * ``` + * If the `CancelError` is not handled downstream by the time it reaches + * a _non-cancelled_ promise, it _will_ trigger an unhandled rejection event, + * just like normal rejections would: + * ```ts + * let cancellable = new CancellablePromise((resolve, reject) => { ... }); + * let chained = cancellable.then(() => { ... }).then(() => { ... }); // No catch... + * cancellable.cancel(); // Unhandled rejection event on chained! + * ``` + * Therefore, it is important to either cancel whole promise chains from their tail, + * as shown in the correct idioms above, or take care of handling errors everywhere. + * + * @returns A cancellable promise that _fulfills_ after the cancel callback (if any) + * and all handlers attached up to the call to cancel have run. + * If the cancel callback returns a thenable, the promise returned by `cancel` + * will also wait for that thenable to settle. + * This enables callers to wait for the cancelled operation to terminate + * without being forced to handle potential errors at the call site. + * ```ts + * cancellable.cancel().then(() => { + * // Cleanup finished, it's safe to do something else. + * }, (err) => { + * // Unreachable: the promise returned from cancel will never reject. + * }); + * ``` + * Note that the returned promise will _not_ handle implicitly any rejection + * that might have occurred already in the cancelled chain. + * It will just track whether registered handlers have been executed or not. + * Therefore, unhandled rejections will never be silently handled by calling cancel. + */ + cancel(cause?: any): CancellablePromise; + /** + * Binds promise cancellation to the abort event of the given {@link AbortSignal}. + * If the signal has already aborted, the promise will be cancelled immediately. + * When either condition is verified, the cancellation cause will be set + * to the signal's abort reason (see {@link AbortSignal#reason}). + * + * Has no effect if called (or if the signal aborts) _after_ the promise has already settled. + * Only the first signal to abort will set the cancellation cause. + * + * For more details about the cancellation process, + * see {@link cancel} and the `CancellablePromise` constructor. + * + * This method enables `await`ing cancellable promises without having + * to store them for future cancellation, e.g.: + * ```ts + * await longRunningOperation().cancelOn(signal); + * ``` + * instead of: + * ```ts + * let promiseToBeCancelled = longRunningOperation(); + * await promiseToBeCancelled; + * ``` + * + * @returns This promise, for method chaining. + */ + cancelOn(signal: AbortSignal): CancellablePromise; + /** + * Attaches callbacks for the resolution and/or rejection of the `CancellablePromise`. + * + * The optional `oncancelled` argument will be invoked when the returned promise is cancelled, + * with the same semantics as the `oncancelled` argument of the constructor. + * When the parent promise rejects or is cancelled, the `onrejected` callback will run, + * _even after the returned promise has been cancelled:_ + * in that case, should it reject or throw, the reason will be wrapped + * in a {@link CancelledRejectionError} and bubbled up as an unhandled rejection. + * + * @param onfulfilled The callback to execute when the Promise is resolved. + * @param onrejected The callback to execute when the Promise is rejected. + * @returns A `CancellablePromise` for the completion of whichever callback is executed. + * The returned promise is hooked up to propagate cancellation requests up the chain, but not down: + * + * - if the parent promise is cancelled, the `onrejected` handler will be invoked with a `CancelError` + * and the returned promise _will resolve regularly_ with its result; + * - conversely, if the returned promise is cancelled, _the parent promise is cancelled too;_ + * the `onrejected` handler will still be invoked with the parent's `CancelError`, + * but its result will be discarded + * and the returned promise will reject with a `CancelError` as well. + * + * The promise returned from {@link cancel} will fulfill only after all attached handlers + * up the entire promise chain have been run. + * + * If either callback returns a cancellable promise, + * cancellation requests will be diverted to it, + * and the specified `oncancelled` callback will be discarded. + */ + then(onfulfilled?: ((value: T) => TResult1 | PromiseLike | CancellablePromiseLike) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike | CancellablePromiseLike) | undefined | null, oncancelled?: CancellablePromiseCanceller): CancellablePromise; + /** + * Attaches a callback for only the rejection of the Promise. + * + * The optional `oncancelled` argument will be invoked when the returned promise is cancelled, + * with the same semantics as the `oncancelled` argument of the constructor. + * When the parent promise rejects or is cancelled, the `onrejected` callback will run, + * _even after the returned promise has been cancelled:_ + * in that case, should it reject or throw, the reason will be wrapped + * in a {@link CancelledRejectionError} and bubbled up as an unhandled rejection. + * + * It is equivalent to + * ```ts + * cancellablePromise.then(undefined, onrejected, oncancelled); + * ``` + * and the same caveats apply. + * + * @returns A Promise for the completion of the callback. + * Cancellation requests on the returned promise + * will propagate up the chain to the parent promise, + * but not in the other direction. + * + * The promise returned from {@link cancel} will fulfill only after all attached handlers + * up the entire promise chain have been run. + * + * If `onrejected` returns a cancellable promise, + * cancellation requests will be diverted to it, + * and the specified `oncancelled` callback will be discarded. + * See {@link then} for more details. + */ + catch(onrejected?: ((reason: any) => (PromiseLike | TResult)) | undefined | null, oncancelled?: CancellablePromiseCanceller): CancellablePromise; + /** + * Attaches a callback that is invoked when the CancellablePromise is settled (fulfilled or rejected). The + * resolved value cannot be accessed or modified from the callback. + * The returned promise will settle in the same state as the original one + * after the provided callback has completed execution, + * unless the callback throws or returns a rejecting promise, + * in which case the returned promise will reject as well. + * + * The optional `oncancelled` argument will be invoked when the returned promise is cancelled, + * with the same semantics as the `oncancelled` argument of the constructor. + * Once the parent promise settles, the `onfinally` callback will run, + * _even after the returned promise has been cancelled:_ + * in that case, should it reject or throw, the reason will be wrapped + * in a {@link CancelledRejectionError} and bubbled up as an unhandled rejection. + * + * This method is implemented in terms of {@link then} and the same caveats apply. + * It is polyfilled, hence available in every OS/webview version. + * + * @returns A Promise for the completion of the callback. + * Cancellation requests on the returned promise + * will propagate up the chain to the parent promise, + * but not in the other direction. + * + * The promise returned from {@link cancel} will fulfill only after all attached handlers + * up the entire promise chain have been run. + * + * If `onfinally` returns a cancellable promise, + * cancellation requests will be diverted to it, + * and the specified `oncancelled` callback will be discarded. + * See {@link then} for more details. + */ + finally(onfinally?: (() => void) | undefined | null, oncancelled?: CancellablePromiseCanceller): CancellablePromise; + /** + * Creates a CancellablePromise that is resolved with an array of results + * when all of the provided Promises resolve, or rejected when any Promise is rejected. + * + * Every one of the provided objects that is a thenable _and_ cancellable object + * will be cancelled when the returned promise is cancelled, with the same cause. + * + * @group Static Methods + */ + static all(values: Iterable>): CancellablePromise[]>; + static all(values: T): CancellablePromise<{ + -readonly [P in keyof T]: Awaited; + }>; + /** + * Creates a CancellablePromise that is resolved with an array of results + * when all of the provided Promises resolve or reject. + * + * Every one of the provided objects that is a thenable _and_ cancellable object + * will be cancelled when the returned promise is cancelled, with the same cause. + * + * @group Static Methods + */ + static allSettled(values: Iterable>): CancellablePromise>[]>; + static allSettled(values: T): CancellablePromise<{ + -readonly [P in keyof T]: PromiseSettledResult>; + }>; + /** + * The any function returns a promise that is fulfilled by the first given promise to be fulfilled, + * or rejected with an AggregateError containing an array of rejection reasons + * if all of the given promises are rejected. + * It resolves all elements of the passed iterable to promises as it runs this algorithm. + * + * Every one of the provided objects that is a thenable _and_ cancellable object + * will be cancelled when the returned promise is cancelled, with the same cause. + * + * @group Static Methods + */ + static any(values: Iterable>): CancellablePromise>; + static any(values: T): CancellablePromise>; + /** + * Creates a Promise that is resolved or rejected when any of the provided Promises are resolved or rejected. + * + * Every one of the provided objects that is a thenable _and_ cancellable object + * will be cancelled when the returned promise is cancelled, with the same cause. + * + * @group Static Methods + */ + static race(values: Iterable>): CancellablePromise>; + static race(values: T): CancellablePromise>; + /** + * Creates a new cancelled CancellablePromise for the provided cause. + * + * @group Static Methods + */ + static cancel(cause?: any): CancellablePromise; + /** + * Creates a new CancellablePromise that cancels + * after the specified timeout, with the provided cause. + * + * If the {@link AbortSignal.timeout} factory method is available, + * it is used to base the timeout on _active_ time rather than _elapsed_ time. + * Otherwise, `timeout` falls back to {@link setTimeout}. + * + * @group Static Methods + */ + static timeout(milliseconds: number, cause?: any): CancellablePromise; + /** + * Creates a new CancellablePromise that resolves after the specified timeout. + * The returned promise can be cancelled without consequences. + * + * @group Static Methods + */ + static sleep(milliseconds: number): CancellablePromise; + /** + * Creates a new CancellablePromise that resolves after + * the specified timeout, with the provided value. + * The returned promise can be cancelled without consequences. + * + * @group Static Methods + */ + static sleep(milliseconds: number, value: T): CancellablePromise; + /** + * Creates a new rejected CancellablePromise for the provided reason. + * + * @group Static Methods + */ + static reject(reason?: any): CancellablePromise; + /** + * Creates a new resolved CancellablePromise. + * + * @group Static Methods + */ + static resolve(): CancellablePromise; + /** + * Creates a new resolved CancellablePromise for the provided value. + * + * @group Static Methods + */ + static resolve(value: T): CancellablePromise>; + /** + * Creates a new resolved CancellablePromise for the provided value. + * + * @group Static Methods + */ + static resolve(value: T | PromiseLike): CancellablePromise>; + /** + * Creates a new CancellablePromise and returns it in an object, along with its resolve and reject functions + * and a getter/setter for the cancellation callback. + * + * This method is polyfilled, hence available in every OS/webview version. + * + * @group Static Methods + */ + static withResolvers(): CancellablePromiseWithResolvers; +} +export {}; diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/types/clipboard.d.ts b/v3/internal/runtime/desktop/@wailsio/runtime/types/clipboard.d.ts index 8f7bfabc1..4d0363428 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/types/clipboard.d.ts +++ b/v3/internal/runtime/desktop/@wailsio/runtime/types/clipboard.d.ts @@ -1,12 +1,13 @@ /** * Sets the text to the Clipboard. * - * @param {string} text - The text to be set to the Clipboard. - * @return {Promise} - A Promise that resolves when the operation is successful. + * @param text - The text to be set to the Clipboard. + * @return A Promise that resolves when the operation is successful. */ -export function SetText(text: string): Promise; +export declare function SetText(text: string): Promise; /** * Get the Clipboard text - * @returns {Promise} A promise that resolves with the text from the Clipboard. + * + * @returns A promise that resolves with the text from the Clipboard. */ -export function Text(): Promise; +export declare function Text(): Promise; diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/types/create.d.ts b/v3/internal/runtime/desktop/@wailsio/runtime/types/create.d.ts index 10c505ff8..a3332a4fd 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/types/create.d.ts +++ b/v3/internal/runtime/desktop/@wailsio/runtime/types/create.d.ts @@ -1,52 +1,31 @@ /** * Any is a dummy creation function for simple or unknown types. - * @template T - * @param {any} source - * @returns {T} */ -export function Any(source: any): T; +export declare function Any(source: any): T; /** * ByteSlice is a creation function that replaces * null strings with empty strings. - * @param {any} source - * @returns {string} */ -export function ByteSlice(source: any): string; +export declare function ByteSlice(source: any): string; /** * Array takes a creation function for an arbitrary type * and returns an in-place creation function for an array * whose elements are of that type. - * @template T - * @param {(source: any) => T} element - * @returns {(source: any) => T[]} */ -export function Array(element: (source: any) => T): (source: any) => T[]; +export declare function Array(element: (source: any) => T): (source: any) => T[]; /** * Map takes creation functions for two arbitrary types * and returns an in-place creation function for an object * whose keys and values are of those types. - * @template K, V - * @param {(source: any) => K} key - * @param {(source: any) => V} value - * @returns {(source: any) => { [_: K]: V }} */ -export function Map(key: (source: any) => K, value: (source: any) => V): (source: any) => {}; +export declare function Map(key: (source: any) => string, value: (source: any) => V): (source: any) => Record; /** * Nullable takes a creation function for an arbitrary type * and returns a creation function for a nullable value of that type. - * @template T - * @param {(source: any) => T} element - * @returns {(source: any) => (T | null)} */ -export function Nullable(element: (source: any) => T): (source: any) => T; +export declare function Nullable(element: (source: any) => T): (source: any) => (T | null); /** * Struct takes an object mapping field names to creation functions * and returns an in-place creation function for a struct. - * @template {{ [_: string]: ((source: any) => any) }} T - * @template {{ [Key in keyof T]?: ReturnType }} U - * @param {T} createField - * @returns {(source: any) => U} */ -export function Struct any; -}, U extends { [Key in keyof T]?: ReturnType; }>(createField: T): (source: any) => U; +export declare function Struct(createField: Record any>): = any>(source: any) => U; diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/types/dialogs.d.ts b/v3/internal/runtime/desktop/@wailsio/runtime/types/dialogs.d.ts index 1a90bb0ec..223d43eae 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/types/dialogs.d.ts +++ b/v3/internal/runtime/desktop/@wailsio/runtime/types/dialogs.d.ts @@ -1,184 +1,140 @@ -export function Info(options: MessageDialogOptions): Promise; -export function Warning(options: MessageDialogOptions): Promise; -export function Error(options: MessageDialogOptions): Promise; -export function Question(options: MessageDialogOptions): Promise; -export function OpenFile(options: OpenFileDialogOptions): Promise; -export function SaveFile(options: SaveFileDialogOptions): Promise; -export type OpenFileDialogOptions = { - /** - * - Indicates if directories can be chosen. - */ +export interface OpenFileDialogOptions { + /** Indicates if directories can be chosen. */ CanChooseDirectories?: boolean; - /** - * - Indicates if files can be chosen. - */ + /** Indicates if files can be chosen. */ CanChooseFiles?: boolean; - /** - * - Indicates if directories can be created. - */ + /** Indicates if directories can be created. */ CanCreateDirectories?: boolean; - /** - * - Indicates if hidden files should be shown. - */ + /** Indicates if hidden files should be shown. */ ShowHiddenFiles?: boolean; - /** - * - Indicates if aliases should be resolved. - */ + /** Indicates if aliases should be resolved. */ ResolvesAliases?: boolean; - /** - * - Indicates if multiple selection is allowed. - */ + /** Indicates if multiple selection is allowed. */ AllowsMultipleSelection?: boolean; - /** - * - Indicates if the extension should be hidden. - */ + /** Indicates if the extension should be hidden. */ HideExtension?: boolean; - /** - * - Indicates if hidden extensions can be selected. - */ + /** Indicates if hidden extensions can be selected. */ CanSelectHiddenExtension?: boolean; - /** - * - Indicates if file packages should be treated as directories. - */ + /** Indicates if file packages should be treated as directories. */ TreatsFilePackagesAsDirectories?: boolean; - /** - * - Indicates if other file types are allowed. - */ + /** Indicates if other file types are allowed. */ AllowsOtherFiletypes?: boolean; - /** - * - Array of file filters. - */ + /** Array of file filters. */ Filters?: FileFilter[]; - /** - * - Title of the dialog. - */ + /** Title of the dialog. */ Title?: string; - /** - * - Message to show in the dialog. - */ + /** Message to show in the dialog. */ Message?: string; - /** - * - Text to display on the button. - */ + /** Text to display on the button. */ ButtonText?: string; - /** - * - Directory to open in the dialog. - */ + /** Directory to open in the dialog. */ Directory?: string; - /** - * - Indicates if the dialog should appear detached from the main window. - */ + /** Indicates if the dialog should appear detached from the main window. */ Detached?: boolean; -}; -export type SaveFileDialogOptions = { - /** - * - Default filename to use in the dialog. - */ +} +export interface SaveFileDialogOptions { + /** Default filename to use in the dialog. */ Filename?: string; - /** - * - Indicates if directories can be chosen. - */ + /** Indicates if directories can be chosen. */ CanChooseDirectories?: boolean; - /** - * - Indicates if files can be chosen. - */ + /** Indicates if files can be chosen. */ CanChooseFiles?: boolean; - /** - * - Indicates if directories can be created. - */ + /** Indicates if directories can be created. */ CanCreateDirectories?: boolean; - /** - * - Indicates if hidden files should be shown. - */ + /** Indicates if hidden files should be shown. */ ShowHiddenFiles?: boolean; - /** - * - Indicates if aliases should be resolved. - */ + /** Indicates if aliases should be resolved. */ ResolvesAliases?: boolean; - /** - * - Indicates if multiple selection is allowed. - */ - AllowsMultipleSelection?: boolean; - /** - * - Indicates if the extension should be hidden. - */ + /** Indicates if the extension should be hidden. */ HideExtension?: boolean; - /** - * - Indicates if hidden extensions can be selected. - */ + /** Indicates if hidden extensions can be selected. */ CanSelectHiddenExtension?: boolean; - /** - * - Indicates if file packages should be treated as directories. - */ + /** Indicates if file packages should be treated as directories. */ TreatsFilePackagesAsDirectories?: boolean; - /** - * - Indicates if other file types are allowed. - */ + /** Indicates if other file types are allowed. */ AllowsOtherFiletypes?: boolean; - /** - * - Array of file filters. - */ + /** Array of file filters. */ Filters?: FileFilter[]; - /** - * - Title of the dialog. - */ + /** Title of the dialog. */ Title?: string; - /** - * - Message to show in the dialog. - */ + /** Message to show in the dialog. */ Message?: string; - /** - * - Text to display on the button. - */ + /** Text to display on the button. */ ButtonText?: string; - /** - * - Directory to open in the dialog. - */ + /** Directory to open in the dialog. */ Directory?: string; - /** - * - Indicates if the dialog should appear detached from the main window. - */ + /** Indicates if the dialog should appear detached from the main window. */ Detached?: boolean; -}; -export type MessageDialogOptions = { - /** - * - The title of the dialog window. - */ +} +export interface MessageDialogOptions { + /** The title of the dialog window. */ Title?: string; - /** - * - The main message to show in the dialog. - */ + /** The main message to show in the dialog. */ Message?: string; - /** - * - Array of button options to show in the dialog. - */ + /** Array of button options to show in the dialog. */ Buttons?: Button[]; - /** - * - True if the dialog should appear detached from the main window (if applicable). - */ + /** True if the dialog should appear detached from the main window (if applicable). */ Detached?: boolean; -}; -export type Button = { - /** - * - Text that appears within the button. - */ +} +export interface Button { + /** Text that appears within the button. */ Label?: string; - /** - * - True if the button should cancel an operation when clicked. - */ + /** True if the button should cancel an operation when clicked. */ IsCancel?: boolean; - /** - * - True if the button should be the default action when the user presses enter. - */ + /** True if the button should be the default action when the user presses enter. */ IsDefault?: boolean; -}; -export type FileFilter = { - /** - * - Display name for the filter, it could be "Text Files", "Images" etc. - */ +} +export interface FileFilter { + /** Display name for the filter, it could be "Text Files", "Images" etc. */ DisplayName?: string; - /** - * - Pattern to match for the filter, e.g. "*.txt;*.md" for text markdown files. - */ + /** Pattern to match for the filter, e.g. "*.txt;*.md" for text markdown files. */ Pattern?: string; -}; +} +/** + * Presents an info dialog. + * + * @param options - Dialog options + * @returns A promise that resolves with the label of the chosen button. + */ +export declare function Info(options: MessageDialogOptions): Promise; +/** + * Presents a warning dialog. + * + * @param options - Dialog options. + * @returns A promise that resolves with the label of the chosen button. + */ +export declare function Warning(options: MessageDialogOptions): Promise; +/** + * Presents an error dialog. + * + * @param options - Dialog options. + * @returns A promise that resolves with the label of the chosen button. + */ +export declare function Error(options: MessageDialogOptions): Promise; +/** + * Presents a question dialog. + * + * @param options - Dialog options. + * @returns A promise that resolves with the label of the chosen button. + */ +export declare function Question(options: MessageDialogOptions): Promise; +/** + * Presents a file selection dialog to pick one or more files to open. + * + * @param options - Dialog options. + * @returns Selected file or list of files, or a blank string/empty list if no file has been selected. + */ +export declare function OpenFile(options: OpenFileDialogOptions & { + AllowsMultipleSelection: true; +}): Promise; +export declare function OpenFile(options: OpenFileDialogOptions & { + AllowsMultipleSelection?: false | undefined; +}): Promise; +export declare function OpenFile(options: OpenFileDialogOptions): Promise; +/** + * Presents a file selection dialog to pick a file to save. + * + * @param options - Dialog options. + * @returns Selected file, or a blank string if no file has been selected. + */ +export declare function SaveFile(options: SaveFileDialogOptions): Promise; diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/types/event_types.d.ts b/v3/internal/runtime/desktop/@wailsio/runtime/types/event_types.d.ts index e8742de59..382c32436 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/types/event_types.d.ts +++ b/v3/internal/runtime/desktop/@wailsio/runtime/types/event_types.d.ts @@ -1,219 +1,218 @@ - -export declare const EventTypes: { - Windows: { - APMPowerSettingChange: string, - APMPowerStatusChange: string, - APMResumeAutomatic: string, - APMResumeSuspend: string, - APMSuspend: string, - ApplicationStarted: string, - SystemThemeChanged: string, - WebViewNavigationCompleted: string, - WindowActive: string, - WindowBackgroundErase: string, - WindowClickActive: string, - WindowClosing: string, - WindowDidMove: string, - WindowDidResize: string, - WindowDPIChanged: string, - WindowDragDrop: string, - WindowDragEnter: string, - WindowDragLeave: string, - WindowDragOver: string, - WindowEndMove: string, - WindowEndResize: string, - WindowFullscreen: string, - WindowHide: string, - WindowInactive: string, - WindowKeyDown: string, - WindowKeyUp: string, - WindowKillFocus: string, - WindowNonClientHit: string, - WindowNonClientMouseDown: string, - WindowNonClientMouseLeave: string, - WindowNonClientMouseMove: string, - WindowNonClientMouseUp: string, - WindowPaint: string, - WindowRestore: string, - WindowSetFocus: string, - WindowShow: string, - WindowStartMove: string, - WindowStartResize: string, - WindowUnFullscreen: string, - WindowZOrderChanged: string, - WindowMinimise: string, - WindowUnMinimise: string, - WindowMaximise: string, - WindowUnMaximise: string, - }, - Mac: { - ApplicationDidBecomeActive: string, - ApplicationDidChangeBackingProperties: string, - ApplicationDidChangeEffectiveAppearance: string, - ApplicationDidChangeIcon: string, - ApplicationDidChangeOcclusionState: string, - ApplicationDidChangeScreenParameters: string, - ApplicationDidChangeStatusBarFrame: string, - ApplicationDidChangeStatusBarOrientation: string, - ApplicationDidChangeTheme: string, - ApplicationDidFinishLaunching: string, - ApplicationDidHide: string, - ApplicationDidResignActive: string, - ApplicationDidUnhide: string, - ApplicationDidUpdate: string, - ApplicationShouldHandleReopen: string, - ApplicationWillBecomeActive: string, - ApplicationWillFinishLaunching: string, - ApplicationWillHide: string, - ApplicationWillResignActive: string, - ApplicationWillTerminate: string, - ApplicationWillUnhide: string, - ApplicationWillUpdate: string, - MenuDidAddItem: string, - MenuDidBeginTracking: string, - MenuDidClose: string, - MenuDidDisplayItem: string, - MenuDidEndTracking: string, - MenuDidHighlightItem: string, - MenuDidOpen: string, - MenuDidPopUp: string, - MenuDidRemoveItem: string, - MenuDidSendAction: string, - MenuDidSendActionToItem: string, - MenuDidUpdate: string, - MenuWillAddItem: string, - MenuWillBeginTracking: string, - MenuWillDisplayItem: string, - MenuWillEndTracking: string, - MenuWillHighlightItem: string, - MenuWillOpen: string, - MenuWillPopUp: string, - MenuWillRemoveItem: string, - MenuWillSendAction: string, - MenuWillSendActionToItem: string, - MenuWillUpdate: string, - WebViewDidCommitNavigation: string, - WebViewDidFinishNavigation: string, - WebViewDidReceiveServerRedirectForProvisionalNavigation: string, - WebViewDidStartProvisionalNavigation: string, - WindowDidBecomeKey: string, - WindowDidBecomeMain: string, - WindowDidBeginSheet: string, - WindowDidChangeAlpha: string, - WindowDidChangeBackingLocation: string, - WindowDidChangeBackingProperties: string, - WindowDidChangeCollectionBehavior: string, - WindowDidChangeEffectiveAppearance: string, - WindowDidChangeOcclusionState: string, - WindowDidChangeOrderingMode: string, - WindowDidChangeScreen: string, - WindowDidChangeScreenParameters: string, - WindowDidChangeScreenProfile: string, - WindowDidChangeScreenSpace: string, - WindowDidChangeScreenSpaceProperties: string, - WindowDidChangeSharingType: string, - WindowDidChangeSpace: string, - WindowDidChangeSpaceOrderingMode: string, - WindowDidChangeTitle: string, - WindowDidChangeToolbar: string, - WindowDidDeminiaturize: string, - WindowDidEndSheet: string, - WindowDidEnterFullScreen: string, - WindowDidEnterVersionBrowser: string, - WindowDidExitFullScreen: string, - WindowDidExitVersionBrowser: string, - WindowDidExpose: string, - WindowDidFocus: string, - WindowDidMiniaturize: string, - WindowDidMove: string, - WindowDidOrderOffScreen: string, - WindowDidOrderOnScreen: string, - WindowDidResignKey: string, - WindowDidResignMain: string, - WindowDidResize: string, - WindowDidUpdate: string, - WindowDidUpdateAlpha: string, - WindowDidUpdateCollectionBehavior: string, - WindowDidUpdateCollectionProperties: string, - WindowDidUpdateShadow: string, - WindowDidUpdateTitle: string, - WindowDidUpdateToolbar: string, - WindowDidZoom: string, - WindowFileDraggingEntered: string, - WindowFileDraggingExited: string, - WindowFileDraggingPerformed: string, - WindowHide: string, - WindowMaximise: string, - WindowUnMaximise: string, - WindowMinimise: string, - WindowUnMinimise: string, - WindowShouldClose: string, - WindowShow: string, - WindowWillBecomeKey: string, - WindowWillBecomeMain: string, - WindowWillBeginSheet: string, - WindowWillChangeOrderingMode: string, - WindowWillClose: string, - WindowWillDeminiaturize: string, - WindowWillEnterFullScreen: string, - WindowWillEnterVersionBrowser: string, - WindowWillExitFullScreen: string, - WindowWillExitVersionBrowser: string, - WindowWillFocus: string, - WindowWillMiniaturize: string, - WindowWillMove: string, - WindowWillOrderOffScreen: string, - WindowWillOrderOnScreen: string, - WindowWillResignMain: string, - WindowWillResize: string, - WindowWillUnfocus: string, - WindowWillUpdate: string, - WindowWillUpdateAlpha: string, - WindowWillUpdateCollectionBehavior: string, - WindowWillUpdateCollectionProperties: string, - WindowWillUpdateShadow: string, - WindowWillUpdateTitle: string, - WindowWillUpdateToolbar: string, - WindowWillUpdateVisibility: string, - WindowWillUseStandardFrame: string, - WindowZoomIn: string, - WindowZoomOut: string, - WindowZoomReset: string, - }, - Linux: { - ApplicationStartup: string, - SystemThemeChanged: string, - WindowDeleteEvent: string, - WindowDidMove: string, - WindowDidResize: string, - WindowFocusIn: string, - WindowFocusOut: string, - WindowLoadChanged: string, - }, - Common: { - ApplicationOpenedWithFile: string, - ApplicationStarted: string, - ThemeChanged: string, - WindowClosing: string, - WindowDidMove: string, - WindowDidResize: string, - WindowDPIChanged: string, - WindowFilesDropped: string, - WindowFocus: string, - WindowFullscreen: string, - WindowHide: string, - WindowLostFocus: string, - WindowMaximise: string, - WindowMinimise: string, - WindowRestore: string, - WindowRuntimeReady: string, - WindowShow: string, - WindowUnFullscreen: string, - WindowUnMaximise: string, - WindowUnMinimise: string, - WindowZoom: string, - WindowZoomIn: string, - WindowZoomOut: string, - WindowZoomReset: string, - }, -}; +export declare const Types: Readonly<{ + Windows: Readonly<{ + APMPowerSettingChange: "windows:APMPowerSettingChange"; + APMPowerStatusChange: "windows:APMPowerStatusChange"; + APMResumeAutomatic: "windows:APMResumeAutomatic"; + APMResumeSuspend: "windows:APMResumeSuspend"; + APMSuspend: "windows:APMSuspend"; + ApplicationStarted: "windows:ApplicationStarted"; + SystemThemeChanged: "windows:SystemThemeChanged"; + WebViewNavigationCompleted: "windows:WebViewNavigationCompleted"; + WindowActive: "windows:WindowActive"; + WindowBackgroundErase: "windows:WindowBackgroundErase"; + WindowClickActive: "windows:WindowClickActive"; + WindowClosing: "windows:WindowClosing"; + WindowDidMove: "windows:WindowDidMove"; + WindowDidResize: "windows:WindowDidResize"; + WindowDPIChanged: "windows:WindowDPIChanged"; + WindowDragDrop: "windows:WindowDragDrop"; + WindowDragEnter: "windows:WindowDragEnter"; + WindowDragLeave: "windows:WindowDragLeave"; + WindowDragOver: "windows:WindowDragOver"; + WindowEndMove: "windows:WindowEndMove"; + WindowEndResize: "windows:WindowEndResize"; + WindowFullscreen: "windows:WindowFullscreen"; + WindowHide: "windows:WindowHide"; + WindowInactive: "windows:WindowInactive"; + WindowKeyDown: "windows:WindowKeyDown"; + WindowKeyUp: "windows:WindowKeyUp"; + WindowKillFocus: "windows:WindowKillFocus"; + WindowNonClientHit: "windows:WindowNonClientHit"; + WindowNonClientMouseDown: "windows:WindowNonClientMouseDown"; + WindowNonClientMouseLeave: "windows:WindowNonClientMouseLeave"; + WindowNonClientMouseMove: "windows:WindowNonClientMouseMove"; + WindowNonClientMouseUp: "windows:WindowNonClientMouseUp"; + WindowPaint: "windows:WindowPaint"; + WindowRestore: "windows:WindowRestore"; + WindowSetFocus: "windows:WindowSetFocus"; + WindowShow: "windows:WindowShow"; + WindowStartMove: "windows:WindowStartMove"; + WindowStartResize: "windows:WindowStartResize"; + WindowUnFullscreen: "windows:WindowUnFullscreen"; + WindowZOrderChanged: "windows:WindowZOrderChanged"; + WindowMinimise: "windows:WindowMinimise"; + WindowUnMinimise: "windows:WindowUnMinimise"; + WindowMaximise: "windows:WindowMaximise"; + WindowUnMaximise: "windows:WindowUnMaximise"; + }>; + Mac: Readonly<{ + ApplicationDidBecomeActive: "mac:ApplicationDidBecomeActive"; + ApplicationDidChangeBackingProperties: "mac:ApplicationDidChangeBackingProperties"; + ApplicationDidChangeEffectiveAppearance: "mac:ApplicationDidChangeEffectiveAppearance"; + ApplicationDidChangeIcon: "mac:ApplicationDidChangeIcon"; + ApplicationDidChangeOcclusionState: "mac:ApplicationDidChangeOcclusionState"; + ApplicationDidChangeScreenParameters: "mac:ApplicationDidChangeScreenParameters"; + ApplicationDidChangeStatusBarFrame: "mac:ApplicationDidChangeStatusBarFrame"; + ApplicationDidChangeStatusBarOrientation: "mac:ApplicationDidChangeStatusBarOrientation"; + ApplicationDidChangeTheme: "mac:ApplicationDidChangeTheme"; + ApplicationDidFinishLaunching: "mac:ApplicationDidFinishLaunching"; + ApplicationDidHide: "mac:ApplicationDidHide"; + ApplicationDidResignActive: "mac:ApplicationDidResignActive"; + ApplicationDidUnhide: "mac:ApplicationDidUnhide"; + ApplicationDidUpdate: "mac:ApplicationDidUpdate"; + ApplicationShouldHandleReopen: "mac:ApplicationShouldHandleReopen"; + ApplicationWillBecomeActive: "mac:ApplicationWillBecomeActive"; + ApplicationWillFinishLaunching: "mac:ApplicationWillFinishLaunching"; + ApplicationWillHide: "mac:ApplicationWillHide"; + ApplicationWillResignActive: "mac:ApplicationWillResignActive"; + ApplicationWillTerminate: "mac:ApplicationWillTerminate"; + ApplicationWillUnhide: "mac:ApplicationWillUnhide"; + ApplicationWillUpdate: "mac:ApplicationWillUpdate"; + MenuDidAddItem: "mac:MenuDidAddItem"; + MenuDidBeginTracking: "mac:MenuDidBeginTracking"; + MenuDidClose: "mac:MenuDidClose"; + MenuDidDisplayItem: "mac:MenuDidDisplayItem"; + MenuDidEndTracking: "mac:MenuDidEndTracking"; + MenuDidHighlightItem: "mac:MenuDidHighlightItem"; + MenuDidOpen: "mac:MenuDidOpen"; + MenuDidPopUp: "mac:MenuDidPopUp"; + MenuDidRemoveItem: "mac:MenuDidRemoveItem"; + MenuDidSendAction: "mac:MenuDidSendAction"; + MenuDidSendActionToItem: "mac:MenuDidSendActionToItem"; + MenuDidUpdate: "mac:MenuDidUpdate"; + MenuWillAddItem: "mac:MenuWillAddItem"; + MenuWillBeginTracking: "mac:MenuWillBeginTracking"; + MenuWillDisplayItem: "mac:MenuWillDisplayItem"; + MenuWillEndTracking: "mac:MenuWillEndTracking"; + MenuWillHighlightItem: "mac:MenuWillHighlightItem"; + MenuWillOpen: "mac:MenuWillOpen"; + MenuWillPopUp: "mac:MenuWillPopUp"; + MenuWillRemoveItem: "mac:MenuWillRemoveItem"; + MenuWillSendAction: "mac:MenuWillSendAction"; + MenuWillSendActionToItem: "mac:MenuWillSendActionToItem"; + MenuWillUpdate: "mac:MenuWillUpdate"; + WebViewDidCommitNavigation: "mac:WebViewDidCommitNavigation"; + WebViewDidFinishNavigation: "mac:WebViewDidFinishNavigation"; + WebViewDidReceiveServerRedirectForProvisionalNavigation: "mac:WebViewDidReceiveServerRedirectForProvisionalNavigation"; + WebViewDidStartProvisionalNavigation: "mac:WebViewDidStartProvisionalNavigation"; + WindowDidBecomeKey: "mac:WindowDidBecomeKey"; + WindowDidBecomeMain: "mac:WindowDidBecomeMain"; + WindowDidBeginSheet: "mac:WindowDidBeginSheet"; + WindowDidChangeAlpha: "mac:WindowDidChangeAlpha"; + WindowDidChangeBackingLocation: "mac:WindowDidChangeBackingLocation"; + WindowDidChangeBackingProperties: "mac:WindowDidChangeBackingProperties"; + WindowDidChangeCollectionBehavior: "mac:WindowDidChangeCollectionBehavior"; + WindowDidChangeEffectiveAppearance: "mac:WindowDidChangeEffectiveAppearance"; + WindowDidChangeOcclusionState: "mac:WindowDidChangeOcclusionState"; + WindowDidChangeOrderingMode: "mac:WindowDidChangeOrderingMode"; + WindowDidChangeScreen: "mac:WindowDidChangeScreen"; + WindowDidChangeScreenParameters: "mac:WindowDidChangeScreenParameters"; + WindowDidChangeScreenProfile: "mac:WindowDidChangeScreenProfile"; + WindowDidChangeScreenSpace: "mac:WindowDidChangeScreenSpace"; + WindowDidChangeScreenSpaceProperties: "mac:WindowDidChangeScreenSpaceProperties"; + WindowDidChangeSharingType: "mac:WindowDidChangeSharingType"; + WindowDidChangeSpace: "mac:WindowDidChangeSpace"; + WindowDidChangeSpaceOrderingMode: "mac:WindowDidChangeSpaceOrderingMode"; + WindowDidChangeTitle: "mac:WindowDidChangeTitle"; + WindowDidChangeToolbar: "mac:WindowDidChangeToolbar"; + WindowDidDeminiaturize: "mac:WindowDidDeminiaturize"; + WindowDidEndSheet: "mac:WindowDidEndSheet"; + WindowDidEnterFullScreen: "mac:WindowDidEnterFullScreen"; + WindowDidEnterVersionBrowser: "mac:WindowDidEnterVersionBrowser"; + WindowDidExitFullScreen: "mac:WindowDidExitFullScreen"; + WindowDidExitVersionBrowser: "mac:WindowDidExitVersionBrowser"; + WindowDidExpose: "mac:WindowDidExpose"; + WindowDidFocus: "mac:WindowDidFocus"; + WindowDidMiniaturize: "mac:WindowDidMiniaturize"; + WindowDidMove: "mac:WindowDidMove"; + WindowDidOrderOffScreen: "mac:WindowDidOrderOffScreen"; + WindowDidOrderOnScreen: "mac:WindowDidOrderOnScreen"; + WindowDidResignKey: "mac:WindowDidResignKey"; + WindowDidResignMain: "mac:WindowDidResignMain"; + WindowDidResize: "mac:WindowDidResize"; + WindowDidUpdate: "mac:WindowDidUpdate"; + WindowDidUpdateAlpha: "mac:WindowDidUpdateAlpha"; + WindowDidUpdateCollectionBehavior: "mac:WindowDidUpdateCollectionBehavior"; + WindowDidUpdateCollectionProperties: "mac:WindowDidUpdateCollectionProperties"; + WindowDidUpdateShadow: "mac:WindowDidUpdateShadow"; + WindowDidUpdateTitle: "mac:WindowDidUpdateTitle"; + WindowDidUpdateToolbar: "mac:WindowDidUpdateToolbar"; + WindowDidZoom: "mac:WindowDidZoom"; + WindowFileDraggingEntered: "mac:WindowFileDraggingEntered"; + WindowFileDraggingExited: "mac:WindowFileDraggingExited"; + WindowFileDraggingPerformed: "mac:WindowFileDraggingPerformed"; + WindowHide: "mac:WindowHide"; + WindowMaximise: "mac:WindowMaximise"; + WindowUnMaximise: "mac:WindowUnMaximise"; + WindowMinimise: "mac:WindowMinimise"; + WindowUnMinimise: "mac:WindowUnMinimise"; + WindowShouldClose: "mac:WindowShouldClose"; + WindowShow: "mac:WindowShow"; + WindowWillBecomeKey: "mac:WindowWillBecomeKey"; + WindowWillBecomeMain: "mac:WindowWillBecomeMain"; + WindowWillBeginSheet: "mac:WindowWillBeginSheet"; + WindowWillChangeOrderingMode: "mac:WindowWillChangeOrderingMode"; + WindowWillClose: "mac:WindowWillClose"; + WindowWillDeminiaturize: "mac:WindowWillDeminiaturize"; + WindowWillEnterFullScreen: "mac:WindowWillEnterFullScreen"; + WindowWillEnterVersionBrowser: "mac:WindowWillEnterVersionBrowser"; + WindowWillExitFullScreen: "mac:WindowWillExitFullScreen"; + WindowWillExitVersionBrowser: "mac:WindowWillExitVersionBrowser"; + WindowWillFocus: "mac:WindowWillFocus"; + WindowWillMiniaturize: "mac:WindowWillMiniaturize"; + WindowWillMove: "mac:WindowWillMove"; + WindowWillOrderOffScreen: "mac:WindowWillOrderOffScreen"; + WindowWillOrderOnScreen: "mac:WindowWillOrderOnScreen"; + WindowWillResignMain: "mac:WindowWillResignMain"; + WindowWillResize: "mac:WindowWillResize"; + WindowWillUnfocus: "mac:WindowWillUnfocus"; + WindowWillUpdate: "mac:WindowWillUpdate"; + WindowWillUpdateAlpha: "mac:WindowWillUpdateAlpha"; + WindowWillUpdateCollectionBehavior: "mac:WindowWillUpdateCollectionBehavior"; + WindowWillUpdateCollectionProperties: "mac:WindowWillUpdateCollectionProperties"; + WindowWillUpdateShadow: "mac:WindowWillUpdateShadow"; + WindowWillUpdateTitle: "mac:WindowWillUpdateTitle"; + WindowWillUpdateToolbar: "mac:WindowWillUpdateToolbar"; + WindowWillUpdateVisibility: "mac:WindowWillUpdateVisibility"; + WindowWillUseStandardFrame: "mac:WindowWillUseStandardFrame"; + WindowZoomIn: "mac:WindowZoomIn"; + WindowZoomOut: "mac:WindowZoomOut"; + WindowZoomReset: "mac:WindowZoomReset"; + }>; + Linux: Readonly<{ + ApplicationStartup: "linux:ApplicationStartup"; + SystemThemeChanged: "linux:SystemThemeChanged"; + WindowDeleteEvent: "linux:WindowDeleteEvent"; + WindowDidMove: "linux:WindowDidMove"; + WindowDidResize: "linux:WindowDidResize"; + WindowFocusIn: "linux:WindowFocusIn"; + WindowFocusOut: "linux:WindowFocusOut"; + WindowLoadChanged: "linux:WindowLoadChanged"; + }>; + Common: Readonly<{ + ApplicationOpenedWithFile: "common:ApplicationOpenedWithFile"; + ApplicationStarted: "common:ApplicationStarted"; + ThemeChanged: "common:ThemeChanged"; + WindowClosing: "common:WindowClosing"; + WindowDidMove: "common:WindowDidMove"; + WindowDidResize: "common:WindowDidResize"; + WindowDPIChanged: "common:WindowDPIChanged"; + WindowFilesDropped: "common:WindowFilesDropped"; + WindowFocus: "common:WindowFocus"; + WindowFullscreen: "common:WindowFullscreen"; + WindowHide: "common:WindowHide"; + WindowLostFocus: "common:WindowLostFocus"; + WindowMaximise: "common:WindowMaximise"; + WindowMinimise: "common:WindowMinimise"; + WindowRestore: "common:WindowRestore"; + WindowRuntimeReady: "common:WindowRuntimeReady"; + WindowShow: "common:WindowShow"; + WindowUnFullscreen: "common:WindowUnFullscreen"; + WindowUnMaximise: "common:WindowUnMaximise"; + WindowUnMinimise: "common:WindowUnMinimise"; + WindowZoom: "common:WindowZoom"; + WindowZoomIn: "common:WindowZoomIn"; + WindowZoomOut: "common:WindowZoomOut"; + WindowZoomReset: "common:WindowZoomReset"; + }>; +}>; diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/types/events.d.ts b/v3/internal/runtime/desktop/@wailsio/runtime/types/events.d.ts index 7cded34c5..11d03e1aa 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/types/events.d.ts +++ b/v3/internal/runtime/desktop/@wailsio/runtime/types/events.d.ts @@ -1,271 +1,66 @@ -export function setup(): void; +export { Types } from "./event_types.js"; +/** + * The type of handlers for a given event. + */ +export type Callback = (ev: WailsEvent) => void; +/** + * Represents a system event or a custom event emitted through wails-provided facilities. + */ +export declare class WailsEvent { + /** + * The name of the event. + */ + name: string; + /** + * Optional data associated with the emitted event. + */ + data: any; + /** + * Name of the originating window. Omitted for application events. + * Will be overridden if set manually. + */ + sender?: string; + constructor(name: string, data?: any); +} /** * Register a callback function to be called multiple times for a specific event. * - * @param {string} eventName - The name of the event to register the callback for. - * @param {function} callback - The callback function to be called when the event is triggered. - * @param {number} maxCallbacks - The maximum number of times the callback can be called for the event. Once the maximum number is reached, the callback will no longer be called. - * - @return {function} - A function that, when called, will unregister the callback from the event. + * @param eventName - The name of the event to register the callback for. + * @param callback - The callback function to be called when the event is triggered. + * @param maxCallbacks - The maximum number of times the callback can be called for the event. Once the maximum number is reached, the callback will no longer be called. + * @returns A function that, when called, will unregister the callback from the event. */ -export function OnMultiple(eventName: string, callback: Function, maxCallbacks: number): Function; +export declare function OnMultiple(eventName: string, callback: Callback, maxCallbacks: number): () => void; /** * Registers a callback function to be executed when the specified event occurs. * - * @param {string} eventName - The name of the event. - * @param {function} callback - The callback function to be executed. It takes no parameters. - * @return {function} - A function that, when called, will unregister the callback from the event. */ -export function On(eventName: string, callback: Function): Function; + * @param eventName - The name of the event to register the callback for. + * @param callback - The callback function to be called when the event is triggered. + * @returns A function that, when called, will unregister the callback from the event. + */ +export declare function On(eventName: string, callback: Callback): () => void; /** * Registers a callback function to be executed only once for the specified event. * - * @param {string} eventName - The name of the event. - * @param {function} callback - The function to be executed when the event occurs. - * @return {function} - A function that, when called, will unregister the callback from the event. + * @param eventName - The name of the event to register the callback for. + * @param callback - The callback function to be called when the event is triggered. + * @returns A function that, when called, will unregister the callback from the event. */ -export function Once(eventName: string, callback: Function): Function; +export declare function Once(eventName: string, callback: Callback): () => void; /** * Removes event listeners for the specified event names. * - * @param {string} eventName - The name of the event to remove listeners for. - * @param {...string} additionalEventNames - Additional event names to remove listeners for. - * @return {undefined} + * @param eventNames - The name of the events to remove listeners for. */ -export function Off(eventName: string, ...additionalEventNames: string[]): undefined; +export declare function Off(...eventNames: [string, ...string[]]): void; /** * Removes all event listeners. - * - * @function OffAll - * @returns {void} */ -export function OffAll(): void; +export declare function OffAll(): void; /** - * Emits an event using the given event name. + * Emits the given event. * - * @param {WailsEvent} event - The name of the event to emit. - * @returns {any} - The result of the emitted event. + * @param event - The name of the event to emit. + * @returns A promise that will be fulfilled once the event has been emitted. */ -export function Emit(event: WailsEvent): any; -export const Types: { - Windows: { - APMPowerSettingChange: string; - APMPowerStatusChange: string; - APMResumeAutomatic: string; - APMResumeSuspend: string; - APMSuspend: string; - ApplicationStarted: string; - SystemThemeChanged: string; - WebViewNavigationCompleted: string; - WindowActive: string; - WindowBackgroundErase: string; - WindowClickActive: string; - WindowClosing: string; - WindowDidMove: string; - WindowDidResize: string; - WindowDPIChanged: string; - WindowDragDrop: string; - WindowDragEnter: string; - WindowDragLeave: string; - WindowDragOver: string; - WindowEndMove: string; - WindowEndResize: string; - WindowFullscreen: string; - WindowHide: string; - WindowInactive: string; - WindowKeyDown: string; - WindowKeyUp: string; - WindowKillFocus: string; - WindowNonClientHit: string; - WindowNonClientMouseDown: string; - WindowNonClientMouseLeave: string; - WindowNonClientMouseMove: string; - WindowNonClientMouseUp: string; - WindowPaint: string; - WindowRestore: string; - WindowSetFocus: string; - WindowShow: string; - WindowStartMove: string; - WindowStartResize: string; - WindowUnFullscreen: string; - WindowZOrderChanged: string; - WindowMinimise: string; - WindowUnMinimise: string; - WindowMaximise: string; - WindowUnMaximise: string; - }; - Mac: { - ApplicationDidBecomeActive: string; - ApplicationDidChangeBackingProperties: string; - ApplicationDidChangeEffectiveAppearance: string; - ApplicationDidChangeIcon: string; - ApplicationDidChangeOcclusionState: string; - ApplicationDidChangeScreenParameters: string; - ApplicationDidChangeStatusBarFrame: string; - ApplicationDidChangeStatusBarOrientation: string; - ApplicationDidChangeTheme: string; - ApplicationDidFinishLaunching: string; - ApplicationDidHide: string; - ApplicationDidResignActive: string; - ApplicationDidUnhide: string; - ApplicationDidUpdate: string; - ApplicationShouldHandleReopen: string; - ApplicationWillBecomeActive: string; - ApplicationWillFinishLaunching: string; - ApplicationWillHide: string; - ApplicationWillResignActive: string; - ApplicationWillTerminate: string; - ApplicationWillUnhide: string; - ApplicationWillUpdate: string; - MenuDidAddItem: string; - MenuDidBeginTracking: string; - MenuDidClose: string; - MenuDidDisplayItem: string; - MenuDidEndTracking: string; - MenuDidHighlightItem: string; - MenuDidOpen: string; - MenuDidPopUp: string; - MenuDidRemoveItem: string; - MenuDidSendAction: string; - MenuDidSendActionToItem: string; - MenuDidUpdate: string; - MenuWillAddItem: string; - MenuWillBeginTracking: string; - MenuWillDisplayItem: string; - MenuWillEndTracking: string; - MenuWillHighlightItem: string; - MenuWillOpen: string; - MenuWillPopUp: string; - MenuWillRemoveItem: string; - MenuWillSendAction: string; - MenuWillSendActionToItem: string; - MenuWillUpdate: string; - WebViewDidCommitNavigation: string; - WebViewDidFinishNavigation: string; - WebViewDidReceiveServerRedirectForProvisionalNavigation: string; - WebViewDidStartProvisionalNavigation: string; - WindowDidBecomeKey: string; - WindowDidBecomeMain: string; - WindowDidBeginSheet: string; - WindowDidChangeAlpha: string; - WindowDidChangeBackingLocation: string; - WindowDidChangeBackingProperties: string; - WindowDidChangeCollectionBehavior: string; - WindowDidChangeEffectiveAppearance: string; - WindowDidChangeOcclusionState: string; - WindowDidChangeOrderingMode: string; - WindowDidChangeScreen: string; - WindowDidChangeScreenParameters: string; - WindowDidChangeScreenProfile: string; - WindowDidChangeScreenSpace: string; - WindowDidChangeScreenSpaceProperties: string; - WindowDidChangeSharingType: string; - WindowDidChangeSpace: string; - WindowDidChangeSpaceOrderingMode: string; - WindowDidChangeTitle: string; - WindowDidChangeToolbar: string; - WindowDidDeminiaturize: string; - WindowDidEndSheet: string; - WindowDidEnterFullScreen: string; - WindowDidEnterVersionBrowser: string; - WindowDidExitFullScreen: string; - WindowDidExitVersionBrowser: string; - WindowDidExpose: string; - WindowDidFocus: string; - WindowDidMiniaturize: string; - WindowDidMove: string; - WindowDidOrderOffScreen: string; - WindowDidOrderOnScreen: string; - WindowDidResignKey: string; - WindowDidResignMain: string; - WindowDidResize: string; - WindowDidUpdate: string; - WindowDidUpdateAlpha: string; - WindowDidUpdateCollectionBehavior: string; - WindowDidUpdateCollectionProperties: string; - WindowDidUpdateShadow: string; - WindowDidUpdateTitle: string; - WindowDidUpdateToolbar: string; - WindowDidZoom: string; - WindowFileDraggingEntered: string; - WindowFileDraggingExited: string; - WindowFileDraggingPerformed: string; - WindowHide: string; - WindowMaximise: string; - WindowUnMaximise: string; - WindowMinimise: string; - WindowUnMinimise: string; - WindowShouldClose: string; - WindowShow: string; - WindowWillBecomeKey: string; - WindowWillBecomeMain: string; - WindowWillBeginSheet: string; - WindowWillChangeOrderingMode: string; - WindowWillClose: string; - WindowWillDeminiaturize: string; - WindowWillEnterFullScreen: string; - WindowWillEnterVersionBrowser: string; - WindowWillExitFullScreen: string; - WindowWillExitVersionBrowser: string; - WindowWillFocus: string; - WindowWillMiniaturize: string; - WindowWillMove: string; - WindowWillOrderOffScreen: string; - WindowWillOrderOnScreen: string; - WindowWillResignMain: string; - WindowWillResize: string; - WindowWillUnfocus: string; - WindowWillUpdate: string; - WindowWillUpdateAlpha: string; - WindowWillUpdateCollectionBehavior: string; - WindowWillUpdateCollectionProperties: string; - WindowWillUpdateShadow: string; - WindowWillUpdateTitle: string; - WindowWillUpdateToolbar: string; - WindowWillUpdateVisibility: string; - WindowWillUseStandardFrame: string; - WindowZoomIn: string; - WindowZoomOut: string; - WindowZoomReset: string; - }; - Linux: { - ApplicationStartup: string; - SystemThemeChanged: string; - WindowDeleteEvent: string; - WindowDidMove: string; - WindowDidResize: string; - WindowFocusIn: string; - WindowFocusOut: string; - WindowLoadChanged: string; - }; - Common: { - ApplicationOpenedWithFile: string; - ApplicationStarted: string; - ThemeChanged: string; - WindowClosing: string; - WindowDidMove: string; - WindowDidResize: string; - WindowDPIChanged: string; - WindowFilesDropped: string; - WindowFocus: string; - WindowFullscreen: string; - WindowHide: string; - WindowLostFocus: string; - WindowMaximise: string; - WindowMinimise: string; - WindowRestore: string; - WindowRuntimeReady: string; - WindowShow: string; - WindowUnFullscreen: string; - WindowUnMaximise: string; - WindowUnMinimise: string; - WindowZoom: string; - WindowZoomIn: string; - WindowZoomOut: string; - WindowZoomReset: string; - }; -}; -export class WailsEvent { - constructor(name: any, data?: any); - name: any; - data: any; -} +export declare function Emit(event: WailsEvent): Promise; diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/types/flags.d.ts b/v3/internal/runtime/desktop/@wailsio/runtime/types/flags.d.ts index 212436d04..272aa9193 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/types/flags.d.ts +++ b/v3/internal/runtime/desktop/@wailsio/runtime/types/flags.d.ts @@ -1,7 +1,7 @@ /** * Retrieves the value associated with the specified key from the flag map. * - * @param {string} keyString - The key to retrieve the value for. - * @return {*} - The value associated with the specified key. + * @param key - The key to retrieve the value for. + * @return The value associated with the specified key. */ -export function GetFlag(keyString: string): any; +export declare function GetFlag(key: string): any; diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/types/index.d.ts b/v3/internal/runtime/desktop/@wailsio/runtime/types/index.d.ts index c1dc50fad..54dca2206 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/types/index.d.ts +++ b/v3/internal/runtime/desktop/@wailsio/runtime/types/index.d.ts @@ -1,14 +1,16 @@ -export function init(): void; -import * as Application from "./application"; -import * as Browser from "./browser"; -import * as Call from "./calls"; -import * as Clipboard from "./clipboard"; -import * as Create from "./create"; -import * as Dialogs from "./dialogs"; -import * as Events from "./events"; -import * as Flags from "./flags"; -import * as Screens from "./screens"; -import * as System from "./system"; -import Window from "./window"; -import * as WML from "./wml"; -export { Application, Browser, Call, Clipboard, Create, Dialogs, Events, Flags, Screens, System, Window, WML }; +import "./contextmenu.js"; +import "./drag.js"; +import * as Application from "./application.js"; +import * as Browser from "./browser.js"; +import * as Call from "./calls.js"; +import * as Clipboard from "./clipboard.js"; +import * as Create from "./create.js"; +import * as Dialogs from "./dialogs.js"; +import * as Events from "./events.js"; +import * as Flags from "./flags.js"; +import * as Screens from "./screens.js"; +import * as System from "./system.js"; +import Window from "./window.js"; +import * as WML from "./wml.js"; +export { Application, Browser, Call, Clipboard, Dialogs, Events, Flags, Screens, System, Window, WML }; +export * from "./cancellable.js"; diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/types/listener.d.ts b/v3/internal/runtime/desktop/@wailsio/runtime/types/listener.d.ts new file mode 100644 index 000000000..75bb5c458 --- /dev/null +++ b/v3/internal/runtime/desktop/@wailsio/runtime/types/listener.d.ts @@ -0,0 +1,9 @@ +export declare const eventListeners: Map; +export declare class Listener { + eventName: string; + callback: (data: any) => void; + maxCallbacks: number; + constructor(eventName: string, callback: (data: any) => void, maxCallbacks: number); + dispatch(data: any): boolean; +} +export declare function listenerOff(listener: Listener): void; diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/types/nanoid.d.ts b/v3/internal/runtime/desktop/@wailsio/runtime/types/nanoid.d.ts index dce98a05e..a691510e5 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/types/nanoid.d.ts +++ b/v3/internal/runtime/desktop/@wailsio/runtime/types/nanoid.d.ts @@ -1 +1 @@ -export function nanoid(size?: number): string; +export declare function nanoid(size?: number): string; diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/types/runtime.d.ts b/v3/internal/runtime/desktop/@wailsio/runtime/types/runtime.d.ts index ffff3dc66..60f760628 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/types/runtime.d.ts +++ b/v3/internal/runtime/desktop/@wailsio/runtime/types/runtime.d.ts @@ -1,30 +1,22 @@ -/** - * Creates a runtime caller function that invokes a specified method on a given object within a specified window context. - * - * @param {Object} object - The object on which the method is to be invoked. - * @param {string} windowName - The name of the window context in which the method should be called. - * @returns {Function} A runtime caller function that takes the method name and optionally arguments and invokes the method within the specified window context. - */ -export function newRuntimeCaller(object: any, windowName: string): Function; +export declare const objectNames: Readonly<{ + Call: 0; + Clipboard: 1; + Application: 2; + Events: 3; + ContextMenu: 4; + Dialog: 5; + Window: 6; + Screens: 7; + System: 8; + Browser: 9; + CancelCall: 10; +}>; +export declare let clientId: string; /** * Creates a new runtime caller with specified ID. * - * @param {number} object - The object to invoke the method on. - * @param {string} windowName - The name of the window. - * @return {Function} - The new runtime caller function. + * @param object - The object to invoke the method on. + * @param windowName - The name of the window. + * @return The new runtime caller function. */ -export function newRuntimeCallerWithID(object: number, windowName: string): Function; -export namespace objectNames { - let Call: number; - let Clipboard: number; - let Application: number; - let Events: number; - let ContextMenu: number; - let Dialog: number; - let Window: number; - let Screens: number; - let System: number; - let Browser: number; - let CancelCall: number; -} -export let clientId: string; +export declare function newRuntimeCaller(object: number, windowName?: string): (method: number, args?: any) => Promise; diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/types/screens.d.ts b/v3/internal/runtime/desktop/@wailsio/runtime/types/screens.d.ts index 7409875db..b4a2f622d 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/types/screens.d.ts +++ b/v3/internal/runtime/desktop/@wailsio/runtime/types/screens.d.ts @@ -1,94 +1,60 @@ +export interface Size { + /** The width of a rectangular area. */ + Width: number; + /** The height of a rectangular area. */ + Height: number; +} +export interface Rect { + /** The X coordinate of the origin. */ + X: number; + /** The Y coordinate of the origin. */ + Y: number; + /** The width of the rectangle. */ + Width: number; + /** The height of the rectangle. */ + Height: number; +} +export interface Screen { + /** Unique identifier for the screen. */ + ID: string; + /** Human-readable name of the screen. */ + Name: string; + /** The scale factor of the screen (DPI/96). 1 = standard DPI, 2 = HiDPI (Retina), etc. */ + ScaleFactor: number; + /** The X coordinate of the screen. */ + X: number; + /** The Y coordinate of the screen. */ + Y: number; + /** Contains the width and height of the screen. */ + Size: Size; + /** Contains the bounds of the screen in terms of X, Y, Width, and Height. */ + Bounds: Rect; + /** Contains the physical bounds of the screen in terms of X, Y, Width, and Height (before scaling). */ + PhysicalBounds: Rect; + /** Contains the area of the screen that is actually usable (excluding taskbar and other system UI). */ + WorkArea: Rect; + /** Contains the physical WorkArea of the screen (before scaling). */ + PhysicalWorkArea: Rect; + /** True if this is the primary monitor selected by the user in the operating system. */ + IsPrimary: boolean; + /** The rotation of the screen. */ + Rotation: number; +} /** * Gets all screens. - * @returns {Promise} A promise that resolves to an array of Screen objects. + * + * @returns A promise that resolves to an array of Screen objects. */ -export function GetAll(): Promise; +export declare function GetAll(): Promise; /** * Gets the primary screen. - * @returns {Promise} A promise that resolves to the primary screen. + * + * @returns A promise that resolves to the primary screen. */ -export function GetPrimary(): Promise; +export declare function GetPrimary(): Promise; /** * Gets the current active screen. * - * @returns {Promise} A promise that resolves with the current active screen. + * @returns A promise that resolves with the current active screen. */ -export function GetCurrent(): Promise; -export type Size = { - /** - * - The width. - */ - Width: number; - /** - * - The height. - */ - Height: number; -}; -export type Rect = { - /** - * - The X coordinate of the origin. - */ - X: number; - /** - * - The Y coordinate of the origin. - */ - Y: number; - /** - * - The width of the rectangle. - */ - Width: number; - /** - * - The height of the rectangle. - */ - Height: number; -}; -export type Screen = { - /** - * - Unique identifier for the screen. - */ - ID: string; - /** - * - Human readable name of the screen. - */ - Name: string; - /** - * - The scale factor of the screen (DPI/96). 1 = standard DPI, 2 = HiDPI (Retina), etc. - */ - ScaleFactor: number; - /** - * - The X coordinate of the screen. - */ - X: number; - /** - * - The Y coordinate of the screen. - */ - Y: number; - /** - * - Contains the width and height of the screen. - */ - Size: Size; - /** - * - Contains the bounds of the screen in terms of X, Y, Width, and Height. - */ - Bounds: Rect; - /** - * - Contains the physical bounds of the screen in terms of X, Y, Width, and Height (before scaling). - */ - PhysicalBounds: Rect; - /** - * - Contains the area of the screen that is actually usable (excluding taskbar and other system UI). - */ - WorkArea: Rect; - /** - * - Contains the physical WorkArea of the screen (before scaling). - */ - PhysicalWorkArea: Rect; - /** - * - True if this is the primary monitor selected by the user in the operating system. - */ - IsPrimary: boolean; - /** - * - The rotation of the screen. - */ - Rotation: number; -}; +export declare function GetCurrent(): Promise; diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/types/system.d.ts b/v3/internal/runtime/desktop/@wailsio/runtime/types/system.d.ts index b3a08f200..1e1924bd3 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/types/system.d.ts +++ b/v3/internal/runtime/desktop/@wailsio/runtime/types/system.d.ts @@ -1,112 +1,83 @@ -export function invoke(msg: any): any; +export declare function invoke(msg: any): void; /** - * @function * Retrieves the system dark mode status. - * @returns {Promise} - A promise that resolves to a boolean value indicating if the system is in dark mode. + * + * @returns A promise that resolves to a boolean value indicating if the system is in dark mode. */ -export function IsDarkMode(): Promise; +export declare function IsDarkMode(): Promise; /** * Fetches the capabilities of the application from the server. * - * @async - * @function Capabilities - * @returns {Promise} A promise that resolves to an object containing the capabilities. + * @returns A promise that resolves to an object containing the capabilities. */ -export function Capabilities(): Promise; +export declare function Capabilities(): Promise>; +export interface OSInfo { + /** The branding of the OS. */ + Branding: string; + /** The ID of the OS. */ + ID: string; + /** The name of the OS. */ + Name: string; + /** The version of the OS. */ + Version: string; +} +export interface EnvironmentInfo { + /** The architecture of the system. */ + Arch: string; + /** True if the application is running in debug mode, otherwise false. */ + Debug: boolean; + /** The operating system in use. */ + OS: string; + /** Details of the operating system. */ + OSInfo: OSInfo; + /** Additional platform information. */ + PlatformInfo: Record; +} /** - * @typedef {Object} OSInfo - * @property {string} Branding - The branding of the OS. - * @property {string} ID - The ID of the OS. - * @property {string} Name - The name of the OS. - * @property {string} Version - The version of the OS. - */ -/** - * @typedef {Object} EnvironmentInfo - * @property {string} Arch - The architecture of the system. - * @property {boolean} Debug - True if the application is running in debug mode, otherwise false. - * @property {string} OS - The operating system in use. - * @property {OSInfo} OSInfo - Details of the operating system. - * @property {Object} PlatformInfo - Additional platform information. - */ -/** - * @function * Retrieves environment details. - * @returns {Promise} - A promise that resolves to an object containing OS and system architecture. + * + * @returns A promise that resolves to an object containing OS and system architecture. */ -export function Environment(): Promise; +export declare function Environment(): Promise; /** * Checks if the current operating system is Windows. * - * @return {boolean} True if the operating system is Windows, otherwise false. + * @return True if the operating system is Windows, otherwise false. */ -export function IsWindows(): boolean; +export declare function IsWindows(): boolean; /** * Checks if the current operating system is Linux. * - * @returns {boolean} Returns true if the current operating system is Linux, false otherwise. + * @returns Returns true if the current operating system is Linux, false otherwise. */ -export function IsLinux(): boolean; +export declare function IsLinux(): boolean; /** * Checks if the current environment is a macOS operating system. * - * @returns {boolean} True if the environment is macOS, false otherwise. + * @returns True if the environment is macOS, false otherwise. */ -export function IsMac(): boolean; +export declare function IsMac(): boolean; /** * Checks if the current environment architecture is AMD64. - * @returns {boolean} True if the current environment architecture is AMD64, false otherwise. + * + * @returns True if the current environment architecture is AMD64, false otherwise. */ -export function IsAMD64(): boolean; +export declare function IsAMD64(): boolean; /** * Checks if the current architecture is ARM. * - * @returns {boolean} True if the current architecture is ARM, false otherwise. + * @returns True if the current architecture is ARM, false otherwise. */ -export function IsARM(): boolean; +export declare function IsARM(): boolean; /** * Checks if the current environment is ARM64 architecture. * - * @returns {boolean} - Returns true if the environment is ARM64 architecture, otherwise returns false. + * @returns Returns true if the environment is ARM64 architecture, otherwise returns false. */ -export function IsARM64(): boolean; -export function IsDebug(): boolean; -export type OSInfo = { - /** - * - The branding of the OS. - */ - Branding: string; - /** - * - The ID of the OS. - */ - ID: string; - /** - * - The name of the OS. - */ - Name: string; - /** - * - The version of the OS. - */ - Version: string; -}; -export type EnvironmentInfo = { - /** - * - The architecture of the system. - */ - Arch: string; - /** - * - True if the application is running in debug mode, otherwise false. - */ - Debug: boolean; - /** - * - The operating system in use. - */ - OS: string; - /** - * - Details of the operating system. - */ - OSInfo: OSInfo; - /** - * - Additional platform information. - */ - PlatformInfo: any; -}; +export declare function IsARM64(): boolean; +/** + * Reports whether the app is being run in debug mode. + * + * @returns True if the app is being run in debug mode. + */ +export declare function IsDebug(): boolean; diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/types/utils.d.ts b/v3/internal/runtime/desktop/@wailsio/runtime/types/utils.d.ts index 25fa1d62a..d748a049c 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/types/utils.d.ts +++ b/v3/internal/runtime/desktop/@wailsio/runtime/types/utils.d.ts @@ -1,14 +1,21 @@ /** * Logs a message to the console with custom formatting. - * @param {string} message - The message to be logged. - * @return {void} + * + * @param message - The message to be logged. */ -export function debugLog(message: string): void; +export declare function debugLog(message: any): void; +/** + * Checks whether the webview supports the {@link MouseEvent#buttons} property. + * Looking at you macOS High Sierra! + */ +export declare function canTrackButtons(): boolean; /** * Checks whether the browser supports removing listeners by triggering an AbortSignal - * (see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#signal) - * - * @return {boolean} + * (see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#signal). */ -export function canAbortListeners(): boolean; -export function whenReady(callback: any): void; +export declare function canAbortListeners(): boolean; +/** + * Resolves the closest HTMLElement ancestor of an event's target. + */ +export declare function eventTarget(event: Event): HTMLElement; +export declare function whenReady(callback: () => void): void; diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/types/window.d.ts b/v3/internal/runtime/desktop/@wailsio/runtime/types/window.d.ts index 4a86325ce..3acecfb38 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/types/window.d.ts +++ b/v3/internal/runtime/desktop/@wailsio/runtime/types/window.d.ts @@ -1,407 +1,292 @@ -export class Window { +import type { Screen } from "./screens.js"; +/** + * A record describing the position of a window. + */ +interface Position { + /** The horizontal position of the window. */ + x: number; + /** The vertical position of the window. */ + y: number; +} +/** + * A record describing the size of a window. + */ +interface Size { + /** The width of the window. */ + width: number; + /** The height of the window. */ + height: number; +} +declare const callerSym: unique symbol; +declare class Window { + private [callerSym]; /** * Initialises a window object with the specified name. * * @private - * @param {string} name - The name of the target window. + * @param name - The name of the target window. */ - private constructor(); + constructor(name?: string); /** * Gets the specified window. * - * @public - * @param {string} name - The name of the window to get. - * @return {Window} - The corresponding window object. + * @param name - The name of the window to get. + * @returns The corresponding window object. */ - public Get(name: string): Window; + Get(name: string): Window; /** * Returns the absolute position of the window. * - * @public - * @return {Promise} - The current absolute position of the window. + * @returns The current absolute position of the window. */ - public Position(): Promise; + Position(): Promise; /** * Centers the window on the screen. - * - * @public - * @return {Promise} */ - public Center(): Promise; + Center(): Promise; /** * Closes the window. - * - * @public - * @return {Promise} */ - public Close(): Promise; + Close(): Promise; /** * Disables min/max size constraints. - * - * @public - * @return {Promise} */ - public DisableSizeConstraints(): Promise; + DisableSizeConstraints(): Promise; /** * Enables min/max size constraints. - * - * @public - * @return {Promise} */ - public EnableSizeConstraints(): Promise; + EnableSizeConstraints(): Promise; /** * Focuses the window. - * - * @public - * @return {Promise} */ - public Focus(): Promise; + Focus(): Promise; /** * Forces the window to reload the page assets. - * - * @public - * @return {Promise} */ - public ForceReload(): Promise; + ForceReload(): Promise; /** - * Doc. - * - * @public - * @return {Promise} + * Switches the window to fullscreen mode. */ - public Fullscreen(): Promise; + Fullscreen(): Promise; /** * Returns the screen that the window is on. * - * @public - * @return {Promise} - The screen the window is currently on + * @returns The screen the window is currently on. */ - public GetScreen(): Promise; + GetScreen(): Promise; /** * Returns the current zoom level of the window. * - * @public - * @return {Promise} - The current zoom level + * @returns The current zoom level. */ - public GetZoom(): Promise; + GetZoom(): Promise; /** * Returns the height of the window. * - * @public - * @return {Promise} - The current height of the window + * @returns The current height of the window. */ - public Height(): Promise; + Height(): Promise; /** * Hides the window. - * - * @public - * @return {Promise} */ - public Hide(): Promise; + Hide(): Promise; /** * Returns true if the window is focused. * - * @public - * @return {Promise} - Whether the window is currently focused + * @returns Whether the window is currently focused. */ - public IsFocused(): Promise; + IsFocused(): Promise; /** * Returns true if the window is fullscreen. * - * @public - * @return {Promise} - Whether the window is currently fullscreen + * @returns Whether the window is currently fullscreen. */ - public IsFullscreen(): Promise; + IsFullscreen(): Promise; /** * Returns true if the window is maximised. * - * @public - * @return {Promise} - Whether the window is currently maximised + * @returns Whether the window is currently maximised. */ - public IsMaximised(): Promise; + IsMaximised(): Promise; /** * Returns true if the window is minimised. * - * @public - * @return {Promise} - Whether the window is currently minimised + * @returns Whether the window is currently minimised. */ - public IsMinimised(): Promise; + IsMinimised(): Promise; /** * Maximises the window. - * - * @public - * @return {Promise} */ - public Maximise(): Promise; + Maximise(): Promise; /** * Minimises the window. - * - * @public - * @return {Promise} */ - public Minimise(): Promise; + Minimise(): Promise; /** * Returns the name of the window. * - * @public - * @return {Promise} - The name of the window + * @returns The name of the window. */ - public Name(): Promise; + Name(): Promise; /** * Opens the development tools pane. - * - * @public - * @return {Promise} */ - public OpenDevTools(): Promise; + OpenDevTools(): Promise; /** * Returns the relative position of the window to the screen. * - * @public - * @return {Promise} - The current relative position of the window + * @returns The current relative position of the window. */ - public RelativePosition(): Promise; + RelativePosition(): Promise; /** * Reloads the page assets. - * - * @public - * @return {Promise} */ - public Reload(): Promise; + Reload(): Promise; /** * Returns true if the window is resizable. * - * @public - * @return {Promise} - Whether the window is currently resizable + * @returns Whether the window is currently resizable. */ - public Resizable(): Promise; + Resizable(): Promise; /** * Restores the window to its previous state if it was previously minimised, maximised or fullscreen. - * - * @public - * @return {Promise} */ - public Restore(): Promise; + Restore(): Promise; /** * Sets the absolute position of the window. * - * @public - * @param {number} x - The desired horizontal absolute position of the window - * @param {number} y - The desired vertical absolute position of the window - * @return {Promise} + * @param x - The desired horizontal absolute position of the window. + * @param y - The desired vertical absolute position of the window. */ - public SetPosition(x: number, y: number): Promise; + SetPosition(x: number, y: number): Promise; /** * Sets the window to be always on top. * - * @public - * @param {boolean} alwaysOnTop - Whether the window should stay on top - * @return {Promise} + * @param alwaysOnTop - Whether the window should stay on top. */ - public SetAlwaysOnTop(alwaysOnTop: boolean): Promise; + SetAlwaysOnTop(alwaysOnTop: boolean): Promise; /** * Sets the background colour of the window. * - * @public - * @param {number} r - The desired red component of the window background - * @param {number} g - The desired green component of the window background - * @param {number} b - The desired blue component of the window background - * @param {number} a - The desired alpha component of the window background - * @return {Promise} + * @param r - The desired red component of the window background. + * @param g - The desired green component of the window background. + * @param b - The desired blue component of the window background. + * @param a - The desired alpha component of the window background. */ - public SetBackgroundColour(r: number, g: number, b: number, a: number): Promise; + SetBackgroundColour(r: number, g: number, b: number, a: number): Promise; /** * Removes the window frame and title bar. * - * @public - * @param {boolean} frameless - Whether the window should be frameless - * @return {Promise} + * @param frameless - Whether the window should be frameless. */ - public SetFrameless(frameless: boolean): Promise; + SetFrameless(frameless: boolean): Promise; /** * Disables the system fullscreen button. * - * @public - * @param {boolean} enabled - Whether the fullscreen button should be enabled - * @return {Promise} + * @param enabled - Whether the fullscreen button should be enabled. */ - public SetFullscreenButtonEnabled(enabled: boolean): Promise; + SetFullscreenButtonEnabled(enabled: boolean): Promise; /** * Sets the maximum size of the window. * - * @public - * @param {number} width - The desired maximum width of the window - * @param {number} height - The desired maximum height of the window - * @return {Promise} + * @param width - The desired maximum width of the window. + * @param height - The desired maximum height of the window. */ - public SetMaxSize(width: number, height: number): Promise; + SetMaxSize(width: number, height: number): Promise; /** * Sets the minimum size of the window. * - * @public - * @param {number} width - The desired minimum width of the window - * @param {number} height - The desired minimum height of the window - * @return {Promise} + * @param width - The desired minimum width of the window. + * @param height - The desired minimum height of the window. */ - public SetMinSize(width: number, height: number): Promise; + SetMinSize(width: number, height: number): Promise; /** * Sets the relative position of the window to the screen. * - * @public - * @param {number} x - The desired horizontal relative position of the window - * @param {number} y - The desired vertical relative position of the window - * @return {Promise} + * @param x - The desired horizontal relative position of the window. + * @param y - The desired vertical relative position of the window. */ - public SetRelativePosition(x: number, y: number): Promise; + SetRelativePosition(x: number, y: number): Promise; /** * Sets whether the window is resizable. * - * @public - * @param {boolean} resizable - Whether the window should be resizable - * @return {Promise} + * @param resizable - Whether the window should be resizable. */ - public SetResizable(resizable: boolean): Promise; + SetResizable(resizable: boolean): Promise; /** * Sets the size of the window. * - * @public - * @param {number} width - The desired width of the window - * @param {number} height - The desired height of the window - * @return {Promise} + * @param width - The desired width of the window. + * @param height - The desired height of the window. */ - public SetSize(width: number, height: number): Promise; + SetSize(width: number, height: number): Promise; /** * Sets the title of the window. * - * @public - * @param {string} title - The desired title of the window - * @return {Promise} + * @param title - The desired title of the window. */ - public SetTitle(title: string): Promise; + SetTitle(title: string): Promise; /** * Sets the zoom level of the window. * - * @public - * @param {number} zoom - The desired zoom level - * @return {Promise} + * @param zoom - The desired zoom level. */ - public SetZoom(zoom: number): Promise; + SetZoom(zoom: number): Promise; /** * Shows the window. - * - * @public - * @return {Promise} */ - public Show(): Promise; + Show(): Promise; /** * Returns the size of the window. * - * @public - * @return {Promise} - The current size of the window + * @returns The current size of the window. */ - public Size(): Promise; + Size(): Promise; /** * Toggles the window between fullscreen and normal. - * - * @public - * @return {Promise} */ - public ToggleFullscreen(): Promise; + ToggleFullscreen(): Promise; /** * Toggles the window between maximised and normal. - * - * @public - * @return {Promise} */ - public ToggleMaximise(): Promise; + ToggleMaximise(): Promise; /** * Un-fullscreens the window. - * - * @public - * @return {Promise} */ - public UnFullscreen(): Promise; + UnFullscreen(): Promise; /** * Un-maximises the window. - * - * @public - * @return {Promise} */ - public UnMaximise(): Promise; + UnMaximise(): Promise; /** * Un-minimises the window. - * - * @public - * @return {Promise} */ - public UnMinimise(): Promise; + UnMinimise(): Promise; /** * Returns the width of the window. * - * @public - * @return {Promise} - The current width of the window + * @returns The current width of the window. */ - public Width(): Promise; + Width(): Promise; /** * Zooms the window. - * - * @public - * @return {Promise} */ - public Zoom(): Promise; + Zoom(): Promise; /** * Increases the zoom level of the webview content. - * - * @public - * @return {Promise} */ - public ZoomIn(): Promise; + ZoomIn(): Promise; /** * Decreases the zoom level of the webview content. - * - * @public - * @return {Promise} */ - public ZoomOut(): Promise; + ZoomOut(): Promise; /** * Resets the zoom level of the webview content. - * - * @public - * @return {Promise} */ - public ZoomReset(): Promise; + ZoomReset(): Promise; } -export default thisWindow; -export type Screen = import("./screens").Screen; -/** - * A record describing the position of a window. - */ -export type Position = { - /** - * - The horizontal position of the window - */ - x: number; - /** - * - The vertical position of the window - */ - y: number; -}; -/** - * A record describing the size of a window. - */ -export type Size = { - /** - * - The width of the window - */ - width: number; - /** - * - The height of the window - */ - height: number; -}; /** * The window within which the script is running. - * - * @type {Window} */ declare const thisWindow: Window; +export default thisWindow; diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/types/wml.d.ts b/v3/internal/runtime/desktop/@wailsio/runtime/types/wml.d.ts index 037912e56..020a3c59d 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/types/wml.d.ts +++ b/v3/internal/runtime/desktop/@wailsio/runtime/types/wml.d.ts @@ -1,12 +1,8 @@ /** * Schedules an automatic reload of WML to be performed as soon as the document is fully loaded. - * - * @return {void} */ -export function Enable(): void; +export declare function Enable(): void; /** * Reloads the WML page by adding necessary event listeners and browser listeners. - * - * @return {void} */ -export function Reload(): void; +export declare function Reload(): void; From e64cbd3e66c867ee352ba67989db8704d877f17f Mon Sep 17 00:00:00 2001 From: Fabio Massaioli Date: Fri, 28 Feb 2025 01:33:00 +0100 Subject: [PATCH 113/374] Test data updates --- .../UseNames=false/encoding/json/models.js | 2 +- .../UseNames=false/encoding/models.js | 2 +- .../testcases/aliases/greetservice.js | 44 +--- .../generator/testcases/aliases/models.js | 4 +- .../complex_expressions/config/service7.js | 7 +- .../complex_expressions/config/service9.js | 7 +- .../testcases/complex_json/greetservice.js | 7 +- .../testcases/complex_json/models.js | 2 +- .../testcases/complex_method/greetservice.js | 9 +- .../testcases/complex_method/models.js | 2 +- .../testcases/cyclic_imports/greetservice.js | 9 +- .../testcases/cyclic_imports/models.js | 2 +- .../testcases/cyclic_types/greetservice.js | 9 +- .../testcases/cyclic_types/models.js | 2 +- .../testcases/directives/internalservice.js | 7 +- .../generator/testcases/directives/models.js | 2 +- .../directives/otherpackage/models.js | 2 +- .../generator/testcases/directives/service.js | 12 +- .../testcases/directives/unexportedservice.js | 7 +- .../embedded_interface/greetservice.js | 27 +- .../generator/testcases/enum/greetservice.js | 14 +- .../generator/testcases/enum/models.js | 2 +- .../greetservice.js | 7 +- .../services/models.js | 2 +- .../greetservice.js | 14 +- .../function_from_imported_package/models.js | 2 +- .../services/models.js | 2 +- .../services/otherservice.js | 9 +- .../greetservice.js | 14 +- .../models.js | 2 +- .../services/other/models.js | 2 +- .../services/other/otherservice.js | 9 +- .../function_multiple_files/greetservice.js | 7 +- .../testcases/function_single/greetservice.js | 7 +- .../function_single_context/greetservice.js | 12 +- .../function_single_internal/greetservice.js | 7 +- .../generator/testcases/map_keys/models.js | 48 ++-- .../generator/testcases/map_keys/service.js | 9 +- .../generator/testcases/marshalers/models.js | 2 +- .../generator/testcases/marshalers/service.js | 9 +- .../testcases/no_bindings_here/models.js | 8 +- .../no_bindings_here/other/models.js | 6 +- .../no_bindings_here/other/othermethods.js | 7 +- .../testcases/no_bindings_here/somemethods.js | 14 +- .../testcases/out_of_tree/embedother.js | 7 +- .../testcases/out_of_tree/embedservice.js | 14 +- .../testcases/out_of_tree/greetservice.js | 7 +- .../struct_literal_multiple/greetservice.js | 7 +- .../struct_literal_multiple/otherservice.js | 7 +- .../greetservice.js | 7 +- .../otherservice.js | 7 +- .../greetservice.js | 14 +- .../struct_literal_multiple_other/models.js | 2 +- .../services/models.js | 2 +- .../services/otherservice.js | 9 +- .../greetservice.js | 229 +++++++---------- .../models.js | 2 +- .../struct_literal_single/greetservice.js | 229 +++++++---------- .../testcases/struct_literal_single/models.js | 2 +- .../testcases/variable_single/greetservice.js | 7 +- .../greetservice.js | 7 +- .../greetservice.js | 14 +- .../models.js | 2 +- .../services/models.js | 2 +- .../services/otherservice.js | 9 +- .../UseNames=true/encoding/json/models.js | 2 +- .../UseNames=true/encoding/models.js | 2 +- .../testcases/aliases/greetservice.js | 44 +--- .../generator/testcases/aliases/models.js | 4 +- .../complex_expressions/config/service7.js | 7 +- .../complex_expressions/config/service9.js | 7 +- .../testcases/complex_json/greetservice.js | 7 +- .../testcases/complex_json/models.js | 2 +- .../testcases/complex_method/greetservice.js | 9 +- .../testcases/complex_method/models.js | 2 +- .../testcases/cyclic_imports/greetservice.js | 9 +- .../testcases/cyclic_imports/models.js | 2 +- .../testcases/cyclic_types/greetservice.js | 9 +- .../testcases/cyclic_types/models.js | 2 +- .../testcases/directives/internalservice.js | 7 +- .../generator/testcases/directives/models.js | 2 +- .../directives/otherpackage/models.js | 2 +- .../generator/testcases/directives/service.js | 12 +- .../testcases/directives/unexportedservice.js | 7 +- .../embedded_interface/greetservice.js | 27 +- .../generator/testcases/enum/greetservice.js | 14 +- .../generator/testcases/enum/models.js | 2 +- .../greetservice.js | 7 +- .../services/models.js | 2 +- .../greetservice.js | 14 +- .../function_from_imported_package/models.js | 2 +- .../services/models.js | 2 +- .../services/otherservice.js | 9 +- .../greetservice.js | 14 +- .../models.js | 2 +- .../services/other/models.js | 2 +- .../services/other/otherservice.js | 9 +- .../function_multiple_files/greetservice.js | 7 +- .../testcases/function_single/greetservice.js | 7 +- .../function_single_context/greetservice.js | 12 +- .../function_single_internal/greetservice.js | 7 +- .../generator/testcases/map_keys/models.js | 48 ++-- .../generator/testcases/map_keys/service.js | 9 +- .../generator/testcases/marshalers/models.js | 2 +- .../generator/testcases/marshalers/service.js | 9 +- .../testcases/no_bindings_here/models.js | 8 +- .../no_bindings_here/other/models.js | 6 +- .../no_bindings_here/other/othermethods.js | 7 +- .../testcases/no_bindings_here/somemethods.js | 14 +- .../testcases/out_of_tree/embedother.js | 7 +- .../testcases/out_of_tree/embedservice.js | 14 +- .../testcases/out_of_tree/greetservice.js | 7 +- .../struct_literal_multiple/greetservice.js | 7 +- .../struct_literal_multiple/otherservice.js | 7 +- .../greetservice.js | 7 +- .../otherservice.js | 7 +- .../greetservice.js | 14 +- .../struct_literal_multiple_other/models.js | 2 +- .../services/models.js | 2 +- .../services/otherservice.js | 9 +- .../greetservice.js | 229 +++++++---------- .../models.js | 2 +- .../struct_literal_single/greetservice.js | 229 +++++++---------- .../testcases/struct_literal_single/models.js | 2 +- .../testcases/variable_single/greetservice.js | 7 +- .../greetservice.js | 7 +- .../greetservice.js | 14 +- .../models.js | 2 +- .../services/models.js | 2 +- .../services/otherservice.js | 9 +- .../testcases/aliases/greetservice.js | 32 +-- .../complex_expressions/config/service7.js | 7 +- .../complex_expressions/config/service9.js | 7 +- .../testcases/complex_json/greetservice.js | 7 +- .../testcases/complex_method/greetservice.js | 7 +- .../testcases/cyclic_imports/greetservice.js | 7 +- .../testcases/cyclic_types/greetservice.js | 7 +- .../testcases/directives/internalservice.js | 7 +- .../generator/testcases/directives/service.js | 12 +- .../testcases/directives/unexportedservice.js | 7 +- .../embedded_interface/greetservice.js | 27 +- .../generator/testcases/enum/greetservice.js | 12 +- .../greetservice.js | 7 +- .../greetservice.js | 12 +- .../services/otherservice.js | 7 +- .../greetservice.js | 12 +- .../services/other/otherservice.js | 7 +- .../function_multiple_files/greetservice.js | 7 +- .../testcases/function_single/greetservice.js | 7 +- .../function_single_context/greetservice.js | 12 +- .../function_single_internal/greetservice.js | 7 +- .../generator/testcases/map_keys/service.js | 7 +- .../generator/testcases/marshalers/service.js | 7 +- .../no_bindings_here/other/othermethods.js | 7 +- .../testcases/no_bindings_here/somemethods.js | 12 +- .../testcases/out_of_tree/embedother.js | 7 +- .../testcases/out_of_tree/embedservice.js | 12 +- .../testcases/out_of_tree/greetservice.js | 7 +- .../struct_literal_multiple/greetservice.js | 7 +- .../struct_literal_multiple/otherservice.js | 7 +- .../greetservice.js | 7 +- .../otherservice.js | 7 +- .../greetservice.js | 12 +- .../services/otherservice.js | 7 +- .../greetservice.js | 217 +++++++--------- .../struct_literal_single/greetservice.js | 217 +++++++--------- .../testcases/variable_single/greetservice.js | 7 +- .../greetservice.js | 7 +- .../greetservice.js | 12 +- .../services/otherservice.js | 7 +- .../testcases/aliases/greetservice.js | 32 +-- .../complex_expressions/config/service7.js | 7 +- .../complex_expressions/config/service9.js | 7 +- .../testcases/complex_json/greetservice.js | 7 +- .../testcases/complex_method/greetservice.js | 7 +- .../testcases/cyclic_imports/greetservice.js | 7 +- .../testcases/cyclic_types/greetservice.js | 7 +- .../testcases/directives/internalservice.js | 7 +- .../generator/testcases/directives/service.js | 12 +- .../testcases/directives/unexportedservice.js | 7 +- .../embedded_interface/greetservice.js | 27 +- .../generator/testcases/enum/greetservice.js | 12 +- .../greetservice.js | 7 +- .../greetservice.js | 12 +- .../services/otherservice.js | 7 +- .../greetservice.js | 12 +- .../services/other/otherservice.js | 7 +- .../function_multiple_files/greetservice.js | 7 +- .../testcases/function_single/greetservice.js | 7 +- .../function_single_context/greetservice.js | 12 +- .../function_single_internal/greetservice.js | 7 +- .../generator/testcases/map_keys/service.js | 7 +- .../generator/testcases/marshalers/service.js | 7 +- .../no_bindings_here/other/othermethods.js | 7 +- .../testcases/no_bindings_here/somemethods.js | 12 +- .../testcases/out_of_tree/embedother.js | 7 +- .../testcases/out_of_tree/embedservice.js | 12 +- .../testcases/out_of_tree/greetservice.js | 7 +- .../struct_literal_multiple/greetservice.js | 7 +- .../struct_literal_multiple/otherservice.js | 7 +- .../greetservice.js | 7 +- .../otherservice.js | 7 +- .../greetservice.js | 12 +- .../services/otherservice.js | 7 +- .../greetservice.js | 217 +++++++--------- .../struct_literal_single/greetservice.js | 217 +++++++--------- .../testcases/variable_single/greetservice.js | 7 +- .../greetservice.js | 7 +- .../greetservice.js | 12 +- .../services/otherservice.js | 7 +- .../UseNames=false/encoding/json/models.ts | 2 +- .../UseNames=false/encoding/models.ts | 2 +- .../testcases/aliases/greetservice.ts | 56 ++-- .../generator/testcases/aliases/models.ts | 4 +- .../complex_expressions/config/service7.ts | 7 +- .../complex_expressions/config/service9.ts | 7 +- .../testcases/complex_json/greetservice.ts | 7 +- .../testcases/complex_json/models.ts | 2 +- .../testcases/complex_method/greetservice.ts | 11 +- .../testcases/complex_method/models.ts | 2 +- .../testcases/cyclic_imports/greetservice.ts | 11 +- .../testcases/cyclic_imports/models.ts | 2 +- .../testcases/cyclic_types/greetservice.ts | 17 +- .../testcases/cyclic_types/models.ts | 2 +- .../testcases/directives/internalservice.ts | 7 +- .../generator/testcases/directives/models.ts | 2 +- .../directives/otherpackage/models.ts | 2 +- .../generator/testcases/directives/service.ts | 12 +- .../testcases/directives/unexportedservice.ts | 7 +- .../embedded_interface/greetservice.ts | 27 +- .../generator/testcases/enum/greetservice.ts | 16 +- .../generator/testcases/enum/models.ts | 2 +- .../greetservice.ts | 7 +- .../services/models.ts | 2 +- .../greetservice.ts | 16 +- .../function_from_imported_package/models.ts | 2 +- .../services/models.ts | 2 +- .../services/otherservice.ts | 11 +- .../greetservice.ts | 16 +- .../models.ts | 2 +- .../services/other/models.ts | 2 +- .../services/other/otherservice.ts | 11 +- .../function_multiple_files/greetservice.ts | 7 +- .../testcases/function_single/greetservice.ts | 7 +- .../function_single_context/greetservice.ts | 12 +- .../function_single_internal/greetservice.ts | 7 +- .../generator/testcases/map_keys/models.ts | 40 +-- .../generator/testcases/map_keys/service.ts | 11 +- .../generator/testcases/marshalers/models.ts | 2 +- .../generator/testcases/marshalers/service.ts | 11 +- .../testcases/no_bindings_here/models.ts | 8 +- .../no_bindings_here/other/models.ts | 6 +- .../no_bindings_here/other/othermethods.ts | 7 +- .../testcases/no_bindings_here/somemethods.ts | 16 +- .../testcases/out_of_tree/embedother.ts | 7 +- .../testcases/out_of_tree/embedservice.ts | 16 +- .../testcases/out_of_tree/greetservice.ts | 7 +- .../struct_literal_multiple/greetservice.ts | 7 +- .../struct_literal_multiple/otherservice.ts | 7 +- .../greetservice.ts | 7 +- .../otherservice.ts | 7 +- .../greetservice.ts | 16 +- .../struct_literal_multiple_other/models.ts | 2 +- .../services/models.ts | 2 +- .../services/otherservice.ts | 11 +- .../greetservice.ts | 241 +++++++----------- .../models.ts | 2 +- .../struct_literal_single/greetservice.ts | 241 +++++++----------- .../testcases/struct_literal_single/models.ts | 2 +- .../testcases/variable_single/greetservice.ts | 7 +- .../greetservice.ts | 7 +- .../greetservice.ts | 16 +- .../models.ts | 2 +- .../services/models.ts | 2 +- .../services/otherservice.ts | 11 +- .../UseNames=true/encoding/json/models.ts | 2 +- .../UseNames=true/encoding/models.ts | 2 +- .../testcases/aliases/greetservice.ts | 56 ++-- .../generator/testcases/aliases/models.ts | 4 +- .../complex_expressions/config/service7.ts | 7 +- .../complex_expressions/config/service9.ts | 7 +- .../testcases/complex_json/greetservice.ts | 7 +- .../testcases/complex_json/models.ts | 2 +- .../testcases/complex_method/greetservice.ts | 11 +- .../testcases/complex_method/models.ts | 2 +- .../testcases/cyclic_imports/greetservice.ts | 11 +- .../testcases/cyclic_imports/models.ts | 2 +- .../testcases/cyclic_types/greetservice.ts | 17 +- .../testcases/cyclic_types/models.ts | 2 +- .../testcases/directives/internalservice.ts | 7 +- .../generator/testcases/directives/models.ts | 2 +- .../directives/otherpackage/models.ts | 2 +- .../generator/testcases/directives/service.ts | 12 +- .../testcases/directives/unexportedservice.ts | 7 +- .../embedded_interface/greetservice.ts | 27 +- .../generator/testcases/enum/greetservice.ts | 16 +- .../generator/testcases/enum/models.ts | 2 +- .../greetservice.ts | 7 +- .../services/models.ts | 2 +- .../greetservice.ts | 16 +- .../function_from_imported_package/models.ts | 2 +- .../services/models.ts | 2 +- .../services/otherservice.ts | 11 +- .../greetservice.ts | 16 +- .../models.ts | 2 +- .../services/other/models.ts | 2 +- .../services/other/otherservice.ts | 11 +- .../function_multiple_files/greetservice.ts | 7 +- .../testcases/function_single/greetservice.ts | 7 +- .../function_single_context/greetservice.ts | 12 +- .../function_single_internal/greetservice.ts | 7 +- .../generator/testcases/map_keys/models.ts | 40 +-- .../generator/testcases/map_keys/service.ts | 11 +- .../generator/testcases/marshalers/models.ts | 2 +- .../generator/testcases/marshalers/service.ts | 11 +- .../testcases/no_bindings_here/models.ts | 8 +- .../no_bindings_here/other/models.ts | 6 +- .../no_bindings_here/other/othermethods.ts | 7 +- .../testcases/no_bindings_here/somemethods.ts | 16 +- .../testcases/out_of_tree/embedother.ts | 7 +- .../testcases/out_of_tree/embedservice.ts | 16 +- .../testcases/out_of_tree/greetservice.ts | 7 +- .../struct_literal_multiple/greetservice.ts | 7 +- .../struct_literal_multiple/otherservice.ts | 7 +- .../greetservice.ts | 7 +- .../otherservice.ts | 7 +- .../greetservice.ts | 16 +- .../struct_literal_multiple_other/models.ts | 2 +- .../services/models.ts | 2 +- .../services/otherservice.ts | 11 +- .../greetservice.ts | 241 +++++++----------- .../models.ts | 2 +- .../struct_literal_single/greetservice.ts | 241 +++++++----------- .../testcases/struct_literal_single/models.ts | 2 +- .../testcases/variable_single/greetservice.ts | 7 +- .../greetservice.ts | 7 +- .../greetservice.ts | 16 +- .../models.ts | 2 +- .../services/models.ts | 2 +- .../services/otherservice.ts | 11 +- .../testcases/aliases/greetservice.ts | 32 +-- .../complex_expressions/config/service7.ts | 7 +- .../complex_expressions/config/service9.ts | 7 +- .../testcases/complex_json/greetservice.ts | 7 +- .../testcases/complex_method/greetservice.ts | 7 +- .../testcases/cyclic_imports/greetservice.ts | 7 +- .../testcases/cyclic_types/greetservice.ts | 7 +- .../testcases/directives/internalservice.ts | 7 +- .../generator/testcases/directives/service.ts | 12 +- .../testcases/directives/unexportedservice.ts | 7 +- .../embedded_interface/greetservice.ts | 27 +- .../generator/testcases/enum/greetservice.ts | 12 +- .../greetservice.ts | 7 +- .../greetservice.ts | 12 +- .../services/otherservice.ts | 7 +- .../greetservice.ts | 12 +- .../services/other/otherservice.ts | 7 +- .../function_multiple_files/greetservice.ts | 7 +- .../testcases/function_single/greetservice.ts | 7 +- .../function_single_context/greetservice.ts | 12 +- .../function_single_internal/greetservice.ts | 7 +- .../generator/testcases/map_keys/service.ts | 7 +- .../generator/testcases/marshalers/service.ts | 7 +- .../no_bindings_here/other/othermethods.ts | 7 +- .../testcases/no_bindings_here/somemethods.ts | 12 +- .../testcases/out_of_tree/embedother.ts | 7 +- .../testcases/out_of_tree/embedservice.ts | 12 +- .../testcases/out_of_tree/greetservice.ts | 7 +- .../struct_literal_multiple/greetservice.ts | 7 +- .../struct_literal_multiple/otherservice.ts | 7 +- .../greetservice.ts | 7 +- .../otherservice.ts | 7 +- .../greetservice.ts | 12 +- .../services/otherservice.ts | 7 +- .../greetservice.ts | 217 +++++++--------- .../struct_literal_single/greetservice.ts | 217 +++++++--------- .../testcases/variable_single/greetservice.ts | 7 +- .../greetservice.ts | 7 +- .../greetservice.ts | 12 +- .../services/otherservice.ts | 7 +- .../testcases/aliases/greetservice.ts | 32 +-- .../complex_expressions/config/service7.ts | 7 +- .../complex_expressions/config/service9.ts | 7 +- .../testcases/complex_json/greetservice.ts | 7 +- .../testcases/complex_method/greetservice.ts | 7 +- .../testcases/cyclic_imports/greetservice.ts | 7 +- .../testcases/cyclic_types/greetservice.ts | 7 +- .../testcases/directives/internalservice.ts | 7 +- .../generator/testcases/directives/service.ts | 12 +- .../testcases/directives/unexportedservice.ts | 7 +- .../embedded_interface/greetservice.ts | 27 +- .../generator/testcases/enum/greetservice.ts | 12 +- .../greetservice.ts | 7 +- .../greetservice.ts | 12 +- .../services/otherservice.ts | 7 +- .../greetservice.ts | 12 +- .../services/other/otherservice.ts | 7 +- .../function_multiple_files/greetservice.ts | 7 +- .../testcases/function_single/greetservice.ts | 7 +- .../function_single_context/greetservice.ts | 12 +- .../function_single_internal/greetservice.ts | 7 +- .../generator/testcases/map_keys/service.ts | 7 +- .../generator/testcases/marshalers/service.ts | 7 +- .../no_bindings_here/other/othermethods.ts | 7 +- .../testcases/no_bindings_here/somemethods.ts | 12 +- .../testcases/out_of_tree/embedother.ts | 7 +- .../testcases/out_of_tree/embedservice.ts | 12 +- .../testcases/out_of_tree/greetservice.ts | 7 +- .../struct_literal_multiple/greetservice.ts | 7 +- .../struct_literal_multiple/otherservice.ts | 7 +- .../greetservice.ts | 7 +- .../otherservice.ts | 7 +- .../greetservice.ts | 12 +- .../services/otherservice.ts | 7 +- .../greetservice.ts | 217 +++++++--------- .../struct_literal_single/greetservice.ts | 217 +++++++--------- .../testcases/variable_single/greetservice.ts | 7 +- .../greetservice.ts | 7 +- .../greetservice.ts | 12 +- .../services/otherservice.ts | 7 +- 420 files changed, 2882 insertions(+), 4274 deletions(-) diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/encoding/json/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/encoding/json/models.js index b7e840816..96abf0ef1 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/encoding/json/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/encoding/json/models.js @@ -4,7 +4,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; /** * Marshaler is the interface implemented by types that diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/encoding/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/encoding/models.js index bbabe728a..59cfef5bd 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/encoding/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/encoding/models.js @@ -4,7 +4,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; /** * TextMarshaler is the interface implemented by an object that can diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.js index 50edc1ec1..fcbd41a3a 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -22,81 +22,63 @@ import * as $models from "./models.js"; /** * Get someone. * @param {$models.Alias} aliasValue - * @returns {Promise<$models.Person> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Person>} */ export function Get(aliasValue) { - let $resultPromise = /** @type {any} */($Call.ByID(1928502664, aliasValue)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByID(1928502664, aliasValue).then(/** @type {($result: any) => any} */(($result) => { return $$createType0($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } /** * Apparently, aliases are all the rage right now. * @param {$models.AliasedPerson} p - * @returns {Promise<$models.StrangelyAliasedPerson> & { cancel(): void }} + * @returns {$CancellablePromise<$models.StrangelyAliasedPerson>} */ export function GetButAliased(p) { - let $resultPromise = /** @type {any} */($Call.ByID(1896499664, p)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByID(1896499664, p).then(/** @type {($result: any) => any} */(($result) => { return $$createType0($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } /** * Get someone quite different. - * @returns {Promise<$models.GenericPerson> & { cancel(): void }} + * @returns {$CancellablePromise<$models.GenericPerson>} */ export function GetButDifferent() { - let $resultPromise = /** @type {any} */($Call.ByID(2240931744)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByID(2240931744).then(/** @type {($result: any) => any} */(($result) => { return $$createType1($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } /** - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function GetButForeignPrivateAlias() { - let $resultPromise = /** @type {any} */($Call.ByID(643456960)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByID(643456960).then(/** @type {($result: any) => any} */(($result) => { return $$createType2($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } /** - * @returns {Promise<$models.AliasGroup> & { cancel(): void }} + * @returns {$CancellablePromise<$models.AliasGroup>} */ export function GetButGenericAliases() { - let $resultPromise = /** @type {any} */($Call.ByID(914093800)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByID(914093800).then(/** @type {($result: any) => any} */(($result) => { return $$createType3($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } /** * Greet a lot of unusual things. * @param {$models.EmptyAliasStruct} $0 * @param {$models.EmptyStruct} $1 - * @returns {Promise<$models.AliasStruct> & { cancel(): void }} + * @returns {$CancellablePromise<$models.AliasStruct>} */ export function Greet($0, $1) { - let $resultPromise = /** @type {any} */($Call.ByID(1411160069, $0, $1)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByID(1411160069, $0, $1).then(/** @type {($result: any) => any} */(($result) => { return $$createType7($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/models.js index 977ad4722..3de57786d 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/models.js @@ -4,7 +4,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; /** * A nice type Alias. @@ -203,7 +203,7 @@ export class GenericPerson { * Given creation functions for each type parameter, * returns a creation function for a concrete instance * of the generic class GenericPerson. - * @template T + * @template [T=any] * @param {(source: any) => T} $$createParamT * @returns {($$source?: any) => GenericPerson} */ diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service7.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service7.js index b4d6bd47d..42219054f 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service7.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service7.js @@ -4,12 +4,11 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; /** - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function TestMethod() { - let $resultPromise = /** @type {any} */($Call.ByID(2241101727)); - return $resultPromise; + return $Call.ByID(2241101727); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service9.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service9.js index 389469d63..5e27fbc9e 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service9.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service9.js @@ -4,12 +4,11 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; /** - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function TestMethod2() { - let $resultPromise = /** @type {any} */($Call.ByID(1556848345)); - return $resultPromise; + return $Call.ByID(1556848345); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_json/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_json/greetservice.js index 91b7651a8..fa634943d 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_json/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_json/greetservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -19,9 +19,8 @@ import * as $models from "./models.js"; * Greet does XYZ * @param {$models.Person} person * @param {$models.Embedded1} emb - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(person, emb) { - let $resultPromise = /** @type {any} */($Call.ByID(1411160069, person, emb)); - return $resultPromise; + return $Call.ByID(1411160069, person, emb); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_json/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_json/models.js index d6da8c762..7a0edf1c7 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_json/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_json/models.js @@ -4,7 +4,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; export class Embedded1 { /** diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_method/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_method/greetservice.js index 6298ac99b..35fac10f2 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_method/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_method/greetservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -25,17 +25,14 @@ import * as $models from "./models.js"; * @param {{ [_: `${number}`]: boolean | null }} assoc * @param {(number | null)[]} $4 * @param {string[]} other - * @returns {Promise<[$models.Person, any, number[]]> & { cancel(): void }} + * @returns {$CancellablePromise<[$models.Person, any, number[]]>} */ export function Greet(str, people, $2, assoc, $4, ...other) { - let $resultPromise = /** @type {any} */($Call.ByID(1411160069, str, people, $2, assoc, $4, other)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByID(1411160069, str, people, $2, assoc, $4, other).then(/** @type {($result: any) => any} */(($result) => { $result[0] = $$createType0($result[0]); $result[2] = $$createType1($result[2]); return $result; })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_method/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_method/models.js index 70a01e64c..82af81baf 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_method/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_method/models.js @@ -4,7 +4,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; /** * Person represents a person diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_imports/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_imports/greetservice.js index 3ad458498..29255dd9c 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_imports/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_imports/greetservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,17 +17,14 @@ import * as $models from "./models.js"; /** * Make a cycle. - * @returns {Promise<[$models.StructA, $models.StructC]> & { cancel(): void }} + * @returns {$CancellablePromise<[$models.StructA, $models.StructC]>} */ export function MakeCycles() { - let $resultPromise = /** @type {any} */($Call.ByID(440020721)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByID(440020721).then(/** @type {($result: any) => any} */(($result) => { $result[0] = $$createType0($result[0]); $result[1] = $$createType1($result[1]); return $result; })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_imports/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_imports/models.js index d101a661f..f24f5a2c9 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_imports/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_imports/models.js @@ -4,7 +4,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; export class StructA { /** diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_types/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_types/greetservice.js index 428da2dbd..faf090884 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_types/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_types/greetservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,17 +17,14 @@ import * as $models from "./models.js"; /** * Make a cycle. - * @returns {Promise<[$models.Cyclic, $models.GenericCyclic<$models.GenericCyclic>]> & { cancel(): void }} + * @returns {$CancellablePromise<[$models.Cyclic, $models.GenericCyclic<$models.GenericCyclic>]>} */ export function MakeCycles() { - let $resultPromise = /** @type {any} */($Call.ByID(440020721)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByID(440020721).then(/** @type {($result: any) => any} */(($result) => { $result[0] = $$createType0($result[0]); $result[1] = $$createType9($result[1]); return $result; })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_types/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_types/models.js index f4a68bd4b..47d41f572 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_types/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_types/models.js @@ -4,7 +4,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; /** * @typedef {Cyclic | null} Alias diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/internalservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/internalservice.js index b1523d411..fce17fb1d 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/internalservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/internalservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,9 +17,8 @@ import * as $models from "./models.js"; /** * @param {$models.InternalModel} $0 - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Method($0) { - let $resultPromise = /** @type {any} */($Call.ByID(538079117, $0)); - return $resultPromise; + return $Call.ByID(538079117, $0); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/models.js index fad4870ca..291a3cecf 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/models.js @@ -4,7 +4,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; /** * An exported but internal model. diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/otherpackage/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/otherpackage/models.js index b38ff6238..274f4eed4 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/otherpackage/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/otherpackage/models.js @@ -4,7 +4,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; export class Dummy { /** diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/service.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/service.js index 8a2f4b65b..cc7ed89d3 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/service.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/service.js @@ -4,7 +4,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -12,20 +12,18 @@ import * as otherpackage$0 from "./otherpackage/models.js"; /** * @param {string} $0 - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ function InternalMethod($0) { - let $resultPromise = /** @type {any} */($Call.ByID(3518775569, $0)); - return $resultPromise; + return $Call.ByID(3518775569, $0); } /** * @param {otherpackage$0.Dummy} $0 - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function VisibleMethod($0) { - let $resultPromise = /** @type {any} */($Call.ByID(474018228, $0)); - return $resultPromise; + return $Call.ByID(474018228, $0); } /** diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/unexportedservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/unexportedservice.js index 325ddfe88..d3f53be87 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/unexportedservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/unexportedservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,9 +17,8 @@ import * as $models from "./models.js"; /** * @param {$models.unexportedModel} $0 - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Method($0) { - let $resultPromise = /** @type {any} */($Call.ByID(37626172, $0)); - return $resultPromise; + return $Call.ByID(37626172, $0); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/embedded_interface/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/embedded_interface/greetservice.js index 4648c8d37..a178744b9 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/embedded_interface/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/embedded_interface/greetservice.js @@ -9,50 +9,45 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; /** * Comment 1. - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Method1() { - let $resultPromise = /** @type {any} */($Call.ByID(841558284)); - return $resultPromise; + return $Call.ByID(841558284); } /** * Comment 2. - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Method2() { - let $resultPromise = /** @type {any} */($Call.ByID(891891141)); - return $resultPromise; + return $Call.ByID(891891141); } /** * Comment 3a. * Comment 3b. - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Method3() { - let $resultPromise = /** @type {any} */($Call.ByID(875113522)); - return $resultPromise; + return $Call.ByID(875113522); } /** * Comment 4. - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Method4() { - let $resultPromise = /** @type {any} */($Call.ByID(791225427)); - return $resultPromise; + return $Call.ByID(791225427); } /** * Comment 5. - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Method5() { - let $resultPromise = /** @type {any} */($Call.ByID(774447808)); - return $resultPromise; + return $Call.ByID(774447808); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/enum/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/enum/greetservice.js index 61730be16..ed402a8b2 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/enum/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/enum/greetservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -19,25 +19,21 @@ import * as $models from "./models.js"; * Greet does XYZ * @param {string} name * @param {$models.Title} title - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name, title) { - let $resultPromise = /** @type {any} */($Call.ByID(1411160069, name, title)); - return $resultPromise; + return $Call.ByID(1411160069, name, title); } /** * NewPerson creates a new person * @param {string} name - * @returns {Promise<$models.Person | null> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Person | null>} */ export function NewPerson(name) { - let $resultPromise = /** @type {any} */($Call.ByID(1661412647, name)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByID(1661412647, name).then(/** @type {($result: any) => any} */(($result) => { return $$createType1($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/enum/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/enum/models.js index cad356265..2c5df9ee7 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/enum/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/enum/models.js @@ -4,7 +4,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; /** * Age is an integer with some predefined values diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/enum_from_imported_package/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/enum_from_imported_package/greetservice.js index 0de466bab..fbc2294e9 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/enum_from_imported_package/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/enum_from_imported_package/greetservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -19,9 +19,8 @@ import * as services$0 from "./services/models.js"; * Greet does XYZ * @param {string} name * @param {services$0.Title} title - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name, title) { - let $resultPromise = /** @type {any} */($Call.ByID(1411160069, name, title)); - return $resultPromise; + return $Call.ByID(1411160069, name, title); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/enum_from_imported_package/services/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/enum_from_imported_package/services/models.js index 0e7acabe2..65ebfa2f7 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/enum_from_imported_package/services/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/enum_from_imported_package/services/models.js @@ -4,7 +4,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; /** * @readonly diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/greetservice.js index 5f8cf55b5..50737a34b 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/greetservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -18,25 +18,21 @@ import * as $models from "./models.js"; /** * Greet does XYZ * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name) { - let $resultPromise = /** @type {any} */($Call.ByID(1411160069, name)); - return $resultPromise; + return $Call.ByID(1411160069, name); } /** * NewPerson creates a new person * @param {string} name - * @returns {Promise<$models.Person | null> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Person | null>} */ export function NewPerson(name) { - let $resultPromise = /** @type {any} */($Call.ByID(1661412647, name)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByID(1661412647, name).then(/** @type {($result: any) => any} */(($result) => { return $$createType1($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/models.js index 860939563..0ab295133 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/models.js @@ -4,7 +4,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/services/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/services/models.js index fb1176dee..24a5de807 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/services/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/services/models.js @@ -4,7 +4,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; export class Address { /** diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/services/otherservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/services/otherservice.js index 447b0a588..1866aca09 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/services/otherservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/services/otherservice.js @@ -10,7 +10,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -18,15 +18,12 @@ import * as $models from "./models.js"; /** * Yay does this and that - * @returns {Promise<$models.Address | null> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Address | null>} */ export function Yay() { - let $resultPromise = /** @type {any} */($Call.ByID(2007737399)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByID(2007737399).then(/** @type {($result: any) => any} */(($result) => { return $$createType1($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/greetservice.js index 5f8cf55b5..50737a34b 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/greetservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -18,25 +18,21 @@ import * as $models from "./models.js"; /** * Greet does XYZ * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name) { - let $resultPromise = /** @type {any} */($Call.ByID(1411160069, name)); - return $resultPromise; + return $Call.ByID(1411160069, name); } /** * NewPerson creates a new person * @param {string} name - * @returns {Promise<$models.Person | null> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Person | null>} */ export function NewPerson(name) { - let $resultPromise = /** @type {any} */($Call.ByID(1661412647, name)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByID(1661412647, name).then(/** @type {($result: any) => any} */(($result) => { return $$createType1($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/models.js index 5b28ee2f6..29a95e11e 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/models.js @@ -4,7 +4,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/services/other/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/services/other/models.js index fb1176dee..24a5de807 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/services/other/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/services/other/models.js @@ -4,7 +4,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; export class Address { /** diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/services/other/otherservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/services/other/otherservice.js index 4bece70b6..293a2f0bb 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/services/other/otherservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/services/other/otherservice.js @@ -10,7 +10,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -18,15 +18,12 @@ import * as $models from "./models.js"; /** * Yay does this and that - * @returns {Promise<$models.Address | null> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Address | null>} */ export function Yay() { - let $resultPromise = /** @type {any} */($Call.ByID(2447353446)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByID(2447353446).then(/** @type {($result: any) => any} */(($result) => { return $$createType1($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_multiple_files/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_multiple_files/greetservice.js index 0c282e914..e50a4a6ab 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_multiple_files/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_multiple_files/greetservice.js @@ -4,13 +4,12 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; /** * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name) { - let $resultPromise = /** @type {any} */($Call.ByID(1411160069, name)); - return $resultPromise; + return $Call.ByID(1411160069, name); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single/greetservice.js index d20ce5791..9dfe48511 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single/greetservice.js @@ -9,14 +9,13 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; /** * Greet someone * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name) { - let $resultPromise = /** @type {any} */($Call.ByID(1411160069, name)); - return $resultPromise; + return $Call.ByID(1411160069, name); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_context/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_context/greetservice.js index 4e54dc0c8..1bc7cb45b 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_context/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_context/greetservice.js @@ -9,24 +9,22 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; /** * Greet someone * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name) { - let $resultPromise = /** @type {any} */($Call.ByID(1411160069, name)); - return $resultPromise; + return $Call.ByID(1411160069, name); } /** * Greet someone * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function GreetWithContext(name) { - let $resultPromise = /** @type {any} */($Call.ByID(1310150960, name)); - return $resultPromise; + return $Call.ByID(1310150960, name); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_internal/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_internal/greetservice.js index d20ce5791..9dfe48511 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_internal/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_internal/greetservice.js @@ -9,14 +9,13 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; /** * Greet someone * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name) { - let $resultPromise = /** @type {any} */($Call.ByID(1411160069, name)); - return $resultPromise; + return $Call.ByID(1411160069, name); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/models.js index 960844103..1dc5bfc38 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/models.js @@ -4,7 +4,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; /** * @template S @@ -1227,7 +1227,15 @@ export class Maps { * Given creation functions for each type parameter, * returns a creation function for a concrete instance * of the generic class Maps. - * @template R,S,T,U,V,W,X,Y,Z + * @template [R=any] + * @template [S=any] + * @template [T=any] + * @template [U=any] + * @template [V=any] + * @template [W=any] + * @template [X=any] + * @template [Y=any] + * @template [Z=any] * @param {(source: any) => R} $$createParamR * @param {(source: any) => S} $$createParamS * @param {(source: any) => T} $$createParamT @@ -1926,24 +1934,24 @@ const $$createType55 = $Create.Map($Create.Any, $Create.Any); const $$createType56 = $Create.Map($Create.Any, $Create.Any); const $$createType57 = $Create.Map($Create.Any, $Create.Any); const $$createType58 = $Create.Map($Create.Any, $Create.Any); -const $$createType59 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType60 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType61 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType62 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType63 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType64 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType65 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType66 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType67 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType68 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType69 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType70 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType71 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType72 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType73 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType74 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType75 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType76 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); +const $$createType59 = /** @type {(...args: any[]) => any} */(($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any)); +const $$createType60 = /** @type {(...args: any[]) => any} */(($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any)); +const $$createType61 = /** @type {(...args: any[]) => any} */(($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any)); +const $$createType62 = /** @type {(...args: any[]) => any} */(($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any)); +const $$createType63 = /** @type {(...args: any[]) => any} */(($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any)); +const $$createType64 = /** @type {(...args: any[]) => any} */(($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any)); +const $$createType65 = /** @type {(...args: any[]) => any} */(($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any)); +const $$createType66 = /** @type {(...args: any[]) => any} */(($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any)); +const $$createType67 = /** @type {(...args: any[]) => any} */(($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any)); +const $$createType68 = /** @type {(...args: any[]) => any} */(($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any)); +const $$createType69 = /** @type {(...args: any[]) => any} */(($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any)); +const $$createType70 = /** @type {(...args: any[]) => any} */(($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any)); +const $$createType71 = /** @type {(...args: any[]) => any} */(($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any)); +const $$createType72 = /** @type {(...args: any[]) => any} */(($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any)); +const $$createType73 = /** @type {(...args: any[]) => any} */(($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any)); +const $$createType74 = /** @type {(...args: any[]) => any} */(($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any)); +const $$createType75 = /** @type {(...args: any[]) => any} */(($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any)); +const $$createType76 = /** @type {(...args: any[]) => any} */(($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any)); const $$createType77 = $Create.Map($Create.Any, $Create.Any); const $$createType78 = $Create.Map($Create.Any, $Create.Any); const $$createType79 = $Create.Map($Create.Any, $Create.Any); diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/service.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/service.js index bca8b3182..870b2804b 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/service.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/service.js @@ -4,22 +4,19 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports import * as $models from "./models.js"; /** - * @returns {Promise<$models.Maps<$models.PointerTextMarshaler, number, number, $models.ValueTextMarshaler, $models.PointerTextMarshaler | null, $models.ValueTextMarshaler, $models.StringType, $models.ValueTextMarshaler, $models.PointerTextMarshaler | null>> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Maps<$models.PointerTextMarshaler, number, number, $models.ValueTextMarshaler, $models.PointerTextMarshaler | null, $models.ValueTextMarshaler, $models.StringType, $models.ValueTextMarshaler, $models.PointerTextMarshaler | null>>} */ export function Method() { - let $resultPromise = /** @type {any} */($Call.ByID(4021345184)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByID(4021345184).then(/** @type {($result: any) => any} */(($result) => { return $$createType0($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/marshalers/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/marshalers/models.js index 1871e9492..77fe552ea 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/marshalers/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/marshalers/models.js @@ -4,7 +4,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/marshalers/service.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/marshalers/service.js index 8e10d60e3..5b415f83e 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/marshalers/service.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/marshalers/service.js @@ -4,22 +4,19 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports import * as $models from "./models.js"; /** - * @returns {Promise<$models.Data> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Data>} */ export function Method() { - let $resultPromise = /** @type {any} */($Call.ByID(4021345184)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByID(4021345184).then(/** @type {($result: any) => any} */(($result) => { return $$createType0($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/models.js index f88aa955a..b42e223fa 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/models.js @@ -4,7 +4,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -45,7 +45,7 @@ export class HowDifferent { * Given creation functions for each type parameter, * returns a creation function for a concrete instance * of the generic class HowDifferent. - * @template How + * @template [How=any] * @param {(source: any) => How} $$createParamHow * @returns {($$source?: any) => HowDifferent} */ @@ -175,7 +175,7 @@ export const PrivatePerson = personImpl; */ // Private type creation functions -const $$createType0 = ($$createParamHow) => $Create.Map($Create.Any, $$createParamHow); -const $$createType1 = ($$createParamHow) => $Create.Array($$createType0($$createParamHow)); +const $$createType0 = /** @type {(...args: any[]) => any} */(($$createParamHow) => $Create.Map($Create.Any, $$createParamHow)); +const $$createType1 = /** @type {(...args: any[]) => any} */(($$createParamHow) => $Create.Array($$createType0($$createParamHow))); const $$createType2 = other$0.OtherPerson.createFrom($Create.Any); const $$createType3 = $Create.Array($$createType2); diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/other/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/other/models.js index c10d33908..89992cacf 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/other/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/other/models.js @@ -4,7 +4,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; /** * OtherPerson is like a person, but different. @@ -40,7 +40,7 @@ export class OtherPerson { * Given creation functions for each type parameter, * returns a creation function for a concrete instance * of the generic class OtherPerson. - * @template T + * @template [T=any] * @param {(source: any) => T} $$createParamT * @returns {($$source?: any) => OtherPerson} */ @@ -57,4 +57,4 @@ export class OtherPerson { } // Private type creation functions -const $$createType0 = ($$createParamT) => $Create.Array($$createParamT); +const $$createType0 = /** @type {(...args: any[]) => any} */(($$createParamT) => $Create.Array($$createParamT)); diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/other/othermethods.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/other/othermethods.js index 9971a1759..36b25c183 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/other/othermethods.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/other/othermethods.js @@ -9,13 +9,12 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; /** * LikeThisOtherOne does nothing as well, but is different. - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function LikeThisOtherOne() { - let $resultPromise = /** @type {any} */($Call.ByID(3606939272)); - return $resultPromise; + return $Call.ByID(3606939272); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/somemethods.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/somemethods.js index 9613f1c61..a87ccf6c4 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/somemethods.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/somemethods.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,27 +17,23 @@ import * as $models from "./models.js"; /** * LikeThisOne is an example method that does nothing. - * @returns {Promise<[$models.Person, $models.HowDifferent, $models.PrivatePerson]> & { cancel(): void }} + * @returns {$CancellablePromise<[$models.Person, $models.HowDifferent, $models.PrivatePerson]>} */ export function LikeThisOne() { - let $resultPromise = /** @type {any} */($Call.ByID(2124352079)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByID(2124352079).then(/** @type {($result: any) => any} */(($result) => { $result[0] = $$createType0($result[0]); $result[1] = $$createType1($result[1]); $result[2] = $$createType2($result[2]); return $result; })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } /** * LikeThisOtherOne does nothing as well, but is different. - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function LikeThisOtherOne() { - let $resultPromise = /** @type {any} */($Call.ByID(4281222271)); - return $resultPromise; + return $Call.ByID(4281222271); } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedother.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedother.js index 6b333bbd2..5fb44fbc6 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedother.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedother.js @@ -9,13 +9,12 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; /** * LikeThisOtherOne does nothing as well, but is different. - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function LikeThisOtherOne() { - let $resultPromise = /** @type {any} */($Call.ByID(3566862802)); - return $resultPromise; + return $Call.ByID(3566862802); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedservice.js index bac3669ab..5ec6c820e 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,27 +17,23 @@ import * as nobindingshere$0 from "../no_bindings_here/models.js"; /** * LikeThisOne is an example method that does nothing. - * @returns {Promise<[nobindingshere$0.Person, nobindingshere$0.HowDifferent, nobindingshere$0.PrivatePerson]> & { cancel(): void }} + * @returns {$CancellablePromise<[nobindingshere$0.Person, nobindingshere$0.HowDifferent, nobindingshere$0.PrivatePerson]>} */ export function LikeThisOne() { - let $resultPromise = /** @type {any} */($Call.ByID(2590614085)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByID(2590614085).then(/** @type {($result: any) => any} */(($result) => { $result[0] = $$createType0($result[0]); $result[1] = $$createType1($result[1]); $result[2] = $$createType2($result[2]); return $result; })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } /** * LikeThisOtherOne does nothing as well, but is different. - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function LikeThisOtherOne() { - let $resultPromise = /** @type {any} */($Call.ByID(773650321)); - return $resultPromise; + return $Call.ByID(773650321); } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/greetservice.js index 70596fc61..8afbd8b3a 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/greetservice.js @@ -9,14 +9,13 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; /** * Greet someone * @param {string} $0 - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet($0) { - let $resultPromise = /** @type {any} */($Call.ByID(1411160069, $0)); - return $resultPromise; + return $Call.ByID(1411160069, $0); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/greetservice.js index 0c282e914..e50a4a6ab 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/greetservice.js @@ -4,13 +4,12 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; /** * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name) { - let $resultPromise = /** @type {any} */($Call.ByID(1411160069, name)); - return $resultPromise; + return $Call.ByID(1411160069, name); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/otherservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/otherservice.js index da27da53b..f017774d8 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/otherservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/otherservice.js @@ -4,12 +4,11 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; /** - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Hello() { - let $resultPromise = /** @type {any} */($Call.ByID(4249972365)); - return $resultPromise; + return $Call.ByID(4249972365); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/greetservice.js index 0c282e914..e50a4a6ab 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/greetservice.js @@ -4,13 +4,12 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; /** * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name) { - let $resultPromise = /** @type {any} */($Call.ByID(1411160069, name)); - return $resultPromise; + return $Call.ByID(1411160069, name); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/otherservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/otherservice.js index da27da53b..f017774d8 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/otherservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/otherservice.js @@ -4,12 +4,11 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; /** - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Hello() { - let $resultPromise = /** @type {any} */($Call.ByID(4249972365)); - return $resultPromise; + return $Call.ByID(4249972365); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/greetservice.js index 5f8cf55b5..50737a34b 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/greetservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -18,25 +18,21 @@ import * as $models from "./models.js"; /** * Greet does XYZ * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name) { - let $resultPromise = /** @type {any} */($Call.ByID(1411160069, name)); - return $resultPromise; + return $Call.ByID(1411160069, name); } /** * NewPerson creates a new person * @param {string} name - * @returns {Promise<$models.Person | null> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Person | null>} */ export function NewPerson(name) { - let $resultPromise = /** @type {any} */($Call.ByID(1661412647, name)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByID(1661412647, name).then(/** @type {($result: any) => any} */(($result) => { return $$createType1($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/models.js index e187cce22..04771d2ca 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/models.js @@ -4,7 +4,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/services/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/services/models.js index fb1176dee..24a5de807 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/services/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/services/models.js @@ -4,7 +4,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; export class Address { /** diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/services/otherservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/services/otherservice.js index d61e9e689..24dc0334e 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/services/otherservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/services/otherservice.js @@ -10,7 +10,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -18,15 +18,12 @@ import * as $models from "./models.js"; /** * Yay does this and that - * @returns {Promise<$models.Address | null> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Address | null>} */ export function Yay() { - let $resultPromise = /** @type {any} */($Call.ByID(3568225479)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByID(3568225479).then(/** @type {($result: any) => any} */(($result) => { return $$createType1($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_non_pointer_single/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_non_pointer_single/greetservice.js index cb53251ed..855602e98 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_non_pointer_single/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_non_pointer_single/greetservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,413 +17,358 @@ import * as $models from "./models.js"; /** * @param {number[]} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function ArrayInt($in) { - let $resultPromise = /** @type {any} */($Call.ByID(3862002418, $in)); - return $resultPromise; + return $Call.ByID(3862002418, $in); } /** * @param {boolean} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function BoolInBoolOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(2424639793, $in)); - return $resultPromise; + return $Call.ByID(2424639793, $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Float32InFloat32Out($in) { - let $resultPromise = /** @type {any} */($Call.ByID(3132595881, $in)); - return $resultPromise; + return $Call.ByID(3132595881, $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Float64InFloat64Out($in) { - let $resultPromise = /** @type {any} */($Call.ByID(2182412247, $in)); - return $resultPromise; + return $Call.ByID(2182412247, $in); } /** * Greet someone * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name) { - let $resultPromise = /** @type {any} */($Call.ByID(1411160069, name)); - return $resultPromise; + return $Call.ByID(1411160069, name); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int16InIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(3306292566, $in)); - return $resultPromise; + return $Call.ByID(3306292566, $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int16PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByID(1754277916, $in)); - return $resultPromise; + return $Call.ByID(1754277916, $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int32InIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(1909469092, $in)); - return $resultPromise; + return $Call.ByID(1909469092, $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int32PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByID(4251088558, $in)); - return $resultPromise; + return $Call.ByID(4251088558, $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int64InIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(1343888303, $in)); - return $resultPromise; + return $Call.ByID(1343888303, $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int64PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByID(2205561041, $in)); - return $resultPromise; + return $Call.ByID(2205561041, $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int8InIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(572240879, $in)); - return $resultPromise; + return $Call.ByID(572240879, $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int8PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByID(2189402897, $in)); - return $resultPromise; + return $Call.ByID(2189402897, $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function IntInIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(642881729, $in)); - return $resultPromise; + return $Call.ByID(642881729, $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function IntPointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByID(1066151743, $in)); - return $resultPromise; + return $Call.ByID(1066151743, $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function IntPointerInputNamedOutputs($in) { - let $resultPromise = /** @type {any} */($Call.ByID(2718999663, $in)); - return $resultPromise; + return $Call.ByID(2718999663, $in); } /** * @param {{ [_: `${number}`]: number }} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function MapIntInt($in) { - let $resultPromise = /** @type {any} */($Call.ByID(2386486356, $in)); - return $resultPromise; + return $Call.ByID(2386486356, $in); } /** * @param {{ [_: `${number}`]: number | null }} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function MapIntIntPointer($in) { - let $resultPromise = /** @type {any} */($Call.ByID(2163571325, $in)); - return $resultPromise; + return $Call.ByID(2163571325, $in); } /** * @param {{ [_: `${number}`]: number[] }} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function MapIntSliceInt($in) { - let $resultPromise = /** @type {any} */($Call.ByID(2900172572, $in)); - return $resultPromise; + return $Call.ByID(2900172572, $in); } /** * @param {{ [_: `${number}`]: number[] }} $in - * @returns {Promise<{ [_: `${number}`]: number[] }> & { cancel(): void }} + * @returns {$CancellablePromise<{ [_: `${number}`]: number[] }>} */ export function MapIntSliceIntInMapIntSliceIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(881980169, $in)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByID(881980169, $in).then(/** @type {($result: any) => any} */(($result) => { return $$createType1($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } /** - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function NoInputsStringOut() { - let $resultPromise = /** @type {any} */($Call.ByID(1075577233)); - return $resultPromise; + return $Call.ByID(1075577233); } /** * @param {boolean | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function PointerBoolInBoolOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(3589606958, $in)); - return $resultPromise; + return $Call.ByID(3589606958, $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function PointerFloat32InFloat32Out($in) { - let $resultPromise = /** @type {any} */($Call.ByID(224675106, $in)); - return $resultPromise; + return $Call.ByID(224675106, $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function PointerFloat64InFloat64Out($in) { - let $resultPromise = /** @type {any} */($Call.ByID(2124953624, $in)); - return $resultPromise; + return $Call.ByID(2124953624, $in); } /** * @param {{ [_: `${number}`]: number } | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function PointerMapIntInt($in) { - let $resultPromise = /** @type {any} */($Call.ByID(3516977899, $in)); - return $resultPromise; + return $Call.ByID(3516977899, $in); } /** * @param {string | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function PointerStringInStringOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(229603958, $in)); - return $resultPromise; + return $Call.ByID(229603958, $in); } /** * @param {string[]} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function StringArrayInputNamedOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByID(3678582682, $in)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByID(3678582682, $in).then(/** @type {($result: any) => any} */(($result) => { return $$createType2($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } /** * @param {string[]} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function StringArrayInputNamedOutputs($in) { - let $resultPromise = /** @type {any} */($Call.ByID(319259595, $in)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByID(319259595, $in).then(/** @type {($result: any) => any} */(($result) => { return $$createType2($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } /** * @param {string[]} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function StringArrayInputStringArrayOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(383995060, $in)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByID(383995060, $in).then(/** @type {($result: any) => any} */(($result) => { return $$createType2($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } /** * @param {string[]} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function StringArrayInputStringOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(1091960237, $in)); - return $resultPromise; + return $Call.ByID(1091960237, $in); } /** * @param {$models.Person} $in - * @returns {Promise<$models.Person> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Person>} */ export function StructInputStructOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByID(3835643147, $in)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByID(3835643147, $in).then(/** @type {($result: any) => any} */(($result) => { return $$createType3($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } /** * @param {$models.Person | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function StructPointerInputErrorOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByID(2447692557, $in)); - return $resultPromise; + return $Call.ByID(2447692557, $in); } /** * @param {$models.Person | null} $in - * @returns {Promise<$models.Person | null> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Person | null>} */ export function StructPointerInputStructPointerOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByID(2943477349, $in)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByID(2943477349, $in).then(/** @type {($result: any) => any} */(($result) => { return $$createType4($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt16InUIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(3401034892, $in)); - return $resultPromise; + return $Call.ByID(3401034892, $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt16PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByID(1236957573, $in)); - return $resultPromise; + return $Call.ByID(1236957573, $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt32InUIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(1160383782, $in)); - return $resultPromise; + return $Call.ByID(1160383782, $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt32PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByID(1739300671, $in)); - return $resultPromise; + return $Call.ByID(1739300671, $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt64InUIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(793803239, $in)); - return $resultPromise; + return $Call.ByID(793803239, $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt64PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByID(1403757716, $in)); - return $resultPromise; + return $Call.ByID(1403757716, $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt8InUIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(2988345717, $in)); - return $resultPromise; + return $Call.ByID(2988345717, $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt8PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByID(518250834, $in)); - return $resultPromise; + return $Call.ByID(518250834, $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UIntInUIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(2836661285, $in)); - return $resultPromise; + return $Call.ByID(2836661285, $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UIntPointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByID(1367187362, $in)); - return $resultPromise; + return $Call.ByID(1367187362, $in); } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_non_pointer_single/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_non_pointer_single/models.js index 660f38b29..69c96370a 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_non_pointer_single/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_non_pointer_single/models.js @@ -4,7 +4,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; export class Person { /** diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_single/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_single/greetservice.js index cb53251ed..855602e98 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_single/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_single/greetservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,413 +17,358 @@ import * as $models from "./models.js"; /** * @param {number[]} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function ArrayInt($in) { - let $resultPromise = /** @type {any} */($Call.ByID(3862002418, $in)); - return $resultPromise; + return $Call.ByID(3862002418, $in); } /** * @param {boolean} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function BoolInBoolOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(2424639793, $in)); - return $resultPromise; + return $Call.ByID(2424639793, $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Float32InFloat32Out($in) { - let $resultPromise = /** @type {any} */($Call.ByID(3132595881, $in)); - return $resultPromise; + return $Call.ByID(3132595881, $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Float64InFloat64Out($in) { - let $resultPromise = /** @type {any} */($Call.ByID(2182412247, $in)); - return $resultPromise; + return $Call.ByID(2182412247, $in); } /** * Greet someone * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name) { - let $resultPromise = /** @type {any} */($Call.ByID(1411160069, name)); - return $resultPromise; + return $Call.ByID(1411160069, name); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int16InIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(3306292566, $in)); - return $resultPromise; + return $Call.ByID(3306292566, $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int16PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByID(1754277916, $in)); - return $resultPromise; + return $Call.ByID(1754277916, $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int32InIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(1909469092, $in)); - return $resultPromise; + return $Call.ByID(1909469092, $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int32PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByID(4251088558, $in)); - return $resultPromise; + return $Call.ByID(4251088558, $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int64InIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(1343888303, $in)); - return $resultPromise; + return $Call.ByID(1343888303, $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int64PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByID(2205561041, $in)); - return $resultPromise; + return $Call.ByID(2205561041, $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int8InIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(572240879, $in)); - return $resultPromise; + return $Call.ByID(572240879, $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int8PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByID(2189402897, $in)); - return $resultPromise; + return $Call.ByID(2189402897, $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function IntInIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(642881729, $in)); - return $resultPromise; + return $Call.ByID(642881729, $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function IntPointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByID(1066151743, $in)); - return $resultPromise; + return $Call.ByID(1066151743, $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function IntPointerInputNamedOutputs($in) { - let $resultPromise = /** @type {any} */($Call.ByID(2718999663, $in)); - return $resultPromise; + return $Call.ByID(2718999663, $in); } /** * @param {{ [_: `${number}`]: number }} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function MapIntInt($in) { - let $resultPromise = /** @type {any} */($Call.ByID(2386486356, $in)); - return $resultPromise; + return $Call.ByID(2386486356, $in); } /** * @param {{ [_: `${number}`]: number | null }} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function MapIntIntPointer($in) { - let $resultPromise = /** @type {any} */($Call.ByID(2163571325, $in)); - return $resultPromise; + return $Call.ByID(2163571325, $in); } /** * @param {{ [_: `${number}`]: number[] }} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function MapIntSliceInt($in) { - let $resultPromise = /** @type {any} */($Call.ByID(2900172572, $in)); - return $resultPromise; + return $Call.ByID(2900172572, $in); } /** * @param {{ [_: `${number}`]: number[] }} $in - * @returns {Promise<{ [_: `${number}`]: number[] }> & { cancel(): void }} + * @returns {$CancellablePromise<{ [_: `${number}`]: number[] }>} */ export function MapIntSliceIntInMapIntSliceIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(881980169, $in)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByID(881980169, $in).then(/** @type {($result: any) => any} */(($result) => { return $$createType1($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } /** - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function NoInputsStringOut() { - let $resultPromise = /** @type {any} */($Call.ByID(1075577233)); - return $resultPromise; + return $Call.ByID(1075577233); } /** * @param {boolean | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function PointerBoolInBoolOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(3589606958, $in)); - return $resultPromise; + return $Call.ByID(3589606958, $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function PointerFloat32InFloat32Out($in) { - let $resultPromise = /** @type {any} */($Call.ByID(224675106, $in)); - return $resultPromise; + return $Call.ByID(224675106, $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function PointerFloat64InFloat64Out($in) { - let $resultPromise = /** @type {any} */($Call.ByID(2124953624, $in)); - return $resultPromise; + return $Call.ByID(2124953624, $in); } /** * @param {{ [_: `${number}`]: number } | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function PointerMapIntInt($in) { - let $resultPromise = /** @type {any} */($Call.ByID(3516977899, $in)); - return $resultPromise; + return $Call.ByID(3516977899, $in); } /** * @param {string | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function PointerStringInStringOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(229603958, $in)); - return $resultPromise; + return $Call.ByID(229603958, $in); } /** * @param {string[]} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function StringArrayInputNamedOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByID(3678582682, $in)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByID(3678582682, $in).then(/** @type {($result: any) => any} */(($result) => { return $$createType2($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } /** * @param {string[]} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function StringArrayInputNamedOutputs($in) { - let $resultPromise = /** @type {any} */($Call.ByID(319259595, $in)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByID(319259595, $in).then(/** @type {($result: any) => any} */(($result) => { return $$createType2($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } /** * @param {string[]} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function StringArrayInputStringArrayOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(383995060, $in)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByID(383995060, $in).then(/** @type {($result: any) => any} */(($result) => { return $$createType2($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } /** * @param {string[]} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function StringArrayInputStringOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(1091960237, $in)); - return $resultPromise; + return $Call.ByID(1091960237, $in); } /** * @param {$models.Person} $in - * @returns {Promise<$models.Person> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Person>} */ export function StructInputStructOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByID(3835643147, $in)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByID(3835643147, $in).then(/** @type {($result: any) => any} */(($result) => { return $$createType3($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } /** * @param {$models.Person | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function StructPointerInputErrorOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByID(2447692557, $in)); - return $resultPromise; + return $Call.ByID(2447692557, $in); } /** * @param {$models.Person | null} $in - * @returns {Promise<$models.Person | null> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Person | null>} */ export function StructPointerInputStructPointerOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByID(2943477349, $in)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByID(2943477349, $in).then(/** @type {($result: any) => any} */(($result) => { return $$createType4($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt16InUIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(3401034892, $in)); - return $resultPromise; + return $Call.ByID(3401034892, $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt16PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByID(1236957573, $in)); - return $resultPromise; + return $Call.ByID(1236957573, $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt32InUIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(1160383782, $in)); - return $resultPromise; + return $Call.ByID(1160383782, $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt32PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByID(1739300671, $in)); - return $resultPromise; + return $Call.ByID(1739300671, $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt64InUIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(793803239, $in)); - return $resultPromise; + return $Call.ByID(793803239, $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt64PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByID(1403757716, $in)); - return $resultPromise; + return $Call.ByID(1403757716, $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt8InUIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(2988345717, $in)); - return $resultPromise; + return $Call.ByID(2988345717, $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt8PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByID(518250834, $in)); - return $resultPromise; + return $Call.ByID(518250834, $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UIntInUIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(2836661285, $in)); - return $resultPromise; + return $Call.ByID(2836661285, $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UIntPointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByID(1367187362, $in)); - return $resultPromise; + return $Call.ByID(1367187362, $in); } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_single/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_single/models.js index 660f38b29..69c96370a 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_single/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_single/models.js @@ -4,7 +4,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; export class Person { /** diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single/greetservice.js index d20ce5791..9dfe48511 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single/greetservice.js @@ -9,14 +9,13 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; /** * Greet someone * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name) { - let $resultPromise = /** @type {any} */($Call.ByID(1411160069, name)); - return $resultPromise; + return $Call.ByID(1411160069, name); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_function/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_function/greetservice.js index d20ce5791..9dfe48511 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_function/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_function/greetservice.js @@ -9,14 +9,13 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; /** * Greet someone * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name) { - let $resultPromise = /** @type {any} */($Call.ByID(1411160069, name)); - return $resultPromise; + return $Call.ByID(1411160069, name); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/greetservice.js index 5f8cf55b5..50737a34b 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/greetservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -18,25 +18,21 @@ import * as $models from "./models.js"; /** * Greet does XYZ * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name) { - let $resultPromise = /** @type {any} */($Call.ByID(1411160069, name)); - return $resultPromise; + return $Call.ByID(1411160069, name); } /** * NewPerson creates a new person * @param {string} name - * @returns {Promise<$models.Person | null> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Person | null>} */ export function NewPerson(name) { - let $resultPromise = /** @type {any} */($Call.ByID(1661412647, name)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByID(1661412647, name).then(/** @type {($result: any) => any} */(($result) => { return $$createType1($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/models.js index 0daca427b..d7bfe75cf 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/models.js @@ -4,7 +4,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/services/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/services/models.js index fb1176dee..24a5de807 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/services/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/services/models.js @@ -4,7 +4,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; export class Address { /** diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/services/otherservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/services/otherservice.js index 63319bf06..de3c9d51d 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/services/otherservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/services/otherservice.js @@ -10,7 +10,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -18,15 +18,12 @@ import * as $models from "./models.js"; /** * Yay does this and that - * @returns {Promise<$models.Address | null> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Address | null>} */ export function Yay() { - let $resultPromise = /** @type {any} */($Call.ByID(1491748400)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByID(1491748400).then(/** @type {($result: any) => any} */(($result) => { return $$createType1($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/encoding/json/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/encoding/json/models.js index b7e840816..96abf0ef1 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/encoding/json/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/encoding/json/models.js @@ -4,7 +4,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; /** * Marshaler is the interface implemented by types that diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/encoding/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/encoding/models.js index bbabe728a..59cfef5bd 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/encoding/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/encoding/models.js @@ -4,7 +4,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; /** * TextMarshaler is the interface implemented by an object that can diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.js index 05944bc02..2352f40bc 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -22,81 +22,63 @@ import * as $models from "./models.js"; /** * Get someone. * @param {$models.Alias} aliasValue - * @returns {Promise<$models.Person> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Person>} */ export function Get(aliasValue) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Get", aliasValue)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByName("main.GreetService.Get", aliasValue).then(/** @type {($result: any) => any} */(($result) => { return $$createType0($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } /** * Apparently, aliases are all the rage right now. * @param {$models.AliasedPerson} p - * @returns {Promise<$models.StrangelyAliasedPerson> & { cancel(): void }} + * @returns {$CancellablePromise<$models.StrangelyAliasedPerson>} */ export function GetButAliased(p) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.GetButAliased", p)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByName("main.GreetService.GetButAliased", p).then(/** @type {($result: any) => any} */(($result) => { return $$createType0($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } /** * Get someone quite different. - * @returns {Promise<$models.GenericPerson> & { cancel(): void }} + * @returns {$CancellablePromise<$models.GenericPerson>} */ export function GetButDifferent() { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.GetButDifferent")); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByName("main.GreetService.GetButDifferent").then(/** @type {($result: any) => any} */(($result) => { return $$createType1($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } /** - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function GetButForeignPrivateAlias() { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.GetButForeignPrivateAlias")); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByName("main.GreetService.GetButForeignPrivateAlias").then(/** @type {($result: any) => any} */(($result) => { return $$createType2($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } /** - * @returns {Promise<$models.AliasGroup> & { cancel(): void }} + * @returns {$CancellablePromise<$models.AliasGroup>} */ export function GetButGenericAliases() { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.GetButGenericAliases")); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByName("main.GreetService.GetButGenericAliases").then(/** @type {($result: any) => any} */(($result) => { return $$createType3($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } /** * Greet a lot of unusual things. * @param {$models.EmptyAliasStruct} $0 * @param {$models.EmptyStruct} $1 - * @returns {Promise<$models.AliasStruct> & { cancel(): void }} + * @returns {$CancellablePromise<$models.AliasStruct>} */ export function Greet($0, $1) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Greet", $0, $1)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByName("main.GreetService.Greet", $0, $1).then(/** @type {($result: any) => any} */(($result) => { return $$createType7($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/models.js index 977ad4722..3de57786d 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/models.js @@ -4,7 +4,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; /** * A nice type Alias. @@ -203,7 +203,7 @@ export class GenericPerson { * Given creation functions for each type parameter, * returns a creation function for a concrete instance * of the generic class GenericPerson. - * @template T + * @template [T=any] * @param {(source: any) => T} $$createParamT * @returns {($$source?: any) => GenericPerson} */ diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service7.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service7.js index f038563f2..54e794649 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service7.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service7.js @@ -4,12 +4,11 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; /** - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function TestMethod() { - let $resultPromise = /** @type {any} */($Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config.Service7.TestMethod")); - return $resultPromise; + return $Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config.Service7.TestMethod"); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service9.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service9.js index 9a316a10d..f6e8901a9 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service9.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service9.js @@ -4,12 +4,11 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; /** - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function TestMethod2() { - let $resultPromise = /** @type {any} */($Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config.Service9.TestMethod2")); - return $resultPromise; + return $Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config.Service9.TestMethod2"); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_json/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_json/greetservice.js index 7d3bc5c01..b5c320f3d 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_json/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_json/greetservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -19,9 +19,8 @@ import * as $models from "./models.js"; * Greet does XYZ * @param {$models.Person} person * @param {$models.Embedded1} emb - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(person, emb) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Greet", person, emb)); - return $resultPromise; + return $Call.ByName("main.GreetService.Greet", person, emb); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_json/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_json/models.js index d6da8c762..7a0edf1c7 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_json/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_json/models.js @@ -4,7 +4,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; export class Embedded1 { /** diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_method/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_method/greetservice.js index 1ea653b33..fae9496c1 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_method/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_method/greetservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -25,17 +25,14 @@ import * as $models from "./models.js"; * @param {{ [_: `${number}`]: boolean | null }} assoc * @param {(number | null)[]} $4 * @param {string[]} other - * @returns {Promise<[$models.Person, any, number[]]> & { cancel(): void }} + * @returns {$CancellablePromise<[$models.Person, any, number[]]>} */ export function Greet(str, people, $2, assoc, $4, ...other) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Greet", str, people, $2, assoc, $4, other)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByName("main.GreetService.Greet", str, people, $2, assoc, $4, other).then(/** @type {($result: any) => any} */(($result) => { $result[0] = $$createType0($result[0]); $result[2] = $$createType1($result[2]); return $result; })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_method/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_method/models.js index 70a01e64c..82af81baf 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_method/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_method/models.js @@ -4,7 +4,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; /** * Person represents a person diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_imports/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_imports/greetservice.js index bee868a52..651fd2d97 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_imports/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_imports/greetservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,17 +17,14 @@ import * as $models from "./models.js"; /** * Make a cycle. - * @returns {Promise<[$models.StructA, $models.StructC]> & { cancel(): void }} + * @returns {$CancellablePromise<[$models.StructA, $models.StructC]>} */ export function MakeCycles() { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.MakeCycles")); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByName("main.GreetService.MakeCycles").then(/** @type {($result: any) => any} */(($result) => { $result[0] = $$createType0($result[0]); $result[1] = $$createType1($result[1]); return $result; })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_imports/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_imports/models.js index d101a661f..f24f5a2c9 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_imports/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_imports/models.js @@ -4,7 +4,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; export class StructA { /** diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_types/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_types/greetservice.js index 1880b7b23..b4cbaa216 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_types/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_types/greetservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,17 +17,14 @@ import * as $models from "./models.js"; /** * Make a cycle. - * @returns {Promise<[$models.Cyclic, $models.GenericCyclic<$models.GenericCyclic>]> & { cancel(): void }} + * @returns {$CancellablePromise<[$models.Cyclic, $models.GenericCyclic<$models.GenericCyclic>]>} */ export function MakeCycles() { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.MakeCycles")); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByName("main.GreetService.MakeCycles").then(/** @type {($result: any) => any} */(($result) => { $result[0] = $$createType0($result[0]); $result[1] = $$createType9($result[1]); return $result; })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_types/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_types/models.js index f4a68bd4b..47d41f572 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_types/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_types/models.js @@ -4,7 +4,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; /** * @typedef {Cyclic | null} Alias diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/internalservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/internalservice.js index c2d455ec3..51a9c6be9 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/internalservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/internalservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,9 +17,8 @@ import * as $models from "./models.js"; /** * @param {$models.InternalModel} $0 - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Method($0) { - let $resultPromise = /** @type {any} */($Call.ByName("main.InternalService.Method", $0)); - return $resultPromise; + return $Call.ByName("main.InternalService.Method", $0); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/models.js index fad4870ca..291a3cecf 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/models.js @@ -4,7 +4,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; /** * An exported but internal model. diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/otherpackage/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/otherpackage/models.js index b38ff6238..274f4eed4 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/otherpackage/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/otherpackage/models.js @@ -4,7 +4,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; export class Dummy { /** diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/service.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/service.js index 44c3fdf12..c59f8e184 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/service.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/service.js @@ -4,7 +4,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -12,20 +12,18 @@ import * as otherpackage$0 from "./otherpackage/models.js"; /** * @param {string} $0 - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ function InternalMethod($0) { - let $resultPromise = /** @type {any} */($Call.ByName("main.Service.InternalMethod", $0)); - return $resultPromise; + return $Call.ByName("main.Service.InternalMethod", $0); } /** * @param {otherpackage$0.Dummy} $0 - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function VisibleMethod($0) { - let $resultPromise = /** @type {any} */($Call.ByName("main.Service.VisibleMethod", $0)); - return $resultPromise; + return $Call.ByName("main.Service.VisibleMethod", $0); } /** diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/unexportedservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/unexportedservice.js index a12a0137d..8a93f316f 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/unexportedservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/unexportedservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,9 +17,8 @@ import * as $models from "./models.js"; /** * @param {$models.unexportedModel} $0 - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Method($0) { - let $resultPromise = /** @type {any} */($Call.ByName("main.unexportedService.Method", $0)); - return $resultPromise; + return $Call.ByName("main.unexportedService.Method", $0); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/embedded_interface/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/embedded_interface/greetservice.js index d2e4ab159..494240982 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/embedded_interface/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/embedded_interface/greetservice.js @@ -9,50 +9,45 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; /** * Comment 1. - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Method1() { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Method1")); - return $resultPromise; + return $Call.ByName("main.GreetService.Method1"); } /** * Comment 2. - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Method2() { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Method2")); - return $resultPromise; + return $Call.ByName("main.GreetService.Method2"); } /** * Comment 3a. * Comment 3b. - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Method3() { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Method3")); - return $resultPromise; + return $Call.ByName("main.GreetService.Method3"); } /** * Comment 4. - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Method4() { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Method4")); - return $resultPromise; + return $Call.ByName("main.GreetService.Method4"); } /** * Comment 5. - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Method5() { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Method5")); - return $resultPromise; + return $Call.ByName("main.GreetService.Method5"); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/enum/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/enum/greetservice.js index 47ca987a9..fd18bf8a3 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/enum/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/enum/greetservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -19,25 +19,21 @@ import * as $models from "./models.js"; * Greet does XYZ * @param {string} name * @param {$models.Title} title - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name, title) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Greet", name, title)); - return $resultPromise; + return $Call.ByName("main.GreetService.Greet", name, title); } /** * NewPerson creates a new person * @param {string} name - * @returns {Promise<$models.Person | null> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Person | null>} */ export function NewPerson(name) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.NewPerson", name)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByName("main.GreetService.NewPerson", name).then(/** @type {($result: any) => any} */(($result) => { return $$createType1($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/enum/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/enum/models.js index cad356265..2c5df9ee7 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/enum/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/enum/models.js @@ -4,7 +4,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; /** * Age is an integer with some predefined values diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/enum_from_imported_package/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/enum_from_imported_package/greetservice.js index f01cfc84f..125c76d13 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/enum_from_imported_package/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/enum_from_imported_package/greetservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -19,9 +19,8 @@ import * as services$0 from "./services/models.js"; * Greet does XYZ * @param {string} name * @param {services$0.Title} title - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name, title) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Greet", name, title)); - return $resultPromise; + return $Call.ByName("main.GreetService.Greet", name, title); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/enum_from_imported_package/services/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/enum_from_imported_package/services/models.js index 0e7acabe2..65ebfa2f7 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/enum_from_imported_package/services/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/enum_from_imported_package/services/models.js @@ -4,7 +4,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; /** * @readonly diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/greetservice.js index 0ed0e3660..16a94df37 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/greetservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -18,25 +18,21 @@ import * as $models from "./models.js"; /** * Greet does XYZ * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Greet", name)); - return $resultPromise; + return $Call.ByName("main.GreetService.Greet", name); } /** * NewPerson creates a new person * @param {string} name - * @returns {Promise<$models.Person | null> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Person | null>} */ export function NewPerson(name) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.NewPerson", name)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByName("main.GreetService.NewPerson", name).then(/** @type {($result: any) => any} */(($result) => { return $$createType1($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/models.js index 860939563..0ab295133 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/models.js @@ -4,7 +4,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/services/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/services/models.js index fb1176dee..24a5de807 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/services/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/services/models.js @@ -4,7 +4,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; export class Address { /** diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/services/otherservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/services/otherservice.js index 7426508f7..ba2c614cd 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/services/otherservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/services/otherservice.js @@ -10,7 +10,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -18,15 +18,12 @@ import * as $models from "./models.js"; /** * Yay does this and that - * @returns {Promise<$models.Address | null> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Address | null>} */ export function Yay() { - let $resultPromise = /** @type {any} */($Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/services.OtherService.Yay")); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/services.OtherService.Yay").then(/** @type {($result: any) => any} */(($result) => { return $$createType1($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/greetservice.js index 0ed0e3660..16a94df37 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/greetservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -18,25 +18,21 @@ import * as $models from "./models.js"; /** * Greet does XYZ * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Greet", name)); - return $resultPromise; + return $Call.ByName("main.GreetService.Greet", name); } /** * NewPerson creates a new person * @param {string} name - * @returns {Promise<$models.Person | null> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Person | null>} */ export function NewPerson(name) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.NewPerson", name)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByName("main.GreetService.NewPerson", name).then(/** @type {($result: any) => any} */(($result) => { return $$createType1($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/models.js index 5b28ee2f6..29a95e11e 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/models.js @@ -4,7 +4,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/services/other/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/services/other/models.js index fb1176dee..24a5de807 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/services/other/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/services/other/models.js @@ -4,7 +4,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; export class Address { /** diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/services/other/otherservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/services/other/otherservice.js index d01fa13f6..f6269f0b5 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/services/other/otherservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/services/other/otherservice.js @@ -10,7 +10,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -18,15 +18,12 @@ import * as $models from "./models.js"; /** * Yay does this and that - * @returns {Promise<$models.Address | null> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Address | null>} */ export function Yay() { - let $resultPromise = /** @type {any} */($Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/services/other.OtherService.Yay")); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/services/other.OtherService.Yay").then(/** @type {($result: any) => any} */(($result) => { return $$createType1($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_multiple_files/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_multiple_files/greetservice.js index 1cb3ece11..e6a0e3a74 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_multiple_files/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_multiple_files/greetservice.js @@ -4,13 +4,12 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; /** * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Greet", name)); - return $resultPromise; + return $Call.ByName("main.GreetService.Greet", name); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single/greetservice.js index 83b635bea..6364fa8f6 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single/greetservice.js @@ -9,14 +9,13 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; /** * Greet someone * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Greet", name)); - return $resultPromise; + return $Call.ByName("main.GreetService.Greet", name); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_context/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_context/greetservice.js index 541cf1c9c..e91d18592 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_context/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_context/greetservice.js @@ -9,24 +9,22 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; /** * Greet someone * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Greet", name)); - return $resultPromise; + return $Call.ByName("main.GreetService.Greet", name); } /** * Greet someone * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function GreetWithContext(name) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.GreetWithContext", name)); - return $resultPromise; + return $Call.ByName("main.GreetService.GreetWithContext", name); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_internal/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_internal/greetservice.js index 83b635bea..6364fa8f6 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_internal/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_internal/greetservice.js @@ -9,14 +9,13 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; /** * Greet someone * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Greet", name)); - return $resultPromise; + return $Call.ByName("main.GreetService.Greet", name); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/models.js index 960844103..1dc5bfc38 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/models.js @@ -4,7 +4,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; /** * @template S @@ -1227,7 +1227,15 @@ export class Maps { * Given creation functions for each type parameter, * returns a creation function for a concrete instance * of the generic class Maps. - * @template R,S,T,U,V,W,X,Y,Z + * @template [R=any] + * @template [S=any] + * @template [T=any] + * @template [U=any] + * @template [V=any] + * @template [W=any] + * @template [X=any] + * @template [Y=any] + * @template [Z=any] * @param {(source: any) => R} $$createParamR * @param {(source: any) => S} $$createParamS * @param {(source: any) => T} $$createParamT @@ -1926,24 +1934,24 @@ const $$createType55 = $Create.Map($Create.Any, $Create.Any); const $$createType56 = $Create.Map($Create.Any, $Create.Any); const $$createType57 = $Create.Map($Create.Any, $Create.Any); const $$createType58 = $Create.Map($Create.Any, $Create.Any); -const $$createType59 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType60 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType61 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType62 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType63 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType64 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType65 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType66 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType67 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType68 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType69 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType70 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType71 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType72 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType73 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType74 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType75 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType76 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); +const $$createType59 = /** @type {(...args: any[]) => any} */(($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any)); +const $$createType60 = /** @type {(...args: any[]) => any} */(($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any)); +const $$createType61 = /** @type {(...args: any[]) => any} */(($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any)); +const $$createType62 = /** @type {(...args: any[]) => any} */(($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any)); +const $$createType63 = /** @type {(...args: any[]) => any} */(($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any)); +const $$createType64 = /** @type {(...args: any[]) => any} */(($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any)); +const $$createType65 = /** @type {(...args: any[]) => any} */(($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any)); +const $$createType66 = /** @type {(...args: any[]) => any} */(($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any)); +const $$createType67 = /** @type {(...args: any[]) => any} */(($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any)); +const $$createType68 = /** @type {(...args: any[]) => any} */(($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any)); +const $$createType69 = /** @type {(...args: any[]) => any} */(($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any)); +const $$createType70 = /** @type {(...args: any[]) => any} */(($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any)); +const $$createType71 = /** @type {(...args: any[]) => any} */(($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any)); +const $$createType72 = /** @type {(...args: any[]) => any} */(($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any)); +const $$createType73 = /** @type {(...args: any[]) => any} */(($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any)); +const $$createType74 = /** @type {(...args: any[]) => any} */(($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any)); +const $$createType75 = /** @type {(...args: any[]) => any} */(($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any)); +const $$createType76 = /** @type {(...args: any[]) => any} */(($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any)); const $$createType77 = $Create.Map($Create.Any, $Create.Any); const $$createType78 = $Create.Map($Create.Any, $Create.Any); const $$createType79 = $Create.Map($Create.Any, $Create.Any); diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/service.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/service.js index b7af4dba5..cc98f3a89 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/service.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/service.js @@ -4,22 +4,19 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports import * as $models from "./models.js"; /** - * @returns {Promise<$models.Maps<$models.PointerTextMarshaler, number, number, $models.ValueTextMarshaler, $models.PointerTextMarshaler | null, $models.ValueTextMarshaler, $models.StringType, $models.ValueTextMarshaler, $models.PointerTextMarshaler | null>> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Maps<$models.PointerTextMarshaler, number, number, $models.ValueTextMarshaler, $models.PointerTextMarshaler | null, $models.ValueTextMarshaler, $models.StringType, $models.ValueTextMarshaler, $models.PointerTextMarshaler | null>>} */ export function Method() { - let $resultPromise = /** @type {any} */($Call.ByName("main.Service.Method")); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByName("main.Service.Method").then(/** @type {($result: any) => any} */(($result) => { return $$createType0($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/marshalers/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/marshalers/models.js index 1871e9492..77fe552ea 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/marshalers/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/marshalers/models.js @@ -4,7 +4,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/marshalers/service.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/marshalers/service.js index 52950fdbd..e6c23e4f0 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/marshalers/service.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/marshalers/service.js @@ -4,22 +4,19 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports import * as $models from "./models.js"; /** - * @returns {Promise<$models.Data> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Data>} */ export function Method() { - let $resultPromise = /** @type {any} */($Call.ByName("main.Service.Method")); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByName("main.Service.Method").then(/** @type {($result: any) => any} */(($result) => { return $$createType0($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/models.js index f88aa955a..b42e223fa 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/models.js @@ -4,7 +4,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -45,7 +45,7 @@ export class HowDifferent { * Given creation functions for each type parameter, * returns a creation function for a concrete instance * of the generic class HowDifferent. - * @template How + * @template [How=any] * @param {(source: any) => How} $$createParamHow * @returns {($$source?: any) => HowDifferent} */ @@ -175,7 +175,7 @@ export const PrivatePerson = personImpl; */ // Private type creation functions -const $$createType0 = ($$createParamHow) => $Create.Map($Create.Any, $$createParamHow); -const $$createType1 = ($$createParamHow) => $Create.Array($$createType0($$createParamHow)); +const $$createType0 = /** @type {(...args: any[]) => any} */(($$createParamHow) => $Create.Map($Create.Any, $$createParamHow)); +const $$createType1 = /** @type {(...args: any[]) => any} */(($$createParamHow) => $Create.Array($$createType0($$createParamHow))); const $$createType2 = other$0.OtherPerson.createFrom($Create.Any); const $$createType3 = $Create.Array($$createType2); diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/other/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/other/models.js index c10d33908..89992cacf 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/other/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/other/models.js @@ -4,7 +4,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; /** * OtherPerson is like a person, but different. @@ -40,7 +40,7 @@ export class OtherPerson { * Given creation functions for each type parameter, * returns a creation function for a concrete instance * of the generic class OtherPerson. - * @template T + * @template [T=any] * @param {(source: any) => T} $$createParamT * @returns {($$source?: any) => OtherPerson} */ @@ -57,4 +57,4 @@ export class OtherPerson { } // Private type creation functions -const $$createType0 = ($$createParamT) => $Create.Array($$createParamT); +const $$createType0 = /** @type {(...args: any[]) => any} */(($$createParamT) => $Create.Array($$createParamT)); diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/other/othermethods.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/other/othermethods.js index bdea648c1..d2819bc4b 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/other/othermethods.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/other/othermethods.js @@ -9,13 +9,12 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; /** * LikeThisOtherOne does nothing as well, but is different. - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function LikeThisOtherOne() { - let $resultPromise = /** @type {any} */($Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/other.OtherMethods.LikeThisOtherOne")); - return $resultPromise; + return $Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/other.OtherMethods.LikeThisOtherOne"); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/somemethods.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/somemethods.js index 300f5807b..35bc3579d 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/somemethods.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/somemethods.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,27 +17,23 @@ import * as $models from "./models.js"; /** * LikeThisOne is an example method that does nothing. - * @returns {Promise<[$models.Person, $models.HowDifferent, $models.PrivatePerson]> & { cancel(): void }} + * @returns {$CancellablePromise<[$models.Person, $models.HowDifferent, $models.PrivatePerson]>} */ export function LikeThisOne() { - let $resultPromise = /** @type {any} */($Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here.SomeMethods.LikeThisOne")); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here.SomeMethods.LikeThisOne").then(/** @type {($result: any) => any} */(($result) => { $result[0] = $$createType0($result[0]); $result[1] = $$createType1($result[1]); $result[2] = $$createType2($result[2]); return $result; })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } /** * LikeThisOtherOne does nothing as well, but is different. - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function LikeThisOtherOne() { - let $resultPromise = /** @type {any} */($Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here.SomeMethods.LikeThisOtherOne")); - return $resultPromise; + return $Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here.SomeMethods.LikeThisOtherOne"); } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedother.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedother.js index 593ea0136..0497b16bc 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedother.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedother.js @@ -9,13 +9,12 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; /** * LikeThisOtherOne does nothing as well, but is different. - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function LikeThisOtherOne() { - let $resultPromise = /** @type {any} */($Call.ByName("main.EmbedOther.LikeThisOtherOne")); - return $resultPromise; + return $Call.ByName("main.EmbedOther.LikeThisOtherOne"); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedservice.js index 458575bd1..903e4153f 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,27 +17,23 @@ import * as nobindingshere$0 from "../no_bindings_here/models.js"; /** * LikeThisOne is an example method that does nothing. - * @returns {Promise<[nobindingshere$0.Person, nobindingshere$0.HowDifferent, nobindingshere$0.PrivatePerson]> & { cancel(): void }} + * @returns {$CancellablePromise<[nobindingshere$0.Person, nobindingshere$0.HowDifferent, nobindingshere$0.PrivatePerson]>} */ export function LikeThisOne() { - let $resultPromise = /** @type {any} */($Call.ByName("main.EmbedService.LikeThisOne")); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByName("main.EmbedService.LikeThisOne").then(/** @type {($result: any) => any} */(($result) => { $result[0] = $$createType0($result[0]); $result[1] = $$createType1($result[1]); $result[2] = $$createType2($result[2]); return $result; })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } /** * LikeThisOtherOne does nothing as well, but is different. - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function LikeThisOtherOne() { - let $resultPromise = /** @type {any} */($Call.ByName("main.EmbedService.LikeThisOtherOne")); - return $resultPromise; + return $Call.ByName("main.EmbedService.LikeThisOtherOne"); } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/greetservice.js index dfc42065c..fe683f548 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/greetservice.js @@ -9,14 +9,13 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; /** * Greet someone * @param {string} $0 - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet($0) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Greet", $0)); - return $resultPromise; + return $Call.ByName("main.GreetService.Greet", $0); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/greetservice.js index 1cb3ece11..e6a0e3a74 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/greetservice.js @@ -4,13 +4,12 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; /** * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Greet", name)); - return $resultPromise; + return $Call.ByName("main.GreetService.Greet", name); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/otherservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/otherservice.js index 05f7be7f8..69652f626 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/otherservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/otherservice.js @@ -4,12 +4,11 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; /** - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Hello() { - let $resultPromise = /** @type {any} */($Call.ByName("main.OtherService.Hello")); - return $resultPromise; + return $Call.ByName("main.OtherService.Hello"); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/greetservice.js index 1cb3ece11..e6a0e3a74 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/greetservice.js @@ -4,13 +4,12 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; /** * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Greet", name)); - return $resultPromise; + return $Call.ByName("main.GreetService.Greet", name); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/otherservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/otherservice.js index 05f7be7f8..69652f626 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/otherservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/otherservice.js @@ -4,12 +4,11 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; /** - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Hello() { - let $resultPromise = /** @type {any} */($Call.ByName("main.OtherService.Hello")); - return $resultPromise; + return $Call.ByName("main.OtherService.Hello"); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/greetservice.js index 0ed0e3660..16a94df37 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/greetservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -18,25 +18,21 @@ import * as $models from "./models.js"; /** * Greet does XYZ * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Greet", name)); - return $resultPromise; + return $Call.ByName("main.GreetService.Greet", name); } /** * NewPerson creates a new person * @param {string} name - * @returns {Promise<$models.Person | null> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Person | null>} */ export function NewPerson(name) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.NewPerson", name)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByName("main.GreetService.NewPerson", name).then(/** @type {($result: any) => any} */(($result) => { return $$createType1($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/models.js index e187cce22..04771d2ca 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/models.js @@ -4,7 +4,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/services/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/services/models.js index fb1176dee..24a5de807 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/services/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/services/models.js @@ -4,7 +4,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; export class Address { /** diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/services/otherservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/services/otherservice.js index 105fc3ea8..327b15c9c 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/services/otherservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/services/otherservice.js @@ -10,7 +10,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -18,15 +18,12 @@ import * as $models from "./models.js"; /** * Yay does this and that - * @returns {Promise<$models.Address | null> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Address | null>} */ export function Yay() { - let $resultPromise = /** @type {any} */($Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/services.OtherService.Yay")); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/services.OtherService.Yay").then(/** @type {($result: any) => any} */(($result) => { return $$createType1($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_non_pointer_single/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_non_pointer_single/greetservice.js index eb69383fb..d811d97ce 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_non_pointer_single/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_non_pointer_single/greetservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,413 +17,358 @@ import * as $models from "./models.js"; /** * @param {number[]} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function ArrayInt($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.ArrayInt", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.ArrayInt", $in); } /** * @param {boolean} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function BoolInBoolOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.BoolInBoolOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.BoolInBoolOut", $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Float32InFloat32Out($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Float32InFloat32Out", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.Float32InFloat32Out", $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Float64InFloat64Out($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Float64InFloat64Out", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.Float64InFloat64Out", $in); } /** * Greet someone * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Greet", name)); - return $resultPromise; + return $Call.ByName("main.GreetService.Greet", name); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int16InIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Int16InIntOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.Int16InIntOut", $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int16PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Int16PointerInAndOutput", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.Int16PointerInAndOutput", $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int32InIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Int32InIntOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.Int32InIntOut", $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int32PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Int32PointerInAndOutput", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.Int32PointerInAndOutput", $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int64InIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Int64InIntOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.Int64InIntOut", $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int64PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Int64PointerInAndOutput", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.Int64PointerInAndOutput", $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int8InIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Int8InIntOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.Int8InIntOut", $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int8PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Int8PointerInAndOutput", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.Int8PointerInAndOutput", $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function IntInIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.IntInIntOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.IntInIntOut", $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function IntPointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.IntPointerInAndOutput", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.IntPointerInAndOutput", $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function IntPointerInputNamedOutputs($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.IntPointerInputNamedOutputs", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.IntPointerInputNamedOutputs", $in); } /** * @param {{ [_: `${number}`]: number }} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function MapIntInt($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.MapIntInt", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.MapIntInt", $in); } /** * @param {{ [_: `${number}`]: number | null }} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function MapIntIntPointer($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.MapIntIntPointer", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.MapIntIntPointer", $in); } /** * @param {{ [_: `${number}`]: number[] }} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function MapIntSliceInt($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.MapIntSliceInt", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.MapIntSliceInt", $in); } /** * @param {{ [_: `${number}`]: number[] }} $in - * @returns {Promise<{ [_: `${number}`]: number[] }> & { cancel(): void }} + * @returns {$CancellablePromise<{ [_: `${number}`]: number[] }>} */ export function MapIntSliceIntInMapIntSliceIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.MapIntSliceIntInMapIntSliceIntOut", $in)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByName("main.GreetService.MapIntSliceIntInMapIntSliceIntOut", $in).then(/** @type {($result: any) => any} */(($result) => { return $$createType1($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } /** - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function NoInputsStringOut() { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.NoInputsStringOut")); - return $resultPromise; + return $Call.ByName("main.GreetService.NoInputsStringOut"); } /** * @param {boolean | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function PointerBoolInBoolOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.PointerBoolInBoolOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.PointerBoolInBoolOut", $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function PointerFloat32InFloat32Out($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.PointerFloat32InFloat32Out", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.PointerFloat32InFloat32Out", $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function PointerFloat64InFloat64Out($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.PointerFloat64InFloat64Out", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.PointerFloat64InFloat64Out", $in); } /** * @param {{ [_: `${number}`]: number } | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function PointerMapIntInt($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.PointerMapIntInt", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.PointerMapIntInt", $in); } /** * @param {string | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function PointerStringInStringOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.PointerStringInStringOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.PointerStringInStringOut", $in); } /** * @param {string[]} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function StringArrayInputNamedOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.StringArrayInputNamedOutput", $in)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByName("main.GreetService.StringArrayInputNamedOutput", $in).then(/** @type {($result: any) => any} */(($result) => { return $$createType2($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } /** * @param {string[]} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function StringArrayInputNamedOutputs($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.StringArrayInputNamedOutputs", $in)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByName("main.GreetService.StringArrayInputNamedOutputs", $in).then(/** @type {($result: any) => any} */(($result) => { return $$createType2($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } /** * @param {string[]} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function StringArrayInputStringArrayOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.StringArrayInputStringArrayOut", $in)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByName("main.GreetService.StringArrayInputStringArrayOut", $in).then(/** @type {($result: any) => any} */(($result) => { return $$createType2($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } /** * @param {string[]} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function StringArrayInputStringOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.StringArrayInputStringOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.StringArrayInputStringOut", $in); } /** * @param {$models.Person} $in - * @returns {Promise<$models.Person> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Person>} */ export function StructInputStructOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.StructInputStructOutput", $in)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByName("main.GreetService.StructInputStructOutput", $in).then(/** @type {($result: any) => any} */(($result) => { return $$createType3($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } /** * @param {$models.Person | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function StructPointerInputErrorOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.StructPointerInputErrorOutput", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.StructPointerInputErrorOutput", $in); } /** * @param {$models.Person | null} $in - * @returns {Promise<$models.Person | null> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Person | null>} */ export function StructPointerInputStructPointerOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.StructPointerInputStructPointerOutput", $in)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByName("main.GreetService.StructPointerInputStructPointerOutput", $in).then(/** @type {($result: any) => any} */(($result) => { return $$createType4($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt16InUIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.UInt16InUIntOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.UInt16InUIntOut", $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt16PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.UInt16PointerInAndOutput", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.UInt16PointerInAndOutput", $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt32InUIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.UInt32InUIntOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.UInt32InUIntOut", $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt32PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.UInt32PointerInAndOutput", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.UInt32PointerInAndOutput", $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt64InUIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.UInt64InUIntOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.UInt64InUIntOut", $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt64PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.UInt64PointerInAndOutput", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.UInt64PointerInAndOutput", $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt8InUIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.UInt8InUIntOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.UInt8InUIntOut", $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt8PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.UInt8PointerInAndOutput", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.UInt8PointerInAndOutput", $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UIntInUIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.UIntInUIntOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.UIntInUIntOut", $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UIntPointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.UIntPointerInAndOutput", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.UIntPointerInAndOutput", $in); } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_non_pointer_single/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_non_pointer_single/models.js index 660f38b29..69c96370a 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_non_pointer_single/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_non_pointer_single/models.js @@ -4,7 +4,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; export class Person { /** diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_single/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_single/greetservice.js index eb69383fb..d811d97ce 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_single/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_single/greetservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,413 +17,358 @@ import * as $models from "./models.js"; /** * @param {number[]} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function ArrayInt($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.ArrayInt", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.ArrayInt", $in); } /** * @param {boolean} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function BoolInBoolOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.BoolInBoolOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.BoolInBoolOut", $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Float32InFloat32Out($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Float32InFloat32Out", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.Float32InFloat32Out", $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Float64InFloat64Out($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Float64InFloat64Out", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.Float64InFloat64Out", $in); } /** * Greet someone * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Greet", name)); - return $resultPromise; + return $Call.ByName("main.GreetService.Greet", name); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int16InIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Int16InIntOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.Int16InIntOut", $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int16PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Int16PointerInAndOutput", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.Int16PointerInAndOutput", $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int32InIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Int32InIntOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.Int32InIntOut", $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int32PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Int32PointerInAndOutput", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.Int32PointerInAndOutput", $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int64InIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Int64InIntOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.Int64InIntOut", $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int64PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Int64PointerInAndOutput", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.Int64PointerInAndOutput", $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int8InIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Int8InIntOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.Int8InIntOut", $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int8PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Int8PointerInAndOutput", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.Int8PointerInAndOutput", $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function IntInIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.IntInIntOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.IntInIntOut", $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function IntPointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.IntPointerInAndOutput", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.IntPointerInAndOutput", $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function IntPointerInputNamedOutputs($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.IntPointerInputNamedOutputs", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.IntPointerInputNamedOutputs", $in); } /** * @param {{ [_: `${number}`]: number }} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function MapIntInt($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.MapIntInt", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.MapIntInt", $in); } /** * @param {{ [_: `${number}`]: number | null }} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function MapIntIntPointer($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.MapIntIntPointer", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.MapIntIntPointer", $in); } /** * @param {{ [_: `${number}`]: number[] }} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function MapIntSliceInt($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.MapIntSliceInt", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.MapIntSliceInt", $in); } /** * @param {{ [_: `${number}`]: number[] }} $in - * @returns {Promise<{ [_: `${number}`]: number[] }> & { cancel(): void }} + * @returns {$CancellablePromise<{ [_: `${number}`]: number[] }>} */ export function MapIntSliceIntInMapIntSliceIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.MapIntSliceIntInMapIntSliceIntOut", $in)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByName("main.GreetService.MapIntSliceIntInMapIntSliceIntOut", $in).then(/** @type {($result: any) => any} */(($result) => { return $$createType1($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } /** - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function NoInputsStringOut() { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.NoInputsStringOut")); - return $resultPromise; + return $Call.ByName("main.GreetService.NoInputsStringOut"); } /** * @param {boolean | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function PointerBoolInBoolOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.PointerBoolInBoolOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.PointerBoolInBoolOut", $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function PointerFloat32InFloat32Out($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.PointerFloat32InFloat32Out", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.PointerFloat32InFloat32Out", $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function PointerFloat64InFloat64Out($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.PointerFloat64InFloat64Out", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.PointerFloat64InFloat64Out", $in); } /** * @param {{ [_: `${number}`]: number } | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function PointerMapIntInt($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.PointerMapIntInt", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.PointerMapIntInt", $in); } /** * @param {string | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function PointerStringInStringOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.PointerStringInStringOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.PointerStringInStringOut", $in); } /** * @param {string[]} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function StringArrayInputNamedOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.StringArrayInputNamedOutput", $in)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByName("main.GreetService.StringArrayInputNamedOutput", $in).then(/** @type {($result: any) => any} */(($result) => { return $$createType2($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } /** * @param {string[]} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function StringArrayInputNamedOutputs($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.StringArrayInputNamedOutputs", $in)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByName("main.GreetService.StringArrayInputNamedOutputs", $in).then(/** @type {($result: any) => any} */(($result) => { return $$createType2($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } /** * @param {string[]} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function StringArrayInputStringArrayOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.StringArrayInputStringArrayOut", $in)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByName("main.GreetService.StringArrayInputStringArrayOut", $in).then(/** @type {($result: any) => any} */(($result) => { return $$createType2($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } /** * @param {string[]} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function StringArrayInputStringOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.StringArrayInputStringOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.StringArrayInputStringOut", $in); } /** * @param {$models.Person} $in - * @returns {Promise<$models.Person> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Person>} */ export function StructInputStructOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.StructInputStructOutput", $in)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByName("main.GreetService.StructInputStructOutput", $in).then(/** @type {($result: any) => any} */(($result) => { return $$createType3($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } /** * @param {$models.Person | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function StructPointerInputErrorOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.StructPointerInputErrorOutput", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.StructPointerInputErrorOutput", $in); } /** * @param {$models.Person | null} $in - * @returns {Promise<$models.Person | null> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Person | null>} */ export function StructPointerInputStructPointerOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.StructPointerInputStructPointerOutput", $in)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByName("main.GreetService.StructPointerInputStructPointerOutput", $in).then(/** @type {($result: any) => any} */(($result) => { return $$createType4($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt16InUIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.UInt16InUIntOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.UInt16InUIntOut", $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt16PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.UInt16PointerInAndOutput", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.UInt16PointerInAndOutput", $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt32InUIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.UInt32InUIntOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.UInt32InUIntOut", $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt32PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.UInt32PointerInAndOutput", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.UInt32PointerInAndOutput", $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt64InUIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.UInt64InUIntOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.UInt64InUIntOut", $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt64PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.UInt64PointerInAndOutput", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.UInt64PointerInAndOutput", $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt8InUIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.UInt8InUIntOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.UInt8InUIntOut", $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt8PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.UInt8PointerInAndOutput", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.UInt8PointerInAndOutput", $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UIntInUIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.UIntInUIntOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.UIntInUIntOut", $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UIntPointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.UIntPointerInAndOutput", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.UIntPointerInAndOutput", $in); } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_single/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_single/models.js index 660f38b29..69c96370a 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_single/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_single/models.js @@ -4,7 +4,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; export class Person { /** diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single/greetservice.js index 83b635bea..6364fa8f6 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single/greetservice.js @@ -9,14 +9,13 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; /** * Greet someone * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Greet", name)); - return $resultPromise; + return $Call.ByName("main.GreetService.Greet", name); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_function/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_function/greetservice.js index 83b635bea..6364fa8f6 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_function/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_function/greetservice.js @@ -9,14 +9,13 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; /** * Greet someone * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Greet", name)); - return $resultPromise; + return $Call.ByName("main.GreetService.Greet", name); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/greetservice.js index 0ed0e3660..16a94df37 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/greetservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -18,25 +18,21 @@ import * as $models from "./models.js"; /** * Greet does XYZ * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Greet", name)); - return $resultPromise; + return $Call.ByName("main.GreetService.Greet", name); } /** * NewPerson creates a new person * @param {string} name - * @returns {Promise<$models.Person | null> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Person | null>} */ export function NewPerson(name) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.NewPerson", name)); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByName("main.GreetService.NewPerson", name).then(/** @type {($result: any) => any} */(($result) => { return $$createType1($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/models.js index 0daca427b..d7bfe75cf 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/models.js @@ -4,7 +4,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/services/models.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/services/models.js index fb1176dee..24a5de807 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/services/models.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/services/models.js @@ -4,7 +4,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; export class Address { /** diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/services/otherservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/services/otherservice.js index 47ce5c70a..d413366d6 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/services/otherservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/services/otherservice.js @@ -10,7 +10,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -18,15 +18,12 @@ import * as $models from "./models.js"; /** * Yay does this and that - * @returns {Promise<$models.Address | null> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Address | null>} */ export function Yay() { - let $resultPromise = /** @type {any} */($Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/services.OtherService.Yay")); - let $typingPromise = /** @type {any} */($resultPromise.then(($result) => { + return $Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/services.OtherService.Yay").then(/** @type {($result: any) => any} */(($result) => { return $$createType1($result); })); - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.js index ef8919860..16b76f94c 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -22,55 +22,49 @@ import * as $models from "./models.js"; /** * Get someone. * @param {$models.Alias} aliasValue - * @returns {Promise<$models.Person> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Person>} */ export function Get(aliasValue) { - let $resultPromise = /** @type {any} */($Call.ByID(1928502664, aliasValue)); - return $resultPromise; + return $Call.ByID(1928502664, aliasValue); } /** * Apparently, aliases are all the rage right now. * @param {$models.AliasedPerson} p - * @returns {Promise<$models.StrangelyAliasedPerson> & { cancel(): void }} + * @returns {$CancellablePromise<$models.StrangelyAliasedPerson>} */ export function GetButAliased(p) { - let $resultPromise = /** @type {any} */($Call.ByID(1896499664, p)); - return $resultPromise; + return $Call.ByID(1896499664, p); } /** * Get someone quite different. - * @returns {Promise<$models.GenericPerson> & { cancel(): void }} + * @returns {$CancellablePromise<$models.GenericPerson>} */ export function GetButDifferent() { - let $resultPromise = /** @type {any} */($Call.ByID(2240931744)); - return $resultPromise; + return $Call.ByID(2240931744); } /** - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function GetButForeignPrivateAlias() { - let $resultPromise = /** @type {any} */($Call.ByID(643456960)); - return $resultPromise; + return $Call.ByID(643456960); } /** - * @returns {Promise<$models.AliasGroup> & { cancel(): void }} + * @returns {$CancellablePromise<$models.AliasGroup>} */ export function GetButGenericAliases() { - let $resultPromise = /** @type {any} */($Call.ByID(914093800)); - return $resultPromise; + return $Call.ByID(914093800); } /** * Greet a lot of unusual things. * @param {$models.EmptyAliasStruct} $0 * @param {$models.EmptyStruct} $1 - * @returns {Promise<$models.AliasStruct> & { cancel(): void }} + * @returns {$CancellablePromise<$models.AliasStruct>} */ export function Greet($0, $1) { - let $resultPromise = /** @type {any} */($Call.ByID(1411160069, $0, $1)); - return $resultPromise; + return $Call.ByID(1411160069, $0, $1); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service7.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service7.js index a12e0e871..2a4188bce 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service7.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service7.js @@ -4,12 +4,11 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; /** - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function TestMethod() { - let $resultPromise = /** @type {any} */($Call.ByID(2241101727)); - return $resultPromise; + return $Call.ByID(2241101727); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service9.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service9.js index 97ffbf7be..ead6f5da4 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service9.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service9.js @@ -4,12 +4,11 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; /** - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function TestMethod2() { - let $resultPromise = /** @type {any} */($Call.ByID(1556848345)); - return $resultPromise; + return $Call.ByID(1556848345); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_json/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_json/greetservice.js index c8cf7d8a4..995d46c13 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_json/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_json/greetservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -19,9 +19,8 @@ import * as $models from "./models.js"; * Greet does XYZ * @param {$models.Person} person * @param {$models.Embedded1} emb - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(person, emb) { - let $resultPromise = /** @type {any} */($Call.ByID(1411160069, person, emb)); - return $resultPromise; + return $Call.ByID(1411160069, person, emb); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_method/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_method/greetservice.js index dd0ac2d2c..0285f6ca4 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_method/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_method/greetservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -25,9 +25,8 @@ import * as $models from "./models.js"; * @param {{ [_: `${number}`]: boolean | null } | null} assoc * @param {(number | null)[] | null} $4 * @param {string[]} other - * @returns {Promise<[$models.Person, any, number[] | null]> & { cancel(): void }} + * @returns {$CancellablePromise<[$models.Person, any, number[] | null]>} */ export function Greet(str, people, $2, assoc, $4, ...other) { - let $resultPromise = /** @type {any} */($Call.ByID(1411160069, str, people, $2, assoc, $4, other)); - return $resultPromise; + return $Call.ByID(1411160069, str, people, $2, assoc, $4, other); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_imports/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_imports/greetservice.js index 7bb0caa65..53027124b 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_imports/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_imports/greetservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,9 +17,8 @@ import * as $models from "./models.js"; /** * Make a cycle. - * @returns {Promise<[$models.StructA, $models.StructC]> & { cancel(): void }} + * @returns {$CancellablePromise<[$models.StructA, $models.StructC]>} */ export function MakeCycles() { - let $resultPromise = /** @type {any} */($Call.ByID(440020721)); - return $resultPromise; + return $Call.ByID(440020721); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_types/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_types/greetservice.js index dede5e3da..382e6bac3 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_types/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_types/greetservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,9 +17,8 @@ import * as $models from "./models.js"; /** * Make a cycle. - * @returns {Promise<[$models.Cyclic, $models.GenericCyclic<$models.GenericCyclic>]> & { cancel(): void }} + * @returns {$CancellablePromise<[$models.Cyclic, $models.GenericCyclic<$models.GenericCyclic>]>} */ export function MakeCycles() { - let $resultPromise = /** @type {any} */($Call.ByID(440020721)); - return $resultPromise; + return $Call.ByID(440020721); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/internalservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/internalservice.js index 1f5b27968..f96a46e77 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/internalservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/internalservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,9 +17,8 @@ import * as $models from "./models.js"; /** * @param {$models.InternalModel} $0 - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Method($0) { - let $resultPromise = /** @type {any} */($Call.ByID(538079117, $0)); - return $resultPromise; + return $Call.ByID(538079117, $0); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/service.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/service.js index c6fa4555b..0d869be84 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/service.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/service.js @@ -4,7 +4,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -12,20 +12,18 @@ import * as otherpackage$0 from "./otherpackage/models.js"; /** * @param {string} $0 - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ function InternalMethod($0) { - let $resultPromise = /** @type {any} */($Call.ByID(3518775569, $0)); - return $resultPromise; + return $Call.ByID(3518775569, $0); } /** * @param {otherpackage$0.Dummy} $0 - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function VisibleMethod($0) { - let $resultPromise = /** @type {any} */($Call.ByID(474018228, $0)); - return $resultPromise; + return $Call.ByID(474018228, $0); } /** diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/unexportedservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/unexportedservice.js index b29fdb615..573852d5a 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/unexportedservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/unexportedservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,9 +17,8 @@ import * as $models from "./models.js"; /** * @param {$models.unexportedModel} $0 - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Method($0) { - let $resultPromise = /** @type {any} */($Call.ByID(37626172, $0)); - return $resultPromise; + return $Call.ByID(37626172, $0); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/embedded_interface/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/embedded_interface/greetservice.js index 79d37c9ae..d364009d6 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/embedded_interface/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/embedded_interface/greetservice.js @@ -9,50 +9,45 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; /** * Comment 1. - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Method1() { - let $resultPromise = /** @type {any} */($Call.ByID(841558284)); - return $resultPromise; + return $Call.ByID(841558284); } /** * Comment 2. - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Method2() { - let $resultPromise = /** @type {any} */($Call.ByID(891891141)); - return $resultPromise; + return $Call.ByID(891891141); } /** * Comment 3a. * Comment 3b. - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Method3() { - let $resultPromise = /** @type {any} */($Call.ByID(875113522)); - return $resultPromise; + return $Call.ByID(875113522); } /** * Comment 4. - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Method4() { - let $resultPromise = /** @type {any} */($Call.ByID(791225427)); - return $resultPromise; + return $Call.ByID(791225427); } /** * Comment 5. - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Method5() { - let $resultPromise = /** @type {any} */($Call.ByID(774447808)); - return $resultPromise; + return $Call.ByID(774447808); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/enum/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/enum/greetservice.js index 8596b37d8..f14b3b6b2 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/enum/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/enum/greetservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -19,19 +19,17 @@ import * as $models from "./models.js"; * Greet does XYZ * @param {string} name * @param {$models.Title} title - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name, title) { - let $resultPromise = /** @type {any} */($Call.ByID(1411160069, name, title)); - return $resultPromise; + return $Call.ByID(1411160069, name, title); } /** * NewPerson creates a new person * @param {string} name - * @returns {Promise<$models.Person | null> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Person | null>} */ export function NewPerson(name) { - let $resultPromise = /** @type {any} */($Call.ByID(1661412647, name)); - return $resultPromise; + return $Call.ByID(1661412647, name); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/enum_from_imported_package/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/enum_from_imported_package/greetservice.js index 0620037d8..508c12b72 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/enum_from_imported_package/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/enum_from_imported_package/greetservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -19,9 +19,8 @@ import * as services$0 from "./services/models.js"; * Greet does XYZ * @param {string} name * @param {services$0.Title} title - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name, title) { - let $resultPromise = /** @type {any} */($Call.ByID(1411160069, name, title)); - return $resultPromise; + return $Call.ByID(1411160069, name, title); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/greetservice.js index 4e1a41312..40d2245b9 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/greetservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -18,19 +18,17 @@ import * as $models from "./models.js"; /** * Greet does XYZ * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name) { - let $resultPromise = /** @type {any} */($Call.ByID(1411160069, name)); - return $resultPromise; + return $Call.ByID(1411160069, name); } /** * NewPerson creates a new person * @param {string} name - * @returns {Promise<$models.Person | null> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Person | null>} */ export function NewPerson(name) { - let $resultPromise = /** @type {any} */($Call.ByID(1661412647, name)); - return $resultPromise; + return $Call.ByID(1661412647, name); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/services/otherservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/services/otherservice.js index 96dc85e8f..dff4e0d5f 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/services/otherservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/services/otherservice.js @@ -10,7 +10,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -18,9 +18,8 @@ import * as $models from "./models.js"; /** * Yay does this and that - * @returns {Promise<$models.Address | null> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Address | null>} */ export function Yay() { - let $resultPromise = /** @type {any} */($Call.ByID(2007737399)); - return $resultPromise; + return $Call.ByID(2007737399); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/greetservice.js index 4e1a41312..40d2245b9 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/greetservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -18,19 +18,17 @@ import * as $models from "./models.js"; /** * Greet does XYZ * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name) { - let $resultPromise = /** @type {any} */($Call.ByID(1411160069, name)); - return $resultPromise; + return $Call.ByID(1411160069, name); } /** * NewPerson creates a new person * @param {string} name - * @returns {Promise<$models.Person | null> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Person | null>} */ export function NewPerson(name) { - let $resultPromise = /** @type {any} */($Call.ByID(1661412647, name)); - return $resultPromise; + return $Call.ByID(1661412647, name); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/services/other/otherservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/services/other/otherservice.js index acc6a59de..182a9e091 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/services/other/otherservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/services/other/otherservice.js @@ -10,7 +10,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -18,9 +18,8 @@ import * as $models from "./models.js"; /** * Yay does this and that - * @returns {Promise<$models.Address | null> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Address | null>} */ export function Yay() { - let $resultPromise = /** @type {any} */($Call.ByID(2447353446)); - return $resultPromise; + return $Call.ByID(2447353446); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_multiple_files/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_multiple_files/greetservice.js index cf528985b..9343d5531 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_multiple_files/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_multiple_files/greetservice.js @@ -4,13 +4,12 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; /** * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name) { - let $resultPromise = /** @type {any} */($Call.ByID(1411160069, name)); - return $resultPromise; + return $Call.ByID(1411160069, name); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single/greetservice.js index a46cb2e4f..6c1448d81 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single/greetservice.js @@ -9,14 +9,13 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; /** * Greet someone * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name) { - let $resultPromise = /** @type {any} */($Call.ByID(1411160069, name)); - return $resultPromise; + return $Call.ByID(1411160069, name); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_context/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_context/greetservice.js index 20aaad58f..be0cf5ce8 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_context/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_context/greetservice.js @@ -9,24 +9,22 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; /** * Greet someone * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name) { - let $resultPromise = /** @type {any} */($Call.ByID(1411160069, name)); - return $resultPromise; + return $Call.ByID(1411160069, name); } /** * Greet someone * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function GreetWithContext(name) { - let $resultPromise = /** @type {any} */($Call.ByID(1310150960, name)); - return $resultPromise; + return $Call.ByID(1310150960, name); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_internal/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_internal/greetservice.js index a46cb2e4f..6c1448d81 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_internal/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_internal/greetservice.js @@ -9,14 +9,13 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; /** * Greet someone * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name) { - let $resultPromise = /** @type {any} */($Call.ByID(1411160069, name)); - return $resultPromise; + return $Call.ByID(1411160069, name); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/service.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/service.js index 3e9005230..810db1875 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/service.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/service.js @@ -4,16 +4,15 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports import * as $models from "./models.js"; /** - * @returns {Promise<$models.Maps<$models.PointerTextMarshaler, number, number, $models.ValueTextMarshaler, $models.PointerTextMarshaler | null, $models.ValueTextMarshaler, $models.StringType, $models.ValueTextMarshaler, $models.PointerTextMarshaler | null>> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Maps<$models.PointerTextMarshaler, number, number, $models.ValueTextMarshaler, $models.PointerTextMarshaler | null, $models.ValueTextMarshaler, $models.StringType, $models.ValueTextMarshaler, $models.PointerTextMarshaler | null>>} */ export function Method() { - let $resultPromise = /** @type {any} */($Call.ByID(4021345184)); - return $resultPromise; + return $Call.ByID(4021345184); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/marshalers/service.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/marshalers/service.js index a376469fb..5ba9fe470 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/marshalers/service.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/marshalers/service.js @@ -4,16 +4,15 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports import * as $models from "./models.js"; /** - * @returns {Promise<$models.Data> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Data>} */ export function Method() { - let $resultPromise = /** @type {any} */($Call.ByID(4021345184)); - return $resultPromise; + return $Call.ByID(4021345184); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/other/othermethods.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/other/othermethods.js index 0fa21bec4..d647deeb4 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/other/othermethods.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/other/othermethods.js @@ -9,13 +9,12 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; /** * LikeThisOtherOne does nothing as well, but is different. - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function LikeThisOtherOne() { - let $resultPromise = /** @type {any} */($Call.ByID(3606939272)); - return $resultPromise; + return $Call.ByID(3606939272); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/somemethods.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/somemethods.js index fb7703b90..dca6f4e6c 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/somemethods.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/somemethods.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,18 +17,16 @@ import * as $models from "./models.js"; /** * LikeThisOne is an example method that does nothing. - * @returns {Promise<[$models.Person, $models.HowDifferent, $models.PrivatePerson]> & { cancel(): void }} + * @returns {$CancellablePromise<[$models.Person, $models.HowDifferent, $models.PrivatePerson]>} */ export function LikeThisOne() { - let $resultPromise = /** @type {any} */($Call.ByID(2124352079)); - return $resultPromise; + return $Call.ByID(2124352079); } /** * LikeThisOtherOne does nothing as well, but is different. - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function LikeThisOtherOne() { - let $resultPromise = /** @type {any} */($Call.ByID(4281222271)); - return $resultPromise; + return $Call.ByID(4281222271); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedother.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedother.js index de602db49..19bdcac29 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedother.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedother.js @@ -9,13 +9,12 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; /** * LikeThisOtherOne does nothing as well, but is different. - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function LikeThisOtherOne() { - let $resultPromise = /** @type {any} */($Call.ByID(3566862802)); - return $resultPromise; + return $Call.ByID(3566862802); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedservice.js index 48bff3e1b..f50558b8c 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,18 +17,16 @@ import * as nobindingshere$0 from "../no_bindings_here/models.js"; /** * LikeThisOne is an example method that does nothing. - * @returns {Promise<[nobindingshere$0.Person, nobindingshere$0.HowDifferent, nobindingshere$0.PrivatePerson]> & { cancel(): void }} + * @returns {$CancellablePromise<[nobindingshere$0.Person, nobindingshere$0.HowDifferent, nobindingshere$0.PrivatePerson]>} */ export function LikeThisOne() { - let $resultPromise = /** @type {any} */($Call.ByID(2590614085)); - return $resultPromise; + return $Call.ByID(2590614085); } /** * LikeThisOtherOne does nothing as well, but is different. - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function LikeThisOtherOne() { - let $resultPromise = /** @type {any} */($Call.ByID(773650321)); - return $resultPromise; + return $Call.ByID(773650321); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/greetservice.js index 5c4ed0a89..3597b6460 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/greetservice.js @@ -9,14 +9,13 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; /** * Greet someone * @param {string} $0 - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet($0) { - let $resultPromise = /** @type {any} */($Call.ByID(1411160069, $0)); - return $resultPromise; + return $Call.ByID(1411160069, $0); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/greetservice.js index cf528985b..9343d5531 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/greetservice.js @@ -4,13 +4,12 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; /** * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name) { - let $resultPromise = /** @type {any} */($Call.ByID(1411160069, name)); - return $resultPromise; + return $Call.ByID(1411160069, name); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/otherservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/otherservice.js index 09356e523..b4f3f039c 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/otherservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/otherservice.js @@ -4,12 +4,11 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; /** - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Hello() { - let $resultPromise = /** @type {any} */($Call.ByID(4249972365)); - return $resultPromise; + return $Call.ByID(4249972365); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/greetservice.js index cf528985b..9343d5531 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/greetservice.js @@ -4,13 +4,12 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; /** * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name) { - let $resultPromise = /** @type {any} */($Call.ByID(1411160069, name)); - return $resultPromise; + return $Call.ByID(1411160069, name); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/otherservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/otherservice.js index 09356e523..b4f3f039c 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/otherservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/otherservice.js @@ -4,12 +4,11 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; /** - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Hello() { - let $resultPromise = /** @type {any} */($Call.ByID(4249972365)); - return $resultPromise; + return $Call.ByID(4249972365); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/greetservice.js index 4e1a41312..40d2245b9 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/greetservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -18,19 +18,17 @@ import * as $models from "./models.js"; /** * Greet does XYZ * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name) { - let $resultPromise = /** @type {any} */($Call.ByID(1411160069, name)); - return $resultPromise; + return $Call.ByID(1411160069, name); } /** * NewPerson creates a new person * @param {string} name - * @returns {Promise<$models.Person | null> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Person | null>} */ export function NewPerson(name) { - let $resultPromise = /** @type {any} */($Call.ByID(1661412647, name)); - return $resultPromise; + return $Call.ByID(1661412647, name); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/services/otherservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/services/otherservice.js index 5f91bf18c..7a4789f75 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/services/otherservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/services/otherservice.js @@ -10,7 +10,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -18,9 +18,8 @@ import * as $models from "./models.js"; /** * Yay does this and that - * @returns {Promise<$models.Address | null> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Address | null>} */ export function Yay() { - let $resultPromise = /** @type {any} */($Call.ByID(3568225479)); - return $resultPromise; + return $Call.ByID(3568225479); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_non_pointer_single/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_non_pointer_single/greetservice.js index a8b648ed1..ddd5e8916 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_non_pointer_single/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_non_pointer_single/greetservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,387 +17,344 @@ import * as $models from "./models.js"; /** * @param {number[]} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function ArrayInt($in) { - let $resultPromise = /** @type {any} */($Call.ByID(3862002418, $in)); - return $resultPromise; + return $Call.ByID(3862002418, $in); } /** * @param {boolean} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function BoolInBoolOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(2424639793, $in)); - return $resultPromise; + return $Call.ByID(2424639793, $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Float32InFloat32Out($in) { - let $resultPromise = /** @type {any} */($Call.ByID(3132595881, $in)); - return $resultPromise; + return $Call.ByID(3132595881, $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Float64InFloat64Out($in) { - let $resultPromise = /** @type {any} */($Call.ByID(2182412247, $in)); - return $resultPromise; + return $Call.ByID(2182412247, $in); } /** * Greet someone * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name) { - let $resultPromise = /** @type {any} */($Call.ByID(1411160069, name)); - return $resultPromise; + return $Call.ByID(1411160069, name); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int16InIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(3306292566, $in)); - return $resultPromise; + return $Call.ByID(3306292566, $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int16PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByID(1754277916, $in)); - return $resultPromise; + return $Call.ByID(1754277916, $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int32InIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(1909469092, $in)); - return $resultPromise; + return $Call.ByID(1909469092, $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int32PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByID(4251088558, $in)); - return $resultPromise; + return $Call.ByID(4251088558, $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int64InIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(1343888303, $in)); - return $resultPromise; + return $Call.ByID(1343888303, $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int64PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByID(2205561041, $in)); - return $resultPromise; + return $Call.ByID(2205561041, $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int8InIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(572240879, $in)); - return $resultPromise; + return $Call.ByID(572240879, $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int8PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByID(2189402897, $in)); - return $resultPromise; + return $Call.ByID(2189402897, $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function IntInIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(642881729, $in)); - return $resultPromise; + return $Call.ByID(642881729, $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function IntPointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByID(1066151743, $in)); - return $resultPromise; + return $Call.ByID(1066151743, $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function IntPointerInputNamedOutputs($in) { - let $resultPromise = /** @type {any} */($Call.ByID(2718999663, $in)); - return $resultPromise; + return $Call.ByID(2718999663, $in); } /** * @param {{ [_: `${number}`]: number } | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function MapIntInt($in) { - let $resultPromise = /** @type {any} */($Call.ByID(2386486356, $in)); - return $resultPromise; + return $Call.ByID(2386486356, $in); } /** * @param {{ [_: `${number}`]: number | null } | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function MapIntIntPointer($in) { - let $resultPromise = /** @type {any} */($Call.ByID(2163571325, $in)); - return $resultPromise; + return $Call.ByID(2163571325, $in); } /** * @param {{ [_: `${number}`]: number[] | null } | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function MapIntSliceInt($in) { - let $resultPromise = /** @type {any} */($Call.ByID(2900172572, $in)); - return $resultPromise; + return $Call.ByID(2900172572, $in); } /** * @param {{ [_: `${number}`]: number[] | null } | null} $in - * @returns {Promise<{ [_: `${number}`]: number[] | null } | null> & { cancel(): void }} + * @returns {$CancellablePromise<{ [_: `${number}`]: number[] | null } | null>} */ export function MapIntSliceIntInMapIntSliceIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(881980169, $in)); - return $resultPromise; + return $Call.ByID(881980169, $in); } /** - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function NoInputsStringOut() { - let $resultPromise = /** @type {any} */($Call.ByID(1075577233)); - return $resultPromise; + return $Call.ByID(1075577233); } /** * @param {boolean | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function PointerBoolInBoolOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(3589606958, $in)); - return $resultPromise; + return $Call.ByID(3589606958, $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function PointerFloat32InFloat32Out($in) { - let $resultPromise = /** @type {any} */($Call.ByID(224675106, $in)); - return $resultPromise; + return $Call.ByID(224675106, $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function PointerFloat64InFloat64Out($in) { - let $resultPromise = /** @type {any} */($Call.ByID(2124953624, $in)); - return $resultPromise; + return $Call.ByID(2124953624, $in); } /** * @param {{ [_: `${number}`]: number } | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function PointerMapIntInt($in) { - let $resultPromise = /** @type {any} */($Call.ByID(3516977899, $in)); - return $resultPromise; + return $Call.ByID(3516977899, $in); } /** * @param {string | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function PointerStringInStringOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(229603958, $in)); - return $resultPromise; + return $Call.ByID(229603958, $in); } /** * @param {string[] | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function StringArrayInputNamedOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByID(3678582682, $in)); - return $resultPromise; + return $Call.ByID(3678582682, $in); } /** * @param {string[] | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function StringArrayInputNamedOutputs($in) { - let $resultPromise = /** @type {any} */($Call.ByID(319259595, $in)); - return $resultPromise; + return $Call.ByID(319259595, $in); } /** * @param {string[] | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function StringArrayInputStringArrayOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(383995060, $in)); - return $resultPromise; + return $Call.ByID(383995060, $in); } /** * @param {string[] | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function StringArrayInputStringOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(1091960237, $in)); - return $resultPromise; + return $Call.ByID(1091960237, $in); } /** * @param {$models.Person} $in - * @returns {Promise<$models.Person> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Person>} */ export function StructInputStructOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByID(3835643147, $in)); - return $resultPromise; + return $Call.ByID(3835643147, $in); } /** * @param {$models.Person | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function StructPointerInputErrorOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByID(2447692557, $in)); - return $resultPromise; + return $Call.ByID(2447692557, $in); } /** * @param {$models.Person | null} $in - * @returns {Promise<$models.Person | null> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Person | null>} */ export function StructPointerInputStructPointerOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByID(2943477349, $in)); - return $resultPromise; + return $Call.ByID(2943477349, $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt16InUIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(3401034892, $in)); - return $resultPromise; + return $Call.ByID(3401034892, $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt16PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByID(1236957573, $in)); - return $resultPromise; + return $Call.ByID(1236957573, $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt32InUIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(1160383782, $in)); - return $resultPromise; + return $Call.ByID(1160383782, $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt32PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByID(1739300671, $in)); - return $resultPromise; + return $Call.ByID(1739300671, $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt64InUIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(793803239, $in)); - return $resultPromise; + return $Call.ByID(793803239, $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt64PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByID(1403757716, $in)); - return $resultPromise; + return $Call.ByID(1403757716, $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt8InUIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(2988345717, $in)); - return $resultPromise; + return $Call.ByID(2988345717, $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt8PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByID(518250834, $in)); - return $resultPromise; + return $Call.ByID(518250834, $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UIntInUIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(2836661285, $in)); - return $resultPromise; + return $Call.ByID(2836661285, $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UIntPointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByID(1367187362, $in)); - return $resultPromise; + return $Call.ByID(1367187362, $in); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_single/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_single/greetservice.js index a8b648ed1..ddd5e8916 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_single/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_single/greetservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,387 +17,344 @@ import * as $models from "./models.js"; /** * @param {number[]} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function ArrayInt($in) { - let $resultPromise = /** @type {any} */($Call.ByID(3862002418, $in)); - return $resultPromise; + return $Call.ByID(3862002418, $in); } /** * @param {boolean} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function BoolInBoolOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(2424639793, $in)); - return $resultPromise; + return $Call.ByID(2424639793, $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Float32InFloat32Out($in) { - let $resultPromise = /** @type {any} */($Call.ByID(3132595881, $in)); - return $resultPromise; + return $Call.ByID(3132595881, $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Float64InFloat64Out($in) { - let $resultPromise = /** @type {any} */($Call.ByID(2182412247, $in)); - return $resultPromise; + return $Call.ByID(2182412247, $in); } /** * Greet someone * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name) { - let $resultPromise = /** @type {any} */($Call.ByID(1411160069, name)); - return $resultPromise; + return $Call.ByID(1411160069, name); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int16InIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(3306292566, $in)); - return $resultPromise; + return $Call.ByID(3306292566, $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int16PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByID(1754277916, $in)); - return $resultPromise; + return $Call.ByID(1754277916, $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int32InIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(1909469092, $in)); - return $resultPromise; + return $Call.ByID(1909469092, $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int32PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByID(4251088558, $in)); - return $resultPromise; + return $Call.ByID(4251088558, $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int64InIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(1343888303, $in)); - return $resultPromise; + return $Call.ByID(1343888303, $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int64PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByID(2205561041, $in)); - return $resultPromise; + return $Call.ByID(2205561041, $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int8InIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(572240879, $in)); - return $resultPromise; + return $Call.ByID(572240879, $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int8PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByID(2189402897, $in)); - return $resultPromise; + return $Call.ByID(2189402897, $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function IntInIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(642881729, $in)); - return $resultPromise; + return $Call.ByID(642881729, $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function IntPointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByID(1066151743, $in)); - return $resultPromise; + return $Call.ByID(1066151743, $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function IntPointerInputNamedOutputs($in) { - let $resultPromise = /** @type {any} */($Call.ByID(2718999663, $in)); - return $resultPromise; + return $Call.ByID(2718999663, $in); } /** * @param {{ [_: `${number}`]: number } | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function MapIntInt($in) { - let $resultPromise = /** @type {any} */($Call.ByID(2386486356, $in)); - return $resultPromise; + return $Call.ByID(2386486356, $in); } /** * @param {{ [_: `${number}`]: number | null } | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function MapIntIntPointer($in) { - let $resultPromise = /** @type {any} */($Call.ByID(2163571325, $in)); - return $resultPromise; + return $Call.ByID(2163571325, $in); } /** * @param {{ [_: `${number}`]: number[] | null } | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function MapIntSliceInt($in) { - let $resultPromise = /** @type {any} */($Call.ByID(2900172572, $in)); - return $resultPromise; + return $Call.ByID(2900172572, $in); } /** * @param {{ [_: `${number}`]: number[] | null } | null} $in - * @returns {Promise<{ [_: `${number}`]: number[] | null } | null> & { cancel(): void }} + * @returns {$CancellablePromise<{ [_: `${number}`]: number[] | null } | null>} */ export function MapIntSliceIntInMapIntSliceIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(881980169, $in)); - return $resultPromise; + return $Call.ByID(881980169, $in); } /** - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function NoInputsStringOut() { - let $resultPromise = /** @type {any} */($Call.ByID(1075577233)); - return $resultPromise; + return $Call.ByID(1075577233); } /** * @param {boolean | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function PointerBoolInBoolOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(3589606958, $in)); - return $resultPromise; + return $Call.ByID(3589606958, $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function PointerFloat32InFloat32Out($in) { - let $resultPromise = /** @type {any} */($Call.ByID(224675106, $in)); - return $resultPromise; + return $Call.ByID(224675106, $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function PointerFloat64InFloat64Out($in) { - let $resultPromise = /** @type {any} */($Call.ByID(2124953624, $in)); - return $resultPromise; + return $Call.ByID(2124953624, $in); } /** * @param {{ [_: `${number}`]: number } | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function PointerMapIntInt($in) { - let $resultPromise = /** @type {any} */($Call.ByID(3516977899, $in)); - return $resultPromise; + return $Call.ByID(3516977899, $in); } /** * @param {string | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function PointerStringInStringOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(229603958, $in)); - return $resultPromise; + return $Call.ByID(229603958, $in); } /** * @param {string[] | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function StringArrayInputNamedOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByID(3678582682, $in)); - return $resultPromise; + return $Call.ByID(3678582682, $in); } /** * @param {string[] | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function StringArrayInputNamedOutputs($in) { - let $resultPromise = /** @type {any} */($Call.ByID(319259595, $in)); - return $resultPromise; + return $Call.ByID(319259595, $in); } /** * @param {string[] | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function StringArrayInputStringArrayOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(383995060, $in)); - return $resultPromise; + return $Call.ByID(383995060, $in); } /** * @param {string[] | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function StringArrayInputStringOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(1091960237, $in)); - return $resultPromise; + return $Call.ByID(1091960237, $in); } /** * @param {$models.Person} $in - * @returns {Promise<$models.Person> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Person>} */ export function StructInputStructOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByID(3835643147, $in)); - return $resultPromise; + return $Call.ByID(3835643147, $in); } /** * @param {$models.Person | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function StructPointerInputErrorOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByID(2447692557, $in)); - return $resultPromise; + return $Call.ByID(2447692557, $in); } /** * @param {$models.Person | null} $in - * @returns {Promise<$models.Person | null> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Person | null>} */ export function StructPointerInputStructPointerOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByID(2943477349, $in)); - return $resultPromise; + return $Call.ByID(2943477349, $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt16InUIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(3401034892, $in)); - return $resultPromise; + return $Call.ByID(3401034892, $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt16PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByID(1236957573, $in)); - return $resultPromise; + return $Call.ByID(1236957573, $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt32InUIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(1160383782, $in)); - return $resultPromise; + return $Call.ByID(1160383782, $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt32PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByID(1739300671, $in)); - return $resultPromise; + return $Call.ByID(1739300671, $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt64InUIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(793803239, $in)); - return $resultPromise; + return $Call.ByID(793803239, $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt64PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByID(1403757716, $in)); - return $resultPromise; + return $Call.ByID(1403757716, $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt8InUIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(2988345717, $in)); - return $resultPromise; + return $Call.ByID(2988345717, $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt8PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByID(518250834, $in)); - return $resultPromise; + return $Call.ByID(518250834, $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UIntInUIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByID(2836661285, $in)); - return $resultPromise; + return $Call.ByID(2836661285, $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UIntPointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByID(1367187362, $in)); - return $resultPromise; + return $Call.ByID(1367187362, $in); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single/greetservice.js index a46cb2e4f..6c1448d81 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single/greetservice.js @@ -9,14 +9,13 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; /** * Greet someone * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name) { - let $resultPromise = /** @type {any} */($Call.ByID(1411160069, name)); - return $resultPromise; + return $Call.ByID(1411160069, name); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_function/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_function/greetservice.js index a46cb2e4f..6c1448d81 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_function/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_function/greetservice.js @@ -9,14 +9,13 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; /** * Greet someone * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name) { - let $resultPromise = /** @type {any} */($Call.ByID(1411160069, name)); - return $resultPromise; + return $Call.ByID(1411160069, name); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/greetservice.js index 4e1a41312..40d2245b9 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/greetservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -18,19 +18,17 @@ import * as $models from "./models.js"; /** * Greet does XYZ * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name) { - let $resultPromise = /** @type {any} */($Call.ByID(1411160069, name)); - return $resultPromise; + return $Call.ByID(1411160069, name); } /** * NewPerson creates a new person * @param {string} name - * @returns {Promise<$models.Person | null> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Person | null>} */ export function NewPerson(name) { - let $resultPromise = /** @type {any} */($Call.ByID(1661412647, name)); - return $resultPromise; + return $Call.ByID(1661412647, name); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/services/otherservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/services/otherservice.js index fba063a2b..3c9c56546 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/services/otherservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/services/otherservice.js @@ -10,7 +10,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -18,9 +18,8 @@ import * as $models from "./models.js"; /** * Yay does this and that - * @returns {Promise<$models.Address | null> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Address | null>} */ export function Yay() { - let $resultPromise = /** @type {any} */($Call.ByID(1491748400)); - return $resultPromise; + return $Call.ByID(1491748400); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.js index b006e17a5..cc81267aa 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -22,55 +22,49 @@ import * as $models from "./models.js"; /** * Get someone. * @param {$models.Alias} aliasValue - * @returns {Promise<$models.Person> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Person>} */ export function Get(aliasValue) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Get", aliasValue)); - return $resultPromise; + return $Call.ByName("main.GreetService.Get", aliasValue); } /** * Apparently, aliases are all the rage right now. * @param {$models.AliasedPerson} p - * @returns {Promise<$models.StrangelyAliasedPerson> & { cancel(): void }} + * @returns {$CancellablePromise<$models.StrangelyAliasedPerson>} */ export function GetButAliased(p) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.GetButAliased", p)); - return $resultPromise; + return $Call.ByName("main.GreetService.GetButAliased", p); } /** * Get someone quite different. - * @returns {Promise<$models.GenericPerson> & { cancel(): void }} + * @returns {$CancellablePromise<$models.GenericPerson>} */ export function GetButDifferent() { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.GetButDifferent")); - return $resultPromise; + return $Call.ByName("main.GreetService.GetButDifferent"); } /** - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function GetButForeignPrivateAlias() { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.GetButForeignPrivateAlias")); - return $resultPromise; + return $Call.ByName("main.GreetService.GetButForeignPrivateAlias"); } /** - * @returns {Promise<$models.AliasGroup> & { cancel(): void }} + * @returns {$CancellablePromise<$models.AliasGroup>} */ export function GetButGenericAliases() { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.GetButGenericAliases")); - return $resultPromise; + return $Call.ByName("main.GreetService.GetButGenericAliases"); } /** * Greet a lot of unusual things. * @param {$models.EmptyAliasStruct} $0 * @param {$models.EmptyStruct} $1 - * @returns {Promise<$models.AliasStruct> & { cancel(): void }} + * @returns {$CancellablePromise<$models.AliasStruct>} */ export function Greet($0, $1) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Greet", $0, $1)); - return $resultPromise; + return $Call.ByName("main.GreetService.Greet", $0, $1); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service7.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service7.js index 2643e60ec..f62552e8a 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service7.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service7.js @@ -4,12 +4,11 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; /** - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function TestMethod() { - let $resultPromise = /** @type {any} */($Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config.Service7.TestMethod")); - return $resultPromise; + return $Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config.Service7.TestMethod"); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service9.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service9.js index 84fb14e96..244e74afe 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service9.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service9.js @@ -4,12 +4,11 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; /** - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function TestMethod2() { - let $resultPromise = /** @type {any} */($Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config.Service9.TestMethod2")); - return $resultPromise; + return $Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config.Service9.TestMethod2"); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_json/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_json/greetservice.js index dad26c793..e146c3669 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_json/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_json/greetservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -19,9 +19,8 @@ import * as $models from "./models.js"; * Greet does XYZ * @param {$models.Person} person * @param {$models.Embedded1} emb - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(person, emb) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Greet", person, emb)); - return $resultPromise; + return $Call.ByName("main.GreetService.Greet", person, emb); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_method/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_method/greetservice.js index 0569e8802..03ef1f90f 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_method/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_method/greetservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -25,9 +25,8 @@ import * as $models from "./models.js"; * @param {{ [_: `${number}`]: boolean | null } | null} assoc * @param {(number | null)[] | null} $4 * @param {string[]} other - * @returns {Promise<[$models.Person, any, number[] | null]> & { cancel(): void }} + * @returns {$CancellablePromise<[$models.Person, any, number[] | null]>} */ export function Greet(str, people, $2, assoc, $4, ...other) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Greet", str, people, $2, assoc, $4, other)); - return $resultPromise; + return $Call.ByName("main.GreetService.Greet", str, people, $2, assoc, $4, other); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_imports/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_imports/greetservice.js index 78783fcd6..8203e4168 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_imports/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_imports/greetservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,9 +17,8 @@ import * as $models from "./models.js"; /** * Make a cycle. - * @returns {Promise<[$models.StructA, $models.StructC]> & { cancel(): void }} + * @returns {$CancellablePromise<[$models.StructA, $models.StructC]>} */ export function MakeCycles() { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.MakeCycles")); - return $resultPromise; + return $Call.ByName("main.GreetService.MakeCycles"); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_types/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_types/greetservice.js index 5ae511419..623e88035 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_types/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_types/greetservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,9 +17,8 @@ import * as $models from "./models.js"; /** * Make a cycle. - * @returns {Promise<[$models.Cyclic, $models.GenericCyclic<$models.GenericCyclic>]> & { cancel(): void }} + * @returns {$CancellablePromise<[$models.Cyclic, $models.GenericCyclic<$models.GenericCyclic>]>} */ export function MakeCycles() { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.MakeCycles")); - return $resultPromise; + return $Call.ByName("main.GreetService.MakeCycles"); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/internalservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/internalservice.js index 4f75ec8b3..374d13203 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/internalservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/internalservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,9 +17,8 @@ import * as $models from "./models.js"; /** * @param {$models.InternalModel} $0 - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Method($0) { - let $resultPromise = /** @type {any} */($Call.ByName("main.InternalService.Method", $0)); - return $resultPromise; + return $Call.ByName("main.InternalService.Method", $0); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/service.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/service.js index ffc0d244c..8332051eb 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/service.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/service.js @@ -4,7 +4,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -12,20 +12,18 @@ import * as otherpackage$0 from "./otherpackage/models.js"; /** * @param {string} $0 - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ function InternalMethod($0) { - let $resultPromise = /** @type {any} */($Call.ByName("main.Service.InternalMethod", $0)); - return $resultPromise; + return $Call.ByName("main.Service.InternalMethod", $0); } /** * @param {otherpackage$0.Dummy} $0 - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function VisibleMethod($0) { - let $resultPromise = /** @type {any} */($Call.ByName("main.Service.VisibleMethod", $0)); - return $resultPromise; + return $Call.ByName("main.Service.VisibleMethod", $0); } /** diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/unexportedservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/unexportedservice.js index 52f0a8c34..1fe8a0f69 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/unexportedservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/unexportedservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,9 +17,8 @@ import * as $models from "./models.js"; /** * @param {$models.unexportedModel} $0 - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Method($0) { - let $resultPromise = /** @type {any} */($Call.ByName("main.unexportedService.Method", $0)); - return $resultPromise; + return $Call.ByName("main.unexportedService.Method", $0); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/embedded_interface/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/embedded_interface/greetservice.js index 4d53b4d23..3d245f10c 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/embedded_interface/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/embedded_interface/greetservice.js @@ -9,50 +9,45 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; /** * Comment 1. - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Method1() { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Method1")); - return $resultPromise; + return $Call.ByName("main.GreetService.Method1"); } /** * Comment 2. - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Method2() { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Method2")); - return $resultPromise; + return $Call.ByName("main.GreetService.Method2"); } /** * Comment 3a. * Comment 3b. - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Method3() { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Method3")); - return $resultPromise; + return $Call.ByName("main.GreetService.Method3"); } /** * Comment 4. - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Method4() { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Method4")); - return $resultPromise; + return $Call.ByName("main.GreetService.Method4"); } /** * Comment 5. - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Method5() { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Method5")); - return $resultPromise; + return $Call.ByName("main.GreetService.Method5"); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/enum/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/enum/greetservice.js index 6d764269c..fa5b9a262 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/enum/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/enum/greetservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -19,19 +19,17 @@ import * as $models from "./models.js"; * Greet does XYZ * @param {string} name * @param {$models.Title} title - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name, title) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Greet", name, title)); - return $resultPromise; + return $Call.ByName("main.GreetService.Greet", name, title); } /** * NewPerson creates a new person * @param {string} name - * @returns {Promise<$models.Person | null> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Person | null>} */ export function NewPerson(name) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.NewPerson", name)); - return $resultPromise; + return $Call.ByName("main.GreetService.NewPerson", name); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/enum_from_imported_package/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/enum_from_imported_package/greetservice.js index c287b7631..2f953de7c 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/enum_from_imported_package/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/enum_from_imported_package/greetservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -19,9 +19,8 @@ import * as services$0 from "./services/models.js"; * Greet does XYZ * @param {string} name * @param {services$0.Title} title - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name, title) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Greet", name, title)); - return $resultPromise; + return $Call.ByName("main.GreetService.Greet", name, title); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/greetservice.js index 0896a296d..8ab5f3462 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/greetservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -18,19 +18,17 @@ import * as $models from "./models.js"; /** * Greet does XYZ * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Greet", name)); - return $resultPromise; + return $Call.ByName("main.GreetService.Greet", name); } /** * NewPerson creates a new person * @param {string} name - * @returns {Promise<$models.Person | null> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Person | null>} */ export function NewPerson(name) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.NewPerson", name)); - return $resultPromise; + return $Call.ByName("main.GreetService.NewPerson", name); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/services/otherservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/services/otherservice.js index 61a94621e..a27b0fea8 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/services/otherservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/services/otherservice.js @@ -10,7 +10,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -18,9 +18,8 @@ import * as $models from "./models.js"; /** * Yay does this and that - * @returns {Promise<$models.Address | null> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Address | null>} */ export function Yay() { - let $resultPromise = /** @type {any} */($Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/services.OtherService.Yay")); - return $resultPromise; + return $Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/services.OtherService.Yay"); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/greetservice.js index 0896a296d..8ab5f3462 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/greetservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -18,19 +18,17 @@ import * as $models from "./models.js"; /** * Greet does XYZ * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Greet", name)); - return $resultPromise; + return $Call.ByName("main.GreetService.Greet", name); } /** * NewPerson creates a new person * @param {string} name - * @returns {Promise<$models.Person | null> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Person | null>} */ export function NewPerson(name) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.NewPerson", name)); - return $resultPromise; + return $Call.ByName("main.GreetService.NewPerson", name); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/services/other/otherservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/services/other/otherservice.js index abc8c9adc..98097e64f 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/services/other/otherservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/services/other/otherservice.js @@ -10,7 +10,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -18,9 +18,8 @@ import * as $models from "./models.js"; /** * Yay does this and that - * @returns {Promise<$models.Address | null> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Address | null>} */ export function Yay() { - let $resultPromise = /** @type {any} */($Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/services/other.OtherService.Yay")); - return $resultPromise; + return $Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/services/other.OtherService.Yay"); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_multiple_files/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_multiple_files/greetservice.js index 3c8c10bac..e2ba84581 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_multiple_files/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_multiple_files/greetservice.js @@ -4,13 +4,12 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; /** * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Greet", name)); - return $resultPromise; + return $Call.ByName("main.GreetService.Greet", name); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single/greetservice.js index f89c81e83..bba7ea7ea 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single/greetservice.js @@ -9,14 +9,13 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; /** * Greet someone * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Greet", name)); - return $resultPromise; + return $Call.ByName("main.GreetService.Greet", name); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_context/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_context/greetservice.js index 630c0dee3..f89bfc417 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_context/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_context/greetservice.js @@ -9,24 +9,22 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; /** * Greet someone * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Greet", name)); - return $resultPromise; + return $Call.ByName("main.GreetService.Greet", name); } /** * Greet someone * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function GreetWithContext(name) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.GreetWithContext", name)); - return $resultPromise; + return $Call.ByName("main.GreetService.GreetWithContext", name); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_internal/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_internal/greetservice.js index f89c81e83..bba7ea7ea 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_internal/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_internal/greetservice.js @@ -9,14 +9,13 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; /** * Greet someone * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Greet", name)); - return $resultPromise; + return $Call.ByName("main.GreetService.Greet", name); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/service.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/service.js index ec0d3c0b2..e207d968c 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/service.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/service.js @@ -4,16 +4,15 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports import * as $models from "./models.js"; /** - * @returns {Promise<$models.Maps<$models.PointerTextMarshaler, number, number, $models.ValueTextMarshaler, $models.PointerTextMarshaler | null, $models.ValueTextMarshaler, $models.StringType, $models.ValueTextMarshaler, $models.PointerTextMarshaler | null>> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Maps<$models.PointerTextMarshaler, number, number, $models.ValueTextMarshaler, $models.PointerTextMarshaler | null, $models.ValueTextMarshaler, $models.StringType, $models.ValueTextMarshaler, $models.PointerTextMarshaler | null>>} */ export function Method() { - let $resultPromise = /** @type {any} */($Call.ByName("main.Service.Method")); - return $resultPromise; + return $Call.ByName("main.Service.Method"); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/marshalers/service.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/marshalers/service.js index 45837d506..9ad0c6d96 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/marshalers/service.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/marshalers/service.js @@ -4,16 +4,15 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports import * as $models from "./models.js"; /** - * @returns {Promise<$models.Data> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Data>} */ export function Method() { - let $resultPromise = /** @type {any} */($Call.ByName("main.Service.Method")); - return $resultPromise; + return $Call.ByName("main.Service.Method"); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/other/othermethods.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/other/othermethods.js index d93f2bf6f..c3f8ff04b 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/other/othermethods.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/other/othermethods.js @@ -9,13 +9,12 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; /** * LikeThisOtherOne does nothing as well, but is different. - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function LikeThisOtherOne() { - let $resultPromise = /** @type {any} */($Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/other.OtherMethods.LikeThisOtherOne")); - return $resultPromise; + return $Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/other.OtherMethods.LikeThisOtherOne"); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/somemethods.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/somemethods.js index 9d18e16da..92435f679 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/somemethods.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/somemethods.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,18 +17,16 @@ import * as $models from "./models.js"; /** * LikeThisOne is an example method that does nothing. - * @returns {Promise<[$models.Person, $models.HowDifferent, $models.PrivatePerson]> & { cancel(): void }} + * @returns {$CancellablePromise<[$models.Person, $models.HowDifferent, $models.PrivatePerson]>} */ export function LikeThisOne() { - let $resultPromise = /** @type {any} */($Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here.SomeMethods.LikeThisOne")); - return $resultPromise; + return $Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here.SomeMethods.LikeThisOne"); } /** * LikeThisOtherOne does nothing as well, but is different. - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function LikeThisOtherOne() { - let $resultPromise = /** @type {any} */($Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here.SomeMethods.LikeThisOtherOne")); - return $resultPromise; + return $Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here.SomeMethods.LikeThisOtherOne"); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedother.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedother.js index 3842a37d7..490c12c08 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedother.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedother.js @@ -9,13 +9,12 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; /** * LikeThisOtherOne does nothing as well, but is different. - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function LikeThisOtherOne() { - let $resultPromise = /** @type {any} */($Call.ByName("main.EmbedOther.LikeThisOtherOne")); - return $resultPromise; + return $Call.ByName("main.EmbedOther.LikeThisOtherOne"); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedservice.js index b35360d80..5f940b2c7 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,18 +17,16 @@ import * as nobindingshere$0 from "../no_bindings_here/models.js"; /** * LikeThisOne is an example method that does nothing. - * @returns {Promise<[nobindingshere$0.Person, nobindingshere$0.HowDifferent, nobindingshere$0.PrivatePerson]> & { cancel(): void }} + * @returns {$CancellablePromise<[nobindingshere$0.Person, nobindingshere$0.HowDifferent, nobindingshere$0.PrivatePerson]>} */ export function LikeThisOne() { - let $resultPromise = /** @type {any} */($Call.ByName("main.EmbedService.LikeThisOne")); - return $resultPromise; + return $Call.ByName("main.EmbedService.LikeThisOne"); } /** * LikeThisOtherOne does nothing as well, but is different. - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function LikeThisOtherOne() { - let $resultPromise = /** @type {any} */($Call.ByName("main.EmbedService.LikeThisOtherOne")); - return $resultPromise; + return $Call.ByName("main.EmbedService.LikeThisOtherOne"); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/greetservice.js index 5924c91ad..f8c6b19b2 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/greetservice.js @@ -9,14 +9,13 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; /** * Greet someone * @param {string} $0 - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet($0) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Greet", $0)); - return $resultPromise; + return $Call.ByName("main.GreetService.Greet", $0); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/greetservice.js index 3c8c10bac..e2ba84581 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/greetservice.js @@ -4,13 +4,12 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; /** * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Greet", name)); - return $resultPromise; + return $Call.ByName("main.GreetService.Greet", name); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/otherservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/otherservice.js index d12d49d80..2fdca31cc 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/otherservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/otherservice.js @@ -4,12 +4,11 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; /** - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Hello() { - let $resultPromise = /** @type {any} */($Call.ByName("main.OtherService.Hello")); - return $resultPromise; + return $Call.ByName("main.OtherService.Hello"); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/greetservice.js index 3c8c10bac..e2ba84581 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/greetservice.js @@ -4,13 +4,12 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; /** * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Greet", name)); - return $resultPromise; + return $Call.ByName("main.GreetService.Greet", name); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/otherservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/otherservice.js index d12d49d80..2fdca31cc 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/otherservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/otherservice.js @@ -4,12 +4,11 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; /** - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Hello() { - let $resultPromise = /** @type {any} */($Call.ByName("main.OtherService.Hello")); - return $resultPromise; + return $Call.ByName("main.OtherService.Hello"); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/greetservice.js index 0896a296d..8ab5f3462 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/greetservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -18,19 +18,17 @@ import * as $models from "./models.js"; /** * Greet does XYZ * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Greet", name)); - return $resultPromise; + return $Call.ByName("main.GreetService.Greet", name); } /** * NewPerson creates a new person * @param {string} name - * @returns {Promise<$models.Person | null> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Person | null>} */ export function NewPerson(name) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.NewPerson", name)); - return $resultPromise; + return $Call.ByName("main.GreetService.NewPerson", name); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/services/otherservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/services/otherservice.js index 6cec0768c..911d42560 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/services/otherservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/services/otherservice.js @@ -10,7 +10,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -18,9 +18,8 @@ import * as $models from "./models.js"; /** * Yay does this and that - * @returns {Promise<$models.Address | null> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Address | null>} */ export function Yay() { - let $resultPromise = /** @type {any} */($Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/services.OtherService.Yay")); - return $resultPromise; + return $Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/services.OtherService.Yay"); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_non_pointer_single/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_non_pointer_single/greetservice.js index dae4fb2e5..eca08a018 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_non_pointer_single/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_non_pointer_single/greetservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,387 +17,344 @@ import * as $models from "./models.js"; /** * @param {number[]} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function ArrayInt($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.ArrayInt", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.ArrayInt", $in); } /** * @param {boolean} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function BoolInBoolOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.BoolInBoolOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.BoolInBoolOut", $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Float32InFloat32Out($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Float32InFloat32Out", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.Float32InFloat32Out", $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Float64InFloat64Out($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Float64InFloat64Out", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.Float64InFloat64Out", $in); } /** * Greet someone * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Greet", name)); - return $resultPromise; + return $Call.ByName("main.GreetService.Greet", name); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int16InIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Int16InIntOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.Int16InIntOut", $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int16PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Int16PointerInAndOutput", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.Int16PointerInAndOutput", $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int32InIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Int32InIntOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.Int32InIntOut", $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int32PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Int32PointerInAndOutput", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.Int32PointerInAndOutput", $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int64InIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Int64InIntOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.Int64InIntOut", $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int64PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Int64PointerInAndOutput", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.Int64PointerInAndOutput", $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int8InIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Int8InIntOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.Int8InIntOut", $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int8PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Int8PointerInAndOutput", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.Int8PointerInAndOutput", $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function IntInIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.IntInIntOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.IntInIntOut", $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function IntPointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.IntPointerInAndOutput", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.IntPointerInAndOutput", $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function IntPointerInputNamedOutputs($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.IntPointerInputNamedOutputs", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.IntPointerInputNamedOutputs", $in); } /** * @param {{ [_: `${number}`]: number } | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function MapIntInt($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.MapIntInt", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.MapIntInt", $in); } /** * @param {{ [_: `${number}`]: number | null } | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function MapIntIntPointer($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.MapIntIntPointer", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.MapIntIntPointer", $in); } /** * @param {{ [_: `${number}`]: number[] | null } | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function MapIntSliceInt($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.MapIntSliceInt", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.MapIntSliceInt", $in); } /** * @param {{ [_: `${number}`]: number[] | null } | null} $in - * @returns {Promise<{ [_: `${number}`]: number[] | null } | null> & { cancel(): void }} + * @returns {$CancellablePromise<{ [_: `${number}`]: number[] | null } | null>} */ export function MapIntSliceIntInMapIntSliceIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.MapIntSliceIntInMapIntSliceIntOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.MapIntSliceIntInMapIntSliceIntOut", $in); } /** - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function NoInputsStringOut() { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.NoInputsStringOut")); - return $resultPromise; + return $Call.ByName("main.GreetService.NoInputsStringOut"); } /** * @param {boolean | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function PointerBoolInBoolOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.PointerBoolInBoolOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.PointerBoolInBoolOut", $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function PointerFloat32InFloat32Out($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.PointerFloat32InFloat32Out", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.PointerFloat32InFloat32Out", $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function PointerFloat64InFloat64Out($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.PointerFloat64InFloat64Out", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.PointerFloat64InFloat64Out", $in); } /** * @param {{ [_: `${number}`]: number } | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function PointerMapIntInt($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.PointerMapIntInt", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.PointerMapIntInt", $in); } /** * @param {string | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function PointerStringInStringOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.PointerStringInStringOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.PointerStringInStringOut", $in); } /** * @param {string[] | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function StringArrayInputNamedOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.StringArrayInputNamedOutput", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.StringArrayInputNamedOutput", $in); } /** * @param {string[] | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function StringArrayInputNamedOutputs($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.StringArrayInputNamedOutputs", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.StringArrayInputNamedOutputs", $in); } /** * @param {string[] | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function StringArrayInputStringArrayOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.StringArrayInputStringArrayOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.StringArrayInputStringArrayOut", $in); } /** * @param {string[] | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function StringArrayInputStringOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.StringArrayInputStringOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.StringArrayInputStringOut", $in); } /** * @param {$models.Person} $in - * @returns {Promise<$models.Person> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Person>} */ export function StructInputStructOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.StructInputStructOutput", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.StructInputStructOutput", $in); } /** * @param {$models.Person | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function StructPointerInputErrorOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.StructPointerInputErrorOutput", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.StructPointerInputErrorOutput", $in); } /** * @param {$models.Person | null} $in - * @returns {Promise<$models.Person | null> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Person | null>} */ export function StructPointerInputStructPointerOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.StructPointerInputStructPointerOutput", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.StructPointerInputStructPointerOutput", $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt16InUIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.UInt16InUIntOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.UInt16InUIntOut", $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt16PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.UInt16PointerInAndOutput", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.UInt16PointerInAndOutput", $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt32InUIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.UInt32InUIntOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.UInt32InUIntOut", $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt32PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.UInt32PointerInAndOutput", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.UInt32PointerInAndOutput", $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt64InUIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.UInt64InUIntOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.UInt64InUIntOut", $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt64PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.UInt64PointerInAndOutput", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.UInt64PointerInAndOutput", $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt8InUIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.UInt8InUIntOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.UInt8InUIntOut", $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt8PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.UInt8PointerInAndOutput", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.UInt8PointerInAndOutput", $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UIntInUIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.UIntInUIntOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.UIntInUIntOut", $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UIntPointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.UIntPointerInAndOutput", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.UIntPointerInAndOutput", $in); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_single/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_single/greetservice.js index dae4fb2e5..eca08a018 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_single/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_single/greetservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,387 +17,344 @@ import * as $models from "./models.js"; /** * @param {number[]} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function ArrayInt($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.ArrayInt", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.ArrayInt", $in); } /** * @param {boolean} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function BoolInBoolOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.BoolInBoolOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.BoolInBoolOut", $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Float32InFloat32Out($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Float32InFloat32Out", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.Float32InFloat32Out", $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Float64InFloat64Out($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Float64InFloat64Out", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.Float64InFloat64Out", $in); } /** * Greet someone * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Greet", name)); - return $resultPromise; + return $Call.ByName("main.GreetService.Greet", name); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int16InIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Int16InIntOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.Int16InIntOut", $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int16PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Int16PointerInAndOutput", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.Int16PointerInAndOutput", $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int32InIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Int32InIntOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.Int32InIntOut", $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int32PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Int32PointerInAndOutput", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.Int32PointerInAndOutput", $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int64InIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Int64InIntOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.Int64InIntOut", $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int64PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Int64PointerInAndOutput", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.Int64PointerInAndOutput", $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int8InIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Int8InIntOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.Int8InIntOut", $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Int8PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Int8PointerInAndOutput", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.Int8PointerInAndOutput", $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function IntInIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.IntInIntOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.IntInIntOut", $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function IntPointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.IntPointerInAndOutput", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.IntPointerInAndOutput", $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function IntPointerInputNamedOutputs($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.IntPointerInputNamedOutputs", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.IntPointerInputNamedOutputs", $in); } /** * @param {{ [_: `${number}`]: number } | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function MapIntInt($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.MapIntInt", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.MapIntInt", $in); } /** * @param {{ [_: `${number}`]: number | null } | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function MapIntIntPointer($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.MapIntIntPointer", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.MapIntIntPointer", $in); } /** * @param {{ [_: `${number}`]: number[] | null } | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function MapIntSliceInt($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.MapIntSliceInt", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.MapIntSliceInt", $in); } /** * @param {{ [_: `${number}`]: number[] | null } | null} $in - * @returns {Promise<{ [_: `${number}`]: number[] | null } | null> & { cancel(): void }} + * @returns {$CancellablePromise<{ [_: `${number}`]: number[] | null } | null>} */ export function MapIntSliceIntInMapIntSliceIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.MapIntSliceIntInMapIntSliceIntOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.MapIntSliceIntInMapIntSliceIntOut", $in); } /** - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function NoInputsStringOut() { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.NoInputsStringOut")); - return $resultPromise; + return $Call.ByName("main.GreetService.NoInputsStringOut"); } /** * @param {boolean | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function PointerBoolInBoolOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.PointerBoolInBoolOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.PointerBoolInBoolOut", $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function PointerFloat32InFloat32Out($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.PointerFloat32InFloat32Out", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.PointerFloat32InFloat32Out", $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function PointerFloat64InFloat64Out($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.PointerFloat64InFloat64Out", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.PointerFloat64InFloat64Out", $in); } /** * @param {{ [_: `${number}`]: number } | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function PointerMapIntInt($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.PointerMapIntInt", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.PointerMapIntInt", $in); } /** * @param {string | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function PointerStringInStringOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.PointerStringInStringOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.PointerStringInStringOut", $in); } /** * @param {string[] | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function StringArrayInputNamedOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.StringArrayInputNamedOutput", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.StringArrayInputNamedOutput", $in); } /** * @param {string[] | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function StringArrayInputNamedOutputs($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.StringArrayInputNamedOutputs", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.StringArrayInputNamedOutputs", $in); } /** * @param {string[] | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function StringArrayInputStringArrayOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.StringArrayInputStringArrayOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.StringArrayInputStringArrayOut", $in); } /** * @param {string[] | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function StringArrayInputStringOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.StringArrayInputStringOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.StringArrayInputStringOut", $in); } /** * @param {$models.Person} $in - * @returns {Promise<$models.Person> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Person>} */ export function StructInputStructOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.StructInputStructOutput", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.StructInputStructOutput", $in); } /** * @param {$models.Person | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function StructPointerInputErrorOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.StructPointerInputErrorOutput", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.StructPointerInputErrorOutput", $in); } /** * @param {$models.Person | null} $in - * @returns {Promise<$models.Person | null> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Person | null>} */ export function StructPointerInputStructPointerOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.StructPointerInputStructPointerOutput", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.StructPointerInputStructPointerOutput", $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt16InUIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.UInt16InUIntOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.UInt16InUIntOut", $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt16PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.UInt16PointerInAndOutput", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.UInt16PointerInAndOutput", $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt32InUIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.UInt32InUIntOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.UInt32InUIntOut", $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt32PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.UInt32PointerInAndOutput", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.UInt32PointerInAndOutput", $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt64InUIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.UInt64InUIntOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.UInt64InUIntOut", $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt64PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.UInt64PointerInAndOutput", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.UInt64PointerInAndOutput", $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt8InUIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.UInt8InUIntOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.UInt8InUIntOut", $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UInt8PointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.UInt8PointerInAndOutput", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.UInt8PointerInAndOutput", $in); } /** * @param {number} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UIntInUIntOut($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.UIntInUIntOut", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.UIntInUIntOut", $in); } /** * @param {number | null} $in - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function UIntPointerInAndOutput($in) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.UIntPointerInAndOutput", $in)); - return $resultPromise; + return $Call.ByName("main.GreetService.UIntPointerInAndOutput", $in); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single/greetservice.js index f89c81e83..bba7ea7ea 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single/greetservice.js @@ -9,14 +9,13 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; /** * Greet someone * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Greet", name)); - return $resultPromise; + return $Call.ByName("main.GreetService.Greet", name); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_function/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_function/greetservice.js index f89c81e83..bba7ea7ea 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_function/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_function/greetservice.js @@ -9,14 +9,13 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; /** * Greet someone * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Greet", name)); - return $resultPromise; + return $Call.ByName("main.GreetService.Greet", name); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/greetservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/greetservice.js index 0896a296d..8ab5f3462 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/greetservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/greetservice.js @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -18,19 +18,17 @@ import * as $models from "./models.js"; /** * Greet does XYZ * @param {string} name - * @returns {Promise & { cancel(): void }} + * @returns {$CancellablePromise} */ export function Greet(name) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.Greet", name)); - return $resultPromise; + return $Call.ByName("main.GreetService.Greet", name); } /** * NewPerson creates a new person * @param {string} name - * @returns {Promise<$models.Person | null> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Person | null>} */ export function NewPerson(name) { - let $resultPromise = /** @type {any} */($Call.ByName("main.GreetService.NewPerson", name)); - return $resultPromise; + return $Call.ByName("main.GreetService.NewPerson", name); } diff --git a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/services/otherservice.js b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/services/otherservice.js index 6b15c3e22..6594edc5b 100644 --- a/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/services/otherservice.js +++ b/v3/internal/generator/testdata/output/lang=JS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/services/otherservice.js @@ -10,7 +10,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -18,9 +18,8 @@ import * as $models from "./models.js"; /** * Yay does this and that - * @returns {Promise<$models.Address | null> & { cancel(): void }} + * @returns {$CancellablePromise<$models.Address | null>} */ export function Yay() { - let $resultPromise = /** @type {any} */($Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/services.OtherService.Yay")); - return $resultPromise; + return $Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/services.OtherService.Yay"); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/encoding/json/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/encoding/json/models.ts index 41353d635..8cd1a164f 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/encoding/json/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/encoding/json/models.ts @@ -3,7 +3,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; /** * Marshaler is the interface implemented by types that diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/encoding/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/encoding/models.ts index 1ff6fc7ec..235dfce3e 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/encoding/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/encoding/models.ts @@ -3,7 +3,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; /** * TextMarshaler is the interface implemented by an object that can diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.ts index 14b0f1878..3c6865881 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.ts @@ -8,7 +8,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -21,67 +21,49 @@ import * as $models from "./models.js"; /** * Get someone. */ -export function Get(aliasValue: $models.Alias): Promise<$models.Person> & { cancel(): void } { - let $resultPromise = $Call.ByID(1928502664, aliasValue) as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function Get(aliasValue: $models.Alias): $CancellablePromise<$models.Person> { + return $Call.ByID(1928502664, aliasValue).then(($result: any) => { return $$createType0($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } /** * Apparently, aliases are all the rage right now. */ -export function GetButAliased(p: $models.AliasedPerson): Promise<$models.StrangelyAliasedPerson> & { cancel(): void } { - let $resultPromise = $Call.ByID(1896499664, p) as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function GetButAliased(p: $models.AliasedPerson): $CancellablePromise<$models.StrangelyAliasedPerson> { + return $Call.ByID(1896499664, p).then(($result: any) => { return $$createType0($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } /** * Get someone quite different. */ -export function GetButDifferent(): Promise<$models.GenericPerson> & { cancel(): void } { - let $resultPromise = $Call.ByID(2240931744) as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function GetButDifferent(): $CancellablePromise<$models.GenericPerson> { + return $Call.ByID(2240931744).then(($result: any) => { return $$createType1($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } -export function GetButForeignPrivateAlias(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(643456960) as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function GetButForeignPrivateAlias(): $CancellablePromise { + return $Call.ByID(643456960).then(($result: any) => { return $$createType2($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } -export function GetButGenericAliases(): Promise<$models.AliasGroup> & { cancel(): void } { - let $resultPromise = $Call.ByID(914093800) as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function GetButGenericAliases(): $CancellablePromise<$models.AliasGroup> { + return $Call.ByID(914093800).then(($result: any) => { return $$createType3($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } /** * Greet a lot of unusual things. */ -export function Greet($0: $models.EmptyAliasStruct, $1: $models.EmptyStruct): Promise<$models.AliasStruct> & { cancel(): void } { - let $resultPromise = $Call.ByID(1411160069, $0, $1) as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function Greet($0: $models.EmptyAliasStruct, $1: $models.EmptyStruct): $CancellablePromise<$models.AliasStruct> { + return $Call.ByID(1411160069, $0, $1).then(($result: any) => { return $$createType7($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/models.ts index 1f048ba57..63ca43914 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/models.ts @@ -3,7 +3,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; /** * A nice type Alias. @@ -169,7 +169,7 @@ export class GenericPerson { * returns a creation function for a concrete instance * of the generic class GenericPerson. */ - static createFrom($$createParamT: (source: any) => T): ($$source?: any) => GenericPerson { + static createFrom($$createParamT: (source: any) => T): ($$source?: any) => GenericPerson { const $$createField0_0 = $$createParamT; return ($$source: any = {}) => { let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service7.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service7.ts index af462b1e4..8fe0035ed 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service7.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service7.ts @@ -3,9 +3,8 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; -export function TestMethod(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(2241101727) as any; - return $resultPromise; +export function TestMethod(): $CancellablePromise { + return $Call.ByID(2241101727); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service9.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service9.ts index 760e03c4a..8260ce500 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service9.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service9.ts @@ -3,9 +3,8 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; -export function TestMethod2(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1556848345) as any; - return $resultPromise; +export function TestMethod2(): $CancellablePromise { + return $Call.ByID(1556848345); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_json/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_json/greetservice.ts index 3816bcdee..69c89433a 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_json/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_json/greetservice.ts @@ -8,7 +8,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,7 +17,6 @@ import * as $models from "./models.js"; /** * Greet does XYZ */ -export function Greet(person: $models.Person, emb: $models.Embedded1): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1411160069, person, emb) as any; - return $resultPromise; +export function Greet(person: $models.Person, emb: $models.Embedded1): $CancellablePromise { + return $Call.ByID(1411160069, person, emb); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_json/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_json/models.ts index 2ff5d6635..50f23b52d 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_json/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_json/models.ts @@ -3,7 +3,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; export class Embedded1 { /** diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_method/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_method/greetservice.ts index fb057998c..cc1e88ad7 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_method/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_method/greetservice.ts @@ -8,7 +8,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -19,15 +19,12 @@ import * as $models from "./models.js"; * It has a multiline doc comment * The comment has even some * / traps!! */ -export function Greet(str: string, people: $models.Person[], $2: {"AnotherCount": number, "AnotherOne": $models.Person | null}, assoc: { [_: `${number}`]: boolean | null }, $4: (number | null)[], ...other: string[]): Promise<[$models.Person, any, number[]]> & { cancel(): void } { - let $resultPromise = $Call.ByID(1411160069, str, people, $2, assoc, $4, other) as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function Greet(str: string, people: $models.Person[], $2: {"AnotherCount": number, "AnotherOne": $models.Person | null}, assoc: { [_: `${number}`]: boolean | null }, $4: (number | null)[], ...other: string[]): $CancellablePromise<[$models.Person, any, number[]]> { + return $Call.ByID(1411160069, str, people, $2, assoc, $4, other).then(($result: any) => { $result[0] = $$createType0($result[0]); $result[2] = $$createType1($result[2]); return $result; - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_method/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_method/models.ts index 66dc14092..2417aff4c 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_method/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_method/models.ts @@ -3,7 +3,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; /** * Person represents a person diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_imports/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_imports/greetservice.ts index 22900e8d1..c1c70be69 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_imports/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_imports/greetservice.ts @@ -8,7 +8,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,15 +17,12 @@ import * as $models from "./models.js"; /** * Make a cycle. */ -export function MakeCycles(): Promise<[$models.StructA, $models.StructC]> & { cancel(): void } { - let $resultPromise = $Call.ByID(440020721) as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function MakeCycles(): $CancellablePromise<[$models.StructA, $models.StructC]> { + return $Call.ByID(440020721).then(($result: any) => { $result[0] = $$createType0($result[0]); $result[1] = $$createType1($result[1]); return $result; - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_imports/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_imports/models.ts index a79d42f32..9e86cd674 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_imports/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_imports/models.ts @@ -3,7 +3,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; export class StructA { "B": structB | null; diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_types/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_types/greetservice.ts index 26782f46b..cbddfb346 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_types/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_types/greetservice.ts @@ -8,7 +8,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,19 +17,16 @@ import * as $models from "./models.js"; /** * Make a cycle. */ -export function MakeCycles(): Promise<[$models.Cyclic, $models.GenericCyclic<$models.GenericCyclic>]> & { cancel(): void } { - let $resultPromise = $Call.ByID(440020721) as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function MakeCycles(): $CancellablePromise<[$models.Cyclic, $models.GenericCyclic<$models.GenericCyclic>]> { + return $Call.ByID(440020721).then(($result: any) => { $result[0] = $$createType0($result[0]); $result[1] = $$createType9($result[1]); return $result; - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } // Private type creation functions -var $$createType0 = (function $$initCreateType0(...args): any { +var $$createType0 = (function $$initCreateType0(...args: any[]): any { if ($$createType0 === $$initCreateType0) { $$createType0 = $$createType3; } @@ -38,7 +35,7 @@ var $$createType0 = (function $$initCreateType0(...args): any { const $$createType1 = $Create.Nullable($$createType0); const $$createType2 = $Create.Map($Create.Any, $$createType1); const $$createType3 = $Create.Array($$createType2); -var $$createType4 = (function $$initCreateType4(...args): any { +var $$createType4 = (function $$initCreateType4(...args: any[]): any { if ($$createType4 === $$initCreateType4) { $$createType4 = $$createType8; } @@ -51,7 +48,7 @@ const $$createType7 = $Create.Struct({ "Y": $$createType6, }); const $$createType8 = $Create.Array($$createType7); -var $$createType9 = (function $$initCreateType9(...args): any { +var $$createType9 = (function $$initCreateType9(...args: any[]): any { if ($$createType9 === $$initCreateType9) { $$createType9 = $$createType13; } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_types/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_types/models.ts index ed98e9791..93d1ef5c6 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_types/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_types/models.ts @@ -3,7 +3,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; export type Alias = Cyclic | null; diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/internalservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/internalservice.ts index 58842ad2d..b968330db 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/internalservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/internalservice.ts @@ -8,13 +8,12 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports import * as $models from "./models.js"; -export function Method($0: $models.InternalModel): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(538079117, $0) as any; - return $resultPromise; +export function Method($0: $models.InternalModel): $CancellablePromise { + return $Call.ByID(538079117, $0); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/models.ts index 489296e23..4d242fc2c 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/models.ts @@ -3,7 +3,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; /** * An exported but internal model. diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/otherpackage/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/otherpackage/models.ts index 209ade5da..b927155d5 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/otherpackage/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/otherpackage/models.ts @@ -3,7 +3,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; export class Dummy { diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/service.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/service.ts index 266a81058..338c7fbd1 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/service.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/service.ts @@ -3,20 +3,18 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports import * as otherpackage$0 from "./otherpackage/models.js"; -function InternalMethod($0: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(3518775569, $0) as any; - return $resultPromise; +function InternalMethod($0: string): $CancellablePromise { + return $Call.ByID(3518775569, $0); } -export function VisibleMethod($0: otherpackage$0.Dummy): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(474018228, $0) as any; - return $resultPromise; +export function VisibleMethod($0: otherpackage$0.Dummy): $CancellablePromise { + return $Call.ByID(474018228, $0); } export async function CustomMethod(arg: string): Promise { diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/unexportedservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/unexportedservice.ts index 3c52fd31e..a819daffd 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/unexportedservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/unexportedservice.ts @@ -8,13 +8,12 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports import * as $models from "./models.js"; -export function Method($0: $models.unexportedModel): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(37626172, $0) as any; - return $resultPromise; +export function Method($0: $models.unexportedModel): $CancellablePromise { + return $Call.ByID(37626172, $0); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/embedded_interface/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/embedded_interface/greetservice.ts index 5174c8ec7..b5d189f76 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/embedded_interface/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/embedded_interface/greetservice.ts @@ -8,45 +8,40 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; /** * Comment 1. */ -export function Method1(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(841558284) as any; - return $resultPromise; +export function Method1(): $CancellablePromise { + return $Call.ByID(841558284); } /** * Comment 2. */ -export function Method2(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(891891141) as any; - return $resultPromise; +export function Method2(): $CancellablePromise { + return $Call.ByID(891891141); } /** * Comment 3a. * Comment 3b. */ -export function Method3(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(875113522) as any; - return $resultPromise; +export function Method3(): $CancellablePromise { + return $Call.ByID(875113522); } /** * Comment 4. */ -export function Method4(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(791225427) as any; - return $resultPromise; +export function Method4(): $CancellablePromise { + return $Call.ByID(791225427); } /** * Comment 5. */ -export function Method5(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(774447808) as any; - return $resultPromise; +export function Method5(): $CancellablePromise { + return $Call.ByID(774447808); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/enum/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/enum/greetservice.ts index da5d96205..10de8838c 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/enum/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/enum/greetservice.ts @@ -8,7 +8,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,21 +17,17 @@ import * as $models from "./models.js"; /** * Greet does XYZ */ -export function Greet(name: string, title: $models.Title): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1411160069, name, title) as any; - return $resultPromise; +export function Greet(name: string, title: $models.Title): $CancellablePromise { + return $Call.ByID(1411160069, name, title); } /** * NewPerson creates a new person */ -export function NewPerson(name: string): Promise<$models.Person | null> & { cancel(): void } { - let $resultPromise = $Call.ByID(1661412647, name) as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function NewPerson(name: string): $CancellablePromise<$models.Person | null> { + return $Call.ByID(1661412647, name).then(($result: any) => { return $$createType1($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/enum/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/enum/models.ts index 7b8cbf2fc..a50282a38 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/enum/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/enum/models.ts @@ -3,7 +3,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; /** * Age is an integer with some predefined values diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/enum_from_imported_package/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/enum_from_imported_package/greetservice.ts index 3b632d9d1..3bce7b000 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/enum_from_imported_package/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/enum_from_imported_package/greetservice.ts @@ -8,7 +8,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,7 +17,6 @@ import * as services$0 from "./services/models.js"; /** * Greet does XYZ */ -export function Greet(name: string, title: services$0.Title): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1411160069, name, title) as any; - return $resultPromise; +export function Greet(name: string, title: services$0.Title): $CancellablePromise { + return $Call.ByID(1411160069, name, title); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/enum_from_imported_package/services/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/enum_from_imported_package/services/models.ts index 335543dbb..661222bdf 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/enum_from_imported_package/services/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/enum_from_imported_package/services/models.ts @@ -3,7 +3,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; export enum Title { /** diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/greetservice.ts index 07b718c99..88cafa9d1 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/greetservice.ts @@ -8,7 +8,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,21 +17,17 @@ import * as $models from "./models.js"; /** * Greet does XYZ */ -export function Greet(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1411160069, name) as any; - return $resultPromise; +export function Greet(name: string): $CancellablePromise { + return $Call.ByID(1411160069, name); } /** * NewPerson creates a new person */ -export function NewPerson(name: string): Promise<$models.Person | null> & { cancel(): void } { - let $resultPromise = $Call.ByID(1661412647, name) as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function NewPerson(name: string): $CancellablePromise<$models.Person | null> { + return $Call.ByID(1661412647, name).then(($result: any) => { return $$createType1($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/models.ts index 02707e2ca..f1ff262a1 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/models.ts @@ -3,7 +3,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/services/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/services/models.ts index eb9c1b6bf..a4be6e904 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/services/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/services/models.ts @@ -3,7 +3,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; export class Address { "Street": string; diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/services/otherservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/services/otherservice.ts index 13a82546a..8dc381545 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/services/otherservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/services/otherservice.ts @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -18,13 +18,10 @@ import * as $models from "./models.js"; /** * Yay does this and that */ -export function Yay(): Promise<$models.Address | null> & { cancel(): void } { - let $resultPromise = $Call.ByID(2007737399) as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function Yay(): $CancellablePromise<$models.Address | null> { + return $Call.ByID(2007737399).then(($result: any) => { return $$createType1($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/greetservice.ts index 07b718c99..88cafa9d1 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/greetservice.ts @@ -8,7 +8,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,21 +17,17 @@ import * as $models from "./models.js"; /** * Greet does XYZ */ -export function Greet(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1411160069, name) as any; - return $resultPromise; +export function Greet(name: string): $CancellablePromise { + return $Call.ByID(1411160069, name); } /** * NewPerson creates a new person */ -export function NewPerson(name: string): Promise<$models.Person | null> & { cancel(): void } { - let $resultPromise = $Call.ByID(1661412647, name) as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function NewPerson(name: string): $CancellablePromise<$models.Person | null> { + return $Call.ByID(1661412647, name).then(($result: any) => { return $$createType1($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/models.ts index c4a6d39ee..88b2c78db 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/models.ts @@ -3,7 +3,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/services/other/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/services/other/models.ts index eb9c1b6bf..a4be6e904 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/services/other/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/services/other/models.ts @@ -3,7 +3,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; export class Address { "Street": string; diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/services/other/otherservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/services/other/otherservice.ts index f3c4c0c43..fe69a1da0 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/services/other/otherservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/services/other/otherservice.ts @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -18,13 +18,10 @@ import * as $models from "./models.js"; /** * Yay does this and that */ -export function Yay(): Promise<$models.Address | null> & { cancel(): void } { - let $resultPromise = $Call.ByID(2447353446) as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function Yay(): $CancellablePromise<$models.Address | null> { + return $Call.ByID(2447353446).then(($result: any) => { return $$createType1($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_multiple_files/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_multiple_files/greetservice.ts index 71b020797..62283209b 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_multiple_files/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_multiple_files/greetservice.ts @@ -3,9 +3,8 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; -export function Greet(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1411160069, name) as any; - return $resultPromise; +export function Greet(name: string): $CancellablePromise { + return $Call.ByID(1411160069, name); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single/greetservice.ts index b14533c7b..6e6ac2007 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single/greetservice.ts @@ -8,12 +8,11 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; /** * Greet someone */ -export function Greet(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1411160069, name) as any; - return $resultPromise; +export function Greet(name: string): $CancellablePromise { + return $Call.ByID(1411160069, name); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_context/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_context/greetservice.ts index 1e307faef..386913d65 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_context/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_context/greetservice.ts @@ -8,20 +8,18 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; /** * Greet someone */ -export function Greet(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1411160069, name) as any; - return $resultPromise; +export function Greet(name: string): $CancellablePromise { + return $Call.ByID(1411160069, name); } /** * Greet someone */ -export function GreetWithContext(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1310150960, name) as any; - return $resultPromise; +export function GreetWithContext(name: string): $CancellablePromise { + return $Call.ByID(1310150960, name); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_internal/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_internal/greetservice.ts index b14533c7b..6e6ac2007 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_internal/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_internal/greetservice.ts @@ -8,12 +8,11 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; /** * Greet someone */ -export function Greet(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1411160069, name) as any; - return $resultPromise; +export function Greet(name: string): $CancellablePromise { + return $Call.ByID(1411160069, name); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/models.ts index 81b54bc2e..0d26a6b0b 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/models.ts @@ -3,7 +3,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; export type BasicCstrAlias = S; @@ -1197,7 +1197,7 @@ export class Maps { * returns a creation function for a concrete instance * of the generic class Maps. */ - static createFrom($$createParamR: (source: any) => R, $$createParamS: (source: any) => S, $$createParamT: (source: any) => T, $$createParamU: (source: any) => U, $$createParamV: (source: any) => V, $$createParamW: (source: any) => W, $$createParamX: (source: any) => X, $$createParamY: (source: any) => Y, $$createParamZ: (source: any) => Z): ($$source?: any) => Maps { + static createFrom($$createParamR: (source: any) => R, $$createParamS: (source: any) => S, $$createParamT: (source: any) => T, $$createParamU: (source: any) => U, $$createParamV: (source: any) => V, $$createParamW: (source: any) => W, $$createParamX: (source: any) => X, $$createParamY: (source: any) => Y, $$createParamZ: (source: any) => Z): ($$source?: any) => Maps { const $$createField0_0 = $$createType0; const $$createField1_0 = $$createType1; const $$createField2_0 = $$createType2; @@ -1863,24 +1863,24 @@ const $$createType55 = $Create.Map($Create.Any, $Create.Any); const $$createType56 = $Create.Map($Create.Any, $Create.Any); const $$createType57 = $Create.Map($Create.Any, $Create.Any); const $$createType58 = $Create.Map($Create.Any, $Create.Any); -const $$createType59 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType60 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType61 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType62 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType63 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType64 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType65 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType66 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType67 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType68 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType69 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType70 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType71 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType72 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType73 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType74 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType75 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType76 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); +const $$createType59 = ($$createParamR: any, $$createParamS: any, $$createParamT: any, $$createParamU: any, $$createParamV: any, $$createParamW: any, $$createParamX: any, $$createParamY: any, $$createParamZ: any) => $Create.Map($Create.Any, $Create.Any); +const $$createType60 = ($$createParamR: any, $$createParamS: any, $$createParamT: any, $$createParamU: any, $$createParamV: any, $$createParamW: any, $$createParamX: any, $$createParamY: any, $$createParamZ: any) => $Create.Map($Create.Any, $Create.Any); +const $$createType61 = ($$createParamR: any, $$createParamS: any, $$createParamT: any, $$createParamU: any, $$createParamV: any, $$createParamW: any, $$createParamX: any, $$createParamY: any, $$createParamZ: any) => $Create.Map($Create.Any, $Create.Any); +const $$createType62 = ($$createParamR: any, $$createParamS: any, $$createParamT: any, $$createParamU: any, $$createParamV: any, $$createParamW: any, $$createParamX: any, $$createParamY: any, $$createParamZ: any) => $Create.Map($Create.Any, $Create.Any); +const $$createType63 = ($$createParamR: any, $$createParamS: any, $$createParamT: any, $$createParamU: any, $$createParamV: any, $$createParamW: any, $$createParamX: any, $$createParamY: any, $$createParamZ: any) => $Create.Map($Create.Any, $Create.Any); +const $$createType64 = ($$createParamR: any, $$createParamS: any, $$createParamT: any, $$createParamU: any, $$createParamV: any, $$createParamW: any, $$createParamX: any, $$createParamY: any, $$createParamZ: any) => $Create.Map($Create.Any, $Create.Any); +const $$createType65 = ($$createParamR: any, $$createParamS: any, $$createParamT: any, $$createParamU: any, $$createParamV: any, $$createParamW: any, $$createParamX: any, $$createParamY: any, $$createParamZ: any) => $Create.Map($Create.Any, $Create.Any); +const $$createType66 = ($$createParamR: any, $$createParamS: any, $$createParamT: any, $$createParamU: any, $$createParamV: any, $$createParamW: any, $$createParamX: any, $$createParamY: any, $$createParamZ: any) => $Create.Map($Create.Any, $Create.Any); +const $$createType67 = ($$createParamR: any, $$createParamS: any, $$createParamT: any, $$createParamU: any, $$createParamV: any, $$createParamW: any, $$createParamX: any, $$createParamY: any, $$createParamZ: any) => $Create.Map($Create.Any, $Create.Any); +const $$createType68 = ($$createParamR: any, $$createParamS: any, $$createParamT: any, $$createParamU: any, $$createParamV: any, $$createParamW: any, $$createParamX: any, $$createParamY: any, $$createParamZ: any) => $Create.Map($Create.Any, $Create.Any); +const $$createType69 = ($$createParamR: any, $$createParamS: any, $$createParamT: any, $$createParamU: any, $$createParamV: any, $$createParamW: any, $$createParamX: any, $$createParamY: any, $$createParamZ: any) => $Create.Map($Create.Any, $Create.Any); +const $$createType70 = ($$createParamR: any, $$createParamS: any, $$createParamT: any, $$createParamU: any, $$createParamV: any, $$createParamW: any, $$createParamX: any, $$createParamY: any, $$createParamZ: any) => $Create.Map($Create.Any, $Create.Any); +const $$createType71 = ($$createParamR: any, $$createParamS: any, $$createParamT: any, $$createParamU: any, $$createParamV: any, $$createParamW: any, $$createParamX: any, $$createParamY: any, $$createParamZ: any) => $Create.Map($Create.Any, $Create.Any); +const $$createType72 = ($$createParamR: any, $$createParamS: any, $$createParamT: any, $$createParamU: any, $$createParamV: any, $$createParamW: any, $$createParamX: any, $$createParamY: any, $$createParamZ: any) => $Create.Map($Create.Any, $Create.Any); +const $$createType73 = ($$createParamR: any, $$createParamS: any, $$createParamT: any, $$createParamU: any, $$createParamV: any, $$createParamW: any, $$createParamX: any, $$createParamY: any, $$createParamZ: any) => $Create.Map($Create.Any, $Create.Any); +const $$createType74 = ($$createParamR: any, $$createParamS: any, $$createParamT: any, $$createParamU: any, $$createParamV: any, $$createParamW: any, $$createParamX: any, $$createParamY: any, $$createParamZ: any) => $Create.Map($Create.Any, $Create.Any); +const $$createType75 = ($$createParamR: any, $$createParamS: any, $$createParamT: any, $$createParamU: any, $$createParamV: any, $$createParamW: any, $$createParamX: any, $$createParamY: any, $$createParamZ: any) => $Create.Map($Create.Any, $Create.Any); +const $$createType76 = ($$createParamR: any, $$createParamS: any, $$createParamT: any, $$createParamU: any, $$createParamV: any, $$createParamW: any, $$createParamX: any, $$createParamY: any, $$createParamZ: any) => $Create.Map($Create.Any, $Create.Any); const $$createType77 = $Create.Map($Create.Any, $Create.Any); const $$createType78 = $Create.Map($Create.Any, $Create.Any); const $$createType79 = $Create.Map($Create.Any, $Create.Any); diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/service.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/service.ts index c8f860953..bd5e88c7b 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/service.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/service.ts @@ -3,19 +3,16 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports import * as $models from "./models.js"; -export function Method(): Promise<$models.Maps<$models.PointerTextMarshaler, number, number, $models.ValueTextMarshaler, $models.PointerTextMarshaler | null, $models.ValueTextMarshaler, $models.StringType, $models.ValueTextMarshaler, $models.PointerTextMarshaler | null>> & { cancel(): void } { - let $resultPromise = $Call.ByID(4021345184) as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function Method(): $CancellablePromise<$models.Maps<$models.PointerTextMarshaler, number, number, $models.ValueTextMarshaler, $models.PointerTextMarshaler | null, $models.ValueTextMarshaler, $models.StringType, $models.ValueTextMarshaler, $models.PointerTextMarshaler | null>> { + return $Call.ByID(4021345184).then(($result: any) => { return $$createType0($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/marshalers/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/marshalers/models.ts index 32cfd9f37..d8db23862 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/marshalers/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/marshalers/models.ts @@ -3,7 +3,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/marshalers/service.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/marshalers/service.ts index 988af4c84..342fcf3c4 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/marshalers/service.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/marshalers/service.ts @@ -3,19 +3,16 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports import * as $models from "./models.js"; -export function Method(): Promise<$models.Data> & { cancel(): void } { - let $resultPromise = $Call.ByID(4021345184) as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function Method(): $CancellablePromise<$models.Data> { + return $Call.ByID(4021345184).then(($result: any) => { return $$createType0($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/models.ts index 6e31400f2..4cb328e1e 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/models.ts @@ -3,7 +3,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -41,7 +41,7 @@ export class HowDifferent { * returns a creation function for a concrete instance * of the generic class HowDifferent. */ - static createFrom($$createParamHow: (source: any) => How): ($$source?: any) => HowDifferent { + static createFrom($$createParamHow: (source: any) => How): ($$source?: any) => HowDifferent { const $$createField1_0 = $$createType1($$createParamHow); return ($$source: any = {}) => { let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; @@ -157,7 +157,7 @@ export const PrivatePerson = personImpl; export type PrivatePerson = personImpl; // Private type creation functions -const $$createType0 = ($$createParamHow) => $Create.Map($Create.Any, $$createParamHow); -const $$createType1 = ($$createParamHow) => $Create.Array($$createType0($$createParamHow)); +const $$createType0 = ($$createParamHow: any) => $Create.Map($Create.Any, $$createParamHow); +const $$createType1 = ($$createParamHow: any) => $Create.Array($$createType0($$createParamHow)); const $$createType2 = other$0.OtherPerson.createFrom($Create.Any); const $$createType3 = $Create.Array($$createType2); diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/other/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/other/models.ts index e41f6e1d3..711735a2b 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/other/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/other/models.ts @@ -3,7 +3,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; /** * OtherPerson is like a person, but different. @@ -36,7 +36,7 @@ export class OtherPerson { * returns a creation function for a concrete instance * of the generic class OtherPerson. */ - static createFrom($$createParamT: (source: any) => T): ($$source?: any) => OtherPerson { + static createFrom($$createParamT: (source: any) => T): ($$source?: any) => OtherPerson { const $$createField1_0 = $$createType0($$createParamT); return ($$source: any = {}) => { let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; @@ -49,4 +49,4 @@ export class OtherPerson { } // Private type creation functions -const $$createType0 = ($$createParamT) => $Create.Array($$createParamT); +const $$createType0 = ($$createParamT: any) => $Create.Array($$createParamT); diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/other/othermethods.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/other/othermethods.ts index 108d8c37d..da11f7f2f 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/other/othermethods.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/other/othermethods.ts @@ -8,12 +8,11 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; /** * LikeThisOtherOne does nothing as well, but is different. */ -export function LikeThisOtherOne(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(3606939272) as any; - return $resultPromise; +export function LikeThisOtherOne(): $CancellablePromise { + return $Call.ByID(3606939272); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/somemethods.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/somemethods.ts index 303b8b7db..9ef257343 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/somemethods.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/somemethods.ts @@ -8,7 +8,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,24 +17,20 @@ import * as $models from "./models.js"; /** * LikeThisOne is an example method that does nothing. */ -export function LikeThisOne(): Promise<[$models.Person, $models.HowDifferent, $models.PrivatePerson]> & { cancel(): void } { - let $resultPromise = $Call.ByID(2124352079) as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function LikeThisOne(): $CancellablePromise<[$models.Person, $models.HowDifferent, $models.PrivatePerson]> { + return $Call.ByID(2124352079).then(($result: any) => { $result[0] = $$createType0($result[0]); $result[1] = $$createType1($result[1]); $result[2] = $$createType2($result[2]); return $result; - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } /** * LikeThisOtherOne does nothing as well, but is different. */ -export function LikeThisOtherOne(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(4281222271) as any; - return $resultPromise; +export function LikeThisOtherOne(): $CancellablePromise { + return $Call.ByID(4281222271); } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedother.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedother.ts index e14439f7b..a5fe5368f 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedother.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedother.ts @@ -8,12 +8,11 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; /** * LikeThisOtherOne does nothing as well, but is different. */ -export function LikeThisOtherOne(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(3566862802) as any; - return $resultPromise; +export function LikeThisOtherOne(): $CancellablePromise { + return $Call.ByID(3566862802); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedservice.ts index 7e93dcdb7..615eae691 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedservice.ts @@ -8,7 +8,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,24 +17,20 @@ import * as nobindingshere$0 from "../no_bindings_here/models.js"; /** * LikeThisOne is an example method that does nothing. */ -export function LikeThisOne(): Promise<[nobindingshere$0.Person, nobindingshere$0.HowDifferent, nobindingshere$0.PrivatePerson]> & { cancel(): void } { - let $resultPromise = $Call.ByID(2590614085) as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function LikeThisOne(): $CancellablePromise<[nobindingshere$0.Person, nobindingshere$0.HowDifferent, nobindingshere$0.PrivatePerson]> { + return $Call.ByID(2590614085).then(($result: any) => { $result[0] = $$createType0($result[0]); $result[1] = $$createType1($result[1]); $result[2] = $$createType2($result[2]); return $result; - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } /** * LikeThisOtherOne does nothing as well, but is different. */ -export function LikeThisOtherOne(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(773650321) as any; - return $resultPromise; +export function LikeThisOtherOne(): $CancellablePromise { + return $Call.ByID(773650321); } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/greetservice.ts index e82932486..83ca81acc 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/greetservice.ts @@ -8,12 +8,11 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; /** * Greet someone */ -export function Greet($0: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1411160069, $0) as any; - return $resultPromise; +export function Greet($0: string): $CancellablePromise { + return $Call.ByID(1411160069, $0); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/greetservice.ts index 71b020797..62283209b 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/greetservice.ts @@ -3,9 +3,8 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; -export function Greet(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1411160069, name) as any; - return $resultPromise; +export function Greet(name: string): $CancellablePromise { + return $Call.ByID(1411160069, name); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/otherservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/otherservice.ts index cae4507da..6c902629c 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/otherservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/otherservice.ts @@ -3,9 +3,8 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; -export function Hello(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(4249972365) as any; - return $resultPromise; +export function Hello(): $CancellablePromise { + return $Call.ByID(4249972365); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/greetservice.ts index 71b020797..62283209b 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/greetservice.ts @@ -3,9 +3,8 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; -export function Greet(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1411160069, name) as any; - return $resultPromise; +export function Greet(name: string): $CancellablePromise { + return $Call.ByID(1411160069, name); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/otherservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/otherservice.ts index cae4507da..6c902629c 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/otherservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/otherservice.ts @@ -3,9 +3,8 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; -export function Hello(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(4249972365) as any; - return $resultPromise; +export function Hello(): $CancellablePromise { + return $Call.ByID(4249972365); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/greetservice.ts index 07b718c99..88cafa9d1 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/greetservice.ts @@ -8,7 +8,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,21 +17,17 @@ import * as $models from "./models.js"; /** * Greet does XYZ */ -export function Greet(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1411160069, name) as any; - return $resultPromise; +export function Greet(name: string): $CancellablePromise { + return $Call.ByID(1411160069, name); } /** * NewPerson creates a new person */ -export function NewPerson(name: string): Promise<$models.Person | null> & { cancel(): void } { - let $resultPromise = $Call.ByID(1661412647, name) as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function NewPerson(name: string): $CancellablePromise<$models.Person | null> { + return $Call.ByID(1661412647, name).then(($result: any) => { return $$createType1($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/models.ts index 474248f2e..d76f68d9d 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/models.ts @@ -3,7 +3,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/services/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/services/models.ts index eb9c1b6bf..a4be6e904 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/services/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/services/models.ts @@ -3,7 +3,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; export class Address { "Street": string; diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/services/otherservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/services/otherservice.ts index 7b37ce5d6..b8c293ad7 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/services/otherservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/services/otherservice.ts @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -18,13 +18,10 @@ import * as $models from "./models.js"; /** * Yay does this and that */ -export function Yay(): Promise<$models.Address | null> & { cancel(): void } { - let $resultPromise = $Call.ByID(3568225479) as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function Yay(): $CancellablePromise<$models.Address | null> { + return $Call.ByID(3568225479).then(($result: any) => { return $$createType1($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_non_pointer_single/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_non_pointer_single/greetservice.ts index 7fa3dd502..c8ff6e4db 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_non_pointer_single/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_non_pointer_single/greetservice.ts @@ -8,252 +8,197 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports import * as $models from "./models.js"; -export function ArrayInt($in: number[]): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(3862002418, $in) as any; - return $resultPromise; +export function ArrayInt($in: number[]): $CancellablePromise { + return $Call.ByID(3862002418, $in); } -export function BoolInBoolOut($in: boolean): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(2424639793, $in) as any; - return $resultPromise; +export function BoolInBoolOut($in: boolean): $CancellablePromise { + return $Call.ByID(2424639793, $in); } -export function Float32InFloat32Out($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(3132595881, $in) as any; - return $resultPromise; +export function Float32InFloat32Out($in: number): $CancellablePromise { + return $Call.ByID(3132595881, $in); } -export function Float64InFloat64Out($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(2182412247, $in) as any; - return $resultPromise; +export function Float64InFloat64Out($in: number): $CancellablePromise { + return $Call.ByID(2182412247, $in); } /** * Greet someone */ -export function Greet(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1411160069, name) as any; - return $resultPromise; +export function Greet(name: string): $CancellablePromise { + return $Call.ByID(1411160069, name); } -export function Int16InIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(3306292566, $in) as any; - return $resultPromise; +export function Int16InIntOut($in: number): $CancellablePromise { + return $Call.ByID(3306292566, $in); } -export function Int16PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1754277916, $in) as any; - return $resultPromise; +export function Int16PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByID(1754277916, $in); } -export function Int32InIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1909469092, $in) as any; - return $resultPromise; +export function Int32InIntOut($in: number): $CancellablePromise { + return $Call.ByID(1909469092, $in); } -export function Int32PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(4251088558, $in) as any; - return $resultPromise; +export function Int32PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByID(4251088558, $in); } -export function Int64InIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1343888303, $in) as any; - return $resultPromise; +export function Int64InIntOut($in: number): $CancellablePromise { + return $Call.ByID(1343888303, $in); } -export function Int64PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(2205561041, $in) as any; - return $resultPromise; +export function Int64PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByID(2205561041, $in); } -export function Int8InIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(572240879, $in) as any; - return $resultPromise; +export function Int8InIntOut($in: number): $CancellablePromise { + return $Call.ByID(572240879, $in); } -export function Int8PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(2189402897, $in) as any; - return $resultPromise; +export function Int8PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByID(2189402897, $in); } -export function IntInIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(642881729, $in) as any; - return $resultPromise; +export function IntInIntOut($in: number): $CancellablePromise { + return $Call.ByID(642881729, $in); } -export function IntPointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1066151743, $in) as any; - return $resultPromise; +export function IntPointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByID(1066151743, $in); } -export function IntPointerInputNamedOutputs($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(2718999663, $in) as any; - return $resultPromise; +export function IntPointerInputNamedOutputs($in: number | null): $CancellablePromise { + return $Call.ByID(2718999663, $in); } -export function MapIntInt($in: { [_: `${number}`]: number }): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(2386486356, $in) as any; - return $resultPromise; +export function MapIntInt($in: { [_: `${number}`]: number }): $CancellablePromise { + return $Call.ByID(2386486356, $in); } -export function MapIntIntPointer($in: { [_: `${number}`]: number | null }): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(2163571325, $in) as any; - return $resultPromise; +export function MapIntIntPointer($in: { [_: `${number}`]: number | null }): $CancellablePromise { + return $Call.ByID(2163571325, $in); } -export function MapIntSliceInt($in: { [_: `${number}`]: number[] }): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(2900172572, $in) as any; - return $resultPromise; +export function MapIntSliceInt($in: { [_: `${number}`]: number[] }): $CancellablePromise { + return $Call.ByID(2900172572, $in); } -export function MapIntSliceIntInMapIntSliceIntOut($in: { [_: `${number}`]: number[] }): Promise<{ [_: `${number}`]: number[] }> & { cancel(): void } { - let $resultPromise = $Call.ByID(881980169, $in) as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function MapIntSliceIntInMapIntSliceIntOut($in: { [_: `${number}`]: number[] }): $CancellablePromise<{ [_: `${number}`]: number[] }> { + return $Call.ByID(881980169, $in).then(($result: any) => { return $$createType1($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } -export function NoInputsStringOut(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1075577233) as any; - return $resultPromise; +export function NoInputsStringOut(): $CancellablePromise { + return $Call.ByID(1075577233); } -export function PointerBoolInBoolOut($in: boolean | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(3589606958, $in) as any; - return $resultPromise; +export function PointerBoolInBoolOut($in: boolean | null): $CancellablePromise { + return $Call.ByID(3589606958, $in); } -export function PointerFloat32InFloat32Out($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(224675106, $in) as any; - return $resultPromise; +export function PointerFloat32InFloat32Out($in: number | null): $CancellablePromise { + return $Call.ByID(224675106, $in); } -export function PointerFloat64InFloat64Out($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(2124953624, $in) as any; - return $resultPromise; +export function PointerFloat64InFloat64Out($in: number | null): $CancellablePromise { + return $Call.ByID(2124953624, $in); } -export function PointerMapIntInt($in: { [_: `${number}`]: number } | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(3516977899, $in) as any; - return $resultPromise; +export function PointerMapIntInt($in: { [_: `${number}`]: number } | null): $CancellablePromise { + return $Call.ByID(3516977899, $in); } -export function PointerStringInStringOut($in: string | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(229603958, $in) as any; - return $resultPromise; +export function PointerStringInStringOut($in: string | null): $CancellablePromise { + return $Call.ByID(229603958, $in); } -export function StringArrayInputNamedOutput($in: string[]): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(3678582682, $in) as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function StringArrayInputNamedOutput($in: string[]): $CancellablePromise { + return $Call.ByID(3678582682, $in).then(($result: any) => { return $$createType2($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } -export function StringArrayInputNamedOutputs($in: string[]): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(319259595, $in) as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function StringArrayInputNamedOutputs($in: string[]): $CancellablePromise { + return $Call.ByID(319259595, $in).then(($result: any) => { return $$createType2($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } -export function StringArrayInputStringArrayOut($in: string[]): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(383995060, $in) as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function StringArrayInputStringArrayOut($in: string[]): $CancellablePromise { + return $Call.ByID(383995060, $in).then(($result: any) => { return $$createType2($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } -export function StringArrayInputStringOut($in: string[]): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1091960237, $in) as any; - return $resultPromise; +export function StringArrayInputStringOut($in: string[]): $CancellablePromise { + return $Call.ByID(1091960237, $in); } -export function StructInputStructOutput($in: $models.Person): Promise<$models.Person> & { cancel(): void } { - let $resultPromise = $Call.ByID(3835643147, $in) as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function StructInputStructOutput($in: $models.Person): $CancellablePromise<$models.Person> { + return $Call.ByID(3835643147, $in).then(($result: any) => { return $$createType3($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } -export function StructPointerInputErrorOutput($in: $models.Person | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(2447692557, $in) as any; - return $resultPromise; +export function StructPointerInputErrorOutput($in: $models.Person | null): $CancellablePromise { + return $Call.ByID(2447692557, $in); } -export function StructPointerInputStructPointerOutput($in: $models.Person | null): Promise<$models.Person | null> & { cancel(): void } { - let $resultPromise = $Call.ByID(2943477349, $in) as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function StructPointerInputStructPointerOutput($in: $models.Person | null): $CancellablePromise<$models.Person | null> { + return $Call.ByID(2943477349, $in).then(($result: any) => { return $$createType4($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } -export function UInt16InUIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(3401034892, $in) as any; - return $resultPromise; +export function UInt16InUIntOut($in: number): $CancellablePromise { + return $Call.ByID(3401034892, $in); } -export function UInt16PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1236957573, $in) as any; - return $resultPromise; +export function UInt16PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByID(1236957573, $in); } -export function UInt32InUIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1160383782, $in) as any; - return $resultPromise; +export function UInt32InUIntOut($in: number): $CancellablePromise { + return $Call.ByID(1160383782, $in); } -export function UInt32PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1739300671, $in) as any; - return $resultPromise; +export function UInt32PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByID(1739300671, $in); } -export function UInt64InUIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(793803239, $in) as any; - return $resultPromise; +export function UInt64InUIntOut($in: number): $CancellablePromise { + return $Call.ByID(793803239, $in); } -export function UInt64PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1403757716, $in) as any; - return $resultPromise; +export function UInt64PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByID(1403757716, $in); } -export function UInt8InUIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(2988345717, $in) as any; - return $resultPromise; +export function UInt8InUIntOut($in: number): $CancellablePromise { + return $Call.ByID(2988345717, $in); } -export function UInt8PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(518250834, $in) as any; - return $resultPromise; +export function UInt8PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByID(518250834, $in); } -export function UIntInUIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(2836661285, $in) as any; - return $resultPromise; +export function UIntInUIntOut($in: number): $CancellablePromise { + return $Call.ByID(2836661285, $in); } -export function UIntPointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1367187362, $in) as any; - return $resultPromise; +export function UIntPointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByID(1367187362, $in); } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_non_pointer_single/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_non_pointer_single/models.ts index 3dd1908e1..cd282c90c 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_non_pointer_single/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_non_pointer_single/models.ts @@ -3,7 +3,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; export class Person { "Name": string; diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_single/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_single/greetservice.ts index 7fa3dd502..c8ff6e4db 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_single/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_single/greetservice.ts @@ -8,252 +8,197 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports import * as $models from "./models.js"; -export function ArrayInt($in: number[]): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(3862002418, $in) as any; - return $resultPromise; +export function ArrayInt($in: number[]): $CancellablePromise { + return $Call.ByID(3862002418, $in); } -export function BoolInBoolOut($in: boolean): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(2424639793, $in) as any; - return $resultPromise; +export function BoolInBoolOut($in: boolean): $CancellablePromise { + return $Call.ByID(2424639793, $in); } -export function Float32InFloat32Out($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(3132595881, $in) as any; - return $resultPromise; +export function Float32InFloat32Out($in: number): $CancellablePromise { + return $Call.ByID(3132595881, $in); } -export function Float64InFloat64Out($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(2182412247, $in) as any; - return $resultPromise; +export function Float64InFloat64Out($in: number): $CancellablePromise { + return $Call.ByID(2182412247, $in); } /** * Greet someone */ -export function Greet(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1411160069, name) as any; - return $resultPromise; +export function Greet(name: string): $CancellablePromise { + return $Call.ByID(1411160069, name); } -export function Int16InIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(3306292566, $in) as any; - return $resultPromise; +export function Int16InIntOut($in: number): $CancellablePromise { + return $Call.ByID(3306292566, $in); } -export function Int16PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1754277916, $in) as any; - return $resultPromise; +export function Int16PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByID(1754277916, $in); } -export function Int32InIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1909469092, $in) as any; - return $resultPromise; +export function Int32InIntOut($in: number): $CancellablePromise { + return $Call.ByID(1909469092, $in); } -export function Int32PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(4251088558, $in) as any; - return $resultPromise; +export function Int32PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByID(4251088558, $in); } -export function Int64InIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1343888303, $in) as any; - return $resultPromise; +export function Int64InIntOut($in: number): $CancellablePromise { + return $Call.ByID(1343888303, $in); } -export function Int64PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(2205561041, $in) as any; - return $resultPromise; +export function Int64PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByID(2205561041, $in); } -export function Int8InIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(572240879, $in) as any; - return $resultPromise; +export function Int8InIntOut($in: number): $CancellablePromise { + return $Call.ByID(572240879, $in); } -export function Int8PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(2189402897, $in) as any; - return $resultPromise; +export function Int8PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByID(2189402897, $in); } -export function IntInIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(642881729, $in) as any; - return $resultPromise; +export function IntInIntOut($in: number): $CancellablePromise { + return $Call.ByID(642881729, $in); } -export function IntPointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1066151743, $in) as any; - return $resultPromise; +export function IntPointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByID(1066151743, $in); } -export function IntPointerInputNamedOutputs($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(2718999663, $in) as any; - return $resultPromise; +export function IntPointerInputNamedOutputs($in: number | null): $CancellablePromise { + return $Call.ByID(2718999663, $in); } -export function MapIntInt($in: { [_: `${number}`]: number }): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(2386486356, $in) as any; - return $resultPromise; +export function MapIntInt($in: { [_: `${number}`]: number }): $CancellablePromise { + return $Call.ByID(2386486356, $in); } -export function MapIntIntPointer($in: { [_: `${number}`]: number | null }): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(2163571325, $in) as any; - return $resultPromise; +export function MapIntIntPointer($in: { [_: `${number}`]: number | null }): $CancellablePromise { + return $Call.ByID(2163571325, $in); } -export function MapIntSliceInt($in: { [_: `${number}`]: number[] }): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(2900172572, $in) as any; - return $resultPromise; +export function MapIntSliceInt($in: { [_: `${number}`]: number[] }): $CancellablePromise { + return $Call.ByID(2900172572, $in); } -export function MapIntSliceIntInMapIntSliceIntOut($in: { [_: `${number}`]: number[] }): Promise<{ [_: `${number}`]: number[] }> & { cancel(): void } { - let $resultPromise = $Call.ByID(881980169, $in) as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function MapIntSliceIntInMapIntSliceIntOut($in: { [_: `${number}`]: number[] }): $CancellablePromise<{ [_: `${number}`]: number[] }> { + return $Call.ByID(881980169, $in).then(($result: any) => { return $$createType1($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } -export function NoInputsStringOut(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1075577233) as any; - return $resultPromise; +export function NoInputsStringOut(): $CancellablePromise { + return $Call.ByID(1075577233); } -export function PointerBoolInBoolOut($in: boolean | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(3589606958, $in) as any; - return $resultPromise; +export function PointerBoolInBoolOut($in: boolean | null): $CancellablePromise { + return $Call.ByID(3589606958, $in); } -export function PointerFloat32InFloat32Out($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(224675106, $in) as any; - return $resultPromise; +export function PointerFloat32InFloat32Out($in: number | null): $CancellablePromise { + return $Call.ByID(224675106, $in); } -export function PointerFloat64InFloat64Out($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(2124953624, $in) as any; - return $resultPromise; +export function PointerFloat64InFloat64Out($in: number | null): $CancellablePromise { + return $Call.ByID(2124953624, $in); } -export function PointerMapIntInt($in: { [_: `${number}`]: number } | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(3516977899, $in) as any; - return $resultPromise; +export function PointerMapIntInt($in: { [_: `${number}`]: number } | null): $CancellablePromise { + return $Call.ByID(3516977899, $in); } -export function PointerStringInStringOut($in: string | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(229603958, $in) as any; - return $resultPromise; +export function PointerStringInStringOut($in: string | null): $CancellablePromise { + return $Call.ByID(229603958, $in); } -export function StringArrayInputNamedOutput($in: string[]): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(3678582682, $in) as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function StringArrayInputNamedOutput($in: string[]): $CancellablePromise { + return $Call.ByID(3678582682, $in).then(($result: any) => { return $$createType2($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } -export function StringArrayInputNamedOutputs($in: string[]): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(319259595, $in) as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function StringArrayInputNamedOutputs($in: string[]): $CancellablePromise { + return $Call.ByID(319259595, $in).then(($result: any) => { return $$createType2($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } -export function StringArrayInputStringArrayOut($in: string[]): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(383995060, $in) as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function StringArrayInputStringArrayOut($in: string[]): $CancellablePromise { + return $Call.ByID(383995060, $in).then(($result: any) => { return $$createType2($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } -export function StringArrayInputStringOut($in: string[]): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1091960237, $in) as any; - return $resultPromise; +export function StringArrayInputStringOut($in: string[]): $CancellablePromise { + return $Call.ByID(1091960237, $in); } -export function StructInputStructOutput($in: $models.Person): Promise<$models.Person> & { cancel(): void } { - let $resultPromise = $Call.ByID(3835643147, $in) as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function StructInputStructOutput($in: $models.Person): $CancellablePromise<$models.Person> { + return $Call.ByID(3835643147, $in).then(($result: any) => { return $$createType3($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } -export function StructPointerInputErrorOutput($in: $models.Person | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(2447692557, $in) as any; - return $resultPromise; +export function StructPointerInputErrorOutput($in: $models.Person | null): $CancellablePromise { + return $Call.ByID(2447692557, $in); } -export function StructPointerInputStructPointerOutput($in: $models.Person | null): Promise<$models.Person | null> & { cancel(): void } { - let $resultPromise = $Call.ByID(2943477349, $in) as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function StructPointerInputStructPointerOutput($in: $models.Person | null): $CancellablePromise<$models.Person | null> { + return $Call.ByID(2943477349, $in).then(($result: any) => { return $$createType4($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } -export function UInt16InUIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(3401034892, $in) as any; - return $resultPromise; +export function UInt16InUIntOut($in: number): $CancellablePromise { + return $Call.ByID(3401034892, $in); } -export function UInt16PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1236957573, $in) as any; - return $resultPromise; +export function UInt16PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByID(1236957573, $in); } -export function UInt32InUIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1160383782, $in) as any; - return $resultPromise; +export function UInt32InUIntOut($in: number): $CancellablePromise { + return $Call.ByID(1160383782, $in); } -export function UInt32PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1739300671, $in) as any; - return $resultPromise; +export function UInt32PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByID(1739300671, $in); } -export function UInt64InUIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(793803239, $in) as any; - return $resultPromise; +export function UInt64InUIntOut($in: number): $CancellablePromise { + return $Call.ByID(793803239, $in); } -export function UInt64PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1403757716, $in) as any; - return $resultPromise; +export function UInt64PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByID(1403757716, $in); } -export function UInt8InUIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(2988345717, $in) as any; - return $resultPromise; +export function UInt8InUIntOut($in: number): $CancellablePromise { + return $Call.ByID(2988345717, $in); } -export function UInt8PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(518250834, $in) as any; - return $resultPromise; +export function UInt8PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByID(518250834, $in); } -export function UIntInUIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(2836661285, $in) as any; - return $resultPromise; +export function UIntInUIntOut($in: number): $CancellablePromise { + return $Call.ByID(2836661285, $in); } -export function UIntPointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1367187362, $in) as any; - return $resultPromise; +export function UIntPointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByID(1367187362, $in); } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_single/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_single/models.ts index 3dd1908e1..cd282c90c 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_single/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_single/models.ts @@ -3,7 +3,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; export class Person { "Name": string; diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single/greetservice.ts index b14533c7b..6e6ac2007 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single/greetservice.ts @@ -8,12 +8,11 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; /** * Greet someone */ -export function Greet(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1411160069, name) as any; - return $resultPromise; +export function Greet(name: string): $CancellablePromise { + return $Call.ByID(1411160069, name); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_function/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_function/greetservice.ts index b14533c7b..6e6ac2007 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_function/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_function/greetservice.ts @@ -8,12 +8,11 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; /** * Greet someone */ -export function Greet(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1411160069, name) as any; - return $resultPromise; +export function Greet(name: string): $CancellablePromise { + return $Call.ByID(1411160069, name); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/greetservice.ts index 07b718c99..88cafa9d1 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/greetservice.ts @@ -8,7 +8,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,21 +17,17 @@ import * as $models from "./models.js"; /** * Greet does XYZ */ -export function Greet(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1411160069, name) as any; - return $resultPromise; +export function Greet(name: string): $CancellablePromise { + return $Call.ByID(1411160069, name); } /** * NewPerson creates a new person */ -export function NewPerson(name: string): Promise<$models.Person | null> & { cancel(): void } { - let $resultPromise = $Call.ByID(1661412647, name) as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function NewPerson(name: string): $CancellablePromise<$models.Person | null> { + return $Call.ByID(1661412647, name).then(($result: any) => { return $$createType1($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/models.ts index 4442874d2..f6eee9de8 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/models.ts @@ -3,7 +3,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/services/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/services/models.ts index eb9c1b6bf..a4be6e904 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/services/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/services/models.ts @@ -3,7 +3,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; export class Address { "Street": string; diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/services/otherservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/services/otherservice.ts index 04f8b68ea..ec098d45a 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/services/otherservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/services/otherservice.ts @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -18,13 +18,10 @@ import * as $models from "./models.js"; /** * Yay does this and that */ -export function Yay(): Promise<$models.Address | null> & { cancel(): void } { - let $resultPromise = $Call.ByID(1491748400) as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function Yay(): $CancellablePromise<$models.Address | null> { + return $Call.ByID(1491748400).then(($result: any) => { return $$createType1($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/encoding/json/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/encoding/json/models.ts index 41353d635..8cd1a164f 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/encoding/json/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/encoding/json/models.ts @@ -3,7 +3,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; /** * Marshaler is the interface implemented by types that diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/encoding/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/encoding/models.ts index 1ff6fc7ec..235dfce3e 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/encoding/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/encoding/models.ts @@ -3,7 +3,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; /** * TextMarshaler is the interface implemented by an object that can diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.ts index 32630459f..b33d68383 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.ts @@ -8,7 +8,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -21,67 +21,49 @@ import * as $models from "./models.js"; /** * Get someone. */ -export function Get(aliasValue: $models.Alias): Promise<$models.Person> & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Get", aliasValue) as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function Get(aliasValue: $models.Alias): $CancellablePromise<$models.Person> { + return $Call.ByName("main.GreetService.Get", aliasValue).then(($result: any) => { return $$createType0($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } /** * Apparently, aliases are all the rage right now. */ -export function GetButAliased(p: $models.AliasedPerson): Promise<$models.StrangelyAliasedPerson> & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.GetButAliased", p) as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function GetButAliased(p: $models.AliasedPerson): $CancellablePromise<$models.StrangelyAliasedPerson> { + return $Call.ByName("main.GreetService.GetButAliased", p).then(($result: any) => { return $$createType0($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } /** * Get someone quite different. */ -export function GetButDifferent(): Promise<$models.GenericPerson> & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.GetButDifferent") as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function GetButDifferent(): $CancellablePromise<$models.GenericPerson> { + return $Call.ByName("main.GreetService.GetButDifferent").then(($result: any) => { return $$createType1($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } -export function GetButForeignPrivateAlias(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.GetButForeignPrivateAlias") as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function GetButForeignPrivateAlias(): $CancellablePromise { + return $Call.ByName("main.GreetService.GetButForeignPrivateAlias").then(($result: any) => { return $$createType2($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } -export function GetButGenericAliases(): Promise<$models.AliasGroup> & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.GetButGenericAliases") as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function GetButGenericAliases(): $CancellablePromise<$models.AliasGroup> { + return $Call.ByName("main.GreetService.GetButGenericAliases").then(($result: any) => { return $$createType3($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } /** * Greet a lot of unusual things. */ -export function Greet($0: $models.EmptyAliasStruct, $1: $models.EmptyStruct): Promise<$models.AliasStruct> & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Greet", $0, $1) as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function Greet($0: $models.EmptyAliasStruct, $1: $models.EmptyStruct): $CancellablePromise<$models.AliasStruct> { + return $Call.ByName("main.GreetService.Greet", $0, $1).then(($result: any) => { return $$createType7($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/models.ts index 1f048ba57..63ca43914 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/models.ts @@ -3,7 +3,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; /** * A nice type Alias. @@ -169,7 +169,7 @@ export class GenericPerson { * returns a creation function for a concrete instance * of the generic class GenericPerson. */ - static createFrom($$createParamT: (source: any) => T): ($$source?: any) => GenericPerson { + static createFrom($$createParamT: (source: any) => T): ($$source?: any) => GenericPerson { const $$createField0_0 = $$createParamT; return ($$source: any = {}) => { let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service7.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service7.ts index b7ca5f4cd..0780a0de3 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service7.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service7.ts @@ -3,9 +3,8 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; -export function TestMethod(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config.Service7.TestMethod") as any; - return $resultPromise; +export function TestMethod(): $CancellablePromise { + return $Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config.Service7.TestMethod"); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service9.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service9.ts index 7ab11ba96..a2222265f 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service9.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service9.ts @@ -3,9 +3,8 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; -export function TestMethod2(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config.Service9.TestMethod2") as any; - return $resultPromise; +export function TestMethod2(): $CancellablePromise { + return $Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config.Service9.TestMethod2"); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_json/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_json/greetservice.ts index 004971239..f2106e7f4 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_json/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_json/greetservice.ts @@ -8,7 +8,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,7 +17,6 @@ import * as $models from "./models.js"; /** * Greet does XYZ */ -export function Greet(person: $models.Person, emb: $models.Embedded1): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Greet", person, emb) as any; - return $resultPromise; +export function Greet(person: $models.Person, emb: $models.Embedded1): $CancellablePromise { + return $Call.ByName("main.GreetService.Greet", person, emb); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_json/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_json/models.ts index 2ff5d6635..50f23b52d 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_json/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_json/models.ts @@ -3,7 +3,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; export class Embedded1 { /** diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_method/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_method/greetservice.ts index 45311c10c..4471270ed 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_method/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_method/greetservice.ts @@ -8,7 +8,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -19,15 +19,12 @@ import * as $models from "./models.js"; * It has a multiline doc comment * The comment has even some * / traps!! */ -export function Greet(str: string, people: $models.Person[], $2: {"AnotherCount": number, "AnotherOne": $models.Person | null}, assoc: { [_: `${number}`]: boolean | null }, $4: (number | null)[], ...other: string[]): Promise<[$models.Person, any, number[]]> & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Greet", str, people, $2, assoc, $4, other) as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function Greet(str: string, people: $models.Person[], $2: {"AnotherCount": number, "AnotherOne": $models.Person | null}, assoc: { [_: `${number}`]: boolean | null }, $4: (number | null)[], ...other: string[]): $CancellablePromise<[$models.Person, any, number[]]> { + return $Call.ByName("main.GreetService.Greet", str, people, $2, assoc, $4, other).then(($result: any) => { $result[0] = $$createType0($result[0]); $result[2] = $$createType1($result[2]); return $result; - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_method/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_method/models.ts index 66dc14092..2417aff4c 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_method/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_method/models.ts @@ -3,7 +3,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; /** * Person represents a person diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_imports/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_imports/greetservice.ts index d6525e21b..2f0e45aff 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_imports/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_imports/greetservice.ts @@ -8,7 +8,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,15 +17,12 @@ import * as $models from "./models.js"; /** * Make a cycle. */ -export function MakeCycles(): Promise<[$models.StructA, $models.StructC]> & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.MakeCycles") as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function MakeCycles(): $CancellablePromise<[$models.StructA, $models.StructC]> { + return $Call.ByName("main.GreetService.MakeCycles").then(($result: any) => { $result[0] = $$createType0($result[0]); $result[1] = $$createType1($result[1]); return $result; - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_imports/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_imports/models.ts index a79d42f32..9e86cd674 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_imports/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_imports/models.ts @@ -3,7 +3,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; export class StructA { "B": structB | null; diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_types/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_types/greetservice.ts index 3af14c1c5..dba844168 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_types/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_types/greetservice.ts @@ -8,7 +8,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,19 +17,16 @@ import * as $models from "./models.js"; /** * Make a cycle. */ -export function MakeCycles(): Promise<[$models.Cyclic, $models.GenericCyclic<$models.GenericCyclic>]> & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.MakeCycles") as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function MakeCycles(): $CancellablePromise<[$models.Cyclic, $models.GenericCyclic<$models.GenericCyclic>]> { + return $Call.ByName("main.GreetService.MakeCycles").then(($result: any) => { $result[0] = $$createType0($result[0]); $result[1] = $$createType9($result[1]); return $result; - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } // Private type creation functions -var $$createType0 = (function $$initCreateType0(...args): any { +var $$createType0 = (function $$initCreateType0(...args: any[]): any { if ($$createType0 === $$initCreateType0) { $$createType0 = $$createType3; } @@ -38,7 +35,7 @@ var $$createType0 = (function $$initCreateType0(...args): any { const $$createType1 = $Create.Nullable($$createType0); const $$createType2 = $Create.Map($Create.Any, $$createType1); const $$createType3 = $Create.Array($$createType2); -var $$createType4 = (function $$initCreateType4(...args): any { +var $$createType4 = (function $$initCreateType4(...args: any[]): any { if ($$createType4 === $$initCreateType4) { $$createType4 = $$createType8; } @@ -51,7 +48,7 @@ const $$createType7 = $Create.Struct({ "Y": $$createType6, }); const $$createType8 = $Create.Array($$createType7); -var $$createType9 = (function $$initCreateType9(...args): any { +var $$createType9 = (function $$initCreateType9(...args: any[]): any { if ($$createType9 === $$initCreateType9) { $$createType9 = $$createType13; } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_types/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_types/models.ts index ed98e9791..93d1ef5c6 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_types/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_types/models.ts @@ -3,7 +3,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; export type Alias = Cyclic | null; diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/internalservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/internalservice.ts index e464032ee..9271273bc 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/internalservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/internalservice.ts @@ -8,13 +8,12 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports import * as $models from "./models.js"; -export function Method($0: $models.InternalModel): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.InternalService.Method", $0) as any; - return $resultPromise; +export function Method($0: $models.InternalModel): $CancellablePromise { + return $Call.ByName("main.InternalService.Method", $0); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/models.ts index 489296e23..4d242fc2c 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/models.ts @@ -3,7 +3,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; /** * An exported but internal model. diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/otherpackage/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/otherpackage/models.ts index 209ade5da..b927155d5 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/otherpackage/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/otherpackage/models.ts @@ -3,7 +3,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; export class Dummy { diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/service.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/service.ts index 9b4d0265f..0687bd8ac 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/service.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/service.ts @@ -3,20 +3,18 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports import * as otherpackage$0 from "./otherpackage/models.js"; -function InternalMethod($0: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.Service.InternalMethod", $0) as any; - return $resultPromise; +function InternalMethod($0: string): $CancellablePromise { + return $Call.ByName("main.Service.InternalMethod", $0); } -export function VisibleMethod($0: otherpackage$0.Dummy): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.Service.VisibleMethod", $0) as any; - return $resultPromise; +export function VisibleMethod($0: otherpackage$0.Dummy): $CancellablePromise { + return $Call.ByName("main.Service.VisibleMethod", $0); } export async function CustomMethod(arg: string): Promise { diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/unexportedservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/unexportedservice.ts index 97c0acf11..34b23e24d 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/unexportedservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/unexportedservice.ts @@ -8,13 +8,12 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports import * as $models from "./models.js"; -export function Method($0: $models.unexportedModel): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.unexportedService.Method", $0) as any; - return $resultPromise; +export function Method($0: $models.unexportedModel): $CancellablePromise { + return $Call.ByName("main.unexportedService.Method", $0); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/embedded_interface/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/embedded_interface/greetservice.ts index 64845db23..c5b06be75 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/embedded_interface/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/embedded_interface/greetservice.ts @@ -8,45 +8,40 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; /** * Comment 1. */ -export function Method1(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Method1") as any; - return $resultPromise; +export function Method1(): $CancellablePromise { + return $Call.ByName("main.GreetService.Method1"); } /** * Comment 2. */ -export function Method2(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Method2") as any; - return $resultPromise; +export function Method2(): $CancellablePromise { + return $Call.ByName("main.GreetService.Method2"); } /** * Comment 3a. * Comment 3b. */ -export function Method3(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Method3") as any; - return $resultPromise; +export function Method3(): $CancellablePromise { + return $Call.ByName("main.GreetService.Method3"); } /** * Comment 4. */ -export function Method4(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Method4") as any; - return $resultPromise; +export function Method4(): $CancellablePromise { + return $Call.ByName("main.GreetService.Method4"); } /** * Comment 5. */ -export function Method5(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Method5") as any; - return $resultPromise; +export function Method5(): $CancellablePromise { + return $Call.ByName("main.GreetService.Method5"); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/enum/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/enum/greetservice.ts index 3fdf09b81..45abc153e 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/enum/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/enum/greetservice.ts @@ -8,7 +8,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,21 +17,17 @@ import * as $models from "./models.js"; /** * Greet does XYZ */ -export function Greet(name: string, title: $models.Title): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Greet", name, title) as any; - return $resultPromise; +export function Greet(name: string, title: $models.Title): $CancellablePromise { + return $Call.ByName("main.GreetService.Greet", name, title); } /** * NewPerson creates a new person */ -export function NewPerson(name: string): Promise<$models.Person | null> & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.NewPerson", name) as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function NewPerson(name: string): $CancellablePromise<$models.Person | null> { + return $Call.ByName("main.GreetService.NewPerson", name).then(($result: any) => { return $$createType1($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/enum/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/enum/models.ts index 7b8cbf2fc..a50282a38 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/enum/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/enum/models.ts @@ -3,7 +3,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; /** * Age is an integer with some predefined values diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/enum_from_imported_package/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/enum_from_imported_package/greetservice.ts index 130e45193..c4afd85da 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/enum_from_imported_package/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/enum_from_imported_package/greetservice.ts @@ -8,7 +8,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,7 +17,6 @@ import * as services$0 from "./services/models.js"; /** * Greet does XYZ */ -export function Greet(name: string, title: services$0.Title): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Greet", name, title) as any; - return $resultPromise; +export function Greet(name: string, title: services$0.Title): $CancellablePromise { + return $Call.ByName("main.GreetService.Greet", name, title); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/enum_from_imported_package/services/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/enum_from_imported_package/services/models.ts index 335543dbb..661222bdf 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/enum_from_imported_package/services/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/enum_from_imported_package/services/models.ts @@ -3,7 +3,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; export enum Title { /** diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/greetservice.ts index 49c20faa3..1a2ffb266 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/greetservice.ts @@ -8,7 +8,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,21 +17,17 @@ import * as $models from "./models.js"; /** * Greet does XYZ */ -export function Greet(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Greet", name) as any; - return $resultPromise; +export function Greet(name: string): $CancellablePromise { + return $Call.ByName("main.GreetService.Greet", name); } /** * NewPerson creates a new person */ -export function NewPerson(name: string): Promise<$models.Person | null> & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.NewPerson", name) as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function NewPerson(name: string): $CancellablePromise<$models.Person | null> { + return $Call.ByName("main.GreetService.NewPerson", name).then(($result: any) => { return $$createType1($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/models.ts index 02707e2ca..f1ff262a1 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/models.ts @@ -3,7 +3,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/services/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/services/models.ts index eb9c1b6bf..a4be6e904 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/services/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/services/models.ts @@ -3,7 +3,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; export class Address { "Street": string; diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/services/otherservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/services/otherservice.ts index 7423db695..f44f172e7 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/services/otherservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/services/otherservice.ts @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -18,13 +18,10 @@ import * as $models from "./models.js"; /** * Yay does this and that */ -export function Yay(): Promise<$models.Address | null> & { cancel(): void } { - let $resultPromise = $Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/services.OtherService.Yay") as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function Yay(): $CancellablePromise<$models.Address | null> { + return $Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/services.OtherService.Yay").then(($result: any) => { return $$createType1($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/greetservice.ts index 49c20faa3..1a2ffb266 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/greetservice.ts @@ -8,7 +8,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,21 +17,17 @@ import * as $models from "./models.js"; /** * Greet does XYZ */ -export function Greet(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Greet", name) as any; - return $resultPromise; +export function Greet(name: string): $CancellablePromise { + return $Call.ByName("main.GreetService.Greet", name); } /** * NewPerson creates a new person */ -export function NewPerson(name: string): Promise<$models.Person | null> & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.NewPerson", name) as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function NewPerson(name: string): $CancellablePromise<$models.Person | null> { + return $Call.ByName("main.GreetService.NewPerson", name).then(($result: any) => { return $$createType1($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/models.ts index c4a6d39ee..88b2c78db 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/models.ts @@ -3,7 +3,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/services/other/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/services/other/models.ts index eb9c1b6bf..a4be6e904 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/services/other/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/services/other/models.ts @@ -3,7 +3,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; export class Address { "Street": string; diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/services/other/otherservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/services/other/otherservice.ts index 27084cac3..fa9a93fc8 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/services/other/otherservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/services/other/otherservice.ts @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -18,13 +18,10 @@ import * as $models from "./models.js"; /** * Yay does this and that */ -export function Yay(): Promise<$models.Address | null> & { cancel(): void } { - let $resultPromise = $Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/services/other.OtherService.Yay") as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function Yay(): $CancellablePromise<$models.Address | null> { + return $Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/services/other.OtherService.Yay").then(($result: any) => { return $$createType1($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_multiple_files/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_multiple_files/greetservice.ts index 56c688c31..460b2b374 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_multiple_files/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_multiple_files/greetservice.ts @@ -3,9 +3,8 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; -export function Greet(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Greet", name) as any; - return $resultPromise; +export function Greet(name: string): $CancellablePromise { + return $Call.ByName("main.GreetService.Greet", name); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single/greetservice.ts index e6dca1f04..6a6a881dc 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single/greetservice.ts @@ -8,12 +8,11 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; /** * Greet someone */ -export function Greet(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Greet", name) as any; - return $resultPromise; +export function Greet(name: string): $CancellablePromise { + return $Call.ByName("main.GreetService.Greet", name); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_context/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_context/greetservice.ts index 36a0a5296..aec011527 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_context/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_context/greetservice.ts @@ -8,20 +8,18 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; /** * Greet someone */ -export function Greet(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Greet", name) as any; - return $resultPromise; +export function Greet(name: string): $CancellablePromise { + return $Call.ByName("main.GreetService.Greet", name); } /** * Greet someone */ -export function GreetWithContext(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.GreetWithContext", name) as any; - return $resultPromise; +export function GreetWithContext(name: string): $CancellablePromise { + return $Call.ByName("main.GreetService.GreetWithContext", name); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_internal/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_internal/greetservice.ts index e6dca1f04..6a6a881dc 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_internal/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_internal/greetservice.ts @@ -8,12 +8,11 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; /** * Greet someone */ -export function Greet(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Greet", name) as any; - return $resultPromise; +export function Greet(name: string): $CancellablePromise { + return $Call.ByName("main.GreetService.Greet", name); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/models.ts index 81b54bc2e..0d26a6b0b 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/models.ts @@ -3,7 +3,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; export type BasicCstrAlias = S; @@ -1197,7 +1197,7 @@ export class Maps { * returns a creation function for a concrete instance * of the generic class Maps. */ - static createFrom($$createParamR: (source: any) => R, $$createParamS: (source: any) => S, $$createParamT: (source: any) => T, $$createParamU: (source: any) => U, $$createParamV: (source: any) => V, $$createParamW: (source: any) => W, $$createParamX: (source: any) => X, $$createParamY: (source: any) => Y, $$createParamZ: (source: any) => Z): ($$source?: any) => Maps { + static createFrom($$createParamR: (source: any) => R, $$createParamS: (source: any) => S, $$createParamT: (source: any) => T, $$createParamU: (source: any) => U, $$createParamV: (source: any) => V, $$createParamW: (source: any) => W, $$createParamX: (source: any) => X, $$createParamY: (source: any) => Y, $$createParamZ: (source: any) => Z): ($$source?: any) => Maps { const $$createField0_0 = $$createType0; const $$createField1_0 = $$createType1; const $$createField2_0 = $$createType2; @@ -1863,24 +1863,24 @@ const $$createType55 = $Create.Map($Create.Any, $Create.Any); const $$createType56 = $Create.Map($Create.Any, $Create.Any); const $$createType57 = $Create.Map($Create.Any, $Create.Any); const $$createType58 = $Create.Map($Create.Any, $Create.Any); -const $$createType59 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType60 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType61 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType62 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType63 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType64 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType65 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType66 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType67 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType68 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType69 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType70 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType71 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType72 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType73 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType74 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType75 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); -const $$createType76 = ($$createParamR, $$createParamS, $$createParamT, $$createParamU, $$createParamV, $$createParamW, $$createParamX, $$createParamY, $$createParamZ) => $Create.Map($Create.Any, $Create.Any); +const $$createType59 = ($$createParamR: any, $$createParamS: any, $$createParamT: any, $$createParamU: any, $$createParamV: any, $$createParamW: any, $$createParamX: any, $$createParamY: any, $$createParamZ: any) => $Create.Map($Create.Any, $Create.Any); +const $$createType60 = ($$createParamR: any, $$createParamS: any, $$createParamT: any, $$createParamU: any, $$createParamV: any, $$createParamW: any, $$createParamX: any, $$createParamY: any, $$createParamZ: any) => $Create.Map($Create.Any, $Create.Any); +const $$createType61 = ($$createParamR: any, $$createParamS: any, $$createParamT: any, $$createParamU: any, $$createParamV: any, $$createParamW: any, $$createParamX: any, $$createParamY: any, $$createParamZ: any) => $Create.Map($Create.Any, $Create.Any); +const $$createType62 = ($$createParamR: any, $$createParamS: any, $$createParamT: any, $$createParamU: any, $$createParamV: any, $$createParamW: any, $$createParamX: any, $$createParamY: any, $$createParamZ: any) => $Create.Map($Create.Any, $Create.Any); +const $$createType63 = ($$createParamR: any, $$createParamS: any, $$createParamT: any, $$createParamU: any, $$createParamV: any, $$createParamW: any, $$createParamX: any, $$createParamY: any, $$createParamZ: any) => $Create.Map($Create.Any, $Create.Any); +const $$createType64 = ($$createParamR: any, $$createParamS: any, $$createParamT: any, $$createParamU: any, $$createParamV: any, $$createParamW: any, $$createParamX: any, $$createParamY: any, $$createParamZ: any) => $Create.Map($Create.Any, $Create.Any); +const $$createType65 = ($$createParamR: any, $$createParamS: any, $$createParamT: any, $$createParamU: any, $$createParamV: any, $$createParamW: any, $$createParamX: any, $$createParamY: any, $$createParamZ: any) => $Create.Map($Create.Any, $Create.Any); +const $$createType66 = ($$createParamR: any, $$createParamS: any, $$createParamT: any, $$createParamU: any, $$createParamV: any, $$createParamW: any, $$createParamX: any, $$createParamY: any, $$createParamZ: any) => $Create.Map($Create.Any, $Create.Any); +const $$createType67 = ($$createParamR: any, $$createParamS: any, $$createParamT: any, $$createParamU: any, $$createParamV: any, $$createParamW: any, $$createParamX: any, $$createParamY: any, $$createParamZ: any) => $Create.Map($Create.Any, $Create.Any); +const $$createType68 = ($$createParamR: any, $$createParamS: any, $$createParamT: any, $$createParamU: any, $$createParamV: any, $$createParamW: any, $$createParamX: any, $$createParamY: any, $$createParamZ: any) => $Create.Map($Create.Any, $Create.Any); +const $$createType69 = ($$createParamR: any, $$createParamS: any, $$createParamT: any, $$createParamU: any, $$createParamV: any, $$createParamW: any, $$createParamX: any, $$createParamY: any, $$createParamZ: any) => $Create.Map($Create.Any, $Create.Any); +const $$createType70 = ($$createParamR: any, $$createParamS: any, $$createParamT: any, $$createParamU: any, $$createParamV: any, $$createParamW: any, $$createParamX: any, $$createParamY: any, $$createParamZ: any) => $Create.Map($Create.Any, $Create.Any); +const $$createType71 = ($$createParamR: any, $$createParamS: any, $$createParamT: any, $$createParamU: any, $$createParamV: any, $$createParamW: any, $$createParamX: any, $$createParamY: any, $$createParamZ: any) => $Create.Map($Create.Any, $Create.Any); +const $$createType72 = ($$createParamR: any, $$createParamS: any, $$createParamT: any, $$createParamU: any, $$createParamV: any, $$createParamW: any, $$createParamX: any, $$createParamY: any, $$createParamZ: any) => $Create.Map($Create.Any, $Create.Any); +const $$createType73 = ($$createParamR: any, $$createParamS: any, $$createParamT: any, $$createParamU: any, $$createParamV: any, $$createParamW: any, $$createParamX: any, $$createParamY: any, $$createParamZ: any) => $Create.Map($Create.Any, $Create.Any); +const $$createType74 = ($$createParamR: any, $$createParamS: any, $$createParamT: any, $$createParamU: any, $$createParamV: any, $$createParamW: any, $$createParamX: any, $$createParamY: any, $$createParamZ: any) => $Create.Map($Create.Any, $Create.Any); +const $$createType75 = ($$createParamR: any, $$createParamS: any, $$createParamT: any, $$createParamU: any, $$createParamV: any, $$createParamW: any, $$createParamX: any, $$createParamY: any, $$createParamZ: any) => $Create.Map($Create.Any, $Create.Any); +const $$createType76 = ($$createParamR: any, $$createParamS: any, $$createParamT: any, $$createParamU: any, $$createParamV: any, $$createParamW: any, $$createParamX: any, $$createParamY: any, $$createParamZ: any) => $Create.Map($Create.Any, $Create.Any); const $$createType77 = $Create.Map($Create.Any, $Create.Any); const $$createType78 = $Create.Map($Create.Any, $Create.Any); const $$createType79 = $Create.Map($Create.Any, $Create.Any); diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/service.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/service.ts index d68598901..d62acda96 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/service.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/service.ts @@ -3,19 +3,16 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports import * as $models from "./models.js"; -export function Method(): Promise<$models.Maps<$models.PointerTextMarshaler, number, number, $models.ValueTextMarshaler, $models.PointerTextMarshaler | null, $models.ValueTextMarshaler, $models.StringType, $models.ValueTextMarshaler, $models.PointerTextMarshaler | null>> & { cancel(): void } { - let $resultPromise = $Call.ByName("main.Service.Method") as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function Method(): $CancellablePromise<$models.Maps<$models.PointerTextMarshaler, number, number, $models.ValueTextMarshaler, $models.PointerTextMarshaler | null, $models.ValueTextMarshaler, $models.StringType, $models.ValueTextMarshaler, $models.PointerTextMarshaler | null>> { + return $Call.ByName("main.Service.Method").then(($result: any) => { return $$createType0($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/marshalers/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/marshalers/models.ts index 32cfd9f37..d8db23862 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/marshalers/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/marshalers/models.ts @@ -3,7 +3,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/marshalers/service.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/marshalers/service.ts index 90ddd2521..8e2af391b 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/marshalers/service.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/marshalers/service.ts @@ -3,19 +3,16 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports import * as $models from "./models.js"; -export function Method(): Promise<$models.Data> & { cancel(): void } { - let $resultPromise = $Call.ByName("main.Service.Method") as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function Method(): $CancellablePromise<$models.Data> { + return $Call.ByName("main.Service.Method").then(($result: any) => { return $$createType0($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/models.ts index 6e31400f2..4cb328e1e 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/models.ts @@ -3,7 +3,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -41,7 +41,7 @@ export class HowDifferent { * returns a creation function for a concrete instance * of the generic class HowDifferent. */ - static createFrom($$createParamHow: (source: any) => How): ($$source?: any) => HowDifferent { + static createFrom($$createParamHow: (source: any) => How): ($$source?: any) => HowDifferent { const $$createField1_0 = $$createType1($$createParamHow); return ($$source: any = {}) => { let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; @@ -157,7 +157,7 @@ export const PrivatePerson = personImpl; export type PrivatePerson = personImpl; // Private type creation functions -const $$createType0 = ($$createParamHow) => $Create.Map($Create.Any, $$createParamHow); -const $$createType1 = ($$createParamHow) => $Create.Array($$createType0($$createParamHow)); +const $$createType0 = ($$createParamHow: any) => $Create.Map($Create.Any, $$createParamHow); +const $$createType1 = ($$createParamHow: any) => $Create.Array($$createType0($$createParamHow)); const $$createType2 = other$0.OtherPerson.createFrom($Create.Any); const $$createType3 = $Create.Array($$createType2); diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/other/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/other/models.ts index e41f6e1d3..711735a2b 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/other/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/other/models.ts @@ -3,7 +3,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; /** * OtherPerson is like a person, but different. @@ -36,7 +36,7 @@ export class OtherPerson { * returns a creation function for a concrete instance * of the generic class OtherPerson. */ - static createFrom($$createParamT: (source: any) => T): ($$source?: any) => OtherPerson { + static createFrom($$createParamT: (source: any) => T): ($$source?: any) => OtherPerson { const $$createField1_0 = $$createType0($$createParamT); return ($$source: any = {}) => { let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; @@ -49,4 +49,4 @@ export class OtherPerson { } // Private type creation functions -const $$createType0 = ($$createParamT) => $Create.Array($$createParamT); +const $$createType0 = ($$createParamT: any) => $Create.Array($$createParamT); diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/other/othermethods.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/other/othermethods.ts index 2964ba9be..2e4c173df 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/other/othermethods.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/other/othermethods.ts @@ -8,12 +8,11 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; /** * LikeThisOtherOne does nothing as well, but is different. */ -export function LikeThisOtherOne(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/other.OtherMethods.LikeThisOtherOne") as any; - return $resultPromise; +export function LikeThisOtherOne(): $CancellablePromise { + return $Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/other.OtherMethods.LikeThisOtherOne"); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/somemethods.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/somemethods.ts index ef08b89ed..fb5f5ce21 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/somemethods.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/somemethods.ts @@ -8,7 +8,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,24 +17,20 @@ import * as $models from "./models.js"; /** * LikeThisOne is an example method that does nothing. */ -export function LikeThisOne(): Promise<[$models.Person, $models.HowDifferent, $models.PrivatePerson]> & { cancel(): void } { - let $resultPromise = $Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here.SomeMethods.LikeThisOne") as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function LikeThisOne(): $CancellablePromise<[$models.Person, $models.HowDifferent, $models.PrivatePerson]> { + return $Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here.SomeMethods.LikeThisOne").then(($result: any) => { $result[0] = $$createType0($result[0]); $result[1] = $$createType1($result[1]); $result[2] = $$createType2($result[2]); return $result; - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } /** * LikeThisOtherOne does nothing as well, but is different. */ -export function LikeThisOtherOne(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here.SomeMethods.LikeThisOtherOne") as any; - return $resultPromise; +export function LikeThisOtherOne(): $CancellablePromise { + return $Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here.SomeMethods.LikeThisOtherOne"); } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedother.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedother.ts index c5cadc32b..c82f44866 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedother.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedother.ts @@ -8,12 +8,11 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; /** * LikeThisOtherOne does nothing as well, but is different. */ -export function LikeThisOtherOne(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.EmbedOther.LikeThisOtherOne") as any; - return $resultPromise; +export function LikeThisOtherOne(): $CancellablePromise { + return $Call.ByName("main.EmbedOther.LikeThisOtherOne"); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedservice.ts index 5716d2933..e3b2fe679 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedservice.ts @@ -8,7 +8,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,24 +17,20 @@ import * as nobindingshere$0 from "../no_bindings_here/models.js"; /** * LikeThisOne is an example method that does nothing. */ -export function LikeThisOne(): Promise<[nobindingshere$0.Person, nobindingshere$0.HowDifferent, nobindingshere$0.PrivatePerson]> & { cancel(): void } { - let $resultPromise = $Call.ByName("main.EmbedService.LikeThisOne") as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function LikeThisOne(): $CancellablePromise<[nobindingshere$0.Person, nobindingshere$0.HowDifferent, nobindingshere$0.PrivatePerson]> { + return $Call.ByName("main.EmbedService.LikeThisOne").then(($result: any) => { $result[0] = $$createType0($result[0]); $result[1] = $$createType1($result[1]); $result[2] = $$createType2($result[2]); return $result; - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } /** * LikeThisOtherOne does nothing as well, but is different. */ -export function LikeThisOtherOne(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.EmbedService.LikeThisOtherOne") as any; - return $resultPromise; +export function LikeThisOtherOne(): $CancellablePromise { + return $Call.ByName("main.EmbedService.LikeThisOtherOne"); } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/greetservice.ts index 09f388a60..192340e8e 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/greetservice.ts @@ -8,12 +8,11 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; /** * Greet someone */ -export function Greet($0: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Greet", $0) as any; - return $resultPromise; +export function Greet($0: string): $CancellablePromise { + return $Call.ByName("main.GreetService.Greet", $0); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/greetservice.ts index 56c688c31..460b2b374 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/greetservice.ts @@ -3,9 +3,8 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; -export function Greet(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Greet", name) as any; - return $resultPromise; +export function Greet(name: string): $CancellablePromise { + return $Call.ByName("main.GreetService.Greet", name); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/otherservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/otherservice.ts index 7625ce92e..e437314f4 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/otherservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/otherservice.ts @@ -3,9 +3,8 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; -export function Hello(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.OtherService.Hello") as any; - return $resultPromise; +export function Hello(): $CancellablePromise { + return $Call.ByName("main.OtherService.Hello"); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/greetservice.ts index 56c688c31..460b2b374 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/greetservice.ts @@ -3,9 +3,8 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; -export function Greet(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Greet", name) as any; - return $resultPromise; +export function Greet(name: string): $CancellablePromise { + return $Call.ByName("main.GreetService.Greet", name); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/otherservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/otherservice.ts index 7625ce92e..e437314f4 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/otherservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/otherservice.ts @@ -3,9 +3,8 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; -export function Hello(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.OtherService.Hello") as any; - return $resultPromise; +export function Hello(): $CancellablePromise { + return $Call.ByName("main.OtherService.Hello"); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/greetservice.ts index 49c20faa3..1a2ffb266 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/greetservice.ts @@ -8,7 +8,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,21 +17,17 @@ import * as $models from "./models.js"; /** * Greet does XYZ */ -export function Greet(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Greet", name) as any; - return $resultPromise; +export function Greet(name: string): $CancellablePromise { + return $Call.ByName("main.GreetService.Greet", name); } /** * NewPerson creates a new person */ -export function NewPerson(name: string): Promise<$models.Person | null> & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.NewPerson", name) as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function NewPerson(name: string): $CancellablePromise<$models.Person | null> { + return $Call.ByName("main.GreetService.NewPerson", name).then(($result: any) => { return $$createType1($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/models.ts index 474248f2e..d76f68d9d 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/models.ts @@ -3,7 +3,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/services/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/services/models.ts index eb9c1b6bf..a4be6e904 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/services/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/services/models.ts @@ -3,7 +3,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; export class Address { "Street": string; diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/services/otherservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/services/otherservice.ts index 3c2901c2c..fc2efb6c1 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/services/otherservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/services/otherservice.ts @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -18,13 +18,10 @@ import * as $models from "./models.js"; /** * Yay does this and that */ -export function Yay(): Promise<$models.Address | null> & { cancel(): void } { - let $resultPromise = $Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/services.OtherService.Yay") as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function Yay(): $CancellablePromise<$models.Address | null> { + return $Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/services.OtherService.Yay").then(($result: any) => { return $$createType1($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_non_pointer_single/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_non_pointer_single/greetservice.ts index eda8ff455..ea2dcf8a6 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_non_pointer_single/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_non_pointer_single/greetservice.ts @@ -8,252 +8,197 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports import * as $models from "./models.js"; -export function ArrayInt($in: number[]): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.ArrayInt", $in) as any; - return $resultPromise; +export function ArrayInt($in: number[]): $CancellablePromise { + return $Call.ByName("main.GreetService.ArrayInt", $in); } -export function BoolInBoolOut($in: boolean): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.BoolInBoolOut", $in) as any; - return $resultPromise; +export function BoolInBoolOut($in: boolean): $CancellablePromise { + return $Call.ByName("main.GreetService.BoolInBoolOut", $in); } -export function Float32InFloat32Out($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Float32InFloat32Out", $in) as any; - return $resultPromise; +export function Float32InFloat32Out($in: number): $CancellablePromise { + return $Call.ByName("main.GreetService.Float32InFloat32Out", $in); } -export function Float64InFloat64Out($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Float64InFloat64Out", $in) as any; - return $resultPromise; +export function Float64InFloat64Out($in: number): $CancellablePromise { + return $Call.ByName("main.GreetService.Float64InFloat64Out", $in); } /** * Greet someone */ -export function Greet(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Greet", name) as any; - return $resultPromise; +export function Greet(name: string): $CancellablePromise { + return $Call.ByName("main.GreetService.Greet", name); } -export function Int16InIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Int16InIntOut", $in) as any; - return $resultPromise; +export function Int16InIntOut($in: number): $CancellablePromise { + return $Call.ByName("main.GreetService.Int16InIntOut", $in); } -export function Int16PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Int16PointerInAndOutput", $in) as any; - return $resultPromise; +export function Int16PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByName("main.GreetService.Int16PointerInAndOutput", $in); } -export function Int32InIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Int32InIntOut", $in) as any; - return $resultPromise; +export function Int32InIntOut($in: number): $CancellablePromise { + return $Call.ByName("main.GreetService.Int32InIntOut", $in); } -export function Int32PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Int32PointerInAndOutput", $in) as any; - return $resultPromise; +export function Int32PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByName("main.GreetService.Int32PointerInAndOutput", $in); } -export function Int64InIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Int64InIntOut", $in) as any; - return $resultPromise; +export function Int64InIntOut($in: number): $CancellablePromise { + return $Call.ByName("main.GreetService.Int64InIntOut", $in); } -export function Int64PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Int64PointerInAndOutput", $in) as any; - return $resultPromise; +export function Int64PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByName("main.GreetService.Int64PointerInAndOutput", $in); } -export function Int8InIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Int8InIntOut", $in) as any; - return $resultPromise; +export function Int8InIntOut($in: number): $CancellablePromise { + return $Call.ByName("main.GreetService.Int8InIntOut", $in); } -export function Int8PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Int8PointerInAndOutput", $in) as any; - return $resultPromise; +export function Int8PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByName("main.GreetService.Int8PointerInAndOutput", $in); } -export function IntInIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.IntInIntOut", $in) as any; - return $resultPromise; +export function IntInIntOut($in: number): $CancellablePromise { + return $Call.ByName("main.GreetService.IntInIntOut", $in); } -export function IntPointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.IntPointerInAndOutput", $in) as any; - return $resultPromise; +export function IntPointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByName("main.GreetService.IntPointerInAndOutput", $in); } -export function IntPointerInputNamedOutputs($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.IntPointerInputNamedOutputs", $in) as any; - return $resultPromise; +export function IntPointerInputNamedOutputs($in: number | null): $CancellablePromise { + return $Call.ByName("main.GreetService.IntPointerInputNamedOutputs", $in); } -export function MapIntInt($in: { [_: `${number}`]: number }): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.MapIntInt", $in) as any; - return $resultPromise; +export function MapIntInt($in: { [_: `${number}`]: number }): $CancellablePromise { + return $Call.ByName("main.GreetService.MapIntInt", $in); } -export function MapIntIntPointer($in: { [_: `${number}`]: number | null }): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.MapIntIntPointer", $in) as any; - return $resultPromise; +export function MapIntIntPointer($in: { [_: `${number}`]: number | null }): $CancellablePromise { + return $Call.ByName("main.GreetService.MapIntIntPointer", $in); } -export function MapIntSliceInt($in: { [_: `${number}`]: number[] }): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.MapIntSliceInt", $in) as any; - return $resultPromise; +export function MapIntSliceInt($in: { [_: `${number}`]: number[] }): $CancellablePromise { + return $Call.ByName("main.GreetService.MapIntSliceInt", $in); } -export function MapIntSliceIntInMapIntSliceIntOut($in: { [_: `${number}`]: number[] }): Promise<{ [_: `${number}`]: number[] }> & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.MapIntSliceIntInMapIntSliceIntOut", $in) as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function MapIntSliceIntInMapIntSliceIntOut($in: { [_: `${number}`]: number[] }): $CancellablePromise<{ [_: `${number}`]: number[] }> { + return $Call.ByName("main.GreetService.MapIntSliceIntInMapIntSliceIntOut", $in).then(($result: any) => { return $$createType1($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } -export function NoInputsStringOut(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.NoInputsStringOut") as any; - return $resultPromise; +export function NoInputsStringOut(): $CancellablePromise { + return $Call.ByName("main.GreetService.NoInputsStringOut"); } -export function PointerBoolInBoolOut($in: boolean | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.PointerBoolInBoolOut", $in) as any; - return $resultPromise; +export function PointerBoolInBoolOut($in: boolean | null): $CancellablePromise { + return $Call.ByName("main.GreetService.PointerBoolInBoolOut", $in); } -export function PointerFloat32InFloat32Out($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.PointerFloat32InFloat32Out", $in) as any; - return $resultPromise; +export function PointerFloat32InFloat32Out($in: number | null): $CancellablePromise { + return $Call.ByName("main.GreetService.PointerFloat32InFloat32Out", $in); } -export function PointerFloat64InFloat64Out($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.PointerFloat64InFloat64Out", $in) as any; - return $resultPromise; +export function PointerFloat64InFloat64Out($in: number | null): $CancellablePromise { + return $Call.ByName("main.GreetService.PointerFloat64InFloat64Out", $in); } -export function PointerMapIntInt($in: { [_: `${number}`]: number } | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.PointerMapIntInt", $in) as any; - return $resultPromise; +export function PointerMapIntInt($in: { [_: `${number}`]: number } | null): $CancellablePromise { + return $Call.ByName("main.GreetService.PointerMapIntInt", $in); } -export function PointerStringInStringOut($in: string | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.PointerStringInStringOut", $in) as any; - return $resultPromise; +export function PointerStringInStringOut($in: string | null): $CancellablePromise { + return $Call.ByName("main.GreetService.PointerStringInStringOut", $in); } -export function StringArrayInputNamedOutput($in: string[]): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.StringArrayInputNamedOutput", $in) as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function StringArrayInputNamedOutput($in: string[]): $CancellablePromise { + return $Call.ByName("main.GreetService.StringArrayInputNamedOutput", $in).then(($result: any) => { return $$createType2($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } -export function StringArrayInputNamedOutputs($in: string[]): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.StringArrayInputNamedOutputs", $in) as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function StringArrayInputNamedOutputs($in: string[]): $CancellablePromise { + return $Call.ByName("main.GreetService.StringArrayInputNamedOutputs", $in).then(($result: any) => { return $$createType2($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } -export function StringArrayInputStringArrayOut($in: string[]): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.StringArrayInputStringArrayOut", $in) as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function StringArrayInputStringArrayOut($in: string[]): $CancellablePromise { + return $Call.ByName("main.GreetService.StringArrayInputStringArrayOut", $in).then(($result: any) => { return $$createType2($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } -export function StringArrayInputStringOut($in: string[]): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.StringArrayInputStringOut", $in) as any; - return $resultPromise; +export function StringArrayInputStringOut($in: string[]): $CancellablePromise { + return $Call.ByName("main.GreetService.StringArrayInputStringOut", $in); } -export function StructInputStructOutput($in: $models.Person): Promise<$models.Person> & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.StructInputStructOutput", $in) as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function StructInputStructOutput($in: $models.Person): $CancellablePromise<$models.Person> { + return $Call.ByName("main.GreetService.StructInputStructOutput", $in).then(($result: any) => { return $$createType3($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } -export function StructPointerInputErrorOutput($in: $models.Person | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.StructPointerInputErrorOutput", $in) as any; - return $resultPromise; +export function StructPointerInputErrorOutput($in: $models.Person | null): $CancellablePromise { + return $Call.ByName("main.GreetService.StructPointerInputErrorOutput", $in); } -export function StructPointerInputStructPointerOutput($in: $models.Person | null): Promise<$models.Person | null> & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.StructPointerInputStructPointerOutput", $in) as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function StructPointerInputStructPointerOutput($in: $models.Person | null): $CancellablePromise<$models.Person | null> { + return $Call.ByName("main.GreetService.StructPointerInputStructPointerOutput", $in).then(($result: any) => { return $$createType4($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } -export function UInt16InUIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.UInt16InUIntOut", $in) as any; - return $resultPromise; +export function UInt16InUIntOut($in: number): $CancellablePromise { + return $Call.ByName("main.GreetService.UInt16InUIntOut", $in); } -export function UInt16PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.UInt16PointerInAndOutput", $in) as any; - return $resultPromise; +export function UInt16PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByName("main.GreetService.UInt16PointerInAndOutput", $in); } -export function UInt32InUIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.UInt32InUIntOut", $in) as any; - return $resultPromise; +export function UInt32InUIntOut($in: number): $CancellablePromise { + return $Call.ByName("main.GreetService.UInt32InUIntOut", $in); } -export function UInt32PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.UInt32PointerInAndOutput", $in) as any; - return $resultPromise; +export function UInt32PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByName("main.GreetService.UInt32PointerInAndOutput", $in); } -export function UInt64InUIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.UInt64InUIntOut", $in) as any; - return $resultPromise; +export function UInt64InUIntOut($in: number): $CancellablePromise { + return $Call.ByName("main.GreetService.UInt64InUIntOut", $in); } -export function UInt64PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.UInt64PointerInAndOutput", $in) as any; - return $resultPromise; +export function UInt64PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByName("main.GreetService.UInt64PointerInAndOutput", $in); } -export function UInt8InUIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.UInt8InUIntOut", $in) as any; - return $resultPromise; +export function UInt8InUIntOut($in: number): $CancellablePromise { + return $Call.ByName("main.GreetService.UInt8InUIntOut", $in); } -export function UInt8PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.UInt8PointerInAndOutput", $in) as any; - return $resultPromise; +export function UInt8PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByName("main.GreetService.UInt8PointerInAndOutput", $in); } -export function UIntInUIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.UIntInUIntOut", $in) as any; - return $resultPromise; +export function UIntInUIntOut($in: number): $CancellablePromise { + return $Call.ByName("main.GreetService.UIntInUIntOut", $in); } -export function UIntPointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.UIntPointerInAndOutput", $in) as any; - return $resultPromise; +export function UIntPointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByName("main.GreetService.UIntPointerInAndOutput", $in); } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_non_pointer_single/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_non_pointer_single/models.ts index 3dd1908e1..cd282c90c 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_non_pointer_single/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_non_pointer_single/models.ts @@ -3,7 +3,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; export class Person { "Name": string; diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_single/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_single/greetservice.ts index eda8ff455..ea2dcf8a6 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_single/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_single/greetservice.ts @@ -8,252 +8,197 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports import * as $models from "./models.js"; -export function ArrayInt($in: number[]): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.ArrayInt", $in) as any; - return $resultPromise; +export function ArrayInt($in: number[]): $CancellablePromise { + return $Call.ByName("main.GreetService.ArrayInt", $in); } -export function BoolInBoolOut($in: boolean): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.BoolInBoolOut", $in) as any; - return $resultPromise; +export function BoolInBoolOut($in: boolean): $CancellablePromise { + return $Call.ByName("main.GreetService.BoolInBoolOut", $in); } -export function Float32InFloat32Out($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Float32InFloat32Out", $in) as any; - return $resultPromise; +export function Float32InFloat32Out($in: number): $CancellablePromise { + return $Call.ByName("main.GreetService.Float32InFloat32Out", $in); } -export function Float64InFloat64Out($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Float64InFloat64Out", $in) as any; - return $resultPromise; +export function Float64InFloat64Out($in: number): $CancellablePromise { + return $Call.ByName("main.GreetService.Float64InFloat64Out", $in); } /** * Greet someone */ -export function Greet(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Greet", name) as any; - return $resultPromise; +export function Greet(name: string): $CancellablePromise { + return $Call.ByName("main.GreetService.Greet", name); } -export function Int16InIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Int16InIntOut", $in) as any; - return $resultPromise; +export function Int16InIntOut($in: number): $CancellablePromise { + return $Call.ByName("main.GreetService.Int16InIntOut", $in); } -export function Int16PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Int16PointerInAndOutput", $in) as any; - return $resultPromise; +export function Int16PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByName("main.GreetService.Int16PointerInAndOutput", $in); } -export function Int32InIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Int32InIntOut", $in) as any; - return $resultPromise; +export function Int32InIntOut($in: number): $CancellablePromise { + return $Call.ByName("main.GreetService.Int32InIntOut", $in); } -export function Int32PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Int32PointerInAndOutput", $in) as any; - return $resultPromise; +export function Int32PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByName("main.GreetService.Int32PointerInAndOutput", $in); } -export function Int64InIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Int64InIntOut", $in) as any; - return $resultPromise; +export function Int64InIntOut($in: number): $CancellablePromise { + return $Call.ByName("main.GreetService.Int64InIntOut", $in); } -export function Int64PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Int64PointerInAndOutput", $in) as any; - return $resultPromise; +export function Int64PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByName("main.GreetService.Int64PointerInAndOutput", $in); } -export function Int8InIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Int8InIntOut", $in) as any; - return $resultPromise; +export function Int8InIntOut($in: number): $CancellablePromise { + return $Call.ByName("main.GreetService.Int8InIntOut", $in); } -export function Int8PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Int8PointerInAndOutput", $in) as any; - return $resultPromise; +export function Int8PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByName("main.GreetService.Int8PointerInAndOutput", $in); } -export function IntInIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.IntInIntOut", $in) as any; - return $resultPromise; +export function IntInIntOut($in: number): $CancellablePromise { + return $Call.ByName("main.GreetService.IntInIntOut", $in); } -export function IntPointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.IntPointerInAndOutput", $in) as any; - return $resultPromise; +export function IntPointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByName("main.GreetService.IntPointerInAndOutput", $in); } -export function IntPointerInputNamedOutputs($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.IntPointerInputNamedOutputs", $in) as any; - return $resultPromise; +export function IntPointerInputNamedOutputs($in: number | null): $CancellablePromise { + return $Call.ByName("main.GreetService.IntPointerInputNamedOutputs", $in); } -export function MapIntInt($in: { [_: `${number}`]: number }): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.MapIntInt", $in) as any; - return $resultPromise; +export function MapIntInt($in: { [_: `${number}`]: number }): $CancellablePromise { + return $Call.ByName("main.GreetService.MapIntInt", $in); } -export function MapIntIntPointer($in: { [_: `${number}`]: number | null }): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.MapIntIntPointer", $in) as any; - return $resultPromise; +export function MapIntIntPointer($in: { [_: `${number}`]: number | null }): $CancellablePromise { + return $Call.ByName("main.GreetService.MapIntIntPointer", $in); } -export function MapIntSliceInt($in: { [_: `${number}`]: number[] }): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.MapIntSliceInt", $in) as any; - return $resultPromise; +export function MapIntSliceInt($in: { [_: `${number}`]: number[] }): $CancellablePromise { + return $Call.ByName("main.GreetService.MapIntSliceInt", $in); } -export function MapIntSliceIntInMapIntSliceIntOut($in: { [_: `${number}`]: number[] }): Promise<{ [_: `${number}`]: number[] }> & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.MapIntSliceIntInMapIntSliceIntOut", $in) as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function MapIntSliceIntInMapIntSliceIntOut($in: { [_: `${number}`]: number[] }): $CancellablePromise<{ [_: `${number}`]: number[] }> { + return $Call.ByName("main.GreetService.MapIntSliceIntInMapIntSliceIntOut", $in).then(($result: any) => { return $$createType1($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } -export function NoInputsStringOut(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.NoInputsStringOut") as any; - return $resultPromise; +export function NoInputsStringOut(): $CancellablePromise { + return $Call.ByName("main.GreetService.NoInputsStringOut"); } -export function PointerBoolInBoolOut($in: boolean | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.PointerBoolInBoolOut", $in) as any; - return $resultPromise; +export function PointerBoolInBoolOut($in: boolean | null): $CancellablePromise { + return $Call.ByName("main.GreetService.PointerBoolInBoolOut", $in); } -export function PointerFloat32InFloat32Out($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.PointerFloat32InFloat32Out", $in) as any; - return $resultPromise; +export function PointerFloat32InFloat32Out($in: number | null): $CancellablePromise { + return $Call.ByName("main.GreetService.PointerFloat32InFloat32Out", $in); } -export function PointerFloat64InFloat64Out($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.PointerFloat64InFloat64Out", $in) as any; - return $resultPromise; +export function PointerFloat64InFloat64Out($in: number | null): $CancellablePromise { + return $Call.ByName("main.GreetService.PointerFloat64InFloat64Out", $in); } -export function PointerMapIntInt($in: { [_: `${number}`]: number } | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.PointerMapIntInt", $in) as any; - return $resultPromise; +export function PointerMapIntInt($in: { [_: `${number}`]: number } | null): $CancellablePromise { + return $Call.ByName("main.GreetService.PointerMapIntInt", $in); } -export function PointerStringInStringOut($in: string | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.PointerStringInStringOut", $in) as any; - return $resultPromise; +export function PointerStringInStringOut($in: string | null): $CancellablePromise { + return $Call.ByName("main.GreetService.PointerStringInStringOut", $in); } -export function StringArrayInputNamedOutput($in: string[]): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.StringArrayInputNamedOutput", $in) as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function StringArrayInputNamedOutput($in: string[]): $CancellablePromise { + return $Call.ByName("main.GreetService.StringArrayInputNamedOutput", $in).then(($result: any) => { return $$createType2($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } -export function StringArrayInputNamedOutputs($in: string[]): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.StringArrayInputNamedOutputs", $in) as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function StringArrayInputNamedOutputs($in: string[]): $CancellablePromise { + return $Call.ByName("main.GreetService.StringArrayInputNamedOutputs", $in).then(($result: any) => { return $$createType2($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } -export function StringArrayInputStringArrayOut($in: string[]): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.StringArrayInputStringArrayOut", $in) as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function StringArrayInputStringArrayOut($in: string[]): $CancellablePromise { + return $Call.ByName("main.GreetService.StringArrayInputStringArrayOut", $in).then(($result: any) => { return $$createType2($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } -export function StringArrayInputStringOut($in: string[]): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.StringArrayInputStringOut", $in) as any; - return $resultPromise; +export function StringArrayInputStringOut($in: string[]): $CancellablePromise { + return $Call.ByName("main.GreetService.StringArrayInputStringOut", $in); } -export function StructInputStructOutput($in: $models.Person): Promise<$models.Person> & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.StructInputStructOutput", $in) as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function StructInputStructOutput($in: $models.Person): $CancellablePromise<$models.Person> { + return $Call.ByName("main.GreetService.StructInputStructOutput", $in).then(($result: any) => { return $$createType3($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } -export function StructPointerInputErrorOutput($in: $models.Person | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.StructPointerInputErrorOutput", $in) as any; - return $resultPromise; +export function StructPointerInputErrorOutput($in: $models.Person | null): $CancellablePromise { + return $Call.ByName("main.GreetService.StructPointerInputErrorOutput", $in); } -export function StructPointerInputStructPointerOutput($in: $models.Person | null): Promise<$models.Person | null> & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.StructPointerInputStructPointerOutput", $in) as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function StructPointerInputStructPointerOutput($in: $models.Person | null): $CancellablePromise<$models.Person | null> { + return $Call.ByName("main.GreetService.StructPointerInputStructPointerOutput", $in).then(($result: any) => { return $$createType4($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } -export function UInt16InUIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.UInt16InUIntOut", $in) as any; - return $resultPromise; +export function UInt16InUIntOut($in: number): $CancellablePromise { + return $Call.ByName("main.GreetService.UInt16InUIntOut", $in); } -export function UInt16PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.UInt16PointerInAndOutput", $in) as any; - return $resultPromise; +export function UInt16PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByName("main.GreetService.UInt16PointerInAndOutput", $in); } -export function UInt32InUIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.UInt32InUIntOut", $in) as any; - return $resultPromise; +export function UInt32InUIntOut($in: number): $CancellablePromise { + return $Call.ByName("main.GreetService.UInt32InUIntOut", $in); } -export function UInt32PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.UInt32PointerInAndOutput", $in) as any; - return $resultPromise; +export function UInt32PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByName("main.GreetService.UInt32PointerInAndOutput", $in); } -export function UInt64InUIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.UInt64InUIntOut", $in) as any; - return $resultPromise; +export function UInt64InUIntOut($in: number): $CancellablePromise { + return $Call.ByName("main.GreetService.UInt64InUIntOut", $in); } -export function UInt64PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.UInt64PointerInAndOutput", $in) as any; - return $resultPromise; +export function UInt64PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByName("main.GreetService.UInt64PointerInAndOutput", $in); } -export function UInt8InUIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.UInt8InUIntOut", $in) as any; - return $resultPromise; +export function UInt8InUIntOut($in: number): $CancellablePromise { + return $Call.ByName("main.GreetService.UInt8InUIntOut", $in); } -export function UInt8PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.UInt8PointerInAndOutput", $in) as any; - return $resultPromise; +export function UInt8PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByName("main.GreetService.UInt8PointerInAndOutput", $in); } -export function UIntInUIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.UIntInUIntOut", $in) as any; - return $resultPromise; +export function UIntInUIntOut($in: number): $CancellablePromise { + return $Call.ByName("main.GreetService.UIntInUIntOut", $in); } -export function UIntPointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.UIntPointerInAndOutput", $in) as any; - return $resultPromise; +export function UIntPointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByName("main.GreetService.UIntPointerInAndOutput", $in); } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_single/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_single/models.ts index 3dd1908e1..cd282c90c 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_single/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_single/models.ts @@ -3,7 +3,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; export class Person { "Name": string; diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single/greetservice.ts index e6dca1f04..6a6a881dc 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single/greetservice.ts @@ -8,12 +8,11 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; /** * Greet someone */ -export function Greet(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Greet", name) as any; - return $resultPromise; +export function Greet(name: string): $CancellablePromise { + return $Call.ByName("main.GreetService.Greet", name); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_function/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_function/greetservice.ts index e6dca1f04..6a6a881dc 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_function/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_function/greetservice.ts @@ -8,12 +8,11 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; /** * Greet someone */ -export function Greet(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Greet", name) as any; - return $resultPromise; +export function Greet(name: string): $CancellablePromise { + return $Call.ByName("main.GreetService.Greet", name); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/greetservice.ts index 49c20faa3..1a2ffb266 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/greetservice.ts @@ -8,7 +8,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,21 +17,17 @@ import * as $models from "./models.js"; /** * Greet does XYZ */ -export function Greet(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Greet", name) as any; - return $resultPromise; +export function Greet(name: string): $CancellablePromise { + return $Call.ByName("main.GreetService.Greet", name); } /** * NewPerson creates a new person */ -export function NewPerson(name: string): Promise<$models.Person | null> & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.NewPerson", name) as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function NewPerson(name: string): $CancellablePromise<$models.Person | null> { + return $Call.ByName("main.GreetService.NewPerson", name).then(($result: any) => { return $$createType1($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/models.ts index 4442874d2..f6eee9de8 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/models.ts @@ -3,7 +3,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/services/models.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/services/models.ts index eb9c1b6bf..a4be6e904 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/services/models.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/services/models.ts @@ -3,7 +3,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Create as $Create} from "/wails/runtime.js"; +import { Create as $Create } from "/wails/runtime.js"; export class Address { "Street": string; diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/services/otherservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/services/otherservice.ts index 641595e74..554897ea4 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/services/otherservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=false/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/services/otherservice.ts @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -18,13 +18,10 @@ import * as $models from "./models.js"; /** * Yay does this and that */ -export function Yay(): Promise<$models.Address | null> & { cancel(): void } { - let $resultPromise = $Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/services.OtherService.Yay") as any; - let $typingPromise = $resultPromise.then(($result: any) => { +export function Yay(): $CancellablePromise<$models.Address | null> { + return $Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/services.OtherService.Yay").then(($result: any) => { return $$createType1($result); - }) as any; - $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise); - return $typingPromise; + }); } // Private type creation functions diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.ts index 8f77379d9..c371520b0 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.ts @@ -8,7 +8,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -21,41 +21,35 @@ import * as $models from "./models.js"; /** * Get someone. */ -export function Get(aliasValue: $models.Alias): Promise<$models.Person> & { cancel(): void } { - let $resultPromise = $Call.ByID(1928502664, aliasValue) as any; - return $resultPromise; +export function Get(aliasValue: $models.Alias): $CancellablePromise<$models.Person> { + return $Call.ByID(1928502664, aliasValue); } /** * Apparently, aliases are all the rage right now. */ -export function GetButAliased(p: $models.AliasedPerson): Promise<$models.StrangelyAliasedPerson> & { cancel(): void } { - let $resultPromise = $Call.ByID(1896499664, p) as any; - return $resultPromise; +export function GetButAliased(p: $models.AliasedPerson): $CancellablePromise<$models.StrangelyAliasedPerson> { + return $Call.ByID(1896499664, p); } /** * Get someone quite different. */ -export function GetButDifferent(): Promise<$models.GenericPerson> & { cancel(): void } { - let $resultPromise = $Call.ByID(2240931744) as any; - return $resultPromise; +export function GetButDifferent(): $CancellablePromise<$models.GenericPerson> { + return $Call.ByID(2240931744); } -export function GetButForeignPrivateAlias(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(643456960) as any; - return $resultPromise; +export function GetButForeignPrivateAlias(): $CancellablePromise { + return $Call.ByID(643456960); } -export function GetButGenericAliases(): Promise<$models.AliasGroup> & { cancel(): void } { - let $resultPromise = $Call.ByID(914093800) as any; - return $resultPromise; +export function GetButGenericAliases(): $CancellablePromise<$models.AliasGroup> { + return $Call.ByID(914093800); } /** * Greet a lot of unusual things. */ -export function Greet($0: $models.EmptyAliasStruct, $1: $models.EmptyStruct): Promise<$models.AliasStruct> & { cancel(): void } { - let $resultPromise = $Call.ByID(1411160069, $0, $1) as any; - return $resultPromise; +export function Greet($0: $models.EmptyAliasStruct, $1: $models.EmptyStruct): $CancellablePromise<$models.AliasStruct> { + return $Call.ByID(1411160069, $0, $1); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service7.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service7.ts index d08868a1f..5cba569c9 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service7.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service7.ts @@ -3,9 +3,8 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; -export function TestMethod(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(2241101727) as any; - return $resultPromise; +export function TestMethod(): $CancellablePromise { + return $Call.ByID(2241101727); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service9.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service9.ts index 0b877e248..dc425cfd5 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service9.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service9.ts @@ -3,9 +3,8 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; -export function TestMethod2(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1556848345) as any; - return $resultPromise; +export function TestMethod2(): $CancellablePromise { + return $Call.ByID(1556848345); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_json/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_json/greetservice.ts index 32b85fccb..a5334fce3 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_json/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_json/greetservice.ts @@ -8,7 +8,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,7 +17,6 @@ import * as $models from "./models.js"; /** * Greet does XYZ */ -export function Greet(person: $models.Person, emb: $models.Embedded1): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1411160069, person, emb) as any; - return $resultPromise; +export function Greet(person: $models.Person, emb: $models.Embedded1): $CancellablePromise { + return $Call.ByID(1411160069, person, emb); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_method/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_method/greetservice.ts index 05fa84c0c..99ffd566f 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_method/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_method/greetservice.ts @@ -8,7 +8,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -19,7 +19,6 @@ import * as $models from "./models.js"; * It has a multiline doc comment * The comment has even some * / traps!! */ -export function Greet(str: string, people: $models.Person[] | null, $2: {"AnotherCount": number, "AnotherOne": $models.Person | null}, assoc: { [_: `${number}`]: boolean | null } | null, $4: (number | null)[] | null, ...other: string[]): Promise<[$models.Person, any, number[] | null]> & { cancel(): void } { - let $resultPromise = $Call.ByID(1411160069, str, people, $2, assoc, $4, other) as any; - return $resultPromise; +export function Greet(str: string, people: $models.Person[] | null, $2: {"AnotherCount": number, "AnotherOne": $models.Person | null}, assoc: { [_: `${number}`]: boolean | null } | null, $4: (number | null)[] | null, ...other: string[]): $CancellablePromise<[$models.Person, any, number[] | null]> { + return $Call.ByID(1411160069, str, people, $2, assoc, $4, other); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_imports/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_imports/greetservice.ts index 3f91922f1..e6a04adf3 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_imports/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_imports/greetservice.ts @@ -8,7 +8,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,7 +17,6 @@ import * as $models from "./models.js"; /** * Make a cycle. */ -export function MakeCycles(): Promise<[$models.StructA, $models.StructC]> & { cancel(): void } { - let $resultPromise = $Call.ByID(440020721) as any; - return $resultPromise; +export function MakeCycles(): $CancellablePromise<[$models.StructA, $models.StructC]> { + return $Call.ByID(440020721); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_types/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_types/greetservice.ts index 435914299..965a057ca 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_types/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_types/greetservice.ts @@ -8,7 +8,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,7 +17,6 @@ import * as $models from "./models.js"; /** * Make a cycle. */ -export function MakeCycles(): Promise<[$models.Cyclic, $models.GenericCyclic<$models.GenericCyclic>]> & { cancel(): void } { - let $resultPromise = $Call.ByID(440020721) as any; - return $resultPromise; +export function MakeCycles(): $CancellablePromise<[$models.Cyclic, $models.GenericCyclic<$models.GenericCyclic>]> { + return $Call.ByID(440020721); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/internalservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/internalservice.ts index e9ce7b0da..9d2a673d6 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/internalservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/internalservice.ts @@ -8,13 +8,12 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports import * as $models from "./models.js"; -export function Method($0: $models.InternalModel): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(538079117, $0) as any; - return $resultPromise; +export function Method($0: $models.InternalModel): $CancellablePromise { + return $Call.ByID(538079117, $0); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/service.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/service.ts index 6f1ab3204..e60cbea0c 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/service.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/service.ts @@ -3,20 +3,18 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports import * as otherpackage$0 from "./otherpackage/models.js"; -function InternalMethod($0: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(3518775569, $0) as any; - return $resultPromise; +function InternalMethod($0: string): $CancellablePromise { + return $Call.ByID(3518775569, $0); } -export function VisibleMethod($0: otherpackage$0.Dummy): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(474018228, $0) as any; - return $resultPromise; +export function VisibleMethod($0: otherpackage$0.Dummy): $CancellablePromise { + return $Call.ByID(474018228, $0); } export async function CustomMethod(arg: string): Promise { diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/unexportedservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/unexportedservice.ts index fa074e92c..57d7f73be 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/unexportedservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/unexportedservice.ts @@ -8,13 +8,12 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports import * as $models from "./models.js"; -export function Method($0: $models.unexportedModel): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(37626172, $0) as any; - return $resultPromise; +export function Method($0: $models.unexportedModel): $CancellablePromise { + return $Call.ByID(37626172, $0); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/embedded_interface/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/embedded_interface/greetservice.ts index 6189c0359..5a3127774 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/embedded_interface/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/embedded_interface/greetservice.ts @@ -8,45 +8,40 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; /** * Comment 1. */ -export function Method1(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(841558284) as any; - return $resultPromise; +export function Method1(): $CancellablePromise { + return $Call.ByID(841558284); } /** * Comment 2. */ -export function Method2(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(891891141) as any; - return $resultPromise; +export function Method2(): $CancellablePromise { + return $Call.ByID(891891141); } /** * Comment 3a. * Comment 3b. */ -export function Method3(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(875113522) as any; - return $resultPromise; +export function Method3(): $CancellablePromise { + return $Call.ByID(875113522); } /** * Comment 4. */ -export function Method4(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(791225427) as any; - return $resultPromise; +export function Method4(): $CancellablePromise { + return $Call.ByID(791225427); } /** * Comment 5. */ -export function Method5(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(774447808) as any; - return $resultPromise; +export function Method5(): $CancellablePromise { + return $Call.ByID(774447808); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/enum/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/enum/greetservice.ts index 561d0b5c4..eda1dd8d0 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/enum/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/enum/greetservice.ts @@ -8,7 +8,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,15 +17,13 @@ import * as $models from "./models.js"; /** * Greet does XYZ */ -export function Greet(name: string, title: $models.Title): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1411160069, name, title) as any; - return $resultPromise; +export function Greet(name: string, title: $models.Title): $CancellablePromise { + return $Call.ByID(1411160069, name, title); } /** * NewPerson creates a new person */ -export function NewPerson(name: string): Promise<$models.Person | null> & { cancel(): void } { - let $resultPromise = $Call.ByID(1661412647, name) as any; - return $resultPromise; +export function NewPerson(name: string): $CancellablePromise<$models.Person | null> { + return $Call.ByID(1661412647, name); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/enum_from_imported_package/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/enum_from_imported_package/greetservice.ts index 66ea965d5..ade2383a0 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/enum_from_imported_package/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/enum_from_imported_package/greetservice.ts @@ -8,7 +8,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,7 +17,6 @@ import * as services$0 from "./services/models.js"; /** * Greet does XYZ */ -export function Greet(name: string, title: services$0.Title): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1411160069, name, title) as any; - return $resultPromise; +export function Greet(name: string, title: services$0.Title): $CancellablePromise { + return $Call.ByID(1411160069, name, title); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/greetservice.ts index c649bfb82..8519667d5 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/greetservice.ts @@ -8,7 +8,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,15 +17,13 @@ import * as $models from "./models.js"; /** * Greet does XYZ */ -export function Greet(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1411160069, name) as any; - return $resultPromise; +export function Greet(name: string): $CancellablePromise { + return $Call.ByID(1411160069, name); } /** * NewPerson creates a new person */ -export function NewPerson(name: string): Promise<$models.Person | null> & { cancel(): void } { - let $resultPromise = $Call.ByID(1661412647, name) as any; - return $resultPromise; +export function NewPerson(name: string): $CancellablePromise<$models.Person | null> { + return $Call.ByID(1661412647, name); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/services/otherservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/services/otherservice.ts index 5fb794ba2..4cb206cc6 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/services/otherservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/services/otherservice.ts @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -18,7 +18,6 @@ import * as $models from "./models.js"; /** * Yay does this and that */ -export function Yay(): Promise<$models.Address | null> & { cancel(): void } { - let $resultPromise = $Call.ByID(2007737399) as any; - return $resultPromise; +export function Yay(): $CancellablePromise<$models.Address | null> { + return $Call.ByID(2007737399); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/greetservice.ts index c649bfb82..8519667d5 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/greetservice.ts @@ -8,7 +8,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,15 +17,13 @@ import * as $models from "./models.js"; /** * Greet does XYZ */ -export function Greet(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1411160069, name) as any; - return $resultPromise; +export function Greet(name: string): $CancellablePromise { + return $Call.ByID(1411160069, name); } /** * NewPerson creates a new person */ -export function NewPerson(name: string): Promise<$models.Person | null> & { cancel(): void } { - let $resultPromise = $Call.ByID(1661412647, name) as any; - return $resultPromise; +export function NewPerson(name: string): $CancellablePromise<$models.Person | null> { + return $Call.ByID(1661412647, name); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/services/other/otherservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/services/other/otherservice.ts index 23b854905..8879fcfa2 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/services/other/otherservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/services/other/otherservice.ts @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -18,7 +18,6 @@ import * as $models from "./models.js"; /** * Yay does this and that */ -export function Yay(): Promise<$models.Address | null> & { cancel(): void } { - let $resultPromise = $Call.ByID(2447353446) as any; - return $resultPromise; +export function Yay(): $CancellablePromise<$models.Address | null> { + return $Call.ByID(2447353446); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_multiple_files/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_multiple_files/greetservice.ts index 0d68fbe86..34c4d151a 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_multiple_files/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_multiple_files/greetservice.ts @@ -3,9 +3,8 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; -export function Greet(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1411160069, name) as any; - return $resultPromise; +export function Greet(name: string): $CancellablePromise { + return $Call.ByID(1411160069, name); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single/greetservice.ts index dc0a1a1b8..8a2cb7a70 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single/greetservice.ts @@ -8,12 +8,11 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; /** * Greet someone */ -export function Greet(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1411160069, name) as any; - return $resultPromise; +export function Greet(name: string): $CancellablePromise { + return $Call.ByID(1411160069, name); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_context/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_context/greetservice.ts index 70b209eeb..f9b8d87e2 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_context/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_context/greetservice.ts @@ -8,20 +8,18 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; /** * Greet someone */ -export function Greet(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1411160069, name) as any; - return $resultPromise; +export function Greet(name: string): $CancellablePromise { + return $Call.ByID(1411160069, name); } /** * Greet someone */ -export function GreetWithContext(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1310150960, name) as any; - return $resultPromise; +export function GreetWithContext(name: string): $CancellablePromise { + return $Call.ByID(1310150960, name); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_internal/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_internal/greetservice.ts index dc0a1a1b8..8a2cb7a70 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_internal/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_internal/greetservice.ts @@ -8,12 +8,11 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; /** * Greet someone */ -export function Greet(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1411160069, name) as any; - return $resultPromise; +export function Greet(name: string): $CancellablePromise { + return $Call.ByID(1411160069, name); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/service.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/service.ts index 8669b92be..50d2f6d72 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/service.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/service.ts @@ -3,13 +3,12 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports import * as $models from "./models.js"; -export function Method(): Promise<$models.Maps<$models.PointerTextMarshaler, number, number, $models.ValueTextMarshaler, $models.PointerTextMarshaler | null, $models.ValueTextMarshaler, $models.StringType, $models.ValueTextMarshaler, $models.PointerTextMarshaler | null>> & { cancel(): void } { - let $resultPromise = $Call.ByID(4021345184) as any; - return $resultPromise; +export function Method(): $CancellablePromise<$models.Maps<$models.PointerTextMarshaler, number, number, $models.ValueTextMarshaler, $models.PointerTextMarshaler | null, $models.ValueTextMarshaler, $models.StringType, $models.ValueTextMarshaler, $models.PointerTextMarshaler | null>> { + return $Call.ByID(4021345184); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/marshalers/service.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/marshalers/service.ts index 105e077e3..b175ebe96 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/marshalers/service.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/marshalers/service.ts @@ -3,13 +3,12 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports import * as $models from "./models.js"; -export function Method(): Promise<$models.Data> & { cancel(): void } { - let $resultPromise = $Call.ByID(4021345184) as any; - return $resultPromise; +export function Method(): $CancellablePromise<$models.Data> { + return $Call.ByID(4021345184); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/other/othermethods.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/other/othermethods.ts index a02cf4a98..c2fb7bc6a 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/other/othermethods.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/other/othermethods.ts @@ -8,12 +8,11 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; /** * LikeThisOtherOne does nothing as well, but is different. */ -export function LikeThisOtherOne(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(3606939272) as any; - return $resultPromise; +export function LikeThisOtherOne(): $CancellablePromise { + return $Call.ByID(3606939272); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/somemethods.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/somemethods.ts index 81f2b2430..4f623616d 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/somemethods.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/somemethods.ts @@ -8,7 +8,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,15 +17,13 @@ import * as $models from "./models.js"; /** * LikeThisOne is an example method that does nothing. */ -export function LikeThisOne(): Promise<[$models.Person, $models.HowDifferent, $models.PrivatePerson]> & { cancel(): void } { - let $resultPromise = $Call.ByID(2124352079) as any; - return $resultPromise; +export function LikeThisOne(): $CancellablePromise<[$models.Person, $models.HowDifferent, $models.PrivatePerson]> { + return $Call.ByID(2124352079); } /** * LikeThisOtherOne does nothing as well, but is different. */ -export function LikeThisOtherOne(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(4281222271) as any; - return $resultPromise; +export function LikeThisOtherOne(): $CancellablePromise { + return $Call.ByID(4281222271); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedother.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedother.ts index 5ee6ff07e..d155adc30 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedother.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedother.ts @@ -8,12 +8,11 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; /** * LikeThisOtherOne does nothing as well, but is different. */ -export function LikeThisOtherOne(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(3566862802) as any; - return $resultPromise; +export function LikeThisOtherOne(): $CancellablePromise { + return $Call.ByID(3566862802); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedservice.ts index f757ceeae..65098990f 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedservice.ts @@ -8,7 +8,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,15 +17,13 @@ import * as nobindingshere$0 from "../no_bindings_here/models.js"; /** * LikeThisOne is an example method that does nothing. */ -export function LikeThisOne(): Promise<[nobindingshere$0.Person, nobindingshere$0.HowDifferent, nobindingshere$0.PrivatePerson]> & { cancel(): void } { - let $resultPromise = $Call.ByID(2590614085) as any; - return $resultPromise; +export function LikeThisOne(): $CancellablePromise<[nobindingshere$0.Person, nobindingshere$0.HowDifferent, nobindingshere$0.PrivatePerson]> { + return $Call.ByID(2590614085); } /** * LikeThisOtherOne does nothing as well, but is different. */ -export function LikeThisOtherOne(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(773650321) as any; - return $resultPromise; +export function LikeThisOtherOne(): $CancellablePromise { + return $Call.ByID(773650321); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/greetservice.ts index 2f297e449..76375250e 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/greetservice.ts @@ -8,12 +8,11 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; /** * Greet someone */ -export function Greet($0: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1411160069, $0) as any; - return $resultPromise; +export function Greet($0: string): $CancellablePromise { + return $Call.ByID(1411160069, $0); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/greetservice.ts index 0d68fbe86..34c4d151a 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/greetservice.ts @@ -3,9 +3,8 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; -export function Greet(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1411160069, name) as any; - return $resultPromise; +export function Greet(name: string): $CancellablePromise { + return $Call.ByID(1411160069, name); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/otherservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/otherservice.ts index 5cc4ea0ff..d27e71304 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/otherservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/otherservice.ts @@ -3,9 +3,8 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; -export function Hello(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(4249972365) as any; - return $resultPromise; +export function Hello(): $CancellablePromise { + return $Call.ByID(4249972365); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/greetservice.ts index 0d68fbe86..34c4d151a 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/greetservice.ts @@ -3,9 +3,8 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; -export function Greet(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1411160069, name) as any; - return $resultPromise; +export function Greet(name: string): $CancellablePromise { + return $Call.ByID(1411160069, name); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/otherservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/otherservice.ts index 5cc4ea0ff..d27e71304 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/otherservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/otherservice.ts @@ -3,9 +3,8 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; -export function Hello(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(4249972365) as any; - return $resultPromise; +export function Hello(): $CancellablePromise { + return $Call.ByID(4249972365); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/greetservice.ts index c649bfb82..8519667d5 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/greetservice.ts @@ -8,7 +8,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,15 +17,13 @@ import * as $models from "./models.js"; /** * Greet does XYZ */ -export function Greet(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1411160069, name) as any; - return $resultPromise; +export function Greet(name: string): $CancellablePromise { + return $Call.ByID(1411160069, name); } /** * NewPerson creates a new person */ -export function NewPerson(name: string): Promise<$models.Person | null> & { cancel(): void } { - let $resultPromise = $Call.ByID(1661412647, name) as any; - return $resultPromise; +export function NewPerson(name: string): $CancellablePromise<$models.Person | null> { + return $Call.ByID(1661412647, name); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/services/otherservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/services/otherservice.ts index d8ddc9193..50e62daa4 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/services/otherservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/services/otherservice.ts @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -18,7 +18,6 @@ import * as $models from "./models.js"; /** * Yay does this and that */ -export function Yay(): Promise<$models.Address | null> & { cancel(): void } { - let $resultPromise = $Call.ByID(3568225479) as any; - return $resultPromise; +export function Yay(): $CancellablePromise<$models.Address | null> { + return $Call.ByID(3568225479); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_non_pointer_single/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_non_pointer_single/greetservice.ts index 59d1e0f13..ef5015467 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_non_pointer_single/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_non_pointer_single/greetservice.ts @@ -8,226 +8,183 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports import * as $models from "./models.js"; -export function ArrayInt($in: number[]): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(3862002418, $in) as any; - return $resultPromise; +export function ArrayInt($in: number[]): $CancellablePromise { + return $Call.ByID(3862002418, $in); } -export function BoolInBoolOut($in: boolean): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(2424639793, $in) as any; - return $resultPromise; +export function BoolInBoolOut($in: boolean): $CancellablePromise { + return $Call.ByID(2424639793, $in); } -export function Float32InFloat32Out($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(3132595881, $in) as any; - return $resultPromise; +export function Float32InFloat32Out($in: number): $CancellablePromise { + return $Call.ByID(3132595881, $in); } -export function Float64InFloat64Out($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(2182412247, $in) as any; - return $resultPromise; +export function Float64InFloat64Out($in: number): $CancellablePromise { + return $Call.ByID(2182412247, $in); } /** * Greet someone */ -export function Greet(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1411160069, name) as any; - return $resultPromise; +export function Greet(name: string): $CancellablePromise { + return $Call.ByID(1411160069, name); } -export function Int16InIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(3306292566, $in) as any; - return $resultPromise; +export function Int16InIntOut($in: number): $CancellablePromise { + return $Call.ByID(3306292566, $in); } -export function Int16PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1754277916, $in) as any; - return $resultPromise; +export function Int16PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByID(1754277916, $in); } -export function Int32InIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1909469092, $in) as any; - return $resultPromise; +export function Int32InIntOut($in: number): $CancellablePromise { + return $Call.ByID(1909469092, $in); } -export function Int32PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(4251088558, $in) as any; - return $resultPromise; +export function Int32PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByID(4251088558, $in); } -export function Int64InIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1343888303, $in) as any; - return $resultPromise; +export function Int64InIntOut($in: number): $CancellablePromise { + return $Call.ByID(1343888303, $in); } -export function Int64PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(2205561041, $in) as any; - return $resultPromise; +export function Int64PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByID(2205561041, $in); } -export function Int8InIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(572240879, $in) as any; - return $resultPromise; +export function Int8InIntOut($in: number): $CancellablePromise { + return $Call.ByID(572240879, $in); } -export function Int8PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(2189402897, $in) as any; - return $resultPromise; +export function Int8PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByID(2189402897, $in); } -export function IntInIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(642881729, $in) as any; - return $resultPromise; +export function IntInIntOut($in: number): $CancellablePromise { + return $Call.ByID(642881729, $in); } -export function IntPointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1066151743, $in) as any; - return $resultPromise; +export function IntPointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByID(1066151743, $in); } -export function IntPointerInputNamedOutputs($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(2718999663, $in) as any; - return $resultPromise; +export function IntPointerInputNamedOutputs($in: number | null): $CancellablePromise { + return $Call.ByID(2718999663, $in); } -export function MapIntInt($in: { [_: `${number}`]: number } | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(2386486356, $in) as any; - return $resultPromise; +export function MapIntInt($in: { [_: `${number}`]: number } | null): $CancellablePromise { + return $Call.ByID(2386486356, $in); } -export function MapIntIntPointer($in: { [_: `${number}`]: number | null } | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(2163571325, $in) as any; - return $resultPromise; +export function MapIntIntPointer($in: { [_: `${number}`]: number | null } | null): $CancellablePromise { + return $Call.ByID(2163571325, $in); } -export function MapIntSliceInt($in: { [_: `${number}`]: number[] | null } | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(2900172572, $in) as any; - return $resultPromise; +export function MapIntSliceInt($in: { [_: `${number}`]: number[] | null } | null): $CancellablePromise { + return $Call.ByID(2900172572, $in); } -export function MapIntSliceIntInMapIntSliceIntOut($in: { [_: `${number}`]: number[] | null } | null): Promise<{ [_: `${number}`]: number[] | null } | null> & { cancel(): void } { - let $resultPromise = $Call.ByID(881980169, $in) as any; - return $resultPromise; +export function MapIntSliceIntInMapIntSliceIntOut($in: { [_: `${number}`]: number[] | null } | null): $CancellablePromise<{ [_: `${number}`]: number[] | null } | null> { + return $Call.ByID(881980169, $in); } -export function NoInputsStringOut(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1075577233) as any; - return $resultPromise; +export function NoInputsStringOut(): $CancellablePromise { + return $Call.ByID(1075577233); } -export function PointerBoolInBoolOut($in: boolean | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(3589606958, $in) as any; - return $resultPromise; +export function PointerBoolInBoolOut($in: boolean | null): $CancellablePromise { + return $Call.ByID(3589606958, $in); } -export function PointerFloat32InFloat32Out($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(224675106, $in) as any; - return $resultPromise; +export function PointerFloat32InFloat32Out($in: number | null): $CancellablePromise { + return $Call.ByID(224675106, $in); } -export function PointerFloat64InFloat64Out($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(2124953624, $in) as any; - return $resultPromise; +export function PointerFloat64InFloat64Out($in: number | null): $CancellablePromise { + return $Call.ByID(2124953624, $in); } -export function PointerMapIntInt($in: { [_: `${number}`]: number } | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(3516977899, $in) as any; - return $resultPromise; +export function PointerMapIntInt($in: { [_: `${number}`]: number } | null): $CancellablePromise { + return $Call.ByID(3516977899, $in); } -export function PointerStringInStringOut($in: string | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(229603958, $in) as any; - return $resultPromise; +export function PointerStringInStringOut($in: string | null): $CancellablePromise { + return $Call.ByID(229603958, $in); } -export function StringArrayInputNamedOutput($in: string[] | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(3678582682, $in) as any; - return $resultPromise; +export function StringArrayInputNamedOutput($in: string[] | null): $CancellablePromise { + return $Call.ByID(3678582682, $in); } -export function StringArrayInputNamedOutputs($in: string[] | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(319259595, $in) as any; - return $resultPromise; +export function StringArrayInputNamedOutputs($in: string[] | null): $CancellablePromise { + return $Call.ByID(319259595, $in); } -export function StringArrayInputStringArrayOut($in: string[] | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(383995060, $in) as any; - return $resultPromise; +export function StringArrayInputStringArrayOut($in: string[] | null): $CancellablePromise { + return $Call.ByID(383995060, $in); } -export function StringArrayInputStringOut($in: string[] | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1091960237, $in) as any; - return $resultPromise; +export function StringArrayInputStringOut($in: string[] | null): $CancellablePromise { + return $Call.ByID(1091960237, $in); } -export function StructInputStructOutput($in: $models.Person): Promise<$models.Person> & { cancel(): void } { - let $resultPromise = $Call.ByID(3835643147, $in) as any; - return $resultPromise; +export function StructInputStructOutput($in: $models.Person): $CancellablePromise<$models.Person> { + return $Call.ByID(3835643147, $in); } -export function StructPointerInputErrorOutput($in: $models.Person | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(2447692557, $in) as any; - return $resultPromise; +export function StructPointerInputErrorOutput($in: $models.Person | null): $CancellablePromise { + return $Call.ByID(2447692557, $in); } -export function StructPointerInputStructPointerOutput($in: $models.Person | null): Promise<$models.Person | null> & { cancel(): void } { - let $resultPromise = $Call.ByID(2943477349, $in) as any; - return $resultPromise; +export function StructPointerInputStructPointerOutput($in: $models.Person | null): $CancellablePromise<$models.Person | null> { + return $Call.ByID(2943477349, $in); } -export function UInt16InUIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(3401034892, $in) as any; - return $resultPromise; +export function UInt16InUIntOut($in: number): $CancellablePromise { + return $Call.ByID(3401034892, $in); } -export function UInt16PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1236957573, $in) as any; - return $resultPromise; +export function UInt16PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByID(1236957573, $in); } -export function UInt32InUIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1160383782, $in) as any; - return $resultPromise; +export function UInt32InUIntOut($in: number): $CancellablePromise { + return $Call.ByID(1160383782, $in); } -export function UInt32PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1739300671, $in) as any; - return $resultPromise; +export function UInt32PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByID(1739300671, $in); } -export function UInt64InUIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(793803239, $in) as any; - return $resultPromise; +export function UInt64InUIntOut($in: number): $CancellablePromise { + return $Call.ByID(793803239, $in); } -export function UInt64PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1403757716, $in) as any; - return $resultPromise; +export function UInt64PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByID(1403757716, $in); } -export function UInt8InUIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(2988345717, $in) as any; - return $resultPromise; +export function UInt8InUIntOut($in: number): $CancellablePromise { + return $Call.ByID(2988345717, $in); } -export function UInt8PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(518250834, $in) as any; - return $resultPromise; +export function UInt8PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByID(518250834, $in); } -export function UIntInUIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(2836661285, $in) as any; - return $resultPromise; +export function UIntInUIntOut($in: number): $CancellablePromise { + return $Call.ByID(2836661285, $in); } -export function UIntPointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1367187362, $in) as any; - return $resultPromise; +export function UIntPointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByID(1367187362, $in); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_single/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_single/greetservice.ts index 59d1e0f13..ef5015467 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_single/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_single/greetservice.ts @@ -8,226 +8,183 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports import * as $models from "./models.js"; -export function ArrayInt($in: number[]): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(3862002418, $in) as any; - return $resultPromise; +export function ArrayInt($in: number[]): $CancellablePromise { + return $Call.ByID(3862002418, $in); } -export function BoolInBoolOut($in: boolean): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(2424639793, $in) as any; - return $resultPromise; +export function BoolInBoolOut($in: boolean): $CancellablePromise { + return $Call.ByID(2424639793, $in); } -export function Float32InFloat32Out($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(3132595881, $in) as any; - return $resultPromise; +export function Float32InFloat32Out($in: number): $CancellablePromise { + return $Call.ByID(3132595881, $in); } -export function Float64InFloat64Out($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(2182412247, $in) as any; - return $resultPromise; +export function Float64InFloat64Out($in: number): $CancellablePromise { + return $Call.ByID(2182412247, $in); } /** * Greet someone */ -export function Greet(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1411160069, name) as any; - return $resultPromise; +export function Greet(name: string): $CancellablePromise { + return $Call.ByID(1411160069, name); } -export function Int16InIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(3306292566, $in) as any; - return $resultPromise; +export function Int16InIntOut($in: number): $CancellablePromise { + return $Call.ByID(3306292566, $in); } -export function Int16PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1754277916, $in) as any; - return $resultPromise; +export function Int16PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByID(1754277916, $in); } -export function Int32InIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1909469092, $in) as any; - return $resultPromise; +export function Int32InIntOut($in: number): $CancellablePromise { + return $Call.ByID(1909469092, $in); } -export function Int32PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(4251088558, $in) as any; - return $resultPromise; +export function Int32PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByID(4251088558, $in); } -export function Int64InIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1343888303, $in) as any; - return $resultPromise; +export function Int64InIntOut($in: number): $CancellablePromise { + return $Call.ByID(1343888303, $in); } -export function Int64PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(2205561041, $in) as any; - return $resultPromise; +export function Int64PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByID(2205561041, $in); } -export function Int8InIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(572240879, $in) as any; - return $resultPromise; +export function Int8InIntOut($in: number): $CancellablePromise { + return $Call.ByID(572240879, $in); } -export function Int8PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(2189402897, $in) as any; - return $resultPromise; +export function Int8PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByID(2189402897, $in); } -export function IntInIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(642881729, $in) as any; - return $resultPromise; +export function IntInIntOut($in: number): $CancellablePromise { + return $Call.ByID(642881729, $in); } -export function IntPointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1066151743, $in) as any; - return $resultPromise; +export function IntPointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByID(1066151743, $in); } -export function IntPointerInputNamedOutputs($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(2718999663, $in) as any; - return $resultPromise; +export function IntPointerInputNamedOutputs($in: number | null): $CancellablePromise { + return $Call.ByID(2718999663, $in); } -export function MapIntInt($in: { [_: `${number}`]: number } | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(2386486356, $in) as any; - return $resultPromise; +export function MapIntInt($in: { [_: `${number}`]: number } | null): $CancellablePromise { + return $Call.ByID(2386486356, $in); } -export function MapIntIntPointer($in: { [_: `${number}`]: number | null } | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(2163571325, $in) as any; - return $resultPromise; +export function MapIntIntPointer($in: { [_: `${number}`]: number | null } | null): $CancellablePromise { + return $Call.ByID(2163571325, $in); } -export function MapIntSliceInt($in: { [_: `${number}`]: number[] | null } | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(2900172572, $in) as any; - return $resultPromise; +export function MapIntSliceInt($in: { [_: `${number}`]: number[] | null } | null): $CancellablePromise { + return $Call.ByID(2900172572, $in); } -export function MapIntSliceIntInMapIntSliceIntOut($in: { [_: `${number}`]: number[] | null } | null): Promise<{ [_: `${number}`]: number[] | null } | null> & { cancel(): void } { - let $resultPromise = $Call.ByID(881980169, $in) as any; - return $resultPromise; +export function MapIntSliceIntInMapIntSliceIntOut($in: { [_: `${number}`]: number[] | null } | null): $CancellablePromise<{ [_: `${number}`]: number[] | null } | null> { + return $Call.ByID(881980169, $in); } -export function NoInputsStringOut(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1075577233) as any; - return $resultPromise; +export function NoInputsStringOut(): $CancellablePromise { + return $Call.ByID(1075577233); } -export function PointerBoolInBoolOut($in: boolean | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(3589606958, $in) as any; - return $resultPromise; +export function PointerBoolInBoolOut($in: boolean | null): $CancellablePromise { + return $Call.ByID(3589606958, $in); } -export function PointerFloat32InFloat32Out($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(224675106, $in) as any; - return $resultPromise; +export function PointerFloat32InFloat32Out($in: number | null): $CancellablePromise { + return $Call.ByID(224675106, $in); } -export function PointerFloat64InFloat64Out($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(2124953624, $in) as any; - return $resultPromise; +export function PointerFloat64InFloat64Out($in: number | null): $CancellablePromise { + return $Call.ByID(2124953624, $in); } -export function PointerMapIntInt($in: { [_: `${number}`]: number } | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(3516977899, $in) as any; - return $resultPromise; +export function PointerMapIntInt($in: { [_: `${number}`]: number } | null): $CancellablePromise { + return $Call.ByID(3516977899, $in); } -export function PointerStringInStringOut($in: string | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(229603958, $in) as any; - return $resultPromise; +export function PointerStringInStringOut($in: string | null): $CancellablePromise { + return $Call.ByID(229603958, $in); } -export function StringArrayInputNamedOutput($in: string[] | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(3678582682, $in) as any; - return $resultPromise; +export function StringArrayInputNamedOutput($in: string[] | null): $CancellablePromise { + return $Call.ByID(3678582682, $in); } -export function StringArrayInputNamedOutputs($in: string[] | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(319259595, $in) as any; - return $resultPromise; +export function StringArrayInputNamedOutputs($in: string[] | null): $CancellablePromise { + return $Call.ByID(319259595, $in); } -export function StringArrayInputStringArrayOut($in: string[] | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(383995060, $in) as any; - return $resultPromise; +export function StringArrayInputStringArrayOut($in: string[] | null): $CancellablePromise { + return $Call.ByID(383995060, $in); } -export function StringArrayInputStringOut($in: string[] | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1091960237, $in) as any; - return $resultPromise; +export function StringArrayInputStringOut($in: string[] | null): $CancellablePromise { + return $Call.ByID(1091960237, $in); } -export function StructInputStructOutput($in: $models.Person): Promise<$models.Person> & { cancel(): void } { - let $resultPromise = $Call.ByID(3835643147, $in) as any; - return $resultPromise; +export function StructInputStructOutput($in: $models.Person): $CancellablePromise<$models.Person> { + return $Call.ByID(3835643147, $in); } -export function StructPointerInputErrorOutput($in: $models.Person | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(2447692557, $in) as any; - return $resultPromise; +export function StructPointerInputErrorOutput($in: $models.Person | null): $CancellablePromise { + return $Call.ByID(2447692557, $in); } -export function StructPointerInputStructPointerOutput($in: $models.Person | null): Promise<$models.Person | null> & { cancel(): void } { - let $resultPromise = $Call.ByID(2943477349, $in) as any; - return $resultPromise; +export function StructPointerInputStructPointerOutput($in: $models.Person | null): $CancellablePromise<$models.Person | null> { + return $Call.ByID(2943477349, $in); } -export function UInt16InUIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(3401034892, $in) as any; - return $resultPromise; +export function UInt16InUIntOut($in: number): $CancellablePromise { + return $Call.ByID(3401034892, $in); } -export function UInt16PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1236957573, $in) as any; - return $resultPromise; +export function UInt16PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByID(1236957573, $in); } -export function UInt32InUIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1160383782, $in) as any; - return $resultPromise; +export function UInt32InUIntOut($in: number): $CancellablePromise { + return $Call.ByID(1160383782, $in); } -export function UInt32PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1739300671, $in) as any; - return $resultPromise; +export function UInt32PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByID(1739300671, $in); } -export function UInt64InUIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(793803239, $in) as any; - return $resultPromise; +export function UInt64InUIntOut($in: number): $CancellablePromise { + return $Call.ByID(793803239, $in); } -export function UInt64PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1403757716, $in) as any; - return $resultPromise; +export function UInt64PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByID(1403757716, $in); } -export function UInt8InUIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(2988345717, $in) as any; - return $resultPromise; +export function UInt8InUIntOut($in: number): $CancellablePromise { + return $Call.ByID(2988345717, $in); } -export function UInt8PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(518250834, $in) as any; - return $resultPromise; +export function UInt8PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByID(518250834, $in); } -export function UIntInUIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(2836661285, $in) as any; - return $resultPromise; +export function UIntInUIntOut($in: number): $CancellablePromise { + return $Call.ByID(2836661285, $in); } -export function UIntPointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1367187362, $in) as any; - return $resultPromise; +export function UIntPointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByID(1367187362, $in); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single/greetservice.ts index dc0a1a1b8..8a2cb7a70 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single/greetservice.ts @@ -8,12 +8,11 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; /** * Greet someone */ -export function Greet(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1411160069, name) as any; - return $resultPromise; +export function Greet(name: string): $CancellablePromise { + return $Call.ByID(1411160069, name); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_function/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_function/greetservice.ts index dc0a1a1b8..8a2cb7a70 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_function/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_function/greetservice.ts @@ -8,12 +8,11 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; /** * Greet someone */ -export function Greet(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1411160069, name) as any; - return $resultPromise; +export function Greet(name: string): $CancellablePromise { + return $Call.ByID(1411160069, name); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/greetservice.ts index c649bfb82..8519667d5 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/greetservice.ts @@ -8,7 +8,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,15 +17,13 @@ import * as $models from "./models.js"; /** * Greet does XYZ */ -export function Greet(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByID(1411160069, name) as any; - return $resultPromise; +export function Greet(name: string): $CancellablePromise { + return $Call.ByID(1411160069, name); } /** * NewPerson creates a new person */ -export function NewPerson(name: string): Promise<$models.Person | null> & { cancel(): void } { - let $resultPromise = $Call.ByID(1661412647, name) as any; - return $resultPromise; +export function NewPerson(name: string): $CancellablePromise<$models.Person | null> { + return $Call.ByID(1661412647, name); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/services/otherservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/services/otherservice.ts index 0fdb6e4c6..79c8907f9 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/services/otherservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=false/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/services/otherservice.ts @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -18,7 +18,6 @@ import * as $models from "./models.js"; /** * Yay does this and that */ -export function Yay(): Promise<$models.Address | null> & { cancel(): void } { - let $resultPromise = $Call.ByID(1491748400) as any; - return $resultPromise; +export function Yay(): $CancellablePromise<$models.Address | null> { + return $Call.ByID(1491748400); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.ts index 0b074ac0b..d19c65d22 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/aliases/greetservice.ts @@ -8,7 +8,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -21,41 +21,35 @@ import * as $models from "./models.js"; /** * Get someone. */ -export function Get(aliasValue: $models.Alias): Promise<$models.Person> & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Get", aliasValue) as any; - return $resultPromise; +export function Get(aliasValue: $models.Alias): $CancellablePromise<$models.Person> { + return $Call.ByName("main.GreetService.Get", aliasValue); } /** * Apparently, aliases are all the rage right now. */ -export function GetButAliased(p: $models.AliasedPerson): Promise<$models.StrangelyAliasedPerson> & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.GetButAliased", p) as any; - return $resultPromise; +export function GetButAliased(p: $models.AliasedPerson): $CancellablePromise<$models.StrangelyAliasedPerson> { + return $Call.ByName("main.GreetService.GetButAliased", p); } /** * Get someone quite different. */ -export function GetButDifferent(): Promise<$models.GenericPerson> & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.GetButDifferent") as any; - return $resultPromise; +export function GetButDifferent(): $CancellablePromise<$models.GenericPerson> { + return $Call.ByName("main.GreetService.GetButDifferent"); } -export function GetButForeignPrivateAlias(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.GetButForeignPrivateAlias") as any; - return $resultPromise; +export function GetButForeignPrivateAlias(): $CancellablePromise { + return $Call.ByName("main.GreetService.GetButForeignPrivateAlias"); } -export function GetButGenericAliases(): Promise<$models.AliasGroup> & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.GetButGenericAliases") as any; - return $resultPromise; +export function GetButGenericAliases(): $CancellablePromise<$models.AliasGroup> { + return $Call.ByName("main.GreetService.GetButGenericAliases"); } /** * Greet a lot of unusual things. */ -export function Greet($0: $models.EmptyAliasStruct, $1: $models.EmptyStruct): Promise<$models.AliasStruct> & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Greet", $0, $1) as any; - return $resultPromise; +export function Greet($0: $models.EmptyAliasStruct, $1: $models.EmptyStruct): $CancellablePromise<$models.AliasStruct> { + return $Call.ByName("main.GreetService.Greet", $0, $1); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service7.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service7.ts index 4c65d97ea..e4281d925 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service7.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service7.ts @@ -3,9 +3,8 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; -export function TestMethod(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config.Service7.TestMethod") as any; - return $resultPromise; +export function TestMethod(): $CancellablePromise { + return $Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config.Service7.TestMethod"); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service9.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service9.ts index a968e9b64..1c0154b5e 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service9.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config/service9.ts @@ -3,9 +3,8 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; -export function TestMethod2(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config.Service9.TestMethod2") as any; - return $resultPromise; +export function TestMethod2(): $CancellablePromise { + return $Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/complex_expressions/config.Service9.TestMethod2"); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_json/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_json/greetservice.ts index dde723eae..9eff81e94 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_json/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_json/greetservice.ts @@ -8,7 +8,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,7 +17,6 @@ import * as $models from "./models.js"; /** * Greet does XYZ */ -export function Greet(person: $models.Person, emb: $models.Embedded1): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Greet", person, emb) as any; - return $resultPromise; +export function Greet(person: $models.Person, emb: $models.Embedded1): $CancellablePromise { + return $Call.ByName("main.GreetService.Greet", person, emb); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_method/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_method/greetservice.ts index c4b9cd802..0c3ef75cb 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_method/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/complex_method/greetservice.ts @@ -8,7 +8,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -19,7 +19,6 @@ import * as $models from "./models.js"; * It has a multiline doc comment * The comment has even some * / traps!! */ -export function Greet(str: string, people: $models.Person[] | null, $2: {"AnotherCount": number, "AnotherOne": $models.Person | null}, assoc: { [_: `${number}`]: boolean | null } | null, $4: (number | null)[] | null, ...other: string[]): Promise<[$models.Person, any, number[] | null]> & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Greet", str, people, $2, assoc, $4, other) as any; - return $resultPromise; +export function Greet(str: string, people: $models.Person[] | null, $2: {"AnotherCount": number, "AnotherOne": $models.Person | null}, assoc: { [_: `${number}`]: boolean | null } | null, $4: (number | null)[] | null, ...other: string[]): $CancellablePromise<[$models.Person, any, number[] | null]> { + return $Call.ByName("main.GreetService.Greet", str, people, $2, assoc, $4, other); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_imports/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_imports/greetservice.ts index e322a90c2..52f87997c 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_imports/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_imports/greetservice.ts @@ -8,7 +8,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,7 +17,6 @@ import * as $models from "./models.js"; /** * Make a cycle. */ -export function MakeCycles(): Promise<[$models.StructA, $models.StructC]> & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.MakeCycles") as any; - return $resultPromise; +export function MakeCycles(): $CancellablePromise<[$models.StructA, $models.StructC]> { + return $Call.ByName("main.GreetService.MakeCycles"); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_types/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_types/greetservice.ts index 8585c78d7..b7ef0ae3e 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_types/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/cyclic_types/greetservice.ts @@ -8,7 +8,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,7 +17,6 @@ import * as $models from "./models.js"; /** * Make a cycle. */ -export function MakeCycles(): Promise<[$models.Cyclic, $models.GenericCyclic<$models.GenericCyclic>]> & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.MakeCycles") as any; - return $resultPromise; +export function MakeCycles(): $CancellablePromise<[$models.Cyclic, $models.GenericCyclic<$models.GenericCyclic>]> { + return $Call.ByName("main.GreetService.MakeCycles"); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/internalservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/internalservice.ts index cdb60560b..faca61bc2 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/internalservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/internalservice.ts @@ -8,13 +8,12 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports import * as $models from "./models.js"; -export function Method($0: $models.InternalModel): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.InternalService.Method", $0) as any; - return $resultPromise; +export function Method($0: $models.InternalModel): $CancellablePromise { + return $Call.ByName("main.InternalService.Method", $0); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/service.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/service.ts index feddd7b11..84ac0538c 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/service.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/service.ts @@ -3,20 +3,18 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports import * as otherpackage$0 from "./otherpackage/models.js"; -function InternalMethod($0: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.Service.InternalMethod", $0) as any; - return $resultPromise; +function InternalMethod($0: string): $CancellablePromise { + return $Call.ByName("main.Service.InternalMethod", $0); } -export function VisibleMethod($0: otherpackage$0.Dummy): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.Service.VisibleMethod", $0) as any; - return $resultPromise; +export function VisibleMethod($0: otherpackage$0.Dummy): $CancellablePromise { + return $Call.ByName("main.Service.VisibleMethod", $0); } export async function CustomMethod(arg: string): Promise { diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/unexportedservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/unexportedservice.ts index 97059f1fa..b49239ada 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/unexportedservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/directives/unexportedservice.ts @@ -8,13 +8,12 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports import * as $models from "./models.js"; -export function Method($0: $models.unexportedModel): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.unexportedService.Method", $0) as any; - return $resultPromise; +export function Method($0: $models.unexportedModel): $CancellablePromise { + return $Call.ByName("main.unexportedService.Method", $0); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/embedded_interface/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/embedded_interface/greetservice.ts index 8888fd9f0..4951af01d 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/embedded_interface/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/embedded_interface/greetservice.ts @@ -8,45 +8,40 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; /** * Comment 1. */ -export function Method1(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Method1") as any; - return $resultPromise; +export function Method1(): $CancellablePromise { + return $Call.ByName("main.GreetService.Method1"); } /** * Comment 2. */ -export function Method2(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Method2") as any; - return $resultPromise; +export function Method2(): $CancellablePromise { + return $Call.ByName("main.GreetService.Method2"); } /** * Comment 3a. * Comment 3b. */ -export function Method3(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Method3") as any; - return $resultPromise; +export function Method3(): $CancellablePromise { + return $Call.ByName("main.GreetService.Method3"); } /** * Comment 4. */ -export function Method4(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Method4") as any; - return $resultPromise; +export function Method4(): $CancellablePromise { + return $Call.ByName("main.GreetService.Method4"); } /** * Comment 5. */ -export function Method5(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Method5") as any; - return $resultPromise; +export function Method5(): $CancellablePromise { + return $Call.ByName("main.GreetService.Method5"); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/enum/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/enum/greetservice.ts index 4294d1e30..d857aa9e7 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/enum/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/enum/greetservice.ts @@ -8,7 +8,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,15 +17,13 @@ import * as $models from "./models.js"; /** * Greet does XYZ */ -export function Greet(name: string, title: $models.Title): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Greet", name, title) as any; - return $resultPromise; +export function Greet(name: string, title: $models.Title): $CancellablePromise { + return $Call.ByName("main.GreetService.Greet", name, title); } /** * NewPerson creates a new person */ -export function NewPerson(name: string): Promise<$models.Person | null> & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.NewPerson", name) as any; - return $resultPromise; +export function NewPerson(name: string): $CancellablePromise<$models.Person | null> { + return $Call.ByName("main.GreetService.NewPerson", name); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/enum_from_imported_package/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/enum_from_imported_package/greetservice.ts index 3d7d982f4..73469c39d 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/enum_from_imported_package/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/enum_from_imported_package/greetservice.ts @@ -8,7 +8,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,7 +17,6 @@ import * as services$0 from "./services/models.js"; /** * Greet does XYZ */ -export function Greet(name: string, title: services$0.Title): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Greet", name, title) as any; - return $resultPromise; +export function Greet(name: string, title: services$0.Title): $CancellablePromise { + return $Call.ByName("main.GreetService.Greet", name, title); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/greetservice.ts index 4602f3a69..5a8e9adc3 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/greetservice.ts @@ -8,7 +8,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,15 +17,13 @@ import * as $models from "./models.js"; /** * Greet does XYZ */ -export function Greet(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Greet", name) as any; - return $resultPromise; +export function Greet(name: string): $CancellablePromise { + return $Call.ByName("main.GreetService.Greet", name); } /** * NewPerson creates a new person */ -export function NewPerson(name: string): Promise<$models.Person | null> & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.NewPerson", name) as any; - return $resultPromise; +export function NewPerson(name: string): $CancellablePromise<$models.Person | null> { + return $Call.ByName("main.GreetService.NewPerson", name); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/services/otherservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/services/otherservice.ts index 0ea61fe3a..c6db3803b 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/services/otherservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/services/otherservice.ts @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -18,7 +18,6 @@ import * as $models from "./models.js"; /** * Yay does this and that */ -export function Yay(): Promise<$models.Address | null> & { cancel(): void } { - let $resultPromise = $Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/services.OtherService.Yay") as any; - return $resultPromise; +export function Yay(): $CancellablePromise<$models.Address | null> { + return $Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_imported_package/services.OtherService.Yay"); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/greetservice.ts index 4602f3a69..5a8e9adc3 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/greetservice.ts @@ -8,7 +8,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,15 +17,13 @@ import * as $models from "./models.js"; /** * Greet does XYZ */ -export function Greet(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Greet", name) as any; - return $resultPromise; +export function Greet(name: string): $CancellablePromise { + return $Call.ByName("main.GreetService.Greet", name); } /** * NewPerson creates a new person */ -export function NewPerson(name: string): Promise<$models.Person | null> & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.NewPerson", name) as any; - return $resultPromise; +export function NewPerson(name: string): $CancellablePromise<$models.Person | null> { + return $Call.ByName("main.GreetService.NewPerson", name); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/services/other/otherservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/services/other/otherservice.ts index 1bf854765..b83ce5234 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/services/other/otherservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/services/other/otherservice.ts @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -18,7 +18,6 @@ import * as $models from "./models.js"; /** * Yay does this and that */ -export function Yay(): Promise<$models.Address | null> & { cancel(): void } { - let $resultPromise = $Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/services/other.OtherService.Yay") as any; - return $resultPromise; +export function Yay(): $CancellablePromise<$models.Address | null> { + return $Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/function_from_nested_imported_package/services/other.OtherService.Yay"); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_multiple_files/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_multiple_files/greetservice.ts index f68e20023..41664b850 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_multiple_files/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_multiple_files/greetservice.ts @@ -3,9 +3,8 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; -export function Greet(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Greet", name) as any; - return $resultPromise; +export function Greet(name: string): $CancellablePromise { + return $Call.ByName("main.GreetService.Greet", name); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single/greetservice.ts index f817be3c7..80bebe425 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single/greetservice.ts @@ -8,12 +8,11 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; /** * Greet someone */ -export function Greet(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Greet", name) as any; - return $resultPromise; +export function Greet(name: string): $CancellablePromise { + return $Call.ByName("main.GreetService.Greet", name); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_context/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_context/greetservice.ts index 0945346b5..63a65248c 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_context/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_context/greetservice.ts @@ -8,20 +8,18 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; /** * Greet someone */ -export function Greet(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Greet", name) as any; - return $resultPromise; +export function Greet(name: string): $CancellablePromise { + return $Call.ByName("main.GreetService.Greet", name); } /** * Greet someone */ -export function GreetWithContext(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.GreetWithContext", name) as any; - return $resultPromise; +export function GreetWithContext(name: string): $CancellablePromise { + return $Call.ByName("main.GreetService.GreetWithContext", name); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_internal/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_internal/greetservice.ts index f817be3c7..80bebe425 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_internal/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/function_single_internal/greetservice.ts @@ -8,12 +8,11 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; /** * Greet someone */ -export function Greet(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Greet", name) as any; - return $resultPromise; +export function Greet(name: string): $CancellablePromise { + return $Call.ByName("main.GreetService.Greet", name); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/service.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/service.ts index 8ebd680ee..7b59b53ed 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/service.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/map_keys/service.ts @@ -3,13 +3,12 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports import * as $models from "./models.js"; -export function Method(): Promise<$models.Maps<$models.PointerTextMarshaler, number, number, $models.ValueTextMarshaler, $models.PointerTextMarshaler | null, $models.ValueTextMarshaler, $models.StringType, $models.ValueTextMarshaler, $models.PointerTextMarshaler | null>> & { cancel(): void } { - let $resultPromise = $Call.ByName("main.Service.Method") as any; - return $resultPromise; +export function Method(): $CancellablePromise<$models.Maps<$models.PointerTextMarshaler, number, number, $models.ValueTextMarshaler, $models.PointerTextMarshaler | null, $models.ValueTextMarshaler, $models.StringType, $models.ValueTextMarshaler, $models.PointerTextMarshaler | null>> { + return $Call.ByName("main.Service.Method"); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/marshalers/service.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/marshalers/service.ts index f1801dbe9..0de2fecd5 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/marshalers/service.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/marshalers/service.ts @@ -3,13 +3,12 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports import * as $models from "./models.js"; -export function Method(): Promise<$models.Data> & { cancel(): void } { - let $resultPromise = $Call.ByName("main.Service.Method") as any; - return $resultPromise; +export function Method(): $CancellablePromise<$models.Data> { + return $Call.ByName("main.Service.Method"); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/other/othermethods.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/other/othermethods.ts index 8aa4349f6..e6638332a 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/other/othermethods.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/other/othermethods.ts @@ -8,12 +8,11 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; /** * LikeThisOtherOne does nothing as well, but is different. */ -export function LikeThisOtherOne(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/other.OtherMethods.LikeThisOtherOne") as any; - return $resultPromise; +export function LikeThisOtherOne(): $CancellablePromise { + return $Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/other.OtherMethods.LikeThisOtherOne"); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/somemethods.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/somemethods.ts index 60f7459e2..e37a596df 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/somemethods.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here/somemethods.ts @@ -8,7 +8,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,15 +17,13 @@ import * as $models from "./models.js"; /** * LikeThisOne is an example method that does nothing. */ -export function LikeThisOne(): Promise<[$models.Person, $models.HowDifferent, $models.PrivatePerson]> & { cancel(): void } { - let $resultPromise = $Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here.SomeMethods.LikeThisOne") as any; - return $resultPromise; +export function LikeThisOne(): $CancellablePromise<[$models.Person, $models.HowDifferent, $models.PrivatePerson]> { + return $Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here.SomeMethods.LikeThisOne"); } /** * LikeThisOtherOne does nothing as well, but is different. */ -export function LikeThisOtherOne(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here.SomeMethods.LikeThisOtherOne") as any; - return $resultPromise; +export function LikeThisOtherOne(): $CancellablePromise { + return $Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/no_bindings_here.SomeMethods.LikeThisOtherOne"); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedother.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedother.ts index 43cc4ace8..ec7619bfc 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedother.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedother.ts @@ -8,12 +8,11 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; /** * LikeThisOtherOne does nothing as well, but is different. */ -export function LikeThisOtherOne(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.EmbedOther.LikeThisOtherOne") as any; - return $resultPromise; +export function LikeThisOtherOne(): $CancellablePromise { + return $Call.ByName("main.EmbedOther.LikeThisOtherOne"); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedservice.ts index 3674555d3..680b028b4 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/embedservice.ts @@ -8,7 +8,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,15 +17,13 @@ import * as nobindingshere$0 from "../no_bindings_here/models.js"; /** * LikeThisOne is an example method that does nothing. */ -export function LikeThisOne(): Promise<[nobindingshere$0.Person, nobindingshere$0.HowDifferent, nobindingshere$0.PrivatePerson]> & { cancel(): void } { - let $resultPromise = $Call.ByName("main.EmbedService.LikeThisOne") as any; - return $resultPromise; +export function LikeThisOne(): $CancellablePromise<[nobindingshere$0.Person, nobindingshere$0.HowDifferent, nobindingshere$0.PrivatePerson]> { + return $Call.ByName("main.EmbedService.LikeThisOne"); } /** * LikeThisOtherOne does nothing as well, but is different. */ -export function LikeThisOtherOne(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.EmbedService.LikeThisOtherOne") as any; - return $resultPromise; +export function LikeThisOtherOne(): $CancellablePromise { + return $Call.ByName("main.EmbedService.LikeThisOtherOne"); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/greetservice.ts index a1c5e3028..4166b32f7 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/out_of_tree/greetservice.ts @@ -8,12 +8,11 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; /** * Greet someone */ -export function Greet($0: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Greet", $0) as any; - return $resultPromise; +export function Greet($0: string): $CancellablePromise { + return $Call.ByName("main.GreetService.Greet", $0); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/greetservice.ts index f68e20023..41664b850 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/greetservice.ts @@ -3,9 +3,8 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; -export function Greet(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Greet", name) as any; - return $resultPromise; +export function Greet(name: string): $CancellablePromise { + return $Call.ByName("main.GreetService.Greet", name); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/otherservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/otherservice.ts index bf655567e..5a733e6c9 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/otherservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple/otherservice.ts @@ -3,9 +3,8 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; -export function Hello(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.OtherService.Hello") as any; - return $resultPromise; +export function Hello(): $CancellablePromise { + return $Call.ByName("main.OtherService.Hello"); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/greetservice.ts index f68e20023..41664b850 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/greetservice.ts @@ -3,9 +3,8 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; -export function Greet(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Greet", name) as any; - return $resultPromise; +export function Greet(name: string): $CancellablePromise { + return $Call.ByName("main.GreetService.Greet", name); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/otherservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/otherservice.ts index bf655567e..5a733e6c9 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/otherservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_files/otherservice.ts @@ -3,9 +3,8 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; -export function Hello(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.OtherService.Hello") as any; - return $resultPromise; +export function Hello(): $CancellablePromise { + return $Call.ByName("main.OtherService.Hello"); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/greetservice.ts index 4602f3a69..5a8e9adc3 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/greetservice.ts @@ -8,7 +8,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,15 +17,13 @@ import * as $models from "./models.js"; /** * Greet does XYZ */ -export function Greet(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Greet", name) as any; - return $resultPromise; +export function Greet(name: string): $CancellablePromise { + return $Call.ByName("main.GreetService.Greet", name); } /** * NewPerson creates a new person */ -export function NewPerson(name: string): Promise<$models.Person | null> & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.NewPerson", name) as any; - return $resultPromise; +export function NewPerson(name: string): $CancellablePromise<$models.Person | null> { + return $Call.ByName("main.GreetService.NewPerson", name); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/services/otherservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/services/otherservice.ts index 6e0546e29..018d8df30 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/services/otherservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/services/otherservice.ts @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -18,7 +18,6 @@ import * as $models from "./models.js"; /** * Yay does this and that */ -export function Yay(): Promise<$models.Address | null> & { cancel(): void } { - let $resultPromise = $Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/services.OtherService.Yay") as any; - return $resultPromise; +export function Yay(): $CancellablePromise<$models.Address | null> { + return $Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_multiple_other/services.OtherService.Yay"); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_non_pointer_single/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_non_pointer_single/greetservice.ts index e05f6102b..b8abcb9a6 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_non_pointer_single/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_non_pointer_single/greetservice.ts @@ -8,226 +8,183 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports import * as $models from "./models.js"; -export function ArrayInt($in: number[]): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.ArrayInt", $in) as any; - return $resultPromise; +export function ArrayInt($in: number[]): $CancellablePromise { + return $Call.ByName("main.GreetService.ArrayInt", $in); } -export function BoolInBoolOut($in: boolean): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.BoolInBoolOut", $in) as any; - return $resultPromise; +export function BoolInBoolOut($in: boolean): $CancellablePromise { + return $Call.ByName("main.GreetService.BoolInBoolOut", $in); } -export function Float32InFloat32Out($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Float32InFloat32Out", $in) as any; - return $resultPromise; +export function Float32InFloat32Out($in: number): $CancellablePromise { + return $Call.ByName("main.GreetService.Float32InFloat32Out", $in); } -export function Float64InFloat64Out($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Float64InFloat64Out", $in) as any; - return $resultPromise; +export function Float64InFloat64Out($in: number): $CancellablePromise { + return $Call.ByName("main.GreetService.Float64InFloat64Out", $in); } /** * Greet someone */ -export function Greet(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Greet", name) as any; - return $resultPromise; +export function Greet(name: string): $CancellablePromise { + return $Call.ByName("main.GreetService.Greet", name); } -export function Int16InIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Int16InIntOut", $in) as any; - return $resultPromise; +export function Int16InIntOut($in: number): $CancellablePromise { + return $Call.ByName("main.GreetService.Int16InIntOut", $in); } -export function Int16PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Int16PointerInAndOutput", $in) as any; - return $resultPromise; +export function Int16PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByName("main.GreetService.Int16PointerInAndOutput", $in); } -export function Int32InIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Int32InIntOut", $in) as any; - return $resultPromise; +export function Int32InIntOut($in: number): $CancellablePromise { + return $Call.ByName("main.GreetService.Int32InIntOut", $in); } -export function Int32PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Int32PointerInAndOutput", $in) as any; - return $resultPromise; +export function Int32PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByName("main.GreetService.Int32PointerInAndOutput", $in); } -export function Int64InIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Int64InIntOut", $in) as any; - return $resultPromise; +export function Int64InIntOut($in: number): $CancellablePromise { + return $Call.ByName("main.GreetService.Int64InIntOut", $in); } -export function Int64PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Int64PointerInAndOutput", $in) as any; - return $resultPromise; +export function Int64PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByName("main.GreetService.Int64PointerInAndOutput", $in); } -export function Int8InIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Int8InIntOut", $in) as any; - return $resultPromise; +export function Int8InIntOut($in: number): $CancellablePromise { + return $Call.ByName("main.GreetService.Int8InIntOut", $in); } -export function Int8PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Int8PointerInAndOutput", $in) as any; - return $resultPromise; +export function Int8PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByName("main.GreetService.Int8PointerInAndOutput", $in); } -export function IntInIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.IntInIntOut", $in) as any; - return $resultPromise; +export function IntInIntOut($in: number): $CancellablePromise { + return $Call.ByName("main.GreetService.IntInIntOut", $in); } -export function IntPointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.IntPointerInAndOutput", $in) as any; - return $resultPromise; +export function IntPointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByName("main.GreetService.IntPointerInAndOutput", $in); } -export function IntPointerInputNamedOutputs($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.IntPointerInputNamedOutputs", $in) as any; - return $resultPromise; +export function IntPointerInputNamedOutputs($in: number | null): $CancellablePromise { + return $Call.ByName("main.GreetService.IntPointerInputNamedOutputs", $in); } -export function MapIntInt($in: { [_: `${number}`]: number } | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.MapIntInt", $in) as any; - return $resultPromise; +export function MapIntInt($in: { [_: `${number}`]: number } | null): $CancellablePromise { + return $Call.ByName("main.GreetService.MapIntInt", $in); } -export function MapIntIntPointer($in: { [_: `${number}`]: number | null } | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.MapIntIntPointer", $in) as any; - return $resultPromise; +export function MapIntIntPointer($in: { [_: `${number}`]: number | null } | null): $CancellablePromise { + return $Call.ByName("main.GreetService.MapIntIntPointer", $in); } -export function MapIntSliceInt($in: { [_: `${number}`]: number[] | null } | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.MapIntSliceInt", $in) as any; - return $resultPromise; +export function MapIntSliceInt($in: { [_: `${number}`]: number[] | null } | null): $CancellablePromise { + return $Call.ByName("main.GreetService.MapIntSliceInt", $in); } -export function MapIntSliceIntInMapIntSliceIntOut($in: { [_: `${number}`]: number[] | null } | null): Promise<{ [_: `${number}`]: number[] | null } | null> & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.MapIntSliceIntInMapIntSliceIntOut", $in) as any; - return $resultPromise; +export function MapIntSliceIntInMapIntSliceIntOut($in: { [_: `${number}`]: number[] | null } | null): $CancellablePromise<{ [_: `${number}`]: number[] | null } | null> { + return $Call.ByName("main.GreetService.MapIntSliceIntInMapIntSliceIntOut", $in); } -export function NoInputsStringOut(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.NoInputsStringOut") as any; - return $resultPromise; +export function NoInputsStringOut(): $CancellablePromise { + return $Call.ByName("main.GreetService.NoInputsStringOut"); } -export function PointerBoolInBoolOut($in: boolean | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.PointerBoolInBoolOut", $in) as any; - return $resultPromise; +export function PointerBoolInBoolOut($in: boolean | null): $CancellablePromise { + return $Call.ByName("main.GreetService.PointerBoolInBoolOut", $in); } -export function PointerFloat32InFloat32Out($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.PointerFloat32InFloat32Out", $in) as any; - return $resultPromise; +export function PointerFloat32InFloat32Out($in: number | null): $CancellablePromise { + return $Call.ByName("main.GreetService.PointerFloat32InFloat32Out", $in); } -export function PointerFloat64InFloat64Out($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.PointerFloat64InFloat64Out", $in) as any; - return $resultPromise; +export function PointerFloat64InFloat64Out($in: number | null): $CancellablePromise { + return $Call.ByName("main.GreetService.PointerFloat64InFloat64Out", $in); } -export function PointerMapIntInt($in: { [_: `${number}`]: number } | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.PointerMapIntInt", $in) as any; - return $resultPromise; +export function PointerMapIntInt($in: { [_: `${number}`]: number } | null): $CancellablePromise { + return $Call.ByName("main.GreetService.PointerMapIntInt", $in); } -export function PointerStringInStringOut($in: string | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.PointerStringInStringOut", $in) as any; - return $resultPromise; +export function PointerStringInStringOut($in: string | null): $CancellablePromise { + return $Call.ByName("main.GreetService.PointerStringInStringOut", $in); } -export function StringArrayInputNamedOutput($in: string[] | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.StringArrayInputNamedOutput", $in) as any; - return $resultPromise; +export function StringArrayInputNamedOutput($in: string[] | null): $CancellablePromise { + return $Call.ByName("main.GreetService.StringArrayInputNamedOutput", $in); } -export function StringArrayInputNamedOutputs($in: string[] | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.StringArrayInputNamedOutputs", $in) as any; - return $resultPromise; +export function StringArrayInputNamedOutputs($in: string[] | null): $CancellablePromise { + return $Call.ByName("main.GreetService.StringArrayInputNamedOutputs", $in); } -export function StringArrayInputStringArrayOut($in: string[] | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.StringArrayInputStringArrayOut", $in) as any; - return $resultPromise; +export function StringArrayInputStringArrayOut($in: string[] | null): $CancellablePromise { + return $Call.ByName("main.GreetService.StringArrayInputStringArrayOut", $in); } -export function StringArrayInputStringOut($in: string[] | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.StringArrayInputStringOut", $in) as any; - return $resultPromise; +export function StringArrayInputStringOut($in: string[] | null): $CancellablePromise { + return $Call.ByName("main.GreetService.StringArrayInputStringOut", $in); } -export function StructInputStructOutput($in: $models.Person): Promise<$models.Person> & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.StructInputStructOutput", $in) as any; - return $resultPromise; +export function StructInputStructOutput($in: $models.Person): $CancellablePromise<$models.Person> { + return $Call.ByName("main.GreetService.StructInputStructOutput", $in); } -export function StructPointerInputErrorOutput($in: $models.Person | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.StructPointerInputErrorOutput", $in) as any; - return $resultPromise; +export function StructPointerInputErrorOutput($in: $models.Person | null): $CancellablePromise { + return $Call.ByName("main.GreetService.StructPointerInputErrorOutput", $in); } -export function StructPointerInputStructPointerOutput($in: $models.Person | null): Promise<$models.Person | null> & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.StructPointerInputStructPointerOutput", $in) as any; - return $resultPromise; +export function StructPointerInputStructPointerOutput($in: $models.Person | null): $CancellablePromise<$models.Person | null> { + return $Call.ByName("main.GreetService.StructPointerInputStructPointerOutput", $in); } -export function UInt16InUIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.UInt16InUIntOut", $in) as any; - return $resultPromise; +export function UInt16InUIntOut($in: number): $CancellablePromise { + return $Call.ByName("main.GreetService.UInt16InUIntOut", $in); } -export function UInt16PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.UInt16PointerInAndOutput", $in) as any; - return $resultPromise; +export function UInt16PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByName("main.GreetService.UInt16PointerInAndOutput", $in); } -export function UInt32InUIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.UInt32InUIntOut", $in) as any; - return $resultPromise; +export function UInt32InUIntOut($in: number): $CancellablePromise { + return $Call.ByName("main.GreetService.UInt32InUIntOut", $in); } -export function UInt32PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.UInt32PointerInAndOutput", $in) as any; - return $resultPromise; +export function UInt32PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByName("main.GreetService.UInt32PointerInAndOutput", $in); } -export function UInt64InUIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.UInt64InUIntOut", $in) as any; - return $resultPromise; +export function UInt64InUIntOut($in: number): $CancellablePromise { + return $Call.ByName("main.GreetService.UInt64InUIntOut", $in); } -export function UInt64PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.UInt64PointerInAndOutput", $in) as any; - return $resultPromise; +export function UInt64PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByName("main.GreetService.UInt64PointerInAndOutput", $in); } -export function UInt8InUIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.UInt8InUIntOut", $in) as any; - return $resultPromise; +export function UInt8InUIntOut($in: number): $CancellablePromise { + return $Call.ByName("main.GreetService.UInt8InUIntOut", $in); } -export function UInt8PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.UInt8PointerInAndOutput", $in) as any; - return $resultPromise; +export function UInt8PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByName("main.GreetService.UInt8PointerInAndOutput", $in); } -export function UIntInUIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.UIntInUIntOut", $in) as any; - return $resultPromise; +export function UIntInUIntOut($in: number): $CancellablePromise { + return $Call.ByName("main.GreetService.UIntInUIntOut", $in); } -export function UIntPointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.UIntPointerInAndOutput", $in) as any; - return $resultPromise; +export function UIntPointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByName("main.GreetService.UIntPointerInAndOutput", $in); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_single/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_single/greetservice.ts index e05f6102b..b8abcb9a6 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_single/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/struct_literal_single/greetservice.ts @@ -8,226 +8,183 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports import * as $models from "./models.js"; -export function ArrayInt($in: number[]): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.ArrayInt", $in) as any; - return $resultPromise; +export function ArrayInt($in: number[]): $CancellablePromise { + return $Call.ByName("main.GreetService.ArrayInt", $in); } -export function BoolInBoolOut($in: boolean): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.BoolInBoolOut", $in) as any; - return $resultPromise; +export function BoolInBoolOut($in: boolean): $CancellablePromise { + return $Call.ByName("main.GreetService.BoolInBoolOut", $in); } -export function Float32InFloat32Out($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Float32InFloat32Out", $in) as any; - return $resultPromise; +export function Float32InFloat32Out($in: number): $CancellablePromise { + return $Call.ByName("main.GreetService.Float32InFloat32Out", $in); } -export function Float64InFloat64Out($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Float64InFloat64Out", $in) as any; - return $resultPromise; +export function Float64InFloat64Out($in: number): $CancellablePromise { + return $Call.ByName("main.GreetService.Float64InFloat64Out", $in); } /** * Greet someone */ -export function Greet(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Greet", name) as any; - return $resultPromise; +export function Greet(name: string): $CancellablePromise { + return $Call.ByName("main.GreetService.Greet", name); } -export function Int16InIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Int16InIntOut", $in) as any; - return $resultPromise; +export function Int16InIntOut($in: number): $CancellablePromise { + return $Call.ByName("main.GreetService.Int16InIntOut", $in); } -export function Int16PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Int16PointerInAndOutput", $in) as any; - return $resultPromise; +export function Int16PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByName("main.GreetService.Int16PointerInAndOutput", $in); } -export function Int32InIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Int32InIntOut", $in) as any; - return $resultPromise; +export function Int32InIntOut($in: number): $CancellablePromise { + return $Call.ByName("main.GreetService.Int32InIntOut", $in); } -export function Int32PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Int32PointerInAndOutput", $in) as any; - return $resultPromise; +export function Int32PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByName("main.GreetService.Int32PointerInAndOutput", $in); } -export function Int64InIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Int64InIntOut", $in) as any; - return $resultPromise; +export function Int64InIntOut($in: number): $CancellablePromise { + return $Call.ByName("main.GreetService.Int64InIntOut", $in); } -export function Int64PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Int64PointerInAndOutput", $in) as any; - return $resultPromise; +export function Int64PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByName("main.GreetService.Int64PointerInAndOutput", $in); } -export function Int8InIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Int8InIntOut", $in) as any; - return $resultPromise; +export function Int8InIntOut($in: number): $CancellablePromise { + return $Call.ByName("main.GreetService.Int8InIntOut", $in); } -export function Int8PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Int8PointerInAndOutput", $in) as any; - return $resultPromise; +export function Int8PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByName("main.GreetService.Int8PointerInAndOutput", $in); } -export function IntInIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.IntInIntOut", $in) as any; - return $resultPromise; +export function IntInIntOut($in: number): $CancellablePromise { + return $Call.ByName("main.GreetService.IntInIntOut", $in); } -export function IntPointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.IntPointerInAndOutput", $in) as any; - return $resultPromise; +export function IntPointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByName("main.GreetService.IntPointerInAndOutput", $in); } -export function IntPointerInputNamedOutputs($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.IntPointerInputNamedOutputs", $in) as any; - return $resultPromise; +export function IntPointerInputNamedOutputs($in: number | null): $CancellablePromise { + return $Call.ByName("main.GreetService.IntPointerInputNamedOutputs", $in); } -export function MapIntInt($in: { [_: `${number}`]: number } | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.MapIntInt", $in) as any; - return $resultPromise; +export function MapIntInt($in: { [_: `${number}`]: number } | null): $CancellablePromise { + return $Call.ByName("main.GreetService.MapIntInt", $in); } -export function MapIntIntPointer($in: { [_: `${number}`]: number | null } | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.MapIntIntPointer", $in) as any; - return $resultPromise; +export function MapIntIntPointer($in: { [_: `${number}`]: number | null } | null): $CancellablePromise { + return $Call.ByName("main.GreetService.MapIntIntPointer", $in); } -export function MapIntSliceInt($in: { [_: `${number}`]: number[] | null } | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.MapIntSliceInt", $in) as any; - return $resultPromise; +export function MapIntSliceInt($in: { [_: `${number}`]: number[] | null } | null): $CancellablePromise { + return $Call.ByName("main.GreetService.MapIntSliceInt", $in); } -export function MapIntSliceIntInMapIntSliceIntOut($in: { [_: `${number}`]: number[] | null } | null): Promise<{ [_: `${number}`]: number[] | null } | null> & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.MapIntSliceIntInMapIntSliceIntOut", $in) as any; - return $resultPromise; +export function MapIntSliceIntInMapIntSliceIntOut($in: { [_: `${number}`]: number[] | null } | null): $CancellablePromise<{ [_: `${number}`]: number[] | null } | null> { + return $Call.ByName("main.GreetService.MapIntSliceIntInMapIntSliceIntOut", $in); } -export function NoInputsStringOut(): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.NoInputsStringOut") as any; - return $resultPromise; +export function NoInputsStringOut(): $CancellablePromise { + return $Call.ByName("main.GreetService.NoInputsStringOut"); } -export function PointerBoolInBoolOut($in: boolean | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.PointerBoolInBoolOut", $in) as any; - return $resultPromise; +export function PointerBoolInBoolOut($in: boolean | null): $CancellablePromise { + return $Call.ByName("main.GreetService.PointerBoolInBoolOut", $in); } -export function PointerFloat32InFloat32Out($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.PointerFloat32InFloat32Out", $in) as any; - return $resultPromise; +export function PointerFloat32InFloat32Out($in: number | null): $CancellablePromise { + return $Call.ByName("main.GreetService.PointerFloat32InFloat32Out", $in); } -export function PointerFloat64InFloat64Out($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.PointerFloat64InFloat64Out", $in) as any; - return $resultPromise; +export function PointerFloat64InFloat64Out($in: number | null): $CancellablePromise { + return $Call.ByName("main.GreetService.PointerFloat64InFloat64Out", $in); } -export function PointerMapIntInt($in: { [_: `${number}`]: number } | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.PointerMapIntInt", $in) as any; - return $resultPromise; +export function PointerMapIntInt($in: { [_: `${number}`]: number } | null): $CancellablePromise { + return $Call.ByName("main.GreetService.PointerMapIntInt", $in); } -export function PointerStringInStringOut($in: string | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.PointerStringInStringOut", $in) as any; - return $resultPromise; +export function PointerStringInStringOut($in: string | null): $CancellablePromise { + return $Call.ByName("main.GreetService.PointerStringInStringOut", $in); } -export function StringArrayInputNamedOutput($in: string[] | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.StringArrayInputNamedOutput", $in) as any; - return $resultPromise; +export function StringArrayInputNamedOutput($in: string[] | null): $CancellablePromise { + return $Call.ByName("main.GreetService.StringArrayInputNamedOutput", $in); } -export function StringArrayInputNamedOutputs($in: string[] | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.StringArrayInputNamedOutputs", $in) as any; - return $resultPromise; +export function StringArrayInputNamedOutputs($in: string[] | null): $CancellablePromise { + return $Call.ByName("main.GreetService.StringArrayInputNamedOutputs", $in); } -export function StringArrayInputStringArrayOut($in: string[] | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.StringArrayInputStringArrayOut", $in) as any; - return $resultPromise; +export function StringArrayInputStringArrayOut($in: string[] | null): $CancellablePromise { + return $Call.ByName("main.GreetService.StringArrayInputStringArrayOut", $in); } -export function StringArrayInputStringOut($in: string[] | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.StringArrayInputStringOut", $in) as any; - return $resultPromise; +export function StringArrayInputStringOut($in: string[] | null): $CancellablePromise { + return $Call.ByName("main.GreetService.StringArrayInputStringOut", $in); } -export function StructInputStructOutput($in: $models.Person): Promise<$models.Person> & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.StructInputStructOutput", $in) as any; - return $resultPromise; +export function StructInputStructOutput($in: $models.Person): $CancellablePromise<$models.Person> { + return $Call.ByName("main.GreetService.StructInputStructOutput", $in); } -export function StructPointerInputErrorOutput($in: $models.Person | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.StructPointerInputErrorOutput", $in) as any; - return $resultPromise; +export function StructPointerInputErrorOutput($in: $models.Person | null): $CancellablePromise { + return $Call.ByName("main.GreetService.StructPointerInputErrorOutput", $in); } -export function StructPointerInputStructPointerOutput($in: $models.Person | null): Promise<$models.Person | null> & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.StructPointerInputStructPointerOutput", $in) as any; - return $resultPromise; +export function StructPointerInputStructPointerOutput($in: $models.Person | null): $CancellablePromise<$models.Person | null> { + return $Call.ByName("main.GreetService.StructPointerInputStructPointerOutput", $in); } -export function UInt16InUIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.UInt16InUIntOut", $in) as any; - return $resultPromise; +export function UInt16InUIntOut($in: number): $CancellablePromise { + return $Call.ByName("main.GreetService.UInt16InUIntOut", $in); } -export function UInt16PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.UInt16PointerInAndOutput", $in) as any; - return $resultPromise; +export function UInt16PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByName("main.GreetService.UInt16PointerInAndOutput", $in); } -export function UInt32InUIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.UInt32InUIntOut", $in) as any; - return $resultPromise; +export function UInt32InUIntOut($in: number): $CancellablePromise { + return $Call.ByName("main.GreetService.UInt32InUIntOut", $in); } -export function UInt32PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.UInt32PointerInAndOutput", $in) as any; - return $resultPromise; +export function UInt32PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByName("main.GreetService.UInt32PointerInAndOutput", $in); } -export function UInt64InUIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.UInt64InUIntOut", $in) as any; - return $resultPromise; +export function UInt64InUIntOut($in: number): $CancellablePromise { + return $Call.ByName("main.GreetService.UInt64InUIntOut", $in); } -export function UInt64PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.UInt64PointerInAndOutput", $in) as any; - return $resultPromise; +export function UInt64PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByName("main.GreetService.UInt64PointerInAndOutput", $in); } -export function UInt8InUIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.UInt8InUIntOut", $in) as any; - return $resultPromise; +export function UInt8InUIntOut($in: number): $CancellablePromise { + return $Call.ByName("main.GreetService.UInt8InUIntOut", $in); } -export function UInt8PointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.UInt8PointerInAndOutput", $in) as any; - return $resultPromise; +export function UInt8PointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByName("main.GreetService.UInt8PointerInAndOutput", $in); } -export function UIntInUIntOut($in: number): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.UIntInUIntOut", $in) as any; - return $resultPromise; +export function UIntInUIntOut($in: number): $CancellablePromise { + return $Call.ByName("main.GreetService.UIntInUIntOut", $in); } -export function UIntPointerInAndOutput($in: number | null): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.UIntPointerInAndOutput", $in) as any; - return $resultPromise; +export function UIntPointerInAndOutput($in: number | null): $CancellablePromise { + return $Call.ByName("main.GreetService.UIntPointerInAndOutput", $in); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single/greetservice.ts index f817be3c7..80bebe425 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single/greetservice.ts @@ -8,12 +8,11 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; /** * Greet someone */ -export function Greet(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Greet", name) as any; - return $resultPromise; +export function Greet(name: string): $CancellablePromise { + return $Call.ByName("main.GreetService.Greet", name); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_function/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_function/greetservice.ts index f817be3c7..80bebe425 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_function/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_function/greetservice.ts @@ -8,12 +8,11 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; /** * Greet someone */ -export function Greet(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Greet", name) as any; - return $resultPromise; +export function Greet(name: string): $CancellablePromise { + return $Call.ByName("main.GreetService.Greet", name); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/greetservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/greetservice.ts index 4602f3a69..5a8e9adc3 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/greetservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/greetservice.ts @@ -8,7 +8,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -17,15 +17,13 @@ import * as $models from "./models.js"; /** * Greet does XYZ */ -export function Greet(name: string): Promise & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.Greet", name) as any; - return $resultPromise; +export function Greet(name: string): $CancellablePromise { + return $Call.ByName("main.GreetService.Greet", name); } /** * NewPerson creates a new person */ -export function NewPerson(name: string): Promise<$models.Person | null> & { cancel(): void } { - let $resultPromise = $Call.ByName("main.GreetService.NewPerson", name) as any; - return $resultPromise; +export function NewPerson(name: string): $CancellablePromise<$models.Person | null> { + return $Call.ByName("main.GreetService.NewPerson", name); } diff --git a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/services/otherservice.ts b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/services/otherservice.ts index 6af5a977a..c93f85314 100644 --- a/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/services/otherservice.ts +++ b/v3/internal/generator/testdata/output/lang=TS/UseInterfaces=true/UseNames=true/github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/services/otherservice.ts @@ -9,7 +9,7 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports -import {Call as $Call} from "/wails/runtime.js"; +import { Call as $Call, CancellablePromise as $CancellablePromise } from "/wails/runtime.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore: Unused imports @@ -18,7 +18,6 @@ import * as $models from "./models.js"; /** * Yay does this and that */ -export function Yay(): Promise<$models.Address | null> & { cancel(): void } { - let $resultPromise = $Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/services.OtherService.Yay") as any; - return $resultPromise; +export function Yay(): $CancellablePromise<$models.Address | null> { + return $Call.ByName("github.com/wailsapp/wails/v3/internal/generator/testcases/variable_single_from_other_function/services.OtherService.Yay"); } From 69b11109acc4689171fa476250b81607c367693b Mon Sep 17 00:00:00 2001 From: Fabio Massaioli Date: Fri, 28 Feb 2025 01:35:30 +0100 Subject: [PATCH 114/374] Smarter publish pipeline --- .github/workflows/build-and-test-v3.yml | 44 --------- .github/workflows/publish-npm.yml | 114 +++++++++++++++++------- 2 files changed, 84 insertions(+), 74 deletions(-) diff --git a/.github/workflows/build-and-test-v3.yml b/.github/workflows/build-and-test-v3.yml index 4f3812624..54a0a280c 100644 --- a/.github/workflows/build-and-test-v3.yml +++ b/.github/workflows/build-and-test-v3.yml @@ -26,50 +26,6 @@ jobs: echo "approved=false" >> $GITHUB_OUTPUT fi - check_build_artifacts: - name: Check runtime build artifact changes - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v4 - with: - persist-credentials: 'true' - - - name: Get changed files - id: changed-files - uses: tj-actions/changed-files@v45 - with: - files: | - v3/internal/runtime/desktop/@wailsio/runtime/dist/** - v3/internal/runtime/desktop/@wailsio/runtime/types/** - - - name: Get merge base - id: merge-base - if: steps.changed-files.outputs.any_changed == 'true' - env: - BASE_SHA: ${{github.event.pull_request.base.sha}} - HEAD_SHA: ${{github.event.pull_request.head.sha}} - run: | - echo "sha=$(git merge-base "$BASE_SHA" "$HEAD_SHA")" >> $GITHUB_OUTPUT - - - name: This PR includes changes to runtime build artifacts - uses: actions/github-script@v7 - if: steps.changed-files.outputs.any_changed == 'true' - env: - MERGE_BASE_SHA: ${{steps.merge-base.outputs.sha}} - with: - script: | - process.exitCode = 1 - core.error( - 'The CI pipeline will rebuild and publish the runtime automatically.\n' + - 'Please run the following command (or equivalent) in your local wails repo\n' + - 'to revert all build artifact changes; then update the PR:\n\n' + - ' cd v3/internal/runtime/desktop/@wailsio/runtime &&\n' + - ` git restore -s ${process.env.MERGE_BASE_SHA} -W -S -- dist types &&\n` + - ' git commit -m "Revert build artifact changes"\n', - { title: 'This PR includes changes to runtime build artifacts' } - ); - test_js: name: Run JS Tests needs: check_approval diff --git a/.github/workflows/publish-npm.yml b/.github/workflows/publish-npm.yml index cdf794a2b..b91f76c46 100644 --- a/.github/workflows/publish-npm.yml +++ b/.github/workflows/publish-npm.yml @@ -3,11 +3,68 @@ on: branches: ['v3-alpha'] workflow_dispatch: +concurrency: + group: publish-npm-v3 + cancel-in-progress: true + jobs: - publish: + detect: + name: Detect committed changes + if: github.event_name != 'workflow_dispatch' + outputs: + rebuild: ${{ steps.source-changes.outputs.any_modified == 'true' }} + publish: ${{ steps.package-json-changes.outputs.any_modified == 'true' || steps.build-artifact-changes.outputs.any_modified == 'true' }} runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - name: Checkout code + uses: actions/checkout@v4 + with: + ref: ${{ github.sha }} + persist-credentials: 'true' + + - name: Detect committed package.json changes + id: package-json-changes + uses: tj-actions/changed-files@v45 + with: + files: | + v3/internal/runtime/desktop/@wailsio/runtime/package.json + + - name: Detect committed build artifact changes + if: steps.package-json-changes.outputs.any_modified != 'true' + id: build-artifact-changes + uses: tj-actions/changed-files@v45 + with: + files: | + v3/internal/runtime/desktop/@wailsio/runtime/dist/** + v3/internal/runtime/desktop/@wailsio/runtime/types/** + + - name: Detect committed source changes + if: >- + steps.package-json-changes.outputs.any_modified != 'true' + && steps.build-artifact-changes.outputs.any_modified != 'true' + id: source-changes + uses: tj-actions/changed-files@v45 + with: + files: | + v3/internal/runtime/Taskfile.yaml + v3/internal/runtime/desktop/@wailsio/compiled/main.js + v3/internal/runtime/desktop/@wailsio/runtime/tsconfig.json + v3/internal/runtime/desktop/@wailsio/runtime/src/** + v3/pkg/events/events.txt + v3/tasks/events/** + + rebuild_and_publish: + name: Rebuild and publish + needs: [detect] + if: >- + !failure() && !cancelled() + && (github.event_name == 'workflow_dispatch' || needs.detect.outputs.publish == 'true' || needs.detect.outputs.rebuild == 'true') + env: + publish: ${{ github.event_name == 'workflow_dispatch' || needs.detect.outputs.publish == 'true' }} + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 with: fetch-depth: 0 ref: 'v3-alpha' @@ -49,48 +106,45 @@ jobs: npm test npm run build - - name: Detect npm package changes + - name: Detect build artifact changes + if: env.publish != 'true' uses: tj-actions/verify-changed-files@v20 - id: package-changes - with: - files: | - v3/internal/runtime/desktop/@wailsio/runtime/dist/** - v3/internal/runtime/desktop/@wailsio/runtime/types/** + id: build-artifact-changes + with: | + v3/internal/runtime/desktop/@wailsio/runtime/dist/** + v3/internal/runtime/desktop/@wailsio/runtime/types/** + + - name: Publish required? + id: publish-required + env: + required: ${{ env.publish == 'true' || steps.build-artifact-changes.outputs.files_changed == 'true' }} + run: echo "required=$required" >> "$GITHUB_OUTPUT" - name: Bump version - if: github.event_name == 'workflow_dispatch' || steps.package-changes.outputs.files_changed == 'true' + if: steps.publish-required.outputs.required == 'true' id: bump-version working-directory: v3/internal/runtime/desktop/@wailsio/runtime run: | - echo "version=$(npm version prerelease)" >> $GITHUB_OUTPUT + echo "version=$(npm --no-git-tag-version --force version prerelease)" >> "$GITHUB_OUTPUT" - name: Commit changes - if: github.event_name == 'workflow_dispatch' || steps.package-changes.outputs.files_changed == 'true' + env: + new_version: ${{ steps.publish-required.outputs.required }} run: | git add . - git commit -m "[skip ci] Publish @wailsio/runtime ${{ steps.bump-version.outputs.version }}" - git push + if git diff --cached --quiet; then + if [ "$new_version" = "true" ]; then + git commit -m "[skip ci] Publish @wailsio/runtime ${{ steps.bump-version.outputs.version }}" + else + git commit -m "[skip ci] Update runtime docs and bundle" + fi + git push + fi - name: Publish npm package uses: JS-DevTools/npm-publish@v3 - if: github.event_name == 'workflow_dispatch' || steps.package-changes.outputs.files_changed == 'true' + if: steps.publish-required.outputs.required == 'true' with: package: v3/internal/runtime/desktop/@wailsio/runtime access: public token: ${{ secrets.NPM_TOKEN }} - - - name: Detect docs and bundled runtime changes - if: github.event_name != 'workflow_dispatch' && steps.package-changes.outputs.files_changed != 'true' - uses: tj-actions/verify-changed-files@v20 - id: docs-bundle-changes - with: - files: | - v3/internal/assetserver/bundledassets/** - v3/internal/runtime/desktop/@wailsio/runtime/docs/** - - - name: Commit docs and bundled runtime changes - if: github.event_name != 'workflow_dispatch' && steps.package-changes.outputs.files_changed != 'true' && steps.docs-bundle-changes.outputs.files_changed == 'true' - run: | - git add . - git commit -m "[skip ci] Update runtime docs and bundle" - git push From 5b6fd04b09bfa0d8d84bab9cb4219786302c912c Mon Sep 17 00:00:00 2001 From: Fabio Massaioli Date: Fri, 28 Feb 2025 22:22:30 +0100 Subject: [PATCH 115/374] Stop typedoc noise --- v3/internal/runtime/desktop/@wailsio/runtime/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/package.json b/v3/internal/runtime/desktop/@wailsio/runtime/package.json index 495abe27b..09d9f8d96 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/package.json +++ b/v3/internal/runtime/desktop/@wailsio/runtime/package.json @@ -36,8 +36,8 @@ "generate": "npm run generate:events", "prebuild": "npm run clean && npm run generate", "build:code": "npx tsc", - "build:docs": "npx typedoc --plugin typedoc-plugin-mdn-links --plugin typedoc-plugin-missing-exports ./src/index.ts", - "build:docs:md": "npx typedoc --plugin typedoc-plugin-markdown --plugin typedoc-plugin-mdn-links --plugin typedoc-plugin-missing-exports ./src/index.ts", + "build:docs": "npx typedoc --gitRevision v3-alpha --plugin typedoc-plugin-mdn-links --plugin typedoc-plugin-missing-exports ./src/index.ts", + "build:docs:md": "npx typedoc --gitRevision v3-alpha --plugin typedoc-plugin-markdown --plugin typedoc-plugin-mdn-links --plugin typedoc-plugin-missing-exports ./src/index.ts", "build": "npm run build:code & npm run build:docs & wait", "prepack": "npm run build" }, From 7c56c4ce007510b46350f9ec20cca2cefa61b085 Mon Sep 17 00:00:00 2001 From: Fabio Massaioli Date: Fri, 28 Feb 2025 22:22:41 +0100 Subject: [PATCH 116/374] Remove build artifacts --- .../@wailsio/runtime/dist/application.js | 32 - .../desktop/@wailsio/runtime/dist/browser.js | 20 - .../desktop/@wailsio/runtime/dist/callable.js | 144 ---- .../desktop/@wailsio/runtime/dist/calls.js | 194 ----- .../@wailsio/runtime/dist/cancellable.js | 792 ------------------ .../@wailsio/runtime/dist/clipboard.js | 30 - .../@wailsio/runtime/dist/contextmenu.js | 80 -- .../desktop/@wailsio/runtime/dist/create.js | 94 --- .../desktop/@wailsio/runtime/dist/dialogs.js | 134 --- .../desktop/@wailsio/runtime/dist/drag.js | 222 ----- .../@wailsio/runtime/dist/event_types.js | 229 ----- .../desktop/@wailsio/runtime/dist/events.js | 101 --- .../desktop/@wailsio/runtime/dist/flags.js | 23 - .../desktop/@wailsio/runtime/dist/index.js | 38 - .../desktop/@wailsio/runtime/dist/listener.js | 44 - .../desktop/@wailsio/runtime/dist/nanoid.js | 38 - .../desktop/@wailsio/runtime/dist/runtime.js | 63 -- .../desktop/@wailsio/runtime/dist/screens.js | 38 - .../desktop/@wailsio/runtime/dist/system.js | 116 --- .../desktop/@wailsio/runtime/dist/utils.js | 95 --- .../desktop/@wailsio/runtime/dist/window.js | 438 ---------- .../desktop/@wailsio/runtime/dist/wml.js | 179 ---- .../@wailsio/runtime/types/application.d.ts | 12 - .../@wailsio/runtime/types/browser.d.ts | 6 - .../@wailsio/runtime/types/callable.d.ts | 3 - .../desktop/@wailsio/runtime/types/calls.d.ts | 63 -- .../@wailsio/runtime/types/cancellable.d.ts | 434 ---------- .../@wailsio/runtime/types/clipboard.d.ts | 13 - .../@wailsio/runtime/types/contextmenu.d.ts | 1 - .../@wailsio/runtime/types/create.d.ts | 31 - .../@wailsio/runtime/types/dialogs.d.ts | 140 ---- .../desktop/@wailsio/runtime/types/drag.d.ts | 1 - .../@wailsio/runtime/types/event_types.d.ts | 218 ----- .../@wailsio/runtime/types/events.d.ts | 66 -- .../desktop/@wailsio/runtime/types/flags.d.ts | 7 - .../desktop/@wailsio/runtime/types/index.d.ts | 16 - .../@wailsio/runtime/types/listener.d.ts | 9 - .../@wailsio/runtime/types/nanoid.d.ts | 1 - .../@wailsio/runtime/types/runtime.d.ts | 22 - .../@wailsio/runtime/types/screens.d.ts | 60 -- .../@wailsio/runtime/types/system.d.ts | 83 -- .../desktop/@wailsio/runtime/types/utils.d.ts | 21 - .../@wailsio/runtime/types/window.d.ts | 292 ------- .../desktop/@wailsio/runtime/types/wml.d.ts | 8 - 44 files changed, 4651 deletions(-) delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/dist/application.js delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/dist/browser.js delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/dist/callable.js delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/dist/calls.js delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/dist/cancellable.js delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/dist/clipboard.js delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/dist/contextmenu.js delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/dist/create.js delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/dist/dialogs.js delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/dist/drag.js delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/dist/event_types.js delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/dist/events.js delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/dist/flags.js delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/dist/index.js delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/dist/listener.js delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/dist/nanoid.js delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/dist/runtime.js delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/dist/screens.js delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/dist/system.js delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/dist/utils.js delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/dist/window.js delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/dist/wml.js delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/types/application.d.ts delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/types/browser.d.ts delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/types/callable.d.ts delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/types/calls.d.ts delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/types/cancellable.d.ts delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/types/clipboard.d.ts delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/types/contextmenu.d.ts delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/types/create.d.ts delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/types/dialogs.d.ts delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/types/drag.d.ts delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/types/event_types.d.ts delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/types/events.d.ts delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/types/flags.d.ts delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/types/index.d.ts delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/types/listener.d.ts delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/types/nanoid.d.ts delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/types/runtime.d.ts delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/types/screens.d.ts delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/types/system.d.ts delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/types/utils.d.ts delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/types/window.d.ts delete mode 100644 v3/internal/runtime/desktop/@wailsio/runtime/types/wml.d.ts diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/dist/application.js b/v3/internal/runtime/desktop/@wailsio/runtime/dist/application.js deleted file mode 100644 index a017d4aa4..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/dist/application.js +++ /dev/null @@ -1,32 +0,0 @@ -/* - _ __ _ __ -| | / /___ _(_) /____ -| | /| / / __ `/ / / ___/ -| |/ |/ / /_/ / / (__ ) -|__/|__/\__,_/_/_/____/ -The electron alternative for Go -(c) Lea Anthony 2019-present -*/ -import { newRuntimeCaller, objectNames } from "./runtime.js"; -const call = newRuntimeCaller(objectNames.Application); -const HideMethod = 0; -const ShowMethod = 1; -const QuitMethod = 2; -/** - * Hides a certain method by calling the HideMethod function. - */ -export function Hide() { - return call(HideMethod); -} -/** - * Calls the ShowMethod and returns the result. - */ -export function Show() { - return call(ShowMethod); -} -/** - * Calls the QuitMethod to terminate the program. - */ -export function Quit() { - return call(QuitMethod); -} diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/dist/browser.js b/v3/internal/runtime/desktop/@wailsio/runtime/dist/browser.js deleted file mode 100644 index 633989016..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/dist/browser.js +++ /dev/null @@ -1,20 +0,0 @@ -/* - _ __ _ __ -| | / /___ _(_) /____ -| | /| / / __ `/ / / ___/ -| |/ |/ / /_/ / / (__ ) -|__/|__/\__,_/_/_/____/ -The electron alternative for Go -(c) Lea Anthony 2019-present -*/ -import { newRuntimeCaller, objectNames } from "./runtime.js"; -const call = newRuntimeCaller(objectNames.Browser); -const BrowserOpenURL = 0; -/** - * Open a browser window to the given URL. - * - * @param url - The URL to open - */ -export function OpenURL(url) { - return call(BrowserOpenURL, { url: url.toString() }); -} diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/dist/callable.js b/v3/internal/runtime/desktop/@wailsio/runtime/dist/callable.js deleted file mode 100644 index c38273532..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/dist/callable.js +++ /dev/null @@ -1,144 +0,0 @@ -// Source: https://github.com/inspect-js/is-callable -// The MIT License (MIT) -// -// Copyright (c) 2015 Jordan Harband -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. -var fnToStr = Function.prototype.toString; -var reflectApply = typeof Reflect === 'object' && Reflect !== null && Reflect.apply; -var badArrayLike; -var isCallableMarker; -if (typeof reflectApply === 'function' && typeof Object.defineProperty === 'function') { - try { - badArrayLike = Object.defineProperty({}, 'length', { - get: function () { - throw isCallableMarker; - } - }); - isCallableMarker = {}; - // eslint-disable-next-line no-throw-literal - reflectApply(function () { throw 42; }, null, badArrayLike); - } - catch (_) { - if (_ !== isCallableMarker) { - reflectApply = null; - } - } -} -else { - reflectApply = null; -} -var constructorRegex = /^\s*class\b/; -var isES6ClassFn = function isES6ClassFunction(value) { - try { - var fnStr = fnToStr.call(value); - return constructorRegex.test(fnStr); - } - catch (e) { - return false; // not a function - } -}; -var tryFunctionObject = function tryFunctionToStr(value) { - try { - if (isES6ClassFn(value)) { - return false; - } - fnToStr.call(value); - return true; - } - catch (e) { - return false; - } -}; -var toStr = Object.prototype.toString; -var objectClass = '[object Object]'; -var fnClass = '[object Function]'; -var genClass = '[object GeneratorFunction]'; -var ddaClass = '[object HTMLAllCollection]'; // IE 11 -var ddaClass2 = '[object HTML document.all class]'; -var ddaClass3 = '[object HTMLCollection]'; // IE 9-10 -var hasToStringTag = typeof Symbol === 'function' && !!Symbol.toStringTag; // better: use `has-tostringtag` -var isIE68 = !(0 in [,]); // eslint-disable-line no-sparse-arrays, comma-spacing -var isDDA = function isDocumentDotAll() { return false; }; -if (typeof document === 'object') { - // Firefox 3 canonicalizes DDA to undefined when it's not accessed directly - var all = document.all; - if (toStr.call(all) === toStr.call(document.all)) { - isDDA = function isDocumentDotAll(value) { - /* globals document: false */ - // in IE 6-8, typeof document.all is "object" and it's truthy - if ((isIE68 || !value) && (typeof value === 'undefined' || typeof value === 'object')) { - try { - var str = toStr.call(value); - return (str === ddaClass - || str === ddaClass2 - || str === ddaClass3 // opera 12.16 - || str === objectClass // IE 6-8 - ) && value('') == null; // eslint-disable-line eqeqeq - } - catch (e) { /**/ } - } - return false; - }; - } -} -function isCallableRefApply(value) { - if (isDDA(value)) { - return true; - } - if (!value) { - return false; - } - if (typeof value !== 'function' && typeof value !== 'object') { - return false; - } - try { - reflectApply(value, null, badArrayLike); - } - catch (e) { - if (e !== isCallableMarker) { - return false; - } - } - return !isES6ClassFn(value) && tryFunctionObject(value); -} -function isCallableNoRefApply(value) { - if (isDDA(value)) { - return true; - } - if (!value) { - return false; - } - if (typeof value !== 'function' && typeof value !== 'object') { - return false; - } - if (hasToStringTag) { - return tryFunctionObject(value); - } - if (isES6ClassFn(value)) { - return false; - } - var strClass = toStr.call(value); - if (strClass !== fnClass && strClass !== genClass && !(/^\[object HTML/).test(strClass)) { - return false; - } - return tryFunctionObject(value); -} -; -export default reflectApply ? isCallableRefApply : isCallableNoRefApply; diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/dist/calls.js b/v3/internal/runtime/desktop/@wailsio/runtime/dist/calls.js deleted file mode 100644 index a6777fa42..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/dist/calls.js +++ /dev/null @@ -1,194 +0,0 @@ -/* - _ __ _ __ -| | / /___ _(_) /____ -| | /| / / __ `/ / / ___/ -| |/ |/ / /_/ / / (__ ) -|__/|__/\__,_/_/_/____/ -The electron alternative for Go -(c) Lea Anthony 2019-present -*/ -import { CancellablePromise } from "./cancellable.js"; -import { newRuntimeCaller, objectNames } from "./runtime.js"; -import { nanoid } from "./nanoid.js"; -// Setup -window._wails = window._wails || {}; -window._wails.callResultHandler = resultHandler; -window._wails.callErrorHandler = errorHandler; -const call = newRuntimeCaller(objectNames.Call); -const cancelCall = newRuntimeCaller(objectNames.CancelCall); -const callResponses = new Map(); -const CallBinding = 0; -const CancelMethod = 0; -/** - * Exception class that will be thrown in case the bound method returns an error. - * The value of the {@link RuntimeError#name} property is "RuntimeError". - */ -export class RuntimeError extends Error { - /** - * Constructs a new RuntimeError instance. - * @param message - The error message. - * @param options - Options to be forwarded to the Error constructor. - */ - constructor(message, options) { - super(message, options); - this.name = "RuntimeError"; - } -} -/** - * Handles the result of a call request. - * - * @param id - The id of the request to handle the result for. - * @param data - The result data of the request. - * @param isJSON - Indicates whether the data is JSON or not. - */ -function resultHandler(id, data, isJSON) { - const resolvers = getAndDeleteResponse(id); - if (!resolvers) { - return; - } - if (!data) { - resolvers.resolve(undefined); - } - else if (!isJSON) { - resolvers.resolve(data); - } - else { - try { - resolvers.resolve(JSON.parse(data)); - } - catch (err) { - resolvers.reject(new TypeError("could not parse result: " + err.message, { cause: err })); - } - } -} -/** - * Handles the error from a call request. - * - * @param id - The id of the promise handler. - * @param data - The error data to reject the promise handler with. - * @param isJSON - Indicates whether the data is JSON or not. - */ -function errorHandler(id, data, isJSON) { - const resolvers = getAndDeleteResponse(id); - if (!resolvers) { - return; - } - if (!isJSON) { - resolvers.reject(new Error(data)); - } - else { - let error; - try { - error = JSON.parse(data); - } - catch (err) { - resolvers.reject(new TypeError("could not parse error: " + err.message, { cause: err })); - return; - } - let options = {}; - if (error.cause) { - options.cause = error.cause; - } - let exception; - switch (error.kind) { - case "ReferenceError": - exception = new ReferenceError(error.message, options); - break; - case "TypeError": - exception = new TypeError(error.message, options); - break; - case "RuntimeError": - exception = new RuntimeError(error.message, options); - break; - default: - exception = new Error(error.message, options); - break; - } - resolvers.reject(exception); - } -} -/** - * Retrieves and removes the response associated with the given ID from the callResponses map. - * - * @param id - The ID of the response to be retrieved and removed. - * @returns The response object associated with the given ID, if any. - */ -function getAndDeleteResponse(id) { - const response = callResponses.get(id); - callResponses.delete(id); - return response; -} -/** - * Generates a unique ID using the nanoid library. - * - * @returns A unique ID that does not exist in the callResponses set. - */ -function generateID() { - let result; - do { - result = nanoid(); - } while (callResponses.has(result)); - return result; -} -/** - * Call a bound method according to the given call options. - * - * In case of failure, the returned promise will reject with an exception - * among ReferenceError (unknown method), TypeError (wrong argument count or type), - * {@link RuntimeError} (method returned an error), or other (network or internal errors). - * The exception might have a "cause" field with the value returned - * by the application- or service-level error marshaling functions. - * - * @param options - A method call descriptor. - * @returns The result of the call. - */ -export function Call(options) { - const id = generateID(); - const result = CancellablePromise.withResolvers(); - callResponses.set(id, { resolve: result.resolve, reject: result.reject }); - const request = call(CallBinding, Object.assign({ "call-id": id }, options)); - let running = false; - request.then(() => { - running = true; - }, (err) => { - callResponses.delete(id); - result.reject(err); - }); - const cancel = () => { - callResponses.delete(id); - return cancelCall(CancelMethod, { "call-id": id }).catch((err) => { - console.error("Error while requesting binding call cancellation:", err); - }); - }; - result.oncancelled = () => { - if (running) { - return cancel(); - } - else { - return request.then(cancel); - } - }; - return result.promise; -} -/** - * Calls a bound method by name with the specified arguments. - * See {@link Call} for details. - * - * @param methodName - The name of the method in the format 'package.struct.method'. - * @param args - The arguments to pass to the method. - * @returns The result of the method call. - */ -export function ByName(methodName, ...args) { - return Call({ methodName, args }); -} -/** - * Calls a method by its numeric ID with the specified arguments. - * See {@link Call} for details. - * - * @param methodID - The ID of the method to call. - * @param args - The arguments to pass to the method. - * @return The result of the method call. - */ -export function ByID(methodID, ...args) { - return Call({ methodID, args }); -} diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/dist/cancellable.js b/v3/internal/runtime/desktop/@wailsio/runtime/dist/cancellable.js deleted file mode 100644 index 834cb9412..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/dist/cancellable.js +++ /dev/null @@ -1,792 +0,0 @@ -/* - _ __ _ __ -| | / /___ _(_) /____ -| | /| / / __ `/ / / ___/ -| |/ |/ / /_/ / / (__ ) -|__/|__/\__,_/_/_/____/ -The electron alternative for Go -(c) Lea Anthony 2019-present -*/ -var _a; -import isCallable from "./callable.js"; -/** - * Exception class that will be used as rejection reason - * in case a {@link CancellablePromise} is cancelled successfully. - * - * The value of the {@link name} property is the string `"CancelError"`. - * The value of the {@link cause} property is the cause passed to the cancel method, if any. - */ -export class CancelError extends Error { - /** - * Constructs a new `CancelError` instance. - * @param message - The error message. - * @param options - Options to be forwarded to the Error constructor. - */ - constructor(message, options) { - super(message, options); - this.name = "CancelError"; - } -} -/** - * Exception class that will be reported as an unhandled rejection - * in case a {@link CancellablePromise} rejects after being cancelled, - * or when the `oncancelled` callback throws or rejects. - * - * The value of the {@link name} property is the string `"CancelledRejectionError"`. - * The value of the {@link cause} property is the reason the promise rejected with. - * - * Because the original promise was cancelled, - * a wrapper promise will be passed to the unhandled rejection listener instead. - * The {@link promise} property holds a reference to the original promise. - */ -export class CancelledRejectionError extends Error { - /** - * Constructs a new `CancelledRejectionError` instance. - * @param promise - The promise that caused the error originally. - * @param reason - The rejection reason. - * @param info - An optional informative message specifying the circumstances in which the error was thrown. - * Defaults to the string `"Unhandled rejection in cancelled promise."`. - */ - constructor(promise, reason, info) { - super((info !== null && info !== void 0 ? info : "Unhandled rejection in cancelled promise.") + " Reason: " + errorMessage(reason), { cause: reason }); - this.promise = promise; - this.name = "CancelledRejectionError"; - } -} -// Private field names. -const barrierSym = Symbol("barrier"); -const cancelImplSym = Symbol("cancelImpl"); -const species = (_a = Symbol.species) !== null && _a !== void 0 ? _a : Symbol("speciesPolyfill"); -/** - * A promise with an attached method for cancelling long-running operations (see {@link CancellablePromise#cancel}). - * Cancellation can optionally be bound to an {@link AbortSignal} - * for better composability (see {@link CancellablePromise#cancelOn}). - * - * Cancelling a pending promise will result in an immediate rejection - * with an instance of {@link CancelError} as reason, - * but whoever started the promise will be responsible - * for actually aborting the underlying operation. - * To this purpose, the constructor and all chaining methods - * accept optional cancellation callbacks. - * - * If a `CancellablePromise` still resolves after having been cancelled, - * the result will be discarded. If it rejects, the reason - * will be reported as an unhandled rejection, - * wrapped in a {@link CancelledRejectionError} instance. - * To facilitate the handling of cancellation requests, - * cancelled `CancellablePromise`s will _not_ report unhandled `CancelError`s - * whose `cause` field is the same as the one with which the current promise was cancelled. - * - * All usual promise methods are defined and return a `CancellablePromise` - * whose cancel method will cancel the parent operation as well, propagating the cancellation reason - * upwards through promise chains. - * Conversely, cancelling a promise will not automatically cancel dependent promises downstream: - * ```ts - * let root = new CancellablePromise((resolve, reject) => { ... }); - * let child1 = root.then(() => { ... }); - * let child2 = child1.then(() => { ... }); - * let child3 = root.catch(() => { ... }); - * child1.cancel(); // Cancels child1 and root, but not child2 or child3 - * ``` - * Cancelling a promise that has already settled is safe and has no consequence. - * - * The `cancel` method returns a promise that _always fulfills_ - * after the whole chain has processed the cancel request - * and all attached callbacks up to that moment have run. - * - * All ES2024 promise methods (static and instance) are defined on CancellablePromise, - * but actual availability may vary with OS/webview version. - * - * In line with the proposal at https://github.com/tc39/proposal-rm-builtin-subclassing, - * `CancellablePromise` does not support transparent subclassing. - * Extenders should take care to provide their own method implementations. - * This might be reconsidered in case the proposal is retired. - * - * CancellablePromise is a wrapper around the DOM Promise object - * and is compliant with the [Promises/A+ specification](https://promisesaplus.com/) - * (it passes the [compliance suite](https://github.com/promises-aplus/promises-tests)) - * if so is the underlying implementation. - */ -export class CancellablePromise extends Promise { - /** - * Creates a new `CancellablePromise`. - * - * @param executor - A callback used to initialize the promise. This callback is passed two arguments: - * a `resolve` callback used to resolve the promise with a value - * or the result of another promise (possibly cancellable), - * and a `reject` callback used to reject the promise with a provided reason or error. - * If the value provided to the `resolve` callback is a thenable _and_ cancellable object - * (it has a `then` _and_ a `cancel` method), - * cancellation requests will be forwarded to that object and the oncancelled will not be invoked anymore. - * If any one of the two callbacks is called _after_ the promise has been cancelled, - * the provided values will be cancelled and resolved as usual, - * but their results will be discarded. - * However, if the resolution process ultimately ends up in a rejection - * that is not due to cancellation, the rejection reason - * will be wrapped in a {@link CancelledRejectionError} - * and bubbled up as an unhandled rejection. - * @param oncancelled - It is the caller's responsibility to ensure that any operation - * started by the executor is properly halted upon cancellation. - * This optional callback can be used to that purpose. - * It will be called _synchronously_ with a cancellation cause - * when cancellation is requested, _after_ the promise has already rejected - * with a {@link CancelError}, but _before_ - * any {@link then}/{@link catch}/{@link finally} callback runs. - * If the callback returns a thenable, the promise returned from {@link cancel} - * will only fulfill after the former has settled. - * Unhandled exceptions or rejections from the callback will be wrapped - * in a {@link CancelledRejectionError} and bubbled up as unhandled rejections. - * If the `resolve` callback is called before cancellation with a cancellable promise, - * cancellation requests on this promise will be diverted to that promise, - * and the original `oncancelled` callback will be discarded. - */ - constructor(executor, oncancelled) { - let resolve; - let reject; - super((res, rej) => { resolve = res; reject = rej; }); - if (this.constructor[species] !== Promise) { - throw new TypeError("CancellablePromise does not support transparent subclassing. Please refrain from overriding the [Symbol.species] static property."); - } - let promise = { - promise: this, - resolve, - reject, - get oncancelled() { return oncancelled !== null && oncancelled !== void 0 ? oncancelled : null; }, - set oncancelled(cb) { oncancelled = cb !== null && cb !== void 0 ? cb : undefined; } - }; - const state = { - get root() { return state; }, - resolving: false, - settled: false - }; - // Setup cancellation system. - void Object.defineProperties(this, { - [barrierSym]: { - configurable: false, - enumerable: false, - writable: true, - value: null - }, - [cancelImplSym]: { - configurable: false, - enumerable: false, - writable: false, - value: cancellerFor(promise, state) - } - }); - // Run the actual executor. - const rejector = rejectorFor(promise, state); - try { - executor(resolverFor(promise, state), rejector); - } - catch (err) { - if (state.resolving) { - console.log("Unhandled exception in CancellablePromise executor.", err); - } - else { - rejector(err); - } - } - } - /** - * Cancels immediately the execution of the operation associated with this promise. - * The promise rejects with a {@link CancelError} instance as reason, - * with the {@link CancelError#cause} property set to the given argument, if any. - * - * Has no effect if called after the promise has already settled; - * repeated calls in particular are safe, but only the first one - * will set the cancellation cause. - * - * The `CancelError` exception _need not_ be handled explicitly _on the promises that are being cancelled:_ - * cancelling a promise with no attached rejection handler does not trigger an unhandled rejection event. - * Therefore, the following idioms are all equally correct: - * ```ts - * new CancellablePromise((resolve, reject) => { ... }).cancel(); - * new CancellablePromise((resolve, reject) => { ... }).then(...).cancel(); - * new CancellablePromise((resolve, reject) => { ... }).then(...).catch(...).cancel(); - * ``` - * Whenever some cancelled promise in a chain rejects with a `CancelError` - * with the same cancellation cause as itself, the error will be discarded silently. - * However, the `CancelError` _will still be delivered_ to all attached rejection handlers - * added by {@link then} and related methods: - * ```ts - * let cancellable = new CancellablePromise((resolve, reject) => { ... }); - * cancellable.then(() => { ... }).catch(console.log); - * cancellable.cancel(); // A CancelError is printed to the console. - * ``` - * If the `CancelError` is not handled downstream by the time it reaches - * a _non-cancelled_ promise, it _will_ trigger an unhandled rejection event, - * just like normal rejections would: - * ```ts - * let cancellable = new CancellablePromise((resolve, reject) => { ... }); - * let chained = cancellable.then(() => { ... }).then(() => { ... }); // No catch... - * cancellable.cancel(); // Unhandled rejection event on chained! - * ``` - * Therefore, it is important to either cancel whole promise chains from their tail, - * as shown in the correct idioms above, or take care of handling errors everywhere. - * - * @returns A cancellable promise that _fulfills_ after the cancel callback (if any) - * and all handlers attached up to the call to cancel have run. - * If the cancel callback returns a thenable, the promise returned by `cancel` - * will also wait for that thenable to settle. - * This enables callers to wait for the cancelled operation to terminate - * without being forced to handle potential errors at the call site. - * ```ts - * cancellable.cancel().then(() => { - * // Cleanup finished, it's safe to do something else. - * }, (err) => { - * // Unreachable: the promise returned from cancel will never reject. - * }); - * ``` - * Note that the returned promise will _not_ handle implicitly any rejection - * that might have occurred already in the cancelled chain. - * It will just track whether registered handlers have been executed or not. - * Therefore, unhandled rejections will never be silently handled by calling cancel. - */ - cancel(cause) { - return new CancellablePromise((resolve) => { - // INVARIANT: the result of this[cancelImplSym] and the barrier do not ever reject. - // Unfortunately macOS High Sierra does not support Promise.allSettled. - Promise.all([ - this[cancelImplSym](new CancelError("Promise cancelled.", { cause })), - currentBarrier(this) - ]).then(() => resolve(), () => resolve()); - }); - } - /** - * Binds promise cancellation to the abort event of the given {@link AbortSignal}. - * If the signal has already aborted, the promise will be cancelled immediately. - * When either condition is verified, the cancellation cause will be set - * to the signal's abort reason (see {@link AbortSignal#reason}). - * - * Has no effect if called (or if the signal aborts) _after_ the promise has already settled. - * Only the first signal to abort will set the cancellation cause. - * - * For more details about the cancellation process, - * see {@link cancel} and the `CancellablePromise` constructor. - * - * This method enables `await`ing cancellable promises without having - * to store them for future cancellation, e.g.: - * ```ts - * await longRunningOperation().cancelOn(signal); - * ``` - * instead of: - * ```ts - * let promiseToBeCancelled = longRunningOperation(); - * await promiseToBeCancelled; - * ``` - * - * @returns This promise, for method chaining. - */ - cancelOn(signal) { - if (signal.aborted) { - void this.cancel(signal.reason); - } - else { - signal.addEventListener('abort', () => void this.cancel(signal.reason), { capture: true }); - } - return this; - } - /** - * Attaches callbacks for the resolution and/or rejection of the `CancellablePromise`. - * - * The optional `oncancelled` argument will be invoked when the returned promise is cancelled, - * with the same semantics as the `oncancelled` argument of the constructor. - * When the parent promise rejects or is cancelled, the `onrejected` callback will run, - * _even after the returned promise has been cancelled:_ - * in that case, should it reject or throw, the reason will be wrapped - * in a {@link CancelledRejectionError} and bubbled up as an unhandled rejection. - * - * @param onfulfilled The callback to execute when the Promise is resolved. - * @param onrejected The callback to execute when the Promise is rejected. - * @returns A `CancellablePromise` for the completion of whichever callback is executed. - * The returned promise is hooked up to propagate cancellation requests up the chain, but not down: - * - * - if the parent promise is cancelled, the `onrejected` handler will be invoked with a `CancelError` - * and the returned promise _will resolve regularly_ with its result; - * - conversely, if the returned promise is cancelled, _the parent promise is cancelled too;_ - * the `onrejected` handler will still be invoked with the parent's `CancelError`, - * but its result will be discarded - * and the returned promise will reject with a `CancelError` as well. - * - * The promise returned from {@link cancel} will fulfill only after all attached handlers - * up the entire promise chain have been run. - * - * If either callback returns a cancellable promise, - * cancellation requests will be diverted to it, - * and the specified `oncancelled` callback will be discarded. - */ - then(onfulfilled, onrejected, oncancelled) { - if (!(this instanceof CancellablePromise)) { - throw new TypeError("CancellablePromise.prototype.then called on an invalid object."); - } - // NOTE: TypeScript's built-in type for then is broken, - // as it allows specifying an arbitrary TResult1 != T even when onfulfilled is not a function. - // We cannot fix it if we want to CancellablePromise to implement PromiseLike. - if (!isCallable(onfulfilled)) { - onfulfilled = identity; - } - if (!isCallable(onrejected)) { - onrejected = thrower; - } - if (onfulfilled === identity && onrejected == thrower) { - // Shortcut for trivial arguments. - return new CancellablePromise((resolve) => resolve(this)); - } - const barrier = {}; - this[barrierSym] = barrier; - return new CancellablePromise((resolve, reject) => { - void super.then((value) => { - var _a; - if (this[barrierSym] === barrier) { - this[barrierSym] = null; - } - (_a = barrier.resolve) === null || _a === void 0 ? void 0 : _a.call(barrier); - try { - resolve(onfulfilled(value)); - } - catch (err) { - reject(err); - } - }, (reason) => { - var _a; - if (this[barrierSym] === barrier) { - this[barrierSym] = null; - } - (_a = barrier.resolve) === null || _a === void 0 ? void 0 : _a.call(barrier); - try { - resolve(onrejected(reason)); - } - catch (err) { - reject(err); - } - }); - }, async (cause) => { - //cancelled = true; - try { - return oncancelled === null || oncancelled === void 0 ? void 0 : oncancelled(cause); - } - finally { - await this.cancel(cause); - } - }); - } - /** - * Attaches a callback for only the rejection of the Promise. - * - * The optional `oncancelled` argument will be invoked when the returned promise is cancelled, - * with the same semantics as the `oncancelled` argument of the constructor. - * When the parent promise rejects or is cancelled, the `onrejected` callback will run, - * _even after the returned promise has been cancelled:_ - * in that case, should it reject or throw, the reason will be wrapped - * in a {@link CancelledRejectionError} and bubbled up as an unhandled rejection. - * - * It is equivalent to - * ```ts - * cancellablePromise.then(undefined, onrejected, oncancelled); - * ``` - * and the same caveats apply. - * - * @returns A Promise for the completion of the callback. - * Cancellation requests on the returned promise - * will propagate up the chain to the parent promise, - * but not in the other direction. - * - * The promise returned from {@link cancel} will fulfill only after all attached handlers - * up the entire promise chain have been run. - * - * If `onrejected` returns a cancellable promise, - * cancellation requests will be diverted to it, - * and the specified `oncancelled` callback will be discarded. - * See {@link then} for more details. - */ - catch(onrejected, oncancelled) { - return this.then(undefined, onrejected, oncancelled); - } - /** - * Attaches a callback that is invoked when the CancellablePromise is settled (fulfilled or rejected). The - * resolved value cannot be accessed or modified from the callback. - * The returned promise will settle in the same state as the original one - * after the provided callback has completed execution, - * unless the callback throws or returns a rejecting promise, - * in which case the returned promise will reject as well. - * - * The optional `oncancelled` argument will be invoked when the returned promise is cancelled, - * with the same semantics as the `oncancelled` argument of the constructor. - * Once the parent promise settles, the `onfinally` callback will run, - * _even after the returned promise has been cancelled:_ - * in that case, should it reject or throw, the reason will be wrapped - * in a {@link CancelledRejectionError} and bubbled up as an unhandled rejection. - * - * This method is implemented in terms of {@link then} and the same caveats apply. - * It is polyfilled, hence available in every OS/webview version. - * - * @returns A Promise for the completion of the callback. - * Cancellation requests on the returned promise - * will propagate up the chain to the parent promise, - * but not in the other direction. - * - * The promise returned from {@link cancel} will fulfill only after all attached handlers - * up the entire promise chain have been run. - * - * If `onfinally` returns a cancellable promise, - * cancellation requests will be diverted to it, - * and the specified `oncancelled` callback will be discarded. - * See {@link then} for more details. - */ - finally(onfinally, oncancelled) { - if (!(this instanceof CancellablePromise)) { - throw new TypeError("CancellablePromise.prototype.finally called on an invalid object."); - } - if (!isCallable(onfinally)) { - return this.then(onfinally, onfinally, oncancelled); - } - return this.then((value) => CancellablePromise.resolve(onfinally()).then(() => value), (reason) => CancellablePromise.resolve(onfinally()).then(() => { throw reason; }), oncancelled); - } - /** - * We use the `[Symbol.species]` static property, if available, - * to disable the built-in automatic subclassing features from {@link Promise}. - * It is critical for performance reasons that extenders do not override this. - * Once the proposal at https://github.com/tc39/proposal-rm-builtin-subclassing - * is either accepted or retired, this implementation will have to be revised accordingly. - * - * @ignore - * @internal - */ - static get [species]() { - return Promise; - } - static all(values) { - let collected = Array.from(values); - const promise = collected.length === 0 - ? CancellablePromise.resolve(collected) - : new CancellablePromise((resolve, reject) => { - void Promise.all(collected).then(resolve, reject); - }, (cause) => cancelAll(promise, collected, cause)); - return promise; - } - static allSettled(values) { - let collected = Array.from(values); - const promise = collected.length === 0 - ? CancellablePromise.resolve(collected) - : new CancellablePromise((resolve, reject) => { - void Promise.allSettled(collected).then(resolve, reject); - }, (cause) => cancelAll(promise, collected, cause)); - return promise; - } - static any(values) { - let collected = Array.from(values); - const promise = collected.length === 0 - ? CancellablePromise.resolve(collected) - : new CancellablePromise((resolve, reject) => { - void Promise.any(collected).then(resolve, reject); - }, (cause) => cancelAll(promise, collected, cause)); - return promise; - } - static race(values) { - let collected = Array.from(values); - const promise = new CancellablePromise((resolve, reject) => { - void Promise.race(collected).then(resolve, reject); - }, (cause) => cancelAll(promise, collected, cause)); - return promise; - } - /** - * Creates a new cancelled CancellablePromise for the provided cause. - * - * @group Static Methods - */ - static cancel(cause) { - const p = new CancellablePromise(() => { }); - p.cancel(cause); - return p; - } - /** - * Creates a new CancellablePromise that cancels - * after the specified timeout, with the provided cause. - * - * If the {@link AbortSignal.timeout} factory method is available, - * it is used to base the timeout on _active_ time rather than _elapsed_ time. - * Otherwise, `timeout` falls back to {@link setTimeout}. - * - * @group Static Methods - */ - static timeout(milliseconds, cause) { - const promise = new CancellablePromise(() => { }); - if (AbortSignal && typeof AbortSignal === 'function' && AbortSignal.timeout && typeof AbortSignal.timeout === 'function') { - AbortSignal.timeout(milliseconds).addEventListener('abort', () => void promise.cancel(cause)); - } - else { - setTimeout(() => void promise.cancel(cause), milliseconds); - } - return promise; - } - static sleep(milliseconds, value) { - return new CancellablePromise((resolve) => { - setTimeout(() => resolve(value), milliseconds); - }); - } - /** - * Creates a new rejected CancellablePromise for the provided reason. - * - * @group Static Methods - */ - static reject(reason) { - return new CancellablePromise((_, reject) => reject(reason)); - } - static resolve(value) { - if (value instanceof CancellablePromise) { - // Optimise for cancellable promises. - return value; - } - return new CancellablePromise((resolve) => resolve(value)); - } - /** - * Creates a new CancellablePromise and returns it in an object, along with its resolve and reject functions - * and a getter/setter for the cancellation callback. - * - * This method is polyfilled, hence available in every OS/webview version. - * - * @group Static Methods - */ - static withResolvers() { - let result = { oncancelled: null }; - result.promise = new CancellablePromise((resolve, reject) => { - result.resolve = resolve; - result.reject = reject; - }, (cause) => { var _a; (_a = result.oncancelled) === null || _a === void 0 ? void 0 : _a.call(result, cause); }); - return result; - } -} -/** - * Returns a callback that implements the cancellation algorithm for the given cancellable promise. - * The promise returned from the resulting function does not reject. - */ -function cancellerFor(promise, state) { - let cancellationPromise = undefined; - return (reason) => { - if (!state.settled) { - state.settled = true; - state.reason = reason; - promise.reject(reason); - // Attach an error handler that ignores this specific rejection reason and nothing else. - // In theory, a sane underlying implementation at this point - // should always reject with our cancellation reason, - // hence the handler will never throw. - void Promise.prototype.then.call(promise.promise, undefined, (err) => { - if (err !== reason) { - throw err; - } - }); - } - // If reason is not set, the promise resolved regularly, hence we must not call oncancelled. - // If oncancelled is unset, no need to go any further. - if (!state.reason || !promise.oncancelled) { - return; - } - cancellationPromise = new Promise((resolve) => { - try { - resolve(promise.oncancelled(state.reason.cause)); - } - catch (err) { - Promise.reject(new CancelledRejectionError(promise.promise, err, "Unhandled exception in oncancelled callback.")); - } - }).catch((reason) => { - Promise.reject(new CancelledRejectionError(promise.promise, reason, "Unhandled rejection in oncancelled callback.")); - }); - // Unset oncancelled to prevent repeated calls. - promise.oncancelled = null; - return cancellationPromise; - }; -} -/** - * Returns a callback that implements the resolution algorithm for the given cancellable promise. - */ -function resolverFor(promise, state) { - return (value) => { - if (state.resolving) { - return; - } - state.resolving = true; - if (value === promise.promise) { - if (state.settled) { - return; - } - state.settled = true; - promise.reject(new TypeError("A promise cannot be resolved with itself.")); - return; - } - if (value != null && (typeof value === 'object' || typeof value === 'function')) { - let then; - try { - then = value.then; - } - catch (err) { - state.settled = true; - promise.reject(err); - return; - } - if (isCallable(then)) { - try { - let cancel = value.cancel; - if (isCallable(cancel)) { - const oncancelled = (cause) => { - Reflect.apply(cancel, value, [cause]); - }; - if (state.reason) { - // If already cancelled, propagate cancellation. - // The promise returned from the canceller algorithm does not reject - // so it can be discarded safely. - void cancellerFor(Object.assign(Object.assign({}, promise), { oncancelled }), state)(state.reason); - } - else { - promise.oncancelled = oncancelled; - } - } - } - catch (_a) { } - const newState = { - root: state.root, - resolving: false, - get settled() { return this.root.settled; }, - set settled(value) { this.root.settled = value; }, - get reason() { return this.root.reason; } - }; - const rejector = rejectorFor(promise, newState); - try { - Reflect.apply(then, value, [resolverFor(promise, newState), rejector]); - } - catch (err) { - rejector(err); - } - return; // IMPORTANT! - } - } - if (state.settled) { - return; - } - state.settled = true; - promise.resolve(value); - }; -} -/** - * Returns a callback that implements the rejection algorithm for the given cancellable promise. - */ -function rejectorFor(promise, state) { - return (reason) => { - if (state.resolving) { - return; - } - state.resolving = true; - if (state.settled) { - try { - if (reason instanceof CancelError && state.reason instanceof CancelError && Object.is(reason.cause, state.reason.cause)) { - // Swallow late rejections that are CancelErrors whose cancellation cause is the same as ours. - return; - } - } - catch (_a) { } - void Promise.reject(new CancelledRejectionError(promise.promise, reason)); - } - else { - state.settled = true; - promise.reject(reason); - } - }; -} -/** - * Cancels all values in an array that look like cancellable thenables. - * Returns a promise that fulfills once all cancellation procedures for the given values have settled. - */ -function cancelAll(parent, values, cause) { - const results = []; - for (const value of values) { - let cancel; - try { - if (!isCallable(value.then)) { - continue; - } - cancel = value.cancel; - if (!isCallable(cancel)) { - continue; - } - } - catch (_a) { - continue; - } - let result; - try { - result = Reflect.apply(cancel, value, [cause]); - } - catch (err) { - Promise.reject(new CancelledRejectionError(parent, err, "Unhandled exception in cancel method.")); - continue; - } - if (!result) { - continue; - } - results.push((result instanceof Promise ? result : Promise.resolve(result)).catch((reason) => { - Promise.reject(new CancelledRejectionError(parent, reason, "Unhandled rejection in cancel method.")); - })); - } - return Promise.all(results); -} -/** - * Returns its argument. - */ -function identity(x) { - return x; -} -/** - * Throws its argument. - */ -function thrower(reason) { - throw reason; -} -/** - * Attempts various strategies to convert an error to a string. - */ -function errorMessage(err) { - try { - if (err instanceof Error || typeof err !== 'object' || err.toString !== Object.prototype.toString) { - return "" + err; - } - } - catch (_a) { } - try { - return JSON.stringify(err); - } - catch (_b) { } - try { - return Object.prototype.toString.call(err); - } - catch (_c) { } - return ""; -} -/** - * Gets the current barrier promise for the given cancellable promise. If necessary, initialises the barrier. - */ -function currentBarrier(promise) { - var _a; - let pwr = (_a = promise[barrierSym]) !== null && _a !== void 0 ? _a : {}; - if (!('promise' in pwr)) { - Object.assign(pwr, promiseWithResolvers()); - } - if (promise[barrierSym] == null) { - pwr.resolve(); - promise[barrierSym] = pwr; - } - return pwr.promise; -} -// Polyfill Promise.withResolvers. -let promiseWithResolvers = Promise.withResolvers; -if (promiseWithResolvers && typeof promiseWithResolvers === 'function') { - promiseWithResolvers = promiseWithResolvers.bind(Promise); -} -else { - promiseWithResolvers = function () { - let resolve; - let reject; - const promise = new Promise((res, rej) => { resolve = res; reject = rej; }); - return { promise, resolve, reject }; - }; -} diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/dist/clipboard.js b/v3/internal/runtime/desktop/@wailsio/runtime/dist/clipboard.js deleted file mode 100644 index d579d4bb3..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/dist/clipboard.js +++ /dev/null @@ -1,30 +0,0 @@ -/* - _ __ _ __ -| | / /___ _(_) /____ -| | /| / / __ `/ / / ___/ -| |/ |/ / /_/ / / (__ ) -|__/|__/\__,_/_/_/____/ -The electron alternative for Go -(c) Lea Anthony 2019-present -*/ -import { newRuntimeCaller, objectNames } from "./runtime.js"; -const call = newRuntimeCaller(objectNames.Clipboard); -const ClipboardSetText = 0; -const ClipboardText = 1; -/** - * Sets the text to the Clipboard. - * - * @param text - The text to be set to the Clipboard. - * @return A Promise that resolves when the operation is successful. - */ -export function SetText(text) { - return call(ClipboardSetText, { text }); -} -/** - * Get the Clipboard text - * - * @returns A promise that resolves with the text from the Clipboard. - */ -export function Text() { - return call(ClipboardText); -} diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/dist/contextmenu.js b/v3/internal/runtime/desktop/@wailsio/runtime/dist/contextmenu.js deleted file mode 100644 index 1485c3aea..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/dist/contextmenu.js +++ /dev/null @@ -1,80 +0,0 @@ -/* - _ __ _ __ -| | / /___ _(_) /____ -| | /| / / __ `/ / / ___/ -| |/ |/ / /_/ / / (__ ) -|__/|__/\__,_/_/_/____/ -The electron alternative for Go -(c) Lea Anthony 2019-present -*/ -import { newRuntimeCaller, objectNames } from "./runtime.js"; -import { IsDebug } from "./system.js"; -import { eventTarget } from "./utils"; -// setup -window.addEventListener('contextmenu', contextMenuHandler); -const call = newRuntimeCaller(objectNames.ContextMenu); -const ContextMenuOpen = 0; -function openContextMenu(id, x, y, data) { - void call(ContextMenuOpen, { id, x, y, data }); -} -function contextMenuHandler(event) { - const target = eventTarget(event); - // Check for custom context menu - const customContextMenu = window.getComputedStyle(target).getPropertyValue("--custom-contextmenu").trim(); - if (customContextMenu) { - event.preventDefault(); - const data = window.getComputedStyle(target).getPropertyValue("--custom-contextmenu-data"); - openContextMenu(customContextMenu, event.clientX, event.clientY, data); - } - else { - processDefaultContextMenu(event, target); - } -} -/* ---default-contextmenu: auto; (default) will show the default context menu if contentEditable is true OR text has been selected OR element is input or textarea ---default-contextmenu: show; will always show the default context menu ---default-contextmenu: hide; will always hide the default context menu - -This rule is inherited like normal CSS rules, so nesting works as expected -*/ -function processDefaultContextMenu(event, target) { - // Debug builds always show the menu - if (IsDebug()) { - return; - } - // Process default context menu - switch (window.getComputedStyle(target).getPropertyValue("--default-contextmenu").trim()) { - case 'show': - return; - case 'hide': - event.preventDefault(); - return; - } - // Check if contentEditable is true - if (target.isContentEditable) { - return; - } - // Check if text has been selected - const selection = window.getSelection(); - const hasSelection = selection && selection.toString().length > 0; - if (hasSelection) { - for (let i = 0; i < selection.rangeCount; i++) { - const range = selection.getRangeAt(i); - const rects = range.getClientRects(); - for (let j = 0; j < rects.length; j++) { - const rect = rects[j]; - if (document.elementFromPoint(rect.left, rect.top) === target) { - return; - } - } - } - } - // Check if tag is input or textarea. - if (target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement) { - if (hasSelection || (!target.readOnly && !target.disabled)) { - return; - } - } - // hide default context menu - event.preventDefault(); -} diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/dist/create.js b/v3/internal/runtime/desktop/@wailsio/runtime/dist/create.js deleted file mode 100644 index 610362500..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/dist/create.js +++ /dev/null @@ -1,94 +0,0 @@ -/* - _ __ _ __ -| | / /___ _(_) /____ -| | /| / / __ `/ / / ___/ -| |/ |/ / /_/ / / (__ ) -|__/|__/\__,_/_/_/____/ -The electron alternative for Go -(c) Lea Anthony 2019-present -*/ -/** - * Any is a dummy creation function for simple or unknown types. - */ -export function Any(source) { - return source; -} -/** - * ByteSlice is a creation function that replaces - * null strings with empty strings. - */ -export function ByteSlice(source) { - return ((source == null) ? "" : source); -} -/** - * Array takes a creation function for an arbitrary type - * and returns an in-place creation function for an array - * whose elements are of that type. - */ -export function Array(element) { - if (element === Any) { - return (source) => (source === null ? [] : source); - } - return (source) => { - if (source === null) { - return []; - } - for (let i = 0; i < source.length; i++) { - source[i] = element(source[i]); - } - return source; - }; -} -/** - * Map takes creation functions for two arbitrary types - * and returns an in-place creation function for an object - * whose keys and values are of those types. - */ -export function Map(key, value) { - if (value === Any) { - return (source) => (source === null ? {} : source); - } - return (source) => { - if (source === null) { - return {}; - } - for (const key in source) { - source[key] = value(source[key]); - } - return source; - }; -} -/** - * Nullable takes a creation function for an arbitrary type - * and returns a creation function for a nullable value of that type. - */ -export function Nullable(element) { - if (element === Any) { - return Any; - } - return (source) => (source === null ? null : element(source)); -} -/** - * Struct takes an object mapping field names to creation functions - * and returns an in-place creation function for a struct. - */ -export function Struct(createField) { - let allAny = true; - for (const name in createField) { - if (createField[name] !== Any) { - allAny = false; - break; - } - } - if (allAny) { - return Any; - } - return (source) => { - for (const name in createField) { - if (name in source) { - source[name] = createField[name](source[name]); - } - } - return source; - }; -} diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/dist/dialogs.js b/v3/internal/runtime/desktop/@wailsio/runtime/dist/dialogs.js deleted file mode 100644 index 2cfa4751d..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/dist/dialogs.js +++ /dev/null @@ -1,134 +0,0 @@ -/* - _ __ _ __ -| | / /___ _(_) /____ -| | /| / / __ `/ / / ___/ -| |/ |/ / /_/ / / (__ ) -|__/|__/\__,_/_/_/____/ -The electron alternative for Go -(c) Lea Anthony 2019-present -*/ -import { newRuntimeCaller, objectNames } from "./runtime.js"; -import { nanoid } from './nanoid.js'; -// setup -window._wails = window._wails || {}; -window._wails.dialogErrorCallback = dialogErrorCallback; -window._wails.dialogResultCallback = dialogResultCallback; -const call = newRuntimeCaller(objectNames.Dialog); -const dialogResponses = new Map(); -// Define constants from the `methods` object in Title Case -const DialogInfo = 0; -const DialogWarning = 1; -const DialogError = 2; -const DialogQuestion = 3; -const DialogOpenFile = 4; -const DialogSaveFile = 5; -/** - * Handles the result of a dialog request. - * - * @param id - The id of the request to handle the result for. - * @param data - The result data of the request. - * @param isJSON - Indicates whether the data is JSON or not. - */ -function dialogResultCallback(id, data, isJSON) { - let resolvers = getAndDeleteResponse(id); - if (!resolvers) { - return; - } - if (isJSON) { - try { - resolvers.resolve(JSON.parse(data)); - } - catch (err) { - resolvers.reject(new TypeError("could not parse result: " + err.message, { cause: err })); - } - } - else { - resolvers.resolve(data); - } -} -/** - * Handles the error from a dialog request. - * - * @param id - The id of the promise handler. - * @param message - An error message. - */ -function dialogErrorCallback(id, message) { - var _a; - (_a = getAndDeleteResponse(id)) === null || _a === void 0 ? void 0 : _a.reject(new window.Error(message)); -} -/** - * Retrieves and removes the response associated with the given ID from the dialogResponses map. - * - * @param id - The ID of the response to be retrieved and removed. - * @returns The response object associated with the given ID, if any. - */ -function getAndDeleteResponse(id) { - const response = dialogResponses.get(id); - dialogResponses.delete(id); - return response; -} -/** - * Generates a unique ID using the nanoid library. - * - * @returns A unique ID that does not exist in the dialogResponses set. - */ -function generateID() { - let result; - do { - result = nanoid(); - } while (dialogResponses.has(result)); - return result; -} -/** - * Presents a dialog of specified type with the given options. - * - * @param type - Dialog type. - * @param options - Options for the dialog. - * @returns A promise that resolves with result of dialog. - */ -function dialog(type, options = {}) { - const id = generateID(); - return new Promise((resolve, reject) => { - dialogResponses.set(id, { resolve, reject }); - call(type, Object.assign({ "dialog-id": id }, options)).catch((err) => { - dialogResponses.delete(id); - reject(err); - }); - }); -} -/** - * Presents an info dialog. - * - * @param options - Dialog options - * @returns A promise that resolves with the label of the chosen button. - */ -export function Info(options) { return dialog(DialogInfo, options); } -/** - * Presents a warning dialog. - * - * @param options - Dialog options. - * @returns A promise that resolves with the label of the chosen button. - */ -export function Warning(options) { return dialog(DialogWarning, options); } -/** - * Presents an error dialog. - * - * @param options - Dialog options. - * @returns A promise that resolves with the label of the chosen button. - */ -export function Error(options) { return dialog(DialogError, options); } -/** - * Presents a question dialog. - * - * @param options - Dialog options. - * @returns A promise that resolves with the label of the chosen button. - */ -export function Question(options) { return dialog(DialogQuestion, options); } -export function OpenFile(options) { var _a; return (_a = dialog(DialogOpenFile, options)) !== null && _a !== void 0 ? _a : []; } -/** - * Presents a file selection dialog to pick a file to save. - * - * @param options - Dialog options. - * @returns Selected file, or a blank string if no file has been selected. - */ -export function SaveFile(options) { return dialog(DialogSaveFile, options); } diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/dist/drag.js b/v3/internal/runtime/desktop/@wailsio/runtime/dist/drag.js deleted file mode 100644 index ae4ecc364..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/dist/drag.js +++ /dev/null @@ -1,222 +0,0 @@ -/* - _ __ _ __ -| | / /___ _(_) /____ -| | /| / / __ `/ / / ___/ -| |/ |/ / /_/ / / (__ ) -|__/|__/\__,_/_/_/____/ -The electron alternative for Go -(c) Lea Anthony 2019-present -*/ -import { invoke, IsWindows } from "./system.js"; -import { GetFlag } from "./flags.js"; -import { canTrackButtons, eventTarget } from "./utils.js"; -// Setup -let canDrag = false; -let dragging = false; -let resizable = false; -let canResize = false; -let resizing = false; -let resizeEdge = ""; -let defaultCursor = "auto"; -let buttons = 0; -const buttonsTracked = canTrackButtons(); -window._wails = window._wails || {}; -window._wails.setResizable = (value) => { - resizable = value; - if (!resizable) { - // Stop resizing if in progress. - canResize = resizing = false; - setResize(); - } -}; -window.addEventListener('mousedown', update, { capture: true }); -window.addEventListener('mousemove', update, { capture: true }); -window.addEventListener('mouseup', update, { capture: true }); -for (const ev of ['click', 'contextmenu', 'dblclick']) { - window.addEventListener(ev, suppressEvent, { capture: true }); -} -function suppressEvent(event) { - // Suppress click events while resizing or dragging. - if (dragging || resizing) { - event.stopImmediatePropagation(); - event.stopPropagation(); - event.preventDefault(); - } -} -// Use constants to avoid comparing strings multiple times. -const MouseDown = 0; -const MouseUp = 1; -const MouseMove = 2; -function update(event) { - // Windows suppresses mouse events at the end of dragging or resizing, - // so we need to be smart and synthesize button events. - let eventType, eventButtons = event.buttons; - switch (event.type) { - case 'mousedown': - eventType = MouseDown; - if (!buttonsTracked) { - eventButtons = buttons | (1 << event.button); - } - break; - case 'mouseup': - eventType = MouseUp; - if (!buttonsTracked) { - eventButtons = buttons & ~(1 << event.button); - } - break; - default: - eventType = MouseMove; - if (!buttonsTracked) { - eventButtons = buttons; - } - break; - } - let released = buttons & ~eventButtons; - let pressed = eventButtons & ~buttons; - buttons = eventButtons; - // Synthesize a release-press sequence if we detect a press of an already pressed button. - if (eventType === MouseDown && !(pressed & event.button)) { - released |= (1 << event.button); - pressed |= (1 << event.button); - } - // Suppress all button events during dragging and resizing, - // unless this is a mouseup event that is ending a drag action. - if (eventType !== MouseMove // Fast path for mousemove - && resizing - || (dragging - && (eventType === MouseDown - || event.button !== 0))) { - event.stopImmediatePropagation(); - event.stopPropagation(); - event.preventDefault(); - } - // Handle releases - if (released & 1) { - primaryUp(event); - } - // Handle presses - if (pressed & 1) { - primaryDown(event); - } - // Handle mousemove - if (eventType === MouseMove) { - onMouseMove(event); - } - ; -} -function primaryDown(event) { - // Reset readiness state. - canDrag = false; - canResize = false; - // Ignore repeated clicks on macOS and Linux. - if (!IsWindows()) { - if (event.type === 'mousedown' && event.button === 0 && event.detail !== 1) { - return; - } - } - if (resizeEdge) { - // Ready to resize if the primary button was pressed for the first time. - canResize = true; - // Do not start drag operations when on resize edges. - return; - } - // Retrieve target element - const target = eventTarget(event); - // Ready to drag if the primary button was pressed for the first time on a draggable element. - // Ignore clicks on the scrollbar. - const style = window.getComputedStyle(target); - canDrag = (style.getPropertyValue("--wails-draggable").trim() === "drag" - && (event.offsetX - parseFloat(style.paddingLeft) < target.clientWidth - && event.offsetY - parseFloat(style.paddingTop) < target.clientHeight)); -} -function primaryUp(event) { - // Stop dragging and resizing. - canDrag = false; - dragging = false; - canResize = false; - resizing = false; -} -const cursorForEdge = Object.freeze({ - "se-resize": "nwse-resize", - "sw-resize": "nesw-resize", - "nw-resize": "nwse-resize", - "ne-resize": "nesw-resize", - "w-resize": "ew-resize", - "n-resize": "ns-resize", - "s-resize": "ns-resize", - "e-resize": "ew-resize", -}); -function setResize(edge) { - if (edge) { - if (!resizeEdge) { - defaultCursor = document.body.style.cursor; - } - document.body.style.cursor = cursorForEdge[edge]; - } - else if (!edge && resizeEdge) { - document.body.style.cursor = defaultCursor; - } - resizeEdge = edge || ""; -} -function onMouseMove(event) { - if (canResize && resizeEdge) { - // Start resizing. - resizing = true; - invoke("wails:resize:" + resizeEdge); - } - else if (canDrag) { - // Start dragging. - dragging = true; - invoke("wails:drag"); - } - if (dragging || resizing) { - // Either drag or resize is ongoing, - // reset readiness and stop processing. - canDrag = canResize = false; - return; - } - if (!resizable || !IsWindows()) { - if (resizeEdge) { - setResize(); - } - return; - } - const resizeHandleHeight = GetFlag("system.resizeHandleHeight") || 5; - const resizeHandleWidth = GetFlag("system.resizeHandleWidth") || 5; - // Extra pixels for the corner areas. - const cornerExtra = GetFlag("resizeCornerExtra") || 10; - const rightBorder = (window.outerWidth - event.clientX) < resizeHandleWidth; - const leftBorder = event.clientX < resizeHandleWidth; - const topBorder = event.clientY < resizeHandleHeight; - const bottomBorder = (window.outerHeight - event.clientY) < resizeHandleHeight; - // Adjust for corner areas. - const rightCorner = (window.outerWidth - event.clientX) < (resizeHandleWidth + cornerExtra); - const leftCorner = event.clientX < (resizeHandleWidth + cornerExtra); - const topCorner = event.clientY < (resizeHandleHeight + cornerExtra); - const bottomCorner = (window.outerHeight - event.clientY) < (resizeHandleHeight + cornerExtra); - if (!leftCorner && !topCorner && !bottomCorner && !rightCorner) { - // Optimisation: out of all corner areas implies out of borders. - setResize(); - } - // Detect corners. - else if (rightCorner && bottomCorner) - setResize("se-resize"); - else if (leftCorner && bottomCorner) - setResize("sw-resize"); - else if (leftCorner && topCorner) - setResize("nw-resize"); - else if (topCorner && rightCorner) - setResize("ne-resize"); - // Detect borders. - else if (leftBorder) - setResize("w-resize"); - else if (topBorder) - setResize("n-resize"); - else if (bottomBorder) - setResize("s-resize"); - else if (rightBorder) - setResize("e-resize"); - // Out of border area. - else - setResize(); -} diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/dist/event_types.js b/v3/internal/runtime/desktop/@wailsio/runtime/dist/event_types.js deleted file mode 100644 index 6cf95d629..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/dist/event_types.js +++ /dev/null @@ -1,229 +0,0 @@ -/* - _ __ _ __ -| | / /___ _(_) /____ -| | /| / / __ `/ / / ___/ -| |/ |/ / /_/ / / (__ ) -|__/|__/\__,_/_/_/____/ -The electron alternative for Go -(c) Lea Anthony 2019-present -*/ -// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL -// This file is automatically generated. DO NOT EDIT -export const Types = Object.freeze({ - Windows: Object.freeze({ - APMPowerSettingChange: "windows:APMPowerSettingChange", - APMPowerStatusChange: "windows:APMPowerStatusChange", - APMResumeAutomatic: "windows:APMResumeAutomatic", - APMResumeSuspend: "windows:APMResumeSuspend", - APMSuspend: "windows:APMSuspend", - ApplicationStarted: "windows:ApplicationStarted", - SystemThemeChanged: "windows:SystemThemeChanged", - WebViewNavigationCompleted: "windows:WebViewNavigationCompleted", - WindowActive: "windows:WindowActive", - WindowBackgroundErase: "windows:WindowBackgroundErase", - WindowClickActive: "windows:WindowClickActive", - WindowClosing: "windows:WindowClosing", - WindowDidMove: "windows:WindowDidMove", - WindowDidResize: "windows:WindowDidResize", - WindowDPIChanged: "windows:WindowDPIChanged", - WindowDragDrop: "windows:WindowDragDrop", - WindowDragEnter: "windows:WindowDragEnter", - WindowDragLeave: "windows:WindowDragLeave", - WindowDragOver: "windows:WindowDragOver", - WindowEndMove: "windows:WindowEndMove", - WindowEndResize: "windows:WindowEndResize", - WindowFullscreen: "windows:WindowFullscreen", - WindowHide: "windows:WindowHide", - WindowInactive: "windows:WindowInactive", - WindowKeyDown: "windows:WindowKeyDown", - WindowKeyUp: "windows:WindowKeyUp", - WindowKillFocus: "windows:WindowKillFocus", - WindowNonClientHit: "windows:WindowNonClientHit", - WindowNonClientMouseDown: "windows:WindowNonClientMouseDown", - WindowNonClientMouseLeave: "windows:WindowNonClientMouseLeave", - WindowNonClientMouseMove: "windows:WindowNonClientMouseMove", - WindowNonClientMouseUp: "windows:WindowNonClientMouseUp", - WindowPaint: "windows:WindowPaint", - WindowRestore: "windows:WindowRestore", - WindowSetFocus: "windows:WindowSetFocus", - WindowShow: "windows:WindowShow", - WindowStartMove: "windows:WindowStartMove", - WindowStartResize: "windows:WindowStartResize", - WindowUnFullscreen: "windows:WindowUnFullscreen", - WindowZOrderChanged: "windows:WindowZOrderChanged", - WindowMinimise: "windows:WindowMinimise", - WindowUnMinimise: "windows:WindowUnMinimise", - WindowMaximise: "windows:WindowMaximise", - WindowUnMaximise: "windows:WindowUnMaximise", - }), - Mac: Object.freeze({ - ApplicationDidBecomeActive: "mac:ApplicationDidBecomeActive", - ApplicationDidChangeBackingProperties: "mac:ApplicationDidChangeBackingProperties", - ApplicationDidChangeEffectiveAppearance: "mac:ApplicationDidChangeEffectiveAppearance", - ApplicationDidChangeIcon: "mac:ApplicationDidChangeIcon", - ApplicationDidChangeOcclusionState: "mac:ApplicationDidChangeOcclusionState", - ApplicationDidChangeScreenParameters: "mac:ApplicationDidChangeScreenParameters", - ApplicationDidChangeStatusBarFrame: "mac:ApplicationDidChangeStatusBarFrame", - ApplicationDidChangeStatusBarOrientation: "mac:ApplicationDidChangeStatusBarOrientation", - ApplicationDidChangeTheme: "mac:ApplicationDidChangeTheme", - ApplicationDidFinishLaunching: "mac:ApplicationDidFinishLaunching", - ApplicationDidHide: "mac:ApplicationDidHide", - ApplicationDidResignActive: "mac:ApplicationDidResignActive", - ApplicationDidUnhide: "mac:ApplicationDidUnhide", - ApplicationDidUpdate: "mac:ApplicationDidUpdate", - ApplicationShouldHandleReopen: "mac:ApplicationShouldHandleReopen", - ApplicationWillBecomeActive: "mac:ApplicationWillBecomeActive", - ApplicationWillFinishLaunching: "mac:ApplicationWillFinishLaunching", - ApplicationWillHide: "mac:ApplicationWillHide", - ApplicationWillResignActive: "mac:ApplicationWillResignActive", - ApplicationWillTerminate: "mac:ApplicationWillTerminate", - ApplicationWillUnhide: "mac:ApplicationWillUnhide", - ApplicationWillUpdate: "mac:ApplicationWillUpdate", - MenuDidAddItem: "mac:MenuDidAddItem", - MenuDidBeginTracking: "mac:MenuDidBeginTracking", - MenuDidClose: "mac:MenuDidClose", - MenuDidDisplayItem: "mac:MenuDidDisplayItem", - MenuDidEndTracking: "mac:MenuDidEndTracking", - MenuDidHighlightItem: "mac:MenuDidHighlightItem", - MenuDidOpen: "mac:MenuDidOpen", - MenuDidPopUp: "mac:MenuDidPopUp", - MenuDidRemoveItem: "mac:MenuDidRemoveItem", - MenuDidSendAction: "mac:MenuDidSendAction", - MenuDidSendActionToItem: "mac:MenuDidSendActionToItem", - MenuDidUpdate: "mac:MenuDidUpdate", - MenuWillAddItem: "mac:MenuWillAddItem", - MenuWillBeginTracking: "mac:MenuWillBeginTracking", - MenuWillDisplayItem: "mac:MenuWillDisplayItem", - MenuWillEndTracking: "mac:MenuWillEndTracking", - MenuWillHighlightItem: "mac:MenuWillHighlightItem", - MenuWillOpen: "mac:MenuWillOpen", - MenuWillPopUp: "mac:MenuWillPopUp", - MenuWillRemoveItem: "mac:MenuWillRemoveItem", - MenuWillSendAction: "mac:MenuWillSendAction", - MenuWillSendActionToItem: "mac:MenuWillSendActionToItem", - MenuWillUpdate: "mac:MenuWillUpdate", - WebViewDidCommitNavigation: "mac:WebViewDidCommitNavigation", - WebViewDidFinishNavigation: "mac:WebViewDidFinishNavigation", - WebViewDidReceiveServerRedirectForProvisionalNavigation: "mac:WebViewDidReceiveServerRedirectForProvisionalNavigation", - WebViewDidStartProvisionalNavigation: "mac:WebViewDidStartProvisionalNavigation", - WindowDidBecomeKey: "mac:WindowDidBecomeKey", - WindowDidBecomeMain: "mac:WindowDidBecomeMain", - WindowDidBeginSheet: "mac:WindowDidBeginSheet", - WindowDidChangeAlpha: "mac:WindowDidChangeAlpha", - WindowDidChangeBackingLocation: "mac:WindowDidChangeBackingLocation", - WindowDidChangeBackingProperties: "mac:WindowDidChangeBackingProperties", - WindowDidChangeCollectionBehavior: "mac:WindowDidChangeCollectionBehavior", - WindowDidChangeEffectiveAppearance: "mac:WindowDidChangeEffectiveAppearance", - WindowDidChangeOcclusionState: "mac:WindowDidChangeOcclusionState", - WindowDidChangeOrderingMode: "mac:WindowDidChangeOrderingMode", - WindowDidChangeScreen: "mac:WindowDidChangeScreen", - WindowDidChangeScreenParameters: "mac:WindowDidChangeScreenParameters", - WindowDidChangeScreenProfile: "mac:WindowDidChangeScreenProfile", - WindowDidChangeScreenSpace: "mac:WindowDidChangeScreenSpace", - WindowDidChangeScreenSpaceProperties: "mac:WindowDidChangeScreenSpaceProperties", - WindowDidChangeSharingType: "mac:WindowDidChangeSharingType", - WindowDidChangeSpace: "mac:WindowDidChangeSpace", - WindowDidChangeSpaceOrderingMode: "mac:WindowDidChangeSpaceOrderingMode", - WindowDidChangeTitle: "mac:WindowDidChangeTitle", - WindowDidChangeToolbar: "mac:WindowDidChangeToolbar", - WindowDidDeminiaturize: "mac:WindowDidDeminiaturize", - WindowDidEndSheet: "mac:WindowDidEndSheet", - WindowDidEnterFullScreen: "mac:WindowDidEnterFullScreen", - WindowDidEnterVersionBrowser: "mac:WindowDidEnterVersionBrowser", - WindowDidExitFullScreen: "mac:WindowDidExitFullScreen", - WindowDidExitVersionBrowser: "mac:WindowDidExitVersionBrowser", - WindowDidExpose: "mac:WindowDidExpose", - WindowDidFocus: "mac:WindowDidFocus", - WindowDidMiniaturize: "mac:WindowDidMiniaturize", - WindowDidMove: "mac:WindowDidMove", - WindowDidOrderOffScreen: "mac:WindowDidOrderOffScreen", - WindowDidOrderOnScreen: "mac:WindowDidOrderOnScreen", - WindowDidResignKey: "mac:WindowDidResignKey", - WindowDidResignMain: "mac:WindowDidResignMain", - WindowDidResize: "mac:WindowDidResize", - WindowDidUpdate: "mac:WindowDidUpdate", - WindowDidUpdateAlpha: "mac:WindowDidUpdateAlpha", - WindowDidUpdateCollectionBehavior: "mac:WindowDidUpdateCollectionBehavior", - WindowDidUpdateCollectionProperties: "mac:WindowDidUpdateCollectionProperties", - WindowDidUpdateShadow: "mac:WindowDidUpdateShadow", - WindowDidUpdateTitle: "mac:WindowDidUpdateTitle", - WindowDidUpdateToolbar: "mac:WindowDidUpdateToolbar", - WindowDidZoom: "mac:WindowDidZoom", - WindowFileDraggingEntered: "mac:WindowFileDraggingEntered", - WindowFileDraggingExited: "mac:WindowFileDraggingExited", - WindowFileDraggingPerformed: "mac:WindowFileDraggingPerformed", - WindowHide: "mac:WindowHide", - WindowMaximise: "mac:WindowMaximise", - WindowUnMaximise: "mac:WindowUnMaximise", - WindowMinimise: "mac:WindowMinimise", - WindowUnMinimise: "mac:WindowUnMinimise", - WindowShouldClose: "mac:WindowShouldClose", - WindowShow: "mac:WindowShow", - WindowWillBecomeKey: "mac:WindowWillBecomeKey", - WindowWillBecomeMain: "mac:WindowWillBecomeMain", - WindowWillBeginSheet: "mac:WindowWillBeginSheet", - WindowWillChangeOrderingMode: "mac:WindowWillChangeOrderingMode", - WindowWillClose: "mac:WindowWillClose", - WindowWillDeminiaturize: "mac:WindowWillDeminiaturize", - WindowWillEnterFullScreen: "mac:WindowWillEnterFullScreen", - WindowWillEnterVersionBrowser: "mac:WindowWillEnterVersionBrowser", - WindowWillExitFullScreen: "mac:WindowWillExitFullScreen", - WindowWillExitVersionBrowser: "mac:WindowWillExitVersionBrowser", - WindowWillFocus: "mac:WindowWillFocus", - WindowWillMiniaturize: "mac:WindowWillMiniaturize", - WindowWillMove: "mac:WindowWillMove", - WindowWillOrderOffScreen: "mac:WindowWillOrderOffScreen", - WindowWillOrderOnScreen: "mac:WindowWillOrderOnScreen", - WindowWillResignMain: "mac:WindowWillResignMain", - WindowWillResize: "mac:WindowWillResize", - WindowWillUnfocus: "mac:WindowWillUnfocus", - WindowWillUpdate: "mac:WindowWillUpdate", - WindowWillUpdateAlpha: "mac:WindowWillUpdateAlpha", - WindowWillUpdateCollectionBehavior: "mac:WindowWillUpdateCollectionBehavior", - WindowWillUpdateCollectionProperties: "mac:WindowWillUpdateCollectionProperties", - WindowWillUpdateShadow: "mac:WindowWillUpdateShadow", - WindowWillUpdateTitle: "mac:WindowWillUpdateTitle", - WindowWillUpdateToolbar: "mac:WindowWillUpdateToolbar", - WindowWillUpdateVisibility: "mac:WindowWillUpdateVisibility", - WindowWillUseStandardFrame: "mac:WindowWillUseStandardFrame", - WindowZoomIn: "mac:WindowZoomIn", - WindowZoomOut: "mac:WindowZoomOut", - WindowZoomReset: "mac:WindowZoomReset", - }), - Linux: Object.freeze({ - ApplicationStartup: "linux:ApplicationStartup", - SystemThemeChanged: "linux:SystemThemeChanged", - WindowDeleteEvent: "linux:WindowDeleteEvent", - WindowDidMove: "linux:WindowDidMove", - WindowDidResize: "linux:WindowDidResize", - WindowFocusIn: "linux:WindowFocusIn", - WindowFocusOut: "linux:WindowFocusOut", - WindowLoadChanged: "linux:WindowLoadChanged", - }), - Common: Object.freeze({ - ApplicationOpenedWithFile: "common:ApplicationOpenedWithFile", - ApplicationStarted: "common:ApplicationStarted", - ThemeChanged: "common:ThemeChanged", - WindowClosing: "common:WindowClosing", - WindowDidMove: "common:WindowDidMove", - WindowDidResize: "common:WindowDidResize", - WindowDPIChanged: "common:WindowDPIChanged", - WindowFilesDropped: "common:WindowFilesDropped", - WindowFocus: "common:WindowFocus", - WindowFullscreen: "common:WindowFullscreen", - WindowHide: "common:WindowHide", - WindowLostFocus: "common:WindowLostFocus", - WindowMaximise: "common:WindowMaximise", - WindowMinimise: "common:WindowMinimise", - WindowRestore: "common:WindowRestore", - WindowRuntimeReady: "common:WindowRuntimeReady", - WindowShow: "common:WindowShow", - WindowUnFullscreen: "common:WindowUnFullscreen", - WindowUnMaximise: "common:WindowUnMaximise", - WindowUnMinimise: "common:WindowUnMinimise", - WindowZoom: "common:WindowZoom", - WindowZoomIn: "common:WindowZoomIn", - WindowZoomOut: "common:WindowZoomOut", - WindowZoomReset: "common:WindowZoomReset", - }), -}); diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/dist/events.js b/v3/internal/runtime/desktop/@wailsio/runtime/dist/events.js deleted file mode 100644 index ba8b2d36c..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/dist/events.js +++ /dev/null @@ -1,101 +0,0 @@ -/* - _ __ _ __ -| | / /___ _(_) /____ -| | /| / / __ `/ / / ___/ -| |/ |/ / /_/ / / (__ ) -|__/|__/\__,_/_/_/____/ -The electron alternative for Go -(c) Lea Anthony 2019-present -*/ -import { newRuntimeCaller, objectNames } from "./runtime.js"; -import { eventListeners, Listener, listenerOff } from "./listener.js"; -// Setup -window._wails = window._wails || {}; -window._wails.dispatchWailsEvent = dispatchWailsEvent; -const call = newRuntimeCaller(objectNames.Events); -const EmitMethod = 0; -export { Types } from "./event_types.js"; -/** - * Represents a system event or a custom event emitted through wails-provided facilities. - */ -export class WailsEvent { - constructor(name, data = null) { - this.name = name; - this.data = data; - } -} -function dispatchWailsEvent(event) { - let listeners = eventListeners.get(event.name); - if (!listeners) { - return; - } - let wailsEvent = new WailsEvent(event.name, event.data); - if ('sender' in event) { - wailsEvent.sender = event.sender; - } - listeners = listeners.filter(listener => !listener.dispatch(wailsEvent)); - if (listeners.length === 0) { - eventListeners.delete(event.name); - } - else { - eventListeners.set(event.name, listeners); - } -} -/** - * Register a callback function to be called multiple times for a specific event. - * - * @param eventName - The name of the event to register the callback for. - * @param callback - The callback function to be called when the event is triggered. - * @param maxCallbacks - The maximum number of times the callback can be called for the event. Once the maximum number is reached, the callback will no longer be called. - * @returns A function that, when called, will unregister the callback from the event. - */ -export function OnMultiple(eventName, callback, maxCallbacks) { - let listeners = eventListeners.get(eventName) || []; - const thisListener = new Listener(eventName, callback, maxCallbacks); - listeners.push(thisListener); - eventListeners.set(eventName, listeners); - return () => listenerOff(thisListener); -} -/** - * Registers a callback function to be executed when the specified event occurs. - * - * @param eventName - The name of the event to register the callback for. - * @param callback - The callback function to be called when the event is triggered. - * @returns A function that, when called, will unregister the callback from the event. - */ -export function On(eventName, callback) { - return OnMultiple(eventName, callback, -1); -} -/** - * Registers a callback function to be executed only once for the specified event. - * - * @param eventName - The name of the event to register the callback for. - * @param callback - The callback function to be called when the event is triggered. - * @returns A function that, when called, will unregister the callback from the event. - */ -export function Once(eventName, callback) { - return OnMultiple(eventName, callback, 1); -} -/** - * Removes event listeners for the specified event names. - * - * @param eventNames - The name of the events to remove listeners for. - */ -export function Off(...eventNames) { - eventNames.forEach(eventName => eventListeners.delete(eventName)); -} -/** - * Removes all event listeners. - */ -export function OffAll() { - eventListeners.clear(); -} -/** - * Emits the given event. - * - * @param event - The name of the event to emit. - * @returns A promise that will be fulfilled once the event has been emitted. - */ -export function Emit(event) { - return call(EmitMethod, event); -} diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/dist/flags.js b/v3/internal/runtime/desktop/@wailsio/runtime/dist/flags.js deleted file mode 100644 index 31071c28d..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/dist/flags.js +++ /dev/null @@ -1,23 +0,0 @@ -/* - _ __ _ __ -| | / /___ _(_) /____ -| | /| / / __ `/ / / ___/ -| |/ |/ / /_/ / / (__ ) -|__/|__/\__,_/_/_/____/ -The electron alternative for Go -(c) Lea Anthony 2019-present -*/ -/** - * Retrieves the value associated with the specified key from the flag map. - * - * @param key - The key to retrieve the value for. - * @return The value associated with the specified key. - */ -export function GetFlag(key) { - try { - return window._wails.flags[key]; - } - catch (e) { - throw new Error("Unable to retrieve flag '" + key + "': " + e, { cause: e }); - } -} diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/dist/index.js b/v3/internal/runtime/desktop/@wailsio/runtime/dist/index.js deleted file mode 100644 index 34f741b89..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/dist/index.js +++ /dev/null @@ -1,38 +0,0 @@ -/* - _ __ _ __ -| | / /___ _(_) /____ -| | /| / / __ `/ / / ___/ -| |/ |/ / /_/ / / (__ ) -|__/|__/\__,_/_/_/____/ -The electron alternative for Go -(c) Lea Anthony 2019-present -*/ -// Setup -window._wails = window._wails || {}; -import "./contextmenu.js"; -import "./drag.js"; -// Re-export public API -import * as Application from "./application.js"; -import * as Browser from "./browser.js"; -import * as Call from "./calls.js"; -import * as Clipboard from "./clipboard.js"; -import * as Create from "./create.js"; -import * as Dialogs from "./dialogs.js"; -import * as Events from "./events.js"; -import * as Flags from "./flags.js"; -import * as Screens from "./screens.js"; -import * as System from "./system.js"; -import Window from "./window.js"; -import * as WML from "./wml.js"; -export { Application, Browser, Call, Clipboard, Dialogs, Events, Flags, Screens, System, Window, WML }; -/** - * An internal utility consumed by the binding generator. - * - * @ignore - * @internal - */ -export { Create }; -export * from "./cancellable.js"; -// Notify backend -window._wails.invoke = System.invoke; -System.invoke("wails:runtime:ready"); diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/dist/listener.js b/v3/internal/runtime/desktop/@wailsio/runtime/dist/listener.js deleted file mode 100644 index 960408867..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/dist/listener.js +++ /dev/null @@ -1,44 +0,0 @@ -/* - _ __ _ __ -| | / /___ _(_) /____ -| | /| / / __ `/ / / ___/ -| |/ |/ / /_/ / / (__ ) -|__/|__/\__,_/_/_/____/ -The electron alternative for Go -(c) Lea Anthony 2019-present -*/ -// The following utilities have been factored out of ./events.ts -// for testing purposes. -export const eventListeners = new Map(); -export class Listener { - constructor(eventName, callback, maxCallbacks) { - this.eventName = eventName; - this.callback = callback; - this.maxCallbacks = maxCallbacks || -1; - } - dispatch(data) { - try { - this.callback(data); - } - catch (err) { - console.error(err); - } - if (this.maxCallbacks === -1) - return false; - this.maxCallbacks -= 1; - return this.maxCallbacks === 0; - } -} -export function listenerOff(listener) { - let listeners = eventListeners.get(listener.eventName); - if (!listeners) { - return; - } - listeners = listeners.filter(l => l !== listener); - if (listeners.length === 0) { - eventListeners.delete(listener.eventName); - } - else { - eventListeners.set(listener.eventName, listeners); - } -} diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/dist/nanoid.js b/v3/internal/runtime/desktop/@wailsio/runtime/dist/nanoid.js deleted file mode 100644 index c0d5e2411..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/dist/nanoid.js +++ /dev/null @@ -1,38 +0,0 @@ -// Source: https://github.com/ai/nanoid -// The MIT License (MIT) -// -// Copyright 2017 Andrey Sitnik -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of -// this software and associated documentation files (the "Software"), to deal in -// the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software is furnished to do so, -// subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// This alphabet uses `A-Za-z0-9_-` symbols. -// The order of characters is optimized for better gzip and brotli compression. -// References to the same file (works both for gzip and brotli): -// `'use`, `andom`, and `rict'` -// References to the brotli default dictionary: -// `-26T`, `1983`, `40px`, `75px`, `bush`, `jack`, `mind`, `very`, and `wolf` -const urlAlphabet = 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'; -export function nanoid(size = 21) { - let id = ''; - // A compact alternative for `for (var i = 0; i < step; i++)`. - let i = size | 0; - while (i--) { - // `| 0` is more compact and faster than `Math.floor()`. - id += urlAlphabet[(Math.random() * 64) | 0]; - } - return id; -} diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/dist/runtime.js b/v3/internal/runtime/desktop/@wailsio/runtime/dist/runtime.js deleted file mode 100644 index f11df1c2e..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/dist/runtime.js +++ /dev/null @@ -1,63 +0,0 @@ -/* - _ __ _ __ -| | / /___ _(_) /____ -| | /| / / __ `/ / / ___/ -| |/ |/ / /_/ / / (__ ) -|__/|__/\__,_/_/_/____/ -The electron alternative for Go -(c) Lea Anthony 2019-present -*/ -import { nanoid } from './nanoid.js'; -const runtimeURL = window.location.origin + "/wails/runtime"; -// Object Names -export const objectNames = Object.freeze({ - Call: 0, - Clipboard: 1, - Application: 2, - Events: 3, - ContextMenu: 4, - Dialog: 5, - Window: 6, - Screens: 7, - System: 8, - Browser: 9, - CancelCall: 10, -}); -export let clientId = nanoid(); -/** - * Creates a new runtime caller with specified ID. - * - * @param object - The object to invoke the method on. - * @param windowName - The name of the window. - * @return The new runtime caller function. - */ -export function newRuntimeCaller(object, windowName = '') { - return function (method, args = null) { - return runtimeCallWithID(object, method, windowName, args); - }; -} -async function runtimeCallWithID(objectID, method, windowName, args) { - var _a, _b; - let url = new URL(runtimeURL); - url.searchParams.append("object", objectID.toString()); - url.searchParams.append("method", method.toString()); - if (args) { - url.searchParams.append("args", JSON.stringify(args)); - } - let headers = { - ["x-wails-client-id"]: clientId - }; - if (windowName) { - headers["x-wails-window-name"] = windowName; - } - let response = await fetch(url, { headers }); - if (!response.ok) { - throw new Error(await response.text()); - } - if (((_b = (_a = response.headers.get("Content-Type")) === null || _a === void 0 ? void 0 : _a.indexOf("application/json")) !== null && _b !== void 0 ? _b : -1) !== -1) { - return response.json(); - } - else { - return response.text(); - } -} diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/dist/screens.js b/v3/internal/runtime/desktop/@wailsio/runtime/dist/screens.js deleted file mode 100644 index b09dc581d..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/dist/screens.js +++ /dev/null @@ -1,38 +0,0 @@ -/* - _ __ _ __ -| | / /___ _(_) /____ -| | /| / / __ `/ / / ___/ -| |/ |/ / /_/ / / (__ ) -|__/|__/\__,_/_/_/____/ -The electron alternative for Go -(c) Lea Anthony 2019-present -*/ -import { newRuntimeCaller, objectNames } from "./runtime.js"; -const call = newRuntimeCaller(objectNames.Screens); -const getAll = 0; -const getPrimary = 1; -const getCurrent = 2; -/** - * Gets all screens. - * - * @returns A promise that resolves to an array of Screen objects. - */ -export function GetAll() { - return call(getAll); -} -/** - * Gets the primary screen. - * - * @returns A promise that resolves to the primary screen. - */ -export function GetPrimary() { - return call(getPrimary); -} -/** - * Gets the current active screen. - * - * @returns A promise that resolves with the current active screen. - */ -export function GetCurrent() { - return call(getCurrent); -} diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/dist/system.js b/v3/internal/runtime/desktop/@wailsio/runtime/dist/system.js deleted file mode 100644 index 4d51cf8a4..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/dist/system.js +++ /dev/null @@ -1,116 +0,0 @@ -/* - _ __ _ __ -| | / /___ _(_) /____ -| | /| / / __ `/ / / ___/ -| |/ |/ / /_/ / / (__ ) -|__/|__/\__,_/_/_/____/ -The electron alternative for Go -(c) Lea Anthony 2019-present -*/ -import { newRuntimeCaller, objectNames } from "./runtime.js"; -const call = newRuntimeCaller(objectNames.System); -const SystemIsDarkMode = 0; -const SystemEnvironment = 1; -const _invoke = (function () { - var _a, _b, _c, _d, _e; - try { - if ((_b = (_a = window.chrome) === null || _a === void 0 ? void 0 : _a.webview) === null || _b === void 0 ? void 0 : _b.postMessage) { - return window.chrome.webview.postMessage.bind(window.chrome.webview); - } - else if ((_e = (_d = (_c = window.webkit) === null || _c === void 0 ? void 0 : _c.messageHandlers) === null || _d === void 0 ? void 0 : _d['external']) === null || _e === void 0 ? void 0 : _e.postMessage) { - return window.webkit.messageHandlers['external'].postMessage.bind(window.webkit.messageHandlers['external']); - } - } - catch (e) { } - console.warn('\n%c⚠️ Browser Environment Detected %c\n\n%cOnly UI previews are available in the browser. For full functionality, please run the application in desktop mode.\nMore information at: https://v3.wails.io/learn/build/#using-a-browser-for-development\n', 'background: #ffffff; color: #000000; font-weight: bold; padding: 4px 8px; border-radius: 4px; border: 2px solid #000000;', 'background: transparent;', 'color: #ffffff; font-style: italic; font-weight: bold;'); - return null; -})(); -export function invoke(msg) { - _invoke === null || _invoke === void 0 ? void 0 : _invoke(msg); -} -/** - * Retrieves the system dark mode status. - * - * @returns A promise that resolves to a boolean value indicating if the system is in dark mode. - */ -export function IsDarkMode() { - return call(SystemIsDarkMode); -} -/** - * Fetches the capabilities of the application from the server. - * - * @returns A promise that resolves to an object containing the capabilities. - */ -export async function Capabilities() { - let response = await fetch("/wails/capabilities"); - if (response.ok) { - return response.json(); - } - else { - throw new Error("could not fetch capabilities: " + response.statusText); - } -} -/** - * Retrieves environment details. - * - * @returns A promise that resolves to an object containing OS and system architecture. - */ -export function Environment() { - return call(SystemEnvironment); -} -/** - * Checks if the current operating system is Windows. - * - * @return True if the operating system is Windows, otherwise false. - */ -export function IsWindows() { - return window._wails.environment.OS === "windows"; -} -/** - * Checks if the current operating system is Linux. - * - * @returns Returns true if the current operating system is Linux, false otherwise. - */ -export function IsLinux() { - return window._wails.environment.OS === "linux"; -} -/** - * Checks if the current environment is a macOS operating system. - * - * @returns True if the environment is macOS, false otherwise. - */ -export function IsMac() { - return window._wails.environment.OS === "darwin"; -} -/** - * Checks if the current environment architecture is AMD64. - * - * @returns True if the current environment architecture is AMD64, false otherwise. - */ -export function IsAMD64() { - return window._wails.environment.Arch === "amd64"; -} -/** - * Checks if the current architecture is ARM. - * - * @returns True if the current architecture is ARM, false otherwise. - */ -export function IsARM() { - return window._wails.environment.Arch === "arm"; -} -/** - * Checks if the current environment is ARM64 architecture. - * - * @returns Returns true if the environment is ARM64 architecture, otherwise returns false. - */ -export function IsARM64() { - return window._wails.environment.Arch === "arm64"; -} -/** - * Reports whether the app is being run in debug mode. - * - * @returns True if the app is being run in debug mode. - */ -export function IsDebug() { - return Boolean(window._wails.environment.Debug); -} diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/dist/utils.js b/v3/internal/runtime/desktop/@wailsio/runtime/dist/utils.js deleted file mode 100644 index 4752828c8..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/dist/utils.js +++ /dev/null @@ -1,95 +0,0 @@ -/* - _ __ _ __ -| | / /___ _(_) /____ -| | /| / / __ `/ / / ___/ -| |/ |/ / /_/ / / (__ ) -|__/|__/\__,_/_/_/____/ -The electron alternative for Go -(c) Lea Anthony 2019-present -*/ -/** - * Logs a message to the console with custom formatting. - * - * @param message - The message to be logged. - */ -export function debugLog(message) { - // eslint-disable-next-line - console.log('%c wails3 %c ' + message + ' ', 'background: #aa0000; color: #fff; border-radius: 3px 0px 0px 3px; padding: 1px; font-size: 0.7rem', 'background: #009900; color: #fff; border-radius: 0px 3px 3px 0px; padding: 1px; font-size: 0.7rem'); -} -/** - * Checks whether the webview supports the {@link MouseEvent#buttons} property. - * Looking at you macOS High Sierra! - */ -export function canTrackButtons() { - return (new MouseEvent('mousedown')).buttons === 0; -} -/** - * Checks whether the browser supports removing listeners by triggering an AbortSignal - * (see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#signal). - */ -export function canAbortListeners() { - if (!EventTarget || !AbortSignal || !AbortController) - return false; - let result = true; - const target = new EventTarget(); - const controller = new AbortController(); - target.addEventListener('test', () => { result = false; }, { signal: controller.signal }); - controller.abort(); - target.dispatchEvent(new CustomEvent('test')); - return result; -} -/** - * Resolves the closest HTMLElement ancestor of an event's target. - */ -export function eventTarget(event) { - var _a; - if (event.target instanceof HTMLElement) { - return event.target; - } - else if (!(event.target instanceof HTMLElement) && event.target instanceof Node) { - return (_a = event.target.parentElement) !== null && _a !== void 0 ? _a : document.body; - } - else { - return document.body; - } -} -/*** - This technique for proper load detection is taken from HTMX: - - BSD 2-Clause License - - Copyright (c) 2020, Big Sky Software - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - ***/ -let isReady = false; -document.addEventListener('DOMContentLoaded', () => { isReady = true; }); -export function whenReady(callback) { - if (isReady || document.readyState === 'complete') { - callback(); - } - else { - document.addEventListener('DOMContentLoaded', callback); - } -} diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/dist/window.js b/v3/internal/runtime/desktop/@wailsio/runtime/dist/window.js deleted file mode 100644 index c44d1ee71..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/dist/window.js +++ /dev/null @@ -1,438 +0,0 @@ -/* - _ __ _ __ -| | / /___ _(_) /____ -| | /| / / __ `/ / / ___/ -| |/ |/ / /_/ / / (__ ) -|__/|__/\__,_/_/_/____/ -The electron alternative for Go -(c) Lea Anthony 2019-present -*/ -import { newRuntimeCaller, objectNames } from "./runtime.js"; -const PositionMethod = 0; -const CenterMethod = 1; -const CloseMethod = 2; -const DisableSizeConstraintsMethod = 3; -const EnableSizeConstraintsMethod = 4; -const FocusMethod = 5; -const ForceReloadMethod = 6; -const FullscreenMethod = 7; -const GetScreenMethod = 8; -const GetZoomMethod = 9; -const HeightMethod = 10; -const HideMethod = 11; -const IsFocusedMethod = 12; -const IsFullscreenMethod = 13; -const IsMaximisedMethod = 14; -const IsMinimisedMethod = 15; -const MaximiseMethod = 16; -const MinimiseMethod = 17; -const NameMethod = 18; -const OpenDevToolsMethod = 19; -const RelativePositionMethod = 20; -const ReloadMethod = 21; -const ResizableMethod = 22; -const RestoreMethod = 23; -const SetPositionMethod = 24; -const SetAlwaysOnTopMethod = 25; -const SetBackgroundColourMethod = 26; -const SetFramelessMethod = 27; -const SetFullscreenButtonEnabledMethod = 28; -const SetMaxSizeMethod = 29; -const SetMinSizeMethod = 30; -const SetRelativePositionMethod = 31; -const SetResizableMethod = 32; -const SetSizeMethod = 33; -const SetTitleMethod = 34; -const SetZoomMethod = 35; -const ShowMethod = 36; -const SizeMethod = 37; -const ToggleFullscreenMethod = 38; -const ToggleMaximiseMethod = 39; -const UnFullscreenMethod = 40; -const UnMaximiseMethod = 41; -const UnMinimiseMethod = 42; -const WidthMethod = 43; -const ZoomMethod = 44; -const ZoomInMethod = 45; -const ZoomOutMethod = 46; -const ZoomResetMethod = 47; -// Private field names. -const callerSym = Symbol("caller"); -class Window { - /** - * Initialises a window object with the specified name. - * - * @private - * @param name - The name of the target window. - */ - constructor(name = '') { - this[callerSym] = newRuntimeCaller(objectNames.Window, name); - // bind instance method to make them easily usable in event handlers - for (const method of Object.getOwnPropertyNames(Window.prototype)) { - if (method !== "constructor" - && typeof this[method] === "function") { - this[method] = this[method].bind(this); - } - } - } - /** - * Gets the specified window. - * - * @param name - The name of the window to get. - * @returns The corresponding window object. - */ - Get(name) { - return new Window(name); - } - /** - * Returns the absolute position of the window. - * - * @returns The current absolute position of the window. - */ - Position() { - return this[callerSym](PositionMethod); - } - /** - * Centers the window on the screen. - */ - Center() { - return this[callerSym](CenterMethod); - } - /** - * Closes the window. - */ - Close() { - return this[callerSym](CloseMethod); - } - /** - * Disables min/max size constraints. - */ - DisableSizeConstraints() { - return this[callerSym](DisableSizeConstraintsMethod); - } - /** - * Enables min/max size constraints. - */ - EnableSizeConstraints() { - return this[callerSym](EnableSizeConstraintsMethod); - } - /** - * Focuses the window. - */ - Focus() { - return this[callerSym](FocusMethod); - } - /** - * Forces the window to reload the page assets. - */ - ForceReload() { - return this[callerSym](ForceReloadMethod); - } - /** - * Switches the window to fullscreen mode. - */ - Fullscreen() { - return this[callerSym](FullscreenMethod); - } - /** - * Returns the screen that the window is on. - * - * @returns The screen the window is currently on. - */ - GetScreen() { - return this[callerSym](GetScreenMethod); - } - /** - * Returns the current zoom level of the window. - * - * @returns The current zoom level. - */ - GetZoom() { - return this[callerSym](GetZoomMethod); - } - /** - * Returns the height of the window. - * - * @returns The current height of the window. - */ - Height() { - return this[callerSym](HeightMethod); - } - /** - * Hides the window. - */ - Hide() { - return this[callerSym](HideMethod); - } - /** - * Returns true if the window is focused. - * - * @returns Whether the window is currently focused. - */ - IsFocused() { - return this[callerSym](IsFocusedMethod); - } - /** - * Returns true if the window is fullscreen. - * - * @returns Whether the window is currently fullscreen. - */ - IsFullscreen() { - return this[callerSym](IsFullscreenMethod); - } - /** - * Returns true if the window is maximised. - * - * @returns Whether the window is currently maximised. - */ - IsMaximised() { - return this[callerSym](IsMaximisedMethod); - } - /** - * Returns true if the window is minimised. - * - * @returns Whether the window is currently minimised. - */ - IsMinimised() { - return this[callerSym](IsMinimisedMethod); - } - /** - * Maximises the window. - */ - Maximise() { - return this[callerSym](MaximiseMethod); - } - /** - * Minimises the window. - */ - Minimise() { - return this[callerSym](MinimiseMethod); - } - /** - * Returns the name of the window. - * - * @returns The name of the window. - */ - Name() { - return this[callerSym](NameMethod); - } - /** - * Opens the development tools pane. - */ - OpenDevTools() { - return this[callerSym](OpenDevToolsMethod); - } - /** - * Returns the relative position of the window to the screen. - * - * @returns The current relative position of the window. - */ - RelativePosition() { - return this[callerSym](RelativePositionMethod); - } - /** - * Reloads the page assets. - */ - Reload() { - return this[callerSym](ReloadMethod); - } - /** - * Returns true if the window is resizable. - * - * @returns Whether the window is currently resizable. - */ - Resizable() { - return this[callerSym](ResizableMethod); - } - /** - * Restores the window to its previous state if it was previously minimised, maximised or fullscreen. - */ - Restore() { - return this[callerSym](RestoreMethod); - } - /** - * Sets the absolute position of the window. - * - * @param x - The desired horizontal absolute position of the window. - * @param y - The desired vertical absolute position of the window. - */ - SetPosition(x, y) { - return this[callerSym](SetPositionMethod, { x, y }); - } - /** - * Sets the window to be always on top. - * - * @param alwaysOnTop - Whether the window should stay on top. - */ - SetAlwaysOnTop(alwaysOnTop) { - return this[callerSym](SetAlwaysOnTopMethod, { alwaysOnTop }); - } - /** - * Sets the background colour of the window. - * - * @param r - The desired red component of the window background. - * @param g - The desired green component of the window background. - * @param b - The desired blue component of the window background. - * @param a - The desired alpha component of the window background. - */ - SetBackgroundColour(r, g, b, a) { - return this[callerSym](SetBackgroundColourMethod, { r, g, b, a }); - } - /** - * Removes the window frame and title bar. - * - * @param frameless - Whether the window should be frameless. - */ - SetFrameless(frameless) { - return this[callerSym](SetFramelessMethod, { frameless }); - } - /** - * Disables the system fullscreen button. - * - * @param enabled - Whether the fullscreen button should be enabled. - */ - SetFullscreenButtonEnabled(enabled) { - return this[callerSym](SetFullscreenButtonEnabledMethod, { enabled }); - } - /** - * Sets the maximum size of the window. - * - * @param width - The desired maximum width of the window. - * @param height - The desired maximum height of the window. - */ - SetMaxSize(width, height) { - return this[callerSym](SetMaxSizeMethod, { width, height }); - } - /** - * Sets the minimum size of the window. - * - * @param width - The desired minimum width of the window. - * @param height - The desired minimum height of the window. - */ - SetMinSize(width, height) { - return this[callerSym](SetMinSizeMethod, { width, height }); - } - /** - * Sets the relative position of the window to the screen. - * - * @param x - The desired horizontal relative position of the window. - * @param y - The desired vertical relative position of the window. - */ - SetRelativePosition(x, y) { - return this[callerSym](SetRelativePositionMethod, { x, y }); - } - /** - * Sets whether the window is resizable. - * - * @param resizable - Whether the window should be resizable. - */ - SetResizable(resizable) { - return this[callerSym](SetResizableMethod, { resizable }); - } - /** - * Sets the size of the window. - * - * @param width - The desired width of the window. - * @param height - The desired height of the window. - */ - SetSize(width, height) { - return this[callerSym](SetSizeMethod, { width, height }); - } - /** - * Sets the title of the window. - * - * @param title - The desired title of the window. - */ - SetTitle(title) { - return this[callerSym](SetTitleMethod, { title }); - } - /** - * Sets the zoom level of the window. - * - * @param zoom - The desired zoom level. - */ - SetZoom(zoom) { - return this[callerSym](SetZoomMethod, { zoom }); - } - /** - * Shows the window. - */ - Show() { - return this[callerSym](ShowMethod); - } - /** - * Returns the size of the window. - * - * @returns The current size of the window. - */ - Size() { - return this[callerSym](SizeMethod); - } - /** - * Toggles the window between fullscreen and normal. - */ - ToggleFullscreen() { - return this[callerSym](ToggleFullscreenMethod); - } - /** - * Toggles the window between maximised and normal. - */ - ToggleMaximise() { - return this[callerSym](ToggleMaximiseMethod); - } - /** - * Un-fullscreens the window. - */ - UnFullscreen() { - return this[callerSym](UnFullscreenMethod); - } - /** - * Un-maximises the window. - */ - UnMaximise() { - return this[callerSym](UnMaximiseMethod); - } - /** - * Un-minimises the window. - */ - UnMinimise() { - return this[callerSym](UnMinimiseMethod); - } - /** - * Returns the width of the window. - * - * @returns The current width of the window. - */ - Width() { - return this[callerSym](WidthMethod); - } - /** - * Zooms the window. - */ - Zoom() { - return this[callerSym](ZoomMethod); - } - /** - * Increases the zoom level of the webview content. - */ - ZoomIn() { - return this[callerSym](ZoomInMethod); - } - /** - * Decreases the zoom level of the webview content. - */ - ZoomOut() { - return this[callerSym](ZoomOutMethod); - } - /** - * Resets the zoom level of the webview content. - */ - ZoomReset() { - return this[callerSym](ZoomResetMethod); - } -} -/** - * The window within which the script is running. - */ -const thisWindow = new Window(''); -export default thisWindow; diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/dist/wml.js b/v3/internal/runtime/desktop/@wailsio/runtime/dist/wml.js deleted file mode 100644 index 993928237..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/dist/wml.js +++ /dev/null @@ -1,179 +0,0 @@ -/* - _ __ _ __ -| | / /___ _(_) /____ -| | /| / / __ `/ / / ___/ -| |/ |/ / /_/ / / (__ ) -|__/|__/\__,_/_/_/____/ -The electron alternative for Go -(c) Lea Anthony 2019-present -*/ -import { OpenURL } from "./browser.js"; -import { Question } from "./dialogs.js"; -import { Emit, WailsEvent } from "./events.js"; -import { canAbortListeners, whenReady } from "./utils.js"; -import Window from "./window.js"; -/** - * Sends an event with the given name and optional data. - * - * @param eventName - - The name of the event to send. - * @param [data=null] - - Optional data to send along with the event. - */ -function sendEvent(eventName, data = null) { - Emit(new WailsEvent(eventName, data)); -} -/** - * Calls a method on a specified window. - * - * @param windowName - The name of the window to call the method on. - * @param methodName - The name of the method to call. - */ -function callWindowMethod(windowName, methodName) { - const targetWindow = Window.Get(windowName); - const method = targetWindow[methodName]; - if (typeof method !== "function") { - console.error(`Window method '${methodName}' not found`); - return; - } - try { - method.call(targetWindow); - } - catch (e) { - console.error(`Error calling window method '${methodName}': `, e); - } -} -/** - * Responds to a triggering event by running appropriate WML actions for the current target. - */ -function onWMLTriggered(ev) { - const element = ev.currentTarget; - function runEffect(choice = "Yes") { - if (choice !== "Yes") - return; - const eventType = element.getAttribute('wml-event') || element.getAttribute('data-wml-event'); - const targetWindow = element.getAttribute('wml-target-window') || element.getAttribute('data-wml-target-window') || ""; - const windowMethod = element.getAttribute('wml-window') || element.getAttribute('data-wml-window'); - const url = element.getAttribute('wml-openurl') || element.getAttribute('data-wml-openurl'); - if (eventType !== null) - sendEvent(eventType); - if (windowMethod !== null) - callWindowMethod(targetWindow, windowMethod); - if (url !== null) - void OpenURL(url); - } - const confirm = element.getAttribute('wml-confirm') || element.getAttribute('data-wml-confirm'); - if (confirm) { - Question({ - Title: "Confirm", - Message: confirm, - Detached: false, - Buttons: [ - { Label: "Yes" }, - { Label: "No", IsDefault: true } - ] - }).then(runEffect); - } - else { - runEffect(); - } -} -// Private field names. -const controllerSym = Symbol("controller"); -const triggerMapSym = Symbol("triggerMap"); -const elementCountSym = Symbol("elementCount"); -/** - * AbortControllerRegistry does not actually remember active event listeners: instead - * it ties them to an AbortSignal and uses an AbortController to remove them all at once. - */ -class AbortControllerRegistry { - constructor() { - this[controllerSym] = new AbortController(); - } - /** - * Returns an options object for addEventListener that ties the listener - * to the AbortSignal from the current AbortController. - * - * @param element - An HTML element - * @param triggers - The list of active WML trigger events for the specified elements - */ - set(element, triggers) { - return { signal: this[controllerSym].signal }; - } - /** - * Removes all registered event listeners and resets the registry. - */ - reset() { - this[controllerSym].abort(); - this[controllerSym] = new AbortController(); - } -} -/** - * WeakMapRegistry maps active trigger events to each DOM element through a WeakMap. - * This ensures that the mapping remains private to this module, while still allowing garbage - * collection of the involved elements. - */ -class WeakMapRegistry { - constructor() { - this[triggerMapSym] = new WeakMap(); - this[elementCountSym] = 0; - } - /** - * Sets active triggers for the specified element. - * - * @param element - An HTML element - * @param triggers - The list of active WML trigger events for the specified element - */ - set(element, triggers) { - if (!this[triggerMapSym].has(element)) { - this[elementCountSym]++; - } - this[triggerMapSym].set(element, triggers); - return {}; - } - /** - * Removes all registered event listeners. - */ - reset() { - if (this[elementCountSym] <= 0) - return; - for (const element of document.body.querySelectorAll('*')) { - if (this[elementCountSym] <= 0) - break; - const triggers = this[triggerMapSym].get(element); - if (triggers != null) { - this[elementCountSym]--; - } - for (const trigger of triggers || []) - element.removeEventListener(trigger, onWMLTriggered); - } - this[triggerMapSym] = new WeakMap(); - this[elementCountSym] = 0; - } -} -const triggerRegistry = canAbortListeners() ? new AbortControllerRegistry() : new WeakMapRegistry(); -/** - * Adds event listeners to the specified element. - */ -function addWMLListeners(element) { - const triggerRegExp = /\S+/g; - const triggerAttr = (element.getAttribute('wml-trigger') || element.getAttribute('data-wml-trigger') || "click"); - const triggers = []; - let match; - while ((match = triggerRegExp.exec(triggerAttr)) !== null) - triggers.push(match[0]); - const options = triggerRegistry.set(element, triggers); - for (const trigger of triggers) - element.addEventListener(trigger, onWMLTriggered, options); -} -/** - * Schedules an automatic reload of WML to be performed as soon as the document is fully loaded. - */ -export function Enable() { - whenReady(Reload); -} -/** - * Reloads the WML page by adding necessary event listeners and browser listeners. - */ -export function Reload() { - triggerRegistry.reset(); - document.body.querySelectorAll('[wml-event], [wml-window], [wml-openurl], [data-wml-event], [data-wml-window], [data-wml-openurl]').forEach(addWMLListeners); -} diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/types/application.d.ts b/v3/internal/runtime/desktop/@wailsio/runtime/types/application.d.ts deleted file mode 100644 index bfab64a85..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/types/application.d.ts +++ /dev/null @@ -1,12 +0,0 @@ -/** - * Hides a certain method by calling the HideMethod function. - */ -export declare function Hide(): Promise; -/** - * Calls the ShowMethod and returns the result. - */ -export declare function Show(): Promise; -/** - * Calls the QuitMethod to terminate the program. - */ -export declare function Quit(): Promise; diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/types/browser.d.ts b/v3/internal/runtime/desktop/@wailsio/runtime/types/browser.d.ts deleted file mode 100644 index 799a457fb..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/types/browser.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -/** - * Open a browser window to the given URL. - * - * @param url - The URL to open - */ -export declare function OpenURL(url: string | URL): Promise; diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/types/callable.d.ts b/v3/internal/runtime/desktop/@wailsio/runtime/types/callable.d.ts deleted file mode 100644 index 54a1c6cf4..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/types/callable.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -declare function isCallableRefApply(value: T | unknown): value is (...args: any[]) => any; -declare const _default: typeof isCallableRefApply; -export default _default; diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/types/calls.d.ts b/v3/internal/runtime/desktop/@wailsio/runtime/types/calls.d.ts deleted file mode 100644 index a96fa8013..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/types/calls.d.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { CancellablePromise } from "./cancellable.js"; -/** - * Holds all required information for a binding call. - * May provide either a method ID or a method name, but not both. - */ -export type CallOptions = { - /** The numeric ID of the bound method to call. */ - methodID: number; - /** The fully qualified name of the bound method to call. */ - methodName?: never; - /** Arguments to be passed into the bound method. */ - args: any[]; -} | { - /** The numeric ID of the bound method to call. */ - methodID?: never; - /** The fully qualified name of the bound method to call. */ - methodName: string; - /** Arguments to be passed into the bound method. */ - args: any[]; -}; -/** - * Exception class that will be thrown in case the bound method returns an error. - * The value of the {@link RuntimeError#name} property is "RuntimeError". - */ -export declare class RuntimeError extends Error { - /** - * Constructs a new RuntimeError instance. - * @param message - The error message. - * @param options - Options to be forwarded to the Error constructor. - */ - constructor(message?: string, options?: ErrorOptions); -} -/** - * Call a bound method according to the given call options. - * - * In case of failure, the returned promise will reject with an exception - * among ReferenceError (unknown method), TypeError (wrong argument count or type), - * {@link RuntimeError} (method returned an error), or other (network or internal errors). - * The exception might have a "cause" field with the value returned - * by the application- or service-level error marshaling functions. - * - * @param options - A method call descriptor. - * @returns The result of the call. - */ -export declare function Call(options: CallOptions): CancellablePromise; -/** - * Calls a bound method by name with the specified arguments. - * See {@link Call} for details. - * - * @param methodName - The name of the method in the format 'package.struct.method'. - * @param args - The arguments to pass to the method. - * @returns The result of the method call. - */ -export declare function ByName(methodName: string, ...args: any[]): CancellablePromise; -/** - * Calls a method by its numeric ID with the specified arguments. - * See {@link Call} for details. - * - * @param methodID - The ID of the method to call. - * @param args - The arguments to pass to the method. - * @return The result of the method call. - */ -export declare function ByID(methodID: number, ...args: any[]): CancellablePromise; diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/types/cancellable.d.ts b/v3/internal/runtime/desktop/@wailsio/runtime/types/cancellable.d.ts deleted file mode 100644 index a65a2ba7e..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/types/cancellable.d.ts +++ /dev/null @@ -1,434 +0,0 @@ -/** - * Exception class that will be used as rejection reason - * in case a {@link CancellablePromise} is cancelled successfully. - * - * The value of the {@link name} property is the string `"CancelError"`. - * The value of the {@link cause} property is the cause passed to the cancel method, if any. - */ -export declare class CancelError extends Error { - /** - * Constructs a new `CancelError` instance. - * @param message - The error message. - * @param options - Options to be forwarded to the Error constructor. - */ - constructor(message?: string, options?: ErrorOptions); -} -/** - * Exception class that will be reported as an unhandled rejection - * in case a {@link CancellablePromise} rejects after being cancelled, - * or when the `oncancelled` callback throws or rejects. - * - * The value of the {@link name} property is the string `"CancelledRejectionError"`. - * The value of the {@link cause} property is the reason the promise rejected with. - * - * Because the original promise was cancelled, - * a wrapper promise will be passed to the unhandled rejection listener instead. - * The {@link promise} property holds a reference to the original promise. - */ -export declare class CancelledRejectionError extends Error { - /** - * Holds a reference to the promise that was cancelled and then rejected. - */ - promise: CancellablePromise; - /** - * Constructs a new `CancelledRejectionError` instance. - * @param promise - The promise that caused the error originally. - * @param reason - The rejection reason. - * @param info - An optional informative message specifying the circumstances in which the error was thrown. - * Defaults to the string `"Unhandled rejection in cancelled promise."`. - */ - constructor(promise: CancellablePromise, reason?: any, info?: string); -} -type CancellablePromiseResolver = (value: T | PromiseLike | CancellablePromiseLike) => void; -type CancellablePromiseRejector = (reason?: any) => void; -type CancellablePromiseCanceller = (cause?: any) => void | PromiseLike; -type CancellablePromiseExecutor = (resolve: CancellablePromiseResolver, reject: CancellablePromiseRejector) => void; -export interface CancellablePromiseLike { - then(onfulfilled?: ((value: T) => TResult1 | PromiseLike | CancellablePromiseLike) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike | CancellablePromiseLike) | undefined | null): CancellablePromiseLike; - cancel(cause?: any): void | PromiseLike; -} -/** - * Wraps a cancellable promise along with its resolution methods. - * The `oncancelled` field will be null initially but may be set to provide a custom cancellation function. - */ -export interface CancellablePromiseWithResolvers { - promise: CancellablePromise; - resolve: CancellablePromiseResolver; - reject: CancellablePromiseRejector; - oncancelled: CancellablePromiseCanceller | null; -} -/** - * A promise with an attached method for cancelling long-running operations (see {@link CancellablePromise#cancel}). - * Cancellation can optionally be bound to an {@link AbortSignal} - * for better composability (see {@link CancellablePromise#cancelOn}). - * - * Cancelling a pending promise will result in an immediate rejection - * with an instance of {@link CancelError} as reason, - * but whoever started the promise will be responsible - * for actually aborting the underlying operation. - * To this purpose, the constructor and all chaining methods - * accept optional cancellation callbacks. - * - * If a `CancellablePromise` still resolves after having been cancelled, - * the result will be discarded. If it rejects, the reason - * will be reported as an unhandled rejection, - * wrapped in a {@link CancelledRejectionError} instance. - * To facilitate the handling of cancellation requests, - * cancelled `CancellablePromise`s will _not_ report unhandled `CancelError`s - * whose `cause` field is the same as the one with which the current promise was cancelled. - * - * All usual promise methods are defined and return a `CancellablePromise` - * whose cancel method will cancel the parent operation as well, propagating the cancellation reason - * upwards through promise chains. - * Conversely, cancelling a promise will not automatically cancel dependent promises downstream: - * ```ts - * let root = new CancellablePromise((resolve, reject) => { ... }); - * let child1 = root.then(() => { ... }); - * let child2 = child1.then(() => { ... }); - * let child3 = root.catch(() => { ... }); - * child1.cancel(); // Cancels child1 and root, but not child2 or child3 - * ``` - * Cancelling a promise that has already settled is safe and has no consequence. - * - * The `cancel` method returns a promise that _always fulfills_ - * after the whole chain has processed the cancel request - * and all attached callbacks up to that moment have run. - * - * All ES2024 promise methods (static and instance) are defined on CancellablePromise, - * but actual availability may vary with OS/webview version. - * - * In line with the proposal at https://github.com/tc39/proposal-rm-builtin-subclassing, - * `CancellablePromise` does not support transparent subclassing. - * Extenders should take care to provide their own method implementations. - * This might be reconsidered in case the proposal is retired. - * - * CancellablePromise is a wrapper around the DOM Promise object - * and is compliant with the [Promises/A+ specification](https://promisesaplus.com/) - * (it passes the [compliance suite](https://github.com/promises-aplus/promises-tests)) - * if so is the underlying implementation. - */ -export declare class CancellablePromise extends Promise implements PromiseLike, CancellablePromiseLike { - static [x: symbol]: PromiseConstructor; - /** - * Creates a new `CancellablePromise`. - * - * @param executor - A callback used to initialize the promise. This callback is passed two arguments: - * a `resolve` callback used to resolve the promise with a value - * or the result of another promise (possibly cancellable), - * and a `reject` callback used to reject the promise with a provided reason or error. - * If the value provided to the `resolve` callback is a thenable _and_ cancellable object - * (it has a `then` _and_ a `cancel` method), - * cancellation requests will be forwarded to that object and the oncancelled will not be invoked anymore. - * If any one of the two callbacks is called _after_ the promise has been cancelled, - * the provided values will be cancelled and resolved as usual, - * but their results will be discarded. - * However, if the resolution process ultimately ends up in a rejection - * that is not due to cancellation, the rejection reason - * will be wrapped in a {@link CancelledRejectionError} - * and bubbled up as an unhandled rejection. - * @param oncancelled - It is the caller's responsibility to ensure that any operation - * started by the executor is properly halted upon cancellation. - * This optional callback can be used to that purpose. - * It will be called _synchronously_ with a cancellation cause - * when cancellation is requested, _after_ the promise has already rejected - * with a {@link CancelError}, but _before_ - * any {@link then}/{@link catch}/{@link finally} callback runs. - * If the callback returns a thenable, the promise returned from {@link cancel} - * will only fulfill after the former has settled. - * Unhandled exceptions or rejections from the callback will be wrapped - * in a {@link CancelledRejectionError} and bubbled up as unhandled rejections. - * If the `resolve` callback is called before cancellation with a cancellable promise, - * cancellation requests on this promise will be diverted to that promise, - * and the original `oncancelled` callback will be discarded. - */ - constructor(executor: CancellablePromiseExecutor, oncancelled?: CancellablePromiseCanceller); - /** - * Cancels immediately the execution of the operation associated with this promise. - * The promise rejects with a {@link CancelError} instance as reason, - * with the {@link CancelError#cause} property set to the given argument, if any. - * - * Has no effect if called after the promise has already settled; - * repeated calls in particular are safe, but only the first one - * will set the cancellation cause. - * - * The `CancelError` exception _need not_ be handled explicitly _on the promises that are being cancelled:_ - * cancelling a promise with no attached rejection handler does not trigger an unhandled rejection event. - * Therefore, the following idioms are all equally correct: - * ```ts - * new CancellablePromise((resolve, reject) => { ... }).cancel(); - * new CancellablePromise((resolve, reject) => { ... }).then(...).cancel(); - * new CancellablePromise((resolve, reject) => { ... }).then(...).catch(...).cancel(); - * ``` - * Whenever some cancelled promise in a chain rejects with a `CancelError` - * with the same cancellation cause as itself, the error will be discarded silently. - * However, the `CancelError` _will still be delivered_ to all attached rejection handlers - * added by {@link then} and related methods: - * ```ts - * let cancellable = new CancellablePromise((resolve, reject) => { ... }); - * cancellable.then(() => { ... }).catch(console.log); - * cancellable.cancel(); // A CancelError is printed to the console. - * ``` - * If the `CancelError` is not handled downstream by the time it reaches - * a _non-cancelled_ promise, it _will_ trigger an unhandled rejection event, - * just like normal rejections would: - * ```ts - * let cancellable = new CancellablePromise((resolve, reject) => { ... }); - * let chained = cancellable.then(() => { ... }).then(() => { ... }); // No catch... - * cancellable.cancel(); // Unhandled rejection event on chained! - * ``` - * Therefore, it is important to either cancel whole promise chains from their tail, - * as shown in the correct idioms above, or take care of handling errors everywhere. - * - * @returns A cancellable promise that _fulfills_ after the cancel callback (if any) - * and all handlers attached up to the call to cancel have run. - * If the cancel callback returns a thenable, the promise returned by `cancel` - * will also wait for that thenable to settle. - * This enables callers to wait for the cancelled operation to terminate - * without being forced to handle potential errors at the call site. - * ```ts - * cancellable.cancel().then(() => { - * // Cleanup finished, it's safe to do something else. - * }, (err) => { - * // Unreachable: the promise returned from cancel will never reject. - * }); - * ``` - * Note that the returned promise will _not_ handle implicitly any rejection - * that might have occurred already in the cancelled chain. - * It will just track whether registered handlers have been executed or not. - * Therefore, unhandled rejections will never be silently handled by calling cancel. - */ - cancel(cause?: any): CancellablePromise; - /** - * Binds promise cancellation to the abort event of the given {@link AbortSignal}. - * If the signal has already aborted, the promise will be cancelled immediately. - * When either condition is verified, the cancellation cause will be set - * to the signal's abort reason (see {@link AbortSignal#reason}). - * - * Has no effect if called (or if the signal aborts) _after_ the promise has already settled. - * Only the first signal to abort will set the cancellation cause. - * - * For more details about the cancellation process, - * see {@link cancel} and the `CancellablePromise` constructor. - * - * This method enables `await`ing cancellable promises without having - * to store them for future cancellation, e.g.: - * ```ts - * await longRunningOperation().cancelOn(signal); - * ``` - * instead of: - * ```ts - * let promiseToBeCancelled = longRunningOperation(); - * await promiseToBeCancelled; - * ``` - * - * @returns This promise, for method chaining. - */ - cancelOn(signal: AbortSignal): CancellablePromise; - /** - * Attaches callbacks for the resolution and/or rejection of the `CancellablePromise`. - * - * The optional `oncancelled` argument will be invoked when the returned promise is cancelled, - * with the same semantics as the `oncancelled` argument of the constructor. - * When the parent promise rejects or is cancelled, the `onrejected` callback will run, - * _even after the returned promise has been cancelled:_ - * in that case, should it reject or throw, the reason will be wrapped - * in a {@link CancelledRejectionError} and bubbled up as an unhandled rejection. - * - * @param onfulfilled The callback to execute when the Promise is resolved. - * @param onrejected The callback to execute when the Promise is rejected. - * @returns A `CancellablePromise` for the completion of whichever callback is executed. - * The returned promise is hooked up to propagate cancellation requests up the chain, but not down: - * - * - if the parent promise is cancelled, the `onrejected` handler will be invoked with a `CancelError` - * and the returned promise _will resolve regularly_ with its result; - * - conversely, if the returned promise is cancelled, _the parent promise is cancelled too;_ - * the `onrejected` handler will still be invoked with the parent's `CancelError`, - * but its result will be discarded - * and the returned promise will reject with a `CancelError` as well. - * - * The promise returned from {@link cancel} will fulfill only after all attached handlers - * up the entire promise chain have been run. - * - * If either callback returns a cancellable promise, - * cancellation requests will be diverted to it, - * and the specified `oncancelled` callback will be discarded. - */ - then(onfulfilled?: ((value: T) => TResult1 | PromiseLike | CancellablePromiseLike) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike | CancellablePromiseLike) | undefined | null, oncancelled?: CancellablePromiseCanceller): CancellablePromise; - /** - * Attaches a callback for only the rejection of the Promise. - * - * The optional `oncancelled` argument will be invoked when the returned promise is cancelled, - * with the same semantics as the `oncancelled` argument of the constructor. - * When the parent promise rejects or is cancelled, the `onrejected` callback will run, - * _even after the returned promise has been cancelled:_ - * in that case, should it reject or throw, the reason will be wrapped - * in a {@link CancelledRejectionError} and bubbled up as an unhandled rejection. - * - * It is equivalent to - * ```ts - * cancellablePromise.then(undefined, onrejected, oncancelled); - * ``` - * and the same caveats apply. - * - * @returns A Promise for the completion of the callback. - * Cancellation requests on the returned promise - * will propagate up the chain to the parent promise, - * but not in the other direction. - * - * The promise returned from {@link cancel} will fulfill only after all attached handlers - * up the entire promise chain have been run. - * - * If `onrejected` returns a cancellable promise, - * cancellation requests will be diverted to it, - * and the specified `oncancelled` callback will be discarded. - * See {@link then} for more details. - */ - catch(onrejected?: ((reason: any) => (PromiseLike | TResult)) | undefined | null, oncancelled?: CancellablePromiseCanceller): CancellablePromise; - /** - * Attaches a callback that is invoked when the CancellablePromise is settled (fulfilled or rejected). The - * resolved value cannot be accessed or modified from the callback. - * The returned promise will settle in the same state as the original one - * after the provided callback has completed execution, - * unless the callback throws or returns a rejecting promise, - * in which case the returned promise will reject as well. - * - * The optional `oncancelled` argument will be invoked when the returned promise is cancelled, - * with the same semantics as the `oncancelled` argument of the constructor. - * Once the parent promise settles, the `onfinally` callback will run, - * _even after the returned promise has been cancelled:_ - * in that case, should it reject or throw, the reason will be wrapped - * in a {@link CancelledRejectionError} and bubbled up as an unhandled rejection. - * - * This method is implemented in terms of {@link then} and the same caveats apply. - * It is polyfilled, hence available in every OS/webview version. - * - * @returns A Promise for the completion of the callback. - * Cancellation requests on the returned promise - * will propagate up the chain to the parent promise, - * but not in the other direction. - * - * The promise returned from {@link cancel} will fulfill only after all attached handlers - * up the entire promise chain have been run. - * - * If `onfinally` returns a cancellable promise, - * cancellation requests will be diverted to it, - * and the specified `oncancelled` callback will be discarded. - * See {@link then} for more details. - */ - finally(onfinally?: (() => void) | undefined | null, oncancelled?: CancellablePromiseCanceller): CancellablePromise; - /** - * Creates a CancellablePromise that is resolved with an array of results - * when all of the provided Promises resolve, or rejected when any Promise is rejected. - * - * Every one of the provided objects that is a thenable _and_ cancellable object - * will be cancelled when the returned promise is cancelled, with the same cause. - * - * @group Static Methods - */ - static all(values: Iterable>): CancellablePromise[]>; - static all(values: T): CancellablePromise<{ - -readonly [P in keyof T]: Awaited; - }>; - /** - * Creates a CancellablePromise that is resolved with an array of results - * when all of the provided Promises resolve or reject. - * - * Every one of the provided objects that is a thenable _and_ cancellable object - * will be cancelled when the returned promise is cancelled, with the same cause. - * - * @group Static Methods - */ - static allSettled(values: Iterable>): CancellablePromise>[]>; - static allSettled(values: T): CancellablePromise<{ - -readonly [P in keyof T]: PromiseSettledResult>; - }>; - /** - * The any function returns a promise that is fulfilled by the first given promise to be fulfilled, - * or rejected with an AggregateError containing an array of rejection reasons - * if all of the given promises are rejected. - * It resolves all elements of the passed iterable to promises as it runs this algorithm. - * - * Every one of the provided objects that is a thenable _and_ cancellable object - * will be cancelled when the returned promise is cancelled, with the same cause. - * - * @group Static Methods - */ - static any(values: Iterable>): CancellablePromise>; - static any(values: T): CancellablePromise>; - /** - * Creates a Promise that is resolved or rejected when any of the provided Promises are resolved or rejected. - * - * Every one of the provided objects that is a thenable _and_ cancellable object - * will be cancelled when the returned promise is cancelled, with the same cause. - * - * @group Static Methods - */ - static race(values: Iterable>): CancellablePromise>; - static race(values: T): CancellablePromise>; - /** - * Creates a new cancelled CancellablePromise for the provided cause. - * - * @group Static Methods - */ - static cancel(cause?: any): CancellablePromise; - /** - * Creates a new CancellablePromise that cancels - * after the specified timeout, with the provided cause. - * - * If the {@link AbortSignal.timeout} factory method is available, - * it is used to base the timeout on _active_ time rather than _elapsed_ time. - * Otherwise, `timeout` falls back to {@link setTimeout}. - * - * @group Static Methods - */ - static timeout(milliseconds: number, cause?: any): CancellablePromise; - /** - * Creates a new CancellablePromise that resolves after the specified timeout. - * The returned promise can be cancelled without consequences. - * - * @group Static Methods - */ - static sleep(milliseconds: number): CancellablePromise; - /** - * Creates a new CancellablePromise that resolves after - * the specified timeout, with the provided value. - * The returned promise can be cancelled without consequences. - * - * @group Static Methods - */ - static sleep(milliseconds: number, value: T): CancellablePromise; - /** - * Creates a new rejected CancellablePromise for the provided reason. - * - * @group Static Methods - */ - static reject(reason?: any): CancellablePromise; - /** - * Creates a new resolved CancellablePromise. - * - * @group Static Methods - */ - static resolve(): CancellablePromise; - /** - * Creates a new resolved CancellablePromise for the provided value. - * - * @group Static Methods - */ - static resolve(value: T): CancellablePromise>; - /** - * Creates a new resolved CancellablePromise for the provided value. - * - * @group Static Methods - */ - static resolve(value: T | PromiseLike): CancellablePromise>; - /** - * Creates a new CancellablePromise and returns it in an object, along with its resolve and reject functions - * and a getter/setter for the cancellation callback. - * - * This method is polyfilled, hence available in every OS/webview version. - * - * @group Static Methods - */ - static withResolvers(): CancellablePromiseWithResolvers; -} -export {}; diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/types/clipboard.d.ts b/v3/internal/runtime/desktop/@wailsio/runtime/types/clipboard.d.ts deleted file mode 100644 index 4d0363428..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/types/clipboard.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Sets the text to the Clipboard. - * - * @param text - The text to be set to the Clipboard. - * @return A Promise that resolves when the operation is successful. - */ -export declare function SetText(text: string): Promise; -/** - * Get the Clipboard text - * - * @returns A promise that resolves with the text from the Clipboard. - */ -export declare function Text(): Promise; diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/types/contextmenu.d.ts b/v3/internal/runtime/desktop/@wailsio/runtime/types/contextmenu.d.ts deleted file mode 100644 index cb0ff5c3b..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/types/contextmenu.d.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/types/create.d.ts b/v3/internal/runtime/desktop/@wailsio/runtime/types/create.d.ts deleted file mode 100644 index a3332a4fd..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/types/create.d.ts +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Any is a dummy creation function for simple or unknown types. - */ -export declare function Any(source: any): T; -/** - * ByteSlice is a creation function that replaces - * null strings with empty strings. - */ -export declare function ByteSlice(source: any): string; -/** - * Array takes a creation function for an arbitrary type - * and returns an in-place creation function for an array - * whose elements are of that type. - */ -export declare function Array(element: (source: any) => T): (source: any) => T[]; -/** - * Map takes creation functions for two arbitrary types - * and returns an in-place creation function for an object - * whose keys and values are of those types. - */ -export declare function Map(key: (source: any) => string, value: (source: any) => V): (source: any) => Record; -/** - * Nullable takes a creation function for an arbitrary type - * and returns a creation function for a nullable value of that type. - */ -export declare function Nullable(element: (source: any) => T): (source: any) => (T | null); -/** - * Struct takes an object mapping field names to creation functions - * and returns an in-place creation function for a struct. - */ -export declare function Struct(createField: Record any>): = any>(source: any) => U; diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/types/dialogs.d.ts b/v3/internal/runtime/desktop/@wailsio/runtime/types/dialogs.d.ts deleted file mode 100644 index 223d43eae..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/types/dialogs.d.ts +++ /dev/null @@ -1,140 +0,0 @@ -export interface OpenFileDialogOptions { - /** Indicates if directories can be chosen. */ - CanChooseDirectories?: boolean; - /** Indicates if files can be chosen. */ - CanChooseFiles?: boolean; - /** Indicates if directories can be created. */ - CanCreateDirectories?: boolean; - /** Indicates if hidden files should be shown. */ - ShowHiddenFiles?: boolean; - /** Indicates if aliases should be resolved. */ - ResolvesAliases?: boolean; - /** Indicates if multiple selection is allowed. */ - AllowsMultipleSelection?: boolean; - /** Indicates if the extension should be hidden. */ - HideExtension?: boolean; - /** Indicates if hidden extensions can be selected. */ - CanSelectHiddenExtension?: boolean; - /** Indicates if file packages should be treated as directories. */ - TreatsFilePackagesAsDirectories?: boolean; - /** Indicates if other file types are allowed. */ - AllowsOtherFiletypes?: boolean; - /** Array of file filters. */ - Filters?: FileFilter[]; - /** Title of the dialog. */ - Title?: string; - /** Message to show in the dialog. */ - Message?: string; - /** Text to display on the button. */ - ButtonText?: string; - /** Directory to open in the dialog. */ - Directory?: string; - /** Indicates if the dialog should appear detached from the main window. */ - Detached?: boolean; -} -export interface SaveFileDialogOptions { - /** Default filename to use in the dialog. */ - Filename?: string; - /** Indicates if directories can be chosen. */ - CanChooseDirectories?: boolean; - /** Indicates if files can be chosen. */ - CanChooseFiles?: boolean; - /** Indicates if directories can be created. */ - CanCreateDirectories?: boolean; - /** Indicates if hidden files should be shown. */ - ShowHiddenFiles?: boolean; - /** Indicates if aliases should be resolved. */ - ResolvesAliases?: boolean; - /** Indicates if the extension should be hidden. */ - HideExtension?: boolean; - /** Indicates if hidden extensions can be selected. */ - CanSelectHiddenExtension?: boolean; - /** Indicates if file packages should be treated as directories. */ - TreatsFilePackagesAsDirectories?: boolean; - /** Indicates if other file types are allowed. */ - AllowsOtherFiletypes?: boolean; - /** Array of file filters. */ - Filters?: FileFilter[]; - /** Title of the dialog. */ - Title?: string; - /** Message to show in the dialog. */ - Message?: string; - /** Text to display on the button. */ - ButtonText?: string; - /** Directory to open in the dialog. */ - Directory?: string; - /** Indicates if the dialog should appear detached from the main window. */ - Detached?: boolean; -} -export interface MessageDialogOptions { - /** The title of the dialog window. */ - Title?: string; - /** The main message to show in the dialog. */ - Message?: string; - /** Array of button options to show in the dialog. */ - Buttons?: Button[]; - /** True if the dialog should appear detached from the main window (if applicable). */ - Detached?: boolean; -} -export interface Button { - /** Text that appears within the button. */ - Label?: string; - /** True if the button should cancel an operation when clicked. */ - IsCancel?: boolean; - /** True if the button should be the default action when the user presses enter. */ - IsDefault?: boolean; -} -export interface FileFilter { - /** Display name for the filter, it could be "Text Files", "Images" etc. */ - DisplayName?: string; - /** Pattern to match for the filter, e.g. "*.txt;*.md" for text markdown files. */ - Pattern?: string; -} -/** - * Presents an info dialog. - * - * @param options - Dialog options - * @returns A promise that resolves with the label of the chosen button. - */ -export declare function Info(options: MessageDialogOptions): Promise; -/** - * Presents a warning dialog. - * - * @param options - Dialog options. - * @returns A promise that resolves with the label of the chosen button. - */ -export declare function Warning(options: MessageDialogOptions): Promise; -/** - * Presents an error dialog. - * - * @param options - Dialog options. - * @returns A promise that resolves with the label of the chosen button. - */ -export declare function Error(options: MessageDialogOptions): Promise; -/** - * Presents a question dialog. - * - * @param options - Dialog options. - * @returns A promise that resolves with the label of the chosen button. - */ -export declare function Question(options: MessageDialogOptions): Promise; -/** - * Presents a file selection dialog to pick one or more files to open. - * - * @param options - Dialog options. - * @returns Selected file or list of files, or a blank string/empty list if no file has been selected. - */ -export declare function OpenFile(options: OpenFileDialogOptions & { - AllowsMultipleSelection: true; -}): Promise; -export declare function OpenFile(options: OpenFileDialogOptions & { - AllowsMultipleSelection?: false | undefined; -}): Promise; -export declare function OpenFile(options: OpenFileDialogOptions): Promise; -/** - * Presents a file selection dialog to pick a file to save. - * - * @param options - Dialog options. - * @returns Selected file, or a blank string if no file has been selected. - */ -export declare function SaveFile(options: SaveFileDialogOptions): Promise; diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/types/drag.d.ts b/v3/internal/runtime/desktop/@wailsio/runtime/types/drag.d.ts deleted file mode 100644 index cb0ff5c3b..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/types/drag.d.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/types/event_types.d.ts b/v3/internal/runtime/desktop/@wailsio/runtime/types/event_types.d.ts deleted file mode 100644 index 382c32436..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/types/event_types.d.ts +++ /dev/null @@ -1,218 +0,0 @@ -export declare const Types: Readonly<{ - Windows: Readonly<{ - APMPowerSettingChange: "windows:APMPowerSettingChange"; - APMPowerStatusChange: "windows:APMPowerStatusChange"; - APMResumeAutomatic: "windows:APMResumeAutomatic"; - APMResumeSuspend: "windows:APMResumeSuspend"; - APMSuspend: "windows:APMSuspend"; - ApplicationStarted: "windows:ApplicationStarted"; - SystemThemeChanged: "windows:SystemThemeChanged"; - WebViewNavigationCompleted: "windows:WebViewNavigationCompleted"; - WindowActive: "windows:WindowActive"; - WindowBackgroundErase: "windows:WindowBackgroundErase"; - WindowClickActive: "windows:WindowClickActive"; - WindowClosing: "windows:WindowClosing"; - WindowDidMove: "windows:WindowDidMove"; - WindowDidResize: "windows:WindowDidResize"; - WindowDPIChanged: "windows:WindowDPIChanged"; - WindowDragDrop: "windows:WindowDragDrop"; - WindowDragEnter: "windows:WindowDragEnter"; - WindowDragLeave: "windows:WindowDragLeave"; - WindowDragOver: "windows:WindowDragOver"; - WindowEndMove: "windows:WindowEndMove"; - WindowEndResize: "windows:WindowEndResize"; - WindowFullscreen: "windows:WindowFullscreen"; - WindowHide: "windows:WindowHide"; - WindowInactive: "windows:WindowInactive"; - WindowKeyDown: "windows:WindowKeyDown"; - WindowKeyUp: "windows:WindowKeyUp"; - WindowKillFocus: "windows:WindowKillFocus"; - WindowNonClientHit: "windows:WindowNonClientHit"; - WindowNonClientMouseDown: "windows:WindowNonClientMouseDown"; - WindowNonClientMouseLeave: "windows:WindowNonClientMouseLeave"; - WindowNonClientMouseMove: "windows:WindowNonClientMouseMove"; - WindowNonClientMouseUp: "windows:WindowNonClientMouseUp"; - WindowPaint: "windows:WindowPaint"; - WindowRestore: "windows:WindowRestore"; - WindowSetFocus: "windows:WindowSetFocus"; - WindowShow: "windows:WindowShow"; - WindowStartMove: "windows:WindowStartMove"; - WindowStartResize: "windows:WindowStartResize"; - WindowUnFullscreen: "windows:WindowUnFullscreen"; - WindowZOrderChanged: "windows:WindowZOrderChanged"; - WindowMinimise: "windows:WindowMinimise"; - WindowUnMinimise: "windows:WindowUnMinimise"; - WindowMaximise: "windows:WindowMaximise"; - WindowUnMaximise: "windows:WindowUnMaximise"; - }>; - Mac: Readonly<{ - ApplicationDidBecomeActive: "mac:ApplicationDidBecomeActive"; - ApplicationDidChangeBackingProperties: "mac:ApplicationDidChangeBackingProperties"; - ApplicationDidChangeEffectiveAppearance: "mac:ApplicationDidChangeEffectiveAppearance"; - ApplicationDidChangeIcon: "mac:ApplicationDidChangeIcon"; - ApplicationDidChangeOcclusionState: "mac:ApplicationDidChangeOcclusionState"; - ApplicationDidChangeScreenParameters: "mac:ApplicationDidChangeScreenParameters"; - ApplicationDidChangeStatusBarFrame: "mac:ApplicationDidChangeStatusBarFrame"; - ApplicationDidChangeStatusBarOrientation: "mac:ApplicationDidChangeStatusBarOrientation"; - ApplicationDidChangeTheme: "mac:ApplicationDidChangeTheme"; - ApplicationDidFinishLaunching: "mac:ApplicationDidFinishLaunching"; - ApplicationDidHide: "mac:ApplicationDidHide"; - ApplicationDidResignActive: "mac:ApplicationDidResignActive"; - ApplicationDidUnhide: "mac:ApplicationDidUnhide"; - ApplicationDidUpdate: "mac:ApplicationDidUpdate"; - ApplicationShouldHandleReopen: "mac:ApplicationShouldHandleReopen"; - ApplicationWillBecomeActive: "mac:ApplicationWillBecomeActive"; - ApplicationWillFinishLaunching: "mac:ApplicationWillFinishLaunching"; - ApplicationWillHide: "mac:ApplicationWillHide"; - ApplicationWillResignActive: "mac:ApplicationWillResignActive"; - ApplicationWillTerminate: "mac:ApplicationWillTerminate"; - ApplicationWillUnhide: "mac:ApplicationWillUnhide"; - ApplicationWillUpdate: "mac:ApplicationWillUpdate"; - MenuDidAddItem: "mac:MenuDidAddItem"; - MenuDidBeginTracking: "mac:MenuDidBeginTracking"; - MenuDidClose: "mac:MenuDidClose"; - MenuDidDisplayItem: "mac:MenuDidDisplayItem"; - MenuDidEndTracking: "mac:MenuDidEndTracking"; - MenuDidHighlightItem: "mac:MenuDidHighlightItem"; - MenuDidOpen: "mac:MenuDidOpen"; - MenuDidPopUp: "mac:MenuDidPopUp"; - MenuDidRemoveItem: "mac:MenuDidRemoveItem"; - MenuDidSendAction: "mac:MenuDidSendAction"; - MenuDidSendActionToItem: "mac:MenuDidSendActionToItem"; - MenuDidUpdate: "mac:MenuDidUpdate"; - MenuWillAddItem: "mac:MenuWillAddItem"; - MenuWillBeginTracking: "mac:MenuWillBeginTracking"; - MenuWillDisplayItem: "mac:MenuWillDisplayItem"; - MenuWillEndTracking: "mac:MenuWillEndTracking"; - MenuWillHighlightItem: "mac:MenuWillHighlightItem"; - MenuWillOpen: "mac:MenuWillOpen"; - MenuWillPopUp: "mac:MenuWillPopUp"; - MenuWillRemoveItem: "mac:MenuWillRemoveItem"; - MenuWillSendAction: "mac:MenuWillSendAction"; - MenuWillSendActionToItem: "mac:MenuWillSendActionToItem"; - MenuWillUpdate: "mac:MenuWillUpdate"; - WebViewDidCommitNavigation: "mac:WebViewDidCommitNavigation"; - WebViewDidFinishNavigation: "mac:WebViewDidFinishNavigation"; - WebViewDidReceiveServerRedirectForProvisionalNavigation: "mac:WebViewDidReceiveServerRedirectForProvisionalNavigation"; - WebViewDidStartProvisionalNavigation: "mac:WebViewDidStartProvisionalNavigation"; - WindowDidBecomeKey: "mac:WindowDidBecomeKey"; - WindowDidBecomeMain: "mac:WindowDidBecomeMain"; - WindowDidBeginSheet: "mac:WindowDidBeginSheet"; - WindowDidChangeAlpha: "mac:WindowDidChangeAlpha"; - WindowDidChangeBackingLocation: "mac:WindowDidChangeBackingLocation"; - WindowDidChangeBackingProperties: "mac:WindowDidChangeBackingProperties"; - WindowDidChangeCollectionBehavior: "mac:WindowDidChangeCollectionBehavior"; - WindowDidChangeEffectiveAppearance: "mac:WindowDidChangeEffectiveAppearance"; - WindowDidChangeOcclusionState: "mac:WindowDidChangeOcclusionState"; - WindowDidChangeOrderingMode: "mac:WindowDidChangeOrderingMode"; - WindowDidChangeScreen: "mac:WindowDidChangeScreen"; - WindowDidChangeScreenParameters: "mac:WindowDidChangeScreenParameters"; - WindowDidChangeScreenProfile: "mac:WindowDidChangeScreenProfile"; - WindowDidChangeScreenSpace: "mac:WindowDidChangeScreenSpace"; - WindowDidChangeScreenSpaceProperties: "mac:WindowDidChangeScreenSpaceProperties"; - WindowDidChangeSharingType: "mac:WindowDidChangeSharingType"; - WindowDidChangeSpace: "mac:WindowDidChangeSpace"; - WindowDidChangeSpaceOrderingMode: "mac:WindowDidChangeSpaceOrderingMode"; - WindowDidChangeTitle: "mac:WindowDidChangeTitle"; - WindowDidChangeToolbar: "mac:WindowDidChangeToolbar"; - WindowDidDeminiaturize: "mac:WindowDidDeminiaturize"; - WindowDidEndSheet: "mac:WindowDidEndSheet"; - WindowDidEnterFullScreen: "mac:WindowDidEnterFullScreen"; - WindowDidEnterVersionBrowser: "mac:WindowDidEnterVersionBrowser"; - WindowDidExitFullScreen: "mac:WindowDidExitFullScreen"; - WindowDidExitVersionBrowser: "mac:WindowDidExitVersionBrowser"; - WindowDidExpose: "mac:WindowDidExpose"; - WindowDidFocus: "mac:WindowDidFocus"; - WindowDidMiniaturize: "mac:WindowDidMiniaturize"; - WindowDidMove: "mac:WindowDidMove"; - WindowDidOrderOffScreen: "mac:WindowDidOrderOffScreen"; - WindowDidOrderOnScreen: "mac:WindowDidOrderOnScreen"; - WindowDidResignKey: "mac:WindowDidResignKey"; - WindowDidResignMain: "mac:WindowDidResignMain"; - WindowDidResize: "mac:WindowDidResize"; - WindowDidUpdate: "mac:WindowDidUpdate"; - WindowDidUpdateAlpha: "mac:WindowDidUpdateAlpha"; - WindowDidUpdateCollectionBehavior: "mac:WindowDidUpdateCollectionBehavior"; - WindowDidUpdateCollectionProperties: "mac:WindowDidUpdateCollectionProperties"; - WindowDidUpdateShadow: "mac:WindowDidUpdateShadow"; - WindowDidUpdateTitle: "mac:WindowDidUpdateTitle"; - WindowDidUpdateToolbar: "mac:WindowDidUpdateToolbar"; - WindowDidZoom: "mac:WindowDidZoom"; - WindowFileDraggingEntered: "mac:WindowFileDraggingEntered"; - WindowFileDraggingExited: "mac:WindowFileDraggingExited"; - WindowFileDraggingPerformed: "mac:WindowFileDraggingPerformed"; - WindowHide: "mac:WindowHide"; - WindowMaximise: "mac:WindowMaximise"; - WindowUnMaximise: "mac:WindowUnMaximise"; - WindowMinimise: "mac:WindowMinimise"; - WindowUnMinimise: "mac:WindowUnMinimise"; - WindowShouldClose: "mac:WindowShouldClose"; - WindowShow: "mac:WindowShow"; - WindowWillBecomeKey: "mac:WindowWillBecomeKey"; - WindowWillBecomeMain: "mac:WindowWillBecomeMain"; - WindowWillBeginSheet: "mac:WindowWillBeginSheet"; - WindowWillChangeOrderingMode: "mac:WindowWillChangeOrderingMode"; - WindowWillClose: "mac:WindowWillClose"; - WindowWillDeminiaturize: "mac:WindowWillDeminiaturize"; - WindowWillEnterFullScreen: "mac:WindowWillEnterFullScreen"; - WindowWillEnterVersionBrowser: "mac:WindowWillEnterVersionBrowser"; - WindowWillExitFullScreen: "mac:WindowWillExitFullScreen"; - WindowWillExitVersionBrowser: "mac:WindowWillExitVersionBrowser"; - WindowWillFocus: "mac:WindowWillFocus"; - WindowWillMiniaturize: "mac:WindowWillMiniaturize"; - WindowWillMove: "mac:WindowWillMove"; - WindowWillOrderOffScreen: "mac:WindowWillOrderOffScreen"; - WindowWillOrderOnScreen: "mac:WindowWillOrderOnScreen"; - WindowWillResignMain: "mac:WindowWillResignMain"; - WindowWillResize: "mac:WindowWillResize"; - WindowWillUnfocus: "mac:WindowWillUnfocus"; - WindowWillUpdate: "mac:WindowWillUpdate"; - WindowWillUpdateAlpha: "mac:WindowWillUpdateAlpha"; - WindowWillUpdateCollectionBehavior: "mac:WindowWillUpdateCollectionBehavior"; - WindowWillUpdateCollectionProperties: "mac:WindowWillUpdateCollectionProperties"; - WindowWillUpdateShadow: "mac:WindowWillUpdateShadow"; - WindowWillUpdateTitle: "mac:WindowWillUpdateTitle"; - WindowWillUpdateToolbar: "mac:WindowWillUpdateToolbar"; - WindowWillUpdateVisibility: "mac:WindowWillUpdateVisibility"; - WindowWillUseStandardFrame: "mac:WindowWillUseStandardFrame"; - WindowZoomIn: "mac:WindowZoomIn"; - WindowZoomOut: "mac:WindowZoomOut"; - WindowZoomReset: "mac:WindowZoomReset"; - }>; - Linux: Readonly<{ - ApplicationStartup: "linux:ApplicationStartup"; - SystemThemeChanged: "linux:SystemThemeChanged"; - WindowDeleteEvent: "linux:WindowDeleteEvent"; - WindowDidMove: "linux:WindowDidMove"; - WindowDidResize: "linux:WindowDidResize"; - WindowFocusIn: "linux:WindowFocusIn"; - WindowFocusOut: "linux:WindowFocusOut"; - WindowLoadChanged: "linux:WindowLoadChanged"; - }>; - Common: Readonly<{ - ApplicationOpenedWithFile: "common:ApplicationOpenedWithFile"; - ApplicationStarted: "common:ApplicationStarted"; - ThemeChanged: "common:ThemeChanged"; - WindowClosing: "common:WindowClosing"; - WindowDidMove: "common:WindowDidMove"; - WindowDidResize: "common:WindowDidResize"; - WindowDPIChanged: "common:WindowDPIChanged"; - WindowFilesDropped: "common:WindowFilesDropped"; - WindowFocus: "common:WindowFocus"; - WindowFullscreen: "common:WindowFullscreen"; - WindowHide: "common:WindowHide"; - WindowLostFocus: "common:WindowLostFocus"; - WindowMaximise: "common:WindowMaximise"; - WindowMinimise: "common:WindowMinimise"; - WindowRestore: "common:WindowRestore"; - WindowRuntimeReady: "common:WindowRuntimeReady"; - WindowShow: "common:WindowShow"; - WindowUnFullscreen: "common:WindowUnFullscreen"; - WindowUnMaximise: "common:WindowUnMaximise"; - WindowUnMinimise: "common:WindowUnMinimise"; - WindowZoom: "common:WindowZoom"; - WindowZoomIn: "common:WindowZoomIn"; - WindowZoomOut: "common:WindowZoomOut"; - WindowZoomReset: "common:WindowZoomReset"; - }>; -}>; diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/types/events.d.ts b/v3/internal/runtime/desktop/@wailsio/runtime/types/events.d.ts deleted file mode 100644 index 11d03e1aa..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/types/events.d.ts +++ /dev/null @@ -1,66 +0,0 @@ -export { Types } from "./event_types.js"; -/** - * The type of handlers for a given event. - */ -export type Callback = (ev: WailsEvent) => void; -/** - * Represents a system event or a custom event emitted through wails-provided facilities. - */ -export declare class WailsEvent { - /** - * The name of the event. - */ - name: string; - /** - * Optional data associated with the emitted event. - */ - data: any; - /** - * Name of the originating window. Omitted for application events. - * Will be overridden if set manually. - */ - sender?: string; - constructor(name: string, data?: any); -} -/** - * Register a callback function to be called multiple times for a specific event. - * - * @param eventName - The name of the event to register the callback for. - * @param callback - The callback function to be called when the event is triggered. - * @param maxCallbacks - The maximum number of times the callback can be called for the event. Once the maximum number is reached, the callback will no longer be called. - * @returns A function that, when called, will unregister the callback from the event. - */ -export declare function OnMultiple(eventName: string, callback: Callback, maxCallbacks: number): () => void; -/** - * Registers a callback function to be executed when the specified event occurs. - * - * @param eventName - The name of the event to register the callback for. - * @param callback - The callback function to be called when the event is triggered. - * @returns A function that, when called, will unregister the callback from the event. - */ -export declare function On(eventName: string, callback: Callback): () => void; -/** - * Registers a callback function to be executed only once for the specified event. - * - * @param eventName - The name of the event to register the callback for. - * @param callback - The callback function to be called when the event is triggered. - * @returns A function that, when called, will unregister the callback from the event. - */ -export declare function Once(eventName: string, callback: Callback): () => void; -/** - * Removes event listeners for the specified event names. - * - * @param eventNames - The name of the events to remove listeners for. - */ -export declare function Off(...eventNames: [string, ...string[]]): void; -/** - * Removes all event listeners. - */ -export declare function OffAll(): void; -/** - * Emits the given event. - * - * @param event - The name of the event to emit. - * @returns A promise that will be fulfilled once the event has been emitted. - */ -export declare function Emit(event: WailsEvent): Promise; diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/types/flags.d.ts b/v3/internal/runtime/desktop/@wailsio/runtime/types/flags.d.ts deleted file mode 100644 index 272aa9193..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/types/flags.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Retrieves the value associated with the specified key from the flag map. - * - * @param key - The key to retrieve the value for. - * @return The value associated with the specified key. - */ -export declare function GetFlag(key: string): any; diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/types/index.d.ts b/v3/internal/runtime/desktop/@wailsio/runtime/types/index.d.ts deleted file mode 100644 index 54dca2206..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/types/index.d.ts +++ /dev/null @@ -1,16 +0,0 @@ -import "./contextmenu.js"; -import "./drag.js"; -import * as Application from "./application.js"; -import * as Browser from "./browser.js"; -import * as Call from "./calls.js"; -import * as Clipboard from "./clipboard.js"; -import * as Create from "./create.js"; -import * as Dialogs from "./dialogs.js"; -import * as Events from "./events.js"; -import * as Flags from "./flags.js"; -import * as Screens from "./screens.js"; -import * as System from "./system.js"; -import Window from "./window.js"; -import * as WML from "./wml.js"; -export { Application, Browser, Call, Clipboard, Dialogs, Events, Flags, Screens, System, Window, WML }; -export * from "./cancellable.js"; diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/types/listener.d.ts b/v3/internal/runtime/desktop/@wailsio/runtime/types/listener.d.ts deleted file mode 100644 index 75bb5c458..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/types/listener.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -export declare const eventListeners: Map; -export declare class Listener { - eventName: string; - callback: (data: any) => void; - maxCallbacks: number; - constructor(eventName: string, callback: (data: any) => void, maxCallbacks: number); - dispatch(data: any): boolean; -} -export declare function listenerOff(listener: Listener): void; diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/types/nanoid.d.ts b/v3/internal/runtime/desktop/@wailsio/runtime/types/nanoid.d.ts deleted file mode 100644 index a691510e5..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/types/nanoid.d.ts +++ /dev/null @@ -1 +0,0 @@ -export declare function nanoid(size?: number): string; diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/types/runtime.d.ts b/v3/internal/runtime/desktop/@wailsio/runtime/types/runtime.d.ts deleted file mode 100644 index 60f760628..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/types/runtime.d.ts +++ /dev/null @@ -1,22 +0,0 @@ -export declare const objectNames: Readonly<{ - Call: 0; - Clipboard: 1; - Application: 2; - Events: 3; - ContextMenu: 4; - Dialog: 5; - Window: 6; - Screens: 7; - System: 8; - Browser: 9; - CancelCall: 10; -}>; -export declare let clientId: string; -/** - * Creates a new runtime caller with specified ID. - * - * @param object - The object to invoke the method on. - * @param windowName - The name of the window. - * @return The new runtime caller function. - */ -export declare function newRuntimeCaller(object: number, windowName?: string): (method: number, args?: any) => Promise; diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/types/screens.d.ts b/v3/internal/runtime/desktop/@wailsio/runtime/types/screens.d.ts deleted file mode 100644 index b4a2f622d..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/types/screens.d.ts +++ /dev/null @@ -1,60 +0,0 @@ -export interface Size { - /** The width of a rectangular area. */ - Width: number; - /** The height of a rectangular area. */ - Height: number; -} -export interface Rect { - /** The X coordinate of the origin. */ - X: number; - /** The Y coordinate of the origin. */ - Y: number; - /** The width of the rectangle. */ - Width: number; - /** The height of the rectangle. */ - Height: number; -} -export interface Screen { - /** Unique identifier for the screen. */ - ID: string; - /** Human-readable name of the screen. */ - Name: string; - /** The scale factor of the screen (DPI/96). 1 = standard DPI, 2 = HiDPI (Retina), etc. */ - ScaleFactor: number; - /** The X coordinate of the screen. */ - X: number; - /** The Y coordinate of the screen. */ - Y: number; - /** Contains the width and height of the screen. */ - Size: Size; - /** Contains the bounds of the screen in terms of X, Y, Width, and Height. */ - Bounds: Rect; - /** Contains the physical bounds of the screen in terms of X, Y, Width, and Height (before scaling). */ - PhysicalBounds: Rect; - /** Contains the area of the screen that is actually usable (excluding taskbar and other system UI). */ - WorkArea: Rect; - /** Contains the physical WorkArea of the screen (before scaling). */ - PhysicalWorkArea: Rect; - /** True if this is the primary monitor selected by the user in the operating system. */ - IsPrimary: boolean; - /** The rotation of the screen. */ - Rotation: number; -} -/** - * Gets all screens. - * - * @returns A promise that resolves to an array of Screen objects. - */ -export declare function GetAll(): Promise; -/** - * Gets the primary screen. - * - * @returns A promise that resolves to the primary screen. - */ -export declare function GetPrimary(): Promise; -/** - * Gets the current active screen. - * - * @returns A promise that resolves with the current active screen. - */ -export declare function GetCurrent(): Promise; diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/types/system.d.ts b/v3/internal/runtime/desktop/@wailsio/runtime/types/system.d.ts deleted file mode 100644 index 1e1924bd3..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/types/system.d.ts +++ /dev/null @@ -1,83 +0,0 @@ -export declare function invoke(msg: any): void; -/** - * Retrieves the system dark mode status. - * - * @returns A promise that resolves to a boolean value indicating if the system is in dark mode. - */ -export declare function IsDarkMode(): Promise; -/** - * Fetches the capabilities of the application from the server. - * - * @returns A promise that resolves to an object containing the capabilities. - */ -export declare function Capabilities(): Promise>; -export interface OSInfo { - /** The branding of the OS. */ - Branding: string; - /** The ID of the OS. */ - ID: string; - /** The name of the OS. */ - Name: string; - /** The version of the OS. */ - Version: string; -} -export interface EnvironmentInfo { - /** The architecture of the system. */ - Arch: string; - /** True if the application is running in debug mode, otherwise false. */ - Debug: boolean; - /** The operating system in use. */ - OS: string; - /** Details of the operating system. */ - OSInfo: OSInfo; - /** Additional platform information. */ - PlatformInfo: Record; -} -/** - * Retrieves environment details. - * - * @returns A promise that resolves to an object containing OS and system architecture. - */ -export declare function Environment(): Promise; -/** - * Checks if the current operating system is Windows. - * - * @return True if the operating system is Windows, otherwise false. - */ -export declare function IsWindows(): boolean; -/** - * Checks if the current operating system is Linux. - * - * @returns Returns true if the current operating system is Linux, false otherwise. - */ -export declare function IsLinux(): boolean; -/** - * Checks if the current environment is a macOS operating system. - * - * @returns True if the environment is macOS, false otherwise. - */ -export declare function IsMac(): boolean; -/** - * Checks if the current environment architecture is AMD64. - * - * @returns True if the current environment architecture is AMD64, false otherwise. - */ -export declare function IsAMD64(): boolean; -/** - * Checks if the current architecture is ARM. - * - * @returns True if the current architecture is ARM, false otherwise. - */ -export declare function IsARM(): boolean; -/** - * Checks if the current environment is ARM64 architecture. - * - * @returns Returns true if the environment is ARM64 architecture, otherwise returns false. - */ -export declare function IsARM64(): boolean; -/** - * Reports whether the app is being run in debug mode. - * - * @returns True if the app is being run in debug mode. - */ -export declare function IsDebug(): boolean; diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/types/utils.d.ts b/v3/internal/runtime/desktop/@wailsio/runtime/types/utils.d.ts deleted file mode 100644 index d748a049c..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/types/utils.d.ts +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Logs a message to the console with custom formatting. - * - * @param message - The message to be logged. - */ -export declare function debugLog(message: any): void; -/** - * Checks whether the webview supports the {@link MouseEvent#buttons} property. - * Looking at you macOS High Sierra! - */ -export declare function canTrackButtons(): boolean; -/** - * Checks whether the browser supports removing listeners by triggering an AbortSignal - * (see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#signal). - */ -export declare function canAbortListeners(): boolean; -/** - * Resolves the closest HTMLElement ancestor of an event's target. - */ -export declare function eventTarget(event: Event): HTMLElement; -export declare function whenReady(callback: () => void): void; diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/types/window.d.ts b/v3/internal/runtime/desktop/@wailsio/runtime/types/window.d.ts deleted file mode 100644 index 3acecfb38..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/types/window.d.ts +++ /dev/null @@ -1,292 +0,0 @@ -import type { Screen } from "./screens.js"; -/** - * A record describing the position of a window. - */ -interface Position { - /** The horizontal position of the window. */ - x: number; - /** The vertical position of the window. */ - y: number; -} -/** - * A record describing the size of a window. - */ -interface Size { - /** The width of the window. */ - width: number; - /** The height of the window. */ - height: number; -} -declare const callerSym: unique symbol; -declare class Window { - private [callerSym]; - /** - * Initialises a window object with the specified name. - * - * @private - * @param name - The name of the target window. - */ - constructor(name?: string); - /** - * Gets the specified window. - * - * @param name - The name of the window to get. - * @returns The corresponding window object. - */ - Get(name: string): Window; - /** - * Returns the absolute position of the window. - * - * @returns The current absolute position of the window. - */ - Position(): Promise; - /** - * Centers the window on the screen. - */ - Center(): Promise; - /** - * Closes the window. - */ - Close(): Promise; - /** - * Disables min/max size constraints. - */ - DisableSizeConstraints(): Promise; - /** - * Enables min/max size constraints. - */ - EnableSizeConstraints(): Promise; - /** - * Focuses the window. - */ - Focus(): Promise; - /** - * Forces the window to reload the page assets. - */ - ForceReload(): Promise; - /** - * Switches the window to fullscreen mode. - */ - Fullscreen(): Promise; - /** - * Returns the screen that the window is on. - * - * @returns The screen the window is currently on. - */ - GetScreen(): Promise; - /** - * Returns the current zoom level of the window. - * - * @returns The current zoom level. - */ - GetZoom(): Promise; - /** - * Returns the height of the window. - * - * @returns The current height of the window. - */ - Height(): Promise; - /** - * Hides the window. - */ - Hide(): Promise; - /** - * Returns true if the window is focused. - * - * @returns Whether the window is currently focused. - */ - IsFocused(): Promise; - /** - * Returns true if the window is fullscreen. - * - * @returns Whether the window is currently fullscreen. - */ - IsFullscreen(): Promise; - /** - * Returns true if the window is maximised. - * - * @returns Whether the window is currently maximised. - */ - IsMaximised(): Promise; - /** - * Returns true if the window is minimised. - * - * @returns Whether the window is currently minimised. - */ - IsMinimised(): Promise; - /** - * Maximises the window. - */ - Maximise(): Promise; - /** - * Minimises the window. - */ - Minimise(): Promise; - /** - * Returns the name of the window. - * - * @returns The name of the window. - */ - Name(): Promise; - /** - * Opens the development tools pane. - */ - OpenDevTools(): Promise; - /** - * Returns the relative position of the window to the screen. - * - * @returns The current relative position of the window. - */ - RelativePosition(): Promise; - /** - * Reloads the page assets. - */ - Reload(): Promise; - /** - * Returns true if the window is resizable. - * - * @returns Whether the window is currently resizable. - */ - Resizable(): Promise; - /** - * Restores the window to its previous state if it was previously minimised, maximised or fullscreen. - */ - Restore(): Promise; - /** - * Sets the absolute position of the window. - * - * @param x - The desired horizontal absolute position of the window. - * @param y - The desired vertical absolute position of the window. - */ - SetPosition(x: number, y: number): Promise; - /** - * Sets the window to be always on top. - * - * @param alwaysOnTop - Whether the window should stay on top. - */ - SetAlwaysOnTop(alwaysOnTop: boolean): Promise; - /** - * Sets the background colour of the window. - * - * @param r - The desired red component of the window background. - * @param g - The desired green component of the window background. - * @param b - The desired blue component of the window background. - * @param a - The desired alpha component of the window background. - */ - SetBackgroundColour(r: number, g: number, b: number, a: number): Promise; - /** - * Removes the window frame and title bar. - * - * @param frameless - Whether the window should be frameless. - */ - SetFrameless(frameless: boolean): Promise; - /** - * Disables the system fullscreen button. - * - * @param enabled - Whether the fullscreen button should be enabled. - */ - SetFullscreenButtonEnabled(enabled: boolean): Promise; - /** - * Sets the maximum size of the window. - * - * @param width - The desired maximum width of the window. - * @param height - The desired maximum height of the window. - */ - SetMaxSize(width: number, height: number): Promise; - /** - * Sets the minimum size of the window. - * - * @param width - The desired minimum width of the window. - * @param height - The desired minimum height of the window. - */ - SetMinSize(width: number, height: number): Promise; - /** - * Sets the relative position of the window to the screen. - * - * @param x - The desired horizontal relative position of the window. - * @param y - The desired vertical relative position of the window. - */ - SetRelativePosition(x: number, y: number): Promise; - /** - * Sets whether the window is resizable. - * - * @param resizable - Whether the window should be resizable. - */ - SetResizable(resizable: boolean): Promise; - /** - * Sets the size of the window. - * - * @param width - The desired width of the window. - * @param height - The desired height of the window. - */ - SetSize(width: number, height: number): Promise; - /** - * Sets the title of the window. - * - * @param title - The desired title of the window. - */ - SetTitle(title: string): Promise; - /** - * Sets the zoom level of the window. - * - * @param zoom - The desired zoom level. - */ - SetZoom(zoom: number): Promise; - /** - * Shows the window. - */ - Show(): Promise; - /** - * Returns the size of the window. - * - * @returns The current size of the window. - */ - Size(): Promise; - /** - * Toggles the window between fullscreen and normal. - */ - ToggleFullscreen(): Promise; - /** - * Toggles the window between maximised and normal. - */ - ToggleMaximise(): Promise; - /** - * Un-fullscreens the window. - */ - UnFullscreen(): Promise; - /** - * Un-maximises the window. - */ - UnMaximise(): Promise; - /** - * Un-minimises the window. - */ - UnMinimise(): Promise; - /** - * Returns the width of the window. - * - * @returns The current width of the window. - */ - Width(): Promise; - /** - * Zooms the window. - */ - Zoom(): Promise; - /** - * Increases the zoom level of the webview content. - */ - ZoomIn(): Promise; - /** - * Decreases the zoom level of the webview content. - */ - ZoomOut(): Promise; - /** - * Resets the zoom level of the webview content. - */ - ZoomReset(): Promise; -} -/** - * The window within which the script is running. - */ -declare const thisWindow: Window; -export default thisWindow; diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/types/wml.d.ts b/v3/internal/runtime/desktop/@wailsio/runtime/types/wml.d.ts deleted file mode 100644 index 020a3c59d..000000000 --- a/v3/internal/runtime/desktop/@wailsio/runtime/types/wml.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -/** - * Schedules an automatic reload of WML to be performed as soon as the document is fully loaded. - */ -export declare function Enable(): void; -/** - * Reloads the WML page by adding necessary event listeners and browser listeners. - */ -export declare function Reload(): void; From c468af839c612905c3dcfc0308f113c9680d9667 Mon Sep 17 00:00:00 2001 From: Fabio Massaioli Date: Fri, 28 Feb 2025 22:22:53 +0100 Subject: [PATCH 117/374] Ignore build artifacts --- v3/internal/runtime/.gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/v3/internal/runtime/.gitignore b/v3/internal/runtime/.gitignore index b91601cbd..059d2134d 100644 --- a/v3/internal/runtime/.gitignore +++ b/v3/internal/runtime/.gitignore @@ -1,3 +1,5 @@ node_modules .task *.tsbuildinfo +desktop/@wailsio/runtime/dist/ +desktop/@wailsio/runtime/types/ From 2a424f6be5940b2586beac76bc1a723877674015 Mon Sep 17 00:00:00 2001 From: Fabio Massaioli Date: Fri, 28 Feb 2025 22:31:10 +0100 Subject: [PATCH 118/374] Simplify ci pipeline --- .github/workflows/publish-npm.yml | 44 +++---------------------------- 1 file changed, 4 insertions(+), 40 deletions(-) diff --git a/.github/workflows/publish-npm.yml b/.github/workflows/publish-npm.yml index b91f76c46..eb7275f30 100644 --- a/.github/workflows/publish-npm.yml +++ b/.github/workflows/publish-npm.yml @@ -12,8 +12,7 @@ jobs: name: Detect committed changes if: github.event_name != 'workflow_dispatch' outputs: - rebuild: ${{ steps.source-changes.outputs.any_modified == 'true' }} - publish: ${{ steps.package-json-changes.outputs.any_modified == 'true' || steps.build-artifact-changes.outputs.any_modified == 'true' }} + changed: ${{ steps.package-json-changes.outputs.any_modified == 'true' || steps.source-changes.outputs.any_modified == 'true' }} runs-on: ubuntu-latest steps: - name: Checkout code @@ -29,19 +28,9 @@ jobs: files: | v3/internal/runtime/desktop/@wailsio/runtime/package.json - - name: Detect committed build artifact changes - if: steps.package-json-changes.outputs.any_modified != 'true' - id: build-artifact-changes - uses: tj-actions/changed-files@v45 - with: - files: | - v3/internal/runtime/desktop/@wailsio/runtime/dist/** - v3/internal/runtime/desktop/@wailsio/runtime/types/** - - name: Detect committed source changes if: >- steps.package-json-changes.outputs.any_modified != 'true' - && steps.build-artifact-changes.outputs.any_modified != 'true' id: source-changes uses: tj-actions/changed-files@v45 with: @@ -58,9 +47,7 @@ jobs: needs: [detect] if: >- !failure() && !cancelled() - && (github.event_name == 'workflow_dispatch' || needs.detect.outputs.publish == 'true' || needs.detect.outputs.rebuild == 'true') - env: - publish: ${{ github.event_name == 'workflow_dispatch' || needs.detect.outputs.publish == 'true' }} + && (github.event_name == 'workflow_dispatch' || needs.detect.outputs.changed == 'true') runs-on: ubuntu-latest steps: - name: Checkout code @@ -106,44 +93,21 @@ jobs: npm test npm run build - - name: Detect build artifact changes - if: env.publish != 'true' - uses: tj-actions/verify-changed-files@v20 - id: build-artifact-changes - with: | - v3/internal/runtime/desktop/@wailsio/runtime/dist/** - v3/internal/runtime/desktop/@wailsio/runtime/types/** - - - name: Publish required? - id: publish-required - env: - required: ${{ env.publish == 'true' || steps.build-artifact-changes.outputs.files_changed == 'true' }} - run: echo "required=$required" >> "$GITHUB_OUTPUT" - - name: Bump version - if: steps.publish-required.outputs.required == 'true' id: bump-version working-directory: v3/internal/runtime/desktop/@wailsio/runtime run: | echo "version=$(npm --no-git-tag-version --force version prerelease)" >> "$GITHUB_OUTPUT" - name: Commit changes - env: - new_version: ${{ steps.publish-required.outputs.required }} run: | git add . - if git diff --cached --quiet; then - if [ "$new_version" = "true" ]; then - git commit -m "[skip ci] Publish @wailsio/runtime ${{ steps.bump-version.outputs.version }}" - else - git commit -m "[skip ci] Update runtime docs and bundle" - fi - git push + git commit -m "[skip ci] Publish @wailsio/runtime ${{ steps.bump-version.outputs.version }}" + git push fi - name: Publish npm package uses: JS-DevTools/npm-publish@v3 - if: steps.publish-required.outputs.required == 'true' with: package: v3/internal/runtime/desktop/@wailsio/runtime access: public From d130544b1b41f1526d17f57dd34a26362d4e67eb Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Sat, 1 Mar 2025 05:24:18 +0000 Subject: [PATCH 119/374] [skip ci] Publish @wailsio/runtime v3.0.0-alpha.67 --- .../docs/classes/Call.RuntimeError.html | 4 +- .../runtime/docs/classes/CancelError.html | 4 +- .../docs/classes/CancellablePromise.html | 48 ++++----- .../docs/classes/CancelledRejectionError.html | 6 +- .../docs/classes/Events.WailsEvent.html | 10 +- .../docs/classes/_internal_.Window.html | 100 +++++++++--------- .../docs/functions/Application.Hide.html | 2 +- .../docs/functions/Application.Quit.html | 2 +- .../docs/functions/Application.Show.html | 2 +- .../docs/functions/Browser.OpenURL.html | 2 +- .../runtime/docs/functions/Call.ByID.html | 2 +- .../runtime/docs/functions/Call.ByName.html | 2 +- .../runtime/docs/functions/Call.Call.html | 2 +- .../docs/functions/Clipboard.SetText.html | 2 +- .../docs/functions/Clipboard.Text.html | 2 +- .../runtime/docs/functions/Dialogs.Error.html | 2 +- .../runtime/docs/functions/Dialogs.Info.html | 2 +- .../docs/functions/Dialogs.OpenFile.html | 6 +- .../docs/functions/Dialogs.Question.html | 2 +- .../docs/functions/Dialogs.SaveFile.html | 2 +- .../docs/functions/Dialogs.Warning.html | 2 +- .../runtime/docs/functions/Events.Emit.html | 2 +- .../runtime/docs/functions/Events.Off.html | 2 +- .../runtime/docs/functions/Events.OffAll.html | 2 +- .../runtime/docs/functions/Events.On.html | 2 +- .../docs/functions/Events.OnMultiple.html | 2 +- .../runtime/docs/functions/Events.Once.html | 2 +- .../runtime/docs/functions/Flags.GetFlag.html | 2 +- .../docs/functions/Screens.GetAll.html | 2 +- .../docs/functions/Screens.GetCurrent.html | 2 +- .../docs/functions/Screens.GetPrimary.html | 2 +- .../docs/functions/System.Capabilities.html | 2 +- .../docs/functions/System.Environment.html | 2 +- .../docs/functions/System.IsAMD64.html | 2 +- .../runtime/docs/functions/System.IsARM.html | 2 +- .../docs/functions/System.IsARM64.html | 2 +- .../docs/functions/System.IsDarkMode.html | 2 +- .../docs/functions/System.IsDebug.html | 2 +- .../docs/functions/System.IsLinux.html | 2 +- .../runtime/docs/functions/System.IsMac.html | 2 +- .../docs/functions/System.IsWindows.html | 2 +- .../runtime/docs/functions/System.invoke.html | 2 +- .../runtime/docs/functions/WML.Enable.html | 2 +- .../runtime/docs/functions/WML.Reload.html | 2 +- .../interfaces/CancellablePromiseLike.html | 4 +- .../CancellablePromiseWithResolvers.html | 4 +- .../docs/interfaces/Dialogs.Button.html | 8 +- .../docs/interfaces/Dialogs.FileFilter.html | 6 +- .../Dialogs.MessageDialogOptions.html | 10 +- .../Dialogs.OpenFileDialogOptions.html | 34 +++--- .../Dialogs.SaveFileDialogOptions.html | 34 +++--- .../runtime/docs/interfaces/Screens.Rect.html | 10 +- .../docs/interfaces/Screens.Screen.html | 26 ++--- .../runtime/docs/interfaces/Screens.Size.html | 6 +- .../interfaces/System.EnvironmentInfo.html | 12 +-- .../docs/interfaces/System.OSInfo.html | 10 +- .../docs/interfaces/_internal_.Position.html | 6 +- .../docs/interfaces/_internal_.Size.html | 6 +- .../runtime/docs/types/Call.CallOptions.html | 2 +- .../runtime/docs/types/Events.Callback.html | 2 +- ...internal_.CancellablePromiseCanceller.html | 2 +- ..._internal_.CancellablePromiseExecutor.html | 2 +- ..._internal_.CancellablePromiseRejector.html | 2 +- ..._internal_.CancellablePromiseResolver.html | 2 +- .../runtime/docs/variables/Events.Types.html | 2 +- .../runtime/docs/variables/Window.html | 2 +- .../@wailsio/runtime/package-lock.json | 4 +- .../desktop/@wailsio/runtime/package.json | 2 +- 68 files changed, 225 insertions(+), 225 deletions(-) diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Call.RuntimeError.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Call.RuntimeError.html index ca5cfd551..c4e9ce71d 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Call.RuntimeError.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Call.RuntimeError.html @@ -1,6 +1,6 @@ RuntimeError | @wailsio/runtime

    Exception class that will be thrown in case the bound method returns an error. The value of the RuntimeError#name property is "RuntimeError".

    -

    Hierarchy

    Constructors

    Hierarchy

    Constructors

    Properties

    cause? message name @@ -8,4 +8,4 @@ The value of the

    Constructors

    • Constructs a new RuntimeError instance.

      Parameters

      • Optionalmessage: string

        The error message.

      • Optionaloptions: ErrorOptions

        Options to be forwarded to the Error constructor.

        -

      Returns RuntimeError

    Properties

    cause?: unknown
    message: string
    name: string
    stack?: string
    +

    Returns RuntimeError

    Properties

    cause?: unknown
    message: string
    name: string
    stack?: string
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/CancelError.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/CancelError.html index f58023ef1..b5c76bcea 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/CancelError.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/CancelError.html @@ -2,7 +2,7 @@ in case a CancellablePromise is cancelled successfully.

    The value of the name property is the string "CancelError". The value of the cause property is the cause passed to the cancel method, if any.

    -

    Hierarchy

    Constructors

    Hierarchy

    Constructors

    Properties

    cause? message name @@ -10,4 +10,4 @@ The value of the

    Constructors

    Properties

    cause?: unknown
    message: string
    name: string
    stack?: string
    +

    Returns CancelError

    Properties

    cause?: unknown
    message: string
    name: string
    stack?: string
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/CancellablePromise.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/CancellablePromise.html index 3d6cdb828..2b8d294df 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/CancellablePromise.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/CancellablePromise.html @@ -35,7 +35,7 @@ This might be reconsidered in case the proposal is retired.

    and is compliant with the Promises/A+ specification (it passes the compliance suite) if so is the underlying implementation.

    -

    Type Parameters

    • T

    Hierarchy

    Implements

    Properties

    "[toStringTag]": string
    "[species]": PromiseConstructor

    Methods

    • Cancels immediately the execution of the operation associated with this promise. +

    Returns CancellablePromise<T>

    Properties

    "[toStringTag]": string
    "[species]": PromiseConstructor

    Methods

    • Cancels immediately the execution of the operation associated with this promise. The promise rejects with a CancelError instance as reason, with the CancelError#cause property set to the given argument, if any.

      Has no effect if called after the promise has already settled; @@ -122,7 +122,7 @@ without being forced to handle potential errors at the call site.

      that might have occurred already in the cancelled chain. It will just track whether registered handlers have been executed or not. Therefore, unhandled rejections will never be silently handled by calling cancel.

      -
    • Attaches a callback for only the rejection of the Promise.

      The optional oncancelled argument will be invoked when the returned promise is cancelled, with the same semantics as the oncancelled argument of the constructor. When the parent promise rejects or is cancelled, the onrejected callback will run, @@ -162,7 +162,7 @@ up the entire promise chain have been run.

      cancellation requests will be diverted to it, and the specified oncancelled callback will be discarded. See then for more details.

      -
    • Attaches a callback that is invoked when the CancellablePromise is settled (fulfilled or rejected). The resolved value cannot be accessed or modified from the callback. The returned promise will settle in the same state as the original one after the provided callback has completed execution, @@ -186,7 +186,7 @@ up the entire promise chain have been run.

      cancellation requests will be diverted to it, and the specified oncancelled callback will be discarded. See then for more details.

      -

    Static Methods

    Static Methods

    • Creates a CancellablePromise that is resolved with an array of results when all of the provided Promises resolve, or rejected when any Promise is rejected.

      Every one of the provided objects that is a thenable and cancellable object will be cancelled when the returned promise is cancelled, with the same cause.

      -

      Type Parameters

      • T

      Parameters

      Returns CancellablePromise<Awaited<T>[]>

    • Creates a Promise that is resolved with an array of results when all of the provided Promises +

      Type Parameters

      • T

      Parameters

      Returns CancellablePromise<Awaited<T>[]>

    • Creates a Promise that is resolved with an array of results when all of the provided Promises resolve, or rejected when any Promise is rejected.

      Type Parameters

      • T extends [] | readonly unknown[]

      Parameters

      • values: T

        An array of Promises.

      Returns CancellablePromise<
          { -readonly [P in string
          | number
          | symbol]: Awaited<T[P<P>]> },
      >

      A new Promise.

      -
    • The any function returns a promise that is fulfilled by the first given promise to be fulfilled, or rejected with an AggregateError containing an array of rejection reasons if all of the given promises are rejected. It resolves all elements of the passed iterable to promises as it runs this algorithm.

      Every one of the provided objects that is a thenable and cancellable object will be cancelled when the returned promise is cancelled, with the same cause.

      -

      Type Parameters

      • T

      Parameters

      Returns CancellablePromise<Awaited<T>>

    • The any function returns a promise that is fulfilled by the first given promise to be fulfilled, or rejected with an AggregateError containing an array of rejection reasons if all of the given promises are rejected. It resolves all elements of the passed iterable to promises as it runs this algorithm.

      +

      Type Parameters

      • T

      Parameters

      Returns CancellablePromise<Awaited<T>>

    • The any function returns a promise that is fulfilled by the first given promise to be fulfilled, or rejected with an AggregateError containing an array of rejection reasons if all of the given promises are rejected. It resolves all elements of the passed iterable to promises as it runs this algorithm.

      Type Parameters

      • T extends [] | readonly unknown[]

      Parameters

      • values: T

        An array or iterable of Promises.

      Returns CancellablePromise<Awaited<T[number]>>

      A new Promise.

      -
    • Creates a new CancellablePromise that cancels after the specified timeout, with the provided cause.

      If the AbortSignal.timeout factory method is available, it is used to base the timeout on active time rather than elapsed time. Otherwise, timeout falls back to setTimeout.

      -

      Type Parameters

      • T = never

      Parameters

      • milliseconds: number
      • Optionalcause: any

      Returns CancellablePromise<T>

    +

    Type Parameters

    • T

    Returns CancellablePromiseWithResolvers<T>

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/CancelledRejectionError.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/CancelledRejectionError.html index 583de7b96..a13e5ba4c 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/CancelledRejectionError.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/CancelledRejectionError.html @@ -6,7 +6,7 @@ The value of the promise property holds a reference to the original promise.

    -

    Hierarchy

    • Error
      • CancelledRejectionError

    Properties

    cause?: unknown
    message: string
    name: string
    promise: CancellablePromise<unknown>

    Holds a reference to the promise that was cancelled and then rejected.

    -
    stack?: string
    +

    Returns CancelledRejectionError

    Properties

    cause?: unknown
    message: string
    name: string
    promise: CancellablePromise<unknown>

    Holds a reference to the promise that was cancelled and then rejected.

    +
    stack?: string
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Events.WailsEvent.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Events.WailsEvent.html index df6d0afe7..57ba9c59f 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Events.WailsEvent.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/Events.WailsEvent.html @@ -1,10 +1,10 @@ WailsEvent | @wailsio/runtime

    Represents a system event or a custom event emitted through wails-provided facilities.

    -

    Constructors

    Constructors

    Properties

    Constructors

    Properties

    data: any

    Optional data associated with the emitted event.

    -
    name: string

    The name of the event.

    -
    sender?: string

    Name of the originating window. Omitted for application events. +

    Constructors

    Properties

    data: any

    Optional data associated with the emitted event.

    +
    name: string

    The name of the event.

    +
    sender?: string

    Name of the originating window. Omitted for application events. Will be overridden if set manually.

    -
    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/_internal_.Window.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/_internal_.Window.html index 609e1f21b..58decc6cd 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/_internal_.Window.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/classes/_internal_.Window.html @@ -1,4 +1,4 @@ -Window | @wailsio/runtime

    Methods

    Center +Window | @wailsio/runtime

    Methods

    • Gets the specified window.

      Parameters

      • name: string

        The name of the window to get.

      Returns Window

      The corresponding window object.

      -
    • Returns true if the window is focused.

      Returns Promise<boolean>

      Whether the window is currently focused.

      -
    • Returns true if the window is fullscreen.

      Returns Promise<boolean>

      Whether the window is currently fullscreen.

      -
    • Returns true if the window is maximised.

      Returns Promise<boolean>

      Whether the window is currently maximised.

      -
    • Returns true if the window is minimised.

      Returns Promise<boolean>

      Whether the window is currently minimised.

      -
    • Returns true if the window is resizable.

      Returns Promise<boolean>

      Whether the window is currently resizable.

      -
    • Restores the window to its previous state if it was previously minimised, maximised or fullscreen.

      -

      Returns Promise<void>

    • Restores the window to its previous state if it was previously minimised, maximised or fullscreen.

      +

      Returns Promise<void>

    • Sets the window to be always on top.

      Parameters

      • alwaysOnTop: boolean

        Whether the window should stay on top.

        -

      Returns Promise<void>

    • Sets the background colour of the window.

      +

    Returns Promise<void>

    • Sets the background colour of the window.

      Parameters

      • r: number

        The desired red component of the window background.

      • g: number

        The desired green component of the window background.

      • b: number

        The desired blue component of the window background.

      • a: number

        The desired alpha component of the window background.

        -

      Returns Promise<void>

    • Removes the window frame and title bar.

      +

    Returns Promise<void>

    • Removes the window frame and title bar.

      Parameters

      • frameless: boolean

        Whether the window should be frameless.

        -

      Returns Promise<void>

    • Disables the system fullscreen button.

      +

    Returns Promise<void>

    • Disables the system fullscreen button.

      Parameters

      • enabled: boolean

        Whether the fullscreen button should be enabled.

        -

      Returns Promise<void>

    • Sets the maximum size of the window.

      +

    Returns Promise<void>

    • Sets the maximum size of the window.

      Parameters

      • width: number

        The desired maximum width of the window.

      • height: number

        The desired maximum height of the window.

        -

      Returns Promise<void>

    • Sets the minimum size of the window.

      +

    Returns Promise<void>

    • Sets the minimum size of the window.

      Parameters

      • width: number

        The desired minimum width of the window.

      • height: number

        The desired minimum height of the window.

        -

      Returns Promise<void>

    • Sets the absolute position of the window.

      +

    Returns Promise<void>

    • Sets the absolute position of the window.

      Parameters

      • x: number

        The desired horizontal absolute position of the window.

      • y: number

        The desired vertical absolute position of the window.

        -

      Returns Promise<void>

    • Sets the relative position of the window to the screen.

      +

    Returns Promise<void>

    • Sets the relative position of the window to the screen.

      Parameters

      • x: number

        The desired horizontal relative position of the window.

      • y: number

        The desired vertical relative position of the window.

        -

      Returns Promise<void>

    • Sets whether the window is resizable.

      +

    Returns Promise<void>

    • Sets whether the window is resizable.

      Parameters

      • resizable: boolean

        Whether the window should be resizable.

        -

      Returns Promise<void>

    • Sets the size of the window.

      +

    Returns Promise<void>

    • Sets the size of the window.

      Parameters

      • width: number

        The desired width of the window.

      • height: number

        The desired height of the window.

        -

      Returns Promise<void>

    • Sets the title of the window.

      +

    Returns Promise<void>

    • Sets the title of the window.

      Parameters

      • title: string

        The desired title of the window.

        -

      Returns Promise<void>

    • Sets the zoom level of the window.

      +

    Returns Promise<void>

    • Sets the zoom level of the window.

      Parameters

      • zoom: number

        The desired zoom level.

        -

      Returns Promise<void>

    Returns Promise<void>

    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Hide.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Hide.html index 7f2061908..4828abe86 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Hide.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Hide.html @@ -1,2 +1,2 @@ Hide | @wailsio/runtime
    +

    Returns Promise<void>

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Quit.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Quit.html index 7350cfb7f..bb3ec1cb1 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Quit.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Quit.html @@ -1,2 +1,2 @@ Quit | @wailsio/runtime
    +

    Returns Promise<void>

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Show.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Show.html index 5c885e54f..83e6d02be 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Show.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Application.Show.html @@ -1,2 +1,2 @@ Show | @wailsio/runtime
    +

    Returns Promise<void>

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Browser.OpenURL.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Browser.OpenURL.html index d8e9d2292..c489dc6af 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Browser.OpenURL.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Browser.OpenURL.html @@ -1,3 +1,3 @@ OpenURL | @wailsio/runtime
    +

    Returns Promise<void>

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByID.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByID.html index 70e252457..f155a72c4 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByID.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByID.html @@ -3,4 +3,4 @@ See Call for details.

    Parameters

    • methodID: number

      The ID of the method to call.

    • ...args: any[]

      The arguments to pass to the method.

    Returns CancellablePromise<any>

    The result of the method call.

    -
    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByName.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByName.html index 41c05d873..231587484 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByName.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.ByName.html @@ -3,4 +3,4 @@ See Call for details.

    Parameters

    • methodName: string

      The name of the method in the format 'package.struct.method'.

    • ...args: any[]

      The arguments to pass to the method.

    Returns CancellablePromise<any>

    The result of the method call.

    -
    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.Call.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.Call.html index ded96e319..48ed3e3a0 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.Call.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Call.Call.html @@ -6,4 +6,4 @@ The exception might have a "cause" field with the value returned by the application- or service-level error marshaling functions.

    Parameters

    Returns CancellablePromise<any>

    The result of the call.

    -
    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.SetText.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.SetText.html index da2582dd7..681208368 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.SetText.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.SetText.html @@ -1,4 +1,4 @@ SetText | @wailsio/runtime
    • Sets the text to the Clipboard.

      Parameters

      • text: string

        The text to be set to the Clipboard.

      Returns Promise<void>

      A Promise that resolves when the operation is successful.

      -
    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.Text.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.Text.html index cb58a2930..4e0514fe5 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.Text.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Clipboard.Text.html @@ -1,3 +1,3 @@ Text | @wailsio/runtime
    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Error.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Error.html index f9df8a693..1fbdcf82e 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Error.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Error.html @@ -1,4 +1,4 @@ Error | @wailsio/runtime
    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Info.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Info.html index d751a8f42..e8606ad19 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Info.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Info.html @@ -1,4 +1,4 @@ Info | @wailsio/runtime
    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.OpenFile.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.OpenFile.html index 34406d0f2..13ba2d544 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.OpenFile.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.OpenFile.html @@ -1,10 +1,10 @@ OpenFile | @wailsio/runtime
    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Question.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Question.html index ffe292169..cb7ad090a 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Question.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Question.html @@ -1,4 +1,4 @@ Question | @wailsio/runtime
    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.SaveFile.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.SaveFile.html index d6c5d2644..7e2ec1103 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.SaveFile.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.SaveFile.html @@ -1,4 +1,4 @@ SaveFile | @wailsio/runtime
    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Warning.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Warning.html index 3849593ed..be1da407a 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Warning.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Dialogs.Warning.html @@ -1,4 +1,4 @@ Warning | @wailsio/runtime
    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Emit.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Emit.html index 4b1585a0b..9bb54d786 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Emit.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Emit.html @@ -1,4 +1,4 @@ Emit | @wailsio/runtime
    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Off.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Off.html index a740a6027..4be336e2a 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Off.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Off.html @@ -1,3 +1,3 @@ Off | @wailsio/runtime
    • Removes event listeners for the specified event names.

      Parameters

      • ...eventNames: [string, ...string[]]

        The name of the events to remove listeners for.

        -

      Returns void

    +

    Returns void

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OffAll.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OffAll.html index 68baa6387..e1015a79b 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OffAll.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OffAll.html @@ -1,2 +1,2 @@ OffAll | @wailsio/runtime
    +

    Returns void

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.On.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.On.html index eb0203c7c..5d679cbd7 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.On.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.On.html @@ -2,4 +2,4 @@

    Parameters

    • eventName: string

      The name of the event to register the callback for.

    • callback: Callback

      The callback function to be called when the event is triggered.

    Returns () => void

    A function that, when called, will unregister the callback from the event.

    -
    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OnMultiple.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OnMultiple.html index 29118f3f7..af4f37190 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OnMultiple.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.OnMultiple.html @@ -3,4 +3,4 @@
  • callback: Callback

    The callback function to be called when the event is triggered.

  • maxCallbacks: number

    The maximum number of times the callback can be called for the event. Once the maximum number is reached, the callback will no longer be called.

  • Returns () => void

    A function that, when called, will unregister the callback from the event.

    -
    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Once.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Once.html index 6acc7279f..33bf9a888 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Once.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Events.Once.html @@ -2,4 +2,4 @@

    Parameters

    • eventName: string

      The name of the event to register the callback for.

    • callback: Callback

      The callback function to be called when the event is triggered.

    Returns () => void

    A function that, when called, will unregister the callback from the event.

    -
    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Flags.GetFlag.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Flags.GetFlag.html index e2c9aba48..2c56d0f1b 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Flags.GetFlag.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Flags.GetFlag.html @@ -1,4 +1,4 @@ GetFlag | @wailsio/runtime
    • Retrieves the value associated with the specified key from the flag map.

      Parameters

      • key: string

        The key to retrieve the value for.

      Returns any

      The value associated with the specified key.

      -
    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetAll.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetAll.html index 2d37fb8ed..45d99bb96 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetAll.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetAll.html @@ -1,3 +1,3 @@ GetAll | @wailsio/runtime
    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetCurrent.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetCurrent.html index 3fb2fe93e..b042871d5 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetCurrent.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetCurrent.html @@ -1,3 +1,3 @@ GetCurrent | @wailsio/runtime
    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetPrimary.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetPrimary.html index 1c5dc871c..a7bb9f8c7 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetPrimary.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/Screens.GetPrimary.html @@ -1,3 +1,3 @@ GetPrimary | @wailsio/runtime
    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Capabilities.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Capabilities.html index 0942ab6c4..9127e3a45 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Capabilities.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Capabilities.html @@ -1,3 +1,3 @@ Capabilities | @wailsio/runtime
    • Fetches the capabilities of the application from the server.

      Returns Promise<Record<string, any>>

      A promise that resolves to an object containing the capabilities.

      -
    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Environment.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Environment.html index ddef570a3..b98671991 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Environment.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.Environment.html @@ -1,3 +1,3 @@ Environment | @wailsio/runtime
    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsAMD64.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsAMD64.html index 54d67e121..2d6df4336 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsAMD64.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsAMD64.html @@ -1,3 +1,3 @@ IsAMD64 | @wailsio/runtime
    • Checks if the current environment architecture is AMD64.

      Returns boolean

      True if the current environment architecture is AMD64, false otherwise.

      -
    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM.html index 60517d83f..5083d6364 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM.html @@ -1,3 +1,3 @@ IsARM | @wailsio/runtime
    • Checks if the current architecture is ARM.

      Returns boolean

      True if the current architecture is ARM, false otherwise.

      -
    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM64.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM64.html index 0203192bc..eba6cd3e9 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM64.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsARM64.html @@ -1,3 +1,3 @@ IsARM64 | @wailsio/runtime
    • Checks if the current environment is ARM64 architecture.

      Returns boolean

      Returns true if the environment is ARM64 architecture, otherwise returns false.

      -
    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDarkMode.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDarkMode.html index 0667df68b..493882fb0 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDarkMode.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDarkMode.html @@ -1,3 +1,3 @@ IsDarkMode | @wailsio/runtime
    • Retrieves the system dark mode status.

      Returns Promise<boolean>

      A promise that resolves to a boolean value indicating if the system is in dark mode.

      -
    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDebug.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDebug.html index dea3c4d8f..0c0370239 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDebug.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsDebug.html @@ -1,3 +1,3 @@ IsDebug | @wailsio/runtime
    • Reports whether the app is being run in debug mode.

      Returns boolean

      True if the app is being run in debug mode.

      -
    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsLinux.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsLinux.html index 950e608c2..43e1498c5 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsLinux.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsLinux.html @@ -1,3 +1,3 @@ IsLinux | @wailsio/runtime
    • Checks if the current operating system is Linux.

      Returns boolean

      Returns true if the current operating system is Linux, false otherwise.

      -
    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsMac.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsMac.html index e924ffca7..d366be072 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsMac.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsMac.html @@ -1,3 +1,3 @@ IsMac | @wailsio/runtime
    • Checks if the current environment is a macOS operating system.

      Returns boolean

      True if the environment is macOS, false otherwise.

      -
    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsWindows.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsWindows.html index 51ce008d3..8948d39dc 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsWindows.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.IsWindows.html @@ -1,3 +1,3 @@ IsWindows | @wailsio/runtime
    • Checks if the current operating system is Windows.

      Returns boolean

      True if the operating system is Windows, otherwise false.

      -
    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.invoke.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.invoke.html index 1990b1ac5..d7455476c 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.invoke.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/System.invoke.html @@ -1 +1 @@ -invoke | @wailsio/runtime
    +invoke | @wailsio/runtime
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Enable.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Enable.html index c45e617fd..46bffbe7d 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Enable.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Enable.html @@ -1,2 +1,2 @@ Enable | @wailsio/runtime
    • Schedules an automatic reload of WML to be performed as soon as the document is fully loaded.

      -

      Returns void

    +

    Returns void

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Reload.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Reload.html index b20325018..41478c379 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Reload.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/functions/WML.Reload.html @@ -1,2 +1,2 @@ Reload | @wailsio/runtime
    • Reloads the WML page by adding necessary event listeners and browser listeners.

      -

      Returns void

    +

    Returns void

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/CancellablePromiseLike.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/CancellablePromiseLike.html index a65b1b218..e7a8ca6f3 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/CancellablePromiseLike.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/CancellablePromiseLike.html @@ -1,3 +1,3 @@ -CancellablePromiseLike | @wailsio/runtime

    Interface CancellablePromiseLike<T>

    interface CancellablePromiseLike<T> {
        cancel(cause?: any): void | PromiseLike<void>;
        then<TResult1 = T, TResult2 = never>(
            onfulfilled?:
                | null
                | (
                    value: T,
                ) => TResult1 | PromiseLike<TResult1> | CancellablePromiseLike<TResult1>,
            onrejected?:
                | null
                | (
                    reason: any,
                ) => TResult2 | PromiseLike<TResult2> | CancellablePromiseLike<TResult2>,
        ): CancellablePromiseLike<TResult1 | TResult2>;
    }

    Type Parameters

    • T

    Implemented by

    Methods

    cancel +CancellablePromiseLike | @wailsio/runtime

    Interface CancellablePromiseLike<T>

    interface CancellablePromiseLike<T> {
        cancel(cause?: any): void | PromiseLike<void>;
        then<TResult1 = T, TResult2 = never>(
            onfulfilled?:
                | null
                | (
                    value: T,
                ) => TResult1 | PromiseLike<TResult1> | CancellablePromiseLike<TResult1>,
            onrejected?:
                | null
                | (
                    reason: any,
                ) => TResult2 | PromiseLike<TResult2> | CancellablePromiseLike<TResult2>,
        ): CancellablePromiseLike<TResult1 | TResult2>;
    }

    Type Parameters

    • T

    Implemented by

    Methods

    Methods

    +

    Methods

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/CancellablePromiseWithResolvers.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/CancellablePromiseWithResolvers.html index 19ea7eeb6..3bd162eae 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/CancellablePromiseWithResolvers.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/CancellablePromiseWithResolvers.html @@ -1,7 +1,7 @@ CancellablePromiseWithResolvers | @wailsio/runtime

    Interface CancellablePromiseWithResolvers<T>

    Wraps a cancellable promise along with its resolution methods. The oncancelled field will be null initially but may be set to provide a custom cancellation function.

    -
    interface CancellablePromiseWithResolvers<T> {
        oncancelled: null | CancellablePromiseCanceller;
        promise: CancellablePromise<T>;
        reject: CancellablePromiseRejector;
        resolve: CancellablePromiseResolver<T>;
    }

    Type Parameters

    • T

    Properties

    interface CancellablePromiseWithResolvers<T> {
        oncancelled: null | CancellablePromiseCanceller;
        promise: CancellablePromise<T>;
        reject: CancellablePromiseRejector;
        resolve: CancellablePromiseResolver<T>;
    }

    Type Parameters

    • T

    Properties

    oncancelled: null | CancellablePromiseCanceller
    +

    Properties

    oncancelled: null | CancellablePromiseCanceller
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.Button.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.Button.html index 9ba223601..925410339 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.Button.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.Button.html @@ -1,7 +1,7 @@ -Button | @wailsio/runtime
    interface Button {
        IsCancel?: boolean;
        IsDefault?: boolean;
        Label?: string;
    }

    Properties

    IsCancel? +Button | @wailsio/runtime
    interface Button {
        IsCancel?: boolean;
        IsDefault?: boolean;
        Label?: string;
    }

    Properties

    IsCancel?: boolean

    True if the button should cancel an operation when clicked.

    -
    IsDefault?: boolean

    True if the button should be the default action when the user presses enter.

    -
    Label?: string

    Text that appears within the button.

    -
    +
    IsDefault?: boolean

    True if the button should be the default action when the user presses enter.

    +
    Label?: string

    Text that appears within the button.

    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.FileFilter.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.FileFilter.html index c2e603664..09958a9cd 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.FileFilter.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.FileFilter.html @@ -1,5 +1,5 @@ -FileFilter | @wailsio/runtime
    interface FileFilter {
        DisplayName?: string;
        Pattern?: string;
    }

    Properties

    DisplayName? +FileFilter | @wailsio/runtime
    interface FileFilter {
        DisplayName?: string;
        Pattern?: string;
    }

    Properties

    DisplayName?: string

    Display name for the filter, it could be "Text Files", "Images" etc.

    -
    Pattern?: string

    Pattern to match for the filter, e.g. ".txt;.md" for text markdown files.

    -
    +
    Pattern?: string

    Pattern to match for the filter, e.g. ".txt;.md" for text markdown files.

    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.MessageDialogOptions.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.MessageDialogOptions.html index 0b4bc0f29..27ccf9d7a 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.MessageDialogOptions.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.MessageDialogOptions.html @@ -1,9 +1,9 @@ -MessageDialogOptions | @wailsio/runtime

    Interface MessageDialogOptions

    interface MessageDialogOptions {
        Buttons?: Button[];
        Detached?: boolean;
        Message?: string;
        Title?: string;
    }

    Properties

    Buttons? +MessageDialogOptions | @wailsio/runtime

    Interface MessageDialogOptions

    interface MessageDialogOptions {
        Buttons?: Button[];
        Detached?: boolean;
        Message?: string;
        Title?: string;
    }

    Properties

    Buttons?: Button[]

    Array of button options to show in the dialog.

    -
    Detached?: boolean

    True if the dialog should appear detached from the main window (if applicable).

    -
    Message?: string

    The main message to show in the dialog.

    -
    Title?: string

    The title of the dialog window.

    -
    +
    Detached?: boolean

    True if the dialog should appear detached from the main window (if applicable).

    +
    Message?: string

    The main message to show in the dialog.

    +
    Title?: string

    The title of the dialog window.

    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.OpenFileDialogOptions.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.OpenFileDialogOptions.html index a9d22d556..3dd409a4f 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.OpenFileDialogOptions.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.OpenFileDialogOptions.html @@ -1,4 +1,4 @@ -OpenFileDialogOptions | @wailsio/runtime

    Interface OpenFileDialogOptions

    interface OpenFileDialogOptions {
        AllowsMultipleSelection?: boolean;
        AllowsOtherFiletypes?: boolean;
        ButtonText?: string;
        CanChooseDirectories?: boolean;
        CanChooseFiles?: boolean;
        CanCreateDirectories?: boolean;
        CanSelectHiddenExtension?: boolean;
        Detached?: boolean;
        Directory?: string;
        Filters?: FileFilter[];
        HideExtension?: boolean;
        Message?: string;
        ResolvesAliases?: boolean;
        ShowHiddenFiles?: boolean;
        Title?: string;
        TreatsFilePackagesAsDirectories?: boolean;
    }

    Properties

    AllowsMultipleSelection? +OpenFileDialogOptions | @wailsio/runtime

    Interface OpenFileDialogOptions

    interface OpenFileDialogOptions {
        AllowsMultipleSelection?: boolean;
        AllowsOtherFiletypes?: boolean;
        ButtonText?: string;
        CanChooseDirectories?: boolean;
        CanChooseFiles?: boolean;
        CanCreateDirectories?: boolean;
        CanSelectHiddenExtension?: boolean;
        Detached?: boolean;
        Directory?: string;
        Filters?: FileFilter[];
        HideExtension?: boolean;
        Message?: string;
        ResolvesAliases?: boolean;
        ShowHiddenFiles?: boolean;
        Title?: string;
        TreatsFilePackagesAsDirectories?: boolean;
    }

    Properties

    AllowsMultipleSelection?: boolean

    Indicates if multiple selection is allowed.

    -
    AllowsOtherFiletypes?: boolean

    Indicates if other file types are allowed.

    -
    ButtonText?: string

    Text to display on the button.

    -
    CanChooseDirectories?: boolean

    Indicates if directories can be chosen.

    -
    CanChooseFiles?: boolean

    Indicates if files can be chosen.

    -
    CanCreateDirectories?: boolean

    Indicates if directories can be created.

    -
    CanSelectHiddenExtension?: boolean

    Indicates if hidden extensions can be selected.

    -
    Detached?: boolean

    Indicates if the dialog should appear detached from the main window.

    -
    Directory?: string

    Directory to open in the dialog.

    -
    Filters?: FileFilter[]

    Array of file filters.

    -
    HideExtension?: boolean

    Indicates if the extension should be hidden.

    -
    Message?: string

    Message to show in the dialog.

    -
    ResolvesAliases?: boolean

    Indicates if aliases should be resolved.

    -
    ShowHiddenFiles?: boolean

    Indicates if hidden files should be shown.

    -
    Title?: string

    Title of the dialog.

    -
    TreatsFilePackagesAsDirectories?: boolean

    Indicates if file packages should be treated as directories.

    -
    +
    AllowsOtherFiletypes?: boolean

    Indicates if other file types are allowed.

    +
    ButtonText?: string

    Text to display on the button.

    +
    CanChooseDirectories?: boolean

    Indicates if directories can be chosen.

    +
    CanChooseFiles?: boolean

    Indicates if files can be chosen.

    +
    CanCreateDirectories?: boolean

    Indicates if directories can be created.

    +
    CanSelectHiddenExtension?: boolean

    Indicates if hidden extensions can be selected.

    +
    Detached?: boolean

    Indicates if the dialog should appear detached from the main window.

    +
    Directory?: string

    Directory to open in the dialog.

    +
    Filters?: FileFilter[]

    Array of file filters.

    +
    HideExtension?: boolean

    Indicates if the extension should be hidden.

    +
    Message?: string

    Message to show in the dialog.

    +
    ResolvesAliases?: boolean

    Indicates if aliases should be resolved.

    +
    ShowHiddenFiles?: boolean

    Indicates if hidden files should be shown.

    +
    Title?: string

    Title of the dialog.

    +
    TreatsFilePackagesAsDirectories?: boolean

    Indicates if file packages should be treated as directories.

    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.SaveFileDialogOptions.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.SaveFileDialogOptions.html index 3a8611dab..6752aefc3 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.SaveFileDialogOptions.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Dialogs.SaveFileDialogOptions.html @@ -1,4 +1,4 @@ -SaveFileDialogOptions | @wailsio/runtime

    Interface SaveFileDialogOptions

    interface SaveFileDialogOptions {
        AllowsOtherFiletypes?: boolean;
        ButtonText?: string;
        CanChooseDirectories?: boolean;
        CanChooseFiles?: boolean;
        CanCreateDirectories?: boolean;
        CanSelectHiddenExtension?: boolean;
        Detached?: boolean;
        Directory?: string;
        Filename?: string;
        Filters?: FileFilter[];
        HideExtension?: boolean;
        Message?: string;
        ResolvesAliases?: boolean;
        ShowHiddenFiles?: boolean;
        Title?: string;
        TreatsFilePackagesAsDirectories?: boolean;
    }

    Properties

    AllowsOtherFiletypes? +SaveFileDialogOptions | @wailsio/runtime

    Interface SaveFileDialogOptions

    interface SaveFileDialogOptions {
        AllowsOtherFiletypes?: boolean;
        ButtonText?: string;
        CanChooseDirectories?: boolean;
        CanChooseFiles?: boolean;
        CanCreateDirectories?: boolean;
        CanSelectHiddenExtension?: boolean;
        Detached?: boolean;
        Directory?: string;
        Filename?: string;
        Filters?: FileFilter[];
        HideExtension?: boolean;
        Message?: string;
        ResolvesAliases?: boolean;
        ShowHiddenFiles?: boolean;
        Title?: string;
        TreatsFilePackagesAsDirectories?: boolean;
    }

    Properties

    AllowsOtherFiletypes?: boolean

    Indicates if other file types are allowed.

    -
    ButtonText?: string

    Text to display on the button.

    -
    CanChooseDirectories?: boolean

    Indicates if directories can be chosen.

    -
    CanChooseFiles?: boolean

    Indicates if files can be chosen.

    -
    CanCreateDirectories?: boolean

    Indicates if directories can be created.

    -
    CanSelectHiddenExtension?: boolean

    Indicates if hidden extensions can be selected.

    -
    Detached?: boolean

    Indicates if the dialog should appear detached from the main window.

    -
    Directory?: string

    Directory to open in the dialog.

    -
    Filename?: string

    Default filename to use in the dialog.

    -
    Filters?: FileFilter[]

    Array of file filters.

    -
    HideExtension?: boolean

    Indicates if the extension should be hidden.

    -
    Message?: string

    Message to show in the dialog.

    -
    ResolvesAliases?: boolean

    Indicates if aliases should be resolved.

    -
    ShowHiddenFiles?: boolean

    Indicates if hidden files should be shown.

    -
    Title?: string

    Title of the dialog.

    -
    TreatsFilePackagesAsDirectories?: boolean

    Indicates if file packages should be treated as directories.

    -
    +
    ButtonText?: string

    Text to display on the button.

    +
    CanChooseDirectories?: boolean

    Indicates if directories can be chosen.

    +
    CanChooseFiles?: boolean

    Indicates if files can be chosen.

    +
    CanCreateDirectories?: boolean

    Indicates if directories can be created.

    +
    CanSelectHiddenExtension?: boolean

    Indicates if hidden extensions can be selected.

    +
    Detached?: boolean

    Indicates if the dialog should appear detached from the main window.

    +
    Directory?: string

    Directory to open in the dialog.

    +
    Filename?: string

    Default filename to use in the dialog.

    +
    Filters?: FileFilter[]

    Array of file filters.

    +
    HideExtension?: boolean

    Indicates if the extension should be hidden.

    +
    Message?: string

    Message to show in the dialog.

    +
    ResolvesAliases?: boolean

    Indicates if aliases should be resolved.

    +
    ShowHiddenFiles?: boolean

    Indicates if hidden files should be shown.

    +
    Title?: string

    Title of the dialog.

    +
    TreatsFilePackagesAsDirectories?: boolean

    Indicates if file packages should be treated as directories.

    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Rect.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Rect.html index f8f873f49..3c3b36416 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Rect.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Rect.html @@ -1,9 +1,9 @@ -Rect | @wailsio/runtime
    interface Rect {
        Height: number;
        Width: number;
        X: number;
        Y: number;
    }

    Properties

    Height +Rect | @wailsio/runtime
    interface Rect {
        Height: number;
        Width: number;
        X: number;
        Y: number;
    }

    Properties

    Properties

    Height: number

    The height of the rectangle.

    -
    Width: number

    The width of the rectangle.

    -
    X: number

    The X coordinate of the origin.

    -
    Y: number

    The Y coordinate of the origin.

    -
    +
    Width: number

    The width of the rectangle.

    +
    X: number

    The X coordinate of the origin.

    +
    Y: number

    The Y coordinate of the origin.

    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Screen.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Screen.html index e8500345f..78e0df769 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Screen.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Screen.html @@ -1,4 +1,4 @@ -Screen | @wailsio/runtime
    interface Screen {
        Bounds: Rect;
        ID: string;
        IsPrimary: boolean;
        Name: string;
        PhysicalBounds: Rect;
        PhysicalWorkArea: Rect;
        Rotation: number;
        ScaleFactor: number;
        Size: Screens.Size;
        WorkArea: Rect;
        X: number;
        Y: number;
    }

    Properties

    Bounds +Screen | @wailsio/runtime
    interface Screen {
        Bounds: Rect;
        ID: string;
        IsPrimary: boolean;
        Name: string;
        PhysicalBounds: Rect;
        PhysicalWorkArea: Rect;
        Rotation: number;
        ScaleFactor: number;
        Size: Screens.Size;
        WorkArea: Rect;
        X: number;
        Y: number;
    }

    Properties

    Bounds ID IsPrimary Name @@ -11,15 +11,15 @@ X Y

    Properties

    Bounds: Rect

    Contains the bounds of the screen in terms of X, Y, Width, and Height.

    -
    ID: string

    Unique identifier for the screen.

    -
    IsPrimary: boolean

    True if this is the primary monitor selected by the user in the operating system.

    -
    Name: string

    Human-readable name of the screen.

    -
    PhysicalBounds: Rect

    Contains the physical bounds of the screen in terms of X, Y, Width, and Height (before scaling).

    -
    PhysicalWorkArea: Rect

    Contains the physical WorkArea of the screen (before scaling).

    -
    Rotation: number

    The rotation of the screen.

    -
    ScaleFactor: number

    The scale factor of the screen (DPI/96). 1 = standard DPI, 2 = HiDPI (Retina), etc.

    -

    Contains the width and height of the screen.

    -
    WorkArea: Rect

    Contains the area of the screen that is actually usable (excluding taskbar and other system UI).

    -
    X: number

    The X coordinate of the screen.

    -
    Y: number

    The Y coordinate of the screen.

    -
    +
    ID: string

    Unique identifier for the screen.

    +
    IsPrimary: boolean

    True if this is the primary monitor selected by the user in the operating system.

    +
    Name: string

    Human-readable name of the screen.

    +
    PhysicalBounds: Rect

    Contains the physical bounds of the screen in terms of X, Y, Width, and Height (before scaling).

    +
    PhysicalWorkArea: Rect

    Contains the physical WorkArea of the screen (before scaling).

    +
    Rotation: number

    The rotation of the screen.

    +
    ScaleFactor: number

    The scale factor of the screen (DPI/96). 1 = standard DPI, 2 = HiDPI (Retina), etc.

    +

    Contains the width and height of the screen.

    +
    WorkArea: Rect

    Contains the area of the screen that is actually usable (excluding taskbar and other system UI).

    +
    X: number

    The X coordinate of the screen.

    +
    Y: number

    The Y coordinate of the screen.

    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Size.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Size.html index 850d4eea4..03f72fcaf 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Size.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/Screens.Size.html @@ -1,5 +1,5 @@ -Size | @wailsio/runtime
    interface Size {
        Height: number;
        Width: number;
    }

    Properties

    Height +Size | @wailsio/runtime
    interface Size {
        Height: number;
        Width: number;
    }

    Properties

    Properties

    Height: number

    The height of a rectangular area.

    -
    Width: number

    The width of a rectangular area.

    -
    +
    Width: number

    The width of a rectangular area.

    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.EnvironmentInfo.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.EnvironmentInfo.html index 1465b378f..891e7dcaa 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.EnvironmentInfo.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.EnvironmentInfo.html @@ -1,11 +1,11 @@ -EnvironmentInfo | @wailsio/runtime

    Interface EnvironmentInfo

    interface EnvironmentInfo {
        Arch: string;
        Debug: boolean;
        OS: string;
        OSInfo: OSInfo;
        PlatformInfo: Record<string, any>;
    }

    Properties

    Arch +EnvironmentInfo | @wailsio/runtime

    Interface EnvironmentInfo

    interface EnvironmentInfo {
        Arch: string;
        Debug: boolean;
        OS: string;
        OSInfo: OSInfo;
        PlatformInfo: Record<string, any>;
    }

    Properties

    Arch: string

    The architecture of the system.

    -
    Debug: boolean

    True if the application is running in debug mode, otherwise false.

    -
    OS: string

    The operating system in use.

    -
    OSInfo: OSInfo

    Details of the operating system.

    -
    PlatformInfo: Record<string, any>

    Additional platform information.

    -
    +
    Debug: boolean

    True if the application is running in debug mode, otherwise false.

    +
    OS: string

    The operating system in use.

    +
    OSInfo: OSInfo

    Details of the operating system.

    +
    PlatformInfo: Record<string, any>

    Additional platform information.

    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.OSInfo.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.OSInfo.html index 9fe3cb690..3f2b84f9e 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.OSInfo.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/System.OSInfo.html @@ -1,9 +1,9 @@ -OSInfo | @wailsio/runtime
    interface OSInfo {
        Branding: string;
        ID: string;
        Name: string;
        Version: string;
    }

    Properties

    Branding +OSInfo | @wailsio/runtime
    interface OSInfo {
        Branding: string;
        ID: string;
        Name: string;
        Version: string;
    }

    Properties

    Properties

    Branding: string

    The branding of the OS.

    -
    ID: string

    The ID of the OS.

    -
    Name: string

    The name of the OS.

    -
    Version: string

    The version of the OS.

    -
    +
    ID: string

    The ID of the OS.

    +
    Name: string

    The name of the OS.

    +
    Version: string

    The version of the OS.

    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.Position.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.Position.html index 9ca564221..5318385e9 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.Position.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.Position.html @@ -1,6 +1,6 @@ Position | @wailsio/runtime

    A record describing the position of a window.

    -
    interface Position {
        x: number;
        y: number;
    }

    Properties

    x +
    interface Position {
        x: number;
        y: number;
    }

    Properties

    x y

    Properties

    x: number

    The horizontal position of the window.

    -
    y: number

    The vertical position of the window.

    -
    +
    y: number

    The vertical position of the window.

    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.Size.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.Size.html index 5b479462c..7faa0d375 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.Size.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/interfaces/_internal_.Size.html @@ -1,6 +1,6 @@ Size | @wailsio/runtime

    A record describing the size of a window.

    -
    interface Size {
        height: number;
        width: number;
    }

    Properties

    interface Size {
        height: number;
        width: number;
    }

    Properties

    Properties

    height: number

    The height of the window.

    -
    width: number

    The width of the window.

    -
    +
    width: number

    The width of the window.

    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/Call.CallOptions.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/Call.CallOptions.html index 6a68da485..8bb2ba3c9 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/Call.CallOptions.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/Call.CallOptions.html @@ -6,4 +6,4 @@ May provide either a method ID or a method name, but not both.

  • { args: any[]; methodID?: never; methodName: string }
    • args: any[]

      Arguments to be passed into the bound method.

    • OptionalmethodID?: never

      The numeric ID of the bound method to call.

    • methodName: string

      The fully qualified name of the bound method to call.

      -
  • +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/Events.Callback.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/Events.Callback.html index 4a648b247..03c56fff2 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/Events.Callback.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/Events.Callback.html @@ -1,2 +1,2 @@ Callback | @wailsio/runtime
    Callback: (ev: WailsEvent) => void

    The type of handlers for a given event.

    -

    Type declaration

    +

    Type declaration

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.CancellablePromiseCanceller.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.CancellablePromiseCanceller.html index 5b7750405..3258a70d0 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.CancellablePromiseCanceller.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.CancellablePromiseCanceller.html @@ -1 +1 @@ -CancellablePromiseCanceller | @wailsio/runtime

    Type Alias CancellablePromiseCanceller

    CancellablePromiseCanceller: (cause?: any) => void | PromiseLike<void>

    Type declaration

    +CancellablePromiseCanceller | @wailsio/runtime

    Type Alias CancellablePromiseCanceller

    CancellablePromiseCanceller: (cause?: any) => void | PromiseLike<void>

    Type declaration

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.CancellablePromiseExecutor.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.CancellablePromiseExecutor.html index f102891c1..85b0f8526 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.CancellablePromiseExecutor.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.CancellablePromiseExecutor.html @@ -1 +1 @@ -CancellablePromiseExecutor | @wailsio/runtime

    Type Alias CancellablePromiseExecutor<T>

    CancellablePromiseExecutor: (
        resolve: CancellablePromiseResolver<T>,
        reject: CancellablePromiseRejector,
    ) => void

    Type Parameters

    • T

    Type declaration

    +CancellablePromiseExecutor | @wailsio/runtime

    Type Alias CancellablePromiseExecutor<T>

    CancellablePromiseExecutor: (
        resolve: CancellablePromiseResolver<T>,
        reject: CancellablePromiseRejector,
    ) => void

    Type Parameters

    • T

    Type declaration

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.CancellablePromiseRejector.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.CancellablePromiseRejector.html index 92c3be544..b75c628c3 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.CancellablePromiseRejector.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.CancellablePromiseRejector.html @@ -1 +1 @@ -CancellablePromiseRejector | @wailsio/runtime

    Type Alias CancellablePromiseRejector

    CancellablePromiseRejector: (reason?: any) => void

    Type declaration

      • (reason?: any): void
      • Parameters

        • Optionalreason: any

        Returns void

    +CancellablePromiseRejector | @wailsio/runtime

    Type Alias CancellablePromiseRejector

    CancellablePromiseRejector: (reason?: any) => void

    Type declaration

      • (reason?: any): void
      • Parameters

        • Optionalreason: any

        Returns void

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.CancellablePromiseResolver.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.CancellablePromiseResolver.html index 7bfde4a45..81f2b806b 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.CancellablePromiseResolver.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/types/_internal_.CancellablePromiseResolver.html @@ -1 +1 @@ -CancellablePromiseResolver | @wailsio/runtime

    Type Alias CancellablePromiseResolver<T>

    CancellablePromiseResolver: (
        value: T | PromiseLike<T> | CancellablePromiseLike<T>,
    ) => void

    Type Parameters

    • T

    Type declaration

    +CancellablePromiseResolver | @wailsio/runtime

    Type Alias CancellablePromiseResolver<T>

    CancellablePromiseResolver: (
        value: T | PromiseLike<T> | CancellablePromiseLike<T>,
    ) => void

    Type Parameters

    • T

    Type declaration

    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Events.Types.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Events.Types.html index 8637877ed..4060af3dc 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Events.Types.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Events.Types.html @@ -1 +1 @@ -Types | @wailsio/runtime

    Variable TypesConst

    Types: Readonly<
        {
            Common: Readonly<
                {
                    ApplicationOpenedWithFile: "common:ApplicationOpenedWithFile";
                    ApplicationStarted: "common:ApplicationStarted";
                    ThemeChanged: "common:ThemeChanged";
                    WindowClosing: "common:WindowClosing";
                    WindowDidMove: "common:WindowDidMove";
                    WindowDidResize: "common:WindowDidResize";
                    WindowDPIChanged: "common:WindowDPIChanged";
                    WindowFilesDropped: "common:WindowFilesDropped";
                    WindowFocus: "common:WindowFocus";
                    WindowFullscreen: "common:WindowFullscreen";
                    WindowHide: "common:WindowHide";
                    WindowLostFocus: "common:WindowLostFocus";
                    WindowMaximise: "common:WindowMaximise";
                    WindowMinimise: "common:WindowMinimise";
                    WindowRestore: "common:WindowRestore";
                    WindowRuntimeReady: "common:WindowRuntimeReady";
                    WindowShow: "common:WindowShow";
                    WindowUnFullscreen: "common:WindowUnFullscreen";
                    WindowUnMaximise: "common:WindowUnMaximise";
                    WindowUnMinimise: "common:WindowUnMinimise";
                    WindowZoom: "common:WindowZoom";
                    WindowZoomIn: "common:WindowZoomIn";
                    WindowZoomOut: "common:WindowZoomOut";
                    WindowZoomReset: "common:WindowZoomReset";
                },
            >;
            Linux: Readonly<
                {
                    ApplicationStartup: "linux:ApplicationStartup";
                    SystemThemeChanged: "linux:SystemThemeChanged";
                    WindowDeleteEvent: "linux:WindowDeleteEvent";
                    WindowDidMove: "linux:WindowDidMove";
                    WindowDidResize: "linux:WindowDidResize";
                    WindowFocusIn: "linux:WindowFocusIn";
                    WindowFocusOut: "linux:WindowFocusOut";
                    WindowLoadChanged: "linux:WindowLoadChanged";
                },
            >;
            Mac: Readonly<
                {
                    ApplicationDidBecomeActive: "mac:ApplicationDidBecomeActive";
                    ApplicationDidChangeBackingProperties: "mac:ApplicationDidChangeBackingProperties";
                    ApplicationDidChangeEffectiveAppearance: "mac:ApplicationDidChangeEffectiveAppearance";
                    ApplicationDidChangeIcon: "mac:ApplicationDidChangeIcon";
                    ApplicationDidChangeOcclusionState: "mac:ApplicationDidChangeOcclusionState";
                    ApplicationDidChangeScreenParameters: "mac:ApplicationDidChangeScreenParameters";
                    ApplicationDidChangeStatusBarFrame: "mac:ApplicationDidChangeStatusBarFrame";
                    ApplicationDidChangeStatusBarOrientation: "mac:ApplicationDidChangeStatusBarOrientation";
                    ApplicationDidChangeTheme: "mac:ApplicationDidChangeTheme";
                    ApplicationDidFinishLaunching: "mac:ApplicationDidFinishLaunching";
                    ApplicationDidHide: "mac:ApplicationDidHide";
                    ApplicationDidResignActive: "mac:ApplicationDidResignActive";
                    ApplicationDidUnhide: "mac:ApplicationDidUnhide";
                    ApplicationDidUpdate: "mac:ApplicationDidUpdate";
                    ApplicationShouldHandleReopen: "mac:ApplicationShouldHandleReopen";
                    ApplicationWillBecomeActive: "mac:ApplicationWillBecomeActive";
                    ApplicationWillFinishLaunching: "mac:ApplicationWillFinishLaunching";
                    ApplicationWillHide: "mac:ApplicationWillHide";
                    ApplicationWillResignActive: "mac:ApplicationWillResignActive";
                    ApplicationWillTerminate: "mac:ApplicationWillTerminate";
                    ApplicationWillUnhide: "mac:ApplicationWillUnhide";
                    ApplicationWillUpdate: "mac:ApplicationWillUpdate";
                    MenuDidAddItem: "mac:MenuDidAddItem";
                    MenuDidBeginTracking: "mac:MenuDidBeginTracking";
                    MenuDidClose: "mac:MenuDidClose";
                    MenuDidDisplayItem: "mac:MenuDidDisplayItem";
                    MenuDidEndTracking: "mac:MenuDidEndTracking";
                    MenuDidHighlightItem: "mac:MenuDidHighlightItem";
                    MenuDidOpen: "mac:MenuDidOpen";
                    MenuDidPopUp: "mac:MenuDidPopUp";
                    MenuDidRemoveItem: "mac:MenuDidRemoveItem";
                    MenuDidSendAction: "mac:MenuDidSendAction";
                    MenuDidSendActionToItem: "mac:MenuDidSendActionToItem";
                    MenuDidUpdate: "mac:MenuDidUpdate";
                    MenuWillAddItem: "mac:MenuWillAddItem";
                    MenuWillBeginTracking: "mac:MenuWillBeginTracking";
                    MenuWillDisplayItem: "mac:MenuWillDisplayItem";
                    MenuWillEndTracking: "mac:MenuWillEndTracking";
                    MenuWillHighlightItem: "mac:MenuWillHighlightItem";
                    MenuWillOpen: "mac:MenuWillOpen";
                    MenuWillPopUp: "mac:MenuWillPopUp";
                    MenuWillRemoveItem: "mac:MenuWillRemoveItem";
                    MenuWillSendAction: "mac:MenuWillSendAction";
                    MenuWillSendActionToItem: "mac:MenuWillSendActionToItem";
                    MenuWillUpdate: "mac:MenuWillUpdate";
                    WebViewDidCommitNavigation: "mac:WebViewDidCommitNavigation";
                    WebViewDidFinishNavigation: "mac:WebViewDidFinishNavigation";
                    WebViewDidReceiveServerRedirectForProvisionalNavigation: "mac:WebViewDidReceiveServerRedirectForProvisionalNavigation";
                    WebViewDidStartProvisionalNavigation: "mac:WebViewDidStartProvisionalNavigation";
                    WindowDidBecomeKey: "mac:WindowDidBecomeKey";
                    WindowDidBecomeMain: "mac:WindowDidBecomeMain";
                    WindowDidBeginSheet: "mac:WindowDidBeginSheet";
                    WindowDidChangeAlpha: "mac:WindowDidChangeAlpha";
                    WindowDidChangeBackingLocation: "mac:WindowDidChangeBackingLocation";
                    WindowDidChangeBackingProperties: "mac:WindowDidChangeBackingProperties";
                    WindowDidChangeCollectionBehavior: "mac:WindowDidChangeCollectionBehavior";
                    WindowDidChangeEffectiveAppearance: "mac:WindowDidChangeEffectiveAppearance";
                    WindowDidChangeOcclusionState: "mac:WindowDidChangeOcclusionState";
                    WindowDidChangeOrderingMode: "mac:WindowDidChangeOrderingMode";
                    WindowDidChangeScreen: "mac:WindowDidChangeScreen";
                    WindowDidChangeScreenParameters: "mac:WindowDidChangeScreenParameters";
                    WindowDidChangeScreenProfile: "mac:WindowDidChangeScreenProfile";
                    WindowDidChangeScreenSpace: "mac:WindowDidChangeScreenSpace";
                    WindowDidChangeScreenSpaceProperties: "mac:WindowDidChangeScreenSpaceProperties";
                    WindowDidChangeSharingType: "mac:WindowDidChangeSharingType";
                    WindowDidChangeSpace: "mac:WindowDidChangeSpace";
                    WindowDidChangeSpaceOrderingMode: "mac:WindowDidChangeSpaceOrderingMode";
                    WindowDidChangeTitle: "mac:WindowDidChangeTitle";
                    WindowDidChangeToolbar: "mac:WindowDidChangeToolbar";
                    WindowDidDeminiaturize: "mac:WindowDidDeminiaturize";
                    WindowDidEndSheet: "mac:WindowDidEndSheet";
                    WindowDidEnterFullScreen: "mac:WindowDidEnterFullScreen";
                    WindowDidEnterVersionBrowser: "mac:WindowDidEnterVersionBrowser";
                    WindowDidExitFullScreen: "mac:WindowDidExitFullScreen";
                    WindowDidExitVersionBrowser: "mac:WindowDidExitVersionBrowser";
                    WindowDidExpose: "mac:WindowDidExpose";
                    WindowDidFocus: "mac:WindowDidFocus";
                    WindowDidMiniaturize: "mac:WindowDidMiniaturize";
                    WindowDidMove: "mac:WindowDidMove";
                    WindowDidOrderOffScreen: "mac:WindowDidOrderOffScreen";
                    WindowDidOrderOnScreen: "mac:WindowDidOrderOnScreen";
                    WindowDidResignKey: "mac:WindowDidResignKey";
                    WindowDidResignMain: "mac:WindowDidResignMain";
                    WindowDidResize: "mac:WindowDidResize";
                    WindowDidUpdate: "mac:WindowDidUpdate";
                    WindowDidUpdateAlpha: "mac:WindowDidUpdateAlpha";
                    WindowDidUpdateCollectionBehavior: "mac:WindowDidUpdateCollectionBehavior";
                    WindowDidUpdateCollectionProperties: "mac:WindowDidUpdateCollectionProperties";
                    WindowDidUpdateShadow: "mac:WindowDidUpdateShadow";
                    WindowDidUpdateTitle: "mac:WindowDidUpdateTitle";
                    WindowDidUpdateToolbar: "mac:WindowDidUpdateToolbar";
                    WindowDidZoom: "mac:WindowDidZoom";
                    WindowFileDraggingEntered: "mac:WindowFileDraggingEntered";
                    WindowFileDraggingExited: "mac:WindowFileDraggingExited";
                    WindowFileDraggingPerformed: "mac:WindowFileDraggingPerformed";
                    WindowHide: "mac:WindowHide";
                    WindowMaximise: "mac:WindowMaximise";
                    WindowMinimise: "mac:WindowMinimise";
                    WindowShouldClose: "mac:WindowShouldClose";
                    WindowShow: "mac:WindowShow";
                    WindowUnMaximise: "mac:WindowUnMaximise";
                    WindowUnMinimise: "mac:WindowUnMinimise";
                    WindowWillBecomeKey: "mac:WindowWillBecomeKey";
                    WindowWillBecomeMain: "mac:WindowWillBecomeMain";
                    WindowWillBeginSheet: "mac:WindowWillBeginSheet";
                    WindowWillChangeOrderingMode: "mac:WindowWillChangeOrderingMode";
                    WindowWillClose: "mac:WindowWillClose";
                    WindowWillDeminiaturize: "mac:WindowWillDeminiaturize";
                    WindowWillEnterFullScreen: "mac:WindowWillEnterFullScreen";
                    WindowWillEnterVersionBrowser: "mac:WindowWillEnterVersionBrowser";
                    WindowWillExitFullScreen: "mac:WindowWillExitFullScreen";
                    WindowWillExitVersionBrowser: "mac:WindowWillExitVersionBrowser";
                    WindowWillFocus: "mac:WindowWillFocus";
                    WindowWillMiniaturize: "mac:WindowWillMiniaturize";
                    WindowWillMove: "mac:WindowWillMove";
                    WindowWillOrderOffScreen: "mac:WindowWillOrderOffScreen";
                    WindowWillOrderOnScreen: "mac:WindowWillOrderOnScreen";
                    WindowWillResignMain: "mac:WindowWillResignMain";
                    WindowWillResize: "mac:WindowWillResize";
                    WindowWillUnfocus: "mac:WindowWillUnfocus";
                    WindowWillUpdate: "mac:WindowWillUpdate";
                    WindowWillUpdateAlpha: "mac:WindowWillUpdateAlpha";
                    WindowWillUpdateCollectionBehavior: "mac:WindowWillUpdateCollectionBehavior";
                    WindowWillUpdateCollectionProperties: "mac:WindowWillUpdateCollectionProperties";
                    WindowWillUpdateShadow: "mac:WindowWillUpdateShadow";
                    WindowWillUpdateTitle: "mac:WindowWillUpdateTitle";
                    WindowWillUpdateToolbar: "mac:WindowWillUpdateToolbar";
                    WindowWillUpdateVisibility: "mac:WindowWillUpdateVisibility";
                    WindowWillUseStandardFrame: "mac:WindowWillUseStandardFrame";
                    WindowZoomIn: "mac:WindowZoomIn";
                    WindowZoomOut: "mac:WindowZoomOut";
                    WindowZoomReset: "mac:WindowZoomReset";
                },
            >;
            Windows: Readonly<
                {
                    APMPowerSettingChange: "windows:APMPowerSettingChange";
                    APMPowerStatusChange: "windows:APMPowerStatusChange";
                    APMResumeAutomatic: "windows:APMResumeAutomatic";
                    APMResumeSuspend: "windows:APMResumeSuspend";
                    APMSuspend: "windows:APMSuspend";
                    ApplicationStarted: "windows:ApplicationStarted";
                    SystemThemeChanged: "windows:SystemThemeChanged";
                    WebViewNavigationCompleted: "windows:WebViewNavigationCompleted";
                    WindowActive: "windows:WindowActive";
                    WindowBackgroundErase: "windows:WindowBackgroundErase";
                    WindowClickActive: "windows:WindowClickActive";
                    WindowClosing: "windows:WindowClosing";
                    WindowDidMove: "windows:WindowDidMove";
                    WindowDidResize: "windows:WindowDidResize";
                    WindowDPIChanged: "windows:WindowDPIChanged";
                    WindowDragDrop: "windows:WindowDragDrop";
                    WindowDragEnter: "windows:WindowDragEnter";
                    WindowDragLeave: "windows:WindowDragLeave";
                    WindowDragOver: "windows:WindowDragOver";
                    WindowEndMove: "windows:WindowEndMove";
                    WindowEndResize: "windows:WindowEndResize";
                    WindowFullscreen: "windows:WindowFullscreen";
                    WindowHide: "windows:WindowHide";
                    WindowInactive: "windows:WindowInactive";
                    WindowKeyDown: "windows:WindowKeyDown";
                    WindowKeyUp: "windows:WindowKeyUp";
                    WindowKillFocus: "windows:WindowKillFocus";
                    WindowMaximise: "windows:WindowMaximise";
                    WindowMinimise: "windows:WindowMinimise";
                    WindowNonClientHit: "windows:WindowNonClientHit";
                    WindowNonClientMouseDown: "windows:WindowNonClientMouseDown";
                    WindowNonClientMouseLeave: "windows:WindowNonClientMouseLeave";
                    WindowNonClientMouseMove: "windows:WindowNonClientMouseMove";
                    WindowNonClientMouseUp: "windows:WindowNonClientMouseUp";
                    WindowPaint: "windows:WindowPaint";
                    WindowRestore: "windows:WindowRestore";
                    WindowSetFocus: "windows:WindowSetFocus";
                    WindowShow: "windows:WindowShow";
                    WindowStartMove: "windows:WindowStartMove";
                    WindowStartResize: "windows:WindowStartResize";
                    WindowUnFullscreen: "windows:WindowUnFullscreen";
                    WindowUnMaximise: "windows:WindowUnMaximise";
                    WindowUnMinimise: "windows:WindowUnMinimise";
                    WindowZOrderChanged: "windows:WindowZOrderChanged";
                },
            >;
        },
    > = ...
    +Types | @wailsio/runtime

    Variable TypesConst

    Types: Readonly<
        {
            Common: Readonly<
                {
                    ApplicationOpenedWithFile: "common:ApplicationOpenedWithFile";
                    ApplicationStarted: "common:ApplicationStarted";
                    ThemeChanged: "common:ThemeChanged";
                    WindowClosing: "common:WindowClosing";
                    WindowDidMove: "common:WindowDidMove";
                    WindowDidResize: "common:WindowDidResize";
                    WindowDPIChanged: "common:WindowDPIChanged";
                    WindowFilesDropped: "common:WindowFilesDropped";
                    WindowFocus: "common:WindowFocus";
                    WindowFullscreen: "common:WindowFullscreen";
                    WindowHide: "common:WindowHide";
                    WindowLostFocus: "common:WindowLostFocus";
                    WindowMaximise: "common:WindowMaximise";
                    WindowMinimise: "common:WindowMinimise";
                    WindowRestore: "common:WindowRestore";
                    WindowRuntimeReady: "common:WindowRuntimeReady";
                    WindowShow: "common:WindowShow";
                    WindowUnFullscreen: "common:WindowUnFullscreen";
                    WindowUnMaximise: "common:WindowUnMaximise";
                    WindowUnMinimise: "common:WindowUnMinimise";
                    WindowZoom: "common:WindowZoom";
                    WindowZoomIn: "common:WindowZoomIn";
                    WindowZoomOut: "common:WindowZoomOut";
                    WindowZoomReset: "common:WindowZoomReset";
                },
            >;
            Linux: Readonly<
                {
                    ApplicationStartup: "linux:ApplicationStartup";
                    SystemThemeChanged: "linux:SystemThemeChanged";
                    WindowDeleteEvent: "linux:WindowDeleteEvent";
                    WindowDidMove: "linux:WindowDidMove";
                    WindowDidResize: "linux:WindowDidResize";
                    WindowFocusIn: "linux:WindowFocusIn";
                    WindowFocusOut: "linux:WindowFocusOut";
                    WindowLoadChanged: "linux:WindowLoadChanged";
                },
            >;
            Mac: Readonly<
                {
                    ApplicationDidBecomeActive: "mac:ApplicationDidBecomeActive";
                    ApplicationDidChangeBackingProperties: "mac:ApplicationDidChangeBackingProperties";
                    ApplicationDidChangeEffectiveAppearance: "mac:ApplicationDidChangeEffectiveAppearance";
                    ApplicationDidChangeIcon: "mac:ApplicationDidChangeIcon";
                    ApplicationDidChangeOcclusionState: "mac:ApplicationDidChangeOcclusionState";
                    ApplicationDidChangeScreenParameters: "mac:ApplicationDidChangeScreenParameters";
                    ApplicationDidChangeStatusBarFrame: "mac:ApplicationDidChangeStatusBarFrame";
                    ApplicationDidChangeStatusBarOrientation: "mac:ApplicationDidChangeStatusBarOrientation";
                    ApplicationDidChangeTheme: "mac:ApplicationDidChangeTheme";
                    ApplicationDidFinishLaunching: "mac:ApplicationDidFinishLaunching";
                    ApplicationDidHide: "mac:ApplicationDidHide";
                    ApplicationDidResignActive: "mac:ApplicationDidResignActive";
                    ApplicationDidUnhide: "mac:ApplicationDidUnhide";
                    ApplicationDidUpdate: "mac:ApplicationDidUpdate";
                    ApplicationShouldHandleReopen: "mac:ApplicationShouldHandleReopen";
                    ApplicationWillBecomeActive: "mac:ApplicationWillBecomeActive";
                    ApplicationWillFinishLaunching: "mac:ApplicationWillFinishLaunching";
                    ApplicationWillHide: "mac:ApplicationWillHide";
                    ApplicationWillResignActive: "mac:ApplicationWillResignActive";
                    ApplicationWillTerminate: "mac:ApplicationWillTerminate";
                    ApplicationWillUnhide: "mac:ApplicationWillUnhide";
                    ApplicationWillUpdate: "mac:ApplicationWillUpdate";
                    MenuDidAddItem: "mac:MenuDidAddItem";
                    MenuDidBeginTracking: "mac:MenuDidBeginTracking";
                    MenuDidClose: "mac:MenuDidClose";
                    MenuDidDisplayItem: "mac:MenuDidDisplayItem";
                    MenuDidEndTracking: "mac:MenuDidEndTracking";
                    MenuDidHighlightItem: "mac:MenuDidHighlightItem";
                    MenuDidOpen: "mac:MenuDidOpen";
                    MenuDidPopUp: "mac:MenuDidPopUp";
                    MenuDidRemoveItem: "mac:MenuDidRemoveItem";
                    MenuDidSendAction: "mac:MenuDidSendAction";
                    MenuDidSendActionToItem: "mac:MenuDidSendActionToItem";
                    MenuDidUpdate: "mac:MenuDidUpdate";
                    MenuWillAddItem: "mac:MenuWillAddItem";
                    MenuWillBeginTracking: "mac:MenuWillBeginTracking";
                    MenuWillDisplayItem: "mac:MenuWillDisplayItem";
                    MenuWillEndTracking: "mac:MenuWillEndTracking";
                    MenuWillHighlightItem: "mac:MenuWillHighlightItem";
                    MenuWillOpen: "mac:MenuWillOpen";
                    MenuWillPopUp: "mac:MenuWillPopUp";
                    MenuWillRemoveItem: "mac:MenuWillRemoveItem";
                    MenuWillSendAction: "mac:MenuWillSendAction";
                    MenuWillSendActionToItem: "mac:MenuWillSendActionToItem";
                    MenuWillUpdate: "mac:MenuWillUpdate";
                    WebViewDidCommitNavigation: "mac:WebViewDidCommitNavigation";
                    WebViewDidFinishNavigation: "mac:WebViewDidFinishNavigation";
                    WebViewDidReceiveServerRedirectForProvisionalNavigation: "mac:WebViewDidReceiveServerRedirectForProvisionalNavigation";
                    WebViewDidStartProvisionalNavigation: "mac:WebViewDidStartProvisionalNavigation";
                    WindowDidBecomeKey: "mac:WindowDidBecomeKey";
                    WindowDidBecomeMain: "mac:WindowDidBecomeMain";
                    WindowDidBeginSheet: "mac:WindowDidBeginSheet";
                    WindowDidChangeAlpha: "mac:WindowDidChangeAlpha";
                    WindowDidChangeBackingLocation: "mac:WindowDidChangeBackingLocation";
                    WindowDidChangeBackingProperties: "mac:WindowDidChangeBackingProperties";
                    WindowDidChangeCollectionBehavior: "mac:WindowDidChangeCollectionBehavior";
                    WindowDidChangeEffectiveAppearance: "mac:WindowDidChangeEffectiveAppearance";
                    WindowDidChangeOcclusionState: "mac:WindowDidChangeOcclusionState";
                    WindowDidChangeOrderingMode: "mac:WindowDidChangeOrderingMode";
                    WindowDidChangeScreen: "mac:WindowDidChangeScreen";
                    WindowDidChangeScreenParameters: "mac:WindowDidChangeScreenParameters";
                    WindowDidChangeScreenProfile: "mac:WindowDidChangeScreenProfile";
                    WindowDidChangeScreenSpace: "mac:WindowDidChangeScreenSpace";
                    WindowDidChangeScreenSpaceProperties: "mac:WindowDidChangeScreenSpaceProperties";
                    WindowDidChangeSharingType: "mac:WindowDidChangeSharingType";
                    WindowDidChangeSpace: "mac:WindowDidChangeSpace";
                    WindowDidChangeSpaceOrderingMode: "mac:WindowDidChangeSpaceOrderingMode";
                    WindowDidChangeTitle: "mac:WindowDidChangeTitle";
                    WindowDidChangeToolbar: "mac:WindowDidChangeToolbar";
                    WindowDidDeminiaturize: "mac:WindowDidDeminiaturize";
                    WindowDidEndSheet: "mac:WindowDidEndSheet";
                    WindowDidEnterFullScreen: "mac:WindowDidEnterFullScreen";
                    WindowDidEnterVersionBrowser: "mac:WindowDidEnterVersionBrowser";
                    WindowDidExitFullScreen: "mac:WindowDidExitFullScreen";
                    WindowDidExitVersionBrowser: "mac:WindowDidExitVersionBrowser";
                    WindowDidExpose: "mac:WindowDidExpose";
                    WindowDidFocus: "mac:WindowDidFocus";
                    WindowDidMiniaturize: "mac:WindowDidMiniaturize";
                    WindowDidMove: "mac:WindowDidMove";
                    WindowDidOrderOffScreen: "mac:WindowDidOrderOffScreen";
                    WindowDidOrderOnScreen: "mac:WindowDidOrderOnScreen";
                    WindowDidResignKey: "mac:WindowDidResignKey";
                    WindowDidResignMain: "mac:WindowDidResignMain";
                    WindowDidResize: "mac:WindowDidResize";
                    WindowDidUpdate: "mac:WindowDidUpdate";
                    WindowDidUpdateAlpha: "mac:WindowDidUpdateAlpha";
                    WindowDidUpdateCollectionBehavior: "mac:WindowDidUpdateCollectionBehavior";
                    WindowDidUpdateCollectionProperties: "mac:WindowDidUpdateCollectionProperties";
                    WindowDidUpdateShadow: "mac:WindowDidUpdateShadow";
                    WindowDidUpdateTitle: "mac:WindowDidUpdateTitle";
                    WindowDidUpdateToolbar: "mac:WindowDidUpdateToolbar";
                    WindowDidZoom: "mac:WindowDidZoom";
                    WindowFileDraggingEntered: "mac:WindowFileDraggingEntered";
                    WindowFileDraggingExited: "mac:WindowFileDraggingExited";
                    WindowFileDraggingPerformed: "mac:WindowFileDraggingPerformed";
                    WindowHide: "mac:WindowHide";
                    WindowMaximise: "mac:WindowMaximise";
                    WindowMinimise: "mac:WindowMinimise";
                    WindowShouldClose: "mac:WindowShouldClose";
                    WindowShow: "mac:WindowShow";
                    WindowUnMaximise: "mac:WindowUnMaximise";
                    WindowUnMinimise: "mac:WindowUnMinimise";
                    WindowWillBecomeKey: "mac:WindowWillBecomeKey";
                    WindowWillBecomeMain: "mac:WindowWillBecomeMain";
                    WindowWillBeginSheet: "mac:WindowWillBeginSheet";
                    WindowWillChangeOrderingMode: "mac:WindowWillChangeOrderingMode";
                    WindowWillClose: "mac:WindowWillClose";
                    WindowWillDeminiaturize: "mac:WindowWillDeminiaturize";
                    WindowWillEnterFullScreen: "mac:WindowWillEnterFullScreen";
                    WindowWillEnterVersionBrowser: "mac:WindowWillEnterVersionBrowser";
                    WindowWillExitFullScreen: "mac:WindowWillExitFullScreen";
                    WindowWillExitVersionBrowser: "mac:WindowWillExitVersionBrowser";
                    WindowWillFocus: "mac:WindowWillFocus";
                    WindowWillMiniaturize: "mac:WindowWillMiniaturize";
                    WindowWillMove: "mac:WindowWillMove";
                    WindowWillOrderOffScreen: "mac:WindowWillOrderOffScreen";
                    WindowWillOrderOnScreen: "mac:WindowWillOrderOnScreen";
                    WindowWillResignMain: "mac:WindowWillResignMain";
                    WindowWillResize: "mac:WindowWillResize";
                    WindowWillUnfocus: "mac:WindowWillUnfocus";
                    WindowWillUpdate: "mac:WindowWillUpdate";
                    WindowWillUpdateAlpha: "mac:WindowWillUpdateAlpha";
                    WindowWillUpdateCollectionBehavior: "mac:WindowWillUpdateCollectionBehavior";
                    WindowWillUpdateCollectionProperties: "mac:WindowWillUpdateCollectionProperties";
                    WindowWillUpdateShadow: "mac:WindowWillUpdateShadow";
                    WindowWillUpdateTitle: "mac:WindowWillUpdateTitle";
                    WindowWillUpdateToolbar: "mac:WindowWillUpdateToolbar";
                    WindowWillUpdateVisibility: "mac:WindowWillUpdateVisibility";
                    WindowWillUseStandardFrame: "mac:WindowWillUseStandardFrame";
                    WindowZoomIn: "mac:WindowZoomIn";
                    WindowZoomOut: "mac:WindowZoomOut";
                    WindowZoomReset: "mac:WindowZoomReset";
                },
            >;
            Windows: Readonly<
                {
                    APMPowerSettingChange: "windows:APMPowerSettingChange";
                    APMPowerStatusChange: "windows:APMPowerStatusChange";
                    APMResumeAutomatic: "windows:APMResumeAutomatic";
                    APMResumeSuspend: "windows:APMResumeSuspend";
                    APMSuspend: "windows:APMSuspend";
                    ApplicationStarted: "windows:ApplicationStarted";
                    SystemThemeChanged: "windows:SystemThemeChanged";
                    WebViewNavigationCompleted: "windows:WebViewNavigationCompleted";
                    WindowActive: "windows:WindowActive";
                    WindowBackgroundErase: "windows:WindowBackgroundErase";
                    WindowClickActive: "windows:WindowClickActive";
                    WindowClosing: "windows:WindowClosing";
                    WindowDidMove: "windows:WindowDidMove";
                    WindowDidResize: "windows:WindowDidResize";
                    WindowDPIChanged: "windows:WindowDPIChanged";
                    WindowDragDrop: "windows:WindowDragDrop";
                    WindowDragEnter: "windows:WindowDragEnter";
                    WindowDragLeave: "windows:WindowDragLeave";
                    WindowDragOver: "windows:WindowDragOver";
                    WindowEndMove: "windows:WindowEndMove";
                    WindowEndResize: "windows:WindowEndResize";
                    WindowFullscreen: "windows:WindowFullscreen";
                    WindowHide: "windows:WindowHide";
                    WindowInactive: "windows:WindowInactive";
                    WindowKeyDown: "windows:WindowKeyDown";
                    WindowKeyUp: "windows:WindowKeyUp";
                    WindowKillFocus: "windows:WindowKillFocus";
                    WindowMaximise: "windows:WindowMaximise";
                    WindowMinimise: "windows:WindowMinimise";
                    WindowNonClientHit: "windows:WindowNonClientHit";
                    WindowNonClientMouseDown: "windows:WindowNonClientMouseDown";
                    WindowNonClientMouseLeave: "windows:WindowNonClientMouseLeave";
                    WindowNonClientMouseMove: "windows:WindowNonClientMouseMove";
                    WindowNonClientMouseUp: "windows:WindowNonClientMouseUp";
                    WindowPaint: "windows:WindowPaint";
                    WindowRestore: "windows:WindowRestore";
                    WindowSetFocus: "windows:WindowSetFocus";
                    WindowShow: "windows:WindowShow";
                    WindowStartMove: "windows:WindowStartMove";
                    WindowStartResize: "windows:WindowStartResize";
                    WindowUnFullscreen: "windows:WindowUnFullscreen";
                    WindowUnMaximise: "windows:WindowUnMaximise";
                    WindowUnMinimise: "windows:WindowUnMinimise";
                    WindowZOrderChanged: "windows:WindowZOrderChanged";
                },
            >;
        },
    > = ...
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Window.html b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Window.html index 8ac8b45fe..feed497e8 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Window.html +++ b/v3/internal/runtime/desktop/@wailsio/runtime/docs/variables/Window.html @@ -1,2 +1,2 @@ Window | @wailsio/runtime

    Variable WindowConst

    Window: Window = ...

    The window within which the script is running.

    -
    +
    diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/package-lock.json b/v3/internal/runtime/desktop/@wailsio/runtime/package-lock.json index 91cee4fe9..a0f7d5801 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/package-lock.json +++ b/v3/internal/runtime/desktop/@wailsio/runtime/package-lock.json @@ -1,12 +1,12 @@ { "name": "@wailsio/runtime", - "version": "3.0.0-alpha.66", + "version": "3.0.0-alpha.67", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@wailsio/runtime", - "version": "3.0.0-alpha.66", + "version": "3.0.0-alpha.67", "license": "MIT", "devDependencies": { "happy-dom": "^17.1.1", diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/package.json b/v3/internal/runtime/desktop/@wailsio/runtime/package.json index 09d9f8d96..b416a4327 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/package.json +++ b/v3/internal/runtime/desktop/@wailsio/runtime/package.json @@ -1,7 +1,7 @@ { "name": "@wailsio/runtime", "type": "module", - "version": "3.0.0-alpha.66", + "version": "3.0.0-alpha.67", "description": "Wails Runtime", "types": "types/index.d.ts", "exports": { From d9af6dec328404418cd311712623155ce9b6720e Mon Sep 17 00:00:00 2001 From: Zach Botterman <6074435+popaprozac@users.noreply.github.com> Date: Sun, 2 Mar 2025 22:49:31 -0800 Subject: [PATCH 120/374] ignore bindings notification callback Co-authored-by: Lea Anthony --- v3/pkg/services/notifications/notifications.go | 1 + 1 file changed, 1 insertion(+) diff --git a/v3/pkg/services/notifications/notifications.go b/v3/pkg/services/notifications/notifications.go index d971959ac..c23b8edf5 100644 --- a/v3/pkg/services/notifications/notifications.go +++ b/v3/pkg/services/notifications/notifications.go @@ -60,6 +60,7 @@ func (ns *Service) ServiceName() string { // OnNotificationResponse registers a callback function that will be called when // a notification response is received from the user. +//wails:ignore func (ns *Service) OnNotificationResponse(callback func(response NotificationResponse)) { ns.callbackLock.Lock() defer ns.callbackLock.Unlock() From 833d8ec7dc91ff28e9db354293234ccf400e0228 Mon Sep 17 00:00:00 2001 From: popaprozac Date: Tue, 4 Mar 2025 20:07:23 -0800 Subject: [PATCH 121/374] refactor macos --- .../notifications/notifications_darwin.go | 80 +++++-------------- .../notifications/notifications_darwin.h | 4 +- .../notifications/notifications_darwin.m | 22 ++--- 3 files changed, 29 insertions(+), 77 deletions(-) diff --git a/v3/pkg/services/notifications/notifications_darwin.go b/v3/pkg/services/notifications/notifications_darwin.go index 2789324ae..426b7a411 100644 --- a/v3/pkg/services/notifications/notifications_darwin.go +++ b/v3/pkg/services/notifications/notifications_darwin.go @@ -9,13 +9,10 @@ package notifications */ import "C" import ( - "context" "encoding/json" "fmt" "sync" "unsafe" - - "github.com/wailsapp/wails/v3/pkg/application" ) type notificationChannel struct { @@ -28,13 +25,21 @@ var ( notificationChannelsLock sync.Mutex nextChannelID int ) -var BundleIdentifierError = fmt.Errorf("notifications require a bundled application with a unique bundle identifier") const AppleDefaultActionIdentifier = "com.apple.UNNotificationDefaultActionIdentifier" // Creates a new Notifications Service. // Your app must be packaged and signed for this feature to work. func New() *Service { + if !CheckBundleIdentifier() { + panic("\nError: Cannot use the notification API in development mode on macOS.\n" + + "Notifications require the app to be properly bundled with a bundle identifier and signed.\n" + + "To use the notification API on macOS:\n" + + " 1. Build and package your app using 'wails3 package'\n" + + " 2. Sign the packaged .app\n" + + " 3. Run the signed .app bundle") + } + notificationServiceLock.Lock() defer notificationServiceLock.Unlock() @@ -44,29 +49,12 @@ func New() *Service { return NotificationService } -// ServiceStartup is called when the service is loaded. -func (ns *Service) ServiceStartup(ctx context.Context, options application.ServiceOptions) error { - if !CheckBundleIdentifier() { - return BundleIdentifierError - } - return nil -} - -// ServiceShutdown is called when the service is unloaded. -func (ns *Service) ServiceShutdown() error { - return nil -} - func CheckBundleIdentifier() bool { return bool(C.checkBundleIdentifier()) } // RequestNotificationAuthorization requests permission for notifications. func (ns *Service) RequestNotificationAuthorization() (bool, error) { - if !CheckBundleIdentifier() { - return false, BundleIdentifierError - } - id, resultCh := registerChannel() C.requestNotificationAuthorization(C.int(id)) @@ -77,10 +65,6 @@ func (ns *Service) RequestNotificationAuthorization() (bool, error) { // CheckNotificationAuthorization checks current notification permission status. func (ns *Service) CheckNotificationAuthorization() (bool, error) { - if !CheckBundleIdentifier() { - return false, BundleIdentifierError - } - id, resultCh := registerChannel() C.checkNotificationAuthorization(C.int(id)) @@ -91,9 +75,6 @@ func (ns *Service) CheckNotificationAuthorization() (bool, error) { // SendNotification sends a basic notification with a unique identifier, title, subtitle, and body. func (ns *Service) SendNotification(options NotificationOptions) error { - if !CheckBundleIdentifier() { - return fmt.Errorf("notifications require a bundled application with a unique bundle identifier") - } cIdentifier := C.CString(options.ID) cTitle := C.CString(options.Title) cSubtitle := C.CString(options.Subtitle) @@ -106,13 +87,14 @@ func (ns *Service) SendNotification(options NotificationOptions) error { var cDataJSON *C.char if options.Data != nil { jsonData, err := json.Marshal(options.Data) - if err == nil { - cDataJSON = C.CString(string(jsonData)) - defer C.free(unsafe.Pointer(cDataJSON)) + if err != nil { + return fmt.Errorf("failed to marshal notification data: %w", err) } + cDataJSON = C.CString(string(jsonData)) + defer C.free(unsafe.Pointer(cDataJSON)) } - C.sendNotification(cIdentifier, cTitle, cSubtitle, cBody, cDataJSON, nil) + C.sendNotification(cIdentifier, cTitle, cSubtitle, cBody, cDataJSON) return nil } @@ -120,9 +102,6 @@ func (ns *Service) SendNotification(options NotificationOptions) error { // A NotificationCategory must be registered with RegisterNotificationCategory first. The `CategoryID` must match the registered category. // If a NotificationCategory is not registered a basic notification will be sent. func (ns *Service) SendNotificationWithActions(options NotificationOptions) error { - if !CheckBundleIdentifier() { - return fmt.Errorf("notifications require a bundled application with a unique bundle identifier") - } cIdentifier := C.CString(options.ID) cTitle := C.CString(options.Title) cSubtitle := C.CString(options.Subtitle) @@ -134,31 +113,29 @@ func (ns *Service) SendNotificationWithActions(options NotificationOptions) erro defer C.free(unsafe.Pointer(cBody)) defer C.free(unsafe.Pointer(cCategoryID)) - var cActionsJSON *C.char + var cDataJSON *C.char if options.Data != nil { jsonData, err := json.Marshal(options.Data) - if err == nil { - cActionsJSON = C.CString(string(jsonData)) - defer C.free(unsafe.Pointer(cActionsJSON)) + if err != nil { + return fmt.Errorf("failed to marshal notification data: %w", err) } + cDataJSON = C.CString(string(jsonData)) + defer C.free(unsafe.Pointer(cDataJSON)) } - C.sendNotificationWithActions(cIdentifier, cTitle, cSubtitle, cBody, cCategoryID, cActionsJSON, nil) + C.sendNotificationWithActions(cIdentifier, cTitle, cSubtitle, cBody, cCategoryID, cDataJSON) return nil } // RegisterNotificationCategory registers a new NotificationCategory to be used with SendNotificationWithActions. // Registering a category with the same name as a previously registered NotificationCategory will override it. func (ns *Service) RegisterNotificationCategory(category NotificationCategory) error { - if !CheckBundleIdentifier() { - return fmt.Errorf("notifications require a bundled application with a unique bundle identifier") - } cCategoryID := C.CString(category.ID) defer C.free(unsafe.Pointer(cCategoryID)) actionsJSON, err := json.Marshal(category.Actions) if err != nil { - return err + return fmt.Errorf("failed to marshal notification category: %w", err) } cActionsJSON := C.CString(string(actionsJSON)) defer C.free(unsafe.Pointer(cActionsJSON)) @@ -178,9 +155,6 @@ func (ns *Service) RegisterNotificationCategory(category NotificationCategory) e // RemoveNotificationCategory remove a previously registered NotificationCategory. func (ns *Service) RemoveNotificationCategory(categoryId string) error { - if !CheckBundleIdentifier() { - return fmt.Errorf("notifications require a bundled application with a unique bundle identifier") - } cCategoryID := C.CString(categoryId) defer C.free(unsafe.Pointer(cCategoryID)) @@ -190,18 +164,12 @@ func (ns *Service) RemoveNotificationCategory(categoryId string) error { // RemoveAllPendingNotifications removes all pending notifications. func (ns *Service) RemoveAllPendingNotifications() error { - if !CheckBundleIdentifier() { - return fmt.Errorf("notifications require a bundled application with a unique bundle identifier") - } C.removeAllPendingNotifications() return nil } // RemovePendingNotification removes a pending notification matching the unique identifier. func (ns *Service) RemovePendingNotification(identifier string) error { - if !CheckBundleIdentifier() { - return fmt.Errorf("notifications require a bundled application with a unique bundle identifier") - } cIdentifier := C.CString(identifier) defer C.free(unsafe.Pointer(cIdentifier)) C.removePendingNotification(cIdentifier) @@ -210,18 +178,12 @@ func (ns *Service) RemovePendingNotification(identifier string) error { // RemoveAllDeliveredNotifications removes all delivered notifications. func (ns *Service) RemoveAllDeliveredNotifications() error { - if !CheckBundleIdentifier() { - return fmt.Errorf("notifications require a bundled application with a unique bundle identifier") - } C.removeAllDeliveredNotifications() return nil } // RemoveDeliveredNotification removes a delivered notification matching the unique identifier. func (ns *Service) RemoveDeliveredNotification(identifier string) error { - if !CheckBundleIdentifier() { - return fmt.Errorf("notifications require a bundled application with a unique bundle identifier") - } cIdentifier := C.CString(identifier) defer C.free(unsafe.Pointer(cIdentifier)) C.removeDeliveredNotification(cIdentifier) diff --git a/v3/pkg/services/notifications/notifications_darwin.h b/v3/pkg/services/notifications/notifications_darwin.h index c6bacaf79..6848dc68e 100644 --- a/v3/pkg/services/notifications/notifications_darwin.h +++ b/v3/pkg/services/notifications/notifications_darwin.h @@ -8,8 +8,8 @@ bool checkBundleIdentifier(void); void requestNotificationAuthorization(int channelID); void checkNotificationAuthorization(int channelID); -void sendNotification(const char *identifier, const char *title, const char *subtitle, const char *body, const char *data_json, void *completion); -void sendNotificationWithActions(const char *identifier, const char *title, const char *subtitle, const char *body, const char *categoryId, const char *actions_json, void *completion); +void sendNotification(const char *identifier, const char *title, const char *subtitle, const char *body, const char *data_json); +void sendNotificationWithActions(const char *identifier, const char *title, const char *subtitle, const char *body, const char *categoryId, const char *actions_json); void registerNotificationCategory(const char *categoryId, const char *actions_json, bool hasReplyField, const char *replyPlaceholder, const char *replyButtonTitle); void removeNotificationCategory(const char *categoryId); void removeAllPendingNotifications(void); diff --git a/v3/pkg/services/notifications/notifications_darwin.m b/v3/pkg/services/notifications/notifications_darwin.m index 5ac99c0a3..8329cdc26 100644 --- a/v3/pkg/services/notifications/notifications_darwin.m +++ b/v3/pkg/services/notifications/notifications_darwin.m @@ -73,12 +73,6 @@ static void ensureDelegateInitialized(void) { bool checkBundleIdentifier(void) { NSBundle *main = [NSBundle mainBundle]; if (main.bundleIdentifier == nil) { - NSLog(@"Error: Cannot use the notification API in development mode.\n" - " Notifications require the app to be properly bundled with a bundle identifier and signed.\n" - " To test notifications:\n" - " 1. Build and package your app using 'wails3 package'\n" - " 2. Sign the packaged .app\n" - " 3. Run the signed .app bundle"); return false; } return true; @@ -109,7 +103,7 @@ void checkNotificationAuthorization(int channelID) { }]; } -void sendNotification(const char *identifier, const char *title, const char *subtitle, const char *body, const char *data_json, void *completion) { +void sendNotification(const char *identifier, const char *title, const char *subtitle, const char *body, const char *data_json) { ensureDelegateInitialized(); NSString *nsIdentifier = [NSString stringWithUTF8String:identifier]; @@ -136,7 +130,6 @@ void sendNotification(const char *identifier, const char *title, const char *sub content.body = nsBody; content.sound = [UNNotificationSound defaultSound]; - // Add custom data if available if (customData.count > 0) { content.userInfo = customData; } @@ -146,15 +139,14 @@ void sendNotification(const char *identifier, const char *title, const char *sub UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:nsIdentifier content:content trigger:trigger]; [center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) { - if (completion != NULL) { - void (^callback)(NSError *) = completion; - callback(error); + if (error) { + NSLog(@"Error scheduling notification: %@", error.localizedDescription); } }]; } void sendNotificationWithActions(const char *identifier, const char *title, const char *subtitle, - const char *body, const char *categoryId, const char *actions_json, void *completion) { + const char *body, const char *categoryId, const char *actions_json) { ensureDelegateInitialized(); NSString *nsIdentifier = [NSString stringWithUTF8String:identifier]; @@ -185,7 +177,6 @@ void sendNotificationWithActions(const char *identifier, const char *title, cons content.sound = [UNNotificationSound defaultSound]; content.categoryIdentifier = nsCategoryId; - // Add custom data if available if (customData.count > 0) { content.userInfo = customData; } @@ -195,9 +186,8 @@ void sendNotificationWithActions(const char *identifier, const char *title, cons UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:nsIdentifier content:content trigger:trigger]; [center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) { - if (completion != NULL) { - void (^callback)(NSError *) = completion; - callback(error); + if (error) { + NSLog(@"Error scheduling notification: %@", error.localizedDescription); } }]; } From d7dec9eda716c97cc65faab9dd8d71d391e26a07 Mon Sep 17 00:00:00 2001 From: Ian VanSchooten Date: Wed, 5 Mar 2025 14:36:43 -0500 Subject: [PATCH 122/374] Fix registration of hidden menuItem [mac] --- v3/examples/menu/main.go | 6 ++++++ v3/pkg/application/menu_darwin.go | 6 +++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/v3/examples/menu/main.go b/v3/examples/menu/main.go index 62bcb454b..1809fce0c 100644 --- a/v3/examples/menu/main.go +++ b/v3/examples/menu/main.go @@ -44,6 +44,12 @@ func main() { // Let's make a "Demo" menu myMenu := menu.AddSubmenu("Demo") + // Hidden menu item that can be unhidden + hidden := myMenu.Add("I was hidden").SetHidden(true) + myMenu.Add("Toggle hidden menu").OnClick(func(ctx *application.Context) { + hidden.SetHidden(!hidden.Hidden()) + }) + // Disabled menu item myMenu.Add("Not Enabled").SetEnabled(false) diff --git a/v3/pkg/application/menu_darwin.go b/v3/pkg/application/menu_darwin.go index 1e3fc7197..a17031489 100644 --- a/v3/pkg/application/menu_darwin.go +++ b/v3/pkg/application/menu_darwin.go @@ -84,9 +84,6 @@ func (m *macosMenu) update() { func (m *macosMenu) processMenu(parent unsafe.Pointer, menu *Menu) { for _, item := range menu.items { - if item.hidden { - continue - } switch item.itemType { case submenu: submenu := item.submenu @@ -102,6 +99,9 @@ func (m *macosMenu) processMenu(parent unsafe.Pointer, menu *Menu) { case text, checkbox, radio: menuItem := newMenuItemImpl(item) item.impl = menuItem + if item.hidden { + menuItem.setHidden(true) + } C.addMenuItem(parent, menuItem.nsMenuItem) case separator: C.addMenuSeparator(parent) From fd420bff327e5cfddb42f59e6bf6ba4d267bf92d Mon Sep 17 00:00:00 2001 From: Atterpac Date: Wed, 5 Mar 2025 13:02:46 -0700 Subject: [PATCH 123/374] Bump refresh version --- v3/go.mod | 4 ++-- v3/go.sum | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/v3/go.mod b/v3/go.mod index 3067f25ff..c4ce9ceef 100644 --- a/v3/go.mod +++ b/v3/go.mod @@ -5,7 +5,7 @@ go 1.24.0 require ( github.com/Masterminds/semver v1.5.0 github.com/adrg/xdg v0.5.3 - github.com/atterpac/refresh v0.8.4 + github.com/atterpac/refresh v0.8.6 github.com/bep/debounce v1.2.1 github.com/charmbracelet/glamour v0.8.0 github.com/ebitengine/purego v0.8.2 @@ -144,4 +144,4 @@ require ( modernc.org/mathutil v1.7.1 // indirect modernc.org/memory v1.8.2 // indirect mvdan.cc/sh/v3 v3.10.0 // indirect -) +) \ No newline at end of file diff --git a/v3/go.sum b/v3/go.sum index 672302267..87f3fdbbc 100644 --- a/v3/go.sum +++ b/v3/go.sum @@ -59,6 +59,8 @@ github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkY github.com/atomicgo/cursor v0.0.1/go.mod h1:cBON2QmmrysudxNBFthvMtN32r3jxVRIvzkUiF/RuIk= github.com/atterpac/refresh v0.8.4 h1:jRgX8TwZaMTqDmcFemhtnpJsrlmEmwwSILUQczHTxY8= github.com/atterpac/refresh v0.8.4/go.mod h1:fJpWySLdpbANS8Ej5OvfZVZIVvi/9bmnhTjKS5EjQes= +github.com/atterpac/refresh v0.8.6 h1:Q5miKV2qs9jW+USw8WZ/54Zz8/RSh/bOz5U6JvvDZmM= +github.com/atterpac/refresh v0.8.6/go.mod h1:fJpWySLdpbANS8Ej5OvfZVZIVvi/9bmnhTjKS5EjQes= github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= github.com/aymanbagabas/go-udiff v0.2.0 h1:TK0fH4MteXUDspT88n8CKzvK0X9O2xu9yQjWpi6yML8= From 39cdd1d1e437f2301c8287e42bf4744948ed81b0 Mon Sep 17 00:00:00 2001 From: Ian VanSchooten Date: Thu, 6 Mar 2025 08:49:22 -0500 Subject: [PATCH 124/374] Avoid adding duplicate menuitems (windows) Previously, when calling `.SetHidden(false)` on a menu item that was not hidden, a duplicate menu item was created. --- v3/examples/menu/main.go | 2 +- v3/examples/systray-custom/main.go | 11 +++++++++-- v3/pkg/application/menuitem_windows.go | 7 ++++--- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/v3/examples/menu/main.go b/v3/examples/menu/main.go index 1809fce0c..a9ae843b8 100644 --- a/v3/examples/menu/main.go +++ b/v3/examples/menu/main.go @@ -46,7 +46,7 @@ func main() { // Hidden menu item that can be unhidden hidden := myMenu.Add("I was hidden").SetHidden(true) - myMenu.Add("Toggle hidden menu").OnClick(func(ctx *application.Context) { + myMenu.Add("Toggle the hidden menu").OnClick(func(ctx *application.Context) { hidden.SetHidden(!hidden.Hidden()) }) diff --git a/v3/examples/systray-custom/main.go b/v3/examples/systray-custom/main.go index 2aa244ba4..fee979406 100644 --- a/v3/examples/systray-custom/main.go +++ b/v3/examples/systray-custom/main.go @@ -2,11 +2,12 @@ package main import ( _ "embed" + "log" + "runtime" + "github.com/wailsapp/wails/v3/pkg/application" "github.com/wailsapp/wails/v3/pkg/events" "github.com/wailsapp/wails/v3/pkg/icons" - "log" - "runtime" ) var windowShowing bool @@ -52,6 +53,12 @@ func main() { systemTray := app.NewSystemTray() menu := app.NewMenu() + // Hidden menu item that can be unhidden + hidden := menu.Add("I was hidden").SetHidden(true) + menu.Add("Toggle the hidden menu").OnClick(func(ctx *application.Context) { + hidden.SetHidden(!hidden.Hidden()) + menu.Update() + }) menu.Add("Quit").OnClick(func(data *application.Context) { app.Quit() }) diff --git a/v3/pkg/application/menuitem_windows.go b/v3/pkg/application/menuitem_windows.go index 44d825f1b..31cf0f248 100644 --- a/v3/pkg/application/menuitem_windows.go +++ b/v3/pkg/application/menuitem_windows.go @@ -24,8 +24,8 @@ type windowsMenuItem struct { } func (m *windowsMenuItem) setHidden(hidden bool) { - m.hidden = hidden - if m.hidden { + if hidden && !m.hidden { + m.hidden = true // iterate the parent items and find the menu item before us for i, item := range m.parent.items { if item == m.menuItem { @@ -41,7 +41,8 @@ func (m *windowsMenuItem) setHidden(hidden bool) { // m.pos = w32.GetMenuItemPosition(m.hMenu, uint32(m.id)) // Remove from parent menu w32.RemoveMenu(m.hMenu, m.id, w32.MF_BYCOMMAND) - } else { + } else if !hidden && m.hidden { + m.hidden = false // Add to parent menu // Get the position of the item before us var pos int From 42c6c2b524572f379b6a1bfe7b20086a11821ecb Mon Sep 17 00:00:00 2001 From: Ian VanSchooten Date: Thu, 6 Mar 2025 08:52:46 -0500 Subject: [PATCH 125/374] Fix comment --- v3/pkg/application/menuitem_windows.go | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/v3/pkg/application/menuitem_windows.go b/v3/pkg/application/menuitem_windows.go index 31cf0f248..825b2f05c 100644 --- a/v3/pkg/application/menuitem_windows.go +++ b/v3/pkg/application/menuitem_windows.go @@ -26,7 +26,7 @@ type windowsMenuItem struct { func (m *windowsMenuItem) setHidden(hidden bool) { if hidden && !m.hidden { m.hidden = true - // iterate the parent items and find the menu item before us + // iterate the parent items and find the menu item after us for i, item := range m.parent.items { if item == m.menuItem { if i < len(m.parent.items)-1 { @@ -37,14 +37,11 @@ func (m *windowsMenuItem) setHidden(hidden bool) { break } } - // Get the position of this menu item in the parent menu - // m.pos = w32.GetMenuItemPosition(m.hMenu, uint32(m.id)) // Remove from parent menu w32.RemoveMenu(m.hMenu, m.id, w32.MF_BYCOMMAND) } else if !hidden && m.hidden { m.hidden = false - // Add to parent menu - // Get the position of the item before us + // Add to parent menu before the "itemAfter" var pos int if m.itemAfter != nil { for i, item := range m.parent.items { From a5fdc3a6deddc006a2c9ed35f517f023a7e314f3 Mon Sep 17 00:00:00 2001 From: Ian VanSchooten Date: Thu, 6 Mar 2025 13:58:32 -0500 Subject: [PATCH 126/374] Revert systray-custom example changes --- v3/examples/systray-custom/main.go | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/v3/examples/systray-custom/main.go b/v3/examples/systray-custom/main.go index fee979406..2aa244ba4 100644 --- a/v3/examples/systray-custom/main.go +++ b/v3/examples/systray-custom/main.go @@ -2,12 +2,11 @@ package main import ( _ "embed" - "log" - "runtime" - "github.com/wailsapp/wails/v3/pkg/application" "github.com/wailsapp/wails/v3/pkg/events" "github.com/wailsapp/wails/v3/pkg/icons" + "log" + "runtime" ) var windowShowing bool @@ -53,12 +52,6 @@ func main() { systemTray := app.NewSystemTray() menu := app.NewMenu() - // Hidden menu item that can be unhidden - hidden := menu.Add("I was hidden").SetHidden(true) - menu.Add("Toggle the hidden menu").OnClick(func(ctx *application.Context) { - hidden.SetHidden(!hidden.Hidden()) - menu.Update() - }) menu.Add("Quit").OnClick(func(data *application.Context) { app.Quit() }) From 0a6a4205035507795d3f2b32871f582327c8ade3 Mon Sep 17 00:00:00 2001 From: Ian VanSchooten Date: Thu, 6 Mar 2025 14:00:40 -0500 Subject: [PATCH 127/374] Fix hidden menuItem on windows And bring menu_windows into alignment with popupmenu_windows --- v3/pkg/application/menu_windows.go | 17 +++++++++++++---- v3/pkg/application/popupmenu_windows.go | 23 ++++++++++++++--------- 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/v3/pkg/application/menu_windows.go b/v3/pkg/application/menu_windows.go index 04a089982..b75ac74d1 100644 --- a/v3/pkg/application/menu_windows.go +++ b/v3/pkg/application/menu_windows.go @@ -36,6 +36,14 @@ func (w *windowsMenu) update() { func (w *windowsMenu) processMenu(parentMenu w32.HMENU, inputMenu *Menu) { for _, item := range inputMenu.items { + w.currentMenuID++ + itemID := w.currentMenuID + w.menuMapping[itemID] = item + + menuItemImpl := newMenuItemImpl(item, parentMenu, itemID) + menuItemImpl.parent = inputMenu + item.impl = menuItemImpl + if item.Hidden() { if item.accelerator != nil && item.callback != nil { if w.parentWindow != nil { @@ -44,11 +52,7 @@ func (w *windowsMenu) processMenu(parentMenu w32.HMENU, inputMenu *Menu) { globalApplication.removeKeyBinding(item.accelerator.String()) } } - continue } - w.currentMenuID++ - itemID := w.currentMenuID - w.menuMapping[itemID] = item flags := uint32(w32.MF_STRING) if item.disabled { @@ -84,6 +88,11 @@ func (w *windowsMenu) processMenu(parentMenu w32.HMENU, inputMenu *Menu) { } var menuText = w32.MustStringToUTF16Ptr(thisText) + // If the item is hidden, don't append + if item.Hidden() { + continue + } + w32.AppendMenu(parentMenu, flags, uintptr(itemID), menuText) if item.bitmap != nil { w32.SetMenuIcons(parentMenu, itemID, item.bitmap, nil) diff --git a/v3/pkg/application/popupmenu_windows.go b/v3/pkg/application/popupmenu_windows.go index fbfd5eef9..bad9ad71e 100644 --- a/v3/pkg/application/popupmenu_windows.go +++ b/v3/pkg/application/popupmenu_windows.go @@ -61,6 +61,14 @@ func (p *Win32Menu) newMenu() w32.HMENU { func (p *Win32Menu) buildMenu(parentMenu w32.HMENU, inputMenu *Menu) { currentRadioGroup := RadioGroup{} for _, item := range inputMenu.items { + p.currentMenuID++ + itemID := p.currentMenuID + p.menuMapping[itemID] = item + + menuItemImpl := newMenuItemImpl(item, parentMenu, itemID) + menuItemImpl.parent = inputMenu + item.impl = menuItemImpl + if item.Hidden() { if item.accelerator != nil { if p.parentWindow != nil { @@ -71,14 +79,7 @@ func (p *Win32Menu) buildMenu(parentMenu w32.HMENU, inputMenu *Menu) { globalApplication.removeKeyBinding(item.accelerator.String()) } } - continue } - p.currentMenuID++ - itemID := p.currentMenuID - p.menuMapping[itemID] = item - - menuItemImpl := newMenuItemImpl(item, parentMenu, itemID) - menuItemImpl.parent = inputMenu flags := uint32(w32.MF_STRING) if item.disabled { @@ -131,6 +132,12 @@ func (p *Win32Menu) buildMenu(parentMenu w32.HMENU, inputMenu *Menu) { } } } + + // If the item is hidden, don't append + if item.Hidden() { + continue + } + ok := w32.AppendMenu(parentMenu, flags, uintptr(itemID), w32.MustStringToUTF16Ptr(menuText)) if !ok { globalApplication.fatal("error adding menu item '%s'", menuText) @@ -141,8 +148,6 @@ func (p *Win32Menu) buildMenu(parentMenu w32.HMENU, inputMenu *Menu) { globalApplication.fatal("error setting menu icons: %w", err) } } - - item.impl = menuItemImpl } if len(currentRadioGroup) > 0 { for _, radioMember := range currentRadioGroup { From 10791fabbd7397d0e2d1cd37365755f9d2b1be45 Mon Sep 17 00:00:00 2001 From: Michael B Date: Fri, 7 Mar 2025 14:43:47 +0200 Subject: [PATCH 128/374] add '.html' to requests with no extension and no file found --- v3/internal/assetserver/asset_fileserver.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/v3/internal/assetserver/asset_fileserver.go b/v3/internal/assetserver/asset_fileserver.go index 354cc3742..974bb582b 100644 --- a/v3/internal/assetserver/asset_fileserver.go +++ b/v3/internal/assetserver/asset_fileserver.go @@ -71,7 +71,15 @@ func (d *assetFileServer) serveFSFile(rw http.ResponseWriter, req *http.Request, file, err := d.fs.Open(filename) if err != nil { - return err + if s := path.Ext(filename); s == "" { + filename = filename + ".html" + file, err = d.fs.Open(filename) + if err != nil { + return err + } + } else { + return err + } } defer file.Close() From f316b19c2bf93a5f3f1840a2092ecd7a169a3f13 Mon Sep 17 00:00:00 2001 From: Michael B Date: Fri, 7 Mar 2025 15:44:24 +0200 Subject: [PATCH 129/374] added assetFileServer fix to changelog.mdx --- docs/src/content/docs/changelog.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/src/content/docs/changelog.mdx b/docs/src/content/docs/changelog.mdx index fd18b76c6..b18c0bcd6 100644 --- a/docs/src/content/docs/changelog.mdx +++ b/docs/src/content/docs/changelog.mdx @@ -107,6 +107,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 -  Ensure menu updates occur on the main thread by [@leaanthony](https://github.com/leaanthony) - The dragging and resizing mechanism is now more robust and matches expected platform behaviour more closely by [@fbbdev](https://github.com/fbbdev) in [#4100](https://github.com/wailsapp/wails/pull/4100) - Fixed [#4097](https://github.com/wailsapp/wails/issues/4097) Webpack/angular discards runtime init code by [@fbbdev](https://github.com/fbbdev) in [#4100](https://github.com/wailsapp/wails/pull/4100) +- Fixed assetFileServer not serving `.html` files when non-extension request when `[request]` doesn't exist but `[request].html` does ### Changed From 5e529aed01af787c4b144cdf126356cf7f6980e1 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Sat, 8 Mar 2025 11:23:24 +1100 Subject: [PATCH 130/374] Add fix for application menu. Add docs --- .../content/docs/learn/application-menu.mdx | 37 +++++++++++++++++++ v3/examples/menu/main.go | 14 ++----- v3/pkg/application/webview_window.go | 17 +++++++++ v3/pkg/application/webview_window_darwin.go | 7 ++-- v3/pkg/application/webview_window_linux.go | 9 +++++ v3/pkg/application/webview_window_windows.go | 7 ++++ v3/pkg/application/window.go | 1 + 7 files changed, 78 insertions(+), 14 deletions(-) diff --git a/docs/src/content/docs/learn/application-menu.mdx b/docs/src/content/docs/learn/application-menu.mdx index df344a02c..01f2d271d 100644 --- a/docs/src/content/docs/learn/application-menu.mdx +++ b/docs/src/content/docs/learn/application-menu.mdx @@ -16,6 +16,43 @@ Create a new application menu using the `NewMenu` method: menu := app.NewMenu() ``` +## Setting the Menu + +The way to set the menu varies on the platform: + + + + + On macOS, there is only one menu bar per application. Set the menu using the `SetMenu` method of the application: + + ```go + app.SetMenu(menu) + ``` + + + + + + On Windows, there is a menu bar per window. Set the menu using the `SetMenu` method of the window: + + ```go + window.SetMenu(menu) + ``` + + + + + + On Linux, the menu bar is typically per window. Set the menu using the `SetMenu` method of the window: + + ```go + window.SetMenu(menu) + ``` + + + + + ## Menu Roles Wails provides predefined menu roles that automatically create platform-appropriate menu structures: diff --git a/v3/examples/menu/main.go b/v3/examples/menu/main.go index a9ae843b8..218f93a2d 100644 --- a/v3/examples/menu/main.go +++ b/v3/examples/menu/main.go @@ -27,16 +27,7 @@ func main() { if runtime.GOOS == "darwin" { menu.AddRole(application.AppMenu) } - fileMenu := menu.AddRole(application.FileMenu) - _ = fileMenu - //fileMenu.FindByRole(application.Open).OnClick(func(context *application.Context) { - // selection, err := application.OpenFileDialog().PromptForSingleSelection() - // if err != nil { - // println("Error: " + err.Error()) - // return - // } - // println("You selected: " + selection) - //}) + menu.AddRole(application.FileMenu) menu.AddRole(application.EditMenu) menu.AddRole(application.WindowMenu) menu.AddRole(application.HelpMenu) @@ -124,7 +115,8 @@ func main() { }) app.SetMenu(menu) - app.NewWebviewWindow().SetBackgroundColour(application.NewRGB(33, 37, 41)) + window := app.NewWebviewWindow().SetBackgroundColour(application.NewRGB(33, 37, 41)) + window.SetMenu(menu) err := app.Run() diff --git a/v3/pkg/application/webview_window.go b/v3/pkg/application/webview_window.go index b5903e33c..374c423b7 100644 --- a/v3/pkg/application/webview_window.go +++ b/v3/pkg/application/webview_window.go @@ -108,6 +108,7 @@ type ( showMenuBar() hideMenuBar() toggleMenuBar() + setMenu(menu *Menu) } ) @@ -168,6 +169,22 @@ type WebviewWindow struct { unconditionallyClose bool } +func (w *WebviewWindow) SetMenu(menu *Menu) { + switch runtime.GOOS { + case "darwin": + return + case "windows": + w.options.Windows.Menu = menu + case "linux": + w.options.Linux.Menu = menu + } + if w.impl != nil { + InvokeSync(func() { + w.impl.setMenu(menu) + }) + } +} + // EmitEvent emits an event from the window func (w *WebviewWindow) EmitEvent(name string, data ...any) { globalApplication.emitEvent(&CustomEvent{ diff --git a/v3/pkg/application/webview_window_darwin.go b/v3/pkg/application/webview_window_darwin.go index 668d3c8e9..28e693a23 100644 --- a/v3/pkg/application/webview_window_darwin.go +++ b/v3/pkg/application/webview_window_darwin.go @@ -1427,6 +1427,7 @@ func (w *macosWebviewWindow) delete() { func (w *macosWebviewWindow) redo() { } -func (w *macosWebviewWindow) showMenuBar() {} -func (w *macosWebviewWindow) hideMenuBar() {} -func (w *macosWebviewWindow) toggleMenuBar() {} +func (w *macosWebviewWindow) showMenuBar() {} +func (w *macosWebviewWindow) hideMenuBar() {} +func (w *macosWebviewWindow) toggleMenuBar() {} +func (w *macosWebviewWindow) setMenu(_ *Menu) {} diff --git a/v3/pkg/application/webview_window_linux.go b/v3/pkg/application/webview_window_linux.go index 4bef34335..8c50c6117 100644 --- a/v3/pkg/application/webview_window_linux.go +++ b/v3/pkg/application/webview_window_linux.go @@ -235,6 +235,15 @@ func (w *linuxWebviewWindow) setPhysicalBounds(physicalBounds Rect) { w.setBounds(physicalBounds) } +func (w *linuxWebviewWindow) setMenu(menu *Menu) { + if menu == nil { + w.gtkmenu = nil + return + } + w.parent.options.Linux.Menu = menu + w.gtkmenu = (menu.impl).(*linuxMenu).native +} + func (w *linuxWebviewWindow) run() { for eventId := range w.parent.eventListeners { w.on(eventId) diff --git a/v3/pkg/application/webview_window_windows.go b/v3/pkg/application/webview_window_windows.go index 89bea1cbd..3ff9aff9c 100644 --- a/v3/pkg/application/webview_window_windows.go +++ b/v3/pkg/application/webview_window_windows.go @@ -73,6 +73,13 @@ type windowsWebviewWindow struct { isMinimizing bool } +func (w *windowsWebviewWindow) setMenu(menu *Menu) { + menu.Update() + w.menu = NewApplicationMenu(w, menu) + w.menu.parentWindow = w + w32.SetMenu(w.hwnd, w.menu.menu) +} + func (w *windowsWebviewWindow) cut() { w.execJS("document.execCommand('cut')") } diff --git a/v3/pkg/application/window.go b/v3/pkg/application/window.go index d1a4219ba..0d688126b 100644 --- a/v3/pkg/application/window.go +++ b/v3/pkg/application/window.go @@ -84,4 +84,5 @@ type Window interface { ZoomIn() ZoomOut() ZoomReset() Window + SetMenu(menu *Menu) } From 5fb1a14c36c931a5260216ef9c26b8ed84146880 Mon Sep 17 00:00:00 2001 From: Ian VanSchooten Date: Wed, 5 Mar 2025 14:36:43 -0500 Subject: [PATCH 131/374] Fix registration of hidden menuItem [mac] --- v3/examples/menu/main.go | 6 ++++++ v3/pkg/application/menu_darwin.go | 6 +++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/v3/examples/menu/main.go b/v3/examples/menu/main.go index 62bcb454b..1809fce0c 100644 --- a/v3/examples/menu/main.go +++ b/v3/examples/menu/main.go @@ -44,6 +44,12 @@ func main() { // Let's make a "Demo" menu myMenu := menu.AddSubmenu("Demo") + // Hidden menu item that can be unhidden + hidden := myMenu.Add("I was hidden").SetHidden(true) + myMenu.Add("Toggle hidden menu").OnClick(func(ctx *application.Context) { + hidden.SetHidden(!hidden.Hidden()) + }) + // Disabled menu item myMenu.Add("Not Enabled").SetEnabled(false) diff --git a/v3/pkg/application/menu_darwin.go b/v3/pkg/application/menu_darwin.go index 1e3fc7197..a17031489 100644 --- a/v3/pkg/application/menu_darwin.go +++ b/v3/pkg/application/menu_darwin.go @@ -84,9 +84,6 @@ func (m *macosMenu) update() { func (m *macosMenu) processMenu(parent unsafe.Pointer, menu *Menu) { for _, item := range menu.items { - if item.hidden { - continue - } switch item.itemType { case submenu: submenu := item.submenu @@ -102,6 +99,9 @@ func (m *macosMenu) processMenu(parent unsafe.Pointer, menu *Menu) { case text, checkbox, radio: menuItem := newMenuItemImpl(item) item.impl = menuItem + if item.hidden { + menuItem.setHidden(true) + } C.addMenuItem(parent, menuItem.nsMenuItem) case separator: C.addMenuSeparator(parent) From 35cc7fd569503f720a98f5eb9f68e6ffa43bfae7 Mon Sep 17 00:00:00 2001 From: Ian VanSchooten Date: Thu, 6 Mar 2025 08:49:22 -0500 Subject: [PATCH 132/374] Avoid adding duplicate menuitems (windows) Previously, when calling `.SetHidden(false)` on a menu item that was not hidden, a duplicate menu item was created. --- v3/examples/menu/main.go | 2 +- v3/examples/systray-custom/main.go | 11 +++++++++-- v3/pkg/application/menuitem_windows.go | 7 ++++--- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/v3/examples/menu/main.go b/v3/examples/menu/main.go index 1809fce0c..a9ae843b8 100644 --- a/v3/examples/menu/main.go +++ b/v3/examples/menu/main.go @@ -46,7 +46,7 @@ func main() { // Hidden menu item that can be unhidden hidden := myMenu.Add("I was hidden").SetHidden(true) - myMenu.Add("Toggle hidden menu").OnClick(func(ctx *application.Context) { + myMenu.Add("Toggle the hidden menu").OnClick(func(ctx *application.Context) { hidden.SetHidden(!hidden.Hidden()) }) diff --git a/v3/examples/systray-custom/main.go b/v3/examples/systray-custom/main.go index 2aa244ba4..fee979406 100644 --- a/v3/examples/systray-custom/main.go +++ b/v3/examples/systray-custom/main.go @@ -2,11 +2,12 @@ package main import ( _ "embed" + "log" + "runtime" + "github.com/wailsapp/wails/v3/pkg/application" "github.com/wailsapp/wails/v3/pkg/events" "github.com/wailsapp/wails/v3/pkg/icons" - "log" - "runtime" ) var windowShowing bool @@ -52,6 +53,12 @@ func main() { systemTray := app.NewSystemTray() menu := app.NewMenu() + // Hidden menu item that can be unhidden + hidden := menu.Add("I was hidden").SetHidden(true) + menu.Add("Toggle the hidden menu").OnClick(func(ctx *application.Context) { + hidden.SetHidden(!hidden.Hidden()) + menu.Update() + }) menu.Add("Quit").OnClick(func(data *application.Context) { app.Quit() }) diff --git a/v3/pkg/application/menuitem_windows.go b/v3/pkg/application/menuitem_windows.go index 44d825f1b..31cf0f248 100644 --- a/v3/pkg/application/menuitem_windows.go +++ b/v3/pkg/application/menuitem_windows.go @@ -24,8 +24,8 @@ type windowsMenuItem struct { } func (m *windowsMenuItem) setHidden(hidden bool) { - m.hidden = hidden - if m.hidden { + if hidden && !m.hidden { + m.hidden = true // iterate the parent items and find the menu item before us for i, item := range m.parent.items { if item == m.menuItem { @@ -41,7 +41,8 @@ func (m *windowsMenuItem) setHidden(hidden bool) { // m.pos = w32.GetMenuItemPosition(m.hMenu, uint32(m.id)) // Remove from parent menu w32.RemoveMenu(m.hMenu, m.id, w32.MF_BYCOMMAND) - } else { + } else if !hidden && m.hidden { + m.hidden = false // Add to parent menu // Get the position of the item before us var pos int From 91c9c3f1476a22285f391664845957a88d671134 Mon Sep 17 00:00:00 2001 From: Ian VanSchooten Date: Thu, 6 Mar 2025 08:52:46 -0500 Subject: [PATCH 133/374] Fix comment --- v3/pkg/application/menuitem_windows.go | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/v3/pkg/application/menuitem_windows.go b/v3/pkg/application/menuitem_windows.go index 31cf0f248..825b2f05c 100644 --- a/v3/pkg/application/menuitem_windows.go +++ b/v3/pkg/application/menuitem_windows.go @@ -26,7 +26,7 @@ type windowsMenuItem struct { func (m *windowsMenuItem) setHidden(hidden bool) { if hidden && !m.hidden { m.hidden = true - // iterate the parent items and find the menu item before us + // iterate the parent items and find the menu item after us for i, item := range m.parent.items { if item == m.menuItem { if i < len(m.parent.items)-1 { @@ -37,14 +37,11 @@ func (m *windowsMenuItem) setHidden(hidden bool) { break } } - // Get the position of this menu item in the parent menu - // m.pos = w32.GetMenuItemPosition(m.hMenu, uint32(m.id)) // Remove from parent menu w32.RemoveMenu(m.hMenu, m.id, w32.MF_BYCOMMAND) } else if !hidden && m.hidden { m.hidden = false - // Add to parent menu - // Get the position of the item before us + // Add to parent menu before the "itemAfter" var pos int if m.itemAfter != nil { for i, item := range m.parent.items { From dc662b561a336e4ac3debee9670f9c712bc0bc05 Mon Sep 17 00:00:00 2001 From: Ian VanSchooten Date: Thu, 6 Mar 2025 13:58:32 -0500 Subject: [PATCH 134/374] Revert systray-custom example changes --- v3/examples/systray-custom/main.go | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/v3/examples/systray-custom/main.go b/v3/examples/systray-custom/main.go index fee979406..2aa244ba4 100644 --- a/v3/examples/systray-custom/main.go +++ b/v3/examples/systray-custom/main.go @@ -2,12 +2,11 @@ package main import ( _ "embed" - "log" - "runtime" - "github.com/wailsapp/wails/v3/pkg/application" "github.com/wailsapp/wails/v3/pkg/events" "github.com/wailsapp/wails/v3/pkg/icons" + "log" + "runtime" ) var windowShowing bool @@ -53,12 +52,6 @@ func main() { systemTray := app.NewSystemTray() menu := app.NewMenu() - // Hidden menu item that can be unhidden - hidden := menu.Add("I was hidden").SetHidden(true) - menu.Add("Toggle the hidden menu").OnClick(func(ctx *application.Context) { - hidden.SetHidden(!hidden.Hidden()) - menu.Update() - }) menu.Add("Quit").OnClick(func(data *application.Context) { app.Quit() }) From b733b1d3c4cea71c99d89da6363c1895c8a476ca Mon Sep 17 00:00:00 2001 From: Ian VanSchooten Date: Thu, 6 Mar 2025 14:00:40 -0500 Subject: [PATCH 135/374] Fix hidden menuItem on windows And bring menu_windows into alignment with popupmenu_windows --- v3/pkg/application/menu_windows.go | 17 +++++++++++++---- v3/pkg/application/popupmenu_windows.go | 23 ++++++++++++++--------- 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/v3/pkg/application/menu_windows.go b/v3/pkg/application/menu_windows.go index 04a089982..b75ac74d1 100644 --- a/v3/pkg/application/menu_windows.go +++ b/v3/pkg/application/menu_windows.go @@ -36,6 +36,14 @@ func (w *windowsMenu) update() { func (w *windowsMenu) processMenu(parentMenu w32.HMENU, inputMenu *Menu) { for _, item := range inputMenu.items { + w.currentMenuID++ + itemID := w.currentMenuID + w.menuMapping[itemID] = item + + menuItemImpl := newMenuItemImpl(item, parentMenu, itemID) + menuItemImpl.parent = inputMenu + item.impl = menuItemImpl + if item.Hidden() { if item.accelerator != nil && item.callback != nil { if w.parentWindow != nil { @@ -44,11 +52,7 @@ func (w *windowsMenu) processMenu(parentMenu w32.HMENU, inputMenu *Menu) { globalApplication.removeKeyBinding(item.accelerator.String()) } } - continue } - w.currentMenuID++ - itemID := w.currentMenuID - w.menuMapping[itemID] = item flags := uint32(w32.MF_STRING) if item.disabled { @@ -84,6 +88,11 @@ func (w *windowsMenu) processMenu(parentMenu w32.HMENU, inputMenu *Menu) { } var menuText = w32.MustStringToUTF16Ptr(thisText) + // If the item is hidden, don't append + if item.Hidden() { + continue + } + w32.AppendMenu(parentMenu, flags, uintptr(itemID), menuText) if item.bitmap != nil { w32.SetMenuIcons(parentMenu, itemID, item.bitmap, nil) diff --git a/v3/pkg/application/popupmenu_windows.go b/v3/pkg/application/popupmenu_windows.go index fbfd5eef9..bad9ad71e 100644 --- a/v3/pkg/application/popupmenu_windows.go +++ b/v3/pkg/application/popupmenu_windows.go @@ -61,6 +61,14 @@ func (p *Win32Menu) newMenu() w32.HMENU { func (p *Win32Menu) buildMenu(parentMenu w32.HMENU, inputMenu *Menu) { currentRadioGroup := RadioGroup{} for _, item := range inputMenu.items { + p.currentMenuID++ + itemID := p.currentMenuID + p.menuMapping[itemID] = item + + menuItemImpl := newMenuItemImpl(item, parentMenu, itemID) + menuItemImpl.parent = inputMenu + item.impl = menuItemImpl + if item.Hidden() { if item.accelerator != nil { if p.parentWindow != nil { @@ -71,14 +79,7 @@ func (p *Win32Menu) buildMenu(parentMenu w32.HMENU, inputMenu *Menu) { globalApplication.removeKeyBinding(item.accelerator.String()) } } - continue } - p.currentMenuID++ - itemID := p.currentMenuID - p.menuMapping[itemID] = item - - menuItemImpl := newMenuItemImpl(item, parentMenu, itemID) - menuItemImpl.parent = inputMenu flags := uint32(w32.MF_STRING) if item.disabled { @@ -131,6 +132,12 @@ func (p *Win32Menu) buildMenu(parentMenu w32.HMENU, inputMenu *Menu) { } } } + + // If the item is hidden, don't append + if item.Hidden() { + continue + } + ok := w32.AppendMenu(parentMenu, flags, uintptr(itemID), w32.MustStringToUTF16Ptr(menuText)) if !ok { globalApplication.fatal("error adding menu item '%s'", menuText) @@ -141,8 +148,6 @@ func (p *Win32Menu) buildMenu(parentMenu w32.HMENU, inputMenu *Menu) { globalApplication.fatal("error setting menu icons: %w", err) } } - - item.impl = menuItemImpl } if len(currentRadioGroup) > 0 { for _, radioMember := range currentRadioGroup { From 866fb36b67679b24023db5e4aa6b8c8fc321d17d Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Sat, 8 Mar 2025 11:23:24 +1100 Subject: [PATCH 136/374] Add fix for application menu. Add docs --- .../content/docs/learn/application-menu.mdx | 37 +++++++++++++++++++ v3/examples/menu/main.go | 14 ++----- v3/pkg/application/webview_window.go | 17 +++++++++ v3/pkg/application/webview_window_darwin.go | 7 ++-- v3/pkg/application/webview_window_linux.go | 9 +++++ v3/pkg/application/webview_window_windows.go | 7 ++++ v3/pkg/application/window.go | 1 + 7 files changed, 78 insertions(+), 14 deletions(-) diff --git a/docs/src/content/docs/learn/application-menu.mdx b/docs/src/content/docs/learn/application-menu.mdx index df344a02c..01f2d271d 100644 --- a/docs/src/content/docs/learn/application-menu.mdx +++ b/docs/src/content/docs/learn/application-menu.mdx @@ -16,6 +16,43 @@ Create a new application menu using the `NewMenu` method: menu := app.NewMenu() ``` +## Setting the Menu + +The way to set the menu varies on the platform: + + + + + On macOS, there is only one menu bar per application. Set the menu using the `SetMenu` method of the application: + + ```go + app.SetMenu(menu) + ``` + + + + + + On Windows, there is a menu bar per window. Set the menu using the `SetMenu` method of the window: + + ```go + window.SetMenu(menu) + ``` + + + + + + On Linux, the menu bar is typically per window. Set the menu using the `SetMenu` method of the window: + + ```go + window.SetMenu(menu) + ``` + + + + + ## Menu Roles Wails provides predefined menu roles that automatically create platform-appropriate menu structures: diff --git a/v3/examples/menu/main.go b/v3/examples/menu/main.go index a9ae843b8..218f93a2d 100644 --- a/v3/examples/menu/main.go +++ b/v3/examples/menu/main.go @@ -27,16 +27,7 @@ func main() { if runtime.GOOS == "darwin" { menu.AddRole(application.AppMenu) } - fileMenu := menu.AddRole(application.FileMenu) - _ = fileMenu - //fileMenu.FindByRole(application.Open).OnClick(func(context *application.Context) { - // selection, err := application.OpenFileDialog().PromptForSingleSelection() - // if err != nil { - // println("Error: " + err.Error()) - // return - // } - // println("You selected: " + selection) - //}) + menu.AddRole(application.FileMenu) menu.AddRole(application.EditMenu) menu.AddRole(application.WindowMenu) menu.AddRole(application.HelpMenu) @@ -124,7 +115,8 @@ func main() { }) app.SetMenu(menu) - app.NewWebviewWindow().SetBackgroundColour(application.NewRGB(33, 37, 41)) + window := app.NewWebviewWindow().SetBackgroundColour(application.NewRGB(33, 37, 41)) + window.SetMenu(menu) err := app.Run() diff --git a/v3/pkg/application/webview_window.go b/v3/pkg/application/webview_window.go index b5903e33c..374c423b7 100644 --- a/v3/pkg/application/webview_window.go +++ b/v3/pkg/application/webview_window.go @@ -108,6 +108,7 @@ type ( showMenuBar() hideMenuBar() toggleMenuBar() + setMenu(menu *Menu) } ) @@ -168,6 +169,22 @@ type WebviewWindow struct { unconditionallyClose bool } +func (w *WebviewWindow) SetMenu(menu *Menu) { + switch runtime.GOOS { + case "darwin": + return + case "windows": + w.options.Windows.Menu = menu + case "linux": + w.options.Linux.Menu = menu + } + if w.impl != nil { + InvokeSync(func() { + w.impl.setMenu(menu) + }) + } +} + // EmitEvent emits an event from the window func (w *WebviewWindow) EmitEvent(name string, data ...any) { globalApplication.emitEvent(&CustomEvent{ diff --git a/v3/pkg/application/webview_window_darwin.go b/v3/pkg/application/webview_window_darwin.go index 668d3c8e9..28e693a23 100644 --- a/v3/pkg/application/webview_window_darwin.go +++ b/v3/pkg/application/webview_window_darwin.go @@ -1427,6 +1427,7 @@ func (w *macosWebviewWindow) delete() { func (w *macosWebviewWindow) redo() { } -func (w *macosWebviewWindow) showMenuBar() {} -func (w *macosWebviewWindow) hideMenuBar() {} -func (w *macosWebviewWindow) toggleMenuBar() {} +func (w *macosWebviewWindow) showMenuBar() {} +func (w *macosWebviewWindow) hideMenuBar() {} +func (w *macosWebviewWindow) toggleMenuBar() {} +func (w *macosWebviewWindow) setMenu(_ *Menu) {} diff --git a/v3/pkg/application/webview_window_linux.go b/v3/pkg/application/webview_window_linux.go index 4bef34335..8c50c6117 100644 --- a/v3/pkg/application/webview_window_linux.go +++ b/v3/pkg/application/webview_window_linux.go @@ -235,6 +235,15 @@ func (w *linuxWebviewWindow) setPhysicalBounds(physicalBounds Rect) { w.setBounds(physicalBounds) } +func (w *linuxWebviewWindow) setMenu(menu *Menu) { + if menu == nil { + w.gtkmenu = nil + return + } + w.parent.options.Linux.Menu = menu + w.gtkmenu = (menu.impl).(*linuxMenu).native +} + func (w *linuxWebviewWindow) run() { for eventId := range w.parent.eventListeners { w.on(eventId) diff --git a/v3/pkg/application/webview_window_windows.go b/v3/pkg/application/webview_window_windows.go index 89bea1cbd..3ff9aff9c 100644 --- a/v3/pkg/application/webview_window_windows.go +++ b/v3/pkg/application/webview_window_windows.go @@ -73,6 +73,13 @@ type windowsWebviewWindow struct { isMinimizing bool } +func (w *windowsWebviewWindow) setMenu(menu *Menu) { + menu.Update() + w.menu = NewApplicationMenu(w, menu) + w.menu.parentWindow = w + w32.SetMenu(w.hwnd, w.menu.menu) +} + func (w *windowsWebviewWindow) cut() { w.execJS("document.execCommand('cut')") } diff --git a/v3/pkg/application/window.go b/v3/pkg/application/window.go index d1a4219ba..0d688126b 100644 --- a/v3/pkg/application/window.go +++ b/v3/pkg/application/window.go @@ -84,4 +84,5 @@ type Window interface { ZoomIn() ZoomOut() ZoomReset() Window + SetMenu(menu *Menu) } From e07e92451923eddbe78fa46c756c77fd4069dd17 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Sat, 8 Mar 2025 11:35:42 +1100 Subject: [PATCH 137/374] Remove Warp agents --- .github/workflows/build-and-test-v3.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-and-test-v3.yml b/.github/workflows/build-and-test-v3.yml index 54a0a280c..b0852259a 100644 --- a/.github/workflows/build-and-test-v3.yml +++ b/.github/workflows/build-and-test-v3.yml @@ -91,7 +91,7 @@ jobs: strategy: fail-fast: false matrix: - os: [warp-windows-latest-x64-2x, warp-macos-15-arm64-6x, warp-ubuntu-latest-x64-2x] + os: [windows-latest, ubuntu-latest, macos-latest] go-version: [1.24] steps: From c8e3ba2d4b02996b993a24837116bf2c717446c0 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Sat, 8 Mar 2025 11:44:02 +1100 Subject: [PATCH 138/374] PR workflow change --- .github/workflows/{pr.yml => pr-v3.yml} | 51 ++++++++++++------------- 1 file changed, 25 insertions(+), 26 deletions(-) rename .github/workflows/{pr.yml => pr-v3.yml} (71%) diff --git a/.github/workflows/pr.yml b/.github/workflows/pr-v3.yml similarity index 71% rename from .github/workflows/pr.yml rename to .github/workflows/pr-v3.yml index 9e981bf1d..a6893f732 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr-v3.yml @@ -8,11 +8,10 @@ on: types: [submitted] branches: - master - jobs: check_docs: name: Check Docs - if: ${{github.repository == 'wailsapp/wails' && contains(github.head_ref,'feature/')}} + if: ${{github.repository == 'wailsapp/wails' && github.base_ref == 'master'}} runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 @@ -30,37 +29,37 @@ jobs: run: | echo "::warning::Feature branch does not contain any changes to the website." -# lint_go: -# name: Run Go Linters -# runs-on: ubuntu-latest -# steps: -# - name: Checkout code -# uses: actions/checkout@v4 -# -# - name: Setup Go -# uses: actions/setup-go@v4 -# with: -# go-version: "1.21" -# -# - name: Update go modules -# working-directory: ./v2 -# run: go mod tidy -# -# - name: Run Linter -# uses: golangci/golangci-lint-action@v3 -# with: -# version: v1.54 -# working-directory: ./v2 -# args: --timeout=10m0s --config ./.golangci.yml + # lint_go: + # name: Run Go Linters + # runs-on: ubuntu-latest + # steps: + # - name: Checkout code + # uses: actions/checkout@v4 + # + # - name: Setup Go + # uses: actions/setup-go@v4 + # with: + # go-version: "1.21" + # + # - name: Update go modules + # working-directory: ./v2 + # run: go mod tidy + # + # - name: Run Linter + # uses: golangci/golangci-lint-action@v3 + # with: + # version: v1.54 + # working-directory: ./v2 + # args: --timeout=10m0s --config ./.golangci.yml test_go: name: Run Go Tests runs-on: ${{ matrix.os }} - if: github.event.review.state == 'approved' + if: github.event.review.state == 'approved' && github.repository == 'wailsapp/wails' && github.base_ref == 'master' strategy: matrix: os: [ubuntu-22.04, windows-latest, macos-latest, ubuntu-24.04] - go-version: ['1.21'] + go-version: ['1.23'] steps: - name: Checkout code From fd9c37aa440cdc520af81279ff0586432a6d0d1d Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Sat, 8 Mar 2025 11:52:38 +1100 Subject: [PATCH 139/374] Update changelog --- docs/src/content/docs/changelog.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/src/content/docs/changelog.mdx b/docs/src/content/docs/changelog.mdx index fd18b76c6..f3f89a9af 100644 --- a/docs/src/content/docs/changelog.mdx +++ b/docs/src/content/docs/changelog.mdx @@ -75,6 +75,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Add method `Close` on `sqlite` service to close the DB manually by [@fbbdev](https://github.com/fbbdev) in [#4067](https://github.com/wailsapp/wails/pull/4067) - Add cancellation support for query methods on `sqlite` service by [@fbbdev](https://github.com/fbbdev) in [#4067](https://github.com/wailsapp/wails/pull/4067) - Add prepared statement support to `sqlite` service with JS bindings by [@fbbdev](https://github.com/fbbdev) in [#4067](https://github.com/wailsapp/wails/pull/4067) +- Add `SetMenu()` on window to allow for setting a menu on a window by [@leaanthony](https://github.com/leaanthony) ### Fixed From 742b802cf75981b6e94e61559db2a3f1630818bf Mon Sep 17 00:00:00 2001 From: Jason Kulatunga Date: Sat, 15 Jun 2024 07:56:55 +1000 Subject: [PATCH 140/374] adding http.CloseNotifier and http.Flusher interface to assetserver.contentTypeSniffer, for Gin (and other framework) compatibility. --- v3/internal/assetserver/assetserver.go | 2 +- .../assetserver/assetserver_webview.go | 2 +- .../assetserver/content_type_sniffer.go | 24 +++++++++++++++++++ 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/v3/internal/assetserver/assetserver.go b/v3/internal/assetserver/assetserver.go index be862a3e2..6ff1b169f 100644 --- a/v3/internal/assetserver/assetserver.go +++ b/v3/internal/assetserver/assetserver.go @@ -59,7 +59,7 @@ func NewAssetServer(options *Options) (*AssetServer, error) { func (a *AssetServer) ServeHTTP(rw http.ResponseWriter, req *http.Request) { start := time.Now() - wrapped := &contentTypeSniffer{rw: rw} + wrapped := newContentTypeSniffer(rw) defer func() { if _, err := wrapped.complete(); err != nil { a.options.Logger.Error("Error writing response data.", "uri", req.RequestURI, "error", err) diff --git a/v3/internal/assetserver/assetserver_webview.go b/v3/internal/assetserver/assetserver_webview.go index b569a4743..637642914 100644 --- a/v3/internal/assetserver/assetserver_webview.go +++ b/v3/internal/assetserver/assetserver_webview.go @@ -74,7 +74,7 @@ func (a *AssetServer) processWebViewRequestInternal(r webview.Request) { } }() - rw := &contentTypeSniffer{rw: wrw} // Make sure we have a Content-Type sniffer + var rw http.ResponseWriter = newContentTypeSniffer(wrw) // Make sure we have a Content-Type sniffer defer func() { if _, err := rw.complete(); err != nil { a.options.Logger.Error("Error writing response data.", "uri", uri, "error", err) diff --git a/v3/internal/assetserver/content_type_sniffer.go b/v3/internal/assetserver/content_type_sniffer.go index 44e4ceb39..e36db90e8 100644 --- a/v3/internal/assetserver/content_type_sniffer.go +++ b/v3/internal/assetserver/content_type_sniffer.go @@ -4,12 +4,20 @@ import ( "net/http" ) +func newContentTypeSniffer(rw http.ResponseWriter) *contentTypeSniffer { + return &contentTypeSniffer{ + rw: rw, + closeChannel: make(chan bool, 1), + } +} + type contentTypeSniffer struct { rw http.ResponseWriter prefix []byte status int headerCommitted bool headerWritten bool + closeChannel chan bool } // Unwrap returns the wrapped [http.ResponseWriter] for use with [http.ResponseController]. @@ -108,3 +116,19 @@ func (rw *contentTypeSniffer) complete() (n int, err error) { return } + +// CloseNotify implements the http.CloseNotifier interface. +func (rw *contentTypeSniffer) CloseNotify() <-chan bool { + return rw.closeChannel +} + +func (rw *contentTypeSniffer) closeClient() { + rw.closeChannel <- true +} + +// Flush implements the http.Flusher interface. +func (rw *contentTypeSniffer) Flush() { + if f, ok := rw.rw.(http.Flusher); ok { + f.Flush() + } +} From d95b77ad049c769e0fce69cfbb704cc54ee22b98 Mon Sep 17 00:00:00 2001 From: Jason Kulatunga Date: Sun, 16 Jun 2024 01:20:25 +1000 Subject: [PATCH 141/374] update changelog. --- mkdocs-website/docs/en/changelog.md | 89 +++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) diff --git a/mkdocs-website/docs/en/changelog.md b/mkdocs-website/docs/en/changelog.md index e69de29bb..9350cdac1 100644 --- a/mkdocs-website/docs/en/changelog.md +++ b/mkdocs-website/docs/en/changelog.md @@ -0,0 +1,89 @@ +# Changelog + + + +## [Unreleased] + +### Added +- [darwin] add Event ApplicationShouldHandleReopen to be able to handle dock icon click by @5aaee9 in [#2991](https://github.com/wailsapp/wails/pull/2991) +- [darwin] add getPrimaryScreen/getScreens to impl by @tmclane in [#2618](https://github.com/wailsapp/wails/pull/2618) +- [darwin] add option for showing the toolbar in fullscreen mode on macOS by [@fbbdev](https://github.com/fbbdev) in [#3282](https://github.com/wailsapp/wails/pull/3282) +- [linux] add onKeyPress logic to convert linux keypress into an accelerator @[Atterpac](https://github.com/Atterpac) in[#3022](https://github.com/wailsapp/wails/pull/3022]) +- [linux] add task `run:linux` by [@marcus-crane](https://github.com/marcus-crane) in [#3146](https://github.com/wailsapp/wails/pull/3146) +- Export `SetIcon` method by @almas1992 in [PR](https://github.com/wailsapp/wails/pull/3147) +- Improve `OnShutdown` by @almas1992 in [PR](https://github.com/wailsapp/wails/pull/3189) +- Restore `ToggleMaximise` method in `Window` interface by [@fbbdev](https://github.com/fbbdev) in [#3281](https://github.com/wailsapp/wails/pull/3281) +- Added more information to `Environment()`. By @leaanthony in [aba82cc](https://github.com/wailsapp/wails/commit/aba82cc52787c97fb99afa58b8b63a0004b7ff6c) based on [PR](https://github.com/wailsapp/wails/pull/2044) by @Mai-Lapyst +- Expose the `WebviewWindow.IsFocused` method on the `Window` interface by [@fbbdev](https://github.com/fbbdev) in [#3295](https://github.com/wailsapp/wails/pull/3295) +- Support multiple space-separated trigger events in the WML system by [@fbbdev](https://github.com/fbbdev) in [#3295](https://github.com/wailsapp/wails/pull/3295) +- Add ESM exports from the bundled JS runtime script by [@fbbdev](https://github.com/fbbdev) in [#3295](https://github.com/wailsapp/wails/pull/3295) +- Add binding generator flag for using the bundled JS runtime script instead of the npm package by [@fbbdev](https://github.com/fbbdev) in [#3334](https://github.com/wailsapp/wails/pull/3334) +- Implement `setIcon` on linux by [@abichinger](https://github.com/abichinger) in [#3354](https://github.com/wailsapp/wails/pull/3354) +- Add flag `-port` to dev command and support environment variable `WAILS_VITE_PORT` by [@abichinger](https://github.com/abichinger) in [#3429](https://github.com/wailsapp/wails/pull/3429) +- Add tests for bound method calls by [@abichinger](https://github.com/abichinger) in [#3431](https://github.com/wailsapp/wails/pull/3431) + +### Fixed + +- [linux] Fixed theme handling error on NixOS by [tmclane](https://github.com/tmclane) in [#3515)(https://github.com/wailsapp/wails/pull/3515) +- Fixed cross volume project install for windows by [atterpac](https://github.com/atterac) in [#3512](https://github.com/wailsapp/wails/pull/3512) +- Fixed react template css to show footer by [atterpac](https://github.com/atterpac) in [#3477](https://github.com/wailsapp/wails/pull/3477) +- Fixed zombie processes when working in devmode by updating to latest refresh by [Atterpac](https://github.com/atterpac) in [#3320](https://github.com/wailsapp/wails/pull/3320). +- Fixed appimage webkit file sourcing by [Atterpac](https://github.com/atterpac) in [#3306](https://github.com/wailsapp/wails/pull/3306). +- Fixed Doctor apt package verify by [Atterpac](https://github.com/Atterpac) in [#2972](https://github.com/wailsapp/wails/pull/2972). +- Fixed application frozen when quit (Darwin) by @5aaee9 in [#2982](https://github.com/wailsapp/wails/pull/2982) +- Fixed background colours of examples on Windows by [mmgvh](https://github.com/mmghv) in [#2750](https://github.com/wailsapp/wails/pull/2750). +- Fixed default context menus by [mmgvh](https://github.com/mmghv) in [#2753](https://github.com/wailsapp/wails/pull/2753). +- Fixed hex values for arrow keys on Darwin by [jaybeecave](https://github.com/jaybeecave) in [#3052](https://github.com/wailsapp/wails/pull/3052). +- Set drag-n-drop for windows to working. Added by [@pylotlight](https://github.com/pylotlight) in [PR](https://github.com/wailsapp/wails/pull/3039) +- Fixed bug for linux in doctor in the event user doesn't have proper drivers installed. Added by [@pylotlight](https://github.com/pylotlight) in [PR](https://github.com/wailsapp/wails/pull/3032) +- Fix dpi scaling on start up (windows). Changed by @almas1992 in [PR](https://github.com/wailsapp/wails/pull/3145) +- Fix replace line in `go.mod` to use relative paths. Fixes Windows paths with spaces - @leaanthony. +- Fix MacOS systray click handling when no attached window by [thomas-senechal](https://github.com/thomas-senechal) in PR [#3207](https://github.com/wailsapp/wails/pull/3207) +- Fix failing Windows build due to unknown option by [thomas-senechal](https://github.com/thomas-senechal) in PR [#3208](https://github.com/wailsapp/wails/pull/3208) +- Fix crash on windows left clicking the systray icon when not having an attached window [tw1nk](https://github.com/tw1nk) in PR [#3271](https://github.com/wailsapp/wails/pull/3271) +- Fix wrong baseURL when open window twice by @5aaee9 in PR [#3273](https://github.com/wailsapp/wails/pull/3273) +- Fix ordering of if branches in `WebviewWindow.Restore` method by [@fbbdev](https://github.com/fbbdev) in [#3279](https://github.com/wailsapp/wails/pull/3279) +- Correctly compute `startURL` across multiple `GetStartURL` invocations when `FRONTEND_DEVSERVER_URL` is present. [#3299](https://github.com/wailsapp/wails/pull/3299) +- Fix the JS type of the `Screen` struct to match its Go counterpart by [@fbbdev](https://github.com/fbbdev) in [#3295](https://github.com/wailsapp/wails/pull/3295) +- Fix the `WML.Reload` method to ensure proper cleanup of registered event listeners by [@fbbdev](https://github.com/fbbdev) in [#3295](https://github.com/wailsapp/wails/pull/3295) +- Fix custom context menu closing immediately on linux by [@abichinger](https://github.com/abichinger) in [#3330](https://github.com/wailsapp/wails/pull/3330) +- Fix the output path and extension of model files produced by the binding generator by [@fbbdev](https://github.com/fbbdev) in [#3334](https://github.com/wailsapp/wails/pull/3334) +- Fix the import paths of model files in JS code produced by the binding generator by [@fbbdev](https://github.com/fbbdev) in [#3334](https://github.com/wailsapp/wails/pull/3334) +- Fix drag-n-drop on some linux distros by [@abichinger](https://github.com/abichinger) in [#3346](https://github.com/wailsapp/wails/pull/3346) +- Fix missing task for macOS when using `wails3 task dev` by [@hfoxy](https://github.com/hfoxy) in [#3417](https://github.com/wailsapp/wails/pull/3417) +- Fix registering events causing a nil map assignment by [@hfoxy](https://github.com/hfoxy) in [#3426](https://github.com/wailsapp/wails/pull/3426) +- Fix unmarshaling of bound method parameters by [@fbbdev](https://github.com/fbbdev) in [#3431](https://github.com/wailsapp/wails/pull/3431) +- Fix handling of multiple return values from bound methods by [@fbbdev](https://github.com/fbbdev) in [#3431](https://github.com/wailsapp/wails/pull/3431) +- Fix doctor detection of npm that is not installed with system package manager by [@pekim](https://github.com/pekim) in [#3458](https://github.com/wailsapp/wails/pull/3458) + +### Changed + +- Update linux webkit dependency to webkit2gtk-4.1 over webkitgtk2-4.0 to support Ubuntu 24.04 LTS by [atterpac](https://github.com/atterpac) in [#3461](https://github.com/wailsapp/wails/pull/3461) +- The bundled JS runtime script is now an ESM module: script tags importing it must have the `type="module"` attribute. By [@fbbdev](https://github.com/fbbdev) in [#3295](https://github.com/wailsapp/wails/pull/3295) +- The `@wailsio/runtime` package does not publish its API on the `window.wails` object, and does not start the WML system. This has been done to improve encapsulation. The WML system can be started manually if desired by calling the new `WML.Enable` method. The bundled JS runtime script still performs both operations automatically. By [@fbbdev](https://github.com/fbbdev) in [#3295](https://github.com/wailsapp/wails/pull/3295) +- The Window API module `@wailsio/runtime/src/window` now exposes the containing window object as a default export. It is not possible anymore to import individual methods through ESM named or namespace import syntax. +- The JS window API has been updated to match the current Go `WebviewWindow` API. Some methods have changed name or prototype, specifically: `Screen` becomes `GetScreen`; `GetZoomLevel`/`SetZoomLevel` become `GetZoom`/`SetZoom`; `GetZoom`, `Width` and `Height` now return values directly instead of wrapping them within objects. By [@fbbdev](https://github.com/fbbdev) in [#3295](https://github.com/wailsapp/wails/pull/3295) +- The binding generator now uses calls by ID by default. The `-id` CLI option has been removed. Use the `-names` CLI option to switch back to calls by name. By [@fbbdev](https://github.com/fbbdev) in [#3468](https://github.com/wailsapp/wails/pull/3468) +- New binding code layout: output files were previously organised in folders named after their containing package; now full Go import paths are used, including the module path. By [@fbbdev](https://github.com/fbbdev) in [#3468](https://github.com/wailsapp/wails/pull/3468) +- The struct field `application.Options.Bind` has been renamed to `application.Options.Services`. By [@fbbdev](https://github.com/fbbdev) in [#3468](https://github.com/wailsapp/wails/pull/3468) +- New syntax for binding services: service instances must now be wrapped in a call to `application.NewService`. By [@fbbdev](https://github.com/fbbdev) in [#3468](https://github.com/wailsapp/wails/pull/3468) +- Modified the `contentTypeSniffer` struct to include the `http.CloseNotifier` interface. Now compatible with Gin framework. By [@AnalogJ](https://github.com/AnalogJ) in [#3537](https://github.com/wailsapp/wails/pull/3537) + +### Removed + +### Deprecated + +### Security From 15b9118077d684379c69fea599cfb23e404ec808 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Sat, 8 Mar 2025 15:30:11 +1100 Subject: [PATCH 142/374] Add gin example --- v3/examples/gin-example/README.md | 104 +++++++++ v3/examples/gin-example/go.mod | 76 +++++++ v3/examples/gin-example/go.sum | 250 ++++++++++++++++++++++ v3/examples/gin-example/main.go | 109 ++++++++++ v3/examples/gin-example/static/index.html | 64 ++++++ 5 files changed, 603 insertions(+) create mode 100644 v3/examples/gin-example/README.md create mode 100644 v3/examples/gin-example/go.mod create mode 100644 v3/examples/gin-example/go.sum create mode 100644 v3/examples/gin-example/main.go create mode 100644 v3/examples/gin-example/static/index.html diff --git a/v3/examples/gin-example/README.md b/v3/examples/gin-example/README.md new file mode 100644 index 000000000..b4d85cb9b --- /dev/null +++ b/v3/examples/gin-example/README.md @@ -0,0 +1,104 @@ +# Gin Example + +This example demonstrates how to use the [Gin web framework](https://github.com/gin-gonic/gin) with Wails. + +## Overview + +This example shows how to: + +- Set up Gin as the asset handler for a Wails application +- Create a middleware that routes requests between Wails and Gin +- Define API endpoints with Gin +- Communicate between the Gin-served frontend and Wails backend +- Implement custom Gin middleware + +## Running the Example + +```bash +cd v3/examples/gin-example +go mod tidy +go run . +``` + +## How It Works + +The example uses Gin's HTTP router to serve the frontend content whilst still allowing Wails to handle its internal routes. This is achieved through: + +1. Creating a Gin router with routes for the frontend +2. Implementing a middleware function that decides whether to pass requests to Gin or let Wails handle them +3. Configuring the Wails application to use both the Gin router as the asset handler and the custom middleware + +### Wails-Gin Integration + +The key part of the integration is the middleware function: + +```go +func GinMiddleware(ginEngine *gin.Engine) application.Middleware { + return func(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + // Let Wails handle its internal routes + if r.URL.Path == "/wails/runtime.js" || r.URL.Path == "/wails/ipc" { + next.ServeHTTP(w, r) + return + } + + // Let Gin handle everything else + ginEngine.ServeHTTP(w, r) + }) + } +} +``` + +This allows you to leverage Gin's powerful routing and middleware capabilities whilst still maintaining full access to Wails features. + +### Custom Gin Middleware + +The example also demonstrates how to create custom Gin middleware: + +```go +func LoggingMiddleware() gin.HandlerFunc { + return func(c *gin.Context) { + // Start timer + startTime := time.Now() + + // Process request + c.Next() + + // Calculate latency + latency := time.Since(startTime) + + // Log request details + log.Printf("[GIN] %s | %s | %s | %d | %s", + c.Request.Method, + c.Request.URL.Path, + c.ClientIP(), + c.Writer.Status(), + latency, + ) + } +} +``` + +This middleware is applied to all Gin routes and logs details about each request. + +### Application Configuration + +The Wails application is configured to use Gin as follows: + +```go +app := application.New(application.Options{ + Name: "Gin Example", + Description: "A demo of using Gin with Wails", + Mac: application.MacOptions{ + ApplicationShouldTerminateAfterLastWindowClosed: true, + }, + Assets: application.AssetOptions{ + Handler: ginEngine, + Middleware: GinMiddleware(ginEngine), + }, +}) +``` + +This configuration tells Wails to: +1. Use the Gin engine as the primary handler for HTTP requests +2. Use our custom middleware to route requests between Wails and Gin diff --git a/v3/examples/gin-example/go.mod b/v3/examples/gin-example/go.mod new file mode 100644 index 000000000..6631f24cf --- /dev/null +++ b/v3/examples/gin-example/go.mod @@ -0,0 +1,76 @@ +module gin-example + +go 1.22.4 + +toolchain go1.23.4 + +require ( + github.com/gin-gonic/gin v1.9.1 + github.com/wailsapp/wails/v3 v3.0.0 +) + +require ( + dario.cat/mergo v1.0.0 // indirect + github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371 // indirect + github.com/bep/debounce v1.2.1 // indirect + github.com/bytedance/sonic v1.9.1 // indirect + github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect + github.com/cloudflare/circl v1.3.7 // indirect + github.com/cyphar/filepath-securejoin v0.2.4 // indirect + github.com/ebitengine/purego v0.4.0-alpha.4 // indirect + github.com/emirpasic/gods v1.18.1 // indirect + github.com/gabriel-vasile/mimetype v1.4.2 // indirect + github.com/gin-contrib/sse v0.1.0 // indirect + github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect + github.com/go-git/go-billy/v5 v5.5.0 // indirect + github.com/go-git/go-git/v5 v5.11.0 // indirect + github.com/go-ole/go-ole v1.2.6 // indirect + github.com/go-playground/locales v0.14.1 // indirect + github.com/go-playground/universal-translator v0.18.1 // indirect + github.com/go-playground/validator/v10 v10.14.0 // indirect + github.com/goccy/go-json v0.10.2 // indirect + github.com/godbus/dbus/v5 v5.1.0 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/google/uuid v1.3.0 // indirect + github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect + github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/kevinburke/ssh_config v1.2.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.4 // indirect + github.com/leaanthony/go-ansi-parser v1.6.1 // indirect + github.com/leaanthony/u v1.1.0 // indirect + github.com/leodido/go-urn v1.2.4 // indirect + github.com/lmittmann/tint v1.0.4 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/pelletier/go-toml/v2 v2.0.8 // indirect + github.com/pjbgf/sha1cd v0.3.0 // indirect + github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/rivo/uniseg v0.4.7 // indirect + github.com/samber/lo v1.38.1 // indirect + github.com/sergi/go-diff v1.2.0 // indirect + github.com/skeema/knownhosts v1.2.1 // indirect + github.com/twitchyliquid64/golang-asm v0.15.1 // indirect + github.com/ugorji/go/codec v1.2.11 // indirect + github.com/wailsapp/go-webview2 v1.0.9 // indirect + github.com/wailsapp/mimetype v1.4.1 // indirect + github.com/xanzy/ssh-agent v0.3.3 // indirect + golang.org/x/arch v0.3.0 // indirect + golang.org/x/crypto v0.23.0 // indirect + golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df // indirect + golang.org/x/mod v0.17.0 // indirect + golang.org/x/net v0.25.0 // indirect + golang.org/x/sync v0.7.0 // indirect + golang.org/x/sys v0.20.0 // indirect + golang.org/x/text v0.15.0 // indirect + golang.org/x/tools v0.21.0 // indirect + google.golang.org/protobuf v1.30.0 // indirect + gopkg.in/warnings.v0 v0.1.2 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/wailsapp/wails/v3 => ../../ diff --git a/v3/examples/gin-example/go.sum b/v3/examples/gin-example/go.sum new file mode 100644 index 000000000..b0db8e43f --- /dev/null +++ b/v3/examples/gin-example/go.sum @@ -0,0 +1,250 @@ +dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= +dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= +github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371 h1:kkhsdkhsCvIsutKu5zLMgWtgh9YxGCNAw8Ad8hjwfYg= +github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= +github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= +github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= +github.com/bep/debounce v1.2.1 h1:v67fRdBA9UQu2NhLFXrSg0Brw7CexQekrBwDMM8bzeY= +github.com/bep/debounce v1.2.1/go.mod h1:H8yggRPQKLUhUoqrJC1bO2xNya7vanpDl7xR3ISbCJ0= +github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= +github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= +github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s= +github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= +github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= +github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams= +github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= +github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= +github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU= +github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA= +github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= +github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/ebitengine/purego v0.4.0-alpha.4 h1:Y7yIV06Yo5M2BAdD7EVPhfp6LZ0tEcQo5770OhYUVes= +github.com/ebitengine/purego v0.4.0-alpha.4/go.mod h1:ah1In8AOtksoNK6yk5z1HTJeUkC1Ez4Wk2idgGslMwQ= +github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcejNsXKSkQ6lcIaNec2nyfOdlTBR2lU= +github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= +github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= +github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= +github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= +github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= +github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= +github.com/gliderlabs/ssh v0.3.5 h1:OcaySEmAQJgyYcArR+gGGTHCyE7nvhEMTlYY+Dp8CpY= +github.com/gliderlabs/ssh v0.3.5/go.mod h1:8XB4KraRrX39qHhT6yxPsHedjA08I/uBVwj4xC+/+z4= +github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= +github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= +github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU= +github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow= +github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= +github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= +github.com/go-git/go-git/v5 v5.11.0 h1:XIZc1p+8YzypNr34itUfSvYJcv+eYdTnTvOZ2vD3cA4= +github.com/go-git/go-git/v5 v5.11.0/go.mod h1:6GFcX2P3NM7FPBfpePbpLd21XxsgdAt+lKqXmCUiUCY= +github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.14.0 h1:vgvQWe3XCz3gIeFDm/HnTIbj6UGmg/+t63MyGU2n5js= +github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= +github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= +github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= +github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= +github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e h1:Q3+PugElBCf4PFpxhErSzU3/PY5sFL5Z6rfv4AbGAck= +github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e/go.mod h1:alcuEEnZsY1WQsagKhZDsoPCRoOijYqhZvPwLG0kzVs= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= +github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= +github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/leaanthony/go-ansi-parser v1.6.1 h1:xd8bzARK3dErqkPFtoF9F3/HgN8UQk0ed1YDKpEz01A= +github.com/leaanthony/go-ansi-parser v1.6.1/go.mod h1:+vva/2y4alzVmmIEpk9QDhA7vLC5zKDTRwfZGOp3IWU= +github.com/leaanthony/u v1.1.0 h1:2n0d2BwPVXSUq5yhe8lJPHdxevE2qK5G99PMStMZMaI= +github.com/leaanthony/u v1.1.0/go.mod h1:9+o6hejoRljvZ3BzdYlVL0JYCwtnAsVuN9pVTQcaRfI= +github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= +github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= +github.com/lmittmann/tint v1.0.4 h1:LeYihpJ9hyGvE0w+K2okPTGUdVLfng1+nDNVR4vWISc= +github.com/lmittmann/tint v1.0.4/go.mod h1:HIS3gSy7qNwGCj+5oRjAutErFBl4BzdQP6cJZ0NfMwE= +github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= +github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= +github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= +github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= +github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= +github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= +github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= +github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/samber/lo v1.38.1 h1:j2XEAqXKb09Am4ebOg31SpvzUTTs6EN3VfgeLUhPdXM= +github.com/samber/lo v1.38.1/go.mod h1:+m/ZKRl6ClXCE2Lgf3MsQlWfh4bn1bz6CXEOxnEXnEA= +github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= +github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/skeema/knownhosts v1.2.1 h1:SHWdIUa82uGZz+F+47k8SY4QhhI291cXCpopT1lK2AQ= +github.com/skeema/knownhosts v1.2.1/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= +github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= +github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +github.com/wailsapp/go-webview2 v1.0.9 h1:lrU+q0cf1wgLdR69rN+ZnRtMJNaJRrcQ4ELxoO7/xjs= +github.com/wailsapp/go-webview2 v1.0.9/go.mod h1:Uk2BePfCRzttBBjFrBmqKGJd41P6QIHeV9kTgIeOZNo= +github.com/wailsapp/mimetype v1.4.1 h1:pQN9ycO7uo4vsUUuPeHEYoUkLVkaRntMnHJxVwYhwHs= +github.com/wailsapp/mimetype v1.4.1/go.mod h1:9aV5k31bBOv5z6u+QP8TltzvNGJPmNJD4XlAL3U+j3o= +github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= +github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k= +golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= +golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df h1:UA2aFVmmsIlefxMk29Dp2juaUSth8Pyn3Tq5Y5mJGME= +golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200810151505-1b9f1253b3ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= +golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.21.0 h1:qc0xYgIbsSDt9EyWz05J5wfa7LOVW0YTLOXrqdLAWIw= +golang.org/x/tools v0.21.0/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= +google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= diff --git a/v3/examples/gin-example/main.go b/v3/examples/gin-example/main.go new file mode 100644 index 000000000..374e52182 --- /dev/null +++ b/v3/examples/gin-example/main.go @@ -0,0 +1,109 @@ +package main + +import ( + "embed" + "log" + "net/http" + "time" + + "github.com/gin-gonic/gin" + "github.com/wailsapp/wails/v3/pkg/application" +) + +//go:embed static +var staticFiles embed.FS + +// GinMiddleware creates a middleware that passes requests to Gin if they're not handled by Wails +func GinMiddleware(ginEngine *gin.Engine) application.Middleware { + return func(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + // Let Gin handle everything else + ginEngine.ServeHTTP(w, r) + }) + } +} + +// LoggingMiddleware is a Gin middleware that logs request details +func LoggingMiddleware() gin.HandlerFunc { + return func(c *gin.Context) { + // Start timer + startTime := time.Now() + + // Process request + c.Next() + + // Calculate latency + latency := time.Since(startTime) + + // Log request details + log.Printf("[GIN] %s | %s | %s | %d | %s", + c.Request.Method, + c.Request.URL.Path, + c.ClientIP(), + c.Writer.Status(), + latency, + ) + } +} + +func main() { + // Create a new Gin router + ginEngine := gin.New() // Using New() instead of Default() to add our own middleware + + // Add middlewares + ginEngine.Use(gin.Recovery()) + ginEngine.Use(LoggingMiddleware()) + + // Serve embedded static files + ginEngine.StaticFS("/static", http.FS(staticFiles)) + + // Define routes + ginEngine.GET("/", func(c *gin.Context) { + file, err := staticFiles.ReadFile("static/index.html") + if err != nil { + c.String(http.StatusInternalServerError, "Error reading index.html") + return + } + c.Data(http.StatusOK, "text/html; charset=utf-8", file) + }) + + ginEngine.GET("/api/hello", func(c *gin.Context) { + c.JSON(http.StatusOK, gin.H{ + "message": "Hello from Gin API!", + "time": time.Now().Format(time.RFC3339), + }) + }) + + // Create a new Wails application + app := application.New(application.Options{ + Name: "Gin Example", + Description: "A demo of using Gin with Wails", + Mac: application.MacOptions{ + ApplicationShouldTerminateAfterLastWindowClosed: true, + }, + Assets: application.AssetOptions{ + Handler: ginEngine, + Middleware: GinMiddleware(ginEngine), + }, + }) + + // Register event handler + app.Events.On("gin-button-clicked", func(event *application.WailsEvent) { + log.Printf("Received event from frontend: %v", event.Data) + }) + + // Create window + app.NewWebviewWindowWithOptions(application.WebviewWindowOptions{ + Title: "Wails + Gin Example", + Width: 900, + Height: 700, + Centered: true, + URL: "/", + }) + + // Run the app + err := app.Run() + if err != nil { + log.Fatal(err) + } +} diff --git a/v3/examples/gin-example/static/index.html b/v3/examples/gin-example/static/index.html new file mode 100644 index 000000000..7d980038f --- /dev/null +++ b/v3/examples/gin-example/static/index.html @@ -0,0 +1,64 @@ + + + Wails + Gin Example + + + +
    +

    Wails + Gin Integration

    +
    +

    API Example

    +

    Try the Gin API endpoint:

    + +
    +
    +
    + + + From 38a4299883c46ad5ff9a43930f142a2351e4704a Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Sat, 8 Mar 2025 15:33:33 +1100 Subject: [PATCH 143/374] Add gin guide --- docs/src/content/docs/guides/gin.mdx | 442 +++++++++++++++++++++++++++ 1 file changed, 442 insertions(+) create mode 100644 docs/src/content/docs/guides/gin.mdx diff --git a/docs/src/content/docs/guides/gin.mdx b/docs/src/content/docs/guides/gin.mdx new file mode 100644 index 000000000..afef5640d --- /dev/null +++ b/docs/src/content/docs/guides/gin.mdx @@ -0,0 +1,442 @@ +--- +title: Using Gin with Wails +description: A comprehensive guide to integrating Gin web framework with Wails v3 applications +--- + +# Using Gin with Wails + +This guide demonstrates how to integrate the [Gin web framework](https://github.com/gin-gonic/gin) with Wails v3. Gin is a high-performance HTTP web framework written in Go that makes it easy to build web applications and APIs. + +## Overview + +Wails v3 provides a flexible asset system that allows you to use any HTTP handler, including popular web frameworks like Gin. This integration enables you to: + +- Serve web content using Gin's powerful routing and middleware capabilities +- Create RESTful APIs that can be accessed from your Wails application +- Leverage Gin's extensive feature set whilst maintaining the benefits of Wails +- Build hybrid applications that combine native desktop features with web technologies + +## Setting Up Gin with Wails + +To integrate Gin with Wails, you need to create a Gin router and configure it as the asset handler in your Wails application. Here's a step-by-step guide: + +### 1. Install Dependencies + +First, ensure you have the Gin package installed: + +```bash +go get -u github.com/gin-gonic/gin +``` + +### 2. Create a Middleware for Gin + +Create a middleware function that will handle the integration between Wails and Gin: + +```go +// GinMiddleware creates a middleware that passes requests to Gin +func GinMiddleware(ginEngine *gin.Engine) application.Middleware { + return func(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + // Let Gin handle everything + ginEngine.ServeHTTP(w, r) + }) + } +} +``` + +This middleware passes all HTTP requests to the Gin router. If you need to let Wails handle specific routes (like the Wails runtime), you can modify the middleware to check the request path: + +```go +// GinMiddleware creates a middleware that passes requests to Gin if they're not handled by Wails +func GinMiddleware(ginEngine *gin.Engine) application.Middleware { + return func(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + // Let Wails handle its internal routes + if r.URL.Path == "/wails/runtime.js" || r.URL.Path == "/wails/ipc" { + next.ServeHTTP(w, r) + return + } + + // Let Gin handle everything else + ginEngine.ServeHTTP(w, r) + }) + } +} +``` + +### 3. Configure Your Gin Router + +Set up your Gin router with routes, middlewares, and handlers: + +```go +// Create a new Gin router +ginEngine := gin.New() // Using New() instead of Default() to add custom middleware + +// Add middlewares +ginEngine.Use(gin.Recovery()) +ginEngine.Use(LoggingMiddleware()) // Your custom middleware + +// Define routes +ginEngine.GET("/", func(c *gin.Context) { + // Serve your main page +}) + +ginEngine.GET("/api/hello", func(c *gin.Context) { + c.JSON(http.StatusOK, gin.H{ + "message": "Hello from Gin API!", + "time": time.Now().Format(time.RFC3339), + }) +}) +``` + +### 4. Integrate with Wails Application + +Configure your Wails application to use the Gin router as its asset handler: + +```go +// Create a new Wails application +app := application.New(application.Options{ + Name: "Gin Example", + Description: "A demo of using Gin with Wails", + Mac: application.MacOptions{ + ApplicationShouldTerminateAfterLastWindowClosed: true, + }, + Assets: application.AssetOptions{ + Handler: ginEngine, + Middleware: GinMiddleware(ginEngine), + }, +}) + +// Create window +app.NewWebviewWindowWithOptions(application.WebviewWindowOptions{ + Title: "Wails + Gin Example", + Width: 900, + Height: 700, + Centered: true, + URL: "/", // This will load the route handled by Gin +}) +``` + +## Serving Static Content + +There are several ways to serve static content with Gin in a Wails application: + +### Option 1: Using Go's embed Package + +The recommended approach is to use Go's `embed` package to embed static files into your binary: + +```go +//go:embed static +var staticFiles embed.FS + +// In your main function: +ginEngine.StaticFS("/static", http.FS(staticFiles)) + +// Serve index.html +ginEngine.GET("/", func(c *gin.Context) { + file, err := staticFiles.ReadFile("static/index.html") + if err != nil { + c.String(http.StatusInternalServerError, "Error reading index.html") + return + } + c.Data(http.StatusOK, "text/html; charset=utf-8", file) +}) +``` + +### Option 2: Serving from Disk + +For development purposes, you might prefer to serve files directly from disk: + +```go +// Serve static files from the "static" directory +ginEngine.Static("/static", "./static") + +// Serve index.html +ginEngine.GET("/", func(c *gin.Context) { + c.File("./static/index.html") +}) +``` + +## Custom Middleware + +Gin allows you to create custom middleware for various purposes. Here's an example of a logging middleware: + +```go +// LoggingMiddleware is a Gin middleware that logs request details +func LoggingMiddleware() gin.HandlerFunc { + return func(c *gin.Context) { + // Start timer + startTime := time.Now() + + // Process request + c.Next() + + // Calculate latency + latency := time.Since(startTime) + + // Log request details + log.Printf("[GIN] %s | %s | %s | %d | %s", + c.Request.Method, + c.Request.URL.Path, + c.ClientIP(), + c.Writer.Status(), + latency, + ) + } +} +``` + +## Handling API Requests + +Gin makes it easy to create RESTful APIs. Here's how to define API endpoints: + +```go +// GET endpoint +ginEngine.GET("/api/users", func(c *gin.Context) { + c.JSON(http.StatusOK, users) +}) + +// POST endpoint with JSON binding +ginEngine.POST("/api/users", func(c *gin.Context) { + var newUser User + if err := c.ShouldBindJSON(&newUser); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + // Process the new user... + c.JSON(http.StatusCreated, newUser) +}) + +// Path parameters +ginEngine.GET("/api/users/:id", func(c *gin.Context) { + id := c.Param("id") + // Find user by ID... + c.JSON(http.StatusOK, user) +}) + +// Query parameters +ginEngine.GET("/api/search", func(c *gin.Context) { + query := c.DefaultQuery("q", "") + limit := c.DefaultQuery("limit", "10") + // Perform search... + c.JSON(http.StatusOK, results) +}) +``` + +## Interacting with Wails + +Your Gin-served web content can interact with Wails features like events and bindings: + +### Handling Wails Events in Go + +```go +// Register event handler +app.Events.On("my-event", func(event *application.WailsEvent) { + log.Printf("Received event from frontend: %v", event.Data) + // Process the event... +}) +``` + +### Emitting Events from JavaScript + +```html + +``` + +## Advanced Configuration + +### CORS Configuration + +If your application needs to handle Cross-Origin Resource Sharing (CORS), you can use Gin's CORS middleware: + +```go +import "github.com/gin-contrib/cors" + +// In your main function: +ginEngine.Use(cors.New(cors.Config{ + AllowOrigins: []string{"*"}, + AllowMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"}, + AllowHeaders: []string{"Origin", "Content-Type", "Authorization"}, + ExposeHeaders: []string{"Content-Length"}, + AllowCredentials: true, + MaxAge: 12 * time.Hour, +})) +``` + +### Customising Gin's Mode + +Gin has three modes: debug, release, and test. For production applications, you should use release mode: + +```go +// Set Gin to release mode +gin.SetMode(gin.ReleaseMode) + +// Create a new Gin router +ginEngine := gin.New() +``` + +### Handling WebSockets + +You can integrate WebSockets with Gin using libraries like Gorilla WebSocket: + +```go +import "github.com/gorilla/websocket" + +var upgrader = websocket.Upgrader{ + ReadBufferSize: 1024, + WriteBufferSize: 1024, + CheckOrigin: func(r *http.Request) bool { + return true // Allow all connections + }, +} + +// In your route handler: +ginEngine.GET("/ws", func(c *gin.Context) { + conn, err := upgrader.Upgrade(c.Writer, c.Request, nil) + if err != nil { + log.Println(err) + return + } + defer conn.Close() + + // Handle WebSocket connection... +}) +``` + +## Complete Example + +Here's a complete example of integrating Gin with Wails: + +```go +package main + +import ( + "embed" + "log" + "net/http" + "time" + + "github.com/gin-gonic/gin" + "github.com/wailsapp/wails/v3/pkg/application" +) + +//go:embed static +var staticFiles embed.FS + +// GinMiddleware creates a middleware that passes requests to Gin +func GinMiddleware(ginEngine *gin.Engine) application.Middleware { + return func(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + // Let Gin handle everything + ginEngine.ServeHTTP(w, r) + }) + } +} + +// LoggingMiddleware is a Gin middleware that logs request details +func LoggingMiddleware() gin.HandlerFunc { + return func(c *gin.Context) { + startTime := time.Now() + c.Next() + latency := time.Since(startTime) + log.Printf("[GIN] %s | %s | %s | %d | %s", + c.Request.Method, + c.Request.URL.Path, + c.ClientIP(), + c.Writer.Status(), + latency, + ) + } +} + +func main() { + // Set Gin to release mode for production + // gin.SetMode(gin.ReleaseMode) + + // Create a new Gin router + ginEngine := gin.New() + + // Add middlewares + ginEngine.Use(gin.Recovery()) + ginEngine.Use(LoggingMiddleware()) + + // Serve embedded static files + ginEngine.StaticFS("/static", http.FS(staticFiles)) + + // Define routes + ginEngine.GET("/", func(c *gin.Context) { + file, err := staticFiles.ReadFile("static/index.html") + if err != nil { + c.String(http.StatusInternalServerError, "Error reading index.html") + return + } + c.Data(http.StatusOK, "text/html; charset=utf-8", file) + }) + + ginEngine.GET("/api/hello", func(c *gin.Context) { + c.JSON(http.StatusOK, gin.H{ + "message": "Hello from Gin API!", + "time": time.Now().Format(time.RFC3339), + }) + }) + + // Create a new Wails application + app := application.New(application.Options{ + Name: "Gin Example", + Description: "A demo of using Gin with Wails", + Mac: application.MacOptions{ + ApplicationShouldTerminateAfterLastWindowClosed: true, + }, + Assets: application.AssetOptions{ + Handler: ginEngine, + Middleware: GinMiddleware(ginEngine), + }, + }) + + // Register event handler + app.Events.On("gin-button-clicked", func(event *application.WailsEvent) { + log.Printf("Received event from frontend: %v", event.Data) + }) + + // Create window + app.NewWebviewWindowWithOptions(application.WebviewWindowOptions{ + Title: "Wails + Gin Example", + Width: 900, + Height: 700, + Centered: true, + URL: "/", + }) + + // Run the app + err := app.Run() + if err != nil { + log.Fatal(err) + } +} +``` + +## Best Practices + +- **Use Go's embed Package:** Embed static files into your binary for better distribution. +- **Separate Concerns:** Keep your API logic separate from your UI logic. +- **Error Handling:** Implement proper error handling in both Gin routes and frontend code. +- **Security:** Be mindful of security considerations, especially when handling user input. +- **Performance:** Use Gin's release mode in production for better performance. +- **Testing:** Write tests for your Gin routes using Gin's testing utilities. + +## Conclusion + +Integrating Gin with Wails provides a powerful combination for building desktop applications with web technologies. Gin's performance and feature set complement Wails' desktop integration capabilities, allowing you to create sophisticated applications that leverage the best of both worlds. + +For more information, refer to the [Gin documentation](https://github.com/gin-gonic/gin) and the [Wails documentation](https://wails.io). From e4d6e54c63eb67256be15379f3c9f45b8e1e8986 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Sun, 9 Mar 2025 15:58:50 +1100 Subject: [PATCH 144/374] Add gin guide, fix asset server merge, add gin example --- docs/src/content/docs/guides/gin.mdx | 262 +++++++++--------- v3/examples/gin-example/go.mod | 62 ++--- v3/examples/gin-example/go.sum | 195 +++++-------- v3/examples/gin-example/main.go | 16 +- v3/examples/gin-example/static/index.html | 20 +- .../assetserver/assetserver_webview.go | 2 +- 6 files changed, 252 insertions(+), 305 deletions(-) diff --git a/docs/src/content/docs/guides/gin.mdx b/docs/src/content/docs/guides/gin.mdx index afef5640d..236996674 100644 --- a/docs/src/content/docs/guides/gin.mdx +++ b/docs/src/content/docs/guides/gin.mdx @@ -3,18 +3,15 @@ title: Using Gin with Wails description: A comprehensive guide to integrating Gin web framework with Wails v3 applications --- -# Using Gin with Wails - This guide demonstrates how to integrate the [Gin web framework](https://github.com/gin-gonic/gin) with Wails v3. Gin is a high-performance HTTP web framework written in Go that makes it easy to build web applications and APIs. -## Overview +## Introduction Wails v3 provides a flexible asset system that allows you to use any HTTP handler, including popular web frameworks like Gin. This integration enables you to: - Serve web content using Gin's powerful routing and middleware capabilities - Create RESTful APIs that can be accessed from your Wails application - Leverage Gin's extensive feature set whilst maintaining the benefits of Wails -- Build hybrid applications that combine native desktop features with web technologies ## Setting Up Gin with Wails @@ -37,6 +34,11 @@ Create a middleware function that will handle the integration between Wails and func GinMiddleware(ginEngine *gin.Engine) application.Middleware { return func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + // Let Wails handle the `/wails` route + if r.URL.Path == "/wails" { + next.ServeHTTP(w, r) + return + } // Let Gin handle everything ginEngine.ServeHTTP(w, r) }) @@ -44,25 +46,7 @@ func GinMiddleware(ginEngine *gin.Engine) application.Middleware { } ``` -This middleware passes all HTTP requests to the Gin router. If you need to let Wails handle specific routes (like the Wails runtime), you can modify the middleware to check the request path: - -```go -// GinMiddleware creates a middleware that passes requests to Gin if they're not handled by Wails -func GinMiddleware(ginEngine *gin.Engine) application.Middleware { - return func(next http.Handler) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - // Let Wails handle its internal routes - if r.URL.Path == "/wails/runtime.js" || r.URL.Path == "/wails/ipc" { - next.ServeHTTP(w, r) - return - } - - // Let Gin handle everything else - ginEngine.ServeHTTP(w, r) - }) - } -} -``` +This middleware passes all HTTP requests to the Gin router. ### 3. Configure Your Gin Router @@ -225,13 +209,14 @@ ginEngine.GET("/api/search", func(c *gin.Context) { ## Interacting with Wails -Your Gin-served web content can interact with Wails features like events and bindings: +Your Gin-served web content can interact with Wails features like events and bindings. To enable this interaction, you +must use the JavaScript API package `@wailsio/runtime`. ### Handling Wails Events in Go ```go // Register event handler -app.Events.On("my-event", func(event *application.WailsEvent) { +app.OnEvent("my-event", func(event *application.CustomEvent) { log.Printf("Received event from frontend: %v", event.Data) // Process the event... }) @@ -240,40 +225,22 @@ app.Events.On("my-event", func(event *application.WailsEvent) { ### Emitting Events from JavaScript ```html - + ``` ## Advanced Configuration -### CORS Configuration - -If your application needs to handle Cross-Origin Resource Sharing (CORS), you can use Gin's CORS middleware: - -```go -import "github.com/gin-contrib/cors" - -// In your main function: -ginEngine.Use(cors.New(cors.Config{ - AllowOrigins: []string{"*"}, - AllowMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"}, - AllowHeaders: []string{"Origin", "Content-Type", "Authorization"}, - ExposeHeaders: []string{"Content-Length"}, - AllowCredentials: true, - MaxAge: 12 * time.Hour, -})) -``` - ### Customising Gin's Mode Gin has three modes: debug, release, and test. For production applications, you should use release mode: @@ -286,6 +253,25 @@ gin.SetMode(gin.ReleaseMode) ginEngine := gin.New() ``` +You can use Go's build tags to set the mode based on the build environment: + +```go[main_prod.go] +// +build production + +var ginMode = gin.ReleaseMode +``` + +```go[main_dev.go] +// +build !production + +var ginMode = gin.DebugMode +``` + +```go [main.go] +// In your main function: +gin.SetMode(ginMode) +``` + ### Handling WebSockets You can integrate WebSockets with Gin using libraries like Gorilla WebSocket: @@ -322,107 +308,115 @@ Here's a complete example of integrating Gin with Wails: package main import ( - "embed" - "log" - "net/http" - "time" + "embed" + "log" + "net/http" + "time" - "github.com/gin-gonic/gin" - "github.com/wailsapp/wails/v3/pkg/application" + "github.com/gin-gonic/gin" + "github.com/wailsapp/wails/v3/pkg/application" ) //go:embed static var staticFiles embed.FS -// GinMiddleware creates a middleware that passes requests to Gin +// GinMiddleware creates a middleware that passes requests to Gin if they're not handled by Wails func GinMiddleware(ginEngine *gin.Engine) application.Middleware { - return func(next http.Handler) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - // Let Gin handle everything - ginEngine.ServeHTTP(w, r) - }) - } + return func(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + // Let Wails handle the `/wails` route + if r.URL.Path == "/wails" { + next.ServeHTTP(w, r) + return + } + // Let Gin handle everything else + ginEngine.ServeHTTP(w, r) + }) + } } // LoggingMiddleware is a Gin middleware that logs request details func LoggingMiddleware() gin.HandlerFunc { - return func(c *gin.Context) { - startTime := time.Now() - c.Next() - latency := time.Since(startTime) - log.Printf("[GIN] %s | %s | %s | %d | %s", - c.Request.Method, - c.Request.URL.Path, - c.ClientIP(), - c.Writer.Status(), - latency, - ) - } + return func(c *gin.Context) { + // Start timer + startTime := time.Now() + + // Process request + c.Next() + + // Calculate latency + latency := time.Since(startTime) + + // Log request details + log.Printf("[GIN] %s | %s | %s | %d | %s", + c.Request.Method, + c.Request.URL.Path, + c.ClientIP(), + c.Writer.Status(), + latency, + ) + } } func main() { - // Set Gin to release mode for production - // gin.SetMode(gin.ReleaseMode) + // Create a new Gin router + ginEngine := gin.New() // Using New() instead of Default() to add our own middleware - // Create a new Gin router - ginEngine := gin.New() + // Add middlewares + ginEngine.Use(gin.Recovery()) + ginEngine.Use(LoggingMiddleware()) - // Add middlewares - ginEngine.Use(gin.Recovery()) - ginEngine.Use(LoggingMiddleware()) + // Serve embedded static files + ginEngine.StaticFS("/static", http.FS(staticFiles)) - // Serve embedded static files - ginEngine.StaticFS("/static", http.FS(staticFiles)) + // Define routes + ginEngine.GET("/", func(c *gin.Context) { + file, err := staticFiles.ReadFile("static/index.html") + if err != nil { + c.String(http.StatusInternalServerError, "Error reading index.html") + return + } + c.Data(http.StatusOK, "text/html; charset=utf-8", file) + }) - // Define routes - ginEngine.GET("/", func(c *gin.Context) { - file, err := staticFiles.ReadFile("static/index.html") - if err != nil { - c.String(http.StatusInternalServerError, "Error reading index.html") - return - } - c.Data(http.StatusOK, "text/html; charset=utf-8", file) - }) + ginEngine.GET("/api/hello", func(c *gin.Context) { + c.JSON(http.StatusOK, gin.H{ + "message": "Hello from Gin API!", + "time": time.Now().Format(time.RFC3339), + }) + }) - ginEngine.GET("/api/hello", func(c *gin.Context) { - c.JSON(http.StatusOK, gin.H{ - "message": "Hello from Gin API!", - "time": time.Now().Format(time.RFC3339), - }) - }) + // Create a new Wails application + app := application.New(application.Options{ + Name: "Gin Example", + Description: "A demo of using Gin with Wails", + Mac: application.MacOptions{ + ApplicationShouldTerminateAfterLastWindowClosed: true, + }, + Assets: application.AssetOptions{ + Handler: ginEngine, + Middleware: GinMiddleware(ginEngine), + }, + }) - // Create a new Wails application - app := application.New(application.Options{ - Name: "Gin Example", - Description: "A demo of using Gin with Wails", - Mac: application.MacOptions{ - ApplicationShouldTerminateAfterLastWindowClosed: true, - }, - Assets: application.AssetOptions{ - Handler: ginEngine, - Middleware: GinMiddleware(ginEngine), - }, - }) + // Register event handler + app.OnEvent("gin-button-clicked", func(event *application.CustomEvent) { + log.Printf("Received event from frontend: %v", event.Data) + }) - // Register event handler - app.Events.On("gin-button-clicked", func(event *application.WailsEvent) { - log.Printf("Received event from frontend: %v", event.Data) - }) + // Create window + app.NewWebviewWindowWithOptions(application.WebviewWindowOptions{ + Title: "Wails + Gin Example", + Width: 900, + Height: 700, + URL: "/", + }) - // Create window - app.NewWebviewWindowWithOptions(application.WebviewWindowOptions{ - Title: "Wails + Gin Example", - Width: 900, - Height: 700, - Centered: true, - URL: "/", - }) - - // Run the app - err := app.Run() - if err != nil { - log.Fatal(err) - } + // Run the app + err := app.Run() + if err != nil { + log.Fatal(err) + } } ``` diff --git a/v3/examples/gin-example/go.mod b/v3/examples/gin-example/go.mod index 6631f24cf..964a64312 100644 --- a/v3/examples/gin-example/go.mod +++ b/v3/examples/gin-example/go.mod @@ -1,8 +1,6 @@ module gin-example -go 1.22.4 - -toolchain go1.23.4 +go 1.24.0 require ( github.com/gin-gonic/gin v1.9.1 @@ -10,65 +8,63 @@ require ( ) require ( - dario.cat/mergo v1.0.0 // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371 // indirect + dario.cat/mergo v1.0.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/ProtonMail/go-crypto v1.1.5 // indirect + github.com/adrg/xdg v0.5.3 // indirect github.com/bep/debounce v1.2.1 // indirect github.com/bytedance/sonic v1.9.1 // indirect github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect - github.com/cloudflare/circl v1.3.7 // indirect - github.com/cyphar/filepath-securejoin v0.2.4 // indirect - github.com/ebitengine/purego v0.4.0-alpha.4 // indirect + github.com/cloudflare/circl v1.6.0 // indirect + github.com/cyphar/filepath-securejoin v0.4.1 // indirect + github.com/ebitengine/purego v0.8.2 // indirect github.com/emirpasic/gods v1.18.1 // indirect github.com/gabriel-vasile/mimetype v1.4.2 // indirect github.com/gin-contrib/sse v0.1.0 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect - github.com/go-git/go-billy/v5 v5.5.0 // indirect - github.com/go-git/go-git/v5 v5.11.0 // indirect - github.com/go-ole/go-ole v1.2.6 // indirect + github.com/go-git/go-billy/v5 v5.6.2 // indirect + github.com/go-git/go-git/v5 v5.13.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect github.com/go-playground/validator/v10 v10.14.0 // indirect github.com/goccy/go-json v0.10.2 // indirect github.com/godbus/dbus/v5 v5.1.0 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/google/uuid v1.3.0 // indirect + github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/kevinburke/ssh_config v1.2.0 // indirect - github.com/klauspost/cpuid/v2 v2.2.4 // indirect + github.com/klauspost/cpuid/v2 v2.2.9 // indirect github.com/leaanthony/go-ansi-parser v1.6.1 // indirect - github.com/leaanthony/u v1.1.0 // indirect + github.com/leaanthony/u v1.1.1 // indirect github.com/leodido/go-urn v1.2.4 // indirect - github.com/lmittmann/tint v1.0.4 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect + github.com/lmittmann/tint v1.0.7 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pelletier/go-toml/v2 v2.0.8 // indirect - github.com/pjbgf/sha1cd v0.3.0 // indirect - github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirect + github.com/pjbgf/sha1cd v0.3.2 // indirect + github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect github.com/pkg/errors v0.9.1 // indirect github.com/rivo/uniseg v0.4.7 // indirect - github.com/samber/lo v1.38.1 // indirect - github.com/sergi/go-diff v1.2.0 // indirect - github.com/skeema/knownhosts v1.2.1 // indirect + github.com/samber/lo v1.49.1 // indirect + github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect + github.com/skeema/knownhosts v1.3.1 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/ugorji/go/codec v1.2.11 // indirect - github.com/wailsapp/go-webview2 v1.0.9 // indirect + github.com/wailsapp/go-webview2 v1.0.19 // indirect github.com/wailsapp/mimetype v1.4.1 // indirect github.com/xanzy/ssh-agent v0.3.3 // indirect golang.org/x/arch v0.3.0 // indirect - golang.org/x/crypto v0.23.0 // indirect - golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df // indirect - golang.org/x/mod v0.17.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - golang.org/x/tools v0.21.0 // indirect - google.golang.org/protobuf v1.30.0 // indirect + golang.org/x/crypto v0.33.0 // indirect + golang.org/x/net v0.35.0 // indirect + golang.org/x/sys v0.30.0 // indirect + golang.org/x/text v0.22.0 // indirect + google.golang.org/protobuf v1.33.0 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/v3/examples/gin-example/go.sum b/v3/examples/gin-example/go.sum index b0db8e43f..02b224ce4 100644 --- a/v3/examples/gin-example/go.sum +++ b/v3/examples/gin-example/go.sum @@ -1,35 +1,35 @@ -dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= -dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= +dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s= +dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= -github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371 h1:kkhsdkhsCvIsutKu5zLMgWtgh9YxGCNAw8Ad8hjwfYg= -github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/ProtonMail/go-crypto v1.1.5 h1:eoAQfK2dwL+tFSFpr7TbOaPNUbPiJj4fLYwwGE1FQO4= +github.com/ProtonMail/go-crypto v1.1.5/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE= +github.com/adrg/xdg v0.5.3 h1:xRnxJXne7+oWDatRhR1JLnvuccuIeCoBu2rtuLqQB78= +github.com/adrg/xdg v0.5.3/go.mod h1:nlTsY+NNiCBGCK2tpm09vRqfVzrc2fLmXGpBLF0zlTQ= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/bep/debounce v1.2.1 h1:v67fRdBA9UQu2NhLFXrSg0Brw7CexQekrBwDMM8bzeY= github.com/bep/debounce v1.2.1/go.mod h1:H8yggRPQKLUhUoqrJC1bO2xNya7vanpDl7xR3ISbCJ0= -github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s= github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams= github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= -github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= -github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU= -github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA= -github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= -github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= +github.com/cloudflare/circl v1.6.0 h1:cr5JKic4HI+LkINy2lg3W2jF8sHCVTBncJr5gIIq7qk= +github.com/cloudflare/circl v1.6.0/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs= +github.com/cyphar/filepath-securejoin v0.4.1 h1:JyxxyPEaktOD+GAnqIqTf9A8tHyAG22rowi7HkoSU1s= +github.com/cyphar/filepath-securejoin v0.4.1/go.mod h1:Sdj7gXlvMcPZsbhwhQ33GguGLDGQL7h7bg04C/+u9jI= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/ebitengine/purego v0.4.0-alpha.4 h1:Y7yIV06Yo5M2BAdD7EVPhfp6LZ0tEcQo5770OhYUVes= -github.com/ebitengine/purego v0.4.0-alpha.4/go.mod h1:ah1In8AOtksoNK6yk5z1HTJeUkC1Ez4Wk2idgGslMwQ= -github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcejNsXKSkQ6lcIaNec2nyfOdlTBR2lU= -github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= +github.com/ebitengine/purego v0.8.2 h1:jPPGWs2sZ1UgOSgD2bClL0MJIqu58nOmIcBuXr62z1I= +github.com/ebitengine/purego v0.8.2/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/elazarl/goproxy v1.4.0 h1:4GyuSbFa+s26+3rmYNSuUVsx+HgPrV1bk1jXI0l9wjM= +github.com/elazarl/goproxy v1.4.0/go.mod h1:X/5W/t+gzDyLfHW4DrMdpjqYjpXsURlBt9lpBDxZZZQ= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= @@ -38,18 +38,18 @@ github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= -github.com/gliderlabs/ssh v0.3.5 h1:OcaySEmAQJgyYcArR+gGGTHCyE7nvhEMTlYY+Dp8CpY= -github.com/gliderlabs/ssh v0.3.5/go.mod h1:8XB4KraRrX39qHhT6yxPsHedjA08I/uBVwj4xC+/+z4= +github.com/gliderlabs/ssh v0.3.8 h1:a4YXD1V7xMF9g5nTkdfnja3Sxy1PVDCj1Zg4Wb8vY6c= +github.com/gliderlabs/ssh v0.3.8/go.mod h1:xYoytBv1sV0aL3CavoDuJIQNURXkkfPA/wxQ1pL1fAU= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= -github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU= -github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow= +github.com/go-git/go-billy/v5 v5.6.2 h1:6Q86EsPXMa7c3YZ3aLAQsMA0VlWmy43r6FHqa/UNbRM= +github.com/go-git/go-billy/v5 v5.6.2/go.mod h1:rcFC2rAsp/erv7CMz9GczHcuD0D32fWzH+MJAU+jaUU= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= -github.com/go-git/go-git/v5 v5.11.0 h1:XIZc1p+8YzypNr34itUfSvYJcv+eYdTnTvOZ2vD3cA4= -github.com/go-git/go-git/v5 v5.11.0/go.mod h1:6GFcX2P3NM7FPBfpePbpLd21XxsgdAt+lKqXmCUiUCY= -github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= -github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-git/go-git/v5 v5.13.2 h1:7O7xvsK7K+rZPKW6AQR1YyNhfywkv7B8/FsP3ki6Zv0= +github.com/go-git/go-git/v5 v5.13.2/go.mod h1:hWdW5P4YZRjmpGHwRH2v3zkWcNl6HeXaXQEMGb3NJ9A= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= @@ -62,15 +62,13 @@ github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ= +github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e h1:Q3+PugElBCf4PFpxhErSzU3/PY5sFL5Z6rfv4AbGAck= @@ -80,8 +78,8 @@ github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHm github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= -github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY= +github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= @@ -91,17 +89,17 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/leaanthony/go-ansi-parser v1.6.1 h1:xd8bzARK3dErqkPFtoF9F3/HgN8UQk0ed1YDKpEz01A= github.com/leaanthony/go-ansi-parser v1.6.1/go.mod h1:+vva/2y4alzVmmIEpk9QDhA7vLC5zKDTRwfZGOp3IWU= -github.com/leaanthony/u v1.1.0 h1:2n0d2BwPVXSUq5yhe8lJPHdxevE2qK5G99PMStMZMaI= -github.com/leaanthony/u v1.1.0/go.mod h1:9+o6hejoRljvZ3BzdYlVL0JYCwtnAsVuN9pVTQcaRfI= +github.com/leaanthony/u v1.1.1 h1:TUFjwDGlNX+WuwVEzDqQwC2lOv0P4uhTQw7CMFdiK7M= +github.com/leaanthony/u v1.1.1/go.mod h1:9+o6hejoRljvZ3BzdYlVL0JYCwtnAsVuN9pVTQcaRfI= github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= -github.com/lmittmann/tint v1.0.4 h1:LeYihpJ9hyGvE0w+K2okPTGUdVLfng1+nDNVR4vWISc= -github.com/lmittmann/tint v1.0.4/go.mod h1:HIS3gSy7qNwGCj+5oRjAutErFBl4BzdQP6cJZ0NfMwE= -github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= +github.com/lmittmann/tint v1.0.7 h1:D/0OqWZ0YOGZ6AyC+5Y2kD8PBEzBk6rFHVSfOqCkF9Y= +github.com/lmittmann/tint v1.0.7/go.mod h1:HIS3gSy7qNwGCj+5oRjAutErFBl4BzdQP6cJZ0NfMwE= github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/matryer/is v1.4.1 h1:55ehd8zaGABKLXQUe2awZ99BD/PTc2ls+KV/dXphgEQ= +github.com/matryer/is v1.4.1/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -109,14 +107,14 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= -github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= +github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k= +github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY= github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= -github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= -github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= -github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU= -github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= +github.com/pjbgf/sha1cd v0.3.2 h1:a9wb0bp1oC2TGwStyn0Umc/IGKQnEgF0vVaZ8QF8eo4= +github.com/pjbgf/sha1cd v0.3.2/go.mod h1:zQWigSxVmsHEZow5qaLtPYxpcKMMQpa09ixqBxuCS6A= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -124,15 +122,15 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= -github.com/samber/lo v1.38.1 h1:j2XEAqXKb09Am4ebOg31SpvzUTTs6EN3VfgeLUhPdXM= -github.com/samber/lo v1.38.1/go.mod h1:+m/ZKRl6ClXCE2Lgf3MsQlWfh4bn1bz6CXEOxnEXnEA= -github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= -github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/samber/lo v1.49.1 h1:4BIFyVfuQSEpluc7Fua+j1NolZHiEHEpaSEKdsH0tew= +github.com/samber/lo v1.49.1/go.mod h1:dO6KHFzUKXgP8LDhU0oI8d2hekjXnGOu0DB8Jecxd6o= +github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= +github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/skeema/knownhosts v1.2.1 h1:SHWdIUa82uGZz+F+47k8SY4QhhI291cXCpopT1lK2AQ= -github.com/skeema/knownhosts v1.2.1/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo= +github.com/skeema/knownhosts v1.3.1 h1:X2osQ+RAjK76shCbvhHHHVl3ZlgDm8apHEHFqRjnBY8= +github.com/skeema/knownhosts v1.3.1/go.mod h1:r7KTdC8l4uxWRyK2TpQZ/1o5HaSzh06ePQNxPwTcfiY= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= @@ -145,105 +143,60 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= -github.com/wailsapp/go-webview2 v1.0.9 h1:lrU+q0cf1wgLdR69rN+ZnRtMJNaJRrcQ4ELxoO7/xjs= -github.com/wailsapp/go-webview2 v1.0.9/go.mod h1:Uk2BePfCRzttBBjFrBmqKGJd41P6QIHeV9kTgIeOZNo= +github.com/wailsapp/go-webview2 v1.0.19 h1:7U3QcDj1PrBPaxJNCui2k1SkWml+Q5kvFUFyTImA6NU= +github.com/wailsapp/go-webview2 v1.0.19/go.mod h1:qJmWAmAmaniuKGZPWwne+uor3AHMB5PFhqiK0Bbj8kc= github.com/wailsapp/mimetype v1.4.1 h1:pQN9ycO7uo4vsUUuPeHEYoUkLVkaRntMnHJxVwYhwHs= github.com/wailsapp/mimetype v1.4.1/go.mod h1:9aV5k31bBOv5z6u+QP8TltzvNGJPmNJD4XlAL3U+j3o= github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k= golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= -golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= -golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df h1:UA2aFVmmsIlefxMk29Dp2juaUSth8Pyn3Tq5Y5mJGME= -golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= -golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/crypto v0.33.0 h1:IOBPskki6Lysi0lo9qQvbxiQ+FvsCC/YWOecCHAixus= +golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M= +golang.org/x/exp v0.0.0-20250210185358-939b2ce775ac h1:l5+whBCLH3iH2ZNHYLbAe58bo7yrN4mVcnkHDYz5vvs= +golang.org/x/exp v0.0.0-20250210185358-939b2ce775ac/go.mod h1:hH+7mtFmImwwcMvScyxUhjuVHR3HGaDPMn9rMSUUbxo= golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8= +golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200810151505-1b9f1253b3ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= +golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= -golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/term v0.29.0 h1:L6pJp37ocefwRRtYPKSWOWzOtWSxVajvz2ldH/xi3iU= +golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.21.0 h1:qc0xYgIbsSDt9EyWz05J5wfa7LOVW0YTLOXrqdLAWIw= -golang.org/x/tools v0.21.0/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/v3/examples/gin-example/main.go b/v3/examples/gin-example/main.go index 374e52182..6a4d0b00d 100644 --- a/v3/examples/gin-example/main.go +++ b/v3/examples/gin-example/main.go @@ -17,6 +17,11 @@ var staticFiles embed.FS func GinMiddleware(ginEngine *gin.Engine) application.Middleware { return func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + // Let Wails handle the `/wails` route + if r.URL.Path == "/wails" { + next.ServeHTTP(w, r) + return + } // Let Gin handle everything else ginEngine.ServeHTTP(w, r) }) @@ -88,17 +93,16 @@ func main() { }) // Register event handler - app.Events.On("gin-button-clicked", func(event *application.WailsEvent) { + app.OnEvent("gin-button-clicked", func(event *application.CustomEvent) { log.Printf("Received event from frontend: %v", event.Data) }) // Create window app.NewWebviewWindowWithOptions(application.WebviewWindowOptions{ - Title: "Wails + Gin Example", - Width: 900, - Height: 700, - Centered: true, - URL: "/", + Title: "Wails + Gin Example", + Width: 900, + Height: 700, + URL: "/", }) // Run the app diff --git a/v3/examples/gin-example/static/index.html b/v3/examples/gin-example/static/index.html index 7d980038f..982717e1a 100644 --- a/v3/examples/gin-example/static/index.html +++ b/v3/examples/gin-example/static/index.html @@ -49,16 +49,16 @@ diff --git a/v3/internal/assetserver/assetserver_webview.go b/v3/internal/assetserver/assetserver_webview.go index 637642914..0d029a34e 100644 --- a/v3/internal/assetserver/assetserver_webview.go +++ b/v3/internal/assetserver/assetserver_webview.go @@ -74,7 +74,7 @@ func (a *AssetServer) processWebViewRequestInternal(r webview.Request) { } }() - var rw http.ResponseWriter = newContentTypeSniffer(wrw) // Make sure we have a Content-Type sniffer + rw := newContentTypeSniffer(wrw) // Make sure we have a Content-Type sniffer defer func() { if _, err := rw.complete(); err != nil { a.options.Logger.Error("Error writing response data.", "uri", uri, "error", err) From d1be724f41949ceeb297b164ed6cefa53b7a3013 Mon Sep 17 00:00:00 2001 From: robinsamuel Date: Sun, 9 Mar 2025 23:17:35 +0100 Subject: [PATCH 145/374] fix: correct filename for Windows icon generation in Taskfile --- v3/internal/commands/build_assets/Taskfile.tmpl.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/v3/internal/commands/build_assets/Taskfile.tmpl.yml b/v3/internal/commands/build_assets/Taskfile.tmpl.yml index f4e9be521..0b7ff9c5b 100644 --- a/v3/internal/commands/build_assets/Taskfile.tmpl.yml +++ b/v3/internal/commands/build_assets/Taskfile.tmpl.yml @@ -67,9 +67,9 @@ tasks: - "appicon.png" generates: - "icons.icns" - - "icons.ico" + - "icon.ico" cmds: - - wails3 generate icons -input appicon.png -macfilename darwin/icons.icns -windowsfilename windows/icons.ico + - wails3 generate icons -input appicon.png -macfilename darwin/icons.icns -windowsfilename windows/icon.ico dev:frontend: summary: Runs the frontend in development mode From a5eed9a48629305529725a45955f4f6916b63d6e Mon Sep 17 00:00:00 2001 From: robinsamuel Date: Sun, 9 Mar 2025 23:18:34 +0100 Subject: [PATCH 146/374] fix: remove prefix from default version in config.yml to avoid nsis error --- v3/internal/commands/build_assets/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v3/internal/commands/build_assets/config.yml b/v3/internal/commands/build_assets/config.yml index bc09a6d28..5451e31d5 100644 --- a/v3/internal/commands/build_assets/config.yml +++ b/v3/internal/commands/build_assets/config.yml @@ -11,7 +11,7 @@ info: description: "A program that does X" # The application description copyright: "(c) 2025, My Company" # Copyright text comments: "Some Product Comments" # Comments - version: "v0.0.1" # The application version + version: "0.0.1" # The application version # Dev mode configuration dev_mode: From 1a0096c1699eb6cb2cb3b793e7c21246e2d49693 Mon Sep 17 00:00:00 2001 From: robinsamuel Date: Sun, 9 Mar 2025 23:34:12 +0100 Subject: [PATCH 147/374] fix: update output paths for generated icons in Taskfile --- v3/internal/commands/build_assets/Taskfile.tmpl.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/v3/internal/commands/build_assets/Taskfile.tmpl.yml b/v3/internal/commands/build_assets/Taskfile.tmpl.yml index 0b7ff9c5b..34f0659e7 100644 --- a/v3/internal/commands/build_assets/Taskfile.tmpl.yml +++ b/v3/internal/commands/build_assets/Taskfile.tmpl.yml @@ -66,8 +66,8 @@ tasks: sources: - "appicon.png" generates: - - "icons.icns" - - "icon.ico" + - "darwin/icons.icns" + - "windows/icon.ico" cmds: - wails3 generate icons -input appicon.png -macfilename darwin/icons.icns -windowsfilename windows/icon.ico From d30652a6e6e3c9ea5784caea5386db97850f32d3 Mon Sep 17 00:00:00 2001 From: Ian VanSchooten Date: Mon, 10 Mar 2025 09:20:21 -0400 Subject: [PATCH 148/374] Update changelog --- docs/src/content/docs/changelog.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/src/content/docs/changelog.mdx b/docs/src/content/docs/changelog.mdx index f3f89a9af..404120fc2 100644 --- a/docs/src/content/docs/changelog.mdx +++ b/docs/src/content/docs/changelog.mdx @@ -108,6 +108,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 -  Ensure menu updates occur on the main thread by [@leaanthony](https://github.com/leaanthony) - The dragging and resizing mechanism is now more robust and matches expected platform behaviour more closely by [@fbbdev](https://github.com/fbbdev) in [#4100](https://github.com/wailsapp/wails/pull/4100) - Fixed [#4097](https://github.com/wailsapp/wails/issues/4097) Webpack/angular discards runtime init code by [@fbbdev](https://github.com/fbbdev) in [#4100](https://github.com/wailsapp/wails/pull/4100) +- Fixed initially-hidden menu items by [@IanVS](https://github.com/IanVS) in [#4116](https://github.com/wailsapp/wails/pull/4116) ### Changed From 1bb14e16a5596cc0325003c923882f15a94f1d3a Mon Sep 17 00:00:00 2001 From: robinsamuel Date: Mon, 10 Mar 2025 15:23:05 +0100 Subject: [PATCH 149/374] feat: update changelog --- docs/src/content/docs/changelog.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/src/content/docs/changelog.mdx b/docs/src/content/docs/changelog.mdx index b18c0bcd6..a64d2e718 100644 --- a/docs/src/content/docs/changelog.mdx +++ b/docs/src/content/docs/changelog.mdx @@ -108,6 +108,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - The dragging and resizing mechanism is now more robust and matches expected platform behaviour more closely by [@fbbdev](https://github.com/fbbdev) in [#4100](https://github.com/wailsapp/wails/pull/4100) - Fixed [#4097](https://github.com/wailsapp/wails/issues/4097) Webpack/angular discards runtime init code by [@fbbdev](https://github.com/fbbdev) in [#4100](https://github.com/wailsapp/wails/pull/4100) - Fixed assetFileServer not serving `.html` files when non-extension request when `[request]` doesn't exist but `[request].html` does +- Fixed icon generation paths by [@robin-samuel](https://github.com/robin-samuel) in [#4125](https://github.com/wailsapp/wails/pull/4125) ### Changed From d0d1691004e40e73dabbc4c93d06f0b5d00ca8ee Mon Sep 17 00:00:00 2001 From: robinsamuel Date: Mon, 10 Mar 2025 15:30:10 +0100 Subject: [PATCH 150/374] feat: update changelog --- docs/src/content/docs/changelog.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/src/content/docs/changelog.mdx b/docs/src/content/docs/changelog.mdx index b18c0bcd6..ad3a97459 100644 --- a/docs/src/content/docs/changelog.mdx +++ b/docs/src/content/docs/changelog.mdx @@ -108,6 +108,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - The dragging and resizing mechanism is now more robust and matches expected platform behaviour more closely by [@fbbdev](https://github.com/fbbdev) in [#4100](https://github.com/wailsapp/wails/pull/4100) - Fixed [#4097](https://github.com/wailsapp/wails/issues/4097) Webpack/angular discards runtime init code by [@fbbdev](https://github.com/fbbdev) in [#4100](https://github.com/wailsapp/wails/pull/4100) - Fixed assetFileServer not serving `.html` files when non-extension request when `[request]` doesn't exist but `[request].html` does +- Fixed NSIS Error because of incorrect prefix on default version in config by [@robin-samuel](https://github.com/robin-samuel) in [#4126](https://github.com/wailsapp/wails/pull/4126) ### Changed From b72782c35d929af104c4cd03c9fb2a3cdeb5bd58 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Sun, 9 Mar 2025 16:16:43 +1100 Subject: [PATCH 151/374] Update docs + examples. Serve runtime from assetserver if requested. --- .../docs/guides/{gin.mdx => gin-routing.mdx} | 172 +++++++- docs/src/content/docs/guides/gin-services.mdx | 409 ++++++++++++++++++ v3/examples/gin-example/main.go | 3 +- v3/examples/gin-example/static/index.html | 52 ++- v3/examples/gin-service/assets/index.html | 219 ++++++++++ v3/examples/gin-service/go.mod | 74 ++++ v3/examples/gin-service/go.sum | 208 +++++++++ v3/examples/gin-service/main.go | 45 ++ .../gin-service/services/gin_service.go | 220 ++++++++++ v3/pkg/application/application.go | 6 + 10 files changed, 1385 insertions(+), 23 deletions(-) rename docs/src/content/docs/guides/{gin.mdx => gin-routing.mdx} (68%) create mode 100644 docs/src/content/docs/guides/gin-services.mdx create mode 100644 v3/examples/gin-service/assets/index.html create mode 100644 v3/examples/gin-service/go.mod create mode 100644 v3/examples/gin-service/go.sum create mode 100644 v3/examples/gin-service/main.go create mode 100644 v3/examples/gin-service/services/gin_service.go diff --git a/docs/src/content/docs/guides/gin.mdx b/docs/src/content/docs/guides/gin-routing.mdx similarity index 68% rename from docs/src/content/docs/guides/gin.mdx rename to docs/src/content/docs/guides/gin-routing.mdx index 236996674..9d7c0da08 100644 --- a/docs/src/content/docs/guides/gin.mdx +++ b/docs/src/content/docs/guides/gin-routing.mdx @@ -30,19 +30,19 @@ go get -u github.com/gin-gonic/gin Create a middleware function that will handle the integration between Wails and Gin: ```go -// GinMiddleware creates a middleware that passes requests to Gin +// GinMiddleware creates a middleware that passes requests to Gin if they're not handled by Wails func GinMiddleware(ginEngine *gin.Engine) application.Middleware { - return func(next http.Handler) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - // Let Wails handle the `/wails` route - if r.URL.Path == "/wails" { - next.ServeHTTP(w, r) - return - } - // Let Gin handle everything - ginEngine.ServeHTTP(w, r) - }) - } + return func(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + // Let Wails handle the `/wails` route + if strings.HasPrefix(r.URL.Path, "/wails") { + next.ServeHTTP(w, r) + return + } + // Let Gin handle everything else + ginEngine.ServeHTTP(w, r) + }) + } } ``` @@ -207,6 +207,154 @@ ginEngine.GET("/api/search", func(c *gin.Context) { }) ``` +## Event Communication + +One of the powerful features of Wails is its event system, which allows for communication between the frontend and backend. When using Gin as a service, you can still leverage this event system by serving the Wails runtime.js file to your frontend. + +### Serving the Wails Runtime + +To enable event communication, you need to serve the Wails runtime.js file at the `/wails/runtime.js` path. Here's how to implement this in your Gin service: + +```go +import ( + "io" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/wailsapp/wails/v3/pkg/application" + "github.com/wailsapp/wails/v3/pkg/runtime" +) + +// GinService implements a Wails service that uses Gin for HTTP handling +type GinService struct { + ginEngine *gin.Engine + app *application.App + // Other fields... +} + +// ServeHTTP implements the http.Handler interface +func (s *GinService) ServeHTTP(w http.ResponseWriter, r *http.Request) { + // Special handling for Wails runtime.js + if r.URL.Path == "/wails/runtime.js" { + s.serveWailsRuntime(w, r) + return + } + + // All other requests go to the Gin router + s.ginEngine.ServeHTTP(w, r) +} + +// serveWailsRuntime serves the Wails runtime.js file +func (s *GinService) serveWailsRuntime(w http.ResponseWriter, r *http.Request) { + // Open the runtime.js file from the public runtime package + runtimeFile, err := runtime.Assets.Open(runtime.RuntimeJSPath) + if err != nil { + http.Error(w, "Failed to access runtime assets", http.StatusInternalServerError) + return + } + defer runtimeFile.Close() + + // Set the content type + w.Header().Set("Content-Type", "application/javascript") + + // Copy the file to the response + _, err = io.Copy(w, runtimeFile) + if err != nil { + http.Error(w, "Failed to serve runtime.js", http.StatusInternalServerError) + } +} +``` + +### Handling Events + +You'll also need to add an endpoint to handle events from the frontend. This endpoint will bridge the gap between the HTTP requests and the Wails event system: + +```go +// In your setupRoutes method +func (s *GinService) setupRoutes() { + // Event handling endpoint + s.ginEngine.POST("/events/emit", func(c *gin.Context) { + var eventData struct { + Name string `json:"name" binding:"required"` + Data interface{} `json:"data"` + } + + if err := c.ShouldBindJSON(&eventData); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + + // Process the event using the Wails event system + s.app.EmitEvent(eventData.Name, eventData.Data) + + c.JSON(http.StatusOK, gin.H{ + "success": true, + "message": "Event processed successfully", + }) + }) + + // Other routes... +} +``` + +### Using Events in the Frontend + +In your frontend HTML, include the Wails runtime.js script and use the event API: + +```html + + + + + + + +
    
    +    
    +    
    +
    +
    +```
    +
    +This approach allows you to use the Wails event system seamlessly with your Gin service, providing a consistent experience across your application.
    +
     ## Interacting with Wails
     
     Your Gin-served web content can interact with Wails features like events and bindings. To enable this interaction, you
    diff --git a/docs/src/content/docs/guides/gin-services.mdx b/docs/src/content/docs/guides/gin-services.mdx
    new file mode 100644
    index 000000000..55d713b45
    --- /dev/null
    +++ b/docs/src/content/docs/guides/gin-services.mdx
    @@ -0,0 +1,409 @@
    +---
    +title: Using Gin in Services
    +description: A guide to integrating the Gin web framework with Wails v3 Services
    +---
    +
    +Wails v3 Services provide a powerful way to organize your application logic into reusable, modular components. By implementing the `http.Handler` interface in your services, you can mount them at specific routes in your application, allowing for a clean separation of concerns and more maintainable code.
    +
    +Integrating Gin with Wails Services enables you to create modular, mountable HTTP APIs using Gin's powerful routing and middleware capabilities. You can organize your application into domain-specific services, mount multiple Gin-based services at different routes, leverage Gin's extensive feature set while maintaining the benefits of Wails Services, and seamlessly integrate with the Wails event system for real-time communication.
    +
    +## Creating a Gin-based Service
    +
    +To create a Wails Service that uses Gin for HTTP handling, you need to implement both the Wails Service interface and the `http.Handler` interface. This combination allows your service to be managed by the Wails application lifecycle and handle HTTP requests. Let's walk through each step of the process:
    +
    +### 1. Define Your Service Structure
    +
    +First, create a new service structure that will hold your Gin router and any state your service needs. This structure serves as the foundation of your service, encapsulating both the HTTP handling capabilities and any business logic or data your service requires. The use of a mutex ensures thread-safe access to shared resources, which is essential for concurrent request handling.
    +
    +```go
    +package services
    +
    +import (
    +	"context"
    +	"net/http"
    +	"sync"
    +	"time"
    +
    +	"github.com/gin-gonic/gin"
    +	"github.com/wailsapp/wails/v3/pkg/application"
    +)
    +
    +// User represents a user in the system
    +type User struct {
    +	ID        int       `json:"id"`
    +	Name      string    `json:"name"`
    +	Email     string    `json:"email"`
    +	CreatedAt time.Time `json:"createdAt"`
    +}
    +
    +// GinService implements a Wails service that uses Gin for HTTP handling
    +type GinService struct {
    +	ginEngine *gin.Engine
    +	users     []User
    +	nextID    int
    +	mu        sync.RWMutex
    +	app       *application.App
    +}
    +
    +// NewGinService creates a new GinService instance
    +func NewGinService() *GinService {
    +	// Create a new Gin router
    +	ginEngine := gin.New()
    +
    +	// Add middlewares
    +	ginEngine.Use(gin.Recovery())
    +	ginEngine.Use(LoggingMiddleware())
    +
    +	service := &GinService{
    +		ginEngine: ginEngine,
    +		users: []User{
    +			{ID: 1, Name: "Alice", Email: "alice@example.com", CreatedAt: time.Now().Add(-72 * time.Hour)},
    +			{ID: 2, Name: "Bob", Email: "bob@example.com", CreatedAt: time.Now().Add(-48 * time.Hour)},
    +			{ID: 3, Name: "Charlie", Email: "charlie@example.com", CreatedAt: time.Now().Add(-24 * time.Hour)},
    +		},
    +		nextID: 4,
    +	}
    +
    +	// Define routes
    +	service.setupRoutes()
    +
    +	return service
    +}
    +```
    +
    +### 2. Implement the Wails Service Interface
    +
    +Your service needs to implement the Wails Service interface with the required methods. The `ServiceName` method provides a human-readable identifier for your service. The `ServiceStartup` method is called when the service starts and gives you access to the Wails application instance, which you can use to register event handlers and access other Wails features. The `ServiceShutdown` method allows you to clean up resources when the service is shutting down.
    +
    +```go
    +// ServiceName returns the name of the service
    +func (s *GinService) ServiceName() string {
    +	return "Gin API Service"
    +}
    +
    +// ServiceStartup is called when the service starts
    +func (s *GinService) ServiceStartup(ctx context.Context, options application.ServiceOptions) error {
    +	// Store the application instance for later use
    +	s.app = application.Get()
    +
    +	// Register an event handler that can be triggered from the frontend
    +	s.app.OnEvent("gin-api-event", func(event *application.CustomEvent) {
    +		// Log the event data
    +		s.app.Logger.Info("Received event from frontend", "data", event.Data)
    +
    +		// Emit an event back to the frontend
    +		s.app.EmitEvent("gin-api-response", map[string]interface{}{
    +			"message": "Response from Gin API Service",
    +			"time":    time.Now().Format(time.RFC3339),
    +		})
    +	})
    +
    +	return nil
    +}
    +
    +// ServiceShutdown is called when the service shuts down
    +func (s *GinService) ServiceShutdown(ctx context.Context) error {
    +	// Clean up resources if needed
    +	return nil
    +}
    +```
    +
    +### 3. Implement the http.Handler Interface
    +
    +To make your service mountable at a specific route, implement the `http.Handler` interface. This single method, `ServeHTTP`, is the gateway for all HTTP requests to your service. It delegates the request handling to the Gin router, allowing you to use all of Gin's powerful features for routing and middleware.
    +
    +```go
    +// ServeHTTP implements the http.Handler interface
    +func (s *GinService) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    +	// All requests go to the Gin router
    +	s.ginEngine.ServeHTTP(w, r)
    +}
    +```
    +
    +### 4. Set Up Your Routes
    +
    +Define your API routes in a separate method for better organization. This approach keeps your code clean and makes it easier to understand the structure of your API. The Gin router provides a fluent API for defining routes, including support for route groups, which help organize related endpoints.
    +
    +```go
    +// setupRoutes configures the API routes
    +func (s *GinService) setupRoutes() {
    +	// Basic info endpoint
    +	s.ginEngine.GET("/info", func(c *gin.Context) {
    +		c.JSON(http.StatusOK, gin.H{
    +			"service": "Gin API Service",
    +			"version": "1.0.0",
    +			"time":    time.Now().Format(time.RFC3339),
    +		})
    +	})
    +
    +	// Users group
    +	users := s.ginEngine.Group("/users")
    +	{
    +		// Get all users
    +		users.GET("", func(c *gin.Context) {
    +			s.mu.RLock()
    +			defer s.mu.RUnlock()
    +			c.JSON(http.StatusOK, s.users)
    +		})
    +
    +		// Get user by ID
    +		users.GET("/:id", func(c *gin.Context) {
    +			id, err := strconv.Atoi(c.Param("id"))
    +			if err != nil {
    +				c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid user ID"})
    +				return
    +			}
    +
    +			s.mu.RLock()
    +			defer s.mu.RUnlock()
    +
    +			for _, user := range s.users {
    +				if user.ID == id {
    +					c.JSON(http.StatusOK, user)
    +					return
    +				}
    +			}
    +
    +			c.JSON(http.StatusNotFound, gin.H{"error": "User not found"})
    +		})
    +
    +		// Create a new user
    +		users.POST("", func(c *gin.Context) {
    +			var newUser User
    +			if err := c.ShouldBindJSON(&newUser); err != nil {
    +				c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
    +				return
    +			}
    +
    +			s.mu.Lock()
    +			defer s.mu.Unlock()
    +
    +			// Set the ID and creation time
    +			newUser.ID = s.nextID
    +			newUser.CreatedAt = time.Now()
    +			s.nextID++
    +
    +			// Add to the users slice
    +			s.users = append(s.users, newUser)
    +
    +			c.JSON(http.StatusCreated, newUser)
    +
    +			// Emit an event to notify about the new user
    +			s.app.EmitEvent("user-created", newUser)
    +		})
    +	}
    +}
    +```
    +
    +### 5. Create Custom Middleware
    +
    +You can create custom Gin middleware to enhance your service. Middleware functions in Gin are executed in the order they are added to the router and can perform tasks such as logging, authentication, and error handling. This example shows a simple logging middleware that records request details.
    +
    +```go
    +// LoggingMiddleware is a Gin middleware that logs request details
    +func LoggingMiddleware() gin.HandlerFunc {
    +	return func(c *gin.Context) {
    +		// Start timer
    +		start := time.Now()
    +
    +		// Process request
    +		c.Next()
    +
    +		// Calculate latency
    +		latency := time.Since(start)
    +
    +		// Log request details
    +		log.Printf("[GIN] %s %s %d %s", c.Request.Method, c.Request.URL.Path, c.Writer.Status(), latency)
    +	}
    +}
    +```
    +
    +## Registering Your Service
    +
    +To use your Gin-based service in a Wails application, you need to register it with the application and specify the route where it should be mounted. This is done when creating the Wails application instance. The route you specify becomes the base path for all endpoints defined in your Gin router.
    +
    +```go
    +app := application.New(application.Options{
    +    Name:        "Gin Service Demo",
    +    Description: "A demo of using Gin in Wails services",
    +    Mac: application.MacOptions{
    +        ApplicationShouldTerminateAfterLastWindowClosed: true,
    +    },
    +    LogLevel: slog.LevelDebug,
    +    Services: []application.Service{
    +        application.NewServiceWithOptions(services.NewGinService(), application.ServiceOptions{
    +            Route: "/api",
    +        }),
    +    },
    +    Assets: application.AssetOptions{
    +        Handler: application.BundledAssetFileServer(assets),
    +    },
    +})
    +```
    +
    +In this example, the Gin service is mounted at the `/api` route. This means that if your Gin router has an endpoint defined as `/info`, it will be accessible at `/api/info` in your application. This approach allows you to organize your API endpoints logically and avoid conflicts with other parts of your application.
    +
    +## Integrating with the Wails Event System
    +
    +One of the powerful features of using Gin with Wails Services is the ability to seamlessly integrate with the Wails event system. This allows for real-time communication between your backend service and the frontend.
    +
    +In your service's `ServiceStartup` method, you can register event handlers to process events from the frontend:
    +
    +```go
    +s.app.OnEvent("gin-api-event", func(event *application.CustomEvent) {
    +    // Log the event data
    +    s.app.Logger.Info("Received event from frontend", "data", event.Data)
    +
    +    // Emit an event back to the frontend
    +    s.app.EmitEvent("gin-api-response", map[string]interface{}{
    +        "message": "Response from Gin API Service",
    +        "time":    time.Now().Format(time.RFC3339),
    +    })
    +})
    +```
    +
    +You can also emit events to the frontend from your Gin routes or other parts of your service:
    +
    +```go
    +// After creating a new user
    +s.app.EmitEvent("user-created", newUser)
    +```
    +
    +## Frontend Integration
    +
    +To interact with your Gin service from the frontend, you'll need to import the Wails runtime, make HTTP requests to your API endpoints, and use the Wails event system for real-time communication.
    +
    +For production use, it's recommended to use the `@wailsio/runtime` package instead of directly importing `/wails/runtime.js`. This ensures type safety, better IDE support, version management through npm, and compatibility with modern JavaScript tooling.
    +
    +Install the package:
    +```bash
    +npm install @wailsio/runtime
    +```
    +
    +Then use it in your code:
    +```javascript
    +import * as wails from '@wailsio/runtime';
    +
    +// Event emission
    +wails.Events.Emit({name: 'gin-api-event', data: eventData});
    +```
    +
    +Here's an example of how to set up frontend integration:
    +
    +```html
    +
    +
    +
    +    
    +    
    +    Gin Service Example
    +    
    +
    +
    +    

    Gin Service Example

    + +
    +

    API Endpoints

    +

    Try the Gin API endpoints mounted at /api:

    + + + + + + +
    +
    Results will appear here...
    +
    +
    + +
    +

    Event Communication

    +

    Trigger an event to communicate with the Gin service:

    + + + +
    +
    Event responses will appear here...
    +
    +
    + + + + + + +``` + +## Best Practices + +When using Gin with Wails Services, consider these best practices for creating maintainable and efficient applications: + +- Modular Design: Organize your API endpoints into logical groups using Gin's router groups. This makes your code more readable and easier to maintain. + +- Concurrency Safety: Use mutexes or other synchronization primitives when accessing shared state. This prevents race conditions and ensures data integrity. + +- Error Handling: Implement consistent error handling across your API endpoints. This provides a better user experience and makes debugging easier. + +- Logging: Use the Wails logger for consistent logging throughout your application. This helps with debugging and monitoring. + +- Event-Driven Communication: Use the Wails event system for real-time updates and notifications. This creates a more responsive and interactive user experience. + +- Security: Implement proper authentication and authorization for your API endpoints. This protects your application and user data. + +## Closing Thoughts + +Integrating the Gin web framework with Wails v3 Services provides a powerful and flexible approach to building modular, maintainable web applications. By leveraging Gin's routing and middleware capabilities alongside the Wails event system, you can create rich, interactive applications with clean separation of concerns. + +The complete example code for this guide can be found in the Wails repository under `v3/examples/gin-service`. diff --git a/v3/examples/gin-example/main.go b/v3/examples/gin-example/main.go index 6a4d0b00d..d3992cdb1 100644 --- a/v3/examples/gin-example/main.go +++ b/v3/examples/gin-example/main.go @@ -4,6 +4,7 @@ import ( "embed" "log" "net/http" + "strings" "time" "github.com/gin-gonic/gin" @@ -18,7 +19,7 @@ func GinMiddleware(ginEngine *gin.Engine) application.Middleware { return func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // Let Wails handle the `/wails` route - if r.URL.Path == "/wails" { + if strings.HasPrefix(r.URL.Path, "/wails") { next.ServeHTTP(w, r) return } diff --git a/v3/examples/gin-example/static/index.html b/v3/examples/gin-example/static/index.html index 982717e1a..df02b840f 100644 --- a/v3/examples/gin-example/static/index.html +++ b/v3/examples/gin-example/static/index.html @@ -41,6 +41,13 @@

    Wails + Gin Integration

    +
    +

    Hello World!

    +

    This page is being served by Gin.

    +

    Click the button below to trigger a Wails event:

    + + +

    API Example

    Try the Gin API endpoint:

    @@ -48,17 +55,42 @@
    - diff --git a/v3/examples/gin-service/assets/index.html b/v3/examples/gin-service/assets/index.html new file mode 100644 index 000000000..40dccf552 --- /dev/null +++ b/v3/examples/gin-service/assets/index.html @@ -0,0 +1,219 @@ + + + + + + Gin Service Example + + + +

    Gin Service Example

    + +
    +

    API Endpoints

    +

    Try the Gin API endpoints mounted at /api:

    + + + + + + +
    +
    Results will appear here...
    +
    +
    + +
    +

    Event Communication

    +

    Trigger an event to communicate with the Gin service:

    + + + +
    +
    Event responses will appear here...
    +
    +
    + + + + + + diff --git a/v3/examples/gin-service/go.mod b/v3/examples/gin-service/go.mod new file mode 100644 index 000000000..be466601b --- /dev/null +++ b/v3/examples/gin-service/go.mod @@ -0,0 +1,74 @@ +module gin-service + +go 1.24.0 + +require ( + github.com/gin-gonic/gin v1.10.0 + github.com/wailsapp/wails/v3 v3.0.0-alpha.9 +) + +require ( + dario.cat/mergo v1.0.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/ProtonMail/go-crypto v1.1.5 // indirect + github.com/adrg/xdg v0.5.3 // indirect + github.com/bep/debounce v1.2.1 // indirect + github.com/bytedance/sonic v1.11.6 // indirect + github.com/bytedance/sonic/loader v0.1.1 // indirect + github.com/cloudflare/circl v1.6.0 // indirect + github.com/cloudwego/base64x v0.1.4 // indirect + github.com/cloudwego/iasm v0.2.0 // indirect + github.com/cyphar/filepath-securejoin v0.4.1 // indirect + github.com/ebitengine/purego v0.8.2 // indirect + github.com/emirpasic/gods v1.18.1 // indirect + github.com/gabriel-vasile/mimetype v1.4.3 // indirect + github.com/gin-contrib/sse v0.1.0 // indirect + github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect + github.com/go-git/go-billy/v5 v5.6.2 // indirect + github.com/go-git/go-git/v5 v5.13.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-playground/locales v0.14.1 // indirect + github.com/go-playground/universal-translator v0.18.1 // indirect + github.com/go-playground/validator/v10 v10.20.0 // indirect + github.com/goccy/go-json v0.10.2 // indirect + github.com/godbus/dbus/v5 v5.1.0 // indirect + github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect + github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/kevinburke/ssh_config v1.2.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.9 // indirect + github.com/leaanthony/go-ansi-parser v1.6.1 // indirect + github.com/leaanthony/u v1.1.1 // indirect + github.com/leodido/go-urn v1.4.0 // indirect + github.com/lmittmann/tint v1.0.7 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/pelletier/go-toml/v2 v2.2.2 // indirect + github.com/pjbgf/sha1cd v0.3.2 // indirect + github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/rivo/uniseg v0.4.7 // indirect + github.com/samber/lo v1.49.1 // indirect + github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect + github.com/skeema/knownhosts v1.3.1 // indirect + github.com/twitchyliquid64/golang-asm v0.15.1 // indirect + github.com/ugorji/go/codec v1.2.12 // indirect + github.com/wailsapp/go-webview2 v1.0.19 // indirect + github.com/wailsapp/mimetype v1.4.1 // indirect + github.com/xanzy/ssh-agent v0.3.3 // indirect + golang.org/x/arch v0.8.0 // indirect + golang.org/x/crypto v0.33.0 // indirect + golang.org/x/net v0.35.0 // indirect + golang.org/x/sys v0.30.0 // indirect + golang.org/x/text v0.22.0 // indirect + google.golang.org/protobuf v1.34.1 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/warnings.v0 v0.1.2 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/wailsapp/wails/v3 v3.0.0-alpha.9 => ../.. diff --git a/v3/examples/gin-service/go.sum b/v3/examples/gin-service/go.sum new file mode 100644 index 000000000..5615e40c4 --- /dev/null +++ b/v3/examples/gin-service/go.sum @@ -0,0 +1,208 @@ +dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s= +dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= +github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/ProtonMail/go-crypto v1.1.5 h1:eoAQfK2dwL+tFSFpr7TbOaPNUbPiJj4fLYwwGE1FQO4= +github.com/ProtonMail/go-crypto v1.1.5/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE= +github.com/adrg/xdg v0.5.3 h1:xRnxJXne7+oWDatRhR1JLnvuccuIeCoBu2rtuLqQB78= +github.com/adrg/xdg v0.5.3/go.mod h1:nlTsY+NNiCBGCK2tpm09vRqfVzrc2fLmXGpBLF0zlTQ= +github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= +github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= +github.com/bep/debounce v1.2.1 h1:v67fRdBA9UQu2NhLFXrSg0Brw7CexQekrBwDMM8bzeY= +github.com/bep/debounce v1.2.1/go.mod h1:H8yggRPQKLUhUoqrJC1bO2xNya7vanpDl7xR3ISbCJ0= +github.com/bytedance/sonic v1.11.6 h1:oUp34TzMlL+OY1OUWxHqsdkgC/Zfc85zGqw9siXjrc0= +github.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4= +github.com/bytedance/sonic/loader v0.1.1 h1:c+e5Pt1k/cy5wMveRDyk2X4B9hF4g7an8N3zCYjJFNM= +github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= +github.com/cloudflare/circl v1.6.0 h1:cr5JKic4HI+LkINy2lg3W2jF8sHCVTBncJr5gIIq7qk= +github.com/cloudflare/circl v1.6.0/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs= +github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y= +github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= +github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg= +github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= +github.com/cyphar/filepath-securejoin v0.4.1 h1:JyxxyPEaktOD+GAnqIqTf9A8tHyAG22rowi7HkoSU1s= +github.com/cyphar/filepath-securejoin v0.4.1/go.mod h1:Sdj7gXlvMcPZsbhwhQ33GguGLDGQL7h7bg04C/+u9jI= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/ebitengine/purego v0.8.2 h1:jPPGWs2sZ1UgOSgD2bClL0MJIqu58nOmIcBuXr62z1I= +github.com/ebitengine/purego v0.8.2/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/elazarl/goproxy v1.4.0 h1:4GyuSbFa+s26+3rmYNSuUVsx+HgPrV1bk1jXI0l9wjM= +github.com/elazarl/goproxy v1.4.0/go.mod h1:X/5W/t+gzDyLfHW4DrMdpjqYjpXsURlBt9lpBDxZZZQ= +github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= +github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= +github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= +github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU= +github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y= +github.com/gliderlabs/ssh v0.3.8 h1:a4YXD1V7xMF9g5nTkdfnja3Sxy1PVDCj1Zg4Wb8vY6c= +github.com/gliderlabs/ssh v0.3.8/go.mod h1:xYoytBv1sV0aL3CavoDuJIQNURXkkfPA/wxQ1pL1fAU= +github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= +github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= +github.com/go-git/go-billy/v5 v5.6.2 h1:6Q86EsPXMa7c3YZ3aLAQsMA0VlWmy43r6FHqa/UNbRM= +github.com/go-git/go-billy/v5 v5.6.2/go.mod h1:rcFC2rAsp/erv7CMz9GczHcuD0D32fWzH+MJAU+jaUU= +github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= +github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= +github.com/go-git/go-git/v5 v5.13.2 h1:7O7xvsK7K+rZPKW6AQR1YyNhfywkv7B8/FsP3ki6Zv0= +github.com/go-git/go-git/v5 v5.13.2/go.mod h1:hWdW5P4YZRjmpGHwRH2v3zkWcNl6HeXaXQEMGb3NJ9A= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.20.0 h1:K9ISHbSaI0lyB2eWMPJo+kOS/FBExVwjEviJTixqxL8= +github.com/go-playground/validator/v10 v10.20.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= +github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= +github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= +github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ= +github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= +github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e h1:Q3+PugElBCf4PFpxhErSzU3/PY5sFL5Z6rfv4AbGAck= +github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e/go.mod h1:alcuEEnZsY1WQsagKhZDsoPCRoOijYqhZvPwLG0kzVs= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= +github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY= +github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8= +github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/leaanthony/go-ansi-parser v1.6.1 h1:xd8bzARK3dErqkPFtoF9F3/HgN8UQk0ed1YDKpEz01A= +github.com/leaanthony/go-ansi-parser v1.6.1/go.mod h1:+vva/2y4alzVmmIEpk9QDhA7vLC5zKDTRwfZGOp3IWU= +github.com/leaanthony/u v1.1.1 h1:TUFjwDGlNX+WuwVEzDqQwC2lOv0P4uhTQw7CMFdiK7M= +github.com/leaanthony/u v1.1.1/go.mod h1:9+o6hejoRljvZ3BzdYlVL0JYCwtnAsVuN9pVTQcaRfI= +github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= +github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= +github.com/lmittmann/tint v1.0.7 h1:D/0OqWZ0YOGZ6AyC+5Y2kD8PBEzBk6rFHVSfOqCkF9Y= +github.com/lmittmann/tint v1.0.7/go.mod h1:HIS3gSy7qNwGCj+5oRjAutErFBl4BzdQP6cJZ0NfMwE= +github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= +github.com/matryer/is v1.4.1 h1:55ehd8zaGABKLXQUe2awZ99BD/PTc2ls+KV/dXphgEQ= +github.com/matryer/is v1.4.1/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k= +github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY= +github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= +github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= +github.com/pjbgf/sha1cd v0.3.2 h1:a9wb0bp1oC2TGwStyn0Umc/IGKQnEgF0vVaZ8QF8eo4= +github.com/pjbgf/sha1cd v0.3.2/go.mod h1:zQWigSxVmsHEZow5qaLtPYxpcKMMQpa09ixqBxuCS6A= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/samber/lo v1.49.1 h1:4BIFyVfuQSEpluc7Fua+j1NolZHiEHEpaSEKdsH0tew= +github.com/samber/lo v1.49.1/go.mod h1:dO6KHFzUKXgP8LDhU0oI8d2hekjXnGOu0DB8Jecxd6o= +github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= +github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/skeema/knownhosts v1.3.1 h1:X2osQ+RAjK76shCbvhHHHVl3ZlgDm8apHEHFqRjnBY8= +github.com/skeema/knownhosts v1.3.1/go.mod h1:r7KTdC8l4uxWRyK2TpQZ/1o5HaSzh06ePQNxPwTcfiY= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= +github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= +github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +github.com/wailsapp/go-webview2 v1.0.19 h1:7U3QcDj1PrBPaxJNCui2k1SkWml+Q5kvFUFyTImA6NU= +github.com/wailsapp/go-webview2 v1.0.19/go.mod h1:qJmWAmAmaniuKGZPWwne+uor3AHMB5PFhqiK0Bbj8kc= +github.com/wailsapp/mimetype v1.4.1 h1:pQN9ycO7uo4vsUUuPeHEYoUkLVkaRntMnHJxVwYhwHs= +github.com/wailsapp/mimetype v1.4.1/go.mod h1:9aV5k31bBOv5z6u+QP8TltzvNGJPmNJD4XlAL3U+j3o= +github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= +github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= +golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/arch v0.8.0 h1:3wRIsP3pM4yUptoR96otTUOXI367OS0+c9eeRi9doIc= +golang.org/x/arch v0.8.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= +golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.33.0 h1:IOBPskki6Lysi0lo9qQvbxiQ+FvsCC/YWOecCHAixus= +golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M= +golang.org/x/exp v0.0.0-20250210185358-939b2ce775ac h1:l5+whBCLH3iH2ZNHYLbAe58bo7yrN4mVcnkHDYz5vvs= +golang.org/x/exp v0.0.0-20250210185358-939b2ce775ac/go.mod h1:hH+7mtFmImwwcMvScyxUhjuVHR3HGaDPMn9rMSUUbxo= +golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8= +golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200810151505-1b9f1253b3ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= +golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.29.0 h1:L6pJp37ocefwRRtYPKSWOWzOtWSxVajvz2ldH/xi3iU= +golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= +google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= diff --git a/v3/examples/gin-service/main.go b/v3/examples/gin-service/main.go new file mode 100644 index 000000000..b27b1903b --- /dev/null +++ b/v3/examples/gin-service/main.go @@ -0,0 +1,45 @@ +package main + +import ( + "embed" + "log/slog" + "os" + + "gin-service/services" + "github.com/wailsapp/wails/v3/pkg/application" +) + +//go:embed assets/* +var assets embed.FS + +func main() { + app := application.New(application.Options{ + Name: "Gin Service Demo", + Description: "A demo of using Gin in Wails services", + Mac: application.MacOptions{ + ApplicationShouldTerminateAfterLastWindowClosed: true, + }, + LogLevel: slog.LevelDebug, + Services: []application.Service{ + application.NewServiceWithOptions(services.NewGinService(), application.ServiceOptions{ + Route: "/api", + }), + }, + Assets: application.AssetOptions{ + Handler: application.BundledAssetFileServer(assets), + }, + }) + + app.NewWebviewWindowWithOptions(application.WebviewWindowOptions{ + Title: "Gin Service Demo", + Width: 1024, + Height: 768, + }) + + err := app.Run() + + if err != nil { + println(err.Error()) + os.Exit(1) + } +} diff --git a/v3/examples/gin-service/services/gin_service.go b/v3/examples/gin-service/services/gin_service.go new file mode 100644 index 000000000..6c3ef9f70 --- /dev/null +++ b/v3/examples/gin-service/services/gin_service.go @@ -0,0 +1,220 @@ +package services + +import ( + "context" + "net/http" + "strconv" + "sync" + "time" + + "github.com/gin-gonic/gin" + "github.com/wailsapp/wails/v3/pkg/application" +) + +// User represents a user in the system +type User struct { + ID int `json:"id"` + Name string `json:"name"` + Email string `json:"email"` + CreatedAt time.Time `json:"createdAt"` +} + +// GinService implements a Wails service that uses Gin for HTTP handling +type GinService struct { + ginEngine *gin.Engine + users []User + nextID int + mu sync.RWMutex + app *application.App +} + +type EventData struct { + Message string `json:"message"` + Timestamp string `json:"timestamp"` +} + +// NewGinService creates a new GinService instance +func NewGinService() *GinService { + // Create a new Gin router + ginEngine := gin.New() + + // Add middlewares + ginEngine.Use(gin.Recovery()) + ginEngine.Use(LoggingMiddleware()) + + service := &GinService{ + ginEngine: ginEngine, + users: []User{ + {ID: 1, Name: "Alice", Email: "alice@example.com", CreatedAt: time.Now().Add(-72 * time.Hour)}, + {ID: 2, Name: "Bob", Email: "bob@example.com", CreatedAt: time.Now().Add(-48 * time.Hour)}, + {ID: 3, Name: "Charlie", Email: "charlie@example.com", CreatedAt: time.Now().Add(-24 * time.Hour)}, + }, + nextID: 4, + } + + // Define routes + service.setupRoutes() + + return service +} + +// ServiceName returns the name of the service +func (s *GinService) ServiceName() string { + return "Gin API Service" +} + +// ServiceStartup is called when the service starts +func (s *GinService) ServiceStartup(ctx context.Context, options application.ServiceOptions) error { + // You can access the application instance via ctx + s.app = application.Get() + + // Register an event handler that can be triggered from the frontend + s.app.OnEvent("gin-api-event", func(event *application.CustomEvent) { + // Log the event data + // Parse the event data + s.app.Logger.Info("Received event from frontend", "data", event.Data) + + // You could also emit an event back to the frontend + s.app.EmitEvent("gin-api-response", map[string]interface{}{ + "message": "Response from Gin API Service", + "time": time.Now().Format(time.RFC3339), + }) + }) + + return nil +} + +// ServiceShutdown is called when the service shuts down +func (s *GinService) ServiceShutdown(ctx context.Context) error { + return nil +} + +// ServeHTTP implements the http.Handler interface +func (s *GinService) ServeHTTP(w http.ResponseWriter, r *http.Request) { + // All other requests go to the Gin router + s.ginEngine.ServeHTTP(w, r) +} + +// setupRoutes configures the API routes +func (s *GinService) setupRoutes() { + // Basic info endpoint + s.ginEngine.GET("/info", func(c *gin.Context) { + c.JSON(http.StatusOK, gin.H{ + "service": "Gin API Service", + "version": "1.0.0", + "time": time.Now().Format(time.RFC3339), + }) + }) + + // Users group + users := s.ginEngine.Group("/users") + { + // Get all users + users.GET("", func(c *gin.Context) { + s.mu.RLock() + defer s.mu.RUnlock() + c.JSON(http.StatusOK, s.users) + }) + + // Get user by ID + users.GET("/:id", func(c *gin.Context) { + id, err := strconv.Atoi(c.Param("id")) + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid user ID"}) + return + } + + s.mu.RLock() + defer s.mu.RUnlock() + + for _, user := range s.users { + if user.ID == id { + c.JSON(http.StatusOK, user) + return + } + } + + c.JSON(http.StatusNotFound, gin.H{"error": "User not found"}) + }) + + // Create a new user + users.POST("", func(c *gin.Context) { + var newUser User + if err := c.ShouldBindJSON(&newUser); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + + s.mu.Lock() + defer s.mu.Unlock() + + // Set the ID and creation time + newUser.ID = s.nextID + newUser.CreatedAt = time.Now() + s.nextID++ + + // Add to the users slice + s.users = append(s.users, newUser) + + c.JSON(http.StatusCreated, newUser) + + // Emit an event to notify about the new user + s.app.EmitEvent("user-created", newUser) + }) + + // Delete a user + users.DELETE("/:id", func(c *gin.Context) { + id, err := strconv.Atoi(c.Param("id")) + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid user ID"}) + return + } + + s.mu.Lock() + defer s.mu.Unlock() + + for i, user := range s.users { + if user.ID == id { + // Remove the user from the slice + s.users = append(s.users[:i], s.users[i+1:]...) + c.JSON(http.StatusOK, gin.H{"message": "User deleted"}) + return + } + } + + c.JSON(http.StatusNotFound, gin.H{"error": "User not found"}) + }) + } +} + +// LoggingMiddleware is a Gin middleware that logs request details +func LoggingMiddleware() gin.HandlerFunc { + return func(c *gin.Context) { + // Start timer + start := time.Now() + + // Process request + c.Next() + + // Calculate latency + latency := time.Since(start) + + // Log request details + statusCode := c.Writer.Status() + clientIP := c.ClientIP() + method := c.Request.Method + path := c.Request.URL.Path + + // Get the application instance + app := application.Get() + if app != nil { + app.Logger.Info("HTTP Request", + "status", statusCode, + "method", method, + "path", path, + "ip", clientIP, + "latency", latency, + ) + } + } +} diff --git a/v3/pkg/application/application.go b/v3/pkg/application/application.go index 21c0792cc..6650106c8 100644 --- a/v3/pkg/application/application.go +++ b/v3/pkg/application/application.go @@ -6,6 +6,7 @@ import ( "encoding/json" "errors" "fmt" + "github.com/wailsapp/wails/v3/internal/assetserver/bundledassets" "io" "log/slog" "net/http" @@ -98,6 +99,11 @@ func New(appOptions Options) *App { return http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { path := req.URL.Path switch path { + case "/wails/runtime.js": + err := assetserver.ServeFile(rw, path, bundledassets.RuntimeJS) + if err != nil { + result.fatal("unable to serve runtime.js: %w", err) + } case "/wails/runtime": messageProc.ServeHTTP(rw, req) case "/wails/capabilities": From da99ea47b00b1899d736262c467c49d3e14757bd Mon Sep 17 00:00:00 2001 From: Jason Kulatunga Date: Sat, 15 Jun 2024 07:56:55 +1000 Subject: [PATCH 152/374] Update docs + examples. Serve runtime from assetserver if requested. Add gin guide, fix asset server merge, add gin example adding http.CloseNotifier and http.Flusher interface to assetserver.contentTypeSniffer, for Gin (and other framework) compatibility. --- docs/src/content/docs/guides/gin-routing.mdx | 2 +- docs/src/content/docs/guides/gin-services.mdx | 209 +++++++++++++++--- v3/examples/events/assets/index.html | 2 +- v3/examples/gin-routing/README.md | 26 +++ v3/examples/gin-routing/go.mod | 72 ++++++ v3/examples/gin-routing/go.sum | 203 +++++++++++++++++ v3/examples/gin-routing/main.go | 114 ++++++++++ v3/examples/gin-routing/static/index.html | 94 ++++++++ v3/examples/gin-service/README.md | 26 +++ v3/examples/gin-service/assets/index.html | 30 +++ .../bundledassets/runtime.debug.js | 10 +- .../assetserver/bundledassets/runtime.js | 2 +- .../desktop/@wailsio/runtime/src/events.ts | 18 +- 13 files changed, 767 insertions(+), 41 deletions(-) create mode 100644 v3/examples/gin-routing/README.md create mode 100644 v3/examples/gin-routing/go.mod create mode 100644 v3/examples/gin-routing/go.sum create mode 100644 v3/examples/gin-routing/main.go create mode 100644 v3/examples/gin-routing/static/index.html create mode 100644 v3/examples/gin-service/README.md diff --git a/docs/src/content/docs/guides/gin-routing.mdx b/docs/src/content/docs/guides/gin-routing.mdx index 9d7c0da08..b9f59cb77 100644 --- a/docs/src/content/docs/guides/gin-routing.mdx +++ b/docs/src/content/docs/guides/gin-routing.mdx @@ -1,5 +1,5 @@ --- -title: Using Gin with Wails +title: Using Gin for Routing description: A comprehensive guide to integrating Gin web framework with Wails v3 applications --- diff --git a/docs/src/content/docs/guides/gin-services.mdx b/docs/src/content/docs/guides/gin-services.mdx index 55d713b45..73c56afba 100644 --- a/docs/src/content/docs/guides/gin-services.mdx +++ b/docs/src/content/docs/guides/gin-services.mdx @@ -1,19 +1,41 @@ --- -title: Using Gin in Services +title: Using Gin for Services description: A guide to integrating the Gin web framework with Wails v3 Services --- -Wails v3 Services provide a powerful way to organize your application logic into reusable, modular components. By implementing the `http.Handler` interface in your services, you can mount them at specific routes in your application, allowing for a clean separation of concerns and more maintainable code. +# Using Gin for Services -Integrating Gin with Wails Services enables you to create modular, mountable HTTP APIs using Gin's powerful routing and middleware capabilities. You can organize your application into domain-specific services, mount multiple Gin-based services at different routes, leverage Gin's extensive feature set while maintaining the benefits of Wails Services, and seamlessly integrate with the Wails event system for real-time communication. +The Gin web framework is a popular choice for building HTTP services in Go. With Wails v3, you can easily integrate Gin-based services into your application, providing a powerful way to handle HTTP requests, implement RESTful APIs, and serve web content. -## Creating a Gin-based Service +This guide will walk you through creating a Gin-based service that can be mounted at a specific route in your Wails application. We'll build a complete example that demonstrates how to: -To create a Wails Service that uses Gin for HTTP handling, you need to implement both the Wails Service interface and the `http.Handler` interface. This combination allows your service to be managed by the Wails application lifecycle and handle HTTP requests. Let's walk through each step of the process: +1. Create a Gin-based service +2. Implement the Wails Service interface +3. Set up routes and middleware +4. Integrate with the Wails event system +5. Interact with the service from the frontend -### 1. Define Your Service Structure +## Prerequisites -First, create a new service structure that will hold your Gin router and any state your service needs. This structure serves as the foundation of your service, encapsulating both the HTTP handling capabilities and any business logic or data your service requires. The use of a mutex ensures thread-safe access to shared resources, which is essential for concurrent request handling. +Before you begin, make sure you have: + +- Wails v3 installed +- Basic knowledge of Go and the Gin framework +- Familiarity with HTTP concepts and RESTful APIs + +You'll need to add the Gin framework to your project: + +```bash +go get github.com/gin-gonic/gin +``` + +## Creating a Gin-Based Service + +Let's start by creating a Gin service that implements the Wails Service interface. Our service will manage a collection of users and provide API endpoints for retrieving and creating user records. + +### 1. Define Your Data Models + +First, define the data structures your service will work with: ```go package services @@ -21,6 +43,7 @@ package services import ( "context" "net/http" + "strconv" "sync" "time" @@ -36,6 +59,18 @@ type User struct { CreatedAt time.Time `json:"createdAt"` } +// EventData represents data sent in events +type EventData struct { + Message string `json:"message"` + Timestamp string `json:"timestamp"` +} +``` + +### 2. Create Your Service Structure + +Next, define the service structure that will hold your Gin router and any state your service needs to maintain: + +```go // GinService implements a Wails service that uses Gin for HTTP handling type GinService struct { ginEngine *gin.Engine @@ -71,9 +106,9 @@ func NewGinService() *GinService { } ``` -### 2. Implement the Wails Service Interface +### 3. Implement the Service Interface -Your service needs to implement the Wails Service interface with the required methods. The `ServiceName` method provides a human-readable identifier for your service. The `ServiceStartup` method is called when the service starts and gives you access to the Wails application instance, which you can use to register event handlers and access other Wails features. The `ServiceShutdown` method allows you to clean up resources when the service is shutting down. +Implement the required methods for the Wails Service interface: ```go // ServiceName returns the name of the service @@ -122,7 +157,7 @@ func (s *GinService) ServeHTTP(w http.ResponseWriter, r *http.Request) { ### 4. Set Up Your Routes -Define your API routes in a separate method for better organization. This approach keeps your code clean and makes it easier to understand the structure of your API. The Gin router provides a fluent API for defining routes, including support for route groups, which help organize related endpoints. +Define your API routes in a separate method for better organisation. This approach keeps your code clean and makes it easier to understand the structure of your API. The Gin router provides a fluent API for defining routes, including support for route groups, which help organise related endpoints. ```go // setupRoutes configures the API routes @@ -191,6 +226,29 @@ func (s *GinService) setupRoutes() { // Emit an event to notify about the new user s.app.EmitEvent("user-created", newUser) }) + + // Delete a user + users.DELETE("/:id", func(c *gin.Context) { + id, err := strconv.Atoi(c.Param("id")) + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid user ID"}) + return + } + + s.mu.Lock() + defer s.mu.Unlock() + + for i, user := range s.users { + if user.ID == id { + // Remove the user from the slice + s.users = append(s.users[:i], s.users[i+1:]...) + c.JSON(http.StatusOK, gin.H{"message": "User deleted"}) + return + } + } + + c.JSON(http.StatusNotFound, gin.H{"error": "User not found"}) + }) } } ``` @@ -241,7 +299,7 @@ app := application.New(application.Options{ }) ``` -In this example, the Gin service is mounted at the `/api` route. This means that if your Gin router has an endpoint defined as `/info`, it will be accessible at `/api/info` in your application. This approach allows you to organize your API endpoints logically and avoid conflicts with other parts of your application. +In this example, the Gin service is mounted at the `/api` route. This means that if your Gin router has an endpoint defined as `/info`, it will be accessible at `/api/info` in your application. This approach allows you to organise your API endpoints logically and avoid conflicts with other parts of your application. ## Integrating with the Wails Event System @@ -285,7 +343,7 @@ Then use it in your code: import * as wails from '@wailsio/runtime'; // Event emission -wails.Events.Emit({name: 'gin-api-event', data: eventData}); +wails.Events.Emit('gin-api-event', eventData); ``` Here's an example of how to set up frontend integration: @@ -310,7 +368,8 @@ Here's an example of how to set up frontend integration: - + +
    Results will appear here...
    @@ -327,8 +386,23 @@ Here's an example of how to set up frontend integration: - - + + + + diff --git a/v3/examples/gin-service/README.md b/v3/examples/gin-service/README.md new file mode 100644 index 000000000..ed9c2b908 --- /dev/null +++ b/v3/examples/gin-service/README.md @@ -0,0 +1,26 @@ +# Gin Service Example + +This example demonstrates how to use the [Gin web framework](https://github.com/gin-gonic/gin) in a Wails Service. + +## Overview + +This example shows how to: + +- Set up Gin as the asset handler for a Wails application +- Create a middleware that routes requests between Wails and Gin +- Define API endpoints with Gin +- Communicate between the Gin-served frontend and Wails backend +- Implement custom Gin middleware + +## Running the Example + +```bash +cd v3/examples/gin-routing +go mod tidy +go run . +``` + +## Documentation + +Please consult the [Using Gin for Routing](https://v3.wails.io/guides/gin-routing/) guide for a detailed explanation of the example. + diff --git a/v3/examples/gin-service/assets/index.html b/v3/examples/gin-service/assets/index.html index 40dccf552..34324b89f 100644 --- a/v3/examples/gin-service/assets/index.html +++ b/v3/examples/gin-service/assets/index.html @@ -73,6 +73,7 @@ +
    Results will appear here...
    @@ -188,6 +189,27 @@ } }); + document.getElementById('deleteUser').addEventListener('click', async () => { + const userId = prompt('Enter user ID to delete:'); + if (userId) { + try { + await fetchAPI(`/users/${userId}`, { + method: 'DELETE' + }); + + // Show success message + document.getElementById('apiResponse').textContent = JSON.stringify({ + message: `User with ID ${userId} deleted successfully` + }, null, 2); + + // Refresh the user list + setTimeout(() => fetchAPI('/users'), 1000); + } catch (error) { + console.error('Error deleting user:', error); + } + } + }); + // Using Wails Events API for event communication document.getElementById('triggerEvent').addEventListener('click', async () => { // Display the event being sent @@ -211,6 +233,14 @@ document.getElementById('eventResponse').textContent = JSON.stringify(data, null, 2); }); + // Also listen for user-created events + wails.Events.On("user-created", (data) => { + document.getElementById('eventResponse').textContent = JSON.stringify({ + event: "user-created", + user: data + }, null, 2); + }); + // Initial API call to get service info fetchAPI('/info'); }); diff --git a/v3/internal/assetserver/bundledassets/runtime.debug.js b/v3/internal/assetserver/bundledassets/runtime.debug.js index fc1340c40..c4976e7f6 100644 --- a/v3/internal/assetserver/bundledassets/runtime.debug.js +++ b/v3/internal/assetserver/bundledassets/runtime.debug.js @@ -512,7 +512,13 @@ function Off(...eventNames) { function OffAll() { eventListeners.clear(); } -function Emit(event) { +function Emit(name, data) { + let event; + if (typeof name === "object" && name !== null && "name" in name && "data" in name) { + event = new WailsEvent(name["name"], name["data"]); + } else { + event = new WailsEvent(name, data); + } return call3(EmitMethod, event); } @@ -2507,4 +2513,4 @@ export { wml_exports as WML, window_default as Window }; -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2luZGV4LnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy93bWwudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2Jyb3dzZXIudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL25hbm9pZC50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvcnVudGltZS50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvZGlhbG9ncy50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvZXZlbnRzLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9saXN0ZW5lci50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvZXZlbnRfdHlwZXMudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3V0aWxzLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy93aW5kb3cudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL2NvbXBpbGVkL21haW4uanMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3N5c3RlbS50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvY29udGV4dG1lbnUudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2ZsYWdzLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9kcmFnLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9hcHBsaWNhdGlvbi50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvY2FsbHMudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2NhbGxhYmxlLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9jYW5jZWxsYWJsZS50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvY2xpcGJvYXJkLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9jcmVhdGUudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3NjcmVlbnMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vLyBTZXR1cFxud2luZG93Ll93YWlscyA9IHdpbmRvdy5fd2FpbHMgfHwge307XG5cbmltcG9ydCBcIi4vY29udGV4dG1lbnUuanNcIjtcbmltcG9ydCBcIi4vZHJhZy5qc1wiO1xuXG4vLyBSZS1leHBvcnQgcHVibGljIEFQSVxuaW1wb3J0ICogYXMgQXBwbGljYXRpb24gZnJvbSBcIi4vYXBwbGljYXRpb24uanNcIjtcbmltcG9ydCAqIGFzIEJyb3dzZXIgZnJvbSBcIi4vYnJvd3Nlci5qc1wiO1xuaW1wb3J0ICogYXMgQ2FsbCBmcm9tIFwiLi9jYWxscy5qc1wiO1xuaW1wb3J0ICogYXMgQ2xpcGJvYXJkIGZyb20gXCIuL2NsaXBib2FyZC5qc1wiO1xuaW1wb3J0ICogYXMgQ3JlYXRlIGZyb20gXCIuL2NyZWF0ZS5qc1wiO1xuaW1wb3J0ICogYXMgRGlhbG9ncyBmcm9tIFwiLi9kaWFsb2dzLmpzXCI7XG5pbXBvcnQgKiBhcyBFdmVudHMgZnJvbSBcIi4vZXZlbnRzLmpzXCI7XG5pbXBvcnQgKiBhcyBGbGFncyBmcm9tIFwiLi9mbGFncy5qc1wiO1xuaW1wb3J0ICogYXMgU2NyZWVucyBmcm9tIFwiLi9zY3JlZW5zLmpzXCI7XG5pbXBvcnQgKiBhcyBTeXN0ZW0gZnJvbSBcIi4vc3lzdGVtLmpzXCI7XG5pbXBvcnQgV2luZG93IGZyb20gXCIuL3dpbmRvdy5qc1wiO1xuaW1wb3J0ICogYXMgV01MIGZyb20gXCIuL3dtbC5qc1wiO1xuXG5leHBvcnQge1xuICAgIEFwcGxpY2F0aW9uLFxuICAgIEJyb3dzZXIsXG4gICAgQ2FsbCxcbiAgICBDbGlwYm9hcmQsXG4gICAgRGlhbG9ncyxcbiAgICBFdmVudHMsXG4gICAgRmxhZ3MsXG4gICAgU2NyZWVucyxcbiAgICBTeXN0ZW0sXG4gICAgV2luZG93LFxuICAgIFdNTFxufTtcblxuLyoqXG4gKiBBbiBpbnRlcm5hbCB1dGlsaXR5IGNvbnN1bWVkIGJ5IHRoZSBiaW5kaW5nIGdlbmVyYXRvci5cbiAqXG4gKiBAaWdub3JlXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IHsgQ3JlYXRlIH07XG5cbmV4cG9ydCAqIGZyb20gXCIuL2NhbmNlbGxhYmxlLmpzXCI7XG5cbi8vIE5vdGlmeSBiYWNrZW5kXG53aW5kb3cuX3dhaWxzLmludm9rZSA9IFN5c3RlbS5pbnZva2U7XG5TeXN0ZW0uaW52b2tlKFwid2FpbHM6cnVudGltZTpyZWFkeVwiKTtcbiIsICIvKlxuIF8gICAgIF9fICAgICBfIF9fXG58IHwgIC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuaW1wb3J0IHsgT3BlblVSTCB9IGZyb20gXCIuL2Jyb3dzZXIuanNcIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4vZGlhbG9ncy5qc1wiO1xuaW1wb3J0IHsgRW1pdCwgV2FpbHNFdmVudCB9IGZyb20gXCIuL2V2ZW50cy5qc1wiO1xuaW1wb3J0IHsgY2FuQWJvcnRMaXN0ZW5lcnMsIHdoZW5SZWFkeSB9IGZyb20gXCIuL3V0aWxzLmpzXCI7XG5pbXBvcnQgV2luZG93IGZyb20gXCIuL3dpbmRvdy5qc1wiO1xuXG4vKipcbiAqIFNlbmRzIGFuIGV2ZW50IHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIG9wdGlvbmFsIGRhdGEuXG4gKlxuICogQHBhcmFtIGV2ZW50TmFtZSAtIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIHNlbmQuXG4gKiBAcGFyYW0gW2RhdGE9bnVsbF0gLSAtIE9wdGlvbmFsIGRhdGEgdG8gc2VuZCBhbG9uZyB3aXRoIHRoZSBldmVudC5cbiAqL1xuZnVuY3Rpb24gc2VuZEV2ZW50KGV2ZW50TmFtZTogc3RyaW5nLCBkYXRhOiBhbnkgPSBudWxsKTogdm9pZCB7XG4gICAgRW1pdChuZXcgV2FpbHNFdmVudChldmVudE5hbWUsIGRhdGEpKTtcbn1cblxuLyoqXG4gKiBDYWxscyBhIG1ldGhvZCBvbiBhIHNwZWNpZmllZCB3aW5kb3cuXG4gKlxuICogQHBhcmFtIHdpbmRvd05hbWUgLSBUaGUgbmFtZSBvZiB0aGUgd2luZG93IHRvIGNhbGwgdGhlIG1ldGhvZCBvbi5cbiAqIEBwYXJhbSBtZXRob2ROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0byBjYWxsLlxuICovXG5mdW5jdGlvbiBjYWxsV2luZG93TWV0aG9kKHdpbmRvd05hbWU6IHN0cmluZywgbWV0aG9kTmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgdGFyZ2V0V2luZG93ID0gV2luZG93LkdldCh3aW5kb3dOYW1lKTtcbiAgICBjb25zdCBtZXRob2QgPSAodGFyZ2V0V2luZG93IGFzIGFueSlbbWV0aG9kTmFtZV07XG5cbiAgICBpZiAodHlwZW9mIG1ldGhvZCAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFdpbmRvdyBtZXRob2QgJyR7bWV0aG9kTmFtZX0nIG5vdCBmb3VuZGApO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgICAgbWV0aG9kLmNhbGwodGFyZ2V0V2luZG93KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIGNhbGxpbmcgd2luZG93IG1ldGhvZCAnJHttZXRob2ROYW1lfSc6IGAsIGUpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZXNwb25kcyB0byBhIHRyaWdnZXJpbmcgZXZlbnQgYnkgcnVubmluZyBhcHByb3ByaWF0ZSBXTUwgYWN0aW9ucyBmb3IgdGhlIGN1cnJlbnQgdGFyZ2V0LlxuICovXG5mdW5jdGlvbiBvbldNTFRyaWdnZXJlZChldjogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBlbGVtZW50ID0gZXYuY3VycmVudFRhcmdldCBhcyBFbGVtZW50O1xuXG4gICAgZnVuY3Rpb24gcnVuRWZmZWN0KGNob2ljZSA9IFwiWWVzXCIpIHtcbiAgICAgICAgaWYgKGNob2ljZSAhPT0gXCJZZXNcIilcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjb25zdCBldmVudFR5cGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnd21sLWV2ZW50JykgfHwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtd21sLWV2ZW50Jyk7XG4gICAgICAgIGNvbnN0IHRhcmdldFdpbmRvdyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd3bWwtdGFyZ2V0LXdpbmRvdycpIHx8IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXdtbC10YXJnZXQtd2luZG93JykgfHwgXCJcIjtcbiAgICAgICAgY29uc3Qgd2luZG93TWV0aG9kID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3dtbC13aW5kb3cnKSB8fCBlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS13bWwtd2luZG93Jyk7XG4gICAgICAgIGNvbnN0IHVybCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd3bWwtb3BlbnVybCcpIHx8IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXdtbC1vcGVudXJsJyk7XG5cbiAgICAgICAgaWYgKGV2ZW50VHlwZSAhPT0gbnVsbClcbiAgICAgICAgICAgIHNlbmRFdmVudChldmVudFR5cGUpO1xuICAgICAgICBpZiAod2luZG93TWV0aG9kICE9PSBudWxsKVxuICAgICAgICAgICAgY2FsbFdpbmRvd01ldGhvZCh0YXJnZXRXaW5kb3csIHdpbmRvd01ldGhvZCk7XG4gICAgICAgIGlmICh1cmwgIT09IG51bGwpXG4gICAgICAgICAgICB2b2lkIE9wZW5VUkwodXJsKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb25maXJtID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3dtbC1jb25maXJtJykgfHwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtd21sLWNvbmZpcm0nKTtcblxuICAgIGlmIChjb25maXJtKSB7XG4gICAgICAgIFF1ZXN0aW9uKHtcbiAgICAgICAgICAgIFRpdGxlOiBcIkNvbmZpcm1cIixcbiAgICAgICAgICAgIE1lc3NhZ2U6IGNvbmZpcm0sXG4gICAgICAgICAgICBEZXRhY2hlZDogZmFsc2UsXG4gICAgICAgICAgICBCdXR0b25zOiBbXG4gICAgICAgICAgICAgICAgeyBMYWJlbDogXCJZZXNcIiB9LFxuICAgICAgICAgICAgICAgIHsgTGFiZWw6IFwiTm9cIiwgSXNEZWZhdWx0OiB0cnVlIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSkudGhlbihydW5FZmZlY3QpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJ1bkVmZmVjdCgpO1xuICAgIH1cbn1cblxuLy8gUHJpdmF0ZSBmaWVsZCBuYW1lcy5cbmNvbnN0IGNvbnRyb2xsZXJTeW0gPSBTeW1ib2woXCJjb250cm9sbGVyXCIpO1xuY29uc3QgdHJpZ2dlck1hcFN5bSA9IFN5bWJvbChcInRyaWdnZXJNYXBcIik7XG5jb25zdCBlbGVtZW50Q291bnRTeW0gPSBTeW1ib2woXCJlbGVtZW50Q291bnRcIik7XG5cbi8qKlxuICogQWJvcnRDb250cm9sbGVyUmVnaXN0cnkgZG9lcyBub3QgYWN0dWFsbHkgcmVtZW1iZXIgYWN0aXZlIGV2ZW50IGxpc3RlbmVyczogaW5zdGVhZFxuICogaXQgdGllcyB0aGVtIHRvIGFuIEFib3J0U2lnbmFsIGFuZCB1c2VzIGFuIEFib3J0Q29udHJvbGxlciB0byByZW1vdmUgdGhlbSBhbGwgYXQgb25jZS5cbiAqL1xuY2xhc3MgQWJvcnRDb250cm9sbGVyUmVnaXN0cnkge1xuICAgIC8vIFByaXZhdGUgZmllbGRzLlxuICAgIFtjb250cm9sbGVyU3ltXTogQWJvcnRDb250cm9sbGVyO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXNbY29udHJvbGxlclN5bV0gPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBvcHRpb25zIG9iamVjdCBmb3IgYWRkRXZlbnRMaXN0ZW5lciB0aGF0IHRpZXMgdGhlIGxpc3RlbmVyXG4gICAgICogdG8gdGhlIEFib3J0U2lnbmFsIGZyb20gdGhlIGN1cnJlbnQgQWJvcnRDb250cm9sbGVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVsZW1lbnQgLSBBbiBIVE1MIGVsZW1lbnRcbiAgICAgKiBAcGFyYW0gdHJpZ2dlcnMgLSBUaGUgbGlzdCBvZiBhY3RpdmUgV01MIHRyaWdnZXIgZXZlbnRzIGZvciB0aGUgc3BlY2lmaWVkIGVsZW1lbnRzXG4gICAgICovXG4gICAgc2V0KGVsZW1lbnQ6IEVsZW1lbnQsIHRyaWdnZXJzOiBzdHJpbmdbXSk6IEFkZEV2ZW50TGlzdGVuZXJPcHRpb25zIHtcbiAgICAgICAgcmV0dXJuIHsgc2lnbmFsOiB0aGlzW2NvbnRyb2xsZXJTeW1dLnNpZ25hbCB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIHJlZ2lzdGVyZWQgZXZlbnQgbGlzdGVuZXJzIGFuZCByZXNldHMgdGhlIHJlZ2lzdHJ5LlxuICAgICAqL1xuICAgIHJlc2V0KCk6IHZvaWQge1xuICAgICAgICB0aGlzW2NvbnRyb2xsZXJTeW1dLmFib3J0KCk7XG4gICAgICAgIHRoaXNbY29udHJvbGxlclN5bV0gPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgfVxufVxuXG4vKipcbiAqIFdlYWtNYXBSZWdpc3RyeSBtYXBzIGFjdGl2ZSB0cmlnZ2VyIGV2ZW50cyB0byBlYWNoIERPTSBlbGVtZW50IHRocm91Z2ggYSBXZWFrTWFwLlxuICogVGhpcyBlbnN1cmVzIHRoYXQgdGhlIG1hcHBpbmcgcmVtYWlucyBwcml2YXRlIHRvIHRoaXMgbW9kdWxlLCB3aGlsZSBzdGlsbCBhbGxvd2luZyBnYXJiYWdlXG4gKiBjb2xsZWN0aW9uIG9mIHRoZSBpbnZvbHZlZCBlbGVtZW50cy5cbiAqL1xuY2xhc3MgV2Vha01hcFJlZ2lzdHJ5IHtcbiAgICAvKiogU3RvcmVzIHRoZSBjdXJyZW50IGVsZW1lbnQtdG8tdHJpZ2dlciBtYXBwaW5nLiAqL1xuICAgIFt0cmlnZ2VyTWFwU3ltXTogV2Vha01hcDxFbGVtZW50LCBzdHJpbmdbXT47XG4gICAgLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHdpdGggYWN0aXZlIFdNTCB0cmlnZ2Vycy4gKi9cbiAgICBbZWxlbWVudENvdW50U3ltXTogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXNbdHJpZ2dlck1hcFN5bV0gPSBuZXcgV2Vha01hcCgpO1xuICAgICAgICB0aGlzW2VsZW1lbnRDb3VudFN5bV0gPSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgYWN0aXZlIHRyaWdnZXJzIGZvciB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZWxlbWVudCAtIEFuIEhUTUwgZWxlbWVudFxuICAgICAqIEBwYXJhbSB0cmlnZ2VycyAtIFRoZSBsaXN0IG9mIGFjdGl2ZSBXTUwgdHJpZ2dlciBldmVudHMgZm9yIHRoZSBzcGVjaWZpZWQgZWxlbWVudFxuICAgICAqL1xuICAgIHNldChlbGVtZW50OiBFbGVtZW50LCB0cmlnZ2Vyczogc3RyaW5nW10pOiBBZGRFdmVudExpc3RlbmVyT3B0aW9ucyB7XG4gICAgICAgIGlmICghdGhpc1t0cmlnZ2VyTWFwU3ltXS5oYXMoZWxlbWVudCkpIHsgdGhpc1tlbGVtZW50Q291bnRTeW1dKys7IH1cbiAgICAgICAgdGhpc1t0cmlnZ2VyTWFwU3ltXS5zZXQoZWxlbWVudCwgdHJpZ2dlcnMpO1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwgcmVnaXN0ZXJlZCBldmVudCBsaXN0ZW5lcnMuXG4gICAgICovXG4gICAgcmVzZXQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzW2VsZW1lbnRDb3VudFN5bV0gPD0gMClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZG9jdW1lbnQuYm9keS5xdWVyeVNlbGVjdG9yQWxsKCcqJykpIHtcbiAgICAgICAgICAgIGlmICh0aGlzW2VsZW1lbnRDb3VudFN5bV0gPD0gMClcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY29uc3QgdHJpZ2dlcnMgPSB0aGlzW3RyaWdnZXJNYXBTeW1dLmdldChlbGVtZW50KTtcbiAgICAgICAgICAgIGlmICh0cmlnZ2VycyAhPSBudWxsKSB7IHRoaXNbZWxlbWVudENvdW50U3ltXS0tOyB9XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgdHJpZ2dlciBvZiB0cmlnZ2VycyB8fCBbXSlcbiAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodHJpZ2dlciwgb25XTUxUcmlnZ2VyZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpc1t0cmlnZ2VyTWFwU3ltXSA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgIHRoaXNbZWxlbWVudENvdW50U3ltXSA9IDA7XG4gICAgfVxufVxuXG5jb25zdCB0cmlnZ2VyUmVnaXN0cnkgPSBjYW5BYm9ydExpc3RlbmVycygpID8gbmV3IEFib3J0Q29udHJvbGxlclJlZ2lzdHJ5KCkgOiBuZXcgV2Vha01hcFJlZ2lzdHJ5KCk7XG5cbi8qKlxuICogQWRkcyBldmVudCBsaXN0ZW5lcnMgdG8gdGhlIHNwZWNpZmllZCBlbGVtZW50LlxuICovXG5mdW5jdGlvbiBhZGRXTUxMaXN0ZW5lcnMoZWxlbWVudDogRWxlbWVudCk6IHZvaWQge1xuICAgIGNvbnN0IHRyaWdnZXJSZWdFeHAgPSAvXFxTKy9nO1xuICAgIGNvbnN0IHRyaWdnZXJBdHRyID0gKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd3bWwtdHJpZ2dlcicpIHx8IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXdtbC10cmlnZ2VyJykgfHwgXCJjbGlja1wiKTtcbiAgICBjb25zdCB0cmlnZ2Vyczogc3RyaW5nW10gPSBbXTtcblxuICAgIGxldCBtYXRjaDtcbiAgICB3aGlsZSAoKG1hdGNoID0gdHJpZ2dlclJlZ0V4cC5leGVjKHRyaWdnZXJBdHRyKSkgIT09IG51bGwpXG4gICAgICAgIHRyaWdnZXJzLnB1c2gobWF0Y2hbMF0pO1xuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHRyaWdnZXJSZWdpc3RyeS5zZXQoZWxlbWVudCwgdHJpZ2dlcnMpO1xuICAgIGZvciAoY29uc3QgdHJpZ2dlciBvZiB0cmlnZ2VycylcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHRyaWdnZXIsIG9uV01MVHJpZ2dlcmVkLCBvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBTY2hlZHVsZXMgYW4gYXV0b21hdGljIHJlbG9hZCBvZiBXTUwgdG8gYmUgcGVyZm9ybWVkIGFzIHNvb24gYXMgdGhlIGRvY3VtZW50IGlzIGZ1bGx5IGxvYWRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEVuYWJsZSgpOiB2b2lkIHtcbiAgICB3aGVuUmVhZHkoUmVsb2FkKTtcbn1cblxuLyoqXG4gKiBSZWxvYWRzIHRoZSBXTUwgcGFnZSBieSBhZGRpbmcgbmVjZXNzYXJ5IGV2ZW50IGxpc3RlbmVycyBhbmQgYnJvd3NlciBsaXN0ZW5lcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBSZWxvYWQoKTogdm9pZCB7XG4gICAgdHJpZ2dlclJlZ2lzdHJ5LnJlc2V0KCk7XG4gICAgZG9jdW1lbnQuYm9keS5xdWVyeVNlbGVjdG9yQWxsKCdbd21sLWV2ZW50XSwgW3dtbC13aW5kb3ddLCBbd21sLW9wZW51cmxdLCBbZGF0YS13bWwtZXZlbnRdLCBbZGF0YS13bWwtd2luZG93XSwgW2RhdGEtd21sLW9wZW51cmxdJykuZm9yRWFjaChhZGRXTUxMaXN0ZW5lcnMpO1xufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5pbXBvcnQgeyBuZXdSdW50aW1lQ2FsbGVyLCBvYmplY3ROYW1lcyB9IGZyb20gXCIuL3J1bnRpbWUuanNcIjtcblxuY29uc3QgY2FsbCA9IG5ld1J1bnRpbWVDYWxsZXIob2JqZWN0TmFtZXMuQnJvd3Nlcik7XG5cbmNvbnN0IEJyb3dzZXJPcGVuVVJMID0gMDtcblxuLyoqXG4gKiBPcGVuIGEgYnJvd3NlciB3aW5kb3cgdG8gdGhlIGdpdmVuIFVSTC5cbiAqXG4gKiBAcGFyYW0gdXJsIC0gVGhlIFVSTCB0byBvcGVuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBPcGVuVVJMKHVybDogc3RyaW5nIHwgVVJMKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIGNhbGwoQnJvd3Nlck9wZW5VUkwsIHt1cmw6IHVybC50b1N0cmluZygpfSk7XG59XG4iLCAiLy8gU291cmNlOiBodHRwczovL2dpdGh1Yi5jb20vYWkvbmFub2lkXG5cbi8vIFRoZSBNSVQgTGljZW5zZSAoTUlUKVxuLy9cbi8vIENvcHlyaWdodCAyMDE3IEFuZHJleSBTaXRuaWsgPGFuZHJleUBzaXRuaWsucnU+XG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZlxuLy8gdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpblxuLy8gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0b1xuLy8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2Zcbi8vIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbyxcbi8vICAgICBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyAgICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4vLyBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vICAgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTU1xuLy8gRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SXG4vLyBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVJcbi8vIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOXG4vLyBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBUaGlzIGFscGhhYmV0IHVzZXMgYEEtWmEtejAtOV8tYCBzeW1ib2xzLlxuLy8gVGhlIG9yZGVyIG9mIGNoYXJhY3RlcnMgaXMgb3B0aW1pemVkIGZvciBiZXR0ZXIgZ3ppcCBhbmQgYnJvdGxpIGNvbXByZXNzaW9uLlxuLy8gUmVmZXJlbmNlcyB0byB0aGUgc2FtZSBmaWxlICh3b3JrcyBib3RoIGZvciBnemlwIGFuZCBicm90bGkpOlxuLy8gYCd1c2VgLCBgYW5kb21gLCBhbmQgYHJpY3QnYFxuLy8gUmVmZXJlbmNlcyB0byB0aGUgYnJvdGxpIGRlZmF1bHQgZGljdGlvbmFyeTpcbi8vIGAtMjZUYCwgYDE5ODNgLCBgNDBweGAsIGA3NXB4YCwgYGJ1c2hgLCBgamFja2AsIGBtaW5kYCwgYHZlcnlgLCBhbmQgYHdvbGZgXG5jb25zdCB1cmxBbHBoYWJldCA9XG4gICAgJ3VzZWFuZG9tLTI2VDE5ODM0MFBYNzVweEpBQ0tWRVJZTUlOREJVU0hXT0xGX0dRWmJmZ2hqa2xxdnd5enJpY3QnXG5cbmV4cG9ydCBmdW5jdGlvbiBuYW5vaWQoc2l6ZTogbnVtYmVyID0gMjEpOiBzdHJpbmcge1xuICAgIGxldCBpZCA9ICcnXG4gICAgLy8gQSBjb21wYWN0IGFsdGVybmF0aXZlIGZvciBgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGVwOyBpKyspYC5cbiAgICBsZXQgaSA9IHNpemUgfCAwXG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgICAvLyBgfCAwYCBpcyBtb3JlIGNvbXBhY3QgYW5kIGZhc3RlciB0aGFuIGBNYXRoLmZsb29yKClgLlxuICAgICAgICBpZCArPSB1cmxBbHBoYWJldFsoTWF0aC5yYW5kb20oKSAqIDY0KSB8IDBdXG4gICAgfVxuICAgIHJldHVybiBpZFxufVxuIiwgIi8qXG4gXyAgICAgX18gICAgIF8gX19cbnwgfCAgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5pbXBvcnQgeyBuYW5vaWQgfSBmcm9tICcuL25hbm9pZC5qcyc7XG5cbmNvbnN0IHJ1bnRpbWVVUkwgPSB3aW5kb3cubG9jYXRpb24ub3JpZ2luICsgXCIvd2FpbHMvcnVudGltZVwiO1xuXG4vLyBPYmplY3QgTmFtZXNcbmV4cG9ydCBjb25zdCBvYmplY3ROYW1lcyA9IE9iamVjdC5mcmVlemUoe1xuICAgIENhbGw6IDAsXG4gICAgQ2xpcGJvYXJkOiAxLFxuICAgIEFwcGxpY2F0aW9uOiAyLFxuICAgIEV2ZW50czogMyxcbiAgICBDb250ZXh0TWVudTogNCxcbiAgICBEaWFsb2c6IDUsXG4gICAgV2luZG93OiA2LFxuICAgIFNjcmVlbnM6IDcsXG4gICAgU3lzdGVtOiA4LFxuICAgIEJyb3dzZXI6IDksXG4gICAgQ2FuY2VsQ2FsbDogMTAsXG59KTtcbmV4cG9ydCBsZXQgY2xpZW50SWQgPSBuYW5vaWQoKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHJ1bnRpbWUgY2FsbGVyIHdpdGggc3BlY2lmaWVkIElELlxuICpcbiAqIEBwYXJhbSBvYmplY3QgLSBUaGUgb2JqZWN0IHRvIGludm9rZSB0aGUgbWV0aG9kIG9uLlxuICogQHBhcmFtIHdpbmRvd05hbWUgLSBUaGUgbmFtZSBvZiB0aGUgd2luZG93LlxuICogQHJldHVybiBUaGUgbmV3IHJ1bnRpbWUgY2FsbGVyIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbmV3UnVudGltZUNhbGxlcihvYmplY3Q6IG51bWJlciwgd2luZG93TmFtZTogc3RyaW5nID0gJycpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG1ldGhvZDogbnVtYmVyLCBhcmdzOiBhbnkgPSBudWxsKSB7XG4gICAgICAgIHJldHVybiBydW50aW1lQ2FsbFdpdGhJRChvYmplY3QsIG1ldGhvZCwgd2luZG93TmFtZSwgYXJncyk7XG4gICAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVudGltZUNhbGxXaXRoSUQob2JqZWN0SUQ6IG51bWJlciwgbWV0aG9kOiBudW1iZXIsIHdpbmRvd05hbWU6IHN0cmluZywgYXJnczogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICBsZXQgdXJsID0gbmV3IFVSTChydW50aW1lVVJMKTtcbiAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChcIm9iamVjdFwiLCBvYmplY3RJRC50b1N0cmluZygpKTtcbiAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChcIm1ldGhvZFwiLCBtZXRob2QudG9TdHJpbmcoKSk7XG4gICAgaWYgKGFyZ3MpIHsgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoXCJhcmdzXCIsIEpTT04uc3RyaW5naWZ5KGFyZ3MpKTsgfVxuXG4gICAgbGV0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgIFtcIngtd2FpbHMtY2xpZW50LWlkXCJdOiBjbGllbnRJZFxuICAgIH1cbiAgICBpZiAod2luZG93TmFtZSkge1xuICAgICAgICBoZWFkZXJzW1wieC13YWlscy13aW5kb3ctbmFtZVwiXSA9IHdpbmRvd05hbWU7XG4gICAgfVxuXG4gICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7IGhlYWRlcnMgfSk7XG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYXdhaXQgcmVzcG9uc2UudGV4dCgpKTtcbiAgICB9XG5cbiAgICBpZiAoKHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiQ29udGVudC1UeXBlXCIpPy5pbmRleE9mKFwiYXBwbGljYXRpb24vanNvblwiKSA/PyAtMSkgIT09IC0xKSB7XG4gICAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKTtcbiAgICB9XG59XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbmltcG9ydCB7bmV3UnVudGltZUNhbGxlciwgb2JqZWN0TmFtZXN9IGZyb20gXCIuL3J1bnRpbWUuanNcIjtcbmltcG9ydCB7IG5hbm9pZCB9IGZyb20gJy4vbmFub2lkLmpzJztcblxuLy8gc2V0dXBcbndpbmRvdy5fd2FpbHMgPSB3aW5kb3cuX3dhaWxzIHx8IHt9O1xud2luZG93Ll93YWlscy5kaWFsb2dFcnJvckNhbGxiYWNrID0gZGlhbG9nRXJyb3JDYWxsYmFjaztcbndpbmRvdy5fd2FpbHMuZGlhbG9nUmVzdWx0Q2FsbGJhY2sgPSBkaWFsb2dSZXN1bHRDYWxsYmFjaztcblxudHlwZSBQcm9taXNlUmVzb2x2ZXJzID0gT21pdDxQcm9taXNlV2l0aFJlc29sdmVyczxhbnk+LCBcInByb21pc2VcIj47XG5cbmNvbnN0IGNhbGwgPSBuZXdSdW50aW1lQ2FsbGVyKG9iamVjdE5hbWVzLkRpYWxvZyk7XG5jb25zdCBkaWFsb2dSZXNwb25zZXMgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZVJlc29sdmVycz4oKTtcblxuLy8gRGVmaW5lIGNvbnN0YW50cyBmcm9tIHRoZSBgbWV0aG9kc2Agb2JqZWN0IGluIFRpdGxlIENhc2VcbmNvbnN0IERpYWxvZ0luZm8gPSAwO1xuY29uc3QgRGlhbG9nV2FybmluZyA9IDE7XG5jb25zdCBEaWFsb2dFcnJvciA9IDI7XG5jb25zdCBEaWFsb2dRdWVzdGlvbiA9IDM7XG5jb25zdCBEaWFsb2dPcGVuRmlsZSA9IDQ7XG5jb25zdCBEaWFsb2dTYXZlRmlsZSA9IDU7XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3BlbkZpbGVEaWFsb2dPcHRpb25zIHtcbiAgICAvKiogSW5kaWNhdGVzIGlmIGRpcmVjdG9yaWVzIGNhbiBiZSBjaG9zZW4uICovXG4gICAgQ2FuQ2hvb3NlRGlyZWN0b3JpZXM/OiBib29sZWFuO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgZmlsZXMgY2FuIGJlIGNob3Nlbi4gKi9cbiAgICBDYW5DaG9vc2VGaWxlcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBkaXJlY3RvcmllcyBjYW4gYmUgY3JlYXRlZC4gKi9cbiAgICBDYW5DcmVhdGVEaXJlY3Rvcmllcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBoaWRkZW4gZmlsZXMgc2hvdWxkIGJlIHNob3duLiAqL1xuICAgIFNob3dIaWRkZW5GaWxlcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBhbGlhc2VzIHNob3VsZCBiZSByZXNvbHZlZC4gKi9cbiAgICBSZXNvbHZlc0FsaWFzZXM/OiBib29sZWFuO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgbXVsdGlwbGUgc2VsZWN0aW9uIGlzIGFsbG93ZWQuICovXG4gICAgQWxsb3dzTXVsdGlwbGVTZWxlY3Rpb24/OiBib29sZWFuO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgdGhlIGV4dGVuc2lvbiBzaG91bGQgYmUgaGlkZGVuLiAqL1xuICAgIEhpZGVFeHRlbnNpb24/OiBib29sZWFuO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgaGlkZGVuIGV4dGVuc2lvbnMgY2FuIGJlIHNlbGVjdGVkLiAqL1xuICAgIENhblNlbGVjdEhpZGRlbkV4dGVuc2lvbj86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBmaWxlIHBhY2thZ2VzIHNob3VsZCBiZSB0cmVhdGVkIGFzIGRpcmVjdG9yaWVzLiAqL1xuICAgIFRyZWF0c0ZpbGVQYWNrYWdlc0FzRGlyZWN0b3JpZXM/OiBib29sZWFuO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgb3RoZXIgZmlsZSB0eXBlcyBhcmUgYWxsb3dlZC4gKi9cbiAgICBBbGxvd3NPdGhlckZpbGV0eXBlcz86IGJvb2xlYW47XG4gICAgLyoqIEFycmF5IG9mIGZpbGUgZmlsdGVycy4gKi9cbiAgICBGaWx0ZXJzPzogRmlsZUZpbHRlcltdO1xuICAgIC8qKiBUaXRsZSBvZiB0aGUgZGlhbG9nLiAqL1xuICAgIFRpdGxlPzogc3RyaW5nO1xuICAgIC8qKiBNZXNzYWdlIHRvIHNob3cgaW4gdGhlIGRpYWxvZy4gKi9cbiAgICBNZXNzYWdlPzogc3RyaW5nO1xuICAgIC8qKiBUZXh0IHRvIGRpc3BsYXkgb24gdGhlIGJ1dHRvbi4gKi9cbiAgICBCdXR0b25UZXh0Pzogc3RyaW5nO1xuICAgIC8qKiBEaXJlY3RvcnkgdG8gb3BlbiBpbiB0aGUgZGlhbG9nLiAqL1xuICAgIERpcmVjdG9yeT86IHN0cmluZztcbiAgICAvKiogSW5kaWNhdGVzIGlmIHRoZSBkaWFsb2cgc2hvdWxkIGFwcGVhciBkZXRhY2hlZCBmcm9tIHRoZSBtYWluIHdpbmRvdy4gKi9cbiAgICBEZXRhY2hlZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2F2ZUZpbGVEaWFsb2dPcHRpb25zIHtcbiAgICAvKiogRGVmYXVsdCBmaWxlbmFtZSB0byB1c2UgaW4gdGhlIGRpYWxvZy4gKi9cbiAgICBGaWxlbmFtZT86IHN0cmluZztcbiAgICAvKiogSW5kaWNhdGVzIGlmIGRpcmVjdG9yaWVzIGNhbiBiZSBjaG9zZW4uICovXG4gICAgQ2FuQ2hvb3NlRGlyZWN0b3JpZXM/OiBib29sZWFuO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgZmlsZXMgY2FuIGJlIGNob3Nlbi4gKi9cbiAgICBDYW5DaG9vc2VGaWxlcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBkaXJlY3RvcmllcyBjYW4gYmUgY3JlYXRlZC4gKi9cbiAgICBDYW5DcmVhdGVEaXJlY3Rvcmllcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBoaWRkZW4gZmlsZXMgc2hvdWxkIGJlIHNob3duLiAqL1xuICAgIFNob3dIaWRkZW5GaWxlcz86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBhbGlhc2VzIHNob3VsZCBiZSByZXNvbHZlZC4gKi9cbiAgICBSZXNvbHZlc0FsaWFzZXM/OiBib29sZWFuO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgdGhlIGV4dGVuc2lvbiBzaG91bGQgYmUgaGlkZGVuLiAqL1xuICAgIEhpZGVFeHRlbnNpb24/OiBib29sZWFuO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgaGlkZGVuIGV4dGVuc2lvbnMgY2FuIGJlIHNlbGVjdGVkLiAqL1xuICAgIENhblNlbGVjdEhpZGRlbkV4dGVuc2lvbj86IGJvb2xlYW47XG4gICAgLyoqIEluZGljYXRlcyBpZiBmaWxlIHBhY2thZ2VzIHNob3VsZCBiZSB0cmVhdGVkIGFzIGRpcmVjdG9yaWVzLiAqL1xuICAgIFRyZWF0c0ZpbGVQYWNrYWdlc0FzRGlyZWN0b3JpZXM/OiBib29sZWFuO1xuICAgIC8qKiBJbmRpY2F0ZXMgaWYgb3RoZXIgZmlsZSB0eXBlcyBhcmUgYWxsb3dlZC4gKi9cbiAgICBBbGxvd3NPdGhlckZpbGV0eXBlcz86IGJvb2xlYW47XG4gICAgLyoqIEFycmF5IG9mIGZpbGUgZmlsdGVycy4gKi9cbiAgICBGaWx0ZXJzPzogRmlsZUZpbHRlcltdO1xuICAgIC8qKiBUaXRsZSBvZiB0aGUgZGlhbG9nLiAqL1xuICAgIFRpdGxlPzogc3RyaW5nO1xuICAgIC8qKiBNZXNzYWdlIHRvIHNob3cgaW4gdGhlIGRpYWxvZy4gKi9cbiAgICBNZXNzYWdlPzogc3RyaW5nO1xuICAgIC8qKiBUZXh0IHRvIGRpc3BsYXkgb24gdGhlIGJ1dHRvbi4gKi9cbiAgICBCdXR0b25UZXh0Pzogc3RyaW5nO1xuICAgIC8qKiBEaXJlY3RvcnkgdG8gb3BlbiBpbiB0aGUgZGlhbG9nLiAqL1xuICAgIERpcmVjdG9yeT86IHN0cmluZztcbiAgICAvKiogSW5kaWNhdGVzIGlmIHRoZSBkaWFsb2cgc2hvdWxkIGFwcGVhciBkZXRhY2hlZCBmcm9tIHRoZSBtYWluIHdpbmRvdy4gKi9cbiAgICBEZXRhY2hlZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWVzc2FnZURpYWxvZ09wdGlvbnMge1xuICAgIC8qKiBUaGUgdGl0bGUgb2YgdGhlIGRpYWxvZyB3aW5kb3cuICovXG4gICAgVGl0bGU/OiBzdHJpbmc7XG4gICAgLyoqIFRoZSBtYWluIG1lc3NhZ2UgdG8gc2hvdyBpbiB0aGUgZGlhbG9nLiAqL1xuICAgIE1lc3NhZ2U/OiBzdHJpbmc7XG4gICAgLyoqIEFycmF5IG9mIGJ1dHRvbiBvcHRpb25zIHRvIHNob3cgaW4gdGhlIGRpYWxvZy4gKi9cbiAgICBCdXR0b25zPzogQnV0dG9uW107XG4gICAgLyoqIFRydWUgaWYgdGhlIGRpYWxvZyBzaG91bGQgYXBwZWFyIGRldGFjaGVkIGZyb20gdGhlIG1haW4gd2luZG93IChpZiBhcHBsaWNhYmxlKS4gKi9cbiAgICBEZXRhY2hlZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnV0dG9uIHtcbiAgICAvKiogVGV4dCB0aGF0IGFwcGVhcnMgd2l0aGluIHRoZSBidXR0b24uICovXG4gICAgTGFiZWw/OiBzdHJpbmc7XG4gICAgLyoqIFRydWUgaWYgdGhlIGJ1dHRvbiBzaG91bGQgY2FuY2VsIGFuIG9wZXJhdGlvbiB3aGVuIGNsaWNrZWQuICovXG4gICAgSXNDYW5jZWw/OiBib29sZWFuO1xuICAgIC8qKiBUcnVlIGlmIHRoZSBidXR0b24gc2hvdWxkIGJlIHRoZSBkZWZhdWx0IGFjdGlvbiB3aGVuIHRoZSB1c2VyIHByZXNzZXMgZW50ZXIuICovXG4gICAgSXNEZWZhdWx0PzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWxlRmlsdGVyIHtcbiAgICAvKiogRGlzcGxheSBuYW1lIGZvciB0aGUgZmlsdGVyLCBpdCBjb3VsZCBiZSBcIlRleHQgRmlsZXNcIiwgXCJJbWFnZXNcIiBldGMuICovXG4gICAgRGlzcGxheU5hbWU/OiBzdHJpbmc7XG4gICAgLyoqIFBhdHRlcm4gdG8gbWF0Y2ggZm9yIHRoZSBmaWx0ZXIsIGUuZy4gXCIqLnR4dDsqLm1kXCIgZm9yIHRleHQgbWFya2Rvd24gZmlsZXMuICovXG4gICAgUGF0dGVybj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBIYW5kbGVzIHRoZSByZXN1bHQgb2YgYSBkaWFsb2cgcmVxdWVzdC5cbiAqXG4gKiBAcGFyYW0gaWQgLSBUaGUgaWQgb2YgdGhlIHJlcXVlc3QgdG8gaGFuZGxlIHRoZSByZXN1bHQgZm9yLlxuICogQHBhcmFtIGRhdGEgLSBUaGUgcmVzdWx0IGRhdGEgb2YgdGhlIHJlcXVlc3QuXG4gKiBAcGFyYW0gaXNKU09OIC0gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRhdGEgaXMgSlNPTiBvciBub3QuXG4gKi9cbmZ1bmN0aW9uIGRpYWxvZ1Jlc3VsdENhbGxiYWNrKGlkOiBzdHJpbmcsIGRhdGE6IHN0cmluZywgaXNKU09OOiBib29sZWFuKTogdm9pZCB7XG4gICAgbGV0IHJlc29sdmVycyA9IGdldEFuZERlbGV0ZVJlc3BvbnNlKGlkKTtcbiAgICBpZiAoIXJlc29sdmVycykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGlzSlNPTikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzb2x2ZXJzLnJlc29sdmUoSlNPTi5wYXJzZShkYXRhKSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgICAgICByZXNvbHZlcnMucmVqZWN0KG5ldyBUeXBlRXJyb3IoXCJjb3VsZCBub3QgcGFyc2UgcmVzdWx0OiBcIiArIGVyci5tZXNzYWdlLCB7IGNhdXNlOiBlcnIgfSkpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZXJzLnJlc29sdmUoZGF0YSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEhhbmRsZXMgdGhlIGVycm9yIGZyb20gYSBkaWFsb2cgcmVxdWVzdC5cbiAqXG4gKiBAcGFyYW0gaWQgLSBUaGUgaWQgb2YgdGhlIHByb21pc2UgaGFuZGxlci5cbiAqIEBwYXJhbSBtZXNzYWdlIC0gQW4gZXJyb3IgbWVzc2FnZS5cbiAqL1xuZnVuY3Rpb24gZGlhbG9nRXJyb3JDYWxsYmFjayhpZDogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBnZXRBbmREZWxldGVSZXNwb25zZShpZCk/LnJlamVjdChuZXcgd2luZG93LkVycm9yKG1lc3NhZ2UpKTtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgYW5kIHJlbW92ZXMgdGhlIHJlc3BvbnNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gSUQgZnJvbSB0aGUgZGlhbG9nUmVzcG9uc2VzIG1hcC5cbiAqXG4gKiBAcGFyYW0gaWQgLSBUaGUgSUQgb2YgdGhlIHJlc3BvbnNlIHRvIGJlIHJldHJpZXZlZCBhbmQgcmVtb3ZlZC5cbiAqIEByZXR1cm5zIFRoZSByZXNwb25zZSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBJRCwgaWYgYW55LlxuICovXG5mdW5jdGlvbiBnZXRBbmREZWxldGVSZXNwb25zZShpZDogc3RyaW5nKTogUHJvbWlzZVJlc29sdmVycyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBkaWFsb2dSZXNwb25zZXMuZ2V0KGlkKTtcbiAgICBkaWFsb2dSZXNwb25zZXMuZGVsZXRlKGlkKTtcbiAgICByZXR1cm4gcmVzcG9uc2U7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgdW5pcXVlIElEIHVzaW5nIHRoZSBuYW5vaWQgbGlicmFyeS5cbiAqXG4gKiBAcmV0dXJucyBBIHVuaXF1ZSBJRCB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBkaWFsb2dSZXNwb25zZXMgc2V0LlxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZUlEKCk6IHN0cmluZyB7XG4gICAgbGV0IHJlc3VsdDtcbiAgICBkbyB7XG4gICAgICAgIHJlc3VsdCA9IG5hbm9pZCgpO1xuICAgIH0gd2hpbGUgKGRpYWxvZ1Jlc3BvbnNlcy5oYXMocmVzdWx0KSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBQcmVzZW50cyBhIGRpYWxvZyBvZiBzcGVjaWZpZWQgdHlwZSB3aXRoIHRoZSBnaXZlbiBvcHRpb25zLlxuICpcbiAqIEBwYXJhbSB0eXBlIC0gRGlhbG9nIHR5cGUuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIHRoZSBkaWFsb2cuXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHJlc3VsdCBvZiBkaWFsb2cuXG4gKi9cbmZ1bmN0aW9uIGRpYWxvZyh0eXBlOiBudW1iZXIsIG9wdGlvbnM6IE1lc3NhZ2VEaWFsb2dPcHRpb25zIHwgT3BlbkZpbGVEaWFsb2dPcHRpb25zIHwgU2F2ZUZpbGVEaWFsb2dPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IGlkID0gZ2VuZXJhdGVJRCgpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGRpYWxvZ1Jlc3BvbnNlcy5zZXQoaWQsIHsgcmVzb2x2ZSwgcmVqZWN0IH0pO1xuICAgICAgICBjYWxsKHR5cGUsIE9iamVjdC5hc3NpZ24oeyBcImRpYWxvZy1pZFwiOiBpZCB9LCBvcHRpb25zKSkuY2F0Y2goKGVycjogYW55KSA9PiB7XG4gICAgICAgICAgICBkaWFsb2dSZXNwb25zZXMuZGVsZXRlKGlkKTtcbiAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBQcmVzZW50cyBhbiBpbmZvIGRpYWxvZy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIERpYWxvZyBvcHRpb25zXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBsYWJlbCBvZiB0aGUgY2hvc2VuIGJ1dHRvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEluZm8ob3B0aW9uczogTWVzc2FnZURpYWxvZ09wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4geyByZXR1cm4gZGlhbG9nKERpYWxvZ0luZm8sIG9wdGlvbnMpOyB9XG5cbi8qKlxuICogUHJlc2VudHMgYSB3YXJuaW5nIGRpYWxvZy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIERpYWxvZyBvcHRpb25zLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgbGFiZWwgb2YgdGhlIGNob3NlbiBidXR0b24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBXYXJuaW5nKG9wdGlvbnM6IE1lc3NhZ2VEaWFsb2dPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHsgcmV0dXJuIGRpYWxvZyhEaWFsb2dXYXJuaW5nLCBvcHRpb25zKTsgfVxuXG4vKipcbiAqIFByZXNlbnRzIGFuIGVycm9yIGRpYWxvZy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIERpYWxvZyBvcHRpb25zLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgbGFiZWwgb2YgdGhlIGNob3NlbiBidXR0b24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFcnJvcihvcHRpb25zOiBNZXNzYWdlRGlhbG9nT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7IHJldHVybiBkaWFsb2coRGlhbG9nRXJyb3IsIG9wdGlvbnMpOyB9XG5cbi8qKlxuICogUHJlc2VudHMgYSBxdWVzdGlvbiBkaWFsb2cuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBEaWFsb2cgb3B0aW9ucy5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGxhYmVsIG9mIHRoZSBjaG9zZW4gYnV0dG9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gUXVlc3Rpb24ob3B0aW9uczogTWVzc2FnZURpYWxvZ09wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4geyByZXR1cm4gZGlhbG9nKERpYWxvZ1F1ZXN0aW9uLCBvcHRpb25zKTsgfVxuXG4vKipcbiAqIFByZXNlbnRzIGEgZmlsZSBzZWxlY3Rpb24gZGlhbG9nIHRvIHBpY2sgb25lIG9yIG1vcmUgZmlsZXMgdG8gb3Blbi5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIERpYWxvZyBvcHRpb25zLlxuICogQHJldHVybnMgU2VsZWN0ZWQgZmlsZSBvciBsaXN0IG9mIGZpbGVzLCBvciBhIGJsYW5rIHN0cmluZy9lbXB0eSBsaXN0IGlmIG5vIGZpbGUgaGFzIGJlZW4gc2VsZWN0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBPcGVuRmlsZShvcHRpb25zOiBPcGVuRmlsZURpYWxvZ09wdGlvbnMgJiB7IEFsbG93c011bHRpcGxlU2VsZWN0aW9uOiB0cnVlIH0pOiBQcm9taXNlPHN0cmluZ1tdPjtcbmV4cG9ydCBmdW5jdGlvbiBPcGVuRmlsZShvcHRpb25zOiBPcGVuRmlsZURpYWxvZ09wdGlvbnMgJiB7IEFsbG93c011bHRpcGxlU2VsZWN0aW9uPzogZmFsc2UgfCB1bmRlZmluZWQgfSk6IFByb21pc2U8c3RyaW5nPjtcbmV4cG9ydCBmdW5jdGlvbiBPcGVuRmlsZShvcHRpb25zOiBPcGVuRmlsZURpYWxvZ09wdGlvbnMpOiBQcm9taXNlPHN0cmluZyB8IHN0cmluZ1tdPjtcbmV4cG9ydCBmdW5jdGlvbiBPcGVuRmlsZShvcHRpb25zOiBPcGVuRmlsZURpYWxvZ09wdGlvbnMpOiBQcm9taXNlPHN0cmluZyB8IHN0cmluZ1tdPiB7IHJldHVybiBkaWFsb2coRGlhbG9nT3BlbkZpbGUsIG9wdGlvbnMpID8/IFtdOyB9XG5cbi8qKlxuICogUHJlc2VudHMgYSBmaWxlIHNlbGVjdGlvbiBkaWFsb2cgdG8gcGljayBhIGZpbGUgdG8gc2F2ZS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIERpYWxvZyBvcHRpb25zLlxuICogQHJldHVybnMgU2VsZWN0ZWQgZmlsZSwgb3IgYSBibGFuayBzdHJpbmcgaWYgbm8gZmlsZSBoYXMgYmVlbiBzZWxlY3RlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFNhdmVGaWxlKG9wdGlvbnM6IFNhdmVGaWxlRGlhbG9nT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7IHJldHVybiBkaWFsb2coRGlhbG9nU2F2ZUZpbGUsIG9wdGlvbnMpOyB9XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbmltcG9ydCB7IG5ld1J1bnRpbWVDYWxsZXIsIG9iamVjdE5hbWVzIH0gZnJvbSBcIi4vcnVudGltZS5qc1wiO1xuaW1wb3J0IHsgZXZlbnRMaXN0ZW5lcnMsIExpc3RlbmVyLCBsaXN0ZW5lck9mZiB9IGZyb20gXCIuL2xpc3RlbmVyLmpzXCI7XG5cbi8vIFNldHVwXG53aW5kb3cuX3dhaWxzID0gd2luZG93Ll93YWlscyB8fCB7fTtcbndpbmRvdy5fd2FpbHMuZGlzcGF0Y2hXYWlsc0V2ZW50ID0gZGlzcGF0Y2hXYWlsc0V2ZW50O1xuXG5jb25zdCBjYWxsID0gbmV3UnVudGltZUNhbGxlcihvYmplY3ROYW1lcy5FdmVudHMpO1xuY29uc3QgRW1pdE1ldGhvZCA9IDA7XG5cbmV4cG9ydCB7IFR5cGVzIH0gZnJvbSBcIi4vZXZlbnRfdHlwZXMuanNcIjtcblxuLyoqXG4gKiBUaGUgdHlwZSBvZiBoYW5kbGVycyBmb3IgYSBnaXZlbiBldmVudC5cbiAqL1xuZXhwb3J0IHR5cGUgQ2FsbGJhY2sgPSAoZXY6IFdhaWxzRXZlbnQpID0+IHZvaWQ7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHN5c3RlbSBldmVudCBvciBhIGN1c3RvbSBldmVudCBlbWl0dGVkIHRocm91Z2ggd2FpbHMtcHJvdmlkZWQgZmFjaWxpdGllcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFdhaWxzRXZlbnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBPcHRpb25hbCBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW1pdHRlZCBldmVudC5cbiAgICAgKi9cbiAgICBkYXRhOiBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBOYW1lIG9mIHRoZSBvcmlnaW5hdGluZyB3aW5kb3cuIE9taXR0ZWQgZm9yIGFwcGxpY2F0aW9uIGV2ZW50cy5cbiAgICAgKiBXaWxsIGJlIG92ZXJyaWRkZW4gaWYgc2V0IG1hbnVhbGx5LlxuICAgICAqL1xuICAgIHNlbmRlcj86IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgZGF0YTogYW55ID0gbnVsbCkge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hXYWlsc0V2ZW50KGV2ZW50OiBhbnkpIHtcbiAgICBsZXQgbGlzdGVuZXJzID0gZXZlbnRMaXN0ZW5lcnMuZ2V0KGV2ZW50Lm5hbWUpO1xuICAgIGlmICghbGlzdGVuZXJzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgd2FpbHNFdmVudCA9IG5ldyBXYWlsc0V2ZW50KGV2ZW50Lm5hbWUsIGV2ZW50LmRhdGEpO1xuICAgIGlmICgnc2VuZGVyJyBpbiBldmVudCkge1xuICAgICAgICB3YWlsc0V2ZW50LnNlbmRlciA9IGV2ZW50LnNlbmRlcjtcbiAgICB9XG5cbiAgICBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuZmlsdGVyKGxpc3RlbmVyID0+ICFsaXN0ZW5lci5kaXNwYXRjaCh3YWlsc0V2ZW50KSk7XG4gICAgaWYgKGxpc3RlbmVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZXZlbnRMaXN0ZW5lcnMuZGVsZXRlKGV2ZW50Lm5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGV2ZW50TGlzdGVuZXJzLnNldChldmVudC5uYW1lLCBsaXN0ZW5lcnMpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZWdpc3RlciBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBmb3IgYSBzcGVjaWZpYyBldmVudC5cbiAqXG4gKiBAcGFyYW0gZXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIHJlZ2lzdGVyIHRoZSBjYWxsYmFjayBmb3IuXG4gKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC5cbiAqIEBwYXJhbSBtYXhDYWxsYmFja3MgLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGltZXMgdGhlIGNhbGxiYWNrIGNhbiBiZSBjYWxsZWQgZm9yIHRoZSBldmVudC4gT25jZSB0aGUgbWF4aW11bSBudW1iZXIgaXMgcmVhY2hlZCwgdGhlIGNhbGxiYWNrIHdpbGwgbm8gbG9uZ2VyIGJlIGNhbGxlZC5cbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCwgd2hlbiBjYWxsZWQsIHdpbGwgdW5yZWdpc3RlciB0aGUgY2FsbGJhY2sgZnJvbSB0aGUgZXZlbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBPbk11bHRpcGxlKGV2ZW50TmFtZTogc3RyaW5nLCBjYWxsYmFjazogQ2FsbGJhY2ssIG1heENhbGxiYWNrczogbnVtYmVyKSB7XG4gICAgbGV0IGxpc3RlbmVycyA9IGV2ZW50TGlzdGVuZXJzLmdldChldmVudE5hbWUpIHx8IFtdO1xuICAgIGNvbnN0IHRoaXNMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcihldmVudE5hbWUsIGNhbGxiYWNrLCBtYXhDYWxsYmFja3MpO1xuICAgIGxpc3RlbmVycy5wdXNoKHRoaXNMaXN0ZW5lcik7XG4gICAgZXZlbnRMaXN0ZW5lcnMuc2V0KGV2ZW50TmFtZSwgbGlzdGVuZXJzKTtcbiAgICByZXR1cm4gKCkgPT4gbGlzdGVuZXJPZmYodGhpc0xpc3RlbmVyKTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCB3aGVuIHRoZSBzcGVjaWZpZWQgZXZlbnQgb2NjdXJzLlxuICpcbiAqIEBwYXJhbSBldmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gcmVnaXN0ZXIgdGhlIGNhbGxiYWNrIGZvci5cbiAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0LCB3aGVuIGNhbGxlZCwgd2lsbCB1bnJlZ2lzdGVyIHRoZSBjYWxsYmFjayBmcm9tIHRoZSBldmVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE9uKGV2ZW50TmFtZTogc3RyaW5nLCBjYWxsYmFjazogQ2FsbGJhY2spOiAoKSA9PiB2b2lkIHtcbiAgICByZXR1cm4gT25NdWx0aXBsZShldmVudE5hbWUsIGNhbGxiYWNrLCAtMSk7XG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgb25seSBvbmNlIGZvciB0aGUgc3BlY2lmaWVkIGV2ZW50LlxuICpcbiAqIEBwYXJhbSBldmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gcmVnaXN0ZXIgdGhlIGNhbGxiYWNrIGZvci5cbiAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0LCB3aGVuIGNhbGxlZCwgd2lsbCB1bnJlZ2lzdGVyIHRoZSBjYWxsYmFjayBmcm9tIHRoZSBldmVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE9uY2UoZXZlbnROYW1lOiBzdHJpbmcsIGNhbGxiYWNrOiBDYWxsYmFjayk6ICgpID0+IHZvaWQge1xuICAgIHJldHVybiBPbk11bHRpcGxlKGV2ZW50TmFtZSwgY2FsbGJhY2ssIDEpO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgZXZlbnQgbGlzdGVuZXJzIGZvciB0aGUgc3BlY2lmaWVkIGV2ZW50IG5hbWVzLlxuICpcbiAqIEBwYXJhbSBldmVudE5hbWVzIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50cyB0byByZW1vdmUgbGlzdGVuZXJzIGZvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE9mZiguLi5ldmVudE5hbWVzOiBbc3RyaW5nLCAuLi5zdHJpbmdbXV0pOiB2b2lkIHtcbiAgICBldmVudE5hbWVzLmZvckVhY2goZXZlbnROYW1lID0+IGV2ZW50TGlzdGVuZXJzLmRlbGV0ZShldmVudE5hbWUpKTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIGFsbCBldmVudCBsaXN0ZW5lcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBPZmZBbGwoKTogdm9pZCB7XG4gICAgZXZlbnRMaXN0ZW5lcnMuY2xlYXIoKTtcbn1cblxuLyoqXG4gKiBFbWl0cyB0aGUgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIGV2ZW50IC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIGVtaXQuXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCB3aWxsIGJlIGZ1bGZpbGxlZCBvbmNlIHRoZSBldmVudCBoYXMgYmVlbiBlbWl0dGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gRW1pdChldmVudDogV2FpbHNFdmVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBjYWxsKEVtaXRNZXRob2QsIGV2ZW50KTtcbn1cbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuLy8gVGhlIGZvbGxvd2luZyB1dGlsaXRpZXMgaGF2ZSBiZWVuIGZhY3RvcmVkIG91dCBvZiAuL2V2ZW50cy50c1xuLy8gZm9yIHRlc3RpbmcgcHVycG9zZXMuXG5cbmV4cG9ydCBjb25zdCBldmVudExpc3RlbmVycyA9IG5ldyBNYXA8c3RyaW5nLCBMaXN0ZW5lcltdPigpO1xuXG5leHBvcnQgY2xhc3MgTGlzdGVuZXIge1xuICAgIGV2ZW50TmFtZTogc3RyaW5nO1xuICAgIGNhbGxiYWNrOiAoZGF0YTogYW55KSA9PiB2b2lkO1xuICAgIG1heENhbGxiYWNrczogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IoZXZlbnROYW1lOiBzdHJpbmcsIGNhbGxiYWNrOiAoZGF0YTogYW55KSA9PiB2b2lkLCBtYXhDYWxsYmFja3M6IG51bWJlcikge1xuICAgICAgICB0aGlzLmV2ZW50TmFtZSA9IGV2ZW50TmFtZTtcbiAgICAgICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgICB0aGlzLm1heENhbGxiYWNrcyA9IG1heENhbGxiYWNrcyB8fCAtMTtcbiAgICB9XG5cbiAgICBkaXNwYXRjaChkYXRhOiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuY2FsbGJhY2soZGF0YSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubWF4Q2FsbGJhY2tzID09PSAtMSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLm1heENhbGxiYWNrcyAtPSAxO1xuICAgICAgICByZXR1cm4gdGhpcy5tYXhDYWxsYmFja3MgPT09IDA7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbGlzdGVuZXJPZmYobGlzdGVuZXI6IExpc3RlbmVyKTogdm9pZCB7XG4gICAgbGV0IGxpc3RlbmVycyA9IGV2ZW50TGlzdGVuZXJzLmdldChsaXN0ZW5lci5ldmVudE5hbWUpO1xuICAgIGlmICghbGlzdGVuZXJzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuZmlsdGVyKGwgPT4gbCAhPT0gbGlzdGVuZXIpO1xuICAgIGlmIChsaXN0ZW5lcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGV2ZW50TGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lci5ldmVudE5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGV2ZW50TGlzdGVuZXJzLnNldChsaXN0ZW5lci5ldmVudE5hbWUsIGxpc3RlbmVycyk7XG4gICAgfVxufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vLyBDeW5oeXJjaHd5ZCB5IGZmZWlsIGhvbiB5biBhd3RvbWF0aWcuIFBFSURJV0NIIFx1MDBDMiBNT0RJV0xcbi8vIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZC4gRE8gTk9UIEVESVRcblxuZXhwb3J0IGNvbnN0IFR5cGVzID0gT2JqZWN0LmZyZWV6ZSh7XG5cdFdpbmRvd3M6IE9iamVjdC5mcmVlemUoe1xuXHRcdEFQTVBvd2VyU2V0dGluZ0NoYW5nZTogXCJ3aW5kb3dzOkFQTVBvd2VyU2V0dGluZ0NoYW5nZVwiLFxuXHRcdEFQTVBvd2VyU3RhdHVzQ2hhbmdlOiBcIndpbmRvd3M6QVBNUG93ZXJTdGF0dXNDaGFuZ2VcIixcblx0XHRBUE1SZXN1bWVBdXRvbWF0aWM6IFwid2luZG93czpBUE1SZXN1bWVBdXRvbWF0aWNcIixcblx0XHRBUE1SZXN1bWVTdXNwZW5kOiBcIndpbmRvd3M6QVBNUmVzdW1lU3VzcGVuZFwiLFxuXHRcdEFQTVN1c3BlbmQ6IFwid2luZG93czpBUE1TdXNwZW5kXCIsXG5cdFx0QXBwbGljYXRpb25TdGFydGVkOiBcIndpbmRvd3M6QXBwbGljYXRpb25TdGFydGVkXCIsXG5cdFx0U3lzdGVtVGhlbWVDaGFuZ2VkOiBcIndpbmRvd3M6U3lzdGVtVGhlbWVDaGFuZ2VkXCIsXG5cdFx0V2ViVmlld05hdmlnYXRpb25Db21wbGV0ZWQ6IFwid2luZG93czpXZWJWaWV3TmF2aWdhdGlvbkNvbXBsZXRlZFwiLFxuXHRcdFdpbmRvd0FjdGl2ZTogXCJ3aW5kb3dzOldpbmRvd0FjdGl2ZVwiLFxuXHRcdFdpbmRvd0JhY2tncm91bmRFcmFzZTogXCJ3aW5kb3dzOldpbmRvd0JhY2tncm91bmRFcmFzZVwiLFxuXHRcdFdpbmRvd0NsaWNrQWN0aXZlOiBcIndpbmRvd3M6V2luZG93Q2xpY2tBY3RpdmVcIixcblx0XHRXaW5kb3dDbG9zaW5nOiBcIndpbmRvd3M6V2luZG93Q2xvc2luZ1wiLFxuXHRcdFdpbmRvd0RpZE1vdmU6IFwid2luZG93czpXaW5kb3dEaWRNb3ZlXCIsXG5cdFx0V2luZG93RGlkUmVzaXplOiBcIndpbmRvd3M6V2luZG93RGlkUmVzaXplXCIsXG5cdFx0V2luZG93RFBJQ2hhbmdlZDogXCJ3aW5kb3dzOldpbmRvd0RQSUNoYW5nZWRcIixcblx0XHRXaW5kb3dEcmFnRHJvcDogXCJ3aW5kb3dzOldpbmRvd0RyYWdEcm9wXCIsXG5cdFx0V2luZG93RHJhZ0VudGVyOiBcIndpbmRvd3M6V2luZG93RHJhZ0VudGVyXCIsXG5cdFx0V2luZG93RHJhZ0xlYXZlOiBcIndpbmRvd3M6V2luZG93RHJhZ0xlYXZlXCIsXG5cdFx0V2luZG93RHJhZ092ZXI6IFwid2luZG93czpXaW5kb3dEcmFnT3ZlclwiLFxuXHRcdFdpbmRvd0VuZE1vdmU6IFwid2luZG93czpXaW5kb3dFbmRNb3ZlXCIsXG5cdFx0V2luZG93RW5kUmVzaXplOiBcIndpbmRvd3M6V2luZG93RW5kUmVzaXplXCIsXG5cdFx0V2luZG93RnVsbHNjcmVlbjogXCJ3aW5kb3dzOldpbmRvd0Z1bGxzY3JlZW5cIixcblx0XHRXaW5kb3dIaWRlOiBcIndpbmRvd3M6V2luZG93SGlkZVwiLFxuXHRcdFdpbmRvd0luYWN0aXZlOiBcIndpbmRvd3M6V2luZG93SW5hY3RpdmVcIixcblx0XHRXaW5kb3dLZXlEb3duOiBcIndpbmRvd3M6V2luZG93S2V5RG93blwiLFxuXHRcdFdpbmRvd0tleVVwOiBcIndpbmRvd3M6V2luZG93S2V5VXBcIixcblx0XHRXaW5kb3dLaWxsRm9jdXM6IFwid2luZG93czpXaW5kb3dLaWxsRm9jdXNcIixcblx0XHRXaW5kb3dOb25DbGllbnRIaXQ6IFwid2luZG93czpXaW5kb3dOb25DbGllbnRIaXRcIixcblx0XHRXaW5kb3dOb25DbGllbnRNb3VzZURvd246IFwid2luZG93czpXaW5kb3dOb25DbGllbnRNb3VzZURvd25cIixcblx0XHRXaW5kb3dOb25DbGllbnRNb3VzZUxlYXZlOiBcIndpbmRvd3M6V2luZG93Tm9uQ2xpZW50TW91c2VMZWF2ZVwiLFxuXHRcdFdpbmRvd05vbkNsaWVudE1vdXNlTW92ZTogXCJ3aW5kb3dzOldpbmRvd05vbkNsaWVudE1vdXNlTW92ZVwiLFxuXHRcdFdpbmRvd05vbkNsaWVudE1vdXNlVXA6IFwid2luZG93czpXaW5kb3dOb25DbGllbnRNb3VzZVVwXCIsXG5cdFx0V2luZG93UGFpbnQ6IFwid2luZG93czpXaW5kb3dQYWludFwiLFxuXHRcdFdpbmRvd1Jlc3RvcmU6IFwid2luZG93czpXaW5kb3dSZXN0b3JlXCIsXG5cdFx0V2luZG93U2V0Rm9jdXM6IFwid2luZG93czpXaW5kb3dTZXRGb2N1c1wiLFxuXHRcdFdpbmRvd1Nob3c6IFwid2luZG93czpXaW5kb3dTaG93XCIsXG5cdFx0V2luZG93U3RhcnRNb3ZlOiBcIndpbmRvd3M6V2luZG93U3RhcnRNb3ZlXCIsXG5cdFx0V2luZG93U3RhcnRSZXNpemU6IFwid2luZG93czpXaW5kb3dTdGFydFJlc2l6ZVwiLFxuXHRcdFdpbmRvd1VuRnVsbHNjcmVlbjogXCJ3aW5kb3dzOldpbmRvd1VuRnVsbHNjcmVlblwiLFxuXHRcdFdpbmRvd1pPcmRlckNoYW5nZWQ6IFwid2luZG93czpXaW5kb3daT3JkZXJDaGFuZ2VkXCIsXG5cdFx0V2luZG93TWluaW1pc2U6IFwid2luZG93czpXaW5kb3dNaW5pbWlzZVwiLFxuXHRcdFdpbmRvd1VuTWluaW1pc2U6IFwid2luZG93czpXaW5kb3dVbk1pbmltaXNlXCIsXG5cdFx0V2luZG93TWF4aW1pc2U6IFwid2luZG93czpXaW5kb3dNYXhpbWlzZVwiLFxuXHRcdFdpbmRvd1VuTWF4aW1pc2U6IFwid2luZG93czpXaW5kb3dVbk1heGltaXNlXCIsXG5cdH0pLFxuXHRNYWM6IE9iamVjdC5mcmVlemUoe1xuXHRcdEFwcGxpY2F0aW9uRGlkQmVjb21lQWN0aXZlOiBcIm1hYzpBcHBsaWNhdGlvbkRpZEJlY29tZUFjdGl2ZVwiLFxuXHRcdEFwcGxpY2F0aW9uRGlkQ2hhbmdlQmFja2luZ1Byb3BlcnRpZXM6IFwibWFjOkFwcGxpY2F0aW9uRGlkQ2hhbmdlQmFja2luZ1Byb3BlcnRpZXNcIixcblx0XHRBcHBsaWNhdGlvbkRpZENoYW5nZUVmZmVjdGl2ZUFwcGVhcmFuY2U6IFwibWFjOkFwcGxpY2F0aW9uRGlkQ2hhbmdlRWZmZWN0aXZlQXBwZWFyYW5jZVwiLFxuXHRcdEFwcGxpY2F0aW9uRGlkQ2hhbmdlSWNvbjogXCJtYWM6QXBwbGljYXRpb25EaWRDaGFuZ2VJY29uXCIsXG5cdFx0QXBwbGljYXRpb25EaWRDaGFuZ2VPY2NsdXNpb25TdGF0ZTogXCJtYWM6QXBwbGljYXRpb25EaWRDaGFuZ2VPY2NsdXNpb25TdGF0ZVwiLFxuXHRcdEFwcGxpY2F0aW9uRGlkQ2hhbmdlU2NyZWVuUGFyYW1ldGVyczogXCJtYWM6QXBwbGljYXRpb25EaWRDaGFuZ2VTY3JlZW5QYXJhbWV0ZXJzXCIsXG5cdFx0QXBwbGljYXRpb25EaWRDaGFuZ2VTdGF0dXNCYXJGcmFtZTogXCJtYWM6QXBwbGljYXRpb25EaWRDaGFuZ2VTdGF0dXNCYXJGcmFtZVwiLFxuXHRcdEFwcGxpY2F0aW9uRGlkQ2hhbmdlU3RhdHVzQmFyT3JpZW50YXRpb246IFwibWFjOkFwcGxpY2F0aW9uRGlkQ2hhbmdlU3RhdHVzQmFyT3JpZW50YXRpb25cIixcblx0XHRBcHBsaWNhdGlvbkRpZENoYW5nZVRoZW1lOiBcIm1hYzpBcHBsaWNhdGlvbkRpZENoYW5nZVRoZW1lXCIsXG5cdFx0QXBwbGljYXRpb25EaWRGaW5pc2hMYXVuY2hpbmc6IFwibWFjOkFwcGxpY2F0aW9uRGlkRmluaXNoTGF1bmNoaW5nXCIsXG5cdFx0QXBwbGljYXRpb25EaWRIaWRlOiBcIm1hYzpBcHBsaWNhdGlvbkRpZEhpZGVcIixcblx0XHRBcHBsaWNhdGlvbkRpZFJlc2lnbkFjdGl2ZTogXCJtYWM6QXBwbGljYXRpb25EaWRSZXNpZ25BY3RpdmVcIixcblx0XHRBcHBsaWNhdGlvbkRpZFVuaGlkZTogXCJtYWM6QXBwbGljYXRpb25EaWRVbmhpZGVcIixcblx0XHRBcHBsaWNhdGlvbkRpZFVwZGF0ZTogXCJtYWM6QXBwbGljYXRpb25EaWRVcGRhdGVcIixcblx0XHRBcHBsaWNhdGlvblNob3VsZEhhbmRsZVJlb3BlbjogXCJtYWM6QXBwbGljYXRpb25TaG91bGRIYW5kbGVSZW9wZW5cIixcblx0XHRBcHBsaWNhdGlvbldpbGxCZWNvbWVBY3RpdmU6IFwibWFjOkFwcGxpY2F0aW9uV2lsbEJlY29tZUFjdGl2ZVwiLFxuXHRcdEFwcGxpY2F0aW9uV2lsbEZpbmlzaExhdW5jaGluZzogXCJtYWM6QXBwbGljYXRpb25XaWxsRmluaXNoTGF1bmNoaW5nXCIsXG5cdFx0QXBwbGljYXRpb25XaWxsSGlkZTogXCJtYWM6QXBwbGljYXRpb25XaWxsSGlkZVwiLFxuXHRcdEFwcGxpY2F0aW9uV2lsbFJlc2lnbkFjdGl2ZTogXCJtYWM6QXBwbGljYXRpb25XaWxsUmVzaWduQWN0aXZlXCIsXG5cdFx0QXBwbGljYXRpb25XaWxsVGVybWluYXRlOiBcIm1hYzpBcHBsaWNhdGlvbldpbGxUZXJtaW5hdGVcIixcblx0XHRBcHBsaWNhdGlvbldpbGxVbmhpZGU6IFwibWFjOkFwcGxpY2F0aW9uV2lsbFVuaGlkZVwiLFxuXHRcdEFwcGxpY2F0aW9uV2lsbFVwZGF0ZTogXCJtYWM6QXBwbGljYXRpb25XaWxsVXBkYXRlXCIsXG5cdFx0TWVudURpZEFkZEl0ZW06IFwibWFjOk1lbnVEaWRBZGRJdGVtXCIsXG5cdFx0TWVudURpZEJlZ2luVHJhY2tpbmc6IFwibWFjOk1lbnVEaWRCZWdpblRyYWNraW5nXCIsXG5cdFx0TWVudURpZENsb3NlOiBcIm1hYzpNZW51RGlkQ2xvc2VcIixcblx0XHRNZW51RGlkRGlzcGxheUl0ZW06IFwibWFjOk1lbnVEaWREaXNwbGF5SXRlbVwiLFxuXHRcdE1lbnVEaWRFbmRUcmFja2luZzogXCJtYWM6TWVudURpZEVuZFRyYWNraW5nXCIsXG5cdFx0TWVudURpZEhpZ2hsaWdodEl0ZW06IFwibWFjOk1lbnVEaWRIaWdobGlnaHRJdGVtXCIsXG5cdFx0TWVudURpZE9wZW46IFwibWFjOk1lbnVEaWRPcGVuXCIsXG5cdFx0TWVudURpZFBvcFVwOiBcIm1hYzpNZW51RGlkUG9wVXBcIixcblx0XHRNZW51RGlkUmVtb3ZlSXRlbTogXCJtYWM6TWVudURpZFJlbW92ZUl0ZW1cIixcblx0XHRNZW51RGlkU2VuZEFjdGlvbjogXCJtYWM6TWVudURpZFNlbmRBY3Rpb25cIixcblx0XHRNZW51RGlkU2VuZEFjdGlvblRvSXRlbTogXCJtYWM6TWVudURpZFNlbmRBY3Rpb25Ub0l0ZW1cIixcblx0XHRNZW51RGlkVXBkYXRlOiBcIm1hYzpNZW51RGlkVXBkYXRlXCIsXG5cdFx0TWVudVdpbGxBZGRJdGVtOiBcIm1hYzpNZW51V2lsbEFkZEl0ZW1cIixcblx0XHRNZW51V2lsbEJlZ2luVHJhY2tpbmc6IFwibWFjOk1lbnVXaWxsQmVnaW5UcmFja2luZ1wiLFxuXHRcdE1lbnVXaWxsRGlzcGxheUl0ZW06IFwibWFjOk1lbnVXaWxsRGlzcGxheUl0ZW1cIixcblx0XHRNZW51V2lsbEVuZFRyYWNraW5nOiBcIm1hYzpNZW51V2lsbEVuZFRyYWNraW5nXCIsXG5cdFx0TWVudVdpbGxIaWdobGlnaHRJdGVtOiBcIm1hYzpNZW51V2lsbEhpZ2hsaWdodEl0ZW1cIixcblx0XHRNZW51V2lsbE9wZW46IFwibWFjOk1lbnVXaWxsT3BlblwiLFxuXHRcdE1lbnVXaWxsUG9wVXA6IFwibWFjOk1lbnVXaWxsUG9wVXBcIixcblx0XHRNZW51V2lsbFJlbW92ZUl0ZW06IFwibWFjOk1lbnVXaWxsUmVtb3ZlSXRlbVwiLFxuXHRcdE1lbnVXaWxsU2VuZEFjdGlvbjogXCJtYWM6TWVudVdpbGxTZW5kQWN0aW9uXCIsXG5cdFx0TWVudVdpbGxTZW5kQWN0aW9uVG9JdGVtOiBcIm1hYzpNZW51V2lsbFNlbmRBY3Rpb25Ub0l0ZW1cIixcblx0XHRNZW51V2lsbFVwZGF0ZTogXCJtYWM6TWVudVdpbGxVcGRhdGVcIixcblx0XHRXZWJWaWV3RGlkQ29tbWl0TmF2aWdhdGlvbjogXCJtYWM6V2ViVmlld0RpZENvbW1pdE5hdmlnYXRpb25cIixcblx0XHRXZWJWaWV3RGlkRmluaXNoTmF2aWdhdGlvbjogXCJtYWM6V2ViVmlld0RpZEZpbmlzaE5hdmlnYXRpb25cIixcblx0XHRXZWJWaWV3RGlkUmVjZWl2ZVNlcnZlclJlZGlyZWN0Rm9yUHJvdmlzaW9uYWxOYXZpZ2F0aW9uOiBcIm1hYzpXZWJWaWV3RGlkUmVjZWl2ZVNlcnZlclJlZGlyZWN0Rm9yUHJvdmlzaW9uYWxOYXZpZ2F0aW9uXCIsXG5cdFx0V2ViVmlld0RpZFN0YXJ0UHJvdmlzaW9uYWxOYXZpZ2F0aW9uOiBcIm1hYzpXZWJWaWV3RGlkU3RhcnRQcm92aXNpb25hbE5hdmlnYXRpb25cIixcblx0XHRXaW5kb3dEaWRCZWNvbWVLZXk6IFwibWFjOldpbmRvd0RpZEJlY29tZUtleVwiLFxuXHRcdFdpbmRvd0RpZEJlY29tZU1haW46IFwibWFjOldpbmRvd0RpZEJlY29tZU1haW5cIixcblx0XHRXaW5kb3dEaWRCZWdpblNoZWV0OiBcIm1hYzpXaW5kb3dEaWRCZWdpblNoZWV0XCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlQWxwaGE6IFwibWFjOldpbmRvd0RpZENoYW5nZUFscGhhXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlQmFja2luZ0xvY2F0aW9uOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VCYWNraW5nTG9jYXRpb25cIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VCYWNraW5nUHJvcGVydGllczogXCJtYWM6V2luZG93RGlkQ2hhbmdlQmFja2luZ1Byb3BlcnRpZXNcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VDb2xsZWN0aW9uQmVoYXZpb3I6IFwibWFjOldpbmRvd0RpZENoYW5nZUNvbGxlY3Rpb25CZWhhdmlvclwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZUVmZmVjdGl2ZUFwcGVhcmFuY2U6IFwibWFjOldpbmRvd0RpZENoYW5nZUVmZmVjdGl2ZUFwcGVhcmFuY2VcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VPY2NsdXNpb25TdGF0ZTogXCJtYWM6V2luZG93RGlkQ2hhbmdlT2NjbHVzaW9uU3RhdGVcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VPcmRlcmluZ01vZGU6IFwibWFjOldpbmRvd0RpZENoYW5nZU9yZGVyaW5nTW9kZVwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZVNjcmVlbjogXCJtYWM6V2luZG93RGlkQ2hhbmdlU2NyZWVuXCIsXG5cdFx0V2luZG93RGlkQ2hhbmdlU2NyZWVuUGFyYW1ldGVyczogXCJtYWM6V2luZG93RGlkQ2hhbmdlU2NyZWVuUGFyYW1ldGVyc1wiLFxuXHRcdFdpbmRvd0RpZENoYW5nZVNjcmVlblByb2ZpbGU6IFwibWFjOldpbmRvd0RpZENoYW5nZVNjcmVlblByb2ZpbGVcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VTY3JlZW5TcGFjZTogXCJtYWM6V2luZG93RGlkQ2hhbmdlU2NyZWVuU3BhY2VcIixcblx0XHRXaW5kb3dEaWRDaGFuZ2VTY3JlZW5TcGFjZVByb3BlcnRpZXM6IFwibWFjOldpbmRvd0RpZENoYW5nZVNjcmVlblNwYWNlUHJvcGVydGllc1wiLFxuXHRcdFdpbmRvd0RpZENoYW5nZVNoYXJpbmdUeXBlOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VTaGFyaW5nVHlwZVwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZVNwYWNlOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VTcGFjZVwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZVNwYWNlT3JkZXJpbmdNb2RlOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VTcGFjZU9yZGVyaW5nTW9kZVwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZVRpdGxlOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VUaXRsZVwiLFxuXHRcdFdpbmRvd0RpZENoYW5nZVRvb2xiYXI6IFwibWFjOldpbmRvd0RpZENoYW5nZVRvb2xiYXJcIixcblx0XHRXaW5kb3dEaWREZW1pbmlhdHVyaXplOiBcIm1hYzpXaW5kb3dEaWREZW1pbmlhdHVyaXplXCIsXG5cdFx0V2luZG93RGlkRW5kU2hlZXQ6IFwibWFjOldpbmRvd0RpZEVuZFNoZWV0XCIsXG5cdFx0V2luZG93RGlkRW50ZXJGdWxsU2NyZWVuOiBcIm1hYzpXaW5kb3dEaWRFbnRlckZ1bGxTY3JlZW5cIixcblx0XHRXaW5kb3dEaWRFbnRlclZlcnNpb25Ccm93c2VyOiBcIm1hYzpXaW5kb3dEaWRFbnRlclZlcnNpb25Ccm93c2VyXCIsXG5cdFx0V2luZG93RGlkRXhpdEZ1bGxTY3JlZW46IFwibWFjOldpbmRvd0RpZEV4aXRGdWxsU2NyZWVuXCIsXG5cdFx0V2luZG93RGlkRXhpdFZlcnNpb25Ccm93c2VyOiBcIm1hYzpXaW5kb3dEaWRFeGl0VmVyc2lvbkJyb3dzZXJcIixcblx0XHRXaW5kb3dEaWRFeHBvc2U6IFwibWFjOldpbmRvd0RpZEV4cG9zZVwiLFxuXHRcdFdpbmRvd0RpZEZvY3VzOiBcIm1hYzpXaW5kb3dEaWRGb2N1c1wiLFxuXHRcdFdpbmRvd0RpZE1pbmlhdHVyaXplOiBcIm1hYzpXaW5kb3dEaWRNaW5pYXR1cml6ZVwiLFxuXHRcdFdpbmRvd0RpZE1vdmU6IFwibWFjOldpbmRvd0RpZE1vdmVcIixcblx0XHRXaW5kb3dEaWRPcmRlck9mZlNjcmVlbjogXCJtYWM6V2luZG93RGlkT3JkZXJPZmZTY3JlZW5cIixcblx0XHRXaW5kb3dEaWRPcmRlck9uU2NyZWVuOiBcIm1hYzpXaW5kb3dEaWRPcmRlck9uU2NyZWVuXCIsXG5cdFx0V2luZG93RGlkUmVzaWduS2V5OiBcIm1hYzpXaW5kb3dEaWRSZXNpZ25LZXlcIixcblx0XHRXaW5kb3dEaWRSZXNpZ25NYWluOiBcIm1hYzpXaW5kb3dEaWRSZXNpZ25NYWluXCIsXG5cdFx0V2luZG93RGlkUmVzaXplOiBcIm1hYzpXaW5kb3dEaWRSZXNpemVcIixcblx0XHRXaW5kb3dEaWRVcGRhdGU6IFwibWFjOldpbmRvd0RpZFVwZGF0ZVwiLFxuXHRcdFdpbmRvd0RpZFVwZGF0ZUFscGhhOiBcIm1hYzpXaW5kb3dEaWRVcGRhdGVBbHBoYVwiLFxuXHRcdFdpbmRvd0RpZFVwZGF0ZUNvbGxlY3Rpb25CZWhhdmlvcjogXCJtYWM6V2luZG93RGlkVXBkYXRlQ29sbGVjdGlvbkJlaGF2aW9yXCIsXG5cdFx0V2luZG93RGlkVXBkYXRlQ29sbGVjdGlvblByb3BlcnRpZXM6IFwibWFjOldpbmRvd0RpZFVwZGF0ZUNvbGxlY3Rpb25Qcm9wZXJ0aWVzXCIsXG5cdFx0V2luZG93RGlkVXBkYXRlU2hhZG93OiBcIm1hYzpXaW5kb3dEaWRVcGRhdGVTaGFkb3dcIixcblx0XHRXaW5kb3dEaWRVcGRhdGVUaXRsZTogXCJtYWM6V2luZG93RGlkVXBkYXRlVGl0bGVcIixcblx0XHRXaW5kb3dEaWRVcGRhdGVUb29sYmFyOiBcIm1hYzpXaW5kb3dEaWRVcGRhdGVUb29sYmFyXCIsXG5cdFx0V2luZG93RGlkWm9vbTogXCJtYWM6V2luZG93RGlkWm9vbVwiLFxuXHRcdFdpbmRvd0ZpbGVEcmFnZ2luZ0VudGVyZWQ6IFwibWFjOldpbmRvd0ZpbGVEcmFnZ2luZ0VudGVyZWRcIixcblx0XHRXaW5kb3dGaWxlRHJhZ2dpbmdFeGl0ZWQ6IFwibWFjOldpbmRvd0ZpbGVEcmFnZ2luZ0V4aXRlZFwiLFxuXHRcdFdpbmRvd0ZpbGVEcmFnZ2luZ1BlcmZvcm1lZDogXCJtYWM6V2luZG93RmlsZURyYWdnaW5nUGVyZm9ybWVkXCIsXG5cdFx0V2luZG93SGlkZTogXCJtYWM6V2luZG93SGlkZVwiLFxuXHRcdFdpbmRvd01heGltaXNlOiBcIm1hYzpXaW5kb3dNYXhpbWlzZVwiLFxuXHRcdFdpbmRvd1VuTWF4aW1pc2U6IFwibWFjOldpbmRvd1VuTWF4aW1pc2VcIixcblx0XHRXaW5kb3dNaW5pbWlzZTogXCJtYWM6V2luZG93TWluaW1pc2VcIixcblx0XHRXaW5kb3dVbk1pbmltaXNlOiBcIm1hYzpXaW5kb3dVbk1pbmltaXNlXCIsXG5cdFx0V2luZG93U2hvdWxkQ2xvc2U6IFwibWFjOldpbmRvd1Nob3VsZENsb3NlXCIsXG5cdFx0V2luZG93U2hvdzogXCJtYWM6V2luZG93U2hvd1wiLFxuXHRcdFdpbmRvd1dpbGxCZWNvbWVLZXk6IFwibWFjOldpbmRvd1dpbGxCZWNvbWVLZXlcIixcblx0XHRXaW5kb3dXaWxsQmVjb21lTWFpbjogXCJtYWM6V2luZG93V2lsbEJlY29tZU1haW5cIixcblx0XHRXaW5kb3dXaWxsQmVnaW5TaGVldDogXCJtYWM6V2luZG93V2lsbEJlZ2luU2hlZXRcIixcblx0XHRXaW5kb3dXaWxsQ2hhbmdlT3JkZXJpbmdNb2RlOiBcIm1hYzpXaW5kb3dXaWxsQ2hhbmdlT3JkZXJpbmdNb2RlXCIsXG5cdFx0V2luZG93V2lsbENsb3NlOiBcIm1hYzpXaW5kb3dXaWxsQ2xvc2VcIixcblx0XHRXaW5kb3dXaWxsRGVtaW5pYXR1cml6ZTogXCJtYWM6V2luZG93V2lsbERlbWluaWF0dXJpemVcIixcblx0XHRXaW5kb3dXaWxsRW50ZXJGdWxsU2NyZWVuOiBcIm1hYzpXaW5kb3dXaWxsRW50ZXJGdWxsU2NyZWVuXCIsXG5cdFx0V2luZG93V2lsbEVudGVyVmVyc2lvbkJyb3dzZXI6IFwibWFjOldpbmRvd1dpbGxFbnRlclZlcnNpb25Ccm93c2VyXCIsXG5cdFx0V2luZG93V2lsbEV4aXRGdWxsU2NyZWVuOiBcIm1hYzpXaW5kb3dXaWxsRXhpdEZ1bGxTY3JlZW5cIixcblx0XHRXaW5kb3dXaWxsRXhpdFZlcnNpb25Ccm93c2VyOiBcIm1hYzpXaW5kb3dXaWxsRXhpdFZlcnNpb25Ccm93c2VyXCIsXG5cdFx0V2luZG93V2lsbEZvY3VzOiBcIm1hYzpXaW5kb3dXaWxsRm9jdXNcIixcblx0XHRXaW5kb3dXaWxsTWluaWF0dXJpemU6IFwibWFjOldpbmRvd1dpbGxNaW5pYXR1cml6ZVwiLFxuXHRcdFdpbmRvd1dpbGxNb3ZlOiBcIm1hYzpXaW5kb3dXaWxsTW92ZVwiLFxuXHRcdFdpbmRvd1dpbGxPcmRlck9mZlNjcmVlbjogXCJtYWM6V2luZG93V2lsbE9yZGVyT2ZmU2NyZWVuXCIsXG5cdFx0V2luZG93V2lsbE9yZGVyT25TY3JlZW46IFwibWFjOldpbmRvd1dpbGxPcmRlck9uU2NyZWVuXCIsXG5cdFx0V2luZG93V2lsbFJlc2lnbk1haW46IFwibWFjOldpbmRvd1dpbGxSZXNpZ25NYWluXCIsXG5cdFx0V2luZG93V2lsbFJlc2l6ZTogXCJtYWM6V2luZG93V2lsbFJlc2l6ZVwiLFxuXHRcdFdpbmRvd1dpbGxVbmZvY3VzOiBcIm1hYzpXaW5kb3dXaWxsVW5mb2N1c1wiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGU6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVcIixcblx0XHRXaW5kb3dXaWxsVXBkYXRlQWxwaGE6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVBbHBoYVwiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGVDb2xsZWN0aW9uQmVoYXZpb3I6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVDb2xsZWN0aW9uQmVoYXZpb3JcIixcblx0XHRXaW5kb3dXaWxsVXBkYXRlQ29sbGVjdGlvblByb3BlcnRpZXM6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVDb2xsZWN0aW9uUHJvcGVydGllc1wiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGVTaGFkb3c6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVTaGFkb3dcIixcblx0XHRXaW5kb3dXaWxsVXBkYXRlVGl0bGU6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVUaXRsZVwiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGVUb29sYmFyOiBcIm1hYzpXaW5kb3dXaWxsVXBkYXRlVG9vbGJhclwiLFxuXHRcdFdpbmRvd1dpbGxVcGRhdGVWaXNpYmlsaXR5OiBcIm1hYzpXaW5kb3dXaWxsVXBkYXRlVmlzaWJpbGl0eVwiLFxuXHRcdFdpbmRvd1dpbGxVc2VTdGFuZGFyZEZyYW1lOiBcIm1hYzpXaW5kb3dXaWxsVXNlU3RhbmRhcmRGcmFtZVwiLFxuXHRcdFdpbmRvd1pvb21JbjogXCJtYWM6V2luZG93Wm9vbUluXCIsXG5cdFx0V2luZG93Wm9vbU91dDogXCJtYWM6V2luZG93Wm9vbU91dFwiLFxuXHRcdFdpbmRvd1pvb21SZXNldDogXCJtYWM6V2luZG93Wm9vbVJlc2V0XCIsXG5cdH0pLFxuXHRMaW51eDogT2JqZWN0LmZyZWV6ZSh7XG5cdFx0QXBwbGljYXRpb25TdGFydHVwOiBcImxpbnV4OkFwcGxpY2F0aW9uU3RhcnR1cFwiLFxuXHRcdFN5c3RlbVRoZW1lQ2hhbmdlZDogXCJsaW51eDpTeXN0ZW1UaGVtZUNoYW5nZWRcIixcblx0XHRXaW5kb3dEZWxldGVFdmVudDogXCJsaW51eDpXaW5kb3dEZWxldGVFdmVudFwiLFxuXHRcdFdpbmRvd0RpZE1vdmU6IFwibGludXg6V2luZG93RGlkTW92ZVwiLFxuXHRcdFdpbmRvd0RpZFJlc2l6ZTogXCJsaW51eDpXaW5kb3dEaWRSZXNpemVcIixcblx0XHRXaW5kb3dGb2N1c0luOiBcImxpbnV4OldpbmRvd0ZvY3VzSW5cIixcblx0XHRXaW5kb3dGb2N1c091dDogXCJsaW51eDpXaW5kb3dGb2N1c091dFwiLFxuXHRcdFdpbmRvd0xvYWRDaGFuZ2VkOiBcImxpbnV4OldpbmRvd0xvYWRDaGFuZ2VkXCIsXG5cdH0pLFxuXHRDb21tb246IE9iamVjdC5mcmVlemUoe1xuXHRcdEFwcGxpY2F0aW9uT3BlbmVkV2l0aEZpbGU6IFwiY29tbW9uOkFwcGxpY2F0aW9uT3BlbmVkV2l0aEZpbGVcIixcblx0XHRBcHBsaWNhdGlvblN0YXJ0ZWQ6IFwiY29tbW9uOkFwcGxpY2F0aW9uU3RhcnRlZFwiLFxuXHRcdFRoZW1lQ2hhbmdlZDogXCJjb21tb246VGhlbWVDaGFuZ2VkXCIsXG5cdFx0V2luZG93Q2xvc2luZzogXCJjb21tb246V2luZG93Q2xvc2luZ1wiLFxuXHRcdFdpbmRvd0RpZE1vdmU6IFwiY29tbW9uOldpbmRvd0RpZE1vdmVcIixcblx0XHRXaW5kb3dEaWRSZXNpemU6IFwiY29tbW9uOldpbmRvd0RpZFJlc2l6ZVwiLFxuXHRcdFdpbmRvd0RQSUNoYW5nZWQ6IFwiY29tbW9uOldpbmRvd0RQSUNoYW5nZWRcIixcblx0XHRXaW5kb3dGaWxlc0Ryb3BwZWQ6IFwiY29tbW9uOldpbmRvd0ZpbGVzRHJvcHBlZFwiLFxuXHRcdFdpbmRvd0ZvY3VzOiBcImNvbW1vbjpXaW5kb3dGb2N1c1wiLFxuXHRcdFdpbmRvd0Z1bGxzY3JlZW46IFwiY29tbW9uOldpbmRvd0Z1bGxzY3JlZW5cIixcblx0XHRXaW5kb3dIaWRlOiBcImNvbW1vbjpXaW5kb3dIaWRlXCIsXG5cdFx0V2luZG93TG9zdEZvY3VzOiBcImNvbW1vbjpXaW5kb3dMb3N0Rm9jdXNcIixcblx0XHRXaW5kb3dNYXhpbWlzZTogXCJjb21tb246V2luZG93TWF4aW1pc2VcIixcblx0XHRXaW5kb3dNaW5pbWlzZTogXCJjb21tb246V2luZG93TWluaW1pc2VcIixcblx0XHRXaW5kb3dSZXN0b3JlOiBcImNvbW1vbjpXaW5kb3dSZXN0b3JlXCIsXG5cdFx0V2luZG93UnVudGltZVJlYWR5OiBcImNvbW1vbjpXaW5kb3dSdW50aW1lUmVhZHlcIixcblx0XHRXaW5kb3dTaG93OiBcImNvbW1vbjpXaW5kb3dTaG93XCIsXG5cdFx0V2luZG93VW5GdWxsc2NyZWVuOiBcImNvbW1vbjpXaW5kb3dVbkZ1bGxzY3JlZW5cIixcblx0XHRXaW5kb3dVbk1heGltaXNlOiBcImNvbW1vbjpXaW5kb3dVbk1heGltaXNlXCIsXG5cdFx0V2luZG93VW5NaW5pbWlzZTogXCJjb21tb246V2luZG93VW5NaW5pbWlzZVwiLFxuXHRcdFdpbmRvd1pvb206IFwiY29tbW9uOldpbmRvd1pvb21cIixcblx0XHRXaW5kb3dab29tSW46IFwiY29tbW9uOldpbmRvd1pvb21JblwiLFxuXHRcdFdpbmRvd1pvb21PdXQ6IFwiY29tbW9uOldpbmRvd1pvb21PdXRcIixcblx0XHRXaW5kb3dab29tUmVzZXQ6IFwiY29tbW9uOldpbmRvd1pvb21SZXNldFwiLFxuXHR9KSxcbn0pO1xuIiwgIi8qXG4gXyAgICAgX18gICAgIF8gX19cbnwgfCAgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vKipcbiAqIExvZ3MgYSBtZXNzYWdlIHRvIHRoZSBjb25zb2xlIHdpdGggY3VzdG9tIGZvcm1hdHRpbmcuXG4gKlxuICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWJ1Z0xvZyhtZXNzYWdlOiBhbnkpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgJyVjIHdhaWxzMyAlYyAnICsgbWVzc2FnZSArICcgJyxcbiAgICAgICAgJ2JhY2tncm91bmQ6ICNhYTAwMDA7IGNvbG9yOiAjZmZmOyBib3JkZXItcmFkaXVzOiAzcHggMHB4IDBweCAzcHg7IHBhZGRpbmc6IDFweDsgZm9udC1zaXplOiAwLjdyZW0nLFxuICAgICAgICAnYmFja2dyb3VuZDogIzAwOTkwMDsgY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDBweCAzcHggM3B4IDBweDsgcGFkZGluZzogMXB4OyBmb250LXNpemU6IDAuN3JlbSdcbiAgICApO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSB3ZWJ2aWV3IHN1cHBvcnRzIHRoZSB7QGxpbmsgTW91c2VFdmVudCNidXR0b25zfSBwcm9wZXJ0eS5cbiAqIExvb2tpbmcgYXQgeW91IG1hY09TIEhpZ2ggU2llcnJhIVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FuVHJhY2tCdXR0b25zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAobmV3IE1vdXNlRXZlbnQoJ21vdXNlZG93bicpKS5idXR0b25zID09PSAwO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBicm93c2VyIHN1cHBvcnRzIHJlbW92aW5nIGxpc3RlbmVycyBieSB0cmlnZ2VyaW5nIGFuIEFib3J0U2lnbmFsXG4gKiAoc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FdmVudFRhcmdldC9hZGRFdmVudExpc3RlbmVyI3NpZ25hbCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYW5BYm9ydExpc3RlbmVycygpIHtcbiAgICBpZiAoIUV2ZW50VGFyZ2V0IHx8ICFBYm9ydFNpZ25hbCB8fCAhQWJvcnRDb250cm9sbGVyKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBsZXQgcmVzdWx0ID0gdHJ1ZTtcblxuICAgIGNvbnN0IHRhcmdldCA9IG5ldyBFdmVudFRhcmdldCgpO1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCAoKSA9PiB7IHJlc3VsdCA9IGZhbHNlOyB9LCB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfSk7XG4gICAgY29udHJvbGxlci5hYm9ydCgpO1xuICAgIHRhcmdldC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgndGVzdCcpKTtcblxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIGNsb3Nlc3QgSFRNTEVsZW1lbnQgYW5jZXN0b3Igb2YgYW4gZXZlbnQncyB0YXJnZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBldmVudFRhcmdldChldmVudDogRXZlbnQpOiBIVE1MRWxlbWVudCB7XG4gICAgaWYgKGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBldmVudC50YXJnZXQ7XG4gICAgfSBlbHNlIGlmICghKGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSAmJiBldmVudC50YXJnZXQgaW5zdGFuY2VvZiBOb2RlKSB7XG4gICAgICAgIHJldHVybiBldmVudC50YXJnZXQucGFyZW50RWxlbWVudCA/PyBkb2N1bWVudC5ib2R5O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBkb2N1bWVudC5ib2R5O1xuICAgIH1cbn1cblxuLyoqKlxuIFRoaXMgdGVjaG5pcXVlIGZvciBwcm9wZXIgbG9hZCBkZXRlY3Rpb24gaXMgdGFrZW4gZnJvbSBIVE1YOlxuXG4gQlNEIDItQ2xhdXNlIExpY2Vuc2VcblxuIENvcHlyaWdodCAoYykgMjAyMCwgQmlnIFNreSBTb2Z0d2FyZVxuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cbiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcblxuIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuXG4gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb25cbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cblxuIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4gQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEVcbiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTFxuIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SXG4gU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVJcbiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLFxuIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFXG4gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cblxuICoqKi9cblxubGV0IGlzUmVhZHkgPSBmYWxzZTtcbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB7IGlzUmVhZHkgPSB0cnVlIH0pO1xuXG5leHBvcnQgZnVuY3Rpb24gd2hlblJlYWR5KGNhbGxiYWNrOiAoKSA9PiB2b2lkKSB7XG4gICAgaWYgKGlzUmVhZHkgfHwgZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJykge1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBjYWxsYmFjayk7XG4gICAgfVxufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5pbXBvcnQge25ld1J1bnRpbWVDYWxsZXIsIG9iamVjdE5hbWVzfSBmcm9tIFwiLi9ydW50aW1lLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNjcmVlbiB9IGZyb20gXCIuL3NjcmVlbnMuanNcIjtcblxuY29uc3QgUG9zaXRpb25NZXRob2QgICAgICAgICAgICAgICAgICAgID0gMDtcbmNvbnN0IENlbnRlck1ldGhvZCAgICAgICAgICAgICAgICAgICAgICA9IDE7XG5jb25zdCBDbG9zZU1ldGhvZCAgICAgICAgICAgICAgICAgICAgICAgPSAyO1xuY29uc3QgRGlzYWJsZVNpemVDb25zdHJhaW50c01ldGhvZCAgICAgID0gMztcbmNvbnN0IEVuYWJsZVNpemVDb25zdHJhaW50c01ldGhvZCAgICAgICA9IDQ7XG5jb25zdCBGb2N1c01ldGhvZCAgICAgICAgICAgICAgICAgICAgICAgPSA1O1xuY29uc3QgRm9yY2VSZWxvYWRNZXRob2QgICAgICAgICAgICAgICAgID0gNjtcbmNvbnN0IEZ1bGxzY3JlZW5NZXRob2QgICAgICAgICAgICAgICAgICA9IDc7XG5jb25zdCBHZXRTY3JlZW5NZXRob2QgICAgICAgICAgICAgICAgICAgPSA4O1xuY29uc3QgR2V0Wm9vbU1ldGhvZCAgICAgICAgICAgICAgICAgICAgID0gOTtcbmNvbnN0IEhlaWdodE1ldGhvZCAgICAgICAgICAgICAgICAgICAgICA9IDEwO1xuY29uc3QgSGlkZU1ldGhvZCAgICAgICAgICAgICAgICAgICAgICAgID0gMTE7XG5jb25zdCBJc0ZvY3VzZWRNZXRob2QgICAgICAgICAgICAgICAgICAgPSAxMjtcbmNvbnN0IElzRnVsbHNjcmVlbk1ldGhvZCAgICAgICAgICAgICAgICA9IDEzO1xuY29uc3QgSXNNYXhpbWlzZWRNZXRob2QgICAgICAgICAgICAgICAgID0gMTQ7XG5jb25zdCBJc01pbmltaXNlZE1ldGhvZCAgICAgICAgICAgICAgICAgPSAxNTtcbmNvbnN0IE1heGltaXNlTWV0aG9kICAgICAgICAgICAgICAgICAgICA9IDE2O1xuY29uc3QgTWluaW1pc2VNZXRob2QgICAgICAgICAgICAgICAgICAgID0gMTc7XG5jb25zdCBOYW1lTWV0aG9kICAgICAgICAgICAgICAgICAgICAgICAgPSAxODtcbmNvbnN0IE9wZW5EZXZUb29sc01ldGhvZCAgICAgICAgICAgICAgICA9IDE5O1xuY29uc3QgUmVsYXRpdmVQb3NpdGlvbk1ldGhvZCAgICAgICAgICAgID0gMjA7XG5jb25zdCBSZWxvYWRNZXRob2QgICAgICAgICAgICAgICAgICAgICAgPSAyMTtcbmNvbnN0IFJlc2l6YWJsZU1ldGhvZCAgICAgICAgICAgICAgICAgICA9IDIyO1xuY29uc3QgUmVzdG9yZU1ldGhvZCAgICAgICAgICAgICAgICAgICAgID0gMjM7XG5jb25zdCBTZXRQb3NpdGlvbk1ldGhvZCAgICAgICAgICAgICAgICAgPSAyNDtcbmNvbnN0IFNldEFsd2F5c09uVG9wTWV0aG9kICAgICAgICAgICAgICA9IDI1O1xuY29uc3QgU2V0QmFja2dyb3VuZENvbG91ck1ldGhvZCAgICAgICAgID0gMjY7XG5jb25zdCBTZXRGcmFtZWxlc3NNZXRob2QgICAgICAgICAgICAgICAgPSAyNztcbmNvbnN0IFNldEZ1bGxzY3JlZW5CdXR0b25FbmFibGVkTWV0aG9kICA9IDI4O1xuY29uc3QgU2V0TWF4U2l6ZU1ldGhvZCAgICAgICAgICAgICAgICAgID0gMjk7XG5jb25zdCBTZXRNaW5TaXplTWV0aG9kICAgICAgICAgICAgICAgICAgPSAzMDtcbmNvbnN0IFNldFJlbGF0aXZlUG9zaXRpb25NZXRob2QgICAgICAgICA9IDMxO1xuY29uc3QgU2V0UmVzaXphYmxlTWV0aG9kICAgICAgICAgICAgICAgID0gMzI7XG5jb25zdCBTZXRTaXplTWV0aG9kICAgICAgICAgICAgICAgICAgICAgPSAzMztcbmNvbnN0IFNldFRpdGxlTWV0aG9kICAgICAgICAgICAgICAgICAgICA9IDM0O1xuY29uc3QgU2V0Wm9vbU1ldGhvZCAgICAgICAgICAgICAgICAgICAgID0gMzU7XG5jb25zdCBTaG93TWV0aG9kICAgICAgICAgICAgICAgICAgICAgICAgPSAzNjtcbmNvbnN0IFNpemVNZXRob2QgICAgICAgICAgICAgICAgICAgICAgICA9IDM3O1xuY29uc3QgVG9nZ2xlRnVsbHNjcmVlbk1ldGhvZCAgICAgICAgICAgID0gMzg7XG5jb25zdCBUb2dnbGVNYXhpbWlzZU1ldGhvZCAgICAgICAgICAgICAgPSAzOTtcbmNvbnN0IFVuRnVsbHNjcmVlbk1ldGhvZCAgICAgICAgICAgICAgICA9IDQwO1xuY29uc3QgVW5NYXhpbWlzZU1ldGhvZCAgICAgICAgICAgICAgICAgID0gNDE7XG5jb25zdCBVbk1pbmltaXNlTWV0aG9kICAgICAgICAgICAgICAgICAgPSA0MjtcbmNvbnN0IFdpZHRoTWV0aG9kICAgICAgICAgICAgICAgICAgICAgICA9IDQzO1xuY29uc3QgWm9vbU1ldGhvZCAgICAgICAgICAgICAgICAgICAgICAgID0gNDQ7XG5jb25zdCBab29tSW5NZXRob2QgICAgICAgICAgICAgICAgICAgICAgPSA0NTtcbmNvbnN0IFpvb21PdXRNZXRob2QgICAgICAgICAgICAgICAgICAgICA9IDQ2O1xuY29uc3QgWm9vbVJlc2V0TWV0aG9kICAgICAgICAgICAgICAgICAgID0gNDc7XG5cbi8qKlxuICogQSByZWNvcmQgZGVzY3JpYmluZyB0aGUgcG9zaXRpb24gb2YgYSB3aW5kb3cuXG4gKi9cbmludGVyZmFjZSBQb3NpdGlvbiB7XG4gICAgLyoqIFRoZSBob3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoZSB3aW5kb3cuICovXG4gICAgeDogbnVtYmVyO1xuICAgIC8qKiBUaGUgdmVydGljYWwgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy4gKi9cbiAgICB5OiBudW1iZXI7XG59XG5cbi8qKlxuICogQSByZWNvcmQgZGVzY3JpYmluZyB0aGUgc2l6ZSBvZiBhIHdpbmRvdy5cbiAqL1xuaW50ZXJmYWNlIFNpemUge1xuICAgIC8qKiBUaGUgd2lkdGggb2YgdGhlIHdpbmRvdy4gKi9cbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIC8qKiBUaGUgaGVpZ2h0IG9mIHRoZSB3aW5kb3cuICovXG4gICAgaGVpZ2h0OiBudW1iZXI7XG59XG5cbi8vIFByaXZhdGUgZmllbGQgbmFtZXMuXG5jb25zdCBjYWxsZXJTeW0gPSBTeW1ib2woXCJjYWxsZXJcIik7XG5cbmNsYXNzIFdpbmRvdyB7XG4gICAgLy8gUHJpdmF0ZSBmaWVsZHMuXG4gICAgcHJpdmF0ZSBbY2FsbGVyU3ltXTogKG1lc3NhZ2U6IG51bWJlciwgYXJncz86IGFueSkgPT4gUHJvbWlzZTxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGlzZXMgYSB3aW5kb3cgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YXJnZXQgd2luZG93LlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZyA9ICcnKSB7XG4gICAgICAgIHRoaXNbY2FsbGVyU3ltXSA9IG5ld1J1bnRpbWVDYWxsZXIob2JqZWN0TmFtZXMuV2luZG93LCBuYW1lKVxuXG4gICAgICAgIC8vIGJpbmQgaW5zdGFuY2UgbWV0aG9kIHRvIG1ha2UgdGhlbSBlYXNpbHkgdXNhYmxlIGluIGV2ZW50IGhhbmRsZXJzXG4gICAgICAgIGZvciAoY29uc3QgbWV0aG9kIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKFdpbmRvdy5wcm90b3R5cGUpKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgbWV0aG9kICE9PSBcImNvbnN0cnVjdG9yXCJcbiAgICAgICAgICAgICAgICAmJiB0eXBlb2YgKHRoaXMgYXMgYW55KVttZXRob2RdID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICh0aGlzIGFzIGFueSlbbWV0aG9kXSA9ICh0aGlzIGFzIGFueSlbbWV0aG9kXS5iaW5kKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgc3BlY2lmaWVkIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHdpbmRvdyB0byBnZXQuXG4gICAgICogQHJldHVybnMgVGhlIGNvcnJlc3BvbmRpbmcgd2luZG93IG9iamVjdC5cbiAgICAgKi9cbiAgICBHZXQobmFtZTogc3RyaW5nKTogV2luZG93IHtcbiAgICAgICAgcmV0dXJuIG5ldyBXaW5kb3cobmFtZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IGFic29sdXRlIHBvc2l0aW9uIG9mIHRoZSB3aW5kb3cuXG4gICAgICovXG4gICAgUG9zaXRpb24oKTogUHJvbWlzZTxQb3NpdGlvbj4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFBvc2l0aW9uTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDZW50ZXJzIHRoZSB3aW5kb3cgb24gdGhlIHNjcmVlbi5cbiAgICAgKi9cbiAgICBDZW50ZXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oQ2VudGVyTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBDbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShDbG9zZU1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZXMgbWluL21heCBzaXplIGNvbnN0cmFpbnRzLlxuICAgICAqL1xuICAgIERpc2FibGVTaXplQ29uc3RyYWludHMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oRGlzYWJsZVNpemVDb25zdHJhaW50c01ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyBtaW4vbWF4IHNpemUgY29uc3RyYWludHMuXG4gICAgICovXG4gICAgRW5hYmxlU2l6ZUNvbnN0cmFpbnRzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEVuYWJsZVNpemVDb25zdHJhaW50c01ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9jdXNlcyB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIEZvY3VzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEZvY3VzTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JjZXMgdGhlIHdpbmRvdyB0byByZWxvYWQgdGhlIHBhZ2UgYXNzZXRzLlxuICAgICAqL1xuICAgIEZvcmNlUmVsb2FkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEZvcmNlUmVsb2FkTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTd2l0Y2hlcyB0aGUgd2luZG93IHRvIGZ1bGxzY3JlZW4gbW9kZS5cbiAgICAgKi9cbiAgICBGdWxsc2NyZWVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEZ1bGxzY3JlZW5NZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHNjcmVlbiB0aGF0IHRoZSB3aW5kb3cgaXMgb24uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgc2NyZWVuIHRoZSB3aW5kb3cgaXMgY3VycmVudGx5IG9uLlxuICAgICAqL1xuICAgIEdldFNjcmVlbigpOiBQcm9taXNlPFNjcmVlbj4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEdldFNjcmVlbk1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudCB6b29tIGxldmVsIG9mIHRoZSB3aW5kb3cuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCB6b29tIGxldmVsLlxuICAgICAqL1xuICAgIEdldFpvb20oKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShHZXRab29tTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBoZWlnaHQgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IGhlaWdodCBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIEhlaWdodCgpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEhlaWdodE1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGlkZXMgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBIaWRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEhpZGVNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgd2luZG93IGlzIGZvY3VzZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSB3aW5kb3cgaXMgY3VycmVudGx5IGZvY3VzZWQuXG4gICAgICovXG4gICAgSXNGb2N1c2VkKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKElzRm9jdXNlZE1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB3aW5kb3cgaXMgZnVsbHNjcmVlbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIHdpbmRvdyBpcyBjdXJyZW50bHkgZnVsbHNjcmVlbi5cbiAgICAgKi9cbiAgICBJc0Z1bGxzY3JlZW4oKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oSXNGdWxsc2NyZWVuTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHdpbmRvdyBpcyBtYXhpbWlzZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSB3aW5kb3cgaXMgY3VycmVudGx5IG1heGltaXNlZC5cbiAgICAgKi9cbiAgICBJc01heGltaXNlZCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShJc01heGltaXNlZE1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB3aW5kb3cgaXMgbWluaW1pc2VkLlxuICAgICAqXG4gICAgICogQHJldHVybnMgV2hldGhlciB0aGUgd2luZG93IGlzIGN1cnJlbnRseSBtaW5pbWlzZWQuXG4gICAgICovXG4gICAgSXNNaW5pbWlzZWQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oSXNNaW5pbWlzZWRNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1heGltaXNlcyB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIE1heGltaXNlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKE1heGltaXNlTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNaW5pbWlzZXMgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBNaW5pbWlzZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShNaW5pbWlzZU1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgd2luZG93LlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIG5hbWUgb2YgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBOYW1lKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oTmFtZU1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3BlbnMgdGhlIGRldmVsb3BtZW50IHRvb2xzIHBhbmUuXG4gICAgICovXG4gICAgT3BlbkRldlRvb2xzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKE9wZW5EZXZUb29sc01ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcmVsYXRpdmUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdyB0byB0aGUgc2NyZWVuLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIGN1cnJlbnQgcmVsYXRpdmUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBSZWxhdGl2ZVBvc2l0aW9uKCk6IFByb21pc2U8UG9zaXRpb24+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShSZWxhdGl2ZVBvc2l0aW9uTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWxvYWRzIHRoZSBwYWdlIGFzc2V0cy5cbiAgICAgKi9cbiAgICBSZWxvYWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oUmVsb2FkTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHdpbmRvdyBpcyByZXNpemFibGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSB3aW5kb3cgaXMgY3VycmVudGx5IHJlc2l6YWJsZS5cbiAgICAgKi9cbiAgICBSZXNpemFibGUoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oUmVzaXphYmxlTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXN0b3JlcyB0aGUgd2luZG93IHRvIGl0cyBwcmV2aW91cyBzdGF0ZSBpZiBpdCB3YXMgcHJldmlvdXNseSBtaW5pbWlzZWQsIG1heGltaXNlZCBvciBmdWxsc2NyZWVuLlxuICAgICAqL1xuICAgIFJlc3RvcmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oUmVzdG9yZU1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB4IC0gVGhlIGRlc2lyZWQgaG9yaXpvbnRhbCBhYnNvbHV0ZSBwb3NpdGlvbiBvZiB0aGUgd2luZG93LlxuICAgICAqIEBwYXJhbSB5IC0gVGhlIGRlc2lyZWQgdmVydGljYWwgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBTZXRQb3NpdGlvbih4OiBudW1iZXIsIHk6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFNldFBvc2l0aW9uTWV0aG9kLCB7IHgsIHkgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgd2luZG93IHRvIGJlIGFsd2F5cyBvbiB0b3AuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYWx3YXlzT25Ub3AgLSBXaGV0aGVyIHRoZSB3aW5kb3cgc2hvdWxkIHN0YXkgb24gdG9wLlxuICAgICAqL1xuICAgIFNldEFsd2F5c09uVG9wKGFsd2F5c09uVG9wOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2V0QWx3YXlzT25Ub3BNZXRob2QsIHsgYWx3YXlzT25Ub3AgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgYmFja2dyb3VuZCBjb2xvdXIgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByIC0gVGhlIGRlc2lyZWQgcmVkIGNvbXBvbmVudCBvZiB0aGUgd2luZG93IGJhY2tncm91bmQuXG4gICAgICogQHBhcmFtIGcgLSBUaGUgZGVzaXJlZCBncmVlbiBjb21wb25lbnQgb2YgdGhlIHdpbmRvdyBiYWNrZ3JvdW5kLlxuICAgICAqIEBwYXJhbSBiIC0gVGhlIGRlc2lyZWQgYmx1ZSBjb21wb25lbnQgb2YgdGhlIHdpbmRvdyBiYWNrZ3JvdW5kLlxuICAgICAqIEBwYXJhbSBhIC0gVGhlIGRlc2lyZWQgYWxwaGEgY29tcG9uZW50IG9mIHRoZSB3aW5kb3cgYmFja2dyb3VuZC5cbiAgICAgKi9cbiAgICBTZXRCYWNrZ3JvdW5kQ29sb3VyKHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIsIGE6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFNldEJhY2tncm91bmRDb2xvdXJNZXRob2QsIHsgciwgZywgYiwgYSB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSB3aW5kb3cgZnJhbWUgYW5kIHRpdGxlIGJhci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmcmFtZWxlc3MgLSBXaGV0aGVyIHRoZSB3aW5kb3cgc2hvdWxkIGJlIGZyYW1lbGVzcy5cbiAgICAgKi9cbiAgICBTZXRGcmFtZWxlc3MoZnJhbWVsZXNzOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2V0RnJhbWVsZXNzTWV0aG9kLCB7IGZyYW1lbGVzcyB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlcyB0aGUgc3lzdGVtIGZ1bGxzY3JlZW4gYnV0dG9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVuYWJsZWQgLSBXaGV0aGVyIHRoZSBmdWxsc2NyZWVuIGJ1dHRvbiBzaG91bGQgYmUgZW5hYmxlZC5cbiAgICAgKi9cbiAgICBTZXRGdWxsc2NyZWVuQnV0dG9uRW5hYmxlZChlbmFibGVkOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2V0RnVsbHNjcmVlbkJ1dHRvbkVuYWJsZWRNZXRob2QsIHsgZW5hYmxlZCB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB3aWR0aCAtIFRoZSBkZXNpcmVkIG1heGltdW0gd2lkdGggb2YgdGhlIHdpbmRvdy5cbiAgICAgKiBAcGFyYW0gaGVpZ2h0IC0gVGhlIGRlc2lyZWQgbWF4aW11bSBoZWlnaHQgb2YgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBTZXRNYXhTaXplKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2V0TWF4U2l6ZU1ldGhvZCwgeyB3aWR0aCwgaGVpZ2h0IH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIG1pbmltdW0gc2l6ZSBvZiB0aGUgd2luZG93LlxuICAgICAqXG4gICAgICogQHBhcmFtIHdpZHRoIC0gVGhlIGRlc2lyZWQgbWluaW11bSB3aWR0aCBvZiB0aGUgd2luZG93LlxuICAgICAqIEBwYXJhbSBoZWlnaHQgLSBUaGUgZGVzaXJlZCBtaW5pbXVtIGhlaWdodCBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFNldE1pblNpemUod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShTZXRNaW5TaXplTWV0aG9kLCB7IHdpZHRoLCBoZWlnaHQgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcmVsYXRpdmUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdyB0byB0aGUgc2NyZWVuLlxuICAgICAqXG4gICAgICogQHBhcmFtIHggLSBUaGUgZGVzaXJlZCBob3Jpem9udGFsIHJlbGF0aXZlIHBvc2l0aW9uIG9mIHRoZSB3aW5kb3cuXG4gICAgICogQHBhcmFtIHkgLSBUaGUgZGVzaXJlZCB2ZXJ0aWNhbCByZWxhdGl2ZSBwb3NpdGlvbiBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFNldFJlbGF0aXZlUG9zaXRpb24oeDogbnVtYmVyLCB5OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShTZXRSZWxhdGl2ZVBvc2l0aW9uTWV0aG9kLCB7IHgsIHkgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB3aGV0aGVyIHRoZSB3aW5kb3cgaXMgcmVzaXphYmxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlc2l6YWJsZSAtIFdoZXRoZXIgdGhlIHdpbmRvdyBzaG91bGQgYmUgcmVzaXphYmxlLlxuICAgICAqL1xuICAgIFNldFJlc2l6YWJsZShyZXNpemFibGU6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShTZXRSZXNpemFibGVNZXRob2QsIHsgcmVzaXphYmxlIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHNpemUgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB3aWR0aCAtIFRoZSBkZXNpcmVkIHdpZHRoIG9mIHRoZSB3aW5kb3cuXG4gICAgICogQHBhcmFtIGhlaWdodCAtIFRoZSBkZXNpcmVkIGhlaWdodCBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFNldFNpemUod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShTZXRTaXplTWV0aG9kLCB7IHdpZHRoLCBoZWlnaHQgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdGl0bGUgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0aXRsZSAtIFRoZSBkZXNpcmVkIHRpdGxlIG9mIHRoZSB3aW5kb3cuXG4gICAgICovXG4gICAgU2V0VGl0bGUodGl0bGU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFNldFRpdGxlTWV0aG9kLCB7IHRpdGxlIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHpvb20gbGV2ZWwgb2YgdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB6b29tIC0gVGhlIGRlc2lyZWQgem9vbSBsZXZlbC5cbiAgICAgKi9cbiAgICBTZXRab29tKHpvb206IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFNldFpvb21NZXRob2QsIHsgem9vbSB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTaG93cyB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFNob3coKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2hvd01ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgd2luZG93LlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFNpemUoKTogUHJvbWlzZTxTaXplPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2l6ZU1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG9nZ2xlcyB0aGUgd2luZG93IGJldHdlZW4gZnVsbHNjcmVlbiBhbmQgbm9ybWFsLlxuICAgICAqL1xuICAgIFRvZ2dsZUZ1bGxzY3JlZW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oVG9nZ2xlRnVsbHNjcmVlbk1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG9nZ2xlcyB0aGUgd2luZG93IGJldHdlZW4gbWF4aW1pc2VkIGFuZCBub3JtYWwuXG4gICAgICovXG4gICAgVG9nZ2xlTWF4aW1pc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oVG9nZ2xlTWF4aW1pc2VNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVuLWZ1bGxzY3JlZW5zIHRoZSB3aW5kb3cuXG4gICAgICovXG4gICAgVW5GdWxsc2NyZWVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFVuRnVsbHNjcmVlbk1ldGhvZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVW4tbWF4aW1pc2VzIHRoZSB3aW5kb3cuXG4gICAgICovXG4gICAgVW5NYXhpbWlzZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShVbk1heGltaXNlTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVbi1taW5pbWlzZXMgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBVbk1pbmltaXNlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFVuTWluaW1pc2VNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHdpZHRoIG9mIHRoZSB3aW5kb3cuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCB3aWR0aCBvZiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIFdpZHRoKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oV2lkdGhNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFpvb21zIHRoZSB3aW5kb3cuXG4gICAgICovXG4gICAgWm9vbSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShab29tTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbmNyZWFzZXMgdGhlIHpvb20gbGV2ZWwgb2YgdGhlIHdlYnZpZXcgY29udGVudC5cbiAgICAgKi9cbiAgICBab29tSW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oWm9vbUluTWV0aG9kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWNyZWFzZXMgdGhlIHpvb20gbGV2ZWwgb2YgdGhlIHdlYnZpZXcgY29udGVudC5cbiAgICAgKi9cbiAgICBab29tT3V0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFpvb21PdXRNZXRob2QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUgem9vbSBsZXZlbCBvZiB0aGUgd2VidmlldyBjb250ZW50LlxuICAgICAqL1xuICAgIFpvb21SZXNldCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShab29tUmVzZXRNZXRob2QpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBUaGUgd2luZG93IHdpdGhpbiB3aGljaCB0aGUgc2NyaXB0IGlzIHJ1bm5pbmcuXG4gKi9cbmNvbnN0IHRoaXNXaW5kb3cgPSBuZXcgV2luZG93KCcnKTtcblxuZXhwb3J0IGRlZmF1bHQgdGhpc1dpbmRvdztcbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuaW1wb3J0ICogYXMgUnVudGltZSBmcm9tIFwiLi4vQHdhaWxzaW8vcnVudGltZS9zcmNcIjtcblxuLy8gTk9URTogdGhlIGZvbGxvd2luZyBtZXRob2RzIE1VU1QgYmUgaW1wb3J0ZWQgZXhwbGljaXRseSBiZWNhdXNlIG9mIGhvdyBlc2J1aWxkIGluamVjdGlvbiB3b3Jrc1xuaW1wb3J0IHsgRW5hYmxlIGFzIEVuYWJsZVdNTCB9IGZyb20gXCIuLi9Ad2FpbHNpby9ydW50aW1lL3NyYy93bWxcIjtcbmltcG9ydCB7IGRlYnVnTG9nIH0gZnJvbSBcIi4uL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3V0aWxzXCI7XG5cbndpbmRvdy53YWlscyA9IFJ1bnRpbWU7XG5FbmFibGVXTUwoKTtcblxuaWYgKERFQlVHKSB7XG4gICAgZGVidWdMb2coXCJXYWlscyBSdW50aW1lIExvYWRlZFwiKVxufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5pbXBvcnQgeyBuZXdSdW50aW1lQ2FsbGVyLCBvYmplY3ROYW1lcyB9IGZyb20gXCIuL3J1bnRpbWUuanNcIjtcblxuY29uc3QgY2FsbCA9IG5ld1J1bnRpbWVDYWxsZXIob2JqZWN0TmFtZXMuU3lzdGVtKTtcblxuY29uc3QgU3lzdGVtSXNEYXJrTW9kZSA9IDA7XG5jb25zdCBTeXN0ZW1FbnZpcm9ubWVudCA9IDE7XG5cbmNvbnN0IF9pbnZva2UgPSAoZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICgod2luZG93IGFzIGFueSkuY2hyb21lPy53ZWJ2aWV3Py5wb3N0TWVzc2FnZSkge1xuICAgICAgICAgICAgcmV0dXJuICh3aW5kb3cgYXMgYW55KS5jaHJvbWUud2Vidmlldy5wb3N0TWVzc2FnZS5iaW5kKCh3aW5kb3cgYXMgYW55KS5jaHJvbWUud2Vidmlldyk7XG4gICAgICAgIH0gZWxzZSBpZiAoKHdpbmRvdyBhcyBhbnkpLndlYmtpdD8ubWVzc2FnZUhhbmRsZXJzPy5bJ2V4dGVybmFsJ10/LnBvc3RNZXNzYWdlKSB7XG4gICAgICAgICAgICByZXR1cm4gKHdpbmRvdyBhcyBhbnkpLndlYmtpdC5tZXNzYWdlSGFuZGxlcnNbJ2V4dGVybmFsJ10ucG9zdE1lc3NhZ2UuYmluZCgod2luZG93IGFzIGFueSkud2Via2l0Lm1lc3NhZ2VIYW5kbGVyc1snZXh0ZXJuYWwnXSk7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoKGUpIHt9XG5cbiAgICBjb25zb2xlLndhcm4oJ1xcbiVjXHUyNkEwXHVGRTBGIEJyb3dzZXIgRW52aXJvbm1lbnQgRGV0ZWN0ZWQgJWNcXG5cXG4lY09ubHkgVUkgcHJldmlld3MgYXJlIGF2YWlsYWJsZSBpbiB0aGUgYnJvd3Nlci4gRm9yIGZ1bGwgZnVuY3Rpb25hbGl0eSwgcGxlYXNlIHJ1biB0aGUgYXBwbGljYXRpb24gaW4gZGVza3RvcCBtb2RlLlxcbk1vcmUgaW5mb3JtYXRpb24gYXQ6IGh0dHBzOi8vdjMud2FpbHMuaW8vbGVhcm4vYnVpbGQvI3VzaW5nLWEtYnJvd3Nlci1mb3ItZGV2ZWxvcG1lbnRcXG4nLFxuICAgICAgICAnYmFja2dyb3VuZDogI2ZmZmZmZjsgY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyBwYWRkaW5nOiA0cHggOHB4OyBib3JkZXItcmFkaXVzOiA0cHg7IGJvcmRlcjogMnB4IHNvbGlkICMwMDAwMDA7JyxcbiAgICAgICAgJ2JhY2tncm91bmQ6IHRyYW5zcGFyZW50OycsXG4gICAgICAgICdjb2xvcjogI2ZmZmZmZjsgZm9udC1zdHlsZTogaXRhbGljOyBmb250LXdlaWdodDogYm9sZDsnKTtcbiAgICByZXR1cm4gbnVsbDtcbn0pKCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnZva2UobXNnOiBhbnkpOiB2b2lkIHtcbiAgICBfaW52b2tlPy4obXNnKTtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIHN5c3RlbSBkYXJrIG1vZGUgc3RhdHVzLlxuICpcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGEgYm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIGlmIHRoZSBzeXN0ZW0gaXMgaW4gZGFyayBtb2RlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSXNEYXJrTW9kZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gY2FsbChTeXN0ZW1Jc0RhcmtNb2RlKTtcbn1cblxuLyoqXG4gKiBGZXRjaGVzIHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhlIGFwcGxpY2F0aW9uIGZyb20gdGhlIHNlcnZlci5cbiAqXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgY2FwYWJpbGl0aWVzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gQ2FwYWJpbGl0aWVzKCk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGxldCByZXNwb25zZSA9IGF3YWl0IGZldGNoKFwiL3dhaWxzL2NhcGFiaWxpdGllc1wiKTtcbiAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjb3VsZCBub3QgZmV0Y2ggY2FwYWJpbGl0aWVzOiBcIiArIHJlc3BvbnNlLnN0YXR1c1RleHQpO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBPU0luZm8ge1xuICAgIC8qKiBUaGUgYnJhbmRpbmcgb2YgdGhlIE9TLiAqL1xuICAgIEJyYW5kaW5nOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBJRCBvZiB0aGUgT1MuICovXG4gICAgSUQ6IHN0cmluZztcbiAgICAvKiogVGhlIG5hbWUgb2YgdGhlIE9TLiAqL1xuICAgIE5hbWU6IHN0cmluZztcbiAgICAvKiogVGhlIHZlcnNpb24gb2YgdGhlIE9TLiAqL1xuICAgIFZlcnNpb246IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbnZpcm9ubWVudEluZm8ge1xuICAgIC8qKiBUaGUgYXJjaGl0ZWN0dXJlIG9mIHRoZSBzeXN0ZW0uICovXG4gICAgQXJjaDogc3RyaW5nO1xuICAgIC8qKiBUcnVlIGlmIHRoZSBhcHBsaWNhdGlvbiBpcyBydW5uaW5nIGluIGRlYnVnIG1vZGUsIG90aGVyd2lzZSBmYWxzZS4gKi9cbiAgICBEZWJ1ZzogYm9vbGVhbjtcbiAgICAvKiogVGhlIG9wZXJhdGluZyBzeXN0ZW0gaW4gdXNlLiAqL1xuICAgIE9TOiBzdHJpbmc7XG4gICAgLyoqIERldGFpbHMgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0uICovXG4gICAgT1NJbmZvOiBPU0luZm87XG4gICAgLyoqIEFkZGl0aW9uYWwgcGxhdGZvcm0gaW5mb3JtYXRpb24uICovXG4gICAgUGxhdGZvcm1JbmZvOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyBlbnZpcm9ubWVudCBkZXRhaWxzLlxuICpcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIG9iamVjdCBjb250YWluaW5nIE9TIGFuZCBzeXN0ZW0gYXJjaGl0ZWN0dXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gRW52aXJvbm1lbnQoKTogUHJvbWlzZTxFbnZpcm9ubWVudEluZm8+IHtcbiAgICByZXR1cm4gY2FsbChTeXN0ZW1FbnZpcm9ubWVudCk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBjdXJyZW50IG9wZXJhdGluZyBzeXN0ZW0gaXMgV2luZG93cy5cbiAqXG4gKiBAcmV0dXJuIFRydWUgaWYgdGhlIG9wZXJhdGluZyBzeXN0ZW0gaXMgV2luZG93cywgb3RoZXJ3aXNlIGZhbHNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSXNXaW5kb3dzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB3aW5kb3cuX3dhaWxzLmVudmlyb25tZW50Lk9TID09PSBcIndpbmRvd3NcIjtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGN1cnJlbnQgb3BlcmF0aW5nIHN5c3RlbSBpcyBMaW51eC5cbiAqXG4gKiBAcmV0dXJucyBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgb3BlcmF0aW5nIHN5c3RlbSBpcyBMaW51eCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSXNMaW51eCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gd2luZG93Ll93YWlscy5lbnZpcm9ubWVudC5PUyA9PT0gXCJsaW51eFwiO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgY3VycmVudCBlbnZpcm9ubWVudCBpcyBhIG1hY09TIG9wZXJhdGluZyBzeXN0ZW0uXG4gKlxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgZW52aXJvbm1lbnQgaXMgbWFjT1MsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIElzTWFjKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB3aW5kb3cuX3dhaWxzLmVudmlyb25tZW50Lk9TID09PSBcImRhcndpblwiO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgY3VycmVudCBlbnZpcm9ubWVudCBhcmNoaXRlY3R1cmUgaXMgQU1ENjQuXG4gKlxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgY3VycmVudCBlbnZpcm9ubWVudCBhcmNoaXRlY3R1cmUgaXMgQU1ENjQsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIElzQU1ENjQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHdpbmRvdy5fd2FpbHMuZW52aXJvbm1lbnQuQXJjaCA9PT0gXCJhbWQ2NFwiO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgY3VycmVudCBhcmNoaXRlY3R1cmUgaXMgQVJNLlxuICpcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGN1cnJlbnQgYXJjaGl0ZWN0dXJlIGlzIEFSTSwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSXNBUk0oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHdpbmRvdy5fd2FpbHMuZW52aXJvbm1lbnQuQXJjaCA9PT0gXCJhcm1cIjtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgaXMgQVJNNjQgYXJjaGl0ZWN0dXJlLlxuICpcbiAqIEByZXR1cm5zIFJldHVybnMgdHJ1ZSBpZiB0aGUgZW52aXJvbm1lbnQgaXMgQVJNNjQgYXJjaGl0ZWN0dXJlLCBvdGhlcndpc2UgcmV0dXJucyBmYWxzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIElzQVJNNjQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHdpbmRvdy5fd2FpbHMuZW52aXJvbm1lbnQuQXJjaCA9PT0gXCJhcm02NFwiO1xufVxuXG4vKipcbiAqIFJlcG9ydHMgd2hldGhlciB0aGUgYXBwIGlzIGJlaW5nIHJ1biBpbiBkZWJ1ZyBtb2RlLlxuICpcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGFwcCBpcyBiZWluZyBydW4gaW4gZGVidWcgbW9kZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIElzRGVidWcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEJvb2xlYW4od2luZG93Ll93YWlscy5lbnZpcm9ubWVudC5EZWJ1Zyk7XG59XG5cbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuaW1wb3J0IHsgbmV3UnVudGltZUNhbGxlciwgb2JqZWN0TmFtZXMgfSBmcm9tIFwiLi9ydW50aW1lLmpzXCI7XG5pbXBvcnQgeyBJc0RlYnVnIH0gZnJvbSBcIi4vc3lzdGVtLmpzXCI7XG5pbXBvcnQgeyBldmVudFRhcmdldCB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbi8vIHNldHVwXG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCBjb250ZXh0TWVudUhhbmRsZXIpO1xuXG5jb25zdCBjYWxsID0gbmV3UnVudGltZUNhbGxlcihvYmplY3ROYW1lcy5Db250ZXh0TWVudSk7XG5cbmNvbnN0IENvbnRleHRNZW51T3BlbiA9IDA7XG5cbmZ1bmN0aW9uIG9wZW5Db250ZXh0TWVudShpZDogc3RyaW5nLCB4OiBudW1iZXIsIHk6IG51bWJlciwgZGF0YTogYW55KTogdm9pZCB7XG4gICAgdm9pZCBjYWxsKENvbnRleHRNZW51T3Blbiwge2lkLCB4LCB5LCBkYXRhfSk7XG59XG5cbmZ1bmN0aW9uIGNvbnRleHRNZW51SGFuZGxlcihldmVudDogTW91c2VFdmVudCkge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50VGFyZ2V0KGV2ZW50KTtcblxuICAgIC8vIENoZWNrIGZvciBjdXN0b20gY29udGV4dCBtZW51XG4gICAgY29uc3QgY3VzdG9tQ29udGV4dE1lbnUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXQpLmdldFByb3BlcnR5VmFsdWUoXCItLWN1c3RvbS1jb250ZXh0bWVudVwiKS50cmltKCk7XG5cbiAgICBpZiAoY3VzdG9tQ29udGV4dE1lbnUpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRhcmdldCkuZ2V0UHJvcGVydHlWYWx1ZShcIi0tY3VzdG9tLWNvbnRleHRtZW51LWRhdGFcIik7XG4gICAgICAgIG9wZW5Db250ZXh0TWVudShjdXN0b21Db250ZXh0TWVudSwgZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSwgZGF0YSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcHJvY2Vzc0RlZmF1bHRDb250ZXh0TWVudShldmVudCwgdGFyZ2V0KTtcbiAgICB9XG59XG5cblxuLypcbi0tZGVmYXVsdC1jb250ZXh0bWVudTogYXV0bzsgKGRlZmF1bHQpIHdpbGwgc2hvdyB0aGUgZGVmYXVsdCBjb250ZXh0IG1lbnUgaWYgY29udGVudEVkaXRhYmxlIGlzIHRydWUgT1IgdGV4dCBoYXMgYmVlbiBzZWxlY3RlZCBPUiBlbGVtZW50IGlzIGlucHV0IG9yIHRleHRhcmVhXG4tLWRlZmF1bHQtY29udGV4dG1lbnU6IHNob3c7IHdpbGwgYWx3YXlzIHNob3cgdGhlIGRlZmF1bHQgY29udGV4dCBtZW51XG4tLWRlZmF1bHQtY29udGV4dG1lbnU6IGhpZGU7IHdpbGwgYWx3YXlzIGhpZGUgdGhlIGRlZmF1bHQgY29udGV4dCBtZW51XG5cblRoaXMgcnVsZSBpcyBpbmhlcml0ZWQgbGlrZSBub3JtYWwgQ1NTIHJ1bGVzLCBzbyBuZXN0aW5nIHdvcmtzIGFzIGV4cGVjdGVkXG4qL1xuZnVuY3Rpb24gcHJvY2Vzc0RlZmF1bHRDb250ZXh0TWVudShldmVudDogTW91c2VFdmVudCwgdGFyZ2V0OiBIVE1MRWxlbWVudCkge1xuICAgIC8vIERlYnVnIGJ1aWxkcyBhbHdheXMgc2hvdyB0aGUgbWVudVxuICAgIGlmIChJc0RlYnVnKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFByb2Nlc3MgZGVmYXVsdCBjb250ZXh0IG1lbnVcbiAgICBzd2l0Y2ggKHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRhcmdldCkuZ2V0UHJvcGVydHlWYWx1ZShcIi0tZGVmYXVsdC1jb250ZXh0bWVudVwiKS50cmltKCkpIHtcbiAgICAgICAgY2FzZSAnc2hvdyc6XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgJ2hpZGUnOlxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBjb250ZW50RWRpdGFibGUgaXMgdHJ1ZVxuICAgIGlmICh0YXJnZXQuaXNDb250ZW50RWRpdGFibGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHRleHQgaGFzIGJlZW4gc2VsZWN0ZWRcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgY29uc3QgaGFzU2VsZWN0aW9uID0gc2VsZWN0aW9uICYmIHNlbGVjdGlvbi50b1N0cmluZygpLmxlbmd0aCA+IDA7XG4gICAgaWYgKGhhc1NlbGVjdGlvbikge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlbGVjdGlvbi5yYW5nZUNvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoaSk7XG4gICAgICAgICAgICBjb25zdCByZWN0cyA9IHJhbmdlLmdldENsaWVudFJlY3RzKCk7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJlY3RzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVjdCA9IHJlY3RzW2pdO1xuICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KHJlY3QubGVmdCwgcmVjdC50b3ApID09PSB0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHRhZyBpcyBpbnB1dCBvciB0ZXh0YXJlYS5cbiAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCB8fCB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MVGV4dEFyZWFFbGVtZW50KSB7XG4gICAgICAgIGlmIChoYXNTZWxlY3Rpb24gfHwgKCF0YXJnZXQucmVhZE9ubHkgJiYgIXRhcmdldC5kaXNhYmxlZCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGhpZGUgZGVmYXVsdCBjb250ZXh0IG1lbnVcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IGZyb20gdGhlIGZsYWcgbWFwLlxuICpcbiAqIEBwYXJhbSBrZXkgLSBUaGUga2V5IHRvIHJldHJpZXZlIHRoZSB2YWx1ZSBmb3IuXG4gKiBAcmV0dXJuIFRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBrZXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBHZXRGbGFnKGtleTogc3RyaW5nKTogYW55IHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gd2luZG93Ll93YWlscy5mbGFnc1trZXldO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5hYmxlIHRvIHJldHJpZXZlIGZsYWcgJ1wiICsga2V5ICsgXCInOiBcIiArIGUsIHsgY2F1c2U6IGUgfSk7XG4gICAgfVxufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5pbXBvcnQgeyBpbnZva2UsIElzV2luZG93cyB9IGZyb20gXCIuL3N5c3RlbS5qc1wiO1xuaW1wb3J0IHsgR2V0RmxhZyB9IGZyb20gXCIuL2ZsYWdzLmpzXCI7XG5pbXBvcnQgeyBjYW5UcmFja0J1dHRvbnMsIGV2ZW50VGFyZ2V0IH0gZnJvbSBcIi4vdXRpbHMuanNcIjtcblxuLy8gU2V0dXBcbmxldCBjYW5EcmFnID0gZmFsc2U7XG5sZXQgZHJhZ2dpbmcgPSBmYWxzZTtcblxubGV0IHJlc2l6YWJsZSA9IGZhbHNlO1xubGV0IGNhblJlc2l6ZSA9IGZhbHNlO1xubGV0IHJlc2l6aW5nID0gZmFsc2U7XG5sZXQgcmVzaXplRWRnZTogc3RyaW5nID0gXCJcIjtcbmxldCBkZWZhdWx0Q3Vyc29yID0gXCJhdXRvXCI7XG5cbmxldCBidXR0b25zID0gMDtcbmNvbnN0IGJ1dHRvbnNUcmFja2VkID0gY2FuVHJhY2tCdXR0b25zKCk7XG5cbndpbmRvdy5fd2FpbHMgPSB3aW5kb3cuX3dhaWxzIHx8IHt9O1xud2luZG93Ll93YWlscy5zZXRSZXNpemFibGUgPSAodmFsdWU6IGJvb2xlYW4pOiB2b2lkID0+IHtcbiAgICByZXNpemFibGUgPSB2YWx1ZTtcbiAgICBpZiAoIXJlc2l6YWJsZSkge1xuICAgICAgICAvLyBTdG9wIHJlc2l6aW5nIGlmIGluIHByb2dyZXNzLlxuICAgICAgICBjYW5SZXNpemUgPSByZXNpemluZyA9IGZhbHNlO1xuICAgICAgICBzZXRSZXNpemUoKTtcbiAgICB9XG59O1xuXG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdXBkYXRlLCB7IGNhcHR1cmU6IHRydWUgfSk7XG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdXBkYXRlLCB7IGNhcHR1cmU6IHRydWUgfSk7XG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHVwZGF0ZSwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuZm9yIChjb25zdCBldiBvZiBbJ2NsaWNrJywgJ2NvbnRleHRtZW51JywgJ2RibGNsaWNrJ10pIHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihldiwgc3VwcHJlc3NFdmVudCwgeyBjYXB0dXJlOiB0cnVlIH0pO1xufVxuXG5mdW5jdGlvbiBzdXBwcmVzc0V2ZW50KGV2ZW50OiBFdmVudCkge1xuICAgIC8vIFN1cHByZXNzIGNsaWNrIGV2ZW50cyB3aGlsZSByZXNpemluZyBvciBkcmFnZ2luZy5cbiAgICBpZiAoZHJhZ2dpbmcgfHwgcmVzaXppbmcpIHtcbiAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbn1cblxuLy8gVXNlIGNvbnN0YW50cyB0byBhdm9pZCBjb21wYXJpbmcgc3RyaW5ncyBtdWx0aXBsZSB0aW1lcy5cbmNvbnN0IE1vdXNlRG93biA9IDA7XG5jb25zdCBNb3VzZVVwICAgPSAxO1xuY29uc3QgTW91c2VNb3ZlID0gMjtcblxuZnVuY3Rpb24gdXBkYXRlKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgLy8gV2luZG93cyBzdXBwcmVzc2VzIG1vdXNlIGV2ZW50cyBhdCB0aGUgZW5kIG9mIGRyYWdnaW5nIG9yIHJlc2l6aW5nLFxuICAgIC8vIHNvIHdlIG5lZWQgdG8gYmUgc21hcnQgYW5kIHN5bnRoZXNpemUgYnV0dG9uIGV2ZW50cy5cblxuICAgIGxldCBldmVudFR5cGU6IG51bWJlciwgZXZlbnRCdXR0b25zID0gZXZlbnQuYnV0dG9ucztcbiAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHtcbiAgICAgICAgY2FzZSAnbW91c2Vkb3duJzpcbiAgICAgICAgICAgIGV2ZW50VHlwZSA9IE1vdXNlRG93bjtcbiAgICAgICAgICAgIGlmICghYnV0dG9uc1RyYWNrZWQpIHsgZXZlbnRCdXR0b25zID0gYnV0dG9ucyB8ICgxIDw8IGV2ZW50LmJ1dHRvbik7IH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdtb3VzZXVwJzpcbiAgICAgICAgICAgIGV2ZW50VHlwZSA9IE1vdXNlVXA7XG4gICAgICAgICAgICBpZiAoIWJ1dHRvbnNUcmFja2VkKSB7IGV2ZW50QnV0dG9ucyA9IGJ1dHRvbnMgJiB+KDEgPDwgZXZlbnQuYnV0dG9uKTsgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBldmVudFR5cGUgPSBNb3VzZU1vdmU7XG4gICAgICAgICAgICBpZiAoIWJ1dHRvbnNUcmFja2VkKSB7IGV2ZW50QnV0dG9ucyA9IGJ1dHRvbnM7IH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGxldCByZWxlYXNlZCA9IGJ1dHRvbnMgJiB+ZXZlbnRCdXR0b25zO1xuICAgIGxldCBwcmVzc2VkID0gZXZlbnRCdXR0b25zICYgfmJ1dHRvbnM7XG5cbiAgICBidXR0b25zID0gZXZlbnRCdXR0b25zO1xuXG4gICAgLy8gU3ludGhlc2l6ZSBhIHJlbGVhc2UtcHJlc3Mgc2VxdWVuY2UgaWYgd2UgZGV0ZWN0IGEgcHJlc3Mgb2YgYW4gYWxyZWFkeSBwcmVzc2VkIGJ1dHRvbi5cbiAgICBpZiAoZXZlbnRUeXBlID09PSBNb3VzZURvd24gJiYgIShwcmVzc2VkICYgZXZlbnQuYnV0dG9uKSkge1xuICAgICAgICByZWxlYXNlZCB8PSAoMSA8PCBldmVudC5idXR0b24pO1xuICAgICAgICBwcmVzc2VkIHw9ICgxIDw8IGV2ZW50LmJ1dHRvbik7XG4gICAgfVxuXG4gICAgLy8gU3VwcHJlc3MgYWxsIGJ1dHRvbiBldmVudHMgZHVyaW5nIGRyYWdnaW5nIGFuZCByZXNpemluZyxcbiAgICAvLyB1bmxlc3MgdGhpcyBpcyBhIG1vdXNldXAgZXZlbnQgdGhhdCBpcyBlbmRpbmcgYSBkcmFnIGFjdGlvbi5cbiAgICBpZiAoXG4gICAgICAgIGV2ZW50VHlwZSAhPT0gTW91c2VNb3ZlIC8vIEZhc3QgcGF0aCBmb3IgbW91c2Vtb3ZlXG4gICAgICAgICYmIHJlc2l6aW5nXG4gICAgICAgIHx8IChcbiAgICAgICAgICAgIGRyYWdnaW5nXG4gICAgICAgICAgICAmJiAoXG4gICAgICAgICAgICAgICAgZXZlbnRUeXBlID09PSBNb3VzZURvd25cbiAgICAgICAgICAgICAgICB8fCBldmVudC5idXR0b24gIT09IDBcbiAgICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICkge1xuICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHJlbGVhc2VzXG4gICAgaWYgKHJlbGVhc2VkICYgMSkgeyBwcmltYXJ5VXAoZXZlbnQpOyB9XG4gICAgLy8gSGFuZGxlIHByZXNzZXNcbiAgICBpZiAocHJlc3NlZCAmIDEpIHsgcHJpbWFyeURvd24oZXZlbnQpOyB9XG5cbiAgICAvLyBIYW5kbGUgbW91c2Vtb3ZlXG4gICAgaWYgKGV2ZW50VHlwZSA9PT0gTW91c2VNb3ZlKSB7IG9uTW91c2VNb3ZlKGV2ZW50KTsgfTtcbn1cblxuZnVuY3Rpb24gcHJpbWFyeURvd24oZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBSZXNldCByZWFkaW5lc3Mgc3RhdGUuXG4gICAgY2FuRHJhZyA9IGZhbHNlO1xuICAgIGNhblJlc2l6ZSA9IGZhbHNlO1xuXG4gICAgLy8gSWdub3JlIHJlcGVhdGVkIGNsaWNrcyBvbiBtYWNPUyBhbmQgTGludXguXG4gICAgaWYgKCFJc1dpbmRvd3MoKSkge1xuICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ21vdXNlZG93bicgJiYgZXZlbnQuYnV0dG9uID09PSAwICYmIGV2ZW50LmRldGFpbCAhPT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJlc2l6ZUVkZ2UpIHtcbiAgICAgICAgLy8gUmVhZHkgdG8gcmVzaXplIGlmIHRoZSBwcmltYXJ5IGJ1dHRvbiB3YXMgcHJlc3NlZCBmb3IgdGhlIGZpcnN0IHRpbWUuXG4gICAgICAgIGNhblJlc2l6ZSA9IHRydWU7XG4gICAgICAgIC8vIERvIG5vdCBzdGFydCBkcmFnIG9wZXJhdGlvbnMgd2hlbiBvbiByZXNpemUgZWRnZXMuXG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBSZXRyaWV2ZSB0YXJnZXQgZWxlbWVudFxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50VGFyZ2V0KGV2ZW50KTtcblxuICAgIC8vIFJlYWR5IHRvIGRyYWcgaWYgdGhlIHByaW1hcnkgYnV0dG9uIHdhcyBwcmVzc2VkIGZvciB0aGUgZmlyc3QgdGltZSBvbiBhIGRyYWdnYWJsZSBlbGVtZW50LlxuICAgIC8vIElnbm9yZSBjbGlja3Mgb24gdGhlIHNjcm9sbGJhci5cbiAgICBjb25zdCBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRhcmdldCk7XG4gICAgY2FuRHJhZyA9IChcbiAgICAgICAgc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShcIi0td2FpbHMtZHJhZ2dhYmxlXCIpLnRyaW0oKSA9PT0gXCJkcmFnXCJcbiAgICAgICAgJiYgKFxuICAgICAgICAgICAgZXZlbnQub2Zmc2V0WCAtIHBhcnNlRmxvYXQoc3R5bGUucGFkZGluZ0xlZnQpIDwgdGFyZ2V0LmNsaWVudFdpZHRoXG4gICAgICAgICAgICAmJiBldmVudC5vZmZzZXRZIC0gcGFyc2VGbG9hdChzdHlsZS5wYWRkaW5nVG9wKSA8IHRhcmdldC5jbGllbnRIZWlnaHRcbiAgICAgICAgKVxuICAgICk7XG59XG5cbmZ1bmN0aW9uIHByaW1hcnlVcChldmVudDogTW91c2VFdmVudCkge1xuICAgIC8vIFN0b3AgZHJhZ2dpbmcgYW5kIHJlc2l6aW5nLlxuICAgIGNhbkRyYWcgPSBmYWxzZTtcbiAgICBkcmFnZ2luZyA9IGZhbHNlO1xuICAgIGNhblJlc2l6ZSA9IGZhbHNlO1xuICAgIHJlc2l6aW5nID0gZmFsc2U7XG59XG5cbmNvbnN0IGN1cnNvckZvckVkZ2UgPSBPYmplY3QuZnJlZXplKHtcbiAgICBcInNlLXJlc2l6ZVwiOiBcIm53c2UtcmVzaXplXCIsXG4gICAgXCJzdy1yZXNpemVcIjogXCJuZXN3LXJlc2l6ZVwiLFxuICAgIFwibnctcmVzaXplXCI6IFwibndzZS1yZXNpemVcIixcbiAgICBcIm5lLXJlc2l6ZVwiOiBcIm5lc3ctcmVzaXplXCIsXG4gICAgXCJ3LXJlc2l6ZVwiOiBcImV3LXJlc2l6ZVwiLFxuICAgIFwibi1yZXNpemVcIjogXCJucy1yZXNpemVcIixcbiAgICBcInMtcmVzaXplXCI6IFwibnMtcmVzaXplXCIsXG4gICAgXCJlLXJlc2l6ZVwiOiBcImV3LXJlc2l6ZVwiLFxufSlcblxuZnVuY3Rpb24gc2V0UmVzaXplKGVkZ2U/OiBrZXlvZiB0eXBlb2YgY3Vyc29yRm9yRWRnZSk6IHZvaWQge1xuICAgIGlmIChlZGdlKSB7XG4gICAgICAgIGlmICghcmVzaXplRWRnZSkgeyBkZWZhdWx0Q3Vyc29yID0gZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3I7IH1cbiAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3IgPSBjdXJzb3JGb3JFZGdlW2VkZ2VdO1xuICAgIH0gZWxzZSBpZiAoIWVkZ2UgJiYgcmVzaXplRWRnZSkge1xuICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLmN1cnNvciA9IGRlZmF1bHRDdXJzb3I7XG4gICAgfVxuXG4gICAgcmVzaXplRWRnZSA9IGVkZ2UgfHwgXCJcIjtcbn1cblxuZnVuY3Rpb24gb25Nb3VzZU1vdmUoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoY2FuUmVzaXplICYmIHJlc2l6ZUVkZ2UpIHtcbiAgICAgICAgLy8gU3RhcnQgcmVzaXppbmcuXG4gICAgICAgIHJlc2l6aW5nID0gdHJ1ZTtcbiAgICAgICAgaW52b2tlKFwid2FpbHM6cmVzaXplOlwiICsgcmVzaXplRWRnZSk7XG4gICAgfSBlbHNlIGlmIChjYW5EcmFnKSB7XG4gICAgICAgIC8vIFN0YXJ0IGRyYWdnaW5nLlxuICAgICAgICBkcmFnZ2luZyA9IHRydWU7XG4gICAgICAgIGludm9rZShcIndhaWxzOmRyYWdcIik7XG4gICAgfVxuXG4gICAgaWYgKGRyYWdnaW5nIHx8IHJlc2l6aW5nKSB7XG4gICAgICAgIC8vIEVpdGhlciBkcmFnIG9yIHJlc2l6ZSBpcyBvbmdvaW5nLFxuICAgICAgICAvLyByZXNldCByZWFkaW5lc3MgYW5kIHN0b3AgcHJvY2Vzc2luZy5cbiAgICAgICAgY2FuRHJhZyA9IGNhblJlc2l6ZSA9IGZhbHNlO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFyZXNpemFibGUgfHwgIUlzV2luZG93cygpKSB7XG4gICAgICAgIGlmIChyZXNpemVFZGdlKSB7IHNldFJlc2l6ZSgpOyB9XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZXNpemVIYW5kbGVIZWlnaHQgPSBHZXRGbGFnKFwic3lzdGVtLnJlc2l6ZUhhbmRsZUhlaWdodFwiKSB8fCA1O1xuICAgIGNvbnN0IHJlc2l6ZUhhbmRsZVdpZHRoID0gR2V0RmxhZyhcInN5c3RlbS5yZXNpemVIYW5kbGVXaWR0aFwiKSB8fCA1O1xuXG4gICAgLy8gRXh0cmEgcGl4ZWxzIGZvciB0aGUgY29ybmVyIGFyZWFzLlxuICAgIGNvbnN0IGNvcm5lckV4dHJhID0gR2V0RmxhZyhcInJlc2l6ZUNvcm5lckV4dHJhXCIpIHx8IDEwO1xuXG4gICAgY29uc3QgcmlnaHRCb3JkZXIgPSAod2luZG93Lm91dGVyV2lkdGggLSBldmVudC5jbGllbnRYKSA8IHJlc2l6ZUhhbmRsZVdpZHRoO1xuICAgIGNvbnN0IGxlZnRCb3JkZXIgPSBldmVudC5jbGllbnRYIDwgcmVzaXplSGFuZGxlV2lkdGg7XG4gICAgY29uc3QgdG9wQm9yZGVyID0gZXZlbnQuY2xpZW50WSA8IHJlc2l6ZUhhbmRsZUhlaWdodDtcbiAgICBjb25zdCBib3R0b21Cb3JkZXIgPSAod2luZG93Lm91dGVySGVpZ2h0IC0gZXZlbnQuY2xpZW50WSkgPCByZXNpemVIYW5kbGVIZWlnaHQ7XG5cbiAgICAvLyBBZGp1c3QgZm9yIGNvcm5lciBhcmVhcy5cbiAgICBjb25zdCByaWdodENvcm5lciA9ICh3aW5kb3cub3V0ZXJXaWR0aCAtIGV2ZW50LmNsaWVudFgpIDwgKHJlc2l6ZUhhbmRsZVdpZHRoICsgY29ybmVyRXh0cmEpO1xuICAgIGNvbnN0IGxlZnRDb3JuZXIgPSBldmVudC5jbGllbnRYIDwgKHJlc2l6ZUhhbmRsZVdpZHRoICsgY29ybmVyRXh0cmEpO1xuICAgIGNvbnN0IHRvcENvcm5lciA9IGV2ZW50LmNsaWVudFkgPCAocmVzaXplSGFuZGxlSGVpZ2h0ICsgY29ybmVyRXh0cmEpO1xuICAgIGNvbnN0IGJvdHRvbUNvcm5lciA9ICh3aW5kb3cub3V0ZXJIZWlnaHQgLSBldmVudC5jbGllbnRZKSA8IChyZXNpemVIYW5kbGVIZWlnaHQgKyBjb3JuZXJFeHRyYSk7XG5cbiAgICBpZiAoIWxlZnRDb3JuZXIgJiYgIXRvcENvcm5lciAmJiAhYm90dG9tQ29ybmVyICYmICFyaWdodENvcm5lcikge1xuICAgICAgICAvLyBPcHRpbWlzYXRpb246IG91dCBvZiBhbGwgY29ybmVyIGFyZWFzIGltcGxpZXMgb3V0IG9mIGJvcmRlcnMuXG4gICAgICAgIHNldFJlc2l6ZSgpO1xuICAgIH1cbiAgICAvLyBEZXRlY3QgY29ybmVycy5cbiAgICBlbHNlIGlmIChyaWdodENvcm5lciAmJiBib3R0b21Db3JuZXIpIHNldFJlc2l6ZShcInNlLXJlc2l6ZVwiKTtcbiAgICBlbHNlIGlmIChsZWZ0Q29ybmVyICYmIGJvdHRvbUNvcm5lcikgc2V0UmVzaXplKFwic3ctcmVzaXplXCIpO1xuICAgIGVsc2UgaWYgKGxlZnRDb3JuZXIgJiYgdG9wQ29ybmVyKSBzZXRSZXNpemUoXCJudy1yZXNpemVcIik7XG4gICAgZWxzZSBpZiAodG9wQ29ybmVyICYmIHJpZ2h0Q29ybmVyKSBzZXRSZXNpemUoXCJuZS1yZXNpemVcIik7XG4gICAgLy8gRGV0ZWN0IGJvcmRlcnMuXG4gICAgZWxzZSBpZiAobGVmdEJvcmRlcikgc2V0UmVzaXplKFwidy1yZXNpemVcIik7XG4gICAgZWxzZSBpZiAodG9wQm9yZGVyKSBzZXRSZXNpemUoXCJuLXJlc2l6ZVwiKTtcbiAgICBlbHNlIGlmIChib3R0b21Cb3JkZXIpIHNldFJlc2l6ZShcInMtcmVzaXplXCIpO1xuICAgIGVsc2UgaWYgKHJpZ2h0Qm9yZGVyKSBzZXRSZXNpemUoXCJlLXJlc2l6ZVwiKTtcbiAgICAvLyBPdXQgb2YgYm9yZGVyIGFyZWEuXG4gICAgZWxzZSBzZXRSZXNpemUoKTtcbn1cbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuaW1wb3J0IHsgbmV3UnVudGltZUNhbGxlciwgb2JqZWN0TmFtZXMgfSBmcm9tIFwiLi9ydW50aW1lLmpzXCI7XG5jb25zdCBjYWxsID0gbmV3UnVudGltZUNhbGxlcihvYmplY3ROYW1lcy5BcHBsaWNhdGlvbik7XG5cbmNvbnN0IEhpZGVNZXRob2QgPSAwO1xuY29uc3QgU2hvd01ldGhvZCA9IDE7XG5jb25zdCBRdWl0TWV0aG9kID0gMjtcblxuLyoqXG4gKiBIaWRlcyBhIGNlcnRhaW4gbWV0aG9kIGJ5IGNhbGxpbmcgdGhlIEhpZGVNZXRob2QgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBIaWRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBjYWxsKEhpZGVNZXRob2QpO1xufVxuXG4vKipcbiAqIENhbGxzIHRoZSBTaG93TWV0aG9kIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBTaG93KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBjYWxsKFNob3dNZXRob2QpO1xufVxuXG4vKipcbiAqIENhbGxzIHRoZSBRdWl0TWV0aG9kIHRvIHRlcm1pbmF0ZSB0aGUgcHJvZ3JhbS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFF1aXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIGNhbGwoUXVpdE1ldGhvZCk7XG59XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbmltcG9ydCB7IENhbmNlbGxhYmxlUHJvbWlzZSwgdHlwZSBDYW5jZWxsYWJsZVByb21pc2VXaXRoUmVzb2x2ZXJzIH0gZnJvbSBcIi4vY2FuY2VsbGFibGUuanNcIjtcbmltcG9ydCB7IG5ld1J1bnRpbWVDYWxsZXIsIG9iamVjdE5hbWVzIH0gZnJvbSBcIi4vcnVudGltZS5qc1wiO1xuaW1wb3J0IHsgbmFub2lkIH0gZnJvbSBcIi4vbmFub2lkLmpzXCI7XG5cbi8vIFNldHVwXG53aW5kb3cuX3dhaWxzID0gd2luZG93Ll93YWlscyB8fCB7fTtcbndpbmRvdy5fd2FpbHMuY2FsbFJlc3VsdEhhbmRsZXIgPSByZXN1bHRIYW5kbGVyO1xud2luZG93Ll93YWlscy5jYWxsRXJyb3JIYW5kbGVyID0gZXJyb3JIYW5kbGVyO1xuXG50eXBlIFByb21pc2VSZXNvbHZlcnMgPSBPbWl0PENhbmNlbGxhYmxlUHJvbWlzZVdpdGhSZXNvbHZlcnM8YW55PiwgXCJwcm9taXNlXCIgfCBcIm9uY2FuY2VsbGVkXCI+XG5cbmNvbnN0IGNhbGwgPSBuZXdSdW50aW1lQ2FsbGVyKG9iamVjdE5hbWVzLkNhbGwpO1xuY29uc3QgY2FuY2VsQ2FsbCA9IG5ld1J1bnRpbWVDYWxsZXIob2JqZWN0TmFtZXMuQ2FuY2VsQ2FsbCk7XG5jb25zdCBjYWxsUmVzcG9uc2VzID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2VSZXNvbHZlcnM+KCk7XG5cbmNvbnN0IENhbGxCaW5kaW5nID0gMDtcbmNvbnN0IENhbmNlbE1ldGhvZCA9IDBcblxuLyoqXG4gKiBIb2xkcyBhbGwgcmVxdWlyZWQgaW5mb3JtYXRpb24gZm9yIGEgYmluZGluZyBjYWxsLlxuICogTWF5IHByb3ZpZGUgZWl0aGVyIGEgbWV0aG9kIElEIG9yIGEgbWV0aG9kIG5hbWUsIGJ1dCBub3QgYm90aC5cbiAqL1xuZXhwb3J0IHR5cGUgQ2FsbE9wdGlvbnMgPSB7XG4gICAgLyoqIFRoZSBudW1lcmljIElEIG9mIHRoZSBib3VuZCBtZXRob2QgdG8gY2FsbC4gKi9cbiAgICBtZXRob2RJRDogbnVtYmVyO1xuICAgIC8qKiBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGJvdW5kIG1ldGhvZCB0byBjYWxsLiAqL1xuICAgIG1ldGhvZE5hbWU/OiBuZXZlcjtcbiAgICAvKiogQXJndW1lbnRzIHRvIGJlIHBhc3NlZCBpbnRvIHRoZSBib3VuZCBtZXRob2QuICovXG4gICAgYXJnczogYW55W107XG59IHwge1xuICAgIC8qKiBUaGUgbnVtZXJpYyBJRCBvZiB0aGUgYm91bmQgbWV0aG9kIHRvIGNhbGwuICovXG4gICAgbWV0aG9kSUQ/OiBuZXZlcjtcbiAgICAvKiogVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBib3VuZCBtZXRob2QgdG8gY2FsbC4gKi9cbiAgICBtZXRob2ROYW1lOiBzdHJpbmc7XG4gICAgLyoqIEFyZ3VtZW50cyB0byBiZSBwYXNzZWQgaW50byB0aGUgYm91bmQgbWV0aG9kLiAqL1xuICAgIGFyZ3M6IGFueVtdO1xufTtcblxuLyoqXG4gKiBFeGNlcHRpb24gY2xhc3MgdGhhdCB3aWxsIGJlIHRocm93biBpbiBjYXNlIHRoZSBib3VuZCBtZXRob2QgcmV0dXJucyBhbiBlcnJvci5cbiAqIFRoZSB2YWx1ZSBvZiB0aGUge0BsaW5rIFJ1bnRpbWVFcnJvciNuYW1lfSBwcm9wZXJ0eSBpcyBcIlJ1bnRpbWVFcnJvclwiLlxuICovXG5leHBvcnQgY2xhc3MgUnVudGltZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgYSBuZXcgUnVudGltZUVycm9yIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSBtZXNzYWdlIC0gVGhlIGVycm9yIG1lc3NhZ2UuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIGJlIGZvcndhcmRlZCB0byB0aGUgRXJyb3IgY29uc3RydWN0b3IuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobWVzc2FnZT86IHN0cmluZywgb3B0aW9ucz86IEVycm9yT3B0aW9ucykge1xuICAgICAgICBzdXBlcihtZXNzYWdlLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5uYW1lID0gXCJSdW50aW1lRXJyb3JcIjtcbiAgICB9XG59XG5cbi8qKlxuICogSGFuZGxlcyB0aGUgcmVzdWx0IG9mIGEgY2FsbCByZXF1ZXN0LlxuICpcbiAqIEBwYXJhbSBpZCAtIFRoZSBpZCBvZiB0aGUgcmVxdWVzdCB0byBoYW5kbGUgdGhlIHJlc3VsdCBmb3IuXG4gKiBAcGFyYW0gZGF0YSAtIFRoZSByZXN1bHQgZGF0YSBvZiB0aGUgcmVxdWVzdC5cbiAqIEBwYXJhbSBpc0pTT04gLSBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZGF0YSBpcyBKU09OIG9yIG5vdC5cbiAqL1xuZnVuY3Rpb24gcmVzdWx0SGFuZGxlcihpZDogc3RyaW5nLCBkYXRhOiBzdHJpbmcsIGlzSlNPTjogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IHJlc29sdmVycyA9IGdldEFuZERlbGV0ZVJlc3BvbnNlKGlkKTtcbiAgICBpZiAoIXJlc29sdmVycykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICAgIHJlc29sdmVycy5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgfSBlbHNlIGlmICghaXNKU09OKSB7XG4gICAgICAgIHJlc29sdmVycy5yZXNvbHZlKGRhdGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXNvbHZlcnMucmVzb2x2ZShKU09OLnBhcnNlKGRhdGEpKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgICAgIHJlc29sdmVycy5yZWplY3QobmV3IFR5cGVFcnJvcihcImNvdWxkIG5vdCBwYXJzZSByZXN1bHQ6IFwiICsgZXJyLm1lc3NhZ2UsIHsgY2F1c2U6IGVyciB9KSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogSGFuZGxlcyB0aGUgZXJyb3IgZnJvbSBhIGNhbGwgcmVxdWVzdC5cbiAqXG4gKiBAcGFyYW0gaWQgLSBUaGUgaWQgb2YgdGhlIHByb21pc2UgaGFuZGxlci5cbiAqIEBwYXJhbSBkYXRhIC0gVGhlIGVycm9yIGRhdGEgdG8gcmVqZWN0IHRoZSBwcm9taXNlIGhhbmRsZXIgd2l0aC5cbiAqIEBwYXJhbSBpc0pTT04gLSBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZGF0YSBpcyBKU09OIG9yIG5vdC5cbiAqL1xuZnVuY3Rpb24gZXJyb3JIYW5kbGVyKGlkOiBzdHJpbmcsIGRhdGE6IHN0cmluZywgaXNKU09OOiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgcmVzb2x2ZXJzID0gZ2V0QW5kRGVsZXRlUmVzcG9uc2UoaWQpO1xuICAgIGlmICghcmVzb2x2ZXJzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWlzSlNPTikge1xuICAgICAgICByZXNvbHZlcnMucmVqZWN0KG5ldyBFcnJvcihkYXRhKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IGVycm9yOiBhbnk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBlcnJvciA9IEpTT04ucGFyc2UoZGF0YSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgICAgICByZXNvbHZlcnMucmVqZWN0KG5ldyBUeXBlRXJyb3IoXCJjb3VsZCBub3QgcGFyc2UgZXJyb3I6IFwiICsgZXJyLm1lc3NhZ2UsIHsgY2F1c2U6IGVyciB9KSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgb3B0aW9uczogRXJyb3JPcHRpb25zID0ge307XG4gICAgICAgIGlmIChlcnJvci5jYXVzZSkge1xuICAgICAgICAgICAgb3B0aW9ucy5jYXVzZSA9IGVycm9yLmNhdXNlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGV4Y2VwdGlvbjtcbiAgICAgICAgc3dpdGNoIChlcnJvci5raW5kKSB7XG4gICAgICAgICAgICBjYXNlIFwiUmVmZXJlbmNlRXJyb3JcIjpcbiAgICAgICAgICAgICAgICBleGNlcHRpb24gPSBuZXcgUmVmZXJlbmNlRXJyb3IoZXJyb3IubWVzc2FnZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiVHlwZUVycm9yXCI6XG4gICAgICAgICAgICAgICAgZXhjZXB0aW9uID0gbmV3IFR5cGVFcnJvcihlcnJvci5tZXNzYWdlLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJSdW50aW1lRXJyb3JcIjpcbiAgICAgICAgICAgICAgICBleGNlcHRpb24gPSBuZXcgUnVudGltZUVycm9yKGVycm9yLm1lc3NhZ2UsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBleGNlcHRpb24gPSBuZXcgRXJyb3IoZXJyb3IubWVzc2FnZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICByZXNvbHZlcnMucmVqZWN0KGV4Y2VwdGlvbik7XG4gICAgfVxufVxuXG4vKipcbiAqIFJldHJpZXZlcyBhbmQgcmVtb3ZlcyB0aGUgcmVzcG9uc2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBJRCBmcm9tIHRoZSBjYWxsUmVzcG9uc2VzIG1hcC5cbiAqXG4gKiBAcGFyYW0gaWQgLSBUaGUgSUQgb2YgdGhlIHJlc3BvbnNlIHRvIGJlIHJldHJpZXZlZCBhbmQgcmVtb3ZlZC5cbiAqIEByZXR1cm5zIFRoZSByZXNwb25zZSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBJRCwgaWYgYW55LlxuICovXG5mdW5jdGlvbiBnZXRBbmREZWxldGVSZXNwb25zZShpZDogc3RyaW5nKTogUHJvbWlzZVJlc29sdmVycyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBjYWxsUmVzcG9uc2VzLmdldChpZCk7XG4gICAgY2FsbFJlc3BvbnNlcy5kZWxldGUoaWQpO1xuICAgIHJldHVybiByZXNwb25zZTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSB1bmlxdWUgSUQgdXNpbmcgdGhlIG5hbm9pZCBsaWJyYXJ5LlxuICpcbiAqIEByZXR1cm5zIEEgdW5pcXVlIElEIHRoYXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGNhbGxSZXNwb25zZXMgc2V0LlxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZUlEKCk6IHN0cmluZyB7XG4gICAgbGV0IHJlc3VsdDtcbiAgICBkbyB7XG4gICAgICAgIHJlc3VsdCA9IG5hbm9pZCgpO1xuICAgIH0gd2hpbGUgKGNhbGxSZXNwb25zZXMuaGFzKHJlc3VsdCkpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQ2FsbCBhIGJvdW5kIG1ldGhvZCBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIGNhbGwgb3B0aW9ucy5cbiAqXG4gKiBJbiBjYXNlIG9mIGZhaWx1cmUsIHRoZSByZXR1cm5lZCBwcm9taXNlIHdpbGwgcmVqZWN0IHdpdGggYW4gZXhjZXB0aW9uXG4gKiBhbW9uZyBSZWZlcmVuY2VFcnJvciAodW5rbm93biBtZXRob2QpLCBUeXBlRXJyb3IgKHdyb25nIGFyZ3VtZW50IGNvdW50IG9yIHR5cGUpLFxuICoge0BsaW5rIFJ1bnRpbWVFcnJvcn0gKG1ldGhvZCByZXR1cm5lZCBhbiBlcnJvciksIG9yIG90aGVyIChuZXR3b3JrIG9yIGludGVybmFsIGVycm9ycykuXG4gKiBUaGUgZXhjZXB0aW9uIG1pZ2h0IGhhdmUgYSBcImNhdXNlXCIgZmllbGQgd2l0aCB0aGUgdmFsdWUgcmV0dXJuZWRcbiAqIGJ5IHRoZSBhcHBsaWNhdGlvbi0gb3Igc2VydmljZS1sZXZlbCBlcnJvciBtYXJzaGFsaW5nIGZ1bmN0aW9ucy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEEgbWV0aG9kIGNhbGwgZGVzY3JpcHRvci5cbiAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgdGhlIGNhbGwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDYWxsKG9wdGlvbnM6IENhbGxPcHRpb25zKTogQ2FuY2VsbGFibGVQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IGlkID0gZ2VuZXJhdGVJRCgpO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gQ2FuY2VsbGFibGVQcm9taXNlLndpdGhSZXNvbHZlcnM8YW55PigpO1xuICAgIGNhbGxSZXNwb25zZXMuc2V0KGlkLCB7IHJlc29sdmU6IHJlc3VsdC5yZXNvbHZlLCByZWplY3Q6IHJlc3VsdC5yZWplY3QgfSk7XG5cbiAgICBjb25zdCByZXF1ZXN0ID0gY2FsbChDYWxsQmluZGluZywgT2JqZWN0LmFzc2lnbih7IFwiY2FsbC1pZFwiOiBpZCB9LCBvcHRpb25zKSk7XG4gICAgbGV0IHJ1bm5pbmcgPSBmYWxzZTtcblxuICAgIHJlcXVlc3QudGhlbigoKSA9PiB7XG4gICAgICAgIHJ1bm5pbmcgPSB0cnVlO1xuICAgIH0sIChlcnIpID0+IHtcbiAgICAgICAgY2FsbFJlc3BvbnNlcy5kZWxldGUoaWQpO1xuICAgICAgICByZXN1bHQucmVqZWN0KGVycik7XG4gICAgfSk7XG5cbiAgICBjb25zdCBjYW5jZWwgPSAoKSA9PiB7XG4gICAgICAgIGNhbGxSZXNwb25zZXMuZGVsZXRlKGlkKTtcbiAgICAgICAgcmV0dXJuIGNhbmNlbENhbGwoQ2FuY2VsTWV0aG9kLCB7XCJjYWxsLWlkXCI6IGlkfSkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIHdoaWxlIHJlcXVlc3RpbmcgYmluZGluZyBjYWxsIGNhbmNlbGxhdGlvbjpcIiwgZXJyKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJlc3VsdC5vbmNhbmNlbGxlZCA9ICgpID0+IHtcbiAgICAgICAgaWYgKHJ1bm5pbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBjYW5jZWwoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByZXF1ZXN0LnRoZW4oY2FuY2VsKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gcmVzdWx0LnByb21pc2U7XG59XG5cbi8qKlxuICogQ2FsbHMgYSBib3VuZCBtZXRob2QgYnkgbmFtZSB3aXRoIHRoZSBzcGVjaWZpZWQgYXJndW1lbnRzLlxuICogU2VlIHtAbGluayBDYWxsfSBmb3IgZGV0YWlscy5cbiAqXG4gKiBAcGFyYW0gbWV0aG9kTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBtZXRob2QgaW4gdGhlIGZvcm1hdCAncGFja2FnZS5zdHJ1Y3QubWV0aG9kJy5cbiAqIEBwYXJhbSBhcmdzIC0gVGhlIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBtZXRob2QuXG4gKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIHRoZSBtZXRob2QgY2FsbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEJ5TmFtZShtZXRob2ROYW1lOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogQ2FuY2VsbGFibGVQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBDYWxsKHsgbWV0aG9kTmFtZSwgYXJncyB9KTtcbn1cblxuLyoqXG4gKiBDYWxscyBhIG1ldGhvZCBieSBpdHMgbnVtZXJpYyBJRCB3aXRoIHRoZSBzcGVjaWZpZWQgYXJndW1lbnRzLlxuICogU2VlIHtAbGluayBDYWxsfSBmb3IgZGV0YWlscy5cbiAqXG4gKiBAcGFyYW0gbWV0aG9kSUQgLSBUaGUgSUQgb2YgdGhlIG1ldGhvZCB0byBjYWxsLlxuICogQHBhcmFtIGFyZ3MgLSBUaGUgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIG1ldGhvZC5cbiAqIEByZXR1cm4gVGhlIHJlc3VsdCBvZiB0aGUgbWV0aG9kIGNhbGwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBCeUlEKG1ldGhvZElEOiBudW1iZXIsIC4uLmFyZ3M6IGFueVtdKTogQ2FuY2VsbGFibGVQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBDYWxsKHsgbWV0aG9kSUQsIGFyZ3MgfSk7XG59XG4iLCAiLy8gU291cmNlOiBodHRwczovL2dpdGh1Yi5jb20vaW5zcGVjdC1qcy9pcy1jYWxsYWJsZVxuXG4vLyBUaGUgTUlUIExpY2Vuc2UgKE1JVClcbi8vXG4vLyBDb3B5cmlnaHQgKGMpIDIwMTUgSm9yZGFuIEhhcmJhbmRcbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4vLyBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbi8vIFNPRlRXQVJFLlxuXG52YXIgZm5Ub1N0ciA9IEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZztcbnZhciByZWZsZWN0QXBwbHk6IHR5cGVvZiBSZWZsZWN0LmFwcGx5IHwgZmFsc2UgfCBudWxsID0gdHlwZW9mIFJlZmxlY3QgPT09ICdvYmplY3QnICYmIFJlZmxlY3QgIT09IG51bGwgJiYgUmVmbGVjdC5hcHBseTtcbnZhciBiYWRBcnJheUxpa2U6IGFueTtcbnZhciBpc0NhbGxhYmxlTWFya2VyOiBhbnk7XG5pZiAodHlwZW9mIHJlZmxlY3RBcHBseSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgT2JqZWN0LmRlZmluZVByb3BlcnR5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgYmFkQXJyYXlMaWtlID0gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAnbGVuZ3RoJywge1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgaXNDYWxsYWJsZU1hcmtlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlzQ2FsbGFibGVNYXJrZXIgPSB7fTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXRocm93LWxpdGVyYWxcbiAgICAgICAgcmVmbGVjdEFwcGx5KGZ1bmN0aW9uICgpIHsgdGhyb3cgNDI7IH0sIG51bGwsIGJhZEFycmF5TGlrZSk7XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgICBpZiAoXyAhPT0gaXNDYWxsYWJsZU1hcmtlcikge1xuICAgICAgICAgICAgcmVmbGVjdEFwcGx5ID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn0gZWxzZSB7XG4gICAgcmVmbGVjdEFwcGx5ID0gbnVsbDtcbn1cblxudmFyIGNvbnN0cnVjdG9yUmVnZXggPSAvXlxccypjbGFzc1xcYi87XG52YXIgaXNFUzZDbGFzc0ZuID0gZnVuY3Rpb24gaXNFUzZDbGFzc0Z1bmN0aW9uKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgICB2YXIgZm5TdHIgPSBmblRvU3RyLmNhbGwodmFsdWUpO1xuICAgICAgICByZXR1cm4gY29uc3RydWN0b3JSZWdleC50ZXN0KGZuU3RyKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTsgLy8gbm90IGEgZnVuY3Rpb25cbiAgICB9XG59O1xuXG52YXIgdHJ5RnVuY3Rpb25PYmplY3QgPSBmdW5jdGlvbiB0cnlGdW5jdGlvblRvU3RyKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAoaXNFUzZDbGFzc0ZuKHZhbHVlKSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAgICAgZm5Ub1N0ci5jYWxsKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufTtcbnZhciB0b1N0ciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgb2JqZWN0Q2xhc3MgPSAnW29iamVjdCBPYmplY3RdJztcbnZhciBmbkNsYXNzID0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbnZhciBnZW5DbGFzcyA9ICdbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSc7XG52YXIgZGRhQ2xhc3MgPSAnW29iamVjdCBIVE1MQWxsQ29sbGVjdGlvbl0nOyAvLyBJRSAxMVxudmFyIGRkYUNsYXNzMiA9ICdbb2JqZWN0IEhUTUwgZG9jdW1lbnQuYWxsIGNsYXNzXSc7XG52YXIgZGRhQ2xhc3MzID0gJ1tvYmplY3QgSFRNTENvbGxlY3Rpb25dJzsgLy8gSUUgOS0xMFxudmFyIGhhc1RvU3RyaW5nVGFnID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiAhIVN5bWJvbC50b1N0cmluZ1RhZzsgLy8gYmV0dGVyOiB1c2UgYGhhcy10b3N0cmluZ3RhZ2BcblxudmFyIGlzSUU2OCA9ICEoMCBpbiBbLF0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNwYXJzZS1hcnJheXMsIGNvbW1hLXNwYWNpbmdcblxudmFyIGlzRERBOiAodmFsdWU6IGFueSkgPT4gYm9vbGVhbiA9IGZ1bmN0aW9uIGlzRG9jdW1lbnREb3RBbGwoKSB7IHJldHVybiBmYWxzZTsgfTtcbmlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICdvYmplY3QnKSB7XG4gICAgLy8gRmlyZWZveCAzIGNhbm9uaWNhbGl6ZXMgRERBIHRvIHVuZGVmaW5lZCB3aGVuIGl0J3Mgbm90IGFjY2Vzc2VkIGRpcmVjdGx5XG4gICAgdmFyIGFsbCA9IGRvY3VtZW50LmFsbDtcbiAgICBpZiAodG9TdHIuY2FsbChhbGwpID09PSB0b1N0ci5jYWxsKGRvY3VtZW50LmFsbCkpIHtcbiAgICAgICAgaXNEREEgPSBmdW5jdGlvbiBpc0RvY3VtZW50RG90QWxsKHZhbHVlKSB7XG4gICAgICAgICAgICAvKiBnbG9iYWxzIGRvY3VtZW50OiBmYWxzZSAqL1xuICAgICAgICAgICAgLy8gaW4gSUUgNi04LCB0eXBlb2YgZG9jdW1lbnQuYWxsIGlzIFwib2JqZWN0XCIgYW5kIGl0J3MgdHJ1dGh5XG4gICAgICAgICAgICBpZiAoKGlzSUU2OCB8fCAhdmFsdWUpICYmICh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ciA9IHRvU3RyLmNhbGwodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RyID09PSBkZGFDbGFzc1xuICAgICAgICAgICAgICAgICAgICAgICAgfHwgc3RyID09PSBkZGFDbGFzczJcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IHN0ciA9PT0gZGRhQ2xhc3MzIC8vIG9wZXJhIDEyLjE2XG4gICAgICAgICAgICAgICAgICAgICAgICB8fCBzdHIgPT09IG9iamVjdENsYXNzIC8vIElFIDYtOFxuICAgICAgICAgICAgICAgICAgICApICYmIHZhbHVlKCcnKSA9PSBudWxsOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGVxZXFlcVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgLyoqLyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH07XG4gICAgfVxufVxuXG5mdW5jdGlvbiBpc0NhbGxhYmxlUmVmQXBwbHk8VD4odmFsdWU6IFQgfCB1bmtub3duKTogdmFsdWUgaXMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkgIHtcbiAgICBpZiAoaXNEREEodmFsdWUpKSB7IHJldHVybiB0cnVlOyB9XG4gICAgaWYgKCF2YWx1ZSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgdHJ5IHtcbiAgICAgICAgKHJlZmxlY3RBcHBseSBhcyBhbnkpKHZhbHVlLCBudWxsLCBiYWRBcnJheUxpa2UpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGUgIT09IGlzQ2FsbGFibGVNYXJrZXIpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgfVxuICAgIHJldHVybiAhaXNFUzZDbGFzc0ZuKHZhbHVlKSAmJiB0cnlGdW5jdGlvbk9iamVjdCh2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIGlzQ2FsbGFibGVOb1JlZkFwcGx5PFQ+KHZhbHVlOiBUIHwgdW5rbm93bik6IHZhbHVlIGlzICguLi5hcmdzOiBhbnlbXSkgPT4gYW55IHtcbiAgICBpZiAoaXNEREEodmFsdWUpKSB7IHJldHVybiB0cnVlOyB9XG4gICAgaWYgKCF2YWx1ZSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgaWYgKGhhc1RvU3RyaW5nVGFnKSB7IHJldHVybiB0cnlGdW5jdGlvbk9iamVjdCh2YWx1ZSk7IH1cbiAgICBpZiAoaXNFUzZDbGFzc0ZuKHZhbHVlKSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICB2YXIgc3RyQ2xhc3MgPSB0b1N0ci5jYWxsKHZhbHVlKTtcbiAgICBpZiAoc3RyQ2xhc3MgIT09IGZuQ2xhc3MgJiYgc3RyQ2xhc3MgIT09IGdlbkNsYXNzICYmICEoL15cXFtvYmplY3QgSFRNTC8pLnRlc3Qoc3RyQ2xhc3MpKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIHJldHVybiB0cnlGdW5jdGlvbk9iamVjdCh2YWx1ZSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCByZWZsZWN0QXBwbHkgPyBpc0NhbGxhYmxlUmVmQXBwbHkgOiBpc0NhbGxhYmxlTm9SZWZBcHBseTtcbiIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuaW1wb3J0IGlzQ2FsbGFibGUgZnJvbSBcIi4vY2FsbGFibGUuanNcIjtcblxuLyoqXG4gKiBFeGNlcHRpb24gY2xhc3MgdGhhdCB3aWxsIGJlIHVzZWQgYXMgcmVqZWN0aW9uIHJlYXNvblxuICogaW4gY2FzZSBhIHtAbGluayBDYW5jZWxsYWJsZVByb21pc2V9IGlzIGNhbmNlbGxlZCBzdWNjZXNzZnVsbHkuXG4gKlxuICogVGhlIHZhbHVlIG9mIHRoZSB7QGxpbmsgbmFtZX0gcHJvcGVydHkgaXMgdGhlIHN0cmluZyBgXCJDYW5jZWxFcnJvclwiYC5cbiAqIFRoZSB2YWx1ZSBvZiB0aGUge0BsaW5rIGNhdXNlfSBwcm9wZXJ0eSBpcyB0aGUgY2F1c2UgcGFzc2VkIHRvIHRoZSBjYW5jZWwgbWV0aG9kLCBpZiBhbnkuXG4gKi9cbmV4cG9ydCBjbGFzcyBDYW5jZWxFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGBDYW5jZWxFcnJvcmAgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgZXJyb3IgbWVzc2FnZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gYmUgZm9yd2FyZGVkIHRvIHRoZSBFcnJvciBjb25zdHJ1Y3Rvci5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlPzogc3RyaW5nLCBvcHRpb25zPzogRXJyb3JPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLm5hbWUgPSBcIkNhbmNlbEVycm9yXCI7XG4gICAgfVxufVxuXG4vKipcbiAqIEV4Y2VwdGlvbiBjbGFzcyB0aGF0IHdpbGwgYmUgcmVwb3J0ZWQgYXMgYW4gdW5oYW5kbGVkIHJlamVjdGlvblxuICogaW4gY2FzZSBhIHtAbGluayBDYW5jZWxsYWJsZVByb21pc2V9IHJlamVjdHMgYWZ0ZXIgYmVpbmcgY2FuY2VsbGVkLFxuICogb3Igd2hlbiB0aGUgYG9uY2FuY2VsbGVkYCBjYWxsYmFjayB0aHJvd3Mgb3IgcmVqZWN0cy5cbiAqXG4gKiBUaGUgdmFsdWUgb2YgdGhlIHtAbGluayBuYW1lfSBwcm9wZXJ0eSBpcyB0aGUgc3RyaW5nIGBcIkNhbmNlbGxlZFJlamVjdGlvbkVycm9yXCJgLlxuICogVGhlIHZhbHVlIG9mIHRoZSB7QGxpbmsgY2F1c2V9IHByb3BlcnR5IGlzIHRoZSByZWFzb24gdGhlIHByb21pc2UgcmVqZWN0ZWQgd2l0aC5cbiAqXG4gKiBCZWNhdXNlIHRoZSBvcmlnaW5hbCBwcm9taXNlIHdhcyBjYW5jZWxsZWQsXG4gKiBhIHdyYXBwZXIgcHJvbWlzZSB3aWxsIGJlIHBhc3NlZCB0byB0aGUgdW5oYW5kbGVkIHJlamVjdGlvbiBsaXN0ZW5lciBpbnN0ZWFkLlxuICogVGhlIHtAbGluayBwcm9taXNlfSBwcm9wZXJ0eSBob2xkcyBhIHJlZmVyZW5jZSB0byB0aGUgb3JpZ2luYWwgcHJvbWlzZS5cbiAqL1xuZXhwb3J0IGNsYXNzIENhbmNlbGxlZFJlamVjdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIC8qKlxuICAgICAqIEhvbGRzIGEgcmVmZXJlbmNlIHRvIHRoZSBwcm9taXNlIHRoYXQgd2FzIGNhbmNlbGxlZCBhbmQgdGhlbiByZWplY3RlZC5cbiAgICAgKi9cbiAgICBwcm9taXNlOiBDYW5jZWxsYWJsZVByb21pc2U8dW5rbm93bj47XG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGBDYW5jZWxsZWRSZWplY3Rpb25FcnJvcmAgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHByb21pc2UgLSBUaGUgcHJvbWlzZSB0aGF0IGNhdXNlZCB0aGUgZXJyb3Igb3JpZ2luYWxseS5cbiAgICAgKiBAcGFyYW0gcmVhc29uIC0gVGhlIHJlamVjdGlvbiByZWFzb24uXG4gICAgICogQHBhcmFtIGluZm8gLSBBbiBvcHRpb25hbCBpbmZvcm1hdGl2ZSBtZXNzYWdlIHNwZWNpZnlpbmcgdGhlIGNpcmN1bXN0YW5jZXMgaW4gd2hpY2ggdGhlIGVycm9yIHdhcyB0aHJvd24uXG4gICAgICogICAgICAgICAgICAgICBEZWZhdWx0cyB0byB0aGUgc3RyaW5nIGBcIlVuaGFuZGxlZCByZWplY3Rpb24gaW4gY2FuY2VsbGVkIHByb21pc2UuXCJgLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHByb21pc2U6IENhbmNlbGxhYmxlUHJvbWlzZTx1bmtub3duPiwgcmVhc29uPzogYW55LCBpbmZvPzogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKChpbmZvID8/IFwiVW5oYW5kbGVkIHJlamVjdGlvbiBpbiBjYW5jZWxsZWQgcHJvbWlzZS5cIikgKyBcIiBSZWFzb246IFwiICsgZXJyb3JNZXNzYWdlKHJlYXNvbiksIHsgY2F1c2U6IHJlYXNvbiB9KTtcbiAgICAgICAgdGhpcy5wcm9taXNlID0gcHJvbWlzZTtcbiAgICAgICAgdGhpcy5uYW1lID0gXCJDYW5jZWxsZWRSZWplY3Rpb25FcnJvclwiO1xuICAgIH1cbn1cblxudHlwZSBDYW5jZWxsYWJsZVByb21pc2VSZXNvbHZlcjxUPiA9ICh2YWx1ZTogVCB8IFByb21pc2VMaWtlPFQ+IHwgQ2FuY2VsbGFibGVQcm9taXNlTGlrZTxUPikgPT4gdm9pZDtcbnR5cGUgQ2FuY2VsbGFibGVQcm9taXNlUmVqZWN0b3IgPSAocmVhc29uPzogYW55KSA9PiB2b2lkO1xudHlwZSBDYW5jZWxsYWJsZVByb21pc2VDYW5jZWxsZXIgPSAoY2F1c2U/OiBhbnkpID0+IHZvaWQgfCBQcm9taXNlTGlrZTx2b2lkPjtcbnR5cGUgQ2FuY2VsbGFibGVQcm9taXNlRXhlY3V0b3I8VD4gPSAocmVzb2x2ZTogQ2FuY2VsbGFibGVQcm9taXNlUmVzb2x2ZXI8VD4sIHJlamVjdDogQ2FuY2VsbGFibGVQcm9taXNlUmVqZWN0b3IpID0+IHZvaWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FuY2VsbGFibGVQcm9taXNlTGlrZTxUPiB7XG4gICAgdGhlbjxUUmVzdWx0MSA9IFQsIFRSZXN1bHQyID0gbmV2ZXI+KG9uZnVsZmlsbGVkPzogKCh2YWx1ZTogVCkgPT4gVFJlc3VsdDEgfCBQcm9taXNlTGlrZTxUUmVzdWx0MT4gfCBDYW5jZWxsYWJsZVByb21pc2VMaWtlPFRSZXN1bHQxPikgfCB1bmRlZmluZWQgfCBudWxsLCBvbnJlamVjdGVkPzogKChyZWFzb246IGFueSkgPT4gVFJlc3VsdDIgfCBQcm9taXNlTGlrZTxUUmVzdWx0Mj4gfCBDYW5jZWxsYWJsZVByb21pc2VMaWtlPFRSZXN1bHQyPikgfCB1bmRlZmluZWQgfCBudWxsKTogQ2FuY2VsbGFibGVQcm9taXNlTGlrZTxUUmVzdWx0MSB8IFRSZXN1bHQyPjtcbiAgICBjYW5jZWwoY2F1c2U/OiBhbnkpOiB2b2lkIHwgUHJvbWlzZUxpa2U8dm9pZD47XG59XG5cbi8qKlxuICogV3JhcHMgYSBjYW5jZWxsYWJsZSBwcm9taXNlIGFsb25nIHdpdGggaXRzIHJlc29sdXRpb24gbWV0aG9kcy5cbiAqIFRoZSBgb25jYW5jZWxsZWRgIGZpZWxkIHdpbGwgYmUgbnVsbCBpbml0aWFsbHkgYnV0IG1heSBiZSBzZXQgdG8gcHJvdmlkZSBhIGN1c3RvbSBjYW5jZWxsYXRpb24gZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FuY2VsbGFibGVQcm9taXNlV2l0aFJlc29sdmVyczxUPiB7XG4gICAgcHJvbWlzZTogQ2FuY2VsbGFibGVQcm9taXNlPFQ+O1xuICAgIHJlc29sdmU6IENhbmNlbGxhYmxlUHJvbWlzZVJlc29sdmVyPFQ+O1xuICAgIHJlamVjdDogQ2FuY2VsbGFibGVQcm9taXNlUmVqZWN0b3I7XG4gICAgb25jYW5jZWxsZWQ6IENhbmNlbGxhYmxlUHJvbWlzZUNhbmNlbGxlciB8IG51bGw7XG59XG5cbmludGVyZmFjZSBDYW5jZWxsYWJsZVByb21pc2VTdGF0ZSB7XG4gICAgcmVhZG9ubHkgcm9vdDogQ2FuY2VsbGFibGVQcm9taXNlU3RhdGU7XG4gICAgcmVzb2x2aW5nOiBib29sZWFuO1xuICAgIHNldHRsZWQ6IGJvb2xlYW47XG4gICAgcmVhc29uPzogQ2FuY2VsRXJyb3I7XG59XG5cbi8vIFByaXZhdGUgZmllbGQgbmFtZXMuXG5jb25zdCBiYXJyaWVyU3ltID0gU3ltYm9sKFwiYmFycmllclwiKTtcbmNvbnN0IGNhbmNlbEltcGxTeW0gPSBTeW1ib2woXCJjYW5jZWxJbXBsXCIpO1xuY29uc3Qgc3BlY2llcyA9IFN5bWJvbC5zcGVjaWVzID8/IFN5bWJvbChcInNwZWNpZXNQb2x5ZmlsbFwiKTtcblxuLyoqXG4gKiBBIHByb21pc2Ugd2l0aCBhbiBhdHRhY2hlZCBtZXRob2QgZm9yIGNhbmNlbGxpbmcgbG9uZy1ydW5uaW5nIG9wZXJhdGlvbnMgKHNlZSB7QGxpbmsgQ2FuY2VsbGFibGVQcm9taXNlI2NhbmNlbH0pLlxuICogQ2FuY2VsbGF0aW9uIGNhbiBvcHRpb25hbGx5IGJlIGJvdW5kIHRvIGFuIHtAbGluayBBYm9ydFNpZ25hbH1cbiAqIGZvciBiZXR0ZXIgY29tcG9zYWJpbGl0eSAoc2VlIHtAbGluayBDYW5jZWxsYWJsZVByb21pc2UjY2FuY2VsT259KS5cbiAqXG4gKiBDYW5jZWxsaW5nIGEgcGVuZGluZyBwcm9taXNlIHdpbGwgcmVzdWx0IGluIGFuIGltbWVkaWF0ZSByZWplY3Rpb25cbiAqIHdpdGggYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIENhbmNlbEVycm9yfSBhcyByZWFzb24sXG4gKiBidXQgd2hvZXZlciBzdGFydGVkIHRoZSBwcm9taXNlIHdpbGwgYmUgcmVzcG9uc2libGVcbiAqIGZvciBhY3R1YWxseSBhYm9ydGluZyB0aGUgdW5kZXJseWluZyBvcGVyYXRpb24uXG4gKiBUbyB0aGlzIHB1cnBvc2UsIHRoZSBjb25zdHJ1Y3RvciBhbmQgYWxsIGNoYWluaW5nIG1ldGhvZHNcbiAqIGFjY2VwdCBvcHRpb25hbCBjYW5jZWxsYXRpb24gY2FsbGJhY2tzLlxuICpcbiAqIElmIGEgYENhbmNlbGxhYmxlUHJvbWlzZWAgc3RpbGwgcmVzb2x2ZXMgYWZ0ZXIgaGF2aW5nIGJlZW4gY2FuY2VsbGVkLFxuICogdGhlIHJlc3VsdCB3aWxsIGJlIGRpc2NhcmRlZC4gSWYgaXQgcmVqZWN0cywgdGhlIHJlYXNvblxuICogd2lsbCBiZSByZXBvcnRlZCBhcyBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uLFxuICogd3JhcHBlZCBpbiBhIHtAbGluayBDYW5jZWxsZWRSZWplY3Rpb25FcnJvcn0gaW5zdGFuY2UuXG4gKiBUbyBmYWNpbGl0YXRlIHRoZSBoYW5kbGluZyBvZiBjYW5jZWxsYXRpb24gcmVxdWVzdHMsXG4gKiBjYW5jZWxsZWQgYENhbmNlbGxhYmxlUHJvbWlzZWBzIHdpbGwgX25vdF8gcmVwb3J0IHVuaGFuZGxlZCBgQ2FuY2VsRXJyb3Jgc1xuICogd2hvc2UgYGNhdXNlYCBmaWVsZCBpcyB0aGUgc2FtZSBhcyB0aGUgb25lIHdpdGggd2hpY2ggdGhlIGN1cnJlbnQgcHJvbWlzZSB3YXMgY2FuY2VsbGVkLlxuICpcbiAqIEFsbCB1c3VhbCBwcm9taXNlIG1ldGhvZHMgYXJlIGRlZmluZWQgYW5kIHJldHVybiBhIGBDYW5jZWxsYWJsZVByb21pc2VgXG4gKiB3aG9zZSBjYW5jZWwgbWV0aG9kIHdpbGwgY2FuY2VsIHRoZSBwYXJlbnQgb3BlcmF0aW9uIGFzIHdlbGwsIHByb3BhZ2F0aW5nIHRoZSBjYW5jZWxsYXRpb24gcmVhc29uXG4gKiB1cHdhcmRzIHRocm91Z2ggcHJvbWlzZSBjaGFpbnMuXG4gKiBDb252ZXJzZWx5LCBjYW5jZWxsaW5nIGEgcHJvbWlzZSB3aWxsIG5vdCBhdXRvbWF0aWNhbGx5IGNhbmNlbCBkZXBlbmRlbnQgcHJvbWlzZXMgZG93bnN0cmVhbTpcbiAqIGBgYHRzXG4gKiBsZXQgcm9vdCA9IG5ldyBDYW5jZWxsYWJsZVByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4geyAuLi4gfSk7XG4gKiBsZXQgY2hpbGQxID0gcm9vdC50aGVuKCgpID0+IHsgLi4uIH0pO1xuICogbGV0IGNoaWxkMiA9IGNoaWxkMS50aGVuKCgpID0+IHsgLi4uIH0pO1xuICogbGV0IGNoaWxkMyA9IHJvb3QuY2F0Y2goKCkgPT4geyAuLi4gfSk7XG4gKiBjaGlsZDEuY2FuY2VsKCk7IC8vIENhbmNlbHMgY2hpbGQxIGFuZCByb290LCBidXQgbm90IGNoaWxkMiBvciBjaGlsZDNcbiAqIGBgYFxuICogQ2FuY2VsbGluZyBhIHByb21pc2UgdGhhdCBoYXMgYWxyZWFkeSBzZXR0bGVkIGlzIHNhZmUgYW5kIGhhcyBubyBjb25zZXF1ZW5jZS5cbiAqXG4gKiBUaGUgYGNhbmNlbGAgbWV0aG9kIHJldHVybnMgYSBwcm9taXNlIHRoYXQgX2Fsd2F5cyBmdWxmaWxsc19cbiAqIGFmdGVyIHRoZSB3aG9sZSBjaGFpbiBoYXMgcHJvY2Vzc2VkIHRoZSBjYW5jZWwgcmVxdWVzdFxuICogYW5kIGFsbCBhdHRhY2hlZCBjYWxsYmFja3MgdXAgdG8gdGhhdCBtb21lbnQgaGF2ZSBydW4uXG4gKlxuICogQWxsIEVTMjAyNCBwcm9taXNlIG1ldGhvZHMgKHN0YXRpYyBhbmQgaW5zdGFuY2UpIGFyZSBkZWZpbmVkIG9uIENhbmNlbGxhYmxlUHJvbWlzZSxcbiAqIGJ1dCBhY3R1YWwgYXZhaWxhYmlsaXR5IG1heSB2YXJ5IHdpdGggT1Mvd2VidmlldyB2ZXJzaW9uLlxuICpcbiAqIEluIGxpbmUgd2l0aCB0aGUgcHJvcG9zYWwgYXQgaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtcm0tYnVpbHRpbi1zdWJjbGFzc2luZyxcbiAqIGBDYW5jZWxsYWJsZVByb21pc2VgIGRvZXMgbm90IHN1cHBvcnQgdHJhbnNwYXJlbnQgc3ViY2xhc3NpbmcuXG4gKiBFeHRlbmRlcnMgc2hvdWxkIHRha2UgY2FyZSB0byBwcm92aWRlIHRoZWlyIG93biBtZXRob2QgaW1wbGVtZW50YXRpb25zLlxuICogVGhpcyBtaWdodCBiZSByZWNvbnNpZGVyZWQgaW4gY2FzZSB0aGUgcHJvcG9zYWwgaXMgcmV0aXJlZC5cbiAqXG4gKiBDYW5jZWxsYWJsZVByb21pc2UgaXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgRE9NIFByb21pc2Ugb2JqZWN0XG4gKiBhbmQgaXMgY29tcGxpYW50IHdpdGggdGhlIFtQcm9taXNlcy9BKyBzcGVjaWZpY2F0aW9uXShodHRwczovL3Byb21pc2VzYXBsdXMuY29tLylcbiAqIChpdCBwYXNzZXMgdGhlIFtjb21wbGlhbmNlIHN1aXRlXShodHRwczovL2dpdGh1Yi5jb20vcHJvbWlzZXMtYXBsdXMvcHJvbWlzZXMtdGVzdHMpKVxuICogaWYgc28gaXMgdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBDYW5jZWxsYWJsZVByb21pc2U8VD4gZXh0ZW5kcyBQcm9taXNlPFQ+IGltcGxlbWVudHMgUHJvbWlzZUxpa2U8VD4sIENhbmNlbGxhYmxlUHJvbWlzZUxpa2U8VD4ge1xuICAgIC8vIFByaXZhdGUgZmllbGRzLlxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBwcml2YXRlIFtiYXJyaWVyU3ltXSE6IFBhcnRpYWw8UHJvbWlzZVdpdGhSZXNvbHZlcnM8dm9pZD4+IHwgbnVsbDtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBbY2FuY2VsSW1wbFN5bV0hOiAocmVhc29uOiBDYW5jZWxFcnJvcikgPT4gdm9pZCB8IFByb21pc2VMaWtlPHZvaWQ+O1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBgQ2FuY2VsbGFibGVQcm9taXNlYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBleGVjdXRvciAtIEEgY2FsbGJhY2sgdXNlZCB0byBpbml0aWFsaXplIHRoZSBwcm9taXNlLiBUaGlzIGNhbGxiYWNrIGlzIHBhc3NlZCB0d28gYXJndW1lbnRzOlxuICAgICAqICAgICAgICAgICAgICAgICAgIGEgYHJlc29sdmVgIGNhbGxiYWNrIHVzZWQgdG8gcmVzb2x2ZSB0aGUgcHJvbWlzZSB3aXRoIGEgdmFsdWVcbiAgICAgKiAgICAgICAgICAgICAgICAgICBvciB0aGUgcmVzdWx0IG9mIGFub3RoZXIgcHJvbWlzZSAocG9zc2libHkgY2FuY2VsbGFibGUpLFxuICAgICAqICAgICAgICAgICAgICAgICAgIGFuZCBhIGByZWplY3RgIGNhbGxiYWNrIHVzZWQgdG8gcmVqZWN0IHRoZSBwcm9taXNlIHdpdGggYSBwcm92aWRlZCByZWFzb24gb3IgZXJyb3IuXG4gICAgICogICAgICAgICAgICAgICAgICAgSWYgdGhlIHZhbHVlIHByb3ZpZGVkIHRvIHRoZSBgcmVzb2x2ZWAgY2FsbGJhY2sgaXMgYSB0aGVuYWJsZSBfYW5kXyBjYW5jZWxsYWJsZSBvYmplY3RcbiAgICAgKiAgICAgICAgICAgICAgICAgICAoaXQgaGFzIGEgYHRoZW5gIF9hbmRfIGEgYGNhbmNlbGAgbWV0aG9kKSxcbiAgICAgKiAgICAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb24gcmVxdWVzdHMgd2lsbCBiZSBmb3J3YXJkZWQgdG8gdGhhdCBvYmplY3QgYW5kIHRoZSBvbmNhbmNlbGxlZCB3aWxsIG5vdCBiZSBpbnZva2VkIGFueW1vcmUuXG4gICAgICogICAgICAgICAgICAgICAgICAgSWYgYW55IG9uZSBvZiB0aGUgdHdvIGNhbGxiYWNrcyBpcyBjYWxsZWQgX2FmdGVyXyB0aGUgcHJvbWlzZSBoYXMgYmVlbiBjYW5jZWxsZWQsXG4gICAgICogICAgICAgICAgICAgICAgICAgdGhlIHByb3ZpZGVkIHZhbHVlcyB3aWxsIGJlIGNhbmNlbGxlZCBhbmQgcmVzb2x2ZWQgYXMgdXN1YWwsXG4gICAgICogICAgICAgICAgICAgICAgICAgYnV0IHRoZWlyIHJlc3VsdHMgd2lsbCBiZSBkaXNjYXJkZWQuXG4gICAgICogICAgICAgICAgICAgICAgICAgSG93ZXZlciwgaWYgdGhlIHJlc29sdXRpb24gcHJvY2VzcyB1bHRpbWF0ZWx5IGVuZHMgdXAgaW4gYSByZWplY3Rpb25cbiAgICAgKiAgICAgICAgICAgICAgICAgICB0aGF0IGlzIG5vdCBkdWUgdG8gY2FuY2VsbGF0aW9uLCB0aGUgcmVqZWN0aW9uIHJlYXNvblxuICAgICAqICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgd3JhcHBlZCBpbiBhIHtAbGluayBDYW5jZWxsZWRSZWplY3Rpb25FcnJvcn1cbiAgICAgKiAgICAgICAgICAgICAgICAgICBhbmQgYnViYmxlZCB1cCBhcyBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uLlxuICAgICAqIEBwYXJhbSBvbmNhbmNlbGxlZCAtIEl0IGlzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBlbnN1cmUgdGhhdCBhbnkgb3BlcmF0aW9uXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgc3RhcnRlZCBieSB0aGUgZXhlY3V0b3IgaXMgcHJvcGVybHkgaGFsdGVkIHVwb24gY2FuY2VsbGF0aW9uLlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIFRoaXMgb3B0aW9uYWwgY2FsbGJhY2sgY2FuIGJlIHVzZWQgdG8gdGhhdCBwdXJwb3NlLlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIEl0IHdpbGwgYmUgY2FsbGVkIF9zeW5jaHJvbm91c2x5XyB3aXRoIGEgY2FuY2VsbGF0aW9uIGNhdXNlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgd2hlbiBjYW5jZWxsYXRpb24gaXMgcmVxdWVzdGVkLCBfYWZ0ZXJfIHRoZSBwcm9taXNlIGhhcyBhbHJlYWR5IHJlamVjdGVkXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgd2l0aCBhIHtAbGluayBDYW5jZWxFcnJvcn0sIGJ1dCBfYmVmb3JlX1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgIGFueSB7QGxpbmsgdGhlbn0ve0BsaW5rIGNhdGNofS97QGxpbmsgZmluYWxseX0gY2FsbGJhY2sgcnVucy5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgY2FsbGJhY2sgcmV0dXJucyBhIHRoZW5hYmxlLCB0aGUgcHJvbWlzZSByZXR1cm5lZCBmcm9tIHtAbGluayBjYW5jZWx9XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgd2lsbCBvbmx5IGZ1bGZpbGwgYWZ0ZXIgdGhlIGZvcm1lciBoYXMgc2V0dGxlZC5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBVbmhhbmRsZWQgZXhjZXB0aW9ucyBvciByZWplY3Rpb25zIGZyb20gdGhlIGNhbGxiYWNrIHdpbGwgYmUgd3JhcHBlZFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIGluIGEge0BsaW5rIENhbmNlbGxlZFJlamVjdGlvbkVycm9yfSBhbmQgYnViYmxlZCB1cCBhcyB1bmhhbmRsZWQgcmVqZWN0aW9ucy5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgYHJlc29sdmVgIGNhbGxiYWNrIGlzIGNhbGxlZCBiZWZvcmUgY2FuY2VsbGF0aW9uIHdpdGggYSBjYW5jZWxsYWJsZSBwcm9taXNlLFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyBvbiB0aGlzIHByb21pc2Ugd2lsbCBiZSBkaXZlcnRlZCB0byB0aGF0IHByb21pc2UsXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZSBvcmlnaW5hbCBgb25jYW5jZWxsZWRgIGNhbGxiYWNrIHdpbGwgYmUgZGlzY2FyZGVkLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGV4ZWN1dG9yOiBDYW5jZWxsYWJsZVByb21pc2VFeGVjdXRvcjxUPiwgb25jYW5jZWxsZWQ/OiBDYW5jZWxsYWJsZVByb21pc2VDYW5jZWxsZXIpIHtcbiAgICAgICAgbGV0IHJlc29sdmUhOiAodmFsdWU6IFQgfCBQcm9taXNlTGlrZTxUPikgPT4gdm9pZDtcbiAgICAgICAgbGV0IHJlamVjdCE6IChyZWFzb24/OiBhbnkpID0+IHZvaWQ7XG4gICAgICAgIHN1cGVyKChyZXMsIHJlaikgPT4geyByZXNvbHZlID0gcmVzOyByZWplY3QgPSByZWo7IH0pO1xuXG4gICAgICAgIGlmICgodGhpcy5jb25zdHJ1Y3RvciBhcyBhbnkpW3NwZWNpZXNdICE9PSBQcm9taXNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2FuY2VsbGFibGVQcm9taXNlIGRvZXMgbm90IHN1cHBvcnQgdHJhbnNwYXJlbnQgc3ViY2xhc3NpbmcuIFBsZWFzZSByZWZyYWluIGZyb20gb3ZlcnJpZGluZyB0aGUgW1N5bWJvbC5zcGVjaWVzXSBzdGF0aWMgcHJvcGVydHkuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHByb21pc2U6IENhbmNlbGxhYmxlUHJvbWlzZVdpdGhSZXNvbHZlcnM8VD4gPSB7XG4gICAgICAgICAgICBwcm9taXNlOiB0aGlzLFxuICAgICAgICAgICAgcmVzb2x2ZSxcbiAgICAgICAgICAgIHJlamVjdCxcbiAgICAgICAgICAgIGdldCBvbmNhbmNlbGxlZCgpIHsgcmV0dXJuIG9uY2FuY2VsbGVkID8/IG51bGw7IH0sXG4gICAgICAgICAgICBzZXQgb25jYW5jZWxsZWQoY2IpIHsgb25jYW5jZWxsZWQgPSBjYiA/PyB1bmRlZmluZWQ7IH1cbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBzdGF0ZTogQ2FuY2VsbGFibGVQcm9taXNlU3RhdGUgPSB7XG4gICAgICAgICAgICBnZXQgcm9vdCgpIHsgcmV0dXJuIHN0YXRlOyB9LFxuICAgICAgICAgICAgcmVzb2x2aW5nOiBmYWxzZSxcbiAgICAgICAgICAgIHNldHRsZWQ6IGZhbHNlXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gU2V0dXAgY2FuY2VsbGF0aW9uIHN5c3RlbS5cbiAgICAgICAgdm9pZCBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgICAgICAgICBbYmFycmllclN5bV06IHtcbiAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW2NhbmNlbEltcGxTeW1dOiB7XG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGNhbmNlbGxlckZvcihwcm9taXNlLCBzdGF0ZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUnVuIHRoZSBhY3R1YWwgZXhlY3V0b3IuXG4gICAgICAgIGNvbnN0IHJlamVjdG9yID0gcmVqZWN0b3JGb3IocHJvbWlzZSwgc3RhdGUpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZXhlY3V0b3IocmVzb2x2ZXJGb3IocHJvbWlzZSwgc3RhdGUpLCByZWplY3Rvcik7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKHN0YXRlLnJlc29sdmluZykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVW5oYW5kbGVkIGV4Y2VwdGlvbiBpbiBDYW5jZWxsYWJsZVByb21pc2UgZXhlY3V0b3IuXCIsIGVycik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlamVjdG9yKGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYW5jZWxzIGltbWVkaWF0ZWx5IHRoZSBleGVjdXRpb24gb2YgdGhlIG9wZXJhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBwcm9taXNlLlxuICAgICAqIFRoZSBwcm9taXNlIHJlamVjdHMgd2l0aCBhIHtAbGluayBDYW5jZWxFcnJvcn0gaW5zdGFuY2UgYXMgcmVhc29uLFxuICAgICAqIHdpdGggdGhlIHtAbGluayBDYW5jZWxFcnJvciNjYXVzZX0gcHJvcGVydHkgc2V0IHRvIHRoZSBnaXZlbiBhcmd1bWVudCwgaWYgYW55LlxuICAgICAqXG4gICAgICogSGFzIG5vIGVmZmVjdCBpZiBjYWxsZWQgYWZ0ZXIgdGhlIHByb21pc2UgaGFzIGFscmVhZHkgc2V0dGxlZDtcbiAgICAgKiByZXBlYXRlZCBjYWxscyBpbiBwYXJ0aWN1bGFyIGFyZSBzYWZlLCBidXQgb25seSB0aGUgZmlyc3Qgb25lXG4gICAgICogd2lsbCBzZXQgdGhlIGNhbmNlbGxhdGlvbiBjYXVzZS5cbiAgICAgKlxuICAgICAqIFRoZSBgQ2FuY2VsRXJyb3JgIGV4Y2VwdGlvbiBfbmVlZCBub3RfIGJlIGhhbmRsZWQgZXhwbGljaXRseSBfb24gdGhlIHByb21pc2VzIHRoYXQgYXJlIGJlaW5nIGNhbmNlbGxlZDpfXG4gICAgICogY2FuY2VsbGluZyBhIHByb21pc2Ugd2l0aCBubyBhdHRhY2hlZCByZWplY3Rpb24gaGFuZGxlciBkb2VzIG5vdCB0cmlnZ2VyIGFuIHVuaGFuZGxlZCByZWplY3Rpb24gZXZlbnQuXG4gICAgICogVGhlcmVmb3JlLCB0aGUgZm9sbG93aW5nIGlkaW9tcyBhcmUgYWxsIGVxdWFsbHkgY29ycmVjdDpcbiAgICAgKiBgYGB0c1xuICAgICAqIG5ldyBDYW5jZWxsYWJsZVByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4geyAuLi4gfSkuY2FuY2VsKCk7XG4gICAgICogbmV3IENhbmNlbGxhYmxlUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7IC4uLiB9KS50aGVuKC4uLikuY2FuY2VsKCk7XG4gICAgICogbmV3IENhbmNlbGxhYmxlUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7IC4uLiB9KS50aGVuKC4uLikuY2F0Y2goLi4uKS5jYW5jZWwoKTtcbiAgICAgKiBgYGBcbiAgICAgKiBXaGVuZXZlciBzb21lIGNhbmNlbGxlZCBwcm9taXNlIGluIGEgY2hhaW4gcmVqZWN0cyB3aXRoIGEgYENhbmNlbEVycm9yYFxuICAgICAqIHdpdGggdGhlIHNhbWUgY2FuY2VsbGF0aW9uIGNhdXNlIGFzIGl0c2VsZiwgdGhlIGVycm9yIHdpbGwgYmUgZGlzY2FyZGVkIHNpbGVudGx5LlxuICAgICAqIEhvd2V2ZXIsIHRoZSBgQ2FuY2VsRXJyb3JgIF93aWxsIHN0aWxsIGJlIGRlbGl2ZXJlZF8gdG8gYWxsIGF0dGFjaGVkIHJlamVjdGlvbiBoYW5kbGVyc1xuICAgICAqIGFkZGVkIGJ5IHtAbGluayB0aGVufSBhbmQgcmVsYXRlZCBtZXRob2RzOlxuICAgICAqIGBgYHRzXG4gICAgICogbGV0IGNhbmNlbGxhYmxlID0gbmV3IENhbmNlbGxhYmxlUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7IC4uLiB9KTtcbiAgICAgKiBjYW5jZWxsYWJsZS50aGVuKCgpID0+IHsgLi4uIH0pLmNhdGNoKGNvbnNvbGUubG9nKTtcbiAgICAgKiBjYW5jZWxsYWJsZS5jYW5jZWwoKTsgLy8gQSBDYW5jZWxFcnJvciBpcyBwcmludGVkIHRvIHRoZSBjb25zb2xlLlxuICAgICAqIGBgYFxuICAgICAqIElmIHRoZSBgQ2FuY2VsRXJyb3JgIGlzIG5vdCBoYW5kbGVkIGRvd25zdHJlYW0gYnkgdGhlIHRpbWUgaXQgcmVhY2hlc1xuICAgICAqIGEgX25vbi1jYW5jZWxsZWRfIHByb21pc2UsIGl0IF93aWxsXyB0cmlnZ2VyIGFuIHVuaGFuZGxlZCByZWplY3Rpb24gZXZlbnQsXG4gICAgICoganVzdCBsaWtlIG5vcm1hbCByZWplY3Rpb25zIHdvdWxkOlxuICAgICAqIGBgYHRzXG4gICAgICogbGV0IGNhbmNlbGxhYmxlID0gbmV3IENhbmNlbGxhYmxlUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7IC4uLiB9KTtcbiAgICAgKiBsZXQgY2hhaW5lZCA9IGNhbmNlbGxhYmxlLnRoZW4oKCkgPT4geyAuLi4gfSkudGhlbigoKSA9PiB7IC4uLiB9KTsgLy8gTm8gY2F0Y2guLi5cbiAgICAgKiBjYW5jZWxsYWJsZS5jYW5jZWwoKTsgLy8gVW5oYW5kbGVkIHJlamVjdGlvbiBldmVudCBvbiBjaGFpbmVkIVxuICAgICAqIGBgYFxuICAgICAqIFRoZXJlZm9yZSwgaXQgaXMgaW1wb3J0YW50IHRvIGVpdGhlciBjYW5jZWwgd2hvbGUgcHJvbWlzZSBjaGFpbnMgZnJvbSB0aGVpciB0YWlsLFxuICAgICAqIGFzIHNob3duIGluIHRoZSBjb3JyZWN0IGlkaW9tcyBhYm92ZSwgb3IgdGFrZSBjYXJlIG9mIGhhbmRsaW5nIGVycm9ycyBldmVyeXdoZXJlLlxuICAgICAqXG4gICAgICogQHJldHVybnMgQSBjYW5jZWxsYWJsZSBwcm9taXNlIHRoYXQgX2Z1bGZpbGxzXyBhZnRlciB0aGUgY2FuY2VsIGNhbGxiYWNrIChpZiBhbnkpXG4gICAgICogYW5kIGFsbCBoYW5kbGVycyBhdHRhY2hlZCB1cCB0byB0aGUgY2FsbCB0byBjYW5jZWwgaGF2ZSBydW4uXG4gICAgICogSWYgdGhlIGNhbmNlbCBjYWxsYmFjayByZXR1cm5zIGEgdGhlbmFibGUsIHRoZSBwcm9taXNlIHJldHVybmVkIGJ5IGBjYW5jZWxgXG4gICAgICogd2lsbCBhbHNvIHdhaXQgZm9yIHRoYXQgdGhlbmFibGUgdG8gc2V0dGxlLlxuICAgICAqIFRoaXMgZW5hYmxlcyBjYWxsZXJzIHRvIHdhaXQgZm9yIHRoZSBjYW5jZWxsZWQgb3BlcmF0aW9uIHRvIHRlcm1pbmF0ZVxuICAgICAqIHdpdGhvdXQgYmVpbmcgZm9yY2VkIHRvIGhhbmRsZSBwb3RlbnRpYWwgZXJyb3JzIGF0IHRoZSBjYWxsIHNpdGUuXG4gICAgICogYGBgdHNcbiAgICAgKiBjYW5jZWxsYWJsZS5jYW5jZWwoKS50aGVuKCgpID0+IHtcbiAgICAgKiAgICAgLy8gQ2xlYW51cCBmaW5pc2hlZCwgaXQncyBzYWZlIHRvIGRvIHNvbWV0aGluZyBlbHNlLlxuICAgICAqIH0sIChlcnIpID0+IHtcbiAgICAgKiAgICAgLy8gVW5yZWFjaGFibGU6IHRoZSBwcm9taXNlIHJldHVybmVkIGZyb20gY2FuY2VsIHdpbGwgbmV2ZXIgcmVqZWN0LlxuICAgICAqIH0pO1xuICAgICAqIGBgYFxuICAgICAqIE5vdGUgdGhhdCB0aGUgcmV0dXJuZWQgcHJvbWlzZSB3aWxsIF9ub3RfIGhhbmRsZSBpbXBsaWNpdGx5IGFueSByZWplY3Rpb25cbiAgICAgKiB0aGF0IG1pZ2h0IGhhdmUgb2NjdXJyZWQgYWxyZWFkeSBpbiB0aGUgY2FuY2VsbGVkIGNoYWluLlxuICAgICAqIEl0IHdpbGwganVzdCB0cmFjayB3aGV0aGVyIHJlZ2lzdGVyZWQgaGFuZGxlcnMgaGF2ZSBiZWVuIGV4ZWN1dGVkIG9yIG5vdC5cbiAgICAgKiBUaGVyZWZvcmUsIHVuaGFuZGxlZCByZWplY3Rpb25zIHdpbGwgbmV2ZXIgYmUgc2lsZW50bHkgaGFuZGxlZCBieSBjYWxsaW5nIGNhbmNlbC5cbiAgICAgKi9cbiAgICBjYW5jZWwoY2F1c2U/OiBhbnkpOiBDYW5jZWxsYWJsZVByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gbmV3IENhbmNlbGxhYmxlUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgLy8gSU5WQVJJQU5UOiB0aGUgcmVzdWx0IG9mIHRoaXNbY2FuY2VsSW1wbFN5bV0gYW5kIHRoZSBiYXJyaWVyIGRvIG5vdCBldmVyIHJlamVjdC5cbiAgICAgICAgICAgIC8vIFVuZm9ydHVuYXRlbHkgbWFjT1MgSGlnaCBTaWVycmEgZG9lcyBub3Qgc3VwcG9ydCBQcm9taXNlLmFsbFNldHRsZWQuXG4gICAgICAgICAgICBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgdGhpc1tjYW5jZWxJbXBsU3ltXShuZXcgQ2FuY2VsRXJyb3IoXCJQcm9taXNlIGNhbmNlbGxlZC5cIiwgeyBjYXVzZSB9KSksXG4gICAgICAgICAgICAgICAgY3VycmVudEJhcnJpZXIodGhpcylcbiAgICAgICAgICAgIF0pLnRoZW4oKCkgPT4gcmVzb2x2ZSgpLCAoKSA9PiByZXNvbHZlKCkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCaW5kcyBwcm9taXNlIGNhbmNlbGxhdGlvbiB0byB0aGUgYWJvcnQgZXZlbnQgb2YgdGhlIGdpdmVuIHtAbGluayBBYm9ydFNpZ25hbH0uXG4gICAgICogSWYgdGhlIHNpZ25hbCBoYXMgYWxyZWFkeSBhYm9ydGVkLCB0aGUgcHJvbWlzZSB3aWxsIGJlIGNhbmNlbGxlZCBpbW1lZGlhdGVseS5cbiAgICAgKiBXaGVuIGVpdGhlciBjb25kaXRpb24gaXMgdmVyaWZpZWQsIHRoZSBjYW5jZWxsYXRpb24gY2F1c2Ugd2lsbCBiZSBzZXRcbiAgICAgKiB0byB0aGUgc2lnbmFsJ3MgYWJvcnQgcmVhc29uIChzZWUge0BsaW5rIEFib3J0U2lnbmFsI3JlYXNvbn0pLlxuICAgICAqXG4gICAgICogSGFzIG5vIGVmZmVjdCBpZiBjYWxsZWQgKG9yIGlmIHRoZSBzaWduYWwgYWJvcnRzKSBfYWZ0ZXJfIHRoZSBwcm9taXNlIGhhcyBhbHJlYWR5IHNldHRsZWQuXG4gICAgICogT25seSB0aGUgZmlyc3Qgc2lnbmFsIHRvIGFib3J0IHdpbGwgc2V0IHRoZSBjYW5jZWxsYXRpb24gY2F1c2UuXG4gICAgICpcbiAgICAgKiBGb3IgbW9yZSBkZXRhaWxzIGFib3V0IHRoZSBjYW5jZWxsYXRpb24gcHJvY2VzcyxcbiAgICAgKiBzZWUge0BsaW5rIGNhbmNlbH0gYW5kIHRoZSBgQ2FuY2VsbGFibGVQcm9taXNlYCBjb25zdHJ1Y3Rvci5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGVuYWJsZXMgYGF3YWl0YGluZyBjYW5jZWxsYWJsZSBwcm9taXNlcyB3aXRob3V0IGhhdmluZ1xuICAgICAqIHRvIHN0b3JlIHRoZW0gZm9yIGZ1dHVyZSBjYW5jZWxsYXRpb24sIGUuZy46XG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBsb25nUnVubmluZ09wZXJhdGlvbigpLmNhbmNlbE9uKHNpZ25hbCk7XG4gICAgICogYGBgXG4gICAgICogaW5zdGVhZCBvZjpcbiAgICAgKiBgYGB0c1xuICAgICAqIGxldCBwcm9taXNlVG9CZUNhbmNlbGxlZCA9IGxvbmdSdW5uaW5nT3BlcmF0aW9uKCk7XG4gICAgICogYXdhaXQgcHJvbWlzZVRvQmVDYW5jZWxsZWQ7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGlzIHByb21pc2UsIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICovXG4gICAgY2FuY2VsT24oc2lnbmFsOiBBYm9ydFNpZ25hbCk6IENhbmNlbGxhYmxlUHJvbWlzZTxUPiB7XG4gICAgICAgIGlmIChzaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgICAgdm9pZCB0aGlzLmNhbmNlbChzaWduYWwucmVhc29uKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgKCkgPT4gdm9pZCB0aGlzLmNhbmNlbChzaWduYWwucmVhc29uKSwge2NhcHR1cmU6IHRydWV9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEF0dGFjaGVzIGNhbGxiYWNrcyBmb3IgdGhlIHJlc29sdXRpb24gYW5kL29yIHJlamVjdGlvbiBvZiB0aGUgYENhbmNlbGxhYmxlUHJvbWlzZWAuXG4gICAgICpcbiAgICAgKiBUaGUgb3B0aW9uYWwgYG9uY2FuY2VsbGVkYCBhcmd1bWVudCB3aWxsIGJlIGludm9rZWQgd2hlbiB0aGUgcmV0dXJuZWQgcHJvbWlzZSBpcyBjYW5jZWxsZWQsXG4gICAgICogd2l0aCB0aGUgc2FtZSBzZW1hbnRpY3MgYXMgdGhlIGBvbmNhbmNlbGxlZGAgYXJndW1lbnQgb2YgdGhlIGNvbnN0cnVjdG9yLlxuICAgICAqIFdoZW4gdGhlIHBhcmVudCBwcm9taXNlIHJlamVjdHMgb3IgaXMgY2FuY2VsbGVkLCB0aGUgYG9ucmVqZWN0ZWRgIGNhbGxiYWNrIHdpbGwgcnVuLFxuICAgICAqIF9ldmVuIGFmdGVyIHRoZSByZXR1cm5lZCBwcm9taXNlIGhhcyBiZWVuIGNhbmNlbGxlZDpfXG4gICAgICogaW4gdGhhdCBjYXNlLCBzaG91bGQgaXQgcmVqZWN0IG9yIHRocm93LCB0aGUgcmVhc29uIHdpbGwgYmUgd3JhcHBlZFxuICAgICAqIGluIGEge0BsaW5rIENhbmNlbGxlZFJlamVjdGlvbkVycm9yfSBhbmQgYnViYmxlZCB1cCBhcyBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9uZnVsZmlsbGVkIFRoZSBjYWxsYmFjayB0byBleGVjdXRlIHdoZW4gdGhlIFByb21pc2UgaXMgcmVzb2x2ZWQuXG4gICAgICogQHBhcmFtIG9ucmVqZWN0ZWQgVGhlIGNhbGxiYWNrIHRvIGV4ZWN1dGUgd2hlbiB0aGUgUHJvbWlzZSBpcyByZWplY3RlZC5cbiAgICAgKiBAcmV0dXJucyBBIGBDYW5jZWxsYWJsZVByb21pc2VgIGZvciB0aGUgY29tcGxldGlvbiBvZiB3aGljaGV2ZXIgY2FsbGJhY2sgaXMgZXhlY3V0ZWQuXG4gICAgICogVGhlIHJldHVybmVkIHByb21pc2UgaXMgaG9va2VkIHVwIHRvIHByb3BhZ2F0ZSBjYW5jZWxsYXRpb24gcmVxdWVzdHMgdXAgdGhlIGNoYWluLCBidXQgbm90IGRvd246XG4gICAgICpcbiAgICAgKiAgIC0gaWYgdGhlIHBhcmVudCBwcm9taXNlIGlzIGNhbmNlbGxlZCwgdGhlIGBvbnJlamVjdGVkYCBoYW5kbGVyIHdpbGwgYmUgaW52b2tlZCB3aXRoIGEgYENhbmNlbEVycm9yYFxuICAgICAqICAgICBhbmQgdGhlIHJldHVybmVkIHByb21pc2UgX3dpbGwgcmVzb2x2ZSByZWd1bGFybHlfIHdpdGggaXRzIHJlc3VsdDtcbiAgICAgKiAgIC0gY29udmVyc2VseSwgaWYgdGhlIHJldHVybmVkIHByb21pc2UgaXMgY2FuY2VsbGVkLCBfdGhlIHBhcmVudCBwcm9taXNlIGlzIGNhbmNlbGxlZCB0b287X1xuICAgICAqICAgICB0aGUgYG9ucmVqZWN0ZWRgIGhhbmRsZXIgd2lsbCBzdGlsbCBiZSBpbnZva2VkIHdpdGggdGhlIHBhcmVudCdzIGBDYW5jZWxFcnJvcmAsXG4gICAgICogICAgIGJ1dCBpdHMgcmVzdWx0IHdpbGwgYmUgZGlzY2FyZGVkXG4gICAgICogICAgIGFuZCB0aGUgcmV0dXJuZWQgcHJvbWlzZSB3aWxsIHJlamVjdCB3aXRoIGEgYENhbmNlbEVycm9yYCBhcyB3ZWxsLlxuICAgICAqXG4gICAgICogVGhlIHByb21pc2UgcmV0dXJuZWQgZnJvbSB7QGxpbmsgY2FuY2VsfSB3aWxsIGZ1bGZpbGwgb25seSBhZnRlciBhbGwgYXR0YWNoZWQgaGFuZGxlcnNcbiAgICAgKiB1cCB0aGUgZW50aXJlIHByb21pc2UgY2hhaW4gaGF2ZSBiZWVuIHJ1bi5cbiAgICAgKlxuICAgICAqIElmIGVpdGhlciBjYWxsYmFjayByZXR1cm5zIGEgY2FuY2VsbGFibGUgcHJvbWlzZSxcbiAgICAgKiBjYW5jZWxsYXRpb24gcmVxdWVzdHMgd2lsbCBiZSBkaXZlcnRlZCB0byBpdCxcbiAgICAgKiBhbmQgdGhlIHNwZWNpZmllZCBgb25jYW5jZWxsZWRgIGNhbGxiYWNrIHdpbGwgYmUgZGlzY2FyZGVkLlxuICAgICAqL1xuICAgIHRoZW48VFJlc3VsdDEgPSBULCBUUmVzdWx0MiA9IG5ldmVyPihvbmZ1bGZpbGxlZD86ICgodmFsdWU6IFQpID0+IFRSZXN1bHQxIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDE+IHwgQ2FuY2VsbGFibGVQcm9taXNlTGlrZTxUUmVzdWx0MT4pIHwgdW5kZWZpbmVkIHwgbnVsbCwgb25yZWplY3RlZD86ICgocmVhc29uOiBhbnkpID0+IFRSZXN1bHQyIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDI+IHwgQ2FuY2VsbGFibGVQcm9taXNlTGlrZTxUUmVzdWx0Mj4pIHwgdW5kZWZpbmVkIHwgbnVsbCwgb25jYW5jZWxsZWQ/OiBDYW5jZWxsYWJsZVByb21pc2VDYW5jZWxsZXIpOiBDYW5jZWxsYWJsZVByb21pc2U8VFJlc3VsdDEgfCBUUmVzdWx0Mj4ge1xuICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgQ2FuY2VsbGFibGVQcm9taXNlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbmNlbGxhYmxlUHJvbWlzZS5wcm90b3R5cGUudGhlbiBjYWxsZWQgb24gYW4gaW52YWxpZCBvYmplY3QuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTk9URTogVHlwZVNjcmlwdCdzIGJ1aWx0LWluIHR5cGUgZm9yIHRoZW4gaXMgYnJva2VuLFxuICAgICAgICAvLyBhcyBpdCBhbGxvd3Mgc3BlY2lmeWluZyBhbiBhcmJpdHJhcnkgVFJlc3VsdDEgIT0gVCBldmVuIHdoZW4gb25mdWxmaWxsZWQgaXMgbm90IGEgZnVuY3Rpb24uXG4gICAgICAgIC8vIFdlIGNhbm5vdCBmaXggaXQgaWYgd2Ugd2FudCB0byBDYW5jZWxsYWJsZVByb21pc2UgdG8gaW1wbGVtZW50IFByb21pc2VMaWtlPFQ+LlxuXG4gICAgICAgIGlmICghaXNDYWxsYWJsZShvbmZ1bGZpbGxlZCkpIHsgb25mdWxmaWxsZWQgPSBpZGVudGl0eSBhcyBhbnk7IH1cbiAgICAgICAgaWYgKCFpc0NhbGxhYmxlKG9ucmVqZWN0ZWQpKSB7IG9ucmVqZWN0ZWQgPSB0aHJvd2VyOyB9XG5cbiAgICAgICAgaWYgKG9uZnVsZmlsbGVkID09PSBpZGVudGl0eSAmJiBvbnJlamVjdGVkID09IHRocm93ZXIpIHtcbiAgICAgICAgICAgIC8vIFNob3J0Y3V0IGZvciB0cml2aWFsIGFyZ3VtZW50cy5cbiAgICAgICAgICAgIHJldHVybiBuZXcgQ2FuY2VsbGFibGVQcm9taXNlKChyZXNvbHZlKSA9PiByZXNvbHZlKHRoaXMgYXMgYW55KSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBiYXJyaWVyOiBQYXJ0aWFsPFByb21pc2VXaXRoUmVzb2x2ZXJzPHZvaWQ+PiA9IHt9O1xuICAgICAgICB0aGlzW2JhcnJpZXJTeW1dID0gYmFycmllcjtcblxuICAgICAgICByZXR1cm4gbmV3IENhbmNlbGxhYmxlUHJvbWlzZTxUUmVzdWx0MSB8IFRSZXN1bHQyPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB2b2lkIHN1cGVyLnRoZW4oXG4gICAgICAgICAgICAgICAgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzW2JhcnJpZXJTeW1dID09PSBiYXJyaWVyKSB7IHRoaXNbYmFycmllclN5bV0gPSBudWxsOyB9XG4gICAgICAgICAgICAgICAgICAgIGJhcnJpZXIucmVzb2x2ZT8uKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUob25mdWxmaWxsZWQhKHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIChyZWFzb24/KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzW2JhcnJpZXJTeW1dID09PSBiYXJyaWVyKSB7IHRoaXNbYmFycmllclN5bV0gPSBudWxsOyB9XG4gICAgICAgICAgICAgICAgICAgIGJhcnJpZXIucmVzb2x2ZT8uKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUob25yZWplY3RlZCEocmVhc29uKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9LCBhc3luYyAoY2F1c2U/KSA9PiB7XG4gICAgICAgICAgICAvL2NhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvbmNhbmNlbGxlZD8uKGNhdXNlKTtcbiAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jYW5jZWwoY2F1c2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBdHRhY2hlcyBhIGNhbGxiYWNrIGZvciBvbmx5IHRoZSByZWplY3Rpb24gb2YgdGhlIFByb21pc2UuXG4gICAgICpcbiAgICAgKiBUaGUgb3B0aW9uYWwgYG9uY2FuY2VsbGVkYCBhcmd1bWVudCB3aWxsIGJlIGludm9rZWQgd2hlbiB0aGUgcmV0dXJuZWQgcHJvbWlzZSBpcyBjYW5jZWxsZWQsXG4gICAgICogd2l0aCB0aGUgc2FtZSBzZW1hbnRpY3MgYXMgdGhlIGBvbmNhbmNlbGxlZGAgYXJndW1lbnQgb2YgdGhlIGNvbnN0cnVjdG9yLlxuICAgICAqIFdoZW4gdGhlIHBhcmVudCBwcm9taXNlIHJlamVjdHMgb3IgaXMgY2FuY2VsbGVkLCB0aGUgYG9ucmVqZWN0ZWRgIGNhbGxiYWNrIHdpbGwgcnVuLFxuICAgICAqIF9ldmVuIGFmdGVyIHRoZSByZXR1cm5lZCBwcm9taXNlIGhhcyBiZWVuIGNhbmNlbGxlZDpfXG4gICAgICogaW4gdGhhdCBjYXNlLCBzaG91bGQgaXQgcmVqZWN0IG9yIHRocm93LCB0aGUgcmVhc29uIHdpbGwgYmUgd3JhcHBlZFxuICAgICAqIGluIGEge0BsaW5rIENhbmNlbGxlZFJlamVjdGlvbkVycm9yfSBhbmQgYnViYmxlZCB1cCBhcyBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uLlxuICAgICAqXG4gICAgICogSXQgaXMgZXF1aXZhbGVudCB0b1xuICAgICAqIGBgYHRzXG4gICAgICogY2FuY2VsbGFibGVQcm9taXNlLnRoZW4odW5kZWZpbmVkLCBvbnJlamVjdGVkLCBvbmNhbmNlbGxlZCk7XG4gICAgICogYGBgXG4gICAgICogYW5kIHRoZSBzYW1lIGNhdmVhdHMgYXBwbHkuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBIFByb21pc2UgZm9yIHRoZSBjb21wbGV0aW9uIG9mIHRoZSBjYWxsYmFjay5cbiAgICAgKiBDYW5jZWxsYXRpb24gcmVxdWVzdHMgb24gdGhlIHJldHVybmVkIHByb21pc2VcbiAgICAgKiB3aWxsIHByb3BhZ2F0ZSB1cCB0aGUgY2hhaW4gdG8gdGhlIHBhcmVudCBwcm9taXNlLFxuICAgICAqIGJ1dCBub3QgaW4gdGhlIG90aGVyIGRpcmVjdGlvbi5cbiAgICAgKlxuICAgICAqIFRoZSBwcm9taXNlIHJldHVybmVkIGZyb20ge0BsaW5rIGNhbmNlbH0gd2lsbCBmdWxmaWxsIG9ubHkgYWZ0ZXIgYWxsIGF0dGFjaGVkIGhhbmRsZXJzXG4gICAgICogdXAgdGhlIGVudGlyZSBwcm9taXNlIGNoYWluIGhhdmUgYmVlbiBydW4uXG4gICAgICpcbiAgICAgKiBJZiBgb25yZWplY3RlZGAgcmV0dXJucyBhIGNhbmNlbGxhYmxlIHByb21pc2UsXG4gICAgICogY2FuY2VsbGF0aW9uIHJlcXVlc3RzIHdpbGwgYmUgZGl2ZXJ0ZWQgdG8gaXQsXG4gICAgICogYW5kIHRoZSBzcGVjaWZpZWQgYG9uY2FuY2VsbGVkYCBjYWxsYmFjayB3aWxsIGJlIGRpc2NhcmRlZC5cbiAgICAgKiBTZWUge0BsaW5rIHRoZW59IGZvciBtb3JlIGRldGFpbHMuXG4gICAgICovXG4gICAgY2F0Y2g8VFJlc3VsdCA9IG5ldmVyPihvbnJlamVjdGVkPzogKChyZWFzb246IGFueSkgPT4gKFByb21pc2VMaWtlPFRSZXN1bHQ+IHwgVFJlc3VsdCkpIHwgdW5kZWZpbmVkIHwgbnVsbCwgb25jYW5jZWxsZWQ/OiBDYW5jZWxsYWJsZVByb21pc2VDYW5jZWxsZXIpOiBDYW5jZWxsYWJsZVByb21pc2U8VCB8IFRSZXN1bHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGhlbih1bmRlZmluZWQsIG9ucmVqZWN0ZWQsIG9uY2FuY2VsbGVkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBdHRhY2hlcyBhIGNhbGxiYWNrIHRoYXQgaXMgaW52b2tlZCB3aGVuIHRoZSBDYW5jZWxsYWJsZVByb21pc2UgaXMgc2V0dGxlZCAoZnVsZmlsbGVkIG9yIHJlamVjdGVkKS4gVGhlXG4gICAgICogcmVzb2x2ZWQgdmFsdWUgY2Fubm90IGJlIGFjY2Vzc2VkIG9yIG1vZGlmaWVkIGZyb20gdGhlIGNhbGxiYWNrLlxuICAgICAqIFRoZSByZXR1cm5lZCBwcm9taXNlIHdpbGwgc2V0dGxlIGluIHRoZSBzYW1lIHN0YXRlIGFzIHRoZSBvcmlnaW5hbCBvbmVcbiAgICAgKiBhZnRlciB0aGUgcHJvdmlkZWQgY2FsbGJhY2sgaGFzIGNvbXBsZXRlZCBleGVjdXRpb24sXG4gICAgICogdW5sZXNzIHRoZSBjYWxsYmFjayB0aHJvd3Mgb3IgcmV0dXJucyBhIHJlamVjdGluZyBwcm9taXNlLFxuICAgICAqIGluIHdoaWNoIGNhc2UgdGhlIHJldHVybmVkIHByb21pc2Ugd2lsbCByZWplY3QgYXMgd2VsbC5cbiAgICAgKlxuICAgICAqIFRoZSBvcHRpb25hbCBgb25jYW5jZWxsZWRgIGFyZ3VtZW50IHdpbGwgYmUgaW52b2tlZCB3aGVuIHRoZSByZXR1cm5lZCBwcm9taXNlIGlzIGNhbmNlbGxlZCxcbiAgICAgKiB3aXRoIHRoZSBzYW1lIHNlbWFudGljcyBhcyB0aGUgYG9uY2FuY2VsbGVkYCBhcmd1bWVudCBvZiB0aGUgY29uc3RydWN0b3IuXG4gICAgICogT25jZSB0aGUgcGFyZW50IHByb21pc2Ugc2V0dGxlcywgdGhlIGBvbmZpbmFsbHlgIGNhbGxiYWNrIHdpbGwgcnVuLFxuICAgICAqIF9ldmVuIGFmdGVyIHRoZSByZXR1cm5lZCBwcm9taXNlIGhhcyBiZWVuIGNhbmNlbGxlZDpfXG4gICAgICogaW4gdGhhdCBjYXNlLCBzaG91bGQgaXQgcmVqZWN0IG9yIHRocm93LCB0aGUgcmVhc29uIHdpbGwgYmUgd3JhcHBlZFxuICAgICAqIGluIGEge0BsaW5rIENhbmNlbGxlZFJlamVjdGlvbkVycm9yfSBhbmQgYnViYmxlZCB1cCBhcyBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgaXMgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2Yge0BsaW5rIHRoZW59IGFuZCB0aGUgc2FtZSBjYXZlYXRzIGFwcGx5LlxuICAgICAqIEl0IGlzIHBvbHlmaWxsZWQsIGhlbmNlIGF2YWlsYWJsZSBpbiBldmVyeSBPUy93ZWJ2aWV3IHZlcnNpb24uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBIFByb21pc2UgZm9yIHRoZSBjb21wbGV0aW9uIG9mIHRoZSBjYWxsYmFjay5cbiAgICAgKiBDYW5jZWxsYXRpb24gcmVxdWVzdHMgb24gdGhlIHJldHVybmVkIHByb21pc2VcbiAgICAgKiB3aWxsIHByb3BhZ2F0ZSB1cCB0aGUgY2hhaW4gdG8gdGhlIHBhcmVudCBwcm9taXNlLFxuICAgICAqIGJ1dCBub3QgaW4gdGhlIG90aGVyIGRpcmVjdGlvbi5cbiAgICAgKlxuICAgICAqIFRoZSBwcm9taXNlIHJldHVybmVkIGZyb20ge0BsaW5rIGNhbmNlbH0gd2lsbCBmdWxmaWxsIG9ubHkgYWZ0ZXIgYWxsIGF0dGFjaGVkIGhhbmRsZXJzXG4gICAgICogdXAgdGhlIGVudGlyZSBwcm9taXNlIGNoYWluIGhhdmUgYmVlbiBydW4uXG4gICAgICpcbiAgICAgKiBJZiBgb25maW5hbGx5YCByZXR1cm5zIGEgY2FuY2VsbGFibGUgcHJvbWlzZSxcbiAgICAgKiBjYW5jZWxsYXRpb24gcmVxdWVzdHMgd2lsbCBiZSBkaXZlcnRlZCB0byBpdCxcbiAgICAgKiBhbmQgdGhlIHNwZWNpZmllZCBgb25jYW5jZWxsZWRgIGNhbGxiYWNrIHdpbGwgYmUgZGlzY2FyZGVkLlxuICAgICAqIFNlZSB7QGxpbmsgdGhlbn0gZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKi9cbiAgICBmaW5hbGx5KG9uZmluYWxseT86ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZCB8IG51bGwsIG9uY2FuY2VsbGVkPzogQ2FuY2VsbGFibGVQcm9taXNlQ2FuY2VsbGVyKTogQ2FuY2VsbGFibGVQcm9taXNlPFQ+IHtcbiAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIENhbmNlbGxhYmxlUHJvbWlzZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5jZWxsYWJsZVByb21pc2UucHJvdG90eXBlLmZpbmFsbHkgY2FsbGVkIG9uIGFuIGludmFsaWQgb2JqZWN0LlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNDYWxsYWJsZShvbmZpbmFsbHkpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50aGVuKG9uZmluYWxseSwgb25maW5hbGx5LCBvbmNhbmNlbGxlZCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy50aGVuKFxuICAgICAgICAgICAgKHZhbHVlKSA9PiBDYW5jZWxsYWJsZVByb21pc2UucmVzb2x2ZShvbmZpbmFsbHkoKSkudGhlbigoKSA9PiB2YWx1ZSksXG4gICAgICAgICAgICAocmVhc29uPykgPT4gQ2FuY2VsbGFibGVQcm9taXNlLnJlc29sdmUob25maW5hbGx5KCkpLnRoZW4oKCkgPT4geyB0aHJvdyByZWFzb247IH0pLFxuICAgICAgICAgICAgb25jYW5jZWxsZWQsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2UgdXNlIHRoZSBgW1N5bWJvbC5zcGVjaWVzXWAgc3RhdGljIHByb3BlcnR5LCBpZiBhdmFpbGFibGUsXG4gICAgICogdG8gZGlzYWJsZSB0aGUgYnVpbHQtaW4gYXV0b21hdGljIHN1YmNsYXNzaW5nIGZlYXR1cmVzIGZyb20ge0BsaW5rIFByb21pc2V9LlxuICAgICAqIEl0IGlzIGNyaXRpY2FsIGZvciBwZXJmb3JtYW5jZSByZWFzb25zIHRoYXQgZXh0ZW5kZXJzIGRvIG5vdCBvdmVycmlkZSB0aGlzLlxuICAgICAqIE9uY2UgdGhlIHByb3Bvc2FsIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXJtLWJ1aWx0aW4tc3ViY2xhc3NpbmdcbiAgICAgKiBpcyBlaXRoZXIgYWNjZXB0ZWQgb3IgcmV0aXJlZCwgdGhpcyBpbXBsZW1lbnRhdGlvbiB3aWxsIGhhdmUgdG8gYmUgcmV2aXNlZCBhY2NvcmRpbmdseS5cbiAgICAgKlxuICAgICAqIEBpZ25vcmVcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFtzcGVjaWVzXSgpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIENhbmNlbGxhYmxlUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggYW4gYXJyYXkgb2YgcmVzdWx0c1xuICAgICAqIHdoZW4gYWxsIG9mIHRoZSBwcm92aWRlZCBQcm9taXNlcyByZXNvbHZlLCBvciByZWplY3RlZCB3aGVuIGFueSBQcm9taXNlIGlzIHJlamVjdGVkLlxuICAgICAqXG4gICAgICogRXZlcnkgb25lIG9mIHRoZSBwcm92aWRlZCBvYmplY3RzIHRoYXQgaXMgYSB0aGVuYWJsZSBfYW5kXyBjYW5jZWxsYWJsZSBvYmplY3RcbiAgICAgKiB3aWxsIGJlIGNhbmNlbGxlZCB3aGVuIHRoZSByZXR1cm5lZCBwcm9taXNlIGlzIGNhbmNlbGxlZCwgd2l0aCB0aGUgc2FtZSBjYXVzZS5cbiAgICAgKlxuICAgICAqIEBncm91cCBTdGF0aWMgTWV0aG9kc1xuICAgICAqL1xuICAgIHN0YXRpYyBhbGw8VD4odmFsdWVzOiBJdGVyYWJsZTxUIHwgUHJvbWlzZUxpa2U8VD4+KTogQ2FuY2VsbGFibGVQcm9taXNlPEF3YWl0ZWQ8VD5bXT47XG4gICAgc3RhdGljIGFsbDxUIGV4dGVuZHMgcmVhZG9ubHkgdW5rbm93bltdIHwgW10+KHZhbHVlczogVCk6IENhbmNlbGxhYmxlUHJvbWlzZTx7IC1yZWFkb25seSBbUCBpbiBrZXlvZiBUXTogQXdhaXRlZDxUW1BdPjsgfT47XG4gICAgc3RhdGljIGFsbDxUIGV4dGVuZHMgSXRlcmFibGU8dW5rbm93bj4gfCBBcnJheUxpa2U8dW5rbm93bj4+KHZhbHVlczogVCk6IENhbmNlbGxhYmxlUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIGxldCBjb2xsZWN0ZWQgPSBBcnJheS5mcm9tKHZhbHVlcyk7XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBjb2xsZWN0ZWQubGVuZ3RoID09PSAwXG4gICAgICAgICAgICA/IENhbmNlbGxhYmxlUHJvbWlzZS5yZXNvbHZlKGNvbGxlY3RlZClcbiAgICAgICAgICAgIDogbmV3IENhbmNlbGxhYmxlUHJvbWlzZTx1bmtub3duPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgdm9pZCBQcm9taXNlLmFsbChjb2xsZWN0ZWQpLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICAgIH0sIChjYXVzZT8pOiBQcm9taXNlPHZvaWQ+ID0+IGNhbmNlbEFsbChwcm9taXNlLCBjb2xsZWN0ZWQsIGNhdXNlKSk7XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBDYW5jZWxsYWJsZVByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoIGFuIGFycmF5IG9mIHJlc3VsdHNcbiAgICAgKiB3aGVuIGFsbCBvZiB0aGUgcHJvdmlkZWQgUHJvbWlzZXMgcmVzb2x2ZSBvciByZWplY3QuXG4gICAgICpcbiAgICAgKiBFdmVyeSBvbmUgb2YgdGhlIHByb3ZpZGVkIG9iamVjdHMgdGhhdCBpcyBhIHRoZW5hYmxlIF9hbmRfIGNhbmNlbGxhYmxlIG9iamVjdFxuICAgICAqIHdpbGwgYmUgY2FuY2VsbGVkIHdoZW4gdGhlIHJldHVybmVkIHByb21pc2UgaXMgY2FuY2VsbGVkLCB3aXRoIHRoZSBzYW1lIGNhdXNlLlxuICAgICAqXG4gICAgICogQGdyb3VwIFN0YXRpYyBNZXRob2RzXG4gICAgICovXG4gICAgc3RhdGljIGFsbFNldHRsZWQ8VD4odmFsdWVzOiBJdGVyYWJsZTxUIHwgUHJvbWlzZUxpa2U8VD4+KTogQ2FuY2VsbGFibGVQcm9taXNlPFByb21pc2VTZXR0bGVkUmVzdWx0PEF3YWl0ZWQ8VD4+W10+O1xuICAgIHN0YXRpYyBhbGxTZXR0bGVkPFQgZXh0ZW5kcyByZWFkb25seSB1bmtub3duW10gfCBbXT4odmFsdWVzOiBUKTogQ2FuY2VsbGFibGVQcm9taXNlPHsgLXJlYWRvbmx5IFtQIGluIGtleW9mIFRdOiBQcm9taXNlU2V0dGxlZFJlc3VsdDxBd2FpdGVkPFRbUF0+PjsgfT47XG4gICAgc3RhdGljIGFsbFNldHRsZWQ8VCBleHRlbmRzIEl0ZXJhYmxlPHVua25vd24+IHwgQXJyYXlMaWtlPHVua25vd24+Pih2YWx1ZXM6IFQpOiBDYW5jZWxsYWJsZVByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICBsZXQgY29sbGVjdGVkID0gQXJyYXkuZnJvbSh2YWx1ZXMpO1xuICAgICAgICBjb25zdCBwcm9taXNlID0gY29sbGVjdGVkLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgPyBDYW5jZWxsYWJsZVByb21pc2UucmVzb2x2ZShjb2xsZWN0ZWQpXG4gICAgICAgICAgICA6IG5ldyBDYW5jZWxsYWJsZVByb21pc2U8dW5rbm93bj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHZvaWQgUHJvbWlzZS5hbGxTZXR0bGVkKGNvbGxlY3RlZCkudGhlbihyZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgICAgfSwgKGNhdXNlPyk6IFByb21pc2U8dm9pZD4gPT4gY2FuY2VsQWxsKHByb21pc2UsIGNvbGxlY3RlZCwgY2F1c2UpKTtcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGFueSBmdW5jdGlvbiByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCBieSB0aGUgZmlyc3QgZ2l2ZW4gcHJvbWlzZSB0byBiZSBmdWxmaWxsZWQsXG4gICAgICogb3IgcmVqZWN0ZWQgd2l0aCBhbiBBZ2dyZWdhdGVFcnJvciBjb250YWluaW5nIGFuIGFycmF5IG9mIHJlamVjdGlvbiByZWFzb25zXG4gICAgICogaWYgYWxsIG9mIHRoZSBnaXZlbiBwcm9taXNlcyBhcmUgcmVqZWN0ZWQuXG4gICAgICogSXQgcmVzb2x2ZXMgYWxsIGVsZW1lbnRzIG9mIHRoZSBwYXNzZWQgaXRlcmFibGUgdG8gcHJvbWlzZXMgYXMgaXQgcnVucyB0aGlzIGFsZ29yaXRobS5cbiAgICAgKlxuICAgICAqIEV2ZXJ5IG9uZSBvZiB0aGUgcHJvdmlkZWQgb2JqZWN0cyB0aGF0IGlzIGEgdGhlbmFibGUgX2FuZF8gY2FuY2VsbGFibGUgb2JqZWN0XG4gICAgICogd2lsbCBiZSBjYW5jZWxsZWQgd2hlbiB0aGUgcmV0dXJuZWQgcHJvbWlzZSBpcyBjYW5jZWxsZWQsIHdpdGggdGhlIHNhbWUgY2F1c2UuXG4gICAgICpcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcbiAgICAgKi9cbiAgICBzdGF0aWMgYW55PFQ+KHZhbHVlczogSXRlcmFibGU8VCB8IFByb21pc2VMaWtlPFQ+Pik6IENhbmNlbGxhYmxlUHJvbWlzZTxBd2FpdGVkPFQ+PjtcbiAgICBzdGF0aWMgYW55PFQgZXh0ZW5kcyByZWFkb25seSB1bmtub3duW10gfCBbXT4odmFsdWVzOiBUKTogQ2FuY2VsbGFibGVQcm9taXNlPEF3YWl0ZWQ8VFtudW1iZXJdPj47XG4gICAgc3RhdGljIGFueTxUIGV4dGVuZHMgSXRlcmFibGU8dW5rbm93bj4gfCBBcnJheUxpa2U8dW5rbm93bj4+KHZhbHVlczogVCk6IENhbmNlbGxhYmxlUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIGxldCBjb2xsZWN0ZWQgPSBBcnJheS5mcm9tKHZhbHVlcyk7XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBjb2xsZWN0ZWQubGVuZ3RoID09PSAwXG4gICAgICAgICAgICA/IENhbmNlbGxhYmxlUHJvbWlzZS5yZXNvbHZlKGNvbGxlY3RlZClcbiAgICAgICAgICAgIDogbmV3IENhbmNlbGxhYmxlUHJvbWlzZTx1bmtub3duPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgdm9pZCBQcm9taXNlLmFueShjb2xsZWN0ZWQpLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICAgIH0sIChjYXVzZT8pOiBQcm9taXNlPHZvaWQ+ID0+IGNhbmNlbEFsbChwcm9taXNlLCBjb2xsZWN0ZWQsIGNhdXNlKSk7XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQgd2hlbiBhbnkgb2YgdGhlIHByb3ZpZGVkIFByb21pc2VzIGFyZSByZXNvbHZlZCBvciByZWplY3RlZC5cbiAgICAgKlxuICAgICAqIEV2ZXJ5IG9uZSBvZiB0aGUgcHJvdmlkZWQgb2JqZWN0cyB0aGF0IGlzIGEgdGhlbmFibGUgX2FuZF8gY2FuY2VsbGFibGUgb2JqZWN0XG4gICAgICogd2lsbCBiZSBjYW5jZWxsZWQgd2hlbiB0aGUgcmV0dXJuZWQgcHJvbWlzZSBpcyBjYW5jZWxsZWQsIHdpdGggdGhlIHNhbWUgY2F1c2UuXG4gICAgICpcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcbiAgICAgKi9cbiAgICBzdGF0aWMgcmFjZTxUPih2YWx1ZXM6IEl0ZXJhYmxlPFQgfCBQcm9taXNlTGlrZTxUPj4pOiBDYW5jZWxsYWJsZVByb21pc2U8QXdhaXRlZDxUPj47XG4gICAgc3RhdGljIHJhY2U8VCBleHRlbmRzIHJlYWRvbmx5IHVua25vd25bXSB8IFtdPih2YWx1ZXM6IFQpOiBDYW5jZWxsYWJsZVByb21pc2U8QXdhaXRlZDxUW251bWJlcl0+PjtcbiAgICBzdGF0aWMgcmFjZTxUIGV4dGVuZHMgSXRlcmFibGU8dW5rbm93bj4gfCBBcnJheUxpa2U8dW5rbm93bj4+KHZhbHVlczogVCk6IENhbmNlbGxhYmxlUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIGxldCBjb2xsZWN0ZWQgPSBBcnJheS5mcm9tKHZhbHVlcyk7XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBuZXcgQ2FuY2VsbGFibGVQcm9taXNlPHVua25vd24+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHZvaWQgUHJvbWlzZS5yYWNlKGNvbGxlY3RlZCkudGhlbihyZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9LCAoY2F1c2U/KTogUHJvbWlzZTx2b2lkPiA9PiBjYW5jZWxBbGwocHJvbWlzZSwgY29sbGVjdGVkLCBjYXVzZSkpO1xuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGNhbmNlbGxlZCBDYW5jZWxsYWJsZVByb21pc2UgZm9yIHRoZSBwcm92aWRlZCBjYXVzZS5cbiAgICAgKlxuICAgICAqIEBncm91cCBTdGF0aWMgTWV0aG9kc1xuICAgICAqL1xuICAgIHN0YXRpYyBjYW5jZWw8VCA9IG5ldmVyPihjYXVzZT86IGFueSk6IENhbmNlbGxhYmxlUHJvbWlzZTxUPiB7XG4gICAgICAgIGNvbnN0IHAgPSBuZXcgQ2FuY2VsbGFibGVQcm9taXNlPFQ+KCgpID0+IHt9KTtcbiAgICAgICAgcC5jYW5jZWwoY2F1c2UpO1xuICAgICAgICByZXR1cm4gcDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IENhbmNlbGxhYmxlUHJvbWlzZSB0aGF0IGNhbmNlbHNcbiAgICAgKiBhZnRlciB0aGUgc3BlY2lmaWVkIHRpbWVvdXQsIHdpdGggdGhlIHByb3ZpZGVkIGNhdXNlLlxuICAgICAqXG4gICAgICogSWYgdGhlIHtAbGluayBBYm9ydFNpZ25hbC50aW1lb3V0fSBmYWN0b3J5IG1ldGhvZCBpcyBhdmFpbGFibGUsXG4gICAgICogaXQgaXMgdXNlZCB0byBiYXNlIHRoZSB0aW1lb3V0IG9uIF9hY3RpdmVfIHRpbWUgcmF0aGVyIHRoYW4gX2VsYXBzZWRfIHRpbWUuXG4gICAgICogT3RoZXJ3aXNlLCBgdGltZW91dGAgZmFsbHMgYmFjayB0byB7QGxpbmsgc2V0VGltZW91dH0uXG4gICAgICpcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcbiAgICAgKi9cbiAgICBzdGF0aWMgdGltZW91dDxUID0gbmV2ZXI+KG1pbGxpc2Vjb25kczogbnVtYmVyLCBjYXVzZT86IGFueSk6IENhbmNlbGxhYmxlUHJvbWlzZTxUPiB7XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBuZXcgQ2FuY2VsbGFibGVQcm9taXNlPFQ+KCgpID0+IHt9KTtcbiAgICAgICAgaWYgKEFib3J0U2lnbmFsICYmIHR5cGVvZiBBYm9ydFNpZ25hbCA9PT0gJ2Z1bmN0aW9uJyAmJiBBYm9ydFNpZ25hbC50aW1lb3V0ICYmIHR5cGVvZiBBYm9ydFNpZ25hbC50aW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBBYm9ydFNpZ25hbC50aW1lb3V0KG1pbGxpc2Vjb25kcykuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PiB2b2lkIHByb21pc2UuY2FuY2VsKGNhdXNlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHZvaWQgcHJvbWlzZS5jYW5jZWwoY2F1c2UpLCBtaWxsaXNlY29uZHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ2FuY2VsbGFibGVQcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgdGhlIHNwZWNpZmllZCB0aW1lb3V0LlxuICAgICAqIFRoZSByZXR1cm5lZCBwcm9taXNlIGNhbiBiZSBjYW5jZWxsZWQgd2l0aG91dCBjb25zZXF1ZW5jZXMuXG4gICAgICpcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcbiAgICAgKi9cbiAgICBzdGF0aWMgc2xlZXAobWlsbGlzZWNvbmRzOiBudW1iZXIpOiBDYW5jZWxsYWJsZVByb21pc2U8dm9pZD47XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBDYW5jZWxsYWJsZVByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlclxuICAgICAqIHRoZSBzcGVjaWZpZWQgdGltZW91dCwgd2l0aCB0aGUgcHJvdmlkZWQgdmFsdWUuXG4gICAgICogVGhlIHJldHVybmVkIHByb21pc2UgY2FuIGJlIGNhbmNlbGxlZCB3aXRob3V0IGNvbnNlcXVlbmNlcy5cbiAgICAgKlxuICAgICAqIEBncm91cCBTdGF0aWMgTWV0aG9kc1xuICAgICAqL1xuICAgIHN0YXRpYyBzbGVlcDxUPihtaWxsaXNlY29uZHM6IG51bWJlciwgdmFsdWU6IFQpOiBDYW5jZWxsYWJsZVByb21pc2U8VD47XG4gICAgc3RhdGljIHNsZWVwPFQgPSB2b2lkPihtaWxsaXNlY29uZHM6IG51bWJlciwgdmFsdWU/OiBUKTogQ2FuY2VsbGFibGVQcm9taXNlPFQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBDYW5jZWxsYWJsZVByb21pc2U8VD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZSh2YWx1ZSEpLCBtaWxsaXNlY29uZHMpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHJlamVjdGVkIENhbmNlbGxhYmxlUHJvbWlzZSBmb3IgdGhlIHByb3ZpZGVkIHJlYXNvbi5cbiAgICAgKlxuICAgICAqIEBncm91cCBTdGF0aWMgTWV0aG9kc1xuICAgICAqL1xuICAgIHN0YXRpYyByZWplY3Q8VCA9IG5ldmVyPihyZWFzb24/OiBhbnkpOiBDYW5jZWxsYWJsZVByb21pc2U8VD4ge1xuICAgICAgICByZXR1cm4gbmV3IENhbmNlbGxhYmxlUHJvbWlzZTxUPigoXywgcmVqZWN0KSA9PiByZWplY3QocmVhc29uKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyByZXNvbHZlZCBDYW5jZWxsYWJsZVByb21pc2UuXG4gICAgICpcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcbiAgICAgKi9cbiAgICBzdGF0aWMgcmVzb2x2ZSgpOiBDYW5jZWxsYWJsZVByb21pc2U8dm9pZD47XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyByZXNvbHZlZCBDYW5jZWxsYWJsZVByb21pc2UgZm9yIHRoZSBwcm92aWRlZCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBncm91cCBTdGF0aWMgTWV0aG9kc1xuICAgICAqL1xuICAgIHN0YXRpYyByZXNvbHZlPFQ+KHZhbHVlOiBUKTogQ2FuY2VsbGFibGVQcm9taXNlPEF3YWl0ZWQ8VD4+O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgcmVzb2x2ZWQgQ2FuY2VsbGFibGVQcm9taXNlIGZvciB0aGUgcHJvdmlkZWQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcbiAgICAgKi9cbiAgICBzdGF0aWMgcmVzb2x2ZTxUPih2YWx1ZTogVCB8IFByb21pc2VMaWtlPFQ+KTogQ2FuY2VsbGFibGVQcm9taXNlPEF3YWl0ZWQ8VD4+O1xuICAgIHN0YXRpYyByZXNvbHZlPFQgPSB2b2lkPih2YWx1ZT86IFQgfCBQcm9taXNlTGlrZTxUPik6IENhbmNlbGxhYmxlUHJvbWlzZTxBd2FpdGVkPFQ+PiB7XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIENhbmNlbGxhYmxlUHJvbWlzZSkge1xuICAgICAgICAgICAgLy8gT3B0aW1pc2UgZm9yIGNhbmNlbGxhYmxlIHByb21pc2VzLlxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQ2FuY2VsbGFibGVQcm9taXNlPGFueT4oKHJlc29sdmUpID0+IHJlc29sdmUodmFsdWUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IENhbmNlbGxhYmxlUHJvbWlzZSBhbmQgcmV0dXJucyBpdCBpbiBhbiBvYmplY3QsIGFsb25nIHdpdGggaXRzIHJlc29sdmUgYW5kIHJlamVjdCBmdW5jdGlvbnNcbiAgICAgKiBhbmQgYSBnZXR0ZXIvc2V0dGVyIGZvciB0aGUgY2FuY2VsbGF0aW9uIGNhbGxiYWNrLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgaXMgcG9seWZpbGxlZCwgaGVuY2UgYXZhaWxhYmxlIGluIGV2ZXJ5IE9TL3dlYnZpZXcgdmVyc2lvbi5cbiAgICAgKlxuICAgICAqIEBncm91cCBTdGF0aWMgTWV0aG9kc1xuICAgICAqL1xuICAgIHN0YXRpYyB3aXRoUmVzb2x2ZXJzPFQ+KCk6IENhbmNlbGxhYmxlUHJvbWlzZVdpdGhSZXNvbHZlcnM8VD4ge1xuICAgICAgICBsZXQgcmVzdWx0OiBDYW5jZWxsYWJsZVByb21pc2VXaXRoUmVzb2x2ZXJzPFQ+ID0geyBvbmNhbmNlbGxlZDogbnVsbCB9IGFzIGFueTtcbiAgICAgICAgcmVzdWx0LnByb21pc2UgPSBuZXcgQ2FuY2VsbGFibGVQcm9taXNlPFQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHJlc3VsdC5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgICAgIHJlc3VsdC5yZWplY3QgPSByZWplY3Q7XG4gICAgICAgIH0sIChjYXVzZT86IGFueSkgPT4geyByZXN1bHQub25jYW5jZWxsZWQ/LihjYXVzZSk7IH0pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgY2FsbGJhY2sgdGhhdCBpbXBsZW1lbnRzIHRoZSBjYW5jZWxsYXRpb24gYWxnb3JpdGhtIGZvciB0aGUgZ2l2ZW4gY2FuY2VsbGFibGUgcHJvbWlzZS5cbiAqIFRoZSBwcm9taXNlIHJldHVybmVkIGZyb20gdGhlIHJlc3VsdGluZyBmdW5jdGlvbiBkb2VzIG5vdCByZWplY3QuXG4gKi9cbmZ1bmN0aW9uIGNhbmNlbGxlckZvcjxUPihwcm9taXNlOiBDYW5jZWxsYWJsZVByb21pc2VXaXRoUmVzb2x2ZXJzPFQ+LCBzdGF0ZTogQ2FuY2VsbGFibGVQcm9taXNlU3RhdGUpIHtcbiAgICBsZXQgY2FuY2VsbGF0aW9uUHJvbWlzZTogdm9pZCB8IFByb21pc2VMaWtlPHZvaWQ+ID0gdW5kZWZpbmVkO1xuXG4gICAgcmV0dXJuIChyZWFzb246IENhbmNlbEVycm9yKTogdm9pZCB8IFByb21pc2VMaWtlPHZvaWQ+ID0+IHtcbiAgICAgICAgaWYgKCFzdGF0ZS5zZXR0bGVkKSB7XG4gICAgICAgICAgICBzdGF0ZS5zZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHN0YXRlLnJlYXNvbiA9IHJlYXNvbjtcbiAgICAgICAgICAgIHByb21pc2UucmVqZWN0KHJlYXNvbik7XG5cbiAgICAgICAgICAgIC8vIEF0dGFjaCBhbiBlcnJvciBoYW5kbGVyIHRoYXQgaWdub3JlcyB0aGlzIHNwZWNpZmljIHJlamVjdGlvbiByZWFzb24gYW5kIG5vdGhpbmcgZWxzZS5cbiAgICAgICAgICAgIC8vIEluIHRoZW9yeSwgYSBzYW5lIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gYXQgdGhpcyBwb2ludFxuICAgICAgICAgICAgLy8gc2hvdWxkIGFsd2F5cyByZWplY3Qgd2l0aCBvdXIgY2FuY2VsbGF0aW9uIHJlYXNvbixcbiAgICAgICAgICAgIC8vIGhlbmNlIHRoZSBoYW5kbGVyIHdpbGwgbmV2ZXIgdGhyb3cuXG4gICAgICAgICAgICB2b2lkIFByb21pc2UucHJvdG90eXBlLnRoZW4uY2FsbChwcm9taXNlLnByb21pc2UsIHVuZGVmaW5lZCwgKGVycikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlcnIgIT09IHJlYXNvbikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiByZWFzb24gaXMgbm90IHNldCwgdGhlIHByb21pc2UgcmVzb2x2ZWQgcmVndWxhcmx5LCBoZW5jZSB3ZSBtdXN0IG5vdCBjYWxsIG9uY2FuY2VsbGVkLlxuICAgICAgICAvLyBJZiBvbmNhbmNlbGxlZCBpcyB1bnNldCwgbm8gbmVlZCB0byBnbyBhbnkgZnVydGhlci5cbiAgICAgICAgaWYgKCFzdGF0ZS5yZWFzb24gfHwgIXByb21pc2Uub25jYW5jZWxsZWQpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgY2FuY2VsbGF0aW9uUHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUocHJvbWlzZS5vbmNhbmNlbGxlZCEoc3RhdGUucmVhc29uIS5jYXVzZSkpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgUHJvbWlzZS5yZWplY3QobmV3IENhbmNlbGxlZFJlamVjdGlvbkVycm9yKHByb21pc2UucHJvbWlzZSwgZXJyLCBcIlVuaGFuZGxlZCBleGNlcHRpb24gaW4gb25jYW5jZWxsZWQgY2FsbGJhY2suXCIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkuY2F0Y2goKHJlYXNvbj8pID0+IHtcbiAgICAgICAgICAgIFByb21pc2UucmVqZWN0KG5ldyBDYW5jZWxsZWRSZWplY3Rpb25FcnJvcihwcm9taXNlLnByb21pc2UsIHJlYXNvbiwgXCJVbmhhbmRsZWQgcmVqZWN0aW9uIGluIG9uY2FuY2VsbGVkIGNhbGxiYWNrLlwiKSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFVuc2V0IG9uY2FuY2VsbGVkIHRvIHByZXZlbnQgcmVwZWF0ZWQgY2FsbHMuXG4gICAgICAgIHByb21pc2Uub25jYW5jZWxsZWQgPSBudWxsO1xuXG4gICAgICAgIHJldHVybiBjYW5jZWxsYXRpb25Qcm9taXNlO1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgY2FsbGJhY2sgdGhhdCBpbXBsZW1lbnRzIHRoZSByZXNvbHV0aW9uIGFsZ29yaXRobSBmb3IgdGhlIGdpdmVuIGNhbmNlbGxhYmxlIHByb21pc2UuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVyRm9yPFQ+KHByb21pc2U6IENhbmNlbGxhYmxlUHJvbWlzZVdpdGhSZXNvbHZlcnM8VD4sIHN0YXRlOiBDYW5jZWxsYWJsZVByb21pc2VTdGF0ZSk6IENhbmNlbGxhYmxlUHJvbWlzZVJlc29sdmVyPFQ+IHtcbiAgICByZXR1cm4gKHZhbHVlKSA9PiB7XG4gICAgICAgIGlmIChzdGF0ZS5yZXNvbHZpbmcpIHsgcmV0dXJuOyB9XG4gICAgICAgIHN0YXRlLnJlc29sdmluZyA9IHRydWU7XG5cbiAgICAgICAgaWYgKHZhbHVlID09PSBwcm9taXNlLnByb21pc2UpIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZS5zZXR0bGVkKSB7IHJldHVybjsgfVxuICAgICAgICAgICAgc3RhdGUuc2V0dGxlZCA9IHRydWU7XG4gICAgICAgICAgICBwcm9taXNlLnJlamVjdChuZXcgVHlwZUVycm9yKFwiQSBwcm9taXNlIGNhbm5vdCBiZSByZXNvbHZlZCB3aXRoIGl0c2VsZi5cIikpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSkge1xuICAgICAgICAgICAgbGV0IHRoZW46IGFueTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhlbiA9ICh2YWx1ZSBhcyBhbnkpLnRoZW47XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBzdGF0ZS5zZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBwcm9taXNlLnJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlzQ2FsbGFibGUodGhlbikpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY2FuY2VsID0gKHZhbHVlIGFzIGFueSkuY2FuY2VsO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNDYWxsYWJsZShjYW5jZWwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvbmNhbmNlbGxlZCA9IChjYXVzZT86IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZmxlY3QuYXBwbHkoY2FuY2VsLCB2YWx1ZSwgW2NhdXNlXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLnJlYXNvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGFscmVhZHkgY2FuY2VsbGVkLCBwcm9wYWdhdGUgY2FuY2VsbGF0aW9uLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBwcm9taXNlIHJldHVybmVkIGZyb20gdGhlIGNhbmNlbGxlciBhbGdvcml0aG0gZG9lcyBub3QgcmVqZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gaXQgY2FuIGJlIGRpc2NhcmRlZCBzYWZlbHkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCBjYW5jZWxsZXJGb3IoeyAuLi5wcm9taXNlLCBvbmNhbmNlbGxlZCB9LCBzdGF0ZSkoc3RhdGUucmVhc29uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZS5vbmNhbmNlbGxlZCA9IG9uY2FuY2VsbGVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCB7fVxuXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3U3RhdGU6IENhbmNlbGxhYmxlUHJvbWlzZVN0YXRlID0ge1xuICAgICAgICAgICAgICAgICAgICByb290OiBzdGF0ZS5yb290LFxuICAgICAgICAgICAgICAgICAgICByZXNvbHZpbmc6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBnZXQgc2V0dGxlZCgpIHsgcmV0dXJuIHRoaXMucm9vdC5zZXR0bGVkIH0sXG4gICAgICAgICAgICAgICAgICAgIHNldCBzZXR0bGVkKHZhbHVlKSB7IHRoaXMucm9vdC5zZXR0bGVkID0gdmFsdWU7IH0sXG4gICAgICAgICAgICAgICAgICAgIGdldCByZWFzb24oKSB7IHJldHVybiB0aGlzLnJvb3QucmVhc29uIH1cbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVqZWN0b3IgPSByZWplY3RvckZvcihwcm9taXNlLCBuZXdTdGF0ZSk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgUmVmbGVjdC5hcHBseSh0aGVuLCB2YWx1ZSwgW3Jlc29sdmVyRm9yKHByb21pc2UsIG5ld1N0YXRlKSwgcmVqZWN0b3JdKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0b3IoZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBJTVBPUlRBTlQhXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RhdGUuc2V0dGxlZCkgeyByZXR1cm47IH1cbiAgICAgICAgc3RhdGUuc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIHByb21pc2UucmVzb2x2ZSh2YWx1ZSk7XG4gICAgfTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgY2FsbGJhY2sgdGhhdCBpbXBsZW1lbnRzIHRoZSByZWplY3Rpb24gYWxnb3JpdGhtIGZvciB0aGUgZ2l2ZW4gY2FuY2VsbGFibGUgcHJvbWlzZS5cbiAqL1xuZnVuY3Rpb24gcmVqZWN0b3JGb3I8VD4ocHJvbWlzZTogQ2FuY2VsbGFibGVQcm9taXNlV2l0aFJlc29sdmVyczxUPiwgc3RhdGU6IENhbmNlbGxhYmxlUHJvbWlzZVN0YXRlKTogQ2FuY2VsbGFibGVQcm9taXNlUmVqZWN0b3Ige1xuICAgIHJldHVybiAocmVhc29uPykgPT4ge1xuICAgICAgICBpZiAoc3RhdGUucmVzb2x2aW5nKSB7IHJldHVybjsgfVxuICAgICAgICBzdGF0ZS5yZXNvbHZpbmcgPSB0cnVlO1xuXG4gICAgICAgIGlmIChzdGF0ZS5zZXR0bGVkKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBDYW5jZWxFcnJvciAmJiBzdGF0ZS5yZWFzb24gaW5zdGFuY2VvZiBDYW5jZWxFcnJvciAmJiBPYmplY3QuaXMocmVhc29uLmNhdXNlLCBzdGF0ZS5yZWFzb24uY2F1c2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFN3YWxsb3cgbGF0ZSByZWplY3Rpb25zIHRoYXQgYXJlIENhbmNlbEVycm9ycyB3aG9zZSBjYW5jZWxsYXRpb24gY2F1c2UgaXMgdGhlIHNhbWUgYXMgb3Vycy5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2gge31cblxuICAgICAgICAgICAgdm9pZCBQcm9taXNlLnJlamVjdChuZXcgQ2FuY2VsbGVkUmVqZWN0aW9uRXJyb3IocHJvbWlzZS5wcm9taXNlLCByZWFzb24pKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YXRlLnNldHRsZWQgPSB0cnVlO1xuICAgICAgICAgICAgcHJvbWlzZS5yZWplY3QocmVhc29uKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBDYW5jZWxzIGFsbCB2YWx1ZXMgaW4gYW4gYXJyYXkgdGhhdCBsb29rIGxpa2UgY2FuY2VsbGFibGUgdGhlbmFibGVzLlxuICogUmV0dXJucyBhIHByb21pc2UgdGhhdCBmdWxmaWxscyBvbmNlIGFsbCBjYW5jZWxsYXRpb24gcHJvY2VkdXJlcyBmb3IgdGhlIGdpdmVuIHZhbHVlcyBoYXZlIHNldHRsZWQuXG4gKi9cbmZ1bmN0aW9uIGNhbmNlbEFsbChwYXJlbnQ6IENhbmNlbGxhYmxlUHJvbWlzZTx1bmtub3duPiwgdmFsdWVzOiBhbnlbXSwgY2F1c2U/OiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZXN1bHRzID0gW107XG5cbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgICBsZXQgY2FuY2VsOiBDYW5jZWxsYWJsZVByb21pc2VDYW5jZWxsZXI7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIWlzQ2FsbGFibGUodmFsdWUudGhlbikpIHsgY29udGludWU7IH1cbiAgICAgICAgICAgIGNhbmNlbCA9IHZhbHVlLmNhbmNlbDtcbiAgICAgICAgICAgIGlmICghaXNDYWxsYWJsZShjYW5jZWwpKSB7IGNvbnRpbnVlOyB9XG4gICAgICAgIH0gY2F0Y2ggeyBjb250aW51ZTsgfVxuXG4gICAgICAgIGxldCByZXN1bHQ6IHZvaWQgfCBQcm9taXNlTGlrZTx2b2lkPjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlc3VsdCA9IFJlZmxlY3QuYXBwbHkoY2FuY2VsLCB2YWx1ZSwgW2NhdXNlXSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgUHJvbWlzZS5yZWplY3QobmV3IENhbmNlbGxlZFJlamVjdGlvbkVycm9yKHBhcmVudCwgZXJyLCBcIlVuaGFuZGxlZCBleGNlcHRpb24gaW4gY2FuY2VsIG1ldGhvZC5cIikpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXJlc3VsdCkgeyBjb250aW51ZTsgfVxuICAgICAgICByZXN1bHRzLnB1c2goXG4gICAgICAgICAgICAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSAgPyByZXN1bHQgOiBQcm9taXNlLnJlc29sdmUocmVzdWx0KSkuY2F0Y2goKHJlYXNvbj8pID0+IHtcbiAgICAgICAgICAgICAgICBQcm9taXNlLnJlamVjdChuZXcgQ2FuY2VsbGVkUmVqZWN0aW9uRXJyb3IocGFyZW50LCByZWFzb24sIFwiVW5oYW5kbGVkIHJlamVjdGlvbiBpbiBjYW5jZWwgbWV0aG9kLlwiKSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLmFsbChyZXN1bHRzKSBhcyBhbnk7XG59XG5cbi8qKlxuICogUmV0dXJucyBpdHMgYXJndW1lbnQuXG4gKi9cbmZ1bmN0aW9uIGlkZW50aXR5PFQ+KHg6IFQpOiBUIHtcbiAgICByZXR1cm4geDtcbn1cblxuLyoqXG4gKiBUaHJvd3MgaXRzIGFyZ3VtZW50LlxuICovXG5mdW5jdGlvbiB0aHJvd2VyKHJlYXNvbj86IGFueSk6IG5ldmVyIHtcbiAgICB0aHJvdyByZWFzb247XG59XG5cbi8qKlxuICogQXR0ZW1wdHMgdmFyaW91cyBzdHJhdGVnaWVzIHRvIGNvbnZlcnQgYW4gZXJyb3IgdG8gYSBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGVycm9yTWVzc2FnZShlcnI6IGFueSk6IHN0cmluZyB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIEVycm9yIHx8IHR5cGVvZiBlcnIgIT09ICdvYmplY3QnIHx8IGVyci50b1N0cmluZyAhPT0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIFwiXCIgKyBlcnI7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIHt9XG5cbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZXJyKTtcbiAgICB9IGNhdGNoIHt9XG5cbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGVycik7XG4gICAgfSBjYXRjaCB7fVxuXG4gICAgcmV0dXJuIFwiPGNvdWxkIG5vdCBjb252ZXJ0IGVycm9yIHRvIHN0cmluZz5cIjtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBjdXJyZW50IGJhcnJpZXIgcHJvbWlzZSBmb3IgdGhlIGdpdmVuIGNhbmNlbGxhYmxlIHByb21pc2UuIElmIG5lY2Vzc2FyeSwgaW5pdGlhbGlzZXMgdGhlIGJhcnJpZXIuXG4gKi9cbmZ1bmN0aW9uIGN1cnJlbnRCYXJyaWVyPFQ+KHByb21pc2U6IENhbmNlbGxhYmxlUHJvbWlzZTxUPik6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBwd3I6IFBhcnRpYWw8UHJvbWlzZVdpdGhSZXNvbHZlcnM8dm9pZD4+ID0gcHJvbWlzZVtiYXJyaWVyU3ltXSA/PyB7fTtcbiAgICBpZiAoISgncHJvbWlzZScgaW4gcHdyKSkge1xuICAgICAgICBPYmplY3QuYXNzaWduKHB3ciwgcHJvbWlzZVdpdGhSZXNvbHZlcnM8dm9pZD4oKSk7XG4gICAgfVxuICAgIGlmIChwcm9taXNlW2JhcnJpZXJTeW1dID09IG51bGwpIHtcbiAgICAgICAgcHdyLnJlc29sdmUhKCk7XG4gICAgICAgIHByb21pc2VbYmFycmllclN5bV0gPSBwd3I7XG4gICAgfVxuICAgIHJldHVybiBwd3IucHJvbWlzZSE7XG59XG5cbi8vIFBvbHlmaWxsIFByb21pc2Uud2l0aFJlc29sdmVycy5cbmxldCBwcm9taXNlV2l0aFJlc29sdmVycyA9IFByb21pc2Uud2l0aFJlc29sdmVycztcbmlmIChwcm9taXNlV2l0aFJlc29sdmVycyAmJiB0eXBlb2YgcHJvbWlzZVdpdGhSZXNvbHZlcnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBwcm9taXNlV2l0aFJlc29sdmVycyA9IHByb21pc2VXaXRoUmVzb2x2ZXJzLmJpbmQoUHJvbWlzZSk7XG59IGVsc2Uge1xuICAgIHByb21pc2VXaXRoUmVzb2x2ZXJzID0gZnVuY3Rpb24gPFQ+KCk6IFByb21pc2VXaXRoUmVzb2x2ZXJzPFQ+IHtcbiAgICAgICAgbGV0IHJlc29sdmUhOiAodmFsdWU6IFQgfCBQcm9taXNlTGlrZTxUPikgPT4gdm9pZDtcbiAgICAgICAgbGV0IHJlamVjdCE6IChyZWFzb24/OiBhbnkpID0+IHZvaWQ7XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZTxUPigocmVzLCByZWopID0+IHsgcmVzb2x2ZSA9IHJlczsgcmVqZWN0ID0gcmVqOyB9KTtcbiAgICAgICAgcmV0dXJuIHsgcHJvbWlzZSwgcmVzb2x2ZSwgcmVqZWN0IH07XG4gICAgfVxufSIsICIvKlxuIF9cdCAgIF9fXHQgIF8gX19cbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxuKi9cblxuaW1wb3J0IHtuZXdSdW50aW1lQ2FsbGVyLCBvYmplY3ROYW1lc30gZnJvbSBcIi4vcnVudGltZS5qc1wiO1xuXG5jb25zdCBjYWxsID0gbmV3UnVudGltZUNhbGxlcihvYmplY3ROYW1lcy5DbGlwYm9hcmQpO1xuXG5jb25zdCBDbGlwYm9hcmRTZXRUZXh0ID0gMDtcbmNvbnN0IENsaXBib2FyZFRleHQgPSAxO1xuXG4vKipcbiAqIFNldHMgdGhlIHRleHQgdG8gdGhlIENsaXBib2FyZC5cbiAqXG4gKiBAcGFyYW0gdGV4dCAtIFRoZSB0ZXh0IHRvIGJlIHNldCB0byB0aGUgQ2xpcGJvYXJkLlxuICogQHJldHVybiBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFNldFRleHQodGV4dDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIGNhbGwoQ2xpcGJvYXJkU2V0VGV4dCwge3RleHR9KTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIENsaXBib2FyZCB0ZXh0XG4gKlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgdGV4dCBmcm9tIHRoZSBDbGlwYm9hcmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBUZXh0KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIGNhbGwoQ2xpcGJvYXJkVGV4dCk7XG59XG4iLCAiLypcbiBfXHQgICBfX1x0ICBfIF9fXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcbiovXG5cbi8qKlxuICogQW55IGlzIGEgZHVtbXkgY3JlYXRpb24gZnVuY3Rpb24gZm9yIHNpbXBsZSBvciB1bmtub3duIHR5cGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQW55PFQgPSBhbnk+KHNvdXJjZTogYW55KTogVCB7XG4gICAgcmV0dXJuIHNvdXJjZTtcbn1cblxuLyoqXG4gKiBCeXRlU2xpY2UgaXMgYSBjcmVhdGlvbiBmdW5jdGlvbiB0aGF0IHJlcGxhY2VzXG4gKiBudWxsIHN0cmluZ3Mgd2l0aCBlbXB0eSBzdHJpbmdzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQnl0ZVNsaWNlKHNvdXJjZTogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gKChzb3VyY2UgPT0gbnVsbCkgPyBcIlwiIDogc291cmNlKTtcbn1cblxuLyoqXG4gKiBBcnJheSB0YWtlcyBhIGNyZWF0aW9uIGZ1bmN0aW9uIGZvciBhbiBhcmJpdHJhcnkgdHlwZVxuICogYW5kIHJldHVybnMgYW4gaW4tcGxhY2UgY3JlYXRpb24gZnVuY3Rpb24gZm9yIGFuIGFycmF5XG4gKiB3aG9zZSBlbGVtZW50cyBhcmUgb2YgdGhhdCB0eXBlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQXJyYXk8VCA9IGFueT4oZWxlbWVudDogKHNvdXJjZTogYW55KSA9PiBUKTogKHNvdXJjZTogYW55KSA9PiBUW10ge1xuICAgIGlmIChlbGVtZW50ID09PSBBbnkpIHtcbiAgICAgICAgcmV0dXJuIChzb3VyY2UpID0+IChzb3VyY2UgPT09IG51bGwgPyBbXSA6IHNvdXJjZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIChzb3VyY2UpID0+IHtcbiAgICAgICAgaWYgKHNvdXJjZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc291cmNlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBzb3VyY2VbaV0gPSBlbGVtZW50KHNvdXJjZVtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICB9O1xufVxuXG4vKipcbiAqIE1hcCB0YWtlcyBjcmVhdGlvbiBmdW5jdGlvbnMgZm9yIHR3byBhcmJpdHJhcnkgdHlwZXNcbiAqIGFuZCByZXR1cm5zIGFuIGluLXBsYWNlIGNyZWF0aW9uIGZ1bmN0aW9uIGZvciBhbiBvYmplY3RcbiAqIHdob3NlIGtleXMgYW5kIHZhbHVlcyBhcmUgb2YgdGhvc2UgdHlwZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBNYXA8ViA9IGFueT4oa2V5OiAoc291cmNlOiBhbnkpID0+IHN0cmluZywgdmFsdWU6IChzb3VyY2U6IGFueSkgPT4gVik6IChzb3VyY2U6IGFueSkgPT4gUmVjb3JkPHN0cmluZywgVj4ge1xuICAgIGlmICh2YWx1ZSA9PT0gQW55KSB7XG4gICAgICAgIHJldHVybiAoc291cmNlKSA9PiAoc291cmNlID09PSBudWxsID8ge30gOiBzb3VyY2UpO1xuICAgIH1cblxuICAgIHJldHVybiAoc291cmNlKSA9PiB7XG4gICAgICAgIGlmIChzb3VyY2UgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgIHNvdXJjZVtrZXldID0gdmFsdWUoc291cmNlW2tleV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgfTtcbn1cblxuLyoqXG4gKiBOdWxsYWJsZSB0YWtlcyBhIGNyZWF0aW9uIGZ1bmN0aW9uIGZvciBhbiBhcmJpdHJhcnkgdHlwZVxuICogYW5kIHJldHVybnMgYSBjcmVhdGlvbiBmdW5jdGlvbiBmb3IgYSBudWxsYWJsZSB2YWx1ZSBvZiB0aGF0IHR5cGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBOdWxsYWJsZTxUID0gYW55PihlbGVtZW50OiAoc291cmNlOiBhbnkpID0+IFQpOiAoc291cmNlOiBhbnkpID0+IChUIHwgbnVsbCkge1xuICAgIGlmIChlbGVtZW50ID09PSBBbnkpIHtcbiAgICAgICAgcmV0dXJuIEFueTtcbiAgICB9XG5cbiAgICByZXR1cm4gKHNvdXJjZSkgPT4gKHNvdXJjZSA9PT0gbnVsbCA/IG51bGwgOiBlbGVtZW50KHNvdXJjZSkpO1xufVxuXG4vKipcbiAqIFN0cnVjdCB0YWtlcyBhbiBvYmplY3QgbWFwcGluZyBmaWVsZCBuYW1lcyB0byBjcmVhdGlvbiBmdW5jdGlvbnNcbiAqIGFuZCByZXR1cm5zIGFuIGluLXBsYWNlIGNyZWF0aW9uIGZ1bmN0aW9uIGZvciBhIHN0cnVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFN0cnVjdChjcmVhdGVGaWVsZDogUmVjb3JkPHN0cmluZywgKHNvdXJjZTogYW55KSA9PiBhbnk+KTpcbiAgICA8VSBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBhbnk+KHNvdXJjZTogYW55KSA9PiBVXG57XG4gICAgbGV0IGFsbEFueSA9IHRydWU7XG4gICAgZm9yIChjb25zdCBuYW1lIGluIGNyZWF0ZUZpZWxkKSB7XG4gICAgICAgIGlmIChjcmVhdGVGaWVsZFtuYW1lXSAhPT0gQW55KSB7XG4gICAgICAgICAgICBhbGxBbnkgPSBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChhbGxBbnkpIHtcbiAgICAgICAgcmV0dXJuIEFueTtcbiAgICB9XG5cbiAgICByZXR1cm4gKHNvdXJjZSkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgaW4gY3JlYXRlRmllbGQpIHtcbiAgICAgICAgICAgIGlmIChuYW1lIGluIHNvdXJjZSkge1xuICAgICAgICAgICAgICAgIHNvdXJjZVtuYW1lXSA9IGNyZWF0ZUZpZWxkW25hbWVdKHNvdXJjZVtuYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICB9O1xufVxuIiwgIi8qXG4gX1x0ICAgX19cdCAgXyBfX1xufCB8XHQgLyAvX19fIF8oXykgL19fX19cbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XG4qL1xuXG5leHBvcnQgaW50ZXJmYWNlIFNpemUge1xuICAgIC8qKiBUaGUgd2lkdGggb2YgYSByZWN0YW5ndWxhciBhcmVhLiAqL1xuICAgIFdpZHRoOiBudW1iZXI7XG4gICAgLyoqIFRoZSBoZWlnaHQgb2YgYSByZWN0YW5ndWxhciBhcmVhLiAqL1xuICAgIEhlaWdodDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlY3Qge1xuICAgIC8qKiBUaGUgWCBjb29yZGluYXRlIG9mIHRoZSBvcmlnaW4uICovXG4gICAgWDogbnVtYmVyO1xuICAgIC8qKiBUaGUgWSBjb29yZGluYXRlIG9mIHRoZSBvcmlnaW4uICovXG4gICAgWTogbnVtYmVyO1xuICAgIC8qKiBUaGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZS4gKi9cbiAgICBXaWR0aDogbnVtYmVyO1xuICAgIC8qKiBUaGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUuICovXG4gICAgSGVpZ2h0OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2NyZWVuIHtcbiAgICAvKiogVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBzY3JlZW4uICovXG4gICAgSUQ6IHN0cmluZztcbiAgICAvKiogSHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgc2NyZWVuLiAqL1xuICAgIE5hbWU6IHN0cmluZztcbiAgICAvKiogVGhlIHNjYWxlIGZhY3RvciBvZiB0aGUgc2NyZWVuIChEUEkvOTYpLiAxID0gc3RhbmRhcmQgRFBJLCAyID0gSGlEUEkgKFJldGluYSksIGV0Yy4gKi9cbiAgICBTY2FsZUZhY3RvcjogbnVtYmVyO1xuICAgIC8qKiBUaGUgWCBjb29yZGluYXRlIG9mIHRoZSBzY3JlZW4uICovXG4gICAgWDogbnVtYmVyO1xuICAgIC8qKiBUaGUgWSBjb29yZGluYXRlIG9mIHRoZSBzY3JlZW4uICovXG4gICAgWTogbnVtYmVyO1xuICAgIC8qKiBDb250YWlucyB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgc2NyZWVuLiAqL1xuICAgIFNpemU6IFNpemU7XG4gICAgLyoqIENvbnRhaW5zIHRoZSBib3VuZHMgb2YgdGhlIHNjcmVlbiBpbiB0ZXJtcyBvZiBYLCBZLCBXaWR0aCwgYW5kIEhlaWdodC4gKi9cbiAgICBCb3VuZHM6IFJlY3Q7XG4gICAgLyoqIENvbnRhaW5zIHRoZSBwaHlzaWNhbCBib3VuZHMgb2YgdGhlIHNjcmVlbiBpbiB0ZXJtcyBvZiBYLCBZLCBXaWR0aCwgYW5kIEhlaWdodCAoYmVmb3JlIHNjYWxpbmcpLiAqL1xuICAgIFBoeXNpY2FsQm91bmRzOiBSZWN0O1xuICAgIC8qKiBDb250YWlucyB0aGUgYXJlYSBvZiB0aGUgc2NyZWVuIHRoYXQgaXMgYWN0dWFsbHkgdXNhYmxlIChleGNsdWRpbmcgdGFza2JhciBhbmQgb3RoZXIgc3lzdGVtIFVJKS4gKi9cbiAgICBXb3JrQXJlYTogUmVjdDtcbiAgICAvKiogQ29udGFpbnMgdGhlIHBoeXNpY2FsIFdvcmtBcmVhIG9mIHRoZSBzY3JlZW4gKGJlZm9yZSBzY2FsaW5nKS4gKi9cbiAgICBQaHlzaWNhbFdvcmtBcmVhOiBSZWN0O1xuICAgIC8qKiBUcnVlIGlmIHRoaXMgaXMgdGhlIHByaW1hcnkgbW9uaXRvciBzZWxlY3RlZCBieSB0aGUgdXNlciBpbiB0aGUgb3BlcmF0aW5nIHN5c3RlbS4gKi9cbiAgICBJc1ByaW1hcnk6IGJvb2xlYW47XG4gICAgLyoqIFRoZSByb3RhdGlvbiBvZiB0aGUgc2NyZWVuLiAqL1xuICAgIFJvdGF0aW9uOiBudW1iZXI7XG59XG5cbmltcG9ydCB7IG5ld1J1bnRpbWVDYWxsZXIsIG9iamVjdE5hbWVzIH0gZnJvbSBcIi4vcnVudGltZS5qc1wiO1xuY29uc3QgY2FsbCA9IG5ld1J1bnRpbWVDYWxsZXIob2JqZWN0TmFtZXMuU2NyZWVucyk7XG5cbmNvbnN0IGdldEFsbCA9IDA7XG5jb25zdCBnZXRQcmltYXJ5ID0gMTtcbmNvbnN0IGdldEN1cnJlbnQgPSAyO1xuXG4vKipcbiAqIEdldHMgYWxsIHNjcmVlbnMuXG4gKlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgb2YgU2NyZWVuIG9iamVjdHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBHZXRBbGwoKTogUHJvbWlzZTxTY3JlZW5bXT4ge1xuICAgIHJldHVybiBjYWxsKGdldEFsbCk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgcHJpbWFyeSBzY3JlZW4uXG4gKlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHByaW1hcnkgc2NyZWVuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gR2V0UHJpbWFyeSgpOiBQcm9taXNlPFNjcmVlbj4ge1xuICAgIHJldHVybiBjYWxsKGdldFByaW1hcnkpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGN1cnJlbnQgYWN0aXZlIHNjcmVlbi5cbiAqXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBjdXJyZW50IGFjdGl2ZSBzY3JlZW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBHZXRDdXJyZW50KCk6IFByb21pc2U8U2NyZWVuPiB7XG4gICAgcmV0dXJuIGNhbGwoZ2V0Q3VycmVudCk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7QUNBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7QUNBQTtBQUFBO0FBQUE7QUFBQTs7O0FDNkJBLElBQU0sY0FDRjtBQUVHLFNBQVMsT0FBTyxPQUFlLElBQVk7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MkJBQTJCO0FBQUEsSUFDM0IsK0JBQStCO0FBQUEsSUFDL0Isb0JBQW9CO0FBQUEsSUFDcEIsNEJBQTRCO0FBQUEsSUFDNUIsc0JBQXNCO0FBQUEsSUFDdEIsc0JBQXNCO0FBQUEsSUFDdEIsK0JBQStCO0FBQUEsSUFDL0IsNkJBQTZCO0FBQUEsSUFDN0IsZ0NBQWdDO0FBQUEsSUFDaEMscUJBQXFCO0FBQUEsSUFDckIsNkJBQTZCO0FBQUEsSUFDN0IsMEJBQTBCO0FBQUEsSUFDMUIsdUJBQXVCO0FBQUEsSUFDdkIsdUJBQXVCO0FBQUEsSUFDdkIsZ0JBQWdCO0FBQUEsSUFDaEIsc0JBQXNCO0FBQUEsSUFDdEIsY0FBYztBQUFBLElBQ2Qsb0JBQW9CO0FBQUEsSUFDcEIsb0JBQW9CO0FBQUEsSUFDcEIsc0JBQXNCO0FBQUEsSUFDdEIsYUFBYTtBQUFBLElBQ2IsY0FBYztBQUFBLElBQ2QsbUJBQW1CO0FBQUEsSUFDbkIsbUJBQW1CO0FBQUEsSUFDbkIseUJBQXlCO0FBQUEsSUFDekIsZUFBZTtBQUFBLElBQ2YsaUJBQWlCO0FBQUEsSUFDakIsdUJBQXVCO0FBQUEsSUFDdkIscUJBQXFCO0FBQUEsSUFDckIscUJBQXFCO0FBQUEsSUFDckIsdUJBQXVCO0FBQUEsSUFDdkIsY0FBYztBQUFBLElBQ2QsZUFBZTtBQUFBLElBQ2Ysb0JBQW9CO0FBQUEsSUFDcEIsb0JBQW9CO0FBQUEsSUFDcEIsMEJBQTBCO0FBQUEsSUFDMUIsZ0JBQWdCO0FBQUEsSUFDaEIsNEJBQTRCO0FBQUEsSUFDNUIsNEJBQTRCO0FBQUEsSUFDNUIseURBQXlEO0FBQUEsSUFDekQsc0NBQXNDO0FBQUEsSUFDdEMsb0JBQW9CO0FBQUEsSUFDcEIscUJBQXFCO0FBQUEsSUFDckIscUJBQXFCO0FBQUEsSUFDckIsc0JBQXNCO0FBQUEsSUFDdEIsZ0NBQWdDO0FBQUEsSUFDaEMsa0NBQWtDO0FBQUEsSUFDbEMsbUNBQW1DO0FBQUEsSUFDbkMsb0NBQW9DO0FBQUEsSUFDcEMsK0JBQStCO0FBQUEsSUFDL0IsNkJBQTZCO0FBQUEsSUFDN0IsdUJBQXVCO0FBQUEsSUFDdkIsaUNBQWlDO0FBQUEsSUFDakMsOEJBQThCO0FBQUEsSUFDOUIsNEJBQTRCO0FBQUEsSUFDNUIsc0NBQXNDO0FBQUEsSUFDdEMsNEJBQTRCO0FBQUEsSUFDNUIsc0JBQXNCO0FBQUEsSUFDdEIsa0NBQWtDO0FBQUEsSUFDbEMsc0JBQXNCO0FBQUEsSUFDdEIsd0JBQXdCO0FBQUEsSUFDeEIsd0JBQXdCO0FBQUEsSUFDeEIsbUJBQW1CO0FBQUEsSUFDbkIsMEJBQTBCO0FBQUEsSUFDMUIsOEJBQThCO0FBQUEsSUFDOUIseUJBQXlCO0FBQUEsSUFDekIsNkJBQTZCO0FBQUEsSUFDN0IsaUJBQWlCO0FBQUEsSUFDakIsZ0JBQWdCO0FBQUEsSUFDaEIsc0JBQXNCO0FBQUEsSUFDdEIsZUFBZTtBQUFBLElBQ2YseUJBQXlCO0FBQUEsSUFDekIsd0JBQXdCO0FBQUEsSUFDeEIsb0JBQW9CO0FBQUEsSUFDcEIscUJBQXFCO0FBQUEsSUFDckIsaUJBQWlCO0FBQUEsSUFDakIsaUJBQWlCO0FBQUEsSUFDakIsc0JBQXNCO0FBQUEsSUFDdEIsbUNBQW1DO0FBQUEsSUFDbkMscUNBQXFDO0FBQUEsSUFDckMsdUJBQXVCO0FBQUEsSUFDdkIsc0JBQXNCO0FBQUEsSUFDdEIsd0JBQXdCO0FBQUEsSUFDeEIsZUFBZTtBQUFBLElBQ2YsMkJBQTJCO0FBQUEsSUFDM0IsMEJBQTBCO0FBQUEsSUFDMUIsNkJBQTZCO0FBQUEsSUFDN0IsWUFBWTtBQUFBLElBQ1osZ0JBQWdCO0FBQUEsSUFDaEIsa0JBQWtCO0FBQUEsSUFDbEIsZ0JBQWdCO0FBQUEsSUFDaEIsa0JBQWtCO0FBQUEsSUFDbEIsbUJBQW1CO0FBQUEsSUFDbkIsWUFBWTtBQUFBLElBQ1oscUJBQXFCO0FBQUEsSUFDckIsc0JBQXNCO0FBQUEsSUFDdEIsc0JBQXNCO0FBQUEsSUFDdEIsOEJBQThCO0FBQUEsSUFDOUIsaUJBQWlCO0FBQUEsSUFDakIseUJBQXlCO0FBQUEsSUFDekIsMkJBQTJCO0FBQUEsSUFDM0IsK0JBQStCO0FBQUEs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O0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFDSjs7O0FDekdBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQXdEQSxJQUFNQyxRQUFPLGlCQUFpQixZQUFZLE9BQU87QUFFakQsSUFBTSxTQUFTO0FBQ2YsSUFBTSxhQUFhO0FBQ25CLElBQU0sYUFBYTtBQU9aLFNBQVMsU0FBNEI7QUFDeEMsU0FBT0EsTUFBSyxNQUFNO0FBQ3RCO0FBT08sU0FBUyxhQUE4QjtBQUMxQyxTQUFPQSxNQUFLLFVBQVU7QUFDMUI7QUFPTyxTQUFTLGFBQThCO0FBQzFDLFNBQU9BLE1BQUssVUFBVTtBQUMxQjs7O0F0QjVFQSxPQUFPLFNBQVMsT0FBTyxVQUFVLENBQUM7QUE0Q2xDLE9BQU8sT0FBTyxTQUFnQjtBQUN2QixPQUFPLHFCQUFxQjsiLAogICJuYW1lcyI6IFsiX2EiLCAiRXJyb3IiLCAiY2FsbCIsICJfYSIsICJFcnJvciIsICJjYWxsIiwgIl9hIiwgInJlc2l6YWJsZSIsICJjYWxsIiwgIl9hIiwgImNhbGwiLCAiY2FsbCIsICJIaWRlTWV0aG9kIiwgIlNob3dNZXRob2QiLCAiaXNEb2N1bWVudERvdEFsbCIsICJfYSIsICJyZWFzb24iLCAidmFsdWUiLCAiY2FsbCIsICJnZXRBbmREZWxldGVSZXNwb25zZSIsICJnZW5lcmF0ZUlEIiwgImNhbGwiLCAiQXJyYXkiLCAiTWFwIiwgIkFycmF5IiwgIk1hcCIsICJrZXkiLCAiY2FsbCJdCn0K +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2luZGV4LnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy93bWwudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2Jyb3dzZXIudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL25hbm9pZC50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvcnVudGltZS50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvZGlhbG9ncy50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvZXZlbnRzLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9saXN0ZW5lci50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvZXZlbnRfdHlwZXMudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3V0aWxzLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy93aW5kb3cudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL2NvbXBpbGVkL21haW4uanMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3N5c3RlbS50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvY29udGV4dG1lbnUudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2ZsYWdzLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9kcmFnLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9hcHBsaWNhdGlvbi50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvY2FsbHMudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL2NhbGxhYmxlLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9jYW5jZWxsYWJsZS50cyIsICIuLi8uLi9ydW50aW1lL2Rlc2t0b3AvQHdhaWxzaW8vcnVudGltZS9zcmMvY2xpcGJvYXJkLnRzIiwgIi4uLy4uL3J1bnRpbWUvZGVza3RvcC9Ad2FpbHNpby9ydW50aW1lL3NyYy9jcmVhdGUudHMiLCAiLi4vLi4vcnVudGltZS9kZXNrdG9wL0B3YWlsc2lvL3J1bnRpbWUvc3JjL3NjcmVlbnMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qXHJcbiBfXHQgICBfX1x0ICBfIF9fXHJcbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXHJcbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cclxufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXHJcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xyXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXHJcbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcclxuKi9cclxuXHJcbi8vIFNldHVwXHJcbndpbmRvdy5fd2FpbHMgPSB3aW5kb3cuX3dhaWxzIHx8IHt9O1xyXG5cclxuaW1wb3J0IFwiLi9jb250ZXh0bWVudS5qc1wiO1xyXG5pbXBvcnQgXCIuL2RyYWcuanNcIjtcclxuXHJcbi8vIFJlLWV4cG9ydCBwdWJsaWMgQVBJXHJcbmltcG9ydCAqIGFzIEFwcGxpY2F0aW9uIGZyb20gXCIuL2FwcGxpY2F0aW9uLmpzXCI7XHJcbmltcG9ydCAqIGFzIEJyb3dzZXIgZnJvbSBcIi4vYnJvd3Nlci5qc1wiO1xyXG5pbXBvcnQgKiBhcyBDYWxsIGZyb20gXCIuL2NhbGxzLmpzXCI7XHJcbmltcG9ydCAqIGFzIENsaXBib2FyZCBmcm9tIFwiLi9jbGlwYm9hcmQuanNcIjtcclxuaW1wb3J0ICogYXMgQ3JlYXRlIGZyb20gXCIuL2NyZWF0ZS5qc1wiO1xyXG5pbXBvcnQgKiBhcyBEaWFsb2dzIGZyb20gXCIuL2RpYWxvZ3MuanNcIjtcclxuaW1wb3J0ICogYXMgRXZlbnRzIGZyb20gXCIuL2V2ZW50cy5qc1wiO1xyXG5pbXBvcnQgKiBhcyBGbGFncyBmcm9tIFwiLi9mbGFncy5qc1wiO1xyXG5pbXBvcnQgKiBhcyBTY3JlZW5zIGZyb20gXCIuL3NjcmVlbnMuanNcIjtcclxuaW1wb3J0ICogYXMgU3lzdGVtIGZyb20gXCIuL3N5c3RlbS5qc1wiO1xyXG5pbXBvcnQgV2luZG93IGZyb20gXCIuL3dpbmRvdy5qc1wiO1xyXG5pbXBvcnQgKiBhcyBXTUwgZnJvbSBcIi4vd21sLmpzXCI7XHJcblxyXG5leHBvcnQge1xyXG4gICAgQXBwbGljYXRpb24sXHJcbiAgICBCcm93c2VyLFxyXG4gICAgQ2FsbCxcclxuICAgIENsaXBib2FyZCxcclxuICAgIERpYWxvZ3MsXHJcbiAgICBFdmVudHMsXHJcbiAgICBGbGFncyxcclxuICAgIFNjcmVlbnMsXHJcbiAgICBTeXN0ZW0sXHJcbiAgICBXaW5kb3csXHJcbiAgICBXTUxcclxufTtcclxuXHJcbi8qKlxyXG4gKiBBbiBpbnRlcm5hbCB1dGlsaXR5IGNvbnN1bWVkIGJ5IHRoZSBiaW5kaW5nIGdlbmVyYXRvci5cclxuICpcclxuICogQGlnbm9yZVxyXG4gKiBAaW50ZXJuYWxcclxuICovXHJcbmV4cG9ydCB7IENyZWF0ZSB9O1xyXG5cclxuZXhwb3J0ICogZnJvbSBcIi4vY2FuY2VsbGFibGUuanNcIjtcclxuXHJcbi8vIE5vdGlmeSBiYWNrZW5kXHJcbndpbmRvdy5fd2FpbHMuaW52b2tlID0gU3lzdGVtLmludm9rZTtcclxuU3lzdGVtLmludm9rZShcIndhaWxzOnJ1bnRpbWU6cmVhZHlcIik7XHJcbiIsICIvKlxyXG4gXyAgICAgX18gICAgIF8gX19cclxufCB8ICAvIC9fX18gXyhfKSAvX19fX1xyXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXHJcbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxyXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cclxuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xyXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XHJcbiovXHJcblxyXG5pbXBvcnQgeyBPcGVuVVJMIH0gZnJvbSBcIi4vYnJvd3Nlci5qc1wiO1xyXG5pbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCIuL2RpYWxvZ3MuanNcIjtcclxuaW1wb3J0IHsgRW1pdCwgV2FpbHNFdmVudCB9IGZyb20gXCIuL2V2ZW50cy5qc1wiO1xyXG5pbXBvcnQgeyBjYW5BYm9ydExpc3RlbmVycywgd2hlblJlYWR5IH0gZnJvbSBcIi4vdXRpbHMuanNcIjtcclxuaW1wb3J0IFdpbmRvdyBmcm9tIFwiLi93aW5kb3cuanNcIjtcclxuXHJcbi8qKlxyXG4gKiBTZW5kcyBhbiBldmVudCB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCBvcHRpb25hbCBkYXRhLlxyXG4gKlxyXG4gKiBAcGFyYW0gZXZlbnROYW1lIC0gLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gc2VuZC5cclxuICogQHBhcmFtIFtkYXRhPW51bGxdIC0gLSBPcHRpb25hbCBkYXRhIHRvIHNlbmQgYWxvbmcgd2l0aCB0aGUgZXZlbnQuXHJcbiAqL1xyXG5mdW5jdGlvbiBzZW5kRXZlbnQoZXZlbnROYW1lOiBzdHJpbmcsIGRhdGE6IGFueSA9IG51bGwpOiB2b2lkIHtcclxuICAgIEVtaXQobmV3IFdhaWxzRXZlbnQoZXZlbnROYW1lLCBkYXRhKSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDYWxscyBhIG1ldGhvZCBvbiBhIHNwZWNpZmllZCB3aW5kb3cuXHJcbiAqXHJcbiAqIEBwYXJhbSB3aW5kb3dOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHdpbmRvdyB0byBjYWxsIHRoZSBtZXRob2Qgb24uXHJcbiAqIEBwYXJhbSBtZXRob2ROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0byBjYWxsLlxyXG4gKi9cclxuZnVuY3Rpb24gY2FsbFdpbmRvd01ldGhvZCh3aW5kb3dOYW1lOiBzdHJpbmcsIG1ldGhvZE5hbWU6IHN0cmluZykge1xyXG4gICAgY29uc3QgdGFyZ2V0V2luZG93ID0gV2luZG93LkdldCh3aW5kb3dOYW1lKTtcclxuICAgIGNvbnN0IG1ldGhvZCA9ICh0YXJnZXRXaW5kb3cgYXMgYW55KVttZXRob2ROYW1lXTtcclxuXHJcbiAgICBpZiAodHlwZW9mIG1ldGhvZCAhPT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihgV2luZG93IG1ldGhvZCAnJHttZXRob2ROYW1lfScgbm90IGZvdW5kYCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgICAgbWV0aG9kLmNhbGwodGFyZ2V0V2luZG93KTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvciBjYWxsaW5nIHdpbmRvdyBtZXRob2QgJyR7bWV0aG9kTmFtZX0nOiBgLCBlKTtcclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFJlc3BvbmRzIHRvIGEgdHJpZ2dlcmluZyBldmVudCBieSBydW5uaW5nIGFwcHJvcHJpYXRlIFdNTCBhY3Rpb25zIGZvciB0aGUgY3VycmVudCB0YXJnZXQuXHJcbiAqL1xyXG5mdW5jdGlvbiBvbldNTFRyaWdnZXJlZChldjogRXZlbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IGVsZW1lbnQgPSBldi5jdXJyZW50VGFyZ2V0IGFzIEVsZW1lbnQ7XHJcblxyXG4gICAgZnVuY3Rpb24gcnVuRWZmZWN0KGNob2ljZSA9IFwiWWVzXCIpIHtcclxuICAgICAgICBpZiAoY2hvaWNlICE9PSBcIlllc1wiKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIGNvbnN0IGV2ZW50VHlwZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd3bWwtZXZlbnQnKSB8fCBlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS13bWwtZXZlbnQnKTtcclxuICAgICAgICBjb25zdCB0YXJnZXRXaW5kb3cgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnd21sLXRhcmdldC13aW5kb3cnKSB8fCBlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS13bWwtdGFyZ2V0LXdpbmRvdycpIHx8IFwiXCI7XHJcbiAgICAgICAgY29uc3Qgd2luZG93TWV0aG9kID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3dtbC13aW5kb3cnKSB8fCBlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS13bWwtd2luZG93Jyk7XHJcbiAgICAgICAgY29uc3QgdXJsID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3dtbC1vcGVudXJsJykgfHwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtd21sLW9wZW51cmwnKTtcclxuXHJcbiAgICAgICAgaWYgKGV2ZW50VHlwZSAhPT0gbnVsbClcclxuICAgICAgICAgICAgc2VuZEV2ZW50KGV2ZW50VHlwZSk7XHJcbiAgICAgICAgaWYgKHdpbmRvd01ldGhvZCAhPT0gbnVsbClcclxuICAgICAgICAgICAgY2FsbFdpbmRvd01ldGhvZCh0YXJnZXRXaW5kb3csIHdpbmRvd01ldGhvZCk7XHJcbiAgICAgICAgaWYgKHVybCAhPT0gbnVsbClcclxuICAgICAgICAgICAgdm9pZCBPcGVuVVJMKHVybCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY29uZmlybSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd3bWwtY29uZmlybScpIHx8IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXdtbC1jb25maXJtJyk7XHJcblxyXG4gICAgaWYgKGNvbmZpcm0pIHtcclxuICAgICAgICBRdWVzdGlvbih7XHJcbiAgICAgICAgICAgIFRpdGxlOiBcIkNvbmZpcm1cIixcclxuICAgICAgICAgICAgTWVzc2FnZTogY29uZmlybSxcclxuICAgICAgICAgICAgRGV0YWNoZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICBCdXR0b25zOiBbXHJcbiAgICAgICAgICAgICAgICB7IExhYmVsOiBcIlllc1wiIH0sXHJcbiAgICAgICAgICAgICAgICB7IExhYmVsOiBcIk5vXCIsIElzRGVmYXVsdDogdHJ1ZSB9XHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICB9KS50aGVuKHJ1bkVmZmVjdCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJ1bkVmZmVjdCgpO1xyXG4gICAgfVxyXG59XHJcblxyXG4vLyBQcml2YXRlIGZpZWxkIG5hbWVzLlxyXG5jb25zdCBjb250cm9sbGVyU3ltID0gU3ltYm9sKFwiY29udHJvbGxlclwiKTtcclxuY29uc3QgdHJpZ2dlck1hcFN5bSA9IFN5bWJvbChcInRyaWdnZXJNYXBcIik7XHJcbmNvbnN0IGVsZW1lbnRDb3VudFN5bSA9IFN5bWJvbChcImVsZW1lbnRDb3VudFwiKTtcclxuXHJcbi8qKlxyXG4gKiBBYm9ydENvbnRyb2xsZXJSZWdpc3RyeSBkb2VzIG5vdCBhY3R1YWxseSByZW1lbWJlciBhY3RpdmUgZXZlbnQgbGlzdGVuZXJzOiBpbnN0ZWFkXHJcbiAqIGl0IHRpZXMgdGhlbSB0byBhbiBBYm9ydFNpZ25hbCBhbmQgdXNlcyBhbiBBYm9ydENvbnRyb2xsZXIgdG8gcmVtb3ZlIHRoZW0gYWxsIGF0IG9uY2UuXHJcbiAqL1xyXG5jbGFzcyBBYm9ydENvbnRyb2xsZXJSZWdpc3RyeSB7XHJcbiAgICAvLyBQcml2YXRlIGZpZWxkcy5cclxuICAgIFtjb250cm9sbGVyU3ltXTogQWJvcnRDb250cm9sbGVyO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXNbY29udHJvbGxlclN5bV0gPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGFuIG9wdGlvbnMgb2JqZWN0IGZvciBhZGRFdmVudExpc3RlbmVyIHRoYXQgdGllcyB0aGUgbGlzdGVuZXJcclxuICAgICAqIHRvIHRoZSBBYm9ydFNpZ25hbCBmcm9tIHRoZSBjdXJyZW50IEFib3J0Q29udHJvbGxlci5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZWxlbWVudCAtIEFuIEhUTUwgZWxlbWVudFxyXG4gICAgICogQHBhcmFtIHRyaWdnZXJzIC0gVGhlIGxpc3Qgb2YgYWN0aXZlIFdNTCB0cmlnZ2VyIGV2ZW50cyBmb3IgdGhlIHNwZWNpZmllZCBlbGVtZW50c1xyXG4gICAgICovXHJcbiAgICBzZXQoZWxlbWVudDogRWxlbWVudCwgdHJpZ2dlcnM6IHN0cmluZ1tdKTogQWRkRXZlbnRMaXN0ZW5lck9wdGlvbnMge1xyXG4gICAgICAgIHJldHVybiB7IHNpZ25hbDogdGhpc1tjb250cm9sbGVyU3ltXS5zaWduYWwgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgYWxsIHJlZ2lzdGVyZWQgZXZlbnQgbGlzdGVuZXJzIGFuZCByZXNldHMgdGhlIHJlZ2lzdHJ5LlxyXG4gICAgICovXHJcbiAgICByZXNldCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzW2NvbnRyb2xsZXJTeW1dLmFib3J0KCk7XHJcbiAgICAgICAgdGhpc1tjb250cm9sbGVyU3ltXSA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFdlYWtNYXBSZWdpc3RyeSBtYXBzIGFjdGl2ZSB0cmlnZ2VyIGV2ZW50cyB0byBlYWNoIERPTSBlbGVtZW50IHRocm91Z2ggYSBXZWFrTWFwLlxyXG4gKiBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgbWFwcGluZyByZW1haW5zIHByaXZhdGUgdG8gdGhpcyBtb2R1bGUsIHdoaWxlIHN0aWxsIGFsbG93aW5nIGdhcmJhZ2VcclxuICogY29sbGVjdGlvbiBvZiB0aGUgaW52b2x2ZWQgZWxlbWVudHMuXHJcbiAqL1xyXG5jbGFzcyBXZWFrTWFwUmVnaXN0cnkge1xyXG4gICAgLyoqIFN0b3JlcyB0aGUgY3VycmVudCBlbGVtZW50LXRvLXRyaWdnZXIgbWFwcGluZy4gKi9cclxuICAgIFt0cmlnZ2VyTWFwU3ltXTogV2Vha01hcDxFbGVtZW50LCBzdHJpbmdbXT47XHJcbiAgICAvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgd2l0aCBhY3RpdmUgV01MIHRyaWdnZXJzLiAqL1xyXG4gICAgW2VsZW1lbnRDb3VudFN5bV06IG51bWJlcjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzW3RyaWdnZXJNYXBTeW1dID0gbmV3IFdlYWtNYXAoKTtcclxuICAgICAgICB0aGlzW2VsZW1lbnRDb3VudFN5bV0gPSAwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyBhY3RpdmUgdHJpZ2dlcnMgZm9yIHRoZSBzcGVjaWZpZWQgZWxlbWVudC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZWxlbWVudCAtIEFuIEhUTUwgZWxlbWVudFxyXG4gICAgICogQHBhcmFtIHRyaWdnZXJzIC0gVGhlIGxpc3Qgb2YgYWN0aXZlIFdNTCB0cmlnZ2VyIGV2ZW50cyBmb3IgdGhlIHNwZWNpZmllZCBlbGVtZW50XHJcbiAgICAgKi9cclxuICAgIHNldChlbGVtZW50OiBFbGVtZW50LCB0cmlnZ2Vyczogc3RyaW5nW10pOiBBZGRFdmVudExpc3RlbmVyT3B0aW9ucyB7XHJcbiAgICAgICAgaWYgKCF0aGlzW3RyaWdnZXJNYXBTeW1dLmhhcyhlbGVtZW50KSkgeyB0aGlzW2VsZW1lbnRDb3VudFN5bV0rKzsgfVxyXG4gICAgICAgIHRoaXNbdHJpZ2dlck1hcFN5bV0uc2V0KGVsZW1lbnQsIHRyaWdnZXJzKTtcclxuICAgICAgICByZXR1cm4ge307XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGFsbCByZWdpc3RlcmVkIGV2ZW50IGxpc3RlbmVycy5cclxuICAgICAqL1xyXG4gICAgcmVzZXQoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXNbZWxlbWVudENvdW50U3ltXSA8PSAwKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBkb2N1bWVudC5ib2R5LnF1ZXJ5U2VsZWN0b3JBbGwoJyonKSkge1xyXG4gICAgICAgICAgICBpZiAodGhpc1tlbGVtZW50Q291bnRTeW1dIDw9IDApXHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHRyaWdnZXJzID0gdGhpc1t0cmlnZ2VyTWFwU3ltXS5nZXQoZWxlbWVudCk7XHJcbiAgICAgICAgICAgIGlmICh0cmlnZ2VycyAhPSBudWxsKSB7IHRoaXNbZWxlbWVudENvdW50U3ltXS0tOyB9XHJcblxyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHRyaWdnZXIgb2YgdHJpZ2dlcnMgfHwgW10pXHJcbiAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodHJpZ2dlciwgb25XTUxUcmlnZ2VyZWQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpc1t0cmlnZ2VyTWFwU3ltXSA9IG5ldyBXZWFrTWFwKCk7XHJcbiAgICAgICAgdGhpc1tlbGVtZW50Q291bnRTeW1dID0gMDtcclxuICAgIH1cclxufVxyXG5cclxuY29uc3QgdHJpZ2dlclJlZ2lzdHJ5ID0gY2FuQWJvcnRMaXN0ZW5lcnMoKSA/IG5ldyBBYm9ydENvbnRyb2xsZXJSZWdpc3RyeSgpIDogbmV3IFdlYWtNYXBSZWdpc3RyeSgpO1xyXG5cclxuLyoqXHJcbiAqIEFkZHMgZXZlbnQgbGlzdGVuZXJzIHRvIHRoZSBzcGVjaWZpZWQgZWxlbWVudC5cclxuICovXHJcbmZ1bmN0aW9uIGFkZFdNTExpc3RlbmVycyhlbGVtZW50OiBFbGVtZW50KTogdm9pZCB7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVnRXhwID0gL1xcUysvZztcclxuICAgIGNvbnN0IHRyaWdnZXJBdHRyID0gKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd3bWwtdHJpZ2dlcicpIHx8IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXdtbC10cmlnZ2VyJykgfHwgXCJjbGlja1wiKTtcclxuICAgIGNvbnN0IHRyaWdnZXJzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICAgIGxldCBtYXRjaDtcclxuICAgIHdoaWxlICgobWF0Y2ggPSB0cmlnZ2VyUmVnRXhwLmV4ZWModHJpZ2dlckF0dHIpKSAhPT0gbnVsbClcclxuICAgICAgICB0cmlnZ2Vycy5wdXNoKG1hdGNoWzBdKTtcclxuXHJcbiAgICBjb25zdCBvcHRpb25zID0gdHJpZ2dlclJlZ2lzdHJ5LnNldChlbGVtZW50LCB0cmlnZ2Vycyk7XHJcbiAgICBmb3IgKGNvbnN0IHRyaWdnZXIgb2YgdHJpZ2dlcnMpXHJcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHRyaWdnZXIsIG9uV01MVHJpZ2dlcmVkLCBvcHRpb25zKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFNjaGVkdWxlcyBhbiBhdXRvbWF0aWMgcmVsb2FkIG9mIFdNTCB0byBiZSBwZXJmb3JtZWQgYXMgc29vbiBhcyB0aGUgZG9jdW1lbnQgaXMgZnVsbHkgbG9hZGVkLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIEVuYWJsZSgpOiB2b2lkIHtcclxuICAgIHdoZW5SZWFkeShSZWxvYWQpO1xyXG59XHJcblxyXG4vKipcclxuICogUmVsb2FkcyB0aGUgV01MIHBhZ2UgYnkgYWRkaW5nIG5lY2Vzc2FyeSBldmVudCBsaXN0ZW5lcnMgYW5kIGJyb3dzZXIgbGlzdGVuZXJzLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIFJlbG9hZCgpOiB2b2lkIHtcclxuICAgIHRyaWdnZXJSZWdpc3RyeS5yZXNldCgpO1xyXG4gICAgZG9jdW1lbnQuYm9keS5xdWVyeVNlbGVjdG9yQWxsKCdbd21sLWV2ZW50XSwgW3dtbC13aW5kb3ddLCBbd21sLW9wZW51cmxdLCBbZGF0YS13bWwtZXZlbnRdLCBbZGF0YS13bWwtd2luZG93XSwgW2RhdGEtd21sLW9wZW51cmxdJykuZm9yRWFjaChhZGRXTUxMaXN0ZW5lcnMpO1xyXG59XHJcbiIsICIvKlxyXG4gX1x0ICAgX19cdCAgXyBfX1xyXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xyXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXHJcbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxyXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cclxuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xyXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XHJcbiovXHJcblxyXG5pbXBvcnQgeyBuZXdSdW50aW1lQ2FsbGVyLCBvYmplY3ROYW1lcyB9IGZyb20gXCIuL3J1bnRpbWUuanNcIjtcclxuXHJcbmNvbnN0IGNhbGwgPSBuZXdSdW50aW1lQ2FsbGVyKG9iamVjdE5hbWVzLkJyb3dzZXIpO1xyXG5cclxuY29uc3QgQnJvd3Nlck9wZW5VUkwgPSAwO1xyXG5cclxuLyoqXHJcbiAqIE9wZW4gYSBicm93c2VyIHdpbmRvdyB0byB0aGUgZ2l2ZW4gVVJMLlxyXG4gKlxyXG4gKiBAcGFyYW0gdXJsIC0gVGhlIFVSTCB0byBvcGVuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gT3BlblVSTCh1cmw6IHN0cmluZyB8IFVSTCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIGNhbGwoQnJvd3Nlck9wZW5VUkwsIHt1cmw6IHVybC50b1N0cmluZygpfSk7XHJcbn1cclxuIiwgIi8vIFNvdXJjZTogaHR0cHM6Ly9naXRodWIuY29tL2FpL25hbm9pZFxyXG5cclxuLy8gVGhlIE1JVCBMaWNlbnNlIChNSVQpXHJcbi8vXHJcbi8vIENvcHlyaWdodCAyMDE3IEFuZHJleSBTaXRuaWsgPGFuZHJleUBzaXRuaWsucnU+XHJcbi8vXHJcbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2ZcclxuLy8gdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpblxyXG4vLyB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvXHJcbi8vIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mXHJcbi8vIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbyxcclxuLy8gICAgIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxyXG4vL1xyXG4vLyAgICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXHJcbi8vIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXHJcbi8vXHJcbi8vICAgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXHJcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTXHJcbi8vIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUlxyXG4vLyBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVJcclxuLy8gSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU5cclxuLy8gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cclxuXHJcbi8vIFRoaXMgYWxwaGFiZXQgdXNlcyBgQS1aYS16MC05Xy1gIHN5bWJvbHMuXHJcbi8vIFRoZSBvcmRlciBvZiBjaGFyYWN0ZXJzIGlzIG9wdGltaXplZCBmb3IgYmV0dGVyIGd6aXAgYW5kIGJyb3RsaSBjb21wcmVzc2lvbi5cclxuLy8gUmVmZXJlbmNlcyB0byB0aGUgc2FtZSBmaWxlICh3b3JrcyBib3RoIGZvciBnemlwIGFuZCBicm90bGkpOlxyXG4vLyBgJ3VzZWAsIGBhbmRvbWAsIGFuZCBgcmljdCdgXHJcbi8vIFJlZmVyZW5jZXMgdG8gdGhlIGJyb3RsaSBkZWZhdWx0IGRpY3Rpb25hcnk6XHJcbi8vIGAtMjZUYCwgYDE5ODNgLCBgNDBweGAsIGA3NXB4YCwgYGJ1c2hgLCBgamFja2AsIGBtaW5kYCwgYHZlcnlgLCBhbmQgYHdvbGZgXHJcbmNvbnN0IHVybEFscGhhYmV0ID1cclxuICAgICd1c2VhbmRvbS0yNlQxOTgzNDBQWDc1cHhKQUNLVkVSWU1JTkRCVVNIV09MRl9HUVpiZmdoamtscXZ3eXpyaWN0J1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIG5hbm9pZChzaXplOiBudW1iZXIgPSAyMSk6IHN0cmluZyB7XHJcbiAgICBsZXQgaWQgPSAnJ1xyXG4gICAgLy8gQSBjb21wYWN0IGFsdGVybmF0aXZlIGZvciBgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGVwOyBpKyspYC5cclxuICAgIGxldCBpID0gc2l6ZSB8IDBcclxuICAgIHdoaWxlIChpLS0pIHtcclxuICAgICAgICAvLyBgfCAwYCBpcyBtb3JlIGNvbXBhY3QgYW5kIGZhc3RlciB0aGFuIGBNYXRoLmZsb29yKClgLlxyXG4gICAgICAgIGlkICs9IHVybEFscGhhYmV0WyhNYXRoLnJhbmRvbSgpICogNjQpIHwgMF1cclxuICAgIH1cclxuICAgIHJldHVybiBpZFxyXG59XHJcbiIsICIvKlxyXG4gXyAgICAgX18gICAgIF8gX19cclxufCB8ICAvIC9fX18gXyhfKSAvX19fX1xyXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXHJcbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxyXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cclxuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xyXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XHJcbiovXHJcblxyXG5pbXBvcnQgeyBuYW5vaWQgfSBmcm9tICcuL25hbm9pZC5qcyc7XHJcblxyXG5jb25zdCBydW50aW1lVVJMID0gd2luZG93LmxvY2F0aW9uLm9yaWdpbiArIFwiL3dhaWxzL3J1bnRpbWVcIjtcclxuXHJcbi8vIE9iamVjdCBOYW1lc1xyXG5leHBvcnQgY29uc3Qgb2JqZWN0TmFtZXMgPSBPYmplY3QuZnJlZXplKHtcclxuICAgIENhbGw6IDAsXHJcbiAgICBDbGlwYm9hcmQ6IDEsXHJcbiAgICBBcHBsaWNhdGlvbjogMixcclxuICAgIEV2ZW50czogMyxcclxuICAgIENvbnRleHRNZW51OiA0LFxyXG4gICAgRGlhbG9nOiA1LFxyXG4gICAgV2luZG93OiA2LFxyXG4gICAgU2NyZWVuczogNyxcclxuICAgIFN5c3RlbTogOCxcclxuICAgIEJyb3dzZXI6IDksXHJcbiAgICBDYW5jZWxDYWxsOiAxMCxcclxufSk7XHJcbmV4cG9ydCBsZXQgY2xpZW50SWQgPSBuYW5vaWQoKTtcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IHJ1bnRpbWUgY2FsbGVyIHdpdGggc3BlY2lmaWVkIElELlxyXG4gKlxyXG4gKiBAcGFyYW0gb2JqZWN0IC0gVGhlIG9iamVjdCB0byBpbnZva2UgdGhlIG1ldGhvZCBvbi5cclxuICogQHBhcmFtIHdpbmRvd05hbWUgLSBUaGUgbmFtZSBvZiB0aGUgd2luZG93LlxyXG4gKiBAcmV0dXJuIFRoZSBuZXcgcnVudGltZSBjYWxsZXIgZnVuY3Rpb24uXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gbmV3UnVudGltZUNhbGxlcihvYmplY3Q6IG51bWJlciwgd2luZG93TmFtZTogc3RyaW5nID0gJycpIHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAobWV0aG9kOiBudW1iZXIsIGFyZ3M6IGFueSA9IG51bGwpIHtcclxuICAgICAgICByZXR1cm4gcnVudGltZUNhbGxXaXRoSUQob2JqZWN0LCBtZXRob2QsIHdpbmRvd05hbWUsIGFyZ3MpO1xyXG4gICAgfTtcclxufVxyXG5cclxuYXN5bmMgZnVuY3Rpb24gcnVudGltZUNhbGxXaXRoSUQob2JqZWN0SUQ6IG51bWJlciwgbWV0aG9kOiBudW1iZXIsIHdpbmRvd05hbWU6IHN0cmluZywgYXJnczogYW55KTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGxldCB1cmwgPSBuZXcgVVJMKHJ1bnRpbWVVUkwpO1xyXG4gICAgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoXCJvYmplY3RcIiwgb2JqZWN0SUQudG9TdHJpbmcoKSk7XHJcbiAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChcIm1ldGhvZFwiLCBtZXRob2QudG9TdHJpbmcoKSk7XHJcbiAgICBpZiAoYXJncykgeyB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChcImFyZ3NcIiwgSlNPTi5zdHJpbmdpZnkoYXJncykpOyB9XHJcblxyXG4gICAgbGV0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XHJcbiAgICAgICAgW1wieC13YWlscy1jbGllbnQtaWRcIl06IGNsaWVudElkXHJcbiAgICB9XHJcbiAgICBpZiAod2luZG93TmFtZSkge1xyXG4gICAgICAgIGhlYWRlcnNbXCJ4LXdhaWxzLXdpbmRvdy1uYW1lXCJdID0gd2luZG93TmFtZTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHsgaGVhZGVycyB9KTtcclxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYXdhaXQgcmVzcG9uc2UudGV4dCgpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoKHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiQ29udGVudC1UeXBlXCIpPy5pbmRleE9mKFwiYXBwbGljYXRpb24vanNvblwiKSA/PyAtMSkgIT09IC0xKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKTtcclxuICAgIH1cclxufVxyXG4iLCAiLypcclxuIF9cdCAgIF9fXHQgIF8gX19cclxufCB8XHQgLyAvX19fIF8oXykgL19fX19cclxufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xyXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcclxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXHJcblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cclxuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxyXG4qL1xyXG5cclxuaW1wb3J0IHtuZXdSdW50aW1lQ2FsbGVyLCBvYmplY3ROYW1lc30gZnJvbSBcIi4vcnVudGltZS5qc1wiO1xyXG5pbXBvcnQgeyBuYW5vaWQgfSBmcm9tICcuL25hbm9pZC5qcyc7XHJcblxyXG4vLyBzZXR1cFxyXG53aW5kb3cuX3dhaWxzID0gd2luZG93Ll93YWlscyB8fCB7fTtcclxud2luZG93Ll93YWlscy5kaWFsb2dFcnJvckNhbGxiYWNrID0gZGlhbG9nRXJyb3JDYWxsYmFjaztcclxud2luZG93Ll93YWlscy5kaWFsb2dSZXN1bHRDYWxsYmFjayA9IGRpYWxvZ1Jlc3VsdENhbGxiYWNrO1xyXG5cclxudHlwZSBQcm9taXNlUmVzb2x2ZXJzID0gT21pdDxQcm9taXNlV2l0aFJlc29sdmVyczxhbnk+LCBcInByb21pc2VcIj47XHJcblxyXG5jb25zdCBjYWxsID0gbmV3UnVudGltZUNhbGxlcihvYmplY3ROYW1lcy5EaWFsb2cpO1xyXG5jb25zdCBkaWFsb2dSZXNwb25zZXMgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZVJlc29sdmVycz4oKTtcclxuXHJcbi8vIERlZmluZSBjb25zdGFudHMgZnJvbSB0aGUgYG1ldGhvZHNgIG9iamVjdCBpbiBUaXRsZSBDYXNlXHJcbmNvbnN0IERpYWxvZ0luZm8gPSAwO1xyXG5jb25zdCBEaWFsb2dXYXJuaW5nID0gMTtcclxuY29uc3QgRGlhbG9nRXJyb3IgPSAyO1xyXG5jb25zdCBEaWFsb2dRdWVzdGlvbiA9IDM7XHJcbmNvbnN0IERpYWxvZ09wZW5GaWxlID0gNDtcclxuY29uc3QgRGlhbG9nU2F2ZUZpbGUgPSA1O1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBPcGVuRmlsZURpYWxvZ09wdGlvbnMge1xyXG4gICAgLyoqIEluZGljYXRlcyBpZiBkaXJlY3RvcmllcyBjYW4gYmUgY2hvc2VuLiAqL1xyXG4gICAgQ2FuQ2hvb3NlRGlyZWN0b3JpZXM/OiBib29sZWFuO1xyXG4gICAgLyoqIEluZGljYXRlcyBpZiBmaWxlcyBjYW4gYmUgY2hvc2VuLiAqL1xyXG4gICAgQ2FuQ2hvb3NlRmlsZXM/OiBib29sZWFuO1xyXG4gICAgLyoqIEluZGljYXRlcyBpZiBkaXJlY3RvcmllcyBjYW4gYmUgY3JlYXRlZC4gKi9cclxuICAgIENhbkNyZWF0ZURpcmVjdG9yaWVzPzogYm9vbGVhbjtcclxuICAgIC8qKiBJbmRpY2F0ZXMgaWYgaGlkZGVuIGZpbGVzIHNob3VsZCBiZSBzaG93bi4gKi9cclxuICAgIFNob3dIaWRkZW5GaWxlcz86IGJvb2xlYW47XHJcbiAgICAvKiogSW5kaWNhdGVzIGlmIGFsaWFzZXMgc2hvdWxkIGJlIHJlc29sdmVkLiAqL1xyXG4gICAgUmVzb2x2ZXNBbGlhc2VzPzogYm9vbGVhbjtcclxuICAgIC8qKiBJbmRpY2F0ZXMgaWYgbXVsdGlwbGUgc2VsZWN0aW9uIGlzIGFsbG93ZWQuICovXHJcbiAgICBBbGxvd3NNdWx0aXBsZVNlbGVjdGlvbj86IGJvb2xlYW47XHJcbiAgICAvKiogSW5kaWNhdGVzIGlmIHRoZSBleHRlbnNpb24gc2hvdWxkIGJlIGhpZGRlbi4gKi9cclxuICAgIEhpZGVFeHRlbnNpb24/OiBib29sZWFuO1xyXG4gICAgLyoqIEluZGljYXRlcyBpZiBoaWRkZW4gZXh0ZW5zaW9ucyBjYW4gYmUgc2VsZWN0ZWQuICovXHJcbiAgICBDYW5TZWxlY3RIaWRkZW5FeHRlbnNpb24/OiBib29sZWFuO1xyXG4gICAgLyoqIEluZGljYXRlcyBpZiBmaWxlIHBhY2thZ2VzIHNob3VsZCBiZSB0cmVhdGVkIGFzIGRpcmVjdG9yaWVzLiAqL1xyXG4gICAgVHJlYXRzRmlsZVBhY2thZ2VzQXNEaXJlY3Rvcmllcz86IGJvb2xlYW47XHJcbiAgICAvKiogSW5kaWNhdGVzIGlmIG90aGVyIGZpbGUgdHlwZXMgYXJlIGFsbG93ZWQuICovXHJcbiAgICBBbGxvd3NPdGhlckZpbGV0eXBlcz86IGJvb2xlYW47XHJcbiAgICAvKiogQXJyYXkgb2YgZmlsZSBmaWx0ZXJzLiAqL1xyXG4gICAgRmlsdGVycz86IEZpbGVGaWx0ZXJbXTtcclxuICAgIC8qKiBUaXRsZSBvZiB0aGUgZGlhbG9nLiAqL1xyXG4gICAgVGl0bGU/OiBzdHJpbmc7XHJcbiAgICAvKiogTWVzc2FnZSB0byBzaG93IGluIHRoZSBkaWFsb2cuICovXHJcbiAgICBNZXNzYWdlPzogc3RyaW5nO1xyXG4gICAgLyoqIFRleHQgdG8gZGlzcGxheSBvbiB0aGUgYnV0dG9uLiAqL1xyXG4gICAgQnV0dG9uVGV4dD86IHN0cmluZztcclxuICAgIC8qKiBEaXJlY3RvcnkgdG8gb3BlbiBpbiB0aGUgZGlhbG9nLiAqL1xyXG4gICAgRGlyZWN0b3J5Pzogc3RyaW5nO1xyXG4gICAgLyoqIEluZGljYXRlcyBpZiB0aGUgZGlhbG9nIHNob3VsZCBhcHBlYXIgZGV0YWNoZWQgZnJvbSB0aGUgbWFpbiB3aW5kb3cuICovXHJcbiAgICBEZXRhY2hlZD86IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2F2ZUZpbGVEaWFsb2dPcHRpb25zIHtcclxuICAgIC8qKiBEZWZhdWx0IGZpbGVuYW1lIHRvIHVzZSBpbiB0aGUgZGlhbG9nLiAqL1xyXG4gICAgRmlsZW5hbWU/OiBzdHJpbmc7XHJcbiAgICAvKiogSW5kaWNhdGVzIGlmIGRpcmVjdG9yaWVzIGNhbiBiZSBjaG9zZW4uICovXHJcbiAgICBDYW5DaG9vc2VEaXJlY3Rvcmllcz86IGJvb2xlYW47XHJcbiAgICAvKiogSW5kaWNhdGVzIGlmIGZpbGVzIGNhbiBiZSBjaG9zZW4uICovXHJcbiAgICBDYW5DaG9vc2VGaWxlcz86IGJvb2xlYW47XHJcbiAgICAvKiogSW5kaWNhdGVzIGlmIGRpcmVjdG9yaWVzIGNhbiBiZSBjcmVhdGVkLiAqL1xyXG4gICAgQ2FuQ3JlYXRlRGlyZWN0b3JpZXM/OiBib29sZWFuO1xyXG4gICAgLyoqIEluZGljYXRlcyBpZiBoaWRkZW4gZmlsZXMgc2hvdWxkIGJlIHNob3duLiAqL1xyXG4gICAgU2hvd0hpZGRlbkZpbGVzPzogYm9vbGVhbjtcclxuICAgIC8qKiBJbmRpY2F0ZXMgaWYgYWxpYXNlcyBzaG91bGQgYmUgcmVzb2x2ZWQuICovXHJcbiAgICBSZXNvbHZlc0FsaWFzZXM/OiBib29sZWFuO1xyXG4gICAgLyoqIEluZGljYXRlcyBpZiB0aGUgZXh0ZW5zaW9uIHNob3VsZCBiZSBoaWRkZW4uICovXHJcbiAgICBIaWRlRXh0ZW5zaW9uPzogYm9vbGVhbjtcclxuICAgIC8qKiBJbmRpY2F0ZXMgaWYgaGlkZGVuIGV4dGVuc2lvbnMgY2FuIGJlIHNlbGVjdGVkLiAqL1xyXG4gICAgQ2FuU2VsZWN0SGlkZGVuRXh0ZW5zaW9uPzogYm9vbGVhbjtcclxuICAgIC8qKiBJbmRpY2F0ZXMgaWYgZmlsZSBwYWNrYWdlcyBzaG91bGQgYmUgdHJlYXRlZCBhcyBkaXJlY3Rvcmllcy4gKi9cclxuICAgIFRyZWF0c0ZpbGVQYWNrYWdlc0FzRGlyZWN0b3JpZXM/OiBib29sZWFuO1xyXG4gICAgLyoqIEluZGljYXRlcyBpZiBvdGhlciBmaWxlIHR5cGVzIGFyZSBhbGxvd2VkLiAqL1xyXG4gICAgQWxsb3dzT3RoZXJGaWxldHlwZXM/OiBib29sZWFuO1xyXG4gICAgLyoqIEFycmF5IG9mIGZpbGUgZmlsdGVycy4gKi9cclxuICAgIEZpbHRlcnM/OiBGaWxlRmlsdGVyW107XHJcbiAgICAvKiogVGl0bGUgb2YgdGhlIGRpYWxvZy4gKi9cclxuICAgIFRpdGxlPzogc3RyaW5nO1xyXG4gICAgLyoqIE1lc3NhZ2UgdG8gc2hvdyBpbiB0aGUgZGlhbG9nLiAqL1xyXG4gICAgTWVzc2FnZT86IHN0cmluZztcclxuICAgIC8qKiBUZXh0IHRvIGRpc3BsYXkgb24gdGhlIGJ1dHRvbi4gKi9cclxuICAgIEJ1dHRvblRleHQ/OiBzdHJpbmc7XHJcbiAgICAvKiogRGlyZWN0b3J5IHRvIG9wZW4gaW4gdGhlIGRpYWxvZy4gKi9cclxuICAgIERpcmVjdG9yeT86IHN0cmluZztcclxuICAgIC8qKiBJbmRpY2F0ZXMgaWYgdGhlIGRpYWxvZyBzaG91bGQgYXBwZWFyIGRldGFjaGVkIGZyb20gdGhlIG1haW4gd2luZG93LiAqL1xyXG4gICAgRGV0YWNoZWQ/OiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIE1lc3NhZ2VEaWFsb2dPcHRpb25zIHtcclxuICAgIC8qKiBUaGUgdGl0bGUgb2YgdGhlIGRpYWxvZyB3aW5kb3cuICovXHJcbiAgICBUaXRsZT86IHN0cmluZztcclxuICAgIC8qKiBUaGUgbWFpbiBtZXNzYWdlIHRvIHNob3cgaW4gdGhlIGRpYWxvZy4gKi9cclxuICAgIE1lc3NhZ2U/OiBzdHJpbmc7XHJcbiAgICAvKiogQXJyYXkgb2YgYnV0dG9uIG9wdGlvbnMgdG8gc2hvdyBpbiB0aGUgZGlhbG9nLiAqL1xyXG4gICAgQnV0dG9ucz86IEJ1dHRvbltdO1xyXG4gICAgLyoqIFRydWUgaWYgdGhlIGRpYWxvZyBzaG91bGQgYXBwZWFyIGRldGFjaGVkIGZyb20gdGhlIG1haW4gd2luZG93IChpZiBhcHBsaWNhYmxlKS4gKi9cclxuICAgIERldGFjaGVkPzogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBCdXR0b24ge1xyXG4gICAgLyoqIFRleHQgdGhhdCBhcHBlYXJzIHdpdGhpbiB0aGUgYnV0dG9uLiAqL1xyXG4gICAgTGFiZWw/OiBzdHJpbmc7XHJcbiAgICAvKiogVHJ1ZSBpZiB0aGUgYnV0dG9uIHNob3VsZCBjYW5jZWwgYW4gb3BlcmF0aW9uIHdoZW4gY2xpY2tlZC4gKi9cclxuICAgIElzQ2FuY2VsPzogYm9vbGVhbjtcclxuICAgIC8qKiBUcnVlIGlmIHRoZSBidXR0b24gc2hvdWxkIGJlIHRoZSBkZWZhdWx0IGFjdGlvbiB3aGVuIHRoZSB1c2VyIHByZXNzZXMgZW50ZXIuICovXHJcbiAgICBJc0RlZmF1bHQ/OiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVGaWx0ZXIge1xyXG4gICAgLyoqIERpc3BsYXkgbmFtZSBmb3IgdGhlIGZpbHRlciwgaXQgY291bGQgYmUgXCJUZXh0IEZpbGVzXCIsIFwiSW1hZ2VzXCIgZXRjLiAqL1xyXG4gICAgRGlzcGxheU5hbWU/OiBzdHJpbmc7XHJcbiAgICAvKiogUGF0dGVybiB0byBtYXRjaCBmb3IgdGhlIGZpbHRlciwgZS5nLiBcIioudHh0OyoubWRcIiBmb3IgdGV4dCBtYXJrZG93biBmaWxlcy4gKi9cclxuICAgIFBhdHRlcm4/OiBzdHJpbmc7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBIYW5kbGVzIHRoZSByZXN1bHQgb2YgYSBkaWFsb2cgcmVxdWVzdC5cclxuICpcclxuICogQHBhcmFtIGlkIC0gVGhlIGlkIG9mIHRoZSByZXF1ZXN0IHRvIGhhbmRsZSB0aGUgcmVzdWx0IGZvci5cclxuICogQHBhcmFtIGRhdGEgLSBUaGUgcmVzdWx0IGRhdGEgb2YgdGhlIHJlcXVlc3QuXHJcbiAqIEBwYXJhbSBpc0pTT04gLSBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZGF0YSBpcyBKU09OIG9yIG5vdC5cclxuICovXHJcbmZ1bmN0aW9uIGRpYWxvZ1Jlc3VsdENhbGxiYWNrKGlkOiBzdHJpbmcsIGRhdGE6IHN0cmluZywgaXNKU09OOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBsZXQgcmVzb2x2ZXJzID0gZ2V0QW5kRGVsZXRlUmVzcG9uc2UoaWQpO1xyXG4gICAgaWYgKCFyZXNvbHZlcnMpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGlzSlNPTikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHJlc29sdmVycy5yZXNvbHZlKEpTT04ucGFyc2UoZGF0YSkpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XHJcbiAgICAgICAgICAgIHJlc29sdmVycy5yZWplY3QobmV3IFR5cGVFcnJvcihcImNvdWxkIG5vdCBwYXJzZSByZXN1bHQ6IFwiICsgZXJyLm1lc3NhZ2UsIHsgY2F1c2U6IGVyciB9KSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICByZXNvbHZlcnMucmVzb2x2ZShkYXRhKTtcclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEhhbmRsZXMgdGhlIGVycm9yIGZyb20gYSBkaWFsb2cgcmVxdWVzdC5cclxuICpcclxuICogQHBhcmFtIGlkIC0gVGhlIGlkIG9mIHRoZSBwcm9taXNlIGhhbmRsZXIuXHJcbiAqIEBwYXJhbSBtZXNzYWdlIC0gQW4gZXJyb3IgbWVzc2FnZS5cclxuICovXHJcbmZ1bmN0aW9uIGRpYWxvZ0Vycm9yQ2FsbGJhY2soaWQ6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBnZXRBbmREZWxldGVSZXNwb25zZShpZCk/LnJlamVjdChuZXcgd2luZG93LkVycm9yKG1lc3NhZ2UpKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHJpZXZlcyBhbmQgcmVtb3ZlcyB0aGUgcmVzcG9uc2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBJRCBmcm9tIHRoZSBkaWFsb2dSZXNwb25zZXMgbWFwLlxyXG4gKlxyXG4gKiBAcGFyYW0gaWQgLSBUaGUgSUQgb2YgdGhlIHJlc3BvbnNlIHRvIGJlIHJldHJpZXZlZCBhbmQgcmVtb3ZlZC5cclxuICogQHJldHVybnMgVGhlIHJlc3BvbnNlIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIElELCBpZiBhbnkuXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRBbmREZWxldGVSZXNwb25zZShpZDogc3RyaW5nKTogUHJvbWlzZVJlc29sdmVycyB8IHVuZGVmaW5lZCB7XHJcbiAgICBjb25zdCByZXNwb25zZSA9IGRpYWxvZ1Jlc3BvbnNlcy5nZXQoaWQpO1xyXG4gICAgZGlhbG9nUmVzcG9uc2VzLmRlbGV0ZShpZCk7XHJcbiAgICByZXR1cm4gcmVzcG9uc2U7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZW5lcmF0ZXMgYSB1bmlxdWUgSUQgdXNpbmcgdGhlIG5hbm9pZCBsaWJyYXJ5LlxyXG4gKlxyXG4gKiBAcmV0dXJucyBBIHVuaXF1ZSBJRCB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBkaWFsb2dSZXNwb25zZXMgc2V0LlxyXG4gKi9cclxuZnVuY3Rpb24gZ2VuZXJhdGVJRCgpOiBzdHJpbmcge1xyXG4gICAgbGV0IHJlc3VsdDtcclxuICAgIGRvIHtcclxuICAgICAgICByZXN1bHQgPSBuYW5vaWQoKTtcclxuICAgIH0gd2hpbGUgKGRpYWxvZ1Jlc3BvbnNlcy5oYXMocmVzdWx0KSk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG4vKipcclxuICogUHJlc2VudHMgYSBkaWFsb2cgb2Ygc3BlY2lmaWVkIHR5cGUgd2l0aCB0aGUgZ2l2ZW4gb3B0aW9ucy5cclxuICpcclxuICogQHBhcmFtIHR5cGUgLSBEaWFsb2cgdHlwZS5cclxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIGZvciB0aGUgZGlhbG9nLlxyXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHJlc3VsdCBvZiBkaWFsb2cuXHJcbiAqL1xyXG5mdW5jdGlvbiBkaWFsb2codHlwZTogbnVtYmVyLCBvcHRpb25zOiBNZXNzYWdlRGlhbG9nT3B0aW9ucyB8IE9wZW5GaWxlRGlhbG9nT3B0aW9ucyB8IFNhdmVGaWxlRGlhbG9nT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGNvbnN0IGlkID0gZ2VuZXJhdGVJRCgpO1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICBkaWFsb2dSZXNwb25zZXMuc2V0KGlkLCB7IHJlc29sdmUsIHJlamVjdCB9KTtcclxuICAgICAgICBjYWxsKHR5cGUsIE9iamVjdC5hc3NpZ24oeyBcImRpYWxvZy1pZFwiOiBpZCB9LCBvcHRpb25zKSkuY2F0Y2goKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGRpYWxvZ1Jlc3BvbnNlcy5kZWxldGUoaWQpO1xyXG4gICAgICAgICAgICByZWplY3QoZXJyKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogUHJlc2VudHMgYW4gaW5mbyBkaWFsb2cuXHJcbiAqXHJcbiAqIEBwYXJhbSBvcHRpb25zIC0gRGlhbG9nIG9wdGlvbnNcclxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgbGFiZWwgb2YgdGhlIGNob3NlbiBidXR0b24uXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gSW5mbyhvcHRpb25zOiBNZXNzYWdlRGlhbG9nT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7IHJldHVybiBkaWFsb2coRGlhbG9nSW5mbywgb3B0aW9ucyk7IH1cclxuXHJcbi8qKlxyXG4gKiBQcmVzZW50cyBhIHdhcm5pbmcgZGlhbG9nLlxyXG4gKlxyXG4gKiBAcGFyYW0gb3B0aW9ucyAtIERpYWxvZyBvcHRpb25zLlxyXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBsYWJlbCBvZiB0aGUgY2hvc2VuIGJ1dHRvbi5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBXYXJuaW5nKG9wdGlvbnM6IE1lc3NhZ2VEaWFsb2dPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHsgcmV0dXJuIGRpYWxvZyhEaWFsb2dXYXJuaW5nLCBvcHRpb25zKTsgfVxyXG5cclxuLyoqXHJcbiAqIFByZXNlbnRzIGFuIGVycm9yIGRpYWxvZy5cclxuICpcclxuICogQHBhcmFtIG9wdGlvbnMgLSBEaWFsb2cgb3B0aW9ucy5cclxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgbGFiZWwgb2YgdGhlIGNob3NlbiBidXR0b24uXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gRXJyb3Iob3B0aW9uczogTWVzc2FnZURpYWxvZ09wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4geyByZXR1cm4gZGlhbG9nKERpYWxvZ0Vycm9yLCBvcHRpb25zKTsgfVxyXG5cclxuLyoqXHJcbiAqIFByZXNlbnRzIGEgcXVlc3Rpb24gZGlhbG9nLlxyXG4gKlxyXG4gKiBAcGFyYW0gb3B0aW9ucyAtIERpYWxvZyBvcHRpb25zLlxyXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBsYWJlbCBvZiB0aGUgY2hvc2VuIGJ1dHRvbi5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBRdWVzdGlvbihvcHRpb25zOiBNZXNzYWdlRGlhbG9nT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7IHJldHVybiBkaWFsb2coRGlhbG9nUXVlc3Rpb24sIG9wdGlvbnMpOyB9XHJcblxyXG4vKipcclxuICogUHJlc2VudHMgYSBmaWxlIHNlbGVjdGlvbiBkaWFsb2cgdG8gcGljayBvbmUgb3IgbW9yZSBmaWxlcyB0byBvcGVuLlxyXG4gKlxyXG4gKiBAcGFyYW0gb3B0aW9ucyAtIERpYWxvZyBvcHRpb25zLlxyXG4gKiBAcmV0dXJucyBTZWxlY3RlZCBmaWxlIG9yIGxpc3Qgb2YgZmlsZXMsIG9yIGEgYmxhbmsgc3RyaW5nL2VtcHR5IGxpc3QgaWYgbm8gZmlsZSBoYXMgYmVlbiBzZWxlY3RlZC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBPcGVuRmlsZShvcHRpb25zOiBPcGVuRmlsZURpYWxvZ09wdGlvbnMgJiB7IEFsbG93c011bHRpcGxlU2VsZWN0aW9uOiB0cnVlIH0pOiBQcm9taXNlPHN0cmluZ1tdPjtcclxuZXhwb3J0IGZ1bmN0aW9uIE9wZW5GaWxlKG9wdGlvbnM6IE9wZW5GaWxlRGlhbG9nT3B0aW9ucyAmIHsgQWxsb3dzTXVsdGlwbGVTZWxlY3Rpb24/OiBmYWxzZSB8IHVuZGVmaW5lZCB9KTogUHJvbWlzZTxzdHJpbmc+O1xyXG5leHBvcnQgZnVuY3Rpb24gT3BlbkZpbGUob3B0aW9uczogT3BlbkZpbGVEaWFsb2dPcHRpb25zKTogUHJvbWlzZTxzdHJpbmcgfCBzdHJpbmdbXT47XHJcbmV4cG9ydCBmdW5jdGlvbiBPcGVuRmlsZShvcHRpb25zOiBPcGVuRmlsZURpYWxvZ09wdGlvbnMpOiBQcm9taXNlPHN0cmluZyB8IHN0cmluZ1tdPiB7IHJldHVybiBkaWFsb2coRGlhbG9nT3BlbkZpbGUsIG9wdGlvbnMpID8/IFtdOyB9XHJcblxyXG4vKipcclxuICogUHJlc2VudHMgYSBmaWxlIHNlbGVjdGlvbiBkaWFsb2cgdG8gcGljayBhIGZpbGUgdG8gc2F2ZS5cclxuICpcclxuICogQHBhcmFtIG9wdGlvbnMgLSBEaWFsb2cgb3B0aW9ucy5cclxuICogQHJldHVybnMgU2VsZWN0ZWQgZmlsZSwgb3IgYSBibGFuayBzdHJpbmcgaWYgbm8gZmlsZSBoYXMgYmVlbiBzZWxlY3RlZC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBTYXZlRmlsZShvcHRpb25zOiBTYXZlRmlsZURpYWxvZ09wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4geyByZXR1cm4gZGlhbG9nKERpYWxvZ1NhdmVGaWxlLCBvcHRpb25zKTsgfVxyXG4iLCAiLypcclxuIF9cdCAgIF9fXHQgIF8gX19cclxufCB8XHQgLyAvX19fIF8oXykgL19fX19cclxufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xyXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcclxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXHJcblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cclxuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxyXG4qL1xyXG5cclxuaW1wb3J0IHsgbmV3UnVudGltZUNhbGxlciwgb2JqZWN0TmFtZXMgfSBmcm9tIFwiLi9ydW50aW1lLmpzXCI7XHJcbmltcG9ydCB7IGV2ZW50TGlzdGVuZXJzLCBMaXN0ZW5lciwgbGlzdGVuZXJPZmYgfSBmcm9tIFwiLi9saXN0ZW5lci5qc1wiO1xyXG5cclxuLy8gU2V0dXBcclxud2luZG93Ll93YWlscyA9IHdpbmRvdy5fd2FpbHMgfHwge307XHJcbndpbmRvdy5fd2FpbHMuZGlzcGF0Y2hXYWlsc0V2ZW50ID0gZGlzcGF0Y2hXYWlsc0V2ZW50O1xyXG5cclxuY29uc3QgY2FsbCA9IG5ld1J1bnRpbWVDYWxsZXIob2JqZWN0TmFtZXMuRXZlbnRzKTtcclxuY29uc3QgRW1pdE1ldGhvZCA9IDA7XHJcblxyXG5leHBvcnQgeyBUeXBlcyB9IGZyb20gXCIuL2V2ZW50X3R5cGVzLmpzXCI7XHJcblxyXG4vKipcclxuICogVGhlIHR5cGUgb2YgaGFuZGxlcnMgZm9yIGEgZ2l2ZW4gZXZlbnQuXHJcbiAqL1xyXG5leHBvcnQgdHlwZSBDYWxsYmFjayA9IChldjogV2FpbHNFdmVudCkgPT4gdm9pZDtcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIGEgc3lzdGVtIGV2ZW50IG9yIGEgY3VzdG9tIGV2ZW50IGVtaXR0ZWQgdGhyb3VnaCB3YWlscy1wcm92aWRlZCBmYWNpbGl0aWVzLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFdhaWxzRXZlbnQge1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXHJcbiAgICAgKi9cclxuICAgIG5hbWU6IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIE9wdGlvbmFsIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbWl0dGVkIGV2ZW50LlxyXG4gICAgICovXHJcbiAgICBkYXRhOiBhbnk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBOYW1lIG9mIHRoZSBvcmlnaW5hdGluZyB3aW5kb3cuIE9taXR0ZWQgZm9yIGFwcGxpY2F0aW9uIGV2ZW50cy5cclxuICAgICAqIFdpbGwgYmUgb3ZlcnJpZGRlbiBpZiBzZXQgbWFudWFsbHkuXHJcbiAgICAgKi9cclxuICAgIHNlbmRlcj86IHN0cmluZztcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIGRhdGE6IGFueSA9IG51bGwpIHtcclxuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGRpc3BhdGNoV2FpbHNFdmVudChldmVudDogYW55KSB7XHJcbiAgICBsZXQgbGlzdGVuZXJzID0gZXZlbnRMaXN0ZW5lcnMuZ2V0KGV2ZW50Lm5hbWUpO1xyXG4gICAgaWYgKCFsaXN0ZW5lcnMpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHdhaWxzRXZlbnQgPSBuZXcgV2FpbHNFdmVudChldmVudC5uYW1lLCBldmVudC5kYXRhKTtcclxuICAgIGlmICgnc2VuZGVyJyBpbiBldmVudCkge1xyXG4gICAgICAgIHdhaWxzRXZlbnQuc2VuZGVyID0gZXZlbnQuc2VuZGVyO1xyXG4gICAgfVxyXG5cclxuICAgIGxpc3RlbmVycyA9IGxpc3RlbmVycy5maWx0ZXIobGlzdGVuZXIgPT4gIWxpc3RlbmVyLmRpc3BhdGNoKHdhaWxzRXZlbnQpKTtcclxuICAgIGlmIChsaXN0ZW5lcnMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgZXZlbnRMaXN0ZW5lcnMuZGVsZXRlKGV2ZW50Lm5hbWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBldmVudExpc3RlbmVycy5zZXQoZXZlbnQubmFtZSwgbGlzdGVuZXJzKTtcclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFJlZ2lzdGVyIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGZvciBhIHNwZWNpZmljIGV2ZW50LlxyXG4gKlxyXG4gKiBAcGFyYW0gZXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIHJlZ2lzdGVyIHRoZSBjYWxsYmFjayBmb3IuXHJcbiAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlxyXG4gKiBAcGFyYW0gbWF4Q2FsbGJhY2tzIC0gVGhlIG1heGltdW0gbnVtYmVyIG9mIHRpbWVzIHRoZSBjYWxsYmFjayBjYW4gYmUgY2FsbGVkIGZvciB0aGUgZXZlbnQuIE9uY2UgdGhlIG1heGltdW0gbnVtYmVyIGlzIHJlYWNoZWQsIHRoZSBjYWxsYmFjayB3aWxsIG5vIGxvbmdlciBiZSBjYWxsZWQuXHJcbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCwgd2hlbiBjYWxsZWQsIHdpbGwgdW5yZWdpc3RlciB0aGUgY2FsbGJhY2sgZnJvbSB0aGUgZXZlbnQuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gT25NdWx0aXBsZShldmVudE5hbWU6IHN0cmluZywgY2FsbGJhY2s6IENhbGxiYWNrLCBtYXhDYWxsYmFja3M6IG51bWJlcikge1xyXG4gICAgbGV0IGxpc3RlbmVycyA9IGV2ZW50TGlzdGVuZXJzLmdldChldmVudE5hbWUpIHx8IFtdO1xyXG4gICAgY29uc3QgdGhpc0xpc3RlbmVyID0gbmV3IExpc3RlbmVyKGV2ZW50TmFtZSwgY2FsbGJhY2ssIG1heENhbGxiYWNrcyk7XHJcbiAgICBsaXN0ZW5lcnMucHVzaCh0aGlzTGlzdGVuZXIpO1xyXG4gICAgZXZlbnRMaXN0ZW5lcnMuc2V0KGV2ZW50TmFtZSwgbGlzdGVuZXJzKTtcclxuICAgIHJldHVybiAoKSA9PiBsaXN0ZW5lck9mZih0aGlzTGlzdGVuZXIpO1xyXG59XHJcblxyXG4vKipcclxuICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgd2hlbiB0aGUgc3BlY2lmaWVkIGV2ZW50IG9jY3Vycy5cclxuICpcclxuICogQHBhcmFtIGV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudCB0byByZWdpc3RlciB0aGUgY2FsbGJhY2sgZm9yLlxyXG4gKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC5cclxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0LCB3aGVuIGNhbGxlZCwgd2lsbCB1bnJlZ2lzdGVyIHRoZSBjYWxsYmFjayBmcm9tIHRoZSBldmVudC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBPbihldmVudE5hbWU6IHN0cmluZywgY2FsbGJhY2s6IENhbGxiYWNrKTogKCkgPT4gdm9pZCB7XHJcbiAgICByZXR1cm4gT25NdWx0aXBsZShldmVudE5hbWUsIGNhbGxiYWNrLCAtMSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZWdpc3RlcnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBvbmx5IG9uY2UgZm9yIHRoZSBzcGVjaWZpZWQgZXZlbnQuXHJcbiAqXHJcbiAqIEBwYXJhbSBldmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gcmVnaXN0ZXIgdGhlIGNhbGxiYWNrIGZvci5cclxuICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuXHJcbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCwgd2hlbiBjYWxsZWQsIHdpbGwgdW5yZWdpc3RlciB0aGUgY2FsbGJhY2sgZnJvbSB0aGUgZXZlbnQuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gT25jZShldmVudE5hbWU6IHN0cmluZywgY2FsbGJhY2s6IENhbGxiYWNrKTogKCkgPT4gdm9pZCB7XHJcbiAgICByZXR1cm4gT25NdWx0aXBsZShldmVudE5hbWUsIGNhbGxiYWNrLCAxKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJlbW92ZXMgZXZlbnQgbGlzdGVuZXJzIGZvciB0aGUgc3BlY2lmaWVkIGV2ZW50IG5hbWVzLlxyXG4gKlxyXG4gKiBAcGFyYW0gZXZlbnROYW1lcyAtIFRoZSBuYW1lIG9mIHRoZSBldmVudHMgdG8gcmVtb3ZlIGxpc3RlbmVycyBmb3IuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gT2ZmKC4uLmV2ZW50TmFtZXM6IFtzdHJpbmcsIC4uLnN0cmluZ1tdXSk6IHZvaWQge1xyXG4gICAgZXZlbnROYW1lcy5mb3JFYWNoKGV2ZW50TmFtZSA9PiBldmVudExpc3RlbmVycy5kZWxldGUoZXZlbnROYW1lKSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZW1vdmVzIGFsbCBldmVudCBsaXN0ZW5lcnMuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gT2ZmQWxsKCk6IHZvaWQge1xyXG4gICAgZXZlbnRMaXN0ZW5lcnMuY2xlYXIoKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEVtaXRzIGFuIGV2ZW50IHVzaW5nIHRoZSBuYW1lIGFuZCBkYXRhLlxyXG4gKlxyXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCB3aWxsIGJlIGZ1bGZpbGxlZCBvbmNlIHRoZSBldmVudCBoYXMgYmVlbiBlbWl0dGVkLlxyXG4gKiBAcGFyYW0gbmFtZSAtIHRoZSBuYW1lIG9mIHRoZSBldmVudCB0byBlbWl0LlxyXG4gKiBAcGFyYW0gZGF0YSAtIHRoZSBkYXRhIHRvIGJlIHNlbnQgd2l0aCB0aGUgZXZlbnQuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gRW1pdChuYW1lOiBzdHJpbmcsIGRhdGE/OiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBldmVudDogV2FpbHNFdmVudDtcclxuXHJcbiAgICBpZiAodHlwZW9mIG5hbWUgPT09ICdvYmplY3QnICYmIG5hbWUgIT09IG51bGwgJiYgJ25hbWUnIGluIG5hbWUgJiYgJ2RhdGEnIGluIG5hbWUpIHtcclxuICAgICAgICAvLyBJZiBuYW1lIGlzIGFuIG9iamVjdCB3aXRoIGEgbmFtZSBwcm9wZXJ0eSwgdXNlIGl0IGRpcmVjdGx5XHJcbiAgICAgICAgZXZlbnQgPSBuZXcgV2FpbHNFdmVudChuYW1lWyduYW1lJ10sIG5hbWVbJ2RhdGEnXSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIE90aGVyd2lzZSB1c2UgdGhlIHN0YW5kYXJkIHBhcmFtZXRlcnNcclxuICAgICAgICBldmVudCA9IG5ldyBXYWlsc0V2ZW50KG5hbWUgYXMgc3RyaW5nLCBkYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY2FsbChFbWl0TWV0aG9kLCBldmVudCk7XHJcbn1cclxuXHJcbiIsICIvKlxyXG4gX1x0ICAgX19cdCAgXyBfX1xyXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xyXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXHJcbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxyXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cclxuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xyXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XHJcbiovXHJcblxyXG4vLyBUaGUgZm9sbG93aW5nIHV0aWxpdGllcyBoYXZlIGJlZW4gZmFjdG9yZWQgb3V0IG9mIC4vZXZlbnRzLnRzXHJcbi8vIGZvciB0ZXN0aW5nIHB1cnBvc2VzLlxyXG5cclxuZXhwb3J0IGNvbnN0IGV2ZW50TGlzdGVuZXJzID0gbmV3IE1hcDxzdHJpbmcsIExpc3RlbmVyW10+KCk7XHJcblxyXG5leHBvcnQgY2xhc3MgTGlzdGVuZXIge1xyXG4gICAgZXZlbnROYW1lOiBzdHJpbmc7XHJcbiAgICBjYWxsYmFjazogKGRhdGE6IGFueSkgPT4gdm9pZDtcclxuICAgIG1heENhbGxiYWNrczogbnVtYmVyO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGV2ZW50TmFtZTogc3RyaW5nLCBjYWxsYmFjazogKGRhdGE6IGFueSkgPT4gdm9pZCwgbWF4Q2FsbGJhY2tzOiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLmV2ZW50TmFtZSA9IGV2ZW50TmFtZTtcclxuICAgICAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7XHJcbiAgICAgICAgdGhpcy5tYXhDYWxsYmFja3MgPSBtYXhDYWxsYmFja3MgfHwgLTE7XHJcbiAgICB9XHJcblxyXG4gICAgZGlzcGF0Y2goZGF0YTogYW55KTogYm9vbGVhbiB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhpcy5jYWxsYmFjayhkYXRhKTtcclxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMubWF4Q2FsbGJhY2tzID09PSAtMSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIHRoaXMubWF4Q2FsbGJhY2tzIC09IDE7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubWF4Q2FsbGJhY2tzID09PSAwO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbGlzdGVuZXJPZmYobGlzdGVuZXI6IExpc3RlbmVyKTogdm9pZCB7XHJcbiAgICBsZXQgbGlzdGVuZXJzID0gZXZlbnRMaXN0ZW5lcnMuZ2V0KGxpc3RlbmVyLmV2ZW50TmFtZSk7XHJcbiAgICBpZiAoIWxpc3RlbmVycykge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuZmlsdGVyKGwgPT4gbCAhPT0gbGlzdGVuZXIpO1xyXG4gICAgaWYgKGxpc3RlbmVycy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICBldmVudExpc3RlbmVycy5kZWxldGUobGlzdGVuZXIuZXZlbnROYW1lKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZXZlbnRMaXN0ZW5lcnMuc2V0KGxpc3RlbmVyLmV2ZW50TmFtZSwgbGlzdGVuZXJzKTtcclxuICAgIH1cclxufVxyXG4iLCAiLypcclxuIF9cdCAgIF9fXHQgIF8gX19cclxufCB8XHQgLyAvX19fIF8oXykgL19fX19cclxufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xyXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcclxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXHJcblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cclxuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxyXG4qL1xyXG5cclxuLy8gQ3luaHlyY2h3eWQgeSBmZmVpbCBob24geW4gYXd0b21hdGlnLiBQRUlESVdDSCBcdTAwQzIgTU9ESVdMXHJcbi8vIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZC4gRE8gTk9UIEVESVRcclxuXHJcbmV4cG9ydCBjb25zdCBUeXBlcyA9IE9iamVjdC5mcmVlemUoe1xyXG5cdFdpbmRvd3M6IE9iamVjdC5mcmVlemUoe1xyXG5cdFx0QVBNUG93ZXJTZXR0aW5nQ2hhbmdlOiBcIndpbmRvd3M6QVBNUG93ZXJTZXR0aW5nQ2hhbmdlXCIsXHJcblx0XHRBUE1Qb3dlclN0YXR1c0NoYW5nZTogXCJ3aW5kb3dzOkFQTVBvd2VyU3RhdHVzQ2hhbmdlXCIsXHJcblx0XHRBUE1SZXN1bWVBdXRvbWF0aWM6IFwid2luZG93czpBUE1SZXN1bWVBdXRvbWF0aWNcIixcclxuXHRcdEFQTVJlc3VtZVN1c3BlbmQ6IFwid2luZG93czpBUE1SZXN1bWVTdXNwZW5kXCIsXHJcblx0XHRBUE1TdXNwZW5kOiBcIndpbmRvd3M6QVBNU3VzcGVuZFwiLFxyXG5cdFx0QXBwbGljYXRpb25TdGFydGVkOiBcIndpbmRvd3M6QXBwbGljYXRpb25TdGFydGVkXCIsXHJcblx0XHRTeXN0ZW1UaGVtZUNoYW5nZWQ6IFwid2luZG93czpTeXN0ZW1UaGVtZUNoYW5nZWRcIixcclxuXHRcdFdlYlZpZXdOYXZpZ2F0aW9uQ29tcGxldGVkOiBcIndpbmRvd3M6V2ViVmlld05hdmlnYXRpb25Db21wbGV0ZWRcIixcclxuXHRcdFdpbmRvd0FjdGl2ZTogXCJ3aW5kb3dzOldpbmRvd0FjdGl2ZVwiLFxyXG5cdFx0V2luZG93QmFja2dyb3VuZEVyYXNlOiBcIndpbmRvd3M6V2luZG93QmFja2dyb3VuZEVyYXNlXCIsXHJcblx0XHRXaW5kb3dDbGlja0FjdGl2ZTogXCJ3aW5kb3dzOldpbmRvd0NsaWNrQWN0aXZlXCIsXHJcblx0XHRXaW5kb3dDbG9zaW5nOiBcIndpbmRvd3M6V2luZG93Q2xvc2luZ1wiLFxyXG5cdFx0V2luZG93RGlkTW92ZTogXCJ3aW5kb3dzOldpbmRvd0RpZE1vdmVcIixcclxuXHRcdFdpbmRvd0RpZFJlc2l6ZTogXCJ3aW5kb3dzOldpbmRvd0RpZFJlc2l6ZVwiLFxyXG5cdFx0V2luZG93RFBJQ2hhbmdlZDogXCJ3aW5kb3dzOldpbmRvd0RQSUNoYW5nZWRcIixcclxuXHRcdFdpbmRvd0RyYWdEcm9wOiBcIndpbmRvd3M6V2luZG93RHJhZ0Ryb3BcIixcclxuXHRcdFdpbmRvd0RyYWdFbnRlcjogXCJ3aW5kb3dzOldpbmRvd0RyYWdFbnRlclwiLFxyXG5cdFx0V2luZG93RHJhZ0xlYXZlOiBcIndpbmRvd3M6V2luZG93RHJhZ0xlYXZlXCIsXHJcblx0XHRXaW5kb3dEcmFnT3ZlcjogXCJ3aW5kb3dzOldpbmRvd0RyYWdPdmVyXCIsXHJcblx0XHRXaW5kb3dFbmRNb3ZlOiBcIndpbmRvd3M6V2luZG93RW5kTW92ZVwiLFxyXG5cdFx0V2luZG93RW5kUmVzaXplOiBcIndpbmRvd3M6V2luZG93RW5kUmVzaXplXCIsXHJcblx0XHRXaW5kb3dGdWxsc2NyZWVuOiBcIndpbmRvd3M6V2luZG93RnVsbHNjcmVlblwiLFxyXG5cdFx0V2luZG93SGlkZTogXCJ3aW5kb3dzOldpbmRvd0hpZGVcIixcclxuXHRcdFdpbmRvd0luYWN0aXZlOiBcIndpbmRvd3M6V2luZG93SW5hY3RpdmVcIixcclxuXHRcdFdpbmRvd0tleURvd246IFwid2luZG93czpXaW5kb3dLZXlEb3duXCIsXHJcblx0XHRXaW5kb3dLZXlVcDogXCJ3aW5kb3dzOldpbmRvd0tleVVwXCIsXHJcblx0XHRXaW5kb3dLaWxsRm9jdXM6IFwid2luZG93czpXaW5kb3dLaWxsRm9jdXNcIixcclxuXHRcdFdpbmRvd05vbkNsaWVudEhpdDogXCJ3aW5kb3dzOldpbmRvd05vbkNsaWVudEhpdFwiLFxyXG5cdFx0V2luZG93Tm9uQ2xpZW50TW91c2VEb3duOiBcIndpbmRvd3M6V2luZG93Tm9uQ2xpZW50TW91c2VEb3duXCIsXHJcblx0XHRXaW5kb3dOb25DbGllbnRNb3VzZUxlYXZlOiBcIndpbmRvd3M6V2luZG93Tm9uQ2xpZW50TW91c2VMZWF2ZVwiLFxyXG5cdFx0V2luZG93Tm9uQ2xpZW50TW91c2VNb3ZlOiBcIndpbmRvd3M6V2luZG93Tm9uQ2xpZW50TW91c2VNb3ZlXCIsXHJcblx0XHRXaW5kb3dOb25DbGllbnRNb3VzZVVwOiBcIndpbmRvd3M6V2luZG93Tm9uQ2xpZW50TW91c2VVcFwiLFxyXG5cdFx0V2luZG93UGFpbnQ6IFwid2luZG93czpXaW5kb3dQYWludFwiLFxyXG5cdFx0V2luZG93UmVzdG9yZTogXCJ3aW5kb3dzOldpbmRvd1Jlc3RvcmVcIixcclxuXHRcdFdpbmRvd1NldEZvY3VzOiBcIndpbmRvd3M6V2luZG93U2V0Rm9jdXNcIixcclxuXHRcdFdpbmRvd1Nob3c6IFwid2luZG93czpXaW5kb3dTaG93XCIsXHJcblx0XHRXaW5kb3dTdGFydE1vdmU6IFwid2luZG93czpXaW5kb3dTdGFydE1vdmVcIixcclxuXHRcdFdpbmRvd1N0YXJ0UmVzaXplOiBcIndpbmRvd3M6V2luZG93U3RhcnRSZXNpemVcIixcclxuXHRcdFdpbmRvd1VuRnVsbHNjcmVlbjogXCJ3aW5kb3dzOldpbmRvd1VuRnVsbHNjcmVlblwiLFxyXG5cdFx0V2luZG93Wk9yZGVyQ2hhbmdlZDogXCJ3aW5kb3dzOldpbmRvd1pPcmRlckNoYW5nZWRcIixcclxuXHRcdFdpbmRvd01pbmltaXNlOiBcIndpbmRvd3M6V2luZG93TWluaW1pc2VcIixcclxuXHRcdFdpbmRvd1VuTWluaW1pc2U6IFwid2luZG93czpXaW5kb3dVbk1pbmltaXNlXCIsXHJcblx0XHRXaW5kb3dNYXhpbWlzZTogXCJ3aW5kb3dzOldpbmRvd01heGltaXNlXCIsXHJcblx0XHRXaW5kb3dVbk1heGltaXNlOiBcIndpbmRvd3M6V2luZG93VW5NYXhpbWlzZVwiLFxyXG5cdH0pLFxyXG5cdE1hYzogT2JqZWN0LmZyZWV6ZSh7XHJcblx0XHRBcHBsaWNhdGlvbkRpZEJlY29tZUFjdGl2ZTogXCJtYWM6QXBwbGljYXRpb25EaWRCZWNvbWVBY3RpdmVcIixcclxuXHRcdEFwcGxpY2F0aW9uRGlkQ2hhbmdlQmFja2luZ1Byb3BlcnRpZXM6IFwibWFjOkFwcGxpY2F0aW9uRGlkQ2hhbmdlQmFja2luZ1Byb3BlcnRpZXNcIixcclxuXHRcdEFwcGxpY2F0aW9uRGlkQ2hhbmdlRWZmZWN0aXZlQXBwZWFyYW5jZTogXCJtYWM6QXBwbGljYXRpb25EaWRDaGFuZ2VFZmZlY3RpdmVBcHBlYXJhbmNlXCIsXHJcblx0XHRBcHBsaWNhdGlvbkRpZENoYW5nZUljb246IFwibWFjOkFwcGxpY2F0aW9uRGlkQ2hhbmdlSWNvblwiLFxyXG5cdFx0QXBwbGljYXRpb25EaWRDaGFuZ2VPY2NsdXNpb25TdGF0ZTogXCJtYWM6QXBwbGljYXRpb25EaWRDaGFuZ2VPY2NsdXNpb25TdGF0ZVwiLFxyXG5cdFx0QXBwbGljYXRpb25EaWRDaGFuZ2VTY3JlZW5QYXJhbWV0ZXJzOiBcIm1hYzpBcHBsaWNhdGlvbkRpZENoYW5nZVNjcmVlblBhcmFtZXRlcnNcIixcclxuXHRcdEFwcGxpY2F0aW9uRGlkQ2hhbmdlU3RhdHVzQmFyRnJhbWU6IFwibWFjOkFwcGxpY2F0aW9uRGlkQ2hhbmdlU3RhdHVzQmFyRnJhbWVcIixcclxuXHRcdEFwcGxpY2F0aW9uRGlkQ2hhbmdlU3RhdHVzQmFyT3JpZW50YXRpb246IFwibWFjOkFwcGxpY2F0aW9uRGlkQ2hhbmdlU3RhdHVzQmFyT3JpZW50YXRpb25cIixcclxuXHRcdEFwcGxpY2F0aW9uRGlkQ2hhbmdlVGhlbWU6IFwibWFjOkFwcGxpY2F0aW9uRGlkQ2hhbmdlVGhlbWVcIixcclxuXHRcdEFwcGxpY2F0aW9uRGlkRmluaXNoTGF1bmNoaW5nOiBcIm1hYzpBcHBsaWNhdGlvbkRpZEZpbmlzaExhdW5jaGluZ1wiLFxyXG5cdFx0QXBwbGljYXRpb25EaWRIaWRlOiBcIm1hYzpBcHBsaWNhdGlvbkRpZEhpZGVcIixcclxuXHRcdEFwcGxpY2F0aW9uRGlkUmVzaWduQWN0aXZlOiBcIm1hYzpBcHBsaWNhdGlvbkRpZFJlc2lnbkFjdGl2ZVwiLFxyXG5cdFx0QXBwbGljYXRpb25EaWRVbmhpZGU6IFwibWFjOkFwcGxpY2F0aW9uRGlkVW5oaWRlXCIsXHJcblx0XHRBcHBsaWNhdGlvbkRpZFVwZGF0ZTogXCJtYWM6QXBwbGljYXRpb25EaWRVcGRhdGVcIixcclxuXHRcdEFwcGxpY2F0aW9uU2hvdWxkSGFuZGxlUmVvcGVuOiBcIm1hYzpBcHBsaWNhdGlvblNob3VsZEhhbmRsZVJlb3BlblwiLFxyXG5cdFx0QXBwbGljYXRpb25XaWxsQmVjb21lQWN0aXZlOiBcIm1hYzpBcHBsaWNhdGlvbldpbGxCZWNvbWVBY3RpdmVcIixcclxuXHRcdEFwcGxpY2F0aW9uV2lsbEZpbmlzaExhdW5jaGluZzogXCJtYWM6QXBwbGljYXRpb25XaWxsRmluaXNoTGF1bmNoaW5nXCIsXHJcblx0XHRBcHBsaWNhdGlvbldpbGxIaWRlOiBcIm1hYzpBcHBsaWNhdGlvbldpbGxIaWRlXCIsXHJcblx0XHRBcHBsaWNhdGlvbldpbGxSZXNpZ25BY3RpdmU6IFwibWFjOkFwcGxpY2F0aW9uV2lsbFJlc2lnbkFjdGl2ZVwiLFxyXG5cdFx0QXBwbGljYXRpb25XaWxsVGVybWluYXRlOiBcIm1hYzpBcHBsaWNhdGlvbldpbGxUZXJtaW5hdGVcIixcclxuXHRcdEFwcGxpY2F0aW9uV2lsbFVuaGlkZTogXCJtYWM6QXBwbGljYXRpb25XaWxsVW5oaWRlXCIsXHJcblx0XHRBcHBsaWNhdGlvbldpbGxVcGRhdGU6IFwibWFjOkFwcGxpY2F0aW9uV2lsbFVwZGF0ZVwiLFxyXG5cdFx0TWVudURpZEFkZEl0ZW06IFwibWFjOk1lbnVEaWRBZGRJdGVtXCIsXHJcblx0XHRNZW51RGlkQmVnaW5UcmFja2luZzogXCJtYWM6TWVudURpZEJlZ2luVHJhY2tpbmdcIixcclxuXHRcdE1lbnVEaWRDbG9zZTogXCJtYWM6TWVudURpZENsb3NlXCIsXHJcblx0XHRNZW51RGlkRGlzcGxheUl0ZW06IFwibWFjOk1lbnVEaWREaXNwbGF5SXRlbVwiLFxyXG5cdFx0TWVudURpZEVuZFRyYWNraW5nOiBcIm1hYzpNZW51RGlkRW5kVHJhY2tpbmdcIixcclxuXHRcdE1lbnVEaWRIaWdobGlnaHRJdGVtOiBcIm1hYzpNZW51RGlkSGlnaGxpZ2h0SXRlbVwiLFxyXG5cdFx0TWVudURpZE9wZW46IFwibWFjOk1lbnVEaWRPcGVuXCIsXHJcblx0XHRNZW51RGlkUG9wVXA6IFwibWFjOk1lbnVEaWRQb3BVcFwiLFxyXG5cdFx0TWVudURpZFJlbW92ZUl0ZW06IFwibWFjOk1lbnVEaWRSZW1vdmVJdGVtXCIsXHJcblx0XHRNZW51RGlkU2VuZEFjdGlvbjogXCJtYWM6TWVudURpZFNlbmRBY3Rpb25cIixcclxuXHRcdE1lbnVEaWRTZW5kQWN0aW9uVG9JdGVtOiBcIm1hYzpNZW51RGlkU2VuZEFjdGlvblRvSXRlbVwiLFxyXG5cdFx0TWVudURpZFVwZGF0ZTogXCJtYWM6TWVudURpZFVwZGF0ZVwiLFxyXG5cdFx0TWVudVdpbGxBZGRJdGVtOiBcIm1hYzpNZW51V2lsbEFkZEl0ZW1cIixcclxuXHRcdE1lbnVXaWxsQmVnaW5UcmFja2luZzogXCJtYWM6TWVudVdpbGxCZWdpblRyYWNraW5nXCIsXHJcblx0XHRNZW51V2lsbERpc3BsYXlJdGVtOiBcIm1hYzpNZW51V2lsbERpc3BsYXlJdGVtXCIsXHJcblx0XHRNZW51V2lsbEVuZFRyYWNraW5nOiBcIm1hYzpNZW51V2lsbEVuZFRyYWNraW5nXCIsXHJcblx0XHRNZW51V2lsbEhpZ2hsaWdodEl0ZW06IFwibWFjOk1lbnVXaWxsSGlnaGxpZ2h0SXRlbVwiLFxyXG5cdFx0TWVudVdpbGxPcGVuOiBcIm1hYzpNZW51V2lsbE9wZW5cIixcclxuXHRcdE1lbnVXaWxsUG9wVXA6IFwibWFjOk1lbnVXaWxsUG9wVXBcIixcclxuXHRcdE1lbnVXaWxsUmVtb3ZlSXRlbTogXCJtYWM6TWVudVdpbGxSZW1vdmVJdGVtXCIsXHJcblx0XHRNZW51V2lsbFNlbmRBY3Rpb246IFwibWFjOk1lbnVXaWxsU2VuZEFjdGlvblwiLFxyXG5cdFx0TWVudVdpbGxTZW5kQWN0aW9uVG9JdGVtOiBcIm1hYzpNZW51V2lsbFNlbmRBY3Rpb25Ub0l0ZW1cIixcclxuXHRcdE1lbnVXaWxsVXBkYXRlOiBcIm1hYzpNZW51V2lsbFVwZGF0ZVwiLFxyXG5cdFx0V2ViVmlld0RpZENvbW1pdE5hdmlnYXRpb246IFwibWFjOldlYlZpZXdEaWRDb21taXROYXZpZ2F0aW9uXCIsXHJcblx0XHRXZWJWaWV3RGlkRmluaXNoTmF2aWdhdGlvbjogXCJtYWM6V2ViVmlld0RpZEZpbmlzaE5hdmlnYXRpb25cIixcclxuXHRcdFdlYlZpZXdEaWRSZWNlaXZlU2VydmVyUmVkaXJlY3RGb3JQcm92aXNpb25hbE5hdmlnYXRpb246IFwibWFjOldlYlZpZXdEaWRSZWNlaXZlU2VydmVyUmVkaXJlY3RGb3JQcm92aXNpb25hbE5hdmlnYXRpb25cIixcclxuXHRcdFdlYlZpZXdEaWRTdGFydFByb3Zpc2lvbmFsTmF2aWdhdGlvbjogXCJtYWM6V2ViVmlld0RpZFN0YXJ0UHJvdmlzaW9uYWxOYXZpZ2F0aW9uXCIsXHJcblx0XHRXaW5kb3dEaWRCZWNvbWVLZXk6IFwibWFjOldpbmRvd0RpZEJlY29tZUtleVwiLFxyXG5cdFx0V2luZG93RGlkQmVjb21lTWFpbjogXCJtYWM6V2luZG93RGlkQmVjb21lTWFpblwiLFxyXG5cdFx0V2luZG93RGlkQmVnaW5TaGVldDogXCJtYWM6V2luZG93RGlkQmVnaW5TaGVldFwiLFxyXG5cdFx0V2luZG93RGlkQ2hhbmdlQWxwaGE6IFwibWFjOldpbmRvd0RpZENoYW5nZUFscGhhXCIsXHJcblx0XHRXaW5kb3dEaWRDaGFuZ2VCYWNraW5nTG9jYXRpb246IFwibWFjOldpbmRvd0RpZENoYW5nZUJhY2tpbmdMb2NhdGlvblwiLFxyXG5cdFx0V2luZG93RGlkQ2hhbmdlQmFja2luZ1Byb3BlcnRpZXM6IFwibWFjOldpbmRvd0RpZENoYW5nZUJhY2tpbmdQcm9wZXJ0aWVzXCIsXHJcblx0XHRXaW5kb3dEaWRDaGFuZ2VDb2xsZWN0aW9uQmVoYXZpb3I6IFwibWFjOldpbmRvd0RpZENoYW5nZUNvbGxlY3Rpb25CZWhhdmlvclwiLFxyXG5cdFx0V2luZG93RGlkQ2hhbmdlRWZmZWN0aXZlQXBwZWFyYW5jZTogXCJtYWM6V2luZG93RGlkQ2hhbmdlRWZmZWN0aXZlQXBwZWFyYW5jZVwiLFxyXG5cdFx0V2luZG93RGlkQ2hhbmdlT2NjbHVzaW9uU3RhdGU6IFwibWFjOldpbmRvd0RpZENoYW5nZU9jY2x1c2lvblN0YXRlXCIsXHJcblx0XHRXaW5kb3dEaWRDaGFuZ2VPcmRlcmluZ01vZGU6IFwibWFjOldpbmRvd0RpZENoYW5nZU9yZGVyaW5nTW9kZVwiLFxyXG5cdFx0V2luZG93RGlkQ2hhbmdlU2NyZWVuOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VTY3JlZW5cIixcclxuXHRcdFdpbmRvd0RpZENoYW5nZVNjcmVlblBhcmFtZXRlcnM6IFwibWFjOldpbmRvd0RpZENoYW5nZVNjcmVlblBhcmFtZXRlcnNcIixcclxuXHRcdFdpbmRvd0RpZENoYW5nZVNjcmVlblByb2ZpbGU6IFwibWFjOldpbmRvd0RpZENoYW5nZVNjcmVlblByb2ZpbGVcIixcclxuXHRcdFdpbmRvd0RpZENoYW5nZVNjcmVlblNwYWNlOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VTY3JlZW5TcGFjZVwiLFxyXG5cdFx0V2luZG93RGlkQ2hhbmdlU2NyZWVuU3BhY2VQcm9wZXJ0aWVzOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VTY3JlZW5TcGFjZVByb3BlcnRpZXNcIixcclxuXHRcdFdpbmRvd0RpZENoYW5nZVNoYXJpbmdUeXBlOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VTaGFyaW5nVHlwZVwiLFxyXG5cdFx0V2luZG93RGlkQ2hhbmdlU3BhY2U6IFwibWFjOldpbmRvd0RpZENoYW5nZVNwYWNlXCIsXHJcblx0XHRXaW5kb3dEaWRDaGFuZ2VTcGFjZU9yZGVyaW5nTW9kZTogXCJtYWM6V2luZG93RGlkQ2hhbmdlU3BhY2VPcmRlcmluZ01vZGVcIixcclxuXHRcdFdpbmRvd0RpZENoYW5nZVRpdGxlOiBcIm1hYzpXaW5kb3dEaWRDaGFuZ2VUaXRsZVwiLFxyXG5cdFx0V2luZG93RGlkQ2hhbmdlVG9vbGJhcjogXCJtYWM6V2luZG93RGlkQ2hhbmdlVG9vbGJhclwiLFxyXG5cdFx0V2luZG93RGlkRGVtaW5pYXR1cml6ZTogXCJtYWM6V2luZG93RGlkRGVtaW5pYXR1cml6ZVwiLFxyXG5cdFx0V2luZG93RGlkRW5kU2hlZXQ6IFwibWFjOldpbmRvd0RpZEVuZFNoZWV0XCIsXHJcblx0XHRXaW5kb3dEaWRFbnRlckZ1bGxTY3JlZW46IFwibWFjOldpbmRvd0RpZEVudGVyRnVsbFNjcmVlblwiLFxyXG5cdFx0V2luZG93RGlkRW50ZXJWZXJzaW9uQnJvd3NlcjogXCJtYWM6V2luZG93RGlkRW50ZXJWZXJzaW9uQnJvd3NlclwiLFxyXG5cdFx0V2luZG93RGlkRXhpdEZ1bGxTY3JlZW46IFwibWFjOldpbmRvd0RpZEV4aXRGdWxsU2NyZWVuXCIsXHJcblx0XHRXaW5kb3dEaWRFeGl0VmVyc2lvbkJyb3dzZXI6IFwibWFjOldpbmRvd0RpZEV4aXRWZXJzaW9uQnJvd3NlclwiLFxyXG5cdFx0V2luZG93RGlkRXhwb3NlOiBcIm1hYzpXaW5kb3dEaWRFeHBvc2VcIixcclxuXHRcdFdpbmRvd0RpZEZvY3VzOiBcIm1hYzpXaW5kb3dEaWRGb2N1c1wiLFxyXG5cdFx0V2luZG93RGlkTWluaWF0dXJpemU6IFwibWFjOldpbmRvd0RpZE1pbmlhdHVyaXplXCIsXHJcblx0XHRXaW5kb3dEaWRNb3ZlOiBcIm1hYzpXaW5kb3dEaWRNb3ZlXCIsXHJcblx0XHRXaW5kb3dEaWRPcmRlck9mZlNjcmVlbjogXCJtYWM6V2luZG93RGlkT3JkZXJPZmZTY3JlZW5cIixcclxuXHRcdFdpbmRvd0RpZE9yZGVyT25TY3JlZW46IFwibWFjOldpbmRvd0RpZE9yZGVyT25TY3JlZW5cIixcclxuXHRcdFdpbmRvd0RpZFJlc2lnbktleTogXCJtYWM6V2luZG93RGlkUmVzaWduS2V5XCIsXHJcblx0XHRXaW5kb3dEaWRSZXNpZ25NYWluOiBcIm1hYzpXaW5kb3dEaWRSZXNpZ25NYWluXCIsXHJcblx0XHRXaW5kb3dEaWRSZXNpemU6IFwibWFjOldpbmRvd0RpZFJlc2l6ZVwiLFxyXG5cdFx0V2luZG93RGlkVXBkYXRlOiBcIm1hYzpXaW5kb3dEaWRVcGRhdGVcIixcclxuXHRcdFdpbmRvd0RpZFVwZGF0ZUFscGhhOiBcIm1hYzpXaW5kb3dEaWRVcGRhdGVBbHBoYVwiLFxyXG5cdFx0V2luZG93RGlkVXBkYXRlQ29sbGVjdGlvbkJlaGF2aW9yOiBcIm1hYzpXaW5kb3dEaWRVcGRhdGVDb2xsZWN0aW9uQmVoYXZpb3JcIixcclxuXHRcdFdpbmRvd0RpZFVwZGF0ZUNvbGxlY3Rpb25Qcm9wZXJ0aWVzOiBcIm1hYzpXaW5kb3dEaWRVcGRhdGVDb2xsZWN0aW9uUHJvcGVydGllc1wiLFxyXG5cdFx0V2luZG93RGlkVXBkYXRlU2hhZG93OiBcIm1hYzpXaW5kb3dEaWRVcGRhdGVTaGFkb3dcIixcclxuXHRcdFdpbmRvd0RpZFVwZGF0ZVRpdGxlOiBcIm1hYzpXaW5kb3dEaWRVcGRhdGVUaXRsZVwiLFxyXG5cdFx0V2luZG93RGlkVXBkYXRlVG9vbGJhcjogXCJtYWM6V2luZG93RGlkVXBkYXRlVG9vbGJhclwiLFxyXG5cdFx0V2luZG93RGlkWm9vbTogXCJtYWM6V2luZG93RGlkWm9vbVwiLFxyXG5cdFx0V2luZG93RmlsZURyYWdnaW5nRW50ZXJlZDogXCJtYWM6V2luZG93RmlsZURyYWdnaW5nRW50ZXJlZFwiLFxyXG5cdFx0V2luZG93RmlsZURyYWdnaW5nRXhpdGVkOiBcIm1hYzpXaW5kb3dGaWxlRHJhZ2dpbmdFeGl0ZWRcIixcclxuXHRcdFdpbmRvd0ZpbGVEcmFnZ2luZ1BlcmZvcm1lZDogXCJtYWM6V2luZG93RmlsZURyYWdnaW5nUGVyZm9ybWVkXCIsXHJcblx0XHRXaW5kb3dIaWRlOiBcIm1hYzpXaW5kb3dIaWRlXCIsXHJcblx0XHRXaW5kb3dNYXhpbWlzZTogXCJtYWM6V2luZG93TWF4aW1pc2VcIixcclxuXHRcdFdpbmRvd1VuTWF4aW1pc2U6IFwibWFjOldpbmRvd1VuTWF4aW1pc2VcIixcclxuXHRcdFdpbmRvd01pbmltaXNlOiBcIm1hYzpXaW5kb3dNaW5pbWlzZVwiLFxyXG5cdFx0V2luZG93VW5NaW5pbWlzZTogXCJtYWM6V2luZG93VW5NaW5pbWlzZVwiLFxyXG5cdFx0V2luZG93U2hvdWxkQ2xvc2U6IFwibWFjOldpbmRvd1Nob3VsZENsb3NlXCIsXHJcblx0XHRXaW5kb3dTaG93OiBcIm1hYzpXaW5kb3dTaG93XCIsXHJcblx0XHRXaW5kb3dXaWxsQmVjb21lS2V5OiBcIm1hYzpXaW5kb3dXaWxsQmVjb21lS2V5XCIsXHJcblx0XHRXaW5kb3dXaWxsQmVjb21lTWFpbjogXCJtYWM6V2luZG93V2lsbEJlY29tZU1haW5cIixcclxuXHRcdFdpbmRvd1dpbGxCZWdpblNoZWV0OiBcIm1hYzpXaW5kb3dXaWxsQmVnaW5TaGVldFwiLFxyXG5cdFx0V2luZG93V2lsbENoYW5nZU9yZGVyaW5nTW9kZTogXCJtYWM6V2luZG93V2lsbENoYW5nZU9yZGVyaW5nTW9kZVwiLFxyXG5cdFx0V2luZG93V2lsbENsb3NlOiBcIm1hYzpXaW5kb3dXaWxsQ2xvc2VcIixcclxuXHRcdFdpbmRvd1dpbGxEZW1pbmlhdHVyaXplOiBcIm1hYzpXaW5kb3dXaWxsRGVtaW5pYXR1cml6ZVwiLFxyXG5cdFx0V2luZG93V2lsbEVudGVyRnVsbFNjcmVlbjogXCJtYWM6V2luZG93V2lsbEVudGVyRnVsbFNjcmVlblwiLFxyXG5cdFx0V2luZG93V2lsbEVudGVyVmVyc2lvbkJyb3dzZXI6IFwibWFjOldpbmRvd1dpbGxFbnRlclZlcnNpb25Ccm93c2VyXCIsXHJcblx0XHRXaW5kb3dXaWxsRXhpdEZ1bGxTY3JlZW46IFwibWFjOldpbmRvd1dpbGxFeGl0RnVsbFNjcmVlblwiLFxyXG5cdFx0V2luZG93V2lsbEV4aXRWZXJzaW9uQnJvd3NlcjogXCJtYWM6V2luZG93V2lsbEV4aXRWZXJzaW9uQnJvd3NlclwiLFxyXG5cdFx0V2luZG93V2lsbEZvY3VzOiBcIm1hYzpXaW5kb3dXaWxsRm9jdXNcIixcclxuXHRcdFdpbmRvd1dpbGxNaW5pYXR1cml6ZTogXCJtYWM6V2luZG93V2lsbE1pbmlhdHVyaXplXCIsXHJcblx0XHRXaW5kb3dXaWxsTW92ZTogXCJtYWM6V2luZG93V2lsbE1vdmVcIixcclxuXHRcdFdpbmRvd1dpbGxPcmRlck9mZlNjcmVlbjogXCJtYWM6V2luZG93V2lsbE9yZGVyT2ZmU2NyZWVuXCIsXHJcblx0XHRXaW5kb3dXaWxsT3JkZXJPblNjcmVlbjogXCJtYWM6V2luZG93V2lsbE9yZGVyT25TY3JlZW5cIixcclxuXHRcdFdpbmRvd1dpbGxSZXNpZ25NYWluOiBcIm1hYzpXaW5kb3dXaWxsUmVzaWduTWFpblwiLFxyXG5cdFx0V2luZG93V2lsbFJlc2l6ZTogXCJtYWM6V2luZG93V2lsbFJlc2l6ZVwiLFxyXG5cdFx0V2luZG93V2lsbFVuZm9jdXM6IFwibWFjOldpbmRvd1dpbGxVbmZvY3VzXCIsXHJcblx0XHRXaW5kb3dXaWxsVXBkYXRlOiBcIm1hYzpXaW5kb3dXaWxsVXBkYXRlXCIsXHJcblx0XHRXaW5kb3dXaWxsVXBkYXRlQWxwaGE6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVBbHBoYVwiLFxyXG5cdFx0V2luZG93V2lsbFVwZGF0ZUNvbGxlY3Rpb25CZWhhdmlvcjogXCJtYWM6V2luZG93V2lsbFVwZGF0ZUNvbGxlY3Rpb25CZWhhdmlvclwiLFxyXG5cdFx0V2luZG93V2lsbFVwZGF0ZUNvbGxlY3Rpb25Qcm9wZXJ0aWVzOiBcIm1hYzpXaW5kb3dXaWxsVXBkYXRlQ29sbGVjdGlvblByb3BlcnRpZXNcIixcclxuXHRcdFdpbmRvd1dpbGxVcGRhdGVTaGFkb3c6IFwibWFjOldpbmRvd1dpbGxVcGRhdGVTaGFkb3dcIixcclxuXHRcdFdpbmRvd1dpbGxVcGRhdGVUaXRsZTogXCJtYWM6V2luZG93V2lsbFVwZGF0ZVRpdGxlXCIsXHJcblx0XHRXaW5kb3dXaWxsVXBkYXRlVG9vbGJhcjogXCJtYWM6V2luZG93V2lsbFVwZGF0ZVRvb2xiYXJcIixcclxuXHRcdFdpbmRvd1dpbGxVcGRhdGVWaXNpYmlsaXR5OiBcIm1hYzpXaW5kb3dXaWxsVXBkYXRlVmlzaWJpbGl0eVwiLFxyXG5cdFx0V2luZG93V2lsbFVzZVN0YW5kYXJkRnJhbWU6IFwibWFjOldpbmRvd1dpbGxVc2VTdGFuZGFyZEZyYW1lXCIsXHJcblx0XHRXaW5kb3dab29tSW46IFwibWFjOldpbmRvd1pvb21JblwiLFxyXG5cdFx0V2luZG93Wm9vbU91dDogXCJtYWM6V2luZG93Wm9vbU91dFwiLFxyXG5cdFx0V2luZG93Wm9vbVJlc2V0OiBcIm1hYzpXaW5kb3dab29tUmVzZXRcIixcclxuXHR9KSxcclxuXHRMaW51eDogT2JqZWN0LmZyZWV6ZSh7XHJcblx0XHRBcHBsaWNhdGlvblN0YXJ0dXA6IFwibGludXg6QXBwbGljYXRpb25TdGFydHVwXCIsXHJcblx0XHRTeXN0ZW1UaGVtZUNoYW5nZWQ6IFwibGludXg6U3lzdGVtVGhlbWVDaGFuZ2VkXCIsXHJcblx0XHRXaW5kb3dEZWxldGVFdmVudDogXCJsaW51eDpXaW5kb3dEZWxldGVFdmVudFwiLFxyXG5cdFx0V2luZG93RGlkTW92ZTogXCJsaW51eDpXaW5kb3dEaWRNb3ZlXCIsXHJcblx0XHRXaW5kb3dEaWRSZXNpemU6IFwibGludXg6V2luZG93RGlkUmVzaXplXCIsXHJcblx0XHRXaW5kb3dGb2N1c0luOiBcImxpbnV4OldpbmRvd0ZvY3VzSW5cIixcclxuXHRcdFdpbmRvd0ZvY3VzT3V0OiBcImxpbnV4OldpbmRvd0ZvY3VzT3V0XCIsXHJcblx0XHRXaW5kb3dMb2FkQ2hhbmdlZDogXCJsaW51eDpXaW5kb3dMb2FkQ2hhbmdlZFwiLFxyXG5cdH0pLFxyXG5cdENvbW1vbjogT2JqZWN0LmZyZWV6ZSh7XHJcblx0XHRBcHBsaWNhdGlvbk9wZW5lZFdpdGhGaWxlOiBcImNvbW1vbjpBcHBsaWNhdGlvbk9wZW5lZFdpdGhGaWxlXCIsXHJcblx0XHRBcHBsaWNhdGlvblN0YXJ0ZWQ6IFwiY29tbW9uOkFwcGxpY2F0aW9uU3RhcnRlZFwiLFxyXG5cdFx0VGhlbWVDaGFuZ2VkOiBcImNvbW1vbjpUaGVtZUNoYW5nZWRcIixcclxuXHRcdFdpbmRvd0Nsb3Npbmc6IFwiY29tbW9uOldpbmRvd0Nsb3NpbmdcIixcclxuXHRcdFdpbmRvd0RpZE1vdmU6IFwiY29tbW9uOldpbmRvd0RpZE1vdmVcIixcclxuXHRcdFdpbmRvd0RpZFJlc2l6ZTogXCJjb21tb246V2luZG93RGlkUmVzaXplXCIsXHJcblx0XHRXaW5kb3dEUElDaGFuZ2VkOiBcImNvbW1vbjpXaW5kb3dEUElDaGFuZ2VkXCIsXHJcblx0XHRXaW5kb3dGaWxlc0Ryb3BwZWQ6IFwiY29tbW9uOldpbmRvd0ZpbGVzRHJvcHBlZFwiLFxyXG5cdFx0V2luZG93Rm9jdXM6IFwiY29tbW9uOldpbmRvd0ZvY3VzXCIsXHJcblx0XHRXaW5kb3dGdWxsc2NyZWVuOiBcImNvbW1vbjpXaW5kb3dGdWxsc2NyZWVuXCIsXHJcblx0XHRXaW5kb3dIaWRlOiBcImNvbW1vbjpXaW5kb3dIaWRlXCIsXHJcblx0XHRXaW5kb3dMb3N0Rm9jdXM6IFwiY29tbW9uOldpbmRvd0xvc3RGb2N1c1wiLFxyXG5cdFx0V2luZG93TWF4aW1pc2U6IFwiY29tbW9uOldpbmRvd01heGltaXNlXCIsXHJcblx0XHRXaW5kb3dNaW5pbWlzZTogXCJjb21tb246V2luZG93TWluaW1pc2VcIixcclxuXHRcdFdpbmRvd1Jlc3RvcmU6IFwiY29tbW9uOldpbmRvd1Jlc3RvcmVcIixcclxuXHRcdFdpbmRvd1J1bnRpbWVSZWFkeTogXCJjb21tb246V2luZG93UnVudGltZVJlYWR5XCIsXHJcblx0XHRXaW5kb3dTaG93OiBcImNvbW1vbjpXaW5kb3dTaG93XCIsXHJcblx0XHRXaW5kb3dVbkZ1bGxzY3JlZW46IFwiY29tbW9uOldpbmRvd1VuRnVsbHNjcmVlblwiLFxyXG5cdFx0V2luZG93VW5NYXhpbWlzZTogXCJjb21tb246V2luZG93VW5NYXhpbWlzZVwiLFxyXG5cdFx0V2luZG93VW5NaW5pbWlzZTogXCJjb21tb246V2luZG93VW5NaW5pbWlzZVwiLFxyXG5cdFx0V2luZG93Wm9vbTogXCJjb21tb246V2luZG93Wm9vbVwiLFxyXG5cdFx0V2luZG93Wm9vbUluOiBcImNvbW1vbjpXaW5kb3dab29tSW5cIixcclxuXHRcdFdpbmRvd1pvb21PdXQ6IFwiY29tbW9uOldpbmRvd1pvb21PdXRcIixcclxuXHRcdFdpbmRvd1pvb21SZXNldDogXCJjb21tb246V2luZG93Wm9vbVJlc2V0XCIsXHJcblx0fSksXHJcbn0pO1xyXG4iLCAiLypcclxuIF8gICAgIF9fICAgICBfIF9fXHJcbnwgfCAgLyAvX19fIF8oXykgL19fX19cclxufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xyXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcclxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXHJcblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cclxuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxyXG4qL1xyXG5cclxuLyoqXHJcbiAqIExvZ3MgYSBtZXNzYWdlIHRvIHRoZSBjb25zb2xlIHdpdGggY3VzdG9tIGZvcm1hdHRpbmcuXHJcbiAqXHJcbiAqIEBwYXJhbSBtZXNzYWdlIC0gVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGRlYnVnTG9nKG1lc3NhZ2U6IGFueSkge1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXHJcbiAgICBjb25zb2xlLmxvZyhcclxuICAgICAgICAnJWMgd2FpbHMzICVjICcgKyBtZXNzYWdlICsgJyAnLFxyXG4gICAgICAgICdiYWNrZ3JvdW5kOiAjYWEwMDAwOyBjb2xvcjogI2ZmZjsgYm9yZGVyLXJhZGl1czogM3B4IDBweCAwcHggM3B4OyBwYWRkaW5nOiAxcHg7IGZvbnQtc2l6ZTogMC43cmVtJyxcclxuICAgICAgICAnYmFja2dyb3VuZDogIzAwOTkwMDsgY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDBweCAzcHggM3B4IDBweDsgcGFkZGluZzogMXB4OyBmb250LXNpemU6IDAuN3JlbSdcclxuICAgICk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDaGVja3Mgd2hldGhlciB0aGUgd2VidmlldyBzdXBwb3J0cyB0aGUge0BsaW5rIE1vdXNlRXZlbnQjYnV0dG9uc30gcHJvcGVydHkuXHJcbiAqIExvb2tpbmcgYXQgeW91IG1hY09TIEhpZ2ggU2llcnJhIVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGNhblRyYWNrQnV0dG9ucygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAobmV3IE1vdXNlRXZlbnQoJ21vdXNlZG93bicpKS5idXR0b25zID09PSAwO1xyXG59XHJcblxyXG4vKipcclxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIGJyb3dzZXIgc3VwcG9ydHMgcmVtb3ZpbmcgbGlzdGVuZXJzIGJ5IHRyaWdnZXJpbmcgYW4gQWJvcnRTaWduYWxcclxuICogKHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRXZlbnRUYXJnZXQvYWRkRXZlbnRMaXN0ZW5lciNzaWduYWwpLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGNhbkFib3J0TGlzdGVuZXJzKCkge1xyXG4gICAgaWYgKCFFdmVudFRhcmdldCB8fCAhQWJvcnRTaWduYWwgfHwgIUFib3J0Q29udHJvbGxlcilcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgbGV0IHJlc3VsdCA9IHRydWU7XHJcblxyXG4gICAgY29uc3QgdGFyZ2V0ID0gbmV3IEV2ZW50VGFyZ2V0KCk7XHJcbiAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xyXG4gICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCAoKSA9PiB7IHJlc3VsdCA9IGZhbHNlOyB9LCB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfSk7XHJcbiAgICBjb250cm9sbGVyLmFib3J0KCk7XHJcbiAgICB0YXJnZXQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ3Rlc3QnKSk7XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJlc29sdmVzIHRoZSBjbG9zZXN0IEhUTUxFbGVtZW50IGFuY2VzdG9yIG9mIGFuIGV2ZW50J3MgdGFyZ2V0LlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGV2ZW50VGFyZ2V0KGV2ZW50OiBFdmVudCk6IEhUTUxFbGVtZW50IHtcclxuICAgIGlmIChldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xyXG4gICAgICAgIHJldHVybiBldmVudC50YXJnZXQ7XHJcbiAgICB9IGVsc2UgaWYgKCEoZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpICYmIGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIE5vZGUpIHtcclxuICAgICAgICByZXR1cm4gZXZlbnQudGFyZ2V0LnBhcmVudEVsZW1lbnQgPz8gZG9jdW1lbnQuYm9keTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50LmJvZHk7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKipcclxuIFRoaXMgdGVjaG5pcXVlIGZvciBwcm9wZXIgbG9hZCBkZXRlY3Rpb24gaXMgdGFrZW4gZnJvbSBIVE1YOlxyXG5cclxuIEJTRCAyLUNsYXVzZSBMaWNlbnNlXHJcblxyXG4gQ29weXJpZ2h0IChjKSAyMDIwLCBCaWcgU2t5IFNvZnR3YXJlXHJcbiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG5cclxuIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxyXG4gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XHJcblxyXG4gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXHJcbiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cclxuXHJcbiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXHJcbiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uXHJcbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cclxuXHJcbiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxyXG4gQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxyXG4gSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXHJcbiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFXHJcbiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTFxyXG4gREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1JcclxuIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSXHJcbiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLFxyXG4gT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0VcclxuIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXHJcblxyXG4gKioqL1xyXG5cclxubGV0IGlzUmVhZHkgPSBmYWxzZTtcclxuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsICgpID0+IHsgaXNSZWFkeSA9IHRydWUgfSk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gd2hlblJlYWR5KGNhbGxiYWNrOiAoKSA9PiB2b2lkKSB7XHJcbiAgICBpZiAoaXNSZWFkeSB8fCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnKSB7XHJcbiAgICAgICAgY2FsbGJhY2soKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGNhbGxiYWNrKTtcclxuICAgIH1cclxufVxyXG4iLCAiLypcclxuIF9cdCAgIF9fXHQgIF8gX19cclxufCB8XHQgLyAvX19fIF8oXykgL19fX19cclxufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xyXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcclxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXHJcblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cclxuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxyXG4qL1xyXG5cclxuaW1wb3J0IHtuZXdSdW50aW1lQ2FsbGVyLCBvYmplY3ROYW1lc30gZnJvbSBcIi4vcnVudGltZS5qc1wiO1xyXG5pbXBvcnQgdHlwZSB7IFNjcmVlbiB9IGZyb20gXCIuL3NjcmVlbnMuanNcIjtcclxuXHJcbmNvbnN0IFBvc2l0aW9uTWV0aG9kICAgICAgICAgICAgICAgICAgICA9IDA7XHJcbmNvbnN0IENlbnRlck1ldGhvZCAgICAgICAgICAgICAgICAgICAgICA9IDE7XHJcbmNvbnN0IENsb3NlTWV0aG9kICAgICAgICAgICAgICAgICAgICAgICA9IDI7XHJcbmNvbnN0IERpc2FibGVTaXplQ29uc3RyYWludHNNZXRob2QgICAgICA9IDM7XHJcbmNvbnN0IEVuYWJsZVNpemVDb25zdHJhaW50c01ldGhvZCAgICAgICA9IDQ7XHJcbmNvbnN0IEZvY3VzTWV0aG9kICAgICAgICAgICAgICAgICAgICAgICA9IDU7XHJcbmNvbnN0IEZvcmNlUmVsb2FkTWV0aG9kICAgICAgICAgICAgICAgICA9IDY7XHJcbmNvbnN0IEZ1bGxzY3JlZW5NZXRob2QgICAgICAgICAgICAgICAgICA9IDc7XHJcbmNvbnN0IEdldFNjcmVlbk1ldGhvZCAgICAgICAgICAgICAgICAgICA9IDg7XHJcbmNvbnN0IEdldFpvb21NZXRob2QgICAgICAgICAgICAgICAgICAgICA9IDk7XHJcbmNvbnN0IEhlaWdodE1ldGhvZCAgICAgICAgICAgICAgICAgICAgICA9IDEwO1xyXG5jb25zdCBIaWRlTWV0aG9kICAgICAgICAgICAgICAgICAgICAgICAgPSAxMTtcclxuY29uc3QgSXNGb2N1c2VkTWV0aG9kICAgICAgICAgICAgICAgICAgID0gMTI7XHJcbmNvbnN0IElzRnVsbHNjcmVlbk1ldGhvZCAgICAgICAgICAgICAgICA9IDEzO1xyXG5jb25zdCBJc01heGltaXNlZE1ldGhvZCAgICAgICAgICAgICAgICAgPSAxNDtcclxuY29uc3QgSXNNaW5pbWlzZWRNZXRob2QgICAgICAgICAgICAgICAgID0gMTU7XHJcbmNvbnN0IE1heGltaXNlTWV0aG9kICAgICAgICAgICAgICAgICAgICA9IDE2O1xyXG5jb25zdCBNaW5pbWlzZU1ldGhvZCAgICAgICAgICAgICAgICAgICAgPSAxNztcclxuY29uc3QgTmFtZU1ldGhvZCAgICAgICAgICAgICAgICAgICAgICAgID0gMTg7XHJcbmNvbnN0IE9wZW5EZXZUb29sc01ldGhvZCAgICAgICAgICAgICAgICA9IDE5O1xyXG5jb25zdCBSZWxhdGl2ZVBvc2l0aW9uTWV0aG9kICAgICAgICAgICAgPSAyMDtcclxuY29uc3QgUmVsb2FkTWV0aG9kICAgICAgICAgICAgICAgICAgICAgID0gMjE7XHJcbmNvbnN0IFJlc2l6YWJsZU1ldGhvZCAgICAgICAgICAgICAgICAgICA9IDIyO1xyXG5jb25zdCBSZXN0b3JlTWV0aG9kICAgICAgICAgICAgICAgICAgICAgPSAyMztcclxuY29uc3QgU2V0UG9zaXRpb25NZXRob2QgICAgICAgICAgICAgICAgID0gMjQ7XHJcbmNvbnN0IFNldEFsd2F5c09uVG9wTWV0aG9kICAgICAgICAgICAgICA9IDI1O1xyXG5jb25zdCBTZXRCYWNrZ3JvdW5kQ29sb3VyTWV0aG9kICAgICAgICAgPSAyNjtcclxuY29uc3QgU2V0RnJhbWVsZXNzTWV0aG9kICAgICAgICAgICAgICAgID0gMjc7XHJcbmNvbnN0IFNldEZ1bGxzY3JlZW5CdXR0b25FbmFibGVkTWV0aG9kICA9IDI4O1xyXG5jb25zdCBTZXRNYXhTaXplTWV0aG9kICAgICAgICAgICAgICAgICAgPSAyOTtcclxuY29uc3QgU2V0TWluU2l6ZU1ldGhvZCAgICAgICAgICAgICAgICAgID0gMzA7XHJcbmNvbnN0IFNldFJlbGF0aXZlUG9zaXRpb25NZXRob2QgICAgICAgICA9IDMxO1xyXG5jb25zdCBTZXRSZXNpemFibGVNZXRob2QgICAgICAgICAgICAgICAgPSAzMjtcclxuY29uc3QgU2V0U2l6ZU1ldGhvZCAgICAgICAgICAgICAgICAgICAgID0gMzM7XHJcbmNvbnN0IFNldFRpdGxlTWV0aG9kICAgICAgICAgICAgICAgICAgICA9IDM0O1xyXG5jb25zdCBTZXRab29tTWV0aG9kICAgICAgICAgICAgICAgICAgICAgPSAzNTtcclxuY29uc3QgU2hvd01ldGhvZCAgICAgICAgICAgICAgICAgICAgICAgID0gMzY7XHJcbmNvbnN0IFNpemVNZXRob2QgICAgICAgICAgICAgICAgICAgICAgICA9IDM3O1xyXG5jb25zdCBUb2dnbGVGdWxsc2NyZWVuTWV0aG9kICAgICAgICAgICAgPSAzODtcclxuY29uc3QgVG9nZ2xlTWF4aW1pc2VNZXRob2QgICAgICAgICAgICAgID0gMzk7XHJcbmNvbnN0IFVuRnVsbHNjcmVlbk1ldGhvZCAgICAgICAgICAgICAgICA9IDQwO1xyXG5jb25zdCBVbk1heGltaXNlTWV0aG9kICAgICAgICAgICAgICAgICAgPSA0MTtcclxuY29uc3QgVW5NaW5pbWlzZU1ldGhvZCAgICAgICAgICAgICAgICAgID0gNDI7XHJcbmNvbnN0IFdpZHRoTWV0aG9kICAgICAgICAgICAgICAgICAgICAgICA9IDQzO1xyXG5jb25zdCBab29tTWV0aG9kICAgICAgICAgICAgICAgICAgICAgICAgPSA0NDtcclxuY29uc3QgWm9vbUluTWV0aG9kICAgICAgICAgICAgICAgICAgICAgID0gNDU7XHJcbmNvbnN0IFpvb21PdXRNZXRob2QgICAgICAgICAgICAgICAgICAgICA9IDQ2O1xyXG5jb25zdCBab29tUmVzZXRNZXRob2QgICAgICAgICAgICAgICAgICAgPSA0NztcclxuXHJcbi8qKlxyXG4gKiBBIHJlY29yZCBkZXNjcmliaW5nIHRoZSBwb3NpdGlvbiBvZiBhIHdpbmRvdy5cclxuICovXHJcbmludGVyZmFjZSBQb3NpdGlvbiB7XHJcbiAgICAvKiogVGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy4gKi9cclxuICAgIHg6IG51bWJlcjtcclxuICAgIC8qKiBUaGUgdmVydGljYWwgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy4gKi9cclxuICAgIHk6IG51bWJlcjtcclxufVxyXG5cclxuLyoqXHJcbiAqIEEgcmVjb3JkIGRlc2NyaWJpbmcgdGhlIHNpemUgb2YgYSB3aW5kb3cuXHJcbiAqL1xyXG5pbnRlcmZhY2UgU2l6ZSB7XHJcbiAgICAvKiogVGhlIHdpZHRoIG9mIHRoZSB3aW5kb3cuICovXHJcbiAgICB3aWR0aDogbnVtYmVyO1xyXG4gICAgLyoqIFRoZSBoZWlnaHQgb2YgdGhlIHdpbmRvdy4gKi9cclxuICAgIGhlaWdodDogbnVtYmVyO1xyXG59XHJcblxyXG4vLyBQcml2YXRlIGZpZWxkIG5hbWVzLlxyXG5jb25zdCBjYWxsZXJTeW0gPSBTeW1ib2woXCJjYWxsZXJcIik7XHJcblxyXG5jbGFzcyBXaW5kb3cge1xyXG4gICAgLy8gUHJpdmF0ZSBmaWVsZHMuXHJcbiAgICBwcml2YXRlIFtjYWxsZXJTeW1dOiAobWVzc2FnZTogbnVtYmVyLCBhcmdzPzogYW55KSA9PiBQcm9taXNlPGFueT47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbml0aWFsaXNlcyBhIHdpbmRvdyBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuXHJcbiAgICAgKlxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhcmdldCB3aW5kb3cuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZyA9ICcnKSB7XHJcbiAgICAgICAgdGhpc1tjYWxsZXJTeW1dID0gbmV3UnVudGltZUNhbGxlcihvYmplY3ROYW1lcy5XaW5kb3csIG5hbWUpXHJcblxyXG4gICAgICAgIC8vIGJpbmQgaW5zdGFuY2UgbWV0aG9kIHRvIG1ha2UgdGhlbSBlYXNpbHkgdXNhYmxlIGluIGV2ZW50IGhhbmRsZXJzXHJcbiAgICAgICAgZm9yIChjb25zdCBtZXRob2Qgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoV2luZG93LnByb3RvdHlwZSkpIHtcclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgbWV0aG9kICE9PSBcImNvbnN0cnVjdG9yXCJcclxuICAgICAgICAgICAgICAgICYmIHR5cGVvZiAodGhpcyBhcyBhbnkpW21ldGhvZF0gPT09IFwiZnVuY3Rpb25cIlxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICh0aGlzIGFzIGFueSlbbWV0aG9kXSA9ICh0aGlzIGFzIGFueSlbbWV0aG9kXS5iaW5kKHRoaXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgc3BlY2lmaWVkIHdpbmRvdy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB3aW5kb3cgdG8gZ2V0LlxyXG4gICAgICogQHJldHVybnMgVGhlIGNvcnJlc3BvbmRpbmcgd2luZG93IG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgR2V0KG5hbWU6IHN0cmluZyk6IFdpbmRvdyB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBXaW5kb3cobmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBhYnNvbHV0ZSBwb3NpdGlvbiBvZiB0aGUgd2luZG93LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IGFic29sdXRlIHBvc2l0aW9uIG9mIHRoZSB3aW5kb3cuXHJcbiAgICAgKi9cclxuICAgIFBvc2l0aW9uKCk6IFByb21pc2U8UG9zaXRpb24+IHtcclxuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFBvc2l0aW9uTWV0aG9kKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENlbnRlcnMgdGhlIHdpbmRvdyBvbiB0aGUgc2NyZWVuLlxyXG4gICAgICovXHJcbiAgICBDZW50ZXIoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShDZW50ZXJNZXRob2QpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2xvc2VzIHRoZSB3aW5kb3cuXHJcbiAgICAgKi9cclxuICAgIENsb3NlKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oQ2xvc2VNZXRob2QpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGlzYWJsZXMgbWluL21heCBzaXplIGNvbnN0cmFpbnRzLlxyXG4gICAgICovXHJcbiAgICBEaXNhYmxlU2l6ZUNvbnN0cmFpbnRzKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oRGlzYWJsZVNpemVDb25zdHJhaW50c01ldGhvZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFbmFibGVzIG1pbi9tYXggc2l6ZSBjb25zdHJhaW50cy5cclxuICAgICAqL1xyXG4gICAgRW5hYmxlU2l6ZUNvbnN0cmFpbnRzKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oRW5hYmxlU2l6ZUNvbnN0cmFpbnRzTWV0aG9kKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZvY3VzZXMgdGhlIHdpbmRvdy5cclxuICAgICAqL1xyXG4gICAgRm9jdXMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShGb2N1c01ldGhvZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGb3JjZXMgdGhlIHdpbmRvdyB0byByZWxvYWQgdGhlIHBhZ2UgYXNzZXRzLlxyXG4gICAgICovXHJcbiAgICBGb3JjZVJlbG9hZCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEZvcmNlUmVsb2FkTWV0aG9kKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFN3aXRjaGVzIHRoZSB3aW5kb3cgdG8gZnVsbHNjcmVlbiBtb2RlLlxyXG4gICAgICovXHJcbiAgICBGdWxsc2NyZWVuKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oRnVsbHNjcmVlbk1ldGhvZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBzY3JlZW4gdGhhdCB0aGUgd2luZG93IGlzIG9uLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIFRoZSBzY3JlZW4gdGhlIHdpbmRvdyBpcyBjdXJyZW50bHkgb24uXHJcbiAgICAgKi9cclxuICAgIEdldFNjcmVlbigpOiBQcm9taXNlPFNjcmVlbj4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oR2V0U2NyZWVuTWV0aG9kKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgem9vbSBsZXZlbCBvZiB0aGUgd2luZG93LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IHpvb20gbGV2ZWwuXHJcbiAgICAgKi9cclxuICAgIEdldFpvb20oKTogUHJvbWlzZTxudW1iZXI+IHtcclxuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKEdldFpvb21NZXRob2QpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgaGVpZ2h0IG9mIHRoZSB3aW5kb3cuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgVGhlIGN1cnJlbnQgaGVpZ2h0IG9mIHRoZSB3aW5kb3cuXHJcbiAgICAgKi9cclxuICAgIEhlaWdodCgpOiBQcm9taXNlPG51bWJlcj4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oSGVpZ2h0TWV0aG9kKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEhpZGVzIHRoZSB3aW5kb3cuXHJcbiAgICAgKi9cclxuICAgIEhpZGUoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShIaWRlTWV0aG9kKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgd2luZG93IGlzIGZvY3VzZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgV2hldGhlciB0aGUgd2luZG93IGlzIGN1cnJlbnRseSBmb2N1c2VkLlxyXG4gICAgICovXHJcbiAgICBJc0ZvY3VzZWQoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShJc0ZvY3VzZWRNZXRob2QpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB3aW5kb3cgaXMgZnVsbHNjcmVlbi5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSB3aW5kb3cgaXMgY3VycmVudGx5IGZ1bGxzY3JlZW4uXHJcbiAgICAgKi9cclxuICAgIElzRnVsbHNjcmVlbigpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKElzRnVsbHNjcmVlbk1ldGhvZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHdpbmRvdyBpcyBtYXhpbWlzZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgV2hldGhlciB0aGUgd2luZG93IGlzIGN1cnJlbnRseSBtYXhpbWlzZWQuXHJcbiAgICAgKi9cclxuICAgIElzTWF4aW1pc2VkKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oSXNNYXhpbWlzZWRNZXRob2QpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB3aW5kb3cgaXMgbWluaW1pc2VkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIHdpbmRvdyBpcyBjdXJyZW50bHkgbWluaW1pc2VkLlxyXG4gICAgICovXHJcbiAgICBJc01pbmltaXNlZCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKElzTWluaW1pc2VkTWV0aG9kKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1heGltaXNlcyB0aGUgd2luZG93LlxyXG4gICAgICovXHJcbiAgICBNYXhpbWlzZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKE1heGltaXNlTWV0aG9kKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1pbmltaXNlcyB0aGUgd2luZG93LlxyXG4gICAgICovXHJcbiAgICBNaW5pbWlzZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKE1pbmltaXNlTWV0aG9kKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHdpbmRvdy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgbmFtZSBvZiB0aGUgd2luZG93LlxyXG4gICAgICovXHJcbiAgICBOYW1lKCk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShOYW1lTWV0aG9kKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9wZW5zIHRoZSBkZXZlbG9wbWVudCB0b29scyBwYW5lLlxyXG4gICAgICovXHJcbiAgICBPcGVuRGV2VG9vbHMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShPcGVuRGV2VG9vbHNNZXRob2QpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgcmVsYXRpdmUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdyB0byB0aGUgc2NyZWVuLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IHJlbGF0aXZlIHBvc2l0aW9uIG9mIHRoZSB3aW5kb3cuXHJcbiAgICAgKi9cclxuICAgIFJlbGF0aXZlUG9zaXRpb24oKTogUHJvbWlzZTxQb3NpdGlvbj4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oUmVsYXRpdmVQb3NpdGlvbk1ldGhvZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWxvYWRzIHRoZSBwYWdlIGFzc2V0cy5cclxuICAgICAqL1xyXG4gICAgUmVsb2FkKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oUmVsb2FkTWV0aG9kKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgd2luZG93IGlzIHJlc2l6YWJsZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSB3aW5kb3cgaXMgY3VycmVudGx5IHJlc2l6YWJsZS5cclxuICAgICAqL1xyXG4gICAgUmVzaXphYmxlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oUmVzaXphYmxlTWV0aG9kKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc3RvcmVzIHRoZSB3aW5kb3cgdG8gaXRzIHByZXZpb3VzIHN0YXRlIGlmIGl0IHdhcyBwcmV2aW91c2x5IG1pbmltaXNlZCwgbWF4aW1pc2VkIG9yIGZ1bGxzY3JlZW4uXHJcbiAgICAgKi9cclxuICAgIFJlc3RvcmUoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShSZXN0b3JlTWV0aG9kKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGFic29sdXRlIHBvc2l0aW9uIG9mIHRoZSB3aW5kb3cuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHggLSBUaGUgZGVzaXJlZCBob3Jpem9udGFsIGFic29sdXRlIHBvc2l0aW9uIG9mIHRoZSB3aW5kb3cuXHJcbiAgICAgKiBAcGFyYW0geSAtIFRoZSBkZXNpcmVkIHZlcnRpY2FsIGFic29sdXRlIHBvc2l0aW9uIG9mIHRoZSB3aW5kb3cuXHJcbiAgICAgKi9cclxuICAgIFNldFBvc2l0aW9uKHg6IG51bWJlciwgeTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShTZXRQb3NpdGlvbk1ldGhvZCwgeyB4LCB5IH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgd2luZG93IHRvIGJlIGFsd2F5cyBvbiB0b3AuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGFsd2F5c09uVG9wIC0gV2hldGhlciB0aGUgd2luZG93IHNob3VsZCBzdGF5IG9uIHRvcC5cclxuICAgICAqL1xyXG4gICAgU2V0QWx3YXlzT25Ub3AoYWx3YXlzT25Ub3A6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFNldEFsd2F5c09uVG9wTWV0aG9kLCB7IGFsd2F5c09uVG9wIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgYmFja2dyb3VuZCBjb2xvdXIgb2YgdGhlIHdpbmRvdy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gciAtIFRoZSBkZXNpcmVkIHJlZCBjb21wb25lbnQgb2YgdGhlIHdpbmRvdyBiYWNrZ3JvdW5kLlxyXG4gICAgICogQHBhcmFtIGcgLSBUaGUgZGVzaXJlZCBncmVlbiBjb21wb25lbnQgb2YgdGhlIHdpbmRvdyBiYWNrZ3JvdW5kLlxyXG4gICAgICogQHBhcmFtIGIgLSBUaGUgZGVzaXJlZCBibHVlIGNvbXBvbmVudCBvZiB0aGUgd2luZG93IGJhY2tncm91bmQuXHJcbiAgICAgKiBAcGFyYW0gYSAtIFRoZSBkZXNpcmVkIGFscGhhIGNvbXBvbmVudCBvZiB0aGUgd2luZG93IGJhY2tncm91bmQuXHJcbiAgICAgKi9cclxuICAgIFNldEJhY2tncm91bmRDb2xvdXIocjogbnVtYmVyLCBnOiBudW1iZXIsIGI6IG51bWJlciwgYTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShTZXRCYWNrZ3JvdW5kQ29sb3VyTWV0aG9kLCB7IHIsIGcsIGIsIGEgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIHRoZSB3aW5kb3cgZnJhbWUgYW5kIHRpdGxlIGJhci5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZnJhbWVsZXNzIC0gV2hldGhlciB0aGUgd2luZG93IHNob3VsZCBiZSBmcmFtZWxlc3MuXHJcbiAgICAgKi9cclxuICAgIFNldEZyYW1lbGVzcyhmcmFtZWxlc3M6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFNldEZyYW1lbGVzc01ldGhvZCwgeyBmcmFtZWxlc3MgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEaXNhYmxlcyB0aGUgc3lzdGVtIGZ1bGxzY3JlZW4gYnV0dG9uLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBlbmFibGVkIC0gV2hldGhlciB0aGUgZnVsbHNjcmVlbiBidXR0b24gc2hvdWxkIGJlIGVuYWJsZWQuXHJcbiAgICAgKi9cclxuICAgIFNldEZ1bGxzY3JlZW5CdXR0b25FbmFibGVkKGVuYWJsZWQ6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFNldEZ1bGxzY3JlZW5CdXR0b25FbmFibGVkTWV0aG9kLCB7IGVuYWJsZWQgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIHdpbmRvdy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gd2lkdGggLSBUaGUgZGVzaXJlZCBtYXhpbXVtIHdpZHRoIG9mIHRoZSB3aW5kb3cuXHJcbiAgICAgKiBAcGFyYW0gaGVpZ2h0IC0gVGhlIGRlc2lyZWQgbWF4aW11bSBoZWlnaHQgb2YgdGhlIHdpbmRvdy5cclxuICAgICAqL1xyXG4gICAgU2V0TWF4U2l6ZSh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2V0TWF4U2l6ZU1ldGhvZCwgeyB3aWR0aCwgaGVpZ2h0IH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgbWluaW11bSBzaXplIG9mIHRoZSB3aW5kb3cuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHdpZHRoIC0gVGhlIGRlc2lyZWQgbWluaW11bSB3aWR0aCBvZiB0aGUgd2luZG93LlxyXG4gICAgICogQHBhcmFtIGhlaWdodCAtIFRoZSBkZXNpcmVkIG1pbmltdW0gaGVpZ2h0IG9mIHRoZSB3aW5kb3cuXHJcbiAgICAgKi9cclxuICAgIFNldE1pblNpemUod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFNldE1pblNpemVNZXRob2QsIHsgd2lkdGgsIGhlaWdodCB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHJlbGF0aXZlIHBvc2l0aW9uIG9mIHRoZSB3aW5kb3cgdG8gdGhlIHNjcmVlbi5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geCAtIFRoZSBkZXNpcmVkIGhvcml6b250YWwgcmVsYXRpdmUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy5cclxuICAgICAqIEBwYXJhbSB5IC0gVGhlIGRlc2lyZWQgdmVydGljYWwgcmVsYXRpdmUgcG9zaXRpb24gb2YgdGhlIHdpbmRvdy5cclxuICAgICAqL1xyXG4gICAgU2V0UmVsYXRpdmVQb3NpdGlvbih4OiBudW1iZXIsIHk6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2V0UmVsYXRpdmVQb3NpdGlvbk1ldGhvZCwgeyB4LCB5IH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB3aGV0aGVyIHRoZSB3aW5kb3cgaXMgcmVzaXphYmxlLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSByZXNpemFibGUgLSBXaGV0aGVyIHRoZSB3aW5kb3cgc2hvdWxkIGJlIHJlc2l6YWJsZS5cclxuICAgICAqL1xyXG4gICAgU2V0UmVzaXphYmxlKHJlc2l6YWJsZTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oU2V0UmVzaXphYmxlTWV0aG9kLCB7IHJlc2l6YWJsZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHNpemUgb2YgdGhlIHdpbmRvdy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gd2lkdGggLSBUaGUgZGVzaXJlZCB3aWR0aCBvZiB0aGUgd2luZG93LlxyXG4gICAgICogQHBhcmFtIGhlaWdodCAtIFRoZSBkZXNpcmVkIGhlaWdodCBvZiB0aGUgd2luZG93LlxyXG4gICAgICovXHJcbiAgICBTZXRTaXplKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShTZXRTaXplTWV0aG9kLCB7IHdpZHRoLCBoZWlnaHQgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSB0aXRsZSBvZiB0aGUgd2luZG93LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB0aXRsZSAtIFRoZSBkZXNpcmVkIHRpdGxlIG9mIHRoZSB3aW5kb3cuXHJcbiAgICAgKi9cclxuICAgIFNldFRpdGxlKHRpdGxlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFNldFRpdGxlTWV0aG9kLCB7IHRpdGxlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgem9vbSBsZXZlbCBvZiB0aGUgd2luZG93LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB6b29tIC0gVGhlIGRlc2lyZWQgem9vbSBsZXZlbC5cclxuICAgICAqL1xyXG4gICAgU2V0Wm9vbSh6b29tOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFNldFpvb21NZXRob2QsIHsgem9vbSB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNob3dzIHRoZSB3aW5kb3cuXHJcbiAgICAgKi9cclxuICAgIFNob3coKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShTaG93TWV0aG9kKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIHdpbmRvdy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCBzaXplIG9mIHRoZSB3aW5kb3cuXHJcbiAgICAgKi9cclxuICAgIFNpemUoKTogUHJvbWlzZTxTaXplPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGVyU3ltXShTaXplTWV0aG9kKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRvZ2dsZXMgdGhlIHdpbmRvdyBiZXR3ZWVuIGZ1bGxzY3JlZW4gYW5kIG5vcm1hbC5cclxuICAgICAqL1xyXG4gICAgVG9nZ2xlRnVsbHNjcmVlbigpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFRvZ2dsZUZ1bGxzY3JlZW5NZXRob2QpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVG9nZ2xlcyB0aGUgd2luZG93IGJldHdlZW4gbWF4aW1pc2VkIGFuZCBub3JtYWwuXHJcbiAgICAgKi9cclxuICAgIFRvZ2dsZU1heGltaXNlKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oVG9nZ2xlTWF4aW1pc2VNZXRob2QpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVW4tZnVsbHNjcmVlbnMgdGhlIHdpbmRvdy5cclxuICAgICAqL1xyXG4gICAgVW5GdWxsc2NyZWVuKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oVW5GdWxsc2NyZWVuTWV0aG9kKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFVuLW1heGltaXNlcyB0aGUgd2luZG93LlxyXG4gICAgICovXHJcbiAgICBVbk1heGltaXNlKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oVW5NYXhpbWlzZU1ldGhvZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVbi1taW5pbWlzZXMgdGhlIHdpbmRvdy5cclxuICAgICAqL1xyXG4gICAgVW5NaW5pbWlzZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFVuTWluaW1pc2VNZXRob2QpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgd2lkdGggb2YgdGhlIHdpbmRvdy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCB3aWR0aCBvZiB0aGUgd2luZG93LlxyXG4gICAgICovXHJcbiAgICBXaWR0aCgpOiBQcm9taXNlPG51bWJlcj4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzW2NhbGxlclN5bV0oV2lkdGhNZXRob2QpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogWm9vbXMgdGhlIHdpbmRvdy5cclxuICAgICAqL1xyXG4gICAgWm9vbSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFpvb21NZXRob2QpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5jcmVhc2VzIHRoZSB6b29tIGxldmVsIG9mIHRoZSB3ZWJ2aWV3IGNvbnRlbnQuXHJcbiAgICAgKi9cclxuICAgIFpvb21JbigpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFpvb21Jbk1ldGhvZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZWNyZWFzZXMgdGhlIHpvb20gbGV2ZWwgb2YgdGhlIHdlYnZpZXcgY29udGVudC5cclxuICAgICAqL1xyXG4gICAgWm9vbU91dCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFpvb21PdXRNZXRob2QpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVzZXRzIHRoZSB6b29tIGxldmVsIG9mIHRoZSB3ZWJ2aWV3IGNvbnRlbnQuXHJcbiAgICAgKi9cclxuICAgIFpvb21SZXNldCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpc1tjYWxsZXJTeW1dKFpvb21SZXNldE1ldGhvZCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUaGUgd2luZG93IHdpdGhpbiB3aGljaCB0aGUgc2NyaXB0IGlzIHJ1bm5pbmcuXHJcbiAqL1xyXG5jb25zdCB0aGlzV2luZG93ID0gbmV3IFdpbmRvdygnJyk7XHJcblxyXG5leHBvcnQgZGVmYXVsdCB0aGlzV2luZG93O1xyXG4iLCAiLypcclxuIF9cdCAgIF9fXHQgIF8gX19cclxufCB8XHQgLyAvX19fIF8oXykgL19fX19cclxufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xyXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcclxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXHJcblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cclxuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxyXG4qL1xyXG5cclxuaW1wb3J0ICogYXMgUnVudGltZSBmcm9tIFwiLi4vQHdhaWxzaW8vcnVudGltZS9zcmNcIjtcclxuXHJcbi8vIE5PVEU6IHRoZSBmb2xsb3dpbmcgbWV0aG9kcyBNVVNUIGJlIGltcG9ydGVkIGV4cGxpY2l0bHkgYmVjYXVzZSBvZiBob3cgZXNidWlsZCBpbmplY3Rpb24gd29ya3NcclxuaW1wb3J0IHsgRW5hYmxlIGFzIEVuYWJsZVdNTCB9IGZyb20gXCIuLi9Ad2FpbHNpby9ydW50aW1lL3NyYy93bWxcIjtcclxuaW1wb3J0IHsgZGVidWdMb2cgfSBmcm9tIFwiLi4vQHdhaWxzaW8vcnVudGltZS9zcmMvdXRpbHNcIjtcclxuXHJcbndpbmRvdy53YWlscyA9IFJ1bnRpbWU7XHJcbkVuYWJsZVdNTCgpO1xyXG5cclxuaWYgKERFQlVHKSB7XHJcbiAgICBkZWJ1Z0xvZyhcIldhaWxzIFJ1bnRpbWUgTG9hZGVkXCIpXHJcbn1cclxuIiwgIi8qXHJcbiBfXHQgICBfX1x0ICBfIF9fXHJcbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXHJcbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cclxufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXHJcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xyXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXHJcbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcclxuKi9cclxuXHJcbmltcG9ydCB7IG5ld1J1bnRpbWVDYWxsZXIsIG9iamVjdE5hbWVzIH0gZnJvbSBcIi4vcnVudGltZS5qc1wiO1xyXG5cclxuY29uc3QgY2FsbCA9IG5ld1J1bnRpbWVDYWxsZXIob2JqZWN0TmFtZXMuU3lzdGVtKTtcclxuXHJcbmNvbnN0IFN5c3RlbUlzRGFya01vZGUgPSAwO1xyXG5jb25zdCBTeXN0ZW1FbnZpcm9ubWVudCA9IDE7XHJcblxyXG5jb25zdCBfaW52b2tlID0gKGZ1bmN0aW9uICgpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgaWYgKCh3aW5kb3cgYXMgYW55KS5jaHJvbWU/LndlYnZpZXc/LnBvc3RNZXNzYWdlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAod2luZG93IGFzIGFueSkuY2hyb21lLndlYnZpZXcucG9zdE1lc3NhZ2UuYmluZCgod2luZG93IGFzIGFueSkuY2hyb21lLndlYnZpZXcpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoKHdpbmRvdyBhcyBhbnkpLndlYmtpdD8ubWVzc2FnZUhhbmRsZXJzPy5bJ2V4dGVybmFsJ10/LnBvc3RNZXNzYWdlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAod2luZG93IGFzIGFueSkud2Via2l0Lm1lc3NhZ2VIYW5kbGVyc1snZXh0ZXJuYWwnXS5wb3N0TWVzc2FnZS5iaW5kKCh3aW5kb3cgYXMgYW55KS53ZWJraXQubWVzc2FnZUhhbmRsZXJzWydleHRlcm5hbCddKTtcclxuICAgICAgICB9XHJcbiAgICB9IGNhdGNoKGUpIHt9XHJcblxyXG4gICAgY29uc29sZS53YXJuKCdcXG4lY1x1MjZBMFx1RkUwRiBCcm93c2VyIEVudmlyb25tZW50IERldGVjdGVkICVjXFxuXFxuJWNPbmx5IFVJIHByZXZpZXdzIGFyZSBhdmFpbGFibGUgaW4gdGhlIGJyb3dzZXIuIEZvciBmdWxsIGZ1bmN0aW9uYWxpdHksIHBsZWFzZSBydW4gdGhlIGFwcGxpY2F0aW9uIGluIGRlc2t0b3AgbW9kZS5cXG5Nb3JlIGluZm9ybWF0aW9uIGF0OiBodHRwczovL3YzLndhaWxzLmlvL2xlYXJuL2J1aWxkLyN1c2luZy1hLWJyb3dzZXItZm9yLWRldmVsb3BtZW50XFxuJyxcclxuICAgICAgICAnYmFja2dyb3VuZDogI2ZmZmZmZjsgY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyBwYWRkaW5nOiA0cHggOHB4OyBib3JkZXItcmFkaXVzOiA0cHg7IGJvcmRlcjogMnB4IHNvbGlkICMwMDAwMDA7JyxcclxuICAgICAgICAnYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7JyxcclxuICAgICAgICAnY29sb3I6ICNmZmZmZmY7IGZvbnQtc3R5bGU6IGl0YWxpYzsgZm9udC13ZWlnaHQ6IGJvbGQ7Jyk7XHJcbiAgICByZXR1cm4gbnVsbDtcclxufSkoKTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpbnZva2UobXNnOiBhbnkpOiB2b2lkIHtcclxuICAgIF9pbnZva2U/Lihtc2cpO1xyXG59XHJcblxyXG4vKipcclxuICogUmV0cmlldmVzIHRoZSBzeXN0ZW0gZGFyayBtb2RlIHN0YXR1cy5cclxuICpcclxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYSBib29sZWFuIHZhbHVlIGluZGljYXRpbmcgaWYgdGhlIHN5c3RlbSBpcyBpbiBkYXJrIG1vZGUuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gSXNEYXJrTW9kZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiBjYWxsKFN5c3RlbUlzRGFya01vZGUpO1xyXG59XHJcblxyXG4vKipcclxuICogRmV0Y2hlcyB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZSBhcHBsaWNhdGlvbiBmcm9tIHRoZSBzZXJ2ZXIuXHJcbiAqXHJcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBjYXBhYmlsaXRpZXMuXHJcbiAqL1xyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gQ2FwYWJpbGl0aWVzKCk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xyXG4gICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXCIvd2FpbHMvY2FwYWJpbGl0aWVzXCIpO1xyXG4gICAgaWYgKHJlc3BvbnNlLm9rKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY291bGQgbm90IGZldGNoIGNhcGFiaWxpdGllczogXCIgKyByZXNwb25zZS5zdGF0dXNUZXh0KTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBPU0luZm8ge1xyXG4gICAgLyoqIFRoZSBicmFuZGluZyBvZiB0aGUgT1MuICovXHJcbiAgICBCcmFuZGluZzogc3RyaW5nO1xyXG4gICAgLyoqIFRoZSBJRCBvZiB0aGUgT1MuICovXHJcbiAgICBJRDogc3RyaW5nO1xyXG4gICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBPUy4gKi9cclxuICAgIE5hbWU6IHN0cmluZztcclxuICAgIC8qKiBUaGUgdmVyc2lvbiBvZiB0aGUgT1MuICovXHJcbiAgICBWZXJzaW9uOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRW52aXJvbm1lbnRJbmZvIHtcclxuICAgIC8qKiBUaGUgYXJjaGl0ZWN0dXJlIG9mIHRoZSBzeXN0ZW0uICovXHJcbiAgICBBcmNoOiBzdHJpbmc7XHJcbiAgICAvKiogVHJ1ZSBpZiB0aGUgYXBwbGljYXRpb24gaXMgcnVubmluZyBpbiBkZWJ1ZyBtb2RlLCBvdGhlcndpc2UgZmFsc2UuICovXHJcbiAgICBEZWJ1ZzogYm9vbGVhbjtcclxuICAgIC8qKiBUaGUgb3BlcmF0aW5nIHN5c3RlbSBpbiB1c2UuICovXHJcbiAgICBPUzogc3RyaW5nO1xyXG4gICAgLyoqIERldGFpbHMgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0uICovXHJcbiAgICBPU0luZm86IE9TSW5mbztcclxuICAgIC8qKiBBZGRpdGlvbmFsIHBsYXRmb3JtIGluZm9ybWF0aW9uLiAqL1xyXG4gICAgUGxhdGZvcm1JbmZvOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xyXG59XHJcblxyXG4vKipcclxuICogUmV0cmlldmVzIGVudmlyb25tZW50IGRldGFpbHMuXHJcbiAqXHJcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIG9iamVjdCBjb250YWluaW5nIE9TIGFuZCBzeXN0ZW0gYXJjaGl0ZWN0dXJlLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIEVudmlyb25tZW50KCk6IFByb21pc2U8RW52aXJvbm1lbnRJbmZvPiB7XHJcbiAgICByZXR1cm4gY2FsbChTeXN0ZW1FbnZpcm9ubWVudCk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDaGVja3MgaWYgdGhlIGN1cnJlbnQgb3BlcmF0aW5nIHN5c3RlbSBpcyBXaW5kb3dzLlxyXG4gKlxyXG4gKiBAcmV0dXJuIFRydWUgaWYgdGhlIG9wZXJhdGluZyBzeXN0ZW0gaXMgV2luZG93cywgb3RoZXJ3aXNlIGZhbHNlLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIElzV2luZG93cygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB3aW5kb3cuX3dhaWxzLmVudmlyb25tZW50Lk9TID09PSBcIndpbmRvd3NcIjtcclxufVxyXG5cclxuLyoqXHJcbiAqIENoZWNrcyBpZiB0aGUgY3VycmVudCBvcGVyYXRpbmcgc3lzdGVtIGlzIExpbnV4LlxyXG4gKlxyXG4gKiBAcmV0dXJucyBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgb3BlcmF0aW5nIHN5c3RlbSBpcyBMaW51eCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIElzTGludXgoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gd2luZG93Ll93YWlscy5lbnZpcm9ubWVudC5PUyA9PT0gXCJsaW51eFwiO1xyXG59XHJcblxyXG4vKipcclxuICogQ2hlY2tzIGlmIHRoZSBjdXJyZW50IGVudmlyb25tZW50IGlzIGEgbWFjT1Mgb3BlcmF0aW5nIHN5c3RlbS5cclxuICpcclxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgZW52aXJvbm1lbnQgaXMgbWFjT1MsIGZhbHNlIG90aGVyd2lzZS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBJc01hYygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB3aW5kb3cuX3dhaWxzLmVudmlyb25tZW50Lk9TID09PSBcImRhcndpblwiO1xyXG59XHJcblxyXG4vKipcclxuICogQ2hlY2tzIGlmIHRoZSBjdXJyZW50IGVudmlyb25tZW50IGFyY2hpdGVjdHVyZSBpcyBBTUQ2NC5cclxuICpcclxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgY3VycmVudCBlbnZpcm9ubWVudCBhcmNoaXRlY3R1cmUgaXMgQU1ENjQsIGZhbHNlIG90aGVyd2lzZS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBJc0FNRDY0KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHdpbmRvdy5fd2FpbHMuZW52aXJvbm1lbnQuQXJjaCA9PT0gXCJhbWQ2NFwiO1xyXG59XHJcblxyXG4vKipcclxuICogQ2hlY2tzIGlmIHRoZSBjdXJyZW50IGFyY2hpdGVjdHVyZSBpcyBBUk0uXHJcbiAqXHJcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGN1cnJlbnQgYXJjaGl0ZWN0dXJlIGlzIEFSTSwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIElzQVJNKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHdpbmRvdy5fd2FpbHMuZW52aXJvbm1lbnQuQXJjaCA9PT0gXCJhcm1cIjtcclxufVxyXG5cclxuLyoqXHJcbiAqIENoZWNrcyBpZiB0aGUgY3VycmVudCBlbnZpcm9ubWVudCBpcyBBUk02NCBhcmNoaXRlY3R1cmUuXHJcbiAqXHJcbiAqIEByZXR1cm5zIFJldHVybnMgdHJ1ZSBpZiB0aGUgZW52aXJvbm1lbnQgaXMgQVJNNjQgYXJjaGl0ZWN0dXJlLCBvdGhlcndpc2UgcmV0dXJucyBmYWxzZS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBJc0FSTTY0KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHdpbmRvdy5fd2FpbHMuZW52aXJvbm1lbnQuQXJjaCA9PT0gXCJhcm02NFwiO1xyXG59XHJcblxyXG4vKipcclxuICogUmVwb3J0cyB3aGV0aGVyIHRoZSBhcHAgaXMgYmVpbmcgcnVuIGluIGRlYnVnIG1vZGUuXHJcbiAqXHJcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGFwcCBpcyBiZWluZyBydW4gaW4gZGVidWcgbW9kZS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBJc0RlYnVnKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIEJvb2xlYW4od2luZG93Ll93YWlscy5lbnZpcm9ubWVudC5EZWJ1Zyk7XHJcbn1cclxuXHJcbiIsICIvKlxyXG4gX1x0ICAgX19cdCAgXyBfX1xyXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xyXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXHJcbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxyXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cclxuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xyXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XHJcbiovXHJcblxyXG5pbXBvcnQgeyBuZXdSdW50aW1lQ2FsbGVyLCBvYmplY3ROYW1lcyB9IGZyb20gXCIuL3J1bnRpbWUuanNcIjtcclxuaW1wb3J0IHsgSXNEZWJ1ZyB9IGZyb20gXCIuL3N5c3RlbS5qc1wiO1xyXG5pbXBvcnQgeyBldmVudFRhcmdldCB9IGZyb20gXCIuL3V0aWxzXCI7XHJcblxyXG4vLyBzZXR1cFxyXG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCBjb250ZXh0TWVudUhhbmRsZXIpO1xyXG5cclxuY29uc3QgY2FsbCA9IG5ld1J1bnRpbWVDYWxsZXIob2JqZWN0TmFtZXMuQ29udGV4dE1lbnUpO1xyXG5cclxuY29uc3QgQ29udGV4dE1lbnVPcGVuID0gMDtcclxuXHJcbmZ1bmN0aW9uIG9wZW5Db250ZXh0TWVudShpZDogc3RyaW5nLCB4OiBudW1iZXIsIHk6IG51bWJlciwgZGF0YTogYW55KTogdm9pZCB7XHJcbiAgICB2b2lkIGNhbGwoQ29udGV4dE1lbnVPcGVuLCB7aWQsIHgsIHksIGRhdGF9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gY29udGV4dE1lbnVIYW5kbGVyKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudFRhcmdldChldmVudCk7XHJcblxyXG4gICAgLy8gQ2hlY2sgZm9yIGN1c3RvbSBjb250ZXh0IG1lbnVcclxuICAgIGNvbnN0IGN1c3RvbUNvbnRleHRNZW51ID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUodGFyZ2V0KS5nZXRQcm9wZXJ0eVZhbHVlKFwiLS1jdXN0b20tY29udGV4dG1lbnVcIikudHJpbSgpO1xyXG5cclxuICAgIGlmIChjdXN0b21Db250ZXh0TWVudSkge1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgY29uc3QgZGF0YSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRhcmdldCkuZ2V0UHJvcGVydHlWYWx1ZShcIi0tY3VzdG9tLWNvbnRleHRtZW51LWRhdGFcIik7XHJcbiAgICAgICAgb3BlbkNvbnRleHRNZW51KGN1c3RvbUNvbnRleHRNZW51LCBldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZLCBkYXRhKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcHJvY2Vzc0RlZmF1bHRDb250ZXh0TWVudShldmVudCwgdGFyZ2V0KTtcclxuICAgIH1cclxufVxyXG5cclxuXHJcbi8qXHJcbi0tZGVmYXVsdC1jb250ZXh0bWVudTogYXV0bzsgKGRlZmF1bHQpIHdpbGwgc2hvdyB0aGUgZGVmYXVsdCBjb250ZXh0IG1lbnUgaWYgY29udGVudEVkaXRhYmxlIGlzIHRydWUgT1IgdGV4dCBoYXMgYmVlbiBzZWxlY3RlZCBPUiBlbGVtZW50IGlzIGlucHV0IG9yIHRleHRhcmVhXHJcbi0tZGVmYXVsdC1jb250ZXh0bWVudTogc2hvdzsgd2lsbCBhbHdheXMgc2hvdyB0aGUgZGVmYXVsdCBjb250ZXh0IG1lbnVcclxuLS1kZWZhdWx0LWNvbnRleHRtZW51OiBoaWRlOyB3aWxsIGFsd2F5cyBoaWRlIHRoZSBkZWZhdWx0IGNvbnRleHQgbWVudVxyXG5cclxuVGhpcyBydWxlIGlzIGluaGVyaXRlZCBsaWtlIG5vcm1hbCBDU1MgcnVsZXMsIHNvIG5lc3Rpbmcgd29ya3MgYXMgZXhwZWN0ZWRcclxuKi9cclxuZnVuY3Rpb24gcHJvY2Vzc0RlZmF1bHRDb250ZXh0TWVudShldmVudDogTW91c2VFdmVudCwgdGFyZ2V0OiBIVE1MRWxlbWVudCkge1xyXG4gICAgLy8gRGVidWcgYnVpbGRzIGFsd2F5cyBzaG93IHRoZSBtZW51XHJcbiAgICBpZiAoSXNEZWJ1ZygpKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFByb2Nlc3MgZGVmYXVsdCBjb250ZXh0IG1lbnVcclxuICAgIHN3aXRjaCAod2luZG93LmdldENvbXB1dGVkU3R5bGUodGFyZ2V0KS5nZXRQcm9wZXJ0eVZhbHVlKFwiLS1kZWZhdWx0LWNvbnRleHRtZW51XCIpLnRyaW0oKSkge1xyXG4gICAgICAgIGNhc2UgJ3Nob3cnOlxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY2FzZSAnaGlkZSc6XHJcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDaGVjayBpZiBjb250ZW50RWRpdGFibGUgaXMgdHJ1ZVxyXG4gICAgaWYgKHRhcmdldC5pc0NvbnRlbnRFZGl0YWJsZSkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDaGVjayBpZiB0ZXh0IGhhcyBiZWVuIHNlbGVjdGVkXHJcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICBjb25zdCBoYXNTZWxlY3Rpb24gPSBzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLnRvU3RyaW5nKCkubGVuZ3RoID4gMDtcclxuICAgIGlmIChoYXNTZWxlY3Rpb24pIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlbGVjdGlvbi5yYW5nZUNvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdChpKTtcclxuICAgICAgICAgICAgY29uc3QgcmVjdHMgPSByYW5nZS5nZXRDbGllbnRSZWN0cygpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJlY3RzLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZWN0ID0gcmVjdHNbal07XHJcbiAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludChyZWN0LmxlZnQsIHJlY3QudG9wKSA9PT0gdGFyZ2V0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIENoZWNrIGlmIHRhZyBpcyBpbnB1dCBvciB0ZXh0YXJlYS5cclxuICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50IHx8IHRhcmdldCBpbnN0YW5jZW9mIEhUTUxUZXh0QXJlYUVsZW1lbnQpIHtcclxuICAgICAgICBpZiAoaGFzU2VsZWN0aW9uIHx8ICghdGFyZ2V0LnJlYWRPbmx5ICYmICF0YXJnZXQuZGlzYWJsZWQpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gaGlkZSBkZWZhdWx0IGNvbnRleHQgbWVudVxyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxufVxyXG4iLCAiLypcclxuIF9cdCAgIF9fXHQgIF8gX19cclxufCB8XHQgLyAvX19fIF8oXykgL19fX19cclxufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xyXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcclxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXHJcblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cclxuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxyXG4qL1xyXG5cclxuLyoqXHJcbiAqIFJldHJpZXZlcyB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IGZyb20gdGhlIGZsYWcgbWFwLlxyXG4gKlxyXG4gKiBAcGFyYW0ga2V5IC0gVGhlIGtleSB0byByZXRyaWV2ZSB0aGUgdmFsdWUgZm9yLlxyXG4gKiBAcmV0dXJuIFRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBrZXkuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gR2V0RmxhZyhrZXk6IHN0cmluZyk6IGFueSB7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHJldHVybiB3aW5kb3cuX3dhaWxzLmZsYWdzW2tleV07XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5hYmxlIHRvIHJldHJpZXZlIGZsYWcgJ1wiICsga2V5ICsgXCInOiBcIiArIGUsIHsgY2F1c2U6IGUgfSk7XHJcbiAgICB9XHJcbn1cclxuIiwgIi8qXHJcbiBfXHQgICBfX1x0ICBfIF9fXHJcbnwgfFx0IC8gL19fXyBfKF8pIC9fX19fXHJcbnwgfCAvfCAvIC8gX18gYC8gLyAvIF9fXy9cclxufCB8LyB8LyAvIC9fLyAvIC8gKF9fICApXHJcbnxfXy98X18vXFxfXyxfL18vXy9fX19fL1xyXG5UaGUgZWxlY3Ryb24gYWx0ZXJuYXRpdmUgZm9yIEdvXHJcbihjKSBMZWEgQW50aG9ueSAyMDE5LXByZXNlbnRcclxuKi9cclxuXHJcbmltcG9ydCB7IGludm9rZSwgSXNXaW5kb3dzIH0gZnJvbSBcIi4vc3lzdGVtLmpzXCI7XHJcbmltcG9ydCB7IEdldEZsYWcgfSBmcm9tIFwiLi9mbGFncy5qc1wiO1xyXG5pbXBvcnQgeyBjYW5UcmFja0J1dHRvbnMsIGV2ZW50VGFyZ2V0IH0gZnJvbSBcIi4vdXRpbHMuanNcIjtcclxuXHJcbi8vIFNldHVwXHJcbmxldCBjYW5EcmFnID0gZmFsc2U7XHJcbmxldCBkcmFnZ2luZyA9IGZhbHNlO1xyXG5cclxubGV0IHJlc2l6YWJsZSA9IGZhbHNlO1xyXG5sZXQgY2FuUmVzaXplID0gZmFsc2U7XHJcbmxldCByZXNpemluZyA9IGZhbHNlO1xyXG5sZXQgcmVzaXplRWRnZTogc3RyaW5nID0gXCJcIjtcclxubGV0IGRlZmF1bHRDdXJzb3IgPSBcImF1dG9cIjtcclxuXHJcbmxldCBidXR0b25zID0gMDtcclxuY29uc3QgYnV0dG9uc1RyYWNrZWQgPSBjYW5UcmFja0J1dHRvbnMoKTtcclxuXHJcbndpbmRvdy5fd2FpbHMgPSB3aW5kb3cuX3dhaWxzIHx8IHt9O1xyXG53aW5kb3cuX3dhaWxzLnNldFJlc2l6YWJsZSA9ICh2YWx1ZTogYm9vbGVhbik6IHZvaWQgPT4ge1xyXG4gICAgcmVzaXphYmxlID0gdmFsdWU7XHJcbiAgICBpZiAoIXJlc2l6YWJsZSkge1xyXG4gICAgICAgIC8vIFN0b3AgcmVzaXppbmcgaWYgaW4gcHJvZ3Jlc3MuXHJcbiAgICAgICAgY2FuUmVzaXplID0gcmVzaXppbmcgPSBmYWxzZTtcclxuICAgICAgICBzZXRSZXNpemUoKTtcclxuICAgIH1cclxufTtcclxuXHJcbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB1cGRhdGUsIHsgY2FwdHVyZTogdHJ1ZSB9KTtcclxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHVwZGF0ZSwgeyBjYXB0dXJlOiB0cnVlIH0pO1xyXG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHVwZGF0ZSwgeyBjYXB0dXJlOiB0cnVlIH0pO1xyXG5mb3IgKGNvbnN0IGV2IG9mIFsnY2xpY2snLCAnY29udGV4dG1lbnUnLCAnZGJsY2xpY2snXSkge1xyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoZXYsIHN1cHByZXNzRXZlbnQsIHsgY2FwdHVyZTogdHJ1ZSB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gc3VwcHJlc3NFdmVudChldmVudDogRXZlbnQpIHtcclxuICAgIC8vIFN1cHByZXNzIGNsaWNrIGV2ZW50cyB3aGlsZSByZXNpemluZyBvciBkcmFnZ2luZy5cclxuICAgIGlmIChkcmFnZ2luZyB8fCByZXNpemluZykge1xyXG4gICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8vIFVzZSBjb25zdGFudHMgdG8gYXZvaWQgY29tcGFyaW5nIHN0cmluZ3MgbXVsdGlwbGUgdGltZXMuXHJcbmNvbnN0IE1vdXNlRG93biA9IDA7XHJcbmNvbnN0IE1vdXNlVXAgICA9IDE7XHJcbmNvbnN0IE1vdXNlTW92ZSA9IDI7XHJcblxyXG5mdW5jdGlvbiB1cGRhdGUoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgIC8vIFdpbmRvd3Mgc3VwcHJlc3NlcyBtb3VzZSBldmVudHMgYXQgdGhlIGVuZCBvZiBkcmFnZ2luZyBvciByZXNpemluZyxcclxuICAgIC8vIHNvIHdlIG5lZWQgdG8gYmUgc21hcnQgYW5kIHN5bnRoZXNpemUgYnV0dG9uIGV2ZW50cy5cclxuXHJcbiAgICBsZXQgZXZlbnRUeXBlOiBudW1iZXIsIGV2ZW50QnV0dG9ucyA9IGV2ZW50LmJ1dHRvbnM7XHJcbiAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHtcclxuICAgICAgICBjYXNlICdtb3VzZWRvd24nOlxyXG4gICAgICAgICAgICBldmVudFR5cGUgPSBNb3VzZURvd247XHJcbiAgICAgICAgICAgIGlmICghYnV0dG9uc1RyYWNrZWQpIHsgZXZlbnRCdXR0b25zID0gYnV0dG9ucyB8ICgxIDw8IGV2ZW50LmJ1dHRvbik7IH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnbW91c2V1cCc6XHJcbiAgICAgICAgICAgIGV2ZW50VHlwZSA9IE1vdXNlVXA7XHJcbiAgICAgICAgICAgIGlmICghYnV0dG9uc1RyYWNrZWQpIHsgZXZlbnRCdXR0b25zID0gYnV0dG9ucyAmIH4oMSA8PCBldmVudC5idXR0b24pOyB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIGV2ZW50VHlwZSA9IE1vdXNlTW92ZTtcclxuICAgICAgICAgICAgaWYgKCFidXR0b25zVHJhY2tlZCkgeyBldmVudEJ1dHRvbnMgPSBidXR0b25zOyB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCByZWxlYXNlZCA9IGJ1dHRvbnMgJiB+ZXZlbnRCdXR0b25zO1xyXG4gICAgbGV0IHByZXNzZWQgPSBldmVudEJ1dHRvbnMgJiB+YnV0dG9ucztcclxuXHJcbiAgICBidXR0b25zID0gZXZlbnRCdXR0b25zO1xyXG5cclxuICAgIC8vIFN5bnRoZXNpemUgYSByZWxlYXNlLXByZXNzIHNlcXVlbmNlIGlmIHdlIGRldGVjdCBhIHByZXNzIG9mIGFuIGFscmVhZHkgcHJlc3NlZCBidXR0b24uXHJcbiAgICBpZiAoZXZlbnRUeXBlID09PSBNb3VzZURvd24gJiYgIShwcmVzc2VkICYgZXZlbnQuYnV0dG9uKSkge1xyXG4gICAgICAgIHJlbGVhc2VkIHw9ICgxIDw8IGV2ZW50LmJ1dHRvbik7XHJcbiAgICAgICAgcHJlc3NlZCB8PSAoMSA8PCBldmVudC5idXR0b24pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFN1cHByZXNzIGFsbCBidXR0b24gZXZlbnRzIGR1cmluZyBkcmFnZ2luZyBhbmQgcmVzaXppbmcsXHJcbiAgICAvLyB1bmxlc3MgdGhpcyBpcyBhIG1vdXNldXAgZXZlbnQgdGhhdCBpcyBlbmRpbmcgYSBkcmFnIGFjdGlvbi5cclxuICAgIGlmIChcclxuICAgICAgICBldmVudFR5cGUgIT09IE1vdXNlTW92ZSAvLyBGYXN0IHBhdGggZm9yIG1vdXNlbW92ZVxyXG4gICAgICAgICYmIHJlc2l6aW5nXHJcbiAgICAgICAgfHwgKFxyXG4gICAgICAgICAgICBkcmFnZ2luZ1xyXG4gICAgICAgICAgICAmJiAoXHJcbiAgICAgICAgICAgICAgICBldmVudFR5cGUgPT09IE1vdXNlRG93blxyXG4gICAgICAgICAgICAgICAgfHwgZXZlbnQuYnV0dG9uICE9PSAwXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApXHJcbiAgICApIHtcclxuICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEhhbmRsZSByZWxlYXNlc1xyXG4gICAgaWYgKHJlbGVhc2VkICYgMSkgeyBwcmltYXJ5VXAoZXZlbnQpOyB9XHJcbiAgICAvLyBIYW5kbGUgcHJlc3Nlc1xyXG4gICAgaWYgKHByZXNzZWQgJiAxKSB7IHByaW1hcnlEb3duKGV2ZW50KTsgfVxyXG5cclxuICAgIC8vIEhhbmRsZSBtb3VzZW1vdmVcclxuICAgIGlmIChldmVudFR5cGUgPT09IE1vdXNlTW92ZSkgeyBvbk1vdXNlTW92ZShldmVudCk7IH07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHByaW1hcnlEb3duKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XHJcbiAgICAvLyBSZXNldCByZWFkaW5lc3Mgc3RhdGUuXHJcbiAgICBjYW5EcmFnID0gZmFsc2U7XHJcbiAgICBjYW5SZXNpemUgPSBmYWxzZTtcclxuXHJcbiAgICAvLyBJZ25vcmUgcmVwZWF0ZWQgY2xpY2tzIG9uIG1hY09TIGFuZCBMaW51eC5cclxuICAgIGlmICghSXNXaW5kb3dzKCkpIHtcclxuICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ21vdXNlZG93bicgJiYgZXZlbnQuYnV0dG9uID09PSAwICYmIGV2ZW50LmRldGFpbCAhPT0gMSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChyZXNpemVFZGdlKSB7XHJcbiAgICAgICAgLy8gUmVhZHkgdG8gcmVzaXplIGlmIHRoZSBwcmltYXJ5IGJ1dHRvbiB3YXMgcHJlc3NlZCBmb3IgdGhlIGZpcnN0IHRpbWUuXHJcbiAgICAgICAgY2FuUmVzaXplID0gdHJ1ZTtcclxuICAgICAgICAvLyBEbyBub3Qgc3RhcnQgZHJhZyBvcGVyYXRpb25zIHdoZW4gb24gcmVzaXplIGVkZ2VzLlxyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBSZXRyaWV2ZSB0YXJnZXQgZWxlbWVudFxyXG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnRUYXJnZXQoZXZlbnQpO1xyXG5cclxuICAgIC8vIFJlYWR5IHRvIGRyYWcgaWYgdGhlIHByaW1hcnkgYnV0dG9uIHdhcyBwcmVzc2VkIGZvciB0aGUgZmlyc3QgdGltZSBvbiBhIGRyYWdnYWJsZSBlbGVtZW50LlxyXG4gICAgLy8gSWdub3JlIGNsaWNrcyBvbiB0aGUgc2Nyb2xsYmFyLlxyXG4gICAgY29uc3Qgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXQpO1xyXG4gICAgY2FuRHJhZyA9IChcclxuICAgICAgICBzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKFwiLS13YWlscy1kcmFnZ2FibGVcIikudHJpbSgpID09PSBcImRyYWdcIlxyXG4gICAgICAgICYmIChcclxuICAgICAgICAgICAgZXZlbnQub2Zmc2V0WCAtIHBhcnNlRmxvYXQoc3R5bGUucGFkZGluZ0xlZnQpIDwgdGFyZ2V0LmNsaWVudFdpZHRoXHJcbiAgICAgICAgICAgICYmIGV2ZW50Lm9mZnNldFkgLSBwYXJzZUZsb2F0KHN0eWxlLnBhZGRpbmdUb3ApIDwgdGFyZ2V0LmNsaWVudEhlaWdodFxyXG4gICAgICAgIClcclxuICAgICk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHByaW1hcnlVcChldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgLy8gU3RvcCBkcmFnZ2luZyBhbmQgcmVzaXppbmcuXHJcbiAgICBjYW5EcmFnID0gZmFsc2U7XHJcbiAgICBkcmFnZ2luZyA9IGZhbHNlO1xyXG4gICAgY2FuUmVzaXplID0gZmFsc2U7XHJcbiAgICByZXNpemluZyA9IGZhbHNlO1xyXG59XHJcblxyXG5jb25zdCBjdXJzb3JGb3JFZGdlID0gT2JqZWN0LmZyZWV6ZSh7XHJcbiAgICBcInNlLXJlc2l6ZVwiOiBcIm53c2UtcmVzaXplXCIsXHJcbiAgICBcInN3LXJlc2l6ZVwiOiBcIm5lc3ctcmVzaXplXCIsXHJcbiAgICBcIm53LXJlc2l6ZVwiOiBcIm53c2UtcmVzaXplXCIsXHJcbiAgICBcIm5lLXJlc2l6ZVwiOiBcIm5lc3ctcmVzaXplXCIsXHJcbiAgICBcInctcmVzaXplXCI6IFwiZXctcmVzaXplXCIsXHJcbiAgICBcIm4tcmVzaXplXCI6IFwibnMtcmVzaXplXCIsXHJcbiAgICBcInMtcmVzaXplXCI6IFwibnMtcmVzaXplXCIsXHJcbiAgICBcImUtcmVzaXplXCI6IFwiZXctcmVzaXplXCIsXHJcbn0pXHJcblxyXG5mdW5jdGlvbiBzZXRSZXNpemUoZWRnZT86IGtleW9mIHR5cGVvZiBjdXJzb3JGb3JFZGdlKTogdm9pZCB7XHJcbiAgICBpZiAoZWRnZSkge1xyXG4gICAgICAgIGlmICghcmVzaXplRWRnZSkgeyBkZWZhdWx0Q3Vyc29yID0gZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3I7IH1cclxuICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLmN1cnNvciA9IGN1cnNvckZvckVkZ2VbZWRnZV07XHJcbiAgICB9IGVsc2UgaWYgKCFlZGdlICYmIHJlc2l6ZUVkZ2UpIHtcclxuICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLmN1cnNvciA9IGRlZmF1bHRDdXJzb3I7XHJcbiAgICB9XHJcblxyXG4gICAgcmVzaXplRWRnZSA9IGVkZ2UgfHwgXCJcIjtcclxufVxyXG5cclxuZnVuY3Rpb24gb25Nb3VzZU1vdmUoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmIChjYW5SZXNpemUgJiYgcmVzaXplRWRnZSkge1xyXG4gICAgICAgIC8vIFN0YXJ0IHJlc2l6aW5nLlxyXG4gICAgICAgIHJlc2l6aW5nID0gdHJ1ZTtcclxuICAgICAgICBpbnZva2UoXCJ3YWlsczpyZXNpemU6XCIgKyByZXNpemVFZGdlKTtcclxuICAgIH0gZWxzZSBpZiAoY2FuRHJhZykge1xyXG4gICAgICAgIC8vIFN0YXJ0IGRyYWdnaW5nLlxyXG4gICAgICAgIGRyYWdnaW5nID0gdHJ1ZTtcclxuICAgICAgICBpbnZva2UoXCJ3YWlsczpkcmFnXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChkcmFnZ2luZyB8fCByZXNpemluZykge1xyXG4gICAgICAgIC8vIEVpdGhlciBkcmFnIG9yIHJlc2l6ZSBpcyBvbmdvaW5nLFxyXG4gICAgICAgIC8vIHJlc2V0IHJlYWRpbmVzcyBhbmQgc3RvcCBwcm9jZXNzaW5nLlxyXG4gICAgICAgIGNhbkRyYWcgPSBjYW5SZXNpemUgPSBmYWxzZTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFyZXNpemFibGUgfHwgIUlzV2luZG93cygpKSB7XHJcbiAgICAgICAgaWYgKHJlc2l6ZUVkZ2UpIHsgc2V0UmVzaXplKCk7IH1cclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmVzaXplSGFuZGxlSGVpZ2h0ID0gR2V0RmxhZyhcInN5c3RlbS5yZXNpemVIYW5kbGVIZWlnaHRcIikgfHwgNTtcclxuICAgIGNvbnN0IHJlc2l6ZUhhbmRsZVdpZHRoID0gR2V0RmxhZyhcInN5c3RlbS5yZXNpemVIYW5kbGVXaWR0aFwiKSB8fCA1O1xyXG5cclxuICAgIC8vIEV4dHJhIHBpeGVscyBmb3IgdGhlIGNvcm5lciBhcmVhcy5cclxuICAgIGNvbnN0IGNvcm5lckV4dHJhID0gR2V0RmxhZyhcInJlc2l6ZUNvcm5lckV4dHJhXCIpIHx8IDEwO1xyXG5cclxuICAgIGNvbnN0IHJpZ2h0Qm9yZGVyID0gKHdpbmRvdy5vdXRlcldpZHRoIC0gZXZlbnQuY2xpZW50WCkgPCByZXNpemVIYW5kbGVXaWR0aDtcclxuICAgIGNvbnN0IGxlZnRCb3JkZXIgPSBldmVudC5jbGllbnRYIDwgcmVzaXplSGFuZGxlV2lkdGg7XHJcbiAgICBjb25zdCB0b3BCb3JkZXIgPSBldmVudC5jbGllbnRZIDwgcmVzaXplSGFuZGxlSGVpZ2h0O1xyXG4gICAgY29uc3QgYm90dG9tQm9yZGVyID0gKHdpbmRvdy5vdXRlckhlaWdodCAtIGV2ZW50LmNsaWVudFkpIDwgcmVzaXplSGFuZGxlSGVpZ2h0O1xyXG5cclxuICAgIC8vIEFkanVzdCBmb3IgY29ybmVyIGFyZWFzLlxyXG4gICAgY29uc3QgcmlnaHRDb3JuZXIgPSAod2luZG93Lm91dGVyV2lkdGggLSBldmVudC5jbGllbnRYKSA8IChyZXNpemVIYW5kbGVXaWR0aCArIGNvcm5lckV4dHJhKTtcclxuICAgIGNvbnN0IGxlZnRDb3JuZXIgPSBldmVudC5jbGllbnRYIDwgKHJlc2l6ZUhhbmRsZVdpZHRoICsgY29ybmVyRXh0cmEpO1xyXG4gICAgY29uc3QgdG9wQ29ybmVyID0gZXZlbnQuY2xpZW50WSA8IChyZXNpemVIYW5kbGVIZWlnaHQgKyBjb3JuZXJFeHRyYSk7XHJcbiAgICBjb25zdCBib3R0b21Db3JuZXIgPSAod2luZG93Lm91dGVySGVpZ2h0IC0gZXZlbnQuY2xpZW50WSkgPCAocmVzaXplSGFuZGxlSGVpZ2h0ICsgY29ybmVyRXh0cmEpO1xyXG5cclxuICAgIGlmICghbGVmdENvcm5lciAmJiAhdG9wQ29ybmVyICYmICFib3R0b21Db3JuZXIgJiYgIXJpZ2h0Q29ybmVyKSB7XHJcbiAgICAgICAgLy8gT3B0aW1pc2F0aW9uOiBvdXQgb2YgYWxsIGNvcm5lciBhcmVhcyBpbXBsaWVzIG91dCBvZiBib3JkZXJzLlxyXG4gICAgICAgIHNldFJlc2l6ZSgpO1xyXG4gICAgfVxyXG4gICAgLy8gRGV0ZWN0IGNvcm5lcnMuXHJcbiAgICBlbHNlIGlmIChyaWdodENvcm5lciAmJiBib3R0b21Db3JuZXIpIHNldFJlc2l6ZShcInNlLXJlc2l6ZVwiKTtcclxuICAgIGVsc2UgaWYgKGxlZnRDb3JuZXIgJiYgYm90dG9tQ29ybmVyKSBzZXRSZXNpemUoXCJzdy1yZXNpemVcIik7XHJcbiAgICBlbHNlIGlmIChsZWZ0Q29ybmVyICYmIHRvcENvcm5lcikgc2V0UmVzaXplKFwibnctcmVzaXplXCIpO1xyXG4gICAgZWxzZSBpZiAodG9wQ29ybmVyICYmIHJpZ2h0Q29ybmVyKSBzZXRSZXNpemUoXCJuZS1yZXNpemVcIik7XHJcbiAgICAvLyBEZXRlY3QgYm9yZGVycy5cclxuICAgIGVsc2UgaWYgKGxlZnRCb3JkZXIpIHNldFJlc2l6ZShcInctcmVzaXplXCIpO1xyXG4gICAgZWxzZSBpZiAodG9wQm9yZGVyKSBzZXRSZXNpemUoXCJuLXJlc2l6ZVwiKTtcclxuICAgIGVsc2UgaWYgKGJvdHRvbUJvcmRlcikgc2V0UmVzaXplKFwicy1yZXNpemVcIik7XHJcbiAgICBlbHNlIGlmIChyaWdodEJvcmRlcikgc2V0UmVzaXplKFwiZS1yZXNpemVcIik7XHJcbiAgICAvLyBPdXQgb2YgYm9yZGVyIGFyZWEuXHJcbiAgICBlbHNlIHNldFJlc2l6ZSgpO1xyXG59XHJcbiIsICIvKlxyXG4gX1x0ICAgX19cdCAgXyBfX1xyXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xyXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXHJcbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxyXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cclxuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xyXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XHJcbiovXHJcblxyXG5pbXBvcnQgeyBuZXdSdW50aW1lQ2FsbGVyLCBvYmplY3ROYW1lcyB9IGZyb20gXCIuL3J1bnRpbWUuanNcIjtcclxuY29uc3QgY2FsbCA9IG5ld1J1bnRpbWVDYWxsZXIob2JqZWN0TmFtZXMuQXBwbGljYXRpb24pO1xyXG5cclxuY29uc3QgSGlkZU1ldGhvZCA9IDA7XHJcbmNvbnN0IFNob3dNZXRob2QgPSAxO1xyXG5jb25zdCBRdWl0TWV0aG9kID0gMjtcclxuXHJcbi8qKlxyXG4gKiBIaWRlcyBhIGNlcnRhaW4gbWV0aG9kIGJ5IGNhbGxpbmcgdGhlIEhpZGVNZXRob2QgZnVuY3Rpb24uXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gSGlkZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiBjYWxsKEhpZGVNZXRob2QpO1xyXG59XHJcblxyXG4vKipcclxuICogQ2FsbHMgdGhlIFNob3dNZXRob2QgYW5kIHJldHVybnMgdGhlIHJlc3VsdC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBTaG93KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIGNhbGwoU2hvd01ldGhvZCk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDYWxscyB0aGUgUXVpdE1ldGhvZCB0byB0ZXJtaW5hdGUgdGhlIHByb2dyYW0uXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gUXVpdCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiBjYWxsKFF1aXRNZXRob2QpO1xyXG59XHJcbiIsICIvKlxyXG4gX1x0ICAgX19cdCAgXyBfX1xyXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xyXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXHJcbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxyXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cclxuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xyXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XHJcbiovXHJcblxyXG5pbXBvcnQgeyBDYW5jZWxsYWJsZVByb21pc2UsIHR5cGUgQ2FuY2VsbGFibGVQcm9taXNlV2l0aFJlc29sdmVycyB9IGZyb20gXCIuL2NhbmNlbGxhYmxlLmpzXCI7XHJcbmltcG9ydCB7IG5ld1J1bnRpbWVDYWxsZXIsIG9iamVjdE5hbWVzIH0gZnJvbSBcIi4vcnVudGltZS5qc1wiO1xyXG5pbXBvcnQgeyBuYW5vaWQgfSBmcm9tIFwiLi9uYW5vaWQuanNcIjtcclxuXHJcbi8vIFNldHVwXHJcbndpbmRvdy5fd2FpbHMgPSB3aW5kb3cuX3dhaWxzIHx8IHt9O1xyXG53aW5kb3cuX3dhaWxzLmNhbGxSZXN1bHRIYW5kbGVyID0gcmVzdWx0SGFuZGxlcjtcclxud2luZG93Ll93YWlscy5jYWxsRXJyb3JIYW5kbGVyID0gZXJyb3JIYW5kbGVyO1xyXG5cclxudHlwZSBQcm9taXNlUmVzb2x2ZXJzID0gT21pdDxDYW5jZWxsYWJsZVByb21pc2VXaXRoUmVzb2x2ZXJzPGFueT4sIFwicHJvbWlzZVwiIHwgXCJvbmNhbmNlbGxlZFwiPlxyXG5cclxuY29uc3QgY2FsbCA9IG5ld1J1bnRpbWVDYWxsZXIob2JqZWN0TmFtZXMuQ2FsbCk7XHJcbmNvbnN0IGNhbmNlbENhbGwgPSBuZXdSdW50aW1lQ2FsbGVyKG9iamVjdE5hbWVzLkNhbmNlbENhbGwpO1xyXG5jb25zdCBjYWxsUmVzcG9uc2VzID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2VSZXNvbHZlcnM+KCk7XHJcblxyXG5jb25zdCBDYWxsQmluZGluZyA9IDA7XHJcbmNvbnN0IENhbmNlbE1ldGhvZCA9IDBcclxuXHJcbi8qKlxyXG4gKiBIb2xkcyBhbGwgcmVxdWlyZWQgaW5mb3JtYXRpb24gZm9yIGEgYmluZGluZyBjYWxsLlxyXG4gKiBNYXkgcHJvdmlkZSBlaXRoZXIgYSBtZXRob2QgSUQgb3IgYSBtZXRob2QgbmFtZSwgYnV0IG5vdCBib3RoLlxyXG4gKi9cclxuZXhwb3J0IHR5cGUgQ2FsbE9wdGlvbnMgPSB7XHJcbiAgICAvKiogVGhlIG51bWVyaWMgSUQgb2YgdGhlIGJvdW5kIG1ldGhvZCB0byBjYWxsLiAqL1xyXG4gICAgbWV0aG9kSUQ6IG51bWJlcjtcclxuICAgIC8qKiBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGJvdW5kIG1ldGhvZCB0byBjYWxsLiAqL1xyXG4gICAgbWV0aG9kTmFtZT86IG5ldmVyO1xyXG4gICAgLyoqIEFyZ3VtZW50cyB0byBiZSBwYXNzZWQgaW50byB0aGUgYm91bmQgbWV0aG9kLiAqL1xyXG4gICAgYXJnczogYW55W107XHJcbn0gfCB7XHJcbiAgICAvKiogVGhlIG51bWVyaWMgSUQgb2YgdGhlIGJvdW5kIG1ldGhvZCB0byBjYWxsLiAqL1xyXG4gICAgbWV0aG9kSUQ/OiBuZXZlcjtcclxuICAgIC8qKiBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGJvdW5kIG1ldGhvZCB0byBjYWxsLiAqL1xyXG4gICAgbWV0aG9kTmFtZTogc3RyaW5nO1xyXG4gICAgLyoqIEFyZ3VtZW50cyB0byBiZSBwYXNzZWQgaW50byB0aGUgYm91bmQgbWV0aG9kLiAqL1xyXG4gICAgYXJnczogYW55W107XHJcbn07XHJcblxyXG4vKipcclxuICogRXhjZXB0aW9uIGNsYXNzIHRoYXQgd2lsbCBiZSB0aHJvd24gaW4gY2FzZSB0aGUgYm91bmQgbWV0aG9kIHJldHVybnMgYW4gZXJyb3IuXHJcbiAqIFRoZSB2YWx1ZSBvZiB0aGUge0BsaW5rIFJ1bnRpbWVFcnJvciNuYW1lfSBwcm9wZXJ0eSBpcyBcIlJ1bnRpbWVFcnJvclwiLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFJ1bnRpbWVFcnJvciBleHRlbmRzIEVycm9yIHtcclxuICAgIC8qKlxyXG4gICAgICogQ29uc3RydWN0cyBhIG5ldyBSdW50aW1lRXJyb3IgaW5zdGFuY2UuXHJcbiAgICAgKiBAcGFyYW0gbWVzc2FnZSAtIFRoZSBlcnJvciBtZXNzYWdlLlxyXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIGJlIGZvcndhcmRlZCB0byB0aGUgRXJyb3IgY29uc3RydWN0b3IuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcsIG9wdGlvbnM/OiBFcnJvck9wdGlvbnMpIHtcclxuICAgICAgICBzdXBlcihtZXNzYWdlLCBvcHRpb25zKTtcclxuICAgICAgICB0aGlzLm5hbWUgPSBcIlJ1bnRpbWVFcnJvclwiO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKipcclxuICogSGFuZGxlcyB0aGUgcmVzdWx0IG9mIGEgY2FsbCByZXF1ZXN0LlxyXG4gKlxyXG4gKiBAcGFyYW0gaWQgLSBUaGUgaWQgb2YgdGhlIHJlcXVlc3QgdG8gaGFuZGxlIHRoZSByZXN1bHQgZm9yLlxyXG4gKiBAcGFyYW0gZGF0YSAtIFRoZSByZXN1bHQgZGF0YSBvZiB0aGUgcmVxdWVzdC5cclxuICogQHBhcmFtIGlzSlNPTiAtIEluZGljYXRlcyB3aGV0aGVyIHRoZSBkYXRhIGlzIEpTT04gb3Igbm90LlxyXG4gKi9cclxuZnVuY3Rpb24gcmVzdWx0SGFuZGxlcihpZDogc3RyaW5nLCBkYXRhOiBzdHJpbmcsIGlzSlNPTjogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgY29uc3QgcmVzb2x2ZXJzID0gZ2V0QW5kRGVsZXRlUmVzcG9uc2UoaWQpO1xyXG4gICAgaWYgKCFyZXNvbHZlcnMpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFkYXRhKSB7XHJcbiAgICAgICAgcmVzb2x2ZXJzLnJlc29sdmUodW5kZWZpbmVkKTtcclxuICAgIH0gZWxzZSBpZiAoIWlzSlNPTikge1xyXG4gICAgICAgIHJlc29sdmVycy5yZXNvbHZlKGRhdGEpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXNvbHZlcnMucmVzb2x2ZShKU09OLnBhcnNlKGRhdGEpKTtcclxuICAgICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xyXG4gICAgICAgICAgICByZXNvbHZlcnMucmVqZWN0KG5ldyBUeXBlRXJyb3IoXCJjb3VsZCBub3QgcGFyc2UgcmVzdWx0OiBcIiArIGVyci5tZXNzYWdlLCB7IGNhdXNlOiBlcnIgfSkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEhhbmRsZXMgdGhlIGVycm9yIGZyb20gYSBjYWxsIHJlcXVlc3QuXHJcbiAqXHJcbiAqIEBwYXJhbSBpZCAtIFRoZSBpZCBvZiB0aGUgcHJvbWlzZSBoYW5kbGVyLlxyXG4gKiBAcGFyYW0gZGF0YSAtIFRoZSBlcnJvciBkYXRhIHRvIHJlamVjdCB0aGUgcHJvbWlzZSBoYW5kbGVyIHdpdGguXHJcbiAqIEBwYXJhbSBpc0pTT04gLSBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZGF0YSBpcyBKU09OIG9yIG5vdC5cclxuICovXHJcbmZ1bmN0aW9uIGVycm9ySGFuZGxlcihpZDogc3RyaW5nLCBkYXRhOiBzdHJpbmcsIGlzSlNPTjogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgY29uc3QgcmVzb2x2ZXJzID0gZ2V0QW5kRGVsZXRlUmVzcG9uc2UoaWQpO1xyXG4gICAgaWYgKCFyZXNvbHZlcnMpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFpc0pTT04pIHtcclxuICAgICAgICByZXNvbHZlcnMucmVqZWN0KG5ldyBFcnJvcihkYXRhKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCBlcnJvcjogYW55O1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGVycm9yID0gSlNPTi5wYXJzZShkYXRhKTtcclxuICAgICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xyXG4gICAgICAgICAgICByZXNvbHZlcnMucmVqZWN0KG5ldyBUeXBlRXJyb3IoXCJjb3VsZCBub3QgcGFyc2UgZXJyb3I6IFwiICsgZXJyLm1lc3NhZ2UsIHsgY2F1c2U6IGVyciB9KSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBvcHRpb25zOiBFcnJvck9wdGlvbnMgPSB7fTtcclxuICAgICAgICBpZiAoZXJyb3IuY2F1c2UpIHtcclxuICAgICAgICAgICAgb3B0aW9ucy5jYXVzZSA9IGVycm9yLmNhdXNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGV4Y2VwdGlvbjtcclxuICAgICAgICBzd2l0Y2ggKGVycm9yLmtpbmQpIHtcclxuICAgICAgICAgICAgY2FzZSBcIlJlZmVyZW5jZUVycm9yXCI6XHJcbiAgICAgICAgICAgICAgICBleGNlcHRpb24gPSBuZXcgUmVmZXJlbmNlRXJyb3IoZXJyb3IubWVzc2FnZSwgb3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcIlR5cGVFcnJvclwiOlxyXG4gICAgICAgICAgICAgICAgZXhjZXB0aW9uID0gbmV3IFR5cGVFcnJvcihlcnJvci5tZXNzYWdlLCBvcHRpb25zKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiUnVudGltZUVycm9yXCI6XHJcbiAgICAgICAgICAgICAgICBleGNlcHRpb24gPSBuZXcgUnVudGltZUVycm9yKGVycm9yLm1lc3NhZ2UsIG9wdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBleGNlcHRpb24gPSBuZXcgRXJyb3IoZXJyb3IubWVzc2FnZSwgb3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJlc29sdmVycy5yZWplY3QoZXhjZXB0aW9uKTtcclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHJpZXZlcyBhbmQgcmVtb3ZlcyB0aGUgcmVzcG9uc2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBJRCBmcm9tIHRoZSBjYWxsUmVzcG9uc2VzIG1hcC5cclxuICpcclxuICogQHBhcmFtIGlkIC0gVGhlIElEIG9mIHRoZSByZXNwb25zZSB0byBiZSByZXRyaWV2ZWQgYW5kIHJlbW92ZWQuXHJcbiAqIEByZXR1cm5zIFRoZSByZXNwb25zZSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBJRCwgaWYgYW55LlxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0QW5kRGVsZXRlUmVzcG9uc2UoaWQ6IHN0cmluZyk6IFByb21pc2VSZXNvbHZlcnMgfCB1bmRlZmluZWQge1xyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBjYWxsUmVzcG9uc2VzLmdldChpZCk7XHJcbiAgICBjYWxsUmVzcG9uc2VzLmRlbGV0ZShpZCk7XHJcbiAgICByZXR1cm4gcmVzcG9uc2U7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZW5lcmF0ZXMgYSB1bmlxdWUgSUQgdXNpbmcgdGhlIG5hbm9pZCBsaWJyYXJ5LlxyXG4gKlxyXG4gKiBAcmV0dXJucyBBIHVuaXF1ZSBJRCB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBjYWxsUmVzcG9uc2VzIHNldC5cclxuICovXHJcbmZ1bmN0aW9uIGdlbmVyYXRlSUQoKTogc3RyaW5nIHtcclxuICAgIGxldCByZXN1bHQ7XHJcbiAgICBkbyB7XHJcbiAgICAgICAgcmVzdWx0ID0gbmFub2lkKCk7XHJcbiAgICB9IHdoaWxlIChjYWxsUmVzcG9uc2VzLmhhcyhyZXN1bHQpKTtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDYWxsIGEgYm91bmQgbWV0aG9kIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gY2FsbCBvcHRpb25zLlxyXG4gKlxyXG4gKiBJbiBjYXNlIG9mIGZhaWx1cmUsIHRoZSByZXR1cm5lZCBwcm9taXNlIHdpbGwgcmVqZWN0IHdpdGggYW4gZXhjZXB0aW9uXHJcbiAqIGFtb25nIFJlZmVyZW5jZUVycm9yICh1bmtub3duIG1ldGhvZCksIFR5cGVFcnJvciAod3JvbmcgYXJndW1lbnQgY291bnQgb3IgdHlwZSksXHJcbiAqIHtAbGluayBSdW50aW1lRXJyb3J9IChtZXRob2QgcmV0dXJuZWQgYW4gZXJyb3IpLCBvciBvdGhlciAobmV0d29yayBvciBpbnRlcm5hbCBlcnJvcnMpLlxyXG4gKiBUaGUgZXhjZXB0aW9uIG1pZ2h0IGhhdmUgYSBcImNhdXNlXCIgZmllbGQgd2l0aCB0aGUgdmFsdWUgcmV0dXJuZWRcclxuICogYnkgdGhlIGFwcGxpY2F0aW9uLSBvciBzZXJ2aWNlLWxldmVsIGVycm9yIG1hcnNoYWxpbmcgZnVuY3Rpb25zLlxyXG4gKlxyXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEEgbWV0aG9kIGNhbGwgZGVzY3JpcHRvci5cclxuICogQHJldHVybnMgVGhlIHJlc3VsdCBvZiB0aGUgY2FsbC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBDYWxsKG9wdGlvbnM6IENhbGxPcHRpb25zKTogQ2FuY2VsbGFibGVQcm9taXNlPGFueT4ge1xyXG4gICAgY29uc3QgaWQgPSBnZW5lcmF0ZUlEKCk7XHJcblxyXG4gICAgY29uc3QgcmVzdWx0ID0gQ2FuY2VsbGFibGVQcm9taXNlLndpdGhSZXNvbHZlcnM8YW55PigpO1xyXG4gICAgY2FsbFJlc3BvbnNlcy5zZXQoaWQsIHsgcmVzb2x2ZTogcmVzdWx0LnJlc29sdmUsIHJlamVjdDogcmVzdWx0LnJlamVjdCB9KTtcclxuXHJcbiAgICBjb25zdCByZXF1ZXN0ID0gY2FsbChDYWxsQmluZGluZywgT2JqZWN0LmFzc2lnbih7IFwiY2FsbC1pZFwiOiBpZCB9LCBvcHRpb25zKSk7XHJcbiAgICBsZXQgcnVubmluZyA9IGZhbHNlO1xyXG5cclxuICAgIHJlcXVlc3QudGhlbigoKSA9PiB7XHJcbiAgICAgICAgcnVubmluZyA9IHRydWU7XHJcbiAgICB9LCAoZXJyKSA9PiB7XHJcbiAgICAgICAgY2FsbFJlc3BvbnNlcy5kZWxldGUoaWQpO1xyXG4gICAgICAgIHJlc3VsdC5yZWplY3QoZXJyKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IGNhbmNlbCA9ICgpID0+IHtcclxuICAgICAgICBjYWxsUmVzcG9uc2VzLmRlbGV0ZShpZCk7XHJcbiAgICAgICAgcmV0dXJuIGNhbmNlbENhbGwoQ2FuY2VsTWV0aG9kLCB7XCJjYWxsLWlkXCI6IGlkfSkuY2F0Y2goKGVycikgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3Igd2hpbGUgcmVxdWVzdGluZyBiaW5kaW5nIGNhbGwgY2FuY2VsbGF0aW9uOlwiLCBlcnIpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICByZXN1bHQub25jYW5jZWxsZWQgPSAoKSA9PiB7XHJcbiAgICAgICAgaWYgKHJ1bm5pbmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNhbmNlbCgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiByZXF1ZXN0LnRoZW4oY2FuY2VsKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiByZXN1bHQucHJvbWlzZTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENhbGxzIGEgYm91bmQgbWV0aG9kIGJ5IG5hbWUgd2l0aCB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50cy5cclxuICogU2VlIHtAbGluayBDYWxsfSBmb3IgZGV0YWlscy5cclxuICpcclxuICogQHBhcmFtIG1ldGhvZE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgbWV0aG9kIGluIHRoZSBmb3JtYXQgJ3BhY2thZ2Uuc3RydWN0Lm1ldGhvZCcuXHJcbiAqIEBwYXJhbSBhcmdzIC0gVGhlIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBtZXRob2QuXHJcbiAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgdGhlIG1ldGhvZCBjYWxsLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIEJ5TmFtZShtZXRob2ROYW1lOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogQ2FuY2VsbGFibGVQcm9taXNlPGFueT4ge1xyXG4gICAgcmV0dXJuIENhbGwoeyBtZXRob2ROYW1lLCBhcmdzIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogQ2FsbHMgYSBtZXRob2QgYnkgaXRzIG51bWVyaWMgSUQgd2l0aCB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50cy5cclxuICogU2VlIHtAbGluayBDYWxsfSBmb3IgZGV0YWlscy5cclxuICpcclxuICogQHBhcmFtIG1ldGhvZElEIC0gVGhlIElEIG9mIHRoZSBtZXRob2QgdG8gY2FsbC5cclxuICogQHBhcmFtIGFyZ3MgLSBUaGUgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIG1ldGhvZC5cclxuICogQHJldHVybiBUaGUgcmVzdWx0IG9mIHRoZSBtZXRob2QgY2FsbC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBCeUlEKG1ldGhvZElEOiBudW1iZXIsIC4uLmFyZ3M6IGFueVtdKTogQ2FuY2VsbGFibGVQcm9taXNlPGFueT4ge1xyXG4gICAgcmV0dXJuIENhbGwoeyBtZXRob2RJRCwgYXJncyB9KTtcclxufVxyXG4iLCAiLy8gU291cmNlOiBodHRwczovL2dpdGh1Yi5jb20vaW5zcGVjdC1qcy9pcy1jYWxsYWJsZVxyXG5cclxuLy8gVGhlIE1JVCBMaWNlbnNlIChNSVQpXHJcbi8vXHJcbi8vIENvcHlyaWdodCAoYykgMjAxNSBKb3JkYW4gSGFyYmFuZFxyXG4vL1xyXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XHJcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcclxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xyXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXHJcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xyXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxyXG4vL1xyXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcclxuLy8gY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cclxuLy9cclxuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxyXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcclxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXHJcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcclxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcclxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcclxuLy8gU09GVFdBUkUuXHJcblxyXG52YXIgZm5Ub1N0ciA9IEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZztcclxudmFyIHJlZmxlY3RBcHBseTogdHlwZW9mIFJlZmxlY3QuYXBwbHkgfCBmYWxzZSB8IG51bGwgPSB0eXBlb2YgUmVmbGVjdCA9PT0gJ29iamVjdCcgJiYgUmVmbGVjdCAhPT0gbnVsbCAmJiBSZWZsZWN0LmFwcGx5O1xyXG52YXIgYmFkQXJyYXlMaWtlOiBhbnk7XHJcbnZhciBpc0NhbGxhYmxlTWFya2VyOiBhbnk7XHJcbmlmICh0eXBlb2YgcmVmbGVjdEFwcGx5ID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBPYmplY3QuZGVmaW5lUHJvcGVydHkgPT09ICdmdW5jdGlvbicpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgYmFkQXJyYXlMaWtlID0gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAnbGVuZ3RoJywge1xyXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IGlzQ2FsbGFibGVNYXJrZXI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBpc0NhbGxhYmxlTWFya2VyID0ge307XHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXRocm93LWxpdGVyYWxcclxuICAgICAgICByZWZsZWN0QXBwbHkoZnVuY3Rpb24gKCkgeyB0aHJvdyA0MjsgfSwgbnVsbCwgYmFkQXJyYXlMaWtlKTtcclxuICAgIH0gY2F0Y2ggKF8pIHtcclxuICAgICAgICBpZiAoXyAhPT0gaXNDYWxsYWJsZU1hcmtlcikge1xyXG4gICAgICAgICAgICByZWZsZWN0QXBwbHkgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSBlbHNlIHtcclxuICAgIHJlZmxlY3RBcHBseSA9IG51bGw7XHJcbn1cclxuXHJcbnZhciBjb25zdHJ1Y3RvclJlZ2V4ID0gL15cXHMqY2xhc3NcXGIvO1xyXG52YXIgaXNFUzZDbGFzc0ZuID0gZnVuY3Rpb24gaXNFUzZDbGFzc0Z1bmN0aW9uKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgdmFyIGZuU3RyID0gZm5Ub1N0ci5jYWxsKHZhbHVlKTtcclxuICAgICAgICByZXR1cm4gY29uc3RydWN0b3JSZWdleC50ZXN0KGZuU3RyKTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7IC8vIG5vdCBhIGZ1bmN0aW9uXHJcbiAgICB9XHJcbn07XHJcblxyXG52YXIgdHJ5RnVuY3Rpb25PYmplY3QgPSBmdW5jdGlvbiB0cnlGdW5jdGlvblRvU3RyKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgaWYgKGlzRVM2Q2xhc3NGbih2YWx1ZSkpIHsgcmV0dXJuIGZhbHNlOyB9XHJcbiAgICAgICAgZm5Ub1N0ci5jYWxsKHZhbHVlKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbn07XHJcbnZhciB0b1N0ciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XHJcbnZhciBvYmplY3RDbGFzcyA9ICdbb2JqZWN0IE9iamVjdF0nO1xyXG52YXIgZm5DbGFzcyA9ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XHJcbnZhciBnZW5DbGFzcyA9ICdbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSc7XHJcbnZhciBkZGFDbGFzcyA9ICdbb2JqZWN0IEhUTUxBbGxDb2xsZWN0aW9uXSc7IC8vIElFIDExXHJcbnZhciBkZGFDbGFzczIgPSAnW29iamVjdCBIVE1MIGRvY3VtZW50LmFsbCBjbGFzc10nO1xyXG52YXIgZGRhQ2xhc3MzID0gJ1tvYmplY3QgSFRNTENvbGxlY3Rpb25dJzsgLy8gSUUgOS0xMFxyXG52YXIgaGFzVG9TdHJpbmdUYWcgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmICEhU3ltYm9sLnRvU3RyaW5nVGFnOyAvLyBiZXR0ZXI6IHVzZSBgaGFzLXRvc3RyaW5ndGFnYFxyXG5cclxudmFyIGlzSUU2OCA9ICEoMCBpbiBbLF0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNwYXJzZS1hcnJheXMsIGNvbW1hLXNwYWNpbmdcclxuXHJcbnZhciBpc0REQTogKHZhbHVlOiBhbnkpID0+IGJvb2xlYW4gPSBmdW5jdGlvbiBpc0RvY3VtZW50RG90QWxsKCkgeyByZXR1cm4gZmFsc2U7IH07XHJcbmlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICdvYmplY3QnKSB7XHJcbiAgICAvLyBGaXJlZm94IDMgY2Fub25pY2FsaXplcyBEREEgdG8gdW5kZWZpbmVkIHdoZW4gaXQncyBub3QgYWNjZXNzZWQgZGlyZWN0bHlcclxuICAgIHZhciBhbGwgPSBkb2N1bWVudC5hbGw7XHJcbiAgICBpZiAodG9TdHIuY2FsbChhbGwpID09PSB0b1N0ci5jYWxsKGRvY3VtZW50LmFsbCkpIHtcclxuICAgICAgICBpc0REQSA9IGZ1bmN0aW9uIGlzRG9jdW1lbnREb3RBbGwodmFsdWUpIHtcclxuICAgICAgICAgICAgLyogZ2xvYmFscyBkb2N1bWVudDogZmFsc2UgKi9cclxuICAgICAgICAgICAgLy8gaW4gSUUgNi04LCB0eXBlb2YgZG9jdW1lbnQuYWxsIGlzIFwib2JqZWN0XCIgYW5kIGl0J3MgdHJ1dGh5XHJcbiAgICAgICAgICAgIGlmICgoaXNJRTY4IHx8ICF2YWx1ZSkgJiYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JykpIHtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ciA9IHRvU3RyLmNhbGwodmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ciA9PT0gZGRhQ2xhc3NcclxuICAgICAgICAgICAgICAgICAgICAgICAgfHwgc3RyID09PSBkZGFDbGFzczJcclxuICAgICAgICAgICAgICAgICAgICAgICAgfHwgc3RyID09PSBkZGFDbGFzczMgLy8gb3BlcmEgMTIuMTZcclxuICAgICAgICAgICAgICAgICAgICAgICAgfHwgc3RyID09PSBvYmplY3RDbGFzcyAvLyBJRSA2LThcclxuICAgICAgICAgICAgICAgICAgICApICYmIHZhbHVlKCcnKSA9PSBudWxsOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGVxZXFlcVxyXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgeyAvKiovIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gaXNDYWxsYWJsZVJlZkFwcGx5PFQ+KHZhbHVlOiBUIHwgdW5rbm93bik6IHZhbHVlIGlzICguLi5hcmdzOiBhbnlbXSkgPT4gYW55ICB7XHJcbiAgICBpZiAoaXNEREEodmFsdWUpKSB7IHJldHVybiB0cnVlOyB9XHJcbiAgICBpZiAoIXZhbHVlKSB7IHJldHVybiBmYWxzZTsgfVxyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7IHJldHVybiBmYWxzZTsgfVxyXG4gICAgdHJ5IHtcclxuICAgICAgICAocmVmbGVjdEFwcGx5IGFzIGFueSkodmFsdWUsIG51bGwsIGJhZEFycmF5TGlrZSk7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgaWYgKGUgIT09IGlzQ2FsbGFibGVNYXJrZXIpIHsgcmV0dXJuIGZhbHNlOyB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gIWlzRVM2Q2xhc3NGbih2YWx1ZSkgJiYgdHJ5RnVuY3Rpb25PYmplY3QodmFsdWUpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpc0NhbGxhYmxlTm9SZWZBcHBseTxUPih2YWx1ZTogVCB8IHVua25vd24pOiB2YWx1ZSBpcyAoLi4uYXJnczogYW55W10pID0+IGFueSB7XHJcbiAgICBpZiAoaXNEREEodmFsdWUpKSB7IHJldHVybiB0cnVlOyB9XHJcbiAgICBpZiAoIXZhbHVlKSB7IHJldHVybiBmYWxzZTsgfVxyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7IHJldHVybiBmYWxzZTsgfVxyXG4gICAgaWYgKGhhc1RvU3RyaW5nVGFnKSB7IHJldHVybiB0cnlGdW5jdGlvbk9iamVjdCh2YWx1ZSk7IH1cclxuICAgIGlmIChpc0VTNkNsYXNzRm4odmFsdWUpKSB7IHJldHVybiBmYWxzZTsgfVxyXG4gICAgdmFyIHN0ckNsYXNzID0gdG9TdHIuY2FsbCh2YWx1ZSk7XHJcbiAgICBpZiAoc3RyQ2xhc3MgIT09IGZuQ2xhc3MgJiYgc3RyQ2xhc3MgIT09IGdlbkNsYXNzICYmICEoL15cXFtvYmplY3QgSFRNTC8pLnRlc3Qoc3RyQ2xhc3MpKSB7IHJldHVybiBmYWxzZTsgfVxyXG4gICAgcmV0dXJuIHRyeUZ1bmN0aW9uT2JqZWN0KHZhbHVlKTtcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IHJlZmxlY3RBcHBseSA/IGlzQ2FsbGFibGVSZWZBcHBseSA6IGlzQ2FsbGFibGVOb1JlZkFwcGx5O1xyXG4iLCAiLypcclxuIF9cdCAgIF9fXHQgIF8gX19cclxufCB8XHQgLyAvX19fIF8oXykgL19fX19cclxufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xyXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcclxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXHJcblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cclxuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxyXG4qL1xyXG5cclxuaW1wb3J0IGlzQ2FsbGFibGUgZnJvbSBcIi4vY2FsbGFibGUuanNcIjtcclxuXHJcbi8qKlxyXG4gKiBFeGNlcHRpb24gY2xhc3MgdGhhdCB3aWxsIGJlIHVzZWQgYXMgcmVqZWN0aW9uIHJlYXNvblxyXG4gKiBpbiBjYXNlIGEge0BsaW5rIENhbmNlbGxhYmxlUHJvbWlzZX0gaXMgY2FuY2VsbGVkIHN1Y2Nlc3NmdWxseS5cclxuICpcclxuICogVGhlIHZhbHVlIG9mIHRoZSB7QGxpbmsgbmFtZX0gcHJvcGVydHkgaXMgdGhlIHN0cmluZyBgXCJDYW5jZWxFcnJvclwiYC5cclxuICogVGhlIHZhbHVlIG9mIHRoZSB7QGxpbmsgY2F1c2V9IHByb3BlcnR5IGlzIHRoZSBjYXVzZSBwYXNzZWQgdG8gdGhlIGNhbmNlbCBtZXRob2QsIGlmIGFueS5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBDYW5jZWxFcnJvciBleHRlbmRzIEVycm9yIHtcclxuICAgIC8qKlxyXG4gICAgICogQ29uc3RydWN0cyBhIG5ldyBgQ2FuY2VsRXJyb3JgIGluc3RhbmNlLlxyXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgZXJyb3IgbWVzc2FnZS5cclxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBiZSBmb3J3YXJkZWQgdG8gdGhlIEVycm9yIGNvbnN0cnVjdG9yLlxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlPzogc3RyaW5nLCBvcHRpb25zPzogRXJyb3JPcHRpb25zKSB7XHJcbiAgICAgICAgc3VwZXIobWVzc2FnZSwgb3B0aW9ucyk7XHJcbiAgICAgICAgdGhpcy5uYW1lID0gXCJDYW5jZWxFcnJvclwiO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKipcclxuICogRXhjZXB0aW9uIGNsYXNzIHRoYXQgd2lsbCBiZSByZXBvcnRlZCBhcyBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uXHJcbiAqIGluIGNhc2UgYSB7QGxpbmsgQ2FuY2VsbGFibGVQcm9taXNlfSByZWplY3RzIGFmdGVyIGJlaW5nIGNhbmNlbGxlZCxcclxuICogb3Igd2hlbiB0aGUgYG9uY2FuY2VsbGVkYCBjYWxsYmFjayB0aHJvd3Mgb3IgcmVqZWN0cy5cclxuICpcclxuICogVGhlIHZhbHVlIG9mIHRoZSB7QGxpbmsgbmFtZX0gcHJvcGVydHkgaXMgdGhlIHN0cmluZyBgXCJDYW5jZWxsZWRSZWplY3Rpb25FcnJvclwiYC5cclxuICogVGhlIHZhbHVlIG9mIHRoZSB7QGxpbmsgY2F1c2V9IHByb3BlcnR5IGlzIHRoZSByZWFzb24gdGhlIHByb21pc2UgcmVqZWN0ZWQgd2l0aC5cclxuICpcclxuICogQmVjYXVzZSB0aGUgb3JpZ2luYWwgcHJvbWlzZSB3YXMgY2FuY2VsbGVkLFxyXG4gKiBhIHdyYXBwZXIgcHJvbWlzZSB3aWxsIGJlIHBhc3NlZCB0byB0aGUgdW5oYW5kbGVkIHJlamVjdGlvbiBsaXN0ZW5lciBpbnN0ZWFkLlxyXG4gKiBUaGUge0BsaW5rIHByb21pc2V9IHByb3BlcnR5IGhvbGRzIGEgcmVmZXJlbmNlIHRvIHRoZSBvcmlnaW5hbCBwcm9taXNlLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIENhbmNlbGxlZFJlamVjdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xyXG4gICAgLyoqXHJcbiAgICAgKiBIb2xkcyBhIHJlZmVyZW5jZSB0byB0aGUgcHJvbWlzZSB0aGF0IHdhcyBjYW5jZWxsZWQgYW5kIHRoZW4gcmVqZWN0ZWQuXHJcbiAgICAgKi9cclxuICAgIHByb21pc2U6IENhbmNlbGxhYmxlUHJvbWlzZTx1bmtub3duPjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnN0cnVjdHMgYSBuZXcgYENhbmNlbGxlZFJlamVjdGlvbkVycm9yYCBpbnN0YW5jZS5cclxuICAgICAqIEBwYXJhbSBwcm9taXNlIC0gVGhlIHByb21pc2UgdGhhdCBjYXVzZWQgdGhlIGVycm9yIG9yaWdpbmFsbHkuXHJcbiAgICAgKiBAcGFyYW0gcmVhc29uIC0gVGhlIHJlamVjdGlvbiByZWFzb24uXHJcbiAgICAgKiBAcGFyYW0gaW5mbyAtIEFuIG9wdGlvbmFsIGluZm9ybWF0aXZlIG1lc3NhZ2Ugc3BlY2lmeWluZyB0aGUgY2lyY3Vtc3RhbmNlcyBpbiB3aGljaCB0aGUgZXJyb3Igd2FzIHRocm93bi5cclxuICAgICAqICAgICAgICAgICAgICAgRGVmYXVsdHMgdG8gdGhlIHN0cmluZyBgXCJVbmhhbmRsZWQgcmVqZWN0aW9uIGluIGNhbmNlbGxlZCBwcm9taXNlLlwiYC5cclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IocHJvbWlzZTogQ2FuY2VsbGFibGVQcm9taXNlPHVua25vd24+LCByZWFzb24/OiBhbnksIGluZm8/OiBzdHJpbmcpIHtcclxuICAgICAgICBzdXBlcigoaW5mbyA/PyBcIlVuaGFuZGxlZCByZWplY3Rpb24gaW4gY2FuY2VsbGVkIHByb21pc2UuXCIpICsgXCIgUmVhc29uOiBcIiArIGVycm9yTWVzc2FnZShyZWFzb24pLCB7IGNhdXNlOiByZWFzb24gfSk7XHJcbiAgICAgICAgdGhpcy5wcm9taXNlID0gcHJvbWlzZTtcclxuICAgICAgICB0aGlzLm5hbWUgPSBcIkNhbmNlbGxlZFJlamVjdGlvbkVycm9yXCI7XHJcbiAgICB9XHJcbn1cclxuXHJcbnR5cGUgQ2FuY2VsbGFibGVQcm9taXNlUmVzb2x2ZXI8VD4gPSAodmFsdWU6IFQgfCBQcm9taXNlTGlrZTxUPiB8IENhbmNlbGxhYmxlUHJvbWlzZUxpa2U8VD4pID0+IHZvaWQ7XHJcbnR5cGUgQ2FuY2VsbGFibGVQcm9taXNlUmVqZWN0b3IgPSAocmVhc29uPzogYW55KSA9PiB2b2lkO1xyXG50eXBlIENhbmNlbGxhYmxlUHJvbWlzZUNhbmNlbGxlciA9IChjYXVzZT86IGFueSkgPT4gdm9pZCB8IFByb21pc2VMaWtlPHZvaWQ+O1xyXG50eXBlIENhbmNlbGxhYmxlUHJvbWlzZUV4ZWN1dG9yPFQ+ID0gKHJlc29sdmU6IENhbmNlbGxhYmxlUHJvbWlzZVJlc29sdmVyPFQ+LCByZWplY3Q6IENhbmNlbGxhYmxlUHJvbWlzZVJlamVjdG9yKSA9PiB2b2lkO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBDYW5jZWxsYWJsZVByb21pc2VMaWtlPFQ+IHtcclxuICAgIHRoZW48VFJlc3VsdDEgPSBULCBUUmVzdWx0MiA9IG5ldmVyPihvbmZ1bGZpbGxlZD86ICgodmFsdWU6IFQpID0+IFRSZXN1bHQxIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDE+IHwgQ2FuY2VsbGFibGVQcm9taXNlTGlrZTxUUmVzdWx0MT4pIHwgdW5kZWZpbmVkIHwgbnVsbCwgb25yZWplY3RlZD86ICgocmVhc29uOiBhbnkpID0+IFRSZXN1bHQyIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDI+IHwgQ2FuY2VsbGFibGVQcm9taXNlTGlrZTxUUmVzdWx0Mj4pIHwgdW5kZWZpbmVkIHwgbnVsbCk6IENhbmNlbGxhYmxlUHJvbWlzZUxpa2U8VFJlc3VsdDEgfCBUUmVzdWx0Mj47XHJcbiAgICBjYW5jZWwoY2F1c2U/OiBhbnkpOiB2b2lkIHwgUHJvbWlzZUxpa2U8dm9pZD47XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBXcmFwcyBhIGNhbmNlbGxhYmxlIHByb21pc2UgYWxvbmcgd2l0aCBpdHMgcmVzb2x1dGlvbiBtZXRob2RzLlxyXG4gKiBUaGUgYG9uY2FuY2VsbGVkYCBmaWVsZCB3aWxsIGJlIG51bGwgaW5pdGlhbGx5IGJ1dCBtYXkgYmUgc2V0IHRvIHByb3ZpZGUgYSBjdXN0b20gY2FuY2VsbGF0aW9uIGZ1bmN0aW9uLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBDYW5jZWxsYWJsZVByb21pc2VXaXRoUmVzb2x2ZXJzPFQ+IHtcclxuICAgIHByb21pc2U6IENhbmNlbGxhYmxlUHJvbWlzZTxUPjtcclxuICAgIHJlc29sdmU6IENhbmNlbGxhYmxlUHJvbWlzZVJlc29sdmVyPFQ+O1xyXG4gICAgcmVqZWN0OiBDYW5jZWxsYWJsZVByb21pc2VSZWplY3RvcjtcclxuICAgIG9uY2FuY2VsbGVkOiBDYW5jZWxsYWJsZVByb21pc2VDYW5jZWxsZXIgfCBudWxsO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgQ2FuY2VsbGFibGVQcm9taXNlU3RhdGUge1xyXG4gICAgcmVhZG9ubHkgcm9vdDogQ2FuY2VsbGFibGVQcm9taXNlU3RhdGU7XHJcbiAgICByZXNvbHZpbmc6IGJvb2xlYW47XHJcbiAgICBzZXR0bGVkOiBib29sZWFuO1xyXG4gICAgcmVhc29uPzogQ2FuY2VsRXJyb3I7XHJcbn1cclxuXHJcbi8vIFByaXZhdGUgZmllbGQgbmFtZXMuXHJcbmNvbnN0IGJhcnJpZXJTeW0gPSBTeW1ib2woXCJiYXJyaWVyXCIpO1xyXG5jb25zdCBjYW5jZWxJbXBsU3ltID0gU3ltYm9sKFwiY2FuY2VsSW1wbFwiKTtcclxuY29uc3Qgc3BlY2llcyA9IFN5bWJvbC5zcGVjaWVzID8/IFN5bWJvbChcInNwZWNpZXNQb2x5ZmlsbFwiKTtcclxuXHJcbi8qKlxyXG4gKiBBIHByb21pc2Ugd2l0aCBhbiBhdHRhY2hlZCBtZXRob2QgZm9yIGNhbmNlbGxpbmcgbG9uZy1ydW5uaW5nIG9wZXJhdGlvbnMgKHNlZSB7QGxpbmsgQ2FuY2VsbGFibGVQcm9taXNlI2NhbmNlbH0pLlxyXG4gKiBDYW5jZWxsYXRpb24gY2FuIG9wdGlvbmFsbHkgYmUgYm91bmQgdG8gYW4ge0BsaW5rIEFib3J0U2lnbmFsfVxyXG4gKiBmb3IgYmV0dGVyIGNvbXBvc2FiaWxpdHkgKHNlZSB7QGxpbmsgQ2FuY2VsbGFibGVQcm9taXNlI2NhbmNlbE9ufSkuXHJcbiAqXHJcbiAqIENhbmNlbGxpbmcgYSBwZW5kaW5nIHByb21pc2Ugd2lsbCByZXN1bHQgaW4gYW4gaW1tZWRpYXRlIHJlamVjdGlvblxyXG4gKiB3aXRoIGFuIGluc3RhbmNlIG9mIHtAbGluayBDYW5jZWxFcnJvcn0gYXMgcmVhc29uLFxyXG4gKiBidXQgd2hvZXZlciBzdGFydGVkIHRoZSBwcm9taXNlIHdpbGwgYmUgcmVzcG9uc2libGVcclxuICogZm9yIGFjdHVhbGx5IGFib3J0aW5nIHRoZSB1bmRlcmx5aW5nIG9wZXJhdGlvbi5cclxuICogVG8gdGhpcyBwdXJwb3NlLCB0aGUgY29uc3RydWN0b3IgYW5kIGFsbCBjaGFpbmluZyBtZXRob2RzXHJcbiAqIGFjY2VwdCBvcHRpb25hbCBjYW5jZWxsYXRpb24gY2FsbGJhY2tzLlxyXG4gKlxyXG4gKiBJZiBhIGBDYW5jZWxsYWJsZVByb21pc2VgIHN0aWxsIHJlc29sdmVzIGFmdGVyIGhhdmluZyBiZWVuIGNhbmNlbGxlZCxcclxuICogdGhlIHJlc3VsdCB3aWxsIGJlIGRpc2NhcmRlZC4gSWYgaXQgcmVqZWN0cywgdGhlIHJlYXNvblxyXG4gKiB3aWxsIGJlIHJlcG9ydGVkIGFzIGFuIHVuaGFuZGxlZCByZWplY3Rpb24sXHJcbiAqIHdyYXBwZWQgaW4gYSB7QGxpbmsgQ2FuY2VsbGVkUmVqZWN0aW9uRXJyb3J9IGluc3RhbmNlLlxyXG4gKiBUbyBmYWNpbGl0YXRlIHRoZSBoYW5kbGluZyBvZiBjYW5jZWxsYXRpb24gcmVxdWVzdHMsXHJcbiAqIGNhbmNlbGxlZCBgQ2FuY2VsbGFibGVQcm9taXNlYHMgd2lsbCBfbm90XyByZXBvcnQgdW5oYW5kbGVkIGBDYW5jZWxFcnJvcmBzXHJcbiAqIHdob3NlIGBjYXVzZWAgZmllbGQgaXMgdGhlIHNhbWUgYXMgdGhlIG9uZSB3aXRoIHdoaWNoIHRoZSBjdXJyZW50IHByb21pc2Ugd2FzIGNhbmNlbGxlZC5cclxuICpcclxuICogQWxsIHVzdWFsIHByb21pc2UgbWV0aG9kcyBhcmUgZGVmaW5lZCBhbmQgcmV0dXJuIGEgYENhbmNlbGxhYmxlUHJvbWlzZWBcclxuICogd2hvc2UgY2FuY2VsIG1ldGhvZCB3aWxsIGNhbmNlbCB0aGUgcGFyZW50IG9wZXJhdGlvbiBhcyB3ZWxsLCBwcm9wYWdhdGluZyB0aGUgY2FuY2VsbGF0aW9uIHJlYXNvblxyXG4gKiB1cHdhcmRzIHRocm91Z2ggcHJvbWlzZSBjaGFpbnMuXHJcbiAqIENvbnZlcnNlbHksIGNhbmNlbGxpbmcgYSBwcm9taXNlIHdpbGwgbm90IGF1dG9tYXRpY2FsbHkgY2FuY2VsIGRlcGVuZGVudCBwcm9taXNlcyBkb3duc3RyZWFtOlxyXG4gKiBgYGB0c1xyXG4gKiBsZXQgcm9vdCA9IG5ldyBDYW5jZWxsYWJsZVByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4geyAuLi4gfSk7XHJcbiAqIGxldCBjaGlsZDEgPSByb290LnRoZW4oKCkgPT4geyAuLi4gfSk7XHJcbiAqIGxldCBjaGlsZDIgPSBjaGlsZDEudGhlbigoKSA9PiB7IC4uLiB9KTtcclxuICogbGV0IGNoaWxkMyA9IHJvb3QuY2F0Y2goKCkgPT4geyAuLi4gfSk7XHJcbiAqIGNoaWxkMS5jYW5jZWwoKTsgLy8gQ2FuY2VscyBjaGlsZDEgYW5kIHJvb3QsIGJ1dCBub3QgY2hpbGQyIG9yIGNoaWxkM1xyXG4gKiBgYGBcclxuICogQ2FuY2VsbGluZyBhIHByb21pc2UgdGhhdCBoYXMgYWxyZWFkeSBzZXR0bGVkIGlzIHNhZmUgYW5kIGhhcyBubyBjb25zZXF1ZW5jZS5cclxuICpcclxuICogVGhlIGBjYW5jZWxgIG1ldGhvZCByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IF9hbHdheXMgZnVsZmlsbHNfXHJcbiAqIGFmdGVyIHRoZSB3aG9sZSBjaGFpbiBoYXMgcHJvY2Vzc2VkIHRoZSBjYW5jZWwgcmVxdWVzdFxyXG4gKiBhbmQgYWxsIGF0dGFjaGVkIGNhbGxiYWNrcyB1cCB0byB0aGF0IG1vbWVudCBoYXZlIHJ1bi5cclxuICpcclxuICogQWxsIEVTMjAyNCBwcm9taXNlIG1ldGhvZHMgKHN0YXRpYyBhbmQgaW5zdGFuY2UpIGFyZSBkZWZpbmVkIG9uIENhbmNlbGxhYmxlUHJvbWlzZSxcclxuICogYnV0IGFjdHVhbCBhdmFpbGFiaWxpdHkgbWF5IHZhcnkgd2l0aCBPUy93ZWJ2aWV3IHZlcnNpb24uXHJcbiAqXHJcbiAqIEluIGxpbmUgd2l0aCB0aGUgcHJvcG9zYWwgYXQgaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtcm0tYnVpbHRpbi1zdWJjbGFzc2luZyxcclxuICogYENhbmNlbGxhYmxlUHJvbWlzZWAgZG9lcyBub3Qgc3VwcG9ydCB0cmFuc3BhcmVudCBzdWJjbGFzc2luZy5cclxuICogRXh0ZW5kZXJzIHNob3VsZCB0YWtlIGNhcmUgdG8gcHJvdmlkZSB0aGVpciBvd24gbWV0aG9kIGltcGxlbWVudGF0aW9ucy5cclxuICogVGhpcyBtaWdodCBiZSByZWNvbnNpZGVyZWQgaW4gY2FzZSB0aGUgcHJvcG9zYWwgaXMgcmV0aXJlZC5cclxuICpcclxuICogQ2FuY2VsbGFibGVQcm9taXNlIGlzIGEgd3JhcHBlciBhcm91bmQgdGhlIERPTSBQcm9taXNlIG9iamVjdFxyXG4gKiBhbmQgaXMgY29tcGxpYW50IHdpdGggdGhlIFtQcm9taXNlcy9BKyBzcGVjaWZpY2F0aW9uXShodHRwczovL3Byb21pc2VzYXBsdXMuY29tLylcclxuICogKGl0IHBhc3NlcyB0aGUgW2NvbXBsaWFuY2Ugc3VpdGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9wcm9taXNlcy1hcGx1cy9wcm9taXNlcy10ZXN0cykpXHJcbiAqIGlmIHNvIGlzIHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIENhbmNlbGxhYmxlUHJvbWlzZTxUPiBleHRlbmRzIFByb21pc2U8VD4gaW1wbGVtZW50cyBQcm9taXNlTGlrZTxUPiwgQ2FuY2VsbGFibGVQcm9taXNlTGlrZTxUPiB7XHJcbiAgICAvLyBQcml2YXRlIGZpZWxkcy5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgW2JhcnJpZXJTeW1dITogUGFydGlhbDxQcm9taXNlV2l0aFJlc29sdmVyczx2b2lkPj4gfCBudWxsO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBbY2FuY2VsSW1wbFN5bV0hOiAocmVhc29uOiBDYW5jZWxFcnJvcikgPT4gdm9pZCB8IFByb21pc2VMaWtlPHZvaWQ+O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIG5ldyBgQ2FuY2VsbGFibGVQcm9taXNlYC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZXhlY3V0b3IgLSBBIGNhbGxiYWNrIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcHJvbWlzZS4gVGhpcyBjYWxsYmFjayBpcyBwYXNzZWQgdHdvIGFyZ3VtZW50czpcclxuICAgICAqICAgICAgICAgICAgICAgICAgIGEgYHJlc29sdmVgIGNhbGxiYWNrIHVzZWQgdG8gcmVzb2x2ZSB0aGUgcHJvbWlzZSB3aXRoIGEgdmFsdWVcclxuICAgICAqICAgICAgICAgICAgICAgICAgIG9yIHRoZSByZXN1bHQgb2YgYW5vdGhlciBwcm9taXNlIChwb3NzaWJseSBjYW5jZWxsYWJsZSksXHJcbiAgICAgKiAgICAgICAgICAgICAgICAgICBhbmQgYSBgcmVqZWN0YCBjYWxsYmFjayB1c2VkIHRvIHJlamVjdCB0aGUgcHJvbWlzZSB3aXRoIGEgcHJvdmlkZWQgcmVhc29uIG9yIGVycm9yLlxyXG4gICAgICogICAgICAgICAgICAgICAgICAgSWYgdGhlIHZhbHVlIHByb3ZpZGVkIHRvIHRoZSBgcmVzb2x2ZWAgY2FsbGJhY2sgaXMgYSB0aGVuYWJsZSBfYW5kXyBjYW5jZWxsYWJsZSBvYmplY3RcclxuICAgICAqICAgICAgICAgICAgICAgICAgIChpdCBoYXMgYSBgdGhlbmAgX2FuZF8gYSBgY2FuY2VsYCBtZXRob2QpLFxyXG4gICAgICogICAgICAgICAgICAgICAgICAgY2FuY2VsbGF0aW9uIHJlcXVlc3RzIHdpbGwgYmUgZm9yd2FyZGVkIHRvIHRoYXQgb2JqZWN0IGFuZCB0aGUgb25jYW5jZWxsZWQgd2lsbCBub3QgYmUgaW52b2tlZCBhbnltb3JlLlxyXG4gICAgICogICAgICAgICAgICAgICAgICAgSWYgYW55IG9uZSBvZiB0aGUgdHdvIGNhbGxiYWNrcyBpcyBjYWxsZWQgX2FmdGVyXyB0aGUgcHJvbWlzZSBoYXMgYmVlbiBjYW5jZWxsZWQsXHJcbiAgICAgKiAgICAgICAgICAgICAgICAgICB0aGUgcHJvdmlkZWQgdmFsdWVzIHdpbGwgYmUgY2FuY2VsbGVkIGFuZCByZXNvbHZlZCBhcyB1c3VhbCxcclxuICAgICAqICAgICAgICAgICAgICAgICAgIGJ1dCB0aGVpciByZXN1bHRzIHdpbGwgYmUgZGlzY2FyZGVkLlxyXG4gICAgICogICAgICAgICAgICAgICAgICAgSG93ZXZlciwgaWYgdGhlIHJlc29sdXRpb24gcHJvY2VzcyB1bHRpbWF0ZWx5IGVuZHMgdXAgaW4gYSByZWplY3Rpb25cclxuICAgICAqICAgICAgICAgICAgICAgICAgIHRoYXQgaXMgbm90IGR1ZSB0byBjYW5jZWxsYXRpb24sIHRoZSByZWplY3Rpb24gcmVhc29uXHJcbiAgICAgKiAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHdyYXBwZWQgaW4gYSB7QGxpbmsgQ2FuY2VsbGVkUmVqZWN0aW9uRXJyb3J9XHJcbiAgICAgKiAgICAgICAgICAgICAgICAgICBhbmQgYnViYmxlZCB1cCBhcyBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uLlxyXG4gICAgICogQHBhcmFtIG9uY2FuY2VsbGVkIC0gSXQgaXMgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGVuc3VyZSB0aGF0IGFueSBvcGVyYXRpb25cclxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZWQgYnkgdGhlIGV4ZWN1dG9yIGlzIHByb3Blcmx5IGhhbHRlZCB1cG9uIGNhbmNlbGxhdGlvbi5cclxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIFRoaXMgb3B0aW9uYWwgY2FsbGJhY2sgY2FuIGJlIHVzZWQgdG8gdGhhdCBwdXJwb3NlLlxyXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgSXQgd2lsbCBiZSBjYWxsZWQgX3N5bmNocm9ub3VzbHlfIHdpdGggYSBjYW5jZWxsYXRpb24gY2F1c2VcclxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIHdoZW4gY2FuY2VsbGF0aW9uIGlzIHJlcXVlc3RlZCwgX2FmdGVyXyB0aGUgcHJvbWlzZSBoYXMgYWxyZWFkeSByZWplY3RlZFxyXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgd2l0aCBhIHtAbGluayBDYW5jZWxFcnJvcn0sIGJ1dCBfYmVmb3JlX1xyXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgYW55IHtAbGluayB0aGVufS97QGxpbmsgY2F0Y2h9L3tAbGluayBmaW5hbGx5fSBjYWxsYmFjayBydW5zLlxyXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIGNhbGxiYWNrIHJldHVybnMgYSB0aGVuYWJsZSwgdGhlIHByb21pc2UgcmV0dXJuZWQgZnJvbSB7QGxpbmsgY2FuY2VsfVxyXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgd2lsbCBvbmx5IGZ1bGZpbGwgYWZ0ZXIgdGhlIGZvcm1lciBoYXMgc2V0dGxlZC5cclxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIFVuaGFuZGxlZCBleGNlcHRpb25zIG9yIHJlamVjdGlvbnMgZnJvbSB0aGUgY2FsbGJhY2sgd2lsbCBiZSB3cmFwcGVkXHJcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBpbiBhIHtAbGluayBDYW5jZWxsZWRSZWplY3Rpb25FcnJvcn0gYW5kIGJ1YmJsZWQgdXAgYXMgdW5oYW5kbGVkIHJlamVjdGlvbnMuXHJcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgYHJlc29sdmVgIGNhbGxiYWNrIGlzIGNhbGxlZCBiZWZvcmUgY2FuY2VsbGF0aW9uIHdpdGggYSBjYW5jZWxsYWJsZSBwcm9taXNlLFxyXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGF0aW9uIHJlcXVlc3RzIG9uIHRoaXMgcHJvbWlzZSB3aWxsIGJlIGRpdmVydGVkIHRvIHRoYXQgcHJvbWlzZSxcclxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGUgb3JpZ2luYWwgYG9uY2FuY2VsbGVkYCBjYWxsYmFjayB3aWxsIGJlIGRpc2NhcmRlZC5cclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoZXhlY3V0b3I6IENhbmNlbGxhYmxlUHJvbWlzZUV4ZWN1dG9yPFQ+LCBvbmNhbmNlbGxlZD86IENhbmNlbGxhYmxlUHJvbWlzZUNhbmNlbGxlcikge1xyXG4gICAgICAgIGxldCByZXNvbHZlITogKHZhbHVlOiBUIHwgUHJvbWlzZUxpa2U8VD4pID0+IHZvaWQ7XHJcbiAgICAgICAgbGV0IHJlamVjdCE6IChyZWFzb24/OiBhbnkpID0+IHZvaWQ7XHJcbiAgICAgICAgc3VwZXIoKHJlcywgcmVqKSA9PiB7IHJlc29sdmUgPSByZXM7IHJlamVjdCA9IHJlajsgfSk7XHJcblxyXG4gICAgICAgIGlmICgodGhpcy5jb25zdHJ1Y3RvciBhcyBhbnkpW3NwZWNpZXNdICE9PSBQcm9taXNlKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5jZWxsYWJsZVByb21pc2UgZG9lcyBub3Qgc3VwcG9ydCB0cmFuc3BhcmVudCBzdWJjbGFzc2luZy4gUGxlYXNlIHJlZnJhaW4gZnJvbSBvdmVycmlkaW5nIHRoZSBbU3ltYm9sLnNwZWNpZXNdIHN0YXRpYyBwcm9wZXJ0eS5cIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgcHJvbWlzZTogQ2FuY2VsbGFibGVQcm9taXNlV2l0aFJlc29sdmVyczxUPiA9IHtcclxuICAgICAgICAgICAgcHJvbWlzZTogdGhpcyxcclxuICAgICAgICAgICAgcmVzb2x2ZSxcclxuICAgICAgICAgICAgcmVqZWN0LFxyXG4gICAgICAgICAgICBnZXQgb25jYW5jZWxsZWQoKSB7IHJldHVybiBvbmNhbmNlbGxlZCA/PyBudWxsOyB9LFxyXG4gICAgICAgICAgICBzZXQgb25jYW5jZWxsZWQoY2IpIHsgb25jYW5jZWxsZWQgPSBjYiA/PyB1bmRlZmluZWQ7IH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBjb25zdCBzdGF0ZTogQ2FuY2VsbGFibGVQcm9taXNlU3RhdGUgPSB7XHJcbiAgICAgICAgICAgIGdldCByb290KCkgeyByZXR1cm4gc3RhdGU7IH0sXHJcbiAgICAgICAgICAgIHJlc29sdmluZzogZmFsc2UsXHJcbiAgICAgICAgICAgIHNldHRsZWQ6IGZhbHNlXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLy8gU2V0dXAgY2FuY2VsbGF0aW9uIHN5c3RlbS5cclxuICAgICAgICB2b2lkIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHtcclxuICAgICAgICAgICAgW2JhcnJpZXJTeW1dOiB7XHJcbiAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIHZhbHVlOiBudWxsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIFtjYW5jZWxJbXBsU3ltXToge1xyXG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgdmFsdWU6IGNhbmNlbGxlckZvcihwcm9taXNlLCBzdGF0ZSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBSdW4gdGhlIGFjdHVhbCBleGVjdXRvci5cclxuICAgICAgICBjb25zdCByZWplY3RvciA9IHJlamVjdG9yRm9yKHByb21pc2UsIHN0YXRlKTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBleGVjdXRvcihyZXNvbHZlckZvcihwcm9taXNlLCBzdGF0ZSksIHJlamVjdG9yKTtcclxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgaWYgKHN0YXRlLnJlc29sdmluZykge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJVbmhhbmRsZWQgZXhjZXB0aW9uIGluIENhbmNlbGxhYmxlUHJvbWlzZSBleGVjdXRvci5cIiwgZXJyKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJlamVjdG9yKGVycik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYW5jZWxzIGltbWVkaWF0ZWx5IHRoZSBleGVjdXRpb24gb2YgdGhlIG9wZXJhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBwcm9taXNlLlxyXG4gICAgICogVGhlIHByb21pc2UgcmVqZWN0cyB3aXRoIGEge0BsaW5rIENhbmNlbEVycm9yfSBpbnN0YW5jZSBhcyByZWFzb24sXHJcbiAgICAgKiB3aXRoIHRoZSB7QGxpbmsgQ2FuY2VsRXJyb3IjY2F1c2V9IHByb3BlcnR5IHNldCB0byB0aGUgZ2l2ZW4gYXJndW1lbnQsIGlmIGFueS5cclxuICAgICAqXHJcbiAgICAgKiBIYXMgbm8gZWZmZWN0IGlmIGNhbGxlZCBhZnRlciB0aGUgcHJvbWlzZSBoYXMgYWxyZWFkeSBzZXR0bGVkO1xyXG4gICAgICogcmVwZWF0ZWQgY2FsbHMgaW4gcGFydGljdWxhciBhcmUgc2FmZSwgYnV0IG9ubHkgdGhlIGZpcnN0IG9uZVxyXG4gICAgICogd2lsbCBzZXQgdGhlIGNhbmNlbGxhdGlvbiBjYXVzZS5cclxuICAgICAqXHJcbiAgICAgKiBUaGUgYENhbmNlbEVycm9yYCBleGNlcHRpb24gX25lZWQgbm90XyBiZSBoYW5kbGVkIGV4cGxpY2l0bHkgX29uIHRoZSBwcm9taXNlcyB0aGF0IGFyZSBiZWluZyBjYW5jZWxsZWQ6X1xyXG4gICAgICogY2FuY2VsbGluZyBhIHByb21pc2Ugd2l0aCBubyBhdHRhY2hlZCByZWplY3Rpb24gaGFuZGxlciBkb2VzIG5vdCB0cmlnZ2VyIGFuIHVuaGFuZGxlZCByZWplY3Rpb24gZXZlbnQuXHJcbiAgICAgKiBUaGVyZWZvcmUsIHRoZSBmb2xsb3dpbmcgaWRpb21zIGFyZSBhbGwgZXF1YWxseSBjb3JyZWN0OlxyXG4gICAgICogYGBgdHNcclxuICAgICAqIG5ldyBDYW5jZWxsYWJsZVByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4geyAuLi4gfSkuY2FuY2VsKCk7XHJcbiAgICAgKiBuZXcgQ2FuY2VsbGFibGVQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsgLi4uIH0pLnRoZW4oLi4uKS5jYW5jZWwoKTtcclxuICAgICAqIG5ldyBDYW5jZWxsYWJsZVByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4geyAuLi4gfSkudGhlbiguLi4pLmNhdGNoKC4uLikuY2FuY2VsKCk7XHJcbiAgICAgKiBgYGBcclxuICAgICAqIFdoZW5ldmVyIHNvbWUgY2FuY2VsbGVkIHByb21pc2UgaW4gYSBjaGFpbiByZWplY3RzIHdpdGggYSBgQ2FuY2VsRXJyb3JgXHJcbiAgICAgKiB3aXRoIHRoZSBzYW1lIGNhbmNlbGxhdGlvbiBjYXVzZSBhcyBpdHNlbGYsIHRoZSBlcnJvciB3aWxsIGJlIGRpc2NhcmRlZCBzaWxlbnRseS5cclxuICAgICAqIEhvd2V2ZXIsIHRoZSBgQ2FuY2VsRXJyb3JgIF93aWxsIHN0aWxsIGJlIGRlbGl2ZXJlZF8gdG8gYWxsIGF0dGFjaGVkIHJlamVjdGlvbiBoYW5kbGVyc1xyXG4gICAgICogYWRkZWQgYnkge0BsaW5rIHRoZW59IGFuZCByZWxhdGVkIG1ldGhvZHM6XHJcbiAgICAgKiBgYGB0c1xyXG4gICAgICogbGV0IGNhbmNlbGxhYmxlID0gbmV3IENhbmNlbGxhYmxlUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7IC4uLiB9KTtcclxuICAgICAqIGNhbmNlbGxhYmxlLnRoZW4oKCkgPT4geyAuLi4gfSkuY2F0Y2goY29uc29sZS5sb2cpO1xyXG4gICAgICogY2FuY2VsbGFibGUuY2FuY2VsKCk7IC8vIEEgQ2FuY2VsRXJyb3IgaXMgcHJpbnRlZCB0byB0aGUgY29uc29sZS5cclxuICAgICAqIGBgYFxyXG4gICAgICogSWYgdGhlIGBDYW5jZWxFcnJvcmAgaXMgbm90IGhhbmRsZWQgZG93bnN0cmVhbSBieSB0aGUgdGltZSBpdCByZWFjaGVzXHJcbiAgICAgKiBhIF9ub24tY2FuY2VsbGVkXyBwcm9taXNlLCBpdCBfd2lsbF8gdHJpZ2dlciBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uIGV2ZW50LFxyXG4gICAgICoganVzdCBsaWtlIG5vcm1hbCByZWplY3Rpb25zIHdvdWxkOlxyXG4gICAgICogYGBgdHNcclxuICAgICAqIGxldCBjYW5jZWxsYWJsZSA9IG5ldyBDYW5jZWxsYWJsZVByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4geyAuLi4gfSk7XHJcbiAgICAgKiBsZXQgY2hhaW5lZCA9IGNhbmNlbGxhYmxlLnRoZW4oKCkgPT4geyAuLi4gfSkudGhlbigoKSA9PiB7IC4uLiB9KTsgLy8gTm8gY2F0Y2guLi5cclxuICAgICAqIGNhbmNlbGxhYmxlLmNhbmNlbCgpOyAvLyBVbmhhbmRsZWQgcmVqZWN0aW9uIGV2ZW50IG9uIGNoYWluZWQhXHJcbiAgICAgKiBgYGBcclxuICAgICAqIFRoZXJlZm9yZSwgaXQgaXMgaW1wb3J0YW50IHRvIGVpdGhlciBjYW5jZWwgd2hvbGUgcHJvbWlzZSBjaGFpbnMgZnJvbSB0aGVpciB0YWlsLFxyXG4gICAgICogYXMgc2hvd24gaW4gdGhlIGNvcnJlY3QgaWRpb21zIGFib3ZlLCBvciB0YWtlIGNhcmUgb2YgaGFuZGxpbmcgZXJyb3JzIGV2ZXJ5d2hlcmUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgQSBjYW5jZWxsYWJsZSBwcm9taXNlIHRoYXQgX2Z1bGZpbGxzXyBhZnRlciB0aGUgY2FuY2VsIGNhbGxiYWNrIChpZiBhbnkpXHJcbiAgICAgKiBhbmQgYWxsIGhhbmRsZXJzIGF0dGFjaGVkIHVwIHRvIHRoZSBjYWxsIHRvIGNhbmNlbCBoYXZlIHJ1bi5cclxuICAgICAqIElmIHRoZSBjYW5jZWwgY2FsbGJhY2sgcmV0dXJucyBhIHRoZW5hYmxlLCB0aGUgcHJvbWlzZSByZXR1cm5lZCBieSBgY2FuY2VsYFxyXG4gICAgICogd2lsbCBhbHNvIHdhaXQgZm9yIHRoYXQgdGhlbmFibGUgdG8gc2V0dGxlLlxyXG4gICAgICogVGhpcyBlbmFibGVzIGNhbGxlcnMgdG8gd2FpdCBmb3IgdGhlIGNhbmNlbGxlZCBvcGVyYXRpb24gdG8gdGVybWluYXRlXHJcbiAgICAgKiB3aXRob3V0IGJlaW5nIGZvcmNlZCB0byBoYW5kbGUgcG90ZW50aWFsIGVycm9ycyBhdCB0aGUgY2FsbCBzaXRlLlxyXG4gICAgICogYGBgdHNcclxuICAgICAqIGNhbmNlbGxhYmxlLmNhbmNlbCgpLnRoZW4oKCkgPT4ge1xyXG4gICAgICogICAgIC8vIENsZWFudXAgZmluaXNoZWQsIGl0J3Mgc2FmZSB0byBkbyBzb21ldGhpbmcgZWxzZS5cclxuICAgICAqIH0sIChlcnIpID0+IHtcclxuICAgICAqICAgICAvLyBVbnJlYWNoYWJsZTogdGhlIHByb21pc2UgcmV0dXJuZWQgZnJvbSBjYW5jZWwgd2lsbCBuZXZlciByZWplY3QuXHJcbiAgICAgKiB9KTtcclxuICAgICAqIGBgYFxyXG4gICAgICogTm90ZSB0aGF0IHRoZSByZXR1cm5lZCBwcm9taXNlIHdpbGwgX25vdF8gaGFuZGxlIGltcGxpY2l0bHkgYW55IHJlamVjdGlvblxyXG4gICAgICogdGhhdCBtaWdodCBoYXZlIG9jY3VycmVkIGFscmVhZHkgaW4gdGhlIGNhbmNlbGxlZCBjaGFpbi5cclxuICAgICAqIEl0IHdpbGwganVzdCB0cmFjayB3aGV0aGVyIHJlZ2lzdGVyZWQgaGFuZGxlcnMgaGF2ZSBiZWVuIGV4ZWN1dGVkIG9yIG5vdC5cclxuICAgICAqIFRoZXJlZm9yZSwgdW5oYW5kbGVkIHJlamVjdGlvbnMgd2lsbCBuZXZlciBiZSBzaWxlbnRseSBoYW5kbGVkIGJ5IGNhbGxpbmcgY2FuY2VsLlxyXG4gICAgICovXHJcbiAgICBjYW5jZWwoY2F1c2U/OiBhbnkpOiBDYW5jZWxsYWJsZVByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIHJldHVybiBuZXcgQ2FuY2VsbGFibGVQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIElOVkFSSUFOVDogdGhlIHJlc3VsdCBvZiB0aGlzW2NhbmNlbEltcGxTeW1dIGFuZCB0aGUgYmFycmllciBkbyBub3QgZXZlciByZWplY3QuXHJcbiAgICAgICAgICAgIC8vIFVuZm9ydHVuYXRlbHkgbWFjT1MgSGlnaCBTaWVycmEgZG9lcyBub3Qgc3VwcG9ydCBQcm9taXNlLmFsbFNldHRsZWQuXHJcbiAgICAgICAgICAgIFByb21pc2UuYWxsKFtcclxuICAgICAgICAgICAgICAgIHRoaXNbY2FuY2VsSW1wbFN5bV0obmV3IENhbmNlbEVycm9yKFwiUHJvbWlzZSBjYW5jZWxsZWQuXCIsIHsgY2F1c2UgfSkpLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudEJhcnJpZXIodGhpcylcclxuICAgICAgICAgICAgXSkudGhlbigoKSA9PiByZXNvbHZlKCksICgpID0+IHJlc29sdmUoKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBCaW5kcyBwcm9taXNlIGNhbmNlbGxhdGlvbiB0byB0aGUgYWJvcnQgZXZlbnQgb2YgdGhlIGdpdmVuIHtAbGluayBBYm9ydFNpZ25hbH0uXHJcbiAgICAgKiBJZiB0aGUgc2lnbmFsIGhhcyBhbHJlYWR5IGFib3J0ZWQsIHRoZSBwcm9taXNlIHdpbGwgYmUgY2FuY2VsbGVkIGltbWVkaWF0ZWx5LlxyXG4gICAgICogV2hlbiBlaXRoZXIgY29uZGl0aW9uIGlzIHZlcmlmaWVkLCB0aGUgY2FuY2VsbGF0aW9uIGNhdXNlIHdpbGwgYmUgc2V0XHJcbiAgICAgKiB0byB0aGUgc2lnbmFsJ3MgYWJvcnQgcmVhc29uIChzZWUge0BsaW5rIEFib3J0U2lnbmFsI3JlYXNvbn0pLlxyXG4gICAgICpcclxuICAgICAqIEhhcyBubyBlZmZlY3QgaWYgY2FsbGVkIChvciBpZiB0aGUgc2lnbmFsIGFib3J0cykgX2FmdGVyXyB0aGUgcHJvbWlzZSBoYXMgYWxyZWFkeSBzZXR0bGVkLlxyXG4gICAgICogT25seSB0aGUgZmlyc3Qgc2lnbmFsIHRvIGFib3J0IHdpbGwgc2V0IHRoZSBjYW5jZWxsYXRpb24gY2F1c2UuXHJcbiAgICAgKlxyXG4gICAgICogRm9yIG1vcmUgZGV0YWlscyBhYm91dCB0aGUgY2FuY2VsbGF0aW9uIHByb2Nlc3MsXHJcbiAgICAgKiBzZWUge0BsaW5rIGNhbmNlbH0gYW5kIHRoZSBgQ2FuY2VsbGFibGVQcm9taXNlYCBjb25zdHJ1Y3Rvci5cclxuICAgICAqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBlbmFibGVzIGBhd2FpdGBpbmcgY2FuY2VsbGFibGUgcHJvbWlzZXMgd2l0aG91dCBoYXZpbmdcclxuICAgICAqIHRvIHN0b3JlIHRoZW0gZm9yIGZ1dHVyZSBjYW5jZWxsYXRpb24sIGUuZy46XHJcbiAgICAgKiBgYGB0c1xyXG4gICAgICogYXdhaXQgbG9uZ1J1bm5pbmdPcGVyYXRpb24oKS5jYW5jZWxPbihzaWduYWwpO1xyXG4gICAgICogYGBgXHJcbiAgICAgKiBpbnN0ZWFkIG9mOlxyXG4gICAgICogYGBgdHNcclxuICAgICAqIGxldCBwcm9taXNlVG9CZUNhbmNlbGxlZCA9IGxvbmdSdW5uaW5nT3BlcmF0aW9uKCk7XHJcbiAgICAgKiBhd2FpdCBwcm9taXNlVG9CZUNhbmNlbGxlZDtcclxuICAgICAqIGBgYFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIFRoaXMgcHJvbWlzZSwgZm9yIG1ldGhvZCBjaGFpbmluZy5cclxuICAgICAqL1xyXG4gICAgY2FuY2VsT24oc2lnbmFsOiBBYm9ydFNpZ25hbCk6IENhbmNlbGxhYmxlUHJvbWlzZTxUPiB7XHJcbiAgICAgICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7XHJcbiAgICAgICAgICAgIHZvaWQgdGhpcy5jYW5jZWwoc2lnbmFsLnJlYXNvbilcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PiB2b2lkIHRoaXMuY2FuY2VsKHNpZ25hbC5yZWFzb24pLCB7Y2FwdHVyZTogdHJ1ZX0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBdHRhY2hlcyBjYWxsYmFja3MgZm9yIHRoZSByZXNvbHV0aW9uIGFuZC9vciByZWplY3Rpb24gb2YgdGhlIGBDYW5jZWxsYWJsZVByb21pc2VgLlxyXG4gICAgICpcclxuICAgICAqIFRoZSBvcHRpb25hbCBgb25jYW5jZWxsZWRgIGFyZ3VtZW50IHdpbGwgYmUgaW52b2tlZCB3aGVuIHRoZSByZXR1cm5lZCBwcm9taXNlIGlzIGNhbmNlbGxlZCxcclxuICAgICAqIHdpdGggdGhlIHNhbWUgc2VtYW50aWNzIGFzIHRoZSBgb25jYW5jZWxsZWRgIGFyZ3VtZW50IG9mIHRoZSBjb25zdHJ1Y3Rvci5cclxuICAgICAqIFdoZW4gdGhlIHBhcmVudCBwcm9taXNlIHJlamVjdHMgb3IgaXMgY2FuY2VsbGVkLCB0aGUgYG9ucmVqZWN0ZWRgIGNhbGxiYWNrIHdpbGwgcnVuLFxyXG4gICAgICogX2V2ZW4gYWZ0ZXIgdGhlIHJldHVybmVkIHByb21pc2UgaGFzIGJlZW4gY2FuY2VsbGVkOl9cclxuICAgICAqIGluIHRoYXQgY2FzZSwgc2hvdWxkIGl0IHJlamVjdCBvciB0aHJvdywgdGhlIHJlYXNvbiB3aWxsIGJlIHdyYXBwZWRcclxuICAgICAqIGluIGEge0BsaW5rIENhbmNlbGxlZFJlamVjdGlvbkVycm9yfSBhbmQgYnViYmxlZCB1cCBhcyBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBvbmZ1bGZpbGxlZCBUaGUgY2FsbGJhY2sgdG8gZXhlY3V0ZSB3aGVuIHRoZSBQcm9taXNlIGlzIHJlc29sdmVkLlxyXG4gICAgICogQHBhcmFtIG9ucmVqZWN0ZWQgVGhlIGNhbGxiYWNrIHRvIGV4ZWN1dGUgd2hlbiB0aGUgUHJvbWlzZSBpcyByZWplY3RlZC5cclxuICAgICAqIEByZXR1cm5zIEEgYENhbmNlbGxhYmxlUHJvbWlzZWAgZm9yIHRoZSBjb21wbGV0aW9uIG9mIHdoaWNoZXZlciBjYWxsYmFjayBpcyBleGVjdXRlZC5cclxuICAgICAqIFRoZSByZXR1cm5lZCBwcm9taXNlIGlzIGhvb2tlZCB1cCB0byBwcm9wYWdhdGUgY2FuY2VsbGF0aW9uIHJlcXVlc3RzIHVwIHRoZSBjaGFpbiwgYnV0IG5vdCBkb3duOlxyXG4gICAgICpcclxuICAgICAqICAgLSBpZiB0aGUgcGFyZW50IHByb21pc2UgaXMgY2FuY2VsbGVkLCB0aGUgYG9ucmVqZWN0ZWRgIGhhbmRsZXIgd2lsbCBiZSBpbnZva2VkIHdpdGggYSBgQ2FuY2VsRXJyb3JgXHJcbiAgICAgKiAgICAgYW5kIHRoZSByZXR1cm5lZCBwcm9taXNlIF93aWxsIHJlc29sdmUgcmVndWxhcmx5XyB3aXRoIGl0cyByZXN1bHQ7XHJcbiAgICAgKiAgIC0gY29udmVyc2VseSwgaWYgdGhlIHJldHVybmVkIHByb21pc2UgaXMgY2FuY2VsbGVkLCBfdGhlIHBhcmVudCBwcm9taXNlIGlzIGNhbmNlbGxlZCB0b287X1xyXG4gICAgICogICAgIHRoZSBgb25yZWplY3RlZGAgaGFuZGxlciB3aWxsIHN0aWxsIGJlIGludm9rZWQgd2l0aCB0aGUgcGFyZW50J3MgYENhbmNlbEVycm9yYCxcclxuICAgICAqICAgICBidXQgaXRzIHJlc3VsdCB3aWxsIGJlIGRpc2NhcmRlZFxyXG4gICAgICogICAgIGFuZCB0aGUgcmV0dXJuZWQgcHJvbWlzZSB3aWxsIHJlamVjdCB3aXRoIGEgYENhbmNlbEVycm9yYCBhcyB3ZWxsLlxyXG4gICAgICpcclxuICAgICAqIFRoZSBwcm9taXNlIHJldHVybmVkIGZyb20ge0BsaW5rIGNhbmNlbH0gd2lsbCBmdWxmaWxsIG9ubHkgYWZ0ZXIgYWxsIGF0dGFjaGVkIGhhbmRsZXJzXHJcbiAgICAgKiB1cCB0aGUgZW50aXJlIHByb21pc2UgY2hhaW4gaGF2ZSBiZWVuIHJ1bi5cclxuICAgICAqXHJcbiAgICAgKiBJZiBlaXRoZXIgY2FsbGJhY2sgcmV0dXJucyBhIGNhbmNlbGxhYmxlIHByb21pc2UsXHJcbiAgICAgKiBjYW5jZWxsYXRpb24gcmVxdWVzdHMgd2lsbCBiZSBkaXZlcnRlZCB0byBpdCxcclxuICAgICAqIGFuZCB0aGUgc3BlY2lmaWVkIGBvbmNhbmNlbGxlZGAgY2FsbGJhY2sgd2lsbCBiZSBkaXNjYXJkZWQuXHJcbiAgICAgKi9cclxuICAgIHRoZW48VFJlc3VsdDEgPSBULCBUUmVzdWx0MiA9IG5ldmVyPihvbmZ1bGZpbGxlZD86ICgodmFsdWU6IFQpID0+IFRSZXN1bHQxIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDE+IHwgQ2FuY2VsbGFibGVQcm9taXNlTGlrZTxUUmVzdWx0MT4pIHwgdW5kZWZpbmVkIHwgbnVsbCwgb25yZWplY3RlZD86ICgocmVhc29uOiBhbnkpID0+IFRSZXN1bHQyIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDI+IHwgQ2FuY2VsbGFibGVQcm9taXNlTGlrZTxUUmVzdWx0Mj4pIHwgdW5kZWZpbmVkIHwgbnVsbCwgb25jYW5jZWxsZWQ/OiBDYW5jZWxsYWJsZVByb21pc2VDYW5jZWxsZXIpOiBDYW5jZWxsYWJsZVByb21pc2U8VFJlc3VsdDEgfCBUUmVzdWx0Mj4ge1xyXG4gICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBDYW5jZWxsYWJsZVByb21pc2UpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5jZWxsYWJsZVByb21pc2UucHJvdG90eXBlLnRoZW4gY2FsbGVkIG9uIGFuIGludmFsaWQgb2JqZWN0LlwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIE5PVEU6IFR5cGVTY3JpcHQncyBidWlsdC1pbiB0eXBlIGZvciB0aGVuIGlzIGJyb2tlbixcclxuICAgICAgICAvLyBhcyBpdCBhbGxvd3Mgc3BlY2lmeWluZyBhbiBhcmJpdHJhcnkgVFJlc3VsdDEgIT0gVCBldmVuIHdoZW4gb25mdWxmaWxsZWQgaXMgbm90IGEgZnVuY3Rpb24uXHJcbiAgICAgICAgLy8gV2UgY2Fubm90IGZpeCBpdCBpZiB3ZSB3YW50IHRvIENhbmNlbGxhYmxlUHJvbWlzZSB0byBpbXBsZW1lbnQgUHJvbWlzZUxpa2U8VD4uXHJcblxyXG4gICAgICAgIGlmICghaXNDYWxsYWJsZShvbmZ1bGZpbGxlZCkpIHsgb25mdWxmaWxsZWQgPSBpZGVudGl0eSBhcyBhbnk7IH1cclxuICAgICAgICBpZiAoIWlzQ2FsbGFibGUob25yZWplY3RlZCkpIHsgb25yZWplY3RlZCA9IHRocm93ZXI7IH1cclxuXHJcbiAgICAgICAgaWYgKG9uZnVsZmlsbGVkID09PSBpZGVudGl0eSAmJiBvbnJlamVjdGVkID09IHRocm93ZXIpIHtcclxuICAgICAgICAgICAgLy8gU2hvcnRjdXQgZm9yIHRyaXZpYWwgYXJndW1lbnRzLlxyXG4gICAgICAgICAgICByZXR1cm4gbmV3IENhbmNlbGxhYmxlUHJvbWlzZSgocmVzb2x2ZSkgPT4gcmVzb2x2ZSh0aGlzIGFzIGFueSkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgYmFycmllcjogUGFydGlhbDxQcm9taXNlV2l0aFJlc29sdmVyczx2b2lkPj4gPSB7fTtcclxuICAgICAgICB0aGlzW2JhcnJpZXJTeW1dID0gYmFycmllcjtcclxuXHJcbiAgICAgICAgcmV0dXJuIG5ldyBDYW5jZWxsYWJsZVByb21pc2U8VFJlc3VsdDEgfCBUUmVzdWx0Mj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICB2b2lkIHN1cGVyLnRoZW4oXHJcbiAgICAgICAgICAgICAgICAodmFsdWUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpc1tiYXJyaWVyU3ltXSA9PT0gYmFycmllcikgeyB0aGlzW2JhcnJpZXJTeW1dID0gbnVsbDsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJhcnJpZXIucmVzb2x2ZT8uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUob25mdWxmaWxsZWQhKHZhbHVlKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAocmVhc29uPykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzW2JhcnJpZXJTeW1dID09PSBiYXJyaWVyKSB7IHRoaXNbYmFycmllclN5bV0gPSBudWxsOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgYmFycmllci5yZXNvbHZlPy4oKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShvbnJlamVjdGVkIShyZWFzb24pKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0sIGFzeW5jIChjYXVzZT8pID0+IHtcclxuICAgICAgICAgICAgLy9jYW5jZWxsZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9uY2FuY2VsbGVkPy4oY2F1c2UpO1xyXG4gICAgICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jYW5jZWwoY2F1c2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBdHRhY2hlcyBhIGNhbGxiYWNrIGZvciBvbmx5IHRoZSByZWplY3Rpb24gb2YgdGhlIFByb21pc2UuXHJcbiAgICAgKlxyXG4gICAgICogVGhlIG9wdGlvbmFsIGBvbmNhbmNlbGxlZGAgYXJndW1lbnQgd2lsbCBiZSBpbnZva2VkIHdoZW4gdGhlIHJldHVybmVkIHByb21pc2UgaXMgY2FuY2VsbGVkLFxyXG4gICAgICogd2l0aCB0aGUgc2FtZSBzZW1hbnRpY3MgYXMgdGhlIGBvbmNhbmNlbGxlZGAgYXJndW1lbnQgb2YgdGhlIGNvbnN0cnVjdG9yLlxyXG4gICAgICogV2hlbiB0aGUgcGFyZW50IHByb21pc2UgcmVqZWN0cyBvciBpcyBjYW5jZWxsZWQsIHRoZSBgb25yZWplY3RlZGAgY2FsbGJhY2sgd2lsbCBydW4sXHJcbiAgICAgKiBfZXZlbiBhZnRlciB0aGUgcmV0dXJuZWQgcHJvbWlzZSBoYXMgYmVlbiBjYW5jZWxsZWQ6X1xyXG4gICAgICogaW4gdGhhdCBjYXNlLCBzaG91bGQgaXQgcmVqZWN0IG9yIHRocm93LCB0aGUgcmVhc29uIHdpbGwgYmUgd3JhcHBlZFxyXG4gICAgICogaW4gYSB7QGxpbmsgQ2FuY2VsbGVkUmVqZWN0aW9uRXJyb3J9IGFuZCBidWJibGVkIHVwIGFzIGFuIHVuaGFuZGxlZCByZWplY3Rpb24uXHJcbiAgICAgKlxyXG4gICAgICogSXQgaXMgZXF1aXZhbGVudCB0b1xyXG4gICAgICogYGBgdHNcclxuICAgICAqIGNhbmNlbGxhYmxlUHJvbWlzZS50aGVuKHVuZGVmaW5lZCwgb25yZWplY3RlZCwgb25jYW5jZWxsZWQpO1xyXG4gICAgICogYGBgXHJcbiAgICAgKiBhbmQgdGhlIHNhbWUgY2F2ZWF0cyBhcHBseS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBBIFByb21pc2UgZm9yIHRoZSBjb21wbGV0aW9uIG9mIHRoZSBjYWxsYmFjay5cclxuICAgICAqIENhbmNlbGxhdGlvbiByZXF1ZXN0cyBvbiB0aGUgcmV0dXJuZWQgcHJvbWlzZVxyXG4gICAgICogd2lsbCBwcm9wYWdhdGUgdXAgdGhlIGNoYWluIHRvIHRoZSBwYXJlbnQgcHJvbWlzZSxcclxuICAgICAqIGJ1dCBub3QgaW4gdGhlIG90aGVyIGRpcmVjdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBUaGUgcHJvbWlzZSByZXR1cm5lZCBmcm9tIHtAbGluayBjYW5jZWx9IHdpbGwgZnVsZmlsbCBvbmx5IGFmdGVyIGFsbCBhdHRhY2hlZCBoYW5kbGVyc1xyXG4gICAgICogdXAgdGhlIGVudGlyZSBwcm9taXNlIGNoYWluIGhhdmUgYmVlbiBydW4uXHJcbiAgICAgKlxyXG4gICAgICogSWYgYG9ucmVqZWN0ZWRgIHJldHVybnMgYSBjYW5jZWxsYWJsZSBwcm9taXNlLFxyXG4gICAgICogY2FuY2VsbGF0aW9uIHJlcXVlc3RzIHdpbGwgYmUgZGl2ZXJ0ZWQgdG8gaXQsXHJcbiAgICAgKiBhbmQgdGhlIHNwZWNpZmllZCBgb25jYW5jZWxsZWRgIGNhbGxiYWNrIHdpbGwgYmUgZGlzY2FyZGVkLlxyXG4gICAgICogU2VlIHtAbGluayB0aGVufSBmb3IgbW9yZSBkZXRhaWxzLlxyXG4gICAgICovXHJcbiAgICBjYXRjaDxUUmVzdWx0ID0gbmV2ZXI+KG9ucmVqZWN0ZWQ/OiAoKHJlYXNvbjogYW55KSA9PiAoUHJvbWlzZUxpa2U8VFJlc3VsdD4gfCBUUmVzdWx0KSkgfCB1bmRlZmluZWQgfCBudWxsLCBvbmNhbmNlbGxlZD86IENhbmNlbGxhYmxlUHJvbWlzZUNhbmNlbGxlcik6IENhbmNlbGxhYmxlUHJvbWlzZTxUIHwgVFJlc3VsdD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRoZW4odW5kZWZpbmVkLCBvbnJlamVjdGVkLCBvbmNhbmNlbGxlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBdHRhY2hlcyBhIGNhbGxiYWNrIHRoYXQgaXMgaW52b2tlZCB3aGVuIHRoZSBDYW5jZWxsYWJsZVByb21pc2UgaXMgc2V0dGxlZCAoZnVsZmlsbGVkIG9yIHJlamVjdGVkKS4gVGhlXHJcbiAgICAgKiByZXNvbHZlZCB2YWx1ZSBjYW5ub3QgYmUgYWNjZXNzZWQgb3IgbW9kaWZpZWQgZnJvbSB0aGUgY2FsbGJhY2suXHJcbiAgICAgKiBUaGUgcmV0dXJuZWQgcHJvbWlzZSB3aWxsIHNldHRsZSBpbiB0aGUgc2FtZSBzdGF0ZSBhcyB0aGUgb3JpZ2luYWwgb25lXHJcbiAgICAgKiBhZnRlciB0aGUgcHJvdmlkZWQgY2FsbGJhY2sgaGFzIGNvbXBsZXRlZCBleGVjdXRpb24sXHJcbiAgICAgKiB1bmxlc3MgdGhlIGNhbGxiYWNrIHRocm93cyBvciByZXR1cm5zIGEgcmVqZWN0aW5nIHByb21pc2UsXHJcbiAgICAgKiBpbiB3aGljaCBjYXNlIHRoZSByZXR1cm5lZCBwcm9taXNlIHdpbGwgcmVqZWN0IGFzIHdlbGwuXHJcbiAgICAgKlxyXG4gICAgICogVGhlIG9wdGlvbmFsIGBvbmNhbmNlbGxlZGAgYXJndW1lbnQgd2lsbCBiZSBpbnZva2VkIHdoZW4gdGhlIHJldHVybmVkIHByb21pc2UgaXMgY2FuY2VsbGVkLFxyXG4gICAgICogd2l0aCB0aGUgc2FtZSBzZW1hbnRpY3MgYXMgdGhlIGBvbmNhbmNlbGxlZGAgYXJndW1lbnQgb2YgdGhlIGNvbnN0cnVjdG9yLlxyXG4gICAgICogT25jZSB0aGUgcGFyZW50IHByb21pc2Ugc2V0dGxlcywgdGhlIGBvbmZpbmFsbHlgIGNhbGxiYWNrIHdpbGwgcnVuLFxyXG4gICAgICogX2V2ZW4gYWZ0ZXIgdGhlIHJldHVybmVkIHByb21pc2UgaGFzIGJlZW4gY2FuY2VsbGVkOl9cclxuICAgICAqIGluIHRoYXQgY2FzZSwgc2hvdWxkIGl0IHJlamVjdCBvciB0aHJvdywgdGhlIHJlYXNvbiB3aWxsIGJlIHdyYXBwZWRcclxuICAgICAqIGluIGEge0BsaW5rIENhbmNlbGxlZFJlamVjdGlvbkVycm9yfSBhbmQgYnViYmxlZCB1cCBhcyBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uLlxyXG4gICAgICpcclxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIHtAbGluayB0aGVufSBhbmQgdGhlIHNhbWUgY2F2ZWF0cyBhcHBseS5cclxuICAgICAqIEl0IGlzIHBvbHlmaWxsZWQsIGhlbmNlIGF2YWlsYWJsZSBpbiBldmVyeSBPUy93ZWJ2aWV3IHZlcnNpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgQSBQcm9taXNlIGZvciB0aGUgY29tcGxldGlvbiBvZiB0aGUgY2FsbGJhY2suXHJcbiAgICAgKiBDYW5jZWxsYXRpb24gcmVxdWVzdHMgb24gdGhlIHJldHVybmVkIHByb21pc2VcclxuICAgICAqIHdpbGwgcHJvcGFnYXRlIHVwIHRoZSBjaGFpbiB0byB0aGUgcGFyZW50IHByb21pc2UsXHJcbiAgICAgKiBidXQgbm90IGluIHRoZSBvdGhlciBkaXJlY3Rpb24uXHJcbiAgICAgKlxyXG4gICAgICogVGhlIHByb21pc2UgcmV0dXJuZWQgZnJvbSB7QGxpbmsgY2FuY2VsfSB3aWxsIGZ1bGZpbGwgb25seSBhZnRlciBhbGwgYXR0YWNoZWQgaGFuZGxlcnNcclxuICAgICAqIHVwIHRoZSBlbnRpcmUgcHJvbWlzZSBjaGFpbiBoYXZlIGJlZW4gcnVuLlxyXG4gICAgICpcclxuICAgICAqIElmIGBvbmZpbmFsbHlgIHJldHVybnMgYSBjYW5jZWxsYWJsZSBwcm9taXNlLFxyXG4gICAgICogY2FuY2VsbGF0aW9uIHJlcXVlc3RzIHdpbGwgYmUgZGl2ZXJ0ZWQgdG8gaXQsXHJcbiAgICAgKiBhbmQgdGhlIHNwZWNpZmllZCBgb25jYW5jZWxsZWRgIGNhbGxiYWNrIHdpbGwgYmUgZGlzY2FyZGVkLlxyXG4gICAgICogU2VlIHtAbGluayB0aGVufSBmb3IgbW9yZSBkZXRhaWxzLlxyXG4gICAgICovXHJcbiAgICBmaW5hbGx5KG9uZmluYWxseT86ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZCB8IG51bGwsIG9uY2FuY2VsbGVkPzogQ2FuY2VsbGFibGVQcm9taXNlQ2FuY2VsbGVyKTogQ2FuY2VsbGFibGVQcm9taXNlPFQ+IHtcclxuICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgQ2FuY2VsbGFibGVQcm9taXNlKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2FuY2VsbGFibGVQcm9taXNlLnByb3RvdHlwZS5maW5hbGx5IGNhbGxlZCBvbiBhbiBpbnZhbGlkIG9iamVjdC5cIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWlzQ2FsbGFibGUob25maW5hbGx5KSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy50aGVuKG9uZmluYWxseSwgb25maW5hbGx5LCBvbmNhbmNlbGxlZCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy50aGVuKFxyXG4gICAgICAgICAgICAodmFsdWUpID0+IENhbmNlbGxhYmxlUHJvbWlzZS5yZXNvbHZlKG9uZmluYWxseSgpKS50aGVuKCgpID0+IHZhbHVlKSxcclxuICAgICAgICAgICAgKHJlYXNvbj8pID0+IENhbmNlbGxhYmxlUHJvbWlzZS5yZXNvbHZlKG9uZmluYWxseSgpKS50aGVuKCgpID0+IHsgdGhyb3cgcmVhc29uOyB9KSxcclxuICAgICAgICAgICAgb25jYW5jZWxsZWQsXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFdlIHVzZSB0aGUgYFtTeW1ib2wuc3BlY2llc11gIHN0YXRpYyBwcm9wZXJ0eSwgaWYgYXZhaWxhYmxlLFxyXG4gICAgICogdG8gZGlzYWJsZSB0aGUgYnVpbHQtaW4gYXV0b21hdGljIHN1YmNsYXNzaW5nIGZlYXR1cmVzIGZyb20ge0BsaW5rIFByb21pc2V9LlxyXG4gICAgICogSXQgaXMgY3JpdGljYWwgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMgdGhhdCBleHRlbmRlcnMgZG8gbm90IG92ZXJyaWRlIHRoaXMuXHJcbiAgICAgKiBPbmNlIHRoZSBwcm9wb3NhbCBhdCBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1ybS1idWlsdGluLXN1YmNsYXNzaW5nXHJcbiAgICAgKiBpcyBlaXRoZXIgYWNjZXB0ZWQgb3IgcmV0aXJlZCwgdGhpcyBpbXBsZW1lbnRhdGlvbiB3aWxsIGhhdmUgdG8gYmUgcmV2aXNlZCBhY2NvcmRpbmdseS5cclxuICAgICAqXHJcbiAgICAgKiBAaWdub3JlXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGdldCBbc3BlY2llc10oKSB7XHJcbiAgICAgICAgcmV0dXJuIFByb21pc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgQ2FuY2VsbGFibGVQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aCBhbiBhcnJheSBvZiByZXN1bHRzXHJcbiAgICAgKiB3aGVuIGFsbCBvZiB0aGUgcHJvdmlkZWQgUHJvbWlzZXMgcmVzb2x2ZSwgb3IgcmVqZWN0ZWQgd2hlbiBhbnkgUHJvbWlzZSBpcyByZWplY3RlZC5cclxuICAgICAqXHJcbiAgICAgKiBFdmVyeSBvbmUgb2YgdGhlIHByb3ZpZGVkIG9iamVjdHMgdGhhdCBpcyBhIHRoZW5hYmxlIF9hbmRfIGNhbmNlbGxhYmxlIG9iamVjdFxyXG4gICAgICogd2lsbCBiZSBjYW5jZWxsZWQgd2hlbiB0aGUgcmV0dXJuZWQgcHJvbWlzZSBpcyBjYW5jZWxsZWQsIHdpdGggdGhlIHNhbWUgY2F1c2UuXHJcbiAgICAgKlxyXG4gICAgICogQGdyb3VwIFN0YXRpYyBNZXRob2RzXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBhbGw8VD4odmFsdWVzOiBJdGVyYWJsZTxUIHwgUHJvbWlzZUxpa2U8VD4+KTogQ2FuY2VsbGFibGVQcm9taXNlPEF3YWl0ZWQ8VD5bXT47XHJcbiAgICBzdGF0aWMgYWxsPFQgZXh0ZW5kcyByZWFkb25seSB1bmtub3duW10gfCBbXT4odmFsdWVzOiBUKTogQ2FuY2VsbGFibGVQcm9taXNlPHsgLXJlYWRvbmx5IFtQIGluIGtleW9mIFRdOiBBd2FpdGVkPFRbUF0+OyB9PjtcclxuICAgIHN0YXRpYyBhbGw8VCBleHRlbmRzIEl0ZXJhYmxlPHVua25vd24+IHwgQXJyYXlMaWtlPHVua25vd24+Pih2YWx1ZXM6IFQpOiBDYW5jZWxsYWJsZVByb21pc2U8dW5rbm93bj4ge1xyXG4gICAgICAgIGxldCBjb2xsZWN0ZWQgPSBBcnJheS5mcm9tKHZhbHVlcyk7XHJcbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IGNvbGxlY3RlZC5sZW5ndGggPT09IDBcclxuICAgICAgICAgICAgPyBDYW5jZWxsYWJsZVByb21pc2UucmVzb2x2ZShjb2xsZWN0ZWQpXHJcbiAgICAgICAgICAgIDogbmV3IENhbmNlbGxhYmxlUHJvbWlzZTx1bmtub3duPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICB2b2lkIFByb21pc2UuYWxsKGNvbGxlY3RlZCkudGhlbihyZXNvbHZlLCByZWplY3QpO1xyXG4gICAgICAgICAgICB9LCAoY2F1c2U/KTogUHJvbWlzZTx2b2lkPiA9PiBjYW5jZWxBbGwocHJvbWlzZSwgY29sbGVjdGVkLCBjYXVzZSkpO1xyXG4gICAgICAgIHJldHVybiBwcm9taXNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIENhbmNlbGxhYmxlUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggYW4gYXJyYXkgb2YgcmVzdWx0c1xyXG4gICAgICogd2hlbiBhbGwgb2YgdGhlIHByb3ZpZGVkIFByb21pc2VzIHJlc29sdmUgb3IgcmVqZWN0LlxyXG4gICAgICpcclxuICAgICAqIEV2ZXJ5IG9uZSBvZiB0aGUgcHJvdmlkZWQgb2JqZWN0cyB0aGF0IGlzIGEgdGhlbmFibGUgX2FuZF8gY2FuY2VsbGFibGUgb2JqZWN0XHJcbiAgICAgKiB3aWxsIGJlIGNhbmNlbGxlZCB3aGVuIHRoZSByZXR1cm5lZCBwcm9taXNlIGlzIGNhbmNlbGxlZCwgd2l0aCB0aGUgc2FtZSBjYXVzZS5cclxuICAgICAqXHJcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGFsbFNldHRsZWQ8VD4odmFsdWVzOiBJdGVyYWJsZTxUIHwgUHJvbWlzZUxpa2U8VD4+KTogQ2FuY2VsbGFibGVQcm9taXNlPFByb21pc2VTZXR0bGVkUmVzdWx0PEF3YWl0ZWQ8VD4+W10+O1xyXG4gICAgc3RhdGljIGFsbFNldHRsZWQ8VCBleHRlbmRzIHJlYWRvbmx5IHVua25vd25bXSB8IFtdPih2YWx1ZXM6IFQpOiBDYW5jZWxsYWJsZVByb21pc2U8eyAtcmVhZG9ubHkgW1AgaW4ga2V5b2YgVF06IFByb21pc2VTZXR0bGVkUmVzdWx0PEF3YWl0ZWQ8VFtQXT4+OyB9PjtcclxuICAgIHN0YXRpYyBhbGxTZXR0bGVkPFQgZXh0ZW5kcyBJdGVyYWJsZTx1bmtub3duPiB8IEFycmF5TGlrZTx1bmtub3duPj4odmFsdWVzOiBUKTogQ2FuY2VsbGFibGVQcm9taXNlPHVua25vd24+IHtcclxuICAgICAgICBsZXQgY29sbGVjdGVkID0gQXJyYXkuZnJvbSh2YWx1ZXMpO1xyXG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBjb2xsZWN0ZWQubGVuZ3RoID09PSAwXHJcbiAgICAgICAgICAgID8gQ2FuY2VsbGFibGVQcm9taXNlLnJlc29sdmUoY29sbGVjdGVkKVxyXG4gICAgICAgICAgICA6IG5ldyBDYW5jZWxsYWJsZVByb21pc2U8dW5rbm93bj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdm9pZCBQcm9taXNlLmFsbFNldHRsZWQoY29sbGVjdGVkKS50aGVuKHJlc29sdmUsIHJlamVjdCk7XHJcbiAgICAgICAgICAgIH0sIChjYXVzZT8pOiBQcm9taXNlPHZvaWQ+ID0+IGNhbmNlbEFsbChwcm9taXNlLCBjb2xsZWN0ZWQsIGNhdXNlKSk7XHJcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgYW55IGZ1bmN0aW9uIHJldHVybnMgYSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIGJ5IHRoZSBmaXJzdCBnaXZlbiBwcm9taXNlIHRvIGJlIGZ1bGZpbGxlZCxcclxuICAgICAqIG9yIHJlamVjdGVkIHdpdGggYW4gQWdncmVnYXRlRXJyb3IgY29udGFpbmluZyBhbiBhcnJheSBvZiByZWplY3Rpb24gcmVhc29uc1xyXG4gICAgICogaWYgYWxsIG9mIHRoZSBnaXZlbiBwcm9taXNlcyBhcmUgcmVqZWN0ZWQuXHJcbiAgICAgKiBJdCByZXNvbHZlcyBhbGwgZWxlbWVudHMgb2YgdGhlIHBhc3NlZCBpdGVyYWJsZSB0byBwcm9taXNlcyBhcyBpdCBydW5zIHRoaXMgYWxnb3JpdGhtLlxyXG4gICAgICpcclxuICAgICAqIEV2ZXJ5IG9uZSBvZiB0aGUgcHJvdmlkZWQgb2JqZWN0cyB0aGF0IGlzIGEgdGhlbmFibGUgX2FuZF8gY2FuY2VsbGFibGUgb2JqZWN0XHJcbiAgICAgKiB3aWxsIGJlIGNhbmNlbGxlZCB3aGVuIHRoZSByZXR1cm5lZCBwcm9taXNlIGlzIGNhbmNlbGxlZCwgd2l0aCB0aGUgc2FtZSBjYXVzZS5cclxuICAgICAqXHJcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGFueTxUPih2YWx1ZXM6IEl0ZXJhYmxlPFQgfCBQcm9taXNlTGlrZTxUPj4pOiBDYW5jZWxsYWJsZVByb21pc2U8QXdhaXRlZDxUPj47XHJcbiAgICBzdGF0aWMgYW55PFQgZXh0ZW5kcyByZWFkb25seSB1bmtub3duW10gfCBbXT4odmFsdWVzOiBUKTogQ2FuY2VsbGFibGVQcm9taXNlPEF3YWl0ZWQ8VFtudW1iZXJdPj47XHJcbiAgICBzdGF0aWMgYW55PFQgZXh0ZW5kcyBJdGVyYWJsZTx1bmtub3duPiB8IEFycmF5TGlrZTx1bmtub3duPj4odmFsdWVzOiBUKTogQ2FuY2VsbGFibGVQcm9taXNlPHVua25vd24+IHtcclxuICAgICAgICBsZXQgY29sbGVjdGVkID0gQXJyYXkuZnJvbSh2YWx1ZXMpO1xyXG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBjb2xsZWN0ZWQubGVuZ3RoID09PSAwXHJcbiAgICAgICAgICAgID8gQ2FuY2VsbGFibGVQcm9taXNlLnJlc29sdmUoY29sbGVjdGVkKVxyXG4gICAgICAgICAgICA6IG5ldyBDYW5jZWxsYWJsZVByb21pc2U8dW5rbm93bj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdm9pZCBQcm9taXNlLmFueShjb2xsZWN0ZWQpLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcclxuICAgICAgICAgICAgfSwgKGNhdXNlPyk6IFByb21pc2U8dm9pZD4gPT4gY2FuY2VsQWxsKHByb21pc2UsIGNvbGxlY3RlZCwgY2F1c2UpKTtcclxuICAgICAgICByZXR1cm4gcHJvbWlzZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQgd2hlbiBhbnkgb2YgdGhlIHByb3ZpZGVkIFByb21pc2VzIGFyZSByZXNvbHZlZCBvciByZWplY3RlZC5cclxuICAgICAqXHJcbiAgICAgKiBFdmVyeSBvbmUgb2YgdGhlIHByb3ZpZGVkIG9iamVjdHMgdGhhdCBpcyBhIHRoZW5hYmxlIF9hbmRfIGNhbmNlbGxhYmxlIG9iamVjdFxyXG4gICAgICogd2lsbCBiZSBjYW5jZWxsZWQgd2hlbiB0aGUgcmV0dXJuZWQgcHJvbWlzZSBpcyBjYW5jZWxsZWQsIHdpdGggdGhlIHNhbWUgY2F1c2UuXHJcbiAgICAgKlxyXG4gICAgICogQGdyb3VwIFN0YXRpYyBNZXRob2RzXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyByYWNlPFQ+KHZhbHVlczogSXRlcmFibGU8VCB8IFByb21pc2VMaWtlPFQ+Pik6IENhbmNlbGxhYmxlUHJvbWlzZTxBd2FpdGVkPFQ+PjtcclxuICAgIHN0YXRpYyByYWNlPFQgZXh0ZW5kcyByZWFkb25seSB1bmtub3duW10gfCBbXT4odmFsdWVzOiBUKTogQ2FuY2VsbGFibGVQcm9taXNlPEF3YWl0ZWQ8VFtudW1iZXJdPj47XHJcbiAgICBzdGF0aWMgcmFjZTxUIGV4dGVuZHMgSXRlcmFibGU8dW5rbm93bj4gfCBBcnJheUxpa2U8dW5rbm93bj4+KHZhbHVlczogVCk6IENhbmNlbGxhYmxlUHJvbWlzZTx1bmtub3duPiB7XHJcbiAgICAgICAgbGV0IGNvbGxlY3RlZCA9IEFycmF5LmZyb20odmFsdWVzKTtcclxuICAgICAgICBjb25zdCBwcm9taXNlID0gbmV3IENhbmNlbGxhYmxlUHJvbWlzZTx1bmtub3duPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIHZvaWQgUHJvbWlzZS5yYWNlKGNvbGxlY3RlZCkudGhlbihyZXNvbHZlLCByZWplY3QpO1xyXG4gICAgICAgIH0sIChjYXVzZT8pOiBQcm9taXNlPHZvaWQ+ID0+IGNhbmNlbEFsbChwcm9taXNlLCBjb2xsZWN0ZWQsIGNhdXNlKSk7XHJcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGNhbmNlbGxlZCBDYW5jZWxsYWJsZVByb21pc2UgZm9yIHRoZSBwcm92aWRlZCBjYXVzZS5cclxuICAgICAqXHJcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGNhbmNlbDxUID0gbmV2ZXI+KGNhdXNlPzogYW55KTogQ2FuY2VsbGFibGVQcm9taXNlPFQ+IHtcclxuICAgICAgICBjb25zdCBwID0gbmV3IENhbmNlbGxhYmxlUHJvbWlzZTxUPigoKSA9PiB7fSk7XHJcbiAgICAgICAgcC5jYW5jZWwoY2F1c2UpO1xyXG4gICAgICAgIHJldHVybiBwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIG5ldyBDYW5jZWxsYWJsZVByb21pc2UgdGhhdCBjYW5jZWxzXHJcbiAgICAgKiBhZnRlciB0aGUgc3BlY2lmaWVkIHRpbWVvdXQsIHdpdGggdGhlIHByb3ZpZGVkIGNhdXNlLlxyXG4gICAgICpcclxuICAgICAqIElmIHRoZSB7QGxpbmsgQWJvcnRTaWduYWwudGltZW91dH0gZmFjdG9yeSBtZXRob2QgaXMgYXZhaWxhYmxlLFxyXG4gICAgICogaXQgaXMgdXNlZCB0byBiYXNlIHRoZSB0aW1lb3V0IG9uIF9hY3RpdmVfIHRpbWUgcmF0aGVyIHRoYW4gX2VsYXBzZWRfIHRpbWUuXHJcbiAgICAgKiBPdGhlcndpc2UsIGB0aW1lb3V0YCBmYWxscyBiYWNrIHRvIHtAbGluayBzZXRUaW1lb3V0fS5cclxuICAgICAqXHJcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHRpbWVvdXQ8VCA9IG5ldmVyPihtaWxsaXNlY29uZHM6IG51bWJlciwgY2F1c2U/OiBhbnkpOiBDYW5jZWxsYWJsZVByb21pc2U8VD4ge1xyXG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBuZXcgQ2FuY2VsbGFibGVQcm9taXNlPFQ+KCgpID0+IHt9KTtcclxuICAgICAgICBpZiAoQWJvcnRTaWduYWwgJiYgdHlwZW9mIEFib3J0U2lnbmFsID09PSAnZnVuY3Rpb24nICYmIEFib3J0U2lnbmFsLnRpbWVvdXQgJiYgdHlwZW9mIEFib3J0U2lnbmFsLnRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgQWJvcnRTaWduYWwudGltZW91dChtaWxsaXNlY29uZHMpLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgKCkgPT4gdm9pZCBwcm9taXNlLmNhbmNlbChjYXVzZSkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdm9pZCBwcm9taXNlLmNhbmNlbChjYXVzZSksIG1pbGxpc2Vjb25kcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBwcm9taXNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIG5ldyBDYW5jZWxsYWJsZVByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciB0aGUgc3BlY2lmaWVkIHRpbWVvdXQuXHJcbiAgICAgKiBUaGUgcmV0dXJuZWQgcHJvbWlzZSBjYW4gYmUgY2FuY2VsbGVkIHdpdGhvdXQgY29uc2VxdWVuY2VzLlxyXG4gICAgICpcclxuICAgICAqIEBncm91cCBTdGF0aWMgTWV0aG9kc1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgc2xlZXAobWlsbGlzZWNvbmRzOiBudW1iZXIpOiBDYW5jZWxsYWJsZVByb21pc2U8dm9pZD47XHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ2FuY2VsbGFibGVQcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXJcclxuICAgICAqIHRoZSBzcGVjaWZpZWQgdGltZW91dCwgd2l0aCB0aGUgcHJvdmlkZWQgdmFsdWUuXHJcbiAgICAgKiBUaGUgcmV0dXJuZWQgcHJvbWlzZSBjYW4gYmUgY2FuY2VsbGVkIHdpdGhvdXQgY29uc2VxdWVuY2VzLlxyXG4gICAgICpcclxuICAgICAqIEBncm91cCBTdGF0aWMgTWV0aG9kc1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgc2xlZXA8VD4obWlsbGlzZWNvbmRzOiBudW1iZXIsIHZhbHVlOiBUKTogQ2FuY2VsbGFibGVQcm9taXNlPFQ+O1xyXG4gICAgc3RhdGljIHNsZWVwPFQgPSB2b2lkPihtaWxsaXNlY29uZHM6IG51bWJlciwgdmFsdWU/OiBUKTogQ2FuY2VsbGFibGVQcm9taXNlPFQ+IHtcclxuICAgICAgICByZXR1cm4gbmV3IENhbmNlbGxhYmxlUHJvbWlzZTxUPigocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHJlc29sdmUodmFsdWUhKSwgbWlsbGlzZWNvbmRzKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBuZXcgcmVqZWN0ZWQgQ2FuY2VsbGFibGVQcm9taXNlIGZvciB0aGUgcHJvdmlkZWQgcmVhc29uLlxyXG4gICAgICpcclxuICAgICAqIEBncm91cCBTdGF0aWMgTWV0aG9kc1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcmVqZWN0PFQgPSBuZXZlcj4ocmVhc29uPzogYW55KTogQ2FuY2VsbGFibGVQcm9taXNlPFQ+IHtcclxuICAgICAgICByZXR1cm4gbmV3IENhbmNlbGxhYmxlUHJvbWlzZTxUPigoXywgcmVqZWN0KSA9PiByZWplY3QocmVhc29uKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHJlc29sdmVkIENhbmNlbGxhYmxlUHJvbWlzZS5cclxuICAgICAqXHJcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHJlc29sdmUoKTogQ2FuY2VsbGFibGVQcm9taXNlPHZvaWQ+O1xyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHJlc29sdmVkIENhbmNlbGxhYmxlUHJvbWlzZSBmb3IgdGhlIHByb3ZpZGVkIHZhbHVlLlxyXG4gICAgICpcclxuICAgICAqIEBncm91cCBTdGF0aWMgTWV0aG9kc1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcmVzb2x2ZTxUPih2YWx1ZTogVCk6IENhbmNlbGxhYmxlUHJvbWlzZTxBd2FpdGVkPFQ+PjtcclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIG5ldyByZXNvbHZlZCBDYW5jZWxsYWJsZVByb21pc2UgZm9yIHRoZSBwcm92aWRlZCB2YWx1ZS5cclxuICAgICAqXHJcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHJlc29sdmU8VD4odmFsdWU6IFQgfCBQcm9taXNlTGlrZTxUPik6IENhbmNlbGxhYmxlUHJvbWlzZTxBd2FpdGVkPFQ+PjtcclxuICAgIHN0YXRpYyByZXNvbHZlPFQgPSB2b2lkPih2YWx1ZT86IFQgfCBQcm9taXNlTGlrZTxUPik6IENhbmNlbGxhYmxlUHJvbWlzZTxBd2FpdGVkPFQ+PiB7XHJcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQ2FuY2VsbGFibGVQcm9taXNlKSB7XHJcbiAgICAgICAgICAgIC8vIE9wdGltaXNlIGZvciBjYW5jZWxsYWJsZSBwcm9taXNlcy5cclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbmV3IENhbmNlbGxhYmxlUHJvbWlzZTxhbnk+KChyZXNvbHZlKSA9PiByZXNvbHZlKHZhbHVlKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgbmV3IENhbmNlbGxhYmxlUHJvbWlzZSBhbmQgcmV0dXJucyBpdCBpbiBhbiBvYmplY3QsIGFsb25nIHdpdGggaXRzIHJlc29sdmUgYW5kIHJlamVjdCBmdW5jdGlvbnNcclxuICAgICAqIGFuZCBhIGdldHRlci9zZXR0ZXIgZm9yIHRoZSBjYW5jZWxsYXRpb24gY2FsbGJhY2suXHJcbiAgICAgKlxyXG4gICAgICogVGhpcyBtZXRob2QgaXMgcG9seWZpbGxlZCwgaGVuY2UgYXZhaWxhYmxlIGluIGV2ZXJ5IE9TL3dlYnZpZXcgdmVyc2lvbi5cclxuICAgICAqXHJcbiAgICAgKiBAZ3JvdXAgU3RhdGljIE1ldGhvZHNcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHdpdGhSZXNvbHZlcnM8VD4oKTogQ2FuY2VsbGFibGVQcm9taXNlV2l0aFJlc29sdmVyczxUPiB7XHJcbiAgICAgICAgbGV0IHJlc3VsdDogQ2FuY2VsbGFibGVQcm9taXNlV2l0aFJlc29sdmVyczxUPiA9IHsgb25jYW5jZWxsZWQ6IG51bGwgfSBhcyBhbnk7XHJcbiAgICAgICAgcmVzdWx0LnByb21pc2UgPSBuZXcgQ2FuY2VsbGFibGVQcm9taXNlPFQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgcmVzdWx0LnJlc29sdmUgPSByZXNvbHZlO1xyXG4gICAgICAgICAgICByZXN1bHQucmVqZWN0ID0gcmVqZWN0O1xyXG4gICAgICAgIH0sIChjYXVzZT86IGFueSkgPT4geyByZXN1bHQub25jYW5jZWxsZWQ/LihjYXVzZSk7IH0pO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGEgY2FsbGJhY2sgdGhhdCBpbXBsZW1lbnRzIHRoZSBjYW5jZWxsYXRpb24gYWxnb3JpdGhtIGZvciB0aGUgZ2l2ZW4gY2FuY2VsbGFibGUgcHJvbWlzZS5cclxuICogVGhlIHByb21pc2UgcmV0dXJuZWQgZnJvbSB0aGUgcmVzdWx0aW5nIGZ1bmN0aW9uIGRvZXMgbm90IHJlamVjdC5cclxuICovXHJcbmZ1bmN0aW9uIGNhbmNlbGxlckZvcjxUPihwcm9taXNlOiBDYW5jZWxsYWJsZVByb21pc2VXaXRoUmVzb2x2ZXJzPFQ+LCBzdGF0ZTogQ2FuY2VsbGFibGVQcm9taXNlU3RhdGUpIHtcclxuICAgIGxldCBjYW5jZWxsYXRpb25Qcm9taXNlOiB2b2lkIHwgUHJvbWlzZUxpa2U8dm9pZD4gPSB1bmRlZmluZWQ7XHJcblxyXG4gICAgcmV0dXJuIChyZWFzb246IENhbmNlbEVycm9yKTogdm9pZCB8IFByb21pc2VMaWtlPHZvaWQ+ID0+IHtcclxuICAgICAgICBpZiAoIXN0YXRlLnNldHRsZWQpIHtcclxuICAgICAgICAgICAgc3RhdGUuc2V0dGxlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIHN0YXRlLnJlYXNvbiA9IHJlYXNvbjtcclxuICAgICAgICAgICAgcHJvbWlzZS5yZWplY3QocmVhc29uKTtcclxuXHJcbiAgICAgICAgICAgIC8vIEF0dGFjaCBhbiBlcnJvciBoYW5kbGVyIHRoYXQgaWdub3JlcyB0aGlzIHNwZWNpZmljIHJlamVjdGlvbiByZWFzb24gYW5kIG5vdGhpbmcgZWxzZS5cclxuICAgICAgICAgICAgLy8gSW4gdGhlb3J5LCBhIHNhbmUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiBhdCB0aGlzIHBvaW50XHJcbiAgICAgICAgICAgIC8vIHNob3VsZCBhbHdheXMgcmVqZWN0IHdpdGggb3VyIGNhbmNlbGxhdGlvbiByZWFzb24sXHJcbiAgICAgICAgICAgIC8vIGhlbmNlIHRoZSBoYW5kbGVyIHdpbGwgbmV2ZXIgdGhyb3cuXHJcbiAgICAgICAgICAgIHZvaWQgUHJvbWlzZS5wcm90b3R5cGUudGhlbi5jYWxsKHByb21pc2UucHJvbWlzZSwgdW5kZWZpbmVkLCAoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXJyICE9PSByZWFzb24pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gSWYgcmVhc29uIGlzIG5vdCBzZXQsIHRoZSBwcm9taXNlIHJlc29sdmVkIHJlZ3VsYXJseSwgaGVuY2Ugd2UgbXVzdCBub3QgY2FsbCBvbmNhbmNlbGxlZC5cclxuICAgICAgICAvLyBJZiBvbmNhbmNlbGxlZCBpcyB1bnNldCwgbm8gbmVlZCB0byBnbyBhbnkgZnVydGhlci5cclxuICAgICAgICBpZiAoIXN0YXRlLnJlYXNvbiB8fCAhcHJvbWlzZS5vbmNhbmNlbGxlZCkgeyByZXR1cm47IH1cclxuXHJcbiAgICAgICAgY2FuY2VsbGF0aW9uUHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKHByb21pc2Uub25jYW5jZWxsZWQhKHN0YXRlLnJlYXNvbiEuY2F1c2UpKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICBQcm9taXNlLnJlamVjdChuZXcgQ2FuY2VsbGVkUmVqZWN0aW9uRXJyb3IocHJvbWlzZS5wcm9taXNlLCBlcnIsIFwiVW5oYW5kbGVkIGV4Y2VwdGlvbiBpbiBvbmNhbmNlbGxlZCBjYWxsYmFjay5cIikpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSkuY2F0Y2goKHJlYXNvbj8pID0+IHtcclxuICAgICAgICAgICAgUHJvbWlzZS5yZWplY3QobmV3IENhbmNlbGxlZFJlamVjdGlvbkVycm9yKHByb21pc2UucHJvbWlzZSwgcmVhc29uLCBcIlVuaGFuZGxlZCByZWplY3Rpb24gaW4gb25jYW5jZWxsZWQgY2FsbGJhY2suXCIpKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gVW5zZXQgb25jYW5jZWxsZWQgdG8gcHJldmVudCByZXBlYXRlZCBjYWxscy5cclxuICAgICAgICBwcm9taXNlLm9uY2FuY2VsbGVkID0gbnVsbDtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNhbmNlbGxhdGlvblByb21pc2U7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGEgY2FsbGJhY2sgdGhhdCBpbXBsZW1lbnRzIHRoZSByZXNvbHV0aW9uIGFsZ29yaXRobSBmb3IgdGhlIGdpdmVuIGNhbmNlbGxhYmxlIHByb21pc2UuXHJcbiAqL1xyXG5mdW5jdGlvbiByZXNvbHZlckZvcjxUPihwcm9taXNlOiBDYW5jZWxsYWJsZVByb21pc2VXaXRoUmVzb2x2ZXJzPFQ+LCBzdGF0ZTogQ2FuY2VsbGFibGVQcm9taXNlU3RhdGUpOiBDYW5jZWxsYWJsZVByb21pc2VSZXNvbHZlcjxUPiB7XHJcbiAgICByZXR1cm4gKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgaWYgKHN0YXRlLnJlc29sdmluZykgeyByZXR1cm47IH1cclxuICAgICAgICBzdGF0ZS5yZXNvbHZpbmcgPSB0cnVlO1xyXG5cclxuICAgICAgICBpZiAodmFsdWUgPT09IHByb21pc2UucHJvbWlzZSkge1xyXG4gICAgICAgICAgICBpZiAoc3RhdGUuc2V0dGxlZCkgeyByZXR1cm47IH1cclxuICAgICAgICAgICAgc3RhdGUuc2V0dGxlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIHByb21pc2UucmVqZWN0KG5ldyBUeXBlRXJyb3IoXCJBIHByb21pc2UgY2Fubm90IGJlIHJlc29sdmVkIHdpdGggaXRzZWxmLlwiKSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykpIHtcclxuICAgICAgICAgICAgbGV0IHRoZW46IGFueTtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHRoZW4gPSAodmFsdWUgYXMgYW55KS50aGVuO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgICAgIHN0YXRlLnNldHRsZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgcHJvbWlzZS5yZWplY3QoZXJyKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGlzQ2FsbGFibGUodGhlbikpIHtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNhbmNlbCA9ICh2YWx1ZSBhcyBhbnkpLmNhbmNlbDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNDYWxsYWJsZShjYW5jZWwpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9uY2FuY2VsbGVkID0gKGNhdXNlPzogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZsZWN0LmFwcGx5KGNhbmNlbCwgdmFsdWUsIFtjYXVzZV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUucmVhc29uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBhbHJlYWR5IGNhbmNlbGxlZCwgcHJvcGFnYXRlIGNhbmNlbGxhdGlvbi5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBwcm9taXNlIHJldHVybmVkIGZyb20gdGhlIGNhbmNlbGxlciBhbGdvcml0aG0gZG9lcyBub3QgcmVqZWN0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyBpdCBjYW4gYmUgZGlzY2FyZGVkIHNhZmVseS5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgY2FuY2VsbGVyRm9yKHsgLi4ucHJvbWlzZSwgb25jYW5jZWxsZWQgfSwgc3RhdGUpKHN0YXRlLnJlYXNvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlLm9uY2FuY2VsbGVkID0gb25jYW5jZWxsZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGNhdGNoIHt9XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3U3RhdGU6IENhbmNlbGxhYmxlUHJvbWlzZVN0YXRlID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJvb3Q6IHN0YXRlLnJvb3QsXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2aW5nOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICBnZXQgc2V0dGxlZCgpIHsgcmV0dXJuIHRoaXMucm9vdC5zZXR0bGVkIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IHNldHRsZWQodmFsdWUpIHsgdGhpcy5yb290LnNldHRsZWQgPSB2YWx1ZTsgfSxcclxuICAgICAgICAgICAgICAgICAgICBnZXQgcmVhc29uKCkgeyByZXR1cm4gdGhpcy5yb290LnJlYXNvbiB9XHJcbiAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlamVjdG9yID0gcmVqZWN0b3JGb3IocHJvbWlzZSwgbmV3U3RhdGUpO1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBSZWZsZWN0LmFwcGx5KHRoZW4sIHZhbHVlLCBbcmVzb2x2ZXJGb3IocHJvbWlzZSwgbmV3U3RhdGUpLCByZWplY3Rvcl0pO1xyXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0b3IoZXJyKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybjsgLy8gSU1QT1JUQU5UIVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc3RhdGUuc2V0dGxlZCkgeyByZXR1cm47IH1cclxuICAgICAgICBzdGF0ZS5zZXR0bGVkID0gdHJ1ZTtcclxuICAgICAgICBwcm9taXNlLnJlc29sdmUodmFsdWUpO1xyXG4gICAgfTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYSBjYWxsYmFjayB0aGF0IGltcGxlbWVudHMgdGhlIHJlamVjdGlvbiBhbGdvcml0aG0gZm9yIHRoZSBnaXZlbiBjYW5jZWxsYWJsZSBwcm9taXNlLlxyXG4gKi9cclxuZnVuY3Rpb24gcmVqZWN0b3JGb3I8VD4ocHJvbWlzZTogQ2FuY2VsbGFibGVQcm9taXNlV2l0aFJlc29sdmVyczxUPiwgc3RhdGU6IENhbmNlbGxhYmxlUHJvbWlzZVN0YXRlKTogQ2FuY2VsbGFibGVQcm9taXNlUmVqZWN0b3Ige1xyXG4gICAgcmV0dXJuIChyZWFzb24/KSA9PiB7XHJcbiAgICAgICAgaWYgKHN0YXRlLnJlc29sdmluZykgeyByZXR1cm47IH1cclxuICAgICAgICBzdGF0ZS5yZXNvbHZpbmcgPSB0cnVlO1xyXG5cclxuICAgICAgICBpZiAoc3RhdGUuc2V0dGxlZCkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIENhbmNlbEVycm9yICYmIHN0YXRlLnJlYXNvbiBpbnN0YW5jZW9mIENhbmNlbEVycm9yICYmIE9iamVjdC5pcyhyZWFzb24uY2F1c2UsIHN0YXRlLnJlYXNvbi5jYXVzZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBTd2FsbG93IGxhdGUgcmVqZWN0aW9ucyB0aGF0IGFyZSBDYW5jZWxFcnJvcnMgd2hvc2UgY2FuY2VsbGF0aW9uIGNhdXNlIGlzIHRoZSBzYW1lIGFzIG91cnMuXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGNhdGNoIHt9XHJcblxyXG4gICAgICAgICAgICB2b2lkIFByb21pc2UucmVqZWN0KG5ldyBDYW5jZWxsZWRSZWplY3Rpb25FcnJvcihwcm9taXNlLnByb21pc2UsIHJlYXNvbikpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHN0YXRlLnNldHRsZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICBwcm9taXNlLnJlamVjdChyZWFzb24pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIENhbmNlbHMgYWxsIHZhbHVlcyBpbiBhbiBhcnJheSB0aGF0IGxvb2sgbGlrZSBjYW5jZWxsYWJsZSB0aGVuYWJsZXMuXHJcbiAqIFJldHVybnMgYSBwcm9taXNlIHRoYXQgZnVsZmlsbHMgb25jZSBhbGwgY2FuY2VsbGF0aW9uIHByb2NlZHVyZXMgZm9yIHRoZSBnaXZlbiB2YWx1ZXMgaGF2ZSBzZXR0bGVkLlxyXG4gKi9cclxuZnVuY3Rpb24gY2FuY2VsQWxsKHBhcmVudDogQ2FuY2VsbGFibGVQcm9taXNlPHVua25vd24+LCB2YWx1ZXM6IGFueVtdLCBjYXVzZT86IGFueSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgcmVzdWx0cyA9IFtdO1xyXG5cclxuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XHJcbiAgICAgICAgbGV0IGNhbmNlbDogQ2FuY2VsbGFibGVQcm9taXNlQ2FuY2VsbGVyO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmICghaXNDYWxsYWJsZSh2YWx1ZS50aGVuKSkgeyBjb250aW51ZTsgfVxyXG4gICAgICAgICAgICBjYW5jZWwgPSB2YWx1ZS5jYW5jZWw7XHJcbiAgICAgICAgICAgIGlmICghaXNDYWxsYWJsZShjYW5jZWwpKSB7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgfSBjYXRjaCB7IGNvbnRpbnVlOyB9XHJcblxyXG4gICAgICAgIGxldCByZXN1bHQ6IHZvaWQgfCBQcm9taXNlTGlrZTx2b2lkPjtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXN1bHQgPSBSZWZsZWN0LmFwcGx5KGNhbmNlbCwgdmFsdWUsIFtjYXVzZV0pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICBQcm9taXNlLnJlamVjdChuZXcgQ2FuY2VsbGVkUmVqZWN0aW9uRXJyb3IocGFyZW50LCBlcnIsIFwiVW5oYW5kbGVkIGV4Y2VwdGlvbiBpbiBjYW5jZWwgbWV0aG9kLlwiKSk7XHJcbiAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFyZXN1bHQpIHsgY29udGludWU7IH1cclxuICAgICAgICByZXN1bHRzLnB1c2goXHJcbiAgICAgICAgICAgIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlICA/IHJlc3VsdCA6IFByb21pc2UucmVzb2x2ZShyZXN1bHQpKS5jYXRjaCgocmVhc29uPykgPT4ge1xyXG4gICAgICAgICAgICAgICAgUHJvbWlzZS5yZWplY3QobmV3IENhbmNlbGxlZFJlamVjdGlvbkVycm9yKHBhcmVudCwgcmVhc29uLCBcIlVuaGFuZGxlZCByZWplY3Rpb24gaW4gY2FuY2VsIG1ldGhvZC5cIikpO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIFByb21pc2UuYWxsKHJlc3VsdHMpIGFzIGFueTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgaXRzIGFyZ3VtZW50LlxyXG4gKi9cclxuZnVuY3Rpb24gaWRlbnRpdHk8VD4oeDogVCk6IFQge1xyXG4gICAgcmV0dXJuIHg7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUaHJvd3MgaXRzIGFyZ3VtZW50LlxyXG4gKi9cclxuZnVuY3Rpb24gdGhyb3dlcihyZWFzb24/OiBhbnkpOiBuZXZlciB7XHJcbiAgICB0aHJvdyByZWFzb247XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBdHRlbXB0cyB2YXJpb3VzIHN0cmF0ZWdpZXMgdG8gY29udmVydCBhbiBlcnJvciB0byBhIHN0cmluZy5cclxuICovXHJcbmZ1bmN0aW9uIGVycm9yTWVzc2FnZShlcnI6IGFueSk6IHN0cmluZyB7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBFcnJvciB8fCB0eXBlb2YgZXJyICE9PSAnb2JqZWN0JyB8fCBlcnIudG9TdHJpbmcgIT09IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFwiXCIgKyBlcnI7XHJcbiAgICAgICAgfVxyXG4gICAgfSBjYXRjaCB7fVxyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGVycik7XHJcbiAgICB9IGNhdGNoIHt9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGVycik7XHJcbiAgICB9IGNhdGNoIHt9XHJcblxyXG4gICAgcmV0dXJuIFwiPGNvdWxkIG5vdCBjb252ZXJ0IGVycm9yIHRvIHN0cmluZz5cIjtcclxufVxyXG5cclxuLyoqXHJcbiAqIEdldHMgdGhlIGN1cnJlbnQgYmFycmllciBwcm9taXNlIGZvciB0aGUgZ2l2ZW4gY2FuY2VsbGFibGUgcHJvbWlzZS4gSWYgbmVjZXNzYXJ5LCBpbml0aWFsaXNlcyB0aGUgYmFycmllci5cclxuICovXHJcbmZ1bmN0aW9uIGN1cnJlbnRCYXJyaWVyPFQ+KHByb21pc2U6IENhbmNlbGxhYmxlUHJvbWlzZTxUPik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHB3cjogUGFydGlhbDxQcm9taXNlV2l0aFJlc29sdmVyczx2b2lkPj4gPSBwcm9taXNlW2JhcnJpZXJTeW1dID8/IHt9O1xyXG4gICAgaWYgKCEoJ3Byb21pc2UnIGluIHB3cikpIHtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHB3ciwgcHJvbWlzZVdpdGhSZXNvbHZlcnM8dm9pZD4oKSk7XHJcbiAgICB9XHJcbiAgICBpZiAocHJvbWlzZVtiYXJyaWVyU3ltXSA9PSBudWxsKSB7XHJcbiAgICAgICAgcHdyLnJlc29sdmUhKCk7XHJcbiAgICAgICAgcHJvbWlzZVtiYXJyaWVyU3ltXSA9IHB3cjtcclxuICAgIH1cclxuICAgIHJldHVybiBwd3IucHJvbWlzZSE7XHJcbn1cclxuXHJcbi8vIFBvbHlmaWxsIFByb21pc2Uud2l0aFJlc29sdmVycy5cclxubGV0IHByb21pc2VXaXRoUmVzb2x2ZXJzID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzO1xyXG5pZiAocHJvbWlzZVdpdGhSZXNvbHZlcnMgJiYgdHlwZW9mIHByb21pc2VXaXRoUmVzb2x2ZXJzID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICBwcm9taXNlV2l0aFJlc29sdmVycyA9IHByb21pc2VXaXRoUmVzb2x2ZXJzLmJpbmQoUHJvbWlzZSk7XHJcbn0gZWxzZSB7XHJcbiAgICBwcm9taXNlV2l0aFJlc29sdmVycyA9IGZ1bmN0aW9uIDxUPigpOiBQcm9taXNlV2l0aFJlc29sdmVyczxUPiB7XHJcbiAgICAgICAgbGV0IHJlc29sdmUhOiAodmFsdWU6IFQgfCBQcm9taXNlTGlrZTxUPikgPT4gdm9pZDtcclxuICAgICAgICBsZXQgcmVqZWN0ITogKHJlYXNvbj86IGFueSkgPT4gdm9pZDtcclxuICAgICAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2U8VD4oKHJlcywgcmVqKSA9PiB7IHJlc29sdmUgPSByZXM7IHJlamVjdCA9IHJlajsgfSk7XHJcbiAgICAgICAgcmV0dXJuIHsgcHJvbWlzZSwgcmVzb2x2ZSwgcmVqZWN0IH07XHJcbiAgICB9XHJcbn0iLCAiLypcclxuIF9cdCAgIF9fXHQgIF8gX19cclxufCB8XHQgLyAvX19fIF8oXykgL19fX19cclxufCB8IC98IC8gLyBfXyBgLyAvIC8gX19fL1xyXG58IHwvIHwvIC8gL18vIC8gLyAoX18gIClcclxufF9fL3xfXy9cXF9fLF8vXy9fL19fX18vXHJcblRoZSBlbGVjdHJvbiBhbHRlcm5hdGl2ZSBmb3IgR29cclxuKGMpIExlYSBBbnRob255IDIwMTktcHJlc2VudFxyXG4qL1xyXG5cclxuaW1wb3J0IHtuZXdSdW50aW1lQ2FsbGVyLCBvYmplY3ROYW1lc30gZnJvbSBcIi4vcnVudGltZS5qc1wiO1xyXG5cclxuY29uc3QgY2FsbCA9IG5ld1J1bnRpbWVDYWxsZXIob2JqZWN0TmFtZXMuQ2xpcGJvYXJkKTtcclxuXHJcbmNvbnN0IENsaXBib2FyZFNldFRleHQgPSAwO1xyXG5jb25zdCBDbGlwYm9hcmRUZXh0ID0gMTtcclxuXHJcbi8qKlxyXG4gKiBTZXRzIHRoZSB0ZXh0IHRvIHRoZSBDbGlwYm9hcmQuXHJcbiAqXHJcbiAqIEBwYXJhbSB0ZXh0IC0gVGhlIHRleHQgdG8gYmUgc2V0IHRvIHRoZSBDbGlwYm9hcmQuXHJcbiAqIEByZXR1cm4gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgb3BlcmF0aW9uIGlzIHN1Y2Nlc3NmdWwuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gU2V0VGV4dCh0ZXh0OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiBjYWxsKENsaXBib2FyZFNldFRleHQsIHt0ZXh0fSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZXQgdGhlIENsaXBib2FyZCB0ZXh0XHJcbiAqXHJcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHRleHQgZnJvbSB0aGUgQ2xpcGJvYXJkLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIFRleHQoKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIHJldHVybiBjYWxsKENsaXBib2FyZFRleHQpO1xyXG59XHJcbiIsICIvKlxyXG4gX1x0ICAgX19cdCAgXyBfX1xyXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xyXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXHJcbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxyXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cclxuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xyXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XHJcbiovXHJcblxyXG4vKipcclxuICogQW55IGlzIGEgZHVtbXkgY3JlYXRpb24gZnVuY3Rpb24gZm9yIHNpbXBsZSBvciB1bmtub3duIHR5cGVzLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIEFueTxUID0gYW55Pihzb3VyY2U6IGFueSk6IFQge1xyXG4gICAgcmV0dXJuIHNvdXJjZTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEJ5dGVTbGljZSBpcyBhIGNyZWF0aW9uIGZ1bmN0aW9uIHRoYXQgcmVwbGFjZXNcclxuICogbnVsbCBzdHJpbmdzIHdpdGggZW1wdHkgc3RyaW5ncy5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBCeXRlU2xpY2Uoc291cmNlOiBhbnkpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuICgoc291cmNlID09IG51bGwpID8gXCJcIiA6IHNvdXJjZSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBcnJheSB0YWtlcyBhIGNyZWF0aW9uIGZ1bmN0aW9uIGZvciBhbiBhcmJpdHJhcnkgdHlwZVxyXG4gKiBhbmQgcmV0dXJucyBhbiBpbi1wbGFjZSBjcmVhdGlvbiBmdW5jdGlvbiBmb3IgYW4gYXJyYXlcclxuICogd2hvc2UgZWxlbWVudHMgYXJlIG9mIHRoYXQgdHlwZS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBBcnJheTxUID0gYW55PihlbGVtZW50OiAoc291cmNlOiBhbnkpID0+IFQpOiAoc291cmNlOiBhbnkpID0+IFRbXSB7XHJcbiAgICBpZiAoZWxlbWVudCA9PT0gQW55KSB7XHJcbiAgICAgICAgcmV0dXJuIChzb3VyY2UpID0+IChzb3VyY2UgPT09IG51bGwgPyBbXSA6IHNvdXJjZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIChzb3VyY2UpID0+IHtcclxuICAgICAgICBpZiAoc291cmNlID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3VyY2UubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgc291cmNlW2ldID0gZWxlbWVudChzb3VyY2VbaV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc291cmNlO1xyXG4gICAgfTtcclxufVxyXG5cclxuLyoqXHJcbiAqIE1hcCB0YWtlcyBjcmVhdGlvbiBmdW5jdGlvbnMgZm9yIHR3byBhcmJpdHJhcnkgdHlwZXNcclxuICogYW5kIHJldHVybnMgYW4gaW4tcGxhY2UgY3JlYXRpb24gZnVuY3Rpb24gZm9yIGFuIG9iamVjdFxyXG4gKiB3aG9zZSBrZXlzIGFuZCB2YWx1ZXMgYXJlIG9mIHRob3NlIHR5cGVzLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIE1hcDxWID0gYW55PihrZXk6IChzb3VyY2U6IGFueSkgPT4gc3RyaW5nLCB2YWx1ZTogKHNvdXJjZTogYW55KSA9PiBWKTogKHNvdXJjZTogYW55KSA9PiBSZWNvcmQ8c3RyaW5nLCBWPiB7XHJcbiAgICBpZiAodmFsdWUgPT09IEFueSkge1xyXG4gICAgICAgIHJldHVybiAoc291cmNlKSA9PiAoc291cmNlID09PSBudWxsID8ge30gOiBzb3VyY2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiAoc291cmNlKSA9PiB7XHJcbiAgICAgICAgaWYgKHNvdXJjZSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZXR1cm4ge307XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHNvdXJjZSkge1xyXG4gICAgICAgICAgICBzb3VyY2Vba2V5XSA9IHZhbHVlKHNvdXJjZVtrZXldKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHNvdXJjZTtcclxuICAgIH07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBOdWxsYWJsZSB0YWtlcyBhIGNyZWF0aW9uIGZ1bmN0aW9uIGZvciBhbiBhcmJpdHJhcnkgdHlwZVxyXG4gKiBhbmQgcmV0dXJucyBhIGNyZWF0aW9uIGZ1bmN0aW9uIGZvciBhIG51bGxhYmxlIHZhbHVlIG9mIHRoYXQgdHlwZS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBOdWxsYWJsZTxUID0gYW55PihlbGVtZW50OiAoc291cmNlOiBhbnkpID0+IFQpOiAoc291cmNlOiBhbnkpID0+IChUIHwgbnVsbCkge1xyXG4gICAgaWYgKGVsZW1lbnQgPT09IEFueSkge1xyXG4gICAgICAgIHJldHVybiBBbnk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIChzb3VyY2UpID0+IChzb3VyY2UgPT09IG51bGwgPyBudWxsIDogZWxlbWVudChzb3VyY2UpKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFN0cnVjdCB0YWtlcyBhbiBvYmplY3QgbWFwcGluZyBmaWVsZCBuYW1lcyB0byBjcmVhdGlvbiBmdW5jdGlvbnNcclxuICogYW5kIHJldHVybnMgYW4gaW4tcGxhY2UgY3JlYXRpb24gZnVuY3Rpb24gZm9yIGEgc3RydWN0LlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIFN0cnVjdChjcmVhdGVGaWVsZDogUmVjb3JkPHN0cmluZywgKHNvdXJjZTogYW55KSA9PiBhbnk+KTpcclxuICAgIDxVIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IGFueT4oc291cmNlOiBhbnkpID0+IFVcclxue1xyXG4gICAgbGV0IGFsbEFueSA9IHRydWU7XHJcbiAgICBmb3IgKGNvbnN0IG5hbWUgaW4gY3JlYXRlRmllbGQpIHtcclxuICAgICAgICBpZiAoY3JlYXRlRmllbGRbbmFtZV0gIT09IEFueSkge1xyXG4gICAgICAgICAgICBhbGxBbnkgPSBmYWxzZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKGFsbEFueSkge1xyXG4gICAgICAgIHJldHVybiBBbnk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIChzb3VyY2UpID0+IHtcclxuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgaW4gY3JlYXRlRmllbGQpIHtcclxuICAgICAgICAgICAgaWYgKG5hbWUgaW4gc291cmNlKSB7XHJcbiAgICAgICAgICAgICAgICBzb3VyY2VbbmFtZV0gPSBjcmVhdGVGaWVsZFtuYW1lXShzb3VyY2VbbmFtZV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzb3VyY2U7XHJcbiAgICB9O1xyXG59XHJcbiIsICIvKlxyXG4gX1x0ICAgX19cdCAgXyBfX1xyXG58IHxcdCAvIC9fX18gXyhfKSAvX19fX1xyXG58IHwgL3wgLyAvIF9fIGAvIC8gLyBfX18vXHJcbnwgfC8gfC8gLyAvXy8gLyAvIChfXyAgKVxyXG58X18vfF9fL1xcX18sXy9fL18vX19fXy9cclxuVGhlIGVsZWN0cm9uIGFsdGVybmF0aXZlIGZvciBHb1xyXG4oYykgTGVhIEFudGhvbnkgMjAxOS1wcmVzZW50XHJcbiovXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFNpemUge1xyXG4gICAgLyoqIFRoZSB3aWR0aCBvZiBhIHJlY3Rhbmd1bGFyIGFyZWEuICovXHJcbiAgICBXaWR0aDogbnVtYmVyO1xyXG4gICAgLyoqIFRoZSBoZWlnaHQgb2YgYSByZWN0YW5ndWxhciBhcmVhLiAqL1xyXG4gICAgSGVpZ2h0OiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVjdCB7XHJcbiAgICAvKiogVGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgb3JpZ2luLiAqL1xyXG4gICAgWDogbnVtYmVyO1xyXG4gICAgLyoqIFRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIG9yaWdpbi4gKi9cclxuICAgIFk6IG51bWJlcjtcclxuICAgIC8qKiBUaGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZS4gKi9cclxuICAgIFdpZHRoOiBudW1iZXI7XHJcbiAgICAvKiogVGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLiAqL1xyXG4gICAgSGVpZ2h0OiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2NyZWVuIHtcclxuICAgIC8qKiBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHNjcmVlbi4gKi9cclxuICAgIElEOiBzdHJpbmc7XHJcbiAgICAvKiogSHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgc2NyZWVuLiAqL1xyXG4gICAgTmFtZTogc3RyaW5nO1xyXG4gICAgLyoqIFRoZSBzY2FsZSBmYWN0b3Igb2YgdGhlIHNjcmVlbiAoRFBJLzk2KS4gMSA9IHN0YW5kYXJkIERQSSwgMiA9IEhpRFBJIChSZXRpbmEpLCBldGMuICovXHJcbiAgICBTY2FsZUZhY3RvcjogbnVtYmVyO1xyXG4gICAgLyoqIFRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHNjcmVlbi4gKi9cclxuICAgIFg6IG51bWJlcjtcclxuICAgIC8qKiBUaGUgWSBjb29yZGluYXRlIG9mIHRoZSBzY3JlZW4uICovXHJcbiAgICBZOiBudW1iZXI7XHJcbiAgICAvKiogQ29udGFpbnMgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIHNjcmVlbi4gKi9cclxuICAgIFNpemU6IFNpemU7XHJcbiAgICAvKiogQ29udGFpbnMgdGhlIGJvdW5kcyBvZiB0aGUgc2NyZWVuIGluIHRlcm1zIG9mIFgsIFksIFdpZHRoLCBhbmQgSGVpZ2h0LiAqL1xyXG4gICAgQm91bmRzOiBSZWN0O1xyXG4gICAgLyoqIENvbnRhaW5zIHRoZSBwaHlzaWNhbCBib3VuZHMgb2YgdGhlIHNjcmVlbiBpbiB0ZXJtcyBvZiBYLCBZLCBXaWR0aCwgYW5kIEhlaWdodCAoYmVmb3JlIHNjYWxpbmcpLiAqL1xyXG4gICAgUGh5c2ljYWxCb3VuZHM6IFJlY3Q7XHJcbiAgICAvKiogQ29udGFpbnMgdGhlIGFyZWEgb2YgdGhlIHNjcmVlbiB0aGF0IGlzIGFjdHVhbGx5IHVzYWJsZSAoZXhjbHVkaW5nIHRhc2tiYXIgYW5kIG90aGVyIHN5c3RlbSBVSSkuICovXHJcbiAgICBXb3JrQXJlYTogUmVjdDtcclxuICAgIC8qKiBDb250YWlucyB0aGUgcGh5c2ljYWwgV29ya0FyZWEgb2YgdGhlIHNjcmVlbiAoYmVmb3JlIHNjYWxpbmcpLiAqL1xyXG4gICAgUGh5c2ljYWxXb3JrQXJlYTogUmVjdDtcclxuICAgIC8qKiBUcnVlIGlmIHRoaXMgaXMgdGhlIHByaW1hcnkgbW9uaXRvciBzZWxlY3RlZCBieSB0aGUgdXNlciBpbiB0aGUgb3BlcmF0aW5nIHN5c3RlbS4gKi9cclxuICAgIElzUHJpbWFyeTogYm9vbGVhbjtcclxuICAgIC8qKiBUaGUgcm90YXRpb24gb2YgdGhlIHNjcmVlbi4gKi9cclxuICAgIFJvdGF0aW9uOiBudW1iZXI7XHJcbn1cclxuXHJcbmltcG9ydCB7IG5ld1J1bnRpbWVDYWxsZXIsIG9iamVjdE5hbWVzIH0gZnJvbSBcIi4vcnVudGltZS5qc1wiO1xyXG5jb25zdCBjYWxsID0gbmV3UnVudGltZUNhbGxlcihvYmplY3ROYW1lcy5TY3JlZW5zKTtcclxuXHJcbmNvbnN0IGdldEFsbCA9IDA7XHJcbmNvbnN0IGdldFByaW1hcnkgPSAxO1xyXG5jb25zdCBnZXRDdXJyZW50ID0gMjtcclxuXHJcbi8qKlxyXG4gKiBHZXRzIGFsbCBzY3JlZW5zLlxyXG4gKlxyXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBvZiBTY3JlZW4gb2JqZWN0cy5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBHZXRBbGwoKTogUHJvbWlzZTxTY3JlZW5bXT4ge1xyXG4gICAgcmV0dXJuIGNhbGwoZ2V0QWxsKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEdldHMgdGhlIHByaW1hcnkgc2NyZWVuLlxyXG4gKlxyXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcHJpbWFyeSBzY3JlZW4uXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gR2V0UHJpbWFyeSgpOiBQcm9taXNlPFNjcmVlbj4ge1xyXG4gICAgcmV0dXJuIGNhbGwoZ2V0UHJpbWFyeSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZXRzIHRoZSBjdXJyZW50IGFjdGl2ZSBzY3JlZW4uXHJcbiAqXHJcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGN1cnJlbnQgYWN0aXZlIHNjcmVlbi5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBHZXRDdXJyZW50KCk6IFByb21pc2U8U2NyZWVuPiB7XHJcbiAgICByZXR1cm4gY2FsbChnZXRDdXJyZW50KTtcclxufVxyXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7QUNBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7QUNBQTtBQUFBO0FBQUE7QUFBQTs7O0FDNkJBLElBQU0sY0FDRjtBQUVHLFNBQVMsT0FBTyxPQUFlLElBQVk7QUFDOUMsTUFBSSxLQUFLO0FBRVQsTUFBSSxJQUFJLE9BQU87QUFDZixTQUFP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QUEsSUFDcEIsNEJBQTRCO0FBQUEsSUFDNUIsc0JBQXNCO0FBQUEsSUFDdEIsc0JBQXNCO0FBQUEsSUFDdEIsK0JBQStCO0FBQUEsSUFDL0IsNkJBQTZCO0FBQUEsSUFDN0IsZ0NBQWdDO0FBQUEsSUFDaEMscUJBQXFCO0FBQUEsSUFDckIsNkJBQTZCO0FBQUEsSUFDN0IsMEJBQTBCO0FBQUEsSUFDMUIsdUJBQXVCO0FBQUEsSUFDdkIsdUJBQXVCO0FBQUEsSUFDdkIsZ0JBQWdCO0FBQUEsSUFDaEIsc0JBQXNCO0FBQUEsSUFDdEIsY0FBYztBQUFBLElBQ2Qsb0JBQW9CO0FBQUEsSUFDcEIsb0JBQW9CO0FBQUEsSUFDcEIsc0JBQXNCO0FBQUEsSUFDdEIsYUFBYTtBQUFBLElBQ2IsY0FBYztBQUFBLElBQ2QsbUJBQW1CO0FBQUEsSUFDbkIsbUJBQW1CO0FBQUEsSUFDbkIseUJBQXlCO0FBQUEsSUFDekIsZUFBZTtBQUFBLElBQ2YsaUJBQWlCO0FBQUEsSUFDakIsdUJBQXVCO0FBQUEsSUFDdkIscUJBQXFCO0FBQUEsSUFDckIscUJBQXFCO0FBQUEsSUFDckIsdUJBQXVCO0FBQUEsSUFDdkIsY0FBYztBQUFBLElBQ2QsZUFBZTtBQUFBLElBQ2Ysb0JBQW9CO0FBQUEsSUFDcEIsb0JBQW9CO0FBQUEsSUFDcEIsMEJBQTBCO0FBQUEsSUFDMUIsZ0JBQWdCO0FBQUEsSUFDaEIsNEJBQTRCO0FBQUEsSUFDNUIsNEJBQTRCO0FBQUEsSUFDNUIseURBQXlEO0FBQUEsSUFDekQsc0NBQXNDO0FBQUEsSUFDdEMsb0JBQW9CO0FBQUEsSUFDcEIscUJBQXFCO0FBQUEsSUFDckIscUJBQXFCO0FBQUEsSUFDckIsc0JBQXNCO0FBQUEsSUFDdEIsZ0NBQWdDO0FBQUEsSUFDaEMsa0NBQWtDO0FBQUEsSUFDbEMsbUNBQW1DO0FBQUEsSUFDbkMsb0NBQW9DO0FBQUEsSUFDcEMsK0JBQStCO0FBQUEsSUFDL0IsNkJBQTZCO0FBQUEsSUFDN0IsdUJBQXVCO0FBQUEsSUFDdkIsaUNBQWlDO0FBQUEsSUFDakMsOEJBQThCO0FBQUEsSUFDOUIsNEJBQTRCO0FBQUEsSUFDNUIsc0NBQXNDO0FBQUEsSUFDdEMsNEJBQTRCO0FBQUEsSUFDNUIsc0JBQXNCO0FBQUEsSUFDdEIsa0NBQWtDO0FBQUEsSUFDbEMsc0JBQXNCO0FBQUEsSUFDdEIsd0JBQXdCO0FBQUEsSUFDeEIsd0JBQXdCO0FBQUEsSUFDeEIsbUJBQW1CO0FBQUEsSUFDbkIsMEJBQTBCO0FBQUEsSUFDMUIsOEJBQThCO0FBQUEsSUFDOUIseUJBQXlCO0FBQUEsSUFDekIsNkJBQTZCO0FBQUEsSUFDN0IsaUJBQWlCO0FBQUEsSUFDakIsZ0JBQWdCO0FBQUEsSUFDaEIsc0JBQXNCO0FBQUEsSUFDdEIsZUFBZTtBQUFBLElBQ2YseUJBQXlCO0FBQUEsSUFDekIsd0JBQXdCO0FBQUEsSUFDeEIsb0JBQW9CO0FBQUEsSUFDcEIscUJBQXFCO0FBQUEsSUFDckIsaUJBQWlCO0FBQUEsSUFDakIsaUJBQWlCO0FBQUEsSUFDakIsc0JBQXNCO0FBQUEsSUFDdEIsbUNBQW1DO0FBQUEsSUFDbkMscUNBQXFDO0FBQUEsSUFDckMsdUJBQXVCO0FBQUEsSUFDdkIsc0JBQXNCO0FBQUEsSUFDdEIsd0JBQXdCO0FBQUEsSUFDeEIsZUFBZTtBQUFBLElBQ2YsMkJBQTJCO0FBQUEsSUFDM0IsMEJBQTBCO0FBQUEsSUFDMUIsNkJBQTZCO0FBQUEsSUFDN0IsWUFBWTtBQUFBLElBQ1osZ0JBQWdCO0FBQUEsSUFDaEIsa0JBQWtCO0FBQUEsSUFDbEIsZ0JBQWdCO0FBQUEsSUFDaEIsa0JBQWtCO0FBQUEsSUFDbEIsbUJBQW1CO0FBQUEsSUFDbkIsWUFBWTtBQUFBLElBQ1oscUJBQXFCO0FBQUEsSUFDckIsc0JBQXNCO0FBQUEsSUFDdEIsc0JBQXNCO0FBQUEsSUFDdEIsOEJBQThCO0FBQUEsSUFDOUIsaUJBQWlCO0FBQUEsSUFDakIseUJBQXlCO0FBQUEsSUFDekIsMkJBQTJCO0FBQUEsSUFDM0IsK0JBQStCO0FBQUEsSUFDL0IsMEJBQTBCO0FBQUEsSUFDMUIsOEJBQThCO0FBQUEsSUFDOUIsaUJB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WDtBQUVBLFNBQU8sQ0FBQyxXQUFXO0FBQ2YsZUFBVyxRQUFRLGFBQWE7QUFDNUIsVUFBSSxRQUFRLFFBQVE7QUFDaEIsZUFBTyxJQUFJLElBQUksWUFBWSxJQUFJLEVBQUUsT0FBTyxJQUFJLENBQUM7QUFBQSxNQUNqRDtBQUFBLElBQ0o7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUNKOzs7QUN6R0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBd0RBLElBQU1DLFFBQU8saUJBQWlCLFlBQVksT0FBTztBQUVqRCxJQUFNLFNBQVM7QUFDZixJQUFNLGFBQWE7QUFDbkIsSUFBTSxhQUFhO0FBT1osU0FBUyxTQUE0QjtBQUN4QyxTQUFPQSxNQUFLLE1BQU07QUFDdEI7QUFPTyxTQUFTLGFBQThCO0FBQzFDLFNBQU9BLE1BQUssVUFBVTtBQUMxQjtBQU9PLFNBQVMsYUFBOEI7QUFDMUMsU0FBT0EsTUFBSyxVQUFVO0FBQzFCOzs7QXRCNUVBLE9BQU8sU0FBUyxPQUFPLFVBQVUsQ0FBQztBQTRDbEMsT0FBTyxPQUFPLFNBQWdCO0FBQ3ZCLE9BQU8scUJBQXFCOyIsCiAgIm5hbWVzIjogWyJfYSIsICJFcnJvciIsICJjYWxsIiwgIl9hIiwgIkVycm9yIiwgImNhbGwiLCAiX2EiLCAicmVzaXphYmxlIiwgImNhbGwiLCAiX2EiLCAiY2FsbCIsICJjYWxsIiwgIkhpZGVNZXRob2QiLCAiU2hvd01ldGhvZCIsICJpc0RvY3VtZW50RG90QWxsIiwgIl9hIiwgInJlYXNvbiIsICJ2YWx1ZSIsICJjYWxsIiwgImdldEFuZERlbGV0ZVJlc3BvbnNlIiwgImdlbmVyYXRlSUQiLCAiY2FsbCIsICJBcnJheSIsICJNYXAiLCAiQXJyYXkiLCAiTWFwIiwgImtleSIsICJjYWxsIl0KfQo= diff --git a/v3/internal/assetserver/bundledassets/runtime.js b/v3/internal/assetserver/bundledassets/runtime.js index 25dea97a0..3d105fdd2 100644 --- a/v3/internal/assetserver/bundledassets/runtime.js +++ b/v3/internal/assetserver/bundledassets/runtime.js @@ -1 +1 @@ -var Fe=Object.defineProperty,an=Object.defineProperties;var ln=Object.getOwnPropertyDescriptors;var ke=Object.getOwnPropertySymbols;var cn=Object.prototype.hasOwnProperty,dn=Object.prototype.propertyIsEnumerable;var Oe=(n,e,i)=>e in n?Fe(n,e,{enumerable:!0,configurable:!0,writable:!0,value:i}):n[e]=i,Le=(n,e)=>{for(var i in e||(e={}))cn.call(e,i)&&Oe(n,i,e[i]);if(ke)for(var i of ke(e))dn.call(e,i)&&Oe(n,i,e[i]);return n},Ue=(n,e)=>an(n,ln(e));var u=(n,e)=>{for(var i in e)Fe(n,i,{get:e[i],enumerable:!0})};var ce={};u(ce,{Application:()=>ve,Browser:()=>_,Call:()=>Te,CancelError:()=>k,CancellablePromise:()=>j,CancelledRejectionError:()=>W,Clipboard:()=>xe,Create:()=>Ae,Dialogs:()=>ee,Events:()=>oe,Flags:()=>we,Screens:()=>Ee,System:()=>ue,WML:()=>le,Window:()=>Z});var le={};u(le,{Enable:()=>ae,Reload:()=>Ke});var _={};u(_,{OpenURL:()=>q});var mn="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";function P(n=21){let e="",i=n|0;for(;i--;)e+=mn[Math.random()*64|0];return e}var un=window.location.origin+"/wails/runtime",d=Object.freeze({Call:0,Clipboard:1,Application:2,Events:3,ContextMenu:4,Dialog:5,Window:6,Screens:7,System:8,Browser:9,CancelCall:10}),wn=P();function m(n,e=""){return function(i,o=null){return pn(n,i,e,o)}}async function pn(n,e,i,o){var l,c;let t=new URL(un);t.searchParams.append("object",n.toString()),t.searchParams.append("method",e.toString()),o&&t.searchParams.append("args",JSON.stringify(o));let r={"x-wails-client-id":wn};i&&(r["x-wails-window-name"]=i);let a=await fetch(t,{headers:r});if(!a.ok)throw new Error(await a.text());return((c=(l=a.headers.get("Content-Type"))==null?void 0:l.indexOf("application/json"))!=null?c:-1)!==-1?a.json():a.text()}var fn=m(d.Browser),gn=0;function q(n){return fn(gn,{url:n.toString()})}var ee={};u(ee,{Error:()=>An,Info:()=>Tn,OpenFile:()=>Rn,Question:()=>$,SaveFile:()=>En,Warning:()=>xn});window._wails=window._wails||{};window._wails.dialogErrorCallback=Mn;window._wails.dialogResultCallback=Dn;var hn=m(d.Dialog),F=new Map,Wn=0,bn=1,vn=2,yn=3,Cn=4,Pn=5;function Dn(n,e,i){let o=Ie(n);if(o)if(i)try{o.resolve(JSON.parse(e))}catch(t){o.reject(new TypeError("could not parse result: "+t.message,{cause:t}))}else o.resolve(e)}function Mn(n,e){var i;(i=Ie(n))==null||i.reject(new window.Error(e))}function Ie(n){let e=F.get(n);return F.delete(n),e}function Sn(){let n;do n=P();while(F.has(n));return n}function D(n,e={}){let i=Sn();return new Promise((o,t)=>{F.set(i,{resolve:o,reject:t}),hn(n,Object.assign({"dialog-id":i},e)).catch(r=>{F.delete(i),t(r)})})}function Tn(n){return D(Wn,n)}function xn(n){return D(bn,n)}function An(n){return D(vn,n)}function $(n){return D(yn,n)}function Rn(n){var e;return(e=D(Cn,n))!=null?e:[]}function En(n){return D(Pn,n)}var oe={};u(oe,{Emit:()=>ie,Off:()=>In,OffAll:()=>zn,On:()=>Ln,OnMultiple:()=>ne,Once:()=>Un,Types:()=>je,WailsEvent:()=>M});var p=new Map,B=class{constructor(e,i,o){this.eventName=e,this.callback=i,this.maxCallbacks=o||-1}dispatch(e){try{this.callback(e)}catch(i){}return this.maxCallbacks===-1?!1:(this.maxCallbacks-=1,this.maxCallbacks===0)}};function ze(n){let e=p.get(n.eventName);e&&(e=e.filter(i=>i!==n),e.length===0?p.delete(n.eventName):p.set(n.eventName,e))}var je=Object.freeze({Windows:Object.freeze({APMPowerSettingChange:"windows:APMPowerSettingChange",APMPowerStatusChange:"windows:APMPowerStatusChange",APMResumeAutomatic:"windows:APMResumeAutomatic",APMResumeSuspend:"windows:APMResumeSuspend",APMSuspend:"windows:APMSuspend",ApplicationStarted:"windows:ApplicationStarted",SystemThemeChanged:"windows:SystemThemeChanged",WebViewNavigationCompleted:"windows:WebViewNavigationCompleted",WindowActive:"windows:WindowActive",WindowBackgroundErase:"windows:WindowBackgroundErase",WindowClickActive:"windows:WindowClickActive",WindowClosing:"windows:WindowClosing",WindowDidMove:"windows:WindowDidMove",WindowDidResize:"windows:WindowDidResize",WindowDPIChanged:"windows:WindowDPIChanged",WindowDragDrop:"windows:WindowDragDrop",WindowDragEnter:"windows:WindowDragEnter",WindowDragLeave:"windows:WindowDragLeave",WindowDragOver:"windows:WindowDragOver",WindowEndMove:"windows:WindowEndMove",WindowEndResize:"windows:WindowEndResize",WindowFullscreen:"windows:WindowFullscreen",WindowHide:"windows:WindowHide",WindowInactive:"windows:WindowInactive",WindowKeyDown:"windows:WindowKeyDown",WindowKeyUp:"windows:WindowKeyUp",WindowKillFocus:"windows:WindowKillFocus",WindowNonClientHit:"windows:WindowNonClientHit",WindowNonClientMouseDown:"windows:WindowNonClientMouseDown",WindowNonClientMouseLeave:"windows:WindowNonClientMouseLeave",WindowNonClientMouseMove:"windows:WindowNonClientMouseMove",WindowNonClientMouseUp:"windows:WindowNonClientMouseUp",WindowPaint:"windows:WindowPaint",WindowRestore:"windows:WindowRestore",WindowSetFocus:"windows:WindowSetFocus",WindowShow:"windows:WindowShow",WindowStartMove:"windows:WindowStartMove",WindowStartResize:"windows:WindowStartResize",WindowUnFullscreen:"windows:WindowUnFullscreen",WindowZOrderChanged:"windows:WindowZOrderChanged",WindowMinimise:"windows:WindowMinimise",WindowUnMinimise:"windows:WindowUnMinimise",WindowMaximise:"windows:WindowMaximise",WindowUnMaximise:"windows:WindowUnMaximise"}),Mac:Object.freeze({ApplicationDidBecomeActive:"mac:ApplicationDidBecomeActive",ApplicationDidChangeBackingProperties:"mac:ApplicationDidChangeBackingProperties",ApplicationDidChangeEffectiveAppearance:"mac:ApplicationDidChangeEffectiveAppearance",ApplicationDidChangeIcon:"mac:ApplicationDidChangeIcon",ApplicationDidChangeOcclusionState:"mac:ApplicationDidChangeOcclusionState",ApplicationDidChangeScreenParameters:"mac:ApplicationDidChangeScreenParameters",ApplicationDidChangeStatusBarFrame:"mac:ApplicationDidChangeStatusBarFrame",ApplicationDidChangeStatusBarOrientation:"mac:ApplicationDidChangeStatusBarOrientation",ApplicationDidChangeTheme:"mac:ApplicationDidChangeTheme",ApplicationDidFinishLaunching:"mac:ApplicationDidFinishLaunching",ApplicationDidHide:"mac:ApplicationDidHide",ApplicationDidResignActive:"mac:ApplicationDidResignActive",ApplicationDidUnhide:"mac:ApplicationDidUnhide",ApplicationDidUpdate:"mac:ApplicationDidUpdate",ApplicationShouldHandleReopen:"mac:ApplicationShouldHandleReopen",ApplicationWillBecomeActive:"mac:ApplicationWillBecomeActive",ApplicationWillFinishLaunching:"mac:ApplicationWillFinishLaunching",ApplicationWillHide:"mac:ApplicationWillHide",ApplicationWillResignActive:"mac:ApplicationWillResignActive",ApplicationWillTerminate:"mac:ApplicationWillTerminate",ApplicationWillUnhide:"mac:ApplicationWillUnhide",ApplicationWillUpdate:"mac:ApplicationWillUpdate",MenuDidAddItem:"mac:MenuDidAddItem",MenuDidBeginTracking:"mac:MenuDidBeginTracking",MenuDidClose:"mac:MenuDidClose",MenuDidDisplayItem:"mac:MenuDidDisplayItem",MenuDidEndTracking:"mac:MenuDidEndTracking",MenuDidHighlightItem:"mac:MenuDidHighlightItem",MenuDidOpen:"mac:MenuDidOpen",MenuDidPopUp:"mac:MenuDidPopUp",MenuDidRemoveItem:"mac:MenuDidRemoveItem",MenuDidSendAction:"mac:MenuDidSendAction",MenuDidSendActionToItem:"mac:MenuDidSendActionToItem",MenuDidUpdate:"mac:MenuDidUpdate",MenuWillAddItem:"mac:MenuWillAddItem",MenuWillBeginTracking:"mac:MenuWillBeginTracking",MenuWillDisplayItem:"mac:MenuWillDisplayItem",MenuWillEndTracking:"mac:MenuWillEndTracking",MenuWillHighlightItem:"mac:MenuWillHighlightItem",MenuWillOpen:"mac:MenuWillOpen",MenuWillPopUp:"mac:MenuWillPopUp",MenuWillRemoveItem:"mac:MenuWillRemoveItem",MenuWillSendAction:"mac:MenuWillSendAction",MenuWillSendActionToItem:"mac:MenuWillSendActionToItem",MenuWillUpdate:"mac:MenuWillUpdate",WebViewDidCommitNavigation:"mac:WebViewDidCommitNavigation",WebViewDidFinishNavigation:"mac:WebViewDidFinishNavigation",WebViewDidReceiveServerRedirectForProvisionalNavigation:"mac:WebViewDidReceiveServerRedirectForProvisionalNavigation",WebViewDidStartProvisionalNavigation:"mac:WebViewDidStartProvisionalNavigation",WindowDidBecomeKey:"mac:WindowDidBecomeKey",WindowDidBecomeMain:"mac:WindowDidBecomeMain",WindowDidBeginSheet:"mac:WindowDidBeginSheet",WindowDidChangeAlpha:"mac:WindowDidChangeAlpha",WindowDidChangeBackingLocation:"mac:WindowDidChangeBackingLocation",WindowDidChangeBackingProperties:"mac:WindowDidChangeBackingProperties",WindowDidChangeCollectionBehavior:"mac:WindowDidChangeCollectionBehavior",WindowDidChangeEffectiveAppearance:"mac:WindowDidChangeEffectiveAppearance",WindowDidChangeOcclusionState:"mac:WindowDidChangeOcclusionState",WindowDidChangeOrderingMode:"mac:WindowDidChangeOrderingMode",WindowDidChangeScreen:"mac:WindowDidChangeScreen",WindowDidChangeScreenParameters:"mac:WindowDidChangeScreenParameters",WindowDidChangeScreenProfile:"mac:WindowDidChangeScreenProfile",WindowDidChangeScreenSpace:"mac:WindowDidChangeScreenSpace",WindowDidChangeScreenSpaceProperties:"mac:WindowDidChangeScreenSpaceProperties",WindowDidChangeSharingType:"mac:WindowDidChangeSharingType",WindowDidChangeSpace:"mac:WindowDidChangeSpace",WindowDidChangeSpaceOrderingMode:"mac:WindowDidChangeSpaceOrderingMode",WindowDidChangeTitle:"mac:WindowDidChangeTitle",WindowDidChangeToolbar:"mac:WindowDidChangeToolbar",WindowDidDeminiaturize:"mac:WindowDidDeminiaturize",WindowDidEndSheet:"mac:WindowDidEndSheet",WindowDidEnterFullScreen:"mac:WindowDidEnterFullScreen",WindowDidEnterVersionBrowser:"mac:WindowDidEnterVersionBrowser",WindowDidExitFullScreen:"mac:WindowDidExitFullScreen",WindowDidExitVersionBrowser:"mac:WindowDidExitVersionBrowser",WindowDidExpose:"mac:WindowDidExpose",WindowDidFocus:"mac:WindowDidFocus",WindowDidMiniaturize:"mac:WindowDidMiniaturize",WindowDidMove:"mac:WindowDidMove",WindowDidOrderOffScreen:"mac:WindowDidOrderOffScreen",WindowDidOrderOnScreen:"mac:WindowDidOrderOnScreen",WindowDidResignKey:"mac:WindowDidResignKey",WindowDidResignMain:"mac:WindowDidResignMain",WindowDidResize:"mac:WindowDidResize",WindowDidUpdate:"mac:WindowDidUpdate",WindowDidUpdateAlpha:"mac:WindowDidUpdateAlpha",WindowDidUpdateCollectionBehavior:"mac:WindowDidUpdateCollectionBehavior",WindowDidUpdateCollectionProperties:"mac:WindowDidUpdateCollectionProperties",WindowDidUpdateShadow:"mac:WindowDidUpdateShadow",WindowDidUpdateTitle:"mac:WindowDidUpdateTitle",WindowDidUpdateToolbar:"mac:WindowDidUpdateToolbar",WindowDidZoom:"mac:WindowDidZoom",WindowFileDraggingEntered:"mac:WindowFileDraggingEntered",WindowFileDraggingExited:"mac:WindowFileDraggingExited",WindowFileDraggingPerformed:"mac:WindowFileDraggingPerformed",WindowHide:"mac:WindowHide",WindowMaximise:"mac:WindowMaximise",WindowUnMaximise:"mac:WindowUnMaximise",WindowMinimise:"mac:WindowMinimise",WindowUnMinimise:"mac:WindowUnMinimise",WindowShouldClose:"mac:WindowShouldClose",WindowShow:"mac:WindowShow",WindowWillBecomeKey:"mac:WindowWillBecomeKey",WindowWillBecomeMain:"mac:WindowWillBecomeMain",WindowWillBeginSheet:"mac:WindowWillBeginSheet",WindowWillChangeOrderingMode:"mac:WindowWillChangeOrderingMode",WindowWillClose:"mac:WindowWillClose",WindowWillDeminiaturize:"mac:WindowWillDeminiaturize",WindowWillEnterFullScreen:"mac:WindowWillEnterFullScreen",WindowWillEnterVersionBrowser:"mac:WindowWillEnterVersionBrowser",WindowWillExitFullScreen:"mac:WindowWillExitFullScreen",WindowWillExitVersionBrowser:"mac:WindowWillExitVersionBrowser",WindowWillFocus:"mac:WindowWillFocus",WindowWillMiniaturize:"mac:WindowWillMiniaturize",WindowWillMove:"mac:WindowWillMove",WindowWillOrderOffScreen:"mac:WindowWillOrderOffScreen",WindowWillOrderOnScreen:"mac:WindowWillOrderOnScreen",WindowWillResignMain:"mac:WindowWillResignMain",WindowWillResize:"mac:WindowWillResize",WindowWillUnfocus:"mac:WindowWillUnfocus",WindowWillUpdate:"mac:WindowWillUpdate",WindowWillUpdateAlpha:"mac:WindowWillUpdateAlpha",WindowWillUpdateCollectionBehavior:"mac:WindowWillUpdateCollectionBehavior",WindowWillUpdateCollectionProperties:"mac:WindowWillUpdateCollectionProperties",WindowWillUpdateShadow:"mac:WindowWillUpdateShadow",WindowWillUpdateTitle:"mac:WindowWillUpdateTitle",WindowWillUpdateToolbar:"mac:WindowWillUpdateToolbar",WindowWillUpdateVisibility:"mac:WindowWillUpdateVisibility",WindowWillUseStandardFrame:"mac:WindowWillUseStandardFrame",WindowZoomIn:"mac:WindowZoomIn",WindowZoomOut:"mac:WindowZoomOut",WindowZoomReset:"mac:WindowZoomReset"}),Linux:Object.freeze({ApplicationStartup:"linux:ApplicationStartup",SystemThemeChanged:"linux:SystemThemeChanged",WindowDeleteEvent:"linux:WindowDeleteEvent",WindowDidMove:"linux:WindowDidMove",WindowDidResize:"linux:WindowDidResize",WindowFocusIn:"linux:WindowFocusIn",WindowFocusOut:"linux:WindowFocusOut",WindowLoadChanged:"linux:WindowLoadChanged"}),Common:Object.freeze({ApplicationOpenedWithFile:"common:ApplicationOpenedWithFile",ApplicationStarted:"common:ApplicationStarted",ThemeChanged:"common:ThemeChanged",WindowClosing:"common:WindowClosing",WindowDidMove:"common:WindowDidMove",WindowDidResize:"common:WindowDidResize",WindowDPIChanged:"common:WindowDPIChanged",WindowFilesDropped:"common:WindowFilesDropped",WindowFocus:"common:WindowFocus",WindowFullscreen:"common:WindowFullscreen",WindowHide:"common:WindowHide",WindowLostFocus:"common:WindowLostFocus",WindowMaximise:"common:WindowMaximise",WindowMinimise:"common:WindowMinimise",WindowRestore:"common:WindowRestore",WindowRuntimeReady:"common:WindowRuntimeReady",WindowShow:"common:WindowShow",WindowUnFullscreen:"common:WindowUnFullscreen",WindowUnMaximise:"common:WindowUnMaximise",WindowUnMinimise:"common:WindowUnMinimise",WindowZoom:"common:WindowZoom",WindowZoomIn:"common:WindowZoomIn",WindowZoomOut:"common:WindowZoomOut",WindowZoomReset:"common:WindowZoomReset"})});window._wails=window._wails||{};window._wails.dispatchWailsEvent=Fn;var kn=m(d.Events),On=0,M=class{constructor(e,i=null){this.name=e,this.data=i}};function Fn(n){let e=p.get(n.name);if(!e)return;let i=new M(n.name,n.data);"sender"in n&&(i.sender=n.sender),e=e.filter(o=>!o.dispatch(i)),e.length===0?p.delete(n.name):p.set(n.name,e)}function ne(n,e,i){let o=p.get(n)||[],t=new B(n,e,i);return o.push(t),p.set(n,o),()=>ze(t)}function Ln(n,e){return ne(n,e,-1)}function Un(n,e){return ne(n,e,1)}function In(...n){n.forEach(e=>p.delete(e))}function zn(){p.clear()}function ie(n){return kn(On,n)}function Be(){return new MouseEvent("mousedown").buttons===0}function He(){if(!EventTarget||!AbortSignal||!AbortController)return!1;let n=!0,e=new EventTarget,i=new AbortController;return e.addEventListener("test",()=>{n=!1},{signal:i.signal}),i.abort(),e.dispatchEvent(new CustomEvent("test")),n}function H(n){var e;return n.target instanceof HTMLElement?n.target:!(n.target instanceof HTMLElement)&&n.target instanceof Node&&(e=n.target.parentElement)!=null?e:document.body}var Ne=!1;document.addEventListener("DOMContentLoaded",()=>{Ne=!0});function Ze(n){Ne||document.readyState==="complete"?n():document.addEventListener("DOMContentLoaded",n)}var jn=0,Bn=1,Hn=2,Nn=3,Zn=4,Vn=5,Gn=6,Kn=7,Yn=8,Xn=9,Jn=10,Qn=11,qn=12,_n=13,$n=14,ei=15,ni=16,ii=17,oi=18,ti=19,ri=20,si=21,ai=22,li=23,ci=24,di=25,mi=26,ui=27,wi=28,pi=29,fi=30,gi=31,hi=32,Wi=33,bi=34,vi=35,yi=36,Ci=37,Pi=38,Di=39,Mi=40,Si=41,Ti=42,xi=43,Ai=44,Ri=45,Ei=46,ki=47,s=Symbol("caller");s;var N=class N{constructor(e=""){this[s]=m(d.Window,e);for(let i of Object.getOwnPropertyNames(N.prototype))i!=="constructor"&&typeof this[i]=="function"&&(this[i]=this[i].bind(this))}Get(e){return new N(e)}Position(){return this[s](jn)}Center(){return this[s](Bn)}Close(){return this[s](Hn)}DisableSizeConstraints(){return this[s](Nn)}EnableSizeConstraints(){return this[s](Zn)}Focus(){return this[s](Vn)}ForceReload(){return this[s](Gn)}Fullscreen(){return this[s](Kn)}GetScreen(){return this[s](Yn)}GetZoom(){return this[s](Xn)}Height(){return this[s](Jn)}Hide(){return this[s](Qn)}IsFocused(){return this[s](qn)}IsFullscreen(){return this[s](_n)}IsMaximised(){return this[s]($n)}IsMinimised(){return this[s](ei)}Maximise(){return this[s](ni)}Minimise(){return this[s](ii)}Name(){return this[s](oi)}OpenDevTools(){return this[s](ti)}RelativePosition(){return this[s](ri)}Reload(){return this[s](si)}Resizable(){return this[s](ai)}Restore(){return this[s](li)}SetPosition(e,i){return this[s](ci,{x:e,y:i})}SetAlwaysOnTop(e){return this[s](di,{alwaysOnTop:e})}SetBackgroundColour(e,i,o,t){return this[s](mi,{r:e,g:i,b:o,a:t})}SetFrameless(e){return this[s](ui,{frameless:e})}SetFullscreenButtonEnabled(e){return this[s](wi,{enabled:e})}SetMaxSize(e,i){return this[s](pi,{width:e,height:i})}SetMinSize(e,i){return this[s](fi,{width:e,height:i})}SetRelativePosition(e,i){return this[s](gi,{x:e,y:i})}SetResizable(e){return this[s](hi,{resizable:e})}SetSize(e,i){return this[s](Wi,{width:e,height:i})}SetTitle(e){return this[s](bi,{title:e})}SetZoom(e){return this[s](vi,{zoom:e})}Show(){return this[s](yi)}Size(){return this[s](Ci)}ToggleFullscreen(){return this[s](Pi)}ToggleMaximise(){return this[s](Di)}UnFullscreen(){return this[s](Mi)}UnMaximise(){return this[s](Si)}UnMinimise(){return this[s](Ti)}Width(){return this[s](xi)}Zoom(){return this[s](Ai)}ZoomIn(){return this[s](Ri)}ZoomOut(){return this[s](Ei)}ZoomReset(){return this[s](ki)}},te=N,Oi=new te(""),Z=Oi;function Fi(n,e=null){ie(new M(n,e))}function Li(n,e){let i=Z.Get(n),o=i[e];if(typeof o=="function")try{o.call(i)}catch(t){}}function Ve(n){let e=n.currentTarget;function i(t="Yes"){if(t!=="Yes")return;let r=e.getAttribute("wml-event")||e.getAttribute("data-wml-event"),a=e.getAttribute("wml-target-window")||e.getAttribute("data-wml-target-window")||"",l=e.getAttribute("wml-window")||e.getAttribute("data-wml-window"),c=e.getAttribute("wml-openurl")||e.getAttribute("data-wml-openurl");r!==null&&Fi(r),l!==null&&Li(a,l),c!==null&&q(c)}let o=e.getAttribute("wml-confirm")||e.getAttribute("data-wml-confirm");o?$({Title:"Confirm",Message:o,Detached:!1,Buttons:[{Label:"Yes"},{Label:"No",IsDefault:!0}]}).then(i):i()}var L=Symbol("controller"),S=Symbol("triggerMap"),b=Symbol("elementCount");L;var re=class{constructor(){this[L]=new AbortController}set(e,i){return{signal:this[L].signal}}reset(){this[L].abort(),this[L]=new AbortController}};S,b;var se=class{constructor(){this[S]=new WeakMap,this[b]=0}set(e,i){return this[S].has(e)||this[b]++,this[S].set(e,i),{}}reset(){if(!(this[b]<=0)){for(let e of document.body.querySelectorAll("*")){if(this[b]<=0)break;let i=this[S].get(e);i!=null&&this[b]--;for(let o of i||[])e.removeEventListener(o,Ve)}this[S]=new WeakMap,this[b]=0}}},Ge=He()?new re:new se;function Ui(n){let e=/\S+/g,i=n.getAttribute("wml-trigger")||n.getAttribute("data-wml-trigger")||"click",o=[],t;for(;(t=e.exec(i))!==null;)o.push(t[0]);let r=Ge.set(n,o);for(let a of o)n.addEventListener(a,Ve,r)}function ae(){Ze(Ke)}function Ke(){Ge.reset(),document.body.querySelectorAll("[wml-event], [wml-window], [wml-openurl], [data-wml-event], [data-wml-window], [data-wml-openurl]").forEach(Ui)}window.wails=ce;ae();var ue={};u(ue,{Capabilities:()=>Bi,Environment:()=>Hi,IsAMD64:()=>Vi,IsARM:()=>Gi,IsARM64:()=>Ki,IsDarkMode:()=>ji,IsDebug:()=>me,IsLinux:()=>Ni,IsMac:()=>Zi,IsWindows:()=>V,invoke:()=>v});var Ye=m(d.System),Ii=0,zi=1,de=function(){var n,e,i,o,t;try{if((e=(n=window.chrome)==null?void 0:n.webview)!=null&&e.postMessage)return window.chrome.webview.postMessage.bind(window.chrome.webview);if((t=(o=(i=window.webkit)==null?void 0:i.messageHandlers)==null?void 0:o.external)!=null&&t.postMessage)return window.webkit.messageHandlers.external.postMessage.bind(window.webkit.messageHandlers.external)}catch(r){}return null}();function v(n){de==null||de(n)}function ji(){return Ye(Ii)}async function Bi(){let n=await fetch("/wails/capabilities");if(n.ok)return n.json();throw new Error("could not fetch capabilities: "+n.statusText)}function Hi(){return Ye(zi)}function V(){return window._wails.environment.OS==="windows"}function Ni(){return window._wails.environment.OS==="linux"}function Zi(){return window._wails.environment.OS==="darwin"}function Vi(){return window._wails.environment.Arch==="amd64"}function Gi(){return window._wails.environment.Arch==="arm"}function Ki(){return window._wails.environment.Arch==="arm64"}function me(){return!!window._wails.environment.Debug}window.addEventListener("contextmenu",Qi);var Yi=m(d.ContextMenu),Xi=0;function Ji(n,e,i,o){Yi(Xi,{id:n,x:e,y:i,data:o})}function Qi(n){let e=H(n),i=window.getComputedStyle(e).getPropertyValue("--custom-contextmenu").trim();if(i){n.preventDefault();let o=window.getComputedStyle(e).getPropertyValue("--custom-contextmenu-data");Ji(i,n.clientX,n.clientY,o)}else qi(n,e)}function qi(n,e){if(me())return;switch(window.getComputedStyle(e).getPropertyValue("--default-contextmenu").trim()){case"show":return;case"hide":n.preventDefault();return}if(e.isContentEditable)return;let i=window.getSelection(),o=i&&i.toString().length>0;if(o)for(let t=0;tU});function U(n){try{return window._wails.flags[n]}catch(e){throw new Error("Unable to retrieve flag '"+n+"': "+e,{cause:e})}}var I=!1,z=!1,he=!1,x=!1,A=!1,y="",Xe="auto",T=0,pe=Be();window._wails=window._wails||{};window._wails.setResizable=n=>{he=n,he||(x=A=!1,w())};window.addEventListener("mousedown",We,{capture:!0});window.addEventListener("mousemove",We,{capture:!0});window.addEventListener("mouseup",We,{capture:!0});for(let n of["click","contextmenu","dblclick"])window.addEventListener(n,_i,{capture:!0});function _i(n){(z||A)&&(n.stopImmediatePropagation(),n.stopPropagation(),n.preventDefault())}var fe=0,$i=1,ge=2;function We(n){let e,i=n.buttons;switch(n.type){case"mousedown":e=fe,pe||(i=T|1<ao,Quit:()=>co,Show:()=>lo});var be=m(d.Application),to=0,ro=1,so=2;function ao(){return be(to)}function lo(){return be(ro)}function co(){return be(so)}var Te={};u(Te,{ByID:()=>ko,ByName:()=>Eo,Call:()=>Se,RuntimeError:()=>X});var Qe=Function.prototype.toString,R=typeof Reflect=="object"&&Reflect!==null&&Reflect.apply,ye,G;if(typeof R=="function"&&typeof Object.defineProperty=="function")try{ye=Object.defineProperty({},"length",{get:function(){throw G}}),G={},R(function(){throw 42},null,ye)}catch(n){n!==G&&(R=null)}else R=null;var mo=/^\s*class\b/,Pe=function(e){try{var i=Qe.call(e);return mo.test(i)}catch(o){return!1}},Ce=function(e){try{return Pe(e)?!1:(Qe.call(e),!0)}catch(i){return!1}},K=Object.prototype.toString,uo="[object Object]",wo="[object Function]",po="[object GeneratorFunction]",fo="[object HTMLAllCollection]",go="[object HTML document.all class]",ho="[object HTMLCollection]",Wo=typeof Symbol=="function"&&!!Symbol.toStringTag,bo=!(0 in[,]),De=function(){return!1};typeof document=="object"&&(Je=document.all,K.call(Je)===K.call(document.all)&&(De=function(e){if((bo||!e)&&(typeof e>"u"||typeof e=="object"))try{var i=K.call(e);return(i===fo||i===go||i===ho||i===uo)&&e("")==null}catch(o){}return!1}));var Je;function vo(n){if(De(n))return!0;if(!n||typeof n!="function"&&typeof n!="object")return!1;try{R(n,null,ye)}catch(e){if(e!==G)return!1}return!Pe(n)&&Ce(n)}function yo(n){if(De(n))return!0;if(!n||typeof n!="function"&&typeof n!="object")return!1;if(Wo)return Ce(n);if(Pe(n))return!1;var e=K.call(n);return e!==wo&&e!==po&&!/^\[object HTML/.test(e)?!1:Ce(n)}var h=R?vo:yo;var k=class extends Error{constructor(e,i){super(e,i),this.name="CancelError"}},W=class extends Error{constructor(e,i,o){super((o!=null?o:"Unhandled rejection in cancelled promise.")+" Reason: "+Co(i),{cause:i}),this.promise=e,this.name="CancelledRejectionError"}},f=Symbol("barrier"),Me=Symbol("cancelImpl"),en,qe=(en=Symbol.species)!=null?en:Symbol("speciesPolyfill"),j=class n extends Promise{constructor(e,i){let o,t;if(super((c,g)=>{o=c,t=g}),this.constructor[qe]!==Promise)throw new TypeError("CancellablePromise does not support transparent subclassing. Please refrain from overriding the [Symbol.species] static property.");let r={promise:this,resolve:o,reject:t,get oncancelled(){return i!=null?i:null},set oncancelled(c){i=c!=null?c:void 0}},a={get root(){return a},resolving:!1,settled:!1};Object.defineProperties(this,{[f]:{configurable:!1,enumerable:!1,writable:!0,value:null},[Me]:{configurable:!1,enumerable:!1,writable:!1,value:nn(r,a)}});let l=tn(r,a);try{e(on(r,a),l)}catch(c){a.resolving||l(c)}}cancel(e){return new n(i=>{Promise.all([this[Me](new k("Promise cancelled.",{cause:e})),Po(this)]).then(()=>i(),()=>i())})}cancelOn(e){return e.aborted?this.cancel(e.reason):e.addEventListener("abort",()=>void this.cancel(e.reason),{capture:!0}),this}then(e,i,o){if(!(this instanceof n))throw new TypeError("CancellablePromise.prototype.then called on an invalid object.");if(h(e)||(e=_e),h(i)||(i=$e),e===_e&&i==$e)return new n(r=>r(this));let t={};return this[f]=t,new n((r,a)=>{super.then(l=>{var c;this[f]===t&&(this[f]=null),(c=t.resolve)==null||c.call(t);try{r(e(l))}catch(g){a(g)}},l=>{var c;this[f]===t&&(this[f]=null),(c=t.resolve)==null||c.call(t);try{r(i(l))}catch(g){a(g)}})},async r=>{try{return o==null?void 0:o(r)}finally{await this.cancel(r)}})}catch(e,i){return this.then(void 0,e,i)}finally(e,i){if(!(this instanceof n))throw new TypeError("CancellablePromise.prototype.finally called on an invalid object.");return h(e)?this.then(o=>n.resolve(e()).then(()=>o),o=>n.resolve(e()).then(()=>{throw o}),i):this.then(e,e,i)}static get[(f,Me,qe)](){return Promise}static all(e){let i=Array.from(e),o=i.length===0?n.resolve(i):new n((t,r)=>{Promise.all(i).then(t,r)},t=>Y(o,i,t));return o}static allSettled(e){let i=Array.from(e),o=i.length===0?n.resolve(i):new n((t,r)=>{Promise.allSettled(i).then(t,r)},t=>Y(o,i,t));return o}static any(e){let i=Array.from(e),o=i.length===0?n.resolve(i):new n((t,r)=>{Promise.any(i).then(t,r)},t=>Y(o,i,t));return o}static race(e){let i=Array.from(e),o=new n((t,r)=>{Promise.race(i).then(t,r)},t=>Y(o,i,t));return o}static cancel(e){let i=new n(()=>{});return i.cancel(e),i}static timeout(e,i){let o=new n(()=>{});return AbortSignal&&typeof AbortSignal=="function"&&AbortSignal.timeout&&typeof AbortSignal.timeout=="function"?AbortSignal.timeout(e).addEventListener("abort",()=>void o.cancel(i)):setTimeout(()=>void o.cancel(i),e),o}static sleep(e,i){return new n(o=>{setTimeout(()=>o(i),e)})}static reject(e){return new n((i,o)=>o(e))}static resolve(e){return e instanceof n?e:new n(i=>i(e))}static withResolvers(){let e={oncancelled:null};return e.promise=new n((i,o)=>{e.resolve=i,e.reject=o},i=>{var o;(o=e.oncancelled)==null||o.call(e,i)}),e}};function nn(n,e){let i;return o=>{if(e.settled||(e.settled=!0,e.reason=o,n.reject(o),Promise.prototype.then.call(n.promise,void 0,t=>{if(t!==o)throw t})),!(!e.reason||!n.oncancelled))return i=new Promise(t=>{try{t(n.oncancelled(e.reason.cause))}catch(r){Promise.reject(new W(n.promise,r,"Unhandled exception in oncancelled callback."))}}).catch(t=>{Promise.reject(new W(n.promise,t,"Unhandled rejection in oncancelled callback."))}),n.oncancelled=null,i}}function on(n,e){return i=>{if(!e.resolving){if(e.resolving=!0,i===n.promise){if(e.settled)return;e.settled=!0,n.reject(new TypeError("A promise cannot be resolved with itself."));return}if(i!=null&&(typeof i=="object"||typeof i=="function")){let o;try{o=i.then}catch(t){e.settled=!0,n.reject(t);return}if(h(o)){try{let a=i.cancel;if(h(a)){let l=c=>{Reflect.apply(a,i,[c])};e.reason?nn(Ue(Le({},n),{oncancelled:l}),e)(e.reason):n.oncancelled=l}}catch(a){}let t={root:e.root,resolving:!1,get settled(){return this.root.settled},set settled(a){this.root.settled=a},get reason(){return this.root.reason}},r=tn(n,t);try{Reflect.apply(o,i,[on(n,t),r])}catch(a){r(a)}return}}e.settled||(e.settled=!0,n.resolve(i))}}}function tn(n,e){return i=>{if(!e.resolving)if(e.resolving=!0,e.settled){try{if(i instanceof k&&e.reason instanceof k&&Object.is(i.cause,e.reason.cause))return}catch(o){}Promise.reject(new W(n.promise,i))}else e.settled=!0,n.reject(i)}}function Y(n,e,i){let o=[];for(let t of e){let r;try{if(!h(t.then)||(r=t.cancel,!h(r)))continue}catch(l){continue}let a;try{a=Reflect.apply(r,t,[i])}catch(l){Promise.reject(new W(n,l,"Unhandled exception in cancel method."));continue}a&&o.push((a instanceof Promise?a:Promise.resolve(a)).catch(l=>{Promise.reject(new W(n,l,"Unhandled rejection in cancel method."))}))}return Promise.all(o)}function _e(n){return n}function $e(n){throw n}function Co(n){try{if(n instanceof Error||typeof n!="object"||n.toString!==Object.prototype.toString)return""+n}catch(e){}try{return JSON.stringify(n)}catch(e){}try{return Object.prototype.toString.call(n)}catch(e){}return""}function Po(n){var i;let e=(i=n[f])!=null?i:{};return"promise"in e||Object.assign(e,E()),n[f]==null&&(e.resolve(),n[f]=e),e.promise}var E=Promise.withResolvers;E&&typeof E=="function"?E=E.bind(Promise):E=function(){let n,e;return{promise:new Promise((o,t)=>{n=o,e=t}),resolve:n,reject:e}};window._wails=window._wails||{};window._wails.callResultHandler=xo;window._wails.callErrorHandler=Ao;var Do=m(d.Call),Mo=m(d.CancelCall),O=new Map,So=0,To=0,X=class extends Error{constructor(e,i){super(e,i),this.name="RuntimeError"}};function xo(n,e,i){let o=rn(n);if(o)if(!e)o.resolve(void 0);else if(!i)o.resolve(e);else try{o.resolve(JSON.parse(e))}catch(t){o.reject(new TypeError("could not parse result: "+t.message,{cause:t}))}}function Ao(n,e,i){let o=rn(n);if(o)if(!i)o.reject(new Error(e));else{let t;try{t=JSON.parse(e)}catch(l){o.reject(new TypeError("could not parse error: "+l.message,{cause:l}));return}let r={};t.cause&&(r.cause=t.cause);let a;switch(t.kind){case"ReferenceError":a=new ReferenceError(t.message,r);break;case"TypeError":a=new TypeError(t.message,r);break;case"RuntimeError":a=new X(t.message,r);break;default:a=new Error(t.message,r);break}o.reject(a)}}function rn(n){let e=O.get(n);return O.delete(n),e}function Ro(){let n;do n=P();while(O.has(n));return n}function Se(n){let e=Ro(),i=j.withResolvers();O.set(e,{resolve:i.resolve,reject:i.reject});let o=Do(So,Object.assign({"call-id":e},n)),t=!1;o.then(()=>{t=!0},a=>{O.delete(e),i.reject(a)});let r=()=>(O.delete(e),Mo(To,{"call-id":e}).catch(a=>{}));return i.oncancelled=()=>t?r():o.then(r),i.promise}function Eo(n,...e){return Se({methodName:n,args:e})}function ko(n,...e){return Se({methodID:n,args:e})}var xe={};u(xe,{SetText:()=>Lo,Text:()=>Uo});var sn=m(d.Clipboard),Oo=0,Fo=1;function Lo(n){return sn(Oo,{text:n})}function Uo(){return sn(Fo)}var Ae={};u(Ae,{Any:()=>C,Array:()=>zo,ByteSlice:()=>Io,Map:()=>jo,Nullable:()=>Bo,Struct:()=>Ho});function C(n){return n}function Io(n){return n==null?"":n}function zo(n){return n===C?e=>e===null?[]:e:e=>{if(e===null)return[];for(let i=0;ii===null?{}:i:i=>{if(i===null)return{};for(let o in i)i[o]=e(i[o]);return i}}function Bo(n){return n===C?C:e=>e===null?null:n(e)}function Ho(n){let e=!0;for(let i in n)if(n[i]!==C){e=!1;break}return e?C:i=>{for(let o in n)o in i&&(i[o]=n[o](i[o]));return i}}var Ee={};u(Ee,{GetAll:()=>Go,GetCurrent:()=>Yo,GetPrimary:()=>Ko});var Re=m(d.Screens),No=0,Zo=1,Vo=2;function Go(){return Re(No)}function Ko(){return Re(Zo)}function Yo(){return Re(Vo)}window._wails=window._wails||{};window._wails.invoke=v;v("wails:runtime:ready");export{ve as Application,_ as Browser,Te as Call,k as CancelError,j as CancellablePromise,W as CancelledRejectionError,xe as Clipboard,Ae as Create,ee as Dialogs,oe as Events,we as Flags,Ee as Screens,ue as System,le as WML,Z as Window}; +var Fe=Object.defineProperty,an=Object.defineProperties;var ln=Object.getOwnPropertyDescriptors;var ke=Object.getOwnPropertySymbols;var cn=Object.prototype.hasOwnProperty,dn=Object.prototype.propertyIsEnumerable;var Oe=(n,e,i)=>e in n?Fe(n,e,{enumerable:!0,configurable:!0,writable:!0,value:i}):n[e]=i,Le=(n,e)=>{for(var i in e||(e={}))cn.call(e,i)&&Oe(n,i,e[i]);if(ke)for(var i of ke(e))dn.call(e,i)&&Oe(n,i,e[i]);return n},Ue=(n,e)=>an(n,ln(e));var u=(n,e)=>{for(var i in e)Fe(n,i,{get:e[i],enumerable:!0})};var ce={};u(ce,{Application:()=>ve,Browser:()=>_,Call:()=>Te,CancelError:()=>k,CancellablePromise:()=>j,CancelledRejectionError:()=>b,Clipboard:()=>xe,Create:()=>Ae,Dialogs:()=>ee,Events:()=>oe,Flags:()=>we,Screens:()=>Ee,System:()=>ue,WML:()=>le,Window:()=>Z});var le={};u(le,{Enable:()=>ae,Reload:()=>Ke});var _={};u(_,{OpenURL:()=>q});var mn="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";function D(n=21){let e="",i=n|0;for(;i--;)e+=mn[Math.random()*64|0];return e}var un=window.location.origin+"/wails/runtime",d=Object.freeze({Call:0,Clipboard:1,Application:2,Events:3,ContextMenu:4,Dialog:5,Window:6,Screens:7,System:8,Browser:9,CancelCall:10}),wn=D();function m(n,e=""){return function(i,o=null){return pn(n,i,e,o)}}async function pn(n,e,i,o){var l,c;let t=new URL(un);t.searchParams.append("object",n.toString()),t.searchParams.append("method",e.toString()),o&&t.searchParams.append("args",JSON.stringify(o));let r={"x-wails-client-id":wn};i&&(r["x-wails-window-name"]=i);let a=await fetch(t,{headers:r});if(!a.ok)throw new Error(await a.text());return((c=(l=a.headers.get("Content-Type"))==null?void 0:l.indexOf("application/json"))!=null?c:-1)!==-1?a.json():a.text()}var fn=m(d.Browser),gn=0;function q(n){return fn(gn,{url:n.toString()})}var ee={};u(ee,{Error:()=>An,Info:()=>Tn,OpenFile:()=>Rn,Question:()=>$,SaveFile:()=>En,Warning:()=>xn});window._wails=window._wails||{};window._wails.dialogErrorCallback=Mn;window._wails.dialogResultCallback=Dn;var hn=m(d.Dialog),F=new Map,Wn=0,bn=1,vn=2,yn=3,Cn=4,Pn=5;function Dn(n,e,i){let o=Ie(n);if(o)if(i)try{o.resolve(JSON.parse(e))}catch(t){o.reject(new TypeError("could not parse result: "+t.message,{cause:t}))}else o.resolve(e)}function Mn(n,e){var i;(i=Ie(n))==null||i.reject(new window.Error(e))}function Ie(n){let e=F.get(n);return F.delete(n),e}function Sn(){let n;do n=D();while(F.has(n));return n}function M(n,e={}){let i=Sn();return new Promise((o,t)=>{F.set(i,{resolve:o,reject:t}),hn(n,Object.assign({"dialog-id":i},e)).catch(r=>{F.delete(i),t(r)})})}function Tn(n){return M(Wn,n)}function xn(n){return M(bn,n)}function An(n){return M(vn,n)}function $(n){return M(yn,n)}function Rn(n){var e;return(e=M(Cn,n))!=null?e:[]}function En(n){return M(Pn,n)}var oe={};u(oe,{Emit:()=>ie,Off:()=>In,OffAll:()=>zn,On:()=>Ln,OnMultiple:()=>ne,Once:()=>Un,Types:()=>je,WailsEvent:()=>h});var p=new Map,B=class{constructor(e,i,o){this.eventName=e,this.callback=i,this.maxCallbacks=o||-1}dispatch(e){try{this.callback(e)}catch(i){}return this.maxCallbacks===-1?!1:(this.maxCallbacks-=1,this.maxCallbacks===0)}};function ze(n){let e=p.get(n.eventName);e&&(e=e.filter(i=>i!==n),e.length===0?p.delete(n.eventName):p.set(n.eventName,e))}var je=Object.freeze({Windows:Object.freeze({APMPowerSettingChange:"windows:APMPowerSettingChange",APMPowerStatusChange:"windows:APMPowerStatusChange",APMResumeAutomatic:"windows:APMResumeAutomatic",APMResumeSuspend:"windows:APMResumeSuspend",APMSuspend:"windows:APMSuspend",ApplicationStarted:"windows:ApplicationStarted",SystemThemeChanged:"windows:SystemThemeChanged",WebViewNavigationCompleted:"windows:WebViewNavigationCompleted",WindowActive:"windows:WindowActive",WindowBackgroundErase:"windows:WindowBackgroundErase",WindowClickActive:"windows:WindowClickActive",WindowClosing:"windows:WindowClosing",WindowDidMove:"windows:WindowDidMove",WindowDidResize:"windows:WindowDidResize",WindowDPIChanged:"windows:WindowDPIChanged",WindowDragDrop:"windows:WindowDragDrop",WindowDragEnter:"windows:WindowDragEnter",WindowDragLeave:"windows:WindowDragLeave",WindowDragOver:"windows:WindowDragOver",WindowEndMove:"windows:WindowEndMove",WindowEndResize:"windows:WindowEndResize",WindowFullscreen:"windows:WindowFullscreen",WindowHide:"windows:WindowHide",WindowInactive:"windows:WindowInactive",WindowKeyDown:"windows:WindowKeyDown",WindowKeyUp:"windows:WindowKeyUp",WindowKillFocus:"windows:WindowKillFocus",WindowNonClientHit:"windows:WindowNonClientHit",WindowNonClientMouseDown:"windows:WindowNonClientMouseDown",WindowNonClientMouseLeave:"windows:WindowNonClientMouseLeave",WindowNonClientMouseMove:"windows:WindowNonClientMouseMove",WindowNonClientMouseUp:"windows:WindowNonClientMouseUp",WindowPaint:"windows:WindowPaint",WindowRestore:"windows:WindowRestore",WindowSetFocus:"windows:WindowSetFocus",WindowShow:"windows:WindowShow",WindowStartMove:"windows:WindowStartMove",WindowStartResize:"windows:WindowStartResize",WindowUnFullscreen:"windows:WindowUnFullscreen",WindowZOrderChanged:"windows:WindowZOrderChanged",WindowMinimise:"windows:WindowMinimise",WindowUnMinimise:"windows:WindowUnMinimise",WindowMaximise:"windows:WindowMaximise",WindowUnMaximise:"windows:WindowUnMaximise"}),Mac:Object.freeze({ApplicationDidBecomeActive:"mac:ApplicationDidBecomeActive",ApplicationDidChangeBackingProperties:"mac:ApplicationDidChangeBackingProperties",ApplicationDidChangeEffectiveAppearance:"mac:ApplicationDidChangeEffectiveAppearance",ApplicationDidChangeIcon:"mac:ApplicationDidChangeIcon",ApplicationDidChangeOcclusionState:"mac:ApplicationDidChangeOcclusionState",ApplicationDidChangeScreenParameters:"mac:ApplicationDidChangeScreenParameters",ApplicationDidChangeStatusBarFrame:"mac:ApplicationDidChangeStatusBarFrame",ApplicationDidChangeStatusBarOrientation:"mac:ApplicationDidChangeStatusBarOrientation",ApplicationDidChangeTheme:"mac:ApplicationDidChangeTheme",ApplicationDidFinishLaunching:"mac:ApplicationDidFinishLaunching",ApplicationDidHide:"mac:ApplicationDidHide",ApplicationDidResignActive:"mac:ApplicationDidResignActive",ApplicationDidUnhide:"mac:ApplicationDidUnhide",ApplicationDidUpdate:"mac:ApplicationDidUpdate",ApplicationShouldHandleReopen:"mac:ApplicationShouldHandleReopen",ApplicationWillBecomeActive:"mac:ApplicationWillBecomeActive",ApplicationWillFinishLaunching:"mac:ApplicationWillFinishLaunching",ApplicationWillHide:"mac:ApplicationWillHide",ApplicationWillResignActive:"mac:ApplicationWillResignActive",ApplicationWillTerminate:"mac:ApplicationWillTerminate",ApplicationWillUnhide:"mac:ApplicationWillUnhide",ApplicationWillUpdate:"mac:ApplicationWillUpdate",MenuDidAddItem:"mac:MenuDidAddItem",MenuDidBeginTracking:"mac:MenuDidBeginTracking",MenuDidClose:"mac:MenuDidClose",MenuDidDisplayItem:"mac:MenuDidDisplayItem",MenuDidEndTracking:"mac:MenuDidEndTracking",MenuDidHighlightItem:"mac:MenuDidHighlightItem",MenuDidOpen:"mac:MenuDidOpen",MenuDidPopUp:"mac:MenuDidPopUp",MenuDidRemoveItem:"mac:MenuDidRemoveItem",MenuDidSendAction:"mac:MenuDidSendAction",MenuDidSendActionToItem:"mac:MenuDidSendActionToItem",MenuDidUpdate:"mac:MenuDidUpdate",MenuWillAddItem:"mac:MenuWillAddItem",MenuWillBeginTracking:"mac:MenuWillBeginTracking",MenuWillDisplayItem:"mac:MenuWillDisplayItem",MenuWillEndTracking:"mac:MenuWillEndTracking",MenuWillHighlightItem:"mac:MenuWillHighlightItem",MenuWillOpen:"mac:MenuWillOpen",MenuWillPopUp:"mac:MenuWillPopUp",MenuWillRemoveItem:"mac:MenuWillRemoveItem",MenuWillSendAction:"mac:MenuWillSendAction",MenuWillSendActionToItem:"mac:MenuWillSendActionToItem",MenuWillUpdate:"mac:MenuWillUpdate",WebViewDidCommitNavigation:"mac:WebViewDidCommitNavigation",WebViewDidFinishNavigation:"mac:WebViewDidFinishNavigation",WebViewDidReceiveServerRedirectForProvisionalNavigation:"mac:WebViewDidReceiveServerRedirectForProvisionalNavigation",WebViewDidStartProvisionalNavigation:"mac:WebViewDidStartProvisionalNavigation",WindowDidBecomeKey:"mac:WindowDidBecomeKey",WindowDidBecomeMain:"mac:WindowDidBecomeMain",WindowDidBeginSheet:"mac:WindowDidBeginSheet",WindowDidChangeAlpha:"mac:WindowDidChangeAlpha",WindowDidChangeBackingLocation:"mac:WindowDidChangeBackingLocation",WindowDidChangeBackingProperties:"mac:WindowDidChangeBackingProperties",WindowDidChangeCollectionBehavior:"mac:WindowDidChangeCollectionBehavior",WindowDidChangeEffectiveAppearance:"mac:WindowDidChangeEffectiveAppearance",WindowDidChangeOcclusionState:"mac:WindowDidChangeOcclusionState",WindowDidChangeOrderingMode:"mac:WindowDidChangeOrderingMode",WindowDidChangeScreen:"mac:WindowDidChangeScreen",WindowDidChangeScreenParameters:"mac:WindowDidChangeScreenParameters",WindowDidChangeScreenProfile:"mac:WindowDidChangeScreenProfile",WindowDidChangeScreenSpace:"mac:WindowDidChangeScreenSpace",WindowDidChangeScreenSpaceProperties:"mac:WindowDidChangeScreenSpaceProperties",WindowDidChangeSharingType:"mac:WindowDidChangeSharingType",WindowDidChangeSpace:"mac:WindowDidChangeSpace",WindowDidChangeSpaceOrderingMode:"mac:WindowDidChangeSpaceOrderingMode",WindowDidChangeTitle:"mac:WindowDidChangeTitle",WindowDidChangeToolbar:"mac:WindowDidChangeToolbar",WindowDidDeminiaturize:"mac:WindowDidDeminiaturize",WindowDidEndSheet:"mac:WindowDidEndSheet",WindowDidEnterFullScreen:"mac:WindowDidEnterFullScreen",WindowDidEnterVersionBrowser:"mac:WindowDidEnterVersionBrowser",WindowDidExitFullScreen:"mac:WindowDidExitFullScreen",WindowDidExitVersionBrowser:"mac:WindowDidExitVersionBrowser",WindowDidExpose:"mac:WindowDidExpose",WindowDidFocus:"mac:WindowDidFocus",WindowDidMiniaturize:"mac:WindowDidMiniaturize",WindowDidMove:"mac:WindowDidMove",WindowDidOrderOffScreen:"mac:WindowDidOrderOffScreen",WindowDidOrderOnScreen:"mac:WindowDidOrderOnScreen",WindowDidResignKey:"mac:WindowDidResignKey",WindowDidResignMain:"mac:WindowDidResignMain",WindowDidResize:"mac:WindowDidResize",WindowDidUpdate:"mac:WindowDidUpdate",WindowDidUpdateAlpha:"mac:WindowDidUpdateAlpha",WindowDidUpdateCollectionBehavior:"mac:WindowDidUpdateCollectionBehavior",WindowDidUpdateCollectionProperties:"mac:WindowDidUpdateCollectionProperties",WindowDidUpdateShadow:"mac:WindowDidUpdateShadow",WindowDidUpdateTitle:"mac:WindowDidUpdateTitle",WindowDidUpdateToolbar:"mac:WindowDidUpdateToolbar",WindowDidZoom:"mac:WindowDidZoom",WindowFileDraggingEntered:"mac:WindowFileDraggingEntered",WindowFileDraggingExited:"mac:WindowFileDraggingExited",WindowFileDraggingPerformed:"mac:WindowFileDraggingPerformed",WindowHide:"mac:WindowHide",WindowMaximise:"mac:WindowMaximise",WindowUnMaximise:"mac:WindowUnMaximise",WindowMinimise:"mac:WindowMinimise",WindowUnMinimise:"mac:WindowUnMinimise",WindowShouldClose:"mac:WindowShouldClose",WindowShow:"mac:WindowShow",WindowWillBecomeKey:"mac:WindowWillBecomeKey",WindowWillBecomeMain:"mac:WindowWillBecomeMain",WindowWillBeginSheet:"mac:WindowWillBeginSheet",WindowWillChangeOrderingMode:"mac:WindowWillChangeOrderingMode",WindowWillClose:"mac:WindowWillClose",WindowWillDeminiaturize:"mac:WindowWillDeminiaturize",WindowWillEnterFullScreen:"mac:WindowWillEnterFullScreen",WindowWillEnterVersionBrowser:"mac:WindowWillEnterVersionBrowser",WindowWillExitFullScreen:"mac:WindowWillExitFullScreen",WindowWillExitVersionBrowser:"mac:WindowWillExitVersionBrowser",WindowWillFocus:"mac:WindowWillFocus",WindowWillMiniaturize:"mac:WindowWillMiniaturize",WindowWillMove:"mac:WindowWillMove",WindowWillOrderOffScreen:"mac:WindowWillOrderOffScreen",WindowWillOrderOnScreen:"mac:WindowWillOrderOnScreen",WindowWillResignMain:"mac:WindowWillResignMain",WindowWillResize:"mac:WindowWillResize",WindowWillUnfocus:"mac:WindowWillUnfocus",WindowWillUpdate:"mac:WindowWillUpdate",WindowWillUpdateAlpha:"mac:WindowWillUpdateAlpha",WindowWillUpdateCollectionBehavior:"mac:WindowWillUpdateCollectionBehavior",WindowWillUpdateCollectionProperties:"mac:WindowWillUpdateCollectionProperties",WindowWillUpdateShadow:"mac:WindowWillUpdateShadow",WindowWillUpdateTitle:"mac:WindowWillUpdateTitle",WindowWillUpdateToolbar:"mac:WindowWillUpdateToolbar",WindowWillUpdateVisibility:"mac:WindowWillUpdateVisibility",WindowWillUseStandardFrame:"mac:WindowWillUseStandardFrame",WindowZoomIn:"mac:WindowZoomIn",WindowZoomOut:"mac:WindowZoomOut",WindowZoomReset:"mac:WindowZoomReset"}),Linux:Object.freeze({ApplicationStartup:"linux:ApplicationStartup",SystemThemeChanged:"linux:SystemThemeChanged",WindowDeleteEvent:"linux:WindowDeleteEvent",WindowDidMove:"linux:WindowDidMove",WindowDidResize:"linux:WindowDidResize",WindowFocusIn:"linux:WindowFocusIn",WindowFocusOut:"linux:WindowFocusOut",WindowLoadChanged:"linux:WindowLoadChanged"}),Common:Object.freeze({ApplicationOpenedWithFile:"common:ApplicationOpenedWithFile",ApplicationStarted:"common:ApplicationStarted",ThemeChanged:"common:ThemeChanged",WindowClosing:"common:WindowClosing",WindowDidMove:"common:WindowDidMove",WindowDidResize:"common:WindowDidResize",WindowDPIChanged:"common:WindowDPIChanged",WindowFilesDropped:"common:WindowFilesDropped",WindowFocus:"common:WindowFocus",WindowFullscreen:"common:WindowFullscreen",WindowHide:"common:WindowHide",WindowLostFocus:"common:WindowLostFocus",WindowMaximise:"common:WindowMaximise",WindowMinimise:"common:WindowMinimise",WindowRestore:"common:WindowRestore",WindowRuntimeReady:"common:WindowRuntimeReady",WindowShow:"common:WindowShow",WindowUnFullscreen:"common:WindowUnFullscreen",WindowUnMaximise:"common:WindowUnMaximise",WindowUnMinimise:"common:WindowUnMinimise",WindowZoom:"common:WindowZoom",WindowZoomIn:"common:WindowZoomIn",WindowZoomOut:"common:WindowZoomOut",WindowZoomReset:"common:WindowZoomReset"})});window._wails=window._wails||{};window._wails.dispatchWailsEvent=Fn;var kn=m(d.Events),On=0,h=class{constructor(e,i=null){this.name=e,this.data=i}};function Fn(n){let e=p.get(n.name);if(!e)return;let i=new h(n.name,n.data);"sender"in n&&(i.sender=n.sender),e=e.filter(o=>!o.dispatch(i)),e.length===0?p.delete(n.name):p.set(n.name,e)}function ne(n,e,i){let o=p.get(n)||[],t=new B(n,e,i);return o.push(t),p.set(n,o),()=>ze(t)}function Ln(n,e){return ne(n,e,-1)}function Un(n,e){return ne(n,e,1)}function In(...n){n.forEach(e=>p.delete(e))}function zn(){p.clear()}function ie(n,e){let i;return typeof n=="object"&&n!==null&&"name"in n&&"data"in n?i=new h(n.name,n.data):i=new h(n,e),kn(On,i)}function Be(){return new MouseEvent("mousedown").buttons===0}function He(){if(!EventTarget||!AbortSignal||!AbortController)return!1;let n=!0,e=new EventTarget,i=new AbortController;return e.addEventListener("test",()=>{n=!1},{signal:i.signal}),i.abort(),e.dispatchEvent(new CustomEvent("test")),n}function H(n){var e;return n.target instanceof HTMLElement?n.target:!(n.target instanceof HTMLElement)&&n.target instanceof Node&&(e=n.target.parentElement)!=null?e:document.body}var Ne=!1;document.addEventListener("DOMContentLoaded",()=>{Ne=!0});function Ze(n){Ne||document.readyState==="complete"?n():document.addEventListener("DOMContentLoaded",n)}var jn=0,Bn=1,Hn=2,Nn=3,Zn=4,Vn=5,Gn=6,Kn=7,Yn=8,Xn=9,Jn=10,Qn=11,qn=12,_n=13,$n=14,ei=15,ni=16,ii=17,oi=18,ti=19,ri=20,si=21,ai=22,li=23,ci=24,di=25,mi=26,ui=27,wi=28,pi=29,fi=30,gi=31,hi=32,Wi=33,bi=34,vi=35,yi=36,Ci=37,Pi=38,Di=39,Mi=40,Si=41,Ti=42,xi=43,Ai=44,Ri=45,Ei=46,ki=47,s=Symbol("caller");s;var N=class N{constructor(e=""){this[s]=m(d.Window,e);for(let i of Object.getOwnPropertyNames(N.prototype))i!=="constructor"&&typeof this[i]=="function"&&(this[i]=this[i].bind(this))}Get(e){return new N(e)}Position(){return this[s](jn)}Center(){return this[s](Bn)}Close(){return this[s](Hn)}DisableSizeConstraints(){return this[s](Nn)}EnableSizeConstraints(){return this[s](Zn)}Focus(){return this[s](Vn)}ForceReload(){return this[s](Gn)}Fullscreen(){return this[s](Kn)}GetScreen(){return this[s](Yn)}GetZoom(){return this[s](Xn)}Height(){return this[s](Jn)}Hide(){return this[s](Qn)}IsFocused(){return this[s](qn)}IsFullscreen(){return this[s](_n)}IsMaximised(){return this[s]($n)}IsMinimised(){return this[s](ei)}Maximise(){return this[s](ni)}Minimise(){return this[s](ii)}Name(){return this[s](oi)}OpenDevTools(){return this[s](ti)}RelativePosition(){return this[s](ri)}Reload(){return this[s](si)}Resizable(){return this[s](ai)}Restore(){return this[s](li)}SetPosition(e,i){return this[s](ci,{x:e,y:i})}SetAlwaysOnTop(e){return this[s](di,{alwaysOnTop:e})}SetBackgroundColour(e,i,o,t){return this[s](mi,{r:e,g:i,b:o,a:t})}SetFrameless(e){return this[s](ui,{frameless:e})}SetFullscreenButtonEnabled(e){return this[s](wi,{enabled:e})}SetMaxSize(e,i){return this[s](pi,{width:e,height:i})}SetMinSize(e,i){return this[s](fi,{width:e,height:i})}SetRelativePosition(e,i){return this[s](gi,{x:e,y:i})}SetResizable(e){return this[s](hi,{resizable:e})}SetSize(e,i){return this[s](Wi,{width:e,height:i})}SetTitle(e){return this[s](bi,{title:e})}SetZoom(e){return this[s](vi,{zoom:e})}Show(){return this[s](yi)}Size(){return this[s](Ci)}ToggleFullscreen(){return this[s](Pi)}ToggleMaximise(){return this[s](Di)}UnFullscreen(){return this[s](Mi)}UnMaximise(){return this[s](Si)}UnMinimise(){return this[s](Ti)}Width(){return this[s](xi)}Zoom(){return this[s](Ai)}ZoomIn(){return this[s](Ri)}ZoomOut(){return this[s](Ei)}ZoomReset(){return this[s](ki)}},te=N,Oi=new te(""),Z=Oi;function Fi(n,e=null){ie(new h(n,e))}function Li(n,e){let i=Z.Get(n),o=i[e];if(typeof o=="function")try{o.call(i)}catch(t){}}function Ve(n){let e=n.currentTarget;function i(t="Yes"){if(t!=="Yes")return;let r=e.getAttribute("wml-event")||e.getAttribute("data-wml-event"),a=e.getAttribute("wml-target-window")||e.getAttribute("data-wml-target-window")||"",l=e.getAttribute("wml-window")||e.getAttribute("data-wml-window"),c=e.getAttribute("wml-openurl")||e.getAttribute("data-wml-openurl");r!==null&&Fi(r),l!==null&&Li(a,l),c!==null&&q(c)}let o=e.getAttribute("wml-confirm")||e.getAttribute("data-wml-confirm");o?$({Title:"Confirm",Message:o,Detached:!1,Buttons:[{Label:"Yes"},{Label:"No",IsDefault:!0}]}).then(i):i()}var L=Symbol("controller"),S=Symbol("triggerMap"),v=Symbol("elementCount");L;var re=class{constructor(){this[L]=new AbortController}set(e,i){return{signal:this[L].signal}}reset(){this[L].abort(),this[L]=new AbortController}};S,v;var se=class{constructor(){this[S]=new WeakMap,this[v]=0}set(e,i){return this[S].has(e)||this[v]++,this[S].set(e,i),{}}reset(){if(!(this[v]<=0)){for(let e of document.body.querySelectorAll("*")){if(this[v]<=0)break;let i=this[S].get(e);i!=null&&this[v]--;for(let o of i||[])e.removeEventListener(o,Ve)}this[S]=new WeakMap,this[v]=0}}},Ge=He()?new re:new se;function Ui(n){let e=/\S+/g,i=n.getAttribute("wml-trigger")||n.getAttribute("data-wml-trigger")||"click",o=[],t;for(;(t=e.exec(i))!==null;)o.push(t[0]);let r=Ge.set(n,o);for(let a of o)n.addEventListener(a,Ve,r)}function ae(){Ze(Ke)}function Ke(){Ge.reset(),document.body.querySelectorAll("[wml-event], [wml-window], [wml-openurl], [data-wml-event], [data-wml-window], [data-wml-openurl]").forEach(Ui)}window.wails=ce;ae();var ue={};u(ue,{Capabilities:()=>Bi,Environment:()=>Hi,IsAMD64:()=>Vi,IsARM:()=>Gi,IsARM64:()=>Ki,IsDarkMode:()=>ji,IsDebug:()=>me,IsLinux:()=>Ni,IsMac:()=>Zi,IsWindows:()=>V,invoke:()=>y});var Ye=m(d.System),Ii=0,zi=1,de=function(){var n,e,i,o,t;try{if((e=(n=window.chrome)==null?void 0:n.webview)!=null&&e.postMessage)return window.chrome.webview.postMessage.bind(window.chrome.webview);if((t=(o=(i=window.webkit)==null?void 0:i.messageHandlers)==null?void 0:o.external)!=null&&t.postMessage)return window.webkit.messageHandlers.external.postMessage.bind(window.webkit.messageHandlers.external)}catch(r){}return null}();function y(n){de==null||de(n)}function ji(){return Ye(Ii)}async function Bi(){let n=await fetch("/wails/capabilities");if(n.ok)return n.json();throw new Error("could not fetch capabilities: "+n.statusText)}function Hi(){return Ye(zi)}function V(){return window._wails.environment.OS==="windows"}function Ni(){return window._wails.environment.OS==="linux"}function Zi(){return window._wails.environment.OS==="darwin"}function Vi(){return window._wails.environment.Arch==="amd64"}function Gi(){return window._wails.environment.Arch==="arm"}function Ki(){return window._wails.environment.Arch==="arm64"}function me(){return!!window._wails.environment.Debug}window.addEventListener("contextmenu",Qi);var Yi=m(d.ContextMenu),Xi=0;function Ji(n,e,i,o){Yi(Xi,{id:n,x:e,y:i,data:o})}function Qi(n){let e=H(n),i=window.getComputedStyle(e).getPropertyValue("--custom-contextmenu").trim();if(i){n.preventDefault();let o=window.getComputedStyle(e).getPropertyValue("--custom-contextmenu-data");Ji(i,n.clientX,n.clientY,o)}else qi(n,e)}function qi(n,e){if(me())return;switch(window.getComputedStyle(e).getPropertyValue("--default-contextmenu").trim()){case"show":return;case"hide":n.preventDefault();return}if(e.isContentEditable)return;let i=window.getSelection(),o=i&&i.toString().length>0;if(o)for(let t=0;tU});function U(n){try{return window._wails.flags[n]}catch(e){throw new Error("Unable to retrieve flag '"+n+"': "+e,{cause:e})}}var I=!1,z=!1,he=!1,x=!1,A=!1,C="",Xe="auto",T=0,pe=Be();window._wails=window._wails||{};window._wails.setResizable=n=>{he=n,he||(x=A=!1,w())};window.addEventListener("mousedown",We,{capture:!0});window.addEventListener("mousemove",We,{capture:!0});window.addEventListener("mouseup",We,{capture:!0});for(let n of["click","contextmenu","dblclick"])window.addEventListener(n,_i,{capture:!0});function _i(n){(z||A)&&(n.stopImmediatePropagation(),n.stopPropagation(),n.preventDefault())}var fe=0,$i=1,ge=2;function We(n){let e,i=n.buttons;switch(n.type){case"mousedown":e=fe,pe||(i=T|1<ao,Quit:()=>co,Show:()=>lo});var be=m(d.Application),to=0,ro=1,so=2;function ao(){return be(to)}function lo(){return be(ro)}function co(){return be(so)}var Te={};u(Te,{ByID:()=>ko,ByName:()=>Eo,Call:()=>Se,RuntimeError:()=>X});var Qe=Function.prototype.toString,R=typeof Reflect=="object"&&Reflect!==null&&Reflect.apply,ye,G;if(typeof R=="function"&&typeof Object.defineProperty=="function")try{ye=Object.defineProperty({},"length",{get:function(){throw G}}),G={},R(function(){throw 42},null,ye)}catch(n){n!==G&&(R=null)}else R=null;var mo=/^\s*class\b/,Pe=function(e){try{var i=Qe.call(e);return mo.test(i)}catch(o){return!1}},Ce=function(e){try{return Pe(e)?!1:(Qe.call(e),!0)}catch(i){return!1}},K=Object.prototype.toString,uo="[object Object]",wo="[object Function]",po="[object GeneratorFunction]",fo="[object HTMLAllCollection]",go="[object HTML document.all class]",ho="[object HTMLCollection]",Wo=typeof Symbol=="function"&&!!Symbol.toStringTag,bo=!(0 in[,]),De=function(){return!1};typeof document=="object"&&(Je=document.all,K.call(Je)===K.call(document.all)&&(De=function(e){if((bo||!e)&&(typeof e>"u"||typeof e=="object"))try{var i=K.call(e);return(i===fo||i===go||i===ho||i===uo)&&e("")==null}catch(o){}return!1}));var Je;function vo(n){if(De(n))return!0;if(!n||typeof n!="function"&&typeof n!="object")return!1;try{R(n,null,ye)}catch(e){if(e!==G)return!1}return!Pe(n)&&Ce(n)}function yo(n){if(De(n))return!0;if(!n||typeof n!="function"&&typeof n!="object")return!1;if(Wo)return Ce(n);if(Pe(n))return!1;var e=K.call(n);return e!==wo&&e!==po&&!/^\[object HTML/.test(e)?!1:Ce(n)}var W=R?vo:yo;var k=class extends Error{constructor(e,i){super(e,i),this.name="CancelError"}},b=class extends Error{constructor(e,i,o){super((o!=null?o:"Unhandled rejection in cancelled promise.")+" Reason: "+Co(i),{cause:i}),this.promise=e,this.name="CancelledRejectionError"}},f=Symbol("barrier"),Me=Symbol("cancelImpl"),en,qe=(en=Symbol.species)!=null?en:Symbol("speciesPolyfill"),j=class n extends Promise{constructor(e,i){let o,t;if(super((c,g)=>{o=c,t=g}),this.constructor[qe]!==Promise)throw new TypeError("CancellablePromise does not support transparent subclassing. Please refrain from overriding the [Symbol.species] static property.");let r={promise:this,resolve:o,reject:t,get oncancelled(){return i!=null?i:null},set oncancelled(c){i=c!=null?c:void 0}},a={get root(){return a},resolving:!1,settled:!1};Object.defineProperties(this,{[f]:{configurable:!1,enumerable:!1,writable:!0,value:null},[Me]:{configurable:!1,enumerable:!1,writable:!1,value:nn(r,a)}});let l=tn(r,a);try{e(on(r,a),l)}catch(c){a.resolving||l(c)}}cancel(e){return new n(i=>{Promise.all([this[Me](new k("Promise cancelled.",{cause:e})),Po(this)]).then(()=>i(),()=>i())})}cancelOn(e){return e.aborted?this.cancel(e.reason):e.addEventListener("abort",()=>void this.cancel(e.reason),{capture:!0}),this}then(e,i,o){if(!(this instanceof n))throw new TypeError("CancellablePromise.prototype.then called on an invalid object.");if(W(e)||(e=_e),W(i)||(i=$e),e===_e&&i==$e)return new n(r=>r(this));let t={};return this[f]=t,new n((r,a)=>{super.then(l=>{var c;this[f]===t&&(this[f]=null),(c=t.resolve)==null||c.call(t);try{r(e(l))}catch(g){a(g)}},l=>{var c;this[f]===t&&(this[f]=null),(c=t.resolve)==null||c.call(t);try{r(i(l))}catch(g){a(g)}})},async r=>{try{return o==null?void 0:o(r)}finally{await this.cancel(r)}})}catch(e,i){return this.then(void 0,e,i)}finally(e,i){if(!(this instanceof n))throw new TypeError("CancellablePromise.prototype.finally called on an invalid object.");return W(e)?this.then(o=>n.resolve(e()).then(()=>o),o=>n.resolve(e()).then(()=>{throw o}),i):this.then(e,e,i)}static get[(f,Me,qe)](){return Promise}static all(e){let i=Array.from(e),o=i.length===0?n.resolve(i):new n((t,r)=>{Promise.all(i).then(t,r)},t=>Y(o,i,t));return o}static allSettled(e){let i=Array.from(e),o=i.length===0?n.resolve(i):new n((t,r)=>{Promise.allSettled(i).then(t,r)},t=>Y(o,i,t));return o}static any(e){let i=Array.from(e),o=i.length===0?n.resolve(i):new n((t,r)=>{Promise.any(i).then(t,r)},t=>Y(o,i,t));return o}static race(e){let i=Array.from(e),o=new n((t,r)=>{Promise.race(i).then(t,r)},t=>Y(o,i,t));return o}static cancel(e){let i=new n(()=>{});return i.cancel(e),i}static timeout(e,i){let o=new n(()=>{});return AbortSignal&&typeof AbortSignal=="function"&&AbortSignal.timeout&&typeof AbortSignal.timeout=="function"?AbortSignal.timeout(e).addEventListener("abort",()=>void o.cancel(i)):setTimeout(()=>void o.cancel(i),e),o}static sleep(e,i){return new n(o=>{setTimeout(()=>o(i),e)})}static reject(e){return new n((i,o)=>o(e))}static resolve(e){return e instanceof n?e:new n(i=>i(e))}static withResolvers(){let e={oncancelled:null};return e.promise=new n((i,o)=>{e.resolve=i,e.reject=o},i=>{var o;(o=e.oncancelled)==null||o.call(e,i)}),e}};function nn(n,e){let i;return o=>{if(e.settled||(e.settled=!0,e.reason=o,n.reject(o),Promise.prototype.then.call(n.promise,void 0,t=>{if(t!==o)throw t})),!(!e.reason||!n.oncancelled))return i=new Promise(t=>{try{t(n.oncancelled(e.reason.cause))}catch(r){Promise.reject(new b(n.promise,r,"Unhandled exception in oncancelled callback."))}}).catch(t=>{Promise.reject(new b(n.promise,t,"Unhandled rejection in oncancelled callback."))}),n.oncancelled=null,i}}function on(n,e){return i=>{if(!e.resolving){if(e.resolving=!0,i===n.promise){if(e.settled)return;e.settled=!0,n.reject(new TypeError("A promise cannot be resolved with itself."));return}if(i!=null&&(typeof i=="object"||typeof i=="function")){let o;try{o=i.then}catch(t){e.settled=!0,n.reject(t);return}if(W(o)){try{let a=i.cancel;if(W(a)){let l=c=>{Reflect.apply(a,i,[c])};e.reason?nn(Ue(Le({},n),{oncancelled:l}),e)(e.reason):n.oncancelled=l}}catch(a){}let t={root:e.root,resolving:!1,get settled(){return this.root.settled},set settled(a){this.root.settled=a},get reason(){return this.root.reason}},r=tn(n,t);try{Reflect.apply(o,i,[on(n,t),r])}catch(a){r(a)}return}}e.settled||(e.settled=!0,n.resolve(i))}}}function tn(n,e){return i=>{if(!e.resolving)if(e.resolving=!0,e.settled){try{if(i instanceof k&&e.reason instanceof k&&Object.is(i.cause,e.reason.cause))return}catch(o){}Promise.reject(new b(n.promise,i))}else e.settled=!0,n.reject(i)}}function Y(n,e,i){let o=[];for(let t of e){let r;try{if(!W(t.then)||(r=t.cancel,!W(r)))continue}catch(l){continue}let a;try{a=Reflect.apply(r,t,[i])}catch(l){Promise.reject(new b(n,l,"Unhandled exception in cancel method."));continue}a&&o.push((a instanceof Promise?a:Promise.resolve(a)).catch(l=>{Promise.reject(new b(n,l,"Unhandled rejection in cancel method."))}))}return Promise.all(o)}function _e(n){return n}function $e(n){throw n}function Co(n){try{if(n instanceof Error||typeof n!="object"||n.toString!==Object.prototype.toString)return""+n}catch(e){}try{return JSON.stringify(n)}catch(e){}try{return Object.prototype.toString.call(n)}catch(e){}return""}function Po(n){var i;let e=(i=n[f])!=null?i:{};return"promise"in e||Object.assign(e,E()),n[f]==null&&(e.resolve(),n[f]=e),e.promise}var E=Promise.withResolvers;E&&typeof E=="function"?E=E.bind(Promise):E=function(){let n,e;return{promise:new Promise((o,t)=>{n=o,e=t}),resolve:n,reject:e}};window._wails=window._wails||{};window._wails.callResultHandler=xo;window._wails.callErrorHandler=Ao;var Do=m(d.Call),Mo=m(d.CancelCall),O=new Map,So=0,To=0,X=class extends Error{constructor(e,i){super(e,i),this.name="RuntimeError"}};function xo(n,e,i){let o=rn(n);if(o)if(!e)o.resolve(void 0);else if(!i)o.resolve(e);else try{o.resolve(JSON.parse(e))}catch(t){o.reject(new TypeError("could not parse result: "+t.message,{cause:t}))}}function Ao(n,e,i){let o=rn(n);if(o)if(!i)o.reject(new Error(e));else{let t;try{t=JSON.parse(e)}catch(l){o.reject(new TypeError("could not parse error: "+l.message,{cause:l}));return}let r={};t.cause&&(r.cause=t.cause);let a;switch(t.kind){case"ReferenceError":a=new ReferenceError(t.message,r);break;case"TypeError":a=new TypeError(t.message,r);break;case"RuntimeError":a=new X(t.message,r);break;default:a=new Error(t.message,r);break}o.reject(a)}}function rn(n){let e=O.get(n);return O.delete(n),e}function Ro(){let n;do n=D();while(O.has(n));return n}function Se(n){let e=Ro(),i=j.withResolvers();O.set(e,{resolve:i.resolve,reject:i.reject});let o=Do(So,Object.assign({"call-id":e},n)),t=!1;o.then(()=>{t=!0},a=>{O.delete(e),i.reject(a)});let r=()=>(O.delete(e),Mo(To,{"call-id":e}).catch(a=>{}));return i.oncancelled=()=>t?r():o.then(r),i.promise}function Eo(n,...e){return Se({methodName:n,args:e})}function ko(n,...e){return Se({methodID:n,args:e})}var xe={};u(xe,{SetText:()=>Lo,Text:()=>Uo});var sn=m(d.Clipboard),Oo=0,Fo=1;function Lo(n){return sn(Oo,{text:n})}function Uo(){return sn(Fo)}var Ae={};u(Ae,{Any:()=>P,Array:()=>zo,ByteSlice:()=>Io,Map:()=>jo,Nullable:()=>Bo,Struct:()=>Ho});function P(n){return n}function Io(n){return n==null?"":n}function zo(n){return n===P?e=>e===null?[]:e:e=>{if(e===null)return[];for(let i=0;ii===null?{}:i:i=>{if(i===null)return{};for(let o in i)i[o]=e(i[o]);return i}}function Bo(n){return n===P?P:e=>e===null?null:n(e)}function Ho(n){let e=!0;for(let i in n)if(n[i]!==P){e=!1;break}return e?P:i=>{for(let o in n)o in i&&(i[o]=n[o](i[o]));return i}}var Ee={};u(Ee,{GetAll:()=>Go,GetCurrent:()=>Yo,GetPrimary:()=>Ko});var Re=m(d.Screens),No=0,Zo=1,Vo=2;function Go(){return Re(No)}function Ko(){return Re(Zo)}function Yo(){return Re(Vo)}window._wails=window._wails||{};window._wails.invoke=y;y("wails:runtime:ready");export{ve as Application,_ as Browser,Te as Call,k as CancelError,j as CancellablePromise,b as CancelledRejectionError,xe as Clipboard,Ae as Create,ee as Dialogs,oe as Events,we as Flags,Ee as Screens,ue as System,le as WML,Z as Window}; diff --git a/v3/internal/runtime/desktop/@wailsio/runtime/src/events.ts b/v3/internal/runtime/desktop/@wailsio/runtime/src/events.ts index d8c67b65f..9259bc6c5 100644 --- a/v3/internal/runtime/desktop/@wailsio/runtime/src/events.ts +++ b/v3/internal/runtime/desktop/@wailsio/runtime/src/events.ts @@ -125,11 +125,23 @@ export function OffAll(): void { } /** - * Emits the given event. + * Emits an event using the name and data. * - * @param event - The name of the event to emit. * @returns A promise that will be fulfilled once the event has been emitted. + * @param name - the name of the event to emit. + * @param data - the data to be sent with the event. */ -export function Emit(event: WailsEvent): Promise { +export function Emit(name: string, data?: any): Promise { + let event: WailsEvent; + + if (typeof name === 'object' && name !== null && 'name' in name && 'data' in name) { + // If name is an object with a name property, use it directly + event = new WailsEvent(name['name'], name['data']); + } else { + // Otherwise use the standard parameters + event = new WailsEvent(name as string, data); + } + return call(EmitMethod, event); } + From d8671de43b2f26c5be3958dbf617fd2cc37c5986 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Tue, 11 Mar 2025 21:12:16 +1100 Subject: [PATCH 153/374] Update README --- docs/src/content/docs/changelog.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/src/content/docs/changelog.mdx b/docs/src/content/docs/changelog.mdx index b18c0bcd6..8c88d41d2 100644 --- a/docs/src/content/docs/changelog.mdx +++ b/docs/src/content/docs/changelog.mdx @@ -75,6 +75,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Add method `Close` on `sqlite` service to close the DB manually by [@fbbdev](https://github.com/fbbdev) in [#4067](https://github.com/wailsapp/wails/pull/4067) - Add cancellation support for query methods on `sqlite` service by [@fbbdev](https://github.com/fbbdev) in [#4067](https://github.com/wailsapp/wails/pull/4067) - Add prepared statement support to `sqlite` service with JS bindings by [@fbbdev](https://github.com/fbbdev) in [#4067](https://github.com/wailsapp/wails/pull/4067) +- Gin support by [Lea Anthony](https://github.com/leaanthony) in [PR](https://github.com/wailsapp/wails/pull/3537) based on the original work of [@AnalogJ](https://github.com/AnalogJ) in PR[https://github.com/wailsapp/wails/pull/3537] ### Fixed From 635ddf5c363e01fc6863aa4fd6222d14fa30b9f1 Mon Sep 17 00:00:00 2001 From: Oussama Sethoum <88779394+oSethoum@users.noreply.github.com> Date: Tue, 11 Mar 2025 13:00:22 +0100 Subject: [PATCH 154/374] fix: fullscreen, unfullscreen, unminise and unmaximise window events weren't being emitted. --- v3/pkg/application/webview_window_windows.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/v3/pkg/application/webview_window_windows.go b/v3/pkg/application/webview_window_windows.go index 89bea1cbd..92684ae73 100644 --- a/v3/pkg/application/webview_window_windows.go +++ b/v3/pkg/application/webview_window_windows.go @@ -679,6 +679,7 @@ func (w *windowsWebviewWindow) maximise() { func (w *windowsWebviewWindow) unmaximise() { w.restore() + w.parent.emit(events.Windows.WindowUnMaximise) } func (w *windowsWebviewWindow) restore() { @@ -719,6 +720,7 @@ func (w *windowsWebviewWindow) fullscreen() { int(monitorInfo.RcMonitor.Bottom-monitorInfo.RcMonitor.Top), w32.SWP_NOOWNERZORDER|w32.SWP_FRAMECHANGED) w.chromium.Focus() + w.parent.emit(events.Windows.WindowFullscreen) } func (w *windowsWebviewWindow) unfullscreen() { @@ -738,6 +740,7 @@ func (w *windowsWebviewWindow) unfullscreen() { w32.SetWindowPos(w.hwnd, 0, 0, 0, 0, 0, w32.SWP_NOMOVE|w32.SWP_NOSIZE|w32.SWP_NOZORDER|w32.SWP_NOOWNERZORDER|w32.SWP_FRAMECHANGED) w.enableSizeConstraints() + w.parent.emit(events.Windows.WindowUnFullscreen) } func (w *windowsWebviewWindow) isMinimised() bool { @@ -1202,6 +1205,9 @@ func (w *windowsWebviewWindow) WndProc(msg uint32, wparam, lparam uintptr) uintp case w32.SIZE_MAXIMIZED: w.parent.emit(events.Windows.WindowMaximise) case w32.SIZE_RESTORED: + if w.isMinimizing { + w.parent.emit(events.Windows.WindowUnMinimise) + } w.isMinimizing = false w.parent.emit(events.Windows.WindowRestore) case w32.SIZE_MINIMIZED: From fe6635c1ebc1638ba958095a37a46f53001d8a40 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Wed, 12 Mar 2025 08:32:26 +1100 Subject: [PATCH 155/374] Update Results stage in pipeline --- .github/workflows/build-and-test-v3.yml | 33 +++++++++++++++---------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/.github/workflows/build-and-test-v3.yml b/.github/workflows/build-and-test-v3.yml index b0852259a..dd96e716a 100644 --- a/.github/workflows/build-and-test-v3.yml +++ b/.github/workflows/build-and-test-v3.yml @@ -223,16 +223,23 @@ jobs: cd ${{ matrix.template }} wails3 build - results: - if: ${{ always() }} - runs-on: ubuntu-latest - name: v3 Build Results - needs: [test_go, test_js, test_templates] - steps: - - run: | - result="${{ needs.build.result }}" - if [[ $result == "success" || $result == "skipped" ]]; then - exit 0 - else - exit 1 - fi \ No newline at end of file +results: + if: ${{ always() }} + runs-on: ubuntu-latest + name: v3 Build Results + needs: [test_go, test_js, test_templates] + steps: + - run: | + go_result="${{ needs.test_go.result }}" + js_result="${{ needs.test_js.result }}" + templates_result="${{ needs.test_templates.result }}" + + if [[ $go_result == "success" || $go_result == "skipped" ]] && \ + [[ $js_result == "success" || $js_result == "skipped" ]] && \ + [[ $templates_result == "success" || $templates_result == "skipped" ]]; then + echo "All required jobs succeeded or were skipped" + exit 0 + else + echo "One or more required jobs failed" + exit 1 + fi \ No newline at end of file From 302c74e90d96bf3c795e0e64a83744511d865d20 Mon Sep 17 00:00:00 2001 From: Oussama Sethoum <88779394+oSethoum@users.noreply.github.com> Date: Wed, 12 Mar 2025 00:34:50 +0100 Subject: [PATCH 156/374] add: entry in the changelog.mdx for reference. --- docs/src/content/docs/changelog.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/src/content/docs/changelog.mdx b/docs/src/content/docs/changelog.mdx index a64d2e718..326c9c864 100644 --- a/docs/src/content/docs/changelog.mdx +++ b/docs/src/content/docs/changelog.mdx @@ -109,6 +109,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fixed [#4097](https://github.com/wailsapp/wails/issues/4097) Webpack/angular discards runtime init code by [@fbbdev](https://github.com/fbbdev) in [#4100](https://github.com/wailsapp/wails/pull/4100) - Fixed assetFileServer not serving `.html` files when non-extension request when `[request]` doesn't exist but `[request].html` does - Fixed icon generation paths by [@robin-samuel](https://github.com/robin-samuel) in [#4125](https://github.com/wailsapp/wails/pull/4125) +- Fixed `fullscreen`, `unfullscreen`, `unminimise` and `unmaximise` events not being emitted by [@oSethoum](https://github.com/osethoum) in [#4130](https://github.com/wailsapp/wails/pull/4130) ### Changed From 479e22b7c5a20b55ca5f114ff5261c254c13bd41 Mon Sep 17 00:00:00 2001 From: Ian VanSchooten Date: Wed, 12 Mar 2025 11:30:45 -0400 Subject: [PATCH 157/374] Clean up template package.json files --- v3/internal/templates/lit-ts/frontend/package.json | 6 +++--- v3/internal/templates/lit/frontend/package.json | 6 +++--- v3/internal/templates/preact-ts/frontend/package.json | 6 +++--- v3/internal/templates/preact/frontend/package.json | 6 +++--- v3/internal/templates/qwik-ts/frontend/package.json | 8 ++++---- v3/internal/templates/qwik/frontend/package.json | 8 ++++---- .../templates/react-swc-ts/frontend/package.json | 4 ++-- v3/internal/templates/react-swc/frontend/package.json | 4 ++-- v3/internal/templates/react-ts/frontend/package.json | 4 ++-- v3/internal/templates/react/frontend/package.json | 4 ++-- v3/internal/templates/solid-ts/frontend/package.json | 4 ++-- v3/internal/templates/solid/frontend/package.json | 4 ++-- v3/internal/templates/svelte-ts/frontend/package.json | 8 +++++--- v3/internal/templates/svelte/frontend/package.json | 8 +++++--- .../templates/sveltekit-ts/frontend/package.json | 10 +++++----- v3/internal/templates/sveltekit/frontend/package.json | 11 +++++------ .../templates/vanilla-ts/frontend/package.json | 8 +++++--- v3/internal/templates/vanilla/frontend/package.json | 8 +++++--- v3/internal/templates/vue-ts/frontend/package.json | 4 ++-- v3/internal/templates/vue/frontend/package.json | 6 +++--- 20 files changed, 67 insertions(+), 60 deletions(-) diff --git a/v3/internal/templates/lit-ts/frontend/package.json b/v3/internal/templates/lit-ts/frontend/package.json index 80a5e0d96..d208c3fbd 100644 --- a/v3/internal/templates/lit-ts/frontend/package.json +++ b/v3/internal/templates/lit-ts/frontend/package.json @@ -10,11 +10,11 @@ "preview": "vite preview" }, "dependencies": { + "@wailsio/runtime": "latest", "lit": "^3.1.0" }, "devDependencies": { "typescript": "^5.2.2", - "vite": "^5.0.0", - "@wailsio/runtime": "latest" + "vite": "^5.0.0" } -} \ No newline at end of file +} diff --git a/v3/internal/templates/lit/frontend/package.json b/v3/internal/templates/lit/frontend/package.json index 7369a3f47..ec30e751a 100644 --- a/v3/internal/templates/lit/frontend/package.json +++ b/v3/internal/templates/lit/frontend/package.json @@ -10,10 +10,10 @@ "preview": "vite preview" }, "dependencies": { + "@wailsio/runtime": "latest", "lit": "^3.1.0" }, "devDependencies": { - "vite": "^5.0.0", - "@wailsio/runtime": "latest" + "vite": "^5.0.0" } -} \ No newline at end of file +} diff --git a/v3/internal/templates/preact-ts/frontend/package.json b/v3/internal/templates/preact-ts/frontend/package.json index e26f733b7..b5dd75296 100644 --- a/v3/internal/templates/preact-ts/frontend/package.json +++ b/v3/internal/templates/preact-ts/frontend/package.json @@ -10,12 +10,12 @@ "preview": "vite preview" }, "dependencies": { + "@wailsio/runtime": "latest", "preact": "^10.19.3" }, "devDependencies": { "@preact/preset-vite": "^2.7.0", "typescript": "^5.2.2", - "vite": "^5.0.8", - "@wailsio/runtime": "latest" + "vite": "^5.0.8" } -} \ No newline at end of file +} diff --git a/v3/internal/templates/preact/frontend/package.json b/v3/internal/templates/preact/frontend/package.json index 27506286f..863d1fc23 100644 --- a/v3/internal/templates/preact/frontend/package.json +++ b/v3/internal/templates/preact/frontend/package.json @@ -10,11 +10,11 @@ "preview": "vite preview" }, "dependencies": { + "@wailsio/runtime": "latest", "preact": "^10.19.3" }, "devDependencies": { "@preact/preset-vite": "^2.7.0", - "vite": "^5.0.8", - "@wailsio/runtime": "latest" + "vite": "^5.0.8" } -} \ No newline at end of file +} diff --git a/v3/internal/templates/qwik-ts/frontend/package.json b/v3/internal/templates/qwik-ts/frontend/package.json index 8452e0e60..b3f359a6b 100644 --- a/v3/internal/templates/qwik-ts/frontend/package.json +++ b/v3/internal/templates/qwik-ts/frontend/package.json @@ -9,12 +9,12 @@ "build": "tsc && vite build --mode production", "preview": "vite preview" }, - "devDependencies": { - "typescript": "^5.2.2", - "vite": "^5.0.8" - }, "dependencies": { "@builder.io/qwik": "^1.3.0", "@wailsio/runtime": "latest" + }, + "devDependencies": { + "typescript": "^5.2.2", + "vite": "^5.0.8" } } diff --git a/v3/internal/templates/qwik/frontend/package.json b/v3/internal/templates/qwik/frontend/package.json index 782a10d42..3139e426b 100644 --- a/v3/internal/templates/qwik/frontend/package.json +++ b/v3/internal/templates/qwik/frontend/package.json @@ -9,12 +9,12 @@ "build": "vite build --mode production", "preview": "vite preview" }, - "devDependencies": { - "typescript": "^5.2.2", - "vite": "^5.0.8" - }, "dependencies": { "@builder.io/qwik": "^1.3.0", "@wailsio/runtime": "latest" + }, + "devDependencies": { + "typescript": "^5.2.2", + "vite": "^5.0.8" } } diff --git a/v3/internal/templates/react-swc-ts/frontend/package.json b/v3/internal/templates/react-swc-ts/frontend/package.json index 5627a60f2..0dcc8cdcd 100644 --- a/v3/internal/templates/react-swc-ts/frontend/package.json +++ b/v3/internal/templates/react-swc-ts/frontend/package.json @@ -10,6 +10,7 @@ "preview": "vite preview" }, "dependencies": { + "@wailsio/runtime": "latest", "react": "^18.2.0", "react-dom": "^18.2.0" }, @@ -18,7 +19,6 @@ "@types/react-dom": "^18.2.17", "@vitejs/plugin-react-swc": "^3.5.0", "typescript": "^5.2.2", - "vite": "^5.0.8", - "@wailsio/runtime": "latest" + "vite": "^5.0.8" } } diff --git a/v3/internal/templates/react-swc/frontend/package.json b/v3/internal/templates/react-swc/frontend/package.json index b86bd3722..158ba6880 100644 --- a/v3/internal/templates/react-swc/frontend/package.json +++ b/v3/internal/templates/react-swc/frontend/package.json @@ -10,6 +10,7 @@ "preview": "vite preview" }, "dependencies": { + "@wailsio/runtime": "latest", "react": "^18.2.0", "react-dom": "^18.2.0" }, @@ -17,7 +18,6 @@ "@types/react": "^18.2.43", "@types/react-dom": "^18.2.17", "@vitejs/plugin-react-swc": "^3.5.0", - "vite": "^5.0.8", - "@wailsio/runtime": "latest" + "vite": "^5.0.8" } } diff --git a/v3/internal/templates/react-ts/frontend/package.json b/v3/internal/templates/react-ts/frontend/package.json index a72ca0f47..f718c0073 100644 --- a/v3/internal/templates/react-ts/frontend/package.json +++ b/v3/internal/templates/react-ts/frontend/package.json @@ -10,6 +10,7 @@ "preview": "vite preview" }, "dependencies": { + "@wailsio/runtime": "latest", "react": "^18.2.0", "react-dom": "^18.2.0" }, @@ -18,7 +19,6 @@ "@types/react-dom": "^18.2.17", "@vitejs/plugin-react": "^4.2.1", "typescript": "^5.2.2", - "vite": "^5.0.8", - "@wailsio/runtime": "latest" + "vite": "^5.0.8" } } diff --git a/v3/internal/templates/react/frontend/package.json b/v3/internal/templates/react/frontend/package.json index ff295952b..59d4d62b3 100644 --- a/v3/internal/templates/react/frontend/package.json +++ b/v3/internal/templates/react/frontend/package.json @@ -10,6 +10,7 @@ "preview": "vite preview" }, "dependencies": { + "@wailsio/runtime": "latest", "react": "^18.2.0", "react-dom": "^18.2.0" }, @@ -17,7 +18,6 @@ "@types/react": "^18.2.43", "@types/react-dom": "^18.2.17", "@vitejs/plugin-react": "^4.2.1", - "vite": "^5.0.8", - "@wailsio/runtime": "latest" + "vite": "^5.0.8" } } diff --git a/v3/internal/templates/solid-ts/frontend/package.json b/v3/internal/templates/solid-ts/frontend/package.json index 703d31562..741674ea7 100644 --- a/v3/internal/templates/solid-ts/frontend/package.json +++ b/v3/internal/templates/solid-ts/frontend/package.json @@ -10,12 +10,12 @@ "preview": "vite preview" }, "dependencies": { + "@wailsio/runtime": "latest", "solid-js": "^1.8.7" }, "devDependencies": { "typescript": "^5.2.2", "vite": "^5.0.8", - "vite-plugin-solid": "^2.8.0", - "@wailsio/runtime": "latest" + "vite-plugin-solid": "^2.8.0" } } diff --git a/v3/internal/templates/solid/frontend/package.json b/v3/internal/templates/solid/frontend/package.json index 9062b3686..03ed9141f 100644 --- a/v3/internal/templates/solid/frontend/package.json +++ b/v3/internal/templates/solid/frontend/package.json @@ -10,11 +10,11 @@ "preview": "vite preview" }, "dependencies": { + "@wailsio/runtime": "latest", "solid-js": "^1.8.7" }, "devDependencies": { "vite": "^5.0.8", - "vite-plugin-solid": "^2.8.0", - "@wailsio/runtime": "latest" + "vite-plugin-solid": "^2.8.0" } } diff --git a/v3/internal/templates/svelte-ts/frontend/package.json b/v3/internal/templates/svelte-ts/frontend/package.json index f3491e928..c14954e77 100644 --- a/v3/internal/templates/svelte-ts/frontend/package.json +++ b/v3/internal/templates/svelte-ts/frontend/package.json @@ -10,6 +10,9 @@ "preview": "vite preview", "check": "svelte-check --tsconfig ./tsconfig.json" }, + "dependencies": { + "@wailsio/runtime": "latest" + }, "devDependencies": { "@sveltejs/vite-plugin-svelte": "^3.0.1", "@tsconfig/svelte": "^5.0.2", @@ -17,7 +20,6 @@ "svelte-check": "^3.6.2", "tslib": "^2.6.2", "typescript": "^5.2.2", - "vite": "^5.0.8", - "@wailsio/runtime": "latest" + "vite": "^5.0.8" } -} \ No newline at end of file +} diff --git a/v3/internal/templates/svelte/frontend/package.json b/v3/internal/templates/svelte/frontend/package.json index 3a9ca1053..4655c0e95 100644 --- a/v3/internal/templates/svelte/frontend/package.json +++ b/v3/internal/templates/svelte/frontend/package.json @@ -9,10 +9,12 @@ "build": "vite build --mode production", "preview": "vite preview" }, + "dependencies": { + "@wailsio/runtime": "latest" + }, "devDependencies": { "@sveltejs/vite-plugin-svelte": "^3.0.1", "svelte": "^4.2.8", - "vite": "^5.0.8", - "@wailsio/runtime": "latest" + "vite": "^5.0.8" } -} \ No newline at end of file +} diff --git a/v3/internal/templates/sveltekit-ts/frontend/package.json b/v3/internal/templates/sveltekit-ts/frontend/package.json index c545acab9..5e5c0e86a 100644 --- a/v3/internal/templates/sveltekit-ts/frontend/package.json +++ b/v3/internal/templates/sveltekit-ts/frontend/package.json @@ -2,6 +2,7 @@ "name": "frontend", "version": "0.0.1", "private": true, + "type": "module", "scripts": { "dev": "vite dev", "build:dev": "vite build --minify false --mode development", @@ -10,17 +11,16 @@ "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch" }, + "dependencies": { + "@wailsio/runtime": "^3.0.0-alpha.28" + }, "devDependencies": { + "@sveltejs/adapter-static": "^3.0.5", "@sveltejs/kit": "^2.0.0", "@sveltejs/vite-plugin-svelte": "^3.0.0", "svelte": "^4.2.7", "svelte-check": "^4.0.0", "typescript": "^5.0.0", "vite": "^5.0.3" - }, - "type": "module", - "dependencies": { - "@sveltejs/adapter-static": "^3.0.5", - "@wailsio/runtime": "^3.0.0-alpha.28" } } diff --git a/v3/internal/templates/sveltekit/frontend/package.json b/v3/internal/templates/sveltekit/frontend/package.json index 03427d5b8..c07d6da50 100644 --- a/v3/internal/templates/sveltekit/frontend/package.json +++ b/v3/internal/templates/sveltekit/frontend/package.json @@ -2,6 +2,7 @@ "name": "frontend", "version": "0.0.1", "private": true, + "type": "module", "scripts": { "dev": "vite dev", "build:dev": "vite build --minify false --mode development", @@ -10,16 +11,14 @@ "check": "svelte-kit sync && svelte-check --tsconfig ./jsconfig.json", "check:watch": "svelte-kit sync && svelte-check --tsconfig ./jsconfig.json --watch" }, + "dependencies": { + "@wailsio/runtime": "^3.0.0-alpha.28" + }, "devDependencies": { - "@sveltejs/adapter-auto": "^3.0.0", + "@sveltejs/adapter-static": "^3.0.5", "@sveltejs/kit": "^2.0.0", "@sveltejs/vite-plugin-svelte": "^3.0.0", "svelte": "^4.2.7", "vite": "^5.0.3" - }, - "type": "module", - "dependencies": { - "@sveltejs/adapter-static": "^3.0.5", - "@wailsio/runtime": "^3.0.0-alpha.28" } } diff --git a/v3/internal/templates/vanilla-ts/frontend/package.json b/v3/internal/templates/vanilla-ts/frontend/package.json index 4d675f189..b39da7ece 100644 --- a/v3/internal/templates/vanilla-ts/frontend/package.json +++ b/v3/internal/templates/vanilla-ts/frontend/package.json @@ -9,9 +9,11 @@ "build": "tsc && vite build --mode production", "preview": "vite preview" }, + "dependencies": { + "@wailsio/runtime": "latest" + }, "devDependencies": { "typescript": "^4.9.3", - "vite": "^5.0.0", - "@wailsio/runtime": "latest" + "vite": "^5.0.0" } -} \ No newline at end of file +} diff --git a/v3/internal/templates/vanilla/frontend/package.json b/v3/internal/templates/vanilla/frontend/package.json index 9ae87549e..b8d7427fb 100644 --- a/v3/internal/templates/vanilla/frontend/package.json +++ b/v3/internal/templates/vanilla/frontend/package.json @@ -9,8 +9,10 @@ "build": "vite build --mode production", "preview": "vite preview" }, + "dependencies": { + "@wailsio/runtime": "latest" + }, "devDependencies": { - "vite": "^5.0.0", - "@wailsio/runtime": "latest" + "vite": "^5.0.0" } -} \ No newline at end of file +} diff --git a/v3/internal/templates/vue-ts/frontend/package.json b/v3/internal/templates/vue-ts/frontend/package.json index 60bd3c63d..dc08ffa11 100644 --- a/v3/internal/templates/vue-ts/frontend/package.json +++ b/v3/internal/templates/vue-ts/frontend/package.json @@ -10,13 +10,13 @@ "preview": "vite preview" }, "dependencies": { + "@wailsio/runtime": "latest", "vue": "^3.2.45" }, "devDependencies": { "@vitejs/plugin-vue": "^4.0.0", "typescript": "^4.9.3", "vite": "^5.0.0", - "@wailsio/runtime": "latest", "vue-tsc": "^1.0.11" } -} \ No newline at end of file +} diff --git a/v3/internal/templates/vue/frontend/package.json b/v3/internal/templates/vue/frontend/package.json index 7cd67be52..6958956b3 100644 --- a/v3/internal/templates/vue/frontend/package.json +++ b/v3/internal/templates/vue/frontend/package.json @@ -10,11 +10,11 @@ "preview": "vite preview" }, "dependencies": { + "@wailsio/runtime": "latest", "vue": "^3.2.45" }, "devDependencies": { "@vitejs/plugin-vue": "^4.0.0", - "vite": "^5.0.0", - "@wailsio/runtime": "latest" + "vite": "^5.0.0" } -} \ No newline at end of file +} From 3f2db134c23e55d5bed8677abf579750e95cfdc6 Mon Sep 17 00:00:00 2001 From: Ian VanSchooten Date: Wed, 12 Mar 2025 11:31:14 -0400 Subject: [PATCH 158/374] Remove package-lock.json from templates --- .../sveltekit-ts/frontend/package-lock.json | 1288 ----------------- .../sveltekit/frontend/package-lock.json | 1221 ---------------- 2 files changed, 2509 deletions(-) delete mode 100644 v3/internal/templates/sveltekit-ts/frontend/package-lock.json delete mode 100644 v3/internal/templates/sveltekit/frontend/package-lock.json diff --git a/v3/internal/templates/sveltekit-ts/frontend/package-lock.json b/v3/internal/templates/sveltekit-ts/frontend/package-lock.json deleted file mode 100644 index 4ba4bd3f3..000000000 --- a/v3/internal/templates/sveltekit-ts/frontend/package-lock.json +++ /dev/null @@ -1,1288 +0,0 @@ -{ - "name": "frontend", - "version": "0.0.1", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "frontend", - "version": "0.0.1", - "dependencies": { - "@sveltejs/adapter-static": "^3.0.5", - "@wailsio/runtime": "^3.0.0-alpha.28" - }, - "devDependencies": { - "@sveltejs/kit": "^2.0.0", - "@sveltejs/vite-plugin-svelte": "^3.0.0", - "svelte": "^4.2.7", - "svelte-check": "^4.0.0", - "typescript": "^5.0.0", - "vite": "^5.0.3" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@polka/url": { - "version": "1.0.0-next.28", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz", - "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==" - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.0.tgz", - "integrity": "sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.0.tgz", - "integrity": "sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.0.tgz", - "integrity": "sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.0.tgz", - "integrity": "sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.0.tgz", - "integrity": "sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.0.tgz", - "integrity": "sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.0.tgz", - "integrity": "sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.0.tgz", - "integrity": "sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.0.tgz", - "integrity": "sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.0.tgz", - "integrity": "sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==", - "cpu": [ - "riscv64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.0.tgz", - "integrity": "sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==", - "cpu": [ - "s390x" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.0.tgz", - "integrity": "sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.0.tgz", - "integrity": "sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.0.tgz", - "integrity": "sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.0.tgz", - "integrity": "sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz", - "integrity": "sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@sveltejs/adapter-static": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-3.0.5.tgz", - "integrity": "sha512-kFJR7RxeB6FBvrKZWAEzIALatgy11ISaaZbcPup8JdWUdrmmfUHHTJ738YHJTEfnCiiXi6aX8Q6ePY7tnSMD6Q==", - "peerDependencies": { - "@sveltejs/kit": "^2.0.0" - } - }, - "node_modules/@sveltejs/kit": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.7.1.tgz", - "integrity": "sha512-TBVnkwgYQT3EafGQK6Eyh5FlLEBlRhCmqPTwcdOs+QdnyUc3eCAxRWtXlFxIWtmk6pqv11zdng8qTpThdTogew==", - "hasInstallScript": true, - "dependencies": { - "@types/cookie": "^0.6.0", - "cookie": "^0.6.0", - "devalue": "^5.1.0", - "esm-env": "^1.0.0", - "import-meta-resolve": "^4.1.0", - "kleur": "^4.1.5", - "magic-string": "^0.30.5", - "mrmime": "^2.0.0", - "sade": "^1.8.1", - "set-cookie-parser": "^2.6.0", - "sirv": "^3.0.0", - "tiny-glob": "^0.2.9" - }, - "bin": { - "svelte-kit": "svelte-kit.js" - }, - "engines": { - "node": ">=18.13" - }, - "peerDependencies": { - "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1", - "svelte": "^4.0.0 || ^5.0.0-next.0", - "vite": "^5.0.3" - } - }, - "node_modules/@sveltejs/vite-plugin-svelte": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-3.1.2.tgz", - "integrity": "sha512-Txsm1tJvtiYeLUVRNqxZGKR/mI+CzuIQuc2gn+YCs9rMTowpNZ2Nqt53JdL8KF9bLhAf2ruR/dr9eZCwdTriRA==", - "dependencies": { - "@sveltejs/vite-plugin-svelte-inspector": "^2.1.0", - "debug": "^4.3.4", - "deepmerge": "^4.3.1", - "kleur": "^4.1.5", - "magic-string": "^0.30.10", - "svelte-hmr": "^0.16.0", - "vitefu": "^0.2.5" - }, - "engines": { - "node": "^18.0.0 || >=20" - }, - "peerDependencies": { - "svelte": "^4.0.0 || ^5.0.0-next.0", - "vite": "^5.0.0" - } - }, - "node_modules/@sveltejs/vite-plugin-svelte-inspector": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-2.1.0.tgz", - "integrity": "sha512-9QX28IymvBlSCqsCll5t0kQVxipsfhFFL+L2t3nTWfXnddYwxBuAEtTtlaVQpRz9c37BhJjltSeY4AJSC03SSg==", - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.0.0 || >=20" - }, - "peerDependencies": { - "@sveltejs/vite-plugin-svelte": "^3.0.0", - "svelte": "^4.0.0 || ^5.0.0-next.0", - "vite": "^5.0.0" - } - }, - "node_modules/@types/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==" - }, - "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==" - }, - "node_modules/@wailsio/runtime": { - "version": "3.0.0-alpha.28", - "resolved": "https://registry.npmjs.org/@wailsio/runtime/-/runtime-3.0.0-alpha.28.tgz", - "integrity": "sha512-caMnAcKxxDrIWYgCZAMY2kdL++X4ehO2+JvH5na21xfDqz3VnHkEjxsH3jfhgd34M8LY80QEH8iqoMYytDFE/g==", - "dependencies": { - "nanoid": "^5.0.7" - } - }, - "node_modules/@wailsio/runtime/node_modules/nanoid": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.7.tgz", - "integrity": "sha512-oLxFY2gd2IqnjcYyOXD8XGCftpGtZP2AbHbOkthDkvRywH5ayNtPVy9YlOPcHckXzbLTCHpkb7FB+yuxKV13pQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.js" - }, - "engines": { - "node": "^18 || >=20" - } - }, - "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/aria-query": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", - "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/axobject-query": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", - "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/chokidar": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", - "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", - "dev": true, - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/code-red": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/code-red/-/code-red-1.0.4.tgz", - "integrity": "sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15", - "@types/estree": "^1.0.1", - "acorn": "^8.10.0", - "estree-walker": "^3.0.3", - "periscopic": "^3.1.0" - } - }, - "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/css-tree": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", - "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", - "dependencies": { - "mdn-data": "2.0.30", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" - } - }, - "node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/devalue": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.1.1.tgz", - "integrity": "sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==" - }, - "node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, - "node_modules/esm-env": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.0.0.tgz", - "integrity": "sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==" - }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/fdir": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.0.tgz", - "integrity": "sha512-3oB133prH1o4j/L5lLW7uOCF1PlD+/It2L0eL/iAqWMB91RBbqTewABqxhj0ibBd90EEmWZq7ntIWzVaWcXTGQ==", - "dev": true, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/globalyzer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", - "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==" - }, - "node_modules/globrex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", - "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==" - }, - "node_modules/import-meta-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", - "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-reference": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", - "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==", - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/locate-character": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", - "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==" - }, - "node_modules/magic-string": { - "version": "0.30.12", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", - "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, - "node_modules/mdn-data": { - "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==" - }, - "node_modules/mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/mrmime": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", - "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/periscopic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", - "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^3.0.0", - "is-reference": "^3.0.0" - } - }, - "node_modules/picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==" - }, - "node_modules/postcss": { - "version": "8.4.47", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", - "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.1.0", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/readdirp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", - "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", - "dev": true, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/rollup": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.0.tgz", - "integrity": "sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==", - "dependencies": { - "@types/estree": "1.0.6" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.24.0", - "@rollup/rollup-android-arm64": "4.24.0", - "@rollup/rollup-darwin-arm64": "4.24.0", - "@rollup/rollup-darwin-x64": "4.24.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.24.0", - "@rollup/rollup-linux-arm-musleabihf": "4.24.0", - "@rollup/rollup-linux-arm64-gnu": "4.24.0", - "@rollup/rollup-linux-arm64-musl": "4.24.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.24.0", - "@rollup/rollup-linux-riscv64-gnu": "4.24.0", - "@rollup/rollup-linux-s390x-gnu": "4.24.0", - "@rollup/rollup-linux-x64-gnu": "4.24.0", - "@rollup/rollup-linux-x64-musl": "4.24.0", - "@rollup/rollup-win32-arm64-msvc": "4.24.0", - "@rollup/rollup-win32-ia32-msvc": "4.24.0", - "@rollup/rollup-win32-x64-msvc": "4.24.0", - "fsevents": "~2.3.2" - } - }, - "node_modules/sade": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", - "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", - "dependencies": { - "mri": "^1.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/set-cookie-parser": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.0.tgz", - "integrity": "sha512-lXLOiqpkUumhRdFF3k1osNXCy9akgx/dyPZ5p8qAg9seJzXr5ZrlqZuWIMuY6ejOsVLE6flJ5/h3lsn57fQ/PQ==" - }, - "node_modules/sirv": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.0.tgz", - "integrity": "sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==", - "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/svelte": { - "version": "4.2.19", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.19.tgz", - "integrity": "sha512-IY1rnGr6izd10B0A8LqsBfmlT5OILVuZ7XsI0vdGPEvuonFV7NYEUK4dAkm9Zg2q0Um92kYjTpS1CAP3Nh/KWw==", - "dependencies": { - "@ampproject/remapping": "^2.2.1", - "@jridgewell/sourcemap-codec": "^1.4.15", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/estree": "^1.0.1", - "acorn": "^8.9.0", - "aria-query": "^5.3.0", - "axobject-query": "^4.0.0", - "code-red": "^1.0.3", - "css-tree": "^2.3.1", - "estree-walker": "^3.0.3", - "is-reference": "^3.0.1", - "locate-character": "^3.0.0", - "magic-string": "^0.30.4", - "periscopic": "^3.1.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/svelte-check": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-4.0.5.tgz", - "integrity": "sha512-icBTBZ3ibBaywbXUat3cK6hB5Du+Kq9Z8CRuyLmm64XIe2/r+lQcbuBx/IQgsbrC+kT2jQ0weVpZSSRIPwB6jQ==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "chokidar": "^4.0.1", - "fdir": "^6.2.0", - "picocolors": "^1.0.0", - "sade": "^1.7.4" - }, - "bin": { - "svelte-check": "bin/svelte-check" - }, - "engines": { - "node": ">= 18.0.0" - }, - "peerDependencies": { - "svelte": "^4.0.0 || ^5.0.0-next.0", - "typescript": ">=5.0.0" - } - }, - "node_modules/svelte-hmr": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.16.0.tgz", - "integrity": "sha512-Gyc7cOS3VJzLlfj7wKS0ZnzDVdv3Pn2IuVeJPk9m2skfhcu5bq3wtIZyQGggr7/Iim5rH5cncyQft/kRLupcnA==", - "engines": { - "node": "^12.20 || ^14.13.1 || >= 16" - }, - "peerDependencies": { - "svelte": "^3.19.0 || ^4.0.0" - } - }, - "node_modules/tiny-glob": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", - "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==", - "dependencies": { - "globalyzer": "0.1.0", - "globrex": "^0.1.2" - } - }, - "node_modules/totalist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/typescript": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", - "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/vite": { - "version": "5.4.9", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.9.tgz", - "integrity": "sha512-20OVpJHh0PAM0oSOELa5GaZNWeDjcAvQjGXy2Uyr+Tp+/D2/Hdz6NLgpJLsarPTA2QJ6v8mX2P1ZfbsSKvdMkg==", - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vitefu": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.5.tgz", - "integrity": "sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==", - "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "vite": { - "optional": true - } - } - } - } -} diff --git a/v3/internal/templates/sveltekit/frontend/package-lock.json b/v3/internal/templates/sveltekit/frontend/package-lock.json deleted file mode 100644 index 7e20bdb45..000000000 --- a/v3/internal/templates/sveltekit/frontend/package-lock.json +++ /dev/null @@ -1,1221 +0,0 @@ -{ - "name": "frontend", - "version": "0.0.1", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "frontend", - "version": "0.0.1", - "dependencies": { - "@sveltejs/adapter-static": "^3.0.5", - "@wailsio/runtime": "^3.0.0-alpha.28" - }, - "devDependencies": { - "@sveltejs/adapter-auto": "^3.0.0", - "@sveltejs/kit": "^2.0.0", - "@sveltejs/vite-plugin-svelte": "^3.0.0", - "svelte": "^4.2.7", - "vite": "^5.0.3" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@polka/url": { - "version": "1.0.0-next.28", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz", - "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==" - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.0.tgz", - "integrity": "sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.0.tgz", - "integrity": "sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.0.tgz", - "integrity": "sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.0.tgz", - "integrity": "sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.0.tgz", - "integrity": "sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.0.tgz", - "integrity": "sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.0.tgz", - "integrity": "sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.0.tgz", - "integrity": "sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.0.tgz", - "integrity": "sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.0.tgz", - "integrity": "sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==", - "cpu": [ - "riscv64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.0.tgz", - "integrity": "sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==", - "cpu": [ - "s390x" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.0.tgz", - "integrity": "sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.0.tgz", - "integrity": "sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.0.tgz", - "integrity": "sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.0.tgz", - "integrity": "sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz", - "integrity": "sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@sveltejs/adapter-auto": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@sveltejs/adapter-auto/-/adapter-auto-3.2.5.tgz", - "integrity": "sha512-27LR+uKccZ62lgq4N/hvyU2G+hTP9fxWEAfnZcl70HnyfAjMSsGk1z/SjAPXNCD1mVJIE7IFu3TQ8cQ/UH3c0A==", - "dev": true, - "dependencies": { - "import-meta-resolve": "^4.1.0" - }, - "peerDependencies": { - "@sveltejs/kit": "^2.0.0" - } - }, - "node_modules/@sveltejs/adapter-static": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-3.0.5.tgz", - "integrity": "sha512-kFJR7RxeB6FBvrKZWAEzIALatgy11ISaaZbcPup8JdWUdrmmfUHHTJ738YHJTEfnCiiXi6aX8Q6ePY7tnSMD6Q==", - "peerDependencies": { - "@sveltejs/kit": "^2.0.0" - } - }, - "node_modules/@sveltejs/kit": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.7.1.tgz", - "integrity": "sha512-TBVnkwgYQT3EafGQK6Eyh5FlLEBlRhCmqPTwcdOs+QdnyUc3eCAxRWtXlFxIWtmk6pqv11zdng8qTpThdTogew==", - "hasInstallScript": true, - "dependencies": { - "@types/cookie": "^0.6.0", - "cookie": "^0.6.0", - "devalue": "^5.1.0", - "esm-env": "^1.0.0", - "import-meta-resolve": "^4.1.0", - "kleur": "^4.1.5", - "magic-string": "^0.30.5", - "mrmime": "^2.0.0", - "sade": "^1.8.1", - "set-cookie-parser": "^2.6.0", - "sirv": "^3.0.0", - "tiny-glob": "^0.2.9" - }, - "bin": { - "svelte-kit": "svelte-kit.js" - }, - "engines": { - "node": ">=18.13" - }, - "peerDependencies": { - "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1", - "svelte": "^4.0.0 || ^5.0.0-next.0", - "vite": "^5.0.3" - } - }, - "node_modules/@sveltejs/vite-plugin-svelte": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-3.1.2.tgz", - "integrity": "sha512-Txsm1tJvtiYeLUVRNqxZGKR/mI+CzuIQuc2gn+YCs9rMTowpNZ2Nqt53JdL8KF9bLhAf2ruR/dr9eZCwdTriRA==", - "dependencies": { - "@sveltejs/vite-plugin-svelte-inspector": "^2.1.0", - "debug": "^4.3.4", - "deepmerge": "^4.3.1", - "kleur": "^4.1.5", - "magic-string": "^0.30.10", - "svelte-hmr": "^0.16.0", - "vitefu": "^0.2.5" - }, - "engines": { - "node": "^18.0.0 || >=20" - }, - "peerDependencies": { - "svelte": "^4.0.0 || ^5.0.0-next.0", - "vite": "^5.0.0" - } - }, - "node_modules/@sveltejs/vite-plugin-svelte-inspector": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-2.1.0.tgz", - "integrity": "sha512-9QX28IymvBlSCqsCll5t0kQVxipsfhFFL+L2t3nTWfXnddYwxBuAEtTtlaVQpRz9c37BhJjltSeY4AJSC03SSg==", - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.0.0 || >=20" - }, - "peerDependencies": { - "@sveltejs/vite-plugin-svelte": "^3.0.0", - "svelte": "^4.0.0 || ^5.0.0-next.0", - "vite": "^5.0.0" - } - }, - "node_modules/@types/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==" - }, - "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==" - }, - "node_modules/@wailsio/runtime": { - "version": "3.0.0-alpha.28", - "resolved": "https://registry.npmjs.org/@wailsio/runtime/-/runtime-3.0.0-alpha.28.tgz", - "integrity": "sha512-caMnAcKxxDrIWYgCZAMY2kdL++X4ehO2+JvH5na21xfDqz3VnHkEjxsH3jfhgd34M8LY80QEH8iqoMYytDFE/g==", - "dependencies": { - "nanoid": "^5.0.7" - } - }, - "node_modules/@wailsio/runtime/node_modules/nanoid": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.7.tgz", - "integrity": "sha512-oLxFY2gd2IqnjcYyOXD8XGCftpGtZP2AbHbOkthDkvRywH5ayNtPVy9YlOPcHckXzbLTCHpkb7FB+yuxKV13pQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.js" - }, - "engines": { - "node": "^18 || >=20" - } - }, - "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/aria-query": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", - "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/axobject-query": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", - "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/code-red": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/code-red/-/code-red-1.0.4.tgz", - "integrity": "sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15", - "@types/estree": "^1.0.1", - "acorn": "^8.10.0", - "estree-walker": "^3.0.3", - "periscopic": "^3.1.0" - } - }, - "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/css-tree": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", - "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", - "dependencies": { - "mdn-data": "2.0.30", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" - } - }, - "node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/devalue": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.1.1.tgz", - "integrity": "sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==" - }, - "node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, - "node_modules/esm-env": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.0.0.tgz", - "integrity": "sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==" - }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/globalyzer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", - "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==" - }, - "node_modules/globrex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", - "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==" - }, - "node_modules/import-meta-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", - "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-reference": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", - "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==", - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/locate-character": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", - "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==" - }, - "node_modules/magic-string": { - "version": "0.30.12", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", - "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, - "node_modules/mdn-data": { - "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==" - }, - "node_modules/mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/mrmime": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", - "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/periscopic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", - "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^3.0.0", - "is-reference": "^3.0.0" - } - }, - "node_modules/picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==" - }, - "node_modules/postcss": { - "version": "8.4.47", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", - "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.1.0", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/rollup": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.0.tgz", - "integrity": "sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==", - "dependencies": { - "@types/estree": "1.0.6" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.24.0", - "@rollup/rollup-android-arm64": "4.24.0", - "@rollup/rollup-darwin-arm64": "4.24.0", - "@rollup/rollup-darwin-x64": "4.24.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.24.0", - "@rollup/rollup-linux-arm-musleabihf": "4.24.0", - "@rollup/rollup-linux-arm64-gnu": "4.24.0", - "@rollup/rollup-linux-arm64-musl": "4.24.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.24.0", - "@rollup/rollup-linux-riscv64-gnu": "4.24.0", - "@rollup/rollup-linux-s390x-gnu": "4.24.0", - "@rollup/rollup-linux-x64-gnu": "4.24.0", - "@rollup/rollup-linux-x64-musl": "4.24.0", - "@rollup/rollup-win32-arm64-msvc": "4.24.0", - "@rollup/rollup-win32-ia32-msvc": "4.24.0", - "@rollup/rollup-win32-x64-msvc": "4.24.0", - "fsevents": "~2.3.2" - } - }, - "node_modules/sade": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", - "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", - "dependencies": { - "mri": "^1.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/set-cookie-parser": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.0.tgz", - "integrity": "sha512-lXLOiqpkUumhRdFF3k1osNXCy9akgx/dyPZ5p8qAg9seJzXr5ZrlqZuWIMuY6ejOsVLE6flJ5/h3lsn57fQ/PQ==" - }, - "node_modules/sirv": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.0.tgz", - "integrity": "sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==", - "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/svelte": { - "version": "4.2.19", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.19.tgz", - "integrity": "sha512-IY1rnGr6izd10B0A8LqsBfmlT5OILVuZ7XsI0vdGPEvuonFV7NYEUK4dAkm9Zg2q0Um92kYjTpS1CAP3Nh/KWw==", - "dependencies": { - "@ampproject/remapping": "^2.2.1", - "@jridgewell/sourcemap-codec": "^1.4.15", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/estree": "^1.0.1", - "acorn": "^8.9.0", - "aria-query": "^5.3.0", - "axobject-query": "^4.0.0", - "code-red": "^1.0.3", - "css-tree": "^2.3.1", - "estree-walker": "^3.0.3", - "is-reference": "^3.0.1", - "locate-character": "^3.0.0", - "magic-string": "^0.30.4", - "periscopic": "^3.1.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/svelte-hmr": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.16.0.tgz", - "integrity": "sha512-Gyc7cOS3VJzLlfj7wKS0ZnzDVdv3Pn2IuVeJPk9m2skfhcu5bq3wtIZyQGggr7/Iim5rH5cncyQft/kRLupcnA==", - "engines": { - "node": "^12.20 || ^14.13.1 || >= 16" - }, - "peerDependencies": { - "svelte": "^3.19.0 || ^4.0.0" - } - }, - "node_modules/tiny-glob": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", - "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==", - "dependencies": { - "globalyzer": "0.1.0", - "globrex": "^0.1.2" - } - }, - "node_modules/totalist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/vite": { - "version": "5.4.9", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.9.tgz", - "integrity": "sha512-20OVpJHh0PAM0oSOELa5GaZNWeDjcAvQjGXy2Uyr+Tp+/D2/Hdz6NLgpJLsarPTA2QJ6v8mX2P1ZfbsSKvdMkg==", - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vitefu": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.5.tgz", - "integrity": "sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==", - "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "vite": { - "optional": true - } - } - } - } -} From 0be2efc2751a609402212a1b8c9a5b41ce1e313e Mon Sep 17 00:00:00 2001 From: Oussama Sethoum <88779394+oSethoum@users.noreply.github.com> Date: Wed, 12 Mar 2025 20:48:05 +0100 Subject: [PATCH 159/374] fix: general auto save and general password auto save always enabled --- v3/pkg/application/webview_window_windows.go | 29 ++++++++------------ 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/v3/pkg/application/webview_window_windows.go b/v3/pkg/application/webview_window_windows.go index 89bea1cbd..ecd20002f 100644 --- a/v3/pkg/application/webview_window_windows.go +++ b/v3/pkg/application/webview_window_windows.go @@ -1665,26 +1665,21 @@ func (w *windowsWebviewWindow) setupChromium() { } - if opts.GeneralAutofillEnabled { - err = chromium.PutIsGeneralAutofillEnabled(true) - if err != nil { - if errors.Is(edge.UnsupportedCapabilityError, err) { - // warning - globalApplication.warning("unsupported capability: GeneralAutofillEnabled") - } else { - globalApplication.handleFatalError(err) - } + err = chromium.PutIsGeneralAutofillEnabled(opts.GeneralAutofillEnabled) + if err != nil { + if errors.Is(err, edge.UnsupportedCapabilityError) { + globalApplication.warning("unsupported capability: GeneralAutofillEnabled") + } else { + globalApplication.handleFatalError(err) } } - if opts.PasswordAutosaveEnabled { - err = chromium.PutIsPasswordAutosaveEnabled(true) - if err != nil { - if errors.Is(edge.UnsupportedCapabilityError, err) { - globalApplication.warning("unsupported capability: PasswordAutosaveEnabled") - } else { - globalApplication.handleFatalError(err) - } + err = chromium.PutIsPasswordAutosaveEnabled(opts.PasswordAutosaveEnabled) + if err != nil { + if errors.Is(err, edge.UnsupportedCapabilityError) { + globalApplication.warning("unsupported capability: PasswordAutosaveEnabled") + } else { + globalApplication.handleFatalError(err) } } From 46dd5ef959cf58f4c76bf2f3892c43a7548a51e8 Mon Sep 17 00:00:00 2001 From: Oussama Sethoum <88779394+oSethoum@users.noreply.github.com> Date: Wed, 12 Mar 2025 21:46:53 +0100 Subject: [PATCH 160/374] add: entry in changelog.mdx --- docs/src/content/docs/changelog.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/content/docs/changelog.mdx b/docs/src/content/docs/changelog.mdx index a64d2e718..d9af1adf3 100644 --- a/docs/src/content/docs/changelog.mdx +++ b/docs/src/content/docs/changelog.mdx @@ -75,7 +75,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Add method `Close` on `sqlite` service to close the DB manually by [@fbbdev](https://github.com/fbbdev) in [#4067](https://github.com/wailsapp/wails/pull/4067) - Add cancellation support for query methods on `sqlite` service by [@fbbdev](https://github.com/fbbdev) in [#4067](https://github.com/wailsapp/wails/pull/4067) - Add prepared statement support to `sqlite` service with JS bindings by [@fbbdev](https://github.com/fbbdev) in [#4067](https://github.com/wailsapp/wails/pull/4067) - +- Fix auto save and password auto save always enabled by [@oSethoum](https://github.com/osethoum) in [#4134](https://github.com/wailsapp/wails/pull/4134) ### Fixed - Fixed Windows+Linux Edit Menu issues by [@leaanthony](https://github.com/leaanthony) in [#3f78a3a](https://github.com/wailsapp/wails/commit/3f78a3a8ce7837e8b32242c8edbbed431c68c062) From ee9e3973bd6b64d28e12b945d94cfdb62436d9cf Mon Sep 17 00:00:00 2001 From: Fabio Massaioli Date: Thu, 13 Mar 2025 08:07:40 +0100 Subject: [PATCH 161/374] Fix indentation of sveltekit-ts package.json --- .../sveltekit-ts/frontend/package.json | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/v3/internal/templates/sveltekit-ts/frontend/package.json b/v3/internal/templates/sveltekit-ts/frontend/package.json index 5e5c0e86a..58a6b3eb7 100644 --- a/v3/internal/templates/sveltekit-ts/frontend/package.json +++ b/v3/internal/templates/sveltekit-ts/frontend/package.json @@ -1,26 +1,26 @@ { - "name": "frontend", - "version": "0.0.1", - "private": true, + "name": "frontend", + "version": "0.0.1", + "private": true, "type": "module", - "scripts": { - "dev": "vite dev", - "build:dev": "vite build --minify false --mode development", - "build": "vite build --mode production", - "preview": "vite preview", - "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", - "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch" - }, + "scripts": { + "dev": "vite dev", + "build:dev": "vite build --minify false --mode development", + "build": "vite build --mode production", + "preview": "vite preview", + "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", + "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch" + }, "dependencies": { "@wailsio/runtime": "^3.0.0-alpha.28" }, - "devDependencies": { + "devDependencies": { "@sveltejs/adapter-static": "^3.0.5", - "@sveltejs/kit": "^2.0.0", - "@sveltejs/vite-plugin-svelte": "^3.0.0", - "svelte": "^4.2.7", - "svelte-check": "^4.0.0", - "typescript": "^5.0.0", - "vite": "^5.0.3" - } + "@sveltejs/kit": "^2.0.0", + "@sveltejs/vite-plugin-svelte": "^3.0.0", + "svelte": "^4.2.7", + "svelte-check": "^4.0.0", + "typescript": "^5.0.0", + "vite": "^5.0.3" + } } From 959ce42f260f2abb095ff14960454ef8df297a8b Mon Sep 17 00:00:00 2001 From: Fabio Massaioli Date: Thu, 13 Mar 2025 08:09:09 +0100 Subject: [PATCH 162/374] Fix sveltekit template package.json --- .../templates/sveltekit/frontend/package.json | 44 +++++++++---------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/v3/internal/templates/sveltekit/frontend/package.json b/v3/internal/templates/sveltekit/frontend/package.json index c07d6da50..54d96b52c 100644 --- a/v3/internal/templates/sveltekit/frontend/package.json +++ b/v3/internal/templates/sveltekit/frontend/package.json @@ -1,24 +1,24 @@ { - "name": "frontend", - "version": "0.0.1", - "private": true, - "type": "module", - "scripts": { - "dev": "vite dev", - "build:dev": "vite build --minify false --mode development", - "build": "vite build --mode production", - "preview": "vite preview", - "check": "svelte-kit sync && svelte-check --tsconfig ./jsconfig.json", - "check:watch": "svelte-kit sync && svelte-check --tsconfig ./jsconfig.json --watch" - }, - "dependencies": { - "@wailsio/runtime": "^3.0.0-alpha.28" - }, - "devDependencies": { - "@sveltejs/adapter-static": "^3.0.5", - "@sveltejs/kit": "^2.0.0", - "@sveltejs/vite-plugin-svelte": "^3.0.0", - "svelte": "^4.2.7", - "vite": "^5.0.3" - } + "name": "frontend", + "version": "0.0.1", + "private": true, + "type": "module", + "scripts": { + "dev": "vite dev", + "build:dev": "vite build --minify false --mode development", + "build": "vite build --mode production", + "preview": "vite preview", + "check": "svelte-kit sync && svelte-check --tsconfig ./jsconfig.json", + "check:watch": "svelte-kit sync && svelte-check --tsconfig ./jsconfig.json --watch" + }, + "dependencies": { + "@wailsio/runtime": "^3.0.0-alpha.28" + }, + "devDependencies": { + "@sveltejs/adapter-static": "^3.0.5", + "@sveltejs/kit": "^2.0.0", + "@sveltejs/vite-plugin-svelte": "^3.0.0", + "svelte": "^4.2.7", + "vite": "^5.0.3" + } } From 5bc94ce400e541a2c83ba3876e0317f3c2c1e979 Mon Sep 17 00:00:00 2001 From: Fabio Massaioli Date: Thu, 13 Mar 2025 08:11:51 +0100 Subject: [PATCH 163/374] Fix indentation of vanilla template package.json --- v3/internal/templates/vanilla/frontend/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/v3/internal/templates/vanilla/frontend/package.json b/v3/internal/templates/vanilla/frontend/package.json index b8d7427fb..0a118e984 100644 --- a/v3/internal/templates/vanilla/frontend/package.json +++ b/v3/internal/templates/vanilla/frontend/package.json @@ -10,8 +10,8 @@ "preview": "vite preview" }, "dependencies": { - "@wailsio/runtime": "latest" - }, + "@wailsio/runtime": "latest" + }, "devDependencies": { "vite": "^5.0.0" } From bbb3a0389a7b83766a1478db5836df904a818441 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Fri, 14 Mar 2025 08:35:03 +1100 Subject: [PATCH 164/374] Update deps --- v3/go.mod | 41 +++++++++++++++------------- v3/go.sum | 80 +++++++++++++++++++++++++++++-------------------------- 2 files changed, 64 insertions(+), 57 deletions(-) diff --git a/v3/go.mod b/v3/go.mod index c4ce9ceef..6f80abb19 100644 --- a/v3/go.mod +++ b/v3/go.mod @@ -7,15 +7,15 @@ require ( github.com/adrg/xdg v0.5.3 github.com/atterpac/refresh v0.8.6 github.com/bep/debounce v1.2.1 - github.com/charmbracelet/glamour v0.8.0 + github.com/charmbracelet/glamour v0.9.0 github.com/ebitengine/purego v0.8.2 github.com/go-git/go-git/v5 v5.13.2 github.com/go-ole/go-ole v1.3.0 github.com/godbus/dbus/v5 v5.1.0 - github.com/google/go-cmp v0.6.0 + github.com/google/go-cmp v0.7.0 github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 github.com/google/uuid v1.6.0 - github.com/goreleaser/nfpm/v2 v2.41.2 + github.com/goreleaser/nfpm/v2 v2.41.3 github.com/jackmordaunt/icns/v2 v2.2.7 github.com/jaypipes/ghw v0.13.0 github.com/leaanthony/clir v1.7.0 @@ -32,19 +32,22 @@ require ( github.com/pterm/pterm v0.12.80 github.com/samber/lo v1.49.1 github.com/tc-hib/winres v0.3.1 - github.com/wailsapp/go-webview2 v1.0.19 + github.com/wailsapp/go-webview2 v1.0.21 github.com/wailsapp/mimetype v1.4.1 github.com/wailsapp/task/v3 v3.40.1-patched3 - golang.org/x/sys v0.30.0 - golang.org/x/term v0.29.0 - golang.org/x/tools v0.30.0 + golang.org/x/sys v0.31.0 + golang.org/x/term v0.30.0 + golang.org/x/tools v0.31.0 gopkg.in/ini.v1 v1.67.0 gopkg.in/yaml.v3 v3.0.1 - modernc.org/sqlite v1.35.0 + modernc.org/sqlite v1.36.0 ) require ( atomicgo.dev/schedule v0.1.0 // indirect + github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc // indirect + github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd // indirect + github.com/charmbracelet/x/term v0.2.1 // indirect github.com/ncruces/go-strftime v0.1.9 // indirect ) @@ -59,7 +62,7 @@ require ( github.com/Masterminds/semver/v3 v3.3.1 // indirect github.com/Masterminds/sprig/v3 v3.3.0 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect - github.com/ProtonMail/go-crypto v1.1.5 // indirect + github.com/ProtonMail/go-crypto v1.1.6 // indirect github.com/StackExchange/wmi v1.2.1 // indirect github.com/alecthomas/chroma/v2 v2.15.0 // indirect github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect @@ -67,7 +70,7 @@ require ( github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb // indirect github.com/cavaliergopher/cpio v1.0.1 // indirect github.com/chainguard-dev/git-urls v1.0.2 // indirect - github.com/charmbracelet/lipgloss v1.0.0 // indirect + github.com/charmbracelet/lipgloss v1.1.0 // indirect github.com/charmbracelet/x/ansi v0.8.0 // indirect github.com/cloudflare/circl v1.6.0 // indirect github.com/containerd/console v1.0.4 // indirect @@ -95,7 +98,7 @@ require ( github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e // indirect github.com/joho/godotenv v1.5.1 // indirect github.com/kevinburke/ssh_config v1.2.0 // indirect - github.com/klauspost/compress v1.17.11 // indirect + github.com/klauspost/compress v1.18.0 // indirect github.com/klauspost/cpuid/v2 v2.2.9 // indirect github.com/klauspost/pgzip v1.2.6 // indirect github.com/lithammer/fuzzysearch v1.1.8 // indirect @@ -109,7 +112,7 @@ require ( github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/muesli/cancelreader v0.2.2 // indirect github.com/muesli/reflow v0.3.0 // indirect - github.com/muesli/termenv v0.15.3-0.20240618155329-98d742f6907a // indirect + github.com/muesli/termenv v0.16.0 // indirect github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 // indirect github.com/pjbgf/sha1cd v0.3.2 // indirect github.com/radovskyb/watcher v1.0.7 // indirect @@ -126,17 +129,17 @@ require ( github.com/xanzy/ssh-agent v0.3.3 // indirect github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect github.com/yuin/goldmark v1.7.8 // indirect - github.com/yuin/goldmark-emoji v1.0.4 // indirect + github.com/yuin/goldmark-emoji v1.0.5 // indirect github.com/zeebo/xxh3 v1.0.2 // indirect gitlab.com/digitalxero/go-conventional-commit v1.0.7 // indirect - golang.org/x/crypto v0.33.0 // indirect + golang.org/x/crypto v0.36.0 // indirect golang.org/x/exp v0.0.0-20250210185358-939b2ce775ac // indirect golang.org/x/exp/typeparams v0.0.0-20250210185358-939b2ce775ac golang.org/x/image v0.24.0 // indirect - golang.org/x/mod v0.23.0 // indirect - golang.org/x/net v0.35.0 // indirect - golang.org/x/sync v0.11.0 // indirect - golang.org/x/text v0.22.0 // indirect + golang.org/x/mod v0.24.0 // indirect + golang.org/x/net v0.37.0 // indirect + golang.org/x/sync v0.12.0 // indirect + golang.org/x/text v0.23.0 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect howett.net/plist v1.0.1 // indirect @@ -144,4 +147,4 @@ require ( modernc.org/mathutil v1.7.1 // indirect modernc.org/memory v1.8.2 // indirect mvdan.cc/sh/v3 v3.10.0 // indirect -) \ No newline at end of file +) diff --git a/v3/go.sum b/v3/go.sum index 87f3fdbbc..07fc3d87a 100644 --- a/v3/go.sum +++ b/v3/go.sum @@ -36,8 +36,8 @@ github.com/Masterminds/sprig/v3 v3.3.0/go.mod h1:Zy1iXRYNqNLUolqCpL4uhk6SHUMAOSC github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= -github.com/ProtonMail/go-crypto v1.1.5 h1:eoAQfK2dwL+tFSFpr7TbOaPNUbPiJj4fLYwwGE1FQO4= -github.com/ProtonMail/go-crypto v1.1.5/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE= +github.com/ProtonMail/go-crypto v1.1.6 h1:ZcV+Ropw6Qn0AX9brlQLAUXfqLBc7Bl+f/DmNxpLfdw= +github.com/ProtonMail/go-crypto v1.1.6/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE= github.com/ProtonMail/go-mime v0.0.0-20230322103455-7d82a3887f2f h1:tCbYj7/299ekTTXpdwKYF8eBlsYsDVoggDAuAjoK66k= github.com/ProtonMail/go-mime v0.0.0-20230322103455-7d82a3887f2f/go.mod h1:gcr0kNtGBqin9zDW9GOHcVntrwnjrK+qdJ06mWYBybw= github.com/ProtonMail/gopenpgp/v2 v2.7.1 h1:Awsg7MPc2gD3I7IFac2qE3Gdls0lZW8SzrFZ3k1oz0s= @@ -57,8 +57,6 @@ github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuW github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/atomicgo/cursor v0.0.1/go.mod h1:cBON2QmmrysudxNBFthvMtN32r3jxVRIvzkUiF/RuIk= -github.com/atterpac/refresh v0.8.4 h1:jRgX8TwZaMTqDmcFemhtnpJsrlmEmwwSILUQczHTxY8= -github.com/atterpac/refresh v0.8.4/go.mod h1:fJpWySLdpbANS8Ej5OvfZVZIVvi/9bmnhTjKS5EjQes= github.com/atterpac/refresh v0.8.6 h1:Q5miKV2qs9jW+USw8WZ/54Zz8/RSh/bOz5U6JvvDZmM= github.com/atterpac/refresh v0.8.6/go.mod h1:fJpWySLdpbANS8Ej5OvfZVZIVvi/9bmnhTjKS5EjQes= github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= @@ -77,14 +75,20 @@ github.com/cavaliergopher/cpio v1.0.1 h1:KQFSeKmZhv0cr+kawA3a0xTQCU4QxXF1vhU7P7a github.com/cavaliergopher/cpio v1.0.1/go.mod h1:pBdaqQjnvXxdS/6CvNDwIANIFSP0xRKI16PX4xejRQc= github.com/chainguard-dev/git-urls v1.0.2 h1:pSpT7ifrpc5X55n4aTTm7FFUE+ZQHKiqpiwNkJrVcKQ= github.com/chainguard-dev/git-urls v1.0.2/go.mod h1:rbGgj10OS7UgZlbzdUQIQpT0k/D4+An04HJY7Ol+Y/o= -github.com/charmbracelet/glamour v0.8.0 h1:tPrjL3aRcQbn++7t18wOpgLyl8wrOHUEDS7IZ68QtZs= -github.com/charmbracelet/glamour v0.8.0/go.mod h1:ViRgmKkf3u5S7uakt2czJ272WSg2ZenlYEZXT2x7Bjw= -github.com/charmbracelet/lipgloss v1.0.0 h1:O7VkGDvqEdGi93X+DeqsQ7PKHDgtQfF8j8/O2qFMQNg= -github.com/charmbracelet/lipgloss v1.0.0/go.mod h1:U5fy9Z+C38obMs+T+tJqst9VGzlOYGj4ri9reL3qUlo= +github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc h1:4pZI35227imm7yK2bGPcfpFEmuY1gc2YSTShr4iJBfs= +github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc/go.mod h1:X4/0JoqgTIPSFcRA/P6INZzIuyqdFY5rm8tb41s9okk= +github.com/charmbracelet/glamour v0.9.0 h1:1Hm3wxww7qXvGI+Fb3zDmIZo5oDOvVOWJ4OrIB+ef7c= +github.com/charmbracelet/glamour v0.9.0/go.mod h1:+SHvIS8qnwhgTpVMiXwn7OfGomSqff1cHBCI8jLOetk= +github.com/charmbracelet/lipgloss v1.1.0 h1:vYXsiLHVkK7fp74RkV7b2kq9+zDLoEU4MZoFqR/noCY= +github.com/charmbracelet/lipgloss v1.1.0/go.mod h1:/6Q8FR2o+kj8rz4Dq0zQc3vYf7X+B0binUUBwA0aL30= github.com/charmbracelet/x/ansi v0.8.0 h1:9GTq3xq9caJW8ZrBTe0LIe2fvfLR/bYXKTx2llXn7xE= github.com/charmbracelet/x/ansi v0.8.0/go.mod h1:wdYl/ONOLHLIVmQaxbIYEC/cRKOQyjTkowiI4blgS9Q= +github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd h1:vy0GVL4jeHEwG5YOXDmi86oYw2yuYUGqz6a8sLwg0X8= +github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd/go.mod h1:xe0nKWGd3eJgtqZRaN9RjMtK7xUYchjzPr7q6kcvCCs= github.com/charmbracelet/x/exp/golden v0.0.0-20240806155701-69247e0abc2a h1:G99klV19u0QnhiizODirwVksQB91TJKV/UaTnACcG30= github.com/charmbracelet/x/exp/golden v0.0.0-20240806155701-69247e0abc2a/go.mod h1:wDlXFlCrmJ8J+swcL/MnGUuYnqgQdW9rhSD61oNMb6U= +github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQaGIAQ= +github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg= github.com/cloudflare/circl v1.6.0 h1:cr5JKic4HI+LkINy2lg3W2jF8sHCVTBncJr5gIIq7qk= github.com/cloudflare/circl v1.6.0/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs= github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= @@ -138,8 +142,8 @@ github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ= github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd h1:gbpYu9NMq8jhDVbvlGkMFWCjLFlqqEZjEmObmhUy6Vo= github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw= github.com/google/rpmpack v0.6.1-0.20240329070804-c2247cbb881a h1:JJBdjSfqSy3mnDT0940ASQFghwcZ4y4cb6ttjAoXqwE= @@ -158,8 +162,8 @@ github.com/goreleaser/chglog v0.6.2 h1:qroqdMHzwoAPTHHzJtbCfYbwg/yWJrNQApZ6IQAq8 github.com/goreleaser/chglog v0.6.2/go.mod h1:BP0xQQc6B8aM+4dhvSLlVTv0rvhuOF0JacDO1+h7L3U= github.com/goreleaser/fileglob v1.3.0 h1:/X6J7U8lbDpQtBvGcwwPS6OpzkNVlVEsFUVRx9+k+7I= github.com/goreleaser/fileglob v1.3.0/go.mod h1:Jx6BoXv3mbYkEzwm9THo7xbr5egkAraxkGorbJb4RxU= -github.com/goreleaser/nfpm/v2 v2.41.2 h1:yOjpPlft5zpMPusbIWICphycIjE5orpY/IyMbkBbIJU= -github.com/goreleaser/nfpm/v2 v2.41.2/go.mod h1:zvk0z+wsPKe7Qdsp7z0ZJ9asnbwwhJUEsdOsPkgVC1E= +github.com/goreleaser/nfpm/v2 v2.41.3 h1:IRRsqv5NgiCKUy57HjQgfVBFb44VH8+r1mWeEF8OuA4= +github.com/goreleaser/nfpm/v2 v2.41.3/go.mod h1:0t54RfPX6/iKANsVLbB3XgtfQXzG1nS4HmSavN92qVY= github.com/gorilla/css v1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8= github.com/gorilla/css v1.0.1/go.mod h1:BvnYkspnSzMmwRK+b8/xgNPLiIuNZr6vbZBTPQ2A3b0= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= @@ -183,8 +187,8 @@ github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7 github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= -github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= -github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.10/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= github.com/klauspost/cpuid/v2 v2.0.12/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= @@ -245,8 +249,8 @@ github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELU github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s= github.com/muesli/reflow v0.3.0/go.mod h1:pbwTDkVPibjO2kyvBQRBxTWEEGDGq0FlB1BIKtnHY/8= -github.com/muesli/termenv v0.15.3-0.20240618155329-98d742f6907a h1:2MaM6YC3mGu54x+RKAA6JiFFHlHDY1UbkxqppT7wYOg= -github.com/muesli/termenv v0.15.3-0.20240618155329-98d742f6907a/go.mod h1:hxSnBBYLK21Vtq/PHd0S2FYCxBXzBua8ov5s1RobyRQ= +github.com/muesli/termenv v0.16.0 h1:S5AlUN9dENB57rsbnkPyfdGuWIlkmzJjbFf0Tf5FWUc= +github.com/muesli/termenv v0.16.0/go.mod h1:ZRfOIKPFDYQoDFF4Olj7/QJbW60Ol/kL1pU3VfY/Cnk= github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4= github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ= @@ -317,8 +321,8 @@ github.com/tc-hib/winres v0.3.1 h1:CwRjEGrKdbi5CvZ4ID+iyVhgyfatxFoizjPhzez9Io4= github.com/tc-hib/winres v0.3.1/go.mod h1:C/JaNhH3KBvhNKVbvdlDWkbMDO9H4fKKDaN7/07SSuk= github.com/ulikunitz/xz v0.5.12 h1:37Nm15o69RwBkXM0J6A5OlE67RZTfzUxTj8fB3dfcsc= github.com/ulikunitz/xz v0.5.12/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= -github.com/wailsapp/go-webview2 v1.0.19 h1:7U3QcDj1PrBPaxJNCui2k1SkWml+Q5kvFUFyTImA6NU= -github.com/wailsapp/go-webview2 v1.0.19/go.mod h1:qJmWAmAmaniuKGZPWwne+uor3AHMB5PFhqiK0Bbj8kc= +github.com/wailsapp/go-webview2 v1.0.21 h1:k3dtoZU4KCoN/AEIbWiPln3P2661GtA2oEgA2Pb+maA= +github.com/wailsapp/go-webview2 v1.0.21/go.mod h1:qJmWAmAmaniuKGZPWwne+uor3AHMB5PFhqiK0Bbj8kc= github.com/wailsapp/mimetype v1.4.1 h1:pQN9ycO7uo4vsUUuPeHEYoUkLVkaRntMnHJxVwYhwHs= github.com/wailsapp/mimetype v1.4.1/go.mod h1:9aV5k31bBOv5z6u+QP8TltzvNGJPmNJD4XlAL3U+j3o= github.com/wailsapp/task/v3 v3.40.1-patched3 h1:i6O1WNdSur9CGaiMDIYGjsmj/qS4465zqv+WEs6sPRs= @@ -334,8 +338,8 @@ github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5t github.com/yuin/goldmark v1.7.1/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= github.com/yuin/goldmark v1.7.8 h1:iERMLn0/QJeHFhxSt3p6PeN9mGnvIKSpG9YYorDMnic= github.com/yuin/goldmark v1.7.8/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= -github.com/yuin/goldmark-emoji v1.0.4 h1:vCwMkPZSNefSUnOW2ZKRUjBSD5Ok3W78IXhGxxAEF90= -github.com/yuin/goldmark-emoji v1.0.4/go.mod h1:tTkZEbwu5wkPmgTcitqddVxY9osFZiavD+r4AzQrh1U= +github.com/yuin/goldmark-emoji v1.0.5 h1:EMVWyCGPlXJfUXBXpuMu+ii3TIaxbVBnEX9uaDC4cIk= +github.com/yuin/goldmark-emoji v1.0.5/go.mod h1:tTkZEbwu5wkPmgTcitqddVxY9osFZiavD+r4AzQrh1U= github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= @@ -345,8 +349,8 @@ gitlab.com/digitalxero/go-conventional-commit v1.0.7/go.mod h1:05Xc2BFsSyC5tKhK0 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.33.0 h1:IOBPskki6Lysi0lo9qQvbxiQ+FvsCC/YWOecCHAixus= -golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M= +golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34= +golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc= golang.org/x/exp v0.0.0-20250210185358-939b2ce775ac h1:l5+whBCLH3iH2ZNHYLbAe58bo7yrN4mVcnkHDYz5vvs= golang.org/x/exp v0.0.0-20250210185358-939b2ce775ac/go.mod h1:hH+7mtFmImwwcMvScyxUhjuVHR3HGaDPMn9rMSUUbxo= golang.org/x/exp/typeparams v0.0.0-20250210185358-939b2ce775ac h1:TSSpLIG4v+p0rPv1pNOQtl1I8knsO4S9trOxNMOLVP4= @@ -356,21 +360,21 @@ golang.org/x/image v0.24.0 h1:AN7zRgVsbvmTfNyqIbbOraYL8mSwcKncEj8ofjgzcMQ= golang.org/x/image v0.24.0/go.mod h1:4b/ITuLfqYq1hqZcjofwctIhi7sZh2WaCjvsBNjjya8= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.23.0 h1:Zb7khfcRGKk+kqfxFaP5tZqCnDZMjC5VtUBs87Hr6QM= -golang.org/x/mod v0.23.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= +golang.org/x/mod v0.24.0 h1:ZfthKaKaT4NrhGVZHO1/WDTwGES4De8KtWO0SIbNJMU= +golang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8= -golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk= +golang.org/x/net v0.37.0 h1:1zLorHbz+LYj7MQlSf1+2tPIIgibq2eL5xkrGk6f+2c= +golang.org/x/net v0.37.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= -golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw= +golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20180926160741-c2ed4eda69e7/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -389,29 +393,29 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= -golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= +golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.29.0 h1:L6pJp37ocefwRRtYPKSWOWzOtWSxVajvz2ldH/xi3iU= -golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s= +golang.org/x/term v0.30.0 h1:PQ39fJZ+mfadBm0y5WlL4vlM7Sx1Hgf13sMIY2+QS9Y= +golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= -golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= +golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= +golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.30.0 h1:BgcpHewrV5AUp2G9MebG4XPFI1E2W41zU1SaqVA9vJY= -golang.org/x/tools v0.30.0/go.mod h1:c347cR/OJfw5TI+GfX7RUPNMdDRRbjvYTS0jPyvsVtY= +golang.org/x/tools v0.31.0 h1:0EedkvKDbh+qistFTd0Bcwe/YLh4vHwWEkiI0toFIBU= +golang.org/x/tools v0.31.0/go.mod h1:naFTU+Cev749tSJRXJlna0T3WxKvb1kWEx15xA4SdmQ= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -450,8 +454,8 @@ modernc.org/opt v0.1.4 h1:2kNGMRiUjrp4LcaPuLY2PzUfqM/w9N23quVwhKt5Qm8= modernc.org/opt v0.1.4/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns= modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w= modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE= -modernc.org/sqlite v1.35.0 h1:yQps4fegMnZFdphtzlfQTCNBWtS0CZv48pRpW3RFHRw= -modernc.org/sqlite v1.35.0/go.mod h1:9cr2sicr7jIaWTBKQmAxQLfBv9LL0su4ZTEV+utt3ic= +modernc.org/sqlite v1.36.0 h1:EQXNRn4nIS+gfsKeUTymHIz1waxuv5BzU7558dHSfH8= +modernc.org/sqlite v1.36.0/go.mod h1:7MPwH7Z6bREicF9ZVUR78P1IKuxfZ8mRIDHD0iD+8TU= modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0= modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A= modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= From e4ec06a9c86461963585d3d035b0828614c2f313 Mon Sep 17 00:00:00 2001 From: Zach Botterman Date: Thu, 13 Mar 2025 23:33:17 -0700 Subject: [PATCH 165/374] update example --- .../v3/pkg/services/notifications/service.js | 58 +++++++------------ v3/examples/notifications/frontend/main.js | 12 ++-- 2 files changed, 28 insertions(+), 42 deletions(-) diff --git a/v3/examples/notifications/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/service.js b/v3/examples/notifications/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/service.js index 85e54340f..40c55b4a9 100644 --- a/v3/examples/notifications/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/service.js +++ b/v3/examples/notifications/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/service.js @@ -16,8 +16,7 @@ import {Call as $Call, Create as $Create} from "@wailsio/runtime"; import * as $models from "./models.js"; /** - * CheckNotificationAuthorization is a Windows stub that always returns true. - * (user authorization is macOS-specific) + * CheckNotificationAuthorization checks current notification permission status. * @returns {Promise & { cancel(): void }} */ export function CheckNotificationAuthorization() { @@ -25,17 +24,6 @@ export function CheckNotificationAuthorization() { return $resultPromise; } -/** - * OnNotificationResponse registers a callback function that will be called when - * a notification response is received from the user - * @param {any} callback - * @returns {Promise & { cancel(): void }} - */ -export function OnNotificationResponse(callback) { - let $resultPromise = /** @type {any} */($Call.ByID(2829398511, callback)); - return $resultPromise; -} - /** * RegisterNotificationCategory registers a new NotificationCategory to be used with SendNotificationWithActions. * Registering a category with the same name as a previously registered NotificationCategory will override it. @@ -48,8 +36,7 @@ export function RegisterNotificationCategory(category) { } /** - * RemoveAllDeliveredNotifications is a Windows stub that always returns nil. - * (macOS-specific) + * RemoveAllDeliveredNotifications removes all delivered notifications. * @returns {Promise & { cancel(): void }} */ export function RemoveAllDeliveredNotifications() { @@ -58,8 +45,7 @@ export function RemoveAllDeliveredNotifications() { } /** - * RemoveAllPendingNotifications is a Windows stub that always returns nil. - * (macOS-specific) + * RemoveAllPendingNotifications removes all pending notifications. * @returns {Promise & { cancel(): void }} */ export function RemoveAllPendingNotifications() { @@ -68,18 +54,22 @@ export function RemoveAllPendingNotifications() { } /** - * RemoveDeliveredNotification is a Windows stub that always returns nil. - * (macOS-specific) - * @param {string} $0 + * RemoveDeliveredNotification removes a delivered notification matching the unique identifier. + * @param {string} identifier * @returns {Promise & { cancel(): void }} */ -export function RemoveDeliveredNotification($0) { - let $resultPromise = /** @type {any} */($Call.ByID(149440045, $0)); +export function RemoveDeliveredNotification(identifier) { + let $resultPromise = /** @type {any} */($Call.ByID(149440045, identifier)); return $resultPromise; } /** - * RemoveNotification is a Windows stub that always returns nil. + * RemoveNotification is a macOS stub that always returns nil. + * Use one of the following instead: + * RemoveAllPendingNotifications + * RemovePendingNotification + * RemoveAllDeliveredNotifications + * RemoveDeliveredNotification * (Linux-specific) * @param {string} identifier * @returns {Promise & { cancel(): void }} @@ -90,7 +80,7 @@ export function RemoveNotification(identifier) { } /** - * RemoveNotificationCategory removes a previously registered NotificationCategory. + * RemoveNotificationCategory remove a previously registered NotificationCategory. * @param {string} categoryId * @returns {Promise & { cancel(): void }} */ @@ -100,29 +90,26 @@ export function RemoveNotificationCategory(categoryId) { } /** - * RemovePendingNotification is a Windows stub that always returns nil. - * (macOS-specific) - * @param {string} $0 + * RemovePendingNotification removes a pending notification matching the unique identifier. + * @param {string} identifier * @returns {Promise & { cancel(): void }} */ -export function RemovePendingNotification($0) { - let $resultPromise = /** @type {any} */($Call.ByID(3872412470, $0)); +export function RemovePendingNotification(identifier) { + let $resultPromise = /** @type {any} */($Call.ByID(3872412470, identifier)); return $resultPromise; } /** - * RequestUserNotificationAuthorization is a Windows stub that always returns true, nil. - * (user authorization is macOS-specific) + * RequestNotificationAuthorization requests permission for notifications. * @returns {Promise & { cancel(): void }} */ -export function RequestUserNotificationAuthorization() { - let $resultPromise = /** @type {any} */($Call.ByID(3412125712)); +export function RequestNotificationAuthorization() { + let $resultPromise = /** @type {any} */($Call.ByID(729898933)); return $resultPromise; } /** - * SendNotification sends a basic notification with a name, title, and body. All other options are ignored on Windows. - * (subtitle and category id are only available on macOS) + * SendNotification sends a basic notification with a unique identifier, title, subtitle, and body. * @param {$models.NotificationOptions} options * @returns {Promise & { cancel(): void }} */ @@ -135,7 +122,6 @@ export function SendNotification(options) { * SendNotificationWithActions sends a notification with additional actions and inputs. * A NotificationCategory must be registered with RegisterNotificationCategory first. The `CategoryID` must match the registered category. * If a NotificationCategory is not registered a basic notification will be sent. - * (subtitle and category id are only available on macOS) * @param {$models.NotificationOptions} options * @returns {Promise & { cancel(): void }} */ diff --git a/v3/examples/notifications/frontend/main.js b/v3/examples/notifications/frontend/main.js index 718a9fb4f..2c6d234d4 100644 --- a/v3/examples/notifications/frontend/main.js +++ b/v3/examples/notifications/frontend/main.js @@ -1,12 +1,12 @@ -import * as Notifications from "./bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/service"; +import * as Notifications from "./bindings/github.com/wailsapp/wails/v3/pkg/services/notifications"; import { Events } from "@wailsio/runtime"; const notificationsElement = document.getElementById('notifications'); window.sendNotification = async () => { - const granted = await Notifications.RequestUserNotificationAuthorization(); + const granted = await Notifications.Service.RequestNotificationAuthorization(); if (granted) { - await Notifications.SendNotification({ + await Notifications.Service.SendNotification({ id: crypto.randomUUID(), title: "Title", body: "Body!", @@ -20,9 +20,9 @@ window.sendNotification = async () => { } window.sendComplexNotification = async () => { - const granted = await Notifications.RequestUserNotificationAuthorization(); + const granted = await Notifications.Service.RequestNotificationAuthorization(); if (granted) { - await Notifications.RegisterNotificationCategory({ + await Notifications.Service.RegisterNotificationCategory({ id: "FRONTEND_NOTIF", actions: [ { id: "VIEW_ACTION", title: "View" }, @@ -33,7 +33,7 @@ window.sendComplexNotification = async () => { replyPlaceholder: "Reply to frontend...", }); - await Notifications.SendNotificationWithActions({ + await Notifications.Service.SendNotificationWithActions({ id: crypto.randomUUID(), title: "Complex Frontend Notification", subtitle: "From: Jane Doe", From 1e67e943df24810c3064cf109ec329d19aafed15 Mon Sep 17 00:00:00 2001 From: popaprozac Date: Fri, 14 Mar 2025 18:58:23 -0700 Subject: [PATCH 166/374] rename auth func --- v3/pkg/services/notifications/notifications_linux.go | 4 ++-- v3/pkg/services/notifications/notifications_windows.go | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/v3/pkg/services/notifications/notifications_linux.go b/v3/pkg/services/notifications/notifications_linux.go index 89e577bcb..b9e60a971 100644 --- a/v3/pkg/services/notifications/notifications_linux.go +++ b/v3/pkg/services/notifications/notifications_linux.go @@ -323,9 +323,9 @@ func (ns *Service) CheckBundleIdentifier() bool { return true } -// RequestUserNotificationAuthorization is a Linux stub that always returns true. +// RequestNotificationAuthorization is a Linux stub that always returns true. // (user authorization is macOS-specific) -func (ns *Service) RequestUserNotificationAuthorization() (bool, error) { +func (ns *Service) RequestNotificationAuthorization() (bool, error) { return true, nil } diff --git a/v3/pkg/services/notifications/notifications_windows.go b/v3/pkg/services/notifications/notifications_windows.go index 36466de94..371523ec6 100644 --- a/v3/pkg/services/notifications/notifications_windows.go +++ b/v3/pkg/services/notifications/notifications_windows.go @@ -106,9 +106,9 @@ func CheckBundleIdentifier() bool { return true } -// RequestUserNotificationAuthorization is a Windows stub that always returns true, nil. +// RequestNotificationAuthorization is a Windows stub that always returns true, nil. // (user authorization is macOS-specific) -func (ns *Service) RequestUserNotificationAuthorization() (bool, error) { +func (ns *Service) RequestNotificationAuthorization() (bool, error) { return true, nil } From 1fa68949e6f3c3f260e1de3c1568d719ce26177e Mon Sep 17 00:00:00 2001 From: popaprozac Date: Fri, 14 Mar 2025 19:03:33 -0700 Subject: [PATCH 167/374] // --- v3/pkg/services/notifications/notifications.go | 1 + 1 file changed, 1 insertion(+) diff --git a/v3/pkg/services/notifications/notifications.go b/v3/pkg/services/notifications/notifications.go index c23b8edf5..7d6ed14aa 100644 --- a/v3/pkg/services/notifications/notifications.go +++ b/v3/pkg/services/notifications/notifications.go @@ -60,6 +60,7 @@ func (ns *Service) ServiceName() string { // OnNotificationResponse registers a callback function that will be called when // a notification response is received from the user. +// //wails:ignore func (ns *Service) OnNotificationResponse(callback func(response NotificationResponse)) { ns.callbackLock.Lock() From e46abdc793335817e4387c5eb2c9ce3bf57ff798 Mon Sep 17 00:00:00 2001 From: popaprozac Date: Fri, 14 Mar 2025 19:05:27 -0700 Subject: [PATCH 168/374] update example --- v3/examples/notifications/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v3/examples/notifications/main.go b/v3/examples/notifications/main.go index 34d711f3e..f0a3e46ed 100644 --- a/v3/examples/notifications/main.go +++ b/v3/examples/notifications/main.go @@ -47,7 +47,7 @@ func main() { }) go func() { - granted, err := notificationService.RequestUserNotificationAuthorization() + granted, err := notificationService.RequestNotificationAuthorization() if err != nil { log.Default().Printf("WARNING: %s\n", err) return From 2cb0dac6484a571594931ba6eb3d198095e0436d Mon Sep 17 00:00:00 2001 From: popaprozac Date: Fri, 14 Mar 2025 19:13:58 -0700 Subject: [PATCH 169/374] set default action id on MATE --- v3/pkg/services/notifications/notifications_linux.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/v3/pkg/services/notifications/notifications_linux.go b/v3/pkg/services/notifications/notifications_linux.go index b9e60a971..58d78c2e9 100644 --- a/v3/pkg/services/notifications/notifications_linux.go +++ b/v3/pkg/services/notifications/notifications_linux.go @@ -278,6 +278,10 @@ func (n *internalNotifier) handleActionInvoked(systemID uint32, actionKey string n.Unlock() if notifID != "" && NotificationService != nil { + if actionKey == "default" { + actionKey = DefaultActionIdentifier + } + // First, send the action response with the user data response := NotificationResponse{ ID: notifID, From e810d6a4b046c32f361c1786d3a589313d3f4dc3 Mon Sep 17 00:00:00 2001 From: popaprozac Date: Fri, 14 Mar 2025 23:47:59 -0700 Subject: [PATCH 170/374] tidy --- v3/go.mod | 1 - v3/go.sum | 2 -- 2 files changed, 3 deletions(-) diff --git a/v3/go.mod b/v3/go.mod index 920108029..947f0495f 100644 --- a/v3/go.mod +++ b/v3/go.mod @@ -46,7 +46,6 @@ require ( require ( atomicgo.dev/schedule v0.1.0 // indirect - git.sr.ht/~whereswaldon/shout v0.0.0-20241212204820-26acea6b0007 // indirect github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc // indirect github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd // indirect github.com/charmbracelet/x/term v0.2.1 // indirect diff --git a/v3/go.sum b/v3/go.sum index 11e1eb371..2c07fe6c8 100644 --- a/v3/go.sum +++ b/v3/go.sum @@ -10,8 +10,6 @@ dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s= dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= git.sr.ht/~jackmordaunt/go-toast/v2 v2.0.3 h1:N3IGoHHp9pb6mj1cbXbuaSXV/UMKwmbKLf53nQmtqMA= git.sr.ht/~jackmordaunt/go-toast/v2 v2.0.3/go.mod h1:QtOLZGz8olr4qH2vWK0QH0w0O4T9fEIjMuWpKUsH7nc= -git.sr.ht/~whereswaldon/shout v0.0.0-20241212204820-26acea6b0007 h1:5xMwYHPm3ym1ccRmVmUEj4hiESj5uqXMYPwG+1Ruf28= -git.sr.ht/~whereswaldon/shout v0.0.0-20241212204820-26acea6b0007/go.mod h1:VJjhIIJD+YFIyJSH6nCDqoo9ikvAEaD63tUo4uI86pA= github.com/AlekSi/pointer v1.2.0 h1:glcy/gc4h8HnG2Z3ZECSzZ1IX1x2JxRVuDzaJwQE0+w= github.com/AlekSi/pointer v1.2.0/go.mod h1:gZGfd3dpW4vEc/UlyfKKi1roIqcCgwOIvb0tSNSBle0= github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= From 3a3458cff0ba1e0af9c50eac9c1d021deb575152 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Sun, 16 Mar 2025 11:35:46 +1100 Subject: [PATCH 171/374] Update verify steps in pipeline --- .github/workflows/pr-v3.yml | 2 +- .github/workflows/publish-npm.yml | 4 ++-- .github/workflows/upload-source-documents.yml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/pr-v3.yml b/.github/workflows/pr-v3.yml index a6893f732..7349008ad 100644 --- a/.github/workflows/pr-v3.yml +++ b/.github/workflows/pr-v3.yml @@ -17,7 +17,7 @@ jobs: - uses: actions/checkout@v3 - name: Verify Changed files - uses: tj-actions/verify-changed-files@v17 + uses: step-security/changed-files@3dbe17c78367e7d60f00d78ae6781a35be47b4a1 # v45.0.1 id: verify-changed-files with: files: | diff --git a/.github/workflows/publish-npm.yml b/.github/workflows/publish-npm.yml index eb7275f30..88517c46c 100644 --- a/.github/workflows/publish-npm.yml +++ b/.github/workflows/publish-npm.yml @@ -23,7 +23,7 @@ jobs: - name: Detect committed package.json changes id: package-json-changes - uses: tj-actions/changed-files@v45 + uses: step-security/changed-files@3dbe17c78367e7d60f00d78ae6781a35be47b4a1 # v45.0.1 with: files: | v3/internal/runtime/desktop/@wailsio/runtime/package.json @@ -32,7 +32,7 @@ jobs: if: >- steps.package-json-changes.outputs.any_modified != 'true' id: source-changes - uses: tj-actions/changed-files@v45 + uses: step-security/changed-files@3dbe17c78367e7d60f00d78ae6781a35be47b4a1 # v45.0.1 with: files: | v3/internal/runtime/Taskfile.yaml diff --git a/.github/workflows/upload-source-documents.yml b/.github/workflows/upload-source-documents.yml index df15246fc..69d6c3e48 100644 --- a/.github/workflows/upload-source-documents.yml +++ b/.github/workflows/upload-source-documents.yml @@ -15,7 +15,7 @@ jobs: - name: Verify Changed files id: changed-files - uses: tj-actions/changed-files@v41 + uses: step-security/changed-files@3dbe17c78367e7d60f00d78ae6781a35be47b4a1 # v45.0.1 with: files: | website/**/*.mdx From 4a2dc2875f1a2215cfd74c1099be8e4ef0f5cf96 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Sun, 16 Mar 2025 12:37:50 +1100 Subject: [PATCH 172/374] Update semgrep action --- .github/workflows/semgrep.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/semgrep.yml b/.github/workflows/semgrep.yml index 453e4cb85..7533a3a04 100644 --- a/.github/workflows/semgrep.yml +++ b/.github/workflows/semgrep.yml @@ -5,6 +5,7 @@ on: branches: - main - master + - v3-alpha paths: - .github/workflows/semgrep.yml schedule: From bccff0f73e3b767f94b6e84f01abb582a7ae83f2 Mon Sep 17 00:00:00 2001 From: Ian VanSchooten Date: Tue, 18 Mar 2025 16:21:40 -0400 Subject: [PATCH 173/374] Update changelog --- docs/src/content/docs/changelog.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/src/content/docs/changelog.mdx b/docs/src/content/docs/changelog.mdx index 75dbf824b..e001cea09 100644 --- a/docs/src/content/docs/changelog.mdx +++ b/docs/src/content/docs/changelog.mdx @@ -139,6 +139,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Built-in service types are now consistently called `Service` by [@fbbdev](https://github.com/fbbdev) in [#4067](https://github.com/wailsapp/wails/pull/4067) - Built-in service creation functions with options are now consistently called `NewWithConfig` by [@fbbdev](https://github.com/fbbdev) in [#4067](https://github.com/wailsapp/wails/pull/4067) - `Select` method on `sqlite` service is now named `Query` for consistency with Go APIs by [@fbbdev](https://github.com/fbbdev) in [#4067](https://github.com/wailsapp/wails/pull/4067) +- Templates: moved runtime to "dependencies", organized package.json files by [@IanVS](https://github.com/IanVS) in [#4133](https://github.com/wailsapp/wails/pull/4133) ## v3.0.0-alpha.9 - 2025-01-13 From e4e24a0f00cd4aeda9e8186469052aa5129222c2 Mon Sep 17 00:00:00 2001 From: popaprozac Date: Tue, 18 Mar 2025 21:18:16 -0700 Subject: [PATCH 174/374] clean --- v3/examples/notifications/main.go | 10 +- .../services/notifications/notifications.go | 24 ++- .../notifications/notifications_darwin.go | 175 +++++++++++++----- .../notifications/notifications_darwin.h | 6 +- .../notifications/notifications_darwin.m | 45 +++-- .../notifications/notifications_linux.go | 22 ++- .../notifications/notifications_windows.go | 15 +- 7 files changed, 211 insertions(+), 86 deletions(-) diff --git a/v3/examples/notifications/main.go b/v3/examples/notifications/main.go index f0a3e46ed..c2a2502a3 100644 --- a/v3/examples/notifications/main.go +++ b/v3/examples/notifications/main.go @@ -54,10 +54,14 @@ func main() { } if granted { - notificationService.OnNotificationResponse(func(response notifications.NotificationResponse) { - data, _ := json.Marshal(response) + notificationService.OnNotificationResponse(func(result notifications.NotificationResult) { + if result.Error != nil { + fmt.Printf("notification response error: %s", result.Error) + return + } + data, _ := json.Marshal(result.Response) fmt.Printf("%s\n", string(data)) - app.EmitEvent("notification:response", response) + app.EmitEvent("notification:response", result.Response) }) time.Sleep(time.Second * 2) diff --git a/v3/pkg/services/notifications/notifications.go b/v3/pkg/services/notifications/notifications.go index 7d6ed14aa..ccbcc7e1c 100644 --- a/v3/pkg/services/notifications/notifications.go +++ b/v3/pkg/services/notifications/notifications.go @@ -5,7 +5,7 @@ import "sync" // Service represents the notifications service type Service struct { // notificationResponseCallback is called when a notification response is received - notificationResponseCallback func(response NotificationResponse) + notificationResultCallback func(result NotificationResult) callbackLock sync.RWMutex } @@ -53,30 +53,42 @@ type NotificationResponse = struct { UserInfo map[string]interface{} `json:"userInfo,omitempty"` } +// NotificationResult +type NotificationResult = struct { + Response NotificationResponse + Error error +} + // ServiceName returns the name of the service. func (ns *Service) ServiceName() string { return "github.com/wailsapp/wails/v3/services/notifications" } +func getNotificationService() *Service { + notificationServiceLock.RLock() + defer notificationServiceLock.RUnlock() + return NotificationService +} + // OnNotificationResponse registers a callback function that will be called when // a notification response is received from the user. // //wails:ignore -func (ns *Service) OnNotificationResponse(callback func(response NotificationResponse)) { +func (ns *Service) OnNotificationResponse(callback func(result NotificationResult)) { ns.callbackLock.Lock() defer ns.callbackLock.Unlock() - ns.notificationResponseCallback = callback + ns.notificationResultCallback = callback } // handleNotificationResponse is an internal method to handle notification responses // and invoke the registered callback if one exists -func (ns *Service) handleNotificationResponse(response NotificationResponse) { +func (ns *Service) handleNotificationResult(result NotificationResult) { ns.callbackLock.RLock() - callback := ns.notificationResponseCallback + callback := ns.notificationResultCallback ns.callbackLock.RUnlock() if callback != nil { - callback(response) + callback(result) } } diff --git a/v3/pkg/services/notifications/notifications_darwin.go b/v3/pkg/services/notifications/notifications_darwin.go index 426b7a411..88769fe04 100644 --- a/v3/pkg/services/notifications/notifications_darwin.go +++ b/v3/pkg/services/notifications/notifications_darwin.go @@ -9,15 +9,17 @@ package notifications */ import "C" import ( + "context" "encoding/json" "fmt" "sync" + "time" "unsafe" ) type notificationChannel struct { - authorized bool - err error + success bool + err error } var ( @@ -55,26 +57,47 @@ func CheckBundleIdentifier() bool { // RequestNotificationAuthorization requests permission for notifications. func (ns *Service) RequestNotificationAuthorization() (bool, error) { + ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) + defer cancel() + id, resultCh := registerChannel() C.requestNotificationAuthorization(C.int(id)) - result := <-resultCh - return result.authorized, result.err + select { + case result := <-resultCh: + return result.success, result.err + case <-ctx.Done(): + cleanupChannel(id) + return false, fmt.Errorf("notification authorization timed out after 15s: %w", ctx.Err()) + } } // CheckNotificationAuthorization checks current notification permission status. func (ns *Service) CheckNotificationAuthorization() (bool, error) { + ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) + defer cancel() + id, resultCh := registerChannel() C.checkNotificationAuthorization(C.int(id)) - result := <-resultCh - return result.authorized, result.err + select { + case result := <-resultCh: + return result.success, result.err + case <-ctx.Done(): + cleanupChannel(id) + return false, fmt.Errorf("notification authorization timed out after 15s: %w", ctx.Err()) + } } // SendNotification sends a basic notification with a unique identifier, title, subtitle, and body. func (ns *Service) SendNotification(options NotificationOptions) error { + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + id, resultCh := registerChannel() + cIdentifier := C.CString(options.ID) cTitle := C.CString(options.Title) cSubtitle := C.CString(options.Subtitle) @@ -94,14 +117,32 @@ func (ns *Service) SendNotification(options NotificationOptions) error { defer C.free(unsafe.Pointer(cDataJSON)) } - C.sendNotification(cIdentifier, cTitle, cSubtitle, cBody, cDataJSON) - return nil + C.sendNotification(C.int(id), cIdentifier, cTitle, cSubtitle, cBody, cDataJSON) + + select { + case result := <-resultCh: + if !result.success { + if result.err != nil { + return result.err + } + return fmt.Errorf("sending notification failed") + } + return nil + case <-ctx.Done(): + cleanupChannel(id) + return fmt.Errorf("sending notification timed out: %w", ctx.Err()) + } } // SendNotificationWithActions sends a notification with additional actions and inputs. // A NotificationCategory must be registered with RegisterNotificationCategory first. The `CategoryID` must match the registered category. // If a NotificationCategory is not registered a basic notification will be sent. func (ns *Service) SendNotificationWithActions(options NotificationOptions) error { + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + id, resultCh := registerChannel() + cIdentifier := C.CString(options.ID) cTitle := C.CString(options.Title) cSubtitle := C.CString(options.Subtitle) @@ -123,13 +164,30 @@ func (ns *Service) SendNotificationWithActions(options NotificationOptions) erro defer C.free(unsafe.Pointer(cDataJSON)) } - C.sendNotificationWithActions(cIdentifier, cTitle, cSubtitle, cBody, cCategoryID, cDataJSON) - return nil + C.sendNotificationWithActions(C.int(id), cIdentifier, cTitle, cSubtitle, cBody, cCategoryID, cDataJSON) + select { + case result := <-resultCh: + if !result.success { + if result.err != nil { + return result.err + } + return fmt.Errorf("sending notification failed") + } + return nil + case <-ctx.Done(): + cleanupChannel(id) + return fmt.Errorf("sending notification timed out: %w", ctx.Err()) + } } // RegisterNotificationCategory registers a new NotificationCategory to be used with SendNotificationWithActions. // Registering a category with the same name as a previously registered NotificationCategory will override it. func (ns *Service) RegisterNotificationCategory(category NotificationCategory) error { + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + id, resultCh := registerChannel() + cCategoryID := C.CString(category.ID) defer C.free(unsafe.Pointer(cCategoryID)) @@ -148,9 +206,22 @@ func (ns *Service) RegisterNotificationCategory(category NotificationCategory) e defer C.free(unsafe.Pointer(cReplyButtonTitle)) } - C.registerNotificationCategory(cCategoryID, cActionsJSON, C.bool(category.HasReplyField), + C.registerNotificationCategory(C.int(id), cCategoryID, cActionsJSON, C.bool(category.HasReplyField), cReplyPlaceholder, cReplyButtonTitle) - return nil + + select { + case result := <-resultCh: + if !result.success { + if result.err != nil { + return result.err + } + return fmt.Errorf("category registration failed") + } + return nil + case <-ctx.Done(): + cleanupChannel(id) + return fmt.Errorf("category registration timed out: %w", ctx.Err()) + } } // RemoveNotificationCategory remove a previously registered NotificationCategory. @@ -201,8 +272,8 @@ func (ns *Service) RemoveNotification(identifier string) error { return nil } -//export requestNotificationAuthorizationResponse -func requestNotificationAuthorizationResponse(channelID C.int, authorized C.bool, errorMsg *C.char) { +//export notificationResponse +func notificationResponse(channelID C.int, success C.bool, errorMsg *C.char) { resultCh, exists := getChannel(int(channelID)) if !exists { // handle this @@ -216,41 +287,42 @@ func requestNotificationAuthorizationResponse(channelID C.int, authorized C.bool } resultCh <- notificationChannel{ - authorized: bool(authorized), - err: err, - } - - close(resultCh) -} - -//export checkNotificationAuthorizationResponse -func checkNotificationAuthorizationResponse(channelID C.int, authorized C.bool, errorMsg *C.char) { - resultCh, exists := getChannel(int(channelID)) - if !exists { - // handle this - return - } - - var err error - if errorMsg != nil { - err = fmt.Errorf("%s", C.GoString(errorMsg)) - C.free(unsafe.Pointer(errorMsg)) - } - - resultCh <- notificationChannel{ - authorized: bool(authorized), - err: err, + success: bool(success), + err: err, } close(resultCh) } //export didReceiveNotificationResponse -func didReceiveNotificationResponse(jsonPayload *C.char) { +func didReceiveNotificationResponse(jsonPayload *C.char, err *C.char) { + result := NotificationResult{} + + if err != nil { + errMsg := C.GoString(err) + result.Error = fmt.Errorf("notification response error: %s", errMsg) + if ns := getNotificationService(); ns != nil { + ns.handleNotificationResult(result) + } + return + } + + if jsonPayload == nil { + result.Error = fmt.Errorf("received nil JSON payload in notification response") + if ns := getNotificationService(); ns != nil { + ns.handleNotificationResult(result) + } + return + } + payload := C.GoString(jsonPayload) var response NotificationResponse if err := json.Unmarshal([]byte(payload), &response); err != nil { + result.Error = fmt.Errorf("failed to unmarshal notification response: %w", err) + if ns := getNotificationService(); ns != nil { + ns.handleNotificationResult(result) + } return } @@ -258,18 +330,9 @@ func didReceiveNotificationResponse(jsonPayload *C.char) { response.ActionIdentifier = DefaultActionIdentifier } - notificationServiceLock.RLock() - ns := NotificationService - notificationServiceLock.RUnlock() - - if ns != nil { - ns.callbackLock.RLock() - callback := ns.notificationResponseCallback - ns.callbackLock.RUnlock() - - if callback != nil { - callback(response) - } + result.Response = response + if ns := getNotificationService(); ns != nil { + ns.handleNotificationResult(result) } } @@ -296,3 +359,13 @@ func getChannel(id int) (chan notificationChannel, bool) { } return ch, exists } + +func cleanupChannel(id int) { + notificationChannelsLock.Lock() + defer notificationChannelsLock.Unlock() + + if ch, exists := notificationChannels[id]; exists { + delete(notificationChannels, id) + close(ch) + } +} diff --git a/v3/pkg/services/notifications/notifications_darwin.h b/v3/pkg/services/notifications/notifications_darwin.h index 6848dc68e..a8b7c2298 100644 --- a/v3/pkg/services/notifications/notifications_darwin.h +++ b/v3/pkg/services/notifications/notifications_darwin.h @@ -8,9 +8,9 @@ bool checkBundleIdentifier(void); void requestNotificationAuthorization(int channelID); void checkNotificationAuthorization(int channelID); -void sendNotification(const char *identifier, const char *title, const char *subtitle, const char *body, const char *data_json); -void sendNotificationWithActions(const char *identifier, const char *title, const char *subtitle, const char *body, const char *categoryId, const char *actions_json); -void registerNotificationCategory(const char *categoryId, const char *actions_json, bool hasReplyField, const char *replyPlaceholder, const char *replyButtonTitle); +void sendNotification(int channelID, const char *identifier, const char *title, const char *subtitle, const char *body, const char *data_json); +void sendNotificationWithActions(int channelID, const char *identifier, const char *title, const char *subtitle, const char *body, const char *categoryId, const char *actions_json); +void registerNotificationCategory(int channelID, const char *categoryId, const char *actions_json, bool hasReplyField, const char *replyPlaceholder, const char *replyButtonTitle); void removeNotificationCategory(const char *categoryId); void removeAllPendingNotifications(void); void removePendingNotification(const char *identifier); diff --git a/v3/pkg/services/notifications/notifications_darwin.m b/v3/pkg/services/notifications/notifications_darwin.m index 8329cdc26..66461df99 100644 --- a/v3/pkg/services/notifications/notifications_darwin.m +++ b/v3/pkg/services/notifications/notifications_darwin.m @@ -2,9 +2,8 @@ #import #import -extern void requestNotificationAuthorizationResponse(int channelID, bool authorized, const char* error); -extern void checkNotificationAuthorizationResponse(int channelID, bool authorized, const char* error); -extern void didReceiveNotificationResponse(const char *jsonPayload); +extern void notificationResponse(int channelID, bool success, const char* error); +extern void didReceiveNotificationResponse(const char *jsonPayload, const char* error); @interface NotificationsDelegate : NSObject @end @@ -50,9 +49,12 @@ didReceiveNotificationResponse:(UNNotificationResponse *)response NSError *error = nil; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:payload options:0 error:&error]; - if (!error) { + if (error) { + NSString *errorMsg = [NSString stringWithFormat:@"Error: %@", [error localizedDescription]]; + didReceiveNotificationResponse(NULL, [errorMsg UTF8String]); + } else { NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; - didReceiveNotificationResponse([jsonString UTF8String]); + didReceiveNotificationResponse([jsonString UTF8String], NULL); } completionHandler(); @@ -86,9 +88,10 @@ void requestNotificationAuthorization(int channelID) { [center requestAuthorizationWithOptions:options completionHandler:^(BOOL granted, NSError * _Nullable error) { if (error) { - requestNotificationAuthorizationResponse(channelID, false, [[error localizedDescription] UTF8String]); + NSString *errorMsg = [NSString stringWithFormat:@"Error: %@", [error localizedDescription]]; + notificationResponse(channelID, false, [errorMsg UTF8String]); } else { - requestNotificationAuthorizationResponse(channelID, granted, NULL); + notificationResponse(channelID, granted, NULL); } }]; } @@ -99,11 +102,11 @@ void checkNotificationAuthorization(int channelID) { UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings *settings) { BOOL isAuthorized = (settings.authorizationStatus == UNAuthorizationStatusAuthorized); - checkNotificationAuthorizationResponse(channelID, isAuthorized, NULL); + notificationResponse(channelID, isAuthorized, NULL); }]; } -void sendNotification(const char *identifier, const char *title, const char *subtitle, const char *body, const char *data_json) { +void sendNotification(int channelID, const char *identifier, const char *title, const char *subtitle, const char *body, const char *data_json) { ensureDelegateInitialized(); NSString *nsIdentifier = [NSString stringWithUTF8String:identifier]; @@ -117,6 +120,11 @@ void sendNotification(const char *identifier, const char *title, const char *sub NSData *jsonData = [dataJsonStr dataUsingEncoding:NSUTF8StringEncoding]; NSError *error = nil; NSDictionary *parsedData = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error]; + if (error) { + NSString *errorMsg = [NSString stringWithFormat:@"Error: %@", [error localizedDescription]]; + notificationResponse(channelID, false, [errorMsg UTF8String]); + return; + } if (!error && parsedData) { [customData addEntriesFromDictionary:parsedData]; } @@ -140,12 +148,15 @@ void sendNotification(const char *identifier, const char *title, const char *sub [center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) { if (error) { - NSLog(@"Error scheduling notification: %@", error.localizedDescription); + NSString *errorMsg = [NSString stringWithFormat:@"Error: %@", [error localizedDescription]]; + notificationResponse(channelID, false, [errorMsg UTF8String]); + } else { + notificationResponse(channelID, true, NULL); } }]; } -void sendNotificationWithActions(const char *identifier, const char *title, const char *subtitle, +void sendNotificationWithActions(int channelID, const char *identifier, const char *title, const char *subtitle, const char *body, const char *categoryId, const char *actions_json) { ensureDelegateInitialized(); @@ -187,12 +198,15 @@ void sendNotificationWithActions(const char *identifier, const char *title, cons [center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) { if (error) { - NSLog(@"Error scheduling notification: %@", error.localizedDescription); + NSString *errorMsg = [NSString stringWithFormat:@"Error: %@", [error localizedDescription]]; + notificationResponse(channelID, false, [errorMsg UTF8String]); + } else { + notificationResponse(channelID, true, NULL); } }]; } -void registerNotificationCategory(const char *categoryId, const char *actions_json, bool hasReplyField, +void registerNotificationCategory(int channelID, const char *categoryId, const char *actions_json, bool hasReplyField, const char *replyPlaceholder, const char *replyButtonTitle) { ensureDelegateInitialized(); @@ -204,7 +218,8 @@ void registerNotificationCategory(const char *categoryId, const char *actions_js NSArray *actionsArray = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error]; if (error) { - NSLog(@"Error parsing notification actions JSON: %@", error); + NSString *errorMsg = [NSString stringWithFormat:@"Error: %@", [error localizedDescription]]; + notificationResponse(channelID, false, [errorMsg UTF8String]); return; } @@ -265,6 +280,8 @@ void registerNotificationCategory(const char *categoryId, const char *actions_js // Add the new category [updatedCategories addObject:newCategory]; [center setNotificationCategories:updatedCategories]; + + notificationResponse(channelID, true, NULL); }]; } diff --git a/v3/pkg/services/notifications/notifications_linux.go b/v3/pkg/services/notifications/notifications_linux.go index 58d78c2e9..68217d861 100644 --- a/v3/pkg/services/notifications/notifications_linux.go +++ b/v3/pkg/services/notifications/notifications_linux.go @@ -235,7 +235,7 @@ func (n *internalNotifier) handleNotificationClosed(systemID uint32, reason stri } n.Unlock() - if notifID != "" && NotificationService != nil { + if notifID != "" { response := NotificationResponse{ ID: notifID, ActionIdentifier: DefaultActionIdentifier, @@ -251,7 +251,11 @@ func (n *internalNotifier) handleNotificationClosed(systemID uint32, reason stri response.UserInfo["reason"] = reason } - NotificationService.handleNotificationResponse(response) + result := NotificationResult{} + result.Response = response + if ns := getNotificationService(); ns != nil { + ns.handleNotificationResult(result) + } // Clean up the context n.Lock() @@ -277,7 +281,7 @@ func (n *internalNotifier) handleActionInvoked(systemID uint32, actionKey string } n.Unlock() - if notifID != "" && NotificationService != nil { + if notifID != "" { if actionKey == "default" { actionKey = DefaultActionIdentifier } @@ -293,7 +297,11 @@ func (n *internalNotifier) handleActionInvoked(systemID uint32, actionKey string response.UserInfo = ctx.UserData } - NotificationService.handleNotificationResponse(response) + result := NotificationResult{} + result.Response = response + if ns := getNotificationService(); ns != nil { + ns.handleNotificationResult(result) + } // Then, trigger a closed event with "activated-by-user" reason closeResponse := NotificationResponse{ @@ -311,7 +319,11 @@ func (n *internalNotifier) handleActionInvoked(systemID uint32, actionKey string // Add the reason to the user info closeResponse.UserInfo["reason"] = closedReason(5).string() // "activated-by-user" - NotificationService.handleNotificationResponse(closeResponse) + closeResult := NotificationResult{} + closeResult.Response = closeResponse + if ns := getNotificationService(); ns != nil { + ns.handleNotificationResult(closeResult) + } // Clean up the context n.Lock() diff --git a/v3/pkg/services/notifications/notifications_windows.go b/v3/pkg/services/notifications/notifications_windows.go index 371523ec6..10e0f01a0 100644 --- a/v3/pkg/services/notifications/notifications_windows.go +++ b/v3/pkg/services/notifications/notifications_windows.go @@ -71,6 +71,7 @@ func (ns *Service) ServiceStartup(ctx context.Context, options application.Servi }) toast.SetActivationCallback(func(args string, data []toast.UserData) { + result := NotificationResult{} actionIdentifier, userInfo := parseNotificationResponse(args) response := NotificationResponse{ ActionIdentifier: actionIdentifier, @@ -78,17 +79,23 @@ func (ns *Service) ServiceStartup(ctx context.Context, options application.Servi if userInfo != "" { var userInfoMap map[string]interface{} - if err := json.Unmarshal([]byte(userInfo), &userInfoMap); err == nil { - response.UserInfo = userInfoMap + if err := json.Unmarshal([]byte(userInfo), &userInfoMap); err != nil { + result.Error = fmt.Errorf("failed to unmarshal notification response: %w", err) + + if ns := getNotificationService(); ns != nil { + ns.handleNotificationResult(result) + } } + response.UserInfo = userInfoMap } if userText, found := getUserText(data); found { response.UserText = userText } - if NotificationService != nil { - NotificationService.handleNotificationResponse(response) + result.Response = response + if ns := getNotificationService(); ns != nil { + ns.handleNotificationResult(result) } }) From b60ef7729e8a76d24f702546efcef2f7b6e7eba7 Mon Sep 17 00:00:00 2001 From: popaprozac Date: Tue, 18 Mar 2025 22:46:44 -0700 Subject: [PATCH 175/374] coderabbit impr --- v3/examples/notifications/frontend/main.js | 14 +++ .../services/notifications/notifications.go | 1 + .../notifications/notifications_darwin.go | 56 ++++++--- .../notifications/notifications_darwin.h | 2 +- .../notifications/notifications_darwin.m | 34 +++--- .../notifications/notifications_linux.go | 108 ++++++++++++++---- .../notifications/notifications_windows.go | 2 +- 7 files changed, 156 insertions(+), 61 deletions(-) diff --git a/v3/examples/notifications/frontend/main.js b/v3/examples/notifications/frontend/main.js index 2c6d234d4..781f8983e 100644 --- a/v3/examples/notifications/frontend/main.js +++ b/v3/examples/notifications/frontend/main.js @@ -48,6 +48,20 @@ window.sendComplexNotification = async () => { } } +window.removeNotification = async (id) => { + const granted = await Notifications.Service.RequestNotificationAuthorization(); + if (granted) { + await Notifications.Service.RemoveDeliveredNotification(id); + } +} + +window.removeAllNotifications = async (id) => { + const granted = await Notifications.Service.RequestNotificationAuthorization(); + if (granted) { + await Notifications.Service.RemoveAllDeliveredNotifications(); + } +} + Events.On("notification:response", (response) => { notificationsElement.innerText = JSON.stringify(response.data[0]); }); \ No newline at end of file diff --git a/v3/pkg/services/notifications/notifications.go b/v3/pkg/services/notifications/notifications.go index ccbcc7e1c..fb519aed2 100644 --- a/v3/pkg/services/notifications/notifications.go +++ b/v3/pkg/services/notifications/notifications.go @@ -5,6 +5,7 @@ import "sync" // Service represents the notifications service type Service struct { // notificationResponseCallback is called when a notification response is received + // Only one callback can be assigned at a time. notificationResultCallback func(result NotificationResult) callbackLock sync.RWMutex diff --git a/v3/pkg/services/notifications/notifications_darwin.go b/v3/pkg/services/notifications/notifications_darwin.go index 88769fe04..217e75ad4 100644 --- a/v3/pkg/services/notifications/notifications_darwin.go +++ b/v3/pkg/services/notifications/notifications_darwin.go @@ -18,8 +18,8 @@ import ( ) type notificationChannel struct { - success bool - err error + Success bool + Error error } var ( @@ -66,7 +66,7 @@ func (ns *Service) RequestNotificationAuthorization() (bool, error) { select { case result := <-resultCh: - return result.success, result.err + return result.Success, result.Error case <-ctx.Done(): cleanupChannel(id) return false, fmt.Errorf("notification authorization timed out after 15s: %w", ctx.Err()) @@ -84,7 +84,7 @@ func (ns *Service) CheckNotificationAuthorization() (bool, error) { select { case result := <-resultCh: - return result.success, result.err + return result.Success, result.Error case <-ctx.Done(): cleanupChannel(id) return false, fmt.Errorf("notification authorization timed out after 15s: %w", ctx.Err()) @@ -121,9 +121,9 @@ func (ns *Service) SendNotification(options NotificationOptions) error { select { case result := <-resultCh: - if !result.success { - if result.err != nil { - return result.err + if !result.Success { + if result.Error != nil { + return result.Error } return fmt.Errorf("sending notification failed") } @@ -167,9 +167,9 @@ func (ns *Service) SendNotificationWithActions(options NotificationOptions) erro C.sendNotificationWithActions(C.int(id), cIdentifier, cTitle, cSubtitle, cBody, cCategoryID, cDataJSON) select { case result := <-resultCh: - if !result.success { - if result.err != nil { - return result.err + if !result.Success { + if result.Error != nil { + return result.Error } return fmt.Errorf("sending notification failed") } @@ -211,9 +211,9 @@ func (ns *Service) RegisterNotificationCategory(category NotificationCategory) e select { case result := <-resultCh: - if !result.success { - if result.err != nil { - return result.err + if !result.Success { + if result.Error != nil { + return result.Error } return fmt.Errorf("category registration failed") } @@ -226,11 +226,29 @@ func (ns *Service) RegisterNotificationCategory(category NotificationCategory) e // RemoveNotificationCategory remove a previously registered NotificationCategory. func (ns *Service) RemoveNotificationCategory(categoryId string) error { + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + id, resultCh := registerChannel() + cCategoryID := C.CString(categoryId) defer C.free(unsafe.Pointer(cCategoryID)) - C.removeNotificationCategory(cCategoryID) - return nil + C.removeNotificationCategory(C.int(id), cCategoryID) + + select { + case result := <-resultCh: + if !result.Success { + if result.Error != nil { + return result.Error + } + return fmt.Errorf("category registration failed") + } + return nil + case <-ctx.Done(): + cleanupChannel(id) + return fmt.Errorf("category registration timed out: %w", ctx.Err()) + } } // RemoveAllPendingNotifications removes all pending notifications. @@ -272,8 +290,8 @@ func (ns *Service) RemoveNotification(identifier string) error { return nil } -//export notificationResponse -func notificationResponse(channelID C.int, success C.bool, errorMsg *C.char) { +//export captureResult +func captureResult(channelID C.int, success C.bool, errorMsg *C.char) { resultCh, exists := getChannel(int(channelID)) if !exists { // handle this @@ -287,8 +305,8 @@ func notificationResponse(channelID C.int, success C.bool, errorMsg *C.char) { } resultCh <- notificationChannel{ - success: bool(success), - err: err, + Success: bool(success), + Error: err, } close(resultCh) diff --git a/v3/pkg/services/notifications/notifications_darwin.h b/v3/pkg/services/notifications/notifications_darwin.h index a8b7c2298..f7acf6d1a 100644 --- a/v3/pkg/services/notifications/notifications_darwin.h +++ b/v3/pkg/services/notifications/notifications_darwin.h @@ -11,7 +11,7 @@ void checkNotificationAuthorization(int channelID); void sendNotification(int channelID, const char *identifier, const char *title, const char *subtitle, const char *body, const char *data_json); void sendNotificationWithActions(int channelID, const char *identifier, const char *title, const char *subtitle, const char *body, const char *categoryId, const char *actions_json); void registerNotificationCategory(int channelID, const char *categoryId, const char *actions_json, bool hasReplyField, const char *replyPlaceholder, const char *replyButtonTitle); -void removeNotificationCategory(const char *categoryId); +void removeNotificationCategory(int channelID, const char *categoryId); void removeAllPendingNotifications(void); void removePendingNotification(const char *identifier); void removeAllDeliveredNotifications(void); diff --git a/v3/pkg/services/notifications/notifications_darwin.m b/v3/pkg/services/notifications/notifications_darwin.m index 66461df99..abb129842 100644 --- a/v3/pkg/services/notifications/notifications_darwin.m +++ b/v3/pkg/services/notifications/notifications_darwin.m @@ -2,7 +2,7 @@ #import #import -extern void notificationResponse(int channelID, bool success, const char* error); +extern void captureResult(int channelID, bool success, const char* error); extern void didReceiveNotificationResponse(const char *jsonPayload, const char* error); @interface NotificationsDelegate : NSObject @@ -89,9 +89,9 @@ void requestNotificationAuthorization(int channelID) { [center requestAuthorizationWithOptions:options completionHandler:^(BOOL granted, NSError * _Nullable error) { if (error) { NSString *errorMsg = [NSString stringWithFormat:@"Error: %@", [error localizedDescription]]; - notificationResponse(channelID, false, [errorMsg UTF8String]); + captureResult(channelID, false, [errorMsg UTF8String]); } else { - notificationResponse(channelID, granted, NULL); + captureResult(channelID, granted, NULL); } }]; } @@ -102,7 +102,7 @@ void checkNotificationAuthorization(int channelID) { UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings *settings) { BOOL isAuthorized = (settings.authorizationStatus == UNAuthorizationStatusAuthorized); - notificationResponse(channelID, isAuthorized, NULL); + captureResult(channelID, isAuthorized, NULL); }]; } @@ -122,10 +122,10 @@ void sendNotification(int channelID, const char *identifier, const char *title, NSDictionary *parsedData = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error]; if (error) { NSString *errorMsg = [NSString stringWithFormat:@"Error: %@", [error localizedDescription]]; - notificationResponse(channelID, false, [errorMsg UTF8String]); + captureResult(channelID, false, [errorMsg UTF8String]); return; } - if (!error && parsedData) { + if (parsedData) { [customData addEntriesFromDictionary:parsedData]; } } @@ -142,16 +142,16 @@ void sendNotification(int channelID, const char *identifier, const char *title, content.userInfo = customData; } - UNTimeIntervalNotificationTrigger *trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:1 repeats:NO]; + UNTimeIntervalNotificationTrigger *trigger = nil; UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:nsIdentifier content:content trigger:trigger]; [center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) { if (error) { NSString *errorMsg = [NSString stringWithFormat:@"Error: %@", [error localizedDescription]]; - notificationResponse(channelID, false, [errorMsg UTF8String]); + captureResult(channelID, false, [errorMsg UTF8String]); } else { - notificationResponse(channelID, true, NULL); + captureResult(channelID, true, NULL); } }]; } @@ -192,16 +192,16 @@ void sendNotificationWithActions(int channelID, const char *identifier, const ch content.userInfo = customData; } - UNTimeIntervalNotificationTrigger *trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:1 repeats:NO]; + UNTimeIntervalNotificationTrigger *trigger = nil; UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:nsIdentifier content:content trigger:trigger]; [center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) { if (error) { NSString *errorMsg = [NSString stringWithFormat:@"Error: %@", [error localizedDescription]]; - notificationResponse(channelID, false, [errorMsg UTF8String]); + captureResult(channelID, false, [errorMsg UTF8String]); } else { - notificationResponse(channelID, true, NULL); + captureResult(channelID, true, NULL); } }]; } @@ -219,7 +219,7 @@ void registerNotificationCategory(int channelID, const char *categoryId, const c if (error) { NSString *errorMsg = [NSString stringWithFormat:@"Error: %@", [error localizedDescription]]; - notificationResponse(channelID, false, [errorMsg UTF8String]); + captureResult(channelID, false, [errorMsg UTF8String]); return; } @@ -281,11 +281,11 @@ void registerNotificationCategory(int channelID, const char *categoryId, const c [updatedCategories addObject:newCategory]; [center setNotificationCategories:updatedCategories]; - notificationResponse(channelID, true, NULL); + captureResult(channelID, true, NULL); }]; } -void removeNotificationCategory(const char *categoryId) { +void removeNotificationCategory(int channelID, const char *categoryId) { NSString *nsCategoryId = [NSString stringWithUTF8String:categoryId]; UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; @@ -304,6 +304,10 @@ void removeNotificationCategory(const char *categoryId) { if (categoryToRemove) { [updatedCategories removeObject:categoryToRemove]; [center setNotificationCategories:updatedCategories]; + captureResult(channelID, true, NULL); + } else { + NSString *errorMsg = [NSString stringWithFormat:@"Category '%@' not found", nsCategoryId]; + captureResult(channelID, false, [errorMsg UTF8String]); } }]; } diff --git a/v3/pkg/services/notifications/notifications_linux.go b/v3/pkg/services/notifications/notifications_linux.go index 68217d861..34b110987 100644 --- a/v3/pkg/services/notifications/notifications_linux.go +++ b/v3/pkg/services/notifications/notifications_linux.go @@ -1,7 +1,5 @@ //go:build linux -// WIP - WILL NOT WORK PROPERLY - package notifications import ( @@ -69,11 +67,14 @@ type notificationContext struct { type internalNotifier struct { sync.Mutex - method string - dbusConn *dbus.Conn - sendPath string - activeNotifs map[string]uint32 // Maps our notification IDs to system IDs - contexts map[string]*notificationContext // Stores notification contexts by our ID + method string + dbusConn *dbus.Conn + sendPath string + activeNotifs map[string]uint32 // Maps our notification IDs to system IDs + contexts map[string]*notificationContext // Stores notification contexts by our ID + listenerCtx context.Context + listenerCancel context.CancelFunc + listenerRunning bool } var notifier *internalNotifier @@ -107,10 +108,33 @@ func (ns *Service) ServiceStartup(ctx context.Context, options application.Servi return err } +func (n *internalNotifier) shutdown() { + n.Lock() + defer n.Unlock() + + // Cancel the listener context if it's running + if n.listenerCancel != nil { + n.listenerCancel() + n.listenerCancel = nil + } + + // Close the connection + if n.dbusConn != nil { + n.dbusConn.Close() + n.dbusConn = nil + } + + // Clear state + n.activeNotifs = make(map[string]uint32) + n.contexts = make(map[string]*notificationContext) + n.method = "none" + n.sendPath = "" +} + // ServiceShutdown is called when the service is unloaded func (ns *Service) ServiceShutdown() error { - if notifier != nil && notifier.dbusConn != nil { - notifier.dbusConn.Close() + if notifier != nil { + notifier.shutdown() } return saveCategories() } @@ -119,6 +143,19 @@ func (ns *Service) ServiceShutdown() error { func (n *internalNotifier) init() error { var err error + // Cancel any existing listener before starting a new one + if n.listenerCancel != nil { + n.listenerCancel() + } + + // Create a new context for the listener + n.listenerCtx, n.listenerCancel = context.WithCancel(context.Background()) + + // Reset state + n.activeNotifs = make(map[string]uint32) + n.contexts = make(map[string]*notificationContext) + n.listenerRunning = false + checkDbus := func() (*dbus.Conn, error) { conn, err := dbus.SessionBusPrivate() if err != nil { @@ -161,8 +198,9 @@ func (n *internalNotifier) init() error { n.dbusConn, err = checkDbus() if err == nil { n.method = MethodDbus - // Start the dbus signal listener - go n.startDBusListener() + // Start the dbus signal listener with context + go n.startDBusListener(n.listenerCtx) + n.listenerRunning = true return nil } if n.dbusConn != nil { @@ -194,24 +232,44 @@ func (n *internalNotifier) init() error { } // startDBusListener listens for DBus signals for notification actions and closures -func (n *internalNotifier) startDBusListener() { +func (n *internalNotifier) startDBusListener(ctx context.Context) { signal := make(chan *dbus.Signal, notifyChannelBufferSize) n.dbusConn.Signal(signal) - for s := range signal { - if s == nil || len(s.Body) < 2 { - continue - } + defer func() { + n.Lock() + n.listenerRunning = false + n.Unlock() + n.dbusConn.RemoveSignal(signal) // Remove signal handler + close(signal) // Clean up channel + }() - switch s.Name { - case signalNotificationClosed: - systemID := s.Body[0].(uint32) - reason := closedReason(s.Body[1].(uint32)).string() - n.handleNotificationClosed(systemID, reason) - case signalActionInvoked: - systemID := s.Body[0].(uint32) - actionKey := s.Body[1].(string) - n.handleActionInvoked(systemID, actionKey) + for { + select { + case <-ctx.Done(): + // Context was cancelled, exit gracefully + return + + case s := <-signal: + if s == nil { + // Channel closed or nil signal + continue + } + + if len(s.Body) < 2 { + continue + } + + switch s.Name { + case signalNotificationClosed: + systemID := s.Body[0].(uint32) + reason := closedReason(s.Body[1].(uint32)).string() + n.handleNotificationClosed(systemID, reason) + case signalActionInvoked: + systemID := s.Body[0].(uint32) + actionKey := s.Body[1].(string) + n.handleActionInvoked(systemID, actionKey) + } } } } diff --git a/v3/pkg/services/notifications/notifications_windows.go b/v3/pkg/services/notifications/notifications_windows.go index 10e0f01a0..6afda46b4 100644 --- a/v3/pkg/services/notifications/notifications_windows.go +++ b/v3/pkg/services/notifications/notifications_windows.go @@ -305,7 +305,7 @@ func parseNotificationResponse(response string) (action string, data string) { func saveIconToDir() error { icon, err := application.NewIconFromResource(w32.GetModuleHandle(""), uint16(3)) if err != nil { - return fmt.Errorf("failed to retrieve application icon") + return fmt.Errorf("failed to retrieve application icon: %w", err) } return saveHIconAsPNG(icon, iconPath) From ee885fea44f1e6b03b0561581b5b8f5adc50c5e0 Mon Sep 17 00:00:00 2001 From: popaprozac Date: Tue, 18 Mar 2025 23:13:37 -0700 Subject: [PATCH 176/374] fix mem crash --- v3/pkg/services/notifications/notifications_darwin.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/v3/pkg/services/notifications/notifications_darwin.go b/v3/pkg/services/notifications/notifications_darwin.go index 217e75ad4..f17dd5a69 100644 --- a/v3/pkg/services/notifications/notifications_darwin.go +++ b/v3/pkg/services/notifications/notifications_darwin.go @@ -56,8 +56,9 @@ func CheckBundleIdentifier() bool { } // RequestNotificationAuthorization requests permission for notifications. +// Default timeout is 5 minutes func (ns *Service) RequestNotificationAuthorization() (bool, error) { - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) + ctx, cancel := context.WithTimeout(context.Background(), time.Second*900) defer cancel() id, resultCh := registerChannel() @@ -294,14 +295,12 @@ func (ns *Service) RemoveNotification(identifier string) error { func captureResult(channelID C.int, success C.bool, errorMsg *C.char) { resultCh, exists := getChannel(int(channelID)) if !exists { - // handle this return } var err error if errorMsg != nil { err = fmt.Errorf("%s", C.GoString(errorMsg)) - C.free(unsafe.Pointer(errorMsg)) } resultCh <- notificationChannel{ From 4af058bd02ee74d16a8b80de9f54cba12a8c1a1a Mon Sep 17 00:00:00 2001 From: popaprozac Date: Wed, 19 Mar 2025 18:10:59 -0700 Subject: [PATCH 177/374] more cleanup --- .../services/notifications/notifications.go | 31 +++++++- .../notifications/notifications_darwin.go | 12 ++- .../notifications/notifications_darwin.m | 75 ++++++++----------- .../notifications/notifications_linux.go | 8 ++ .../notifications/notifications_windows.go | 36 ++++++--- 5 files changed, 103 insertions(+), 59 deletions(-) diff --git a/v3/pkg/services/notifications/notifications.go b/v3/pkg/services/notifications/notifications.go index fb519aed2..d3295d8c1 100644 --- a/v3/pkg/services/notifications/notifications.go +++ b/v3/pkg/services/notifications/notifications.go @@ -1,10 +1,25 @@ +// Package notifications provides cross-platform notification capabilities for desktop applications. +// It supports macOS, Windows, and Linux with a consistent API while handling platform-specific +// differences internally. Key features include: +// - Basic notifications with title, subtitle, and body +// - Interactive notifications with buttons and actions +// - Notification categories for reusing configurations +// - User feedback handling with a unified callback system +// +// Platform-specific notes: +// - macOS: Requires a properly bundled and signed application +// - Windows: Uses Windows Toast notifications +// - Linux: Falls back between D-Bus, notify-send, or other methods and does not support text inputs package notifications -import "sync" +import ( + "fmt" + "sync" +) // Service represents the notifications service type Service struct { - // notificationResponseCallback is called when a notification response is received + // notificationResponseCallback is called when a notification result is received. // Only one callback can be assigned at a time. notificationResultCallback func(result NotificationResult) @@ -93,3 +108,15 @@ func (ns *Service) handleNotificationResult(result NotificationResult) { callback(result) } } + +func validateNotificationOptions(options NotificationOptions) error { + if options.ID == "" { + return fmt.Errorf("notification ID cannot be empty") + } + + if options.Title == "" { + return fmt.Errorf("notification title cannot be empty") + } + + return nil +} diff --git a/v3/pkg/services/notifications/notifications_darwin.go b/v3/pkg/services/notifications/notifications_darwin.go index f17dd5a69..638c8b3a4 100644 --- a/v3/pkg/services/notifications/notifications_darwin.go +++ b/v3/pkg/services/notifications/notifications_darwin.go @@ -56,7 +56,7 @@ func CheckBundleIdentifier() bool { } // RequestNotificationAuthorization requests permission for notifications. -// Default timeout is 5 minutes +// Default timeout is 15 minutes func (ns *Service) RequestNotificationAuthorization() (bool, error) { ctx, cancel := context.WithTimeout(context.Background(), time.Second*900) defer cancel() @@ -94,6 +94,10 @@ func (ns *Service) CheckNotificationAuthorization() (bool, error) { // SendNotification sends a basic notification with a unique identifier, title, subtitle, and body. func (ns *Service) SendNotification(options NotificationOptions) error { + if err := validateNotificationOptions(options); err != nil { + return err + } + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() @@ -139,6 +143,10 @@ func (ns *Service) SendNotification(options NotificationOptions) error { // A NotificationCategory must be registered with RegisterNotificationCategory first. The `CategoryID` must match the registered category. // If a NotificationCategory is not registered a basic notification will be sent. func (ns *Service) SendNotificationWithActions(options NotificationOptions) error { + if err := validateNotificationOptions(options); err != nil { + return err + } + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() @@ -243,7 +251,7 @@ func (ns *Service) RemoveNotificationCategory(categoryId string) error { if result.Error != nil { return result.Error } - return fmt.Errorf("category registration failed") + return fmt.Errorf("category removal failed") } return nil case <-ctx.Done(): diff --git a/v3/pkg/services/notifications/notifications_darwin.m b/v3/pkg/services/notifications/notifications_darwin.m index abb129842..cd1c96898 100644 --- a/v3/pkg/services/notifications/notifications_darwin.m +++ b/v3/pkg/services/notifications/notifications_darwin.m @@ -106,37 +106,43 @@ void checkNotificationAuthorization(int channelID) { }]; } -void sendNotification(int channelID, const char *identifier, const char *title, const char *subtitle, const char *body, const char *data_json) { - ensureDelegateInitialized(); - - NSString *nsIdentifier = [NSString stringWithUTF8String:identifier]; +// Helper function to create notification content +UNMutableNotificationContent* createNotificationContent(const char *title, const char *subtitle, + const char *body, const char *data_json) { NSString *nsTitle = [NSString stringWithUTF8String:title]; - NSString *nsSubtitle = [NSString stringWithUTF8String:subtitle]; + NSString *nsSubtitle = subtitle ? [NSString stringWithUTF8String:subtitle] : @""; NSString *nsBody = [NSString stringWithUTF8String:body]; - NSMutableDictionary *customData = [NSMutableDictionary dictionary]; + UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init]; + content.title = nsTitle; + if (![nsSubtitle isEqualToString:@""]) { + content.subtitle = nsSubtitle; + } + content.body = nsBody; + content.sound = [UNNotificationSound defaultSound]; + + // Parse JSON data if provided if (data_json) { NSString *dataJsonStr = [NSString stringWithUTF8String:data_json]; NSData *jsonData = [dataJsonStr dataUsingEncoding:NSUTF8StringEncoding]; NSError *error = nil; NSDictionary *parsedData = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error]; - if (error) { - NSString *errorMsg = [NSString stringWithFormat:@"Error: %@", [error localizedDescription]]; - captureResult(channelID, false, [errorMsg UTF8String]); - return; - } - if (parsedData) { - [customData addEntriesFromDictionary:parsedData]; + if (!error && parsedData) { + content.userInfo = parsedData; } } - UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; + return content; +} + +void sendNotification(int channelID, const char *identifier, const char *title, const char *subtitle, const char *body, const char *data_json) { + ensureDelegateInitialized(); - UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init]; - content.title = nsTitle; - content.subtitle = nsSubtitle; - content.body = nsBody; - content.sound = [UNNotificationSound defaultSound]; + UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; + + NSString *nsIdentifier = [NSString stringWithUTF8String:identifier]; + UNMutableNotificationContent *content = createNotificationContent(title, subtitle, body, data_json); + NSMutableDictionary *customData = [NSMutableDictionary dictionary]; if (customData.count > 0) { content.userInfo = customData; @@ -157,35 +163,16 @@ void sendNotification(int channelID, const char *identifier, const char *title, } void sendNotificationWithActions(int channelID, const char *identifier, const char *title, const char *subtitle, - const char *body, const char *categoryId, const char *actions_json) { + const char *body, const char *categoryId, const char *data_json) { ensureDelegateInitialized(); - NSString *nsIdentifier = [NSString stringWithUTF8String:identifier]; - NSString *nsTitle = [NSString stringWithUTF8String:title]; - NSString *nsSubtitle = subtitle ? [NSString stringWithUTF8String:subtitle] : @""; - NSString *nsBody = [NSString stringWithUTF8String:body]; - NSString *nsCategoryId = [NSString stringWithUTF8String:categoryId]; - - NSMutableDictionary *customData = [NSMutableDictionary dictionary]; - if (actions_json) { - NSString *actionsJsonStr = [NSString stringWithUTF8String:actions_json]; - NSData *jsonData = [actionsJsonStr dataUsingEncoding:NSUTF8StringEncoding]; - NSError *error = nil; - NSDictionary *parsedData = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error]; - if (!error && parsedData) { - [customData addEntriesFromDictionary:parsedData]; - } - } - UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; + + NSString *nsIdentifier = [NSString stringWithUTF8String:identifier]; + NSString *nsCategoryId = [NSString stringWithUTF8String:categoryId]; + UNMutableNotificationContent *content = createNotificationContent(title, subtitle, body, data_json); + NSMutableDictionary *customData = [NSMutableDictionary dictionary]; - UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init]; - content.title = nsTitle; - if (![nsSubtitle isEqualToString:@""]) { - content.subtitle = nsSubtitle; - } - content.body = nsBody; - content.sound = [UNNotificationSound defaultSound]; content.categoryIdentifier = nsCategoryId; if (customData.count > 0) { diff --git a/v3/pkg/services/notifications/notifications_linux.go b/v3/pkg/services/notifications/notifications_linux.go index 34b110987..a75996f50 100644 --- a/v3/pkg/services/notifications/notifications_linux.go +++ b/v3/pkg/services/notifications/notifications_linux.go @@ -415,6 +415,10 @@ func (ns *Service) SendNotification(options NotificationOptions) error { return errors.New("notification service not initialized") } + if err := validateNotificationOptions(options); err != nil { + return err + } + notifier.Lock() defer notifier.Unlock() @@ -454,6 +458,10 @@ func (ns *Service) SendNotificationWithActions(options NotificationOptions) erro return errors.New("notification service not initialized") } + if err := validateNotificationOptions(options); err != nil { + return err + } + notificationLock.RLock() category, exists := notificationCategories[options.CategoryID] notificationLock.RUnlock() diff --git a/v3/pkg/services/notifications/notifications_windows.go b/v3/pkg/services/notifications/notifications_windows.go index 6afda46b4..06884f3f6 100644 --- a/v3/pkg/services/notifications/notifications_windows.go +++ b/v3/pkg/services/notifications/notifications_windows.go @@ -128,6 +128,10 @@ func (ns *Service) CheckNotificationAuthorization() bool { // SendNotification sends a basic notification with a name, title, and body. All other options are ignored on Windows. // (subtitle and category id are only available on macOS) func (ns *Service) SendNotification(options NotificationOptions) error { + if err := validateNotificationOptions(options); err != nil { + return err + } + if err := saveIconToDir(); err != nil { fmt.Printf("Error saving icon: %v\n", err) } @@ -140,9 +144,10 @@ func (ns *Service) SendNotification(options NotificationOptions) error { if options.Data != nil { encodedPayload, err := encodePayload(DefaultActionIdentifier, options.Data) - if err == nil { - n.ActivationArguments = encodedPayload + if err != nil { + return fmt.Errorf("failed to encode notification data: %w", err) } + n.ActivationArguments = encodedPayload } return n.Push() @@ -153,6 +158,10 @@ func (ns *Service) SendNotification(options NotificationOptions) error { // If a NotificationCategory is not registered a basic notification will be sent. // (subtitle and category id are only available on macOS) func (ns *Service) SendNotificationWithActions(options NotificationOptions) error { + if err := validateNotificationOptions(options); err != nil { + return err + } + if err := saveIconToDir(); err != nil { fmt.Printf("Error saving icon: %v\n", err) } @@ -191,15 +200,15 @@ func (ns *Service) SendNotificationWithActions(options NotificationOptions) erro n.ActivationArguments, _ = encodePayload(n.ActivationArguments, options.Data) for index := range n.Actions { - n.Actions[index].Arguments, _ = encodePayload(n.Actions[index].Arguments, options.Data) + encodedPayload, err := encodePayload(n.Actions[index].Arguments, options.Data) + if err != nil { + return fmt.Errorf("failed to encode notification data: %w", err) + } + n.Actions[index].Arguments = encodedPayload } } - err := n.Push() - if err != nil { - return err - } - return nil + return n.Push() } // RegisterNotificationCategory registers a new NotificationCategory to be used with SendNotificationWithActions. @@ -344,20 +353,25 @@ func loadCategoriesFromRegistry() error { ) if err != nil { if err == registry.ErrNotExist { + // Not an error, no saved categories return nil } - return err + return fmt.Errorf("failed to open registry key: %w", err) } defer key.Close() data, _, err := key.GetStringValue(NotificationCategoriesRegistryKey) if err != nil { - return err + if err == registry.ErrNotExist { + // No value yet, but key exists + return nil + } + return fmt.Errorf("failed to read categories from registry: %w", err) } categories := make(map[string]NotificationCategory) if err := json.Unmarshal([]byte(data), &categories); err != nil { - return err + return fmt.Errorf("failed to parse notification categories from registry: %w", err) } notificationCategoriesLock.Lock() From 25256f747f570b3020ae69a8490c8ec7ec526af7 Mon Sep 17 00:00:00 2001 From: popaprozac Date: Wed, 19 Mar 2025 21:40:26 -0700 Subject: [PATCH 178/374] allow only one notification service per app --- .../services/notifications/notifications.go | 8 ++++-- .../notifications/notifications_darwin.go | 28 +++++++++---------- .../notifications/notifications_linux.go | 8 ++++-- .../notifications/notifications_windows.go | 10 +++---- 4 files changed, 30 insertions(+), 24 deletions(-) diff --git a/v3/pkg/services/notifications/notifications.go b/v3/pkg/services/notifications/notifications.go index d3295d8c1..297a21059 100644 --- a/v3/pkg/services/notifications/notifications.go +++ b/v3/pkg/services/notifications/notifications.go @@ -26,8 +26,11 @@ type Service struct { callbackLock sync.RWMutex } -var NotificationService *Service -var notificationServiceLock sync.RWMutex +var ( + notificationServiceOnce sync.Once + NotificationService *Service + notificationServiceLock sync.RWMutex +) // NotificationAction represents an action button for a notification type NotificationAction = struct { @@ -109,6 +112,7 @@ func (ns *Service) handleNotificationResult(result NotificationResult) { } } +// validateNotificationOptions validates an ID and Title are provided for notifications func validateNotificationOptions(options NotificationOptions) error { if options.ID == "" { return fmt.Errorf("notification ID cannot be empty") diff --git a/v3/pkg/services/notifications/notifications_darwin.go b/v3/pkg/services/notifications/notifications_darwin.go index 638c8b3a4..d6eee5464 100644 --- a/v3/pkg/services/notifications/notifications_darwin.go +++ b/v3/pkg/services/notifications/notifications_darwin.go @@ -33,21 +33,21 @@ const AppleDefaultActionIdentifier = "com.apple.UNNotificationDefaultActionIdent // Creates a new Notifications Service. // Your app must be packaged and signed for this feature to work. func New() *Service { - if !CheckBundleIdentifier() { - panic("\nError: Cannot use the notification API in development mode on macOS.\n" + - "Notifications require the app to be properly bundled with a bundle identifier and signed.\n" + - "To use the notification API on macOS:\n" + - " 1. Build and package your app using 'wails3 package'\n" + - " 2. Sign the packaged .app\n" + - " 3. Run the signed .app bundle") - } + notificationServiceOnce.Do(func() { + if !CheckBundleIdentifier() { + panic("\nError: Cannot use the notification API in development mode on macOS.\n" + + "Notifications require the app to be properly bundled with a bundle identifier and signed.\n" + + "To use the notification API on macOS:\n" + + " 1. Build and package your app using 'wails3 package'\n" + + " 2. Sign the packaged .app\n" + + " 3. Run the signed .app bundle") + } - notificationServiceLock.Lock() - defer notificationServiceLock.Unlock() + if NotificationService == nil { + NotificationService = &Service{} + } + }) - if NotificationService == nil { - NotificationService = &Service{} - } return NotificationService } @@ -70,7 +70,7 @@ func (ns *Service) RequestNotificationAuthorization() (bool, error) { return result.Success, result.Error case <-ctx.Done(): cleanupChannel(id) - return false, fmt.Errorf("notification authorization timed out after 15s: %w", ctx.Err()) + return false, fmt.Errorf("notification authorization timed out after 15 minutes: %w", ctx.Err()) } } diff --git a/v3/pkg/services/notifications/notifications_linux.go b/v3/pkg/services/notifications/notifications_linux.go index a75996f50..54b0d2a99 100644 --- a/v3/pkg/services/notifications/notifications_linux.go +++ b/v3/pkg/services/notifications/notifications_linux.go @@ -81,9 +81,11 @@ var notifier *internalNotifier // New creates a new Notifications Service func New() *Service { - if NotificationService == nil { - NotificationService = &Service{} - } + notificationServiceOnce.Do(func() { + if NotificationService == nil { + NotificationService = &Service{} + } + }) return NotificationService } diff --git a/v3/pkg/services/notifications/notifications_windows.go b/v3/pkg/services/notifications/notifications_windows.go index 06884f3f6..1367f194c 100644 --- a/v3/pkg/services/notifications/notifications_windows.go +++ b/v3/pkg/services/notifications/notifications_windows.go @@ -42,12 +42,12 @@ type NotificationPayload struct { // Creates a new Notifications Service. func New() *Service { - notificationServiceLock.Lock() - defer notificationServiceLock.Unlock() + notificationServiceOnce.Do(func() { + if NotificationService == nil { + NotificationService = &Service{} + } + }) - if NotificationService == nil { - NotificationService = &Service{} - } return NotificationService } From bd857385d3c726f6d6f9ea0fb8179ee12a5324eb Mon Sep 17 00:00:00 2001 From: popaprozac Date: Wed, 19 Mar 2025 21:51:57 -0700 Subject: [PATCH 179/374] fix err message --- v3/pkg/services/notifications/notifications_darwin.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v3/pkg/services/notifications/notifications_darwin.go b/v3/pkg/services/notifications/notifications_darwin.go index d6eee5464..05ca217c7 100644 --- a/v3/pkg/services/notifications/notifications_darwin.go +++ b/v3/pkg/services/notifications/notifications_darwin.go @@ -256,7 +256,7 @@ func (ns *Service) RemoveNotificationCategory(categoryId string) error { return nil case <-ctx.Done(): cleanupChannel(id) - return fmt.Errorf("category registration timed out: %w", ctx.Err()) + return fmt.Errorf("category removal timed out: %w", ctx.Err()) } } From c58709c1a340961f7390ecc358ddf83ec57e06a6 Mon Sep 17 00:00:00 2001 From: popaprozac Date: Wed, 19 Mar 2025 22:14:17 -0700 Subject: [PATCH 180/374] lock registry access/writes --- v3/pkg/services/notifications/notifications_windows.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/v3/pkg/services/notifications/notifications_windows.go b/v3/pkg/services/notifications/notifications_windows.go index 1367f194c..e63850cd1 100644 --- a/v3/pkg/services/notifications/notifications_windows.go +++ b/v3/pkg/services/notifications/notifications_windows.go @@ -321,6 +321,9 @@ func saveIconToDir() error { } func saveCategoriesToRegistry() error { + notificationCategoriesLock.Lock() + defer notificationCategoriesLock.Unlock() + registryPath := fmt.Sprintf(NotificationCategoriesRegistryPath, appName) key, _, err := registry.CreateKey( @@ -333,9 +336,7 @@ func saveCategoriesToRegistry() error { } defer key.Close() - notificationCategoriesLock.RLock() data, err := json.Marshal(NotificationCategories) - notificationCategoriesLock.RUnlock() if err != nil { return err } @@ -344,6 +345,9 @@ func saveCategoriesToRegistry() error { } func loadCategoriesFromRegistry() error { + notificationCategoriesLock.Lock() + defer notificationCategoriesLock.Unlock() + registryPath := fmt.Sprintf(NotificationCategoriesRegistryPath, appName) key, err := registry.OpenKey( @@ -374,9 +378,7 @@ func loadCategoriesFromRegistry() error { return fmt.Errorf("failed to parse notification categories from registry: %w", err) } - notificationCategoriesLock.Lock() NotificationCategories = categories - notificationCategoriesLock.Unlock() return nil } From 14d6623c13e86975f9842392c85a0757a55583a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johannes=20L=C3=BCbke?= <60359335+johannes-luebke@users.noreply.github.com> Date: Thu, 20 Mar 2025 14:46:24 +0100 Subject: [PATCH 181/374] fix: unhandled error in dialogs.go Does lead to deadlocks otherwise --- v3/pkg/application/dialogs.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/v3/pkg/application/dialogs.go b/v3/pkg/application/dialogs.go index 1e52225ce..2c832d5f2 100644 --- a/v3/pkg/application/dialogs.go +++ b/v3/pkg/application/dialogs.go @@ -291,6 +291,9 @@ func (d *OpenFileDialogStruct) PromptForMultipleSelection() ([]string, error) { } selections, err := InvokeSyncWithResultAndError(d.impl.show) + if err != nil { + return nil, err + } var result []string for filename := range selections { From 010100456d884433e446e3ccae133d5e5c064cc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johannes=20L=C3=BCbke?= <60359335+johannes-luebke@users.noreply.github.com> Date: Thu, 20 Mar 2025 16:50:24 +0000 Subject: [PATCH 182/374] chore: update changelog --- website/src/pages/changelog.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/website/src/pages/changelog.mdx b/website/src/pages/changelog.mdx index d1b405813..5978d1594 100644 --- a/website/src/pages/changelog.mdx +++ b/website/src/pages/changelog.mdx @@ -18,6 +18,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - Fixed build issues on Linux for some glibc versions. Fixed in [PR](https://github.com/wailsapp/wails/pull/3545) by @leaanthony. +- Fixed locking issue on Windows when multiselect dialog returns an error. Fixed in [PR](https://github.com/wailsapp/wails/pull/4156) by @johannes-luebke ## v2.9.0 - 2024-06-16 From 471402556bea88387f4540aac6ddfa1bb3213851 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johannes=20L=C3=BCbke?= <60359335+johannes-luebke@users.noreply.github.com> Date: Thu, 20 Mar 2025 16:56:33 +0000 Subject: [PATCH 183/374] chore: fix changelog --- website/src/pages/changelog.mdx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/website/src/pages/changelog.mdx b/website/src/pages/changelog.mdx index 5978d1594..c5f51220e 100644 --- a/website/src/pages/changelog.mdx +++ b/website/src/pages/changelog.mdx @@ -14,11 +14,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Fixed +- Fixed locking issue on Windows when multiselect dialog returns an error. Fixed in [PR](https://github.com/wailsapp/wails/pull/4156) by @johannes-luebke + ## v2.9.1 - 2024-06-18 ### Fixed - Fixed build issues on Linux for some glibc versions. Fixed in [PR](https://github.com/wailsapp/wails/pull/3545) by @leaanthony. -- Fixed locking issue on Windows when multiselect dialog returns an error. Fixed in [PR](https://github.com/wailsapp/wails/pull/4156) by @johannes-luebke ## v2.9.0 - 2024-06-16 From b1db2bba12780265408b5c041d648959f0042953 Mon Sep 17 00:00:00 2001 From: popaprozac Date: Thu, 20 Mar 2025 10:59:12 -0700 Subject: [PATCH 184/374] add missing error --- v3/pkg/services/notifications/notifications_windows.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/v3/pkg/services/notifications/notifications_windows.go b/v3/pkg/services/notifications/notifications_windows.go index e63850cd1..020637f87 100644 --- a/v3/pkg/services/notifications/notifications_windows.go +++ b/v3/pkg/services/notifications/notifications_windows.go @@ -197,7 +197,11 @@ func (ns *Service) SendNotificationWithActions(options NotificationOptions) erro } if options.Data != nil { - n.ActivationArguments, _ = encodePayload(n.ActivationArguments, options.Data) + encodedPayload, err := encodePayload(n.ActivationArguments, options.Data) + if err != nil { + return fmt.Errorf("failed to encode notification data: %w", err) + } + n.ActivationArguments = encodedPayload for index := range n.Actions { encodedPayload, err := encodePayload(n.Actions[index].Arguments, options.Data) From 88f13369b695bd9696ddcafdcb32cad1ccf4aba9 Mon Sep 17 00:00:00 2001 From: popaprozac Date: Thu, 20 Mar 2025 13:47:03 -0700 Subject: [PATCH 185/374] reorg platform impl --- .../services/notifications/notifications.go | 99 ++++++++- .../notifications/notifications_darwin.go | 121 ++++++---- .../notifications/notifications_linux.go | 208 +++++++++--------- .../notifications/notifications_windows.go | 152 ++++++------- 4 files changed, 348 insertions(+), 232 deletions(-) diff --git a/v3/pkg/services/notifications/notifications.go b/v3/pkg/services/notifications/notifications.go index 297a21059..bfa0b4489 100644 --- a/v3/pkg/services/notifications/notifications.go +++ b/v3/pkg/services/notifications/notifications.go @@ -13,12 +13,38 @@ package notifications import ( + "context" "fmt" "sync" ) +type notificationImpl interface { + // Lifecycle methods + Startup(ctx context.Context) error + Shutdown() error + + // Core notification methods + RequestNotificationAuthorization() (bool, error) + CheckNotificationAuthorization() (bool, error) + SendNotification(options NotificationOptions) error + SendNotificationWithActions(options NotificationOptions) error + + // Category management + RegisterNotificationCategory(category NotificationCategory) error + RemoveNotificationCategory(categoryID string) error + + // Notification management + RemoveAllPendingNotifications() error + RemovePendingNotification(identifier string) error + RemoveAllDeliveredNotifications() error + RemoveDeliveredNotification(identifier string) error + RemoveNotification(identifier string) error +} + // Service represents the notifications service type Service struct { + impl notificationImpl + // notificationResponseCallback is called when a notification result is received. // Only one callback can be assigned at a time. notificationResultCallback func(result NotificationResult) @@ -83,12 +109,6 @@ func (ns *Service) ServiceName() string { return "github.com/wailsapp/wails/v3/services/notifications" } -func getNotificationService() *Service { - notificationServiceLock.RLock() - defer notificationServiceLock.RUnlock() - return NotificationService -} - // OnNotificationResponse registers a callback function that will be called when // a notification response is received from the user. // @@ -112,6 +132,73 @@ func (ns *Service) handleNotificationResult(result NotificationResult) { } } +// ServiceStartup is called when the service is loaded +func (ns *Service) ServiceStartup(ctx context.Context, options interface{}) error { + return ns.impl.Startup(ctx) +} + +// ServiceShutdown is called when the service is unloaded +func (ns *Service) ServiceShutdown() error { + return ns.impl.Shutdown() +} + +// Public methods that delegate to the implementation +func (ns *Service) RequestNotificationAuthorization() (bool, error) { + return ns.impl.RequestNotificationAuthorization() +} + +func (ns *Service) CheckNotificationAuthorization() (bool, error) { + return ns.impl.CheckNotificationAuthorization() +} + +func (ns *Service) SendNotification(options NotificationOptions) error { + if err := validateNotificationOptions(options); err != nil { + return err + } + return ns.impl.SendNotification(options) +} + +func (ns *Service) SendNotificationWithActions(options NotificationOptions) error { + if err := validateNotificationOptions(options); err != nil { + return err + } + return ns.impl.SendNotificationWithActions(options) +} + +func (ns *Service) RegisterNotificationCategory(category NotificationCategory) error { + return ns.impl.RegisterNotificationCategory(category) +} + +func (ns *Service) RemoveNotificationCategory(categoryID string) error { + return ns.impl.RemoveNotificationCategory(categoryID) +} + +func (ns *Service) RemoveAllPendingNotifications() error { + return ns.impl.RemoveAllPendingNotifications() +} + +func (ns *Service) RemovePendingNotification(identifier string) error { + return ns.impl.RemovePendingNotification(identifier) +} + +func (ns *Service) RemoveAllDeliveredNotifications() error { + return ns.impl.RemoveAllDeliveredNotifications() +} + +func (ns *Service) RemoveDeliveredNotification(identifier string) error { + return ns.impl.RemoveDeliveredNotification(identifier) +} + +func (ns *Service) RemoveNotification(identifier string) error { + return ns.impl.RemoveNotification(identifier) +} + +func getNotificationService() *Service { + notificationServiceLock.RLock() + defer notificationServiceLock.RUnlock() + return NotificationService +} + // validateNotificationOptions validates an ID and Title are provided for notifications func validateNotificationOptions(options NotificationOptions) error { if options.ID == "" { diff --git a/v3/pkg/services/notifications/notifications_darwin.go b/v3/pkg/services/notifications/notifications_darwin.go index 05ca217c7..0be1fd10c 100644 --- a/v3/pkg/services/notifications/notifications_darwin.go +++ b/v3/pkg/services/notifications/notifications_darwin.go @@ -17,17 +17,17 @@ import ( "unsafe" ) +type darwinNotifier struct { + channels map[int]chan notificationChannel + channelsLock sync.Mutex + nextChannelID int +} + type notificationChannel struct { Success bool Error error } -var ( - notificationChannels = make(map[int]chan notificationChannel) - notificationChannelsLock sync.Mutex - nextChannelID int -) - const AppleDefaultActionIdentifier = "com.apple.UNNotificationDefaultActionIdentifier" // Creates a new Notifications Service. @@ -43,25 +43,38 @@ func New() *Service { " 3. Run the signed .app bundle") } - if NotificationService == nil { - NotificationService = &Service{} + impl := &darwinNotifier{ + channels: make(map[int]chan notificationChannel), + nextChannelID: 0, + } + + NotificationService = &Service{ + impl: impl, } }) return NotificationService } +func (dn *darwinNotifier) Startup(ctx context.Context) error { + return nil +} + +func (dn *darwinNotifier) Shutdown() error { + return nil +} + func CheckBundleIdentifier() bool { return bool(C.checkBundleIdentifier()) } // RequestNotificationAuthorization requests permission for notifications. // Default timeout is 15 minutes -func (ns *Service) RequestNotificationAuthorization() (bool, error) { +func (dn *darwinNotifier) RequestNotificationAuthorization() (bool, error) { ctx, cancel := context.WithTimeout(context.Background(), time.Second*900) defer cancel() - id, resultCh := registerChannel() + id, resultCh := dn.registerChannel() C.requestNotificationAuthorization(C.int(id)) @@ -69,17 +82,17 @@ func (ns *Service) RequestNotificationAuthorization() (bool, error) { case result := <-resultCh: return result.Success, result.Error case <-ctx.Done(): - cleanupChannel(id) + dn.cleanupChannel(id) return false, fmt.Errorf("notification authorization timed out after 15 minutes: %w", ctx.Err()) } } // CheckNotificationAuthorization checks current notification permission status. -func (ns *Service) CheckNotificationAuthorization() (bool, error) { +func (dn *darwinNotifier) CheckNotificationAuthorization() (bool, error) { ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) defer cancel() - id, resultCh := registerChannel() + id, resultCh := dn.registerChannel() C.checkNotificationAuthorization(C.int(id)) @@ -87,13 +100,13 @@ func (ns *Service) CheckNotificationAuthorization() (bool, error) { case result := <-resultCh: return result.Success, result.Error case <-ctx.Done(): - cleanupChannel(id) + dn.cleanupChannel(id) return false, fmt.Errorf("notification authorization timed out after 15s: %w", ctx.Err()) } } // SendNotification sends a basic notification with a unique identifier, title, subtitle, and body. -func (ns *Service) SendNotification(options NotificationOptions) error { +func (dn *darwinNotifier) SendNotification(options NotificationOptions) error { if err := validateNotificationOptions(options); err != nil { return err } @@ -101,7 +114,7 @@ func (ns *Service) SendNotification(options NotificationOptions) error { ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() - id, resultCh := registerChannel() + id, resultCh := dn.registerChannel() cIdentifier := C.CString(options.ID) cTitle := C.CString(options.Title) @@ -134,7 +147,7 @@ func (ns *Service) SendNotification(options NotificationOptions) error { } return nil case <-ctx.Done(): - cleanupChannel(id) + dn.cleanupChannel(id) return fmt.Errorf("sending notification timed out: %w", ctx.Err()) } } @@ -142,7 +155,7 @@ func (ns *Service) SendNotification(options NotificationOptions) error { // SendNotificationWithActions sends a notification with additional actions and inputs. // A NotificationCategory must be registered with RegisterNotificationCategory first. The `CategoryID` must match the registered category. // If a NotificationCategory is not registered a basic notification will be sent. -func (ns *Service) SendNotificationWithActions(options NotificationOptions) error { +func (dn *darwinNotifier) SendNotificationWithActions(options NotificationOptions) error { if err := validateNotificationOptions(options); err != nil { return err } @@ -150,7 +163,7 @@ func (ns *Service) SendNotificationWithActions(options NotificationOptions) erro ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() - id, resultCh := registerChannel() + id, resultCh := dn.registerChannel() cIdentifier := C.CString(options.ID) cTitle := C.CString(options.Title) @@ -184,18 +197,18 @@ func (ns *Service) SendNotificationWithActions(options NotificationOptions) erro } return nil case <-ctx.Done(): - cleanupChannel(id) + dn.cleanupChannel(id) return fmt.Errorf("sending notification timed out: %w", ctx.Err()) } } // RegisterNotificationCategory registers a new NotificationCategory to be used with SendNotificationWithActions. // Registering a category with the same name as a previously registered NotificationCategory will override it. -func (ns *Service) RegisterNotificationCategory(category NotificationCategory) error { +func (dn *darwinNotifier) RegisterNotificationCategory(category NotificationCategory) error { ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() - id, resultCh := registerChannel() + id, resultCh := dn.registerChannel() cCategoryID := C.CString(category.ID) defer C.free(unsafe.Pointer(cCategoryID)) @@ -228,17 +241,17 @@ func (ns *Service) RegisterNotificationCategory(category NotificationCategory) e } return nil case <-ctx.Done(): - cleanupChannel(id) + dn.cleanupChannel(id) return fmt.Errorf("category registration timed out: %w", ctx.Err()) } } // RemoveNotificationCategory remove a previously registered NotificationCategory. -func (ns *Service) RemoveNotificationCategory(categoryId string) error { +func (dn *darwinNotifier) RemoveNotificationCategory(categoryId string) error { ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() - id, resultCh := registerChannel() + id, resultCh := dn.registerChannel() cCategoryID := C.CString(categoryId) defer C.free(unsafe.Pointer(cCategoryID)) @@ -255,19 +268,19 @@ func (ns *Service) RemoveNotificationCategory(categoryId string) error { } return nil case <-ctx.Done(): - cleanupChannel(id) + dn.cleanupChannel(id) return fmt.Errorf("category removal timed out: %w", ctx.Err()) } } // RemoveAllPendingNotifications removes all pending notifications. -func (ns *Service) RemoveAllPendingNotifications() error { +func (dn *darwinNotifier) RemoveAllPendingNotifications() error { C.removeAllPendingNotifications() return nil } // RemovePendingNotification removes a pending notification matching the unique identifier. -func (ns *Service) RemovePendingNotification(identifier string) error { +func (dn *darwinNotifier) RemovePendingNotification(identifier string) error { cIdentifier := C.CString(identifier) defer C.free(unsafe.Pointer(cIdentifier)) C.removePendingNotification(cIdentifier) @@ -275,13 +288,13 @@ func (ns *Service) RemovePendingNotification(identifier string) error { } // RemoveAllDeliveredNotifications removes all delivered notifications. -func (ns *Service) RemoveAllDeliveredNotifications() error { +func (dn *darwinNotifier) RemoveAllDeliveredNotifications() error { C.removeAllDeliveredNotifications() return nil } // RemoveDeliveredNotification removes a delivered notification matching the unique identifier. -func (ns *Service) RemoveDeliveredNotification(identifier string) error { +func (dn *darwinNotifier) RemoveDeliveredNotification(identifier string) error { cIdentifier := C.CString(identifier) defer C.free(unsafe.Pointer(cIdentifier)) C.removeDeliveredNotification(cIdentifier) @@ -295,13 +308,23 @@ func (ns *Service) RemoveDeliveredNotification(identifier string) error { // RemoveAllDeliveredNotifications // RemoveDeliveredNotification // (Linux-specific) -func (ns *Service) RemoveNotification(identifier string) error { +func (dn *darwinNotifier) RemoveNotification(identifier string) error { return nil } //export captureResult func captureResult(channelID C.int, success C.bool, errorMsg *C.char) { - resultCh, exists := getChannel(int(channelID)) + ns := getNotificationService() + if ns != nil { + return + } + + dn, ok := ns.impl.(*darwinNotifier) + if !ok { + return + } + + resultCh, exists := dn.getChannel(int(channelID)) if !exists { return } @@ -361,36 +384,38 @@ func didReceiveNotificationResponse(jsonPayload *C.char, err *C.char) { } } -func registerChannel() (int, chan notificationChannel) { - notificationChannelsLock.Lock() - defer notificationChannelsLock.Unlock() +// Helper methods - id := nextChannelID - nextChannelID++ +func (dn *darwinNotifier) registerChannel() (int, chan notificationChannel) { + dn.channelsLock.Lock() + defer dn.channelsLock.Unlock() + + id := dn.nextChannelID + dn.nextChannelID++ resultCh := make(chan notificationChannel, 1) - notificationChannels[id] = resultCh + dn.channels[id] = resultCh return id, resultCh } -func getChannel(id int) (chan notificationChannel, bool) { - notificationChannelsLock.Lock() - defer notificationChannelsLock.Unlock() +func (dn *darwinNotifier) getChannel(id int) (chan notificationChannel, bool) { + dn.channelsLock.Lock() + defer dn.channelsLock.Unlock() - ch, exists := notificationChannels[id] + ch, exists := dn.channels[id] if exists { - delete(notificationChannels, id) + delete(dn.channels, id) } return ch, exists } -func cleanupChannel(id int) { - notificationChannelsLock.Lock() - defer notificationChannelsLock.Unlock() +func (dn *darwinNotifier) cleanupChannel(id int) { + dn.channelsLock.Lock() + defer dn.channelsLock.Unlock() - if ch, exists := notificationChannels[id]; exists { - delete(notificationChannels, id) + if ch, exists := dn.channels[id]; exists { + delete(dn.channels, id) close(ch) } } diff --git a/v3/pkg/services/notifications/notifications_linux.go b/v3/pkg/services/notifications/notifications_linux.go index 54b0d2a99..712b93868 100644 --- a/v3/pkg/services/notifications/notifications_linux.go +++ b/v3/pkg/services/notifications/notifications_linux.go @@ -16,6 +16,15 @@ import ( "github.com/wailsapp/wails/v3/pkg/application" ) +type linuxNotifier struct { + categories map[string]NotificationCategory + categoriesLock sync.RWMutex + appName string + internal *internalNotifier + notificationInitErr error + initOnce sync.Once +} + const ( dbusObjectPath = "/org/freedesktop/Notifications" dbusNotificationsInterface = "org.freedesktop.Notifications" @@ -31,32 +40,8 @@ const ( notifyChannelBufferSize = 25 ) -var ( - notificationLock sync.RWMutex - notificationCategories = make(map[string]NotificationCategory) - appName string - initOnce sync.Once -) - type closedReason uint32 -func (r closedReason) string() string { - switch r { - case 1: - return "expired" - case 2: - return "dismissed-by-user" - case 3: - return "closed-by-call" - case 4: - return "unknown" - case 5: - return "activated-by-user" - default: - return "other" - } -} - // internalNotifier handles the actual notification sending via dbus or command line type notificationContext struct { ID string @@ -77,34 +62,36 @@ type internalNotifier struct { listenerRunning bool } -var notifier *internalNotifier - // New creates a new Notifications Service func New() *Service { notificationServiceOnce.Do(func() { - if NotificationService == nil { - NotificationService = &Service{} + impl := &linuxNotifier{ + categories: make(map[string]NotificationCategory), + } + + NotificationService = &Service{ + impl: impl, } }) return NotificationService } -// ServiceStartup is called when the service is loaded -func (ns *Service) ServiceStartup(ctx context.Context, options application.ServiceOptions) error { - appName = application.Get().Config().Name +// Startup is called when the service is loaded +func (ls *linuxNotifier) Startup(ctx context.Context) error { + ls.appName = application.Get().Config().Name - if err := loadCategories(); err != nil { + if err := ls.loadCategories(); err != nil { fmt.Printf("Failed to load notification categories: %v\n", err) } - notifier = &internalNotifier{ + ls.internal = &internalNotifier{ activeNotifs: make(map[string]uint32), contexts: make(map[string]*notificationContext), } var err error - initOnce.Do(func() { - err = notifier.init() + ls.initOnce.Do(func() { + err = ls.internal.init() }) return err @@ -133,12 +120,12 @@ func (n *internalNotifier) shutdown() { n.sendPath = "" } -// ServiceShutdown is called when the service is unloaded -func (ns *Service) ServiceShutdown() error { - if notifier != nil { - notifier.shutdown() +// Shutdown is called when the service is unloaded +func (ls *linuxNotifier) Shutdown() error { + if ls.internal != nil { + ls.internal.shutdown() } - return saveCategories() + return ls.saveCategories() } // Initialize the notifier and choose the best available notification method @@ -395,25 +382,25 @@ func (n *internalNotifier) handleActionInvoked(systemID uint32, actionKey string // CheckBundleIdentifier is a Linux stub that always returns true. // (bundle identifiers are macOS-specific) -func (ns *Service) CheckBundleIdentifier() bool { +func (ls *linuxNotifier) CheckBundleIdentifier() bool { return true } // RequestNotificationAuthorization is a Linux stub that always returns true. // (user authorization is macOS-specific) -func (ns *Service) RequestNotificationAuthorization() (bool, error) { +func (ls *linuxNotifier) RequestNotificationAuthorization() (bool, error) { return true, nil } // CheckNotificationAuthorization is a Linux stub that always returns true. // (user authorization is macOS-specific) -func (ns *Service) CheckNotificationAuthorization() (bool, error) { +func (ls *linuxNotifier) CheckNotificationAuthorization() (bool, error) { return true, nil } // SendNotification sends a basic notification with a unique identifier, title, subtitle, and body. -func (ns *Service) SendNotification(options NotificationOptions) error { - if notifier == nil { +func (ls *linuxNotifier) SendNotification(options NotificationOptions) error { + if ls.internal == nil { return errors.New("notification service not initialized") } @@ -421,26 +408,26 @@ func (ns *Service) SendNotification(options NotificationOptions) error { return err } - notifier.Lock() - defer notifier.Unlock() + ls.internal.Lock() + defer ls.internal.Unlock() var ( systemID uint32 err error ) - switch notifier.method { + switch ls.internal.method { case MethodDbus: - systemID, err = notifier.sendViaDbus(options, nil) + systemID, err = ls.sendViaDbus(options, nil) case MethodNotifySend: - systemID, err = notifier.sendViaNotifySend(options) + systemID, err = ls.sendViaNotifySend(options) default: err = errors.New("no notification method is available") } if err == nil && systemID > 0 { // Store the system ID mapping - notifier.activeNotifs[options.ID] = systemID + ls.internal.activeNotifs[options.ID] = systemID // Create and store the notification context ctx := ¬ificationContext{ @@ -448,15 +435,15 @@ func (ns *Service) SendNotification(options NotificationOptions) error { SystemID: systemID, UserData: options.Data, } - notifier.contexts[options.ID] = ctx + ls.internal.contexts[options.ID] = ctx } return err } // SendNotificationWithActions sends a notification with additional actions. -func (ns *Service) SendNotificationWithActions(options NotificationOptions) error { - if notifier == nil { +func (ls *linuxNotifier) SendNotificationWithActions(options NotificationOptions) error { + if ls.internal == nil { return errors.New("notification service not initialized") } @@ -464,35 +451,35 @@ func (ns *Service) SendNotificationWithActions(options NotificationOptions) erro return err } - notificationLock.RLock() - category, exists := notificationCategories[options.CategoryID] - notificationLock.RUnlock() + ls.categoriesLock.RLock() + category, exists := ls.categories[options.CategoryID] + ls.categoriesLock.RUnlock() if !exists { - return ns.SendNotification(options) + return ls.SendNotification(options) } - notifier.Lock() - defer notifier.Unlock() + ls.internal.Lock() + defer ls.internal.Unlock() var ( systemID uint32 err error ) - switch notifier.method { + switch ls.internal.method { case MethodDbus: - systemID, err = notifier.sendViaDbus(options, &category) + systemID, err = ls.sendViaDbus(options, &category) case MethodNotifySend: // notify-send doesn't support actions, fall back to basic notification - systemID, err = notifier.sendViaNotifySend(options) + systemID, err = ls.sendViaNotifySend(options) default: err = errors.New("no notification method is available") } if err == nil && systemID > 0 { // Store the system ID mapping - notifier.activeNotifs[options.ID] = systemID + ls.internal.activeNotifs[options.ID] = systemID // Create and store the notification context with actions ctx := ¬ificationContext{ @@ -509,14 +496,14 @@ func (ns *Service) SendNotificationWithActions(options NotificationOptions) erro } } - notifier.contexts[options.ID] = ctx + ls.internal.contexts[options.ID] = ctx } return err } // sendViaDbus sends a notification via dbus -func (n *internalNotifier) sendViaDbus(options NotificationOptions, category *NotificationCategory) (result uint32, err error) { +func (ls *linuxNotifier) sendViaDbus(options NotificationOptions, category *NotificationCategory) (result uint32, err error) { // Prepare actions var actions []string if category != nil { @@ -542,9 +529,9 @@ func (n *internalNotifier) sendViaDbus(options NotificationOptions, category *No } // Send the notification - obj := n.dbusConn.Object(dbusNotificationsInterface, dbusObjectPath) + obj := ls.internal.dbusConn.Object(dbusNotificationsInterface, dbusObjectPath) dbusArgs := []interface{}{ - appName, // App name + ls.appName, // App name uint32(0), // Replaces ID (0 means new notification) "", // App icon (empty for now) options.Title, // Title @@ -568,7 +555,7 @@ func (n *internalNotifier) sendViaDbus(options NotificationOptions, category *No } // sendViaNotifySend sends a notification via notify-send command -func (n *internalNotifier) sendViaNotifySend(options NotificationOptions) (uint32, error) { +func (ls *linuxNotifier) sendViaNotifySend(options NotificationOptions) (uint32, error) { args := []string{ options.Title, options.Body, @@ -581,7 +568,7 @@ func (n *internalNotifier) sendViaNotifySend(options NotificationOptions) (uint3 args = append(args, "--urgency=normal") // Execute the command - cmd := exec.Command(n.sendPath, args...) + cmd := exec.Command(ls.internal.sendPath, args...) err := cmd.Run() if err != nil { return 0, fmt.Errorf("notify-send error: %v", err) @@ -592,77 +579,77 @@ func (n *internalNotifier) sendViaNotifySend(options NotificationOptions) (uint3 } // RegisterNotificationCategory registers a new NotificationCategory to be used with SendNotificationWithActions. -func (ns *Service) RegisterNotificationCategory(category NotificationCategory) error { - notificationLock.Lock() - notificationCategories[category.ID] = category - notificationLock.Unlock() +func (ls *linuxNotifier) RegisterNotificationCategory(category NotificationCategory) error { + ls.categoriesLock.Lock() + ls.categories[category.ID] = category + ls.categoriesLock.Unlock() - return saveCategories() + return ls.saveCategories() } // RemoveNotificationCategory removes a previously registered NotificationCategory. -func (ns *Service) RemoveNotificationCategory(categoryId string) error { - notificationLock.Lock() - delete(notificationCategories, categoryId) - notificationLock.Unlock() +func (ls *linuxNotifier) RemoveNotificationCategory(categoryId string) error { + ls.categoriesLock.Lock() + delete(ls.categories, categoryId) + ls.categoriesLock.Unlock() - return saveCategories() + return ls.saveCategories() } // RemoveAllPendingNotifications is a Linux stub that always returns nil. // (macOS-specific) -func (ns *Service) RemoveAllPendingNotifications() error { +func (ls *linuxNotifier) RemoveAllPendingNotifications() error { return nil } // RemovePendingNotification is a Linux stub that always returns nil. // (macOS-specific) -func (ns *Service) RemovePendingNotification(_ string) error { +func (ls *linuxNotifier) RemovePendingNotification(_ string) error { return nil } // RemoveAllDeliveredNotifications is a Linux stub that always returns nil. // (macOS-specific) -func (ns *Service) RemoveAllDeliveredNotifications() error { +func (ls *linuxNotifier) RemoveAllDeliveredNotifications() error { return nil } // RemoveDeliveredNotification is a Linux stub that always returns nil. // (macOS-specific) -func (ns *Service) RemoveDeliveredNotification(_ string) error { +func (ls *linuxNotifier) RemoveDeliveredNotification(_ string) error { return nil } // RemoveNotification removes a notification by ID (Linux-specific) -func (ns *Service) RemoveNotification(identifier string) error { - if notifier == nil || notifier.method != MethodDbus || notifier.dbusConn == nil { +func (ls *linuxNotifier) RemoveNotification(identifier string) error { + if ls.internal == nil || ls.internal.method != MethodDbus || ls.internal.dbusConn == nil { return errors.New("dbus not available for closing notifications") } // Get the system ID for this notification - notifier.Lock() - systemID, exists := notifier.activeNotifs[identifier] - notifier.Unlock() + ls.internal.Lock() + systemID, exists := ls.internal.activeNotifs[identifier] + ls.internal.Unlock() if !exists { return nil // Already closed or unknown } // Call CloseNotification on dbus - obj := notifier.dbusConn.Object(dbusNotificationsInterface, dbusObjectPath) + obj := ls.internal.dbusConn.Object(dbusNotificationsInterface, dbusObjectPath) call := obj.Call(callCloseNotification, 0, systemID) return call.Err } // getConfigFilePath returns the path to the configuration file for storing notification categories -func getConfigFilePath() (string, error) { +func (ls *linuxNotifier) getConfigFilePath() (string, error) { configDir, err := os.UserConfigDir() if err != nil { return "", fmt.Errorf("failed to get user config directory: %v", err) } - appConfigDir := filepath.Join(configDir, appName) + appConfigDir := filepath.Join(configDir, ls.appName) if err := os.MkdirAll(appConfigDir, 0755); err != nil { return "", fmt.Errorf("failed to create config directory: %v", err) } @@ -671,15 +658,15 @@ func getConfigFilePath() (string, error) { } // saveCategories saves the notification categories to a file. -func saveCategories() error { - filePath, err := getConfigFilePath() +func (ls *linuxNotifier) saveCategories() error { + filePath, err := ls.getConfigFilePath() if err != nil { return err } - notificationLock.RLock() - data, err := json.Marshal(notificationCategories) - notificationLock.RUnlock() + ls.categoriesLock.RLock() + data, err := json.Marshal(ls.categories) + ls.categoriesLock.RUnlock() if err != nil { return fmt.Errorf("failed to marshal notification categories: %v", err) @@ -693,8 +680,8 @@ func saveCategories() error { } // loadCategories loads notification categories from a file. -func loadCategories() error { - filePath, err := getConfigFilePath() +func (ls *linuxNotifier) loadCategories() error { + filePath, err := ls.getConfigFilePath() if err != nil { return err } @@ -717,9 +704,26 @@ func loadCategories() error { return fmt.Errorf("failed to unmarshal notification categories: %v", err) } - notificationLock.Lock() - notificationCategories = categories - notificationLock.Unlock() + ls.categoriesLock.Lock() + ls.categories = categories + ls.categoriesLock.Unlock() return nil } + +func (r closedReason) string() string { + switch r { + case 1: + return "expired" + case 2: + return "dismissed-by-user" + case 3: + return "closed-by-call" + case 4: + return "unknown" + case 5: + return "activated-by-user" + default: + return "other" + } +} diff --git a/v3/pkg/services/notifications/notifications_windows.go b/v3/pkg/services/notifications/notifications_windows.go index 020637f87..ea3dc449e 100644 --- a/v3/pkg/services/notifications/notifications_windows.go +++ b/v3/pkg/services/notifications/notifications_windows.go @@ -19,13 +19,13 @@ import ( "golang.org/x/sys/windows/registry" ) -var ( - NotificationCategories = make(map[string]NotificationCategory) - notificationCategoriesLock sync.RWMutex - appName string - appGUID string - iconPath string -) +type windowsNotifier struct { + categories map[string]NotificationCategory + categoriesLock sync.RWMutex + appName string + appGUID string + iconPath string +} const ( ToastRegistryPath = `Software\Classes\AppUserModelId\` @@ -43,31 +43,35 @@ type NotificationPayload struct { // Creates a new Notifications Service. func New() *Service { notificationServiceOnce.Do(func() { - if NotificationService == nil { - NotificationService = &Service{} + impl := &windowsNotifier{ + categories: make(map[string]NotificationCategory), + } + + NotificationService = &Service{ + impl: impl, } }) return NotificationService } -// ServiceStartup is called when the service is loaded +// Startup is called when the service is loaded // Sets an activation callback to emit an event when notifications are interacted with. -func (ns *Service) ServiceStartup(ctx context.Context, options application.ServiceOptions) error { - appName = application.Get().Config().Name +func (wn *windowsNotifier) Startup(ctx context.Context) error { + wn.appName = application.Get().Config().Name - guid, err := getGUID() + guid, err := wn.getGUID() if err != nil { return err } - appGUID = guid + wn.appGUID = guid - iconPath = filepath.Join(os.TempDir(), appName+appGUID+".png") + wn.iconPath = filepath.Join(os.TempDir(), wn.appName+wn.appGUID+".png") toast.SetAppData(toast.AppData{ - AppID: appName, + AppID: wn.appName, GUID: guid, - IconPath: iconPath, + IconPath: wn.iconPath, }) toast.SetActivationCallback(func(args string, data []toast.UserData) { @@ -89,7 +93,7 @@ func (ns *Service) ServiceStartup(ctx context.Context, options application.Servi response.UserInfo = userInfoMap } - if userText, found := getUserText(data); found { + if userText, found := wn.getUserText(data); found { response.UserText = userText } @@ -99,40 +103,34 @@ func (ns *Service) ServiceStartup(ctx context.Context, options application.Servi } }) - return loadCategoriesFromRegistry() + return wn.loadCategoriesFromRegistry() } -// ServiceShutdown is called when the service is unloaded -func (ns *Service) ServiceShutdown() error { - return saveCategoriesToRegistry() -} - -// CheckBundleIdentifier is a Windows stub that always returns true. -// (bundle identifiers are macOS-specific) -func CheckBundleIdentifier() bool { - return true +// Shutdown will attempt to save the categories to the registry when the service unloads +func (wn *windowsNotifier) Shutdown() error { + return wn.saveCategoriesToRegistry() } // RequestNotificationAuthorization is a Windows stub that always returns true, nil. // (user authorization is macOS-specific) -func (ns *Service) RequestNotificationAuthorization() (bool, error) { +func (wn *windowsNotifier) RequestNotificationAuthorization() (bool, error) { return true, nil } // CheckNotificationAuthorization is a Windows stub that always returns true. // (user authorization is macOS-specific) -func (ns *Service) CheckNotificationAuthorization() bool { - return true +func (wn *windowsNotifier) CheckNotificationAuthorization() (bool, error) { + return true, nil } // SendNotification sends a basic notification with a name, title, and body. All other options are ignored on Windows. -// (subtitle and category id are only available on macOS) -func (ns *Service) SendNotification(options NotificationOptions) error { +// (subtitle is only available on macOS) +func (wn *windowsNotifier) SendNotification(options NotificationOptions) error { if err := validateNotificationOptions(options); err != nil { return err } - if err := saveIconToDir(); err != nil { + if err := wn.saveIconToDir(); err != nil { fmt.Printf("Error saving icon: %v\n", err) } @@ -143,7 +141,7 @@ func (ns *Service) SendNotification(options NotificationOptions) error { } if options.Data != nil { - encodedPayload, err := encodePayload(DefaultActionIdentifier, options.Data) + encodedPayload, err := wn.encodePayload(DefaultActionIdentifier, options.Data) if err != nil { return fmt.Errorf("failed to encode notification data: %w", err) } @@ -156,19 +154,19 @@ func (ns *Service) SendNotification(options NotificationOptions) error { // SendNotificationWithActions sends a notification with additional actions and inputs. // A NotificationCategory must be registered with RegisterNotificationCategory first. The `CategoryID` must match the registered category. // If a NotificationCategory is not registered a basic notification will be sent. -// (subtitle and category id are only available on macOS) -func (ns *Service) SendNotificationWithActions(options NotificationOptions) error { +// (subtitle is only available on macOS) +func (wn *windowsNotifier) SendNotificationWithActions(options NotificationOptions) error { if err := validateNotificationOptions(options); err != nil { return err } - if err := saveIconToDir(); err != nil { + if err := wn.saveIconToDir(); err != nil { fmt.Printf("Error saving icon: %v\n", err) } - notificationCategoriesLock.RLock() - nCategory := NotificationCategories[options.CategoryID] - notificationCategoriesLock.RUnlock() + wn.categoriesLock.RLock() + nCategory := wn.categories[options.CategoryID] + wn.categoriesLock.RUnlock() n := toast.Notification{ Title: options.Title, @@ -197,14 +195,14 @@ func (ns *Service) SendNotificationWithActions(options NotificationOptions) erro } if options.Data != nil { - encodedPayload, err := encodePayload(n.ActivationArguments, options.Data) + encodedPayload, err := wn.encodePayload(n.ActivationArguments, options.Data) if err != nil { return fmt.Errorf("failed to encode notification data: %w", err) } n.ActivationArguments = encodedPayload for index := range n.Actions { - encodedPayload, err := encodePayload(n.Actions[index].Arguments, options.Data) + encodedPayload, err := wn.encodePayload(n.Actions[index].Arguments, options.Data) if err != nil { return fmt.Errorf("failed to encode notification data: %w", err) } @@ -217,61 +215,63 @@ func (ns *Service) SendNotificationWithActions(options NotificationOptions) erro // RegisterNotificationCategory registers a new NotificationCategory to be used with SendNotificationWithActions. // Registering a category with the same name as a previously registered NotificationCategory will override it. -func (ns *Service) RegisterNotificationCategory(category NotificationCategory) error { - notificationCategoriesLock.Lock() - NotificationCategories[category.ID] = NotificationCategory{ +func (wn *windowsNotifier) RegisterNotificationCategory(category NotificationCategory) error { + wn.categoriesLock.Lock() + defer wn.categoriesLock.Unlock() + + wn.categories[category.ID] = NotificationCategory{ ID: category.ID, Actions: category.Actions, HasReplyField: bool(category.HasReplyField), ReplyPlaceholder: category.ReplyPlaceholder, ReplyButtonTitle: category.ReplyButtonTitle, } - notificationCategoriesLock.Unlock() - return saveCategoriesToRegistry() + return wn.saveCategoriesToRegistry() } // RemoveNotificationCategory removes a previously registered NotificationCategory. -func (ns *Service) RemoveNotificationCategory(categoryId string) error { - notificationCategoriesLock.Lock() - delete(NotificationCategories, categoryId) - notificationCategoriesLock.Unlock() +func (wn *windowsNotifier) RemoveNotificationCategory(categoryId string) error { + wn.categoriesLock.Lock() + defer wn.categoriesLock.Unlock() - return saveCategoriesToRegistry() + delete(wn.categories, categoryId) + + return wn.saveCategoriesToRegistry() } // RemoveAllPendingNotifications is a Windows stub that always returns nil. // (macOS-specific) -func (ns *Service) RemoveAllPendingNotifications() error { +func (wn *windowsNotifier) RemoveAllPendingNotifications() error { return nil } // RemovePendingNotification is a Windows stub that always returns nil. // (macOS-specific) -func (ns *Service) RemovePendingNotification(_ string) error { +func (wn *windowsNotifier) RemovePendingNotification(_ string) error { return nil } // RemoveAllDeliveredNotifications is a Windows stub that always returns nil. // (macOS-specific) -func (ns *Service) RemoveAllDeliveredNotifications() error { +func (wn *windowsNotifier) RemoveAllDeliveredNotifications() error { return nil } // RemoveDeliveredNotification is a Windows stub that always returns nil. // (macOS-specific) -func (ns *Service) RemoveDeliveredNotification(_ string) error { +func (wn *windowsNotifier) RemoveDeliveredNotification(_ string) error { return nil } // RemoveNotification is a Windows stub that always returns nil. // (Linux-specific) -func (ns *Service) RemoveNotification(identifier string) error { +func (wn *windowsNotifier) RemoveNotification(identifier string) error { return nil } // encodePayload combines an action ID and user data into a single encoded string -func encodePayload(actionID string, data map[string]interface{}) (string, error) { +func (wn *windowsNotifier) encodePayload(actionID string, data map[string]interface{}) (string, error) { payload := NotificationPayload{ Action: actionID, Data: data, @@ -315,20 +315,20 @@ func parseNotificationResponse(response string) (action string, data string) { return actionID, "" } -func saveIconToDir() error { +func (wn *windowsNotifier) saveIconToDir() error { icon, err := application.NewIconFromResource(w32.GetModuleHandle(""), uint16(3)) if err != nil { return fmt.Errorf("failed to retrieve application icon: %w", err) } - return saveHIconAsPNG(icon, iconPath) + return saveHIconAsPNG(icon, wn.iconPath) } -func saveCategoriesToRegistry() error { - notificationCategoriesLock.Lock() - defer notificationCategoriesLock.Unlock() +func (wn *windowsNotifier) saveCategoriesToRegistry() error { + wn.categoriesLock.Lock() + defer wn.categoriesLock.Unlock() - registryPath := fmt.Sprintf(NotificationCategoriesRegistryPath, appName) + registryPath := fmt.Sprintf(NotificationCategoriesRegistryPath, wn.appName) key, _, err := registry.CreateKey( registry.CURRENT_USER, @@ -340,7 +340,7 @@ func saveCategoriesToRegistry() error { } defer key.Close() - data, err := json.Marshal(NotificationCategories) + data, err := json.Marshal(wn.categories) if err != nil { return err } @@ -348,11 +348,11 @@ func saveCategoriesToRegistry() error { return key.SetStringValue(NotificationCategoriesRegistryKey, string(data)) } -func loadCategoriesFromRegistry() error { - notificationCategoriesLock.Lock() - defer notificationCategoriesLock.Unlock() +func (wn *windowsNotifier) loadCategoriesFromRegistry() error { + wn.categoriesLock.Lock() + defer wn.categoriesLock.Unlock() - registryPath := fmt.Sprintf(NotificationCategoriesRegistryPath, appName) + registryPath := fmt.Sprintf(NotificationCategoriesRegistryPath, wn.appName) key, err := registry.OpenKey( registry.CURRENT_USER, @@ -382,12 +382,12 @@ func loadCategoriesFromRegistry() error { return fmt.Errorf("failed to parse notification categories from registry: %w", err) } - NotificationCategories = categories + wn.categories = categories return nil } -func getUserText(data []toast.UserData) (string, bool) { +func (wn *windowsNotifier) getUserText(data []toast.UserData) (string, bool) { for _, d := range data { if d.Key == "userText" { return d.Value, true @@ -396,8 +396,8 @@ func getUserText(data []toast.UserData) (string, bool) { return "", false } -func getGUID() (string, error) { - keyPath := ToastRegistryPath + appName +func (wn *windowsNotifier) getGUID() (string, error) { + keyPath := ToastRegistryPath + wn.appName k, err := registry.OpenKey(registry.CURRENT_USER, keyPath, registry.QUERY_VALUE) if err == nil { @@ -408,7 +408,7 @@ func getGUID() (string, error) { } } - guid := generateGUID() + guid := wn.generateGUID() k, _, err = registry.CreateKey(registry.CURRENT_USER, keyPath, registry.WRITE) if err != nil { @@ -423,7 +423,7 @@ func getGUID() (string, error) { return guid, nil } -func generateGUID() string { +func (wn *windowsNotifier) generateGUID() string { guid := uuid.New() return fmt.Sprintf("{%s}", guid.String()) } From 94f245f035e14986f28aa5c464767b8cdbf01487 Mon Sep 17 00:00:00 2001 From: popaprozac Date: Thu, 20 Mar 2025 13:49:49 -0700 Subject: [PATCH 186/374] bug fix --- v3/pkg/services/notifications/notifications_darwin.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v3/pkg/services/notifications/notifications_darwin.go b/v3/pkg/services/notifications/notifications_darwin.go index 0be1fd10c..8ebbff35d 100644 --- a/v3/pkg/services/notifications/notifications_darwin.go +++ b/v3/pkg/services/notifications/notifications_darwin.go @@ -315,7 +315,7 @@ func (dn *darwinNotifier) RemoveNotification(identifier string) error { //export captureResult func captureResult(channelID C.int, success C.bool, errorMsg *C.char) { ns := getNotificationService() - if ns != nil { + if ns == nil { return } From e55bf8dffce083e1b96b5a64e164e8865298788c Mon Sep 17 00:00:00 2001 From: popaprozac Date: Thu, 20 Mar 2025 13:56:47 -0700 Subject: [PATCH 187/374] linux bug fix --- .../notifications/notifications_linux.go | 124 +++++++++--------- 1 file changed, 62 insertions(+), 62 deletions(-) diff --git a/v3/pkg/services/notifications/notifications_linux.go b/v3/pkg/services/notifications/notifications_linux.go index 712b93868..0b6cdafdb 100644 --- a/v3/pkg/services/notifications/notifications_linux.go +++ b/v3/pkg/services/notifications/notifications_linux.go @@ -91,59 +91,59 @@ func (ls *linuxNotifier) Startup(ctx context.Context) error { var err error ls.initOnce.Do(func() { - err = ls.internal.init() + err = ls.init() }) return err } -func (n *internalNotifier) shutdown() { - n.Lock() - defer n.Unlock() +func (ls *linuxNotifier) shutdown() { + ls.internal.Lock() + defer ls.internal.Unlock() // Cancel the listener context if it's running - if n.listenerCancel != nil { - n.listenerCancel() - n.listenerCancel = nil + if ls.internal.listenerCancel != nil { + ls.internal.listenerCancel() + ls.internal.listenerCancel = nil } // Close the connection - if n.dbusConn != nil { - n.dbusConn.Close() - n.dbusConn = nil + if ls.internal.dbusConn != nil { + ls.internal.dbusConn.Close() + ls.internal.dbusConn = nil } // Clear state - n.activeNotifs = make(map[string]uint32) - n.contexts = make(map[string]*notificationContext) - n.method = "none" - n.sendPath = "" + ls.internal.activeNotifs = make(map[string]uint32) + ls.internal.contexts = make(map[string]*notificationContext) + ls.internal.method = "none" + ls.internal.sendPath = "" } // Shutdown is called when the service is unloaded func (ls *linuxNotifier) Shutdown() error { if ls.internal != nil { - ls.internal.shutdown() + ls.shutdown() } return ls.saveCategories() } // Initialize the notifier and choose the best available notification method -func (n *internalNotifier) init() error { +func (ls *linuxNotifier) init() error { var err error // Cancel any existing listener before starting a new one - if n.listenerCancel != nil { - n.listenerCancel() + if ls.internal.listenerCancel != nil { + ls.internal.listenerCancel() } // Create a new context for the listener - n.listenerCtx, n.listenerCancel = context.WithCancel(context.Background()) + ls.internal.listenerCtx, ls.internal.listenerCancel = context.WithCancel(context.Background()) // Reset state - n.activeNotifs = make(map[string]uint32) - n.contexts = make(map[string]*notificationContext) - n.listenerRunning = false + ls.internal.activeNotifs = make(map[string]uint32) + ls.internal.contexts = make(map[string]*notificationContext) + ls.internal.listenerRunning = false checkDbus := func() (*dbus.Conn, error) { conn, err := dbus.SessionBusPrivate() @@ -184,53 +184,53 @@ func (n *internalNotifier) init() error { } // Try dbus first - n.dbusConn, err = checkDbus() + ls.internal.dbusConn, err = checkDbus() if err == nil { - n.method = MethodDbus + ls.internal.method = MethodDbus // Start the dbus signal listener with context - go n.startDBusListener(n.listenerCtx) - n.listenerRunning = true + go ls.startDBusListener(ls.internal.listenerCtx) + ls.internal.listenerRunning = true return nil } - if n.dbusConn != nil { - n.dbusConn.Close() - n.dbusConn = nil + if ls.internal.dbusConn != nil { + ls.internal.dbusConn.Close() + ls.internal.dbusConn = nil } // Try notify-send send, err := exec.LookPath("notify-send") if err == nil { - n.sendPath = send - n.method = MethodNotifySend + ls.internal.sendPath = send + ls.internal.method = MethodNotifySend return nil } // Try sw-notify-send send, err = exec.LookPath("sw-notify-send") if err == nil { - n.sendPath = send - n.method = MethodNotifySend + ls.internal.sendPath = send + ls.internal.method = MethodNotifySend return nil } // No method available - n.method = "none" - n.sendPath = "" + ls.internal.method = "none" + ls.internal.sendPath = "" return errors.New("no notification method is available") } // startDBusListener listens for DBus signals for notification actions and closures -func (n *internalNotifier) startDBusListener(ctx context.Context) { +func (ls *linuxNotifier) startDBusListener(ctx context.Context) { signal := make(chan *dbus.Signal, notifyChannelBufferSize) - n.dbusConn.Signal(signal) + ls.internal.dbusConn.Signal(signal) defer func() { - n.Lock() - n.listenerRunning = false - n.Unlock() - n.dbusConn.RemoveSignal(signal) // Remove signal handler - close(signal) // Clean up channel + ls.internal.Lock() + ls.internal.listenerRunning = false + ls.internal.Unlock() + ls.internal.dbusConn.RemoveSignal(signal) // Remove signal handler + close(signal) // Clean up channel }() for { @@ -253,34 +253,34 @@ func (n *internalNotifier) startDBusListener(ctx context.Context) { case signalNotificationClosed: systemID := s.Body[0].(uint32) reason := closedReason(s.Body[1].(uint32)).string() - n.handleNotificationClosed(systemID, reason) + ls.handleNotificationClosed(systemID, reason) case signalActionInvoked: systemID := s.Body[0].(uint32) actionKey := s.Body[1].(string) - n.handleActionInvoked(systemID, actionKey) + ls.handleActionInvoked(systemID, actionKey) } } } } // handleNotificationClosed processes notification closed signals -func (n *internalNotifier) handleNotificationClosed(systemID uint32, reason string) { +func (ls *linuxNotifier) handleNotificationClosed(systemID uint32, reason string) { // Find our notification ID for this system ID var notifID string var userData map[string]interface{} - n.Lock() - for id, sysID := range n.activeNotifs { + ls.internal.Lock() + for id, sysID := range ls.internal.activeNotifs { if sysID == systemID { notifID = id // Get the user data from context if available - if ctx, exists := n.contexts[id]; exists { + if ctx, exists := ls.internal.contexts[id]; exists { userData = ctx.UserData } break } } - n.Unlock() + ls.internal.Unlock() if notifID != "" { response := NotificationResponse{ @@ -305,28 +305,28 @@ func (n *internalNotifier) handleNotificationClosed(systemID uint32, reason stri } // Clean up the context - n.Lock() - delete(n.contexts, notifID) - delete(n.activeNotifs, notifID) - n.Unlock() + ls.internal.Lock() + delete(ls.internal.contexts, notifID) + delete(ls.internal.activeNotifs, notifID) + ls.internal.Unlock() } } // handleActionInvoked processes action invoked signals -func (n *internalNotifier) handleActionInvoked(systemID uint32, actionKey string) { +func (ls *linuxNotifier) handleActionInvoked(systemID uint32, actionKey string) { // Find our notification ID and context for this system ID var notifID string var ctx *notificationContext - n.Lock() - for id, sysID := range n.activeNotifs { + ls.internal.Lock() + for id, sysID := range ls.internal.activeNotifs { if sysID == systemID { notifID = id - ctx = n.contexts[id] + ctx = ls.internal.contexts[id] break } } - n.Unlock() + ls.internal.Unlock() if notifID != "" { if actionKey == "default" { @@ -373,10 +373,10 @@ func (n *internalNotifier) handleActionInvoked(systemID uint32, actionKey string } // Clean up the context - n.Lock() - delete(n.contexts, notifID) - delete(n.activeNotifs, notifID) - n.Unlock() + ls.internal.Lock() + delete(ls.internal.contexts, notifID) + delete(ls.internal.activeNotifs, notifID) + ls.internal.Unlock() } } From 9adeef2bdf28b886a4e0db7b98787183c952bfb9 Mon Sep 17 00:00:00 2001 From: popaprozac Date: Thu, 20 Mar 2025 16:21:37 -0700 Subject: [PATCH 188/374] fix linux and remove dup code --- .../notifications/notifications_darwin.go | 8 --- .../notifications/notifications_linux.go | 63 ++++++++++--------- .../notifications/notifications_windows.go | 8 --- 3 files changed, 32 insertions(+), 47 deletions(-) diff --git a/v3/pkg/services/notifications/notifications_darwin.go b/v3/pkg/services/notifications/notifications_darwin.go index 8ebbff35d..380460f43 100644 --- a/v3/pkg/services/notifications/notifications_darwin.go +++ b/v3/pkg/services/notifications/notifications_darwin.go @@ -107,10 +107,6 @@ func (dn *darwinNotifier) CheckNotificationAuthorization() (bool, error) { // SendNotification sends a basic notification with a unique identifier, title, subtitle, and body. func (dn *darwinNotifier) SendNotification(options NotificationOptions) error { - if err := validateNotificationOptions(options); err != nil { - return err - } - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() @@ -156,10 +152,6 @@ func (dn *darwinNotifier) SendNotification(options NotificationOptions) error { // A NotificationCategory must be registered with RegisterNotificationCategory first. The `CategoryID` must match the registered category. // If a NotificationCategory is not registered a basic notification will be sent. func (dn *darwinNotifier) SendNotificationWithActions(options NotificationOptions) error { - if err := validateNotificationOptions(options); err != nil { - return err - } - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() diff --git a/v3/pkg/services/notifications/notifications_linux.go b/v3/pkg/services/notifications/notifications_linux.go index 0b6cdafdb..ec5cc089c 100644 --- a/v3/pkg/services/notifications/notifications_linux.go +++ b/v3/pkg/services/notifications/notifications_linux.go @@ -84,6 +84,7 @@ func (ls *linuxNotifier) Startup(ctx context.Context) error { fmt.Printf("Failed to load notification categories: %v\n", err) } + // Initialize the internal notifier ls.internal = &internalNotifier{ activeNotifs: make(map[string]uint32), contexts: make(map[string]*notificationContext), @@ -91,45 +92,43 @@ func (ls *linuxNotifier) Startup(ctx context.Context) error { var err error ls.initOnce.Do(func() { - err = ls.init() + // Initialize notification system + err = ls.initNotificationSystem() }) return err } -func (ls *linuxNotifier) shutdown() { - ls.internal.Lock() - defer ls.internal.Unlock() - - // Cancel the listener context if it's running - if ls.internal.listenerCancel != nil { - ls.internal.listenerCancel() - ls.internal.listenerCancel = nil - } - - // Close the connection - if ls.internal.dbusConn != nil { - ls.internal.dbusConn.Close() - ls.internal.dbusConn = nil - } - - // Clear state - ls.internal.activeNotifs = make(map[string]uint32) - ls.internal.contexts = make(map[string]*notificationContext) - ls.internal.method = "none" - ls.internal.sendPath = "" -} - // Shutdown is called when the service is unloaded func (ls *linuxNotifier) Shutdown() error { if ls.internal != nil { - ls.shutdown() + ls.internal.Lock() + defer ls.internal.Unlock() + + // Cancel the listener context if it's running + if ls.internal.listenerCancel != nil { + ls.internal.listenerCancel() + ls.internal.listenerCancel = nil + } + + // Close the connection + if ls.internal.dbusConn != nil { + ls.internal.dbusConn.Close() + ls.internal.dbusConn = nil + } + + // Clear state + ls.internal.activeNotifs = make(map[string]uint32) + ls.internal.contexts = make(map[string]*notificationContext) + ls.internal.method = "none" + ls.internal.sendPath = "" } + return ls.saveCategories() } -// Initialize the notifier and choose the best available notification method -func (ls *linuxNotifier) init() error { +// initNotificationSystem initializes the notification system, choosing the best available method +func (ls *linuxNotifier) initNotificationSystem() error { var err error // Cancel any existing listener before starting a new one @@ -404,8 +403,9 @@ func (ls *linuxNotifier) SendNotification(options NotificationOptions) error { return errors.New("notification service not initialized") } - if err := validateNotificationOptions(options); err != nil { - return err + if ls.internal.method == "" || (ls.internal.method == MethodDbus && ls.internal.dbusConn == nil) || + (ls.internal.method == MethodNotifySend && ls.internal.sendPath == "") { + return errors.New("notification system not properly initialized") } ls.internal.Lock() @@ -447,8 +447,9 @@ func (ls *linuxNotifier) SendNotificationWithActions(options NotificationOptions return errors.New("notification service not initialized") } - if err := validateNotificationOptions(options); err != nil { - return err + if ls.internal.method == "" || (ls.internal.method == MethodDbus && ls.internal.dbusConn == nil) || + (ls.internal.method == MethodNotifySend && ls.internal.sendPath == "") { + return errors.New("notification system not properly initialized") } ls.categoriesLock.RLock() diff --git a/v3/pkg/services/notifications/notifications_windows.go b/v3/pkg/services/notifications/notifications_windows.go index ea3dc449e..064a6343f 100644 --- a/v3/pkg/services/notifications/notifications_windows.go +++ b/v3/pkg/services/notifications/notifications_windows.go @@ -126,10 +126,6 @@ func (wn *windowsNotifier) CheckNotificationAuthorization() (bool, error) { // SendNotification sends a basic notification with a name, title, and body. All other options are ignored on Windows. // (subtitle is only available on macOS) func (wn *windowsNotifier) SendNotification(options NotificationOptions) error { - if err := validateNotificationOptions(options); err != nil { - return err - } - if err := wn.saveIconToDir(); err != nil { fmt.Printf("Error saving icon: %v\n", err) } @@ -156,10 +152,6 @@ func (wn *windowsNotifier) SendNotification(options NotificationOptions) error { // If a NotificationCategory is not registered a basic notification will be sent. // (subtitle is only available on macOS) func (wn *windowsNotifier) SendNotificationWithActions(options NotificationOptions) error { - if err := validateNotificationOptions(options); err != nil { - return err - } - if err := wn.saveIconToDir(); err != nil { fmt.Printf("Error saving icon: %v\n", err) } From 5dc7bd97f26ffa8318c006819b87d9c98c806583 Mon Sep 17 00:00:00 2001 From: popaprozac Date: Thu, 20 Mar 2025 16:32:53 -0700 Subject: [PATCH 189/374] refactor/simplify linux --- .../notifications/notifications_linux.go | 511 +++++++++--------- 1 file changed, 255 insertions(+), 256 deletions(-) diff --git a/v3/pkg/services/notifications/notifications_linux.go b/v3/pkg/services/notifications/notifications_linux.go index ec5cc089c..cff22b336 100644 --- a/v3/pkg/services/notifications/notifications_linux.go +++ b/v3/pkg/services/notifications/notifications_linux.go @@ -17,12 +17,36 @@ import ( ) type linuxNotifier struct { - categories map[string]NotificationCategory - categoriesLock sync.RWMutex - appName string - internal *internalNotifier - notificationInitErr error - initOnce sync.Once + // Categories + categories map[string]NotificationCategory + categoriesLock sync.RWMutex + + // App info + appName string + + // Notification system + sync.Mutex + method string + dbusConn *dbus.Conn + sendPath string + activeNotifs map[string]uint32 // Maps our notification IDs to system IDs + contexts map[string]*notificationContext // Stores notification contexts by our ID + + // Listener management + listenerCtx context.Context + listenerCancel context.CancelFunc + listenerRunning bool + + // Initialization + initOnce sync.Once + initialized bool +} + +type notificationContext struct { + ID string + SystemID uint32 + Actions map[string]string // Maps action keys to display labels + UserData map[string]interface{} // The original user data } const ( @@ -35,38 +59,19 @@ const ( MethodNotifySend = "notify-send" MethodDbus = "dbus" - MethodKdialog = "kdialog" notifyChannelBufferSize = 25 ) type closedReason uint32 -// internalNotifier handles the actual notification sending via dbus or command line -type notificationContext struct { - ID string - SystemID uint32 - Actions map[string]string // Maps action keys to display labels - UserData map[string]interface{} // The original user data -} - -type internalNotifier struct { - sync.Mutex - method string - dbusConn *dbus.Conn - sendPath string - activeNotifs map[string]uint32 // Maps our notification IDs to system IDs - contexts map[string]*notificationContext // Stores notification contexts by our ID - listenerCtx context.Context - listenerCancel context.CancelFunc - listenerRunning bool -} - // New creates a new Notifications Service func New() *Service { notificationServiceOnce.Do(func() { impl := &linuxNotifier{ - categories: make(map[string]NotificationCategory), + categories: make(map[string]NotificationCategory), + activeNotifs: make(map[string]uint32), + contexts: make(map[string]*notificationContext), } NotificationService = &Service{ @@ -77,159 +82,167 @@ func New() *Service { } // Startup is called when the service is loaded -func (ls *linuxNotifier) Startup(ctx context.Context) error { - ls.appName = application.Get().Config().Name +func (ln *linuxNotifier) Startup(ctx context.Context) error { + ln.appName = application.Get().Config().Name - if err := ls.loadCategories(); err != nil { + if err := ln.loadCategories(); err != nil { fmt.Printf("Failed to load notification categories: %v\n", err) } - // Initialize the internal notifier - ls.internal = &internalNotifier{ - activeNotifs: make(map[string]uint32), - contexts: make(map[string]*notificationContext), - } - var err error - ls.initOnce.Do(func() { - // Initialize notification system - err = ls.initNotificationSystem() + ln.initOnce.Do(func() { + err = ln.initNotificationSystem() + ln.initialized = err == nil }) return err } -// Shutdown is called when the service is unloaded -func (ls *linuxNotifier) Shutdown() error { - if ls.internal != nil { - ls.internal.Lock() - defer ls.internal.Unlock() +// initNotificationSystem initializes the notification system +func (ln *linuxNotifier) initNotificationSystem() error { + ln.Lock() + defer ln.Unlock() - // Cancel the listener context if it's running - if ls.internal.listenerCancel != nil { - ls.internal.listenerCancel() - ls.internal.listenerCancel = nil - } - - // Close the connection - if ls.internal.dbusConn != nil { - ls.internal.dbusConn.Close() - ls.internal.dbusConn = nil - } - - // Clear state - ls.internal.activeNotifs = make(map[string]uint32) - ls.internal.contexts = make(map[string]*notificationContext) - ls.internal.method = "none" - ls.internal.sendPath = "" - } - - return ls.saveCategories() -} - -// initNotificationSystem initializes the notification system, choosing the best available method -func (ls *linuxNotifier) initNotificationSystem() error { - var err error - - // Cancel any existing listener before starting a new one - if ls.internal.listenerCancel != nil { - ls.internal.listenerCancel() + // Cancel any existing listener + if ln.listenerCancel != nil { + ln.listenerCancel() + ln.listenerCancel = nil } // Create a new context for the listener - ls.internal.listenerCtx, ls.internal.listenerCancel = context.WithCancel(context.Background()) + ln.listenerCtx, ln.listenerCancel = context.WithCancel(context.Background()) // Reset state - ls.internal.activeNotifs = make(map[string]uint32) - ls.internal.contexts = make(map[string]*notificationContext) - ls.internal.listenerRunning = false - - checkDbus := func() (*dbus.Conn, error) { - conn, err := dbus.SessionBusPrivate() - if err != nil { - return conn, err - } - - if err = conn.Auth(nil); err != nil { - return conn, err - } - - if err = conn.Hello(); err != nil { - return conn, err - } - - obj := conn.Object(dbusNotificationsInterface, dbusObjectPath) - call := obj.Call(callGetCapabilities, 0) - if call.Err != nil { - return conn, call.Err - } - - var ret []string - err = call.Store(&ret) - if err != nil { - return conn, err - } - - // Add a listener for notification signals - err = conn.AddMatchSignal( - dbus.WithMatchObjectPath(dbusObjectPath), - dbus.WithMatchInterface(dbusNotificationsInterface), - ) - if err != nil { - return nil, err - } - - return conn, nil - } + ln.activeNotifs = make(map[string]uint32) + ln.contexts = make(map[string]*notificationContext) + ln.listenerRunning = false // Try dbus first - ls.internal.dbusConn, err = checkDbus() + dbusConn, err := ln.initDBus() if err == nil { - ls.internal.method = MethodDbus - // Start the dbus signal listener with context - go ls.startDBusListener(ls.internal.listenerCtx) - ls.internal.listenerRunning = true - return nil - } - if ls.internal.dbusConn != nil { - ls.internal.dbusConn.Close() - ls.internal.dbusConn = nil - } + ln.dbusConn = dbusConn + ln.method = MethodDbus - // Try notify-send - send, err := exec.LookPath("notify-send") - if err == nil { - ls.internal.sendPath = send - ls.internal.method = MethodNotifySend + // Start the dbus signal listener + go ln.startDBusListener(ln.listenerCtx) + ln.listenerRunning = true return nil } - // Try sw-notify-send - send, err = exec.LookPath("sw-notify-send") + // Try notify-send as fallback + sendPath, err := ln.initNotifySend() if err == nil { - ls.internal.sendPath = send - ls.internal.method = MethodNotifySend + ln.sendPath = sendPath + ln.method = MethodNotifySend return nil } // No method available - ls.internal.method = "none" - ls.internal.sendPath = "" - + ln.method = "" + ln.sendPath = "" return errors.New("no notification method is available") } +// initDBus attempts to initialize D-Bus notifications +func (ln *linuxNotifier) initDBus() (*dbus.Conn, error) { + conn, err := dbus.SessionBusPrivate() + if err != nil { + return nil, err + } + + if err = conn.Auth(nil); err != nil { + conn.Close() + return nil, err + } + + if err = conn.Hello(); err != nil { + conn.Close() + return nil, err + } + + obj := conn.Object(dbusNotificationsInterface, dbusObjectPath) + call := obj.Call(callGetCapabilities, 0) + if call.Err != nil { + conn.Close() + return nil, call.Err + } + + var ret []string + err = call.Store(&ret) + if err != nil { + conn.Close() + return nil, err + } + + // Add a listener for notification signals + err = conn.AddMatchSignal( + dbus.WithMatchObjectPath(dbusObjectPath), + dbus.WithMatchInterface(dbusNotificationsInterface), + ) + if err != nil { + conn.Close() + return nil, err + } + + return conn, nil +} + +// initNotifySend attempts to find notify-send binary +func (ln *linuxNotifier) initNotifySend() (string, error) { + // Try standard notify-send + send, err := exec.LookPath("notify-send") + if err == nil { + return send, nil + } + + // Try sw-notify-send (in some distros) + send, err = exec.LookPath("sw-notify-send") + if err == nil { + return send, nil + } + + return "", errors.New("notify-send not found") +} + +// Shutdown is called when the service is unloaded +func (ln *linuxNotifier) Shutdown() error { + ln.Lock() + + // Cancel the listener context if it's running + if ln.listenerCancel != nil { + ln.listenerCancel() + ln.listenerCancel = nil + } + + // Close the connection + if ln.dbusConn != nil { + ln.dbusConn.Close() + ln.dbusConn = nil + } + + // Clear state + ln.activeNotifs = make(map[string]uint32) + ln.contexts = make(map[string]*notificationContext) + ln.method = "" + ln.sendPath = "" + ln.initialized = false + + ln.Unlock() + + return ln.saveCategories() +} + // startDBusListener listens for DBus signals for notification actions and closures -func (ls *linuxNotifier) startDBusListener(ctx context.Context) { +func (ln *linuxNotifier) startDBusListener(ctx context.Context) { signal := make(chan *dbus.Signal, notifyChannelBufferSize) - ls.internal.dbusConn.Signal(signal) + ln.dbusConn.Signal(signal) defer func() { - ls.internal.Lock() - ls.internal.listenerRunning = false - ls.internal.Unlock() - ls.internal.dbusConn.RemoveSignal(signal) // Remove signal handler - close(signal) // Clean up channel + ln.Lock() + ln.listenerRunning = false + ln.Unlock() + ln.dbusConn.RemoveSignal(signal) // Remove signal handler + close(signal) // Clean up channel }() for { @@ -252,34 +265,34 @@ func (ls *linuxNotifier) startDBusListener(ctx context.Context) { case signalNotificationClosed: systemID := s.Body[0].(uint32) reason := closedReason(s.Body[1].(uint32)).string() - ls.handleNotificationClosed(systemID, reason) + ln.handleNotificationClosed(systemID, reason) case signalActionInvoked: systemID := s.Body[0].(uint32) actionKey := s.Body[1].(string) - ls.handleActionInvoked(systemID, actionKey) + ln.handleActionInvoked(systemID, actionKey) } } } } // handleNotificationClosed processes notification closed signals -func (ls *linuxNotifier) handleNotificationClosed(systemID uint32, reason string) { +func (ln *linuxNotifier) handleNotificationClosed(systemID uint32, reason string) { // Find our notification ID for this system ID var notifID string var userData map[string]interface{} - ls.internal.Lock() - for id, sysID := range ls.internal.activeNotifs { + ln.Lock() + for id, sysID := range ln.activeNotifs { if sysID == systemID { notifID = id // Get the user data from context if available - if ctx, exists := ls.internal.contexts[id]; exists { + if ctx, exists := ln.contexts[id]; exists { userData = ctx.UserData } break } } - ls.internal.Unlock() + ln.Unlock() if notifID != "" { response := NotificationResponse{ @@ -304,28 +317,28 @@ func (ls *linuxNotifier) handleNotificationClosed(systemID uint32, reason string } // Clean up the context - ls.internal.Lock() - delete(ls.internal.contexts, notifID) - delete(ls.internal.activeNotifs, notifID) - ls.internal.Unlock() + ln.Lock() + delete(ln.contexts, notifID) + delete(ln.activeNotifs, notifID) + ln.Unlock() } } // handleActionInvoked processes action invoked signals -func (ls *linuxNotifier) handleActionInvoked(systemID uint32, actionKey string) { +func (ln *linuxNotifier) handleActionInvoked(systemID uint32, actionKey string) { // Find our notification ID and context for this system ID var notifID string var ctx *notificationContext - ls.internal.Lock() - for id, sysID := range ls.internal.activeNotifs { + ln.Lock() + for id, sysID := range ln.activeNotifs { if sysID == systemID { notifID = id - ctx = ls.internal.contexts[id] + ctx = ln.contexts[id] break } } - ls.internal.Unlock() + ln.Unlock() if notifID != "" { if actionKey == "default" { @@ -372,62 +385,58 @@ func (ls *linuxNotifier) handleActionInvoked(systemID uint32, actionKey string) } // Clean up the context - ls.internal.Lock() - delete(ls.internal.contexts, notifID) - delete(ls.internal.activeNotifs, notifID) - ls.internal.Unlock() + ln.Lock() + delete(ln.contexts, notifID) + delete(ln.activeNotifs, notifID) + ln.Unlock() } } // CheckBundleIdentifier is a Linux stub that always returns true. -// (bundle identifiers are macOS-specific) -func (ls *linuxNotifier) CheckBundleIdentifier() bool { +func (ln *linuxNotifier) CheckBundleIdentifier() bool { return true } // RequestNotificationAuthorization is a Linux stub that always returns true. -// (user authorization is macOS-specific) -func (ls *linuxNotifier) RequestNotificationAuthorization() (bool, error) { +func (ln *linuxNotifier) RequestNotificationAuthorization() (bool, error) { return true, nil } // CheckNotificationAuthorization is a Linux stub that always returns true. -// (user authorization is macOS-specific) -func (ls *linuxNotifier) CheckNotificationAuthorization() (bool, error) { +func (ln *linuxNotifier) CheckNotificationAuthorization() (bool, error) { return true, nil } // SendNotification sends a basic notification with a unique identifier, title, subtitle, and body. -func (ls *linuxNotifier) SendNotification(options NotificationOptions) error { - if ls.internal == nil { +func (ln *linuxNotifier) SendNotification(options NotificationOptions) error { + if !ln.initialized { return errors.New("notification service not initialized") } - if ls.internal.method == "" || (ls.internal.method == MethodDbus && ls.internal.dbusConn == nil) || - (ls.internal.method == MethodNotifySend && ls.internal.sendPath == "") { - return errors.New("notification system not properly initialized") + if err := validateNotificationOptions(options); err != nil { + return err } - ls.internal.Lock() - defer ls.internal.Unlock() + ln.Lock() + defer ln.Unlock() var ( systemID uint32 err error ) - switch ls.internal.method { + switch ln.method { case MethodDbus: - systemID, err = ls.sendViaDbus(options, nil) + systemID, err = ln.sendViaDbus(options, nil) case MethodNotifySend: - systemID, err = ls.sendViaNotifySend(options) + systemID, err = ln.sendViaNotifySend(options) default: err = errors.New("no notification method is available") } if err == nil && systemID > 0 { // Store the system ID mapping - ls.internal.activeNotifs[options.ID] = systemID + ln.activeNotifs[options.ID] = systemID // Create and store the notification context ctx := ¬ificationContext{ @@ -435,52 +444,51 @@ func (ls *linuxNotifier) SendNotification(options NotificationOptions) error { SystemID: systemID, UserData: options.Data, } - ls.internal.contexts[options.ID] = ctx + ln.contexts[options.ID] = ctx } return err } // SendNotificationWithActions sends a notification with additional actions. -func (ls *linuxNotifier) SendNotificationWithActions(options NotificationOptions) error { - if ls.internal == nil { +func (ln *linuxNotifier) SendNotificationWithActions(options NotificationOptions) error { + if !ln.initialized { return errors.New("notification service not initialized") } - if ls.internal.method == "" || (ls.internal.method == MethodDbus && ls.internal.dbusConn == nil) || - (ls.internal.method == MethodNotifySend && ls.internal.sendPath == "") { - return errors.New("notification system not properly initialized") + if err := validateNotificationOptions(options); err != nil { + return err } - ls.categoriesLock.RLock() - category, exists := ls.categories[options.CategoryID] - ls.categoriesLock.RUnlock() + ln.categoriesLock.RLock() + category, exists := ln.categories[options.CategoryID] + ln.categoriesLock.RUnlock() if !exists { - return ls.SendNotification(options) + return ln.SendNotification(options) } - ls.internal.Lock() - defer ls.internal.Unlock() + ln.Lock() + defer ln.Unlock() var ( systemID uint32 err error ) - switch ls.internal.method { + switch ln.method { case MethodDbus: - systemID, err = ls.sendViaDbus(options, &category) + systemID, err = ln.sendViaDbus(options, &category) case MethodNotifySend: // notify-send doesn't support actions, fall back to basic notification - systemID, err = ls.sendViaNotifySend(options) + systemID, err = ln.sendViaNotifySend(options) default: err = errors.New("no notification method is available") } if err == nil && systemID > 0 { // Store the system ID mapping - ls.internal.activeNotifs[options.ID] = systemID + ln.activeNotifs[options.ID] = systemID // Create and store the notification context with actions ctx := ¬ificationContext{ @@ -497,14 +505,14 @@ func (ls *linuxNotifier) SendNotificationWithActions(options NotificationOptions } } - ls.internal.contexts[options.ID] = ctx + ln.contexts[options.ID] = ctx } return err } // sendViaDbus sends a notification via dbus -func (ls *linuxNotifier) sendViaDbus(options NotificationOptions, category *NotificationCategory) (result uint32, err error) { +func (ln *linuxNotifier) sendViaDbus(options NotificationOptions, category *NotificationCategory) (result uint32, err error) { // Prepare actions var actions []string if category != nil { @@ -530,9 +538,9 @@ func (ls *linuxNotifier) sendViaDbus(options NotificationOptions, category *Noti } // Send the notification - obj := ls.internal.dbusConn.Object(dbusNotificationsInterface, dbusObjectPath) + obj := ln.dbusConn.Object(dbusNotificationsInterface, dbusObjectPath) dbusArgs := []interface{}{ - ls.appName, // App name + ln.appName, // App name uint32(0), // Replaces ID (0 means new notification) "", // App icon (empty for now) options.Title, // Title @@ -556,20 +564,15 @@ func (ls *linuxNotifier) sendViaDbus(options NotificationOptions, category *Noti } // sendViaNotifySend sends a notification via notify-send command -func (ls *linuxNotifier) sendViaNotifySend(options NotificationOptions) (uint32, error) { +func (ln *linuxNotifier) sendViaNotifySend(options NotificationOptions) (uint32, error) { args := []string{ options.Title, options.Body, + "--urgency=normal", } - // Add icon if eventually supported - // if options.Icon != "" { ... } - - // Add urgency (normal by default) - args = append(args, "--urgency=normal") - // Execute the command - cmd := exec.Command(ls.internal.sendPath, args...) + cmd := exec.Command(ln.sendPath, args...) err := cmd.Run() if err != nil { return 0, fmt.Errorf("notify-send error: %v", err) @@ -579,78 +582,74 @@ func (ls *linuxNotifier) sendViaNotifySend(options NotificationOptions) (uint32, return 0, nil } -// RegisterNotificationCategory registers a new NotificationCategory to be used with SendNotificationWithActions. -func (ls *linuxNotifier) RegisterNotificationCategory(category NotificationCategory) error { - ls.categoriesLock.Lock() - ls.categories[category.ID] = category - ls.categoriesLock.Unlock() +// RegisterNotificationCategory registers a new NotificationCategory +func (ln *linuxNotifier) RegisterNotificationCategory(category NotificationCategory) error { + ln.categoriesLock.Lock() + ln.categories[category.ID] = category + ln.categoriesLock.Unlock() - return ls.saveCategories() + return ln.saveCategories() } -// RemoveNotificationCategory removes a previously registered NotificationCategory. -func (ls *linuxNotifier) RemoveNotificationCategory(categoryId string) error { - ls.categoriesLock.Lock() - delete(ls.categories, categoryId) - ls.categoriesLock.Unlock() +// RemoveNotificationCategory removes a previously registered NotificationCategory +func (ln *linuxNotifier) RemoveNotificationCategory(categoryId string) error { + ln.categoriesLock.Lock() + delete(ln.categories, categoryId) + ln.categoriesLock.Unlock() - return ls.saveCategories() + return ln.saveCategories() } -// RemoveAllPendingNotifications is a Linux stub that always returns nil. -// (macOS-specific) -func (ls *linuxNotifier) RemoveAllPendingNotifications() error { +// RemoveAllPendingNotifications is a Linux stub that always returns nil +func (ln *linuxNotifier) RemoveAllPendingNotifications() error { return nil } -// RemovePendingNotification is a Linux stub that always returns nil. -// (macOS-specific) -func (ls *linuxNotifier) RemovePendingNotification(_ string) error { +// RemovePendingNotification is a Linux stub that always returns nil +func (ln *linuxNotifier) RemovePendingNotification(_ string) error { return nil } -// RemoveAllDeliveredNotifications is a Linux stub that always returns nil. -// (macOS-specific) -func (ls *linuxNotifier) RemoveAllDeliveredNotifications() error { +// RemoveAllDeliveredNotifications is a Linux stub that always returns nil +func (ln *linuxNotifier) RemoveAllDeliveredNotifications() error { return nil } -// RemoveDeliveredNotification is a Linux stub that always returns nil. -// (macOS-specific) -func (ls *linuxNotifier) RemoveDeliveredNotification(_ string) error { +// RemoveDeliveredNotification is a Linux stub that always returns nil +func (ln *linuxNotifier) RemoveDeliveredNotification(_ string) error { return nil } // RemoveNotification removes a notification by ID (Linux-specific) -func (ls *linuxNotifier) RemoveNotification(identifier string) error { - if ls.internal == nil || ls.internal.method != MethodDbus || ls.internal.dbusConn == nil { +func (ln *linuxNotifier) RemoveNotification(identifier string) error { + if !ln.initialized || ln.method != MethodDbus || ln.dbusConn == nil { return errors.New("dbus not available for closing notifications") } // Get the system ID for this notification - ls.internal.Lock() - systemID, exists := ls.internal.activeNotifs[identifier] - ls.internal.Unlock() + ln.Lock() + systemID, exists := ln.activeNotifs[identifier] + ln.Unlock() if !exists { return nil // Already closed or unknown } // Call CloseNotification on dbus - obj := ls.internal.dbusConn.Object(dbusNotificationsInterface, dbusObjectPath) + obj := ln.dbusConn.Object(dbusNotificationsInterface, dbusObjectPath) call := obj.Call(callCloseNotification, 0, systemID) return call.Err } -// getConfigFilePath returns the path to the configuration file for storing notification categories -func (ls *linuxNotifier) getConfigFilePath() (string, error) { +// getConfigFilePath returns the path to the configuration file +func (ln *linuxNotifier) getConfigFilePath() (string, error) { configDir, err := os.UserConfigDir() if err != nil { return "", fmt.Errorf("failed to get user config directory: %v", err) } - appConfigDir := filepath.Join(configDir, ls.appName) + appConfigDir := filepath.Join(configDir, ln.appName) if err := os.MkdirAll(appConfigDir, 0755); err != nil { return "", fmt.Errorf("failed to create config directory: %v", err) } @@ -658,16 +657,16 @@ func (ls *linuxNotifier) getConfigFilePath() (string, error) { return filepath.Join(appConfigDir, "notification-categories.json"), nil } -// saveCategories saves the notification categories to a file. -func (ls *linuxNotifier) saveCategories() error { - filePath, err := ls.getConfigFilePath() +// saveCategories saves the notification categories to a file +func (ln *linuxNotifier) saveCategories() error { + filePath, err := ln.getConfigFilePath() if err != nil { return err } - ls.categoriesLock.RLock() - data, err := json.Marshal(ls.categories) - ls.categoriesLock.RUnlock() + ln.categoriesLock.RLock() + data, err := json.Marshal(ln.categories) + ln.categoriesLock.RUnlock() if err != nil { return fmt.Errorf("failed to marshal notification categories: %v", err) @@ -680,9 +679,9 @@ func (ls *linuxNotifier) saveCategories() error { return nil } -// loadCategories loads notification categories from a file. -func (ls *linuxNotifier) loadCategories() error { - filePath, err := ls.getConfigFilePath() +// loadCategories loads notification categories from a file +func (ln *linuxNotifier) loadCategories() error { + filePath, err := ln.getConfigFilePath() if err != nil { return err } @@ -705,9 +704,9 @@ func (ls *linuxNotifier) loadCategories() error { return fmt.Errorf("failed to unmarshal notification categories: %v", err) } - ls.categoriesLock.Lock() - ls.categories = categories - ls.categoriesLock.Unlock() + ln.categoriesLock.Lock() + ln.categories = categories + ln.categoriesLock.Unlock() return nil } From be1da68dbcd007b327cc1cf2d2c79f433dd3ab7d Mon Sep 17 00:00:00 2001 From: popaprozac Date: Thu, 20 Mar 2025 22:12:21 -0700 Subject: [PATCH 190/374] avoid deadlock on win --- v3/pkg/services/notifications/notifications.go | 4 +++- v3/pkg/services/notifications/notifications_linux.go | 1 + v3/pkg/services/notifications/notifications_windows.go | 6 ++---- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/v3/pkg/services/notifications/notifications.go b/v3/pkg/services/notifications/notifications.go index bfa0b4489..1f50d6031 100644 --- a/v3/pkg/services/notifications/notifications.go +++ b/v3/pkg/services/notifications/notifications.go @@ -16,6 +16,8 @@ import ( "context" "fmt" "sync" + + "github.com/wailsapp/wails/v3/pkg/application" ) type notificationImpl interface { @@ -133,7 +135,7 @@ func (ns *Service) handleNotificationResult(result NotificationResult) { } // ServiceStartup is called when the service is loaded -func (ns *Service) ServiceStartup(ctx context.Context, options interface{}) error { +func (ns *Service) ServiceStartup(ctx context.Context, options application.ServiceOptions) error { return ns.impl.Startup(ctx) } diff --git a/v3/pkg/services/notifications/notifications_linux.go b/v3/pkg/services/notifications/notifications_linux.go index cff22b336..349756e21 100644 --- a/v3/pkg/services/notifications/notifications_linux.go +++ b/v3/pkg/services/notifications/notifications_linux.go @@ -78,6 +78,7 @@ func New() *Service { impl: impl, } }) + return NotificationService } diff --git a/v3/pkg/services/notifications/notifications_windows.go b/v3/pkg/services/notifications/notifications_windows.go index 064a6343f..ef4aacc85 100644 --- a/v3/pkg/services/notifications/notifications_windows.go +++ b/v3/pkg/services/notifications/notifications_windows.go @@ -209,8 +209,6 @@ func (wn *windowsNotifier) SendNotificationWithActions(options NotificationOptio // Registering a category with the same name as a previously registered NotificationCategory will override it. func (wn *windowsNotifier) RegisterNotificationCategory(category NotificationCategory) error { wn.categoriesLock.Lock() - defer wn.categoriesLock.Unlock() - wn.categories[category.ID] = NotificationCategory{ ID: category.ID, Actions: category.Actions, @@ -218,6 +216,7 @@ func (wn *windowsNotifier) RegisterNotificationCategory(category NotificationCat ReplyPlaceholder: category.ReplyPlaceholder, ReplyButtonTitle: category.ReplyButtonTitle, } + wn.categoriesLock.Unlock() return wn.saveCategoriesToRegistry() } @@ -225,9 +224,8 @@ func (wn *windowsNotifier) RegisterNotificationCategory(category NotificationCat // RemoveNotificationCategory removes a previously registered NotificationCategory. func (wn *windowsNotifier) RemoveNotificationCategory(categoryId string) error { wn.categoriesLock.Lock() - defer wn.categoriesLock.Unlock() - delete(wn.categories, categoryId) + wn.categoriesLock.Unlock() return wn.saveCategoriesToRegistry() } From ef3b7d2bc3bcef30752ddd40a4f17a5d1b965b6a Mon Sep 17 00:00:00 2001 From: popaprozac Date: Sat, 22 Mar 2025 11:51:02 -0700 Subject: [PATCH 191/374] pass service options --- v3/pkg/services/notifications/notifications.go | 8 ++++---- v3/pkg/services/notifications/notifications_darwin.go | 4 +++- v3/pkg/services/notifications/notifications_linux.go | 2 +- v3/pkg/services/notifications/notifications_windows.go | 2 +- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/v3/pkg/services/notifications/notifications.go b/v3/pkg/services/notifications/notifications.go index 1f50d6031..d7549fbf9 100644 --- a/v3/pkg/services/notifications/notifications.go +++ b/v3/pkg/services/notifications/notifications.go @@ -20,9 +20,9 @@ import ( "github.com/wailsapp/wails/v3/pkg/application" ) -type notificationImpl interface { +type platformNotifier interface { // Lifecycle methods - Startup(ctx context.Context) error + Startup(ctx context.Context, options application.ServiceOptions) error Shutdown() error // Core notification methods @@ -45,7 +45,7 @@ type notificationImpl interface { // Service represents the notifications service type Service struct { - impl notificationImpl + impl platformNotifier // notificationResponseCallback is called when a notification result is received. // Only one callback can be assigned at a time. @@ -136,7 +136,7 @@ func (ns *Service) handleNotificationResult(result NotificationResult) { // ServiceStartup is called when the service is loaded func (ns *Service) ServiceStartup(ctx context.Context, options application.ServiceOptions) error { - return ns.impl.Startup(ctx) + return ns.impl.Startup(ctx, options) } // ServiceShutdown is called when the service is unloaded diff --git a/v3/pkg/services/notifications/notifications_darwin.go b/v3/pkg/services/notifications/notifications_darwin.go index 380460f43..c97e80531 100644 --- a/v3/pkg/services/notifications/notifications_darwin.go +++ b/v3/pkg/services/notifications/notifications_darwin.go @@ -15,6 +15,8 @@ import ( "sync" "time" "unsafe" + + "github.com/wailsapp/wails/v3/pkg/application" ) type darwinNotifier struct { @@ -56,7 +58,7 @@ func New() *Service { return NotificationService } -func (dn *darwinNotifier) Startup(ctx context.Context) error { +func (dn *darwinNotifier) Startup(ctx context.Context, options application.ServiceOptions) error { return nil } diff --git a/v3/pkg/services/notifications/notifications_linux.go b/v3/pkg/services/notifications/notifications_linux.go index 349756e21..2050c84df 100644 --- a/v3/pkg/services/notifications/notifications_linux.go +++ b/v3/pkg/services/notifications/notifications_linux.go @@ -83,7 +83,7 @@ func New() *Service { } // Startup is called when the service is loaded -func (ln *linuxNotifier) Startup(ctx context.Context) error { +func (ln *linuxNotifier) Startup(ctx context.Context, options application.ServiceOptions) error { ln.appName = application.Get().Config().Name if err := ln.loadCategories(); err != nil { diff --git a/v3/pkg/services/notifications/notifications_windows.go b/v3/pkg/services/notifications/notifications_windows.go index ef4aacc85..6219665f6 100644 --- a/v3/pkg/services/notifications/notifications_windows.go +++ b/v3/pkg/services/notifications/notifications_windows.go @@ -57,7 +57,7 @@ func New() *Service { // Startup is called when the service is loaded // Sets an activation callback to emit an event when notifications are interacted with. -func (wn *windowsNotifier) Startup(ctx context.Context) error { +func (wn *windowsNotifier) Startup(ctx context.Context, options application.ServiceOptions) error { wn.appName = application.Get().Config().Name guid, err := wn.getGUID() From 81b40d2afeabb09bef0ea61e6f8471837e28eff5 Mon Sep 17 00:00:00 2001 From: popaprozac Date: Sat, 22 Mar 2025 12:16:47 -0700 Subject: [PATCH 192/374] ensure exactly one delegate created --- .../notifications/notifications_darwin.m | 43 ++++++++++++++++--- 1 file changed, 36 insertions(+), 7 deletions(-) diff --git a/v3/pkg/services/notifications/notifications_darwin.m b/v3/pkg/services/notifications/notifications_darwin.m index cd1c96898..01d85c1bc 100644 --- a/v3/pkg/services/notifications/notifications_darwin.m +++ b/v3/pkg/services/notifications/notifications_darwin.m @@ -63,13 +63,22 @@ didReceiveNotificationResponse:(UNNotificationResponse *)response @end static NotificationsDelegate *delegateInstance = nil; +static dispatch_once_t onceToken; -static void ensureDelegateInitialized(void) { - if (!delegateInstance) { +static BOOL ensureDelegateInitialized(void) { + __block BOOL success = YES; + + dispatch_once(&onceToken, ^{ delegateInstance = [[NotificationsDelegate alloc] init]; UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; center.delegate = delegateInstance; + }); + + if (!delegateInstance) { + success = NO; } + + return success; } bool checkBundleIdentifier(void) { @@ -81,7 +90,11 @@ bool checkBundleIdentifier(void) { } void requestNotificationAuthorization(int channelID) { - ensureDelegateInitialized(); + if (!ensureDelegateInitialized()) { + NSString *errorMsg = @"Notification delegate has been lost. Reinitialize the notification service."; + captureResult(channelID, false, [errorMsg UTF8String]); + return; + } UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; UNAuthorizationOptions options = UNAuthorizationOptionAlert | UNAuthorizationOptionSound | UNAuthorizationOptionBadge; @@ -97,7 +110,11 @@ void requestNotificationAuthorization(int channelID) { } void checkNotificationAuthorization(int channelID) { - ensureDelegateInitialized(); + if (!ensureDelegateInitialized()) { + NSString *errorMsg = @"Notification delegate has been lost. Reinitialize the notification service."; + captureResult(channelID, false, [errorMsg UTF8String]); + return; + } UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings *settings) { @@ -136,7 +153,11 @@ UNMutableNotificationContent* createNotificationContent(const char *title, const } void sendNotification(int channelID, const char *identifier, const char *title, const char *subtitle, const char *body, const char *data_json) { - ensureDelegateInitialized(); + if (!ensureDelegateInitialized()) { + NSString *errorMsg = @"Notification delegate has been lost. Reinitialize the notification service."; + captureResult(channelID, false, [errorMsg UTF8String]); + return; + } UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; @@ -164,7 +185,11 @@ void sendNotification(int channelID, const char *identifier, const char *title, void sendNotificationWithActions(int channelID, const char *identifier, const char *title, const char *subtitle, const char *body, const char *categoryId, const char *data_json) { - ensureDelegateInitialized(); + if (!ensureDelegateInitialized()) { + NSString *errorMsg = @"Notification delegate has been lost. Reinitialize the notification service."; + captureResult(channelID, false, [errorMsg UTF8String]); + return; + } UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; @@ -195,7 +220,11 @@ void sendNotificationWithActions(int channelID, const char *identifier, const ch void registerNotificationCategory(int channelID, const char *categoryId, const char *actions_json, bool hasReplyField, const char *replyPlaceholder, const char *replyButtonTitle) { - ensureDelegateInitialized(); + if (!ensureDelegateInitialized()) { + NSString *errorMsg = @"Notification delegate has been lost. Reinitialize the notification service."; + captureResult(channelID, false, [errorMsg UTF8String]); + return; + } NSString *nsCategoryId = [NSString stringWithUTF8String:categoryId]; NSString *actionsJsonStr = actions_json ? [NSString stringWithUTF8String:actions_json] : @"[]"; From f6a5bed582bc26b499a9ae27f8cc796796b3bbcd Mon Sep 17 00:00:00 2001 From: popaprozac Date: Sat, 22 Mar 2025 12:48:47 -0700 Subject: [PATCH 193/374] windows err handling --- .../notifications/notifications_darwin.go | 4 +- .../notifications/notifications_windows.go | 48 ++++++++++++++----- 2 files changed, 37 insertions(+), 15 deletions(-) diff --git a/v3/pkg/services/notifications/notifications_darwin.go b/v3/pkg/services/notifications/notifications_darwin.go index c97e80531..7264a7f71 100644 --- a/v3/pkg/services/notifications/notifications_darwin.go +++ b/v3/pkg/services/notifications/notifications_darwin.go @@ -71,9 +71,9 @@ func CheckBundleIdentifier() bool { } // RequestNotificationAuthorization requests permission for notifications. -// Default timeout is 15 minutes +// Default timeout is 3 minutes func (dn *darwinNotifier) RequestNotificationAuthorization() (bool, error) { - ctx, cancel := context.WithTimeout(context.Background(), time.Second*900) + ctx, cancel := context.WithTimeout(context.Background(), 180*time.Second) defer cancel() id, resultCh := dn.registerChannel() diff --git a/v3/pkg/services/notifications/notifications_windows.go b/v3/pkg/services/notifications/notifications_windows.go index 6219665f6..de476898d 100644 --- a/v3/pkg/services/notifications/notifications_windows.go +++ b/v3/pkg/services/notifications/notifications_windows.go @@ -58,6 +58,9 @@ func New() *Service { // Startup is called when the service is loaded // Sets an activation callback to emit an event when notifications are interacted with. func (wn *windowsNotifier) Startup(ctx context.Context, options application.ServiceOptions) error { + wn.categoriesLock.Lock() + defer wn.categoriesLock.Unlock() + wn.appName = application.Get().Config().Name guid, err := wn.getGUID() @@ -76,7 +79,17 @@ func (wn *windowsNotifier) Startup(ctx context.Context, options application.Serv toast.SetActivationCallback(func(args string, data []toast.UserData) { result := NotificationResult{} - actionIdentifier, userInfo := parseNotificationResponse(args) + actionIdentifier, userInfo, err := parseNotificationResponse(args) + + if err != nil { + result.Error = err + + if ns := getNotificationService(); ns != nil { + ns.handleNotificationResult(result) + } + return + } + response := NotificationResponse{ ActionIdentifier: actionIdentifier, } @@ -89,6 +102,7 @@ func (wn *windowsNotifier) Startup(ctx context.Context, options application.Serv if ns := getNotificationService(); ns != nil { ns.handleNotificationResult(result) } + return } response.UserInfo = userInfoMap } @@ -108,6 +122,9 @@ func (wn *windowsNotifier) Startup(ctx context.Context, options application.Serv // Shutdown will attempt to save the categories to the registry when the service unloads func (wn *windowsNotifier) Shutdown() error { + wn.categoriesLock.Lock() + defer wn.categoriesLock.Unlock() + return wn.saveCategoriesToRegistry() } @@ -209,6 +226,8 @@ func (wn *windowsNotifier) SendNotificationWithActions(options NotificationOptio // Registering a category with the same name as a previously registered NotificationCategory will override it. func (wn *windowsNotifier) RegisterNotificationCategory(category NotificationCategory) error { wn.categoriesLock.Lock() + defer wn.categoriesLock.Unlock() + wn.categories[category.ID] = NotificationCategory{ ID: category.ID, Actions: category.Actions, @@ -216,7 +235,6 @@ func (wn *windowsNotifier) RegisterNotificationCategory(category NotificationCat ReplyPlaceholder: category.ReplyPlaceholder, ReplyButtonTitle: category.ReplyButtonTitle, } - wn.categoriesLock.Unlock() return wn.saveCategoriesToRegistry() } @@ -224,8 +242,9 @@ func (wn *windowsNotifier) RegisterNotificationCategory(category NotificationCat // RemoveNotificationCategory removes a previously registered NotificationCategory. func (wn *windowsNotifier) RemoveNotificationCategory(categoryId string) error { wn.categoriesLock.Lock() + defer wn.categoriesLock.Unlock() + delete(wn.categories, categoryId) - wn.categoriesLock.Unlock() return wn.saveCategoriesToRegistry() } @@ -280,29 +299,34 @@ func (wn *windowsNotifier) encodePayload(actionID string, data map[string]interf func decodePayload(encodedString string) (string, map[string]interface{}, error) { jsonData, err := base64.StdEncoding.DecodeString(encodedString) if err != nil { - return encodedString, nil, nil + return encodedString, nil, fmt.Errorf("failed to decode base64 payload: %w", err) } var payload NotificationPayload if err := json.Unmarshal(jsonData, &payload); err != nil { - return encodedString, nil, nil + return encodedString, nil, fmt.Errorf("failed to unmarshal notification payload: %w", err) } return payload.Action, payload.Data, nil } // parseNotificationResponse updated to use structured payload decoding -func parseNotificationResponse(response string) (action string, data string) { - actionID, userData, _ := decodePayload(response) +func parseNotificationResponse(response string) (action string, data string, err error) { + actionID, userData, err := decodePayload(response) + + if err != nil { + fmt.Printf("Warning: Failed to decode notification response: %v\n", err) + return response, "", err + } if userData != nil { userDataJSON, err := json.Marshal(userData) if err == nil { - return actionID, string(userDataJSON) + return actionID, string(userDataJSON), nil } } - return actionID, "" + return actionID, "", nil } func (wn *windowsNotifier) saveIconToDir() error { @@ -315,8 +339,7 @@ func (wn *windowsNotifier) saveIconToDir() error { } func (wn *windowsNotifier) saveCategoriesToRegistry() error { - wn.categoriesLock.Lock() - defer wn.categoriesLock.Unlock() + // We assume lock is held by caller registryPath := fmt.Sprintf(NotificationCategoriesRegistryPath, wn.appName) @@ -339,8 +362,7 @@ func (wn *windowsNotifier) saveCategoriesToRegistry() error { } func (wn *windowsNotifier) loadCategoriesFromRegistry() error { - wn.categoriesLock.Lock() - defer wn.categoriesLock.Unlock() + // We assume lock is held by caller registryPath := fmt.Sprintf(NotificationCategoriesRegistryPath, wn.appName) From b2b8f140532403b09a6ee3c4b58126295c664f27 Mon Sep 17 00:00:00 2001 From: popaprozac Date: Sat, 22 Mar 2025 16:01:47 -0700 Subject: [PATCH 194/374] windows err handling --- v3/pkg/services/notifications/notifications_windows.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/v3/pkg/services/notifications/notifications_windows.go b/v3/pkg/services/notifications/notifications_windows.go index de476898d..30abd61b1 100644 --- a/v3/pkg/services/notifications/notifications_windows.go +++ b/v3/pkg/services/notifications/notifications_windows.go @@ -174,9 +174,13 @@ func (wn *windowsNotifier) SendNotificationWithActions(options NotificationOptio } wn.categoriesLock.RLock() - nCategory := wn.categories[options.CategoryID] + nCategory, categoryExists := wn.categories[options.CategoryID] wn.categoriesLock.RUnlock() + if options.CategoryID == "" || !categoryExists { + fmt.Printf("Category '%s' not found, sending basic notification without actions\n", options.CategoryID) + } + n := toast.Notification{ Title: options.Title, Body: options.Body, From f870dcc168fa880e324f2bb65ec094bc82c1031b Mon Sep 17 00:00:00 2001 From: popaprozac Date: Sat, 22 Mar 2025 17:39:20 -0700 Subject: [PATCH 195/374] handle notif content errors --- .../notifications/notifications_darwin.m | 29 ++++++++++++------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/v3/pkg/services/notifications/notifications_darwin.m b/v3/pkg/services/notifications/notifications_darwin.m index 01d85c1bc..cd429c5d6 100644 --- a/v3/pkg/services/notifications/notifications_darwin.m +++ b/v3/pkg/services/notifications/notifications_darwin.m @@ -1,4 +1,5 @@ #import "notifications_darwin.h" +#include #import #import @@ -125,7 +126,7 @@ void checkNotificationAuthorization(int channelID) { // Helper function to create notification content UNMutableNotificationContent* createNotificationContent(const char *title, const char *subtitle, - const char *body, const char *data_json) { + const char *body, const char *data_json, NSError **contentError) { NSString *nsTitle = [NSString stringWithUTF8String:title]; NSString *nsSubtitle = subtitle ? [NSString stringWithUTF8String:subtitle] : @""; NSString *nsBody = [NSString stringWithUTF8String:body]; @@ -146,6 +147,8 @@ UNMutableNotificationContent* createNotificationContent(const char *title, const NSDictionary *parsedData = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error]; if (!error && parsedData) { content.userInfo = parsedData; + } else if (error) { + *contentError = error; } } @@ -162,13 +165,16 @@ void sendNotification(int channelID, const char *identifier, const char *title, UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; NSString *nsIdentifier = [NSString stringWithUTF8String:identifier]; - UNMutableNotificationContent *content = createNotificationContent(title, subtitle, body, data_json); - NSMutableDictionary *customData = [NSMutableDictionary dictionary]; + + NSError *contentError = nil; + UNMutableNotificationContent *content = createNotificationContent(title, subtitle, body, data_json, &contentError); - if (customData.count > 0) { - content.userInfo = customData; + if (contentError) { + NSString *errorMsg = [NSString stringWithFormat:@"Error: %@", [contentError localizedDescription]]; + captureResult(channelID, false, [errorMsg UTF8String]); + return; } - + UNTimeIntervalNotificationTrigger *trigger = nil; UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:nsIdentifier content:content trigger:trigger]; @@ -195,13 +201,14 @@ void sendNotificationWithActions(int channelID, const char *identifier, const ch NSString *nsIdentifier = [NSString stringWithUTF8String:identifier]; NSString *nsCategoryId = [NSString stringWithUTF8String:categoryId]; - UNMutableNotificationContent *content = createNotificationContent(title, subtitle, body, data_json); - NSMutableDictionary *customData = [NSMutableDictionary dictionary]; - content.categoryIdentifier = nsCategoryId; + NSError *contentError = nil; + UNMutableNotificationContent *content = createNotificationContent(title, subtitle, body, data_json, &contentError); - if (customData.count > 0) { - content.userInfo = customData; + if (contentError) { + NSString *errorMsg = [NSString stringWithFormat:@"Error: %@", [contentError localizedDescription]]; + captureResult(channelID, false, [errorMsg UTF8String]); + return; } UNTimeIntervalNotificationTrigger *trigger = nil; From 9948cee1f715943553f342c22d33296f10dd0224 Mon Sep 17 00:00:00 2001 From: popaprozac Date: Sat, 22 Mar 2025 17:51:51 -0700 Subject: [PATCH 196/374] monitor dbus connection --- .../notifications/notifications_darwin.go | 2 +- .../notifications/notifications_linux.go | 76 ++++++++++++++++++- 2 files changed, 75 insertions(+), 3 deletions(-) diff --git a/v3/pkg/services/notifications/notifications_darwin.go b/v3/pkg/services/notifications/notifications_darwin.go index 7264a7f71..e27d6f010 100644 --- a/v3/pkg/services/notifications/notifications_darwin.go +++ b/v3/pkg/services/notifications/notifications_darwin.go @@ -85,7 +85,7 @@ func (dn *darwinNotifier) RequestNotificationAuthorization() (bool, error) { return result.Success, result.Error case <-ctx.Done(): dn.cleanupChannel(id) - return false, fmt.Errorf("notification authorization timed out after 15 minutes: %w", ctx.Err()) + return false, fmt.Errorf("notification authorization timed out after 3 minutes: %w", ctx.Err()) } } diff --git a/v3/pkg/services/notifications/notifications_linux.go b/v3/pkg/services/notifications/notifications_linux.go index 2050c84df..551095dec 100644 --- a/v3/pkg/services/notifications/notifications_linux.go +++ b/v3/pkg/services/notifications/notifications_linux.go @@ -11,6 +11,7 @@ import ( "os/exec" "path/filepath" "sync" + "time" "github.com/godbus/dbus/v5" "github.com/wailsapp/wails/v3/pkg/application" @@ -246,12 +247,55 @@ func (ln *linuxNotifier) startDBusListener(ctx context.Context) { close(signal) // Clean up channel }() + // Create a separate goroutine to monitor the D-Bus connection + disconnected := ln.monitorDBusConnection(ctx) + for { select { case <-ctx.Done(): // Context was cancelled, exit gracefully return + case <-disconnected: + // D-Bus connection lost + fmt.Println("D-Bus connection lost, attempting to reconnect...") + ln.Lock() + + // Attempt to reconnect + var err error + newConn, err := ln.initDBus() + if err != nil { + fmt.Printf("Failed to reconnect to D-Bus: %v\n", err) + ln.dbusConn = nil + ln.method = "" // No longer using D-Bus + + // Try fallback to notify-send + sendPath, err := ln.initNotifySend() + if err == nil { + fmt.Println("Falling back to notify-send method") + ln.sendPath = sendPath + ln.method = MethodNotifySend + } else { + fmt.Println("No notification methods available after D-Bus disconnect") + } + + ln.Unlock() + return // Exit listener as we can't continue without D-Bus + } + + // Successfully reconnected + ln.dbusConn = newConn + ln.Unlock() + + // Re-register for signals + signal = make(chan *dbus.Signal, notifyChannelBufferSize) + ln.dbusConn.Signal(signal) + + // Restart the monitor goroutine + disconnected = ln.monitorDBusConnection(ctx) + fmt.Println("Successfully reconnected to D-Bus") + continue + case s := <-signal: if s == nil { // Channel closed or nil signal @@ -512,6 +556,33 @@ func (ln *linuxNotifier) SendNotificationWithActions(options NotificationOptions return err } +// monitorDBusConnection creates a goroutine to monitor the D-Bus connection +// Returns a channel that will be closed if the connection is lost +func (ln *linuxNotifier) monitorDBusConnection(ctx context.Context) chan struct{} { + disconnected := make(chan struct{}) + + go func() { + for { + select { + case <-ctx.Done(): + return // Context cancelled, exit monitor + default: + ln.Lock() + connected := ln.dbusConn != nil && ln.dbusConn.Connected() + ln.Unlock() + + if !connected { + close(disconnected) + return + } + time.Sleep(1 * time.Second) // Check every second + } + } + }() + + return disconnected +} + // sendViaDbus sends a notification via dbus func (ln *linuxNotifier) sendViaDbus(options NotificationOptions, category *NotificationCategory) (result uint32, err error) { // Prepare actions @@ -623,14 +694,15 @@ func (ln *linuxNotifier) RemoveDeliveredNotification(_ string) error { // RemoveNotification removes a notification by ID (Linux-specific) func (ln *linuxNotifier) RemoveNotification(identifier string) error { + ln.Lock() + defer ln.Unlock() + if !ln.initialized || ln.method != MethodDbus || ln.dbusConn == nil { return errors.New("dbus not available for closing notifications") } // Get the system ID for this notification - ln.Lock() systemID, exists := ln.activeNotifs[identifier] - ln.Unlock() if !exists { return nil // Already closed or unknown From ace4f70e3a9b8d8bf95a8cff2ad64914df86c3dc Mon Sep 17 00:00:00 2001 From: popaprozac Date: Sat, 22 Mar 2025 18:04:30 -0700 Subject: [PATCH 197/374] fix channel cleanup linux --- .../notifications/notifications_linux.go | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/v3/pkg/services/notifications/notifications_linux.go b/v3/pkg/services/notifications/notifications_linux.go index 551095dec..0fc21275a 100644 --- a/v3/pkg/services/notifications/notifications_linux.go +++ b/v3/pkg/services/notifications/notifications_linux.go @@ -41,6 +41,9 @@ type linuxNotifier struct { // Initialization initOnce sync.Once initialized bool + + monitorCtx context.Context + monitorCancel context.CancelFunc } type notificationContext struct { @@ -105,6 +108,8 @@ func (ln *linuxNotifier) initNotificationSystem() error { ln.Lock() defer ln.Unlock() + ln.monitorCtx, ln.monitorCancel = context.WithCancel(context.Background()) + // Cancel any existing listener if ln.listenerCancel != nil { ln.listenerCancel() @@ -210,6 +215,12 @@ func (ln *linuxNotifier) initNotifySend() (string, error) { func (ln *linuxNotifier) Shutdown() error { ln.Lock() + // Cancel monitor goroutine first + if ln.monitorCancel != nil { + ln.monitorCancel() + ln.monitorCancel = nil + } + // Cancel the listener context if it's running if ln.listenerCancel != nil { ln.listenerCancel() @@ -562,11 +573,16 @@ func (ln *linuxNotifier) monitorDBusConnection(ctx context.Context) chan struct{ disconnected := make(chan struct{}) go func() { + ticker := time.NewTicker(1 * time.Second) + defer ticker.Stop() + for { select { case <-ctx.Done(): - return // Context cancelled, exit monitor - default: + return // Parent context cancelled + case <-ln.monitorCtx.Done(): + return // Monitor specifically cancelled + case <-ticker.C: ln.Lock() connected := ln.dbusConn != nil && ln.dbusConn.Connected() ln.Unlock() @@ -575,7 +591,6 @@ func (ln *linuxNotifier) monitorDBusConnection(ctx context.Context) chan struct{ close(disconnected) return } - time.Sleep(1 * time.Second) // Check every second } } }() From 448c78b226a461c3c5e29d5d1d12f6e6a77f349a Mon Sep 17 00:00:00 2001 From: popaprozac Date: Sat, 22 Mar 2025 22:36:29 -0700 Subject: [PATCH 198/374] rewrite and simplify linux impl --- .../notifications/notifications_linux.go | 1079 +++++++---------- .../notifications/notifications_windows.go | 4 +- 2 files changed, 433 insertions(+), 650 deletions(-) diff --git a/v3/pkg/services/notifications/notifications_linux.go b/v3/pkg/services/notifications/notifications_linux.go index 0fc21275a..911bba8c4 100644 --- a/v3/pkg/services/notifications/notifications_linux.go +++ b/v3/pkg/services/notifications/notifications_linux.go @@ -5,77 +5,37 @@ package notifications import ( "context" "encoding/json" - "errors" "fmt" "os" - "os/exec" "path/filepath" "sync" - "time" "github.com/godbus/dbus/v5" "github.com/wailsapp/wails/v3/pkg/application" ) type linuxNotifier struct { - // Categories - categories map[string]NotificationCategory - categoriesLock sync.RWMutex - - // App info - appName string - - // Notification system - sync.Mutex - method string - dbusConn *dbus.Conn - sendPath string - activeNotifs map[string]uint32 // Maps our notification IDs to system IDs - contexts map[string]*notificationContext // Stores notification contexts by our ID - - // Listener management - listenerCtx context.Context - listenerCancel context.CancelFunc - listenerRunning bool - - // Initialization - initOnce sync.Once - initialized bool - - monitorCtx context.Context - monitorCancel context.CancelFunc -} - -type notificationContext struct { - ID string - SystemID uint32 - Actions map[string]string // Maps action keys to display labels - UserData map[string]interface{} // The original user data + conn *dbus.Conn + categories map[string]NotificationCategory + categoriesLock sync.RWMutex + activeNotifs map[uint32]string + notificationMeta map[uint32]map[string]interface{} + activeNotifsLock sync.RWMutex + appName string } const ( - dbusObjectPath = "/org/freedesktop/Notifications" - dbusNotificationsInterface = "org.freedesktop.Notifications" - signalNotificationClosed = "org.freedesktop.Notifications.NotificationClosed" - signalActionInvoked = "org.freedesktop.Notifications.ActionInvoked" - callGetCapabilities = "org.freedesktop.Notifications.GetCapabilities" - callCloseNotification = "org.freedesktop.Notifications.CloseNotification" - - MethodNotifySend = "notify-send" - MethodDbus = "dbus" - - notifyChannelBufferSize = 25 + dbusNotificationInterface = "org.freedesktop.Notifications" + dbusNotificationPath = "/org/freedesktop/Notifications" ) -type closedReason uint32 - -// New creates a new Notifications Service +// Creates a new Notifications Service. func New() *Service { notificationServiceOnce.Do(func() { impl := &linuxNotifier{ - categories: make(map[string]NotificationCategory), - activeNotifs: make(map[string]uint32), - contexts: make(map[string]*notificationContext), + categories: make(map[string]NotificationCategory), + activeNotifs: make(map[uint32]string), + notificationMeta: make(map[uint32]map[string]interface{}), } NotificationService = &Service{ @@ -88,708 +48,373 @@ func New() *Service { // Startup is called when the service is loaded func (ln *linuxNotifier) Startup(ctx context.Context, options application.ServiceOptions) error { - ln.appName = application.Get().Config().Name + app := application.Get() + if app != nil && app.Config().Name != "" { + ln.appName = app.Config().Name + } + + conn, err := dbus.ConnectSessionBus() + if err != nil { + return fmt.Errorf("failed to connect to session bus: %w", err) + } + ln.conn = conn if err := ln.loadCategories(); err != nil { fmt.Printf("Failed to load notification categories: %v\n", err) } - var err error - ln.initOnce.Do(func() { - err = ln.initNotificationSystem() - ln.initialized = err == nil - }) + if err := ln.setupSignalHandling(); err != nil { + return fmt.Errorf("failed to set up notification signal handling: %w", err) + } - return err + return nil } -// initNotificationSystem initializes the notification system -func (ln *linuxNotifier) initNotificationSystem() error { - ln.Lock() - defer ln.Unlock() - - ln.monitorCtx, ln.monitorCancel = context.WithCancel(context.Background()) - - // Cancel any existing listener - if ln.listenerCancel != nil { - ln.listenerCancel() - ln.listenerCancel = nil - } - - // Create a new context for the listener - ln.listenerCtx, ln.listenerCancel = context.WithCancel(context.Background()) - - // Reset state - ln.activeNotifs = make(map[string]uint32) - ln.contexts = make(map[string]*notificationContext) - ln.listenerRunning = false - - // Try dbus first - dbusConn, err := ln.initDBus() - if err == nil { - ln.dbusConn = dbusConn - ln.method = MethodDbus - - // Start the dbus signal listener - go ln.startDBusListener(ln.listenerCtx) - ln.listenerRunning = true - return nil - } - - // Try notify-send as fallback - sendPath, err := ln.initNotifySend() - if err == nil { - ln.sendPath = sendPath - ln.method = MethodNotifySend - return nil - } - - // No method available - ln.method = "" - ln.sendPath = "" - return errors.New("no notification method is available") -} - -// initDBus attempts to initialize D-Bus notifications -func (ln *linuxNotifier) initDBus() (*dbus.Conn, error) { - conn, err := dbus.SessionBusPrivate() - if err != nil { - return nil, err - } - - if err = conn.Auth(nil); err != nil { - conn.Close() - return nil, err - } - - if err = conn.Hello(); err != nil { - conn.Close() - return nil, err - } - - obj := conn.Object(dbusNotificationsInterface, dbusObjectPath) - call := obj.Call(callGetCapabilities, 0) - if call.Err != nil { - conn.Close() - return nil, call.Err - } - - var ret []string - err = call.Store(&ret) - if err != nil { - conn.Close() - return nil, err - } - - // Add a listener for notification signals - err = conn.AddMatchSignal( - dbus.WithMatchObjectPath(dbusObjectPath), - dbus.WithMatchInterface(dbusNotificationsInterface), - ) - if err != nil { - conn.Close() - return nil, err - } - - return conn, nil -} - -// initNotifySend attempts to find notify-send binary -func (ln *linuxNotifier) initNotifySend() (string, error) { - // Try standard notify-send - send, err := exec.LookPath("notify-send") - if err == nil { - return send, nil - } - - // Try sw-notify-send (in some distros) - send, err = exec.LookPath("sw-notify-send") - if err == nil { - return send, nil - } - - return "", errors.New("notify-send not found") -} - -// Shutdown is called when the service is unloaded +// Shutdown will save categories and close the D-Bus connection when the service unloads func (ln *linuxNotifier) Shutdown() error { - ln.Lock() - - // Cancel monitor goroutine first - if ln.monitorCancel != nil { - ln.monitorCancel() - ln.monitorCancel = nil + if err := ln.saveCategories(); err != nil { + fmt.Printf("Failed to save notification categories: %v\n", err) } - // Cancel the listener context if it's running - if ln.listenerCancel != nil { - ln.listenerCancel() - ln.listenerCancel = nil + if ln.conn != nil { + return ln.conn.Close() } - // Close the connection - if ln.dbusConn != nil { - ln.dbusConn.Close() - ln.dbusConn = nil - } - - // Clear state - ln.activeNotifs = make(map[string]uint32) - ln.contexts = make(map[string]*notificationContext) - ln.method = "" - ln.sendPath = "" - ln.initialized = false - - ln.Unlock() - - return ln.saveCategories() + return nil } -// startDBusListener listens for DBus signals for notification actions and closures -func (ln *linuxNotifier) startDBusListener(ctx context.Context) { - signal := make(chan *dbus.Signal, notifyChannelBufferSize) - ln.dbusConn.Signal(signal) - - defer func() { - ln.Lock() - ln.listenerRunning = false - ln.Unlock() - ln.dbusConn.RemoveSignal(signal) // Remove signal handler - close(signal) // Clean up channel - }() - - // Create a separate goroutine to monitor the D-Bus connection - disconnected := ln.monitorDBusConnection(ctx) - - for { - select { - case <-ctx.Done(): - // Context was cancelled, exit gracefully - return - - case <-disconnected: - // D-Bus connection lost - fmt.Println("D-Bus connection lost, attempting to reconnect...") - ln.Lock() - - // Attempt to reconnect - var err error - newConn, err := ln.initDBus() - if err != nil { - fmt.Printf("Failed to reconnect to D-Bus: %v\n", err) - ln.dbusConn = nil - ln.method = "" // No longer using D-Bus - - // Try fallback to notify-send - sendPath, err := ln.initNotifySend() - if err == nil { - fmt.Println("Falling back to notify-send method") - ln.sendPath = sendPath - ln.method = MethodNotifySend - } else { - fmt.Println("No notification methods available after D-Bus disconnect") - } - - ln.Unlock() - return // Exit listener as we can't continue without D-Bus - } - - // Successfully reconnected - ln.dbusConn = newConn - ln.Unlock() - - // Re-register for signals - signal = make(chan *dbus.Signal, notifyChannelBufferSize) - ln.dbusConn.Signal(signal) - - // Restart the monitor goroutine - disconnected = ln.monitorDBusConnection(ctx) - fmt.Println("Successfully reconnected to D-Bus") - continue - - case s := <-signal: - if s == nil { - // Channel closed or nil signal - continue - } - - if len(s.Body) < 2 { - continue - } - - switch s.Name { - case signalNotificationClosed: - systemID := s.Body[0].(uint32) - reason := closedReason(s.Body[1].(uint32)).string() - ln.handleNotificationClosed(systemID, reason) - case signalActionInvoked: - systemID := s.Body[0].(uint32) - actionKey := s.Body[1].(string) - ln.handleActionInvoked(systemID, actionKey) - } - } - } -} - -// handleNotificationClosed processes notification closed signals -func (ln *linuxNotifier) handleNotificationClosed(systemID uint32, reason string) { - // Find our notification ID for this system ID - var notifID string - var userData map[string]interface{} - - ln.Lock() - for id, sysID := range ln.activeNotifs { - if sysID == systemID { - notifID = id - // Get the user data from context if available - if ctx, exists := ln.contexts[id]; exists { - userData = ctx.UserData - } - break - } - } - ln.Unlock() - - if notifID != "" { - response := NotificationResponse{ - ID: notifID, - ActionIdentifier: DefaultActionIdentifier, - UserInfo: userData, - } - - // Add reason to UserInfo or create it if none exists - if response.UserInfo == nil { - response.UserInfo = map[string]interface{}{ - "reason": reason, - } - } else { - response.UserInfo["reason"] = reason - } - - result := NotificationResult{} - result.Response = response - if ns := getNotificationService(); ns != nil { - ns.handleNotificationResult(result) - } - - // Clean up the context - ln.Lock() - delete(ln.contexts, notifID) - delete(ln.activeNotifs, notifID) - ln.Unlock() - } -} - -// handleActionInvoked processes action invoked signals -func (ln *linuxNotifier) handleActionInvoked(systemID uint32, actionKey string) { - // Find our notification ID and context for this system ID - var notifID string - var ctx *notificationContext - - ln.Lock() - for id, sysID := range ln.activeNotifs { - if sysID == systemID { - notifID = id - ctx = ln.contexts[id] - break - } - } - ln.Unlock() - - if notifID != "" { - if actionKey == "default" { - actionKey = DefaultActionIdentifier - } - - // First, send the action response with the user data - response := NotificationResponse{ - ID: notifID, - ActionIdentifier: actionKey, - } - - // Include the user data if we have it - if ctx != nil { - response.UserInfo = ctx.UserData - } - - result := NotificationResult{} - result.Response = response - if ns := getNotificationService(); ns != nil { - ns.handleNotificationResult(result) - } - - // Then, trigger a closed event with "activated-by-user" reason - closeResponse := NotificationResponse{ - ID: notifID, - ActionIdentifier: DefaultActionIdentifier, - } - - // Include the same user data in the close response - if ctx != nil { - closeResponse.UserInfo = ctx.UserData - } else { - closeResponse.UserInfo = map[string]interface{}{} - } - - // Add the reason to the user info - closeResponse.UserInfo["reason"] = closedReason(5).string() // "activated-by-user" - - closeResult := NotificationResult{} - closeResult.Response = closeResponse - if ns := getNotificationService(); ns != nil { - ns.handleNotificationResult(closeResult) - } - - // Clean up the context - ln.Lock() - delete(ln.contexts, notifID) - delete(ln.activeNotifs, notifID) - ln.Unlock() - } -} - -// CheckBundleIdentifier is a Linux stub that always returns true. -func (ln *linuxNotifier) CheckBundleIdentifier() bool { - return true -} - -// RequestNotificationAuthorization is a Linux stub that always returns true. +// RequestNotificationAuthorization is a Linux stub that always returns true, nil. +// (authorization is macOS-specific) func (ln *linuxNotifier) RequestNotificationAuthorization() (bool, error) { return true, nil } // CheckNotificationAuthorization is a Linux stub that always returns true. +// (authorization is macOS-specific) func (ln *linuxNotifier) CheckNotificationAuthorization() (bool, error) { return true, nil } // SendNotification sends a basic notification with a unique identifier, title, subtitle, and body. func (ln *linuxNotifier) SendNotification(options NotificationOptions) error { - if !ln.initialized { - return errors.New("notification service not initialized") + hints := map[string]dbus.Variant{} + + // Use subtitle as part of the body if provided + body := options.Body + if options.Subtitle != "" { + body = options.Subtitle + "\n" + body } - if err := validateNotificationOptions(options); err != nil { - return err + if options.Data != nil { + jsonData, err := json.Marshal(options.Data) + if err != nil { + return fmt.Errorf("failed to marshal notification data: %w", err) + } + hints["x-user-info"] = dbus.MakeVariant(string(jsonData)) } - ln.Lock() - defer ln.Unlock() + metadataJSON, err := json.Marshal(map[string]interface{}{ + "id": options.ID, + "title": options.Title, + "subtitle": options.Subtitle, + "body": options.Body, + "data": options.Data, + }) + if err != nil { + return fmt.Errorf("failed to marshal notification metadata: %w", err) + } + hints["x-wails-metadata"] = dbus.MakeVariant(string(metadataJSON)) - var ( - systemID uint32 - err error + actions := []string{} + timeout := int32(0) // Timeout in milliseconds (5 seconds) + + // Call the Notify method on the D-Bus interface + obj := ln.conn.Object(dbusNotificationInterface, dbusNotificationPath) + call := obj.Call( + dbusNotificationInterface+".Notify", + 0, + ln.appName, + uint32(0), + "", // Icon + options.Title, + body, + actions, + hints, + timeout, ) - switch ln.method { - case MethodDbus: - systemID, err = ln.sendViaDbus(options, nil) - case MethodNotifySend: - systemID, err = ln.sendViaNotifySend(options) - default: - err = errors.New("no notification method is available") + if call.Err != nil { + return fmt.Errorf("failed to send notification: %w", call.Err) } - if err == nil && systemID > 0 { - // Store the system ID mapping - ln.activeNotifs[options.ID] = systemID - - // Create and store the notification context - ctx := ¬ificationContext{ - ID: options.ID, - SystemID: systemID, - UserData: options.Data, - } - ln.contexts[options.ID] = ctx + var notifID uint32 + if err := call.Store(¬ifID); err != nil { + return fmt.Errorf("failed to store notification ID: %w", err) } - return err + ln.activeNotifsLock.Lock() + ln.activeNotifs[notifID] = options.ID + + ln.notificationMeta[notifID] = map[string]interface{}{ + "id": options.ID, + "title": options.Title, + "subtitle": options.Subtitle, + "body": options.Body, + "data": options.Data, + } + ln.activeNotifsLock.Unlock() + + return nil } // SendNotificationWithActions sends a notification with additional actions. +// (Inputs are only supported on macOS and Windows) func (ln *linuxNotifier) SendNotificationWithActions(options NotificationOptions) error { - if !ln.initialized { - return errors.New("notification service not initialized") - } - - if err := validateNotificationOptions(options); err != nil { - return err - } - ln.categoriesLock.RLock() category, exists := ln.categories[options.CategoryID] ln.categoriesLock.RUnlock() - if !exists { + if options.CategoryID == "" || !exists { + // Fall back to basic notification return ln.SendNotification(options) } - ln.Lock() - defer ln.Unlock() + // Use subtitle as part of the body if provided + body := options.Body + if options.Subtitle != "" { + body = options.Subtitle + "\n" + body + } - var ( - systemID uint32 - err error + var actions []string + for _, action := range category.Actions { + actions = append(actions, action.ID, action.Title) + } + + hints := map[string]dbus.Variant{} + + if options.Data != nil { + jsonData, err := json.Marshal(options.Data) + if err != nil { + return fmt.Errorf("failed to marshal notification data: %w", err) + } + hints["x-user-info"] = dbus.MakeVariant(string(jsonData)) + } + + hints["category"] = dbus.MakeVariant(options.CategoryID) + + metadataJSON, err := json.Marshal(map[string]interface{}{ + "id": options.ID, + "title": options.Title, + "subtitle": options.Subtitle, + "body": options.Body, + "categoryId": options.CategoryID, + "data": options.Data, + }) + if err != nil { + return fmt.Errorf("failed to marshal notification metadata: %w", err) + } + hints["x-wails-metadata"] = dbus.MakeVariant(string(metadataJSON)) + + timeout := int32(0) + + obj := ln.conn.Object(dbusNotificationInterface, dbusNotificationPath) + call := obj.Call( + dbusNotificationInterface+".Notify", + 0, + ln.appName, + uint32(0), + "", // Icon + options.Title, + body, + actions, + hints, + timeout, ) - switch ln.method { - case MethodDbus: - systemID, err = ln.sendViaDbus(options, &category) - case MethodNotifySend: - // notify-send doesn't support actions, fall back to basic notification - systemID, err = ln.sendViaNotifySend(options) - default: - err = errors.New("no notification method is available") - } - - if err == nil && systemID > 0 { - // Store the system ID mapping - ln.activeNotifs[options.ID] = systemID - - // Create and store the notification context with actions - ctx := ¬ificationContext{ - ID: options.ID, - SystemID: systemID, - UserData: options.Data, - Actions: make(map[string]string), - } - - // Store action mappings - if exists { - for _, action := range category.Actions { - ctx.Actions[action.ID] = action.Title - } - } - - ln.contexts[options.ID] = ctx - } - - return err -} - -// monitorDBusConnection creates a goroutine to monitor the D-Bus connection -// Returns a channel that will be closed if the connection is lost -func (ln *linuxNotifier) monitorDBusConnection(ctx context.Context) chan struct{} { - disconnected := make(chan struct{}) - - go func() { - ticker := time.NewTicker(1 * time.Second) - defer ticker.Stop() - - for { - select { - case <-ctx.Done(): - return // Parent context cancelled - case <-ln.monitorCtx.Done(): - return // Monitor specifically cancelled - case <-ticker.C: - ln.Lock() - connected := ln.dbusConn != nil && ln.dbusConn.Connected() - ln.Unlock() - - if !connected { - close(disconnected) - return - } - } - } - }() - - return disconnected -} - -// sendViaDbus sends a notification via dbus -func (ln *linuxNotifier) sendViaDbus(options NotificationOptions, category *NotificationCategory) (result uint32, err error) { - // Prepare actions - var actions []string - if category != nil { - for _, action := range category.Actions { - actions = append(actions, action.ID, action.Title) - } - } - - // Default timeout (-1 means use system default) - timeout := int32(-1) - - // Prepare hints - hints := map[string]dbus.Variant{ - // Normal urgency by default - "urgency": dbus.MakeVariant(byte(1)), - } - - // Add user data to hints if available - if options.Data != nil { - if userData, err := json.Marshal(options.Data); err == nil { - hints["x-wails-user-data"] = dbus.MakeVariant(string(userData)) - } - } - - // Send the notification - obj := ln.dbusConn.Object(dbusNotificationsInterface, dbusObjectPath) - dbusArgs := []interface{}{ - ln.appName, // App name - uint32(0), // Replaces ID (0 means new notification) - "", // App icon (empty for now) - options.Title, // Title - options.Body, // Body - actions, // Actions - hints, // Hints - timeout, // Timeout - } - - call := obj.Call("org.freedesktop.Notifications.Notify", 0, dbusArgs...) if call.Err != nil { - return 0, fmt.Errorf("dbus notification error: %v", call.Err) + return fmt.Errorf("failed to send notification: %w", call.Err) } - err = call.Store(&result) - if err != nil { - return 0, err + var notifID uint32 + if err := call.Store(¬ifID); err != nil { + return fmt.Errorf("failed to store notification ID: %w", err) } - return result, nil + ln.activeNotifsLock.Lock() + + ln.activeNotifs[notifID] = options.ID + + metadata := map[string]interface{}{ + "id": options.ID, + "title": options.Title, + "subtitle": options.Subtitle, + "body": options.Body, + "categoryId": options.CategoryID, + "data": options.Data, + } + + ln.notificationMeta[notifID] = metadata + ln.activeNotifsLock.Unlock() + + return nil } -// sendViaNotifySend sends a notification via notify-send command -func (ln *linuxNotifier) sendViaNotifySend(options NotificationOptions) (uint32, error) { - args := []string{ - options.Title, - options.Body, - "--urgency=normal", - } - - // Execute the command - cmd := exec.Command(ln.sendPath, args...) - err := cmd.Run() - if err != nil { - return 0, fmt.Errorf("notify-send error: %v", err) - } - - // notify-send doesn't return IDs, so we use 0 - return 0, nil -} - -// RegisterNotificationCategory registers a new NotificationCategory +// RegisterNotificationCategory registers a new NotificationCategory to be used with SendNotificationWithActions. +// Registering a category with the same name as a previously registered NotificationCategory will override it. func (ln *linuxNotifier) RegisterNotificationCategory(category NotificationCategory) error { ln.categoriesLock.Lock() - ln.categories[category.ID] = category - ln.categoriesLock.Unlock() + defer ln.categoriesLock.Unlock() - return ln.saveCategories() + ln.categories[category.ID] = category + + go ln.saveCategories() + + return nil } -// RemoveNotificationCategory removes a previously registered NotificationCategory +// RemoveNotificationCategory removes a previously registered NotificationCategory. func (ln *linuxNotifier) RemoveNotificationCategory(categoryId string) error { ln.categoriesLock.Lock() + defer ln.categoriesLock.Unlock() + delete(ln.categories, categoryId) - ln.categoriesLock.Unlock() - return ln.saveCategories() + go ln.saveCategories() + + return nil } -// RemoveAllPendingNotifications is a Linux stub that always returns nil +// RemoveAllPendingNotifications is not directly supported in Linux D-Bus +// but we can try to remove all active notifications. func (ln *linuxNotifier) RemoveAllPendingNotifications() error { + ln.activeNotifsLock.RLock() + notifIDs := make([]uint32, 0, len(ln.activeNotifs)) + for id := range ln.activeNotifs { + notifIDs = append(notifIDs, id) + } + ln.activeNotifsLock.RUnlock() + + for _, id := range notifIDs { + ln.closeNotification(id) + } + return nil } -// RemovePendingNotification is a Linux stub that always returns nil -func (ln *linuxNotifier) RemovePendingNotification(_ string) error { - return nil +// RemovePendingNotification removes a pending notification. +func (ln *linuxNotifier) RemovePendingNotification(identifier string) error { + var notifID uint32 + found := false + + ln.activeNotifsLock.RLock() + for id, ident := range ln.activeNotifs { + if ident == identifier { + notifID = id + found = true + break + } + } + ln.activeNotifsLock.RUnlock() + + if !found { + return nil + } + + return ln.closeNotification(notifID) } -// RemoveAllDeliveredNotifications is a Linux stub that always returns nil +// RemoveAllDeliveredNotifications functionally equivalent to RemoveAllPendingNotification on Linux. func (ln *linuxNotifier) RemoveAllDeliveredNotifications() error { - return nil + return ln.RemoveAllPendingNotifications() } -// RemoveDeliveredNotification is a Linux stub that always returns nil -func (ln *linuxNotifier) RemoveDeliveredNotification(_ string) error { - return nil +// RemoveDeliveredNotification functionally equivalent RemovePendingNotification on Linux. +func (ln *linuxNotifier) RemoveDeliveredNotification(identifier string) error { + return ln.RemovePendingNotification(identifier) } -// RemoveNotification removes a notification by ID (Linux-specific) +// RemoveNotification removes a notification by identifier. func (ln *linuxNotifier) RemoveNotification(identifier string) error { - ln.Lock() - defer ln.Unlock() - - if !ln.initialized || ln.method != MethodDbus || ln.dbusConn == nil { - return errors.New("dbus not available for closing notifications") - } - - // Get the system ID for this notification - systemID, exists := ln.activeNotifs[identifier] - - if !exists { - return nil // Already closed or unknown - } - - // Call CloseNotification on dbus - obj := ln.dbusConn.Object(dbusNotificationsInterface, dbusObjectPath) - call := obj.Call(callCloseNotification, 0, systemID) - - return call.Err + return ln.RemovePendingNotification(identifier) } -// getConfigFilePath returns the path to the configuration file -func (ln *linuxNotifier) getConfigFilePath() (string, error) { +// Helper method to close a notification. +func (ln *linuxNotifier) closeNotification(id uint32) error { + obj := ln.conn.Object(dbusNotificationInterface, dbusNotificationPath) + call := obj.Call(dbusNotificationInterface+".CloseNotification", 0, id) + + if call.Err != nil { + return fmt.Errorf("failed to close notification: %w", call.Err) + } + + ln.activeNotifsLock.Lock() + delete(ln.activeNotifs, id) + delete(ln.notificationMeta, id) + ln.activeNotifsLock.Unlock() + + return nil +} + +// Get the config directory for the app. +func (ln *linuxNotifier) getConfigDir() (string, error) { configDir, err := os.UserConfigDir() if err != nil { - return "", fmt.Errorf("failed to get user config directory: %v", err) + return "", fmt.Errorf("failed to get user config directory: %w", err) } appConfigDir := filepath.Join(configDir, ln.appName) if err := os.MkdirAll(appConfigDir, 0755); err != nil { - return "", fmt.Errorf("failed to create config directory: %v", err) + return "", fmt.Errorf("failed to create app config directory: %w", err) } - return filepath.Join(appConfigDir, "notification-categories.json"), nil + return appConfigDir, nil } -// saveCategories saves the notification categories to a file +// Save notification categories. func (ln *linuxNotifier) saveCategories() error { - filePath, err := ln.getConfigFilePath() + configDir, err := ln.getConfigDir() if err != nil { return err } + categoriesFile := filepath.Join(configDir, "notification-categories.json") + ln.categoriesLock.RLock() - data, err := json.Marshal(ln.categories) + categoriesData, err := json.MarshalIndent(ln.categories, "", " ") ln.categoriesLock.RUnlock() if err != nil { - return fmt.Errorf("failed to marshal notification categories: %v", err) + return fmt.Errorf("failed to marshal notification categories: %w", err) } - if err := os.WriteFile(filePath, data, 0644); err != nil { - return fmt.Errorf("failed to write notification categories to file: %v", err) + if err := os.WriteFile(categoriesFile, categoriesData, 0644); err != nil { + return fmt.Errorf("failed to write notification categories to disk: %w", err) } return nil } -// loadCategories loads notification categories from a file +// Load notification categories. func (ln *linuxNotifier) loadCategories() error { - filePath, err := ln.getConfigFilePath() + configDir, err := ln.getConfigDir() if err != nil { return err } - if _, err := os.Stat(filePath); os.IsNotExist(err) { + categoriesFile := filepath.Join(configDir, "notification-categories.json") + + if _, err := os.Stat(categoriesFile); os.IsNotExist(err) { return nil } - data, err := os.ReadFile(filePath) + categoriesData, err := os.ReadFile(categoriesFile) if err != nil { - return fmt.Errorf("failed to read notification categories file: %v", err) - } - - if len(data) == 0 { - return nil + return fmt.Errorf("failed to read notification categories from disk: %w", err) } categories := make(map[string]NotificationCategory) - if err := json.Unmarshal(data, &categories); err != nil { - return fmt.Errorf("failed to unmarshal notification categories: %v", err) + if err := json.Unmarshal(categoriesData, &categories); err != nil { + return fmt.Errorf("failed to unmarshal notification categories: %w", err) } ln.categoriesLock.Lock() @@ -799,19 +424,177 @@ func (ln *linuxNotifier) loadCategories() error { return nil } -func (r closedReason) string() string { - switch r { - case 1: - return "expired" - case 2: - return "dismissed-by-user" - case 3: - return "closed-by-call" - case 4: - return "unknown" - case 5: - return "activated-by-user" - default: - return "other" +// Setup signal handling for notification actions. +func (ln *linuxNotifier) setupSignalHandling() error { + if err := ln.conn.AddMatchSignal( + dbus.WithMatchInterface(dbusNotificationInterface), + dbus.WithMatchMember("ActionInvoked"), + ); err != nil { + return err + } + + if err := ln.conn.AddMatchSignal( + dbus.WithMatchInterface(dbusNotificationInterface), + dbus.WithMatchMember("NotificationClosed"), + ); err != nil { + return err + } + + go ln.handleSignals() + + return nil +} + +// Handle incoming D-Bus signals. +func (ln *linuxNotifier) handleSignals() { + c := make(chan *dbus.Signal, 10) + ln.conn.Signal(c) + + for signal := range c { + switch signal.Name { + case dbusNotificationInterface + ".ActionInvoked": + ln.handleActionInvoked(signal) + case dbusNotificationInterface + ".NotificationClosed": + ln.handleNotificationClosed(signal) + } } } + +// Handle ActionInvoked signal. +func (ln *linuxNotifier) handleActionInvoked(signal *dbus.Signal) { + if len(signal.Body) < 2 { + return + } + + notifID, ok := signal.Body[0].(uint32) + if !ok { + return + } + + actionID, ok := signal.Body[1].(string) + if !ok { + return + } + + ln.activeNotifsLock.RLock() + identifier, idExists := ln.activeNotifs[notifID] + metadata, metaExists := ln.notificationMeta[notifID] + ln.activeNotifsLock.RUnlock() + + if !idExists || !metaExists { + return + } + + response := NotificationResponse{ + ID: identifier, + ActionIdentifier: actionID, + } + + if title, ok := metadata["title"].(string); ok { + response.Title = title + } + + if subtitle, ok := metadata["subtitle"].(string); ok { + response.Subtitle = subtitle + } + + if body, ok := metadata["body"].(string); ok { + response.Body = body + } + + if categoryID, ok := metadata["categoryId"].(string); ok { + response.CategoryID = categoryID + } + + if userData, ok := metadata["data"].(map[string]interface{}); ok { + response.UserInfo = userData + } + + if actionID == DefaultActionIdentifier { + response.ActionIdentifier = DefaultActionIdentifier + } + + result := NotificationResult{ + Response: response, + } + + if ns := getNotificationService(); ns != nil { + ns.handleNotificationResult(result) + } + + ln.activeNotifsLock.Lock() + delete(ln.activeNotifs, notifID) + delete(ln.notificationMeta, notifID) + ln.activeNotifsLock.Unlock() +} + +// Handle NotificationClosed signal. +// The second parameter contains the close reason: +// 1 - expired timeout +// 2 - dismissed by user (click on X) +// 3 - closed by CloseNotification call +// 4 - undefined/reserved +func (ln *linuxNotifier) handleNotificationClosed(signal *dbus.Signal) { + if len(signal.Body) < 1 { + return + } + + notifID, ok := signal.Body[0].(uint32) + if !ok { + return + } + + var reason uint32 = 0 + if len(signal.Body) > 1 { + if r, ok := signal.Body[1].(uint32); ok { + reason = r + } + } + + if reason != 1 && reason != 3 { + ln.activeNotifsLock.RLock() + identifier, idExists := ln.activeNotifs[notifID] + metadata, metaExists := ln.notificationMeta[notifID] + ln.activeNotifsLock.RUnlock() + + if idExists && metaExists { + response := NotificationResponse{ + ID: identifier, + ActionIdentifier: DefaultActionIdentifier, + } + + if title, ok := metadata["title"].(string); ok { + response.Title = title + } + + if subtitle, ok := metadata["subtitle"].(string); ok { + response.Subtitle = subtitle + } + + if body, ok := metadata["body"].(string); ok { + response.Body = body + } + + if categoryID, ok := metadata["categoryId"].(string); ok { + response.CategoryID = categoryID + } + + if userData, ok := metadata["data"].(map[string]interface{}); ok { + response.UserInfo = userData + } + + result := NotificationResult{ + Response: response, + } + + if ns := getNotificationService(); ns != nil { + ns.handleNotificationResult(result) + } + } + } + + ln.activeNotifsLock.Lock() + delete(ln.activeNotifs, notifID) + delete(ln.notificationMeta, notifID) + ln.activeNotifsLock.Unlock() +} diff --git a/v3/pkg/services/notifications/notifications_windows.go b/v3/pkg/services/notifications/notifications_windows.go index 30abd61b1..dde22ec30 100644 --- a/v3/pkg/services/notifications/notifications_windows.go +++ b/v3/pkg/services/notifications/notifications_windows.go @@ -141,7 +141,7 @@ func (wn *windowsNotifier) CheckNotificationAuthorization() (bool, error) { } // SendNotification sends a basic notification with a name, title, and body. All other options are ignored on Windows. -// (subtitle is only available on macOS) +// (subtitle is only available on macOS and Linux) func (wn *windowsNotifier) SendNotification(options NotificationOptions) error { if err := wn.saveIconToDir(); err != nil { fmt.Printf("Error saving icon: %v\n", err) @@ -167,7 +167,7 @@ func (wn *windowsNotifier) SendNotification(options NotificationOptions) error { // SendNotificationWithActions sends a notification with additional actions and inputs. // A NotificationCategory must be registered with RegisterNotificationCategory first. The `CategoryID` must match the registered category. // If a NotificationCategory is not registered a basic notification will be sent. -// (subtitle is only available on macOS) +// (subtitle is only available on macOS and Linux) func (wn *windowsNotifier) SendNotificationWithActions(options NotificationOptions) error { if err := wn.saveIconToDir(); err != nil { fmt.Printf("Error saving icon: %v\n", err) From 5ddb27fd3fcb2895f924287c733d9cedea7e93c6 Mon Sep 17 00:00:00 2001 From: popaprozac Date: Sat, 22 Mar 2025 23:07:44 -0700 Subject: [PATCH 199/374] move chan creation on macos and handle linux shutdown --- .../notifications/notifications_darwin.go | 13 ++-- .../notifications/notifications_linux.go | 61 ++++++++++++------- 2 files changed, 45 insertions(+), 29 deletions(-) diff --git a/v3/pkg/services/notifications/notifications_darwin.go b/v3/pkg/services/notifications/notifications_darwin.go index e27d6f010..1a64cbb9e 100644 --- a/v3/pkg/services/notifications/notifications_darwin.go +++ b/v3/pkg/services/notifications/notifications_darwin.go @@ -112,8 +112,6 @@ func (dn *darwinNotifier) SendNotification(options NotificationOptions) error { ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() - id, resultCh := dn.registerChannel() - cIdentifier := C.CString(options.ID) cTitle := C.CString(options.Title) cSubtitle := C.CString(options.Subtitle) @@ -133,6 +131,7 @@ func (dn *darwinNotifier) SendNotification(options NotificationOptions) error { defer C.free(unsafe.Pointer(cDataJSON)) } + id, resultCh := dn.registerChannel() C.sendNotification(C.int(id), cIdentifier, cTitle, cSubtitle, cBody, cDataJSON) select { @@ -157,8 +156,6 @@ func (dn *darwinNotifier) SendNotificationWithActions(options NotificationOption ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() - id, resultCh := dn.registerChannel() - cIdentifier := C.CString(options.ID) cTitle := C.CString(options.Title) cSubtitle := C.CString(options.Subtitle) @@ -180,7 +177,9 @@ func (dn *darwinNotifier) SendNotificationWithActions(options NotificationOption defer C.free(unsafe.Pointer(cDataJSON)) } + id, resultCh := dn.registerChannel() C.sendNotificationWithActions(C.int(id), cIdentifier, cTitle, cSubtitle, cBody, cCategoryID, cDataJSON) + select { case result := <-resultCh: if !result.Success { @@ -202,8 +201,6 @@ func (dn *darwinNotifier) RegisterNotificationCategory(category NotificationCate ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() - id, resultCh := dn.registerChannel() - cCategoryID := C.CString(category.ID) defer C.free(unsafe.Pointer(cCategoryID)) @@ -222,6 +219,7 @@ func (dn *darwinNotifier) RegisterNotificationCategory(category NotificationCate defer C.free(unsafe.Pointer(cReplyButtonTitle)) } + id, resultCh := dn.registerChannel() C.registerNotificationCategory(C.int(id), cCategoryID, cActionsJSON, C.bool(category.HasReplyField), cReplyPlaceholder, cReplyButtonTitle) @@ -245,11 +243,10 @@ func (dn *darwinNotifier) RemoveNotificationCategory(categoryId string) error { ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() - id, resultCh := dn.registerChannel() - cCategoryID := C.CString(categoryId) defer C.free(unsafe.Pointer(cCategoryID)) + id, resultCh := dn.registerChannel() C.removeNotificationCategory(C.int(id), cCategoryID) select { diff --git a/v3/pkg/services/notifications/notifications_linux.go b/v3/pkg/services/notifications/notifications_linux.go index 911bba8c4..6c0ed299e 100644 --- a/v3/pkg/services/notifications/notifications_linux.go +++ b/v3/pkg/services/notifications/notifications_linux.go @@ -22,6 +22,7 @@ type linuxNotifier struct { notificationMeta map[uint32]map[string]interface{} activeNotifsLock sync.RWMutex appName string + cancel context.CancelFunc } const ( @@ -63,7 +64,11 @@ func (ln *linuxNotifier) Startup(ctx context.Context, options application.Servic fmt.Printf("Failed to load notification categories: %v\n", err) } - if err := ln.setupSignalHandling(); err != nil { + var signalCtx context.Context + signalCtx, ln.cancel = context.WithCancel(context.Background()) + + // Set up signal handling for notification actions + if err := ln.setupSignalHandling(signalCtx); err != nil { return fmt.Errorf("failed to set up notification signal handling: %w", err) } @@ -72,15 +77,13 @@ func (ln *linuxNotifier) Startup(ctx context.Context, options application.Servic // Shutdown will save categories and close the D-Bus connection when the service unloads func (ln *linuxNotifier) Shutdown() error { + ln.cancel() + if err := ln.saveCategories(); err != nil { fmt.Printf("Failed to save notification categories: %v\n", err) } - if ln.conn != nil { - return ln.conn.Close() - } - - return nil + return ln.conn.Close() } // RequestNotificationAuthorization is a Linux stub that always returns true, nil. @@ -126,7 +129,7 @@ func (ln *linuxNotifier) SendNotification(options NotificationOptions) error { hints["x-wails-metadata"] = dbus.MakeVariant(string(metadataJSON)) actions := []string{} - timeout := int32(0) // Timeout in milliseconds (5 seconds) + timeout := int32(0) // Call the Notify method on the D-Bus interface obj := ln.conn.Object(dbusNotificationInterface, dbusNotificationPath) @@ -153,15 +156,18 @@ func (ln *linuxNotifier) SendNotification(options NotificationOptions) error { } ln.activeNotifsLock.Lock() + ln.activeNotifs[notifID] = options.ID - ln.notificationMeta[notifID] = map[string]interface{}{ + metadata := map[string]interface{}{ "id": options.ID, "title": options.Title, "subtitle": options.Subtitle, "body": options.Body, "data": options.Data, } + + ln.notificationMeta[notifID] = metadata ln.activeNotifsLock.Unlock() return nil @@ -267,7 +273,9 @@ func (ln *linuxNotifier) RegisterNotificationCategory(category NotificationCateg ln.categories[category.ID] = category - go ln.saveCategories() + if err := ln.saveCategories(); err != nil { + fmt.Printf("Failed to save notification categories: %v\n", err) + } return nil } @@ -279,7 +287,9 @@ func (ln *linuxNotifier) RemoveNotificationCategory(categoryId string) error { delete(ln.categories, categoryId) - go ln.saveCategories() + if err := ln.saveCategories(); err != nil { + fmt.Printf("Failed to save notification categories: %v\n", err) + } return nil } @@ -425,7 +435,7 @@ func (ln *linuxNotifier) loadCategories() error { } // Setup signal handling for notification actions. -func (ln *linuxNotifier) setupSignalHandling() error { +func (ln *linuxNotifier) setupSignalHandling(ctx context.Context) error { if err := ln.conn.AddMatchSignal( dbus.WithMatchInterface(dbusNotificationInterface), dbus.WithMatchMember("ActionInvoked"), @@ -440,22 +450,31 @@ func (ln *linuxNotifier) setupSignalHandling() error { return err } - go ln.handleSignals() + c := make(chan *dbus.Signal, 10) + ln.conn.Signal(c) + + go ln.handleSignals(ctx, c) return nil } // Handle incoming D-Bus signals. -func (ln *linuxNotifier) handleSignals() { - c := make(chan *dbus.Signal, 10) - ln.conn.Signal(c) +func (ln *linuxNotifier) handleSignals(ctx context.Context, c chan *dbus.Signal) { + for { + select { + case <-ctx.Done(): + return + case signal, ok := <-c: + if !ok { + return + } - for signal := range c { - switch signal.Name { - case dbusNotificationInterface + ".ActionInvoked": - ln.handleActionInvoked(signal) - case dbusNotificationInterface + ".NotificationClosed": - ln.handleNotificationClosed(signal) + switch signal.Name { + case dbusNotificationInterface + ".ActionInvoked": + ln.handleActionInvoked(signal) + case dbusNotificationInterface + ".NotificationClosed": + ln.handleNotificationClosed(signal) + } } } } From a68391880c81cf6f673934174cf198eb9bb9471e Mon Sep 17 00:00:00 2001 From: popaprozac Date: Sun, 23 Mar 2025 00:05:20 -0700 Subject: [PATCH 200/374] remove deadlock --- v3/pkg/services/notifications/notifications_linux.go | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/v3/pkg/services/notifications/notifications_linux.go b/v3/pkg/services/notifications/notifications_linux.go index 6c0ed299e..cfc068c32 100644 --- a/v3/pkg/services/notifications/notifications_linux.go +++ b/v3/pkg/services/notifications/notifications_linux.go @@ -129,7 +129,6 @@ func (ln *linuxNotifier) SendNotification(options NotificationOptions) error { hints["x-wails-metadata"] = dbus.MakeVariant(string(metadataJSON)) actions := []string{} - timeout := int32(0) // Call the Notify method on the D-Bus interface obj := ln.conn.Object(dbusNotificationInterface, dbusNotificationPath) @@ -143,7 +142,7 @@ func (ln *linuxNotifier) SendNotification(options NotificationOptions) error { body, actions, hints, - timeout, + uint32(0), ) if call.Err != nil { @@ -156,7 +155,6 @@ func (ln *linuxNotifier) SendNotification(options NotificationOptions) error { } ln.activeNotifsLock.Lock() - ln.activeNotifs[notifID] = options.ID metadata := map[string]interface{}{ @@ -221,8 +219,6 @@ func (ln *linuxNotifier) SendNotificationWithActions(options NotificationOptions } hints["x-wails-metadata"] = dbus.MakeVariant(string(metadataJSON)) - timeout := int32(0) - obj := ln.conn.Object(dbusNotificationInterface, dbusNotificationPath) call := obj.Call( dbusNotificationInterface+".Notify", @@ -234,7 +230,7 @@ func (ln *linuxNotifier) SendNotificationWithActions(options NotificationOptions body, actions, hints, - timeout, + uint32(0), ) if call.Err != nil { @@ -481,7 +477,7 @@ func (ln *linuxNotifier) handleSignals(ctx context.Context, c chan *dbus.Signal) // Handle ActionInvoked signal. func (ln *linuxNotifier) handleActionInvoked(signal *dbus.Signal) { - if len(signal.Body) < 2 { + if len(signal.Body) < 1 { return } From 9a4542347dcc968e0ce0733dfff5c7042264ad27 Mon Sep 17 00:00:00 2001 From: popaprozac Date: Sun, 23 Mar 2025 23:40:03 -0700 Subject: [PATCH 201/374] follow dbus spec --- .../notifications/notifications_linux.go | 360 ++++++++---------- .../notifications/notifications_windows.go | 8 +- 2 files changed, 159 insertions(+), 209 deletions(-) diff --git a/v3/pkg/services/notifications/notifications_linux.go b/v3/pkg/services/notifications/notifications_linux.go index cfc068c32..bdc8312ff 100644 --- a/v3/pkg/services/notifications/notifications_linux.go +++ b/v3/pkg/services/notifications/notifications_linux.go @@ -15,14 +15,24 @@ import ( ) type linuxNotifier struct { - conn *dbus.Conn - categories map[string]NotificationCategory - categoriesLock sync.RWMutex - activeNotifs map[uint32]string - notificationMeta map[uint32]map[string]interface{} - activeNotifsLock sync.RWMutex - appName string - cancel context.CancelFunc + conn *dbus.Conn + categories map[string]NotificationCategory + categoriesLock sync.RWMutex + notifications map[uint32]*notificationData + notificationsLock sync.RWMutex + appName string + cancel context.CancelFunc +} + +type notificationData struct { + ID string + Title string + Subtitle string + Body string + CategoryID string + Data map[string]interface{} + DBusID uint32 + ActionMap map[string]string } const ( @@ -34,9 +44,8 @@ const ( func New() *Service { notificationServiceOnce.Do(func() { impl := &linuxNotifier{ - categories: make(map[string]NotificationCategory), - activeNotifs: make(map[uint32]string), - notificationMeta: make(map[uint32]map[string]interface{}), + categories: make(map[string]NotificationCategory), + notifications: make(map[uint32]*notificationData), } NotificationService = &Service{ @@ -47,12 +56,9 @@ func New() *Service { return NotificationService } -// Startup is called when the service is loaded +// Startup is called when the service is loaded. func (ln *linuxNotifier) Startup(ctx context.Context, options application.ServiceOptions) error { - app := application.Get() - if app != nil && app.Config().Name != "" { - ln.appName = app.Config().Name - } + ln.appName = application.Get().Config().Name conn, err := dbus.ConnectSessionBus() if err != nil { @@ -67,7 +73,6 @@ func (ln *linuxNotifier) Startup(ctx context.Context, options application.Servic var signalCtx context.Context signalCtx, ln.cancel = context.WithCancel(context.Background()) - // Set up signal handling for notification actions if err := ln.setupSignalHandling(signalCtx); err != nil { return fmt.Errorf("failed to set up notification signal handling: %w", err) } @@ -75,15 +80,20 @@ func (ln *linuxNotifier) Startup(ctx context.Context, options application.Servic return nil } -// Shutdown will save categories and close the D-Bus connection when the service unloads +// Shutdown will save categories and close the D-Bus connection when the service unloads. func (ln *linuxNotifier) Shutdown() error { - ln.cancel() + if ln.cancel != nil { + ln.cancel() + } if err := ln.saveCategories(); err != nil { fmt.Printf("Failed to save notification categories: %v\n", err) } - return ln.conn.Close() + if ln.conn != nil { + return ln.conn.Close() + } + return nil } // RequestNotificationAuthorization is a Linux stub that always returns true, nil. @@ -102,34 +112,27 @@ func (ln *linuxNotifier) CheckNotificationAuthorization() (bool, error) { func (ln *linuxNotifier) SendNotification(options NotificationOptions) error { hints := map[string]dbus.Variant{} - // Use subtitle as part of the body if provided body := options.Body if options.Subtitle != "" { body = options.Subtitle + "\n" + body } + defaultActionID := "default" + actions := []string{defaultActionID, "Default"} + + actionMap := map[string]string{ + defaultActionID: DefaultActionIdentifier, + } + + hints["x-notification-id"] = dbus.MakeVariant(options.ID) + if options.Data != nil { - jsonData, err := json.Marshal(options.Data) - if err != nil { - return fmt.Errorf("failed to marshal notification data: %w", err) + userData, err := json.Marshal(options.Data) + if err == nil { + hints["x-user-data"] = dbus.MakeVariant(string(userData)) } - hints["x-user-info"] = dbus.MakeVariant(string(jsonData)) } - metadataJSON, err := json.Marshal(map[string]interface{}{ - "id": options.ID, - "title": options.Title, - "subtitle": options.Subtitle, - "body": options.Body, - "data": options.Data, - }) - if err != nil { - return fmt.Errorf("failed to marshal notification metadata: %w", err) - } - hints["x-wails-metadata"] = dbus.MakeVariant(string(metadataJSON)) - - actions := []string{} - // Call the Notify method on the D-Bus interface obj := ln.conn.Object(dbusNotificationInterface, dbusNotificationPath) call := obj.Call( @@ -142,37 +145,36 @@ func (ln *linuxNotifier) SendNotification(options NotificationOptions) error { body, actions, hints, - uint32(0), + int32(-1), ) if call.Err != nil { return fmt.Errorf("failed to send notification: %w", call.Err) } - var notifID uint32 - if err := call.Store(¬ifID); err != nil { + var dbusID uint32 + if err := call.Store(&dbusID); err != nil { return fmt.Errorf("failed to store notification ID: %w", err) } - ln.activeNotifsLock.Lock() - ln.activeNotifs[notifID] = options.ID - - metadata := map[string]interface{}{ - "id": options.ID, - "title": options.Title, - "subtitle": options.Subtitle, - "body": options.Body, - "data": options.Data, + notification := ¬ificationData{ + ID: options.ID, + Title: options.Title, + Subtitle: options.Subtitle, + Body: options.Body, + Data: options.Data, + DBusID: dbusID, + ActionMap: actionMap, } - ln.notificationMeta[notifID] = metadata - ln.activeNotifsLock.Unlock() + ln.notificationsLock.Lock() + ln.notifications[dbusID] = notification + ln.notificationsLock.Unlock() return nil } // SendNotificationWithActions sends a notification with additional actions. -// (Inputs are only supported on macOS and Windows) func (ln *linuxNotifier) SendNotificationWithActions(options NotificationOptions) error { ln.categoriesLock.RLock() category, exists := ln.categories[options.CategoryID] @@ -183,42 +185,36 @@ func (ln *linuxNotifier) SendNotificationWithActions(options NotificationOptions return ln.SendNotification(options) } - // Use subtitle as part of the body if provided body := options.Body if options.Subtitle != "" { body = options.Subtitle + "\n" + body } var actions []string + actionMap := make(map[string]string) + + defaultActionID := "default" + actions = append(actions, defaultActionID, "Default") + actionMap[defaultActionID] = DefaultActionIdentifier + for _, action := range category.Actions { actions = append(actions, action.ID, action.Title) + actionMap[action.ID] = action.ID } hints := map[string]dbus.Variant{} + hints["x-notification-id"] = dbus.MakeVariant(options.ID) + + hints["x-category-id"] = dbus.MakeVariant(options.CategoryID) + if options.Data != nil { - jsonData, err := json.Marshal(options.Data) - if err != nil { - return fmt.Errorf("failed to marshal notification data: %w", err) + userData, err := json.Marshal(options.Data) + if err == nil { + hints["x-user-data"] = dbus.MakeVariant(string(userData)) } - hints["x-user-info"] = dbus.MakeVariant(string(jsonData)) } - hints["category"] = dbus.MakeVariant(options.CategoryID) - - metadataJSON, err := json.Marshal(map[string]interface{}{ - "id": options.ID, - "title": options.Title, - "subtitle": options.Subtitle, - "body": options.Body, - "categoryId": options.CategoryID, - "data": options.Data, - }) - if err != nil { - return fmt.Errorf("failed to marshal notification metadata: %w", err) - } - hints["x-wails-metadata"] = dbus.MakeVariant(string(metadataJSON)) - obj := ln.conn.Object(dbusNotificationInterface, dbusNotificationPath) call := obj.Call( dbusNotificationInterface+".Notify", @@ -230,44 +226,41 @@ func (ln *linuxNotifier) SendNotificationWithActions(options NotificationOptions body, actions, hints, - uint32(0), + int32(-1), ) if call.Err != nil { return fmt.Errorf("failed to send notification: %w", call.Err) } - var notifID uint32 - if err := call.Store(¬ifID); err != nil { + var dbusID uint32 + if err := call.Store(&dbusID); err != nil { return fmt.Errorf("failed to store notification ID: %w", err) } - ln.activeNotifsLock.Lock() - - ln.activeNotifs[notifID] = options.ID - - metadata := map[string]interface{}{ - "id": options.ID, - "title": options.Title, - "subtitle": options.Subtitle, - "body": options.Body, - "categoryId": options.CategoryID, - "data": options.Data, + notification := ¬ificationData{ + ID: options.ID, + Title: options.Title, + Subtitle: options.Subtitle, + Body: options.Body, + CategoryID: options.CategoryID, + Data: options.Data, + DBusID: dbusID, + ActionMap: actionMap, } - ln.notificationMeta[notifID] = metadata - ln.activeNotifsLock.Unlock() + ln.notificationsLock.Lock() + ln.notifications[dbusID] = notification + ln.notificationsLock.Unlock() return nil } // RegisterNotificationCategory registers a new NotificationCategory to be used with SendNotificationWithActions. -// Registering a category with the same name as a previously registered NotificationCategory will override it. func (ln *linuxNotifier) RegisterNotificationCategory(category NotificationCategory) error { ln.categoriesLock.Lock() - defer ln.categoriesLock.Unlock() - ln.categories[category.ID] = category + ln.categoriesLock.Unlock() if err := ln.saveCategories(); err != nil { fmt.Printf("Failed to save notification categories: %v\n", err) @@ -279,9 +272,8 @@ func (ln *linuxNotifier) RegisterNotificationCategory(category NotificationCateg // RemoveNotificationCategory removes a previously registered NotificationCategory. func (ln *linuxNotifier) RemoveNotificationCategory(categoryId string) error { ln.categoriesLock.Lock() - defer ln.categoriesLock.Unlock() - delete(ln.categories, categoryId) + ln.categoriesLock.Unlock() if err := ln.saveCategories(); err != nil { fmt.Printf("Failed to save notification categories: %v\n", err) @@ -290,17 +282,16 @@ func (ln *linuxNotifier) RemoveNotificationCategory(categoryId string) error { return nil } -// RemoveAllPendingNotifications is not directly supported in Linux D-Bus -// but we can try to remove all active notifications. +// RemoveAllPendingNotifications attempts to remove all active notifications. func (ln *linuxNotifier) RemoveAllPendingNotifications() error { - ln.activeNotifsLock.RLock() - notifIDs := make([]uint32, 0, len(ln.activeNotifs)) - for id := range ln.activeNotifs { - notifIDs = append(notifIDs, id) + ln.notificationsLock.Lock() + dbusIDs := make([]uint32, 0, len(ln.notifications)) + for id := range ln.notifications { + dbusIDs = append(dbusIDs, id) } - ln.activeNotifsLock.RUnlock() + ln.notificationsLock.Unlock() - for _, id := range notifIDs { + for _, id := range dbusIDs { ln.closeNotification(id) } @@ -309,24 +300,24 @@ func (ln *linuxNotifier) RemoveAllPendingNotifications() error { // RemovePendingNotification removes a pending notification. func (ln *linuxNotifier) RemovePendingNotification(identifier string) error { - var notifID uint32 + var dbusID uint32 found := false - ln.activeNotifsLock.RLock() - for id, ident := range ln.activeNotifs { - if ident == identifier { - notifID = id + ln.notificationsLock.Lock() + for id, notif := range ln.notifications { + if notif.ID == identifier { + dbusID = id found = true break } } - ln.activeNotifsLock.RUnlock() + ln.notificationsLock.Unlock() if !found { return nil } - return ln.closeNotification(notifID) + return ln.closeNotification(dbusID) } // RemoveAllDeliveredNotifications functionally equivalent to RemoveAllPendingNotification on Linux. @@ -353,15 +344,9 @@ func (ln *linuxNotifier) closeNotification(id uint32) error { return fmt.Errorf("failed to close notification: %w", call.Err) } - ln.activeNotifsLock.Lock() - delete(ln.activeNotifs, id) - delete(ln.notificationMeta, id) - ln.activeNotifsLock.Unlock() - return nil } -// Get the config directory for the app. func (ln *linuxNotifier) getConfigDir() (string, error) { configDir, err := os.UserConfigDir() if err != nil { @@ -477,11 +462,11 @@ func (ln *linuxNotifier) handleSignals(ctx context.Context, c chan *dbus.Signal) // Handle ActionInvoked signal. func (ln *linuxNotifier) handleActionInvoked(signal *dbus.Signal) { - if len(signal.Body) < 1 { + if len(signal.Body) < 2 { return } - notifID, ok := signal.Body[0].(uint32) + dbusID, ok := signal.Body[0].(uint32) if !ok { return } @@ -491,42 +476,30 @@ func (ln *linuxNotifier) handleActionInvoked(signal *dbus.Signal) { return } - ln.activeNotifsLock.RLock() - identifier, idExists := ln.activeNotifs[notifID] - metadata, metaExists := ln.notificationMeta[notifID] - ln.activeNotifsLock.RUnlock() + ln.notificationsLock.Lock() + notification, exists := ln.notifications[dbusID] + if exists { + delete(ln.notifications, dbusID) + } + ln.notificationsLock.Unlock() - if !idExists || !metaExists { + if !exists { return } + appActionID, ok := notification.ActionMap[actionID] + if !ok { + appActionID = actionID + } + response := NotificationResponse{ - ID: identifier, - ActionIdentifier: actionID, - } - - if title, ok := metadata["title"].(string); ok { - response.Title = title - } - - if subtitle, ok := metadata["subtitle"].(string); ok { - response.Subtitle = subtitle - } - - if body, ok := metadata["body"].(string); ok { - response.Body = body - } - - if categoryID, ok := metadata["categoryId"].(string); ok { - response.CategoryID = categoryID - } - - if userData, ok := metadata["data"].(map[string]interface{}); ok { - response.UserInfo = userData - } - - if actionID == DefaultActionIdentifier { - response.ActionIdentifier = DefaultActionIdentifier + ID: notification.ID, + ActionIdentifier: appActionID, + Title: notification.Title, + Subtitle: notification.Subtitle, + Body: notification.Body, + CategoryID: notification.CategoryID, + UserInfo: notification.Data, } result := NotificationResult{ @@ -536,80 +509,57 @@ func (ln *linuxNotifier) handleActionInvoked(signal *dbus.Signal) { if ns := getNotificationService(); ns != nil { ns.handleNotificationResult(result) } - - ln.activeNotifsLock.Lock() - delete(ln.activeNotifs, notifID) - delete(ln.notificationMeta, notifID) - ln.activeNotifsLock.Unlock() } // Handle NotificationClosed signal. -// The second parameter contains the close reason: +// Reason codes: // 1 - expired timeout // 2 - dismissed by user (click on X) // 3 - closed by CloseNotification call // 4 - undefined/reserved func (ln *linuxNotifier) handleNotificationClosed(signal *dbus.Signal) { - if len(signal.Body) < 1 { + if len(signal.Body) < 2 { return } - notifID, ok := signal.Body[0].(uint32) + dbusID, ok := signal.Body[0].(uint32) if !ok { return } - var reason uint32 = 0 - if len(signal.Body) > 1 { - if r, ok := signal.Body[1].(uint32); ok { - reason = r - } + reason, ok := signal.Body[1].(uint32) + if !ok { + reason = 0 // Unknown reason } - if reason != 1 && reason != 3 { - ln.activeNotifsLock.RLock() - identifier, idExists := ln.activeNotifs[notifID] - metadata, metaExists := ln.notificationMeta[notifID] - ln.activeNotifsLock.RUnlock() + ln.notificationsLock.Lock() + notification, exists := ln.notifications[dbusID] + if exists { + delete(ln.notifications, dbusID) + } + ln.notificationsLock.Unlock() - if idExists && metaExists { - response := NotificationResponse{ - ID: identifier, - ActionIdentifier: DefaultActionIdentifier, - } - - if title, ok := metadata["title"].(string); ok { - response.Title = title - } - - if subtitle, ok := metadata["subtitle"].(string); ok { - response.Subtitle = subtitle - } - - if body, ok := metadata["body"].(string); ok { - response.Body = body - } - - if categoryID, ok := metadata["categoryId"].(string); ok { - response.CategoryID = categoryID - } - - if userData, ok := metadata["data"].(map[string]interface{}); ok { - response.UserInfo = userData - } - - result := NotificationResult{ - Response: response, - } - - if ns := getNotificationService(); ns != nil { - ns.handleNotificationResult(result) - } - } + if !exists { + return } - ln.activeNotifsLock.Lock() - delete(ln.activeNotifs, notifID) - delete(ln.notificationMeta, notifID) - ln.activeNotifsLock.Unlock() + if reason == 2 { + response := NotificationResponse{ + ID: notification.ID, + ActionIdentifier: DefaultActionIdentifier, + Title: notification.Title, + Subtitle: notification.Subtitle, + Body: notification.Body, + CategoryID: notification.CategoryID, + UserInfo: notification.Data, + } + + result := NotificationResult{ + Response: response, + } + + if ns := getNotificationService(); ns != nil { + ns.handleNotificationResult(result) + } + } } diff --git a/v3/pkg/services/notifications/notifications_windows.go b/v3/pkg/services/notifications/notifications_windows.go index dde22ec30..d792d6949 100644 --- a/v3/pkg/services/notifications/notifications_windows.go +++ b/v3/pkg/services/notifications/notifications_windows.go @@ -254,25 +254,25 @@ func (wn *windowsNotifier) RemoveNotificationCategory(categoryId string) error { } // RemoveAllPendingNotifications is a Windows stub that always returns nil. -// (macOS-specific) +// (macOS and Linux only) func (wn *windowsNotifier) RemoveAllPendingNotifications() error { return nil } // RemovePendingNotification is a Windows stub that always returns nil. -// (macOS-specific) +// (macOS and Linux only) func (wn *windowsNotifier) RemovePendingNotification(_ string) error { return nil } // RemoveAllDeliveredNotifications is a Windows stub that always returns nil. -// (macOS-specific) +// (macOS and Linux only) func (wn *windowsNotifier) RemoveAllDeliveredNotifications() error { return nil } // RemoveDeliveredNotification is a Windows stub that always returns nil. -// (macOS-specific) +// (macOS and Linux only) func (wn *windowsNotifier) RemoveDeliveredNotification(_ string) error { return nil } From 7f496c971d9178dddb2863c9fbf805c6707f3b3f Mon Sep 17 00:00:00 2001 From: popaprozac Date: Mon, 24 Mar 2025 00:16:45 -0700 Subject: [PATCH 202/374] fix linux note --- v3/pkg/services/notifications/notifications.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v3/pkg/services/notifications/notifications.go b/v3/pkg/services/notifications/notifications.go index d7549fbf9..1e36c7932 100644 --- a/v3/pkg/services/notifications/notifications.go +++ b/v3/pkg/services/notifications/notifications.go @@ -9,7 +9,7 @@ // Platform-specific notes: // - macOS: Requires a properly bundled and signed application // - Windows: Uses Windows Toast notifications -// - Linux: Falls back between D-Bus, notify-send, or other methods and does not support text inputs +// - Linux: Uses D-Bus and does not support text inputs package notifications import ( From 1f821667f2fff02f97abdd21caa65c76a416abfb Mon Sep 17 00:00:00 2001 From: popaprozac Date: Mon, 24 Mar 2025 13:56:47 -0700 Subject: [PATCH 203/374] ensure cat id is set for macOS and other rabbit suggestions --- .../services/notifications/notifications.go | 39 ++++++++++--------- .../notifications/notifications_darwin.m | 2 + 2 files changed, 22 insertions(+), 19 deletions(-) diff --git a/v3/pkg/services/notifications/notifications.go b/v3/pkg/services/notifications/notifications.go index 1e36c7932..1a33d6d56 100644 --- a/v3/pkg/services/notifications/notifications.go +++ b/v3/pkg/services/notifications/notifications.go @@ -60,15 +60,15 @@ var ( notificationServiceLock sync.RWMutex ) -// NotificationAction represents an action button for a notification -type NotificationAction = struct { +// NotificationAction represents an action button for a notification. +type NotificationAction struct { ID string `json:"id,omitempty"` Title string `json:"title,omitempty"` Destructive bool `json:"destructive,omitempty"` // (macOS-specific) } -// NotificationCategory groups actions for notifications -type NotificationCategory = struct { +// NotificationCategory groups actions for notifications. +type NotificationCategory struct { ID string `json:"id,omitempty"` Actions []NotificationAction `json:"actions,omitempty"` HasReplyField bool `json:"hasReplyField,omitempty"` @@ -77,31 +77,32 @@ type NotificationCategory = struct { } // NotificationOptions contains configuration for a notification -type NotificationOptions = struct { - ID string `json:"id,omitempty"` - Title string `json:"title,omitempty"` - Subtitle string `json:"subtitle,omitempty"` // (macOS-specific) +type NotificationOptions struct { + ID string `json:"id"` + Title string `json:"title"` + Subtitle string `json:"subtitle,omitempty"` // (macOS and Linux only) Body string `json:"body,omitempty"` CategoryID string `json:"categoryId,omitempty"` Data map[string]interface{} `json:"data,omitempty"` } -var DefaultActionIdentifier = "DEFAULT_ACTION" +const DefaultActionIdentifier = "DEFAULT_ACTION" -// NotificationResponse represents a user's response to a notification -type NotificationResponse = struct { +// NotificationResponse represents the response sent by interacting with a notification. +type NotificationResponse struct { ID string `json:"id,omitempty"` ActionIdentifier string `json:"actionIdentifier,omitempty"` CategoryID string `json:"categoryIdentifier,omitempty"` Title string `json:"title,omitempty"` - Subtitle string `json:"subtitle,omitempty"` // (macOS-specific) + Subtitle string `json:"subtitle,omitempty"` // (macOS and Linux only) Body string `json:"body,omitempty"` UserText string `json:"userText,omitempty"` UserInfo map[string]interface{} `json:"userInfo,omitempty"` } -// NotificationResult -type NotificationResult = struct { +// NotificationResult represents the result of a notification response, +// returning the response or any errors that occurred. +type NotificationResult struct { Response NotificationResponse Error error } @@ -123,7 +124,7 @@ func (ns *Service) OnNotificationResponse(callback func(result NotificationResul } // handleNotificationResponse is an internal method to handle notification responses -// and invoke the registered callback if one exists +// and invoke the registered callback if one exists. func (ns *Service) handleNotificationResult(result NotificationResult) { ns.callbackLock.RLock() callback := ns.notificationResultCallback @@ -134,17 +135,17 @@ func (ns *Service) handleNotificationResult(result NotificationResult) { } } -// ServiceStartup is called when the service is loaded +// ServiceStartup is called when the service is loaded. func (ns *Service) ServiceStartup(ctx context.Context, options application.ServiceOptions) error { return ns.impl.Startup(ctx, options) } -// ServiceShutdown is called when the service is unloaded +// ServiceShutdown is called when the service is unloaded. func (ns *Service) ServiceShutdown() error { return ns.impl.Shutdown() } -// Public methods that delegate to the implementation +// Public methods that delegate to the implementation. func (ns *Service) RequestNotificationAuthorization() (bool, error) { return ns.impl.RequestNotificationAuthorization() } @@ -201,7 +202,7 @@ func getNotificationService() *Service { return NotificationService } -// validateNotificationOptions validates an ID and Title are provided for notifications +// validateNotificationOptions validates an ID and Title are provided for notifications. func validateNotificationOptions(options NotificationOptions) error { if options.ID == "" { return fmt.Errorf("notification ID cannot be empty") diff --git a/v3/pkg/services/notifications/notifications_darwin.m b/v3/pkg/services/notifications/notifications_darwin.m index cd429c5d6..4ea4918ae 100644 --- a/v3/pkg/services/notifications/notifications_darwin.m +++ b/v3/pkg/services/notifications/notifications_darwin.m @@ -210,6 +210,8 @@ void sendNotificationWithActions(int channelID, const char *identifier, const ch captureResult(channelID, false, [errorMsg UTF8String]); return; } + + content.categoryIdentifier = nsCategoryId; UNTimeIntervalNotificationTrigger *trigger = nil; From b102279630d048b0a26aca0fd9282f2992dd282b Mon Sep 17 00:00:00 2001 From: popaprozac Date: Mon, 24 Mar 2025 16:05:57 -0700 Subject: [PATCH 204/374] update example --- v3/examples/notifications/README.md | 59 ++ v3/examples/notifications/Taskfile.yml | 34 + v3/examples/notifications/build/Taskfile.yml | 86 ++ v3/examples/notifications/build/appicon.png | Bin 0 -> 132625 bytes v3/examples/notifications/build/config.yml | 62 ++ .../notifications/build/darwin/Info.dev.plist | 32 + .../notifications/build/darwin/Info.plist | 27 + .../notifications/build/darwin/Taskfile.yml | 80 ++ .../notifications/build/darwin/icons.icns | Bin 0 -> 356592 bytes .../notifications/build/linux/Taskfile.yml | 119 +++ .../build/linux/appimage/build.sh | 35 + .../notifications/build/linux/nfpm/nfpm.yaml | 50 + .../build/linux/nfpm/scripts/postinstall.sh | 1 + .../build/linux/nfpm/scripts/postremove.sh | 1 + .../build/linux/nfpm/scripts/preinstall.sh | 1 + .../build/linux/nfpm/scripts/preremove.sh | 1 + .../notifications/build/windows/Taskfile.yml | 63 ++ .../notifications/build/windows/icon.ico | Bin 0 -> 21677 bytes .../notifications/build/windows/info.json | 15 + .../build/windows/nsis/project.nsi | 112 +++ .../build/windows/nsis/wails_tools.nsh | 212 ++++ .../build/windows/wails.exe.manifest | 15 + .../v3/pkg/services/notifications/index.js | 25 - .../v3/pkg/services/notifications/index.ts | 13 + .../v3/pkg/services/notifications/models.js | 36 - .../v3/pkg/services/notifications/models.ts | 107 ++ .../v3/pkg/services/notifications/service.js | 131 --- .../v3/pkg/services/notifications/service.ts | 62 ++ v3/examples/notifications/frontend/index.html | 17 +- v3/examples/notifications/frontend/main.js | 67 -- .../notifications/frontend/package-lock.json | 935 ++++++++++++++++++ .../notifications/frontend/package.json | 5 +- .../frontend/public/javascript.svg | 1 - .../notifications/frontend/public/style.css | 67 +- .../frontend/public/typescript.svg | 1 + .../notifications/frontend/src/main.ts | 95 ++ .../notifications/frontend/src/vite-env.d.ts | 1 + .../notifications/frontend/tsconfig.json | 20 + v3/examples/notifications/go.mod | 53 + v3/examples/notifications/main.go | 128 ++- 40 files changed, 2406 insertions(+), 363 deletions(-) create mode 100644 v3/examples/notifications/README.md create mode 100644 v3/examples/notifications/Taskfile.yml create mode 100644 v3/examples/notifications/build/Taskfile.yml create mode 100644 v3/examples/notifications/build/appicon.png create mode 100644 v3/examples/notifications/build/config.yml create mode 100644 v3/examples/notifications/build/darwin/Info.dev.plist create mode 100644 v3/examples/notifications/build/darwin/Info.plist create mode 100644 v3/examples/notifications/build/darwin/Taskfile.yml create mode 100644 v3/examples/notifications/build/darwin/icons.icns create mode 100644 v3/examples/notifications/build/linux/Taskfile.yml create mode 100644 v3/examples/notifications/build/linux/appimage/build.sh create mode 100644 v3/examples/notifications/build/linux/nfpm/nfpm.yaml create mode 100644 v3/examples/notifications/build/linux/nfpm/scripts/postinstall.sh create mode 100644 v3/examples/notifications/build/linux/nfpm/scripts/postremove.sh create mode 100644 v3/examples/notifications/build/linux/nfpm/scripts/preinstall.sh create mode 100644 v3/examples/notifications/build/linux/nfpm/scripts/preremove.sh create mode 100644 v3/examples/notifications/build/windows/Taskfile.yml create mode 100644 v3/examples/notifications/build/windows/icon.ico create mode 100644 v3/examples/notifications/build/windows/info.json create mode 100644 v3/examples/notifications/build/windows/nsis/project.nsi create mode 100644 v3/examples/notifications/build/windows/nsis/wails_tools.nsh create mode 100644 v3/examples/notifications/build/windows/wails.exe.manifest delete mode 100644 v3/examples/notifications/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/index.js create mode 100644 v3/examples/notifications/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/index.ts delete mode 100644 v3/examples/notifications/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/models.js create mode 100644 v3/examples/notifications/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/models.ts delete mode 100644 v3/examples/notifications/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/service.js create mode 100644 v3/examples/notifications/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/service.ts delete mode 100644 v3/examples/notifications/frontend/main.js create mode 100644 v3/examples/notifications/frontend/package-lock.json delete mode 100644 v3/examples/notifications/frontend/public/javascript.svg create mode 100644 v3/examples/notifications/frontend/public/typescript.svg create mode 100644 v3/examples/notifications/frontend/src/main.ts create mode 100644 v3/examples/notifications/frontend/src/vite-env.d.ts create mode 100644 v3/examples/notifications/frontend/tsconfig.json create mode 100644 v3/examples/notifications/go.mod diff --git a/v3/examples/notifications/README.md b/v3/examples/notifications/README.md new file mode 100644 index 000000000..ad12c3f40 --- /dev/null +++ b/v3/examples/notifications/README.md @@ -0,0 +1,59 @@ +# Welcome to Your New Wails3 Project! + +Congratulations on generating your Wails3 application! This README will guide you through the next steps to get your project up and running. + +## Getting Started + +1. Navigate to your project directory in the terminal. + +2. To run your application in development mode, use the following command: + + ``` + wails3 dev + ``` + + This will start your application and enable hot-reloading for both frontend and backend changes. + +3. To build your application for production, use: + + ``` + wails3 build + ``` + + This will create a production-ready executable in the `build` directory. + +## Exploring Wails3 Features + +Now that you have your project set up, it's time to explore the features that Wails3 offers: + +1. **Check out the examples**: The best way to learn is by example. Visit the `examples` directory in the `v3/examples` directory to see various sample applications. + +2. **Run an example**: To run any of the examples, navigate to the example's directory and use: + + ``` + go run . + ``` + + Note: Some examples may be under development during the alpha phase. + +3. **Explore the documentation**: Visit the [Wails3 documentation](https://v3.wails.io/) for in-depth guides and API references. + +4. **Join the community**: Have questions or want to share your progress? Join the [Wails Discord](https://discord.gg/JDdSxwjhGf) or visit the [Wails discussions on GitHub](https://github.com/wailsapp/wails/discussions). + +## Project Structure + +Take a moment to familiarize yourself with your project structure: + +- `frontend/`: Contains your frontend code (HTML, CSS, JavaScript/TypeScript) +- `main.go`: The entry point of your Go backend +- `app.go`: Define your application structure and methods here +- `wails.json`: Configuration file for your Wails project + +## Next Steps + +1. Modify the frontend in the `frontend/` directory to create your desired UI. +2. Add backend functionality in `main.go`. +3. Use `wails3 dev` to see your changes in real-time. +4. When ready, build your application with `wails3 build`. + +Happy coding with Wails3! If you encounter any issues or have questions, don't hesitate to consult the documentation or reach out to the Wails community. diff --git a/v3/examples/notifications/Taskfile.yml b/v3/examples/notifications/Taskfile.yml new file mode 100644 index 000000000..1455cd70c --- /dev/null +++ b/v3/examples/notifications/Taskfile.yml @@ -0,0 +1,34 @@ +version: '3' + +includes: + common: ./build/Taskfile.yml + windows: ./build/windows/Taskfile.yml + darwin: ./build/darwin/Taskfile.yml + linux: ./build/linux/Taskfile.yml + +vars: + APP_NAME: "Notifications\\ Demo" + BIN_DIR: "bin" + VITE_PORT: '{{.WAILS_VITE_PORT | default 9245}}' + +tasks: + build: + summary: Builds the application + cmds: + - task: "{{OS}}:build" + + package: + summary: Packages a production build of the application + cmds: + - task: "{{OS}}:package" + + run: + summary: Runs the application + cmds: + - task: "{{OS}}:run" + + dev: + summary: Runs the application in development mode + cmds: + - wails3 dev -config ./build/config.yml -port {{.VITE_PORT}} + diff --git a/v3/examples/notifications/build/Taskfile.yml b/v3/examples/notifications/build/Taskfile.yml new file mode 100644 index 000000000..5f3517efc --- /dev/null +++ b/v3/examples/notifications/build/Taskfile.yml @@ -0,0 +1,86 @@ +version: '3' + +tasks: + go:mod:tidy: + summary: Runs `go mod tidy` + internal: true + cmds: + - go mod tidy + + install:frontend:deps: + summary: Install frontend dependencies + dir: frontend + sources: + - package.json + - package-lock.json + generates: + - node_modules/* + preconditions: + - sh: npm version + msg: "Looks like npm isn't installed. Npm is part of the Node installer: https://nodejs.org/en/download/" + cmds: + - npm install + + build:frontend: + label: build:frontend (PRODUCTION={{.PRODUCTION}}) + summary: Build the frontend project + dir: frontend + sources: + - "**/*" + generates: + - dist/**/* + deps: + - task: install:frontend:deps + - task: generate:bindings + vars: + BUILD_FLAGS: + ref: .BUILD_FLAGS + cmds: + - npm run {{.BUILD_COMMAND}} -q + env: + PRODUCTION: '{{.PRODUCTION | default "false"}}' + vars: + BUILD_COMMAND: '{{if eq .PRODUCTION "true"}}build{{else}}build:dev{{end}}' + + + generate:bindings: + label: generate:bindings (BUILD_FLAGS={{.BUILD_FLAGS}}) + summary: Generates bindings for the frontend + deps: + - task: go:mod:tidy + sources: + - "**/*.[jt]s" + - exclude: frontend/**/* + - frontend/bindings/**/* # Rerun when switching between dev/production mode causes changes in output + - "**/*.go" + - go.mod + - go.sum + generates: + - frontend/bindings/**/* + cmds: + - wails3 generate bindings -f '{{.BUILD_FLAGS}}' -clean=true -ts + + generate:icons: + summary: Generates Windows `.ico` and Mac `.icns` files from an image + dir: build + sources: + - "appicon.png" + generates: + - "darwin/icons.icns" + - "windows/icon.ico" + cmds: + - wails3 generate icons -input appicon.png -macfilename darwin/icons.icns -windowsfilename windows/icon.ico + + dev:frontend: + summary: Runs the frontend in development mode + dir: frontend + deps: + - task: install:frontend:deps + cmds: + - npm run dev -- --port {{.VITE_PORT}} --strictPort + + update:build-assets: + summary: Updates the build assets + dir: build + cmds: + - wails3 update build-assets -name "{{.APP_NAME}}" -binaryname "{{.APP_NAME}}" -config config.yml -dir . diff --git a/v3/examples/notifications/build/appicon.png b/v3/examples/notifications/build/appicon.png new file mode 100644 index 0000000000000000000000000000000000000000..63617fe4f746b8a878bd5f44725f4f317b9d9850 GIT binary patch literal 132625 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 z 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 DB$9&s literal 0 HcmV?d00001 diff --git a/v3/examples/notifications/build/config.yml b/v3/examples/notifications/build/config.yml new file mode 100644 index 000000000..bc09a6d28 --- /dev/null +++ b/v3/examples/notifications/build/config.yml @@ -0,0 +1,62 @@ +# This file contains the configuration for this project. +# When you update `info` or `fileAssociations`, run `wails3 task common:update:build-assets` to update the assets. +# Note that this will overwrite any changes you have made to the assets. +version: '3' + +# This information is used to generate the build assets. +info: + companyName: "My Company" # The name of the company + productName: "My Product" # The name of the application + productIdentifier: "com.mycompany.myproduct" # The unique product identifier + description: "A program that does X" # The application description + copyright: "(c) 2025, My Company" # Copyright text + comments: "Some Product Comments" # Comments + version: "v0.0.1" # The application version + +# Dev mode configuration +dev_mode: + root_path: . + log_level: warn + debounce: 1000 + ignore: + dir: + - .git + - node_modules + - frontend + - bin + file: + - .DS_Store + - .gitignore + - .gitkeep + watched_extension: + - "*.go" + git_ignore: true + executes: + - cmd: wails3 task common:install:frontend:deps + type: once + - cmd: wails3 task common:dev:frontend + type: background + - cmd: go mod tidy + type: blocking + - cmd: wails3 task build + type: blocking + - cmd: wails3 task run + type: primary + +# File Associations +# More information at: https://v3.wails.io/noit/done/yet +fileAssociations: +# - ext: wails +# name: Wails +# description: Wails Application File +# iconName: wailsFileIcon +# role: Editor +# - ext: jpg +# name: JPEG +# description: Image File +# iconName: jpegFileIcon +# role: Editor + +# Other data +other: + - name: My Other Data \ No newline at end of file diff --git a/v3/examples/notifications/build/darwin/Info.dev.plist b/v3/examples/notifications/build/darwin/Info.dev.plist new file mode 100644 index 000000000..3a5b9735f --- /dev/null +++ b/v3/examples/notifications/build/darwin/Info.dev.plist @@ -0,0 +1,32 @@ + + + + CFBundlePackageType + APPL + CFBundleName + My Product + CFBundleExecutable + Notifications Demo + CFBundleIdentifier + com.wails.notifications-demo + CFBundleVersion + 0.1.0 + CFBundleGetInfoString + This is a comment + CFBundleShortVersionString + 0.1.0 + CFBundleIconFile + icons + LSMinimumSystemVersion + 10.15.0 + NSHighResolutionCapable + true + NSHumanReadableCopyright + © now, My Company + NSAppTransportSecurity + + NSAllowsLocalNetworking + + + + \ No newline at end of file diff --git a/v3/examples/notifications/build/darwin/Info.plist b/v3/examples/notifications/build/darwin/Info.plist new file mode 100644 index 000000000..464270019 --- /dev/null +++ b/v3/examples/notifications/build/darwin/Info.plist @@ -0,0 +1,27 @@ + + + + CFBundlePackageType + APPL + CFBundleName + My Product + CFBundleExecutable + Notifications Demo + CFBundleIdentifier + com.wails.notifications-demo + CFBundleVersion + 0.1.0 + CFBundleGetInfoString + This is a comment + CFBundleShortVersionString + 0.1.0 + CFBundleIconFile + icons + LSMinimumSystemVersion + 10.15.0 + NSHighResolutionCapable + true + NSHumanReadableCopyright + © now, My Company + + \ No newline at end of file diff --git a/v3/examples/notifications/build/darwin/Taskfile.yml b/v3/examples/notifications/build/darwin/Taskfile.yml new file mode 100644 index 000000000..3b6a9dc99 --- /dev/null +++ b/v3/examples/notifications/build/darwin/Taskfile.yml @@ -0,0 +1,80 @@ +version: '3' + +includes: + common: ../Taskfile.yml + +tasks: + build: + summary: Creates a production build of the application + deps: + - task: common:go:mod:tidy + - task: common:build:frontend + vars: + BUILD_FLAGS: + ref: .BUILD_FLAGS + PRODUCTION: + ref: .PRODUCTION + - task: common:generate:icons + cmds: + - go build {{.BUILD_FLAGS}} -o {{.OUTPUT}} + vars: + BUILD_FLAGS: '{{if eq .PRODUCTION "true"}}-tags production -trimpath -buildvcs=false -ldflags="-w -s"{{else}}-buildvcs=false -gcflags=all="-l"{{end}}' + DEFAULT_OUTPUT: '{{.BIN_DIR}}/{{.APP_NAME}}' + OUTPUT: '{{ .OUTPUT | default .DEFAULT_OUTPUT }}' + env: + GOOS: darwin + CGO_ENABLED: 1 + GOARCH: '{{.ARCH | default ARCH}}' + CGO_CFLAGS: "-mmacosx-version-min=10.15" + CGO_LDFLAGS: "-mmacosx-version-min=10.15" + MACOSX_DEPLOYMENT_TARGET: "10.15" + PRODUCTION: '{{.PRODUCTION | default "false"}}' + + build:universal: + summary: Builds darwin universal binary (arm64 + amd64) + deps: + - task: build + vars: + ARCH: amd64 + OUTPUT: "{{.BIN_DIR}}/{{.APP_NAME}}-amd64" + - task: build + vars: + ARCH: arm64 + OUTPUT: "{{.BIN_DIR}}/{{.APP_NAME}}-arm64" + cmds: + - lipo -create -output "{{.BIN_DIR}}/{{.APP_NAME}}" "{{.BIN_DIR}}/{{.APP_NAME}}-amd64" "{{.BIN_DIR}}/{{.APP_NAME}}-arm64" + - rm "{{.BIN_DIR}}/{{.APP_NAME}}-amd64" "{{.BIN_DIR}}/{{.APP_NAME}}-arm64" + + package: + summary: Packages a production build of the application into a `.app` bundle + deps: + - task: build + vars: + PRODUCTION: "true" + cmds: + - task: create:app:bundle + + package:universal: + summary: Packages darwin universal binary (arm64 + amd64) + deps: + - task: build:universal + cmds: + - task: create:app:bundle + + + create:app:bundle: + summary: Creates an `.app` bundle + cmds: + - mkdir -p {{.BIN_DIR}}/{{.APP_NAME}}.app/Contents/{MacOS,Resources} + - cp build/darwin/icons.icns {{.BIN_DIR}}/{{.APP_NAME}}.app/Contents/Resources + - cp {{.BIN_DIR}}/{{.APP_NAME}} {{.BIN_DIR}}/{{.APP_NAME}}.app/Contents/MacOS + - cp build/darwin/Info.plist {{.BIN_DIR}}/{{.APP_NAME}}.app/Contents + + run: + cmds: + - mkdir -p {{.BIN_DIR}}/dev/{{.APP_NAME}}.app/Contents/{MacOS,Resources} + - cp build/darwin/icons.icns {{.BIN_DIR}}/dev/{{.APP_NAME}}.app/Contents/Resources + - cp {{.BIN_DIR}}/{{.APP_NAME}} {{.BIN_DIR}}/dev/{{.APP_NAME}}.app/Contents/MacOS + - cp build/darwin/Info.dev.plist {{.BIN_DIR}}/dev/{{.APP_NAME}}.app/Contents/Info.plist + - codesign --force --deep --sign - {{.BIN_DIR}}/dev/{{.APP_NAME}}.app + - '{{.BIN_DIR}}/dev/{{.APP_NAME}}.app/Contents/MacOS/{{.APP_NAME}}' diff --git a/v3/examples/notifications/build/darwin/icons.icns b/v3/examples/notifications/build/darwin/icons.icns new file mode 100644 index 0000000000000000000000000000000000000000..1b5bd4c86c4533471d6044c5edc0c8c86b87e612 GIT binary patch literal 356592 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

    ^Lg7K@^M66wF^U#m6$MQA`NxZ%~uf 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 KmPKi1yf9{GFYLn7< +description: "My Product Description" +vendor: "My Company" +homepage: "https://wails.io" +license: "MIT" +release: "1" + +contents: + - src: "./bin/notifications" + dst: "/usr/local/bin/notifications" + - src: "./build/appicon.png" + dst: "/usr/share/icons/hicolor/128x128/apps/notifications.png" + - src: "./build/linux/notifications.desktop" + dst: "/usr/share/applications/notifications.desktop" + +depends: + - gtk3 + - libwebkit2gtk + +# replaces: +# - foobar +# provides: +# - bar +# depends: +# - gtk3 +# - libwebkit2gtk +# recommends: +# - whatever +# suggests: +# - something-else +# conflicts: +# - not-foo +# - not-bar +# changelog: "changelog.yaml" +# scripts: +# preinstall: ./build/linux/nfpm/scripts/preinstall.sh +# postinstall: ./build/linux/nfpm/scripts/postinstall.sh +# preremove: ./build/linux/nfpm/scripts/preremove.sh +# postremove: ./build/linux/nfpm/scripts/postremove.sh diff --git a/v3/examples/notifications/build/linux/nfpm/scripts/postinstall.sh b/v3/examples/notifications/build/linux/nfpm/scripts/postinstall.sh new file mode 100644 index 000000000..a9bf588e2 --- /dev/null +++ b/v3/examples/notifications/build/linux/nfpm/scripts/postinstall.sh @@ -0,0 +1 @@ +#!/bin/bash diff --git a/v3/examples/notifications/build/linux/nfpm/scripts/postremove.sh b/v3/examples/notifications/build/linux/nfpm/scripts/postremove.sh new file mode 100644 index 000000000..a9bf588e2 --- /dev/null +++ b/v3/examples/notifications/build/linux/nfpm/scripts/postremove.sh @@ -0,0 +1 @@ +#!/bin/bash diff --git a/v3/examples/notifications/build/linux/nfpm/scripts/preinstall.sh b/v3/examples/notifications/build/linux/nfpm/scripts/preinstall.sh new file mode 100644 index 000000000..a9bf588e2 --- /dev/null +++ b/v3/examples/notifications/build/linux/nfpm/scripts/preinstall.sh @@ -0,0 +1 @@ +#!/bin/bash diff --git a/v3/examples/notifications/build/linux/nfpm/scripts/preremove.sh b/v3/examples/notifications/build/linux/nfpm/scripts/preremove.sh new file mode 100644 index 000000000..a9bf588e2 --- /dev/null +++ b/v3/examples/notifications/build/linux/nfpm/scripts/preremove.sh @@ -0,0 +1 @@ +#!/bin/bash diff --git a/v3/examples/notifications/build/windows/Taskfile.yml b/v3/examples/notifications/build/windows/Taskfile.yml new file mode 100644 index 000000000..534f4fb31 --- /dev/null +++ b/v3/examples/notifications/build/windows/Taskfile.yml @@ -0,0 +1,63 @@ +version: '3' + +includes: + common: ../Taskfile.yml + +tasks: + build: + summary: Builds the application for Windows + deps: + - task: common:go:mod:tidy + - task: common:build:frontend + vars: + BUILD_FLAGS: + ref: .BUILD_FLAGS + PRODUCTION: + ref: .PRODUCTION + - task: common:generate:icons + cmds: + - task: generate:syso + - go build {{.BUILD_FLAGS}} -o {{.BIN_DIR}}/{{.APP_NAME}}.exe + - cmd: powershell Remove-item *.syso + platforms: [windows] + - cmd: rm -f *.syso + platforms: [linux, darwin] + vars: + BUILD_FLAGS: '{{if eq .PRODUCTION "true"}}-tags production -trimpath -buildvcs=false -ldflags="-w -s -H windowsgui"{{else}}-buildvcs=false -gcflags=all="-l"{{end}}' + env: + GOOS: windows + CGO_ENABLED: 0 + GOARCH: '{{.ARCH | default ARCH}}' + PRODUCTION: '{{.PRODUCTION | default "false"}}' + + package: + summary: Packages a production build of the application into a `.exe` bundle + cmds: + - task: create:nsis:installer + + generate:syso: + summary: Generates Windows `.syso` file + dir: build + cmds: + - wails3 generate syso -arch {{.ARCH}} -icon windows/icon.ico -manifest windows/wails.exe.manifest -info windows/info.json -out ../wails_windows_{{.ARCH}}.syso + vars: + ARCH: '{{.ARCH | default ARCH}}' + + create:nsis:installer: + summary: Creates an NSIS installer + dir: build/windows/nsis + deps: + - task: build + vars: + PRODUCTION: "true" + cmds: + # Create the Microsoft WebView2 bootstrapper if it doesn't exist + - wails3 generate webview2bootstrapper -dir "{{.ROOT_DIR}}/build/windows/nsis" + - makensis -DARG_WAILS_{{.ARG_FLAG}}_BINARY="{{.ROOT_DIR}}/{{.BIN_DIR}}/{{.APP_NAME}}.exe" project.nsi + vars: + ARCH: '{{.ARCH | default ARCH}}' + ARG_FLAG: '{{if eq .ARCH "amd64"}}AMD64{{else}}ARM64{{end}}' + + run: + cmds: + - '{{.BIN_DIR}}/{{.APP_NAME}}.exe' diff --git a/v3/examples/notifications/build/windows/icon.ico b/v3/examples/notifications/build/windows/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..bfa0690b7f8aea8d793026b51f9fc4eed2e00af7 GIT binary patch literal 21677 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 ou5=8}@A^#05^yFjv{|%CV0m?W0y8r+H literal 0 HcmV?d00001 diff --git a/v3/examples/notifications/build/windows/info.json b/v3/examples/notifications/build/windows/info.json new file mode 100644 index 000000000..850b2b5b0 --- /dev/null +++ b/v3/examples/notifications/build/windows/info.json @@ -0,0 +1,15 @@ +{ + "fixed": { + "file_version": "0.1.0" + }, + "info": { + "0000": { + "ProductVersion": "0.1.0", + "CompanyName": "My Company", + "FileDescription": "My Product Description", + "LegalCopyright": "© now, My Company", + "ProductName": "My Product", + "Comments": "This is a comment" + } + } +} \ No newline at end of file diff --git a/v3/examples/notifications/build/windows/nsis/project.nsi b/v3/examples/notifications/build/windows/nsis/project.nsi new file mode 100644 index 000000000..4cb18e04f --- /dev/null +++ b/v3/examples/notifications/build/windows/nsis/project.nsi @@ -0,0 +1,112 @@ +Unicode true + +#### +## Please note: Template replacements don't work in this file. They are provided with default defines like +## mentioned underneath. +## If the keyword is not defined, "wails_tools.nsh" will populate them. +## If they are defined here, "wails_tools.nsh" will not touch them. This allows you to use this project.nsi manually +## from outside of Wails for debugging and development of the installer. +## +## For development first make a wails nsis build to populate the "wails_tools.nsh": +## > wails build --target windows/amd64 --nsis +## Then you can call makensis on this file with specifying the path to your binary: +## For a AMD64 only installer: +## > makensis -DARG_WAILS_AMD64_BINARY=..\..\bin\app.exe +## For a ARM64 only installer: +## > makensis -DARG_WAILS_ARM64_BINARY=..\..\bin\app.exe +## For a installer with both architectures: +## > makensis -DARG_WAILS_AMD64_BINARY=..\..\bin\app-amd64.exe -DARG_WAILS_ARM64_BINARY=..\..\bin\app-arm64.exe +#### +## The following information is taken from the wails_tools.nsh file, but they can be overwritten here. +#### +## !define INFO_PROJECTNAME "my-project" # Default "notifications" +## !define INFO_COMPANYNAME "My Company" # Default "My Company" +## !define INFO_PRODUCTNAME "My Product Name" # Default "My Product" +## !define INFO_PRODUCTVERSION "1.0.0" # Default "0.1.0" +## !define INFO_COPYRIGHT "(c) Now, My Company" # Default "© now, My Company" +### +## !define PRODUCT_EXECUTABLE "Application.exe" # Default "${INFO_PROJECTNAME}.exe" +## !define UNINST_KEY_NAME "UninstKeyInRegistry" # Default "${INFO_COMPANYNAME}${INFO_PRODUCTNAME}" +#### +## !define REQUEST_EXECUTION_LEVEL "admin" # Default "admin" see also https://nsis.sourceforge.io/Docs/Chapter4.html +#### +## Include the wails tools +#### +!include "wails_tools.nsh" + +# The version information for this two must consist of 4 parts +VIProductVersion "${INFO_PRODUCTVERSION}.0" +VIFileVersion "${INFO_PRODUCTVERSION}.0" + +VIAddVersionKey "CompanyName" "${INFO_COMPANYNAME}" +VIAddVersionKey "FileDescription" "${INFO_PRODUCTNAME} Installer" +VIAddVersionKey "ProductVersion" "${INFO_PRODUCTVERSION}" +VIAddVersionKey "FileVersion" "${INFO_PRODUCTVERSION}" +VIAddVersionKey "LegalCopyright" "${INFO_COPYRIGHT}" +VIAddVersionKey "ProductName" "${INFO_PRODUCTNAME}" + +# Enable HiDPI support. https://nsis.sourceforge.io/Reference/ManifestDPIAware +ManifestDPIAware true + +!include "MUI.nsh" + +!define MUI_ICON "..\icon.ico" +!define MUI_UNICON "..\icon.ico" +# !define MUI_WELCOMEFINISHPAGE_BITMAP "resources\leftimage.bmp" #Include this to add a bitmap on the left side of the Welcome Page. Must be a size of 164x314 +!define MUI_FINISHPAGE_NOAUTOCLOSE # Wait on the INSTFILES page so the user can take a look into the details of the installation steps +!define MUI_ABORTWARNING # This will warn the user if they exit from the installer. + +!insertmacro MUI_PAGE_WELCOME # Welcome to the installer page. +# !insertmacro MUI_PAGE_LICENSE "resources\eula.txt" # Adds a EULA page to the installer +!insertmacro MUI_PAGE_DIRECTORY # In which folder install page. +!insertmacro MUI_PAGE_INSTFILES # Installing page. +!insertmacro MUI_PAGE_FINISH # Finished installation page. + +!insertmacro MUI_UNPAGE_INSTFILES # Uninstalling page + +!insertmacro MUI_LANGUAGE "English" # Set the Language of the installer + +## The following two statements can be used to sign the installer and the uninstaller. The path to the binaries are provided in %1 +#!uninstfinalize 'signtool --file "%1"' +#!finalize 'signtool --file "%1"' + +Name "${INFO_PRODUCTNAME}" +OutFile "..\..\..\bin\${INFO_PROJECTNAME}-${ARCH}-installer.exe" # Name of the installer's file. +InstallDir "$PROGRAMFILES64\${INFO_COMPANYNAME}\${INFO_PRODUCTNAME}" # Default installing folder ($PROGRAMFILES is Program Files folder). +ShowInstDetails show # This will always show the installation details. + +Function .onInit + !insertmacro wails.checkArchitecture +FunctionEnd + +Section + !insertmacro wails.setShellContext + + !insertmacro wails.webview2runtime + + SetOutPath $INSTDIR + + !insertmacro wails.files + + CreateShortcut "$SMPROGRAMS\${INFO_PRODUCTNAME}.lnk" "$INSTDIR\${PRODUCT_EXECUTABLE}" + CreateShortCut "$DESKTOP\${INFO_PRODUCTNAME}.lnk" "$INSTDIR\${PRODUCT_EXECUTABLE}" + + !insertmacro wails.associateFiles + + !insertmacro wails.writeUninstaller +SectionEnd + +Section "uninstall" + !insertmacro wails.setShellContext + + RMDir /r "$AppData\${PRODUCT_EXECUTABLE}" # Remove the WebView2 DataPath + + RMDir /r $INSTDIR + + Delete "$SMPROGRAMS\${INFO_PRODUCTNAME}.lnk" + Delete "$DESKTOP\${INFO_PRODUCTNAME}.lnk" + + !insertmacro wails.unassociateFiles + + !insertmacro wails.deleteUninstaller +SectionEnd diff --git a/v3/examples/notifications/build/windows/nsis/wails_tools.nsh b/v3/examples/notifications/build/windows/nsis/wails_tools.nsh new file mode 100644 index 000000000..ee4c8ca1a --- /dev/null +++ b/v3/examples/notifications/build/windows/nsis/wails_tools.nsh @@ -0,0 +1,212 @@ +# DO NOT EDIT - Generated automatically by `wails build` + +!include "x64.nsh" +!include "WinVer.nsh" +!include "FileFunc.nsh" + +!ifndef INFO_PROJECTNAME + !define INFO_PROJECTNAME "notifications" +!endif +!ifndef INFO_COMPANYNAME + !define INFO_COMPANYNAME "My Company" +!endif +!ifndef INFO_PRODUCTNAME + !define INFO_PRODUCTNAME "My Product" +!endif +!ifndef INFO_PRODUCTVERSION + !define INFO_PRODUCTVERSION "0.1.0" +!endif +!ifndef INFO_COPYRIGHT + !define INFO_COPYRIGHT "© now, My Company" +!endif +!ifndef PRODUCT_EXECUTABLE + !define PRODUCT_EXECUTABLE "${INFO_PROJECTNAME}.exe" +!endif +!ifndef UNINST_KEY_NAME + !define UNINST_KEY_NAME "${INFO_COMPANYNAME}${INFO_PRODUCTNAME}" +!endif +!define UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINST_KEY_NAME}" + +!ifndef REQUEST_EXECUTION_LEVEL + !define REQUEST_EXECUTION_LEVEL "admin" +!endif + +RequestExecutionLevel "${REQUEST_EXECUTION_LEVEL}" + +!ifdef ARG_WAILS_AMD64_BINARY + !define SUPPORTS_AMD64 +!endif + +!ifdef ARG_WAILS_ARM64_BINARY + !define SUPPORTS_ARM64 +!endif + +!ifdef SUPPORTS_AMD64 + !ifdef SUPPORTS_ARM64 + !define ARCH "amd64_arm64" + !else + !define ARCH "amd64" + !endif +!else + !ifdef SUPPORTS_ARM64 + !define ARCH "arm64" + !else + !error "Wails: Undefined ARCH, please provide at least one of ARG_WAILS_AMD64_BINARY or ARG_WAILS_ARM64_BINARY" + !endif +!endif + +!macro wails.checkArchitecture + !ifndef WAILS_WIN10_REQUIRED + !define WAILS_WIN10_REQUIRED "This product is only supported on Windows 10 (Server 2016) and later." + !endif + + !ifndef WAILS_ARCHITECTURE_NOT_SUPPORTED + !define WAILS_ARCHITECTURE_NOT_SUPPORTED "This product can't be installed on the current Windows architecture. Supports: ${ARCH}" + !endif + + ${If} ${AtLeastWin10} + !ifdef SUPPORTS_AMD64 + ${if} ${IsNativeAMD64} + Goto ok + ${EndIf} + !endif + + !ifdef SUPPORTS_ARM64 + ${if} ${IsNativeARM64} + Goto ok + ${EndIf} + !endif + + IfSilent silentArch notSilentArch + silentArch: + SetErrorLevel 65 + Abort + notSilentArch: + MessageBox MB_OK "${WAILS_ARCHITECTURE_NOT_SUPPORTED}" + Quit + ${else} + IfSilent silentWin notSilentWin + silentWin: + SetErrorLevel 64 + Abort + notSilentWin: + MessageBox MB_OK "${WAILS_WIN10_REQUIRED}" + Quit + ${EndIf} + + ok: +!macroend + +!macro wails.files + !ifdef SUPPORTS_AMD64 + ${if} ${IsNativeAMD64} + File "/oname=${PRODUCT_EXECUTABLE}" "${ARG_WAILS_AMD64_BINARY}" + ${EndIf} + !endif + + !ifdef SUPPORTS_ARM64 + ${if} ${IsNativeARM64} + File "/oname=${PRODUCT_EXECUTABLE}" "${ARG_WAILS_ARM64_BINARY}" + ${EndIf} + !endif +!macroend + +!macro wails.writeUninstaller + WriteUninstaller "$INSTDIR\uninstall.exe" + + SetRegView 64 + WriteRegStr HKLM "${UNINST_KEY}" "Publisher" "${INFO_COMPANYNAME}" + WriteRegStr HKLM "${UNINST_KEY}" "DisplayName" "${INFO_PRODUCTNAME}" + WriteRegStr HKLM "${UNINST_KEY}" "DisplayVersion" "${INFO_PRODUCTVERSION}" + WriteRegStr HKLM "${UNINST_KEY}" "DisplayIcon" "$INSTDIR\${PRODUCT_EXECUTABLE}" + WriteRegStr HKLM "${UNINST_KEY}" "UninstallString" "$\"$INSTDIR\uninstall.exe$\"" + WriteRegStr HKLM "${UNINST_KEY}" "QuietUninstallString" "$\"$INSTDIR\uninstall.exe$\" /S" + + ${GetSize} "$INSTDIR" "/S=0K" $0 $1 $2 + IntFmt $0 "0x%08X" $0 + WriteRegDWORD HKLM "${UNINST_KEY}" "EstimatedSize" "$0" +!macroend + +!macro wails.deleteUninstaller + Delete "$INSTDIR\uninstall.exe" + + SetRegView 64 + DeleteRegKey HKLM "${UNINST_KEY}" +!macroend + +!macro wails.setShellContext + ${If} ${REQUEST_EXECUTION_LEVEL} == "admin" + SetShellVarContext all + ${else} + SetShellVarContext current + ${EndIf} +!macroend + +# Install webview2 by launching the bootstrapper +# See https://docs.microsoft.com/en-us/microsoft-edge/webview2/concepts/distribution#online-only-deployment +!macro wails.webview2runtime + !ifndef WAILS_INSTALL_WEBVIEW_DETAILPRINT + !define WAILS_INSTALL_WEBVIEW_DETAILPRINT "Installing: WebView2 Runtime" + !endif + + SetRegView 64 + # If the admin key exists and is not empty then webview2 is already installed + ReadRegStr $0 HKLM "SOFTWARE\WOW6432Node\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}" "pv" + ${If} $0 != "" + Goto ok + ${EndIf} + + ${If} ${REQUEST_EXECUTION_LEVEL} == "user" + # If the installer is run in user level, check the user specific key exists and is not empty then webview2 is already installed + ReadRegStr $0 HKCU "Software\Microsoft\EdgeUpdate\Clients{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}" "pv" + ${If} $0 != "" + Goto ok + ${EndIf} + ${EndIf} + + SetDetailsPrint both + DetailPrint "${WAILS_INSTALL_WEBVIEW_DETAILPRINT}" + SetDetailsPrint listonly + + InitPluginsDir + CreateDirectory "$pluginsdir\webview2bootstrapper" + SetOutPath "$pluginsdir\webview2bootstrapper" + File "MicrosoftEdgeWebview2Setup.exe" + ExecWait '"$pluginsdir\webview2bootstrapper\MicrosoftEdgeWebview2Setup.exe" /silent /install' + + SetDetailsPrint both + ok: +!macroend + +# Copy of APP_ASSOCIATE and APP_UNASSOCIATE macros from here https://gist.github.com/nikku/281d0ef126dbc215dd58bfd5b3a5cd5b +!macro APP_ASSOCIATE EXT FILECLASS DESCRIPTION ICON COMMANDTEXT COMMAND + ; Backup the previously associated file class + ReadRegStr $R0 SHELL_CONTEXT "Software\Classes\.${EXT}" "" + WriteRegStr SHELL_CONTEXT "Software\Classes\.${EXT}" "${FILECLASS}_backup" "$R0" + + WriteRegStr SHELL_CONTEXT "Software\Classes\.${EXT}" "" "${FILECLASS}" + + WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}" "" `${DESCRIPTION}` + WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\DefaultIcon" "" `${ICON}` + WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell" "" "open" + WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell\open" "" `${COMMANDTEXT}` + WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell\open\command" "" `${COMMAND}` +!macroend + +!macro APP_UNASSOCIATE EXT FILECLASS + ; Backup the previously associated file class + ReadRegStr $R0 SHELL_CONTEXT "Software\Classes\.${EXT}" `${FILECLASS}_backup` + WriteRegStr SHELL_CONTEXT "Software\Classes\.${EXT}" "" "$R0" + + DeleteRegKey SHELL_CONTEXT `Software\Classes\${FILECLASS}` +!macroend + +!macro wails.associateFiles + ; Create file associations + +!macroend + +!macro wails.unassociateFiles + ; Delete app associations + +!macroend \ No newline at end of file diff --git a/v3/examples/notifications/build/windows/wails.exe.manifest b/v3/examples/notifications/build/windows/wails.exe.manifest new file mode 100644 index 000000000..0299e62ca --- /dev/null +++ b/v3/examples/notifications/build/windows/wails.exe.manifest @@ -0,0 +1,15 @@ + + + + + + + + + + + true/pm + permonitorv2,permonitor + + + \ No newline at end of file diff --git a/v3/examples/notifications/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/index.js b/v3/examples/notifications/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/index.js deleted file mode 100644 index eb8893845..000000000 --- a/v3/examples/notifications/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/index.js +++ /dev/null @@ -1,25 +0,0 @@ -// @ts-check -// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL -// This file is automatically generated. DO NOT EDIT - -import * as Service from "./service.js"; -export { - Service -}; - -import * as $models from "./models.js"; - -/** - * NotificationAction represents an action button for a notification - * @typedef {$models.NotificationAction} NotificationAction - */ - -/** - * NotificationCategory groups actions for notifications - * @typedef {$models.NotificationCategory} NotificationCategory - */ - -/** - * NotificationOptions contains configuration for a notification - * @typedef {$models.NotificationOptions} NotificationOptions - */ diff --git a/v3/examples/notifications/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/index.ts b/v3/examples/notifications/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/index.ts new file mode 100644 index 000000000..bbdce6579 --- /dev/null +++ b/v3/examples/notifications/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/index.ts @@ -0,0 +1,13 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +import * as Service from "./service.js"; +export { + Service +}; + +export { + NotificationAction, + NotificationCategory, + NotificationOptions +} from "./models.js"; diff --git a/v3/examples/notifications/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/models.js b/v3/examples/notifications/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/models.js deleted file mode 100644 index 1b53de966..000000000 --- a/v3/examples/notifications/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/models.js +++ /dev/null @@ -1,36 +0,0 @@ -// @ts-check -// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL -// This file is automatically generated. DO NOT EDIT - -// eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-ignore: Unused imports -import {Create as $Create} from "@wailsio/runtime"; - -/** - * NotificationAction represents an action button for a notification - * @typedef {Object} NotificationAction - * @property {string} [id] - * @property {string} [title] - * @property {boolean} [destructive] - (macOS-specific) - */ - -/** - * NotificationCategory groups actions for notifications - * @typedef {Object} NotificationCategory - * @property {string} [id] - * @property {NotificationAction[]} [actions] - * @property {boolean} [hasReplyField] - * @property {string} [replyPlaceholder] - * @property {string} [replyButtonTitle] - */ - -/** - * NotificationOptions contains configuration for a notification - * @typedef {Object} NotificationOptions - * @property {string} [id] - * @property {string} [title] - * @property {string} [subtitle] - (macOS-specific) - * @property {string} [body] - * @property {string} [categoryId] - * @property {{ [_: string]: any }} [data] - */ diff --git a/v3/examples/notifications/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/models.ts b/v3/examples/notifications/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/models.ts new file mode 100644 index 000000000..d7f48edfe --- /dev/null +++ b/v3/examples/notifications/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/models.ts @@ -0,0 +1,107 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import { Create as $Create } from "@wailsio/runtime"; + +/** + * NotificationAction represents an action button for a notification. + */ +export class NotificationAction { + "id"?: string; + "title"?: string; + + /** + * (macOS-specific) + */ + "destructive"?: boolean; + + /** Creates a new NotificationAction instance. */ + constructor($$source: Partial = {}) { + + Object.assign(this, $$source); + } + + /** + * Creates a new NotificationAction instance from a string or object. + */ + static createFrom($$source: any = {}): NotificationAction { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new NotificationAction($$parsedSource as Partial); + } +} + +/** + * NotificationCategory groups actions for notifications. + */ +export class NotificationCategory { + "id"?: string; + "actions"?: NotificationAction[]; + "hasReplyField"?: boolean; + "replyPlaceholder"?: string; + "replyButtonTitle"?: string; + + /** Creates a new NotificationCategory instance. */ + constructor($$source: Partial = {}) { + + Object.assign(this, $$source); + } + + /** + * Creates a new NotificationCategory instance from a string or object. + */ + static createFrom($$source: any = {}): NotificationCategory { + const $$createField1_0 = $$createType1; + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + if ("actions" in $$parsedSource) { + $$parsedSource["actions"] = $$createField1_0($$parsedSource["actions"]); + } + return new NotificationCategory($$parsedSource as Partial); + } +} + +/** + * NotificationOptions contains configuration for a notification + */ +export class NotificationOptions { + "id": string; + "title": string; + + /** + * (macOS and Linux only) + */ + "subtitle"?: string; + "body"?: string; + "categoryId"?: string; + "data"?: { [_: string]: any }; + + /** Creates a new NotificationOptions instance. */ + constructor($$source: Partial = {}) { + if (!("id" in $$source)) { + this["id"] = ""; + } + if (!("title" in $$source)) { + this["title"] = ""; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new NotificationOptions instance from a string or object. + */ + static createFrom($$source: any = {}): NotificationOptions { + const $$createField5_0 = $$createType2; + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + if ("data" in $$parsedSource) { + $$parsedSource["data"] = $$createField5_0($$parsedSource["data"]); + } + return new NotificationOptions($$parsedSource as Partial); + } +} + +// Private type creation functions +const $$createType0 = NotificationAction.createFrom; +const $$createType1 = $Create.Array($$createType0); +const $$createType2 = $Create.Map($Create.Any, $Create.Any); diff --git a/v3/examples/notifications/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/service.js b/v3/examples/notifications/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/service.js deleted file mode 100644 index 40c55b4a9..000000000 --- a/v3/examples/notifications/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/service.js +++ /dev/null @@ -1,131 +0,0 @@ -// @ts-check -// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL -// This file is automatically generated. DO NOT EDIT - -/** - * Service represents the notifications service - * @module - */ - -// eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-ignore: Unused imports -import {Call as $Call, Create as $Create} from "@wailsio/runtime"; - -// eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-ignore: Unused imports -import * as $models from "./models.js"; - -/** - * CheckNotificationAuthorization checks current notification permission status. - * @returns {Promise & { cancel(): void }} - */ -export function CheckNotificationAuthorization() { - let $resultPromise = /** @type {any} */($Call.ByID(2789931702)); - return $resultPromise; -} - -/** - * RegisterNotificationCategory registers a new NotificationCategory to be used with SendNotificationWithActions. - * Registering a category with the same name as a previously registered NotificationCategory will override it. - * @param {$models.NotificationCategory} category - * @returns {Promise & { cancel(): void }} - */ -export function RegisterNotificationCategory(category) { - let $resultPromise = /** @type {any} */($Call.ByID(2679064664, category)); - return $resultPromise; -} - -/** - * RemoveAllDeliveredNotifications removes all delivered notifications. - * @returns {Promise & { cancel(): void }} - */ -export function RemoveAllDeliveredNotifications() { - let $resultPromise = /** @type {any} */($Call.ByID(384520397)); - return $resultPromise; -} - -/** - * RemoveAllPendingNotifications removes all pending notifications. - * @returns {Promise & { cancel(): void }} - */ -export function RemoveAllPendingNotifications() { - let $resultPromise = /** @type {any} */($Call.ByID(1423986276)); - return $resultPromise; -} - -/** - * RemoveDeliveredNotification removes a delivered notification matching the unique identifier. - * @param {string} identifier - * @returns {Promise & { cancel(): void }} - */ -export function RemoveDeliveredNotification(identifier) { - let $resultPromise = /** @type {any} */($Call.ByID(149440045, identifier)); - return $resultPromise; -} - -/** - * RemoveNotification is a macOS stub that always returns nil. - * Use one of the following instead: - * RemoveAllPendingNotifications - * RemovePendingNotification - * RemoveAllDeliveredNotifications - * RemoveDeliveredNotification - * (Linux-specific) - * @param {string} identifier - * @returns {Promise & { cancel(): void }} - */ -export function RemoveNotification(identifier) { - let $resultPromise = /** @type {any} */($Call.ByID(3702062929, identifier)); - return $resultPromise; -} - -/** - * RemoveNotificationCategory remove a previously registered NotificationCategory. - * @param {string} categoryId - * @returns {Promise & { cancel(): void }} - */ -export function RemoveNotificationCategory(categoryId) { - let $resultPromise = /** @type {any} */($Call.ByID(229511469, categoryId)); - return $resultPromise; -} - -/** - * RemovePendingNotification removes a pending notification matching the unique identifier. - * @param {string} identifier - * @returns {Promise & { cancel(): void }} - */ -export function RemovePendingNotification(identifier) { - let $resultPromise = /** @type {any} */($Call.ByID(3872412470, identifier)); - return $resultPromise; -} - -/** - * RequestNotificationAuthorization requests permission for notifications. - * @returns {Promise & { cancel(): void }} - */ -export function RequestNotificationAuthorization() { - let $resultPromise = /** @type {any} */($Call.ByID(729898933)); - return $resultPromise; -} - -/** - * SendNotification sends a basic notification with a unique identifier, title, subtitle, and body. - * @param {$models.NotificationOptions} options - * @returns {Promise & { cancel(): void }} - */ -export function SendNotification(options) { - let $resultPromise = /** @type {any} */($Call.ByID(2246903123, options)); - return $resultPromise; -} - -/** - * SendNotificationWithActions sends a notification with additional actions and inputs. - * A NotificationCategory must be registered with RegisterNotificationCategory first. The `CategoryID` must match the registered category. - * If a NotificationCategory is not registered a basic notification will be sent. - * @param {$models.NotificationOptions} options - * @returns {Promise & { cancel(): void }} - */ -export function SendNotificationWithActions(options) { - let $resultPromise = /** @type {any} */($Call.ByID(1615199806, options)); - return $resultPromise; -} diff --git a/v3/examples/notifications/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/service.ts b/v3/examples/notifications/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/service.ts new file mode 100644 index 000000000..28f1cb3b2 --- /dev/null +++ b/v3/examples/notifications/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/service.ts @@ -0,0 +1,62 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +/** + * Service represents the notifications service + * @module + */ + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "@wailsio/runtime"; + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import * as $models from "./models.js"; + +export function CheckNotificationAuthorization(): $CancellablePromise { + return $Call.ByID(2789931702); +} + +export function RegisterNotificationCategory(category: $models.NotificationCategory): $CancellablePromise { + return $Call.ByID(2679064664, category); +} + +export function RemoveAllDeliveredNotifications(): $CancellablePromise { + return $Call.ByID(384520397); +} + +export function RemoveAllPendingNotifications(): $CancellablePromise { + return $Call.ByID(1423986276); +} + +export function RemoveDeliveredNotification(identifier: string): $CancellablePromise { + return $Call.ByID(149440045, identifier); +} + +export function RemoveNotification(identifier: string): $CancellablePromise { + return $Call.ByID(3702062929, identifier); +} + +export function RemoveNotificationCategory(categoryID: string): $CancellablePromise { + return $Call.ByID(229511469, categoryID); +} + +export function RemovePendingNotification(identifier: string): $CancellablePromise { + return $Call.ByID(3872412470, identifier); +} + +/** + * Public methods that delegate to the implementation. + */ +export function RequestNotificationAuthorization(): $CancellablePromise { + return $Call.ByID(729898933); +} + +export function SendNotification(options: $models.NotificationOptions): $CancellablePromise { + return $Call.ByID(2246903123, options); +} + +export function SendNotificationWithActions(options: $models.NotificationOptions): $CancellablePromise { + return $Call.ByID(1615199806, options); +} diff --git a/v3/examples/notifications/frontend/index.html b/v3/examples/notifications/frontend/index.html index 3c0d45f85..ae067c8a2 100644 --- a/v3/examples/notifications/frontend/index.html +++ b/v3/examples/notifications/frontend/index.html @@ -13,17 +13,18 @@ - - + +

    -

    Wails + Javascript

    - - + diff --git a/v3/examples/notifications/frontend/main.js b/v3/examples/notifications/frontend/main.js deleted file mode 100644 index 781f8983e..000000000 --- a/v3/examples/notifications/frontend/main.js +++ /dev/null @@ -1,67 +0,0 @@ -import * as Notifications from "./bindings/github.com/wailsapp/wails/v3/pkg/services/notifications"; -import { Events } from "@wailsio/runtime"; - -const notificationsElement = document.getElementById('notifications'); - -window.sendNotification = async () => { - const granted = await Notifications.Service.RequestNotificationAuthorization(); - if (granted) { - await Notifications.Service.SendNotification({ - id: crypto.randomUUID(), - title: "Title", - body: "Body!", - data: { - messageId: "msg-123", - senderId: "user-123", - timestamp: Date.now(), - } - }); - } -} - -window.sendComplexNotification = async () => { - const granted = await Notifications.Service.RequestNotificationAuthorization(); - if (granted) { - await Notifications.Service.RegisterNotificationCategory({ - id: "FRONTEND_NOTIF", - actions: [ - { id: "VIEW_ACTION", title: "View" }, - { id: "MARK_READ_ACTION", title: "Mark as Read" }, - ], - hasReplyField: true, - replyButtonTitle: "Reply", - replyPlaceholder: "Reply to frontend...", - }); - - await Notifications.Service.SendNotificationWithActions({ - id: crypto.randomUUID(), - title: "Complex Frontend Notification", - subtitle: "From: Jane Doe", - body: "Is it rainging today where you are?", - categoryId: "FRONTEND_NOTIF", - data: { - messageId: "msg-456", - senderId: "user-456", - timestamp: Date.now(), - } - }); - } -} - -window.removeNotification = async (id) => { - const granted = await Notifications.Service.RequestNotificationAuthorization(); - if (granted) { - await Notifications.Service.RemoveDeliveredNotification(id); - } -} - -window.removeAllNotifications = async (id) => { - const granted = await Notifications.Service.RequestNotificationAuthorization(); - if (granted) { - await Notifications.Service.RemoveAllDeliveredNotifications(); - } -} - -Events.On("notification:response", (response) => { - notificationsElement.innerText = JSON.stringify(response.data[0]); -}); \ No newline at end of file diff --git a/v3/examples/notifications/frontend/package-lock.json b/v3/examples/notifications/frontend/package-lock.json new file mode 100644 index 000000000..cdd50c49d --- /dev/null +++ b/v3/examples/notifications/frontend/package-lock.json @@ -0,0 +1,935 @@ +{ + "name": "frontend", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "frontend", + "version": "0.0.0", + "devDependencies": { + "@wailsio/runtime": "latest", + "typescript": "^4.9.3", + "vite": "^5.0.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.37.0.tgz", + "integrity": "sha512-l7StVw6WAa8l3vA1ov80jyetOAEo1FtHvZDbzXDO/02Sq/QVvqlHkYoFwDJPIMj0GKiistsBudfx5tGFnwYWDQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.37.0.tgz", + "integrity": "sha512-6U3SlVyMxezt8Y+/iEBcbp945uZjJwjZimu76xoG7tO1av9VO691z8PkhzQ85ith2I8R2RddEPeSfcbyPfD4hA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.37.0.tgz", + "integrity": "sha512-+iTQ5YHuGmPt10NTzEyMPbayiNTcOZDWsbxZYR1ZnmLnZxG17ivrPSWFO9j6GalY0+gV3Jtwrrs12DBscxnlYA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.37.0.tgz", + "integrity": "sha512-m8W2UbxLDcmRKVjgl5J/k4B8d7qX2EcJve3Sut7YGrQoPtCIQGPH5AMzuFvYRWZi0FVS0zEY4c8uttPfX6bwYQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.37.0.tgz", + "integrity": "sha512-FOMXGmH15OmtQWEt174v9P1JqqhlgYge/bUjIbiVD1nI1NeJ30HYT9SJlZMqdo1uQFyt9cz748F1BHghWaDnVA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.37.0.tgz", + "integrity": "sha512-SZMxNttjPKvV14Hjck5t70xS3l63sbVwl98g3FlVVx2YIDmfUIy29jQrsw06ewEYQ8lQSuY9mpAPlmgRD2iSsA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.37.0.tgz", + "integrity": "sha512-hhAALKJPidCwZcj+g+iN+38SIOkhK2a9bqtJR+EtyxrKKSt1ynCBeqrQy31z0oWU6thRZzdx53hVgEbRkuI19w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.37.0.tgz", + "integrity": "sha512-jUb/kmn/Gd8epbHKEqkRAxq5c2EwRt0DqhSGWjPFxLeFvldFdHQs/n8lQ9x85oAeVb6bHcS8irhTJX2FCOd8Ag==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.37.0.tgz", + "integrity": "sha512-oNrJxcQT9IcbcmKlkF+Yz2tmOxZgG9D9GRq+1OE6XCQwCVwxixYAa38Z8qqPzQvzt1FCfmrHX03E0pWoXm1DqA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.37.0.tgz", + "integrity": "sha512-pfxLBMls+28Ey2enpX3JvjEjaJMBX5XlPCZNGxj4kdJyHduPBXtxYeb8alo0a7bqOoWZW2uKynhHxF/MWoHaGQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.37.0.tgz", + "integrity": "sha512-yCE0NnutTC/7IGUq/PUHmoeZbIwq3KRh02e9SfFh7Vmc1Z7atuJRYWhRME5fKgT8aS20mwi1RyChA23qSyRGpA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.37.0.tgz", + "integrity": "sha512-NxcICptHk06E2Lh3a4Pu+2PEdZ6ahNHuK7o6Np9zcWkrBMuv21j10SQDJW3C9Yf/A/P7cutWoC/DptNLVsZ0VQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.37.0.tgz", + "integrity": "sha512-PpWwHMPCVpFZLTfLq7EWJWvrmEuLdGn1GMYcm5MV7PaRgwCEYJAwiN94uBuZev0/J/hFIIJCsYw4nLmXA9J7Pw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.37.0.tgz", + "integrity": "sha512-DTNwl6a3CfhGTAOYZ4KtYbdS8b+275LSLqJVJIrPa5/JuIufWWZ/QFvkxp52gpmguN95eujrM68ZG+zVxa8zHA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.37.0.tgz", + "integrity": "sha512-hZDDU5fgWvDdHFuExN1gBOhCuzo/8TMpidfOR+1cPZJflcEzXdCy1LjnklQdW8/Et9sryOPJAKAQRw8Jq7Tg+A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.37.0.tgz", + "integrity": "sha512-pKivGpgJM5g8dwj0ywBwe/HeVAUSuVVJhUTa/URXjxvoyTT/AxsLTAbkHkDHG7qQxLoW2s3apEIl26uUe08LVQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.37.0.tgz", + "integrity": "sha512-E2lPrLKE8sQbY/2bEkVTGDEk4/49UYRVWgj90MY8yPjpnGBQ+Xi1Qnr7b7UIWw1NOggdFQFOLZ8+5CzCiz143w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.37.0.tgz", + "integrity": "sha512-Jm7biMazjNzTU4PrQtr7VS8ibeys9Pn29/1bm4ph7CP2kf21950LgN+BaE2mJ1QujnvOc6p54eWWiVvn05SOBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.37.0.tgz", + "integrity": "sha512-e3/1SFm1OjefWICB2Ucstg2dxYDkDTZGDYgwufcbsxTHyqQps1UQf33dFEChBNmeSsTOyrjw2JJq0zbG5GF6RA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.37.0.tgz", + "integrity": "sha512-LWbXUBwn/bcLx2sSsqy7pK5o+Nr+VCoRoAohfJ5C/aBio9nfJmGQqHAhU6pwxV/RmyTk5AqdySma7uwWGlmeuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@wailsio/runtime": { + "version": "3.0.0-alpha.66", + "resolved": "https://registry.npmjs.org/@wailsio/runtime/-/runtime-3.0.0-alpha.66.tgz", + "integrity": "sha512-ENLu8rn1griL1gFHJqkq1i+BVxrrA0JPJHYneUJYuf/s54kjuQViW0RKDEe/WTDo56ABpfykrd/T8OYpPUyXUw==", + "dev": true, + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/postcss": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/rollup": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.37.0.tgz", + "integrity": "sha512-iAtQy/L4QFU+rTJ1YUjXqJOJzuwEghqWzCEYD2FEghT7Gsy1VdABntrO4CLopA5IkflTyqNiLNwPcOJ3S7UKLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.37.0", + "@rollup/rollup-android-arm64": "4.37.0", + "@rollup/rollup-darwin-arm64": "4.37.0", + "@rollup/rollup-darwin-x64": "4.37.0", + "@rollup/rollup-freebsd-arm64": "4.37.0", + "@rollup/rollup-freebsd-x64": "4.37.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.37.0", + "@rollup/rollup-linux-arm-musleabihf": "4.37.0", + "@rollup/rollup-linux-arm64-gnu": "4.37.0", + "@rollup/rollup-linux-arm64-musl": "4.37.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.37.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.37.0", + "@rollup/rollup-linux-riscv64-gnu": "4.37.0", + "@rollup/rollup-linux-riscv64-musl": "4.37.0", + "@rollup/rollup-linux-s390x-gnu": "4.37.0", + "@rollup/rollup-linux-x64-gnu": "4.37.0", + "@rollup/rollup-linux-x64-musl": "4.37.0", + "@rollup/rollup-win32-arm64-msvc": "4.37.0", + "@rollup/rollup-win32-ia32-msvc": "4.37.0", + "@rollup/rollup-win32-x64-msvc": "4.37.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/vite": { + "version": "5.4.15", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.15.tgz", + "integrity": "sha512-6ANcZRivqL/4WtwPGTKNaosuNJr5tWiftOC7liM7G9+rMb8+oeJeyzymDu4rTN93seySBmbjSfsS3Vzr19KNtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + } + } +} diff --git a/v3/examples/notifications/frontend/package.json b/v3/examples/notifications/frontend/package.json index 9ae87549e..4d675f189 100644 --- a/v3/examples/notifications/frontend/package.json +++ b/v3/examples/notifications/frontend/package.json @@ -5,11 +5,12 @@ "type": "module", "scripts": { "dev": "vite", - "build:dev": "vite build --minify false --mode development", - "build": "vite build --mode production", + "build:dev": "tsc && vite build --minify false --mode development", + "build": "tsc && vite build --mode production", "preview": "vite preview" }, "devDependencies": { + "typescript": "^4.9.3", "vite": "^5.0.0", "@wailsio/runtime": "latest" } diff --git a/v3/examples/notifications/frontend/public/javascript.svg b/v3/examples/notifications/frontend/public/javascript.svg deleted file mode 100644 index f9abb2b72..000000000 --- a/v3/examples/notifications/frontend/public/javascript.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/v3/examples/notifications/frontend/public/style.css b/v3/examples/notifications/frontend/public/style.css index 127799eda..074717bca 100644 --- a/v3/examples/notifications/frontend/public/style.css +++ b/v3/examples/notifications/frontend/public/style.css @@ -30,11 +30,6 @@ url("./Inter-Medium.ttf") format("truetype"); } -h3 { - font-size: 3em; - line-height: 1.1; -} - a { font-weight: 500; color: #646cff; @@ -45,8 +40,12 @@ a:hover { color: #535bf2; } +.controls { + display: flex; + gap: 1em; +} + button { - /* width: 60px; */ height: 30px; line-height: 30px; border-radius: 3px; @@ -56,11 +55,6 @@ button { cursor: pointer; } -.result { - height: 20px; - line-height: 20px; -} - body { margin: 0; display: flex; @@ -75,11 +69,12 @@ body { flex-direction: column; align-items: center; justify-content: center; + padding: 3em; } -h1 { - font-size: 3.2em; +h1, h3 { line-height: 1.1; + text-align: center; } #app { @@ -103,19 +98,23 @@ h1 { filter: drop-shadow(0 0 2em #f7df1eaa); } -.result { - height: 20px; - line-height: 20px; - margin: 1.5rem auto; - text-align: center; -} - .footer { margin-top: 1rem; align-content: center; text-align: center; } +.footer table { + font-size: 12px; + border-collapse: collapse; + margin: 0 auto; +} + +.footer table, th, td { + border: 1px solid #ddd; + padding: 0.5em; +} + @media (prefers-color-scheme: light) { :root { color: #213547; @@ -129,32 +128,4 @@ h1 { button { background-color: #f9f9f9; } -} - - -.input-box .btn:hover { - background-image: linear-gradient(to top, #cfd9df 0%, #e2ebf0 100%); - color: #333333; -} - -.input-box .input { - border: none; - border-radius: 3px; - outline: none; - height: 30px; - line-height: 30px; - padding: 0 10px; - color: black; - background-color: rgba(240, 240, 240, 1); - -webkit-font-smoothing: antialiased; -} - -.input-box .input:hover { - border: none; - background-color: rgba(255, 255, 255, 1); -} - -.input-box .input:focus { - border: none; - background-color: rgba(255, 255, 255, 1); } \ No newline at end of file diff --git a/v3/examples/notifications/frontend/public/typescript.svg b/v3/examples/notifications/frontend/public/typescript.svg new file mode 100644 index 000000000..d91c910cc --- /dev/null +++ b/v3/examples/notifications/frontend/public/typescript.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v3/examples/notifications/frontend/src/main.ts b/v3/examples/notifications/frontend/src/main.ts new file mode 100644 index 000000000..437fb8c94 --- /dev/null +++ b/v3/examples/notifications/frontend/src/main.ts @@ -0,0 +1,95 @@ +import { Events } from "@wailsio/runtime"; +import * as Notifications from "../bindings/github.com/wailsapp/wails/v3/pkg/services/notifications"; + +document.querySelector("#basic")?.addEventListener("click", async () => { + try { + const authorized = await Notifications.Service.CheckNotificationAuthorization(); + if (authorized) { + await Notifications.Service.SendNotification({ + id: crypto.randomUUID(), + title: "Notification Title", + subtitle: "Subtitle on macOS and Linux", + body: "Body text of notification.", + data: { + "user-id": "user-123", + "message-id": "msg-123", + "timestamp": Date.now(), + }, + }); + } else { + console.warn("Notifications are not authorized.\n You can attempt to request again or let the user know in the UI.\n"); + } + } catch (error) { + console.error(error); + } +}); +document.querySelector("#complex")?.addEventListener("click", async () => { + try { + const authorized = await Notifications.Service.CheckNotificationAuthorization(); + if (authorized) { + const CategoryID = "frontend-notification-id"; + + await Notifications.Service.RegisterNotificationCategory({ + id: CategoryID, + actions: [ + { id: "VIEW", title: "View" }, + { id: "MARK_READ", title: "Mark as read" }, + { id: "DELETE", title: "Delete", destructive: true }, + ], + hasReplyField: true, + replyPlaceholder: "Message...", + replyButtonTitle: "Reply", + }); + + await Notifications.Service.SendNotificationWithActions({ + id: crypto.randomUUID(), + title: "Notification Title", + subtitle: "Subtitle on macOS and Linux", + body: "Body text of notification.", + categoryId: CategoryID, + data: { + "user-id": "user-123", + "message-id": "msg-123", + "timestamp": Date.now(), + }, + }); + } else { + console.warn("Notifications are not authorized.\n You can attempt to request again or let the user know in the UI.\n"); + } + } catch (error) { + console.error(error); + } +}); + +const unlisten = Events.On("notification:action", (response) => { + console.info(`Recieved a ${response.name} event`); + const { userInfo, ...base } = response.data[0]; + console.info("Notification Response:"); + console.table(base); + console.info("Notification Response Metadata:"); + console.table(userInfo); + const table = ` +
    Notification Response
    + + + ${Object.keys(base).map(key => ``).join("")} + + + ${Object.values(base).map(value => ``).join("")} + +
    ${key}
    ${value}
    +
    Notification Metadata
    + + + ${Object.keys(userInfo).map(key => ``).join("")} + + + ${Object.values(userInfo).map(value => ``).join("")} + +
    ${key}
    ${value}
    + `; + const footer = document.querySelector("#response"); + if (footer) footer.innerHTML = table; +}); + +window.onbeforeunload = () => unlisten(); \ No newline at end of file diff --git a/v3/examples/notifications/frontend/src/vite-env.d.ts b/v3/examples/notifications/frontend/src/vite-env.d.ts new file mode 100644 index 000000000..11f02fe2a --- /dev/null +++ b/v3/examples/notifications/frontend/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/v3/examples/notifications/frontend/tsconfig.json b/v3/examples/notifications/frontend/tsconfig.json new file mode 100644 index 000000000..c267ecf24 --- /dev/null +++ b/v3/examples/notifications/frontend/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "module": "ESNext", + "lib": ["ESNext", "DOM"], + "moduleResolution": "Node", + "strict": true, + "resolveJsonModule": true, + "isolatedModules": true, + "esModuleInterop": true, + "noEmit": true, + "noUnusedLocals": true, + "noUnusedParameters": false, + "noImplicitAny": false, + "noImplicitReturns": true, + "skipLibCheck": true + }, + "include": ["src"] +} diff --git a/v3/examples/notifications/go.mod b/v3/examples/notifications/go.mod new file mode 100644 index 000000000..39537e938 --- /dev/null +++ b/v3/examples/notifications/go.mod @@ -0,0 +1,53 @@ +module notifications + +go 1.24.0 + +toolchain go1.24.1 + +require github.com/wailsapp/wails/v3 v3.0.0-dev + +require ( + dario.cat/mergo v1.0.1 // indirect + git.sr.ht/~jackmordaunt/go-toast/v2 v2.0.3 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/ProtonMail/go-crypto v1.1.6 // indirect + github.com/adrg/xdg v0.5.3 // indirect + github.com/bep/debounce v1.2.1 // indirect + github.com/cloudflare/circl v1.6.0 // indirect + github.com/cyphar/filepath-securejoin v0.4.1 // indirect + github.com/ebitengine/purego v0.8.2 // indirect + github.com/emirpasic/gods v1.18.1 // indirect + github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect + github.com/go-git/go-billy/v5 v5.6.2 // indirect + github.com/go-git/go-git/v5 v5.13.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/godbus/dbus/v5 v5.1.0 // indirect + github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect + github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e // indirect + github.com/kevinburke/ssh_config v1.2.0 // indirect + github.com/leaanthony/go-ansi-parser v1.6.1 // indirect + github.com/leaanthony/u v1.1.1 // indirect + github.com/lmittmann/tint v1.0.7 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/pjbgf/sha1cd v0.3.2 // indirect + github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/rivo/uniseg v0.4.7 // indirect + github.com/samber/lo v1.49.1 // indirect + github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect + github.com/skeema/knownhosts v1.3.1 // indirect + github.com/wailsapp/go-webview2 v1.0.21 // indirect + github.com/wailsapp/mimetype v1.4.1 // indirect + github.com/xanzy/ssh-agent v0.3.3 // indirect + golang.org/x/crypto v0.36.0 // indirect + golang.org/x/net v0.37.0 // indirect + golang.org/x/sys v0.31.0 // indirect + golang.org/x/text v0.23.0 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/warnings.v0 v0.1.2 // indirect +) + +replace github.com/wailsapp/wails/v3 => ../wails/v3 diff --git a/v3/examples/notifications/main.go b/v3/examples/notifications/main.go index c2a2502a3..aae1bf2f0 100644 --- a/v3/examples/notifications/main.go +++ b/v3/examples/notifications/main.go @@ -3,7 +3,6 @@ package main import ( "embed" _ "embed" - "encoding/json" "fmt" "log" "time" @@ -12,17 +11,31 @@ import ( "github.com/wailsapp/wails/v3/pkg/services/notifications" ) +// Wails uses Go's `embed` package to embed the frontend files into the binary. +// Any files in the frontend/dist folder will be embedded into the binary and +// made available to the frontend. +// See https://pkg.go.dev/embed for more information. + //go:embed all:frontend/dist var assets embed.FS +// main function serves as the application's entry point. It initializes the application, creates a window, +// and starts a goroutine that emits a time-based event every second. It subsequently runs the application and +// logs any error that might occur. func main() { - notificationService := notifications.New() + // Create a new Notification Service + ns := notifications.New() + // Create a new Wails application by providing the necessary options. + // Variables 'Name' and 'Description' are for application metadata. + // 'Assets' configures the asset server with the 'FS' variable pointing to the frontend files. + // 'Bind' is a list of Go struct instances. The frontend has access to the methods of these instances. + // 'Mac' options tailor the application when running an macOS. app := application.New(application.Options{ - Name: "Notifications", - Description: "A demo of using raw HTML & CSS", + Name: "Notifications Demo", + Description: "A demo of using desktop notifications with Wails", Services: []application.Service{ - application.NewService(notificationService), + application.NewService(ns), }, Assets: application.AssetOptions{ Handler: application.AssetFileServerFS(assets), @@ -30,13 +43,15 @@ func main() { Mac: application.MacOptions{ ApplicationShouldTerminateAfterLastWindowClosed: true, }, - Windows: application.WindowsOptions{ - WndClass: "Notifications", - }, }) + // Create a new window with the necessary options. + // 'Title' is the title of the window. + // 'Mac' options tailor the window when running on macOS. + // 'BackgroundColour' is the background colour of the window. + // 'URL' is the URL that will be loaded into the webview. app.NewWebviewWindowWithOptions(application.WebviewWindowOptions{ - Title: "Notifications", + Title: "Window 1", Mac: application.MacWindow{ InvisibleTitleBarHeight: 50, Backdrop: application.MacBackdropTranslucent, @@ -46,67 +61,90 @@ func main() { URL: "/", }) + // Create a goroutine that spawns desktop notifications from Go go func() { - granted, err := notificationService.RequestNotificationAuthorization() + var authorized bool + var err error + authorized, err = ns.CheckNotificationAuthorization() if err != nil { - log.Default().Printf("WARNING: %s\n", err) - return + println(fmt.Errorf("checking app notification authorization failed: %s", err)) } - if granted { - notificationService.OnNotificationResponse(func(result notifications.NotificationResult) { - if result.Error != nil { - fmt.Printf("notification response error: %s", result.Error) - return - } - data, _ := json.Marshal(result.Response) - fmt.Printf("%s\n", string(data)) - app.EmitEvent("notification:response", result.Response) - }) - time.Sleep(time.Second * 2) + if !authorized { + authorized, err = ns.RequestNotificationAuthorization() + if err != nil { + println(fmt.Errorf("requesting app notification authorization failed: %s", err)) + } + } - notificationService.SendNotification(notifications.NotificationOptions{ - ID: "uuid1", - Title: "Title!", - Body: "Body!", + if authorized { + ns.OnNotificationResponse(func(result notifications.NotificationResult) { + if result.Error != nil { + println(fmt.Errorf("parsing notification result failed: %s", result.Error)) + } else { + fmt.Printf("Response: %+v\n", result.Response) + println("Sending response to frontend...") + app.EmitEvent("notification:action", result.Response) + } + }) + + err = ns.SendNotification(notifications.NotificationOptions{ + ID: "uuid-basic-1", + Title: "Notification Title", + Subtitle: "Subtitle on macOS and Linux", + Body: "Body text of notification.", Data: map[string]interface{}{ - "messageId": "msg-123", - "senderId": "user-123", - "timestamp": time.Now().Unix(), + "user-id": "user-123", + "message-id": "msg-123", + "timestamp": time.Now().Unix(), }, }) + if err != nil { + println(fmt.Errorf("sending basic notification failed: %s", err)) + } + // Delay before sending next notification time.Sleep(time.Second * 2) - notificationService.RegisterNotificationCategory(notifications.NotificationCategory{ - ID: "BACKEND_NOTIF", + const CategoryID = "backend-notification-id" + + err = ns.RegisterNotificationCategory(notifications.NotificationCategory{ + ID: CategoryID, Actions: []notifications.NotificationAction{ - {ID: "VIEW_ACTION", Title: "View"}, - {ID: "MARK_READ_ACTION", Title: "Mark as Read"}, - {ID: "DELETE_ACTION", Title: "Delete", Destructive: true}, + {ID: "VIEW", Title: "View"}, + {ID: "MARK_READ", Title: "Mark as read"}, + {ID: "DELETE", Title: "Delete", Destructive: true}, }, HasReplyField: true, + ReplyPlaceholder: "Message...", ReplyButtonTitle: "Reply", - ReplyPlaceholder: "Reply to backend...", }) + if err != nil { + println(fmt.Errorf("creating notification category failed: %s", err)) + } - notificationService.SendNotificationWithActions(notifications.NotificationOptions{ - ID: "uuid2", - Title: "Complex Backend Notification", - Subtitle: "From: Jane Doe", - Body: "Is it raining today where you are?", - CategoryID: "BACKEND_NOTIF", + err = ns.SendNotificationWithActions(notifications.NotificationOptions{ + ID: "uuid-with-actions-1", + Title: "Actions Notification Title", + Subtitle: "Subtitle on macOS and Linux", + Body: "Body text of notification with actions.", + CategoryID: CategoryID, Data: map[string]interface{}{ - "messageId": "msg-456", - "senderId": "user-456", - "timestamp": time.Now().Unix(), + "user-id": "user-123", + "message-id": "msg-123", + "timestamp": time.Now().Unix(), }, }) + if err != nil { + println(fmt.Errorf("sending notification with actions failed: %s", err)) + } } }() + // Run the application. This blocks until the application has been exited. err := app.Run() + // If an error occurred while running the application, log it and exit. if err != nil { log.Fatal(err) } From d25f9237215964831effeceac8b4dbc61db715fe Mon Sep 17 00:00:00 2001 From: popaprozac Date: Mon, 24 Mar 2025 20:07:31 -0700 Subject: [PATCH 205/374] wait on dbus --- .../notifications/notifications_linux.go | 72 +++++++++++++++++-- 1 file changed, 67 insertions(+), 5 deletions(-) diff --git a/v3/pkg/services/notifications/notifications_linux.go b/v3/pkg/services/notifications/notifications_linux.go index bdc8312ff..3be587ac0 100644 --- a/v3/pkg/services/notifications/notifications_linux.go +++ b/v3/pkg/services/notifications/notifications_linux.go @@ -9,6 +9,7 @@ import ( "os" "path/filepath" "sync" + "time" "github.com/godbus/dbus/v5" "github.com/wailsapp/wails/v3/pkg/application" @@ -48,6 +49,29 @@ func New() *Service { notifications: make(map[uint32]*notificationData), } + ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) + defer cancel() + + conn, err := dbus.ConnectSessionBus() + if err != nil { + fmt.Printf("Warning: Failed to connect to D-Bus session bus: %v\n", err) + fmt.Printf("Notifications will be unavailable\n") + } else { + impl.conn = conn + + obj := conn.Object(dbusNotificationInterface, dbusNotificationPath) + call := obj.CallWithContext(ctx, dbusNotificationInterface+".GetCapabilities", 0) + + var capabilities []string + err := call.Store(&capabilities) + + if err != nil { + fmt.Printf("Warning: D-Bus notification service not ready: %v\n", err) + } else { + fmt.Printf("D-Bus notification service is ready with capabilities: %v\n", capabilities) + } + } + NotificationService = &Service{ impl: impl, } @@ -56,15 +80,29 @@ func New() *Service { return NotificationService } +// Helper method to check if D-Bus connection is available +func (ln *linuxNotifier) checkConnection() error { + if ln.conn == nil { + return fmt.Errorf("D-Bus connection is not initialized, notifications are unavailable") + } + + return nil +} + // Startup is called when the service is loaded. func (ln *linuxNotifier) Startup(ctx context.Context, options application.ServiceOptions) error { ln.appName = application.Get().Config().Name - conn, err := dbus.ConnectSessionBus() - if err != nil { - return fmt.Errorf("failed to connect to session bus: %w", err) + if ln.conn == nil { + conn, err := dbus.ConnectSessionBus() + if err != nil { + fmt.Printf("Warning: Failed to connect to D-Bus session bus: %v\n", err) + fmt.Printf("Notifications will be unavailable\n") + + return nil + } + ln.conn = conn } - ln.conn = conn if err := ln.loadCategories(); err != nil { fmt.Printf("Failed to load notification categories: %v\n", err) @@ -74,7 +112,7 @@ func (ln *linuxNotifier) Startup(ctx context.Context, options application.Servic signalCtx, ln.cancel = context.WithCancel(context.Background()) if err := ln.setupSignalHandling(signalCtx); err != nil { - return fmt.Errorf("failed to set up notification signal handling: %w", err) + fmt.Printf("Warning: Failed to set up notification signal handling: %v\n", err) } return nil @@ -110,6 +148,10 @@ func (ln *linuxNotifier) CheckNotificationAuthorization() (bool, error) { // SendNotification sends a basic notification with a unique identifier, title, subtitle, and body. func (ln *linuxNotifier) SendNotification(options NotificationOptions) error { + if err := ln.checkConnection(); err != nil { + return err + } + hints := map[string]dbus.Variant{} body := options.Body @@ -176,6 +218,10 @@ func (ln *linuxNotifier) SendNotification(options NotificationOptions) error { // SendNotificationWithActions sends a notification with additional actions. func (ln *linuxNotifier) SendNotificationWithActions(options NotificationOptions) error { + if err := ln.checkConnection(); err != nil { + return err + } + ln.categoriesLock.RLock() category, exists := ln.categories[options.CategoryID] ln.categoriesLock.RUnlock() @@ -284,6 +330,10 @@ func (ln *linuxNotifier) RemoveNotificationCategory(categoryId string) error { // RemoveAllPendingNotifications attempts to remove all active notifications. func (ln *linuxNotifier) RemoveAllPendingNotifications() error { + if err := ln.checkConnection(); err != nil { + return err + } + ln.notificationsLock.Lock() dbusIDs := make([]uint32, 0, len(ln.notifications)) for id := range ln.notifications { @@ -300,6 +350,10 @@ func (ln *linuxNotifier) RemoveAllPendingNotifications() error { // RemovePendingNotification removes a pending notification. func (ln *linuxNotifier) RemovePendingNotification(identifier string) error { + if err := ln.checkConnection(); err != nil { + return err + } + var dbusID uint32 found := false @@ -337,6 +391,10 @@ func (ln *linuxNotifier) RemoveNotification(identifier string) error { // Helper method to close a notification. func (ln *linuxNotifier) closeNotification(id uint32) error { + if err := ln.checkConnection(); err != nil { + return err + } + obj := ln.conn.Object(dbusNotificationInterface, dbusNotificationPath) call := obj.Call(dbusNotificationInterface+".CloseNotification", 0, id) @@ -417,6 +475,10 @@ func (ln *linuxNotifier) loadCategories() error { // Setup signal handling for notification actions. func (ln *linuxNotifier) setupSignalHandling(ctx context.Context) error { + if err := ln.checkConnection(); err != nil { + return err + } + if err := ln.conn.AddMatchSignal( dbus.WithMatchInterface(dbusNotificationInterface), dbus.WithMatchMember("ActionInvoked"), From 276c653b1df4db017fd7120faef302853c8af2b1 Mon Sep 17 00:00:00 2001 From: popaprozac Date: Mon, 24 Mar 2025 20:22:29 -0700 Subject: [PATCH 206/374] update example --- v3/examples/notifications/build/windows/Taskfile.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v3/examples/notifications/build/windows/Taskfile.yml b/v3/examples/notifications/build/windows/Taskfile.yml index 534f4fb31..be6e4125e 100644 --- a/v3/examples/notifications/build/windows/Taskfile.yml +++ b/v3/examples/notifications/build/windows/Taskfile.yml @@ -60,4 +60,4 @@ tasks: run: cmds: - - '{{.BIN_DIR}}/{{.APP_NAME}}.exe' + - '{{.BIN_DIR}}\\{{.APP_NAME}}.exe' From 7d0f7f4652b6efeafaaa381c91bba35f4f357339 Mon Sep 17 00:00:00 2001 From: popaprozac Date: Mon, 24 Mar 2025 21:26:02 -0700 Subject: [PATCH 207/374] revert linux wait and update payload on win --- .../notifications/notifications_linux.go | 72 ++----------------- .../notifications/notifications_windows.go | 68 ++++++++---------- 2 files changed, 33 insertions(+), 107 deletions(-) diff --git a/v3/pkg/services/notifications/notifications_linux.go b/v3/pkg/services/notifications/notifications_linux.go index 3be587ac0..bdc8312ff 100644 --- a/v3/pkg/services/notifications/notifications_linux.go +++ b/v3/pkg/services/notifications/notifications_linux.go @@ -9,7 +9,6 @@ import ( "os" "path/filepath" "sync" - "time" "github.com/godbus/dbus/v5" "github.com/wailsapp/wails/v3/pkg/application" @@ -49,29 +48,6 @@ func New() *Service { notifications: make(map[uint32]*notificationData), } - ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) - defer cancel() - - conn, err := dbus.ConnectSessionBus() - if err != nil { - fmt.Printf("Warning: Failed to connect to D-Bus session bus: %v\n", err) - fmt.Printf("Notifications will be unavailable\n") - } else { - impl.conn = conn - - obj := conn.Object(dbusNotificationInterface, dbusNotificationPath) - call := obj.CallWithContext(ctx, dbusNotificationInterface+".GetCapabilities", 0) - - var capabilities []string - err := call.Store(&capabilities) - - if err != nil { - fmt.Printf("Warning: D-Bus notification service not ready: %v\n", err) - } else { - fmt.Printf("D-Bus notification service is ready with capabilities: %v\n", capabilities) - } - } - NotificationService = &Service{ impl: impl, } @@ -80,29 +56,15 @@ func New() *Service { return NotificationService } -// Helper method to check if D-Bus connection is available -func (ln *linuxNotifier) checkConnection() error { - if ln.conn == nil { - return fmt.Errorf("D-Bus connection is not initialized, notifications are unavailable") - } - - return nil -} - // Startup is called when the service is loaded. func (ln *linuxNotifier) Startup(ctx context.Context, options application.ServiceOptions) error { ln.appName = application.Get().Config().Name - if ln.conn == nil { - conn, err := dbus.ConnectSessionBus() - if err != nil { - fmt.Printf("Warning: Failed to connect to D-Bus session bus: %v\n", err) - fmt.Printf("Notifications will be unavailable\n") - - return nil - } - ln.conn = conn + conn, err := dbus.ConnectSessionBus() + if err != nil { + return fmt.Errorf("failed to connect to session bus: %w", err) } + ln.conn = conn if err := ln.loadCategories(); err != nil { fmt.Printf("Failed to load notification categories: %v\n", err) @@ -112,7 +74,7 @@ func (ln *linuxNotifier) Startup(ctx context.Context, options application.Servic signalCtx, ln.cancel = context.WithCancel(context.Background()) if err := ln.setupSignalHandling(signalCtx); err != nil { - fmt.Printf("Warning: Failed to set up notification signal handling: %v\n", err) + return fmt.Errorf("failed to set up notification signal handling: %w", err) } return nil @@ -148,10 +110,6 @@ func (ln *linuxNotifier) CheckNotificationAuthorization() (bool, error) { // SendNotification sends a basic notification with a unique identifier, title, subtitle, and body. func (ln *linuxNotifier) SendNotification(options NotificationOptions) error { - if err := ln.checkConnection(); err != nil { - return err - } - hints := map[string]dbus.Variant{} body := options.Body @@ -218,10 +176,6 @@ func (ln *linuxNotifier) SendNotification(options NotificationOptions) error { // SendNotificationWithActions sends a notification with additional actions. func (ln *linuxNotifier) SendNotificationWithActions(options NotificationOptions) error { - if err := ln.checkConnection(); err != nil { - return err - } - ln.categoriesLock.RLock() category, exists := ln.categories[options.CategoryID] ln.categoriesLock.RUnlock() @@ -330,10 +284,6 @@ func (ln *linuxNotifier) RemoveNotificationCategory(categoryId string) error { // RemoveAllPendingNotifications attempts to remove all active notifications. func (ln *linuxNotifier) RemoveAllPendingNotifications() error { - if err := ln.checkConnection(); err != nil { - return err - } - ln.notificationsLock.Lock() dbusIDs := make([]uint32, 0, len(ln.notifications)) for id := range ln.notifications { @@ -350,10 +300,6 @@ func (ln *linuxNotifier) RemoveAllPendingNotifications() error { // RemovePendingNotification removes a pending notification. func (ln *linuxNotifier) RemovePendingNotification(identifier string) error { - if err := ln.checkConnection(); err != nil { - return err - } - var dbusID uint32 found := false @@ -391,10 +337,6 @@ func (ln *linuxNotifier) RemoveNotification(identifier string) error { // Helper method to close a notification. func (ln *linuxNotifier) closeNotification(id uint32) error { - if err := ln.checkConnection(); err != nil { - return err - } - obj := ln.conn.Object(dbusNotificationInterface, dbusNotificationPath) call := obj.Call(dbusNotificationInterface+".CloseNotification", 0, id) @@ -475,10 +417,6 @@ func (ln *linuxNotifier) loadCategories() error { // Setup signal handling for notification actions. func (ln *linuxNotifier) setupSignalHandling(ctx context.Context) error { - if err := ln.checkConnection(); err != nil { - return err - } - if err := ln.conn.AddMatchSignal( dbus.WithMatchInterface(dbusNotificationInterface), dbus.WithMatchMember("ActionInvoked"), diff --git a/v3/pkg/services/notifications/notifications_windows.go b/v3/pkg/services/notifications/notifications_windows.go index d792d6949..e22fe01b6 100644 --- a/v3/pkg/services/notifications/notifications_windows.go +++ b/v3/pkg/services/notifications/notifications_windows.go @@ -36,8 +36,8 @@ const ( // NotificationPayload combines the action ID and user data into a single structure type NotificationPayload struct { - Action string `json:"action"` - Data map[string]interface{} `json:"data,omitempty"` + Action string `json:"action"` + Options NotificationOptions `json:"payload,omitempty"` } // Creates a new Notifications Service. @@ -79,7 +79,8 @@ func (wn *windowsNotifier) Startup(ctx context.Context, options application.Serv toast.SetActivationCallback(func(args string, data []toast.UserData) { result := NotificationResult{} - actionIdentifier, userInfo, err := parseNotificationResponse(args) + + actionIdentifier, options, err := parseNotificationResponse(args) if err != nil { result.Error = err @@ -90,21 +91,15 @@ func (wn *windowsNotifier) Startup(ctx context.Context, options application.Serv return } + // Subtitle is retained but was not shown with the notification response := NotificationResponse{ + ID: options.ID, ActionIdentifier: actionIdentifier, - } - - if userInfo != "" { - var userInfoMap map[string]interface{} - if err := json.Unmarshal([]byte(userInfo), &userInfoMap); err != nil { - result.Error = fmt.Errorf("failed to unmarshal notification response: %w", err) - - if ns := getNotificationService(); ns != nil { - ns.handleNotificationResult(result) - } - return - } - response.UserInfo = userInfoMap + Title: options.Title, + Subtitle: options.Subtitle, + Body: options.Body, + CategoryID: options.CategoryID, + UserInfo: options.Data, } if userText, found := wn.getUserText(data); found { @@ -154,9 +149,9 @@ func (wn *windowsNotifier) SendNotification(options NotificationOptions) error { } if options.Data != nil { - encodedPayload, err := wn.encodePayload(DefaultActionIdentifier, options.Data) + encodedPayload, err := wn.encodePayload(DefaultActionIdentifier, options) if err != nil { - return fmt.Errorf("failed to encode notification data: %w", err) + return fmt.Errorf("failed to encode notification payload: %w", err) } n.ActivationArguments = encodedPayload } @@ -208,16 +203,16 @@ func (wn *windowsNotifier) SendNotificationWithActions(options NotificationOptio } if options.Data != nil { - encodedPayload, err := wn.encodePayload(n.ActivationArguments, options.Data) + encodedPayload, err := wn.encodePayload(n.ActivationArguments, options) if err != nil { - return fmt.Errorf("failed to encode notification data: %w", err) + return fmt.Errorf("failed to encode notification payload: %w", err) } n.ActivationArguments = encodedPayload for index := range n.Actions { - encodedPayload, err := wn.encodePayload(n.Actions[index].Arguments, options.Data) + encodedPayload, err := wn.encodePayload(n.Actions[index].Arguments, options) if err != nil { - return fmt.Errorf("failed to encode notification data: %w", err) + return fmt.Errorf("failed to encode notification payload: %w", err) } n.Actions[index].Arguments = encodedPayload } @@ -284,10 +279,10 @@ func (wn *windowsNotifier) RemoveNotification(identifier string) error { } // encodePayload combines an action ID and user data into a single encoded string -func (wn *windowsNotifier) encodePayload(actionID string, data map[string]interface{}) (string, error) { +func (wn *windowsNotifier) encodePayload(actionID string, options NotificationOptions) (string, error) { payload := NotificationPayload{ - Action: actionID, - Data: data, + Action: actionID, + Options: options, } jsonData, err := json.Marshal(payload) @@ -300,37 +295,30 @@ func (wn *windowsNotifier) encodePayload(actionID string, data map[string]interf } // decodePayload extracts the action ID and user data from an encoded payload -func decodePayload(encodedString string) (string, map[string]interface{}, error) { +func decodePayload(encodedString string) (string, NotificationOptions, error) { jsonData, err := base64.StdEncoding.DecodeString(encodedString) if err != nil { - return encodedString, nil, fmt.Errorf("failed to decode base64 payload: %w", err) + return encodedString, NotificationOptions{}, fmt.Errorf("failed to decode base64 payload: %w", err) } var payload NotificationPayload if err := json.Unmarshal(jsonData, &payload); err != nil { - return encodedString, nil, fmt.Errorf("failed to unmarshal notification payload: %w", err) + return encodedString, NotificationOptions{}, fmt.Errorf("failed to unmarshal notification payload: %w", err) } - return payload.Action, payload.Data, nil + return payload.Action, payload.Options, nil } // parseNotificationResponse updated to use structured payload decoding -func parseNotificationResponse(response string) (action string, data string, err error) { - actionID, userData, err := decodePayload(response) +func parseNotificationResponse(response string) (action string, options NotificationOptions, err error) { + actionID, options, err := decodePayload(response) if err != nil { fmt.Printf("Warning: Failed to decode notification response: %v\n", err) - return response, "", err + return response, NotificationOptions{}, err } - if userData != nil { - userDataJSON, err := json.Marshal(userData) - if err == nil { - return actionID, string(userDataJSON), nil - } - } - - return actionID, "", nil + return actionID, options, nil } func (wn *windowsNotifier) saveIconToDir() error { From af5abda8b1693fb391d22a0a20a6fddfa2edd296 Mon Sep 17 00:00:00 2001 From: popaprozac Date: Mon, 24 Mar 2025 21:34:10 -0700 Subject: [PATCH 208/374] update example --- v3/examples/notifications/main.go | 143 +++++++++++++++--------------- 1 file changed, 73 insertions(+), 70 deletions(-) diff --git a/v3/examples/notifications/main.go b/v3/examples/notifications/main.go index aae1bf2f0..264e7273e 100644 --- a/v3/examples/notifications/main.go +++ b/v3/examples/notifications/main.go @@ -8,6 +8,7 @@ import ( "time" "github.com/wailsapp/wails/v3/pkg/application" + "github.com/wailsapp/wails/v3/pkg/events" "github.com/wailsapp/wails/v3/pkg/services/notifications" ) @@ -61,85 +62,87 @@ func main() { URL: "/", }) - // Create a goroutine that spawns desktop notifications from Go - go func() { - var authorized bool - var err error - authorized, err = ns.CheckNotificationAuthorization() - if err != nil { - println(fmt.Errorf("checking app notification authorization failed: %s", err)) - } - - if !authorized { - authorized, err = ns.RequestNotificationAuthorization() + app.OnApplicationEvent(events.Common.ApplicationStarted, func(event *application.ApplicationEvent) { + // Create a goroutine that spawns desktop notifications from Go + go func() { + var authorized bool + var err error + authorized, err = ns.CheckNotificationAuthorization() if err != nil { - println(fmt.Errorf("requesting app notification authorization failed: %s", err)) + println(fmt.Errorf("checking app notification authorization failed: %s", err)) } - } - if authorized { - ns.OnNotificationResponse(func(result notifications.NotificationResult) { - if result.Error != nil { - println(fmt.Errorf("parsing notification result failed: %s", result.Error)) - } else { - fmt.Printf("Response: %+v\n", result.Response) - println("Sending response to frontend...") - app.EmitEvent("notification:action", result.Response) + if !authorized { + authorized, err = ns.RequestNotificationAuthorization() + if err != nil { + println(fmt.Errorf("requesting app notification authorization failed: %s", err)) } - }) - - err = ns.SendNotification(notifications.NotificationOptions{ - ID: "uuid-basic-1", - Title: "Notification Title", - Subtitle: "Subtitle on macOS and Linux", - Body: "Body text of notification.", - Data: map[string]interface{}{ - "user-id": "user-123", - "message-id": "msg-123", - "timestamp": time.Now().Unix(), - }, - }) - if err != nil { - println(fmt.Errorf("sending basic notification failed: %s", err)) } - // Delay before sending next notification - time.Sleep(time.Second * 2) + if authorized { + ns.OnNotificationResponse(func(result notifications.NotificationResult) { + if result.Error != nil { + println(fmt.Errorf("parsing notification result failed: %s", result.Error)) + } else { + fmt.Printf("Response: %+v\n", result.Response) + println("Sending response to frontend...") + app.EmitEvent("notification:action", result.Response) + } + }) - const CategoryID = "backend-notification-id" + err = ns.SendNotification(notifications.NotificationOptions{ + ID: "uuid-basic-1", + Title: "Notification Title", + Subtitle: "Subtitle on macOS and Linux", + Body: "Body text of notification.", + Data: map[string]interface{}{ + "user-id": "user-123", + "message-id": "msg-123", + "timestamp": time.Now().Unix(), + }, + }) + if err != nil { + println(fmt.Errorf("sending basic notification failed: %s", err)) + } - err = ns.RegisterNotificationCategory(notifications.NotificationCategory{ - ID: CategoryID, - Actions: []notifications.NotificationAction{ - {ID: "VIEW", Title: "View"}, - {ID: "MARK_READ", Title: "Mark as read"}, - {ID: "DELETE", Title: "Delete", Destructive: true}, - }, - HasReplyField: true, - ReplyPlaceholder: "Message...", - ReplyButtonTitle: "Reply", - }) - if err != nil { - println(fmt.Errorf("creating notification category failed: %s", err)) + // Delay before sending next notification + time.Sleep(time.Second * 2) + + const CategoryID = "backend-notification-id" + + err = ns.RegisterNotificationCategory(notifications.NotificationCategory{ + ID: CategoryID, + Actions: []notifications.NotificationAction{ + {ID: "VIEW", Title: "View"}, + {ID: "MARK_READ", Title: "Mark as read"}, + {ID: "DELETE", Title: "Delete", Destructive: true}, + }, + HasReplyField: true, + ReplyPlaceholder: "Message...", + ReplyButtonTitle: "Reply", + }) + if err != nil { + println(fmt.Errorf("creating notification category failed: %s", err)) + } + + err = ns.SendNotificationWithActions(notifications.NotificationOptions{ + ID: "uuid-with-actions-1", + Title: "Actions Notification Title", + Subtitle: "Subtitle on macOS and Linux", + Body: "Body text of notification with actions.", + CategoryID: CategoryID, + Data: map[string]interface{}{ + "user-id": "user-123", + "message-id": "msg-123", + "timestamp": time.Now().Unix(), + }, + }) + if err != nil { + println(fmt.Errorf("sending notification with actions failed: %s", err)) + } } - - err = ns.SendNotificationWithActions(notifications.NotificationOptions{ - ID: "uuid-with-actions-1", - Title: "Actions Notification Title", - Subtitle: "Subtitle on macOS and Linux", - Body: "Body text of notification with actions.", - CategoryID: CategoryID, - Data: map[string]interface{}{ - "user-id": "user-123", - "message-id": "msg-123", - "timestamp": time.Now().Unix(), - }, - }) - if err != nil { - println(fmt.Errorf("sending notification with actions failed: %s", err)) - } - } - }() + }() + }) // Run the application. This blocks until the application has been exited. err := app.Run() From 1db65a84c34684ac2713ed55e6da9199999ad9aa Mon Sep 17 00:00:00 2001 From: popaprozac Date: Wed, 26 Mar 2025 23:12:46 -0700 Subject: [PATCH 209/374] stage docs --- docs/src/content/docs/learn/notifications.mdx | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/src/content/docs/learn/notifications.mdx diff --git a/docs/src/content/docs/learn/notifications.mdx b/docs/src/content/docs/learn/notifications.mdx new file mode 100644 index 000000000..e69de29bb From 38ac5f799b57ad7545e2f2a400ddfc066d3e8675 Mon Sep 17 00:00:00 2001 From: popaprozac Date: Thu, 27 Mar 2025 11:24:13 -0700 Subject: [PATCH 210/374] sign all things --- .../commands/build_assets/darwin/Taskfile.yml | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/v3/internal/commands/build_assets/darwin/Taskfile.yml b/v3/internal/commands/build_assets/darwin/Taskfile.yml index 30e7da823..3dd73a042 100644 --- a/v3/internal/commands/build_assets/darwin/Taskfile.yml +++ b/v3/internal/commands/build_assets/darwin/Taskfile.yml @@ -19,7 +19,7 @@ tasks: - go build {{.BUILD_FLAGS}} -o {{.OUTPUT}} vars: BUILD_FLAGS: '{{if eq .PRODUCTION "true"}}-tags production -trimpath -buildvcs=false -ldflags="-w -s"{{else}}-buildvcs=false -gcflags=all="-l"{{end}}' - DEFAULT_OUTPUT: '{{.BIN_DIR}}/{{.APP_NAME}}' + DEFAULT_OUTPUT: '{{.BIN_DIR}}/build/{{.APP_NAME}}' OUTPUT: '{{ .OUTPUT | default .DEFAULT_OUTPUT }}' env: GOOS: darwin @@ -36,14 +36,14 @@ tasks: - task: build vars: ARCH: amd64 - OUTPUT: "{{.BIN_DIR}}/{{.APP_NAME}}-amd64" + OUTPUT: "{{.BIN_DIR}}/build/{{.APP_NAME}}-amd64" - task: build vars: ARCH: arm64 - OUTPUT: "{{.BIN_DIR}}/{{.APP_NAME}}-arm64" + OUTPUT: "{{.BIN_DIR}}/build/{{.APP_NAME}}-arm64" cmds: - - lipo -create -output "{{.BIN_DIR}}/{{.APP_NAME}}" "{{.BIN_DIR}}/{{.APP_NAME}}-amd64" "{{.BIN_DIR}}/{{.APP_NAME}}-arm64" - - rm "{{.BIN_DIR}}/{{.APP_NAME}}-amd64" "{{.BIN_DIR}}/{{.APP_NAME}}-arm64" + - lipo -create -output "{{.BIN_DIR}}/build/{{.APP_NAME}}" "{{.BIN_DIR}}/build/{{.APP_NAME}}-amd64" "{{.BIN_DIR}}/build/{{.APP_NAME}}-arm64" + - rm "{{.BIN_DIR}}/build/{{.APP_NAME}}-amd64" "{{.BIN_DIR}}/build/{{.APP_NAME}}-arm64" package: summary: Packages a production build of the application into a `.app` bundle @@ -65,11 +65,17 @@ tasks: create:app:bundle: summary: Creates an `.app` bundle cmds: - - mkdir -p {{.BIN_DIR}}/{{.APP_NAME}}.app/Contents/{MacOS,Resources} - - cp build/darwin/icons.icns {{.BIN_DIR}}/{{.APP_NAME}}.app/Contents/Resources - - cp {{.BIN_DIR}}/{{.APP_NAME}} {{.BIN_DIR}}/{{.APP_NAME}}.app/Contents/MacOS - - cp build/darwin/Info.plist {{.BIN_DIR}}/{{.APP_NAME}}.app/Contents + - mkdir -p {{.BIN_DIR}}/release/{{.APP_NAME}}.app/Contents/{MacOS,Resources} + - cp build/darwin/icons.icns {{.BIN_DIR}}/release/{{.APP_NAME}}.app/Contents/Resources + - cp {{.BIN_DIR}}/build/{{.APP_NAME}} {{.BIN_DIR}}/release/{{.APP_NAME}}.app/Contents/MacOS + - cp build/darwin/Info.plist {{.BIN_DIR}}/release/{{.APP_NAME}}.app/Contents + - codesign --force --deep --sign - {{.BIN_DIR}}/release/{{.APP_NAME}}.app run: cmds: - - '{{.BIN_DIR}}/{{.APP_NAME}}' + - mkdir -p {{.BIN_DIR}}/dev/{{.APP_NAME}}.app/Contents/{MacOS,Resources} + - cp build/darwin/icons.icns {{.BIN_DIR}}/dev/{{.APP_NAME}}.app/Contents/Resources + - cp {{.BIN_DIR}}/build/{{.APP_NAME}} {{.BIN_DIR}}/dev/{{.APP_NAME}}.app/Contents/MacOS + - cp build/darwin/Info.dev.plist {{.BIN_DIR}}/dev/{{.APP_NAME}}.app/Contents/Info.plist + - codesign --force --deep --sign - {{.BIN_DIR}}/dev/{{.APP_NAME}}.app + - '{{.BIN_DIR}}/dev/{{.APP_NAME}}.app/Contents/MacOS/{{.APP_NAME}}' From 9db28ec5fda336b3bd2e20c8c56919f9c733eca4 Mon Sep 17 00:00:00 2001 From: popaprozac Date: Thu, 27 Mar 2025 11:24:13 -0700 Subject: [PATCH 211/374] update docs/changelog --- docs/src/content/docs/changelog.mdx | 1 + docs/src/content/docs/guides/signing.mdx | 2 +- docs/src/content/docs/learn/build.mdx | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/src/content/docs/changelog.mdx b/docs/src/content/docs/changelog.mdx index 75dbf824b..89af3efeb 100644 --- a/docs/src/content/docs/changelog.mdx +++ b/docs/src/content/docs/changelog.mdx @@ -139,6 +139,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Built-in service types are now consistently called `Service` by [@fbbdev](https://github.com/fbbdev) in [#4067](https://github.com/wailsapp/wails/pull/4067) - Built-in service creation functions with options are now consistently called `NewWithConfig` by [@fbbdev](https://github.com/fbbdev) in [#4067](https://github.com/wailsapp/wails/pull/4067) - `Select` method on `sqlite` service is now named `Query` for consistency with Go APIs by [@fbbdev](https://github.com/fbbdev) in [#4067](https://github.com/wailsapp/wails/pull/4067) +- Creates and ad-hoc signs app bundles in dev to enable certain macOS APIs by [@popaprozac] in [#4171](https://github.com/wailsapp/wails/pull/4171) ## v3.0.0-alpha.9 - 2025-01-13 diff --git a/docs/src/content/docs/guides/signing.mdx b/docs/src/content/docs/guides/signing.mdx index b5de768c9..68b9aabed 100644 --- a/docs/src/content/docs/guides/signing.mdx +++ b/docs/src/content/docs/guides/signing.mdx @@ -86,7 +86,7 @@ This guide covers how to sign your Wails applications for both macOS and Windows 3. **Configure Notarization** ```json title="gon-sign.json" { - "source": ["./build/bin/app"], + "source": ["./build/bin/release/app"], "bundle_id": "com.company.app", "apple_id": { "username": "dev@company.com", diff --git a/docs/src/content/docs/learn/build.mdx b/docs/src/content/docs/learn/build.mdx index aeb5804af..e45c6e3b9 100644 --- a/docs/src/content/docs/learn/build.mdx +++ b/docs/src/content/docs/learn/build.mdx @@ -123,6 +123,7 @@ the application on macOS. Key features include: - Building binaries for amd64, arm64 and universal (both) architectures - Generating `.icns` icon file - Creating an `.app` bundle for distributing +- Ad-hoc signing `.app` bundles - Setting macOS-specific build flags and environment variables ## Task Execution and Command Aliases From 743882a9b9cb7ae8706da31347a431f0da16fb84 Mon Sep 17 00:00:00 2001 From: popaprozac Date: Thu, 27 Mar 2025 13:10:45 -0700 Subject: [PATCH 212/374] update docs/changelog --- docs/src/content/docs/changelog.mdx | 1 + docs/src/content/docs/learn/notifications.mdx | 304 ++++++++++++++++++ 2 files changed, 305 insertions(+) diff --git a/docs/src/content/docs/changelog.mdx b/docs/src/content/docs/changelog.mdx index 75dbf824b..cfded500e 100644 --- a/docs/src/content/docs/changelog.mdx +++ b/docs/src/content/docs/changelog.mdx @@ -76,6 +76,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Add cancellation support for query methods on `sqlite` service by [@fbbdev](https://github.com/fbbdev) in [#4067](https://github.com/wailsapp/wails/pull/4067) - Add prepared statement support to `sqlite` service with JS bindings by [@fbbdev](https://github.com/fbbdev) in [#4067](https://github.com/wailsapp/wails/pull/4067) - Add `SetMenu()` on window to allow for setting a menu on a window by [@leaanthony](https://github.com/leaanthony) +- Add Notification support by [@popaprozac] in [#4098](https://github.com/wailsapp/wails/pull/4098) ### Fixed diff --git a/docs/src/content/docs/learn/notifications.mdx b/docs/src/content/docs/learn/notifications.mdx index e69de29bb..6a8e9c7a8 100644 --- a/docs/src/content/docs/learn/notifications.mdx +++ b/docs/src/content/docs/learn/notifications.mdx @@ -0,0 +1,304 @@ +--- +title: Notifications +--- + +import { Tabs, TabItem } from "@astrojs/starlight/components"; + +## Introduction + +Wails provides a comprehensive cross-platform notification system for desktop applications. This service allows you to display native system notifications, with support for interactive elements like action buttons and text input fields. + +## Basic Usage + +### Creating the Service + +First, initialize the notifications service: + +```go +import "github.com/wailsapp/wails/v3/pkg/application" +import "github.com/wailsapp/wails/v3/services/notifications" + +// Create a new notification service +notifier := notifications.New() + +//Register the service with the application +app := application.New(application.Options{ + Services: []application.Service{ + application.NewService(notifier), + }, +}) +``` + +## Notification Authorization + +Notifications on macOS require user authorization. Request and check authorization: + +```go +authorized, err := notifier.CheckNotificationAuthorization() +if err != nil { + // Handle authorization error +} +if authorized { + // Send notifications +} else { + // Request authorization + authorized, err = notifier.RequestNotificationAuthorization() +} +``` +On Windows and Linux this always returns `true`. + +## Notification Types + +### Basic Notifications + +Send a basic notification with a unique id, title, optional subtitle (macOS and Linux), and body text to users: + +```go +notifier.SendNotification(notifications.NotificaionOptions{ + ID: "unique-id", + Title: "New Calendar Invite", + Subtitle: "From: Jane Doe", // Optional + Body: "Tap to view the event" +}) + +``` + +### Interactive Notifications +Send a notification with action buttons and text inputs. These notifications require a notification category to be resgistered first: + +```go +// Define a unique category id +categoryID := "unique-category-id" + +// Define a category with actions +category := notifications.NotificationCategory{ + ID: categoryID, + Actions: []notifications.NotificationAction{ + { + ID: "OPEN", + Title: "Open", + }, + { + ID: "ARCHIVE", + Title: "Archive", + Destructive: true, /* macOS-specific */ + }, + }, + HasReplyField: true, + ReplyPlaceholder: "message...", + ReplyButtonTitle: "Reply", +} + +// Register the category +notifier.RegisterNotificationCategory(category) + +// Send an interactive notification with the actions registered in the provided category +notifier.SendNotificationWithActions(notifications.NotificationOptions{ + ID: "unique-id", + Title: "New Message", + Subtitle: "From: Jane Doe", + Body: "Are you able to make it?", + CategoryID: categoryID, +}) +``` + +## Notification Responses + +Process user interactions with notifications: + +```go +notifier.OnNotificationResponse(func(result notifications.NotificationResult) { + response := result.Response + fmt.Printf("Notification %s was actioned with: %s\n", response.ID, response.ActionIdentifier) + + if response.ActionIdentifier == "TEXT_REPLY" { + fmt.Printf("User replied: %s\n", response.UserText) + } + + if data, ok := response.UserInfo["sender"].(string); ok { + fmt.Printf("Original sender: %s\n", data) + } + + // Emit an event to the frontend + app.EmitEvent("notification", result.Response) +}) +``` + +## Notification Customisation + +### Custom Metadata + +Basic and interactive notifications can include custom data: + +```go +notifier.SendNotification(notifications.NotificaionOptions{ + ID: "unique-id", + Title: "New Calendar Invite", + Subtitle: "From: Jane Doe", // Optional + Body: "Tap to view the event" + Data: map[string]interface{}{ + sender: "jane.doe@example.com", + timestamp: "2025-03-10T15:30:00Z", + } +}) + +``` + +## Platform Considerations + + + + + On macOS, notifications: + + - Require user authorization + - Require the app to be notorized for distribution + - Use system-standard notification appearances + - Support `subtitle` + - Support user text input + - Support the `Destructive` action option + - Automatically handle dark/light mode + + + + + + On Windows, notifications: + + - Use Windows system toast styles + - Adapt to Windows theme settings + - Support user text input + - Support high DPI displays + - Do not support `subtitle` + + + + + + On Linux, dialog behaviour depends on the desktop environment: + + - Use native notifications when available + - Follow desktop environment theme + - Position according to desktop environment rules + - Support `subtitle` + - Do not support user text input + + + + +## Best Practices + +1. Check and request for authorization: + - macOS requires user authorization + +2. Provide clear and concise notifications: + - Use descriptive titles, subtitles, text, and action titles + +3. Handle dialog responses appropriately: + - Check for errors in notification responses + - Provide feedback for user actions + +4. Consider platform conventions: + - Follow platform-specific notification patterns + - Respect system settings + +## Examples + +Explore this example: + +- [Notifications](/examples/notifications) + +## API Reference + +### Service Management +| Method | Description | +|--------------------------------------------|-------------------------------------------------------| +| `New()` | Creates a new notifications service | + +### Notification Authorization +| Method | Description | +|----------------------------------------------|------------------------------------------------------------| +| `RequestNotificationAuthorization()` | Requests permission to display notifications (macOS) | +| `CheckNotificationAuthorization()` | Checks current notification authorization status (macOS) | + +### Sending Notifications +| Method | Description | +|------------------------------------------------------------|---------------------------------------------------| +| `SendNotification(options NotificationOptions)` | Sends a basic notification | +| `SendNotificationWithActions(options NotificationOptions)` | Sends an interactive notification with actions | + +### Notification Categories +| Method | Description | +|---------------------------------------------------------------|---------------------------------------------------| +| `RegisterNotificationCategory(category NotificationCategory)` | Registers a reusable notification category | +| `RemoveNotificationCategory(categoryID string)` | Removes a previously registered category | + +### Managing Notifications +| Method | Description | +|-------------------------------------------------|---------------------------------------------------------------------| +| `RemoveAllPendingNotifications()` | Removes all pending notifications (macOS and Linux only) | +| `RemovePendingNotification(identifier string)` | Removes a specific pending notification (macOS and Linux only) | +| `RemoveAllDeliveredNotifications()` | Removes all delivered notifications (macOS and Linux only) | +| `RemoveDeliveredNotification(identifier string)`| Removes a specific delivered notification (macOS and Linux only) | +| `RemoveNotification(identifier string)` | Removes a notification (Linux-specific) | + +### Event Handling +| Method | Description | +|--------------------------------------------------------------------|-------------------------------------------------| +| `OnNotificationResponse(callback func(result NotificationResult))` | Registers a callback for notification responses | + +### Structs and Types + +#### NotificationOptions +```go +type NotificationOptions struct { + ID string // Unique identifier for the notification + Title string // Main notification title + Subtitle string // Subtitle text (macOS and Linux only) + Body string // Main notification content + CategoryID string // Category identifier for interactive notifications + Data map[string]interface{} // Custom data to associate with the notification +} +``` + +#### NotificationCategory +```go +type NotificationCategory struct { + ID string // Unique identifier for the category + Actions []NotificationAction // Button actions for the notification + HasReplyField bool // Whether to include a text input field + ReplyPlaceholder string // Placeholder text for the input field + ReplyButtonTitle string // Text for the reply button +} +``` + +#### NotificationAction +```go +type NotificationAction struct { + ID string // Unique identifier for the action + Title string // Button text + Destructive bool // Whether the action is destructive (macOS-specific) +} +``` + +#### NotificationResponse +```go +type NotificationResponse struct { + ID string // Notification identifier + ActionIdentifier string // Action that was triggered + CategoryID string // Category of the notification + Title string // Title of the notification + Subtitle string // Subtitle of the notification + Body string // Body text of the notification + UserText string // Text entered by the user + UserInfo map[string]interface{} // Custom data from the notification +} +``` + +#### NotificationResult +```go +type NotificationResult struct { + Response NotificationResponse // Response data + Error error // Any error that occurred +} +``` \ No newline at end of file From 1022f47f142aff0eb915a28b3808bbba15ed486c Mon Sep 17 00:00:00 2001 From: popaprozac Date: Thu, 27 Mar 2025 13:27:39 -0700 Subject: [PATCH 213/374] fix docs --- docs/src/content/docs/learn/notifications.mdx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/src/content/docs/learn/notifications.mdx b/docs/src/content/docs/learn/notifications.mdx index 6a8e9c7a8..393c563aa 100644 --- a/docs/src/content/docs/learn/notifications.mdx +++ b/docs/src/content/docs/learn/notifications.mdx @@ -54,7 +54,7 @@ On Windows and Linux this always returns `true`. Send a basic notification with a unique id, title, optional subtitle (macOS and Linux), and body text to users: ```go -notifier.SendNotification(notifications.NotificaionOptions{ +notifier.SendNotification(notifications.NotificationOptions{ ID: "unique-id", Title: "New Calendar Invite", Subtitle: "From: Jane Doe", // Optional @@ -137,8 +137,8 @@ notifier.SendNotification(notifications.NotificaionOptions{ Subtitle: "From: Jane Doe", // Optional Body: "Tap to view the event" Data: map[string]interface{}{ - sender: "jane.doe@example.com", - timestamp: "2025-03-10T15:30:00Z", + "sender": "jane.doe@example.com", + "timestamp": "2025-03-10T15:30:00Z", } }) From bd5c82ef351c5c240ae6a02c01f27b812cfb63c0 Mon Sep 17 00:00:00 2001 From: popaprozac Date: Thu, 27 Mar 2025 14:12:53 -0700 Subject: [PATCH 214/374] fix docs --- docs/src/content/docs/learn/notifications.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/content/docs/learn/notifications.mdx b/docs/src/content/docs/learn/notifications.mdx index 393c563aa..851e56228 100644 --- a/docs/src/content/docs/learn/notifications.mdx +++ b/docs/src/content/docs/learn/notifications.mdx @@ -131,7 +131,7 @@ notifier.OnNotificationResponse(func(result notifications.NotificationResult) { Basic and interactive notifications can include custom data: ```go -notifier.SendNotification(notifications.NotificaionOptions{ +notifier.SendNotification(notifications.NotificationOptions{ ID: "unique-id", Title: "New Calendar Invite", Subtitle: "From: Jane Doe", // Optional From b313f2cee137dc6148c89c598a5dae472e3ba0ae Mon Sep 17 00:00:00 2001 From: popaprozac Date: Thu, 27 Mar 2025 14:43:23 -0700 Subject: [PATCH 215/374] fix docs --- docs/src/content/docs/learn/notifications.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/src/content/docs/learn/notifications.mdx b/docs/src/content/docs/learn/notifications.mdx index 851e56228..5a59f5e2a 100644 --- a/docs/src/content/docs/learn/notifications.mdx +++ b/docs/src/content/docs/learn/notifications.mdx @@ -58,7 +58,7 @@ notifier.SendNotification(notifications.NotificationOptions{ ID: "unique-id", Title: "New Calendar Invite", Subtitle: "From: Jane Doe", // Optional - Body: "Tap to view the event" + Body: "Tap to view the event", }) ``` @@ -135,7 +135,7 @@ notifier.SendNotification(notifications.NotificationOptions{ ID: "unique-id", Title: "New Calendar Invite", Subtitle: "From: Jane Doe", // Optional - Body: "Tap to view the event" + Body: "Tap to view the event", Data: map[string]interface{}{ "sender": "jane.doe@example.com", "timestamp": "2025-03-10T15:30:00Z", From 8c3ee8f1bd9fd92df2f99773dec2a27871ebe611 Mon Sep 17 00:00:00 2001 From: Wilko Date: Sat, 29 Mar 2025 21:06:53 +0100 Subject: [PATCH 216/374] Support for File-Associations on macOS --- docs/src/content/docs/changelog.mdx | 1 + .../content/docs/guides/file-associations.mdx | 3 ++ v3/internal/commands/build-assets.go | 6 ++- v3/internal/commands/build_assets/config.yml | 1 + .../darwin/Info.dev.plist.tmpl | 45 ++++++++++++++----- .../darwin/Info.plist.tmpl | 45 ++++++++++++++----- 6 files changed, 77 insertions(+), 24 deletions(-) diff --git a/docs/src/content/docs/changelog.mdx b/docs/src/content/docs/changelog.mdx index 75dbf824b..291d33a42 100644 --- a/docs/src/content/docs/changelog.mdx +++ b/docs/src/content/docs/changelog.mdx @@ -76,6 +76,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Add cancellation support for query methods on `sqlite` service by [@fbbdev](https://github.com/fbbdev) in [#4067](https://github.com/wailsapp/wails/pull/4067) - Add prepared statement support to `sqlite` service with JS bindings by [@fbbdev](https://github.com/fbbdev) in [#4067](https://github.com/wailsapp/wails/pull/4067) - Add `SetMenu()` on window to allow for setting a menu on a window by [@leaanthony](https://github.com/leaanthony) +-  Add File Association support for mac by [@wimaha] ### Fixed diff --git a/docs/src/content/docs/guides/file-associations.mdx b/docs/src/content/docs/guides/file-associations.mdx index 3394b576f..eebc29364 100644 --- a/docs/src/content/docs/guides/file-associations.mdx +++ b/docs/src/content/docs/guides/file-associations.mdx @@ -62,6 +62,7 @@ fileAssociations: | description | Description shown in file properties | Windows | | iconName | Name of the icon file (without extension) in the build folder | All | | role | Application's role for this file type (e.g., `Editor`, `Viewer`) | macOS | +| mimeType | MIME type for the file (e.g., `image/jpeg`) | macOS | ## Listening for File Open Events @@ -105,6 +106,8 @@ Let's walk through setting up file associations for a simple text editor: Run `wails3 generate icons --help` for more information. ::: + - For macOS add copy statement like `cp build/darwin/documenticon.icns {{.BIN_DIR}}/{{.APP_NAME}}.app/Contents/Resources` in the `create:app:bundle:` task. + 2. ### Configure File Associations Edit the `build/config.yml` file to add your file associations: diff --git a/v3/internal/commands/build-assets.go b/v3/internal/commands/build-assets.go index 12b5694fd..1fa9138f5 100644 --- a/v3/internal/commands/build-assets.go +++ b/v3/internal/commands/build-assets.go @@ -4,14 +4,15 @@ import ( "embed" _ "embed" "fmt" - "github.com/leaanthony/gosod" - "gopkg.in/yaml.v3" "io/fs" "os" "path/filepath" "runtime" "strings" "time" + + "github.com/leaanthony/gosod" + "gopkg.in/yaml.v3" ) //go:embed build_assets @@ -121,6 +122,7 @@ type FileAssociation struct { Description string `yaml:"description"` IconName string `yaml:"iconName"` Role string `yaml:"role"` + MimeType string `yaml:"mimeType"` } type UpdateConfig struct { diff --git a/v3/internal/commands/build_assets/config.yml b/v3/internal/commands/build_assets/config.yml index bc09a6d28..8a5e2f4c8 100644 --- a/v3/internal/commands/build_assets/config.yml +++ b/v3/internal/commands/build_assets/config.yml @@ -56,6 +56,7 @@ fileAssociations: # description: Image File # iconName: jpegFileIcon # role: Editor +# mimeType: image/jpeg # (optional) # Other data other: diff --git a/v3/internal/commands/updatable_build_assets/darwin/Info.dev.plist.tmpl b/v3/internal/commands/updatable_build_assets/darwin/Info.dev.plist.tmpl index 47f39f537..e44a679d2 100644 --- a/v3/internal/commands/updatable_build_assets/darwin/Info.dev.plist.tmpl +++ b/v3/internal/commands/updatable_build_assets/darwin/Info.dev.plist.tmpl @@ -2,27 +2,50 @@ CFBundlePackageType - APPL + APPL CFBundleName - {{.ProductName}} + {{.ProductName}} CFBundleExecutable - {{.BinaryName}} + {{.BinaryName}} CFBundleIdentifier - {{.ProductIdentifier}} + {{.ProductIdentifier}} CFBundleVersion - {{.ProductVersion}} + {{.ProductVersion}} CFBundleGetInfoString - {{.ProductComments}} + {{.ProductComments}} CFBundleShortVersionString - {{.ProductVersion}} + {{.ProductVersion}} CFBundleIconFile - icons + icons LSMinimumSystemVersion - 10.15.0 + 10.15.0 NSHighResolutionCapable - true + true NSHumanReadableCopyright - {{.ProductCopyright}} + {{.ProductCopyright}} + {{- if .FileAssociations}} + CFBundleDocumentTypes + + {{- range .FileAssociations}} + + CFBundleTypeExtensions + + {{.Ext}} + + CFBundleTypeName + {{.Name}} + CFBundleTypeRole + {{.Role}} + CFBundleTypeIconFile + {{.IconName}} + {{- if .MimeType}} + CFBundleTypeMimeType + {{.MimeType}} + {{- end}} + + {{- end}} + + {{- end}} NSAppTransportSecurity NSAllowsLocalNetworking diff --git a/v3/internal/commands/updatable_build_assets/darwin/Info.plist.tmpl b/v3/internal/commands/updatable_build_assets/darwin/Info.plist.tmpl index 3dce3676c..c20032556 100644 --- a/v3/internal/commands/updatable_build_assets/darwin/Info.plist.tmpl +++ b/v3/internal/commands/updatable_build_assets/darwin/Info.plist.tmpl @@ -2,26 +2,49 @@ CFBundlePackageType - APPL + APPL CFBundleName - {{.ProductName}} + {{.ProductName}} CFBundleExecutable - {{.BinaryName}} + {{.BinaryName}} CFBundleIdentifier - {{.ProductIdentifier}} + {{.ProductIdentifier}} CFBundleVersion - {{.ProductVersion}} + {{.ProductVersion}} CFBundleGetInfoString - {{.ProductComments}} + {{.ProductComments}} CFBundleShortVersionString - {{.ProductVersion}} + {{.ProductVersion}} CFBundleIconFile - icons + icons LSMinimumSystemVersion - 10.15.0 + 10.15.0 NSHighResolutionCapable - true + true NSHumanReadableCopyright - {{.ProductCopyright}} + {{.ProductCopyright}} + {{- if .FileAssociations}} + CFBundleDocumentTypes + + {{- range .FileAssociations}} + + CFBundleTypeExtensions + + {{.Ext}} + + CFBundleTypeName + {{.Name}} + CFBundleTypeRole + {{.Role}} + CFBundleTypeIconFile + {{.IconName}} + {{- if .MimeType}} + CFBundleTypeMimeType + {{.MimeType}} + {{- end}} + + {{- end}} + + {{- end}} \ No newline at end of file From 5f8a858aa9a42ede5e39346b29fd2887af07b7ae Mon Sep 17 00:00:00 2001 From: Wilko Date: Sat, 29 Mar 2025 21:40:50 +0100 Subject: [PATCH 217/374] Update changelog.mdx --- docs/src/content/docs/changelog.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/content/docs/changelog.mdx b/docs/src/content/docs/changelog.mdx index 291d33a42..79e020b66 100644 --- a/docs/src/content/docs/changelog.mdx +++ b/docs/src/content/docs/changelog.mdx @@ -76,7 +76,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Add cancellation support for query methods on `sqlite` service by [@fbbdev](https://github.com/fbbdev) in [#4067](https://github.com/wailsapp/wails/pull/4067) - Add prepared statement support to `sqlite` service with JS bindings by [@fbbdev](https://github.com/fbbdev) in [#4067](https://github.com/wailsapp/wails/pull/4067) - Add `SetMenu()` on window to allow for setting a menu on a window by [@leaanthony](https://github.com/leaanthony) --  Add File Association support for mac by [@wimaha] +-  Add File Association support for mac by [@wimaha](https://github.com/wimaha) in [#4177](https://github.com/wailsapp/wails/pull/4177) ### Fixed From 9a41b0ce9f9a2e4d5d62e717491ec7a37615b53b Mon Sep 17 00:00:00 2001 From: popaprozac Date: Sat, 29 Mar 2025 23:36:25 -0700 Subject: [PATCH 218/374] move icon method, impl interface, check compat, don't panic! --- .../notifications/notifications_darwin.go | 43 +++-- .../notifications/notifications_darwin.h | 1 + .../notifications/notifications_darwin.m | 39 ++-- .../notifications/notifications_windows.go | 2 +- .../notifications_windows_icon.go | 173 ------------------ v3/pkg/w32/icon.go | 118 ++++++++++++ 6 files changed, 176 insertions(+), 200 deletions(-) delete mode 100644 v3/pkg/services/notifications/notifications_windows_icon.go diff --git a/v3/pkg/services/notifications/notifications_darwin.go b/v3/pkg/services/notifications/notifications_darwin.go index 1a64cbb9e..02dc4fc95 100644 --- a/v3/pkg/services/notifications/notifications_darwin.go +++ b/v3/pkg/services/notifications/notifications_darwin.go @@ -3,8 +3,13 @@ package notifications /* -#cgo CFLAGS: -mmacosx-version-min=11.0 -x objective-c -#cgo LDFLAGS: -framework Cocoa -mmacosx-version-min=11 -framework UserNotifications +#cgo CFLAGS:-x objective-c +#cgo LDFLAGS: -framework Foundation -framework Cocoa + +#if __MAC_OS_X_VERSION_MAX_ALLOWED >= 110000 +#cgo LDFLAGS: -framework UserNotifications +#endif + #import "./notifications_darwin.h" */ import "C" @@ -30,21 +35,18 @@ type notificationChannel struct { Error error } +type ChannelHandler interface { + GetChannel(id int) (chan notificationChannel, bool) +} + +var _ ChannelHandler = (*darwinNotifier)(nil) + const AppleDefaultActionIdentifier = "com.apple.UNNotificationDefaultActionIdentifier" // Creates a new Notifications Service. // Your app must be packaged and signed for this feature to work. func New() *Service { notificationServiceOnce.Do(func() { - if !CheckBundleIdentifier() { - panic("\nError: Cannot use the notification API in development mode on macOS.\n" + - "Notifications require the app to be properly bundled with a bundle identifier and signed.\n" + - "To use the notification API on macOS:\n" + - " 1. Build and package your app using 'wails3 package'\n" + - " 2. Sign the packaged .app\n" + - " 3. Run the signed .app bundle") - } - impl := &darwinNotifier{ channels: make(map[int]chan notificationChannel), nextChannelID: 0, @@ -59,6 +61,12 @@ func New() *Service { } func (dn *darwinNotifier) Startup(ctx context.Context, options application.ServiceOptions) error { + if !isNotificationAvailable() { + return fmt.Errorf("notifications are not available on this system") + } + if !checkBundleIdentifier() { + return fmt.Errorf("notifications require a valid bundle identifier") + } return nil } @@ -66,7 +74,12 @@ func (dn *darwinNotifier) Shutdown() error { return nil } -func CheckBundleIdentifier() bool { +// isNotificationAvailable checks if notifications are available on the system. +func isNotificationAvailable() bool { + return bool(C.isNotificationAvailable()) +} + +func checkBundleIdentifier() bool { return bool(C.checkBundleIdentifier()) } @@ -310,12 +323,12 @@ func captureResult(channelID C.int, success C.bool, errorMsg *C.char) { return } - dn, ok := ns.impl.(*darwinNotifier) + handler, ok := ns.impl.(ChannelHandler) if !ok { return } - resultCh, exists := dn.getChannel(int(channelID)) + resultCh, exists := handler.GetChannel(int(channelID)) if !exists { return } @@ -390,7 +403,7 @@ func (dn *darwinNotifier) registerChannel() (int, chan notificationChannel) { return id, resultCh } -func (dn *darwinNotifier) getChannel(id int) (chan notificationChannel, bool) { +func (dn *darwinNotifier) GetChannel(id int) (chan notificationChannel, bool) { dn.channelsLock.Lock() defer dn.channelsLock.Unlock() diff --git a/v3/pkg/services/notifications/notifications_darwin.h b/v3/pkg/services/notifications/notifications_darwin.h index f7acf6d1a..7cd505240 100644 --- a/v3/pkg/services/notifications/notifications_darwin.h +++ b/v3/pkg/services/notifications/notifications_darwin.h @@ -6,6 +6,7 @@ #import bool checkBundleIdentifier(void); +bool isNotificationAvailable(void); void requestNotificationAuthorization(int channelID); void checkNotificationAuthorization(int channelID); void sendNotification(int channelID, const char *identifier, const char *title, const char *subtitle, const char *body, const char *data_json); diff --git a/v3/pkg/services/notifications/notifications_darwin.m b/v3/pkg/services/notifications/notifications_darwin.m index 4ea4918ae..6c2048b74 100644 --- a/v3/pkg/services/notifications/notifications_darwin.m +++ b/v3/pkg/services/notifications/notifications_darwin.m @@ -1,7 +1,26 @@ #import "notifications_darwin.h" #include #import + +#if __MAC_OS_X_VERSION_MAX_ALLOWED >= 110000 #import +#endif + +bool isNotificationAvailable(void) { + if (@available(macOS 11.0, *)) { + return YES; + } else { + return NO; + } +} + +bool checkBundleIdentifier(void) { + NSBundle *main = [NSBundle mainBundle]; + if (main.bundleIdentifier == nil) { + return NO; + } + return YES; +} extern void captureResult(int channelID, bool success, const char* error); extern void didReceiveNotificationResponse(const char *jsonPayload, const char* error); @@ -14,9 +33,15 @@ extern void didReceiveNotificationResponse(const char *jsonPayload, const char* - (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler { - UNNotificationPresentationOptions options = UNNotificationPresentationOptionList | - UNNotificationPresentationOptionBanner | - UNNotificationPresentationOptionSound; + UNNotificationPresentationOptions options = 0; + + if (@available(macOS 11.0, *)) { + // These options are only available in macOS 11.0+ + options = UNNotificationPresentationOptionList | + UNNotificationPresentationOptionBanner | + UNNotificationPresentationOptionSound; + } + completionHandler(options); } @@ -82,14 +107,6 @@ static BOOL ensureDelegateInitialized(void) { return success; } -bool checkBundleIdentifier(void) { - NSBundle *main = [NSBundle mainBundle]; - if (main.bundleIdentifier == nil) { - return false; - } - return true; -} - void requestNotificationAuthorization(int channelID) { if (!ensureDelegateInitialized()) { NSString *errorMsg = @"Notification delegate has been lost. Reinitialize the notification service."; diff --git a/v3/pkg/services/notifications/notifications_windows.go b/v3/pkg/services/notifications/notifications_windows.go index e22fe01b6..b7a16decc 100644 --- a/v3/pkg/services/notifications/notifications_windows.go +++ b/v3/pkg/services/notifications/notifications_windows.go @@ -327,7 +327,7 @@ func (wn *windowsNotifier) saveIconToDir() error { return fmt.Errorf("failed to retrieve application icon: %w", err) } - return saveHIconAsPNG(icon, wn.iconPath) + return w32.SaveHIconAsPNG(icon, wn.iconPath) } func (wn *windowsNotifier) saveCategoriesToRegistry() error { diff --git a/v3/pkg/services/notifications/notifications_windows_icon.go b/v3/pkg/services/notifications/notifications_windows_icon.go deleted file mode 100644 index aed560594..000000000 --- a/v3/pkg/services/notifications/notifications_windows_icon.go +++ /dev/null @@ -1,173 +0,0 @@ -//go:build windows - -package notifications - -import ( - "image" - "image/color" - "image/png" - "os" - "syscall" - "unsafe" - - "github.com/wailsapp/wails/v3/pkg/w32" -) - -// Windows API constants -const ( - SRCCOPY = 0x00CC0020 - BI_RGB = 0 - DIB_RGB_COLORS = 0 -) - -// Windows structures -type ICONINFO struct { - FIcon int32 - XHotspot int32 - YHotspot int32 - HbmMask syscall.Handle - HbmColor syscall.Handle -} - -type BITMAP struct { - BmType int32 - BmWidth int32 - BmHeight int32 - BmWidthBytes int32 - BmPlanes uint16 - BmBitsPixel uint16 - BmBits uintptr -} - -type BITMAPINFOHEADER struct { - BiSize uint32 - BiWidth int32 - BiHeight int32 - BiPlanes uint16 - BiBitCount uint16 - BiCompression uint32 - BiSizeImage uint32 - BiXPelsPerMeter int32 - BiYPelsPerMeter int32 - BiClrUsed uint32 - BiClrImportant uint32 -} - -type RGBQUAD struct { - RgbBlue byte - RgbGreen byte - RgbRed byte - RgbReserved byte -} - -type BITMAPINFO struct { - BmiHeader BITMAPINFOHEADER - BmiColors [1]RGBQUAD -} - -func saveHIconAsPNG(hIcon w32.HICON, filePath string) error { - // Load necessary DLLs - user32 := syscall.NewLazyDLL("user32.dll") - gdi32 := syscall.NewLazyDLL("gdi32.dll") - - // Get procedures - getIconInfo := user32.NewProc("GetIconInfo") - getObject := gdi32.NewProc("GetObjectW") - createCompatibleDC := gdi32.NewProc("CreateCompatibleDC") - selectObject := gdi32.NewProc("SelectObject") - getDIBits := gdi32.NewProc("GetDIBits") - deleteObject := gdi32.NewProc("DeleteObject") - deleteDC := gdi32.NewProc("DeleteDC") - - // Get icon info - var iconInfo ICONINFO - ret, _, err := getIconInfo.Call( - uintptr(hIcon), - uintptr(unsafe.Pointer(&iconInfo)), - ) - if ret == 0 { - return err - } - defer deleteObject.Call(uintptr(iconInfo.HbmMask)) - defer deleteObject.Call(uintptr(iconInfo.HbmColor)) - - // Get bitmap info - var bmp BITMAP - ret, _, err = getObject.Call( - uintptr(iconInfo.HbmColor), - unsafe.Sizeof(bmp), - uintptr(unsafe.Pointer(&bmp)), - ) - if ret == 0 { - return err - } - - // Create DC - hdc, _, _ := createCompatibleDC.Call(0) - if hdc == 0 { - return syscall.EINVAL - } - defer deleteDC.Call(hdc) - - // Select bitmap into DC - oldBitmap, _, _ := selectObject.Call(hdc, uintptr(iconInfo.HbmColor)) - defer selectObject.Call(hdc, oldBitmap) - - // Prepare bitmap info header - var bi BITMAPINFO - bi.BmiHeader.BiSize = uint32(unsafe.Sizeof(bi.BmiHeader)) - bi.BmiHeader.BiWidth = bmp.BmWidth - bi.BmiHeader.BiHeight = bmp.BmHeight - bi.BmiHeader.BiPlanes = 1 - bi.BmiHeader.BiBitCount = 32 - bi.BmiHeader.BiCompression = BI_RGB - - // Allocate memory for bitmap bits - width, height := int(bmp.BmWidth), int(bmp.BmHeight) - bufferSize := width * height * 4 - bits := make([]byte, bufferSize) - - // Get bitmap bits - ret, _, err = getDIBits.Call( - hdc, - uintptr(iconInfo.HbmColor), - 0, - uintptr(bmp.BmHeight), - uintptr(unsafe.Pointer(&bits[0])), - uintptr(unsafe.Pointer(&bi)), - DIB_RGB_COLORS, - ) - if ret == 0 { - return err - } - - // Create Go image - img := image.NewRGBA(image.Rect(0, 0, width, height)) - - // Convert DIB to RGBA - for y := 0; y < height; y++ { - for x := 0; x < width; x++ { - // DIB is bottom-up, so we need to invert Y - dibIndex := ((height-1-y)*width + x) * 4 - - // BGRA to RGBA - b := bits[dibIndex] - g := bits[dibIndex+1] - r := bits[dibIndex+2] - a := bits[dibIndex+3] - - // Set pixel in the image - img.Set(x, y, color.RGBA{R: r, G: g, B: b, A: a}) - } - } - - // Create output file - outFile, err := os.Create(filePath) - if err != nil { - return err - } - defer outFile.Close() - - // Encode and save the image - return png.Encode(outFile, img) -} diff --git a/v3/pkg/w32/icon.go b/v3/pkg/w32/icon.go index 009479323..97d4ad854 100644 --- a/v3/pkg/w32/icon.go +++ b/v3/pkg/w32/icon.go @@ -6,8 +6,11 @@ import ( "bytes" "fmt" "image" + "image/color" "image/draw" "image/png" + "os" + "syscall" "unsafe" ) @@ -90,6 +93,121 @@ func CreateLargeHIconFromImage(fileData []byte) (HICON, error) { return HICON(icon), err } +type ICONINFO struct { + FIcon int32 + XHotspot int32 + YHotspot int32 + HbmMask syscall.Handle + HbmColor syscall.Handle +} + +func SaveHIconAsPNG(hIcon HICON, filePath string) error { + // Load necessary DLLs + user32 := syscall.NewLazyDLL("user32.dll") + gdi32 := syscall.NewLazyDLL("gdi32.dll") + + // Get procedures + getIconInfo := user32.NewProc("GetIconInfo") + getObject := gdi32.NewProc("GetObjectW") + createCompatibleDC := gdi32.NewProc("CreateCompatibleDC") + selectObject := gdi32.NewProc("SelectObject") + getDIBits := gdi32.NewProc("GetDIBits") + deleteObject := gdi32.NewProc("DeleteObject") + deleteDC := gdi32.NewProc("DeleteDC") + + // Get icon info + var iconInfo ICONINFO + ret, _, err := getIconInfo.Call( + uintptr(hIcon), + uintptr(unsafe.Pointer(&iconInfo)), + ) + if ret == 0 { + return err + } + defer deleteObject.Call(uintptr(iconInfo.HbmMask)) + defer deleteObject.Call(uintptr(iconInfo.HbmColor)) + + // Get bitmap info + var bmp BITMAP + ret, _, err = getObject.Call( + uintptr(iconInfo.HbmColor), + unsafe.Sizeof(bmp), + uintptr(unsafe.Pointer(&bmp)), + ) + if ret == 0 { + return err + } + + // Create DC + hdc, _, _ := createCompatibleDC.Call(0) + if hdc == 0 { + return syscall.EINVAL + } + defer deleteDC.Call(hdc) + + // Select bitmap into DC + oldBitmap, _, _ := selectObject.Call(hdc, uintptr(iconInfo.HbmColor)) + defer selectObject.Call(hdc, oldBitmap) + + // Prepare bitmap info header + var bi BITMAPINFO + bi.BmiHeader.BiSize = uint32(unsafe.Sizeof(bi.BmiHeader)) + bi.BmiHeader.BiWidth = bmp.BmWidth + bi.BmiHeader.BiHeight = bmp.BmHeight + bi.BmiHeader.BiPlanes = 1 + bi.BmiHeader.BiBitCount = 32 + bi.BmiHeader.BiCompression = BI_RGB + + // Allocate memory for bitmap bits + width, height := int(bmp.BmWidth), int(bmp.BmHeight) + bufferSize := width * height * 4 + bits := make([]byte, bufferSize) + + // Get bitmap bits + ret, _, err = getDIBits.Call( + hdc, + uintptr(iconInfo.HbmColor), + 0, + uintptr(bmp.BmHeight), + uintptr(unsafe.Pointer(&bits[0])), + uintptr(unsafe.Pointer(&bi)), + DIB_RGB_COLORS, + ) + if ret == 0 { + return err + } + + // Create Go image + img := image.NewRGBA(image.Rect(0, 0, width, height)) + + // Convert DIB to RGBA + for y := 0; y < height; y++ { + for x := 0; x < width; x++ { + // DIB is bottom-up, so we need to invert Y + dibIndex := ((height-1-y)*width + x) * 4 + + // BGRA to RGBA + b := bits[dibIndex] + g := bits[dibIndex+1] + r := bits[dibIndex+2] + a := bits[dibIndex+3] + + // Set pixel in the image + img.Set(x, y, color.RGBA{R: r, G: g, B: b, A: a}) + } + } + + // Create output file + outFile, err := os.Create(filePath) + if err != nil { + return err + } + defer outFile.Close() + + // Encode and save the image + return png.Encode(outFile, img) +} + func SetWindowIcon(hwnd HWND, icon HICON) { SendMessage(hwnd, WM_SETICON, ICON_SMALL, uintptr(icon)) } From 75dbe85ad699c5bc6f71f38c2d0de87f0d53c48b Mon Sep 17 00:00:00 2001 From: popaprozac Date: Sat, 29 Mar 2025 23:39:50 -0700 Subject: [PATCH 219/374] remove comptime check --- v3/pkg/services/notifications/notifications_darwin.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/v3/pkg/services/notifications/notifications_darwin.go b/v3/pkg/services/notifications/notifications_darwin.go index 02dc4fc95..2c8f33d15 100644 --- a/v3/pkg/services/notifications/notifications_darwin.go +++ b/v3/pkg/services/notifications/notifications_darwin.go @@ -39,8 +39,6 @@ type ChannelHandler interface { GetChannel(id int) (chan notificationChannel, bool) } -var _ ChannelHandler = (*darwinNotifier)(nil) - const AppleDefaultActionIdentifier = "com.apple.UNNotificationDefaultActionIdentifier" // Creates a new Notifications Service. From 3f22e1fe0ca39e3ca5825f8e7f2960aa56a60139 Mon Sep 17 00:00:00 2001 From: Gabriel Lima <39922116+TheGB0077@users.noreply.github.com> Date: Sun, 6 Apr 2025 22:36:22 -0300 Subject: [PATCH 220/374] Normalize Windows paths by default JS code ends up escaping Windows paths when data gets passed around from backend to the frontend, so those should be normalized beforehand. --- v3/pkg/application/dialogs_windows.go | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/v3/pkg/application/dialogs_windows.go b/v3/pkg/application/dialogs_windows.go index 36e153141..04b9e96b8 100644 --- a/v3/pkg/application/dialogs_windows.go +++ b/v3/pkg/application/dialogs_windows.go @@ -234,6 +234,10 @@ func convertFilters(filters []FileFilter) []cfd.FileFilter { return result } +func normalizeWindowsPath(path string) string { + return strings.ReplaceAll(path, "\\", "/") +} + func showCfdDialog(newDlg func() (cfd.Dialog, error), isMultiSelect bool) (any, error) { dlg, err := newDlg() if err != nil { @@ -247,7 +251,20 @@ func showCfdDialog(newDlg func() (cfd.Dialog, error), isMultiSelect bool) (any, }() if multi, _ := dlg.(cfd.OpenMultipleFilesDialog); multi != nil && isMultiSelect { - return multi.ShowAndGetResults() + paths, err := multi.ShowAndGetResults() + if err != nil { + return nil, err + } + + for i, path := range paths { + paths[i] = normalizeWindowsPath(path) + } + return paths, nil } - return dlg.ShowAndGetResult() + + path, err := dlg.ShowAndGetResult() + if err != nil { + return nil, err + } + return normalizeWindowsPath(path), nil } From f6750c3a481b759e45c4d6c9d9055fd061ad0239 Mon Sep 17 00:00:00 2001 From: Gabriel Lima <39922116+TheGB0077@users.noreply.github.com> Date: Mon, 7 Apr 2025 13:35:37 -0300 Subject: [PATCH 221/374] delete redundant method --- v3/pkg/application/dialogs_windows.go | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/v3/pkg/application/dialogs_windows.go b/v3/pkg/application/dialogs_windows.go index 04b9e96b8..ef5b625fc 100644 --- a/v3/pkg/application/dialogs_windows.go +++ b/v3/pkg/application/dialogs_windows.go @@ -234,10 +234,6 @@ func convertFilters(filters []FileFilter) []cfd.FileFilter { return result } -func normalizeWindowsPath(path string) string { - return strings.ReplaceAll(path, "\\", "/") -} - func showCfdDialog(newDlg func() (cfd.Dialog, error), isMultiSelect bool) (any, error) { dlg, err := newDlg() if err != nil { @@ -257,7 +253,7 @@ func showCfdDialog(newDlg func() (cfd.Dialog, error), isMultiSelect bool) (any, } for i, path := range paths { - paths[i] = normalizeWindowsPath(path) + paths[i] = filepath.Clean(path) } return paths, nil } @@ -266,5 +262,5 @@ func showCfdDialog(newDlg func() (cfd.Dialog, error), isMultiSelect bool) (any, if err != nil { return nil, err } - return normalizeWindowsPath(path), nil + return filepath.Clean(path), nil } From e62c0b0b80f00701efb29dc8390ecd3958344e1a Mon Sep 17 00:00:00 2001 From: Gabriel Lima <39922116+TheGB0077@users.noreply.github.com> Date: Mon, 7 Apr 2025 20:27:11 -0300 Subject: [PATCH 222/374] Add fix to changelog [skip ci] --- docs/src/content/docs/changelog.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/src/content/docs/changelog.mdx b/docs/src/content/docs/changelog.mdx index 75dbf824b..e0cc919ea 100644 --- a/docs/src/content/docs/changelog.mdx +++ b/docs/src/content/docs/changelog.mdx @@ -111,6 +111,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fixed initially-hidden menu items by [@IanVS](https://github.com/IanVS) in [#4116](https://github.com/wailsapp/wails/pull/4116) - Fixed assetFileServer not serving `.html` files when non-extension request when `[request]` doesn't exist but `[request].html` does - Fixed icon generation paths by [@robin-samuel](https://github.com/robin-samuel) in [#4125](https://github.com/wailsapp/wails/pull/4125) +- Fixed Dialogs rutime function returning escaped paths on Windows by [TheGB0077](https://github.com/TheGB0077) in [#4188](https://github.com/wailsapp/wails/pull/4188) ### Changed From 1b00dc9ac7fa380452a280d6a1b279626c39d209 Mon Sep 17 00:00:00 2001 From: Gabriel Lima <39922116+TheGB0077@users.noreply.github.com> Date: Mon, 7 Apr 2025 20:30:01 -0300 Subject: [PATCH 223/374] small typo --- docs/src/content/docs/changelog.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/content/docs/changelog.mdx b/docs/src/content/docs/changelog.mdx index e0cc919ea..ef003acf3 100644 --- a/docs/src/content/docs/changelog.mdx +++ b/docs/src/content/docs/changelog.mdx @@ -111,7 +111,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fixed initially-hidden menu items by [@IanVS](https://github.com/IanVS) in [#4116](https://github.com/wailsapp/wails/pull/4116) - Fixed assetFileServer not serving `.html` files when non-extension request when `[request]` doesn't exist but `[request].html` does - Fixed icon generation paths by [@robin-samuel](https://github.com/robin-samuel) in [#4125](https://github.com/wailsapp/wails/pull/4125) -- Fixed Dialogs rutime function returning escaped paths on Windows by [TheGB0077](https://github.com/TheGB0077) in [#4188](https://github.com/wailsapp/wails/pull/4188) +- Fixed Dialogs runtime function returning escaped paths on Windows by [TheGB0077](https://github.com/TheGB0077) in [#4188](https://github.com/wailsapp/wails/pull/4188) ### Changed From f46352dbe1d64e53abdb3a9a010b1779badcd37a Mon Sep 17 00:00:00 2001 From: Gabriel Lima <39922116+TheGB0077@users.noreply.github.com> Date: Wed, 9 Apr 2025 16:21:59 -0300 Subject: [PATCH 224/374] Create dialogs_windows_test.go --- v3/pkg/application/dialogs_windows_test.go | 57 ++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 v3/pkg/application/dialogs_windows_test.go diff --git a/v3/pkg/application/dialogs_windows_test.go b/v3/pkg/application/dialogs_windows_test.go new file mode 100644 index 000000000..af4dabf75 --- /dev/null +++ b/v3/pkg/application/dialogs_windows_test.go @@ -0,0 +1,57 @@ +//go:build windows + +package application_test + +import ( + "path/filepath" + "testing" + + "github.com/matryer/is" +) + +func TestCleanPath(t *testing.T) { + i := is.New(t) + tests := []struct { + name string + inputPath string + expected string + }{ + { + name: "path with double separators", + inputPath: `C:\\temp\\folder`, + expected: `C:\temp\folder`, + }, + { + name: "path with forward slashes", + inputPath: `C://temp//folder`, + expected: `C:\temp\folder`, + }, + { + name: "path with trailing separator", + inputPath: `C:\\temp\\folder\\`, + expected: `C:\temp\folder`, + }, + { + name: "path with escaped tab character", + inputPath: `C:\\Users\\test\\tab.txt`, + expected: `C:\Users\test\tab.txt`, + }, + { + name: "newline character", + inputPath: `C:\\Users\\test\\newline\\n.txt`, + expected: `C:\Users\test\newline\n.txt`, + }, + { + name: "UNC path with multiple separators", + inputPath: `\\\\\\\\host\\share\\test.txt`, + expected: `\\\\host\share\test.txt`, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + cleaned := filepath.Clean(tt.inputPath) + i.Equal(cleaned, tt.expected) + }) + } +} From c482c85c7b3885438c2b1dd8b20ae4998ee37131 Mon Sep 17 00:00:00 2001 From: popaprozac Date: Wed, 9 Apr 2025 15:48:52 -0700 Subject: [PATCH 225/374] revert and append .dev --- docs/src/content/docs/guides/signing.mdx | 2 +- .../commands/build_assets/darwin/Taskfile.yml | 32 +++++++++---------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/docs/src/content/docs/guides/signing.mdx b/docs/src/content/docs/guides/signing.mdx index 68b9aabed..b5de768c9 100644 --- a/docs/src/content/docs/guides/signing.mdx +++ b/docs/src/content/docs/guides/signing.mdx @@ -86,7 +86,7 @@ This guide covers how to sign your Wails applications for both macOS and Windows 3. **Configure Notarization** ```json title="gon-sign.json" { - "source": ["./build/bin/release/app"], + "source": ["./build/bin/app"], "bundle_id": "com.company.app", "apple_id": { "username": "dev@company.com", diff --git a/v3/internal/commands/build_assets/darwin/Taskfile.yml b/v3/internal/commands/build_assets/darwin/Taskfile.yml index 3dd73a042..f0791fea9 100644 --- a/v3/internal/commands/build_assets/darwin/Taskfile.yml +++ b/v3/internal/commands/build_assets/darwin/Taskfile.yml @@ -19,7 +19,7 @@ tasks: - go build {{.BUILD_FLAGS}} -o {{.OUTPUT}} vars: BUILD_FLAGS: '{{if eq .PRODUCTION "true"}}-tags production -trimpath -buildvcs=false -ldflags="-w -s"{{else}}-buildvcs=false -gcflags=all="-l"{{end}}' - DEFAULT_OUTPUT: '{{.BIN_DIR}}/build/{{.APP_NAME}}' + DEFAULT_OUTPUT: '{{.BIN_DIR}}/{{.APP_NAME}}' OUTPUT: '{{ .OUTPUT | default .DEFAULT_OUTPUT }}' env: GOOS: darwin @@ -36,14 +36,14 @@ tasks: - task: build vars: ARCH: amd64 - OUTPUT: "{{.BIN_DIR}}/build/{{.APP_NAME}}-amd64" + OUTPUT: "{{.BIN_DIR}}/{{.APP_NAME}}-amd64" - task: build vars: ARCH: arm64 - OUTPUT: "{{.BIN_DIR}}/build/{{.APP_NAME}}-arm64" + OUTPUT: "{{.BIN_DIR}}/{{.APP_NAME}}-arm64" cmds: - - lipo -create -output "{{.BIN_DIR}}/build/{{.APP_NAME}}" "{{.BIN_DIR}}/build/{{.APP_NAME}}-amd64" "{{.BIN_DIR}}/build/{{.APP_NAME}}-arm64" - - rm "{{.BIN_DIR}}/build/{{.APP_NAME}}-amd64" "{{.BIN_DIR}}/build/{{.APP_NAME}}-arm64" + - lipo -create -output "{{.BIN_DIR}}/{{.APP_NAME}}" "{{.BIN_DIR}}/{{.APP_NAME}}-amd64" "{{.BIN_DIR}}/{{.APP_NAME}}-arm64" + - rm "{{.BIN_DIR}}/{{.APP_NAME}}-amd64" "{{.BIN_DIR}}/{{.APP_NAME}}-arm64" package: summary: Packages a production build of the application into a `.app` bundle @@ -65,17 +65,17 @@ tasks: create:app:bundle: summary: Creates an `.app` bundle cmds: - - mkdir -p {{.BIN_DIR}}/release/{{.APP_NAME}}.app/Contents/{MacOS,Resources} - - cp build/darwin/icons.icns {{.BIN_DIR}}/release/{{.APP_NAME}}.app/Contents/Resources - - cp {{.BIN_DIR}}/build/{{.APP_NAME}} {{.BIN_DIR}}/release/{{.APP_NAME}}.app/Contents/MacOS - - cp build/darwin/Info.plist {{.BIN_DIR}}/release/{{.APP_NAME}}.app/Contents - - codesign --force --deep --sign - {{.BIN_DIR}}/release/{{.APP_NAME}}.app + - mkdir -p {{.BIN_DIR}}/{{.APP_NAME}}.app/Contents/{MacOS,Resources} + - cp build/darwin/icons.icns {{.BIN_DIR}}/{{.APP_NAME}}.app/Contents/Resources + - cp {{.BIN_DIR}}/{{.APP_NAME}} {{.BIN_DIR}}/{{.APP_NAME}}.app/Contents/MacOS + - cp build/darwin/Info.plist {{.BIN_DIR}}/{{.APP_NAME}}.app/Contents + - codesign --force --deep --sign - {{.BIN_DIR}}/{{.APP_NAME}}.app run: cmds: - - mkdir -p {{.BIN_DIR}}/dev/{{.APP_NAME}}.app/Contents/{MacOS,Resources} - - cp build/darwin/icons.icns {{.BIN_DIR}}/dev/{{.APP_NAME}}.app/Contents/Resources - - cp {{.BIN_DIR}}/build/{{.APP_NAME}} {{.BIN_DIR}}/dev/{{.APP_NAME}}.app/Contents/MacOS - - cp build/darwin/Info.dev.plist {{.BIN_DIR}}/dev/{{.APP_NAME}}.app/Contents/Info.plist - - codesign --force --deep --sign - {{.BIN_DIR}}/dev/{{.APP_NAME}}.app - - '{{.BIN_DIR}}/dev/{{.APP_NAME}}.app/Contents/MacOS/{{.APP_NAME}}' + - mkdir -p {{.BIN_DIR}}/{{.APP_NAME}}.dev.app/Contents/{MacOS,Resources} + - cp build/darwin/icons.icns {{.BIN_DIR}}/{{.APP_NAME}}.dev.app/Contents/Resources + - cp {{.BIN_DIR}}/{{.APP_NAME}} {{.BIN_DIR}}/{{.APP_NAME}}.dev.app/Contents/MacOS + - cp build/darwin/Info.dev.plist {{.BIN_DIR}}/{{.APP_NAME}}.dev.app/Contents/Info.plist + - codesign --force --deep --sign - {{.BIN_DIR}}/{{.APP_NAME}}.dev.app + - '{{.BIN_DIR}}/{{.APP_NAME}}.dev.app/Contents/MacOS/{{.APP_NAME}}' From be1d500974a7bd27f9a635792e7e7088cb4d945c Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Sat, 12 Apr 2025 13:21:58 +1000 Subject: [PATCH 226/374] Update v3/examples/notifications/build/windows/nsis/wails_tools.nsh Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- v3/examples/notifications/build/windows/nsis/wails_tools.nsh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v3/examples/notifications/build/windows/nsis/wails_tools.nsh b/v3/examples/notifications/build/windows/nsis/wails_tools.nsh index ee4c8ca1a..c47c784a4 100644 --- a/v3/examples/notifications/build/windows/nsis/wails_tools.nsh +++ b/v3/examples/notifications/build/windows/nsis/wails_tools.nsh @@ -158,7 +158,7 @@ RequestExecutionLevel "${REQUEST_EXECUTION_LEVEL}" ${If} ${REQUEST_EXECUTION_LEVEL} == "user" # If the installer is run in user level, check the user specific key exists and is not empty then webview2 is already installed - ReadRegStr $0 HKCU "Software\Microsoft\EdgeUpdate\Clients{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}" "pv" + ReadRegStr $0 HKCU "Software\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}" "pv" ${If} $0 != "" Goto ok ${EndIf} From f891096d974594f9186915ac08a346541debcaad Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Sat, 12 Apr 2025 13:24:36 +1000 Subject: [PATCH 227/374] Fix for webview2 detection --- docs/src/content/docs/changelog.mdx | 1 + .../updatable_build_assets/windows/nsis/wails_tools.nsh.tmpl | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/src/content/docs/changelog.mdx b/docs/src/content/docs/changelog.mdx index d289b3030..6b9c5f152 100644 --- a/docs/src/content/docs/changelog.mdx +++ b/docs/src/content/docs/changelog.mdx @@ -113,6 +113,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fixed assetFileServer not serving `.html` files when non-extension request when `[request]` doesn't exist but `[request].html` does - Fixed icon generation paths by [@robin-samuel](https://github.com/robin-samuel) in [#4125](https://github.com/wailsapp/wails/pull/4125) - Fixed Dialogs runtime function returning escaped paths on Windows by [TheGB0077](https://github.com/TheGB0077) in [#4188](https://github.com/wailsapp/wails/pull/4188) +- Fixed Webview2 detection path in HKCU by [@leaanthony](https://github.com/leaanthony). ### Changed diff --git a/v3/internal/commands/updatable_build_assets/windows/nsis/wails_tools.nsh.tmpl b/v3/internal/commands/updatable_build_assets/windows/nsis/wails_tools.nsh.tmpl index ca5c11ccc..aae481317 100644 --- a/v3/internal/commands/updatable_build_assets/windows/nsis/wails_tools.nsh.tmpl +++ b/v3/internal/commands/updatable_build_assets/windows/nsis/wails_tools.nsh.tmpl @@ -158,7 +158,7 @@ RequestExecutionLevel "${REQUEST_EXECUTION_LEVEL}" ${If} ${REQUEST_EXECUTION_LEVEL} == "user" # If the installer is run in user level, check the user specific key exists and is not empty then webview2 is already installed - ReadRegStr $0 HKCU "Software\Microsoft\EdgeUpdate\Clients{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}" "pv" + ReadRegStr $0 HKCU "Software\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}" "pv" ${If} $0 != "" Goto ok ${EndIf} From a9c031155a4b524e5309c539c1e28d2f033faa82 Mon Sep 17 00:00:00 2001 From: yulesxoxo <189644144+yulesxoxo@users.noreply.github.com> Date: Wed, 16 Apr 2025 15:22:05 +0200 Subject: [PATCH 228/374] fix: correct Windows filename in generate:icons task --- v3/cmd/wails3/README.md | 12 ++++++------ .../file-association/build/Taskfile.common.yml | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/v3/cmd/wails3/README.md b/v3/cmd/wails3/README.md index 91ecdafeb..8924153dd 100644 --- a/v3/cmd/wails3/README.md +++ b/v3/cmd/wails3/README.md @@ -21,13 +21,13 @@ It can be used to generate many things including: The `icon` command generates icons for your project. -| Flag | Type | Description | Default | -|--------------------|--------|------------------------------------------------------|-----------------------| -| `-example` | bool | Generates example icon file (appicon.png) | | -| `-input` | string | The input image file | | +| Flag | Type | Description | Default | +|--------------------|--------|------------------------------------------------------|----------------------| +| `-example` | bool | Generates example icon file (appicon.png) | | +| `-input` | string | The input image file | | | `-sizes` | string | The sizes to generate in .ico file (comma separated) | "256,128,64,48,32,16" | -| `-windowsFilename` | string | The output filename for the Windows icon | icons.ico | -| `-macFilename` | string | The output filename for the Mac icon bundle | icons.icns | +| `-windowsFilename` | string | The output filename for the Windows icon | icon.ico | +| `-macFilename` | string | The output filename for the Mac icon bundle | icons.icns | ```bash wails3 generate icon -input myicon.png -sizes "32,64,128" -windowsFilename myicon.ico -macFilename myicon.icns diff --git a/v3/examples/file-association/build/Taskfile.common.yml b/v3/examples/file-association/build/Taskfile.common.yml index 2b8a4d26d..650c8ea83 100644 --- a/v3/examples/file-association/build/Taskfile.common.yml +++ b/v3/examples/file-association/build/Taskfile.common.yml @@ -56,7 +56,7 @@ tasks: - "appicon.png" generates: - "icons.icns" - - "icons.ico" + - "icon.ico" cmds: - wails3 generate icons -input appicon.png From b3cd25cb4abf9dceabc151ad01dcdc86294ecc0a Mon Sep 17 00:00:00 2001 From: yulesxoxo <189644144+yulesxoxo@users.noreply.github.com> Date: Wed, 16 Apr 2025 15:27:05 +0200 Subject: [PATCH 229/374] feat: update changelog --- docs/src/content/docs/changelog.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/src/content/docs/changelog.mdx b/docs/src/content/docs/changelog.mdx index 681e3715f..4b399a8db 100644 --- a/docs/src/content/docs/changelog.mdx +++ b/docs/src/content/docs/changelog.mdx @@ -115,6 +115,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fixed icon generation paths by [@robin-samuel](https://github.com/robin-samuel) in [#4125](https://github.com/wailsapp/wails/pull/4125) - Fixed Dialogs runtime function returning escaped paths on Windows by [TheGB0077](https://github.com/TheGB0077) in [#4188](https://github.com/wailsapp/wails/pull/4188) - Fixed Webview2 detection path in HKCU by [@leaanthony](https://github.com/leaanthony). +- Fixed Windows icon generation task file name by [@yulesxoxo](https://github.com/yulesxoxo) in [#4219](https://github.com/wailsapp/wails/pull/4219). ### Changed From e97c390f12bf36d241de703431452f951d3b031a Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Fri, 18 Apr 2025 15:47:59 +1000 Subject: [PATCH 230/374] Update v3/examples/gin-service/README.md Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- v3/examples/gin-service/README.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/v3/examples/gin-service/README.md b/v3/examples/gin-service/README.md index ed9c2b908..89e5019d7 100644 --- a/v3/examples/gin-service/README.md +++ b/v3/examples/gin-service/README.md @@ -14,11 +14,6 @@ This example shows how to: ## Running the Example -```bash -cd v3/examples/gin-routing -go mod tidy -go run . -``` ## Documentation From 1f5e9852e48144df57a3948e24d5f552b9d3e35b Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Fri, 18 Apr 2025 15:49:41 +1000 Subject: [PATCH 231/374] Update v3/examples/gin-service/services/gin_service.go Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- .../gin-service/services/gin_service.go | 65 +++++++++++++------ 1 file changed, 46 insertions(+), 19 deletions(-) diff --git a/v3/examples/gin-service/services/gin_service.go b/v3/examples/gin-service/services/gin_service.go index 6c3ef9f70..a67a0f575 100644 --- a/v3/examples/gin-service/services/gin_service.go +++ b/v3/examples/gin-service/services/gin_service.go @@ -137,30 +137,57 @@ func (s *GinService) setupRoutes() { c.JSON(http.StatusNotFound, gin.H{"error": "User not found"}) }) - // Create a new user - users.POST("", func(c *gin.Context) { - var newUser User - if err := c.ShouldBindJSON(&newUser); err != nil { - c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) - return - } +// import block (ensure this exists in your file) +import ( + "context" + "net/http" + "strconv" + "strings" + "sync" + "time" +) - s.mu.Lock() - defer s.mu.Unlock() +// ... - // Set the ID and creation time - newUser.ID = s.nextID - newUser.CreatedAt = time.Now() - s.nextID++ +// Create a new user +users.POST("", func(c *gin.Context) { + var newUser User + if err := c.ShouldBindJSON(&newUser); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } - // Add to the users slice - s.users = append(s.users, newUser) + // Validate required fields + if newUser.Name == "" { + c.JSON(http.StatusBadRequest, gin.H{"error": "Name is required"}) + return + } + if newUser.Email == "" { + c.JSON(http.StatusBadRequest, gin.H{"error": "Email is required"}) + return + } + // Basic email validation (consider using a proper validator library in production) + if !strings.Contains(newUser.Email, "@") { + c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid email format"}) + return + } - c.JSON(http.StatusCreated, newUser) + s.mu.Lock() + defer s.mu.Unlock() - // Emit an event to notify about the new user - s.app.EmitEvent("user-created", newUser) - }) + // Set the ID and creation time + newUser.ID = s.nextID + newUser.CreatedAt = time.Now() + s.nextID++ + + // Add to the users slice + s.users = append(s.users, newUser) + + c.JSON(http.StatusCreated, newUser) + + // Emit an event to notify about the new user + s.app.EmitEvent("user-created", newUser) +}) // Delete a user users.DELETE("/:id", func(c *gin.Context) { From eb8a1b53d204c412f017b1cb92afa2170ea33ed0 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Fri, 18 Apr 2025 16:11:14 +1000 Subject: [PATCH 232/374] Fix for input on mac --- v3/internal/templates/lit-ts/frontend/public/style.css | 3 --- v3/internal/templates/lit/frontend/public/style.css | 3 --- v3/internal/templates/preact-ts/frontend/public/style.css | 3 --- v3/internal/templates/preact/frontend/public/style.css | 3 --- v3/internal/templates/qwik-ts/frontend/public/style.css | 3 --- v3/internal/templates/qwik/frontend/public/style.css | 3 --- .../templates/react-swc-ts/frontend/public/style.css | 3 --- v3/internal/templates/react-swc/frontend/public/style.css | 3 --- v3/internal/templates/react-ts/frontend/public/style.css | 3 --- v3/internal/templates/react/frontend/public/style.css | 3 --- v3/internal/templates/solid-ts/frontend/public/style.css | 3 --- v3/internal/templates/solid/frontend/public/style.css | 3 --- v3/internal/templates/svelte-ts/frontend/public/style.css | 3 --- v3/internal/templates/svelte/frontend/public/style.css | 3 --- .../templates/sveltekit-ts/frontend/static/style.css | 3 --- v3/internal/templates/sveltekit/frontend/frontend/style.css | 3 --- v3/internal/templates/sveltekit/frontend/static/style.css | 3 --- v3/internal/templates/vanilla-ts/frontend/public/style.css | 6 +++--- v3/internal/templates/vanilla/frontend/public/style.css | 3 --- 19 files changed, 3 insertions(+), 57 deletions(-) diff --git a/v3/internal/templates/lit-ts/frontend/public/style.css b/v3/internal/templates/lit-ts/frontend/public/style.css index 8403ee0fd..10550a378 100644 --- a/v3/internal/templates/lit-ts/frontend/public/style.css +++ b/v3/internal/templates/lit-ts/frontend/public/style.css @@ -13,9 +13,6 @@ -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; -webkit-text-size-adjust: 100%; -} - -* { user-select: none; -webkit-user-select: none; -moz-user-select: none; diff --git a/v3/internal/templates/lit/frontend/public/style.css b/v3/internal/templates/lit/frontend/public/style.css index 8403ee0fd..10550a378 100644 --- a/v3/internal/templates/lit/frontend/public/style.css +++ b/v3/internal/templates/lit/frontend/public/style.css @@ -13,9 +13,6 @@ -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; -webkit-text-size-adjust: 100%; -} - -* { user-select: none; -webkit-user-select: none; -moz-user-select: none; diff --git a/v3/internal/templates/preact-ts/frontend/public/style.css b/v3/internal/templates/preact-ts/frontend/public/style.css index 5d7b7e09c..c4f073382 100644 --- a/v3/internal/templates/preact-ts/frontend/public/style.css +++ b/v3/internal/templates/preact-ts/frontend/public/style.css @@ -13,9 +13,6 @@ -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; -webkit-text-size-adjust: 100%; -} - -* { user-select: none; -webkit-user-select: none; -moz-user-select: none; diff --git a/v3/internal/templates/preact/frontend/public/style.css b/v3/internal/templates/preact/frontend/public/style.css index 5d7b7e09c..c4f073382 100644 --- a/v3/internal/templates/preact/frontend/public/style.css +++ b/v3/internal/templates/preact/frontend/public/style.css @@ -13,9 +13,6 @@ -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; -webkit-text-size-adjust: 100%; -} - -* { user-select: none; -webkit-user-select: none; -moz-user-select: none; diff --git a/v3/internal/templates/qwik-ts/frontend/public/style.css b/v3/internal/templates/qwik-ts/frontend/public/style.css index 2b447c0b6..c1d8d1a2e 100644 --- a/v3/internal/templates/qwik-ts/frontend/public/style.css +++ b/v3/internal/templates/qwik-ts/frontend/public/style.css @@ -13,9 +13,6 @@ -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; -webkit-text-size-adjust: 100%; -} - -* { user-select: none; -webkit-user-select: none; -moz-user-select: none; diff --git a/v3/internal/templates/qwik/frontend/public/style.css b/v3/internal/templates/qwik/frontend/public/style.css index 2b447c0b6..c1d8d1a2e 100644 --- a/v3/internal/templates/qwik/frontend/public/style.css +++ b/v3/internal/templates/qwik/frontend/public/style.css @@ -13,9 +13,6 @@ -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; -webkit-text-size-adjust: 100%; -} - -* { user-select: none; -webkit-user-select: none; -moz-user-select: none; diff --git a/v3/internal/templates/react-swc-ts/frontend/public/style.css b/v3/internal/templates/react-swc-ts/frontend/public/style.css index a36cce4f8..0ba9cf5cc 100644 --- a/v3/internal/templates/react-swc-ts/frontend/public/style.css +++ b/v3/internal/templates/react-swc-ts/frontend/public/style.css @@ -13,9 +13,6 @@ -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; -webkit-text-size-adjust: 100%; -} - -* { user-select: none; -webkit-user-select: none; -moz-user-select: none; diff --git a/v3/internal/templates/react-swc/frontend/public/style.css b/v3/internal/templates/react-swc/frontend/public/style.css index a36cce4f8..0ba9cf5cc 100644 --- a/v3/internal/templates/react-swc/frontend/public/style.css +++ b/v3/internal/templates/react-swc/frontend/public/style.css @@ -13,9 +13,6 @@ -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; -webkit-text-size-adjust: 100%; -} - -* { user-select: none; -webkit-user-select: none; -moz-user-select: none; diff --git a/v3/internal/templates/react-ts/frontend/public/style.css b/v3/internal/templates/react-ts/frontend/public/style.css index a36cce4f8..0ba9cf5cc 100644 --- a/v3/internal/templates/react-ts/frontend/public/style.css +++ b/v3/internal/templates/react-ts/frontend/public/style.css @@ -13,9 +13,6 @@ -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; -webkit-text-size-adjust: 100%; -} - -* { user-select: none; -webkit-user-select: none; -moz-user-select: none; diff --git a/v3/internal/templates/react/frontend/public/style.css b/v3/internal/templates/react/frontend/public/style.css index a36cce4f8..0ba9cf5cc 100644 --- a/v3/internal/templates/react/frontend/public/style.css +++ b/v3/internal/templates/react/frontend/public/style.css @@ -13,9 +13,6 @@ -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; -webkit-text-size-adjust: 100%; -} - -* { user-select: none; -webkit-user-select: none; -moz-user-select: none; diff --git a/v3/internal/templates/solid-ts/frontend/public/style.css b/v3/internal/templates/solid-ts/frontend/public/style.css index 2b7547eb4..892241249 100644 --- a/v3/internal/templates/solid-ts/frontend/public/style.css +++ b/v3/internal/templates/solid-ts/frontend/public/style.css @@ -13,9 +13,6 @@ -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; -webkit-text-size-adjust: 100%; -} - -* { user-select: none; -webkit-user-select: none; -moz-user-select: none; diff --git a/v3/internal/templates/solid/frontend/public/style.css b/v3/internal/templates/solid/frontend/public/style.css index 2b7547eb4..892241249 100644 --- a/v3/internal/templates/solid/frontend/public/style.css +++ b/v3/internal/templates/solid/frontend/public/style.css @@ -13,9 +13,6 @@ -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; -webkit-text-size-adjust: 100%; -} - -* { user-select: none; -webkit-user-select: none; -moz-user-select: none; diff --git a/v3/internal/templates/svelte-ts/frontend/public/style.css b/v3/internal/templates/svelte-ts/frontend/public/style.css index 259397254..0b9c58279 100644 --- a/v3/internal/templates/svelte-ts/frontend/public/style.css +++ b/v3/internal/templates/svelte-ts/frontend/public/style.css @@ -13,9 +13,6 @@ -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; -webkit-text-size-adjust: 100%; -} - -* { user-select: none; -webkit-user-select: none; -moz-user-select: none; diff --git a/v3/internal/templates/svelte/frontend/public/style.css b/v3/internal/templates/svelte/frontend/public/style.css index 259397254..0b9c58279 100644 --- a/v3/internal/templates/svelte/frontend/public/style.css +++ b/v3/internal/templates/svelte/frontend/public/style.css @@ -13,9 +13,6 @@ -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; -webkit-text-size-adjust: 100%; -} - -* { user-select: none; -webkit-user-select: none; -moz-user-select: none; diff --git a/v3/internal/templates/sveltekit-ts/frontend/static/style.css b/v3/internal/templates/sveltekit-ts/frontend/static/style.css index 259397254..0b9c58279 100644 --- a/v3/internal/templates/sveltekit-ts/frontend/static/style.css +++ b/v3/internal/templates/sveltekit-ts/frontend/static/style.css @@ -13,9 +13,6 @@ -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; -webkit-text-size-adjust: 100%; -} - -* { user-select: none; -webkit-user-select: none; -moz-user-select: none; diff --git a/v3/internal/templates/sveltekit/frontend/frontend/style.css b/v3/internal/templates/sveltekit/frontend/frontend/style.css index 259397254..0b9c58279 100644 --- a/v3/internal/templates/sveltekit/frontend/frontend/style.css +++ b/v3/internal/templates/sveltekit/frontend/frontend/style.css @@ -13,9 +13,6 @@ -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; -webkit-text-size-adjust: 100%; -} - -* { user-select: none; -webkit-user-select: none; -moz-user-select: none; diff --git a/v3/internal/templates/sveltekit/frontend/static/style.css b/v3/internal/templates/sveltekit/frontend/static/style.css index 259397254..0b9c58279 100644 --- a/v3/internal/templates/sveltekit/frontend/static/style.css +++ b/v3/internal/templates/sveltekit/frontend/static/style.css @@ -13,9 +13,6 @@ -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; -webkit-text-size-adjust: 100%; -} - -* { user-select: none; -webkit-user-select: none; -moz-user-select: none; diff --git a/v3/internal/templates/vanilla-ts/frontend/public/style.css b/v3/internal/templates/vanilla-ts/frontend/public/style.css index 259397254..fda46232a 100644 --- a/v3/internal/templates/vanilla-ts/frontend/public/style.css +++ b/v3/internal/templates/vanilla-ts/frontend/public/style.css @@ -13,15 +13,15 @@ -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; -webkit-text-size-adjust: 100%; -} - -* { user-select: none; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; } +* { +} + @font-face { font-family: "Inter"; font-style: normal; diff --git a/v3/internal/templates/vanilla/frontend/public/style.css b/v3/internal/templates/vanilla/frontend/public/style.css index 259397254..0b9c58279 100644 --- a/v3/internal/templates/vanilla/frontend/public/style.css +++ b/v3/internal/templates/vanilla/frontend/public/style.css @@ -13,9 +13,6 @@ -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; -webkit-text-size-adjust: 100%; -} - -* { user-select: none; -webkit-user-select: none; -moz-user-select: none; From f59798ef1dc42407355b0d466f7749fbd54e9536 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Fri, 18 Apr 2025 16:15:39 +1000 Subject: [PATCH 233/374] Update changelog --- docs/src/content/docs/changelog.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/src/content/docs/changelog.mdx b/docs/src/content/docs/changelog.mdx index 681e3715f..fd584c975 100644 --- a/docs/src/content/docs/changelog.mdx +++ b/docs/src/content/docs/changelog.mdx @@ -115,6 +115,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fixed icon generation paths by [@robin-samuel](https://github.com/robin-samuel) in [#4125](https://github.com/wailsapp/wails/pull/4125) - Fixed Dialogs runtime function returning escaped paths on Windows by [TheGB0077](https://github.com/TheGB0077) in [#4188](https://github.com/wailsapp/wails/pull/4188) - Fixed Webview2 detection path in HKCU by [@leaanthony](https://github.com/leaanthony). +- Fixed input issue with macOS by [@leaanthony](https://github.com/leaanthony). ### Changed From 0222bfa728fb1b04d972fd2f7677f36035c21542 Mon Sep 17 00:00:00 2001 From: Fabio Massaioli Date: Fri, 18 Apr 2025 10:32:18 +0200 Subject: [PATCH 234/374] Fix empty selector --- v3/internal/templates/vanilla-ts/frontend/public/style.css | 3 --- 1 file changed, 3 deletions(-) diff --git a/v3/internal/templates/vanilla-ts/frontend/public/style.css b/v3/internal/templates/vanilla-ts/frontend/public/style.css index fda46232a..0b9c58279 100644 --- a/v3/internal/templates/vanilla-ts/frontend/public/style.css +++ b/v3/internal/templates/vanilla-ts/frontend/public/style.css @@ -19,9 +19,6 @@ -ms-user-select: none; } -* { -} - @font-face { font-family: "Inter"; font-style: normal; From 421b75ef21f09a5e303e167abdbe31495e57a3e2 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Sat, 19 Apr 2025 10:27:25 +1000 Subject: [PATCH 235/374] Multiple fixes. Thanks @kron! --- docs/src/content/docs/changelog.mdx | 3 +++ v3/pkg/application/application_windows.go | 28 ++++++++++++++++++++ v3/pkg/application/systemtray_windows.go | 16 +++++++++++ v3/pkg/application/webview_window_windows.go | 20 ++++++++++++-- v3/pkg/w32/user32.go | 6 ++--- 5 files changed, 68 insertions(+), 5 deletions(-) diff --git a/docs/src/content/docs/changelog.mdx b/docs/src/content/docs/changelog.mdx index 74eba67d9..3670469f9 100644 --- a/docs/src/content/docs/changelog.mdx +++ b/docs/src/content/docs/changelog.mdx @@ -121,6 +121,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fixed Webview2 detection path in HKCU by [@leaanthony](https://github.com/leaanthony). - Fixed input issue with macOS by [@leaanthony](https://github.com/leaanthony). - Fixed Windows icon generation task file name by [@yulesxoxo](https://github.com/yulesxoxo) in [#4219](https://github.com/wailsapp/wails/pull/4219). +- Fixed transparency issue for frameless windows by [@leaanthony](https://github.com/leaanthony) based on work by @kron. +- Fixed focus calls when window is disabled or minimised by [@leaanthony](https://github.com/leaanthony) based on work by @kron. +- Fixed system trays not showing after taskbar restarts by [@leaanthony](https://github.com/leaanthony) based on work by @kron. ### Changed diff --git a/v3/pkg/application/application_windows.go b/v3/pkg/application/application_windows.go index 2279e16c7..bc8428be1 100644 --- a/v3/pkg/application/application_windows.go +++ b/v3/pkg/application/application_windows.go @@ -8,7 +8,9 @@ import ( "path/filepath" "slices" "sync" + "sync/atomic" "syscall" + "time" "unsafe" "github.com/wailsapp/go-webview2/webviewloader" @@ -18,6 +20,10 @@ import ( "github.com/wailsapp/wails/v3/pkg/w32" ) +var ( + wmTaskbarCreated = w32.RegisterWindowMessage(w32.MustStringToUTF16Ptr("TaskbarCreated")) +) + type windowsApp struct { parent *App @@ -40,6 +46,9 @@ type windowsApp struct { // system theme isCurrentlyDarkMode bool currentWindowID uint + + // Restart taskbar flag + restartingTaskbar atomic.Bool } func (m *windowsApp) isDarkMode() bool { @@ -221,6 +230,17 @@ func (m *windowsApp) wndProc(hwnd w32.HWND, msg uint32, wParam, lParam uintptr) } switch msg { + case wmTaskbarCreated: + if m.restartingTaskbar.Load() { + break + } + m.restartingTaskbar.Store(true) + m.reshowSystrays() + go func() { + // 1 second debounce + time.Sleep(1000) + m.restartingTaskbar.Store(false) + }() case w32.WM_SETTINGCHANGE: settingChanged := w32.UTF16PtrToString((*uint16)(unsafe.Pointer(lParam))) if settingChanged == "ImmersiveColorSet" { @@ -297,6 +317,14 @@ func (m *windowsApp) unregisterWindow(w *windowsWebviewWindow) { } } +func (m *windowsApp) reshowSystrays() { + m.systrayMapLock.Lock() + defer m.systrayMapLock.Unlock() + for _, systray := range m.systrayMap { + systray.reshow() + } +} + func setupDPIAwareness() error { // https://learn.microsoft.com/en-us/windows/win32/hidpi/setting-the-default-dpi-awareness-for-a-process // https://learn.microsoft.com/en-us/windows/win32/hidpi/high-dpi-desktop-application-development-on-windows diff --git a/v3/pkg/application/systemtray_windows.go b/v3/pkg/application/systemtray_windows.go index e227a6f0d..2f92eb056 100644 --- a/v3/pkg/application/systemtray_windows.go +++ b/v3/pkg/application/systemtray_windows.go @@ -431,3 +431,19 @@ func (s *windowsSystemTray) Show() { func (s *windowsSystemTray) Hide() { // No-op } + +func (s *windowsSystemTray) reshow() { + // Add icons back to systray + nid := w32.NOTIFYICONDATA{ + HWnd: s.hwnd, + UID: uint32(s.parent.id), + UFlags: w32.NIF_ICON | w32.NIF_MESSAGE, + HIcon: s.currentIcon, + UCallbackMessage: WM_USER_SYSTRAY, + } + nid.CbSize = uint32(unsafe.Sizeof(nid)) + // Show the icon + if !w32.ShellNotifyIcon(w32.NIM_ADD, &nid) { + panic(syscall.GetLastError()) + } +} diff --git a/v3/pkg/application/webview_window_windows.go b/v3/pkg/application/webview_window_windows.go index 587154a11..a49255dd5 100644 --- a/v3/pkg/application/webview_window_windows.go +++ b/v3/pkg/application/webview_window_windows.go @@ -273,9 +273,12 @@ func (w *windowsWebviewWindow) run() { exStyle := w32.WS_EX_CONTROLPARENT if options.BackgroundType != BackgroundTypeSolid { - exStyle |= w32.WS_EX_NOREDIRECTIONBITMAP - if w.parent.options.IgnoreMouseEvents { + if (options.Frameless && options.BackgroundType == BackgroundTypeTransparent) || w.parent.options.IgnoreMouseEvents { + // Always if transparent and frameless exStyle |= w32.WS_EX_TRANSPARENT | w32.WS_EX_LAYERED + } else { + // Only WS_EX_NOREDIRECTIONBITMAP if not (and not solid) + exStyle |= w32.WS_EX_NOREDIRECTIONBITMAP } } if options.AlwaysOnTop { @@ -788,6 +791,14 @@ func (w *windowsWebviewWindow) setFullscreenButtonEnabled(_ bool) { func (w *windowsWebviewWindow) focus() { w32.SetForegroundWindow(w.hwnd) + + if w.isDisabled() { + return + } + if w.isMinimised() { + w.unminimise() + } + w.focusingChromium = true w.chromium.Focus() w.focusingChromium = false @@ -1041,6 +1052,11 @@ func (w *windowsWebviewWindow) disableIcon() { ) } +func (w *windowsWebviewWindow) isDisabled() bool { + style := uint32(w32.GetWindowLong(w.hwnd, w32.GWL_STYLE)) + return style&w32.WS_DISABLED != 0 +} + func (w *windowsWebviewWindow) updateTheme(isDarkMode bool) { if w32.IsCurrentlyHighContrastMode() { diff --git a/v3/pkg/w32/user32.go b/v3/pkg/w32/user32.go index 96701dffb..4117afd2e 100644 --- a/v3/pkg/w32/user32.go +++ b/v3/pkg/w32/user32.go @@ -178,6 +178,8 @@ var ( procRedrawWindow = moduser32.NewProc("RedrawWindow") + procRegisterWindowMessageW = moduser32.NewProc("RegisterWindowMessageW") + mainThread HANDLE ) @@ -299,9 +301,7 @@ func PostThreadMessage(threadID HANDLE, msg int, wp, lp uintptr) { } func RegisterWindowMessage(name *uint16) uint32 { - ret, _, _ := procRegisterWindowMessageA.Call( - uintptr(unsafe.Pointer(name))) - + ret, _, _ := procRegisterWindowMessageW.Call(uintptr(unsafe.Pointer(name))) return uint32(ret) } From 9fcede47f7477c0ed19d0fd05b0a55153b04cb79 Mon Sep 17 00:00:00 2001 From: popaprozac Date: Tue, 22 Apr 2025 14:23:32 -0700 Subject: [PATCH 236/374] windows improvements --- v3/examples/notifications/main.go | 92 ++----------------- .../notifications/notifications_darwin.go | 3 + .../notifications/notifications_darwin.h | 3 +- .../notifications/notifications_darwin.m | 2 +- .../notifications/notifications_windows.go | 74 ++++++++++----- 5 files changed, 65 insertions(+), 109 deletions(-) diff --git a/v3/examples/notifications/main.go b/v3/examples/notifications/main.go index 264e7273e..75f0551a5 100644 --- a/v3/examples/notifications/main.go +++ b/v3/examples/notifications/main.go @@ -5,10 +5,8 @@ import ( _ "embed" "fmt" "log" - "time" "github.com/wailsapp/wails/v3/pkg/application" - "github.com/wailsapp/wails/v3/pkg/events" "github.com/wailsapp/wails/v3/pkg/services/notifications" ) @@ -53,6 +51,7 @@ func main() { // 'URL' is the URL that will be loaded into the webview. app.NewWebviewWindowWithOptions(application.WebviewWindowOptions{ Title: "Window 1", + Name: "main", Mac: application.MacWindow{ InvisibleTitleBarHeight: 50, Backdrop: application.MacBackdropTranslucent, @@ -62,86 +61,15 @@ func main() { URL: "/", }) - app.OnApplicationEvent(events.Common.ApplicationStarted, func(event *application.ApplicationEvent) { - // Create a goroutine that spawns desktop notifications from Go - go func() { - var authorized bool - var err error - authorized, err = ns.CheckNotificationAuthorization() - if err != nil { - println(fmt.Errorf("checking app notification authorization failed: %s", err)) - } - - if !authorized { - authorized, err = ns.RequestNotificationAuthorization() - if err != nil { - println(fmt.Errorf("requesting app notification authorization failed: %s", err)) - } - } - - if authorized { - ns.OnNotificationResponse(func(result notifications.NotificationResult) { - if result.Error != nil { - println(fmt.Errorf("parsing notification result failed: %s", result.Error)) - } else { - fmt.Printf("Response: %+v\n", result.Response) - println("Sending response to frontend...") - app.EmitEvent("notification:action", result.Response) - } - }) - - err = ns.SendNotification(notifications.NotificationOptions{ - ID: "uuid-basic-1", - Title: "Notification Title", - Subtitle: "Subtitle on macOS and Linux", - Body: "Body text of notification.", - Data: map[string]interface{}{ - "user-id": "user-123", - "message-id": "msg-123", - "timestamp": time.Now().Unix(), - }, - }) - if err != nil { - println(fmt.Errorf("sending basic notification failed: %s", err)) - } - - // Delay before sending next notification - time.Sleep(time.Second * 2) - - const CategoryID = "backend-notification-id" - - err = ns.RegisterNotificationCategory(notifications.NotificationCategory{ - ID: CategoryID, - Actions: []notifications.NotificationAction{ - {ID: "VIEW", Title: "View"}, - {ID: "MARK_READ", Title: "Mark as read"}, - {ID: "DELETE", Title: "Delete", Destructive: true}, - }, - HasReplyField: true, - ReplyPlaceholder: "Message...", - ReplyButtonTitle: "Reply", - }) - if err != nil { - println(fmt.Errorf("creating notification category failed: %s", err)) - } - - err = ns.SendNotificationWithActions(notifications.NotificationOptions{ - ID: "uuid-with-actions-1", - Title: "Actions Notification Title", - Subtitle: "Subtitle on macOS and Linux", - Body: "Body text of notification with actions.", - CategoryID: CategoryID, - Data: map[string]interface{}{ - "user-id": "user-123", - "message-id": "msg-123", - "timestamp": time.Now().Unix(), - }, - }) - if err != nil { - println(fmt.Errorf("sending notification with actions failed: %s", err)) - } - } - }() + // Pass a notification callback that will be called when a notification is actioned. + ns.OnNotificationResponse(func(result notifications.NotificationResult) { + if result.Error != nil { + println(fmt.Errorf("parsing notification result failed: %s", result.Error)) + } else { + fmt.Printf("Response: %+v\n", result.Response) + println("Sending response to frontend...") + app.EmitEvent("notification:action", result.Response) + } }) // Run the application. This blocks until the application has been exited. diff --git a/v3/pkg/services/notifications/notifications_darwin.go b/v3/pkg/services/notifications/notifications_darwin.go index 2c8f33d15..75ac642fe 100644 --- a/v3/pkg/services/notifications/notifications_darwin.go +++ b/v3/pkg/services/notifications/notifications_darwin.go @@ -65,6 +65,9 @@ func (dn *darwinNotifier) Startup(ctx context.Context, options application.Servi if !checkBundleIdentifier() { return fmt.Errorf("notifications require a valid bundle identifier") } + if !bool(C.ensureDelegateInitialized()) { + return fmt.Errorf("failed to initialize notification center delegate") + } return nil } diff --git a/v3/pkg/services/notifications/notifications_darwin.h b/v3/pkg/services/notifications/notifications_darwin.h index 7cd505240..71e167656 100644 --- a/v3/pkg/services/notifications/notifications_darwin.h +++ b/v3/pkg/services/notifications/notifications_darwin.h @@ -5,8 +5,9 @@ #import -bool checkBundleIdentifier(void); bool isNotificationAvailable(void); +bool checkBundleIdentifier(void); +bool ensureDelegateInitialized(void); void requestNotificationAuthorization(int channelID); void checkNotificationAuthorization(int channelID); void sendNotification(int channelID, const char *identifier, const char *title, const char *subtitle, const char *body, const char *data_json); diff --git a/v3/pkg/services/notifications/notifications_darwin.m b/v3/pkg/services/notifications/notifications_darwin.m index 6c2048b74..373197cb0 100644 --- a/v3/pkg/services/notifications/notifications_darwin.m +++ b/v3/pkg/services/notifications/notifications_darwin.m @@ -91,7 +91,7 @@ didReceiveNotificationResponse:(UNNotificationResponse *)response static NotificationsDelegate *delegateInstance = nil; static dispatch_once_t onceToken; -static BOOL ensureDelegateInitialized(void) { +bool ensureDelegateInitialized(void) { __block BOOL success = YES; dispatch_once(&onceToken, ^{ diff --git a/v3/pkg/services/notifications/notifications_windows.go b/v3/pkg/services/notifications/notifications_windows.go index b7a16decc..18fb1ddf0 100644 --- a/v3/pkg/services/notifications/notifications_windows.go +++ b/v3/pkg/services/notifications/notifications_windows.go @@ -4,15 +4,16 @@ package notifications import ( "context" - _ "embed" "encoding/base64" "encoding/json" "fmt" "os" "path/filepath" "sync" + _ "unsafe" "git.sr.ht/~jackmordaunt/go-toast/v2" + wintoast "git.sr.ht/~jackmordaunt/go-toast/v2/wintoast" "github.com/google/uuid" "github.com/wailsapp/wails/v3/pkg/application" "github.com/wailsapp/wails/v3/pkg/w32" @@ -25,6 +26,7 @@ type windowsNotifier struct { appName string appGUID string iconPath string + exePath string } const ( @@ -55,13 +57,19 @@ func New() *Service { return NotificationService } +//go:linkname registerFactoryInternal git.sr.ht/~jackmordaunt/go-toast/v2/wintoast.registerClassFactory +func registerFactoryInternal(factory *wintoast.IClassFactory) error + // Startup is called when the service is loaded // Sets an activation callback to emit an event when notifications are interacted with. func (wn *windowsNotifier) Startup(ctx context.Context, options application.ServiceOptions) error { wn.categoriesLock.Lock() defer wn.categoriesLock.Unlock() - wn.appName = application.Get().Config().Name + app := application.Get() + cfg := app.Config() + + wn.appName = cfg.Name guid, err := wn.getGUID() if err != nil { @@ -71,10 +79,23 @@ func (wn *windowsNotifier) Startup(ctx context.Context, options application.Serv wn.iconPath = filepath.Join(os.TempDir(), wn.appName+wn.appGUID+".png") + exe, err := os.Executable() + if err != nil { + return fmt.Errorf("failed to get executable path: %w", err) + } + wn.exePath = exe + + // Create the registry key for the toast activator + key, _, _ := registry.CreateKey(registry.CURRENT_USER, + `Software\Classes\CLSID\`+wn.appGUID+`\LocalServer32`, registry.ALL_ACCESS) + key.SetStringValue("", fmt.Sprintf("\"%s\" %%1", wn.exePath)) + key.Close() + toast.SetAppData(toast.AppData{ - AppID: wn.appName, - GUID: guid, - IconPath: wn.iconPath, + AppID: wn.appName, + GUID: guid, + IconPath: wn.iconPath, + ActivationExe: wn.exePath, }) toast.SetActivationCallback(func(args string, data []toast.UserData) { @@ -84,34 +105,35 @@ func (wn *windowsNotifier) Startup(ctx context.Context, options application.Serv if err != nil { result.Error = err - - if ns := getNotificationService(); ns != nil { - ns.handleNotificationResult(result) + } else { + // Subtitle is retained but was not shown with the notification + response := NotificationResponse{ + ID: options.ID, + ActionIdentifier: actionIdentifier, + Title: options.Title, + Subtitle: options.Subtitle, + Body: options.Body, + CategoryID: options.CategoryID, + UserInfo: options.Data, } - return + + if userText, found := wn.getUserText(data); found { + response.UserText = userText + } + + result.Response = response } - // Subtitle is retained but was not shown with the notification - response := NotificationResponse{ - ID: options.ID, - ActionIdentifier: actionIdentifier, - Title: options.Title, - Subtitle: options.Subtitle, - Body: options.Body, - CategoryID: options.CategoryID, - UserInfo: options.Data, - } - - if userText, found := wn.getUserText(data); found { - response.UserText = userText - } - - result.Response = response if ns := getNotificationService(); ns != nil { ns.handleNotificationResult(result) } }) + // Register the class factory for the toast activator + if err := registerFactoryInternal(wintoast.ClassFactory); err != nil { + return fmt.Errorf("CoRegisterClassObject failed: %w", err) + } + return wn.loadCategoriesFromRegistry() } @@ -145,6 +167,7 @@ func (wn *windowsNotifier) SendNotification(options NotificationOptions) error { n := toast.Notification{ Title: options.Title, Body: options.Body, + ActivationType: toast.Foreground, ActivationArguments: DefaultActionIdentifier, } @@ -179,6 +202,7 @@ func (wn *windowsNotifier) SendNotificationWithActions(options NotificationOptio n := toast.Notification{ Title: options.Title, Body: options.Body, + ActivationType: toast.Foreground, ActivationArguments: DefaultActionIdentifier, } From 66ba876a652222116bb9193713448a6b2292ecac Mon Sep 17 00:00:00 2001 From: popaprozac Date: Tue, 22 Apr 2025 16:21:33 -0700 Subject: [PATCH 237/374] better errors --- v3/pkg/services/notifications/notifications_windows.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/v3/pkg/services/notifications/notifications_windows.go b/v3/pkg/services/notifications/notifications_windows.go index 18fb1ddf0..bade71f85 100644 --- a/v3/pkg/services/notifications/notifications_windows.go +++ b/v3/pkg/services/notifications/notifications_windows.go @@ -86,9 +86,15 @@ func (wn *windowsNotifier) Startup(ctx context.Context, options application.Serv wn.exePath = exe // Create the registry key for the toast activator - key, _, _ := registry.CreateKey(registry.CURRENT_USER, + key, _, err := registry.CreateKey(registry.CURRENT_USER, `Software\Classes\CLSID\`+wn.appGUID+`\LocalServer32`, registry.ALL_ACCESS) - key.SetStringValue("", fmt.Sprintf("\"%s\" %%1", wn.exePath)) + if err != nil { + return fmt.Errorf("failed to create CLSID key: %w", err) + } + + if err := key.SetStringValue("", fmt.Sprintf("\"%s\" %%1", wn.exePath)); err != nil { + return fmt.Errorf("failed to set CLSID server path: %w", err) + } key.Close() toast.SetAppData(toast.AppData{ From da0da5fc691a2b69de4ab1cb0be18cf65e09a01c Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Wed, 23 Apr 2025 10:29:51 +1000 Subject: [PATCH 238/374] Add `wails3 tool version` command --- docs/src/content/docs/changelog.mdx | 2 +- docs/src/content/docs/guides/cli.mdx | 26 +++ v3/cmd/wails3/main.go | 1 + v3/internal/commands/tool_version.go | 123 ++++++++++++ v3/internal/commands/tool_version_test.go | 231 ++++++++++++++++++++++ 5 files changed, 382 insertions(+), 1 deletion(-) create mode 100644 v3/internal/commands/tool_version.go create mode 100644 v3/internal/commands/tool_version_test.go diff --git a/docs/src/content/docs/changelog.mdx b/docs/src/content/docs/changelog.mdx index 3670469f9..145942306 100644 --- a/docs/src/content/docs/changelog.mdx +++ b/docs/src/content/docs/changelog.mdx @@ -80,7 +80,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Add `SetMenu()` on window to allow for setting a menu on a window by [@leaanthony](https://github.com/leaanthony) - Add Notification support by [@popaprozac] in [#4098](https://github.com/wailsapp/wails/pull/4098) -  Add File Association support for mac by [@wimaha](https://github.com/wimaha) in [#4177](https://github.com/wailsapp/wails/pull/4177) - +- Add `wails3 tool version` for semantic version bumping by [@leaanthony](https://github.com/leaanthony) ### Fixed - Fixed Windows+Linux Edit Menu issues by [@leaanthony](https://github.com/leaanthony) in [#3f78a3a](https://github.com/wailsapp/wails/commit/3f78a3a8ce7837e8b32242c8edbbed431c68c062) diff --git a/docs/src/content/docs/guides/cli.mdx b/docs/src/content/docs/guides/cli.mdx index 89035e7e5..d10766503 100644 --- a/docs/src/content/docs/guides/cli.mdx +++ b/docs/src/content/docs/guides/cli.mdx @@ -325,6 +325,32 @@ Shows build information about the application. wails3 tool buildinfo ``` +### `tool version` +Bumps a semantic version based on the provided flags. + +```bash +wails3 tool version [flags] +``` + +#### Flags +| Flag | Description | Default | +|---------------|--------------------------------------------------|---------| +| `-v` | Current version to bump | | +| `-major` | Bump major version | `false` | +| `-minor` | Bump minor version | `false` | +| `-patch` | Bump patch version | `false` | +| `-prerelease` | Bump prerelease version (e.g., alpha.5 to alpha.6) | `false` | + +The command follows the precedence order: major > minor > patch > prerelease. It preserves the "v" prefix if present in the input version, as well as any prerelease and metadata components. + +Example usage: +```bash +wails3 tool version -v 1.2.3 -major # Output: 2.0.0 +wails3 tool version -v v1.2.3 -minor # Output: v1.3.0 +wails3 tool version -v 1.2.3-alpha -patch # Output: 1.2.4-alpha +wails3 tool version -v v3.0.0-alpha.5 -prerelease # Output: v3.0.0-alpha.6 +``` + ### `tool package` Generates Linux packages (deb, rpm, archlinux). diff --git a/v3/cmd/wails3/main.go b/v3/cmd/wails3/main.go index 967cc946f..945a865df 100644 --- a/v3/cmd/wails3/main.go +++ b/v3/cmd/wails3/main.go @@ -79,6 +79,7 @@ func main() { tool.NewSubCommandFunction("cp", "Copy files", commands.Cp) tool.NewSubCommandFunction("buildinfo", "Show Build Info", commands.BuildInfo) tool.NewSubCommandFunction("package", "Generate Linux packages (deb, rpm, archlinux)", commands.ToolPackage) + tool.NewSubCommandFunction("version", "Bump semantic version", commands.ToolVersion) app.NewSubCommandFunction("version", "Print the version", commands.Version) app.NewSubCommand("sponsor", "Sponsor the project").Action(openSponsor) diff --git a/v3/internal/commands/tool_version.go b/v3/internal/commands/tool_version.go new file mode 100644 index 000000000..fe0deb5ec --- /dev/null +++ b/v3/internal/commands/tool_version.go @@ -0,0 +1,123 @@ +package commands + +import ( + "fmt" + "strconv" + "strings" + + "github.com/wailsapp/wails/v3/internal/github" +) + +type ToolVersionOptions struct { + Version string `name:"v" description:"Current version to bump"` + Major bool `name:"major" description:"Bump major version"` + Minor bool `name:"minor" description:"Bump minor version"` + Patch bool `name:"patch" description:"Bump patch version"` + Prerelease bool `name:"prerelease" description:"Bump prerelease version (e.g., alpha.5 to alpha.6)"` +} + +// bumpPrerelease increments the numeric part of a prerelease string +// For example, "alpha.5" becomes "alpha.6" +func bumpPrerelease(prerelease string) string { + // If prerelease is empty, return it as is + if prerelease == "" { + return prerelease + } + + // Split the prerelease string by dots + parts := strings.Split(prerelease, ".") + + // If there's only one part (e.g., "alpha"), return it as is + if len(parts) == 1 { + return prerelease + } + + // Try to parse the last part as a number + lastPart := parts[len(parts)-1] + num, err := strconv.Atoi(lastPart) + if err != nil { + // If the last part is not a number, return the prerelease as is + return prerelease + } + + // Increment the number + num++ + + // Replace the last part with the incremented number + parts[len(parts)-1] = strconv.Itoa(num) + + // Join the parts back together + return strings.Join(parts, ".") +} + +// ToolVersion bumps a semantic version based on the provided flags +func ToolVersion(options *ToolVersionOptions) error { + DisableFooter = true + + if options.Version == "" { + return fmt.Errorf("please provide a version using the -v flag") + } + + // Check if the version has a "v" prefix + hasVPrefix := false + versionStr := options.Version + if len(versionStr) > 0 && versionStr[0] == 'v' { + hasVPrefix = true + versionStr = versionStr[1:] + } + + // Parse the current version + semver, err := github.NewSemanticVersion(versionStr) + if err != nil { + return fmt.Errorf("invalid version format: %v", err) + } + + // Get the current version components + major := semver.Version.Major() + minor := semver.Version.Minor() + patch := semver.Version.Patch() + prerelease := semver.Version.Prerelease() + metadata := semver.Version.Metadata() + + // Check if at least one flag is specified + if !options.Major && !options.Minor && !options.Patch && !options.Prerelease { + return fmt.Errorf("please specify one of -major, -minor, -patch, or -prerelease") + } + + // Bump the version based on the flags (major takes precedence over minor, which takes precedence over patch) + if options.Major { + major++ + minor = 0 + patch = 0 + } else if options.Minor { + minor++ + patch = 0 + } else if options.Patch { + patch++ + } else if options.Prerelease { + // If only prerelease flag is specified, bump the prerelease version + if prerelease == "" { + return fmt.Errorf("cannot bump prerelease version: no prerelease part in the version") + } + prerelease = bumpPrerelease(prerelease) + } + + // Format the new version + newVersion := fmt.Sprintf("%d.%d.%d", major, minor, patch) + if prerelease != "" { + newVersion += "-" + prerelease + } + if metadata != "" { + newVersion += "+" + metadata + } + + // Add the "v" prefix back if it was present in the input + if hasVPrefix { + newVersion = "v" + newVersion + } + + // Print the new version + fmt.Println(newVersion) + + return nil +} diff --git a/v3/internal/commands/tool_version_test.go b/v3/internal/commands/tool_version_test.go new file mode 100644 index 000000000..1da58585f --- /dev/null +++ b/v3/internal/commands/tool_version_test.go @@ -0,0 +1,231 @@ +package commands + +import ( + "bytes" + "io" + "os" + "strings" + "testing" +) + +func TestToolVersion(t *testing.T) { + // Create a table of test cases + testCases := []struct { + name string + options ToolVersionOptions + expectedOutput string + expectedError bool + }{ + { + name: "Bump major version", + options: ToolVersionOptions{ + Version: "1.2.3", + Major: true, + }, + expectedOutput: "2.0.0", + expectedError: false, + }, + { + name: "Bump minor version", + options: ToolVersionOptions{ + Version: "1.2.3", + Minor: true, + }, + expectedOutput: "1.3.0", + expectedError: false, + }, + { + name: "Bump patch version", + options: ToolVersionOptions{ + Version: "1.2.3", + Patch: true, + }, + expectedOutput: "1.2.4", + expectedError: false, + }, + { + name: "Bump major version with v prefix", + options: ToolVersionOptions{ + Version: "v1.2.3", + Major: true, + }, + expectedOutput: "v2.0.0", + expectedError: false, + }, + { + name: "Bump minor version with v prefix", + options: ToolVersionOptions{ + Version: "v1.2.3", + Minor: true, + }, + expectedOutput: "v1.3.0", + expectedError: false, + }, + { + name: "Bump patch version with v prefix", + options: ToolVersionOptions{ + Version: "v1.2.3", + Patch: true, + }, + expectedOutput: "v1.2.4", + expectedError: false, + }, + { + name: "Bump version with prerelease", + options: ToolVersionOptions{ + Version: "1.2.3-alpha", + Patch: true, + }, + expectedOutput: "1.2.4-alpha", + expectedError: false, + }, + { + name: "Bump version with metadata", + options: ToolVersionOptions{ + Version: "1.2.3+build123", + Patch: true, + }, + expectedOutput: "1.2.4+build123", + expectedError: false, + }, + { + name: "Bump version with prerelease and metadata", + options: ToolVersionOptions{ + Version: "1.2.3-alpha+build123", + Patch: true, + }, + expectedOutput: "1.2.4-alpha+build123", + expectedError: false, + }, + { + name: "Bump version with v prefix, prerelease and metadata", + options: ToolVersionOptions{ + Version: "v1.2.3-alpha+build123", + Patch: true, + }, + expectedOutput: "v1.2.4-alpha+build123", + expectedError: false, + }, + { + name: "No version provided", + options: ToolVersionOptions{ + Major: true, + }, + expectedOutput: "", + expectedError: true, + }, + { + name: "No bump flag provided", + options: ToolVersionOptions{ + Version: "1.2.3", + }, + expectedOutput: "", + expectedError: true, + }, + { + name: "Invalid version format", + options: ToolVersionOptions{ + Version: "invalid", + Major: true, + }, + expectedOutput: "", + expectedError: true, + }, + { + name: "Bump prerelease version with numeric component", + options: ToolVersionOptions{ + Version: "1.2.3-alpha.5", + Prerelease: true, + }, + expectedOutput: "1.2.3-alpha.6", + expectedError: false, + }, + { + name: "Bump prerelease version with v prefix", + options: ToolVersionOptions{ + Version: "v1.2.3-alpha.5", + Prerelease: true, + }, + expectedOutput: "v1.2.3-alpha.6", + expectedError: false, + }, + { + name: "Bump prerelease version with metadata", + options: ToolVersionOptions{ + Version: "1.2.3-alpha.5+build123", + Prerelease: true, + }, + expectedOutput: "1.2.3-alpha.6+build123", + expectedError: false, + }, + { + name: "Bump prerelease version without numeric component", + options: ToolVersionOptions{ + Version: "1.2.3-alpha", + Prerelease: true, + }, + expectedOutput: "1.2.3-alpha", + expectedError: false, + }, + { + name: "Bump prerelease version when no prerelease part exists", + options: ToolVersionOptions{ + Version: "1.2.3", + Prerelease: true, + }, + expectedOutput: "", + expectedError: true, + }, + { + name: "Bump prerelease version for issue example v3.0.0-alpha.5", + options: ToolVersionOptions{ + Version: "v3.0.0-alpha.5", + Prerelease: true, + }, + expectedOutput: "v3.0.0-alpha.6", + expectedError: false, + }, + } + + // Run each test case + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + // Capture stdout + oldStdout := os.Stdout + r, w, _ := os.Pipe() + os.Stdout = w + + // Call the function + err := ToolVersion(&tc.options) + + // Restore stdout + err2 := w.Close() + if err2 != nil { + t.Fail() + } + os.Stdout = oldStdout + + // Read captured output + var buf bytes.Buffer + _, err2 = io.Copy(&buf, r) + if err2 != nil { + t.Fail() + } + + output := strings.TrimSpace(buf.String()) + + // Check error + if tc.expectedError && err == nil { + t.Errorf("Expected error but got none") + } + if !tc.expectedError && err != nil { + t.Errorf("Expected no error but got: %v", err) + } + + // Check output + if !tc.expectedError && output != tc.expectedOutput { + t.Errorf("Expected output '%s' but got '%s'", tc.expectedOutput, output) + } + }) + } +} From 94d03d5f1377a358f53e7f74658655700edfdf3f Mon Sep 17 00:00:00 2001 From: popaprozac Date: Thu, 24 Apr 2025 12:31:32 -0700 Subject: [PATCH 239/374] badge service --- v3/pkg/services/badge/badge.go | 39 +++ v3/pkg/services/badge/badge_darwin.go | 51 ++++ v3/pkg/services/badge/badge_windows.go | 360 +++++++++++++++++++++++++ 3 files changed, 450 insertions(+) create mode 100644 v3/pkg/services/badge/badge.go create mode 100644 v3/pkg/services/badge/badge_darwin.go create mode 100644 v3/pkg/services/badge/badge_windows.go diff --git a/v3/pkg/services/badge/badge.go b/v3/pkg/services/badge/badge.go new file mode 100644 index 000000000..61bffcdc7 --- /dev/null +++ b/v3/pkg/services/badge/badge.go @@ -0,0 +1,39 @@ +package badge + +import ( + "context" + + "github.com/wailsapp/wails/v3/pkg/application" +) + +type platformBadge interface { + // Lifecycle methods + Startup(ctx context.Context, options application.ServiceOptions) error + Shutdown() error + + SetBadge(label string) error +} + +// Service represents the notifications service +type Service struct { + impl platformBadge +} + +// ServiceName returns the name of the service. +func (b *Service) ServiceName() string { + return "github.com/wailsapp/wails/v3/services/badge" +} + +// ServiceStartup is called when the service is loaded. +func (b *Service) ServiceStartup(ctx context.Context, options application.ServiceOptions) error { + return b.impl.Startup(ctx, options) +} + +// ServiceShutdown is called when the service is unloaded. +func (b *Service) ServiceShutdown() error { + return b.impl.Shutdown() +} + +func (b *Service) SetBadge(label string) error { + return b.impl.SetBadge(label) +} diff --git a/v3/pkg/services/badge/badge_darwin.go b/v3/pkg/services/badge/badge_darwin.go new file mode 100644 index 000000000..160d651a8 --- /dev/null +++ b/v3/pkg/services/badge/badge_darwin.go @@ -0,0 +1,51 @@ +//go:build darwin + +package badge + +/* +#cgo CFLAGS: -x objective-c +#cgo LDFLAGS: -framework Cocoa +#import + +static void setBadge(const char *label) { + NSString *nsLabel = nil; + if (label != NULL) { + nsLabel = [NSString stringWithUTF8String:label]; + } + [[NSApp dockTile] setBadgeLabel:nsLabel]; + [[NSApp dockTile] display]; +} +*/ +import "C" +import ( + "context" + "unsafe" + + "github.com/wailsapp/wails/v3/pkg/application" +) + +type darwinBadge struct{} + +func New() *Service { + return &Service{ + impl: &darwinBadge{}, + } +} + +func (d *darwinBadge) Startup(ctx context.Context, options application.ServiceOptions) error { + return nil +} + +func (d *darwinBadge) Shutdown() error { + return nil +} + +func (d *darwinBadge) SetBadge(label string) error { + var cLabel *C.char + if label != "" { + cLabel = C.CString(label) + defer C.free(unsafe.Pointer(cLabel)) + } + C.setBadge(cLabel) + return nil +} diff --git a/v3/pkg/services/badge/badge_windows.go b/v3/pkg/services/badge/badge_windows.go new file mode 100644 index 000000000..035cf0af5 --- /dev/null +++ b/v3/pkg/services/badge/badge_windows.go @@ -0,0 +1,360 @@ +//go:build windows + +package badge + +import ( + "context" + "fmt" + "syscall" + "unsafe" + + "github.com/wailsapp/wails/v3/pkg/application" +) + +// COM GUIDs for taskbar interfaces +var ( + CLSID_TaskbarList = syscall.GUID{ + Data1: 0x56FDF344, + Data2: 0xFD6D, + Data3: 0x11D0, + Data4: [8]byte{0x95, 0x8A, 0x00, 0x60, 0x97, 0xC9, 0xA0, 0x90}, + } + IID_ITaskbarList3 = syscall.GUID{ + Data1: 0xEA1AFB91, + Data2: 0x9E28, + Data3: 0x4B86, + Data4: [8]byte{0x90, 0xE9, 0x9E, 0x9F, 0x8A, 0x5E, 0xEF, 0xAF}, + } +) + +// ITaskbarList3 COM interface +type ITaskbarList3Vtbl struct { + QueryInterface uintptr + AddRef uintptr + Release uintptr + // ITaskbarList methods + HrInit uintptr + AddTab uintptr + DeleteTab uintptr + ActivateTab uintptr + SetActiveAlt uintptr + // ITaskbarList2 methods + MarkFullscreenWindow uintptr + // ITaskbarList3 methods + SetProgressValue uintptr + SetProgressState uintptr + RegisterTab uintptr + UnregisterTab uintptr + SetTabOrder uintptr + SetTabActive uintptr + ThumbBarAddButtons uintptr + ThumbBarUpdateButtons uintptr + ThumbBarSetImageList uintptr + SetOverlayIcon uintptr + SetThumbnailTooltip uintptr + SetThumbnailClip uintptr + SetTabProperties uintptr +} + +type ITaskbarList3 struct { + Vtbl *ITaskbarList3Vtbl +} + +type windowsBadge struct { + taskbarList *ITaskbarList3 + mainWindow *application.WebviewWindow + initialized bool + redBadgeIcon syscall.Handle +} + +func New() *Service { + return &Service{ + impl: &windowsBadge{ + mainWindow: application.Get().CurrentWindow(), + redBadgeIcon: 0, + }, + } +} + +func (d *windowsBadge) Startup(ctx context.Context, options application.ServiceOptions) error { + if d.initialized { + return nil + } + + // Initialize COM + err := coInitialize() + if err != nil { + return fmt.Errorf("failed to initialize COM: %w", err) + } + + // Create an instance of the TaskbarList COM object + var taskbarList *ITaskbarList3 + hr, _, _ := procCoCreateInstance.Call( + uintptr(unsafe.Pointer(&CLSID_TaskbarList)), + 0, + 21, // CLSCTX_INPROC_SERVER + uintptr(unsafe.Pointer(&IID_ITaskbarList3)), + uintptr(unsafe.Pointer(&taskbarList))) + if hr != 0 { + return fmt.Errorf("failed to create TaskbarList instance: %d", hr) + } + + // Initialize the taskbar list + hr, _, _ = syscall.Syscall( + taskbarList.Vtbl.HrInit, + 1, + uintptr(unsafe.Pointer(taskbarList)), + 0, + 0) + if hr != 0 { + return fmt.Errorf("failed to initialize TaskbarList: %d", hr) + } + + // Create the red badge icon + redBadge, err := d.createRedBadgeIcon() + if err != nil { + return fmt.Errorf("failed to create red badge icon: %w", err) + } + + d.taskbarList = taskbarList + d.redBadgeIcon = redBadge + d.initialized = true + return nil +} + +func (d *windowsBadge) Shutdown() error { + if !d.initialized { + return nil + } + + // Destroy the red badge icon + if d.redBadgeIcon != 0 { + destroyIcon(d.redBadgeIcon) + d.redBadgeIcon = 0 + } + + // Release the taskbar list interface + if d.taskbarList != nil { + syscall.Syscall( + d.taskbarList.Vtbl.Release, + 1, + uintptr(unsafe.Pointer(d.taskbarList)), + 0, + 0) + d.taskbarList = nil + } + + // Uninitialize COM + coUninitialize() + d.initialized = false + return nil +} + +func (d *windowsBadge) SetBadge(label string) error { + // If not initialized, initialize + if !d.initialized { + err := d.Startup(context.Background(), application.ServiceOptions{}) + if err != nil { + return err + } + } + + // Ensure we have a window to work with + if d.mainWindow == nil { + d.mainWindow = application.Get().CurrentWindow() + if d.mainWindow == nil { + return fmt.Errorf("no window available for setting badge") + } + } + + // Get the window handle using NativeWindowHandle() method + handle, err := d.mainWindow.NativeWindowHandle() + if err != nil { + return fmt.Errorf("failed to get window handle: %w", err) + } + hwnd := handle + + // If empty value, remove the overlay + if label == "" { + hr, _, _ := syscall.SyscallN( + d.taskbarList.Vtbl.SetOverlayIcon, + 4, + uintptr(unsafe.Pointer(d.taskbarList)), + hwnd, + 0, // NULL icon handle + 0, // NULL description + 0, 0) + if hr != 0 { + return fmt.Errorf("failed to remove overlay icon: %d", hr) + } + return nil + } + + // Set the overlay icon with a description + description, err := syscall.UTF16PtrFromString("New notification") + if err != nil { + return fmt.Errorf("failed to convert description: %w", err) + } + + hr, _, _ := syscall.SyscallN( + d.taskbarList.Vtbl.SetOverlayIcon, + 4, + uintptr(unsafe.Pointer(d.taskbarList)), + hwnd, + uintptr(d.redBadgeIcon), + uintptr(unsafe.Pointer(description)), + 0, 0) + if hr != 0 { + return fmt.Errorf("failed to set overlay icon: %d", hr) + } + + return nil +} + +// ICONINFO structure for creating icons +type ICONINFO struct { + FIcon uint32 + XHotspot uint32 + YHotspot uint32 + HbmMask syscall.Handle + HbmColor syscall.Handle +} + +// createRedBadgeIcon creates a simple red circle icon for the badge +func (d *windowsBadge) createRedBadgeIcon() (syscall.Handle, error) { + // Create a 16x16 pixel bitmap + hdc := getDC(0) + if hdc == 0 { + return 0, fmt.Errorf("failed to get DC") + } + defer releaseDC(0, hdc) + + memDC := createCompatibleDC(hdc) + if memDC == 0 { + return 0, fmt.Errorf("failed to create compatible DC") + } + defer deleteObject(memDC) + + // Create a bitmap + bmp := createCompatibleBitmap(hdc, 16, 16) + if bmp == 0 { + return 0, fmt.Errorf("failed to create bitmap") + } + + oldBmp := selectObject(memDC, bmp) + + // Create a solid red brush + redBrush := createSolidBrush(0x0000FF) // BGR format (blue=0, green=0, red=255) + defer deleteObject(redBrush) + + // Fill the circle with red + selectObject(memDC, redBrush) + ellipse(memDC, 0, 0, 16, 16) + + // Restore original bitmap + selectObject(memDC, oldBmp) + + // Convert bitmap to icon + iconInfo := ICONINFO{ + FIcon: 1, // TRUE for icon (vs. cursor) + XHotspot: 0, + YHotspot: 0, + HbmMask: bmp, // Use same bitmap for mask + HbmColor: bmp, + } + + icon := createIconIndirect(&iconInfo) + if icon == 0 { + deleteObject(bmp) + return 0, fmt.Errorf("failed to create icon") + } + + // Don't delete the bitmap here, as it's now owned by the icon + return icon, nil +} + +// Define Windows API functions +var ( + user32 = syscall.NewLazyDLL("user32.dll") + gdi32 = syscall.NewLazyDLL("gdi32.dll") + ole32 = syscall.NewLazyDLL("ole32.dll") + + procCoCreateInstance = ole32.NewProc("CoCreateInstance") + procCoInitialize = ole32.NewProc("CoInitialize") + procCoUninitialize = ole32.NewProc("CoUninitialize") + + procGetDC = user32.NewProc("GetDC") + procReleaseDC = user32.NewProc("ReleaseDC") + procDestroyIcon = user32.NewProc("DestroyIcon") + procCreateIconIndirect = user32.NewProc("CreateIconIndirect") + + procCreateCompatibleDC = gdi32.NewProc("CreateCompatibleDC") + procCreateCompatibleBitmap = gdi32.NewProc("CreateCompatibleBitmap") + procSelectObject = gdi32.NewProc("SelectObject") + procDeleteObject = gdi32.NewProc("DeleteObject") + procCreateSolidBrush = gdi32.NewProc("CreateSolidBrush") + procEllipse = gdi32.NewProc("Ellipse") +) + +// GDI function wrappers +func getDC(hwnd syscall.Handle) syscall.Handle { + ret, _, _ := procGetDC.Call(uintptr(hwnd)) + return syscall.Handle(ret) +} + +func releaseDC(hwnd, hdc syscall.Handle) bool { + ret, _, _ := procReleaseDC.Call(uintptr(hwnd), uintptr(hdc)) + return ret != 0 +} + +func createCompatibleDC(hdc syscall.Handle) syscall.Handle { + ret, _, _ := procCreateCompatibleDC.Call(uintptr(hdc)) + return syscall.Handle(ret) +} + +func createCompatibleBitmap(hdc syscall.Handle, width, height int32) syscall.Handle { + ret, _, _ := procCreateCompatibleBitmap.Call(uintptr(hdc), uintptr(width), uintptr(height)) + return syscall.Handle(ret) +} + +func selectObject(hdc, hgdiobj syscall.Handle) syscall.Handle { + ret, _, _ := procSelectObject.Call(uintptr(hdc), uintptr(hgdiobj)) + return syscall.Handle(ret) +} + +func deleteObject(hObject syscall.Handle) bool { + ret, _, _ := procDeleteObject.Call(uintptr(hObject)) + return ret != 0 +} + +func createSolidBrush(color int32) syscall.Handle { + ret, _, _ := procCreateSolidBrush.Call(uintptr(color)) + return syscall.Handle(ret) +} + +func ellipse(hdc syscall.Handle, left, top, right, bottom int32) bool { + ret, _, _ := procEllipse.Call(uintptr(hdc), uintptr(left), uintptr(top), uintptr(right), uintptr(bottom)) + return ret != 0 +} + +func createIconIndirect(iconInfo *ICONINFO) syscall.Handle { + ret, _, _ := procCreateIconIndirect.Call(uintptr(unsafe.Pointer(iconInfo))) + return syscall.Handle(ret) +} + +func destroyIcon(hIcon syscall.Handle) bool { + ret, _, _ := procDestroyIcon.Call(uintptr(hIcon)) + return ret != 0 +} + +func coInitialize() error { + hr, _, _ := procCoInitialize.Call(0) + if hr != 0 { + return fmt.Errorf("CoInitialize failed with code: %d", hr) + } + return nil +} + +func coUninitialize() { + procCoUninitialize.Call() +} From be28da26b874c227abfb92ce22360c80345cb375 Mon Sep 17 00:00:00 2001 From: popaprozac Date: Thu, 24 Apr 2025 14:44:30 -0700 Subject: [PATCH 240/374] windows badge --- v3/pkg/services/badge/badge.go | 5 + v3/pkg/services/badge/badge_darwin.go | 5 + v3/pkg/services/badge/badge_windows.go | 434 +++++++++---------------- 3 files changed, 155 insertions(+), 289 deletions(-) diff --git a/v3/pkg/services/badge/badge.go b/v3/pkg/services/badge/badge.go index 61bffcdc7..d43e4bcc5 100644 --- a/v3/pkg/services/badge/badge.go +++ b/v3/pkg/services/badge/badge.go @@ -12,6 +12,7 @@ type platformBadge interface { Shutdown() error SetBadge(label string) error + RemoveBadge() error } // Service represents the notifications service @@ -37,3 +38,7 @@ func (b *Service) ServiceShutdown() error { func (b *Service) SetBadge(label string) error { return b.impl.SetBadge(label) } + +func (b *Service) RemoveBadge() error { + return b.impl.RemoveBadge() +} diff --git a/v3/pkg/services/badge/badge_darwin.go b/v3/pkg/services/badge/badge_darwin.go index 160d651a8..22969fc16 100644 --- a/v3/pkg/services/badge/badge_darwin.go +++ b/v3/pkg/services/badge/badge_darwin.go @@ -49,3 +49,8 @@ func (d *darwinBadge) SetBadge(label string) error { C.setBadge(cLabel) return nil } + +func (d *darwinBadge) RemoveBadge() error { + C.setBadge(nil) + return nil +} diff --git a/v3/pkg/services/badge/badge_windows.go b/v3/pkg/services/badge/badge_windows.go index 035cf0af5..76d4069bc 100644 --- a/v3/pkg/services/badge/badge_windows.go +++ b/v3/pkg/services/badge/badge_windows.go @@ -3,44 +3,47 @@ package badge import ( + "bytes" "context" - "fmt" + "image" + "image/color" + "image/png" "syscall" "unsafe" "github.com/wailsapp/wails/v3/pkg/application" + "github.com/wailsapp/wails/v3/pkg/w32" ) -// COM GUIDs for taskbar interfaces var ( - CLSID_TaskbarList = syscall.GUID{ - Data1: 0x56FDF344, - Data2: 0xFD6D, - Data3: 0x11D0, - Data4: [8]byte{0x95, 0x8A, 0x00, 0x60, 0x97, 0xC9, 0xA0, 0x90}, - } - IID_ITaskbarList3 = syscall.GUID{ - Data1: 0xEA1AFB91, - Data2: 0x9E28, - Data3: 0x4B86, - Data4: [8]byte{0x90, 0xE9, 0x9E, 0x9F, 0x8A, 0x5E, 0xEF, 0xAF}, - } + ole32 = syscall.NewLazyDLL("ole32.dll") + shobjidl = syscall.NewLazyDLL("shell32.dll") + coCreateInstance = ole32.NewProc("CoCreateInstance") ) -// ITaskbarList3 COM interface -type ITaskbarList3Vtbl struct { - QueryInterface uintptr - AddRef uintptr - Release uintptr - // ITaskbarList methods - HrInit uintptr - AddTab uintptr - DeleteTab uintptr - ActivateTab uintptr - SetActiveAlt uintptr - // ITaskbarList2 methods - MarkFullscreenWindow uintptr - // ITaskbarList3 methods +const ( + CLSCTX_INPROC_SERVER = 0x1 +) + +var ( + CLSID_TaskbarList = syscall.GUID{0x56FDF344, 0xFD6D, 0x11D0, [8]byte{0x95, 0x8A, 0x00, 0x60, 0x97, 0xC9, 0xA0, 0x90}} + IID_ITaskbarList3 = syscall.GUID{0xEA1AFB91, 0x9E28, 0x4B86, [8]byte{0x90, 0xE9, 0x9E, 0x9F, 0x8A, 0x5E, 0xEF, 0xAF}} +) + +type ITaskbarList3 struct { + lpVtbl *taskbarList3Vtbl +} + +type taskbarList3Vtbl struct { + QueryInterface uintptr + AddRef uintptr + Release uintptr + HrInit uintptr + AddTab uintptr + DeleteTab uintptr + ActivateTab uintptr + SetActiveAlt uintptr + MarkFullscreenWindow uintptr SetProgressValue uintptr SetProgressState uintptr RegisterTab uintptr @@ -53,308 +56,161 @@ type ITaskbarList3Vtbl struct { SetOverlayIcon uintptr SetThumbnailTooltip uintptr SetThumbnailClip uintptr - SetTabProperties uintptr } -type ITaskbarList3 struct { - Vtbl *ITaskbarList3Vtbl +func newTaskbarList3() (*ITaskbarList3, error) { + var taskbar *ITaskbarList3 + hr, _, _ := coCreateInstance.Call( + uintptr(unsafe.Pointer(&CLSID_TaskbarList)), + 0, + uintptr(CLSCTX_INPROC_SERVER), + uintptr(unsafe.Pointer(&IID_ITaskbarList3)), + uintptr(unsafe.Pointer(&taskbar)), + ) + + if hr != 0 { + return nil, syscall.Errno(hr) + } + + return taskbar, nil +} + +func (t *ITaskbarList3) SetOverlayIcon(hwnd syscall.Handle, hIcon syscall.Handle, description *uint16) error { + ret, _, _ := syscall.SyscallN( + t.lpVtbl.SetOverlayIcon, + uintptr(unsafe.Pointer(t)), + uintptr(hwnd), + uintptr(hIcon), + uintptr(unsafe.Pointer(description)), + ) + if ret != 0 { + return syscall.Errno(ret) + } + return nil } type windowsBadge struct { - taskbarList *ITaskbarList3 - mainWindow *application.WebviewWindow - initialized bool - redBadgeIcon syscall.Handle + taskbar *ITaskbarList3 } func New() *Service { return &Service{ - impl: &windowsBadge{ - mainWindow: application.Get().CurrentWindow(), - redBadgeIcon: 0, - }, + impl: &windowsBadge{}, } } func (d *windowsBadge) Startup(ctx context.Context, options application.ServiceOptions) error { - if d.initialized { - return nil - } - - // Initialize COM - err := coInitialize() + taskbar, err := newTaskbarList3() if err != nil { - return fmt.Errorf("failed to initialize COM: %w", err) + return err } + d.taskbar = taskbar - // Create an instance of the TaskbarList COM object - var taskbarList *ITaskbarList3 - hr, _, _ := procCoCreateInstance.Call( - uintptr(unsafe.Pointer(&CLSID_TaskbarList)), - 0, - 21, // CLSCTX_INPROC_SERVER - uintptr(unsafe.Pointer(&IID_ITaskbarList3)), - uintptr(unsafe.Pointer(&taskbarList))) - if hr != 0 { - return fmt.Errorf("failed to create TaskbarList instance: %d", hr) - } - - // Initialize the taskbar list - hr, _, _ = syscall.Syscall( - taskbarList.Vtbl.HrInit, - 1, - uintptr(unsafe.Pointer(taskbarList)), - 0, - 0) - if hr != 0 { - return fmt.Errorf("failed to initialize TaskbarList: %d", hr) - } - - // Create the red badge icon - redBadge, err := d.createRedBadgeIcon() - if err != nil { - return fmt.Errorf("failed to create red badge icon: %w", err) - } - - d.taskbarList = taskbarList - d.redBadgeIcon = redBadge - d.initialized = true + // Don't try to get the window handle here - wait until SetBadge is called return nil } func (d *windowsBadge) Shutdown() error { - if !d.initialized { - return nil - } - - // Destroy the red badge icon - if d.redBadgeIcon != 0 { - destroyIcon(d.redBadgeIcon) - d.redBadgeIcon = 0 - } - - // Release the taskbar list interface - if d.taskbarList != nil { - syscall.Syscall( - d.taskbarList.Vtbl.Release, - 1, - uintptr(unsafe.Pointer(d.taskbarList)), - 0, - 0) - d.taskbarList = nil - } - - // Uninitialize COM - coUninitialize() - d.initialized = false return nil } func (d *windowsBadge) SetBadge(label string) error { - // If not initialized, initialize - if !d.initialized { - err := d.Startup(context.Background(), application.ServiceOptions{}) - if err != nil { - return err - } - } - - // Ensure we have a window to work with - if d.mainWindow == nil { - d.mainWindow = application.Get().CurrentWindow() - if d.mainWindow == nil { - return fmt.Errorf("no window available for setting badge") - } - } - - // Get the window handle using NativeWindowHandle() method - handle, err := d.mainWindow.NativeWindowHandle() - if err != nil { - return fmt.Errorf("failed to get window handle: %w", err) - } - hwnd := handle - - // If empty value, remove the overlay - if label == "" { - hr, _, _ := syscall.SyscallN( - d.taskbarList.Vtbl.SetOverlayIcon, - 4, - uintptr(unsafe.Pointer(d.taskbarList)), - hwnd, - 0, // NULL icon handle - 0, // NULL description - 0, 0) - if hr != 0 { - return fmt.Errorf("failed to remove overlay icon: %d", hr) - } + if d.taskbar == nil { return nil } - // Set the overlay icon with a description - description, err := syscall.UTF16PtrFromString("New notification") + // Get the window handle when SetBadge is called, not during startup + app := application.Get() + if app == nil { + return nil // App not initialized yet + } + + window := app.CurrentWindow() + if window == nil { + return nil // No window available yet + } + + hwnd, err := window.NativeWindowHandle() if err != nil { - return fmt.Errorf("failed to convert description: %w", err) + return err } - hr, _, _ := syscall.SyscallN( - d.taskbarList.Vtbl.SetOverlayIcon, - 4, - uintptr(unsafe.Pointer(d.taskbarList)), - hwnd, - uintptr(d.redBadgeIcon), - uintptr(unsafe.Pointer(description)), - 0, 0) - if hr != 0 { - return fmt.Errorf("failed to set overlay icon: %d", hr) + if label == "" { + return d.taskbar.SetOverlayIcon(syscall.Handle(hwnd), 0, nil) } - return nil + hicon, err := createBadgeIcon() + if err != nil { + return err + } + defer w32.DestroyIcon(hicon) + + return d.taskbar.SetOverlayIcon(syscall.Handle(hwnd), syscall.Handle(hicon), nil) } -// ICONINFO structure for creating icons -type ICONINFO struct { - FIcon uint32 - XHotspot uint32 - YHotspot uint32 - HbmMask syscall.Handle - HbmColor syscall.Handle -} - -// createRedBadgeIcon creates a simple red circle icon for the badge -func (d *windowsBadge) createRedBadgeIcon() (syscall.Handle, error) { - // Create a 16x16 pixel bitmap - hdc := getDC(0) - if hdc == 0 { - return 0, fmt.Errorf("failed to get DC") - } - defer releaseDC(0, hdc) - - memDC := createCompatibleDC(hdc) - if memDC == 0 { - return 0, fmt.Errorf("failed to create compatible DC") - } - defer deleteObject(memDC) - - // Create a bitmap - bmp := createCompatibleBitmap(hdc, 16, 16) - if bmp == 0 { - return 0, fmt.Errorf("failed to create bitmap") +func (d *windowsBadge) RemoveBadge() error { + if d.taskbar == nil { + return nil } - oldBmp := selectObject(memDC, bmp) - - // Create a solid red brush - redBrush := createSolidBrush(0x0000FF) // BGR format (blue=0, green=0, red=255) - defer deleteObject(redBrush) - - // Fill the circle with red - selectObject(memDC, redBrush) - ellipse(memDC, 0, 0, 16, 16) - - // Restore original bitmap - selectObject(memDC, oldBmp) - - // Convert bitmap to icon - iconInfo := ICONINFO{ - FIcon: 1, // TRUE for icon (vs. cursor) - XHotspot: 0, - YHotspot: 0, - HbmMask: bmp, // Use same bitmap for mask - HbmColor: bmp, + // Get the window handle when SetBadge is called, not during startup + app := application.Get() + if app == nil { + return nil // App not initialized yet } - icon := createIconIndirect(&iconInfo) - if icon == 0 { - deleteObject(bmp) - return 0, fmt.Errorf("failed to create icon") + window := app.CurrentWindow() + if window == nil { + return nil // No window available yet } - // Don't delete the bitmap here, as it's now owned by the icon - return icon, nil -} - -// Define Windows API functions -var ( - user32 = syscall.NewLazyDLL("user32.dll") - gdi32 = syscall.NewLazyDLL("gdi32.dll") - ole32 = syscall.NewLazyDLL("ole32.dll") - - procCoCreateInstance = ole32.NewProc("CoCreateInstance") - procCoInitialize = ole32.NewProc("CoInitialize") - procCoUninitialize = ole32.NewProc("CoUninitialize") - - procGetDC = user32.NewProc("GetDC") - procReleaseDC = user32.NewProc("ReleaseDC") - procDestroyIcon = user32.NewProc("DestroyIcon") - procCreateIconIndirect = user32.NewProc("CreateIconIndirect") - - procCreateCompatibleDC = gdi32.NewProc("CreateCompatibleDC") - procCreateCompatibleBitmap = gdi32.NewProc("CreateCompatibleBitmap") - procSelectObject = gdi32.NewProc("SelectObject") - procDeleteObject = gdi32.NewProc("DeleteObject") - procCreateSolidBrush = gdi32.NewProc("CreateSolidBrush") - procEllipse = gdi32.NewProc("Ellipse") -) - -// GDI function wrappers -func getDC(hwnd syscall.Handle) syscall.Handle { - ret, _, _ := procGetDC.Call(uintptr(hwnd)) - return syscall.Handle(ret) -} - -func releaseDC(hwnd, hdc syscall.Handle) bool { - ret, _, _ := procReleaseDC.Call(uintptr(hwnd), uintptr(hdc)) - return ret != 0 -} - -func createCompatibleDC(hdc syscall.Handle) syscall.Handle { - ret, _, _ := procCreateCompatibleDC.Call(uintptr(hdc)) - return syscall.Handle(ret) -} - -func createCompatibleBitmap(hdc syscall.Handle, width, height int32) syscall.Handle { - ret, _, _ := procCreateCompatibleBitmap.Call(uintptr(hdc), uintptr(width), uintptr(height)) - return syscall.Handle(ret) -} - -func selectObject(hdc, hgdiobj syscall.Handle) syscall.Handle { - ret, _, _ := procSelectObject.Call(uintptr(hdc), uintptr(hgdiobj)) - return syscall.Handle(ret) -} - -func deleteObject(hObject syscall.Handle) bool { - ret, _, _ := procDeleteObject.Call(uintptr(hObject)) - return ret != 0 -} - -func createSolidBrush(color int32) syscall.Handle { - ret, _, _ := procCreateSolidBrush.Call(uintptr(color)) - return syscall.Handle(ret) -} - -func ellipse(hdc syscall.Handle, left, top, right, bottom int32) bool { - ret, _, _ := procEllipse.Call(uintptr(hdc), uintptr(left), uintptr(top), uintptr(right), uintptr(bottom)) - return ret != 0 -} - -func createIconIndirect(iconInfo *ICONINFO) syscall.Handle { - ret, _, _ := procCreateIconIndirect.Call(uintptr(unsafe.Pointer(iconInfo))) - return syscall.Handle(ret) -} - -func destroyIcon(hIcon syscall.Handle) bool { - ret, _, _ := procDestroyIcon.Call(uintptr(hIcon)) - return ret != 0 -} - -func coInitialize() error { - hr, _, _ := procCoInitialize.Call(0) - if hr != 0 { - return fmt.Errorf("CoInitialize failed with code: %d", hr) + hwnd, err := window.NativeWindowHandle() + if err != nil { + return err } - return nil + + return d.taskbar.SetOverlayIcon(syscall.Handle(hwnd), 0, nil) } -func coUninitialize() { - procCoUninitialize.Call() +func createBadgeIcon() (uintptr, error) { + const size = 32 + + img := image.NewRGBA(image.Rect(0, 0, size, size)) + + red := color.RGBA{255, 0, 0, 255} + radius := size / 2 + centerX, centerY := radius, radius + + for y := 0; y < size; y++ { + for x := 0; x < size; x++ { + dx := float64(x - centerX) + dy := float64(y - centerY) + + if dx*dx+dy*dy < float64(radius*radius) { + img.Set(x, y, red) + } + } + } + + white := color.RGBA{255, 255, 255, 255} + innerRadius := size / 5 + + for y := 0; y < size; y++ { + for x := 0; x < size; x++ { + dx := float64(x - centerX) + dy := float64(y - centerY) + + if dx*dx+dy*dy < float64(innerRadius*innerRadius) { + img.Set(x, y, white) + } + } + } + + var buf bytes.Buffer + if err := png.Encode(&buf, img); err != nil { + return 0, err + } + + hicon, err := w32.CreateSmallHIconFromImage(buf.Bytes()) + return uintptr(hicon), err } From b55f4ea8e3e13e7d22e5f7916573a8fdab02aea0 Mon Sep 17 00:00:00 2001 From: popaprozac Date: Thu, 24 Apr 2025 15:08:06 -0700 Subject: [PATCH 241/374] add example, update docs, update changelog --- docs/src/content/docs/changelog.mdx | 5 +- docs/src/content/docs/learn/badges.mdx | 122 ++++++++++ v3/examples/badge/README.md | 59 +++++ v3/examples/badge/Taskfile.yml | 34 +++ v3/examples/badge/build/Taskfile.yml | 86 +++++++ v3/examples/badge/build/appicon.png | Bin 0 -> 132625 bytes v3/examples/badge/build/config.yml | 63 ++++++ v3/examples/badge/build/darwin/Info.dev.plist | 32 +++ v3/examples/badge/build/darwin/Info.plist | 27 +++ v3/examples/badge/build/darwin/Taskfile.yml | 81 +++++++ v3/examples/badge/build/darwin/icons.icns | Bin 0 -> 356592 bytes v3/examples/badge/build/linux/Taskfile.yml | 119 ++++++++++ .../badge/build/linux/appimage/build.sh | 35 +++ v3/examples/badge/build/linux/nfpm/nfpm.yaml | 50 +++++ .../build/linux/nfpm/scripts/postinstall.sh | 1 + .../build/linux/nfpm/scripts/postremove.sh | 1 + .../build/linux/nfpm/scripts/preinstall.sh | 1 + .../build/linux/nfpm/scripts/preremove.sh | 1 + v3/examples/badge/build/windows/Taskfile.yml | 63 ++++++ v3/examples/badge/build/windows/icon.ico | Bin 0 -> 21677 bytes v3/examples/badge/build/windows/info.json | 15 ++ .../badge/build/windows/nsis/project.nsi | 112 +++++++++ .../badge/build/windows/nsis/wails_tools.nsh | 212 ++++++++++++++++++ .../badge/build/windows/wails.exe.manifest | 15 ++ .../badge/frontend/Inter Font License.txt | 93 ++++++++ v3/examples/badge/frontend/index.html | 36 +++ v3/examples/badge/frontend/package.json | 17 ++ .../badge/frontend/public/Inter-Medium.ttf | Bin 0 -> 315132 bytes v3/examples/badge/frontend/public/style.css | 157 +++++++++++++ .../badge/frontend/public/typescript.svg | 1 + v3/examples/badge/frontend/public/wails.png | Bin 0 -> 9057 bytes v3/examples/badge/frontend/src/main.ts | 20 ++ v3/examples/badge/frontend/src/vite-env.d.ts | 1 + v3/examples/badge/frontend/tsconfig.json | 20 ++ v3/examples/badge/main.go | 77 +++++++ v3/pkg/services/badge/badge_windows.go | 31 ++- 36 files changed, 1568 insertions(+), 19 deletions(-) create mode 100644 docs/src/content/docs/learn/badges.mdx create mode 100644 v3/examples/badge/README.md create mode 100644 v3/examples/badge/Taskfile.yml create mode 100644 v3/examples/badge/build/Taskfile.yml create mode 100644 v3/examples/badge/build/appicon.png create mode 100644 v3/examples/badge/build/config.yml create mode 100644 v3/examples/badge/build/darwin/Info.dev.plist create mode 100644 v3/examples/badge/build/darwin/Info.plist create mode 100644 v3/examples/badge/build/darwin/Taskfile.yml create mode 100644 v3/examples/badge/build/darwin/icons.icns create mode 100644 v3/examples/badge/build/linux/Taskfile.yml create mode 100644 v3/examples/badge/build/linux/appimage/build.sh create mode 100644 v3/examples/badge/build/linux/nfpm/nfpm.yaml create mode 100644 v3/examples/badge/build/linux/nfpm/scripts/postinstall.sh create mode 100644 v3/examples/badge/build/linux/nfpm/scripts/postremove.sh create mode 100644 v3/examples/badge/build/linux/nfpm/scripts/preinstall.sh create mode 100644 v3/examples/badge/build/linux/nfpm/scripts/preremove.sh create mode 100644 v3/examples/badge/build/windows/Taskfile.yml create mode 100644 v3/examples/badge/build/windows/icon.ico create mode 100644 v3/examples/badge/build/windows/info.json create mode 100644 v3/examples/badge/build/windows/nsis/project.nsi create mode 100644 v3/examples/badge/build/windows/nsis/wails_tools.nsh create mode 100644 v3/examples/badge/build/windows/wails.exe.manifest create mode 100644 v3/examples/badge/frontend/Inter Font License.txt create mode 100644 v3/examples/badge/frontend/index.html create mode 100644 v3/examples/badge/frontend/package.json create mode 100644 v3/examples/badge/frontend/public/Inter-Medium.ttf create mode 100644 v3/examples/badge/frontend/public/style.css create mode 100644 v3/examples/badge/frontend/public/typescript.svg create mode 100644 v3/examples/badge/frontend/public/wails.png create mode 100644 v3/examples/badge/frontend/src/main.ts create mode 100644 v3/examples/badge/frontend/src/vite-env.d.ts create mode 100644 v3/examples/badge/frontend/tsconfig.json create mode 100644 v3/examples/badge/main.go diff --git a/docs/src/content/docs/changelog.mdx b/docs/src/content/docs/changelog.mdx index 145942306..5362aa286 100644 --- a/docs/src/content/docs/changelog.mdx +++ b/docs/src/content/docs/changelog.mdx @@ -78,9 +78,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Gin support by [Lea Anthony](https://github.com/leaanthony) in [PR](https://github.com/wailsapp/wails/pull/3537) based on the original work of [@AnalogJ](https://github.com/AnalogJ) in PR[https://github.com/wailsapp/wails/pull/3537] - Fix auto save and password auto save always enabled by [@oSethoum](https://github.com/osethoum) in [#4134](https://github.com/wailsapp/wails/pull/4134) - Add `SetMenu()` on window to allow for setting a menu on a window by [@leaanthony](https://github.com/leaanthony) -- Add Notification support by [@popaprozac] in [#4098](https://github.com/wailsapp/wails/pull/4098) +- Add Notification support by [@popaprozac](https://github.com/popaprozac) in [#4098](https://github.com/wailsapp/wails/pull/4098) -  Add File Association support for mac by [@wimaha](https://github.com/wimaha) in [#4177](https://github.com/wailsapp/wails/pull/4177) - Add `wails3 tool version` for semantic version bumping by [@leaanthony](https://github.com/leaanthony) +- Add badging support for macOS and Windows by [@popaprozac](https://github.com/popaprozac) in [#]() ### Fixed - Fixed Windows+Linux Edit Menu issues by [@leaanthony](https://github.com/leaanthony) in [#3f78a3a](https://github.com/wailsapp/wails/commit/3f78a3a8ce7837e8b32242c8edbbed431c68c062) @@ -153,7 +154,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Built-in service creation functions with options are now consistently called `NewWithConfig` by [@fbbdev](https://github.com/fbbdev) in [#4067](https://github.com/wailsapp/wails/pull/4067) - `Select` method on `sqlite` service is now named `Query` for consistency with Go APIs by [@fbbdev](https://github.com/fbbdev) in [#4067](https://github.com/wailsapp/wails/pull/4067) - Templates: moved runtime to "dependencies", organized package.json files by [@IanVS](https://github.com/IanVS) in [#4133](https://github.com/wailsapp/wails/pull/4133) -- Creates and ad-hoc signs app bundles in dev to enable certain macOS APIs by [@popaprozac] in [#4171](https://github.com/wailsapp/wails/pull/4171) +- Creates and ad-hoc signs app bundles in dev to enable certain macOS APIs by [@popaprozac](https://github.com/popaprozac) in [#4171](https://github.com/wailsapp/wails/pull/4171) ## v3.0.0-alpha.9 - 2025-01-13 diff --git a/docs/src/content/docs/learn/badges.mdx b/docs/src/content/docs/learn/badges.mdx new file mode 100644 index 000000000..9c73ccedb --- /dev/null +++ b/docs/src/content/docs/learn/badges.mdx @@ -0,0 +1,122 @@ +--- +title: Badges +--- + +import { Tabs, TabItem } from "@astrojs/starlight/components"; + +## Introduction + +Wails provides a cross-platform badge service for desktop applications. This service allows you to display badges on your application tile or dock icon, which is useful for indicating unread messages, notifications, or other status information. + +## Basic Usage + +### Creating the Service + +First, initialize the badge service: + +```go +import "github.com/wailsapp/wails/v3/pkg/application" +import "github.com/wailsapp/wails/v3/services/badge" + +// Create a new badge service +badgeService := badge.New() + +// Register the service with the application +app := application.New(application.Options{ + Services: []application.Service{ + application.NewService(badgeService), + }, +}) +``` + +## Badge Operations + +### Setting a Badge + +Set a badge on the application tile/dock icon: + +```go +// Set a numeric badge +badgeService.SetBadge("3") + +// Set a text badge +badgeService.SetBadge("New") + +// Set a symbol badge +badgeService.SetBadge("●") +``` + +### Removing a Badge + +Remove the badge from the application icon: + +```go +badgeService.RemoveBadge() + +// or + +// Set an empty string +badgeService.SetBadge("") +``` + +## Platform Considerations + + + + + On macOS, badges: + + - Are displayed directly on the dock icon + - Support both text and numeric values + - Automatically handle dark/light mode appearance + - Use the standard macOS dock badge styling + + + + + + On Windows, badges: + + - Are displayed as an overlay icon in the taskbar + - Currently implemented as a red circle with a white center + - Do not currently support displaying text or numbers + - Adapt to Windows theme settings + - Require the application to have a window + + + + + + On Linux: + + - Badge functionality is not available + + + + +## Best Practices + +1. Use badges sparingly: + - Too many badge updates can distract users + - Reserve badges for important notifications + +2. Keep badge text short: + - Numeric badges are most effective + - On macOS, text badges should be brief + +## API Reference + +### Service Management +| Method | Description | +|--------------------------------------------|-------------------------------------------------------| +| `New()` | Creates a new badge service | + +### Badge Operations +| Method | Description | +|----------------------------------------------|------------------------------------------------------------| +| `SetBadge(label string) error` | Sets a badge with the specified label | +| `RemoveBadge() error` | Removes the badge from the application icon | + +### Structs and Types + +This service doesn't define any specific structs or types beyond the standard error return types. diff --git a/v3/examples/badge/README.md b/v3/examples/badge/README.md new file mode 100644 index 000000000..ad12c3f40 --- /dev/null +++ b/v3/examples/badge/README.md @@ -0,0 +1,59 @@ +# Welcome to Your New Wails3 Project! + +Congratulations on generating your Wails3 application! This README will guide you through the next steps to get your project up and running. + +## Getting Started + +1. Navigate to your project directory in the terminal. + +2. To run your application in development mode, use the following command: + + ``` + wails3 dev + ``` + + This will start your application and enable hot-reloading for both frontend and backend changes. + +3. To build your application for production, use: + + ``` + wails3 build + ``` + + This will create a production-ready executable in the `build` directory. + +## Exploring Wails3 Features + +Now that you have your project set up, it's time to explore the features that Wails3 offers: + +1. **Check out the examples**: The best way to learn is by example. Visit the `examples` directory in the `v3/examples` directory to see various sample applications. + +2. **Run an example**: To run any of the examples, navigate to the example's directory and use: + + ``` + go run . + ``` + + Note: Some examples may be under development during the alpha phase. + +3. **Explore the documentation**: Visit the [Wails3 documentation](https://v3.wails.io/) for in-depth guides and API references. + +4. **Join the community**: Have questions or want to share your progress? Join the [Wails Discord](https://discord.gg/JDdSxwjhGf) or visit the [Wails discussions on GitHub](https://github.com/wailsapp/wails/discussions). + +## Project Structure + +Take a moment to familiarize yourself with your project structure: + +- `frontend/`: Contains your frontend code (HTML, CSS, JavaScript/TypeScript) +- `main.go`: The entry point of your Go backend +- `app.go`: Define your application structure and methods here +- `wails.json`: Configuration file for your Wails project + +## Next Steps + +1. Modify the frontend in the `frontend/` directory to create your desired UI. +2. Add backend functionality in `main.go`. +3. Use `wails3 dev` to see your changes in real-time. +4. When ready, build your application with `wails3 build`. + +Happy coding with Wails3! If you encounter any issues or have questions, don't hesitate to consult the documentation or reach out to the Wails community. diff --git a/v3/examples/badge/Taskfile.yml b/v3/examples/badge/Taskfile.yml new file mode 100644 index 000000000..d1bcfaacf --- /dev/null +++ b/v3/examples/badge/Taskfile.yml @@ -0,0 +1,34 @@ +version: '3' + +includes: + common: ./build/Taskfile.yml + windows: ./build/windows/Taskfile.yml + darwin: ./build/darwin/Taskfile.yml + linux: ./build/linux/Taskfile.yml + +vars: + APP_NAME: "badge" + BIN_DIR: "bin" + VITE_PORT: '{{.WAILS_VITE_PORT | default 9245}}' + +tasks: + build: + summary: Builds the application + cmds: + - task: "{{OS}}:build" + + package: + summary: Packages a production build of the application + cmds: + - task: "{{OS}}:package" + + run: + summary: Runs the application + cmds: + - task: "{{OS}}:run" + + dev: + summary: Runs the application in development mode + cmds: + - wails3 dev -config ./build/config.yml -port {{.VITE_PORT}} + diff --git a/v3/examples/badge/build/Taskfile.yml b/v3/examples/badge/build/Taskfile.yml new file mode 100644 index 000000000..5f3517efc --- /dev/null +++ b/v3/examples/badge/build/Taskfile.yml @@ -0,0 +1,86 @@ +version: '3' + +tasks: + go:mod:tidy: + summary: Runs `go mod tidy` + internal: true + cmds: + - go mod tidy + + install:frontend:deps: + summary: Install frontend dependencies + dir: frontend + sources: + - package.json + - package-lock.json + generates: + - node_modules/* + preconditions: + - sh: npm version + msg: "Looks like npm isn't installed. Npm is part of the Node installer: https://nodejs.org/en/download/" + cmds: + - npm install + + build:frontend: + label: build:frontend (PRODUCTION={{.PRODUCTION}}) + summary: Build the frontend project + dir: frontend + sources: + - "**/*" + generates: + - dist/**/* + deps: + - task: install:frontend:deps + - task: generate:bindings + vars: + BUILD_FLAGS: + ref: .BUILD_FLAGS + cmds: + - npm run {{.BUILD_COMMAND}} -q + env: + PRODUCTION: '{{.PRODUCTION | default "false"}}' + vars: + BUILD_COMMAND: '{{if eq .PRODUCTION "true"}}build{{else}}build:dev{{end}}' + + + generate:bindings: + label: generate:bindings (BUILD_FLAGS={{.BUILD_FLAGS}}) + summary: Generates bindings for the frontend + deps: + - task: go:mod:tidy + sources: + - "**/*.[jt]s" + - exclude: frontend/**/* + - frontend/bindings/**/* # Rerun when switching between dev/production mode causes changes in output + - "**/*.go" + - go.mod + - go.sum + generates: + - frontend/bindings/**/* + cmds: + - wails3 generate bindings -f '{{.BUILD_FLAGS}}' -clean=true -ts + + generate:icons: + summary: Generates Windows `.ico` and Mac `.icns` files from an image + dir: build + sources: + - "appicon.png" + generates: + - "darwin/icons.icns" + - "windows/icon.ico" + cmds: + - wails3 generate icons -input appicon.png -macfilename darwin/icons.icns -windowsfilename windows/icon.ico + + dev:frontend: + summary: Runs the frontend in development mode + dir: frontend + deps: + - task: install:frontend:deps + cmds: + - npm run dev -- --port {{.VITE_PORT}} --strictPort + + update:build-assets: + summary: Updates the build assets + dir: build + cmds: + - wails3 update build-assets -name "{{.APP_NAME}}" -binaryname "{{.APP_NAME}}" -config config.yml -dir . diff --git a/v3/examples/badge/build/appicon.png b/v3/examples/badge/build/appicon.png new file mode 100644 index 0000000000000000000000000000000000000000..63617fe4f746b8a878bd5f44725f4f317b9d9850 GIT binary patch literal 132625 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 z zh>+i%fCvdxd-!uy)RtAbi3OH>WS}|wXA~KmM$6Xuwy!RBnsr~bROc%U(QHEx@Vepr z-p7U?v#0W&7Hu9Ob_YM;s$KqE1a>%SJu*4}p+S!?T$m!aSn9%CU`C0%Or^%;bpAN( z9DQ)72_-ByM*GFVnCmnczFXRU*{u4dSu3I-KGZj5r7yD`PzlYdEs74sUa>4#TferY z2DuCcU|r#Ea#X#k=MqGn*>+VDN~eZz?m_Mw-qz`Lw&rRL`-~ z;6I+xLj>H4cu(HqZC}-tMF+fERlAY8Q4_jdYi|Ed|0b|K-$(1Cu6KBA7XdIF3MQkz zcVGF2j*tcE{UMYm#5c@13XAja4xtt(*ZK9%w}yY4Z?92FxXY{3(=~h+Pc_!+|2)Ok zByy|;VoR9b7Y|@8`DZmZJr$k+7M`s8f>%zZpF)P{>R>WSO(sS*}46vSht2Nx<0^#>fFwZ9x7Kt|)iT+MTAX4f+3I?yi3XX;=C3+DIU?YuRD zpgPBLDT^wCtiNEy3`?SJ*b3_=&U8XV8xU%Wc!oOJ1%ndD&=DeP+IgsWS)iVDFP$b3k2G{QzqYreFiyB$j}C zoNZqp43#uJui1aTfNiO&kyQT+8Ki%@@Y`d#i07hBT#S<>#n&j|b3Pf6&ywVR46mLK z8P31&=)}tyiCE+v>m)7Z!hLiZ>E4M+*vd5>%4be<|NL3#6D{>8p~aSq70m}Db<;AtF6e)qD~5e5X)f_+Dsky| zJ(B{<5zPne(&_3j#;)pQtNr{PEe^TE9egBU`FYLBMmgD#h3x3u1?jcMu~R&|4rJ5` z22+o1-YviY^x?yE9esGF!-{u6FH!msNK1y$Ok(p!7W!cVL5W|2^iGEJd96o_oFLmY z*zLZFIxnlyq8F2ZiVimBXfvI?RjEi|VX^F8xH6aE*on`7tuKRhPsX|>J&CY9>n9t{C5qVB@3yhCSh9G&T(OQTc-iie zaxwT&j+M-n`f-!?1F8H}x4R5cSudZ$YL>qR%!m3ym1-c!d)^eIYWR&GP`@%woo>3y zo3jG7z3lVga#|?m=F{a=U8J2qHkkxwV{01?h~X6~$am^ezBOlH-PQuk-&G30Qc5)$ z?}kza{5$a*{s5C2wdl2z$u=+zSRBk8#B~f@|NCaf(wsTRaZ%EZ<&>}HyY0=tC%kzz zTF!w#{^^IX?iNX(ur9+KvlZb{`;mNK{+G=ty&*~L>!-7W-4nek0#QE^;R=n~BzPG5&cQ(sh$DgJjD44zWRkze8 zQ4H|&K?q&hu)X#RIJxLqr;yA1eNhu=<@LWQM{f^i=H{MO&NUaegTkox9fs5I$vZh1 zGH7@9s>u<-6KKG_FieH)4*JTaKs4l@gHAL492=djTizSn;c{=(vi-r`ds{~kf zo&E>@P`o^^NpWph`|63cz=xm{cR0|S=~o4-8ns3CJWN_tN_eOiVH_=2wC0u&Y4EuN z<`QjS|4Hn0zi)+)aYaqMIl6lLH?hM)q~?Q3vkP#U5ri({-YqP1^AZh~_9qAobq7xB zN+rNMNAh6C{liTLX3JB4*r|f&ekv49a3DmBzY(hfLcsu;wE(o|UuY0oLm~&imJwQA zarV$h$h3lhu)p00iJlN`dp`f-4F_QGi6`Wy5C(9TM7PBqdKB2_KGGrgZ)BAg265)! zK5q;jS@Yf)W|;c)EhV+8DaZPP>Ct5dPV?5DKf;kSKTzO%4=4#B*`j}V|oSyJ#c z*Lf;8i$nnbrB>j-l!*P1dleeL+4NnH)qEY$1H|`J99F>~mIcd(n_((NL_i>`bt#8B z)Z!xupsU{9teuL?>C8z0%-ysBnFp1xR^e+FV=aIbqKkm(EaA>>EvE`q{)?TevQN7f z{Q=k+BZxeGXBApEsMI#En-Iz;)i617zwdVCb~q4E_EJM z9XJ^+>X3^mFJC`UJ^b&b8P0Qey8E?Lz>E{&m;$1|y#_?DK{i9@hhfcikD_mkJov&X z_m=oJ4KsSaZcW%c`l7a5Nwjalnw9ZS6BD7CKobEcq>J+_#)bw`?FRz4eS?$WI^?V0 zQP#v&ekfrTnzo*!-yd>^4t)#k*IUM~iO$aH*wjc*BK8!e1RA5h^bC%v>5wa!R-OVx zrvZAVQc+nMbmn&g5IZYM)bwyuTtaAr&1J3aFgGH0fvgtXIzb^up8GbsL4EbrAn5!bwR`=`3Y0)B7V=D8Z5#(j_|)*0R0Rn7@>ndE#3+D2t?>9@) z*YW-KQT)qON8+rNpxDjB`#ry4SlKS_xU^dtT|sI|@4+V>86)?=5+VK@-o41A7_h_4^Qeg}+u6boyuw&EI zE5^nU%gvyxci9L~cHOdDE&1uhi?Ax`Ak{nu#+(Wp#``fM3dVtr2n#PZ_)@3!zoHjYEf_0 z7I?MriLo46Q0mGd9J%zh6ZN7N(CBbX+^v{{le3*TJI&^J1qH!wV!H)gERaBR_F;CnBwhTU~;1A?NiC(#50+ z{`Z(^hZ<^?zE(LI#p;%c*)+99;>TW!HaeE3+wwa^_vBUwJ2GA>$lPTt!088{yOtS; zi5DO}UHVLTMhv6FQCslHQS>5bHw!X5LJXj;yG>uXaJJ|)g>->Pljk4=+q|a$_?ouG z@W2bG+g~jYkF+Dg(K*KlI}_9{A>gpCIzFfeyEcuRN&qB)eaun4ISFj&LHZWl2ATE( zcGJ@f?@tK=17s;npF-!|ppXCHLan0pkPvq4J79`x+(gcHhbGv07x}jB=!EJ(vlrh$ zOXvPO0Df`X7aZKQbfwjgzc@Ezdu1a>=O_rUJeA=xx9p1?`C>)R)aU{zI3nlYEPfte zlCKmIAmXdC%A*|dUK3*t{zhE(x`h6)(6BOJX~tOOEa2jaHl4>{>~EJ=M zOu%`f1aAb2lGsrO$?HMSDkUwFOrj38gPS&TUKh(n)l~K`!_^qYKt1zX{}$VtmfxNW ziBy9|yoRbu=)IfyFBr{Tqa@4?q9weHfk)?m zHEY#{fOH2C6M)YaFB03uOC6f_(xkbqAl~j-SgxL&1zp2bo!fdC%J$374v-WxOyw9P zZCz0?|4FrgFLG{sG=Em$olEfCd`oL2Kr34tUxXVE78hP|_j&^T6qvXHOf;6mK;}4) z^ML*ByYF5Y?VtN*n@_@9Y`*#3n!X>DPAwg(y{svL2sG==DZtm z_u8tczy&`)Sp(bLgzdtlrbDe}5L{YFUZ47jYKfxIWQ%d+o`^9^DSg4HqOMqIDg_0w z>JE2`B}rj!^LFTTYeA?jP^}@scYEqaLHX|p%gKsO89bv*?QG}=mwDS z4qX}ncB>9+bcvf+DpC`XhqlImHzg2E?Ez$02!%hn5YD$}Dy@6IZNRA}5rz-AZ~4hp zyZ>4ZGi59C>PbrWF{OgEgI{uMP8n}t-JsN**eW3wNxSJ@Fo## zp-cL7FZ{T}98J@~?^105Jx0P#6kf?ydU||e;c0mGqvCDWYk&SGRKWE>Jj^u@++l2- zYy~EKME=}ZJt_b%kksLn*Es^7=$b7i5)H!ZfdGx%@gdE;AQoA8#^>(%Nj`Be z(G5CeBjs2*U;o5i#uh+|&{Yso1)khk5T>dL+MeeTu!u~6L2%|9e9&}$3Zj}=4tkoc zdEfS%AMdv3;t3j>tFPlxgxh6Y0f`b$fFPW;d*$zuGEML#?QU*y-!B%{++X$HeM+K= z%@9t~*1Y6dpHFwtUcsrKc}5LTMDKY zjY{%dWyzhBx`_6Btr#(XPQ$m?rmVRO6jmW+*%6`k-=Oy-PYMXvT9aAk5U4$sMxqA| z@yhYdUdMX|m`>5nX?U>s^I*svnn*neaz6o+w_B{oPFWGpZ78;tHy50~9V)SOS_bU% zIlRC`EoRhs6*$lSyaeS=+qwOt^3h>~FGP(DMqkmsm&60V0>E0M&5ad{%Px-Lr_}xq zsu@$S$Y=|o>Z6{GvklaWAy~}^b5IwhPFLZ4Y;_XX4fnwR%IYgabEF>e^z};V2bi?W7x0`ayg*FJi7Hk*%Pa6k_TM)h-aQ+Ib~^cUX&L zlbAaPA;Jr+ks|LQ-|s_hCI+k}=rIJsu)Nm@{CXPE#*%r7?Fs{`gstIwzhH&j$?X6X zrbB|vu{VOBAUQ4V0zo<}A;CO{8y%{e!E*aVbn5t~ax5>y)-y8g`pA*HH!>0*KI>U~ z%B^s17f}$+xxan+XtZj))*G=mGTg84q@d5q9-O7p{HE3C>1QrkC(`bT{guAs5wG*g zWVqDFoQNv#qrEZPCGVRsX36Ge7Wmrbr!9g^@PN(az|Cw-T`z{42Jz$~bdD)->2l>( zCzuNmV6nB$BLk)W06{ZkNFubj3?pY#M+^V>bPDi`fmQZbaSs<3MB~@J-0HIjQ#*S} zLmwejR}nEcr|H^7M?FdO5mauCp@^>PqpNMpKb9?^i3!Z1gUmq?xBB#q)5m`=yZ+WS zS`UIm-E?=-0?a9d{bY0GwBcJqbSx>enWelpG#;^gZ=i z3}Ll1cJ1DjHCnwGnnX!3T}e;BNN#NWq2!@ah^tsU`O{LzqP%$m=A)-E@XF{b3eSv7bOQH-zq|kxe z8}sUv$-GEFHk0~x;*}3XjTCxk!lb<=<&W!Z+6%xZ6OH^Wvzbu3DQzop4*IaURFv@R zo!e!0l^aA+1yCWsZJxLN%x5zYuNI)u%20VOHk@OS>{as?yaA9UF0$QR=4k^K3xX#v zUJw$+b#CCwVq7yYmF9EG%%K|gKy;`Y=?nONul z@4_M{H~kl+oUKgG`p4bFxlLCL1*asoPO2tc#;&#L_k^j+A8LJkN5m(Dl?qo&xzH`X zLAlXz9)@_RSuk?0Pq0igsveVTu`PYl&FJ$6B@*L=vKHMl3C~Z=y}du3!DO3hBIY`& z>v`tYg}!IF$jf1@xRX|kMpjo>xeu_?zz{;N&aN^oW!am%yjSRk5^pct)a@9~;4O=H zB+d_VpA$@od&Dz=uaSFsq#fjL4gYh`RUF zaOP3S)#*9Roboi-BXwDvn2;M?A0MIqv3LLE;cueoW*PUjhp#@1GTb0w#y{O3&2|I> zMh=`c7^6v``SV%x`-1!Mw28brx1HqsPfVd?deT7kjfacMymVziSho|vRdYX<$N$%p z71s*b`7Ch_K+Q&L*&_OcuNntZ_vRU^c4)5I$^%l+HT1WZ#J=L}CgyQ4o)O{q_b zzpoXneN1xQ5uuoa(qV)XLI02M3%8>E6qi2D?< zWFy3rrJb4A)r%ry0`X%0u9I%jl9;P;gzc6#6+4W0ODQ4$T|*aJ3xxOkbNNZ5CHHKNJvao9}(QzBR_?mV3$di_)K@kuJY zHD2f z@jmYEHF3AX)+)TEhj%so)k|9TL+3|(UA6Cz^eS?3R>aeU;q_r(b}kV5gOl#dFe-SK z&=_-H*nxhlpuKavude~{Q0&XS+NFg|g`v_qH(5WUm@7#`Cz!sx^SD7^{I`Cs1_k zt5X>*Ppohw`Nd%KFI*TZ5K$R0=`azvp4B}8j-iI!YHZxnSj3+(pXV~+2gGB2W9^`x zL-FQex~>_piDP3Dvi5hh+xA@(N813K8V)<>D4qNbZp1Tb40kAoKmyh=-Q@es)jY4s zweSz)9%tp|gCLaT5W5jo4hH+}vdjfc}MOrZ8(U z-E!Nip6A@p%sWwyK4t!bx@GVp^}Rm!-;?aa21)W0|F{L`l1%-hzBLSR8YxnieJTPkj^9Jd?HF9Z6gME?!$#_1qXHpqq2y5QX)`mxOh^X7* zeZM~Ob}nzut0~O@_f0w#fk%IK$`bR=&yH#l0KGFQaKDT#;-R0Dose#QcWauk9(z)X zdE}t!O769DOnw?(M_Ez1uo!>rM;DxZ3;O1qX6O@&)k%{8+F5rgW2ouzu~IDWCs*(< znIp8+ifX$mR@VrYgG=83Z9lN+GcUxAKU72c3I!^}M$ z+S|yiVjS z3^&n;D{r^D04I9=lv@q*wRKSXib)eB{P*uIvd0@@sg-=4Lf%sV0THPwVyOThzS~Ga zA#qEY`@{ePJkWkStIl_!%g6ujJ5bbSgD3?u-hqaIf8pPVx)j-1uJh+@?{3SWC5zPwyTpw2O899s~<<$kPzf@I%^>L^WxL4+|O37a+* zKO_iLIA9&`ryHDZK?Np8I+N8eKY2tz+vJNY=sT|i)e7^0h-NyJPUfZ?BIY9IyOb;J zGPo`J2PHl>qMdBwO?klKp)D0KeC)z z32wbOKk_<9qm%3qKXuh~UG(OUwOj`7`bZE(w1^l*uKgKDNEciQTwLoEc&eg7uIF^S z7Mz4lypg?FvPZzSC)Ewyvs}IANE6~7k{1Ye-Lm(#<;RN&0{F74446Am)4n8vSZh$}E)ED#H5eb--xN66)1;Ym4q0f-qGdSj^5KQ6pFqIHvcPb1@_AxlH zavugLzM?uG;7ykE^zKyWWB#{^`qaVoiLTd*c$O%86l@&j&klcNmiUT1mXp2E%_l87 zqI0c09wR6XTNX;FfbDPG|q(>{wYYM!;WdLi64@;eiW6LQ`F19vV zw&HYi>+}v;fpku0vrbH*_8P8)L8w6$G(33bXwpj}vohYM;se+=Z9jYuQ4@t3o5kxi zbJRrfneY9{+y&rQ>h{y9d6x9SZwvNE3qM~0YKEwzrshy`gD*uR=KGN6oBPlVcLV?o zt#RPv^|SIC%#`(-Vos{+QarzlNM$(mUTu=Otv!Frb{(UMKc-&x61;y&&Emxxd*~{5 zitlK)5R$LEhfE*;z^Oi~%-(w%@#v!3Xt=T;t~C2SM|P{%o{ z-6!(*TtNP%*F3fBxGM9Up9H}IuS2)n#DG7lHC}O%uV#<>Y<7>!;dS{=Gvx^(!DQFy z3q<3p&719q$KqiH!-%~I%t61%8N}+#f#SxKWhIeR9dlZnufVpkv)! zY4=k?_>HI+Ddq@B*H}ftN9h0h zOJO|Q;Q7`kv7ggxK4;;?(zm;Esp*ujaaQie^uXI%wSHFWZq+>bs`V+5hz1(1>u^nC zzdOn5jO~2gOt4JQ%NVq&4KkN2vM8XL?AzFn_Pi%Bcv$8ye?sFg-F`)I;Ro*mWL*a9V&vW@cXJlUF(q!M`o_ z?pkdw%R@eRxC+D_(hBN8>8}q`3(HRdeU-Ij z9=6Re%oE(`Ea9^X%XXsx3!Su!1Tch8c)(%7e7sFnDDd+SQ6z$@P(fc#G>xL_gHeV6 zi2(+JxOyV!HXwL4mDKKAYed}2#E`%8g9vW2{(ndH&B#k--g7jBNvAz@C|qQ2#p=)H z0Uchm2lH#;w2Su4(~a;CyM_=6rm4m)Kew9uGgaS~kBYZ)IUmja^W4CK!%dfc7cqs~ zV8W}wra({u*-B@Bvgnk)jbHaf-E3-BR)AUO_-9Szak``O0iYP6eQDfVx_`@r*;-@j z6chhC?|>(6IOWROy58BL%jx%_X@Px8=|ufU+w=< zWj-T`I^_~+eC6KRj)}^L4tVPStgpov>3^Uw)}I8oMr<6SS6&nl;4>yL;M7wV)tpZH zov>MMW$bi2yJ3u0IHsM)_}cAWlTyXZt35L~22IYVo_=aB>AGvhF*6W-Gm?1m^y$~J zkt{<#Vg@bQJ{M&endO?N!}8;8)tbvaM|=YDO{JNfthM$n*XQV?SJhzFbW2Jg3T9*qZkn4X?rs{IiNi`fB8Uq-a=$g^$3wh`3++v;tK`9>L9*;~yr7_0DU z_|9w-I2#0I#yr=Kf)Hf>_AGWQM=|t$MAxV3GVT-*AlgT#G;>ivh^SQtVh~wsJE!zp<|16ljcgyS&aEC-V%w z)z~DCTa__ja8yO~<6^-{)v?`4)u^D@IvGk2i9&PdT7BYVTe2O!qJ74{=Y-jzHLB+!q_( za3_w`nF~g19g`yt9&3UQ z!L=yRv4U`{TP7m%ny=Fk#w&|UNW;~e01BjOGr(T_|1tID(NORI|6{L+Br$~{3fYOQ zV@auqO0vb+Rkjdg8Ea*ojGeMZ5!u)5MD|_T$G&9W#|(zwYwquRKiz*i=bm%Vz0G^x z^Ljm>kJTTj!;&fw+e(RKkel#V&u1vEH>+tPS-(^*4V2H3#A~B(1!3k39D}aJp1eiE z&LRUl%0ve*YL7~#g6TDR4&gMfeMeivlxKg)qtK zMnm|y6+{H~?;HJ+p7QPcv&;o*BuyVat`7h1xwz|BU92H_h;S{grehtg2B;yKC+EJk zjazic-2Py_na_R;W4<0E7Ie*A-DMx_);k~ug4_S`+}COiMYnxy-2y2+QWJUYDUu9I zn@uVDG5_A5JRUfj2KM7+AW*YygEp_IilfCPa5m4sVSs-x%09h2Lm?N!pv?_8E3OzQ zx21%TX%KxdSa6i};k_}*xXxj8Uk52FOrhAH7E#L4)fwYziySjbH5Rqx5Jdcw$ zKuP-b-6D@T_Wm;UIJ;j=ijWN^oa_aYg`FkrOV|M1oO?;x`L zL_n#7?wAIwuBKlpi*eN*gg`^@# zOUT#oPNg41%S!&-=?lm5kD=Bs`_tgy_t4sq4&7HQC#C~5asog+Ze#kzO_dar25nPc zxQ&r_K37SjF7z4cqu5^eHlRi@-WPshLEx7;9PB%}&}P|9Qz=GN$+6JtWU`pK0Qfp; zs_}d(m!)i{v=oWaYG~F5;68Z60TaEu`KWro_6-TPudED*xlNIIgE|%keRro(Z=`K~ zomRa3IDgs~B{RjBj;UW||9;}^r3I1a1|9JWPv+!UpqamVj6I2x$Fr~#zE}RXQ5dm4 zIsKB?{Z5RkG?Vr380D`LSTP>IF1Pyk!{oPD|a(I#&Jp!&m3jQjx% z!xy$5eH5`Ehq$AfJ}X7Z^pI|A#bW{{EXgk64E(celQ;EQVN|LzhnN|q&%sh=wKuU+ z1>CDtALX-l#6P@`#J|$Xh>#q8)c^NKyR2~{r#l}MF!DWR7aXXdTxeUj>Wv*V!&>B1 zG`&)hoc+l0!{_vBMXN8gjxURUNj|k6qdmnpCYiNpLH$G@KPn+RbXgg6LLd-NviK~Y<L20vbcn=*G%hh3gtGu%GTC^_buxf4ajk zed%gjNyv$|m7!dl7e8E{KJ)65M1d3w{llVf^)vv>6omi|W8|~7|8AYtx7@NBAe$Qt zX4sd}ns7e;t&5ls^?Bu})-44ts#nvu(yCYwAKiqDo`-=~ea<{gCIAFXvK9~{(Ws{R zn>!-gvfT5lYL8IE_y9P<@jqX+#ytJM$iIW}OiB>jf+L7Dr7omi{*%L;838;}o)KJf@$Ff1y0NFBj1{z1@mcvgUi^-o z+cHtR+(2&)O>rH4Aq1syv5s(jyswP4tTVre9kHOh2<0WHs37OJOvUk{F;lbg>6rCN zDorly4|uQ!&j1N!?;D03c9<*ntR|{NE2*94>RPIi{%(~L`8At$}Qc?o+98%7r`~f+)BhRKz6r4r&o`5roD03eW7qgdNG^hda?Ia z1?#eYn4{Z!>s1>I{PCOo=a!hqFTM%a!Ln+un+1~HI9`#8C)*wO-WlKfa+F$$ zf9wKN{U4~!cPgB{{uYmfR#;&r0!6r52NaV~nsbjo2$g6wYUW0_pXL8iZ63Uo@+o!o z{JDN+%HZ?czjiHykVm3bPUi$!kR1otG>+~09Py$*hlI>`+oeTducbG7J$lBy?E=?9 zI%Q)5uttQwlnhqQ>jkmsT>uOb1>I5=mWjXF+souqg?i0m9F39ZzR6{x=PSQ4!-B>E zIuG;N76X~1gU(M&T#!GRbvMaq*d8jvH6-z(6lezXto6b?I@{fxn*{sfE{zG~Qf=+C ztj$D+m30z9r!GuT=Er_gL*6FESFL!O_>{P5+s^!#^Vx%$O>?)N2R|08T z0TIYc$CbAUZp6GX2`$A&QhVe05|vgNgDvsrPm9&giv||9XfNqulOHWX5!`NIVqTO) z2&2DBq_G z*tjYoa?Dc{fVb9ahS3BQS#9ysKrM$qNHN|hBZ3xl-XUbqo@`rPoAw}V;g5+Tr7WkR_NEoo+?u?FX z-nwn=o;fB)Wth>r^w9rg(IiEQ!!Y?{Y++$5>sw|z+|n#7zqwK)iF~oM?h4`iLs#Wc zS9>@_g5N1ERz+ySBE&pg0^i}&bdi<-ENN(&Ym0IRi9(Nleg~R584xOX90RaX2u!G! z;w@%Q|BBq$B{JU+67G{kT&U7ReD!eygLimu(oDMjp(!;NT)1NHy!Ub&FZ=w_6F)8G zr4Z$`yXu@Ju$ZmAlgCe_LbW8fbV%D6H3ZOLJd&eKx#o7AOTr z`d^=x|D2eTAweB4V&1LgcxT@rmk#l*c!ceaP7%!op_ACvR_YB;-<-O^29_j&uGFO9 z_I6ggl*`x@A+Fi342@|cBv$enQ6xlV@8kry0vAAU{hhYq(x(D(Wd>FqwUx#MhJ_;1-+%;j)uD#cc9K z=TqDuFlv8>UpwRC@|zRcnZ}GNzXDjs6%_D(zb8GjV>{SYySj}W&aGgTtSXcaF8vgI z^{Un{)Bjw2;%rLOL9ZixRS>YPK$ur67@GVZcT4l~C6qpwL-4tx9!9sdZ=5a96{I9X z1nJYf`y*WSK;~ntp#JK|>y(ZG+Wogu=8Fmcpg<~%L(LObOV5Q&!6kDXgaO$H91>O< zj@YZbVYJ>fr*Lm+$hrA`8Bx8N&29p@3#$!UihHjwEE|$R3i69CSK{jpHW_O-Kg|>U zz|X^Q!smn-int^$0-|W=s~hRZc3LC2nPEDkn5lL{DB@J2ohgd-8#<~-=HP2O0mRwg zwMe;2)W5K243NyB!y0m4H5be0&_lKgc)C^8V4t z7s^S>o`1jrP}92-*=hCoZX}FrVG-fx7bk3F@VGg=&ep`Wlyy!Q6D*v?_wl8DweuBf z4p?Jl;1)@V0Q16|Mz0H3t%^^8;`f(LYI?{kC=&EbfiI}hOsfL4sL{(c_~HPxQy1a> zE>kNd53i(uxoxTx_H)azjX`*t1>yEde9S?}4w<|&rBQj?exN zlyqP~cGq}u<*cK%gnG&*D29BiS#0uMzw=|(A4S%M%SplHf!gS9I+KduPgpwzFA`U8 z<84d#o}#AwXqvs)6(&o8Fg$j#^FvewZ`1xYb@49#S}v%k6}|6g9u`XRfOheePl}+~ zY{5A;iODPana9$X_mFy}S&9Hkc*wH-U|BI9_!rJiu<+q$ftNpqS1Wn-h`rzrs?~zd zKRdX4I$dh8~I z1sBP-YqXcD4hTi8*%GFJh|e7WFm^5M?_H)IkNGt`y>mM1%hy~DsvGz36vn(K)53kJ zi4-WzI30C04_Z6i*}NMkY)#`@3U_vLxuEy7<;#KY04gd4S|CKBk^B1P<_in&UISy= z;7KZ{BBeNV!<;3$E%arA!*c(-b@c>wWU*D(3`u9baqnut-B46&GXu*;1^9F~DtvzG zir-@GO?uEQg!Q}EA#IpE9_@G+*_>YWtgIw;T^=v0kBZkrl}Lnj#0t$$j(a*#_e495 z+f^P;Gl#J+drQ^z07x*m{HN7{R3BH`}l569l&Z z&WK?@DO9u^%cw?u3Qz>6WVn}y0L9zxQp>WWt`A(AU8aWTx~DSnvim|~BJ0Ow>V&01 z<=QZGG2&w0nNxID(V_zkYf)l)!n;#*D}U5WQ4<-0Abr>q4y;}GeTF3EEBk!DG z=e8T)=M7b}B&;Q{+uCrfRo?ovUjMDCApirg^{^8_J_JST-8&$OY5?and9FDyxH<3v z@-a$!znZ2t6R?`>Ft7|B=+8Er=c=YS2K(qL zRp_GJ5tA!hWW!$@tI!?KSN?81yeivbyobd+FjI2E8ECHN9K2QxRqC3FR}IVU*+mew z)sBoxNSjk;b%K=DX|p~HXWCP&v{F~6|3h0tAS&A0$puS@(h(wH6v)atM!1rVwUtZ_m*|ive@_W*BI_rG~=AD=+ha zmA?>{1Y#RUiU~z9BHyzNju(gOF?B5WgS1~i znUXg(Qfw`8<&I2?Z(dD*ZA)*BbCv#`mmSZP@ior|W*g!vifT9n2-h*xw?Fb)Xi@QU%%5tW&%O_A#KHe=omX#EnIS-39euYJUc!uPxg~V3K zKYfn@=Kg?5VE1wj&f#5&CH66Rzd9{~MJ^37z%p3jkz`aSo~FwR|GZoHsarWeo2EN- z4hb8eqf?RCDM5i@U|q$FUR|Z}SfzRLmO&7WppLCmj|Gik>rQW|UbIur&bF0v7Zdz|FPJo$trzAg}eCX}cpPmqThxKRhjp`lwJSO+V zc3d5(EO-I()U~fiI6g$4n(j9Y$`2^WdnU*|`*Cxt%K=omi6FYCnRVQ;Mj*Ae`t?%( z0|uBL1N>PJ*%;3edEHzNS&ccl$J|b@hDAR({a+$bf&PKRge1qXff+Y;4o3lWeP7 z+GA3-!45K!4e`w}pIiIwYQ2_2M8__^`Aj3PD;qp0u6`5Iy5%?big(PUel9%AR`F|$ z1NY7VDle0=%;@07^h&rGPYP`<$Eq~6Cq*$ur1DSN(aX%B9~}VP@diqHH}ECltj{#S z{hsAjy%i*{q)1s8O|2UA6)s1cZ;}D>o8-URT1@e39`Q3g|NoyuPrsKxzF@^(yMd-T zMHyOqt`|fPZqx&0`uTDFo>8lyEDApzNbsi>eu#QvtEh4Bu#X=FsvqO?zt3#@m!*uC zO%kr3*PPEh+W($PEQk}l-N~}~bVXb9`R~L3A-w&m*Ev&7M#eztl{;vHaI%ou%hKUhyS^0~$)tt^{%FNr)7B(dI=zI#p|`iz=F`q^EF{TLK>dm{%LgB)t+pBh)Y^^i3L?p-kw zgKM0{zw(I-9mV)Hwt)JGW|FfJFM91t;Tnr&n*?fY#O3#i)>oe_xBNZl zSll0#U#>tWnUlYo6(KF-Ft>U#A~OVPeY!xA+tfLXk*%t(p{|3SsawvXSdkIc*TT|| zVidhu&%d!s!0DL_$VJUx?w0o(`c%@!+K{Y6PK)q#J#A-9QZ1HmuqveILmWP4@}(QpW0pVoLu1s`wze6I4{Y*BO7U0tL9? zae^b(L9-Nc0hqMPF<=V97l5i8o(FBts+lqP-@4xjiOxOKrdTXR7=y&!O;dUN*G_NN za$-IG48_@P=N@99A`sRof032h_$fRF^X#q?t}nC>k8vPF=_%4WhC7u0RlwblPNRCX zOIS?V;RCSIG`~?s8ak9R zZxk+aj1LXz>gfU>D%nPH&-tHfT`1(ZqZ<6Epi!NDK%{2(Jm?N>BMzM0e77Mtm@oIo z7yKGJ^DaXDO(yH?Ba=z><#-pp6L>b}UtyN}sd|2G0xX6u> zFVZ3NZIgWbH1N#hnuT!3^^Y}CQ!DPaaO$%28qf1%{pBa0$Yi_`vA8cMCXqwipgS0X z%Mo2jlIzTiZ{KuzV4yZeX|uA-uYQqfJ1XC>CIgCv&c-_K>>UbW3@9<|PMs_a*j}PFqM80p58v|z= z6D$>fcZr@h*-ma3QxUVFA(nr75G>7k<_!Louym;2S_JL;=E0b{V{3E7g67Qa_5RHV*f3TuiFA>iT#lvhT_E;_d6?lu@`OE{cYcr}&y1E&tv^ zXCqeNGFR588{nU+Ik&*#+m@N^afaKqEh*|36@!8%3*|m6^YB*G2W~|~E8WqL@z2(q z-s?xVB_*D9{?L_mnZ(IJyte7uhUcda*i1j5!Rhf3z}3fm&gP?U9mG8rEj)82Ht?+7LIqh{9v*-ty6?&2e-c9{ROsu-w1mSjt!{a)vF zoL-;3w?zcp5CIU?i^3&qNi>cZZ`?$;HB%_iL-F`);*U(~o-7d3;vBYRh$t?XEE)$_ z+AHE_!To*L5a%q?n#8*|8-i#<#Yh*$&MgLoxmS+1n$HdkK^YZjl=bPEZ4QgFWF*_3 zZ-7H-Uk^n)Cax}u8!;#?SwHxSxoNA{BVlFxa~9-?R^xpe-Z0b=Tc67PvQyOHN1-n( zCYKMJ(H_6t)75zI4x204a~ji%-sew*z8;%X+(y~a4g&!q3%rT!RCdQ-^ilQ_W9rdl zu8kXegi~n6k<;(%#;&-LH9BEmYsvGJ#quVGg#jb{Z6<5xU0V-w)bHbF%?4y{MQ!+% zS}m**Gvdci(7BT^p_H>u0(1>CtNQnq#5Sa>I-WJme9k1uT0T=ksBumz43DbC$8@-KhgUHr8dy`BT6Q~KP>#)4-J8C50nN(BqF)s-u3@G$A^yChbG z^^v`e?wtFgS6v}aJBVR`3^jLweu39fS{lgx@S-J@vYLATbI5CmrJ|@MauuP-sSV0-RXUvyH=>ezzE4 zqHkB#J{3O*z-VjAydyPf9J)XIwAPcf6G`!Qm5U~ycur1C92Hba&v)kz6;a@SBJ?O_ zUo-ht^wWIft~d~IF#gVHdirHr!<|1++*79l_GpBFmqSJ1i=d%3s^vW}i*oWuIx;&2)^CJO|2CQr{PsJPL3NHKC8!3wAwgf+ zHS@@GQZ8Q~kaD4BWswK^i2EL^#;{eiy+@V6Hh+oIT~rxD~-_xg;c@&s;$v}8HCaH zJH@E8N~48THxZfXv29PR2$!DsaQof~$n3gVb6r5vTueV0r@t8~{8m-%dz84_*Pi{p8^g~U>v*DI>swq}%p_=gO|N(Q&Jei)WNPd7?>uj9=z zZAMMDl^xeN-rt-6SDKt=7{ih5EO*b4wIWaD<-3Ps-s94>gp34t?5GQFXV~?$>+mt^ zQj$1Bgkpj{QAS^U`huO}YMeU_{4EQzsO|bJ4dK^Dy zc@L-{A(kHt($I{9@j8@`o}!eBlKk5iU5;e-erXc`_ZECSLGsC>+OEd^inYA_al5I# zZU~%Svscw)p9JiKGawV_Q@>xCS$T)qbT{=ufs(=nbBuzNfg+HO9|2@@8vx3+R(MvG z4KikhmhDAD-jq%sn@)>IG+!iOkpY7uX=EgM7r4?XAc%5-x+)t@gO)oZBU0c}yi~i? zobdfym4IXeYYtN%6LB^-)XAJrmz$PCBt5DY0`Z01Q&oNv-CL;)@xC2 z@mbNk; zar#!SQE`CC_bKuTk8imlEA($G8*{qZwgtFmw<`rg7?|p5wn5r_KSe{%aG6}M6t~(8FYa(8mU+O=oerlzApdT zjk#g=O?CAwnirpER22(0YfV#H2u~58f2dqDgOy50_r~B#ZxVl}T;>!({$g$3Z}UHs zh3v1lAy+zVlvh*D=N?KVpusd>Rqfh!Y0-7Q)78St${T1Y32$e$T05ja%lV$df|tRs z)bR>dS?5dNZxHWpgam3{ub~wSZK>x`T}M|r{MP*UPL@(v@n zez_s_fdR4!s0%^pIkxx$EM}NN8*Ju)c%+cG6z723N&~&vJ5LXf@A>)p++~WdyXBzo zgpbW?FMw@ui8|08bU9nvE6aO52A)~t^ z9YWYM?CS4(8c^i;!Z(L$HBs7b@@KLLuO{Noxqeh%5%rlfyWUoo==0Dwx0-W%SbCGp zD~~D`y+x*9T^kp2iZh)6%J*u3z`GqD8j0J-vc8!`YSQDJmb)XEUoQ!Jeo&5BuRl;& z=7Eh4wJ86*tY zUl6a32}0IF^S3@o$&x~AZWu_Em3LW= z<_cyQFh$L+0w^rEF@e-rGztFiGSk4{qIM)p~DnJ`vt?TW^jajbtvl|e?pb`N9(Yeyne)n)FH$NW(Y>Z+6gjz6# z@`@bNL*-m(aMNbb6Npohj?wF!>2kY&gfGJMPQk2`T&|rQ3?YkaGJiXbuvnCJAFS&W z$$Tp}`+C_^vrfT)7g<{f-fw+*4!_`UGdzgRt6FR4W%Ef>)VjY!;l7vsyZU+G6%M$W z8_nh;oGtBaBQO^KdZE~h@bY)BP5PmxtIN_e=>ho7MZl3^=VPyHNqoY{w% z-lQxY8Wt+`lBIB+>tR_6 zqg{fUAtG*gavl!at*+f-m4g$R+L2I!Il?7G##upnM3@67_k5&dK)z1%R0LJYiGuTj zM(uL@H-BjCLSqW*==7xLM$J~G1Uc5v5DACA*=ifcGOS(aE~kf6Y_@*qKy?nk6z~Qy zHlsBq@0)cOH+>AV1muG*1xksA~Et9{op`6jP)4tY?E zg{}o2&bDq&D~x@;QY-d%23kH#eX4QD&q-%wzd8e`@@EKY7Ud|iyeO#vVyQV92X=6A1k^#&uEBOj_F z`%iDpTd<{9%^d>B2Y%GvAyS@bv~+DVyv3s#$Qsk$(XKQEEqoq#KyejzCywDLJI~BkujWvRZ|X1CCZuFC)k>={}vb zaYdv?XI#b^>aweZIjb`_if%lg_Vb-k*6phKLu||u75h25u3FaN3N%}J*pc{^z&m4K z>L1^!>gbl+aZx1PtM{|@F*SBOrh)_2K$E!CMW`XKhqVRUFZL48Wh3RN0<=Pj+oiyBER zW8S!7Z^TDVy#NP&=s8E~5!mV3H{51i_Q2k?_m|B&7=`eeT;RUEcs_q=X=xfLtV$&* zd*Owbe~h3zpS*Bz<@+%r#n;j5$7#-Mpg8Y@BS$^zPoS%vg#Ca@#-X|7-;d#}F}FPd z^oQlk#*BYAr8pso_)G&8M{Mi*nB_A)0XDESAOg8o`Q^GfKVU? z0mOwL*5YzLr?a-Gh-ar&%cDLYUAik$WIEpZI5^B4&Hfvbnd|L4H@iudwWTLa@KaHMMILlV=)u5PZhj%Q1z9 z$U|YHc9IU|j}7iJ}^!_YZN1Ik>&Bc^I4z#%==QkbFJg4_u>-$%NaNf zP@E%}52KB%{3lepgXj8JawENxh4tfYU&wvty=(4a`Sb)96j|7occtTKJ$%fCoy*)D z5AtTGQUGsxd}#Se@npV-R3Ip0@k|AIEmuzCSXc&nITJm$?OU+!FMj76TFwu%HQTZS z!tc6(9epWl>fTy7@HP|5mUvTKJ$xXk=imi&a5Nq4i;FHh{7j17FbpCMgbcSUJwY7= z9wat`#DwBDplWIIPHpv8%Ef~q%#6YSZstXN_z$ih|0(Jq`3QxD&FS(H=t1a(p(NzI zdCvNoDGD}xyo4ux%296AoB90P*uDYHLn)DAuYIm}46K|e-?^$4=`q(yFC=_ET6_FU zUvM4izd5a4N3{DH2!SPhB!Y}B2GV)OUP}C=;&sM2wvCD7>mQ~^E_snWaL(?dzff=O zVN}f>t=3>R>M*z8*}vByO6he>VoROFCzz~NnT4U7mf~u|*DHQDz2tdC=lK$DzepQw zJSdMi1gw;`ot#DdbOLn7I`w4#Z4P&EmX0RDYwCFyN5)*l{2O5?uX|d#;-#|&uW2r_ zUpij6sWs=hUNMxyd}V>8K(^U3CWT*wu4|BCEd%f}mbQZ8u1mrZ(@i;O^VfmOSmvLB z#h<19Fd#8F5r~MDkv`WKSKN{$%7wZQvoe$0!2wtWY%X$e@Xc$eZGmycu)u^Y#bcRY z8N0{0MKW(ol#Ta?Fle+hpyEc(<9$E9!R&rijw6aX9h#c0sY&AF3x7YY1~92UqhK*n z$LjoD>7|q(`tFwz)-a_~Yr}X4<&*nw{#CK`*T02)y*AOL+O#s52P~BV%*K6BMwZJ* z@v-h3elxVCI|_SalM9o_>*Wm_!(dLV2eC&Im`gI*a~os`XDopL;;_-cko3fRX+Dmd z-5r?J=^=D3PzGVFLIvtG)Q3z?3Q6`G%4;l{RxkRTw-N$ zYg(3E9oi21+YRe(X*-al+Z-;y>)QVPItsG=wJ#kHWG0I)HiL66%KhhmzYY|(OeSTz zY#tG+hJqNzEjCSmvu6a>&OdFI#N%inwd}vJD-P8S00%Z+!;2z&HY$foA(ag=^!K zr)x%_ggPTi$Ol*n^djE->a>05 zgnv8%)>Ll1Zry>-?JqUBOz^=L#$0qk%ufNH^*L6#3{mTc0e-ga@;a}NYP!S|QW+V( zppjl1b!u=$$4;@nIIT<*MF(CV5^Qk1S{!4l(K6~CQcgV1_I(Jgwk6(mOW=rsj}0^K zmXy;xS^9gJyXe%p(`89~)Fi((F6s>$(H0pS)!YIvl^)ao>1j&XR9$nWK120Enhq4y zZ&CHwh{igk(J+r!l^N<^3-7qn#UfEhqvxuVndEbh?sNM}_vV*4<8~in2SR8iaR4JY z>_vvTBzZqoPTOz2*GK<}iHs-($jBFk?OJ6A>K59G^tfIVyd-G-G_qXGtIAu86H`!3l=)4#)D-)R=9MvH?spXv}c2P%!3p=*4Z2BewpV zoe{XUJh!C`9dhxkZ*ko37{1cOz{8Lw)t^LUt%k2<{wPan)#h-R75M(FYA9w9S=N@! zrT6J!+35emGp@%RWS&Y;oeMiQJWj%Xk@E@_as$;&KRQnrC~sPA_4ccUNY#$ibeyVS z?}$HS`}6v!zL`awB2Cos)2Wy*{&m;uc|2eC84HJqZA1vj-M0R~Z*V`Sk2^gY-LUDR zSn-cwsK6$708saY_d|%DEh@}9=U2JeAtPK7H6fSb-Te^uN{KM<=PBsh_|_$Q!AhHx zYGC(MG^~gm%F}0BtSNrQqBpz23x*YW&@sgY7uC!&Mm_mjML*q$_%sC{t7kPXdBvD= zoHT$Pf?Zi3`5w{op1lQF3&Lj`-GCUUiKcSXRMsD(f@^GDrMXxJ`?TyVSqz?QxgU#}FVc*ZXiZS%J>4RW%%X?d$p5RdUAE;_qOy6xCglUby?Ib2 z;?B0vBzkqMr$J&<;N^*UhR9;uv=)DIZx721J|j`QWR+g6dnm;nURSL2{Uh)8pKGKX# z<-9zvGH=rB$374f&P_4jN&$aN^t$M}?HGV}@t~mM)v_f3p^xU6w9eAOQ!hbvKUKY4 zr5T;1Kvk|(6aOqP&xobBY>rCWknZ=i%eF>kb=PRVjLy;M@Q2caLX!WJ5ih?@x~iKk z(*L+8xrQ6$U)_G@ZTwtuvEk7q>Z_h&%|LNB6 zF@7qKHX9W9zMX)KVwSooAAqzMU)tW^$F=~&o7wbly{T|VcAL`dY1%LNgW5RwKMY%( zkm0q}pF)dC-a84CbEMFS$R(5dK*s6D=teaufwN`m0v6)MjY(Ypfz$&kgnEoS=Y^b%xFmxoZvs^* z{uA>Q1C0WjeFiUs8kepe)LQF@CMq{2J$$-!6}Kk zQk~Zs6{Trx9{(gc-|LdgOS78>9`_1QiaGU!XUk6a4xd0d9c5GuPutH{#N(5y#hc5} z33W_n;)bzvWAQi6!fQ>E-g@olZ!CabIpH147d{*ICv{_B)mC5wGioti@OjgfPTv4@ zaiw#tV4%hLjLrQe;hLGQPjaGHw@h>J@$xSuYJr_!;c9s-C9|ctu7!+*;QQ~q$@m8o zcI6fJD5ZbosIQE(WrG+Nq0us9ws_D&tU&0L=y|2Xv(w%KpY0H?DY=B=5w4^FSaBf3 zg_&FSigP5tg(_a@8=4fU241kpfjcx3eGz3Tx64wtM_kXxo*l*W_*|Z;$NMTsd?V#(HR zd!;pClsTd?7C7a=RK%_rcmI^jeJY6N6bP<*u=VKCAR8Ng7zBM2awM?K5YQh;CSp+X zJZLKY43@b?jS>6v>Gcs{`n>=Hf2}D+;Cf_^9n$`?sLD=QyDtFY!^J%D`wQs0$Pz?? zmkk3}?~)TnctOzbTVOaIl>2pBJB(GDt*W_zMPRfd<@R=QNQ+r@az>Dr~`HfibZtgJ_;c>O9F;+HlH+CK-!;iiKvbqm_`}&<<+Ziw!NL4}W|J>#aNA85LAC zEhPt&lQ9WvTOa1|QQ?L>gupl(0+oOyIh7KY@f0=p24jcyTePJxciT!1CFE=*TmHt9 zyto9Gm+w)q@wlDU&*m$o`1e@6G2;;a##VEtU zv(G4KGL^X|-!eIn`0Sx76cv*jL)n(Ye1>|!ul#kf(LLY6$=~bsX$n>E*3gV)-eFgu z<;g42Vhc}27AzAN59gw^NVrXcVN6pe3MfuVJWu;lcdLtaQRR-tD6UOfl4|^m-0o6$ za&B4M_cJIqAa6p=p1nE8W_#vyM=Q03@_esj3v37m3F-r;@@|h8KhEP{Ez^%zQdF#q zrpuZCX8-I>KOv600e?*9OQ!&;Vo{*iBBn90u!EI`9Hz$xyY^i1;VWw8UT>uwB8XT7 z-g`cT<9y7I$Dk3!d&N@rfNp!sk^v!%EE@^o{962X`^~O6h#DxFC*M+C|0vV`Hb2-_ z{tyOo>(kvAjX)BvfB#_tnb4Q8=P9Balef>3FJ9NT`iNyYd+a@{6mW?OMJATQytCGh zvnr~WJx8DFEMB(dHT{!?0KUfiUc8{97ym84c7~Dr4#0Og$ z$*2!}%19w_Ma6OYdv4&W-wNhU6qVjI9S1}?1mhdNrd9@;rMKCDyflGQOk z)HgfC#@Sp!Hm68Gd+;YEk+(*^CB<%H!f(z&$*C6pmmRqDwN)uqHmnJ^2XdYlu?y?h zE+@`izx}Q^m3Md5je5V^`neWD>ci6ZlpDjw`tw&Zu5Gmg9@Lt_ClJ*(MXMlPZ7EPT zD+}^5uFO;9>K6y3cpUHpcH2yKcYU;bshivUTpMd+9m9oaeX4K2<|?D6&5OIFW&u8j z(eDxVpGZ@%d^1ipl&JPyb>JriF_DLm(&=Vv|y7g05o6LFuC`lQo@aILUxe1KO_CiEE5!iQ+)-vV*lz-1Sf1b(AfrCq3G)JE>6+?HHU@PcG7qbRWN0 z+u}W|Hvxp1q>vCM*f1k%SlBmDg0BO)QG;7>?$(bTFmiAZAz=g6^Sevn;*_A=Wc*gu zzN*$aa;?54Om4N6lz5;GbB~-QMy*l*zbxQ=1e>g}(ffc6+WCkpp|NC2zJ0> z7&}VHnVEC|iwqW-;>=juSZoeD`S2VfBc7*$@-6;(JE`%{XGKJyGd@>VZ;%X=kPnT7B>CNZBkO||4*n|m`ORMz~mXQKKK6G2p#|Y ztP03ERhX{T6w4(f1FzM!M$clgE{-QGlawIVBb>s6JV(N~f_^Ec& zPo;Oxh!6bc+VadG+_yyQLl^O~*K`6c&;cM>p$k+(J9r5l9C(1gC=sTWET2`d{&-sj z=sPN-T8F;@-cLchRhh@UfWAy16hr!Vs<#JX=n>J0nxdtNuMu~`a@2l^wXk)8(ZN{; z75{(=WQQt$DzVeh5e+Rs$Vkcz z9d%#gS!DIRZh4r?GR}se-z^WsdvtRye)VfDelLwGqYBuGKU zAOgVC0D%V8O`C|516>XUkJnTmOkN);0(dyT>WqagV){><*eMs@1~sJaO$@78B*KU2 zLduT2QuJzGp~pN7evJjfdLRGXX!v>q&6&xYwJhEs1MsNk2_zMP1l&Kg=VNIS4euLP z*u&4;_d+n)JtxZxS{Ht{0MnNH_UC&?fB@ME*t=}umXWRDJ-&+~&~R-`hFH&LRlm_5 z_>lGQ8*uh{o6old4Bzr?i(I<91Hkaw1kml2NoYq-BDs2Oh71vUNg$#Aqf5uL^T2uX zlHXBl&01@l>TX=zf-uZPBq?z2!XF-l#=g5*(a=E6ewF0NrR{+)4JNY;pCw+5Wc4?f z`3rEH+vaD#>=>5N853u&A{^9C7-!Vh4kD+(&wUXXRu%H)KA{`Nk~yOs4~i%%(8=n} zLhd&_x@syLtJkZ=HP^&NFc?PefStF&QQynU1A`CJ=&80RE(;2~FXTx7a|tE69vnJ)X_U}hI63uVAcJbtv>IQ}hf=zVSIS3=U4mt39-7LU zC~C06n0Oz|fza}-g7?C9hx%5B=Da&hV`XH~(5^+rF+I03nRa$^@r?g~!OOvv4^^8c zq#%JmnpZWU?v)H6!T&%Hg>_yoj7pMwqSqguPA6yZ4i%IF^O zlfe~gGj&eX^1tG$uk+{0Ft5yzFN>|;FU?Fzu?hPAy&mJR~Fr$ znps_@pB5VX+c0ved#XD8b4O+0dP!P~Oxfn`-MCbhZ6p;8k$`@151M&02|UQ4#PYtJ zwkm3LDRT$dWhlg(l@iE4CtD8~J#Ox98)qFR8r^TcwnwC0>b}Hx9;mjQNmNmfk2lSj zhbI<)Rhd7pr*Q401x(}(a$O^B=~a5D`g8R(s?*#)8L9Jo-Y7vM@EjC3s$*9HY4p>f zdW)LjGCZfy*g196lv)8kvqm#$uJ{(OL<1)Q^rUcWN~`#nMMRzG-a|Mq^X$Fa;`jd6 zhHl4Xj(i^HJGXR&&Hq&b-m?e~zSVU&C$z`i-80ZeS9R~z_v3>VkQRvv-_tHTuoq%+ zbBrCE{(d!aHa>WIN@&D3I?%tx@%E|BE^7rt)LDarcgpgYKh5X7QE!grdN)%$SG`_Y zS>?Wym5{kxXOA@iwHw@S;My1X4y*p8wQ0GSdIjru7kP}9d~1pRX}S7?=F%Jmy|gdP zbG2~BPtNetdsTt}d^?ESty|OiWjzh$=A);`q(-$vy6fI$LZl}lcTydDq)3=!Iv%P! zmMj5y$~#QX`pW`Xul}Lf%iZV4K$F@9^V)s%Lq*Q^MxobKzO?jI)pJ%qOnZHQlGyA)lT4_2)I-WEn z8x?KEgj|D<%JSZ$(D76`^EWBSv z{O#CqD^A@L<D^1j93dV`q8b^%o9|Fa89QPoW*_$uEc71eRyL{aDidpa_!q0wHh{ zrL9N9-tiw-)t)G&R_@FHu{z5p=A13MtV9y(f-2mlh3CvJ7AavD`)nUGnU7B6 zb9VBibH#vB^EmTT?9N*f`hKzPhiu20Rf`clXm4zH5=z#)kE$ZfS;@vx0Ak!p zyy@O0B8q?OAhdfJtmCN;1fqXsx@{ISK!Gh^s(#@ubA|QN|v+d!!I|0E4bgo zc3_7Kno&&+2=&AdpBM>EMa5j6m~>MbyIQE=1)lYoyjle+Pe))vy6GY<)qW5GKgkm$Ka|v(`bVd>s?s5?+PeejE68M#D3jg=Y z`P?Xtefej+;kQe`;m2p=4@R3QRn@Xf5_ZE+FbyAdy+rLT01owZ;+2NT751!SH~GS@ z7`d0QNPS07zi1eMvColA#JNsbgn>tf$K#kZH7TEiUH*gm^X(2wV<7yk0Ude{T*x4J zFvS6Vu}TO;K|d#R%7eTZ@n-M@kjGOKb&7EAVmMDa9{x8DFzW2U{@cRATFiE55d2)! z(3Rx`LBl(pNA~Zht1Aly-6yD%nQJ zSh|Zo`;(FYYZ{fD?BrmPn{feHHjUC*=a{$S8RV5s^%3Y9=k6qq9GEhsBAbqu!tvX3LY=wZH_rvrV(JLPS5gDAax%@0cjBIn`ag_cSdxitXs|4b|#woh?WJ zo2a|QMLvmki49X|pZ)MczOV+YFAqV2s=c?jr2Y@boY#0sCMDz@F~a&CxqXcP%Uh01{P`ia|jW|B*E<*pZe3KmVcNfOrd-M$_0r zS7!}0)qOrE?z9F&8Yev|Lu0@r9GLH;7fZ$pZ>Hq?b?dA|e%p$n2cHvdzjA(x!Z%U0 z+9&-(r?OWH4&aAvk|<0;L11MytOW!S;MWik!r4-wtwwa+z-|bn^xkg`Pe6eey%OFT zN7<0~RJJ%L!RKNzKioJGOf#NtP0e=Wn7{iRUGrE)TT14DljS9iy`QUDn*-ugtQMj9 zTjYZ3tdl6^G0)(-hg5vKBK~8BE3DpAeGlI{USj-^b6 zT6_3-44vS64e^C1ww6~d^w*8(A=%%H$)MW=hqDFX@Kr?1RD8T4{#a_MSr~L+>0?9l zt%eE)r{NC)$9zB22Io3{PUAd11u92w20z+w1i~|cAujGiUSp~@Gx*u8}(1bH$1C*48H9U?8g+9yKl}= z-MFtXZ_Xj*7Z6bd8BWmpOWNXU+MHSX9jD~^VHkZY6tAo6IxuXl zh27?Y(QfX*(s()>c%Pwu!uN6s&-Mc) z`T>NHN9aetSA~-$>RsF`iW96CW%Ov_bPgO6Y#6r6he$_{f(c(dd0R8DR_TkY`>G=8 z@{7(`!*F`T|7#=|K`LS(qkL=yF_4AiTCuxe1=kE1wBalsi_b3Kp6P0*8XK(`6ktc+ zQS11`I3R399HCy{SFZW4i*9}k=PnoQoW6xS zwuffaP}|;#c*^Zkh41W-G9!A#!<4g_qsHl7L2?!|=qZYCWiL1si+;`c0i}P%N<#;@ z7#Pf4o8G`c%PN{#Vk96GK~f3VKH&1Mxb^W;u}S zJsCi1Xl^w@1DY0gi`rBY>bkbrQZUfH9hTqx@#AHxh#S*27}-|s-vX=W_fl;45dgacmZ-P@hrX%M`J=VdmRLA^!Ye+1ppZG7FeocRm=URvQE@mB(&o zdv{IT#UR)qUas!34Lp1`5NmX)`@{#7aq)wXdtHIOWsEHO@@d|?UQfLh>^vpWHwpOC zKhvOBy_)Yx&XK=c6s{b_)^b8opq+N1s1o^>^bm{CYTp8vhF+5zY6(mQmqFHEiv0mW z(*dZho0I!)pfr8|mxg50x>rp3&~iC=hiH6qYN)esd=#0DjXbfhv@gPn-mJ zcK#X(j&(3J_Z2Jak_IKxd{(-XEWAM${m~ZulsD`3 zwtfI-ZK5OUW||bN{ZS1)^_D<%-0pf3=4~K~h|evsQB{D3eU=0YKzg(776$#YxAUJl27Z|0(%rkij=Vd? zB*h5vDF4sV%?m3i?|vgK4V%xynf}V_AvBE3OR}yXs#~|dX07kyn~A8EUHQ$)N!Vr( zHuwlm#Dx^Y5S0WJN{s>aeH;bX)@G3Hy4?wY)@TtIz?1KpdfojbMzmS{1Agusq~OE8 zK#0sT{Z4}6u|~|~DQwlAd;zrkF@e+=apWVT-01tCWTe3aUrFyG>`=o#qYEMrcTl%W zZXC^9fxBo0oN~>7HQ|kfk`$m-wWP@yMcBn*_Vqlv9^L8Tl*;TYq3WkoW=IIwQFexR zkix$GC*^vN6XW9tx3Z%Bn|m`=rD5O<&@R=$xvcNbI4SsaEqgMX`>b~tE$lL+j!!g zn7Rr$4Z8%m*Y?k|#4ssEf^AHSAXI){8rgac%D21H&o? zC?6PohyJq(p%xT_zAiuzN_jpn3w)Ogc?9Q}X-%=v^SE(Zzk!O|pz)rj%}6!7|J5tv z4CV8sg2z(>Z%|LozeyPrO#9%>bTeq~)miW{oJodblfH zfs^x7B}FsjL2q(MNX_etJwKjPyEu`^tJNSxude%$bk{1*+%Cytxjy?@A#mtWkC~|Y z#5oM#7buqVA)PB_hvbDfca#KPIs|~uJFb^ph=~aC6pX-P7mzatpRGdnHvQ*36g#Zq zQNS$N@XXB2q;o;tYY7+gGA=QMhPZEyPX1%K2hlC+a02@7Yu=ZJtkT<$yZ#KyIb3!I zlHUDse(Ny!cfL&kE>*9F2|{<7-l1 zU@pC*5gk*z0|&U@eG77W%X5pbmGo3rl7O(A+6**^olY=E8={z0f{g{*CIiH-oGP-h zD(6(30QI|;r9f3ns2W-l^mx;S+)wiBn&^tPYEo^(zkv{)q&OCT_gK(Xw#?ymczD^y z8_=YkuYN2xsHAXnaFfr%Hi}GWOg30BGKZmjD z*&xTPKiFyN%HOrG(UE~_x|Kd`cs$UxtKUX_FB-z;KRat^1(RnfeXQ zo%!D=p%AjA(rszV77MbZ$;5!yf2xNTngC#Qs6=(6guVe>nWE1TTMLlQwWEQ}-%g|CM( z0%|9<`;dCVP~6#oM9C@8^%#gQm)Pnr`_+gHQ2Iow)X(6aEv<9RJEDd6wLXR8U)%#r zAqh@qKv~is8>aKb2m?Djf=_2?3BLAt%*cpFb_(0&$BBA(Sg0r~pB0VS-Yqv}Tg+Pm z2IF$l&dueKyas0#{_7rCm5qJErtO+i?Zov-om7X0j{tonF@-?!<;Hd|vR z6_s}jU)2fBtYo;P!#^SQOW{^tDbsz#Cv)RWOTe>r0MgPO!0xZLQbO(-#{zkLzP0^Z zo08XbiwJ|r8J4QNXA!a3!VcYnE$wUlybQuWU+BD=+6vR~0mVdE=+>HAw%2K+wqRD32)6Ld9#6m*6_fvOC6(aK@qq9s^ z9~Y&1CztN~INn+<>%$1rVPGn+=SX+L>N)avwL3Tv=ijZe^>M}$L3psU2dZxpbGLL) z{&Ba#HxX!Gj_AzUQI+!HflPU&B(d3g?GBmn2xbmv($a^~dQ+JJynypGDPEaD;#mn_ zx`KtBFK}vtn`6q_Q~2dxaAsqef=^}>-dHqAAwIn(7W89v0y3rw(P!<+R!T1fqj}jF z4A?82)>VjGTPmZs@CRva&I#4Yx^V7WqT%z-5B!$x(m{VV>X~&$(G$)8g~|oE z<{v6+u{gC}gh^fmpBmSS7&H@R1wR{ms_a<=zkzII|89mm9L*zP#VOHI`-vG~?xW7zfy}tLppJ!PAg85Yr7Isfe6?^>^8<1XzV%JZSuLl7x|3JwV^M6 z((Zef)ABrQ%s-czd3OYm{tC9JBW#Fpn+4=+;Ib(Vx6M4aE_hg$@MjpAB!Tti0?6pq zZmZv3vE2FjRl5GCq2*;D(j!J<3o}UP^AB6t{O4ej-lP-~7Fa3`6t2lK#fb zsJ-OvxSE=<{R0i?Lj7#LJ++C5kkr+k+~x|i=`Y z(nV``Ov%6m zd|`(ceC|19@s)=32`WJaJxLIkr-M66PSC7nLYy<(Fc`91KS3gY-s`B5|9Nd1w+!1{ zEOU7B!Pxz|AMmE?_XLA4{Y^atiWNb~(9R2wuHGAxC)h*9yu<~hx&)i<70=ZKx9d6Z zEa(N^ykJ;xzKc0!oFpmxiSbkkFzS)IfKTQOGbe>nwJA7(y!LAnGGIelS9g|F4cqQG z5px{C+iD1$jvC_M3$?`SGIWyEwLBLrxO~x{^9~X9t~=9-4x){B@fWd?$G`P1w=Rcs zuQM;^04UkJZuccFGv`ekuya*4z3m=}2nw(pYZ=@>#A?1X`-MV#vA6ukYbqS~*e&WX z^SeY(8kpZ9o@e%(%cxa*EG*@Nf(&(oGWwPouxSmjTY{q2hoT(G4D>~U%}<3N`)%BmmvBl@Ox%AvAnL!tHOc-KYT0#rx!1RX{%#zq2&x*kMn>al@k=j8W>`1pZBfo@=EX> zjf))1*|YwN)J8ei!RJ}LUjGpQHagGAZgRj^^E4MA%m0rttu}_|N4kaZi zC7!Z&3o!Z`Iwabiq@;&Ym z=-1@+^{eEa7Bpm2-3}U6CZOTeikct4qp7AL?#Jzads%YEopiQ>jcW* z9wr?u2yA~qoOuZ4n(f5;MeM_6qvl=7DZ2Pk6TNoU$$$$m?=AzXJLe-Jos4~#%Ptl-&Jw;uKpQ*tJnqOHEq(hm^y+DUK^QNCpP;`vH{{KiS<6jw2Xbpx{`&44 zd<^5=HeBABV+atxfGnH8d!g-ruP(GhqBA@L}&h>F7~ z?@XqO?3M~iXpzYrM2BK7SD?82@2Q_d*mIfau~_bSF~%defQjf(kk`L-xf%kc9-Ztg zv{y&>K3U5Xs`+bDSk77;-6H8dag*_WX|}YuwoG_}X^W&YR+OmBb_r3Yi2ejgOrY{+9Dv$^Pyb8hpSD#rNw=+oL1JnHL7$2*uKbTIsgc1K zEL>YCwTc+g|;?9rGYCMj{k!_6{U$zW4ku?{KgCXzuzd1@I&%mB+t_ z>$}Jud9^p-b)VfJ59H|R8PU#lRcK>0?K=#AAr_ho zMJVd&6l#8r9{8V){+2aP5WAb=^20Cth8VxWIy2Y>6g4hH+iwlbGkjJFC2J{Q;P>oX zNo16%9%xt(Vtkxw{~Z8MJGu+U4*6RoYrYa5wtQ%89v8vYm(Jp~9`g;}x67*oOY*+% ziPgQ3Hzh{xYV}Vcc`EIutB(OIqYyl4KBYs%t7Us(#DoLCG{m9+1ES$KtzrD{j?S8b zP^LOPhd9Tj!ql26=i0WrMz6ibF=45osXUzqn!^M8Shg^s1$#FDmZh%i#kS|c?R#j# z8k!b1X@3W4UuNe2VEDx2QANWZS4SgeJA z8#1wg$d>LJtGBO#e@EWhV`|_M+|a!P;)n3QP$DR~*7OVC*RNqyKc;|W4sM>#Jxq!P ztc?!5phYXN_f$XEirSf;!jcC?G{6h<&Me@JCwXAUZ1!q}q8>CwW?UxsDfM*;^n4Z^ z?NJB=1zB4)$M6{tXqZ;+2pK(<9!wP`?{#&1u9g( z-0h~~YH1p-Zkb;8tbt22SiuwdU)pT-Y;{fD85VHf?EmP+7Vq}Q;~K5Xg2S+bT9Nu9 zPvVk0RM}9xM!;zJ-t^V=ZpCJ?IEZs`wBmIF(-I-{!p`UwiVp%y4H4)kRxYBZr)mrf zPj(wU!76M@f$xA;rLF|FLsA7Auq&*?iK<#+QrRjU;;+c&s>sfB3S1kanQK1tcgI#= z{3%BwNM1>S$~JKMmhumuAGkEYq$&6DOsUE!<>}C$qlDR)OSi57H}@Bh!m*lDzx9j8 zvYwf=Oob_o!XpeeB1inrgEsiD)LwihMIKcB!qbUvfshC7N1u=Qj^uI#K%jn4Efb!f~-Nl^bRDH(`tNc9a;(ogL)yP_7e za|J8072w=ku>m9m)cEQH=+`#9u^19iJcX0y*RT`OJ@IZEZ^T(rU1R|p#3qfVDc6)8 zJt<%DR)YbV;N{X_K z@fnLUD)+TUy&btF&nf$JLB9Q!vo%A6u4n9Ba!zLAZYml7p%u;%RoCNWNoqqKA1Y@3 z#2%_Q0(8R8;=47T4^Fkr0`=G@mB?+Ezs&!%a5D$p=#&79{eCfz72ISMC74j$k$@*_ z{cKDBFu0FV4Y`a8W06*v)Z8xw8BST=6VOtgy$IzP5c>Mtv8M~*`tJVGC*S=4ND(hD zuvRY+n$41FTYG@4;qD z_nOj#>jCS)rsi>jGR0J%JNz}dgKlY<^kxby*i}55^Ho$i%-Wl=Zfst5wbg=jGd5#B z6r-7PVD0H^1OMqLLe-)TN)~|CkX!h91U60$`4Jq+-xNWBI!pY5F_D(<1a(qe!lIyu zp!;HUK-HwD{#d}n>sg7ybaZB8f6Aq9yEStyK#7TrcSefR;(R+@R>m$i-K7Z;)syKY zcjH#>#+&$R?SBuzk121uLPM7gG4UEs=K{0ofzh$^SjA?{?M&~4VudiN@KtEAsT)px z!L)8s|2=~lC4r38I(7p@03XAj3;<)F3%q`XIT1f|&J%ie=lPFJ@Av4MlrvDmRk+|U zUezyzZ`)QXiwgQ(BXm77;=7 zMgFh-|LfAQM)6Q!Zm{%DX|Q2Eux|3BTb<9EG-vO?Jc+Rd3orw^h$tTG$x1VCVguQ9 zi_}_KA_0a7{lHMZ)6*s_nnM75K4H8D8GU?a+3+S#z%{FZAAW0Sj1N9s@Bes~3)#r^P9+*#~Y)jK5;V9etcT;dad!oMRNTJ%l?cj3@K6A zNQqdR0vxWkjdCqHMl9u}Uh^38A=k5-1mq?0)!v?Y7WhLtFMjcbHh9Em2K1(*ew8}oke`q&smKcUpj)B3}IK;@jx$M9z(FOp^S;$fWqicxp=JMuTtNW|Z zKXr{l>Lzc$H+2e}mh2@OuIZG{T9L_z1JC^Q>YW~uz_d6R58E7p_11Xi>Ty?-t(-N@ zH?c4{nr0OM{0uix2VB2$UB64kOGnbS*DVqE5n!}+1TD7cydx1r?U7c{C!gR^VVqkG z&HMm;JYXr=#V1EPcwC=lU6CC*6>u;Su#YKoAoxy3OLLAhqB9knB2MSS->16QeS9e< zP6~(7XFoOo#TGCidTlBi%Q*;$WStwy{q$73@S>zS{C~UJml~{dD357LUmaSJhTUnA zYzcxpy&8H730?K@H1;tt^%?pGn31wwI7AXf?41C>MbdD1B1UsUS#W1f?7*oRk-NRM zTh&4=ZquEpMo6zEyNU~-ET4nH>aXYqM9foPryXtNp)`4Efg|*O#cKJ%?^T^98>16O zag68Y0L}F_;(@MY57XctRd?%W$LPZV% zVSMc=&tbH4GZ|C;W_>}Kt75YM2#+7~~ms$R{!%rKY$2G$@R*i=>36)kO$7A}l zo)H~m)L3uzB$rz|f*xi)NNC&oP72P)G8Z0*9jMYS4NnBE%NZO+cQ^X2z3|rW*re~k z1n9(Uxg`H|=79y;w}Yyl`Ch{at1^XJU~aHL`*jIjByXdI!KGrK3+xa*J?z zgbKQWibck7&54{_Fm2;KnTP@S-$b-`^f%9tbqlRrs(YE;uV0@I-B@;a5cmCY&zu5X zRWVmGB2kDa870p!_!~PT&2}8G)&JDdHfb_4l)Z3<0?PghMNi7=xr%iB=z$I9;YxLr zg(j6?ZGneFw^a3e^>_;$t|MP9KI6W8vCSQ)eE5t*Il~4*<|AB9O@K#_X}b1fEG!u;;v1$aTB|r46&=%-qUBaFYfI7?6cs_ZCA`i3r{&lDEQE}hCK+6*?JNXyu;C^ z(1qYm`bi8};ov-w0e7kneQIYkb7BQ3^$Te8G99^=G_{%~_4YS)Ufc7feg2T<<-p>aJ6JMA^$MB6Wt)H^W(WE`gkP z|Ips%h%eA@|11E>D~RT8Ke???OX;cFei=v?fU>xfsixy%8q@dfDR_f6F?9g{x1rL^ zD~W%)C!b_GQOxH-&n;e5(xda&=OG;nni%TIfrFfB0^#bebe+&vQYS$B3II=uZ5)d2}>zY@h3}Kio zbP~2iK0ZF88S;*z4PAE(FcdXjs*5-=Ji|)P6p2pD8aeTF?p5V>(P$vv>r-t|SBq}< zoO=Zda=y>##X9f?d5;knaaK0Q>#C{a4IH-h;xH?NW2Kv(4{OUf#}ZR@%Sl5M)6z!} z)fIbK!HrQr^P3KQy&0n>n-T{C&h^gYGu}&xluX)_=FqCV5wn8M(!rPX|E#Aj69w)1 zL0cLtMKhiZSa(C9-|1jfoKS}GhGGUWb^zOdSW>>@CbS3YR$Olxb$wv_y2CB$fKfS|En5z2ww9b6pFLszAf@~_%x$# zPR~eiZNsDkc!jLT{T|^71vjh;j8@(%ZnBJRcqrA0Y$uW>?%>gUH|USmB@a{^POB6uwH$5me%~ znwVEh6L5c#>!u!4V2=wpE=EJ37ZDqm;=R~UT2j? z(?Gucr*bIj*i4W1we=QNYuMA7G=XZYd?;TT3=(DHlbY~oFMLis?iwg0rft)~jGVvEIBX(;lA?s>ynv-jhmufXz{pcd2LhxNwmQ&*DLQ0&d_#$}ig~DS z+{fY=8NlIkZbhXj9hldM)GL60f~lbN@8SKM6MUR<%oa&K|7f`FJ$5D1kD5-@{bP*} z1w#r;*)90NDYn(u+VV7~P}ScA2;_%kZGs|!Nj@`$v7s>sqGa0N{YoQibr_$nwwE{E zqni-)5)4*hSVR>>W>4GAksT&7=yqPvS6v=x^10@*&2%k;vD+C10Ax_ABT3tAj-DX7 zNlv=7HeNjEo$%Xqdb#*9Toe`*K4_wgT8rHg0**rUCFWnmm~@a;&tT95Vk@cY3$i}T z>{((yJfHwlh|WiM(!S~N1>!Q~*{iZlrw^CGx*1MfVpA8R_a3dO{|_r-a9ipKnVl6uFqtU#?F--TB#F&Q29b3! zq@=M|~%d_j%wWurm9@dIMDF_xUwO8G6||0|-OZHNx&FB-k+A97 z_>d##|HWHJ-FEX`pFkbQxkJMbj64fVCf!b=#chwMnsheh$5@aF1YKqNM<-=sVdK7n z>lIy7C&z}!U>zkWM(R>}rqIlCusOu@jbS~+(A*OL{V3)eax<%?%>@4C^93WAQ$my0 z_pd!4#F#@e8)wliDp5fyo?^^*^pB&;Isvikx-qnmfJGI>VNe6)zBlS-MpzR}O` z-vhirbY~IVFvMI?sSxlnsbo;G*-n5<269;T$m#FbnCFKqlC`a&V%-bHU!qt`q5yd* zzGBWB7w0TKXL?2;gm;lBzS}@AP3i_D!KmHlFRJkQyfP+-y{1a7EhuFb_nw~U>@`(0 zJYM6XOYCKkegyl_Jy+1U$;XNq59YEgst(;iJ+|IoV~#nXcB$2}V9M^6D9^E~9)&~1 z-I`wqkJFCqT{cw<%wa_m-tMHrrK10I96qY!OmU`e{OWl00(cp^U6o{{o+?qR>1GqM z%zbPY{IY>id+H?hiG$P=Bk2D*jUO_cUVU$4bbr%C`|Dc5=C%J$DVqkBWH9DALeQME z1gFE)Sw)Xs?A2pr3jxEjgVBSPMZ)Lx_`#PW!I(bVy1J=LoOM(m9CGXB+PNVwt+#wU z`9}k}lHG33u%NNaU>nM++^$uv(nWPi`M{o-K^B<8xk}Dn+;W+&V$43u)g*XuqdU>Z zKKz0*)}Y>~KecIzO?Be_UYrEw;(o9!KE18xe2X=91wdOM%yz+VjFE`D6 zFRQ)QKYo8?rT)q3VccFhCUvIYJzwp4tqMsqk+sL69MCC6_lleSNCSw%nf^WOf1e4s z3=0}^rmbgQ5+6cp0o#2K+bH?=3X;RVF!zSlmO~qjF6Nc4(cmJM+}B$S#^Hk;+vUU% zGVA$TL)pC(0;9~CSU6&!$(2<#k(;YPEb-{<#uGcMAs_y|qszOaGv9$`76xk0z^!nC zA;r5Bk*nj)uG!T)1?RTgdwp|>f_+kH%T!?(I?3ZBZHS}T zMoXUFkQRT7sr{&iSB05-#gMt^R77``^2~#Oy+N4-*dLiTz>nQ(>>Yp#`v2(w)=&!q3w$g+@bh)>!W*_M8^Cra_--~55wV{ zcwbiu%Glj;QY#;h=ZTT8^&@#R2We4)-<><=0>WjqkZw5DJ)JLsz6WdG?^qqSU-q2* zC0Jy#fEmv)CU`eJ7dCuCRypmiLMIt;k<%P@2HH2t8}Z)m2YUfBl(pl5z}uipJ}g_w zKi73zTZpsraZ?KOFaqNVW~Uzycch{@aFkRT&CkPTk$3mA_^ZkOGq5Y{Tv?ZV`o{1+ z_P2j4slpym-)+;rIHrFmQePFw&TQ^|&rW_k9qP3EDw-ENKcq%a@dLNY+qCD4^FCvT zWF14>MZAbDL^P7N6@Nf^4AH_!s`j{76s+NNRt>gCgNsHo^ z!izp@w;2ggyM}f(JmZs%re?nB=!qY>k6f8_k{orb5as#v$yzlTBRG+_$4lW2cG15B zqb}u*9I17ab(O%k(Gn*HSpqf@_V(m2RbDc_{1Dpv#O2*eWHAR$tXNTn#IQl1>$juT z*b;Twp?RLUm9|%qkf+t0JWGxwE~7w#;1;ba{#FwSL^g*2P?($RrodF0z$Bt{_D3Pi zrL^rKouqTdVxADpd>a)My}TT!4q-KH#Wv-+XcB^(3~? zd+WRP#8Vo>5pSj4DwN7l*4K3#!zKl>QU9|Fj*UF6-ivk|awagwsOpP=J$l^=YYt~S z7%9*`_m`9Qwg~C{`srlv!IX`}rbx&k6J~4|RWJhvCZxXq)$AqK*FR@69As%cQWKLW`3jMBHFlU5%HJWm`~L_8ty@Ir-zcxbs$3h`?Kb zAysI%mD+KTYp~%g5Sy zndcWixE^yjN6C(|O{$F8^(huJed%H;8lb1b{5hwbdB2Gv2YnxliVD(9!fEoixcAn? zvpvR3by((JFv}iks2C}<5xZYVdlPy02R(Z^y=Henjx^v{&7km7j2DARDP)=6boUq3 zMtvSMm*l9DV-Y^#Bc)0(Gz*9f!@8@cx(!QhKeXFpMk$w*M6<8Oq0D&(5 zoQEte@rsD{V@BClPK~Gh%x`wq9uEYJnZ~X2u#Ht?uNF7zP?TXY@~jtf-_NXR!Uj{Q zLx;iYM{PZz)`@=P>!1{enLwa?(W~H{YzV1DO`;be(9J>wO89h^)AiJ`itwoHX(K<2 zgOfx5W{lHR=HpKg4EAUeMEE@OjJ7EmwD9mLkmH5OO!1&OAK@$~d1Z(`Y%ibQ(hks+ z)UZ`z>|^qnd8eppT(i?VrSy{A={&Rne}yw81VEPZa-tDMh46$&SeP?$DZJ}-X8#sF z_YQ@i^4UV?Rm|yFNQgVCWcTyVOj`GhbxeYi|?Bw_seZ%tw01FctQIL#954T>G+M z{gK+Xifk_4-Ski3^kK>0FiW@=Kzt zPu~qo?w+`Blkv->f`+OE)|4lf4OjaJ`d@%kIUC_ZorRmWuZmCBL@Qf(AGgD9PQ+w-&!&~s9(42V2t2o--eF4KTy}cdF0V~GrQtj^ zfa4g5n%e<~RwQd&>9Qjy=MvS-I@P~xy8^_|%Up+`MF8~WSpo~kc8S40qxk33+C|K4 z;*~V=g&dJorujH)0mNf*Nz+&bC4D=e@WNWQ%g_QJ%)1SE>L6|L+0Yeo4LXKWPu$S!4a)Ln2yhe2|fHg{oEVZN+oxLV$ z6Z}#PY<5I{<&zf`0XxN_>*kDUVs6Ke#`k*D1i7(_;*kZOH@P1o_)N>Y= z^fOtJ*+{A~qE%)6_(&46WPH4ew0k(2fiv%7~;lA$6SL|^|n9=;+#b~md3EslI@ z!syz=@LfjBQ=)!2yadSN)>Q8-L0VbZ}BvYUIu9oncV#Aq&#lFVd+c{ZDC*XUs4m^2dgoCjvCV+ ziDXR(L7HtFgt=EE_qSX=u@Vd>y_hq7r0%IgKV@XM!GWk|Go^SnRt=g;yB?XU=HuqD zwCHu(PF->cIPDa@c;RkJ3v1LA8G8!F55|)R#C#8|0juWdb{n3v42s+bHhfgTLXc~Kal`a*eO6y5!b?EB281z!Oq12%1!j%p>R$$7N?zcVAp zi#&GnS8P7_vp=T9E^As@)-Uyofx*?gQ%t`g{MY<6@2$Sf{vuuVwSIAn6aG$7*o3RH z5v04_{DI=*rZiQ9$+&iLv+qg!p9P)qiR%Y>v~YI+NZl4KNKGjHL^RP(nXp+lDCRi$ zN$eY3uo`iAyK|xnEf!Ds`+)^%H|a2C{s@Cg47?+TegOEC^C;;*5K-euO*OwOV|($L2T{bAGsO;OHzeRkej|2VvYBZum+ek{`ur zuk!yzE^*zM=d#PYA^oDk#szxtt!8JD)@PcZ!w9SEsa_$^CZ19UPZwpd14KvnIERaf zMBoQW+l@e6qHo<_{H%?GcU<{;CJyY{;Skt}mV)m-X|{Fz{7-hX_>U`-m_gxWzF=5s z8$Y~t5AE@2Bmh&0&J#wFZ2hmfH`FAm$-1c`GY%<`pkoYhPxr|*#G78#y`mYVSEzvV z`|hjVQ5|L|y)4g^*4;l24A^)F|7JAw<=;v24L6e#+@RtzitBTtyQ2wgw{F!mOTu5> zkAY%2Ur}~*F(&+x{`#oJ#QTfsmvpwcCYaB{Hl*E?lHR!VE2-|iam;=&$@3|7t+G#j zrN0ng#S|N3s!S>!D>D4f3svBl$lYgSTcVkJ4IcbanJ((>#6Wn?s3S7;v`cY&Ut-d3 zXkzP$hdBcgn@i*xbPp$7bIunP1L=5^t%0Xn5>*KYD>P;Yduo!<58w^{23SxP989IO zU_VgArm&CSH0$Y5_L6s@Q$R+1;)AoTpzk9LYJ!sVi;a=p>i%Tg#5F3#mmVQ-A>Xsd z#W}PUmu&+=XApA#3SXP8$sqPbP_}Z>{6BSi10Pr9F@*%#YsH8B;*!m$F@YD%yFY%Z z|5T-(P?jG`s*6Z}>NG$lTY7AIyIWcM#o~`wHh15i$pk}3pY&i&pmOS_CpoRy*{!%F z#~HTtAa-1cdf zbcnfBlAUH#d{6`kczB8LcD?gPpPk&tm=z z7Oe5zg?Uh}OymbS=OwYMzdc5qIBLS2laREJHbsS{T<~c#ab=jQ4Lbs8((ffsWdQw; z2HoEZ(NqN}z*8K2080gm%EZ2wqEBdJfTx$wJ_%2KD*g5N((wY%m^@-o-e=-Op(o_I z)PPU}d>dBa{`b7Ci;Z#rQ;2lBJw)|>#DO5%P9W}6`SXN!UPeJctZUL}EZohen8E3$ z)DkZa?)dE5mX165VUoz){8D7dfl&!FccPoQtA1v6OMErfZof+b{IFpF)Wq}@OzKm zgK>+;w8q;>dOB`qjbN*wQ$C?Zp0eW7c;cjIpkhMsODj^3BRC$k7reD%{Es=}6FCDS zfpt|_Gh^t!ilW&5`_-#MdQcvp6i>jaOzxS$^T(@P z&!EBt85-k1{5x%rb25u$(pqMoWhN!^w{}*2+;N16xS2hCNr&Zd<^g<%**jY)?|=K1 zf#gYyncvwb255#?Ztlk<@^AO&H>YmNk5xj%Y*ocDG%?X1t#_Q3UStAI00RYN`yE1! zw{a*>n@?nmYsl0^f`K_!i4+QJPk2VDb1-Fpf?T_pGB`i(iuXG)HGX3k+iLb@!_fme z^Qyworq?)X#~?>6;#cOsr__;PP!BRHb<=PE4W%#edRCt9>wV`TfNg$hJjhKopM98YdU~x_Fp?ow=8?X5F|6%H^ zq#D<}&9S#j5(+}0z=XU2EpNPiGZZtnB-M??;CXIMW%!=$m+eC&+2Hb?9sCRuZTyWeLaFgHWLw(KnP z=VM{FVLuVNAdNt&f0;|76^hjp8=4{hR5EoTdAm-FmcAlH5P^{_op*FIC5cn?RR?i@ zna1lQDTb{MR|^&c&gH=rxz--*mFDZWTw8)vsxm8t1IZ<~I3njAW|j5Cte4l1%xPIWLldA0cv8^*n^$Er8?; zzOR8#;?Ia)xb(-k{UmFOfTGr@v4{A8yW=P%vi4xFy^>lT~Is1K|1r8ghBj^@uG3q>=nxR=%Q6 z8pm1(_u_W*!K}!$b>qv=!q%fReJY%wrdd2IbFZAkZA*nxF$!z`8PNHdvS3R7~&?>n~fj_Z(yM<9I{!2L(r0?D%=kO#lf zJ_#r3*!Ll&B*!h3L4;$ofSooeVRM;?v8J^xxk%Nh)N|!pbLME8`}1pfxWNo5Zf`nWoZ@{+$$V z;>A^=+S>7UI^opYzfh$WXY$+niB{cnT1<*lMaTv!0i0dd)ct2Lkl46uB!QfK6O%UO2- zWvZ!bM8g9KA}NlhJZypDp1oGvoJez9H6)a5CzMuHyJA!2d>Y(dp#I|Z%q?9y?#M;& z049MYwSU>E3R+l|A#5GrSE5ElzLc6YJp+N}&s|k20Uu4A;O1pp1Fs7=`9bWEFoUW* zIjxd02SX}kKRTyW86HxjV5*?v9%bC6q(dgLU<=JRYgmPm;o{EBtza@XqjL zN}JrhE8@VY4Ct!na4i9~-e;yw&PE_?#;P2GJ!!*lLw99!Nu2UF5fCGI+K4wb6v(@z zc+_P^f$F=7>SOH_3KK!GpbivFN7KOg)#<-77P@&XlO)BkpvU1Kew=Mgfg)g3?ZgQ; ziBIc>NO)wWvli04gwnq(Au{Vi;iVVVX?}Qft)?2d2TY~=nYlSQVKh7f%6lIyKbE>V z6MVdi8LwN*;ZED3SoW=cjVr5Ympw=;fI!=UfIKaPbtn44&@3}6EKk05j3}ILqwNau zCW#p%Rg$s4k!zW!e1NFOu?So_q!jnhTApMVTQYUX*R+k#nQx0aIh$=?n! zE;zy0I5YPE`&YPtkUf^qaYlK@AS%9a;dTUv2^G4xxw+{h`Fue^0ib+oAShb`J~b1# znvx9PyvPgrrUsA~M@=+Mzy)x8wYv3u2>otPO+`(3e}-9ZxO#?G<441TyTr?5=8^Vh z7W&U=1p`hx|6@11mF*o=hrl@v^mLp zPN0Taki{K(eIn{5ca0E>-@s<6CDm&;&a3ETfnui3hd$)fu@QdW_U4i9~r@STU zAOOZe)sTX*h!|zh!JZ?@(9kmcCqfu^^|dRw z6#`J!Ex~w~Zo`Fq+?5h##?DR^{wnvJq2SL;sI@BDm1W{TQcpkHvX#bwg|qTx38C?D zqu{2vLMxdZtx{e{s5;R6N-NRYA65s)6|2IDsd*N_6E%W~0QQ_E?t4nOmJ=KSV8;0wi*Rm@gTxQ_2!+aZpNi6==c4M7m8w4D>TnOJkONi-=#|$<5eP! z{58n?rpRKX0ZGPHIzmTB`-o)Yu3XnJ)^xLL(KY&pmvh7kdW9bfuFs8b*&d3X(}HNF z*6VelZ4bC%u;?o}UO(`*KAwE6;L(^VrnD2=E>il7q`x1w8BweVk*r(N^8(=X1$4w| z8l}6TIeP`X_x9s(tWN9{p2WO^^_n6{tXBh*5sd`T=5Q$?Z)yDrAL`tslFh5soJQmN{ww_mB3B&t$ zq$o;D6qvYjOJD|v-8bPRCR%052AN2^F(xC8ybjP|Nn=7cOyL{pGYNflX83+4Io(vU zy3A#sY{p}6_m7Lcybdg;9;kK_&E`>853j_=6wAQfXz9O&^m7px9c;7lncrxyezwlL zJ3eCUol<|c*YyNlRM5?}!l8!0%;IGEG<9rg&c!(q$TujVb_0z8+0+nKW)SvGPZCwy z!!~c%Cpq|9atdf}wl-He6S{i(dcOS;(tBNn_jEN27nwRYN-2iQIv8tZ9AI=V6O#F> z*8*a5;CeXW6C7tD9`<;5TdVGh*#dy%M_;InX7~o0O%u6-hJ8K&8Mir6Sty@QiUA3d zR)kSspY{P-%iwya8J^W2DS;TCA;}Q0x@Q?Ra{x$M;8y&6kF=9!Qs7AWMqfKkzQ+J5 z$VrL<2FAuKE#uVGmnY~Qvu=69IdeCzmm*^po<9f1T=pMT8Ls(LLTIX<+1;3J0>dX4 zzz-)gb;ip8h)ElI8~TTq!(v&9#C{Jt*|s8S^PW^M*U z@57JD&!<0--`6eKfX$4jY_6)vD&FR5q-I1k3?CEuZsM)P$*Q*w8;vE0H16G*S*>?o z>E)c)0ekrQIpY3m|B$BeFp}?vt#2aj#cuGM{Bkv_d?n3^_yJ+7$yAA=o5Vo`Cj*$5 zHjt7v@A?8kVm2=1mDSrFYup=i%(-HO9W=z9G!25dSl0wT#+)ZecnDnq1JidRYv|P} z=xwSJZec9CWv^`K+&LxZi+x{d>defNXB8i<@Gku8k|;O0;Iyvg&|#Bn>^9qL1QO1G zen6dzW%?<%)8?#)4Vw-MW#lgY!u^bzTZW$&(p`Z$dFH)PnXmPR|bY`MkD!k zxJW5<$B-dr)laA4_^{48W_&+0!OvuqJrgc$#!mgR={qKEj8%@WrP~IJbCYqZgkFaw z8cCS$%+3X8U_py+A{yA8o0dDH2=Zn( zNVpu4_6uXJi%xARL;t^5YV-`Hihp~f9TjPf6hD8;q;1J`dAi>xnM!?MFQHe|1Q~*w z%Yt2Dy3YU9y+w79+%dzl-#`N2FY9git$?2u437Z|V^80x7 z#_e4+ogJgdav(yF5)j%_a;T3c3mbV-P%**@Q%sjvh2I#S{4Q~Ox3o`Op9mtem8X+n z>sQ}!;v}i?t`2FTYP<}({a|uCu%zC_X5GaGuW^+D3Vu{UDDLga#R_hzwv8*W`PH7H z_H|3pFSMPJ(EX!PtF)@D(2N-XUlZi$JW|gt?cs(I8Pwtm9Az#n3iQ_1asB%-9bZ_P z3+7vD@z|t_clMj3Ww~x#wE3ZMO(HqH6Zar7c8bVGoQ zbkbSu-evg>~Uzi&4<;e6c(QKze0FA4dwKZG_y2QeA(2ni!Ew-oPl0zm>d-)bZLZ*Jj?8{-StS6PEUg$(T#RKWmg$qY~%S zcQ4zUDK@yQ^Z!j~{emTBezVYVB@7-}+2U(=EMn}jse;~NCOa0Z>TtGsBk=U=-g(8z z)c9{zj-9+ees2OMP8sZW@H~){j|YkO5&bL}(|hc>2h)w4uc+gSDcVPyMqF0GwBe-g zsPFy|qk0$9Hs5;JrWF|eVC#vpZTr3BP*QgIv);zkz{ zNaX&C1_+JgF>`T?Bu*!!CeX-6$^myGa0=OfKdZ-rUWaq?aH#EifRtkVVA* zJ6geIdCYX<`m5hk?K*SDZw>yR&hxdq-jtN|Q75KE-5sX4>E(WYc*S5%7aWZkJ16E%%ZxQl$m6Ul~ z_$Vno>{OYs0F}>YwuyuTI(KsWS3ovCL{%8dC5Z|GVLTXqv(g?k{WSX7Tf{ZBB|pm) zYqhG{(6}_?h?9Z^Yvyf>>;>!Gm#uS|5gGqC9W~y#e%Avl1(2>NOVG0^%U6KYRKypGi_sl5q!s<6YPt8KMCbwt^WqkDETN2wH&^3AB?Klp#MfhJe z-~ij>?3#uO+~ls5Unx@H744}%Jfr}!^=}{y*1IEau89N)R_4-X#>~I>3Bd*odyZg7 z8)Ii6L^iH900L(z>vyTEN{wczoT)hPT~+{7-+-WG8-rcInrLRXNpeO$Z>3L~ib3cERF$In~?fI<#~CzBccT4&egv*enXHzy<;* z21ter(C%KrmC$yp%51Q}I5)tscW9OeF;Oa4aJrz`Ce*re;~>BD#Iv@&#m{|0TpfZ2 zmMZB`Z-XDcma)bE3~*WMDC7gyMitJpChtonFH=9Ty8?e)CGx!y$$Ha~#oFZ}UE4;> zaQ@APfRYw#a-fbP?<@*&Py06N(gOs$Nq+|y_p=oB)7EM99$^6SpfuFef?nGZjIDWUnhDIh@6g6C{NJoTL__xVvr<^n zwyigY9txZ;iUnxDsKRZQ>29B#oRepTy3xuMe7wXQA{xcXJPpOis2H@wnZOpvA)Iac zxSykGdcCi3wKXVL`);y2%sYI2zJ_xSY(lUPLH5)T{0ZAUbGV3~ z_g-|W%v_UOc|OaV>F4x@J-Qm2A8<5xKEJj|QWANH_3xml(}1!)(&*rjG%8>CWovxG z3Ay(fuCeRvhbbd9%9u(v#_?e(cI%_lr**cF`-wu`%C~Hf{MgV>+*J)NT`7H{ZFAwb z?@F$8Nrl}reeF-V(2Fx%f-|ISeW}6MmqEluSJ75vU~_!w&!PC9@|=e(oaW=mq(uP!CwTUx`Pr$MzKZ4FyDjefZtH3f_Afogoh>DxY0fx5)g906a!+y&OV=bs_iOgVE9hU zRAYSCZs_c9PSm!T|Ad9UQR@+NgeWiU`t$?u{vTTZB!gs!eU)k@k|TML*)Ht10j&L> za|^GVdH^5djTkd^sf=0%=F{pF+Noq1%|LXpTir@W;J2?Tw{dRuH^hbmC&{YNIH5v67~+d(VL`TS~iV=lhdi&PF|Lf5oT` z8FNB^NNnSVhUfGOF%JQ-EH4nm!T9-L>g`_1-cxR8U?8aVFVcPBrA0t2!_S^$ML#q%((6f!uw^Sb!Y?(Zx0a zxCs6sp8w+P<4P!wmd5G18spI&U`R>-4z2sW_Ev3}M`_u^nhH9>rpiCLxqH;6)W-U> zc3u*i$W+F>^m1fg>qU`jD(<|7+G zf%8+qsO0$OMbFP;t*~&7`#e>OcK#nS7Tl;JC7-h%ea@D|DzY46^95riU>)h`sw6Z% zSR(_nKUZf0<;g?agO#OtW3R-Kd_#R&uv(1e&}e&VFH{pH7?@&lqb06~0I;Oatra^f z69C5`Vc|lP_TN=-IUW|*0w&e_GQhTGQ>c-}TH1y9EV?XhN)Pt zJnYT|`aD0WiV*4VH6^*fzXJC!5jQ78N#znCy8-n19dTXWoPE57Zqq~XpAIUv%Wa?x z;4R8=0yBeY)6z%`p=uxZ# z7QX}!5q)(1HwkP8ez82FT53FN(lG_|iz0sU?iOlCkMjN~ldipTvDE8zfr*X!pHeMM zO$_1j5wg5VZ)UCHizB-#S;>>O_O2AjJh1slAO`8!YY_)-`SWUz!y#?gMGJ23wg3;v zqZYU57+bUS4OZ5ga$|E<6qKilHH^|`1d!R5pT$&K^n)i}I*mJZf2#NM z?kJwEZfz|A|HsarO5FbEM^;>Ia!#j#zYxz?G`dbQxUoRw4e_@vd~B$ldV}1f`ociI z)>+_TQ;iMzdaxcYx+Z@Cc#ztUp>t}DQI6jVqQ0HlcvpqfI3hpjvp)&N_W$+o(2`47 z`6Qu2LL?>VN5Ik9HMGF)dSQJp(6JR-lv9n5ykG3JY}^X57&-T~;48CHb3WoPI_{)< zBli0!dvInUn6@rq%miTM9<$T`@oqbc@hUUF{5)2xRA{Z-`pS*m&d4>ndcTv#A+?Vc z79CY=r65W6Rp=y=Pa?&bJ zU+*^d#eL;<#vii4h=Me`>Q6Mra$7ukS12W15 z<4aK5cY*PGApuFc`L<_;?jhb>lu8jPR@1@s0GUmO#iQznG=3nA^HIN8yl)c%pQKcx zO1Caiu{hk8%j#nRF_j1}Do(*Kc}s~E*o&Wy3p^_fnePm}CGe~w1Us@K=}|D`bl_?E ztiSlGwD*{0t8NC4uI%>yAF_A*wqVq9rSG@-jD8>s#zTJOG}dU2EHU-sEmbFEy4jgO z(>?^eG7wy_00e93y>7|m>EApft9N0tf; z@T|Jn_Qp|r3;5nAdy8lB^=GW^H{q6aPB2v}q72`(wvHb1;wQ@=s3nv|#?j__RhQ-0I9C+;;q>MWnTnO8e@N=m)qVc*^(#A>I+gyb%BDv^A&9e^hkNMOU2lV;XeAd3CDy(PPP@ znM5=#>S9BgDMBCT@w(6_|xeQh&fYQ-hBy@ zE+YAfa9U+I!pfcuHXOb?&76{DD zw9U)EgwtNkIR7Xf<0CJK)lH1jY2W|QELx~>o8m0#X5QaetDXwZ`3W8$pRFGP&*DSw z$H%^|7Brb;HASF7!qbqpp&>U^+*xdP&}8dn$!58O=Xl`nCm7qG5Bf;LpMG>%x| zLj0iGQVTWobB+hCTP)*JB1G%-ar<#s@9gy1l5qK4+Sw9c&djR_@4%@kBctNiA5;l` zOHU4+WG-0TVL|&y2iJ&d;Vnt-|9BpauHEm=rGk7oamV1kwt3j%sl+v}?n)z*ugoAt z8!&$_ZiYv5whcRO7 zW{m`Lb4^EY9O+zWC&oVFE}@DITUfqD0KbXT^`*juJL_x%M&1odc z{xP`91{8N*S!d3G=CDKyAs^rn6=U<}_nqQplAz*qjjGLXQPdAAW$a1&x0CjjjNh_C z7>}O*<42{dB=U)SnIrT^s`>0!FrS^acEzIKyTnt5$m@Fr8@S9miL7Ya!PLbk97&!{ z6PDB&;)rg*4qIz^p^e33 ze9;ln5-@hPsQ4A&D0^>ERaaG}HL;K1dejaCq^7tINB)!jZs>fF}CqC8q`X zWEjWz@Vm#uF|4N_u?>`kk;5;>fRXOaJ{CIpd;!?rcRrl0+laOL$1{|98@0(c@y*Lm znwf13F}i9Ae{PQ1M%3FXz-ef}+I+W>fU%peevjzZ%T4rMvYklN>#T4ZF4uP~7sCSs zU0@FNd=ZVs39u!>AeV|qTnu28pV0a+c*N{j4lIxY($pPI+cbnq-yjtQ2zRiwmr1H@+h zHdJk$QY6^BveRzY?kmgfm{`bgE{`n=N3(D*k4-YJ`yU-0?Xg3=zoThDToUUpMVeU0 zaGWb`+v-+P6WMZZL3IfYH0MPNH7^O%n$Kpq4!zD2NmQ~;ixsa$BVO0z7jt0TI1Zb(rGw`(eDIXnfv~8Aj;nbTCm}-^Uv> zR*o)>QL8w7#>d+a2u(@&sp+&c)V{O-?qFQ0eBpER>b_mzeYcwqcloxGPoN$ zJb>!D3jAaPd0+UD2bH@o)31UpR{N48`JdR+689k?7druGD{0{XF6}-2n3dO`(mCnJ z;C0hJ0 zvXO_lSKESp#y$3=8rOI0w|#cAPe@Hsa7}>oe!MZF1JDg9&|iO{Z&WUfz0~W^mT|DV zYpcgypOI6M883Od!h9_Hv(b;7ArJik$OHm+vHQ^+-^D0b$u_a+x{5kPFuvkm6CxM; zKynOrnT0nX)-7_--4|8s-^uG28Vmz%87*#He?rHPjo+pza$(K_>)!<4k-0R7N3s(*rncmQb@K;>_4NTgCM7QVE>Uh&A2ke$$V*K^{amMRi|bZDfe zE3;EhrWQ@IQ)1d{R>+rGBjV}qMDS(G@!J*~@cou9ch82>3)w+l%I!pAXsPU}Iq}DE z*ips!Mc}c{R+`**K!!s~tDK>Qehd&j`q$h3IM*pLy?zCro){rq(exvqRX-QRTCChB zn`3SylGvryXaTEd2~^hi(w<8S4mG&!f9?`%L_UKd;5IMRnW(=vp6$e%nz9Z0^j5L0 zN*Hg~wJ#;Z!wn)2LpmD0A{ew{T^Ra(el7?XujO=%JOoWb)@}180v1NYvZI67?kPF| zP~}hrDdQE?ts6y8yqZnwLYkPbJ(9B2du%G;mf)Dd|A>X+W^}i@Z#W4ckL{}uH)e}{ z3K`gr?`I@(vWNt!Ovov7dgzW1u4quWc(@(1KzCLFhdqYjM9yLHddDWu@zKE^2&4NA zjE%l61Z4LR38%Y}wM8{f7SY8vA6`fCy>i*|QEc5kng@#bWpKT!Vn!G3lg^F{$@JQ$ z*^D_6E$qzq-3?l)w7@pLnQXHFMb!#qI0zuYm}xTd8P-2NymBiRkzCL7FH=Rkp7TAz zu3HmTFVAy6l)Q>9U>mVpuZh!AH(xtZU17^)_XoS)pM8vA+yU- z>w90Kz1h#_>LdA3fv>2TI zn+-yZ49T%r`F(t`#Z9Z>9mC%?J%JyIxstNliTX@euQi%YWr?^~GF9@}j2N~fEr6)J ze9;S0qo^wpK7^KMW(HhA{Ep4KgTNpVLN-at3c`I`%`4N8?Fkq#Qi`KfHvy zTsV2p@~VzLD(q~+8K&HpZKl9TGoL#n%5&vJ@sUV?y_t56uMeLnyLk=cz{2`3v%;AK zEt_c%n{6}F_+ci~lh@`wjD&(^LhKCcCCB-FjvYD~V(_uTO$XZH6#EtBzela4!V|yk z5$HJCU}~ike3#hSB)8hD=kwT}{DqFd$IfY$3$~3#x6c;fBN{+##HDr96GT4+VPI@= z@s&k!{1d?PPlU}i9g9%Ja+4M=l9b?4XSHYM{;ksSug)Eu&Iu~K8q8cRuCZ9Ni=&;z z<5ESYoLH|kF(65}=~ldH*+$$)B{rfIYFYWm6=B`4;tIKImYmdJdf0oHaZ3C6+a5l7 z^}~(SDcn6$EU-&FoaE}JZUx?hz5AJBH`;lhwQ3tWQ%QnoGsd=nZZVbZZy7~aJaZP) zwwqqEDk|hxF%ac|C?x^~n(g*I#y5!f$Xf|FE$D-GXftbQF!om#d+&>L+u4>PIz+oY zwQZH5|Ej1BX1?#M2(7j!vL&V7U;5u1w%A!v0DiE(TpyJ`2Jszj0O4hQz*H35eiy4~ENfF>$wW+ANF#}bE-i|W`Hh?RPTWD< zaEf|sD_3y+`KImJQj#s@v~rY0aW2Z;V-ZupQh!avIAzi z-}`J8y_+n*R04LP`1|^;fRE=Uw;SmZBQ6q-?2kImls3Vn#GfdD{ZhWzB|~icK z8iz61aC*3q@*}XFkHy%BZDcoY!;jdA1v0lbte(JU+!%+m#IP_S1l-2m-tl+);8*aa zC3@SP&e&8J28fr+czi_Atm1|Z?N>yA)lvE28*JC*&5Ewsw5+WlkS<3J6?H%k`H)YK znI~H$X|xuUz5vJ>YxwwE_BxO(%xHDF)+9Gb8;KF;7aFhVf|jM#{VL7hpq0_(SC_8i z88O@vyEh2Xpt1jvj1HM#CB7scW#KBKN=Ue>wa~*D^;^oNuh7QbpR-paX_n}Jsu43N z^FKr0L8G6n!5cbFaUZo;zMlMs@$kp-WU7{IDl(ZAw?gTjOH>cKAr=_nT;cF~h+%@e z(9sT1Z2%*;st@_bH7J(C9PYLIq(FFbINS8~01ix>f{x(hdPC#Ido#~nS?b-?i-Sy8 zgoc@Ans%)^gDvkLr3W;McCLkS4gM>#S#3$Z=@KLG^TTcCcb}{)_<+Qv z2TYQw>fK4KKdN z6PW@vxN3~g%@CST_XrnC;3aT@k&`0ZJ~P8q6sFGO(hHU+J&N&M#?(4)R`EI(JX(J8 zya2CipS6Mru4b{gR`q7FyMNK)SHVeI$w`TBr%|Wka`^Y9g{4&8)emVE)v9~eE+&%n zYF-3(;!iBID<3PUl`_|QE9s|Qawv!X*aYcD2*vSr3UbO8yFp5Hf z%Au#)`((6Xqp6C8q%-!HWcm$GMV;S;H-tY52ihI)LdAhp6>-JWSz0ZZDS-F{E1v!8o$3}qH8$e}_P&jPY%mrkqDvc2|lo0VAg zg88k&r|)J(oERCo4OQAWk2@G+83j@jLAK(Ufn!fRzBxp*YF5pE>g(rb30p5Wx};-E z_hIbcqtFuYSiwm0#UP&Co&9I1fE-(hrO(mJ{txfI!@Q^8D$cd!7#yD!8(2AZW@jd3 zesS;IK-Cn&G4gS!Jp}J_$9j@i*7QDM>65=}oXYBO7_hKJu)dZv){CU{-qfMcW#chU zaqQ!%v>M?peK#rE*RQqNZJED(OCff<^<#KY-1bb)-nzvt&Bu#em}iv;f{Mz>;eE1@ z&SFhDr~JDWdBo*6X8)w$)PJ7zE_32TP5rq0rO2jENy(An?MZm&0DO@J##OSNBg%U; z`IcKn@Cr35T0y>Bs6}5ur>+>-f|vGV4l6+bRbkr(eI33;{u?Svi^>z#l4b-^;|0@j zZmqlr%PH_LiOI#x$%eIkaIvrm zu$;E3Z}eT;_VT=6SV2?jar|!olL~_Aesu;ya$xH-%CSw}CX$=#BCngGU#+e^)?u1c z>m@zjB+sRfLJcY}4Jt>#9BsykS$~gOu(X zX3u1ECb9@)mTTOUDZ9@t-7Uw(!AG~r3Zg(d0WAsJd|GY_$@vyGk5P7hh}86UIkRs| zyu^54HYusRIJSfoJIo8W-sBeTPvqz^o_0N^qcO(Np}spCs95|7Dge)cMTV7CbCVFC ztmW~y3_0waTT>wO7*^zpZy@hUjw^Uwg zJ)In;850)kdGR~(@#>H0Ze~eDGXrpQj6v1H7xfq21sd5W4a27bg&F;SOwlYj8?cE! z(Hpd{_oU8-MaEss{r#MQqz8&Wn8ns!CuuA{=f4p1f87oIz1N8dX?g*+D`anzJo=Y)qb$qv7hVgXn}0O(>AV4y~UaV1NFAv z)1_ih>Ri}nx9Od@nyZ_~sG?f^YLw*gGn&vc~UX_|&WFX{a)XyanIo(Qtg+0pE$``oe!$&d;+`#Ny$|wk> zx*khB#P9fJ(Yz5kznvEBVJ&DAYV&7nG;WU2p77STxv{8@F*X?%76aDrIc%RL0z!po z(0Yx-ujVSG*SY&XSkb`09=+7HR48969~4;I zdG0rO@3p06=h?z;DoHzZPMPWzWOGbzpe}c9RIBBi(RA!`cxfLLW#H70BCv#%Z?(%w zz!t8j7qotjTm0M#OS0OZ^b33H$$tNSgWmn{KwR+FX0RHtu?`K-OYdCRX)$uTuAg^! zd!0`>E{$8YS)Lu&4-wb$c!UuS z(r!Yy;~Wy)!rPQDkJ?j8+RNoeoRr&gkYVblyoE5EF-i@mJVVi5KT+sK<$MpIyqJ?I z-(kq|41DqK><;T|^0^>FP@c21Irm5B!wE2C7#dGZ)+8K{ab4;I?&T1#_Vkz&NU`#6 zKrC__GiG^e9HkErNd0jQiyQ5+eM2Jfg}+_9ir2(?f4y?C_{Hl}-q*=5hV1{GHDZI8 z1k3b)sTs3>Teol;TPAeUI@Nn|y#Bg11&T%c*KuY^&y{53kRk5l9 zt!U3|)4=Aa95a2)F!X!rE$P;TrvVw=uyBcwo+NtjwA$k6!)$UsKvilpsB-5Qx#N;l zy!N8a!KzwfT#kcbs`kKOVsanp;QcTe)AJ_WhN+nS@i;RP6>$LO`)nof(BTZJztcgNx-F!@Sf8;)$S&KnmR{1us-M-k*Y9K!tD||Pwle}`g-@YF+hE8*i0*zf4R<1lT$DD(7D|jg}mPZjp>6rQ6EK;W_zyO zs|Y`3zwRW{dpqAMdGOQVA!_yN0X0R_jlA?}sa-q`J!A9E}R|=k*`l zz~M|CS~a-_zAoT=8c$kmnYAZpKf2z6cV0hTVVhdzxS!Jd$8(6Zw1kJ~ynHhF`00Km zbG?D40y;gma3O~KZE8;K6uU5IZlz`c@?COSrucWs#<(qwwpfnLy$-`bn(Bod2Z!Ro zI`zk%Z}NNg7Q1?YQ(aN;@#Fp|Pk9?mU@_0z6^014b}k<6JQc5%-!X0n{WiEI6s1>0riIR5$DPJ^Qv)C9M%D!(@Z1NUW$*&~71R2C9pJR>^ z@9QIFWZk$vm01USZ|W*>r%o8KD2!3}XjYAL3txVwt;#8S`*MmfSt0OfIqbZ*L$j{k zC?`zO!Rgn>7N!agbv!1|V$oh6(cWL+V<@qd0PE(g_XrxR_pVR;0u{Hz6q$c?SR8h^ z^D;J&n!TOMBgSFvuSb;&_ya9LZZOk-^;|)2JU!WDe%+myEcNE+w!r$RR_y$6@$h(_ zPVq00kSt+-yft|~768|$;Tt)Wp6anz`181J)SNEFX0FHKjkxX&0zu^1bkdAZM8QAp z#=#mz#9Dp6nJX(zz0)+V!421$1~12H&to^H_d^`vC9x5I7L^8bGz7nU&Pd z0c0-{K~Pp(%2+@v6bGh%d=$x-lw;A>w)fG~=u1hcjjSh!?OQE5hXz8%Tpq!zZmSLA zU7MJY@bC(XTIq>a>8pZrW+0?aB>5evQKRNerv(LJ^hbvG8RrTAe%aL$I5WwnDYk?$ z4HRvrmbV`B^P3>UZ1Z`sVhdzkHO!3(MFn+o&vp$M1Dii=&*&}YsD8A?Sj9ZuI{R)s z2K8oR$}GP>n`lfeTUC7^p<%z9dbh&$TJ;26SJ87hP%Ve20Kz4TthE5iq6c!`rcgj% zCJ*%#fyiuhIT$xTxCoZl+fiC#zzXON_c};(#k3cNM;3?gWn*pjb{8^8hW{y69a z{^d6z*o*euhkGAa9BvkvVTwAbDkf&2s(u&5U7wgntW4jA+q`g2-ucYJi2L_B9ehjb zbGy9C0r(=l1wR_1$>e{rr#im>8QpBy>DGpHs}hjlVXc3Ckj-=}clF@rYlU3*J{|40 zMD{iM{;4BmMIr$NVFwD}5-dH9D(yXJ2D~J;vEHO@>&eRpc$V2h$~$S-0$JYMutK^e z+N_NB>GnVLdDoT7TjqGWsvnLdrlsRmaYp)TwF(JR!t@J8*}5eE`qdsd)m;2879QC) zGnp%#vWSj?PZ}z2%q&Qk+Mtk6XbVqZ1$wbeGMy_*d@Si|Lkmu#)FxaE9-38nSz77L zwX#*Qcy$GxJuzIo*0K5pj`sRN-(wfeE$=~mKZja!8rG`kTBlcW5x+AO4@-)+8nAx} zda9F}7Ai*S#c?Nt$Xp4}_&iwrME4{-QNaDg!Ev``Tc93s8sBkrk8!N6yQ_u5`PTa6 z#8-pjYo8Sycw|eJW^zg&JMBb(Bn=4Z2hSC799WLY4TC-_%>=^BXaQx6Ul@1F<6+0n z5$&A-U+SQIn*COtVJP2>9%*iDrsdg(NYt~jn$-jJ*3oFR}5T&cO( zV79V^q=%dZk3ma(Jl}KCbuY{RCdDX!XcJo86f>Iwx3JGZDINUO3^El_K2nE*_=`(# zHCUYR*0rtc`1Re+oJXGa${eJ)VhRcmsb;XQT0PGbe3serPtbs?C${Ljqv&L;y%k`I z@_d=1|6VvqiL=ezXrwwgC)ptwZtMKS$pflhu|8E|B=V7-%0_*hFDGh=1d14~-8mzU#mf)V zS$S(!###GyDDLz0{`SC@yos}YPL4ylTtV(Z!qLd+@Hf1AwNGtUng>tx+SpVM)<$=s ziqo>IBE%~q)!R<99?+c`|D|{_Z`~7m#vh)pi$Q%95lq_R#DA*9eySNb#WQ<9^CR;~ zhe2kKL%w^8V0cxv_;a>nYWUU;CWYT&KAx6p3tnD2*5`~Goi0++}^ zo<|r^fISz&WQZu7F=|1r@z0SzUxPAMxs5yn<>pcUJPm-s@?jVkwV>YU;9T7Hxe6*K9i4(k}XtUl!F)c?_bxo^ttX)4TWOm}Aqo zoqnBr#fQZnzHuw>J)JlmN!tWCFF0&#fy>i@|(gg~f z_m=eA*DOix7=uJDN0zxT*&p1_H5M&Z2H)Mw$@GJ}rSwZAh1qy!-o*5l=&Htv{c`kN zc0Vc!3)i!caohHowmRCLw$;rhn}TjE>BrU-%~D{@>*HWWJQXVv?N)0ujsE8AXjci$ zZ_m+ywJB(s#nXujPgBwj=C{_0BlZSkLlI${p70LV_ymj8$y*kX3=fRmW8zweTdiMN zs=ieje-5=#W>l0JK3^$*F;0sz5WRg&IPEfx=S=c<+n=e7b-gcP&fXrSFzxztrz#af z!OyM5Bdo_)IM||fB73|+@mf<)hML)+`m>VK+x24SSU$5y6=TP-!~^MBv44g~cxApi zZ`IkXPT83i8!Dk=v&S~3$C2_Qac?FJpw|p_oKTBgat`7t+$gh=;xCePdAXv){GvxO zo=GnSr0l0fz?4r?0wo2kp zk7KeFPo2dezE(r`mB2vc|7d&9uqK`_Y&eLD9l-*K5T%Gx1%I>v!2%*6C^eMO1*A*p zC4!yG6UeEjW-49%0cV>5X_RN_x_qop* z&*_YWg;%28$Ij}aCd>GV!>`nRg%{$oC z#D9*9y8@vUEI9^P37*AWV|#_Ey~7c|15rO2leQZaG`~eTa-eaZ+DS0C-IF8n2sy7J zOS?ivYkgX8%~VXH+7t=e>HDRfiiJ@Eb~V%g`FCR`tFpCWhF(+r(G>l=j@!^2{{3>U z^6J|#9n5Eu?hL^Yd@!72&|k_G9%0v4Xse9VkNIK|HY%7x5(E~>ytsHB>s+xw#wReU za9}f(|Ca!h$J1M01HZ!;bH;czPt0-1dj8zq+^m(qPY&NO1?wxb3_TiBQo&m?Az?Mb zX@9b7ZeHqLY3+G($8T#vetjg6EdkJCad$OdeHk^O=cO#;Xyr3cSm~!LJpSMzlXD7%?Fti_9|>8FbQwhdtFI zUUIpOCJD#2AsYpZ&Bk~7%dbdt)eI^T>WqwsR&rjfw0;<43tBt+-H*EI$2bZdwjESb zV5^VXe|j?0*LJ-PARgI`Z=gNgo`dteFYLPWIW!ZlnSPYrR6T8Bs01NCc4S#&IGn#6 z2%Ef9W9K@8V$!6Ujc>nibf~rMYwHLSL4KQlpDAOTsj9zIQ;Ksl6*Z71XXhwsaWiX9 zPirGiwLh#YQG6$icT29tC&bF+gkT01x@(LV3ylcsWxD;&`=!}Y6}hfpgAs{ikUss$ zVGsUMk5&z)l(b1{jFWFqe0v~t{cAVA@Ju4|jqVh4aD*59{GYSml%EnuPg`9DF>Y9c z^<&9jk6VCkE0*eqJY1xYlyH0FUG3Wv-~a5#YF)zkZNvO*pfwXcFDbVJiW#X-8iXXB z&oGl%dshdo08P=b=)jtbnw)aav-mqA$O|m{O!``U*`awAe8b(;+6A5b|7v|!TlSkZ zZsn9nLZT2RMmR+PUwS5#?fZ2Ng-C%y@c`VJCBC~5l z3e~u<4^BhMk~rth_75?bFGdV^fA`*P;L&N15YYJX%cTqX0mv2{J#H|D)pU%Wt9Dml zqi@OeMYR1AO8@iBYFjKIrt9ZhglQwC%%D+Zp;W+Ss~WCD%?^O!TJ^1s27UtQgZ4by z%^q*lMT&~E!Buauy7cM5K3l)scpQ0KtqA$)3YjUgUxt?j_VOOPH&GA6z{m+0DqGjc z8U>7F-;mGLmL5QtAEneoO%7WyZ^UnX?Y^VuOwot|f+`Qc7?ptapn(s5V*beaLi8s$$${)$L zYBT?K*Y)uT`hpb8Z(CzjD;_4?d#k*5;8wY7n&)1AL6~^E7#)D(N>w`Rh!C*t;FHBFEz6&*gv{lV)|j z7zuQB0yCHPlq0R;#*|A&|AZ+y*q>g%n|JI91rqZ+jIi%NtR!%V@y>NJJzdUH{ZJk< zTactkWXCT*bZKIh6vS@~5YAy{}yLo*rcNoK{qzL|NB=)pSef zF_DV&zU2{s3QB0&G}^lO{@hEvxZSu75U?xrYq6?~P|q`{v<>k;8vAo1pjiT=7BdtX z$_5eS>T;>3Y;tsNV0~gKaBn_gx7w`A>d-B`k0l+Kpl;k^Ha;-Bg+zlq}nJ z6;!KzI%j*A9THO_d6M$-5CZ(^L#-=ePn?#RFix8E{GGfvlpNn@jqVh>=7v6Ah7cCc z`SlG`WD0@3RFM|b@7jaIRGm76{v;v@L3C|h5SUfY&GM);L9IJ@t!S3T%BKst28?jS z)WBoNsA=t~n8i@LF!W{DuR>k07{mTRL_+h4%|wE}HlW#caM=}Jz~BMgSHVO3Q|_6H z>o#EKg0N3npDCs1Fyp&m^Ib`k^wkYU&V>Iq@zlFvRplU1(^>EYJo?_B3gZNaGfmsrgJYa=DAhHOl-VbYDjnQ2@#l`M@shgTwGijb{>8-?+T&kG+uRa zImJ*2Zu4{PS4{$3XP-#?5Te-_`rCWI){;X&RcP}giiPX-a2eC7jYLHj7o>GhpE2a4vm(jwKxSoRxD03V>9q>aN!p!Ed-3HB$SQ&kbX z7r#21*%yDfchVx>2xp1O0ARU{bnJzbGS_T3jb#2!fI{9!%p3&++3^Plp~4y zZOQK|NinDIrRPQQUN?$5LqLh?6zSS|y#Dd&Q5<4)sI*n5FkIY01a~RxGbif&jpmMp zjl}%QfTH;dGkndGrN|w>RX)Ez`caI@$TwlZO=Er^u%%DA5#j)1LaZT;*U4=Im>ZVB z&8|;*if#xN8VS_G@%vu6-?&hLa7al)nQUjn;_{IMJ8m=ZzKYX4yXU|SZB1OBqG(y8 zc2A_^jyeE16{6@40N>}EC;a!6M2GgSMkYz6+``T;fyXzYE=0_%upl`~_~E95a$3~t zz-1VudaJ80WU{qRQUvBTp2}^k6_GPrTU*sn-bLzP$`46_8|`qO=BzE$~gBthH+boaO)#Cs@h~zlb zcHPK<(ri$`C}&RA@Uia+w}>CR_2sI3`DP+ou8aeSH<(d#@{Sw=Y}!YIN}ge{F&a<< zv_hx@7q@iTw%adjd}HkmW!&FUm0EsRbH;7)nbcans>q(dG_`syAfy?w_k3DeZyJ6+ zXIXBj8t!x1e!AlvCziC>h0Y5=giLoWj2{SkMPy{;3?P?mHk6-$pKHLvP>a$mb2J|C+Rjyd zL?Qbws>>7pTk8}jC8+K5l`g3>6FNC6)N1mCook-}ak)0NVbW(zv)NbECCbh!;s3g| z`mLarHP_7b8KqFQL8&u&^{M+4jDCaFM7MkaVd2tN#rN47vU%B?k4l9WbkLvkbkdJw z&U6lNegBB?NE4S|rtV0XmYoh?ODwISBup6zeOu z10TXEve68oO5SVHutTfXGrK4vst!+hF%&4bVAbW%5yf6@&MzD^PLh`vwIOa3<$}mx zm71a2s^qWlhN1kOXLRzeo|h}LoWQnSMb7p($5_sEQFpsK_~f^pI4QRiM*@`#7)c+w z%JOp3o=kH&VjNHoP2y!OPeUEB4QNdZ`w(JPnQN&0--%7K41Zrg?n=7*K%SxX`0_hR zL7vHCA>U}e>&BW^NF(_7nMj5h5`G~{5sh|)y1HrQl~C04B!}6WZ+$5_r8KshUS2(L z;}76)o?fuU&y#mL(K=?i47_h+Z&qO{8 z!9n2`@#hk+X$JH-W0B;GKN0k_bIM>pOW*$W?fB6_?iT)e4~Vx` zN_BkJ+qthkuQ)e$Ejes>tz`kzwl)#b<5aiu06Kx zHu`ofPfca})KnVHGZxu8B=is%H$`FXcHpmtc}d8$P=_H9g;+5eb_WPxC~wbySt_uT z?|YuCQJ!X1Q}cpi@v+x8zeJ)bNL*^Xnl!9;{jB*v>#3B06*&21)S&M3uI`av5u>&F z6@MbW#71F!~zp3g!A7n`1TA>8M#! z)}lkUpA_bZ1)P+VDtIrVyP?bR_61L4M#w2f$_4U+DQp`7WxIbUb$w zJ@XG7ayz!}?Ald~-dfL;cMz`l{o4Ci$u5_U<%Xp~46(;xC~WkG0;JgV+kGQ}*H@zA z#ba}rQ(wEeCR`Q|4O<;|#t~*_<*8oY3U=SgqT236sXq`vyO-GyX%>a$vQwHb2O`s= zZZFkC69!JcdyJ!Q{a}nUnOgHKc_tMg{X@8Z_eEY?Gzyv_z`^MDS5-XqK*aof*ARJ4 z`SJHPlXFtxdyZxz(U$LnK(VR&2Dl98QL`j~uyd~mmbq{TbJI&Oejmk@& zpOeW!sUodonE+pA-el3JPLA&9Wa!EpX~fnG&sUIVWHZJW7%;;4%_AMOGXtNIs9+BK z7UbfM8#mfxs)$!OC_hEX;cp4tc2?k_kAs0~xU#cVIV67Xk`1F7qD(C+1VIAKP%Hd6 zlCH`Q4^4Z8Jc_&UM7pL3KEis@NaJ?;y6I_)cpcm=i};{9nI2dBI}_LoCV269`8Pd> zF5U0nW$D6&-IdP??V##9b~jI(Y`xwNIZdr&ch)?cVuBr>Y>iPHVQF0D>FgHm%B}u=afvc&!N}K@ z$rHx&nN3X%*URVYwAumO1_SH`UafpbrZg;92pE&ajB-^I>V;wUcgept2WPqqDLw)& zKw7`}Nt8_I?mC~mI0GM_QY-YxE!l;zdxb*_sZ%Nqy+V1NdmB5QC8Hji`J|n=e_C;$ z)n5QR;huj8R;7n=vRC!*_L=OJiiec&kIm|&cbi2ob$j1{q@VgsARt(XwT5DF!zav9 z)5n>6Y%FW@ll|Nsq-PdeB8;Wua)P@gxna}BIj0fP?tRAwI5}pg7q*id=cL-^^}JLA z=dB>;*2k0vUiQkawI{u;RSnt?0R#T4DHR5Unxdnr8~+_X5OLUdU~Vvw*aIzE9_)XM z}5JcDK$@kUES9xwVOUO%}n2#f*I_=${UMXxNAWn z&wbEY9+0xLr3YZtLtM;*^Fo_Op~8n#!E@{e%WSW%b3+Ip;`+FK&C7wZsiGAiRWhtY zW_$&;9RYir`h7V0-iTrSNY!>T_)cH?CO;Lqd-tfiQnQW$jO9DlU}*gL*CL+BC2a&1 zoFhis`i*X>*sGD$78?i_;BEqFn}Whob?*|!pd!ZEBNCr_;3=1riOIoEY;ey;+9w58 z=?nm<1Ni#-N*JTf!9#Zm+?MuQOb8^Tlh50goT!L9;QQ3>x7CIM@HGBL$COI%{E?t5 zBacJjJ@&*+#ofk+q?q94qrDKiU)7{)2)ggDeZBsh?c-q3%?#+129gtI`ZD18VF?UN z$!_;)7<6BE{fa8f?(fsZP_tKmnNJTseVzkfOc`=#G5Pl9nc1*wc<;}bOA@|mQsmFA zrER5JIAM%Chd>xA`T_1>{atsG4@kR4{#5U>N!1#7OJ5e&8m4&UdiHu_+Lj|e*dmfk zf&oMpRUuD+NB*EsD$M7$Y~&4*(H=EzzKe$VTqkgbALV_toh)VcH*2q&_Lr){jxCD% z4(mu|w{tdJV&@P>b)xt#HeB@DR~uyt(Zgs$^2_Jh@wZ7Y2dYBS%VpzVIOxkl7N1fQ zj;kD-_Lih;Eq$c>RsjG%opZCdPo1i~*gXP~^0FXm|yXxwY>|L|U+Ezud|>k~d0 zXe>sah+-S^&`-pko*(S?Py!=MwtogfpK$^~I{wH{UrWN85Pl{O==rMFAjTyvs_qlDjDxgYyYuufiLo;kM)g!eV9{Ue9g%iFq+ zt~Rnp<#6L$!!Rs&Zt*jY%oy`fp_RTkRJ4gaknRS%9q8w2vc(90R}ba6?#;@~Eh7NzZ;OW(rCWl3L3H)=E->AK=qA+$(u@^f05`KLu2tPr>-Jyb zUWnu|du+RJnJ5x|#lo=rj`9c6Qw#e=9b9)x@L$8pdNSEXE;j#Ya3j0OWkyWt_)}%H zg=RGg>(c@FsGtYa*q*GHQF6y(76QU?Czt(j=PQ;QMgv;%mE zVq<(6Q05-t^VRZ86$5r_m)|S0{CE#vsbK*0emQm{&wYv8P!NDf9l`o3$T`7#xN+>- zoRpSv;D>&lnkWhpK(Sg!eY$EomL43p1~V73m$Y8G5F;=y@`r7N$J{hiDE*bgWOPHi6fXWl321HS80+u zZzZ14@Z{Yyd+zG6Lt>Y|VvU)J)Js8SCuX~;J1^_NV6bGYvA50jIwstC80@!U@QTU}t&s%-7Df|4N3&q)s1 z%lgrwzdz?4g(>5_zg``Djgq@WFUZyrEqTO#zUmQ&0BL108xhW{JzgA`z%r0o69tUZ)!3hb z$Y;hJRe-aTSha0;Iy<^B@5|)l_+-M?XRm$CEFjvCE0IU<&%6S;aA0nj+uKQP#%H+H z0xYBXm-ctgQqVoy^oR7{PFXt5*-|W{GJ^f4A3rm$Di#c6JA9Dy@S=~fESh8v$i7%%?_9P^O6qQOUdWek0e}u22LfV1t znruZ%FS`8_cYRy|rexJVED=meXU8y{yLuZCPRa|wdB(c*pxg?~FIi?O-Xsx=(y5a| z3qd;lHZ4$c{kvTQwb&$N@1T~OCHPO3_|wS~iF%t^;!R(&_DTo~cZ&l~>@7+eIV$1; z{x==3p7+(U-W9?HW2%DOJ|oH|&?DJCyW`e;{LWi@Sx${eu_7iyU-?t7YjzCGxKB zWvI~HL+vDVmY(6< zC$)G9uM4|?U;@h=HuBe=rPTewj4NRd`p@m-)p$I2<}>2~;G^js`TE#MV1tSaU(f~T zjvi5qj}^EtS1jWFh~+gkYQ!5gB)5kP^i@0uAT{j;r_&fb=sf8X=jc=ox0G&j0J z7FhRD0En>FcijTKVf|H?>9iTa;89Km^RwZXk0mP3hwtpU;w}7y zijRtC6q`Bh1QIF6d4=-4*Y*H{h2i_^i|}z+~`h4tzBi-d#J?pw;RgriVeLFVu1USNo+e z`_r?6imy-AF>9NV(M7_jHpFS=?x@xAlg4_!i+?WpS6kHScF8E9cNqrJBxq+DSa-YdcyJCRVh;_fK4kYzO59VX9=D9#;M}* zt<2Ka2T^RG^ugz+^8-v~0wQ>OIZ$5K-&94C{A+j5!Iy#B#t77;DfuOfqf4nWauPj? z(k$N_SxoHrC*}83FHvp-7FAlgBvOs<(vkEg>ve5_ij|t9v`p^|_|$<(NeUDLBn)7l zUCOqW;U#_4%cpcSC&WRX(MT4J9oQo9h5qyi|Lmx0)vnlj7r~#=)17wej@K_Bg>%Z( z(87uQ1udm=Ijxq$12L2~FHEZ&u=Nfi)=xJ*o9!2i3Vn7keBk&s5m*O@M!y86&sr1B z-Is*5GsIaZIKSH-orS_&!g(K9gLN^?FOROYiZdZxDo^n2Ltp&%$83}t2G&EZriG6I z%%KITeB4Kr#gvr>GE)`_>s!G=$)d$JJsISs`ZJwSU&Mzejt?ZiY&Df-SbVg}o{TC~ zyRu;v3qge&TK@wMOc-2!Uw+vhP+kq3;!_k&-ksw6V2mA&xGlgHp$#!c%LKju=AL52 zkIgmPdv2uS`1%n?rtD%uD(?-tct=+Kk}0I;MvjR?lJ~+a+CYDU{&ql7nC?`DT(Lq7 ze}V^S3Gd`sGu{6m<)_fYbcW|(?}nw+p~09fw#xBA_jXYnO+9=D)P&$E%5w*&0n;=W+<-&m(mAEp~)a zrL~jEGl4v-sqCo6nyNF&tu1as-i!7;{D=TCS2+$P$AuEY9of>}Xmz=V2~|q=zkpm! zIqh*F1E1#S=e_-KVhQA5^MA^9pJr!;(Das}BgXPB`Rh*M!IE$X@Y(k}PZs7`a>S0j zWiftU<~U}Hx+-n{j{M2SrP4=6|PvxEm8ML zusC3=n_op)B|Mj09G63IuxO7$+sK@&%2+re%3~$pPGQqx>K(Mc>?@2Zy=@o&fJMSk z&2?!}2ER7AUpwmIw~O<$-`_6sL+uAdWwgYk@nYyGFF1Zg8-V{nGp?9aWV;^u{hiLG ztwU18jMDtB3Hqn0Ece&oWj}=SKtvUJwXK83uO22d)p$ffmmXX}-4lCe@$>@5Xi+bP zez~Li%mayk{q1`{_>5M@uJAH7dAt4iT2*F(=9s5ISD}`X!LtR;%SgjKf=Z&DlKZk3 zCjD)3W`Yi{ML8jf=sP83e$P?A*^bcv7SO({5uGKZtisN*d%76GspzaM6{*g=rLM1& zt_jj^vTJz8YU-ZV(s1G3otaOHnP;MrQht1|8r_#|zfpXGwPgBEG0hlh$#`ikE_g{^u;?2m$U#&-a8K*z&CzC<38MD2K=eR1eo7r zTRZ!;n(Koe%&3e&*957uv-baFzeldNL1EV@o<8i!*mV!|4VV1^Ah^JvciK&9yL`VI3*SBh^99%?SOhjM6R` zJXjt{(_+NFJ_xi5qlSG#vQ{A*!tOD-lx##cRK*f~>;;^rc(X}7(p=!Bs*C!}h`5rU z9;N@#PdknM=H{RV>BTXP@b_Lup_m<)Qhy)#e?g^<5eN*NOqT=P-LthvQIfJN@$06z$E{2ETQzt($E|x$nRR8&Ps4V=XP@N>8f~13}y3|Gn?t0Mz}z9qY=ift8A^9_aafe zT5c3|pPkM;3!U!S&(=vcfHp7)Zks}F$Ix4v$L(>zrrfQ;=BLjpx2xbq$`e0EegcT! z@$uM~TB_u5#X%*Bb@JE5X;4*hSUX^+;3Ps&cA*Xu9I?~bg{9&S2KlWYiq>HC1os{s z%f00!fApuX{h}FBlAa`Ua?@yXyS_L1p9SPNX|f;G8!4cvN)#V}TXf2hWS_V`YE-{GvAZTz%kkwV$#$h^x9f=5 zC!En?s9SzqLaMifjDmGL@Tx*>LSvF-;XxfQEeQKOe|7myn2k}#MYKv+Zm`BfBWz@j zjt07@MMnn%<*+v67!k{0n0~l8m^k>DMdEVy>Nr4>{RFJu$B8q+72RT+n~+elhOhM_ zNA;H-+-3XEjW=!*_V*|q1CG_A_TWke%FnZe2Rc;Ln0qFF5NQWMiA=!~9M+s1BkG#R zDC&)yMk}sw#4;1Sv-PXo^8nuN@2A6otlu2K##P0klFWm8{pfsUPbXzcXFcoQq`q4*e90S zt;U%Z99Z(gg$v4lKFkJ;=Yo*EjDE`HllMF6UQB+F^roP-C@=bR!U`BmD+t`OC<*Y0 zt2r$UXh(kEVhvzd4nKl!o5Yi^2NZ{8Ngj*Xqx@+Z4_m%*-F|DXUbd{ScjadX_|P%u zT0jbuX?l)ffWJq*DV= zgvT(s@5-LtB-HP>+k8ILSk}63Da{fTBQp!qyGs7b5{(p$dgzc11mjHlyWEdX#-v$9 ze{O^Ne#UGA8`+dIvK^s37nF26Q?%DDU8YR2Ftn?@{UFz(DwO<>COYg&cXX4HXyHAt z0iq^NXT&>-(QIlXp_X)lewN#W9@^S0CpulYoIAkNvM^6@x;WdiC5q3kY;ksYZMy~G zwjuT6Cgr7>8RyT!;O5vb{K}oOh+=mNF~Ox%)Q^hY^y&{GKK&B<9x26w(P$&hbsr5n z*YMVlfG_Xz1&k%51oA|1Fs_xO0J$z-_Euf$=Hf|z2F?n+Ea2K08w%_#W>hX=sv7MT zz1b~mLBgr}Sj2zhh1rs6>+;Alim)cmVM^jJA!uL4c=Q77cJuXD$KF_o3AR)Kz0gr5 zj2+~V?w+=&ZbjzmNJ_;mdOm4?JxaYYEtQg>=-}$wzQ%7-bo-JK`7ut`E)=!6Ze;$s z1c(qm#sW7*V`i?*;uDTuE^R!P^xVSCIRmRPzdr(!4IB; zuXA{amGSZj!m;r9o+t8SvU}_3&jPZ*is;ODD03Obt?7#{5U;^QHk-Z2j^q<>Dtn*1 zAJFZ*`VX>OWcM4$-@TC6&dDCN`sRk{>1&iHPM8hdwWQ7J%ugjxgnEDULri=OS%_y~ z+#09DMIAyGEWLHnNk*=V?@z!)UuWjAA2Cv?zJzMlpPrF8suIifu9f4J3s}qeV@_{- z&7T5P@pBIAZB1iHtxa=VAFwo8lyXh*EF;aV{x>&m)e$E?gRUy`+{bc}GFz92aj)T8 z9|hc|RdmqEc;@oK@mjy+?bfrBdKAZA0(U%BrjwcQpo;Kd!wj5#iG!jpq^HUVNy^EZ ze2X;%QjAFh0caf!uYwfqzyzM@$Ka7Ai>K{_Gd+bRz0NG`{_If4sG;qQvlGLF+Y zyN(qT@5q2f(F`qWGy`kof6JNtJs2Zl#YwA6rIh>K(F)ACoQEud9`EBANh9doi;TP| z{=}q&ZG}|bP@3CCAXT%Skc);h$@}xk!68cNH6cny{1fTc zZR)qIj|#!!4P-87WPcKZM^Edb$``gHj3t!bbaI4rPz{G#pV>SCvL*?a5Vi`lAO6

    fz_alJukV)7IKPz=A}lt5+-~bX;WJIrv-gXi_ru-8a0~{DOKZ1p z(5s$Ar@>#}5RNNz!b4s5HY7_dz(eK$7Un@YF|X(229Jr)nrz1U%m?v(<|~soLp6s3 zVaY(Wxp_#GYCFTDnggD3+RCWN1oloxlSI%$)gZ^t`Od$(Z=J~gQFuz1#N;&Yn~B-w zj;-R>bx`d0)yRF9{54g@cfJB)++x|#J(c~w`D?aO=i|oOS~SXfq|yz1$79r4sVdU| z^3tvdsVA@3&6)Fc^!%N3{)?$Q>K5RdAtmiJEIkII3FAxhO!4Z=F}6$^E9Qg$uy{k@ zwz(G0*>ufDVsik($dqe$^Fx=-8Pftzw9;Yx`geKCqi%EMt4YXPp1Ex&-}3xXwlXfZ zY`YAEuvd217&^4DCKgQ$^zRI-G`8u)@aSbD1l?zfqq>O=dIo(_@g1`QS-_^?n7-tB zl{9qLWW?xP$18X3OV2YVZLOT67pvYToA}jl09@|==30wFDn~p*Ja?j)anrcrM)}Yw z?S>0wt5P6z6%k_BEmwtnMi>fgBiat*?yn=)3H8xqwfMr0yh&K~pG!1@?#oV~Tqyba z2BAK=)OZw;3OJEi1ODJ7E{Fmo5Wx?w_QTzUK;8ki<=u&x(}!?=Akn{)bF+d6B8nhk zW;tCNFTtcpL;W?B?1T`T+R;@?tA=Xyc2PhTiCG{~nzXfG5Y15cOCfP9w^8k(H}A1N z4SaO650I>K2FP6|4lE>Y3RY`o-%Ecs%bA93kaJs=9u6+!xjBHIMEY!grtaj643vf0 zp9BJOz9Ji>9tuFnp$^$U24etQ;B)QvNUi7qe62BQseT>cZ2^petTb0m@4dMX4sKWJ zx>p9Rm~my^$brW=d+H%MAEge`zW;LNLb(DKw{peMHiJT{#lyG130z>AXzZwLgSjxz36k(aZyjuMPMP_KHsBjE$vZ2xOY^usy?t~B;pyrWoqiATduj= z60r*5c-*o^MsAIi8U`Is@F8NXyuF73i@9NSbH?zy{{F+p%WkI!1J|v=?vbJT&nPij z%qRMT7CrAy>j1JxMT`U*UjZUHgOG2U%7R^bGA4af?&7~O!0?ty*fz1$QVE!`SGw2k z3hqj$>Vs!sG>kXwo>|oz^mWv<$}mlxed27Ah#dD|mSyh_Mp6D}jkcbAnv|s=yH@<^ z>AuOV=KXBt4-Kqqz)l8nUA|TUnYp^RoOPrpqE!F_UUhz)iRmKdtTOSA>wM|BOwI7B zfe~DAama6RdkP-&c6;gg_lz)=5;grI9{~@Ze10t$_f};!=4mG>mm4L|LQyx2i0)|a zOOhFMNd`t4?sLfa%kVu$ZJz5h!kvxO+k=66Wj8mbDof65A^72qrg$vU%HF>Hmxnlk zyWDK43tHq2bU`fgq6+U!B14cxyifIe@JK6Zpcp~RaBxRL!s_MTqDfdaGHuF1l{4VJ zMSNOosr1cV3qu)5S=XL2f|sbRw3`L3{mmZaEMRsee)107C_mFFtE@Wq| zGpunkdo9Gz+D7J5Y?SJdBz?5oPU|}{2ka2t zanf9@Pq#APXCQrE_QN!VD|=XR%557m6EEz@uWWz#CVNBj5@Z&{`UaV$Xb!Gaq`XLc z{+?r`wNnT0cG?F&|JyA@ey>Mf9KYS^VLKAIC?aNKywC!zi+?bZQ9>xpL!+t^DU+`D z{1C@}4|k68eh;Dce+sXPlI&56bCTuReh@6b{e$tPDY}L{ypVBEz^V6fY#65VVe@^Q zU9@ic&3ImA+1Sk;a(U>UCWoNObUr2CVF|iXzOYISm9jW$`XrT=oxt} z87@>Ows>ADgLE}M2T!fROUk$}6;Sn~2mHC*sQ<|!3;~C3u!i(hlND3`yEvY!J)ymC zMJZ%par1KCU?~;g8w26wPjSQO$&W5PJTRI3`*W>b*xhN7c)ny`v0r?WabzZ$44W`x$uj3~B9%~2r=X4s(s{PN~Lx|IBipgcqZGcaBnV}~xiZ2K9-*EWI ztjF`UJK7(*L--P1BfJQ9CU(ZOJr6puXNIBgrY+z=Vv#Q2c~z4-=)3RGxG0G}@d)N@ z1&o1Rv3cXEJNtXiYe2eMF}i`mX>`*yavDb`_%-TKAzV+a@NIE-DRt!8m`fPEpK={^ivLEPyzKgdc9$W6--@EUf`v*&wMYTcwEnRW99VB95Pw0xXAe5Gg{0 zD0Tzws%ienTSh+>w~dR`SjyDyD&j6-Y#^OnuCfCjkenNq@QqcS8If@^OZe&Aeyi;VVt9U$g*$n%}h-?3@={gsz9a}?bFD*U?N=Dw~C=0XYs?4RQG+!ACB>sSw zoElNGDrB@&YnTI%EG$Ub*lXQE#EO_Wq98lZ*XmA-eERn78?PA{`{RLvZL9d%16{5> z>*D9Y!MARN?vt6S4f!XmLk+W3@~p?oJ(4jq zaUw!Y0MOMA{qsa^jxPDr)6ZhS_HmV7I2pX?e`GW7g0QmtOWj*KY9fmpUhnV1p|9Ur z#IwZ#SyDbC4y(@X>7V*_DKMB8s!9GNiELF0D+G1tvexqr*h)nI-o zw^s$mrH7W;9lj#ei;`);bPaf6Dm9NhHq1Hm-1_tFMK0sTg+G2Td%h&H-^jbK^wPm& zd2vyygz4nG=Z(qjP}FH;W)3ozS}l-Y-EBVxA@2DUi{xhW#>ee)Y}$aM-@}*8HL_v) z=~stTl+7FsbwfmbHi_aUyMM$_lEZ}@C_h^ZrOOAEVywWYv$N>%0R{?v0elX79S8xrh&wKD}20?n|Fp_~4-F0_1ei%l<(@H~ z{t_--nFcN@!=-qiod}Mi6!ZC60gNVQ4vlW~6zr8uzJV8)b<(CSN8wN(Cq_lF)y-Z) z+mMf0+tu-y(b}5p2j8<~T3iN@;{eFtHf+~Hi>A~}$*R~=@qR-Kr@slSL-0OSD$6Iy z)d8~t8^d>&z%J-jL~8LOfLEjdU8sAE3ZLfx6fi1ZiMQ|4vOW{c zaVqd0&bUia3CWk(3C;udVLu4L%yZh$SvjS|TK~r^%s}D&o^^U?g**@s-2r46Uxe#r zH#~Q-oIuMe*~_sN2xK0K@}YC+^3O}qFD#ub2DpdWf<@8OczzES%+rWl=lCi``4@biUq1Y(o#i<*|Dh;oU z82ogGx%hbx8rDH1=zlsd>|RIz8zbWq`(F7K4t3>%=L93Ebxn`2t`+YIPZP(gI>P+c zEnI*s>~VKs`AOR(Uqc7oE~@>8y-ZI6#ycagliEI@J4>Ysy38!FVXUX2))Q_y9Se70 z@qNX$hDP3;<)fHckrp{Sw~3mZS?mCCqvB3DAtrvHabeYNW-3X1jnr3+u$FJTv6)+U zCkCsfh_mkSBQDf=WJy$w7SB*R(Ua>~N&_GIw)}R>WN~S^kRJ}yn7t<=dhr(!J`wga zrRrw6r?0+wY|LdNsp%NkYA5PTm&p$%4p!hCN^w|U;xKL@j$Bw-h`i{UaJwuqTBsP^$Ucs`SK9#uL0X0&AKfw-PDg&?T&nj3f}5SrL==UHI-gMioJArQ@ir1=>06rB zNXfK+6K*1bnrC*h&DY+|l*R8>_(rq?qZq(+1t`7JE^R{P|2;2{17Q5dQQK|(N%x$+ z;`?2H?8*(ME1@D9M4@kp__+!>%-7^Sz=8CiNcD2H%&BKQ4reW^LLvW=C%mV6o2|?n z1o*G&J_C%agV^aVsN)Z4CHqKa&&np}ZjzTd60@6dy|=SBrUa2=#O6S z^1SEWwLpc1zv;93b)Ld=W)T9wD0*gf&|HGa!h-hSDeaZh1weh^?tCD}5FD zLk&`BJ&TNZ!vZS3T-wK@FM8?im3b+v@enr4?&K3>(ewWr9I{vIfxO0)#PgEp za!S%ICi_>e?R5UPSd}HeF_>DewgV&zx(@WVl2(^VJTefu?g&0kVf{aS!FacUNjy0O z>q!=Ic0ZeEd^KmMZ2AW77(D*5%};hw4Sxw&!6ct~fOWlzoZZjE-}6V7tWN?^aU zvgYn78h0wlTlUkRbP8oQi>T*E)1H2RXd^gTPB7J7<)nv z^oHO$+7p)lNl7Labn;0_cNrX4!pD^IS}R?lO>OIo?o`t=1N9KrM>5FhVUO;+EZoB$ zgSb%!tA*R7lHjM?qmn+Jz-Ug=HDl;e1*nMaN?n9#NUK(jL6OUGQ?un0iH-+0`sA zeQ{%6&tOX|8ejfpG6QK1gnFb2KP)BztV`O+2YSB=dWI}|hJ1YV7*ldDk(Cd%Et&hCiQX_k7x9m*wcqCu((dc+4&j}Ztz9s00~?*}#~bJD$aJN@N1G!RU4b^Zs` zV6h4Xj3-lY-riZ-N1u&cW-bexaiQKE4159kOU|>q$K=5+^`b((t_TQZZrA~+A`^X& zTVNtYSm5-IZB^!iUW(h2cf>mF{+^q`COC(U#Fh0#6P(yZ@^z-JFyxs!pqE}D*X_aG z@iblj9PEs=_P#Rm7ftKoxMmjSI(b4-)!dh~BGZu`zNE`HXLjW4OWIqr+!s%}6kXF= zjuh987I^hMMGCouu6nN-EubS(+t8rYuqk^BayiVmZPQ*Kw=os0gjQHLQsXG^^DyQJ zLm?}Y^VKM~L+YS^+}{i;`2nLBpo@XY*Xzx|8H|+MXWd38M}brnhb+FIg|II}@F>kI znPsqQ$XC_-Y?Al~!aREp?wQ(}4=&$Y45);t?{G3xC9iLABGhp{U>K_Ek`A0FXkG zcKpBIHgyUl1;n5oq`W)08ZtmvaEf-~y$h(C73gBx5z1BNL3-Kz2c*aO0`w7dJ|>j@ zw<0IQ_iq*!7O`TX2W7tBEO43a6rwG`?y50-e|MH$*o^hyo&7aTaVU;>+BfyjrvI*U zs^B+Bugab9_6+wy&D*DdY-EHRf%LyU4$An`n*tcVlhyxf`}*$MUIpafO9s8^bZhkN z?Y~dtat2kOU;qgoWBBgG0|BZ3>*CagnU45@u48v%)1yHRbRgAkx&m1eNDo*DWdk{0 z%x)ew%glPR>BA!MNOh1OFDReh6j%d{u&Erh$#f8K5E9-VyiEeoF#B`<95U|q=Krfo zYey83ii3b&(gRJn#NaQ<^m}V-tM3f&;Y+nYR#TIkeFOqh3cdg}KtK|XqZO!$qX!q? zeIBdwkk_uK`@Z6*Cw9(1OVc07v{Uo(f0uz|M`PLuP*fOo66DW24a(9v>96U3c;h97 zn1h$=ZK&*sQIs8Jm{dc|J5Xw2XvH~F5>UEf0)=zp-O@L75odmK%7AA-y)mA z!97ereTs|o?nLY+ANBXY@I{%^zp$`SmCg9?#lcd$fts^K-~~Xdpo&!xtvhh%4*ifksE?cw8oDm=L+x?bWNEl`alCmB$d=`QWdI~~?6Bwqx?g_&`%maDBIt6Bs>t`>aUGnW zi=c^u!aCUWMGI*53Ejasd&hHl?KOb)%<7`yUg{yg{H}t&-}1K<7dVm&$E+sMuCT@( z6#L>J;WS>2E!md8?s5O~ocvuJ2E>1oP7*ko^!4OHk>O{w_g1>P$G5}yv*#9w`N)Cj z-CcbADQ%?y;z{hgsAqxi{8Be zbeWsepI?5&efkp5Q~ue9b$&{ta;a(;s1qPimh-9a?w7u3UOF7Ml?Mf`y`_D&v+NS^ z?z&%oDKuF*Rxm^VDJkjlyW0mP-dmE#<&~&(?;7aNCo-Da+b?PUyJANB60-3C6^s7N zypI32FDPEp$++w3@q>y`UiXyHV5TQEof?l zBc7U}MDrSyyf}637Wlgu|Dojjzokj-1xf1FJqA{?FQ_d>$gq^AH_rfNfy1=@F{YL# zc05L< zzp)X}H1^}wUVBBBZMvle+p}}>-%rTUow{`7VB}tBrWG@FzAY-c;(Dt`KHkq?k$ALV z`snh^vEPSU_xtln=~X=WpfNzrih~-U+bKs;yT#iKtj-L;gO?41)csYy-BmyA(9q*R zM^t*yCJc4iRZ<(dYX)q3QkqWPh&I$cfZZ+LPFy^AuoRH|&(j> z?F)7)ZDv@#x)~O<6G)^04b^+5?*9-4Qa@Do>s2dwfMBmy%udxws@ey>$%`YsmCV0g zj~<8)P3kp7X}1D>8Tmj3+&|uXOBz%iA%(r6U3$U$eBYfEr05nBj%P_7X=-W`9xJrK z-N-(a$&z{?moO*L4T=;CMk!0CnsW^6ofWRf?E_Bwo9Bb-Ku{HA z4yn5F2{pF(jdf?8F{Z+t*#Vb&J-rrI9 zco$eJ@Di$%poD$K^;@`V-jCRe|1KQcpLqoouzd{~?hdPr4?Gw6V9Am5_9@6PkeN~K zxuGuIvA5@4IJ9j4J8&HIHJn=TpqQzph^1u?qhh;5S8@Z~`fFuQPulF=Wb|hSUTyZL)a>v6 zw~_0Mugfzmn!^B`snk5jFyDE>8(cjyyozVxL zJ}Uf`y&=q>`G^%$&|F4Czs7)SLx?A&dao5m-`j9>O=tWSr!D`@nGf1AG=%xFwD_?t zv0yoMu5pwt5PL`>pCR(85o>bUD=1CAvZrIGp!Pf22+TJ${W>gpm6qd^>bP0l+XkK DB$9&s literal 0 HcmV?d00001 diff --git a/v3/examples/badge/build/config.yml b/v3/examples/badge/build/config.yml new file mode 100644 index 000000000..aaa3240fb --- /dev/null +++ b/v3/examples/badge/build/config.yml @@ -0,0 +1,63 @@ +# This file contains the configuration for this project. +# When you update `info` or `fileAssociations`, run `wails3 task common:update:build-assets` to update the assets. +# Note that this will overwrite any changes you have made to the assets. +version: '3' + +# This information is used to generate the build assets. +info: + companyName: "My Company" # The name of the company + productName: "My Product" # The name of the application + productIdentifier: "com.mycompany.myproduct" # The unique product identifier + description: "A program that does X" # The application description + copyright: "(c) 2025, My Company" # Copyright text + comments: "Some Product Comments" # Comments + version: "0.0.1" # The application version + +# Dev mode configuration +dev_mode: + root_path: . + log_level: warn + debounce: 1000 + ignore: + dir: + - .git + - node_modules + - frontend + - bin + file: + - .DS_Store + - .gitignore + - .gitkeep + watched_extension: + - "*.go" + git_ignore: true + executes: + - cmd: wails3 task common:install:frontend:deps + type: once + - cmd: wails3 task common:dev:frontend + type: background + - cmd: go mod tidy + type: blocking + - cmd: wails3 task build + type: blocking + - cmd: wails3 task run + type: primary + +# File Associations +# More information at: https://v3.wails.io/noit/done/yet +fileAssociations: +# - ext: wails +# name: Wails +# description: Wails Application File +# iconName: wailsFileIcon +# role: Editor +# - ext: jpg +# name: JPEG +# description: Image File +# iconName: jpegFileIcon +# role: Editor +# mimeType: image/jpeg # (optional) + +# Other data +other: + - name: My Other Data \ No newline at end of file diff --git a/v3/examples/badge/build/darwin/Info.dev.plist b/v3/examples/badge/build/darwin/Info.dev.plist new file mode 100644 index 000000000..4caddf720 --- /dev/null +++ b/v3/examples/badge/build/darwin/Info.dev.plist @@ -0,0 +1,32 @@ + + + + CFBundlePackageType + APPL + CFBundleName + My Product + CFBundleExecutable + badge + CFBundleIdentifier + com.wails.badge + CFBundleVersion + 0.1.0 + CFBundleGetInfoString + This is a comment + CFBundleShortVersionString + 0.1.0 + CFBundleIconFile + icons + LSMinimumSystemVersion + 10.15.0 + NSHighResolutionCapable + true + NSHumanReadableCopyright + © now, My Company + NSAppTransportSecurity + + NSAllowsLocalNetworking + + + + \ No newline at end of file diff --git a/v3/examples/badge/build/darwin/Info.plist b/v3/examples/badge/build/darwin/Info.plist new file mode 100644 index 000000000..0dc90b2e7 --- /dev/null +++ b/v3/examples/badge/build/darwin/Info.plist @@ -0,0 +1,27 @@ + + + + CFBundlePackageType + APPL + CFBundleName + My Product + CFBundleExecutable + badge + CFBundleIdentifier + com.wails.badge + CFBundleVersion + 0.1.0 + CFBundleGetInfoString + This is a comment + CFBundleShortVersionString + 0.1.0 + CFBundleIconFile + icons + LSMinimumSystemVersion + 10.15.0 + NSHighResolutionCapable + true + NSHumanReadableCopyright + © now, My Company + + \ No newline at end of file diff --git a/v3/examples/badge/build/darwin/Taskfile.yml b/v3/examples/badge/build/darwin/Taskfile.yml new file mode 100644 index 000000000..f0791fea9 --- /dev/null +++ b/v3/examples/badge/build/darwin/Taskfile.yml @@ -0,0 +1,81 @@ +version: '3' + +includes: + common: ../Taskfile.yml + +tasks: + build: + summary: Creates a production build of the application + deps: + - task: common:go:mod:tidy + - task: common:build:frontend + vars: + BUILD_FLAGS: + ref: .BUILD_FLAGS + PRODUCTION: + ref: .PRODUCTION + - task: common:generate:icons + cmds: + - go build {{.BUILD_FLAGS}} -o {{.OUTPUT}} + vars: + BUILD_FLAGS: '{{if eq .PRODUCTION "true"}}-tags production -trimpath -buildvcs=false -ldflags="-w -s"{{else}}-buildvcs=false -gcflags=all="-l"{{end}}' + DEFAULT_OUTPUT: '{{.BIN_DIR}}/{{.APP_NAME}}' + OUTPUT: '{{ .OUTPUT | default .DEFAULT_OUTPUT }}' + env: + GOOS: darwin + CGO_ENABLED: 1 + GOARCH: '{{.ARCH | default ARCH}}' + CGO_CFLAGS: "-mmacosx-version-min=10.15" + CGO_LDFLAGS: "-mmacosx-version-min=10.15" + MACOSX_DEPLOYMENT_TARGET: "10.15" + PRODUCTION: '{{.PRODUCTION | default "false"}}' + + build:universal: + summary: Builds darwin universal binary (arm64 + amd64) + deps: + - task: build + vars: + ARCH: amd64 + OUTPUT: "{{.BIN_DIR}}/{{.APP_NAME}}-amd64" + - task: build + vars: + ARCH: arm64 + OUTPUT: "{{.BIN_DIR}}/{{.APP_NAME}}-arm64" + cmds: + - lipo -create -output "{{.BIN_DIR}}/{{.APP_NAME}}" "{{.BIN_DIR}}/{{.APP_NAME}}-amd64" "{{.BIN_DIR}}/{{.APP_NAME}}-arm64" + - rm "{{.BIN_DIR}}/{{.APP_NAME}}-amd64" "{{.BIN_DIR}}/{{.APP_NAME}}-arm64" + + package: + summary: Packages a production build of the application into a `.app` bundle + deps: + - task: build + vars: + PRODUCTION: "true" + cmds: + - task: create:app:bundle + + package:universal: + summary: Packages darwin universal binary (arm64 + amd64) + deps: + - task: build:universal + cmds: + - task: create:app:bundle + + + create:app:bundle: + summary: Creates an `.app` bundle + cmds: + - mkdir -p {{.BIN_DIR}}/{{.APP_NAME}}.app/Contents/{MacOS,Resources} + - cp build/darwin/icons.icns {{.BIN_DIR}}/{{.APP_NAME}}.app/Contents/Resources + - cp {{.BIN_DIR}}/{{.APP_NAME}} {{.BIN_DIR}}/{{.APP_NAME}}.app/Contents/MacOS + - cp build/darwin/Info.plist {{.BIN_DIR}}/{{.APP_NAME}}.app/Contents + - codesign --force --deep --sign - {{.BIN_DIR}}/{{.APP_NAME}}.app + + run: + cmds: + - mkdir -p {{.BIN_DIR}}/{{.APP_NAME}}.dev.app/Contents/{MacOS,Resources} + - cp build/darwin/icons.icns {{.BIN_DIR}}/{{.APP_NAME}}.dev.app/Contents/Resources + - cp {{.BIN_DIR}}/{{.APP_NAME}} {{.BIN_DIR}}/{{.APP_NAME}}.dev.app/Contents/MacOS + - cp build/darwin/Info.dev.plist {{.BIN_DIR}}/{{.APP_NAME}}.dev.app/Contents/Info.plist + - codesign --force --deep --sign - {{.BIN_DIR}}/{{.APP_NAME}}.dev.app + - '{{.BIN_DIR}}/{{.APP_NAME}}.dev.app/Contents/MacOS/{{.APP_NAME}}' diff --git a/v3/examples/badge/build/darwin/icons.icns b/v3/examples/badge/build/darwin/icons.icns new file mode 100644 index 0000000000000000000000000000000000000000..1b5bd4c86c4533471d6044c5edc0c8c86b87e612 GIT binary patch literal 356592 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

    ^Lg7K@^M66wF^U#m6$MQA`NxZ%~uf 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 KmPKi1yf9{GFYLn7< +description: "My Product Description" +vendor: "My Company" +homepage: "https://wails.io" +license: "MIT" +release: "1" + +contents: + - src: "./bin/badge" + dst: "/usr/local/bin/badge" + - src: "./build/appicon.png" + dst: "/usr/share/icons/hicolor/128x128/apps/badge.png" + - src: "./build/linux/badge.desktop" + dst: "/usr/share/applications/badge.desktop" + +depends: + - gtk3 + - libwebkit2gtk + +# replaces: +# - foobar +# provides: +# - bar +# depends: +# - gtk3 +# - libwebkit2gtk +# recommends: +# - whatever +# suggests: +# - something-else +# conflicts: +# - not-foo +# - not-bar +# changelog: "changelog.yaml" +# scripts: +# preinstall: ./build/linux/nfpm/scripts/preinstall.sh +# postinstall: ./build/linux/nfpm/scripts/postinstall.sh +# preremove: ./build/linux/nfpm/scripts/preremove.sh +# postremove: ./build/linux/nfpm/scripts/postremove.sh diff --git a/v3/examples/badge/build/linux/nfpm/scripts/postinstall.sh b/v3/examples/badge/build/linux/nfpm/scripts/postinstall.sh new file mode 100644 index 000000000..a9bf588e2 --- /dev/null +++ b/v3/examples/badge/build/linux/nfpm/scripts/postinstall.sh @@ -0,0 +1 @@ +#!/bin/bash diff --git a/v3/examples/badge/build/linux/nfpm/scripts/postremove.sh b/v3/examples/badge/build/linux/nfpm/scripts/postremove.sh new file mode 100644 index 000000000..a9bf588e2 --- /dev/null +++ b/v3/examples/badge/build/linux/nfpm/scripts/postremove.sh @@ -0,0 +1 @@ +#!/bin/bash diff --git a/v3/examples/badge/build/linux/nfpm/scripts/preinstall.sh b/v3/examples/badge/build/linux/nfpm/scripts/preinstall.sh new file mode 100644 index 000000000..a9bf588e2 --- /dev/null +++ b/v3/examples/badge/build/linux/nfpm/scripts/preinstall.sh @@ -0,0 +1 @@ +#!/bin/bash diff --git a/v3/examples/badge/build/linux/nfpm/scripts/preremove.sh b/v3/examples/badge/build/linux/nfpm/scripts/preremove.sh new file mode 100644 index 000000000..a9bf588e2 --- /dev/null +++ b/v3/examples/badge/build/linux/nfpm/scripts/preremove.sh @@ -0,0 +1 @@ +#!/bin/bash diff --git a/v3/examples/badge/build/windows/Taskfile.yml b/v3/examples/badge/build/windows/Taskfile.yml new file mode 100644 index 000000000..534f4fb31 --- /dev/null +++ b/v3/examples/badge/build/windows/Taskfile.yml @@ -0,0 +1,63 @@ +version: '3' + +includes: + common: ../Taskfile.yml + +tasks: + build: + summary: Builds the application for Windows + deps: + - task: common:go:mod:tidy + - task: common:build:frontend + vars: + BUILD_FLAGS: + ref: .BUILD_FLAGS + PRODUCTION: + ref: .PRODUCTION + - task: common:generate:icons + cmds: + - task: generate:syso + - go build {{.BUILD_FLAGS}} -o {{.BIN_DIR}}/{{.APP_NAME}}.exe + - cmd: powershell Remove-item *.syso + platforms: [windows] + - cmd: rm -f *.syso + platforms: [linux, darwin] + vars: + BUILD_FLAGS: '{{if eq .PRODUCTION "true"}}-tags production -trimpath -buildvcs=false -ldflags="-w -s -H windowsgui"{{else}}-buildvcs=false -gcflags=all="-l"{{end}}' + env: + GOOS: windows + CGO_ENABLED: 0 + GOARCH: '{{.ARCH | default ARCH}}' + PRODUCTION: '{{.PRODUCTION | default "false"}}' + + package: + summary: Packages a production build of the application into a `.exe` bundle + cmds: + - task: create:nsis:installer + + generate:syso: + summary: Generates Windows `.syso` file + dir: build + cmds: + - wails3 generate syso -arch {{.ARCH}} -icon windows/icon.ico -manifest windows/wails.exe.manifest -info windows/info.json -out ../wails_windows_{{.ARCH}}.syso + vars: + ARCH: '{{.ARCH | default ARCH}}' + + create:nsis:installer: + summary: Creates an NSIS installer + dir: build/windows/nsis + deps: + - task: build + vars: + PRODUCTION: "true" + cmds: + # Create the Microsoft WebView2 bootstrapper if it doesn't exist + - wails3 generate webview2bootstrapper -dir "{{.ROOT_DIR}}/build/windows/nsis" + - makensis -DARG_WAILS_{{.ARG_FLAG}}_BINARY="{{.ROOT_DIR}}/{{.BIN_DIR}}/{{.APP_NAME}}.exe" project.nsi + vars: + ARCH: '{{.ARCH | default ARCH}}' + ARG_FLAG: '{{if eq .ARCH "amd64"}}AMD64{{else}}ARM64{{end}}' + + run: + cmds: + - '{{.BIN_DIR}}/{{.APP_NAME}}.exe' diff --git a/v3/examples/badge/build/windows/icon.ico b/v3/examples/badge/build/windows/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..bfa0690b7f8aea8d793026b51f9fc4eed2e00af7 GIT binary patch literal 21677 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 ou5=8}@A^#05^yFjv{|%CV0m?W0y8r+H literal 0 HcmV?d00001 diff --git a/v3/examples/badge/build/windows/info.json b/v3/examples/badge/build/windows/info.json new file mode 100644 index 000000000..850b2b5b0 --- /dev/null +++ b/v3/examples/badge/build/windows/info.json @@ -0,0 +1,15 @@ +{ + "fixed": { + "file_version": "0.1.0" + }, + "info": { + "0000": { + "ProductVersion": "0.1.0", + "CompanyName": "My Company", + "FileDescription": "My Product Description", + "LegalCopyright": "© now, My Company", + "ProductName": "My Product", + "Comments": "This is a comment" + } + } +} \ No newline at end of file diff --git a/v3/examples/badge/build/windows/nsis/project.nsi b/v3/examples/badge/build/windows/nsis/project.nsi new file mode 100644 index 000000000..985b8e207 --- /dev/null +++ b/v3/examples/badge/build/windows/nsis/project.nsi @@ -0,0 +1,112 @@ +Unicode true + +#### +## Please note: Template replacements don't work in this file. They are provided with default defines like +## mentioned underneath. +## If the keyword is not defined, "wails_tools.nsh" will populate them. +## If they are defined here, "wails_tools.nsh" will not touch them. This allows you to use this project.nsi manually +## from outside of Wails for debugging and development of the installer. +## +## For development first make a wails nsis build to populate the "wails_tools.nsh": +## > wails build --target windows/amd64 --nsis +## Then you can call makensis on this file with specifying the path to your binary: +## For a AMD64 only installer: +## > makensis -DARG_WAILS_AMD64_BINARY=..\..\bin\app.exe +## For a ARM64 only installer: +## > makensis -DARG_WAILS_ARM64_BINARY=..\..\bin\app.exe +## For a installer with both architectures: +## > makensis -DARG_WAILS_AMD64_BINARY=..\..\bin\app-amd64.exe -DARG_WAILS_ARM64_BINARY=..\..\bin\app-arm64.exe +#### +## The following information is taken from the wails_tools.nsh file, but they can be overwritten here. +#### +## !define INFO_PROJECTNAME "my-project" # Default "badge" +## !define INFO_COMPANYNAME "My Company" # Default "My Company" +## !define INFO_PRODUCTNAME "My Product Name" # Default "My Product" +## !define INFO_PRODUCTVERSION "1.0.0" # Default "0.1.0" +## !define INFO_COPYRIGHT "(c) Now, My Company" # Default "© now, My Company" +### +## !define PRODUCT_EXECUTABLE "Application.exe" # Default "${INFO_PROJECTNAME}.exe" +## !define UNINST_KEY_NAME "UninstKeyInRegistry" # Default "${INFO_COMPANYNAME}${INFO_PRODUCTNAME}" +#### +## !define REQUEST_EXECUTION_LEVEL "admin" # Default "admin" see also https://nsis.sourceforge.io/Docs/Chapter4.html +#### +## Include the wails tools +#### +!include "wails_tools.nsh" + +# The version information for this two must consist of 4 parts +VIProductVersion "${INFO_PRODUCTVERSION}.0" +VIFileVersion "${INFO_PRODUCTVERSION}.0" + +VIAddVersionKey "CompanyName" "${INFO_COMPANYNAME}" +VIAddVersionKey "FileDescription" "${INFO_PRODUCTNAME} Installer" +VIAddVersionKey "ProductVersion" "${INFO_PRODUCTVERSION}" +VIAddVersionKey "FileVersion" "${INFO_PRODUCTVERSION}" +VIAddVersionKey "LegalCopyright" "${INFO_COPYRIGHT}" +VIAddVersionKey "ProductName" "${INFO_PRODUCTNAME}" + +# Enable HiDPI support. https://nsis.sourceforge.io/Reference/ManifestDPIAware +ManifestDPIAware true + +!include "MUI.nsh" + +!define MUI_ICON "..\icon.ico" +!define MUI_UNICON "..\icon.ico" +# !define MUI_WELCOMEFINISHPAGE_BITMAP "resources\leftimage.bmp" #Include this to add a bitmap on the left side of the Welcome Page. Must be a size of 164x314 +!define MUI_FINISHPAGE_NOAUTOCLOSE # Wait on the INSTFILES page so the user can take a look into the details of the installation steps +!define MUI_ABORTWARNING # This will warn the user if they exit from the installer. + +!insertmacro MUI_PAGE_WELCOME # Welcome to the installer page. +# !insertmacro MUI_PAGE_LICENSE "resources\eula.txt" # Adds a EULA page to the installer +!insertmacro MUI_PAGE_DIRECTORY # In which folder install page. +!insertmacro MUI_PAGE_INSTFILES # Installing page. +!insertmacro MUI_PAGE_FINISH # Finished installation page. + +!insertmacro MUI_UNPAGE_INSTFILES # Uninstalling page + +!insertmacro MUI_LANGUAGE "English" # Set the Language of the installer + +## The following two statements can be used to sign the installer and the uninstaller. The path to the binaries are provided in %1 +#!uninstfinalize 'signtool --file "%1"' +#!finalize 'signtool --file "%1"' + +Name "${INFO_PRODUCTNAME}" +OutFile "..\..\..\bin\${INFO_PROJECTNAME}-${ARCH}-installer.exe" # Name of the installer's file. +InstallDir "$PROGRAMFILES64\${INFO_COMPANYNAME}\${INFO_PRODUCTNAME}" # Default installing folder ($PROGRAMFILES is Program Files folder). +ShowInstDetails show # This will always show the installation details. + +Function .onInit + !insertmacro wails.checkArchitecture +FunctionEnd + +Section + !insertmacro wails.setShellContext + + !insertmacro wails.webview2runtime + + SetOutPath $INSTDIR + + !insertmacro wails.files + + CreateShortcut "$SMPROGRAMS\${INFO_PRODUCTNAME}.lnk" "$INSTDIR\${PRODUCT_EXECUTABLE}" + CreateShortCut "$DESKTOP\${INFO_PRODUCTNAME}.lnk" "$INSTDIR\${PRODUCT_EXECUTABLE}" + + !insertmacro wails.associateFiles + + !insertmacro wails.writeUninstaller +SectionEnd + +Section "uninstall" + !insertmacro wails.setShellContext + + RMDir /r "$AppData\${PRODUCT_EXECUTABLE}" # Remove the WebView2 DataPath + + RMDir /r $INSTDIR + + Delete "$SMPROGRAMS\${INFO_PRODUCTNAME}.lnk" + Delete "$DESKTOP\${INFO_PRODUCTNAME}.lnk" + + !insertmacro wails.unassociateFiles + + !insertmacro wails.deleteUninstaller +SectionEnd diff --git a/v3/examples/badge/build/windows/nsis/wails_tools.nsh b/v3/examples/badge/build/windows/nsis/wails_tools.nsh new file mode 100644 index 000000000..6fc10ab79 --- /dev/null +++ b/v3/examples/badge/build/windows/nsis/wails_tools.nsh @@ -0,0 +1,212 @@ +# DO NOT EDIT - Generated automatically by `wails build` + +!include "x64.nsh" +!include "WinVer.nsh" +!include "FileFunc.nsh" + +!ifndef INFO_PROJECTNAME + !define INFO_PROJECTNAME "badge" +!endif +!ifndef INFO_COMPANYNAME + !define INFO_COMPANYNAME "My Company" +!endif +!ifndef INFO_PRODUCTNAME + !define INFO_PRODUCTNAME "My Product" +!endif +!ifndef INFO_PRODUCTVERSION + !define INFO_PRODUCTVERSION "0.1.0" +!endif +!ifndef INFO_COPYRIGHT + !define INFO_COPYRIGHT "© now, My Company" +!endif +!ifndef PRODUCT_EXECUTABLE + !define PRODUCT_EXECUTABLE "${INFO_PROJECTNAME}.exe" +!endif +!ifndef UNINST_KEY_NAME + !define UNINST_KEY_NAME "${INFO_COMPANYNAME}${INFO_PRODUCTNAME}" +!endif +!define UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINST_KEY_NAME}" + +!ifndef REQUEST_EXECUTION_LEVEL + !define REQUEST_EXECUTION_LEVEL "admin" +!endif + +RequestExecutionLevel "${REQUEST_EXECUTION_LEVEL}" + +!ifdef ARG_WAILS_AMD64_BINARY + !define SUPPORTS_AMD64 +!endif + +!ifdef ARG_WAILS_ARM64_BINARY + !define SUPPORTS_ARM64 +!endif + +!ifdef SUPPORTS_AMD64 + !ifdef SUPPORTS_ARM64 + !define ARCH "amd64_arm64" + !else + !define ARCH "amd64" + !endif +!else + !ifdef SUPPORTS_ARM64 + !define ARCH "arm64" + !else + !error "Wails: Undefined ARCH, please provide at least one of ARG_WAILS_AMD64_BINARY or ARG_WAILS_ARM64_BINARY" + !endif +!endif + +!macro wails.checkArchitecture + !ifndef WAILS_WIN10_REQUIRED + !define WAILS_WIN10_REQUIRED "This product is only supported on Windows 10 (Server 2016) and later." + !endif + + !ifndef WAILS_ARCHITECTURE_NOT_SUPPORTED + !define WAILS_ARCHITECTURE_NOT_SUPPORTED "This product can't be installed on the current Windows architecture. Supports: ${ARCH}" + !endif + + ${If} ${AtLeastWin10} + !ifdef SUPPORTS_AMD64 + ${if} ${IsNativeAMD64} + Goto ok + ${EndIf} + !endif + + !ifdef SUPPORTS_ARM64 + ${if} ${IsNativeARM64} + Goto ok + ${EndIf} + !endif + + IfSilent silentArch notSilentArch + silentArch: + SetErrorLevel 65 + Abort + notSilentArch: + MessageBox MB_OK "${WAILS_ARCHITECTURE_NOT_SUPPORTED}" + Quit + ${else} + IfSilent silentWin notSilentWin + silentWin: + SetErrorLevel 64 + Abort + notSilentWin: + MessageBox MB_OK "${WAILS_WIN10_REQUIRED}" + Quit + ${EndIf} + + ok: +!macroend + +!macro wails.files + !ifdef SUPPORTS_AMD64 + ${if} ${IsNativeAMD64} + File "/oname=${PRODUCT_EXECUTABLE}" "${ARG_WAILS_AMD64_BINARY}" + ${EndIf} + !endif + + !ifdef SUPPORTS_ARM64 + ${if} ${IsNativeARM64} + File "/oname=${PRODUCT_EXECUTABLE}" "${ARG_WAILS_ARM64_BINARY}" + ${EndIf} + !endif +!macroend + +!macro wails.writeUninstaller + WriteUninstaller "$INSTDIR\uninstall.exe" + + SetRegView 64 + WriteRegStr HKLM "${UNINST_KEY}" "Publisher" "${INFO_COMPANYNAME}" + WriteRegStr HKLM "${UNINST_KEY}" "DisplayName" "${INFO_PRODUCTNAME}" + WriteRegStr HKLM "${UNINST_KEY}" "DisplayVersion" "${INFO_PRODUCTVERSION}" + WriteRegStr HKLM "${UNINST_KEY}" "DisplayIcon" "$INSTDIR\${PRODUCT_EXECUTABLE}" + WriteRegStr HKLM "${UNINST_KEY}" "UninstallString" "$\"$INSTDIR\uninstall.exe$\"" + WriteRegStr HKLM "${UNINST_KEY}" "QuietUninstallString" "$\"$INSTDIR\uninstall.exe$\" /S" + + ${GetSize} "$INSTDIR" "/S=0K" $0 $1 $2 + IntFmt $0 "0x%08X" $0 + WriteRegDWORD HKLM "${UNINST_KEY}" "EstimatedSize" "$0" +!macroend + +!macro wails.deleteUninstaller + Delete "$INSTDIR\uninstall.exe" + + SetRegView 64 + DeleteRegKey HKLM "${UNINST_KEY}" +!macroend + +!macro wails.setShellContext + ${If} ${REQUEST_EXECUTION_LEVEL} == "admin" + SetShellVarContext all + ${else} + SetShellVarContext current + ${EndIf} +!macroend + +# Install webview2 by launching the bootstrapper +# See https://docs.microsoft.com/en-us/microsoft-edge/webview2/concepts/distribution#online-only-deployment +!macro wails.webview2runtime + !ifndef WAILS_INSTALL_WEBVIEW_DETAILPRINT + !define WAILS_INSTALL_WEBVIEW_DETAILPRINT "Installing: WebView2 Runtime" + !endif + + SetRegView 64 + # If the admin key exists and is not empty then webview2 is already installed + ReadRegStr $0 HKLM "SOFTWARE\WOW6432Node\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}" "pv" + ${If} $0 != "" + Goto ok + ${EndIf} + + ${If} ${REQUEST_EXECUTION_LEVEL} == "user" + # If the installer is run in user level, check the user specific key exists and is not empty then webview2 is already installed + ReadRegStr $0 HKCU "Software\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}" "pv" + ${If} $0 != "" + Goto ok + ${EndIf} + ${EndIf} + + SetDetailsPrint both + DetailPrint "${WAILS_INSTALL_WEBVIEW_DETAILPRINT}" + SetDetailsPrint listonly + + InitPluginsDir + CreateDirectory "$pluginsdir\webview2bootstrapper" + SetOutPath "$pluginsdir\webview2bootstrapper" + File "MicrosoftEdgeWebview2Setup.exe" + ExecWait '"$pluginsdir\webview2bootstrapper\MicrosoftEdgeWebview2Setup.exe" /silent /install' + + SetDetailsPrint both + ok: +!macroend + +# Copy of APP_ASSOCIATE and APP_UNASSOCIATE macros from here https://gist.github.com/nikku/281d0ef126dbc215dd58bfd5b3a5cd5b +!macro APP_ASSOCIATE EXT FILECLASS DESCRIPTION ICON COMMANDTEXT COMMAND + ; Backup the previously associated file class + ReadRegStr $R0 SHELL_CONTEXT "Software\Classes\.${EXT}" "" + WriteRegStr SHELL_CONTEXT "Software\Classes\.${EXT}" "${FILECLASS}_backup" "$R0" + + WriteRegStr SHELL_CONTEXT "Software\Classes\.${EXT}" "" "${FILECLASS}" + + WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}" "" `${DESCRIPTION}` + WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\DefaultIcon" "" `${ICON}` + WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell" "" "open" + WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell\open" "" `${COMMANDTEXT}` + WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell\open\command" "" `${COMMAND}` +!macroend + +!macro APP_UNASSOCIATE EXT FILECLASS + ; Backup the previously associated file class + ReadRegStr $R0 SHELL_CONTEXT "Software\Classes\.${EXT}" `${FILECLASS}_backup` + WriteRegStr SHELL_CONTEXT "Software\Classes\.${EXT}" "" "$R0" + + DeleteRegKey SHELL_CONTEXT `Software\Classes\${FILECLASS}` +!macroend + +!macro wails.associateFiles + ; Create file associations + +!macroend + +!macro wails.unassociateFiles + ; Delete app associations + +!macroend \ No newline at end of file diff --git a/v3/examples/badge/build/windows/wails.exe.manifest b/v3/examples/badge/build/windows/wails.exe.manifest new file mode 100644 index 000000000..1d8992a3d --- /dev/null +++ b/v3/examples/badge/build/windows/wails.exe.manifest @@ -0,0 +1,15 @@ + + + + + + + + + + + true/pm + permonitorv2,permonitor + + + \ No newline at end of file diff --git a/v3/examples/badge/frontend/Inter Font License.txt b/v3/examples/badge/frontend/Inter Font License.txt new file mode 100644 index 000000000..b525cbf3a --- /dev/null +++ b/v3/examples/badge/frontend/Inter Font License.txt @@ -0,0 +1,93 @@ +Copyright 2020 The Inter Project Authors (https://github.com/rsms/inter) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/v3/examples/badge/frontend/index.html b/v3/examples/badge/frontend/index.html new file mode 100644 index 000000000..719d09002 --- /dev/null +++ b/v3/examples/badge/frontend/index.html @@ -0,0 +1,36 @@ + + + + + + + + Wails App + + +

    + +

    Wails + Typescript

    +
    Set a badge label below 👇
    +
    +
    + + + +
    +
    + +
    + + + diff --git a/v3/examples/badge/frontend/package.json b/v3/examples/badge/frontend/package.json new file mode 100644 index 000000000..4d675f189 --- /dev/null +++ b/v3/examples/badge/frontend/package.json @@ -0,0 +1,17 @@ +{ + "name": "frontend", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build:dev": "tsc && vite build --minify false --mode development", + "build": "tsc && vite build --mode production", + "preview": "vite preview" + }, + "devDependencies": { + "typescript": "^4.9.3", + "vite": "^5.0.0", + "@wailsio/runtime": "latest" + } +} \ No newline at end of file diff --git a/v3/examples/badge/frontend/public/Inter-Medium.ttf b/v3/examples/badge/frontend/public/Inter-Medium.ttf new file mode 100644 index 0000000000000000000000000000000000000000..a01f3777a6fc284b7a720c0f8248a27066389ef9 GIT binary patch literal 315132 zcmd>{3Ajzw|M0(S?X!n-?sds<&AMdHJY`De%rlit*Gxz*k|ZQaMWm8sCL|H5Orgje zLX;sYN}^G@hWmcjK4)L_tKaY+-sgFr_ul8T*4k_QuJ8KpwfA0opS?wiNG6<+$lZ18 z)h}DV>>3eWoroNFw`kt_=)7a6M2)O0s^ph46$l{1e>k6gWyQwEyWNY9Gz_3HOX&vyAf z)S{Q>5MAJ8?;gqBOFo}`FX>%Kuhg4}e4BH=#y0Xu!QTA`56g7y>@Ol2dy5p=(eJ@- z$>AZbE{NPwf$hEhlZOqA#4CsVv?oaelKb~){O#aW5vPqvIP<^B5&SN zzrXqG{ycsElt;op`!QDN*v#5b&hDJC`frju&adR?&uep=z_GS14*mY-l@WRR#%E^J z5gn_;)b6n*lGS$$ihj6P@4+ggNJ_r}gHSL1OfsF!hHQL}O9s)M+nsb6q^Qx|dn(6vPA zI=TUFBi#nKoleH>rm-LWq<#hWRsAaNOuY_wquz}Bk=}y4L+`}htv|#4+^Q|gs%JIC zZDKuyJJ=e6`-n9Tcf7Rn$I0&?vs26| zhFiiZfm_XC?3_kUBivR_Pu$*4Z`=o*2XF^C18^U9hKc1o;ygllxHE$A80QJxxz0jS zuIEyxThJ|tTgUBy+u7}m`?&iA?o;klxKF!J<38g~!kywy!JX<(#hvD&2lrK%QFa%* zi*es@m*OsSm*cK3;-OD(xHp{e)}Vk zj}jgoW^}?YgkQj&9-fZ-es~?J8^W6i?+WiGygz&h_el5{?w4U|4u2c|7WaG@4Tpb< z&3F~`P%|^Jmxw&?#K*!)a@fDd!depS)3LB6rR?`&;m{3vY^h|U1HT@J_`b2QD{bt= zSlAQKPKbrWk`y{03&#=O6AQ=R5YC{ItYxwI1gT)5Z@>Ob60rux!na7g)jbx@d_A7& zF41ZhjaN$YSmk12Emid&v9Kle_1m#?vid~S~a&&R@fB%ch5h4XS)iH$F^BublD{H+{eYRAG!9CZrB!ugRWM=V@`kdUjN zBuh7WfLsk_FyVgEhwba}^<)_FgGi|@50cvbPdWcF{jc){v8|mem2h13VpUJrSMT9Ty>3?!}(7+ojH-SDu#-J4JfsYA$L->-WxHJI`PNg0eR zrk)%OnM*bDYd9+u%CMXc}>W)X;S;MZTi-o7KTVyUt%M{ zpqpyy=F2mb5@zI$)P2a=gfb8NwcIE}lbcEgd7JyvnwADob^xWW$D|N5?1t^0zAS_O zQtAi&vUMquf)xFc*ywzS->W{9Gc5#~G(9rbkmBnx1>HsEAMVR+MkEQ{8BLp>rLbir zGrCS9&XgYD_t!`p9oeqL4kG72YyWz`jLr6f!IZesh8y~=80{Nt9gJqGN@@O6kj9Lc zv5gcd1xCxI{5E@$-W-c)!v1aS(MVgL6eDkvv?kP((8K7#*oWzf$r0U;dyvc6hZ(zQ zpG@0PYchFTv)7wZyDs_ln$4cljk3`iN|37^TSfn*nUt7Tjja8l6mAc+*oxXs%n;lp+B0Ju?NN%a&mjNx zQA%QOYv@ZAwTBy1qIx#6N9RXVm)WNV`Ln4R6=O?*1lLQJyvZW|tkd#HTL!IG;ff$? zK_%HvmWsrckxH~t1`Xbrs}-Zz6sjSqu?f?oo7-qboY_;%TtDcBTuC=cQU@IjWS%m1 z7|f>SXw48EVPi4Z+enfY7y8oNVG@2$=8*Bb|Yth z#wE~FX<80?P)sDQpt&yPN^GUn|6ii|e_rpkJ?_f1l28#`I0oDP{d)d+`M8MGzY({b zoVDP42V>h{^2j=f$(R9Lo&d7Uiy12EF<#m^3% zk;mAc3tNaQ3?C4lt$)Av9sZ_hKH0z`#ŹD@)<7ltOtn$SSm;LMTrPEA?sR43d= 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�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 literal 0 HcmV?d00001 diff --git a/v3/examples/badge/frontend/public/style.css b/v3/examples/badge/frontend/public/style.css new file mode 100644 index 000000000..0b9c58279 --- /dev/null +++ b/v3/examples/badge/frontend/public/style.css @@ -0,0 +1,157 @@ +:root { + font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", + "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", + sans-serif; + font-size: 16px; + line-height: 24px; + font-weight: 400; + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: rgba(27, 38, 54, 1); + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; + user-select: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; +} + +@font-face { + font-family: "Inter"; + font-style: normal; + font-weight: 400; + src: local(""), + url("./Inter-Medium.ttf") format("truetype"); +} + +h3 { + font-size: 3em; + line-height: 1.1; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} + +a:hover { + color: #535bf2; +} + +button { + width: 60px; + height: 30px; + line-height: 30px; + border-radius: 3px; + border: none; + margin: 0 0 0 20px; + padding: 0 8px; + cursor: pointer; +} + +.result { + height: 20px; + line-height: 20px; +} + +body { + margin: 0; + display: flex; + place-items: center; + place-content: center; + min-width: 320px; + min-height: 100vh; +} + +.container { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +#app { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; +} + +.logo:hover { + filter: drop-shadow(0 0 2em #e80000aa); +} + +.logo.vanilla:hover { + filter: drop-shadow(0 0 2em #f7df1eaa); +} + +.result { + height: 20px; + line-height: 20px; + margin: 1.5rem auto; + text-align: center; +} + +.footer { + margin-top: 1rem; + align-content: center; + text-align: center; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + + a:hover { + color: #747bff; + } + + button { + background-color: #f9f9f9; + } +} + + +.input-box .btn:hover { + background-image: linear-gradient(to top, #cfd9df 0%, #e2ebf0 100%); + color: #333333; +} + +.input-box .input { + border: none; + border-radius: 3px; + outline: none; + height: 30px; + line-height: 30px; + padding: 0 10px; + color: black; + background-color: rgba(240, 240, 240, 1); + -webkit-font-smoothing: antialiased; +} + +.input-box .input:hover { + border: none; + background-color: rgba(255, 255, 255, 1); +} + +.input-box .input:focus { + border: none; + background-color: rgba(255, 255, 255, 1); +} \ No newline at end of file diff --git a/v3/examples/badge/frontend/public/typescript.svg b/v3/examples/badge/frontend/public/typescript.svg new file mode 100644 index 000000000..d91c910cc --- /dev/null +++ b/v3/examples/badge/frontend/public/typescript.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v3/examples/badge/frontend/public/wails.png b/v3/examples/badge/frontend/public/wails.png new file mode 100644 index 0000000000000000000000000000000000000000..8bdf424833bfb5b6b34a0807224e94533f738f2e GIT binary patch literal 9057 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 { + let label = (labelElement as HTMLInputElement).value + SetBadge(label); +}); + +removeButton.addEventListener('click', () => { + RemoveBadge(); +}); + +Events.On('time', (time: {data: any}) => { + timeElement.innerText = time.data; +}); diff --git a/v3/examples/badge/frontend/src/vite-env.d.ts b/v3/examples/badge/frontend/src/vite-env.d.ts new file mode 100644 index 000000000..11f02fe2a --- /dev/null +++ b/v3/examples/badge/frontend/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/v3/examples/badge/frontend/tsconfig.json b/v3/examples/badge/frontend/tsconfig.json new file mode 100644 index 000000000..c267ecf24 --- /dev/null +++ b/v3/examples/badge/frontend/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "module": "ESNext", + "lib": ["ESNext", "DOM"], + "moduleResolution": "Node", + "strict": true, + "resolveJsonModule": true, + "isolatedModules": true, + "esModuleInterop": true, + "noEmit": true, + "noUnusedLocals": true, + "noUnusedParameters": false, + "noImplicitAny": false, + "noImplicitReturns": true, + "skipLibCheck": true + }, + "include": ["src"] +} diff --git a/v3/examples/badge/main.go b/v3/examples/badge/main.go new file mode 100644 index 000000000..5bf13588c --- /dev/null +++ b/v3/examples/badge/main.go @@ -0,0 +1,77 @@ +package main + +import ( + "embed" + _ "embed" + "log" + "time" + + "github.com/wailsapp/wails/v3/pkg/application" + "github.com/wailsapp/wails/v3/pkg/services/badge" +) + +// Wails uses Go's `embed` package to embed the frontend files into the binary. +// Any files in the frontend/dist folder will be embedded into the binary and +// made available to the frontend. +// See https://pkg.go.dev/embed for more information. + +//go:embed all:frontend/dist +var assets embed.FS + +// main function serves as the application's entry point. It initializes the application, creates a window, +// and starts a goroutine that emits a time-based event every second. It subsequently runs the application and +// logs any error that might occur. +func main() { + // Create a new Wails application by providing the necessary options. + // Variables 'Name' and 'Description' are for application metadata. + // 'Assets' configures the asset server with the 'FS' variable pointing to the frontend files. + // 'Bind' is a list of Go struct instances. The frontend has access to the methods of these instances. + // 'Mac' options tailor the application when running an macOS. + app := application.New(application.Options{ + Name: "badge", + Description: "A demo of using raw HTML & CSS", + Services: []application.Service{ + application.NewService(badge.New()), + }, + Assets: application.AssetOptions{ + Handler: application.AssetFileServerFS(assets), + }, + Mac: application.MacOptions{ + ApplicationShouldTerminateAfterLastWindowClosed: true, + }, + }) + + // Create a new window with the necessary options. + // 'Title' is the title of the window. + // 'Mac' options tailor the window when running on macOS. + // 'BackgroundColour' is the background colour of the window. + // 'URL' is the URL that will be loaded into the webview. + app.NewWebviewWindowWithOptions(application.WebviewWindowOptions{ + Title: "Window 1", + Mac: application.MacWindow{ + InvisibleTitleBarHeight: 50, + Backdrop: application.MacBackdropTranslucent, + TitleBar: application.MacTitleBarHiddenInset, + }, + BackgroundColour: application.NewRGB(27, 38, 54), + URL: "/", + }) + + // Create a goroutine that emits an event containing the current time every second. + // The frontend can listen to this event and update the UI accordingly. + go func() { + for { + now := time.Now().Format(time.RFC1123) + app.EmitEvent("time", now) + time.Sleep(time.Second) + } + }() + + // Run the application. This blocks until the application has been exited. + err := app.Run() + + // If an error occurred while running the application, log it and exit. + if err != nil { + log.Fatal(err) + } +} diff --git a/v3/pkg/services/badge/badge_windows.go b/v3/pkg/services/badge/badge_windows.go index 76d4069bc..cb8b3406d 100644 --- a/v3/pkg/services/badge/badge_windows.go +++ b/v3/pkg/services/badge/badge_windows.go @@ -99,35 +99,33 @@ func New() *Service { } } -func (d *windowsBadge) Startup(ctx context.Context, options application.ServiceOptions) error { +func (w *windowsBadge) Startup(ctx context.Context, options application.ServiceOptions) error { taskbar, err := newTaskbarList3() if err != nil { return err } - d.taskbar = taskbar + w.taskbar = taskbar - // Don't try to get the window handle here - wait until SetBadge is called return nil } -func (d *windowsBadge) Shutdown() error { +func (w *windowsBadge) Shutdown() error { return nil } -func (d *windowsBadge) SetBadge(label string) error { - if d.taskbar == nil { +func (w *windowsBadge) SetBadge(label string) error { + if w.taskbar == nil { return nil } - // Get the window handle when SetBadge is called, not during startup app := application.Get() if app == nil { - return nil // App not initialized yet + return nil } window := app.CurrentWindow() if window == nil { - return nil // No window available yet + return nil } hwnd, err := window.NativeWindowHandle() @@ -136,7 +134,7 @@ func (d *windowsBadge) SetBadge(label string) error { } if label == "" { - return d.taskbar.SetOverlayIcon(syscall.Handle(hwnd), 0, nil) + return w.taskbar.SetOverlayIcon(syscall.Handle(hwnd), 0, nil) } hicon, err := createBadgeIcon() @@ -145,23 +143,22 @@ func (d *windowsBadge) SetBadge(label string) error { } defer w32.DestroyIcon(hicon) - return d.taskbar.SetOverlayIcon(syscall.Handle(hwnd), syscall.Handle(hicon), nil) + return w.taskbar.SetOverlayIcon(syscall.Handle(hwnd), syscall.Handle(hicon), nil) } -func (d *windowsBadge) RemoveBadge() error { - if d.taskbar == nil { +func (w *windowsBadge) RemoveBadge() error { + if w.taskbar == nil { return nil } - // Get the window handle when SetBadge is called, not during startup app := application.Get() if app == nil { - return nil // App not initialized yet + return nil } window := app.CurrentWindow() if window == nil { - return nil // No window available yet + return nil } hwnd, err := window.NativeWindowHandle() @@ -169,7 +166,7 @@ func (d *windowsBadge) RemoveBadge() error { return err } - return d.taskbar.SetOverlayIcon(syscall.Handle(hwnd), 0, nil) + return w.taskbar.SetOverlayIcon(syscall.Handle(hwnd), 0, nil) } func createBadgeIcon() (uintptr, error) { From f311a33bdd9cd29940c9c119aa75142d5660f474 Mon Sep 17 00:00:00 2001 From: popaprozac Date: Thu, 24 Apr 2025 15:50:55 -0700 Subject: [PATCH 242/374] update changelog --- docs/src/content/docs/changelog.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/content/docs/changelog.mdx b/docs/src/content/docs/changelog.mdx index 5362aa286..fc4031233 100644 --- a/docs/src/content/docs/changelog.mdx +++ b/docs/src/content/docs/changelog.mdx @@ -81,7 +81,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Add Notification support by [@popaprozac](https://github.com/popaprozac) in [#4098](https://github.com/wailsapp/wails/pull/4098) -  Add File Association support for mac by [@wimaha](https://github.com/wimaha) in [#4177](https://github.com/wailsapp/wails/pull/4177) - Add `wails3 tool version` for semantic version bumping by [@leaanthony](https://github.com/leaanthony) -- Add badging support for macOS and Windows by [@popaprozac](https://github.com/popaprozac) in [#]() +- Add badging support for macOS and Windows by [@popaprozac](https://github.com/popaprozac) in [#](https://github.com/wailsapp/wails/pull/4234) ### Fixed - Fixed Windows+Linux Edit Menu issues by [@leaanthony](https://github.com/leaanthony) in [#3f78a3a](https://github.com/wailsapp/wails/commit/3f78a3a8ce7837e8b32242c8edbbed431c68c062) From d1d57c132c88997ea21c15bddbc459eb3f2bf23a Mon Sep 17 00:00:00 2001 From: popaprozac Date: Thu, 24 Apr 2025 16:10:14 -0700 Subject: [PATCH 243/374] rabbit suggestions --- v3/pkg/services/badge/badge_windows.go | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/v3/pkg/services/badge/badge_windows.go b/v3/pkg/services/badge/badge_windows.go index cb8b3406d..c16375f00 100644 --- a/v3/pkg/services/badge/badge_windows.go +++ b/v3/pkg/services/badge/badge_windows.go @@ -17,7 +17,6 @@ import ( var ( ole32 = syscall.NewLazyDLL("ole32.dll") - shobjidl = syscall.NewLazyDLL("shell32.dll") coCreateInstance = ole32.NewProc("CoCreateInstance") ) @@ -59,6 +58,13 @@ type taskbarList3Vtbl struct { } func newTaskbarList3() (*ITaskbarList3, error) { + const COINIT_APARTMENTTHREADED = 0x2 + + coInit := ole32.NewProc("CoInitializeEx") + if hr, _, _ := coInit.Call(0, COINIT_APARTMENTTHREADED); hr != 0 && hr != 0x1 { + return nil, syscall.Errno(hr) + } + var taskbar *ITaskbarList3 hr, _, _ := coCreateInstance.Call( uintptr(unsafe.Pointer(&CLSID_TaskbarList)), @@ -72,6 +78,12 @@ func newTaskbarList3() (*ITaskbarList3, error) { return nil, syscall.Errno(hr) } + if r, _, _ := syscall.SyscallN(taskbar.lpVtbl.HrInit, uintptr(unsafe.Pointer(taskbar))); r != 0 { + syscall.SyscallN(taskbar.lpVtbl.Release, uintptr(unsafe.Pointer(taskbar))) + ole32.NewProc("CoUninitialize").Call() + return nil, syscall.Errno(r) + } + return taskbar, nil } @@ -110,6 +122,11 @@ func (w *windowsBadge) Startup(ctx context.Context, options application.ServiceO } func (w *windowsBadge) Shutdown() error { + if w.taskbar != nil { + syscall.SyscallN(w.taskbar.lpVtbl.Release, uintptr(unsafe.Pointer(w.taskbar))) + ole32.NewProc("CoUninitialize").Call() + } + return nil } @@ -169,7 +186,7 @@ func (w *windowsBadge) RemoveBadge() error { return w.taskbar.SetOverlayIcon(syscall.Handle(hwnd), 0, nil) } -func createBadgeIcon() (uintptr, error) { +func createBadgeIcon() (w32.HICON, error) { const size = 32 img := image.NewRGBA(image.Rect(0, 0, size, size)) @@ -209,5 +226,5 @@ func createBadgeIcon() (uintptr, error) { } hicon, err := w32.CreateSmallHIconFromImage(buf.Bytes()) - return uintptr(hicon), err + return hicon, err } From 7287c1eb5cdccdc148a0bf9ccfc9f1cf9c287724 Mon Sep 17 00:00:00 2001 From: popaprozac Date: Thu, 24 Apr 2025 20:23:28 -0700 Subject: [PATCH 244/374] render label on windows and sensible defaults --- docs/src/content/docs/learn/badges.mdx | 18 ++-- v3/go.mod | 1 + v3/go.sum | 2 + v3/pkg/services/badge/badge_darwin.go | 2 + v3/pkg/services/badge/badge_windows.go | 144 +++++++++++++++++++------ 5 files changed, 122 insertions(+), 45 deletions(-) diff --git a/docs/src/content/docs/learn/badges.mdx b/docs/src/content/docs/learn/badges.mdx index 9c73ccedb..d68bc3366 100644 --- a/docs/src/content/docs/learn/badges.mdx +++ b/docs/src/content/docs/learn/badges.mdx @@ -36,14 +36,14 @@ app := application.New(application.Options{ Set a badge on the application tile/dock icon: ```go +// Set a default badge +badgeService.SetBadge("") + // Set a numeric badge badgeService.SetBadge("3") // Set a text badge badgeService.SetBadge("New") - -// Set a symbol badge -badgeService.SetBadge("●") ``` ### Removing a Badge @@ -52,11 +52,6 @@ Remove the badge from the application icon: ```go badgeService.RemoveBadge() - -// or - -// Set an empty string -badgeService.SetBadge("") ``` ## Platform Considerations @@ -67,9 +62,10 @@ badgeService.SetBadge("") On macOS, badges: - Are displayed directly on the dock icon - - Support both text and numeric values + - Support text values - Automatically handle dark/light mode appearance - Use the standard macOS dock badge styling + - Automatically handle label overflow @@ -78,10 +74,10 @@ badgeService.SetBadge("") On Windows, badges: - Are displayed as an overlay icon in the taskbar - - Currently implemented as a red circle with a white center - - Do not currently support displaying text or numbers + - Support text values - Adapt to Windows theme settings - Require the application to have a window + - Does not handle label overflow diff --git a/v3/go.mod b/v3/go.mod index 947f0495f..2bcf98a79 100644 --- a/v3/go.mod +++ b/v3/go.mod @@ -49,6 +49,7 @@ require ( github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc // indirect github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd // indirect github.com/charmbracelet/x/term v0.2.1 // indirect + github.com/flopp/go-findfont v0.1.0 // indirect github.com/ncruces/go-strftime v0.1.9 // indirect ) diff --git a/v3/go.sum b/v3/go.sum index 2c07fe6c8..c778b0d96 100644 --- a/v3/go.sum +++ b/v3/go.sum @@ -117,6 +117,8 @@ github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= +github.com/flopp/go-findfont v0.1.0 h1:lPn0BymDUtJo+ZkV01VS3661HL6F4qFlkhcJN55u6mU= +github.com/flopp/go-findfont v0.1.0/go.mod h1:wKKxRDjD024Rh7VMwoU90i6ikQRCr+JTHB5n4Ejkqvw= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/gliderlabs/ssh v0.3.8 h1:a4YXD1V7xMF9g5nTkdfnja3Sxy1PVDCj1Zg4Wb8vY6c= diff --git a/v3/pkg/services/badge/badge_darwin.go b/v3/pkg/services/badge/badge_darwin.go index 22969fc16..d61b9ca70 100644 --- a/v3/pkg/services/badge/badge_darwin.go +++ b/v3/pkg/services/badge/badge_darwin.go @@ -45,6 +45,8 @@ func (d *darwinBadge) SetBadge(label string) error { if label != "" { cLabel = C.CString(label) defer C.free(unsafe.Pointer(cLabel)) + } else { + cLabel = C.CString("●") // Default badge character } C.setBadge(cLabel) return nil diff --git a/v3/pkg/services/badge/badge_windows.go b/v3/pkg/services/badge/badge_windows.go index c16375f00..e6b8e4061 100644 --- a/v3/pkg/services/badge/badge_windows.go +++ b/v3/pkg/services/badge/badge_windows.go @@ -8,11 +8,17 @@ import ( "image" "image/color" "image/png" + "os" + "strings" "syscall" "unsafe" + "github.com/flopp/go-findfont" "github.com/wailsapp/wails/v3/pkg/application" "github.com/wailsapp/wails/v3/pkg/w32" + "golang.org/x/image/font" + "golang.org/x/image/font/opentype" + "golang.org/x/image/math/fixed" ) var ( @@ -102,7 +108,9 @@ func (t *ITaskbarList3) SetOverlayIcon(hwnd syscall.Handle, hIcon syscall.Handle } type windowsBadge struct { - taskbar *ITaskbarList3 + taskbar *ITaskbarList3 + badgeImg *image.RGBA + badgeSize int } func New() *Service { @@ -150,13 +158,19 @@ func (w *windowsBadge) SetBadge(label string) error { return err } - if label == "" { - return w.taskbar.SetOverlayIcon(syscall.Handle(hwnd), 0, nil) - } + w.createBadge() - hicon, err := createBadgeIcon() - if err != nil { - return err + var hicon w32.HICON + if label == "" { + hicon, err = w.createBadgeIcon() + if err != nil { + return err + } + } else { + hicon, err = w.createBadgeIconWithText(label) + if err != nil { + return err + } } defer w32.DestroyIcon(hicon) @@ -186,17 +200,99 @@ func (w *windowsBadge) RemoveBadge() error { return w.taskbar.SetOverlayIcon(syscall.Handle(hwnd), 0, nil) } -func createBadgeIcon() (w32.HICON, error) { - const size = 32 +func (w *windowsBadge) createBadgeIcon() (w32.HICON, error) { + radius := w.badgeSize / 2 + centerX, centerY := radius, radius + white := color.RGBA{255, 255, 255, 255} + innerRadius := w.badgeSize / 5 - img := image.NewRGBA(image.Rect(0, 0, size, size)) + for y := 0; y < w.badgeSize; y++ { + for x := 0; x < w.badgeSize; x++ { + dx := float64(x - centerX) + dy := float64(y - centerY) + + if dx*dx+dy*dy < float64(innerRadius*innerRadius) { + w.badgeImg.Set(x, y, white) + } + } + } + + var buf bytes.Buffer + if err := png.Encode(&buf, w.badgeImg); err != nil { + return 0, err + } + + hicon, err := w32.CreateSmallHIconFromImage(buf.Bytes()) + return hicon, err +} + +func (w *windowsBadge) createBadgeIconWithText(label string) (w32.HICON, error) { + fontPath := "" + for _, path := range findfont.List() { + if strings.Contains(strings.ToLower(path), "segoeuib.ttf") || // Segoe UI Bold + strings.Contains(strings.ToLower(path), "arialbd.ttf") { + fontPath = path + break + } + } + if fontPath == "" { + return w.createBadgeIcon() + } + + fontBytes, err := os.ReadFile(fontPath) + if err != nil { + return 0, err + } + + ttf, err := opentype.Parse(fontBytes) + if err != nil { + return 0, err + } + + fontSize := 18.0 + if len(label) > 1 { + fontSize = 14.0 + } + + face, err := opentype.NewFace(ttf, &opentype.FaceOptions{ + Size: fontSize, + DPI: 96, + Hinting: font.HintingFull, + }) + if err != nil { + return 0, err + } + defer face.Close() + + d := &font.Drawer{ + Dst: w.badgeImg, + Src: image.NewUniform(color.White), + Face: face, + } + + textWidth := d.MeasureString(label).Ceil() + d.Dot = fixed.P((w.badgeSize-textWidth)/2, int(float64(w.badgeSize)/2+fontSize/2)) + d.DrawString(label) + + var buf bytes.Buffer + if err := png.Encode(&buf, w.badgeImg); err != nil { + return 0, err + } + + return w32.CreateSmallHIconFromImage(buf.Bytes()) +} + +func (w *windowsBadge) createBadge() { + w.badgeSize = 32 + + img := image.NewRGBA(image.Rect(0, 0, w.badgeSize, w.badgeSize)) red := color.RGBA{255, 0, 0, 255} - radius := size / 2 + radius := w.badgeSize / 2 centerX, centerY := radius, radius - for y := 0; y < size; y++ { - for x := 0; x < size; x++ { + for y := 0; y < w.badgeSize; y++ { + for x := 0; x < w.badgeSize; x++ { dx := float64(x - centerX) dy := float64(y - centerY) @@ -206,25 +302,5 @@ func createBadgeIcon() (w32.HICON, error) { } } - white := color.RGBA{255, 255, 255, 255} - innerRadius := size / 5 - - for y := 0; y < size; y++ { - for x := 0; x < size; x++ { - dx := float64(x - centerX) - dy := float64(y - centerY) - - if dx*dx+dy*dy < float64(innerRadius*innerRadius) { - img.Set(x, y, white) - } - } - } - - var buf bytes.Buffer - if err := png.Encode(&buf, img); err != nil { - return 0, err - } - - hicon, err := w32.CreateSmallHIconFromImage(buf.Bytes()) - return hicon, err + w.badgeImg = img } From c0a83efe6d6fa86f0a6e59a526f2b5752d1f08dc Mon Sep 17 00:00:00 2001 From: Zach Botterman <6074435+popaprozac@users.noreply.github.com> Date: Thu, 24 Apr 2025 20:34:15 -0700 Subject: [PATCH 245/374] Update docs/src/content/docs/learn/badges.mdx Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- docs/src/content/docs/learn/badges.mdx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/src/content/docs/learn/badges.mdx b/docs/src/content/docs/learn/badges.mdx index d68bc3366..3e6e136cf 100644 --- a/docs/src/content/docs/learn/badges.mdx +++ b/docs/src/content/docs/learn/badges.mdx @@ -14,9 +14,8 @@ Wails provides a cross-platform badge service for desktop applications. This ser First, initialize the badge service: -```go import "github.com/wailsapp/wails/v3/pkg/application" -import "github.com/wailsapp/wails/v3/services/badge" +import "github.com/wailsapp/wails/v3/pkg/services/badge" // Create a new badge service badgeService := badge.New() @@ -27,7 +26,6 @@ app := application.New(application.Options{ application.NewService(badgeService), }, }) -``` ## Badge Operations From 59cc71bdbba58106468e534cbf90e5c47149976e Mon Sep 17 00:00:00 2001 From: popaprozac Date: Thu, 24 Apr 2025 20:45:50 -0700 Subject: [PATCH 246/374] fix code block --- docs/src/content/docs/learn/badges.mdx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/src/content/docs/learn/badges.mdx b/docs/src/content/docs/learn/badges.mdx index 3e6e136cf..3a579adc2 100644 --- a/docs/src/content/docs/learn/badges.mdx +++ b/docs/src/content/docs/learn/badges.mdx @@ -14,6 +14,7 @@ Wails provides a cross-platform badge service for desktop applications. This ser First, initialize the badge service: +```go import "github.com/wailsapp/wails/v3/pkg/application" import "github.com/wailsapp/wails/v3/pkg/services/badge" @@ -26,6 +27,7 @@ app := application.New(application.Options{ application.NewService(badgeService), }, }) +``` ## Badge Operations From 9fa596780b9183560349e9edc22812cd383cee43 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Fri, 25 Apr 2025 14:23:24 +1000 Subject: [PATCH 247/374] Include assets in example --- .../wails/v3/pkg/services/badge/index.ts | 7 + .../wails/v3/pkg/services/badge/service.ts | 21 + .../badge/frontend/dist/Inter-Medium.ttf | Bin 0 -> 315132 bytes .../frontend/dist/assets/index-BguIgRNQ.js | 1343 +++++++++++++++++ v3/examples/badge/frontend/dist/index.html | 36 + v3/examples/badge/frontend/dist/style.css | 157 ++ .../badge/frontend/dist/typescript.svg | 1 + v3/examples/badge/frontend/dist/wails.png | Bin 0 -> 9057 bytes 8 files changed, 1565 insertions(+) create mode 100644 v3/examples/badge/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/badge/index.ts create mode 100644 v3/examples/badge/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/badge/service.ts create mode 100644 v3/examples/badge/frontend/dist/Inter-Medium.ttf create mode 100644 v3/examples/badge/frontend/dist/assets/index-BguIgRNQ.js create mode 100644 v3/examples/badge/frontend/dist/index.html create mode 100644 v3/examples/badge/frontend/dist/style.css create mode 100644 v3/examples/badge/frontend/dist/typescript.svg create mode 100644 v3/examples/badge/frontend/dist/wails.png diff --git a/v3/examples/badge/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/badge/index.ts b/v3/examples/badge/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/badge/index.ts new file mode 100644 index 000000000..fd900b4cd --- /dev/null +++ b/v3/examples/badge/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/badge/index.ts @@ -0,0 +1,7 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +import * as Service from "./service.js"; +export { + Service +}; diff --git a/v3/examples/badge/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/badge/service.ts b/v3/examples/badge/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/badge/service.ts new file mode 100644 index 000000000..abd6cd0a3 --- /dev/null +++ b/v3/examples/badge/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/badge/service.ts @@ -0,0 +1,21 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +/** + * Service represents the notifications service + * @module + */ + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import {Call as $Call, Create as $Create} from "@wailsio/runtime"; + +export function RemoveBadge(): Promise & { cancel(): void } { + let $resultPromise = $Call.ByID(2633565570) as any; + return $resultPromise; +} + +export function SetBadge(label: string): Promise & { cancel(): void } { + let $resultPromise = $Call.ByID(3052354152, label) as any; + return $resultPromise; +} diff --git a/v3/examples/badge/frontend/dist/Inter-Medium.ttf b/v3/examples/badge/frontend/dist/Inter-Medium.ttf new file mode 100644 index 0000000000000000000000000000000000000000..a01f3777a6fc284b7a720c0f8248a27066389ef9 GIT binary patch literal 315132 zcmd>{3Ajzw|M0(S?X!n-?sds<&AMdHJY`De%rlit*Gxz*k|ZQaMWm8sCL|H5Orgje zLX;sYN}^G@hWmcjK4)L_tKaY+-sgFr_ul8T*4k_QuJ8KpwfA0opS?wiNG6<+$lZ18 z)h}DV>>3eWoroNFw`kt_=)7a6M2)O0s^ph46$l{1e>k6gWyQwEyWNY9Gz_3HOX&vyAf z)S{Q>5MAJ8?;gqBOFo}`FX>%Kuhg4}e4BH=#y0Xu!QTA`56g7y>@Ol2dy5p=(eJ@- z$>AZbE{NPwf$hEhlZOqA#4CsVv?oaelKb~){O#aW5vPqvIP<^B5&SN zzrXqG{ycsElt;op`!QDN*v#5b&hDJC`frju&adR?&uep=z_GS14*mY-l@WRR#%E^J z5gn_;)b6n*lGS$$ihj6P@4+ggNJ_r}gHSL1OfsF!hHQL}O9s)M+nsb6q^Qx|dn(6vPA zI=TUFBi#nKoleH>rm-LWq<#hWRsAaNOuY_wquz}Bk=}y4L+`}htv|#4+^Q|gs%JIC zZDKuyJJ=e6`-n9Tcf7Rn$I0&?vs26| zhFiiZfm_XC?3_kUBivR_Pu$*4Z`=o*2XF^C18^U9hKc1o;ygllxHE$A80QJxxz0jS zuIEyxThJ|tTgUBy+u7}m`?&iA?o;klxKF!J<38g~!kywy!JX<(#hvD&2lrK%QFa%* zi*es@m*OsSm*cK3;-OD(xHp{e)}Vk zj}jgoW^}?YgkQj&9-fZ-es~?J8^W6i?+WiGygz&h_el5{?w4U|4u2c|7WaG@4Tpb< z&3F~`P%|^Jmxw&?#K*!)a@fDd!depS)3LB6rR?`&;m{3vY^h|U1HT@J_`b2QD{bt= zSlAQKPKbrWk`y{03&#=O6AQ=R5YC{ItYxwI1gT)5Z@>Ob60rux!na7g)jbx@d_A7& zF41ZhjaN$YSmk12Emid&v9Kle_1m#?vid~S~a&&R@fB%ch5h4XS)iH$F^BublD{H+{eYRAG!9CZrB!ugRWM=V@`kdUjN zBuh7WfLsk_FyVgEhwba}^<)_FgGi|@50cvbPdWcF{jc){v8|mem2h13VpUJrSMT9Ty>3?!}(7+ojH-SDu#-J4JfsYA$L->-WxHJI`PNg0eR zrk)%OnM*bDYd9+u%CMXc}>W)X;S;MZTi-o7KTVyUt%M{ zpqpyy=F2mb5@zI$)P2a=gfb8NwcIE}lbcEgd7JyvnwADob^xWW$D|N5?1t^0zAS_O zQtAi&vUMquf)xFc*ywzS->W{9Gc5#~G(9rbkmBnx1>HsEAMVR+MkEQ{8BLp>rLbir zGrCS9&XgYD_t!`p9oeqL4kG72YyWz`jLr6f!IZesh8y~=80{Nt9gJqGN@@O6kj9Lc zv5gcd1xCxI{5E@$-W-c)!v1aS(MVgL6eDkvv?kP((8K7#*oWzf$r0U;dyvc6hZ(zQ zpG@0PYchFTv)7wZyDs_ln$4cljk3`iN|37^TSfn*nUt7Tjja8l6mAc+*oxXs%n;lp+B0Ju?NN%a&mjNx zQA%QOYv@ZAwTBy1qIx#6N9RXVm)WNV`Ln4R6=O?*1lLQJyvZW|tkd#HTL!IG;ff$? zK_%HvmWsrckxH~t1`Xbrs}-Zz6sjSqu?f?oo7-qboY_;%TtDcBTuC=cQU@IjWS%m1 z7|f>SXw48EVPi4Z+enfY7y8oNVG@2$=8*Bb|Yth z#wE~FX<80?P)sDQpt&yPN^GUn|6ii|e_rpkJ?_f1l28#`I0oDP{d)d+`M8MGzY({b zoVDP42V>h{^2j=f$(R9Lo&d7Uiy12EF<#m^3% zk;mAc3tNaQ3?C4lt$)Av9sZ_hKH0z`#ŹD@)<7ltOtn$SSm;LMTrPEA?sR43d= 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�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 literal 0 HcmV?d00001 diff --git a/v3/examples/badge/frontend/dist/assets/index-BguIgRNQ.js b/v3/examples/badge/frontend/dist/assets/index-BguIgRNQ.js new file mode 100644 index 000000000..2327d5519 --- /dev/null +++ b/v3/examples/badge/frontend/dist/assets/index-BguIgRNQ.js @@ -0,0 +1,1343 @@ +(function polyfill() { + const relList = document.createElement("link").relList; + if (relList && relList.supports && relList.supports("modulepreload")) { + return; + } + for (const link of document.querySelectorAll('link[rel="modulepreload"]')) { + processPreload(link); + } + new MutationObserver((mutations) => { + for (const mutation of mutations) { + if (mutation.type !== "childList") { + continue; + } + for (const node of mutation.addedNodes) { + if (node.tagName === "LINK" && node.rel === "modulepreload") + processPreload(node); + } + } + }).observe(document, { childList: true, subtree: true }); + function getFetchOpts(link) { + const fetchOpts = {}; + if (link.integrity) fetchOpts.integrity = link.integrity; + if (link.referrerPolicy) fetchOpts.referrerPolicy = link.referrerPolicy; + if (link.crossOrigin === "use-credentials") + fetchOpts.credentials = "include"; + else if (link.crossOrigin === "anonymous") fetchOpts.credentials = "omit"; + else fetchOpts.credentials = "same-origin"; + return fetchOpts; + } + function processPreload(link) { + if (link.ep) + return; + link.ep = true; + const fetchOpts = getFetchOpts(link); + fetch(link.href, fetchOpts); + } +})(); +const urlAlphabet = "useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict"; +function nanoid(size = 21) { + let id = ""; + let i = size | 0; + while (i--) { + id += urlAlphabet[Math.random() * 64 | 0]; + } + return id; +} +const runtimeURL = window.location.origin + "/wails/runtime"; +const objectNames = Object.freeze({ + Call: 0, + Clipboard: 1, + Application: 2, + Events: 3, + ContextMenu: 4, + Dialog: 5, + Window: 6, + Screens: 7, + System: 8, + Browser: 9, + CancelCall: 10 +}); +let clientId = nanoid(); +function newRuntimeCaller(object, windowName = "") { + return function(method, args = null) { + return runtimeCallWithID(object, method, windowName, args); + }; +} +async function runtimeCallWithID(objectID, method, windowName, args) { + var _a2, _b; + let url = new URL(runtimeURL); + url.searchParams.append("object", objectID.toString()); + url.searchParams.append("method", method.toString()); + if (args) { + url.searchParams.append("args", JSON.stringify(args)); + } + let headers = { + ["x-wails-client-id"]: clientId + }; + if (windowName) { + headers["x-wails-window-name"] = windowName; + } + let response = await fetch(url, { headers }); + if (!response.ok) { + throw new Error(await response.text()); + } + if (((_b = (_a2 = response.headers.get("Content-Type")) === null || _a2 === void 0 ? void 0 : _a2.indexOf("application/json")) !== null && _b !== void 0 ? _b : -1) !== -1) { + return response.json(); + } else { + return response.text(); + } +} +newRuntimeCaller(objectNames.System); +const _invoke = function() { + var _a2, _b, _c, _d, _e; + try { + if ((_b = (_a2 = window.chrome) === null || _a2 === void 0 ? void 0 : _a2.webview) === null || _b === void 0 ? void 0 : _b.postMessage) { + return window.chrome.webview.postMessage.bind(window.chrome.webview); + } else if ((_e = (_d = (_c = window.webkit) === null || _c === void 0 ? void 0 : _c.messageHandlers) === null || _d === void 0 ? void 0 : _d["external"]) === null || _e === void 0 ? void 0 : _e.postMessage) { + return window.webkit.messageHandlers["external"].postMessage.bind(window.webkit.messageHandlers["external"]); + } + } catch (e) { + } + console.warn("\n%c⚠️ Browser Environment Detected %c\n\n%cOnly UI previews are available in the browser. For full functionality, please run the application in desktop mode.\nMore information at: https://v3.wails.io/learn/build/#using-a-browser-for-development\n", "background: #ffffff; color: #000000; font-weight: bold; padding: 4px 8px; border-radius: 4px; border: 2px solid #000000;", "background: transparent;", "color: #ffffff; font-style: italic; font-weight: bold;"); + return null; +}(); +function invoke(msg) { + _invoke === null || _invoke === void 0 ? void 0 : _invoke(msg); +} +function IsWindows() { + return window._wails.environment.OS === "windows"; +} +function IsDebug() { + return Boolean(window._wails.environment.Debug); +} +function canTrackButtons() { + return new MouseEvent("mousedown").buttons === 0; +} +function eventTarget(event) { + var _a2; + if (event.target instanceof HTMLElement) { + return event.target; + } else if (!(event.target instanceof HTMLElement) && event.target instanceof Node) { + return (_a2 = event.target.parentElement) !== null && _a2 !== void 0 ? _a2 : document.body; + } else { + return document.body; + } +} +document.addEventListener("DOMContentLoaded", () => { +}); +window.addEventListener("contextmenu", contextMenuHandler); +const call$1 = newRuntimeCaller(objectNames.ContextMenu); +const ContextMenuOpen = 0; +function openContextMenu(id, x, y, data) { + void call$1(ContextMenuOpen, { id, x, y, data }); +} +function contextMenuHandler(event) { + const target = eventTarget(event); + const customContextMenu = window.getComputedStyle(target).getPropertyValue("--custom-contextmenu").trim(); + if (customContextMenu) { + event.preventDefault(); + const data = window.getComputedStyle(target).getPropertyValue("--custom-contextmenu-data"); + openContextMenu(customContextMenu, event.clientX, event.clientY, data); + } else { + processDefaultContextMenu(event, target); + } +} +function processDefaultContextMenu(event, target) { + if (IsDebug()) { + return; + } + switch (window.getComputedStyle(target).getPropertyValue("--default-contextmenu").trim()) { + case "show": + return; + case "hide": + event.preventDefault(); + return; + } + if (target.isContentEditable) { + return; + } + const selection = window.getSelection(); + const hasSelection = selection && selection.toString().length > 0; + if (hasSelection) { + for (let i = 0; i < selection.rangeCount; i++) { + const range = selection.getRangeAt(i); + const rects = range.getClientRects(); + for (let j = 0; j < rects.length; j++) { + const rect = rects[j]; + if (document.elementFromPoint(rect.left, rect.top) === target) { + return; + } + } + } + } + if (target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement) { + if (hasSelection || !target.readOnly && !target.disabled) { + return; + } + } + event.preventDefault(); +} +function GetFlag(key) { + try { + return window._wails.flags[key]; + } catch (e) { + throw new Error("Unable to retrieve flag '" + key + "': " + e, { cause: e }); + } +} +let canDrag = false; +let dragging = false; +let resizable = false; +let canResize = false; +let resizing = false; +let resizeEdge = ""; +let defaultCursor = "auto"; +let buttons = 0; +const buttonsTracked = canTrackButtons(); +window._wails = window._wails || {}; +window._wails.setResizable = (value) => { + resizable = value; + if (!resizable) { + canResize = resizing = false; + setResize(); + } +}; +window.addEventListener("mousedown", update, { capture: true }); +window.addEventListener("mousemove", update, { capture: true }); +window.addEventListener("mouseup", update, { capture: true }); +for (const ev of ["click", "contextmenu", "dblclick"]) { + window.addEventListener(ev, suppressEvent, { capture: true }); +} +function suppressEvent(event) { + if (dragging || resizing) { + event.stopImmediatePropagation(); + event.stopPropagation(); + event.preventDefault(); + } +} +const MouseDown = 0; +const MouseUp = 1; +const MouseMove = 2; +function update(event) { + let eventType, eventButtons = event.buttons; + switch (event.type) { + case "mousedown": + eventType = MouseDown; + if (!buttonsTracked) { + eventButtons = buttons | 1 << event.button; + } + break; + case "mouseup": + eventType = MouseUp; + if (!buttonsTracked) { + eventButtons = buttons & ~(1 << event.button); + } + break; + default: + eventType = MouseMove; + if (!buttonsTracked) { + eventButtons = buttons; + } + break; + } + let released = buttons & ~eventButtons; + let pressed = eventButtons & ~buttons; + buttons = eventButtons; + if (eventType === MouseDown && !(pressed & event.button)) { + released |= 1 << event.button; + pressed |= 1 << event.button; + } + if (eventType !== MouseMove && resizing || dragging && (eventType === MouseDown || event.button !== 0)) { + event.stopImmediatePropagation(); + event.stopPropagation(); + event.preventDefault(); + } + if (released & 1) { + primaryUp(); + } + if (pressed & 1) { + primaryDown(event); + } + if (eventType === MouseMove) { + onMouseMove(event); + } +} +function primaryDown(event) { + canDrag = false; + canResize = false; + if (!IsWindows()) { + if (event.type === "mousedown" && event.button === 0 && event.detail !== 1) { + return; + } + } + if (resizeEdge) { + canResize = true; + return; + } + const target = eventTarget(event); + const style = window.getComputedStyle(target); + canDrag = style.getPropertyValue("--wails-draggable").trim() === "drag" && (event.offsetX - parseFloat(style.paddingLeft) < target.clientWidth && event.offsetY - parseFloat(style.paddingTop) < target.clientHeight); +} +function primaryUp(event) { + canDrag = false; + dragging = false; + canResize = false; + resizing = false; +} +const cursorForEdge = Object.freeze({ + "se-resize": "nwse-resize", + "sw-resize": "nesw-resize", + "nw-resize": "nwse-resize", + "ne-resize": "nesw-resize", + "w-resize": "ew-resize", + "n-resize": "ns-resize", + "s-resize": "ns-resize", + "e-resize": "ew-resize" +}); +function setResize(edge) { + if (edge) { + if (!resizeEdge) { + defaultCursor = document.body.style.cursor; + } + document.body.style.cursor = cursorForEdge[edge]; + } else if (!edge && resizeEdge) { + document.body.style.cursor = defaultCursor; + } + resizeEdge = edge || ""; +} +function onMouseMove(event) { + if (canResize && resizeEdge) { + resizing = true; + invoke("wails:resize:" + resizeEdge); + } else if (canDrag) { + dragging = true; + invoke("wails:drag"); + } + if (dragging || resizing) { + canDrag = canResize = false; + return; + } + if (!resizable || !IsWindows()) { + if (resizeEdge) { + setResize(); + } + return; + } + const resizeHandleHeight = GetFlag("system.resizeHandleHeight") || 5; + const resizeHandleWidth = GetFlag("system.resizeHandleWidth") || 5; + const cornerExtra = GetFlag("resizeCornerExtra") || 10; + const rightBorder = window.outerWidth - event.clientX < resizeHandleWidth; + const leftBorder = event.clientX < resizeHandleWidth; + const topBorder = event.clientY < resizeHandleHeight; + const bottomBorder = window.outerHeight - event.clientY < resizeHandleHeight; + const rightCorner = window.outerWidth - event.clientX < resizeHandleWidth + cornerExtra; + const leftCorner = event.clientX < resizeHandleWidth + cornerExtra; + const topCorner = event.clientY < resizeHandleHeight + cornerExtra; + const bottomCorner = window.outerHeight - event.clientY < resizeHandleHeight + cornerExtra; + if (!leftCorner && !topCorner && !bottomCorner && !rightCorner) { + setResize(); + } else if (rightCorner && bottomCorner) + setResize("se-resize"); + else if (leftCorner && bottomCorner) + setResize("sw-resize"); + else if (leftCorner && topCorner) + setResize("nw-resize"); + else if (topCorner && rightCorner) + setResize("ne-resize"); + else if (leftBorder) + setResize("w-resize"); + else if (topBorder) + setResize("n-resize"); + else if (bottomBorder) + setResize("s-resize"); + else if (rightBorder) + setResize("e-resize"); + else + setResize(); +} +var fnToStr = Function.prototype.toString; +var reflectApply = typeof Reflect === "object" && Reflect !== null && Reflect.apply; +var badArrayLike; +var isCallableMarker; +if (typeof reflectApply === "function" && typeof Object.defineProperty === "function") { + try { + badArrayLike = Object.defineProperty({}, "length", { + get: function() { + throw isCallableMarker; + } + }); + isCallableMarker = {}; + reflectApply(function() { + throw 42; + }, null, badArrayLike); + } catch (_) { + if (_ !== isCallableMarker) { + reflectApply = null; + } + } +} else { + reflectApply = null; +} +var constructorRegex = /^\s*class\b/; +var isES6ClassFn = function isES6ClassFunction(value) { + try { + var fnStr = fnToStr.call(value); + return constructorRegex.test(fnStr); + } catch (e) { + return false; + } +}; +var tryFunctionObject = function tryFunctionToStr(value) { + try { + if (isES6ClassFn(value)) { + return false; + } + fnToStr.call(value); + return true; + } catch (e) { + return false; + } +}; +var toStr = Object.prototype.toString; +var objectClass = "[object Object]"; +var fnClass = "[object Function]"; +var genClass = "[object GeneratorFunction]"; +var ddaClass = "[object HTMLAllCollection]"; +var ddaClass2 = "[object HTML document.all class]"; +var ddaClass3 = "[object HTMLCollection]"; +var hasToStringTag = typeof Symbol === "function" && !!Symbol.toStringTag; +var isIE68 = !(0 in [,]); +var isDDA = function isDocumentDotAll() { + return false; +}; +if (typeof document === "object") { + var all = document.all; + if (toStr.call(all) === toStr.call(document.all)) { + isDDA = function isDocumentDotAll2(value) { + if ((isIE68 || !value) && (typeof value === "undefined" || typeof value === "object")) { + try { + var str = toStr.call(value); + return (str === ddaClass || str === ddaClass2 || str === ddaClass3 || str === objectClass) && value("") == null; + } catch (e) { + } + } + return false; + }; + } +} +function isCallableRefApply(value) { + if (isDDA(value)) { + return true; + } + if (!value) { + return false; + } + if (typeof value !== "function" && typeof value !== "object") { + return false; + } + try { + reflectApply(value, null, badArrayLike); + } catch (e) { + if (e !== isCallableMarker) { + return false; + } + } + return !isES6ClassFn(value) && tryFunctionObject(value); +} +function isCallableNoRefApply(value) { + if (isDDA(value)) { + return true; + } + if (!value) { + return false; + } + if (typeof value !== "function" && typeof value !== "object") { + return false; + } + if (hasToStringTag) { + return tryFunctionObject(value); + } + if (isES6ClassFn(value)) { + return false; + } + var strClass = toStr.call(value); + if (strClass !== fnClass && strClass !== genClass && !/^\[object HTML/.test(strClass)) { + return false; + } + return tryFunctionObject(value); +} +const isCallable = reflectApply ? isCallableRefApply : isCallableNoRefApply; +var _a; +class CancelError extends Error { + /** + * Constructs a new `CancelError` instance. + * @param message - The error message. + * @param options - Options to be forwarded to the Error constructor. + */ + constructor(message, options) { + super(message, options); + this.name = "CancelError"; + } +} +class CancelledRejectionError extends Error { + /** + * Constructs a new `CancelledRejectionError` instance. + * @param promise - The promise that caused the error originally. + * @param reason - The rejection reason. + * @param info - An optional informative message specifying the circumstances in which the error was thrown. + * Defaults to the string `"Unhandled rejection in cancelled promise."`. + */ + constructor(promise, reason, info) { + super((info !== null && info !== void 0 ? info : "Unhandled rejection in cancelled promise.") + " Reason: " + errorMessage(reason), { cause: reason }); + this.promise = promise; + this.name = "CancelledRejectionError"; + } +} +const barrierSym = Symbol("barrier"); +const cancelImplSym = Symbol("cancelImpl"); +const species = (_a = Symbol.species) !== null && _a !== void 0 ? _a : Symbol("speciesPolyfill"); +class CancellablePromise extends Promise { + /** + * Creates a new `CancellablePromise`. + * + * @param executor - A callback used to initialize the promise. This callback is passed two arguments: + * a `resolve` callback used to resolve the promise with a value + * or the result of another promise (possibly cancellable), + * and a `reject` callback used to reject the promise with a provided reason or error. + * If the value provided to the `resolve` callback is a thenable _and_ cancellable object + * (it has a `then` _and_ a `cancel` method), + * cancellation requests will be forwarded to that object and the oncancelled will not be invoked anymore. + * If any one of the two callbacks is called _after_ the promise has been cancelled, + * the provided values will be cancelled and resolved as usual, + * but their results will be discarded. + * However, if the resolution process ultimately ends up in a rejection + * that is not due to cancellation, the rejection reason + * will be wrapped in a {@link CancelledRejectionError} + * and bubbled up as an unhandled rejection. + * @param oncancelled - It is the caller's responsibility to ensure that any operation + * started by the executor is properly halted upon cancellation. + * This optional callback can be used to that purpose. + * It will be called _synchronously_ with a cancellation cause + * when cancellation is requested, _after_ the promise has already rejected + * with a {@link CancelError}, but _before_ + * any {@link then}/{@link catch}/{@link finally} callback runs. + * If the callback returns a thenable, the promise returned from {@link cancel} + * will only fulfill after the former has settled. + * Unhandled exceptions or rejections from the callback will be wrapped + * in a {@link CancelledRejectionError} and bubbled up as unhandled rejections. + * If the `resolve` callback is called before cancellation with a cancellable promise, + * cancellation requests on this promise will be diverted to that promise, + * and the original `oncancelled` callback will be discarded. + */ + constructor(executor, oncancelled) { + let resolve; + let reject; + super((res, rej) => { + resolve = res; + reject = rej; + }); + if (this.constructor[species] !== Promise) { + throw new TypeError("CancellablePromise does not support transparent subclassing. Please refrain from overriding the [Symbol.species] static property."); + } + let promise = { + promise: this, + resolve, + reject, + get oncancelled() { + return oncancelled !== null && oncancelled !== void 0 ? oncancelled : null; + }, + set oncancelled(cb) { + oncancelled = cb !== null && cb !== void 0 ? cb : void 0; + } + }; + const state = { + get root() { + return state; + }, + resolving: false, + settled: false + }; + void Object.defineProperties(this, { + [barrierSym]: { + configurable: false, + enumerable: false, + writable: true, + value: null + }, + [cancelImplSym]: { + configurable: false, + enumerable: false, + writable: false, + value: cancellerFor(promise, state) + } + }); + const rejector = rejectorFor(promise, state); + try { + executor(resolverFor(promise, state), rejector); + } catch (err) { + if (state.resolving) { + console.log("Unhandled exception in CancellablePromise executor.", err); + } else { + rejector(err); + } + } + } + /** + * Cancels immediately the execution of the operation associated with this promise. + * The promise rejects with a {@link CancelError} instance as reason, + * with the {@link CancelError#cause} property set to the given argument, if any. + * + * Has no effect if called after the promise has already settled; + * repeated calls in particular are safe, but only the first one + * will set the cancellation cause. + * + * The `CancelError` exception _need not_ be handled explicitly _on the promises that are being cancelled:_ + * cancelling a promise with no attached rejection handler does not trigger an unhandled rejection event. + * Therefore, the following idioms are all equally correct: + * ```ts + * new CancellablePromise((resolve, reject) => { ... }).cancel(); + * new CancellablePromise((resolve, reject) => { ... }).then(...).cancel(); + * new CancellablePromise((resolve, reject) => { ... }).then(...).catch(...).cancel(); + * ``` + * Whenever some cancelled promise in a chain rejects with a `CancelError` + * with the same cancellation cause as itself, the error will be discarded silently. + * However, the `CancelError` _will still be delivered_ to all attached rejection handlers + * added by {@link then} and related methods: + * ```ts + * let cancellable = new CancellablePromise((resolve, reject) => { ... }); + * cancellable.then(() => { ... }).catch(console.log); + * cancellable.cancel(); // A CancelError is printed to the console. + * ``` + * If the `CancelError` is not handled downstream by the time it reaches + * a _non-cancelled_ promise, it _will_ trigger an unhandled rejection event, + * just like normal rejections would: + * ```ts + * let cancellable = new CancellablePromise((resolve, reject) => { ... }); + * let chained = cancellable.then(() => { ... }).then(() => { ... }); // No catch... + * cancellable.cancel(); // Unhandled rejection event on chained! + * ``` + * Therefore, it is important to either cancel whole promise chains from their tail, + * as shown in the correct idioms above, or take care of handling errors everywhere. + * + * @returns A cancellable promise that _fulfills_ after the cancel callback (if any) + * and all handlers attached up to the call to cancel have run. + * If the cancel callback returns a thenable, the promise returned by `cancel` + * will also wait for that thenable to settle. + * This enables callers to wait for the cancelled operation to terminate + * without being forced to handle potential errors at the call site. + * ```ts + * cancellable.cancel().then(() => { + * // Cleanup finished, it's safe to do something else. + * }, (err) => { + * // Unreachable: the promise returned from cancel will never reject. + * }); + * ``` + * Note that the returned promise will _not_ handle implicitly any rejection + * that might have occurred already in the cancelled chain. + * It will just track whether registered handlers have been executed or not. + * Therefore, unhandled rejections will never be silently handled by calling cancel. + */ + cancel(cause) { + return new CancellablePromise((resolve) => { + Promise.all([ + this[cancelImplSym](new CancelError("Promise cancelled.", { cause })), + currentBarrier(this) + ]).then(() => resolve(), () => resolve()); + }); + } + /** + * Binds promise cancellation to the abort event of the given {@link AbortSignal}. + * If the signal has already aborted, the promise will be cancelled immediately. + * When either condition is verified, the cancellation cause will be set + * to the signal's abort reason (see {@link AbortSignal#reason}). + * + * Has no effect if called (or if the signal aborts) _after_ the promise has already settled. + * Only the first signal to abort will set the cancellation cause. + * + * For more details about the cancellation process, + * see {@link cancel} and the `CancellablePromise` constructor. + * + * This method enables `await`ing cancellable promises without having + * to store them for future cancellation, e.g.: + * ```ts + * await longRunningOperation().cancelOn(signal); + * ``` + * instead of: + * ```ts + * let promiseToBeCancelled = longRunningOperation(); + * await promiseToBeCancelled; + * ``` + * + * @returns This promise, for method chaining. + */ + cancelOn(signal) { + if (signal.aborted) { + void this.cancel(signal.reason); + } else { + signal.addEventListener("abort", () => void this.cancel(signal.reason), { capture: true }); + } + return this; + } + /** + * Attaches callbacks for the resolution and/or rejection of the `CancellablePromise`. + * + * The optional `oncancelled` argument will be invoked when the returned promise is cancelled, + * with the same semantics as the `oncancelled` argument of the constructor. + * When the parent promise rejects or is cancelled, the `onrejected` callback will run, + * _even after the returned promise has been cancelled:_ + * in that case, should it reject or throw, the reason will be wrapped + * in a {@link CancelledRejectionError} and bubbled up as an unhandled rejection. + * + * @param onfulfilled The callback to execute when the Promise is resolved. + * @param onrejected The callback to execute when the Promise is rejected. + * @returns A `CancellablePromise` for the completion of whichever callback is executed. + * The returned promise is hooked up to propagate cancellation requests up the chain, but not down: + * + * - if the parent promise is cancelled, the `onrejected` handler will be invoked with a `CancelError` + * and the returned promise _will resolve regularly_ with its result; + * - conversely, if the returned promise is cancelled, _the parent promise is cancelled too;_ + * the `onrejected` handler will still be invoked with the parent's `CancelError`, + * but its result will be discarded + * and the returned promise will reject with a `CancelError` as well. + * + * The promise returned from {@link cancel} will fulfill only after all attached handlers + * up the entire promise chain have been run. + * + * If either callback returns a cancellable promise, + * cancellation requests will be diverted to it, + * and the specified `oncancelled` callback will be discarded. + */ + then(onfulfilled, onrejected, oncancelled) { + if (!(this instanceof CancellablePromise)) { + throw new TypeError("CancellablePromise.prototype.then called on an invalid object."); + } + if (!isCallable(onfulfilled)) { + onfulfilled = identity; + } + if (!isCallable(onrejected)) { + onrejected = thrower; + } + if (onfulfilled === identity && onrejected == thrower) { + return new CancellablePromise((resolve) => resolve(this)); + } + const barrier = {}; + this[barrierSym] = barrier; + return new CancellablePromise((resolve, reject) => { + void super.then((value) => { + var _a2; + if (this[barrierSym] === barrier) { + this[barrierSym] = null; + } + (_a2 = barrier.resolve) === null || _a2 === void 0 ? void 0 : _a2.call(barrier); + try { + resolve(onfulfilled(value)); + } catch (err) { + reject(err); + } + }, (reason) => { + var _a2; + if (this[barrierSym] === barrier) { + this[barrierSym] = null; + } + (_a2 = barrier.resolve) === null || _a2 === void 0 ? void 0 : _a2.call(barrier); + try { + resolve(onrejected(reason)); + } catch (err) { + reject(err); + } + }); + }, async (cause) => { + try { + return oncancelled === null || oncancelled === void 0 ? void 0 : oncancelled(cause); + } finally { + await this.cancel(cause); + } + }); + } + /** + * Attaches a callback for only the rejection of the Promise. + * + * The optional `oncancelled` argument will be invoked when the returned promise is cancelled, + * with the same semantics as the `oncancelled` argument of the constructor. + * When the parent promise rejects or is cancelled, the `onrejected` callback will run, + * _even after the returned promise has been cancelled:_ + * in that case, should it reject or throw, the reason will be wrapped + * in a {@link CancelledRejectionError} and bubbled up as an unhandled rejection. + * + * It is equivalent to + * ```ts + * cancellablePromise.then(undefined, onrejected, oncancelled); + * ``` + * and the same caveats apply. + * + * @returns A Promise for the completion of the callback. + * Cancellation requests on the returned promise + * will propagate up the chain to the parent promise, + * but not in the other direction. + * + * The promise returned from {@link cancel} will fulfill only after all attached handlers + * up the entire promise chain have been run. + * + * If `onrejected` returns a cancellable promise, + * cancellation requests will be diverted to it, + * and the specified `oncancelled` callback will be discarded. + * See {@link then} for more details. + */ + catch(onrejected, oncancelled) { + return this.then(void 0, onrejected, oncancelled); + } + /** + * Attaches a callback that is invoked when the CancellablePromise is settled (fulfilled or rejected). The + * resolved value cannot be accessed or modified from the callback. + * The returned promise will settle in the same state as the original one + * after the provided callback has completed execution, + * unless the callback throws or returns a rejecting promise, + * in which case the returned promise will reject as well. + * + * The optional `oncancelled` argument will be invoked when the returned promise is cancelled, + * with the same semantics as the `oncancelled` argument of the constructor. + * Once the parent promise settles, the `onfinally` callback will run, + * _even after the returned promise has been cancelled:_ + * in that case, should it reject or throw, the reason will be wrapped + * in a {@link CancelledRejectionError} and bubbled up as an unhandled rejection. + * + * This method is implemented in terms of {@link then} and the same caveats apply. + * It is polyfilled, hence available in every OS/webview version. + * + * @returns A Promise for the completion of the callback. + * Cancellation requests on the returned promise + * will propagate up the chain to the parent promise, + * but not in the other direction. + * + * The promise returned from {@link cancel} will fulfill only after all attached handlers + * up the entire promise chain have been run. + * + * If `onfinally` returns a cancellable promise, + * cancellation requests will be diverted to it, + * and the specified `oncancelled` callback will be discarded. + * See {@link then} for more details. + */ + finally(onfinally, oncancelled) { + if (!(this instanceof CancellablePromise)) { + throw new TypeError("CancellablePromise.prototype.finally called on an invalid object."); + } + if (!isCallable(onfinally)) { + return this.then(onfinally, onfinally, oncancelled); + } + return this.then((value) => CancellablePromise.resolve(onfinally()).then(() => value), (reason) => CancellablePromise.resolve(onfinally()).then(() => { + throw reason; + }), oncancelled); + } + /** + * We use the `[Symbol.species]` static property, if available, + * to disable the built-in automatic subclassing features from {@link Promise}. + * It is critical for performance reasons that extenders do not override this. + * Once the proposal at https://github.com/tc39/proposal-rm-builtin-subclassing + * is either accepted or retired, this implementation will have to be revised accordingly. + * + * @ignore + * @internal + */ + static get [species]() { + return Promise; + } + static all(values) { + let collected = Array.from(values); + const promise = collected.length === 0 ? CancellablePromise.resolve(collected) : new CancellablePromise((resolve, reject) => { + void Promise.all(collected).then(resolve, reject); + }, (cause) => cancelAll(promise, collected, cause)); + return promise; + } + static allSettled(values) { + let collected = Array.from(values); + const promise = collected.length === 0 ? CancellablePromise.resolve(collected) : new CancellablePromise((resolve, reject) => { + void Promise.allSettled(collected).then(resolve, reject); + }, (cause) => cancelAll(promise, collected, cause)); + return promise; + } + static any(values) { + let collected = Array.from(values); + const promise = collected.length === 0 ? CancellablePromise.resolve(collected) : new CancellablePromise((resolve, reject) => { + void Promise.any(collected).then(resolve, reject); + }, (cause) => cancelAll(promise, collected, cause)); + return promise; + } + static race(values) { + let collected = Array.from(values); + const promise = new CancellablePromise((resolve, reject) => { + void Promise.race(collected).then(resolve, reject); + }, (cause) => cancelAll(promise, collected, cause)); + return promise; + } + /** + * Creates a new cancelled CancellablePromise for the provided cause. + * + * @group Static Methods + */ + static cancel(cause) { + const p = new CancellablePromise(() => { + }); + p.cancel(cause); + return p; + } + /** + * Creates a new CancellablePromise that cancels + * after the specified timeout, with the provided cause. + * + * If the {@link AbortSignal.timeout} factory method is available, + * it is used to base the timeout on _active_ time rather than _elapsed_ time. + * Otherwise, `timeout` falls back to {@link setTimeout}. + * + * @group Static Methods + */ + static timeout(milliseconds, cause) { + const promise = new CancellablePromise(() => { + }); + if (AbortSignal && typeof AbortSignal === "function" && AbortSignal.timeout && typeof AbortSignal.timeout === "function") { + AbortSignal.timeout(milliseconds).addEventListener("abort", () => void promise.cancel(cause)); + } else { + setTimeout(() => void promise.cancel(cause), milliseconds); + } + return promise; + } + static sleep(milliseconds, value) { + return new CancellablePromise((resolve) => { + setTimeout(() => resolve(value), milliseconds); + }); + } + /** + * Creates a new rejected CancellablePromise for the provided reason. + * + * @group Static Methods + */ + static reject(reason) { + return new CancellablePromise((_, reject) => reject(reason)); + } + static resolve(value) { + if (value instanceof CancellablePromise) { + return value; + } + return new CancellablePromise((resolve) => resolve(value)); + } + /** + * Creates a new CancellablePromise and returns it in an object, along with its resolve and reject functions + * and a getter/setter for the cancellation callback. + * + * This method is polyfilled, hence available in every OS/webview version. + * + * @group Static Methods + */ + static withResolvers() { + let result = { oncancelled: null }; + result.promise = new CancellablePromise((resolve, reject) => { + result.resolve = resolve; + result.reject = reject; + }, (cause) => { + var _a2; + (_a2 = result.oncancelled) === null || _a2 === void 0 ? void 0 : _a2.call(result, cause); + }); + return result; + } +} +function cancellerFor(promise, state) { + let cancellationPromise = void 0; + return (reason) => { + if (!state.settled) { + state.settled = true; + state.reason = reason; + promise.reject(reason); + void Promise.prototype.then.call(promise.promise, void 0, (err) => { + if (err !== reason) { + throw err; + } + }); + } + if (!state.reason || !promise.oncancelled) { + return; + } + cancellationPromise = new Promise((resolve) => { + try { + resolve(promise.oncancelled(state.reason.cause)); + } catch (err) { + Promise.reject(new CancelledRejectionError(promise.promise, err, "Unhandled exception in oncancelled callback.")); + } + }).catch((reason2) => { + Promise.reject(new CancelledRejectionError(promise.promise, reason2, "Unhandled rejection in oncancelled callback.")); + }); + promise.oncancelled = null; + return cancellationPromise; + }; +} +function resolverFor(promise, state) { + return (value) => { + if (state.resolving) { + return; + } + state.resolving = true; + if (value === promise.promise) { + if (state.settled) { + return; + } + state.settled = true; + promise.reject(new TypeError("A promise cannot be resolved with itself.")); + return; + } + if (value != null && (typeof value === "object" || typeof value === "function")) { + let then; + try { + then = value.then; + } catch (err) { + state.settled = true; + promise.reject(err); + return; + } + if (isCallable(then)) { + try { + let cancel = value.cancel; + if (isCallable(cancel)) { + const oncancelled = (cause) => { + Reflect.apply(cancel, value, [cause]); + }; + if (state.reason) { + void cancellerFor(Object.assign(Object.assign({}, promise), { oncancelled }), state)(state.reason); + } else { + promise.oncancelled = oncancelled; + } + } + } catch (_a2) { + } + const newState = { + root: state.root, + resolving: false, + get settled() { + return this.root.settled; + }, + set settled(value2) { + this.root.settled = value2; + }, + get reason() { + return this.root.reason; + } + }; + const rejector = rejectorFor(promise, newState); + try { + Reflect.apply(then, value, [resolverFor(promise, newState), rejector]); + } catch (err) { + rejector(err); + } + return; + } + } + if (state.settled) { + return; + } + state.settled = true; + promise.resolve(value); + }; +} +function rejectorFor(promise, state) { + return (reason) => { + if (state.resolving) { + return; + } + state.resolving = true; + if (state.settled) { + try { + if (reason instanceof CancelError && state.reason instanceof CancelError && Object.is(reason.cause, state.reason.cause)) { + return; + } + } catch (_a2) { + } + void Promise.reject(new CancelledRejectionError(promise.promise, reason)); + } else { + state.settled = true; + promise.reject(reason); + } + }; +} +function cancelAll(parent, values, cause) { + const results = []; + for (const value of values) { + let cancel; + try { + if (!isCallable(value.then)) { + continue; + } + cancel = value.cancel; + if (!isCallable(cancel)) { + continue; + } + } catch (_a2) { + continue; + } + let result; + try { + result = Reflect.apply(cancel, value, [cause]); + } catch (err) { + Promise.reject(new CancelledRejectionError(parent, err, "Unhandled exception in cancel method.")); + continue; + } + if (!result) { + continue; + } + results.push((result instanceof Promise ? result : Promise.resolve(result)).catch((reason) => { + Promise.reject(new CancelledRejectionError(parent, reason, "Unhandled rejection in cancel method.")); + })); + } + return Promise.all(results); +} +function identity(x) { + return x; +} +function thrower(reason) { + throw reason; +} +function errorMessage(err) { + try { + if (err instanceof Error || typeof err !== "object" || err.toString !== Object.prototype.toString) { + return "" + err; + } + } catch (_a2) { + } + try { + return JSON.stringify(err); + } catch (_b) { + } + try { + return Object.prototype.toString.call(err); + } catch (_c) { + } + return ""; +} +function currentBarrier(promise) { + var _a2; + let pwr = (_a2 = promise[barrierSym]) !== null && _a2 !== void 0 ? _a2 : {}; + if (!("promise" in pwr)) { + Object.assign(pwr, promiseWithResolvers()); + } + if (promise[barrierSym] == null) { + pwr.resolve(); + promise[barrierSym] = pwr; + } + return pwr.promise; +} +let promiseWithResolvers = Promise.withResolvers; +if (promiseWithResolvers && typeof promiseWithResolvers === "function") { + promiseWithResolvers = promiseWithResolvers.bind(Promise); +} else { + promiseWithResolvers = function() { + let resolve; + let reject; + const promise = new Promise((res, rej) => { + resolve = res; + reject = rej; + }); + return { promise, resolve, reject }; + }; +} +window._wails = window._wails || {}; +window._wails.callResultHandler = resultHandler; +window._wails.callErrorHandler = errorHandler; +const call = newRuntimeCaller(objectNames.Call); +const cancelCall = newRuntimeCaller(objectNames.CancelCall); +const callResponses = /* @__PURE__ */ new Map(); +const CallBinding = 0; +const CancelMethod = 0; +class RuntimeError extends Error { + /** + * Constructs a new RuntimeError instance. + * @param message - The error message. + * @param options - Options to be forwarded to the Error constructor. + */ + constructor(message, options) { + super(message, options); + this.name = "RuntimeError"; + } +} +function resultHandler(id, data, isJSON) { + const resolvers = getAndDeleteResponse(id); + if (!resolvers) { + return; + } + if (!data) { + resolvers.resolve(void 0); + } else if (!isJSON) { + resolvers.resolve(data); + } else { + try { + resolvers.resolve(JSON.parse(data)); + } catch (err) { + resolvers.reject(new TypeError("could not parse result: " + err.message, { cause: err })); + } + } +} +function errorHandler(id, data, isJSON) { + const resolvers = getAndDeleteResponse(id); + if (!resolvers) { + return; + } + if (!isJSON) { + resolvers.reject(new Error(data)); + } else { + let error; + try { + error = JSON.parse(data); + } catch (err) { + resolvers.reject(new TypeError("could not parse error: " + err.message, { cause: err })); + return; + } + let options = {}; + if (error.cause) { + options.cause = error.cause; + } + let exception; + switch (error.kind) { + case "ReferenceError": + exception = new ReferenceError(error.message, options); + break; + case "TypeError": + exception = new TypeError(error.message, options); + break; + case "RuntimeError": + exception = new RuntimeError(error.message, options); + break; + default: + exception = new Error(error.message, options); + break; + } + resolvers.reject(exception); + } +} +function getAndDeleteResponse(id) { + const response = callResponses.get(id); + callResponses.delete(id); + return response; +} +function generateID() { + let result; + do { + result = nanoid(); + } while (callResponses.has(result)); + return result; +} +function Call(options) { + const id = generateID(); + const result = CancellablePromise.withResolvers(); + callResponses.set(id, { resolve: result.resolve, reject: result.reject }); + const request = call(CallBinding, Object.assign({ "call-id": id }, options)); + let running = false; + request.then(() => { + running = true; + }, (err) => { + callResponses.delete(id); + result.reject(err); + }); + const cancel = () => { + callResponses.delete(id); + return cancelCall(CancelMethod, { "call-id": id }).catch((err) => { + console.error("Error while requesting binding call cancellation:", err); + }); + }; + result.oncancelled = () => { + if (running) { + return cancel(); + } else { + return request.then(cancel); + } + }; + return result.promise; +} +function ByID(methodID, ...args) { + return Call({ methodID, args }); +} +const eventListeners = /* @__PURE__ */ new Map(); +class Listener { + constructor(eventName, callback, maxCallbacks) { + this.eventName = eventName; + this.callback = callback; + this.maxCallbacks = maxCallbacks || -1; + } + dispatch(data) { + try { + this.callback(data); + } catch (err) { + console.error(err); + } + if (this.maxCallbacks === -1) + return false; + this.maxCallbacks -= 1; + return this.maxCallbacks === 0; + } +} +function listenerOff(listener) { + let listeners = eventListeners.get(listener.eventName); + if (!listeners) { + return; + } + listeners = listeners.filter((l) => l !== listener); + if (listeners.length === 0) { + eventListeners.delete(listener.eventName); + } else { + eventListeners.set(listener.eventName, listeners); + } +} +window._wails = window._wails || {}; +window._wails.dispatchWailsEvent = dispatchWailsEvent; +newRuntimeCaller(objectNames.Events); +class WailsEvent { + constructor(name, data = null) { + this.name = name; + this.data = data; + } +} +function dispatchWailsEvent(event) { + let listeners = eventListeners.get(event.name); + if (!listeners) { + return; + } + let wailsEvent = new WailsEvent(event.name, event.data); + if ("sender" in event) { + wailsEvent.sender = event.sender; + } + listeners = listeners.filter((listener) => !listener.dispatch(wailsEvent)); + if (listeners.length === 0) { + eventListeners.delete(event.name); + } else { + eventListeners.set(event.name, listeners); + } +} +function OnMultiple(eventName, callback, maxCallbacks) { + let listeners = eventListeners.get(eventName) || []; + const thisListener = new Listener(eventName, callback, maxCallbacks); + listeners.push(thisListener); + eventListeners.set(eventName, listeners); + return () => listenerOff(thisListener); +} +function On(eventName, callback) { + return OnMultiple(eventName, callback, -1); +} +window._wails = window._wails || {}; +window._wails.invoke = invoke; +invoke("wails:runtime:ready"); +function RemoveBadge() { + let $resultPromise = ByID(2633565570); + return $resultPromise; +} +function SetBadge(label) { + let $resultPromise = ByID(3052354152, label); + return $resultPromise; +} +const setButton = document.getElementById("set"); +const removeButton = document.getElementById("remove"); +const labelElement = document.getElementById("label"); +const timeElement = document.getElementById("time"); +setButton.addEventListener("click", () => { + let label = labelElement.value; + SetBadge(label); +}); +removeButton.addEventListener("click", () => { + RemoveBadge(); +}); +On("time", (time) => { + timeElement.innerText = time.data; +}); diff --git a/v3/examples/badge/frontend/dist/index.html b/v3/examples/badge/frontend/dist/index.html new file mode 100644 index 000000000..bd4fbd1e5 --- /dev/null +++ b/v3/examples/badge/frontend/dist/index.html @@ -0,0 +1,36 @@ + + + + + + + + Wails App + + + + + + diff --git a/v3/examples/badge/frontend/dist/style.css b/v3/examples/badge/frontend/dist/style.css new file mode 100644 index 000000000..0b9c58279 --- /dev/null +++ b/v3/examples/badge/frontend/dist/style.css @@ -0,0 +1,157 @@ +:root { + font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", + "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", + sans-serif; + font-size: 16px; + line-height: 24px; + font-weight: 400; + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: rgba(27, 38, 54, 1); + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; + user-select: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; +} + +@font-face { + font-family: "Inter"; + font-style: normal; + font-weight: 400; + src: local(""), + url("./Inter-Medium.ttf") format("truetype"); +} + +h3 { + font-size: 3em; + line-height: 1.1; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} + +a:hover { + color: #535bf2; +} + +button { + width: 60px; + height: 30px; + line-height: 30px; + border-radius: 3px; + border: none; + margin: 0 0 0 20px; + padding: 0 8px; + cursor: pointer; +} + +.result { + height: 20px; + line-height: 20px; +} + +body { + margin: 0; + display: flex; + place-items: center; + place-content: center; + min-width: 320px; + min-height: 100vh; +} + +.container { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +#app { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; +} + +.logo:hover { + filter: drop-shadow(0 0 2em #e80000aa); +} + +.logo.vanilla:hover { + filter: drop-shadow(0 0 2em #f7df1eaa); +} + +.result { + height: 20px; + line-height: 20px; + margin: 1.5rem auto; + text-align: center; +} + +.footer { + margin-top: 1rem; + align-content: center; + text-align: center; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + + a:hover { + color: #747bff; + } + + button { + background-color: #f9f9f9; + } +} + + +.input-box .btn:hover { + background-image: linear-gradient(to top, #cfd9df 0%, #e2ebf0 100%); + color: #333333; +} + +.input-box .input { + border: none; + border-radius: 3px; + outline: none; + height: 30px; + line-height: 30px; + padding: 0 10px; + color: black; + background-color: rgba(240, 240, 240, 1); + -webkit-font-smoothing: antialiased; +} + +.input-box .input:hover { + border: none; + background-color: rgba(255, 255, 255, 1); +} + +.input-box .input:focus { + border: none; + background-color: rgba(255, 255, 255, 1); +} \ No newline at end of file diff --git a/v3/examples/badge/frontend/dist/typescript.svg b/v3/examples/badge/frontend/dist/typescript.svg new file mode 100644 index 000000000..d91c910cc --- /dev/null +++ b/v3/examples/badge/frontend/dist/typescript.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v3/examples/badge/frontend/dist/wails.png b/v3/examples/badge/frontend/dist/wails.png new file mode 100644 index 0000000000000000000000000000000000000000..8bdf424833bfb5b6b34a0807224e94533f738f2e GIT binary patch literal 9057 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 Date: Fri, 25 Apr 2025 15:17:39 +1000 Subject: [PATCH 248/374] Add FontManager to better handle fonts. Remove the go-findfont dependency. Add Go examples. --- .../{index-BguIgRNQ.js => index-sXwpgKSV.js} | 26 +++- v3/examples/badge/frontend/dist/index.html | 4 +- v3/examples/badge/frontend/dist/style.css | 2 - v3/examples/badge/frontend/index.html | 2 + v3/examples/badge/frontend/public/style.css | 2 - v3/examples/badge/frontend/src/main.ts | 17 ++- v3/examples/badge/main.go | 20 ++- v3/examples/dev/go.mod | 8 +- v3/examples/dev/go.sum | 4 + v3/go.mod | 3 +- v3/go.sum | 2 - v3/pkg/services/badge/badge_windows.go | 141 ++++++++++++++++-- v3/pkg/services/badge/font.go | 133 +++++++++++++++++ 13 files changed, 335 insertions(+), 29 deletions(-) rename v3/examples/badge/frontend/dist/assets/{index-BguIgRNQ.js => index-sXwpgKSV.js} (98%) create mode 100644 v3/pkg/services/badge/font.go diff --git a/v3/examples/badge/frontend/dist/assets/index-BguIgRNQ.js b/v3/examples/badge/frontend/dist/assets/index-sXwpgKSV.js similarity index 98% rename from v3/examples/badge/frontend/dist/assets/index-BguIgRNQ.js rename to v3/examples/badge/frontend/dist/assets/index-sXwpgKSV.js index 2327d5519..72bf73d69 100644 --- a/v3/examples/badge/frontend/dist/assets/index-BguIgRNQ.js +++ b/v3/examples/badge/frontend/dist/assets/index-sXwpgKSV.js @@ -127,10 +127,10 @@ function eventTarget(event) { document.addEventListener("DOMContentLoaded", () => { }); window.addEventListener("contextmenu", contextMenuHandler); -const call$1 = newRuntimeCaller(objectNames.ContextMenu); +const call$2 = newRuntimeCaller(objectNames.ContextMenu); const ContextMenuOpen = 0; function openContextMenu(id, x, y, data) { - void call$1(ContextMenuOpen, { id, x, y, data }); + void call$2(ContextMenuOpen, { id, x, y, data }); } function contextMenuHandler(event) { const target = eventTarget(event); @@ -1138,7 +1138,7 @@ if (promiseWithResolvers && typeof promiseWithResolvers === "function") { window._wails = window._wails || {}; window._wails.callResultHandler = resultHandler; window._wails.callErrorHandler = errorHandler; -const call = newRuntimeCaller(objectNames.Call); +const call$1 = newRuntimeCaller(objectNames.Call); const cancelCall = newRuntimeCaller(objectNames.CancelCall); const callResponses = /* @__PURE__ */ new Map(); const CallBinding = 0; @@ -1224,7 +1224,7 @@ function Call(options) { const id = generateID(); const result = CancellablePromise.withResolvers(); callResponses.set(id, { resolve: result.resolve, reject: result.reject }); - const request = call(CallBinding, Object.assign({ "call-id": id }, options)); + const request = call$1(CallBinding, Object.assign({ "call-id": id }, options)); let running = false; request.then(() => { running = true; @@ -1283,7 +1283,8 @@ function listenerOff(listener) { } window._wails = window._wails || {}; window._wails.dispatchWailsEvent = dispatchWailsEvent; -newRuntimeCaller(objectNames.Events); +const call = newRuntimeCaller(objectNames.Events); +const EmitMethod = 0; class WailsEvent { constructor(name, data = null) { this.name = name; @@ -1316,6 +1317,9 @@ function OnMultiple(eventName, callback, maxCallbacks) { function On(eventName, callback) { return OnMultiple(eventName, callback, -1); } +function Emit(event) { + return call(EmitMethod, event); +} window._wails = window._wails || {}; window._wails.invoke = invoke; invoke("wails:runtime:ready"); @@ -1329,6 +1333,8 @@ function SetBadge(label) { } const setButton = document.getElementById("set"); const removeButton = document.getElementById("remove"); +const setButtonUsingGo = document.getElementById("set-go"); +const removeButtonUsingGo = document.getElementById("remove-go"); const labelElement = document.getElementById("label"); const timeElement = document.getElementById("time"); setButton.addEventListener("click", () => { @@ -1338,6 +1344,16 @@ setButton.addEventListener("click", () => { removeButton.addEventListener("click", () => { RemoveBadge(); }); +setButtonUsingGo.addEventListener("click", () => { + let label = labelElement.value; + void Emit({ + name: "set:badge", + data: label + }); +}); +removeButtonUsingGo.addEventListener("click", () => { + void Emit({ name: "remove:badge", data: null }); +}); On("time", (time) => { timeElement.innerText = time.data; }); diff --git a/v3/examples/badge/frontend/dist/index.html b/v3/examples/badge/frontend/dist/index.html index bd4fbd1e5..a543f93cd 100644 --- a/v3/examples/badge/frontend/dist/index.html +++ b/v3/examples/badge/frontend/dist/index.html @@ -6,7 +6,7 @@ Wails App - +
    @@ -25,6 +25,8 @@ + +
    + +

    Wails + Typescript

    +
    Set a badge label below 👇
    +
    +
    + + + +
    +
    + +