From e7546ddbb49d501a226fc8a3e8583ceec9f679d0 Mon Sep 17 00:00:00 2001 From: "Raphael (manual office deploy after cloud-state fix)" Date: Thu, 20 Aug 2026 13:43:04 -0700 Subject: [PATCH 1/2] Validate MDL geometry before rendering Measure exact SVG content, require complete automatic or manual layouts, and use a direct correlated headless path so invalid or partial diagrams cannot be saved. --- cmd/mdl/headless.go | 110 +++ cmd/mdl/headless_test.go | 83 ++ cmd/mdl/main.go | 321 +++++--- cmd/mdl/main_test.go | 36 +- cmd/mdl/serve.go | 75 +- cmd/mdl/serve_test.go | 27 +- .../skills/editing-model-diagrams/SKILL.md | 38 +- cmd/mdl/svg_e2e_test.go | 75 ++ .../webapp/dist/1104236696a5d2d1f236.woff2 | Bin 0 -> 24356 bytes cmd/mdl/webapp/dist/286.js | 2 + cmd/mdl/webapp/dist/286.js.map | 1 + .../webapp/dist/69a8d1d484967aba2389.woff2 | Bin 0 -> 24452 bytes cmd/mdl/webapp/dist/948.js | 2 +- cmd/mdl/webapp/dist/948.js.map | 2 +- .../webapp/dist/b7c27c60f848f2083f45.woff2 | Bin 0 -> 24272 bytes .../webapp/dist/eca1e21531598d5db58f.woff2 | Bin 0 -> 23664 bytes cmd/mdl/webapp/dist/fontawesome.js | 2 +- cmd/mdl/webapp/dist/headless.html | 1 + cmd/mdl/webapp/dist/headless.js | 2 + cmd/mdl/webapp/dist/headless.js.map | 1 + cmd/mdl/webapp/dist/index.html | 2 +- cmd/mdl/webapp/dist/main.js | 2 +- cmd/mdl/webapp/dist/main.js.map | 2 +- cmd/mdl/webapp/dist/vendors.js | 2 +- cmd/mdl/webapp/dist/vendors.js.map | 2 +- cmd/mdl/webapp/package.json | 3 + cmd/mdl/webapp/pnpm-lock.yaml | 607 ++++++++++++++ cmd/mdl/webapp/src/Root.tsx | 89 +- cmd/mdl/webapp/src/fonts.css | 32 + cmd/mdl/webapp/src/graph-view/GEOMETRY.md | 47 ++ .../src/graph-view/automatic-layout.test.ts | 102 +++ .../webapp/src/graph-view/automatic-layout.ts | 399 +++++++++ cmd/mdl/webapp/src/graph-view/edge-utils.ts | 248 +----- .../webapp/src/graph-view/geometry.test.ts | 246 ++++++ cmd/mdl/webapp/src/graph-view/geometry.ts | 773 ++++++++++++++++++ cmd/mdl/webapp/src/graph-view/graph-react.tsx | 7 +- cmd/mdl/webapp/src/graph-view/graph.ts | 642 ++++++--------- cmd/mdl/webapp/src/graph-view/layout.ts | 713 ++++++---------- .../src/graph-view/manual-layout.test.ts | 50 ++ .../webapp/src/graph-view/manual-layout.ts | 20 + cmd/mdl/webapp/src/graph-view/svg-text.ts | 201 +++-- cmd/mdl/webapp/src/headless.ts | 122 +++ cmd/mdl/webapp/src/index.html | 3 - cmd/mdl/webapp/src/index.tsx | 13 +- cmd/mdl/webapp/webpack.config.js | 12 +- 45 files changed, 3667 insertions(+), 1450 deletions(-) create mode 100644 cmd/mdl/headless.go create mode 100644 cmd/mdl/headless_test.go create mode 100644 cmd/mdl/webapp/dist/1104236696a5d2d1f236.woff2 create mode 100644 cmd/mdl/webapp/dist/286.js create mode 100644 cmd/mdl/webapp/dist/286.js.map create mode 100644 cmd/mdl/webapp/dist/69a8d1d484967aba2389.woff2 create mode 100644 cmd/mdl/webapp/dist/b7c27c60f848f2083f45.woff2 create mode 100644 cmd/mdl/webapp/dist/eca1e21531598d5db58f.woff2 create mode 100644 cmd/mdl/webapp/dist/headless.html create mode 100644 cmd/mdl/webapp/dist/headless.js create mode 100644 cmd/mdl/webapp/dist/headless.js.map create mode 100644 cmd/mdl/webapp/src/fonts.css create mode 100644 cmd/mdl/webapp/src/graph-view/GEOMETRY.md create mode 100644 cmd/mdl/webapp/src/graph-view/automatic-layout.test.ts create mode 100644 cmd/mdl/webapp/src/graph-view/automatic-layout.ts create mode 100644 cmd/mdl/webapp/src/graph-view/geometry.test.ts create mode 100644 cmd/mdl/webapp/src/graph-view/geometry.ts create mode 100644 cmd/mdl/webapp/src/graph-view/manual-layout.test.ts create mode 100644 cmd/mdl/webapp/src/graph-view/manual-layout.ts create mode 100644 cmd/mdl/webapp/src/headless.ts diff --git a/cmd/mdl/headless.go b/cmd/mdl/headless.go new file mode 100644 index 00000000..4873b439 --- /dev/null +++ b/cmd/mdl/headless.go @@ -0,0 +1,110 @@ +// This file matches browser render results to the exact CLI request that +// started them. View IDs and model digests prevent one run from accepting +// another run's output. +package main + +import ( + "encoding/json" + "fmt" + "net/http" + "sync" +) + +type ( + headlessResult struct { + Status string `json:"status"` + ViewID string `json:"viewId"` + ModelDigest string `json:"modelDigest"` + SVG string `json:"svg,omitempty"` + Error string `json:"error,omitempty"` + } + + renderKey struct { + viewID string + modelDigest string + } + + renderBroker struct { + mu sync.Mutex + waiters map[renderKey]chan headlessResult + } +) + +// newRenderBroker creates an empty result matcher for one mdl svg process. +func newRenderBroker() *renderBroker { + return &renderBroker{waiters: make(map[renderKey]chan headlessResult)} +} + +// register creates the one result channel allowed for a view and model digest. +func (b *renderBroker) register(viewID, modelDigest string) (<-chan headlessResult, func(), error) { + key := renderKey{viewID: viewID, modelDigest: modelDigest} + b.mu.Lock() + defer b.mu.Unlock() + if _, exists := b.waiters[key]; exists { + return nil, nil, fmt.Errorf("render %s is already registered", viewID) + } + result := make(chan headlessResult, 1) + b.waiters[key] = result + unregister := func() { + b.mu.Lock() + defer b.mu.Unlock() + delete(b.waiters, key) + } + return result, unregister, nil +} + +// handleResult accepts one complete or failed browser result for a registered request. +func (b *renderBroker) handleResult(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) + return + } + decoder := json.NewDecoder(http.MaxBytesReader(w, r.Body, 64<<20)) + decoder.DisallowUnknownFields() + var result headlessResult + if err := decoder.Decode(&result); err != nil { + http.Error(w, fmt.Sprintf("decode render result: %v", err), http.StatusBadRequest) + return + } + if err := validateHeadlessResult(result); err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + + key := renderKey{viewID: result.ViewID, modelDigest: result.ModelDigest} + b.mu.Lock() + waiter, exists := b.waiters[key] + if exists { + select { + case waiter <- result: + default: + exists = false + } + } + b.mu.Unlock() + if !exists { + http.Error(w, "no matching render request", http.StatusConflict) + return + } + w.WriteHeader(http.StatusAccepted) +} + +// validateHeadlessResult requires exactly the fields allowed by each status. +func validateHeadlessResult(result headlessResult) error { + if result.ViewID == "" || result.ModelDigest == "" { + return fmt.Errorf("viewId and modelDigest are required") + } + switch result.Status { + case "complete": + if result.SVG == "" || result.Error != "" { + return fmt.Errorf("complete result requires svg and forbids error") + } + case "error": + if result.Error == "" || result.SVG != "" { + return fmt.Errorf("error result requires error and forbids svg") + } + default: + return fmt.Errorf("invalid render status %q", result.Status) + } + return nil +} diff --git a/cmd/mdl/headless_test.go b/cmd/mdl/headless_test.go new file mode 100644 index 00000000..2ee8b0ff --- /dev/null +++ b/cmd/mdl/headless_test.go @@ -0,0 +1,83 @@ +package main + +import ( + "bytes" + "net/http" + "net/http/httptest" + "testing" +) + +func TestRenderBrokerMatchesViewAndDigest(t *testing.T) { + broker := newRenderBroker() + results, unregister, err := broker.register("AURA Services", "digest") + if err != nil { + t.Fatalf("register render: %v", err) + } + defer unregister() + + body := bytes.NewBufferString( + `{"status":"complete","viewId":"AURA Services","modelDigest":"digest","svg":""}`, + ) + request := httptest.NewRequest(http.MethodPost, "/headless/result", body) + response := httptest.NewRecorder() + broker.handleResult(response, request) + if response.Code != http.StatusAccepted { + t.Fatalf("expected accepted result, got %d: %s", response.Code, response.Body.String()) + } + result := <-results + if result.ViewID != "AURA Services" || result.ModelDigest != "digest" { + t.Fatalf("received wrong result: %#v", result) + } +} + +func TestRenderBrokerRejectsUnmatchedResult(t *testing.T) { + broker := newRenderBroker() + body := bytes.NewBufferString( + `{"status":"error","viewId":"Flows","modelDigest":"other","error":"failed"}`, + ) + request := httptest.NewRequest(http.MethodPost, "/headless/result", body) + response := httptest.NewRecorder() + broker.handleResult(response, request) + if response.Code != http.StatusConflict { + t.Fatalf("expected conflict, got %d", response.Code) + } +} + +func TestValidateHeadlessResult(t *testing.T) { + tests := []struct { + name string + result headlessResult + }{ + { + name: "complete without SVG", + result: headlessResult{ + Status: "complete", + ViewID: "view", + ModelDigest: "digest", + }, + }, + { + name: "error without detail", + result: headlessResult{ + Status: "error", + ViewID: "view", + ModelDigest: "digest", + }, + }, + { + name: "unknown status", + result: headlessResult{ + Status: "running", + ViewID: "view", + ModelDigest: "digest", + }, + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + if err := validateHeadlessResult(test.result); err == nil { + t.Fatal("expected validation error") + } + }) + } +} diff --git a/cmd/mdl/main.go b/cmd/mdl/main.go index 4287fa98..d72ac053 100644 --- a/cmd/mdl/main.go +++ b/cmd/mdl/main.go @@ -2,11 +2,13 @@ package main import ( "context" + "crypto/sha256" "encoding/json" "flag" "fmt" "net" "net/http" + "net/url" "os" "path/filepath" "strings" @@ -18,6 +20,8 @@ import ( "goa.design/model/mdl" model "goa.design/model/pkg" + cdnetwork "github.com/chromedp/cdproto/network" + cdruntime "github.com/chromedp/cdproto/runtime" "github.com/chromedp/chromedp" ) @@ -39,30 +43,10 @@ type ( force bool } - browserAutomationResult struct { - Status string `json:"status"` - Error string `json:"error"` - } - // SliceFlag implements flag.Value for repeated string flags. SliceFlag []string ) -const ( - browserAutomationReadyScript = `(() => { - const status = document.documentElement.dataset.mdlAutomationStatus; - return status === "complete" || status === "error"; -})()` - - browserAutomationResultScript = `(() => { - const root = document.documentElement; - return { - status: root.dataset.mdlAutomationStatus || "", - error: root.dataset.mdlAutomationError || "", - }; -})()` -) - func (s *SliceFlag) String() string { return strings.Join(*s, ",") } func (s *SliceFlag) Set(v string) error { *s = append(*s, v) @@ -110,7 +94,7 @@ func parseArgs() config { cfg := config{ out: "design.json", dir: goacodegen.Gendir, - port: 8080, + port: 0, devmode: os.Getenv("DEVMODE") == "1", devdist: os.Getenv("DEVDIST"), // defaults for svg command @@ -122,7 +106,12 @@ func parseArgs() config { flag.BoolVar(&cfg.help, "h", false, "print this information") flag.StringVar(&cfg.out, "out", cfg.out, "set path to generated JSON representation") flag.StringVar(&cfg.dir, "dir", cfg.dir, "set output directory used by editor to save SVG files") - flag.IntVar(&cfg.port, "port", cfg.port, "set local HTTP port used to serve diagram editor") + flag.IntVar( + &cfg.port, + "port", + cfg.port, + "set local HTTP port; serve defaults to 8080 and svg defaults to a private free port", + ) // svg command flags (safe to always register) flag.Var(&cfg.views, "view", "view key to render (repeatable)") flag.BoolVar(&cfg.all, "all", false, "render all views") @@ -209,6 +198,9 @@ func startServer(pkg string, cfg config) error { if cfg.devmode && cfg.devdist == "" { cfg.devdist = "./cmd/mdl/webapp/dist" } + if cfg.port == 0 { + cfg.port = 8080 + } return serve(absDir, pkg, cfg.port, cfg.devdist, cfg.debug) } @@ -236,8 +228,8 @@ func serve(out, pkg string, port int, devdist string, debug bool) error { return server.Serve(out, devdist, port) } -// runSVG runs a local server without watch, opens a headless browser per view to trigger -// auto layout and save, and waits for the SVG files to be written. +// runSVG serves one fixed model, renders selected views in one browser process, +// and saves only matched, validated browser results. func runSVG(pkg string, cfg config) error { if pkg == "" { return fmt.Errorf(`missing PACKAGE argument, use "--help" for usage`) @@ -251,13 +243,11 @@ func runSVG(pkg string, cfg config) error { return err } - // Load design to enumerate views design, err := loadDesign(pkg, cfg.debug) if err != nil { return err } - // Collect view keys based on flags viewKeys := collectViewKeys(design) selected := make([]string, 0) if cfg.all || len(cfg.views) == 0 && !cfg.all { @@ -280,57 +270,69 @@ func runSVG(pkg string, cfg config) error { return fmt.Errorf("no views to render; use --all or --view") } - // Prepare server with custom mux (no watch) server := NewServer(design) + digest, err := designDigest(design) + if err != nil { + return err + } + broker := newRenderBroker() mux := http.NewServeMux() + mux.HandleFunc("/headless/result", broker.handleResult) - // Pick port: if cfg.port == 0, choose a random free port - port := cfg.port - if port == 0 { - ln, err := net.Listen("tcp", "127.0.0.1:0") - if err != nil { - return err - } - port = ln.Addr().(*net.TCPAddr).Port - _ = ln.Close() + listener, err := net.Listen("tcp", listenAddress(cfg.port)) + if err != nil { + return fmt.Errorf("bind headless server: %w", err) } httpServer := &http.Server{ - Addr: fmt.Sprintf("127.0.0.1:%d", port), ReadHeaderTimeout: 3 * time.Second, } - // Start server in background done := make(chan error, 1) go func() { - done <- server.ServeOnMux(absDir, cfg.devdist, httpServer, mux) + done <- server.ServeOnListener(absDir, cfg.devdist, httpServer, mux, listener) }() - // Wait for server to accept connections by polling - baseURL := fmt.Sprintf("http://127.0.0.1:%d", port) - if err := waitForHTTP(baseURL+"/data/model.json", 5*time.Second); err != nil { - _ = httpServer.Close() - return fmt.Errorf("server did not start: %w", err) - } - - // Drive headless browser to render and save - if err := renderViewsHeadless(baseURL, absDir, selected, cfg); err != nil { - _ = httpServer.Close() + baseURL := "http://" + listener.Addr().String() + if err := renderViewsHeadless(baseURL, digest, selected, cfg, broker, server); err != nil { + if closeErr := httpServer.Close(); closeErr != nil { + return fmt.Errorf("%w; close headless server: %v", err, closeErr) + } return err } - // Shutdown server - _ = httpServer.Close() - // Ensure background server goroutine exits to avoid leaks + if err := httpServer.Close(); err != nil { + return fmt.Errorf("close headless server: %w", err) + } select { - case <-done: - // server exited + case err := <-done: + if err != nil && err != http.ErrServerClosed { + return fmt.Errorf("headless server: %w", err) + } case <-time.After(2 * time.Second): - // timeout waiting for server to exit; continue + return fmt.Errorf("timeout stopping headless server") } return nil } +// designDigest gives every browser result the identity of the exact model JSON. +func designDigest(design *mdl.Design) (string, error) { + data, err := json.Marshal(design) + if err != nil { + return "", fmt.Errorf("serialize design digest: %w", err) + } + digest := sha256.Sum256(data) + return fmt.Sprintf("%x", digest), nil +} + +// listenAddress uses a caller port or asks the operating system for a free one. +func listenAddress(port int) string { + if port == 0 { + return "127.0.0.1:0" + } + return fmt.Sprintf("127.0.0.1:%d", port) +} + func collectViewKeys(d *mdl.Design) []string { var keys []string if d.Views == nil { @@ -370,61 +372,106 @@ func collectViewKeys(d *mdl.Design) []string { return keys } -func waitForHTTP(url string, timeout time.Duration) error { - deadline := time.Now().Add(timeout) - for time.Now().Before(deadline) { - resp, err := http.Get(url) //nolint:gosec - if err == nil { - _ = resp.Body.Close() - if resp.StatusCode >= 200 && resp.StatusCode < 300 { - return nil +// renderViewsHeadless reuses one browser process and waits for typed HTTP results. +func renderViewsHeadless( + baseURL string, + modelDigest string, + views []string, + cfg config, + broker *renderBroker, + server *Server, +) error { + direction, err := normalizeLayoutDirection(cfg.direction) + if err != nil { + return err + } + return withChromedp(cfg.timeout, cfg.debug, func(exec navigateExec) error { + for _, viewID := range views { + if err := renderViewHeadless( + baseURL, + modelDigest, + viewID, + direction, + cfg, + broker, + server, + exec, + ); err != nil { + return fmt.Errorf("render %s: %w", viewID, err) } } - time.Sleep(100 * time.Millisecond) - } - return fmt.Errorf("timeout waiting for %s", url) + return nil + }) } -// renderViewsHeadless uses chromedp to visit each view and trigger auto-layout and save. -func renderViewsHeadless(baseURL, outDir string, views []string, cfg config) error { - // Lazy import of chromedp via build tag is overkill; add module dependency and use directly - // We inline a minimal wrapper to avoid leaking chromedp symbols elsewhere. - - // Prepare function that opens a headless tab to the URL and waits for SVG file - run := func(url string, svgPath string, timeout time.Duration) error { - // Defer importing chromedp to here for clarity - return withChromedp(timeout, cfg.debug, func(exec navigateExec) error { - return exec(url, svgPath, timeout) - }) - } - - direction, err := normalizeLayoutDirection(cfg.direction) +// renderViewHeadless waits for the exact view and model result before saving it. +func renderViewHeadless( + baseURL string, + modelDigest string, + viewID string, + direction string, + cfg config, + broker *renderBroker, + server *Server, + exec navigateExec, +) error { + results, unregister, err := broker.register(viewID, modelDigest) if err != nil { return err } - for _, key := range views { - // Build URL with automation params - q := fmt.Sprintf("?id=%s&auto=1&save=1", key) - if direction != "" { - q += "&direction=" + direction - } - if cfg.compact { - q += "&compact=1" - } - url := baseURL + "/" + q + defer unregister() - // Remove any existing file to ensure fresh wait - svgPath := filepath.Join(outDir, key+".svg") - _ = os.Remove(svgPath) + deadline := time.Now().Add(cfg.timeout) + renderURL := headlessRenderURL(baseURL, modelDigest, viewID, direction, cfg.compact) + if err := exec(renderURL, time.Until(deadline)); err != nil { + return fmt.Errorf("open headless page: %w", err) + } + remaining := time.Until(deadline) + if remaining <= 0 { + return fmt.Errorf("timeout waiting for browser result") + } + timer := time.NewTimer(remaining) + defer timer.Stop() - if err := run(url, svgPath, cfg.timeout); err != nil { - return fmt.Errorf("render %s: %w", key, err) - } - fmt.Println("Saved:", svgPath) + var result headlessResult + select { + case result = <-results: + case <-timer.C: + return fmt.Errorf("timeout waiting for browser result") + } + if result.Status == "error" { + return fmt.Errorf("browser failed: %s", result.Error) + } + + err = server.storeSVG(viewID, strings.NewReader(result.SVG)) + if err != nil { + return fmt.Errorf("save SVG: %w", err) } + fmt.Println("Saved:", filepath.Join(server.outDir, viewID+".svg")) return nil } +// headlessRenderURL encodes one view request without relying on router state. +func headlessRenderURL( + baseURL string, + modelDigest string, + viewID string, + direction string, + compact bool, +) string { + query := url.Values{ + "digest": {modelDigest}, + "view": {viewID}, + } + if direction != "" { + query.Set("direction", direction) + } + if compact { + query.Set("compact", "true") + } + return baseURL + "/headless.html?" + query.Encode() +} + func normalizeLayoutDirection(direction string) (string, error) { normalized := strings.ToUpper(direction) switch normalized { @@ -438,8 +485,8 @@ func normalizeLayoutDirection(direction string) (string, error) { } } -// navigateExec abstracts browser navigation and automation result handling. -type navigateExec func(url string, svgPath string, timeout time.Duration) error +// navigateExec opens one isolated page in the shared browser process. +type navigateExec func(url string, timeout time.Duration) error // withChromedp wraps the chromedp session lifecycle func withChromedp(timeout time.Duration, debug bool, fn func(exec navigateExec) error) error { @@ -466,39 +513,55 @@ func chromedpExec(timeout time.Duration, debug bool, fn func(exec navigateExec) ctx, cancel := chromedp.NewContext(allocCtx) defer cancel() - - exec := func(url string, svgPath string, timeout time.Duration) error { - // Use a tab context so the page stays open through layout and save. - tabCtx, tabCancel := chromedp.NewContext(ctx) - defer tabCancel() - - navCtx, navCancel := context.WithTimeout(tabCtx, timeout) - defer navCancel() - var result browserAutomationResult - if err := chromedp.Run(navCtx, - chromedp.Navigate(url), - chromedp.Poll( - browserAutomationReadyScript, - nil, - chromedp.WithPollingInterval(100*time.Millisecond), - chromedp.WithPollingTimeout(0), - ), - chromedp.Evaluate(browserAutomationResultScript, &result), - ); err != nil { - return fmt.Errorf("wait for browser automation status: %w", err) + tabCtx, tabCancel := chromedp.NewContext(ctx) + defer tabCancel() + if err := chromedp.Run(tabCtx); err != nil { + return fmt.Errorf("start headless browser tab: %w", err) + } + if debug { + if err := chromedp.Run(tabCtx, cdnetwork.Enable()); err != nil { + return fmt.Errorf("enable browser network diagnostics: %w", err) } - if result.Status == "error" { - if result.Error == "" { - result.Error = "unknown browser error" + chromedp.ListenTarget(tabCtx, func(event any) { + switch typed := event.(type) { + case *cdruntime.EventExceptionThrown: + fmt.Fprintf( + os.Stderr, + "browser exception: %v\n", + typed.ExceptionDetails, + ) + case *cdruntime.EventConsoleAPICalled: + for _, argument := range typed.Args { + fmt.Fprintf( + os.Stderr, + "browser console: %s %s\n", + argument.Description, + string(argument.Value), + ) + } + case *cdnetwork.EventRequestWillBeSent: + fmt.Fprintf(os.Stderr, "browser request: %s\n", typed.Request.URL) + case *cdnetwork.EventResponseReceived: + fmt.Fprintf( + os.Stderr, + "browser response: %d %s\n", + typed.Response.Status, + typed.Response.URL, + ) + case *cdnetwork.EventLoadingFailed: + fmt.Fprintf(os.Stderr, "browser request failed: %s\n", typed.ErrorText) } - return fmt.Errorf("browser automation failed: %s", result.Error) - } - st, err := os.Stat(svgPath) - if err != nil { - return fmt.Errorf("browser reported completion but output %s is unavailable: %w", svgPath, err) + }) + } + + exec := func(url string, timeout time.Duration) error { + if timeout <= 0 { + return fmt.Errorf("browser navigation deadline exceeded") } - if st.Size() == 0 { - return fmt.Errorf("browser reported completion but output %s is empty", svgPath) + navCtx, navCancel := context.WithTimeout(tabCtx, timeout) + defer navCancel() + if err := chromedp.Run(navCtx, chromedp.Navigate(url)); err != nil { + return fmt.Errorf("navigate browser: %w", err) } return nil } diff --git a/cmd/mdl/main_test.go b/cmd/mdl/main_test.go index 2a2b428b..f0c7da39 100644 --- a/cmd/mdl/main_test.go +++ b/cmd/mdl/main_test.go @@ -4,8 +4,6 @@ import ( "fmt" "net/http" "net/http/httptest" - "path/filepath" - "strings" "testing" "time" @@ -87,32 +85,40 @@ func TestNormalizeLayoutDirection(t *testing.T) { } } -func TestChromedpExecReportsBrowserAutomationError(t *testing.T) { +func TestHeadlessRenderURL(t *testing.T) { + actual := headlessRenderURL( + "http://127.0.0.1:1234", + "digest", + "AURA Services & Runtime", + "RIGHT", + true, + ) + expected := "http://127.0.0.1:1234/headless.html?" + + "compact=true&digest=digest&direction=RIGHT&view=AURA+Services+%26+Runtime" + if actual != expected { + t.Fatalf("expected %q, got %q", expected, actual) + } +} + +func TestChromedpExecNavigatesDirectPage(t *testing.T) { if !hasChrome() { t.Skip("skipping: Chrome/Chromium not available in PATH") } server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { w.Header().Set("Content-Type", "text/html") - _, err := fmt.Fprint(w, ` - - -`) + _, err := fmt.Fprint(w, "ready") if err != nil { - t.Errorf("write automation page: %v", err) + t.Errorf("write direct page: %v", err) } })) defer server.Close() - output := filepath.Join(t.TempDir(), "missing.svg") timeout := 30 * time.Second err := withChromedp(timeout, false, func(exec navigateExec) error { - return exec(server.URL, output, timeout) + return exec(server.URL, timeout) }) - if err == nil { - t.Fatal("expected browser automation error") - } - if !strings.Contains(err.Error(), "browser automation failed: layout exploded") { - t.Fatalf("expected browser error detail, got %v", err) + if err != nil { + t.Fatalf("navigate direct page: %v", err) } } diff --git a/cmd/mdl/serve.go b/cmd/mdl/serve.go index 8d3c8389..55570cbe 100644 --- a/cmd/mdl/serve.go +++ b/cmd/mdl/serve.go @@ -7,9 +7,11 @@ import ( "fmt" "io" "io/fs" + "net" "net/http" "os" "path" + "path/filepath" "strings" "sync" "time" @@ -91,6 +93,22 @@ func (s *Server) ServeOnMux(outDir, devDistPath string, srv *http.Server, mux *h return srv.ListenAndServe() } +// ServeOnListener serves the editor on a listener the caller has already bound. +func (s *Server) ServeOnListener( + outDir string, + devDistPath string, + srv *http.Server, + mux *http.ServeMux, + listener net.Listener, +) error { + s.outDir = outDir + s.setupRoutesToMux(mux, devDistPath) + if srv.Handler == nil { + srv.Handler = mux + } + return srv.Serve(listener) +} + // handleModelData serves the JSON representation of the architecture model func (s *Server) handleModelData(w http.ResponseWriter, _ *http.Request) { s.lock.RLock() @@ -132,10 +150,7 @@ func (s *Server) handleSave(w http.ResponseWriter, r *http.Request) { return } - s.lock.Lock() - defer s.lock.Unlock() - - if err := s.saveSVG(id, r.Body); err != nil { + if err := s.storeSVG(id, r.Body); err != nil { s.handleError(w, fmt.Errorf("failed to save SVG: %w", err)) return } @@ -143,21 +158,59 @@ func (s *Server) handleSave(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusAccepted) } -// saveSVG saves the SVG content to a file +// storeSVG allows one writer at a time and delegates the atomic file replacement. +func (s *Server) storeSVG(id string, body io.Reader) error { + s.lock.Lock() + defer s.lock.Unlock() + return s.saveSVG(id, body) +} + +// saveSVG writes a complete SVG beside the target, then replaces the target. +// Readers therefore see either the old complete file or the new complete file. func (s *Server) saveSVG(id string, body io.Reader) error { - svgFile := path.Join(s.outDir, id+".svg") - f, err := os.Create(svgFile) + if id == "" || filepath.Base(id) != id { + return fmt.Errorf("invalid view id %q", id) + } + svgFile := filepath.Join(s.outDir, id+".svg") + f, err := os.CreateTemp(s.outDir, "."+id+".svg.tmp-*") if err != nil { return err } + tempName := f.Name() + committed := false defer func() { - if err := f.Close(); err != nil { - fmt.Fprintf(os.Stderr, "failed to close file: %v\n", err) + if !committed { + if err := os.Remove(tempName); err != nil && !os.IsNotExist(err) { + fmt.Fprintf(os.Stderr, "failed to remove temporary SVG: %v\n", err) + } } }() - _, err = io.Copy(f, body) - return err + if _, err := io.Copy(f, body); err != nil { + return closeTemporarySVG(f, "write SVG", err) + } + if err := f.Sync(); err != nil { + return closeTemporarySVG(f, "sync SVG", err) + } + if err := f.Chmod(0644); err != nil { + return closeTemporarySVG(f, "set SVG permissions", err) + } + if err := f.Close(); err != nil { + return fmt.Errorf("close temporary SVG: %w", err) + } + if err := os.Rename(tempName, svgFile); err != nil { + return fmt.Errorf("replace SVG: %w", err) + } + committed = true + return nil +} + +// closeTemporarySVG keeps the first write failure and also reports a close failure. +func closeTemporarySVG(file *os.File, action string, cause error) error { + if err := file.Close(); err != nil { + return fmt.Errorf("%s: %w; close temporary SVG: %v", action, cause, err) + } + return fmt.Errorf("%s: %w", action, cause) } // SetDesign updates the design served by the server diff --git a/cmd/mdl/serve_test.go b/cmd/mdl/serve_test.go index 03beaa5b..519699d2 100644 --- a/cmd/mdl/serve_test.go +++ b/cmd/mdl/serve_test.go @@ -57,7 +57,30 @@ func TestServerHandlers(t *testing.T) { t.Fatalf("save status: %d", w.Code) } // file created - if _, err := os.Stat(filepath.Join(dir, "view1.svg")); err != nil { - t.Fatalf("expected svg written: %v", err) + saved := filepath.Join(dir, "view1.svg") + content, err := os.ReadFile(saved) + if err != nil { + t.Fatalf("read saved SVG: %v", err) + } + if string(content) != "" { + t.Fatalf("unexpected SVG content %q", content) + } + entries, err := os.ReadDir(dir) + if err != nil { + t.Fatalf("read output directory: %v", err) + } + if len(entries) != 1 || entries[0].Name() != "view1.svg" { + t.Fatalf("expected only atomic target file, got %v", entries) + } + + w = httptest.NewRecorder() + r = httptest.NewRequest( + http.MethodPost, + "/data/save?id=..%2Foutside", + bytes.NewBufferString(""), + ) + mux.ServeHTTP(w, r) + if w.Code != http.StatusInternalServerError { + t.Fatalf("unsafe save status: %d", w.Code) } } diff --git a/cmd/mdl/skills/editing-model-diagrams/SKILL.md b/cmd/mdl/skills/editing-model-diagrams/SKILL.md index 32e0b821..0b2e5964 100644 --- a/cmd/mdl/skills/editing-model-diagrams/SKILL.md +++ b/cmd/mdl/skills/editing-model-diagrams/SKILL.md @@ -207,13 +207,20 @@ overview view: them. - Do not weaken or shorten canonical element metadata merely to make a crowded diagram fit. Prefer a smaller view or a layout/rendering correction. -- Treat `AutoLayout` only as an initial placement. It will rarely produce the - desired final hierarchy, spacing, and edge routing. +- Use `AutoLayout` as the default complete placement. It measures rendered + content, places nodes, boundaries, routes, and labels together, and rejects + invalid geometry instead of saving a partial result. +- Treat an `mdl svg` geometry failure as a real model, view-scope, saved-layout, + or MDL defect. Do not work around it by unlinking relationships, shortening + truthful text, retrying with guessed spacing, or accepting a partly rendered + file. - Always inspect every rendered view visually. Compilation, successful rendering, and non-overlapping geometry are not evidence that the view communicates well. -- Use saved coordinates from the MDL visual editor for intentional final - arrangement. +- Use saved coordinates from the MDL visual editor only for intentional + refinement. A manual layout must contain every current element, complete + relationship routes, and placed labels; stale or partial saved geometry is + invalid. ## Regenerate and inspect @@ -234,9 +241,9 @@ mdl serve -dir ### Arrange with the MDL visual editor Start with `AutoLayout`, then visually review every view in the generated set. -Assume the automatic result needs deliberate refinement unless inspection shows -that its hierarchy, spacing, labels, and edge routing already communicate the -view's question clearly. When a rendered view has overlaps, excessive +Keep the automatic result when its hierarchy, spacing, labels, and edge routing +communicate the view's question clearly. Use the editor only when deliberate +placement would improve that communication. When a rendered view has excessive whitespace, weak visual hierarchy, or avoidable edge crossings: 1. Confirm the view contains only relationships that answer its architectural @@ -256,10 +263,10 @@ whitespace, weak visual hierarchy, or avoidable edge crossings: may sit inside it, and sibling or external elements must remain outside. 6. Reset or reposition stale edge bend points and labels after moving nodes or changing membership. Saved routes from an earlier layout must not leave - lines outside boundaries, unnecessary detours, or detached labels. - When newly added nodes overlap at the origin or MDL reports missing saved - geometry, delete only that affected generated SVG and regenerate it; do not - discard working layouts for unrelated views. + lines outside boundaries, unnecessary detours, or detached labels. If MDL + rejects a stale or incomplete saved layout, regenerate that whole affected + view or deliberately migrate every element and route together. Never mix + old manual positions with newly guessed automatic values. 7. Save through the MDL editor so it records supported layout coordinates. Do not hand-edit generated SVG or JSON layout data. 8. Confirm the expected SVG's timestamp or content changed, wait for the write @@ -268,6 +275,11 @@ whitespace, weak visual hierarchy, or avoidable edge crossings: 9. Reopen the persisted SVG at fitted viewport scale and verify the saved nodes, labels, arrows, and boundary titles. +For MDL renderer or layout changes, render the full repository view set at +least three times and compare the SVG files byte for byte. Also run independent +model packages concurrently. Any changed bytes between identical runs, port +collision, timeout, partial file, or cross-view result is a tool defect. + Always review the main view in the editor and arrange it deliberately whenever that improves the whole-system summary. Review every secondary view at fitted viewport scale and arrange it as needed. Do not use manual positioning to @@ -291,7 +303,9 @@ After rendering, verify: - Relationship direction and labels are readable. - Nodes, labels, arrows, and boundary titles do not overlap. - Text stays inside its node or boundary. -- The complete diagram is visible at common viewport sizes. +- The complete structure is visible at common viewport sizes. Labels in an + honestly dense overview may require zoom, but focused secondary views must + make its major flows readable without hiding real relationships. - Generated files match the DSL and are included when the repository publishes rendered artifacts. diff --git a/cmd/mdl/svg_e2e_test.go b/cmd/mdl/svg_e2e_test.go index 7d28a909..1fbeaa7f 100644 --- a/cmd/mdl/svg_e2e_test.go +++ b/cmd/mdl/svg_e2e_test.go @@ -6,6 +6,7 @@ import ( "fmt" "io" "net" + "net/http" "net/url" "os" "os/exec" @@ -14,6 +15,7 @@ import ( "testing" "time" + cdruntime "github.com/chromedp/cdproto/runtime" "github.com/chromedp/chromedp" "github.com/jaschaephraim/lrserver" ) @@ -108,6 +110,79 @@ func TestSVGEndToEnd(t *testing.T) { } } +// TestManualEditAfterAutoLayout proves editor changes enter the complete manual +// contract instead of mixing changed nodes with stale automatic geometry. +func TestManualEditAfterAutoLayout(t *testing.T) { + if !hasChrome() { + t.Skip("skipping: Chrome/Chromium not available in PATH") + } + design, err := loadDesign("goa.design/model/examples/basic/model", false) + if err != nil { + t.Fatalf("load design: %v", err) + } + listener, err := net.Listen("tcp", "127.0.0.1:0") + if err != nil { + t.Fatalf("listen: %v", err) + } + server := NewServer(design) + httpServer := &http.Server{ReadHeaderTimeout: 3 * time.Second} + outDir := t.TempDir() + serverDone := make(chan error, 1) + go func() { + serverDone <- server.ServeOnListener( + outDir, + "", + httpServer, + http.NewServeMux(), + listener, + ) + }() + t.Cleanup(func() { + if err := httpServer.Close(); err != nil { + t.Errorf("close editor server: %v", err) + } + if err := <-serverDone; err != nil && err != http.ErrServerClosed { + t.Errorf("editor server: %v", err) + } + }) + + testContext, cleanup := newChromeContext(t) + defer cleanup() + pageURL := fmt.Sprintf( + "http://%s/?id=%s", + listener.Addr().String(), + url.QueryEscape("SystemContext"), + ) + const script = `(async () => { + const graph = window.gdata; + await graph.autoLayout(); + const node = graph.nodes()[0]; + graph.moveNode(node, node.x + 20, node.y, true); + return graph.exportSVG().length; + })()` + var svgLength int + if err := chromedp.Run( + testContext, + chromedp.Navigate(pageURL), + chromedp.Poll( + `window.gdata && window.gdata.nodes().every(node => node.ref?.isConnected)`, + nil, + ), + chromedp.Evaluate( + script, + &svgLength, + func(params *cdruntime.EvaluateParams) *cdruntime.EvaluateParams { + return params.WithAwaitPromise(true) + }, + ), + ); err != nil { + t.Fatalf("auto layout, edit, and export: %v", err) + } + if svgLength == 0 { + t.Fatal("manual export is empty") + } +} + // TestSVGHeadlessDoesNotConnectToLiveReload verifies automated rendering is // isolated from interactive editor reloads sent on the process-wide port. func TestSVGHeadlessDoesNotConnectToLiveReload(t *testing.T) { diff --git a/cmd/mdl/webapp/dist/1104236696a5d2d1f236.woff2 b/cmd/mdl/webapp/dist/1104236696a5d2d1f236.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..a68fb101cd9224aa7bb6ca80356b5132c40c6f3f GIT binary patch literal 24356 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.keys(e).forEach(n=>{const o=e[n];"number"==typeof o?t.style.setProperty(n,o.toString()):t.style.setProperty(n,o)})},"M5",0,{nodeBorder:{fill:"rgba(255, 255, 255, 0.86)",stroke:"#aaa",filter:"url(#shadow)"},nodeText:{"font-family":"Inter, -apple-system, BlinkMacSystemFont, sans-serif",stroke:"none"},edgeText:{"font-family":"Inter, -apple-system, BlinkMacSystemFont, sans-serif",stroke:"none"},edgeRect:{fill:"none",stroke:"none"},groupRect:{fill:"rgba(0, 0, 0, 0.02)",stroke:"#666","stroke-width":3,"stroke-dasharray":4},groupText:{fill:"#666","font-size":22,"font-weight":"500","font-family":"Inter, -apple-system, BlinkMacSystemFont, sans-serif",cursor:"default"}},"Y$",0,{thickness:3,color:"#999",opacity:1,fontSize:22,dashed:!0},"gd",0,(t,e)=>Math.sqrt((e.x-t.x)*(e.x-t.x)+(e.y-t.y)*(e.y-t.y)),"nD",0,{width:280,height:180,background:"rgba(255, 255, 255, .9)",color:"#666",opacity:.9,stroke:"#999",fontSize:22,shape:"Box"}])},977(t,e,n){n.d(e,{IW:()=>r,Zr:()=>s,l:()=>i});var o=n(247);function i(t){const e=t.from,n=t.to;let o=t.vertices?t.vertices.concat():[];o.unshift(e),o.push(n);const i=o.slice(1,-1),r=i.find(t=>!t.label)??n;let s=e;for(let t=i.length-1;t>=0;t--)if(!i[t].label){s=i[t];break}if(!e.intersect||!n.intersect)throw new Error(`edge ${t.id} nodes must be drawn before routing`);return o[0]=e.intersect(r),o[o.length-1]=n.intersect(s),o}function r(t,e,n){let i,r={x:n.x,y:n.y};const s=t.findIndex(t=>t.label);let a=!0;if(s>=0){const e=t[s];r=e,a=!0===e.auto;const n=[];s>0&&n.push({p:t[s-1],q:r}),st?(0,o.gd)(e.p,e.q)>(0,o.gd)(t.p,t.q)?e:t:e,void 0)}else{const n=t.slice(1).reduce((e,n,i)=>e+(0,o.gd)(t[i],n),0)*e;let s=0;for(let e=1;e0&&s+d>=n){const t=(n-s)/d;r={x:a.p.x+(a.q.x-a.p.x)*t,y:a.p.y+(a.q.y-a.p.y)*t},i=a;break}s+=d}}const d=i?Math.abs(i.q.x-i.p.x):0,l=i?Math.abs(i.q.y-i.p.y):0;return{...r,orientation:l>d?"vertical":"horizontal",segment:i,movable:a}}function s(t){if(t.length<2)throw new Error("edge route must contain at least two points");return t.slice(1).reduce((t,e)=>`${t} L${e.x},${e.y}`,`M${t[0].x},${t[0].y}`)}},20(t,e,n){n.d(e,{r:()=>i}),Symbol("ValidatedLayout");class o extends Error{issues;constructor(t){super(t.map(t=>t.message).join("\n")),this.name="GeometryValidationError",this.issues=t}}function i(t,e){const n=[];t.id!==e.diagramId&&n.push(C("missing_element",[t.id,e.diagramId],`layout ${e.diagramId} does not resolve measured diagram ${t.id}`)),r("measured node",t.nodes.map(t=>t.id),n),r("measured group",t.groups.map(t=>t.id),n),r("measured edge",t.edges.map(t=>t.id),n),r("resolved node",e.nodes.map(t=>t.id),n),r("resolved group",e.groups.map(t=>t.id),n),r("resolved edge",e.edges.map(t=>t.id),n),s("node",t.nodes.map(t=>t.id),e.nodes.map(t=>t.id),n),s("group",t.groups.map(t=>t.id),e.groups.map(t=>t.id),n),s("edge",t.edges.map(t=>t.id),e.edges.map(t=>t.id),n);const i=new Map(t.nodes.map(t=>[t.id,t])),b=new Map(t.groups.map(t=>[t.id,t])),y=new Map(e.nodes.map(t=>[t.id,t])),v=new Map(e.groups.map(t=>[t.id,t]));a("diagram",e.diagramId,e.bounds,n);for(const t of e.nodes){a("node",t.id,t.bounds,n);const o=i.get(t.id);!o||x(o.size.width,t.bounds.width)&&x(o.size.height,t.bounds.height)||n.push(C("size_mismatch",[t.id],`node ${t.id} size changed after measurement`)),o&&(o.contentSize.width>t.bounds.width||o.contentSize.height>t.bounds.height)&&n.push(C("content_overflow",[t.id],`node ${t.id} content exceeds its resolved bounds`)),d("node",t.id,t.bounds,e.bounds,n)}for(const t of e.groups){a("group",t.id,t.bounds,n),a("group title",t.id,t.titleBounds,n),d("group",t.id,t.bounds,e.bounds,n),g(t.bounds,t.titleBounds)||n.push(C("false_containment",[t.id],`group ${t.id} does not contain its title`));const o=b.get(t.id);!o||x(o.titleSize.width,t.titleBounds.width)&&x(o.titleSize.height,t.titleBounds.height)||n.push(C("size_mismatch",[t.id],`group ${t.id} title size changed after measurement`))}if(function(t,e){w(t,(t,n)=>{A(t.bounds,n.bounds)&&e.push(C("node_overlap",[t.id,n.id],`nodes ${t.id} and ${n.id} overlap`))})}(e.nodes,n),function(t,e){w(t,(t,n)=>{!A(t.bounds,n.bounds)||g(t.bounds,n.bounds)||g(n.bounds,t.bounds)||e.push(C("group_overlap",[t.id,n.id],`groups ${t.id} and ${n.id} partially overlap`))})}(e.groups,n),function(t,e,n,o,i){for(const e of t){const t=n.get(e.id);if(t&&t.parentId!==e.parentId&&i.push(C("false_containment",[e.id],`node ${e.id} has the wrong parent ID`)),!e.parentId)continue;const r=o.get(e.parentId);t&&r&&!g(r.bounds,t.bounds)&&i.push(C("false_containment",[e.id,e.parentId],`node ${e.id} lies outside owning group ${e.parentId}`))}for(const t of e){const e=o.get(t.id);if(e&&e.parentId!==t.parentId&&i.push(C("false_containment",[t.id],`group ${t.id} has the wrong parent ID`)),!t.parentId)continue;const n=o.get(t.parentId);e&&n&&!g(n.bounds,e.bounds)&&i.push(C("false_containment",[t.id,t.parentId],`group ${t.id} lies outside owning group ${t.parentId}`))}}(t.nodes,t.groups,y,v,n),function(t,e,n,o,i,r,s){const g=new Map(t.edges.map(t=>[t.id,t])),b=[];for(const t of e.edges){const y=g.get(t.id);if(y)if(t.sourceId===y.sourceId&&t.targetId===y.targetId||s.push(C("disconnected_edge",[t.id,t.sourceId,t.targetId],`edge ${t.id} endpoints do not match its measured contract`)),0===t.sections.length||t.sections.some(t=>t.length<2))s.push(C("disconnected_edge",[t.id],`edge ${t.id} has no complete route section`));else{l(t,n,s);for(const n of t.sections)for(const o of n)if(!m(o)||!p(o,e.bounds,!0)){s.push(C("out_of_bounds",[t.id],`edge ${t.id} has a route point outside the resolved view`));break}for(const e of n.values())e.id!==t.sourceId&&e.id!==t.targetId&&u(t.sections,f(e.bounds,.5))&&s.push(C("edge_through_node",[t.id,e.id],`edge ${t.id} crosses unrelated node ${e.id}`));for(const e of o.values()){const n=c(t.sourceId,e.id,i,r);n===c(t.targetId,e.id,i,r)&&h(t.sections,e.bounds,n)&&s.push(C("edge_through_group",[t.id,e.id],`edge ${t.id} violates group ${e.id} boundary`))}if(t.labelBounds){a("edge label",t.id,t.labelBounds,s),d("edge label",t.id,t.labelBounds,e.bounds,s),!y.labelSize||x(y.labelSize.width,t.labelBounds.width)&&x(y.labelSize.height,t.labelBounds.height)||s.push(C("size_mismatch",[t.id],`edge ${t.id} label size changed after measurement`));for(const e of n.values())A(t.labelBounds,e.bounds)&&s.push(C("label_node_overlap",[t.id,e.id],`edge ${t.id} label overlaps node ${e.id}`));for(const e of o.values())A(t.labelBounds,e.titleBounds)&&s.push(C("label_title_overlap",[t.id,e.id],`edge ${t.id} label overlaps group ${e.id} title`));b.push({id:t.id,bounds:t.labelBounds})}else y.labelSize&&s.push(C("missing_element",[t.id],`edge ${t.id} is missing its measured label`))}}w(b,(t,e)=>{A(t.bounds,e.bounds)&&s.push(C("label_label_overlap",[t.id,e.id],`edge labels ${t.id} and ${e.id} overlap`))});for(const t of b)for(const n of e.edges)u(n.sections,f(t.bounds,.5))&&s.push(C("label_edge_overlap",[t.id,n.id],`edge ${n.id} crosses label ${t.id}`))}(t,e,y,v,i,b,n),n.length>0)throw new o(n);return e}function r(t,e,n){const o=new Set;for(const i of e)o.has(i)&&n.push(C("duplicate_id",[i],`${t} ${i} is duplicated`)),o.add(i)}function s(t,e,n,o){const i=new Set(e),r=new Set(n);for(const e of i)r.has(e)||o.push(C("missing_element",[e],`${t} ${e} is missing from resolved layout`));for(const e of r)i.has(e)||o.push(C("unexpected_element",[e],`${t} ${e} is not in the measured diagram`))}function a(t,e,n,o){(!function(t){return m(t)&&Number.isFinite(t.width)&&Number.isFinite(t.height)}(n)||n.width<0||n.height<0)&&o.push(C("non_finite",[e],`${t} ${e} has invalid geometry`))}function d(t,e,n,o,i){g(o,n)||i.push(C("out_of_bounds",[e],`${t} ${e} lies outside the resolved view bounds`))}function l(t,e,n){for(let e=1;et.some((n,o)=>o>0&&function(t,e,n){const o=e.x-t.x,i=e.y-t.y;let r=0,s=1;for(const[e,a,d,l]of[[t.x,o,n.x,n.x+n.width],[t.y,i,n.y,n.y+n.height]]){if(Math.abs(a)=l)return!1;continue}const t=(d-e)/a,n=(l-e)/a;if(r=Math.max(r,Math.min(t,n)),s=Math.min(s,Math.max(t,n)),r>=s)return!1}return s>0&&r<1}(t[o-1],n,e)))}function A(t,e){return t.x=e.x+e.width&&t.y+t.height>=e.y+e.height}function p(t,e,n){return n?t.x>=e.x&&t.y>=e.y&&t.x<=e.x+e.width&&t.y<=e.y+e.height:t.x>e.x&&t.y>e.y&&t.x=e.x-.1&&t.x<=e.x+e.width+.1,o=t.y>=e.y-.1&&t.y<=e.y+e.height+.1,i=x(t.x,e.x)||x(t.x,e.x+e.width),r=x(t.y,e.y)||x(t.y,e.y+e.height);return o&&i||n&&r}function x(t,e){return Math.abs(t-e)<=.1}function w(t,e){for(let n=0;nM,Qy:()=>U,ZG:()=>N,oP:()=>F,IX:()=>O,F_:()=>et,Kp:()=>tt,a_:()=>H});const o=new Map;let i;function r(t,e){const n=function(t,e){const n=Object.entries(e).sort(([t],[e])=>t.localeCompare(e));return JSON.stringify([t,n])}(t,e),r=o.get(n);if(r)return r;const s=document.createElementNS("http://www.w3.org/2000/svg","text");s.setAttribute("x","0"),s.setAttribute("y","0");for(const[t,n]of Object.entries(e))s.setAttribute(t,n);s.textContent=t,(i?.isConnected||(i=document.createElementNS("http://www.w3.org/2000/svg","svg"),i.setAttribute("aria-hidden","true"),i.style.position="absolute",i.style.visibility="hidden",i.style.pointerEvents="none",document.body.appendChild(i)),i).appendChild(s);const a=s.getBBox();s.remove();const d={width:a.width,height:a.height};return o.set(n,d),d}function s(t,e,n){let o=0;return{lines:t.trim().split("\n").flatMap(t=>{const i=[];let s=[];for(const d of t.trim().split(/\s+/)){if(r(d,n).width>e){s.length>0&&(i.push(s.join(" ")),s=[]);const t=a(d,e,n);for(const e of t.slice(0,-1))i.push(e),o=Math.max(o,r(e,n).width);s=t.slice(-1);continue}const t=[...s,d],l=r(t.join(" "),n);l.width>e&&s.length>0?(i.push(s.join(" ")),s=[d]):(o=Math.max(o,l.width),s=t)}if(s.length>0){const t=s.join(" ");i.push(t),o=Math.max(o,r(t,n).width)}return i}),maxW:o}}function a(t,e,n){const o=[];let i="";for(const s of t){const t=i+s;r(t,n).width>e&&i.length>0?(o.push(i),i=s):i=t}return i.length>0&&o.push(i),o}const d={element(t,e={},n){const o=document.createElementNS("http://www.w3.org/2000/svg",t);return Object.entries(e).forEach(([t,e])=>o.setAttribute(t,String(e))),n&&o.classList.add(n),o},use(t,e={}){const n=this.element("use",e);return n.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href","#"+t),n},path(t,e={},n){return this.element("path",{...e,d:t},n)},text(t,e={}){const n=this.element("text",e);return t&&(n.textContent=t),n},textArea(t,e,n,o,i=0,r=0,a=""){const d={"font-size":`${n}px`,"font-weight":o?"bold":"normal"},{lines:l,maxW:c}=s(t,e,d),h=this.text("",{x:0,y:r,"text-anchor":a||void 0});return l.forEach((t,e)=>{const o=this.element("tspan",{x:i,dy:`${n+2}px`,...d});o.textContent=t,h.append(o)}),{txt:h,dy:(l.length+1)*(n+2),maxW:c}},rect(t,e,n=0,o=0,i=0,r){return this.element("rect",{x:n,y:o,rx:i,ry:i,width:t,height:e},r)},icon(t,e=0,n=0){return this.use(t,{x:e,y:n})},expand(t,e,n){const o=this.element("g",{transform:`translate(${t},${e})`},"expand");return o.append(this.rect(19,19,0,0,1),this.text(n?"-":"+",{x:10,y:14,"text-anchor":"middle"})),o}};function l(t,e,n){t.setAttribute("transform",`translate(${e},${n})`)}function c(t,e,n=!0){return n?t.x>e.x-e.width/2&&t.xe.y-e.height/2&&t.ye.x&&t.xe.y&&t.yfunction(t,e,n,o){let i,r,s,a,d,l={x:null,y:null,onLine1:!1,onLine2:!1};return i=(o.y-n.y)*(e.x-t.x)-(o.x-n.x)*(e.y-t.y),0==i||(r=t.y-n.y,s=t.x-n.x,a=(o.x-n.x)*r-(o.y-n.y)*s,d=(e.x-t.x)*r-(e.y-t.y)*s,r=a/i,s=d/i,l.x=t.x+r*(e.x-t.x),l.y=t.y+r*(e.y-t.y),r>0&&r<1&&(l.onLine1=!0),s>=0&&s<=1&&(l.onLine2=!0)),l}(t,e,n.p,n.q)).filter(t=>t.onLine1&&t.onLine2)}(t,e,t)[0]||{x:t.x,y:t.y}}function u(t,e,n,o,i){const r={x:i.x-t.x,y:i.y-t.y},s=o.x-t.x,a=o.y-t.y;s==r.x&&(r.x+=1e-7);const d=(a-r.y)/(s-r.x),l=a-d*s,c=n*n+e*e*d*d,h=2*e*e*l*d,u=e*e*l*l-e*e*n*n,A=Math.sqrt(h*h-4*c*u),g=r.x>s?(-h+A)/(2*c):(-h-A)/(2*c),p={x:g,y:d*g+l};return p.x+=t.x,p.y+=t.y,p}function A(t,e,n){let o=n.x-e.x,i=n.y-e.y,r=o*o+i*i,s=(t.x-e.x)*o+(t.y-e.y)*i,a=Math.min(1,Math.max(0,s/r));return{x:e.x+o*a,y:e.y+i*a}}function g(t,e){return Math.abs(e.x-t.x)+Math.abs(e.y-t.y)}function p(t){return t/2/(5.5+t/70)}function f(t,e,n){switch(t.toLowerCase()){case"cylinder":return 2*p(e);case"person":return.4*n;case"folder":return e/10;case"robot":return.35*n;case"webbrowser":return n/8;default:return 0}}class m{_el;constructor(t){this._el=t}node(){return this._el}attr(t,e){return this._el.setAttribute(t,String(e)),this}insert(t,e){const n=document.createElementNS("http://www.w3.org/2000/svg",t),o=this._el.insertBefore(n,this._el.querySelector(e));return new m(o)}}function b(t,e,n,o=!1){const i=t.insert("rect",":first-child").attr("rx",o?n.width/8:3).attr("ry",o?n.width/8:3).attr("x",-e.width/2).attr("y",-e.height/2).attr("width",e.width).attr("height",e.height);return n.intersect=function(t){return h(n,t)},i}function y(t,e,n,o,i){const r=t.insert("ellipse",":first-child").attr("cx",0).attr("cy",0).attr("rx",o).attr("ry",i).attr("width",n.width).attr("height",n.height);return n.intersect=function(t){return u(n,o,i,n,t)},r}function x(t,e,n){const o=n.width/8,i=n.width/14,r=t.insert("g",":first-child");return r.insert("path",":first-child").attr("d",`M${-n.width/2},${-n.height/2} l${n.width},0 M${-n.width/2},${n.height/2} l${n.width},0`),r.insert("circle",":first-child").attr("cx",0).attr("cy",n.height/2+o/2).attr("r",.4*i),r.insert("rect",":first-child").attr("x",-i).attr("y",-n.height/2-o/2-.2*i).attr("width",2*i).attr("height",.4*i),r.insert("rect",":first-child").attr("rx",i).attr("ry",i).attr("x",-e.width/2).attr("y",-e.height/2-o).attr("width",e.width).attr("height",e.height+2*o),n.intersect=function(t){return h({x:n.x,y:n.y,width:n.width,height:n.height+2*o},t)},r}const w={box:(t,e)=>b(new m(t),e,e).node(),roundedbox:(t,e)=>b(new m(t),e,e,!0).node(),component:(t,e)=>function(t,e,n){const o=n.width/10,i=t.insert("g",":first-child");return i.insert("rect",":first-child").attr("rx",3).attr("ry",3).attr("x",-n.width/2-o).attr("y",-n.height/2+o).attr("width",2*o).attr("height",o),i.insert("rect",":first-child").attr("rx",3).attr("ry",3).attr("x",-n.width/2-o).attr("y",-n.height/2+2.5*o).attr("width",2*o).attr("height",o),i.insert("rect",":first-child").attr("rx",3).attr("ry",3).attr("x",-n.width/2).attr("y",-n.height/2).attr("width",n.width).attr("height",n.height),n.intersect=function(t){return h({x:n.x-o/2,y:n.y,width:n.width+o,height:n.height},t)},i}(new m(t),0,e).node(),cylinder:(t,e)=>function(t,e,n){const o=e.width,i=o/2,r=p(o),s=e.height,a=`M 0,${r} a${i},${r} 0,0,0 ${o} 0 a ${i},${r} 0,0,0 ${-o} 0 l 0,${s-2*r} a ${i},${r} 0,0,0 ${o} 0 l 0,${2*r-s}`,d=t.attr("label-offset-y",f("cylinder",o,s)).insert("path",":first-child").attr("d",a).attr("transform","translate("+-o/2+","+-s/2+")");return n.intersect=function(t){const e=h(n,t);let o=n.y+n.height/2-r;return e.y>o?u({x:n.x,y:o},i,r,n,t):(o=n.y-n.height/2+r,e.yfunction(t,e,n){const o=e.width,i=e.height,r=`M ${.38*o},${i/3} A${o/2},${i/2} 0,0,0 0 ${i/2}\n\t\tL${o/11},${i} L${o-o/11},${i} L${o},${i/2}\n\t\tA${o/2},${i/2} 0,0,0 ${o-.38*o} ${i/3} \n\t\tA${o/6},${o/6} 0,1,0 ${.38*o} ${i/3}`,s=t.attr("label-offset-y",f("person",o,i)).insert("path",":first-child").attr("d",r).attr("transform","translate("+-o/2+","+-i/2+")");return n.intersect=function(t){return h(n,t)},s}(new m(t),e,e).node(),circle:(t,e)=>function(t,e,n){return y(t,0,n,n.width/2,n.width/2)}(new m(t),0,e).node(),ellipse:(t,e)=>function(t,e,n){return y(t,0,n,.55*n.width,.45*n.width)}(new m(t),0,e).node(),hexagon:(t,e)=>function(t,e,n){const o=n.width/2,i=t.insert("polygon",":first-child").attr("points",[.5,.866,1,0,.5,-.866,-.5,-.866,-1,-0,-.5,.866,.5,.866].map(t=>t*o).join(",")).attr("width",n.width).attr("height",n.height);return n.intersect=function(t){return u(n,n.width/2,n.width/2,n,t)},i}(new m(t),0,e).node(),folder:(t,e)=>function(t,e,n){const o=n.width/20,i=t.attr("label-offset-y",f("folder",n.width,n.height)).insert("g",":first-child");return i.insert("rect",":first-child").attr("rx",3).attr("ry",3).attr("x",-n.width/2).attr("y",-n.height/2+2*o).attr("width",n.width).attr("height",n.height-2*o),i.insert("path",":first-child").attr("d",`M0,${-n.height/2+2*o} l${o},${-2*o} h${n.width/2-2*o} v${2*o}`),n.intersect=function(t){return h({x:n.x,y:n.y+o/2,width:n.width,height:n.height+o},t)},i}(new m(t),0,e).node(),mobiledevicelandscape:(t,e)=>function(t,e,n){const o=n.width/8,i=n.width/14,r=t.insert("g",":first-child");return r.insert("path",":first-child").attr("d",`M${-n.width/2},${-n.height/2} l0,${n.height} M${n.width/2},${-n.height/2} l0,${n.height}`),r.insert("circle",":first-child").attr("cx",-n.width/2-o/2).attr("cy",0).attr("r",.4*i),r.insert("rect",":first-child").attr("x",n.width/2+o/2-.2*i).attr("y",-i).attr("width",.4*i).attr("height",2*i),r.insert("rect",":first-child").attr("rx",i).attr("ry",i).attr("x",-e.width/2-o).attr("y",-e.height/2).attr("width",e.width+2*o).attr("height",e.height),n.intersect=function(t){return h({x:n.x,y:n.y,width:n.width+2*o,height:n.height},t)},r}(new m(t),e,e).node(),mobiledeviceportrait:(t,e)=>x(new m(t),e,e).node(),mobiledevice:(t,e)=>x(new m(t),e,e).node(),pipe:(t,e)=>function(t,e,n){const o=n.width,i=n.height,r=i/2,s=r/(2.5+o/70),a=`M${-s},0\n\t\ta${s},${r} 0,0,1 0,${i}\n\t\ta${s},${r} 0,0,1 0,${-i}\n\t\tl${o},0\n\t\ta${s},${r} 0,0,1 0,${i}\n\t\tl${-o},0`,d=t.insert("path",":first-child").attr("d",a).attr("transform","translate("+-o/2+","+-i/2+")");return n.intersect=function(t){return h({x:n.x-s,y:n.y,width:n.width+2*s,height:n.height},t)},d}(new m(t),0,e).node(),robot:(t,e)=>function(t,e,n){const o=n.width,i=n.height,r=Math.min(.28*o,.25*i),s=.2*r,a=.25*r,d=.08*r,l=.12*r,c=.22*r,u=.12*r,A=.3*r,g=o,p=-i/2+a+r,m=i-a-r,b=t.attr("label-offset-y",f("robot",o,i)).insert("g",":first-child");b.insert("rect",":first-child").attr("rx",3).attr("ry",3).attr("x",-g/2).attr("y",p).attr("width",g).attr("height",m);const y=-i/2+a;b.insert("rect",":first-child").attr("rx",s).attr("ry",s).attr("x",-r/2).attr("y",y).attr("width",r).attr("height",r),b.insert("line",":first-child").attr("class","robot-antenna").attr("x1",0).attr("y1",y).attr("x2",0).attr("y2",-i/2+2*d).attr("stroke-width",.6*d).attr("stroke-linecap","round"),b.insert("circle",":first-child").attr("class","robot-antenna-ball").attr("cx",0).attr("cy",-i/2+2*d).attr("r",1.2*d);const x=y+.4*r;b.insert("circle",":first-child").attr("class","robot-eye").attr("cx",-c).attr("cy",x).attr("r",l),b.insert("circle",":first-child").attr("class","robot-eye").attr("cx",c).attr("cy",x).attr("r",l);const w=y+.7*r,C=.28*r;return b.insert("path",":first-child").attr("class","robot-mouth").attr("d",`M${-C/2},${w} Q0,${w+.3*C} ${C/2},${w}`).attr("fill","none").attr("stroke-width",.5*d).attr("stroke-linecap","round"),b.insert("rect",":first-child").attr("rx",.25*u).attr("ry",.25*u).attr("x",-r/2-u-1).attr("y",x-A/2).attr("width",u).attr("height",A),b.insert("rect",":first-child").attr("rx",.25*u).attr("ry",.25*u).attr("x",r/2+1).attr("y",x-A/2).attr("width",u).attr("height",A),n.intersect=function(t){return h(n,t)},b}(new m(t),0,e).node(),webbrowser:(t,e)=>function(t,e,n){const o=n.height/8,i=t.attr("label-offset-y",f("webbrowser",n.width,n.height)).insert("g",":first-child");return i.insert("path",":first-child").attr("d",`\n\t\t\tM${-n.width/2},${-n.height/2+o} h${n.width}\n\t\t\tM${-n.width/2+o/4},${-n.height/2+o/4} h${o/2} v${o/2} h${-o/2} z\n\t\t\tM${-n.width/2+o},${-n.height/2+o/4} h${n.width-o-o/4} v${o/2} h${-n.width+o+o/4} z\n\t\t`),i.insert("rect",":first-child").attr("rx",3).attr("ry",3).attr("x",-n.width/2).attr("y",-n.height/2).attr("width",n.width).attr("height",n.height),n.intersect=function(t){return h(n,t)},i}(new m(t),0,e).node()};var C=n(983);class v{versions=[];pos=0;lastSavedPos=0;exportDoc;importDoc;change;tmpPreviousState=null;constructor(t,e,n){this.exportDoc=e,this.importDoc=n,this.change=function(t){let e;return function(){const n=this;clearTimeout(e),e=setTimeout(function(){e=null,t.apply(n)},300)}}(()=>this.saveNow())}beforeChange(){this.tmpPreviousState||(this.tmpPreviousState=this.deepClone(this.exportDoc()))}length(){return this.versions.length}currentState(){return this.deepClone(this.versions[this.pos-1])}saveNow(){if(!this.tmpPreviousState)throw Error("undo.change() was called without previously calling undo.beforeChange()!");this.versions[this.pos]=this.deepClone(this.exportDoc()),this.versions[this.pos-1]=this.tmpPreviousState,this.tmpPreviousState=null,this.pos+=1,this.versions.splice(this.pos)}deepClone(t){return"undefined"!=typeof structuredClone?structuredClone(t):JSON.parse(JSON.stringify(t))}undo(){if(this.pos<2)return;this.pos-=1;const t=this.versions[this.pos-1];this.importDoc(this.deepClone(t))}redo(){if(this.pos>this.versions.length-1)return;const t=this.versions[this.pos];this.importDoc(this.deepClone(t)),this.pos+=1}changed(){return this.pos!==this.lastSavedPos}setSaved(){this.lastSavedPos=this.pos}}var B=n(264),I=n(247),k=n(977);function E(t,e,n,o,i,r){const a=s(t,e,{"font-family":String(I.M5.nodeText["font-family"]),"font-size":`${n}px`,"font-weight":o?"bold":"normal"});return{lines:a.lines.length>0?a.lines:[""],fontSize:n,lineHeight:n+2,bold:o,field:r,gapAfter:i}}n(20);const S=I.Y$,$=I.nD;class M{id;name;nodesMap;edges;edgeVertices;groupsMap;metadata;layoutDirection;validatedLayout;colorToVarMap=new Map;_undo;_gridVisible=!1;_snapToGrid=!0;_gridSize=25;_skipAutoFit=!1;constructor(t,e){this.id=t,this.name=e,this.edges=[],this.edgeVertices=new Map,this.nodesMap=new Map,this.groupsMap=new Map,this._undo=new v(this.id,()=>this.exportLayout(!0),t=>this.importLayout(t,!0)),window.graph=this}init(t){t&&this.importLayout(t),this._undo=new v(this.id,()=>this.exportLayout(!0),t=>this.importLayout(t,!0)),this._undo.length()&&this.importLayout(this._undo.currentState()),this._undo.beforeChange(),this._undo.change()}addNode(t,e,n,o,i,r){if(this.nodesMap.has(t))throw Error("duplicate node: "+t);const s={...$,...i},a=(s.shape||"Box").toLowerCase(),d="person"===a?240:180,l=Math.max(280,s.width||0),c=function(t,e,n,o,i){const r=Math.max(o-36,80),s=[E(t,r,i,!0,6,"name"),E(`[${e}]`,r,.75*i,!1,10),E(n,r,Math.min(.8*i,16),!1,0,"description")],a=s.reduce((t,e)=>t+e.lines.length*e.lineHeight+e.gapAfter,0);return{blocks:s,textHeight:a,minimumHeight:a+36}}(e,n,o,l,s.fontSize||22);let h=Math.max(d,s.height||0,c.minimumHeight);for(let t=0;t<20;t++){const t=c.minimumHeight+Math.abs(f(a,l,h));if(t<=h+.1)break;h=t}const u={id:t,title:e,sub:n,description:o,style:s,x:0,y:0,width:l,height:h,intersect:null,link:r,contentLayout:c};this.nodesMap.set(u.id,u)}nodes(){return Array.from(this.nodesMap.values())}addEdge(t,e,n,o,i,r){i&&i.forEach((e,n)=>{const o=e;o.id=`v-${t}-${n}`,this.edgeVertices.set(o.id,o)});const s={id:t,from:this.nodesMap.get(e),to:this.nodesMap.get(n),label:o,vertices:null,style:{...S,...r},initVertex:t=>{const e=t;return e.id||(e.id=((t,e)=>`v-${t}-a-${(t=>{let e=2166136261;for(let n=0;n>>0).toString(36)})(`${t}:${e.x}:${e.y}`)}`)(s.id,t),this.edgeVertices.set(e.id,e)),e.edge=s,t},userDeletedVertices:!1};this.edges.push(s),i&&(s.vertices=i.map(t=>s.initVertex(t)))}addGroup(t,e,n,o){if(this.groupsMap.has(t))return void console.error(`Group exists: ${t} ${e}`);const i={id:t,name:e,x:null,y:null,width:null,height:null,nodes:n.map(n=>{const o=this.nodesMap.get(n)||this.groupsMap.get(n);return o||console.error(`Node or group ${n} not found for group ${t} "${e}"`),o}).filter(Boolean),style:o};this.groupsMap.set(t,i)}setNodeSelected(t,e){t.selected=e,e?t.ref.classList.add("selected"):t.ref.classList.remove("selected"),this.updateEdgesSel()}updateEdgesSel(){this.edges.forEach(t=>{t.to.selected||t.from.selected?t.ref.classList.add("selected"):t.ref.classList.remove("selected")})}clearResolvedLayout(){this.validatedLayout=void 0,this.edges.forEach(t=>{t.layoutSections=void 0,t.layoutLabelBounds=void 0}),this.groupsMap.forEach(t=>{t.layoutBounds=void 0,t.layoutTitleBounds=void 0})}moveNode(t,e,n,o=!1,i=!1){if(t){if(this._snapToGrid&&!o){const t=this.snapToGrid(e,n);e=t.x,n=t.y}t.x==e&&t.y==n||(i||this._undo.beforeChange(),this.clearResolvedLayout(),t.x=e,t.y=n,l(t.ref,e,n),this.redrawEdges(t),this.redrawGroups(t),i||this._undo.change())}}moveEdgeVertex(t,e,n,o=!1,i=!1){if(this._snapToGrid&&!o){const t=this.snapToGrid(e,n);e=t.x,n=t.y}t.x==e&&t.y==n||(i||this._undo.beforeChange(),this.clearResolvedLayout(),t.x=e,t.y=n,this.redrawEdge(t.edge),i||this._undo.change())}moveSelected(t,e,n=!1){this.nodes().forEach(o=>o.selected&&this.moveNode(o,o.x+t,o.y+e,n,!1)),this.edgeVertices.forEach(o=>o.selected&&this.moveEdgeVertex(o,o.x+t,o.y+e,n,!1))}insertEdgeVertex(t,e,n,o){this._undo.beforeChange(),this.clearResolvedLayout();const i=t.initVertex(e);i.selected=!0,o&&(t.vertices.forEach(t=>t.label=!1),i.label=!0),t.vertices.splice(n-1,0,i),this.redrawEdge(t),this._undo.change()}deleteEdgeVertex(t){this._undo.beforeChange(),this.clearResolvedLayout();const e=t.edge.vertices.indexOf(t);e>=0&&(t.edge.vertices.splice(e,1),this.edgeVertices.delete(t.id),t.edge.userDeletedVertices=!0),this.redrawEdge(t.edge),this._undo.change()}changed(){return this._undo.changed()}undo(){this._undo.undo()}redo(){this._undo.redo()}alignTopLeft(){const t=this.calculateContentBounds(),e=100-t.x,n=100-t.y;this._skipAutoFit=!0,this._undo.beforeChange(),this.nodesMap.forEach(t=>{this.moveNode(t,t.x+e,t.y+n,!0,!0)}),this.edgeVertices.forEach(t=>{this.moveEdgeVertex(t,t.x+e,t.y+n,!0,!0)}),this._undo.change()}resetPanTransform(){const t=O(),e=z.querySelector("g.zoom");e&&(e.setAttribute("transform",`scale(${t}) translate(0, 0)`),function(t){const e=t.calculateContentBounds(),n=O(),o=Math.max(z.parentElement.clientWidth/n,e.x+e.width+20),i=Math.max(z.parentElement.clientHeight/n,e.y+e.height+20);z.setAttribute("width",String(o*n)),z.setAttribute("height",String(i*n))}(this)),nt(this.id),this._skipAutoFit=!1}shouldSkipAutoFit(){return this._skipAutoFit}resetView(){const t=z.querySelector("g.zoom");t&&(t.setAttribute("transform","scale(1) translate(0, 0)"),X()),nt(this.id)}redrawEdges(t){this.edges.forEach(e=>(t==e.from||t==e.to)&&this.redrawEdge(e)),this.updateEdgesSel()}redrawEdge(t){const e=t.ref.parentElement;e.removeChild(t.ref),t.ref=j(t),e.append(t.ref)}redrawGroups(t){this.groupsMap.forEach(t=>{const e=t.ref.parentElement;e.removeChild(t.ref),W(t),e.append(t.ref)})}exportSVG(){this.validatedLayout||(this.validatedLayout=(0,C.U)(this));const t=document.querySelector("svg#graph"),e=(t.querySelector("rect.elastic"),t.cloneNode(!0));e.querySelectorAll("a.nodeLink[data-export-href]").forEach(t=>{t.setAttribute("href",t.getAttribute("data-export-href")||""),t.removeAttribute("data-export-href")});const n=e.querySelector("rect.elastic");n&&n.remove();const o=this.calculateContentBounds(),i=o.width+100,r=o.height+100,s=50-o.x,a=50-o.y,d=e.querySelector("g.zoom");d&&d.setAttribute("transform",`scale(1) translate(${s}, ${a})`),e.setAttribute("viewBox",`0 0 ${i} ${r}`),e.setAttribute("width",String(i)),e.setAttribute("height",String(r)),e.setAttribute("xmlns","http://www.w3.org/2000/svg"),this.convertStylesToCustomProperties(e);const l=document.createElement("script");return l.setAttribute("type","application/json"),this.metadata.layout=this.exportLayout(),l.append("/g,"]]]>]>"),e.insertBefore(l,e.firstChild),e.outerHTML}convertStylesToCustomProperties(t){0!==this.colorToVarMap.size&&(t.querySelectorAll("[fill]").forEach(t=>{const e=t.getAttribute("fill");e&&this.colorToVarMap.has(e)&&t.setAttribute("fill",`var(${this.colorToVarMap.get(e)}, ${e})`)}),t.querySelectorAll("[stroke]").forEach(t=>{const e=t.getAttribute("stroke");e&&this.colorToVarMap.has(e)&&t.setAttribute("stroke",`var(${this.colorToVarMap.get(e)}, ${e})`)}))}calculateContentBounds(){let t=1/0,e=1/0,n=-1/0,o=-1/0;return this.nodes().forEach(i=>{const r=i.x-i.width/2,s=i.x+i.width/2,a=i.y-i.height/2,d=i.y+i.height/2;t=Math.min(t,r),n=Math.max(n,s),e=Math.min(e,a),o=Math.max(o,d)}),this.edgeVertices.forEach(i=>{t=Math.min(t,i.x-5),n=Math.max(n,i.x+5),e=Math.min(e,i.y-5),o=Math.max(o,i.y+5)}),this.groupsMap.forEach(i=>{const r=i.x-i.width/2,s=i.x+i.width/2,a=i.y-i.height/2,d=i.y+i.height/2;t=Math.min(t,r),n=Math.max(n,s),e=Math.min(e,a),o=Math.max(o,d)}),this.edges.forEach(i=>{if(t=Math.min(t,i.from.x-10,i.to.x-10),n=Math.max(n,i.from.x+10,i.to.x+10),e=Math.min(e,i.from.y-10,i.to.y-10),o=Math.max(o,i.from.y+10,i.to.y+10),i.vertices&&i.vertices.forEach(i=>{t=Math.min(t,i.x-10),n=Math.max(n,i.x+10),e=Math.min(e,i.y-10),o=Math.max(o,i.y+10)}),i.label&&i.label.trim()){const r=(i.from.x+i.to.x)/2,s=(i.from.y+i.to.y)/2,a=10*i.label.length+50;t=Math.min(t,r-a),n=Math.max(n,r+a),e=Math.min(e,s-25),o=Math.max(o,s+25)}}),t===1/0?{x:0,y:0,width:100,height:100}:{x:t,y:e,width:n-t,height:o-e}}exportLayout(t=!1){const e={};return this.nodes().forEach(t=>e[t.id]={x:t.x,y:t.y}),this.edges.forEach(n=>{if(!n.vertices)return;const o=n.vertices.map(t=>({x:t.x,y:t.y,label:t.label,auto:t.auto}));(o.length||t)&&(e[`e-${n.id}`]=o),n.userDeletedVertices&&(e[`e-${n.id}-deleted`]=!0)}),e}setSaved(){this._undo.setSaved()}importLayout(t,e=!1){this.clearResolvedLayout();for(const[e,n]of Object.entries(t)){const t=this.nodesMap.get(e);if(t){const o=L(e,n);t.x=o.x,t.y=o.y;continue}if(e.endsWith("-deleted")){const t=e.slice(2,-8),o=this.edges.find(e=>e.id===t);if(!o||!0!==n)throw new Error(`invalid deleted-edge layout entry ${e}`);o.userDeletedVertices=!0;continue}if(e.startsWith("e-")){const t=this.edges.find(t=>t.id===e.slice(2));if(!t||!Array.isArray(n))throw new Error(`invalid edge layout entry ${e}`);for(const e of t.vertices??[])this.edgeVertices.delete(e.id);t.vertices=n.map((n,o)=>{const i=L(`${e}[${o}]`,n),r=t.initVertex(i);return r.label=n.label,r.auto=n.auto,r});continue}throw new Error(`layout contains unknown element ${e}`)}for(const e of this.nodes())if(!(e.id in t))throw new Error(`layout is missing node ${e.id}`);e&&(this.nodes().forEach(t=>l(t.ref,t.x,t.y)),this.edges.forEach(t=>this.redrawEdge(t)),this.updateEdgesSel(),this.redrawGroups(null))}async autoLayout(t){const e=await(0,C.k)(this,t);this._undo.beforeChange();for(const t of e.nodes){const e=this.nodesMap.get(t.id);if(!e)throw new Error(`layout contains unknown node ${t.id}`);e.x=t.x,e.y=t.y,l(e.ref,e.x,e.y)}for(const t of e.groups){const e=this.groupsMap.get(t.id);if(!e)throw new Error(`layout contains unknown group ${t.id}`);e.layoutBounds=t.bounds,e.layoutTitleBounds=t.titleBounds,e.x=t.bounds.x+t.bounds.width/2,e.y=t.bounds.y+t.bounds.height/2,e.width=t.bounds.width,e.height=t.bounds.height}for(const t of e.edges){const e=this.edges.find(e=>e.id===t.id);if(!e)throw new Error(`layout contains unknown edge ${t.id}`);for(const t of e.vertices??[])this.edgeVertices.delete(t.id);e.layoutSections=t.sections,e.layoutLabelBounds=t.labelBounds,e.vertices=_(t.sections).map(t=>{const n=e.initVertex(t);return n.auto=!0,n}),e.userDeletedVertices=!1}this.validatedLayout=e.validated,this.edges.forEach(t=>this.redrawEdge(t)),this.redrawGroups(null),this.fitToView(),this._undo.change()}alignSelectionV(){const t=this.nodes().filter(t=>t.selected);t.push(...Array.from(this.edgeVertices.values()).filter(t=>t.selected));let e=Math.min(...t.map(t=>t.y));this.nodesMap.forEach(t=>t.selected&&this.moveNode(t,t.x,e,!1,!1)),this.edgeVertices.forEach(t=>t.selected&&this.moveEdgeVertex(t,t.x,e,!1,!1))}alignSelectionH(){const t=this.nodes().filter(t=>t.selected);t.push(...Array.from(this.edgeVertices.values()).filter(t=>t.selected));let e=Math.min(...t.map(t=>t.x));this.nodesMap.forEach(t=>t.selected&&this.moveNode(t,e,t.y,!1,!1)),this.edgeVertices.forEach(t=>t.selected&&this.moveEdgeVertex(t,e,t.y,!1,!1))}distributeSelectionH(){const t=this.nodes().filter(t=>t.selected),e=Array.from(this.edgeVertices.values()).filter(t=>t.selected);if(t.length+e.length<3)return;this._undo.beforeChange();const n=[...t,...e];n.sort((t,e)=>t.x-e.x);const o=n[0].x,i=(n[n.length-1].x-o)/(n.length-1);n.forEach((t,e)=>{const n=o+e*i;"title"in t?this.moveNode(t,n,t.y,!1,!0):this.moveEdgeVertex(t,n,t.y,!1,!0)}),this._undo.change()}distributeSelectionV(){const t=this.nodes().filter(t=>t.selected),e=Array.from(this.edgeVertices.values()).filter(t=>t.selected);if(t.length+e.length<3)return;this._undo.beforeChange();const n=[...t,...e];n.sort((t,e)=>t.y-e.y);const o=n[0].y,i=(n[n.length-1].y-o)/(n.length-1);n.forEach((t,e)=>{const n=o+e*i;"title"in t?this.moveNode(t,t.x,n,!1,!0):this.moveEdgeVertex(t,t.x,n,!1,!0)}),this._undo.change()}setEdgeSelected(t,e){e&&(this.setNodeSelected(t.from,!0),this.setNodeSelected(t.to,!0)),this.updateEdgesSel()}fitToView(){const t=this.calculateContentBounds();if(0===t.width||0===t.height)return;const e=z.parentElement?.clientWidth||800,n=z.parentElement?.clientHeight||600,o=(e-80)/t.width,i=(n-80)/t.height,r=Math.min(o,i),s=Math.max(Math.min(r,2),.1),a=e/2-(t.x+t.width/2)*s,d=n/2-(t.y+t.height/2)*s,l=z.querySelector("g.zoom");l&&l.setAttribute("transform",`translate(${a}, ${d}) scale(${s})`),X(),tt(this.id)}saveLayoutState(){return this.exportLayout(!0)}restoreLayoutState(t){this.importLayout(t,!0)}isGridVisible(){return this._gridVisible}isSnapToGrid(){return this._snapToGrid}getGridSize(){return this._gridSize}toggleGrid(){this._gridVisible=!this._gridVisible,this.updateGridDisplay(),window.dispatchEvent(new CustomEvent("gridStateChanged"))}toggleSnapToGrid(){this._snapToGrid=!this._snapToGrid,window.dispatchEvent(new CustomEvent("gridStateChanged"))}snapAllToGrid(){this._snapToGrid&&(this._undo.beforeChange(),this.nodes().forEach(t=>{const e=Math.round(t.x/this._gridSize)*this._gridSize,n=Math.round(t.y/this._gridSize)*this._gridSize;this.moveNode(t,e,n,!1,!0)}),this._undo.change())}snapToGrid(t,e){return{x:Math.round(t/this._gridSize)*this._gridSize,y:Math.round(e/this._gridSize)*this._gridSize}}updateGridDisplay(){if(!z)return;const t=z.querySelector("#grid-pattern");t&&t.remove();const e=z.querySelector("#grid-background");if(e&&e.remove(),!this._gridVisible)return;let n=z.querySelector("defs");n||(n=document.createElementNS("http://www.w3.org/2000/svg","defs"),z.insertBefore(n,z.firstChild));const o=document.createElementNS("http://www.w3.org/2000/svg","pattern");o.id="grid-pattern",o.setAttribute("width",this._gridSize.toString()),o.setAttribute("height",this._gridSize.toString()),o.setAttribute("patternUnits","userSpaceOnUse");const i=document.createElementNS("http://www.w3.org/2000/svg","path");i.setAttribute("d",`M ${this._gridSize} 0 L 0 0 0 ${this._gridSize}`),i.setAttribute("fill","none"),i.setAttribute("stroke","#d0d0d0"),i.setAttribute("stroke-width","1"),i.setAttribute("opacity","0.8"),o.appendChild(i),n.appendChild(o);const r=document.createElementNS("http://www.w3.org/2000/svg","rect");r.id="grid-background",r.setAttribute("x","-10000"),r.setAttribute("y","-10000"),r.setAttribute("width","20000"),r.setAttribute("height","20000"),r.setAttribute("fill","url(#grid-pattern)"),r.setAttribute("pointer-events","none");const s=z.querySelector("g.zoom");s&&s.insertBefore(r,s.firstChild)}}function _(t){const e=[];for(const n of t)for(const t of n){const n=e[e.length-1];n&&n.x===t.x&&n.y===t.y||e.push(t)}return e.slice(1,-1)}function L(t,e){if("object"!=typeof e||Array.isArray(e)||!Number.isFinite(e.x)||!Number.isFinite(e.y))throw new Error(`layout entry ${t} must contain valid x and y coordinates`);return e}let D,z=document.querySelector("svg#graph");z||(z=document.createElementNS("http://www.w3.org/2000/svg","svg"),z.setAttribute("id","graph"),z.addEventListener("click",t=>D(t))),z.setAttribute("width","100%"),z.setAttribute("height","100%");let V,T=!1;const N=(t,e,n)=>{z.innerHTML='\n\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n',document.body.append(z),z.__data=t,V=e,D=t=>{},q(t);const o=d.rect(300,300,50,50,0,"elastic");return z.append(o),t.updateGridDisplay(),U(z,n),{svg:z,setZoom:P}},F=t=>(z=document.createElementNS("http://www.w3.org/2000/svg","svg"),z.setAttribute("id","graph"),q(t),z),q=t=>{const e=d.element("g",{},"zoom"),n=d.element("g",{},"nodes"),o=d.element("g",{},"edges"),i=d.element("g",{},"groups");e.append(i,o,n),t.nodesMap.forEach(e=>{!function(t,e){window.gdata=e;const n=d.element("g",{},"node");n.setAttribute("id",t.id),t.selected&&n.classList.add("selected"),l(n,t.x,t.y);const o=t.link?d.element("a",{href:t.link.href,"data-export-href":t.link.exportHref,"aria-label":`Open ${t.title}`},"nodeLink"):null,i=o||n;o&&(n.classList.add("linked"),n.append(o));const r=t.style.shape||"Box",s=(w[r.toLowerCase()]||w.box)(i,t);s.classList.add("nodeBorder"),(0,I.AV)(s,Q.nodeBorder),s.setAttribute("fill",t.style.background),s.setAttribute("stroke",t.style.stroke),s.setAttribute("stroke-width","3"),s.setAttribute("opacity",String(t.style.opacity)),K(s,t.style.border);const a=function(t,e){const n=d.element("g");let o=-t.textHeight/2;return t.blocks.forEach(t=>{const i=d.text("",{"text-anchor":"middle"});(0,I.AV)(i,I.M5.nodeText),e&&i.setAttribute("fill",e),t.field&&i.setAttribute("data-field",t.field),t.lines.forEach((e,n)=>{const r=d.element("tspan",{x:0,y:o+t.fontSize+n*t.lineHeight,"font-size":`${t.fontSize}px`,"font-weight":t.bold?"bold":"normal"});r.textContent=e,i.append(r)}),n.append(i),o+=t.lines.length*t.lineHeight+t.gapAfter}),n}(t.contentLayout,t.style.color);l(a,0,(Number(i.getAttribute("label-offset-y"))||0)/2),i.append(a),n.__data=t,t.ref=n}(e,t),n.append(e.ref)}),t.edges.forEach(t=>{t.labelBounds=void 0}),t.edges.forEach(t=>{j(t),o.append(t.ref)}),t.groupsMap.forEach(t=>{W(t),i.append(t.ref)}),z.append(e)};function j(t){const e=t.from,n=d.element("g",{},"edge");n.setAttribute("id",t.id),n.setAttribute("data-from",t.from.id),n.setAttribute("data-to",t.to.id);const o=(t.style.position||50)/100,i=t.layoutSections?function(t){const e=[];for(const n of t)for(const t of n){const n=e[e.length-1];n&&n.x===t.x&&n.y===t.y||e.push(t)}return e}(t.layoutSections):(0,k.l)(t),{bg:r,txt:s}=t.layoutLabelBounds?function(t,e){const n=t.x+t.width/2,{txt:o}=(t.y,t.height,d.textArea(e.label,200,e.style.fontSize,!1,n,t.y,"middle"));(0,I.AV)(o,Q.edgeText),o.setAttribute("stroke","none"),o.setAttribute("font-size",String(e.style.fontSize)),o.setAttribute("fill",e.style.color),o.setAttribute("data-field","label");const i=d.rect(t.width,t.height,t.x,t.y);return(0,I.AV)(i,Q.edgeRect),{bg:i,txt:o}}(t.layoutLabelBounds,t):function(t,e){const n=e.style.fontSize;let{txt:o,dy:i,maxW:r}=d.textArea(e.label,200,n,!1,t.x,t.y,"middle");i-=n/2,r+=n;const s="vertical"===t.orientation?t.x+r/2+12:t.x,a="vertical"===t.orientation?t.y:t.y-i/2-12,l={x:s-r/2,y:a-i/2,width:r,height:i};o.querySelectorAll("tspan").forEach(t=>{t.setAttribute("x",String(s))}),o.setAttribute("y",String(a-i/2)),(0,I.AV)(o,Q.edgeText),o.setAttribute("stroke","none"),o.setAttribute("font-size",String(e.style.fontSize)),o.setAttribute("fill",e.style.color);const c=d.rect(l.width,l.height,l.x,l.y);return(0,I.AV)(c,Q.edgeRect),o.setAttribute("data-field","label"),e.labelBounds=l,{bg:c,txt:o}}((0,k.IW)(i,o,e),t);n.append(r,s);const a=(0,k.Zr)(i),l=d.path(a,{"marker-end":"url(#arrow)"},"edge");l.setAttribute("fill","none"),l.setAttribute("stroke",t.style.color),l.setAttribute("stroke-width",String(t.style.thickness)),l.setAttribute("stroke-linecap","round"),t.style.dashed&&l.setAttribute("stroke-dasharray","8"),n.append(l);for(const e of t.vertices??[]){const t=e;t.ref=d.element("circle",{id:t.id,cx:e.x,cy:e.y,r:7,fill:"none"},"v-dot"),t.selected&&t.ref.classList.add("selected"),t.auto&&t.ref.classList.add("auto"),n.append(t.ref)}return t.ref=n,n}function W(t){if(0==t.nodes.length)return;const e=d.element("g",{},"group");if(t.layoutBounds&&t.layoutTitleBounds){const n=t.layoutBounds,o=t.layoutTitleBounds,i=d.rect(n.width,n.height,n.x,n.y);(0,I.AV)(i,Q.groupRect),t.style.stroke&&i.setAttribute("stroke",t.style.stroke),t.style.background&&i.setAttribute("fill",t.style.background);const r=d.text(t.name,{x:o.x,y:o.y,"dominant-baseline":"hanging"});return(0,I.AV)(r,Q.groupText),t.style.color&&r.setAttribute("fill",t.style.color),e.append(i,r),void(t.ref=e)}let n={x:1e100,y:1e100},o={x:0,y:0};t.nodes.forEach(t=>{const e=t.style?.shape?.toLowerCase()||"box";let i=t.height/2,r=t.height/2;if("robot"===e){const e=.12*t.height;i=t.height/2+e,r=t.height/2}else if("hexagon"===e){const e=t.width/2*.866;i=e,r=e}const s={x:t.x-t.width/2,y:t.y-i,width:t.width,height:i+r};n.x=Math.min(n.x,s.x),n.y=Math.min(n.y,s.y),o.x=Math.max(o.x,s.x+s.width),o.y=Math.max(o.y,s.y+s.height)});const i=Math.max(o.x-n.x,200),r=o.y-n.y,s={x:n.x-25,y:n.y-25,width:i+50,height:r+50+30},a=d.rect(s.width,s.height,s.x,s.y);t.x=s.x+s.width/2,t.y=s.y+s.height/2,t.width=s.width,t.height=s.height,(0,I.AV)(a,Q.groupRect),t.style.stroke&&a.setAttribute("stroke",t.style.stroke),t.style.background&&a.setAttribute("fill",t.style.background);const l=d.text(t.name,{x:n.x,y:s.y+s.height-Q.groupText["font-size"]});(0,I.AV)(l,Q.groupText),t.style.color&&l.setAttribute("fill",t.style.color),e.append(a,l),t.ref=e}function R(t,e){let n={dst:Number.POSITIVE_INFINITY,pos:-1,edge:null,prj:null};return t.edges.forEach(t=>{const o=t.vertices||[],i=[t.from,...o,t.to];for(let o=1;o50||s3||Math.abs(a)>3)&&(h=!0,c=null,l)){const t=e.getSelection();t.length=0,t.push(l.node),e.setSelection(t),o=[{x:l.node.x,y:l.node.y,n:l.node}],l=null}if(r)!function(e,n){const o=t.querySelector("g.zoom");if(!o)return;const i=O();o.setAttribute("transform",`translate(${e}, ${n}) scale(${i})`)}(d.x+s,d.y+a);else if(o.length>0&&h){const t=e.getZoom(),n=s/t,i=a/t;o.forEach(t=>{e.moveNode(t.n,t.x+n,t.y+i)}),e.setDragging(!0)}else i&&(i.update(n),e.setDragging(!0))}(n=f(n),n.clientX-p.ex,n.clientY-p.ey)}function b(n){document.removeEventListener("touchmove",m),document.removeEventListener("mousemove",m),document.removeEventListener("mouseup",b),document.removeEventListener("touchend",b),function(n){e.setDragging(!1);const s=h?null:c;if(h&&(u=!0,window.setTimeout(()=>{u=!1},0)),l&&!h){const t=e.getSelection();t.length=0,t.push(l.node),e.setSelection(t)}if(i){const t=i.end();t?e.boxSelection(t,n.shiftKey):o.length||e.setSelection([]),i=null}if(r&&h){const e=t.__data;e&&e.id&&tt(e.id)}l=null,c=null,h=!1,r=!1,e.updatePanning(),s&&(window.location.href=s)}(f(n)),p=null}function y(u){u=f(u),p={ex:u.clientX,ey:u.clientY},function(u){u.preventDefault(),h=!1,l=null;const A=u.target,g=A instanceof Element?A.closest("a.nodeLink"):null;c=u.shiftKey?null:g?.getAttribute("href")||null;const p=e.nodeFromEvent(u),f=u.shiftKey?"pan"===n?"select":"pan":n;if(p)if("pan"===f){r=!1,i=null;const t=e.getSelection();e.isSelected(p)?o=t.map(t=>({x:t.x,y:t.y,n:t})):(e.setSelection([p]),o=[{x:p.x,y:p.y,n:p}])}else{r=!1,i=null;const t=e.getSelection();if(u.shiftKey&&"select"===n){if(e.isSelected(p)){const e=t.findIndex(t=>t.id===p.id);e>=0&&t.splice(e,1)}else t.push(p);e.setSelection(t),o=t.map(t=>({x:t.x,y:t.y,n:t}))}else e.isSelected(p)?(o=t.map(t=>({x:t.x,y:t.y,n:t})),l=null):(l={node:p,shiftKey:u.shiftKey},o=[{x:p.x,y:p.y,n:p}])}else"pan"===f?(r=!0,i=null,s=u.clientX,a=u.clientY,d=function(){const e=t.querySelector("g.zoom");if(!e)return{x:0,y:0};const n=(e.getAttribute("transform")||"").match(/translate\(([^,]+),([^)]+)\)/);return n?{x:parseFloat(n[1])||0,y:parseFloat(n[2])||0}:{x:0,y:0}}(),o=[],e.setSelection([])):(r=!1,i=function(){let e=0,n=0,o=null;return{ini(i){const r=G(i);e=r.x,n=r.y,o=document.createElementNS("http://www.w3.org/2000/svg","rect"),o.setAttribute("fill","rgba(0, 100, 255, 0.1)"),o.setAttribute("stroke","rgba(0, 100, 255, 0.5)"),o.setAttribute("stroke-width","1"),o.setAttribute("stroke-dasharray","3,3"),o.setAttribute("x",String(e)),o.setAttribute("y",String(n)),o.setAttribute("width","0"),o.setAttribute("height","0");const s=t.querySelector("g.zoom");s?s.appendChild(o):t.appendChild(o)},update(t){if(!o)return;const i=G(t),r=i.x,s=i.y,a=Math.min(e,r),d=Math.min(n,s),l=Math.abs(r-e),c=Math.abs(s-n);o.setAttribute("x",String(a)),o.setAttribute("y",String(d)),o.setAttribute("width",String(l)),o.setAttribute("height",String(c))},end(){if(!o)return null;const t=parseFloat(o.getAttribute("x")||"0"),e=parseFloat(o.getAttribute("y")||"0"),n=parseFloat(o.getAttribute("width")||"0"),i=parseFloat(o.getAttribute("height")||"0");return o.remove(),o=null,n>5&&i>5?{x:t,y:e,width:n,height:i,left:t,top:e,right:t+n,bottom:e+i}:null}}}(),i&&i.ini(u),o=[])}(u),document.addEventListener("touchmove",m),document.addEventListener("mousemove",m),document.addEventListener("mouseup",b),document.addEventListener("touchend",b)}g.addEventListener("mousedown",y),g.addEventListener("touchstart",y),A.push({element:g,event:"mousedown",handler:y},{element:g,event:"touchstart",handler:y})}(t),t.addEventListener("click",g),A.push({element:t,event:"click",handler:g}),()=>{A.forEach(({element:t,event:e,handler:n})=>{t.removeEventListener(e,n)})}}function U(t,e){const n=t.__cursorInteractionCleanup;function o(t){return t.__data}n&&n();const i=()=>o(t),r=[],s=t=>{i().changed()&&(t.preventDefault(),t.returnValue="")};function a(e,n){e.selected=n;const o=t.querySelector("#"+e.id);e.selected?o.classList.add("selected"):o.classList.remove("selected")}window.addEventListener("beforeunload",s),r.push({element:window,event:"beforeunload",handler:s});const l=e=>{if(!e.altKey)return;const n=R(i(),G(e));if(n){const{prj:e}=n,o=t.querySelector("g.edges");let i=o.querySelector("#prj");i||(i=d.element("circle",{id:"prj",cx:e.x,cy:e.y,r:7}),o.append(i)),i.setAttribute("cx",String(e.x)),i.setAttribute("cy",String(e.y))}else u()};t.addEventListener("mousemove",l),r.push({element:t,event:"mousemove",handler:l});const h=t=>{const e=(0,B.Yp)(t,!0);e!=B.Zj&&e!=B._s&&u()};function u(){const e=t.querySelector("g.edges #prj");e&&e.parentElement.removeChild(e)}window.addEventListener("keyup",h),r.push({element:window,event:"keyup",handler:h});const A=t=>{const e=(0,B.Yp)(t,!0);if(e!=B._s&&e!=B.Zj)return;const n=R(i(),G(t));if(n){const{edge:t,pos:o,prj:r}=n;i().insertEdgeVertex(t,r,o,e==B._s),u()}};t.addEventListener("click",A),r.push({element:t,event:"click",handler:A});const g=e=>{const n=.1*Math.sign(e.deltaY),o=O(),i=Math.max(.1,Math.min(5,o-n));if(i!==o){const n=t.getBoundingClientRect();H(i,e.clientX-n.left,e.clientY-n.top),e.preventDefault();const o=t.__data;o&&o.id&&tt(o.id)}};t.addEventListener("wheel",g),r.push({element:t,event:"wheel",handler:g});const p=t=>{const e=(0,B.Yp)(t);switch(e&&t.preventDefault(),e){case B.bl:Array.from(i().edgeVertices.values()).filter(t=>t.selected).forEach(t=>{i().deleteEdgeVertex(t)});break;case"undo":i().undo();break;case"redo":i().redo();break;case B.Ur:H(Math.min(5,1.2*O())),tt(i().id);break;case B.hU:H(Math.max(.1,O()/1.2)),tt(i().id);break;case B.i1:H(1),tt(i().id);break;case B.mD:i().fitToView();break;case B.F:i().nodes().forEach(t=>i().setNodeSelected(t,!0)),i().edgeVertices.forEach(t=>a(t,!0));break;case B.Gn:i().nodes().forEach(t=>i().setNodeSelected(t,!1)),i().edgeVertices.forEach(t=>a(t,!1))}};window.addEventListener("keydown",p),r.push({element:window,event:"keydown",handler:p});const f=Y(t,{nodeFromEvent(t){t.preventDefault();let e=t.target.closest("g.nodes g.node");return e?o(e):(e=t.target.closest("g.edges g.edge .v-dot"),e?i().edgeVertices.get(e.id):null)},setSelection(t){i().nodes().forEach(e=>i().setNodeSelected(e,t.some(t=>t.id==e.id))),i().edgeVertices.forEach(e=>a(e,t.some(t=>t.id==e.id))),V(i().nodes().find(t=>t.selected))},setDragging(t){T=t},isSelected:t=>t.selected,getSelection(){const t=i().nodes().filter(t=>t.selected);return i().edgeVertices.forEach(e=>e.selected&&t.push(e)),t},getZoom:O,moveNode(t,e,n){i().nodesMap.has(t.id)?i().moveNode(t,e,n):(t.auto=!1,i().moveEdgeVertex(t,e,n))},boxSelection(t,e){i().nodesMap.forEach(n=>{var o,r,s;(o={x:(s=n).x-s.width/2,y:s.y-s.height/2,width:s.width,height:s.height}).x<(r=t).x+r.width&&o.yr.x&&o.y+o.height>r.y?i().setNodeSelected(n,!n.selected):e||i().setNodeSelected(n,!1)}),i().edgeVertices.forEach(n=>{c(n,t,!1)?a(n,!n.selected):e||a(n,!1)}),V(i().nodes().find(t=>t.selected))},updatePanning:X},e);t.__cursorInteractionCleanup=()=>{r.forEach(({element:t,event:e,handler:n})=>{t.removeEventListener(e,n)}),f&&f()}}function O(){if(!z)return 1;const t=z.querySelector("g.zoom");if(!t)return 1;const e=(t.getAttribute("transform")||"").match(/scale\(([^)]+)\)/);return e&&parseFloat(e[1])||1}function P(t){if(!z)return;const e=z.querySelector("g.zoom");if(!e)return;const n=Z();e.setAttribute("transform",`translate(${n.x}, ${n.y}) scale(${t})`),X()}function H(t,e,n){const o=z.querySelector("g.zoom"),i=O();if(void 0===e||void 0===n){const t=z.parentElement;t?(e=t.clientWidth/2,n=t.clientHeight/2):(e=z.clientWidth/2,n=z.clientHeight/2)}const r=Z(),s=e-(e-r.x)/i*t,a=n-(n-r.y)/i*t;o.setAttribute("transform",`translate(${s}, ${a}) scale(${t})`),X()}function Z(){if(!z)return{x:0,y:0};const t=z.querySelector("g.zoom");if(!t)return{x:0,y:0};const e=(t.getAttribute("transform")||"").match(/translate\(([^,]+),([^)]+)\)/);return e?{x:parseFloat(e[1])||0,y:parseFloat(e[2])||0}:{x:0,y:0}}function X(){if(!z)return;const t=z.querySelector("g.zoom");if(!t)return;const e=t.getBBox(),n=O();if(!z.parentElement)return;const o=Math.max(z.parentElement.clientWidth/n,e.x+e.width+20),i=Math.max(z.parentElement.clientHeight/n,e.y+e.height+20);z.setAttribute("width",String(o*n)),z.setAttribute("height",String(i*n))}const K=(t,e)=>{"Dashed"==e?t.setAttribute("stroke-dasharray","4"):"Dotted"==e&&t.setAttribute("stroke-dasharray","2")},Q={nodeBorder:{filter:"url(#shadow)"},nodeText:{"font-family":"Arial, sans-serif",stroke:"none"},edgeText:{"font-family":"Arial, sans-serif",stroke:"none"},edgeRect:{fill:"none",stroke:"none"},groupRect:{fill:"rgba(0, 0, 0, 0.02)",stroke:"#666","stroke-width":3,"stroke-dasharray":4},groupText:{"font-family":"Arial, sans-serif",fill:"#666","font-size":22,"font-weight":"bold",cursor:"default"}},J=new Map;function tt(t){if(!z)return;const e=O(),n=Z(),o={zoom:e,transform:{x:n.x,y:n.y}};J.set(t,o)}function et(t){if(!z||!J.has(t))return!1;const e=J.get(t);if(!e)return!1;const n=z.querySelector("g.zoom");return n&&(n.setAttribute("transform",`scale(${e.zoom}) translate(${e.transform.x}, ${e.transform.y})`),X()),!0}function nt(t){J.delete(t)}},983(t,e,n){n.d(e,{k:()=>x,U:()=>w});var o=n(20);const i={direction:"DOWN",nodeSpacing:80,layerSpacing:80};async function r(t,e={}){const o=function(t,e){const n=new Map(t.nodes.map(t=>[t.id,t])),o=new Map(t.groups.map(t=>[t.id,t]));!function(t,e,n){for(const e of t.nodes)if(e.parentId&&!n.has(e.parentId))throw new Error(`node ${e.id} has missing parent group ${e.parentId}`);for(const e of t.groups)if(e.parentId&&!n.has(e.parentId))throw new Error(`group ${e.id} has missing parent group ${e.parentId}`);for(const n of t.edges)if(!e.has(n.sourceId)||!e.has(n.targetId))throw new Error(`edge ${n.id} connects missing node ${n.sourceId} or ${n.targetId}`)}(t,n,o);const i=new Map;for(const e of t.nodes)b(i,e.parentId,e);const r=new Map;for(const e of t.groups)b(r,e.parentId,e);const h=new Map,u=t=>{const n={id:t.id,children:[...(r.get(t.id)??[]).map(u),...(i.get(t.id)??[]).map(s)],edges:[],labels:[{text:t.id,width:t.titleSize.width,height:t.titleSize.height}],layoutOptions:l(e,t.titleSize.height)};return h.set(t.id,n),n},A={id:t.id,children:[...(r.get(void 0)??[]).map(u),...(i.get(void 0)??[]).map(s)],edges:[],layoutOptions:d(e)};for(const e of t.edges){const t=c(e,n,o),i=t?h.get(t):A;if(!i)throw new Error(`edge ${e.id} has missing layout group ${t}`);i.edges?.push(a(e))}return A}(t,{...i,...e}),r=new(await n.e(726).then(n.t.bind(n,862,23)).then(t=>t.default));return function(t,e){if(void 0===e.width||void 0===e.height)throw new Error(`ELK did not size diagram ${t.id}`);const n=[],o=[],i=[];return u(e,0,0,new Map(t.nodes.map(t=>[t.id,t])),new Map(t.groups.map(t=>[t.id,t])),n,o,i),{diagramId:t.id,bounds:{x:0,y:0,width:e.width,height:e.height},nodes:n,groups:o,edges:i}}(t,await r.layout(o))}function s(t){return{id:t.id,width:t.size.width,height:t.size.height,layoutOptions:{"elk.nodeSize.constraints":"FIXED_SIZE","elk.portConstraints":"FREE"}}}function a(t){return{id:t.id,sources:[t.sourceId],targets:[t.targetId],labels:t.labelSize?[{text:t.id,width:t.labelSize.width,height:t.labelSize.height,layoutOptions:{"elk.edgeLabels.inline":"false","elk.edgeLabels.placement":"CENTER"}}]:[]}}function d(t){return{"elk.algorithm":"layered","elk.direction":t.direction,"elk.edgeRouting":"ORTHOGONAL","elk.hierarchyHandling":"INCLUDE_CHILDREN","elk.padding":"[top=40,left=40,bottom=40,right=40]","elk.spacing.nodeNode":String(t.nodeSpacing),"elk.spacing.componentComponent":String(t.nodeSpacing),"elk.layered.spacing.nodeNodeBetweenLayers":String(t.layerSpacing),"elk.layered.spacing.edgeNodeBetweenLayers":"30","elk.layered.spacing.edgeEdgeBetweenLayers":"20","elk.layered.nodePlacement.strategy":"NETWORK_SIMPLEX","elk.layered.nodePlacement.favorStraightEdges":"true","elk.layered.crossingMinimization.strategy":"LAYER_SWEEP","elk.layered.unnecessaryBendpoints":"true","elk.edgeLabels.inline":"false","elk.edgeLabels.avoidOverlap":"true","elk.layered.edgeLabels.sideSelection":"SMART_DOWN","elk.spacing.edgeLabel":"12"}}function l(t,e){return{...d(t),"elk.padding":`[top=${e+30},left=30,bottom=30,right=30]`,"elk.nodeLabels.placement":"[H_LEFT,V_TOP,INSIDE]","elk.spacing.labelNode":"10"}}function c(t,e,n){const o=h(e.get(t.sourceId)?.parentId,n),i=new Set(h(e.get(t.targetId)?.parentId,n));return o.find(t=>i.has(t))}function h(t,e){const n=[];let o=t;for(;o;)n.push(o),o=e.get(o)?.parentId;return n}function u(t,e,n,o,i,r,s,a){const d=e+(t.x??0),l=n+(t.y??0);for(const e of t.children??[]){const t=d+p(e.x,e.id,"x"),n=l+p(e.y,e.id,"y"),c=p(e.width,e.id,"width"),h=p(e.height,e.id,"height"),A=o.get(e.id);if(A){r.push({id:e.id,parentId:A.parentId,bounds:{x:t,y:n,width:c,height:h}});continue}const g=i.get(e.id);if(!g)throw new Error(`ELK returned unknown node ${e.id}`);const f=m(e.labels?.[0],e.id);s.push({id:e.id,parentId:g.parentId,bounds:{x:t,y:n,width:c,height:h},titleBounds:{x:t+p(f.x,e.id,"title x"),y:n+p(f.y,e.id,"title y"),width:p(f.width,e.id,"title width"),height:p(f.height,e.id,"title height")}}),u(e,d,l,o,i,r,s,a)}for(const e of t.edges??[])a.push(A(e,d,l))}function A(t,e,n){const o=(t.sections??[]).map(t=>[g(t.startPoint,e,n),...(t.bendPoints??[]).map(t=>g(t,e,n)),g(t.endPoint,e,n)]),i=t.labels?.[0];return{id:t.id,sourceId:f(t.sources,t.id,"source"),targetId:f(t.targets,t.id,"target"),sections:o,labelBounds:i?{x:e+p(i.x,t.id,"label x"),y:n+p(i.y,t.id,"label y"),width:p(i.width,t.id,"label width"),height:p(i.height,t.id,"label height")}:void 0}}function g(t,e,n){return{x:e+t.x,y:n+t.y}}function p(t,e,n){if(void 0===t)throw new Error(`ELK omitted ${n} for ${e}`);return t}function f(t,e,n){if(1!==t.length)throw new Error(`ELK returned ${t.length} ${n}s for edge ${e}`);return t[0]}function m(t,e){if(!t)throw new Error(`ELK omitted title for group ${e}`);return t}function b(t,e,n){const o=t.get(e)??[];o.push(n),t.set(e,o)}n(828);var y=n(977);async function x(t,e={}){await document.fonts.ready;const n=C(t),i=e.compactLayout?56:80,s=await r(n,{direction:e.direction??t.layoutDirection??"DOWN",nodeSpacing:e.nodeSpacing??i,layerSpacing:e.layerSpacing??i}),a=(0,o.r)(n,s),d=new Map(n.nodes.map(t=>[t.id,t]));return{validated:a,nodes:a.nodes.map(t=>{const e=d.get(t.id);if(!e)throw new Error(`validated layout contains unknown node ${t.id}`);return{id:t.id,x:t.bounds.x+e.centerOffset.x,y:t.bounds.y+e.centerOffset.y}}),groups:a.groups.map(t=>({id:t.id,bounds:t.bounds,titleBounds:t.titleBounds})),edges:a.edges.map(t=>({id:t.id,sections:t.sections,labelBounds:t.labelBounds}))}}function w(t){const e=C(t),n=new Map(e.nodes.map(t=>[t.id,t])),i=t.nodes().map(t=>{const e=n.get(t.id);if(!e)throw new Error(`measured diagram omitted node ${t.id}`);return{id:t.id,parentId:e.parentId,bounds:{x:t.x-e.centerOffset.x,y:t.y-e.centerOffset.y,...e.size}}}),r=Array.from(t.groupsMap.values()).map(t=>{if(!t.ref?.isConnected)throw new Error(`group ${t.id} must be drawn before saving`);const n=t.ref.querySelector("rect"),o=t.ref.querySelector("text");if(!(n instanceof SVGGraphicsElement&&o instanceof SVGGraphicsElement))throw new Error(`group ${t.id} is missing its boundary or title`);return{id:t.id,parentId:e.groups.find(e=>e.id===t.id)?.parentId,bounds:k(n.getBBox()),titleBounds:k(o.getBBox())}}),s=t.edges.map(t=>{const e=t.layoutSections??[(0,y.l)(t)],n=t.layoutLabelBounds??t.labelBounds;if(t.label.trim().length>0&&!n)throw new Error(`edge ${t.id} is missing its label position`);return{id:t.id,sourceId:t.from.id,targetId:t.to.id,sections:e,labelBounds:n?{...n}:void 0}}),a={diagramId:t.id,bounds:I(i.map(t=>t.bounds),r,s),nodes:i,groups:r,edges:s};return function(t,e){return(0,o.r)(t,e)}(e,a)}function C(t){const{nodeParents:e,groupParents:n}=function(t){const e=new Map,n=new Map;for(const o of t.groupsMap.values())for(const t of o.nodes){const i=E(t)?n:e,r=i.get(t.id);if(r&&r!==o.id)throw new Error(`${E(t)?"group":"node"} ${t.id} belongs to both ${r} and ${o.id}`);i.set(t.id,o.id)}return{nodeParents:e,groupParents:n}}(t);return{id:t.id,nodes:t.nodes().map(t=>function(t,e){if(!t.ref?.isConnected)throw new Error(`node ${t.id} must be drawn before layout`);const n=t.ref.getBBox();return B(t.id,n),{id:t.id,parentId:e,size:{width:n.width,height:n.height},contentSize:{width:n.width,height:n.height},centerOffset:{x:-n.x,y:-n.y},shape:t.style.shape??"Box"}}(t,e.get(t.id))),groups:Array.from(t.groupsMap.values()).map(t=>function(t,e){if(!t.ref?.isConnected)throw new Error(`group ${t.id} must be drawn before layout`);const n=t.ref.querySelector("text");if(!(n instanceof SVGGraphicsElement))throw new Error(`group ${t.id} is missing its drawn title`);const o=n.getBBox();return B(t.id,o),{id:t.id,parentId:e,titleSize:{width:o.width,height:o.height}}}(t,n.get(t.id))),edges:t.edges.map(v)}}function v(t){const e=t.label.trim().length>0;if(e&&!t.labelBounds)throw new Error(`edge ${t.id} must be drawn before layout`);return{id:t.id,sourceId:t.from.id,targetId:t.to.id,labelSize:e?{width:t.labelBounds?.width??0,height:t.labelBounds?.height??0}:void 0}}function B(t,e){if(!Number.isFinite(e.x)||!Number.isFinite(e.y)||!Number.isFinite(e.width)||!Number.isFinite(e.height)||e.width<=0||e.height<=0)throw new Error(`browser returned invalid measured box for ${t}`)}function I(t,e,n){const o=[...t,...e.flatMap(t=>[t.bounds,t.titleBounds]),...n.flatMap(t=>t.labelBounds?[t.labelBounds]:[])],i=n.flatMap(t=>t.sections.flat());if(0===o.length&&0===i.length)return{x:0,y:0,width:0,height:0};const r=Math.min(...o.map(t=>t.x),...i.map(t=>t.x)),s=Math.min(...o.map(t=>t.y),...i.map(t=>t.y));return{x:r,y:s,width:Math.max(...o.map(t=>t.x+t.width),...i.map(t=>t.x))-r,height:Math.max(...o.map(t=>t.y+t.height),...i.map(t=>t.y))-s}}function k(t){return{x:t.x,y:t.y,width:t.width,height:t.height}}function E(t){return"nodes"in t}},71(t,e,n){var o=n(828);const i={TopBottom:"DOWN",BottomTop:"UP",LeftRight:"RIGHT",RightLeft:"LEFT"};n.d(e,["B",0,t=>{const e=[];return Object.keys(t.views).filter(t=>t.endsWith("Views")).forEach(n=>{t.views[n].forEach(t=>{e.push({key:t.key,title:t.title||t.key,section:n})})}),e},"R",0,(t,e,n)=>{const r=new Map,s=new Map,a=t=>{Array.isArray(t.relationships)&&t.relationships.forEach(t=>{s.set(t.id,t)})};if(t.model.people&&t.model.people.forEach(t=>{r.set(t.id,t),Array.isArray(t.relationships)&&t.relationships.forEach(t=>{s.set(t.id,t)})}),t.model.softwareSystems&&t.model.softwareSystems.forEach(t=>{r.set(t.id,t),a(t),Array.isArray(t.containers)&&t.containers.forEach(e=>{e.parent=t,r.set(e.id,e),a(e),Array.isArray(e.components)&&e.components.forEach(t=>{t.parent=e,r.set(t.id,t),a(t)})})}),t.model.deploymentNodes){const e=t=>{t.containerInstances&&t.containerInstances.forEach(e=>{const n={...r.get(e.containerId),id:e.id};r.set(n.id,n),n.parent=t,a(e)})},n=(t,o)=>{t.parent=o,r.set(t.id,t),a(t),e(t),t.children&&t.children.forEach(e=>n(e,t)),t.infrastructureNodes&&t.infrastructureNodes.forEach(e=>n(e,t))};t.model.deploymentNodes.forEach(t=>n(t,null))}const{view:d,section:l}=function(t,e){let n=null,o="";return Object.keys(t.views).filter(t=>t.endsWith("Views")).some(i=>t.views[i].some(t=>{if(t.key==e)return n=t,o=i,!0})),{view:n,section:o}}(t,n);if(!d)return null;const c=new o.jg(d.key,d.title||d.key),h=d.automaticLayout?.rankDirection;c.layoutDirection=h?i[h]:void 0;const u={name:c.name,description:d.description,version:t.version,elements:[]};if(c.metadata=u,!d.elements)return c;const A={};if("deploymentViews"==l||"containerViews"==l)d.elements.forEach(t=>{const e=r.get(t.id);e?.parent&&(A[e.parent.id]=!0)});else if(d.softwareSystemId)d.elements.find(t=>t.id==d.softwareSystemId)||(A[d.softwareSystemId]=!0);else if("systemLandscapeViews"==l){const e={id:"__enterprise__",...t.model.enterprise};r.set(e.id,e),t.model.people&&t.model.people.filter(t=>"External"!=t.location).forEach(t=>t.parent=e),t.model.softwareSystems&&t.model.softwareSystems.filter(t=>"External"!=t.location).forEach(t=>t.parent=e),A[e.id]=!0}const g=t.views.styles,p=t=>t.toLowerCase().replace(/[^a-z0-9-]/g,"-");g?.elements&&g.elements.forEach(t=>{if(t.tag){const e=`--mdl-${p(t.tag)}`;t.background&&c.colorToVarMap.set(t.background,`${e}-bg`),t.color&&c.colorToVarMap.set(t.color,`${e}-color`),t.stroke&&c.colorToVarMap.set(t.stroke,`${e}-stroke`)}}),g?.relationships&&g.relationships.forEach(t=>{if(t.tag){const e=`--mdl-rel-${p(t.tag)}`;t.color&&c.colorToVarMap.set(t.color,`${e}-color`)}}),d.elements.forEach(e=>{if(A[e.id])return;const n=r.get(e.id),o=n?function(t,e){const n=t.views.containerViews?.find(t=>t.softwareSystemId==e);return n?.key}(t,n.id):void 0;let i="",s={};if(n){const t=n.tags.split(",");i=t[t.length-1],n.technology&&(i+=": "+n.technology),t.forEach(t=>{const e=g&&g.elements&&g.elements.find(e=>e.tag==t);e&&(s={...s,...e})})}c.addNode(e.id,n&&n.name||e.id,i,n&&n.description?n.description:"",s,function(t,e){if(e){const t=encodeURIComponent(e);return{href:`?id=${t}`,exportHref:`${t}.svg`}}if(t?.url)return{href:t.url,exportHref:t.url}}(n,o)),n&&u.elements.push({id:n.id,tags:n.tags,location:n.location,properties:n.properties,elementViewKey:o,technology:n.technology,url:n.url})}),Array.isArray(d.relationships)&&d.relationships.forEach(t=>{const e=s.get(t.id);if(!e)return;if(!c.nodesMap.has(e.sourceId)){if(r.has(e.sourceId)){const t=r.get(e.sourceId);console.warn("Element not found in this view: ",t.id,t.name)}else console.warn("Element not found: ",e.sourceId);return}if(!c.nodesMap.has(e.destinationId)){if(r.has(e.destinationId)){const t=r.get(e.destinationId);console.warn("Element not found in this view: ",t.id,t.name)}else console.warn("Element not found: ",e.destinationId);return}let n={};e.tags.split(",").forEach(t=>{const e=g&&g.relationships&&g.relationships.find(e=>e.tag==t);e&&(n={...n,...e})}),t.routing&&(n.routing=t.routing),c.addEdge(e.id,e.sourceId,e.destinationId,e.description,t.vertices,n)});const f=t=>{let e=0;for(let n=t.parent;n;n=n.parent)e++;return e};return Object.keys(A).map(t=>r.get(t)).sort((t,e)=>f(t)>f(e)?-1:1).forEach(t=>{let e={};"deploymentViews"==l&&r.get(t.id).tags.split(",").forEach(t=>{const n=g&&g.elements&&g.elements.find(e=>e.tag==t);n&&(e={...e,...n})});const n=d.elements.map(t=>r.get(t.id)).filter(e=>!(!e||e.parent!==t||"systemLandscapeViews"===l&&"__enterprise__"===t.id&&"External"===e.location)).map(t=>t.id);n.length>0&&c.addGroup(t.id,t.name,n,e)}),c.init(e[c.id]),c}])},264(t,e,n){n(763);var o=n(686),i=n(987);const r="add-vertex",s="add-label-vertex",a="del-vertex",d="zoom-in",l="zoom-out",c="zoom-fit",h="zoom-100",u="select-all",A="deselect",g="move-left",p="move-right",f="move-up",m="move-down",b="move-left-fine",y="move-right-fine",x="move-up-fine",w="move-down-fine",C="toggle_drag_mode",v="align_horizontal",B="align_vertical",I="distribute_horizontal",k="distribute_vertical",E="auto_layout",S="reset_position",$="toggle_grid",M="toggle_snap_to_grid",_="snap_all_to_grid",L=[{name:"Help",list:[{id:"help",help:"Show/hide this help",combinations:[{key:"?",shift:!0},{key:"F1",shift:!0}]}]},{name:"File",list:[{id:"save",help:"Save",combinations:[{key:"s",ctrl:!0}]}]},{name:"History",list:[{id:"undo",help:"Undo",combinations:[{ctrl:!0,key:"z"}]},{id:"redo",help:"Redo",combinations:[{ctrl:!0,shift:!0,key:"z"},{ctrl:!0,key:"y"}]}]},{name:"Relationship editing",list:[{id:r,help:"Add relationship vertex",combinations:[{alt:!0,click:!0}]},{id:s,help:"Add label anchor relationship vertex",combinations:[{alt:!0,shift:!0,click:!0}]},{id:a,help:"Remove relationship vertex",combinations:[{key:"DELETE"},{key:"BACKSPACE"}]}]},{name:"Zoom",list:[{id:d,help:"Zoom in",combinations:[{ctrl:!0,key:"="}]},{id:l,help:"Zoom out",combinations:[{ctrl:!0,key:"-"}]},{id:c,help:"Zoom - fit",combinations:[{ctrl:!0,key:"9"}]},{id:h,help:"Zoom 100%",combinations:[{ctrl:!0,key:"0"}]},{id:"wheel_zoom",help:"Zoom in/out with mouse wheel",combinations:[{wheel:!0}]}]},{name:"Mouse Interactions",list:[{id:"pan-view",help:"Pan view (drag empty space)",combinations:[{click:!0}]},{id:"select-element",help:"Select element",combinations:[{click:!0}]},{id:"multi-select",help:"Add/remove from selection",combinations:[{shift:!0,click:!0}]},{id:"box-select",help:"Box selection (drag empty space)",combinations:[{shift:!0,click:!0}]},{id:"move-elements",help:"Move selected elements",combinations:[{click:!0}]}]},{name:"Select",list:[{id:u,help:"Select All",combinations:[{ctrl:!0,key:"a"}]},{id:A,help:"Deselect",combinations:[{key:"ESC"}]}]},{name:"Move",list:[{id:f,help:"Move up (grid increment)",combinations:[{key:"UP"}]},{id:x,help:"Move up (1 pixel)",combinations:[{key:"UP",shift:!0}]},{id:p,help:"Move right (grid increment)",combinations:[{key:"RIGHT"}]},{id:y,help:"Move right (1 pixel)",combinations:[{key:"RIGHT",shift:!0}]},{id:m,help:"Move down (grid increment)",combinations:[{key:"DOWN"}]},{id:w,help:"Move down (1 pixel)",combinations:[{key:"DOWN",shift:!0}]},{id:g,help:"Move left (grid increment)",combinations:[{key:"LEFT"}]},{id:b,help:"Move left (1 pixel)",combinations:[{key:"LEFT",shift:!0}]}]},{name:"View",list:[{id:C,help:"Toggle between pan and select mode",combinations:[{key:"t"}]},{id:S,help:"Reset position and view",combinations:[{key:"Home",ctrl:!0}]}]},{name:"Alignment",list:[{id:v,help:"Align selected elements horizontally",combinations:[{key:"h",ctrl:!0,shift:!0}]},{id:B,help:"Align selected elements vertically",combinations:[{key:"a",ctrl:!0,shift:!0}]},{id:I,help:"Distribute selected elements horizontally",combinations:[{key:"h",ctrl:!0,alt:!0}]},{id:k,help:"Distribute selected elements vertically",combinations:[{key:"v",ctrl:!0,alt:!0}]}]},{name:"Layout",list:[{id:E,help:"Auto layout all elements",combinations:[{key:"l",ctrl:!0}]}]},{name:"Grid",list:[{id:$,help:"Toggle grid visibility",combinations:[{key:"g",ctrl:!0}]},{id:M,help:"Toggle snap to grid",combinations:[{key:"g",ctrl:!0,shift:!0}]},{id:_,help:"Snap all elements to grid",combinations:[{key:"g",ctrl:!0,alt:!0}]}]}],D=L.reduce((t,e)=>t.concat(e.list),[]).reduce((t,e)=>(t[e.id]=e,t),{}),z=t=>[t.ctrl&&(0,o.sy)().toUpperCase(),t.shift&&"SHIFT",t.alt&&"ALT",t.key&&(t.key.length>1?t.key:`"${t.key.toUpperCase()}"`),t.click&&"CLICK",t.wheel&&"WHEEL"].filter(Boolean).join(" + ");n.d(e,["DE",0,I,"F",0,u,"Gg",0,g,"Gn",0,A,"Hd",0,E,"Help",0,()=>(0,i.jsxs)("div",{className:"popover",children:[(0,i.jsx)("h1",{children:"Shortcuts"}),(0,i.jsx)("table",{children:(0,i.jsx)("tbody",{children:L.map(t=>(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)("tr",{children:(0,i.jsx)("th",{colSpan:2,children:t.name})}),t.list.map(t=>(0,i.jsxs)("tr",{children:[(0,i.jsx)("td",{children:t.combinations.map(z).join(", ")}),(0,i.jsx)("td",{children:t.help})]}))]}))})})]}),"J8",0,b,"Jk",0,B,"OE",0,_,"Op",0,$,"Ur",0,d,"Vy",0,k,"Yp",0,(t,e=!1,n=!1)=>{const i=Object.keys(D).filter(i=>((t,e,n,i)=>e.combinations.some(e=>{if(Boolean(e.shift)!=t.shiftKey)return!1;if(e.ctrl&&!(0,o.SA)(t))return!1;if(Boolean(e.alt)!=t.altKey)return!1;if(n)return e.click;if(i)return e.wheel;if(e.key){const n=t;return"DELETE"==e.key?"Delete"==n.key:"BACKSPACE"==e.key?"Backspace"==n.key:"ESC"==e.key?"Escape"==n.key:"UP"==e.key?"ArrowUp"==n.key:"DOWN"==e.key?"ArrowDown"==n.key:"LEFT"==e.key?"ArrowLeft"==n.key:"RIGHT"==e.key?"ArrowRight"==n.key:e.key&&n.key&&e.key.toLowerCase()==n.key.toLowerCase()}return!1}))(t,D[i],e,n));if(0!==i.length)return 1===i.length?i[0]:i.sort((t,e)=>{const n=D[t],o=D[e],i=n.combinations[0],r=o.combinations[0],s=(i.shift?1:0)+(i.ctrl?1:0)+(i.alt?1:0);return(r.shift?1:0)+(r.ctrl?1:0)+(r.alt?1:0)-s})[0]},"Zj",0,r,"_s",0,s,"_t",0,S,"aX",0,C,"b3",0,p,"bl",0,a,"hU",0,l,"hZ",0,M,"i1",0,h,"iD",0,y,"l8",0,x,"mD",0,c,"mt",0,w,"rB",0,m,"t9",0,v,"uK",0,f])},686(t,e,n){const o=()=>{if("undefined"==typeof navigator)return!1;if("userAgentData"in navigator&&navigator.userAgentData){const t=navigator.userAgentData.platform;if(t&&t.toLowerCase().includes("mac"))return!0}const t=navigator.userAgent.toLowerCase();if(t.includes("mac os")||t.includes("macintosh"))return!0;if(navigator.platform){const t=navigator.platform.toLowerCase();if(t.includes("mac")||t.includes("darwin"))return!0}try{if(void 0!==new KeyboardEvent("keydown",{metaKey:!0}).metaKey)return/mac|darwin|os x/i.test(navigator.userAgent)}catch(t){}return!1};n.d(e,["SA",0,t=>o()?t.metaKey:t.ctrlKey,"sy",0,()=>o()?"Cmd":"Ctrl"])},183(t,e,n){var o=n(220),i=n.n(o),r=n(716),s=n.n(r),a=n(628),d=n.n(a),l=new URL(n(660),n.b),c=new URL(n(620),n.b),h=new URL(n(749),n.b),u=new URL(n(690),n.b),A=s()(i()),g=d()(l),p=d()(c),f=d()(h),m=d()(u);A.push([t.id,`/* Local Inter files keep browser text measurement identical without internet access. */\n@font-face {\n\tfont-family: "Inter";\n\tfont-style: normal;\n\tfont-display: swap;\n\tfont-weight: 400;\n\tsrc: url(${g}) format("woff2");\n}\n\n@font-face {\n\tfont-family: "Inter";\n\tfont-style: normal;\n\tfont-display: swap;\n\tfont-weight: 500;\n\tsrc: url(${p}) format("woff2");\n}\n\n@font-face {\n\tfont-family: "Inter";\n\tfont-style: normal;\n\tfont-display: swap;\n\tfont-weight: 600;\n\tsrc: url(${f}) format("woff2");\n}\n\n@font-face {\n\tfont-family: "Inter";\n\tfont-style: normal;\n\tfont-display: swap;\n\tfont-weight: 700;\n\tsrc: url(${m}) format("woff2");\n}\n`,"",{version:3,sources:["webpack://./src/fonts.css"],names:[],mappings:"AAAA,uFAAuF;AACvF;CACC,oBAAoB;CACpB,kBAAkB;CAClB,kBAAkB;CAClB,gBAAgB;CAChB,4DAAgF;AACjF;;AAEA;CACC,oBAAoB;CACpB,kBAAkB;CAClB,kBAAkB;CAClB,gBAAgB;CAChB,4DAAgF;AACjF;;AAEA;CACC,oBAAoB;CACpB,kBAAkB;CAClB,kBAAkB;CAClB,gBAAgB;CAChB,4DAAgF;AACjF;;AAEA;CACC,oBAAoB;CACpB,kBAAkB;CAClB,kBAAkB;CAClB,gBAAgB;CAChB,4DAAgF;AACjF",sourcesContent:['/* Local Inter files keep browser text measurement identical without internet access. */\n@font-face {\n\tfont-family: "Inter";\n\tfont-style: normal;\n\tfont-display: swap;\n\tfont-weight: 400;\n\tsrc: url("@fontsource/inter/files/inter-latin-400-normal.woff2") format("woff2");\n}\n\n@font-face {\n\tfont-family: "Inter";\n\tfont-style: normal;\n\tfont-display: swap;\n\tfont-weight: 500;\n\tsrc: url("@fontsource/inter/files/inter-latin-500-normal.woff2") format("woff2");\n}\n\n@font-face {\n\tfont-family: "Inter";\n\tfont-style: normal;\n\tfont-display: swap;\n\tfont-weight: 600;\n\tsrc: url("@fontsource/inter/files/inter-latin-600-normal.woff2") format("woff2");\n}\n\n@font-face {\n\tfont-family: "Inter";\n\tfont-style: normal;\n\tfont-display: swap;\n\tfont-weight: 700;\n\tsrc: url("@fontsource/inter/files/inter-latin-700-normal.woff2") format("woff2");\n}\n'],sourceRoot:""}]);const b=A;n.d(e,["A",0,b])},870(t,e,n){var o=n(220),i=n.n(o),r=n(716),s=n.n(r)()(i());s.push([t.id,"html, body, #root {\n height: 100%;\n}\n\nbody {\n font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n color: #666;\n margin: 0;\n}\n\n#root {\n display: flex;\n flex-direction: column;\n}\n#root > div.graph {\n flex: 1;\n overflow: auto;\n position: relative;\n}\n\n.toolbar {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 4px 10px;\n background-color: #f0f0f0;\n border-bottom: 1px solid #cccccc;\n}\n\n.toolbar > div {\n display: flex;\n align-items: center;\n}\n\n.toolbar button {\n padding: 5px 8px;\n margin: 0 2px;\n cursor: pointer;\n}\n\n.toolbar button:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* Drag mode toggle button styles */\n.toolbar button.mode-toggle {\n position: relative;\n border: 1px solid #8f9fc9;\n width: 40px;\n min-height: 28px;\n background: linear-gradient(to bottom, #abb8db, #8f9fc9);\n border-color: #8f9fc9;\n color: white;\n box-shadow: 2px 2px 2px rgba(0, 0, 0, .2);\n}\n\n.toolbar button.mode-toggle:hover {\n background: linear-gradient(to bottom, #bcc7e0, #abb8db);\n border-color: #abb8db;\n}\n\n.toolbar button.mode-toggle.select-mode:active {\n background: linear-gradient(to bottom, #8f9fc9, #7a8bb5);\n}\n\n/* Pan mode and active toggle - darker blue */\n.toolbar button.mode-toggle.pan-mode,\n.toolbar button.active-toggle {\n background: linear-gradient(to bottom, #4a90e2, #357abd);\n border-color: #2968a3;\n box-shadow: inset 0 1px 2px rgba(0,0,0,0.2);\n}\n\n.toolbar button.mode-toggle.pan-mode:hover,\n.toolbar button.active-toggle:hover {\n background: linear-gradient(to bottom, #5ba0f2, #4585c7);\n}\n\n.toolbar button.mode-toggle.pan-mode:active {\n background: linear-gradient(to bottom, #357abd, #2968a3);\n box-shadow: inset 0 1px 2px rgba(0,0,0,0.2);\n}\n\n/* Toggle buttons when inactive - gray styling */\n.toolbar button.inactive-toggle {\n background: #c1c1c1;\n color: #999;\n border-color: #c1c1c1;\n box-shadow: none;\n}\n\n.toolbar button.inactive-toggle:hover {\n background: #b1b1b1;\n}\n\n.toolbar button.inactive-toggle:active {\n background: #a1a1a1;\n}\n\n/* Toggle buttons when disabled and not active - gray like other disabled buttons */\n.toolbar button.mode-toggle:disabled:not(.pan-mode):not(.active-toggle),\n.toolbar button.active-toggle:disabled:not(.active-toggle) {\n background: #c1c1c1;\n color: #999;\n border-color: #c1c1c1;\n box-shadow: none;\n}\n\n/* Ensure Font Awesome icons are sized appropriately if not already handled */\n.toolbar button .fas {\n font-size: 1em;\n vertical-align: middle;\n}\n\n/* Zoom percentage display */\n.toolbar button.zoom-display {\n font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;\n font-size: 11px;\n font-weight: 600;\n font-variant-numeric: tabular-nums;\n min-width: 50px; /* Wider to prevent size change between 99% and 100% */\n padding: 6px 8px;\n text-align: center;\n}\n\n.toolbar-group {\n display: flex;\n align-items: center;\n margin-right: 25px; /* Large space between groups */\n}\n\n.toolbar-group:last-child {\n margin-right: 0; /* Remove right margin from the last group (help button) */\n}\n\nbutton {\n border: none;\n background: linear-gradient(to bottom, #4a90e2, #357abd);\n border-color: #2968a3;\n border-radius: 3px;\n padding: 6px 10px;\n color: #fff;\n outline: none;\n box-shadow: 2px 2px 2px rgba(0, 0, 0, .2);\n margin-right: 5px;\n min-width: 32px;\n min-height: 28px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: 14px;\n line-height: 1;\n font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n position: relative;\n}\n\nbutton:hover {\n background: linear-gradient(to bottom, #5ba0f2, #4585c7);\n}\n\nbutton:active {\n background: linear-gradient(to bottom, #357abd, #2968a3);\n}\n\nbutton:last-child {\n margin-right: 0;\n}\n\n/* Save button when no changes - gray */\nbutton.action {\n background: #c1c1c1;\n color: #999;\n}\n\nbutton.action:active {\n background: #b1b1b1;\n}\n\n/* Save button when there are changes - orange */\nbutton.grp {\n background: linear-gradient(to bottom, #ee9564, #de7d48);\n margin-right: 0;\n}\n\nbutton.grp:active {\n background: #d67540;\n}\n\n/* Auto-arrange button with AI purple to blue gradient */\nbutton.auto-arrange {\n background: linear-gradient(135deg, #6A4C93, #4a90e2);\n border-color: #4a4c93;\n}\n\nbutton.auto-arrange:hover {\n background: linear-gradient(135deg, #7B5DAD, #5ba0f2);\n border-color: #5a5ca3;\n}\n\nbutton.auto-arrange:active {\n background: linear-gradient(135deg, #593B83, #357abd);\n border-color: #3a3c83;\n}\n\nselect {\n border: 1px solid #ccc;\n background: white;\n border-radius: 3px;\n padding: 3px 7px;\n color: #666;\n outline: none;\n margin-right: 5px;\n font-size: 12px;\n}\n\nselect:disabled {\n background: #f5f5f5;\n color: #999;\n}\n\nbutton:disabled {\n background: #c1c1c1;\n color: #999;\n}\n\n#root > div > svg {\n position: absolute;\n user-select: none;\n}\n\n\n.node.selected .nodeBorder, .edge.selected path, .edge.selected rect {\n stroke: #29c229;\n}\n.edge .v-dot {\n fill: transparent;\n stroke: transparent;\n stroke-width: 3px;\n cursor: pointer;\n transition: stroke 0.15s ease;\n}\n.edge .v-dot:hover {\n stroke: #999;\n fill: rgba(153, 153, 153, 0.1);\n}\n.edge .v-dot.selected {\n stroke: #29c229;\n fill: rgba(41, 194, 41, 0.1);\n}\n.edge .v-dot.selected:hover {\n stroke: #29c229;\n fill: rgba(41, 194, 41, 0.2);\n}\n.edge .v-dot.auto.selected {\n stroke: #777;\n fill: rgba(119, 119, 119, 0.1);\n}\n.edge .v-dot.auto.selected:hover {\n stroke: #777;\n fill: rgba(119, 119, 119, 0.2);\n}\ncircle#prj {\n fill: none;\n stroke: #777;\n}\n\n.nodeShadow {\n fill: none;\n stroke-width: 4px;\n stroke: rgba(0, 0, 0, 0.13);\n}\n\ng.node {\n user-select: none;\n cursor: default;\n}\n\ng.node.linked {\n cursor: pointer;\n}\n\ng.node text {\n pointer-events: none;\n}\n\n.icon {\n fill: #aaa;\n stroke: #fff;\n}\n#icon-cube {\n fill: #aaa;\n}\n\n/* Ensure all button icons are uncolored */\nbutton .icon,\nbutton svg,\nbutton path {\n fill: currentColor !important;\n stroke: none !important;\n}\n\n/* Font Awesome icon styling in buttons */\nbutton i {\n font-size: 12px;\n color: inherit;\n}\n\nrect.elastic {\n pointer-events: none;\n stroke: none;\n fill: #3bd8281f;\n display: none;\n}\nrect.elastic.on {\n display: block;\n}\n\n.popover {\n position: absolute;\n top: 50px;\n bottom: 10px;\n overflow: auto;\n right: 10px;\n background: ghostwhite;\n padding: 30px;\n box-shadow: 3px 3px 5px rgba(0,0,0, .2);\n border: solid 1px #eee;\n}\n\n.popover th {\n text-align: left;\n padding: 20px 0px 10px;\n}\n.popover td {\n padding-right: 20px;\n font-size: 14px;\n}\n\n/* Simple tooltip system with smart positioning */\n[data-tooltip] {\n position: relative;\n}\n\n[data-tooltip]:hover::after {\n content: attr(data-tooltip);\n position: absolute;\n top: 100%;\n left: 50%;\n transform: translateX(-50%);\n background: rgba(0, 0, 0, 0.9);\n color: white;\n padding: 6px 12px;\n border-radius: 4px;\n font-size: 12px !important;\n font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif !important;\n font-weight: normal !important;\n white-space: nowrap;\n z-index: 1000;\n pointer-events: none;\n margin-top: 5px;\n animation: tooltip-appear 0.1s ease-out;\n min-width: 120px;\n max-width: calc(100vw - 20px);\n box-sizing: border-box;\n}\n\n[data-tooltip]:hover::before {\n content: '';\n position: absolute;\n top: 100%;\n left: 50%;\n transform: translateX(-50%);\n border: 4px solid transparent;\n border-bottom-color: rgba(0, 0, 0, 0.9);\n z-index: 1000;\n pointer-events: none;\n margin-top: 1px;\n animation: tooltip-appear 0.1s ease-out;\n}\n\n/* Special handling for rightmost elements that might overflow */\n.toolbar-group:nth-last-child(-n+2) button[data-tooltip]:hover::after {\n /* Apply to last 2 toolbar groups (save and help buttons) */\n left: auto;\n right: 0;\n transform: none;\n}\n\n.toolbar-group:nth-last-child(-n+2) button[data-tooltip]:hover::before {\n /* Apply to last 2 toolbar groups (save and help buttons) */\n left: auto;\n right: 16px;\n transform: none;\n}\n\n@keyframes tooltip-appear {\n from {\n opacity: 0;\n transform: translateX(-50%) translateY(-5px);\n }\n to {\n opacity: 1;\n transform: translateX(-50%) translateY(0);\n }\n}\n\nselect {\n position: relative;\n}\n\n/* Robot shape internal elements - inherit stroke from parent node */\n.node .robot-eye-socket {\n fill: none;\n stroke: inherit;\n stroke-width: 2;\n}\n\n.node .robot-eye {\n fill: currentColor;\n stroke: none;\n}\n\n.node .robot-mouth {\n stroke: inherit;\n}\n\n.node .robot-antenna {\n stroke: inherit;\n}\n\n.node .robot-antenna-ball {\n fill: currentColor;\n stroke: inherit;\n stroke-width: 1.5;\n}\n\n.node .robot-panel {\n stroke: inherit;\n}\n\n.node .robot-indicator {\n fill: currentColor;\n stroke: none;\n}","",{version:3,sources:["webpack://./src/style.css"],names:[],mappings:"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",sourcesContent:["html, body, #root {\n height: 100%;\n}\n\nbody {\n font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n color: #666;\n margin: 0;\n}\n\n#root {\n display: flex;\n flex-direction: column;\n}\n#root > div.graph {\n flex: 1;\n overflow: auto;\n position: relative;\n}\n\n.toolbar {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 4px 10px;\n background-color: #f0f0f0;\n border-bottom: 1px solid #cccccc;\n}\n\n.toolbar > div {\n display: flex;\n align-items: center;\n}\n\n.toolbar button {\n padding: 5px 8px;\n margin: 0 2px;\n cursor: pointer;\n}\n\n.toolbar button:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* Drag mode toggle button styles */\n.toolbar button.mode-toggle {\n position: relative;\n border: 1px solid #8f9fc9;\n width: 40px;\n min-height: 28px;\n background: linear-gradient(to bottom, #abb8db, #8f9fc9);\n border-color: #8f9fc9;\n color: white;\n box-shadow: 2px 2px 2px rgba(0, 0, 0, .2);\n}\n\n.toolbar button.mode-toggle:hover {\n background: linear-gradient(to bottom, #bcc7e0, #abb8db);\n border-color: #abb8db;\n}\n\n.toolbar button.mode-toggle.select-mode:active {\n background: linear-gradient(to bottom, #8f9fc9, #7a8bb5);\n}\n\n/* Pan mode and active toggle - darker blue */\n.toolbar button.mode-toggle.pan-mode,\n.toolbar button.active-toggle {\n background: linear-gradient(to bottom, #4a90e2, #357abd);\n border-color: #2968a3;\n box-shadow: inset 0 1px 2px rgba(0,0,0,0.2);\n}\n\n.toolbar button.mode-toggle.pan-mode:hover,\n.toolbar button.active-toggle:hover {\n background: linear-gradient(to bottom, #5ba0f2, #4585c7);\n}\n\n.toolbar button.mode-toggle.pan-mode:active {\n background: linear-gradient(to bottom, #357abd, #2968a3);\n box-shadow: inset 0 1px 2px rgba(0,0,0,0.2);\n}\n\n/* Toggle buttons when inactive - gray styling */\n.toolbar button.inactive-toggle {\n background: #c1c1c1;\n color: #999;\n border-color: #c1c1c1;\n box-shadow: none;\n}\n\n.toolbar button.inactive-toggle:hover {\n background: #b1b1b1;\n}\n\n.toolbar button.inactive-toggle:active {\n background: #a1a1a1;\n}\n\n/* Toggle buttons when disabled and not active - gray like other disabled buttons */\n.toolbar button.mode-toggle:disabled:not(.pan-mode):not(.active-toggle),\n.toolbar button.active-toggle:disabled:not(.active-toggle) {\n background: #c1c1c1;\n color: #999;\n border-color: #c1c1c1;\n box-shadow: none;\n}\n\n/* Ensure Font Awesome icons are sized appropriately if not already handled */\n.toolbar button .fas {\n font-size: 1em;\n vertical-align: middle;\n}\n\n/* Zoom percentage display */\n.toolbar button.zoom-display {\n font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;\n font-size: 11px;\n font-weight: 600;\n font-variant-numeric: tabular-nums;\n min-width: 50px; /* Wider to prevent size change between 99% and 100% */\n padding: 6px 8px;\n text-align: center;\n}\n\n.toolbar-group {\n display: flex;\n align-items: center;\n margin-right: 25px; /* Large space between groups */\n}\n\n.toolbar-group:last-child {\n margin-right: 0; /* Remove right margin from the last group (help button) */\n}\n\nbutton {\n border: none;\n background: linear-gradient(to bottom, #4a90e2, #357abd);\n border-color: #2968a3;\n border-radius: 3px;\n padding: 6px 10px;\n color: #fff;\n outline: none;\n box-shadow: 2px 2px 2px rgba(0, 0, 0, .2);\n margin-right: 5px;\n min-width: 32px;\n min-height: 28px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: 14px;\n line-height: 1;\n font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n position: relative;\n}\n\nbutton:hover {\n background: linear-gradient(to bottom, #5ba0f2, #4585c7);\n}\n\nbutton:active {\n background: linear-gradient(to bottom, #357abd, #2968a3);\n}\n\nbutton:last-child {\n margin-right: 0;\n}\n\n/* Save button when no changes - gray */\nbutton.action {\n background: #c1c1c1;\n color: #999;\n}\n\nbutton.action:active {\n background: #b1b1b1;\n}\n\n/* Save button when there are changes - orange */\nbutton.grp {\n background: linear-gradient(to bottom, #ee9564, #de7d48);\n margin-right: 0;\n}\n\nbutton.grp:active {\n background: #d67540;\n}\n\n/* Auto-arrange button with AI purple to blue gradient */\nbutton.auto-arrange {\n background: linear-gradient(135deg, #6A4C93, #4a90e2);\n border-color: #4a4c93;\n}\n\nbutton.auto-arrange:hover {\n background: linear-gradient(135deg, #7B5DAD, #5ba0f2);\n border-color: #5a5ca3;\n}\n\nbutton.auto-arrange:active {\n background: linear-gradient(135deg, #593B83, #357abd);\n border-color: #3a3c83;\n}\n\nselect {\n border: 1px solid #ccc;\n background: white;\n border-radius: 3px;\n padding: 3px 7px;\n color: #666;\n outline: none;\n margin-right: 5px;\n font-size: 12px;\n}\n\nselect:disabled {\n background: #f5f5f5;\n color: #999;\n}\n\nbutton:disabled {\n background: #c1c1c1;\n color: #999;\n}\n\n#root > div > svg {\n position: absolute;\n user-select: none;\n}\n\n\n.node.selected .nodeBorder, .edge.selected path, .edge.selected rect {\n stroke: #29c229;\n}\n.edge .v-dot {\n fill: transparent;\n stroke: transparent;\n stroke-width: 3px;\n cursor: pointer;\n transition: stroke 0.15s ease;\n}\n.edge .v-dot:hover {\n stroke: #999;\n fill: rgba(153, 153, 153, 0.1);\n}\n.edge .v-dot.selected {\n stroke: #29c229;\n fill: rgba(41, 194, 41, 0.1);\n}\n.edge .v-dot.selected:hover {\n stroke: #29c229;\n fill: rgba(41, 194, 41, 0.2);\n}\n.edge .v-dot.auto.selected {\n stroke: #777;\n fill: rgba(119, 119, 119, 0.1);\n}\n.edge .v-dot.auto.selected:hover {\n stroke: #777;\n fill: rgba(119, 119, 119, 0.2);\n}\ncircle#prj {\n fill: none;\n stroke: #777;\n}\n\n.nodeShadow {\n fill: none;\n stroke-width: 4px;\n stroke: rgba(0, 0, 0, 0.13);\n}\n\ng.node {\n user-select: none;\n cursor: default;\n}\n\ng.node.linked {\n cursor: pointer;\n}\n\ng.node text {\n pointer-events: none;\n}\n\n.icon {\n fill: #aaa;\n stroke: #fff;\n}\n#icon-cube {\n fill: #aaa;\n}\n\n/* Ensure all button icons are uncolored */\nbutton .icon,\nbutton svg,\nbutton path {\n fill: currentColor !important;\n stroke: none !important;\n}\n\n/* Font Awesome icon styling in buttons */\nbutton i {\n font-size: 12px;\n color: inherit;\n}\n\nrect.elastic {\n pointer-events: none;\n stroke: none;\n fill: #3bd8281f;\n display: none;\n}\nrect.elastic.on {\n display: block;\n}\n\n.popover {\n position: absolute;\n top: 50px;\n bottom: 10px;\n overflow: auto;\n right: 10px;\n background: ghostwhite;\n padding: 30px;\n box-shadow: 3px 3px 5px rgba(0,0,0, .2);\n border: solid 1px #eee;\n}\n\n.popover th {\n text-align: left;\n padding: 20px 0px 10px;\n}\n.popover td {\n padding-right: 20px;\n font-size: 14px;\n}\n\n/* Simple tooltip system with smart positioning */\n[data-tooltip] {\n position: relative;\n}\n\n[data-tooltip]:hover::after {\n content: attr(data-tooltip);\n position: absolute;\n top: 100%;\n left: 50%;\n transform: translateX(-50%);\n background: rgba(0, 0, 0, 0.9);\n color: white;\n padding: 6px 12px;\n border-radius: 4px;\n font-size: 12px !important;\n font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif !important;\n font-weight: normal !important;\n white-space: nowrap;\n z-index: 1000;\n pointer-events: none;\n margin-top: 5px;\n animation: tooltip-appear 0.1s ease-out;\n min-width: 120px;\n max-width: calc(100vw - 20px);\n box-sizing: border-box;\n}\n\n[data-tooltip]:hover::before {\n content: '';\n position: absolute;\n top: 100%;\n left: 50%;\n transform: translateX(-50%);\n border: 4px solid transparent;\n border-bottom-color: rgba(0, 0, 0, 0.9);\n z-index: 1000;\n pointer-events: none;\n margin-top: 1px;\n animation: tooltip-appear 0.1s ease-out;\n}\n\n/* Special handling for rightmost elements that might overflow */\n.toolbar-group:nth-last-child(-n+2) button[data-tooltip]:hover::after {\n /* Apply to last 2 toolbar groups (save and help buttons) */\n left: auto;\n right: 0;\n transform: none;\n}\n\n.toolbar-group:nth-last-child(-n+2) button[data-tooltip]:hover::before {\n /* Apply to last 2 toolbar groups (save and help buttons) */\n left: auto;\n right: 16px;\n transform: none;\n}\n\n@keyframes tooltip-appear {\n from {\n opacity: 0;\n transform: translateX(-50%) translateY(-5px);\n }\n to {\n opacity: 1;\n transform: translateX(-50%) translateY(0);\n }\n}\n\nselect {\n position: relative;\n}\n\n/* Robot shape internal elements - inherit stroke from parent node */\n.node .robot-eye-socket {\n fill: none;\n stroke: inherit;\n stroke-width: 2;\n}\n\n.node .robot-eye {\n fill: currentColor;\n stroke: none;\n}\n\n.node .robot-mouth {\n stroke: inherit;\n}\n\n.node .robot-antenna {\n stroke: inherit;\n}\n\n.node .robot-antenna-ball {\n fill: currentColor;\n stroke: inherit;\n stroke-width: 1.5;\n}\n\n.node .robot-panel {\n stroke: inherit;\n}\n\n.node .robot-indicator {\n fill: currentColor;\n stroke: none;\n}"],sourceRoot:""}]);const a=s;n.d(e,["A",0,a])},574(t,e,n){var o=n(582),i=n.n(o),r=n(991),s=n.n(r),a=n(725),d=n.n(a),l=n(798),c=n.n(l),h=n(754),u=n.n(h),A=n(567),g=n.n(A),p=n(183),f={};f.styleTagTransform=g(),f.setAttributes=c(),f.insert=d().bind(null,"head"),f.domAPI=s(),f.insertStyleElement=u(),i()(p.A,f),p.A&&p.A.locals&&p.A.locals},919(t,e,n){var o=n(582),i=n.n(o),r=n(991),s=n.n(r),a=n(725),d=n.n(a),l=n(798),c=n.n(l),h=n(754),u=n.n(h),A=n(567),g=n.n(A),p=n(870),f={};f.styleTagTransform=g(),f.setAttributes=c(),f.insert=d().bind(null,"head"),f.domAPI=s(),f.insertStyleElement=u(),i()(p.A,f),p.A&&p.A.locals&&p.A.locals}}]); +//# sourceMappingURL=286.js.map \ No newline at end of file diff --git a/cmd/mdl/webapp/dist/286.js.map b/cmd/mdl/webapp/dist/286.js.map new file mode 100644 index 00000000..c10faef8 --- /dev/null +++ b/cmd/mdl/webapp/dist/286.js.map @@ -0,0 +1 @@ +{"version":3,"file":"286.js","mappings":"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","sources":["webpack://app/./src/graph-view/constants.ts","webpack://app/./src/graph-view/edge-utils.ts","webpack://app/./src/graph-view/geometry.ts","webpack://app/./src/graph-view/defs.ts","webpack://app/./src/graph-view/svg-text.ts","webpack://app/./src/graph-view/svg-create.ts","webpack://app/./src/graph-view/intersect.ts","webpack://app/./src/graph-view/shapes.ts","webpack://app/./src/graph-view/undo.ts","webpack://app/./src/graph-view/node-content.ts","webpack://app/./src/graph-view/graph.ts","webpack://app/./src/graph-view/automatic-layout.ts","webpack://app/./src/graph-view/layout.ts","webpack://app/./src/graph-view/manual-layout.ts","webpack://app/./src/parseModel.ts","webpack://app/./src/shortcuts.tsx","webpack://app/./src/utils/platform.ts","webpack://app/./src/fonts.css","webpack://app/./src/style.css","webpack://app/./src/fonts.css?a158","webpack://app/./src/style.css?dd02"],"sourcesContent":["// Constants and default configurations for the graph view\n\nexport interface Point {\n\tx: number;\n\ty: number;\n}\n\nexport interface BBox extends Point {\n\twidth: number;\n\theight: number;\n}\n\nexport interface NodeStyle {\n\t// Width of element, in pixels.\n\twidth?: number\n\t// Height of element, in pixels.\n\theight?: number\n\t// Background color of element as HTML RGB hex string (e.g. \"#ffffff\")\n\tbackground?: string\n\t// Stroke color of element as HTML RGB hex string (e.g. \"#000000\")\n\tstroke?: string\n\t// Foreground (text) color of element as HTML RGB hex string (e.g. \"#ffffff\")\n\tcolor?: string\n\t// Standard font size used to render text, in pixels.\n\tfontSize?: number\n\t// Shape used to render element.\n\tshape?: string\n\t// URL of PNG/JPG/GIF file or Base64 data URI representation.\n\ticon?: string\n\t// Type of border used to render element.\n\tborder?: string\n\t// Opacity used to render element; 0-100.\n\topacity?: number\n\t// Whether element metadata should be shown.\n\tmetadata?: boolean\n\t// Whether element description should be shown.\n\tdescription?: boolean\n}\n\nexport interface EdgeStyle {\n\t// Thickness of line, in pixels.\n\tthickness?: number\n\t// Color of line as HTML RGB hex string (e.g. \"#ffffff\").\n\tcolor?: string\n\t// Standard font size used to render relationship annotation, in pixels.\n\tfontSize?: number\n\t// Width of relationship annotation, in pixels.\n\twidth?: number\n\t// Whether line is dashed.\n\tdashed?: boolean\n\t// Position of label along edge (0-100).\n\tposition?: number\n\t// Opacity used to render relationship; 0-100.\n\topacity?: number\n\t// Arrow style for the edge.\n\tarrowStyle?: 'normal' | 'large' | 'small' | 'none'\n}\n\n// Default styles\nexport const DEFAULT_EDGE_STYLE: EdgeStyle = {\n\tthickness: 3,\n\tcolor: '#999',\n\topacity: 1,\n\tfontSize: 22,\n\tdashed: true,\n};\n\nexport const DEFAULT_NODE_STYLE: NodeStyle = {\n\twidth: 280,\n\theight: 180,\n\tbackground: 'rgba(255, 255, 255, .9)',\n\tcolor: '#666',\n\topacity: .9,\n\tstroke: '#999',\n\tfontSize: 22,\n\tshape: 'Box'\n};\n\n// SVG styles\nexport const SVG_STYLES = {\n\tnodeBorder: {\n\t\tfill: \"rgba(255, 255, 255, 0.86)\",\n\t\tstroke: \"#aaa\",\n\t\tfilter: 'url(#shadow)',\n\t},\n\tnodeText: {\n\t\t'font-family': 'Inter, -apple-system, BlinkMacSystemFont, sans-serif',\n\t\tstroke: \"none\"\n\t},\n\tedgeText: {\n\t\t'font-family': 'Inter, -apple-system, BlinkMacSystemFont, sans-serif',\n\t\tstroke: \"none\"\n\t},\n\tedgeRect: {\n\t\tfill: \"none\",\n\t\tstroke: \"none\",\n\t},\n\tgroupRect: {\n\t\tfill: \"rgba(0, 0, 0, 0.02)\",\n\t\tstroke: \"#666\",\n\t\t'stroke-width': 3,\n\t\t\"stroke-dasharray\": 4,\n\t},\n\tgroupText: {\n\t\tfill: \"#666\",\n\t\t\"font-size\": 22,\n\t\t\"font-weight\": \"500\",\n\t\t'font-family': 'Inter, -apple-system, BlinkMacSystemFont, sans-serif',\n\t\tcursor: \"default\"\n\t}\n};\n\n// Configuration constants\nexport const SVG_PADDING = 20;\nexport const DEFAULT_GRID_SIZE = 25;\nexport const EDGE_SPREAD_DISTANCE = 70;\nexport const EDGE_SPREAD_DISTANCE_X = 200;\n\n// Utility function to apply styles to SVG elements\nexport const applyStyle = (el: SVGElement, style: { [key: string]: string | number }) => {\n\tObject.keys(style).forEach(key => {\n\t\tconst value = style[key];\n\t\tif (typeof value === 'number') {\n\t\t\tel.style.setProperty(key, value.toString());\n\t\t} else {\n\t\t\tel.style.setProperty(key, value);\n\t\t}\n\t});\n};\n\n// Utility function to calculate distance between two points\nexport const calculateDistance = (p1: Point, p2: Point): number => {\n\treturn Math.sqrt((p2.x - p1.x) * (p2.x - p1.x) + (p2.y - p1.y) * (p2.y - p1.y));\n};","import { Point, calculateDistance } from './constants';\nimport { Segment } from './intersect';\n\n// Define interfaces locally since they're not exported from graph.ts\ninterface NodeStyle {\n\tbackground?: string;\n\tstroke?: string;\n\topacity?: number;\n\tfontSize?: number;\n\tshape?: string;\n\tborder?: string;\n}\n\ninterface Node extends Point {\n\tid: string;\n\ttitle: string;\n\tsub: string;\n\tdescription: string;\n\twidth: number;\n\theight: number;\n\tref?: SVGGElement;\n\tselected?: boolean;\n\tintersect: (p: Point) => Point;\n\tstyle: NodeStyle;\n}\n\ninterface EdgeVertex extends Point {\n\tid: string;\n\tselected?: boolean;\n\tref?: SVGElement;\n\tlabel?: boolean;\n\tauto?: boolean;\n}\n\ninterface EdgeStyle {\n\tcolor?: string;\n\tthickness?: number;\n\tfontSize?: number;\n\tposition?: number;\n\tdashed?: boolean;\n}\n\ninterface Edge {\n\tid: string;\n\tlabel: string;\n\tfrom: Node;\n\tto: Node;\n\tvertices?: EdgeVertex[];\n\tref?: SVGGElement;\n\tstyle: EdgeStyle;\n\tinitVertex: (p: Point) => EdgeVertex;\n\tuserDeletedVertices?: boolean; // Track if user explicitly deleted vertices\n}\n\nexport interface EdgeLabelPlacement extends Point {\n\torientation: 'horizontal' | 'vertical';\n\tsegment?: Segment;\n\tmovable: boolean;\n}\n\n/**\n * Calculate edge vertices, handling multi-edge scenarios and auto-vertices\n */\nexport function calculateEdgeVertices(edge: Edge): Point[] {\n\tconst n1 = edge.from, n2 = edge.to;\n\t\n\t\n\t// if vertices exists, follow them\n\tlet vertices: Point[] = edge.vertices ? edge.vertices.concat() : [];\n\t// Don't remove label vertices - they should be preserved for rendering\n\t// (The autoLayout process handles replacing old ones with new ones)\n\n\tvertices.unshift(n1)\n\tvertices.push(n2)\n\n\tconst interior = vertices.slice(1, -1) as EdgeVertex[];\n\tconst firstRoutingVertex = interior.find(vertex => !vertex.label) ?? n2;\n\tlet lastRoutingVertex: Point = n1;\n\tfor (let index = interior.length - 1; index >= 0; index--) {\n\t\tif (!interior[index].label) {\n\t\t\tlastRoutingVertex = interior[index];\n\t\t\tbreak;\n\t\t}\n\t}\n\tif (!n1.intersect || !n2.intersect) {\n\t\tthrow new Error(`edge ${edge.id} nodes must be drawn before routing`);\n\t}\n\tvertices[0] = n1.intersect(firstRoutingVertex);\n\tvertices[vertices.length - 1] = n2.intersect(lastRoutingVertex);\n\t\n\treturn vertices;\n}\n\n/**\n * Calculate the label anchor and the orientation of the path segment that owns\n * it. Renderers use the orientation to place text beside the relationship line\n * instead of centering text over vertical segments.\n */\nexport function calculateLabelPlacement(\n\tvertices: Point[],\n\tposition: number,\n\tdefaultPoint: Point,\n): EdgeLabelPlacement {\n\tlet point = {x: defaultPoint.x, y: defaultPoint.y};\n\tlet segment: Segment | undefined;\n\tconst labelIndex = vertices.findIndex(vertex => (vertex as EdgeVertex).label);\n\tlet movable = true;\n\n\tif (labelIndex >= 0) {\n\t\tconst labelVertex = vertices[labelIndex] as EdgeVertex;\n\t\tpoint = labelVertex;\n\t\tmovable = labelVertex.auto === true;\n\t\tconst adjacentSegments: Segment[] = [];\n\t\tif (labelIndex > 0) {\n\t\t\tadjacentSegments.push({p: vertices[labelIndex - 1], q: point});\n\t\t}\n\t\tif (labelIndex < vertices.length - 1) {\n\t\t\tadjacentSegments.push({p: point, q: vertices[labelIndex + 1]});\n\t\t}\n\t\tsegment = adjacentSegments.reduce((longest, candidate) => {\n\t\t\tif (!longest) {\n\t\t\t\treturn candidate;\n\t\t\t}\n\t\t\treturn calculateDistance(candidate.p, candidate.q) >\n\t\t\t\tcalculateDistance(longest.p, longest.q)\n\t\t\t\t? candidate\n\t\t\t\t: longest;\n\t\t}, undefined);\n\t} else {\n\t\tconst totalLength = vertices.slice(1).reduce(\n\t\t\t(sum, vertex, index) => sum + calculateDistance(vertices[index], vertex),\n\t\t\t0,\n\t\t);\n\t\tconst targetLength = totalLength * position;\n\t\tlet traversed = 0;\n\t\tfor (let index = 1; index < vertices.length; index++) {\n\t\t\tconst candidate = {p: vertices[index - 1], q: vertices[index]};\n\t\t\tconst length = calculateDistance(candidate.p, candidate.q);\n\t\t\tif (length > 0 && traversed + length >= targetLength) {\n\t\t\t\tconst segmentPosition = (targetLength - traversed) / length;\n\t\t\t\tpoint = {\n\t\t\t\t\tx: candidate.p.x + (candidate.q.x - candidate.p.x) * segmentPosition,\n\t\t\t\t\ty: candidate.p.y + (candidate.q.y - candidate.p.y) * segmentPosition,\n\t\t\t\t};\n\t\t\t\tsegment = candidate;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\ttraversed += length;\n\t\t}\n\t}\n\n\tconst horizontalDistance = segment ? Math.abs(segment.q.x - segment.p.x) : 0;\n\tconst verticalDistance = segment ? Math.abs(segment.q.y - segment.p.y) : 0;\n\treturn {\n\t\t...point,\n\t\torientation: verticalDistance > horizontalDistance ? 'vertical' : 'horizontal',\n\t\tsegment,\n\t\tmovable,\n\t};\n}\n\n/** createEdgePath draws the given points without cutting or moving the route. */\nexport function createEdgePath(vertices: Point[]): string {\n\tif (vertices.length < 2) {\n\t\tthrow new Error(\"edge route must contain at least two points\");\n\t}\n\treturn vertices.slice(1).reduce(\n\t\t(path, point) => `${path} L${point.x},${point.y}`,\n\t\t`M${vertices[0].x},${vertices[0].y}`,\n\t);\n}","// This file defines the diagram sizes and positions shared by layout and SVG\n// drawing. Automatic and manual layout both produce ResolvedLayout. The SVG\n// drawing code accepts a layout only after this file has checked it.\n\n/** Point is one position in the diagram. */\nexport interface Point {\n\tx: number;\n\ty: number;\n}\n\n/** Size is a width and height. Both values must be zero or greater. */\nexport interface Size {\n\twidth: number;\n\theight: number;\n}\n\n/** Rect is a box that does not rotate. */\nexport interface Rect extends Point, Size {}\n\n/** MeasuredNode holds the exact box and text sizes needed before layout. */\nexport interface MeasuredNode {\n\tid: string;\n\tparentId?: string;\n\tsize: Size;\n\tcontentSize: Size;\n\tcenterOffset: Point;\n\tshape: string;\n}\n\n/** MeasuredGroup describes a boundary that must contain its children and title. */\nexport interface MeasuredGroup {\n\tid: string;\n\tparentId?: string;\n\ttitleSize: Size;\n}\n\n/** MeasuredEdge names the two connected nodes and the exact label size. */\nexport interface MeasuredEdge {\n\tid: string;\n\tsourceId: string;\n\ttargetId: string;\n\tlabelSize?: Size;\n}\n\n/**\n * MeasuredDiagram is the complete input to automatic or manual layout.\n * It contains sizes, but no positions.\n */\nexport interface MeasuredDiagram {\n\tid: string;\n\tnodes: MeasuredNode[];\n\tgroups: MeasuredGroup[];\n\tedges: MeasuredEdge[];\n}\n\n/** ResolvedNode is one measured node placed in the diagram. */\nexport interface ResolvedNode {\n\tid: string;\n\tparentId?: string;\n\tbounds: Rect;\n}\n\n/** ResolvedGroup is one placed boundary and its title box. */\nexport interface ResolvedGroup {\n\tid: string;\n\tparentId?: string;\n\tbounds: Rect;\n\ttitleBounds: Rect;\n}\n\n/**\n * ResolvedEdge contains a complete route. Each section is an ordered list of\n * points. labelBounds is the final label box chosen by layout.\n */\nexport interface ResolvedEdge {\n\tid: string;\n\tsourceId: string;\n\ttargetId: string;\n\tsections: Point[][];\n\tlabelBounds?: Rect;\n}\n\n/**\n * ResolvedLayout is the unchecked result of automatic or manual layout.\n * Drawing code must not use it directly.\n */\nexport interface ResolvedLayout {\n\tdiagramId: string;\n\tbounds: Rect;\n\tnodes: ResolvedNode[];\n\tgroups: ResolvedGroup[];\n\tedges: ResolvedEdge[];\n}\n\n/** GeometryIssueCode names one rule that the layout broke. */\nexport type GeometryIssueCode =\n\t| \"duplicate_id\"\n\t| \"missing_element\"\n\t| \"unexpected_element\"\n\t| \"non_finite\"\n\t| \"size_mismatch\"\n\t| \"content_overflow\"\n\t| \"node_overlap\"\n\t| \"group_overlap\"\n\t| \"false_containment\"\n\t| \"edge_through_node\"\n\t| \"edge_through_group\"\n\t| \"label_node_overlap\"\n\t| \"label_label_overlap\"\n\t| \"label_edge_overlap\"\n\t| \"label_title_overlap\"\n\t| \"out_of_bounds\"\n\t| \"disconnected_edge\";\n\n/** GeometryIssue reports the stable IDs of the affected diagram elements. */\nexport interface GeometryIssue {\n\tcode: GeometryIssueCode;\n\telementIds: string[];\n\tmessage: string;\n}\n\nconst validatedLayoutBrand: unique symbol = Symbol(\"ValidatedLayout\");\n\n/**\n * ValidatedLayout is the only layout the SVG drawing code accepts. The private\n * marker prevents other code from creating one without running the checks.\n */\nexport type ValidatedLayout = ResolvedLayout & {\n\treadonly [validatedLayoutBrand]: true;\n};\n\n/** GeometryValidationError reports every layout problem found in one check. */\nexport class GeometryValidationError extends Error {\n\treadonly issues: GeometryIssue[];\n\n\tconstructor(issues: GeometryIssue[]) {\n\t\tsuper(issues.map(issue => issue.message).join(\"\\n\"));\n\t\tthis.name = \"GeometryValidationError\";\n\t\tthis.issues = issues;\n\t}\n}\n\n/**\n * validateResolvedLayout checks that every element is present, every number is\n * valid, boundaries show true ownership, elements do not collide, and all\n * content stays inside the diagram.\n */\nexport function validateResolvedLayout(\n\tmeasured: MeasuredDiagram,\n\tresolved: ResolvedLayout,\n): ValidatedLayout {\n\tconst issues: GeometryIssue[] = [];\n\tif (measured.id !== resolved.diagramId) {\n\t\tissues.push(issue(\n\t\t\t\"missing_element\",\n\t\t\t[measured.id, resolved.diagramId],\n\t\t\t`layout ${resolved.diagramId} does not resolve measured diagram ${measured.id}`,\n\t\t));\n\t}\n\n\tcheckUniqueIDs(\"measured node\", measured.nodes.map(node => node.id), issues);\n\tcheckUniqueIDs(\"measured group\", measured.groups.map(group => group.id), issues);\n\tcheckUniqueIDs(\"measured edge\", measured.edges.map(edge => edge.id), issues);\n\tcheckUniqueIDs(\"resolved node\", resolved.nodes.map(node => node.id), issues);\n\tcheckUniqueIDs(\"resolved group\", resolved.groups.map(group => group.id), issues);\n\tcheckUniqueIDs(\"resolved edge\", resolved.edges.map(edge => edge.id), issues);\n\n\tcheckCoverage(\n\t\t\"node\",\n\t\tmeasured.nodes.map(node => node.id),\n\t\tresolved.nodes.map(node => node.id),\n\t\tissues,\n\t);\n\tcheckCoverage(\n\t\t\"group\",\n\t\tmeasured.groups.map(group => group.id),\n\t\tresolved.groups.map(group => group.id),\n\t\tissues,\n\t);\n\tcheckCoverage(\n\t\t\"edge\",\n\t\tmeasured.edges.map(edge => edge.id),\n\t\tresolved.edges.map(edge => edge.id),\n\t\tissues,\n\t);\n\n\tconst measuredNodes = new Map(measured.nodes.map(node => [node.id, node]));\n\tconst measuredGroups = new Map(measured.groups.map(group => [group.id, group]));\n\tconst resolvedNodes = new Map(resolved.nodes.map(node => [node.id, node]));\n\tconst resolvedGroups = new Map(resolved.groups.map(group => [group.id, group]));\n\n\tcheckFiniteRect(\"diagram\", resolved.diagramId, resolved.bounds, issues);\n\tfor (const node of resolved.nodes) {\n\t\tcheckFiniteRect(\"node\", node.id, node.bounds, issues);\n\t\tconst expected = measuredNodes.get(node.id);\n\t\tif (expected && (\n\t\t\t!nearlyEqual(expected.size.width, node.bounds.width) ||\n\t\t\t!nearlyEqual(expected.size.height, node.bounds.height)\n\t\t)) {\n\t\t\tissues.push(issue(\n\t\t\t\t\"size_mismatch\",\n\t\t\t\t[node.id],\n\t\t\t\t`node ${node.id} size changed after measurement`,\n\t\t\t));\n\t\t}\n\t\tif (expected && (\n\t\t\texpected.contentSize.width > node.bounds.width ||\n\t\t\texpected.contentSize.height > node.bounds.height\n\t\t)) {\n\t\t\tissues.push(issue(\n\t\t\t\t\"content_overflow\",\n\t\t\t\t[node.id],\n\t\t\t\t`node ${node.id} content exceeds its resolved bounds`,\n\t\t\t));\n\t\t}\n\t\tcheckRectInBounds(\"node\", node.id, node.bounds, resolved.bounds, issues);\n\t}\n\tfor (const group of resolved.groups) {\n\t\tcheckFiniteRect(\"group\", group.id, group.bounds, issues);\n\t\tcheckFiniteRect(\"group title\", group.id, group.titleBounds, issues);\n\t\tcheckRectInBounds(\"group\", group.id, group.bounds, resolved.bounds, issues);\n\t\tif (!contains(group.bounds, group.titleBounds)) {\n\t\t\tissues.push(issue(\n\t\t\t\t\"false_containment\",\n\t\t\t\t[group.id],\n\t\t\t\t`group ${group.id} does not contain its title`,\n\t\t\t));\n\t\t}\n\t\tconst expected = measuredGroups.get(group.id);\n\t\tif (expected && (\n\t\t\t!nearlyEqual(expected.titleSize.width, group.titleBounds.width) ||\n\t\t\t!nearlyEqual(expected.titleSize.height, group.titleBounds.height)\n\t\t)) {\n\t\t\tissues.push(issue(\n\t\t\t\t\"size_mismatch\",\n\t\t\t\t[group.id],\n\t\t\t\t`group ${group.id} title size changed after measurement`,\n\t\t\t));\n\t\t}\n\t}\n\n\tcheckNodeOverlaps(resolved.nodes, issues);\n\tcheckGroupOverlaps(resolved.groups, issues);\n\tcheckOwnership(\n\t\tmeasured.nodes,\n\t\tmeasured.groups,\n\t\tresolvedNodes,\n\t\tresolvedGroups,\n\t\tissues,\n\t);\n\tcheckEdges(\n\t\tmeasured,\n\t\tresolved,\n\t\tresolvedNodes,\n\t\tresolvedGroups,\n\t\tmeasuredNodes,\n\t\tmeasuredGroups,\n\t\tissues,\n\t);\n\n\tif (issues.length > 0) {\n\t\tthrow new GeometryValidationError(issues);\n\t}\n\treturn resolved as ValidatedLayout;\n}\n\n/** checkUniqueIDs requires each model ID to appear only once. */\nfunction checkUniqueIDs(label: string, ids: string[], issues: GeometryIssue[]): void {\n\tconst seen = new Set();\n\tfor (const id of ids) {\n\t\tif (seen.has(id)) {\n\t\t\tissues.push(issue(\"duplicate_id\", [id], `${label} ${id} is duplicated`));\n\t\t}\n\t\tseen.add(id);\n\t}\n}\n\n/** checkCoverage rejects missing elements and old elements left in a layout. */\nfunction checkCoverage(\n\tlabel: string,\n\texpected: string[],\n\tactual: string[],\n\tissues: GeometryIssue[],\n): void {\n\tconst expectedIDs = new Set(expected);\n\tconst actualIDs = new Set(actual);\n\tfor (const id of expectedIDs) {\n\t\tif (!actualIDs.has(id)) {\n\t\t\tissues.push(issue(\"missing_element\", [id], `${label} ${id} is missing from resolved layout`));\n\t\t}\n\t}\n\tfor (const id of actualIDs) {\n\t\tif (!expectedIDs.has(id)) {\n\t\t\tissues.push(issue(\"unexpected_element\", [id], `${label} ${id} is not in the measured diagram`));\n\t\t}\n\t}\n}\n\n/** checkFiniteRect rejects invalid numbers and negative sizes. */\nfunction checkFiniteRect(\n\tlabel: string,\n\tid: string,\n\trect: Rect,\n\tissues: GeometryIssue[],\n): void {\n\tif (!isFiniteRect(rect) || rect.width < 0 || rect.height < 0) {\n\t\tissues.push(issue(\"non_finite\", [id], `${label} ${id} has invalid geometry`));\n\t}\n}\n\n/** checkRectInBounds requires the whole box to fit inside the diagram. */\nfunction checkRectInBounds(\n\tlabel: string,\n\tid: string,\n\trect: Rect,\n\tbounds: Rect,\n\tissues: GeometryIssue[],\n): void {\n\tif (!contains(bounds, rect)) {\n\t\tissues.push(issue(\"out_of_bounds\", [id], `${label} ${id} lies outside the resolved view bounds`));\n\t}\n}\n\n/** checkNodeOverlaps prevents two nodes from sharing the same area. */\nfunction checkNodeOverlaps(nodes: ResolvedNode[], issues: GeometryIssue[]): void {\n\tforEachPair(nodes, (first, second) => {\n\t\tif (overlaps(first.bounds, second.bounds)) {\n\t\t\tissues.push(issue(\n\t\t\t\t\"node_overlap\",\n\t\t\t\t[first.id, second.id],\n\t\t\t\t`nodes ${first.id} and ${second.id} overlap`,\n\t\t\t));\n\t\t}\n\t});\n}\n\n/**\n * checkGroupOverlaps allows one real boundary inside another, but rejects\n * boundaries that partly cover each other and suggest false ownership.\n */\nfunction checkGroupOverlaps(groups: ResolvedGroup[], issues: GeometryIssue[]): void {\n\tforEachPair(groups, (first, second) => {\n\t\tif (\n\t\t\toverlaps(first.bounds, second.bounds) &&\n\t\t\t!contains(first.bounds, second.bounds) &&\n\t\t\t!contains(second.bounds, first.bounds)\n\t\t) {\n\t\t\tissues.push(issue(\n\t\t\t\t\"group_overlap\",\n\t\t\t\t[first.id, second.id],\n\t\t\t\t`groups ${first.id} and ${second.id} partially overlap`,\n\t\t\t));\n\t\t}\n\t});\n}\n\n/**\n * checkOwnership requires each child to be inside the parent named by the\n * model. Visual overlap never creates ownership.\n */\nfunction checkOwnership(\n\tnodes: MeasuredNode[],\n\tgroups: MeasuredGroup[],\n\tresolvedNodes: Map,\n\tresolvedGroups: Map,\n\tissues: GeometryIssue[],\n): void {\n\tfor (const node of nodes) {\n\t\tconst child = resolvedNodes.get(node.id);\n\t\tif (child && child.parentId !== node.parentId) {\n\t\t\tissues.push(issue(\n\t\t\t\t\"false_containment\",\n\t\t\t\t[node.id],\n\t\t\t\t`node ${node.id} has the wrong parent ID`,\n\t\t\t));\n\t\t}\n\t\tif (!node.parentId) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst parent = resolvedGroups.get(node.parentId);\n\t\tif (child && parent && !contains(parent.bounds, child.bounds)) {\n\t\t\tissues.push(issue(\n\t\t\t\t\"false_containment\",\n\t\t\t\t[node.id, node.parentId],\n\t\t\t\t`node ${node.id} lies outside owning group ${node.parentId}`,\n\t\t\t));\n\t\t}\n\t}\n\tfor (const group of groups) {\n\t\tconst child = resolvedGroups.get(group.id);\n\t\tif (child && child.parentId !== group.parentId) {\n\t\t\tissues.push(issue(\n\t\t\t\t\"false_containment\",\n\t\t\t\t[group.id],\n\t\t\t\t`group ${group.id} has the wrong parent ID`,\n\t\t\t));\n\t\t}\n\t\tif (!group.parentId) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst parent = resolvedGroups.get(group.parentId);\n\t\tif (child && parent && !contains(parent.bounds, child.bounds)) {\n\t\t\tissues.push(issue(\n\t\t\t\t\"false_containment\",\n\t\t\t\t[group.id, group.parentId],\n\t\t\t\t`group ${group.id} lies outside owning group ${group.parentId}`,\n\t\t\t));\n\t\t}\n\t}\n}\n\n/**\n * checkEdges checks connected node IDs, complete routes, crossings, labels,\n * and boundary crossings for every relationship.\n */\nfunction checkEdges(\n\tmeasured: MeasuredDiagram,\n\tresolved: ResolvedLayout,\n\tnodes: Map,\n\tgroups: Map,\n\tmeasuredNodes: Map,\n\tmeasuredGroups: Map,\n\tissues: GeometryIssue[],\n): void {\n\tconst measuredEdges = new Map(measured.edges.map(edge => [edge.id, edge]));\n\tconst labels: Array<{id: string; bounds: Rect}> = [];\n\tfor (const edge of resolved.edges) {\n\t\tconst expected = measuredEdges.get(edge.id);\n\t\tif (!expected) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (\n\t\t\tedge.sourceId !== expected.sourceId ||\n\t\t\tedge.targetId !== expected.targetId\n\t\t) {\n\t\t\tissues.push(issue(\n\t\t\t\t\"disconnected_edge\",\n\t\t\t\t[edge.id, edge.sourceId, edge.targetId],\n\t\t\t\t`edge ${edge.id} endpoints do not match its measured contract`,\n\t\t\t));\n\t\t}\n\t\tif (edge.sections.length === 0 || edge.sections.some(section => section.length < 2)) {\n\t\t\tissues.push(issue(\n\t\t\t\t\"disconnected_edge\",\n\t\t\t\t[edge.id],\n\t\t\t\t`edge ${edge.id} has no complete route section`,\n\t\t\t));\n\t\t\tcontinue;\n\t\t}\n\t\tcheckSectionConnections(edge, nodes, issues);\n\t\tfor (const section of edge.sections) {\n\t\t\tfor (const point of section) {\n\t\t\t\tif (!isFinitePoint(point) || !pointInRect(point, resolved.bounds, true)) {\n\t\t\t\t\tissues.push(issue(\n\t\t\t\t\t\t\"out_of_bounds\",\n\t\t\t\t\t\t[edge.id],\n\t\t\t\t\t\t`edge ${edge.id} has a route point outside the resolved view`,\n\t\t\t\t\t));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tfor (const node of nodes.values()) {\n\t\t\tif (node.id === edge.sourceId || node.id === edge.targetId) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (routeIntersectsRect(edge.sections, inset(node.bounds, 0.5))) {\n\t\t\t\tissues.push(issue(\n\t\t\t\t\t\"edge_through_node\",\n\t\t\t\t\t[edge.id, node.id],\n\t\t\t\t\t`edge ${edge.id} crosses unrelated node ${node.id}`,\n\t\t\t\t));\n\t\t\t}\n\t\t}\n\t\tfor (const group of groups.values()) {\n\t\t\tconst sourceInside = belongsToGroup(\n\t\t\t\tedge.sourceId,\n\t\t\t\tgroup.id,\n\t\t\t\tmeasuredNodes,\n\t\t\t\tmeasuredGroups,\n\t\t\t);\n\t\t\tconst targetInside = belongsToGroup(\n\t\t\t\tedge.targetId,\n\t\t\t\tgroup.id,\n\t\t\t\tmeasuredNodes,\n\t\t\t\tmeasuredGroups,\n\t\t\t);\n\t\t\tif (\n\t\t\t\tsourceInside === targetInside &&\n\t\t\t\trouteViolatesGroup(edge.sections, group.bounds, sourceInside)\n\t\t\t) {\n\t\t\t\tissues.push(issue(\n\t\t\t\t\t\"edge_through_group\",\n\t\t\t\t\t[edge.id, group.id],\n\t\t\t\t\t`edge ${edge.id} violates group ${group.id} boundary`,\n\t\t\t\t));\n\t\t\t}\n\t\t}\n\t\tif (edge.labelBounds) {\n\t\t\tcheckFiniteRect(\"edge label\", edge.id, edge.labelBounds, issues);\n\t\t\tcheckRectInBounds(\"edge label\", edge.id, edge.labelBounds, resolved.bounds, issues);\n\t\t\tif (expected.labelSize && (\n\t\t\t\t!nearlyEqual(expected.labelSize.width, edge.labelBounds.width) ||\n\t\t\t\t!nearlyEqual(expected.labelSize.height, edge.labelBounds.height)\n\t\t\t)) {\n\t\t\t\tissues.push(issue(\n\t\t\t\t\t\"size_mismatch\",\n\t\t\t\t\t[edge.id],\n\t\t\t\t\t`edge ${edge.id} label size changed after measurement`,\n\t\t\t\t));\n\t\t\t}\n\t\t\tfor (const node of nodes.values()) {\n\t\t\t\tif (overlaps(edge.labelBounds, node.bounds)) {\n\t\t\t\t\tissues.push(issue(\n\t\t\t\t\t\t\"label_node_overlap\",\n\t\t\t\t\t\t[edge.id, node.id],\n\t\t\t\t\t\t`edge ${edge.id} label overlaps node ${node.id}`,\n\t\t\t\t\t));\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (const group of groups.values()) {\n\t\t\t\tif (overlaps(edge.labelBounds, group.titleBounds)) {\n\t\t\t\t\tissues.push(issue(\n\t\t\t\t\t\t\"label_title_overlap\",\n\t\t\t\t\t\t[edge.id, group.id],\n\t\t\t\t\t\t`edge ${edge.id} label overlaps group ${group.id} title`,\n\t\t\t\t\t));\n\t\t\t\t}\n\t\t\t}\n\t\t\tlabels.push({id: edge.id, bounds: edge.labelBounds});\n\t\t} else if (expected.labelSize) {\n\t\t\tissues.push(issue(\n\t\t\t\t\"missing_element\",\n\t\t\t\t[edge.id],\n\t\t\t\t`edge ${edge.id} is missing its measured label`,\n\t\t\t));\n\t\t}\n\t}\n\tforEachPair(labels, (first, second) => {\n\t\tif (overlaps(first.bounds, second.bounds)) {\n\t\t\tissues.push(issue(\n\t\t\t\t\"label_label_overlap\",\n\t\t\t\t[first.id, second.id],\n\t\t\t\t`edge labels ${first.id} and ${second.id} overlap`,\n\t\t\t));\n\t\t}\n\t});\n\tfor (const label of labels) {\n\t\tfor (const edge of resolved.edges) {\n\t\t\tif (routeIntersectsRect(edge.sections, inset(label.bounds, 0.5))) {\n\t\t\t\tissues.push(issue(\n\t\t\t\t\t\"label_edge_overlap\",\n\t\t\t\t\t[label.id, edge.id],\n\t\t\t\t\t`edge ${edge.id} crosses label ${label.id}`,\n\t\t\t\t));\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * checkSectionConnections requires one ordered route from the source border to\n * the target border. Separate or reversed sections are not a complete route.\n */\nfunction checkSectionConnections(\n\tedge: ResolvedEdge,\n\tnodes: Map,\n\tissues: GeometryIssue[],\n): void {\n\tfor (let index = 1; index < edge.sections.length; index++) {\n\t\tconst previous = edge.sections[index - 1].slice(-1)[0];\n\t\tconst current = edge.sections[index][0];\n\t\tif (!samePoint(previous, current)) {\n\t\t\tissues.push(issue(\n\t\t\t\t\"disconnected_edge\",\n\t\t\t\t[edge.id],\n\t\t\t\t`edge ${edge.id} has disconnected route sections`,\n\t\t\t));\n\t\t\treturn;\n\t\t}\n\t}\n\tconst source = nodes.get(edge.sourceId);\n\tconst target = nodes.get(edge.targetId);\n\tconst start = edge.sections[0][0];\n\tconst end = edge.sections.slice(-1)[0].slice(-1)[0];\n\tif (\n\t\t!source ||\n\t\t!target ||\n\t\t!pointOnBorder(start, source.bounds) ||\n\t\t!pointOnBorder(end, target.bounds)\n\t) {\n\t\tissues.push(issue(\n\t\t\t\"disconnected_edge\",\n\t\t\t[edge.id, edge.sourceId, edge.targetId],\n\t\t\t`edge ${edge.id} does not connect both node borders`,\n\t\t));\n\t}\n}\n\n/** belongsToGroup follows parent IDs to decide whether a node belongs to a group. */\nfunction belongsToGroup(\n\tnodeId: string,\n\tgroupId: string,\n\tnodes: Map,\n\tgroups: Map,\n): boolean {\n\tlet parent = nodes.get(nodeId)?.parentId;\n\twhile (parent) {\n\t\tif (parent === groupId) {\n\t\t\treturn true;\n\t\t}\n\t\tparent = groups.get(parent)?.parentId;\n\t}\n\treturn false;\n}\n\n/**\n * routeViolatesGroup checks the middle of each line. When both connected nodes\n * are inside a group, the line must stay inside it. When both are outside, the\n * line must stay outside it.\n */\nfunction routeViolatesGroup(\n\tsections: Point[][],\n\tgroup: Rect,\n\tshouldBeInside: boolean,\n): boolean {\n\tfor (const section of sections) {\n\t\tfor (let index = 1; index < section.length; index++) {\n\t\t\tconst midpoint = {\n\t\t\t\tx: (section[index - 1].x + section[index].x) / 2,\n\t\t\t\ty: (section[index - 1].y + section[index].y) / 2,\n\t\t\t};\n\t\t\tif (pointInRect(midpoint, group, false) !== shouldBeInside) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n}\n\n/** routeIntersectsRect reports whether any part of a route enters a box. */\nfunction routeIntersectsRect(sections: Point[][], rect: Rect): boolean {\n\treturn sections.some(section => section.some((point, index) =>\n\t\tindex > 0 && segmentIntersectsRect(section[index - 1], point, rect),\n\t));\n}\n\n/**\n * segmentIntersectsRect checks both straight and diagonal lines. A line may\n * touch the box border, but it may not enter the box.\n */\nfunction segmentIntersectsRect(start: Point, end: Point, rect: Rect): boolean {\n\tconst dx = end.x - start.x;\n\tconst dy = end.y - start.y;\n\tlet minimum = 0;\n\tlet maximum = 1;\n\tfor (const [origin, delta, lower, upper] of [\n\t\t[start.x, dx, rect.x, rect.x + rect.width],\n\t\t[start.y, dy, rect.y, rect.y + rect.height],\n\t] as const) {\n\t\tif (Math.abs(delta) < Number.EPSILON) {\n\t\t\tif (origin <= lower || origin >= upper) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tconst first = (lower - origin) / delta;\n\t\tconst second = (upper - origin) / delta;\n\t\tminimum = Math.max(minimum, Math.min(first, second));\n\t\tmaximum = Math.min(maximum, Math.max(first, second));\n\t\tif (minimum >= maximum) {\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn maximum > 0 && minimum < 1;\n}\n\n/** overlaps treats touching borders as contact, not shared area. */\nfunction overlaps(first: Rect, second: Rect): boolean {\n\treturn (\n\t\tfirst.x < second.x + second.width &&\n\t\tsecond.x < first.x + first.width &&\n\t\tfirst.y < second.y + second.height &&\n\t\tsecond.y < first.y + first.height\n\t);\n}\n\n/** contains requires the whole inner box to be inside the outer box. */\nfunction contains(outer: Rect, inner: Rect): boolean {\n\treturn (\n\t\touter.x <= inner.x &&\n\t\touter.y <= inner.y &&\n\t\touter.x + outer.width >= inner.x + inner.width &&\n\t\touter.y + outer.height >= inner.y + inner.height\n\t);\n}\n\n/** pointInRect can include or exclude points that only touch the border. */\nfunction pointInRect(point: Point, rect: Rect, inclusive: boolean): boolean {\n\tif (inclusive) {\n\t\treturn (\n\t\t\tpoint.x >= rect.x &&\n\t\t\tpoint.y >= rect.y &&\n\t\t\tpoint.x <= rect.x + rect.width &&\n\t\t\tpoint.y <= rect.y + rect.height\n\t\t);\n\t}\n\treturn (\n\t\tpoint.x > rect.x &&\n\t\tpoint.y > rect.y &&\n\t\tpoint.x < rect.x + rect.width &&\n\t\tpoint.y < rect.y + rect.height\n\t);\n}\n\n/** inset makes a box smaller so touching its border does not count as crossing it. */\nfunction inset(rect: Rect, amount: number): Rect {\n\treturn {\n\t\tx: rect.x + amount,\n\t\ty: rect.y + amount,\n\t\twidth: Math.max(0, rect.width - amount * 2),\n\t\theight: Math.max(0, rect.height - amount * 2),\n\t};\n}\n\n/** isFinitePoint accepts only real numbers that SVG can draw. */\nfunction isFinitePoint(point: Point): boolean {\n\treturn Number.isFinite(point.x) && Number.isFinite(point.y);\n}\n\n/** isFiniteRect checks all four numbers in a box. */\nfunction isFiniteRect(rect: Rect): boolean {\n\treturn isFinitePoint(rect) && Number.isFinite(rect.width) && Number.isFinite(rect.height);\n}\n\n/** samePoint compares route points while allowing tiny browser number changes. */\nfunction samePoint(first: Point, second: Point): boolean {\n\treturn nearlyEqual(first.x, second.x) && nearlyEqual(first.y, second.y);\n}\n\n/** pointOnBorder checks that a route endpoint touches one side of a node box. */\nfunction pointOnBorder(point: Point, rect: Rect): boolean {\n\tconst withinX = point.x >= rect.x - 0.1 && point.x <= rect.x + rect.width + 0.1;\n\tconst withinY = point.y >= rect.y - 0.1 && point.y <= rect.y + rect.height + 0.1;\n\tconst onVertical = nearlyEqual(point.x, rect.x) ||\n\t\tnearlyEqual(point.x, rect.x + rect.width);\n\tconst onHorizontal = nearlyEqual(point.y, rect.y) ||\n\t\tnearlyEqual(point.y, rect.y + rect.height);\n\treturn (withinY && onVertical) || (withinX && onHorizontal);\n}\n\n/** nearlyEqual hides only browser rounding smaller than one tenth of a unit. */\nfunction nearlyEqual(first: number, second: number): boolean {\n\treturn Math.abs(first - second) <= 0.1;\n}\n\n/** forEachPair compares each pair once. */\nfunction forEachPair(items: T[], visit: (first: T, second: T) => void): void {\n\tfor (let first = 0; first < items.length; first++) {\n\t\tfor (let second = first + 1; second < items.length; second++) {\n\t\t\tvisit(items[first], items[second]);\n\t\t}\n\t}\n}\n\n/** issue creates one layout problem report. */\nfunction issue(\n\tcode: GeometryIssueCode,\n\telementIds: string[],\n\tmessage: string,\n): GeometryIssue {\n\treturn {code, elementIds, message};\n}\n","export const defs = `\n\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n`\n","type TextAttributes = Record;\n\ninterface TextSize {\n\twidth: number;\n\theight: number;\n}\n\n/** WrappedText contains the exact lines and widest rendered line. */\nexport interface WrappedText {\n\tlines: string[];\n\tmaxW: number;\n}\n\nconst measuredText = new Map();\nlet measurementSVG: SVGSVGElement | undefined;\n\n/**\n * measureSVGText returns the browser's rendered text size. Results are cached\n * because node and edge layout often measures the same words many times.\n */\nexport function measureSVGText(text: string, attrs: TextAttributes): TextSize {\n\tconst key = measurementKey(text, attrs);\n\tconst cached = measuredText.get(key);\n\tif (cached) {\n\t\treturn cached;\n\t}\n\n\tconst node = document.createElementNS(\"http://www.w3.org/2000/svg\", \"text\");\n\tnode.setAttribute(\"x\", \"0\");\n\tnode.setAttribute(\"y\", \"0\");\n\tfor (const [name, value] of Object.entries(attrs)) {\n\t\tnode.setAttribute(name, value);\n\t}\n\tnode.textContent = text;\n\n\tconst svg = getMeasurementSVG();\n\tsvg.appendChild(node);\n\tconst bounds = node.getBBox();\n\tnode.remove();\n\tconst size = {width: bounds.width, height: bounds.height};\n\tmeasuredText.set(key, size);\n\treturn size;\n}\n\n/**\n * svgTextWrap splits text into lines that fit the given width. It uses the\n * same browser text sizes that SVG drawing uses.\n */\nexport function svgTextWrap(\n\ttext: string,\n\twidth: number,\n\tattrs: TextAttributes,\n): WrappedText {\n\tlet maxW = 0;\n\tconst lines = text.trim().split(\"\\n\").flatMap(paragraph => {\n\t\tconst paragraphLines: string[] = [];\n\t\tlet currentLine: string[] = [];\n\t\tfor (const word of paragraph.trim().split(/\\s+/)) {\n\t\t\tif (measureSVGText(word, attrs).width > width) {\n\t\t\t\tif (currentLine.length > 0) {\n\t\t\t\t\tparagraphLines.push(currentLine.join(\" \"));\n\t\t\t\t\tcurrentLine = [];\n\t\t\t\t}\n\t\t\t\tconst parts = breakLongWord(word, width, attrs);\n\t\t\t\tfor (const part of parts.slice(0, -1)) {\n\t\t\t\t\tparagraphLines.push(part);\n\t\t\t\t\tmaxW = Math.max(maxW, measureSVGText(part, attrs).width);\n\t\t\t\t}\n\t\t\t\tcurrentLine = parts.slice(-1);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst nextLine = [...currentLine, word];\n\t\t\tconst size = measureSVGText(nextLine.join(\" \"), attrs);\n\t\t\tif (size.width > width && currentLine.length > 0) {\n\t\t\t\tparagraphLines.push(currentLine.join(\" \"));\n\t\t\t\tcurrentLine = [word];\n\t\t\t} else {\n\t\t\t\tmaxW = Math.max(maxW, size.width);\n\t\t\t\tcurrentLine = nextLine;\n\t\t\t}\n\t\t}\n\t\tif (currentLine.length > 0) {\n\t\t\tconst line = currentLine.join(\" \");\n\t\t\tparagraphLines.push(line);\n\t\t\tmaxW = Math.max(maxW, measureSVGText(line, attrs).width);\n\t\t}\n\t\treturn paragraphLines;\n\t});\n\treturn {lines, maxW};\n}\n\n/** getMeasurementSVG creates the single hidden SVG used for text measurement. */\nfunction getMeasurementSVG(): SVGSVGElement {\n\tif (measurementSVG?.isConnected) {\n\t\treturn measurementSVG;\n\t}\n\tmeasurementSVG = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n\tmeasurementSVG.setAttribute(\"aria-hidden\", \"true\");\n\tmeasurementSVG.style.position = \"absolute\";\n\tmeasurementSVG.style.visibility = \"hidden\";\n\tmeasurementSVG.style.pointerEvents = \"none\";\n\tdocument.body.appendChild(measurementSVG);\n\treturn measurementSVG;\n}\n\n/** measurementKey gives equal text and font settings the same cache entry. */\nfunction measurementKey(text: string, attrs: TextAttributes): string {\n\tconst attributes = Object.entries(attrs).sort(([first], [second]) =>\n\t\tfirst.localeCompare(second),\n\t);\n\treturn JSON.stringify([text, attributes]);\n}\n\n/** breakLongWord splits one word only when it cannot fit on an empty line. */\nfunction breakLongWord(\n\tword: string,\n\tmaxWidth: number,\n\tattrs: TextAttributes,\n): string[] {\n\tconst parts: string[] = [];\n\tlet currentPart = \"\";\n\tfor (const character of word) {\n\t\tconst nextPart = currentPart + character;\n\t\tif (measureSVGText(nextPart, attrs).width > maxWidth && currentPart.length > 0) {\n\t\t\tparts.push(currentPart);\n\t\t\tcurrentPart = character;\n\t\t} else {\n\t\t\tcurrentPart = nextPart;\n\t\t}\n\t}\n\tif (currentPart.length > 0) {\n\t\tparts.push(currentPart);\n\t}\n\treturn parts;\n}\n\n\n","import {svgTextWrap} from \"./svg-text\";\n\nexport const create = {\n\telement(type: string, attrs: Record = {}, className?: string) {\n\t\tconst el = document.createElementNS('http://www.w3.org/2000/svg', type);\n\t\tObject.entries(attrs).forEach(([k, v]) => el.setAttribute(k, String(v)));\n\t\tif (className) el.classList.add(className);\n\t\treturn el;\n\t},\n\n\tuse(id: string, attrs: Record = {}) {\n\t\tconst el = this.element('use', attrs);\n\t\tel.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', '#' + id);\n\t\treturn el;\n\t},\n\n\tpath(path: string, attrs: Record = {}, className?: string) {\n\t\tconst p = this.element(\"path\", {...attrs, d: path}, className);\n\t\treturn p;\n\t},\n\n\ttext(text: string, attrs: Record = {}) {\n\t\tconst t = this.element('text', attrs) as SVGTextElement;\n\t\tif (text) t.textContent = text;\n\t\treturn t;\n\t},\n\n\ttextArea(text: string, width: number, fontSize: number, bold: boolean, x = 0, y = 0, anchor = '') {\n\t\tconst attrs: Record = {\n\t\t\t'font-size': `${fontSize}px`,\n\t\t\t'font-weight': bold ? 'bold' : 'normal'\n\t\t};\n\t\tconst {lines, maxW} = svgTextWrap(text, width, attrs);\n\t\tconst txt = this.text('', {x: 0, y, 'text-anchor': anchor || undefined});\n\t\t\n\t\tlines.forEach((line, i) => {\n\t\t\tconst span = this.element('tspan', {x, dy: `${fontSize + 2}px`, ...attrs});\n\t\t\tspan.textContent = line;\n\t\t\ttxt.append(span);\n\t\t});\n\t\t\n\t\treturn {txt, dy: (lines.length + 1) * (fontSize + 2), maxW};\n\t},\n\n\trect(width: number, height: number, x = 0, y = 0, r = 0, className?: string) {\n\t\treturn this.element('rect', {x, y, rx: r, ry: r, width, height}, className) as SVGRectElement;\n\t},\n\n\ticon(icon: string, x = 0, y = 0) {\n\t\treturn this.use(icon, {x, y});\n\t},\n\n\texpand(x: number, y: number, expanded: boolean) {\n\t\tconst g = this.element('g', {transform: `translate(${x},${y})`}, 'expand') as SVGGElement;\n\t\tg.append(\n\t\t\tthis.rect(19, 19, 0, 0, 1),\n\t\t\tthis.text(expanded ? '-' : '+', {x: 10, y: 14, 'text-anchor': 'middle'})\n\t\t);\n\t\treturn g;\n\t}\n};\n\nexport function setPosition(g: SVGGElement, x: number, y: number) {\n\tg.setAttribute('transform', `translate(${x},${y})`);\n}","interface Point {\n\tx: number;\n\ty: number;\n}\n\ninterface BBox extends Point {\n\twidth: number;\n\theight: number;\n}\n\n\nexport function insideBox(p: Point, b: BBox, centeredBox = true): boolean {\n\treturn centeredBox ?\n\t\t(p.x > b.x - b.width / 2 && p.x < b.x + b.width / 2 && p.y > b.y - b.height / 2 && p.y < b.y + b.height / 2) :\n\t\t(p.x > b.x && p.x < b.x + b.width && p.y > b.y && p.y < b.y + b.height)\n}\n\nexport function boxesOverlap(b1: BBox, b2: BBox): boolean {\n\treturn b1.x < b2.x + b2.width && b1.y < b2.y + b2.height && b1.x + b1.width > b2.x && b1.y + b1.height > b2.y\n}\n\nexport function uncenterBox(b: BBox): BBox {\n\treturn {x: b.x - b.width / 2, y: b.y - b.height / 2, width: b.width, height: b.height}\n}\n\nexport function scaleBox(b: BBox, sc: number): BBox {\n\treturn {x: b.x * sc, y: b.y * sc, width: b.width * sc, height: b.height * sc}\n}\n\n// intersect 2 segments (p1->q1) with (p2, q2)\n// if the lines intersect, the result contains the x and y of the intersection (treating the lines as infinite)\n// and booleans for whether line segment 1 or line segment 2 contain the point\nfunction segmentIntersection(p1: Point, q1: Point, p2: Point, q2: Point) {\n\tlet denominator, a, b, numerator1, numerator2,\n\t\tresult: { x: number, y: number, onLine1: boolean, onLine2: boolean } = {\n\t\t\tx: null,\n\t\t\ty: null,\n\t\t\tonLine1: false,\n\t\t\tonLine2: false\n\t\t};\n\tdenominator = (q2.y - p2.y) * (q1.x - p1.x) - (q2.x - p2.x) * (q1.y - p1.y);\n\tif (denominator == 0) {\n\t\treturn result;\n\t}\n\ta = p1.y - p2.y;\n\tb = p1.x - p2.x;\n\tnumerator1 = ((q2.x - p2.x) * a) - ((q2.y - p2.y) * b);\n\tnumerator2 = ((q1.x - p1.x) * a) - ((q1.y - p1.y) * b);\n\ta = numerator1 / denominator;\n\tb = numerator2 / denominator;\n\n\t// if we cast these lines infinitely in both directions, they intersect here:\n\tresult.x = p1.x + (a * (q1.x - p1.x));\n\tresult.y = p1.y + (a * (q1.y - p1.y));\n\n\t// if line1 is a segment and line2 is infinite, they intersect if:\n\tif (a > 0 && a < 1) {\n\t\tresult.onLine1 = true;\n\t}\n\t// if line2 is a segment and line1 is infinite, they intersect if:\n\tif (b >= 0 && b <= 1) {\n\t\tresult.onLine2 = true;\n\t}\n\t// if line1 and line2 are segments, they intersect if both of the above are true\n\treturn result;\n}\n\n// intersects a segment (p1->p2) with a box\nexport function intersectRectFull(p1: Point, p2: Point, box: BBox): Point[] {\n\tconst w = box.width / 2\n\tconst h = box.height / 2\n\tconst segs: { p: Point; q: Point }[] = [\n\t\t{p: {x: box.x - w, y: box.y - h}, q: {x: box.x - w, y: box.y + h}},\n\t\t{p: {x: box.x - w, y: box.y - h}, q: {x: box.x + w, y: box.y - h}},\n\t\t{p: {x: box.x + w, y: box.y - h}, q: {x: box.x + w, y: box.y + h}},\n\t\t{p: {x: box.x - w, y: box.y + h}, q: {x: box.x + w, y: box.y + h}},\n\t]\n\treturn segs.map(s => segmentIntersection(p1, p2, s.p, s.q)).filter(ret => ret.onLine1 && ret.onLine2)\n}\n\n// intersects a line that goes from p to the center of the box\nexport function intersectRect(box: BBox, p: Point): Point {\n\tif (insideBox(p, box)) return {x: box.x, y: box.y}\n\treturn intersectRectFull(box, p, box)[0] || {x: box.x, y: box.y}\n}\n\nexport function intersectEllipse(ellCenter: Point, rx: number, ry: number, nodeCenter: Point, point: Point) {\n\n\t//translate all to center ellipse\n\tconst p1 = {x: point.x - ellCenter.x, y: point.y - ellCenter.y}\n\tconst p2 = {x: nodeCenter.x - ellCenter.x, y: nodeCenter.y - ellCenter.y}\n\n\tif (p2.x == p1.x) { //hack to avoid singularity\n\t\tp1.x += .0000001\n\t}\n\n\tconst s = (p2.y - p1.y) / (p2.x - p1.x);\n\tconst si = p2.y - (s * p2.x);\n\tconst a = (ry * ry) + (rx * rx * s * s);\n\tconst b = 2 * rx * rx * si * s;\n\tconst c = rx * rx * si * si - rx * rx * ry * ry;\n\n\tconst radicand_sqrt = Math.sqrt((b * b) - (4 * a * c));\n\tconst x = p1.x > p2.x ?\n\t\t(-b + radicand_sqrt) / (2 * a) :\n\t\t(-b - radicand_sqrt) / (2 * a)\n\tconst pos = {\n\t\tx: x,\n\t\ty: s * x + si\n\t}\n\t//translate back\n\tpos.x += ellCenter.x;\n\tpos.y += ellCenter.y\n\n\treturn pos;\n}\n\nexport interface Segment {\n\tp: Point;\n\tq: Point;\n}\n\n// given a polyline as a list of segments, interrupt it over the box so no line is inside the box\nexport function intersectPolylineBox(segments: Segment[], box: BBox) {\n\tfor (let i = 0; i < segments.length; i++) {\n\t\tconst s = segments[i]\n\t\tif (insideBox(s.p, box)) {\n\t\t\tif (insideBox(s.q, box)) { // segment both ends inside box\n\t\t\t\tsegments.splice(i, 1)\n\t\t\t\ti -= 1\n\t\t\t} else { // segment start inside box\n\t\t\t\ts.p = intersectRectFull(s.p, s.q, box)[0]\n\t\t\t}\n\t\t} else {\n\t\t\tif (insideBox(s.q, box)) { // segment end inside box\n\t\t\t\ts.q = intersectRectFull(s.p, s.q, box)[0]\n\t\t\t} else { // both ends outside\n\t\t\t\tconst ret = intersectRectFull(s.p, s.q, box)\n\t\t\t\tif (ret.length == 2) { // intersects the box, splice segment\n\t\t\t\t\t// order the intersection points, closest first\n\t\t\t\t\tconst dst1 = Math.abs(ret[0].x - s.p.x) + Math.abs(ret[0].y - s.p.y)\n\t\t\t\t\tconst dst2 = Math.abs(ret[1].x - s.p.x) + Math.abs(ret[1].y - s.p.y)\n\t\t\t\t\tif (dst1 > dst2) ret.reverse()\n\t\t\t\t\t// split the segment in 2\n\t\t\t\t\tconst s2 = {p: ret[1], q: s.q}\n\t\t\t\t\ts.q = ret[0]\n\t\t\t\t\tsegments.splice(i + 1, 0, s2)\n\t\t\t\t\ti += 1\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport function project(p: Point, a: Point, b: Point): Point {\n\tlet atob = {x: b.x - a.x, y: b.y - a.y};\n\tlet atop = {x: p.x - a.x, y: p.y - a.y};\n\tlet len = atob.x * atob.x + atob.y * atob.y;\n\tlet dot = atop.x * atob.x + atop.y * atob.y;\n\tlet t = Math.min(1, Math.max(0, dot / len));\n\treturn {\n\t\tx: a.x + atob.x * t,\n\t\ty: a.y + atob.y * t\n\t};\n}\n\nexport function cabDistance(p1: Point, p2: Point): number {\n\treturn Math.abs(p2.x - p1.x) + Math.abs(p2.y - p1.y)\n}","import {intersectEllipse, intersectRect} from \"./intersect\";\n\ninterface Point {\n\tx: number;\n\ty: number;\n}\n\ninterface BBox extends Point {\n\twidth: number;\n\theight: number;\n}\n\ninterface D3Node extends BBox {\n\tintersect: (p: Point) => Point\n}\n\nfunction cylinderRadiusY(width: number) {\n\treturn width / 2 / (5.5 + width / 70);\n}\n\nexport function shapeLabelOffsetY(shape: string, width: number, height: number) {\n\tswitch (shape.toLowerCase()) {\n\t\tcase \"cylinder\":\n\t\t\treturn 2 * cylinderRadiusY(width);\n\t\tcase \"person\":\n\t\t\treturn height * 0.4;\n\t\tcase \"folder\":\n\t\t\treturn width / 10;\n\t\tcase \"robot\":\n\t\t\treturn height * 0.35;\n\t\tcase \"webbrowser\":\n\t\t\treturn height / 8;\n\t\tdefault:\n\t\t\treturn 0;\n\t}\n}\n\nclass D3Element {\n\tprivate readonly _el: SVGElement\n\n\tconstructor(el: SVGElement) {\n\t\tthis._el = el;\n\t}\n\n\tnode() {\n\t\treturn this._el;\n\t}\n\n\tattr(name: string, value: string | number) {\n\t\tthis._el.setAttribute(name, String(value))\n\t\treturn this;\n\t}\n\n\tinsert(type: string, pos: string) {\n\t\tconst el = document.createElementNS('http://www.w3.org/2000/svg', type)\n\t\tconst el2 = this._el.insertBefore(el, this._el.querySelector(pos))\n\t\treturn new D3Element(el2)\n\t}\n}\n\n\nfunction rect(parent: D3Element, bbox: BBox, node: D3Node, rounded = false) {\n\tconst shapeSvg = parent.insert(\"rect\", \":first-child\")\n\t\t.attr(\"rx\", rounded ? node.width / 8 : 3)\n\t\t.attr(\"ry\", rounded ? node.width / 8 : 3)\n\t\t.attr(\"x\", -bbox.width / 2)\n\t\t.attr(\"y\", -bbox.height / 2)\n\t\t.attr(\"width\", bbox.width)\n\t\t.attr(\"height\", bbox.height);\n\n\tnode.intersect = function (point) {\n\t\treturn intersectRect(node, point);\n\t};\n\n\treturn shapeSvg;\n}\n\n\nfunction cylinder(parent: D3Element, bbox: BBox, node: D3Node) {\n\tconst w = bbox.width;\n\tconst rx = w / 2;\n\tconst ry = cylinderRadiusY(w);\n\tconst h = bbox.height;\n\n\tconst shape =\n\t\t`M 0,${ry} a${rx},${ry} 0,0,0 ${w} 0 a ${rx},${ry} 0,0,0 ${-w} 0 l 0,${h - 2 * ry} a ${rx},${ry} 0,0,0 ${w} 0 l 0,${-h + 2 * ry}`;\n\n\tconst shapeSvg = parent\n\t\t.attr('label-offset-y', shapeLabelOffsetY(\"cylinder\", w, h))\n\t\t.insert('path', ':first-child')\n\t\t.attr('d', shape)\n\t\t.attr('transform', 'translate(' + -w / 2 + ',' + -(h / 2) + ')');\n\n\tnode.intersect = function (point: Point) {\n\t\tconst pos = intersectRect(node, point)\n\t\tlet cy = node.y + node.height / 2 - ry\n\t\tif (pos.y > cy)\n\t\t\treturn intersectEllipse({x: node.x, y: cy}, rx, ry, node, point)\n\n\t\tcy = node.y - node.height / 2 + ry\n\t\tif (pos.y < cy)\n\t\t\treturn intersectEllipse({x: node.x, y: cy}, rx, ry, node, point)\n\n\t\treturn pos;\n\t};\n\n\treturn shapeSvg;\n}\n\nfunction person(parent: D3Element, bbox: BBox, node: D3Node) {\n\tconst w = bbox.width;\n\tconst h = bbox.height;\n\n\tconst shape =\n\t\t`M ${.38 * w},${h / 3} A${w / 2},${h / 2} 0,0,0 0 ${h / 2}\n\t\tL${w / 11},${h} L${w - w / 11},${h} L${w},${h / 2}\n\t\tA${w / 2},${h / 2} 0,0,0 ${w - .38 * w} ${h / 3} \n\t\tA${w / 6},${w / 6} 0,1,0 ${.38 * w} ${h / 3}`;\n\n\tconst shapeSvg = parent\n\t\t.attr('label-offset-y', shapeLabelOffsetY(\"person\", w, h))\n\t\t.insert('path', ':first-child')\n\t\t.attr('d', shape)\n\t\t.attr('transform', 'translate(' + -w / 2 + ',' + -(h / 2) + ')');\n\n\tnode.intersect = function (point: Point) {\n\t\tconst pos = intersectRect(node, point)\n\t\treturn pos;\n\t};\n\n\treturn shapeSvg;\n}\n\nfunction _ellipse(parent: D3Element, bbox: BBox, node: D3Node, rx: number, ry: number) {\n\tconst shapeSvg = parent.insert(\"ellipse\", \":first-child\")\n\t\t.attr(\"cx\", 0)\n\t\t.attr(\"cy\", 0)\n\t\t.attr('rx', rx)\n\t\t.attr('ry', ry)\n\t\t.attr(\"width\", node.width)\n\t\t.attr(\"height\", node.height);\n\n\tnode.intersect = function (point) {\n\t\treturn intersectEllipse(node, rx, ry, node, point)\n\t};\n\treturn shapeSvg;\n}\n\nfunction circle(parent: D3Element, bbox: BBox, node: D3Node) {\n\treturn _ellipse(parent, bbox, node, node.width / 2, node.width / 2)\n}\n\nfunction ellipse(parent: D3Element, bbox: BBox, node: D3Node) {\n\treturn _ellipse(parent, bbox, node, node.width * .55, node.width * .45)\n}\n\nfunction hexagon(parent: D3Element, bbox: BBox, node: D3Node) {\n\tconst sz = node.width / 2\n\t// drawing a hexagon from polar coords\n\t// [0,1,2,3,4,5,6].map(i=>`${Math.sin(Math.PI/3*i+Math.PI/6).toFixed(4)},${Math.cos(Math.PI/3*i+Math.PI/6).toFixed(4)}`).join(',')\n\tconst shapeSvg = parent.insert(\"polygon\", \":first-child\")\n\t\t.attr(\"points\",\n\t\t\t[0.5000, 0.8660, 1.0000, 0.0000, 0.5000, -0.8660, -0.5000, -0.8660, -1.0000, -0.0000, -0.5000, 0.8660, 0.5000, 0.8660].map(n => n * sz).join(','))\n\t\t.attr(\"width\", node.width)\n\t\t.attr(\"height\", node.height);\n\n\tnode.intersect = function (point) {\n\t\treturn intersectEllipse(node, node.width / 2, node.width / 2, node, point)\n\t};\n\treturn shapeSvg;\n}\n\nfunction component(parent: D3Element, bbox: BBox, node: D3Node) {\n\tconst dx = node.width / 10\n\tconst shapeSvg = parent.insert('g', ':first-child')\n\tshapeSvg.insert(\"rect\", \":first-child\")\n\t\t.attr(\"rx\", 3).attr(\"ry\", 3)\n\t\t.attr(\"x\", -node.width / 2 - dx)\n\t\t.attr(\"y\", -node.height / 2 + dx)\n\t\t.attr(\"width\", dx * 2)\n\t\t.attr(\"height\", dx);\n\tshapeSvg.insert(\"rect\", \":first-child\")\n\t\t.attr(\"rx\", 3).attr(\"ry\", 3)\n\t\t.attr(\"x\", -node.width / 2 - dx)\n\t\t.attr(\"y\", -node.height / 2 + dx * 2.5)\n\t\t.attr(\"width\", dx * 2)\n\t\t.attr(\"height\", dx);\n\tshapeSvg.insert(\"rect\", \":first-child\")\n\t\t.attr(\"rx\", 3).attr(\"ry\", 3)\n\t\t.attr(\"x\", -node.width / 2)\n\t\t.attr(\"y\", -node.height / 2)\n\t\t.attr(\"width\", node.width)\n\t\t.attr(\"height\", node.height);\n\n\tnode.intersect = function (point) {\n\t\treturn intersectRect({x: node.x - dx / 2, y: node.y, width: node.width + dx, height: node.height}, point);\n\t};\n\n\treturn shapeSvg;\n}\n\nfunction folder(parent: D3Element, bbox: BBox, node: D3Node) {\n\tconst dy = node.width / 20\n\tconst shapeSvg = parent\n\t\t.attr('label-offset-y', shapeLabelOffsetY(\"folder\", node.width, node.height))\n\t\t.insert('g', ':first-child')\n\tshapeSvg.insert(\"rect\", \":first-child\")\n\t\t.attr(\"rx\", 3).attr(\"ry\", 3)\n\t\t.attr(\"x\", -node.width / 2)\n\t\t.attr(\"y\", -node.height / 2 + dy * 2)\n\t\t.attr(\"width\", node.width)\n\t\t.attr(\"height\", node.height - dy * 2);\n\tshapeSvg.insert(\"path\", \":first-child\")\n\t\t.attr('d', `M0,${-node.height / 2 + 2 * dy} l${dy},${-2 * dy} h${node.width / 2 - dy * 2} v${dy * 2}`)\n\n\tnode.intersect = function (point) {\n\t\treturn intersectRect({x: node.x, y: node.y + dy / 2, width: node.width, height: node.height + dy}, point);\n\t};\n\n\treturn shapeSvg;\n}\n\nfunction mobiledevicelandscape(parent: D3Element, bbox: BBox, node: D3Node, rounded = false) {\n\tconst dx = node.width / 8\n\tconst r = node.width / 14\n\tconst shapeSvg = parent.insert('g', ':first-child')\n\tshapeSvg.insert('path', ':first-child')\n\t\t.attr('d', `M${-node.width / 2},${-node.height / 2} l0,${node.height} M${node.width / 2},${-node.height / 2} l0,${node.height}`)\n\tshapeSvg.insert('circle', ':first-child')\n\t\t.attr('cx', -node.width / 2 - dx / 2)\n\t\t.attr('cy', 0)\n\t\t.attr('r', r * .4)\n\tshapeSvg.insert('rect', ':first-child')\n\t\t.attr('x', node.width / 2 + dx / 2 - r * .2)\n\t\t.attr('y', -r)\n\t\t.attr('width', r * .4)\n\t\t.attr('height', r * 2)\n\tshapeSvg.insert(\"rect\", \":first-child\")\n\t\t.attr(\"rx\", r)\n\t\t.attr(\"ry\", r)\n\t\t.attr(\"x\", -bbox.width / 2 - dx)\n\t\t.attr(\"y\", -bbox.height / 2)\n\t\t.attr(\"width\", bbox.width + 2 * dx)\n\t\t.attr(\"height\", bbox.height);\n\n\tnode.intersect = function (point) {\n\t\treturn intersectRect({x: node.x, y: node.y, width: node.width + 2 * dx, height: node.height}, point);\n\t};\n\n\treturn shapeSvg;\n}\n\nfunction mobiledeviceportrait(parent: D3Element, bbox: BBox, node: D3Node) {\n\tconst dy = node.width / 8\n\tconst r = node.width / 14\n\tconst shapeSvg = parent.insert('g', ':first-child')\n\tshapeSvg.insert('path', ':first-child')\n\t\t.attr('d', `M${-node.width / 2},${-node.height / 2} l${node.width},0 M${-node.width / 2},${node.height / 2} l${node.width},0`)\n\tshapeSvg.insert('circle', ':first-child')\n\t\t.attr('cx', 0)\n\t\t.attr('cy', node.height / 2 + dy / 2)\n\t\t.attr('r', r * .4)\n\tshapeSvg.insert('rect', ':first-child')\n\t\t.attr('x', -r)\n\t\t.attr('y', -node.height / 2 - dy / 2 - r * .2)\n\t\t.attr('width', r * 2)\n\t\t.attr('height', r * .4)\n\tshapeSvg.insert(\"rect\", \":first-child\")\n\t\t.attr(\"rx\", r)\n\t\t.attr(\"ry\", r)\n\t\t.attr(\"x\", -bbox.width / 2)\n\t\t.attr(\"y\", -bbox.height / 2 - dy)\n\t\t.attr(\"width\", bbox.width)\n\t\t.attr(\"height\", bbox.height + 2 * dy);\n\n\tnode.intersect = function (point) {\n\t\treturn intersectRect({x: node.x, y: node.y, width: node.width, height: node.height + 2 * dy}, point);\n\t};\n\n\treturn shapeSvg;\n}\n\nfunction pipe(parent: D3Element, bbox: BBox, node: D3Node) {\n\tconst w = node.width;\n\tconst h = node.height;\n\tconst ry = h / 2;\n\tconst rx = ry / (2.5 + w / 70);\n\n\tconst shape =\n\t\t`M${-rx},0\n\t\ta${rx},${ry} 0,0,1 0,${h}\n\t\ta${rx},${ry} 0,0,1 0,${-h}\n\t\tl${w},0\n\t\ta${rx},${ry} 0,0,1 0,${h}\n\t\tl${-w},0`;\n\n\tconst shapeSvg = parent\n\t\t.insert('path', ':first-child')\n\t\t.attr('d', shape)\n\t\t.attr('transform', 'translate(' + -w / 2 + ',' + -(h / 2) + ')');\n\n\tnode.intersect = function (point: Point) {\n\t\treturn intersectRect({x: node.x - rx, y: node.y, width: node.width + 2 * rx, height: node.height}, point)\n\t};\n\n\treturn shapeSvg;\n}\n\nfunction robot(parent: D3Element, bbox: BBox, node: D3Node) {\n\tconst w = node.width\n\tconst h = node.height\n\t\n\t// Small head at top (like person shape but robot-styled)\n\tconst headSize = Math.min(w * 0.28, h * 0.25)\n\tconst headR = headSize * 0.2\n\tconst antennaH = headSize * 0.25\n\tconst antennaR = headSize * 0.08\n\t\n\t// Eye dimensions\n\tconst eyeR = headSize * 0.12\n\tconst eyeSpacing = headSize * 0.22\n\t\n\t// Ear dimensions \n\tconst earW = headSize * 0.12\n\tconst earH = headSize * 0.3\n\t\n\t// Body fills most of the space for text\n\tconst bodyW = w\n\tconst bodyTop = -h / 2 + antennaH + headSize\n\tconst bodyH = h - antennaH - headSize\n\tconst bodyR = 3\n\t\n\tconst shapeSvg = parent\n\t\t.attr('label-offset-y', shapeLabelOffsetY(\"robot\", w, h))\n\t\t.insert('g', ':first-child')\n\t\n\t// Body - main rectangle for text (draw first so it's behind)\n\tshapeSvg.insert(\"rect\", \":first-child\")\n\t\t.attr(\"rx\", bodyR)\n\t\t.attr(\"ry\", bodyR)\n\t\t.attr('x', -bodyW / 2)\n\t\t.attr('y', bodyTop)\n\t\t.attr('width', bodyW)\n\t\t.attr('height', bodyH)\n\t\n\t// Head\n\tconst headTop = -h / 2 + antennaH\n\tshapeSvg.insert(\"rect\", \":first-child\")\n\t\t.attr(\"rx\", headR)\n\t\t.attr(\"ry\", headR)\n\t\t.attr('x', -headSize / 2)\n\t\t.attr('y', headTop)\n\t\t.attr('width', headSize)\n\t\t.attr('height', headSize)\n\t\n\t// Antenna\n\tshapeSvg.insert(\"line\", \":first-child\")\n\t\t.attr('class', 'robot-antenna')\n\t\t.attr('x1', 0)\n\t\t.attr('y1', headTop)\n\t\t.attr('x2', 0)\n\t\t.attr('y2', -h / 2 + antennaR * 2)\n\t\t.attr('stroke-width', antennaR * 0.6)\n\t\t.attr('stroke-linecap', 'round')\n\t\n\t// Antenna ball\n\tshapeSvg.insert(\"circle\", \":first-child\")\n\t\t.attr('class', 'robot-antenna-ball')\n\t\t.attr('cx', 0)\n\t\t.attr('cy', -h / 2 + antennaR * 2)\n\t\t.attr('r', antennaR * 1.2)\n\t\n\t// Eyes\n\tconst eyeY = headTop + headSize * 0.4\n\tshapeSvg.insert(\"circle\", \":first-child\")\n\t\t.attr('class', 'robot-eye')\n\t\t.attr('cx', -eyeSpacing)\n\t\t.attr('cy', eyeY)\n\t\t.attr('r', eyeR)\n\tshapeSvg.insert(\"circle\", \":first-child\")\n\t\t.attr('class', 'robot-eye')\n\t\t.attr('cx', eyeSpacing)\n\t\t.attr('cy', eyeY)\n\t\t.attr('r', eyeR)\n\t\n\t// Mouth - simple smile\n\tconst mouthY = headTop + headSize * 0.7\n\tconst mouthW = headSize * 0.28\n\tshapeSvg.insert(\"path\", \":first-child\")\n\t\t.attr('class', 'robot-mouth')\n\t\t.attr('d', `M${-mouthW / 2},${mouthY} Q0,${mouthY + mouthW * 0.3} ${mouthW / 2},${mouthY}`)\n\t\t.attr('fill', 'none')\n\t\t.attr('stroke-width', antennaR * 0.5)\n\t\t.attr('stroke-linecap', 'round')\n\t\n\t// Ears\n\tshapeSvg.insert(\"rect\", \":first-child\")\n\t\t.attr(\"rx\", earW * 0.25)\n\t\t.attr(\"ry\", earW * 0.25)\n\t\t.attr('x', -headSize / 2 - earW - 1)\n\t\t.attr('y', eyeY - earH / 2)\n\t\t.attr('width', earW)\n\t\t.attr('height', earH)\n\tshapeSvg.insert(\"rect\", \":first-child\")\n\t\t.attr(\"rx\", earW * 0.25)\n\t\t.attr(\"ry\", earW * 0.25)\n\t\t.attr('x', headSize / 2 + 1)\n\t\t.attr('y', eyeY - earH / 2)\n\t\t.attr('width', earW)\n\t\t.attr('height', earH)\n\n\tnode.intersect = function (point) {\n\t\treturn intersectRect(node, point);\n\t};\n\n\treturn shapeSvg;\n}\n\nfunction webbrowser(parent: D3Element, bbox: BBox, node: D3Node) {\n\tconst dy = node.height / 8\n\tconst shapeSvg = parent\n\t\t.attr('label-offset-y', shapeLabelOffsetY(\"webbrowser\", node.width, node.height))\n\t\t.insert('g', ':first-child')\n\tshapeSvg.insert(\"path\", \":first-child\")\n\t\t.attr('d', `\n\t\t\tM${-node.width / 2},${-node.height / 2 + dy} h${node.width}\n\t\t\tM${-node.width / 2 + dy / 4},${-node.height / 2 + dy / 4} h${dy / 2} v${dy / 2} h${-dy / 2} z\n\t\t\tM${-node.width / 2 + dy},${-node.height / 2 + dy / 4} h${node.width - dy - dy / 4} v${dy / 2} h${-node.width + dy + dy / 4} z\n\t\t`)\n\tshapeSvg.insert(\"rect\", \":first-child\")\n\t\t.attr(\"rx\", 3).attr(\"ry\", 3)\n\t\t.attr(\"x\", -node.width / 2)\n\t\t.attr(\"y\", -node.height / 2)\n\t\t.attr(\"width\", node.width)\n\t\t.attr(\"height\", node.height);\n\n\tnode.intersect = function (point) {\n\t\treturn intersectRect(node, point);\n\t};\n\n\treturn shapeSvg;\n}\n\nexport const shapes: { [key: string]: (parent: SVGElement, node: D3Node) => SVGElement } = {\n\tbox: (parent: SVGElement, node: D3Node) => rect(new D3Element(parent), node, node).node(),\n\troundedbox: (parent: SVGElement, node: D3Node) => rect(new D3Element(parent), node, node, true).node(),\n\tcomponent: (parent: SVGElement, node: D3Node) => component(new D3Element(parent), node, node).node(),\n\tcylinder: (parent: SVGElement, node: D3Node) => cylinder(new D3Element(parent), node, node).node(),\n\tperson: (parent: SVGElement, node: D3Node) => person(new D3Element(parent), node, node).node(),\n\tcircle: (parent: SVGElement, node: D3Node) => circle(new D3Element(parent), node, node).node(),\n\tellipse: (parent: SVGElement, node: D3Node) => ellipse(new D3Element(parent), node, node).node(),\n\thexagon: (parent: SVGElement, node: D3Node) => hexagon(new D3Element(parent), node, node).node(),\n\tfolder: (parent: SVGElement, node: D3Node) => folder(new D3Element(parent), node, node).node(),\n\tmobiledevicelandscape: (parent: SVGElement, node: D3Node) => mobiledevicelandscape(new D3Element(parent), node, node).node(),\n\tmobiledeviceportrait: (parent: SVGElement, node: D3Node) => mobiledeviceportrait(new D3Element(parent), node, node).node(),\n\tmobiledevice: (parent: SVGElement, node: D3Node) => mobiledeviceportrait(new D3Element(parent), node, node).node(),\n\tpipe: (parent: SVGElement, node: D3Node) => pipe(new D3Element(parent), node, node).node(),\n\trobot: (parent: SVGElement, node: D3Node) => robot(new D3Element(parent), node, node).node(),\n\twebbrowser: (parent: SVGElement, node: D3Node) => webbrowser(new D3Element(parent), node, node).node(),\n}\n","/**\n * Undo functionality\n * at every change in the document, Undo can save a new version\n * so the user can \"undo\" and \"redo\" changes by reverting to an\n * older version of the document\n */\n\nexport class Undo {\n\tprivate readonly versions: Doc[] = [];\n\tprivate pos: number = 0;\n\tprivate lastSavedPos: number = 0;\n\tprivate readonly exportDoc: () => Doc;\n\tprivate readonly importDoc: (d: Doc) => void;\n\tchange: () => void;\n\tprivate tmpPreviousState: Doc | null = null;\n\n\tconstructor(id: string, exportDoc: () => Doc, importDoc: (d: Doc) => void) {\n\t\tthis.exportDoc = exportDoc;\n\t\tthis.importDoc = importDoc;\n\t\tthis.change = debounce(() => this.saveNow(), 300);\n\t}\n\n\t// Store the state previous to the changes collected in the debounce period\n\tbeforeChange() {\n\t\tif (!this.tmpPreviousState) {\n\t\t\tthis.tmpPreviousState = this.deepClone(this.exportDoc());\n\t\t}\n\t}\n\n\tlength() {\n\t\treturn this.versions.length;\n\t}\n\n\tcurrentState() {\n\t\treturn this.deepClone(this.versions[this.pos - 1]);\n\t}\n\n\tprivate saveNow() {\n\t\tif (!this.tmpPreviousState) {\n\t\t\tthrow Error(\"undo.change() was called without previously calling undo.beforeChange()!\");\n\t\t}\n\t\t\n\t\tthis.versions[this.pos] = this.deepClone(this.exportDoc());\n\t\tthis.versions[this.pos - 1] = this.tmpPreviousState;\n\t\tthis.tmpPreviousState = null;\n\t\tthis.pos += 1;\n\t\t\n\t\t// Remove anything that might be on top of this version\n\t\tthis.versions.splice(this.pos);\n\t}\n\n\tprivate deepClone(doc: Doc): Doc {\n\t\t// Use modern structuredClone if available, fallback to JSON\n\t\tif (typeof structuredClone !== 'undefined') {\n\t\t\treturn structuredClone(doc);\n\t\t}\n\t\treturn JSON.parse(JSON.stringify(doc));\n\t}\n\n\tundo() {\n\t\tif (this.pos < 2) return;\n\t\tthis.pos -= 1;\n\t\tconst doc = this.versions[this.pos - 1];\n\t\tthis.importDoc(this.deepClone(doc));\n\t}\n\n\tredo() {\n\t\tif (this.pos > this.versions.length - 1) return;\n\t\tconst doc = this.versions[this.pos];\n\t\tthis.importDoc(this.deepClone(doc));\n\t\tthis.pos += 1;\n\t}\n\n\tchanged() {\n\t\treturn this.pos !== this.lastSavedPos;\n\t}\n\n\tsetSaved() {\n\t\tthis.lastSavedPos = this.pos;\n\t}\n}\n\nfunction debounce(func: () => void, wait: number) {\n\tlet timeout: ReturnType;\n\treturn function () {\n\t\tconst context = this;\n\t\tconst later = function () {\n\t\t\ttimeout = null;\n\t\t\tfunc.apply(context);\n\t\t};\n\t\tclearTimeout(timeout);\n\t\ttimeout = setTimeout(later, wait);\n\t};\n}","import {applyStyle, SVG_STYLES} from \"./constants\";\nimport {create} from \"./svg-create\";\nimport {svgTextWrap} from \"./svg-text\";\n\ninterface TextBlockLayout {\n\tlines: string[];\n\tfontSize: number;\n\tlineHeight: number;\n\tbold: boolean;\n\tfield?: string;\n\tgapAfter: number;\n}\n\nexport interface NodeContentLayout {\n\tblocks: TextBlockLayout[];\n\ttextHeight: number;\n\tminimumHeight: number;\n}\n\nconst HORIZONTAL_PADDING = 18;\nconst VERTICAL_PADDING = 18;\nconst TITLE_GAP = 6;\nconst METADATA_GAP = 10;\n\nfunction textBlock(\n\ttext: string,\n\twidth: number,\n\tfontSize: number,\n\tbold: boolean,\n\tgapAfter: number,\n\tfield?: string,\n): TextBlockLayout {\n\tconst attrs = {\n\t\t\"font-family\": String(SVG_STYLES.nodeText[\"font-family\"]),\n\t\t\"font-size\": `${fontSize}px`,\n\t\t\"font-weight\": bold ? \"bold\" : \"normal\",\n\t};\n\tconst wrapped = svgTextWrap(text, width, attrs);\n\tconst lines = wrapped.lines.length > 0 ? wrapped.lines : [\"\"];\n\n\treturn {\n\t\tlines,\n\t\tfontSize,\n\t\tlineHeight: fontSize + 2,\n\t\tbold,\n\t\tfield,\n\t\tgapAfter,\n\t};\n}\n\nexport function layoutNodeContent(\n\ttitle: string,\n\tsubtitle: string,\n\tdescription: string,\n\tnodeWidth: number,\n\tfontSize: number,\n): NodeContentLayout {\n\tconst textWidth = Math.max(nodeWidth - HORIZONTAL_PADDING * 2, 80);\n\tconst blocks = [\n\t\ttextBlock(title, textWidth, fontSize, true, TITLE_GAP, \"name\"),\n\t\ttextBlock(`[${subtitle}]`, textWidth, fontSize * 0.75, false, METADATA_GAP),\n\t\ttextBlock(description, textWidth, Math.min(fontSize * 0.8, 16), false, 0, \"description\"),\n\t];\n\tconst textHeight = blocks.reduce(\n\t\t(height, block) => height + block.lines.length * block.lineHeight + block.gapAfter,\n\t\t0,\n\t);\n\n\treturn {\n\t\tblocks,\n\t\ttextHeight,\n\t\tminimumHeight: textHeight + VERTICAL_PADDING * 2,\n\t};\n}\n\nexport function buildNodeContent(layout: NodeContentLayout, color?: string): SVGGElement {\n\tconst group = create.element(\"g\") as SVGGElement;\n\tlet top = -layout.textHeight / 2;\n\n\tlayout.blocks.forEach((block) => {\n\t\tconst text = create.text(\"\", {\"text-anchor\": \"middle\"});\n\t\tapplyStyle(text, SVG_STYLES.nodeText);\n\t\tif (color) {\n\t\t\ttext.setAttribute(\"fill\", color);\n\t\t}\n\t\tif (block.field) {\n\t\t\ttext.setAttribute(\"data-field\", block.field);\n\t\t}\n\n\t\tblock.lines.forEach((line, index) => {\n\t\t\tconst span = create.element(\"tspan\", {\n\t\t\t\tx: 0,\n\t\t\t\ty: top + block.fontSize + index * block.lineHeight,\n\t\t\t\t\"font-size\": `${block.fontSize}px`,\n\t\t\t\t\"font-weight\": block.bold ? \"bold\" : \"normal\",\n\t\t\t});\n\t\t\tspan.textContent = line;\n\t\t\ttext.append(span);\n\t\t});\n\n\t\tgroup.append(text);\n\t\ttop += block.lines.length * block.lineHeight + block.gapAfter;\n\t});\n\n\treturn group;\n}\n","import {defs} from \"./defs\";\nimport {create, setPosition} from \"./svg-create\";\nimport {cursorInteraction} from \"svg-editor-tools/lib/cursor-interaction\";\nimport {shapeLabelOffsetY, shapes} from \"./shapes\";\nimport {\n\tboxesOverlap,\n\tcabDistance,\n\tinsideBox,\n\tintersectPolylineBox,\n\tproject,\n\tscaleBox,\n\tSegment,\n\tuncenterBox\n} from \"./intersect\";\nimport {autoLayout, LayoutOptions, validateCurrentLayout} from \"./layout\";\nimport {Undo} from \"./undo\";\nimport {\n\tADD_LABEL_VERTEX,\n\tADD_VERTEX,\n\tDEL_VERTEX,\n\tDESELECT,\n\tfindShortcut,\n\tREDO,\n\tSELECT_ALL,\n\tUNDO,\n\tZOOM_100,\n\tZOOM_FIT,\n\tZOOM_IN,\n\tZOOM_OUT\n} from \"../shortcuts\";\nimport {\n\tPoint,\n\tBBox,\n\tNodeStyle,\n\tEdgeStyle,\n\tDEFAULT_EDGE_STYLE,\n\tDEFAULT_NODE_STYLE,\n\tSVG_STYLES,\n\tSVG_PADDING,\n\tDEFAULT_GRID_SIZE,\n\tapplyStyle\n} from \"./constants\";\nimport {\n\tcalculateEdgeVertices,\n\tcalculateLabelPlacement,\n\tcreateEdgePath,\n\tEdgeLabelPlacement\n} from \"./edge-utils\";\nimport {\n\tbuildNodeContent,\n\tlayoutNodeContent,\n\tNodeContentLayout\n} from \"./node-content\";\nimport {ValidatedLayout} from \"./geometry\";\n\n\n// Point and BBox interfaces are now imported from constants\n\nexport interface Group extends BBox {\n\tid: string;\n\tname: string;\n\tnodes: (Node | Group)[];\n\tref?: SVGGElement;\n\tstyle: NodeStyle;\n\tlayoutBounds?: BBox;\n\tlayoutTitleBounds?: BBox;\n}\n\nexport interface NodeLink {\n\thref: string;\n\texportHref: string;\n}\n\nexport type LayoutDirection = 'UP' | 'DOWN' | 'LEFT' | 'RIGHT';\n\nexport interface Node extends BBox {\n\tid: string;\n\ttitle: string;\n\tsub: string;\n\tdescription: string;\n\n\tref?: SVGGElement;\n\tselected?: boolean;\n\n\tintersect: (p: Point) => Point\n\n\tstyle: NodeStyle\n\tlink?: NodeLink\n\tcontentLayout: NodeContentLayout\n}\n\n// NodeStyle interface is now imported from constants\n\n// EdgeStyle interface is now imported from constants\n\n// Default styles are now imported from constants\nconst defaultEdgeStyle = DEFAULT_EDGE_STYLE;\nconst defaultNodeStyle = DEFAULT_NODE_STYLE;\n\n// Edge and EdgeVertex interfaces are now defined in edge-utils.ts\n// Using local interfaces for compatibility with existing code\nexport interface Edge {\n\tid: string;\n\tlabel: string;\n\tfrom: Node;\n\tto: Node;\n\tvertices?: EdgeVertex[];\n\tref?: SVGGElement;\n\tstyle: EdgeStyle;\n\tinitVertex: (p: Point) => EdgeVertex;\n\tuserDeletedVertices?: boolean; // Track if user explicitly deleted vertices\n\tlabelVertex?: EdgeVertex; // ELK-calculated label position (separate from routing vertices)\n\tlabelBounds?: BBox;\n\tlayoutSections?: Point[][];\n\tlayoutLabelBounds?: BBox;\n}\n\ninterface EdgeVertex extends Point {\n\tid: string\n\tselected?: boolean\n\tedge: Edge\n\tref?: SVGElement\n\tlabel?: boolean\n\tauto?: boolean\n}\n\ninterface SavedEdgePoint extends Point {\n\tlabel?: boolean;\n\tauto?: boolean;\n}\n\ninterface Layout {\n\t[k: string]: Point | SavedEdgePoint[] | boolean\n}\n\nexport class GraphData {\n\tid: string;\n\tname: string;\n\tnodesMap: Map;\n\tedges: Edge[];\n\tedgeVertices: Map\n\tgroupsMap: Map;\n\tmetadata: any;\n\tlayoutDirection?: LayoutDirection;\n\tvalidatedLayout?: ValidatedLayout;\n\tcolorToVarMap: Map = new Map(); // For CSS custom properties theming\n\tprivate _undo: Undo;\n\tprivate _gridVisible: boolean = false;\n\tprivate _snapToGrid: boolean = true;\n\tprivate _gridSize: number = 25;\n\tprivate _skipAutoFit: boolean = false;\n\n\tconstructor(id?: string, name?: string) {\n\t\tthis.id = id;\n\t\tthis.name = name;\n\n\t\tthis.edges = [];\n\t\tthis.edgeVertices = new Map;\n\t\tthis.nodesMap = new Map;\n\t\tthis.groupsMap = new Map;\n\n\t\tthis._undo = new Undo(\n\t\t\tthis.id,\n\t\t\t() => this.exportLayout(true),\n\t\t\t(lo) => this.importLayout(lo, true)\n\t\t)\n\n\t\t// @ts-ignore\n\t\twindow.graph = this\n\t}\n\n\t// after the graph model is build using addNode, addEdge etc, initialize\n\tinit(layout?: Layout) {\n\t\tlayout && this.importLayout(layout)\n\t\tthis._undo = new Undo(\n\t\t\tthis.id,\n\t\t\t() => this.exportLayout(true),\n\t\t\t(lo) => this.importLayout(lo, true)\n\t\t)\n\t\tif (this._undo.length()) {\n\t\t\tthis.importLayout(this._undo.currentState())\n\t\t}\n\t\t\n\t\t// Save initial state so first action is undoable\n\t\tthis._undo.beforeChange()\n\t\tthis._undo.change()\n\t}\n\n\taddNode(id: string, label: string, sub: string, description: string, style: NodeStyle, link?: NodeLink) {\n\t\tif (this.nodesMap.has(id)) throw Error('duplicate node: ' + id)\n\t\tconst nodeStyle = {...defaultNodeStyle, ...style};\n\t\tconst shape = (nodeStyle.shape || 'Box').toLowerCase();\n\t\tconst minimumWidth = 280;\n\t\tconst minimumHeight = shape === 'person' ? 240 : 180;\n\t\tconst width = Math.max(minimumWidth, nodeStyle.width || 0);\n\t\tconst fontSize = nodeStyle.fontSize || 22;\n\t\tconst contentLayout = layoutNodeContent(label, sub, description, width, fontSize);\n\t\tlet height = Math.max(minimumHeight, nodeStyle.height || 0, contentLayout.minimumHeight);\n\n\t\t// Some shapes shift labels down to reserve visual space for an icon,\n\t\t// header, or curved edge. Grow until the shifted content also fits.\n\t\tfor (let i = 0; i < 20; i++) {\n\t\t\tconst requiredHeight = contentLayout.minimumHeight +\n\t\t\t\tMath.abs(shapeLabelOffsetY(shape, width, height));\n\t\t\tif (requiredHeight <= height + 0.1) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\theight = requiredHeight;\n\t\t}\n\n\t\tconst n: Node = {\n\t\t\tid, title: label, sub, description, style: nodeStyle,\n\t\t\tx: 0, y: 0, width, height, intersect: null, link, contentLayout\n\t\t}\n\t\tthis.nodesMap.set(n.id, n)\n\t}\n\n\tnodes() {\n\t\treturn Array.from(this.nodesMap.values())\n\t}\n\n\taddEdge(id: string, fromNode: string, toNode: string, label: string, vertices: Point[], style: EdgeStyle) {\n\t\tvertices && vertices.forEach((p, i) => {\n\t\t\tconst v = p as EdgeVertex\n\t\t\tv.id = `v-${id}-${i}`\n\t\t\tthis.edgeVertices.set(v.id, v)\n\t\t})\n\t\t// Deterministic vertex IDs.\n\t\t//\n\t\t// `mdl svg` renders diagrams headlessly and saves the resulting SVG. If we\n\t\t// generate random vertex IDs, the SVG changes on every run even when the\n\t\t// underlying model and layout are unchanged. Use a stable hash instead.\n\t\tconst fnv1a36 = (input: string) => {\n\t\t\tlet h = 0x811c9dc5\n\t\t\tfor (let i = 0; i < input.length; i++) {\n\t\t\t\th ^= input.charCodeAt(i)\n\t\t\t\th = Math.imul(h, 0x01000193)\n\t\t\t}\n\t\t\treturn (h >>> 0).toString(36)\n\t\t}\n\t\tconst stableVertexID = (edgeID: string, p: Point) => {\n\t\t\tconst x = (p as any).x\n\t\t\tconst y = (p as any).y\n\t\t\treturn `v-${edgeID}-a-${fnv1a36(`${edgeID}:${x}:${y}`)}`\n\t\t}\n\t\tconst initVertex = (p: Point) => {\n\t\t\tconst v = p as EdgeVertex\n\t\t\tif (!v.id) {\n\t\t\t\tv.id = stableVertexID(edge.id, p)\n\t\t\t\tthis.edgeVertices.set(v.id, v)\n\t\t\t}\n\t\t\tv.edge = edge\n\t\t\treturn p as EdgeVertex\n\t\t}\n\t\tconst edge = {\n\t\t\tid,\n\t\t\tfrom: this.nodesMap.get(fromNode),\n\t\t\tto: this.nodesMap.get(toNode),\n\t\t\tlabel,\n\t\t\tvertices: null as EdgeVertex[],\n\t\t\tstyle: {...defaultEdgeStyle, ...style},\n\t\t\tinitVertex,\n\t\t\tuserDeletedVertices: false\n\t\t}\n\t\tthis.edges.push(edge)\n\t\tif (vertices) {\n\t\t\tedge.vertices = vertices.map(p => edge.initVertex(p))\n\t\t}\n\t}\n\n\taddGroup(id: string, name: string, nodesOrGroups: string[], style: NodeStyle) {\n\t\tif (this.groupsMap.has(id)) {\n\t\t\tconsole.error(`Group exists: ${id} ${name}`)\n\t\t\treturn\n\t\t}\n\t\tconst group: Group = {\n\t\t\tid, name, x: null, y: null, width: null, height: null,\n\t\t\tnodes: nodesOrGroups.map(k => {\n\t\t\t\tconst n = this.nodesMap.get(k) || this.groupsMap.get(k)\n\t\t\t\tif (!n) console.error(`Node or group ${k} not found for group ${id} \"${name}\"`)\n\t\t\t\treturn n\n\t\t\t}).filter(Boolean),\n\t\t\tstyle\n\t\t}\n\t\tthis.groupsMap.set(id, group)\n\t}\n\n\t// private rebuildNode(node: Node) {\n\t// \tconst p = node.ref.parentElement;\n\t// \tp.removeChild(node.ref)\n\t// \tnode.ref = buildNode(node, this)\n\t// \tp.appendChild(node.ref)\n\t// \tthis.redrawEdges(node)\n\t// \tthis.redrawGroups(node)\n\t// }\n\n\tsetNodeSelected(node: Node, selected: boolean) {\n\t\tnode.selected = selected\n\t\tselected ?\n\t\t\tnode.ref.classList.add('selected') :\n\t\t\tnode.ref.classList.remove('selected')\n\t\tthis.updateEdgesSel()\n\t}\n\n\tprivate updateEdgesSel() {\n\t\tthis.edges.forEach(e => {\n\t\t\tif (e.to.selected || e.from.selected) {\n\t\t\t\te.ref.classList.add('selected')\n\t\t\t} else {\n\t\t\t\te.ref.classList.remove('selected')\n\t\t\t}\n\t\t})\n\t}\n\n\t/** clearResolvedLayout returns drawing to manual mode after any user edit. */\n\tprivate clearResolvedLayout() {\n\t\tthis.validatedLayout = undefined\n\t\tthis.edges.forEach(edge => {\n\t\t\tedge.layoutSections = undefined\n\t\t\tedge.layoutLabelBounds = undefined\n\t\t})\n\t\tthis.groupsMap.forEach(group => {\n\t\t\tgroup.layoutBounds = undefined\n\t\t\tgroup.layoutTitleBounds = undefined\n\t\t})\n\t}\n\n\tmoveNode(n: Node, x: number, y: number, disableSnap: boolean = false, skipUndo: boolean = false) {\n\t\tif (!n) return\n\t\t\n\t\t// Apply snap-to-grid if enabled and not explicitly disabled\n\t\tif (this._snapToGrid && !disableSnap) {\n\t\t\tconst snapped = this.snapToGrid(x, y);\n\t\t\tx = snapped.x;\n\t\t\ty = snapped.y;\n\t\t}\n\t\t\n\t\tif (n.x == x && n.y == y) return\n\t\t\n\t\tif (!skipUndo) {\n\t\t\tthis._undo.beforeChange()\n\t\t}\n\t\tthis.clearResolvedLayout()\n\t\tn.x = x;\n\t\tn.y = y;\n\t\tsetPosition(n.ref, x, y)\n\t\tthis.redrawEdges(n);\n\t\tthis.redrawGroups(n)\n\t\tif (!skipUndo) {\n\t\t\tthis._undo.change()\n\t\t}\n\t}\n\n\tmoveEdgeVertex(v: EdgeVertex, x: number, y: number, disableSnap: boolean = false, skipUndo: boolean = false) {\n\t\t\n\t\tif (this._snapToGrid && !disableSnap) {\n\t\t\tconst snapped = this.snapToGrid(x, y);\n\t\t\tx = snapped.x;\n\t\t\ty = snapped.y;\n\t\t}\n\t\t// Use exact coordinates (no rounding needed with modern grid system)\n\t\t\n\t\tif (v.x == x && v.y == y) return\n\t\tif (!skipUndo) {\n\t\t\tthis._undo.beforeChange()\n\t\t}\n\t\tthis.clearResolvedLayout()\n\t\tv.x = x;\n\t\tv.y = y;\n\t\tthis.redrawEdge(v.edge)\n\t\tif (!skipUndo) {\n\t\t\tthis._undo.change()\n\t\t}\n\t}\n\n\tmoveSelected(dx: number, dy: number, disableSnap: boolean = false) {\n\t\tthis.nodes().forEach(n => n.selected && this.moveNode(n, n.x + dx, n.y + dy, disableSnap, false))\n\t\tthis.edgeVertices.forEach(v => v.selected && this.moveEdgeVertex(v, v.x + dx, v.y + dy, disableSnap, false))\n\t}\n\n\tinsertEdgeVertex(edge: Edge, p: Point, pos: number, isLabel: boolean) {\n\t\tthis._undo.beforeChange()\n\t\tthis.clearResolvedLayout()\n\t\tconst v = edge.initVertex(p)\n\t\tv.selected = true\n\t\tif (isLabel) { // when shift down, make it label position\n\t\t\tedge.vertices.forEach(v => v.label = false)\n\t\t\tv.label = true\n\t\t}\n\t\tedge.vertices.splice(pos - 1, 0, v)\n\t\tthis.redrawEdge(edge)\n\t\tthis._undo.change()\n\t}\n\n\tdeleteEdgeVertex(v: EdgeVertex) {\n\t\tthis._undo.beforeChange()\n\t\tthis.clearResolvedLayout()\n\t\t\n\t\tconst index = v.edge.vertices.indexOf(v)\n\t\tif (index >= 0) {\n\t\t\tv.edge.vertices.splice(index, 1)\n\t\t\tthis.edgeVertices.delete(v.id)\n\t\t\t\n\t\t\t// Mark that user explicitly deleted vertices from this edge\n\t\t\tv.edge.userDeletedVertices = true\n\t\t}\n\t\t\n\t\tthis.redrawEdge(v.edge)\n\t\tthis._undo.change()\n\t}\n\n\tchanged() {\n\t\treturn this._undo.changed()\n\t}\n\n\tundo() {\n\t\tthis._undo.undo()\n\t}\n\n\tredo() {\n\t\tthis._undo.redo()\n\t}\n\n\t// moves the entire graph to be aligned top-left of the drawing area\n\t// used to bring back to visible the nodes that end up at negative coordinates\n\talignTopLeft() {\n\t\tconst contentBounds = this.calculateContentBounds()\n\t\tconst padding = 100 // Reasonable padding for viewport\n\t\t\n\t\tconst offsetX = -contentBounds.x + padding\n\t\tconst offsetY = -contentBounds.y + padding\n\t\t\n\t\t// Set flag to prevent React useEffect from calling fitToView during this operation\n\t\tthis._skipAutoFit = true\n\t\t\n\t\tthis._undo.beforeChange()\n\t\t\n\t\tthis.nodesMap.forEach(node => {\n\t\t\tthis.moveNode(node, node.x + offsetX, node.y + offsetY, true, true) // Disable snap and undo during reset\n\t\t})\n\t\t\n\t\tthis.edgeVertices.forEach(vertex => {\n\t\t\tthis.moveEdgeVertex(vertex, vertex.x + offsetX, vertex.y + offsetY, true, true) // Disable snap and undo during reset\n\t\t})\n\t\t\n\t\tthis._undo.change()\n\t\t\n\t\t// DON'T clear view state here - let resetPanTransform handle it to avoid React useEffect recursion\n\t}\n\t\n\t// Reset pan transform to (0,0) while preserving zoom\n\tresetPanTransform() {\n\t\tconst currentZoom = getZoom()\n\t\tconst zoomGroup = svg.querySelector('g.zoom') as SVGGElement\n\t\tif (zoomGroup) {\n\t\t\tzoomGroup.setAttribute('transform', `scale(${currentZoom}) translate(0, 0)`)\n\t\t\tupdatePanningOptimized(this)\n\t\t}\n\t\t\n\t\t// Clear view state so this reset is not overridden\n\t\tclearViewState(this.id)\n\t\t\n\t\t// Reset the skip auto fit flag after reset is complete\n\t\tthis._skipAutoFit = false\n\t}\n\t\n\t// Check if auto-fit should be skipped (used by React useEffect)\n\tshouldSkipAutoFit(): boolean {\n\t\treturn this._skipAutoFit\n\t}\n\n\t// Reset view to default state: 100% zoom, centered at origin\n\tresetView() {\n\t\tconst zoomGroup = svg.querySelector('g.zoom') as SVGGElement\n\t\tif (zoomGroup) {\n\t\t\t// Reset to 100% zoom, centered at origin\n\t\t\tzoomGroup.setAttribute('transform', 'scale(1) translate(0, 0)')\n\t\t\tupdatePanning()\n\t\t}\n\t\t\n\t\t// Clear any saved view state so this reset position is not overridden\n\t\tclearViewState(this.id)\n\t}\n\n\t//redraw connected edges\n\tprivate redrawEdges(n: Node) {\n\t\tthis.edges.forEach(e => (n == e.from || n == e.to) && this.redrawEdge(e))\n\t\tthis.updateEdgesSel()\n\t}\n\n\tredrawEdge(e: Edge) {\n\t\tconst p = e.ref.parentElement;\n\t\tp.removeChild(e.ref)\n\t\te.ref = buildEdge(e)\n\t\tp.append(e.ref)\n\t}\n\n\tprivate redrawGroups(node: Node) {\n\t\tthis.groupsMap.forEach(group => {\n\t\t\t//if (group.nodes.indexOf(node) == -1) return\n\t\t\tconst p = group.ref.parentElement\n\t\t\tp.removeChild(group.ref)\n\t\t\tbuildGroup(group)\n\t\t\tp.append(group.ref)\n\t\t})\n\t}\n\n\texportSVG() {\n\t\tif (!this.validatedLayout) {\n\t\t\tthis.validatedLayout = validateCurrentLayout(this)\n\t\t}\n\t\t// Get the original SVG\n\t\tconst originalSvg: SVGSVGElement = document.querySelector('svg#graph')\n\t\tconst elastic = originalSvg.querySelector('rect.elastic')\n\t\t\n\t\t// Clone the SVG for export (completely separate from the live one)\n\t\tconst exportSvg = originalSvg.cloneNode(true) as SVGSVGElement\n\n\t\t// Standalone SVGs navigate to sibling view files instead of editor routes.\n\t\texportSvg.querySelectorAll('a.nodeLink[data-export-href]').forEach(link => {\n\t\t\tlink.setAttribute('href', link.getAttribute('data-export-href') || '')\n\t\t\tlink.removeAttribute('data-export-href')\n\t\t})\n\t\t\n\t\t// Remove elastic element from export\n\t\tconst exportElastic = exportSvg.querySelector('rect.elastic')\n\t\tif (exportElastic) {\n\t\t\texportElastic.remove()\n\t\t}\n\t\t\n\t\t// Calculate actual content bounds including all elements\n\t\tconst contentBounds = this.calculateContentBounds()\n\t\t\n\t\t// Add padding around content\n\t\tconst padding = 50\n\t\t\n\t\t// Calculate final export dimensions (always positive)\n\t\tconst exportWidth = contentBounds.width + (padding * 2)\n\t\tconst exportHeight = contentBounds.height + (padding * 2)\n\t\t\n\t\t// Calculate offset to move content to start at (padding, padding) within the export area\n\t\tconst offsetX = -contentBounds.x + padding\n\t\tconst offsetY = -contentBounds.y + padding\n\t\t\n\t\t// Apply export positioning to the cloned SVG elements\n\t\tconst exportZoomGroup = exportSvg.querySelector('g.zoom') as SVGGElement\n\t\tif (exportZoomGroup) {\n\t\t\t// Reset zoom to 1 and apply offset transform to position content properly\n\t\t\texportZoomGroup.setAttribute('transform', `scale(1) translate(${offsetX}, ${offsetY})`)\n\t\t}\n\t\t\n\t\t// Set proper viewBox and dimensions for export - viewBox always starts at (0,0)\n\t\texportSvg.setAttribute('viewBox', `0 0 ${exportWidth} ${exportHeight}`)\n\t\texportSvg.setAttribute('width', String(exportWidth))\n\t\texportSvg.setAttribute('height', String(exportHeight))\n\t\t\n\t\t// Add required SVG namespace for browser compatibility\n\t\texportSvg.setAttribute('xmlns', 'http://www.w3.org/2000/svg')\n\t\t\n\t\t// Convert inline styles to CSS custom properties for theming support\n\t\tthis.convertStylesToCustomProperties(exportSvg)\n\t\t\n\t\t// Inject metadata with current layout\n\t\tconst script = document.createElement('script')\n\t\tscript.setAttribute('type', 'application/json')\n\t\tthis.metadata.layout = this.exportLayout()\n\t\tscript.append('')\n\t\texportSvg.insertBefore(script, exportSvg.firstChild)\n\t\t\n\t\t// Get the export SVG as string\n\t\tconst src = exportSvg.outerHTML\n\t\t\n\t\t// No restoration needed since we never touched the original SVG!\n\t\treturn src\n\t}\n\n\t// Convert inline fill/stroke attributes to CSS custom properties with fallbacks.\n\t// This enables theming: container pages can override colors via CSS variables.\n\tprivate convertStylesToCustomProperties(svg: SVGSVGElement) {\n\t\tif (this.colorToVarMap.size === 0) return\n\n\t\t// Process all elements with fill attribute\n\t\tsvg.querySelectorAll('[fill]').forEach(el => {\n\t\t\tconst fill = el.getAttribute('fill')\n\t\t\tif (fill && this.colorToVarMap.has(fill)) {\n\t\t\t\tel.setAttribute('fill', `var(${this.colorToVarMap.get(fill)}, ${fill})`)\n\t\t\t}\n\t\t})\n\n\t\t// Process all elements with stroke attribute\n\t\tsvg.querySelectorAll('[stroke]').forEach(el => {\n\t\t\tconst stroke = el.getAttribute('stroke')\n\t\t\tif (stroke && this.colorToVarMap.has(stroke)) {\n\t\t\t\tel.setAttribute('stroke', `var(${this.colorToVarMap.get(stroke)}, ${stroke})`)\n\t\t\t}\n\t\t})\n\t}\n\n\t// Calculate the actual bounds of all content including nodes, edges, and groups\n\tcalculateContentBounds(): BBox {\n\t\tlet minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity\n\t\t\n\t\t// Process nodes (including their actual dimensions)\n\t\tthis.nodes().forEach(node => {\n\t\t\tconst left = node.x - node.width / 2\n\t\t\tconst right = node.x + node.width / 2\n\t\t\tconst top = node.y - node.height / 2\n\t\t\tconst bottom = node.y + node.height / 2\n\t\t\t\n\t\t\tminX = Math.min(minX, left)\n\t\t\tmaxX = Math.max(maxX, right)\n\t\t\tminY = Math.min(minY, top)\n\t\t\tmaxY = Math.max(maxY, bottom)\n\t\t})\n\t\t\n\t\t// Process edge vertices (much faster than complex label calculations)\n\t\tthis.edgeVertices.forEach(vertex => {\n\t\t\tminX = Math.min(minX, vertex.x - 5)\n\t\t\tmaxX = Math.max(maxX, vertex.x + 5)\n\t\t\tminY = Math.min(minY, vertex.y - 5)\n\t\t\tmaxY = Math.max(maxY, vertex.y + 5)\n\t\t})\n\t\t\n\t\t// Process groups\n\t\tthis.groupsMap.forEach(group => {\n\t\t\tconst left = group.x - group.width / 2\n\t\t\tconst right = group.x + group.width / 2\n\t\t\tconst top = group.y - group.height / 2\n\t\t\tconst bottom = group.y + group.height / 2\n\t\t\t\n\t\t\tminX = Math.min(minX, left)\n\t\t\tmaxX = Math.max(maxX, right)\n\t\t\tminY = Math.min(minY, top)\n\t\t\tmaxY = Math.max(maxY, bottom)\n\t\t})\n\t\t\n\t\t// Process edges (simplified - just endpoints and vertices, skip complex label calculations)\n\t\tthis.edges.forEach(edge => {\n\t\t\t// Edge endpoints\n\t\t\tminX = Math.min(minX, edge.from.x - 10, edge.to.x - 10)\n\t\t\tmaxX = Math.max(maxX, edge.from.x + 10, edge.to.x + 10)\n\t\t\tminY = Math.min(minY, edge.from.y - 10, edge.to.y - 10)\n\t\t\tmaxY = Math.max(maxY, edge.from.y + 10, edge.to.y + 10)\n\t\t\t\n\t\t\t// Edge vertices (if any)\n\t\t\tif (edge.vertices) {\n\t\t\t\tedge.vertices.forEach(vertex => {\n\t\t\t\t\tminX = Math.min(minX, vertex.x - 10)\n\t\t\t\t\tmaxX = Math.max(maxX, vertex.x + 10)\n\t\t\t\t\tminY = Math.min(minY, vertex.y - 10)\n\t\t\t\t\tmaxY = Math.max(maxY, vertex.y + 10)\n\t\t\t\t})\n\t\t\t}\n\t\t\t\n\t\t\t// Simplified label bounds (avoid expensive path calculations)\n\t\t\tif (edge.label && edge.label.trim()) {\n\t\t\t\t// Just use approximate center between from and to nodes\n\t\t\t\tconst centerX = (edge.from.x + edge.to.x) / 2\n\t\t\t\tconst centerY = (edge.from.y + edge.to.y) / 2\n\t\t\t\tconst approxLabelSize = edge.label.length * 10 + 50 // Rough estimate\n\t\t\t\t\n\t\t\t\tminX = Math.min(minX, centerX - approxLabelSize)\n\t\t\t\tmaxX = Math.max(maxX, centerX + approxLabelSize)\n\t\t\t\tminY = Math.min(minY, centerY - 25)\n\t\t\t\tmaxY = Math.max(maxY, centerY + 25)\n\t\t\t}\n\t\t})\n\t\t\n\t\t// Handle empty graph\n\t\tif (minX === Infinity) {\n\t\t\treturn { x: 0, y: 0, width: 100, height: 100 }\n\t\t}\n\t\t\n\t\treturn {\n\t\t\tx: minX,\n\t\t\ty: minY,\n\t\t\twidth: maxX - minX,\n\t\t\theight: maxY - minY\n\t\t}\n\t}\n\n\n\n\t/**\n\t * @param full when true, the edges without vertices are saved too, used for undo buffer\n\t * for saving, full is false\n\t */\n\texportLayout(full = false) {\n\t\tconst ret: Layout = {}\n\t\tthis.nodes().forEach(n => ret[n.id] = {x: n.x, y: n.y})\n\t\tthis.edges.forEach(e => {\n\t\t\tif (!e.vertices) return\n\t\t\t// Save all vertices (both user and auto-generated), preserving their properties\n\t\t\tconst lst = e.vertices.map(v => ({\n\t\t\t\tx: v.x, \n\t\t\t\ty: v.y, \n\t\t\t\tlabel: v.label,\n\t\t\t\tauto: v.auto // Preserve auto flag so we know which are ELK-generated\n\t\t\t}));\n\t\t\tif (lst.length || full) {\n\t\t\t\tret[`e-${e.id}`] = lst\n\t\t\t}\n\t\t\t// Also save the userDeletedVertices flag as metadata\n\t\t\tif (e.userDeletedVertices) {\n\t\t\t\tret[`e-${e.id}-deleted`] = true\n\t\t\t}\n\t\t})\n\t\treturn ret\n\t}\n\n\tsetSaved() {\n\t\tthis._undo.setSaved()\n\t}\n\n\timportLayout(layout: Layout, rerender = false) {\n\t\tthis.clearResolvedLayout()\n\t\tfor (const [k, v] of Object.entries(layout)) {\n\t\t\tconst n = this.nodesMap.get(k)\n\t\t\tif (n) {\n\t\t\t\tconst point = requiredSavedPoint(k, v)\n\t\t\t\tn.x = point.x\n\t\t\t\tn.y = point.y\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (k.endsWith('-deleted')) {\n\t\t\t\tconst edgeId = k.slice(2, -8); // Remove 'e-' prefix and '-deleted' suffix\n\t\t\t\tconst edge = this.edges.find(candidate => candidate.id === edgeId)\n\t\t\t\tif (!edge || v !== true) {\n\t\t\t\t\tthrow new Error(`invalid deleted-edge layout entry ${k}`)\n\t\t\t\t}\n\t\t\t\tedge.userDeletedVertices = true\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (k.startsWith('e-')) {\n\t\t\t\tconst edge = this.edges.find(candidate => candidate.id === k.slice(2))\n\t\t\t\tif (!edge || !Array.isArray(v)) {\n\t\t\t\t\tthrow new Error(`invalid edge layout entry ${k}`)\n\t\t\t\t}\n\t\t\t\tfor (const vertex of edge.vertices ?? []) {\n\t\t\t\t\tthis.edgeVertices.delete(vertex.id)\n\t\t\t\t}\n\t\t\t\tedge.vertices = v.map((saved, index) => {\n\t\t\t\t\tconst point = requiredSavedPoint(`${k}[${index}]`, saved)\n\t\t\t\t\tconst vertex = edge.initVertex(point)\n\t\t\t\t\tvertex.label = saved.label\n\t\t\t\t\tvertex.auto = saved.auto\n\t\t\t\t\treturn vertex\n\t\t\t\t})\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tthrow new Error(`layout contains unknown element ${k}`)\n\t\t}\n\t\tfor (const node of this.nodes()) {\n\t\t\tif (!(node.id in layout)) {\n\t\t\t\tthrow new Error(`layout is missing node ${node.id}`)\n\t\t\t}\n\t\t}\n\t\tif (rerender) {\n\t\t\tthis.nodes().forEach(n => setPosition(n.ref, n.x, n.y))\n\t\t\tthis.edges.forEach(e => this.redrawEdge(e))\n\t\t\tthis.updateEdgesSel()\n\t\t\tthis.redrawGroups(null)\n\t\t}\n\t}\n\n\tasync autoLayout(options?: LayoutOptions) {\n\t\tconst auto = await autoLayout(this, options)\n\t\tthis._undo.beforeChange()\n\n\t\tfor (const placedNode of auto.nodes) {\n\t\t\tconst node = this.nodesMap.get(placedNode.id)\n\t\t\tif (!node) {\n\t\t\t\tthrow new Error(`layout contains unknown node ${placedNode.id}`)\n\t\t\t}\n\t\t\tnode.x = placedNode.x\n\t\t\tnode.y = placedNode.y\n\t\t\tsetPosition(node.ref, node.x, node.y)\n\t\t}\n\n\t\tfor (const placedGroup of auto.groups) {\n\t\t\tconst group = this.groupsMap.get(placedGroup.id)\n\t\t\tif (!group) {\n\t\t\t\tthrow new Error(`layout contains unknown group ${placedGroup.id}`)\n\t\t\t}\n\t\t\tgroup.layoutBounds = placedGroup.bounds\n\t\t\tgroup.layoutTitleBounds = placedGroup.titleBounds\n\t\t\tgroup.x = placedGroup.bounds.x + placedGroup.bounds.width / 2\n\t\t\tgroup.y = placedGroup.bounds.y + placedGroup.bounds.height / 2\n\t\t\tgroup.width = placedGroup.bounds.width\n\t\t\tgroup.height = placedGroup.bounds.height\n\t\t}\n\n\t\tfor (const placedEdge of auto.edges) {\n\t\t\tconst edge = this.edges.find(candidate => candidate.id === placedEdge.id)\n\t\t\tif (!edge) {\n\t\t\t\tthrow new Error(`layout contains unknown edge ${placedEdge.id}`)\n\t\t\t}\n\t\t\tfor (const vertex of edge.vertices ?? []) {\n\t\t\t\tthis.edgeVertices.delete(vertex.id)\n\t\t\t}\n\t\t\tedge.layoutSections = placedEdge.sections\n\t\t\tedge.layoutLabelBounds = placedEdge.labelBounds\n\t\t\tedge.vertices = interiorRoutePoints(placedEdge.sections).map(point => {\n\t\t\t\tconst vertex = edge.initVertex(point)\n\t\t\t\tvertex.auto = true\n\t\t\t\treturn vertex\n\t\t\t})\n\t\t\tedge.userDeletedVertices = false\n\t\t}\n\n\t\tthis.validatedLayout = auto.validated\n\t\tthis.edges.forEach(edge => this.redrawEdge(edge))\n\t\tthis.redrawGroups(null)\n\t\tthis.fitToView()\n\t\tthis._undo.change()\n\t}\n\n\talignSelectionV() {\n\t\tconst lst: Point[] = this.nodes().filter(n => n.selected)\n\t\tlst.push(...Array.from(this.edgeVertices.values()).filter(v => v.selected))\n\t\tlet minY = Math.min(...lst.map(p => p.y))\n\t\tthis.nodesMap.forEach(n => n.selected && this.moveNode(n, n.x, minY, false, false))\n\t\tthis.edgeVertices.forEach(v => v.selected && this.moveEdgeVertex(v, v.x, minY, false, false))\n\t}\n\n\talignSelectionH() {\n\t\tconst lst: Point[] = this.nodes().filter(n => n.selected)\n\t\tlst.push(...Array.from(this.edgeVertices.values()).filter(v => v.selected))\n\t\tlet minX = Math.min(...lst.map(p => p.x))\n\t\tthis.nodesMap.forEach(n => n.selected && this.moveNode(n, minX, n.y, false, false))\n\t\tthis.edgeVertices.forEach(v => v.selected && this.moveEdgeVertex(v, minX, v.y, false, false))\n\t}\n\n\tdistributeSelectionH() {\n\t\tconst selectedNodes = this.nodes().filter(n => n.selected)\n\t\tconst selectedVertices = Array.from(this.edgeVertices.values()).filter(v => v.selected)\n\t\t\n\t\tif (selectedNodes.length + selectedVertices.length < 3) return // Need at least 3 elements to distribute\n\t\t\n\t\tthis._undo.beforeChange()\n\t\t\n\t\t// Combine and sort by X coordinate\n\t\tconst allElements = [...selectedNodes, ...selectedVertices]\n\t\tallElements.sort((a, b) => a.x - b.x)\n\t\t\n\t\tconst minX = allElements[0].x\n\t\tconst maxX = allElements[allElements.length - 1].x\n\t\tconst spacing = (maxX - minX) / (allElements.length - 1)\n\t\t\n\t\t// Distribute elements evenly between leftmost and rightmost\n\t\tallElements.forEach((element, index) => {\n\t\t\tconst newX = minX + (index * spacing)\n\t\t\tif ('title' in element) {\n\t\t\t\t// It's a Node\n\t\t\t\tthis.moveNode(element as Node, newX, element.y, false, true)\n\t\t\t} else {\n\t\t\t\t// It's an EdgeVertex\n\t\t\t\tthis.moveEdgeVertex(element as EdgeVertex, newX, element.y, false, true)\n\t\t\t}\n\t\t})\n\t\t\n\t\tthis._undo.change()\n\t}\n\n\tdistributeSelectionV() {\n\t\tconst selectedNodes = this.nodes().filter(n => n.selected)\n\t\tconst selectedVertices = Array.from(this.edgeVertices.values()).filter(v => v.selected)\n\t\t\n\t\tif (selectedNodes.length + selectedVertices.length < 3) return // Need at least 3 elements to distribute\n\t\t\n\t\tthis._undo.beforeChange()\n\t\t\n\t\t// Combine and sort by Y coordinate\n\t\tconst allElements = [...selectedNodes, ...selectedVertices]\n\t\tallElements.sort((a, b) => a.y - b.y)\n\t\t\n\t\tconst minY = allElements[0].y\n\t\tconst maxY = allElements[allElements.length - 1].y\n\t\tconst spacing = (maxY - minY) / (allElements.length - 1)\n\t\t\n\t\t// Distribute elements evenly between topmost and bottommost\n\t\tallElements.forEach((element, index) => {\n\t\t\tconst newY = minY + (index * spacing)\n\t\t\tif ('title' in element) {\n\t\t\t\t// It's a Node\n\t\t\t\tthis.moveNode(element as Node, element.x, newY, false, true)\n\t\t\t} else {\n\t\t\t\t// It's an EdgeVertex\n\t\t\t\tthis.moveEdgeVertex(element as EdgeVertex, element.x, newY, false, true)\n\t\t\t}\n\t\t})\n\t\t\n\t\tthis._undo.change()\n\t}\n\n\t// Set edge selection state\n\tsetEdgeSelected(edge: Edge, selected: boolean) {\n\t\t// Mark the edge as selected by selecting its connected nodes\n\t\tif (selected) {\n\t\t\tthis.setNodeSelected(edge.from, true)\n\t\t\tthis.setNodeSelected(edge.to, true)\n\t\t}\n\t\t// Update visual selection\n\t\tthis.updateEdgesSel()\n\t}\n\n\t// Fit the entire graph to the current viewport\n\tfitToView() {\n\t\tconst contentBounds = this.calculateContentBounds()\n\t\t\n\t\t// Handle edge case where there's no content\n\t\tif (contentBounds.width === 0 || contentBounds.height === 0) {\n\t\t\treturn\n\t\t}\n\t\t\n\t\t// Get viewport dimensions\n\t\tconst viewportWidth = svg.parentElement?.clientWidth || 800\n\t\tconst viewportHeight = svg.parentElement?.clientHeight || 600\n\t\t\n\t\t// Add padding around content\n\t\tconst padding = 40\n\t\t\n\t\t// Calculate zoom to fit content with padding\n\t\tconst zoomX = (viewportWidth - padding * 2) / contentBounds.width\n\t\tconst zoomY = (viewportHeight - padding * 2) / contentBounds.height\n\t\tconst optimalZoom = Math.min(zoomX, zoomY)\n\t\t\n\t\t// Clamp zoom between reasonable bounds\n\t\tconst finalZoom = Math.max(Math.min(optimalZoom, 2), 0.1)\n\t\t\n\t\t// Calculate content center in drawing coordinates\n\t\tconst contentCenterX = contentBounds.x + contentBounds.width / 2\n\t\tconst contentCenterY = contentBounds.y + contentBounds.height / 2\n\t\t\n\t\t// Calculate viewport center in screen coordinates\n\t\tconst viewportCenterX = viewportWidth / 2\n\t\tconst viewportCenterY = viewportHeight / 2\n\t\t\n\t\t// Calculate translation needed to center content in viewport\n\t\t// With translate(x,y) scale(zoom), translation is in screen coordinates\n\t\tconst translateX = viewportCenterX - (contentCenterX * finalZoom)\n\t\tconst translateY = viewportCenterY - (contentCenterY * finalZoom)\n\t\t\n\t\t// Apply zoom and translation transform\n\t\tconst zoomGroup = svg.querySelector('g.zoom') as SVGGElement\n\t\tif (zoomGroup) {\n\t\t\tzoomGroup.setAttribute('transform', `translate(${translateX}, ${translateY}) scale(${finalZoom})`)\n\t\t}\n\t\t\n\t\t// Update panning\n\t\tupdatePanning()\n\t\t\n\t\t// Save view state so this fit position is preserved after reload\n\t\tsaveViewState(this.id)\n\t}\n\n\t// Save current layout state for restoration\n\tprivate saveLayoutState(): Layout {\n\t\treturn this.exportLayout(true) // Include all vertices for complete state\n\t}\n\n\t// Restore layout state\n\tprivate restoreLayoutState(state: Layout) {\n\t\tthis.importLayout(state, true) // Rerender after restoring\n\t}\n\n\t// Grid functionality\n\tisGridVisible(): boolean {\n\t\treturn this._gridVisible;\n\t}\n\n\tisSnapToGrid(): boolean {\n\t\treturn this._snapToGrid;\n\t}\n\n\tgetGridSize(): number {\n\t\treturn this._gridSize;\n\t}\n\n\ttoggleGrid() {\n\t\tthis._gridVisible = !this._gridVisible;\n\t\tthis.updateGridDisplay();\n\t\t// Force toolbar update by dispatching a custom event\n\t\twindow.dispatchEvent(new CustomEvent('gridStateChanged'));\n\t}\n\n\ttoggleSnapToGrid() {\n\t\tthis._snapToGrid = !this._snapToGrid;\n\t\t// Force toolbar update by dispatching a custom event\n\t\twindow.dispatchEvent(new CustomEvent('gridStateChanged'));\n\t}\n\n\tsnapAllToGrid() {\n\t\tif (!this._snapToGrid) return;\n\t\t\n\t\tthis._undo.beforeChange();\n\t\tthis.nodes().forEach(node => {\n\t\t\tconst snappedX = Math.round(node.x / this._gridSize) * this._gridSize;\n\t\t\tconst snappedY = Math.round(node.y / this._gridSize) * this._gridSize;\n\t\t\tthis.moveNode(node, snappedX, snappedY, false, true);\n\t\t});\n\t\tthis._undo.change();\n\t}\n\n\t// Helper method to snap a point to grid\n\tprivate snapToGrid(x: number, y: number): { x: number, y: number } {\n\t\treturn {\n\t\t\tx: Math.round(x / this._gridSize) * this._gridSize,\n\t\t\ty: Math.round(y / this._gridSize) * this._gridSize\n\t\t};\n\t}\n\n\tupdateGridDisplay() {\n\t\tif (!svg) return;\n\n\t\t// Remove existing grid pattern and background\n\t\tconst existingGrid = svg.querySelector('#grid-pattern');\n\t\tif (existingGrid) {\n\t\t\texistingGrid.remove();\n\t\t}\n\n\t\tconst existingGridRect = svg.querySelector('#grid-background');\n\t\tif (existingGridRect) {\n\t\t\texistingGridRect.remove();\n\t\t}\n\n\t\tif (!this._gridVisible) return;\n\n\t\t// Create grid pattern in defs\n\t\tlet defs = svg.querySelector('defs');\n\t\tif (!defs) {\n\t\t\tdefs = document.createElementNS('http://www.w3.org/2000/svg', 'defs');\n\t\t\tsvg.insertBefore(defs, svg.firstChild);\n\t\t}\n\n\t\tconst pattern = document.createElementNS('http://www.w3.org/2000/svg', 'pattern');\n\t\tpattern.id = 'grid-pattern';\n\t\tpattern.setAttribute('width', this._gridSize.toString());\n\t\tpattern.setAttribute('height', this._gridSize.toString());\n\t\tpattern.setAttribute('patternUnits', 'userSpaceOnUse');\n\n\t\tconst path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n\t\tpath.setAttribute('d', `M ${this._gridSize} 0 L 0 0 0 ${this._gridSize}`);\n\t\tpath.setAttribute('fill', 'none');\n\t\tpath.setAttribute('stroke', '#d0d0d0');\n\t\tpath.setAttribute('stroke-width', '1');\n\t\tpath.setAttribute('opacity', '0.8');\n\n\t\tpattern.appendChild(path);\n\t\tdefs.appendChild(pattern);\n\n\t\t// Create grid background rectangle\n\t\tconst rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');\n\t\trect.id = 'grid-background';\n\t\trect.setAttribute('x', '-10000');\n\t\trect.setAttribute('y', '-10000');\n\t\trect.setAttribute('width', '20000');\n\t\trect.setAttribute('height', '20000');\n\t\trect.setAttribute('fill', 'url(#grid-pattern)');\n\t\trect.setAttribute('pointer-events', 'none');\n\n\t\t// Insert grid as first child of zoom group so it transforms with content\n\t\tconst zoomGroup = svg.querySelector('g.zoom');\n\t\tif (zoomGroup) {\n\t\t\tzoomGroup.insertBefore(rect, zoomGroup.firstChild);\n\t\t}\n\t}\n}\n\n/** interiorRoutePoints returns only the editable points between edge endpoints. */\nfunction interiorRoutePoints(sections: Point[][]): Point[] {\n\tconst route: Point[] = []\n\tfor (const section of sections) {\n\t\tfor (const point of section) {\n\t\t\tconst previous = route[route.length - 1]\n\t\t\tif (!previous || previous.x !== point.x || previous.y !== point.y) {\n\t\t\t\troute.push(point)\n\t\t\t}\n\t\t}\n\t}\n\treturn route.slice(1, -1)\n}\n\n/** requiredSavedPoint checks coordinates when reading saved editor layout data. */\nfunction requiredSavedPoint(\n\tid: string,\n\tvalue: Point | SavedEdgePoint | SavedEdgePoint[] | boolean,\n): SavedEdgePoint {\n\tif (\n\t\ttypeof value !== 'object' ||\n\t\tArray.isArray(value) ||\n\t\t!Number.isFinite(value.x) ||\n\t\t!Number.isFinite(value.y)\n\t) {\n\t\tthrow new Error(`layout entry ${id} must contain valid x and y coordinates`)\n\t}\n\treturn value\n}\n\nfunction escapeCdata(code: string) {\n\treturn code.replace(/]]>/g, ']]]>]> clickListener(e))\n\t// addCursorInteraction(svg) // Call will be updated in buildGraph\n}\nsvg.setAttribute('width', '100%')\nsvg.setAttribute('height', '100%')\n\nlet clickListener: (e: MouseEvent) => void\nlet dragging = false;\nlet selectListener: (n: Node) => void\n\n\nexport const buildGraph = (data: GraphData, onNodeSelect: (n: Node) => void, dragMode: 'pan' | 'select') => {\n\t// empty svg\n\tsvg.innerHTML = defs\n\tdocument.body.append(svg) // make sure svg element is connected, we will measure texts sizes\n\t// @ts-ignore\n\tsvg.__data = data\n\n\tselectListener = onNodeSelect\n\n\t//use event delegation\n\tclickListener = e => {\n\t\tif (dragging) {\n\t\t\treturn;\n\t\t}\n\t\t// const el = (e.target as any).closest('.node > .expand');\n\t}\n\n\t_buildGraph(data)\n\tconst elasticEl = create.rect(300, 300, 50, 50, 0, 'elastic')\n\tsvg.append(elasticEl)\n\n\t// Initialize grid display now that the zoom group exists\n\tdata.updateGridDisplay()\n\n\t// Call addCursorInteraction with dragMode\n\taddCursorInteraction(svg, dragMode)\n\n\treturn {\n\t\tsvg,\n\t\tsetZoom,\n\t}\n}\n\nexport const buildGraphView = (data: GraphData) => {\n\tsvg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n\tsvg.setAttribute('id', 'graph')\n\t_buildGraph(data)\n\treturn svg\n}\n\nconst _buildGraph = (data: GraphData) => {\n\t//toplevel groups\n\tconst zoomG = create.element('g', {}, 'zoom') as SVGGElement\n\tconst nodesG = create.element('g', {}, 'nodes') as SVGGElement\n\tconst edgesG = create.element('g', {}, 'edges') as SVGGElement\n\tconst groupsG = create.element('g', {}, 'groups') as SVGGElement\n\tzoomG.append(groupsG, edgesG, nodesG)\n\n\n\tdata.nodesMap.forEach((n) => {\n\t\tbuildNode(n, data)\n\t\tnodesG.append(n.ref)\n\t})\n\n\tdata.edges.forEach(edge => {\n\t\tedge.labelBounds = undefined\n\t})\n\tdata.edges.forEach(e => {\n\t\tbuildEdge(e)\n\t\tedgesG.append(e.ref)\n\t})\n\n\tdata.groupsMap.forEach((group) => {\n\t\tbuildGroup(group)\n\t\tgroupsG.append(group.ref)\n\t})\n\n\tsvg.append(zoomG)\n}\n\nfunction buildEdge(edge: Edge) {\n\tconst n1 = edge.from;\n\n\tconst g = create.element('g', {}, 'edge') as SVGGElement\n\tg.setAttribute('id', edge.id)\n\tg.setAttribute('data-from', edge.from.id)\n\tg.setAttribute('data-to', edge.to.id)\n\n\tconst position = (edge.style.position || 50) / 100\n\n\tconst vertices = edge.layoutSections\n\t\t? completeRoutePoints(edge.layoutSections)\n\t\t: calculateEdgeVertices(edge)\n\tconst {bg, txt} = edge.layoutLabelBounds\n\t\t? buildPlacedEdgeLabel(edge.layoutLabelBounds, edge)\n\t\t: buildEdgeLabel(calculateLabelPlacement(vertices, position, n1), edge)\n\tg.append(bg, txt)\n\n\tconst path = createEdgePath(vertices)\n\n\tconst p = create.path(path, {'marker-end': 'url(#arrow)'}, 'edge')\n\tp.setAttribute('fill', 'none')\n\tp.setAttribute('stroke', edge.style.color)\n\tp.setAttribute('stroke-width', String(edge.style.thickness))\n\tp.setAttribute('stroke-linecap', 'round')\n\tedge.style.dashed && p.setAttribute('stroke-dasharray', '8')\n\tg.append(p)\n\t\n\t// Debug visualization removed - arrow issue fixed\n\n\t// drag handlers\n\tfor (const p of edge.vertices ?? []) {\n\t\tconst v = p as EdgeVertex\n\t\tv.ref = create.element('circle', {id: v.id, cx: p.x, cy: p.y, r: 7, fill: 'none'}, 'v-dot')\n\t\tv.selected && v.ref.classList.add('selected')\n\t\tv.auto && v.ref.classList.add('auto')\n\t\tg.append(v.ref)\n\t}\n\n\tedge.ref = g\n\treturn g\n}\n\n/** completeRoutePoints joins connected layout sections without duplicate points. */\nfunction completeRoutePoints(sections: Point[][]): Point[] {\n\tconst route: Point[] = []\n\tfor (const section of sections) {\n\t\tfor (const point of section) {\n\t\t\tconst previous = route[route.length - 1]\n\t\t\tif (!previous || previous.x !== point.x || previous.y !== point.y) {\n\t\t\t\troute.push(point)\n\t\t\t}\n\t\t}\n\t}\n\treturn route\n}\n\n/** buildPlacedEdgeLabel draws one label in the box chosen by layout. */\nfunction buildPlacedEdgeLabel(bounds: BBox, edge: Edge) {\n\tconst centerX = bounds.x + bounds.width / 2\n\tconst centerY = bounds.y + bounds.height / 2\n\tconst {txt} = create.textArea(\n\t\tedge.label,\n\t\t200,\n\t\tedge.style.fontSize,\n\t\tfalse,\n\t\tcenterX,\n\t\tbounds.y,\n\t\t'middle',\n\t)\n\tapplyStyle(txt, styles.edgeText)\n\ttxt.setAttribute('stroke', 'none')\n\ttxt.setAttribute('font-size', String(edge.style.fontSize))\n\ttxt.setAttribute('fill', edge.style.color)\n\ttxt.setAttribute('data-field', 'label')\n\tconst bg = create.rect(bounds.width, bounds.height, bounds.x, bounds.y)\n\tapplyStyle(bg, styles.edgeRect)\n\treturn {\n\t\tbg,\n\t\ttxt,\n\t}\n}\n\n/**\n * buildEdgeLabel adapts an older saved label anchor into a complete label box.\n * It uses one fixed side and lets validation reject any resulting collision.\n */\nfunction buildEdgeLabel(placement: EdgeLabelPlacement, edge: Edge) {\n\tconst labelGap = 12;\n\tconst fontSize = edge.style.fontSize\n\tlet {txt, dy, maxW} = create.textArea(edge.label, 200, fontSize, false, placement.x, placement.y, 'middle')\n\tdy -= fontSize / 2\n\tmaxW += fontSize\n\tconst centerX = placement.orientation === 'vertical'\n\t\t? placement.x + maxW / 2 + labelGap\n\t\t: placement.x\n\tconst centerY = placement.orientation === 'vertical'\n\t\t? placement.y\n\t\t: placement.y - dy / 2 - labelGap\n\tconst bounds = {\n\t\tx: centerX - maxW / 2,\n\t\ty: centerY - dy / 2,\n\t\twidth: maxW,\n\t\theight: dy,\n\t}\n\ttxt.querySelectorAll('tspan').forEach((span: SVGTSpanElement) => {\n\t\tspan.setAttribute('x', String(centerX))\n\t})\n\ttxt.setAttribute('y', String(centerY - dy / 2))\n\n\tapplyStyle(txt, styles.edgeText)\n\ttxt.setAttribute('stroke', 'none')\n\ttxt.setAttribute('font-size', String(edge.style.fontSize))\n\ttxt.setAttribute('fill', edge.style.color)\n\n\tconst bg = create.rect(bounds.width, bounds.height, bounds.x, bounds.y)\n\tapplyStyle(bg, styles.edgeRect)\n\ttxt.setAttribute('data-field', 'label')\n\tedge.labelBounds = bounds\n\treturn {bg, txt}\n}\n\n\nfunction buildNode(n: Node, data: GraphData) {\n\t// @ts-ignore\n\twindow.gdata = data\n\n\tconst g = create.element('g', {}, 'node') as SVGGElement\n\tg.setAttribute('id', n.id)\n\tn.selected && g.classList.add('selected')\n\tsetPosition(g, n.x, n.y)\n\tconst link = n.link\n\t\t? create.element('a', {\n\t\t\thref: n.link.href,\n\t\t\t'data-export-href': n.link.exportHref,\n\t\t\t'aria-label': `Open ${n.title}`,\n\t\t}, 'nodeLink') as SVGAElement\n\t\t: null\n\tconst content = link || g\n\tif (link) {\n\t\tg.classList.add('linked')\n\t\tg.append(link)\n\t}\n\n\t// Ensure we use the correct shape from style, defaulting to Box\n\tconst shapeType = n.style.shape || 'Box';\n\tconst shapeFn = shapes[shapeType.toLowerCase()] || shapes.box\n\tconst shape: SVGElement = shapeFn(content, n);\n\n\tshape.classList.add('nodeBorder')\n\n\t// Apply generic styles first\n\tapplyStyle(shape, styles.nodeBorder)\n\t// Then apply tag-specific styles to override generic ones\n\tshape.setAttribute('fill', n.style.background)\n\tshape.setAttribute('stroke', n.style.stroke)\n\t// Consistent border width for all elements\n\tshape.setAttribute('stroke-width', '3')\n\tshape.setAttribute('opacity', String(n.style.opacity))\n\tsetBorderStyle(shape, n.style.border)\n\n\tconst tg = buildNodeContent(n.contentLayout, n.style.color)\n\tconst labelOffsetY = Number(content.getAttribute('label-offset-y')) || 0\n\tsetPosition(tg, 0, labelOffsetY / 2)\n\tcontent.append(tg)\n\n\t// @ts-ignore\n\tg.__data = n;\n\tn.ref = g;\n\n\treturn g\n}\n\n\nfunction buildGroup(group: Group) {\n\tif (group.nodes.length == 0) {\n\t\treturn\n\t}\n\tconst g = create.element('g', {}, 'group') as SVGGElement\n\tif (group.layoutBounds && group.layoutTitleBounds) {\n\t\tconst bounds = group.layoutBounds\n\t\tconst title = group.layoutTitleBounds\n\t\tconst rect = create.rect(bounds.width, bounds.height, bounds.x, bounds.y)\n\t\tapplyStyle(rect, styles.groupRect)\n\t\tgroup.style.stroke && rect.setAttribute('stroke', group.style.stroke)\n\t\tgroup.style.background && rect.setAttribute('fill', group.style.background)\n\t\tconst text = create.text(group.name, {\n\t\t\tx: title.x,\n\t\t\ty: title.y,\n\t\t\t'dominant-baseline': 'hanging',\n\t\t})\n\t\tapplyStyle(text, styles.groupText)\n\t\tgroup.style.color && text.setAttribute('fill', group.style.color)\n\t\tg.append(rect, text)\n\t\tgroup.ref = g\n\t\treturn\n\t}\n\n\tlet p0: Point = {x: 1e100, y: 1e100}, p1: Point = {x: 0, y: 0}\n\tgroup.nodes.forEach(n => {\n\t\t// Calculate visual bounds accounting for shapes that extend beyond center\n\t\tconst shape = (n as Node).style?.shape?.toLowerCase() || 'box'\n\t\t\n\t\tlet topExtension = n.height / 2\n\t\tlet bottomExtension = n.height / 2\n\t\t\n\t\tif (shape === 'robot') {\n\t\t\t// Robot shape extends above with antenna\n\t\t\t// Account for antenna height (h * 0.08) plus some margin\n\t\t\tconst antennaH = n.height * 0.12\n\t\t\ttopExtension = n.height / 2 + antennaH\n\t\t\tbottomExtension = n.height / 2\n\t\t} else if (shape === 'hexagon') {\n\t\t\t// Hexagon extends to ±0.866 * (width/2) vertically\n\t\t\t// For width=280, that's ±121.24px from center\n\t\t\tconst hexHeight = n.width / 2 * 0.866\n\t\t\ttopExtension = hexHeight\n\t\t\tbottomExtension = hexHeight\n\t\t}\n\t\t\n\t\tconst b = {\n\t\t\tx: n.x - n.width / 2,\n\t\t\ty: n.y - topExtension,\n\t\t\twidth: n.width,\n\t\t\theight: topExtension + bottomExtension\n\t\t}\n\t\tp0.x = Math.min(p0.x, b.x)\n\t\tp0.y = Math.min(p0.y, b.y)\n\t\tp1.x = Math.max(p1.x, b.x + b.width)\n\t\tp1.y = Math.max(p1.y, b.y + b.height)\n\t})\n\tconst pad = 25 // Padding around content\n\tconst labelHeight = 30 // Space for the group label at bottom\n\tconst w = Math.max(p1.x - p0.x, 200)\n\tconst h = p1.y - p0.y\n\tconst bb = {\n\t\tx: p0.x - pad,\n\t\ty: p0.y - pad,\n\t\twidth: w + pad * 2,\n\t\theight: h + pad * 2 + labelHeight,\n\t}\n\tconst r = create.rect(bb.width, bb.height, bb.x, bb.y)\n\tgroup.x = bb.x + bb.width / 2\n\tgroup.y = bb.y + bb.height / 2\n\tgroup.width = bb.width\n\tgroup.height = bb.height\n\tapplyStyle(r, styles.groupRect)\n\tgroup.style.stroke && r.setAttribute('stroke', group.style.stroke)\n\tgroup.style.background && r.setAttribute('fill', group.style.background)\n\n\tconst txt = create.text(group.name, {x: p0.x, y: bb.y + bb.height - styles.groupText[\"font-size\"]})\n\tapplyStyle(txt, styles.groupText)\n\tgroup.style.color && txt.setAttribute('fill', group.style.color)\n\n\tg.append(r, txt)\n\tgroup.ref = g\n}\n\nfunction findClosestSegment(graph: GraphData, p: Point) {\n\t// find the closest point on a segment\n\tlet fnd = {dst: Number.POSITIVE_INFINITY, pos: -1, edge: null as Edge, prj: null as Point}\n\tgraph.edges.forEach(edge => {\n\t\tconst vertices = edge.vertices || []\n\t\tconst pts = [edge.from, ...vertices, edge.to]\n\t\tfor (let i = 1; i < pts.length; i++) {\n\t\t\tconst prj = project(p, pts[i - 1], pts[i])\n\t\t\tconst dst = cabDistance(p, prj)\n\t\t\tif (dst > 50) continue\n\t\t\tif (dst < fnd.dst) {\n\t\t\t\tfnd = {dst, pos: i, prj, edge}\n\t\t\t}\n\t\t}\n\t})\n\treturn fnd.edge ? fnd : null\n}\n\nfunction mouseToDrawing(e: MouseEvent): Point {\n\t// transform event coords to drawing coords\n\tconst b = svg.getBoundingClientRect()\n\tconst z = getZoom()\n\t\n\t// Get current pan transform\n\tconst currentTransform = getCurrentTransform()\n\t\n\t// Convert screen coordinates to drawing coordinates accounting for zoom and pan\n\t// The transform values are in screen coordinates, so we need to divide by zoom and subtract\n\treturn {\n\t\tx: (e.clientX - b.x - currentTransform.x) / z,\n\t\ty: (e.clientY - b.y - currentTransform.y) / z\n\t}\n}\n\ninterface Handle extends Point {\n\tid: string\n\tselected?: boolean\n\tref?: SVGElement\n}\n\n// Custom cursor interaction that prioritizes panning over selection\nfunction addCustomCursorInteraction(svg: SVGSVGElement, conn: {\n\tnodeFromEvent(e: MouseEvent): Handle | null;\n\tsetSelection(handles: Handle[]): void;\n\tsetDragging(dragging: boolean): void;\n\tisSelected(handle: Handle): boolean;\n\tgetSelection(): Handle[];\n\tgetZoom(): number;\n\tmoveNode(h: Handle, x: number, y: number): void;\n\tboxSelection(box: DOMRect, add: boolean): void;\n\tupdatePanning(): void;\n}, dragMode: 'pan' | 'select') {\n\tlet ini: { x: number; y: number; n: Handle }[] = []\n\tlet elastic: any = null\n\tlet isPanning = false\n\tlet panStartX = 0\n\tlet panStartY = 0\n\tlet initialTransform = { x: 0, y: 0 }\n\tlet pendingSelectionChange: { node: Handle; shiftKey: boolean } | null = null\n\tlet pendingNavigation: string | null = null\n\tlet hasDragged = false\n\tlet suppressLinkClick = false\n\t\n\t// Store event listeners for cleanup\n\tconst eventListeners: Array<{ element: Element | Window, event: string, handler: EventListener }> = []\n\n\t// Simple elastic selection box implementation - use mouseToDrawing for proper coordinate conversion\n\tfunction createElastic() {\n\t\tlet startDrawingX = 0, startDrawingY = 0, rect: SVGRectElement | null = null\n\t\t\n\t\treturn {\n\t\t\tini(e: MouseEvent) {\n\t\t\t\t// Use mouseToDrawing to get proper drawing coordinates (accounts for zoom and pan)\n\t\t\t\tconst pt = mouseToDrawing(e)\n\t\t\t\tstartDrawingX = pt.x\n\t\t\t\tstartDrawingY = pt.y\n\t\t\t\t\n\t\t\t\trect = document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\")\n\t\t\t\trect.setAttribute('fill', 'rgba(0, 100, 255, 0.1)')\n\t\t\t\trect.setAttribute('stroke', 'rgba(0, 100, 255, 0.5)')\n\t\t\t\trect.setAttribute('stroke-width', '1')\n\t\t\t\trect.setAttribute('stroke-dasharray', '3,3')\n\t\t\t\trect.setAttribute('x', String(startDrawingX))\n\t\t\t\trect.setAttribute('y', String(startDrawingY))\n\t\t\t\trect.setAttribute('width', '0')\n\t\t\t\trect.setAttribute('height', '0')\n\t\t\t\t\n\t\t\t\t// Add to the zoom group so it transforms with the content\n\t\t\t\tconst zoomGroup = svg.querySelector('g.zoom')\n\t\t\t\tif (zoomGroup) {\n\t\t\t\t\tzoomGroup.appendChild(rect)\n\t\t\t\t} else {\n\t\t\t\t\tsvg.appendChild(rect)\n\t\t\t\t}\n\t\t\t},\n\t\t\tupdate(e: MouseEvent) {\n\t\t\t\tif (!rect) return\n\t\t\t\t\n\t\t\t\t// Convert current mouse position to drawing coordinates (accounts for zoom and pan)\n\t\t\t\tconst currentPt = mouseToDrawing(e)\n\t\t\t\tconst currentDrawingX = currentPt.x\n\t\t\t\tconst currentDrawingY = currentPt.y\n\t\t\t\t\n\t\t\t\t// Calculate rectangle bounds in drawing coordinates\n\t\t\t\tconst x = Math.min(startDrawingX, currentDrawingX)\n\t\t\t\tconst y = Math.min(startDrawingY, currentDrawingY)\n\t\t\t\tconst width = Math.abs(currentDrawingX - startDrawingX)\n\t\t\t\tconst height = Math.abs(currentDrawingY - startDrawingY)\n\t\t\t\t\n\t\t\t\trect.setAttribute('x', String(x))\n\t\t\t\trect.setAttribute('y', String(y))\n\t\t\t\trect.setAttribute('width', String(width))\n\t\t\t\trect.setAttribute('height', String(height))\n\t\t\t},\n\t\t\tend(): DOMRect | null {\n\t\t\t\tif (!rect) return null\n\t\t\t\t\n\t\t\t\t// Get final rectangle bounds in drawing coordinates\n\t\t\t\tconst x = parseFloat(rect.getAttribute('x') || '0')\n\t\t\t\tconst y = parseFloat(rect.getAttribute('y') || '0')\n\t\t\t\tconst width = parseFloat(rect.getAttribute('width') || '0')\n\t\t\t\tconst height = parseFloat(rect.getAttribute('height') || '0')\n\t\t\t\t\n\t\t\t\trect.remove()\n\t\t\t\trect = null\n\t\t\t\t\n\t\t\t\t// Return drawing coordinates directly for boxSelection since we're now working in the same coordinate system\n\t\t\t\tif (width > 5 && height > 5) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tx: x, y: y, width: width, height: height,\n\t\t\t\t\t\tleft: x, top: y, right: x + width, bottom: y + height\n\t\t\t\t\t} as DOMRect\n\t\t\t\t}\n\t\t\t\treturn null\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction getCurrentTransformLocal() {\n\t\tconst zoomGroup = svg.querySelector('g.zoom') as SVGGElement\n\t\tif (!zoomGroup) return { x: 0, y: 0 }\n\t\t\n\t\tconst transform = zoomGroup.getAttribute('transform') || ''\n\t\tconst translateMatch = transform.match(/translate\\(([^,]+),([^)]+)\\)/)\n\t\tif (translateMatch) {\n\t\t\treturn {\n\t\t\t\tx: parseFloat(translateMatch[1]) || 0,\n\t\t\t\ty: parseFloat(translateMatch[2]) || 0\n\t\t\t}\n\t\t}\n\t\treturn { x: 0, y: 0 }\n\t}\n\n\tfunction setTransform(x: number, y: number) {\n\t\tconst zoomGroup = svg.querySelector('g.zoom') as SVGGElement\n\t\tif (!zoomGroup) return\n\t\t\n\t\tconst zoom = getZoom()\n\t\tzoomGroup.setAttribute('transform', `translate(${x}, ${y}) scale(${zoom})`)\n\t}\n\n\tfunction onMouseDown(e: MouseEvent) {\n\t\te.preventDefault();\n\t\thasDragged = false\n\t\tpendingSelectionChange = null\n\t\tconst target = e.target\n\t\tconst link = target instanceof Element ? target.closest('a.nodeLink') : null\n\t\tpendingNavigation = e.shiftKey ? null : link?.getAttribute('href') || null\n\n\t\tconst node = conn.nodeFromEvent(e)\n\t\t\n\t\t// Determine effective mode: invert if shift is held\n\t\tconst effectiveMode = e.shiftKey ? (dragMode === 'pan' ? 'select' : 'pan') : dragMode\n\t\t\n\t\tif (!node) { // Clicked on empty space\n\t\t\tif (effectiveMode === 'pan') {\n\t\t\t\t// Pan mode: pan and deselect\n\t\t\t\tisPanning = true;\n\t\t\t\telastic = null;\n\t\t\t\tpanStartX = e.clientX;\n\t\t\t\tpanStartY = e.clientY;\n\t\t\t\tinitialTransform = getCurrentTransformLocal();\n\t\t\t\tini = [];\n\t\t\t\t// Deselect all elements when clicking empty space in pan mode\n\t\t\t\tconn.setSelection([]);\n\t\t\t} else {\n\t\t\t\t// Select mode: ONLY select, no panning\n\t\t\t\tisPanning = false;\n\t\t\t\telastic = createElastic();\n\t\t\t\tif (elastic) elastic.ini(e);\n\t\t\t\tini = [];\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Clicked on a node/vertex - behavior depends on effective mode\n\t\tif (effectiveMode === 'pan') {\n\t\t\t// Pan mode: select the element, don't pan\n\t\t\tisPanning = false;\n\t\t\telastic = null;\n\t\t\t\n\t\t\tconst nodes = conn.getSelection()\n\t\t\tif (conn.isSelected(node)) {\n\t\t\t\t// Clicking on a selected node - prepare to drag all selected elements\n\t\t\t\tini = nodes.map(n => ({ x: n.x, y: n.y, n }))\n\t\t\t\t// No selection change needed since we're clicking on already selected element\n\t\t\t} else {\n\t\t\t\t// Clicking on an unselected node - select only this element\n\t\t\t\tconn.setSelection([node]);\n\t\t\t\tini = [{ x: node.x, y: node.y, n: node }];\n\t\t\t}\n\t\t} else {\n\t\t\t// Select mode: selection/drag logic\n\t\t\tisPanning = false; // Ensure no panning if a node is clicked\n\t\t\telastic = null; // Ensure no selection box if a node is clicked\n\t\t\tconst nodes = conn.getSelection()\n\t\t\t\n\t\t\tif (e.shiftKey && dragMode === 'select') {\n\t\t\t\t// Shift+click in select mode: immediately change selection (no dragging expected)\n\t\t\t\tif (conn.isSelected(node)) {\n\t\t\t\t\tconst index = nodes.findIndex(n => n.id === node.id)\n\t\t\t\t\tif (index >= 0) nodes.splice(index, 1)\n\t\t\t\t} else {\n\t\t\t\t\tnodes.push(node)\n\t\t\t\t}\n\t\t\t\tconn.setSelection(nodes)\n\t\t\t\tini = nodes.map(n => ({ x: n.x, y: n.y, n }))\n\t\t\t} else {\n\t\t\t\t// Regular click: defer selection change until we know if it's a drag or click\n\t\t\t\tif (conn.isSelected(node)) {\n\t\t\t\t\t// Clicking on a selected node - prepare to drag all selected elements\n\t\t\t\t\tini = nodes.map(n => ({ x: n.x, y: n.y, n }))\n\t\t\t\t\t// No pending selection change needed since we're clicking on already selected element\n\t\t\t\t\tpendingSelectionChange = null\n\t\t\t\t} else {\n\t\t\t\t\t// Clicking on an unselected node - defer selection change until we determine if it's a click or drag\n\t\t\t\t\tpendingSelectionChange = { node, shiftKey: e.shiftKey }\n\t\t\t\t\t// For now, prepare to drag just the clicked node (we'll update selection when drag starts)\n\t\t\t\t\tini = [{ x: node.x, y: node.y, n: node }]\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction onMouseMove(e: MouseEvent, dx: number, dy: number) {\n\t\t// Check if we've moved enough to consider this a drag\n\t\tconst dragThreshold = 3 // pixels\n\t\tif (!hasDragged && (Math.abs(dx) > dragThreshold || Math.abs(dy) > dragThreshold)) {\n\t\t\thasDragged = true\n\t\t\tpendingNavigation = null\n\t\t\t\n\t\t\t// If we have a pending selection change and we're now dragging, apply it\n\t\t\tif (pendingSelectionChange) {\n\t\t\t\tconst nodes = conn.getSelection()\n\t\t\t\tnodes.length = 0\n\t\t\t\tnodes.push(pendingSelectionChange.node)\n\t\t\t\tconn.setSelection(nodes)\n\t\t\t\t// Update ini to drag only the newly selected node\n\t\t\t\tini = [{ x: pendingSelectionChange.node.x, y: pendingSelectionChange.node.y, n: pendingSelectionChange.node }]\n\t\t\t\tpendingSelectionChange = null\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (isPanning) {\n\t\t\t// Pan the view - apply mouse delta directly (no zoom division needed)\n\t\t\t// setTransform expects screen coordinates, dx/dy are already screen pixel deltas\n\t\t\tconst newX = initialTransform.x + dx\n\t\t\tconst newY = initialTransform.y + dy\n\t\t\tsetTransform(newX, newY)\n\t\t} else if (ini.length > 0 && hasDragged) {\n\t\t\t// Move selected nodes/vertices (only if we've actually started dragging)\n\t\t\t// dx, dy are screen pixel deltas, convert to drawing coordinate deltas\n\t\t\tconst zoom = conn.getZoom()\n\t\t\tconst drawingDx = dx / zoom\n\t\t\tconst drawingDy = dy / zoom\n\t\t\tini.forEach(item => {\n\t\t\t\t// item.x, item.y are initial drawing coordinates\n\t\t\t\t// Add the drawing coordinate delta to get new position\n\t\t\t\tconn.moveNode(item.n, item.x + drawingDx, item.y + drawingDy)\n\t\t\t})\n\t\t\tconn.setDragging(true)\n\t\t} else if (elastic) {\n\t\t\t// Update selection box\n\t\t\telastic.update(e)\n\t\t\tconn.setDragging(true)\n\t\t}\n\t}\n\n\tfunction onMouseUp(e: MouseEvent) {\n\t\tconn.setDragging(false)\n\t\tconst navigation = hasDragged ? null : pendingNavigation\n\t\tif (hasDragged) {\n\t\t\tsuppressLinkClick = true\n\t\t\twindow.setTimeout(() => {\n\t\t\t\tsuppressLinkClick = false\n\t\t\t}, 0)\n\t\t}\n\t\t\n\t\t// If we have a pending selection change and didn't drag, apply it now (it was just a click)\n\t\tif (pendingSelectionChange && !hasDragged) {\n\t\t\tconst nodes = conn.getSelection()\n\t\t\tnodes.length = 0\n\t\t\tnodes.push(pendingSelectionChange.node)\n\t\t\tconn.setSelection(nodes)\n\t\t}\n\t\t\n\t\tif (elastic) {\n\t\t\tconst box = elastic.end()\n\t\t\tif (box) {\n\t\t\t\tconn.boxSelection(box, e.shiftKey)\n\t\t\t} else if (!ini.length) {\n\t\t\t\t// Deselect if no box was drawn\n\t\t\t\tconn.setSelection([])\n\t\t\t}\n\t\t\telastic = null\n\t\t}\n\t\t\n\t\t// Save view state if user was panning (user-initiated view change)\n\t\tif (isPanning && hasDragged) {\n\t\t\tconst graphData = (svg as any).__data as GraphData\n\t\t\tif (graphData && graphData.id) {\n\t\t\t\tsaveViewState(graphData.id)\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Reset state\n\t\tpendingSelectionChange = null\n\t\tpendingNavigation = null\n\t\thasDragged = false\n\t\tisPanning = false\n\t\tconn.updatePanning()\n\t\tif (navigation) {\n\t\t\twindow.location.href = navigation\n\t\t}\n\t}\n\n\tfunction onClick(e: MouseEvent) {\n\t\tconst target = e.target\n\t\tif (!(target instanceof Element) || !target.closest('a.nodeLink')) return\n\t\te.preventDefault()\n\t\tif (!suppressLinkClick) return\n\t\te.stopPropagation()\n\t\tsuppressLinkClick = false\n\t}\n\n\t// Add drag and drop functionality\n\tfunction addDnd(element: SVGSVGElement) {\n\t\tlet md: { ex: number; ey: number } | null = null\n\n\t\tfunction convertEvent(e: MouseEvent | TouchEvent): MouseEvent {\n\t\t\tif ('changedTouches' in e && e.changedTouches) {\n\t\t\t\treturn e.changedTouches[0] as any\n\t\t\t}\n\t\t\treturn e as MouseEvent\n\t\t}\n\n\t\tfunction onMouseMoveHandler(e: MouseEvent | TouchEvent) {\n\t\t\tif (!md) return\n\t\t\te = convertEvent(e)\n\t\t\tonMouseMove(e, e.clientX - md.ex, e.clientY - md.ey)\n\t\t}\n\n\t\tfunction removeListeners() {\n\t\t\tdocument.removeEventListener('touchmove', onMouseMoveHandler as any)\n\t\t\tdocument.removeEventListener('mousemove', onMouseMoveHandler as any)\n\t\t\tdocument.removeEventListener('mouseup', onMouseUpHandler)\n\t\t\tdocument.removeEventListener('touchend', onMouseUpHandler)\n\t\t}\n\n\t\tfunction onMouseUpHandler(e: MouseEvent | TouchEvent) {\n\t\t\tremoveListeners()\n\t\t\tonMouseUp(convertEvent(e))\n\t\t\tmd = null\n\t\t}\n\n\t\tfunction onMouseDownHandler(e: MouseEvent | TouchEvent) {\n\t\t\te = convertEvent(e)\n\t\t\tmd = { ex: e.clientX, ey: e.clientY }\n\t\t\tonMouseDown(e)\n\t\t\tdocument.addEventListener('touchmove', onMouseMoveHandler as any)\n\t\t\tdocument.addEventListener('mousemove', onMouseMoveHandler as any)\n\t\t\tdocument.addEventListener('mouseup', onMouseUpHandler)\n\t\t\tdocument.addEventListener('touchend', onMouseUpHandler)\n\t\t}\n\n\t\telement.addEventListener('mousedown', onMouseDownHandler as any)\n\t\telement.addEventListener('touchstart', onMouseDownHandler as any)\n\t\t\n\t\t// Track these listeners for cleanup\n\t\teventListeners.push(\n\t\t\t{ element, event: 'mousedown', handler: onMouseDownHandler as any },\n\t\t\t{ element, event: 'touchstart', handler: onMouseDownHandler as any }\n\t\t)\n\t}\n\n\taddDnd(svg)\n\tsvg.addEventListener('click', onClick)\n\teventListeners.push({ element: svg, event: 'click', handler: onClick })\n\t\n\t// Return cleanup function\n\treturn () => {\n\t\teventListeners.forEach(({ element, event, handler }) => {\n\t\t\telement.removeEventListener(event, handler)\n\t\t})\n\t}\n}\n\nexport function addCursorInteraction(svg: SVGSVGElement, dragMode: 'pan' | 'select') {\n\t// Clean up any existing event listeners to prevent conflicts\n\tconst existingCleanup = (svg as any).__cursorInteractionCleanup\n\tif (existingCleanup) {\n\t\texistingCleanup()\n\t}\n\n\tfunction getData(el: SVGElement) {\n\t\t// @ts-ignore\n\t\treturn el.__data\n\t}\n\n\tconst gd = () => (getData(svg) as GraphData)\n\t\n\t// Store event listeners for cleanup\n\tconst eventListeners: Array<{ element: Element | Window, event: string, handler: EventListener }> = []\n\n\tconst beforeUnloadHandler = (e: BeforeUnloadEvent) => {\n\t\tif (!gd().changed()) return\n\t\te.preventDefault()\n\t\te.returnValue = ''\n\t}\n\twindow.addEventListener(\"beforeunload\", beforeUnloadHandler)\n\teventListeners.push({ element: window, event: 'beforeunload', handler: beforeUnloadHandler })\n\n\tfunction setDotSelected(d: Handle, selected: boolean) {\n\t\td.selected = selected\n\t\tconst dotEl = svg.querySelector('#' + d.id)\n\t\td.selected ? dotEl.classList.add('selected') : dotEl.classList.remove('selected')\n\t}\n\n\t// show moving dot along edge when ALT is pressed\n\tconst mouseMoveHandler = (e: MouseEvent) => {\n\t\tif (!e.altKey) return\n\t\tconst fnd = findClosestSegment(gd(), mouseToDrawing(e))\n\t\tif (fnd) {\n\t\t\tconst {prj} = fnd\n\t\t\tconst parent = svg.querySelector('g.edges')\n\t\t\tlet dot = parent.querySelector('#prj')\n\t\t\tif (!dot) {\n\t\t\t\tdot = create.element('circle', {id: 'prj', cx: prj.x, cy: prj.y, r: 7})\n\t\t\t\tparent.append(dot)\n\t\t\t}\n\t\t\tdot.setAttribute('cx', String(prj.x))\n\t\t\tdot.setAttribute('cy', String(prj.y))\n\t\t} else {\n\t\t\tremovePrjDot()\n\t\t}\n\t}\n\tsvg.addEventListener('mousemove', mouseMoveHandler)\n\teventListeners.push({ element: svg, event: 'mousemove', handler: mouseMoveHandler })\n\n\tconst keyUpHandler = (e: KeyboardEvent) => {\n\t\tconst key = findShortcut(e, true)\n\t\tif (key == ADD_VERTEX || key == ADD_LABEL_VERTEX) return\n\t\tremovePrjDot()\n\t}\n\twindow.addEventListener('keyup', keyUpHandler)\n\teventListeners.push({ element: window, event: 'keyup', handler: keyUpHandler })\n\n\tfunction removePrjDot() {\n\t\tconst el = svg.querySelector('g.edges #prj')\n\t\tel && el.parentElement.removeChild(el)\n\t}\n\n\tconst clickHandler = (e: MouseEvent) => {\n\t\tconst key = findShortcut(e, true)\n\t\tif (key != ADD_LABEL_VERTEX && key != ADD_VERTEX) return\n\t\tconst fnd = findClosestSegment(gd(), mouseToDrawing(e))\n\t\tif (fnd) {\n\t\t\tconst {edge, pos, prj} = fnd\n\t\t\t// depending on keyboard modifier, make it label position\n\t\t\tgd().insertEdgeVertex(edge, prj, pos, key == ADD_LABEL_VERTEX)\n\t\t\tremovePrjDot()\n\t\t}\n\t}\n\tsvg.addEventListener('click', clickHandler)\n\teventListeners.push({ element: svg, event: 'click', handler: clickHandler })\n\n\tconst wheelHandler = (e: WheelEvent) => {\n\t\t// Handle wheel zoom directly without relying on shortcuts\n\t\t// deltaY > 0 means scrolling down (zoom out), deltaY < 0 means scrolling up (zoom in)\n\t\tconst delta = Math.sign(e.deltaY) * 0.1 // Normalize to 0.1 zoom steps\n\t\tconst currentZoom = getZoom()\n\t\tconst newZoom = Math.max(0.1, Math.min(5, currentZoom - delta)) // Clamp zoom between 0.1 and 5\n\t\t\n\t\tif (newZoom !== currentZoom) {\n\t\t\t// Convert absolute screen coordinates to SVG-relative coordinates\n\t\t\tconst rect = svg.getBoundingClientRect()\n\t\t\tconst svgX = e.clientX - rect.left\n\t\t\tconst svgY = e.clientY - rect.top\n\t\t\tsetZoomCentered(newZoom, svgX, svgY)\n\t\t\te.preventDefault()\n\t\t\t\n\t\t\t// Save view state after user wheel zoom\n\t\t\tconst graphData = (svg as any).__data as GraphData\n\t\t\tif (graphData && graphData.id) {\n\t\t\t\tsaveViewState(graphData.id)\n\t\t\t}\n\t\t}\n\t}\n\tsvg.addEventListener('wheel', wheelHandler)\n\teventListeners.push({ element: svg, event: 'wheel', handler: wheelHandler })\n\n\tconst keyDownHandler = (e: KeyboardEvent) => {\n\t\tconst shortcut = findShortcut(e)\n\t\t\n\t\t\n\t\tif (shortcut) {\n\t\t\te.preventDefault() // Prevent browser default for all recognized shortcuts\n\t\t}\n\t\t\n\t\tswitch (shortcut) {\n\t\t\tcase DEL_VERTEX:\n\t\t\t\tconst selectedVertices = Array.from(gd().edgeVertices.values()).filter(v => v.selected);\n\t\t\t\tselectedVertices.forEach(v => {\n\t\t\t\t\tgd().deleteEdgeVertex(v)\n\t\t\t\t})\n\t\t\t\tbreak\n\t\t\tcase UNDO:\n\t\t\t\tgd().undo()\n\t\t\t\tbreak\n\t\t\tcase REDO:\n\t\t\t\tgd().redo()\n\t\t\t\tbreak\n\t\t\tcase ZOOM_IN:\n\t\t\t\tconst newZoomIn = Math.min(5, getZoom() * 1.2)\n\t\t\t\t// Center zoom on viewport center like mouse wheel\n\t\t\t\tsetZoomCentered(newZoomIn)\n\t\t\t\tsaveViewState(gd().id) // Save after user keyboard zoom\n\t\t\t\tbreak\n\t\t\tcase ZOOM_OUT:\n\t\t\t\tconst newZoomOut = Math.max(0.1, getZoom() / 1.2)\n\t\t\t\t// Center zoom on viewport center like mouse wheel\n\t\t\t\tsetZoomCentered(newZoomOut)\n\t\t\t\tsaveViewState(gd().id) // Save after user keyboard zoom\n\t\t\t\tbreak\n\t\t\tcase ZOOM_100:\n\t\t\t\t// Center zoom on viewport center like mouse wheel\n\t\t\t\tsetZoomCentered(1)\n\t\t\t\tsaveViewState(gd().id) // Save after user keyboard zoom\n\t\t\t\tbreak\n\t\t\tcase ZOOM_FIT:\n\t\t\t\tgd().fitToView()\n\t\t\t\t// Don't save view state here - fitToView should not be persisted\n\t\t\t\tbreak\n\t\t\tcase SELECT_ALL:\n\t\t\t\tgd().nodes().forEach(n => gd().setNodeSelected(n, true))\n\t\t\t\tgd().edgeVertices.forEach(v => setDotSelected(v, true))\n\t\t\t\tbreak\n\t\t\tcase DESELECT:\n\t\t\t\tgd().nodes().forEach(n => gd().setNodeSelected(n, false))\n\t\t\t\tgd().edgeVertices.forEach(v => setDotSelected(v, false))\n\t\t\t\tbreak\n\t\t}\n\t}\n\twindow.addEventListener('keydown', keyDownHandler)\n\teventListeners.push({ element: window, event: 'keydown', handler: keyDownHandler })\n\n\t// Custom cursor interaction with pan-first behavior\n\tconst customInteractionCleanup = addCustomCursorInteraction(svg, {\n\t\tnodeFromEvent(e: MouseEvent): Handle {\n\t\t\te.preventDefault()\n\t\t\t// node clicked\n\t\t\tlet el = (e.target as SVGElement).closest('g.nodes g.node') as SVGElement\n\t\t\tif (el) return getData(el)\n\t\t\t// vertex dot clicked\n\t\t\tel = (e.target as SVGElement).closest('g.edges g.edge .v-dot') as SVGElement\n\t\t\tif (el) {\n\t\t\t\treturn gd().edgeVertices.get(el.id)\n\t\t\t}\n\t\t\treturn null\n\t\t},\n\t\tsetSelection(handles: Handle[]) {\n\t\t\t// nodes\n\t\t\tgd().nodes().forEach(n => gd().setNodeSelected(n, handles.some(h => h.id == n.id)))\n\t\t\t// dots\n\t\t\tgd().edgeVertices.forEach(d => setDotSelected(d, handles.some(h => h.id == d.id)))\n\t\t\tselectListener(gd().nodes().find(n => n.selected))\n\t\t},\n\t\tsetDragging(d: boolean) {\n\t\t\tdragging = d\n\t\t},\n\t\tisSelected(handle: Handle): boolean {\n\t\t\treturn handle.selected\n\t\t},\n\t\tgetSelection(): Handle[] {\n\t\t\tconst ret: Handle[] = gd().nodes().filter(n => n.selected)\n\t\t\tgd().edgeVertices.forEach(d => d.selected && ret.push(d))\n\t\t\treturn ret\n\t\t},\n\t\tgetZoom: getZoom,\n\t\tmoveNode(h: Handle, x: number, y: number) {\n\t\t\tif (gd().nodesMap.has(h.id))\n\t\t\t\tgd().moveNode(h as Node, x, y)\n\t\t\telse {\n\t\t\t\t(h as EdgeVertex).auto = false\n\t\t\t\tgd().moveEdgeVertex(h as EdgeVertex, x, y)\n\t\t\t}\n\t\t},\n\t\tboxSelection(box: DOMRect, add) {\n\t\t\t// Box is now already in drawing coordinates, no need to scale\n\t\t\t// nodes\n\t\t\tgd().nodesMap.forEach(n => {\n\t\t\t\tconst inBox = boxesOverlap(uncenterBox(n), box)\n\t\t\t\tif (inBox) {\n\t\t\t\t\t// Toggle selection for elements in the box\n\t\t\t\t\tgd().setNodeSelected(n, !n.selected)\n\t\t\t\t} else if (!add) {\n\t\t\t\t\t// If not holding shift and element is outside box, deselect it\n\t\t\t\t\tgd().setNodeSelected(n, false)\n\t\t\t\t}\n\t\t\t})\n\t\t\t// dots\n\t\t\tgd().edgeVertices.forEach(d => {\n\t\t\t\tconst inBox = insideBox(d, box, false)\n\t\t\t\tif (inBox) {\n\t\t\t\t\t// Toggle selection for elements in the box\n\t\t\t\t\tsetDotSelected(d, !d.selected)\n\t\t\t\t} else if (!add) {\n\t\t\t\t\t// If not holding shift and element is outside box, deselect it\n\t\t\t\t\tsetDotSelected(d, false)\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tselectListener(gd().nodes().find(n => n.selected))\n\t\t},\n\t\tupdatePanning: updatePanning,\n\t}, dragMode)\n\t\n\t// Store cleanup function on the SVG element for later use\n\tconst cleanup = () => {\n\t\teventListeners.forEach(({ element, event, handler }) => {\n\t\t\telement.removeEventListener(event, handler)\n\t\t})\n\t\tif (customInteractionCleanup) {\n\t\t\tcustomInteractionCleanup()\n\t\t}\n\t}\n\t\n\t// Store cleanup function on SVG element\n\t;(svg as any).__cursorInteractionCleanup = cleanup\n}\n\nexport function getZoom() {\n\tif (!svg) return 1\n\tconst el = svg.querySelector('g.zoom') as SVGGElement\n\tif (!el) return 1\n\t\n\t// Parse zoom from transform attribute to match how we set it\n\tconst transform = el.getAttribute('transform') || ''\n\tconst scaleMatch = transform.match(/scale\\(([^)]+)\\)/)\n\tif (scaleMatch) {\n\t\treturn parseFloat(scaleMatch[1]) || 1\n\t}\n\treturn 1\n}\n\n// svgPadding is now imported as SVG_PADDING from constants.ts\n\nexport function setZoom(zoom: number) {\n\tif (!svg) return\n\tconst el = svg.querySelector('g.zoom') as SVGGElement\n\tif (!el) return\n\t\n\t// Preserve existing translation when setting zoom\n\tconst currentTransform = getCurrentTransform()\n\tel.setAttribute('transform', `translate(${currentTransform.x}, ${currentTransform.y}) scale(${zoom})`)\n\t\n\t// also set panning size\n\tupdatePanning()\n}\n\nexport function setZoomCentered(newZoom: number, centerX?: number, centerY?: number) {\n\tconst el = svg.querySelector('g.zoom') as SVGGElement\n\tconst oldZoom = getZoom()\n\t\n\t// If no center point provided, use viewport center\n\tif (centerX === undefined || centerY === undefined) {\n\t\t// Use the parent container's dimensions for the visible viewport\n\t\t// The SVG might be larger than the visible area due to overflow\n\t\tconst container = svg.parentElement\n\t\tif (container) {\n\t\t\tcenterX = container.clientWidth / 2\n\t\t\tcenterY = container.clientHeight / 2\n\t\t} else {\n\t\t\t// Fallback to SVG dimensions if no parent\n\t\t\tcenterX = svg.clientWidth / 2\n\t\t\tcenterY = svg.clientHeight / 2\n\t\t}\n\t}\n\t\n\t// Get current transform\n\tconst currentTransform = getCurrentTransform()\n\t\n\t// Convert screen coordinates to drawing coordinates\n\t// For transform order translate(tx, ty) scale(s):\n\t// screen_point = (drawing_point * scale) + translation\n\t// So: drawing_point = (screen_point - translation) / scale\n\tconst drawingX = (centerX - currentTransform.x) / oldZoom\n\tconst drawingY = (centerY - currentTransform.y) / oldZoom\n\t\n\t// Calculate new translation to keep the same drawing point at the same screen position\n\t// screen_point = (drawing_point * new_scale) + new_translation\n\t// So: new_translation = screen_point - (drawing_point * new_scale)\n\tconst newTranslateX = centerX - (drawingX * newZoom)\n\tconst newTranslateY = centerY - (drawingY * newZoom)\n\t\n\t// Apply the new transform\n\tel.setAttribute('transform', `translate(${newTranslateX}, ${newTranslateY}) scale(${newZoom})`)\n\t\n\t// Update panning\n\tupdatePanning()\n}\n\nfunction getCurrentTransform() {\n\tif (!svg) return { x: 0, y: 0 }\n\tconst el = svg.querySelector('g.zoom') as SVGGElement\n\tif (!el) return { x: 0, y: 0 }\n\t\n\tconst transform = el.getAttribute('transform') || ''\n\tconst translateMatch = transform.match(/translate\\(([^,]+),([^)]+)\\)/)\n\tif (translateMatch) {\n\t\treturn {\n\t\t\tx: parseFloat(translateMatch[1]) || 0,\n\t\t\ty: parseFloat(translateMatch[2]) || 0\n\t\t}\n\t}\n\treturn { x: 0, y: 0 }\n}\n\nfunction updatePanning() {\n\tif (!svg) return\n\tconst el = svg.querySelector('g.zoom') as SVGGElement\n\tif (!el) return\n\tconst bb = el.getBBox()\n\tconst zoom = getZoom()\n\tif (!svg.parentElement) return\n\tconst w = Math.max(svg.parentElement.clientWidth / zoom, bb.x + bb.width + SVG_PADDING)\n\tconst h = Math.max(svg.parentElement.clientHeight / zoom, bb.y + bb.height + SVG_PADDING)\n\tsvg.setAttribute('width', String(w * zoom))\n\tsvg.setAttribute('height', String(h * zoom))\n\t\n\t// Note: View state saving removed from here to prevent interference with reset/fit functions\n\t// View state is now only saved on user interactions and page unload\n}\n\n// Optimized version that uses pre-calculated content bounds instead of expensive getBBox()\nfunction updatePanningOptimized(graphData: GraphData) {\n\tconst bb = graphData.calculateContentBounds() // Use already calculated bounds\n\tconst zoom = getZoom()\n\tconst w = Math.max(svg.parentElement.clientWidth / zoom, bb.x + bb.width + SVG_PADDING)\n\tconst h = Math.max(svg.parentElement.clientHeight / zoom, bb.y + bb.height + SVG_PADDING)\n\tsvg.setAttribute('width', String(w * zoom))\n\tsvg.setAttribute('height', String(h * zoom))\n}\n\nexport const getZoomAuto = () => {\n\t// Get the graph data to calculate proper content bounds\n\tconst graphData = (svg as any).__data as GraphData\n\tif (!graphData) {\n\t\treturn 1 // Default zoom if no graph data\n\t}\n\t\n\t// Use proper content bounds calculation\n\tconst contentBounds = graphData.calculateContentBounds()\n\tconst viewportWidth = svg.parentElement?.clientWidth || 800\n\tconst viewportHeight = svg.parentElement?.clientHeight || 600\n\t\n\t// Add padding around content\n\tconst padding = 40\n\t\n\t// Calculate zoom to fit content with padding\n\tconst zoomX = (viewportWidth - padding * 2) / contentBounds.width\n\tconst zoomY = (viewportHeight - padding * 2) / contentBounds.height\n\tconst zoom = Math.min(zoomX, zoomY)\n\t\n\t// Clamp zoom between reasonable bounds\n\treturn Math.max(Math.min(zoom, 2), 0.1)\n}\n\nconst setBorderStyle = (el: SVGElement, style: string) => {\n\tif (style == 'Dashed') el.setAttribute('stroke-dasharray', '4')\n\telse if (style == 'Dotted') el.setAttribute('stroke-dasharray', '2')\n}\n\nconst styles = {\n\t//node styles\n\tnodeBorder: {\n\t\t// Don't set fill and stroke here - let tag-specific styles handle colors\n\t\tfilter: 'url(#shadow)',\n\t},\n\tnodeText: {\n\t\t'font-family': 'Arial, sans-serif',\n\t\tstroke: \"none\"\n\t},\n\n\t//edge styles\n\tedgeText: {\n\t\t'font-family': 'Arial, sans-serif',\n\t\tstroke: \"none\"\n\t},\n\n\tedgeRect: {\n\t\tfill: \"none\",\n\t\tstroke: \"none\",\n\t},\n\n\t//group styles\n\tgroupRect: {\n\t\t//fill: \"none\",\n\t\tfill: \"rgba(0, 0, 0, 0.02)\",\n\t\tstroke: \"#666\",\n\t\t'stroke-width': 3,\n\t\t\"stroke-dasharray\": 4,\n\t},\n\tgroupText: {\n\t\t'font-family': 'Arial, sans-serif',\n\t\tfill: \"#666\",\n\t\t\"font-size\": 22,\n\t\t\"font-weight\": \"bold\",\n\t\tcursor: \"default\"\n\t}\n}\n\n// View state persistence - similar to undo cache but for zoom/pan\nconst viewStateCache = new Map();\n\n// Save current view state (zoom and pan)\nexport function saveViewState(graphId: string) {\n\tif (!svg) return;\n\t\n\tconst zoom = getZoom();\n\tconst transform = getCurrentTransform();\n\t\n\tconst state = {\n\t\tzoom,\n\t\ttransform: { x: transform.x, y: transform.y }\n\t};\n\t\n\tviewStateCache.set(graphId, state);\n}\n\n// Restore view state if it exists\nexport function restoreViewState(graphId: string): boolean {\n\tif (!svg || !viewStateCache.has(graphId)) {\n\t\treturn false;\n\t}\n\t\n\tconst state = viewStateCache.get(graphId);\n\tif (!state) {\n\t\treturn false;\n\t}\n\t\n\t// Restore zoom and transform\n\tconst zoomGroup = svg.querySelector('g.zoom') as SVGGElement;\n\tif (zoomGroup) {\n\t\tzoomGroup.setAttribute('transform', `scale(${state.zoom}) translate(${state.transform.x}, ${state.transform.y})`);\n\t\tupdatePanning();\n\t}\n\t\n\treturn true;\n}\n\n// Clear view state for a graph\nexport function clearViewState(graphId: string) {\n\tviewStateCache.delete(graphId);\n}","// This file is the only owner of automatic positions. It gives ELK the exact\n// measured sizes, reads ELK's complete result, and does not repair that result.\n\nimport type {\n\tElkExtendedEdge,\n\tElkLabel,\n\tElkNode,\n\tElkPoint,\n} from \"elkjs/lib/elk-api\";\n\nimport {\n\tMeasuredDiagram,\n\tMeasuredEdge,\n\tMeasuredGroup,\n\tMeasuredNode,\n\tPoint,\n\tResolvedEdge,\n\tResolvedGroup,\n\tResolvedLayout,\n\tResolvedNode,\n} from \"./geometry\";\n\n/** AutomaticLayoutOptions are the choices a caller may make before layout. */\nexport interface AutomaticLayoutOptions {\n\tdirection: \"UP\" | \"DOWN\" | \"LEFT\" | \"RIGHT\";\n\tnodeSpacing: number;\n\tlayerSpacing: number;\n}\n\nconst defaultOptions: AutomaticLayoutOptions = {\n\tdirection: \"DOWN\",\n\tnodeSpacing: 80,\n\tlayerSpacing: 80,\n};\n\n/**\n * resolveAutomatic runs one compound ELK layout with exact measured sizes.\n * ELK errors and incomplete results are returned to the caller unchanged.\n */\nexport async function resolveAutomatic(\n\tdiagram: MeasuredDiagram,\n\toptions: Partial = {},\n): Promise {\n\tconst settings = {...defaultOptions, ...options};\n\tconst graph = buildLayoutTree(diagram, settings);\n\tconst ELK = await import(\"elkjs/lib/elk.bundled.js\").then(module => module.default);\n\tconst elk = new ELK();\n\tconst result = await elk.layout(graph);\n\treturn readResolvedLayout(diagram, result);\n}\n\n/**\n * buildLayoutTree creates one ELK tree. Nodes belong to their declared group,\n * groups belong to their declared parent, and each edge belongs to the nearest\n * group shared by both connected nodes.\n */\nfunction buildLayoutTree(\n\tdiagram: MeasuredDiagram,\n\toptions: AutomaticLayoutOptions,\n): ElkNode {\n\tconst nodes = new Map(diagram.nodes.map(node => [node.id, node]));\n\tconst groups = new Map(diagram.groups.map(group => [group.id, group]));\n\tcheckMeasuredLinks(diagram, nodes, groups);\n\n\tconst childrenByParent = new Map();\n\tfor (const node of diagram.nodes) {\n\t\tappend(childrenByParent, node.parentId, node);\n\t}\n\tconst groupsByParent = new Map();\n\tfor (const group of diagram.groups) {\n\t\tappend(groupsByParent, group.parentId, group);\n\t}\n\n\tconst elkGroups = new Map();\n\tconst buildGroup = (group: MeasuredGroup): ElkNode => {\n\t\tconst child: ElkNode = {\n\t\t\tid: group.id,\n\t\t\tchildren: [\n\t\t\t\t...(groupsByParent.get(group.id) ?? []).map(buildGroup),\n\t\t\t\t...(childrenByParent.get(group.id) ?? []).map(buildNode),\n\t\t\t],\n\t\t\tedges: [],\n\t\t\tlabels: [{\n\t\t\t\ttext: group.id,\n\t\t\t\twidth: group.titleSize.width,\n\t\t\t\theight: group.titleSize.height,\n\t\t\t}],\n\t\t\tlayoutOptions: groupLayoutOptions(options, group.titleSize.height),\n\t\t};\n\t\telkGroups.set(group.id, child);\n\t\treturn child;\n\t};\n\n\tconst root: ElkNode = {\n\t\tid: diagram.id,\n\t\tchildren: [\n\t\t\t...(groupsByParent.get(undefined) ?? []).map(buildGroup),\n\t\t\t...(childrenByParent.get(undefined) ?? []).map(buildNode),\n\t\t],\n\t\tedges: [],\n\t\tlayoutOptions: rootLayoutOptions(options),\n\t};\n\n\tfor (const edge of diagram.edges) {\n\t\tconst owner = lowestCommonGroup(edge, nodes, groups);\n\t\tconst container = owner ? elkGroups.get(owner) : root;\n\t\tif (!container) {\n\t\t\tthrow new Error(`edge ${edge.id} has missing layout group ${owner}`);\n\t\t}\n\t\tcontainer.edges?.push(buildEdge(edge));\n\t}\n\treturn root;\n}\n\n/** buildNode passes the measured node size to ELK without padding or guesses. */\nfunction buildNode(node: MeasuredNode): ElkNode {\n\treturn {\n\t\tid: node.id,\n\t\twidth: node.size.width,\n\t\theight: node.size.height,\n\t\tlayoutOptions: {\n\t\t\t\"elk.nodeSize.constraints\": \"FIXED_SIZE\",\n\t\t\t\"elk.portConstraints\": \"FREE\",\n\t\t},\n\t};\n}\n\n/** buildEdge passes the exact label size and stable endpoint IDs to ELK. */\nfunction buildEdge(edge: MeasuredEdge): ElkExtendedEdge {\n\treturn {\n\t\tid: edge.id,\n\t\tsources: [edge.sourceId],\n\t\ttargets: [edge.targetId],\n\t\tlabels: edge.labelSize ? [{\n\t\t\ttext: edge.id,\n\t\t\twidth: edge.labelSize.width,\n\t\t\theight: edge.labelSize.height,\n\t\t\tlayoutOptions: {\n\t\t\t\t\"elk.edgeLabels.inline\": \"false\",\n\t\t\t\t\"elk.edgeLabels.placement\": \"CENTER\",\n\t\t\t},\n\t\t}] : [],\n\t};\n}\n\n/** rootLayoutOptions set the rules shared by the full compound layout. */\nfunction rootLayoutOptions(options: AutomaticLayoutOptions): Record {\n\treturn {\n\t\t\"elk.algorithm\": \"layered\",\n\t\t\"elk.direction\": options.direction,\n\t\t\"elk.edgeRouting\": \"ORTHOGONAL\",\n\t\t\"elk.hierarchyHandling\": \"INCLUDE_CHILDREN\",\n\t\t\"elk.padding\": \"[top=40,left=40,bottom=40,right=40]\",\n\t\t\"elk.spacing.nodeNode\": String(options.nodeSpacing),\n\t\t\"elk.spacing.componentComponent\": String(options.nodeSpacing),\n\t\t\"elk.layered.spacing.nodeNodeBetweenLayers\": String(options.layerSpacing),\n\t\t\"elk.layered.spacing.edgeNodeBetweenLayers\": \"30\",\n\t\t\"elk.layered.spacing.edgeEdgeBetweenLayers\": \"20\",\n\t\t\"elk.layered.nodePlacement.strategy\": \"NETWORK_SIMPLEX\",\n\t\t\"elk.layered.nodePlacement.favorStraightEdges\": \"true\",\n\t\t\"elk.layered.crossingMinimization.strategy\": \"LAYER_SWEEP\",\n\t\t\"elk.layered.unnecessaryBendpoints\": \"true\",\n\t\t\"elk.edgeLabels.inline\": \"false\",\n\t\t\"elk.edgeLabels.avoidOverlap\": \"true\",\n\t\t\"elk.layered.edgeLabels.sideSelection\": \"SMART_DOWN\",\n\t\t\"elk.spacing.edgeLabel\": \"12\",\n\t};\n}\n\n/** groupLayoutOptions reserve title space and keep each group's children together. */\nfunction groupLayoutOptions(\n\toptions: AutomaticLayoutOptions,\n\ttitleHeight: number,\n): Record {\n\treturn {\n\t\t...rootLayoutOptions(options),\n\t\t\"elk.padding\": `[top=${titleHeight + 30},left=30,bottom=30,right=30]`,\n\t\t\"elk.nodeLabels.placement\": \"[H_LEFT,V_TOP,INSIDE]\",\n\t\t\"elk.spacing.labelNode\": \"10\",\n\t};\n}\n\n/**\n * checkMeasuredLinks rejects broken ownership and endpoints before calling ELK,\n * so ELK never has to guess what the model meant.\n */\nfunction checkMeasuredLinks(\n\tdiagram: MeasuredDiagram,\n\tnodes: Map,\n\tgroups: Map,\n): void {\n\tfor (const node of diagram.nodes) {\n\t\tif (node.parentId && !groups.has(node.parentId)) {\n\t\t\tthrow new Error(`node ${node.id} has missing parent group ${node.parentId}`);\n\t\t}\n\t}\n\tfor (const group of diagram.groups) {\n\t\tif (group.parentId && !groups.has(group.parentId)) {\n\t\t\tthrow new Error(`group ${group.id} has missing parent group ${group.parentId}`);\n\t\t}\n\t}\n\tfor (const edge of diagram.edges) {\n\t\tif (!nodes.has(edge.sourceId) || !nodes.has(edge.targetId)) {\n\t\t\tthrow new Error(\n\t\t\t\t`edge ${edge.id} connects missing node ${edge.sourceId} or ${edge.targetId}`,\n\t\t\t);\n\t\t}\n\t}\n}\n\n/** lowestCommonGroup finds the nearest boundary that contains both endpoints. */\nfunction lowestCommonGroup(\n\tedge: MeasuredEdge,\n\tnodes: Map,\n\tgroups: Map,\n): string | undefined {\n\tconst sourceGroups = parentGroups(nodes.get(edge.sourceId)?.parentId, groups);\n\tconst targetGroups = new Set(parentGroups(nodes.get(edge.targetId)?.parentId, groups));\n\treturn sourceGroups.find(group => targetGroups.has(group));\n}\n\n/** parentGroups returns parent IDs from nearest to farthest. */\nfunction parentGroups(\n\tparentId: string | undefined,\n\tgroups: Map,\n): string[] {\n\tconst result: string[] = [];\n\tlet current = parentId;\n\twhile (current) {\n\t\tresult.push(current);\n\t\tcurrent = groups.get(current)?.parentId;\n\t}\n\treturn result;\n}\n\n/** readResolvedLayout changes ELK's parent-relative values into diagram positions. */\nfunction readResolvedLayout(\n\tdiagram: MeasuredDiagram,\n\troot: ElkNode,\n): ResolvedLayout {\n\tif (root.width === undefined || root.height === undefined) {\n\t\tthrow new Error(`ELK did not size diagram ${diagram.id}`);\n\t}\n\tconst nodes: ResolvedNode[] = [];\n\tconst groups: ResolvedGroup[] = [];\n\tconst edges: ResolvedEdge[] = [];\n\tconst measuredNodes = new Map(diagram.nodes.map(node => [node.id, node]));\n\tconst measuredGroups = new Map(diagram.groups.map(group => [group.id, group]));\n\n\treadContainer(\n\t\troot,\n\t\t0,\n\t\t0,\n\t\tmeasuredNodes,\n\t\tmeasuredGroups,\n\t\tnodes,\n\t\tgroups,\n\t\tedges,\n\t);\n\treturn {\n\t\tdiagramId: diagram.id,\n\t\tbounds: {x: 0, y: 0, width: root.width, height: root.height},\n\t\tnodes,\n\t\tgroups,\n\t\tedges,\n\t};\n}\n\n/**\n * readContainer walks one ELK group, adding its parent's position exactly once\n * to each child, edge point, and label box.\n */\nfunction readContainer(\n\tcontainer: ElkNode,\n\tparentX: number,\n\tparentY: number,\n\tmeasuredNodes: Map,\n\tmeasuredGroups: Map,\n\tnodes: ResolvedNode[],\n\tgroups: ResolvedGroup[],\n\tedges: ResolvedEdge[],\n): void {\n\tconst containerX = parentX + (container.x ?? 0);\n\tconst containerY = parentY + (container.y ?? 0);\n\tfor (const child of container.children ?? []) {\n\t\tconst childX = containerX + requiredNumber(child.x, child.id, \"x\");\n\t\tconst childY = containerY + requiredNumber(child.y, child.id, \"y\");\n\t\tconst width = requiredNumber(child.width, child.id, \"width\");\n\t\tconst height = requiredNumber(child.height, child.id, \"height\");\n\t\tconst measuredNode = measuredNodes.get(child.id);\n\t\tif (measuredNode) {\n\t\t\tnodes.push({\n\t\t\t\tid: child.id,\n\t\t\t\tparentId: measuredNode.parentId,\n\t\t\t\tbounds: {x: childX, y: childY, width, height},\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\t\tconst measuredGroup = measuredGroups.get(child.id);\n\t\tif (!measuredGroup) {\n\t\t\tthrow new Error(`ELK returned unknown node ${child.id}`);\n\t\t}\n\t\tconst label = requiredLabel(child.labels?.[0], child.id);\n\t\tgroups.push({\n\t\t\tid: child.id,\n\t\t\tparentId: measuredGroup.parentId,\n\t\t\tbounds: {x: childX, y: childY, width, height},\n\t\t\ttitleBounds: {\n\t\t\t\tx: childX + requiredNumber(label.x, child.id, \"title x\"),\n\t\t\t\ty: childY + requiredNumber(label.y, child.id, \"title y\"),\n\t\t\t\twidth: requiredNumber(label.width, child.id, \"title width\"),\n\t\t\t\theight: requiredNumber(label.height, child.id, \"title height\"),\n\t\t\t},\n\t\t});\n\t\treadContainer(\n\t\t\tchild,\n\t\t\tcontainerX,\n\t\t\tcontainerY,\n\t\t\tmeasuredNodes,\n\t\t\tmeasuredGroups,\n\t\t\tnodes,\n\t\t\tgroups,\n\t\t\tedges,\n\t\t);\n\t}\n\tfor (const edge of container.edges ?? []) {\n\t\tedges.push(readEdge(edge, containerX, containerY));\n\t}\n}\n\n/** readEdge copies every ELK section and label without choosing new positions. */\nfunction readEdge(edge: ElkExtendedEdge, offsetX: number, offsetY: number): ResolvedEdge {\n\tconst sections = (edge.sections ?? []).map(section => [\n\t\taddOffset(section.startPoint, offsetX, offsetY),\n\t\t...(section.bendPoints ?? []).map(point => addOffset(point, offsetX, offsetY)),\n\t\taddOffset(section.endPoint, offsetX, offsetY),\n\t]);\n\tconst label = edge.labels?.[0];\n\treturn {\n\t\tid: edge.id,\n\t\tsourceId: requiredEndpoint(edge.sources, edge.id, \"source\"),\n\t\ttargetId: requiredEndpoint(edge.targets, edge.id, \"target\"),\n\t\tsections,\n\t\tlabelBounds: label ? {\n\t\t\tx: offsetX + requiredNumber(label.x, edge.id, \"label x\"),\n\t\t\ty: offsetY + requiredNumber(label.y, edge.id, \"label y\"),\n\t\t\twidth: requiredNumber(label.width, edge.id, \"label width\"),\n\t\t\theight: requiredNumber(label.height, edge.id, \"label height\"),\n\t\t} : undefined,\n\t};\n}\n\n/** addOffset changes one parent-relative ELK point into a diagram point. */\nfunction addOffset(point: ElkPoint, offsetX: number, offsetY: number): Point {\n\treturn {x: offsetX + point.x, y: offsetY + point.y};\n}\n\n/** requiredNumber rejects incomplete ELK output instead of filling in zero. */\nfunction requiredNumber(\n\tvalue: number | undefined,\n\telementId: string,\n\tfield: string,\n): number {\n\tif (value === undefined) {\n\t\tthrow new Error(`ELK omitted ${field} for ${elementId}`);\n\t}\n\treturn value;\n}\n\n/** requiredEndpoint requires each MDL relationship to have exactly one endpoint. */\nfunction requiredEndpoint(\n\tendpoints: string[],\n\tedgeId: string,\n\tfield: string,\n): string {\n\tif (endpoints.length !== 1) {\n\t\tthrow new Error(`ELK returned ${endpoints.length} ${field}s for edge ${edgeId}`);\n\t}\n\treturn endpoints[0];\n}\n\n/** requiredLabel rejects a group whose measured title was not placed by ELK. */\nfunction requiredLabel(label: ElkLabel | undefined, groupId: string): ElkLabel {\n\tif (!label) {\n\t\tthrow new Error(`ELK omitted title for group ${groupId}`);\n\t}\n\treturn label;\n}\n\n/** append adds a child to one parent entry while keeping model order. */\nfunction append(\n\titems: Map,\n\tparentId: string | undefined,\n\titem: T,\n): void {\n\tconst siblings = items.get(parentId) ?? [];\n\tsiblings.push(item);\n\titems.set(parentId, siblings);\n}\n","// This file connects the editable graph to the layout pipeline. It measures\n// the current SVG once, asks ELK for one complete answer, validates that answer,\n// and returns positions without changing them.\n\nimport {resolveAutomatic} from \"./automatic-layout\";\nimport {\n\tMeasuredDiagram,\n\tMeasuredEdge,\n\tMeasuredGroup,\n\tMeasuredNode,\n\tRect,\n\tResolvedLayout,\n\tValidatedLayout,\n\tvalidateResolvedLayout,\n} from \"./geometry\";\nimport {Edge, GraphData, Group, LayoutDirection, Node} from \"./graph\";\nimport {calculateEdgeVertices} from \"./edge-utils\";\nimport {resolveManual} from \"./manual-layout\";\n\n/** LayoutOptions are the explicit choices available to editor and CLI callers. */\nexport interface LayoutOptions {\n\tdirection?: LayoutDirection;\n\tnodeSpacing?: number;\n\tlayerSpacing?: number;\n\tcompactLayout?: boolean;\n}\n\n/** GraphLayout carries checked positions back to the editable graph. */\nexport interface GraphLayout {\n\tvalidated: ValidatedLayout;\n\tnodes: Array<{id: string; x: number; y: number}>;\n\tgroups: Array<{id: string; bounds: Rect; titleBounds: Rect}>;\n\tedges: Array<{\n\t\tid: string;\n\t\tsections: Array>;\n\t\tlabelBounds?: Rect;\n\t}>;\n}\n\n/**\n * autoLayout measures, lays out, and validates a graph. It does not catch\n * errors because callers must not save a diagram after any failed step.\n */\nexport async function autoLayout(\n\tgraph: GraphData,\n\toptions: LayoutOptions = {},\n): Promise {\n\tawait document.fonts.ready;\n\tconst measured = measureGraph(graph);\n\tconst spacing = options.compactLayout ? 56 : 80;\n\tconst resolved = await resolveAutomatic(measured, {\n\t\tdirection: options.direction ?? graph.layoutDirection ?? \"DOWN\",\n\t\tnodeSpacing: options.nodeSpacing ?? spacing,\n\t\tlayerSpacing: options.layerSpacing ?? spacing,\n\t});\n\tconst validated = validateResolvedLayout(measured, resolved);\n\tconst measuredNodes = new Map(measured.nodes.map(node => [node.id, node]));\n\treturn {\n\t\tvalidated,\n\t\tnodes: validated.nodes.map(node => {\n\t\t\tconst measuredNode = measuredNodes.get(node.id);\n\t\t\tif (!measuredNode) {\n\t\t\t\tthrow new Error(`validated layout contains unknown node ${node.id}`);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tid: node.id,\n\t\t\t\tx: node.bounds.x + measuredNode.centerOffset.x,\n\t\t\t\ty: node.bounds.y + measuredNode.centerOffset.y,\n\t\t\t};\n\t\t}),\n\t\tgroups: validated.groups.map(group => ({\n\t\t\tid: group.id,\n\t\t\tbounds: group.bounds,\n\t\t\ttitleBounds: group.titleBounds,\n\t\t})),\n\t\tedges: validated.edges.map(edge => ({\n\t\t\tid: edge.id,\n\t\t\tsections: edge.sections,\n\t\t\tlabelBounds: edge.labelBounds,\n\t\t})),\n\t};\n}\n\n/**\n * validateCurrentLayout adapts the fully drawn editor state into the manual\n * layout contract. It never reads automatic positions to fill missing data.\n */\nexport function validateCurrentLayout(graph: GraphData): ValidatedLayout {\n\tconst measured = measureGraph(graph);\n\tconst measuredNodes = new Map(measured.nodes.map(node => [node.id, node]));\n\tconst nodes = graph.nodes().map(node => {\n\t\tconst measuredNode = measuredNodes.get(node.id);\n\t\tif (!measuredNode) {\n\t\t\tthrow new Error(`measured diagram omitted node ${node.id}`);\n\t\t}\n\t\treturn {\n\t\t\tid: node.id,\n\t\t\tparentId: measuredNode.parentId,\n\t\t\tbounds: {\n\t\t\t\tx: node.x - measuredNode.centerOffset.x,\n\t\t\t\ty: node.y - measuredNode.centerOffset.y,\n\t\t\t\t...measuredNode.size,\n\t\t\t},\n\t\t};\n\t});\n\tconst groups = Array.from(graph.groupsMap.values()).map(group => {\n\t\tif (!group.ref?.isConnected) {\n\t\t\tthrow new Error(`group ${group.id} must be drawn before saving`);\n\t\t}\n\t\tconst boundary = group.ref.querySelector(\"rect\");\n\t\tconst title = group.ref.querySelector(\"text\");\n\t\tif (!(boundary instanceof SVGGraphicsElement) || !(title instanceof SVGGraphicsElement)) {\n\t\t\tthrow new Error(`group ${group.id} is missing its boundary or title`);\n\t\t}\n\t\treturn {\n\t\t\tid: group.id,\n\t\t\tparentId: measured.groups.find(candidate => candidate.id === group.id)?.parentId,\n\t\t\tbounds: copyBox(boundary.getBBox()),\n\t\t\ttitleBounds: copyBox(title.getBBox()),\n\t\t};\n\t});\n\tconst edges = graph.edges.map(edge => {\n\t\tconst sections = edge.layoutSections ?? [calculateEdgeVertices(edge)];\n\t\tconst labelBounds = edge.layoutLabelBounds ?? edge.labelBounds;\n\t\tif (edge.label.trim().length > 0 && !labelBounds) {\n\t\t\tthrow new Error(`edge ${edge.id} is missing its label position`);\n\t\t}\n\t\treturn {\n\t\t\tid: edge.id,\n\t\t\tsourceId: edge.from.id,\n\t\t\ttargetId: edge.to.id,\n\t\t\tsections,\n\t\t\tlabelBounds: labelBounds ? {...labelBounds} : undefined,\n\t\t};\n\t});\n\tconst snapshot: ResolvedLayout = {\n\t\tdiagramId: graph.id,\n\t\tbounds: contentBounds(nodes.map(node => node.bounds), groups, edges),\n\t\tnodes,\n\t\tgroups,\n\t\tedges,\n\t};\n\treturn resolveManual(measured, snapshot);\n}\n\n/**\n * measureGraph reads the exact node and label boxes already drawn by the\n * browser. Parent IDs come only from the model's declared groups.\n */\nfunction measureGraph(graph: GraphData): MeasuredDiagram {\n\tconst {nodeParents, groupParents} = declaredParents(graph);\n\treturn {\n\t\tid: graph.id,\n\t\tnodes: graph.nodes().map(node => measureNode(node, nodeParents.get(node.id))),\n\t\tgroups: Array.from(graph.groupsMap.values()).map(group =>\n\t\t\tmeasureGroup(group, groupParents.get(group.id)),\n\t\t),\n\t\tedges: graph.edges.map(measureEdge),\n\t};\n}\n\n/** measureNode returns the complete box drawn for one node and its center. */\nfunction measureNode(node: Node, parentId: string | undefined): MeasuredNode {\n\tif (!node.ref?.isConnected) {\n\t\tthrow new Error(`node ${node.id} must be drawn before layout`);\n\t}\n\tconst bounds = node.ref.getBBox();\n\tcheckMeasuredBox(node.id, bounds);\n\treturn {\n\t\tid: node.id,\n\t\tparentId,\n\t\tsize: {width: bounds.width, height: bounds.height},\n\t\tcontentSize: {width: bounds.width, height: bounds.height},\n\t\tcenterOffset: {x: -bounds.x, y: -bounds.y},\n\t\tshape: node.style.shape ?? \"Box\",\n\t};\n}\n\n/** measureGroup reads the title box already drawn by the browser. */\nfunction measureGroup(group: Group, parentId: string | undefined): MeasuredGroup {\n\tif (!group.ref?.isConnected) {\n\t\tthrow new Error(`group ${group.id} must be drawn before layout`);\n\t}\n\tconst title = group.ref.querySelector(\"text\");\n\tif (!(title instanceof SVGGraphicsElement)) {\n\t\tthrow new Error(`group ${group.id} is missing its drawn title`);\n\t}\n\tconst bounds = title.getBBox();\n\tcheckMeasuredBox(group.id, bounds);\n\treturn {\n\t\tid: group.id,\n\t\tparentId,\n\t\ttitleSize: {width: bounds.width, height: bounds.height},\n\t};\n}\n\n/** measureEdge uses the label background that the current SVG already drew. */\nfunction measureEdge(edge: Edge): MeasuredEdge {\n\tconst hasLabel = edge.label.trim().length > 0;\n\tif (hasLabel && !edge.labelBounds) {\n\t\tthrow new Error(`edge ${edge.id} must be drawn before layout`);\n\t}\n\treturn {\n\t\tid: edge.id,\n\t\tsourceId: edge.from.id,\n\t\ttargetId: edge.to.id,\n\t\tlabelSize: hasLabel ? {\n\t\t\twidth: edge.labelBounds?.width ?? 0,\n\t\t\theight: edge.labelBounds?.height ?? 0,\n\t\t} : undefined,\n\t};\n}\n\n/**\n * declaredParents records model ownership and rejects elements that appear in\n * more than one group. Visual position never decides ownership.\n */\nfunction declaredParents(graph: GraphData): {\n\tnodeParents: Map;\n\tgroupParents: Map;\n} {\n\tconst nodeParents = new Map();\n\tconst groupParents = new Map();\n\tfor (const group of graph.groupsMap.values()) {\n\t\tfor (const member of group.nodes) {\n\t\t\tconst parents = isGroup(member) ? groupParents : nodeParents;\n\t\t\tconst existing = parents.get(member.id);\n\t\t\tif (existing && existing !== group.id) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`${isGroup(member) ? \"group\" : \"node\"} ${member.id} belongs to both ` +\n\t\t\t\t\t`${existing} and ${group.id}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tparents.set(member.id, group.id);\n\t\t}\n\t}\n\treturn {nodeParents, groupParents};\n}\n\n/** checkMeasuredBox rejects missing or invalid browser measurements. */\nfunction checkMeasuredBox(id: string, box: Rect): void {\n\tif (\n\t\t!Number.isFinite(box.x) ||\n\t\t!Number.isFinite(box.y) ||\n\t\t!Number.isFinite(box.width) ||\n\t\t!Number.isFinite(box.height) ||\n\t\tbox.width <= 0 ||\n\t\tbox.height <= 0\n\t) {\n\t\tthrow new Error(`browser returned invalid measured box for ${id}`);\n\t}\n}\n\n/** contentBounds returns the smallest box that contains all drawn geometry. */\nfunction contentBounds(\n\tnodes: Rect[],\n\tgroups: Array<{bounds: Rect; titleBounds: Rect}>,\n\tedges: Array<{sections: Array>; labelBounds?: Rect}>,\n): Rect {\n\tconst boxes = [\n\t\t...nodes,\n\t\t...groups.flatMap(group => [group.bounds, group.titleBounds]),\n\t\t...edges.flatMap(edge => edge.labelBounds ? [edge.labelBounds] : []),\n\t];\n\tconst points = edges.flatMap(edge => edge.sections.flat());\n\tif (boxes.length === 0 && points.length === 0) {\n\t\treturn {x: 0, y: 0, width: 0, height: 0};\n\t}\n\tconst left = Math.min(\n\t\t...boxes.map(box => box.x),\n\t\t...points.map(point => point.x),\n\t);\n\tconst top = Math.min(\n\t\t...boxes.map(box => box.y),\n\t\t...points.map(point => point.y),\n\t);\n\tconst right = Math.max(\n\t\t...boxes.map(box => box.x + box.width),\n\t\t...points.map(point => point.x),\n\t);\n\tconst bottom = Math.max(\n\t\t...boxes.map(box => box.y + box.height),\n\t\t...points.map(point => point.y),\n\t);\n\treturn {x: left, y: top, width: right - left, height: bottom - top};\n}\n\n/** copyBox copies the browser's read-only SVG box into the layout contract. */\nfunction copyBox(box: DOMRect): Rect {\n\treturn {x: box.x, y: box.y, width: box.width, height: box.height};\n}\n\n/** isGroup tells group boundaries from nodes without using display names. */\nfunction isGroup(member: Node | Group): member is Group {\n\treturn \"nodes\" in member;\n}\n","// Manual layout has its own entry point. It never fills missing positions from\n// automatic layout and never changes the positions a user authored.\n\nimport {\n\tMeasuredDiagram,\n\tResolvedLayout,\n\tValidatedLayout,\n\tvalidateResolvedLayout,\n} from \"./geometry\";\n\n/**\n * resolveManual checks one complete saved layout against the current measured\n * diagram. Missing or old IDs, incomplete routes, and collisions are errors.\n */\nexport function resolveManual(\n\tmeasured: MeasuredDiagram,\n\tcompleteSnapshot: ResolvedLayout,\n): ValidatedLayout {\n\treturn validateResolvedLayout(measured, completeSnapshot);\n}\n","import {GraphData, LayoutDirection, NodeLink} from \"./graph-view/graph\";\n\n\ninterface Model {\n\tname: string\n\tdescription: string\n\tversion: string\n\tmodel: {\n\t\tenterprise: {\n\t\t\tname: string\n\t\t}\n\t\tpeople: Element[]\n\t\tsoftwareSystems: Element[]\n\t\tdeploymentNodes: Element[]\n\t}\n\tviews: {\n\t\tsystemLandscapeViews: View[]\n\t\tcontainerViews: View[]\n\t\tcomponentViews: View[]\n\t\tdynamicViews: View[]\n\t\tdeploymentViews: View[]\n\t\tstyles: {\n\t\t\telements: {\n\t\t\t\t[key: string]: string\n\t\t\t}[];\n\t\t\trelationships: {\n\t\t\t\t[key: string]: string\n\t\t\t}[]\n\t\t}\n\t}\n}\n\ninterface Layouts {\n\t[key: string]: { // keyed by view key\n\t\t[key: string]: { x: number; y: number } // keyed by element id\n\t}\n}\n\ninterface Element {\n\tid: string;\n\tname: string;\n\ttechnology?: string;\n\tdescription?: string;\n\turl?: string;\n\tparent?: Element;\n\ttags?: string;\n\tlocation?: string;\n\tcontainers?: Element[];\n\tcomponents?: Element[];\n\trelationships?: Relation[];\n\tproperties?: { [key: string]: string }\n\tchildren?: Element[];\n\tinfrastructureNodes?: Element[];\n}\n\ninterface Relation {\n\tid: string;\n\tdescription: string;\n\ttags: string;\n\tsourceId: string;\n\tdestinationId: string;\n\ttechnology: string;\n\tinteractionStyle: string;\n}\n\ntype RankDirection = 'TopBottom' | 'BottomTop' | 'LeftRight' | 'RightLeft';\n\ninterface View {\n\tkey: string;\n\ttitle: string;\n\tdescription: string\n\tautomaticLayout?: {\n\t\trankDirection?: RankDirection;\n\t};\n\telements: {\n\t\tid: string\n\t}[];\n\trelationships: {\n\t\tid: string;\n\t\tvertices: { x: number; y: number }[];\n\t\trouting: string; // takes priority over style\n\t}[];\n\tsoftwareSystemId: string;\n}\n\nconst layoutDirections: Record = {\n\tTopBottom: 'DOWN',\n\tBottomTop: 'UP',\n\tLeftRight: 'RIGHT',\n\tRightLeft: 'LEFT',\n};\n\ninterface Metadata {\n\tname: string\n\tdescription: string\n\tversion: string\n\telements: {\n\t\tid: string\n\t\ttags?: string;\n\t\tlocation?: string;\n\t\tproperties?: { [key: string]: string };\n\t\telementViewKey?: string;\n\t\ttechnology?: string;\n\t\turl?: string;\n\t}[]\n}\n\nexport type ViewsList = {\n\tkey: string;\n\ttitle: string;\n\tsection: string;\n}[]\n\nexport const parseView = (model: Model, layouts: Layouts, viewKey: string) => {\n\n\tconst elements = new Map();\n\tconst relations = new Map();\n\n\tconst collectRels = (el: Element) => {\n\t\tif (Array.isArray(el.relationships)) {\n\t\t\tel.relationships.forEach(rel => {\n\t\t\t\trelations.set(rel.id, rel)\n\t\t\t})\n\t\t}\n\t}\n\n\t// People\n\tmodel.model.people && model.model.people.forEach((el: Element) => {\n\t\telements.set(el.id, el)\n\t\tif (Array.isArray(el.relationships)) {\n\t\t\tel.relationships.forEach(rel => {\n\t\t\t\trelations.set(rel.id, rel)\n\t\t\t})\n\t\t}\n\t})\n\t// Software Systems\n\tmodel.model.softwareSystems && model.model.softwareSystems.forEach((el: Element) => {\n\t\telements.set(el.id, el)\n\t\tcollectRels(el)\n\n\t\tif (Array.isArray(el.containers)) {\n\t\t\tel.containers.forEach((el1: Element) => {\n\t\t\t\tel1.parent = el;\n\t\t\t\telements.set(el1.id, el1)\n\t\t\t\tcollectRels(el1)\n\t\t\t\tif (Array.isArray(el1.components)) {\n\t\t\t\t\tel1.components.forEach((el2: Element) => {\n\t\t\t\t\t\tel2.parent = el1;\n\t\t\t\t\t\telements.set(el2.id, el2)\n\t\t\t\t\t\tcollectRels(el2)\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t})\n\n\t// Deployment Nodes\n\tif (model.model.deploymentNodes) {\n\t\tconst containerInstances = (el: any) => {\n\t\t\tel.containerInstances && el.containerInstances.forEach((item: any) => {\n\t\t\t\tconst el1 = {...elements.get(item.containerId), id: item.id}\n\t\t\t\telements.set(el1.id, el1)\n\t\t\t\tel1.parent = el\n\t\t\t\tcollectRels(item)\n\t\t\t})\n\t\t}\n\n\t\tconst recAddNodes = (el: Element, parent: Element) => {\n\t\t\tel.parent = parent;\n\t\t\telements.set(el.id, el)\n\t\t\tcollectRels(el)\n\t\t\tcontainerInstances(el)\n\t\t\tel.children && el.children.forEach((el1: Element) => recAddNodes(el1, el))\n\t\t\tel.infrastructureNodes && el.infrastructureNodes.forEach((el1: Element) => recAddNodes(el1, el))\n\t\t}\n\n\t\tmodel.model.deploymentNodes.forEach((el: Element) => recAddNodes(el, null))\n\t}\n\n\t// Create graph from selected view\n\tconst {view, section} = getView(model, viewKey)\n\n\tif (!view) return null\n\n\tconst graph = new GraphData(view.key, view.title || view.key)\n\tconst rankDirection = view.automaticLayout?.rankDirection\n\tgraph.layoutDirection = rankDirection ? layoutDirections[rankDirection] : undefined\n\tconst metadata: Metadata = {name: graph.name, description: view.description, version: model.version, elements: []}\n\tgraph.metadata = metadata\n\n\tif (!view.elements) return graph\n\n\t//grouping rules - elements that are groups will not be nodes\n\tconst groupingIDs: { [key: string]: boolean } = {}\n\tif (section == 'deploymentViews' || section == 'containerViews') {\n\t\tview.elements.forEach(ref => {\n\t\t\tconst el = elements.get(ref.id)\n\t\t\tif (el?.parent) {\n\t\t\t\tgroupingIDs[el.parent.id] = true\n\t\t\t}\n\t\t})\n\t} else if (view.softwareSystemId) {\n\t\t//don't show grouping if the element is listed in the view\n\t\tif (!view.elements.find(ref => ref.id == view.softwareSystemId))\n\t\t\tgroupingIDs[view.softwareSystemId] = true\n\t} else if (section == 'systemLandscapeViews') {\n\t\t// create a virtual parent element from enterprise\n\t\tconst p: Element = {id: '__enterprise__', ...model.model.enterprise}\n\t\telements.set(p.id, p)\n\t\tif (model.model.people) model.model.people.filter(el => el.location != 'External').forEach(el => el.parent = p)\n\t\tif (model.model.softwareSystems) model.model.softwareSystems.filter(el => el.location != 'External').forEach(el => el.parent = p)\n\t\tgroupingIDs[p.id] = true\n\t}\n\n\tconst styles = model.views.styles\n\n\t// Build color-to-variable mapping for CSS custom properties theming\n\tconst cssClassName = (tag: string) => tag.toLowerCase().replace(/[^a-z0-9-]/g, '-')\n\t\n\tif (styles?.elements) {\n\t\tstyles.elements.forEach(s => {\n\t\t\tif (s.tag) {\n\t\t\t\tconst varPrefix = `--mdl-${cssClassName(s.tag)}`\n\t\t\t\tif (s.background) graph.colorToVarMap.set(s.background as string, `${varPrefix}-bg`)\n\t\t\t\tif (s.color) graph.colorToVarMap.set(s.color as string, `${varPrefix}-color`)\n\t\t\t\tif (s.stroke) graph.colorToVarMap.set(s.stroke as string, `${varPrefix}-stroke`)\n\t\t\t}\n\t\t})\n\t}\n\n\tif (styles?.relationships) {\n\t\tstyles.relationships.forEach(s => {\n\t\t\tif (s.tag) {\n\t\t\t\tconst varPrefix = `--mdl-rel-${cssClassName(s.tag)}`\n\t\t\t\tif (s.color) graph.colorToVarMap.set(s.color as string, `${varPrefix}-color`)\n\t\t\t}\n\t\t})\n\t}\n\n\t//nodes\n\tview.elements.forEach((ref) => {\n\t\t// except grouping elements\n\t\tif (groupingIDs[ref.id]) return\n\n\t\tconst el = elements.get(ref.id)\n\t\tconst elementViewKey = el ? lookupContainerViewKey(model, el.id) : undefined\n\n\t\tlet sub = ''\n\t\tlet style = {}\n\t\tif (el) {\n\t\t\tconst tags = el.tags.split(',')\n\t\t\tsub = tags[tags.length - 1] // subtitle is []\n\t\t\tif (el.technology)\n\t\t\t\tsub += ': ' + el.technology // or [: ]\n\n\t\t\ttags.forEach(tag => {\n\t\t\t\tconst s = styles && styles.elements && styles.elements.find(s => s.tag == tag)\n\t\t\t\ts && (style = {...style, ...s})\n\t\t\t})\n\t\t}\n\n\t\tgraph.addNode(\n\t\t\tref.id,\n\t\t\tel ? (el.name || ref.id) : ref.id,\n\t\t\tsub,\n\t\t\t(el && el.description) ? el.description : '',\n\t\t\tstyle,\n\t\t\tnodeLink(el, elementViewKey)\n\t\t)\n\t\tel && metadata.elements.push({\n\t\t\tid: el.id,\n\t\t\ttags: el.tags,\n\t\t\tlocation: el.location,\n\t\t\tproperties: el.properties,\n\t\t\telementViewKey,\n\t\t\ttechnology: el.technology,\n\t\t\turl: el.url\n\t\t})\n\t})\n\t//edges\n\tif (Array.isArray(view.relationships)) {\n\t\tview.relationships.forEach(ref => {\n\t\t\tconst rel = relations.get(ref.id)\n\t\t\tif (!rel) return;\n\n\t\t\tif (!graph.nodesMap.has(rel.sourceId)) {\n\t\t\t\tif (elements.has(rel.sourceId)) {\n\t\t\t\t\tconst el = elements.get(rel.sourceId)\n\t\t\t\t\tconsole.warn('Element not found in this view: ', el.id, el.name)\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn('Element not found: ', rel.sourceId)\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!graph.nodesMap.has(rel.destinationId)) {\n\t\t\t\tif (elements.has(rel.destinationId)) {\n\t\t\t\t\tconst el = elements.get(rel.destinationId)\n\t\t\t\t\tconsole.warn('Element not found in this view: ', el.id, el.name)\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn('Element not found: ', rel.destinationId)\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlet style: any = {}\n\t\t\trel.tags.split(',').forEach(tag => {\n\t\t\t\tconst s = styles && styles.relationships && styles.relationships.find(s => s.tag == tag)\n\t\t\t\ts && (style = {...style, ...s})\n\t\t\t})\n\t\t\tif (ref.routing) style.routing = ref.routing\n\n\t\t\tgraph.addEdge(rel.id, rel.sourceId, rel.destinationId, rel.description, ref.vertices, style)\n\t\t})\n\t}\n\n\t//groups\n\t//sort by depth to solve dependency\n\tconst level = (el: Element) => {\n\t\tlet i = 0\n\t\tfor (let p = el.parent; p; p = p.parent) i++;\n\t\treturn i\n\t}\n\tconst gElements = Object.keys(groupingIDs)\n\t\t.map(id => elements.get(id))\n\t\t.sort((a, b) => level(a) > level(b) ? -1 : 1)\n\n\tgElements.forEach(parent => {\n\t\tlet style = {}\n\t\tif (section == 'deploymentViews') {\n\t\t\tconst el = elements.get(parent.id)\n\t\t\tconst tags = el.tags.split(',')\n\t\t\ttags.forEach(tag => {\n\t\t\t\tconst s = styles && styles.elements && styles.elements.find(s => s.tag == tag)\n\t\t\t\ts && (style = {...style, ...s})\n\t\t\t})\n\t\t}\n\t\t\n\t\t// Filter group members more carefully to respect boundaries\n\t\tconst groupMembers = view.elements\n\t\t\t.map(ref => elements.get(ref.id))\n\t\t\t.filter(el => {\n\t\t\t\tif (!el || el.parent !== parent) return false;\n\t\t\t\t\n\t\t\t\t// For system landscape views, respect the location-based grouping\n\t\t\t\tif (section === 'systemLandscapeViews' && parent.id === '__enterprise__') {\n\t\t\t\t\t// Only include elements that are explicitly non-external\n\t\t\t\t\treturn el.location !== 'External';\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// For other view types, include if parent matches\n\t\t\t\treturn true;\n\t\t\t})\n\t\t\t.map(el => el.id);\n\t\t\n\t\t// Only create group if it has members\n\t\tif (groupMembers.length > 0) {\n\t\t\tgraph.addGroup(\n\t\t\t\tparent.id,\n\t\t\t\tparent.name,\n\t\t\t\tgroupMembers,\n\t\t\t\tstyle\n\t\t\t)\n\t\t}\n\t})\n\n\t//layout if any and init graph\n\tgraph.init(layouts[graph.id])\n\treturn graph\n}\n\nfunction nodeLink(element: Element | undefined, elementViewKey: string | undefined): NodeLink | undefined {\n\tif (elementViewKey) {\n\t\tconst encodedViewKey = encodeURIComponent(elementViewKey)\n\t\treturn {\n\t\t\thref: `?id=${encodedViewKey}`,\n\t\t\texportHref: `${encodedViewKey}.svg`,\n\t\t}\n\t}\n\tif (element?.url) {\n\t\treturn {\n\t\t\thref: element.url,\n\t\t\texportHref: element.url,\n\t\t}\n\t}\n\treturn undefined\n}\n\n// lookup the view in all Views sections in the model. return the view and the section\nfunction getView(model: Model, viewKey: string) {\n\tlet view: View = null, section: string = ''\n\tObject.keys(model.views).filter(s => s.endsWith('Views')).some((s: string) => {\n\t\treturn ((model.views as any)[s]).some((v: View) => {\n\t\t\tif (v.key == viewKey) {\n\t\t\t\tview = v\n\t\t\t\tsection = s\n\t\t\t\treturn true\n\t\t\t}\n\t\t})\n\t})\n\treturn {view, section}\n}\n\n\nfunction lookupContainerViewKey(model: Model, softwareSystemId: string) {\n\tconst view = model.views.containerViews?.find(candidate => candidate.softwareSystemId == softwareSystemId)\n\treturn view?.key\n}\n\nexport const listViews = (model: any) => {\n\tconst viewsList: ViewsList = []\n\tconst sections = Object.keys(model.views).filter(section => section.endsWith('Views'))\n\tsections.forEach(s => {\n\t\tmodel.views[s].forEach((v: View) => {\n\t\t\tviewsList.push({key: v.key, title: v.title || v.key, section: s})\n\t\t})\n\t})\n\treturn viewsList;\n}\n","import React, {FC} from \"react\";\nimport { isMac, getModifierKeyName, getModifierKeyProperty } from './utils/platform';\n\ninterface Combination {\n\tctrl?: boolean;\n\tshift?: boolean;\n\talt?: boolean;\n\twheel?: boolean\n\tkey?: string;\n\tclick?: boolean;\n}\n\ninterface Shortcut {\n\tid: string,\n\thelp: string,\n\tcombinations: Combination[]\n}\n\nexport const SAVE = 'save'\n\nexport const UNDO = 'undo'\nexport const REDO = 'redo'\nexport const ADD_VERTEX = 'add-vertex'\nexport const ADD_LABEL_VERTEX = 'add-label-vertex'\nexport const DEL_VERTEX = 'del-vertex'\n\nexport const ZOOM_IN = 'zoom-in'\nexport const ZOOM_OUT = 'zoom-out'\nexport const ZOOM_FIT = 'zoom-fit'\nexport const ZOOM_100 = 'zoom-100'\n\nexport const SELECT_ALL = 'select-all'\nexport const DESELECT = 'deselect'\n\nexport const MOVE_LEFT = 'move-left'\nexport const MOVE_RIGHT = 'move-right'\nexport const MOVE_UP = 'move-up'\nexport const MOVE_DOWN = 'move-down'\nexport const MOVE_LEFT_FINE = 'move-left-fine'\nexport const MOVE_RIGHT_FINE = 'move-right-fine'\nexport const MOVE_UP_FINE = 'move-up-fine'\nexport const MOVE_DOWN_FINE = 'move-down-fine'\n\nexport const PAN_VIEW = 'pan-view'\nexport const SELECT_ELEMENT = 'select-element'\nexport const MULTI_SELECT = 'multi-select'\nexport const BOX_SELECT = 'box-select'\nexport const MOVE_ELEMENTS = 'move-elements'\n\nexport const HELP = 'help'\n\n// New shortcuts for toolbar buttons\nexport const TOGGLE_DRAG_MODE = 'toggle_drag_mode'\nexport const ALIGN_HORIZONTAL = 'align_horizontal'\nexport const ALIGN_VERTICAL = 'align_vertical'\nexport const DISTRIBUTE_HORIZONTAL = 'distribute_horizontal'\nexport const DISTRIBUTE_VERTICAL = 'distribute_vertical'\nexport const AUTO_LAYOUT = 'auto_layout'\nexport const RESET_POSITION = 'reset_position'\nexport const TOGGLE_GRID = 'toggle_grid'\nexport const TOGGLE_SNAP_TO_GRID = 'toggle_snap_to_grid'\nexport const SNAP_ALL_TO_GRID = 'snap_all_to_grid'\n\nconst shortcuts: { name: string; list: Shortcut[] }[] = [\n\t{\n\t\tname: 'Help',\n\t\tlist: [\n\t\t\t{\n\t\t\t\tid: HELP,\n\t\t\t\thelp: 'Show/hide this help',\n\t\t\t\tcombinations: [\n\t\t\t\t\t{key: '?', shift: true},\n\t\t\t\t\t{key: 'F1', shift: true}\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tname: 'File',\n\t\tlist: [\n\t\t\t{\n\t\t\t\tid: SAVE,\n\t\t\t\thelp: 'Save',\n\t\t\t\tcombinations: [{key: 's', ctrl: true}]\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tname: 'History',\n\t\tlist: [\n\t\t\t{\n\t\t\t\tid: UNDO,\n\t\t\t\thelp: 'Undo',\n\t\t\t\tcombinations: [\n\t\t\t\t\t{ctrl: true, key: 'z'},\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: REDO,\n\t\t\t\thelp: 'Redo',\n\t\t\t\tcombinations: [\n\t\t\t\t\t{ctrl: true, shift: true, key: 'z'},\n\t\t\t\t\t{ctrl: true, key: 'y'},\n\t\t\t\t]\n\t\t\t}\n\n\t\t],\n\t},\n\t{\n\t\tname: 'Relationship editing',\n\t\tlist: [\n\t\t\t{\n\t\t\t\tid: ADD_VERTEX,\n\t\t\t\thelp: 'Add relationship vertex',\n\t\t\t\tcombinations: [\n\t\t\t\t\t{alt: true, click: true},\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: ADD_LABEL_VERTEX,\n\t\t\t\thelp: 'Add label anchor relationship vertex',\n\t\t\t\tcombinations: [\n\t\t\t\t\t{alt: true, shift: true, click: true},\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: DEL_VERTEX,\n\t\t\t\thelp: 'Remove relationship vertex',\n\t\t\t\tcombinations: [\n\t\t\t\t\t{key: 'DELETE'},\n\t\t\t\t\t{key: 'BACKSPACE'}\n\t\t\t\t]\n\t\t\t},\n\t\t]\n\t},\n\t{\n\t\tname: 'Zoom',\n\t\tlist: [\n\t\t\t{\n\t\t\t\tid: ZOOM_IN,\n\t\t\t\thelp: 'Zoom in',\n\t\t\t\tcombinations: [\n\t\t\t\t\t{ctrl: true, key: '='}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: ZOOM_OUT,\n\t\t\t\thelp: 'Zoom out',\n\t\t\t\tcombinations: [\n\t\t\t\t\t{ctrl: true, key: '-'}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: ZOOM_FIT,\n\t\t\t\thelp: 'Zoom - fit',\n\t\t\t\tcombinations: [{ctrl: true, key: '9'}]\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: ZOOM_100,\n\t\t\t\thelp: 'Zoom 100%',\n\t\t\t\tcombinations: [{ctrl: true, key: '0'}]\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'wheel_zoom',\n\t\t\t\thelp: 'Zoom in/out with mouse wheel',\n\t\t\t\tcombinations: [{wheel: true}]\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tname: 'Mouse Interactions',\n\t\tlist: [\n\t\t\t{\n\t\t\t\tid: PAN_VIEW,\n\t\t\t\thelp: 'Pan view (drag empty space)',\n\t\t\t\tcombinations: [{click: true}]\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: SELECT_ELEMENT,\n\t\t\t\thelp: 'Select element',\n\t\t\t\tcombinations: [{click: true}]\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: MULTI_SELECT,\n\t\t\t\thelp: 'Add/remove from selection',\n\t\t\t\tcombinations: [{shift: true, click: true}]\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: BOX_SELECT,\n\t\t\t\thelp: 'Box selection (drag empty space)',\n\t\t\t\tcombinations: [{shift: true, click: true}]\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: MOVE_ELEMENTS,\n\t\t\t\thelp: 'Move selected elements',\n\t\t\t\tcombinations: [{click: true}]\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tname: 'Select',\n\t\tlist: [\n\t\t\t{\n\t\t\t\tid: SELECT_ALL,\n\t\t\t\thelp: 'Select All',\n\t\t\t\tcombinations: [{ctrl: true, key: 'a'}]\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: DESELECT,\n\t\t\t\thelp: 'Deselect',\n\t\t\t\tcombinations: [{key: 'ESC'}]\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tname: 'Move',\n\t\tlist: [\n\t\t\t{\n\t\t\t\tid: MOVE_UP,\n\t\t\t\thelp: 'Move up (grid increment)',\n\t\t\t\tcombinations: [{key: 'UP'}]\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: MOVE_UP_FINE,\n\t\t\t\thelp: 'Move up (1 pixel)',\n\t\t\t\tcombinations: [{key: 'UP', shift: true}]\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: MOVE_RIGHT,\n\t\t\t\thelp: 'Move right (grid increment)',\n\t\t\t\tcombinations: [{key: 'RIGHT'}]\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: MOVE_RIGHT_FINE,\n\t\t\t\thelp: 'Move right (1 pixel)',\n\t\t\t\tcombinations: [{key: 'RIGHT', shift: true}]\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: MOVE_DOWN,\n\t\t\t\thelp: 'Move down (grid increment)',\n\t\t\t\tcombinations: [{key: 'DOWN'}]\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: MOVE_DOWN_FINE,\n\t\t\t\thelp: 'Move down (1 pixel)',\n\t\t\t\tcombinations: [{key: 'DOWN', shift: true}]\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: MOVE_LEFT,\n\t\t\t\thelp: 'Move left (grid increment)',\n\t\t\t\tcombinations: [{key: 'LEFT'}]\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: MOVE_LEFT_FINE,\n\t\t\t\thelp: 'Move left (1 pixel)',\n\t\t\t\tcombinations: [{key: 'LEFT', shift: true}]\n\t\t\t},\n\t\t]\n\t},\n\t\t\t{\n\t\t\tname: 'View',\n\t\t\tlist: [\n\t\t\t\t{\n\t\t\t\t\tid: TOGGLE_DRAG_MODE,\n\t\t\t\t\thelp: 'Toggle between pan and select mode',\n\t\t\t\t\tcombinations: [{key: 't'}]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: RESET_POSITION,\n\t\t\t\t\thelp: 'Reset position and view',\n\t\t\t\t\tcombinations: [{key: 'Home', ctrl: true}]\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t{\n\t\tname: 'Alignment',\n\t\tlist: [\n\t\t\t{\n\t\t\t\tid: ALIGN_HORIZONTAL,\n\t\t\t\thelp: 'Align selected elements horizontally',\n\t\t\t\tcombinations: [{key: 'h', ctrl: true, shift: true}]\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: ALIGN_VERTICAL,\n\t\t\t\thelp: 'Align selected elements vertically',\n\t\t\t\tcombinations: [{key: 'a', ctrl: true, shift: true}]\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: DISTRIBUTE_HORIZONTAL,\n\t\t\t\thelp: 'Distribute selected elements horizontally',\n\t\t\t\tcombinations: [{key: 'h', ctrl: true, alt: true}]\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: DISTRIBUTE_VERTICAL,\n\t\t\t\thelp: 'Distribute selected elements vertically',\n\t\t\t\tcombinations: [{key: 'v', ctrl: true, alt: true}]\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tname: 'Layout',\n\t\tlist: [\n\t\t\t{\n\t\t\t\tid: AUTO_LAYOUT,\n\t\t\t\thelp: 'Auto layout all elements',\n\t\t\t\tcombinations: [{key: 'l', ctrl: true}]\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tname: 'Grid',\n\t\tlist: [\n\t\t\t{\n\t\t\t\tid: TOGGLE_GRID,\n\t\t\t\thelp: 'Toggle grid visibility',\n\t\t\t\tcombinations: [{key: 'g', ctrl: true}]\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: TOGGLE_SNAP_TO_GRID,\n\t\t\t\thelp: 'Toggle snap to grid',\n\t\t\t\tcombinations: [{key: 'g', ctrl: true, shift: true}]\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: SNAP_ALL_TO_GRID,\n\t\t\t\thelp: 'Snap all elements to grid',\n\t\t\t\tcombinations: [{key: 'g', ctrl: true, alt: true}]\n\t\t\t}\n\t\t]\n\t}\n]\n\nconst shortcutMap = shortcuts\n\t.reduce((lst, s) => lst.concat(s.list), [] as Shortcut[])\n\t.reduce<{ [k: string]: Shortcut }>((map, s) => {\n\t\tmap[s.id] = s;\n\t\treturn map\n\t}, {})\n\nconst checkKey = (e: KeyboardEvent | MouseEvent, shortcut: Shortcut, click: boolean, wheel: boolean) => {\n\treturn shortcut.combinations.some(c => {\n\t\tif (Boolean(c.shift) != e.shiftKey) return false\n\t\t// Use platform-appropriate modifier key\n\t\tif (c.ctrl) {\n\t\t\tconst modifierKey = getModifierKeyProperty(e as KeyboardEvent);\n\t\t\tif (!modifierKey) return false;\n\t\t}\n\t\tif (Boolean(c.alt) != e.altKey) return false\n\t\tif (click) return c.click\n\t\tif (wheel) return c.wheel\n\t\tif (c.key) {\n\t\t\tconst ke = e as KeyboardEvent\n\t\t\tif (c.key == 'DELETE') return ke.key == 'Delete'\n\t\t\tif (c.key == 'BACKSPACE') return ke.key == 'Backspace'\n\t\t\tif (c.key == 'ESC') return ke.key == 'Escape'\n\t\t\tif (c.key == 'UP') return ke.key == 'ArrowUp'\n\t\t\tif (c.key == 'DOWN') return ke.key == 'ArrowDown'\n\t\t\tif (c.key == 'LEFT') return ke.key == 'ArrowLeft'\n\t\t\tif (c.key == 'RIGHT') return ke.key == 'ArrowRight'\n\t\t\treturn c.key && ke.key && c.key.toLowerCase() == ke.key.toLowerCase()\n\t\t}\n\t\treturn false\n\t})\n}\n\nexport const findShortcut = (e: KeyboardEvent | MouseEvent, click = false, wheel = false) => {\n\t// Find all matching shortcuts\n\tconst matches = Object.keys(shortcutMap).filter(k => checkKey(e, shortcutMap[k], click, wheel))\n\t\n\tif (matches.length === 0) return undefined\n\tif (matches.length === 1) return matches[0]\n\t\n\t// If multiple matches, prefer the one with more specific modifiers\n\t// Sort by number of modifiers (shift, ctrl, alt) in descending order\n\tconst sortedMatches = matches.sort((a, b) => {\n\t\tconst aShortcut = shortcutMap[a]\n\t\tconst bShortcut = shortcutMap[b]\n\t\t\n\t\tconst aModifiers = aShortcut.combinations[0]\n\t\tconst bModifiers = bShortcut.combinations[0]\n\t\t\n\t\tconst aCount = (aModifiers.shift ? 1 : 0) + (aModifiers.ctrl ? 1 : 0) + (aModifiers.alt ? 1 : 0)\n\t\tconst bCount = (bModifiers.shift ? 1 : 0) + (bModifiers.ctrl ? 1 : 0) + (bModifiers.alt ? 1 : 0)\n\t\t\n\t\treturn bCount - aCount // Descending order (more modifiers first)\n\t})\n\t\n\treturn sortedMatches[0]\n}\n\nconst comboText = (c: Combination) => {\n\treturn [\n\t\tc.ctrl && getModifierKeyName().toUpperCase(),\n\t\tc.shift && 'SHIFT',\n\t\tc.alt && 'ALT',\n\t\tc.key && (c.key.length > 1 ? c.key : `\"${c.key.toUpperCase()}\"`),\n\t\tc.click && 'CLICK',\n\t\tc.wheel && 'WHEEL'\n\t].filter(Boolean).join(' + ')\n}\n\nexport const Help: FC = () => {\n\treturn
\n\t\t

Shortcuts

\n\t\t\n\t\t\t\n\t\t\t{\n\t\t\t\tshortcuts.map(section => <>\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{section.list.map(item => \n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t)}\n\t\t\t\t)\n\t\t\t}\n\t\t\t\n\t\t
{section.name}
{item.combinations.map(comboText).join(', ')}{item.help}
\n\t
\n}\n","/**\n * Robust platform detection utilities\n */\n\n/**\n * Detects if the user is on a Mac platform using multiple detection methods\n * for maximum compatibility across browsers and future-proofing.\n */\nexport const isMac = (): boolean => {\n if (typeof navigator === 'undefined') return false;\n \n // Method 1: Check userAgentData (modern browsers, most reliable)\n if ('userAgentData' in navigator && (navigator as any).userAgentData) {\n const platform = (navigator as any).userAgentData.platform;\n if (platform && platform.toLowerCase().includes('mac')) {\n return true;\n }\n }\n \n // Method 2: Check userAgent string (widely supported)\n const userAgent = navigator.userAgent.toLowerCase();\n if (userAgent.includes('mac os') || userAgent.includes('macintosh')) {\n return true;\n }\n \n // Method 3: Check platform (fallback, deprecated but still widely supported)\n if (navigator.platform) {\n const platform = navigator.platform.toLowerCase();\n if (platform.includes('mac') || platform.includes('darwin')) {\n return true;\n }\n }\n \n // Method 4: Check for Mac-specific features as additional validation\n try {\n const testEvent = new KeyboardEvent('keydown', { metaKey: true });\n if (testEvent.metaKey !== undefined) {\n // Additional heuristic: Mac typically has different key layouts\n return /mac|darwin|os x/i.test(navigator.userAgent);\n }\n } catch (e) {\n // Ignore errors in older browsers\n }\n \n return false;\n};\n\n/**\n * Gets the appropriate modifier key name for the current platform\n */\nexport const getModifierKeyName = (): string => {\n return isMac() ? 'Cmd' : 'Ctrl';\n};\n\n/**\n * Gets the appropriate modifier key property for keyboard events\n */\nexport const getModifierKeyProperty = (event: KeyboardEvent): boolean => {\n return isMac() ? event.metaKey : event.ctrlKey;\n};\n\n/**\n * Gets the appropriate Alt key name for the current platform\n */\nexport const getAltKeyName = (): string => {\n return isMac() ? 'Option' : 'Alt';\n}; ","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../node_modules/.pnpm/css-loader@7.1.4_webpack@5.109.2/node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../node_modules/.pnpm/css-loader@7.1.4_webpack@5.109.2/node_modules/css-loader/dist/runtime/api.js\";\nimport ___CSS_LOADER_GET_URL_IMPORT___ from \"../node_modules/.pnpm/css-loader@7.1.4_webpack@5.109.2/node_modules/css-loader/dist/runtime/getUrl.js\";\nvar ___CSS_LOADER_URL_IMPORT_0___ = new URL(\"@fontsource/inter/files/inter-latin-400-normal.woff2\", import.meta.url);\nvar ___CSS_LOADER_URL_IMPORT_1___ = new URL(\"@fontsource/inter/files/inter-latin-500-normal.woff2\", import.meta.url);\nvar ___CSS_LOADER_URL_IMPORT_2___ = new URL(\"@fontsource/inter/files/inter-latin-600-normal.woff2\", import.meta.url);\nvar ___CSS_LOADER_URL_IMPORT_3___ = new URL(\"@fontsource/inter/files/inter-latin-700-normal.woff2\", import.meta.url);\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\nvar ___CSS_LOADER_URL_REPLACEMENT_0___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_0___);\nvar ___CSS_LOADER_URL_REPLACEMENT_1___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_1___);\nvar ___CSS_LOADER_URL_REPLACEMENT_2___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_2___);\nvar ___CSS_LOADER_URL_REPLACEMENT_3___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_3___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `/* Local Inter files keep browser text measurement identical without internet access. */\n@font-face {\n\tfont-family: \"Inter\";\n\tfont-style: normal;\n\tfont-display: swap;\n\tfont-weight: 400;\n\tsrc: url(${___CSS_LOADER_URL_REPLACEMENT_0___}) format(\"woff2\");\n}\n\n@font-face {\n\tfont-family: \"Inter\";\n\tfont-style: normal;\n\tfont-display: swap;\n\tfont-weight: 500;\n\tsrc: url(${___CSS_LOADER_URL_REPLACEMENT_1___}) format(\"woff2\");\n}\n\n@font-face {\n\tfont-family: \"Inter\";\n\tfont-style: normal;\n\tfont-display: swap;\n\tfont-weight: 600;\n\tsrc: url(${___CSS_LOADER_URL_REPLACEMENT_2___}) format(\"woff2\");\n}\n\n@font-face {\n\tfont-family: \"Inter\";\n\tfont-style: normal;\n\tfont-display: swap;\n\tfont-weight: 700;\n\tsrc: url(${___CSS_LOADER_URL_REPLACEMENT_3___}) format(\"woff2\");\n}\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/fonts.css\"],\"names\":[],\"mappings\":\"AAAA,uFAAuF;AACvF;CACC,oBAAoB;CACpB,kBAAkB;CAClB,kBAAkB;CAClB,gBAAgB;CAChB,4DAAgF;AACjF;;AAEA;CACC,oBAAoB;CACpB,kBAAkB;CAClB,kBAAkB;CAClB,gBAAgB;CAChB,4DAAgF;AACjF;;AAEA;CACC,oBAAoB;CACpB,kBAAkB;CAClB,kBAAkB;CAClB,gBAAgB;CAChB,4DAAgF;AACjF;;AAEA;CACC,oBAAoB;CACpB,kBAAkB;CAClB,kBAAkB;CAClB,gBAAgB;CAChB,4DAAgF;AACjF\",\"sourcesContent\":[\"/* Local Inter files keep browser text measurement identical without internet access. */\\n@font-face {\\n\\tfont-family: \\\"Inter\\\";\\n\\tfont-style: normal;\\n\\tfont-display: swap;\\n\\tfont-weight: 400;\\n\\tsrc: url(\\\"@fontsource/inter/files/inter-latin-400-normal.woff2\\\") format(\\\"woff2\\\");\\n}\\n\\n@font-face {\\n\\tfont-family: \\\"Inter\\\";\\n\\tfont-style: normal;\\n\\tfont-display: swap;\\n\\tfont-weight: 500;\\n\\tsrc: url(\\\"@fontsource/inter/files/inter-latin-500-normal.woff2\\\") format(\\\"woff2\\\");\\n}\\n\\n@font-face {\\n\\tfont-family: \\\"Inter\\\";\\n\\tfont-style: normal;\\n\\tfont-display: swap;\\n\\tfont-weight: 600;\\n\\tsrc: url(\\\"@fontsource/inter/files/inter-latin-600-normal.woff2\\\") format(\\\"woff2\\\");\\n}\\n\\n@font-face {\\n\\tfont-family: \\\"Inter\\\";\\n\\tfont-style: normal;\\n\\tfont-display: swap;\\n\\tfont-weight: 700;\\n\\tsrc: url(\\\"@fontsource/inter/files/inter-latin-700-normal.woff2\\\") format(\\\"woff2\\\");\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../node_modules/.pnpm/css-loader@7.1.4_webpack@5.109.2/node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../node_modules/.pnpm/css-loader@7.1.4_webpack@5.109.2/node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `html, body, #root {\n height: 100%;\n}\n\nbody {\n font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n color: #666;\n margin: 0;\n}\n\n#root {\n display: flex;\n flex-direction: column;\n}\n#root > div.graph {\n flex: 1;\n overflow: auto;\n position: relative;\n}\n\n.toolbar {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 4px 10px;\n background-color: #f0f0f0;\n border-bottom: 1px solid #cccccc;\n}\n\n.toolbar > div {\n display: flex;\n align-items: center;\n}\n\n.toolbar button {\n padding: 5px 8px;\n margin: 0 2px;\n cursor: pointer;\n}\n\n.toolbar button:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* Drag mode toggle button styles */\n.toolbar button.mode-toggle {\n position: relative;\n border: 1px solid #8f9fc9;\n width: 40px;\n min-height: 28px;\n background: linear-gradient(to bottom, #abb8db, #8f9fc9);\n border-color: #8f9fc9;\n color: white;\n box-shadow: 2px 2px 2px rgba(0, 0, 0, .2);\n}\n\n.toolbar button.mode-toggle:hover {\n background: linear-gradient(to bottom, #bcc7e0, #abb8db);\n border-color: #abb8db;\n}\n\n.toolbar button.mode-toggle.select-mode:active {\n background: linear-gradient(to bottom, #8f9fc9, #7a8bb5);\n}\n\n/* Pan mode and active toggle - darker blue */\n.toolbar button.mode-toggle.pan-mode,\n.toolbar button.active-toggle {\n background: linear-gradient(to bottom, #4a90e2, #357abd);\n border-color: #2968a3;\n box-shadow: inset 0 1px 2px rgba(0,0,0,0.2);\n}\n\n.toolbar button.mode-toggle.pan-mode:hover,\n.toolbar button.active-toggle:hover {\n background: linear-gradient(to bottom, #5ba0f2, #4585c7);\n}\n\n.toolbar button.mode-toggle.pan-mode:active {\n background: linear-gradient(to bottom, #357abd, #2968a3);\n box-shadow: inset 0 1px 2px rgba(0,0,0,0.2);\n}\n\n/* Toggle buttons when inactive - gray styling */\n.toolbar button.inactive-toggle {\n background: #c1c1c1;\n color: #999;\n border-color: #c1c1c1;\n box-shadow: none;\n}\n\n.toolbar button.inactive-toggle:hover {\n background: #b1b1b1;\n}\n\n.toolbar button.inactive-toggle:active {\n background: #a1a1a1;\n}\n\n/* Toggle buttons when disabled and not active - gray like other disabled buttons */\n.toolbar button.mode-toggle:disabled:not(.pan-mode):not(.active-toggle),\n.toolbar button.active-toggle:disabled:not(.active-toggle) {\n background: #c1c1c1;\n color: #999;\n border-color: #c1c1c1;\n box-shadow: none;\n}\n\n/* Ensure Font Awesome icons are sized appropriately if not already handled */\n.toolbar button .fas {\n font-size: 1em;\n vertical-align: middle;\n}\n\n/* Zoom percentage display */\n.toolbar button.zoom-display {\n font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;\n font-size: 11px;\n font-weight: 600;\n font-variant-numeric: tabular-nums;\n min-width: 50px; /* Wider to prevent size change between 99% and 100% */\n padding: 6px 8px;\n text-align: center;\n}\n\n.toolbar-group {\n display: flex;\n align-items: center;\n margin-right: 25px; /* Large space between groups */\n}\n\n.toolbar-group:last-child {\n margin-right: 0; /* Remove right margin from the last group (help button) */\n}\n\nbutton {\n border: none;\n background: linear-gradient(to bottom, #4a90e2, #357abd);\n border-color: #2968a3;\n border-radius: 3px;\n padding: 6px 10px;\n color: #fff;\n outline: none;\n box-shadow: 2px 2px 2px rgba(0, 0, 0, .2);\n margin-right: 5px;\n min-width: 32px;\n min-height: 28px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: 14px;\n line-height: 1;\n font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n position: relative;\n}\n\nbutton:hover {\n background: linear-gradient(to bottom, #5ba0f2, #4585c7);\n}\n\nbutton:active {\n background: linear-gradient(to bottom, #357abd, #2968a3);\n}\n\nbutton:last-child {\n margin-right: 0;\n}\n\n/* Save button when no changes - gray */\nbutton.action {\n background: #c1c1c1;\n color: #999;\n}\n\nbutton.action:active {\n background: #b1b1b1;\n}\n\n/* Save button when there are changes - orange */\nbutton.grp {\n background: linear-gradient(to bottom, #ee9564, #de7d48);\n margin-right: 0;\n}\n\nbutton.grp:active {\n background: #d67540;\n}\n\n/* Auto-arrange button with AI purple to blue gradient */\nbutton.auto-arrange {\n background: linear-gradient(135deg, #6A4C93, #4a90e2);\n border-color: #4a4c93;\n}\n\nbutton.auto-arrange:hover {\n background: linear-gradient(135deg, #7B5DAD, #5ba0f2);\n border-color: #5a5ca3;\n}\n\nbutton.auto-arrange:active {\n background: linear-gradient(135deg, #593B83, #357abd);\n border-color: #3a3c83;\n}\n\nselect {\n border: 1px solid #ccc;\n background: white;\n border-radius: 3px;\n padding: 3px 7px;\n color: #666;\n outline: none;\n margin-right: 5px;\n font-size: 12px;\n}\n\nselect:disabled {\n background: #f5f5f5;\n color: #999;\n}\n\nbutton:disabled {\n background: #c1c1c1;\n color: #999;\n}\n\n#root > div > svg {\n position: absolute;\n user-select: none;\n}\n\n\n.node.selected .nodeBorder, .edge.selected path, .edge.selected rect {\n stroke: #29c229;\n}\n.edge .v-dot {\n fill: transparent;\n stroke: transparent;\n stroke-width: 3px;\n cursor: pointer;\n transition: stroke 0.15s ease;\n}\n.edge .v-dot:hover {\n stroke: #999;\n fill: rgba(153, 153, 153, 0.1);\n}\n.edge .v-dot.selected {\n stroke: #29c229;\n fill: rgba(41, 194, 41, 0.1);\n}\n.edge .v-dot.selected:hover {\n stroke: #29c229;\n fill: rgba(41, 194, 41, 0.2);\n}\n.edge .v-dot.auto.selected {\n stroke: #777;\n fill: rgba(119, 119, 119, 0.1);\n}\n.edge .v-dot.auto.selected:hover {\n stroke: #777;\n fill: rgba(119, 119, 119, 0.2);\n}\ncircle#prj {\n fill: none;\n stroke: #777;\n}\n\n.nodeShadow {\n fill: none;\n stroke-width: 4px;\n stroke: rgba(0, 0, 0, 0.13);\n}\n\ng.node {\n user-select: none;\n cursor: default;\n}\n\ng.node.linked {\n cursor: pointer;\n}\n\ng.node text {\n pointer-events: none;\n}\n\n.icon {\n fill: #aaa;\n stroke: #fff;\n}\n#icon-cube {\n fill: #aaa;\n}\n\n/* Ensure all button icons are uncolored */\nbutton .icon,\nbutton svg,\nbutton path {\n fill: currentColor !important;\n stroke: none !important;\n}\n\n/* Font Awesome icon styling in buttons */\nbutton i {\n font-size: 12px;\n color: inherit;\n}\n\nrect.elastic {\n pointer-events: none;\n stroke: none;\n fill: #3bd8281f;\n display: none;\n}\nrect.elastic.on {\n display: block;\n}\n\n.popover {\n position: absolute;\n top: 50px;\n bottom: 10px;\n overflow: auto;\n right: 10px;\n background: ghostwhite;\n padding: 30px;\n box-shadow: 3px 3px 5px rgba(0,0,0, .2);\n border: solid 1px #eee;\n}\n\n.popover th {\n text-align: left;\n padding: 20px 0px 10px;\n}\n.popover td {\n padding-right: 20px;\n font-size: 14px;\n}\n\n/* Simple tooltip system with smart positioning */\n[data-tooltip] {\n position: relative;\n}\n\n[data-tooltip]:hover::after {\n content: attr(data-tooltip);\n position: absolute;\n top: 100%;\n left: 50%;\n transform: translateX(-50%);\n background: rgba(0, 0, 0, 0.9);\n color: white;\n padding: 6px 12px;\n border-radius: 4px;\n font-size: 12px !important;\n font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif !important;\n font-weight: normal !important;\n white-space: nowrap;\n z-index: 1000;\n pointer-events: none;\n margin-top: 5px;\n animation: tooltip-appear 0.1s ease-out;\n min-width: 120px;\n max-width: calc(100vw - 20px);\n box-sizing: border-box;\n}\n\n[data-tooltip]:hover::before {\n content: '';\n position: absolute;\n top: 100%;\n left: 50%;\n transform: translateX(-50%);\n border: 4px solid transparent;\n border-bottom-color: rgba(0, 0, 0, 0.9);\n z-index: 1000;\n pointer-events: none;\n margin-top: 1px;\n animation: tooltip-appear 0.1s ease-out;\n}\n\n/* Special handling for rightmost elements that might overflow */\n.toolbar-group:nth-last-child(-n+2) button[data-tooltip]:hover::after {\n /* Apply to last 2 toolbar groups (save and help buttons) */\n left: auto;\n right: 0;\n transform: none;\n}\n\n.toolbar-group:nth-last-child(-n+2) button[data-tooltip]:hover::before {\n /* Apply to last 2 toolbar groups (save and help buttons) */\n left: auto;\n right: 16px;\n transform: none;\n}\n\n@keyframes tooltip-appear {\n from {\n opacity: 0;\n transform: translateX(-50%) translateY(-5px);\n }\n to {\n opacity: 1;\n transform: translateX(-50%) translateY(0);\n }\n}\n\nselect {\n position: relative;\n}\n\n/* Robot shape internal elements - inherit stroke from parent node */\n.node .robot-eye-socket {\n fill: none;\n stroke: inherit;\n stroke-width: 2;\n}\n\n.node .robot-eye {\n fill: currentColor;\n stroke: none;\n}\n\n.node .robot-mouth {\n stroke: inherit;\n}\n\n.node .robot-antenna {\n stroke: inherit;\n}\n\n.node .robot-antenna-ball {\n fill: currentColor;\n stroke: inherit;\n stroke-width: 1.5;\n}\n\n.node .robot-panel {\n stroke: inherit;\n}\n\n.node .robot-indicator {\n fill: currentColor;\n stroke: none;\n}`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/style.css\"],\"names\":[],\"mappings\":\"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\",\"sourcesContent\":[\"html, body, #root {\\n height: 100%;\\n}\\n\\nbody {\\n font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\\n color: #666;\\n margin: 0;\\n}\\n\\n#root {\\n display: flex;\\n flex-direction: column;\\n}\\n#root > div.graph {\\n flex: 1;\\n overflow: auto;\\n position: relative;\\n}\\n\\n.toolbar {\\n display: flex;\\n justify-content: space-between;\\n align-items: center;\\n padding: 4px 10px;\\n background-color: #f0f0f0;\\n border-bottom: 1px solid #cccccc;\\n}\\n\\n.toolbar > div {\\n display: flex;\\n align-items: center;\\n}\\n\\n.toolbar button {\\n padding: 5px 8px;\\n margin: 0 2px;\\n cursor: pointer;\\n}\\n\\n.toolbar button:disabled {\\n opacity: 0.5;\\n cursor: not-allowed;\\n}\\n\\n/* Drag mode toggle button styles */\\n.toolbar button.mode-toggle {\\n position: relative;\\n border: 1px solid #8f9fc9;\\n width: 40px;\\n min-height: 28px;\\n background: linear-gradient(to bottom, #abb8db, #8f9fc9);\\n border-color: #8f9fc9;\\n color: white;\\n box-shadow: 2px 2px 2px rgba(0, 0, 0, .2);\\n}\\n\\n.toolbar button.mode-toggle:hover {\\n background: linear-gradient(to bottom, #bcc7e0, #abb8db);\\n border-color: #abb8db;\\n}\\n\\n.toolbar button.mode-toggle.select-mode:active {\\n background: linear-gradient(to bottom, #8f9fc9, #7a8bb5);\\n}\\n\\n/* Pan mode and active toggle - darker blue */\\n.toolbar button.mode-toggle.pan-mode,\\n.toolbar button.active-toggle {\\n background: linear-gradient(to bottom, #4a90e2, #357abd);\\n border-color: #2968a3;\\n box-shadow: inset 0 1px 2px rgba(0,0,0,0.2);\\n}\\n\\n.toolbar button.mode-toggle.pan-mode:hover,\\n.toolbar button.active-toggle:hover {\\n background: linear-gradient(to bottom, #5ba0f2, #4585c7);\\n}\\n\\n.toolbar button.mode-toggle.pan-mode:active {\\n background: linear-gradient(to bottom, #357abd, #2968a3);\\n box-shadow: inset 0 1px 2px rgba(0,0,0,0.2);\\n}\\n\\n/* Toggle buttons when inactive - gray styling */\\n.toolbar button.inactive-toggle {\\n background: #c1c1c1;\\n color: #999;\\n border-color: #c1c1c1;\\n box-shadow: none;\\n}\\n\\n.toolbar button.inactive-toggle:hover {\\n background: #b1b1b1;\\n}\\n\\n.toolbar button.inactive-toggle:active {\\n background: #a1a1a1;\\n}\\n\\n/* Toggle buttons when disabled and not active - gray like other disabled buttons */\\n.toolbar button.mode-toggle:disabled:not(.pan-mode):not(.active-toggle),\\n.toolbar button.active-toggle:disabled:not(.active-toggle) {\\n background: #c1c1c1;\\n color: #999;\\n border-color: #c1c1c1;\\n box-shadow: none;\\n}\\n\\n/* Ensure Font Awesome icons are sized appropriately if not already handled */\\n.toolbar button .fas {\\n font-size: 1em;\\n vertical-align: middle;\\n}\\n\\n/* Zoom percentage display */\\n.toolbar button.zoom-display {\\n font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;\\n font-size: 11px;\\n font-weight: 600;\\n font-variant-numeric: tabular-nums;\\n min-width: 50px; /* Wider to prevent size change between 99% and 100% */\\n padding: 6px 8px;\\n text-align: center;\\n}\\n\\n.toolbar-group {\\n display: flex;\\n align-items: center;\\n margin-right: 25px; /* Large space between groups */\\n}\\n\\n.toolbar-group:last-child {\\n margin-right: 0; /* Remove right margin from the last group (help button) */\\n}\\n\\nbutton {\\n border: none;\\n background: linear-gradient(to bottom, #4a90e2, #357abd);\\n border-color: #2968a3;\\n border-radius: 3px;\\n padding: 6px 10px;\\n color: #fff;\\n outline: none;\\n box-shadow: 2px 2px 2px rgba(0, 0, 0, .2);\\n margin-right: 5px;\\n min-width: 32px;\\n min-height: 28px;\\n display: inline-flex;\\n align-items: center;\\n justify-content: center;\\n font-size: 14px;\\n line-height: 1;\\n font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\\n position: relative;\\n}\\n\\nbutton:hover {\\n background: linear-gradient(to bottom, #5ba0f2, #4585c7);\\n}\\n\\nbutton:active {\\n background: linear-gradient(to bottom, #357abd, #2968a3);\\n}\\n\\nbutton:last-child {\\n margin-right: 0;\\n}\\n\\n/* Save button when no changes - gray */\\nbutton.action {\\n background: #c1c1c1;\\n color: #999;\\n}\\n\\nbutton.action:active {\\n background: #b1b1b1;\\n}\\n\\n/* Save button when there are changes - orange */\\nbutton.grp {\\n background: linear-gradient(to bottom, #ee9564, #de7d48);\\n margin-right: 0;\\n}\\n\\nbutton.grp:active {\\n background: #d67540;\\n}\\n\\n/* Auto-arrange button with AI purple to blue gradient */\\nbutton.auto-arrange {\\n background: linear-gradient(135deg, #6A4C93, #4a90e2);\\n border-color: #4a4c93;\\n}\\n\\nbutton.auto-arrange:hover {\\n background: linear-gradient(135deg, #7B5DAD, #5ba0f2);\\n border-color: #5a5ca3;\\n}\\n\\nbutton.auto-arrange:active {\\n background: linear-gradient(135deg, #593B83, #357abd);\\n border-color: #3a3c83;\\n}\\n\\nselect {\\n border: 1px solid #ccc;\\n background: white;\\n border-radius: 3px;\\n padding: 3px 7px;\\n color: #666;\\n outline: none;\\n margin-right: 5px;\\n font-size: 12px;\\n}\\n\\nselect:disabled {\\n background: #f5f5f5;\\n color: #999;\\n}\\n\\nbutton:disabled {\\n background: #c1c1c1;\\n color: #999;\\n}\\n\\n#root > div > svg {\\n position: absolute;\\n user-select: none;\\n}\\n\\n\\n.node.selected .nodeBorder, .edge.selected path, .edge.selected rect {\\n stroke: #29c229;\\n}\\n.edge .v-dot {\\n fill: transparent;\\n stroke: transparent;\\n stroke-width: 3px;\\n cursor: pointer;\\n transition: stroke 0.15s ease;\\n}\\n.edge .v-dot:hover {\\n stroke: #999;\\n fill: rgba(153, 153, 153, 0.1);\\n}\\n.edge .v-dot.selected {\\n stroke: #29c229;\\n fill: rgba(41, 194, 41, 0.1);\\n}\\n.edge .v-dot.selected:hover {\\n stroke: #29c229;\\n fill: rgba(41, 194, 41, 0.2);\\n}\\n.edge .v-dot.auto.selected {\\n stroke: #777;\\n fill: rgba(119, 119, 119, 0.1);\\n}\\n.edge .v-dot.auto.selected:hover {\\n stroke: #777;\\n fill: rgba(119, 119, 119, 0.2);\\n}\\ncircle#prj {\\n fill: none;\\n stroke: #777;\\n}\\n\\n.nodeShadow {\\n fill: none;\\n stroke-width: 4px;\\n stroke: rgba(0, 0, 0, 0.13);\\n}\\n\\ng.node {\\n user-select: none;\\n cursor: default;\\n}\\n\\ng.node.linked {\\n cursor: pointer;\\n}\\n\\ng.node text {\\n pointer-events: none;\\n}\\n\\n.icon {\\n fill: #aaa;\\n stroke: #fff;\\n}\\n#icon-cube {\\n fill: #aaa;\\n}\\n\\n/* Ensure all button icons are uncolored */\\nbutton .icon,\\nbutton svg,\\nbutton path {\\n fill: currentColor !important;\\n stroke: none !important;\\n}\\n\\n/* Font Awesome icon styling in buttons */\\nbutton i {\\n font-size: 12px;\\n color: inherit;\\n}\\n\\nrect.elastic {\\n pointer-events: none;\\n stroke: none;\\n fill: #3bd8281f;\\n display: none;\\n}\\nrect.elastic.on {\\n display: block;\\n}\\n\\n.popover {\\n position: absolute;\\n top: 50px;\\n bottom: 10px;\\n overflow: auto;\\n right: 10px;\\n background: ghostwhite;\\n padding: 30px;\\n box-shadow: 3px 3px 5px rgba(0,0,0, .2);\\n border: solid 1px #eee;\\n}\\n\\n.popover th {\\n text-align: left;\\n padding: 20px 0px 10px;\\n}\\n.popover td {\\n padding-right: 20px;\\n font-size: 14px;\\n}\\n\\n/* Simple tooltip system with smart positioning */\\n[data-tooltip] {\\n position: relative;\\n}\\n\\n[data-tooltip]:hover::after {\\n content: attr(data-tooltip);\\n position: absolute;\\n top: 100%;\\n left: 50%;\\n transform: translateX(-50%);\\n background: rgba(0, 0, 0, 0.9);\\n color: white;\\n padding: 6px 12px;\\n border-radius: 4px;\\n font-size: 12px !important;\\n font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif !important;\\n font-weight: normal !important;\\n white-space: nowrap;\\n z-index: 1000;\\n pointer-events: none;\\n margin-top: 5px;\\n animation: tooltip-appear 0.1s ease-out;\\n min-width: 120px;\\n max-width: calc(100vw - 20px);\\n box-sizing: border-box;\\n}\\n\\n[data-tooltip]:hover::before {\\n content: '';\\n position: absolute;\\n top: 100%;\\n left: 50%;\\n transform: translateX(-50%);\\n border: 4px solid transparent;\\n border-bottom-color: rgba(0, 0, 0, 0.9);\\n z-index: 1000;\\n pointer-events: none;\\n margin-top: 1px;\\n animation: tooltip-appear 0.1s ease-out;\\n}\\n\\n/* Special handling for rightmost elements that might overflow */\\n.toolbar-group:nth-last-child(-n+2) button[data-tooltip]:hover::after {\\n /* Apply to last 2 toolbar groups (save and help buttons) */\\n left: auto;\\n right: 0;\\n transform: none;\\n}\\n\\n.toolbar-group:nth-last-child(-n+2) button[data-tooltip]:hover::before {\\n /* Apply to last 2 toolbar groups (save and help buttons) */\\n left: auto;\\n right: 16px;\\n transform: none;\\n}\\n\\n@keyframes tooltip-appear {\\n from {\\n opacity: 0;\\n transform: translateX(-50%) translateY(-5px);\\n }\\n to {\\n opacity: 1;\\n transform: translateX(-50%) translateY(0);\\n }\\n}\\n\\nselect {\\n position: relative;\\n}\\n\\n/* Robot shape internal elements - inherit stroke from parent node */\\n.node .robot-eye-socket {\\n fill: none;\\n stroke: inherit;\\n stroke-width: 2;\\n}\\n\\n.node .robot-eye {\\n fill: currentColor;\\n stroke: none;\\n}\\n\\n.node .robot-mouth {\\n stroke: inherit;\\n}\\n\\n.node .robot-antenna {\\n stroke: inherit;\\n}\\n\\n.node .robot-antenna-ball {\\n fill: currentColor;\\n stroke: inherit;\\n stroke-width: 1.5;\\n}\\n\\n.node .robot-panel {\\n stroke: inherit;\\n}\\n\\n.node .robot-indicator {\\n fill: currentColor;\\n stroke: none;\\n}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","\n import API from \"!../node_modules/.pnpm/style-loader@4.0.0_webpack@5.109.2/node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../node_modules/.pnpm/style-loader@4.0.0_webpack@5.109.2/node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../node_modules/.pnpm/style-loader@4.0.0_webpack@5.109.2/node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../node_modules/.pnpm/style-loader@4.0.0_webpack@5.109.2/node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../node_modules/.pnpm/style-loader@4.0.0_webpack@5.109.2/node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../node_modules/.pnpm/style-loader@4.0.0_webpack@5.109.2/node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../node_modules/.pnpm/css-loader@7.1.4_webpack@5.109.2/node_modules/css-loader/dist/cjs.js!./fonts.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../node_modules/.pnpm/css-loader@7.1.4_webpack@5.109.2/node_modules/css-loader/dist/cjs.js!./fonts.css\";\n export default content && content.locals ? content.locals : undefined;\n","\n import API from \"!../node_modules/.pnpm/style-loader@4.0.0_webpack@5.109.2/node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../node_modules/.pnpm/style-loader@4.0.0_webpack@5.109.2/node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../node_modules/.pnpm/style-loader@4.0.0_webpack@5.109.2/node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../node_modules/.pnpm/style-loader@4.0.0_webpack@5.109.2/node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../node_modules/.pnpm/style-loader@4.0.0_webpack@5.109.2/node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../node_modules/.pnpm/style-loader@4.0.0_webpack@5.109.2/node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../node_modules/.pnpm/css-loader@7.1.4_webpack@5.109.2/node_modules/css-loader/dist/cjs.js!./style.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../node_modules/.pnpm/css-loader@7.1.4_webpack@5.109.2/node_modules/css-loader/dist/cjs.js!./style.css\";\n export default content && content.locals ? content.locals : undefined;\n"],"names":["el","style","Object","keys","forEach","key","value","setProperty","toString","nodeBorder","fill","stroke","filter","nodeText","edgeText","edgeRect","groupRect","groupText","cursor","thickness","color","opacity","fontSize","dashed","p1","p2","Math","sqrt","x","y","width","height","background","shape","calculateEdgeVertices","edge","n1","from","n2","to","vertices","concat","unshift","push","interior","slice","firstRoutingVertex","find","vertex","label","lastRoutingVertex","index","length","intersect","Error","id","calculateLabelPlacement","position","defaultPoint","segment","point","labelIndex","findIndex","movable","labelVertex","auto","adjacentSegments","p","q","reduce","longest","candidate","_constants__WEBPACK_IMPORTED_MODULE_0__","gd","undefined","targetLength","sum","traversed","segmentPosition","horizontalDistance","abs","verticalDistance","orientation","createEdgePath","path","Symbol","GeometryValidationError","issues","constructor","super","map","issue","message","join","this","name","validateResolvedLayout","measured","resolved","diagramId","checkUniqueIDs","nodes","node","groups","group","edges","checkCoverage","measuredNodes","Map","measuredGroups","resolvedNodes","resolvedGroups","checkFiniteRect","bounds","expected","get","nearlyEqual","size","contentSize","checkRectInBounds","titleBounds","contains","titleSize","forEachPair","first","second","overlaps","checkNodeOverlaps","checkGroupOverlaps","child","parentId","parent","checkOwnership","measuredEdges","labels","sourceId","targetId","sections","some","section","checkSectionConnections","isFinitePoint","pointInRect","values","routeIntersectsRect","inset","sourceInside","belongsToGroup","routeViolatesGroup","labelBounds","labelSize","checkEdges","ids","seen","Set","has","add","actual","expectedIDs","actualIDs","rect","Number","isFinite","isFiniteRect","samePoint","source","target","start","end","pointOnBorder","nodeId","groupId","shouldBeInside","dx","dy","minimum","maximum","origin","delta","lower","upper","EPSILON","max","min","segmentIntersectsRect","outer","inner","inclusive","amount","withinX","withinY","onVertical","onHorizontal","items","visit","code","elementIds","measuredText","measurementSVG","measureSVGText","text","attrs","attributes","entries","sort","localeCompare","JSON","stringify","measurementKey","cached","document","createElementNS","setAttribute","textContent","isConnected","visibility","pointerEvents","body","appendChild","getBBox","remove","set","svgTextWrap","maxW","lines","trim","split","flatMap","paragraph","paragraphLines","currentLine","word","parts","breakLongWord","part","nextLine","line","maxWidth","currentPart","character","nextPart","create","element","type","className","k","v","String","classList","use","setAttributeNS","d","t","textArea","bold","anchor","txt","i","span","append","r","rx","ry","icon","expand","expanded","g","transform","setPosition","insideBox","b","centeredBox","intersectRect","box","w","h","s","q1","q2","denominator","a","numerator1","numerator2","result","onLine1","onLine2","segmentIntersection","ret","intersectRectFull","intersectEllipse","ellCenter","nodeCenter","si","c","radicand_sqrt","pos","project","atob","len","dot","cabDistance","cylinderRadiusY","shapeLabelOffsetY","toLowerCase","D3Element","_el","attr","insert","el2","insertBefore","querySelector","bbox","rounded","shapeSvg","_ellipse","mobiledeviceportrait","shapes","roundedbox","component","cylinder","cy","person","circle","ellipse","hexagon","sz","n","folder","mobiledevicelandscape","mobiledevice","pipe","robot","headSize","headR","antennaH","antennaR","eyeR","eyeSpacing","earW","earH","bodyW","bodyTop","bodyH","headTop","eyeY","mouthY","mouthW","webbrowser","Undo","versions","lastSavedPos","exportDoc","importDoc","change","tmpPreviousState","func","timeout","context","clearTimeout","setTimeout","apply","debounce","saveNow","beforeChange","deepClone","currentState","splice","doc","structuredClone","parse","undo","redo","changed","setSaved","textBlock","gapAfter","field","wrapped","constants","M5","lineHeight","defaultEdgeStyle","Y$","defaultNodeStyle","nD","GraphData","nodesMap","edgeVertices","groupsMap","metadata","layoutDirection","validatedLayout","colorToVarMap","_undo","_gridVisible","_snapToGrid","_gridSize","_skipAutoFit","exportLayout","lo","importLayout","window","graph","init","layout","addNode","sub","description","link","nodeStyle","minimumHeight","contentLayout","title","subtitle","nodeWidth","textWidth","HORIZONTAL_PADDING","blocks","textHeight","block","VERTICAL_PADDING","layoutNodeContent","requiredHeight","Array","addEdge","fromNode","toNode","initVertex","edgeID","input","charCodeAt","imul","fnv1a36","stableVertexID","userDeletedVertices","addGroup","nodesOrGroups","console","error","Boolean","setNodeSelected","selected","ref","updateEdgesSel","e","clearResolvedLayout","layoutSections","layoutLabelBounds","layoutBounds","layoutTitleBounds","moveNode","disableSnap","skipUndo","snapped","snapToGrid","redrawEdges","redrawGroups","moveEdgeVertex","redrawEdge","moveSelected","insertEdgeVertex","isLabel","deleteEdgeVertex","indexOf","delete","alignTopLeft","contentBounds","calculateContentBounds","offsetX","offsetY","resetPanTransform","currentZoom","getZoom","zoomGroup","svg","graphData","bb","zoom","parentElement","clientWidth","clientHeight","updatePanningOptimized","clearViewState","shouldSkipAutoFit","resetView","updatePanning","removeChild","buildEdge","buildGroup","exportSVG","U","originalSvg","exportSvg","cloneNode","querySelectorAll","getAttribute","removeAttribute","exportElastic","exportWidth","padding","exportHeight","exportZoomGroup","convertStylesToCustomProperties","script","createElement","replace","firstChild","outerHTML","minX","Infinity","minY","maxX","maxY","left","right","top","bottom","centerX","centerY","approxLabelSize","full","lst","rerender","requiredSavedPoint","endsWith","edgeId","startsWith","isArray","saved","autoLayout","options","placedNode","placedGroup","placedEdge","interiorRoutePoints","validated","fitToView","alignSelectionV","alignSelectionH","distributeSelectionH","selectedNodes","selectedVertices","allElements","spacing","newX","distributeSelectionV","newY","setEdgeSelected","viewportWidth","viewportHeight","zoomX","zoomY","optimalZoom","finalZoom","translateX","translateY","saveViewState","saveLayoutState","restoreLayoutState","state","isGridVisible","isSnapToGrid","getGridSize","toggleGrid","updateGridDisplay","dispatchEvent","CustomEvent","toggleSnapToGrid","snapAllToGrid","snappedX","round","snappedY","existingGrid","existingGridRect","defs","pattern","route","previous","clickListener","addEventListener","selectListener","dragging","buildGraph","data","onNodeSelect","dragMode","innerHTML","__data","_buildGraph","elasticEl","addCursorInteraction","setZoom","buildGraphView","zoomG","nodesG","edgesG","groupsG","gdata","href","exportHref","content","shapeType","AV","styles","setBorderStyle","border","tg","buildNodeContent","buildNode","completeRoutePoints","edge_utils","l","bg","buildPlacedEdgeLabel","placement","buildEdgeLabel","IW","Zr","cx","p0","topExtension","bottomExtension","hexHeight","pad","findClosestSegment","fnd","dst","POSITIVE_INFINITY","prj","pts","mouseToDrawing","getBoundingClientRect","z","currentTransform","getCurrentTransform","clientX","clientY","addCustomCursorInteraction","conn","ini","elastic","isPanning","panStartX","panStartY","initialTransform","pendingSelectionChange","pendingNavigation","hasDragged","suppressLinkClick","eventListeners","onClick","Element","closest","preventDefault","stopPropagation","md","convertEvent","changedTouches","onMouseMoveHandler","getSelection","setSelection","setTransform","drawingDx","drawingDy","item","setDragging","update","onMouseMove","ex","ey","onMouseUpHandler","removeEventListener","navigation","boxSelection","shiftKey","location","onMouseUp","onMouseDownHandler","nodeFromEvent","effectiveMode","isSelected","translateMatch","match","parseFloat","getCurrentTransformLocal","startDrawingX","startDrawingY","pt","currentPt","currentDrawingX","currentDrawingY","createElastic","onMouseDown","event","handler","addDnd","existingCleanup","__cursorInteractionCleanup","getData","beforeUnloadHandler","returnValue","setDotSelected","dotEl","mouseMoveHandler","altKey","removePrjDot","keyUpHandler","shortcuts","Yp","Zj","_s","clickHandler","wheelHandler","sign","deltaY","newZoom","setZoomCentered","keyDownHandler","shortcut","bl","Ur","hU","i1","mD","F","Gn","customInteractionCleanup","handles","handle","b1","b2","scaleMatch","oldZoom","container","newTranslateX","newTranslateY","viewStateCache","graphId","restoreViewState","defaultOptions","direction","nodeSpacing","layerSpacing","async","resolveAutomatic","diagram","checkMeasuredLinks","childrenByParent","groupsByParent","elkGroups","children","layoutOptions","groupLayoutOptions","root","rootLayoutOptions","owner","lowestCommonGroup","buildLayoutTree","elk","__webpack_require__","then","bind","module","default","readContainer","readResolvedLayout","sources","targets","titleHeight","sourceGroups","parentGroups","targetGroups","current","parentX","parentY","containerX","containerY","childX","requiredNumber","childY","measuredNode","measuredGroup","requiredLabel","readEdge","addOffset","startPoint","bendPoints","endPoint","requiredEndpoint","elementId","endpoints","siblings","fonts","ready","measureGraph","compactLayout","geometry","centerOffset","validateCurrentLayout","boundary","SVGGraphicsElement","copyBox","snapshot","completeSnapshot","resolveManual","nodeParents","groupParents","member","parents","isGroup","existing","declaredParents","checkMeasuredBox","measureNode","measureGroup","measureEdge","hasLabel","boxes","points","flat","layoutDirections","TopBottom","BottomTop","LeftRight","RightLeft","model","viewsList","views","layouts","viewKey","elements","relations","collectRels","relationships","rel","people","softwareSystems","containers","el1","components","deploymentNodes","containerInstances","containerId","recAddNodes","infrastructureNodes","view","getView","_graph_view_graph__WEBPACK_IMPORTED_MODULE_0__","jg","rankDirection","automaticLayout","version","groupingIDs","softwareSystemId","enterprise","cssClassName","tag","varPrefix","elementViewKey","containerViews","lookupContainerViewKey","tags","technology","encodedViewKey","encodeURIComponent","url","nodeLink","properties","warn","destinationId","routing","level","groupMembers","ADD_VERTEX","ADD_LABEL_VERTEX","DEL_VERTEX","ZOOM_IN","ZOOM_OUT","ZOOM_FIT","ZOOM_100","SELECT_ALL","DESELECT","MOVE_LEFT","MOVE_RIGHT","MOVE_UP","MOVE_DOWN","MOVE_LEFT_FINE","MOVE_RIGHT_FINE","MOVE_UP_FINE","MOVE_DOWN_FINE","TOGGLE_DRAG_MODE","ALIGN_HORIZONTAL","ALIGN_VERTICAL","DISTRIBUTE_HORIZONTAL","DISTRIBUTE_VERTICAL","AUTO_LAYOUT","RESET_POSITION","TOGGLE_GRID","TOGGLE_SNAP_TO_GRID","SNAP_ALL_TO_GRID","list","help","combinations","shift","ctrl","alt","click","wheel","shortcutMap","comboText","_utils_platform__WEBPACK_IMPORTED_MODULE_1__","sy","toUpperCase","react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__","jsxs","jsx","Fragment","colSpan","matches","SA","ke","checkKey","aShortcut","bShortcut","aModifiers","bModifiers","aCount","isMac","navigator","userAgentData","platform","includes","userAgent","KeyboardEvent","metaKey","test","ctrlKey","___CSS_LOADER_URL_IMPORT_0___","URL","___CSS_LOADER_URL_IMPORT_1___","___CSS_LOADER_URL_IMPORT_2___","___CSS_LOADER_URL_IMPORT_3___","___CSS_LOADER_EXPORT___","_node_modules_pnpm_css_loader_7_1_4_webpack_5_109_2_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default","_node_modules_pnpm_css_loader_7_1_4_webpack_5_109_2_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default","___CSS_LOADER_URL_REPLACEMENT_0___","_node_modules_pnpm_css_loader_7_1_4_webpack_5_109_2_node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default","___CSS_LOADER_URL_REPLACEMENT_1___","___CSS_LOADER_URL_REPLACEMENT_2___","___CSS_LOADER_URL_REPLACEMENT_3___","names","mappings","sourcesContent","sourceRoot","__WEBPACK_DEFAULT_EXPORT__","styleTagTransform","_node_modules_pnpm_style_loader_4_0_0_webpack_5_109_2_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default","setAttributes","_node_modules_pnpm_style_loader_4_0_0_webpack_5_109_2_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default","_node_modules_pnpm_style_loader_4_0_0_webpack_5_109_2_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default","domAPI","_node_modules_pnpm_style_loader_4_0_0_webpack_5_109_2_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default","insertStyleElement","_node_modules_pnpm_style_loader_4_0_0_webpack_5_109_2_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default","_node_modules_pnpm_style_loader_4_0_0_webpack_5_109_2_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default","_node_modules_pnpm_css_loader_7_1_4_webpack_5_109_2_node_modules_css_loader_dist_cjs_js_fonts_css__WEBPACK_IMPORTED_MODULE_6__","A","locals","_node_modules_pnpm_css_loader_7_1_4_webpack_5_109_2_node_modules_css_loader_dist_cjs_js_style_css__WEBPACK_IMPORTED_MODULE_6__"],"sourceRoot":""} \ No newline at end of file diff --git a/cmd/mdl/webapp/dist/69a8d1d484967aba2389.woff2 b/cmd/mdl/webapp/dist/69a8d1d484967aba2389.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..d1897949fda5c7fc5f04622df43a3fcba5b89d84 GIT binary patch literal 24452 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 literal 0 HcmV?d00001 diff --git a/cmd/mdl/webapp/dist/948.js b/cmd/mdl/webapp/dist/948.js index 7bb5a09c..6f91b6d8 100644 --- a/cmd/mdl/webapp/dist/948.js +++ b/cmd/mdl/webapp/dist/948.js @@ -1,2 +1,2 @@ -"use strict";(self.webpackChunkapp=self.webpackChunkapp||[]).push([[948],{948(e,n,r){var t=r(763),u=r(408),s=r(987);r.d(n,["Graph",0,({data:e,onSelect:n,onReady:r,dragMode:i})=>{const[a,d]=(0,t.useState)(null),o=(0,t.useRef)(null);return(0,t.useEffect)(()=>{if(!o.current)return;o.current.innerHTML="";const t=(0,u.ZG)(e,e=>n(e?e.id:null),i);o.current.append(t.svg),d(t),(0,u.F_)(e.id)||e.shouldSkipAutoFit()||e.fitToView(),r();const s=()=>{e?.id&&(0,u.Kp)(e.id)};return window.addEventListener("beforeunload",s),()=>{e?.id&&(0,u.Kp)(e.id),window.removeEventListener("beforeunload",s),o.current&&(o.current.innerHTML="")}},[e,n,r]),(0,t.useEffect)(()=>{if(a?.svg){const e=a.svg,n=e.__cursorInteractionCleanup;n&&n(),(0,u.Qy)(e,i)}},[i,a]),(0,s.jsx)("div",{className:"graph",ref:o})}])}}]); +"use strict";(self.webpackChunkapp=self.webpackChunkapp||[]).push([[948],{948(e,n,r){var t=r(763),u=r(828),s=r(987);r.d(n,["Graph",0,({data:e,onSelect:n,dragMode:r})=>{const[i,a]=(0,t.useState)(null),d=(0,t.useRef)(null);return(0,t.useEffect)(()=>{if(!d.current)return;d.current.innerHTML="";const t=(0,u.ZG)(e,e=>n(e?e.id:null),r);d.current.append(t.svg),a(t),(0,u.F_)(e.id)||e.shouldSkipAutoFit()||e.fitToView();const s=()=>{e?.id&&(0,u.Kp)(e.id)};return window.addEventListener("beforeunload",s),()=>{e?.id&&(0,u.Kp)(e.id),window.removeEventListener("beforeunload",s),d.current&&(d.current.innerHTML="")}},[e,n]),(0,t.useEffect)(()=>{if(i?.svg){const e=i.svg,n=e.__cursorInteractionCleanup;n&&n(),(0,u.Qy)(e,r)}},[r,i]),(0,s.jsx)("div",{className:"graph",ref:d})}])}}]); //# sourceMappingURL=948.js.map \ No newline at end of file diff --git a/cmd/mdl/webapp/dist/948.js.map b/cmd/mdl/webapp/dist/948.js.map index ae0e5214..71ee2034 100644 --- a/cmd/mdl/webapp/dist/948.js.map +++ b/cmd/mdl/webapp/dist/948.js.map @@ -1 +1 @@ -{"version":3,"file":"948.js","mappings":"qIAUgC,EAAEA,OAAMC,WAAUC,UAASC,eAC1D,MAAOC,EAAYC,IAAiB,EAAAC,EAAAC,UAAc,MAC5CC,GAAM,EAAAF,EAAAG,QAAuB,MA2DnC,OAxDA,EAAAH,EAAAI,WAAU,KACT,IAAKF,EAAIG,QAAS,OAGlBH,EAAIG,QAAQC,UAAY,GAGxB,MAAMC,GAAI,EAAAC,EAAAC,IAAWf,EAAOgB,GAAmBf,EAASe,EAAIA,EAAEC,GAAK,MAAOd,GAC1EK,EAAIG,QAAQO,OAAOL,EAAEM,KACrBd,EAAcQ,IAIT,EAAAC,EAAAM,IAAiBpB,EAAKiB,KAAQjB,EAAKqB,qBACvCrB,EAAKsB,YAENpB,IAGA,MAAMqB,EAAqB,KACtBvB,GAAMiB,KACT,EAAAH,EAAAU,IAAcxB,EAAKiB,KAMrB,OAFAQ,OAAOC,iBAAiB,eAAgBH,GAEjC,KAEFvB,GAAMiB,KACT,EAAAH,EAAAU,IAAcxB,EAAKiB,IAGpBQ,OAAOE,oBAAoB,eAAgBJ,GAEvCf,EAAIG,UACPH,EAAIG,QAAQC,UAAY,MAGxB,CAACZ,EAAMC,EAAUC,KAGpB,EAAAI,EAAAI,WAAU,KACT,GAAIN,GAAYe,IAAK,CAEpB,MAAMA,EAAMf,EAAWe,IACjBS,EAAmBT,EAAYU,2BACjCD,GACHA,KAID,EAAAd,EAAAgB,IAAqBX,EAAKhB,EAC3B,GACE,CAACA,EAAUC,KAEP,EAAA2B,EAAAC,KAAA,OAAKC,UAAU,QAAQzB,IAAKA","sources":["webpack://app/./src/graph-view/graph-react.tsx"],"sourcesContent":["import React, {FC, useEffect, useRef, useState} from \"react\";\nimport {buildGraph, GraphData, Node, addCursorInteraction, restoreViewState, saveViewState} from \"./graph\";\n\ninterface Props {\n\tdata: GraphData;\n\tonSelect: (nodeName: string | null) => void;\n\tonReady: () => void;\n\tdragMode: 'pan' | 'select';\n}\n\nexport const Graph: FC = ({data, onSelect, onReady, dragMode}) => {\n\tconst [graphState, setGraphState] = useState(null);\n\tconst ref = useRef(null);\n\n\t// Single effect for building the graph and handling all setup/cleanup\n\tuseEffect(() => {\n\t\tif (!ref.current) return;\n\n\t\t// Clear previous content\n\t\tref.current.innerHTML = '';\n\n\t\t// Build graph with current props\n\t\tconst g = buildGraph(data, (n: Node | null) => onSelect(n ? n.id : null), dragMode);\n\t\tref.current.append(g.svg);\n\t\tsetGraphState(g);\n\t\t\n\t\t// Try to restore previous view state, otherwise use auto fit\n\t\t// Skip auto fit if we're in the middle of a reset operation to prevent infinite loop\n\t\tif (!restoreViewState(data.id) && !data.shouldSkipAutoFit()) {\n\t\t\tdata.fitToView();\n\t\t}\n\t\tonReady();\n\n\t\t// Save view state before page unload\n\t\tconst handleBeforeUnload = () => {\n\t\t\tif (data?.id) {\n\t\t\t\tsaveViewState(data.id);\n\t\t\t}\n\t\t};\n\t\t\n\t\twindow.addEventListener('beforeunload', handleBeforeUnload);\n\n\t\treturn () => {\n\t\t\t// Save view state before cleanup\n\t\t\tif (data?.id) {\n\t\t\t\tsaveViewState(data.id);\n\t\t\t}\n\t\t\t\n\t\t\twindow.removeEventListener('beforeunload', handleBeforeUnload);\n\t\t\t\n\t\t\tif (ref.current) {\n\t\t\t\tref.current.innerHTML = '';\n\t\t\t}\n\t\t};\n\t}, [data, onSelect, onReady]);\n\n\t// Effect for updating drag mode on existing graph\n\tuseEffect(() => {\n\t\tif (graphState?.svg) {\n\t\t\t// Clean up existing cursor interaction\n\t\t\tconst svg = graphState.svg;\n\t\t\tconst existingCleanup = (svg as any).__cursorInteractionCleanup;\n\t\t\tif (existingCleanup) {\n\t\t\t\texistingCleanup();\n\t\t\t}\n\t\t\t\n\t\t\t// Set up cursor interaction with current drag mode\n\t\t\taddCursorInteraction(svg, dragMode);\n\t\t}\n\t}, [dragMode, graphState]);\n\n\treturn
;\n}"],"names":["data","onSelect","onReady","dragMode","graphState","setGraphState","react__WEBPACK_IMPORTED_MODULE_0__","useState","ref","useRef","useEffect","current","innerHTML","g","_graph__WEBPACK_IMPORTED_MODULE_1__","ZG","n","id","append","svg","F_","shouldSkipAutoFit","fitToView","handleBeforeUnload","Kp","window","addEventListener","removeEventListener","existingCleanup","__cursorInteractionCleanup","Qy","react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__","jsx","className"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"948.js","mappings":"qIASgC,EAAEA,OAAMC,WAAUC,eACjD,MAAOC,EAAYC,IAAiB,EAAAC,EAAAC,UAAc,MAC5CC,GAAM,EAAAF,EAAAG,QAAuB,MAyDnC,OAtDA,EAAAH,EAAAI,WAAU,KACT,IAAKF,EAAIG,QAAS,OAGlBH,EAAIG,QAAQC,UAAY,GAGxB,MAAMC,GAAI,EAAAC,EAAAC,IAAWd,EAAOe,GAAmBd,EAASc,EAAIA,EAAEC,GAAK,MAAOd,GAC1EK,EAAIG,QAAQO,OAAOL,EAAEM,KACrBd,EAAcQ,IAIT,EAAAC,EAAAM,IAAiBnB,EAAKgB,KAAQhB,EAAKoB,qBACvCpB,EAAKqB,YAGN,MAAMC,EAAqB,KACtBtB,GAAMgB,KACT,EAAAH,EAAAU,IAAcvB,EAAKgB,KAMrB,OAFAQ,OAAOC,iBAAiB,eAAgBH,GAEjC,KAEFtB,GAAMgB,KACT,EAAAH,EAAAU,IAAcvB,EAAKgB,IAGpBQ,OAAOE,oBAAoB,eAAgBJ,GAEvCf,EAAIG,UACPH,EAAIG,QAAQC,UAAY,MAGxB,CAACX,EAAMC,KAGV,EAAAI,EAAAI,WAAU,KACT,GAAIN,GAAYe,IAAK,CAEpB,MAAMA,EAAMf,EAAWe,IACjBS,EAAmBT,EAAYU,2BACjCD,GACHA,KAID,EAAAd,EAAAgB,IAAqBX,EAAKhB,EAC3B,GACE,CAACA,EAAUC,KAEP,EAAA2B,EAAAC,KAAA,OAAKC,UAAU,QAAQzB,IAAKA","sources":["webpack://app/./src/graph-view/graph-react.tsx"],"sourcesContent":["import React, {FC, useEffect, useRef, useState} from \"react\";\nimport {buildGraph, GraphData, Node, addCursorInteraction, restoreViewState, saveViewState} from \"./graph\";\n\ninterface Props {\n\tdata: GraphData;\n\tonSelect: (nodeName: string | null) => void;\n\tdragMode: 'pan' | 'select';\n}\n\nexport const Graph: FC = ({data, onSelect, dragMode}) => {\n\tconst [graphState, setGraphState] = useState(null);\n\tconst ref = useRef(null);\n\n\t// Single effect for building the graph and handling all setup/cleanup\n\tuseEffect(() => {\n\t\tif (!ref.current) return;\n\n\t\t// Clear previous content\n\t\tref.current.innerHTML = '';\n\n\t\t// Build graph with current props\n\t\tconst g = buildGraph(data, (n: Node | null) => onSelect(n ? n.id : null), dragMode);\n\t\tref.current.append(g.svg);\n\t\tsetGraphState(g);\n\t\t\n\t\t// Try to restore previous view state, otherwise use auto fit\n\t\t// Skip auto fit if we're in the middle of a reset operation to prevent infinite loop\n\t\tif (!restoreViewState(data.id) && !data.shouldSkipAutoFit()) {\n\t\t\tdata.fitToView();\n\t\t}\n\t\t// Save view state before page unload\n\t\tconst handleBeforeUnload = () => {\n\t\t\tif (data?.id) {\n\t\t\t\tsaveViewState(data.id);\n\t\t\t}\n\t\t};\n\t\t\n\t\twindow.addEventListener('beforeunload', handleBeforeUnload);\n\n\t\treturn () => {\n\t\t\t// Save view state before cleanup\n\t\t\tif (data?.id) {\n\t\t\t\tsaveViewState(data.id);\n\t\t\t}\n\t\t\t\n\t\t\twindow.removeEventListener('beforeunload', handleBeforeUnload);\n\t\t\t\n\t\t\tif (ref.current) {\n\t\t\t\tref.current.innerHTML = '';\n\t\t\t}\n\t\t};\n\t}, [data, onSelect]);\n\n\t// Effect for updating drag mode on existing graph\n\tuseEffect(() => {\n\t\tif (graphState?.svg) {\n\t\t\t// Clean up existing cursor interaction\n\t\t\tconst svg = graphState.svg;\n\t\t\tconst existingCleanup = (svg as any).__cursorInteractionCleanup;\n\t\t\tif (existingCleanup) {\n\t\t\t\texistingCleanup();\n\t\t\t}\n\t\t\t\n\t\t\t// Set up cursor interaction with current drag mode\n\t\t\taddCursorInteraction(svg, dragMode);\n\t\t}\n\t}, [dragMode, graphState]);\n\n\treturn
;\n}"],"names":["data","onSelect","dragMode","graphState","setGraphState","react__WEBPACK_IMPORTED_MODULE_0__","useState","ref","useRef","useEffect","current","innerHTML","g","_graph__WEBPACK_IMPORTED_MODULE_1__","ZG","n","id","append","svg","F_","shouldSkipAutoFit","fitToView","handleBeforeUnload","Kp","window","addEventListener","removeEventListener","existingCleanup","__cursorInteractionCleanup","Qy","react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__","jsx","className"],"sourceRoot":""} \ No newline at end of file diff --git a/cmd/mdl/webapp/dist/b7c27c60f848f2083f45.woff2 b/cmd/mdl/webapp/dist/b7c27c60f848f2083f45.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..54f0a595dd3c76344a980109e7517ed42416de93 GIT binary patch literal 24272 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 literal 0 HcmV?d00001 diff --git a/cmd/mdl/webapp/dist/fontawesome.js b/cmd/mdl/webapp/dist/fontawesome.js index 1eae3d35..dcbd3d18 100644 --- a/cmd/mdl/webapp/dist/fontawesome.js +++ b/cmd/mdl/webapp/dist/fontawesome.js @@ -1,2 +1,2 @@ -"use strict";(self.webpackChunkapp=self.webpackChunkapp||[]).push([[453],{804(n,a,A){var f=A(220),e=A.n(f),E=A(716),i=A.n(E),r=A(247),t=A.n(r),C=new URL(A(438),A.b),o=new URL(A(502),A.b),s=new URL(A(322),A.b),c=new URL(A(999),A.b),l=i()(e()),d=t()(C),m=t()(o),u=t()(s),b=t()(c);l.push([n.id,`/*!\n * Font Awesome Free 7.3.1 by @fontawesome - https://fontawesome.com\n * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)\n * Copyright 2026 Fonticons, Inc.\n */\n.fa-solid,\n.fa-regular,\n.fa-brands,\n.fa-classic,\n.fas,\n.far,\n.fab,\n.fa {\n --_fa-family: var(--fa-family, var(--fa-style-family, 'Font Awesome 7 Free'));\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n display: var(--fa-display, inline-block);\n font-family: var(--_fa-family);\n font-feature-settings: normal;\n font-style: normal;\n font-synthesis: none;\n font-variant: normal;\n font-weight: var(--fa-style, 900);\n line-height: 1;\n text-align: center;\n text-rendering: auto;\n width: var(--fa-width, 1.25em);\n}\n\n:is(.fas,\n.far,\n.fab,\n.fa-solid,\n.fa-regular,\n.fa-brands,\n.fa-classic,\n.fa)::before {\n content: var(--fa)/"";\n}\n\n@supports not (content: ""/"") {\n :is(.fas,\n .far,\n .fab,\n .fa-solid,\n .fa-regular,\n .fa-brands,\n .fa-classic,\n .fa)::before {\n content: var(--fa);\n }\n}\n.fa-1x {\n font-size: 1em;\n}\n\n.fa-2x {\n font-size: 2em;\n}\n\n.fa-3x {\n font-size: 3em;\n}\n\n.fa-4x {\n font-size: 4em;\n}\n\n.fa-5x {\n font-size: 5em;\n}\n\n.fa-6x {\n font-size: 6em;\n}\n\n.fa-7x {\n font-size: 7em;\n}\n\n.fa-8x {\n font-size: 8em;\n}\n\n.fa-9x {\n font-size: 9em;\n}\n\n.fa-10x {\n font-size: 10em;\n}\n\n.fa-2xs {\n font-size: calc(10 / 16 * 1em); /* converts a 10px size into an em-based value that's relative to the scale's 16px base */\n line-height: calc(1 / 10 * 1em); /* sets the line-height of the icon back to that of it's parent */\n vertical-align: calc((6 / 10 - 0.375) * 1em); /* vertically centers the icon taking into account the surrounding text's descender */\n}\n\n.fa-xs {\n font-size: calc(12 / 16 * 1em); /* converts a 12px size into an em-based value that's relative to the scale's 16px base */\n line-height: calc(1 / 12 * 1em); /* sets the line-height of the icon back to that of it's parent */\n vertical-align: calc((6 / 12 - 0.375) * 1em); /* vertically centers the icon taking into account the surrounding text's descender */\n}\n\n.fa-sm {\n font-size: calc(14 / 16 * 1em); /* converts a 14px size into an em-based value that's relative to the scale's 16px base */\n line-height: calc(1 / 14 * 1em); /* sets the line-height of the icon back to that of it's parent */\n vertical-align: calc((6 / 14 - 0.375) * 1em); /* vertically centers the icon taking into account the surrounding text's descender */\n}\n\n.fa-lg {\n font-size: calc(20 / 16 * 1em); /* converts a 20px size into an em-based value that's relative to the scale's 16px base */\n line-height: calc(1 / 20 * 1em); /* sets the line-height of the icon back to that of it's parent */\n vertical-align: calc((6 / 20 - 0.375) * 1em); /* vertically centers the icon taking into account the surrounding text's descender */\n}\n\n.fa-xl {\n font-size: calc(24 / 16 * 1em); /* converts a 24px size into an em-based value that's relative to the scale's 16px base */\n line-height: calc(1 / 24 * 1em); /* sets the line-height of the icon back to that of it's parent */\n vertical-align: calc((6 / 24 - 0.375) * 1em); /* vertically centers the icon taking into account the surrounding text's descender */\n}\n\n.fa-2xl {\n font-size: calc(32 / 16 * 1em); /* converts a 32px size into an em-based value that's relative to the scale's 16px base */\n line-height: calc(1 / 32 * 1em); /* sets the line-height of the icon back to that of it's parent */\n vertical-align: calc((6 / 32 - 0.375) * 1em); /* vertically centers the icon taking into account the surrounding text's descender */\n}\n\n.fa-width-auto {\n --fa-width: auto;\n}\n\n.fa-fw,\n.fa-width-fixed {\n --fa-width: 1.25em;\n}\n\n.fa-canvas-square {\n padding-block: 0.125em;\n margin-block-end: -0.125em;\n}\n\n.fa-canvas-roomy {\n padding-block: 0.25em;\n padding-inline: 0.125em;\n margin-block-end: -0.25em;\n box-sizing: content-box;\n}\n\n.fa-ul {\n list-style-type: none;\n margin-inline-start: var(--fa-li-margin, 2.5em);\n padding-inline-start: 0;\n}\n.fa-ul > li {\n position: relative;\n}\n\n.fa-li {\n inset-inline-start: calc(-1 * var(--fa-li-width, 2em));\n position: absolute;\n text-align: center;\n width: var(--fa-li-width, 2em);\n line-height: inherit;\n}\n\n/* Heads Up: Bordered Icons will not be supported in the future!\n - This feature will be deprecated in the next major release of Font Awesome (v8)!\n - You may continue to use it in this version *v7), but it will not be supported in Font Awesome v8.\n*/\n/* Notes:\n* --@{v.$css-prefix}-border-width = 1/16 by default (to render as ~1px based on a 16px default font-size)\n* --@{v.$css-prefix}-border-padding =\n ** 3/16 for vertical padding (to give ~2px of vertical whitespace around an icon considering it's vertical alignment)\n ** 4/16 for horizontal padding (to give ~4px of horizontal whitespace around an icon)\n*/\n.fa-border {\n border-color: var(--fa-border-color, #eee);\n border-radius: var(--fa-border-radius, 0.1em);\n border-style: var(--fa-border-style, solid);\n border-width: var(--fa-border-width, 0.0625em);\n box-sizing: var(--fa-border-box-sizing, content-box);\n padding: var(--fa-border-padding, 0.1875em 0.25em);\n}\n\n.fa-pull-left,\n.fa-pull-start {\n float: inline-start;\n margin-inline-end: var(--fa-pull-margin, 0.3em);\n}\n\n.fa-pull-right,\n.fa-pull-end {\n float: inline-end;\n margin-inline-start: var(--fa-pull-margin, 0.3em);\n}\n\n.fa-beat {\n animation-name: fa-beat;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 1s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, ease-in-out);\n}\n\n.fa-bounce {\n animation-name: fa-bounce;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 1s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1));\n}\n\n.fa-fade {\n animation-name: fa-fade;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 1s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, ease-in-out);\n}\n\n.fa-beat-fade {\n animation-name: fa-beat-fade;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 1s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, ease-in-out);\n}\n\n.fa-flip {\n animation-name: fa-flip;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 1.5s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, ease-in-out);\n}\n\n.fa-flip-360 {\n animation-name: fa-flip-360;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 1s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, ease-in-out);\n}\n\n.fa-shake {\n animation-name: fa-shake;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 0.75s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, ease-in-out);\n}\n\n.fa-spin {\n animation-name: fa-spin;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 2s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, linear);\n}\n\n.fa-spin-reverse {\n --fa-animation-direction: reverse;\n}\n\n.fa-pulse,\n.fa-spin-pulse {\n animation-name: fa-spin;\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 1s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, steps(8));\n}\n\n.fa-spin-snap {\n animation-name: fa-spin-snap;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 3s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, linear);\n}\n\n.fa-spin-snap-4 {\n animation-name: fa-spin-snap-4;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 2.4s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, linear);\n}\n\n.fa-spin-snap-8 {\n animation-name: fa-spin-snap-8;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 4s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, linear);\n}\n\n.fa-buzz {\n animation-name: fa-buzz;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 0.6s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, linear);\n}\n\n.fa-wag {\n animation-name: fa-wag;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 0.9s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, ease-out);\n transform-origin: bottom center;\n}\n\n.fa-float {\n animation-name: fa-float;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 3s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, ease-in-out);\n will-change: transform;\n}\n\n.fa-swing {\n animation-name: fa-swing;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 1.2s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, ease-out);\n transform-origin: top center;\n}\n\n.fa-jello {\n animation-name: fa-jello;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 0.9s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, ease-out);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .fa-beat,\n .fa-bounce,\n .fa-fade,\n .fa-beat-fade,\n .fa-flip,\n .fa-flip-360,\n .fa-pulse,\n .fa-shake,\n .fa-spin,\n .fa-spin-pulse,\n .fa-buzz,\n .fa-float,\n .fa-jello,\n .fa-spin-snap,\n .fa-spin-snap-4,\n .fa-spin-snap-8,\n .fa-swing,\n .fa-wag {\n animation: none !important;\n transition: none !important;\n }\n}\n@keyframes fa-beat {\n 0% {\n transform: scale(1);\n }\n 25% {\n transform: scale(calc(1.25 * var(--fa-beat-scale, 1.25)));\n }\n 45% {\n transform: scale(calc(1.22 * var(--fa-beat-scale, 1.22)));\n }\n 65% {\n transform: scale(calc(1.25 * var(--fa-beat-scale, 1.25)));\n }\n 90% {\n transform: scale(1);\n }\n}\n@keyframes fa-bounce {\n 0% {\n transform: scale(1, 1) translateY(0);\n animation-timing-function: var(--fa-animation-timing);\n }\n 14% {\n transform: scale(var(--fa-bounce-start-scale-x, 1.06), var(--fa-bounce-start-scale-y, 0.94)) translateY(var(--fa-bounce-anticipation, 3px));\n animation-timing-function: cubic-bezier(0.33, 0, 0.66, 0.33);\n }\n 32% {\n transform: scale(var(--fa-bounce-jump-scale-x, 0.94), var(--fa-bounce-jump-scale-y, 1.12)) translateY(calc(-1 * var(--fa-bounce-height, 0.5em)));\n animation-timing-function: cubic-bezier(0.33, 0.66, 0.66, 1);\n }\n 52% {\n transform: scale(1, 1) translateY(calc(-1 * var(--fa-bounce-height, 0.5em) * 1.1));\n animation-timing-function: cubic-bezier(0.5, 0, 1, 0.5);\n }\n 70% {\n transform: scale(var(--fa-bounce-land-scale-x, 1.06), var(--fa-bounce-land-scale-y, 0.92)) translateY(0);\n animation-timing-function: cubic-bezier(0.33, 0.33, 0.66, 1);\n }\n 85% {\n transform: scale(0.98, 1.04) translateY(calc(-2px * var(--fa-bounce-rebound, 1)));\n animation-timing-function: cubic-bezier(0.33, 0, 0.66, 1);\n }\n 100% {\n transform: scale(1, 1) translateY(0);\n }\n}\n@keyframes fa-fade {\n 0% {\n opacity: 1;\n transform: scale(1);\n animation-timing-function: cubic-bezier(0.2, 0, 0.4, 1);\n }\n 40% {\n opacity: var(--fa-fade-opacity, 0.4);\n transform: scale(0.98);\n animation-timing-function: cubic-bezier(0.4, 0, 0.6, 1);\n }\n 100% {\n opacity: 1;\n transform: scale(1);\n }\n}\n@keyframes fa-beat-fade {\n 0% {\n opacity: var(--fa-beat-fade-opacity, 0.4);\n transform: scale(1);\n animation-timing-function: cubic-bezier(0.2, 0, 0.4, 1);\n }\n 25% {\n opacity: calc(var(--fa-beat-fade-opacity, 0.4) + 0.4);\n transform: scale(var(--fa-beat-fade-scale, 1.28));\n animation-timing-function: cubic-bezier(0.4, 0, 0.6, 1);\n }\n 45% {\n opacity: 1;\n transform: scale(var(--fa-beat-fade-scale, 1.25));\n animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n }\n 65% {\n opacity: calc(var(--fa-beat-fade-opacity, 0.4) + 0.4);\n transform: scale(var(--fa-beat-fade-scale, 1.28));\n animation-timing-function: cubic-bezier(0.4, 0, 0.6, 1);\n }\n 100% {\n opacity: var(--fa-beat-fade-opacity, 0.4);\n transform: scale(1);\n }\n}\n@keyframes fa-flip {\n 0% {\n transform: perspective(2em) scale(1) rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), 0deg);\n animation-timing-function: cubic-bezier(0.2, 0, 0.4, 1);\n }\n 8% {\n transform: perspective(2em) scale(var(--fa-flip-anticipation-scale, 0.95)) rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), 0deg);\n animation-timing-function: cubic-bezier(0.33, 0, 0.66, 0.33);\n }\n 35% {\n transform: perspective(2em) scale(1) rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), calc(var(--fa-flip-angle, -360deg) * 0.6));\n animation-timing-function: linear;\n }\n 65% {\n transform: perspective(2em) scale(1) rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), calc(var(--fa-flip-angle, -360deg) * 0.5));\n animation-timing-function: cubic-bezier(0.33, 0.66, 0.66, 1);\n }\n 92% {\n transform: perspective(2em) scale(1) rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), calc(var(--fa-flip-angle, -360deg) * var(--fa-flip-overshoot, 1.04)));\n animation-timing-function: cubic-bezier(0.33, 0, 0.66, 1);\n }\n 100% {\n transform: perspective(2em) scale(1) rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -360deg));\n }\n}\n@keyframes fa-flip-360 {\n 0% {\n transform: perspective(2em) scale(1) rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), 0deg);\n animation-timing-function: cubic-bezier(0.2, 0, 0.4, 1);\n }\n 8% {\n transform: perspective(2em) scale(var(--fa-flip-anticipation-scale, 0.95)) rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), 0deg);\n animation-timing-function: cubic-bezier(0.33, 0, 0.66, 0.33);\n }\n 50% {\n transform: perspective(2em) scale(1) rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), calc(var(--fa-flip-angle, -360deg) * 0.6));\n animation-timing-function: cubic-bezier(0.33, 0.66, 0.66, 1);\n }\n 80% {\n transform: perspective(2em) scale(1) rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), calc(var(--fa-flip-angle, -360deg) * var(--fa-flip-overshoot, 1.04)));\n animation-timing-function: cubic-bezier(0.33, 0, 0.66, 1);\n }\n 100% {\n transform: perspective(2em) scale(1) rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -360deg));\n }\n}\n@keyframes fa-shake {\n 0% {\n transform: rotate(0deg);\n animation-timing-function: cubic-bezier(0.2, 0, 0.8, 1);\n }\n 8% {\n transform: rotate(35deg) translateX(1px);\n animation-timing-function: cubic-bezier(0.3, 0, 0.7, 1);\n }\n 20% {\n transform: rotate(-22deg) translateX(-1px);\n animation-timing-function: cubic-bezier(0.3, 0, 0.7, 1);\n }\n 35% {\n transform: rotate(15deg) translateX(1px);\n animation-timing-function: cubic-bezier(0.3, 0, 0.7, 1);\n }\n 50% {\n transform: rotate(-9deg);\n animation-timing-function: cubic-bezier(0.4, 0, 0.6, 1);\n }\n 65% {\n transform: rotate(5deg);\n animation-timing-function: cubic-bezier(0.4, 0, 0.6, 1);\n }\n 78% {\n transform: rotate(-3deg);\n animation-timing-function: cubic-bezier(0.4, 0, 0.6, 1);\n }\n 90% {\n transform: rotate(1deg);\n animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n }\n 100% {\n transform: rotate(0deg);\n }\n}\n@keyframes fa-spin {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n@keyframes fa-spin-snap {\n 0% {\n transform: rotate(0deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 12% {\n transform: rotate(60deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 16.67% {\n transform: rotate(60deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 28.67% {\n transform: rotate(120deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 33.33% {\n transform: rotate(120deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 45.33% {\n transform: rotate(180deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 50% {\n transform: rotate(180deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 62% {\n transform: rotate(240deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 66.67% {\n transform: rotate(240deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 78.67% {\n transform: rotate(300deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 83.33% {\n transform: rotate(300deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 95.33% {\n transform: rotate(360deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n@keyframes fa-spin-snap-4 {\n 0% {\n transform: rotate(0deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 15% {\n transform: rotate(90deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 25% {\n transform: rotate(90deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 40% {\n transform: rotate(180deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 50% {\n transform: rotate(180deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 65% {\n transform: rotate(270deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 75% {\n transform: rotate(270deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 90% {\n transform: rotate(360deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n@keyframes fa-spin-snap-8 {\n 0% {\n transform: rotate(0deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 9% {\n transform: rotate(45deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 12.5% {\n transform: rotate(45deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 21.5% {\n transform: rotate(90deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 25% {\n transform: rotate(90deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 34% {\n transform: rotate(135deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 37.5% {\n transform: rotate(135deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 46.5% {\n transform: rotate(180deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 50% {\n transform: rotate(180deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 59% {\n transform: rotate(225deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 62.5% {\n transform: rotate(225deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 71.5% {\n transform: rotate(270deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 75% {\n transform: rotate(270deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 84% {\n transform: rotate(315deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 87.5% {\n transform: rotate(315deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 96.5% {\n transform: rotate(360deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n@keyframes fa-buzz {\n 0% {\n transform: translateX(0) rotate(0deg);\n animation-timing-function: cubic-bezier(0.1, 0, 0.9, 1);\n }\n 5% {\n transform: translateX(var(--fa-buzz-distance, 4px)) rotate(0.5deg);\n }\n 10% {\n transform: translateX(calc(-1 * var(--fa-buzz-distance, 4px))) rotate(-0.5deg);\n }\n 15% {\n transform: translateX(var(--fa-buzz-distance, 4px)) rotate(0.3deg);\n }\n 20% {\n transform: translateX(calc(-1 * var(--fa-buzz-distance, 4px))) rotate(-0.3deg);\n }\n 25% {\n transform: translateX(calc(var(--fa-buzz-distance, 4px) * 0.7)) rotate(0.2deg);\n }\n 30% {\n transform: translateX(calc(-1 * var(--fa-buzz-distance, 4px) * 0.7)) rotate(-0.2deg);\n }\n 35% {\n transform: translateX(calc(var(--fa-buzz-distance, 4px) * 0.4)) rotate(0.1deg);\n }\n 40% {\n transform: translateX(0) rotate(0deg);\n }\n 100% {\n transform: translateX(0) rotate(0deg);\n }\n}\n@keyframes fa-wag {\n 0% {\n transform: rotate(0deg);\n animation-timing-function: cubic-bezier(0.2, 0, 0.6, 1);\n }\n 12% {\n transform: rotate(var(--fa-wag-angle, 12deg));\n animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n }\n 24% {\n transform: rotate(2deg);\n animation-timing-function: cubic-bezier(0.2, 0, 0.6, 1);\n }\n 36% {\n transform: rotate(calc(var(--fa-wag-angle, 12deg) * 0.85));\n animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n }\n 48% {\n transform: rotate(1deg);\n animation-timing-function: cubic-bezier(0.2, 0, 0.6, 1);\n }\n 58% {\n transform: rotate(calc(var(--fa-wag-angle, 12deg) * 0.6));\n animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n }\n 68% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(0deg);\n }\n}\n@keyframes fa-float {\n 0% {\n transform: translateY(0) translateX(0) rotate(0deg) scale(var(--fa-float-squash-x, 1.02), var(--fa-float-squash-y, 0.98));\n animation-timing-function: cubic-bezier(0.33, 0, 0.66, 0.33);\n }\n 15% {\n transform: translateY(calc(-0.4 * var(--fa-float-height, 6px))) translateX(var(--fa-float-drift, 1px)) rotate(var(--fa-float-tilt, 1deg)) scale(1, 1);\n animation-timing-function: cubic-bezier(0.33, 0.66, 0.66, 1);\n }\n 35% {\n transform: translateY(calc(-1 * var(--fa-float-height, 6px))) translateX(0) rotate(0deg) scale(var(--fa-float-stretch-x, 0.98), var(--fa-float-stretch-y, 1.03));\n animation-timing-function: cubic-bezier(0.5, 0, 0.5, 0);\n }\n 50% {\n transform: translateY(calc(-0.92 * var(--fa-float-height, 6px))) translateX(calc(-0.5 * var(--fa-float-drift, 1px))) rotate(calc(-0.5 * var(--fa-float-tilt, 1deg))) scale(0.995, 1.01);\n animation-timing-function: cubic-bezier(0.33, 0, 0.66, 0.33);\n }\n 70% {\n transform: translateY(calc(-0.3 * var(--fa-float-height, 6px))) translateX(calc(-1 * var(--fa-float-drift, 1px))) rotate(calc(-1 * var(--fa-float-tilt, 1deg))) scale(1, 1);\n animation-timing-function: cubic-bezier(0.33, 0.66, 0.66, 1);\n }\n 90% {\n transform: translateY(calc(0.05 * var(--fa-float-height, 6px))) translateX(0) rotate(0deg) scale(var(--fa-float-squash-x, 1.02), var(--fa-float-squash-y, 0.98));\n animation-timing-function: cubic-bezier(0.33, 0, 0.66, 1);\n }\n 100% {\n transform: translateY(0) translateX(0) rotate(0deg) scale(var(--fa-float-squash-x, 1.02), var(--fa-float-squash-y, 0.98));\n }\n}\n@keyframes fa-swing {\n 0% {\n transform: rotate(0deg);\n animation-timing-function: cubic-bezier(0.2, 0, 0.8, 1);\n }\n 8% {\n transform: rotate(var(--fa-swing-angle, 22deg));\n animation-timing-function: cubic-bezier(0.3, 0, 0.7, 1);\n }\n 18% {\n transform: rotate(calc(-1 * var(--fa-swing-angle, 22deg) * 0.85));\n animation-timing-function: cubic-bezier(0.3, 0, 0.7, 1);\n }\n 28% {\n transform: rotate(calc(var(--fa-swing-angle, 22deg) * 0.65));\n animation-timing-function: cubic-bezier(0.35, 0, 0.65, 1);\n }\n 38% {\n transform: rotate(calc(-1 * var(--fa-swing-angle, 22deg) * 0.45));\n animation-timing-function: cubic-bezier(0.4, 0, 0.6, 1);\n }\n 48% {\n transform: rotate(calc(var(--fa-swing-angle, 22deg) * 0.25));\n animation-timing-function: cubic-bezier(0.4, 0, 0.6, 1);\n }\n 56% {\n transform: rotate(calc(-1 * var(--fa-swing-angle, 22deg) * 0.1));\n animation-timing-function: cubic-bezier(0.4, 0, 0.6, 1);\n }\n 64% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(0deg);\n }\n}\n@keyframes fa-jello {\n 0% {\n transform: scale(1, 1);\n animation-timing-function: cubic-bezier(0.2, 0, 0.8, 1);\n }\n 12% {\n transform: scale(var(--fa-jello-scale-x, 1.15), calc(2 - var(--fa-jello-scale-x, 1.15)));\n animation-timing-function: cubic-bezier(0.3, 0, 0.7, 1);\n }\n 24% {\n transform: scale(calc(2 - var(--fa-jello-scale-y, 1.12)), var(--fa-jello-scale-y, 1.12));\n animation-timing-function: cubic-bezier(0.3, 0, 0.7, 1);\n }\n 36% {\n transform: scale(calc(1 + (var(--fa-jello-scale-x, 1.15) - 1) * 0.5), calc(2 - (1 + (var(--fa-jello-scale-x, 1.15) - 1) * 0.5)));\n animation-timing-function: cubic-bezier(0.4, 0, 0.6, 1);\n }\n 48% {\n transform: scale(calc(2 - (1 + (var(--fa-jello-scale-y, 1.12) - 1) * 0.3)), calc(1 + (var(--fa-jello-scale-y, 1.12) - 1) * 0.3));\n animation-timing-function: cubic-bezier(0.4, 0, 0.6, 1);\n }\n 58% {\n transform: scale(1.02, 0.98);\n animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n }\n 68% {\n transform: scale(1, 1);\n }\n 100% {\n transform: scale(1, 1);\n }\n}\n.fa-rotate-90 {\n transform: rotate(90deg);\n}\n\n.fa-rotate-180 {\n transform: rotate(180deg);\n}\n\n.fa-rotate-270 {\n transform: rotate(270deg);\n}\n\n.fa-flip-horizontal {\n transform: scale(-1, 1);\n}\n\n.fa-flip-vertical {\n transform: scale(1, -1);\n}\n\n.fa-flip-both,\n.fa-flip-horizontal.fa-flip-vertical {\n transform: scale(-1, -1);\n}\n\n.fa-rotate-by {\n transform: rotate(var(--fa-rotate-angle, 0));\n}\n\n.fa-stack {\n display: inline-block;\n height: 2em;\n line-height: 2em;\n position: relative;\n vertical-align: middle;\n width: 2.5em;\n}\n\n.fa-stack-1x,\n.fa-stack-2x {\n --fa-width: 100%;\n inset: 0;\n position: absolute;\n text-align: center;\n width: var(--fa-width);\n z-index: var(--fa-stack-z-index, auto);\n}\n\n.fa-stack-1x {\n line-height: inherit;\n}\n\n.fa-stack-2x {\n font-size: 2em;\n}\n\n.fa-inverse {\n color: var(--fa-inverse, #fff);\n}\n\n/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen\n readers do not read off random characters that represent icons */\n\n.fa-0 {\n --fa: "\\30 ";\n}\n\n.fa-1 {\n --fa: "\\31 ";\n}\n\n.fa-2 {\n --fa: "\\32 ";\n}\n\n.fa-3 {\n --fa: "\\33 ";\n}\n\n.fa-4 {\n --fa: "\\34 ";\n}\n\n.fa-5 {\n --fa: "\\35 ";\n}\n\n.fa-6 {\n --fa: "\\36 ";\n}\n\n.fa-7 {\n --fa: "\\37 ";\n}\n\n.fa-8 {\n --fa: "\\38 ";\n}\n\n.fa-9 {\n --fa: "\\39 ";\n}\n\n.fa-exclamation {\n --fa: "\\!";\n}\n\n.fa-hashtag {\n --fa: "\\#";\n}\n\n.fa-dollar-sign {\n --fa: "\\$";\n}\n\n.fa-dollar {\n --fa: "\\$";\n}\n\n.fa-usd {\n --fa: "\\$";\n}\n\n.fa-percent {\n --fa: "\\%";\n}\n\n.fa-percentage {\n --fa: "\\%";\n}\n\n.fa-asterisk {\n --fa: "\\*";\n}\n\n.fa-plus {\n --fa: "\\+";\n}\n\n.fa-add {\n --fa: "\\+";\n}\n\n.fa-less-than {\n --fa: "\\<";\n}\n\n.fa-equals {\n --fa: "\\=";\n}\n\n.fa-greater-than {\n --fa: "\\>";\n}\n\n.fa-question {\n --fa: "\\?";\n}\n\n.fa-at {\n --fa: "\\@";\n}\n\n.fa-a {\n --fa: "A";\n}\n\n.fa-b {\n --fa: "B";\n}\n\n.fa-c {\n --fa: "C";\n}\n\n.fa-d {\n --fa: "D";\n}\n\n.fa-e {\n --fa: "E";\n}\n\n.fa-f {\n --fa: "F";\n}\n\n.fa-g {\n --fa: "G";\n}\n\n.fa-h {\n --fa: "H";\n}\n\n.fa-i {\n --fa: "I";\n}\n\n.fa-j {\n --fa: "J";\n}\n\n.fa-k {\n --fa: "K";\n}\n\n.fa-l {\n --fa: "L";\n}\n\n.fa-m {\n --fa: "M";\n}\n\n.fa-n {\n --fa: "N";\n}\n\n.fa-o {\n --fa: "O";\n}\n\n.fa-p {\n --fa: "P";\n}\n\n.fa-q {\n --fa: "Q";\n}\n\n.fa-r {\n --fa: "R";\n}\n\n.fa-s {\n --fa: "S";\n}\n\n.fa-t {\n --fa: "T";\n}\n\n.fa-u {\n --fa: "U";\n}\n\n.fa-v {\n --fa: "V";\n}\n\n.fa-w {\n --fa: "W";\n}\n\n.fa-x {\n --fa: "X";\n}\n\n.fa-y {\n --fa: "Y";\n}\n\n.fa-z {\n --fa: "Z";\n}\n\n.fa-faucet {\n --fa: "\\e005";\n}\n\n.fa-faucet-drip {\n --fa: "\\e006";\n}\n\n.fa-house-chimney-window {\n --fa: "\\e00d";\n}\n\n.fa-house-signal {\n --fa: "\\e012";\n}\n\n.fa-temperature-arrow-down {\n --fa: "\\e03f";\n}\n\n.fa-temperature-down {\n --fa: "\\e03f";\n}\n\n.fa-temperature-arrow-up {\n --fa: "\\e040";\n}\n\n.fa-temperature-up {\n --fa: "\\e040";\n}\n\n.fa-trailer {\n --fa: "\\e041";\n}\n\n.fa-bacteria {\n --fa: "\\e059";\n}\n\n.fa-bacterium {\n --fa: "\\e05a";\n}\n\n.fa-box-tissue {\n --fa: "\\e05b";\n}\n\n.fa-hand-holding-medical {\n --fa: "\\e05c";\n}\n\n.fa-hand-sparkles {\n --fa: "\\e05d";\n}\n\n.fa-hands-bubbles {\n --fa: "\\e05e";\n}\n\n.fa-hands-wash {\n --fa: "\\e05e";\n}\n\n.fa-handshake-slash {\n --fa: "\\e060";\n}\n\n.fa-handshake-alt-slash {\n --fa: "\\e060";\n}\n\n.fa-handshake-simple-slash {\n --fa: "\\e060";\n}\n\n.fa-head-side-cough {\n --fa: "\\e061";\n}\n\n.fa-head-side-cough-slash {\n --fa: "\\e062";\n}\n\n.fa-head-side-mask {\n --fa: "\\e063";\n}\n\n.fa-head-side-virus {\n --fa: "\\e064";\n}\n\n.fa-house-chimney-user {\n --fa: "\\e065";\n}\n\n.fa-house-laptop {\n --fa: "\\e066";\n}\n\n.fa-laptop-house {\n --fa: "\\e066";\n}\n\n.fa-lungs-virus {\n --fa: "\\e067";\n}\n\n.fa-people-arrows {\n --fa: "\\e068";\n}\n\n.fa-people-arrows-left-right {\n --fa: "\\e068";\n}\n\n.fa-plane-slash {\n --fa: "\\e069";\n}\n\n.fa-pump-medical {\n --fa: "\\e06a";\n}\n\n.fa-pump-soap {\n --fa: "\\e06b";\n}\n\n.fa-shield-virus {\n --fa: "\\e06c";\n}\n\n.fa-sink {\n --fa: "\\e06d";\n}\n\n.fa-soap {\n --fa: "\\e06e";\n}\n\n.fa-stopwatch-20 {\n --fa: "\\e06f";\n}\n\n.fa-shop-slash {\n --fa: "\\e070";\n}\n\n.fa-store-alt-slash {\n --fa: "\\e070";\n}\n\n.fa-store-slash {\n --fa: "\\e071";\n}\n\n.fa-toilet-paper-slash {\n --fa: "\\e072";\n}\n\n.fa-users-slash {\n --fa: "\\e073";\n}\n\n.fa-virus {\n --fa: "\\e074";\n}\n\n.fa-virus-slash {\n --fa: "\\e075";\n}\n\n.fa-viruses {\n --fa: "\\e076";\n}\n\n.fa-vest {\n --fa: "\\e085";\n}\n\n.fa-vest-patches {\n --fa: "\\e086";\n}\n\n.fa-arrow-trend-down {\n --fa: "\\e097";\n}\n\n.fa-arrow-trend-up {\n --fa: "\\e098";\n}\n\n.fa-arrow-up-from-bracket {\n --fa: "\\e09a";\n}\n\n.fa-austral-sign {\n --fa: "\\e0a9";\n}\n\n.fa-baht-sign {\n --fa: "\\e0ac";\n}\n\n.fa-bitcoin-sign {\n --fa: "\\e0b4";\n}\n\n.fa-bolt-lightning {\n --fa: "\\e0b7";\n}\n\n.fa-book-bookmark {\n --fa: "\\e0bb";\n}\n\n.fa-camera-rotate {\n --fa: "\\e0d8";\n}\n\n.fa-cedi-sign {\n --fa: "\\e0df";\n}\n\n.fa-chart-column {\n --fa: "\\e0e3";\n}\n\n.fa-chart-gantt {\n --fa: "\\e0e4";\n}\n\n.fa-clapperboard {\n --fa: "\\e131";\n}\n\n.fa-closed-captioning-slash {\n --fa: "\\e135";\n}\n\n.fa-clover {\n --fa: "\\e139";\n}\n\n.fa-code-compare {\n --fa: "\\e13a";\n}\n\n.fa-code-fork {\n --fa: "\\e13b";\n}\n\n.fa-code-pull-request {\n --fa: "\\e13c";\n}\n\n.fa-colon-sign {\n --fa: "\\e140";\n}\n\n.fa-cruzeiro-sign {\n --fa: "\\e152";\n}\n\n.fa-display {\n --fa: "\\e163";\n}\n\n.fa-dong-sign {\n --fa: "\\e169";\n}\n\n.fa-elevator {\n --fa: "\\e16d";\n}\n\n.fa-filter-circle-xmark {\n --fa: "\\e17b";\n}\n\n.fa-florin-sign {\n --fa: "\\e184";\n}\n\n.fa-folder-closed {\n --fa: "\\e185";\n}\n\n.fa-franc-sign {\n --fa: "\\e18f";\n}\n\n.fa-guarani-sign {\n --fa: "\\e19a";\n}\n\n.fa-gun {\n --fa: "\\e19b";\n}\n\n.fa-hands-clapping {\n --fa: "\\e1a8";\n}\n\n.fa-house-user {\n --fa: "\\e1b0";\n}\n\n.fa-home-user {\n --fa: "\\e1b0";\n}\n\n.fa-indian-rupee-sign {\n --fa: "\\e1bc";\n}\n\n.fa-indian-rupee {\n --fa: "\\e1bc";\n}\n\n.fa-inr {\n --fa: "\\e1bc";\n}\n\n.fa-kip-sign {\n --fa: "\\e1c4";\n}\n\n.fa-lari-sign {\n --fa: "\\e1c8";\n}\n\n.fa-litecoin-sign {\n --fa: "\\e1d3";\n}\n\n.fa-manat-sign {\n --fa: "\\e1d5";\n}\n\n.fa-mask-face {\n --fa: "\\e1d7";\n}\n\n.fa-mill-sign {\n --fa: "\\e1ed";\n}\n\n.fa-money-bills {\n --fa: "\\e1f3";\n}\n\n.fa-naira-sign {\n --fa: "\\e1f6";\n}\n\n.fa-notdef {\n --fa: "\\e1fe";\n}\n\n.fa-panorama {\n --fa: "\\e209";\n}\n\n.fa-peseta-sign {\n --fa: "\\e221";\n}\n\n.fa-peso-sign {\n --fa: "\\e222";\n}\n\n.fa-plane-up {\n --fa: "\\e22d";\n}\n\n.fa-rupiah-sign {\n --fa: "\\e23d";\n}\n\n.fa-stairs {\n --fa: "\\e289";\n}\n\n.fa-timeline {\n --fa: "\\e29c";\n}\n\n.fa-truck-front {\n --fa: "\\e2b7";\n}\n\n.fa-turkish-lira-sign {\n --fa: "\\e2bb";\n}\n\n.fa-try {\n --fa: "\\e2bb";\n}\n\n.fa-turkish-lira {\n --fa: "\\e2bb";\n}\n\n.fa-vault {\n --fa: "\\e2c5";\n}\n\n.fa-wand-magic-sparkles {\n --fa: "\\e2ca";\n}\n\n.fa-magic-wand-sparkles {\n --fa: "\\e2ca";\n}\n\n.fa-wheat-awn {\n --fa: "\\e2cd";\n}\n\n.fa-wheat-alt {\n --fa: "\\e2cd";\n}\n\n.fa-wheelchair-move {\n --fa: "\\e2ce";\n}\n\n.fa-wheelchair-alt {\n --fa: "\\e2ce";\n}\n\n.fa-bangladeshi-taka-sign {\n --fa: "\\e2e6";\n}\n\n.fa-bowl-rice {\n --fa: "\\e2eb";\n}\n\n.fa-person-pregnant {\n --fa: "\\e31e";\n}\n\n.fa-house-chimney {\n --fa: "\\e3af";\n}\n\n.fa-home-lg {\n --fa: "\\e3af";\n}\n\n.fa-house-crack {\n --fa: "\\e3b1";\n}\n\n.fa-house-medical {\n --fa: "\\e3b2";\n}\n\n.fa-cent-sign {\n --fa: "\\e3f5";\n}\n\n.fa-plus-minus {\n --fa: "\\e43c";\n}\n\n.fa-sailboat {\n --fa: "\\e445";\n}\n\n.fa-section {\n --fa: "\\e447";\n}\n\n.fa-shrimp {\n --fa: "\\e448";\n}\n\n.fa-brazilian-real-sign {\n --fa: "\\e46c";\n}\n\n.fa-chart-simple {\n --fa: "\\e473";\n}\n\n.fa-diagram-next {\n --fa: "\\e476";\n}\n\n.fa-diagram-predecessor {\n --fa: "\\e477";\n}\n\n.fa-diagram-successor {\n --fa: "\\e47a";\n}\n\n.fa-earth-oceania {\n --fa: "\\e47b";\n}\n\n.fa-globe-oceania {\n --fa: "\\e47b";\n}\n\n.fa-bug-slash {\n --fa: "\\e490";\n}\n\n.fa-file-circle-plus {\n --fa: "\\e494";\n}\n\n.fa-shop-lock {\n --fa: "\\e4a5";\n}\n\n.fa-virus-covid {\n --fa: "\\e4a8";\n}\n\n.fa-virus-covid-slash {\n --fa: "\\e4a9";\n}\n\n.fa-anchor-circle-check {\n --fa: "\\e4aa";\n}\n\n.fa-anchor-circle-exclamation {\n --fa: "\\e4ab";\n}\n\n.fa-anchor-circle-xmark {\n --fa: "\\e4ac";\n}\n\n.fa-anchor-lock {\n --fa: "\\e4ad";\n}\n\n.fa-arrow-down-up-across-line {\n --fa: "\\e4af";\n}\n\n.fa-arrow-down-up-lock {\n --fa: "\\e4b0";\n}\n\n.fa-arrow-right-to-city {\n --fa: "\\e4b3";\n}\n\n.fa-arrow-up-from-ground-water {\n --fa: "\\e4b5";\n}\n\n.fa-arrow-up-from-water-pump {\n --fa: "\\e4b6";\n}\n\n.fa-arrow-up-right-dots {\n --fa: "\\e4b7";\n}\n\n.fa-arrows-down-to-line {\n --fa: "\\e4b8";\n}\n\n.fa-arrows-down-to-people {\n --fa: "\\e4b9";\n}\n\n.fa-arrows-left-right-to-line {\n --fa: "\\e4ba";\n}\n\n.fa-arrows-spin {\n --fa: "\\e4bb";\n}\n\n.fa-arrows-split-up-and-left {\n --fa: "\\e4bc";\n}\n\n.fa-arrows-to-circle {\n --fa: "\\e4bd";\n}\n\n.fa-arrows-to-dot {\n --fa: "\\e4be";\n}\n\n.fa-arrows-to-eye {\n --fa: "\\e4bf";\n}\n\n.fa-arrows-turn-right {\n --fa: "\\e4c0";\n}\n\n.fa-arrows-turn-to-dots {\n --fa: "\\e4c1";\n}\n\n.fa-arrows-up-to-line {\n --fa: "\\e4c2";\n}\n\n.fa-bore-hole {\n --fa: "\\e4c3";\n}\n\n.fa-bottle-droplet {\n --fa: "\\e4c4";\n}\n\n.fa-bottle-water {\n --fa: "\\e4c5";\n}\n\n.fa-bowl-food {\n --fa: "\\e4c6";\n}\n\n.fa-boxes-packing {\n --fa: "\\e4c7";\n}\n\n.fa-bridge {\n --fa: "\\e4c8";\n}\n\n.fa-bridge-circle-check {\n --fa: "\\e4c9";\n}\n\n.fa-bridge-circle-exclamation {\n --fa: "\\e4ca";\n}\n\n.fa-bridge-circle-xmark {\n --fa: "\\e4cb";\n}\n\n.fa-bridge-lock {\n --fa: "\\e4cc";\n}\n\n.fa-bridge-water {\n --fa: "\\e4ce";\n}\n\n.fa-bucket {\n --fa: "\\e4cf";\n}\n\n.fa-bugs {\n --fa: "\\e4d0";\n}\n\n.fa-building-circle-arrow-right {\n --fa: "\\e4d1";\n}\n\n.fa-building-circle-check {\n --fa: "\\e4d2";\n}\n\n.fa-building-circle-exclamation {\n --fa: "\\e4d3";\n}\n\n.fa-building-circle-xmark {\n --fa: "\\e4d4";\n}\n\n.fa-building-flag {\n --fa: "\\e4d5";\n}\n\n.fa-building-lock {\n --fa: "\\e4d6";\n}\n\n.fa-building-ngo {\n --fa: "\\e4d7";\n}\n\n.fa-building-shield {\n --fa: "\\e4d8";\n}\n\n.fa-building-un {\n --fa: "\\e4d9";\n}\n\n.fa-building-user {\n --fa: "\\e4da";\n}\n\n.fa-building-wheat {\n --fa: "\\e4db";\n}\n\n.fa-burst {\n --fa: "\\e4dc";\n}\n\n.fa-car-on {\n --fa: "\\e4dd";\n}\n\n.fa-car-tunnel {\n --fa: "\\e4de";\n}\n\n.fa-child-combatant {\n --fa: "\\e4e0";\n}\n\n.fa-child-rifle {\n --fa: "\\e4e0";\n}\n\n.fa-children {\n --fa: "\\e4e1";\n}\n\n.fa-circle-nodes {\n --fa: "\\e4e2";\n}\n\n.fa-clipboard-question {\n --fa: "\\e4e3";\n}\n\n.fa-cloud-showers-water {\n --fa: "\\e4e4";\n}\n\n.fa-computer {\n --fa: "\\e4e5";\n}\n\n.fa-cubes-stacked {\n --fa: "\\e4e6";\n}\n\n.fa-envelope-circle-check {\n --fa: "\\e4e8";\n}\n\n.fa-explosion {\n --fa: "\\e4e9";\n}\n\n.fa-ferry {\n --fa: "\\e4ea";\n}\n\n.fa-file-circle-exclamation {\n --fa: "\\e4eb";\n}\n\n.fa-file-circle-minus {\n --fa: "\\e4ed";\n}\n\n.fa-file-circle-question {\n --fa: "\\e4ef";\n}\n\n.fa-file-shield {\n --fa: "\\e4f0";\n}\n\n.fa-fire-burner {\n --fa: "\\e4f1";\n}\n\n.fa-fish-fins {\n --fa: "\\e4f2";\n}\n\n.fa-flask-vial {\n --fa: "\\e4f3";\n}\n\n.fa-glass-water {\n --fa: "\\e4f4";\n}\n\n.fa-glass-water-droplet {\n --fa: "\\e4f5";\n}\n\n.fa-group-arrows-rotate {\n --fa: "\\e4f6";\n}\n\n.fa-hand-holding-hand {\n --fa: "\\e4f7";\n}\n\n.fa-handcuffs {\n --fa: "\\e4f8";\n}\n\n.fa-hands-bound {\n --fa: "\\e4f9";\n}\n\n.fa-hands-holding-child {\n --fa: "\\e4fa";\n}\n\n.fa-hands-holding-circle {\n --fa: "\\e4fb";\n}\n\n.fa-heart-circle-bolt {\n --fa: "\\e4fc";\n}\n\n.fa-heart-circle-check {\n --fa: "\\e4fd";\n}\n\n.fa-heart-circle-exclamation {\n --fa: "\\e4fe";\n}\n\n.fa-heart-circle-minus {\n --fa: "\\e4ff";\n}\n\n.fa-heart-circle-plus {\n --fa: "\\e500";\n}\n\n.fa-heart-circle-xmark {\n --fa: "\\e501";\n}\n\n.fa-helicopter-symbol {\n --fa: "\\e502";\n}\n\n.fa-helmet-un {\n --fa: "\\e503";\n}\n\n.fa-hill-avalanche {\n --fa: "\\e507";\n}\n\n.fa-hill-rockslide {\n --fa: "\\e508";\n}\n\n.fa-house-circle-check {\n --fa: "\\e509";\n}\n\n.fa-house-circle-exclamation {\n --fa: "\\e50a";\n}\n\n.fa-house-circle-xmark {\n --fa: "\\e50b";\n}\n\n.fa-house-fire {\n --fa: "\\e50c";\n}\n\n.fa-house-flag {\n --fa: "\\e50d";\n}\n\n.fa-house-flood-water {\n --fa: "\\e50e";\n}\n\n.fa-house-flood-water-circle-arrow-right {\n --fa: "\\e50f";\n}\n\n.fa-house-lock {\n --fa: "\\e510";\n}\n\n.fa-house-medical-circle-check {\n --fa: "\\e511";\n}\n\n.fa-house-medical-circle-exclamation {\n --fa: "\\e512";\n}\n\n.fa-house-medical-circle-xmark {\n --fa: "\\e513";\n}\n\n.fa-house-medical-flag {\n --fa: "\\e514";\n}\n\n.fa-house-tsunami {\n --fa: "\\e515";\n}\n\n.fa-jar {\n --fa: "\\e516";\n}\n\n.fa-jar-wheat {\n --fa: "\\e517";\n}\n\n.fa-jet-fighter-up {\n --fa: "\\e518";\n}\n\n.fa-jug-detergent {\n --fa: "\\e519";\n}\n\n.fa-kitchen-set {\n --fa: "\\e51a";\n}\n\n.fa-land-mine-on {\n --fa: "\\e51b";\n}\n\n.fa-landmark-flag {\n --fa: "\\e51c";\n}\n\n.fa-laptop-file {\n --fa: "\\e51d";\n}\n\n.fa-lines-leaning {\n --fa: "\\e51e";\n}\n\n.fa-location-pin-lock {\n --fa: "\\e51f";\n}\n\n.fa-locust {\n --fa: "\\e520";\n}\n\n.fa-magnifying-glass-arrow-right {\n --fa: "\\e521";\n}\n\n.fa-magnifying-glass-chart {\n --fa: "\\e522";\n}\n\n.fa-mars-and-venus-burst {\n --fa: "\\e523";\n}\n\n.fa-mask-ventilator {\n --fa: "\\e524";\n}\n\n.fa-mattress-pillow {\n --fa: "\\e525";\n}\n\n.fa-mobile-retro {\n --fa: "\\e527";\n}\n\n.fa-money-bill-transfer {\n --fa: "\\e528";\n}\n\n.fa-money-bill-trend-up {\n --fa: "\\e529";\n}\n\n.fa-money-bill-wheat {\n --fa: "\\e52a";\n}\n\n.fa-mosquito {\n --fa: "\\e52b";\n}\n\n.fa-mosquito-net {\n --fa: "\\e52c";\n}\n\n.fa-mound {\n --fa: "\\e52d";\n}\n\n.fa-mountain-city {\n --fa: "\\e52e";\n}\n\n.fa-mountain-sun {\n --fa: "\\e52f";\n}\n\n.fa-oil-well {\n --fa: "\\e532";\n}\n\n.fa-people-group {\n --fa: "\\e533";\n}\n\n.fa-people-line {\n --fa: "\\e534";\n}\n\n.fa-people-pulling {\n --fa: "\\e535";\n}\n\n.fa-people-robbery {\n --fa: "\\e536";\n}\n\n.fa-people-roof {\n --fa: "\\e537";\n}\n\n.fa-person-arrow-down-to-line {\n --fa: "\\e538";\n}\n\n.fa-person-arrow-up-from-line {\n --fa: "\\e539";\n}\n\n.fa-person-breastfeeding {\n --fa: "\\e53a";\n}\n\n.fa-person-burst {\n --fa: "\\e53b";\n}\n\n.fa-person-cane {\n --fa: "\\e53c";\n}\n\n.fa-person-chalkboard {\n --fa: "\\e53d";\n}\n\n.fa-person-circle-check {\n --fa: "\\e53e";\n}\n\n.fa-person-circle-exclamation {\n --fa: "\\e53f";\n}\n\n.fa-person-circle-minus {\n --fa: "\\e540";\n}\n\n.fa-person-circle-plus {\n --fa: "\\e541";\n}\n\n.fa-person-circle-question {\n --fa: "\\e542";\n}\n\n.fa-person-circle-xmark {\n --fa: "\\e543";\n}\n\n.fa-person-dress-burst {\n --fa: "\\e544";\n}\n\n.fa-person-drowning {\n --fa: "\\e545";\n}\n\n.fa-person-falling {\n --fa: "\\e546";\n}\n\n.fa-person-falling-burst {\n --fa: "\\e547";\n}\n\n.fa-person-half-dress {\n --fa: "\\e548";\n}\n\n.fa-person-harassing {\n --fa: "\\e549";\n}\n\n.fa-person-military-pointing {\n --fa: "\\e54a";\n}\n\n.fa-person-military-rifle {\n --fa: "\\e54b";\n}\n\n.fa-person-military-to-person {\n --fa: "\\e54c";\n}\n\n.fa-person-rays {\n --fa: "\\e54d";\n}\n\n.fa-person-rifle {\n --fa: "\\e54e";\n}\n\n.fa-person-shelter {\n --fa: "\\e54f";\n}\n\n.fa-person-walking-arrow-loop-left {\n --fa: "\\e551";\n}\n\n.fa-person-walking-arrow-right {\n --fa: "\\e552";\n}\n\n.fa-person-walking-dashed-line-arrow-right {\n --fa: "\\e553";\n}\n\n.fa-person-walking-luggage {\n --fa: "\\e554";\n}\n\n.fa-plane-circle-check {\n --fa: "\\e555";\n}\n\n.fa-plane-circle-exclamation {\n --fa: "\\e556";\n}\n\n.fa-plane-circle-xmark {\n --fa: "\\e557";\n}\n\n.fa-plane-lock {\n --fa: "\\e558";\n}\n\n.fa-plate-wheat {\n --fa: "\\e55a";\n}\n\n.fa-plug-circle-bolt {\n --fa: "\\e55b";\n}\n\n.fa-plug-circle-check {\n --fa: "\\e55c";\n}\n\n.fa-plug-circle-exclamation {\n --fa: "\\e55d";\n}\n\n.fa-plug-circle-minus {\n --fa: "\\e55e";\n}\n\n.fa-plug-circle-plus {\n --fa: "\\e55f";\n}\n\n.fa-plug-circle-xmark {\n --fa: "\\e560";\n}\n\n.fa-ranking-star {\n --fa: "\\e561";\n}\n\n.fa-road-barrier {\n --fa: "\\e562";\n}\n\n.fa-road-bridge {\n --fa: "\\e563";\n}\n\n.fa-road-circle-check {\n --fa: "\\e564";\n}\n\n.fa-road-circle-exclamation {\n --fa: "\\e565";\n}\n\n.fa-road-circle-xmark {\n --fa: "\\e566";\n}\n\n.fa-road-lock {\n --fa: "\\e567";\n}\n\n.fa-road-spikes {\n --fa: "\\e568";\n}\n\n.fa-rug {\n --fa: "\\e569";\n}\n\n.fa-sack-xmark {\n --fa: "\\e56a";\n}\n\n.fa-school-circle-check {\n --fa: "\\e56b";\n}\n\n.fa-school-circle-exclamation {\n --fa: "\\e56c";\n}\n\n.fa-school-circle-xmark {\n --fa: "\\e56d";\n}\n\n.fa-school-flag {\n --fa: "\\e56e";\n}\n\n.fa-school-lock {\n --fa: "\\e56f";\n}\n\n.fa-sheet-plastic {\n --fa: "\\e571";\n}\n\n.fa-shield-cat {\n --fa: "\\e572";\n}\n\n.fa-shield-dog {\n --fa: "\\e573";\n}\n\n.fa-shield-heart {\n --fa: "\\e574";\n}\n\n.fa-square-nfi {\n --fa: "\\e576";\n}\n\n.fa-square-person-confined {\n --fa: "\\e577";\n}\n\n.fa-square-virus {\n --fa: "\\e578";\n}\n\n.fa-staff-snake {\n --fa: "\\e579";\n}\n\n.fa-rod-asclepius {\n --fa: "\\e579";\n}\n\n.fa-rod-snake {\n --fa: "\\e579";\n}\n\n.fa-staff-aesculapius {\n --fa: "\\e579";\n}\n\n.fa-sun-plant-wilt {\n --fa: "\\e57a";\n}\n\n.fa-tarp {\n --fa: "\\e57b";\n}\n\n.fa-tarp-droplet {\n --fa: "\\e57c";\n}\n\n.fa-tent {\n --fa: "\\e57d";\n}\n\n.fa-tent-arrow-down-to-line {\n --fa: "\\e57e";\n}\n\n.fa-tent-arrow-left-right {\n --fa: "\\e57f";\n}\n\n.fa-tent-arrow-turn-left {\n --fa: "\\e580";\n}\n\n.fa-tent-arrows-down {\n --fa: "\\e581";\n}\n\n.fa-tents {\n --fa: "\\e582";\n}\n\n.fa-toilet-portable {\n --fa: "\\e583";\n}\n\n.fa-toilets-portable {\n --fa: "\\e584";\n}\n\n.fa-tower-cell {\n --fa: "\\e585";\n}\n\n.fa-tower-observation {\n --fa: "\\e586";\n}\n\n.fa-tree-city {\n --fa: "\\e587";\n}\n\n.fa-trowel {\n --fa: "\\e589";\n}\n\n.fa-trowel-bricks {\n --fa: "\\e58a";\n}\n\n.fa-truck-arrow-right {\n --fa: "\\e58b";\n}\n\n.fa-truck-droplet {\n --fa: "\\e58c";\n}\n\n.fa-truck-field {\n --fa: "\\e58d";\n}\n\n.fa-truck-field-un {\n --fa: "\\e58e";\n}\n\n.fa-truck-plane {\n --fa: "\\e58f";\n}\n\n.fa-users-between-lines {\n --fa: "\\e591";\n}\n\n.fa-users-line {\n --fa: "\\e592";\n}\n\n.fa-users-rays {\n --fa: "\\e593";\n}\n\n.fa-users-rectangle {\n --fa: "\\e594";\n}\n\n.fa-users-viewfinder {\n --fa: "\\e595";\n}\n\n.fa-vial-circle-check {\n --fa: "\\e596";\n}\n\n.fa-vial-virus {\n --fa: "\\e597";\n}\n\n.fa-wheat-awn-circle-exclamation {\n --fa: "\\e598";\n}\n\n.fa-worm {\n --fa: "\\e599";\n}\n\n.fa-xmarks-lines {\n --fa: "\\e59a";\n}\n\n.fa-child-dress {\n --fa: "\\e59c";\n}\n\n.fa-child-reaching {\n --fa: "\\e59d";\n}\n\n.fa-file-circle-check {\n --fa: "\\e5a0";\n}\n\n.fa-file-circle-xmark {\n --fa: "\\e5a1";\n}\n\n.fa-person-through-window {\n --fa: "\\e5a9";\n}\n\n.fa-plant-wilt {\n --fa: "\\e5aa";\n}\n\n.fa-stapler {\n --fa: "\\e5af";\n}\n\n.fa-train-tram {\n --fa: "\\e5b4";\n}\n\n.fa-table-cells-column-lock {\n --fa: "\\e678";\n}\n\n.fa-table-cells-row-lock {\n --fa: "\\e67a";\n}\n\n.fa-web-awesome {\n --fa: "\\e682";\n}\n\n.fa-thumbtack-slash {\n --fa: "\\e68f";\n}\n\n.fa-thumb-tack-slash {\n --fa: "\\e68f";\n}\n\n.fa-table-cells-row-unlock {\n --fa: "\\e691";\n}\n\n.fa-chart-diagram {\n --fa: "\\e695";\n}\n\n.fa-comment-nodes {\n --fa: "\\e696";\n}\n\n.fa-file-fragment {\n --fa: "\\e697";\n}\n\n.fa-file-half-dashed {\n --fa: "\\e698";\n}\n\n.fa-hexagon-nodes {\n --fa: "\\e699";\n}\n\n.fa-hexagon-nodes-bolt {\n --fa: "\\e69a";\n}\n\n.fa-square-binary {\n --fa: "\\e69b";\n}\n\n.fa-pentagon {\n --fa: "\\e790";\n}\n\n.fa-non-binary {\n --fa: "\\e807";\n}\n\n.fa-spiral {\n --fa: "\\e80a";\n}\n\n.fa-picture-in-picture {\n --fa: "\\e80b";\n}\n\n.fa-mobile-vibrate {\n --fa: "\\e816";\n}\n\n.fa-single-quote-left {\n --fa: "\\e81b";\n}\n\n.fa-single-quote-right {\n --fa: "\\e81c";\n}\n\n.fa-bus-side {\n --fa: "\\e81d";\n}\n\n.fa-septagon {\n --fa: "\\e820";\n}\n\n.fa-heptagon {\n --fa: "\\e820";\n}\n\n.fa-aquarius {\n --fa: "\\e845";\n}\n\n.fa-aries {\n --fa: "\\e846";\n}\n\n.fa-cancer {\n --fa: "\\e847";\n}\n\n.fa-capricorn {\n --fa: "\\e848";\n}\n\n.fa-gemini {\n --fa: "\\e849";\n}\n\n.fa-leo {\n --fa: "\\e84a";\n}\n\n.fa-libra {\n --fa: "\\e84b";\n}\n\n.fa-pisces {\n --fa: "\\e84c";\n}\n\n.fa-sagittarius {\n --fa: "\\e84d";\n}\n\n.fa-scorpio {\n --fa: "\\e84e";\n}\n\n.fa-taurus {\n --fa: "\\e84f";\n}\n\n.fa-virgo {\n --fa: "\\e850";\n}\n\n.fa-martini-glass-empty {\n --fa: "\\f000";\n}\n\n.fa-glass-martini {\n --fa: "\\f000";\n}\n\n.fa-music {\n --fa: "\\f001";\n}\n\n.fa-magnifying-glass {\n --fa: "\\f002";\n}\n\n.fa-search {\n --fa: "\\f002";\n}\n\n.fa-heart {\n --fa: "\\f004";\n}\n\n.fa-star {\n --fa: "\\f005";\n}\n\n.fa-user {\n --fa: "\\f007";\n}\n\n.fa-user-alt {\n --fa: "\\f007";\n}\n\n.fa-user-large {\n --fa: "\\f007";\n}\n\n.fa-film {\n --fa: "\\f008";\n}\n\n.fa-film-alt {\n --fa: "\\f008";\n}\n\n.fa-film-simple {\n --fa: "\\f008";\n}\n\n.fa-table-cells-large {\n --fa: "\\f009";\n}\n\n.fa-th-large {\n --fa: "\\f009";\n}\n\n.fa-table-cells {\n --fa: "\\f00a";\n}\n\n.fa-th {\n --fa: "\\f00a";\n}\n\n.fa-table-list {\n --fa: "\\f00b";\n}\n\n.fa-th-list {\n --fa: "\\f00b";\n}\n\n.fa-check {\n --fa: "\\f00c";\n}\n\n.fa-xmark {\n --fa: "\\f00d";\n}\n\n.fa-close {\n --fa: "\\f00d";\n}\n\n.fa-multiply {\n --fa: "\\f00d";\n}\n\n.fa-remove {\n --fa: "\\f00d";\n}\n\n.fa-times {\n --fa: "\\f00d";\n}\n\n.fa-magnifying-glass-plus {\n --fa: "\\f00e";\n}\n\n.fa-search-plus {\n --fa: "\\f00e";\n}\n\n.fa-magnifying-glass-minus {\n --fa: "\\f010";\n}\n\n.fa-search-minus {\n --fa: "\\f010";\n}\n\n.fa-power-off {\n --fa: "\\f011";\n}\n\n.fa-signal {\n --fa: "\\f012";\n}\n\n.fa-signal-5 {\n --fa: "\\f012";\n}\n\n.fa-signal-perfect {\n --fa: "\\f012";\n}\n\n.fa-gear {\n --fa: "\\f013";\n}\n\n.fa-cog {\n --fa: "\\f013";\n}\n\n.fa-house {\n --fa: "\\f015";\n}\n\n.fa-home {\n --fa: "\\f015";\n}\n\n.fa-home-alt {\n --fa: "\\f015";\n}\n\n.fa-home-lg-alt {\n --fa: "\\f015";\n}\n\n.fa-clock {\n --fa: "\\f017";\n}\n\n.fa-clock-four {\n --fa: "\\f017";\n}\n\n.fa-road {\n --fa: "\\f018";\n}\n\n.fa-download {\n --fa: "\\f019";\n}\n\n.fa-inbox {\n --fa: "\\f01c";\n}\n\n.fa-arrow-rotate-right {\n --fa: "\\f01e";\n}\n\n.fa-arrow-right-rotate {\n --fa: "\\f01e";\n}\n\n.fa-arrow-rotate-forward {\n --fa: "\\f01e";\n}\n\n.fa-redo {\n --fa: "\\f01e";\n}\n\n.fa-arrows-rotate {\n --fa: "\\f021";\n}\n\n.fa-refresh {\n --fa: "\\f021";\n}\n\n.fa-sync {\n --fa: "\\f021";\n}\n\n.fa-rectangle-list {\n --fa: "\\f022";\n}\n\n.fa-list-alt {\n --fa: "\\f022";\n}\n\n.fa-lock {\n --fa: "\\f023";\n}\n\n.fa-flag {\n --fa: "\\f024";\n}\n\n.fa-headphones {\n --fa: "\\f025";\n}\n\n.fa-headphones-alt {\n --fa: "\\f025";\n}\n\n.fa-headphones-simple {\n --fa: "\\f025";\n}\n\n.fa-volume-off {\n --fa: "\\f026";\n}\n\n.fa-volume-low {\n --fa: "\\f027";\n}\n\n.fa-volume-down {\n --fa: "\\f027";\n}\n\n.fa-volume-high {\n --fa: "\\f028";\n}\n\n.fa-volume-up {\n --fa: "\\f028";\n}\n\n.fa-qrcode {\n --fa: "\\f029";\n}\n\n.fa-barcode {\n --fa: "\\f02a";\n}\n\n.fa-tag {\n --fa: "\\f02b";\n}\n\n.fa-tags {\n --fa: "\\f02c";\n}\n\n.fa-book {\n --fa: "\\f02d";\n}\n\n.fa-bookmark {\n --fa: "\\f02e";\n}\n\n.fa-print {\n --fa: "\\f02f";\n}\n\n.fa-camera {\n --fa: "\\f030";\n}\n\n.fa-camera-alt {\n --fa: "\\f030";\n}\n\n.fa-font {\n --fa: "\\f031";\n}\n\n.fa-bold {\n --fa: "\\f032";\n}\n\n.fa-italic {\n --fa: "\\f033";\n}\n\n.fa-text-height {\n --fa: "\\f034";\n}\n\n.fa-text-width {\n --fa: "\\f035";\n}\n\n.fa-align-left {\n --fa: "\\f036";\n}\n\n.fa-align-center {\n --fa: "\\f037";\n}\n\n.fa-align-right {\n --fa: "\\f038";\n}\n\n.fa-align-justify {\n --fa: "\\f039";\n}\n\n.fa-list {\n --fa: "\\f03a";\n}\n\n.fa-list-squares {\n --fa: "\\f03a";\n}\n\n.fa-outdent {\n --fa: "\\f03b";\n}\n\n.fa-dedent {\n --fa: "\\f03b";\n}\n\n.fa-indent {\n --fa: "\\f03c";\n}\n\n.fa-video {\n --fa: "\\f03d";\n}\n\n.fa-video-camera {\n --fa: "\\f03d";\n}\n\n.fa-image {\n --fa: "\\f03e";\n}\n\n.fa-location-pin {\n --fa: "\\f041";\n}\n\n.fa-map-marker {\n --fa: "\\f041";\n}\n\n.fa-circle-half-stroke {\n --fa: "\\f042";\n}\n\n.fa-adjust {\n --fa: "\\f042";\n}\n\n.fa-droplet {\n --fa: "\\f043";\n}\n\n.fa-tint {\n --fa: "\\f043";\n}\n\n.fa-pen-to-square {\n --fa: "\\f044";\n}\n\n.fa-edit {\n --fa: "\\f044";\n}\n\n.fa-arrows-up-down-left-right {\n --fa: "\\f047";\n}\n\n.fa-arrows {\n --fa: "\\f047";\n}\n\n.fa-backward-step {\n --fa: "\\f048";\n}\n\n.fa-step-backward {\n --fa: "\\f048";\n}\n\n.fa-backward-fast {\n --fa: "\\f049";\n}\n\n.fa-fast-backward {\n --fa: "\\f049";\n}\n\n.fa-backward {\n --fa: "\\f04a";\n}\n\n.fa-play {\n --fa: "\\f04b";\n}\n\n.fa-pause {\n --fa: "\\f04c";\n}\n\n.fa-stop {\n --fa: "\\f04d";\n}\n\n.fa-forward {\n --fa: "\\f04e";\n}\n\n.fa-forward-fast {\n --fa: "\\f050";\n}\n\n.fa-fast-forward {\n --fa: "\\f050";\n}\n\n.fa-forward-step {\n --fa: "\\f051";\n}\n\n.fa-step-forward {\n --fa: "\\f051";\n}\n\n.fa-eject {\n --fa: "\\f052";\n}\n\n.fa-chevron-left {\n --fa: "\\f053";\n}\n\n.fa-chevron-right {\n --fa: "\\f054";\n}\n\n.fa-circle-plus {\n --fa: "\\f055";\n}\n\n.fa-plus-circle {\n --fa: "\\f055";\n}\n\n.fa-circle-minus {\n --fa: "\\f056";\n}\n\n.fa-minus-circle {\n --fa: "\\f056";\n}\n\n.fa-circle-xmark {\n --fa: "\\f057";\n}\n\n.fa-times-circle {\n --fa: "\\f057";\n}\n\n.fa-xmark-circle {\n --fa: "\\f057";\n}\n\n.fa-circle-check {\n --fa: "\\f058";\n}\n\n.fa-check-circle {\n --fa: "\\f058";\n}\n\n.fa-circle-question {\n --fa: "\\f059";\n}\n\n.fa-question-circle {\n --fa: "\\f059";\n}\n\n.fa-circle-info {\n --fa: "\\f05a";\n}\n\n.fa-info-circle {\n --fa: "\\f05a";\n}\n\n.fa-crosshairs {\n --fa: "\\f05b";\n}\n\n.fa-ban {\n --fa: "\\f05e";\n}\n\n.fa-cancel {\n --fa: "\\f05e";\n}\n\n.fa-arrow-left {\n --fa: "\\f060";\n}\n\n.fa-arrow-right {\n --fa: "\\f061";\n}\n\n.fa-arrow-up {\n --fa: "\\f062";\n}\n\n.fa-arrow-down {\n --fa: "\\f063";\n}\n\n.fa-share {\n --fa: "\\f064";\n}\n\n.fa-mail-forward {\n --fa: "\\f064";\n}\n\n.fa-expand {\n --fa: "\\f065";\n}\n\n.fa-compress {\n --fa: "\\f066";\n}\n\n.fa-minus {\n --fa: "\\f068";\n}\n\n.fa-subtract {\n --fa: "\\f068";\n}\n\n.fa-circle-exclamation {\n --fa: "\\f06a";\n}\n\n.fa-exclamation-circle {\n --fa: "\\f06a";\n}\n\n.fa-gift {\n --fa: "\\f06b";\n}\n\n.fa-leaf {\n --fa: "\\f06c";\n}\n\n.fa-fire {\n --fa: "\\f06d";\n}\n\n.fa-eye {\n --fa: "\\f06e";\n}\n\n.fa-eye-slash {\n --fa: "\\f070";\n}\n\n.fa-triangle-exclamation {\n --fa: "\\f071";\n}\n\n.fa-exclamation-triangle {\n --fa: "\\f071";\n}\n\n.fa-warning {\n --fa: "\\f071";\n}\n\n.fa-plane {\n --fa: "\\f072";\n}\n\n.fa-calendar-days {\n --fa: "\\f073";\n}\n\n.fa-calendar-alt {\n --fa: "\\f073";\n}\n\n.fa-shuffle {\n --fa: "\\f074";\n}\n\n.fa-random {\n --fa: "\\f074";\n}\n\n.fa-comment {\n --fa: "\\f075";\n}\n\n.fa-magnet {\n --fa: "\\f076";\n}\n\n.fa-chevron-up {\n --fa: "\\f077";\n}\n\n.fa-chevron-down {\n --fa: "\\f078";\n}\n\n.fa-retweet {\n --fa: "\\f079";\n}\n\n.fa-cart-shopping {\n --fa: "\\f07a";\n}\n\n.fa-shopping-cart {\n --fa: "\\f07a";\n}\n\n.fa-folder {\n --fa: "\\f07b";\n}\n\n.fa-folder-blank {\n --fa: "\\f07b";\n}\n\n.fa-folder-open {\n --fa: "\\f07c";\n}\n\n.fa-arrows-up-down {\n --fa: "\\f07d";\n}\n\n.fa-arrows-v {\n --fa: "\\f07d";\n}\n\n.fa-arrows-left-right {\n --fa: "\\f07e";\n}\n\n.fa-arrows-h {\n --fa: "\\f07e";\n}\n\n.fa-chart-bar {\n --fa: "\\f080";\n}\n\n.fa-bar-chart {\n --fa: "\\f080";\n}\n\n.fa-camera-retro {\n --fa: "\\f083";\n}\n\n.fa-key {\n --fa: "\\f084";\n}\n\n.fa-gears {\n --fa: "\\f085";\n}\n\n.fa-cogs {\n --fa: "\\f085";\n}\n\n.fa-comments {\n --fa: "\\f086";\n}\n\n.fa-star-half {\n --fa: "\\f089";\n}\n\n.fa-arrow-right-from-bracket {\n --fa: "\\f08b";\n}\n\n.fa-sign-out {\n --fa: "\\f08b";\n}\n\n.fa-thumbtack {\n --fa: "\\f08d";\n}\n\n.fa-thumb-tack {\n --fa: "\\f08d";\n}\n\n.fa-arrow-up-right-from-square {\n --fa: "\\f08e";\n}\n\n.fa-external-link {\n --fa: "\\f08e";\n}\n\n.fa-arrow-right-to-bracket {\n --fa: "\\f090";\n}\n\n.fa-sign-in {\n --fa: "\\f090";\n}\n\n.fa-trophy {\n --fa: "\\f091";\n}\n\n.fa-upload {\n --fa: "\\f093";\n}\n\n.fa-lemon {\n --fa: "\\f094";\n}\n\n.fa-phone {\n --fa: "\\f095";\n}\n\n.fa-square-phone {\n --fa: "\\f098";\n}\n\n.fa-phone-square {\n --fa: "\\f098";\n}\n\n.fa-unlock {\n --fa: "\\f09c";\n}\n\n.fa-credit-card {\n --fa: "\\f09d";\n}\n\n.fa-credit-card-alt {\n --fa: "\\f09d";\n}\n\n.fa-rss {\n --fa: "\\f09e";\n}\n\n.fa-feed {\n --fa: "\\f09e";\n}\n\n.fa-hard-drive {\n --fa: "\\f0a0";\n}\n\n.fa-hdd {\n --fa: "\\f0a0";\n}\n\n.fa-bullhorn {\n --fa: "\\f0a1";\n}\n\n.fa-certificate {\n --fa: "\\f0a3";\n}\n\n.fa-hand-point-right {\n --fa: "\\f0a4";\n}\n\n.fa-hand-point-left {\n --fa: "\\f0a5";\n}\n\n.fa-hand-point-up {\n --fa: "\\f0a6";\n}\n\n.fa-hand-point-down {\n --fa: "\\f0a7";\n}\n\n.fa-circle-arrow-left {\n --fa: "\\f0a8";\n}\n\n.fa-arrow-circle-left {\n --fa: "\\f0a8";\n}\n\n.fa-circle-arrow-right {\n --fa: "\\f0a9";\n}\n\n.fa-arrow-circle-right {\n --fa: "\\f0a9";\n}\n\n.fa-circle-arrow-up {\n --fa: "\\f0aa";\n}\n\n.fa-arrow-circle-up {\n --fa: "\\f0aa";\n}\n\n.fa-circle-arrow-down {\n --fa: "\\f0ab";\n}\n\n.fa-arrow-circle-down {\n --fa: "\\f0ab";\n}\n\n.fa-globe {\n --fa: "\\f0ac";\n}\n\n.fa-wrench {\n --fa: "\\f0ad";\n}\n\n.fa-list-check {\n --fa: "\\f0ae";\n}\n\n.fa-tasks {\n --fa: "\\f0ae";\n}\n\n.fa-filter {\n --fa: "\\f0b0";\n}\n\n.fa-briefcase {\n --fa: "\\f0b1";\n}\n\n.fa-up-down-left-right {\n --fa: "\\f0b2";\n}\n\n.fa-arrows-alt {\n --fa: "\\f0b2";\n}\n\n.fa-users {\n --fa: "\\f0c0";\n}\n\n.fa-link {\n --fa: "\\f0c1";\n}\n\n.fa-chain {\n --fa: "\\f0c1";\n}\n\n.fa-cloud {\n --fa: "\\f0c2";\n}\n\n.fa-flask {\n --fa: "\\f0c3";\n}\n\n.fa-scissors {\n --fa: "\\f0c4";\n}\n\n.fa-cut {\n --fa: "\\f0c4";\n}\n\n.fa-copy {\n --fa: "\\f0c5";\n}\n\n.fa-paperclip {\n --fa: "\\f0c6";\n}\n\n.fa-floppy-disk {\n --fa: "\\f0c7";\n}\n\n.fa-save {\n --fa: "\\f0c7";\n}\n\n.fa-square {\n --fa: "\\f0c8";\n}\n\n.fa-bars {\n --fa: "\\f0c9";\n}\n\n.fa-navicon {\n --fa: "\\f0c9";\n}\n\n.fa-list-ul {\n --fa: "\\f0ca";\n}\n\n.fa-list-dots {\n --fa: "\\f0ca";\n}\n\n.fa-list-ol {\n --fa: "\\f0cb";\n}\n\n.fa-list-1-2 {\n --fa: "\\f0cb";\n}\n\n.fa-list-numeric {\n --fa: "\\f0cb";\n}\n\n.fa-strikethrough {\n --fa: "\\f0cc";\n}\n\n.fa-underline {\n --fa: "\\f0cd";\n}\n\n.fa-table {\n --fa: "\\f0ce";\n}\n\n.fa-wand-magic {\n --fa: "\\f0d0";\n}\n\n.fa-magic {\n --fa: "\\f0d0";\n}\n\n.fa-truck {\n --fa: "\\f0d1";\n}\n\n.fa-money-bill {\n --fa: "\\f0d6";\n}\n\n.fa-caret-down {\n --fa: "\\f0d7";\n}\n\n.fa-caret-up {\n --fa: "\\f0d8";\n}\n\n.fa-caret-left {\n --fa: "\\f0d9";\n}\n\n.fa-caret-right {\n --fa: "\\f0da";\n}\n\n.fa-table-columns {\n --fa: "\\f0db";\n}\n\n.fa-columns {\n --fa: "\\f0db";\n}\n\n.fa-sort {\n --fa: "\\f0dc";\n}\n\n.fa-unsorted {\n --fa: "\\f0dc";\n}\n\n.fa-sort-down {\n --fa: "\\f0dd";\n}\n\n.fa-sort-desc {\n --fa: "\\f0dd";\n}\n\n.fa-sort-up {\n --fa: "\\f0de";\n}\n\n.fa-sort-asc {\n --fa: "\\f0de";\n}\n\n.fa-envelope {\n --fa: "\\f0e0";\n}\n\n.fa-arrow-rotate-left {\n --fa: "\\f0e2";\n}\n\n.fa-arrow-left-rotate {\n --fa: "\\f0e2";\n}\n\n.fa-arrow-rotate-back {\n --fa: "\\f0e2";\n}\n\n.fa-arrow-rotate-backward {\n --fa: "\\f0e2";\n}\n\n.fa-undo {\n --fa: "\\f0e2";\n}\n\n.fa-gavel {\n --fa: "\\f0e3";\n}\n\n.fa-legal {\n --fa: "\\f0e3";\n}\n\n.fa-bolt {\n --fa: "\\f0e7";\n}\n\n.fa-zap {\n --fa: "\\f0e7";\n}\n\n.fa-sitemap {\n --fa: "\\f0e8";\n}\n\n.fa-umbrella {\n --fa: "\\f0e9";\n}\n\n.fa-paste {\n --fa: "\\f0ea";\n}\n\n.fa-file-clipboard {\n --fa: "\\f0ea";\n}\n\n.fa-lightbulb {\n --fa: "\\f0eb";\n}\n\n.fa-arrow-right-arrow-left {\n --fa: "\\f0ec";\n}\n\n.fa-exchange {\n --fa: "\\f0ec";\n}\n\n.fa-cloud-arrow-down {\n --fa: "\\f0ed";\n}\n\n.fa-cloud-download {\n --fa: "\\f0ed";\n}\n\n.fa-cloud-download-alt {\n --fa: "\\f0ed";\n}\n\n.fa-cloud-arrow-up {\n --fa: "\\f0ee";\n}\n\n.fa-cloud-upload {\n --fa: "\\f0ee";\n}\n\n.fa-cloud-upload-alt {\n --fa: "\\f0ee";\n}\n\n.fa-user-doctor {\n --fa: "\\f0f0";\n}\n\n.fa-user-md {\n --fa: "\\f0f0";\n}\n\n.fa-stethoscope {\n --fa: "\\f0f1";\n}\n\n.fa-suitcase {\n --fa: "\\f0f2";\n}\n\n.fa-bell {\n --fa: "\\f0f3";\n}\n\n.fa-mug-saucer {\n --fa: "\\f0f4";\n}\n\n.fa-coffee {\n --fa: "\\f0f4";\n}\n\n.fa-hospital {\n --fa: "\\f0f8";\n}\n\n.fa-hospital-alt {\n --fa: "\\f0f8";\n}\n\n.fa-hospital-wide {\n --fa: "\\f0f8";\n}\n\n.fa-truck-medical {\n --fa: "\\f0f9";\n}\n\n.fa-ambulance {\n --fa: "\\f0f9";\n}\n\n.fa-suitcase-medical {\n --fa: "\\f0fa";\n}\n\n.fa-medkit {\n --fa: "\\f0fa";\n}\n\n.fa-jet-fighter {\n --fa: "\\f0fb";\n}\n\n.fa-fighter-jet {\n --fa: "\\f0fb";\n}\n\n.fa-beer-mug-empty {\n --fa: "\\f0fc";\n}\n\n.fa-beer {\n --fa: "\\f0fc";\n}\n\n.fa-square-h {\n --fa: "\\f0fd";\n}\n\n.fa-h-square {\n --fa: "\\f0fd";\n}\n\n.fa-square-plus {\n --fa: "\\f0fe";\n}\n\n.fa-plus-square {\n --fa: "\\f0fe";\n}\n\n.fa-angles-left {\n --fa: "\\f100";\n}\n\n.fa-angle-double-left {\n --fa: "\\f100";\n}\n\n.fa-angles-right {\n --fa: "\\f101";\n}\n\n.fa-angle-double-right {\n --fa: "\\f101";\n}\n\n.fa-angles-up {\n --fa: "\\f102";\n}\n\n.fa-angle-double-up {\n --fa: "\\f102";\n}\n\n.fa-angles-down {\n --fa: "\\f103";\n}\n\n.fa-angle-double-down {\n --fa: "\\f103";\n}\n\n.fa-angle-left {\n --fa: "\\f104";\n}\n\n.fa-angle-right {\n --fa: "\\f105";\n}\n\n.fa-angle-up {\n --fa: "\\f106";\n}\n\n.fa-angle-down {\n --fa: "\\f107";\n}\n\n.fa-laptop {\n --fa: "\\f109";\n}\n\n.fa-tablet-button {\n --fa: "\\f10a";\n}\n\n.fa-mobile-button {\n --fa: "\\f10b";\n}\n\n.fa-quote-left {\n --fa: "\\f10d";\n}\n\n.fa-quote-left-alt {\n --fa: "\\f10d";\n}\n\n.fa-quote-right {\n --fa: "\\f10e";\n}\n\n.fa-quote-right-alt {\n --fa: "\\f10e";\n}\n\n.fa-spinner {\n --fa: "\\f110";\n}\n\n.fa-circle {\n --fa: "\\f111";\n}\n\n.fa-face-smile {\n --fa: "\\f118";\n}\n\n.fa-smile {\n --fa: "\\f118";\n}\n\n.fa-face-frown {\n --fa: "\\f119";\n}\n\n.fa-frown {\n --fa: "\\f119";\n}\n\n.fa-face-meh {\n --fa: "\\f11a";\n}\n\n.fa-meh {\n --fa: "\\f11a";\n}\n\n.fa-gamepad {\n --fa: "\\f11b";\n}\n\n.fa-keyboard {\n --fa: "\\f11c";\n}\n\n.fa-flag-checkered {\n --fa: "\\f11e";\n}\n\n.fa-terminal {\n --fa: "\\f120";\n}\n\n.fa-code {\n --fa: "\\f121";\n}\n\n.fa-reply-all {\n --fa: "\\f122";\n}\n\n.fa-mail-reply-all {\n --fa: "\\f122";\n}\n\n.fa-location-arrow {\n --fa: "\\f124";\n}\n\n.fa-crop {\n --fa: "\\f125";\n}\n\n.fa-code-branch {\n --fa: "\\f126";\n}\n\n.fa-link-slash {\n --fa: "\\f127";\n}\n\n.fa-chain-broken {\n --fa: "\\f127";\n}\n\n.fa-chain-slash {\n --fa: "\\f127";\n}\n\n.fa-unlink {\n --fa: "\\f127";\n}\n\n.fa-info {\n --fa: "\\f129";\n}\n\n.fa-superscript {\n --fa: "\\f12b";\n}\n\n.fa-subscript {\n --fa: "\\f12c";\n}\n\n.fa-eraser {\n --fa: "\\f12d";\n}\n\n.fa-puzzle-piece {\n --fa: "\\f12e";\n}\n\n.fa-microphone {\n --fa: "\\f130";\n}\n\n.fa-microphone-slash {\n --fa: "\\f131";\n}\n\n.fa-shield {\n --fa: "\\f132";\n}\n\n.fa-shield-blank {\n --fa: "\\f132";\n}\n\n.fa-calendar {\n --fa: "\\f133";\n}\n\n.fa-fire-extinguisher {\n --fa: "\\f134";\n}\n\n.fa-rocket {\n --fa: "\\f135";\n}\n\n.fa-circle-chevron-left {\n --fa: "\\f137";\n}\n\n.fa-chevron-circle-left {\n --fa: "\\f137";\n}\n\n.fa-circle-chevron-right {\n --fa: "\\f138";\n}\n\n.fa-chevron-circle-right {\n --fa: "\\f138";\n}\n\n.fa-circle-chevron-up {\n --fa: "\\f139";\n}\n\n.fa-chevron-circle-up {\n --fa: "\\f139";\n}\n\n.fa-circle-chevron-down {\n --fa: "\\f13a";\n}\n\n.fa-chevron-circle-down {\n --fa: "\\f13a";\n}\n\n.fa-anchor {\n --fa: "\\f13d";\n}\n\n.fa-unlock-keyhole {\n --fa: "\\f13e";\n}\n\n.fa-unlock-alt {\n --fa: "\\f13e";\n}\n\n.fa-bullseye {\n --fa: "\\f140";\n}\n\n.fa-ellipsis {\n --fa: "\\f141";\n}\n\n.fa-ellipsis-h {\n --fa: "\\f141";\n}\n\n.fa-ellipsis-vertical {\n --fa: "\\f142";\n}\n\n.fa-ellipsis-v {\n --fa: "\\f142";\n}\n\n.fa-square-rss {\n --fa: "\\f143";\n}\n\n.fa-rss-square {\n --fa: "\\f143";\n}\n\n.fa-circle-play {\n --fa: "\\f144";\n}\n\n.fa-play-circle {\n --fa: "\\f144";\n}\n\n.fa-ticket {\n --fa: "\\f145";\n}\n\n.fa-square-minus {\n --fa: "\\f146";\n}\n\n.fa-minus-square {\n --fa: "\\f146";\n}\n\n.fa-arrow-turn-up {\n --fa: "\\f148";\n}\n\n.fa-level-up {\n --fa: "\\f148";\n}\n\n.fa-arrow-turn-down {\n --fa: "\\f149";\n}\n\n.fa-level-down {\n --fa: "\\f149";\n}\n\n.fa-square-check {\n --fa: "\\f14a";\n}\n\n.fa-check-square {\n --fa: "\\f14a";\n}\n\n.fa-square-pen {\n --fa: "\\f14b";\n}\n\n.fa-pen-square {\n --fa: "\\f14b";\n}\n\n.fa-pencil-square {\n --fa: "\\f14b";\n}\n\n.fa-square-arrow-up-right {\n --fa: "\\f14c";\n}\n\n.fa-external-link-square {\n --fa: "\\f14c";\n}\n\n.fa-share-from-square {\n --fa: "\\f14d";\n}\n\n.fa-share-square {\n --fa: "\\f14d";\n}\n\n.fa-compass {\n --fa: "\\f14e";\n}\n\n.fa-square-caret-down {\n --fa: "\\f150";\n}\n\n.fa-caret-square-down {\n --fa: "\\f150";\n}\n\n.fa-square-caret-up {\n --fa: "\\f151";\n}\n\n.fa-caret-square-up {\n --fa: "\\f151";\n}\n\n.fa-square-caret-right {\n --fa: "\\f152";\n}\n\n.fa-caret-square-right {\n --fa: "\\f152";\n}\n\n.fa-euro-sign {\n --fa: "\\f153";\n}\n\n.fa-eur {\n --fa: "\\f153";\n}\n\n.fa-euro {\n --fa: "\\f153";\n}\n\n.fa-sterling-sign {\n --fa: "\\f154";\n}\n\n.fa-gbp {\n --fa: "\\f154";\n}\n\n.fa-pound-sign {\n --fa: "\\f154";\n}\n\n.fa-rupee-sign {\n --fa: "\\f156";\n}\n\n.fa-rupee {\n --fa: "\\f156";\n}\n\n.fa-yen-sign {\n --fa: "\\f157";\n}\n\n.fa-cny {\n --fa: "\\f157";\n}\n\n.fa-jpy {\n --fa: "\\f157";\n}\n\n.fa-rmb {\n --fa: "\\f157";\n}\n\n.fa-yen {\n --fa: "\\f157";\n}\n\n.fa-ruble-sign {\n --fa: "\\f158";\n}\n\n.fa-rouble {\n --fa: "\\f158";\n}\n\n.fa-rub {\n --fa: "\\f158";\n}\n\n.fa-ruble {\n --fa: "\\f158";\n}\n\n.fa-won-sign {\n --fa: "\\f159";\n}\n\n.fa-krw {\n --fa: "\\f159";\n}\n\n.fa-won {\n --fa: "\\f159";\n}\n\n.fa-file {\n --fa: "\\f15b";\n}\n\n.fa-file-lines {\n --fa: "\\f15c";\n}\n\n.fa-file-alt {\n --fa: "\\f15c";\n}\n\n.fa-file-text {\n --fa: "\\f15c";\n}\n\n.fa-arrow-down-a-z {\n --fa: "\\f15d";\n}\n\n.fa-sort-alpha-asc {\n --fa: "\\f15d";\n}\n\n.fa-sort-alpha-down {\n --fa: "\\f15d";\n}\n\n.fa-arrow-up-a-z {\n --fa: "\\f15e";\n}\n\n.fa-sort-alpha-up {\n --fa: "\\f15e";\n}\n\n.fa-arrow-down-wide-short {\n --fa: "\\f160";\n}\n\n.fa-sort-amount-asc {\n --fa: "\\f160";\n}\n\n.fa-sort-amount-down {\n --fa: "\\f160";\n}\n\n.fa-arrow-up-wide-short {\n --fa: "\\f161";\n}\n\n.fa-sort-amount-up {\n --fa: "\\f161";\n}\n\n.fa-arrow-down-1-9 {\n --fa: "\\f162";\n}\n\n.fa-sort-numeric-asc {\n --fa: "\\f162";\n}\n\n.fa-sort-numeric-down {\n --fa: "\\f162";\n}\n\n.fa-arrow-up-1-9 {\n --fa: "\\f163";\n}\n\n.fa-sort-numeric-up {\n --fa: "\\f163";\n}\n\n.fa-thumbs-up {\n --fa: "\\f164";\n}\n\n.fa-thumbs-down {\n --fa: "\\f165";\n}\n\n.fa-arrow-down-long {\n --fa: "\\f175";\n}\n\n.fa-long-arrow-down {\n --fa: "\\f175";\n}\n\n.fa-arrow-up-long {\n --fa: "\\f176";\n}\n\n.fa-long-arrow-up {\n --fa: "\\f176";\n}\n\n.fa-arrow-left-long {\n --fa: "\\f177";\n}\n\n.fa-long-arrow-left {\n --fa: "\\f177";\n}\n\n.fa-arrow-right-long {\n --fa: "\\f178";\n}\n\n.fa-long-arrow-right {\n --fa: "\\f178";\n}\n\n.fa-person-dress {\n --fa: "\\f182";\n}\n\n.fa-female {\n --fa: "\\f182";\n}\n\n.fa-person {\n --fa: "\\f183";\n}\n\n.fa-male {\n --fa: "\\f183";\n}\n\n.fa-sun {\n --fa: "\\f185";\n}\n\n.fa-moon {\n --fa: "\\f186";\n}\n\n.fa-box-archive {\n --fa: "\\f187";\n}\n\n.fa-archive {\n --fa: "\\f187";\n}\n\n.fa-bug {\n --fa: "\\f188";\n}\n\n.fa-square-caret-left {\n --fa: "\\f191";\n}\n\n.fa-caret-square-left {\n --fa: "\\f191";\n}\n\n.fa-circle-dot {\n --fa: "\\f192";\n}\n\n.fa-dot-circle {\n --fa: "\\f192";\n}\n\n.fa-wheelchair {\n --fa: "\\f193";\n}\n\n.fa-lira-sign {\n --fa: "\\f195";\n}\n\n.fa-shuttle-space {\n --fa: "\\f197";\n}\n\n.fa-space-shuttle {\n --fa: "\\f197";\n}\n\n.fa-square-envelope {\n --fa: "\\f199";\n}\n\n.fa-envelope-square {\n --fa: "\\f199";\n}\n\n.fa-building-columns {\n --fa: "\\f19c";\n}\n\n.fa-bank {\n --fa: "\\f19c";\n}\n\n.fa-institution {\n --fa: "\\f19c";\n}\n\n.fa-museum {\n --fa: "\\f19c";\n}\n\n.fa-university {\n --fa: "\\f19c";\n}\n\n.fa-graduation-cap {\n --fa: "\\f19d";\n}\n\n.fa-mortar-board {\n --fa: "\\f19d";\n}\n\n.fa-language {\n --fa: "\\f1ab";\n}\n\n.fa-fax {\n --fa: "\\f1ac";\n}\n\n.fa-building {\n --fa: "\\f1ad";\n}\n\n.fa-child {\n --fa: "\\f1ae";\n}\n\n.fa-paw {\n --fa: "\\f1b0";\n}\n\n.fa-cube {\n --fa: "\\f1b2";\n}\n\n.fa-cubes {\n --fa: "\\f1b3";\n}\n\n.fa-recycle {\n --fa: "\\f1b8";\n}\n\n.fa-car {\n --fa: "\\f1b9";\n}\n\n.fa-automobile {\n --fa: "\\f1b9";\n}\n\n.fa-taxi {\n --fa: "\\f1ba";\n}\n\n.fa-cab {\n --fa: "\\f1ba";\n}\n\n.fa-tree {\n --fa: "\\f1bb";\n}\n\n.fa-database {\n --fa: "\\f1c0";\n}\n\n.fa-file-pdf {\n --fa: "\\f1c1";\n}\n\n.fa-file-word {\n --fa: "\\f1c2";\n}\n\n.fa-file-excel {\n --fa: "\\f1c3";\n}\n\n.fa-file-powerpoint {\n --fa: "\\f1c4";\n}\n\n.fa-file-image {\n --fa: "\\f1c5";\n}\n\n.fa-file-zipper {\n --fa: "\\f1c6";\n}\n\n.fa-file-archive {\n --fa: "\\f1c6";\n}\n\n.fa-file-audio {\n --fa: "\\f1c7";\n}\n\n.fa-file-video {\n --fa: "\\f1c8";\n}\n\n.fa-file-code {\n --fa: "\\f1c9";\n}\n\n.fa-life-ring {\n --fa: "\\f1cd";\n}\n\n.fa-circle-notch {\n --fa: "\\f1ce";\n}\n\n.fa-paper-plane {\n --fa: "\\f1d8";\n}\n\n.fa-clock-rotate-left {\n --fa: "\\f1da";\n}\n\n.fa-history {\n --fa: "\\f1da";\n}\n\n.fa-heading {\n --fa: "\\f1dc";\n}\n\n.fa-header {\n --fa: "\\f1dc";\n}\n\n.fa-paragraph {\n --fa: "\\f1dd";\n}\n\n.fa-sliders {\n --fa: "\\f1de";\n}\n\n.fa-sliders-h {\n --fa: "\\f1de";\n}\n\n.fa-share-nodes {\n --fa: "\\f1e0";\n}\n\n.fa-share-alt {\n --fa: "\\f1e0";\n}\n\n.fa-square-share-nodes {\n --fa: "\\f1e1";\n}\n\n.fa-share-alt-square {\n --fa: "\\f1e1";\n}\n\n.fa-bomb {\n --fa: "\\f1e2";\n}\n\n.fa-futbol {\n --fa: "\\f1e3";\n}\n\n.fa-futbol-ball {\n --fa: "\\f1e3";\n}\n\n.fa-soccer-ball {\n --fa: "\\f1e3";\n}\n\n.fa-tty {\n --fa: "\\f1e4";\n}\n\n.fa-teletype {\n --fa: "\\f1e4";\n}\n\n.fa-binoculars {\n --fa: "\\f1e5";\n}\n\n.fa-plug {\n --fa: "\\f1e6";\n}\n\n.fa-newspaper {\n --fa: "\\f1ea";\n}\n\n.fa-wifi {\n --fa: "\\f1eb";\n}\n\n.fa-wifi-3 {\n --fa: "\\f1eb";\n}\n\n.fa-wifi-strong {\n --fa: "\\f1eb";\n}\n\n.fa-calculator {\n --fa: "\\f1ec";\n}\n\n.fa-bell-slash {\n --fa: "\\f1f6";\n}\n\n.fa-trash {\n --fa: "\\f1f8";\n}\n\n.fa-copyright {\n --fa: "\\f1f9";\n}\n\n.fa-eye-dropper {\n --fa: "\\f1fb";\n}\n\n.fa-eye-dropper-empty {\n --fa: "\\f1fb";\n}\n\n.fa-eyedropper {\n --fa: "\\f1fb";\n}\n\n.fa-paintbrush {\n --fa: "\\f1fc";\n}\n\n.fa-paint-brush {\n --fa: "\\f1fc";\n}\n\n.fa-cake-candles {\n --fa: "\\f1fd";\n}\n\n.fa-birthday-cake {\n --fa: "\\f1fd";\n}\n\n.fa-cake {\n --fa: "\\f1fd";\n}\n\n.fa-chart-area {\n --fa: "\\f1fe";\n}\n\n.fa-area-chart {\n --fa: "\\f1fe";\n}\n\n.fa-chart-pie {\n --fa: "\\f200";\n}\n\n.fa-pie-chart {\n --fa: "\\f200";\n}\n\n.fa-chart-line {\n --fa: "\\f201";\n}\n\n.fa-line-chart {\n --fa: "\\f201";\n}\n\n.fa-toggle-off {\n --fa: "\\f204";\n}\n\n.fa-toggle-on {\n --fa: "\\f205";\n}\n\n.fa-bicycle {\n --fa: "\\f206";\n}\n\n.fa-bus {\n --fa: "\\f207";\n}\n\n.fa-closed-captioning {\n --fa: "\\f20a";\n}\n\n.fa-shekel-sign {\n --fa: "\\f20b";\n}\n\n.fa-ils {\n --fa: "\\f20b";\n}\n\n.fa-shekel {\n --fa: "\\f20b";\n}\n\n.fa-sheqel {\n --fa: "\\f20b";\n}\n\n.fa-sheqel-sign {\n --fa: "\\f20b";\n}\n\n.fa-cart-plus {\n --fa: "\\f217";\n}\n\n.fa-cart-arrow-down {\n --fa: "\\f218";\n}\n\n.fa-diamond {\n --fa: "\\f219";\n}\n\n.fa-ship {\n --fa: "\\f21a";\n}\n\n.fa-user-secret {\n --fa: "\\f21b";\n}\n\n.fa-motorcycle {\n --fa: "\\f21c";\n}\n\n.fa-street-view {\n --fa: "\\f21d";\n}\n\n.fa-heart-pulse {\n --fa: "\\f21e";\n}\n\n.fa-heartbeat {\n --fa: "\\f21e";\n}\n\n.fa-venus {\n --fa: "\\f221";\n}\n\n.fa-mars {\n --fa: "\\f222";\n}\n\n.fa-mercury {\n --fa: "\\f223";\n}\n\n.fa-mars-and-venus {\n --fa: "\\f224";\n}\n\n.fa-transgender {\n --fa: "\\f225";\n}\n\n.fa-transgender-alt {\n --fa: "\\f225";\n}\n\n.fa-venus-double {\n --fa: "\\f226";\n}\n\n.fa-mars-double {\n --fa: "\\f227";\n}\n\n.fa-venus-mars {\n --fa: "\\f228";\n}\n\n.fa-mars-stroke {\n --fa: "\\f229";\n}\n\n.fa-mars-stroke-up {\n --fa: "\\f22a";\n}\n\n.fa-mars-stroke-v {\n --fa: "\\f22a";\n}\n\n.fa-mars-stroke-right {\n --fa: "\\f22b";\n}\n\n.fa-mars-stroke-h {\n --fa: "\\f22b";\n}\n\n.fa-neuter {\n --fa: "\\f22c";\n}\n\n.fa-genderless {\n --fa: "\\f22d";\n}\n\n.fa-server {\n --fa: "\\f233";\n}\n\n.fa-user-plus {\n --fa: "\\f234";\n}\n\n.fa-user-xmark {\n --fa: "\\f235";\n}\n\n.fa-user-times {\n --fa: "\\f235";\n}\n\n.fa-bed {\n --fa: "\\f236";\n}\n\n.fa-train {\n --fa: "\\f238";\n}\n\n.fa-train-subway {\n --fa: "\\f239";\n}\n\n.fa-subway {\n --fa: "\\f239";\n}\n\n.fa-battery-full {\n --fa: "\\f240";\n}\n\n.fa-battery {\n --fa: "\\f240";\n}\n\n.fa-battery-5 {\n --fa: "\\f240";\n}\n\n.fa-battery-three-quarters {\n --fa: "\\f241";\n}\n\n.fa-battery-4 {\n --fa: "\\f241";\n}\n\n.fa-battery-half {\n --fa: "\\f242";\n}\n\n.fa-battery-3 {\n --fa: "\\f242";\n}\n\n.fa-battery-quarter {\n --fa: "\\f243";\n}\n\n.fa-battery-2 {\n --fa: "\\f243";\n}\n\n.fa-battery-empty {\n --fa: "\\f244";\n}\n\n.fa-battery-0 {\n --fa: "\\f244";\n}\n\n.fa-arrow-pointer {\n --fa: "\\f245";\n}\n\n.fa-mouse-pointer {\n --fa: "\\f245";\n}\n\n.fa-i-cursor {\n --fa: "\\f246";\n}\n\n.fa-object-group {\n --fa: "\\f247";\n}\n\n.fa-object-ungroup {\n --fa: "\\f248";\n}\n\n.fa-note-sticky {\n --fa: "\\f249";\n}\n\n.fa-sticky-note {\n --fa: "\\f249";\n}\n\n.fa-clone {\n --fa: "\\f24d";\n}\n\n.fa-scale-balanced {\n --fa: "\\f24e";\n}\n\n.fa-balance-scale {\n --fa: "\\f24e";\n}\n\n.fa-hourglass-start {\n --fa: "\\f251";\n}\n\n.fa-hourglass-1 {\n --fa: "\\f251";\n}\n\n.fa-hourglass-half {\n --fa: "\\f252";\n}\n\n.fa-hourglass-2 {\n --fa: "\\f252";\n}\n\n.fa-hourglass-end {\n --fa: "\\f253";\n}\n\n.fa-hourglass-3 {\n --fa: "\\f253";\n}\n\n.fa-hourglass {\n --fa: "\\f254";\n}\n\n.fa-hourglass-empty {\n --fa: "\\f254";\n}\n\n.fa-hand-back-fist {\n --fa: "\\f255";\n}\n\n.fa-hand-rock {\n --fa: "\\f255";\n}\n\n.fa-hand {\n --fa: "\\f256";\n}\n\n.fa-hand-paper {\n --fa: "\\f256";\n}\n\n.fa-hand-scissors {\n --fa: "\\f257";\n}\n\n.fa-hand-lizard {\n --fa: "\\f258";\n}\n\n.fa-hand-spock {\n --fa: "\\f259";\n}\n\n.fa-hand-pointer {\n --fa: "\\f25a";\n}\n\n.fa-hand-peace {\n --fa: "\\f25b";\n}\n\n.fa-trademark {\n --fa: "\\f25c";\n}\n\n.fa-registered {\n --fa: "\\f25d";\n}\n\n.fa-tv {\n --fa: "\\f26c";\n}\n\n.fa-television {\n --fa: "\\f26c";\n}\n\n.fa-tv-alt {\n --fa: "\\f26c";\n}\n\n.fa-calendar-plus {\n --fa: "\\f271";\n}\n\n.fa-calendar-minus {\n --fa: "\\f272";\n}\n\n.fa-calendar-xmark {\n --fa: "\\f273";\n}\n\n.fa-calendar-times {\n --fa: "\\f273";\n}\n\n.fa-calendar-check {\n --fa: "\\f274";\n}\n\n.fa-industry {\n --fa: "\\f275";\n}\n\n.fa-map-pin {\n --fa: "\\f276";\n}\n\n.fa-signs-post {\n --fa: "\\f277";\n}\n\n.fa-map-signs {\n --fa: "\\f277";\n}\n\n.fa-map {\n --fa: "\\f279";\n}\n\n.fa-message {\n --fa: "\\f27a";\n}\n\n.fa-comment-alt {\n --fa: "\\f27a";\n}\n\n.fa-circle-pause {\n --fa: "\\f28b";\n}\n\n.fa-pause-circle {\n --fa: "\\f28b";\n}\n\n.fa-circle-stop {\n --fa: "\\f28d";\n}\n\n.fa-stop-circle {\n --fa: "\\f28d";\n}\n\n.fa-bag-shopping {\n --fa: "\\f290";\n}\n\n.fa-shopping-bag {\n --fa: "\\f290";\n}\n\n.fa-basket-shopping {\n --fa: "\\f291";\n}\n\n.fa-shopping-basket {\n --fa: "\\f291";\n}\n\n.fa-universal-access {\n --fa: "\\f29a";\n}\n\n.fa-person-walking-with-cane {\n --fa: "\\f29d";\n}\n\n.fa-blind {\n --fa: "\\f29d";\n}\n\n.fa-audio-description {\n --fa: "\\f29e";\n}\n\n.fa-phone-volume {\n --fa: "\\f2a0";\n}\n\n.fa-volume-control-phone {\n --fa: "\\f2a0";\n}\n\n.fa-braille {\n --fa: "\\f2a1";\n}\n\n.fa-ear-listen {\n --fa: "\\f2a2";\n}\n\n.fa-assistive-listening-systems {\n --fa: "\\f2a2";\n}\n\n.fa-hands-asl-interpreting {\n --fa: "\\f2a3";\n}\n\n.fa-american-sign-language-interpreting {\n --fa: "\\f2a3";\n}\n\n.fa-asl-interpreting {\n --fa: "\\f2a3";\n}\n\n.fa-hands-american-sign-language-interpreting {\n --fa: "\\f2a3";\n}\n\n.fa-ear-deaf {\n --fa: "\\f2a4";\n}\n\n.fa-deaf {\n --fa: "\\f2a4";\n}\n\n.fa-deafness {\n --fa: "\\f2a4";\n}\n\n.fa-hard-of-hearing {\n --fa: "\\f2a4";\n}\n\n.fa-hands {\n --fa: "\\f2a7";\n}\n\n.fa-sign-language {\n --fa: "\\f2a7";\n}\n\n.fa-signing {\n --fa: "\\f2a7";\n}\n\n.fa-eye-low-vision {\n --fa: "\\f2a8";\n}\n\n.fa-low-vision {\n --fa: "\\f2a8";\n}\n\n.fa-font-awesome {\n --fa: "\\f2b4";\n}\n\n.fa-font-awesome-flag {\n --fa: "\\f2b4";\n}\n\n.fa-font-awesome-logo-full {\n --fa: "\\f2b4";\n}\n\n.fa-handshake {\n --fa: "\\f2b5";\n}\n\n.fa-handshake-alt {\n --fa: "\\f2b5";\n}\n\n.fa-handshake-simple {\n --fa: "\\f2b5";\n}\n\n.fa-envelope-open {\n --fa: "\\f2b6";\n}\n\n.fa-address-book {\n --fa: "\\f2b9";\n}\n\n.fa-contact-book {\n --fa: "\\f2b9";\n}\n\n.fa-address-card {\n --fa: "\\f2bb";\n}\n\n.fa-contact-card {\n --fa: "\\f2bb";\n}\n\n.fa-vcard {\n --fa: "\\f2bb";\n}\n\n.fa-circle-user {\n --fa: "\\f2bd";\n}\n\n.fa-user-circle {\n --fa: "\\f2bd";\n}\n\n.fa-id-badge {\n --fa: "\\f2c1";\n}\n\n.fa-id-card {\n --fa: "\\f2c2";\n}\n\n.fa-drivers-license {\n --fa: "\\f2c2";\n}\n\n.fa-temperature-full {\n --fa: "\\f2c7";\n}\n\n.fa-temperature-4 {\n --fa: "\\f2c7";\n}\n\n.fa-thermometer-4 {\n --fa: "\\f2c7";\n}\n\n.fa-thermometer-full {\n --fa: "\\f2c7";\n}\n\n.fa-temperature-three-quarters {\n --fa: "\\f2c8";\n}\n\n.fa-temperature-3 {\n --fa: "\\f2c8";\n}\n\n.fa-thermometer-3 {\n --fa: "\\f2c8";\n}\n\n.fa-thermometer-three-quarters {\n --fa: "\\f2c8";\n}\n\n.fa-temperature-half {\n --fa: "\\f2c9";\n}\n\n.fa-temperature-2 {\n --fa: "\\f2c9";\n}\n\n.fa-thermometer-2 {\n --fa: "\\f2c9";\n}\n\n.fa-thermometer-half {\n --fa: "\\f2c9";\n}\n\n.fa-temperature-quarter {\n --fa: "\\f2ca";\n}\n\n.fa-temperature-1 {\n --fa: "\\f2ca";\n}\n\n.fa-thermometer-1 {\n --fa: "\\f2ca";\n}\n\n.fa-thermometer-quarter {\n --fa: "\\f2ca";\n}\n\n.fa-temperature-empty {\n --fa: "\\f2cb";\n}\n\n.fa-temperature-0 {\n --fa: "\\f2cb";\n}\n\n.fa-thermometer-0 {\n --fa: "\\f2cb";\n}\n\n.fa-thermometer-empty {\n --fa: "\\f2cb";\n}\n\n.fa-shower {\n --fa: "\\f2cc";\n}\n\n.fa-bath {\n --fa: "\\f2cd";\n}\n\n.fa-bathtub {\n --fa: "\\f2cd";\n}\n\n.fa-podcast {\n --fa: "\\f2ce";\n}\n\n.fa-window-maximize {\n --fa: "\\f2d0";\n}\n\n.fa-window-minimize {\n --fa: "\\f2d1";\n}\n\n.fa-window-restore {\n --fa: "\\f2d2";\n}\n\n.fa-square-xmark {\n --fa: "\\f2d3";\n}\n\n.fa-times-square {\n --fa: "\\f2d3";\n}\n\n.fa-xmark-square {\n --fa: "\\f2d3";\n}\n\n.fa-microchip {\n --fa: "\\f2db";\n}\n\n.fa-snowflake {\n --fa: "\\f2dc";\n}\n\n.fa-spoon {\n --fa: "\\f2e5";\n}\n\n.fa-utensil-spoon {\n --fa: "\\f2e5";\n}\n\n.fa-utensils {\n --fa: "\\f2e7";\n}\n\n.fa-cutlery {\n --fa: "\\f2e7";\n}\n\n.fa-rotate-left {\n --fa: "\\f2ea";\n}\n\n.fa-rotate-back {\n --fa: "\\f2ea";\n}\n\n.fa-rotate-backward {\n --fa: "\\f2ea";\n}\n\n.fa-undo-alt {\n --fa: "\\f2ea";\n}\n\n.fa-trash-can {\n --fa: "\\f2ed";\n}\n\n.fa-trash-alt {\n --fa: "\\f2ed";\n}\n\n.fa-rotate {\n --fa: "\\f2f1";\n}\n\n.fa-sync-alt {\n --fa: "\\f2f1";\n}\n\n.fa-stopwatch {\n --fa: "\\f2f2";\n}\n\n.fa-right-from-bracket {\n --fa: "\\f2f5";\n}\n\n.fa-sign-out-alt {\n --fa: "\\f2f5";\n}\n\n.fa-right-to-bracket {\n --fa: "\\f2f6";\n}\n\n.fa-sign-in-alt {\n --fa: "\\f2f6";\n}\n\n.fa-rotate-right {\n --fa: "\\f2f9";\n}\n\n.fa-redo-alt {\n --fa: "\\f2f9";\n}\n\n.fa-rotate-forward {\n --fa: "\\f2f9";\n}\n\n.fa-poo {\n --fa: "\\f2fe";\n}\n\n.fa-images {\n --fa: "\\f302";\n}\n\n.fa-pencil {\n --fa: "\\f303";\n}\n\n.fa-pencil-alt {\n --fa: "\\f303";\n}\n\n.fa-pen {\n --fa: "\\f304";\n}\n\n.fa-pen-clip {\n --fa: "\\f305";\n}\n\n.fa-pen-alt {\n --fa: "\\f305";\n}\n\n.fa-octagon {\n --fa: "\\f306";\n}\n\n.fa-down-long {\n --fa: "\\f309";\n}\n\n.fa-long-arrow-alt-down {\n --fa: "\\f309";\n}\n\n.fa-left-long {\n --fa: "\\f30a";\n}\n\n.fa-long-arrow-alt-left {\n --fa: "\\f30a";\n}\n\n.fa-right-long {\n --fa: "\\f30b";\n}\n\n.fa-long-arrow-alt-right {\n --fa: "\\f30b";\n}\n\n.fa-up-long {\n --fa: "\\f30c";\n}\n\n.fa-long-arrow-alt-up {\n --fa: "\\f30c";\n}\n\n.fa-hexagon {\n --fa: "\\f312";\n}\n\n.fa-file-pen {\n --fa: "\\f31c";\n}\n\n.fa-file-edit {\n --fa: "\\f31c";\n}\n\n.fa-maximize {\n --fa: "\\f31e";\n}\n\n.fa-expand-arrows-alt {\n --fa: "\\f31e";\n}\n\n.fa-clipboard {\n --fa: "\\f328";\n}\n\n.fa-left-right {\n --fa: "\\f337";\n}\n\n.fa-arrows-alt-h {\n --fa: "\\f337";\n}\n\n.fa-up-down {\n --fa: "\\f338";\n}\n\n.fa-arrows-alt-v {\n --fa: "\\f338";\n}\n\n.fa-alarm-clock {\n --fa: "\\f34e";\n}\n\n.fa-circle-down {\n --fa: "\\f358";\n}\n\n.fa-arrow-alt-circle-down {\n --fa: "\\f358";\n}\n\n.fa-circle-left {\n --fa: "\\f359";\n}\n\n.fa-arrow-alt-circle-left {\n --fa: "\\f359";\n}\n\n.fa-circle-right {\n --fa: "\\f35a";\n}\n\n.fa-arrow-alt-circle-right {\n --fa: "\\f35a";\n}\n\n.fa-circle-up {\n --fa: "\\f35b";\n}\n\n.fa-arrow-alt-circle-up {\n --fa: "\\f35b";\n}\n\n.fa-up-right-from-square {\n --fa: "\\f35d";\n}\n\n.fa-external-link-alt {\n --fa: "\\f35d";\n}\n\n.fa-square-up-right {\n --fa: "\\f360";\n}\n\n.fa-external-link-square-alt {\n --fa: "\\f360";\n}\n\n.fa-right-left {\n --fa: "\\f362";\n}\n\n.fa-exchange-alt {\n --fa: "\\f362";\n}\n\n.fa-repeat {\n --fa: "\\f363";\n}\n\n.fa-code-commit {\n --fa: "\\f386";\n}\n\n.fa-code-merge {\n --fa: "\\f387";\n}\n\n.fa-desktop {\n --fa: "\\f390";\n}\n\n.fa-desktop-alt {\n --fa: "\\f390";\n}\n\n.fa-gem {\n --fa: "\\f3a5";\n}\n\n.fa-turn-down {\n --fa: "\\f3be";\n}\n\n.fa-level-down-alt {\n --fa: "\\f3be";\n}\n\n.fa-turn-up {\n --fa: "\\f3bf";\n}\n\n.fa-level-up-alt {\n --fa: "\\f3bf";\n}\n\n.fa-lock-open {\n --fa: "\\f3c1";\n}\n\n.fa-location-dot {\n --fa: "\\f3c5";\n}\n\n.fa-map-marker-alt {\n --fa: "\\f3c5";\n}\n\n.fa-microphone-lines {\n --fa: "\\f3c9";\n}\n\n.fa-microphone-alt {\n --fa: "\\f3c9";\n}\n\n.fa-mobile-screen-button {\n --fa: "\\f3cd";\n}\n\n.fa-mobile-alt {\n --fa: "\\f3cd";\n}\n\n.fa-mobile {\n --fa: "\\f3ce";\n}\n\n.fa-mobile-android {\n --fa: "\\f3ce";\n}\n\n.fa-mobile-phone {\n --fa: "\\f3ce";\n}\n\n.fa-mobile-screen {\n --fa: "\\f3cf";\n}\n\n.fa-mobile-android-alt {\n --fa: "\\f3cf";\n}\n\n.fa-money-bill-1 {\n --fa: "\\f3d1";\n}\n\n.fa-money-bill-alt {\n --fa: "\\f3d1";\n}\n\n.fa-phone-slash {\n --fa: "\\f3dd";\n}\n\n.fa-image-portrait {\n --fa: "\\f3e0";\n}\n\n.fa-portrait {\n --fa: "\\f3e0";\n}\n\n.fa-reply {\n --fa: "\\f3e5";\n}\n\n.fa-mail-reply {\n --fa: "\\f3e5";\n}\n\n.fa-shield-halved {\n --fa: "\\f3ed";\n}\n\n.fa-shield-alt {\n --fa: "\\f3ed";\n}\n\n.fa-tablet-screen-button {\n --fa: "\\f3fa";\n}\n\n.fa-tablet-alt {\n --fa: "\\f3fa";\n}\n\n.fa-tablet {\n --fa: "\\f3fb";\n}\n\n.fa-tablet-android {\n --fa: "\\f3fb";\n}\n\n.fa-ticket-simple {\n --fa: "\\f3ff";\n}\n\n.fa-ticket-alt {\n --fa: "\\f3ff";\n}\n\n.fa-rectangle-xmark {\n --fa: "\\f410";\n}\n\n.fa-rectangle-times {\n --fa: "\\f410";\n}\n\n.fa-times-rectangle {\n --fa: "\\f410";\n}\n\n.fa-window-close {\n --fa: "\\f410";\n}\n\n.fa-down-left-and-up-right-to-center {\n --fa: "\\f422";\n}\n\n.fa-compress-alt {\n --fa: "\\f422";\n}\n\n.fa-up-right-and-down-left-from-center {\n --fa: "\\f424";\n}\n\n.fa-expand-alt {\n --fa: "\\f424";\n}\n\n.fa-baseball-bat-ball {\n --fa: "\\f432";\n}\n\n.fa-baseball {\n --fa: "\\f433";\n}\n\n.fa-baseball-ball {\n --fa: "\\f433";\n}\n\n.fa-basketball {\n --fa: "\\f434";\n}\n\n.fa-basketball-ball {\n --fa: "\\f434";\n}\n\n.fa-bowling-ball {\n --fa: "\\f436";\n}\n\n.fa-chess {\n --fa: "\\f439";\n}\n\n.fa-chess-bishop {\n --fa: "\\f43a";\n}\n\n.fa-chess-board {\n --fa: "\\f43c";\n}\n\n.fa-chess-king {\n --fa: "\\f43f";\n}\n\n.fa-chess-knight {\n --fa: "\\f441";\n}\n\n.fa-chess-pawn {\n --fa: "\\f443";\n}\n\n.fa-chess-queen {\n --fa: "\\f445";\n}\n\n.fa-chess-rook {\n --fa: "\\f447";\n}\n\n.fa-dumbbell {\n --fa: "\\f44b";\n}\n\n.fa-football {\n --fa: "\\f44e";\n}\n\n.fa-football-ball {\n --fa: "\\f44e";\n}\n\n.fa-golf-ball-tee {\n --fa: "\\f450";\n}\n\n.fa-golf-ball {\n --fa: "\\f450";\n}\n\n.fa-hockey-puck {\n --fa: "\\f453";\n}\n\n.fa-broom-ball {\n --fa: "\\f458";\n}\n\n.fa-quidditch {\n --fa: "\\f458";\n}\n\n.fa-quidditch-broom-ball {\n --fa: "\\f458";\n}\n\n.fa-square-full {\n --fa: "\\f45c";\n}\n\n.fa-table-tennis-paddle-ball {\n --fa: "\\f45d";\n}\n\n.fa-ping-pong-paddle-ball {\n --fa: "\\f45d";\n}\n\n.fa-table-tennis {\n --fa: "\\f45d";\n}\n\n.fa-volleyball {\n --fa: "\\f45f";\n}\n\n.fa-volleyball-ball {\n --fa: "\\f45f";\n}\n\n.fa-hand-dots {\n --fa: "\\f461";\n}\n\n.fa-allergies {\n --fa: "\\f461";\n}\n\n.fa-bandage {\n --fa: "\\f462";\n}\n\n.fa-band-aid {\n --fa: "\\f462";\n}\n\n.fa-box {\n --fa: "\\f466";\n}\n\n.fa-boxes-stacked {\n --fa: "\\f468";\n}\n\n.fa-boxes {\n --fa: "\\f468";\n}\n\n.fa-boxes-alt {\n --fa: "\\f468";\n}\n\n.fa-briefcase-medical {\n --fa: "\\f469";\n}\n\n.fa-fire-flame-simple {\n --fa: "\\f46a";\n}\n\n.fa-burn {\n --fa: "\\f46a";\n}\n\n.fa-capsules {\n --fa: "\\f46b";\n}\n\n.fa-clipboard-check {\n --fa: "\\f46c";\n}\n\n.fa-clipboard-list {\n --fa: "\\f46d";\n}\n\n.fa-person-dots-from-line {\n --fa: "\\f470";\n}\n\n.fa-diagnoses {\n --fa: "\\f470";\n}\n\n.fa-dna {\n --fa: "\\f471";\n}\n\n.fa-dolly {\n --fa: "\\f472";\n}\n\n.fa-dolly-box {\n --fa: "\\f472";\n}\n\n.fa-cart-flatbed {\n --fa: "\\f474";\n}\n\n.fa-dolly-flatbed {\n --fa: "\\f474";\n}\n\n.fa-file-medical {\n --fa: "\\f477";\n}\n\n.fa-file-waveform {\n --fa: "\\f478";\n}\n\n.fa-file-medical-alt {\n --fa: "\\f478";\n}\n\n.fa-kit-medical {\n --fa: "\\f479";\n}\n\n.fa-first-aid {\n --fa: "\\f479";\n}\n\n.fa-circle-h {\n --fa: "\\f47e";\n}\n\n.fa-hospital-symbol {\n --fa: "\\f47e";\n}\n\n.fa-id-card-clip {\n --fa: "\\f47f";\n}\n\n.fa-id-card-alt {\n --fa: "\\f47f";\n}\n\n.fa-notes-medical {\n --fa: "\\f481";\n}\n\n.fa-pallet {\n --fa: "\\f482";\n}\n\n.fa-pills {\n --fa: "\\f484";\n}\n\n.fa-prescription-bottle {\n --fa: "\\f485";\n}\n\n.fa-prescription-bottle-medical {\n --fa: "\\f486";\n}\n\n.fa-prescription-bottle-alt {\n --fa: "\\f486";\n}\n\n.fa-bed-pulse {\n --fa: "\\f487";\n}\n\n.fa-procedures {\n --fa: "\\f487";\n}\n\n.fa-truck-fast {\n --fa: "\\f48b";\n}\n\n.fa-shipping-fast {\n --fa: "\\f48b";\n}\n\n.fa-smoking {\n --fa: "\\f48d";\n}\n\n.fa-syringe {\n --fa: "\\f48e";\n}\n\n.fa-tablets {\n --fa: "\\f490";\n}\n\n.fa-thermometer {\n --fa: "\\f491";\n}\n\n.fa-vial {\n --fa: "\\f492";\n}\n\n.fa-vials {\n --fa: "\\f493";\n}\n\n.fa-warehouse {\n --fa: "\\f494";\n}\n\n.fa-weight-scale {\n --fa: "\\f496";\n}\n\n.fa-weight {\n --fa: "\\f496";\n}\n\n.fa-x-ray {\n --fa: "\\f497";\n}\n\n.fa-box-open {\n --fa: "\\f49e";\n}\n\n.fa-comment-dots {\n --fa: "\\f4ad";\n}\n\n.fa-commenting {\n --fa: "\\f4ad";\n}\n\n.fa-comment-slash {\n --fa: "\\f4b3";\n}\n\n.fa-couch {\n --fa: "\\f4b8";\n}\n\n.fa-circle-dollar-to-slot {\n --fa: "\\f4b9";\n}\n\n.fa-donate {\n --fa: "\\f4b9";\n}\n\n.fa-dove {\n --fa: "\\f4ba";\n}\n\n.fa-hand-holding {\n --fa: "\\f4bd";\n}\n\n.fa-hand-holding-heart {\n --fa: "\\f4be";\n}\n\n.fa-hand-holding-dollar {\n --fa: "\\f4c0";\n}\n\n.fa-hand-holding-usd {\n --fa: "\\f4c0";\n}\n\n.fa-hand-holding-droplet {\n --fa: "\\f4c1";\n}\n\n.fa-hand-holding-water {\n --fa: "\\f4c1";\n}\n\n.fa-hands-holding {\n --fa: "\\f4c2";\n}\n\n.fa-handshake-angle {\n --fa: "\\f4c4";\n}\n\n.fa-hands-helping {\n --fa: "\\f4c4";\n}\n\n.fa-parachute-box {\n --fa: "\\f4cd";\n}\n\n.fa-people-carry-box {\n --fa: "\\f4ce";\n}\n\n.fa-people-carry {\n --fa: "\\f4ce";\n}\n\n.fa-piggy-bank {\n --fa: "\\f4d3";\n}\n\n.fa-ribbon {\n --fa: "\\f4d6";\n}\n\n.fa-route {\n --fa: "\\f4d7";\n}\n\n.fa-seedling {\n --fa: "\\f4d8";\n}\n\n.fa-sprout {\n --fa: "\\f4d8";\n}\n\n.fa-sign-hanging {\n --fa: "\\f4d9";\n}\n\n.fa-sign {\n --fa: "\\f4d9";\n}\n\n.fa-face-smile-wink {\n --fa: "\\f4da";\n}\n\n.fa-smile-wink {\n --fa: "\\f4da";\n}\n\n.fa-tape {\n --fa: "\\f4db";\n}\n\n.fa-truck-ramp-box {\n --fa: "\\f4de";\n}\n\n.fa-truck-loading {\n --fa: "\\f4de";\n}\n\n.fa-truck-moving {\n --fa: "\\f4df";\n}\n\n.fa-video-slash {\n --fa: "\\f4e2";\n}\n\n.fa-wine-glass {\n --fa: "\\f4e3";\n}\n\n.fa-user-astronaut {\n --fa: "\\f4fb";\n}\n\n.fa-user-check {\n --fa: "\\f4fc";\n}\n\n.fa-user-clock {\n --fa: "\\f4fd";\n}\n\n.fa-user-gear {\n --fa: "\\f4fe";\n}\n\n.fa-user-cog {\n --fa: "\\f4fe";\n}\n\n.fa-user-pen {\n --fa: "\\f4ff";\n}\n\n.fa-user-edit {\n --fa: "\\f4ff";\n}\n\n.fa-user-group {\n --fa: "\\f500";\n}\n\n.fa-user-friends {\n --fa: "\\f500";\n}\n\n.fa-user-graduate {\n --fa: "\\f501";\n}\n\n.fa-user-lock {\n --fa: "\\f502";\n}\n\n.fa-user-minus {\n --fa: "\\f503";\n}\n\n.fa-user-ninja {\n --fa: "\\f504";\n}\n\n.fa-user-shield {\n --fa: "\\f505";\n}\n\n.fa-user-slash {\n --fa: "\\f506";\n}\n\n.fa-user-alt-slash {\n --fa: "\\f506";\n}\n\n.fa-user-large-slash {\n --fa: "\\f506";\n}\n\n.fa-user-tag {\n --fa: "\\f507";\n}\n\n.fa-user-tie {\n --fa: "\\f508";\n}\n\n.fa-users-gear {\n --fa: "\\f509";\n}\n\n.fa-users-cog {\n --fa: "\\f509";\n}\n\n.fa-scale-unbalanced {\n --fa: "\\f515";\n}\n\n.fa-balance-scale-left {\n --fa: "\\f515";\n}\n\n.fa-scale-unbalanced-flip {\n --fa: "\\f516";\n}\n\n.fa-balance-scale-right {\n --fa: "\\f516";\n}\n\n.fa-blender {\n --fa: "\\f517";\n}\n\n.fa-book-open {\n --fa: "\\f518";\n}\n\n.fa-tower-broadcast {\n --fa: "\\f519";\n}\n\n.fa-broadcast-tower {\n --fa: "\\f519";\n}\n\n.fa-broom {\n --fa: "\\f51a";\n}\n\n.fa-chalkboard {\n --fa: "\\f51b";\n}\n\n.fa-blackboard {\n --fa: "\\f51b";\n}\n\n.fa-chalkboard-user {\n --fa: "\\f51c";\n}\n\n.fa-chalkboard-teacher {\n --fa: "\\f51c";\n}\n\n.fa-church {\n --fa: "\\f51d";\n}\n\n.fa-coins {\n --fa: "\\f51e";\n}\n\n.fa-compact-disc {\n --fa: "\\f51f";\n}\n\n.fa-crow {\n --fa: "\\f520";\n}\n\n.fa-crown {\n --fa: "\\f521";\n}\n\n.fa-dice {\n --fa: "\\f522";\n}\n\n.fa-dice-five {\n --fa: "\\f523";\n}\n\n.fa-dice-four {\n --fa: "\\f524";\n}\n\n.fa-dice-one {\n --fa: "\\f525";\n}\n\n.fa-dice-six {\n --fa: "\\f526";\n}\n\n.fa-dice-three {\n --fa: "\\f527";\n}\n\n.fa-dice-two {\n --fa: "\\f528";\n}\n\n.fa-divide {\n --fa: "\\f529";\n}\n\n.fa-door-closed {\n --fa: "\\f52a";\n}\n\n.fa-door-open {\n --fa: "\\f52b";\n}\n\n.fa-feather {\n --fa: "\\f52d";\n}\n\n.fa-frog {\n --fa: "\\f52e";\n}\n\n.fa-gas-pump {\n --fa: "\\f52f";\n}\n\n.fa-glasses {\n --fa: "\\f530";\n}\n\n.fa-greater-than-equal {\n --fa: "\\f532";\n}\n\n.fa-helicopter {\n --fa: "\\f533";\n}\n\n.fa-infinity {\n --fa: "\\f534";\n}\n\n.fa-kiwi-bird {\n --fa: "\\f535";\n}\n\n.fa-less-than-equal {\n --fa: "\\f537";\n}\n\n.fa-memory {\n --fa: "\\f538";\n}\n\n.fa-microphone-lines-slash {\n --fa: "\\f539";\n}\n\n.fa-microphone-alt-slash {\n --fa: "\\f539";\n}\n\n.fa-money-bill-wave {\n --fa: "\\f53a";\n}\n\n.fa-money-bill-1-wave {\n --fa: "\\f53b";\n}\n\n.fa-money-bill-wave-alt {\n --fa: "\\f53b";\n}\n\n.fa-money-check {\n --fa: "\\f53c";\n}\n\n.fa-money-check-dollar {\n --fa: "\\f53d";\n}\n\n.fa-money-check-alt {\n --fa: "\\f53d";\n}\n\n.fa-not-equal {\n --fa: "\\f53e";\n}\n\n.fa-palette {\n --fa: "\\f53f";\n}\n\n.fa-square-parking {\n --fa: "\\f540";\n}\n\n.fa-parking {\n --fa: "\\f540";\n}\n\n.fa-diagram-project {\n --fa: "\\f542";\n}\n\n.fa-project-diagram {\n --fa: "\\f542";\n}\n\n.fa-receipt {\n --fa: "\\f543";\n}\n\n.fa-robot {\n --fa: "\\f544";\n}\n\n.fa-ruler {\n --fa: "\\f545";\n}\n\n.fa-ruler-combined {\n --fa: "\\f546";\n}\n\n.fa-ruler-horizontal {\n --fa: "\\f547";\n}\n\n.fa-ruler-vertical {\n --fa: "\\f548";\n}\n\n.fa-school {\n --fa: "\\f549";\n}\n\n.fa-screwdriver {\n --fa: "\\f54a";\n}\n\n.fa-shoe-prints {\n --fa: "\\f54b";\n}\n\n.fa-skull {\n --fa: "\\f54c";\n}\n\n.fa-ban-smoking {\n --fa: "\\f54d";\n}\n\n.fa-smoking-ban {\n --fa: "\\f54d";\n}\n\n.fa-store {\n --fa: "\\f54e";\n}\n\n.fa-shop {\n --fa: "\\f54f";\n}\n\n.fa-store-alt {\n --fa: "\\f54f";\n}\n\n.fa-bars-staggered {\n --fa: "\\f550";\n}\n\n.fa-reorder {\n --fa: "\\f550";\n}\n\n.fa-stream {\n --fa: "\\f550";\n}\n\n.fa-stroopwafel {\n --fa: "\\f551";\n}\n\n.fa-toolbox {\n --fa: "\\f552";\n}\n\n.fa-shirt {\n --fa: "\\f553";\n}\n\n.fa-t-shirt {\n --fa: "\\f553";\n}\n\n.fa-tshirt {\n --fa: "\\f553";\n}\n\n.fa-person-walking {\n --fa: "\\f554";\n}\n\n.fa-walking {\n --fa: "\\f554";\n}\n\n.fa-wallet {\n --fa: "\\f555";\n}\n\n.fa-face-angry {\n --fa: "\\f556";\n}\n\n.fa-angry {\n --fa: "\\f556";\n}\n\n.fa-archway {\n --fa: "\\f557";\n}\n\n.fa-book-atlas {\n --fa: "\\f558";\n}\n\n.fa-atlas {\n --fa: "\\f558";\n}\n\n.fa-award {\n --fa: "\\f559";\n}\n\n.fa-delete-left {\n --fa: "\\f55a";\n}\n\n.fa-backspace {\n --fa: "\\f55a";\n}\n\n.fa-bezier-curve {\n --fa: "\\f55b";\n}\n\n.fa-bong {\n --fa: "\\f55c";\n}\n\n.fa-brush {\n --fa: "\\f55d";\n}\n\n.fa-bus-simple {\n --fa: "\\f55e";\n}\n\n.fa-bus-alt {\n --fa: "\\f55e";\n}\n\n.fa-cannabis {\n --fa: "\\f55f";\n}\n\n.fa-check-double {\n --fa: "\\f560";\n}\n\n.fa-martini-glass-citrus {\n --fa: "\\f561";\n}\n\n.fa-cocktail {\n --fa: "\\f561";\n}\n\n.fa-bell-concierge {\n --fa: "\\f562";\n}\n\n.fa-concierge-bell {\n --fa: "\\f562";\n}\n\n.fa-cookie {\n --fa: "\\f563";\n}\n\n.fa-cookie-bite {\n --fa: "\\f564";\n}\n\n.fa-crop-simple {\n --fa: "\\f565";\n}\n\n.fa-crop-alt {\n --fa: "\\f565";\n}\n\n.fa-tachograph-digital {\n --fa: "\\f566";\n}\n\n.fa-digital-tachograph {\n --fa: "\\f566";\n}\n\n.fa-face-dizzy {\n --fa: "\\f567";\n}\n\n.fa-dizzy {\n --fa: "\\f567";\n}\n\n.fa-compass-drafting {\n --fa: "\\f568";\n}\n\n.fa-drafting-compass {\n --fa: "\\f568";\n}\n\n.fa-drum {\n --fa: "\\f569";\n}\n\n.fa-drum-steelpan {\n --fa: "\\f56a";\n}\n\n.fa-feather-pointed {\n --fa: "\\f56b";\n}\n\n.fa-feather-alt {\n --fa: "\\f56b";\n}\n\n.fa-file-contract {\n --fa: "\\f56c";\n}\n\n.fa-file-arrow-down {\n --fa: "\\f56d";\n}\n\n.fa-file-download {\n --fa: "\\f56d";\n}\n\n.fa-file-export {\n --fa: "\\f56e";\n}\n\n.fa-arrow-right-from-file {\n --fa: "\\f56e";\n}\n\n.fa-file-import {\n --fa: "\\f56f";\n}\n\n.fa-arrow-right-to-file {\n --fa: "\\f56f";\n}\n\n.fa-file-invoice {\n --fa: "\\f570";\n}\n\n.fa-file-invoice-dollar {\n --fa: "\\f571";\n}\n\n.fa-file-prescription {\n --fa: "\\f572";\n}\n\n.fa-file-signature {\n --fa: "\\f573";\n}\n\n.fa-file-arrow-up {\n --fa: "\\f574";\n}\n\n.fa-file-upload {\n --fa: "\\f574";\n}\n\n.fa-fill {\n --fa: "\\f575";\n}\n\n.fa-fill-drip {\n --fa: "\\f576";\n}\n\n.fa-fingerprint {\n --fa: "\\f577";\n}\n\n.fa-fish {\n --fa: "\\f578";\n}\n\n.fa-face-flushed {\n --fa: "\\f579";\n}\n\n.fa-flushed {\n --fa: "\\f579";\n}\n\n.fa-face-frown-open {\n --fa: "\\f57a";\n}\n\n.fa-frown-open {\n --fa: "\\f57a";\n}\n\n.fa-martini-glass {\n --fa: "\\f57b";\n}\n\n.fa-glass-martini-alt {\n --fa: "\\f57b";\n}\n\n.fa-earth-africa {\n --fa: "\\f57c";\n}\n\n.fa-globe-africa {\n --fa: "\\f57c";\n}\n\n.fa-earth-americas {\n --fa: "\\f57d";\n}\n\n.fa-earth {\n --fa: "\\f57d";\n}\n\n.fa-earth-america {\n --fa: "\\f57d";\n}\n\n.fa-globe-americas {\n --fa: "\\f57d";\n}\n\n.fa-earth-asia {\n --fa: "\\f57e";\n}\n\n.fa-globe-asia {\n --fa: "\\f57e";\n}\n\n.fa-face-grimace {\n --fa: "\\f57f";\n}\n\n.fa-grimace {\n --fa: "\\f57f";\n}\n\n.fa-face-grin {\n --fa: "\\f580";\n}\n\n.fa-grin {\n --fa: "\\f580";\n}\n\n.fa-face-grin-wide {\n --fa: "\\f581";\n}\n\n.fa-grin-alt {\n --fa: "\\f581";\n}\n\n.fa-face-grin-beam {\n --fa: "\\f582";\n}\n\n.fa-grin-beam {\n --fa: "\\f582";\n}\n\n.fa-face-grin-beam-sweat {\n --fa: "\\f583";\n}\n\n.fa-grin-beam-sweat {\n --fa: "\\f583";\n}\n\n.fa-face-grin-hearts {\n --fa: "\\f584";\n}\n\n.fa-grin-hearts {\n --fa: "\\f584";\n}\n\n.fa-face-grin-squint {\n --fa: "\\f585";\n}\n\n.fa-grin-squint {\n --fa: "\\f585";\n}\n\n.fa-face-grin-squint-tears {\n --fa: "\\f586";\n}\n\n.fa-grin-squint-tears {\n --fa: "\\f586";\n}\n\n.fa-face-grin-stars {\n --fa: "\\f587";\n}\n\n.fa-grin-stars {\n --fa: "\\f587";\n}\n\n.fa-face-grin-tears {\n --fa: "\\f588";\n}\n\n.fa-grin-tears {\n --fa: "\\f588";\n}\n\n.fa-face-grin-tongue {\n --fa: "\\f589";\n}\n\n.fa-grin-tongue {\n --fa: "\\f589";\n}\n\n.fa-face-grin-tongue-squint {\n --fa: "\\f58a";\n}\n\n.fa-grin-tongue-squint {\n --fa: "\\f58a";\n}\n\n.fa-face-grin-tongue-wink {\n --fa: "\\f58b";\n}\n\n.fa-grin-tongue-wink {\n --fa: "\\f58b";\n}\n\n.fa-face-grin-wink {\n --fa: "\\f58c";\n}\n\n.fa-grin-wink {\n --fa: "\\f58c";\n}\n\n.fa-grip {\n --fa: "\\f58d";\n}\n\n.fa-grid-horizontal {\n --fa: "\\f58d";\n}\n\n.fa-grip-horizontal {\n --fa: "\\f58d";\n}\n\n.fa-grip-vertical {\n --fa: "\\f58e";\n}\n\n.fa-grid-vertical {\n --fa: "\\f58e";\n}\n\n.fa-headset {\n --fa: "\\f590";\n}\n\n.fa-highlighter {\n --fa: "\\f591";\n}\n\n.fa-hot-tub-person {\n --fa: "\\f593";\n}\n\n.fa-hot-tub {\n --fa: "\\f593";\n}\n\n.fa-hotel {\n --fa: "\\f594";\n}\n\n.fa-joint {\n --fa: "\\f595";\n}\n\n.fa-face-kiss {\n --fa: "\\f596";\n}\n\n.fa-kiss {\n --fa: "\\f596";\n}\n\n.fa-face-kiss-beam {\n --fa: "\\f597";\n}\n\n.fa-kiss-beam {\n --fa: "\\f597";\n}\n\n.fa-face-kiss-wink-heart {\n --fa: "\\f598";\n}\n\n.fa-kiss-wink-heart {\n --fa: "\\f598";\n}\n\n.fa-face-laugh {\n --fa: "\\f599";\n}\n\n.fa-laugh {\n --fa: "\\f599";\n}\n\n.fa-face-laugh-beam {\n --fa: "\\f59a";\n}\n\n.fa-laugh-beam {\n --fa: "\\f59a";\n}\n\n.fa-face-laugh-squint {\n --fa: "\\f59b";\n}\n\n.fa-laugh-squint {\n --fa: "\\f59b";\n}\n\n.fa-face-laugh-wink {\n --fa: "\\f59c";\n}\n\n.fa-laugh-wink {\n --fa: "\\f59c";\n}\n\n.fa-cart-flatbed-suitcase {\n --fa: "\\f59d";\n}\n\n.fa-luggage-cart {\n --fa: "\\f59d";\n}\n\n.fa-map-location {\n --fa: "\\f59f";\n}\n\n.fa-map-marked {\n --fa: "\\f59f";\n}\n\n.fa-map-location-dot {\n --fa: "\\f5a0";\n}\n\n.fa-map-marked-alt {\n --fa: "\\f5a0";\n}\n\n.fa-marker {\n --fa: "\\f5a1";\n}\n\n.fa-medal {\n --fa: "\\f5a2";\n}\n\n.fa-face-meh-blank {\n --fa: "\\f5a4";\n}\n\n.fa-meh-blank {\n --fa: "\\f5a4";\n}\n\n.fa-face-rolling-eyes {\n --fa: "\\f5a5";\n}\n\n.fa-meh-rolling-eyes {\n --fa: "\\f5a5";\n}\n\n.fa-monument {\n --fa: "\\f5a6";\n}\n\n.fa-mortar-pestle {\n --fa: "\\f5a7";\n}\n\n.fa-paint-roller {\n --fa: "\\f5aa";\n}\n\n.fa-passport {\n --fa: "\\f5ab";\n}\n\n.fa-pen-fancy {\n --fa: "\\f5ac";\n}\n\n.fa-pen-nib {\n --fa: "\\f5ad";\n}\n\n.fa-pen-ruler {\n --fa: "\\f5ae";\n}\n\n.fa-pencil-ruler {\n --fa: "\\f5ae";\n}\n\n.fa-plane-arrival {\n --fa: "\\f5af";\n}\n\n.fa-plane-departure {\n --fa: "\\f5b0";\n}\n\n.fa-prescription {\n --fa: "\\f5b1";\n}\n\n.fa-face-sad-cry {\n --fa: "\\f5b3";\n}\n\n.fa-sad-cry {\n --fa: "\\f5b3";\n}\n\n.fa-face-sad-tear {\n --fa: "\\f5b4";\n}\n\n.fa-sad-tear {\n --fa: "\\f5b4";\n}\n\n.fa-van-shuttle {\n --fa: "\\f5b6";\n}\n\n.fa-shuttle-van {\n --fa: "\\f5b6";\n}\n\n.fa-signature {\n --fa: "\\f5b7";\n}\n\n.fa-face-smile-beam {\n --fa: "\\f5b8";\n}\n\n.fa-smile-beam {\n --fa: "\\f5b8";\n}\n\n.fa-solar-panel {\n --fa: "\\f5ba";\n}\n\n.fa-spa {\n --fa: "\\f5bb";\n}\n\n.fa-lotus {\n --fa: "\\f5bb";\n}\n\n.fa-splotch {\n --fa: "\\f5bc";\n}\n\n.fa-spray-can {\n --fa: "\\f5bd";\n}\n\n.fa-stamp {\n --fa: "\\f5bf";\n}\n\n.fa-star-half-stroke {\n --fa: "\\f5c0";\n}\n\n.fa-star-half-alt {\n --fa: "\\f5c0";\n}\n\n.fa-suitcase-rolling {\n --fa: "\\f5c1";\n}\n\n.fa-face-surprise {\n --fa: "\\f5c2";\n}\n\n.fa-surprise {\n --fa: "\\f5c2";\n}\n\n.fa-swatchbook {\n --fa: "\\f5c3";\n}\n\n.fa-person-swimming {\n --fa: "\\f5c4";\n}\n\n.fa-swimmer {\n --fa: "\\f5c4";\n}\n\n.fa-water-ladder {\n --fa: "\\f5c5";\n}\n\n.fa-ladder-water {\n --fa: "\\f5c5";\n}\n\n.fa-swimming-pool {\n --fa: "\\f5c5";\n}\n\n.fa-droplet-slash {\n --fa: "\\f5c7";\n}\n\n.fa-tint-slash {\n --fa: "\\f5c7";\n}\n\n.fa-face-tired {\n --fa: "\\f5c8";\n}\n\n.fa-tired {\n --fa: "\\f5c8";\n}\n\n.fa-tooth {\n --fa: "\\f5c9";\n}\n\n.fa-umbrella-beach {\n --fa: "\\f5ca";\n}\n\n.fa-weight-hanging {\n --fa: "\\f5cd";\n}\n\n.fa-wine-glass-empty {\n --fa: "\\f5ce";\n}\n\n.fa-wine-glass-alt {\n --fa: "\\f5ce";\n}\n\n.fa-spray-can-sparkles {\n --fa: "\\f5d0";\n}\n\n.fa-air-freshener {\n --fa: "\\f5d0";\n}\n\n.fa-apple-whole {\n --fa: "\\f5d1";\n}\n\n.fa-apple-alt {\n --fa: "\\f5d1";\n}\n\n.fa-atom {\n --fa: "\\f5d2";\n}\n\n.fa-bone {\n --fa: "\\f5d7";\n}\n\n.fa-book-open-reader {\n --fa: "\\f5da";\n}\n\n.fa-book-reader {\n --fa: "\\f5da";\n}\n\n.fa-brain {\n --fa: "\\f5dc";\n}\n\n.fa-car-rear {\n --fa: "\\f5de";\n}\n\n.fa-car-alt {\n --fa: "\\f5de";\n}\n\n.fa-car-battery {\n --fa: "\\f5df";\n}\n\n.fa-battery-car {\n --fa: "\\f5df";\n}\n\n.fa-car-burst {\n --fa: "\\f5e1";\n}\n\n.fa-car-crash {\n --fa: "\\f5e1";\n}\n\n.fa-car-side {\n --fa: "\\f5e4";\n}\n\n.fa-charging-station {\n --fa: "\\f5e7";\n}\n\n.fa-diamond-turn-right {\n --fa: "\\f5eb";\n}\n\n.fa-directions {\n --fa: "\\f5eb";\n}\n\n.fa-draw-polygon {\n --fa: "\\f5ee";\n}\n\n.fa-vector-polygon {\n --fa: "\\f5ee";\n}\n\n.fa-laptop-code {\n --fa: "\\f5fc";\n}\n\n.fa-layer-group {\n --fa: "\\f5fd";\n}\n\n.fa-location-crosshairs {\n --fa: "\\f601";\n}\n\n.fa-location {\n --fa: "\\f601";\n}\n\n.fa-lungs {\n --fa: "\\f604";\n}\n\n.fa-microscope {\n --fa: "\\f610";\n}\n\n.fa-oil-can {\n --fa: "\\f613";\n}\n\n.fa-poop {\n --fa: "\\f619";\n}\n\n.fa-shapes {\n --fa: "\\f61f";\n}\n\n.fa-triangle-circle-square {\n --fa: "\\f61f";\n}\n\n.fa-star-of-life {\n --fa: "\\f621";\n}\n\n.fa-gauge {\n --fa: "\\f624";\n}\n\n.fa-dashboard {\n --fa: "\\f624";\n}\n\n.fa-gauge-med {\n --fa: "\\f624";\n}\n\n.fa-tachometer-alt-average {\n --fa: "\\f624";\n}\n\n.fa-gauge-high {\n --fa: "\\f625";\n}\n\n.fa-tachometer-alt {\n --fa: "\\f625";\n}\n\n.fa-tachometer-alt-fast {\n --fa: "\\f625";\n}\n\n.fa-gauge-simple {\n --fa: "\\f629";\n}\n\n.fa-gauge-simple-med {\n --fa: "\\f629";\n}\n\n.fa-tachometer-average {\n --fa: "\\f629";\n}\n\n.fa-gauge-simple-high {\n --fa: "\\f62a";\n}\n\n.fa-tachometer {\n --fa: "\\f62a";\n}\n\n.fa-tachometer-fast {\n --fa: "\\f62a";\n}\n\n.fa-teeth {\n --fa: "\\f62e";\n}\n\n.fa-teeth-open {\n --fa: "\\f62f";\n}\n\n.fa-masks-theater {\n --fa: "\\f630";\n}\n\n.fa-theater-masks {\n --fa: "\\f630";\n}\n\n.fa-traffic-light {\n --fa: "\\f637";\n}\n\n.fa-truck-monster {\n --fa: "\\f63b";\n}\n\n.fa-truck-pickup {\n --fa: "\\f63c";\n}\n\n.fa-rectangle-ad {\n --fa: "\\f641";\n}\n\n.fa-ad {\n --fa: "\\f641";\n}\n\n.fa-ankh {\n --fa: "\\f644";\n}\n\n.fa-book-bible {\n --fa: "\\f647";\n}\n\n.fa-bible {\n --fa: "\\f647";\n}\n\n.fa-business-time {\n --fa: "\\f64a";\n}\n\n.fa-briefcase-clock {\n --fa: "\\f64a";\n}\n\n.fa-city {\n --fa: "\\f64f";\n}\n\n.fa-comment-dollar {\n --fa: "\\f651";\n}\n\n.fa-comments-dollar {\n --fa: "\\f653";\n}\n\n.fa-cross {\n --fa: "\\f654";\n}\n\n.fa-dharmachakra {\n --fa: "\\f655";\n}\n\n.fa-envelope-open-text {\n --fa: "\\f658";\n}\n\n.fa-folder-minus {\n --fa: "\\f65d";\n}\n\n.fa-folder-plus {\n --fa: "\\f65e";\n}\n\n.fa-filter-circle-dollar {\n --fa: "\\f662";\n}\n\n.fa-funnel-dollar {\n --fa: "\\f662";\n}\n\n.fa-gopuram {\n --fa: "\\f664";\n}\n\n.fa-hamsa {\n --fa: "\\f665";\n}\n\n.fa-bahai {\n --fa: "\\f666";\n}\n\n.fa-haykal {\n --fa: "\\f666";\n}\n\n.fa-jedi {\n --fa: "\\f669";\n}\n\n.fa-book-journal-whills {\n --fa: "\\f66a";\n}\n\n.fa-journal-whills {\n --fa: "\\f66a";\n}\n\n.fa-kaaba {\n --fa: "\\f66b";\n}\n\n.fa-khanda {\n --fa: "\\f66d";\n}\n\n.fa-landmark {\n --fa: "\\f66f";\n}\n\n.fa-envelopes-bulk {\n --fa: "\\f674";\n}\n\n.fa-mail-bulk {\n --fa: "\\f674";\n}\n\n.fa-menorah {\n --fa: "\\f676";\n}\n\n.fa-mosque {\n --fa: "\\f678";\n}\n\n.fa-om {\n --fa: "\\f679";\n}\n\n.fa-spaghetti-monster-flying {\n --fa: "\\f67b";\n}\n\n.fa-pastafarianism {\n --fa: "\\f67b";\n}\n\n.fa-peace {\n --fa: "\\f67c";\n}\n\n.fa-place-of-worship {\n --fa: "\\f67f";\n}\n\n.fa-square-poll-vertical {\n --fa: "\\f681";\n}\n\n.fa-poll {\n --fa: "\\f681";\n}\n\n.fa-square-poll-horizontal {\n --fa: "\\f682";\n}\n\n.fa-poll-h {\n --fa: "\\f682";\n}\n\n.fa-person-praying {\n --fa: "\\f683";\n}\n\n.fa-pray {\n --fa: "\\f683";\n}\n\n.fa-hands-praying {\n --fa: "\\f684";\n}\n\n.fa-praying-hands {\n --fa: "\\f684";\n}\n\n.fa-book-quran {\n --fa: "\\f687";\n}\n\n.fa-quran {\n --fa: "\\f687";\n}\n\n.fa-magnifying-glass-dollar {\n --fa: "\\f688";\n}\n\n.fa-search-dollar {\n --fa: "\\f688";\n}\n\n.fa-magnifying-glass-location {\n --fa: "\\f689";\n}\n\n.fa-search-location {\n --fa: "\\f689";\n}\n\n.fa-socks {\n --fa: "\\f696";\n}\n\n.fa-square-root-variable {\n --fa: "\\f698";\n}\n\n.fa-square-root-alt {\n --fa: "\\f698";\n}\n\n.fa-star-and-crescent {\n --fa: "\\f699";\n}\n\n.fa-star-of-david {\n --fa: "\\f69a";\n}\n\n.fa-synagogue {\n --fa: "\\f69b";\n}\n\n.fa-scroll-torah {\n --fa: "\\f6a0";\n}\n\n.fa-torah {\n --fa: "\\f6a0";\n}\n\n.fa-torii-gate {\n --fa: "\\f6a1";\n}\n\n.fa-vihara {\n --fa: "\\f6a7";\n}\n\n.fa-volume {\n --fa: "\\f6a8";\n}\n\n.fa-volume-medium {\n --fa: "\\f6a8";\n}\n\n.fa-volume-xmark {\n --fa: "\\f6a9";\n}\n\n.fa-volume-mute {\n --fa: "\\f6a9";\n}\n\n.fa-volume-times {\n --fa: "\\f6a9";\n}\n\n.fa-yin-yang {\n --fa: "\\f6ad";\n}\n\n.fa-blender-phone {\n --fa: "\\f6b6";\n}\n\n.fa-book-skull {\n --fa: "\\f6b7";\n}\n\n.fa-book-dead {\n --fa: "\\f6b7";\n}\n\n.fa-campground {\n --fa: "\\f6bb";\n}\n\n.fa-cat {\n --fa: "\\f6be";\n}\n\n.fa-chair {\n --fa: "\\f6c0";\n}\n\n.fa-cloud-moon {\n --fa: "\\f6c3";\n}\n\n.fa-cloud-sun {\n --fa: "\\f6c4";\n}\n\n.fa-cow {\n --fa: "\\f6c8";\n}\n\n.fa-dice-d20 {\n --fa: "\\f6cf";\n}\n\n.fa-dice-d6 {\n --fa: "\\f6d1";\n}\n\n.fa-dog {\n --fa: "\\f6d3";\n}\n\n.fa-dragon {\n --fa: "\\f6d5";\n}\n\n.fa-drumstick-bite {\n --fa: "\\f6d7";\n}\n\n.fa-dungeon {\n --fa: "\\f6d9";\n}\n\n.fa-file-csv {\n --fa: "\\f6dd";\n}\n\n.fa-hand-fist {\n --fa: "\\f6de";\n}\n\n.fa-fist-raised {\n --fa: "\\f6de";\n}\n\n.fa-ghost {\n --fa: "\\f6e2";\n}\n\n.fa-hammer {\n --fa: "\\f6e3";\n}\n\n.fa-hanukiah {\n --fa: "\\f6e6";\n}\n\n.fa-hat-wizard {\n --fa: "\\f6e8";\n}\n\n.fa-person-hiking {\n --fa: "\\f6ec";\n}\n\n.fa-hiking {\n --fa: "\\f6ec";\n}\n\n.fa-hippo {\n --fa: "\\f6ed";\n}\n\n.fa-horse {\n --fa: "\\f6f0";\n}\n\n.fa-house-chimney-crack {\n --fa: "\\f6f1";\n}\n\n.fa-house-damage {\n --fa: "\\f6f1";\n}\n\n.fa-hryvnia-sign {\n --fa: "\\f6f2";\n}\n\n.fa-hryvnia {\n --fa: "\\f6f2";\n}\n\n.fa-mask {\n --fa: "\\f6fa";\n}\n\n.fa-mountain {\n --fa: "\\f6fc";\n}\n\n.fa-network-wired {\n --fa: "\\f6ff";\n}\n\n.fa-otter {\n --fa: "\\f700";\n}\n\n.fa-ring {\n --fa: "\\f70b";\n}\n\n.fa-person-running {\n --fa: "\\f70c";\n}\n\n.fa-running {\n --fa: "\\f70c";\n}\n\n.fa-scroll {\n --fa: "\\f70e";\n}\n\n.fa-skull-crossbones {\n --fa: "\\f714";\n}\n\n.fa-slash {\n --fa: "\\f715";\n}\n\n.fa-spider {\n --fa: "\\f717";\n}\n\n.fa-toilet-paper {\n --fa: "\\f71e";\n}\n\n.fa-toilet-paper-alt {\n --fa: "\\f71e";\n}\n\n.fa-toilet-paper-blank {\n --fa: "\\f71e";\n}\n\n.fa-tractor {\n --fa: "\\f722";\n}\n\n.fa-user-injured {\n --fa: "\\f728";\n}\n\n.fa-vr-cardboard {\n --fa: "\\f729";\n}\n\n.fa-wand-sparkles {\n --fa: "\\f72b";\n}\n\n.fa-wind {\n --fa: "\\f72e";\n}\n\n.fa-wine-bottle {\n --fa: "\\f72f";\n}\n\n.fa-cloud-meatball {\n --fa: "\\f73b";\n}\n\n.fa-cloud-moon-rain {\n --fa: "\\f73c";\n}\n\n.fa-cloud-rain {\n --fa: "\\f73d";\n}\n\n.fa-cloud-showers-heavy {\n --fa: "\\f740";\n}\n\n.fa-cloud-sun-rain {\n --fa: "\\f743";\n}\n\n.fa-democrat {\n --fa: "\\f747";\n}\n\n.fa-flag-usa {\n --fa: "\\f74d";\n}\n\n.fa-hurricane {\n --fa: "\\f751";\n}\n\n.fa-landmark-dome {\n --fa: "\\f752";\n}\n\n.fa-landmark-alt {\n --fa: "\\f752";\n}\n\n.fa-meteor {\n --fa: "\\f753";\n}\n\n.fa-person-booth {\n --fa: "\\f756";\n}\n\n.fa-poo-storm {\n --fa: "\\f75a";\n}\n\n.fa-poo-bolt {\n --fa: "\\f75a";\n}\n\n.fa-rainbow {\n --fa: "\\f75b";\n}\n\n.fa-republican {\n --fa: "\\f75e";\n}\n\n.fa-smog {\n --fa: "\\f75f";\n}\n\n.fa-temperature-high {\n --fa: "\\f769";\n}\n\n.fa-temperature-low {\n --fa: "\\f76b";\n}\n\n.fa-cloud-bolt {\n --fa: "\\f76c";\n}\n\n.fa-thunderstorm {\n --fa: "\\f76c";\n}\n\n.fa-tornado {\n --fa: "\\f76f";\n}\n\n.fa-volcano {\n --fa: "\\f770";\n}\n\n.fa-check-to-slot {\n --fa: "\\f772";\n}\n\n.fa-vote-yea {\n --fa: "\\f772";\n}\n\n.fa-water {\n --fa: "\\f773";\n}\n\n.fa-baby {\n --fa: "\\f77c";\n}\n\n.fa-baby-carriage {\n --fa: "\\f77d";\n}\n\n.fa-carriage-baby {\n --fa: "\\f77d";\n}\n\n.fa-biohazard {\n --fa: "\\f780";\n}\n\n.fa-blog {\n --fa: "\\f781";\n}\n\n.fa-calendar-day {\n --fa: "\\f783";\n}\n\n.fa-calendar-week {\n --fa: "\\f784";\n}\n\n.fa-candy-cane {\n --fa: "\\f786";\n}\n\n.fa-carrot {\n --fa: "\\f787";\n}\n\n.fa-cash-register {\n --fa: "\\f788";\n}\n\n.fa-minimize {\n --fa: "\\f78c";\n}\n\n.fa-compress-arrows-alt {\n --fa: "\\f78c";\n}\n\n.fa-dumpster {\n --fa: "\\f793";\n}\n\n.fa-dumpster-fire {\n --fa: "\\f794";\n}\n\n.fa-ethernet {\n --fa: "\\f796";\n}\n\n.fa-gifts {\n --fa: "\\f79c";\n}\n\n.fa-champagne-glasses {\n --fa: "\\f79f";\n}\n\n.fa-glass-cheers {\n --fa: "\\f79f";\n}\n\n.fa-whiskey-glass {\n --fa: "\\f7a0";\n}\n\n.fa-glass-whiskey {\n --fa: "\\f7a0";\n}\n\n.fa-earth-europe {\n --fa: "\\f7a2";\n}\n\n.fa-globe-europe {\n --fa: "\\f7a2";\n}\n\n.fa-grip-lines {\n --fa: "\\f7a4";\n}\n\n.fa-grip-lines-vertical {\n --fa: "\\f7a5";\n}\n\n.fa-guitar {\n --fa: "\\f7a6";\n}\n\n.fa-heart-crack {\n --fa: "\\f7a9";\n}\n\n.fa-heart-broken {\n --fa: "\\f7a9";\n}\n\n.fa-holly-berry {\n --fa: "\\f7aa";\n}\n\n.fa-horse-head {\n --fa: "\\f7ab";\n}\n\n.fa-icicles {\n --fa: "\\f7ad";\n}\n\n.fa-igloo {\n --fa: "\\f7ae";\n}\n\n.fa-mitten {\n --fa: "\\f7b5";\n}\n\n.fa-mug-hot {\n --fa: "\\f7b6";\n}\n\n.fa-radiation {\n --fa: "\\f7b9";\n}\n\n.fa-circle-radiation {\n --fa: "\\f7ba";\n}\n\n.fa-radiation-alt {\n --fa: "\\f7ba";\n}\n\n.fa-restroom {\n --fa: "\\f7bd";\n}\n\n.fa-satellite {\n --fa: "\\f7bf";\n}\n\n.fa-satellite-dish {\n --fa: "\\f7c0";\n}\n\n.fa-sd-card {\n --fa: "\\f7c2";\n}\n\n.fa-sim-card {\n --fa: "\\f7c4";\n}\n\n.fa-person-skating {\n --fa: "\\f7c5";\n}\n\n.fa-skating {\n --fa: "\\f7c5";\n}\n\n.fa-person-skiing {\n --fa: "\\f7c9";\n}\n\n.fa-skiing {\n --fa: "\\f7c9";\n}\n\n.fa-person-skiing-nordic {\n --fa: "\\f7ca";\n}\n\n.fa-skiing-nordic {\n --fa: "\\f7ca";\n}\n\n.fa-sleigh {\n --fa: "\\f7cc";\n}\n\n.fa-comment-sms {\n --fa: "\\f7cd";\n}\n\n.fa-sms {\n --fa: "\\f7cd";\n}\n\n.fa-person-snowboarding {\n --fa: "\\f7ce";\n}\n\n.fa-snowboarding {\n --fa: "\\f7ce";\n}\n\n.fa-snowman {\n --fa: "\\f7d0";\n}\n\n.fa-snowplow {\n --fa: "\\f7d2";\n}\n\n.fa-tenge-sign {\n --fa: "\\f7d7";\n}\n\n.fa-tenge {\n --fa: "\\f7d7";\n}\n\n.fa-toilet {\n --fa: "\\f7d8";\n}\n\n.fa-screwdriver-wrench {\n --fa: "\\f7d9";\n}\n\n.fa-tools {\n --fa: "\\f7d9";\n}\n\n.fa-cable-car {\n --fa: "\\f7da";\n}\n\n.fa-tram {\n --fa: "\\f7da";\n}\n\n.fa-fire-flame-curved {\n --fa: "\\f7e4";\n}\n\n.fa-fire-alt {\n --fa: "\\f7e4";\n}\n\n.fa-bacon {\n --fa: "\\f7e5";\n}\n\n.fa-book-medical {\n --fa: "\\f7e6";\n}\n\n.fa-bread-slice {\n --fa: "\\f7ec";\n}\n\n.fa-cheese {\n --fa: "\\f7ef";\n}\n\n.fa-house-chimney-medical {\n --fa: "\\f7f2";\n}\n\n.fa-clinic-medical {\n --fa: "\\f7f2";\n}\n\n.fa-clipboard-user {\n --fa: "\\f7f3";\n}\n\n.fa-comment-medical {\n --fa: "\\f7f5";\n}\n\n.fa-crutch {\n --fa: "\\f7f7";\n}\n\n.fa-disease {\n --fa: "\\f7fa";\n}\n\n.fa-egg {\n --fa: "\\f7fb";\n}\n\n.fa-folder-tree {\n --fa: "\\f802";\n}\n\n.fa-burger {\n --fa: "\\f805";\n}\n\n.fa-hamburger {\n --fa: "\\f805";\n}\n\n.fa-hand-middle-finger {\n --fa: "\\f806";\n}\n\n.fa-helmet-safety {\n --fa: "\\f807";\n}\n\n.fa-hard-hat {\n --fa: "\\f807";\n}\n\n.fa-hat-hard {\n --fa: "\\f807";\n}\n\n.fa-hospital-user {\n --fa: "\\f80d";\n}\n\n.fa-hotdog {\n --fa: "\\f80f";\n}\n\n.fa-ice-cream {\n --fa: "\\f810";\n}\n\n.fa-laptop-medical {\n --fa: "\\f812";\n}\n\n.fa-pager {\n --fa: "\\f815";\n}\n\n.fa-pepper-hot {\n --fa: "\\f816";\n}\n\n.fa-pizza-slice {\n --fa: "\\f818";\n}\n\n.fa-sack-dollar {\n --fa: "\\f81d";\n}\n\n.fa-book-tanakh {\n --fa: "\\f827";\n}\n\n.fa-tanakh {\n --fa: "\\f827";\n}\n\n.fa-bars-progress {\n --fa: "\\f828";\n}\n\n.fa-tasks-alt {\n --fa: "\\f828";\n}\n\n.fa-trash-arrow-up {\n --fa: "\\f829";\n}\n\n.fa-trash-restore {\n --fa: "\\f829";\n}\n\n.fa-trash-can-arrow-up {\n --fa: "\\f82a";\n}\n\n.fa-trash-restore-alt {\n --fa: "\\f82a";\n}\n\n.fa-user-nurse {\n --fa: "\\f82f";\n}\n\n.fa-wave-square {\n --fa: "\\f83e";\n}\n\n.fa-person-biking {\n --fa: "\\f84a";\n}\n\n.fa-biking {\n --fa: "\\f84a";\n}\n\n.fa-border-all {\n --fa: "\\f84c";\n}\n\n.fa-border-none {\n --fa: "\\f850";\n}\n\n.fa-border-top-left {\n --fa: "\\f853";\n}\n\n.fa-border-style {\n --fa: "\\f853";\n}\n\n.fa-person-digging {\n --fa: "\\f85e";\n}\n\n.fa-digging {\n --fa: "\\f85e";\n}\n\n.fa-fan {\n --fa: "\\f863";\n}\n\n.fa-icons {\n --fa: "\\f86d";\n}\n\n.fa-heart-music-camera-bolt {\n --fa: "\\f86d";\n}\n\n.fa-phone-flip {\n --fa: "\\f879";\n}\n\n.fa-phone-alt {\n --fa: "\\f879";\n}\n\n.fa-square-phone-flip {\n --fa: "\\f87b";\n}\n\n.fa-phone-square-alt {\n --fa: "\\f87b";\n}\n\n.fa-photo-film {\n --fa: "\\f87c";\n}\n\n.fa-photo-video {\n --fa: "\\f87c";\n}\n\n.fa-text-slash {\n --fa: "\\f87d";\n}\n\n.fa-remove-format {\n --fa: "\\f87d";\n}\n\n.fa-arrow-down-z-a {\n --fa: "\\f881";\n}\n\n.fa-sort-alpha-desc {\n --fa: "\\f881";\n}\n\n.fa-sort-alpha-down-alt {\n --fa: "\\f881";\n}\n\n.fa-arrow-up-z-a {\n --fa: "\\f882";\n}\n\n.fa-sort-alpha-up-alt {\n --fa: "\\f882";\n}\n\n.fa-arrow-down-short-wide {\n --fa: "\\f884";\n}\n\n.fa-sort-amount-desc {\n --fa: "\\f884";\n}\n\n.fa-sort-amount-down-alt {\n --fa: "\\f884";\n}\n\n.fa-arrow-up-short-wide {\n --fa: "\\f885";\n}\n\n.fa-sort-amount-up-alt {\n --fa: "\\f885";\n}\n\n.fa-arrow-down-9-1 {\n --fa: "\\f886";\n}\n\n.fa-sort-numeric-desc {\n --fa: "\\f886";\n}\n\n.fa-sort-numeric-down-alt {\n --fa: "\\f886";\n}\n\n.fa-arrow-up-9-1 {\n --fa: "\\f887";\n}\n\n.fa-sort-numeric-up-alt {\n --fa: "\\f887";\n}\n\n.fa-spell-check {\n --fa: "\\f891";\n}\n\n.fa-voicemail {\n --fa: "\\f897";\n}\n\n.fa-hat-cowboy {\n --fa: "\\f8c0";\n}\n\n.fa-hat-cowboy-side {\n --fa: "\\f8c1";\n}\n\n.fa-computer-mouse {\n --fa: "\\f8cc";\n}\n\n.fa-mouse {\n --fa: "\\f8cc";\n}\n\n.fa-radio {\n --fa: "\\f8d7";\n}\n\n.fa-record-vinyl {\n --fa: "\\f8d9";\n}\n\n.fa-walkie-talkie {\n --fa: "\\f8ef";\n}\n\n.fa-caravan {\n --fa: "\\f8ff";\n}\n:root, :host {\n --fa-family-brands: 'Font Awesome 7 Brands';\n --fa-font-brands: normal 400 1em/1 var(--fa-family-brands);\n}\n\n@font-face {\n font-family: "Font Awesome 7 Brands";\n font-style: normal;\n font-weight: 400;\n font-display: block;\n src: url(${d});\n}\n.fab,\n.fa-brands,\n.fa-classic.fa-brands {\n --fa-family: var(--fa-family-brands);\n --fa-style: 400;\n}\n\n.fa-firefox-browser {\n --fa: "\\e007";\n}\n\n.fa-ideal {\n --fa: "\\e013";\n}\n\n.fa-microblog {\n --fa: "\\e01a";\n}\n\n.fa-square-pied-piper {\n --fa: "\\e01e";\n}\n\n.fa-pied-piper-square {\n --fa: "\\e01e";\n}\n\n.fa-unity {\n --fa: "\\e049";\n}\n\n.fa-dailymotion {\n --fa: "\\e052";\n}\n\n.fa-square-instagram {\n --fa: "\\e055";\n}\n\n.fa-instagram-square {\n --fa: "\\e055";\n}\n\n.fa-mixer {\n --fa: "\\e056";\n}\n\n.fa-shopify {\n --fa: "\\e057";\n}\n\n.fa-deezer {\n --fa: "\\e077";\n}\n\n.fa-edge-legacy {\n --fa: "\\e078";\n}\n\n.fa-google-pay {\n --fa: "\\e079";\n}\n\n.fa-rust {\n --fa: "\\e07a";\n}\n\n.fa-tiktok {\n --fa: "\\e07b";\n}\n\n.fa-unsplash {\n --fa: "\\e07c";\n}\n\n.fa-cloudflare {\n --fa: "\\e07d";\n}\n\n.fa-guilded {\n --fa: "\\e07e";\n}\n\n.fa-hive {\n --fa: "\\e07f";\n}\n\n.fa-42-group {\n --fa: "\\e080";\n}\n\n.fa-innosoft {\n --fa: "\\e080";\n}\n\n.fa-instalod {\n --fa: "\\e081";\n}\n\n.fa-octopus-deploy {\n --fa: "\\e082";\n}\n\n.fa-perbyte {\n --fa: "\\e083";\n}\n\n.fa-uncharted {\n --fa: "\\e084";\n}\n\n.fa-watchman-monitoring {\n --fa: "\\e087";\n}\n\n.fa-wodu {\n --fa: "\\e088";\n}\n\n.fa-wirsindhandwerk {\n --fa: "\\e2d0";\n}\n\n.fa-wsh {\n --fa: "\\e2d0";\n}\n\n.fa-bots {\n --fa: "\\e340";\n}\n\n.fa-cmplid {\n --fa: "\\e360";\n}\n\n.fa-bilibili {\n --fa: "\\e3d9";\n}\n\n.fa-golang {\n --fa: "\\e40f";\n}\n\n.fa-pix {\n --fa: "\\e43a";\n}\n\n.fa-sitrox {\n --fa: "\\e44a";\n}\n\n.fa-hashnode {\n --fa: "\\e499";\n}\n\n.fa-meta {\n --fa: "\\e49b";\n}\n\n.fa-padlet {\n --fa: "\\e4a0";\n}\n\n.fa-nfc-directional {\n --fa: "\\e530";\n}\n\n.fa-nfc-symbol {\n --fa: "\\e531";\n}\n\n.fa-screenpal {\n --fa: "\\e570";\n}\n\n.fa-space-awesome {\n --fa: "\\e5ac";\n}\n\n.fa-square-font-awesome {\n --fa: "\\e5ad";\n}\n\n.fa-square-gitlab {\n --fa: "\\e5ae";\n}\n\n.fa-gitlab-square {\n --fa: "\\e5ae";\n}\n\n.fa-odysee {\n --fa: "\\e5c6";\n}\n\n.fa-stubber {\n --fa: "\\e5c7";\n}\n\n.fa-debian {\n --fa: "\\e60b";\n}\n\n.fa-shoelace {\n --fa: "\\e60c";\n}\n\n.fa-threads {\n --fa: "\\e618";\n}\n\n.fa-square-threads {\n --fa: "\\e619";\n}\n\n.fa-square-x-twitter {\n --fa: "\\e61a";\n}\n\n.fa-x-twitter {\n --fa: "\\e61b";\n}\n\n.fa-opensuse {\n --fa: "\\e62b";\n}\n\n.fa-letterboxd {\n --fa: "\\e62d";\n}\n\n.fa-square-letterboxd {\n --fa: "\\e62e";\n}\n\n.fa-mintbit {\n --fa: "\\e62f";\n}\n\n.fa-google-scholar {\n --fa: "\\e63b";\n}\n\n.fa-brave {\n --fa: "\\e63c";\n}\n\n.fa-brave-reverse {\n --fa: "\\e63d";\n}\n\n.fa-pixiv {\n --fa: "\\e640";\n}\n\n.fa-upwork {\n --fa: "\\e641";\n}\n\n.fa-webflow {\n --fa: "\\e65c";\n}\n\n.fa-signal-messenger {\n --fa: "\\e663";\n}\n\n.fa-bluesky {\n --fa: "\\e671";\n}\n\n.fa-jxl {\n --fa: "\\e67b";\n}\n\n.fa-square-upwork {\n --fa: "\\e67c";\n}\n\n.fa-web-awesome {\n --fa: "\\e682";\n}\n\n.fa-square-web-awesome {\n --fa: "\\e683";\n}\n\n.fa-square-web-awesome-stroke {\n --fa: "\\e684";\n}\n\n.fa-dart-lang {\n --fa: "\\e693";\n}\n\n.fa-flutter {\n --fa: "\\e694";\n}\n\n.fa-files-pinwheel {\n --fa: "\\e69f";\n}\n\n.fa-css {\n --fa: "\\e6a2";\n}\n\n.fa-square-bluesky {\n --fa: "\\e6a3";\n}\n\n.fa-openai {\n --fa: "\\e7cf";\n}\n\n.fa-square-linkedin {\n --fa: "\\e7d0";\n}\n\n.fa-cash-app {\n --fa: "\\e7d4";\n}\n\n.fa-disqus {\n --fa: "\\e7d5";\n}\n\n.fa-eleventy {\n --fa: "\\e7d6";\n}\n\n.fa-11ty {\n --fa: "\\e7d6";\n}\n\n.fa-kakao-talk {\n --fa: "\\e7d7";\n}\n\n.fa-linktree {\n --fa: "\\e7d8";\n}\n\n.fa-notion {\n --fa: "\\e7d9";\n}\n\n.fa-pandora {\n --fa: "\\e7da";\n}\n\n.fa-pixelfed {\n --fa: "\\e7db";\n}\n\n.fa-tidal {\n --fa: "\\e7dc";\n}\n\n.fa-vsco {\n --fa: "\\e7dd";\n}\n\n.fa-w3c {\n --fa: "\\e7de";\n}\n\n.fa-lumon {\n --fa: "\\e7e2";\n}\n\n.fa-lumon-drop {\n --fa: "\\e7e3";\n}\n\n.fa-square-figma {\n --fa: "\\e7e4";\n}\n\n.fa-tex {\n --fa: "\\e7ff";\n}\n\n.fa-duolingo {\n --fa: "\\e812";\n}\n\n.fa-supportnow {\n --fa: "\\e833";\n}\n\n.fa-tor-browser {\n --fa: "\\e838";\n}\n\n.fa-typescript {\n --fa: "\\e840";\n}\n\n.fa-square-deskpro {\n --fa: "\\e844";\n}\n\n.fa-circle-zulip {\n --fa: "\\e851";\n}\n\n.fa-julia {\n --fa: "\\e852";\n}\n\n.fa-zulip {\n --fa: "\\e853";\n}\n\n.fa-unison {\n --fa: "\\e854";\n}\n\n.fa-board-game-geek {\n --fa: "\\e855";\n}\n\n.fa-bgg {\n --fa: "\\e855";\n}\n\n.fa-ko-fi {\n --fa: "\\e856";\n}\n\n.fa-kubernetes {\n --fa: "\\e857";\n}\n\n.fa-postgresql {\n --fa: "\\e858";\n}\n\n.fa-scaleway {\n --fa: "\\e859";\n}\n\n.fa-venmo {\n --fa: "\\e85a";\n}\n\n.fa-venmo-v {\n --fa: "\\e85b";\n}\n\n.fa-unreal-engine {\n --fa: "\\e85c";\n}\n\n.fa-globaleaks {\n --fa: "\\e85d";\n}\n\n.fa-solana {\n --fa: "\\e85e";\n}\n\n.fa-threema {\n --fa: "\\e85f";\n}\n\n.fa-forgejo {\n --fa: "\\e860";\n}\n\n.fa-claude {\n --fa: "\\e861";\n}\n\n.fa-gitee {\n --fa: "\\e863";\n}\n\n.fa-xmpp {\n --fa: "\\e864";\n}\n\n.fa-fediverse {\n --fa: "\\e865";\n}\n\n.fa-tailwind-css {\n --fa: "\\e866";\n}\n\n.fa-arch-linux {\n --fa: "\\e867";\n}\n\n.fa-svelte {\n --fa: "\\e868";\n}\n\n.fa-hugging-face {\n --fa: "\\e869";\n}\n\n.fa-leetcode {\n --fa: "\\e86a";\n}\n\n.fa-openstreetmap {\n --fa: "\\e86b";\n}\n\n.fa-ultralytics {\n --fa: "\\e86d";\n}\n\n.fa-ultralytics-hub {\n --fa: "\\e86e";\n}\n\n.fa-ultralytics-yolo {\n --fa: "\\e86f";\n}\n\n.fa-obsidian {\n --fa: "\\e879";\n}\n\n.fa-zoom {\n --fa: "\\e87b";\n}\n\n.fa-vim {\n --fa: "\\e88a";\n}\n\n.fa-symfonycasts {\n --fa: "\\e8ab";\n}\n\n.fa-build-awesome {\n --fa: "\\e8ac";\n}\n\n.fa-codeberg {\n --fa: "\\e8ad";\n}\n\n.fa-devpost {\n --fa: "\\e8ae";\n}\n\n.fa-internet-archive {\n --fa: "\\e8b1";\n}\n\n.fa-lets-encrypt {\n --fa: "\\e8b2";\n}\n\n.fa-matrix {\n --fa: "\\e8b3";\n}\n\n.fa-mattermost {\n --fa: "\\e8b4";\n}\n\n.fa-nextcloud {\n --fa: "\\e8b5";\n}\n\n.fa-roblox-creator-studio {\n --fa: "\\e8b6";\n}\n\n.fa-square-build-awesome-stroke {\n --fa: "\\e8b7";\n}\n\n.fa-substack {\n --fa: "\\e8b8";\n}\n\n.fa-tesla {\n --fa: "\\e8b9";\n}\n\n.fa-xrp {\n --fa: "\\e8ba";\n}\n\n.fa-xrpl {\n --fa: "\\e8bb";\n}\n\n.fa-youtube-shorts {\n --fa: "\\e8bc";\n}\n\n.fa-ror {\n --fa: "\\e8bd";\n}\n\n.fa-visual-studio {\n --fa: "\\e8be";\n}\n\n.fa-dolibarr {\n --fa: "\\e8bf";\n}\n\n.fa-obs-studio {\n --fa: "\\e8c0";\n}\n\n.fa-storybook {\n --fa: "\\e8c1";\n}\n\n.fa-a11y-project {\n --fa: "\\e8c2";\n}\n\n.fa-copilot {\n --fa: "\\e8c7";\n}\n\n.fa-square-twitter {\n --fa: "\\f081";\n}\n\n.fa-twitter-square {\n --fa: "\\f081";\n}\n\n.fa-square-facebook {\n --fa: "\\f082";\n}\n\n.fa-facebook-square {\n --fa: "\\f082";\n}\n\n.fa-linkedin {\n --fa: "\\f08c";\n}\n\n.fa-square-github {\n --fa: "\\f092";\n}\n\n.fa-github-square {\n --fa: "\\f092";\n}\n\n.fa-twitter {\n --fa: "\\f099";\n}\n\n.fa-facebook {\n --fa: "\\f09a";\n}\n\n.fa-github {\n --fa: "\\f09b";\n}\n\n.fa-pinterest {\n --fa: "\\f0d2";\n}\n\n.fa-square-pinterest {\n --fa: "\\f0d3";\n}\n\n.fa-pinterest-square {\n --fa: "\\f0d3";\n}\n\n.fa-square-google-plus {\n --fa: "\\f0d4";\n}\n\n.fa-google-plus-square {\n --fa: "\\f0d4";\n}\n\n.fa-google-plus-g {\n --fa: "\\f0d5";\n}\n\n.fa-linkedin-in {\n --fa: "\\f0e1";\n}\n\n.fa-github-alt {\n --fa: "\\f113";\n}\n\n.fa-maxcdn {\n --fa: "\\f136";\n}\n\n.fa-html5 {\n --fa: "\\f13b";\n}\n\n.fa-css3 {\n --fa: "\\f13c";\n}\n\n.fa-btc {\n --fa: "\\f15a";\n}\n\n.fa-youtube {\n --fa: "\\f167";\n}\n\n.fa-xing {\n --fa: "\\f168";\n}\n\n.fa-square-xing {\n --fa: "\\f169";\n}\n\n.fa-xing-square {\n --fa: "\\f169";\n}\n\n.fa-dropbox {\n --fa: "\\f16b";\n}\n\n.fa-stack-overflow {\n --fa: "\\f16c";\n}\n\n.fa-instagram {\n --fa: "\\f16d";\n}\n\n.fa-flickr {\n --fa: "\\f16e";\n}\n\n.fa-adn {\n --fa: "\\f170";\n}\n\n.fa-bitbucket {\n --fa: "\\f171";\n}\n\n.fa-tumblr {\n --fa: "\\f173";\n}\n\n.fa-square-tumblr {\n --fa: "\\f174";\n}\n\n.fa-tumblr-square {\n --fa: "\\f174";\n}\n\n.fa-apple {\n --fa: "\\f179";\n}\n\n.fa-windows {\n --fa: "\\f17a";\n}\n\n.fa-android {\n --fa: "\\f17b";\n}\n\n.fa-linux {\n --fa: "\\f17c";\n}\n\n.fa-dribbble {\n --fa: "\\f17d";\n}\n\n.fa-skype {\n --fa: "\\f17e";\n}\n\n.fa-foursquare {\n --fa: "\\f180";\n}\n\n.fa-trello {\n --fa: "\\f181";\n}\n\n.fa-gratipay {\n --fa: "\\f184";\n}\n\n.fa-vk {\n --fa: "\\f189";\n}\n\n.fa-weibo {\n --fa: "\\f18a";\n}\n\n.fa-renren {\n --fa: "\\f18b";\n}\n\n.fa-pagelines {\n --fa: "\\f18c";\n}\n\n.fa-stack-exchange {\n --fa: "\\f18d";\n}\n\n.fa-square-vimeo {\n --fa: "\\f194";\n}\n\n.fa-vimeo-square {\n --fa: "\\f194";\n}\n\n.fa-slack {\n --fa: "\\f198";\n}\n\n.fa-slack-hash {\n --fa: "\\f198";\n}\n\n.fa-wordpress {\n --fa: "\\f19a";\n}\n\n.fa-openid {\n --fa: "\\f19b";\n}\n\n.fa-yahoo {\n --fa: "\\f19e";\n}\n\n.fa-google {\n --fa: "\\f1a0";\n}\n\n.fa-reddit {\n --fa: "\\f1a1";\n}\n\n.fa-square-reddit {\n --fa: "\\f1a2";\n}\n\n.fa-reddit-square {\n --fa: "\\f1a2";\n}\n\n.fa-stumbleupon-circle {\n --fa: "\\f1a3";\n}\n\n.fa-stumbleupon {\n --fa: "\\f1a4";\n}\n\n.fa-delicious {\n --fa: "\\f1a5";\n}\n\n.fa-digg {\n --fa: "\\f1a6";\n}\n\n.fa-pied-piper-pp {\n --fa: "\\f1a7";\n}\n\n.fa-pied-piper-alt {\n --fa: "\\f1a8";\n}\n\n.fa-drupal {\n --fa: "\\f1a9";\n}\n\n.fa-joomla {\n --fa: "\\f1aa";\n}\n\n.fa-behance {\n --fa: "\\f1b4";\n}\n\n.fa-square-behance {\n --fa: "\\f1b5";\n}\n\n.fa-behance-square {\n --fa: "\\f1b5";\n}\n\n.fa-steam {\n --fa: "\\f1b6";\n}\n\n.fa-square-steam {\n --fa: "\\f1b7";\n}\n\n.fa-steam-square {\n --fa: "\\f1b7";\n}\n\n.fa-spotify {\n --fa: "\\f1bc";\n}\n\n.fa-deviantart {\n --fa: "\\f1bd";\n}\n\n.fa-soundcloud {\n --fa: "\\f1be";\n}\n\n.fa-vine {\n --fa: "\\f1ca";\n}\n\n.fa-codepen {\n --fa: "\\f1cb";\n}\n\n.fa-jsfiddle {\n --fa: "\\f1cc";\n}\n\n.fa-rebel {\n --fa: "\\f1d0";\n}\n\n.fa-empire {\n --fa: "\\f1d1";\n}\n\n.fa-square-git {\n --fa: "\\f1d2";\n}\n\n.fa-git-square {\n --fa: "\\f1d2";\n}\n\n.fa-git {\n --fa: "\\f1d3";\n}\n\n.fa-hacker-news {\n --fa: "\\f1d4";\n}\n\n.fa-tencent-weibo {\n --fa: "\\f1d5";\n}\n\n.fa-qq {\n --fa: "\\f1d6";\n}\n\n.fa-weixin {\n --fa: "\\f1d7";\n}\n\n.fa-slideshare {\n --fa: "\\f1e7";\n}\n\n.fa-twitch {\n --fa: "\\f1e8";\n}\n\n.fa-yelp {\n --fa: "\\f1e9";\n}\n\n.fa-paypal {\n --fa: "\\f1ed";\n}\n\n.fa-google-wallet {\n --fa: "\\f1ee";\n}\n\n.fa-cc-visa {\n --fa: "\\f1f0";\n}\n\n.fa-cc-mastercard {\n --fa: "\\f1f1";\n}\n\n.fa-cc-discover {\n --fa: "\\f1f2";\n}\n\n.fa-cc-amex {\n --fa: "\\f1f3";\n}\n\n.fa-cc-paypal {\n --fa: "\\f1f4";\n}\n\n.fa-cc-stripe {\n --fa: "\\f1f5";\n}\n\n.fa-lastfm {\n --fa: "\\f202";\n}\n\n.fa-square-lastfm {\n --fa: "\\f203";\n}\n\n.fa-lastfm-square {\n --fa: "\\f203";\n}\n\n.fa-ioxhost {\n --fa: "\\f208";\n}\n\n.fa-angellist {\n --fa: "\\f209";\n}\n\n.fa-buysellads {\n --fa: "\\f20d";\n}\n\n.fa-connectdevelop {\n --fa: "\\f20e";\n}\n\n.fa-dashcube {\n --fa: "\\f210";\n}\n\n.fa-forumbee {\n --fa: "\\f211";\n}\n\n.fa-leanpub {\n --fa: "\\f212";\n}\n\n.fa-sellsy {\n --fa: "\\f213";\n}\n\n.fa-shirtsinbulk {\n --fa: "\\f214";\n}\n\n.fa-simplybuilt {\n --fa: "\\f215";\n}\n\n.fa-skyatlas {\n --fa: "\\f216";\n}\n\n.fa-pinterest-p {\n --fa: "\\f231";\n}\n\n.fa-whatsapp {\n --fa: "\\f232";\n}\n\n.fa-viacoin {\n --fa: "\\f237";\n}\n\n.fa-medium {\n --fa: "\\f23a";\n}\n\n.fa-medium-m {\n --fa: "\\f23a";\n}\n\n.fa-y-combinator {\n --fa: "\\f23b";\n}\n\n.fa-optin-monster {\n --fa: "\\f23c";\n}\n\n.fa-opencart {\n --fa: "\\f23d";\n}\n\n.fa-expeditedssl {\n --fa: "\\f23e";\n}\n\n.fa-cc-jcb {\n --fa: "\\f24b";\n}\n\n.fa-cc-diners-club {\n --fa: "\\f24c";\n}\n\n.fa-creative-commons {\n --fa: "\\f25e";\n}\n\n.fa-gg {\n --fa: "\\f260";\n}\n\n.fa-gg-circle {\n --fa: "\\f261";\n}\n\n.fa-odnoklassniki {\n --fa: "\\f263";\n}\n\n.fa-square-odnoklassniki {\n --fa: "\\f264";\n}\n\n.fa-odnoklassniki-square {\n --fa: "\\f264";\n}\n\n.fa-get-pocket {\n --fa: "\\f265";\n}\n\n.fa-wikipedia-w {\n --fa: "\\f266";\n}\n\n.fa-safari {\n --fa: "\\f267";\n}\n\n.fa-chrome {\n --fa: "\\f268";\n}\n\n.fa-firefox {\n --fa: "\\f269";\n}\n\n.fa-opera {\n --fa: "\\f26a";\n}\n\n.fa-internet-explorer {\n --fa: "\\f26b";\n}\n\n.fa-contao {\n --fa: "\\f26d";\n}\n\n.fa-500px {\n --fa: "\\f26e";\n}\n\n.fa-amazon {\n --fa: "\\f270";\n}\n\n.fa-houzz {\n --fa: "\\f27c";\n}\n\n.fa-vimeo-v {\n --fa: "\\f27d";\n}\n\n.fa-black-tie {\n --fa: "\\f27e";\n}\n\n.fa-fonticons {\n --fa: "\\f280";\n}\n\n.fa-reddit-alien {\n --fa: "\\f281";\n}\n\n.fa-edge {\n --fa: "\\f282";\n}\n\n.fa-codiepie {\n --fa: "\\f284";\n}\n\n.fa-modx {\n --fa: "\\f285";\n}\n\n.fa-fort-awesome {\n --fa: "\\f286";\n}\n\n.fa-usb {\n --fa: "\\f287";\n}\n\n.fa-product-hunt {\n --fa: "\\f288";\n}\n\n.fa-mixcloud {\n --fa: "\\f289";\n}\n\n.fa-scribd {\n --fa: "\\f28a";\n}\n\n.fa-bluetooth {\n --fa: "\\f293";\n}\n\n.fa-bluetooth-b {\n --fa: "\\f294";\n}\n\n.fa-gitlab {\n --fa: "\\f296";\n}\n\n.fa-wpbeginner {\n --fa: "\\f297";\n}\n\n.fa-wpforms {\n --fa: "\\f298";\n}\n\n.fa-envira {\n --fa: "\\f299";\n}\n\n.fa-glide {\n --fa: "\\f2a5";\n}\n\n.fa-glide-g {\n --fa: "\\f2a6";\n}\n\n.fa-viadeo {\n --fa: "\\f2a9";\n}\n\n.fa-square-viadeo {\n --fa: "\\f2aa";\n}\n\n.fa-viadeo-square {\n --fa: "\\f2aa";\n}\n\n.fa-snapchat {\n --fa: "\\f2ab";\n}\n\n.fa-snapchat-ghost {\n --fa: "\\f2ab";\n}\n\n.fa-square-snapchat {\n --fa: "\\f2ad";\n}\n\n.fa-snapchat-square {\n --fa: "\\f2ad";\n}\n\n.fa-pied-piper {\n --fa: "\\f2ae";\n}\n\n.fa-first-order {\n --fa: "\\f2b0";\n}\n\n.fa-yoast {\n --fa: "\\f2b1";\n}\n\n.fa-themeisle {\n --fa: "\\f2b2";\n}\n\n.fa-google-plus {\n --fa: "\\f2b3";\n}\n\n.fa-font-awesome {\n --fa: "\\f2b4";\n}\n\n.fa-font-awesome-flag {\n --fa: "\\f2b4";\n}\n\n.fa-font-awesome-logo-full {\n --fa: "\\f2b4";\n}\n\n.fa-linode {\n --fa: "\\f2b8";\n}\n\n.fa-quora {\n --fa: "\\f2c4";\n}\n\n.fa-free-code-camp {\n --fa: "\\f2c5";\n}\n\n.fa-telegram {\n --fa: "\\f2c6";\n}\n\n.fa-telegram-plane {\n --fa: "\\f2c6";\n}\n\n.fa-bandcamp {\n --fa: "\\f2d5";\n}\n\n.fa-grav {\n --fa: "\\f2d6";\n}\n\n.fa-etsy {\n --fa: "\\f2d7";\n}\n\n.fa-imdb {\n --fa: "\\f2d8";\n}\n\n.fa-ravelry {\n --fa: "\\f2d9";\n}\n\n.fa-sellcast {\n --fa: "\\f2da";\n}\n\n.fa-superpowers {\n --fa: "\\f2dd";\n}\n\n.fa-wpexplorer {\n --fa: "\\f2de";\n}\n\n.fa-meetup {\n --fa: "\\f2e0";\n}\n\n.fa-square-font-awesome-stroke {\n --fa: "\\f35c";\n}\n\n.fa-font-awesome-alt {\n --fa: "\\f35c";\n}\n\n.fa-accessible-icon {\n --fa: "\\f368";\n}\n\n.fa-accusoft {\n --fa: "\\f369";\n}\n\n.fa-adversal {\n --fa: "\\f36a";\n}\n\n.fa-affiliatetheme {\n --fa: "\\f36b";\n}\n\n.fa-algolia {\n --fa: "\\f36c";\n}\n\n.fa-amilia {\n --fa: "\\f36d";\n}\n\n.fa-angrycreative {\n --fa: "\\f36e";\n}\n\n.fa-app-store {\n --fa: "\\f36f";\n}\n\n.fa-app-store-ios {\n --fa: "\\f370";\n}\n\n.fa-apper {\n --fa: "\\f371";\n}\n\n.fa-asymmetrik {\n --fa: "\\f372";\n}\n\n.fa-audible {\n --fa: "\\f373";\n}\n\n.fa-avianex {\n --fa: "\\f374";\n}\n\n.fa-aws {\n --fa: "\\f375";\n}\n\n.fa-bimobject {\n --fa: "\\f378";\n}\n\n.fa-bitcoin {\n --fa: "\\f379";\n}\n\n.fa-bity {\n --fa: "\\f37a";\n}\n\n.fa-blackberry {\n --fa: "\\f37b";\n}\n\n.fa-blogger {\n --fa: "\\f37c";\n}\n\n.fa-blogger-b {\n --fa: "\\f37d";\n}\n\n.fa-buromobelexperte {\n --fa: "\\f37f";\n}\n\n.fa-centercode {\n --fa: "\\f380";\n}\n\n.fa-cloudscale {\n --fa: "\\f383";\n}\n\n.fa-cloudsmith {\n --fa: "\\f384";\n}\n\n.fa-cloudversify {\n --fa: "\\f385";\n}\n\n.fa-cpanel {\n --fa: "\\f388";\n}\n\n.fa-css3-alt {\n --fa: "\\f38b";\n}\n\n.fa-cuttlefish {\n --fa: "\\f38c";\n}\n\n.fa-d-and-d {\n --fa: "\\f38d";\n}\n\n.fa-deploydog {\n --fa: "\\f38e";\n}\n\n.fa-deskpro {\n --fa: "\\f38f";\n}\n\n.fa-digital-ocean {\n --fa: "\\f391";\n}\n\n.fa-discord {\n --fa: "\\f392";\n}\n\n.fa-discourse {\n --fa: "\\f393";\n}\n\n.fa-dochub {\n --fa: "\\f394";\n}\n\n.fa-docker {\n --fa: "\\f395";\n}\n\n.fa-draft2digital {\n --fa: "\\f396";\n}\n\n.fa-square-dribbble {\n --fa: "\\f397";\n}\n\n.fa-dribbble-square {\n --fa: "\\f397";\n}\n\n.fa-dyalog {\n --fa: "\\f399";\n}\n\n.fa-earlybirds {\n --fa: "\\f39a";\n}\n\n.fa-erlang {\n --fa: "\\f39d";\n}\n\n.fa-facebook-f {\n --fa: "\\f39e";\n}\n\n.fa-facebook-messenger {\n --fa: "\\f39f";\n}\n\n.fa-firstdraft {\n --fa: "\\f3a1";\n}\n\n.fa-fonticons-fi {\n --fa: "\\f3a2";\n}\n\n.fa-fort-awesome-alt {\n --fa: "\\f3a3";\n}\n\n.fa-freebsd {\n --fa: "\\f3a4";\n}\n\n.fa-gitkraken {\n --fa: "\\f3a6";\n}\n\n.fa-gofore {\n --fa: "\\f3a7";\n}\n\n.fa-goodreads {\n --fa: "\\f3a8";\n}\n\n.fa-goodreads-g {\n --fa: "\\f3a9";\n}\n\n.fa-google-drive {\n --fa: "\\f3aa";\n}\n\n.fa-google-play {\n --fa: "\\f3ab";\n}\n\n.fa-gripfire {\n --fa: "\\f3ac";\n}\n\n.fa-grunt {\n --fa: "\\f3ad";\n}\n\n.fa-gulp {\n --fa: "\\f3ae";\n}\n\n.fa-square-hacker-news {\n --fa: "\\f3af";\n}\n\n.fa-hacker-news-square {\n --fa: "\\f3af";\n}\n\n.fa-hire-a-helper {\n --fa: "\\f3b0";\n}\n\n.fa-hotjar {\n --fa: "\\f3b1";\n}\n\n.fa-hubspot {\n --fa: "\\f3b2";\n}\n\n.fa-itunes {\n --fa: "\\f3b4";\n}\n\n.fa-itunes-note {\n --fa: "\\f3b5";\n}\n\n.fa-jenkins {\n --fa: "\\f3b6";\n}\n\n.fa-joget {\n --fa: "\\f3b7";\n}\n\n.fa-js {\n --fa: "\\f3b8";\n}\n\n.fa-square-js {\n --fa: "\\f3b9";\n}\n\n.fa-js-square {\n --fa: "\\f3b9";\n}\n\n.fa-keycdn {\n --fa: "\\f3ba";\n}\n\n.fa-kickstarter {\n --fa: "\\f3bb";\n}\n\n.fa-square-kickstarter {\n --fa: "\\f3bb";\n}\n\n.fa-kickstarter-k {\n --fa: "\\f3bc";\n}\n\n.fa-laravel {\n --fa: "\\f3bd";\n}\n\n.fa-line {\n --fa: "\\f3c0";\n}\n\n.fa-lyft {\n --fa: "\\f3c3";\n}\n\n.fa-magento {\n --fa: "\\f3c4";\n}\n\n.fa-medapps {\n --fa: "\\f3c6";\n}\n\n.fa-medrt {\n --fa: "\\f3c8";\n}\n\n.fa-microsoft {\n --fa: "\\f3ca";\n}\n\n.fa-mix {\n --fa: "\\f3cb";\n}\n\n.fa-mizuni {\n --fa: "\\f3cc";\n}\n\n.fa-monero {\n --fa: "\\f3d0";\n}\n\n.fa-napster {\n --fa: "\\f3d2";\n}\n\n.fa-node-js {\n --fa: "\\f3d3";\n}\n\n.fa-npm {\n --fa: "\\f3d4";\n}\n\n.fa-ns8 {\n --fa: "\\f3d5";\n}\n\n.fa-nutritionix {\n --fa: "\\f3d6";\n}\n\n.fa-page4 {\n --fa: "\\f3d7";\n}\n\n.fa-palfed {\n --fa: "\\f3d8";\n}\n\n.fa-patreon {\n --fa: "\\f3d9";\n}\n\n.fa-periscope {\n --fa: "\\f3da";\n}\n\n.fa-phabricator {\n --fa: "\\f3db";\n}\n\n.fa-phoenix-framework {\n --fa: "\\f3dc";\n}\n\n.fa-playstation {\n --fa: "\\f3df";\n}\n\n.fa-pushed {\n --fa: "\\f3e1";\n}\n\n.fa-python {\n --fa: "\\f3e2";\n}\n\n.fa-red-river {\n --fa: "\\f3e3";\n}\n\n.fa-wpressr {\n --fa: "\\f3e4";\n}\n\n.fa-rendact {\n --fa: "\\f3e4";\n}\n\n.fa-replyd {\n --fa: "\\f3e6";\n}\n\n.fa-resolving {\n --fa: "\\f3e7";\n}\n\n.fa-rocketchat {\n --fa: "\\f3e8";\n}\n\n.fa-rockrms {\n --fa: "\\f3e9";\n}\n\n.fa-schlix {\n --fa: "\\f3ea";\n}\n\n.fa-searchengin {\n --fa: "\\f3eb";\n}\n\n.fa-servicestack {\n --fa: "\\f3ec";\n}\n\n.fa-sistrix {\n --fa: "\\f3ee";\n}\n\n.fa-speakap {\n --fa: "\\f3f3";\n}\n\n.fa-staylinked {\n --fa: "\\f3f5";\n}\n\n.fa-steam-symbol {\n --fa: "\\f3f6";\n}\n\n.fa-sticker-mule {\n --fa: "\\f3f7";\n}\n\n.fa-studiovinari {\n --fa: "\\f3f8";\n}\n\n.fa-supple {\n --fa: "\\f3f9";\n}\n\n.fa-uber {\n --fa: "\\f402";\n}\n\n.fa-uikit {\n --fa: "\\f403";\n}\n\n.fa-uniregistry {\n --fa: "\\f404";\n}\n\n.fa-untappd {\n --fa: "\\f405";\n}\n\n.fa-ussunnah {\n --fa: "\\f407";\n}\n\n.fa-vaadin {\n --fa: "\\f408";\n}\n\n.fa-viber {\n --fa: "\\f409";\n}\n\n.fa-vimeo {\n --fa: "\\f40a";\n}\n\n.fa-vnv {\n --fa: "\\f40b";\n}\n\n.fa-square-whatsapp {\n --fa: "\\f40c";\n}\n\n.fa-whatsapp-square {\n --fa: "\\f40c";\n}\n\n.fa-whmcs {\n --fa: "\\f40d";\n}\n\n.fa-wordpress-simple {\n --fa: "\\f411";\n}\n\n.fa-xbox {\n --fa: "\\f412";\n}\n\n.fa-yandex {\n --fa: "\\f413";\n}\n\n.fa-yandex-international {\n --fa: "\\f414";\n}\n\n.fa-apple-pay {\n --fa: "\\f415";\n}\n\n.fa-cc-apple-pay {\n --fa: "\\f416";\n}\n\n.fa-fly {\n --fa: "\\f417";\n}\n\n.fa-node {\n --fa: "\\f419";\n}\n\n.fa-osi {\n --fa: "\\f41a";\n}\n\n.fa-react {\n --fa: "\\f41b";\n}\n\n.fa-autoprefixer {\n --fa: "\\f41c";\n}\n\n.fa-less {\n --fa: "\\f41d";\n}\n\n.fa-sass {\n --fa: "\\f41e";\n}\n\n.fa-vuejs {\n --fa: "\\f41f";\n}\n\n.fa-angular {\n --fa: "\\f420";\n}\n\n.fa-aviato {\n --fa: "\\f421";\n}\n\n.fa-ember {\n --fa: "\\f423";\n}\n\n.fa-gitter {\n --fa: "\\f426";\n}\n\n.fa-hooli {\n --fa: "\\f427";\n}\n\n.fa-strava {\n --fa: "\\f428";\n}\n\n.fa-stripe {\n --fa: "\\f429";\n}\n\n.fa-stripe-s {\n --fa: "\\f42a";\n}\n\n.fa-typo3 {\n --fa: "\\f42b";\n}\n\n.fa-amazon-pay {\n --fa: "\\f42c";\n}\n\n.fa-cc-amazon-pay {\n --fa: "\\f42d";\n}\n\n.fa-ethereum {\n --fa: "\\f42e";\n}\n\n.fa-korvue {\n --fa: "\\f42f";\n}\n\n.fa-elementor {\n --fa: "\\f430";\n}\n\n.fa-square-youtube {\n --fa: "\\f431";\n}\n\n.fa-youtube-square {\n --fa: "\\f431";\n}\n\n.fa-flipboard {\n --fa: "\\f44d";\n}\n\n.fa-hips {\n --fa: "\\f452";\n}\n\n.fa-php {\n --fa: "\\f457";\n}\n\n.fa-quinscape {\n --fa: "\\f459";\n}\n\n.fa-readme {\n --fa: "\\f4d5";\n}\n\n.fa-java {\n --fa: "\\f4e4";\n}\n\n.fa-pied-piper-hat {\n --fa: "\\f4e5";\n}\n\n.fa-creative-commons-by {\n --fa: "\\f4e7";\n}\n\n.fa-creative-commons-nc {\n --fa: "\\f4e8";\n}\n\n.fa-creative-commons-nc-eu {\n --fa: "\\f4e9";\n}\n\n.fa-creative-commons-nc-jp {\n --fa: "\\f4ea";\n}\n\n.fa-creative-commons-nd {\n --fa: "\\f4eb";\n}\n\n.fa-creative-commons-pd {\n --fa: "\\f4ec";\n}\n\n.fa-creative-commons-pd-alt {\n --fa: "\\f4ed";\n}\n\n.fa-creative-commons-remix {\n --fa: "\\f4ee";\n}\n\n.fa-creative-commons-sa {\n --fa: "\\f4ef";\n}\n\n.fa-creative-commons-sampling {\n --fa: "\\f4f0";\n}\n\n.fa-creative-commons-sampling-plus {\n --fa: "\\f4f1";\n}\n\n.fa-creative-commons-share {\n --fa: "\\f4f2";\n}\n\n.fa-creative-commons-zero {\n --fa: "\\f4f3";\n}\n\n.fa-ebay {\n --fa: "\\f4f4";\n}\n\n.fa-keybase {\n --fa: "\\f4f5";\n}\n\n.fa-mastodon {\n --fa: "\\f4f6";\n}\n\n.fa-r-project {\n --fa: "\\f4f7";\n}\n\n.fa-researchgate {\n --fa: "\\f4f8";\n}\n\n.fa-teamspeak {\n --fa: "\\f4f9";\n}\n\n.fa-first-order-alt {\n --fa: "\\f50a";\n}\n\n.fa-fulcrum {\n --fa: "\\f50b";\n}\n\n.fa-galactic-republic {\n --fa: "\\f50c";\n}\n\n.fa-galactic-senate {\n --fa: "\\f50d";\n}\n\n.fa-jedi-order {\n --fa: "\\f50e";\n}\n\n.fa-mandalorian {\n --fa: "\\f50f";\n}\n\n.fa-old-republic {\n --fa: "\\f510";\n}\n\n.fa-phoenix-squadron {\n --fa: "\\f511";\n}\n\n.fa-sith {\n --fa: "\\f512";\n}\n\n.fa-trade-federation {\n --fa: "\\f513";\n}\n\n.fa-wolf-pack-battalion {\n --fa: "\\f514";\n}\n\n.fa-hornbill {\n --fa: "\\f592";\n}\n\n.fa-mailchimp {\n --fa: "\\f59e";\n}\n\n.fa-megaport {\n --fa: "\\f5a3";\n}\n\n.fa-nimblr {\n --fa: "\\f5a8";\n}\n\n.fa-rev {\n --fa: "\\f5b2";\n}\n\n.fa-shopware {\n --fa: "\\f5b5";\n}\n\n.fa-squarespace {\n --fa: "\\f5be";\n}\n\n.fa-themeco {\n --fa: "\\f5c6";\n}\n\n.fa-weebly {\n --fa: "\\f5cc";\n}\n\n.fa-wix {\n --fa: "\\f5cf";\n}\n\n.fa-ello {\n --fa: "\\f5f1";\n}\n\n.fa-hackerrank {\n --fa: "\\f5f7";\n}\n\n.fa-kaggle {\n --fa: "\\f5fa";\n}\n\n.fa-markdown {\n --fa: "\\f60f";\n}\n\n.fa-neos {\n --fa: "\\f612";\n}\n\n.fa-zhihu {\n --fa: "\\f63f";\n}\n\n.fa-alipay {\n --fa: "\\f642";\n}\n\n.fa-the-red-yeti {\n --fa: "\\f69d";\n}\n\n.fa-critical-role {\n --fa: "\\f6c9";\n}\n\n.fa-d-and-d-beyond {\n --fa: "\\f6ca";\n}\n\n.fa-dev {\n --fa: "\\f6cc";\n}\n\n.fa-fantasy-flight-games {\n --fa: "\\f6dc";\n}\n\n.fa-wizards-of-the-coast {\n --fa: "\\f730";\n}\n\n.fa-think-peaks {\n --fa: "\\f731";\n}\n\n.fa-reacteurope {\n --fa: "\\f75d";\n}\n\n.fa-artstation {\n --fa: "\\f77a";\n}\n\n.fa-atlassian {\n --fa: "\\f77b";\n}\n\n.fa-canadian-maple-leaf {\n --fa: "\\f785";\n}\n\n.fa-centos {\n --fa: "\\f789";\n}\n\n.fa-confluence {\n --fa: "\\f78d";\n}\n\n.fa-dhl {\n --fa: "\\f790";\n}\n\n.fa-diaspora {\n --fa: "\\f791";\n}\n\n.fa-fedex {\n --fa: "\\f797";\n}\n\n.fa-fedora {\n --fa: "\\f798";\n}\n\n.fa-figma {\n --fa: "\\f799";\n}\n\n.fa-intercom {\n --fa: "\\f7af";\n}\n\n.fa-invision {\n --fa: "\\f7b0";\n}\n\n.fa-jira {\n --fa: "\\f7b1";\n}\n\n.fa-mendeley {\n --fa: "\\f7b3";\n}\n\n.fa-raspberry-pi {\n --fa: "\\f7bb";\n}\n\n.fa-redhat {\n --fa: "\\f7bc";\n}\n\n.fa-sketch {\n --fa: "\\f7c6";\n}\n\n.fa-sourcetree {\n --fa: "\\f7d3";\n}\n\n.fa-suse {\n --fa: "\\f7d6";\n}\n\n.fa-ubuntu {\n --fa: "\\f7df";\n}\n\n.fa-ups {\n --fa: "\\f7e0";\n}\n\n.fa-usps {\n --fa: "\\f7e1";\n}\n\n.fa-yarn {\n --fa: "\\f7e3";\n}\n\n.fa-airbnb {\n --fa: "\\f834";\n}\n\n.fa-battle-net {\n --fa: "\\f835";\n}\n\n.fa-bootstrap {\n --fa: "\\f836";\n}\n\n.fa-buffer {\n --fa: "\\f837";\n}\n\n.fa-chromecast {\n --fa: "\\f838";\n}\n\n.fa-evernote {\n --fa: "\\f839";\n}\n\n.fa-itch-io {\n --fa: "\\f83a";\n}\n\n.fa-salesforce {\n --fa: "\\f83b";\n}\n\n.fa-speaker-deck {\n --fa: "\\f83c";\n}\n\n.fa-symfony {\n --fa: "\\f83d";\n}\n\n.fa-waze {\n --fa: "\\f83f";\n}\n\n.fa-yammer {\n --fa: "\\f840";\n}\n\n.fa-git-alt {\n --fa: "\\f841";\n}\n\n.fa-stackpath {\n --fa: "\\f842";\n}\n\n.fa-cotton-bureau {\n --fa: "\\f89e";\n}\n\n.fa-buy-n-large {\n --fa: "\\f8a6";\n}\n\n.fa-mdb {\n --fa: "\\f8ca";\n}\n\n.fa-orcid {\n --fa: "\\f8d2";\n}\n\n.fa-swift {\n --fa: "\\f8e1";\n}\n\n.fa-umbraco {\n --fa: "\\f8e8";\n}:root, :host {\n --fa-family-classic: 'Font Awesome 7 Free';\n --fa-font-regular: normal 400 1em/1 var(--fa-family-classic);\n /* deprecated: this older custom property will be removed next major release */\n --fa-style-family-classic: var(--fa-family-classic);\n}\n\n@font-face {\n font-family: "Font Awesome 7 Free";\n font-style: normal;\n font-weight: 400;\n font-display: block;\n src: url(${m});\n}\n.far {\n --fa-family: var(--fa-family-classic);\n --fa-style: 400;\n}\n\n.fa-classic {\n --fa-family: var(--fa-family-classic);\n}\n\n.fa-regular {\n --fa-style: 400;\n}:root, :host {\n --fa-family-classic: 'Font Awesome 7 Free';\n --fa-font-solid: normal 900 1em/1 var(--fa-family-classic);\n /* deprecated: this older custom property will be removed next major release */\n --fa-style-family-classic: var(--fa-family-classic);\n}\n\n@font-face {\n font-family: "Font Awesome 7 Free";\n font-style: normal;\n font-weight: 900;\n font-display: block;\n src: url(${u});\n}\n.fas {\n --fa-family: var(--fa-family-classic);\n --fa-style: 900;\n}\n\n.fa-classic {\n --fa-family: var(--fa-family-classic);\n}\n\n.fa-solid {\n --fa-style: 900;\n}@font-face {\n font-family: "Font Awesome 5 Brands";\n font-display: block;\n font-weight: 400;\n src: url(${d}) format("woff2");\n}\n@font-face {\n font-family: "Font Awesome 5 Free";\n font-display: block;\n font-weight: 900;\n src: url(${u}) format("woff2");\n}\n@font-face {\n font-family: "Font Awesome 5 Free";\n font-display: block;\n font-weight: 400;\n src: url(${m}) format("woff2");\n}@font-face {\n font-family: "FontAwesome";\n font-display: block;\n src: url(${u}) format("woff2");\n}\n@font-face {\n font-family: "FontAwesome";\n font-display: block;\n src: url(${d}) format("woff2");\n}\n@font-face {\n font-family: "FontAwesome";\n font-display: block;\n src: url(${m}) format("woff2");\n unicode-range: U+F003, U+F006, U+F014, U+F016-F017, U+F01A-F01B, U+F01D, U+F022, U+F03E, U+F044, U+F046, U+F05C-F05D, U+F06E, U+F070, U+F087-F088, U+F08A, U+F094, U+F096-F097, U+F09D, U+F0A0, U+F0A2, U+F0A4-F0A7, U+F0C5, U+F0C7, U+F0E5-F0E6, U+F0EB, U+F0F6-F0F8, U+F10C, U+F114-F115, U+F118-F11A, U+F11C-F11D, U+F133, U+F147, U+F14E, U+F150-F152, U+F185-F186, U+F18E, U+F190-F192, U+F196, U+F1C1-F1C9, U+F1D9, U+F1DB, U+F1E3, U+F1EA, U+F1F7, U+F1F9, U+F20A, U+F247-F248, U+F24A, U+F24D, U+F255-F25B, U+F25D, U+F271-F274, U+F278, U+F27B, U+F28C, U+F28E, U+F29C, U+F2B5, U+F2B7, U+F2BA, U+F2BC, U+F2BE, U+F2C0-F2C1, U+F2C3, U+F2D0, U+F2D2, U+F2D4, U+F2DC;\n}\n@font-face {\n font-family: "FontAwesome";\n font-display: block;\n src: url(${b}) format("woff2");\n unicode-range: U+F041, U+F047, U+F065-F066, U+F07D-F07E, U+F080, U+F08B, U+F08E, U+F090, U+F09A, U+F0AC, U+F0AE, U+F0B2, U+F0D0, U+F0D6, U+F0E4, U+F0EC, U+F10A-F10B, U+F123, U+F13E, U+F148-F149, U+F14C, U+F156, U+F15E, U+F160-F161, U+F163, U+F175-F178, U+F195, U+F1F8, U+F219, U+F27A;\n}`,"",{version:3,sources:["webpack://./node_modules/.pnpm/@fortawesome+fontawesome-free@7.3.1/node_modules/@fortawesome/fontawesome-free/css/all.css"],names:[],mappings:"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D;EACzD;EACA;IACE,UAAU;IACV,mBAAmB;EACrB;AACF;AACA;EACE;IACE,yCAAyC;IACzC,mBAAmB;IACnB,uDAAuD;EACzD;EACA;IACE,qDAAqD;IACrD,iDAAiD;IACjD,uDAAuD;EACzD;EACA;IACE,UAAU;IACV,iDAAiD;IACjD,uDAAuD;EACzD;EACA;IACE,qDAAqD;IACrD,iDAAiD;IACjD,uDAAuD;EACzD;EACA;IACE,yCAAyC;IACzC,mBAAmB;EACrB;AACF;AACA;EACE;IACE,kHAAkH;IAClH,uDAAuD;EACzD;EACA;IACE,wJAAwJ;IACxJ,4DAA4D;EAC9D;EACA;IACE,uJAAuJ;IACvJ,iCAAiC;EACnC;EACA;IACE,uJAAuJ;IACvJ,4DAA4D;EAC9D;EACA;IACE,kLAAkL;IAClL,yDAAyD;EAC3D;EACA;IACE,2IAA2I;EAC7I;AACF;AACA;EACE;IACE,kHAAkH;IAClH,uDAAuD;EACzD;EACA;IACE,wJAAwJ;IACxJ,4DAA4D;EAC9D;EACA;IACE,uJAAuJ;IACvJ,4DAA4D;EAC9D;EACA;IACE,kLAAkL;IAClL,yDAAyD;EAC3D;EACA;IACE,2IAA2I;EAC7I;AACF;AACA;EACE;IACE,uBAAuB;IACvB,uDAAuD;EACzD;EACA;IACE,wCAAwC;IACxC,uDAAuD;EACzD;EACA;IACE,0CAA0C;IAC1C,uDAAuD;EACzD;EACA;IACE,wCAAwC;IACxC,uDAAuD;EACzD;EACA;IACE,wBAAwB;IACxB,uDAAuD;EACzD;EACA;IACE,uBAAuB;IACvB,uDAAuD;EACzD;EACA;IACE,wBAAwB;IACxB,uDAAuD;EACzD;EACA;IACE,uBAAuB;IACvB,uDAAuD;EACzD;EACA;IACE,uBAAuB;EACzB;AACF;AACA;EACE;IACE,uBAAuB;EACzB;EACA;IACE,yBAAyB;EAC3B;AACF;AACA;EACE;IACE,uBAAuB;IACvB,qDAAqD;EACvD;EACA;IACE,wBAAwB;IACxB,qDAAqD;EACvD;EACA;IACE,wBAAwB;IACxB,qDAAqD;EACvD;EACA;IACE,yBAAyB;IACzB,qDAAqD;EACvD;EACA;IACE,yBAAyB;IACzB,qDAAqD;EACvD;EACA;IACE,yBAAyB;IACzB,qDAAqD;EACvD;EACA;IACE,yBAAyB;IACzB,qDAAqD;EACvD;EACA;IACE,yBAAyB;IACzB,qDAAqD;EACvD;EACA;IACE,yBAAyB;IACzB,qDAAqD;EACvD;EACA;IACE,yBAAyB;IACzB,qDAAqD;EACvD;EACA;IACE,yBAAyB;IACzB,qDAAqD;EACvD;EACA;IACE,yBAAyB;IACzB,qDAAqD;EACvD;EACA;IACE,yBAAyB;EAC3B;AACF;AACA;EACE;IACE,uBAAuB;IACvB,qDAAqD;EACvD;EACA;IACE,wBAAwB;IACxB,qDAAqD;EACvD;EACA;IACE,wBAAwB;IACxB,qDAAqD;EACvD;EACA;IACE,yBAAyB;IACzB,qDAAqD;EACvD;EACA;IACE,yBAAyB;IACzB,qDAAqD;EACvD;EACA;IACE,yBAAyB;IACzB,qDAAqD;EACvD;EACA;IACE,yBAAyB;IACzB,qDAAqD;EACvD;EACA;IACE,yBAAyB;IACzB,qDAAqD;EACvD;EACA;IACE,yBAAyB;EAC3B;AACF;AACA;EACE;IACE,uBAAuB;IACvB,qDAAqD;EACvD;EACA;IACE,wBAAwB;IACxB,qDAAqD;EACvD;EACA;IACE,wBAAwB;IACxB,qDAAqD;EACvD;EACA;IACE,wBAAwB;IACxB,qDAAqD;EACvD;EACA;IACE,wBAAwB;IACxB,qDAAqD;EACvD;EACA;IACE,yBAAyB;IACzB,qDAAqD;EACvD;EACA;IACE,yBAAyB;IACzB,qDAAqD;EACvD;EACA;IACE,yBAAyB;IACzB,qDAAqD;EACvD;EACA;IACE,yBAAyB;IACzB,qDAAqD;EACvD;EACA;IACE,yBAAyB;IACzB,qDAAqD;EACvD;EACA;IACE,yBAAyB;IACzB,qDAAqD;EACvD;EACA;IACE,yBAAyB;IACzB,qDAAqD;EACvD;EACA;IACE,yBAAyB;IACzB,qDAAqD;EACvD;EACA;IACE,yBAAyB;IACzB,qDAAqD;EACvD;EACA;IACE,yBAAyB;IACzB,qDAAqD;EACvD;EACA;IACE,yBAAyB;IACzB,qDAAqD;EACvD;EACA;IACE,yBAAyB;EAC3B;AACF;AACA;EACE;IACE,qCAAqC;IACrC,uDAAuD;EACzD;EACA;IACE,kEAAkE;EACpE;EACA;IACE,8EAA8E;EAChF;EACA;IACE,kEAAkE;EACpE;EACA;IACE,8EAA8E;EAChF;EACA;IACE,8EAA8E;EAChF;EACA;IACE,oFAAoF;EACtF;EACA;IACE,8EAA8E;EAChF;EACA;IACE,qCAAqC;EACvC;EACA;IACE,qCAAqC;EACvC;AACF;AACA;EACE;IACE,uBAAuB;IACvB,uDAAuD;EACzD;EACA;IACE,6CAA6C;IAC7C,uDAAuD;EACzD;EACA;IACE,uBAAuB;IACvB,uDAAuD;EACzD;EACA;IACE,0DAA0D;IAC1D,uDAAuD;EACzD;EACA;IACE,uBAAuB;IACvB,uDAAuD;EACzD;EACA;IACE,yDAAyD;IACzD,uDAAuD;EACzD;EACA;IACE,uBAAuB;EACzB;EACA;IACE,uBAAuB;EACzB;AACF;AACA;EACE;IACE,yHAAyH;IACzH,4DAA4D;EAC9D;EACA;IACE,qJAAqJ;IACrJ,4DAA4D;EAC9D;EACA;IACE,gKAAgK;IAChK,uDAAuD;EACzD;EACA;IACE,uLAAuL;IACvL,4DAA4D;EAC9D;EACA;IACE,2KAA2K;IAC3K,4DAA4D;EAC9D;EACA;IACE,gKAAgK;IAChK,yDAAyD;EAC3D;EACA;IACE,yHAAyH;EAC3H;AACF;AACA;EACE;IACE,uBAAuB;IACvB,uDAAuD;EACzD;EACA;IACE,+CAA+C;IAC/C,uDAAuD;EACzD;EACA;IACE,iEAAiE;IACjE,uDAAuD;EACzD;EACA;IACE,4DAA4D;IAC5D,yDAAyD;EAC3D;EACA;IACE,iEAAiE;IACjE,uDAAuD;EACzD;EACA;IACE,4DAA4D;IAC5D,uDAAuD;EACzD;EACA;IACE,gEAAgE;IAChE,uDAAuD;EACzD;EACA;IACE,uBAAuB;EACzB;EACA;IACE,uBAAuB;EACzB;AACF;AACA;EACE;IACE,sBAAsB;IACtB,uDAAuD;EACzD;EACA;IACE,wFAAwF;IACxF,uDAAuD;EACzD;EACA;IACE,wFAAwF;IACxF,uDAAuD;EACzD;EACA;IACE,gIAAgI;IAChI,uDAAuD;EACzD;EACA;IACE,gIAAgI;IAChI,uDAAuD;EACzD;EACA;IACE,4BAA4B;IAC5B,uDAAuD;EACzD;EACA;IACE,sBAAsB;EACxB;EACA;IACE,sBAAsB;EACxB;AACF;AACA;EACE,wBAAwB;AAC1B;;AAEA;EACE,yBAAyB;AAC3B;;AAEA;EACE,yBAAyB;AAC3B;;AAEA;EACE,uBAAuB;AACzB;;AAEA;EACE,uBAAuB;AACzB;;AAEA;;EAEE,wBAAwB;AAC1B;;AAEA;EACE,4CAA4C;AAC9C;;AAEA;EACE,qBAAqB;EACrB,WAAW;EACX,gBAAgB;EAChB,kBAAkB;EAClB,sBAAsB;EACtB,YAAY;AACd;;AAEA;;EAEE,gBAAgB;EAChB,QAAQ;EACR,kBAAkB;EAClB,kBAAkB;EAClB,sBAAsB;EACtB,sCAAsC;AACxC;;AAEA;EACE,oBAAoB;AACtB;;AAEA;EACE,cAAc;AAChB;;AAEA;EACE,8BAA8B;AAChC;;AAEA;mEACmE;;AAEnE;EACE,YAAY;AACd;;AAEA;EACE,YAAY;AACd;;AAEA;EACE,YAAY;AACd;;AAEA;EACE,YAAY;AACd;;AAEA;EACE,YAAY;AACd;;AAEA;EACE,YAAY;AACd;;AAEA;EACE,YAAY;AACd;;AAEA;EACE,YAAY;AACd;;AAEA;EACE,YAAY;AACd;;AAEA;EACE,YAAY;AACd;;AAEA;EACE,UAAU;AACZ;;AAEA;EACE,UAAU;AACZ;;AAEA;EACE,UAAU;AACZ;;AAEA;EACE,UAAU;AACZ;;AAEA;EACE,UAAU;AACZ;;AAEA;EACE,UAAU;AACZ;;AAEA;EACE,UAAU;AACZ;;AAEA;EACE,UAAU;AACZ;;AAEA;EACE,UAAU;AACZ;;AAEA;EACE,UAAU;AACZ;;AAEA;EACE,UAAU;AACZ;;AAEA;EACE,UAAU;AACZ;;AAEA;EACE,UAAU;AACZ;;AAEA;EACE,UAAU;AACZ;;AAEA;EACE,UAAU;AACZ;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;AACA;EACE,2CAA2C;EAC3C,0DAA0D;AAC5D;;AAEA;EACE,oCAAoC;EACpC,kBAAkB;EAClB,gBAAgB;EAChB,mBAAmB;EACnB,4CAA2C;AAC7C;AACA;;;EAGE,oCAAoC;EACpC,eAAe;AACjB;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf,CAAC;EACC,0CAA0C;EAC1C,4DAA4D;EAC5D,8EAA8E;EAC9E,mDAAmD;AACrD;;AAEA;EACE,kCAAkC;EAClC,kBAAkB;EAClB,gBAAgB;EAChB,mBAAmB;EACnB,4CAA4C;AAC9C;AACA;EACE,qCAAqC;EACrC,eAAe;AACjB;;AAEA;EACE,qCAAqC;AACvC;;AAEA;EACE,eAAe;AACjB,CAAC;EACC,0CAA0C;EAC1C,0DAA0D;EAC1D,8EAA8E;EAC9E,mDAAmD;AACrD;;AAEA;EACE,kCAAkC;EAClC,kBAAkB;EAClB,gBAAgB;EAChB,mBAAmB;EACnB,4CAA0C;AAC5C;AACA;EACE,qCAAqC;EACrC,eAAe;AACjB;;AAEA;EACE,qCAAqC;AACvC;;AAEA;EACE,eAAe;AACjB,CAAC;EACC,oCAAoC;EACpC,mBAAmB;EACnB,gBAAgB;EAChB,4DAA2D;AAC7D;AACA;EACE,kCAAkC;EAClC,mBAAmB;EACnB,gBAAgB;EAChB,4DAA0D;AAC5D;AACA;EACE,kCAAkC;EAClC,mBAAmB;EACnB,gBAAgB;EAChB,4DAA4D;AAC9D,CAAC;EACC,0BAA0B;EAC1B,mBAAmB;EACnB,4DAA0D;AAC5D;AACA;EACE,0BAA0B;EAC1B,mBAAmB;EACnB,4DAA2D;AAC7D;AACA;EACE,0BAA0B;EAC1B,mBAAmB;EACnB,4DAA4D;EAC5D,4oBAA4oB;AAC9oB;AACA;EACE,0BAA0B;EAC1B,mBAAmB;EACnB,4DAAgE;EAChE,2RAA2R;AAC7R",sourcesContent:['/*!\n * Font Awesome Free 7.3.1 by @fontawesome - https://fontawesome.com\n * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)\n * Copyright 2026 Fonticons, Inc.\n */\n.fa-solid,\n.fa-regular,\n.fa-brands,\n.fa-classic,\n.fas,\n.far,\n.fab,\n.fa {\n --_fa-family: var(--fa-family, var(--fa-style-family, \'Font Awesome 7 Free\'));\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n display: var(--fa-display, inline-block);\n font-family: var(--_fa-family);\n font-feature-settings: normal;\n font-style: normal;\n font-synthesis: none;\n font-variant: normal;\n font-weight: var(--fa-style, 900);\n line-height: 1;\n text-align: center;\n text-rendering: auto;\n width: var(--fa-width, 1.25em);\n}\n\n:is(.fas,\n.far,\n.fab,\n.fa-solid,\n.fa-regular,\n.fa-brands,\n.fa-classic,\n.fa)::before {\n content: var(--fa)/"";\n}\n\n@supports not (content: ""/"") {\n :is(.fas,\n .far,\n .fab,\n .fa-solid,\n .fa-regular,\n .fa-brands,\n .fa-classic,\n .fa)::before {\n content: var(--fa);\n }\n}\n.fa-1x {\n font-size: 1em;\n}\n\n.fa-2x {\n font-size: 2em;\n}\n\n.fa-3x {\n font-size: 3em;\n}\n\n.fa-4x {\n font-size: 4em;\n}\n\n.fa-5x {\n font-size: 5em;\n}\n\n.fa-6x {\n font-size: 6em;\n}\n\n.fa-7x {\n font-size: 7em;\n}\n\n.fa-8x {\n font-size: 8em;\n}\n\n.fa-9x {\n font-size: 9em;\n}\n\n.fa-10x {\n font-size: 10em;\n}\n\n.fa-2xs {\n font-size: calc(10 / 16 * 1em); /* converts a 10px size into an em-based value that\'s relative to the scale\'s 16px base */\n line-height: calc(1 / 10 * 1em); /* sets the line-height of the icon back to that of it\'s parent */\n vertical-align: calc((6 / 10 - 0.375) * 1em); /* vertically centers the icon taking into account the surrounding text\'s descender */\n}\n\n.fa-xs {\n font-size: calc(12 / 16 * 1em); /* converts a 12px size into an em-based value that\'s relative to the scale\'s 16px base */\n line-height: calc(1 / 12 * 1em); /* sets the line-height of the icon back to that of it\'s parent */\n vertical-align: calc((6 / 12 - 0.375) * 1em); /* vertically centers the icon taking into account the surrounding text\'s descender */\n}\n\n.fa-sm {\n font-size: calc(14 / 16 * 1em); /* converts a 14px size into an em-based value that\'s relative to the scale\'s 16px base */\n line-height: calc(1 / 14 * 1em); /* sets the line-height of the icon back to that of it\'s parent */\n vertical-align: calc((6 / 14 - 0.375) * 1em); /* vertically centers the icon taking into account the surrounding text\'s descender */\n}\n\n.fa-lg {\n font-size: calc(20 / 16 * 1em); /* converts a 20px size into an em-based value that\'s relative to the scale\'s 16px base */\n line-height: calc(1 / 20 * 1em); /* sets the line-height of the icon back to that of it\'s parent */\n vertical-align: calc((6 / 20 - 0.375) * 1em); /* vertically centers the icon taking into account the surrounding text\'s descender */\n}\n\n.fa-xl {\n font-size: calc(24 / 16 * 1em); /* converts a 24px size into an em-based value that\'s relative to the scale\'s 16px base */\n line-height: calc(1 / 24 * 1em); /* sets the line-height of the icon back to that of it\'s parent */\n vertical-align: calc((6 / 24 - 0.375) * 1em); /* vertically centers the icon taking into account the surrounding text\'s descender */\n}\n\n.fa-2xl {\n font-size: calc(32 / 16 * 1em); /* converts a 32px size into an em-based value that\'s relative to the scale\'s 16px base */\n line-height: calc(1 / 32 * 1em); /* sets the line-height of the icon back to that of it\'s parent */\n vertical-align: calc((6 / 32 - 0.375) * 1em); /* vertically centers the icon taking into account the surrounding text\'s descender */\n}\n\n.fa-width-auto {\n --fa-width: auto;\n}\n\n.fa-fw,\n.fa-width-fixed {\n --fa-width: 1.25em;\n}\n\n.fa-canvas-square {\n padding-block: 0.125em;\n margin-block-end: -0.125em;\n}\n\n.fa-canvas-roomy {\n padding-block: 0.25em;\n padding-inline: 0.125em;\n margin-block-end: -0.25em;\n box-sizing: content-box;\n}\n\n.fa-ul {\n list-style-type: none;\n margin-inline-start: var(--fa-li-margin, 2.5em);\n padding-inline-start: 0;\n}\n.fa-ul > li {\n position: relative;\n}\n\n.fa-li {\n inset-inline-start: calc(-1 * var(--fa-li-width, 2em));\n position: absolute;\n text-align: center;\n width: var(--fa-li-width, 2em);\n line-height: inherit;\n}\n\n/* Heads Up: Bordered Icons will not be supported in the future!\n - This feature will be deprecated in the next major release of Font Awesome (v8)!\n - You may continue to use it in this version *v7), but it will not be supported in Font Awesome v8.\n*/\n/* Notes:\n* --@{v.$css-prefix}-border-width = 1/16 by default (to render as ~1px based on a 16px default font-size)\n* --@{v.$css-prefix}-border-padding =\n ** 3/16 for vertical padding (to give ~2px of vertical whitespace around an icon considering it\'s vertical alignment)\n ** 4/16 for horizontal padding (to give ~4px of horizontal whitespace around an icon)\n*/\n.fa-border {\n border-color: var(--fa-border-color, #eee);\n border-radius: var(--fa-border-radius, 0.1em);\n border-style: var(--fa-border-style, solid);\n border-width: var(--fa-border-width, 0.0625em);\n box-sizing: var(--fa-border-box-sizing, content-box);\n padding: var(--fa-border-padding, 0.1875em 0.25em);\n}\n\n.fa-pull-left,\n.fa-pull-start {\n float: inline-start;\n margin-inline-end: var(--fa-pull-margin, 0.3em);\n}\n\n.fa-pull-right,\n.fa-pull-end {\n float: inline-end;\n margin-inline-start: var(--fa-pull-margin, 0.3em);\n}\n\n.fa-beat {\n animation-name: fa-beat;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 1s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, ease-in-out);\n}\n\n.fa-bounce {\n animation-name: fa-bounce;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 1s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1));\n}\n\n.fa-fade {\n animation-name: fa-fade;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 1s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, ease-in-out);\n}\n\n.fa-beat-fade {\n animation-name: fa-beat-fade;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 1s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, ease-in-out);\n}\n\n.fa-flip {\n animation-name: fa-flip;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 1.5s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, ease-in-out);\n}\n\n.fa-flip-360 {\n animation-name: fa-flip-360;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 1s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, ease-in-out);\n}\n\n.fa-shake {\n animation-name: fa-shake;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 0.75s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, ease-in-out);\n}\n\n.fa-spin {\n animation-name: fa-spin;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 2s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, linear);\n}\n\n.fa-spin-reverse {\n --fa-animation-direction: reverse;\n}\n\n.fa-pulse,\n.fa-spin-pulse {\n animation-name: fa-spin;\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 1s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, steps(8));\n}\n\n.fa-spin-snap {\n animation-name: fa-spin-snap;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 3s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, linear);\n}\n\n.fa-spin-snap-4 {\n animation-name: fa-spin-snap-4;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 2.4s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, linear);\n}\n\n.fa-spin-snap-8 {\n animation-name: fa-spin-snap-8;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 4s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, linear);\n}\n\n.fa-buzz {\n animation-name: fa-buzz;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 0.6s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, linear);\n}\n\n.fa-wag {\n animation-name: fa-wag;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 0.9s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, ease-out);\n transform-origin: bottom center;\n}\n\n.fa-float {\n animation-name: fa-float;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 3s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, ease-in-out);\n will-change: transform;\n}\n\n.fa-swing {\n animation-name: fa-swing;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 1.2s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, ease-out);\n transform-origin: top center;\n}\n\n.fa-jello {\n animation-name: fa-jello;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 0.9s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, ease-out);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .fa-beat,\n .fa-bounce,\n .fa-fade,\n .fa-beat-fade,\n .fa-flip,\n .fa-flip-360,\n .fa-pulse,\n .fa-shake,\n .fa-spin,\n .fa-spin-pulse,\n .fa-buzz,\n .fa-float,\n .fa-jello,\n .fa-spin-snap,\n .fa-spin-snap-4,\n .fa-spin-snap-8,\n .fa-swing,\n .fa-wag {\n animation: none !important;\n transition: none !important;\n }\n}\n@keyframes fa-beat {\n 0% {\n transform: scale(1);\n }\n 25% {\n transform: scale(calc(1.25 * var(--fa-beat-scale, 1.25)));\n }\n 45% {\n transform: scale(calc(1.22 * var(--fa-beat-scale, 1.22)));\n }\n 65% {\n transform: scale(calc(1.25 * var(--fa-beat-scale, 1.25)));\n }\n 90% {\n transform: scale(1);\n }\n}\n@keyframes fa-bounce {\n 0% {\n transform: scale(1, 1) translateY(0);\n animation-timing-function: var(--fa-animation-timing);\n }\n 14% {\n transform: scale(var(--fa-bounce-start-scale-x, 1.06), var(--fa-bounce-start-scale-y, 0.94)) translateY(var(--fa-bounce-anticipation, 3px));\n animation-timing-function: cubic-bezier(0.33, 0, 0.66, 0.33);\n }\n 32% {\n transform: scale(var(--fa-bounce-jump-scale-x, 0.94), var(--fa-bounce-jump-scale-y, 1.12)) translateY(calc(-1 * var(--fa-bounce-height, 0.5em)));\n animation-timing-function: cubic-bezier(0.33, 0.66, 0.66, 1);\n }\n 52% {\n transform: scale(1, 1) translateY(calc(-1 * var(--fa-bounce-height, 0.5em) * 1.1));\n animation-timing-function: cubic-bezier(0.5, 0, 1, 0.5);\n }\n 70% {\n transform: scale(var(--fa-bounce-land-scale-x, 1.06), var(--fa-bounce-land-scale-y, 0.92)) translateY(0);\n animation-timing-function: cubic-bezier(0.33, 0.33, 0.66, 1);\n }\n 85% {\n transform: scale(0.98, 1.04) translateY(calc(-2px * var(--fa-bounce-rebound, 1)));\n animation-timing-function: cubic-bezier(0.33, 0, 0.66, 1);\n }\n 100% {\n transform: scale(1, 1) translateY(0);\n }\n}\n@keyframes fa-fade {\n 0% {\n opacity: 1;\n transform: scale(1);\n animation-timing-function: cubic-bezier(0.2, 0, 0.4, 1);\n }\n 40% {\n opacity: var(--fa-fade-opacity, 0.4);\n transform: scale(0.98);\n animation-timing-function: cubic-bezier(0.4, 0, 0.6, 1);\n }\n 100% {\n opacity: 1;\n transform: scale(1);\n }\n}\n@keyframes fa-beat-fade {\n 0% {\n opacity: var(--fa-beat-fade-opacity, 0.4);\n transform: scale(1);\n animation-timing-function: cubic-bezier(0.2, 0, 0.4, 1);\n }\n 25% {\n opacity: calc(var(--fa-beat-fade-opacity, 0.4) + 0.4);\n transform: scale(var(--fa-beat-fade-scale, 1.28));\n animation-timing-function: cubic-bezier(0.4, 0, 0.6, 1);\n }\n 45% {\n opacity: 1;\n transform: scale(var(--fa-beat-fade-scale, 1.25));\n animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n }\n 65% {\n opacity: calc(var(--fa-beat-fade-opacity, 0.4) + 0.4);\n transform: scale(var(--fa-beat-fade-scale, 1.28));\n animation-timing-function: cubic-bezier(0.4, 0, 0.6, 1);\n }\n 100% {\n opacity: var(--fa-beat-fade-opacity, 0.4);\n transform: scale(1);\n }\n}\n@keyframes fa-flip {\n 0% {\n transform: perspective(2em) scale(1) rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), 0deg);\n animation-timing-function: cubic-bezier(0.2, 0, 0.4, 1);\n }\n 8% {\n transform: perspective(2em) scale(var(--fa-flip-anticipation-scale, 0.95)) rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), 0deg);\n animation-timing-function: cubic-bezier(0.33, 0, 0.66, 0.33);\n }\n 35% {\n transform: perspective(2em) scale(1) rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), calc(var(--fa-flip-angle, -360deg) * 0.6));\n animation-timing-function: linear;\n }\n 65% {\n transform: perspective(2em) scale(1) rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), calc(var(--fa-flip-angle, -360deg) * 0.5));\n animation-timing-function: cubic-bezier(0.33, 0.66, 0.66, 1);\n }\n 92% {\n transform: perspective(2em) scale(1) rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), calc(var(--fa-flip-angle, -360deg) * var(--fa-flip-overshoot, 1.04)));\n animation-timing-function: cubic-bezier(0.33, 0, 0.66, 1);\n }\n 100% {\n transform: perspective(2em) scale(1) rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -360deg));\n }\n}\n@keyframes fa-flip-360 {\n 0% {\n transform: perspective(2em) scale(1) rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), 0deg);\n animation-timing-function: cubic-bezier(0.2, 0, 0.4, 1);\n }\n 8% {\n transform: perspective(2em) scale(var(--fa-flip-anticipation-scale, 0.95)) rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), 0deg);\n animation-timing-function: cubic-bezier(0.33, 0, 0.66, 0.33);\n }\n 50% {\n transform: perspective(2em) scale(1) rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), calc(var(--fa-flip-angle, -360deg) * 0.6));\n animation-timing-function: cubic-bezier(0.33, 0.66, 0.66, 1);\n }\n 80% {\n transform: perspective(2em) scale(1) rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), calc(var(--fa-flip-angle, -360deg) * var(--fa-flip-overshoot, 1.04)));\n animation-timing-function: cubic-bezier(0.33, 0, 0.66, 1);\n }\n 100% {\n transform: perspective(2em) scale(1) rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -360deg));\n }\n}\n@keyframes fa-shake {\n 0% {\n transform: rotate(0deg);\n animation-timing-function: cubic-bezier(0.2, 0, 0.8, 1);\n }\n 8% {\n transform: rotate(35deg) translateX(1px);\n animation-timing-function: cubic-bezier(0.3, 0, 0.7, 1);\n }\n 20% {\n transform: rotate(-22deg) translateX(-1px);\n animation-timing-function: cubic-bezier(0.3, 0, 0.7, 1);\n }\n 35% {\n transform: rotate(15deg) translateX(1px);\n animation-timing-function: cubic-bezier(0.3, 0, 0.7, 1);\n }\n 50% {\n transform: rotate(-9deg);\n animation-timing-function: cubic-bezier(0.4, 0, 0.6, 1);\n }\n 65% {\n transform: rotate(5deg);\n animation-timing-function: cubic-bezier(0.4, 0, 0.6, 1);\n }\n 78% {\n transform: rotate(-3deg);\n animation-timing-function: cubic-bezier(0.4, 0, 0.6, 1);\n }\n 90% {\n transform: rotate(1deg);\n animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n }\n 100% {\n transform: rotate(0deg);\n }\n}\n@keyframes fa-spin {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n@keyframes fa-spin-snap {\n 0% {\n transform: rotate(0deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 12% {\n transform: rotate(60deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 16.67% {\n transform: rotate(60deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 28.67% {\n transform: rotate(120deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 33.33% {\n transform: rotate(120deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 45.33% {\n transform: rotate(180deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 50% {\n transform: rotate(180deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 62% {\n transform: rotate(240deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 66.67% {\n transform: rotate(240deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 78.67% {\n transform: rotate(300deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 83.33% {\n transform: rotate(300deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 95.33% {\n transform: rotate(360deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n@keyframes fa-spin-snap-4 {\n 0% {\n transform: rotate(0deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 15% {\n transform: rotate(90deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 25% {\n transform: rotate(90deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 40% {\n transform: rotate(180deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 50% {\n transform: rotate(180deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 65% {\n transform: rotate(270deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 75% {\n transform: rotate(270deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 90% {\n transform: rotate(360deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n@keyframes fa-spin-snap-8 {\n 0% {\n transform: rotate(0deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 9% {\n transform: rotate(45deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 12.5% {\n transform: rotate(45deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 21.5% {\n transform: rotate(90deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 25% {\n transform: rotate(90deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 34% {\n transform: rotate(135deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 37.5% {\n transform: rotate(135deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 46.5% {\n transform: rotate(180deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 50% {\n transform: rotate(180deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 59% {\n transform: rotate(225deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 62.5% {\n transform: rotate(225deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 71.5% {\n transform: rotate(270deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 75% {\n transform: rotate(270deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 84% {\n transform: rotate(315deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 87.5% {\n transform: rotate(315deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 96.5% {\n transform: rotate(360deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n@keyframes fa-buzz {\n 0% {\n transform: translateX(0) rotate(0deg);\n animation-timing-function: cubic-bezier(0.1, 0, 0.9, 1);\n }\n 5% {\n transform: translateX(var(--fa-buzz-distance, 4px)) rotate(0.5deg);\n }\n 10% {\n transform: translateX(calc(-1 * var(--fa-buzz-distance, 4px))) rotate(-0.5deg);\n }\n 15% {\n transform: translateX(var(--fa-buzz-distance, 4px)) rotate(0.3deg);\n }\n 20% {\n transform: translateX(calc(-1 * var(--fa-buzz-distance, 4px))) rotate(-0.3deg);\n }\n 25% {\n transform: translateX(calc(var(--fa-buzz-distance, 4px) * 0.7)) rotate(0.2deg);\n }\n 30% {\n transform: translateX(calc(-1 * var(--fa-buzz-distance, 4px) * 0.7)) rotate(-0.2deg);\n }\n 35% {\n transform: translateX(calc(var(--fa-buzz-distance, 4px) * 0.4)) rotate(0.1deg);\n }\n 40% {\n transform: translateX(0) rotate(0deg);\n }\n 100% {\n transform: translateX(0) rotate(0deg);\n }\n}\n@keyframes fa-wag {\n 0% {\n transform: rotate(0deg);\n animation-timing-function: cubic-bezier(0.2, 0, 0.6, 1);\n }\n 12% {\n transform: rotate(var(--fa-wag-angle, 12deg));\n animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n }\n 24% {\n transform: rotate(2deg);\n animation-timing-function: cubic-bezier(0.2, 0, 0.6, 1);\n }\n 36% {\n transform: rotate(calc(var(--fa-wag-angle, 12deg) * 0.85));\n animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n }\n 48% {\n transform: rotate(1deg);\n animation-timing-function: cubic-bezier(0.2, 0, 0.6, 1);\n }\n 58% {\n transform: rotate(calc(var(--fa-wag-angle, 12deg) * 0.6));\n animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n }\n 68% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(0deg);\n }\n}\n@keyframes fa-float {\n 0% {\n transform: translateY(0) translateX(0) rotate(0deg) scale(var(--fa-float-squash-x, 1.02), var(--fa-float-squash-y, 0.98));\n animation-timing-function: cubic-bezier(0.33, 0, 0.66, 0.33);\n }\n 15% {\n transform: translateY(calc(-0.4 * var(--fa-float-height, 6px))) translateX(var(--fa-float-drift, 1px)) rotate(var(--fa-float-tilt, 1deg)) scale(1, 1);\n animation-timing-function: cubic-bezier(0.33, 0.66, 0.66, 1);\n }\n 35% {\n transform: translateY(calc(-1 * var(--fa-float-height, 6px))) translateX(0) rotate(0deg) scale(var(--fa-float-stretch-x, 0.98), var(--fa-float-stretch-y, 1.03));\n animation-timing-function: cubic-bezier(0.5, 0, 0.5, 0);\n }\n 50% {\n transform: translateY(calc(-0.92 * var(--fa-float-height, 6px))) translateX(calc(-0.5 * var(--fa-float-drift, 1px))) rotate(calc(-0.5 * var(--fa-float-tilt, 1deg))) scale(0.995, 1.01);\n animation-timing-function: cubic-bezier(0.33, 0, 0.66, 0.33);\n }\n 70% {\n transform: translateY(calc(-0.3 * var(--fa-float-height, 6px))) translateX(calc(-1 * var(--fa-float-drift, 1px))) rotate(calc(-1 * var(--fa-float-tilt, 1deg))) scale(1, 1);\n animation-timing-function: cubic-bezier(0.33, 0.66, 0.66, 1);\n }\n 90% {\n transform: translateY(calc(0.05 * var(--fa-float-height, 6px))) translateX(0) rotate(0deg) scale(var(--fa-float-squash-x, 1.02), var(--fa-float-squash-y, 0.98));\n animation-timing-function: cubic-bezier(0.33, 0, 0.66, 1);\n }\n 100% {\n transform: translateY(0) translateX(0) rotate(0deg) scale(var(--fa-float-squash-x, 1.02), var(--fa-float-squash-y, 0.98));\n }\n}\n@keyframes fa-swing {\n 0% {\n transform: rotate(0deg);\n animation-timing-function: cubic-bezier(0.2, 0, 0.8, 1);\n }\n 8% {\n transform: rotate(var(--fa-swing-angle, 22deg));\n animation-timing-function: cubic-bezier(0.3, 0, 0.7, 1);\n }\n 18% {\n transform: rotate(calc(-1 * var(--fa-swing-angle, 22deg) * 0.85));\n animation-timing-function: cubic-bezier(0.3, 0, 0.7, 1);\n }\n 28% {\n transform: rotate(calc(var(--fa-swing-angle, 22deg) * 0.65));\n animation-timing-function: cubic-bezier(0.35, 0, 0.65, 1);\n }\n 38% {\n transform: rotate(calc(-1 * var(--fa-swing-angle, 22deg) * 0.45));\n animation-timing-function: cubic-bezier(0.4, 0, 0.6, 1);\n }\n 48% {\n transform: rotate(calc(var(--fa-swing-angle, 22deg) * 0.25));\n animation-timing-function: cubic-bezier(0.4, 0, 0.6, 1);\n }\n 56% {\n transform: rotate(calc(-1 * var(--fa-swing-angle, 22deg) * 0.1));\n animation-timing-function: cubic-bezier(0.4, 0, 0.6, 1);\n }\n 64% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(0deg);\n }\n}\n@keyframes fa-jello {\n 0% {\n transform: scale(1, 1);\n animation-timing-function: cubic-bezier(0.2, 0, 0.8, 1);\n }\n 12% {\n transform: scale(var(--fa-jello-scale-x, 1.15), calc(2 - var(--fa-jello-scale-x, 1.15)));\n animation-timing-function: cubic-bezier(0.3, 0, 0.7, 1);\n }\n 24% {\n transform: scale(calc(2 - var(--fa-jello-scale-y, 1.12)), var(--fa-jello-scale-y, 1.12));\n animation-timing-function: cubic-bezier(0.3, 0, 0.7, 1);\n }\n 36% {\n transform: scale(calc(1 + (var(--fa-jello-scale-x, 1.15) - 1) * 0.5), calc(2 - (1 + (var(--fa-jello-scale-x, 1.15) - 1) * 0.5)));\n animation-timing-function: cubic-bezier(0.4, 0, 0.6, 1);\n }\n 48% {\n transform: scale(calc(2 - (1 + (var(--fa-jello-scale-y, 1.12) - 1) * 0.3)), calc(1 + (var(--fa-jello-scale-y, 1.12) - 1) * 0.3));\n animation-timing-function: cubic-bezier(0.4, 0, 0.6, 1);\n }\n 58% {\n transform: scale(1.02, 0.98);\n animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n }\n 68% {\n transform: scale(1, 1);\n }\n 100% {\n transform: scale(1, 1);\n }\n}\n.fa-rotate-90 {\n transform: rotate(90deg);\n}\n\n.fa-rotate-180 {\n transform: rotate(180deg);\n}\n\n.fa-rotate-270 {\n transform: rotate(270deg);\n}\n\n.fa-flip-horizontal {\n transform: scale(-1, 1);\n}\n\n.fa-flip-vertical {\n transform: scale(1, -1);\n}\n\n.fa-flip-both,\n.fa-flip-horizontal.fa-flip-vertical {\n transform: scale(-1, -1);\n}\n\n.fa-rotate-by {\n transform: rotate(var(--fa-rotate-angle, 0));\n}\n\n.fa-stack {\n display: inline-block;\n height: 2em;\n line-height: 2em;\n position: relative;\n vertical-align: middle;\n width: 2.5em;\n}\n\n.fa-stack-1x,\n.fa-stack-2x {\n --fa-width: 100%;\n inset: 0;\n position: absolute;\n text-align: center;\n width: var(--fa-width);\n z-index: var(--fa-stack-z-index, auto);\n}\n\n.fa-stack-1x {\n line-height: inherit;\n}\n\n.fa-stack-2x {\n font-size: 2em;\n}\n\n.fa-inverse {\n color: var(--fa-inverse, #fff);\n}\n\n/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen\n readers do not read off random characters that represent icons */\n\n.fa-0 {\n --fa: "\\30 ";\n}\n\n.fa-1 {\n --fa: "\\31 ";\n}\n\n.fa-2 {\n --fa: "\\32 ";\n}\n\n.fa-3 {\n --fa: "\\33 ";\n}\n\n.fa-4 {\n --fa: "\\34 ";\n}\n\n.fa-5 {\n --fa: "\\35 ";\n}\n\n.fa-6 {\n --fa: "\\36 ";\n}\n\n.fa-7 {\n --fa: "\\37 ";\n}\n\n.fa-8 {\n --fa: "\\38 ";\n}\n\n.fa-9 {\n --fa: "\\39 ";\n}\n\n.fa-exclamation {\n --fa: "\\!";\n}\n\n.fa-hashtag {\n --fa: "\\#";\n}\n\n.fa-dollar-sign {\n --fa: "\\$";\n}\n\n.fa-dollar {\n --fa: "\\$";\n}\n\n.fa-usd {\n --fa: "\\$";\n}\n\n.fa-percent {\n --fa: "\\%";\n}\n\n.fa-percentage {\n --fa: "\\%";\n}\n\n.fa-asterisk {\n --fa: "\\*";\n}\n\n.fa-plus {\n --fa: "\\+";\n}\n\n.fa-add {\n --fa: "\\+";\n}\n\n.fa-less-than {\n --fa: "\\<";\n}\n\n.fa-equals {\n --fa: "\\=";\n}\n\n.fa-greater-than {\n --fa: "\\>";\n}\n\n.fa-question {\n --fa: "\\?";\n}\n\n.fa-at {\n --fa: "\\@";\n}\n\n.fa-a {\n --fa: "A";\n}\n\n.fa-b {\n --fa: "B";\n}\n\n.fa-c {\n --fa: "C";\n}\n\n.fa-d {\n --fa: "D";\n}\n\n.fa-e {\n --fa: "E";\n}\n\n.fa-f {\n --fa: "F";\n}\n\n.fa-g {\n --fa: "G";\n}\n\n.fa-h {\n --fa: "H";\n}\n\n.fa-i {\n --fa: "I";\n}\n\n.fa-j {\n --fa: "J";\n}\n\n.fa-k {\n --fa: "K";\n}\n\n.fa-l {\n --fa: "L";\n}\n\n.fa-m {\n --fa: "M";\n}\n\n.fa-n {\n --fa: "N";\n}\n\n.fa-o {\n --fa: "O";\n}\n\n.fa-p {\n --fa: "P";\n}\n\n.fa-q {\n --fa: "Q";\n}\n\n.fa-r {\n --fa: "R";\n}\n\n.fa-s {\n --fa: "S";\n}\n\n.fa-t {\n --fa: "T";\n}\n\n.fa-u {\n --fa: "U";\n}\n\n.fa-v {\n --fa: "V";\n}\n\n.fa-w {\n --fa: "W";\n}\n\n.fa-x {\n --fa: "X";\n}\n\n.fa-y {\n --fa: "Y";\n}\n\n.fa-z {\n --fa: "Z";\n}\n\n.fa-faucet {\n --fa: "\\e005";\n}\n\n.fa-faucet-drip {\n --fa: "\\e006";\n}\n\n.fa-house-chimney-window {\n --fa: "\\e00d";\n}\n\n.fa-house-signal {\n --fa: "\\e012";\n}\n\n.fa-temperature-arrow-down {\n --fa: "\\e03f";\n}\n\n.fa-temperature-down {\n --fa: "\\e03f";\n}\n\n.fa-temperature-arrow-up {\n --fa: "\\e040";\n}\n\n.fa-temperature-up {\n --fa: "\\e040";\n}\n\n.fa-trailer {\n --fa: "\\e041";\n}\n\n.fa-bacteria {\n --fa: "\\e059";\n}\n\n.fa-bacterium {\n --fa: "\\e05a";\n}\n\n.fa-box-tissue {\n --fa: "\\e05b";\n}\n\n.fa-hand-holding-medical {\n --fa: "\\e05c";\n}\n\n.fa-hand-sparkles {\n --fa: "\\e05d";\n}\n\n.fa-hands-bubbles {\n --fa: "\\e05e";\n}\n\n.fa-hands-wash {\n --fa: "\\e05e";\n}\n\n.fa-handshake-slash {\n --fa: "\\e060";\n}\n\n.fa-handshake-alt-slash {\n --fa: "\\e060";\n}\n\n.fa-handshake-simple-slash {\n --fa: "\\e060";\n}\n\n.fa-head-side-cough {\n --fa: "\\e061";\n}\n\n.fa-head-side-cough-slash {\n --fa: "\\e062";\n}\n\n.fa-head-side-mask {\n --fa: "\\e063";\n}\n\n.fa-head-side-virus {\n --fa: "\\e064";\n}\n\n.fa-house-chimney-user {\n --fa: "\\e065";\n}\n\n.fa-house-laptop {\n --fa: "\\e066";\n}\n\n.fa-laptop-house {\n --fa: "\\e066";\n}\n\n.fa-lungs-virus {\n --fa: "\\e067";\n}\n\n.fa-people-arrows {\n --fa: "\\e068";\n}\n\n.fa-people-arrows-left-right {\n --fa: "\\e068";\n}\n\n.fa-plane-slash {\n --fa: "\\e069";\n}\n\n.fa-pump-medical {\n --fa: "\\e06a";\n}\n\n.fa-pump-soap {\n --fa: "\\e06b";\n}\n\n.fa-shield-virus {\n --fa: "\\e06c";\n}\n\n.fa-sink {\n --fa: "\\e06d";\n}\n\n.fa-soap {\n --fa: "\\e06e";\n}\n\n.fa-stopwatch-20 {\n --fa: "\\e06f";\n}\n\n.fa-shop-slash {\n --fa: "\\e070";\n}\n\n.fa-store-alt-slash {\n --fa: "\\e070";\n}\n\n.fa-store-slash {\n --fa: "\\e071";\n}\n\n.fa-toilet-paper-slash {\n --fa: "\\e072";\n}\n\n.fa-users-slash {\n --fa: "\\e073";\n}\n\n.fa-virus {\n --fa: "\\e074";\n}\n\n.fa-virus-slash {\n --fa: "\\e075";\n}\n\n.fa-viruses {\n --fa: "\\e076";\n}\n\n.fa-vest {\n --fa: "\\e085";\n}\n\n.fa-vest-patches {\n --fa: "\\e086";\n}\n\n.fa-arrow-trend-down {\n --fa: "\\e097";\n}\n\n.fa-arrow-trend-up {\n --fa: "\\e098";\n}\n\n.fa-arrow-up-from-bracket {\n --fa: "\\e09a";\n}\n\n.fa-austral-sign {\n --fa: "\\e0a9";\n}\n\n.fa-baht-sign {\n --fa: "\\e0ac";\n}\n\n.fa-bitcoin-sign {\n --fa: "\\e0b4";\n}\n\n.fa-bolt-lightning {\n --fa: "\\e0b7";\n}\n\n.fa-book-bookmark {\n --fa: "\\e0bb";\n}\n\n.fa-camera-rotate {\n --fa: "\\e0d8";\n}\n\n.fa-cedi-sign {\n --fa: "\\e0df";\n}\n\n.fa-chart-column {\n --fa: "\\e0e3";\n}\n\n.fa-chart-gantt {\n --fa: "\\e0e4";\n}\n\n.fa-clapperboard {\n --fa: "\\e131";\n}\n\n.fa-closed-captioning-slash {\n --fa: "\\e135";\n}\n\n.fa-clover {\n --fa: "\\e139";\n}\n\n.fa-code-compare {\n --fa: "\\e13a";\n}\n\n.fa-code-fork {\n --fa: "\\e13b";\n}\n\n.fa-code-pull-request {\n --fa: "\\e13c";\n}\n\n.fa-colon-sign {\n --fa: "\\e140";\n}\n\n.fa-cruzeiro-sign {\n --fa: "\\e152";\n}\n\n.fa-display {\n --fa: "\\e163";\n}\n\n.fa-dong-sign {\n --fa: "\\e169";\n}\n\n.fa-elevator {\n --fa: "\\e16d";\n}\n\n.fa-filter-circle-xmark {\n --fa: "\\e17b";\n}\n\n.fa-florin-sign {\n --fa: "\\e184";\n}\n\n.fa-folder-closed {\n --fa: "\\e185";\n}\n\n.fa-franc-sign {\n --fa: "\\e18f";\n}\n\n.fa-guarani-sign {\n --fa: "\\e19a";\n}\n\n.fa-gun {\n --fa: "\\e19b";\n}\n\n.fa-hands-clapping {\n --fa: "\\e1a8";\n}\n\n.fa-house-user {\n --fa: "\\e1b0";\n}\n\n.fa-home-user {\n --fa: "\\e1b0";\n}\n\n.fa-indian-rupee-sign {\n --fa: "\\e1bc";\n}\n\n.fa-indian-rupee {\n --fa: "\\e1bc";\n}\n\n.fa-inr {\n --fa: "\\e1bc";\n}\n\n.fa-kip-sign {\n --fa: "\\e1c4";\n}\n\n.fa-lari-sign {\n --fa: "\\e1c8";\n}\n\n.fa-litecoin-sign {\n --fa: "\\e1d3";\n}\n\n.fa-manat-sign {\n --fa: "\\e1d5";\n}\n\n.fa-mask-face {\n --fa: "\\e1d7";\n}\n\n.fa-mill-sign {\n --fa: "\\e1ed";\n}\n\n.fa-money-bills {\n --fa: "\\e1f3";\n}\n\n.fa-naira-sign {\n --fa: "\\e1f6";\n}\n\n.fa-notdef {\n --fa: "\\e1fe";\n}\n\n.fa-panorama {\n --fa: "\\e209";\n}\n\n.fa-peseta-sign {\n --fa: "\\e221";\n}\n\n.fa-peso-sign {\n --fa: "\\e222";\n}\n\n.fa-plane-up {\n --fa: "\\e22d";\n}\n\n.fa-rupiah-sign {\n --fa: "\\e23d";\n}\n\n.fa-stairs {\n --fa: "\\e289";\n}\n\n.fa-timeline {\n --fa: "\\e29c";\n}\n\n.fa-truck-front {\n --fa: "\\e2b7";\n}\n\n.fa-turkish-lira-sign {\n --fa: "\\e2bb";\n}\n\n.fa-try {\n --fa: "\\e2bb";\n}\n\n.fa-turkish-lira {\n --fa: "\\e2bb";\n}\n\n.fa-vault {\n --fa: "\\e2c5";\n}\n\n.fa-wand-magic-sparkles {\n --fa: "\\e2ca";\n}\n\n.fa-magic-wand-sparkles {\n --fa: "\\e2ca";\n}\n\n.fa-wheat-awn {\n --fa: "\\e2cd";\n}\n\n.fa-wheat-alt {\n --fa: "\\e2cd";\n}\n\n.fa-wheelchair-move {\n --fa: "\\e2ce";\n}\n\n.fa-wheelchair-alt {\n --fa: "\\e2ce";\n}\n\n.fa-bangladeshi-taka-sign {\n --fa: "\\e2e6";\n}\n\n.fa-bowl-rice {\n --fa: "\\e2eb";\n}\n\n.fa-person-pregnant {\n --fa: "\\e31e";\n}\n\n.fa-house-chimney {\n --fa: "\\e3af";\n}\n\n.fa-home-lg {\n --fa: "\\e3af";\n}\n\n.fa-house-crack {\n --fa: "\\e3b1";\n}\n\n.fa-house-medical {\n --fa: "\\e3b2";\n}\n\n.fa-cent-sign {\n --fa: "\\e3f5";\n}\n\n.fa-plus-minus {\n --fa: "\\e43c";\n}\n\n.fa-sailboat {\n --fa: "\\e445";\n}\n\n.fa-section {\n --fa: "\\e447";\n}\n\n.fa-shrimp {\n --fa: "\\e448";\n}\n\n.fa-brazilian-real-sign {\n --fa: "\\e46c";\n}\n\n.fa-chart-simple {\n --fa: "\\e473";\n}\n\n.fa-diagram-next {\n --fa: "\\e476";\n}\n\n.fa-diagram-predecessor {\n --fa: "\\e477";\n}\n\n.fa-diagram-successor {\n --fa: "\\e47a";\n}\n\n.fa-earth-oceania {\n --fa: "\\e47b";\n}\n\n.fa-globe-oceania {\n --fa: "\\e47b";\n}\n\n.fa-bug-slash {\n --fa: "\\e490";\n}\n\n.fa-file-circle-plus {\n --fa: "\\e494";\n}\n\n.fa-shop-lock {\n --fa: "\\e4a5";\n}\n\n.fa-virus-covid {\n --fa: "\\e4a8";\n}\n\n.fa-virus-covid-slash {\n --fa: "\\e4a9";\n}\n\n.fa-anchor-circle-check {\n --fa: "\\e4aa";\n}\n\n.fa-anchor-circle-exclamation {\n --fa: "\\e4ab";\n}\n\n.fa-anchor-circle-xmark {\n --fa: "\\e4ac";\n}\n\n.fa-anchor-lock {\n --fa: "\\e4ad";\n}\n\n.fa-arrow-down-up-across-line {\n --fa: "\\e4af";\n}\n\n.fa-arrow-down-up-lock {\n --fa: "\\e4b0";\n}\n\n.fa-arrow-right-to-city {\n --fa: "\\e4b3";\n}\n\n.fa-arrow-up-from-ground-water {\n --fa: "\\e4b5";\n}\n\n.fa-arrow-up-from-water-pump {\n --fa: "\\e4b6";\n}\n\n.fa-arrow-up-right-dots {\n --fa: "\\e4b7";\n}\n\n.fa-arrows-down-to-line {\n --fa: "\\e4b8";\n}\n\n.fa-arrows-down-to-people {\n --fa: "\\e4b9";\n}\n\n.fa-arrows-left-right-to-line {\n --fa: "\\e4ba";\n}\n\n.fa-arrows-spin {\n --fa: "\\e4bb";\n}\n\n.fa-arrows-split-up-and-left {\n --fa: "\\e4bc";\n}\n\n.fa-arrows-to-circle {\n --fa: "\\e4bd";\n}\n\n.fa-arrows-to-dot {\n --fa: "\\e4be";\n}\n\n.fa-arrows-to-eye {\n --fa: "\\e4bf";\n}\n\n.fa-arrows-turn-right {\n --fa: "\\e4c0";\n}\n\n.fa-arrows-turn-to-dots {\n --fa: "\\e4c1";\n}\n\n.fa-arrows-up-to-line {\n --fa: "\\e4c2";\n}\n\n.fa-bore-hole {\n --fa: "\\e4c3";\n}\n\n.fa-bottle-droplet {\n --fa: "\\e4c4";\n}\n\n.fa-bottle-water {\n --fa: "\\e4c5";\n}\n\n.fa-bowl-food {\n --fa: "\\e4c6";\n}\n\n.fa-boxes-packing {\n --fa: "\\e4c7";\n}\n\n.fa-bridge {\n --fa: "\\e4c8";\n}\n\n.fa-bridge-circle-check {\n --fa: "\\e4c9";\n}\n\n.fa-bridge-circle-exclamation {\n --fa: "\\e4ca";\n}\n\n.fa-bridge-circle-xmark {\n --fa: "\\e4cb";\n}\n\n.fa-bridge-lock {\n --fa: "\\e4cc";\n}\n\n.fa-bridge-water {\n --fa: "\\e4ce";\n}\n\n.fa-bucket {\n --fa: "\\e4cf";\n}\n\n.fa-bugs {\n --fa: "\\e4d0";\n}\n\n.fa-building-circle-arrow-right {\n --fa: "\\e4d1";\n}\n\n.fa-building-circle-check {\n --fa: "\\e4d2";\n}\n\n.fa-building-circle-exclamation {\n --fa: "\\e4d3";\n}\n\n.fa-building-circle-xmark {\n --fa: "\\e4d4";\n}\n\n.fa-building-flag {\n --fa: "\\e4d5";\n}\n\n.fa-building-lock {\n --fa: "\\e4d6";\n}\n\n.fa-building-ngo {\n --fa: "\\e4d7";\n}\n\n.fa-building-shield {\n --fa: "\\e4d8";\n}\n\n.fa-building-un {\n --fa: "\\e4d9";\n}\n\n.fa-building-user {\n --fa: "\\e4da";\n}\n\n.fa-building-wheat {\n --fa: "\\e4db";\n}\n\n.fa-burst {\n --fa: "\\e4dc";\n}\n\n.fa-car-on {\n --fa: "\\e4dd";\n}\n\n.fa-car-tunnel {\n --fa: "\\e4de";\n}\n\n.fa-child-combatant {\n --fa: "\\e4e0";\n}\n\n.fa-child-rifle {\n --fa: "\\e4e0";\n}\n\n.fa-children {\n --fa: "\\e4e1";\n}\n\n.fa-circle-nodes {\n --fa: "\\e4e2";\n}\n\n.fa-clipboard-question {\n --fa: "\\e4e3";\n}\n\n.fa-cloud-showers-water {\n --fa: "\\e4e4";\n}\n\n.fa-computer {\n --fa: "\\e4e5";\n}\n\n.fa-cubes-stacked {\n --fa: "\\e4e6";\n}\n\n.fa-envelope-circle-check {\n --fa: "\\e4e8";\n}\n\n.fa-explosion {\n --fa: "\\e4e9";\n}\n\n.fa-ferry {\n --fa: "\\e4ea";\n}\n\n.fa-file-circle-exclamation {\n --fa: "\\e4eb";\n}\n\n.fa-file-circle-minus {\n --fa: "\\e4ed";\n}\n\n.fa-file-circle-question {\n --fa: "\\e4ef";\n}\n\n.fa-file-shield {\n --fa: "\\e4f0";\n}\n\n.fa-fire-burner {\n --fa: "\\e4f1";\n}\n\n.fa-fish-fins {\n --fa: "\\e4f2";\n}\n\n.fa-flask-vial {\n --fa: "\\e4f3";\n}\n\n.fa-glass-water {\n --fa: "\\e4f4";\n}\n\n.fa-glass-water-droplet {\n --fa: "\\e4f5";\n}\n\n.fa-group-arrows-rotate {\n --fa: "\\e4f6";\n}\n\n.fa-hand-holding-hand {\n --fa: "\\e4f7";\n}\n\n.fa-handcuffs {\n --fa: "\\e4f8";\n}\n\n.fa-hands-bound {\n --fa: "\\e4f9";\n}\n\n.fa-hands-holding-child {\n --fa: "\\e4fa";\n}\n\n.fa-hands-holding-circle {\n --fa: "\\e4fb";\n}\n\n.fa-heart-circle-bolt {\n --fa: "\\e4fc";\n}\n\n.fa-heart-circle-check {\n --fa: "\\e4fd";\n}\n\n.fa-heart-circle-exclamation {\n --fa: "\\e4fe";\n}\n\n.fa-heart-circle-minus {\n --fa: "\\e4ff";\n}\n\n.fa-heart-circle-plus {\n --fa: "\\e500";\n}\n\n.fa-heart-circle-xmark {\n --fa: "\\e501";\n}\n\n.fa-helicopter-symbol {\n --fa: "\\e502";\n}\n\n.fa-helmet-un {\n --fa: "\\e503";\n}\n\n.fa-hill-avalanche {\n --fa: "\\e507";\n}\n\n.fa-hill-rockslide {\n --fa: "\\e508";\n}\n\n.fa-house-circle-check {\n --fa: "\\e509";\n}\n\n.fa-house-circle-exclamation {\n --fa: "\\e50a";\n}\n\n.fa-house-circle-xmark {\n --fa: "\\e50b";\n}\n\n.fa-house-fire {\n --fa: "\\e50c";\n}\n\n.fa-house-flag {\n --fa: "\\e50d";\n}\n\n.fa-house-flood-water {\n --fa: "\\e50e";\n}\n\n.fa-house-flood-water-circle-arrow-right {\n --fa: "\\e50f";\n}\n\n.fa-house-lock {\n --fa: "\\e510";\n}\n\n.fa-house-medical-circle-check {\n --fa: "\\e511";\n}\n\n.fa-house-medical-circle-exclamation {\n --fa: "\\e512";\n}\n\n.fa-house-medical-circle-xmark {\n --fa: "\\e513";\n}\n\n.fa-house-medical-flag {\n --fa: "\\e514";\n}\n\n.fa-house-tsunami {\n --fa: "\\e515";\n}\n\n.fa-jar {\n --fa: "\\e516";\n}\n\n.fa-jar-wheat {\n --fa: "\\e517";\n}\n\n.fa-jet-fighter-up {\n --fa: "\\e518";\n}\n\n.fa-jug-detergent {\n --fa: "\\e519";\n}\n\n.fa-kitchen-set {\n --fa: "\\e51a";\n}\n\n.fa-land-mine-on {\n --fa: "\\e51b";\n}\n\n.fa-landmark-flag {\n --fa: "\\e51c";\n}\n\n.fa-laptop-file {\n --fa: "\\e51d";\n}\n\n.fa-lines-leaning {\n --fa: "\\e51e";\n}\n\n.fa-location-pin-lock {\n --fa: "\\e51f";\n}\n\n.fa-locust {\n --fa: "\\e520";\n}\n\n.fa-magnifying-glass-arrow-right {\n --fa: "\\e521";\n}\n\n.fa-magnifying-glass-chart {\n --fa: "\\e522";\n}\n\n.fa-mars-and-venus-burst {\n --fa: "\\e523";\n}\n\n.fa-mask-ventilator {\n --fa: "\\e524";\n}\n\n.fa-mattress-pillow {\n --fa: "\\e525";\n}\n\n.fa-mobile-retro {\n --fa: "\\e527";\n}\n\n.fa-money-bill-transfer {\n --fa: "\\e528";\n}\n\n.fa-money-bill-trend-up {\n --fa: "\\e529";\n}\n\n.fa-money-bill-wheat {\n --fa: "\\e52a";\n}\n\n.fa-mosquito {\n --fa: "\\e52b";\n}\n\n.fa-mosquito-net {\n --fa: "\\e52c";\n}\n\n.fa-mound {\n --fa: "\\e52d";\n}\n\n.fa-mountain-city {\n --fa: "\\e52e";\n}\n\n.fa-mountain-sun {\n --fa: "\\e52f";\n}\n\n.fa-oil-well {\n --fa: "\\e532";\n}\n\n.fa-people-group {\n --fa: "\\e533";\n}\n\n.fa-people-line {\n --fa: "\\e534";\n}\n\n.fa-people-pulling {\n --fa: "\\e535";\n}\n\n.fa-people-robbery {\n --fa: "\\e536";\n}\n\n.fa-people-roof {\n --fa: "\\e537";\n}\n\n.fa-person-arrow-down-to-line {\n --fa: "\\e538";\n}\n\n.fa-person-arrow-up-from-line {\n --fa: "\\e539";\n}\n\n.fa-person-breastfeeding {\n --fa: "\\e53a";\n}\n\n.fa-person-burst {\n --fa: "\\e53b";\n}\n\n.fa-person-cane {\n --fa: "\\e53c";\n}\n\n.fa-person-chalkboard {\n --fa: "\\e53d";\n}\n\n.fa-person-circle-check {\n --fa: "\\e53e";\n}\n\n.fa-person-circle-exclamation {\n --fa: "\\e53f";\n}\n\n.fa-person-circle-minus {\n --fa: "\\e540";\n}\n\n.fa-person-circle-plus {\n --fa: "\\e541";\n}\n\n.fa-person-circle-question {\n --fa: "\\e542";\n}\n\n.fa-person-circle-xmark {\n --fa: "\\e543";\n}\n\n.fa-person-dress-burst {\n --fa: "\\e544";\n}\n\n.fa-person-drowning {\n --fa: "\\e545";\n}\n\n.fa-person-falling {\n --fa: "\\e546";\n}\n\n.fa-person-falling-burst {\n --fa: "\\e547";\n}\n\n.fa-person-half-dress {\n --fa: "\\e548";\n}\n\n.fa-person-harassing {\n --fa: "\\e549";\n}\n\n.fa-person-military-pointing {\n --fa: "\\e54a";\n}\n\n.fa-person-military-rifle {\n --fa: "\\e54b";\n}\n\n.fa-person-military-to-person {\n --fa: "\\e54c";\n}\n\n.fa-person-rays {\n --fa: "\\e54d";\n}\n\n.fa-person-rifle {\n --fa: "\\e54e";\n}\n\n.fa-person-shelter {\n --fa: "\\e54f";\n}\n\n.fa-person-walking-arrow-loop-left {\n --fa: "\\e551";\n}\n\n.fa-person-walking-arrow-right {\n --fa: "\\e552";\n}\n\n.fa-person-walking-dashed-line-arrow-right {\n --fa: "\\e553";\n}\n\n.fa-person-walking-luggage {\n --fa: "\\e554";\n}\n\n.fa-plane-circle-check {\n --fa: "\\e555";\n}\n\n.fa-plane-circle-exclamation {\n --fa: "\\e556";\n}\n\n.fa-plane-circle-xmark {\n --fa: "\\e557";\n}\n\n.fa-plane-lock {\n --fa: "\\e558";\n}\n\n.fa-plate-wheat {\n --fa: "\\e55a";\n}\n\n.fa-plug-circle-bolt {\n --fa: "\\e55b";\n}\n\n.fa-plug-circle-check {\n --fa: "\\e55c";\n}\n\n.fa-plug-circle-exclamation {\n --fa: "\\e55d";\n}\n\n.fa-plug-circle-minus {\n --fa: "\\e55e";\n}\n\n.fa-plug-circle-plus {\n --fa: "\\e55f";\n}\n\n.fa-plug-circle-xmark {\n --fa: "\\e560";\n}\n\n.fa-ranking-star {\n --fa: "\\e561";\n}\n\n.fa-road-barrier {\n --fa: "\\e562";\n}\n\n.fa-road-bridge {\n --fa: "\\e563";\n}\n\n.fa-road-circle-check {\n --fa: "\\e564";\n}\n\n.fa-road-circle-exclamation {\n --fa: "\\e565";\n}\n\n.fa-road-circle-xmark {\n --fa: "\\e566";\n}\n\n.fa-road-lock {\n --fa: "\\e567";\n}\n\n.fa-road-spikes {\n --fa: "\\e568";\n}\n\n.fa-rug {\n --fa: "\\e569";\n}\n\n.fa-sack-xmark {\n --fa: "\\e56a";\n}\n\n.fa-school-circle-check {\n --fa: "\\e56b";\n}\n\n.fa-school-circle-exclamation {\n --fa: "\\e56c";\n}\n\n.fa-school-circle-xmark {\n --fa: "\\e56d";\n}\n\n.fa-school-flag {\n --fa: "\\e56e";\n}\n\n.fa-school-lock {\n --fa: "\\e56f";\n}\n\n.fa-sheet-plastic {\n --fa: "\\e571";\n}\n\n.fa-shield-cat {\n --fa: "\\e572";\n}\n\n.fa-shield-dog {\n --fa: "\\e573";\n}\n\n.fa-shield-heart {\n --fa: "\\e574";\n}\n\n.fa-square-nfi {\n --fa: "\\e576";\n}\n\n.fa-square-person-confined {\n --fa: "\\e577";\n}\n\n.fa-square-virus {\n --fa: "\\e578";\n}\n\n.fa-staff-snake {\n --fa: "\\e579";\n}\n\n.fa-rod-asclepius {\n --fa: "\\e579";\n}\n\n.fa-rod-snake {\n --fa: "\\e579";\n}\n\n.fa-staff-aesculapius {\n --fa: "\\e579";\n}\n\n.fa-sun-plant-wilt {\n --fa: "\\e57a";\n}\n\n.fa-tarp {\n --fa: "\\e57b";\n}\n\n.fa-tarp-droplet {\n --fa: "\\e57c";\n}\n\n.fa-tent {\n --fa: "\\e57d";\n}\n\n.fa-tent-arrow-down-to-line {\n --fa: "\\e57e";\n}\n\n.fa-tent-arrow-left-right {\n --fa: "\\e57f";\n}\n\n.fa-tent-arrow-turn-left {\n --fa: "\\e580";\n}\n\n.fa-tent-arrows-down {\n --fa: "\\e581";\n}\n\n.fa-tents {\n --fa: "\\e582";\n}\n\n.fa-toilet-portable {\n --fa: "\\e583";\n}\n\n.fa-toilets-portable {\n --fa: "\\e584";\n}\n\n.fa-tower-cell {\n --fa: "\\e585";\n}\n\n.fa-tower-observation {\n --fa: "\\e586";\n}\n\n.fa-tree-city {\n --fa: "\\e587";\n}\n\n.fa-trowel {\n --fa: "\\e589";\n}\n\n.fa-trowel-bricks {\n --fa: "\\e58a";\n}\n\n.fa-truck-arrow-right {\n --fa: "\\e58b";\n}\n\n.fa-truck-droplet {\n --fa: "\\e58c";\n}\n\n.fa-truck-field {\n --fa: "\\e58d";\n}\n\n.fa-truck-field-un {\n --fa: "\\e58e";\n}\n\n.fa-truck-plane {\n --fa: "\\e58f";\n}\n\n.fa-users-between-lines {\n --fa: "\\e591";\n}\n\n.fa-users-line {\n --fa: "\\e592";\n}\n\n.fa-users-rays {\n --fa: "\\e593";\n}\n\n.fa-users-rectangle {\n --fa: "\\e594";\n}\n\n.fa-users-viewfinder {\n --fa: "\\e595";\n}\n\n.fa-vial-circle-check {\n --fa: "\\e596";\n}\n\n.fa-vial-virus {\n --fa: "\\e597";\n}\n\n.fa-wheat-awn-circle-exclamation {\n --fa: "\\e598";\n}\n\n.fa-worm {\n --fa: "\\e599";\n}\n\n.fa-xmarks-lines {\n --fa: "\\e59a";\n}\n\n.fa-child-dress {\n --fa: "\\e59c";\n}\n\n.fa-child-reaching {\n --fa: "\\e59d";\n}\n\n.fa-file-circle-check {\n --fa: "\\e5a0";\n}\n\n.fa-file-circle-xmark {\n --fa: "\\e5a1";\n}\n\n.fa-person-through-window {\n --fa: "\\e5a9";\n}\n\n.fa-plant-wilt {\n --fa: "\\e5aa";\n}\n\n.fa-stapler {\n --fa: "\\e5af";\n}\n\n.fa-train-tram {\n --fa: "\\e5b4";\n}\n\n.fa-table-cells-column-lock {\n --fa: "\\e678";\n}\n\n.fa-table-cells-row-lock {\n --fa: "\\e67a";\n}\n\n.fa-web-awesome {\n --fa: "\\e682";\n}\n\n.fa-thumbtack-slash {\n --fa: "\\e68f";\n}\n\n.fa-thumb-tack-slash {\n --fa: "\\e68f";\n}\n\n.fa-table-cells-row-unlock {\n --fa: "\\e691";\n}\n\n.fa-chart-diagram {\n --fa: "\\e695";\n}\n\n.fa-comment-nodes {\n --fa: "\\e696";\n}\n\n.fa-file-fragment {\n --fa: "\\e697";\n}\n\n.fa-file-half-dashed {\n --fa: "\\e698";\n}\n\n.fa-hexagon-nodes {\n --fa: "\\e699";\n}\n\n.fa-hexagon-nodes-bolt {\n --fa: "\\e69a";\n}\n\n.fa-square-binary {\n --fa: "\\e69b";\n}\n\n.fa-pentagon {\n --fa: "\\e790";\n}\n\n.fa-non-binary {\n --fa: "\\e807";\n}\n\n.fa-spiral {\n --fa: "\\e80a";\n}\n\n.fa-picture-in-picture {\n --fa: "\\e80b";\n}\n\n.fa-mobile-vibrate {\n --fa: "\\e816";\n}\n\n.fa-single-quote-left {\n --fa: "\\e81b";\n}\n\n.fa-single-quote-right {\n --fa: "\\e81c";\n}\n\n.fa-bus-side {\n --fa: "\\e81d";\n}\n\n.fa-septagon {\n --fa: "\\e820";\n}\n\n.fa-heptagon {\n --fa: "\\e820";\n}\n\n.fa-aquarius {\n --fa: "\\e845";\n}\n\n.fa-aries {\n --fa: "\\e846";\n}\n\n.fa-cancer {\n --fa: "\\e847";\n}\n\n.fa-capricorn {\n --fa: "\\e848";\n}\n\n.fa-gemini {\n --fa: "\\e849";\n}\n\n.fa-leo {\n --fa: "\\e84a";\n}\n\n.fa-libra {\n --fa: "\\e84b";\n}\n\n.fa-pisces {\n --fa: "\\e84c";\n}\n\n.fa-sagittarius {\n --fa: "\\e84d";\n}\n\n.fa-scorpio {\n --fa: "\\e84e";\n}\n\n.fa-taurus {\n --fa: "\\e84f";\n}\n\n.fa-virgo {\n --fa: "\\e850";\n}\n\n.fa-martini-glass-empty {\n --fa: "\\f000";\n}\n\n.fa-glass-martini {\n --fa: "\\f000";\n}\n\n.fa-music {\n --fa: "\\f001";\n}\n\n.fa-magnifying-glass {\n --fa: "\\f002";\n}\n\n.fa-search {\n --fa: "\\f002";\n}\n\n.fa-heart {\n --fa: "\\f004";\n}\n\n.fa-star {\n --fa: "\\f005";\n}\n\n.fa-user {\n --fa: "\\f007";\n}\n\n.fa-user-alt {\n --fa: "\\f007";\n}\n\n.fa-user-large {\n --fa: "\\f007";\n}\n\n.fa-film {\n --fa: "\\f008";\n}\n\n.fa-film-alt {\n --fa: "\\f008";\n}\n\n.fa-film-simple {\n --fa: "\\f008";\n}\n\n.fa-table-cells-large {\n --fa: "\\f009";\n}\n\n.fa-th-large {\n --fa: "\\f009";\n}\n\n.fa-table-cells {\n --fa: "\\f00a";\n}\n\n.fa-th {\n --fa: "\\f00a";\n}\n\n.fa-table-list {\n --fa: "\\f00b";\n}\n\n.fa-th-list {\n --fa: "\\f00b";\n}\n\n.fa-check {\n --fa: "\\f00c";\n}\n\n.fa-xmark {\n --fa: "\\f00d";\n}\n\n.fa-close {\n --fa: "\\f00d";\n}\n\n.fa-multiply {\n --fa: "\\f00d";\n}\n\n.fa-remove {\n --fa: "\\f00d";\n}\n\n.fa-times {\n --fa: "\\f00d";\n}\n\n.fa-magnifying-glass-plus {\n --fa: "\\f00e";\n}\n\n.fa-search-plus {\n --fa: "\\f00e";\n}\n\n.fa-magnifying-glass-minus {\n --fa: "\\f010";\n}\n\n.fa-search-minus {\n --fa: "\\f010";\n}\n\n.fa-power-off {\n --fa: "\\f011";\n}\n\n.fa-signal {\n --fa: "\\f012";\n}\n\n.fa-signal-5 {\n --fa: "\\f012";\n}\n\n.fa-signal-perfect {\n --fa: "\\f012";\n}\n\n.fa-gear {\n --fa: "\\f013";\n}\n\n.fa-cog {\n --fa: "\\f013";\n}\n\n.fa-house {\n --fa: "\\f015";\n}\n\n.fa-home {\n --fa: "\\f015";\n}\n\n.fa-home-alt {\n --fa: "\\f015";\n}\n\n.fa-home-lg-alt {\n --fa: "\\f015";\n}\n\n.fa-clock {\n --fa: "\\f017";\n}\n\n.fa-clock-four {\n --fa: "\\f017";\n}\n\n.fa-road {\n --fa: "\\f018";\n}\n\n.fa-download {\n --fa: "\\f019";\n}\n\n.fa-inbox {\n --fa: "\\f01c";\n}\n\n.fa-arrow-rotate-right {\n --fa: "\\f01e";\n}\n\n.fa-arrow-right-rotate {\n --fa: "\\f01e";\n}\n\n.fa-arrow-rotate-forward {\n --fa: "\\f01e";\n}\n\n.fa-redo {\n --fa: "\\f01e";\n}\n\n.fa-arrows-rotate {\n --fa: "\\f021";\n}\n\n.fa-refresh {\n --fa: "\\f021";\n}\n\n.fa-sync {\n --fa: "\\f021";\n}\n\n.fa-rectangle-list {\n --fa: "\\f022";\n}\n\n.fa-list-alt {\n --fa: "\\f022";\n}\n\n.fa-lock {\n --fa: "\\f023";\n}\n\n.fa-flag {\n --fa: "\\f024";\n}\n\n.fa-headphones {\n --fa: "\\f025";\n}\n\n.fa-headphones-alt {\n --fa: "\\f025";\n}\n\n.fa-headphones-simple {\n --fa: "\\f025";\n}\n\n.fa-volume-off {\n --fa: "\\f026";\n}\n\n.fa-volume-low {\n --fa: "\\f027";\n}\n\n.fa-volume-down {\n --fa: "\\f027";\n}\n\n.fa-volume-high {\n --fa: "\\f028";\n}\n\n.fa-volume-up {\n --fa: "\\f028";\n}\n\n.fa-qrcode {\n --fa: "\\f029";\n}\n\n.fa-barcode {\n --fa: "\\f02a";\n}\n\n.fa-tag {\n --fa: "\\f02b";\n}\n\n.fa-tags {\n --fa: "\\f02c";\n}\n\n.fa-book {\n --fa: "\\f02d";\n}\n\n.fa-bookmark {\n --fa: "\\f02e";\n}\n\n.fa-print {\n --fa: "\\f02f";\n}\n\n.fa-camera {\n --fa: "\\f030";\n}\n\n.fa-camera-alt {\n --fa: "\\f030";\n}\n\n.fa-font {\n --fa: "\\f031";\n}\n\n.fa-bold {\n --fa: "\\f032";\n}\n\n.fa-italic {\n --fa: "\\f033";\n}\n\n.fa-text-height {\n --fa: "\\f034";\n}\n\n.fa-text-width {\n --fa: "\\f035";\n}\n\n.fa-align-left {\n --fa: "\\f036";\n}\n\n.fa-align-center {\n --fa: "\\f037";\n}\n\n.fa-align-right {\n --fa: "\\f038";\n}\n\n.fa-align-justify {\n --fa: "\\f039";\n}\n\n.fa-list {\n --fa: "\\f03a";\n}\n\n.fa-list-squares {\n --fa: "\\f03a";\n}\n\n.fa-outdent {\n --fa: "\\f03b";\n}\n\n.fa-dedent {\n --fa: "\\f03b";\n}\n\n.fa-indent {\n --fa: "\\f03c";\n}\n\n.fa-video {\n --fa: "\\f03d";\n}\n\n.fa-video-camera {\n --fa: "\\f03d";\n}\n\n.fa-image {\n --fa: "\\f03e";\n}\n\n.fa-location-pin {\n --fa: "\\f041";\n}\n\n.fa-map-marker {\n --fa: "\\f041";\n}\n\n.fa-circle-half-stroke {\n --fa: "\\f042";\n}\n\n.fa-adjust {\n --fa: "\\f042";\n}\n\n.fa-droplet {\n --fa: "\\f043";\n}\n\n.fa-tint {\n --fa: "\\f043";\n}\n\n.fa-pen-to-square {\n --fa: "\\f044";\n}\n\n.fa-edit {\n --fa: "\\f044";\n}\n\n.fa-arrows-up-down-left-right {\n --fa: "\\f047";\n}\n\n.fa-arrows {\n --fa: "\\f047";\n}\n\n.fa-backward-step {\n --fa: "\\f048";\n}\n\n.fa-step-backward {\n --fa: "\\f048";\n}\n\n.fa-backward-fast {\n --fa: "\\f049";\n}\n\n.fa-fast-backward {\n --fa: "\\f049";\n}\n\n.fa-backward {\n --fa: "\\f04a";\n}\n\n.fa-play {\n --fa: "\\f04b";\n}\n\n.fa-pause {\n --fa: "\\f04c";\n}\n\n.fa-stop {\n --fa: "\\f04d";\n}\n\n.fa-forward {\n --fa: "\\f04e";\n}\n\n.fa-forward-fast {\n --fa: "\\f050";\n}\n\n.fa-fast-forward {\n --fa: "\\f050";\n}\n\n.fa-forward-step {\n --fa: "\\f051";\n}\n\n.fa-step-forward {\n --fa: "\\f051";\n}\n\n.fa-eject {\n --fa: "\\f052";\n}\n\n.fa-chevron-left {\n --fa: "\\f053";\n}\n\n.fa-chevron-right {\n --fa: "\\f054";\n}\n\n.fa-circle-plus {\n --fa: "\\f055";\n}\n\n.fa-plus-circle {\n --fa: "\\f055";\n}\n\n.fa-circle-minus {\n --fa: "\\f056";\n}\n\n.fa-minus-circle {\n --fa: "\\f056";\n}\n\n.fa-circle-xmark {\n --fa: "\\f057";\n}\n\n.fa-times-circle {\n --fa: "\\f057";\n}\n\n.fa-xmark-circle {\n --fa: "\\f057";\n}\n\n.fa-circle-check {\n --fa: "\\f058";\n}\n\n.fa-check-circle {\n --fa: "\\f058";\n}\n\n.fa-circle-question {\n --fa: "\\f059";\n}\n\n.fa-question-circle {\n --fa: "\\f059";\n}\n\n.fa-circle-info {\n --fa: "\\f05a";\n}\n\n.fa-info-circle {\n --fa: "\\f05a";\n}\n\n.fa-crosshairs {\n --fa: "\\f05b";\n}\n\n.fa-ban {\n --fa: "\\f05e";\n}\n\n.fa-cancel {\n --fa: "\\f05e";\n}\n\n.fa-arrow-left {\n --fa: "\\f060";\n}\n\n.fa-arrow-right {\n --fa: "\\f061";\n}\n\n.fa-arrow-up {\n --fa: "\\f062";\n}\n\n.fa-arrow-down {\n --fa: "\\f063";\n}\n\n.fa-share {\n --fa: "\\f064";\n}\n\n.fa-mail-forward {\n --fa: "\\f064";\n}\n\n.fa-expand {\n --fa: "\\f065";\n}\n\n.fa-compress {\n --fa: "\\f066";\n}\n\n.fa-minus {\n --fa: "\\f068";\n}\n\n.fa-subtract {\n --fa: "\\f068";\n}\n\n.fa-circle-exclamation {\n --fa: "\\f06a";\n}\n\n.fa-exclamation-circle {\n --fa: "\\f06a";\n}\n\n.fa-gift {\n --fa: "\\f06b";\n}\n\n.fa-leaf {\n --fa: "\\f06c";\n}\n\n.fa-fire {\n --fa: "\\f06d";\n}\n\n.fa-eye {\n --fa: "\\f06e";\n}\n\n.fa-eye-slash {\n --fa: "\\f070";\n}\n\n.fa-triangle-exclamation {\n --fa: "\\f071";\n}\n\n.fa-exclamation-triangle {\n --fa: "\\f071";\n}\n\n.fa-warning {\n --fa: "\\f071";\n}\n\n.fa-plane {\n --fa: "\\f072";\n}\n\n.fa-calendar-days {\n --fa: "\\f073";\n}\n\n.fa-calendar-alt {\n --fa: "\\f073";\n}\n\n.fa-shuffle {\n --fa: "\\f074";\n}\n\n.fa-random {\n --fa: "\\f074";\n}\n\n.fa-comment {\n --fa: "\\f075";\n}\n\n.fa-magnet {\n --fa: "\\f076";\n}\n\n.fa-chevron-up {\n --fa: "\\f077";\n}\n\n.fa-chevron-down {\n --fa: "\\f078";\n}\n\n.fa-retweet {\n --fa: "\\f079";\n}\n\n.fa-cart-shopping {\n --fa: "\\f07a";\n}\n\n.fa-shopping-cart {\n --fa: "\\f07a";\n}\n\n.fa-folder {\n --fa: "\\f07b";\n}\n\n.fa-folder-blank {\n --fa: "\\f07b";\n}\n\n.fa-folder-open {\n --fa: "\\f07c";\n}\n\n.fa-arrows-up-down {\n --fa: "\\f07d";\n}\n\n.fa-arrows-v {\n --fa: "\\f07d";\n}\n\n.fa-arrows-left-right {\n --fa: "\\f07e";\n}\n\n.fa-arrows-h {\n --fa: "\\f07e";\n}\n\n.fa-chart-bar {\n --fa: "\\f080";\n}\n\n.fa-bar-chart {\n --fa: "\\f080";\n}\n\n.fa-camera-retro {\n --fa: "\\f083";\n}\n\n.fa-key {\n --fa: "\\f084";\n}\n\n.fa-gears {\n --fa: "\\f085";\n}\n\n.fa-cogs {\n --fa: "\\f085";\n}\n\n.fa-comments {\n --fa: "\\f086";\n}\n\n.fa-star-half {\n --fa: "\\f089";\n}\n\n.fa-arrow-right-from-bracket {\n --fa: "\\f08b";\n}\n\n.fa-sign-out {\n --fa: "\\f08b";\n}\n\n.fa-thumbtack {\n --fa: "\\f08d";\n}\n\n.fa-thumb-tack {\n --fa: "\\f08d";\n}\n\n.fa-arrow-up-right-from-square {\n --fa: "\\f08e";\n}\n\n.fa-external-link {\n --fa: "\\f08e";\n}\n\n.fa-arrow-right-to-bracket {\n --fa: "\\f090";\n}\n\n.fa-sign-in {\n --fa: "\\f090";\n}\n\n.fa-trophy {\n --fa: "\\f091";\n}\n\n.fa-upload {\n --fa: "\\f093";\n}\n\n.fa-lemon {\n --fa: "\\f094";\n}\n\n.fa-phone {\n --fa: "\\f095";\n}\n\n.fa-square-phone {\n --fa: "\\f098";\n}\n\n.fa-phone-square {\n --fa: "\\f098";\n}\n\n.fa-unlock {\n --fa: "\\f09c";\n}\n\n.fa-credit-card {\n --fa: "\\f09d";\n}\n\n.fa-credit-card-alt {\n --fa: "\\f09d";\n}\n\n.fa-rss {\n --fa: "\\f09e";\n}\n\n.fa-feed {\n --fa: "\\f09e";\n}\n\n.fa-hard-drive {\n --fa: "\\f0a0";\n}\n\n.fa-hdd {\n --fa: "\\f0a0";\n}\n\n.fa-bullhorn {\n --fa: "\\f0a1";\n}\n\n.fa-certificate {\n --fa: "\\f0a3";\n}\n\n.fa-hand-point-right {\n --fa: "\\f0a4";\n}\n\n.fa-hand-point-left {\n --fa: "\\f0a5";\n}\n\n.fa-hand-point-up {\n --fa: "\\f0a6";\n}\n\n.fa-hand-point-down {\n --fa: "\\f0a7";\n}\n\n.fa-circle-arrow-left {\n --fa: "\\f0a8";\n}\n\n.fa-arrow-circle-left {\n --fa: "\\f0a8";\n}\n\n.fa-circle-arrow-right {\n --fa: "\\f0a9";\n}\n\n.fa-arrow-circle-right {\n --fa: "\\f0a9";\n}\n\n.fa-circle-arrow-up {\n --fa: "\\f0aa";\n}\n\n.fa-arrow-circle-up {\n --fa: "\\f0aa";\n}\n\n.fa-circle-arrow-down {\n --fa: "\\f0ab";\n}\n\n.fa-arrow-circle-down {\n --fa: "\\f0ab";\n}\n\n.fa-globe {\n --fa: "\\f0ac";\n}\n\n.fa-wrench {\n --fa: "\\f0ad";\n}\n\n.fa-list-check {\n --fa: "\\f0ae";\n}\n\n.fa-tasks {\n --fa: "\\f0ae";\n}\n\n.fa-filter {\n --fa: "\\f0b0";\n}\n\n.fa-briefcase {\n --fa: "\\f0b1";\n}\n\n.fa-up-down-left-right {\n --fa: "\\f0b2";\n}\n\n.fa-arrows-alt {\n --fa: "\\f0b2";\n}\n\n.fa-users {\n --fa: "\\f0c0";\n}\n\n.fa-link {\n --fa: "\\f0c1";\n}\n\n.fa-chain {\n --fa: "\\f0c1";\n}\n\n.fa-cloud {\n --fa: "\\f0c2";\n}\n\n.fa-flask {\n --fa: "\\f0c3";\n}\n\n.fa-scissors {\n --fa: "\\f0c4";\n}\n\n.fa-cut {\n --fa: "\\f0c4";\n}\n\n.fa-copy {\n --fa: "\\f0c5";\n}\n\n.fa-paperclip {\n --fa: "\\f0c6";\n}\n\n.fa-floppy-disk {\n --fa: "\\f0c7";\n}\n\n.fa-save {\n --fa: "\\f0c7";\n}\n\n.fa-square {\n --fa: "\\f0c8";\n}\n\n.fa-bars {\n --fa: "\\f0c9";\n}\n\n.fa-navicon {\n --fa: "\\f0c9";\n}\n\n.fa-list-ul {\n --fa: "\\f0ca";\n}\n\n.fa-list-dots {\n --fa: "\\f0ca";\n}\n\n.fa-list-ol {\n --fa: "\\f0cb";\n}\n\n.fa-list-1-2 {\n --fa: "\\f0cb";\n}\n\n.fa-list-numeric {\n --fa: "\\f0cb";\n}\n\n.fa-strikethrough {\n --fa: "\\f0cc";\n}\n\n.fa-underline {\n --fa: "\\f0cd";\n}\n\n.fa-table {\n --fa: "\\f0ce";\n}\n\n.fa-wand-magic {\n --fa: "\\f0d0";\n}\n\n.fa-magic {\n --fa: "\\f0d0";\n}\n\n.fa-truck {\n --fa: "\\f0d1";\n}\n\n.fa-money-bill {\n --fa: "\\f0d6";\n}\n\n.fa-caret-down {\n --fa: "\\f0d7";\n}\n\n.fa-caret-up {\n --fa: "\\f0d8";\n}\n\n.fa-caret-left {\n --fa: "\\f0d9";\n}\n\n.fa-caret-right {\n --fa: "\\f0da";\n}\n\n.fa-table-columns {\n --fa: "\\f0db";\n}\n\n.fa-columns {\n --fa: "\\f0db";\n}\n\n.fa-sort {\n --fa: "\\f0dc";\n}\n\n.fa-unsorted {\n --fa: "\\f0dc";\n}\n\n.fa-sort-down {\n --fa: "\\f0dd";\n}\n\n.fa-sort-desc {\n --fa: "\\f0dd";\n}\n\n.fa-sort-up {\n --fa: "\\f0de";\n}\n\n.fa-sort-asc {\n --fa: "\\f0de";\n}\n\n.fa-envelope {\n --fa: "\\f0e0";\n}\n\n.fa-arrow-rotate-left {\n --fa: "\\f0e2";\n}\n\n.fa-arrow-left-rotate {\n --fa: "\\f0e2";\n}\n\n.fa-arrow-rotate-back {\n --fa: "\\f0e2";\n}\n\n.fa-arrow-rotate-backward {\n --fa: "\\f0e2";\n}\n\n.fa-undo {\n --fa: "\\f0e2";\n}\n\n.fa-gavel {\n --fa: "\\f0e3";\n}\n\n.fa-legal {\n --fa: "\\f0e3";\n}\n\n.fa-bolt {\n --fa: "\\f0e7";\n}\n\n.fa-zap {\n --fa: "\\f0e7";\n}\n\n.fa-sitemap {\n --fa: "\\f0e8";\n}\n\n.fa-umbrella {\n --fa: "\\f0e9";\n}\n\n.fa-paste {\n --fa: "\\f0ea";\n}\n\n.fa-file-clipboard {\n --fa: "\\f0ea";\n}\n\n.fa-lightbulb {\n --fa: "\\f0eb";\n}\n\n.fa-arrow-right-arrow-left {\n --fa: "\\f0ec";\n}\n\n.fa-exchange {\n --fa: "\\f0ec";\n}\n\n.fa-cloud-arrow-down {\n --fa: "\\f0ed";\n}\n\n.fa-cloud-download {\n --fa: "\\f0ed";\n}\n\n.fa-cloud-download-alt {\n --fa: "\\f0ed";\n}\n\n.fa-cloud-arrow-up {\n --fa: "\\f0ee";\n}\n\n.fa-cloud-upload {\n --fa: "\\f0ee";\n}\n\n.fa-cloud-upload-alt {\n --fa: "\\f0ee";\n}\n\n.fa-user-doctor {\n --fa: "\\f0f0";\n}\n\n.fa-user-md {\n --fa: "\\f0f0";\n}\n\n.fa-stethoscope {\n --fa: "\\f0f1";\n}\n\n.fa-suitcase {\n --fa: "\\f0f2";\n}\n\n.fa-bell {\n --fa: "\\f0f3";\n}\n\n.fa-mug-saucer {\n --fa: "\\f0f4";\n}\n\n.fa-coffee {\n --fa: "\\f0f4";\n}\n\n.fa-hospital {\n --fa: "\\f0f8";\n}\n\n.fa-hospital-alt {\n --fa: "\\f0f8";\n}\n\n.fa-hospital-wide {\n --fa: "\\f0f8";\n}\n\n.fa-truck-medical {\n --fa: "\\f0f9";\n}\n\n.fa-ambulance {\n --fa: "\\f0f9";\n}\n\n.fa-suitcase-medical {\n --fa: "\\f0fa";\n}\n\n.fa-medkit {\n --fa: "\\f0fa";\n}\n\n.fa-jet-fighter {\n --fa: "\\f0fb";\n}\n\n.fa-fighter-jet {\n --fa: "\\f0fb";\n}\n\n.fa-beer-mug-empty {\n --fa: "\\f0fc";\n}\n\n.fa-beer {\n --fa: "\\f0fc";\n}\n\n.fa-square-h {\n --fa: "\\f0fd";\n}\n\n.fa-h-square {\n --fa: "\\f0fd";\n}\n\n.fa-square-plus {\n --fa: "\\f0fe";\n}\n\n.fa-plus-square {\n --fa: "\\f0fe";\n}\n\n.fa-angles-left {\n --fa: "\\f100";\n}\n\n.fa-angle-double-left {\n --fa: "\\f100";\n}\n\n.fa-angles-right {\n --fa: "\\f101";\n}\n\n.fa-angle-double-right {\n --fa: "\\f101";\n}\n\n.fa-angles-up {\n --fa: "\\f102";\n}\n\n.fa-angle-double-up {\n --fa: "\\f102";\n}\n\n.fa-angles-down {\n --fa: "\\f103";\n}\n\n.fa-angle-double-down {\n --fa: "\\f103";\n}\n\n.fa-angle-left {\n --fa: "\\f104";\n}\n\n.fa-angle-right {\n --fa: "\\f105";\n}\n\n.fa-angle-up {\n --fa: "\\f106";\n}\n\n.fa-angle-down {\n --fa: "\\f107";\n}\n\n.fa-laptop {\n --fa: "\\f109";\n}\n\n.fa-tablet-button {\n --fa: "\\f10a";\n}\n\n.fa-mobile-button {\n --fa: "\\f10b";\n}\n\n.fa-quote-left {\n --fa: "\\f10d";\n}\n\n.fa-quote-left-alt {\n --fa: "\\f10d";\n}\n\n.fa-quote-right {\n --fa: "\\f10e";\n}\n\n.fa-quote-right-alt {\n --fa: "\\f10e";\n}\n\n.fa-spinner {\n --fa: "\\f110";\n}\n\n.fa-circle {\n --fa: "\\f111";\n}\n\n.fa-face-smile {\n --fa: "\\f118";\n}\n\n.fa-smile {\n --fa: "\\f118";\n}\n\n.fa-face-frown {\n --fa: "\\f119";\n}\n\n.fa-frown {\n --fa: "\\f119";\n}\n\n.fa-face-meh {\n --fa: "\\f11a";\n}\n\n.fa-meh {\n --fa: "\\f11a";\n}\n\n.fa-gamepad {\n --fa: "\\f11b";\n}\n\n.fa-keyboard {\n --fa: "\\f11c";\n}\n\n.fa-flag-checkered {\n --fa: "\\f11e";\n}\n\n.fa-terminal {\n --fa: "\\f120";\n}\n\n.fa-code {\n --fa: "\\f121";\n}\n\n.fa-reply-all {\n --fa: "\\f122";\n}\n\n.fa-mail-reply-all {\n --fa: "\\f122";\n}\n\n.fa-location-arrow {\n --fa: "\\f124";\n}\n\n.fa-crop {\n --fa: "\\f125";\n}\n\n.fa-code-branch {\n --fa: "\\f126";\n}\n\n.fa-link-slash {\n --fa: "\\f127";\n}\n\n.fa-chain-broken {\n --fa: "\\f127";\n}\n\n.fa-chain-slash {\n --fa: "\\f127";\n}\n\n.fa-unlink {\n --fa: "\\f127";\n}\n\n.fa-info {\n --fa: "\\f129";\n}\n\n.fa-superscript {\n --fa: "\\f12b";\n}\n\n.fa-subscript {\n --fa: "\\f12c";\n}\n\n.fa-eraser {\n --fa: "\\f12d";\n}\n\n.fa-puzzle-piece {\n --fa: "\\f12e";\n}\n\n.fa-microphone {\n --fa: "\\f130";\n}\n\n.fa-microphone-slash {\n --fa: "\\f131";\n}\n\n.fa-shield {\n --fa: "\\f132";\n}\n\n.fa-shield-blank {\n --fa: "\\f132";\n}\n\n.fa-calendar {\n --fa: "\\f133";\n}\n\n.fa-fire-extinguisher {\n --fa: "\\f134";\n}\n\n.fa-rocket {\n --fa: "\\f135";\n}\n\n.fa-circle-chevron-left {\n --fa: "\\f137";\n}\n\n.fa-chevron-circle-left {\n --fa: "\\f137";\n}\n\n.fa-circle-chevron-right {\n --fa: "\\f138";\n}\n\n.fa-chevron-circle-right {\n --fa: "\\f138";\n}\n\n.fa-circle-chevron-up {\n --fa: "\\f139";\n}\n\n.fa-chevron-circle-up {\n --fa: "\\f139";\n}\n\n.fa-circle-chevron-down {\n --fa: "\\f13a";\n}\n\n.fa-chevron-circle-down {\n --fa: "\\f13a";\n}\n\n.fa-anchor {\n --fa: "\\f13d";\n}\n\n.fa-unlock-keyhole {\n --fa: "\\f13e";\n}\n\n.fa-unlock-alt {\n --fa: "\\f13e";\n}\n\n.fa-bullseye {\n --fa: "\\f140";\n}\n\n.fa-ellipsis {\n --fa: "\\f141";\n}\n\n.fa-ellipsis-h {\n --fa: "\\f141";\n}\n\n.fa-ellipsis-vertical {\n --fa: "\\f142";\n}\n\n.fa-ellipsis-v {\n --fa: "\\f142";\n}\n\n.fa-square-rss {\n --fa: "\\f143";\n}\n\n.fa-rss-square {\n --fa: "\\f143";\n}\n\n.fa-circle-play {\n --fa: "\\f144";\n}\n\n.fa-play-circle {\n --fa: "\\f144";\n}\n\n.fa-ticket {\n --fa: "\\f145";\n}\n\n.fa-square-minus {\n --fa: "\\f146";\n}\n\n.fa-minus-square {\n --fa: "\\f146";\n}\n\n.fa-arrow-turn-up {\n --fa: "\\f148";\n}\n\n.fa-level-up {\n --fa: "\\f148";\n}\n\n.fa-arrow-turn-down {\n --fa: "\\f149";\n}\n\n.fa-level-down {\n --fa: "\\f149";\n}\n\n.fa-square-check {\n --fa: "\\f14a";\n}\n\n.fa-check-square {\n --fa: "\\f14a";\n}\n\n.fa-square-pen {\n --fa: "\\f14b";\n}\n\n.fa-pen-square {\n --fa: "\\f14b";\n}\n\n.fa-pencil-square {\n --fa: "\\f14b";\n}\n\n.fa-square-arrow-up-right {\n --fa: "\\f14c";\n}\n\n.fa-external-link-square {\n --fa: "\\f14c";\n}\n\n.fa-share-from-square {\n --fa: "\\f14d";\n}\n\n.fa-share-square {\n --fa: "\\f14d";\n}\n\n.fa-compass {\n --fa: "\\f14e";\n}\n\n.fa-square-caret-down {\n --fa: "\\f150";\n}\n\n.fa-caret-square-down {\n --fa: "\\f150";\n}\n\n.fa-square-caret-up {\n --fa: "\\f151";\n}\n\n.fa-caret-square-up {\n --fa: "\\f151";\n}\n\n.fa-square-caret-right {\n --fa: "\\f152";\n}\n\n.fa-caret-square-right {\n --fa: "\\f152";\n}\n\n.fa-euro-sign {\n --fa: "\\f153";\n}\n\n.fa-eur {\n --fa: "\\f153";\n}\n\n.fa-euro {\n --fa: "\\f153";\n}\n\n.fa-sterling-sign {\n --fa: "\\f154";\n}\n\n.fa-gbp {\n --fa: "\\f154";\n}\n\n.fa-pound-sign {\n --fa: "\\f154";\n}\n\n.fa-rupee-sign {\n --fa: "\\f156";\n}\n\n.fa-rupee {\n --fa: "\\f156";\n}\n\n.fa-yen-sign {\n --fa: "\\f157";\n}\n\n.fa-cny {\n --fa: "\\f157";\n}\n\n.fa-jpy {\n --fa: "\\f157";\n}\n\n.fa-rmb {\n --fa: "\\f157";\n}\n\n.fa-yen {\n --fa: "\\f157";\n}\n\n.fa-ruble-sign {\n --fa: "\\f158";\n}\n\n.fa-rouble {\n --fa: "\\f158";\n}\n\n.fa-rub {\n --fa: "\\f158";\n}\n\n.fa-ruble {\n --fa: "\\f158";\n}\n\n.fa-won-sign {\n --fa: "\\f159";\n}\n\n.fa-krw {\n --fa: "\\f159";\n}\n\n.fa-won {\n --fa: "\\f159";\n}\n\n.fa-file {\n --fa: "\\f15b";\n}\n\n.fa-file-lines {\n --fa: "\\f15c";\n}\n\n.fa-file-alt {\n --fa: "\\f15c";\n}\n\n.fa-file-text {\n --fa: "\\f15c";\n}\n\n.fa-arrow-down-a-z {\n --fa: "\\f15d";\n}\n\n.fa-sort-alpha-asc {\n --fa: "\\f15d";\n}\n\n.fa-sort-alpha-down {\n --fa: "\\f15d";\n}\n\n.fa-arrow-up-a-z {\n --fa: "\\f15e";\n}\n\n.fa-sort-alpha-up {\n --fa: "\\f15e";\n}\n\n.fa-arrow-down-wide-short {\n --fa: "\\f160";\n}\n\n.fa-sort-amount-asc {\n --fa: "\\f160";\n}\n\n.fa-sort-amount-down {\n --fa: "\\f160";\n}\n\n.fa-arrow-up-wide-short {\n --fa: "\\f161";\n}\n\n.fa-sort-amount-up {\n --fa: "\\f161";\n}\n\n.fa-arrow-down-1-9 {\n --fa: "\\f162";\n}\n\n.fa-sort-numeric-asc {\n --fa: "\\f162";\n}\n\n.fa-sort-numeric-down {\n --fa: "\\f162";\n}\n\n.fa-arrow-up-1-9 {\n --fa: "\\f163";\n}\n\n.fa-sort-numeric-up {\n --fa: "\\f163";\n}\n\n.fa-thumbs-up {\n --fa: "\\f164";\n}\n\n.fa-thumbs-down {\n --fa: "\\f165";\n}\n\n.fa-arrow-down-long {\n --fa: "\\f175";\n}\n\n.fa-long-arrow-down {\n --fa: "\\f175";\n}\n\n.fa-arrow-up-long {\n --fa: "\\f176";\n}\n\n.fa-long-arrow-up {\n --fa: "\\f176";\n}\n\n.fa-arrow-left-long {\n --fa: "\\f177";\n}\n\n.fa-long-arrow-left {\n --fa: "\\f177";\n}\n\n.fa-arrow-right-long {\n --fa: "\\f178";\n}\n\n.fa-long-arrow-right {\n --fa: "\\f178";\n}\n\n.fa-person-dress {\n --fa: "\\f182";\n}\n\n.fa-female {\n --fa: "\\f182";\n}\n\n.fa-person {\n --fa: "\\f183";\n}\n\n.fa-male {\n --fa: "\\f183";\n}\n\n.fa-sun {\n --fa: "\\f185";\n}\n\n.fa-moon {\n --fa: "\\f186";\n}\n\n.fa-box-archive {\n --fa: "\\f187";\n}\n\n.fa-archive {\n --fa: "\\f187";\n}\n\n.fa-bug {\n --fa: "\\f188";\n}\n\n.fa-square-caret-left {\n --fa: "\\f191";\n}\n\n.fa-caret-square-left {\n --fa: "\\f191";\n}\n\n.fa-circle-dot {\n --fa: "\\f192";\n}\n\n.fa-dot-circle {\n --fa: "\\f192";\n}\n\n.fa-wheelchair {\n --fa: "\\f193";\n}\n\n.fa-lira-sign {\n --fa: "\\f195";\n}\n\n.fa-shuttle-space {\n --fa: "\\f197";\n}\n\n.fa-space-shuttle {\n --fa: "\\f197";\n}\n\n.fa-square-envelope {\n --fa: "\\f199";\n}\n\n.fa-envelope-square {\n --fa: "\\f199";\n}\n\n.fa-building-columns {\n --fa: "\\f19c";\n}\n\n.fa-bank {\n --fa: "\\f19c";\n}\n\n.fa-institution {\n --fa: "\\f19c";\n}\n\n.fa-museum {\n --fa: "\\f19c";\n}\n\n.fa-university {\n --fa: "\\f19c";\n}\n\n.fa-graduation-cap {\n --fa: "\\f19d";\n}\n\n.fa-mortar-board {\n --fa: "\\f19d";\n}\n\n.fa-language {\n --fa: "\\f1ab";\n}\n\n.fa-fax {\n --fa: "\\f1ac";\n}\n\n.fa-building {\n --fa: "\\f1ad";\n}\n\n.fa-child {\n --fa: "\\f1ae";\n}\n\n.fa-paw {\n --fa: "\\f1b0";\n}\n\n.fa-cube {\n --fa: "\\f1b2";\n}\n\n.fa-cubes {\n --fa: "\\f1b3";\n}\n\n.fa-recycle {\n --fa: "\\f1b8";\n}\n\n.fa-car {\n --fa: "\\f1b9";\n}\n\n.fa-automobile {\n --fa: "\\f1b9";\n}\n\n.fa-taxi {\n --fa: "\\f1ba";\n}\n\n.fa-cab {\n --fa: "\\f1ba";\n}\n\n.fa-tree {\n --fa: "\\f1bb";\n}\n\n.fa-database {\n --fa: "\\f1c0";\n}\n\n.fa-file-pdf {\n --fa: "\\f1c1";\n}\n\n.fa-file-word {\n --fa: "\\f1c2";\n}\n\n.fa-file-excel {\n --fa: "\\f1c3";\n}\n\n.fa-file-powerpoint {\n --fa: "\\f1c4";\n}\n\n.fa-file-image {\n --fa: "\\f1c5";\n}\n\n.fa-file-zipper {\n --fa: "\\f1c6";\n}\n\n.fa-file-archive {\n --fa: "\\f1c6";\n}\n\n.fa-file-audio {\n --fa: "\\f1c7";\n}\n\n.fa-file-video {\n --fa: "\\f1c8";\n}\n\n.fa-file-code {\n --fa: "\\f1c9";\n}\n\n.fa-life-ring {\n --fa: "\\f1cd";\n}\n\n.fa-circle-notch {\n --fa: "\\f1ce";\n}\n\n.fa-paper-plane {\n --fa: "\\f1d8";\n}\n\n.fa-clock-rotate-left {\n --fa: "\\f1da";\n}\n\n.fa-history {\n --fa: "\\f1da";\n}\n\n.fa-heading {\n --fa: "\\f1dc";\n}\n\n.fa-header {\n --fa: "\\f1dc";\n}\n\n.fa-paragraph {\n --fa: "\\f1dd";\n}\n\n.fa-sliders {\n --fa: "\\f1de";\n}\n\n.fa-sliders-h {\n --fa: "\\f1de";\n}\n\n.fa-share-nodes {\n --fa: "\\f1e0";\n}\n\n.fa-share-alt {\n --fa: "\\f1e0";\n}\n\n.fa-square-share-nodes {\n --fa: "\\f1e1";\n}\n\n.fa-share-alt-square {\n --fa: "\\f1e1";\n}\n\n.fa-bomb {\n --fa: "\\f1e2";\n}\n\n.fa-futbol {\n --fa: "\\f1e3";\n}\n\n.fa-futbol-ball {\n --fa: "\\f1e3";\n}\n\n.fa-soccer-ball {\n --fa: "\\f1e3";\n}\n\n.fa-tty {\n --fa: "\\f1e4";\n}\n\n.fa-teletype {\n --fa: "\\f1e4";\n}\n\n.fa-binoculars {\n --fa: "\\f1e5";\n}\n\n.fa-plug {\n --fa: "\\f1e6";\n}\n\n.fa-newspaper {\n --fa: "\\f1ea";\n}\n\n.fa-wifi {\n --fa: "\\f1eb";\n}\n\n.fa-wifi-3 {\n --fa: "\\f1eb";\n}\n\n.fa-wifi-strong {\n --fa: "\\f1eb";\n}\n\n.fa-calculator {\n --fa: "\\f1ec";\n}\n\n.fa-bell-slash {\n --fa: "\\f1f6";\n}\n\n.fa-trash {\n --fa: "\\f1f8";\n}\n\n.fa-copyright {\n --fa: "\\f1f9";\n}\n\n.fa-eye-dropper {\n --fa: "\\f1fb";\n}\n\n.fa-eye-dropper-empty {\n --fa: "\\f1fb";\n}\n\n.fa-eyedropper {\n --fa: "\\f1fb";\n}\n\n.fa-paintbrush {\n --fa: "\\f1fc";\n}\n\n.fa-paint-brush {\n --fa: "\\f1fc";\n}\n\n.fa-cake-candles {\n --fa: "\\f1fd";\n}\n\n.fa-birthday-cake {\n --fa: "\\f1fd";\n}\n\n.fa-cake {\n --fa: "\\f1fd";\n}\n\n.fa-chart-area {\n --fa: "\\f1fe";\n}\n\n.fa-area-chart {\n --fa: "\\f1fe";\n}\n\n.fa-chart-pie {\n --fa: "\\f200";\n}\n\n.fa-pie-chart {\n --fa: "\\f200";\n}\n\n.fa-chart-line {\n --fa: "\\f201";\n}\n\n.fa-line-chart {\n --fa: "\\f201";\n}\n\n.fa-toggle-off {\n --fa: "\\f204";\n}\n\n.fa-toggle-on {\n --fa: "\\f205";\n}\n\n.fa-bicycle {\n --fa: "\\f206";\n}\n\n.fa-bus {\n --fa: "\\f207";\n}\n\n.fa-closed-captioning {\n --fa: "\\f20a";\n}\n\n.fa-shekel-sign {\n --fa: "\\f20b";\n}\n\n.fa-ils {\n --fa: "\\f20b";\n}\n\n.fa-shekel {\n --fa: "\\f20b";\n}\n\n.fa-sheqel {\n --fa: "\\f20b";\n}\n\n.fa-sheqel-sign {\n --fa: "\\f20b";\n}\n\n.fa-cart-plus {\n --fa: "\\f217";\n}\n\n.fa-cart-arrow-down {\n --fa: "\\f218";\n}\n\n.fa-diamond {\n --fa: "\\f219";\n}\n\n.fa-ship {\n --fa: "\\f21a";\n}\n\n.fa-user-secret {\n --fa: "\\f21b";\n}\n\n.fa-motorcycle {\n --fa: "\\f21c";\n}\n\n.fa-street-view {\n --fa: "\\f21d";\n}\n\n.fa-heart-pulse {\n --fa: "\\f21e";\n}\n\n.fa-heartbeat {\n --fa: "\\f21e";\n}\n\n.fa-venus {\n --fa: "\\f221";\n}\n\n.fa-mars {\n --fa: "\\f222";\n}\n\n.fa-mercury {\n --fa: "\\f223";\n}\n\n.fa-mars-and-venus {\n --fa: "\\f224";\n}\n\n.fa-transgender {\n --fa: "\\f225";\n}\n\n.fa-transgender-alt {\n --fa: "\\f225";\n}\n\n.fa-venus-double {\n --fa: "\\f226";\n}\n\n.fa-mars-double {\n --fa: "\\f227";\n}\n\n.fa-venus-mars {\n --fa: "\\f228";\n}\n\n.fa-mars-stroke {\n --fa: "\\f229";\n}\n\n.fa-mars-stroke-up {\n --fa: "\\f22a";\n}\n\n.fa-mars-stroke-v {\n --fa: "\\f22a";\n}\n\n.fa-mars-stroke-right {\n --fa: "\\f22b";\n}\n\n.fa-mars-stroke-h {\n --fa: "\\f22b";\n}\n\n.fa-neuter {\n --fa: "\\f22c";\n}\n\n.fa-genderless {\n --fa: "\\f22d";\n}\n\n.fa-server {\n --fa: "\\f233";\n}\n\n.fa-user-plus {\n --fa: "\\f234";\n}\n\n.fa-user-xmark {\n --fa: "\\f235";\n}\n\n.fa-user-times {\n --fa: "\\f235";\n}\n\n.fa-bed {\n --fa: "\\f236";\n}\n\n.fa-train {\n --fa: "\\f238";\n}\n\n.fa-train-subway {\n --fa: "\\f239";\n}\n\n.fa-subway {\n --fa: "\\f239";\n}\n\n.fa-battery-full {\n --fa: "\\f240";\n}\n\n.fa-battery {\n --fa: "\\f240";\n}\n\n.fa-battery-5 {\n --fa: "\\f240";\n}\n\n.fa-battery-three-quarters {\n --fa: "\\f241";\n}\n\n.fa-battery-4 {\n --fa: "\\f241";\n}\n\n.fa-battery-half {\n --fa: "\\f242";\n}\n\n.fa-battery-3 {\n --fa: "\\f242";\n}\n\n.fa-battery-quarter {\n --fa: "\\f243";\n}\n\n.fa-battery-2 {\n --fa: "\\f243";\n}\n\n.fa-battery-empty {\n --fa: "\\f244";\n}\n\n.fa-battery-0 {\n --fa: "\\f244";\n}\n\n.fa-arrow-pointer {\n --fa: "\\f245";\n}\n\n.fa-mouse-pointer {\n --fa: "\\f245";\n}\n\n.fa-i-cursor {\n --fa: "\\f246";\n}\n\n.fa-object-group {\n --fa: "\\f247";\n}\n\n.fa-object-ungroup {\n --fa: "\\f248";\n}\n\n.fa-note-sticky {\n --fa: "\\f249";\n}\n\n.fa-sticky-note {\n --fa: "\\f249";\n}\n\n.fa-clone {\n --fa: "\\f24d";\n}\n\n.fa-scale-balanced {\n --fa: "\\f24e";\n}\n\n.fa-balance-scale {\n --fa: "\\f24e";\n}\n\n.fa-hourglass-start {\n --fa: "\\f251";\n}\n\n.fa-hourglass-1 {\n --fa: "\\f251";\n}\n\n.fa-hourglass-half {\n --fa: "\\f252";\n}\n\n.fa-hourglass-2 {\n --fa: "\\f252";\n}\n\n.fa-hourglass-end {\n --fa: "\\f253";\n}\n\n.fa-hourglass-3 {\n --fa: "\\f253";\n}\n\n.fa-hourglass {\n --fa: "\\f254";\n}\n\n.fa-hourglass-empty {\n --fa: "\\f254";\n}\n\n.fa-hand-back-fist {\n --fa: "\\f255";\n}\n\n.fa-hand-rock {\n --fa: "\\f255";\n}\n\n.fa-hand {\n --fa: "\\f256";\n}\n\n.fa-hand-paper {\n --fa: "\\f256";\n}\n\n.fa-hand-scissors {\n --fa: "\\f257";\n}\n\n.fa-hand-lizard {\n --fa: "\\f258";\n}\n\n.fa-hand-spock {\n --fa: "\\f259";\n}\n\n.fa-hand-pointer {\n --fa: "\\f25a";\n}\n\n.fa-hand-peace {\n --fa: "\\f25b";\n}\n\n.fa-trademark {\n --fa: "\\f25c";\n}\n\n.fa-registered {\n --fa: "\\f25d";\n}\n\n.fa-tv {\n --fa: "\\f26c";\n}\n\n.fa-television {\n --fa: "\\f26c";\n}\n\n.fa-tv-alt {\n --fa: "\\f26c";\n}\n\n.fa-calendar-plus {\n --fa: "\\f271";\n}\n\n.fa-calendar-minus {\n --fa: "\\f272";\n}\n\n.fa-calendar-xmark {\n --fa: "\\f273";\n}\n\n.fa-calendar-times {\n --fa: "\\f273";\n}\n\n.fa-calendar-check {\n --fa: "\\f274";\n}\n\n.fa-industry {\n --fa: "\\f275";\n}\n\n.fa-map-pin {\n --fa: "\\f276";\n}\n\n.fa-signs-post {\n --fa: "\\f277";\n}\n\n.fa-map-signs {\n --fa: "\\f277";\n}\n\n.fa-map {\n --fa: "\\f279";\n}\n\n.fa-message {\n --fa: "\\f27a";\n}\n\n.fa-comment-alt {\n --fa: "\\f27a";\n}\n\n.fa-circle-pause {\n --fa: "\\f28b";\n}\n\n.fa-pause-circle {\n --fa: "\\f28b";\n}\n\n.fa-circle-stop {\n --fa: "\\f28d";\n}\n\n.fa-stop-circle {\n --fa: "\\f28d";\n}\n\n.fa-bag-shopping {\n --fa: "\\f290";\n}\n\n.fa-shopping-bag {\n --fa: "\\f290";\n}\n\n.fa-basket-shopping {\n --fa: "\\f291";\n}\n\n.fa-shopping-basket {\n --fa: "\\f291";\n}\n\n.fa-universal-access {\n --fa: "\\f29a";\n}\n\n.fa-person-walking-with-cane {\n --fa: "\\f29d";\n}\n\n.fa-blind {\n --fa: "\\f29d";\n}\n\n.fa-audio-description {\n --fa: "\\f29e";\n}\n\n.fa-phone-volume {\n --fa: "\\f2a0";\n}\n\n.fa-volume-control-phone {\n --fa: "\\f2a0";\n}\n\n.fa-braille {\n --fa: "\\f2a1";\n}\n\n.fa-ear-listen {\n --fa: "\\f2a2";\n}\n\n.fa-assistive-listening-systems {\n --fa: "\\f2a2";\n}\n\n.fa-hands-asl-interpreting {\n --fa: "\\f2a3";\n}\n\n.fa-american-sign-language-interpreting {\n --fa: "\\f2a3";\n}\n\n.fa-asl-interpreting {\n --fa: "\\f2a3";\n}\n\n.fa-hands-american-sign-language-interpreting {\n --fa: "\\f2a3";\n}\n\n.fa-ear-deaf {\n --fa: "\\f2a4";\n}\n\n.fa-deaf {\n --fa: "\\f2a4";\n}\n\n.fa-deafness {\n --fa: "\\f2a4";\n}\n\n.fa-hard-of-hearing {\n --fa: "\\f2a4";\n}\n\n.fa-hands {\n --fa: "\\f2a7";\n}\n\n.fa-sign-language {\n --fa: "\\f2a7";\n}\n\n.fa-signing {\n --fa: "\\f2a7";\n}\n\n.fa-eye-low-vision {\n --fa: "\\f2a8";\n}\n\n.fa-low-vision {\n --fa: "\\f2a8";\n}\n\n.fa-font-awesome {\n --fa: "\\f2b4";\n}\n\n.fa-font-awesome-flag {\n --fa: "\\f2b4";\n}\n\n.fa-font-awesome-logo-full {\n --fa: "\\f2b4";\n}\n\n.fa-handshake {\n --fa: "\\f2b5";\n}\n\n.fa-handshake-alt {\n --fa: "\\f2b5";\n}\n\n.fa-handshake-simple {\n --fa: "\\f2b5";\n}\n\n.fa-envelope-open {\n --fa: "\\f2b6";\n}\n\n.fa-address-book {\n --fa: "\\f2b9";\n}\n\n.fa-contact-book {\n --fa: "\\f2b9";\n}\n\n.fa-address-card {\n --fa: "\\f2bb";\n}\n\n.fa-contact-card {\n --fa: "\\f2bb";\n}\n\n.fa-vcard {\n --fa: "\\f2bb";\n}\n\n.fa-circle-user {\n --fa: "\\f2bd";\n}\n\n.fa-user-circle {\n --fa: "\\f2bd";\n}\n\n.fa-id-badge {\n --fa: "\\f2c1";\n}\n\n.fa-id-card {\n --fa: "\\f2c2";\n}\n\n.fa-drivers-license {\n --fa: "\\f2c2";\n}\n\n.fa-temperature-full {\n --fa: "\\f2c7";\n}\n\n.fa-temperature-4 {\n --fa: "\\f2c7";\n}\n\n.fa-thermometer-4 {\n --fa: "\\f2c7";\n}\n\n.fa-thermometer-full {\n --fa: "\\f2c7";\n}\n\n.fa-temperature-three-quarters {\n --fa: "\\f2c8";\n}\n\n.fa-temperature-3 {\n --fa: "\\f2c8";\n}\n\n.fa-thermometer-3 {\n --fa: "\\f2c8";\n}\n\n.fa-thermometer-three-quarters {\n --fa: "\\f2c8";\n}\n\n.fa-temperature-half {\n --fa: "\\f2c9";\n}\n\n.fa-temperature-2 {\n --fa: "\\f2c9";\n}\n\n.fa-thermometer-2 {\n --fa: "\\f2c9";\n}\n\n.fa-thermometer-half {\n --fa: "\\f2c9";\n}\n\n.fa-temperature-quarter {\n --fa: "\\f2ca";\n}\n\n.fa-temperature-1 {\n --fa: "\\f2ca";\n}\n\n.fa-thermometer-1 {\n --fa: "\\f2ca";\n}\n\n.fa-thermometer-quarter {\n --fa: "\\f2ca";\n}\n\n.fa-temperature-empty {\n --fa: "\\f2cb";\n}\n\n.fa-temperature-0 {\n --fa: "\\f2cb";\n}\n\n.fa-thermometer-0 {\n --fa: "\\f2cb";\n}\n\n.fa-thermometer-empty {\n --fa: "\\f2cb";\n}\n\n.fa-shower {\n --fa: "\\f2cc";\n}\n\n.fa-bath {\n --fa: "\\f2cd";\n}\n\n.fa-bathtub {\n --fa: "\\f2cd";\n}\n\n.fa-podcast {\n --fa: "\\f2ce";\n}\n\n.fa-window-maximize {\n --fa: "\\f2d0";\n}\n\n.fa-window-minimize {\n --fa: "\\f2d1";\n}\n\n.fa-window-restore {\n --fa: "\\f2d2";\n}\n\n.fa-square-xmark {\n --fa: "\\f2d3";\n}\n\n.fa-times-square {\n --fa: "\\f2d3";\n}\n\n.fa-xmark-square {\n --fa: "\\f2d3";\n}\n\n.fa-microchip {\n --fa: "\\f2db";\n}\n\n.fa-snowflake {\n --fa: "\\f2dc";\n}\n\n.fa-spoon {\n --fa: "\\f2e5";\n}\n\n.fa-utensil-spoon {\n --fa: "\\f2e5";\n}\n\n.fa-utensils {\n --fa: "\\f2e7";\n}\n\n.fa-cutlery {\n --fa: "\\f2e7";\n}\n\n.fa-rotate-left {\n --fa: "\\f2ea";\n}\n\n.fa-rotate-back {\n --fa: "\\f2ea";\n}\n\n.fa-rotate-backward {\n --fa: "\\f2ea";\n}\n\n.fa-undo-alt {\n --fa: "\\f2ea";\n}\n\n.fa-trash-can {\n --fa: "\\f2ed";\n}\n\n.fa-trash-alt {\n --fa: "\\f2ed";\n}\n\n.fa-rotate {\n --fa: "\\f2f1";\n}\n\n.fa-sync-alt {\n --fa: "\\f2f1";\n}\n\n.fa-stopwatch {\n --fa: "\\f2f2";\n}\n\n.fa-right-from-bracket {\n --fa: "\\f2f5";\n}\n\n.fa-sign-out-alt {\n --fa: "\\f2f5";\n}\n\n.fa-right-to-bracket {\n --fa: "\\f2f6";\n}\n\n.fa-sign-in-alt {\n --fa: "\\f2f6";\n}\n\n.fa-rotate-right {\n --fa: "\\f2f9";\n}\n\n.fa-redo-alt {\n --fa: "\\f2f9";\n}\n\n.fa-rotate-forward {\n --fa: "\\f2f9";\n}\n\n.fa-poo {\n --fa: "\\f2fe";\n}\n\n.fa-images {\n --fa: "\\f302";\n}\n\n.fa-pencil {\n --fa: "\\f303";\n}\n\n.fa-pencil-alt {\n --fa: "\\f303";\n}\n\n.fa-pen {\n --fa: "\\f304";\n}\n\n.fa-pen-clip {\n --fa: "\\f305";\n}\n\n.fa-pen-alt {\n --fa: "\\f305";\n}\n\n.fa-octagon {\n --fa: "\\f306";\n}\n\n.fa-down-long {\n --fa: "\\f309";\n}\n\n.fa-long-arrow-alt-down {\n --fa: "\\f309";\n}\n\n.fa-left-long {\n --fa: "\\f30a";\n}\n\n.fa-long-arrow-alt-left {\n --fa: "\\f30a";\n}\n\n.fa-right-long {\n --fa: "\\f30b";\n}\n\n.fa-long-arrow-alt-right {\n --fa: "\\f30b";\n}\n\n.fa-up-long {\n --fa: "\\f30c";\n}\n\n.fa-long-arrow-alt-up {\n --fa: "\\f30c";\n}\n\n.fa-hexagon {\n --fa: "\\f312";\n}\n\n.fa-file-pen {\n --fa: "\\f31c";\n}\n\n.fa-file-edit {\n --fa: "\\f31c";\n}\n\n.fa-maximize {\n --fa: "\\f31e";\n}\n\n.fa-expand-arrows-alt {\n --fa: "\\f31e";\n}\n\n.fa-clipboard {\n --fa: "\\f328";\n}\n\n.fa-left-right {\n --fa: "\\f337";\n}\n\n.fa-arrows-alt-h {\n --fa: "\\f337";\n}\n\n.fa-up-down {\n --fa: "\\f338";\n}\n\n.fa-arrows-alt-v {\n --fa: "\\f338";\n}\n\n.fa-alarm-clock {\n --fa: "\\f34e";\n}\n\n.fa-circle-down {\n --fa: "\\f358";\n}\n\n.fa-arrow-alt-circle-down {\n --fa: "\\f358";\n}\n\n.fa-circle-left {\n --fa: "\\f359";\n}\n\n.fa-arrow-alt-circle-left {\n --fa: "\\f359";\n}\n\n.fa-circle-right {\n --fa: "\\f35a";\n}\n\n.fa-arrow-alt-circle-right {\n --fa: "\\f35a";\n}\n\n.fa-circle-up {\n --fa: "\\f35b";\n}\n\n.fa-arrow-alt-circle-up {\n --fa: "\\f35b";\n}\n\n.fa-up-right-from-square {\n --fa: "\\f35d";\n}\n\n.fa-external-link-alt {\n --fa: "\\f35d";\n}\n\n.fa-square-up-right {\n --fa: "\\f360";\n}\n\n.fa-external-link-square-alt {\n --fa: "\\f360";\n}\n\n.fa-right-left {\n --fa: "\\f362";\n}\n\n.fa-exchange-alt {\n --fa: "\\f362";\n}\n\n.fa-repeat {\n --fa: "\\f363";\n}\n\n.fa-code-commit {\n --fa: "\\f386";\n}\n\n.fa-code-merge {\n --fa: "\\f387";\n}\n\n.fa-desktop {\n --fa: "\\f390";\n}\n\n.fa-desktop-alt {\n --fa: "\\f390";\n}\n\n.fa-gem {\n --fa: "\\f3a5";\n}\n\n.fa-turn-down {\n --fa: "\\f3be";\n}\n\n.fa-level-down-alt {\n --fa: "\\f3be";\n}\n\n.fa-turn-up {\n --fa: "\\f3bf";\n}\n\n.fa-level-up-alt {\n --fa: "\\f3bf";\n}\n\n.fa-lock-open {\n --fa: "\\f3c1";\n}\n\n.fa-location-dot {\n --fa: "\\f3c5";\n}\n\n.fa-map-marker-alt {\n --fa: "\\f3c5";\n}\n\n.fa-microphone-lines {\n --fa: "\\f3c9";\n}\n\n.fa-microphone-alt {\n --fa: "\\f3c9";\n}\n\n.fa-mobile-screen-button {\n --fa: "\\f3cd";\n}\n\n.fa-mobile-alt {\n --fa: "\\f3cd";\n}\n\n.fa-mobile {\n --fa: "\\f3ce";\n}\n\n.fa-mobile-android {\n --fa: "\\f3ce";\n}\n\n.fa-mobile-phone {\n --fa: "\\f3ce";\n}\n\n.fa-mobile-screen {\n --fa: "\\f3cf";\n}\n\n.fa-mobile-android-alt {\n --fa: "\\f3cf";\n}\n\n.fa-money-bill-1 {\n --fa: "\\f3d1";\n}\n\n.fa-money-bill-alt {\n --fa: "\\f3d1";\n}\n\n.fa-phone-slash {\n --fa: "\\f3dd";\n}\n\n.fa-image-portrait {\n --fa: "\\f3e0";\n}\n\n.fa-portrait {\n --fa: "\\f3e0";\n}\n\n.fa-reply {\n --fa: "\\f3e5";\n}\n\n.fa-mail-reply {\n --fa: "\\f3e5";\n}\n\n.fa-shield-halved {\n --fa: "\\f3ed";\n}\n\n.fa-shield-alt {\n --fa: "\\f3ed";\n}\n\n.fa-tablet-screen-button {\n --fa: "\\f3fa";\n}\n\n.fa-tablet-alt {\n --fa: "\\f3fa";\n}\n\n.fa-tablet {\n --fa: "\\f3fb";\n}\n\n.fa-tablet-android {\n --fa: "\\f3fb";\n}\n\n.fa-ticket-simple {\n --fa: "\\f3ff";\n}\n\n.fa-ticket-alt {\n --fa: "\\f3ff";\n}\n\n.fa-rectangle-xmark {\n --fa: "\\f410";\n}\n\n.fa-rectangle-times {\n --fa: "\\f410";\n}\n\n.fa-times-rectangle {\n --fa: "\\f410";\n}\n\n.fa-window-close {\n --fa: "\\f410";\n}\n\n.fa-down-left-and-up-right-to-center {\n --fa: "\\f422";\n}\n\n.fa-compress-alt {\n --fa: "\\f422";\n}\n\n.fa-up-right-and-down-left-from-center {\n --fa: "\\f424";\n}\n\n.fa-expand-alt {\n --fa: "\\f424";\n}\n\n.fa-baseball-bat-ball {\n --fa: "\\f432";\n}\n\n.fa-baseball {\n --fa: "\\f433";\n}\n\n.fa-baseball-ball {\n --fa: "\\f433";\n}\n\n.fa-basketball {\n --fa: "\\f434";\n}\n\n.fa-basketball-ball {\n --fa: "\\f434";\n}\n\n.fa-bowling-ball {\n --fa: "\\f436";\n}\n\n.fa-chess {\n --fa: "\\f439";\n}\n\n.fa-chess-bishop {\n --fa: "\\f43a";\n}\n\n.fa-chess-board {\n --fa: "\\f43c";\n}\n\n.fa-chess-king {\n --fa: "\\f43f";\n}\n\n.fa-chess-knight {\n --fa: "\\f441";\n}\n\n.fa-chess-pawn {\n --fa: "\\f443";\n}\n\n.fa-chess-queen {\n --fa: "\\f445";\n}\n\n.fa-chess-rook {\n --fa: "\\f447";\n}\n\n.fa-dumbbell {\n --fa: "\\f44b";\n}\n\n.fa-football {\n --fa: "\\f44e";\n}\n\n.fa-football-ball {\n --fa: "\\f44e";\n}\n\n.fa-golf-ball-tee {\n --fa: "\\f450";\n}\n\n.fa-golf-ball {\n --fa: "\\f450";\n}\n\n.fa-hockey-puck {\n --fa: "\\f453";\n}\n\n.fa-broom-ball {\n --fa: "\\f458";\n}\n\n.fa-quidditch {\n --fa: "\\f458";\n}\n\n.fa-quidditch-broom-ball {\n --fa: "\\f458";\n}\n\n.fa-square-full {\n --fa: "\\f45c";\n}\n\n.fa-table-tennis-paddle-ball {\n --fa: "\\f45d";\n}\n\n.fa-ping-pong-paddle-ball {\n --fa: "\\f45d";\n}\n\n.fa-table-tennis {\n --fa: "\\f45d";\n}\n\n.fa-volleyball {\n --fa: "\\f45f";\n}\n\n.fa-volleyball-ball {\n --fa: "\\f45f";\n}\n\n.fa-hand-dots {\n --fa: "\\f461";\n}\n\n.fa-allergies {\n --fa: "\\f461";\n}\n\n.fa-bandage {\n --fa: "\\f462";\n}\n\n.fa-band-aid {\n --fa: "\\f462";\n}\n\n.fa-box {\n --fa: "\\f466";\n}\n\n.fa-boxes-stacked {\n --fa: "\\f468";\n}\n\n.fa-boxes {\n --fa: "\\f468";\n}\n\n.fa-boxes-alt {\n --fa: "\\f468";\n}\n\n.fa-briefcase-medical {\n --fa: "\\f469";\n}\n\n.fa-fire-flame-simple {\n --fa: "\\f46a";\n}\n\n.fa-burn {\n --fa: "\\f46a";\n}\n\n.fa-capsules {\n --fa: "\\f46b";\n}\n\n.fa-clipboard-check {\n --fa: "\\f46c";\n}\n\n.fa-clipboard-list {\n --fa: "\\f46d";\n}\n\n.fa-person-dots-from-line {\n --fa: "\\f470";\n}\n\n.fa-diagnoses {\n --fa: "\\f470";\n}\n\n.fa-dna {\n --fa: "\\f471";\n}\n\n.fa-dolly {\n --fa: "\\f472";\n}\n\n.fa-dolly-box {\n --fa: "\\f472";\n}\n\n.fa-cart-flatbed {\n --fa: "\\f474";\n}\n\n.fa-dolly-flatbed {\n --fa: "\\f474";\n}\n\n.fa-file-medical {\n --fa: "\\f477";\n}\n\n.fa-file-waveform {\n --fa: "\\f478";\n}\n\n.fa-file-medical-alt {\n --fa: "\\f478";\n}\n\n.fa-kit-medical {\n --fa: "\\f479";\n}\n\n.fa-first-aid {\n --fa: "\\f479";\n}\n\n.fa-circle-h {\n --fa: "\\f47e";\n}\n\n.fa-hospital-symbol {\n --fa: "\\f47e";\n}\n\n.fa-id-card-clip {\n --fa: "\\f47f";\n}\n\n.fa-id-card-alt {\n --fa: "\\f47f";\n}\n\n.fa-notes-medical {\n --fa: "\\f481";\n}\n\n.fa-pallet {\n --fa: "\\f482";\n}\n\n.fa-pills {\n --fa: "\\f484";\n}\n\n.fa-prescription-bottle {\n --fa: "\\f485";\n}\n\n.fa-prescription-bottle-medical {\n --fa: "\\f486";\n}\n\n.fa-prescription-bottle-alt {\n --fa: "\\f486";\n}\n\n.fa-bed-pulse {\n --fa: "\\f487";\n}\n\n.fa-procedures {\n --fa: "\\f487";\n}\n\n.fa-truck-fast {\n --fa: "\\f48b";\n}\n\n.fa-shipping-fast {\n --fa: "\\f48b";\n}\n\n.fa-smoking {\n --fa: "\\f48d";\n}\n\n.fa-syringe {\n --fa: "\\f48e";\n}\n\n.fa-tablets {\n --fa: "\\f490";\n}\n\n.fa-thermometer {\n --fa: "\\f491";\n}\n\n.fa-vial {\n --fa: "\\f492";\n}\n\n.fa-vials {\n --fa: "\\f493";\n}\n\n.fa-warehouse {\n --fa: "\\f494";\n}\n\n.fa-weight-scale {\n --fa: "\\f496";\n}\n\n.fa-weight {\n --fa: "\\f496";\n}\n\n.fa-x-ray {\n --fa: "\\f497";\n}\n\n.fa-box-open {\n --fa: "\\f49e";\n}\n\n.fa-comment-dots {\n --fa: "\\f4ad";\n}\n\n.fa-commenting {\n --fa: "\\f4ad";\n}\n\n.fa-comment-slash {\n --fa: "\\f4b3";\n}\n\n.fa-couch {\n --fa: "\\f4b8";\n}\n\n.fa-circle-dollar-to-slot {\n --fa: "\\f4b9";\n}\n\n.fa-donate {\n --fa: "\\f4b9";\n}\n\n.fa-dove {\n --fa: "\\f4ba";\n}\n\n.fa-hand-holding {\n --fa: "\\f4bd";\n}\n\n.fa-hand-holding-heart {\n --fa: "\\f4be";\n}\n\n.fa-hand-holding-dollar {\n --fa: "\\f4c0";\n}\n\n.fa-hand-holding-usd {\n --fa: "\\f4c0";\n}\n\n.fa-hand-holding-droplet {\n --fa: "\\f4c1";\n}\n\n.fa-hand-holding-water {\n --fa: "\\f4c1";\n}\n\n.fa-hands-holding {\n --fa: "\\f4c2";\n}\n\n.fa-handshake-angle {\n --fa: "\\f4c4";\n}\n\n.fa-hands-helping {\n --fa: "\\f4c4";\n}\n\n.fa-parachute-box {\n --fa: "\\f4cd";\n}\n\n.fa-people-carry-box {\n --fa: "\\f4ce";\n}\n\n.fa-people-carry {\n --fa: "\\f4ce";\n}\n\n.fa-piggy-bank {\n --fa: "\\f4d3";\n}\n\n.fa-ribbon {\n --fa: "\\f4d6";\n}\n\n.fa-route {\n --fa: "\\f4d7";\n}\n\n.fa-seedling {\n --fa: "\\f4d8";\n}\n\n.fa-sprout {\n --fa: "\\f4d8";\n}\n\n.fa-sign-hanging {\n --fa: "\\f4d9";\n}\n\n.fa-sign {\n --fa: "\\f4d9";\n}\n\n.fa-face-smile-wink {\n --fa: "\\f4da";\n}\n\n.fa-smile-wink {\n --fa: "\\f4da";\n}\n\n.fa-tape {\n --fa: "\\f4db";\n}\n\n.fa-truck-ramp-box {\n --fa: "\\f4de";\n}\n\n.fa-truck-loading {\n --fa: "\\f4de";\n}\n\n.fa-truck-moving {\n --fa: "\\f4df";\n}\n\n.fa-video-slash {\n --fa: "\\f4e2";\n}\n\n.fa-wine-glass {\n --fa: "\\f4e3";\n}\n\n.fa-user-astronaut {\n --fa: "\\f4fb";\n}\n\n.fa-user-check {\n --fa: "\\f4fc";\n}\n\n.fa-user-clock {\n --fa: "\\f4fd";\n}\n\n.fa-user-gear {\n --fa: "\\f4fe";\n}\n\n.fa-user-cog {\n --fa: "\\f4fe";\n}\n\n.fa-user-pen {\n --fa: "\\f4ff";\n}\n\n.fa-user-edit {\n --fa: "\\f4ff";\n}\n\n.fa-user-group {\n --fa: "\\f500";\n}\n\n.fa-user-friends {\n --fa: "\\f500";\n}\n\n.fa-user-graduate {\n --fa: "\\f501";\n}\n\n.fa-user-lock {\n --fa: "\\f502";\n}\n\n.fa-user-minus {\n --fa: "\\f503";\n}\n\n.fa-user-ninja {\n --fa: "\\f504";\n}\n\n.fa-user-shield {\n --fa: "\\f505";\n}\n\n.fa-user-slash {\n --fa: "\\f506";\n}\n\n.fa-user-alt-slash {\n --fa: "\\f506";\n}\n\n.fa-user-large-slash {\n --fa: "\\f506";\n}\n\n.fa-user-tag {\n --fa: "\\f507";\n}\n\n.fa-user-tie {\n --fa: "\\f508";\n}\n\n.fa-users-gear {\n --fa: "\\f509";\n}\n\n.fa-users-cog {\n --fa: "\\f509";\n}\n\n.fa-scale-unbalanced {\n --fa: "\\f515";\n}\n\n.fa-balance-scale-left {\n --fa: "\\f515";\n}\n\n.fa-scale-unbalanced-flip {\n --fa: "\\f516";\n}\n\n.fa-balance-scale-right {\n --fa: "\\f516";\n}\n\n.fa-blender {\n --fa: "\\f517";\n}\n\n.fa-book-open {\n --fa: "\\f518";\n}\n\n.fa-tower-broadcast {\n --fa: "\\f519";\n}\n\n.fa-broadcast-tower {\n --fa: "\\f519";\n}\n\n.fa-broom {\n --fa: "\\f51a";\n}\n\n.fa-chalkboard {\n --fa: "\\f51b";\n}\n\n.fa-blackboard {\n --fa: "\\f51b";\n}\n\n.fa-chalkboard-user {\n --fa: "\\f51c";\n}\n\n.fa-chalkboard-teacher {\n --fa: "\\f51c";\n}\n\n.fa-church {\n --fa: "\\f51d";\n}\n\n.fa-coins {\n --fa: "\\f51e";\n}\n\n.fa-compact-disc {\n --fa: "\\f51f";\n}\n\n.fa-crow {\n --fa: "\\f520";\n}\n\n.fa-crown {\n --fa: "\\f521";\n}\n\n.fa-dice {\n --fa: "\\f522";\n}\n\n.fa-dice-five {\n --fa: "\\f523";\n}\n\n.fa-dice-four {\n --fa: "\\f524";\n}\n\n.fa-dice-one {\n --fa: "\\f525";\n}\n\n.fa-dice-six {\n --fa: "\\f526";\n}\n\n.fa-dice-three {\n --fa: "\\f527";\n}\n\n.fa-dice-two {\n --fa: "\\f528";\n}\n\n.fa-divide {\n --fa: "\\f529";\n}\n\n.fa-door-closed {\n --fa: "\\f52a";\n}\n\n.fa-door-open {\n --fa: "\\f52b";\n}\n\n.fa-feather {\n --fa: "\\f52d";\n}\n\n.fa-frog {\n --fa: "\\f52e";\n}\n\n.fa-gas-pump {\n --fa: "\\f52f";\n}\n\n.fa-glasses {\n --fa: "\\f530";\n}\n\n.fa-greater-than-equal {\n --fa: "\\f532";\n}\n\n.fa-helicopter {\n --fa: "\\f533";\n}\n\n.fa-infinity {\n --fa: "\\f534";\n}\n\n.fa-kiwi-bird {\n --fa: "\\f535";\n}\n\n.fa-less-than-equal {\n --fa: "\\f537";\n}\n\n.fa-memory {\n --fa: "\\f538";\n}\n\n.fa-microphone-lines-slash {\n --fa: "\\f539";\n}\n\n.fa-microphone-alt-slash {\n --fa: "\\f539";\n}\n\n.fa-money-bill-wave {\n --fa: "\\f53a";\n}\n\n.fa-money-bill-1-wave {\n --fa: "\\f53b";\n}\n\n.fa-money-bill-wave-alt {\n --fa: "\\f53b";\n}\n\n.fa-money-check {\n --fa: "\\f53c";\n}\n\n.fa-money-check-dollar {\n --fa: "\\f53d";\n}\n\n.fa-money-check-alt {\n --fa: "\\f53d";\n}\n\n.fa-not-equal {\n --fa: "\\f53e";\n}\n\n.fa-palette {\n --fa: "\\f53f";\n}\n\n.fa-square-parking {\n --fa: "\\f540";\n}\n\n.fa-parking {\n --fa: "\\f540";\n}\n\n.fa-diagram-project {\n --fa: "\\f542";\n}\n\n.fa-project-diagram {\n --fa: "\\f542";\n}\n\n.fa-receipt {\n --fa: "\\f543";\n}\n\n.fa-robot {\n --fa: "\\f544";\n}\n\n.fa-ruler {\n --fa: "\\f545";\n}\n\n.fa-ruler-combined {\n --fa: "\\f546";\n}\n\n.fa-ruler-horizontal {\n --fa: "\\f547";\n}\n\n.fa-ruler-vertical {\n --fa: "\\f548";\n}\n\n.fa-school {\n --fa: "\\f549";\n}\n\n.fa-screwdriver {\n --fa: "\\f54a";\n}\n\n.fa-shoe-prints {\n --fa: "\\f54b";\n}\n\n.fa-skull {\n --fa: "\\f54c";\n}\n\n.fa-ban-smoking {\n --fa: "\\f54d";\n}\n\n.fa-smoking-ban {\n --fa: "\\f54d";\n}\n\n.fa-store {\n --fa: "\\f54e";\n}\n\n.fa-shop {\n --fa: "\\f54f";\n}\n\n.fa-store-alt {\n --fa: "\\f54f";\n}\n\n.fa-bars-staggered {\n --fa: "\\f550";\n}\n\n.fa-reorder {\n --fa: "\\f550";\n}\n\n.fa-stream {\n --fa: "\\f550";\n}\n\n.fa-stroopwafel {\n --fa: "\\f551";\n}\n\n.fa-toolbox {\n --fa: "\\f552";\n}\n\n.fa-shirt {\n --fa: "\\f553";\n}\n\n.fa-t-shirt {\n --fa: "\\f553";\n}\n\n.fa-tshirt {\n --fa: "\\f553";\n}\n\n.fa-person-walking {\n --fa: "\\f554";\n}\n\n.fa-walking {\n --fa: "\\f554";\n}\n\n.fa-wallet {\n --fa: "\\f555";\n}\n\n.fa-face-angry {\n --fa: "\\f556";\n}\n\n.fa-angry {\n --fa: "\\f556";\n}\n\n.fa-archway {\n --fa: "\\f557";\n}\n\n.fa-book-atlas {\n --fa: "\\f558";\n}\n\n.fa-atlas {\n --fa: "\\f558";\n}\n\n.fa-award {\n --fa: "\\f559";\n}\n\n.fa-delete-left {\n --fa: "\\f55a";\n}\n\n.fa-backspace {\n --fa: "\\f55a";\n}\n\n.fa-bezier-curve {\n --fa: "\\f55b";\n}\n\n.fa-bong {\n --fa: "\\f55c";\n}\n\n.fa-brush {\n --fa: "\\f55d";\n}\n\n.fa-bus-simple {\n --fa: "\\f55e";\n}\n\n.fa-bus-alt {\n --fa: "\\f55e";\n}\n\n.fa-cannabis {\n --fa: "\\f55f";\n}\n\n.fa-check-double {\n --fa: "\\f560";\n}\n\n.fa-martini-glass-citrus {\n --fa: "\\f561";\n}\n\n.fa-cocktail {\n --fa: "\\f561";\n}\n\n.fa-bell-concierge {\n --fa: "\\f562";\n}\n\n.fa-concierge-bell {\n --fa: "\\f562";\n}\n\n.fa-cookie {\n --fa: "\\f563";\n}\n\n.fa-cookie-bite {\n --fa: "\\f564";\n}\n\n.fa-crop-simple {\n --fa: "\\f565";\n}\n\n.fa-crop-alt {\n --fa: "\\f565";\n}\n\n.fa-tachograph-digital {\n --fa: "\\f566";\n}\n\n.fa-digital-tachograph {\n --fa: "\\f566";\n}\n\n.fa-face-dizzy {\n --fa: "\\f567";\n}\n\n.fa-dizzy {\n --fa: "\\f567";\n}\n\n.fa-compass-drafting {\n --fa: "\\f568";\n}\n\n.fa-drafting-compass {\n --fa: "\\f568";\n}\n\n.fa-drum {\n --fa: "\\f569";\n}\n\n.fa-drum-steelpan {\n --fa: "\\f56a";\n}\n\n.fa-feather-pointed {\n --fa: "\\f56b";\n}\n\n.fa-feather-alt {\n --fa: "\\f56b";\n}\n\n.fa-file-contract {\n --fa: "\\f56c";\n}\n\n.fa-file-arrow-down {\n --fa: "\\f56d";\n}\n\n.fa-file-download {\n --fa: "\\f56d";\n}\n\n.fa-file-export {\n --fa: "\\f56e";\n}\n\n.fa-arrow-right-from-file {\n --fa: "\\f56e";\n}\n\n.fa-file-import {\n --fa: "\\f56f";\n}\n\n.fa-arrow-right-to-file {\n --fa: "\\f56f";\n}\n\n.fa-file-invoice {\n --fa: "\\f570";\n}\n\n.fa-file-invoice-dollar {\n --fa: "\\f571";\n}\n\n.fa-file-prescription {\n --fa: "\\f572";\n}\n\n.fa-file-signature {\n --fa: "\\f573";\n}\n\n.fa-file-arrow-up {\n --fa: "\\f574";\n}\n\n.fa-file-upload {\n --fa: "\\f574";\n}\n\n.fa-fill {\n --fa: "\\f575";\n}\n\n.fa-fill-drip {\n --fa: "\\f576";\n}\n\n.fa-fingerprint {\n --fa: "\\f577";\n}\n\n.fa-fish {\n --fa: "\\f578";\n}\n\n.fa-face-flushed {\n --fa: "\\f579";\n}\n\n.fa-flushed {\n --fa: "\\f579";\n}\n\n.fa-face-frown-open {\n --fa: "\\f57a";\n}\n\n.fa-frown-open {\n --fa: "\\f57a";\n}\n\n.fa-martini-glass {\n --fa: "\\f57b";\n}\n\n.fa-glass-martini-alt {\n --fa: "\\f57b";\n}\n\n.fa-earth-africa {\n --fa: "\\f57c";\n}\n\n.fa-globe-africa {\n --fa: "\\f57c";\n}\n\n.fa-earth-americas {\n --fa: "\\f57d";\n}\n\n.fa-earth {\n --fa: "\\f57d";\n}\n\n.fa-earth-america {\n --fa: "\\f57d";\n}\n\n.fa-globe-americas {\n --fa: "\\f57d";\n}\n\n.fa-earth-asia {\n --fa: "\\f57e";\n}\n\n.fa-globe-asia {\n --fa: "\\f57e";\n}\n\n.fa-face-grimace {\n --fa: "\\f57f";\n}\n\n.fa-grimace {\n --fa: "\\f57f";\n}\n\n.fa-face-grin {\n --fa: "\\f580";\n}\n\n.fa-grin {\n --fa: "\\f580";\n}\n\n.fa-face-grin-wide {\n --fa: "\\f581";\n}\n\n.fa-grin-alt {\n --fa: "\\f581";\n}\n\n.fa-face-grin-beam {\n --fa: "\\f582";\n}\n\n.fa-grin-beam {\n --fa: "\\f582";\n}\n\n.fa-face-grin-beam-sweat {\n --fa: "\\f583";\n}\n\n.fa-grin-beam-sweat {\n --fa: "\\f583";\n}\n\n.fa-face-grin-hearts {\n --fa: "\\f584";\n}\n\n.fa-grin-hearts {\n --fa: "\\f584";\n}\n\n.fa-face-grin-squint {\n --fa: "\\f585";\n}\n\n.fa-grin-squint {\n --fa: "\\f585";\n}\n\n.fa-face-grin-squint-tears {\n --fa: "\\f586";\n}\n\n.fa-grin-squint-tears {\n --fa: "\\f586";\n}\n\n.fa-face-grin-stars {\n --fa: "\\f587";\n}\n\n.fa-grin-stars {\n --fa: "\\f587";\n}\n\n.fa-face-grin-tears {\n --fa: "\\f588";\n}\n\n.fa-grin-tears {\n --fa: "\\f588";\n}\n\n.fa-face-grin-tongue {\n --fa: "\\f589";\n}\n\n.fa-grin-tongue {\n --fa: "\\f589";\n}\n\n.fa-face-grin-tongue-squint {\n --fa: "\\f58a";\n}\n\n.fa-grin-tongue-squint {\n --fa: "\\f58a";\n}\n\n.fa-face-grin-tongue-wink {\n --fa: "\\f58b";\n}\n\n.fa-grin-tongue-wink {\n --fa: "\\f58b";\n}\n\n.fa-face-grin-wink {\n --fa: "\\f58c";\n}\n\n.fa-grin-wink {\n --fa: "\\f58c";\n}\n\n.fa-grip {\n --fa: "\\f58d";\n}\n\n.fa-grid-horizontal {\n --fa: "\\f58d";\n}\n\n.fa-grip-horizontal {\n --fa: "\\f58d";\n}\n\n.fa-grip-vertical {\n --fa: "\\f58e";\n}\n\n.fa-grid-vertical {\n --fa: "\\f58e";\n}\n\n.fa-headset {\n --fa: "\\f590";\n}\n\n.fa-highlighter {\n --fa: "\\f591";\n}\n\n.fa-hot-tub-person {\n --fa: "\\f593";\n}\n\n.fa-hot-tub {\n --fa: "\\f593";\n}\n\n.fa-hotel {\n --fa: "\\f594";\n}\n\n.fa-joint {\n --fa: "\\f595";\n}\n\n.fa-face-kiss {\n --fa: "\\f596";\n}\n\n.fa-kiss {\n --fa: "\\f596";\n}\n\n.fa-face-kiss-beam {\n --fa: "\\f597";\n}\n\n.fa-kiss-beam {\n --fa: "\\f597";\n}\n\n.fa-face-kiss-wink-heart {\n --fa: "\\f598";\n}\n\n.fa-kiss-wink-heart {\n --fa: "\\f598";\n}\n\n.fa-face-laugh {\n --fa: "\\f599";\n}\n\n.fa-laugh {\n --fa: "\\f599";\n}\n\n.fa-face-laugh-beam {\n --fa: "\\f59a";\n}\n\n.fa-laugh-beam {\n --fa: "\\f59a";\n}\n\n.fa-face-laugh-squint {\n --fa: "\\f59b";\n}\n\n.fa-laugh-squint {\n --fa: "\\f59b";\n}\n\n.fa-face-laugh-wink {\n --fa: "\\f59c";\n}\n\n.fa-laugh-wink {\n --fa: "\\f59c";\n}\n\n.fa-cart-flatbed-suitcase {\n --fa: "\\f59d";\n}\n\n.fa-luggage-cart {\n --fa: "\\f59d";\n}\n\n.fa-map-location {\n --fa: "\\f59f";\n}\n\n.fa-map-marked {\n --fa: "\\f59f";\n}\n\n.fa-map-location-dot {\n --fa: "\\f5a0";\n}\n\n.fa-map-marked-alt {\n --fa: "\\f5a0";\n}\n\n.fa-marker {\n --fa: "\\f5a1";\n}\n\n.fa-medal {\n --fa: "\\f5a2";\n}\n\n.fa-face-meh-blank {\n --fa: "\\f5a4";\n}\n\n.fa-meh-blank {\n --fa: "\\f5a4";\n}\n\n.fa-face-rolling-eyes {\n --fa: "\\f5a5";\n}\n\n.fa-meh-rolling-eyes {\n --fa: "\\f5a5";\n}\n\n.fa-monument {\n --fa: "\\f5a6";\n}\n\n.fa-mortar-pestle {\n --fa: "\\f5a7";\n}\n\n.fa-paint-roller {\n --fa: "\\f5aa";\n}\n\n.fa-passport {\n --fa: "\\f5ab";\n}\n\n.fa-pen-fancy {\n --fa: "\\f5ac";\n}\n\n.fa-pen-nib {\n --fa: "\\f5ad";\n}\n\n.fa-pen-ruler {\n --fa: "\\f5ae";\n}\n\n.fa-pencil-ruler {\n --fa: "\\f5ae";\n}\n\n.fa-plane-arrival {\n --fa: "\\f5af";\n}\n\n.fa-plane-departure {\n --fa: "\\f5b0";\n}\n\n.fa-prescription {\n --fa: "\\f5b1";\n}\n\n.fa-face-sad-cry {\n --fa: "\\f5b3";\n}\n\n.fa-sad-cry {\n --fa: "\\f5b3";\n}\n\n.fa-face-sad-tear {\n --fa: "\\f5b4";\n}\n\n.fa-sad-tear {\n --fa: "\\f5b4";\n}\n\n.fa-van-shuttle {\n --fa: "\\f5b6";\n}\n\n.fa-shuttle-van {\n --fa: "\\f5b6";\n}\n\n.fa-signature {\n --fa: "\\f5b7";\n}\n\n.fa-face-smile-beam {\n --fa: "\\f5b8";\n}\n\n.fa-smile-beam {\n --fa: "\\f5b8";\n}\n\n.fa-solar-panel {\n --fa: "\\f5ba";\n}\n\n.fa-spa {\n --fa: "\\f5bb";\n}\n\n.fa-lotus {\n --fa: "\\f5bb";\n}\n\n.fa-splotch {\n --fa: "\\f5bc";\n}\n\n.fa-spray-can {\n --fa: "\\f5bd";\n}\n\n.fa-stamp {\n --fa: "\\f5bf";\n}\n\n.fa-star-half-stroke {\n --fa: "\\f5c0";\n}\n\n.fa-star-half-alt {\n --fa: "\\f5c0";\n}\n\n.fa-suitcase-rolling {\n --fa: "\\f5c1";\n}\n\n.fa-face-surprise {\n --fa: "\\f5c2";\n}\n\n.fa-surprise {\n --fa: "\\f5c2";\n}\n\n.fa-swatchbook {\n --fa: "\\f5c3";\n}\n\n.fa-person-swimming {\n --fa: "\\f5c4";\n}\n\n.fa-swimmer {\n --fa: "\\f5c4";\n}\n\n.fa-water-ladder {\n --fa: "\\f5c5";\n}\n\n.fa-ladder-water {\n --fa: "\\f5c5";\n}\n\n.fa-swimming-pool {\n --fa: "\\f5c5";\n}\n\n.fa-droplet-slash {\n --fa: "\\f5c7";\n}\n\n.fa-tint-slash {\n --fa: "\\f5c7";\n}\n\n.fa-face-tired {\n --fa: "\\f5c8";\n}\n\n.fa-tired {\n --fa: "\\f5c8";\n}\n\n.fa-tooth {\n --fa: "\\f5c9";\n}\n\n.fa-umbrella-beach {\n --fa: "\\f5ca";\n}\n\n.fa-weight-hanging {\n --fa: "\\f5cd";\n}\n\n.fa-wine-glass-empty {\n --fa: "\\f5ce";\n}\n\n.fa-wine-glass-alt {\n --fa: "\\f5ce";\n}\n\n.fa-spray-can-sparkles {\n --fa: "\\f5d0";\n}\n\n.fa-air-freshener {\n --fa: "\\f5d0";\n}\n\n.fa-apple-whole {\n --fa: "\\f5d1";\n}\n\n.fa-apple-alt {\n --fa: "\\f5d1";\n}\n\n.fa-atom {\n --fa: "\\f5d2";\n}\n\n.fa-bone {\n --fa: "\\f5d7";\n}\n\n.fa-book-open-reader {\n --fa: "\\f5da";\n}\n\n.fa-book-reader {\n --fa: "\\f5da";\n}\n\n.fa-brain {\n --fa: "\\f5dc";\n}\n\n.fa-car-rear {\n --fa: "\\f5de";\n}\n\n.fa-car-alt {\n --fa: "\\f5de";\n}\n\n.fa-car-battery {\n --fa: "\\f5df";\n}\n\n.fa-battery-car {\n --fa: "\\f5df";\n}\n\n.fa-car-burst {\n --fa: "\\f5e1";\n}\n\n.fa-car-crash {\n --fa: "\\f5e1";\n}\n\n.fa-car-side {\n --fa: "\\f5e4";\n}\n\n.fa-charging-station {\n --fa: "\\f5e7";\n}\n\n.fa-diamond-turn-right {\n --fa: "\\f5eb";\n}\n\n.fa-directions {\n --fa: "\\f5eb";\n}\n\n.fa-draw-polygon {\n --fa: "\\f5ee";\n}\n\n.fa-vector-polygon {\n --fa: "\\f5ee";\n}\n\n.fa-laptop-code {\n --fa: "\\f5fc";\n}\n\n.fa-layer-group {\n --fa: "\\f5fd";\n}\n\n.fa-location-crosshairs {\n --fa: "\\f601";\n}\n\n.fa-location {\n --fa: "\\f601";\n}\n\n.fa-lungs {\n --fa: "\\f604";\n}\n\n.fa-microscope {\n --fa: "\\f610";\n}\n\n.fa-oil-can {\n --fa: "\\f613";\n}\n\n.fa-poop {\n --fa: "\\f619";\n}\n\n.fa-shapes {\n --fa: "\\f61f";\n}\n\n.fa-triangle-circle-square {\n --fa: "\\f61f";\n}\n\n.fa-star-of-life {\n --fa: "\\f621";\n}\n\n.fa-gauge {\n --fa: "\\f624";\n}\n\n.fa-dashboard {\n --fa: "\\f624";\n}\n\n.fa-gauge-med {\n --fa: "\\f624";\n}\n\n.fa-tachometer-alt-average {\n --fa: "\\f624";\n}\n\n.fa-gauge-high {\n --fa: "\\f625";\n}\n\n.fa-tachometer-alt {\n --fa: "\\f625";\n}\n\n.fa-tachometer-alt-fast {\n --fa: "\\f625";\n}\n\n.fa-gauge-simple {\n --fa: "\\f629";\n}\n\n.fa-gauge-simple-med {\n --fa: "\\f629";\n}\n\n.fa-tachometer-average {\n --fa: "\\f629";\n}\n\n.fa-gauge-simple-high {\n --fa: "\\f62a";\n}\n\n.fa-tachometer {\n --fa: "\\f62a";\n}\n\n.fa-tachometer-fast {\n --fa: "\\f62a";\n}\n\n.fa-teeth {\n --fa: "\\f62e";\n}\n\n.fa-teeth-open {\n --fa: "\\f62f";\n}\n\n.fa-masks-theater {\n --fa: "\\f630";\n}\n\n.fa-theater-masks {\n --fa: "\\f630";\n}\n\n.fa-traffic-light {\n --fa: "\\f637";\n}\n\n.fa-truck-monster {\n --fa: "\\f63b";\n}\n\n.fa-truck-pickup {\n --fa: "\\f63c";\n}\n\n.fa-rectangle-ad {\n --fa: "\\f641";\n}\n\n.fa-ad {\n --fa: "\\f641";\n}\n\n.fa-ankh {\n --fa: "\\f644";\n}\n\n.fa-book-bible {\n --fa: "\\f647";\n}\n\n.fa-bible {\n --fa: "\\f647";\n}\n\n.fa-business-time {\n --fa: "\\f64a";\n}\n\n.fa-briefcase-clock {\n --fa: "\\f64a";\n}\n\n.fa-city {\n --fa: "\\f64f";\n}\n\n.fa-comment-dollar {\n --fa: "\\f651";\n}\n\n.fa-comments-dollar {\n --fa: "\\f653";\n}\n\n.fa-cross {\n --fa: "\\f654";\n}\n\n.fa-dharmachakra {\n --fa: "\\f655";\n}\n\n.fa-envelope-open-text {\n --fa: "\\f658";\n}\n\n.fa-folder-minus {\n --fa: "\\f65d";\n}\n\n.fa-folder-plus {\n --fa: "\\f65e";\n}\n\n.fa-filter-circle-dollar {\n --fa: "\\f662";\n}\n\n.fa-funnel-dollar {\n --fa: "\\f662";\n}\n\n.fa-gopuram {\n --fa: "\\f664";\n}\n\n.fa-hamsa {\n --fa: "\\f665";\n}\n\n.fa-bahai {\n --fa: "\\f666";\n}\n\n.fa-haykal {\n --fa: "\\f666";\n}\n\n.fa-jedi {\n --fa: "\\f669";\n}\n\n.fa-book-journal-whills {\n --fa: "\\f66a";\n}\n\n.fa-journal-whills {\n --fa: "\\f66a";\n}\n\n.fa-kaaba {\n --fa: "\\f66b";\n}\n\n.fa-khanda {\n --fa: "\\f66d";\n}\n\n.fa-landmark {\n --fa: "\\f66f";\n}\n\n.fa-envelopes-bulk {\n --fa: "\\f674";\n}\n\n.fa-mail-bulk {\n --fa: "\\f674";\n}\n\n.fa-menorah {\n --fa: "\\f676";\n}\n\n.fa-mosque {\n --fa: "\\f678";\n}\n\n.fa-om {\n --fa: "\\f679";\n}\n\n.fa-spaghetti-monster-flying {\n --fa: "\\f67b";\n}\n\n.fa-pastafarianism {\n --fa: "\\f67b";\n}\n\n.fa-peace {\n --fa: "\\f67c";\n}\n\n.fa-place-of-worship {\n --fa: "\\f67f";\n}\n\n.fa-square-poll-vertical {\n --fa: "\\f681";\n}\n\n.fa-poll {\n --fa: "\\f681";\n}\n\n.fa-square-poll-horizontal {\n --fa: "\\f682";\n}\n\n.fa-poll-h {\n --fa: "\\f682";\n}\n\n.fa-person-praying {\n --fa: "\\f683";\n}\n\n.fa-pray {\n --fa: "\\f683";\n}\n\n.fa-hands-praying {\n --fa: "\\f684";\n}\n\n.fa-praying-hands {\n --fa: "\\f684";\n}\n\n.fa-book-quran {\n --fa: "\\f687";\n}\n\n.fa-quran {\n --fa: "\\f687";\n}\n\n.fa-magnifying-glass-dollar {\n --fa: "\\f688";\n}\n\n.fa-search-dollar {\n --fa: "\\f688";\n}\n\n.fa-magnifying-glass-location {\n --fa: "\\f689";\n}\n\n.fa-search-location {\n --fa: "\\f689";\n}\n\n.fa-socks {\n --fa: "\\f696";\n}\n\n.fa-square-root-variable {\n --fa: "\\f698";\n}\n\n.fa-square-root-alt {\n --fa: "\\f698";\n}\n\n.fa-star-and-crescent {\n --fa: "\\f699";\n}\n\n.fa-star-of-david {\n --fa: "\\f69a";\n}\n\n.fa-synagogue {\n --fa: "\\f69b";\n}\n\n.fa-scroll-torah {\n --fa: "\\f6a0";\n}\n\n.fa-torah {\n --fa: "\\f6a0";\n}\n\n.fa-torii-gate {\n --fa: "\\f6a1";\n}\n\n.fa-vihara {\n --fa: "\\f6a7";\n}\n\n.fa-volume {\n --fa: "\\f6a8";\n}\n\n.fa-volume-medium {\n --fa: "\\f6a8";\n}\n\n.fa-volume-xmark {\n --fa: "\\f6a9";\n}\n\n.fa-volume-mute {\n --fa: "\\f6a9";\n}\n\n.fa-volume-times {\n --fa: "\\f6a9";\n}\n\n.fa-yin-yang {\n --fa: "\\f6ad";\n}\n\n.fa-blender-phone {\n --fa: "\\f6b6";\n}\n\n.fa-book-skull {\n --fa: "\\f6b7";\n}\n\n.fa-book-dead {\n --fa: "\\f6b7";\n}\n\n.fa-campground {\n --fa: "\\f6bb";\n}\n\n.fa-cat {\n --fa: "\\f6be";\n}\n\n.fa-chair {\n --fa: "\\f6c0";\n}\n\n.fa-cloud-moon {\n --fa: "\\f6c3";\n}\n\n.fa-cloud-sun {\n --fa: "\\f6c4";\n}\n\n.fa-cow {\n --fa: "\\f6c8";\n}\n\n.fa-dice-d20 {\n --fa: "\\f6cf";\n}\n\n.fa-dice-d6 {\n --fa: "\\f6d1";\n}\n\n.fa-dog {\n --fa: "\\f6d3";\n}\n\n.fa-dragon {\n --fa: "\\f6d5";\n}\n\n.fa-drumstick-bite {\n --fa: "\\f6d7";\n}\n\n.fa-dungeon {\n --fa: "\\f6d9";\n}\n\n.fa-file-csv {\n --fa: "\\f6dd";\n}\n\n.fa-hand-fist {\n --fa: "\\f6de";\n}\n\n.fa-fist-raised {\n --fa: "\\f6de";\n}\n\n.fa-ghost {\n --fa: "\\f6e2";\n}\n\n.fa-hammer {\n --fa: "\\f6e3";\n}\n\n.fa-hanukiah {\n --fa: "\\f6e6";\n}\n\n.fa-hat-wizard {\n --fa: "\\f6e8";\n}\n\n.fa-person-hiking {\n --fa: "\\f6ec";\n}\n\n.fa-hiking {\n --fa: "\\f6ec";\n}\n\n.fa-hippo {\n --fa: "\\f6ed";\n}\n\n.fa-horse {\n --fa: "\\f6f0";\n}\n\n.fa-house-chimney-crack {\n --fa: "\\f6f1";\n}\n\n.fa-house-damage {\n --fa: "\\f6f1";\n}\n\n.fa-hryvnia-sign {\n --fa: "\\f6f2";\n}\n\n.fa-hryvnia {\n --fa: "\\f6f2";\n}\n\n.fa-mask {\n --fa: "\\f6fa";\n}\n\n.fa-mountain {\n --fa: "\\f6fc";\n}\n\n.fa-network-wired {\n --fa: "\\f6ff";\n}\n\n.fa-otter {\n --fa: "\\f700";\n}\n\n.fa-ring {\n --fa: "\\f70b";\n}\n\n.fa-person-running {\n --fa: "\\f70c";\n}\n\n.fa-running {\n --fa: "\\f70c";\n}\n\n.fa-scroll {\n --fa: "\\f70e";\n}\n\n.fa-skull-crossbones {\n --fa: "\\f714";\n}\n\n.fa-slash {\n --fa: "\\f715";\n}\n\n.fa-spider {\n --fa: "\\f717";\n}\n\n.fa-toilet-paper {\n --fa: "\\f71e";\n}\n\n.fa-toilet-paper-alt {\n --fa: "\\f71e";\n}\n\n.fa-toilet-paper-blank {\n --fa: "\\f71e";\n}\n\n.fa-tractor {\n --fa: "\\f722";\n}\n\n.fa-user-injured {\n --fa: "\\f728";\n}\n\n.fa-vr-cardboard {\n --fa: "\\f729";\n}\n\n.fa-wand-sparkles {\n --fa: "\\f72b";\n}\n\n.fa-wind {\n --fa: "\\f72e";\n}\n\n.fa-wine-bottle {\n --fa: "\\f72f";\n}\n\n.fa-cloud-meatball {\n --fa: "\\f73b";\n}\n\n.fa-cloud-moon-rain {\n --fa: "\\f73c";\n}\n\n.fa-cloud-rain {\n --fa: "\\f73d";\n}\n\n.fa-cloud-showers-heavy {\n --fa: "\\f740";\n}\n\n.fa-cloud-sun-rain {\n --fa: "\\f743";\n}\n\n.fa-democrat {\n --fa: "\\f747";\n}\n\n.fa-flag-usa {\n --fa: "\\f74d";\n}\n\n.fa-hurricane {\n --fa: "\\f751";\n}\n\n.fa-landmark-dome {\n --fa: "\\f752";\n}\n\n.fa-landmark-alt {\n --fa: "\\f752";\n}\n\n.fa-meteor {\n --fa: "\\f753";\n}\n\n.fa-person-booth {\n --fa: "\\f756";\n}\n\n.fa-poo-storm {\n --fa: "\\f75a";\n}\n\n.fa-poo-bolt {\n --fa: "\\f75a";\n}\n\n.fa-rainbow {\n --fa: "\\f75b";\n}\n\n.fa-republican {\n --fa: "\\f75e";\n}\n\n.fa-smog {\n --fa: "\\f75f";\n}\n\n.fa-temperature-high {\n --fa: "\\f769";\n}\n\n.fa-temperature-low {\n --fa: "\\f76b";\n}\n\n.fa-cloud-bolt {\n --fa: "\\f76c";\n}\n\n.fa-thunderstorm {\n --fa: "\\f76c";\n}\n\n.fa-tornado {\n --fa: "\\f76f";\n}\n\n.fa-volcano {\n --fa: "\\f770";\n}\n\n.fa-check-to-slot {\n --fa: "\\f772";\n}\n\n.fa-vote-yea {\n --fa: "\\f772";\n}\n\n.fa-water {\n --fa: "\\f773";\n}\n\n.fa-baby {\n --fa: "\\f77c";\n}\n\n.fa-baby-carriage {\n --fa: "\\f77d";\n}\n\n.fa-carriage-baby {\n --fa: "\\f77d";\n}\n\n.fa-biohazard {\n --fa: "\\f780";\n}\n\n.fa-blog {\n --fa: "\\f781";\n}\n\n.fa-calendar-day {\n --fa: "\\f783";\n}\n\n.fa-calendar-week {\n --fa: "\\f784";\n}\n\n.fa-candy-cane {\n --fa: "\\f786";\n}\n\n.fa-carrot {\n --fa: "\\f787";\n}\n\n.fa-cash-register {\n --fa: "\\f788";\n}\n\n.fa-minimize {\n --fa: "\\f78c";\n}\n\n.fa-compress-arrows-alt {\n --fa: "\\f78c";\n}\n\n.fa-dumpster {\n --fa: "\\f793";\n}\n\n.fa-dumpster-fire {\n --fa: "\\f794";\n}\n\n.fa-ethernet {\n --fa: "\\f796";\n}\n\n.fa-gifts {\n --fa: "\\f79c";\n}\n\n.fa-champagne-glasses {\n --fa: "\\f79f";\n}\n\n.fa-glass-cheers {\n --fa: "\\f79f";\n}\n\n.fa-whiskey-glass {\n --fa: "\\f7a0";\n}\n\n.fa-glass-whiskey {\n --fa: "\\f7a0";\n}\n\n.fa-earth-europe {\n --fa: "\\f7a2";\n}\n\n.fa-globe-europe {\n --fa: "\\f7a2";\n}\n\n.fa-grip-lines {\n --fa: "\\f7a4";\n}\n\n.fa-grip-lines-vertical {\n --fa: "\\f7a5";\n}\n\n.fa-guitar {\n --fa: "\\f7a6";\n}\n\n.fa-heart-crack {\n --fa: "\\f7a9";\n}\n\n.fa-heart-broken {\n --fa: "\\f7a9";\n}\n\n.fa-holly-berry {\n --fa: "\\f7aa";\n}\n\n.fa-horse-head {\n --fa: "\\f7ab";\n}\n\n.fa-icicles {\n --fa: "\\f7ad";\n}\n\n.fa-igloo {\n --fa: "\\f7ae";\n}\n\n.fa-mitten {\n --fa: "\\f7b5";\n}\n\n.fa-mug-hot {\n --fa: "\\f7b6";\n}\n\n.fa-radiation {\n --fa: "\\f7b9";\n}\n\n.fa-circle-radiation {\n --fa: "\\f7ba";\n}\n\n.fa-radiation-alt {\n --fa: "\\f7ba";\n}\n\n.fa-restroom {\n --fa: "\\f7bd";\n}\n\n.fa-satellite {\n --fa: "\\f7bf";\n}\n\n.fa-satellite-dish {\n --fa: "\\f7c0";\n}\n\n.fa-sd-card {\n --fa: "\\f7c2";\n}\n\n.fa-sim-card {\n --fa: "\\f7c4";\n}\n\n.fa-person-skating {\n --fa: "\\f7c5";\n}\n\n.fa-skating {\n --fa: "\\f7c5";\n}\n\n.fa-person-skiing {\n --fa: "\\f7c9";\n}\n\n.fa-skiing {\n --fa: "\\f7c9";\n}\n\n.fa-person-skiing-nordic {\n --fa: "\\f7ca";\n}\n\n.fa-skiing-nordic {\n --fa: "\\f7ca";\n}\n\n.fa-sleigh {\n --fa: "\\f7cc";\n}\n\n.fa-comment-sms {\n --fa: "\\f7cd";\n}\n\n.fa-sms {\n --fa: "\\f7cd";\n}\n\n.fa-person-snowboarding {\n --fa: "\\f7ce";\n}\n\n.fa-snowboarding {\n --fa: "\\f7ce";\n}\n\n.fa-snowman {\n --fa: "\\f7d0";\n}\n\n.fa-snowplow {\n --fa: "\\f7d2";\n}\n\n.fa-tenge-sign {\n --fa: "\\f7d7";\n}\n\n.fa-tenge {\n --fa: "\\f7d7";\n}\n\n.fa-toilet {\n --fa: "\\f7d8";\n}\n\n.fa-screwdriver-wrench {\n --fa: "\\f7d9";\n}\n\n.fa-tools {\n --fa: "\\f7d9";\n}\n\n.fa-cable-car {\n --fa: "\\f7da";\n}\n\n.fa-tram {\n --fa: "\\f7da";\n}\n\n.fa-fire-flame-curved {\n --fa: "\\f7e4";\n}\n\n.fa-fire-alt {\n --fa: "\\f7e4";\n}\n\n.fa-bacon {\n --fa: "\\f7e5";\n}\n\n.fa-book-medical {\n --fa: "\\f7e6";\n}\n\n.fa-bread-slice {\n --fa: "\\f7ec";\n}\n\n.fa-cheese {\n --fa: "\\f7ef";\n}\n\n.fa-house-chimney-medical {\n --fa: "\\f7f2";\n}\n\n.fa-clinic-medical {\n --fa: "\\f7f2";\n}\n\n.fa-clipboard-user {\n --fa: "\\f7f3";\n}\n\n.fa-comment-medical {\n --fa: "\\f7f5";\n}\n\n.fa-crutch {\n --fa: "\\f7f7";\n}\n\n.fa-disease {\n --fa: "\\f7fa";\n}\n\n.fa-egg {\n --fa: "\\f7fb";\n}\n\n.fa-folder-tree {\n --fa: "\\f802";\n}\n\n.fa-burger {\n --fa: "\\f805";\n}\n\n.fa-hamburger {\n --fa: "\\f805";\n}\n\n.fa-hand-middle-finger {\n --fa: "\\f806";\n}\n\n.fa-helmet-safety {\n --fa: "\\f807";\n}\n\n.fa-hard-hat {\n --fa: "\\f807";\n}\n\n.fa-hat-hard {\n --fa: "\\f807";\n}\n\n.fa-hospital-user {\n --fa: "\\f80d";\n}\n\n.fa-hotdog {\n --fa: "\\f80f";\n}\n\n.fa-ice-cream {\n --fa: "\\f810";\n}\n\n.fa-laptop-medical {\n --fa: "\\f812";\n}\n\n.fa-pager {\n --fa: "\\f815";\n}\n\n.fa-pepper-hot {\n --fa: "\\f816";\n}\n\n.fa-pizza-slice {\n --fa: "\\f818";\n}\n\n.fa-sack-dollar {\n --fa: "\\f81d";\n}\n\n.fa-book-tanakh {\n --fa: "\\f827";\n}\n\n.fa-tanakh {\n --fa: "\\f827";\n}\n\n.fa-bars-progress {\n --fa: "\\f828";\n}\n\n.fa-tasks-alt {\n --fa: "\\f828";\n}\n\n.fa-trash-arrow-up {\n --fa: "\\f829";\n}\n\n.fa-trash-restore {\n --fa: "\\f829";\n}\n\n.fa-trash-can-arrow-up {\n --fa: "\\f82a";\n}\n\n.fa-trash-restore-alt {\n --fa: "\\f82a";\n}\n\n.fa-user-nurse {\n --fa: "\\f82f";\n}\n\n.fa-wave-square {\n --fa: "\\f83e";\n}\n\n.fa-person-biking {\n --fa: "\\f84a";\n}\n\n.fa-biking {\n --fa: "\\f84a";\n}\n\n.fa-border-all {\n --fa: "\\f84c";\n}\n\n.fa-border-none {\n --fa: "\\f850";\n}\n\n.fa-border-top-left {\n --fa: "\\f853";\n}\n\n.fa-border-style {\n --fa: "\\f853";\n}\n\n.fa-person-digging {\n --fa: "\\f85e";\n}\n\n.fa-digging {\n --fa: "\\f85e";\n}\n\n.fa-fan {\n --fa: "\\f863";\n}\n\n.fa-icons {\n --fa: "\\f86d";\n}\n\n.fa-heart-music-camera-bolt {\n --fa: "\\f86d";\n}\n\n.fa-phone-flip {\n --fa: "\\f879";\n}\n\n.fa-phone-alt {\n --fa: "\\f879";\n}\n\n.fa-square-phone-flip {\n --fa: "\\f87b";\n}\n\n.fa-phone-square-alt {\n --fa: "\\f87b";\n}\n\n.fa-photo-film {\n --fa: "\\f87c";\n}\n\n.fa-photo-video {\n --fa: "\\f87c";\n}\n\n.fa-text-slash {\n --fa: "\\f87d";\n}\n\n.fa-remove-format {\n --fa: "\\f87d";\n}\n\n.fa-arrow-down-z-a {\n --fa: "\\f881";\n}\n\n.fa-sort-alpha-desc {\n --fa: "\\f881";\n}\n\n.fa-sort-alpha-down-alt {\n --fa: "\\f881";\n}\n\n.fa-arrow-up-z-a {\n --fa: "\\f882";\n}\n\n.fa-sort-alpha-up-alt {\n --fa: "\\f882";\n}\n\n.fa-arrow-down-short-wide {\n --fa: "\\f884";\n}\n\n.fa-sort-amount-desc {\n --fa: "\\f884";\n}\n\n.fa-sort-amount-down-alt {\n --fa: "\\f884";\n}\n\n.fa-arrow-up-short-wide {\n --fa: "\\f885";\n}\n\n.fa-sort-amount-up-alt {\n --fa: "\\f885";\n}\n\n.fa-arrow-down-9-1 {\n --fa: "\\f886";\n}\n\n.fa-sort-numeric-desc {\n --fa: "\\f886";\n}\n\n.fa-sort-numeric-down-alt {\n --fa: "\\f886";\n}\n\n.fa-arrow-up-9-1 {\n --fa: "\\f887";\n}\n\n.fa-sort-numeric-up-alt {\n --fa: "\\f887";\n}\n\n.fa-spell-check {\n --fa: "\\f891";\n}\n\n.fa-voicemail {\n --fa: "\\f897";\n}\n\n.fa-hat-cowboy {\n --fa: "\\f8c0";\n}\n\n.fa-hat-cowboy-side {\n --fa: "\\f8c1";\n}\n\n.fa-computer-mouse {\n --fa: "\\f8cc";\n}\n\n.fa-mouse {\n --fa: "\\f8cc";\n}\n\n.fa-radio {\n --fa: "\\f8d7";\n}\n\n.fa-record-vinyl {\n --fa: "\\f8d9";\n}\n\n.fa-walkie-talkie {\n --fa: "\\f8ef";\n}\n\n.fa-caravan {\n --fa: "\\f8ff";\n}\n:root, :host {\n --fa-family-brands: \'Font Awesome 7 Brands\';\n --fa-font-brands: normal 400 1em/1 var(--fa-family-brands);\n}\n\n@font-face {\n font-family: "Font Awesome 7 Brands";\n font-style: normal;\n font-weight: 400;\n font-display: block;\n src: url("../webfonts/fa-brands-400.woff2");\n}\n.fab,\n.fa-brands,\n.fa-classic.fa-brands {\n --fa-family: var(--fa-family-brands);\n --fa-style: 400;\n}\n\n.fa-firefox-browser {\n --fa: "\\e007";\n}\n\n.fa-ideal {\n --fa: "\\e013";\n}\n\n.fa-microblog {\n --fa: "\\e01a";\n}\n\n.fa-square-pied-piper {\n --fa: "\\e01e";\n}\n\n.fa-pied-piper-square {\n --fa: "\\e01e";\n}\n\n.fa-unity {\n --fa: "\\e049";\n}\n\n.fa-dailymotion {\n --fa: "\\e052";\n}\n\n.fa-square-instagram {\n --fa: "\\e055";\n}\n\n.fa-instagram-square {\n --fa: "\\e055";\n}\n\n.fa-mixer {\n --fa: "\\e056";\n}\n\n.fa-shopify {\n --fa: "\\e057";\n}\n\n.fa-deezer {\n --fa: "\\e077";\n}\n\n.fa-edge-legacy {\n --fa: "\\e078";\n}\n\n.fa-google-pay {\n --fa: "\\e079";\n}\n\n.fa-rust {\n --fa: "\\e07a";\n}\n\n.fa-tiktok {\n --fa: "\\e07b";\n}\n\n.fa-unsplash {\n --fa: "\\e07c";\n}\n\n.fa-cloudflare {\n --fa: "\\e07d";\n}\n\n.fa-guilded {\n --fa: "\\e07e";\n}\n\n.fa-hive {\n --fa: "\\e07f";\n}\n\n.fa-42-group {\n --fa: "\\e080";\n}\n\n.fa-innosoft {\n --fa: "\\e080";\n}\n\n.fa-instalod {\n --fa: "\\e081";\n}\n\n.fa-octopus-deploy {\n --fa: "\\e082";\n}\n\n.fa-perbyte {\n --fa: "\\e083";\n}\n\n.fa-uncharted {\n --fa: "\\e084";\n}\n\n.fa-watchman-monitoring {\n --fa: "\\e087";\n}\n\n.fa-wodu {\n --fa: "\\e088";\n}\n\n.fa-wirsindhandwerk {\n --fa: "\\e2d0";\n}\n\n.fa-wsh {\n --fa: "\\e2d0";\n}\n\n.fa-bots {\n --fa: "\\e340";\n}\n\n.fa-cmplid {\n --fa: "\\e360";\n}\n\n.fa-bilibili {\n --fa: "\\e3d9";\n}\n\n.fa-golang {\n --fa: "\\e40f";\n}\n\n.fa-pix {\n --fa: "\\e43a";\n}\n\n.fa-sitrox {\n --fa: "\\e44a";\n}\n\n.fa-hashnode {\n --fa: "\\e499";\n}\n\n.fa-meta {\n --fa: "\\e49b";\n}\n\n.fa-padlet {\n --fa: "\\e4a0";\n}\n\n.fa-nfc-directional {\n --fa: "\\e530";\n}\n\n.fa-nfc-symbol {\n --fa: "\\e531";\n}\n\n.fa-screenpal {\n --fa: "\\e570";\n}\n\n.fa-space-awesome {\n --fa: "\\e5ac";\n}\n\n.fa-square-font-awesome {\n --fa: "\\e5ad";\n}\n\n.fa-square-gitlab {\n --fa: "\\e5ae";\n}\n\n.fa-gitlab-square {\n --fa: "\\e5ae";\n}\n\n.fa-odysee {\n --fa: "\\e5c6";\n}\n\n.fa-stubber {\n --fa: "\\e5c7";\n}\n\n.fa-debian {\n --fa: "\\e60b";\n}\n\n.fa-shoelace {\n --fa: "\\e60c";\n}\n\n.fa-threads {\n --fa: "\\e618";\n}\n\n.fa-square-threads {\n --fa: "\\e619";\n}\n\n.fa-square-x-twitter {\n --fa: "\\e61a";\n}\n\n.fa-x-twitter {\n --fa: "\\e61b";\n}\n\n.fa-opensuse {\n --fa: "\\e62b";\n}\n\n.fa-letterboxd {\n --fa: "\\e62d";\n}\n\n.fa-square-letterboxd {\n --fa: "\\e62e";\n}\n\n.fa-mintbit {\n --fa: "\\e62f";\n}\n\n.fa-google-scholar {\n --fa: "\\e63b";\n}\n\n.fa-brave {\n --fa: "\\e63c";\n}\n\n.fa-brave-reverse {\n --fa: "\\e63d";\n}\n\n.fa-pixiv {\n --fa: "\\e640";\n}\n\n.fa-upwork {\n --fa: "\\e641";\n}\n\n.fa-webflow {\n --fa: "\\e65c";\n}\n\n.fa-signal-messenger {\n --fa: "\\e663";\n}\n\n.fa-bluesky {\n --fa: "\\e671";\n}\n\n.fa-jxl {\n --fa: "\\e67b";\n}\n\n.fa-square-upwork {\n --fa: "\\e67c";\n}\n\n.fa-web-awesome {\n --fa: "\\e682";\n}\n\n.fa-square-web-awesome {\n --fa: "\\e683";\n}\n\n.fa-square-web-awesome-stroke {\n --fa: "\\e684";\n}\n\n.fa-dart-lang {\n --fa: "\\e693";\n}\n\n.fa-flutter {\n --fa: "\\e694";\n}\n\n.fa-files-pinwheel {\n --fa: "\\e69f";\n}\n\n.fa-css {\n --fa: "\\e6a2";\n}\n\n.fa-square-bluesky {\n --fa: "\\e6a3";\n}\n\n.fa-openai {\n --fa: "\\e7cf";\n}\n\n.fa-square-linkedin {\n --fa: "\\e7d0";\n}\n\n.fa-cash-app {\n --fa: "\\e7d4";\n}\n\n.fa-disqus {\n --fa: "\\e7d5";\n}\n\n.fa-eleventy {\n --fa: "\\e7d6";\n}\n\n.fa-11ty {\n --fa: "\\e7d6";\n}\n\n.fa-kakao-talk {\n --fa: "\\e7d7";\n}\n\n.fa-linktree {\n --fa: "\\e7d8";\n}\n\n.fa-notion {\n --fa: "\\e7d9";\n}\n\n.fa-pandora {\n --fa: "\\e7da";\n}\n\n.fa-pixelfed {\n --fa: "\\e7db";\n}\n\n.fa-tidal {\n --fa: "\\e7dc";\n}\n\n.fa-vsco {\n --fa: "\\e7dd";\n}\n\n.fa-w3c {\n --fa: "\\e7de";\n}\n\n.fa-lumon {\n --fa: "\\e7e2";\n}\n\n.fa-lumon-drop {\n --fa: "\\e7e3";\n}\n\n.fa-square-figma {\n --fa: "\\e7e4";\n}\n\n.fa-tex {\n --fa: "\\e7ff";\n}\n\n.fa-duolingo {\n --fa: "\\e812";\n}\n\n.fa-supportnow {\n --fa: "\\e833";\n}\n\n.fa-tor-browser {\n --fa: "\\e838";\n}\n\n.fa-typescript {\n --fa: "\\e840";\n}\n\n.fa-square-deskpro {\n --fa: "\\e844";\n}\n\n.fa-circle-zulip {\n --fa: "\\e851";\n}\n\n.fa-julia {\n --fa: "\\e852";\n}\n\n.fa-zulip {\n --fa: "\\e853";\n}\n\n.fa-unison {\n --fa: "\\e854";\n}\n\n.fa-board-game-geek {\n --fa: "\\e855";\n}\n\n.fa-bgg {\n --fa: "\\e855";\n}\n\n.fa-ko-fi {\n --fa: "\\e856";\n}\n\n.fa-kubernetes {\n --fa: "\\e857";\n}\n\n.fa-postgresql {\n --fa: "\\e858";\n}\n\n.fa-scaleway {\n --fa: "\\e859";\n}\n\n.fa-venmo {\n --fa: "\\e85a";\n}\n\n.fa-venmo-v {\n --fa: "\\e85b";\n}\n\n.fa-unreal-engine {\n --fa: "\\e85c";\n}\n\n.fa-globaleaks {\n --fa: "\\e85d";\n}\n\n.fa-solana {\n --fa: "\\e85e";\n}\n\n.fa-threema {\n --fa: "\\e85f";\n}\n\n.fa-forgejo {\n --fa: "\\e860";\n}\n\n.fa-claude {\n --fa: "\\e861";\n}\n\n.fa-gitee {\n --fa: "\\e863";\n}\n\n.fa-xmpp {\n --fa: "\\e864";\n}\n\n.fa-fediverse {\n --fa: "\\e865";\n}\n\n.fa-tailwind-css {\n --fa: "\\e866";\n}\n\n.fa-arch-linux {\n --fa: "\\e867";\n}\n\n.fa-svelte {\n --fa: "\\e868";\n}\n\n.fa-hugging-face {\n --fa: "\\e869";\n}\n\n.fa-leetcode {\n --fa: "\\e86a";\n}\n\n.fa-openstreetmap {\n --fa: "\\e86b";\n}\n\n.fa-ultralytics {\n --fa: "\\e86d";\n}\n\n.fa-ultralytics-hub {\n --fa: "\\e86e";\n}\n\n.fa-ultralytics-yolo {\n --fa: "\\e86f";\n}\n\n.fa-obsidian {\n --fa: "\\e879";\n}\n\n.fa-zoom {\n --fa: "\\e87b";\n}\n\n.fa-vim {\n --fa: "\\e88a";\n}\n\n.fa-symfonycasts {\n --fa: "\\e8ab";\n}\n\n.fa-build-awesome {\n --fa: "\\e8ac";\n}\n\n.fa-codeberg {\n --fa: "\\e8ad";\n}\n\n.fa-devpost {\n --fa: "\\e8ae";\n}\n\n.fa-internet-archive {\n --fa: "\\e8b1";\n}\n\n.fa-lets-encrypt {\n --fa: "\\e8b2";\n}\n\n.fa-matrix {\n --fa: "\\e8b3";\n}\n\n.fa-mattermost {\n --fa: "\\e8b4";\n}\n\n.fa-nextcloud {\n --fa: "\\e8b5";\n}\n\n.fa-roblox-creator-studio {\n --fa: "\\e8b6";\n}\n\n.fa-square-build-awesome-stroke {\n --fa: "\\e8b7";\n}\n\n.fa-substack {\n --fa: "\\e8b8";\n}\n\n.fa-tesla {\n --fa: "\\e8b9";\n}\n\n.fa-xrp {\n --fa: "\\e8ba";\n}\n\n.fa-xrpl {\n --fa: "\\e8bb";\n}\n\n.fa-youtube-shorts {\n --fa: "\\e8bc";\n}\n\n.fa-ror {\n --fa: "\\e8bd";\n}\n\n.fa-visual-studio {\n --fa: "\\e8be";\n}\n\n.fa-dolibarr {\n --fa: "\\e8bf";\n}\n\n.fa-obs-studio {\n --fa: "\\e8c0";\n}\n\n.fa-storybook {\n --fa: "\\e8c1";\n}\n\n.fa-a11y-project {\n --fa: "\\e8c2";\n}\n\n.fa-copilot {\n --fa: "\\e8c7";\n}\n\n.fa-square-twitter {\n --fa: "\\f081";\n}\n\n.fa-twitter-square {\n --fa: "\\f081";\n}\n\n.fa-square-facebook {\n --fa: "\\f082";\n}\n\n.fa-facebook-square {\n --fa: "\\f082";\n}\n\n.fa-linkedin {\n --fa: "\\f08c";\n}\n\n.fa-square-github {\n --fa: "\\f092";\n}\n\n.fa-github-square {\n --fa: "\\f092";\n}\n\n.fa-twitter {\n --fa: "\\f099";\n}\n\n.fa-facebook {\n --fa: "\\f09a";\n}\n\n.fa-github {\n --fa: "\\f09b";\n}\n\n.fa-pinterest {\n --fa: "\\f0d2";\n}\n\n.fa-square-pinterest {\n --fa: "\\f0d3";\n}\n\n.fa-pinterest-square {\n --fa: "\\f0d3";\n}\n\n.fa-square-google-plus {\n --fa: "\\f0d4";\n}\n\n.fa-google-plus-square {\n --fa: "\\f0d4";\n}\n\n.fa-google-plus-g {\n --fa: "\\f0d5";\n}\n\n.fa-linkedin-in {\n --fa: "\\f0e1";\n}\n\n.fa-github-alt {\n --fa: "\\f113";\n}\n\n.fa-maxcdn {\n --fa: "\\f136";\n}\n\n.fa-html5 {\n --fa: "\\f13b";\n}\n\n.fa-css3 {\n --fa: "\\f13c";\n}\n\n.fa-btc {\n --fa: "\\f15a";\n}\n\n.fa-youtube {\n --fa: "\\f167";\n}\n\n.fa-xing {\n --fa: "\\f168";\n}\n\n.fa-square-xing {\n --fa: "\\f169";\n}\n\n.fa-xing-square {\n --fa: "\\f169";\n}\n\n.fa-dropbox {\n --fa: "\\f16b";\n}\n\n.fa-stack-overflow {\n --fa: "\\f16c";\n}\n\n.fa-instagram {\n --fa: "\\f16d";\n}\n\n.fa-flickr {\n --fa: "\\f16e";\n}\n\n.fa-adn {\n --fa: "\\f170";\n}\n\n.fa-bitbucket {\n --fa: "\\f171";\n}\n\n.fa-tumblr {\n --fa: "\\f173";\n}\n\n.fa-square-tumblr {\n --fa: "\\f174";\n}\n\n.fa-tumblr-square {\n --fa: "\\f174";\n}\n\n.fa-apple {\n --fa: "\\f179";\n}\n\n.fa-windows {\n --fa: "\\f17a";\n}\n\n.fa-android {\n --fa: "\\f17b";\n}\n\n.fa-linux {\n --fa: "\\f17c";\n}\n\n.fa-dribbble {\n --fa: "\\f17d";\n}\n\n.fa-skype {\n --fa: "\\f17e";\n}\n\n.fa-foursquare {\n --fa: "\\f180";\n}\n\n.fa-trello {\n --fa: "\\f181";\n}\n\n.fa-gratipay {\n --fa: "\\f184";\n}\n\n.fa-vk {\n --fa: "\\f189";\n}\n\n.fa-weibo {\n --fa: "\\f18a";\n}\n\n.fa-renren {\n --fa: "\\f18b";\n}\n\n.fa-pagelines {\n --fa: "\\f18c";\n}\n\n.fa-stack-exchange {\n --fa: "\\f18d";\n}\n\n.fa-square-vimeo {\n --fa: "\\f194";\n}\n\n.fa-vimeo-square {\n --fa: "\\f194";\n}\n\n.fa-slack {\n --fa: "\\f198";\n}\n\n.fa-slack-hash {\n --fa: "\\f198";\n}\n\n.fa-wordpress {\n --fa: "\\f19a";\n}\n\n.fa-openid {\n --fa: "\\f19b";\n}\n\n.fa-yahoo {\n --fa: "\\f19e";\n}\n\n.fa-google {\n --fa: "\\f1a0";\n}\n\n.fa-reddit {\n --fa: "\\f1a1";\n}\n\n.fa-square-reddit {\n --fa: "\\f1a2";\n}\n\n.fa-reddit-square {\n --fa: "\\f1a2";\n}\n\n.fa-stumbleupon-circle {\n --fa: "\\f1a3";\n}\n\n.fa-stumbleupon {\n --fa: "\\f1a4";\n}\n\n.fa-delicious {\n --fa: "\\f1a5";\n}\n\n.fa-digg {\n --fa: "\\f1a6";\n}\n\n.fa-pied-piper-pp {\n --fa: "\\f1a7";\n}\n\n.fa-pied-piper-alt {\n --fa: "\\f1a8";\n}\n\n.fa-drupal {\n --fa: "\\f1a9";\n}\n\n.fa-joomla {\n --fa: "\\f1aa";\n}\n\n.fa-behance {\n --fa: "\\f1b4";\n}\n\n.fa-square-behance {\n --fa: "\\f1b5";\n}\n\n.fa-behance-square {\n --fa: "\\f1b5";\n}\n\n.fa-steam {\n --fa: "\\f1b6";\n}\n\n.fa-square-steam {\n --fa: "\\f1b7";\n}\n\n.fa-steam-square {\n --fa: "\\f1b7";\n}\n\n.fa-spotify {\n --fa: "\\f1bc";\n}\n\n.fa-deviantart {\n --fa: "\\f1bd";\n}\n\n.fa-soundcloud {\n --fa: "\\f1be";\n}\n\n.fa-vine {\n --fa: "\\f1ca";\n}\n\n.fa-codepen {\n --fa: "\\f1cb";\n}\n\n.fa-jsfiddle {\n --fa: "\\f1cc";\n}\n\n.fa-rebel {\n --fa: "\\f1d0";\n}\n\n.fa-empire {\n --fa: "\\f1d1";\n}\n\n.fa-square-git {\n --fa: "\\f1d2";\n}\n\n.fa-git-square {\n --fa: "\\f1d2";\n}\n\n.fa-git {\n --fa: "\\f1d3";\n}\n\n.fa-hacker-news {\n --fa: "\\f1d4";\n}\n\n.fa-tencent-weibo {\n --fa: "\\f1d5";\n}\n\n.fa-qq {\n --fa: "\\f1d6";\n}\n\n.fa-weixin {\n --fa: "\\f1d7";\n}\n\n.fa-slideshare {\n --fa: "\\f1e7";\n}\n\n.fa-twitch {\n --fa: "\\f1e8";\n}\n\n.fa-yelp {\n --fa: "\\f1e9";\n}\n\n.fa-paypal {\n --fa: "\\f1ed";\n}\n\n.fa-google-wallet {\n --fa: "\\f1ee";\n}\n\n.fa-cc-visa {\n --fa: "\\f1f0";\n}\n\n.fa-cc-mastercard {\n --fa: "\\f1f1";\n}\n\n.fa-cc-discover {\n --fa: "\\f1f2";\n}\n\n.fa-cc-amex {\n --fa: "\\f1f3";\n}\n\n.fa-cc-paypal {\n --fa: "\\f1f4";\n}\n\n.fa-cc-stripe {\n --fa: "\\f1f5";\n}\n\n.fa-lastfm {\n --fa: "\\f202";\n}\n\n.fa-square-lastfm {\n --fa: "\\f203";\n}\n\n.fa-lastfm-square {\n --fa: "\\f203";\n}\n\n.fa-ioxhost {\n --fa: "\\f208";\n}\n\n.fa-angellist {\n --fa: "\\f209";\n}\n\n.fa-buysellads {\n --fa: "\\f20d";\n}\n\n.fa-connectdevelop {\n --fa: "\\f20e";\n}\n\n.fa-dashcube {\n --fa: "\\f210";\n}\n\n.fa-forumbee {\n --fa: "\\f211";\n}\n\n.fa-leanpub {\n --fa: "\\f212";\n}\n\n.fa-sellsy {\n --fa: "\\f213";\n}\n\n.fa-shirtsinbulk {\n --fa: "\\f214";\n}\n\n.fa-simplybuilt {\n --fa: "\\f215";\n}\n\n.fa-skyatlas {\n --fa: "\\f216";\n}\n\n.fa-pinterest-p {\n --fa: "\\f231";\n}\n\n.fa-whatsapp {\n --fa: "\\f232";\n}\n\n.fa-viacoin {\n --fa: "\\f237";\n}\n\n.fa-medium {\n --fa: "\\f23a";\n}\n\n.fa-medium-m {\n --fa: "\\f23a";\n}\n\n.fa-y-combinator {\n --fa: "\\f23b";\n}\n\n.fa-optin-monster {\n --fa: "\\f23c";\n}\n\n.fa-opencart {\n --fa: "\\f23d";\n}\n\n.fa-expeditedssl {\n --fa: "\\f23e";\n}\n\n.fa-cc-jcb {\n --fa: "\\f24b";\n}\n\n.fa-cc-diners-club {\n --fa: "\\f24c";\n}\n\n.fa-creative-commons {\n --fa: "\\f25e";\n}\n\n.fa-gg {\n --fa: "\\f260";\n}\n\n.fa-gg-circle {\n --fa: "\\f261";\n}\n\n.fa-odnoklassniki {\n --fa: "\\f263";\n}\n\n.fa-square-odnoklassniki {\n --fa: "\\f264";\n}\n\n.fa-odnoklassniki-square {\n --fa: "\\f264";\n}\n\n.fa-get-pocket {\n --fa: "\\f265";\n}\n\n.fa-wikipedia-w {\n --fa: "\\f266";\n}\n\n.fa-safari {\n --fa: "\\f267";\n}\n\n.fa-chrome {\n --fa: "\\f268";\n}\n\n.fa-firefox {\n --fa: "\\f269";\n}\n\n.fa-opera {\n --fa: "\\f26a";\n}\n\n.fa-internet-explorer {\n --fa: "\\f26b";\n}\n\n.fa-contao {\n --fa: "\\f26d";\n}\n\n.fa-500px {\n --fa: "\\f26e";\n}\n\n.fa-amazon {\n --fa: "\\f270";\n}\n\n.fa-houzz {\n --fa: "\\f27c";\n}\n\n.fa-vimeo-v {\n --fa: "\\f27d";\n}\n\n.fa-black-tie {\n --fa: "\\f27e";\n}\n\n.fa-fonticons {\n --fa: "\\f280";\n}\n\n.fa-reddit-alien {\n --fa: "\\f281";\n}\n\n.fa-edge {\n --fa: "\\f282";\n}\n\n.fa-codiepie {\n --fa: "\\f284";\n}\n\n.fa-modx {\n --fa: "\\f285";\n}\n\n.fa-fort-awesome {\n --fa: "\\f286";\n}\n\n.fa-usb {\n --fa: "\\f287";\n}\n\n.fa-product-hunt {\n --fa: "\\f288";\n}\n\n.fa-mixcloud {\n --fa: "\\f289";\n}\n\n.fa-scribd {\n --fa: "\\f28a";\n}\n\n.fa-bluetooth {\n --fa: "\\f293";\n}\n\n.fa-bluetooth-b {\n --fa: "\\f294";\n}\n\n.fa-gitlab {\n --fa: "\\f296";\n}\n\n.fa-wpbeginner {\n --fa: "\\f297";\n}\n\n.fa-wpforms {\n --fa: "\\f298";\n}\n\n.fa-envira {\n --fa: "\\f299";\n}\n\n.fa-glide {\n --fa: "\\f2a5";\n}\n\n.fa-glide-g {\n --fa: "\\f2a6";\n}\n\n.fa-viadeo {\n --fa: "\\f2a9";\n}\n\n.fa-square-viadeo {\n --fa: "\\f2aa";\n}\n\n.fa-viadeo-square {\n --fa: "\\f2aa";\n}\n\n.fa-snapchat {\n --fa: "\\f2ab";\n}\n\n.fa-snapchat-ghost {\n --fa: "\\f2ab";\n}\n\n.fa-square-snapchat {\n --fa: "\\f2ad";\n}\n\n.fa-snapchat-square {\n --fa: "\\f2ad";\n}\n\n.fa-pied-piper {\n --fa: "\\f2ae";\n}\n\n.fa-first-order {\n --fa: "\\f2b0";\n}\n\n.fa-yoast {\n --fa: "\\f2b1";\n}\n\n.fa-themeisle {\n --fa: "\\f2b2";\n}\n\n.fa-google-plus {\n --fa: "\\f2b3";\n}\n\n.fa-font-awesome {\n --fa: "\\f2b4";\n}\n\n.fa-font-awesome-flag {\n --fa: "\\f2b4";\n}\n\n.fa-font-awesome-logo-full {\n --fa: "\\f2b4";\n}\n\n.fa-linode {\n --fa: "\\f2b8";\n}\n\n.fa-quora {\n --fa: "\\f2c4";\n}\n\n.fa-free-code-camp {\n --fa: "\\f2c5";\n}\n\n.fa-telegram {\n --fa: "\\f2c6";\n}\n\n.fa-telegram-plane {\n --fa: "\\f2c6";\n}\n\n.fa-bandcamp {\n --fa: "\\f2d5";\n}\n\n.fa-grav {\n --fa: "\\f2d6";\n}\n\n.fa-etsy {\n --fa: "\\f2d7";\n}\n\n.fa-imdb {\n --fa: "\\f2d8";\n}\n\n.fa-ravelry {\n --fa: "\\f2d9";\n}\n\n.fa-sellcast {\n --fa: "\\f2da";\n}\n\n.fa-superpowers {\n --fa: "\\f2dd";\n}\n\n.fa-wpexplorer {\n --fa: "\\f2de";\n}\n\n.fa-meetup {\n --fa: "\\f2e0";\n}\n\n.fa-square-font-awesome-stroke {\n --fa: "\\f35c";\n}\n\n.fa-font-awesome-alt {\n --fa: "\\f35c";\n}\n\n.fa-accessible-icon {\n --fa: "\\f368";\n}\n\n.fa-accusoft {\n --fa: "\\f369";\n}\n\n.fa-adversal {\n --fa: "\\f36a";\n}\n\n.fa-affiliatetheme {\n --fa: "\\f36b";\n}\n\n.fa-algolia {\n --fa: "\\f36c";\n}\n\n.fa-amilia {\n --fa: "\\f36d";\n}\n\n.fa-angrycreative {\n --fa: "\\f36e";\n}\n\n.fa-app-store {\n --fa: "\\f36f";\n}\n\n.fa-app-store-ios {\n --fa: "\\f370";\n}\n\n.fa-apper {\n --fa: "\\f371";\n}\n\n.fa-asymmetrik {\n --fa: "\\f372";\n}\n\n.fa-audible {\n --fa: "\\f373";\n}\n\n.fa-avianex {\n --fa: "\\f374";\n}\n\n.fa-aws {\n --fa: "\\f375";\n}\n\n.fa-bimobject {\n --fa: "\\f378";\n}\n\n.fa-bitcoin {\n --fa: "\\f379";\n}\n\n.fa-bity {\n --fa: "\\f37a";\n}\n\n.fa-blackberry {\n --fa: "\\f37b";\n}\n\n.fa-blogger {\n --fa: "\\f37c";\n}\n\n.fa-blogger-b {\n --fa: "\\f37d";\n}\n\n.fa-buromobelexperte {\n --fa: "\\f37f";\n}\n\n.fa-centercode {\n --fa: "\\f380";\n}\n\n.fa-cloudscale {\n --fa: "\\f383";\n}\n\n.fa-cloudsmith {\n --fa: "\\f384";\n}\n\n.fa-cloudversify {\n --fa: "\\f385";\n}\n\n.fa-cpanel {\n --fa: "\\f388";\n}\n\n.fa-css3-alt {\n --fa: "\\f38b";\n}\n\n.fa-cuttlefish {\n --fa: "\\f38c";\n}\n\n.fa-d-and-d {\n --fa: "\\f38d";\n}\n\n.fa-deploydog {\n --fa: "\\f38e";\n}\n\n.fa-deskpro {\n --fa: "\\f38f";\n}\n\n.fa-digital-ocean {\n --fa: "\\f391";\n}\n\n.fa-discord {\n --fa: "\\f392";\n}\n\n.fa-discourse {\n --fa: "\\f393";\n}\n\n.fa-dochub {\n --fa: "\\f394";\n}\n\n.fa-docker {\n --fa: "\\f395";\n}\n\n.fa-draft2digital {\n --fa: "\\f396";\n}\n\n.fa-square-dribbble {\n --fa: "\\f397";\n}\n\n.fa-dribbble-square {\n --fa: "\\f397";\n}\n\n.fa-dyalog {\n --fa: "\\f399";\n}\n\n.fa-earlybirds {\n --fa: "\\f39a";\n}\n\n.fa-erlang {\n --fa: "\\f39d";\n}\n\n.fa-facebook-f {\n --fa: "\\f39e";\n}\n\n.fa-facebook-messenger {\n --fa: "\\f39f";\n}\n\n.fa-firstdraft {\n --fa: "\\f3a1";\n}\n\n.fa-fonticons-fi {\n --fa: "\\f3a2";\n}\n\n.fa-fort-awesome-alt {\n --fa: "\\f3a3";\n}\n\n.fa-freebsd {\n --fa: "\\f3a4";\n}\n\n.fa-gitkraken {\n --fa: "\\f3a6";\n}\n\n.fa-gofore {\n --fa: "\\f3a7";\n}\n\n.fa-goodreads {\n --fa: "\\f3a8";\n}\n\n.fa-goodreads-g {\n --fa: "\\f3a9";\n}\n\n.fa-google-drive {\n --fa: "\\f3aa";\n}\n\n.fa-google-play {\n --fa: "\\f3ab";\n}\n\n.fa-gripfire {\n --fa: "\\f3ac";\n}\n\n.fa-grunt {\n --fa: "\\f3ad";\n}\n\n.fa-gulp {\n --fa: "\\f3ae";\n}\n\n.fa-square-hacker-news {\n --fa: "\\f3af";\n}\n\n.fa-hacker-news-square {\n --fa: "\\f3af";\n}\n\n.fa-hire-a-helper {\n --fa: "\\f3b0";\n}\n\n.fa-hotjar {\n --fa: "\\f3b1";\n}\n\n.fa-hubspot {\n --fa: "\\f3b2";\n}\n\n.fa-itunes {\n --fa: "\\f3b4";\n}\n\n.fa-itunes-note {\n --fa: "\\f3b5";\n}\n\n.fa-jenkins {\n --fa: "\\f3b6";\n}\n\n.fa-joget {\n --fa: "\\f3b7";\n}\n\n.fa-js {\n --fa: "\\f3b8";\n}\n\n.fa-square-js {\n --fa: "\\f3b9";\n}\n\n.fa-js-square {\n --fa: "\\f3b9";\n}\n\n.fa-keycdn {\n --fa: "\\f3ba";\n}\n\n.fa-kickstarter {\n --fa: "\\f3bb";\n}\n\n.fa-square-kickstarter {\n --fa: "\\f3bb";\n}\n\n.fa-kickstarter-k {\n --fa: "\\f3bc";\n}\n\n.fa-laravel {\n --fa: "\\f3bd";\n}\n\n.fa-line {\n --fa: "\\f3c0";\n}\n\n.fa-lyft {\n --fa: "\\f3c3";\n}\n\n.fa-magento {\n --fa: "\\f3c4";\n}\n\n.fa-medapps {\n --fa: "\\f3c6";\n}\n\n.fa-medrt {\n --fa: "\\f3c8";\n}\n\n.fa-microsoft {\n --fa: "\\f3ca";\n}\n\n.fa-mix {\n --fa: "\\f3cb";\n}\n\n.fa-mizuni {\n --fa: "\\f3cc";\n}\n\n.fa-monero {\n --fa: "\\f3d0";\n}\n\n.fa-napster {\n --fa: "\\f3d2";\n}\n\n.fa-node-js {\n --fa: "\\f3d3";\n}\n\n.fa-npm {\n --fa: "\\f3d4";\n}\n\n.fa-ns8 {\n --fa: "\\f3d5";\n}\n\n.fa-nutritionix {\n --fa: "\\f3d6";\n}\n\n.fa-page4 {\n --fa: "\\f3d7";\n}\n\n.fa-palfed {\n --fa: "\\f3d8";\n}\n\n.fa-patreon {\n --fa: "\\f3d9";\n}\n\n.fa-periscope {\n --fa: "\\f3da";\n}\n\n.fa-phabricator {\n --fa: "\\f3db";\n}\n\n.fa-phoenix-framework {\n --fa: "\\f3dc";\n}\n\n.fa-playstation {\n --fa: "\\f3df";\n}\n\n.fa-pushed {\n --fa: "\\f3e1";\n}\n\n.fa-python {\n --fa: "\\f3e2";\n}\n\n.fa-red-river {\n --fa: "\\f3e3";\n}\n\n.fa-wpressr {\n --fa: "\\f3e4";\n}\n\n.fa-rendact {\n --fa: "\\f3e4";\n}\n\n.fa-replyd {\n --fa: "\\f3e6";\n}\n\n.fa-resolving {\n --fa: "\\f3e7";\n}\n\n.fa-rocketchat {\n --fa: "\\f3e8";\n}\n\n.fa-rockrms {\n --fa: "\\f3e9";\n}\n\n.fa-schlix {\n --fa: "\\f3ea";\n}\n\n.fa-searchengin {\n --fa: "\\f3eb";\n}\n\n.fa-servicestack {\n --fa: "\\f3ec";\n}\n\n.fa-sistrix {\n --fa: "\\f3ee";\n}\n\n.fa-speakap {\n --fa: "\\f3f3";\n}\n\n.fa-staylinked {\n --fa: "\\f3f5";\n}\n\n.fa-steam-symbol {\n --fa: "\\f3f6";\n}\n\n.fa-sticker-mule {\n --fa: "\\f3f7";\n}\n\n.fa-studiovinari {\n --fa: "\\f3f8";\n}\n\n.fa-supple {\n --fa: "\\f3f9";\n}\n\n.fa-uber {\n --fa: "\\f402";\n}\n\n.fa-uikit {\n --fa: "\\f403";\n}\n\n.fa-uniregistry {\n --fa: "\\f404";\n}\n\n.fa-untappd {\n --fa: "\\f405";\n}\n\n.fa-ussunnah {\n --fa: "\\f407";\n}\n\n.fa-vaadin {\n --fa: "\\f408";\n}\n\n.fa-viber {\n --fa: "\\f409";\n}\n\n.fa-vimeo {\n --fa: "\\f40a";\n}\n\n.fa-vnv {\n --fa: "\\f40b";\n}\n\n.fa-square-whatsapp {\n --fa: "\\f40c";\n}\n\n.fa-whatsapp-square {\n --fa: "\\f40c";\n}\n\n.fa-whmcs {\n --fa: "\\f40d";\n}\n\n.fa-wordpress-simple {\n --fa: "\\f411";\n}\n\n.fa-xbox {\n --fa: "\\f412";\n}\n\n.fa-yandex {\n --fa: "\\f413";\n}\n\n.fa-yandex-international {\n --fa: "\\f414";\n}\n\n.fa-apple-pay {\n --fa: "\\f415";\n}\n\n.fa-cc-apple-pay {\n --fa: "\\f416";\n}\n\n.fa-fly {\n --fa: "\\f417";\n}\n\n.fa-node {\n --fa: "\\f419";\n}\n\n.fa-osi {\n --fa: "\\f41a";\n}\n\n.fa-react {\n --fa: "\\f41b";\n}\n\n.fa-autoprefixer {\n --fa: "\\f41c";\n}\n\n.fa-less {\n --fa: "\\f41d";\n}\n\n.fa-sass {\n --fa: "\\f41e";\n}\n\n.fa-vuejs {\n --fa: "\\f41f";\n}\n\n.fa-angular {\n --fa: "\\f420";\n}\n\n.fa-aviato {\n --fa: "\\f421";\n}\n\n.fa-ember {\n --fa: "\\f423";\n}\n\n.fa-gitter {\n --fa: "\\f426";\n}\n\n.fa-hooli {\n --fa: "\\f427";\n}\n\n.fa-strava {\n --fa: "\\f428";\n}\n\n.fa-stripe {\n --fa: "\\f429";\n}\n\n.fa-stripe-s {\n --fa: "\\f42a";\n}\n\n.fa-typo3 {\n --fa: "\\f42b";\n}\n\n.fa-amazon-pay {\n --fa: "\\f42c";\n}\n\n.fa-cc-amazon-pay {\n --fa: "\\f42d";\n}\n\n.fa-ethereum {\n --fa: "\\f42e";\n}\n\n.fa-korvue {\n --fa: "\\f42f";\n}\n\n.fa-elementor {\n --fa: "\\f430";\n}\n\n.fa-square-youtube {\n --fa: "\\f431";\n}\n\n.fa-youtube-square {\n --fa: "\\f431";\n}\n\n.fa-flipboard {\n --fa: "\\f44d";\n}\n\n.fa-hips {\n --fa: "\\f452";\n}\n\n.fa-php {\n --fa: "\\f457";\n}\n\n.fa-quinscape {\n --fa: "\\f459";\n}\n\n.fa-readme {\n --fa: "\\f4d5";\n}\n\n.fa-java {\n --fa: "\\f4e4";\n}\n\n.fa-pied-piper-hat {\n --fa: "\\f4e5";\n}\n\n.fa-creative-commons-by {\n --fa: "\\f4e7";\n}\n\n.fa-creative-commons-nc {\n --fa: "\\f4e8";\n}\n\n.fa-creative-commons-nc-eu {\n --fa: "\\f4e9";\n}\n\n.fa-creative-commons-nc-jp {\n --fa: "\\f4ea";\n}\n\n.fa-creative-commons-nd {\n --fa: "\\f4eb";\n}\n\n.fa-creative-commons-pd {\n --fa: "\\f4ec";\n}\n\n.fa-creative-commons-pd-alt {\n --fa: "\\f4ed";\n}\n\n.fa-creative-commons-remix {\n --fa: "\\f4ee";\n}\n\n.fa-creative-commons-sa {\n --fa: "\\f4ef";\n}\n\n.fa-creative-commons-sampling {\n --fa: "\\f4f0";\n}\n\n.fa-creative-commons-sampling-plus {\n --fa: "\\f4f1";\n}\n\n.fa-creative-commons-share {\n --fa: "\\f4f2";\n}\n\n.fa-creative-commons-zero {\n --fa: "\\f4f3";\n}\n\n.fa-ebay {\n --fa: "\\f4f4";\n}\n\n.fa-keybase {\n --fa: "\\f4f5";\n}\n\n.fa-mastodon {\n --fa: "\\f4f6";\n}\n\n.fa-r-project {\n --fa: "\\f4f7";\n}\n\n.fa-researchgate {\n --fa: "\\f4f8";\n}\n\n.fa-teamspeak {\n --fa: "\\f4f9";\n}\n\n.fa-first-order-alt {\n --fa: "\\f50a";\n}\n\n.fa-fulcrum {\n --fa: "\\f50b";\n}\n\n.fa-galactic-republic {\n --fa: "\\f50c";\n}\n\n.fa-galactic-senate {\n --fa: "\\f50d";\n}\n\n.fa-jedi-order {\n --fa: "\\f50e";\n}\n\n.fa-mandalorian {\n --fa: "\\f50f";\n}\n\n.fa-old-republic {\n --fa: "\\f510";\n}\n\n.fa-phoenix-squadron {\n --fa: "\\f511";\n}\n\n.fa-sith {\n --fa: "\\f512";\n}\n\n.fa-trade-federation {\n --fa: "\\f513";\n}\n\n.fa-wolf-pack-battalion {\n --fa: "\\f514";\n}\n\n.fa-hornbill {\n --fa: "\\f592";\n}\n\n.fa-mailchimp {\n --fa: "\\f59e";\n}\n\n.fa-megaport {\n --fa: "\\f5a3";\n}\n\n.fa-nimblr {\n --fa: "\\f5a8";\n}\n\n.fa-rev {\n --fa: "\\f5b2";\n}\n\n.fa-shopware {\n --fa: "\\f5b5";\n}\n\n.fa-squarespace {\n --fa: "\\f5be";\n}\n\n.fa-themeco {\n --fa: "\\f5c6";\n}\n\n.fa-weebly {\n --fa: "\\f5cc";\n}\n\n.fa-wix {\n --fa: "\\f5cf";\n}\n\n.fa-ello {\n --fa: "\\f5f1";\n}\n\n.fa-hackerrank {\n --fa: "\\f5f7";\n}\n\n.fa-kaggle {\n --fa: "\\f5fa";\n}\n\n.fa-markdown {\n --fa: "\\f60f";\n}\n\n.fa-neos {\n --fa: "\\f612";\n}\n\n.fa-zhihu {\n --fa: "\\f63f";\n}\n\n.fa-alipay {\n --fa: "\\f642";\n}\n\n.fa-the-red-yeti {\n --fa: "\\f69d";\n}\n\n.fa-critical-role {\n --fa: "\\f6c9";\n}\n\n.fa-d-and-d-beyond {\n --fa: "\\f6ca";\n}\n\n.fa-dev {\n --fa: "\\f6cc";\n}\n\n.fa-fantasy-flight-games {\n --fa: "\\f6dc";\n}\n\n.fa-wizards-of-the-coast {\n --fa: "\\f730";\n}\n\n.fa-think-peaks {\n --fa: "\\f731";\n}\n\n.fa-reacteurope {\n --fa: "\\f75d";\n}\n\n.fa-artstation {\n --fa: "\\f77a";\n}\n\n.fa-atlassian {\n --fa: "\\f77b";\n}\n\n.fa-canadian-maple-leaf {\n --fa: "\\f785";\n}\n\n.fa-centos {\n --fa: "\\f789";\n}\n\n.fa-confluence {\n --fa: "\\f78d";\n}\n\n.fa-dhl {\n --fa: "\\f790";\n}\n\n.fa-diaspora {\n --fa: "\\f791";\n}\n\n.fa-fedex {\n --fa: "\\f797";\n}\n\n.fa-fedora {\n --fa: "\\f798";\n}\n\n.fa-figma {\n --fa: "\\f799";\n}\n\n.fa-intercom {\n --fa: "\\f7af";\n}\n\n.fa-invision {\n --fa: "\\f7b0";\n}\n\n.fa-jira {\n --fa: "\\f7b1";\n}\n\n.fa-mendeley {\n --fa: "\\f7b3";\n}\n\n.fa-raspberry-pi {\n --fa: "\\f7bb";\n}\n\n.fa-redhat {\n --fa: "\\f7bc";\n}\n\n.fa-sketch {\n --fa: "\\f7c6";\n}\n\n.fa-sourcetree {\n --fa: "\\f7d3";\n}\n\n.fa-suse {\n --fa: "\\f7d6";\n}\n\n.fa-ubuntu {\n --fa: "\\f7df";\n}\n\n.fa-ups {\n --fa: "\\f7e0";\n}\n\n.fa-usps {\n --fa: "\\f7e1";\n}\n\n.fa-yarn {\n --fa: "\\f7e3";\n}\n\n.fa-airbnb {\n --fa: "\\f834";\n}\n\n.fa-battle-net {\n --fa: "\\f835";\n}\n\n.fa-bootstrap {\n --fa: "\\f836";\n}\n\n.fa-buffer {\n --fa: "\\f837";\n}\n\n.fa-chromecast {\n --fa: "\\f838";\n}\n\n.fa-evernote {\n --fa: "\\f839";\n}\n\n.fa-itch-io {\n --fa: "\\f83a";\n}\n\n.fa-salesforce {\n --fa: "\\f83b";\n}\n\n.fa-speaker-deck {\n --fa: "\\f83c";\n}\n\n.fa-symfony {\n --fa: "\\f83d";\n}\n\n.fa-waze {\n --fa: "\\f83f";\n}\n\n.fa-yammer {\n --fa: "\\f840";\n}\n\n.fa-git-alt {\n --fa: "\\f841";\n}\n\n.fa-stackpath {\n --fa: "\\f842";\n}\n\n.fa-cotton-bureau {\n --fa: "\\f89e";\n}\n\n.fa-buy-n-large {\n --fa: "\\f8a6";\n}\n\n.fa-mdb {\n --fa: "\\f8ca";\n}\n\n.fa-orcid {\n --fa: "\\f8d2";\n}\n\n.fa-swift {\n --fa: "\\f8e1";\n}\n\n.fa-umbraco {\n --fa: "\\f8e8";\n}:root, :host {\n --fa-family-classic: \'Font Awesome 7 Free\';\n --fa-font-regular: normal 400 1em/1 var(--fa-family-classic);\n /* deprecated: this older custom property will be removed next major release */\n --fa-style-family-classic: var(--fa-family-classic);\n}\n\n@font-face {\n font-family: "Font Awesome 7 Free";\n font-style: normal;\n font-weight: 400;\n font-display: block;\n src: url("../webfonts/fa-regular-400.woff2");\n}\n.far {\n --fa-family: var(--fa-family-classic);\n --fa-style: 400;\n}\n\n.fa-classic {\n --fa-family: var(--fa-family-classic);\n}\n\n.fa-regular {\n --fa-style: 400;\n}:root, :host {\n --fa-family-classic: \'Font Awesome 7 Free\';\n --fa-font-solid: normal 900 1em/1 var(--fa-family-classic);\n /* deprecated: this older custom property will be removed next major release */\n --fa-style-family-classic: var(--fa-family-classic);\n}\n\n@font-face {\n font-family: "Font Awesome 7 Free";\n font-style: normal;\n font-weight: 900;\n font-display: block;\n src: url("../webfonts/fa-solid-900.woff2");\n}\n.fas {\n --fa-family: var(--fa-family-classic);\n --fa-style: 900;\n}\n\n.fa-classic {\n --fa-family: var(--fa-family-classic);\n}\n\n.fa-solid {\n --fa-style: 900;\n}@font-face {\n font-family: "Font Awesome 5 Brands";\n font-display: block;\n font-weight: 400;\n src: url("../webfonts/fa-brands-400.woff2") format("woff2");\n}\n@font-face {\n font-family: "Font Awesome 5 Free";\n font-display: block;\n font-weight: 900;\n src: url("../webfonts/fa-solid-900.woff2") format("woff2");\n}\n@font-face {\n font-family: "Font Awesome 5 Free";\n font-display: block;\n font-weight: 400;\n src: url("../webfonts/fa-regular-400.woff2") format("woff2");\n}@font-face {\n font-family: "FontAwesome";\n font-display: block;\n src: url("../webfonts/fa-solid-900.woff2") format("woff2");\n}\n@font-face {\n font-family: "FontAwesome";\n font-display: block;\n src: url("../webfonts/fa-brands-400.woff2") format("woff2");\n}\n@font-face {\n font-family: "FontAwesome";\n font-display: block;\n src: url("../webfonts/fa-regular-400.woff2") format("woff2");\n unicode-range: U+F003, U+F006, U+F014, U+F016-F017, U+F01A-F01B, U+F01D, U+F022, U+F03E, U+F044, U+F046, U+F05C-F05D, U+F06E, U+F070, U+F087-F088, U+F08A, U+F094, U+F096-F097, U+F09D, U+F0A0, U+F0A2, U+F0A4-F0A7, U+F0C5, U+F0C7, U+F0E5-F0E6, U+F0EB, U+F0F6-F0F8, U+F10C, U+F114-F115, U+F118-F11A, U+F11C-F11D, U+F133, U+F147, U+F14E, U+F150-F152, U+F185-F186, U+F18E, U+F190-F192, U+F196, U+F1C1-F1C9, U+F1D9, U+F1DB, U+F1E3, U+F1EA, U+F1F7, U+F1F9, U+F20A, U+F247-F248, U+F24A, U+F24D, U+F255-F25B, U+F25D, U+F271-F274, U+F278, U+F27B, U+F28C, U+F28E, U+F29C, U+F2B5, U+F2B7, U+F2BA, U+F2BC, U+F2BE, U+F2C0-F2C1, U+F2C3, U+F2D0, U+F2D2, U+F2D4, U+F2DC;\n}\n@font-face {\n font-family: "FontAwesome";\n font-display: block;\n src: url("../webfonts/fa-v4compatibility.woff2") format("woff2");\n unicode-range: U+F041, U+F047, U+F065-F066, U+F07D-F07E, U+F080, U+F08B, U+F08E, U+F090, U+F09A, U+F0AC, U+F0AE, U+F0B2, U+F0D0, U+F0D6, U+F0E4, U+F0EC, U+F10A-F10B, U+F123, U+F13E, U+F148-F149, U+F14C, U+F156, U+F15E, U+F160-F161, U+F163, U+F175-F178, U+F195, U+F1F8, U+F219, U+F27A;\n}'],sourceRoot:""}]);const p=l;A.d(a,["A",0,p])},769(n,a,A){var f=A(582),e=A.n(f),E=A(991),i=A.n(E),r=A(725),t=A.n(r),C=A(798),o=A.n(C),s=A(754),c=A.n(s),l=A(567),d=A.n(l),m=A(804),u={};u.styleTagTransform=d(),u.setAttributes=o(),u.insert=t().bind(null,"head"),u.domAPI=i(),u.insertStyleElement=c(),e()(m.A,u),m.A&&m.A.locals&&m.A.locals},438(n,a,A){n.exports=A.p+"41062caea457897b1d3b.woff2"},502(n,a,A){n.exports=A.p+"fa2e58edfd73d8341e07.woff2"},322(n,a,A){n.exports=A.p+"dcef2f69dbd5989a2e69.woff2"},999(n,a,A){n.exports=A.p+"2129bf071a83c1d49732.woff2"}}]); +"use strict";(self.webpackChunkapp=self.webpackChunkapp||[]).push([[453],{804(n,a,A){var f=A(220),e=A.n(f),E=A(716),i=A.n(E),r=A(628),t=A.n(r),C=new URL(A(438),A.b),o=new URL(A(502),A.b),s=new URL(A(322),A.b),c=new URL(A(999),A.b),l=i()(e()),d=t()(C),m=t()(o),u=t()(s),b=t()(c);l.push([n.id,`/*!\n * Font Awesome Free 7.3.1 by @fontawesome - https://fontawesome.com\n * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)\n * Copyright 2026 Fonticons, Inc.\n */\n.fa-solid,\n.fa-regular,\n.fa-brands,\n.fa-classic,\n.fas,\n.far,\n.fab,\n.fa {\n --_fa-family: var(--fa-family, var(--fa-style-family, 'Font Awesome 7 Free'));\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n display: var(--fa-display, inline-block);\n font-family: var(--_fa-family);\n font-feature-settings: normal;\n font-style: normal;\n font-synthesis: none;\n font-variant: normal;\n font-weight: var(--fa-style, 900);\n line-height: 1;\n text-align: center;\n text-rendering: auto;\n width: var(--fa-width, 1.25em);\n}\n\n:is(.fas,\n.far,\n.fab,\n.fa-solid,\n.fa-regular,\n.fa-brands,\n.fa-classic,\n.fa)::before {\n content: var(--fa)/"";\n}\n\n@supports not (content: ""/"") {\n :is(.fas,\n .far,\n .fab,\n .fa-solid,\n .fa-regular,\n .fa-brands,\n .fa-classic,\n .fa)::before {\n content: var(--fa);\n }\n}\n.fa-1x {\n font-size: 1em;\n}\n\n.fa-2x {\n font-size: 2em;\n}\n\n.fa-3x {\n font-size: 3em;\n}\n\n.fa-4x {\n font-size: 4em;\n}\n\n.fa-5x {\n font-size: 5em;\n}\n\n.fa-6x {\n font-size: 6em;\n}\n\n.fa-7x {\n font-size: 7em;\n}\n\n.fa-8x {\n font-size: 8em;\n}\n\n.fa-9x {\n font-size: 9em;\n}\n\n.fa-10x {\n font-size: 10em;\n}\n\n.fa-2xs {\n font-size: calc(10 / 16 * 1em); /* converts a 10px size into an em-based value that's relative to the scale's 16px base */\n line-height: calc(1 / 10 * 1em); /* sets the line-height of the icon back to that of it's parent */\n vertical-align: calc((6 / 10 - 0.375) * 1em); /* vertically centers the icon taking into account the surrounding text's descender */\n}\n\n.fa-xs {\n font-size: calc(12 / 16 * 1em); /* converts a 12px size into an em-based value that's relative to the scale's 16px base */\n line-height: calc(1 / 12 * 1em); /* sets the line-height of the icon back to that of it's parent */\n vertical-align: calc((6 / 12 - 0.375) * 1em); /* vertically centers the icon taking into account the surrounding text's descender */\n}\n\n.fa-sm {\n font-size: calc(14 / 16 * 1em); /* converts a 14px size into an em-based value that's relative to the scale's 16px base */\n line-height: calc(1 / 14 * 1em); /* sets the line-height of the icon back to that of it's parent */\n vertical-align: calc((6 / 14 - 0.375) * 1em); /* vertically centers the icon taking into account the surrounding text's descender */\n}\n\n.fa-lg {\n font-size: calc(20 / 16 * 1em); /* converts a 20px size into an em-based value that's relative to the scale's 16px base */\n line-height: calc(1 / 20 * 1em); /* sets the line-height of the icon back to that of it's parent */\n vertical-align: calc((6 / 20 - 0.375) * 1em); /* vertically centers the icon taking into account the surrounding text's descender */\n}\n\n.fa-xl {\n font-size: calc(24 / 16 * 1em); /* converts a 24px size into an em-based value that's relative to the scale's 16px base */\n line-height: calc(1 / 24 * 1em); /* sets the line-height of the icon back to that of it's parent */\n vertical-align: calc((6 / 24 - 0.375) * 1em); /* vertically centers the icon taking into account the surrounding text's descender */\n}\n\n.fa-2xl {\n font-size: calc(32 / 16 * 1em); /* converts a 32px size into an em-based value that's relative to the scale's 16px base */\n line-height: calc(1 / 32 * 1em); /* sets the line-height of the icon back to that of it's parent */\n vertical-align: calc((6 / 32 - 0.375) * 1em); /* vertically centers the icon taking into account the surrounding text's descender */\n}\n\n.fa-width-auto {\n --fa-width: auto;\n}\n\n.fa-fw,\n.fa-width-fixed {\n --fa-width: 1.25em;\n}\n\n.fa-canvas-square {\n padding-block: 0.125em;\n margin-block-end: -0.125em;\n}\n\n.fa-canvas-roomy {\n padding-block: 0.25em;\n padding-inline: 0.125em;\n margin-block-end: -0.25em;\n box-sizing: content-box;\n}\n\n.fa-ul {\n list-style-type: none;\n margin-inline-start: var(--fa-li-margin, 2.5em);\n padding-inline-start: 0;\n}\n.fa-ul > li {\n position: relative;\n}\n\n.fa-li {\n inset-inline-start: calc(-1 * var(--fa-li-width, 2em));\n position: absolute;\n text-align: center;\n width: var(--fa-li-width, 2em);\n line-height: inherit;\n}\n\n/* Heads Up: Bordered Icons will not be supported in the future!\n - This feature will be deprecated in the next major release of Font Awesome (v8)!\n - You may continue to use it in this version *v7), but it will not be supported in Font Awesome v8.\n*/\n/* Notes:\n* --@{v.$css-prefix}-border-width = 1/16 by default (to render as ~1px based on a 16px default font-size)\n* --@{v.$css-prefix}-border-padding =\n ** 3/16 for vertical padding (to give ~2px of vertical whitespace around an icon considering it's vertical alignment)\n ** 4/16 for horizontal padding (to give ~4px of horizontal whitespace around an icon)\n*/\n.fa-border {\n border-color: var(--fa-border-color, #eee);\n border-radius: var(--fa-border-radius, 0.1em);\n border-style: var(--fa-border-style, solid);\n border-width: var(--fa-border-width, 0.0625em);\n box-sizing: var(--fa-border-box-sizing, content-box);\n padding: var(--fa-border-padding, 0.1875em 0.25em);\n}\n\n.fa-pull-left,\n.fa-pull-start {\n float: inline-start;\n margin-inline-end: var(--fa-pull-margin, 0.3em);\n}\n\n.fa-pull-right,\n.fa-pull-end {\n float: inline-end;\n margin-inline-start: var(--fa-pull-margin, 0.3em);\n}\n\n.fa-beat {\n animation-name: fa-beat;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 1s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, ease-in-out);\n}\n\n.fa-bounce {\n animation-name: fa-bounce;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 1s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1));\n}\n\n.fa-fade {\n animation-name: fa-fade;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 1s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, ease-in-out);\n}\n\n.fa-beat-fade {\n animation-name: fa-beat-fade;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 1s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, ease-in-out);\n}\n\n.fa-flip {\n animation-name: fa-flip;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 1.5s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, ease-in-out);\n}\n\n.fa-flip-360 {\n animation-name: fa-flip-360;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 1s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, ease-in-out);\n}\n\n.fa-shake {\n animation-name: fa-shake;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 0.75s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, ease-in-out);\n}\n\n.fa-spin {\n animation-name: fa-spin;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 2s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, linear);\n}\n\n.fa-spin-reverse {\n --fa-animation-direction: reverse;\n}\n\n.fa-pulse,\n.fa-spin-pulse {\n animation-name: fa-spin;\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 1s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, steps(8));\n}\n\n.fa-spin-snap {\n animation-name: fa-spin-snap;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 3s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, linear);\n}\n\n.fa-spin-snap-4 {\n animation-name: fa-spin-snap-4;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 2.4s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, linear);\n}\n\n.fa-spin-snap-8 {\n animation-name: fa-spin-snap-8;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 4s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, linear);\n}\n\n.fa-buzz {\n animation-name: fa-buzz;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 0.6s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, linear);\n}\n\n.fa-wag {\n animation-name: fa-wag;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 0.9s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, ease-out);\n transform-origin: bottom center;\n}\n\n.fa-float {\n animation-name: fa-float;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 3s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, ease-in-out);\n will-change: transform;\n}\n\n.fa-swing {\n animation-name: fa-swing;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 1.2s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, ease-out);\n transform-origin: top center;\n}\n\n.fa-jello {\n animation-name: fa-jello;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 0.9s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, ease-out);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .fa-beat,\n .fa-bounce,\n .fa-fade,\n .fa-beat-fade,\n .fa-flip,\n .fa-flip-360,\n .fa-pulse,\n .fa-shake,\n .fa-spin,\n .fa-spin-pulse,\n .fa-buzz,\n .fa-float,\n .fa-jello,\n .fa-spin-snap,\n .fa-spin-snap-4,\n .fa-spin-snap-8,\n .fa-swing,\n .fa-wag {\n animation: none !important;\n transition: none !important;\n }\n}\n@keyframes fa-beat {\n 0% {\n transform: scale(1);\n }\n 25% {\n transform: scale(calc(1.25 * var(--fa-beat-scale, 1.25)));\n }\n 45% {\n transform: scale(calc(1.22 * var(--fa-beat-scale, 1.22)));\n }\n 65% {\n transform: scale(calc(1.25 * var(--fa-beat-scale, 1.25)));\n }\n 90% {\n transform: scale(1);\n }\n}\n@keyframes fa-bounce {\n 0% {\n transform: scale(1, 1) translateY(0);\n animation-timing-function: var(--fa-animation-timing);\n }\n 14% {\n transform: scale(var(--fa-bounce-start-scale-x, 1.06), var(--fa-bounce-start-scale-y, 0.94)) translateY(var(--fa-bounce-anticipation, 3px));\n animation-timing-function: cubic-bezier(0.33, 0, 0.66, 0.33);\n }\n 32% {\n transform: scale(var(--fa-bounce-jump-scale-x, 0.94), var(--fa-bounce-jump-scale-y, 1.12)) translateY(calc(-1 * var(--fa-bounce-height, 0.5em)));\n animation-timing-function: cubic-bezier(0.33, 0.66, 0.66, 1);\n }\n 52% {\n transform: scale(1, 1) translateY(calc(-1 * var(--fa-bounce-height, 0.5em) * 1.1));\n animation-timing-function: cubic-bezier(0.5, 0, 1, 0.5);\n }\n 70% {\n transform: scale(var(--fa-bounce-land-scale-x, 1.06), var(--fa-bounce-land-scale-y, 0.92)) translateY(0);\n animation-timing-function: cubic-bezier(0.33, 0.33, 0.66, 1);\n }\n 85% {\n transform: scale(0.98, 1.04) translateY(calc(-2px * var(--fa-bounce-rebound, 1)));\n animation-timing-function: cubic-bezier(0.33, 0, 0.66, 1);\n }\n 100% {\n transform: scale(1, 1) translateY(0);\n }\n}\n@keyframes fa-fade {\n 0% {\n opacity: 1;\n transform: scale(1);\n animation-timing-function: cubic-bezier(0.2, 0, 0.4, 1);\n }\n 40% {\n opacity: var(--fa-fade-opacity, 0.4);\n transform: scale(0.98);\n animation-timing-function: cubic-bezier(0.4, 0, 0.6, 1);\n }\n 100% {\n opacity: 1;\n transform: scale(1);\n }\n}\n@keyframes fa-beat-fade {\n 0% {\n opacity: var(--fa-beat-fade-opacity, 0.4);\n transform: scale(1);\n animation-timing-function: cubic-bezier(0.2, 0, 0.4, 1);\n }\n 25% {\n opacity: calc(var(--fa-beat-fade-opacity, 0.4) + 0.4);\n transform: scale(var(--fa-beat-fade-scale, 1.28));\n animation-timing-function: cubic-bezier(0.4, 0, 0.6, 1);\n }\n 45% {\n opacity: 1;\n transform: scale(var(--fa-beat-fade-scale, 1.25));\n animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n }\n 65% {\n opacity: calc(var(--fa-beat-fade-opacity, 0.4) + 0.4);\n transform: scale(var(--fa-beat-fade-scale, 1.28));\n animation-timing-function: cubic-bezier(0.4, 0, 0.6, 1);\n }\n 100% {\n opacity: var(--fa-beat-fade-opacity, 0.4);\n transform: scale(1);\n }\n}\n@keyframes fa-flip {\n 0% {\n transform: perspective(2em) scale(1) rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), 0deg);\n animation-timing-function: cubic-bezier(0.2, 0, 0.4, 1);\n }\n 8% {\n transform: perspective(2em) scale(var(--fa-flip-anticipation-scale, 0.95)) rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), 0deg);\n animation-timing-function: cubic-bezier(0.33, 0, 0.66, 0.33);\n }\n 35% {\n transform: perspective(2em) scale(1) rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), calc(var(--fa-flip-angle, -360deg) * 0.6));\n animation-timing-function: linear;\n }\n 65% {\n transform: perspective(2em) scale(1) rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), calc(var(--fa-flip-angle, -360deg) * 0.5));\n animation-timing-function: cubic-bezier(0.33, 0.66, 0.66, 1);\n }\n 92% {\n transform: perspective(2em) scale(1) rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), calc(var(--fa-flip-angle, -360deg) * var(--fa-flip-overshoot, 1.04)));\n animation-timing-function: cubic-bezier(0.33, 0, 0.66, 1);\n }\n 100% {\n transform: perspective(2em) scale(1) rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -360deg));\n }\n}\n@keyframes fa-flip-360 {\n 0% {\n transform: perspective(2em) scale(1) rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), 0deg);\n animation-timing-function: cubic-bezier(0.2, 0, 0.4, 1);\n }\n 8% {\n transform: perspective(2em) scale(var(--fa-flip-anticipation-scale, 0.95)) rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), 0deg);\n animation-timing-function: cubic-bezier(0.33, 0, 0.66, 0.33);\n }\n 50% {\n transform: perspective(2em) scale(1) rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), calc(var(--fa-flip-angle, -360deg) * 0.6));\n animation-timing-function: cubic-bezier(0.33, 0.66, 0.66, 1);\n }\n 80% {\n transform: perspective(2em) scale(1) rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), calc(var(--fa-flip-angle, -360deg) * var(--fa-flip-overshoot, 1.04)));\n animation-timing-function: cubic-bezier(0.33, 0, 0.66, 1);\n }\n 100% {\n transform: perspective(2em) scale(1) rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -360deg));\n }\n}\n@keyframes fa-shake {\n 0% {\n transform: rotate(0deg);\n animation-timing-function: cubic-bezier(0.2, 0, 0.8, 1);\n }\n 8% {\n transform: rotate(35deg) translateX(1px);\n animation-timing-function: cubic-bezier(0.3, 0, 0.7, 1);\n }\n 20% {\n transform: rotate(-22deg) translateX(-1px);\n animation-timing-function: cubic-bezier(0.3, 0, 0.7, 1);\n }\n 35% {\n transform: rotate(15deg) translateX(1px);\n animation-timing-function: cubic-bezier(0.3, 0, 0.7, 1);\n }\n 50% {\n transform: rotate(-9deg);\n animation-timing-function: cubic-bezier(0.4, 0, 0.6, 1);\n }\n 65% {\n transform: rotate(5deg);\n animation-timing-function: cubic-bezier(0.4, 0, 0.6, 1);\n }\n 78% {\n transform: rotate(-3deg);\n animation-timing-function: cubic-bezier(0.4, 0, 0.6, 1);\n }\n 90% {\n transform: rotate(1deg);\n animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n }\n 100% {\n transform: rotate(0deg);\n }\n}\n@keyframes fa-spin {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n@keyframes fa-spin-snap {\n 0% {\n transform: rotate(0deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 12% {\n transform: rotate(60deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 16.67% {\n transform: rotate(60deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 28.67% {\n transform: rotate(120deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 33.33% {\n transform: rotate(120deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 45.33% {\n transform: rotate(180deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 50% {\n transform: rotate(180deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 62% {\n transform: rotate(240deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 66.67% {\n transform: rotate(240deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 78.67% {\n transform: rotate(300deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 83.33% {\n transform: rotate(300deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 95.33% {\n transform: rotate(360deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n@keyframes fa-spin-snap-4 {\n 0% {\n transform: rotate(0deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 15% {\n transform: rotate(90deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 25% {\n transform: rotate(90deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 40% {\n transform: rotate(180deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 50% {\n transform: rotate(180deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 65% {\n transform: rotate(270deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 75% {\n transform: rotate(270deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 90% {\n transform: rotate(360deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n@keyframes fa-spin-snap-8 {\n 0% {\n transform: rotate(0deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 9% {\n transform: rotate(45deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 12.5% {\n transform: rotate(45deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 21.5% {\n transform: rotate(90deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 25% {\n transform: rotate(90deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 34% {\n transform: rotate(135deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 37.5% {\n transform: rotate(135deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 46.5% {\n transform: rotate(180deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 50% {\n transform: rotate(180deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 59% {\n transform: rotate(225deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 62.5% {\n transform: rotate(225deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 71.5% {\n transform: rotate(270deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 75% {\n transform: rotate(270deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 84% {\n transform: rotate(315deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 87.5% {\n transform: rotate(315deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 96.5% {\n transform: rotate(360deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n@keyframes fa-buzz {\n 0% {\n transform: translateX(0) rotate(0deg);\n animation-timing-function: cubic-bezier(0.1, 0, 0.9, 1);\n }\n 5% {\n transform: translateX(var(--fa-buzz-distance, 4px)) rotate(0.5deg);\n }\n 10% {\n transform: translateX(calc(-1 * var(--fa-buzz-distance, 4px))) rotate(-0.5deg);\n }\n 15% {\n transform: translateX(var(--fa-buzz-distance, 4px)) rotate(0.3deg);\n }\n 20% {\n transform: translateX(calc(-1 * var(--fa-buzz-distance, 4px))) rotate(-0.3deg);\n }\n 25% {\n transform: translateX(calc(var(--fa-buzz-distance, 4px) * 0.7)) rotate(0.2deg);\n }\n 30% {\n transform: translateX(calc(-1 * var(--fa-buzz-distance, 4px) * 0.7)) rotate(-0.2deg);\n }\n 35% {\n transform: translateX(calc(var(--fa-buzz-distance, 4px) * 0.4)) rotate(0.1deg);\n }\n 40% {\n transform: translateX(0) rotate(0deg);\n }\n 100% {\n transform: translateX(0) rotate(0deg);\n }\n}\n@keyframes fa-wag {\n 0% {\n transform: rotate(0deg);\n animation-timing-function: cubic-bezier(0.2, 0, 0.6, 1);\n }\n 12% {\n transform: rotate(var(--fa-wag-angle, 12deg));\n animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n }\n 24% {\n transform: rotate(2deg);\n animation-timing-function: cubic-bezier(0.2, 0, 0.6, 1);\n }\n 36% {\n transform: rotate(calc(var(--fa-wag-angle, 12deg) * 0.85));\n animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n }\n 48% {\n transform: rotate(1deg);\n animation-timing-function: cubic-bezier(0.2, 0, 0.6, 1);\n }\n 58% {\n transform: rotate(calc(var(--fa-wag-angle, 12deg) * 0.6));\n animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n }\n 68% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(0deg);\n }\n}\n@keyframes fa-float {\n 0% {\n transform: translateY(0) translateX(0) rotate(0deg) scale(var(--fa-float-squash-x, 1.02), var(--fa-float-squash-y, 0.98));\n animation-timing-function: cubic-bezier(0.33, 0, 0.66, 0.33);\n }\n 15% {\n transform: translateY(calc(-0.4 * var(--fa-float-height, 6px))) translateX(var(--fa-float-drift, 1px)) rotate(var(--fa-float-tilt, 1deg)) scale(1, 1);\n animation-timing-function: cubic-bezier(0.33, 0.66, 0.66, 1);\n }\n 35% {\n transform: translateY(calc(-1 * var(--fa-float-height, 6px))) translateX(0) rotate(0deg) scale(var(--fa-float-stretch-x, 0.98), var(--fa-float-stretch-y, 1.03));\n animation-timing-function: cubic-bezier(0.5, 0, 0.5, 0);\n }\n 50% {\n transform: translateY(calc(-0.92 * var(--fa-float-height, 6px))) translateX(calc(-0.5 * var(--fa-float-drift, 1px))) rotate(calc(-0.5 * var(--fa-float-tilt, 1deg))) scale(0.995, 1.01);\n animation-timing-function: cubic-bezier(0.33, 0, 0.66, 0.33);\n }\n 70% {\n transform: translateY(calc(-0.3 * var(--fa-float-height, 6px))) translateX(calc(-1 * var(--fa-float-drift, 1px))) rotate(calc(-1 * var(--fa-float-tilt, 1deg))) scale(1, 1);\n animation-timing-function: cubic-bezier(0.33, 0.66, 0.66, 1);\n }\n 90% {\n transform: translateY(calc(0.05 * var(--fa-float-height, 6px))) translateX(0) rotate(0deg) scale(var(--fa-float-squash-x, 1.02), var(--fa-float-squash-y, 0.98));\n animation-timing-function: cubic-bezier(0.33, 0, 0.66, 1);\n }\n 100% {\n transform: translateY(0) translateX(0) rotate(0deg) scale(var(--fa-float-squash-x, 1.02), var(--fa-float-squash-y, 0.98));\n }\n}\n@keyframes fa-swing {\n 0% {\n transform: rotate(0deg);\n animation-timing-function: cubic-bezier(0.2, 0, 0.8, 1);\n }\n 8% {\n transform: rotate(var(--fa-swing-angle, 22deg));\n animation-timing-function: cubic-bezier(0.3, 0, 0.7, 1);\n }\n 18% {\n transform: rotate(calc(-1 * var(--fa-swing-angle, 22deg) * 0.85));\n animation-timing-function: cubic-bezier(0.3, 0, 0.7, 1);\n }\n 28% {\n transform: rotate(calc(var(--fa-swing-angle, 22deg) * 0.65));\n animation-timing-function: cubic-bezier(0.35, 0, 0.65, 1);\n }\n 38% {\n transform: rotate(calc(-1 * var(--fa-swing-angle, 22deg) * 0.45));\n animation-timing-function: cubic-bezier(0.4, 0, 0.6, 1);\n }\n 48% {\n transform: rotate(calc(var(--fa-swing-angle, 22deg) * 0.25));\n animation-timing-function: cubic-bezier(0.4, 0, 0.6, 1);\n }\n 56% {\n transform: rotate(calc(-1 * var(--fa-swing-angle, 22deg) * 0.1));\n animation-timing-function: cubic-bezier(0.4, 0, 0.6, 1);\n }\n 64% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(0deg);\n }\n}\n@keyframes fa-jello {\n 0% {\n transform: scale(1, 1);\n animation-timing-function: cubic-bezier(0.2, 0, 0.8, 1);\n }\n 12% {\n transform: scale(var(--fa-jello-scale-x, 1.15), calc(2 - var(--fa-jello-scale-x, 1.15)));\n animation-timing-function: cubic-bezier(0.3, 0, 0.7, 1);\n }\n 24% {\n transform: scale(calc(2 - var(--fa-jello-scale-y, 1.12)), var(--fa-jello-scale-y, 1.12));\n animation-timing-function: cubic-bezier(0.3, 0, 0.7, 1);\n }\n 36% {\n transform: scale(calc(1 + (var(--fa-jello-scale-x, 1.15) - 1) * 0.5), calc(2 - (1 + (var(--fa-jello-scale-x, 1.15) - 1) * 0.5)));\n animation-timing-function: cubic-bezier(0.4, 0, 0.6, 1);\n }\n 48% {\n transform: scale(calc(2 - (1 + (var(--fa-jello-scale-y, 1.12) - 1) * 0.3)), calc(1 + (var(--fa-jello-scale-y, 1.12) - 1) * 0.3));\n animation-timing-function: cubic-bezier(0.4, 0, 0.6, 1);\n }\n 58% {\n transform: scale(1.02, 0.98);\n animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n }\n 68% {\n transform: scale(1, 1);\n }\n 100% {\n transform: scale(1, 1);\n }\n}\n.fa-rotate-90 {\n transform: rotate(90deg);\n}\n\n.fa-rotate-180 {\n transform: rotate(180deg);\n}\n\n.fa-rotate-270 {\n transform: rotate(270deg);\n}\n\n.fa-flip-horizontal {\n transform: scale(-1, 1);\n}\n\n.fa-flip-vertical {\n transform: scale(1, -1);\n}\n\n.fa-flip-both,\n.fa-flip-horizontal.fa-flip-vertical {\n transform: scale(-1, -1);\n}\n\n.fa-rotate-by {\n transform: rotate(var(--fa-rotate-angle, 0));\n}\n\n.fa-stack {\n display: inline-block;\n height: 2em;\n line-height: 2em;\n position: relative;\n vertical-align: middle;\n width: 2.5em;\n}\n\n.fa-stack-1x,\n.fa-stack-2x {\n --fa-width: 100%;\n inset: 0;\n position: absolute;\n text-align: center;\n width: var(--fa-width);\n z-index: var(--fa-stack-z-index, auto);\n}\n\n.fa-stack-1x {\n line-height: inherit;\n}\n\n.fa-stack-2x {\n font-size: 2em;\n}\n\n.fa-inverse {\n color: var(--fa-inverse, #fff);\n}\n\n/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen\n readers do not read off random characters that represent icons */\n\n.fa-0 {\n --fa: "\\30 ";\n}\n\n.fa-1 {\n --fa: "\\31 ";\n}\n\n.fa-2 {\n --fa: "\\32 ";\n}\n\n.fa-3 {\n --fa: "\\33 ";\n}\n\n.fa-4 {\n --fa: "\\34 ";\n}\n\n.fa-5 {\n --fa: "\\35 ";\n}\n\n.fa-6 {\n --fa: "\\36 ";\n}\n\n.fa-7 {\n --fa: "\\37 ";\n}\n\n.fa-8 {\n --fa: "\\38 ";\n}\n\n.fa-9 {\n --fa: "\\39 ";\n}\n\n.fa-exclamation {\n --fa: "\\!";\n}\n\n.fa-hashtag {\n --fa: "\\#";\n}\n\n.fa-dollar-sign {\n --fa: "\\$";\n}\n\n.fa-dollar {\n --fa: "\\$";\n}\n\n.fa-usd {\n --fa: "\\$";\n}\n\n.fa-percent {\n --fa: "\\%";\n}\n\n.fa-percentage {\n --fa: "\\%";\n}\n\n.fa-asterisk {\n --fa: "\\*";\n}\n\n.fa-plus {\n --fa: "\\+";\n}\n\n.fa-add {\n --fa: "\\+";\n}\n\n.fa-less-than {\n --fa: "\\<";\n}\n\n.fa-equals {\n --fa: "\\=";\n}\n\n.fa-greater-than {\n --fa: "\\>";\n}\n\n.fa-question {\n --fa: "\\?";\n}\n\n.fa-at {\n --fa: "\\@";\n}\n\n.fa-a {\n --fa: "A";\n}\n\n.fa-b {\n --fa: "B";\n}\n\n.fa-c {\n --fa: "C";\n}\n\n.fa-d {\n --fa: "D";\n}\n\n.fa-e {\n --fa: "E";\n}\n\n.fa-f {\n --fa: "F";\n}\n\n.fa-g {\n --fa: "G";\n}\n\n.fa-h {\n --fa: "H";\n}\n\n.fa-i {\n --fa: "I";\n}\n\n.fa-j {\n --fa: "J";\n}\n\n.fa-k {\n --fa: "K";\n}\n\n.fa-l {\n --fa: "L";\n}\n\n.fa-m {\n --fa: "M";\n}\n\n.fa-n {\n --fa: "N";\n}\n\n.fa-o {\n --fa: "O";\n}\n\n.fa-p {\n --fa: "P";\n}\n\n.fa-q {\n --fa: "Q";\n}\n\n.fa-r {\n --fa: "R";\n}\n\n.fa-s {\n --fa: "S";\n}\n\n.fa-t {\n --fa: "T";\n}\n\n.fa-u {\n --fa: "U";\n}\n\n.fa-v {\n --fa: "V";\n}\n\n.fa-w {\n --fa: "W";\n}\n\n.fa-x {\n --fa: "X";\n}\n\n.fa-y {\n --fa: "Y";\n}\n\n.fa-z {\n --fa: "Z";\n}\n\n.fa-faucet {\n --fa: "\\e005";\n}\n\n.fa-faucet-drip {\n --fa: "\\e006";\n}\n\n.fa-house-chimney-window {\n --fa: "\\e00d";\n}\n\n.fa-house-signal {\n --fa: "\\e012";\n}\n\n.fa-temperature-arrow-down {\n --fa: "\\e03f";\n}\n\n.fa-temperature-down {\n --fa: "\\e03f";\n}\n\n.fa-temperature-arrow-up {\n --fa: "\\e040";\n}\n\n.fa-temperature-up {\n --fa: "\\e040";\n}\n\n.fa-trailer {\n --fa: "\\e041";\n}\n\n.fa-bacteria {\n --fa: "\\e059";\n}\n\n.fa-bacterium {\n --fa: "\\e05a";\n}\n\n.fa-box-tissue {\n --fa: "\\e05b";\n}\n\n.fa-hand-holding-medical {\n --fa: "\\e05c";\n}\n\n.fa-hand-sparkles {\n --fa: "\\e05d";\n}\n\n.fa-hands-bubbles {\n --fa: "\\e05e";\n}\n\n.fa-hands-wash {\n --fa: "\\e05e";\n}\n\n.fa-handshake-slash {\n --fa: "\\e060";\n}\n\n.fa-handshake-alt-slash {\n --fa: "\\e060";\n}\n\n.fa-handshake-simple-slash {\n --fa: "\\e060";\n}\n\n.fa-head-side-cough {\n --fa: "\\e061";\n}\n\n.fa-head-side-cough-slash {\n --fa: "\\e062";\n}\n\n.fa-head-side-mask {\n --fa: "\\e063";\n}\n\n.fa-head-side-virus {\n --fa: "\\e064";\n}\n\n.fa-house-chimney-user {\n --fa: "\\e065";\n}\n\n.fa-house-laptop {\n --fa: "\\e066";\n}\n\n.fa-laptop-house {\n --fa: "\\e066";\n}\n\n.fa-lungs-virus {\n --fa: "\\e067";\n}\n\n.fa-people-arrows {\n --fa: "\\e068";\n}\n\n.fa-people-arrows-left-right {\n --fa: "\\e068";\n}\n\n.fa-plane-slash {\n --fa: "\\e069";\n}\n\n.fa-pump-medical {\n --fa: "\\e06a";\n}\n\n.fa-pump-soap {\n --fa: "\\e06b";\n}\n\n.fa-shield-virus {\n --fa: "\\e06c";\n}\n\n.fa-sink {\n --fa: "\\e06d";\n}\n\n.fa-soap {\n --fa: "\\e06e";\n}\n\n.fa-stopwatch-20 {\n --fa: "\\e06f";\n}\n\n.fa-shop-slash {\n --fa: "\\e070";\n}\n\n.fa-store-alt-slash {\n --fa: "\\e070";\n}\n\n.fa-store-slash {\n --fa: "\\e071";\n}\n\n.fa-toilet-paper-slash {\n --fa: "\\e072";\n}\n\n.fa-users-slash {\n --fa: "\\e073";\n}\n\n.fa-virus {\n --fa: "\\e074";\n}\n\n.fa-virus-slash {\n --fa: "\\e075";\n}\n\n.fa-viruses {\n --fa: "\\e076";\n}\n\n.fa-vest {\n --fa: "\\e085";\n}\n\n.fa-vest-patches {\n --fa: "\\e086";\n}\n\n.fa-arrow-trend-down {\n --fa: "\\e097";\n}\n\n.fa-arrow-trend-up {\n --fa: "\\e098";\n}\n\n.fa-arrow-up-from-bracket {\n --fa: "\\e09a";\n}\n\n.fa-austral-sign {\n --fa: "\\e0a9";\n}\n\n.fa-baht-sign {\n --fa: "\\e0ac";\n}\n\n.fa-bitcoin-sign {\n --fa: "\\e0b4";\n}\n\n.fa-bolt-lightning {\n --fa: "\\e0b7";\n}\n\n.fa-book-bookmark {\n --fa: "\\e0bb";\n}\n\n.fa-camera-rotate {\n --fa: "\\e0d8";\n}\n\n.fa-cedi-sign {\n --fa: "\\e0df";\n}\n\n.fa-chart-column {\n --fa: "\\e0e3";\n}\n\n.fa-chart-gantt {\n --fa: "\\e0e4";\n}\n\n.fa-clapperboard {\n --fa: "\\e131";\n}\n\n.fa-closed-captioning-slash {\n --fa: "\\e135";\n}\n\n.fa-clover {\n --fa: "\\e139";\n}\n\n.fa-code-compare {\n --fa: "\\e13a";\n}\n\n.fa-code-fork {\n --fa: "\\e13b";\n}\n\n.fa-code-pull-request {\n --fa: "\\e13c";\n}\n\n.fa-colon-sign {\n --fa: "\\e140";\n}\n\n.fa-cruzeiro-sign {\n --fa: "\\e152";\n}\n\n.fa-display {\n --fa: "\\e163";\n}\n\n.fa-dong-sign {\n --fa: "\\e169";\n}\n\n.fa-elevator {\n --fa: "\\e16d";\n}\n\n.fa-filter-circle-xmark {\n --fa: "\\e17b";\n}\n\n.fa-florin-sign {\n --fa: "\\e184";\n}\n\n.fa-folder-closed {\n --fa: "\\e185";\n}\n\n.fa-franc-sign {\n --fa: "\\e18f";\n}\n\n.fa-guarani-sign {\n --fa: "\\e19a";\n}\n\n.fa-gun {\n --fa: "\\e19b";\n}\n\n.fa-hands-clapping {\n --fa: "\\e1a8";\n}\n\n.fa-house-user {\n --fa: "\\e1b0";\n}\n\n.fa-home-user {\n --fa: "\\e1b0";\n}\n\n.fa-indian-rupee-sign {\n --fa: "\\e1bc";\n}\n\n.fa-indian-rupee {\n --fa: "\\e1bc";\n}\n\n.fa-inr {\n --fa: "\\e1bc";\n}\n\n.fa-kip-sign {\n --fa: "\\e1c4";\n}\n\n.fa-lari-sign {\n --fa: "\\e1c8";\n}\n\n.fa-litecoin-sign {\n --fa: "\\e1d3";\n}\n\n.fa-manat-sign {\n --fa: "\\e1d5";\n}\n\n.fa-mask-face {\n --fa: "\\e1d7";\n}\n\n.fa-mill-sign {\n --fa: "\\e1ed";\n}\n\n.fa-money-bills {\n --fa: "\\e1f3";\n}\n\n.fa-naira-sign {\n --fa: "\\e1f6";\n}\n\n.fa-notdef {\n --fa: "\\e1fe";\n}\n\n.fa-panorama {\n --fa: "\\e209";\n}\n\n.fa-peseta-sign {\n --fa: "\\e221";\n}\n\n.fa-peso-sign {\n --fa: "\\e222";\n}\n\n.fa-plane-up {\n --fa: "\\e22d";\n}\n\n.fa-rupiah-sign {\n --fa: "\\e23d";\n}\n\n.fa-stairs {\n --fa: "\\e289";\n}\n\n.fa-timeline {\n --fa: "\\e29c";\n}\n\n.fa-truck-front {\n --fa: "\\e2b7";\n}\n\n.fa-turkish-lira-sign {\n --fa: "\\e2bb";\n}\n\n.fa-try {\n --fa: "\\e2bb";\n}\n\n.fa-turkish-lira {\n --fa: "\\e2bb";\n}\n\n.fa-vault {\n --fa: "\\e2c5";\n}\n\n.fa-wand-magic-sparkles {\n --fa: "\\e2ca";\n}\n\n.fa-magic-wand-sparkles {\n --fa: "\\e2ca";\n}\n\n.fa-wheat-awn {\n --fa: "\\e2cd";\n}\n\n.fa-wheat-alt {\n --fa: "\\e2cd";\n}\n\n.fa-wheelchair-move {\n --fa: "\\e2ce";\n}\n\n.fa-wheelchair-alt {\n --fa: "\\e2ce";\n}\n\n.fa-bangladeshi-taka-sign {\n --fa: "\\e2e6";\n}\n\n.fa-bowl-rice {\n --fa: "\\e2eb";\n}\n\n.fa-person-pregnant {\n --fa: "\\e31e";\n}\n\n.fa-house-chimney {\n --fa: "\\e3af";\n}\n\n.fa-home-lg {\n --fa: "\\e3af";\n}\n\n.fa-house-crack {\n --fa: "\\e3b1";\n}\n\n.fa-house-medical {\n --fa: "\\e3b2";\n}\n\n.fa-cent-sign {\n --fa: "\\e3f5";\n}\n\n.fa-plus-minus {\n --fa: "\\e43c";\n}\n\n.fa-sailboat {\n --fa: "\\e445";\n}\n\n.fa-section {\n --fa: "\\e447";\n}\n\n.fa-shrimp {\n --fa: "\\e448";\n}\n\n.fa-brazilian-real-sign {\n --fa: "\\e46c";\n}\n\n.fa-chart-simple {\n --fa: "\\e473";\n}\n\n.fa-diagram-next {\n --fa: "\\e476";\n}\n\n.fa-diagram-predecessor {\n --fa: "\\e477";\n}\n\n.fa-diagram-successor {\n --fa: "\\e47a";\n}\n\n.fa-earth-oceania {\n --fa: "\\e47b";\n}\n\n.fa-globe-oceania {\n --fa: "\\e47b";\n}\n\n.fa-bug-slash {\n --fa: "\\e490";\n}\n\n.fa-file-circle-plus {\n --fa: "\\e494";\n}\n\n.fa-shop-lock {\n --fa: "\\e4a5";\n}\n\n.fa-virus-covid {\n --fa: "\\e4a8";\n}\n\n.fa-virus-covid-slash {\n --fa: "\\e4a9";\n}\n\n.fa-anchor-circle-check {\n --fa: "\\e4aa";\n}\n\n.fa-anchor-circle-exclamation {\n --fa: "\\e4ab";\n}\n\n.fa-anchor-circle-xmark {\n --fa: "\\e4ac";\n}\n\n.fa-anchor-lock {\n --fa: "\\e4ad";\n}\n\n.fa-arrow-down-up-across-line {\n --fa: "\\e4af";\n}\n\n.fa-arrow-down-up-lock {\n --fa: "\\e4b0";\n}\n\n.fa-arrow-right-to-city {\n --fa: "\\e4b3";\n}\n\n.fa-arrow-up-from-ground-water {\n --fa: "\\e4b5";\n}\n\n.fa-arrow-up-from-water-pump {\n --fa: "\\e4b6";\n}\n\n.fa-arrow-up-right-dots {\n --fa: "\\e4b7";\n}\n\n.fa-arrows-down-to-line {\n --fa: "\\e4b8";\n}\n\n.fa-arrows-down-to-people {\n --fa: "\\e4b9";\n}\n\n.fa-arrows-left-right-to-line {\n --fa: "\\e4ba";\n}\n\n.fa-arrows-spin {\n --fa: "\\e4bb";\n}\n\n.fa-arrows-split-up-and-left {\n --fa: "\\e4bc";\n}\n\n.fa-arrows-to-circle {\n --fa: "\\e4bd";\n}\n\n.fa-arrows-to-dot {\n --fa: "\\e4be";\n}\n\n.fa-arrows-to-eye {\n --fa: "\\e4bf";\n}\n\n.fa-arrows-turn-right {\n --fa: "\\e4c0";\n}\n\n.fa-arrows-turn-to-dots {\n --fa: "\\e4c1";\n}\n\n.fa-arrows-up-to-line {\n --fa: "\\e4c2";\n}\n\n.fa-bore-hole {\n --fa: "\\e4c3";\n}\n\n.fa-bottle-droplet {\n --fa: "\\e4c4";\n}\n\n.fa-bottle-water {\n --fa: "\\e4c5";\n}\n\n.fa-bowl-food {\n --fa: "\\e4c6";\n}\n\n.fa-boxes-packing {\n --fa: "\\e4c7";\n}\n\n.fa-bridge {\n --fa: "\\e4c8";\n}\n\n.fa-bridge-circle-check {\n --fa: "\\e4c9";\n}\n\n.fa-bridge-circle-exclamation {\n --fa: "\\e4ca";\n}\n\n.fa-bridge-circle-xmark {\n --fa: "\\e4cb";\n}\n\n.fa-bridge-lock {\n --fa: "\\e4cc";\n}\n\n.fa-bridge-water {\n --fa: "\\e4ce";\n}\n\n.fa-bucket {\n --fa: "\\e4cf";\n}\n\n.fa-bugs {\n --fa: "\\e4d0";\n}\n\n.fa-building-circle-arrow-right {\n --fa: "\\e4d1";\n}\n\n.fa-building-circle-check {\n --fa: "\\e4d2";\n}\n\n.fa-building-circle-exclamation {\n --fa: "\\e4d3";\n}\n\n.fa-building-circle-xmark {\n --fa: "\\e4d4";\n}\n\n.fa-building-flag {\n --fa: "\\e4d5";\n}\n\n.fa-building-lock {\n --fa: "\\e4d6";\n}\n\n.fa-building-ngo {\n --fa: "\\e4d7";\n}\n\n.fa-building-shield {\n --fa: "\\e4d8";\n}\n\n.fa-building-un {\n --fa: "\\e4d9";\n}\n\n.fa-building-user {\n --fa: "\\e4da";\n}\n\n.fa-building-wheat {\n --fa: "\\e4db";\n}\n\n.fa-burst {\n --fa: "\\e4dc";\n}\n\n.fa-car-on {\n --fa: "\\e4dd";\n}\n\n.fa-car-tunnel {\n --fa: "\\e4de";\n}\n\n.fa-child-combatant {\n --fa: "\\e4e0";\n}\n\n.fa-child-rifle {\n --fa: "\\e4e0";\n}\n\n.fa-children {\n --fa: "\\e4e1";\n}\n\n.fa-circle-nodes {\n --fa: "\\e4e2";\n}\n\n.fa-clipboard-question {\n --fa: "\\e4e3";\n}\n\n.fa-cloud-showers-water {\n --fa: "\\e4e4";\n}\n\n.fa-computer {\n --fa: "\\e4e5";\n}\n\n.fa-cubes-stacked {\n --fa: "\\e4e6";\n}\n\n.fa-envelope-circle-check {\n --fa: "\\e4e8";\n}\n\n.fa-explosion {\n --fa: "\\e4e9";\n}\n\n.fa-ferry {\n --fa: "\\e4ea";\n}\n\n.fa-file-circle-exclamation {\n --fa: "\\e4eb";\n}\n\n.fa-file-circle-minus {\n --fa: "\\e4ed";\n}\n\n.fa-file-circle-question {\n --fa: "\\e4ef";\n}\n\n.fa-file-shield {\n --fa: "\\e4f0";\n}\n\n.fa-fire-burner {\n --fa: "\\e4f1";\n}\n\n.fa-fish-fins {\n --fa: "\\e4f2";\n}\n\n.fa-flask-vial {\n --fa: "\\e4f3";\n}\n\n.fa-glass-water {\n --fa: "\\e4f4";\n}\n\n.fa-glass-water-droplet {\n --fa: "\\e4f5";\n}\n\n.fa-group-arrows-rotate {\n --fa: "\\e4f6";\n}\n\n.fa-hand-holding-hand {\n --fa: "\\e4f7";\n}\n\n.fa-handcuffs {\n --fa: "\\e4f8";\n}\n\n.fa-hands-bound {\n --fa: "\\e4f9";\n}\n\n.fa-hands-holding-child {\n --fa: "\\e4fa";\n}\n\n.fa-hands-holding-circle {\n --fa: "\\e4fb";\n}\n\n.fa-heart-circle-bolt {\n --fa: "\\e4fc";\n}\n\n.fa-heart-circle-check {\n --fa: "\\e4fd";\n}\n\n.fa-heart-circle-exclamation {\n --fa: "\\e4fe";\n}\n\n.fa-heart-circle-minus {\n --fa: "\\e4ff";\n}\n\n.fa-heart-circle-plus {\n --fa: "\\e500";\n}\n\n.fa-heart-circle-xmark {\n --fa: "\\e501";\n}\n\n.fa-helicopter-symbol {\n --fa: "\\e502";\n}\n\n.fa-helmet-un {\n --fa: "\\e503";\n}\n\n.fa-hill-avalanche {\n --fa: "\\e507";\n}\n\n.fa-hill-rockslide {\n --fa: "\\e508";\n}\n\n.fa-house-circle-check {\n --fa: "\\e509";\n}\n\n.fa-house-circle-exclamation {\n --fa: "\\e50a";\n}\n\n.fa-house-circle-xmark {\n --fa: "\\e50b";\n}\n\n.fa-house-fire {\n --fa: "\\e50c";\n}\n\n.fa-house-flag {\n --fa: "\\e50d";\n}\n\n.fa-house-flood-water {\n --fa: "\\e50e";\n}\n\n.fa-house-flood-water-circle-arrow-right {\n --fa: "\\e50f";\n}\n\n.fa-house-lock {\n --fa: "\\e510";\n}\n\n.fa-house-medical-circle-check {\n --fa: "\\e511";\n}\n\n.fa-house-medical-circle-exclamation {\n --fa: "\\e512";\n}\n\n.fa-house-medical-circle-xmark {\n --fa: "\\e513";\n}\n\n.fa-house-medical-flag {\n --fa: "\\e514";\n}\n\n.fa-house-tsunami {\n --fa: "\\e515";\n}\n\n.fa-jar {\n --fa: "\\e516";\n}\n\n.fa-jar-wheat {\n --fa: "\\e517";\n}\n\n.fa-jet-fighter-up {\n --fa: "\\e518";\n}\n\n.fa-jug-detergent {\n --fa: "\\e519";\n}\n\n.fa-kitchen-set {\n --fa: "\\e51a";\n}\n\n.fa-land-mine-on {\n --fa: "\\e51b";\n}\n\n.fa-landmark-flag {\n --fa: "\\e51c";\n}\n\n.fa-laptop-file {\n --fa: "\\e51d";\n}\n\n.fa-lines-leaning {\n --fa: "\\e51e";\n}\n\n.fa-location-pin-lock {\n --fa: "\\e51f";\n}\n\n.fa-locust {\n --fa: "\\e520";\n}\n\n.fa-magnifying-glass-arrow-right {\n --fa: "\\e521";\n}\n\n.fa-magnifying-glass-chart {\n --fa: "\\e522";\n}\n\n.fa-mars-and-venus-burst {\n --fa: "\\e523";\n}\n\n.fa-mask-ventilator {\n --fa: "\\e524";\n}\n\n.fa-mattress-pillow {\n --fa: "\\e525";\n}\n\n.fa-mobile-retro {\n --fa: "\\e527";\n}\n\n.fa-money-bill-transfer {\n --fa: "\\e528";\n}\n\n.fa-money-bill-trend-up {\n --fa: "\\e529";\n}\n\n.fa-money-bill-wheat {\n --fa: "\\e52a";\n}\n\n.fa-mosquito {\n --fa: "\\e52b";\n}\n\n.fa-mosquito-net {\n --fa: "\\e52c";\n}\n\n.fa-mound {\n --fa: "\\e52d";\n}\n\n.fa-mountain-city {\n --fa: "\\e52e";\n}\n\n.fa-mountain-sun {\n --fa: "\\e52f";\n}\n\n.fa-oil-well {\n --fa: "\\e532";\n}\n\n.fa-people-group {\n --fa: "\\e533";\n}\n\n.fa-people-line {\n --fa: "\\e534";\n}\n\n.fa-people-pulling {\n --fa: "\\e535";\n}\n\n.fa-people-robbery {\n --fa: "\\e536";\n}\n\n.fa-people-roof {\n --fa: "\\e537";\n}\n\n.fa-person-arrow-down-to-line {\n --fa: "\\e538";\n}\n\n.fa-person-arrow-up-from-line {\n --fa: "\\e539";\n}\n\n.fa-person-breastfeeding {\n --fa: "\\e53a";\n}\n\n.fa-person-burst {\n --fa: "\\e53b";\n}\n\n.fa-person-cane {\n --fa: "\\e53c";\n}\n\n.fa-person-chalkboard {\n --fa: "\\e53d";\n}\n\n.fa-person-circle-check {\n --fa: "\\e53e";\n}\n\n.fa-person-circle-exclamation {\n --fa: "\\e53f";\n}\n\n.fa-person-circle-minus {\n --fa: "\\e540";\n}\n\n.fa-person-circle-plus {\n --fa: "\\e541";\n}\n\n.fa-person-circle-question {\n --fa: "\\e542";\n}\n\n.fa-person-circle-xmark {\n --fa: "\\e543";\n}\n\n.fa-person-dress-burst {\n --fa: "\\e544";\n}\n\n.fa-person-drowning {\n --fa: "\\e545";\n}\n\n.fa-person-falling {\n --fa: "\\e546";\n}\n\n.fa-person-falling-burst {\n --fa: "\\e547";\n}\n\n.fa-person-half-dress {\n --fa: "\\e548";\n}\n\n.fa-person-harassing {\n --fa: "\\e549";\n}\n\n.fa-person-military-pointing {\n --fa: "\\e54a";\n}\n\n.fa-person-military-rifle {\n --fa: "\\e54b";\n}\n\n.fa-person-military-to-person {\n --fa: "\\e54c";\n}\n\n.fa-person-rays {\n --fa: "\\e54d";\n}\n\n.fa-person-rifle {\n --fa: "\\e54e";\n}\n\n.fa-person-shelter {\n --fa: "\\e54f";\n}\n\n.fa-person-walking-arrow-loop-left {\n --fa: "\\e551";\n}\n\n.fa-person-walking-arrow-right {\n --fa: "\\e552";\n}\n\n.fa-person-walking-dashed-line-arrow-right {\n --fa: "\\e553";\n}\n\n.fa-person-walking-luggage {\n --fa: "\\e554";\n}\n\n.fa-plane-circle-check {\n --fa: "\\e555";\n}\n\n.fa-plane-circle-exclamation {\n --fa: "\\e556";\n}\n\n.fa-plane-circle-xmark {\n --fa: "\\e557";\n}\n\n.fa-plane-lock {\n --fa: "\\e558";\n}\n\n.fa-plate-wheat {\n --fa: "\\e55a";\n}\n\n.fa-plug-circle-bolt {\n --fa: "\\e55b";\n}\n\n.fa-plug-circle-check {\n --fa: "\\e55c";\n}\n\n.fa-plug-circle-exclamation {\n --fa: "\\e55d";\n}\n\n.fa-plug-circle-minus {\n --fa: "\\e55e";\n}\n\n.fa-plug-circle-plus {\n --fa: "\\e55f";\n}\n\n.fa-plug-circle-xmark {\n --fa: "\\e560";\n}\n\n.fa-ranking-star {\n --fa: "\\e561";\n}\n\n.fa-road-barrier {\n --fa: "\\e562";\n}\n\n.fa-road-bridge {\n --fa: "\\e563";\n}\n\n.fa-road-circle-check {\n --fa: "\\e564";\n}\n\n.fa-road-circle-exclamation {\n --fa: "\\e565";\n}\n\n.fa-road-circle-xmark {\n --fa: "\\e566";\n}\n\n.fa-road-lock {\n --fa: "\\e567";\n}\n\n.fa-road-spikes {\n --fa: "\\e568";\n}\n\n.fa-rug {\n --fa: "\\e569";\n}\n\n.fa-sack-xmark {\n --fa: "\\e56a";\n}\n\n.fa-school-circle-check {\n --fa: "\\e56b";\n}\n\n.fa-school-circle-exclamation {\n --fa: "\\e56c";\n}\n\n.fa-school-circle-xmark {\n --fa: "\\e56d";\n}\n\n.fa-school-flag {\n --fa: "\\e56e";\n}\n\n.fa-school-lock {\n --fa: "\\e56f";\n}\n\n.fa-sheet-plastic {\n --fa: "\\e571";\n}\n\n.fa-shield-cat {\n --fa: "\\e572";\n}\n\n.fa-shield-dog {\n --fa: "\\e573";\n}\n\n.fa-shield-heart {\n --fa: "\\e574";\n}\n\n.fa-square-nfi {\n --fa: "\\e576";\n}\n\n.fa-square-person-confined {\n --fa: "\\e577";\n}\n\n.fa-square-virus {\n --fa: "\\e578";\n}\n\n.fa-staff-snake {\n --fa: "\\e579";\n}\n\n.fa-rod-asclepius {\n --fa: "\\e579";\n}\n\n.fa-rod-snake {\n --fa: "\\e579";\n}\n\n.fa-staff-aesculapius {\n --fa: "\\e579";\n}\n\n.fa-sun-plant-wilt {\n --fa: "\\e57a";\n}\n\n.fa-tarp {\n --fa: "\\e57b";\n}\n\n.fa-tarp-droplet {\n --fa: "\\e57c";\n}\n\n.fa-tent {\n --fa: "\\e57d";\n}\n\n.fa-tent-arrow-down-to-line {\n --fa: "\\e57e";\n}\n\n.fa-tent-arrow-left-right {\n --fa: "\\e57f";\n}\n\n.fa-tent-arrow-turn-left {\n --fa: "\\e580";\n}\n\n.fa-tent-arrows-down {\n --fa: "\\e581";\n}\n\n.fa-tents {\n --fa: "\\e582";\n}\n\n.fa-toilet-portable {\n --fa: "\\e583";\n}\n\n.fa-toilets-portable {\n --fa: "\\e584";\n}\n\n.fa-tower-cell {\n --fa: "\\e585";\n}\n\n.fa-tower-observation {\n --fa: "\\e586";\n}\n\n.fa-tree-city {\n --fa: "\\e587";\n}\n\n.fa-trowel {\n --fa: "\\e589";\n}\n\n.fa-trowel-bricks {\n --fa: "\\e58a";\n}\n\n.fa-truck-arrow-right {\n --fa: "\\e58b";\n}\n\n.fa-truck-droplet {\n --fa: "\\e58c";\n}\n\n.fa-truck-field {\n --fa: "\\e58d";\n}\n\n.fa-truck-field-un {\n --fa: "\\e58e";\n}\n\n.fa-truck-plane {\n --fa: "\\e58f";\n}\n\n.fa-users-between-lines {\n --fa: "\\e591";\n}\n\n.fa-users-line {\n --fa: "\\e592";\n}\n\n.fa-users-rays {\n --fa: "\\e593";\n}\n\n.fa-users-rectangle {\n --fa: "\\e594";\n}\n\n.fa-users-viewfinder {\n --fa: "\\e595";\n}\n\n.fa-vial-circle-check {\n --fa: "\\e596";\n}\n\n.fa-vial-virus {\n --fa: "\\e597";\n}\n\n.fa-wheat-awn-circle-exclamation {\n --fa: "\\e598";\n}\n\n.fa-worm {\n --fa: "\\e599";\n}\n\n.fa-xmarks-lines {\n --fa: "\\e59a";\n}\n\n.fa-child-dress {\n --fa: "\\e59c";\n}\n\n.fa-child-reaching {\n --fa: "\\e59d";\n}\n\n.fa-file-circle-check {\n --fa: "\\e5a0";\n}\n\n.fa-file-circle-xmark {\n --fa: "\\e5a1";\n}\n\n.fa-person-through-window {\n --fa: "\\e5a9";\n}\n\n.fa-plant-wilt {\n --fa: "\\e5aa";\n}\n\n.fa-stapler {\n --fa: "\\e5af";\n}\n\n.fa-train-tram {\n --fa: "\\e5b4";\n}\n\n.fa-table-cells-column-lock {\n --fa: "\\e678";\n}\n\n.fa-table-cells-row-lock {\n --fa: "\\e67a";\n}\n\n.fa-web-awesome {\n --fa: "\\e682";\n}\n\n.fa-thumbtack-slash {\n --fa: "\\e68f";\n}\n\n.fa-thumb-tack-slash {\n --fa: "\\e68f";\n}\n\n.fa-table-cells-row-unlock {\n --fa: "\\e691";\n}\n\n.fa-chart-diagram {\n --fa: "\\e695";\n}\n\n.fa-comment-nodes {\n --fa: "\\e696";\n}\n\n.fa-file-fragment {\n --fa: "\\e697";\n}\n\n.fa-file-half-dashed {\n --fa: "\\e698";\n}\n\n.fa-hexagon-nodes {\n --fa: "\\e699";\n}\n\n.fa-hexagon-nodes-bolt {\n --fa: "\\e69a";\n}\n\n.fa-square-binary {\n --fa: "\\e69b";\n}\n\n.fa-pentagon {\n --fa: "\\e790";\n}\n\n.fa-non-binary {\n --fa: "\\e807";\n}\n\n.fa-spiral {\n --fa: "\\e80a";\n}\n\n.fa-picture-in-picture {\n --fa: "\\e80b";\n}\n\n.fa-mobile-vibrate {\n --fa: "\\e816";\n}\n\n.fa-single-quote-left {\n --fa: "\\e81b";\n}\n\n.fa-single-quote-right {\n --fa: "\\e81c";\n}\n\n.fa-bus-side {\n --fa: "\\e81d";\n}\n\n.fa-septagon {\n --fa: "\\e820";\n}\n\n.fa-heptagon {\n --fa: "\\e820";\n}\n\n.fa-aquarius {\n --fa: "\\e845";\n}\n\n.fa-aries {\n --fa: "\\e846";\n}\n\n.fa-cancer {\n --fa: "\\e847";\n}\n\n.fa-capricorn {\n --fa: "\\e848";\n}\n\n.fa-gemini {\n --fa: "\\e849";\n}\n\n.fa-leo {\n --fa: "\\e84a";\n}\n\n.fa-libra {\n --fa: "\\e84b";\n}\n\n.fa-pisces {\n --fa: "\\e84c";\n}\n\n.fa-sagittarius {\n --fa: "\\e84d";\n}\n\n.fa-scorpio {\n --fa: "\\e84e";\n}\n\n.fa-taurus {\n --fa: "\\e84f";\n}\n\n.fa-virgo {\n --fa: "\\e850";\n}\n\n.fa-martini-glass-empty {\n --fa: "\\f000";\n}\n\n.fa-glass-martini {\n --fa: "\\f000";\n}\n\n.fa-music {\n --fa: "\\f001";\n}\n\n.fa-magnifying-glass {\n --fa: "\\f002";\n}\n\n.fa-search {\n --fa: "\\f002";\n}\n\n.fa-heart {\n --fa: "\\f004";\n}\n\n.fa-star {\n --fa: "\\f005";\n}\n\n.fa-user {\n --fa: "\\f007";\n}\n\n.fa-user-alt {\n --fa: "\\f007";\n}\n\n.fa-user-large {\n --fa: "\\f007";\n}\n\n.fa-film {\n --fa: "\\f008";\n}\n\n.fa-film-alt {\n --fa: "\\f008";\n}\n\n.fa-film-simple {\n --fa: "\\f008";\n}\n\n.fa-table-cells-large {\n --fa: "\\f009";\n}\n\n.fa-th-large {\n --fa: "\\f009";\n}\n\n.fa-table-cells {\n --fa: "\\f00a";\n}\n\n.fa-th {\n --fa: "\\f00a";\n}\n\n.fa-table-list {\n --fa: "\\f00b";\n}\n\n.fa-th-list {\n --fa: "\\f00b";\n}\n\n.fa-check {\n --fa: "\\f00c";\n}\n\n.fa-xmark {\n --fa: "\\f00d";\n}\n\n.fa-close {\n --fa: "\\f00d";\n}\n\n.fa-multiply {\n --fa: "\\f00d";\n}\n\n.fa-remove {\n --fa: "\\f00d";\n}\n\n.fa-times {\n --fa: "\\f00d";\n}\n\n.fa-magnifying-glass-plus {\n --fa: "\\f00e";\n}\n\n.fa-search-plus {\n --fa: "\\f00e";\n}\n\n.fa-magnifying-glass-minus {\n --fa: "\\f010";\n}\n\n.fa-search-minus {\n --fa: "\\f010";\n}\n\n.fa-power-off {\n --fa: "\\f011";\n}\n\n.fa-signal {\n --fa: "\\f012";\n}\n\n.fa-signal-5 {\n --fa: "\\f012";\n}\n\n.fa-signal-perfect {\n --fa: "\\f012";\n}\n\n.fa-gear {\n --fa: "\\f013";\n}\n\n.fa-cog {\n --fa: "\\f013";\n}\n\n.fa-house {\n --fa: "\\f015";\n}\n\n.fa-home {\n --fa: "\\f015";\n}\n\n.fa-home-alt {\n --fa: "\\f015";\n}\n\n.fa-home-lg-alt {\n --fa: "\\f015";\n}\n\n.fa-clock {\n --fa: "\\f017";\n}\n\n.fa-clock-four {\n --fa: "\\f017";\n}\n\n.fa-road {\n --fa: "\\f018";\n}\n\n.fa-download {\n --fa: "\\f019";\n}\n\n.fa-inbox {\n --fa: "\\f01c";\n}\n\n.fa-arrow-rotate-right {\n --fa: "\\f01e";\n}\n\n.fa-arrow-right-rotate {\n --fa: "\\f01e";\n}\n\n.fa-arrow-rotate-forward {\n --fa: "\\f01e";\n}\n\n.fa-redo {\n --fa: "\\f01e";\n}\n\n.fa-arrows-rotate {\n --fa: "\\f021";\n}\n\n.fa-refresh {\n --fa: "\\f021";\n}\n\n.fa-sync {\n --fa: "\\f021";\n}\n\n.fa-rectangle-list {\n --fa: "\\f022";\n}\n\n.fa-list-alt {\n --fa: "\\f022";\n}\n\n.fa-lock {\n --fa: "\\f023";\n}\n\n.fa-flag {\n --fa: "\\f024";\n}\n\n.fa-headphones {\n --fa: "\\f025";\n}\n\n.fa-headphones-alt {\n --fa: "\\f025";\n}\n\n.fa-headphones-simple {\n --fa: "\\f025";\n}\n\n.fa-volume-off {\n --fa: "\\f026";\n}\n\n.fa-volume-low {\n --fa: "\\f027";\n}\n\n.fa-volume-down {\n --fa: "\\f027";\n}\n\n.fa-volume-high {\n --fa: "\\f028";\n}\n\n.fa-volume-up {\n --fa: "\\f028";\n}\n\n.fa-qrcode {\n --fa: "\\f029";\n}\n\n.fa-barcode {\n --fa: "\\f02a";\n}\n\n.fa-tag {\n --fa: "\\f02b";\n}\n\n.fa-tags {\n --fa: "\\f02c";\n}\n\n.fa-book {\n --fa: "\\f02d";\n}\n\n.fa-bookmark {\n --fa: "\\f02e";\n}\n\n.fa-print {\n --fa: "\\f02f";\n}\n\n.fa-camera {\n --fa: "\\f030";\n}\n\n.fa-camera-alt {\n --fa: "\\f030";\n}\n\n.fa-font {\n --fa: "\\f031";\n}\n\n.fa-bold {\n --fa: "\\f032";\n}\n\n.fa-italic {\n --fa: "\\f033";\n}\n\n.fa-text-height {\n --fa: "\\f034";\n}\n\n.fa-text-width {\n --fa: "\\f035";\n}\n\n.fa-align-left {\n --fa: "\\f036";\n}\n\n.fa-align-center {\n --fa: "\\f037";\n}\n\n.fa-align-right {\n --fa: "\\f038";\n}\n\n.fa-align-justify {\n --fa: "\\f039";\n}\n\n.fa-list {\n --fa: "\\f03a";\n}\n\n.fa-list-squares {\n --fa: "\\f03a";\n}\n\n.fa-outdent {\n --fa: "\\f03b";\n}\n\n.fa-dedent {\n --fa: "\\f03b";\n}\n\n.fa-indent {\n --fa: "\\f03c";\n}\n\n.fa-video {\n --fa: "\\f03d";\n}\n\n.fa-video-camera {\n --fa: "\\f03d";\n}\n\n.fa-image {\n --fa: "\\f03e";\n}\n\n.fa-location-pin {\n --fa: "\\f041";\n}\n\n.fa-map-marker {\n --fa: "\\f041";\n}\n\n.fa-circle-half-stroke {\n --fa: "\\f042";\n}\n\n.fa-adjust {\n --fa: "\\f042";\n}\n\n.fa-droplet {\n --fa: "\\f043";\n}\n\n.fa-tint {\n --fa: "\\f043";\n}\n\n.fa-pen-to-square {\n --fa: "\\f044";\n}\n\n.fa-edit {\n --fa: "\\f044";\n}\n\n.fa-arrows-up-down-left-right {\n --fa: "\\f047";\n}\n\n.fa-arrows {\n --fa: "\\f047";\n}\n\n.fa-backward-step {\n --fa: "\\f048";\n}\n\n.fa-step-backward {\n --fa: "\\f048";\n}\n\n.fa-backward-fast {\n --fa: "\\f049";\n}\n\n.fa-fast-backward {\n --fa: "\\f049";\n}\n\n.fa-backward {\n --fa: "\\f04a";\n}\n\n.fa-play {\n --fa: "\\f04b";\n}\n\n.fa-pause {\n --fa: "\\f04c";\n}\n\n.fa-stop {\n --fa: "\\f04d";\n}\n\n.fa-forward {\n --fa: "\\f04e";\n}\n\n.fa-forward-fast {\n --fa: "\\f050";\n}\n\n.fa-fast-forward {\n --fa: "\\f050";\n}\n\n.fa-forward-step {\n --fa: "\\f051";\n}\n\n.fa-step-forward {\n --fa: "\\f051";\n}\n\n.fa-eject {\n --fa: "\\f052";\n}\n\n.fa-chevron-left {\n --fa: "\\f053";\n}\n\n.fa-chevron-right {\n --fa: "\\f054";\n}\n\n.fa-circle-plus {\n --fa: "\\f055";\n}\n\n.fa-plus-circle {\n --fa: "\\f055";\n}\n\n.fa-circle-minus {\n --fa: "\\f056";\n}\n\n.fa-minus-circle {\n --fa: "\\f056";\n}\n\n.fa-circle-xmark {\n --fa: "\\f057";\n}\n\n.fa-times-circle {\n --fa: "\\f057";\n}\n\n.fa-xmark-circle {\n --fa: "\\f057";\n}\n\n.fa-circle-check {\n --fa: "\\f058";\n}\n\n.fa-check-circle {\n --fa: "\\f058";\n}\n\n.fa-circle-question {\n --fa: "\\f059";\n}\n\n.fa-question-circle {\n --fa: "\\f059";\n}\n\n.fa-circle-info {\n --fa: "\\f05a";\n}\n\n.fa-info-circle {\n --fa: "\\f05a";\n}\n\n.fa-crosshairs {\n --fa: "\\f05b";\n}\n\n.fa-ban {\n --fa: "\\f05e";\n}\n\n.fa-cancel {\n --fa: "\\f05e";\n}\n\n.fa-arrow-left {\n --fa: "\\f060";\n}\n\n.fa-arrow-right {\n --fa: "\\f061";\n}\n\n.fa-arrow-up {\n --fa: "\\f062";\n}\n\n.fa-arrow-down {\n --fa: "\\f063";\n}\n\n.fa-share {\n --fa: "\\f064";\n}\n\n.fa-mail-forward {\n --fa: "\\f064";\n}\n\n.fa-expand {\n --fa: "\\f065";\n}\n\n.fa-compress {\n --fa: "\\f066";\n}\n\n.fa-minus {\n --fa: "\\f068";\n}\n\n.fa-subtract {\n --fa: "\\f068";\n}\n\n.fa-circle-exclamation {\n --fa: "\\f06a";\n}\n\n.fa-exclamation-circle {\n --fa: "\\f06a";\n}\n\n.fa-gift {\n --fa: "\\f06b";\n}\n\n.fa-leaf {\n --fa: "\\f06c";\n}\n\n.fa-fire {\n --fa: "\\f06d";\n}\n\n.fa-eye {\n --fa: "\\f06e";\n}\n\n.fa-eye-slash {\n --fa: "\\f070";\n}\n\n.fa-triangle-exclamation {\n --fa: "\\f071";\n}\n\n.fa-exclamation-triangle {\n --fa: "\\f071";\n}\n\n.fa-warning {\n --fa: "\\f071";\n}\n\n.fa-plane {\n --fa: "\\f072";\n}\n\n.fa-calendar-days {\n --fa: "\\f073";\n}\n\n.fa-calendar-alt {\n --fa: "\\f073";\n}\n\n.fa-shuffle {\n --fa: "\\f074";\n}\n\n.fa-random {\n --fa: "\\f074";\n}\n\n.fa-comment {\n --fa: "\\f075";\n}\n\n.fa-magnet {\n --fa: "\\f076";\n}\n\n.fa-chevron-up {\n --fa: "\\f077";\n}\n\n.fa-chevron-down {\n --fa: "\\f078";\n}\n\n.fa-retweet {\n --fa: "\\f079";\n}\n\n.fa-cart-shopping {\n --fa: "\\f07a";\n}\n\n.fa-shopping-cart {\n --fa: "\\f07a";\n}\n\n.fa-folder {\n --fa: "\\f07b";\n}\n\n.fa-folder-blank {\n --fa: "\\f07b";\n}\n\n.fa-folder-open {\n --fa: "\\f07c";\n}\n\n.fa-arrows-up-down {\n --fa: "\\f07d";\n}\n\n.fa-arrows-v {\n --fa: "\\f07d";\n}\n\n.fa-arrows-left-right {\n --fa: "\\f07e";\n}\n\n.fa-arrows-h {\n --fa: "\\f07e";\n}\n\n.fa-chart-bar {\n --fa: "\\f080";\n}\n\n.fa-bar-chart {\n --fa: "\\f080";\n}\n\n.fa-camera-retro {\n --fa: "\\f083";\n}\n\n.fa-key {\n --fa: "\\f084";\n}\n\n.fa-gears {\n --fa: "\\f085";\n}\n\n.fa-cogs {\n --fa: "\\f085";\n}\n\n.fa-comments {\n --fa: "\\f086";\n}\n\n.fa-star-half {\n --fa: "\\f089";\n}\n\n.fa-arrow-right-from-bracket {\n --fa: "\\f08b";\n}\n\n.fa-sign-out {\n --fa: "\\f08b";\n}\n\n.fa-thumbtack {\n --fa: "\\f08d";\n}\n\n.fa-thumb-tack {\n --fa: "\\f08d";\n}\n\n.fa-arrow-up-right-from-square {\n --fa: "\\f08e";\n}\n\n.fa-external-link {\n --fa: "\\f08e";\n}\n\n.fa-arrow-right-to-bracket {\n --fa: "\\f090";\n}\n\n.fa-sign-in {\n --fa: "\\f090";\n}\n\n.fa-trophy {\n --fa: "\\f091";\n}\n\n.fa-upload {\n --fa: "\\f093";\n}\n\n.fa-lemon {\n --fa: "\\f094";\n}\n\n.fa-phone {\n --fa: "\\f095";\n}\n\n.fa-square-phone {\n --fa: "\\f098";\n}\n\n.fa-phone-square {\n --fa: "\\f098";\n}\n\n.fa-unlock {\n --fa: "\\f09c";\n}\n\n.fa-credit-card {\n --fa: "\\f09d";\n}\n\n.fa-credit-card-alt {\n --fa: "\\f09d";\n}\n\n.fa-rss {\n --fa: "\\f09e";\n}\n\n.fa-feed {\n --fa: "\\f09e";\n}\n\n.fa-hard-drive {\n --fa: "\\f0a0";\n}\n\n.fa-hdd {\n --fa: "\\f0a0";\n}\n\n.fa-bullhorn {\n --fa: "\\f0a1";\n}\n\n.fa-certificate {\n --fa: "\\f0a3";\n}\n\n.fa-hand-point-right {\n --fa: "\\f0a4";\n}\n\n.fa-hand-point-left {\n --fa: "\\f0a5";\n}\n\n.fa-hand-point-up {\n --fa: "\\f0a6";\n}\n\n.fa-hand-point-down {\n --fa: "\\f0a7";\n}\n\n.fa-circle-arrow-left {\n --fa: "\\f0a8";\n}\n\n.fa-arrow-circle-left {\n --fa: "\\f0a8";\n}\n\n.fa-circle-arrow-right {\n --fa: "\\f0a9";\n}\n\n.fa-arrow-circle-right {\n --fa: "\\f0a9";\n}\n\n.fa-circle-arrow-up {\n --fa: "\\f0aa";\n}\n\n.fa-arrow-circle-up {\n --fa: "\\f0aa";\n}\n\n.fa-circle-arrow-down {\n --fa: "\\f0ab";\n}\n\n.fa-arrow-circle-down {\n --fa: "\\f0ab";\n}\n\n.fa-globe {\n --fa: "\\f0ac";\n}\n\n.fa-wrench {\n --fa: "\\f0ad";\n}\n\n.fa-list-check {\n --fa: "\\f0ae";\n}\n\n.fa-tasks {\n --fa: "\\f0ae";\n}\n\n.fa-filter {\n --fa: "\\f0b0";\n}\n\n.fa-briefcase {\n --fa: "\\f0b1";\n}\n\n.fa-up-down-left-right {\n --fa: "\\f0b2";\n}\n\n.fa-arrows-alt {\n --fa: "\\f0b2";\n}\n\n.fa-users {\n --fa: "\\f0c0";\n}\n\n.fa-link {\n --fa: "\\f0c1";\n}\n\n.fa-chain {\n --fa: "\\f0c1";\n}\n\n.fa-cloud {\n --fa: "\\f0c2";\n}\n\n.fa-flask {\n --fa: "\\f0c3";\n}\n\n.fa-scissors {\n --fa: "\\f0c4";\n}\n\n.fa-cut {\n --fa: "\\f0c4";\n}\n\n.fa-copy {\n --fa: "\\f0c5";\n}\n\n.fa-paperclip {\n --fa: "\\f0c6";\n}\n\n.fa-floppy-disk {\n --fa: "\\f0c7";\n}\n\n.fa-save {\n --fa: "\\f0c7";\n}\n\n.fa-square {\n --fa: "\\f0c8";\n}\n\n.fa-bars {\n --fa: "\\f0c9";\n}\n\n.fa-navicon {\n --fa: "\\f0c9";\n}\n\n.fa-list-ul {\n --fa: "\\f0ca";\n}\n\n.fa-list-dots {\n --fa: "\\f0ca";\n}\n\n.fa-list-ol {\n --fa: "\\f0cb";\n}\n\n.fa-list-1-2 {\n --fa: "\\f0cb";\n}\n\n.fa-list-numeric {\n --fa: "\\f0cb";\n}\n\n.fa-strikethrough {\n --fa: "\\f0cc";\n}\n\n.fa-underline {\n --fa: "\\f0cd";\n}\n\n.fa-table {\n --fa: "\\f0ce";\n}\n\n.fa-wand-magic {\n --fa: "\\f0d0";\n}\n\n.fa-magic {\n --fa: "\\f0d0";\n}\n\n.fa-truck {\n --fa: "\\f0d1";\n}\n\n.fa-money-bill {\n --fa: "\\f0d6";\n}\n\n.fa-caret-down {\n --fa: "\\f0d7";\n}\n\n.fa-caret-up {\n --fa: "\\f0d8";\n}\n\n.fa-caret-left {\n --fa: "\\f0d9";\n}\n\n.fa-caret-right {\n --fa: "\\f0da";\n}\n\n.fa-table-columns {\n --fa: "\\f0db";\n}\n\n.fa-columns {\n --fa: "\\f0db";\n}\n\n.fa-sort {\n --fa: "\\f0dc";\n}\n\n.fa-unsorted {\n --fa: "\\f0dc";\n}\n\n.fa-sort-down {\n --fa: "\\f0dd";\n}\n\n.fa-sort-desc {\n --fa: "\\f0dd";\n}\n\n.fa-sort-up {\n --fa: "\\f0de";\n}\n\n.fa-sort-asc {\n --fa: "\\f0de";\n}\n\n.fa-envelope {\n --fa: "\\f0e0";\n}\n\n.fa-arrow-rotate-left {\n --fa: "\\f0e2";\n}\n\n.fa-arrow-left-rotate {\n --fa: "\\f0e2";\n}\n\n.fa-arrow-rotate-back {\n --fa: "\\f0e2";\n}\n\n.fa-arrow-rotate-backward {\n --fa: "\\f0e2";\n}\n\n.fa-undo {\n --fa: "\\f0e2";\n}\n\n.fa-gavel {\n --fa: "\\f0e3";\n}\n\n.fa-legal {\n --fa: "\\f0e3";\n}\n\n.fa-bolt {\n --fa: "\\f0e7";\n}\n\n.fa-zap {\n --fa: "\\f0e7";\n}\n\n.fa-sitemap {\n --fa: "\\f0e8";\n}\n\n.fa-umbrella {\n --fa: "\\f0e9";\n}\n\n.fa-paste {\n --fa: "\\f0ea";\n}\n\n.fa-file-clipboard {\n --fa: "\\f0ea";\n}\n\n.fa-lightbulb {\n --fa: "\\f0eb";\n}\n\n.fa-arrow-right-arrow-left {\n --fa: "\\f0ec";\n}\n\n.fa-exchange {\n --fa: "\\f0ec";\n}\n\n.fa-cloud-arrow-down {\n --fa: "\\f0ed";\n}\n\n.fa-cloud-download {\n --fa: "\\f0ed";\n}\n\n.fa-cloud-download-alt {\n --fa: "\\f0ed";\n}\n\n.fa-cloud-arrow-up {\n --fa: "\\f0ee";\n}\n\n.fa-cloud-upload {\n --fa: "\\f0ee";\n}\n\n.fa-cloud-upload-alt {\n --fa: "\\f0ee";\n}\n\n.fa-user-doctor {\n --fa: "\\f0f0";\n}\n\n.fa-user-md {\n --fa: "\\f0f0";\n}\n\n.fa-stethoscope {\n --fa: "\\f0f1";\n}\n\n.fa-suitcase {\n --fa: "\\f0f2";\n}\n\n.fa-bell {\n --fa: "\\f0f3";\n}\n\n.fa-mug-saucer {\n --fa: "\\f0f4";\n}\n\n.fa-coffee {\n --fa: "\\f0f4";\n}\n\n.fa-hospital {\n --fa: "\\f0f8";\n}\n\n.fa-hospital-alt {\n --fa: "\\f0f8";\n}\n\n.fa-hospital-wide {\n --fa: "\\f0f8";\n}\n\n.fa-truck-medical {\n --fa: "\\f0f9";\n}\n\n.fa-ambulance {\n --fa: "\\f0f9";\n}\n\n.fa-suitcase-medical {\n --fa: "\\f0fa";\n}\n\n.fa-medkit {\n --fa: "\\f0fa";\n}\n\n.fa-jet-fighter {\n --fa: "\\f0fb";\n}\n\n.fa-fighter-jet {\n --fa: "\\f0fb";\n}\n\n.fa-beer-mug-empty {\n --fa: "\\f0fc";\n}\n\n.fa-beer {\n --fa: "\\f0fc";\n}\n\n.fa-square-h {\n --fa: "\\f0fd";\n}\n\n.fa-h-square {\n --fa: "\\f0fd";\n}\n\n.fa-square-plus {\n --fa: "\\f0fe";\n}\n\n.fa-plus-square {\n --fa: "\\f0fe";\n}\n\n.fa-angles-left {\n --fa: "\\f100";\n}\n\n.fa-angle-double-left {\n --fa: "\\f100";\n}\n\n.fa-angles-right {\n --fa: "\\f101";\n}\n\n.fa-angle-double-right {\n --fa: "\\f101";\n}\n\n.fa-angles-up {\n --fa: "\\f102";\n}\n\n.fa-angle-double-up {\n --fa: "\\f102";\n}\n\n.fa-angles-down {\n --fa: "\\f103";\n}\n\n.fa-angle-double-down {\n --fa: "\\f103";\n}\n\n.fa-angle-left {\n --fa: "\\f104";\n}\n\n.fa-angle-right {\n --fa: "\\f105";\n}\n\n.fa-angle-up {\n --fa: "\\f106";\n}\n\n.fa-angle-down {\n --fa: "\\f107";\n}\n\n.fa-laptop {\n --fa: "\\f109";\n}\n\n.fa-tablet-button {\n --fa: "\\f10a";\n}\n\n.fa-mobile-button {\n --fa: "\\f10b";\n}\n\n.fa-quote-left {\n --fa: "\\f10d";\n}\n\n.fa-quote-left-alt {\n --fa: "\\f10d";\n}\n\n.fa-quote-right {\n --fa: "\\f10e";\n}\n\n.fa-quote-right-alt {\n --fa: "\\f10e";\n}\n\n.fa-spinner {\n --fa: "\\f110";\n}\n\n.fa-circle {\n --fa: "\\f111";\n}\n\n.fa-face-smile {\n --fa: "\\f118";\n}\n\n.fa-smile {\n --fa: "\\f118";\n}\n\n.fa-face-frown {\n --fa: "\\f119";\n}\n\n.fa-frown {\n --fa: "\\f119";\n}\n\n.fa-face-meh {\n --fa: "\\f11a";\n}\n\n.fa-meh {\n --fa: "\\f11a";\n}\n\n.fa-gamepad {\n --fa: "\\f11b";\n}\n\n.fa-keyboard {\n --fa: "\\f11c";\n}\n\n.fa-flag-checkered {\n --fa: "\\f11e";\n}\n\n.fa-terminal {\n --fa: "\\f120";\n}\n\n.fa-code {\n --fa: "\\f121";\n}\n\n.fa-reply-all {\n --fa: "\\f122";\n}\n\n.fa-mail-reply-all {\n --fa: "\\f122";\n}\n\n.fa-location-arrow {\n --fa: "\\f124";\n}\n\n.fa-crop {\n --fa: "\\f125";\n}\n\n.fa-code-branch {\n --fa: "\\f126";\n}\n\n.fa-link-slash {\n --fa: "\\f127";\n}\n\n.fa-chain-broken {\n --fa: "\\f127";\n}\n\n.fa-chain-slash {\n --fa: "\\f127";\n}\n\n.fa-unlink {\n --fa: "\\f127";\n}\n\n.fa-info {\n --fa: "\\f129";\n}\n\n.fa-superscript {\n --fa: "\\f12b";\n}\n\n.fa-subscript {\n --fa: "\\f12c";\n}\n\n.fa-eraser {\n --fa: "\\f12d";\n}\n\n.fa-puzzle-piece {\n --fa: "\\f12e";\n}\n\n.fa-microphone {\n --fa: "\\f130";\n}\n\n.fa-microphone-slash {\n --fa: "\\f131";\n}\n\n.fa-shield {\n --fa: "\\f132";\n}\n\n.fa-shield-blank {\n --fa: "\\f132";\n}\n\n.fa-calendar {\n --fa: "\\f133";\n}\n\n.fa-fire-extinguisher {\n --fa: "\\f134";\n}\n\n.fa-rocket {\n --fa: "\\f135";\n}\n\n.fa-circle-chevron-left {\n --fa: "\\f137";\n}\n\n.fa-chevron-circle-left {\n --fa: "\\f137";\n}\n\n.fa-circle-chevron-right {\n --fa: "\\f138";\n}\n\n.fa-chevron-circle-right {\n --fa: "\\f138";\n}\n\n.fa-circle-chevron-up {\n --fa: "\\f139";\n}\n\n.fa-chevron-circle-up {\n --fa: "\\f139";\n}\n\n.fa-circle-chevron-down {\n --fa: "\\f13a";\n}\n\n.fa-chevron-circle-down {\n --fa: "\\f13a";\n}\n\n.fa-anchor {\n --fa: "\\f13d";\n}\n\n.fa-unlock-keyhole {\n --fa: "\\f13e";\n}\n\n.fa-unlock-alt {\n --fa: "\\f13e";\n}\n\n.fa-bullseye {\n --fa: "\\f140";\n}\n\n.fa-ellipsis {\n --fa: "\\f141";\n}\n\n.fa-ellipsis-h {\n --fa: "\\f141";\n}\n\n.fa-ellipsis-vertical {\n --fa: "\\f142";\n}\n\n.fa-ellipsis-v {\n --fa: "\\f142";\n}\n\n.fa-square-rss {\n --fa: "\\f143";\n}\n\n.fa-rss-square {\n --fa: "\\f143";\n}\n\n.fa-circle-play {\n --fa: "\\f144";\n}\n\n.fa-play-circle {\n --fa: "\\f144";\n}\n\n.fa-ticket {\n --fa: "\\f145";\n}\n\n.fa-square-minus {\n --fa: "\\f146";\n}\n\n.fa-minus-square {\n --fa: "\\f146";\n}\n\n.fa-arrow-turn-up {\n --fa: "\\f148";\n}\n\n.fa-level-up {\n --fa: "\\f148";\n}\n\n.fa-arrow-turn-down {\n --fa: "\\f149";\n}\n\n.fa-level-down {\n --fa: "\\f149";\n}\n\n.fa-square-check {\n --fa: "\\f14a";\n}\n\n.fa-check-square {\n --fa: "\\f14a";\n}\n\n.fa-square-pen {\n --fa: "\\f14b";\n}\n\n.fa-pen-square {\n --fa: "\\f14b";\n}\n\n.fa-pencil-square {\n --fa: "\\f14b";\n}\n\n.fa-square-arrow-up-right {\n --fa: "\\f14c";\n}\n\n.fa-external-link-square {\n --fa: "\\f14c";\n}\n\n.fa-share-from-square {\n --fa: "\\f14d";\n}\n\n.fa-share-square {\n --fa: "\\f14d";\n}\n\n.fa-compass {\n --fa: "\\f14e";\n}\n\n.fa-square-caret-down {\n --fa: "\\f150";\n}\n\n.fa-caret-square-down {\n --fa: "\\f150";\n}\n\n.fa-square-caret-up {\n --fa: "\\f151";\n}\n\n.fa-caret-square-up {\n --fa: "\\f151";\n}\n\n.fa-square-caret-right {\n --fa: "\\f152";\n}\n\n.fa-caret-square-right {\n --fa: "\\f152";\n}\n\n.fa-euro-sign {\n --fa: "\\f153";\n}\n\n.fa-eur {\n --fa: "\\f153";\n}\n\n.fa-euro {\n --fa: "\\f153";\n}\n\n.fa-sterling-sign {\n --fa: "\\f154";\n}\n\n.fa-gbp {\n --fa: "\\f154";\n}\n\n.fa-pound-sign {\n --fa: "\\f154";\n}\n\n.fa-rupee-sign {\n --fa: "\\f156";\n}\n\n.fa-rupee {\n --fa: "\\f156";\n}\n\n.fa-yen-sign {\n --fa: "\\f157";\n}\n\n.fa-cny {\n --fa: "\\f157";\n}\n\n.fa-jpy {\n --fa: "\\f157";\n}\n\n.fa-rmb {\n --fa: "\\f157";\n}\n\n.fa-yen {\n --fa: "\\f157";\n}\n\n.fa-ruble-sign {\n --fa: "\\f158";\n}\n\n.fa-rouble {\n --fa: "\\f158";\n}\n\n.fa-rub {\n --fa: "\\f158";\n}\n\n.fa-ruble {\n --fa: "\\f158";\n}\n\n.fa-won-sign {\n --fa: "\\f159";\n}\n\n.fa-krw {\n --fa: "\\f159";\n}\n\n.fa-won {\n --fa: "\\f159";\n}\n\n.fa-file {\n --fa: "\\f15b";\n}\n\n.fa-file-lines {\n --fa: "\\f15c";\n}\n\n.fa-file-alt {\n --fa: "\\f15c";\n}\n\n.fa-file-text {\n --fa: "\\f15c";\n}\n\n.fa-arrow-down-a-z {\n --fa: "\\f15d";\n}\n\n.fa-sort-alpha-asc {\n --fa: "\\f15d";\n}\n\n.fa-sort-alpha-down {\n --fa: "\\f15d";\n}\n\n.fa-arrow-up-a-z {\n --fa: "\\f15e";\n}\n\n.fa-sort-alpha-up {\n --fa: "\\f15e";\n}\n\n.fa-arrow-down-wide-short {\n --fa: "\\f160";\n}\n\n.fa-sort-amount-asc {\n --fa: "\\f160";\n}\n\n.fa-sort-amount-down {\n --fa: "\\f160";\n}\n\n.fa-arrow-up-wide-short {\n --fa: "\\f161";\n}\n\n.fa-sort-amount-up {\n --fa: "\\f161";\n}\n\n.fa-arrow-down-1-9 {\n --fa: "\\f162";\n}\n\n.fa-sort-numeric-asc {\n --fa: "\\f162";\n}\n\n.fa-sort-numeric-down {\n --fa: "\\f162";\n}\n\n.fa-arrow-up-1-9 {\n --fa: "\\f163";\n}\n\n.fa-sort-numeric-up {\n --fa: "\\f163";\n}\n\n.fa-thumbs-up {\n --fa: "\\f164";\n}\n\n.fa-thumbs-down {\n --fa: "\\f165";\n}\n\n.fa-arrow-down-long {\n --fa: "\\f175";\n}\n\n.fa-long-arrow-down {\n --fa: "\\f175";\n}\n\n.fa-arrow-up-long {\n --fa: "\\f176";\n}\n\n.fa-long-arrow-up {\n --fa: "\\f176";\n}\n\n.fa-arrow-left-long {\n --fa: "\\f177";\n}\n\n.fa-long-arrow-left {\n --fa: "\\f177";\n}\n\n.fa-arrow-right-long {\n --fa: "\\f178";\n}\n\n.fa-long-arrow-right {\n --fa: "\\f178";\n}\n\n.fa-person-dress {\n --fa: "\\f182";\n}\n\n.fa-female {\n --fa: "\\f182";\n}\n\n.fa-person {\n --fa: "\\f183";\n}\n\n.fa-male {\n --fa: "\\f183";\n}\n\n.fa-sun {\n --fa: "\\f185";\n}\n\n.fa-moon {\n --fa: "\\f186";\n}\n\n.fa-box-archive {\n --fa: "\\f187";\n}\n\n.fa-archive {\n --fa: "\\f187";\n}\n\n.fa-bug {\n --fa: "\\f188";\n}\n\n.fa-square-caret-left {\n --fa: "\\f191";\n}\n\n.fa-caret-square-left {\n --fa: "\\f191";\n}\n\n.fa-circle-dot {\n --fa: "\\f192";\n}\n\n.fa-dot-circle {\n --fa: "\\f192";\n}\n\n.fa-wheelchair {\n --fa: "\\f193";\n}\n\n.fa-lira-sign {\n --fa: "\\f195";\n}\n\n.fa-shuttle-space {\n --fa: "\\f197";\n}\n\n.fa-space-shuttle {\n --fa: "\\f197";\n}\n\n.fa-square-envelope {\n --fa: "\\f199";\n}\n\n.fa-envelope-square {\n --fa: "\\f199";\n}\n\n.fa-building-columns {\n --fa: "\\f19c";\n}\n\n.fa-bank {\n --fa: "\\f19c";\n}\n\n.fa-institution {\n --fa: "\\f19c";\n}\n\n.fa-museum {\n --fa: "\\f19c";\n}\n\n.fa-university {\n --fa: "\\f19c";\n}\n\n.fa-graduation-cap {\n --fa: "\\f19d";\n}\n\n.fa-mortar-board {\n --fa: "\\f19d";\n}\n\n.fa-language {\n --fa: "\\f1ab";\n}\n\n.fa-fax {\n --fa: "\\f1ac";\n}\n\n.fa-building {\n --fa: "\\f1ad";\n}\n\n.fa-child {\n --fa: "\\f1ae";\n}\n\n.fa-paw {\n --fa: "\\f1b0";\n}\n\n.fa-cube {\n --fa: "\\f1b2";\n}\n\n.fa-cubes {\n --fa: "\\f1b3";\n}\n\n.fa-recycle {\n --fa: "\\f1b8";\n}\n\n.fa-car {\n --fa: "\\f1b9";\n}\n\n.fa-automobile {\n --fa: "\\f1b9";\n}\n\n.fa-taxi {\n --fa: "\\f1ba";\n}\n\n.fa-cab {\n --fa: "\\f1ba";\n}\n\n.fa-tree {\n --fa: "\\f1bb";\n}\n\n.fa-database {\n --fa: "\\f1c0";\n}\n\n.fa-file-pdf {\n --fa: "\\f1c1";\n}\n\n.fa-file-word {\n --fa: "\\f1c2";\n}\n\n.fa-file-excel {\n --fa: "\\f1c3";\n}\n\n.fa-file-powerpoint {\n --fa: "\\f1c4";\n}\n\n.fa-file-image {\n --fa: "\\f1c5";\n}\n\n.fa-file-zipper {\n --fa: "\\f1c6";\n}\n\n.fa-file-archive {\n --fa: "\\f1c6";\n}\n\n.fa-file-audio {\n --fa: "\\f1c7";\n}\n\n.fa-file-video {\n --fa: "\\f1c8";\n}\n\n.fa-file-code {\n --fa: "\\f1c9";\n}\n\n.fa-life-ring {\n --fa: "\\f1cd";\n}\n\n.fa-circle-notch {\n --fa: "\\f1ce";\n}\n\n.fa-paper-plane {\n --fa: "\\f1d8";\n}\n\n.fa-clock-rotate-left {\n --fa: "\\f1da";\n}\n\n.fa-history {\n --fa: "\\f1da";\n}\n\n.fa-heading {\n --fa: "\\f1dc";\n}\n\n.fa-header {\n --fa: "\\f1dc";\n}\n\n.fa-paragraph {\n --fa: "\\f1dd";\n}\n\n.fa-sliders {\n --fa: "\\f1de";\n}\n\n.fa-sliders-h {\n --fa: "\\f1de";\n}\n\n.fa-share-nodes {\n --fa: "\\f1e0";\n}\n\n.fa-share-alt {\n --fa: "\\f1e0";\n}\n\n.fa-square-share-nodes {\n --fa: "\\f1e1";\n}\n\n.fa-share-alt-square {\n --fa: "\\f1e1";\n}\n\n.fa-bomb {\n --fa: "\\f1e2";\n}\n\n.fa-futbol {\n --fa: "\\f1e3";\n}\n\n.fa-futbol-ball {\n --fa: "\\f1e3";\n}\n\n.fa-soccer-ball {\n --fa: "\\f1e3";\n}\n\n.fa-tty {\n --fa: "\\f1e4";\n}\n\n.fa-teletype {\n --fa: "\\f1e4";\n}\n\n.fa-binoculars {\n --fa: "\\f1e5";\n}\n\n.fa-plug {\n --fa: "\\f1e6";\n}\n\n.fa-newspaper {\n --fa: "\\f1ea";\n}\n\n.fa-wifi {\n --fa: "\\f1eb";\n}\n\n.fa-wifi-3 {\n --fa: "\\f1eb";\n}\n\n.fa-wifi-strong {\n --fa: "\\f1eb";\n}\n\n.fa-calculator {\n --fa: "\\f1ec";\n}\n\n.fa-bell-slash {\n --fa: "\\f1f6";\n}\n\n.fa-trash {\n --fa: "\\f1f8";\n}\n\n.fa-copyright {\n --fa: "\\f1f9";\n}\n\n.fa-eye-dropper {\n --fa: "\\f1fb";\n}\n\n.fa-eye-dropper-empty {\n --fa: "\\f1fb";\n}\n\n.fa-eyedropper {\n --fa: "\\f1fb";\n}\n\n.fa-paintbrush {\n --fa: "\\f1fc";\n}\n\n.fa-paint-brush {\n --fa: "\\f1fc";\n}\n\n.fa-cake-candles {\n --fa: "\\f1fd";\n}\n\n.fa-birthday-cake {\n --fa: "\\f1fd";\n}\n\n.fa-cake {\n --fa: "\\f1fd";\n}\n\n.fa-chart-area {\n --fa: "\\f1fe";\n}\n\n.fa-area-chart {\n --fa: "\\f1fe";\n}\n\n.fa-chart-pie {\n --fa: "\\f200";\n}\n\n.fa-pie-chart {\n --fa: "\\f200";\n}\n\n.fa-chart-line {\n --fa: "\\f201";\n}\n\n.fa-line-chart {\n --fa: "\\f201";\n}\n\n.fa-toggle-off {\n --fa: "\\f204";\n}\n\n.fa-toggle-on {\n --fa: "\\f205";\n}\n\n.fa-bicycle {\n --fa: "\\f206";\n}\n\n.fa-bus {\n --fa: "\\f207";\n}\n\n.fa-closed-captioning {\n --fa: "\\f20a";\n}\n\n.fa-shekel-sign {\n --fa: "\\f20b";\n}\n\n.fa-ils {\n --fa: "\\f20b";\n}\n\n.fa-shekel {\n --fa: "\\f20b";\n}\n\n.fa-sheqel {\n --fa: "\\f20b";\n}\n\n.fa-sheqel-sign {\n --fa: "\\f20b";\n}\n\n.fa-cart-plus {\n --fa: "\\f217";\n}\n\n.fa-cart-arrow-down {\n --fa: "\\f218";\n}\n\n.fa-diamond {\n --fa: "\\f219";\n}\n\n.fa-ship {\n --fa: "\\f21a";\n}\n\n.fa-user-secret {\n --fa: "\\f21b";\n}\n\n.fa-motorcycle {\n --fa: "\\f21c";\n}\n\n.fa-street-view {\n --fa: "\\f21d";\n}\n\n.fa-heart-pulse {\n --fa: "\\f21e";\n}\n\n.fa-heartbeat {\n --fa: "\\f21e";\n}\n\n.fa-venus {\n --fa: "\\f221";\n}\n\n.fa-mars {\n --fa: "\\f222";\n}\n\n.fa-mercury {\n --fa: "\\f223";\n}\n\n.fa-mars-and-venus {\n --fa: "\\f224";\n}\n\n.fa-transgender {\n --fa: "\\f225";\n}\n\n.fa-transgender-alt {\n --fa: "\\f225";\n}\n\n.fa-venus-double {\n --fa: "\\f226";\n}\n\n.fa-mars-double {\n --fa: "\\f227";\n}\n\n.fa-venus-mars {\n --fa: "\\f228";\n}\n\n.fa-mars-stroke {\n --fa: "\\f229";\n}\n\n.fa-mars-stroke-up {\n --fa: "\\f22a";\n}\n\n.fa-mars-stroke-v {\n --fa: "\\f22a";\n}\n\n.fa-mars-stroke-right {\n --fa: "\\f22b";\n}\n\n.fa-mars-stroke-h {\n --fa: "\\f22b";\n}\n\n.fa-neuter {\n --fa: "\\f22c";\n}\n\n.fa-genderless {\n --fa: "\\f22d";\n}\n\n.fa-server {\n --fa: "\\f233";\n}\n\n.fa-user-plus {\n --fa: "\\f234";\n}\n\n.fa-user-xmark {\n --fa: "\\f235";\n}\n\n.fa-user-times {\n --fa: "\\f235";\n}\n\n.fa-bed {\n --fa: "\\f236";\n}\n\n.fa-train {\n --fa: "\\f238";\n}\n\n.fa-train-subway {\n --fa: "\\f239";\n}\n\n.fa-subway {\n --fa: "\\f239";\n}\n\n.fa-battery-full {\n --fa: "\\f240";\n}\n\n.fa-battery {\n --fa: "\\f240";\n}\n\n.fa-battery-5 {\n --fa: "\\f240";\n}\n\n.fa-battery-three-quarters {\n --fa: "\\f241";\n}\n\n.fa-battery-4 {\n --fa: "\\f241";\n}\n\n.fa-battery-half {\n --fa: "\\f242";\n}\n\n.fa-battery-3 {\n --fa: "\\f242";\n}\n\n.fa-battery-quarter {\n --fa: "\\f243";\n}\n\n.fa-battery-2 {\n --fa: "\\f243";\n}\n\n.fa-battery-empty {\n --fa: "\\f244";\n}\n\n.fa-battery-0 {\n --fa: "\\f244";\n}\n\n.fa-arrow-pointer {\n --fa: "\\f245";\n}\n\n.fa-mouse-pointer {\n --fa: "\\f245";\n}\n\n.fa-i-cursor {\n --fa: "\\f246";\n}\n\n.fa-object-group {\n --fa: "\\f247";\n}\n\n.fa-object-ungroup {\n --fa: "\\f248";\n}\n\n.fa-note-sticky {\n --fa: "\\f249";\n}\n\n.fa-sticky-note {\n --fa: "\\f249";\n}\n\n.fa-clone {\n --fa: "\\f24d";\n}\n\n.fa-scale-balanced {\n --fa: "\\f24e";\n}\n\n.fa-balance-scale {\n --fa: "\\f24e";\n}\n\n.fa-hourglass-start {\n --fa: "\\f251";\n}\n\n.fa-hourglass-1 {\n --fa: "\\f251";\n}\n\n.fa-hourglass-half {\n --fa: "\\f252";\n}\n\n.fa-hourglass-2 {\n --fa: "\\f252";\n}\n\n.fa-hourglass-end {\n --fa: "\\f253";\n}\n\n.fa-hourglass-3 {\n --fa: "\\f253";\n}\n\n.fa-hourglass {\n --fa: "\\f254";\n}\n\n.fa-hourglass-empty {\n --fa: "\\f254";\n}\n\n.fa-hand-back-fist {\n --fa: "\\f255";\n}\n\n.fa-hand-rock {\n --fa: "\\f255";\n}\n\n.fa-hand {\n --fa: "\\f256";\n}\n\n.fa-hand-paper {\n --fa: "\\f256";\n}\n\n.fa-hand-scissors {\n --fa: "\\f257";\n}\n\n.fa-hand-lizard {\n --fa: "\\f258";\n}\n\n.fa-hand-spock {\n --fa: "\\f259";\n}\n\n.fa-hand-pointer {\n --fa: "\\f25a";\n}\n\n.fa-hand-peace {\n --fa: "\\f25b";\n}\n\n.fa-trademark {\n --fa: "\\f25c";\n}\n\n.fa-registered {\n --fa: "\\f25d";\n}\n\n.fa-tv {\n --fa: "\\f26c";\n}\n\n.fa-television {\n --fa: "\\f26c";\n}\n\n.fa-tv-alt {\n --fa: "\\f26c";\n}\n\n.fa-calendar-plus {\n --fa: "\\f271";\n}\n\n.fa-calendar-minus {\n --fa: "\\f272";\n}\n\n.fa-calendar-xmark {\n --fa: "\\f273";\n}\n\n.fa-calendar-times {\n --fa: "\\f273";\n}\n\n.fa-calendar-check {\n --fa: "\\f274";\n}\n\n.fa-industry {\n --fa: "\\f275";\n}\n\n.fa-map-pin {\n --fa: "\\f276";\n}\n\n.fa-signs-post {\n --fa: "\\f277";\n}\n\n.fa-map-signs {\n --fa: "\\f277";\n}\n\n.fa-map {\n --fa: "\\f279";\n}\n\n.fa-message {\n --fa: "\\f27a";\n}\n\n.fa-comment-alt {\n --fa: "\\f27a";\n}\n\n.fa-circle-pause {\n --fa: "\\f28b";\n}\n\n.fa-pause-circle {\n --fa: "\\f28b";\n}\n\n.fa-circle-stop {\n --fa: "\\f28d";\n}\n\n.fa-stop-circle {\n --fa: "\\f28d";\n}\n\n.fa-bag-shopping {\n --fa: "\\f290";\n}\n\n.fa-shopping-bag {\n --fa: "\\f290";\n}\n\n.fa-basket-shopping {\n --fa: "\\f291";\n}\n\n.fa-shopping-basket {\n --fa: "\\f291";\n}\n\n.fa-universal-access {\n --fa: "\\f29a";\n}\n\n.fa-person-walking-with-cane {\n --fa: "\\f29d";\n}\n\n.fa-blind {\n --fa: "\\f29d";\n}\n\n.fa-audio-description {\n --fa: "\\f29e";\n}\n\n.fa-phone-volume {\n --fa: "\\f2a0";\n}\n\n.fa-volume-control-phone {\n --fa: "\\f2a0";\n}\n\n.fa-braille {\n --fa: "\\f2a1";\n}\n\n.fa-ear-listen {\n --fa: "\\f2a2";\n}\n\n.fa-assistive-listening-systems {\n --fa: "\\f2a2";\n}\n\n.fa-hands-asl-interpreting {\n --fa: "\\f2a3";\n}\n\n.fa-american-sign-language-interpreting {\n --fa: "\\f2a3";\n}\n\n.fa-asl-interpreting {\n --fa: "\\f2a3";\n}\n\n.fa-hands-american-sign-language-interpreting {\n --fa: "\\f2a3";\n}\n\n.fa-ear-deaf {\n --fa: "\\f2a4";\n}\n\n.fa-deaf {\n --fa: "\\f2a4";\n}\n\n.fa-deafness {\n --fa: "\\f2a4";\n}\n\n.fa-hard-of-hearing {\n --fa: "\\f2a4";\n}\n\n.fa-hands {\n --fa: "\\f2a7";\n}\n\n.fa-sign-language {\n --fa: "\\f2a7";\n}\n\n.fa-signing {\n --fa: "\\f2a7";\n}\n\n.fa-eye-low-vision {\n --fa: "\\f2a8";\n}\n\n.fa-low-vision {\n --fa: "\\f2a8";\n}\n\n.fa-font-awesome {\n --fa: "\\f2b4";\n}\n\n.fa-font-awesome-flag {\n --fa: "\\f2b4";\n}\n\n.fa-font-awesome-logo-full {\n --fa: "\\f2b4";\n}\n\n.fa-handshake {\n --fa: "\\f2b5";\n}\n\n.fa-handshake-alt {\n --fa: "\\f2b5";\n}\n\n.fa-handshake-simple {\n --fa: "\\f2b5";\n}\n\n.fa-envelope-open {\n --fa: "\\f2b6";\n}\n\n.fa-address-book {\n --fa: "\\f2b9";\n}\n\n.fa-contact-book {\n --fa: "\\f2b9";\n}\n\n.fa-address-card {\n --fa: "\\f2bb";\n}\n\n.fa-contact-card {\n --fa: "\\f2bb";\n}\n\n.fa-vcard {\n --fa: "\\f2bb";\n}\n\n.fa-circle-user {\n --fa: "\\f2bd";\n}\n\n.fa-user-circle {\n --fa: "\\f2bd";\n}\n\n.fa-id-badge {\n --fa: "\\f2c1";\n}\n\n.fa-id-card {\n --fa: "\\f2c2";\n}\n\n.fa-drivers-license {\n --fa: "\\f2c2";\n}\n\n.fa-temperature-full {\n --fa: "\\f2c7";\n}\n\n.fa-temperature-4 {\n --fa: "\\f2c7";\n}\n\n.fa-thermometer-4 {\n --fa: "\\f2c7";\n}\n\n.fa-thermometer-full {\n --fa: "\\f2c7";\n}\n\n.fa-temperature-three-quarters {\n --fa: "\\f2c8";\n}\n\n.fa-temperature-3 {\n --fa: "\\f2c8";\n}\n\n.fa-thermometer-3 {\n --fa: "\\f2c8";\n}\n\n.fa-thermometer-three-quarters {\n --fa: "\\f2c8";\n}\n\n.fa-temperature-half {\n --fa: "\\f2c9";\n}\n\n.fa-temperature-2 {\n --fa: "\\f2c9";\n}\n\n.fa-thermometer-2 {\n --fa: "\\f2c9";\n}\n\n.fa-thermometer-half {\n --fa: "\\f2c9";\n}\n\n.fa-temperature-quarter {\n --fa: "\\f2ca";\n}\n\n.fa-temperature-1 {\n --fa: "\\f2ca";\n}\n\n.fa-thermometer-1 {\n --fa: "\\f2ca";\n}\n\n.fa-thermometer-quarter {\n --fa: "\\f2ca";\n}\n\n.fa-temperature-empty {\n --fa: "\\f2cb";\n}\n\n.fa-temperature-0 {\n --fa: "\\f2cb";\n}\n\n.fa-thermometer-0 {\n --fa: "\\f2cb";\n}\n\n.fa-thermometer-empty {\n --fa: "\\f2cb";\n}\n\n.fa-shower {\n --fa: "\\f2cc";\n}\n\n.fa-bath {\n --fa: "\\f2cd";\n}\n\n.fa-bathtub {\n --fa: "\\f2cd";\n}\n\n.fa-podcast {\n --fa: "\\f2ce";\n}\n\n.fa-window-maximize {\n --fa: "\\f2d0";\n}\n\n.fa-window-minimize {\n --fa: "\\f2d1";\n}\n\n.fa-window-restore {\n --fa: "\\f2d2";\n}\n\n.fa-square-xmark {\n --fa: "\\f2d3";\n}\n\n.fa-times-square {\n --fa: "\\f2d3";\n}\n\n.fa-xmark-square {\n --fa: "\\f2d3";\n}\n\n.fa-microchip {\n --fa: "\\f2db";\n}\n\n.fa-snowflake {\n --fa: "\\f2dc";\n}\n\n.fa-spoon {\n --fa: "\\f2e5";\n}\n\n.fa-utensil-spoon {\n --fa: "\\f2e5";\n}\n\n.fa-utensils {\n --fa: "\\f2e7";\n}\n\n.fa-cutlery {\n --fa: "\\f2e7";\n}\n\n.fa-rotate-left {\n --fa: "\\f2ea";\n}\n\n.fa-rotate-back {\n --fa: "\\f2ea";\n}\n\n.fa-rotate-backward {\n --fa: "\\f2ea";\n}\n\n.fa-undo-alt {\n --fa: "\\f2ea";\n}\n\n.fa-trash-can {\n --fa: "\\f2ed";\n}\n\n.fa-trash-alt {\n --fa: "\\f2ed";\n}\n\n.fa-rotate {\n --fa: "\\f2f1";\n}\n\n.fa-sync-alt {\n --fa: "\\f2f1";\n}\n\n.fa-stopwatch {\n --fa: "\\f2f2";\n}\n\n.fa-right-from-bracket {\n --fa: "\\f2f5";\n}\n\n.fa-sign-out-alt {\n --fa: "\\f2f5";\n}\n\n.fa-right-to-bracket {\n --fa: "\\f2f6";\n}\n\n.fa-sign-in-alt {\n --fa: "\\f2f6";\n}\n\n.fa-rotate-right {\n --fa: "\\f2f9";\n}\n\n.fa-redo-alt {\n --fa: "\\f2f9";\n}\n\n.fa-rotate-forward {\n --fa: "\\f2f9";\n}\n\n.fa-poo {\n --fa: "\\f2fe";\n}\n\n.fa-images {\n --fa: "\\f302";\n}\n\n.fa-pencil {\n --fa: "\\f303";\n}\n\n.fa-pencil-alt {\n --fa: "\\f303";\n}\n\n.fa-pen {\n --fa: "\\f304";\n}\n\n.fa-pen-clip {\n --fa: "\\f305";\n}\n\n.fa-pen-alt {\n --fa: "\\f305";\n}\n\n.fa-octagon {\n --fa: "\\f306";\n}\n\n.fa-down-long {\n --fa: "\\f309";\n}\n\n.fa-long-arrow-alt-down {\n --fa: "\\f309";\n}\n\n.fa-left-long {\n --fa: "\\f30a";\n}\n\n.fa-long-arrow-alt-left {\n --fa: "\\f30a";\n}\n\n.fa-right-long {\n --fa: "\\f30b";\n}\n\n.fa-long-arrow-alt-right {\n --fa: "\\f30b";\n}\n\n.fa-up-long {\n --fa: "\\f30c";\n}\n\n.fa-long-arrow-alt-up {\n --fa: "\\f30c";\n}\n\n.fa-hexagon {\n --fa: "\\f312";\n}\n\n.fa-file-pen {\n --fa: "\\f31c";\n}\n\n.fa-file-edit {\n --fa: "\\f31c";\n}\n\n.fa-maximize {\n --fa: "\\f31e";\n}\n\n.fa-expand-arrows-alt {\n --fa: "\\f31e";\n}\n\n.fa-clipboard {\n --fa: "\\f328";\n}\n\n.fa-left-right {\n --fa: "\\f337";\n}\n\n.fa-arrows-alt-h {\n --fa: "\\f337";\n}\n\n.fa-up-down {\n --fa: "\\f338";\n}\n\n.fa-arrows-alt-v {\n --fa: "\\f338";\n}\n\n.fa-alarm-clock {\n --fa: "\\f34e";\n}\n\n.fa-circle-down {\n --fa: "\\f358";\n}\n\n.fa-arrow-alt-circle-down {\n --fa: "\\f358";\n}\n\n.fa-circle-left {\n --fa: "\\f359";\n}\n\n.fa-arrow-alt-circle-left {\n --fa: "\\f359";\n}\n\n.fa-circle-right {\n --fa: "\\f35a";\n}\n\n.fa-arrow-alt-circle-right {\n --fa: "\\f35a";\n}\n\n.fa-circle-up {\n --fa: "\\f35b";\n}\n\n.fa-arrow-alt-circle-up {\n --fa: "\\f35b";\n}\n\n.fa-up-right-from-square {\n --fa: "\\f35d";\n}\n\n.fa-external-link-alt {\n --fa: "\\f35d";\n}\n\n.fa-square-up-right {\n --fa: "\\f360";\n}\n\n.fa-external-link-square-alt {\n --fa: "\\f360";\n}\n\n.fa-right-left {\n --fa: "\\f362";\n}\n\n.fa-exchange-alt {\n --fa: "\\f362";\n}\n\n.fa-repeat {\n --fa: "\\f363";\n}\n\n.fa-code-commit {\n --fa: "\\f386";\n}\n\n.fa-code-merge {\n --fa: "\\f387";\n}\n\n.fa-desktop {\n --fa: "\\f390";\n}\n\n.fa-desktop-alt {\n --fa: "\\f390";\n}\n\n.fa-gem {\n --fa: "\\f3a5";\n}\n\n.fa-turn-down {\n --fa: "\\f3be";\n}\n\n.fa-level-down-alt {\n --fa: "\\f3be";\n}\n\n.fa-turn-up {\n --fa: "\\f3bf";\n}\n\n.fa-level-up-alt {\n --fa: "\\f3bf";\n}\n\n.fa-lock-open {\n --fa: "\\f3c1";\n}\n\n.fa-location-dot {\n --fa: "\\f3c5";\n}\n\n.fa-map-marker-alt {\n --fa: "\\f3c5";\n}\n\n.fa-microphone-lines {\n --fa: "\\f3c9";\n}\n\n.fa-microphone-alt {\n --fa: "\\f3c9";\n}\n\n.fa-mobile-screen-button {\n --fa: "\\f3cd";\n}\n\n.fa-mobile-alt {\n --fa: "\\f3cd";\n}\n\n.fa-mobile {\n --fa: "\\f3ce";\n}\n\n.fa-mobile-android {\n --fa: "\\f3ce";\n}\n\n.fa-mobile-phone {\n --fa: "\\f3ce";\n}\n\n.fa-mobile-screen {\n --fa: "\\f3cf";\n}\n\n.fa-mobile-android-alt {\n --fa: "\\f3cf";\n}\n\n.fa-money-bill-1 {\n --fa: "\\f3d1";\n}\n\n.fa-money-bill-alt {\n --fa: "\\f3d1";\n}\n\n.fa-phone-slash {\n --fa: "\\f3dd";\n}\n\n.fa-image-portrait {\n --fa: "\\f3e0";\n}\n\n.fa-portrait {\n --fa: "\\f3e0";\n}\n\n.fa-reply {\n --fa: "\\f3e5";\n}\n\n.fa-mail-reply {\n --fa: "\\f3e5";\n}\n\n.fa-shield-halved {\n --fa: "\\f3ed";\n}\n\n.fa-shield-alt {\n --fa: "\\f3ed";\n}\n\n.fa-tablet-screen-button {\n --fa: "\\f3fa";\n}\n\n.fa-tablet-alt {\n --fa: "\\f3fa";\n}\n\n.fa-tablet {\n --fa: "\\f3fb";\n}\n\n.fa-tablet-android {\n --fa: "\\f3fb";\n}\n\n.fa-ticket-simple {\n --fa: "\\f3ff";\n}\n\n.fa-ticket-alt {\n --fa: "\\f3ff";\n}\n\n.fa-rectangle-xmark {\n --fa: "\\f410";\n}\n\n.fa-rectangle-times {\n --fa: "\\f410";\n}\n\n.fa-times-rectangle {\n --fa: "\\f410";\n}\n\n.fa-window-close {\n --fa: "\\f410";\n}\n\n.fa-down-left-and-up-right-to-center {\n --fa: "\\f422";\n}\n\n.fa-compress-alt {\n --fa: "\\f422";\n}\n\n.fa-up-right-and-down-left-from-center {\n --fa: "\\f424";\n}\n\n.fa-expand-alt {\n --fa: "\\f424";\n}\n\n.fa-baseball-bat-ball {\n --fa: "\\f432";\n}\n\n.fa-baseball {\n --fa: "\\f433";\n}\n\n.fa-baseball-ball {\n --fa: "\\f433";\n}\n\n.fa-basketball {\n --fa: "\\f434";\n}\n\n.fa-basketball-ball {\n --fa: "\\f434";\n}\n\n.fa-bowling-ball {\n --fa: "\\f436";\n}\n\n.fa-chess {\n --fa: "\\f439";\n}\n\n.fa-chess-bishop {\n --fa: "\\f43a";\n}\n\n.fa-chess-board {\n --fa: "\\f43c";\n}\n\n.fa-chess-king {\n --fa: "\\f43f";\n}\n\n.fa-chess-knight {\n --fa: "\\f441";\n}\n\n.fa-chess-pawn {\n --fa: "\\f443";\n}\n\n.fa-chess-queen {\n --fa: "\\f445";\n}\n\n.fa-chess-rook {\n --fa: "\\f447";\n}\n\n.fa-dumbbell {\n --fa: "\\f44b";\n}\n\n.fa-football {\n --fa: "\\f44e";\n}\n\n.fa-football-ball {\n --fa: "\\f44e";\n}\n\n.fa-golf-ball-tee {\n --fa: "\\f450";\n}\n\n.fa-golf-ball {\n --fa: "\\f450";\n}\n\n.fa-hockey-puck {\n --fa: "\\f453";\n}\n\n.fa-broom-ball {\n --fa: "\\f458";\n}\n\n.fa-quidditch {\n --fa: "\\f458";\n}\n\n.fa-quidditch-broom-ball {\n --fa: "\\f458";\n}\n\n.fa-square-full {\n --fa: "\\f45c";\n}\n\n.fa-table-tennis-paddle-ball {\n --fa: "\\f45d";\n}\n\n.fa-ping-pong-paddle-ball {\n --fa: "\\f45d";\n}\n\n.fa-table-tennis {\n --fa: "\\f45d";\n}\n\n.fa-volleyball {\n --fa: "\\f45f";\n}\n\n.fa-volleyball-ball {\n --fa: "\\f45f";\n}\n\n.fa-hand-dots {\n --fa: "\\f461";\n}\n\n.fa-allergies {\n --fa: "\\f461";\n}\n\n.fa-bandage {\n --fa: "\\f462";\n}\n\n.fa-band-aid {\n --fa: "\\f462";\n}\n\n.fa-box {\n --fa: "\\f466";\n}\n\n.fa-boxes-stacked {\n --fa: "\\f468";\n}\n\n.fa-boxes {\n --fa: "\\f468";\n}\n\n.fa-boxes-alt {\n --fa: "\\f468";\n}\n\n.fa-briefcase-medical {\n --fa: "\\f469";\n}\n\n.fa-fire-flame-simple {\n --fa: "\\f46a";\n}\n\n.fa-burn {\n --fa: "\\f46a";\n}\n\n.fa-capsules {\n --fa: "\\f46b";\n}\n\n.fa-clipboard-check {\n --fa: "\\f46c";\n}\n\n.fa-clipboard-list {\n --fa: "\\f46d";\n}\n\n.fa-person-dots-from-line {\n --fa: "\\f470";\n}\n\n.fa-diagnoses {\n --fa: "\\f470";\n}\n\n.fa-dna {\n --fa: "\\f471";\n}\n\n.fa-dolly {\n --fa: "\\f472";\n}\n\n.fa-dolly-box {\n --fa: "\\f472";\n}\n\n.fa-cart-flatbed {\n --fa: "\\f474";\n}\n\n.fa-dolly-flatbed {\n --fa: "\\f474";\n}\n\n.fa-file-medical {\n --fa: "\\f477";\n}\n\n.fa-file-waveform {\n --fa: "\\f478";\n}\n\n.fa-file-medical-alt {\n --fa: "\\f478";\n}\n\n.fa-kit-medical {\n --fa: "\\f479";\n}\n\n.fa-first-aid {\n --fa: "\\f479";\n}\n\n.fa-circle-h {\n --fa: "\\f47e";\n}\n\n.fa-hospital-symbol {\n --fa: "\\f47e";\n}\n\n.fa-id-card-clip {\n --fa: "\\f47f";\n}\n\n.fa-id-card-alt {\n --fa: "\\f47f";\n}\n\n.fa-notes-medical {\n --fa: "\\f481";\n}\n\n.fa-pallet {\n --fa: "\\f482";\n}\n\n.fa-pills {\n --fa: "\\f484";\n}\n\n.fa-prescription-bottle {\n --fa: "\\f485";\n}\n\n.fa-prescription-bottle-medical {\n --fa: "\\f486";\n}\n\n.fa-prescription-bottle-alt {\n --fa: "\\f486";\n}\n\n.fa-bed-pulse {\n --fa: "\\f487";\n}\n\n.fa-procedures {\n --fa: "\\f487";\n}\n\n.fa-truck-fast {\n --fa: "\\f48b";\n}\n\n.fa-shipping-fast {\n --fa: "\\f48b";\n}\n\n.fa-smoking {\n --fa: "\\f48d";\n}\n\n.fa-syringe {\n --fa: "\\f48e";\n}\n\n.fa-tablets {\n --fa: "\\f490";\n}\n\n.fa-thermometer {\n --fa: "\\f491";\n}\n\n.fa-vial {\n --fa: "\\f492";\n}\n\n.fa-vials {\n --fa: "\\f493";\n}\n\n.fa-warehouse {\n --fa: "\\f494";\n}\n\n.fa-weight-scale {\n --fa: "\\f496";\n}\n\n.fa-weight {\n --fa: "\\f496";\n}\n\n.fa-x-ray {\n --fa: "\\f497";\n}\n\n.fa-box-open {\n --fa: "\\f49e";\n}\n\n.fa-comment-dots {\n --fa: "\\f4ad";\n}\n\n.fa-commenting {\n --fa: "\\f4ad";\n}\n\n.fa-comment-slash {\n --fa: "\\f4b3";\n}\n\n.fa-couch {\n --fa: "\\f4b8";\n}\n\n.fa-circle-dollar-to-slot {\n --fa: "\\f4b9";\n}\n\n.fa-donate {\n --fa: "\\f4b9";\n}\n\n.fa-dove {\n --fa: "\\f4ba";\n}\n\n.fa-hand-holding {\n --fa: "\\f4bd";\n}\n\n.fa-hand-holding-heart {\n --fa: "\\f4be";\n}\n\n.fa-hand-holding-dollar {\n --fa: "\\f4c0";\n}\n\n.fa-hand-holding-usd {\n --fa: "\\f4c0";\n}\n\n.fa-hand-holding-droplet {\n --fa: "\\f4c1";\n}\n\n.fa-hand-holding-water {\n --fa: "\\f4c1";\n}\n\n.fa-hands-holding {\n --fa: "\\f4c2";\n}\n\n.fa-handshake-angle {\n --fa: "\\f4c4";\n}\n\n.fa-hands-helping {\n --fa: "\\f4c4";\n}\n\n.fa-parachute-box {\n --fa: "\\f4cd";\n}\n\n.fa-people-carry-box {\n --fa: "\\f4ce";\n}\n\n.fa-people-carry {\n --fa: "\\f4ce";\n}\n\n.fa-piggy-bank {\n --fa: "\\f4d3";\n}\n\n.fa-ribbon {\n --fa: "\\f4d6";\n}\n\n.fa-route {\n --fa: "\\f4d7";\n}\n\n.fa-seedling {\n --fa: "\\f4d8";\n}\n\n.fa-sprout {\n --fa: "\\f4d8";\n}\n\n.fa-sign-hanging {\n --fa: "\\f4d9";\n}\n\n.fa-sign {\n --fa: "\\f4d9";\n}\n\n.fa-face-smile-wink {\n --fa: "\\f4da";\n}\n\n.fa-smile-wink {\n --fa: "\\f4da";\n}\n\n.fa-tape {\n --fa: "\\f4db";\n}\n\n.fa-truck-ramp-box {\n --fa: "\\f4de";\n}\n\n.fa-truck-loading {\n --fa: "\\f4de";\n}\n\n.fa-truck-moving {\n --fa: "\\f4df";\n}\n\n.fa-video-slash {\n --fa: "\\f4e2";\n}\n\n.fa-wine-glass {\n --fa: "\\f4e3";\n}\n\n.fa-user-astronaut {\n --fa: "\\f4fb";\n}\n\n.fa-user-check {\n --fa: "\\f4fc";\n}\n\n.fa-user-clock {\n --fa: "\\f4fd";\n}\n\n.fa-user-gear {\n --fa: "\\f4fe";\n}\n\n.fa-user-cog {\n --fa: "\\f4fe";\n}\n\n.fa-user-pen {\n --fa: "\\f4ff";\n}\n\n.fa-user-edit {\n --fa: "\\f4ff";\n}\n\n.fa-user-group {\n --fa: "\\f500";\n}\n\n.fa-user-friends {\n --fa: "\\f500";\n}\n\n.fa-user-graduate {\n --fa: "\\f501";\n}\n\n.fa-user-lock {\n --fa: "\\f502";\n}\n\n.fa-user-minus {\n --fa: "\\f503";\n}\n\n.fa-user-ninja {\n --fa: "\\f504";\n}\n\n.fa-user-shield {\n --fa: "\\f505";\n}\n\n.fa-user-slash {\n --fa: "\\f506";\n}\n\n.fa-user-alt-slash {\n --fa: "\\f506";\n}\n\n.fa-user-large-slash {\n --fa: "\\f506";\n}\n\n.fa-user-tag {\n --fa: "\\f507";\n}\n\n.fa-user-tie {\n --fa: "\\f508";\n}\n\n.fa-users-gear {\n --fa: "\\f509";\n}\n\n.fa-users-cog {\n --fa: "\\f509";\n}\n\n.fa-scale-unbalanced {\n --fa: "\\f515";\n}\n\n.fa-balance-scale-left {\n --fa: "\\f515";\n}\n\n.fa-scale-unbalanced-flip {\n --fa: "\\f516";\n}\n\n.fa-balance-scale-right {\n --fa: "\\f516";\n}\n\n.fa-blender {\n --fa: "\\f517";\n}\n\n.fa-book-open {\n --fa: "\\f518";\n}\n\n.fa-tower-broadcast {\n --fa: "\\f519";\n}\n\n.fa-broadcast-tower {\n --fa: "\\f519";\n}\n\n.fa-broom {\n --fa: "\\f51a";\n}\n\n.fa-chalkboard {\n --fa: "\\f51b";\n}\n\n.fa-blackboard {\n --fa: "\\f51b";\n}\n\n.fa-chalkboard-user {\n --fa: "\\f51c";\n}\n\n.fa-chalkboard-teacher {\n --fa: "\\f51c";\n}\n\n.fa-church {\n --fa: "\\f51d";\n}\n\n.fa-coins {\n --fa: "\\f51e";\n}\n\n.fa-compact-disc {\n --fa: "\\f51f";\n}\n\n.fa-crow {\n --fa: "\\f520";\n}\n\n.fa-crown {\n --fa: "\\f521";\n}\n\n.fa-dice {\n --fa: "\\f522";\n}\n\n.fa-dice-five {\n --fa: "\\f523";\n}\n\n.fa-dice-four {\n --fa: "\\f524";\n}\n\n.fa-dice-one {\n --fa: "\\f525";\n}\n\n.fa-dice-six {\n --fa: "\\f526";\n}\n\n.fa-dice-three {\n --fa: "\\f527";\n}\n\n.fa-dice-two {\n --fa: "\\f528";\n}\n\n.fa-divide {\n --fa: "\\f529";\n}\n\n.fa-door-closed {\n --fa: "\\f52a";\n}\n\n.fa-door-open {\n --fa: "\\f52b";\n}\n\n.fa-feather {\n --fa: "\\f52d";\n}\n\n.fa-frog {\n --fa: "\\f52e";\n}\n\n.fa-gas-pump {\n --fa: "\\f52f";\n}\n\n.fa-glasses {\n --fa: "\\f530";\n}\n\n.fa-greater-than-equal {\n --fa: "\\f532";\n}\n\n.fa-helicopter {\n --fa: "\\f533";\n}\n\n.fa-infinity {\n --fa: "\\f534";\n}\n\n.fa-kiwi-bird {\n --fa: "\\f535";\n}\n\n.fa-less-than-equal {\n --fa: "\\f537";\n}\n\n.fa-memory {\n --fa: "\\f538";\n}\n\n.fa-microphone-lines-slash {\n --fa: "\\f539";\n}\n\n.fa-microphone-alt-slash {\n --fa: "\\f539";\n}\n\n.fa-money-bill-wave {\n --fa: "\\f53a";\n}\n\n.fa-money-bill-1-wave {\n --fa: "\\f53b";\n}\n\n.fa-money-bill-wave-alt {\n --fa: "\\f53b";\n}\n\n.fa-money-check {\n --fa: "\\f53c";\n}\n\n.fa-money-check-dollar {\n --fa: "\\f53d";\n}\n\n.fa-money-check-alt {\n --fa: "\\f53d";\n}\n\n.fa-not-equal {\n --fa: "\\f53e";\n}\n\n.fa-palette {\n --fa: "\\f53f";\n}\n\n.fa-square-parking {\n --fa: "\\f540";\n}\n\n.fa-parking {\n --fa: "\\f540";\n}\n\n.fa-diagram-project {\n --fa: "\\f542";\n}\n\n.fa-project-diagram {\n --fa: "\\f542";\n}\n\n.fa-receipt {\n --fa: "\\f543";\n}\n\n.fa-robot {\n --fa: "\\f544";\n}\n\n.fa-ruler {\n --fa: "\\f545";\n}\n\n.fa-ruler-combined {\n --fa: "\\f546";\n}\n\n.fa-ruler-horizontal {\n --fa: "\\f547";\n}\n\n.fa-ruler-vertical {\n --fa: "\\f548";\n}\n\n.fa-school {\n --fa: "\\f549";\n}\n\n.fa-screwdriver {\n --fa: "\\f54a";\n}\n\n.fa-shoe-prints {\n --fa: "\\f54b";\n}\n\n.fa-skull {\n --fa: "\\f54c";\n}\n\n.fa-ban-smoking {\n --fa: "\\f54d";\n}\n\n.fa-smoking-ban {\n --fa: "\\f54d";\n}\n\n.fa-store {\n --fa: "\\f54e";\n}\n\n.fa-shop {\n --fa: "\\f54f";\n}\n\n.fa-store-alt {\n --fa: "\\f54f";\n}\n\n.fa-bars-staggered {\n --fa: "\\f550";\n}\n\n.fa-reorder {\n --fa: "\\f550";\n}\n\n.fa-stream {\n --fa: "\\f550";\n}\n\n.fa-stroopwafel {\n --fa: "\\f551";\n}\n\n.fa-toolbox {\n --fa: "\\f552";\n}\n\n.fa-shirt {\n --fa: "\\f553";\n}\n\n.fa-t-shirt {\n --fa: "\\f553";\n}\n\n.fa-tshirt {\n --fa: "\\f553";\n}\n\n.fa-person-walking {\n --fa: "\\f554";\n}\n\n.fa-walking {\n --fa: "\\f554";\n}\n\n.fa-wallet {\n --fa: "\\f555";\n}\n\n.fa-face-angry {\n --fa: "\\f556";\n}\n\n.fa-angry {\n --fa: "\\f556";\n}\n\n.fa-archway {\n --fa: "\\f557";\n}\n\n.fa-book-atlas {\n --fa: "\\f558";\n}\n\n.fa-atlas {\n --fa: "\\f558";\n}\n\n.fa-award {\n --fa: "\\f559";\n}\n\n.fa-delete-left {\n --fa: "\\f55a";\n}\n\n.fa-backspace {\n --fa: "\\f55a";\n}\n\n.fa-bezier-curve {\n --fa: "\\f55b";\n}\n\n.fa-bong {\n --fa: "\\f55c";\n}\n\n.fa-brush {\n --fa: "\\f55d";\n}\n\n.fa-bus-simple {\n --fa: "\\f55e";\n}\n\n.fa-bus-alt {\n --fa: "\\f55e";\n}\n\n.fa-cannabis {\n --fa: "\\f55f";\n}\n\n.fa-check-double {\n --fa: "\\f560";\n}\n\n.fa-martini-glass-citrus {\n --fa: "\\f561";\n}\n\n.fa-cocktail {\n --fa: "\\f561";\n}\n\n.fa-bell-concierge {\n --fa: "\\f562";\n}\n\n.fa-concierge-bell {\n --fa: "\\f562";\n}\n\n.fa-cookie {\n --fa: "\\f563";\n}\n\n.fa-cookie-bite {\n --fa: "\\f564";\n}\n\n.fa-crop-simple {\n --fa: "\\f565";\n}\n\n.fa-crop-alt {\n --fa: "\\f565";\n}\n\n.fa-tachograph-digital {\n --fa: "\\f566";\n}\n\n.fa-digital-tachograph {\n --fa: "\\f566";\n}\n\n.fa-face-dizzy {\n --fa: "\\f567";\n}\n\n.fa-dizzy {\n --fa: "\\f567";\n}\n\n.fa-compass-drafting {\n --fa: "\\f568";\n}\n\n.fa-drafting-compass {\n --fa: "\\f568";\n}\n\n.fa-drum {\n --fa: "\\f569";\n}\n\n.fa-drum-steelpan {\n --fa: "\\f56a";\n}\n\n.fa-feather-pointed {\n --fa: "\\f56b";\n}\n\n.fa-feather-alt {\n --fa: "\\f56b";\n}\n\n.fa-file-contract {\n --fa: "\\f56c";\n}\n\n.fa-file-arrow-down {\n --fa: "\\f56d";\n}\n\n.fa-file-download {\n --fa: "\\f56d";\n}\n\n.fa-file-export {\n --fa: "\\f56e";\n}\n\n.fa-arrow-right-from-file {\n --fa: "\\f56e";\n}\n\n.fa-file-import {\n --fa: "\\f56f";\n}\n\n.fa-arrow-right-to-file {\n --fa: "\\f56f";\n}\n\n.fa-file-invoice {\n --fa: "\\f570";\n}\n\n.fa-file-invoice-dollar {\n --fa: "\\f571";\n}\n\n.fa-file-prescription {\n --fa: "\\f572";\n}\n\n.fa-file-signature {\n --fa: "\\f573";\n}\n\n.fa-file-arrow-up {\n --fa: "\\f574";\n}\n\n.fa-file-upload {\n --fa: "\\f574";\n}\n\n.fa-fill {\n --fa: "\\f575";\n}\n\n.fa-fill-drip {\n --fa: "\\f576";\n}\n\n.fa-fingerprint {\n --fa: "\\f577";\n}\n\n.fa-fish {\n --fa: "\\f578";\n}\n\n.fa-face-flushed {\n --fa: "\\f579";\n}\n\n.fa-flushed {\n --fa: "\\f579";\n}\n\n.fa-face-frown-open {\n --fa: "\\f57a";\n}\n\n.fa-frown-open {\n --fa: "\\f57a";\n}\n\n.fa-martini-glass {\n --fa: "\\f57b";\n}\n\n.fa-glass-martini-alt {\n --fa: "\\f57b";\n}\n\n.fa-earth-africa {\n --fa: "\\f57c";\n}\n\n.fa-globe-africa {\n --fa: "\\f57c";\n}\n\n.fa-earth-americas {\n --fa: "\\f57d";\n}\n\n.fa-earth {\n --fa: "\\f57d";\n}\n\n.fa-earth-america {\n --fa: "\\f57d";\n}\n\n.fa-globe-americas {\n --fa: "\\f57d";\n}\n\n.fa-earth-asia {\n --fa: "\\f57e";\n}\n\n.fa-globe-asia {\n --fa: "\\f57e";\n}\n\n.fa-face-grimace {\n --fa: "\\f57f";\n}\n\n.fa-grimace {\n --fa: "\\f57f";\n}\n\n.fa-face-grin {\n --fa: "\\f580";\n}\n\n.fa-grin {\n --fa: "\\f580";\n}\n\n.fa-face-grin-wide {\n --fa: "\\f581";\n}\n\n.fa-grin-alt {\n --fa: "\\f581";\n}\n\n.fa-face-grin-beam {\n --fa: "\\f582";\n}\n\n.fa-grin-beam {\n --fa: "\\f582";\n}\n\n.fa-face-grin-beam-sweat {\n --fa: "\\f583";\n}\n\n.fa-grin-beam-sweat {\n --fa: "\\f583";\n}\n\n.fa-face-grin-hearts {\n --fa: "\\f584";\n}\n\n.fa-grin-hearts {\n --fa: "\\f584";\n}\n\n.fa-face-grin-squint {\n --fa: "\\f585";\n}\n\n.fa-grin-squint {\n --fa: "\\f585";\n}\n\n.fa-face-grin-squint-tears {\n --fa: "\\f586";\n}\n\n.fa-grin-squint-tears {\n --fa: "\\f586";\n}\n\n.fa-face-grin-stars {\n --fa: "\\f587";\n}\n\n.fa-grin-stars {\n --fa: "\\f587";\n}\n\n.fa-face-grin-tears {\n --fa: "\\f588";\n}\n\n.fa-grin-tears {\n --fa: "\\f588";\n}\n\n.fa-face-grin-tongue {\n --fa: "\\f589";\n}\n\n.fa-grin-tongue {\n --fa: "\\f589";\n}\n\n.fa-face-grin-tongue-squint {\n --fa: "\\f58a";\n}\n\n.fa-grin-tongue-squint {\n --fa: "\\f58a";\n}\n\n.fa-face-grin-tongue-wink {\n --fa: "\\f58b";\n}\n\n.fa-grin-tongue-wink {\n --fa: "\\f58b";\n}\n\n.fa-face-grin-wink {\n --fa: "\\f58c";\n}\n\n.fa-grin-wink {\n --fa: "\\f58c";\n}\n\n.fa-grip {\n --fa: "\\f58d";\n}\n\n.fa-grid-horizontal {\n --fa: "\\f58d";\n}\n\n.fa-grip-horizontal {\n --fa: "\\f58d";\n}\n\n.fa-grip-vertical {\n --fa: "\\f58e";\n}\n\n.fa-grid-vertical {\n --fa: "\\f58e";\n}\n\n.fa-headset {\n --fa: "\\f590";\n}\n\n.fa-highlighter {\n --fa: "\\f591";\n}\n\n.fa-hot-tub-person {\n --fa: "\\f593";\n}\n\n.fa-hot-tub {\n --fa: "\\f593";\n}\n\n.fa-hotel {\n --fa: "\\f594";\n}\n\n.fa-joint {\n --fa: "\\f595";\n}\n\n.fa-face-kiss {\n --fa: "\\f596";\n}\n\n.fa-kiss {\n --fa: "\\f596";\n}\n\n.fa-face-kiss-beam {\n --fa: "\\f597";\n}\n\n.fa-kiss-beam {\n --fa: "\\f597";\n}\n\n.fa-face-kiss-wink-heart {\n --fa: "\\f598";\n}\n\n.fa-kiss-wink-heart {\n --fa: "\\f598";\n}\n\n.fa-face-laugh {\n --fa: "\\f599";\n}\n\n.fa-laugh {\n --fa: "\\f599";\n}\n\n.fa-face-laugh-beam {\n --fa: "\\f59a";\n}\n\n.fa-laugh-beam {\n --fa: "\\f59a";\n}\n\n.fa-face-laugh-squint {\n --fa: "\\f59b";\n}\n\n.fa-laugh-squint {\n --fa: "\\f59b";\n}\n\n.fa-face-laugh-wink {\n --fa: "\\f59c";\n}\n\n.fa-laugh-wink {\n --fa: "\\f59c";\n}\n\n.fa-cart-flatbed-suitcase {\n --fa: "\\f59d";\n}\n\n.fa-luggage-cart {\n --fa: "\\f59d";\n}\n\n.fa-map-location {\n --fa: "\\f59f";\n}\n\n.fa-map-marked {\n --fa: "\\f59f";\n}\n\n.fa-map-location-dot {\n --fa: "\\f5a0";\n}\n\n.fa-map-marked-alt {\n --fa: "\\f5a0";\n}\n\n.fa-marker {\n --fa: "\\f5a1";\n}\n\n.fa-medal {\n --fa: "\\f5a2";\n}\n\n.fa-face-meh-blank {\n --fa: "\\f5a4";\n}\n\n.fa-meh-blank {\n --fa: "\\f5a4";\n}\n\n.fa-face-rolling-eyes {\n --fa: "\\f5a5";\n}\n\n.fa-meh-rolling-eyes {\n --fa: "\\f5a5";\n}\n\n.fa-monument {\n --fa: "\\f5a6";\n}\n\n.fa-mortar-pestle {\n --fa: "\\f5a7";\n}\n\n.fa-paint-roller {\n --fa: "\\f5aa";\n}\n\n.fa-passport {\n --fa: "\\f5ab";\n}\n\n.fa-pen-fancy {\n --fa: "\\f5ac";\n}\n\n.fa-pen-nib {\n --fa: "\\f5ad";\n}\n\n.fa-pen-ruler {\n --fa: "\\f5ae";\n}\n\n.fa-pencil-ruler {\n --fa: "\\f5ae";\n}\n\n.fa-plane-arrival {\n --fa: "\\f5af";\n}\n\n.fa-plane-departure {\n --fa: "\\f5b0";\n}\n\n.fa-prescription {\n --fa: "\\f5b1";\n}\n\n.fa-face-sad-cry {\n --fa: "\\f5b3";\n}\n\n.fa-sad-cry {\n --fa: "\\f5b3";\n}\n\n.fa-face-sad-tear {\n --fa: "\\f5b4";\n}\n\n.fa-sad-tear {\n --fa: "\\f5b4";\n}\n\n.fa-van-shuttle {\n --fa: "\\f5b6";\n}\n\n.fa-shuttle-van {\n --fa: "\\f5b6";\n}\n\n.fa-signature {\n --fa: "\\f5b7";\n}\n\n.fa-face-smile-beam {\n --fa: "\\f5b8";\n}\n\n.fa-smile-beam {\n --fa: "\\f5b8";\n}\n\n.fa-solar-panel {\n --fa: "\\f5ba";\n}\n\n.fa-spa {\n --fa: "\\f5bb";\n}\n\n.fa-lotus {\n --fa: "\\f5bb";\n}\n\n.fa-splotch {\n --fa: "\\f5bc";\n}\n\n.fa-spray-can {\n --fa: "\\f5bd";\n}\n\n.fa-stamp {\n --fa: "\\f5bf";\n}\n\n.fa-star-half-stroke {\n --fa: "\\f5c0";\n}\n\n.fa-star-half-alt {\n --fa: "\\f5c0";\n}\n\n.fa-suitcase-rolling {\n --fa: "\\f5c1";\n}\n\n.fa-face-surprise {\n --fa: "\\f5c2";\n}\n\n.fa-surprise {\n --fa: "\\f5c2";\n}\n\n.fa-swatchbook {\n --fa: "\\f5c3";\n}\n\n.fa-person-swimming {\n --fa: "\\f5c4";\n}\n\n.fa-swimmer {\n --fa: "\\f5c4";\n}\n\n.fa-water-ladder {\n --fa: "\\f5c5";\n}\n\n.fa-ladder-water {\n --fa: "\\f5c5";\n}\n\n.fa-swimming-pool {\n --fa: "\\f5c5";\n}\n\n.fa-droplet-slash {\n --fa: "\\f5c7";\n}\n\n.fa-tint-slash {\n --fa: "\\f5c7";\n}\n\n.fa-face-tired {\n --fa: "\\f5c8";\n}\n\n.fa-tired {\n --fa: "\\f5c8";\n}\n\n.fa-tooth {\n --fa: "\\f5c9";\n}\n\n.fa-umbrella-beach {\n --fa: "\\f5ca";\n}\n\n.fa-weight-hanging {\n --fa: "\\f5cd";\n}\n\n.fa-wine-glass-empty {\n --fa: "\\f5ce";\n}\n\n.fa-wine-glass-alt {\n --fa: "\\f5ce";\n}\n\n.fa-spray-can-sparkles {\n --fa: "\\f5d0";\n}\n\n.fa-air-freshener {\n --fa: "\\f5d0";\n}\n\n.fa-apple-whole {\n --fa: "\\f5d1";\n}\n\n.fa-apple-alt {\n --fa: "\\f5d1";\n}\n\n.fa-atom {\n --fa: "\\f5d2";\n}\n\n.fa-bone {\n --fa: "\\f5d7";\n}\n\n.fa-book-open-reader {\n --fa: "\\f5da";\n}\n\n.fa-book-reader {\n --fa: "\\f5da";\n}\n\n.fa-brain {\n --fa: "\\f5dc";\n}\n\n.fa-car-rear {\n --fa: "\\f5de";\n}\n\n.fa-car-alt {\n --fa: "\\f5de";\n}\n\n.fa-car-battery {\n --fa: "\\f5df";\n}\n\n.fa-battery-car {\n --fa: "\\f5df";\n}\n\n.fa-car-burst {\n --fa: "\\f5e1";\n}\n\n.fa-car-crash {\n --fa: "\\f5e1";\n}\n\n.fa-car-side {\n --fa: "\\f5e4";\n}\n\n.fa-charging-station {\n --fa: "\\f5e7";\n}\n\n.fa-diamond-turn-right {\n --fa: "\\f5eb";\n}\n\n.fa-directions {\n --fa: "\\f5eb";\n}\n\n.fa-draw-polygon {\n --fa: "\\f5ee";\n}\n\n.fa-vector-polygon {\n --fa: "\\f5ee";\n}\n\n.fa-laptop-code {\n --fa: "\\f5fc";\n}\n\n.fa-layer-group {\n --fa: "\\f5fd";\n}\n\n.fa-location-crosshairs {\n --fa: "\\f601";\n}\n\n.fa-location {\n --fa: "\\f601";\n}\n\n.fa-lungs {\n --fa: "\\f604";\n}\n\n.fa-microscope {\n --fa: "\\f610";\n}\n\n.fa-oil-can {\n --fa: "\\f613";\n}\n\n.fa-poop {\n --fa: "\\f619";\n}\n\n.fa-shapes {\n --fa: "\\f61f";\n}\n\n.fa-triangle-circle-square {\n --fa: "\\f61f";\n}\n\n.fa-star-of-life {\n --fa: "\\f621";\n}\n\n.fa-gauge {\n --fa: "\\f624";\n}\n\n.fa-dashboard {\n --fa: "\\f624";\n}\n\n.fa-gauge-med {\n --fa: "\\f624";\n}\n\n.fa-tachometer-alt-average {\n --fa: "\\f624";\n}\n\n.fa-gauge-high {\n --fa: "\\f625";\n}\n\n.fa-tachometer-alt {\n --fa: "\\f625";\n}\n\n.fa-tachometer-alt-fast {\n --fa: "\\f625";\n}\n\n.fa-gauge-simple {\n --fa: "\\f629";\n}\n\n.fa-gauge-simple-med {\n --fa: "\\f629";\n}\n\n.fa-tachometer-average {\n --fa: "\\f629";\n}\n\n.fa-gauge-simple-high {\n --fa: "\\f62a";\n}\n\n.fa-tachometer {\n --fa: "\\f62a";\n}\n\n.fa-tachometer-fast {\n --fa: "\\f62a";\n}\n\n.fa-teeth {\n --fa: "\\f62e";\n}\n\n.fa-teeth-open {\n --fa: "\\f62f";\n}\n\n.fa-masks-theater {\n --fa: "\\f630";\n}\n\n.fa-theater-masks {\n --fa: "\\f630";\n}\n\n.fa-traffic-light {\n --fa: "\\f637";\n}\n\n.fa-truck-monster {\n --fa: "\\f63b";\n}\n\n.fa-truck-pickup {\n --fa: "\\f63c";\n}\n\n.fa-rectangle-ad {\n --fa: "\\f641";\n}\n\n.fa-ad {\n --fa: "\\f641";\n}\n\n.fa-ankh {\n --fa: "\\f644";\n}\n\n.fa-book-bible {\n --fa: "\\f647";\n}\n\n.fa-bible {\n --fa: "\\f647";\n}\n\n.fa-business-time {\n --fa: "\\f64a";\n}\n\n.fa-briefcase-clock {\n --fa: "\\f64a";\n}\n\n.fa-city {\n --fa: "\\f64f";\n}\n\n.fa-comment-dollar {\n --fa: "\\f651";\n}\n\n.fa-comments-dollar {\n --fa: "\\f653";\n}\n\n.fa-cross {\n --fa: "\\f654";\n}\n\n.fa-dharmachakra {\n --fa: "\\f655";\n}\n\n.fa-envelope-open-text {\n --fa: "\\f658";\n}\n\n.fa-folder-minus {\n --fa: "\\f65d";\n}\n\n.fa-folder-plus {\n --fa: "\\f65e";\n}\n\n.fa-filter-circle-dollar {\n --fa: "\\f662";\n}\n\n.fa-funnel-dollar {\n --fa: "\\f662";\n}\n\n.fa-gopuram {\n --fa: "\\f664";\n}\n\n.fa-hamsa {\n --fa: "\\f665";\n}\n\n.fa-bahai {\n --fa: "\\f666";\n}\n\n.fa-haykal {\n --fa: "\\f666";\n}\n\n.fa-jedi {\n --fa: "\\f669";\n}\n\n.fa-book-journal-whills {\n --fa: "\\f66a";\n}\n\n.fa-journal-whills {\n --fa: "\\f66a";\n}\n\n.fa-kaaba {\n --fa: "\\f66b";\n}\n\n.fa-khanda {\n --fa: "\\f66d";\n}\n\n.fa-landmark {\n --fa: "\\f66f";\n}\n\n.fa-envelopes-bulk {\n --fa: "\\f674";\n}\n\n.fa-mail-bulk {\n --fa: "\\f674";\n}\n\n.fa-menorah {\n --fa: "\\f676";\n}\n\n.fa-mosque {\n --fa: "\\f678";\n}\n\n.fa-om {\n --fa: "\\f679";\n}\n\n.fa-spaghetti-monster-flying {\n --fa: "\\f67b";\n}\n\n.fa-pastafarianism {\n --fa: "\\f67b";\n}\n\n.fa-peace {\n --fa: "\\f67c";\n}\n\n.fa-place-of-worship {\n --fa: "\\f67f";\n}\n\n.fa-square-poll-vertical {\n --fa: "\\f681";\n}\n\n.fa-poll {\n --fa: "\\f681";\n}\n\n.fa-square-poll-horizontal {\n --fa: "\\f682";\n}\n\n.fa-poll-h {\n --fa: "\\f682";\n}\n\n.fa-person-praying {\n --fa: "\\f683";\n}\n\n.fa-pray {\n --fa: "\\f683";\n}\n\n.fa-hands-praying {\n --fa: "\\f684";\n}\n\n.fa-praying-hands {\n --fa: "\\f684";\n}\n\n.fa-book-quran {\n --fa: "\\f687";\n}\n\n.fa-quran {\n --fa: "\\f687";\n}\n\n.fa-magnifying-glass-dollar {\n --fa: "\\f688";\n}\n\n.fa-search-dollar {\n --fa: "\\f688";\n}\n\n.fa-magnifying-glass-location {\n --fa: "\\f689";\n}\n\n.fa-search-location {\n --fa: "\\f689";\n}\n\n.fa-socks {\n --fa: "\\f696";\n}\n\n.fa-square-root-variable {\n --fa: "\\f698";\n}\n\n.fa-square-root-alt {\n --fa: "\\f698";\n}\n\n.fa-star-and-crescent {\n --fa: "\\f699";\n}\n\n.fa-star-of-david {\n --fa: "\\f69a";\n}\n\n.fa-synagogue {\n --fa: "\\f69b";\n}\n\n.fa-scroll-torah {\n --fa: "\\f6a0";\n}\n\n.fa-torah {\n --fa: "\\f6a0";\n}\n\n.fa-torii-gate {\n --fa: "\\f6a1";\n}\n\n.fa-vihara {\n --fa: "\\f6a7";\n}\n\n.fa-volume {\n --fa: "\\f6a8";\n}\n\n.fa-volume-medium {\n --fa: "\\f6a8";\n}\n\n.fa-volume-xmark {\n --fa: "\\f6a9";\n}\n\n.fa-volume-mute {\n --fa: "\\f6a9";\n}\n\n.fa-volume-times {\n --fa: "\\f6a9";\n}\n\n.fa-yin-yang {\n --fa: "\\f6ad";\n}\n\n.fa-blender-phone {\n --fa: "\\f6b6";\n}\n\n.fa-book-skull {\n --fa: "\\f6b7";\n}\n\n.fa-book-dead {\n --fa: "\\f6b7";\n}\n\n.fa-campground {\n --fa: "\\f6bb";\n}\n\n.fa-cat {\n --fa: "\\f6be";\n}\n\n.fa-chair {\n --fa: "\\f6c0";\n}\n\n.fa-cloud-moon {\n --fa: "\\f6c3";\n}\n\n.fa-cloud-sun {\n --fa: "\\f6c4";\n}\n\n.fa-cow {\n --fa: "\\f6c8";\n}\n\n.fa-dice-d20 {\n --fa: "\\f6cf";\n}\n\n.fa-dice-d6 {\n --fa: "\\f6d1";\n}\n\n.fa-dog {\n --fa: "\\f6d3";\n}\n\n.fa-dragon {\n --fa: "\\f6d5";\n}\n\n.fa-drumstick-bite {\n --fa: "\\f6d7";\n}\n\n.fa-dungeon {\n --fa: "\\f6d9";\n}\n\n.fa-file-csv {\n --fa: "\\f6dd";\n}\n\n.fa-hand-fist {\n --fa: "\\f6de";\n}\n\n.fa-fist-raised {\n --fa: "\\f6de";\n}\n\n.fa-ghost {\n --fa: "\\f6e2";\n}\n\n.fa-hammer {\n --fa: "\\f6e3";\n}\n\n.fa-hanukiah {\n --fa: "\\f6e6";\n}\n\n.fa-hat-wizard {\n --fa: "\\f6e8";\n}\n\n.fa-person-hiking {\n --fa: "\\f6ec";\n}\n\n.fa-hiking {\n --fa: "\\f6ec";\n}\n\n.fa-hippo {\n --fa: "\\f6ed";\n}\n\n.fa-horse {\n --fa: "\\f6f0";\n}\n\n.fa-house-chimney-crack {\n --fa: "\\f6f1";\n}\n\n.fa-house-damage {\n --fa: "\\f6f1";\n}\n\n.fa-hryvnia-sign {\n --fa: "\\f6f2";\n}\n\n.fa-hryvnia {\n --fa: "\\f6f2";\n}\n\n.fa-mask {\n --fa: "\\f6fa";\n}\n\n.fa-mountain {\n --fa: "\\f6fc";\n}\n\n.fa-network-wired {\n --fa: "\\f6ff";\n}\n\n.fa-otter {\n --fa: "\\f700";\n}\n\n.fa-ring {\n --fa: "\\f70b";\n}\n\n.fa-person-running {\n --fa: "\\f70c";\n}\n\n.fa-running {\n --fa: "\\f70c";\n}\n\n.fa-scroll {\n --fa: "\\f70e";\n}\n\n.fa-skull-crossbones {\n --fa: "\\f714";\n}\n\n.fa-slash {\n --fa: "\\f715";\n}\n\n.fa-spider {\n --fa: "\\f717";\n}\n\n.fa-toilet-paper {\n --fa: "\\f71e";\n}\n\n.fa-toilet-paper-alt {\n --fa: "\\f71e";\n}\n\n.fa-toilet-paper-blank {\n --fa: "\\f71e";\n}\n\n.fa-tractor {\n --fa: "\\f722";\n}\n\n.fa-user-injured {\n --fa: "\\f728";\n}\n\n.fa-vr-cardboard {\n --fa: "\\f729";\n}\n\n.fa-wand-sparkles {\n --fa: "\\f72b";\n}\n\n.fa-wind {\n --fa: "\\f72e";\n}\n\n.fa-wine-bottle {\n --fa: "\\f72f";\n}\n\n.fa-cloud-meatball {\n --fa: "\\f73b";\n}\n\n.fa-cloud-moon-rain {\n --fa: "\\f73c";\n}\n\n.fa-cloud-rain {\n --fa: "\\f73d";\n}\n\n.fa-cloud-showers-heavy {\n --fa: "\\f740";\n}\n\n.fa-cloud-sun-rain {\n --fa: "\\f743";\n}\n\n.fa-democrat {\n --fa: "\\f747";\n}\n\n.fa-flag-usa {\n --fa: "\\f74d";\n}\n\n.fa-hurricane {\n --fa: "\\f751";\n}\n\n.fa-landmark-dome {\n --fa: "\\f752";\n}\n\n.fa-landmark-alt {\n --fa: "\\f752";\n}\n\n.fa-meteor {\n --fa: "\\f753";\n}\n\n.fa-person-booth {\n --fa: "\\f756";\n}\n\n.fa-poo-storm {\n --fa: "\\f75a";\n}\n\n.fa-poo-bolt {\n --fa: "\\f75a";\n}\n\n.fa-rainbow {\n --fa: "\\f75b";\n}\n\n.fa-republican {\n --fa: "\\f75e";\n}\n\n.fa-smog {\n --fa: "\\f75f";\n}\n\n.fa-temperature-high {\n --fa: "\\f769";\n}\n\n.fa-temperature-low {\n --fa: "\\f76b";\n}\n\n.fa-cloud-bolt {\n --fa: "\\f76c";\n}\n\n.fa-thunderstorm {\n --fa: "\\f76c";\n}\n\n.fa-tornado {\n --fa: "\\f76f";\n}\n\n.fa-volcano {\n --fa: "\\f770";\n}\n\n.fa-check-to-slot {\n --fa: "\\f772";\n}\n\n.fa-vote-yea {\n --fa: "\\f772";\n}\n\n.fa-water {\n --fa: "\\f773";\n}\n\n.fa-baby {\n --fa: "\\f77c";\n}\n\n.fa-baby-carriage {\n --fa: "\\f77d";\n}\n\n.fa-carriage-baby {\n --fa: "\\f77d";\n}\n\n.fa-biohazard {\n --fa: "\\f780";\n}\n\n.fa-blog {\n --fa: "\\f781";\n}\n\n.fa-calendar-day {\n --fa: "\\f783";\n}\n\n.fa-calendar-week {\n --fa: "\\f784";\n}\n\n.fa-candy-cane {\n --fa: "\\f786";\n}\n\n.fa-carrot {\n --fa: "\\f787";\n}\n\n.fa-cash-register {\n --fa: "\\f788";\n}\n\n.fa-minimize {\n --fa: "\\f78c";\n}\n\n.fa-compress-arrows-alt {\n --fa: "\\f78c";\n}\n\n.fa-dumpster {\n --fa: "\\f793";\n}\n\n.fa-dumpster-fire {\n --fa: "\\f794";\n}\n\n.fa-ethernet {\n --fa: "\\f796";\n}\n\n.fa-gifts {\n --fa: "\\f79c";\n}\n\n.fa-champagne-glasses {\n --fa: "\\f79f";\n}\n\n.fa-glass-cheers {\n --fa: "\\f79f";\n}\n\n.fa-whiskey-glass {\n --fa: "\\f7a0";\n}\n\n.fa-glass-whiskey {\n --fa: "\\f7a0";\n}\n\n.fa-earth-europe {\n --fa: "\\f7a2";\n}\n\n.fa-globe-europe {\n --fa: "\\f7a2";\n}\n\n.fa-grip-lines {\n --fa: "\\f7a4";\n}\n\n.fa-grip-lines-vertical {\n --fa: "\\f7a5";\n}\n\n.fa-guitar {\n --fa: "\\f7a6";\n}\n\n.fa-heart-crack {\n --fa: "\\f7a9";\n}\n\n.fa-heart-broken {\n --fa: "\\f7a9";\n}\n\n.fa-holly-berry {\n --fa: "\\f7aa";\n}\n\n.fa-horse-head {\n --fa: "\\f7ab";\n}\n\n.fa-icicles {\n --fa: "\\f7ad";\n}\n\n.fa-igloo {\n --fa: "\\f7ae";\n}\n\n.fa-mitten {\n --fa: "\\f7b5";\n}\n\n.fa-mug-hot {\n --fa: "\\f7b6";\n}\n\n.fa-radiation {\n --fa: "\\f7b9";\n}\n\n.fa-circle-radiation {\n --fa: "\\f7ba";\n}\n\n.fa-radiation-alt {\n --fa: "\\f7ba";\n}\n\n.fa-restroom {\n --fa: "\\f7bd";\n}\n\n.fa-satellite {\n --fa: "\\f7bf";\n}\n\n.fa-satellite-dish {\n --fa: "\\f7c0";\n}\n\n.fa-sd-card {\n --fa: "\\f7c2";\n}\n\n.fa-sim-card {\n --fa: "\\f7c4";\n}\n\n.fa-person-skating {\n --fa: "\\f7c5";\n}\n\n.fa-skating {\n --fa: "\\f7c5";\n}\n\n.fa-person-skiing {\n --fa: "\\f7c9";\n}\n\n.fa-skiing {\n --fa: "\\f7c9";\n}\n\n.fa-person-skiing-nordic {\n --fa: "\\f7ca";\n}\n\n.fa-skiing-nordic {\n --fa: "\\f7ca";\n}\n\n.fa-sleigh {\n --fa: "\\f7cc";\n}\n\n.fa-comment-sms {\n --fa: "\\f7cd";\n}\n\n.fa-sms {\n --fa: "\\f7cd";\n}\n\n.fa-person-snowboarding {\n --fa: "\\f7ce";\n}\n\n.fa-snowboarding {\n --fa: "\\f7ce";\n}\n\n.fa-snowman {\n --fa: "\\f7d0";\n}\n\n.fa-snowplow {\n --fa: "\\f7d2";\n}\n\n.fa-tenge-sign {\n --fa: "\\f7d7";\n}\n\n.fa-tenge {\n --fa: "\\f7d7";\n}\n\n.fa-toilet {\n --fa: "\\f7d8";\n}\n\n.fa-screwdriver-wrench {\n --fa: "\\f7d9";\n}\n\n.fa-tools {\n --fa: "\\f7d9";\n}\n\n.fa-cable-car {\n --fa: "\\f7da";\n}\n\n.fa-tram {\n --fa: "\\f7da";\n}\n\n.fa-fire-flame-curved {\n --fa: "\\f7e4";\n}\n\n.fa-fire-alt {\n --fa: "\\f7e4";\n}\n\n.fa-bacon {\n --fa: "\\f7e5";\n}\n\n.fa-book-medical {\n --fa: "\\f7e6";\n}\n\n.fa-bread-slice {\n --fa: "\\f7ec";\n}\n\n.fa-cheese {\n --fa: "\\f7ef";\n}\n\n.fa-house-chimney-medical {\n --fa: "\\f7f2";\n}\n\n.fa-clinic-medical {\n --fa: "\\f7f2";\n}\n\n.fa-clipboard-user {\n --fa: "\\f7f3";\n}\n\n.fa-comment-medical {\n --fa: "\\f7f5";\n}\n\n.fa-crutch {\n --fa: "\\f7f7";\n}\n\n.fa-disease {\n --fa: "\\f7fa";\n}\n\n.fa-egg {\n --fa: "\\f7fb";\n}\n\n.fa-folder-tree {\n --fa: "\\f802";\n}\n\n.fa-burger {\n --fa: "\\f805";\n}\n\n.fa-hamburger {\n --fa: "\\f805";\n}\n\n.fa-hand-middle-finger {\n --fa: "\\f806";\n}\n\n.fa-helmet-safety {\n --fa: "\\f807";\n}\n\n.fa-hard-hat {\n --fa: "\\f807";\n}\n\n.fa-hat-hard {\n --fa: "\\f807";\n}\n\n.fa-hospital-user {\n --fa: "\\f80d";\n}\n\n.fa-hotdog {\n --fa: "\\f80f";\n}\n\n.fa-ice-cream {\n --fa: "\\f810";\n}\n\n.fa-laptop-medical {\n --fa: "\\f812";\n}\n\n.fa-pager {\n --fa: "\\f815";\n}\n\n.fa-pepper-hot {\n --fa: "\\f816";\n}\n\n.fa-pizza-slice {\n --fa: "\\f818";\n}\n\n.fa-sack-dollar {\n --fa: "\\f81d";\n}\n\n.fa-book-tanakh {\n --fa: "\\f827";\n}\n\n.fa-tanakh {\n --fa: "\\f827";\n}\n\n.fa-bars-progress {\n --fa: "\\f828";\n}\n\n.fa-tasks-alt {\n --fa: "\\f828";\n}\n\n.fa-trash-arrow-up {\n --fa: "\\f829";\n}\n\n.fa-trash-restore {\n --fa: "\\f829";\n}\n\n.fa-trash-can-arrow-up {\n --fa: "\\f82a";\n}\n\n.fa-trash-restore-alt {\n --fa: "\\f82a";\n}\n\n.fa-user-nurse {\n --fa: "\\f82f";\n}\n\n.fa-wave-square {\n --fa: "\\f83e";\n}\n\n.fa-person-biking {\n --fa: "\\f84a";\n}\n\n.fa-biking {\n --fa: "\\f84a";\n}\n\n.fa-border-all {\n --fa: "\\f84c";\n}\n\n.fa-border-none {\n --fa: "\\f850";\n}\n\n.fa-border-top-left {\n --fa: "\\f853";\n}\n\n.fa-border-style {\n --fa: "\\f853";\n}\n\n.fa-person-digging {\n --fa: "\\f85e";\n}\n\n.fa-digging {\n --fa: "\\f85e";\n}\n\n.fa-fan {\n --fa: "\\f863";\n}\n\n.fa-icons {\n --fa: "\\f86d";\n}\n\n.fa-heart-music-camera-bolt {\n --fa: "\\f86d";\n}\n\n.fa-phone-flip {\n --fa: "\\f879";\n}\n\n.fa-phone-alt {\n --fa: "\\f879";\n}\n\n.fa-square-phone-flip {\n --fa: "\\f87b";\n}\n\n.fa-phone-square-alt {\n --fa: "\\f87b";\n}\n\n.fa-photo-film {\n --fa: "\\f87c";\n}\n\n.fa-photo-video {\n --fa: "\\f87c";\n}\n\n.fa-text-slash {\n --fa: "\\f87d";\n}\n\n.fa-remove-format {\n --fa: "\\f87d";\n}\n\n.fa-arrow-down-z-a {\n --fa: "\\f881";\n}\n\n.fa-sort-alpha-desc {\n --fa: "\\f881";\n}\n\n.fa-sort-alpha-down-alt {\n --fa: "\\f881";\n}\n\n.fa-arrow-up-z-a {\n --fa: "\\f882";\n}\n\n.fa-sort-alpha-up-alt {\n --fa: "\\f882";\n}\n\n.fa-arrow-down-short-wide {\n --fa: "\\f884";\n}\n\n.fa-sort-amount-desc {\n --fa: "\\f884";\n}\n\n.fa-sort-amount-down-alt {\n --fa: "\\f884";\n}\n\n.fa-arrow-up-short-wide {\n --fa: "\\f885";\n}\n\n.fa-sort-amount-up-alt {\n --fa: "\\f885";\n}\n\n.fa-arrow-down-9-1 {\n --fa: "\\f886";\n}\n\n.fa-sort-numeric-desc {\n --fa: "\\f886";\n}\n\n.fa-sort-numeric-down-alt {\n --fa: "\\f886";\n}\n\n.fa-arrow-up-9-1 {\n --fa: "\\f887";\n}\n\n.fa-sort-numeric-up-alt {\n --fa: "\\f887";\n}\n\n.fa-spell-check {\n --fa: "\\f891";\n}\n\n.fa-voicemail {\n --fa: "\\f897";\n}\n\n.fa-hat-cowboy {\n --fa: "\\f8c0";\n}\n\n.fa-hat-cowboy-side {\n --fa: "\\f8c1";\n}\n\n.fa-computer-mouse {\n --fa: "\\f8cc";\n}\n\n.fa-mouse {\n --fa: "\\f8cc";\n}\n\n.fa-radio {\n --fa: "\\f8d7";\n}\n\n.fa-record-vinyl {\n --fa: "\\f8d9";\n}\n\n.fa-walkie-talkie {\n --fa: "\\f8ef";\n}\n\n.fa-caravan {\n --fa: "\\f8ff";\n}\n:root, :host {\n --fa-family-brands: 'Font Awesome 7 Brands';\n --fa-font-brands: normal 400 1em/1 var(--fa-family-brands);\n}\n\n@font-face {\n font-family: "Font Awesome 7 Brands";\n font-style: normal;\n font-weight: 400;\n font-display: block;\n src: url(${d});\n}\n.fab,\n.fa-brands,\n.fa-classic.fa-brands {\n --fa-family: var(--fa-family-brands);\n --fa-style: 400;\n}\n\n.fa-firefox-browser {\n --fa: "\\e007";\n}\n\n.fa-ideal {\n --fa: "\\e013";\n}\n\n.fa-microblog {\n --fa: "\\e01a";\n}\n\n.fa-square-pied-piper {\n --fa: "\\e01e";\n}\n\n.fa-pied-piper-square {\n --fa: "\\e01e";\n}\n\n.fa-unity {\n --fa: "\\e049";\n}\n\n.fa-dailymotion {\n --fa: "\\e052";\n}\n\n.fa-square-instagram {\n --fa: "\\e055";\n}\n\n.fa-instagram-square {\n --fa: "\\e055";\n}\n\n.fa-mixer {\n --fa: "\\e056";\n}\n\n.fa-shopify {\n --fa: "\\e057";\n}\n\n.fa-deezer {\n --fa: "\\e077";\n}\n\n.fa-edge-legacy {\n --fa: "\\e078";\n}\n\n.fa-google-pay {\n --fa: "\\e079";\n}\n\n.fa-rust {\n --fa: "\\e07a";\n}\n\n.fa-tiktok {\n --fa: "\\e07b";\n}\n\n.fa-unsplash {\n --fa: "\\e07c";\n}\n\n.fa-cloudflare {\n --fa: "\\e07d";\n}\n\n.fa-guilded {\n --fa: "\\e07e";\n}\n\n.fa-hive {\n --fa: "\\e07f";\n}\n\n.fa-42-group {\n --fa: "\\e080";\n}\n\n.fa-innosoft {\n --fa: "\\e080";\n}\n\n.fa-instalod {\n --fa: "\\e081";\n}\n\n.fa-octopus-deploy {\n --fa: "\\e082";\n}\n\n.fa-perbyte {\n --fa: "\\e083";\n}\n\n.fa-uncharted {\n --fa: "\\e084";\n}\n\n.fa-watchman-monitoring {\n --fa: "\\e087";\n}\n\n.fa-wodu {\n --fa: "\\e088";\n}\n\n.fa-wirsindhandwerk {\n --fa: "\\e2d0";\n}\n\n.fa-wsh {\n --fa: "\\e2d0";\n}\n\n.fa-bots {\n --fa: "\\e340";\n}\n\n.fa-cmplid {\n --fa: "\\e360";\n}\n\n.fa-bilibili {\n --fa: "\\e3d9";\n}\n\n.fa-golang {\n --fa: "\\e40f";\n}\n\n.fa-pix {\n --fa: "\\e43a";\n}\n\n.fa-sitrox {\n --fa: "\\e44a";\n}\n\n.fa-hashnode {\n --fa: "\\e499";\n}\n\n.fa-meta {\n --fa: "\\e49b";\n}\n\n.fa-padlet {\n --fa: "\\e4a0";\n}\n\n.fa-nfc-directional {\n --fa: "\\e530";\n}\n\n.fa-nfc-symbol {\n --fa: "\\e531";\n}\n\n.fa-screenpal {\n --fa: "\\e570";\n}\n\n.fa-space-awesome {\n --fa: "\\e5ac";\n}\n\n.fa-square-font-awesome {\n --fa: "\\e5ad";\n}\n\n.fa-square-gitlab {\n --fa: "\\e5ae";\n}\n\n.fa-gitlab-square {\n --fa: "\\e5ae";\n}\n\n.fa-odysee {\n --fa: "\\e5c6";\n}\n\n.fa-stubber {\n --fa: "\\e5c7";\n}\n\n.fa-debian {\n --fa: "\\e60b";\n}\n\n.fa-shoelace {\n --fa: "\\e60c";\n}\n\n.fa-threads {\n --fa: "\\e618";\n}\n\n.fa-square-threads {\n --fa: "\\e619";\n}\n\n.fa-square-x-twitter {\n --fa: "\\e61a";\n}\n\n.fa-x-twitter {\n --fa: "\\e61b";\n}\n\n.fa-opensuse {\n --fa: "\\e62b";\n}\n\n.fa-letterboxd {\n --fa: "\\e62d";\n}\n\n.fa-square-letterboxd {\n --fa: "\\e62e";\n}\n\n.fa-mintbit {\n --fa: "\\e62f";\n}\n\n.fa-google-scholar {\n --fa: "\\e63b";\n}\n\n.fa-brave {\n --fa: "\\e63c";\n}\n\n.fa-brave-reverse {\n --fa: "\\e63d";\n}\n\n.fa-pixiv {\n --fa: "\\e640";\n}\n\n.fa-upwork {\n --fa: "\\e641";\n}\n\n.fa-webflow {\n --fa: "\\e65c";\n}\n\n.fa-signal-messenger {\n --fa: "\\e663";\n}\n\n.fa-bluesky {\n --fa: "\\e671";\n}\n\n.fa-jxl {\n --fa: "\\e67b";\n}\n\n.fa-square-upwork {\n --fa: "\\e67c";\n}\n\n.fa-web-awesome {\n --fa: "\\e682";\n}\n\n.fa-square-web-awesome {\n --fa: "\\e683";\n}\n\n.fa-square-web-awesome-stroke {\n --fa: "\\e684";\n}\n\n.fa-dart-lang {\n --fa: "\\e693";\n}\n\n.fa-flutter {\n --fa: "\\e694";\n}\n\n.fa-files-pinwheel {\n --fa: "\\e69f";\n}\n\n.fa-css {\n --fa: "\\e6a2";\n}\n\n.fa-square-bluesky {\n --fa: "\\e6a3";\n}\n\n.fa-openai {\n --fa: "\\e7cf";\n}\n\n.fa-square-linkedin {\n --fa: "\\e7d0";\n}\n\n.fa-cash-app {\n --fa: "\\e7d4";\n}\n\n.fa-disqus {\n --fa: "\\e7d5";\n}\n\n.fa-eleventy {\n --fa: "\\e7d6";\n}\n\n.fa-11ty {\n --fa: "\\e7d6";\n}\n\n.fa-kakao-talk {\n --fa: "\\e7d7";\n}\n\n.fa-linktree {\n --fa: "\\e7d8";\n}\n\n.fa-notion {\n --fa: "\\e7d9";\n}\n\n.fa-pandora {\n --fa: "\\e7da";\n}\n\n.fa-pixelfed {\n --fa: "\\e7db";\n}\n\n.fa-tidal {\n --fa: "\\e7dc";\n}\n\n.fa-vsco {\n --fa: "\\e7dd";\n}\n\n.fa-w3c {\n --fa: "\\e7de";\n}\n\n.fa-lumon {\n --fa: "\\e7e2";\n}\n\n.fa-lumon-drop {\n --fa: "\\e7e3";\n}\n\n.fa-square-figma {\n --fa: "\\e7e4";\n}\n\n.fa-tex {\n --fa: "\\e7ff";\n}\n\n.fa-duolingo {\n --fa: "\\e812";\n}\n\n.fa-supportnow {\n --fa: "\\e833";\n}\n\n.fa-tor-browser {\n --fa: "\\e838";\n}\n\n.fa-typescript {\n --fa: "\\e840";\n}\n\n.fa-square-deskpro {\n --fa: "\\e844";\n}\n\n.fa-circle-zulip {\n --fa: "\\e851";\n}\n\n.fa-julia {\n --fa: "\\e852";\n}\n\n.fa-zulip {\n --fa: "\\e853";\n}\n\n.fa-unison {\n --fa: "\\e854";\n}\n\n.fa-board-game-geek {\n --fa: "\\e855";\n}\n\n.fa-bgg {\n --fa: "\\e855";\n}\n\n.fa-ko-fi {\n --fa: "\\e856";\n}\n\n.fa-kubernetes {\n --fa: "\\e857";\n}\n\n.fa-postgresql {\n --fa: "\\e858";\n}\n\n.fa-scaleway {\n --fa: "\\e859";\n}\n\n.fa-venmo {\n --fa: "\\e85a";\n}\n\n.fa-venmo-v {\n --fa: "\\e85b";\n}\n\n.fa-unreal-engine {\n --fa: "\\e85c";\n}\n\n.fa-globaleaks {\n --fa: "\\e85d";\n}\n\n.fa-solana {\n --fa: "\\e85e";\n}\n\n.fa-threema {\n --fa: "\\e85f";\n}\n\n.fa-forgejo {\n --fa: "\\e860";\n}\n\n.fa-claude {\n --fa: "\\e861";\n}\n\n.fa-gitee {\n --fa: "\\e863";\n}\n\n.fa-xmpp {\n --fa: "\\e864";\n}\n\n.fa-fediverse {\n --fa: "\\e865";\n}\n\n.fa-tailwind-css {\n --fa: "\\e866";\n}\n\n.fa-arch-linux {\n --fa: "\\e867";\n}\n\n.fa-svelte {\n --fa: "\\e868";\n}\n\n.fa-hugging-face {\n --fa: "\\e869";\n}\n\n.fa-leetcode {\n --fa: "\\e86a";\n}\n\n.fa-openstreetmap {\n --fa: "\\e86b";\n}\n\n.fa-ultralytics {\n --fa: "\\e86d";\n}\n\n.fa-ultralytics-hub {\n --fa: "\\e86e";\n}\n\n.fa-ultralytics-yolo {\n --fa: "\\e86f";\n}\n\n.fa-obsidian {\n --fa: "\\e879";\n}\n\n.fa-zoom {\n --fa: "\\e87b";\n}\n\n.fa-vim {\n --fa: "\\e88a";\n}\n\n.fa-symfonycasts {\n --fa: "\\e8ab";\n}\n\n.fa-build-awesome {\n --fa: "\\e8ac";\n}\n\n.fa-codeberg {\n --fa: "\\e8ad";\n}\n\n.fa-devpost {\n --fa: "\\e8ae";\n}\n\n.fa-internet-archive {\n --fa: "\\e8b1";\n}\n\n.fa-lets-encrypt {\n --fa: "\\e8b2";\n}\n\n.fa-matrix {\n --fa: "\\e8b3";\n}\n\n.fa-mattermost {\n --fa: "\\e8b4";\n}\n\n.fa-nextcloud {\n --fa: "\\e8b5";\n}\n\n.fa-roblox-creator-studio {\n --fa: "\\e8b6";\n}\n\n.fa-square-build-awesome-stroke {\n --fa: "\\e8b7";\n}\n\n.fa-substack {\n --fa: "\\e8b8";\n}\n\n.fa-tesla {\n --fa: "\\e8b9";\n}\n\n.fa-xrp {\n --fa: "\\e8ba";\n}\n\n.fa-xrpl {\n --fa: "\\e8bb";\n}\n\n.fa-youtube-shorts {\n --fa: "\\e8bc";\n}\n\n.fa-ror {\n --fa: "\\e8bd";\n}\n\n.fa-visual-studio {\n --fa: "\\e8be";\n}\n\n.fa-dolibarr {\n --fa: "\\e8bf";\n}\n\n.fa-obs-studio {\n --fa: "\\e8c0";\n}\n\n.fa-storybook {\n --fa: "\\e8c1";\n}\n\n.fa-a11y-project {\n --fa: "\\e8c2";\n}\n\n.fa-copilot {\n --fa: "\\e8c7";\n}\n\n.fa-square-twitter {\n --fa: "\\f081";\n}\n\n.fa-twitter-square {\n --fa: "\\f081";\n}\n\n.fa-square-facebook {\n --fa: "\\f082";\n}\n\n.fa-facebook-square {\n --fa: "\\f082";\n}\n\n.fa-linkedin {\n --fa: "\\f08c";\n}\n\n.fa-square-github {\n --fa: "\\f092";\n}\n\n.fa-github-square {\n --fa: "\\f092";\n}\n\n.fa-twitter {\n --fa: "\\f099";\n}\n\n.fa-facebook {\n --fa: "\\f09a";\n}\n\n.fa-github {\n --fa: "\\f09b";\n}\n\n.fa-pinterest {\n --fa: "\\f0d2";\n}\n\n.fa-square-pinterest {\n --fa: "\\f0d3";\n}\n\n.fa-pinterest-square {\n --fa: "\\f0d3";\n}\n\n.fa-square-google-plus {\n --fa: "\\f0d4";\n}\n\n.fa-google-plus-square {\n --fa: "\\f0d4";\n}\n\n.fa-google-plus-g {\n --fa: "\\f0d5";\n}\n\n.fa-linkedin-in {\n --fa: "\\f0e1";\n}\n\n.fa-github-alt {\n --fa: "\\f113";\n}\n\n.fa-maxcdn {\n --fa: "\\f136";\n}\n\n.fa-html5 {\n --fa: "\\f13b";\n}\n\n.fa-css3 {\n --fa: "\\f13c";\n}\n\n.fa-btc {\n --fa: "\\f15a";\n}\n\n.fa-youtube {\n --fa: "\\f167";\n}\n\n.fa-xing {\n --fa: "\\f168";\n}\n\n.fa-square-xing {\n --fa: "\\f169";\n}\n\n.fa-xing-square {\n --fa: "\\f169";\n}\n\n.fa-dropbox {\n --fa: "\\f16b";\n}\n\n.fa-stack-overflow {\n --fa: "\\f16c";\n}\n\n.fa-instagram {\n --fa: "\\f16d";\n}\n\n.fa-flickr {\n --fa: "\\f16e";\n}\n\n.fa-adn {\n --fa: "\\f170";\n}\n\n.fa-bitbucket {\n --fa: "\\f171";\n}\n\n.fa-tumblr {\n --fa: "\\f173";\n}\n\n.fa-square-tumblr {\n --fa: "\\f174";\n}\n\n.fa-tumblr-square {\n --fa: "\\f174";\n}\n\n.fa-apple {\n --fa: "\\f179";\n}\n\n.fa-windows {\n --fa: "\\f17a";\n}\n\n.fa-android {\n --fa: "\\f17b";\n}\n\n.fa-linux {\n --fa: "\\f17c";\n}\n\n.fa-dribbble {\n --fa: "\\f17d";\n}\n\n.fa-skype {\n --fa: "\\f17e";\n}\n\n.fa-foursquare {\n --fa: "\\f180";\n}\n\n.fa-trello {\n --fa: "\\f181";\n}\n\n.fa-gratipay {\n --fa: "\\f184";\n}\n\n.fa-vk {\n --fa: "\\f189";\n}\n\n.fa-weibo {\n --fa: "\\f18a";\n}\n\n.fa-renren {\n --fa: "\\f18b";\n}\n\n.fa-pagelines {\n --fa: "\\f18c";\n}\n\n.fa-stack-exchange {\n --fa: "\\f18d";\n}\n\n.fa-square-vimeo {\n --fa: "\\f194";\n}\n\n.fa-vimeo-square {\n --fa: "\\f194";\n}\n\n.fa-slack {\n --fa: "\\f198";\n}\n\n.fa-slack-hash {\n --fa: "\\f198";\n}\n\n.fa-wordpress {\n --fa: "\\f19a";\n}\n\n.fa-openid {\n --fa: "\\f19b";\n}\n\n.fa-yahoo {\n --fa: "\\f19e";\n}\n\n.fa-google {\n --fa: "\\f1a0";\n}\n\n.fa-reddit {\n --fa: "\\f1a1";\n}\n\n.fa-square-reddit {\n --fa: "\\f1a2";\n}\n\n.fa-reddit-square {\n --fa: "\\f1a2";\n}\n\n.fa-stumbleupon-circle {\n --fa: "\\f1a3";\n}\n\n.fa-stumbleupon {\n --fa: "\\f1a4";\n}\n\n.fa-delicious {\n --fa: "\\f1a5";\n}\n\n.fa-digg {\n --fa: "\\f1a6";\n}\n\n.fa-pied-piper-pp {\n --fa: "\\f1a7";\n}\n\n.fa-pied-piper-alt {\n --fa: "\\f1a8";\n}\n\n.fa-drupal {\n --fa: "\\f1a9";\n}\n\n.fa-joomla {\n --fa: "\\f1aa";\n}\n\n.fa-behance {\n --fa: "\\f1b4";\n}\n\n.fa-square-behance {\n --fa: "\\f1b5";\n}\n\n.fa-behance-square {\n --fa: "\\f1b5";\n}\n\n.fa-steam {\n --fa: "\\f1b6";\n}\n\n.fa-square-steam {\n --fa: "\\f1b7";\n}\n\n.fa-steam-square {\n --fa: "\\f1b7";\n}\n\n.fa-spotify {\n --fa: "\\f1bc";\n}\n\n.fa-deviantart {\n --fa: "\\f1bd";\n}\n\n.fa-soundcloud {\n --fa: "\\f1be";\n}\n\n.fa-vine {\n --fa: "\\f1ca";\n}\n\n.fa-codepen {\n --fa: "\\f1cb";\n}\n\n.fa-jsfiddle {\n --fa: "\\f1cc";\n}\n\n.fa-rebel {\n --fa: "\\f1d0";\n}\n\n.fa-empire {\n --fa: "\\f1d1";\n}\n\n.fa-square-git {\n --fa: "\\f1d2";\n}\n\n.fa-git-square {\n --fa: "\\f1d2";\n}\n\n.fa-git {\n --fa: "\\f1d3";\n}\n\n.fa-hacker-news {\n --fa: "\\f1d4";\n}\n\n.fa-tencent-weibo {\n --fa: "\\f1d5";\n}\n\n.fa-qq {\n --fa: "\\f1d6";\n}\n\n.fa-weixin {\n --fa: "\\f1d7";\n}\n\n.fa-slideshare {\n --fa: "\\f1e7";\n}\n\n.fa-twitch {\n --fa: "\\f1e8";\n}\n\n.fa-yelp {\n --fa: "\\f1e9";\n}\n\n.fa-paypal {\n --fa: "\\f1ed";\n}\n\n.fa-google-wallet {\n --fa: "\\f1ee";\n}\n\n.fa-cc-visa {\n --fa: "\\f1f0";\n}\n\n.fa-cc-mastercard {\n --fa: "\\f1f1";\n}\n\n.fa-cc-discover {\n --fa: "\\f1f2";\n}\n\n.fa-cc-amex {\n --fa: "\\f1f3";\n}\n\n.fa-cc-paypal {\n --fa: "\\f1f4";\n}\n\n.fa-cc-stripe {\n --fa: "\\f1f5";\n}\n\n.fa-lastfm {\n --fa: "\\f202";\n}\n\n.fa-square-lastfm {\n --fa: "\\f203";\n}\n\n.fa-lastfm-square {\n --fa: "\\f203";\n}\n\n.fa-ioxhost {\n --fa: "\\f208";\n}\n\n.fa-angellist {\n --fa: "\\f209";\n}\n\n.fa-buysellads {\n --fa: "\\f20d";\n}\n\n.fa-connectdevelop {\n --fa: "\\f20e";\n}\n\n.fa-dashcube {\n --fa: "\\f210";\n}\n\n.fa-forumbee {\n --fa: "\\f211";\n}\n\n.fa-leanpub {\n --fa: "\\f212";\n}\n\n.fa-sellsy {\n --fa: "\\f213";\n}\n\n.fa-shirtsinbulk {\n --fa: "\\f214";\n}\n\n.fa-simplybuilt {\n --fa: "\\f215";\n}\n\n.fa-skyatlas {\n --fa: "\\f216";\n}\n\n.fa-pinterest-p {\n --fa: "\\f231";\n}\n\n.fa-whatsapp {\n --fa: "\\f232";\n}\n\n.fa-viacoin {\n --fa: "\\f237";\n}\n\n.fa-medium {\n --fa: "\\f23a";\n}\n\n.fa-medium-m {\n --fa: "\\f23a";\n}\n\n.fa-y-combinator {\n --fa: "\\f23b";\n}\n\n.fa-optin-monster {\n --fa: "\\f23c";\n}\n\n.fa-opencart {\n --fa: "\\f23d";\n}\n\n.fa-expeditedssl {\n --fa: "\\f23e";\n}\n\n.fa-cc-jcb {\n --fa: "\\f24b";\n}\n\n.fa-cc-diners-club {\n --fa: "\\f24c";\n}\n\n.fa-creative-commons {\n --fa: "\\f25e";\n}\n\n.fa-gg {\n --fa: "\\f260";\n}\n\n.fa-gg-circle {\n --fa: "\\f261";\n}\n\n.fa-odnoklassniki {\n --fa: "\\f263";\n}\n\n.fa-square-odnoklassniki {\n --fa: "\\f264";\n}\n\n.fa-odnoklassniki-square {\n --fa: "\\f264";\n}\n\n.fa-get-pocket {\n --fa: "\\f265";\n}\n\n.fa-wikipedia-w {\n --fa: "\\f266";\n}\n\n.fa-safari {\n --fa: "\\f267";\n}\n\n.fa-chrome {\n --fa: "\\f268";\n}\n\n.fa-firefox {\n --fa: "\\f269";\n}\n\n.fa-opera {\n --fa: "\\f26a";\n}\n\n.fa-internet-explorer {\n --fa: "\\f26b";\n}\n\n.fa-contao {\n --fa: "\\f26d";\n}\n\n.fa-500px {\n --fa: "\\f26e";\n}\n\n.fa-amazon {\n --fa: "\\f270";\n}\n\n.fa-houzz {\n --fa: "\\f27c";\n}\n\n.fa-vimeo-v {\n --fa: "\\f27d";\n}\n\n.fa-black-tie {\n --fa: "\\f27e";\n}\n\n.fa-fonticons {\n --fa: "\\f280";\n}\n\n.fa-reddit-alien {\n --fa: "\\f281";\n}\n\n.fa-edge {\n --fa: "\\f282";\n}\n\n.fa-codiepie {\n --fa: "\\f284";\n}\n\n.fa-modx {\n --fa: "\\f285";\n}\n\n.fa-fort-awesome {\n --fa: "\\f286";\n}\n\n.fa-usb {\n --fa: "\\f287";\n}\n\n.fa-product-hunt {\n --fa: "\\f288";\n}\n\n.fa-mixcloud {\n --fa: "\\f289";\n}\n\n.fa-scribd {\n --fa: "\\f28a";\n}\n\n.fa-bluetooth {\n --fa: "\\f293";\n}\n\n.fa-bluetooth-b {\n --fa: "\\f294";\n}\n\n.fa-gitlab {\n --fa: "\\f296";\n}\n\n.fa-wpbeginner {\n --fa: "\\f297";\n}\n\n.fa-wpforms {\n --fa: "\\f298";\n}\n\n.fa-envira {\n --fa: "\\f299";\n}\n\n.fa-glide {\n --fa: "\\f2a5";\n}\n\n.fa-glide-g {\n --fa: "\\f2a6";\n}\n\n.fa-viadeo {\n --fa: "\\f2a9";\n}\n\n.fa-square-viadeo {\n --fa: "\\f2aa";\n}\n\n.fa-viadeo-square {\n --fa: "\\f2aa";\n}\n\n.fa-snapchat {\n --fa: "\\f2ab";\n}\n\n.fa-snapchat-ghost {\n --fa: "\\f2ab";\n}\n\n.fa-square-snapchat {\n --fa: "\\f2ad";\n}\n\n.fa-snapchat-square {\n --fa: "\\f2ad";\n}\n\n.fa-pied-piper {\n --fa: "\\f2ae";\n}\n\n.fa-first-order {\n --fa: "\\f2b0";\n}\n\n.fa-yoast {\n --fa: "\\f2b1";\n}\n\n.fa-themeisle {\n --fa: "\\f2b2";\n}\n\n.fa-google-plus {\n --fa: "\\f2b3";\n}\n\n.fa-font-awesome {\n --fa: "\\f2b4";\n}\n\n.fa-font-awesome-flag {\n --fa: "\\f2b4";\n}\n\n.fa-font-awesome-logo-full {\n --fa: "\\f2b4";\n}\n\n.fa-linode {\n --fa: "\\f2b8";\n}\n\n.fa-quora {\n --fa: "\\f2c4";\n}\n\n.fa-free-code-camp {\n --fa: "\\f2c5";\n}\n\n.fa-telegram {\n --fa: "\\f2c6";\n}\n\n.fa-telegram-plane {\n --fa: "\\f2c6";\n}\n\n.fa-bandcamp {\n --fa: "\\f2d5";\n}\n\n.fa-grav {\n --fa: "\\f2d6";\n}\n\n.fa-etsy {\n --fa: "\\f2d7";\n}\n\n.fa-imdb {\n --fa: "\\f2d8";\n}\n\n.fa-ravelry {\n --fa: "\\f2d9";\n}\n\n.fa-sellcast {\n --fa: "\\f2da";\n}\n\n.fa-superpowers {\n --fa: "\\f2dd";\n}\n\n.fa-wpexplorer {\n --fa: "\\f2de";\n}\n\n.fa-meetup {\n --fa: "\\f2e0";\n}\n\n.fa-square-font-awesome-stroke {\n --fa: "\\f35c";\n}\n\n.fa-font-awesome-alt {\n --fa: "\\f35c";\n}\n\n.fa-accessible-icon {\n --fa: "\\f368";\n}\n\n.fa-accusoft {\n --fa: "\\f369";\n}\n\n.fa-adversal {\n --fa: "\\f36a";\n}\n\n.fa-affiliatetheme {\n --fa: "\\f36b";\n}\n\n.fa-algolia {\n --fa: "\\f36c";\n}\n\n.fa-amilia {\n --fa: "\\f36d";\n}\n\n.fa-angrycreative {\n --fa: "\\f36e";\n}\n\n.fa-app-store {\n --fa: "\\f36f";\n}\n\n.fa-app-store-ios {\n --fa: "\\f370";\n}\n\n.fa-apper {\n --fa: "\\f371";\n}\n\n.fa-asymmetrik {\n --fa: "\\f372";\n}\n\n.fa-audible {\n --fa: "\\f373";\n}\n\n.fa-avianex {\n --fa: "\\f374";\n}\n\n.fa-aws {\n --fa: "\\f375";\n}\n\n.fa-bimobject {\n --fa: "\\f378";\n}\n\n.fa-bitcoin {\n --fa: "\\f379";\n}\n\n.fa-bity {\n --fa: "\\f37a";\n}\n\n.fa-blackberry {\n --fa: "\\f37b";\n}\n\n.fa-blogger {\n --fa: "\\f37c";\n}\n\n.fa-blogger-b {\n --fa: "\\f37d";\n}\n\n.fa-buromobelexperte {\n --fa: "\\f37f";\n}\n\n.fa-centercode {\n --fa: "\\f380";\n}\n\n.fa-cloudscale {\n --fa: "\\f383";\n}\n\n.fa-cloudsmith {\n --fa: "\\f384";\n}\n\n.fa-cloudversify {\n --fa: "\\f385";\n}\n\n.fa-cpanel {\n --fa: "\\f388";\n}\n\n.fa-css3-alt {\n --fa: "\\f38b";\n}\n\n.fa-cuttlefish {\n --fa: "\\f38c";\n}\n\n.fa-d-and-d {\n --fa: "\\f38d";\n}\n\n.fa-deploydog {\n --fa: "\\f38e";\n}\n\n.fa-deskpro {\n --fa: "\\f38f";\n}\n\n.fa-digital-ocean {\n --fa: "\\f391";\n}\n\n.fa-discord {\n --fa: "\\f392";\n}\n\n.fa-discourse {\n --fa: "\\f393";\n}\n\n.fa-dochub {\n --fa: "\\f394";\n}\n\n.fa-docker {\n --fa: "\\f395";\n}\n\n.fa-draft2digital {\n --fa: "\\f396";\n}\n\n.fa-square-dribbble {\n --fa: "\\f397";\n}\n\n.fa-dribbble-square {\n --fa: "\\f397";\n}\n\n.fa-dyalog {\n --fa: "\\f399";\n}\n\n.fa-earlybirds {\n --fa: "\\f39a";\n}\n\n.fa-erlang {\n --fa: "\\f39d";\n}\n\n.fa-facebook-f {\n --fa: "\\f39e";\n}\n\n.fa-facebook-messenger {\n --fa: "\\f39f";\n}\n\n.fa-firstdraft {\n --fa: "\\f3a1";\n}\n\n.fa-fonticons-fi {\n --fa: "\\f3a2";\n}\n\n.fa-fort-awesome-alt {\n --fa: "\\f3a3";\n}\n\n.fa-freebsd {\n --fa: "\\f3a4";\n}\n\n.fa-gitkraken {\n --fa: "\\f3a6";\n}\n\n.fa-gofore {\n --fa: "\\f3a7";\n}\n\n.fa-goodreads {\n --fa: "\\f3a8";\n}\n\n.fa-goodreads-g {\n --fa: "\\f3a9";\n}\n\n.fa-google-drive {\n --fa: "\\f3aa";\n}\n\n.fa-google-play {\n --fa: "\\f3ab";\n}\n\n.fa-gripfire {\n --fa: "\\f3ac";\n}\n\n.fa-grunt {\n --fa: "\\f3ad";\n}\n\n.fa-gulp {\n --fa: "\\f3ae";\n}\n\n.fa-square-hacker-news {\n --fa: "\\f3af";\n}\n\n.fa-hacker-news-square {\n --fa: "\\f3af";\n}\n\n.fa-hire-a-helper {\n --fa: "\\f3b0";\n}\n\n.fa-hotjar {\n --fa: "\\f3b1";\n}\n\n.fa-hubspot {\n --fa: "\\f3b2";\n}\n\n.fa-itunes {\n --fa: "\\f3b4";\n}\n\n.fa-itunes-note {\n --fa: "\\f3b5";\n}\n\n.fa-jenkins {\n --fa: "\\f3b6";\n}\n\n.fa-joget {\n --fa: "\\f3b7";\n}\n\n.fa-js {\n --fa: "\\f3b8";\n}\n\n.fa-square-js {\n --fa: "\\f3b9";\n}\n\n.fa-js-square {\n --fa: "\\f3b9";\n}\n\n.fa-keycdn {\n --fa: "\\f3ba";\n}\n\n.fa-kickstarter {\n --fa: "\\f3bb";\n}\n\n.fa-square-kickstarter {\n --fa: "\\f3bb";\n}\n\n.fa-kickstarter-k {\n --fa: "\\f3bc";\n}\n\n.fa-laravel {\n --fa: "\\f3bd";\n}\n\n.fa-line {\n --fa: "\\f3c0";\n}\n\n.fa-lyft {\n --fa: "\\f3c3";\n}\n\n.fa-magento {\n --fa: "\\f3c4";\n}\n\n.fa-medapps {\n --fa: "\\f3c6";\n}\n\n.fa-medrt {\n --fa: "\\f3c8";\n}\n\n.fa-microsoft {\n --fa: "\\f3ca";\n}\n\n.fa-mix {\n --fa: "\\f3cb";\n}\n\n.fa-mizuni {\n --fa: "\\f3cc";\n}\n\n.fa-monero {\n --fa: "\\f3d0";\n}\n\n.fa-napster {\n --fa: "\\f3d2";\n}\n\n.fa-node-js {\n --fa: "\\f3d3";\n}\n\n.fa-npm {\n --fa: "\\f3d4";\n}\n\n.fa-ns8 {\n --fa: "\\f3d5";\n}\n\n.fa-nutritionix {\n --fa: "\\f3d6";\n}\n\n.fa-page4 {\n --fa: "\\f3d7";\n}\n\n.fa-palfed {\n --fa: "\\f3d8";\n}\n\n.fa-patreon {\n --fa: "\\f3d9";\n}\n\n.fa-periscope {\n --fa: "\\f3da";\n}\n\n.fa-phabricator {\n --fa: "\\f3db";\n}\n\n.fa-phoenix-framework {\n --fa: "\\f3dc";\n}\n\n.fa-playstation {\n --fa: "\\f3df";\n}\n\n.fa-pushed {\n --fa: "\\f3e1";\n}\n\n.fa-python {\n --fa: "\\f3e2";\n}\n\n.fa-red-river {\n --fa: "\\f3e3";\n}\n\n.fa-wpressr {\n --fa: "\\f3e4";\n}\n\n.fa-rendact {\n --fa: "\\f3e4";\n}\n\n.fa-replyd {\n --fa: "\\f3e6";\n}\n\n.fa-resolving {\n --fa: "\\f3e7";\n}\n\n.fa-rocketchat {\n --fa: "\\f3e8";\n}\n\n.fa-rockrms {\n --fa: "\\f3e9";\n}\n\n.fa-schlix {\n --fa: "\\f3ea";\n}\n\n.fa-searchengin {\n --fa: "\\f3eb";\n}\n\n.fa-servicestack {\n --fa: "\\f3ec";\n}\n\n.fa-sistrix {\n --fa: "\\f3ee";\n}\n\n.fa-speakap {\n --fa: "\\f3f3";\n}\n\n.fa-staylinked {\n --fa: "\\f3f5";\n}\n\n.fa-steam-symbol {\n --fa: "\\f3f6";\n}\n\n.fa-sticker-mule {\n --fa: "\\f3f7";\n}\n\n.fa-studiovinari {\n --fa: "\\f3f8";\n}\n\n.fa-supple {\n --fa: "\\f3f9";\n}\n\n.fa-uber {\n --fa: "\\f402";\n}\n\n.fa-uikit {\n --fa: "\\f403";\n}\n\n.fa-uniregistry {\n --fa: "\\f404";\n}\n\n.fa-untappd {\n --fa: "\\f405";\n}\n\n.fa-ussunnah {\n --fa: "\\f407";\n}\n\n.fa-vaadin {\n --fa: "\\f408";\n}\n\n.fa-viber {\n --fa: "\\f409";\n}\n\n.fa-vimeo {\n --fa: "\\f40a";\n}\n\n.fa-vnv {\n --fa: "\\f40b";\n}\n\n.fa-square-whatsapp {\n --fa: "\\f40c";\n}\n\n.fa-whatsapp-square {\n --fa: "\\f40c";\n}\n\n.fa-whmcs {\n --fa: "\\f40d";\n}\n\n.fa-wordpress-simple {\n --fa: "\\f411";\n}\n\n.fa-xbox {\n --fa: "\\f412";\n}\n\n.fa-yandex {\n --fa: "\\f413";\n}\n\n.fa-yandex-international {\n --fa: "\\f414";\n}\n\n.fa-apple-pay {\n --fa: "\\f415";\n}\n\n.fa-cc-apple-pay {\n --fa: "\\f416";\n}\n\n.fa-fly {\n --fa: "\\f417";\n}\n\n.fa-node {\n --fa: "\\f419";\n}\n\n.fa-osi {\n --fa: "\\f41a";\n}\n\n.fa-react {\n --fa: "\\f41b";\n}\n\n.fa-autoprefixer {\n --fa: "\\f41c";\n}\n\n.fa-less {\n --fa: "\\f41d";\n}\n\n.fa-sass {\n --fa: "\\f41e";\n}\n\n.fa-vuejs {\n --fa: "\\f41f";\n}\n\n.fa-angular {\n --fa: "\\f420";\n}\n\n.fa-aviato {\n --fa: "\\f421";\n}\n\n.fa-ember {\n --fa: "\\f423";\n}\n\n.fa-gitter {\n --fa: "\\f426";\n}\n\n.fa-hooli {\n --fa: "\\f427";\n}\n\n.fa-strava {\n --fa: "\\f428";\n}\n\n.fa-stripe {\n --fa: "\\f429";\n}\n\n.fa-stripe-s {\n --fa: "\\f42a";\n}\n\n.fa-typo3 {\n --fa: "\\f42b";\n}\n\n.fa-amazon-pay {\n --fa: "\\f42c";\n}\n\n.fa-cc-amazon-pay {\n --fa: "\\f42d";\n}\n\n.fa-ethereum {\n --fa: "\\f42e";\n}\n\n.fa-korvue {\n --fa: "\\f42f";\n}\n\n.fa-elementor {\n --fa: "\\f430";\n}\n\n.fa-square-youtube {\n --fa: "\\f431";\n}\n\n.fa-youtube-square {\n --fa: "\\f431";\n}\n\n.fa-flipboard {\n --fa: "\\f44d";\n}\n\n.fa-hips {\n --fa: "\\f452";\n}\n\n.fa-php {\n --fa: "\\f457";\n}\n\n.fa-quinscape {\n --fa: "\\f459";\n}\n\n.fa-readme {\n --fa: "\\f4d5";\n}\n\n.fa-java {\n --fa: "\\f4e4";\n}\n\n.fa-pied-piper-hat {\n --fa: "\\f4e5";\n}\n\n.fa-creative-commons-by {\n --fa: "\\f4e7";\n}\n\n.fa-creative-commons-nc {\n --fa: "\\f4e8";\n}\n\n.fa-creative-commons-nc-eu {\n --fa: "\\f4e9";\n}\n\n.fa-creative-commons-nc-jp {\n --fa: "\\f4ea";\n}\n\n.fa-creative-commons-nd {\n --fa: "\\f4eb";\n}\n\n.fa-creative-commons-pd {\n --fa: "\\f4ec";\n}\n\n.fa-creative-commons-pd-alt {\n --fa: "\\f4ed";\n}\n\n.fa-creative-commons-remix {\n --fa: "\\f4ee";\n}\n\n.fa-creative-commons-sa {\n --fa: "\\f4ef";\n}\n\n.fa-creative-commons-sampling {\n --fa: "\\f4f0";\n}\n\n.fa-creative-commons-sampling-plus {\n --fa: "\\f4f1";\n}\n\n.fa-creative-commons-share {\n --fa: "\\f4f2";\n}\n\n.fa-creative-commons-zero {\n --fa: "\\f4f3";\n}\n\n.fa-ebay {\n --fa: "\\f4f4";\n}\n\n.fa-keybase {\n --fa: "\\f4f5";\n}\n\n.fa-mastodon {\n --fa: "\\f4f6";\n}\n\n.fa-r-project {\n --fa: "\\f4f7";\n}\n\n.fa-researchgate {\n --fa: "\\f4f8";\n}\n\n.fa-teamspeak {\n --fa: "\\f4f9";\n}\n\n.fa-first-order-alt {\n --fa: "\\f50a";\n}\n\n.fa-fulcrum {\n --fa: "\\f50b";\n}\n\n.fa-galactic-republic {\n --fa: "\\f50c";\n}\n\n.fa-galactic-senate {\n --fa: "\\f50d";\n}\n\n.fa-jedi-order {\n --fa: "\\f50e";\n}\n\n.fa-mandalorian {\n --fa: "\\f50f";\n}\n\n.fa-old-republic {\n --fa: "\\f510";\n}\n\n.fa-phoenix-squadron {\n --fa: "\\f511";\n}\n\n.fa-sith {\n --fa: "\\f512";\n}\n\n.fa-trade-federation {\n --fa: "\\f513";\n}\n\n.fa-wolf-pack-battalion {\n --fa: "\\f514";\n}\n\n.fa-hornbill {\n --fa: "\\f592";\n}\n\n.fa-mailchimp {\n --fa: "\\f59e";\n}\n\n.fa-megaport {\n --fa: "\\f5a3";\n}\n\n.fa-nimblr {\n --fa: "\\f5a8";\n}\n\n.fa-rev {\n --fa: "\\f5b2";\n}\n\n.fa-shopware {\n --fa: "\\f5b5";\n}\n\n.fa-squarespace {\n --fa: "\\f5be";\n}\n\n.fa-themeco {\n --fa: "\\f5c6";\n}\n\n.fa-weebly {\n --fa: "\\f5cc";\n}\n\n.fa-wix {\n --fa: "\\f5cf";\n}\n\n.fa-ello {\n --fa: "\\f5f1";\n}\n\n.fa-hackerrank {\n --fa: "\\f5f7";\n}\n\n.fa-kaggle {\n --fa: "\\f5fa";\n}\n\n.fa-markdown {\n --fa: "\\f60f";\n}\n\n.fa-neos {\n --fa: "\\f612";\n}\n\n.fa-zhihu {\n --fa: "\\f63f";\n}\n\n.fa-alipay {\n --fa: "\\f642";\n}\n\n.fa-the-red-yeti {\n --fa: "\\f69d";\n}\n\n.fa-critical-role {\n --fa: "\\f6c9";\n}\n\n.fa-d-and-d-beyond {\n --fa: "\\f6ca";\n}\n\n.fa-dev {\n --fa: "\\f6cc";\n}\n\n.fa-fantasy-flight-games {\n --fa: "\\f6dc";\n}\n\n.fa-wizards-of-the-coast {\n --fa: "\\f730";\n}\n\n.fa-think-peaks {\n --fa: "\\f731";\n}\n\n.fa-reacteurope {\n --fa: "\\f75d";\n}\n\n.fa-artstation {\n --fa: "\\f77a";\n}\n\n.fa-atlassian {\n --fa: "\\f77b";\n}\n\n.fa-canadian-maple-leaf {\n --fa: "\\f785";\n}\n\n.fa-centos {\n --fa: "\\f789";\n}\n\n.fa-confluence {\n --fa: "\\f78d";\n}\n\n.fa-dhl {\n --fa: "\\f790";\n}\n\n.fa-diaspora {\n --fa: "\\f791";\n}\n\n.fa-fedex {\n --fa: "\\f797";\n}\n\n.fa-fedora {\n --fa: "\\f798";\n}\n\n.fa-figma {\n --fa: "\\f799";\n}\n\n.fa-intercom {\n --fa: "\\f7af";\n}\n\n.fa-invision {\n --fa: "\\f7b0";\n}\n\n.fa-jira {\n --fa: "\\f7b1";\n}\n\n.fa-mendeley {\n --fa: "\\f7b3";\n}\n\n.fa-raspberry-pi {\n --fa: "\\f7bb";\n}\n\n.fa-redhat {\n --fa: "\\f7bc";\n}\n\n.fa-sketch {\n --fa: "\\f7c6";\n}\n\n.fa-sourcetree {\n --fa: "\\f7d3";\n}\n\n.fa-suse {\n --fa: "\\f7d6";\n}\n\n.fa-ubuntu {\n --fa: "\\f7df";\n}\n\n.fa-ups {\n --fa: "\\f7e0";\n}\n\n.fa-usps {\n --fa: "\\f7e1";\n}\n\n.fa-yarn {\n --fa: "\\f7e3";\n}\n\n.fa-airbnb {\n --fa: "\\f834";\n}\n\n.fa-battle-net {\n --fa: "\\f835";\n}\n\n.fa-bootstrap {\n --fa: "\\f836";\n}\n\n.fa-buffer {\n --fa: "\\f837";\n}\n\n.fa-chromecast {\n --fa: "\\f838";\n}\n\n.fa-evernote {\n --fa: "\\f839";\n}\n\n.fa-itch-io {\n --fa: "\\f83a";\n}\n\n.fa-salesforce {\n --fa: "\\f83b";\n}\n\n.fa-speaker-deck {\n --fa: "\\f83c";\n}\n\n.fa-symfony {\n --fa: "\\f83d";\n}\n\n.fa-waze {\n --fa: "\\f83f";\n}\n\n.fa-yammer {\n --fa: "\\f840";\n}\n\n.fa-git-alt {\n --fa: "\\f841";\n}\n\n.fa-stackpath {\n --fa: "\\f842";\n}\n\n.fa-cotton-bureau {\n --fa: "\\f89e";\n}\n\n.fa-buy-n-large {\n --fa: "\\f8a6";\n}\n\n.fa-mdb {\n --fa: "\\f8ca";\n}\n\n.fa-orcid {\n --fa: "\\f8d2";\n}\n\n.fa-swift {\n --fa: "\\f8e1";\n}\n\n.fa-umbraco {\n --fa: "\\f8e8";\n}:root, :host {\n --fa-family-classic: 'Font Awesome 7 Free';\n --fa-font-regular: normal 400 1em/1 var(--fa-family-classic);\n /* deprecated: this older custom property will be removed next major release */\n --fa-style-family-classic: var(--fa-family-classic);\n}\n\n@font-face {\n font-family: "Font Awesome 7 Free";\n font-style: normal;\n font-weight: 400;\n font-display: block;\n src: url(${m});\n}\n.far {\n --fa-family: var(--fa-family-classic);\n --fa-style: 400;\n}\n\n.fa-classic {\n --fa-family: var(--fa-family-classic);\n}\n\n.fa-regular {\n --fa-style: 400;\n}:root, :host {\n --fa-family-classic: 'Font Awesome 7 Free';\n --fa-font-solid: normal 900 1em/1 var(--fa-family-classic);\n /* deprecated: this older custom property will be removed next major release */\n --fa-style-family-classic: var(--fa-family-classic);\n}\n\n@font-face {\n font-family: "Font Awesome 7 Free";\n font-style: normal;\n font-weight: 900;\n font-display: block;\n src: url(${u});\n}\n.fas {\n --fa-family: var(--fa-family-classic);\n --fa-style: 900;\n}\n\n.fa-classic {\n --fa-family: var(--fa-family-classic);\n}\n\n.fa-solid {\n --fa-style: 900;\n}@font-face {\n font-family: "Font Awesome 5 Brands";\n font-display: block;\n font-weight: 400;\n src: url(${d}) format("woff2");\n}\n@font-face {\n font-family: "Font Awesome 5 Free";\n font-display: block;\n font-weight: 900;\n src: url(${u}) format("woff2");\n}\n@font-face {\n font-family: "Font Awesome 5 Free";\n font-display: block;\n font-weight: 400;\n src: url(${m}) format("woff2");\n}@font-face {\n font-family: "FontAwesome";\n font-display: block;\n src: url(${u}) format("woff2");\n}\n@font-face {\n font-family: "FontAwesome";\n font-display: block;\n src: url(${d}) format("woff2");\n}\n@font-face {\n font-family: "FontAwesome";\n font-display: block;\n src: url(${m}) format("woff2");\n unicode-range: U+F003, U+F006, U+F014, U+F016-F017, U+F01A-F01B, U+F01D, U+F022, U+F03E, U+F044, U+F046, U+F05C-F05D, U+F06E, U+F070, U+F087-F088, U+F08A, U+F094, U+F096-F097, U+F09D, U+F0A0, U+F0A2, U+F0A4-F0A7, U+F0C5, U+F0C7, U+F0E5-F0E6, U+F0EB, U+F0F6-F0F8, U+F10C, U+F114-F115, U+F118-F11A, U+F11C-F11D, U+F133, U+F147, U+F14E, U+F150-F152, U+F185-F186, U+F18E, U+F190-F192, U+F196, U+F1C1-F1C9, U+F1D9, U+F1DB, U+F1E3, U+F1EA, U+F1F7, U+F1F9, U+F20A, U+F247-F248, U+F24A, U+F24D, U+F255-F25B, U+F25D, U+F271-F274, U+F278, U+F27B, U+F28C, U+F28E, U+F29C, U+F2B5, U+F2B7, U+F2BA, U+F2BC, U+F2BE, U+F2C0-F2C1, U+F2C3, U+F2D0, U+F2D2, U+F2D4, U+F2DC;\n}\n@font-face {\n font-family: "FontAwesome";\n font-display: block;\n src: url(${b}) format("woff2");\n unicode-range: U+F041, U+F047, U+F065-F066, U+F07D-F07E, U+F080, U+F08B, U+F08E, U+F090, U+F09A, U+F0AC, U+F0AE, U+F0B2, U+F0D0, U+F0D6, U+F0E4, U+F0EC, U+F10A-F10B, U+F123, U+F13E, U+F148-F149, U+F14C, U+F156, U+F15E, U+F160-F161, U+F163, U+F175-F178, U+F195, U+F1F8, U+F219, U+F27A;\n}`,"",{version:3,sources:["webpack://./node_modules/.pnpm/@fortawesome+fontawesome-free@7.3.1/node_modules/@fortawesome/fontawesome-free/css/all.css"],names:[],mappings:"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D;EACzD;EACA;IACE,UAAU;IACV,mBAAmB;EACrB;AACF;AACA;EACE;IACE,yCAAyC;IACzC,mBAAmB;IACnB,uDAAuD;EACzD;EACA;IACE,qDAAqD;IACrD,iDAAiD;IACjD,uDAAuD;EACzD;EACA;IACE,UAAU;IACV,iDAAiD;IACjD,uDAAuD;EACzD;EACA;IACE,qDAAqD;IACrD,iDAAiD;IACjD,uDAAuD;EACzD;EACA;IACE,yCAAyC;IACzC,mBAAmB;EACrB;AACF;AACA;EACE;IACE,kHAAkH;IAClH,uDAAuD;EACzD;EACA;IACE,wJAAwJ;IACxJ,4DAA4D;EAC9D;EACA;IACE,uJAAuJ;IACvJ,iCAAiC;EACnC;EACA;IACE,uJAAuJ;IACvJ,4DAA4D;EAC9D;EACA;IACE,kLAAkL;IAClL,yDAAyD;EAC3D;EACA;IACE,2IAA2I;EAC7I;AACF;AACA;EACE;IACE,kHAAkH;IAClH,uDAAuD;EACzD;EACA;IACE,wJAAwJ;IACxJ,4DAA4D;EAC9D;EACA;IACE,uJAAuJ;IACvJ,4DAA4D;EAC9D;EACA;IACE,kLAAkL;IAClL,yDAAyD;EAC3D;EACA;IACE,2IAA2I;EAC7I;AACF;AACA;EACE;IACE,uBAAuB;IACvB,uDAAuD;EACzD;EACA;IACE,wCAAwC;IACxC,uDAAuD;EACzD;EACA;IACE,0CAA0C;IAC1C,uDAAuD;EACzD;EACA;IACE,wCAAwC;IACxC,uDAAuD;EACzD;EACA;IACE,wBAAwB;IACxB,uDAAuD;EACzD;EACA;IACE,uBAAuB;IACvB,uDAAuD;EACzD;EACA;IACE,wBAAwB;IACxB,uDAAuD;EACzD;EACA;IACE,uBAAuB;IACvB,uDAAuD;EACzD;EACA;IACE,uBAAuB;EACzB;AACF;AACA;EACE;IACE,uBAAuB;EACzB;EACA;IACE,yBAAyB;EAC3B;AACF;AACA;EACE;IACE,uBAAuB;IACvB,qDAAqD;EACvD;EACA;IACE,wBAAwB;IACxB,qDAAqD;EACvD;EACA;IACE,wBAAwB;IACxB,qDAAqD;EACvD;EACA;IACE,yBAAyB;IACzB,qDAAqD;EACvD;EACA;IACE,yBAAyB;IACzB,qDAAqD;EACvD;EACA;IACE,yBAAyB;IACzB,qDAAqD;EACvD;EACA;IACE,yBAAyB;IACzB,qDAAqD;EACvD;EACA;IACE,yBAAyB;IACzB,qDAAqD;EACvD;EACA;IACE,yBAAyB;IACzB,qDAAqD;EACvD;EACA;IACE,yBAAyB;IACzB,qDAAqD;EACvD;EACA;IACE,yBAAyB;IACzB,qDAAqD;EACvD;EACA;IACE,yBAAyB;IACzB,qDAAqD;EACvD;EACA;IACE,yBAAyB;EAC3B;AACF;AACA;EACE;IACE,uBAAuB;IACvB,qDAAqD;EACvD;EACA;IACE,wBAAwB;IACxB,qDAAqD;EACvD;EACA;IACE,wBAAwB;IACxB,qDAAqD;EACvD;EACA;IACE,yBAAyB;IACzB,qDAAqD;EACvD;EACA;IACE,yBAAyB;IACzB,qDAAqD;EACvD;EACA;IACE,yBAAyB;IACzB,qDAAqD;EACvD;EACA;IACE,yBAAyB;IACzB,qDAAqD;EACvD;EACA;IACE,yBAAyB;IACzB,qDAAqD;EACvD;EACA;IACE,yBAAyB;EAC3B;AACF;AACA;EACE;IACE,uBAAuB;IACvB,qDAAqD;EACvD;EACA;IACE,wBAAwB;IACxB,qDAAqD;EACvD;EACA;IACE,wBAAwB;IACxB,qDAAqD;EACvD;EACA;IACE,wBAAwB;IACxB,qDAAqD;EACvD;EACA;IACE,wBAAwB;IACxB,qDAAqD;EACvD;EACA;IACE,yBAAyB;IACzB,qDAAqD;EACvD;EACA;IACE,yBAAyB;IACzB,qDAAqD;EACvD;EACA;IACE,yBAAyB;IACzB,qDAAqD;EACvD;EACA;IACE,yBAAyB;IACzB,qDAAqD;EACvD;EACA;IACE,yBAAyB;IACzB,qDAAqD;EACvD;EACA;IACE,yBAAyB;IACzB,qDAAqD;EACvD;EACA;IACE,yBAAyB;IACzB,qDAAqD;EACvD;EACA;IACE,yBAAyB;IACzB,qDAAqD;EACvD;EACA;IACE,yBAAyB;IACzB,qDAAqD;EACvD;EACA;IACE,yBAAyB;IACzB,qDAAqD;EACvD;EACA;IACE,yBAAyB;IACzB,qDAAqD;EACvD;EACA;IACE,yBAAyB;EAC3B;AACF;AACA;EACE;IACE,qCAAqC;IACrC,uDAAuD;EACzD;EACA;IACE,kEAAkE;EACpE;EACA;IACE,8EAA8E;EAChF;EACA;IACE,kEAAkE;EACpE;EACA;IACE,8EAA8E;EAChF;EACA;IACE,8EAA8E;EAChF;EACA;IACE,oFAAoF;EACtF;EACA;IACE,8EAA8E;EAChF;EACA;IACE,qCAAqC;EACvC;EACA;IACE,qCAAqC;EACvC;AACF;AACA;EACE;IACE,uBAAuB;IACvB,uDAAuD;EACzD;EACA;IACE,6CAA6C;IAC7C,uDAAuD;EACzD;EACA;IACE,uBAAuB;IACvB,uDAAuD;EACzD;EACA;IACE,0DAA0D;IAC1D,uDAAuD;EACzD;EACA;IACE,uBAAuB;IACvB,uDAAuD;EACzD;EACA;IACE,yDAAyD;IACzD,uDAAuD;EACzD;EACA;IACE,uBAAuB;EACzB;EACA;IACE,uBAAuB;EACzB;AACF;AACA;EACE;IACE,yHAAyH;IACzH,4DAA4D;EAC9D;EACA;IACE,qJAAqJ;IACrJ,4DAA4D;EAC9D;EACA;IACE,gKAAgK;IAChK,uDAAuD;EACzD;EACA;IACE,uLAAuL;IACvL,4DAA4D;EAC9D;EACA;IACE,2KAA2K;IAC3K,4DAA4D;EAC9D;EACA;IACE,gKAAgK;IAChK,yDAAyD;EAC3D;EACA;IACE,yHAAyH;EAC3H;AACF;AACA;EACE;IACE,uBAAuB;IACvB,uDAAuD;EACzD;EACA;IACE,+CAA+C;IAC/C,uDAAuD;EACzD;EACA;IACE,iEAAiE;IACjE,uDAAuD;EACzD;EACA;IACE,4DAA4D;IAC5D,yDAAyD;EAC3D;EACA;IACE,iEAAiE;IACjE,uDAAuD;EACzD;EACA;IACE,4DAA4D;IAC5D,uDAAuD;EACzD;EACA;IACE,gEAAgE;IAChE,uDAAuD;EACzD;EACA;IACE,uBAAuB;EACzB;EACA;IACE,uBAAuB;EACzB;AACF;AACA;EACE;IACE,sBAAsB;IACtB,uDAAuD;EACzD;EACA;IACE,wFAAwF;IACxF,uDAAuD;EACzD;EACA;IACE,wFAAwF;IACxF,uDAAuD;EACzD;EACA;IACE,gIAAgI;IAChI,uDAAuD;EACzD;EACA;IACE,gIAAgI;IAChI,uDAAuD;EACzD;EACA;IACE,4BAA4B;IAC5B,uDAAuD;EACzD;EACA;IACE,sBAAsB;EACxB;EACA;IACE,sBAAsB;EACxB;AACF;AACA;EACE,wBAAwB;AAC1B;;AAEA;EACE,yBAAyB;AAC3B;;AAEA;EACE,yBAAyB;AAC3B;;AAEA;EACE,uBAAuB;AACzB;;AAEA;EACE,uBAAuB;AACzB;;AAEA;;EAEE,wBAAwB;AAC1B;;AAEA;EACE,4CAA4C;AAC9C;;AAEA;EACE,qBAAqB;EACrB,WAAW;EACX,gBAAgB;EAChB,kBAAkB;EAClB,sBAAsB;EACtB,YAAY;AACd;;AAEA;;EAEE,gBAAgB;EAChB,QAAQ;EACR,kBAAkB;EAClB,kBAAkB;EAClB,sBAAsB;EACtB,sCAAsC;AACxC;;AAEA;EACE,oBAAoB;AACtB;;AAEA;EACE,cAAc;AAChB;;AAEA;EACE,8BAA8B;AAChC;;AAEA;mEACmE;;AAEnE;EACE,YAAY;AACd;;AAEA;EACE,YAAY;AACd;;AAEA;EACE,YAAY;AACd;;AAEA;EACE,YAAY;AACd;;AAEA;EACE,YAAY;AACd;;AAEA;EACE,YAAY;AACd;;AAEA;EACE,YAAY;AACd;;AAEA;EACE,YAAY;AACd;;AAEA;EACE,YAAY;AACd;;AAEA;EACE,YAAY;AACd;;AAEA;EACE,UAAU;AACZ;;AAEA;EACE,UAAU;AACZ;;AAEA;EACE,UAAU;AACZ;;AAEA;EACE,UAAU;AACZ;;AAEA;EACE,UAAU;AACZ;;AAEA;EACE,UAAU;AACZ;;AAEA;EACE,UAAU;AACZ;;AAEA;EACE,UAAU;AACZ;;AAEA;EACE,UAAU;AACZ;;AAEA;EACE,UAAU;AACZ;;AAEA;EACE,UAAU;AACZ;;AAEA;EACE,UAAU;AACZ;;AAEA;EACE,UAAU;AACZ;;AAEA;EACE,UAAU;AACZ;;AAEA;EACE,UAAU;AACZ;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;AACA;EACE,2CAA2C;EAC3C,0DAA0D;AAC5D;;AAEA;EACE,oCAAoC;EACpC,kBAAkB;EAClB,gBAAgB;EAChB,mBAAmB;EACnB,4CAA2C;AAC7C;AACA;;;EAGE,oCAAoC;EACpC,eAAe;AACjB;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf,CAAC;EACC,0CAA0C;EAC1C,4DAA4D;EAC5D,8EAA8E;EAC9E,mDAAmD;AACrD;;AAEA;EACE,kCAAkC;EAClC,kBAAkB;EAClB,gBAAgB;EAChB,mBAAmB;EACnB,4CAA4C;AAC9C;AACA;EACE,qCAAqC;EACrC,eAAe;AACjB;;AAEA;EACE,qCAAqC;AACvC;;AAEA;EACE,eAAe;AACjB,CAAC;EACC,0CAA0C;EAC1C,0DAA0D;EAC1D,8EAA8E;EAC9E,mDAAmD;AACrD;;AAEA;EACE,kCAAkC;EAClC,kBAAkB;EAClB,gBAAgB;EAChB,mBAAmB;EACnB,4CAA0C;AAC5C;AACA;EACE,qCAAqC;EACrC,eAAe;AACjB;;AAEA;EACE,qCAAqC;AACvC;;AAEA;EACE,eAAe;AACjB,CAAC;EACC,oCAAoC;EACpC,mBAAmB;EACnB,gBAAgB;EAChB,4DAA2D;AAC7D;AACA;EACE,kCAAkC;EAClC,mBAAmB;EACnB,gBAAgB;EAChB,4DAA0D;AAC5D;AACA;EACE,kCAAkC;EAClC,mBAAmB;EACnB,gBAAgB;EAChB,4DAA4D;AAC9D,CAAC;EACC,0BAA0B;EAC1B,mBAAmB;EACnB,4DAA0D;AAC5D;AACA;EACE,0BAA0B;EAC1B,mBAAmB;EACnB,4DAA2D;AAC7D;AACA;EACE,0BAA0B;EAC1B,mBAAmB;EACnB,4DAA4D;EAC5D,4oBAA4oB;AAC9oB;AACA;EACE,0BAA0B;EAC1B,mBAAmB;EACnB,4DAAgE;EAChE,2RAA2R;AAC7R",sourcesContent:['/*!\n * Font Awesome Free 7.3.1 by @fontawesome - https://fontawesome.com\n * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)\n * Copyright 2026 Fonticons, Inc.\n */\n.fa-solid,\n.fa-regular,\n.fa-brands,\n.fa-classic,\n.fas,\n.far,\n.fab,\n.fa {\n --_fa-family: var(--fa-family, var(--fa-style-family, \'Font Awesome 7 Free\'));\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n display: var(--fa-display, inline-block);\n font-family: var(--_fa-family);\n font-feature-settings: normal;\n font-style: normal;\n font-synthesis: none;\n font-variant: normal;\n font-weight: var(--fa-style, 900);\n line-height: 1;\n text-align: center;\n text-rendering: auto;\n width: var(--fa-width, 1.25em);\n}\n\n:is(.fas,\n.far,\n.fab,\n.fa-solid,\n.fa-regular,\n.fa-brands,\n.fa-classic,\n.fa)::before {\n content: var(--fa)/"";\n}\n\n@supports not (content: ""/"") {\n :is(.fas,\n .far,\n .fab,\n .fa-solid,\n .fa-regular,\n .fa-brands,\n .fa-classic,\n .fa)::before {\n content: var(--fa);\n }\n}\n.fa-1x {\n font-size: 1em;\n}\n\n.fa-2x {\n font-size: 2em;\n}\n\n.fa-3x {\n font-size: 3em;\n}\n\n.fa-4x {\n font-size: 4em;\n}\n\n.fa-5x {\n font-size: 5em;\n}\n\n.fa-6x {\n font-size: 6em;\n}\n\n.fa-7x {\n font-size: 7em;\n}\n\n.fa-8x {\n font-size: 8em;\n}\n\n.fa-9x {\n font-size: 9em;\n}\n\n.fa-10x {\n font-size: 10em;\n}\n\n.fa-2xs {\n font-size: calc(10 / 16 * 1em); /* converts a 10px size into an em-based value that\'s relative to the scale\'s 16px base */\n line-height: calc(1 / 10 * 1em); /* sets the line-height of the icon back to that of it\'s parent */\n vertical-align: calc((6 / 10 - 0.375) * 1em); /* vertically centers the icon taking into account the surrounding text\'s descender */\n}\n\n.fa-xs {\n font-size: calc(12 / 16 * 1em); /* converts a 12px size into an em-based value that\'s relative to the scale\'s 16px base */\n line-height: calc(1 / 12 * 1em); /* sets the line-height of the icon back to that of it\'s parent */\n vertical-align: calc((6 / 12 - 0.375) * 1em); /* vertically centers the icon taking into account the surrounding text\'s descender */\n}\n\n.fa-sm {\n font-size: calc(14 / 16 * 1em); /* converts a 14px size into an em-based value that\'s relative to the scale\'s 16px base */\n line-height: calc(1 / 14 * 1em); /* sets the line-height of the icon back to that of it\'s parent */\n vertical-align: calc((6 / 14 - 0.375) * 1em); /* vertically centers the icon taking into account the surrounding text\'s descender */\n}\n\n.fa-lg {\n font-size: calc(20 / 16 * 1em); /* converts a 20px size into an em-based value that\'s relative to the scale\'s 16px base */\n line-height: calc(1 / 20 * 1em); /* sets the line-height of the icon back to that of it\'s parent */\n vertical-align: calc((6 / 20 - 0.375) * 1em); /* vertically centers the icon taking into account the surrounding text\'s descender */\n}\n\n.fa-xl {\n font-size: calc(24 / 16 * 1em); /* converts a 24px size into an em-based value that\'s relative to the scale\'s 16px base */\n line-height: calc(1 / 24 * 1em); /* sets the line-height of the icon back to that of it\'s parent */\n vertical-align: calc((6 / 24 - 0.375) * 1em); /* vertically centers the icon taking into account the surrounding text\'s descender */\n}\n\n.fa-2xl {\n font-size: calc(32 / 16 * 1em); /* converts a 32px size into an em-based value that\'s relative to the scale\'s 16px base */\n line-height: calc(1 / 32 * 1em); /* sets the line-height of the icon back to that of it\'s parent */\n vertical-align: calc((6 / 32 - 0.375) * 1em); /* vertically centers the icon taking into account the surrounding text\'s descender */\n}\n\n.fa-width-auto {\n --fa-width: auto;\n}\n\n.fa-fw,\n.fa-width-fixed {\n --fa-width: 1.25em;\n}\n\n.fa-canvas-square {\n padding-block: 0.125em;\n margin-block-end: -0.125em;\n}\n\n.fa-canvas-roomy {\n padding-block: 0.25em;\n padding-inline: 0.125em;\n margin-block-end: -0.25em;\n box-sizing: content-box;\n}\n\n.fa-ul {\n list-style-type: none;\n margin-inline-start: var(--fa-li-margin, 2.5em);\n padding-inline-start: 0;\n}\n.fa-ul > li {\n position: relative;\n}\n\n.fa-li {\n inset-inline-start: calc(-1 * var(--fa-li-width, 2em));\n position: absolute;\n text-align: center;\n width: var(--fa-li-width, 2em);\n line-height: inherit;\n}\n\n/* Heads Up: Bordered Icons will not be supported in the future!\n - This feature will be deprecated in the next major release of Font Awesome (v8)!\n - You may continue to use it in this version *v7), but it will not be supported in Font Awesome v8.\n*/\n/* Notes:\n* --@{v.$css-prefix}-border-width = 1/16 by default (to render as ~1px based on a 16px default font-size)\n* --@{v.$css-prefix}-border-padding =\n ** 3/16 for vertical padding (to give ~2px of vertical whitespace around an icon considering it\'s vertical alignment)\n ** 4/16 for horizontal padding (to give ~4px of horizontal whitespace around an icon)\n*/\n.fa-border {\n border-color: var(--fa-border-color, #eee);\n border-radius: var(--fa-border-radius, 0.1em);\n border-style: var(--fa-border-style, solid);\n border-width: var(--fa-border-width, 0.0625em);\n box-sizing: var(--fa-border-box-sizing, content-box);\n padding: var(--fa-border-padding, 0.1875em 0.25em);\n}\n\n.fa-pull-left,\n.fa-pull-start {\n float: inline-start;\n margin-inline-end: var(--fa-pull-margin, 0.3em);\n}\n\n.fa-pull-right,\n.fa-pull-end {\n float: inline-end;\n margin-inline-start: var(--fa-pull-margin, 0.3em);\n}\n\n.fa-beat {\n animation-name: fa-beat;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 1s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, ease-in-out);\n}\n\n.fa-bounce {\n animation-name: fa-bounce;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 1s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1));\n}\n\n.fa-fade {\n animation-name: fa-fade;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 1s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, ease-in-out);\n}\n\n.fa-beat-fade {\n animation-name: fa-beat-fade;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 1s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, ease-in-out);\n}\n\n.fa-flip {\n animation-name: fa-flip;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 1.5s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, ease-in-out);\n}\n\n.fa-flip-360 {\n animation-name: fa-flip-360;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 1s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, ease-in-out);\n}\n\n.fa-shake {\n animation-name: fa-shake;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 0.75s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, ease-in-out);\n}\n\n.fa-spin {\n animation-name: fa-spin;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 2s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, linear);\n}\n\n.fa-spin-reverse {\n --fa-animation-direction: reverse;\n}\n\n.fa-pulse,\n.fa-spin-pulse {\n animation-name: fa-spin;\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 1s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, steps(8));\n}\n\n.fa-spin-snap {\n animation-name: fa-spin-snap;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 3s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, linear);\n}\n\n.fa-spin-snap-4 {\n animation-name: fa-spin-snap-4;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 2.4s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, linear);\n}\n\n.fa-spin-snap-8 {\n animation-name: fa-spin-snap-8;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 4s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, linear);\n}\n\n.fa-buzz {\n animation-name: fa-buzz;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 0.6s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, linear);\n}\n\n.fa-wag {\n animation-name: fa-wag;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 0.9s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, ease-out);\n transform-origin: bottom center;\n}\n\n.fa-float {\n animation-name: fa-float;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 3s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, ease-in-out);\n will-change: transform;\n}\n\n.fa-swing {\n animation-name: fa-swing;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 1.2s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, ease-out);\n transform-origin: top center;\n}\n\n.fa-jello {\n animation-name: fa-jello;\n animation-delay: var(--fa-animation-delay, 0s);\n animation-direction: var(--fa-animation-direction, normal);\n animation-duration: var(--fa-animation-duration, 0.9s);\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n animation-timing-function: var(--fa-animation-timing, ease-out);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .fa-beat,\n .fa-bounce,\n .fa-fade,\n .fa-beat-fade,\n .fa-flip,\n .fa-flip-360,\n .fa-pulse,\n .fa-shake,\n .fa-spin,\n .fa-spin-pulse,\n .fa-buzz,\n .fa-float,\n .fa-jello,\n .fa-spin-snap,\n .fa-spin-snap-4,\n .fa-spin-snap-8,\n .fa-swing,\n .fa-wag {\n animation: none !important;\n transition: none !important;\n }\n}\n@keyframes fa-beat {\n 0% {\n transform: scale(1);\n }\n 25% {\n transform: scale(calc(1.25 * var(--fa-beat-scale, 1.25)));\n }\n 45% {\n transform: scale(calc(1.22 * var(--fa-beat-scale, 1.22)));\n }\n 65% {\n transform: scale(calc(1.25 * var(--fa-beat-scale, 1.25)));\n }\n 90% {\n transform: scale(1);\n }\n}\n@keyframes fa-bounce {\n 0% {\n transform: scale(1, 1) translateY(0);\n animation-timing-function: var(--fa-animation-timing);\n }\n 14% {\n transform: scale(var(--fa-bounce-start-scale-x, 1.06), var(--fa-bounce-start-scale-y, 0.94)) translateY(var(--fa-bounce-anticipation, 3px));\n animation-timing-function: cubic-bezier(0.33, 0, 0.66, 0.33);\n }\n 32% {\n transform: scale(var(--fa-bounce-jump-scale-x, 0.94), var(--fa-bounce-jump-scale-y, 1.12)) translateY(calc(-1 * var(--fa-bounce-height, 0.5em)));\n animation-timing-function: cubic-bezier(0.33, 0.66, 0.66, 1);\n }\n 52% {\n transform: scale(1, 1) translateY(calc(-1 * var(--fa-bounce-height, 0.5em) * 1.1));\n animation-timing-function: cubic-bezier(0.5, 0, 1, 0.5);\n }\n 70% {\n transform: scale(var(--fa-bounce-land-scale-x, 1.06), var(--fa-bounce-land-scale-y, 0.92)) translateY(0);\n animation-timing-function: cubic-bezier(0.33, 0.33, 0.66, 1);\n }\n 85% {\n transform: scale(0.98, 1.04) translateY(calc(-2px * var(--fa-bounce-rebound, 1)));\n animation-timing-function: cubic-bezier(0.33, 0, 0.66, 1);\n }\n 100% {\n transform: scale(1, 1) translateY(0);\n }\n}\n@keyframes fa-fade {\n 0% {\n opacity: 1;\n transform: scale(1);\n animation-timing-function: cubic-bezier(0.2, 0, 0.4, 1);\n }\n 40% {\n opacity: var(--fa-fade-opacity, 0.4);\n transform: scale(0.98);\n animation-timing-function: cubic-bezier(0.4, 0, 0.6, 1);\n }\n 100% {\n opacity: 1;\n transform: scale(1);\n }\n}\n@keyframes fa-beat-fade {\n 0% {\n opacity: var(--fa-beat-fade-opacity, 0.4);\n transform: scale(1);\n animation-timing-function: cubic-bezier(0.2, 0, 0.4, 1);\n }\n 25% {\n opacity: calc(var(--fa-beat-fade-opacity, 0.4) + 0.4);\n transform: scale(var(--fa-beat-fade-scale, 1.28));\n animation-timing-function: cubic-bezier(0.4, 0, 0.6, 1);\n }\n 45% {\n opacity: 1;\n transform: scale(var(--fa-beat-fade-scale, 1.25));\n animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n }\n 65% {\n opacity: calc(var(--fa-beat-fade-opacity, 0.4) + 0.4);\n transform: scale(var(--fa-beat-fade-scale, 1.28));\n animation-timing-function: cubic-bezier(0.4, 0, 0.6, 1);\n }\n 100% {\n opacity: var(--fa-beat-fade-opacity, 0.4);\n transform: scale(1);\n }\n}\n@keyframes fa-flip {\n 0% {\n transform: perspective(2em) scale(1) rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), 0deg);\n animation-timing-function: cubic-bezier(0.2, 0, 0.4, 1);\n }\n 8% {\n transform: perspective(2em) scale(var(--fa-flip-anticipation-scale, 0.95)) rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), 0deg);\n animation-timing-function: cubic-bezier(0.33, 0, 0.66, 0.33);\n }\n 35% {\n transform: perspective(2em) scale(1) rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), calc(var(--fa-flip-angle, -360deg) * 0.6));\n animation-timing-function: linear;\n }\n 65% {\n transform: perspective(2em) scale(1) rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), calc(var(--fa-flip-angle, -360deg) * 0.5));\n animation-timing-function: cubic-bezier(0.33, 0.66, 0.66, 1);\n }\n 92% {\n transform: perspective(2em) scale(1) rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), calc(var(--fa-flip-angle, -360deg) * var(--fa-flip-overshoot, 1.04)));\n animation-timing-function: cubic-bezier(0.33, 0, 0.66, 1);\n }\n 100% {\n transform: perspective(2em) scale(1) rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -360deg));\n }\n}\n@keyframes fa-flip-360 {\n 0% {\n transform: perspective(2em) scale(1) rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), 0deg);\n animation-timing-function: cubic-bezier(0.2, 0, 0.4, 1);\n }\n 8% {\n transform: perspective(2em) scale(var(--fa-flip-anticipation-scale, 0.95)) rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), 0deg);\n animation-timing-function: cubic-bezier(0.33, 0, 0.66, 0.33);\n }\n 50% {\n transform: perspective(2em) scale(1) rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), calc(var(--fa-flip-angle, -360deg) * 0.6));\n animation-timing-function: cubic-bezier(0.33, 0.66, 0.66, 1);\n }\n 80% {\n transform: perspective(2em) scale(1) rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), calc(var(--fa-flip-angle, -360deg) * var(--fa-flip-overshoot, 1.04)));\n animation-timing-function: cubic-bezier(0.33, 0, 0.66, 1);\n }\n 100% {\n transform: perspective(2em) scale(1) rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -360deg));\n }\n}\n@keyframes fa-shake {\n 0% {\n transform: rotate(0deg);\n animation-timing-function: cubic-bezier(0.2, 0, 0.8, 1);\n }\n 8% {\n transform: rotate(35deg) translateX(1px);\n animation-timing-function: cubic-bezier(0.3, 0, 0.7, 1);\n }\n 20% {\n transform: rotate(-22deg) translateX(-1px);\n animation-timing-function: cubic-bezier(0.3, 0, 0.7, 1);\n }\n 35% {\n transform: rotate(15deg) translateX(1px);\n animation-timing-function: cubic-bezier(0.3, 0, 0.7, 1);\n }\n 50% {\n transform: rotate(-9deg);\n animation-timing-function: cubic-bezier(0.4, 0, 0.6, 1);\n }\n 65% {\n transform: rotate(5deg);\n animation-timing-function: cubic-bezier(0.4, 0, 0.6, 1);\n }\n 78% {\n transform: rotate(-3deg);\n animation-timing-function: cubic-bezier(0.4, 0, 0.6, 1);\n }\n 90% {\n transform: rotate(1deg);\n animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n }\n 100% {\n transform: rotate(0deg);\n }\n}\n@keyframes fa-spin {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n@keyframes fa-spin-snap {\n 0% {\n transform: rotate(0deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 12% {\n transform: rotate(60deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 16.67% {\n transform: rotate(60deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 28.67% {\n transform: rotate(120deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 33.33% {\n transform: rotate(120deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 45.33% {\n transform: rotate(180deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 50% {\n transform: rotate(180deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 62% {\n transform: rotate(240deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 66.67% {\n transform: rotate(240deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 78.67% {\n transform: rotate(300deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 83.33% {\n transform: rotate(300deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 95.33% {\n transform: rotate(360deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n@keyframes fa-spin-snap-4 {\n 0% {\n transform: rotate(0deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 15% {\n transform: rotate(90deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 25% {\n transform: rotate(90deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 40% {\n transform: rotate(180deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 50% {\n transform: rotate(180deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 65% {\n transform: rotate(270deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 75% {\n transform: rotate(270deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 90% {\n transform: rotate(360deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n@keyframes fa-spin-snap-8 {\n 0% {\n transform: rotate(0deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 9% {\n transform: rotate(45deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 12.5% {\n transform: rotate(45deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 21.5% {\n transform: rotate(90deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 25% {\n transform: rotate(90deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 34% {\n transform: rotate(135deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 37.5% {\n transform: rotate(135deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 46.5% {\n transform: rotate(180deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 50% {\n transform: rotate(180deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 59% {\n transform: rotate(225deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 62.5% {\n transform: rotate(225deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 71.5% {\n transform: rotate(270deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 75% {\n transform: rotate(270deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 84% {\n transform: rotate(315deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 87.5% {\n transform: rotate(315deg);\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n 96.5% {\n transform: rotate(360deg);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n@keyframes fa-buzz {\n 0% {\n transform: translateX(0) rotate(0deg);\n animation-timing-function: cubic-bezier(0.1, 0, 0.9, 1);\n }\n 5% {\n transform: translateX(var(--fa-buzz-distance, 4px)) rotate(0.5deg);\n }\n 10% {\n transform: translateX(calc(-1 * var(--fa-buzz-distance, 4px))) rotate(-0.5deg);\n }\n 15% {\n transform: translateX(var(--fa-buzz-distance, 4px)) rotate(0.3deg);\n }\n 20% {\n transform: translateX(calc(-1 * var(--fa-buzz-distance, 4px))) rotate(-0.3deg);\n }\n 25% {\n transform: translateX(calc(var(--fa-buzz-distance, 4px) * 0.7)) rotate(0.2deg);\n }\n 30% {\n transform: translateX(calc(-1 * var(--fa-buzz-distance, 4px) * 0.7)) rotate(-0.2deg);\n }\n 35% {\n transform: translateX(calc(var(--fa-buzz-distance, 4px) * 0.4)) rotate(0.1deg);\n }\n 40% {\n transform: translateX(0) rotate(0deg);\n }\n 100% {\n transform: translateX(0) rotate(0deg);\n }\n}\n@keyframes fa-wag {\n 0% {\n transform: rotate(0deg);\n animation-timing-function: cubic-bezier(0.2, 0, 0.6, 1);\n }\n 12% {\n transform: rotate(var(--fa-wag-angle, 12deg));\n animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n }\n 24% {\n transform: rotate(2deg);\n animation-timing-function: cubic-bezier(0.2, 0, 0.6, 1);\n }\n 36% {\n transform: rotate(calc(var(--fa-wag-angle, 12deg) * 0.85));\n animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n }\n 48% {\n transform: rotate(1deg);\n animation-timing-function: cubic-bezier(0.2, 0, 0.6, 1);\n }\n 58% {\n transform: rotate(calc(var(--fa-wag-angle, 12deg) * 0.6));\n animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n }\n 68% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(0deg);\n }\n}\n@keyframes fa-float {\n 0% {\n transform: translateY(0) translateX(0) rotate(0deg) scale(var(--fa-float-squash-x, 1.02), var(--fa-float-squash-y, 0.98));\n animation-timing-function: cubic-bezier(0.33, 0, 0.66, 0.33);\n }\n 15% {\n transform: translateY(calc(-0.4 * var(--fa-float-height, 6px))) translateX(var(--fa-float-drift, 1px)) rotate(var(--fa-float-tilt, 1deg)) scale(1, 1);\n animation-timing-function: cubic-bezier(0.33, 0.66, 0.66, 1);\n }\n 35% {\n transform: translateY(calc(-1 * var(--fa-float-height, 6px))) translateX(0) rotate(0deg) scale(var(--fa-float-stretch-x, 0.98), var(--fa-float-stretch-y, 1.03));\n animation-timing-function: cubic-bezier(0.5, 0, 0.5, 0);\n }\n 50% {\n transform: translateY(calc(-0.92 * var(--fa-float-height, 6px))) translateX(calc(-0.5 * var(--fa-float-drift, 1px))) rotate(calc(-0.5 * var(--fa-float-tilt, 1deg))) scale(0.995, 1.01);\n animation-timing-function: cubic-bezier(0.33, 0, 0.66, 0.33);\n }\n 70% {\n transform: translateY(calc(-0.3 * var(--fa-float-height, 6px))) translateX(calc(-1 * var(--fa-float-drift, 1px))) rotate(calc(-1 * var(--fa-float-tilt, 1deg))) scale(1, 1);\n animation-timing-function: cubic-bezier(0.33, 0.66, 0.66, 1);\n }\n 90% {\n transform: translateY(calc(0.05 * var(--fa-float-height, 6px))) translateX(0) rotate(0deg) scale(var(--fa-float-squash-x, 1.02), var(--fa-float-squash-y, 0.98));\n animation-timing-function: cubic-bezier(0.33, 0, 0.66, 1);\n }\n 100% {\n transform: translateY(0) translateX(0) rotate(0deg) scale(var(--fa-float-squash-x, 1.02), var(--fa-float-squash-y, 0.98));\n }\n}\n@keyframes fa-swing {\n 0% {\n transform: rotate(0deg);\n animation-timing-function: cubic-bezier(0.2, 0, 0.8, 1);\n }\n 8% {\n transform: rotate(var(--fa-swing-angle, 22deg));\n animation-timing-function: cubic-bezier(0.3, 0, 0.7, 1);\n }\n 18% {\n transform: rotate(calc(-1 * var(--fa-swing-angle, 22deg) * 0.85));\n animation-timing-function: cubic-bezier(0.3, 0, 0.7, 1);\n }\n 28% {\n transform: rotate(calc(var(--fa-swing-angle, 22deg) * 0.65));\n animation-timing-function: cubic-bezier(0.35, 0, 0.65, 1);\n }\n 38% {\n transform: rotate(calc(-1 * var(--fa-swing-angle, 22deg) * 0.45));\n animation-timing-function: cubic-bezier(0.4, 0, 0.6, 1);\n }\n 48% {\n transform: rotate(calc(var(--fa-swing-angle, 22deg) * 0.25));\n animation-timing-function: cubic-bezier(0.4, 0, 0.6, 1);\n }\n 56% {\n transform: rotate(calc(-1 * var(--fa-swing-angle, 22deg) * 0.1));\n animation-timing-function: cubic-bezier(0.4, 0, 0.6, 1);\n }\n 64% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(0deg);\n }\n}\n@keyframes fa-jello {\n 0% {\n transform: scale(1, 1);\n animation-timing-function: cubic-bezier(0.2, 0, 0.8, 1);\n }\n 12% {\n transform: scale(var(--fa-jello-scale-x, 1.15), calc(2 - var(--fa-jello-scale-x, 1.15)));\n animation-timing-function: cubic-bezier(0.3, 0, 0.7, 1);\n }\n 24% {\n transform: scale(calc(2 - var(--fa-jello-scale-y, 1.12)), var(--fa-jello-scale-y, 1.12));\n animation-timing-function: cubic-bezier(0.3, 0, 0.7, 1);\n }\n 36% {\n transform: scale(calc(1 + (var(--fa-jello-scale-x, 1.15) - 1) * 0.5), calc(2 - (1 + (var(--fa-jello-scale-x, 1.15) - 1) * 0.5)));\n animation-timing-function: cubic-bezier(0.4, 0, 0.6, 1);\n }\n 48% {\n transform: scale(calc(2 - (1 + (var(--fa-jello-scale-y, 1.12) - 1) * 0.3)), calc(1 + (var(--fa-jello-scale-y, 1.12) - 1) * 0.3));\n animation-timing-function: cubic-bezier(0.4, 0, 0.6, 1);\n }\n 58% {\n transform: scale(1.02, 0.98);\n animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n }\n 68% {\n transform: scale(1, 1);\n }\n 100% {\n transform: scale(1, 1);\n }\n}\n.fa-rotate-90 {\n transform: rotate(90deg);\n}\n\n.fa-rotate-180 {\n transform: rotate(180deg);\n}\n\n.fa-rotate-270 {\n transform: rotate(270deg);\n}\n\n.fa-flip-horizontal {\n transform: scale(-1, 1);\n}\n\n.fa-flip-vertical {\n transform: scale(1, -1);\n}\n\n.fa-flip-both,\n.fa-flip-horizontal.fa-flip-vertical {\n transform: scale(-1, -1);\n}\n\n.fa-rotate-by {\n transform: rotate(var(--fa-rotate-angle, 0));\n}\n\n.fa-stack {\n display: inline-block;\n height: 2em;\n line-height: 2em;\n position: relative;\n vertical-align: middle;\n width: 2.5em;\n}\n\n.fa-stack-1x,\n.fa-stack-2x {\n --fa-width: 100%;\n inset: 0;\n position: absolute;\n text-align: center;\n width: var(--fa-width);\n z-index: var(--fa-stack-z-index, auto);\n}\n\n.fa-stack-1x {\n line-height: inherit;\n}\n\n.fa-stack-2x {\n font-size: 2em;\n}\n\n.fa-inverse {\n color: var(--fa-inverse, #fff);\n}\n\n/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen\n readers do not read off random characters that represent icons */\n\n.fa-0 {\n --fa: "\\30 ";\n}\n\n.fa-1 {\n --fa: "\\31 ";\n}\n\n.fa-2 {\n --fa: "\\32 ";\n}\n\n.fa-3 {\n --fa: "\\33 ";\n}\n\n.fa-4 {\n --fa: "\\34 ";\n}\n\n.fa-5 {\n --fa: "\\35 ";\n}\n\n.fa-6 {\n --fa: "\\36 ";\n}\n\n.fa-7 {\n --fa: "\\37 ";\n}\n\n.fa-8 {\n --fa: "\\38 ";\n}\n\n.fa-9 {\n --fa: "\\39 ";\n}\n\n.fa-exclamation {\n --fa: "\\!";\n}\n\n.fa-hashtag {\n --fa: "\\#";\n}\n\n.fa-dollar-sign {\n --fa: "\\$";\n}\n\n.fa-dollar {\n --fa: "\\$";\n}\n\n.fa-usd {\n --fa: "\\$";\n}\n\n.fa-percent {\n --fa: "\\%";\n}\n\n.fa-percentage {\n --fa: "\\%";\n}\n\n.fa-asterisk {\n --fa: "\\*";\n}\n\n.fa-plus {\n --fa: "\\+";\n}\n\n.fa-add {\n --fa: "\\+";\n}\n\n.fa-less-than {\n --fa: "\\<";\n}\n\n.fa-equals {\n --fa: "\\=";\n}\n\n.fa-greater-than {\n --fa: "\\>";\n}\n\n.fa-question {\n --fa: "\\?";\n}\n\n.fa-at {\n --fa: "\\@";\n}\n\n.fa-a {\n --fa: "A";\n}\n\n.fa-b {\n --fa: "B";\n}\n\n.fa-c {\n --fa: "C";\n}\n\n.fa-d {\n --fa: "D";\n}\n\n.fa-e {\n --fa: "E";\n}\n\n.fa-f {\n --fa: "F";\n}\n\n.fa-g {\n --fa: "G";\n}\n\n.fa-h {\n --fa: "H";\n}\n\n.fa-i {\n --fa: "I";\n}\n\n.fa-j {\n --fa: "J";\n}\n\n.fa-k {\n --fa: "K";\n}\n\n.fa-l {\n --fa: "L";\n}\n\n.fa-m {\n --fa: "M";\n}\n\n.fa-n {\n --fa: "N";\n}\n\n.fa-o {\n --fa: "O";\n}\n\n.fa-p {\n --fa: "P";\n}\n\n.fa-q {\n --fa: "Q";\n}\n\n.fa-r {\n --fa: "R";\n}\n\n.fa-s {\n --fa: "S";\n}\n\n.fa-t {\n --fa: "T";\n}\n\n.fa-u {\n --fa: "U";\n}\n\n.fa-v {\n --fa: "V";\n}\n\n.fa-w {\n --fa: "W";\n}\n\n.fa-x {\n --fa: "X";\n}\n\n.fa-y {\n --fa: "Y";\n}\n\n.fa-z {\n --fa: "Z";\n}\n\n.fa-faucet {\n --fa: "\\e005";\n}\n\n.fa-faucet-drip {\n --fa: "\\e006";\n}\n\n.fa-house-chimney-window {\n --fa: "\\e00d";\n}\n\n.fa-house-signal {\n --fa: "\\e012";\n}\n\n.fa-temperature-arrow-down {\n --fa: "\\e03f";\n}\n\n.fa-temperature-down {\n --fa: "\\e03f";\n}\n\n.fa-temperature-arrow-up {\n --fa: "\\e040";\n}\n\n.fa-temperature-up {\n --fa: "\\e040";\n}\n\n.fa-trailer {\n --fa: "\\e041";\n}\n\n.fa-bacteria {\n --fa: "\\e059";\n}\n\n.fa-bacterium {\n --fa: "\\e05a";\n}\n\n.fa-box-tissue {\n --fa: "\\e05b";\n}\n\n.fa-hand-holding-medical {\n --fa: "\\e05c";\n}\n\n.fa-hand-sparkles {\n --fa: "\\e05d";\n}\n\n.fa-hands-bubbles {\n --fa: "\\e05e";\n}\n\n.fa-hands-wash {\n --fa: "\\e05e";\n}\n\n.fa-handshake-slash {\n --fa: "\\e060";\n}\n\n.fa-handshake-alt-slash {\n --fa: "\\e060";\n}\n\n.fa-handshake-simple-slash {\n --fa: "\\e060";\n}\n\n.fa-head-side-cough {\n --fa: "\\e061";\n}\n\n.fa-head-side-cough-slash {\n --fa: "\\e062";\n}\n\n.fa-head-side-mask {\n --fa: "\\e063";\n}\n\n.fa-head-side-virus {\n --fa: "\\e064";\n}\n\n.fa-house-chimney-user {\n --fa: "\\e065";\n}\n\n.fa-house-laptop {\n --fa: "\\e066";\n}\n\n.fa-laptop-house {\n --fa: "\\e066";\n}\n\n.fa-lungs-virus {\n --fa: "\\e067";\n}\n\n.fa-people-arrows {\n --fa: "\\e068";\n}\n\n.fa-people-arrows-left-right {\n --fa: "\\e068";\n}\n\n.fa-plane-slash {\n --fa: "\\e069";\n}\n\n.fa-pump-medical {\n --fa: "\\e06a";\n}\n\n.fa-pump-soap {\n --fa: "\\e06b";\n}\n\n.fa-shield-virus {\n --fa: "\\e06c";\n}\n\n.fa-sink {\n --fa: "\\e06d";\n}\n\n.fa-soap {\n --fa: "\\e06e";\n}\n\n.fa-stopwatch-20 {\n --fa: "\\e06f";\n}\n\n.fa-shop-slash {\n --fa: "\\e070";\n}\n\n.fa-store-alt-slash {\n --fa: "\\e070";\n}\n\n.fa-store-slash {\n --fa: "\\e071";\n}\n\n.fa-toilet-paper-slash {\n --fa: "\\e072";\n}\n\n.fa-users-slash {\n --fa: "\\e073";\n}\n\n.fa-virus {\n --fa: "\\e074";\n}\n\n.fa-virus-slash {\n --fa: "\\e075";\n}\n\n.fa-viruses {\n --fa: "\\e076";\n}\n\n.fa-vest {\n --fa: "\\e085";\n}\n\n.fa-vest-patches {\n --fa: "\\e086";\n}\n\n.fa-arrow-trend-down {\n --fa: "\\e097";\n}\n\n.fa-arrow-trend-up {\n --fa: "\\e098";\n}\n\n.fa-arrow-up-from-bracket {\n --fa: "\\e09a";\n}\n\n.fa-austral-sign {\n --fa: "\\e0a9";\n}\n\n.fa-baht-sign {\n --fa: "\\e0ac";\n}\n\n.fa-bitcoin-sign {\n --fa: "\\e0b4";\n}\n\n.fa-bolt-lightning {\n --fa: "\\e0b7";\n}\n\n.fa-book-bookmark {\n --fa: "\\e0bb";\n}\n\n.fa-camera-rotate {\n --fa: "\\e0d8";\n}\n\n.fa-cedi-sign {\n --fa: "\\e0df";\n}\n\n.fa-chart-column {\n --fa: "\\e0e3";\n}\n\n.fa-chart-gantt {\n --fa: "\\e0e4";\n}\n\n.fa-clapperboard {\n --fa: "\\e131";\n}\n\n.fa-closed-captioning-slash {\n --fa: "\\e135";\n}\n\n.fa-clover {\n --fa: "\\e139";\n}\n\n.fa-code-compare {\n --fa: "\\e13a";\n}\n\n.fa-code-fork {\n --fa: "\\e13b";\n}\n\n.fa-code-pull-request {\n --fa: "\\e13c";\n}\n\n.fa-colon-sign {\n --fa: "\\e140";\n}\n\n.fa-cruzeiro-sign {\n --fa: "\\e152";\n}\n\n.fa-display {\n --fa: "\\e163";\n}\n\n.fa-dong-sign {\n --fa: "\\e169";\n}\n\n.fa-elevator {\n --fa: "\\e16d";\n}\n\n.fa-filter-circle-xmark {\n --fa: "\\e17b";\n}\n\n.fa-florin-sign {\n --fa: "\\e184";\n}\n\n.fa-folder-closed {\n --fa: "\\e185";\n}\n\n.fa-franc-sign {\n --fa: "\\e18f";\n}\n\n.fa-guarani-sign {\n --fa: "\\e19a";\n}\n\n.fa-gun {\n --fa: "\\e19b";\n}\n\n.fa-hands-clapping {\n --fa: "\\e1a8";\n}\n\n.fa-house-user {\n --fa: "\\e1b0";\n}\n\n.fa-home-user {\n --fa: "\\e1b0";\n}\n\n.fa-indian-rupee-sign {\n --fa: "\\e1bc";\n}\n\n.fa-indian-rupee {\n --fa: "\\e1bc";\n}\n\n.fa-inr {\n --fa: "\\e1bc";\n}\n\n.fa-kip-sign {\n --fa: "\\e1c4";\n}\n\n.fa-lari-sign {\n --fa: "\\e1c8";\n}\n\n.fa-litecoin-sign {\n --fa: "\\e1d3";\n}\n\n.fa-manat-sign {\n --fa: "\\e1d5";\n}\n\n.fa-mask-face {\n --fa: "\\e1d7";\n}\n\n.fa-mill-sign {\n --fa: "\\e1ed";\n}\n\n.fa-money-bills {\n --fa: "\\e1f3";\n}\n\n.fa-naira-sign {\n --fa: "\\e1f6";\n}\n\n.fa-notdef {\n --fa: "\\e1fe";\n}\n\n.fa-panorama {\n --fa: "\\e209";\n}\n\n.fa-peseta-sign {\n --fa: "\\e221";\n}\n\n.fa-peso-sign {\n --fa: "\\e222";\n}\n\n.fa-plane-up {\n --fa: "\\e22d";\n}\n\n.fa-rupiah-sign {\n --fa: "\\e23d";\n}\n\n.fa-stairs {\n --fa: "\\e289";\n}\n\n.fa-timeline {\n --fa: "\\e29c";\n}\n\n.fa-truck-front {\n --fa: "\\e2b7";\n}\n\n.fa-turkish-lira-sign {\n --fa: "\\e2bb";\n}\n\n.fa-try {\n --fa: "\\e2bb";\n}\n\n.fa-turkish-lira {\n --fa: "\\e2bb";\n}\n\n.fa-vault {\n --fa: "\\e2c5";\n}\n\n.fa-wand-magic-sparkles {\n --fa: "\\e2ca";\n}\n\n.fa-magic-wand-sparkles {\n --fa: "\\e2ca";\n}\n\n.fa-wheat-awn {\n --fa: "\\e2cd";\n}\n\n.fa-wheat-alt {\n --fa: "\\e2cd";\n}\n\n.fa-wheelchair-move {\n --fa: "\\e2ce";\n}\n\n.fa-wheelchair-alt {\n --fa: "\\e2ce";\n}\n\n.fa-bangladeshi-taka-sign {\n --fa: "\\e2e6";\n}\n\n.fa-bowl-rice {\n --fa: "\\e2eb";\n}\n\n.fa-person-pregnant {\n --fa: "\\e31e";\n}\n\n.fa-house-chimney {\n --fa: "\\e3af";\n}\n\n.fa-home-lg {\n --fa: "\\e3af";\n}\n\n.fa-house-crack {\n --fa: "\\e3b1";\n}\n\n.fa-house-medical {\n --fa: "\\e3b2";\n}\n\n.fa-cent-sign {\n --fa: "\\e3f5";\n}\n\n.fa-plus-minus {\n --fa: "\\e43c";\n}\n\n.fa-sailboat {\n --fa: "\\e445";\n}\n\n.fa-section {\n --fa: "\\e447";\n}\n\n.fa-shrimp {\n --fa: "\\e448";\n}\n\n.fa-brazilian-real-sign {\n --fa: "\\e46c";\n}\n\n.fa-chart-simple {\n --fa: "\\e473";\n}\n\n.fa-diagram-next {\n --fa: "\\e476";\n}\n\n.fa-diagram-predecessor {\n --fa: "\\e477";\n}\n\n.fa-diagram-successor {\n --fa: "\\e47a";\n}\n\n.fa-earth-oceania {\n --fa: "\\e47b";\n}\n\n.fa-globe-oceania {\n --fa: "\\e47b";\n}\n\n.fa-bug-slash {\n --fa: "\\e490";\n}\n\n.fa-file-circle-plus {\n --fa: "\\e494";\n}\n\n.fa-shop-lock {\n --fa: "\\e4a5";\n}\n\n.fa-virus-covid {\n --fa: "\\e4a8";\n}\n\n.fa-virus-covid-slash {\n --fa: "\\e4a9";\n}\n\n.fa-anchor-circle-check {\n --fa: "\\e4aa";\n}\n\n.fa-anchor-circle-exclamation {\n --fa: "\\e4ab";\n}\n\n.fa-anchor-circle-xmark {\n --fa: "\\e4ac";\n}\n\n.fa-anchor-lock {\n --fa: "\\e4ad";\n}\n\n.fa-arrow-down-up-across-line {\n --fa: "\\e4af";\n}\n\n.fa-arrow-down-up-lock {\n --fa: "\\e4b0";\n}\n\n.fa-arrow-right-to-city {\n --fa: "\\e4b3";\n}\n\n.fa-arrow-up-from-ground-water {\n --fa: "\\e4b5";\n}\n\n.fa-arrow-up-from-water-pump {\n --fa: "\\e4b6";\n}\n\n.fa-arrow-up-right-dots {\n --fa: "\\e4b7";\n}\n\n.fa-arrows-down-to-line {\n --fa: "\\e4b8";\n}\n\n.fa-arrows-down-to-people {\n --fa: "\\e4b9";\n}\n\n.fa-arrows-left-right-to-line {\n --fa: "\\e4ba";\n}\n\n.fa-arrows-spin {\n --fa: "\\e4bb";\n}\n\n.fa-arrows-split-up-and-left {\n --fa: "\\e4bc";\n}\n\n.fa-arrows-to-circle {\n --fa: "\\e4bd";\n}\n\n.fa-arrows-to-dot {\n --fa: "\\e4be";\n}\n\n.fa-arrows-to-eye {\n --fa: "\\e4bf";\n}\n\n.fa-arrows-turn-right {\n --fa: "\\e4c0";\n}\n\n.fa-arrows-turn-to-dots {\n --fa: "\\e4c1";\n}\n\n.fa-arrows-up-to-line {\n --fa: "\\e4c2";\n}\n\n.fa-bore-hole {\n --fa: "\\e4c3";\n}\n\n.fa-bottle-droplet {\n --fa: "\\e4c4";\n}\n\n.fa-bottle-water {\n --fa: "\\e4c5";\n}\n\n.fa-bowl-food {\n --fa: "\\e4c6";\n}\n\n.fa-boxes-packing {\n --fa: "\\e4c7";\n}\n\n.fa-bridge {\n --fa: "\\e4c8";\n}\n\n.fa-bridge-circle-check {\n --fa: "\\e4c9";\n}\n\n.fa-bridge-circle-exclamation {\n --fa: "\\e4ca";\n}\n\n.fa-bridge-circle-xmark {\n --fa: "\\e4cb";\n}\n\n.fa-bridge-lock {\n --fa: "\\e4cc";\n}\n\n.fa-bridge-water {\n --fa: "\\e4ce";\n}\n\n.fa-bucket {\n --fa: "\\e4cf";\n}\n\n.fa-bugs {\n --fa: "\\e4d0";\n}\n\n.fa-building-circle-arrow-right {\n --fa: "\\e4d1";\n}\n\n.fa-building-circle-check {\n --fa: "\\e4d2";\n}\n\n.fa-building-circle-exclamation {\n --fa: "\\e4d3";\n}\n\n.fa-building-circle-xmark {\n --fa: "\\e4d4";\n}\n\n.fa-building-flag {\n --fa: "\\e4d5";\n}\n\n.fa-building-lock {\n --fa: "\\e4d6";\n}\n\n.fa-building-ngo {\n --fa: "\\e4d7";\n}\n\n.fa-building-shield {\n --fa: "\\e4d8";\n}\n\n.fa-building-un {\n --fa: "\\e4d9";\n}\n\n.fa-building-user {\n --fa: "\\e4da";\n}\n\n.fa-building-wheat {\n --fa: "\\e4db";\n}\n\n.fa-burst {\n --fa: "\\e4dc";\n}\n\n.fa-car-on {\n --fa: "\\e4dd";\n}\n\n.fa-car-tunnel {\n --fa: "\\e4de";\n}\n\n.fa-child-combatant {\n --fa: "\\e4e0";\n}\n\n.fa-child-rifle {\n --fa: "\\e4e0";\n}\n\n.fa-children {\n --fa: "\\e4e1";\n}\n\n.fa-circle-nodes {\n --fa: "\\e4e2";\n}\n\n.fa-clipboard-question {\n --fa: "\\e4e3";\n}\n\n.fa-cloud-showers-water {\n --fa: "\\e4e4";\n}\n\n.fa-computer {\n --fa: "\\e4e5";\n}\n\n.fa-cubes-stacked {\n --fa: "\\e4e6";\n}\n\n.fa-envelope-circle-check {\n --fa: "\\e4e8";\n}\n\n.fa-explosion {\n --fa: "\\e4e9";\n}\n\n.fa-ferry {\n --fa: "\\e4ea";\n}\n\n.fa-file-circle-exclamation {\n --fa: "\\e4eb";\n}\n\n.fa-file-circle-minus {\n --fa: "\\e4ed";\n}\n\n.fa-file-circle-question {\n --fa: "\\e4ef";\n}\n\n.fa-file-shield {\n --fa: "\\e4f0";\n}\n\n.fa-fire-burner {\n --fa: "\\e4f1";\n}\n\n.fa-fish-fins {\n --fa: "\\e4f2";\n}\n\n.fa-flask-vial {\n --fa: "\\e4f3";\n}\n\n.fa-glass-water {\n --fa: "\\e4f4";\n}\n\n.fa-glass-water-droplet {\n --fa: "\\e4f5";\n}\n\n.fa-group-arrows-rotate {\n --fa: "\\e4f6";\n}\n\n.fa-hand-holding-hand {\n --fa: "\\e4f7";\n}\n\n.fa-handcuffs {\n --fa: "\\e4f8";\n}\n\n.fa-hands-bound {\n --fa: "\\e4f9";\n}\n\n.fa-hands-holding-child {\n --fa: "\\e4fa";\n}\n\n.fa-hands-holding-circle {\n --fa: "\\e4fb";\n}\n\n.fa-heart-circle-bolt {\n --fa: "\\e4fc";\n}\n\n.fa-heart-circle-check {\n --fa: "\\e4fd";\n}\n\n.fa-heart-circle-exclamation {\n --fa: "\\e4fe";\n}\n\n.fa-heart-circle-minus {\n --fa: "\\e4ff";\n}\n\n.fa-heart-circle-plus {\n --fa: "\\e500";\n}\n\n.fa-heart-circle-xmark {\n --fa: "\\e501";\n}\n\n.fa-helicopter-symbol {\n --fa: "\\e502";\n}\n\n.fa-helmet-un {\n --fa: "\\e503";\n}\n\n.fa-hill-avalanche {\n --fa: "\\e507";\n}\n\n.fa-hill-rockslide {\n --fa: "\\e508";\n}\n\n.fa-house-circle-check {\n --fa: "\\e509";\n}\n\n.fa-house-circle-exclamation {\n --fa: "\\e50a";\n}\n\n.fa-house-circle-xmark {\n --fa: "\\e50b";\n}\n\n.fa-house-fire {\n --fa: "\\e50c";\n}\n\n.fa-house-flag {\n --fa: "\\e50d";\n}\n\n.fa-house-flood-water {\n --fa: "\\e50e";\n}\n\n.fa-house-flood-water-circle-arrow-right {\n --fa: "\\e50f";\n}\n\n.fa-house-lock {\n --fa: "\\e510";\n}\n\n.fa-house-medical-circle-check {\n --fa: "\\e511";\n}\n\n.fa-house-medical-circle-exclamation {\n --fa: "\\e512";\n}\n\n.fa-house-medical-circle-xmark {\n --fa: "\\e513";\n}\n\n.fa-house-medical-flag {\n --fa: "\\e514";\n}\n\n.fa-house-tsunami {\n --fa: "\\e515";\n}\n\n.fa-jar {\n --fa: "\\e516";\n}\n\n.fa-jar-wheat {\n --fa: "\\e517";\n}\n\n.fa-jet-fighter-up {\n --fa: "\\e518";\n}\n\n.fa-jug-detergent {\n --fa: "\\e519";\n}\n\n.fa-kitchen-set {\n --fa: "\\e51a";\n}\n\n.fa-land-mine-on {\n --fa: "\\e51b";\n}\n\n.fa-landmark-flag {\n --fa: "\\e51c";\n}\n\n.fa-laptop-file {\n --fa: "\\e51d";\n}\n\n.fa-lines-leaning {\n --fa: "\\e51e";\n}\n\n.fa-location-pin-lock {\n --fa: "\\e51f";\n}\n\n.fa-locust {\n --fa: "\\e520";\n}\n\n.fa-magnifying-glass-arrow-right {\n --fa: "\\e521";\n}\n\n.fa-magnifying-glass-chart {\n --fa: "\\e522";\n}\n\n.fa-mars-and-venus-burst {\n --fa: "\\e523";\n}\n\n.fa-mask-ventilator {\n --fa: "\\e524";\n}\n\n.fa-mattress-pillow {\n --fa: "\\e525";\n}\n\n.fa-mobile-retro {\n --fa: "\\e527";\n}\n\n.fa-money-bill-transfer {\n --fa: "\\e528";\n}\n\n.fa-money-bill-trend-up {\n --fa: "\\e529";\n}\n\n.fa-money-bill-wheat {\n --fa: "\\e52a";\n}\n\n.fa-mosquito {\n --fa: "\\e52b";\n}\n\n.fa-mosquito-net {\n --fa: "\\e52c";\n}\n\n.fa-mound {\n --fa: "\\e52d";\n}\n\n.fa-mountain-city {\n --fa: "\\e52e";\n}\n\n.fa-mountain-sun {\n --fa: "\\e52f";\n}\n\n.fa-oil-well {\n --fa: "\\e532";\n}\n\n.fa-people-group {\n --fa: "\\e533";\n}\n\n.fa-people-line {\n --fa: "\\e534";\n}\n\n.fa-people-pulling {\n --fa: "\\e535";\n}\n\n.fa-people-robbery {\n --fa: "\\e536";\n}\n\n.fa-people-roof {\n --fa: "\\e537";\n}\n\n.fa-person-arrow-down-to-line {\n --fa: "\\e538";\n}\n\n.fa-person-arrow-up-from-line {\n --fa: "\\e539";\n}\n\n.fa-person-breastfeeding {\n --fa: "\\e53a";\n}\n\n.fa-person-burst {\n --fa: "\\e53b";\n}\n\n.fa-person-cane {\n --fa: "\\e53c";\n}\n\n.fa-person-chalkboard {\n --fa: "\\e53d";\n}\n\n.fa-person-circle-check {\n --fa: "\\e53e";\n}\n\n.fa-person-circle-exclamation {\n --fa: "\\e53f";\n}\n\n.fa-person-circle-minus {\n --fa: "\\e540";\n}\n\n.fa-person-circle-plus {\n --fa: "\\e541";\n}\n\n.fa-person-circle-question {\n --fa: "\\e542";\n}\n\n.fa-person-circle-xmark {\n --fa: "\\e543";\n}\n\n.fa-person-dress-burst {\n --fa: "\\e544";\n}\n\n.fa-person-drowning {\n --fa: "\\e545";\n}\n\n.fa-person-falling {\n --fa: "\\e546";\n}\n\n.fa-person-falling-burst {\n --fa: "\\e547";\n}\n\n.fa-person-half-dress {\n --fa: "\\e548";\n}\n\n.fa-person-harassing {\n --fa: "\\e549";\n}\n\n.fa-person-military-pointing {\n --fa: "\\e54a";\n}\n\n.fa-person-military-rifle {\n --fa: "\\e54b";\n}\n\n.fa-person-military-to-person {\n --fa: "\\e54c";\n}\n\n.fa-person-rays {\n --fa: "\\e54d";\n}\n\n.fa-person-rifle {\n --fa: "\\e54e";\n}\n\n.fa-person-shelter {\n --fa: "\\e54f";\n}\n\n.fa-person-walking-arrow-loop-left {\n --fa: "\\e551";\n}\n\n.fa-person-walking-arrow-right {\n --fa: "\\e552";\n}\n\n.fa-person-walking-dashed-line-arrow-right {\n --fa: "\\e553";\n}\n\n.fa-person-walking-luggage {\n --fa: "\\e554";\n}\n\n.fa-plane-circle-check {\n --fa: "\\e555";\n}\n\n.fa-plane-circle-exclamation {\n --fa: "\\e556";\n}\n\n.fa-plane-circle-xmark {\n --fa: "\\e557";\n}\n\n.fa-plane-lock {\n --fa: "\\e558";\n}\n\n.fa-plate-wheat {\n --fa: "\\e55a";\n}\n\n.fa-plug-circle-bolt {\n --fa: "\\e55b";\n}\n\n.fa-plug-circle-check {\n --fa: "\\e55c";\n}\n\n.fa-plug-circle-exclamation {\n --fa: "\\e55d";\n}\n\n.fa-plug-circle-minus {\n --fa: "\\e55e";\n}\n\n.fa-plug-circle-plus {\n --fa: "\\e55f";\n}\n\n.fa-plug-circle-xmark {\n --fa: "\\e560";\n}\n\n.fa-ranking-star {\n --fa: "\\e561";\n}\n\n.fa-road-barrier {\n --fa: "\\e562";\n}\n\n.fa-road-bridge {\n --fa: "\\e563";\n}\n\n.fa-road-circle-check {\n --fa: "\\e564";\n}\n\n.fa-road-circle-exclamation {\n --fa: "\\e565";\n}\n\n.fa-road-circle-xmark {\n --fa: "\\e566";\n}\n\n.fa-road-lock {\n --fa: "\\e567";\n}\n\n.fa-road-spikes {\n --fa: "\\e568";\n}\n\n.fa-rug {\n --fa: "\\e569";\n}\n\n.fa-sack-xmark {\n --fa: "\\e56a";\n}\n\n.fa-school-circle-check {\n --fa: "\\e56b";\n}\n\n.fa-school-circle-exclamation {\n --fa: "\\e56c";\n}\n\n.fa-school-circle-xmark {\n --fa: "\\e56d";\n}\n\n.fa-school-flag {\n --fa: "\\e56e";\n}\n\n.fa-school-lock {\n --fa: "\\e56f";\n}\n\n.fa-sheet-plastic {\n --fa: "\\e571";\n}\n\n.fa-shield-cat {\n --fa: "\\e572";\n}\n\n.fa-shield-dog {\n --fa: "\\e573";\n}\n\n.fa-shield-heart {\n --fa: "\\e574";\n}\n\n.fa-square-nfi {\n --fa: "\\e576";\n}\n\n.fa-square-person-confined {\n --fa: "\\e577";\n}\n\n.fa-square-virus {\n --fa: "\\e578";\n}\n\n.fa-staff-snake {\n --fa: "\\e579";\n}\n\n.fa-rod-asclepius {\n --fa: "\\e579";\n}\n\n.fa-rod-snake {\n --fa: "\\e579";\n}\n\n.fa-staff-aesculapius {\n --fa: "\\e579";\n}\n\n.fa-sun-plant-wilt {\n --fa: "\\e57a";\n}\n\n.fa-tarp {\n --fa: "\\e57b";\n}\n\n.fa-tarp-droplet {\n --fa: "\\e57c";\n}\n\n.fa-tent {\n --fa: "\\e57d";\n}\n\n.fa-tent-arrow-down-to-line {\n --fa: "\\e57e";\n}\n\n.fa-tent-arrow-left-right {\n --fa: "\\e57f";\n}\n\n.fa-tent-arrow-turn-left {\n --fa: "\\e580";\n}\n\n.fa-tent-arrows-down {\n --fa: "\\e581";\n}\n\n.fa-tents {\n --fa: "\\e582";\n}\n\n.fa-toilet-portable {\n --fa: "\\e583";\n}\n\n.fa-toilets-portable {\n --fa: "\\e584";\n}\n\n.fa-tower-cell {\n --fa: "\\e585";\n}\n\n.fa-tower-observation {\n --fa: "\\e586";\n}\n\n.fa-tree-city {\n --fa: "\\e587";\n}\n\n.fa-trowel {\n --fa: "\\e589";\n}\n\n.fa-trowel-bricks {\n --fa: "\\e58a";\n}\n\n.fa-truck-arrow-right {\n --fa: "\\e58b";\n}\n\n.fa-truck-droplet {\n --fa: "\\e58c";\n}\n\n.fa-truck-field {\n --fa: "\\e58d";\n}\n\n.fa-truck-field-un {\n --fa: "\\e58e";\n}\n\n.fa-truck-plane {\n --fa: "\\e58f";\n}\n\n.fa-users-between-lines {\n --fa: "\\e591";\n}\n\n.fa-users-line {\n --fa: "\\e592";\n}\n\n.fa-users-rays {\n --fa: "\\e593";\n}\n\n.fa-users-rectangle {\n --fa: "\\e594";\n}\n\n.fa-users-viewfinder {\n --fa: "\\e595";\n}\n\n.fa-vial-circle-check {\n --fa: "\\e596";\n}\n\n.fa-vial-virus {\n --fa: "\\e597";\n}\n\n.fa-wheat-awn-circle-exclamation {\n --fa: "\\e598";\n}\n\n.fa-worm {\n --fa: "\\e599";\n}\n\n.fa-xmarks-lines {\n --fa: "\\e59a";\n}\n\n.fa-child-dress {\n --fa: "\\e59c";\n}\n\n.fa-child-reaching {\n --fa: "\\e59d";\n}\n\n.fa-file-circle-check {\n --fa: "\\e5a0";\n}\n\n.fa-file-circle-xmark {\n --fa: "\\e5a1";\n}\n\n.fa-person-through-window {\n --fa: "\\e5a9";\n}\n\n.fa-plant-wilt {\n --fa: "\\e5aa";\n}\n\n.fa-stapler {\n --fa: "\\e5af";\n}\n\n.fa-train-tram {\n --fa: "\\e5b4";\n}\n\n.fa-table-cells-column-lock {\n --fa: "\\e678";\n}\n\n.fa-table-cells-row-lock {\n --fa: "\\e67a";\n}\n\n.fa-web-awesome {\n --fa: "\\e682";\n}\n\n.fa-thumbtack-slash {\n --fa: "\\e68f";\n}\n\n.fa-thumb-tack-slash {\n --fa: "\\e68f";\n}\n\n.fa-table-cells-row-unlock {\n --fa: "\\e691";\n}\n\n.fa-chart-diagram {\n --fa: "\\e695";\n}\n\n.fa-comment-nodes {\n --fa: "\\e696";\n}\n\n.fa-file-fragment {\n --fa: "\\e697";\n}\n\n.fa-file-half-dashed {\n --fa: "\\e698";\n}\n\n.fa-hexagon-nodes {\n --fa: "\\e699";\n}\n\n.fa-hexagon-nodes-bolt {\n --fa: "\\e69a";\n}\n\n.fa-square-binary {\n --fa: "\\e69b";\n}\n\n.fa-pentagon {\n --fa: "\\e790";\n}\n\n.fa-non-binary {\n --fa: "\\e807";\n}\n\n.fa-spiral {\n --fa: "\\e80a";\n}\n\n.fa-picture-in-picture {\n --fa: "\\e80b";\n}\n\n.fa-mobile-vibrate {\n --fa: "\\e816";\n}\n\n.fa-single-quote-left {\n --fa: "\\e81b";\n}\n\n.fa-single-quote-right {\n --fa: "\\e81c";\n}\n\n.fa-bus-side {\n --fa: "\\e81d";\n}\n\n.fa-septagon {\n --fa: "\\e820";\n}\n\n.fa-heptagon {\n --fa: "\\e820";\n}\n\n.fa-aquarius {\n --fa: "\\e845";\n}\n\n.fa-aries {\n --fa: "\\e846";\n}\n\n.fa-cancer {\n --fa: "\\e847";\n}\n\n.fa-capricorn {\n --fa: "\\e848";\n}\n\n.fa-gemini {\n --fa: "\\e849";\n}\n\n.fa-leo {\n --fa: "\\e84a";\n}\n\n.fa-libra {\n --fa: "\\e84b";\n}\n\n.fa-pisces {\n --fa: "\\e84c";\n}\n\n.fa-sagittarius {\n --fa: "\\e84d";\n}\n\n.fa-scorpio {\n --fa: "\\e84e";\n}\n\n.fa-taurus {\n --fa: "\\e84f";\n}\n\n.fa-virgo {\n --fa: "\\e850";\n}\n\n.fa-martini-glass-empty {\n --fa: "\\f000";\n}\n\n.fa-glass-martini {\n --fa: "\\f000";\n}\n\n.fa-music {\n --fa: "\\f001";\n}\n\n.fa-magnifying-glass {\n --fa: "\\f002";\n}\n\n.fa-search {\n --fa: "\\f002";\n}\n\n.fa-heart {\n --fa: "\\f004";\n}\n\n.fa-star {\n --fa: "\\f005";\n}\n\n.fa-user {\n --fa: "\\f007";\n}\n\n.fa-user-alt {\n --fa: "\\f007";\n}\n\n.fa-user-large {\n --fa: "\\f007";\n}\n\n.fa-film {\n --fa: "\\f008";\n}\n\n.fa-film-alt {\n --fa: "\\f008";\n}\n\n.fa-film-simple {\n --fa: "\\f008";\n}\n\n.fa-table-cells-large {\n --fa: "\\f009";\n}\n\n.fa-th-large {\n --fa: "\\f009";\n}\n\n.fa-table-cells {\n --fa: "\\f00a";\n}\n\n.fa-th {\n --fa: "\\f00a";\n}\n\n.fa-table-list {\n --fa: "\\f00b";\n}\n\n.fa-th-list {\n --fa: "\\f00b";\n}\n\n.fa-check {\n --fa: "\\f00c";\n}\n\n.fa-xmark {\n --fa: "\\f00d";\n}\n\n.fa-close {\n --fa: "\\f00d";\n}\n\n.fa-multiply {\n --fa: "\\f00d";\n}\n\n.fa-remove {\n --fa: "\\f00d";\n}\n\n.fa-times {\n --fa: "\\f00d";\n}\n\n.fa-magnifying-glass-plus {\n --fa: "\\f00e";\n}\n\n.fa-search-plus {\n --fa: "\\f00e";\n}\n\n.fa-magnifying-glass-minus {\n --fa: "\\f010";\n}\n\n.fa-search-minus {\n --fa: "\\f010";\n}\n\n.fa-power-off {\n --fa: "\\f011";\n}\n\n.fa-signal {\n --fa: "\\f012";\n}\n\n.fa-signal-5 {\n --fa: "\\f012";\n}\n\n.fa-signal-perfect {\n --fa: "\\f012";\n}\n\n.fa-gear {\n --fa: "\\f013";\n}\n\n.fa-cog {\n --fa: "\\f013";\n}\n\n.fa-house {\n --fa: "\\f015";\n}\n\n.fa-home {\n --fa: "\\f015";\n}\n\n.fa-home-alt {\n --fa: "\\f015";\n}\n\n.fa-home-lg-alt {\n --fa: "\\f015";\n}\n\n.fa-clock {\n --fa: "\\f017";\n}\n\n.fa-clock-four {\n --fa: "\\f017";\n}\n\n.fa-road {\n --fa: "\\f018";\n}\n\n.fa-download {\n --fa: "\\f019";\n}\n\n.fa-inbox {\n --fa: "\\f01c";\n}\n\n.fa-arrow-rotate-right {\n --fa: "\\f01e";\n}\n\n.fa-arrow-right-rotate {\n --fa: "\\f01e";\n}\n\n.fa-arrow-rotate-forward {\n --fa: "\\f01e";\n}\n\n.fa-redo {\n --fa: "\\f01e";\n}\n\n.fa-arrows-rotate {\n --fa: "\\f021";\n}\n\n.fa-refresh {\n --fa: "\\f021";\n}\n\n.fa-sync {\n --fa: "\\f021";\n}\n\n.fa-rectangle-list {\n --fa: "\\f022";\n}\n\n.fa-list-alt {\n --fa: "\\f022";\n}\n\n.fa-lock {\n --fa: "\\f023";\n}\n\n.fa-flag {\n --fa: "\\f024";\n}\n\n.fa-headphones {\n --fa: "\\f025";\n}\n\n.fa-headphones-alt {\n --fa: "\\f025";\n}\n\n.fa-headphones-simple {\n --fa: "\\f025";\n}\n\n.fa-volume-off {\n --fa: "\\f026";\n}\n\n.fa-volume-low {\n --fa: "\\f027";\n}\n\n.fa-volume-down {\n --fa: "\\f027";\n}\n\n.fa-volume-high {\n --fa: "\\f028";\n}\n\n.fa-volume-up {\n --fa: "\\f028";\n}\n\n.fa-qrcode {\n --fa: "\\f029";\n}\n\n.fa-barcode {\n --fa: "\\f02a";\n}\n\n.fa-tag {\n --fa: "\\f02b";\n}\n\n.fa-tags {\n --fa: "\\f02c";\n}\n\n.fa-book {\n --fa: "\\f02d";\n}\n\n.fa-bookmark {\n --fa: "\\f02e";\n}\n\n.fa-print {\n --fa: "\\f02f";\n}\n\n.fa-camera {\n --fa: "\\f030";\n}\n\n.fa-camera-alt {\n --fa: "\\f030";\n}\n\n.fa-font {\n --fa: "\\f031";\n}\n\n.fa-bold {\n --fa: "\\f032";\n}\n\n.fa-italic {\n --fa: "\\f033";\n}\n\n.fa-text-height {\n --fa: "\\f034";\n}\n\n.fa-text-width {\n --fa: "\\f035";\n}\n\n.fa-align-left {\n --fa: "\\f036";\n}\n\n.fa-align-center {\n --fa: "\\f037";\n}\n\n.fa-align-right {\n --fa: "\\f038";\n}\n\n.fa-align-justify {\n --fa: "\\f039";\n}\n\n.fa-list {\n --fa: "\\f03a";\n}\n\n.fa-list-squares {\n --fa: "\\f03a";\n}\n\n.fa-outdent {\n --fa: "\\f03b";\n}\n\n.fa-dedent {\n --fa: "\\f03b";\n}\n\n.fa-indent {\n --fa: "\\f03c";\n}\n\n.fa-video {\n --fa: "\\f03d";\n}\n\n.fa-video-camera {\n --fa: "\\f03d";\n}\n\n.fa-image {\n --fa: "\\f03e";\n}\n\n.fa-location-pin {\n --fa: "\\f041";\n}\n\n.fa-map-marker {\n --fa: "\\f041";\n}\n\n.fa-circle-half-stroke {\n --fa: "\\f042";\n}\n\n.fa-adjust {\n --fa: "\\f042";\n}\n\n.fa-droplet {\n --fa: "\\f043";\n}\n\n.fa-tint {\n --fa: "\\f043";\n}\n\n.fa-pen-to-square {\n --fa: "\\f044";\n}\n\n.fa-edit {\n --fa: "\\f044";\n}\n\n.fa-arrows-up-down-left-right {\n --fa: "\\f047";\n}\n\n.fa-arrows {\n --fa: "\\f047";\n}\n\n.fa-backward-step {\n --fa: "\\f048";\n}\n\n.fa-step-backward {\n --fa: "\\f048";\n}\n\n.fa-backward-fast {\n --fa: "\\f049";\n}\n\n.fa-fast-backward {\n --fa: "\\f049";\n}\n\n.fa-backward {\n --fa: "\\f04a";\n}\n\n.fa-play {\n --fa: "\\f04b";\n}\n\n.fa-pause {\n --fa: "\\f04c";\n}\n\n.fa-stop {\n --fa: "\\f04d";\n}\n\n.fa-forward {\n --fa: "\\f04e";\n}\n\n.fa-forward-fast {\n --fa: "\\f050";\n}\n\n.fa-fast-forward {\n --fa: "\\f050";\n}\n\n.fa-forward-step {\n --fa: "\\f051";\n}\n\n.fa-step-forward {\n --fa: "\\f051";\n}\n\n.fa-eject {\n --fa: "\\f052";\n}\n\n.fa-chevron-left {\n --fa: "\\f053";\n}\n\n.fa-chevron-right {\n --fa: "\\f054";\n}\n\n.fa-circle-plus {\n --fa: "\\f055";\n}\n\n.fa-plus-circle {\n --fa: "\\f055";\n}\n\n.fa-circle-minus {\n --fa: "\\f056";\n}\n\n.fa-minus-circle {\n --fa: "\\f056";\n}\n\n.fa-circle-xmark {\n --fa: "\\f057";\n}\n\n.fa-times-circle {\n --fa: "\\f057";\n}\n\n.fa-xmark-circle {\n --fa: "\\f057";\n}\n\n.fa-circle-check {\n --fa: "\\f058";\n}\n\n.fa-check-circle {\n --fa: "\\f058";\n}\n\n.fa-circle-question {\n --fa: "\\f059";\n}\n\n.fa-question-circle {\n --fa: "\\f059";\n}\n\n.fa-circle-info {\n --fa: "\\f05a";\n}\n\n.fa-info-circle {\n --fa: "\\f05a";\n}\n\n.fa-crosshairs {\n --fa: "\\f05b";\n}\n\n.fa-ban {\n --fa: "\\f05e";\n}\n\n.fa-cancel {\n --fa: "\\f05e";\n}\n\n.fa-arrow-left {\n --fa: "\\f060";\n}\n\n.fa-arrow-right {\n --fa: "\\f061";\n}\n\n.fa-arrow-up {\n --fa: "\\f062";\n}\n\n.fa-arrow-down {\n --fa: "\\f063";\n}\n\n.fa-share {\n --fa: "\\f064";\n}\n\n.fa-mail-forward {\n --fa: "\\f064";\n}\n\n.fa-expand {\n --fa: "\\f065";\n}\n\n.fa-compress {\n --fa: "\\f066";\n}\n\n.fa-minus {\n --fa: "\\f068";\n}\n\n.fa-subtract {\n --fa: "\\f068";\n}\n\n.fa-circle-exclamation {\n --fa: "\\f06a";\n}\n\n.fa-exclamation-circle {\n --fa: "\\f06a";\n}\n\n.fa-gift {\n --fa: "\\f06b";\n}\n\n.fa-leaf {\n --fa: "\\f06c";\n}\n\n.fa-fire {\n --fa: "\\f06d";\n}\n\n.fa-eye {\n --fa: "\\f06e";\n}\n\n.fa-eye-slash {\n --fa: "\\f070";\n}\n\n.fa-triangle-exclamation {\n --fa: "\\f071";\n}\n\n.fa-exclamation-triangle {\n --fa: "\\f071";\n}\n\n.fa-warning {\n --fa: "\\f071";\n}\n\n.fa-plane {\n --fa: "\\f072";\n}\n\n.fa-calendar-days {\n --fa: "\\f073";\n}\n\n.fa-calendar-alt {\n --fa: "\\f073";\n}\n\n.fa-shuffle {\n --fa: "\\f074";\n}\n\n.fa-random {\n --fa: "\\f074";\n}\n\n.fa-comment {\n --fa: "\\f075";\n}\n\n.fa-magnet {\n --fa: "\\f076";\n}\n\n.fa-chevron-up {\n --fa: "\\f077";\n}\n\n.fa-chevron-down {\n --fa: "\\f078";\n}\n\n.fa-retweet {\n --fa: "\\f079";\n}\n\n.fa-cart-shopping {\n --fa: "\\f07a";\n}\n\n.fa-shopping-cart {\n --fa: "\\f07a";\n}\n\n.fa-folder {\n --fa: "\\f07b";\n}\n\n.fa-folder-blank {\n --fa: "\\f07b";\n}\n\n.fa-folder-open {\n --fa: "\\f07c";\n}\n\n.fa-arrows-up-down {\n --fa: "\\f07d";\n}\n\n.fa-arrows-v {\n --fa: "\\f07d";\n}\n\n.fa-arrows-left-right {\n --fa: "\\f07e";\n}\n\n.fa-arrows-h {\n --fa: "\\f07e";\n}\n\n.fa-chart-bar {\n --fa: "\\f080";\n}\n\n.fa-bar-chart {\n --fa: "\\f080";\n}\n\n.fa-camera-retro {\n --fa: "\\f083";\n}\n\n.fa-key {\n --fa: "\\f084";\n}\n\n.fa-gears {\n --fa: "\\f085";\n}\n\n.fa-cogs {\n --fa: "\\f085";\n}\n\n.fa-comments {\n --fa: "\\f086";\n}\n\n.fa-star-half {\n --fa: "\\f089";\n}\n\n.fa-arrow-right-from-bracket {\n --fa: "\\f08b";\n}\n\n.fa-sign-out {\n --fa: "\\f08b";\n}\n\n.fa-thumbtack {\n --fa: "\\f08d";\n}\n\n.fa-thumb-tack {\n --fa: "\\f08d";\n}\n\n.fa-arrow-up-right-from-square {\n --fa: "\\f08e";\n}\n\n.fa-external-link {\n --fa: "\\f08e";\n}\n\n.fa-arrow-right-to-bracket {\n --fa: "\\f090";\n}\n\n.fa-sign-in {\n --fa: "\\f090";\n}\n\n.fa-trophy {\n --fa: "\\f091";\n}\n\n.fa-upload {\n --fa: "\\f093";\n}\n\n.fa-lemon {\n --fa: "\\f094";\n}\n\n.fa-phone {\n --fa: "\\f095";\n}\n\n.fa-square-phone {\n --fa: "\\f098";\n}\n\n.fa-phone-square {\n --fa: "\\f098";\n}\n\n.fa-unlock {\n --fa: "\\f09c";\n}\n\n.fa-credit-card {\n --fa: "\\f09d";\n}\n\n.fa-credit-card-alt {\n --fa: "\\f09d";\n}\n\n.fa-rss {\n --fa: "\\f09e";\n}\n\n.fa-feed {\n --fa: "\\f09e";\n}\n\n.fa-hard-drive {\n --fa: "\\f0a0";\n}\n\n.fa-hdd {\n --fa: "\\f0a0";\n}\n\n.fa-bullhorn {\n --fa: "\\f0a1";\n}\n\n.fa-certificate {\n --fa: "\\f0a3";\n}\n\n.fa-hand-point-right {\n --fa: "\\f0a4";\n}\n\n.fa-hand-point-left {\n --fa: "\\f0a5";\n}\n\n.fa-hand-point-up {\n --fa: "\\f0a6";\n}\n\n.fa-hand-point-down {\n --fa: "\\f0a7";\n}\n\n.fa-circle-arrow-left {\n --fa: "\\f0a8";\n}\n\n.fa-arrow-circle-left {\n --fa: "\\f0a8";\n}\n\n.fa-circle-arrow-right {\n --fa: "\\f0a9";\n}\n\n.fa-arrow-circle-right {\n --fa: "\\f0a9";\n}\n\n.fa-circle-arrow-up {\n --fa: "\\f0aa";\n}\n\n.fa-arrow-circle-up {\n --fa: "\\f0aa";\n}\n\n.fa-circle-arrow-down {\n --fa: "\\f0ab";\n}\n\n.fa-arrow-circle-down {\n --fa: "\\f0ab";\n}\n\n.fa-globe {\n --fa: "\\f0ac";\n}\n\n.fa-wrench {\n --fa: "\\f0ad";\n}\n\n.fa-list-check {\n --fa: "\\f0ae";\n}\n\n.fa-tasks {\n --fa: "\\f0ae";\n}\n\n.fa-filter {\n --fa: "\\f0b0";\n}\n\n.fa-briefcase {\n --fa: "\\f0b1";\n}\n\n.fa-up-down-left-right {\n --fa: "\\f0b2";\n}\n\n.fa-arrows-alt {\n --fa: "\\f0b2";\n}\n\n.fa-users {\n --fa: "\\f0c0";\n}\n\n.fa-link {\n --fa: "\\f0c1";\n}\n\n.fa-chain {\n --fa: "\\f0c1";\n}\n\n.fa-cloud {\n --fa: "\\f0c2";\n}\n\n.fa-flask {\n --fa: "\\f0c3";\n}\n\n.fa-scissors {\n --fa: "\\f0c4";\n}\n\n.fa-cut {\n --fa: "\\f0c4";\n}\n\n.fa-copy {\n --fa: "\\f0c5";\n}\n\n.fa-paperclip {\n --fa: "\\f0c6";\n}\n\n.fa-floppy-disk {\n --fa: "\\f0c7";\n}\n\n.fa-save {\n --fa: "\\f0c7";\n}\n\n.fa-square {\n --fa: "\\f0c8";\n}\n\n.fa-bars {\n --fa: "\\f0c9";\n}\n\n.fa-navicon {\n --fa: "\\f0c9";\n}\n\n.fa-list-ul {\n --fa: "\\f0ca";\n}\n\n.fa-list-dots {\n --fa: "\\f0ca";\n}\n\n.fa-list-ol {\n --fa: "\\f0cb";\n}\n\n.fa-list-1-2 {\n --fa: "\\f0cb";\n}\n\n.fa-list-numeric {\n --fa: "\\f0cb";\n}\n\n.fa-strikethrough {\n --fa: "\\f0cc";\n}\n\n.fa-underline {\n --fa: "\\f0cd";\n}\n\n.fa-table {\n --fa: "\\f0ce";\n}\n\n.fa-wand-magic {\n --fa: "\\f0d0";\n}\n\n.fa-magic {\n --fa: "\\f0d0";\n}\n\n.fa-truck {\n --fa: "\\f0d1";\n}\n\n.fa-money-bill {\n --fa: "\\f0d6";\n}\n\n.fa-caret-down {\n --fa: "\\f0d7";\n}\n\n.fa-caret-up {\n --fa: "\\f0d8";\n}\n\n.fa-caret-left {\n --fa: "\\f0d9";\n}\n\n.fa-caret-right {\n --fa: "\\f0da";\n}\n\n.fa-table-columns {\n --fa: "\\f0db";\n}\n\n.fa-columns {\n --fa: "\\f0db";\n}\n\n.fa-sort {\n --fa: "\\f0dc";\n}\n\n.fa-unsorted {\n --fa: "\\f0dc";\n}\n\n.fa-sort-down {\n --fa: "\\f0dd";\n}\n\n.fa-sort-desc {\n --fa: "\\f0dd";\n}\n\n.fa-sort-up {\n --fa: "\\f0de";\n}\n\n.fa-sort-asc {\n --fa: "\\f0de";\n}\n\n.fa-envelope {\n --fa: "\\f0e0";\n}\n\n.fa-arrow-rotate-left {\n --fa: "\\f0e2";\n}\n\n.fa-arrow-left-rotate {\n --fa: "\\f0e2";\n}\n\n.fa-arrow-rotate-back {\n --fa: "\\f0e2";\n}\n\n.fa-arrow-rotate-backward {\n --fa: "\\f0e2";\n}\n\n.fa-undo {\n --fa: "\\f0e2";\n}\n\n.fa-gavel {\n --fa: "\\f0e3";\n}\n\n.fa-legal {\n --fa: "\\f0e3";\n}\n\n.fa-bolt {\n --fa: "\\f0e7";\n}\n\n.fa-zap {\n --fa: "\\f0e7";\n}\n\n.fa-sitemap {\n --fa: "\\f0e8";\n}\n\n.fa-umbrella {\n --fa: "\\f0e9";\n}\n\n.fa-paste {\n --fa: "\\f0ea";\n}\n\n.fa-file-clipboard {\n --fa: "\\f0ea";\n}\n\n.fa-lightbulb {\n --fa: "\\f0eb";\n}\n\n.fa-arrow-right-arrow-left {\n --fa: "\\f0ec";\n}\n\n.fa-exchange {\n --fa: "\\f0ec";\n}\n\n.fa-cloud-arrow-down {\n --fa: "\\f0ed";\n}\n\n.fa-cloud-download {\n --fa: "\\f0ed";\n}\n\n.fa-cloud-download-alt {\n --fa: "\\f0ed";\n}\n\n.fa-cloud-arrow-up {\n --fa: "\\f0ee";\n}\n\n.fa-cloud-upload {\n --fa: "\\f0ee";\n}\n\n.fa-cloud-upload-alt {\n --fa: "\\f0ee";\n}\n\n.fa-user-doctor {\n --fa: "\\f0f0";\n}\n\n.fa-user-md {\n --fa: "\\f0f0";\n}\n\n.fa-stethoscope {\n --fa: "\\f0f1";\n}\n\n.fa-suitcase {\n --fa: "\\f0f2";\n}\n\n.fa-bell {\n --fa: "\\f0f3";\n}\n\n.fa-mug-saucer {\n --fa: "\\f0f4";\n}\n\n.fa-coffee {\n --fa: "\\f0f4";\n}\n\n.fa-hospital {\n --fa: "\\f0f8";\n}\n\n.fa-hospital-alt {\n --fa: "\\f0f8";\n}\n\n.fa-hospital-wide {\n --fa: "\\f0f8";\n}\n\n.fa-truck-medical {\n --fa: "\\f0f9";\n}\n\n.fa-ambulance {\n --fa: "\\f0f9";\n}\n\n.fa-suitcase-medical {\n --fa: "\\f0fa";\n}\n\n.fa-medkit {\n --fa: "\\f0fa";\n}\n\n.fa-jet-fighter {\n --fa: "\\f0fb";\n}\n\n.fa-fighter-jet {\n --fa: "\\f0fb";\n}\n\n.fa-beer-mug-empty {\n --fa: "\\f0fc";\n}\n\n.fa-beer {\n --fa: "\\f0fc";\n}\n\n.fa-square-h {\n --fa: "\\f0fd";\n}\n\n.fa-h-square {\n --fa: "\\f0fd";\n}\n\n.fa-square-plus {\n --fa: "\\f0fe";\n}\n\n.fa-plus-square {\n --fa: "\\f0fe";\n}\n\n.fa-angles-left {\n --fa: "\\f100";\n}\n\n.fa-angle-double-left {\n --fa: "\\f100";\n}\n\n.fa-angles-right {\n --fa: "\\f101";\n}\n\n.fa-angle-double-right {\n --fa: "\\f101";\n}\n\n.fa-angles-up {\n --fa: "\\f102";\n}\n\n.fa-angle-double-up {\n --fa: "\\f102";\n}\n\n.fa-angles-down {\n --fa: "\\f103";\n}\n\n.fa-angle-double-down {\n --fa: "\\f103";\n}\n\n.fa-angle-left {\n --fa: "\\f104";\n}\n\n.fa-angle-right {\n --fa: "\\f105";\n}\n\n.fa-angle-up {\n --fa: "\\f106";\n}\n\n.fa-angle-down {\n --fa: "\\f107";\n}\n\n.fa-laptop {\n --fa: "\\f109";\n}\n\n.fa-tablet-button {\n --fa: "\\f10a";\n}\n\n.fa-mobile-button {\n --fa: "\\f10b";\n}\n\n.fa-quote-left {\n --fa: "\\f10d";\n}\n\n.fa-quote-left-alt {\n --fa: "\\f10d";\n}\n\n.fa-quote-right {\n --fa: "\\f10e";\n}\n\n.fa-quote-right-alt {\n --fa: "\\f10e";\n}\n\n.fa-spinner {\n --fa: "\\f110";\n}\n\n.fa-circle {\n --fa: "\\f111";\n}\n\n.fa-face-smile {\n --fa: "\\f118";\n}\n\n.fa-smile {\n --fa: "\\f118";\n}\n\n.fa-face-frown {\n --fa: "\\f119";\n}\n\n.fa-frown {\n --fa: "\\f119";\n}\n\n.fa-face-meh {\n --fa: "\\f11a";\n}\n\n.fa-meh {\n --fa: "\\f11a";\n}\n\n.fa-gamepad {\n --fa: "\\f11b";\n}\n\n.fa-keyboard {\n --fa: "\\f11c";\n}\n\n.fa-flag-checkered {\n --fa: "\\f11e";\n}\n\n.fa-terminal {\n --fa: "\\f120";\n}\n\n.fa-code {\n --fa: "\\f121";\n}\n\n.fa-reply-all {\n --fa: "\\f122";\n}\n\n.fa-mail-reply-all {\n --fa: "\\f122";\n}\n\n.fa-location-arrow {\n --fa: "\\f124";\n}\n\n.fa-crop {\n --fa: "\\f125";\n}\n\n.fa-code-branch {\n --fa: "\\f126";\n}\n\n.fa-link-slash {\n --fa: "\\f127";\n}\n\n.fa-chain-broken {\n --fa: "\\f127";\n}\n\n.fa-chain-slash {\n --fa: "\\f127";\n}\n\n.fa-unlink {\n --fa: "\\f127";\n}\n\n.fa-info {\n --fa: "\\f129";\n}\n\n.fa-superscript {\n --fa: "\\f12b";\n}\n\n.fa-subscript {\n --fa: "\\f12c";\n}\n\n.fa-eraser {\n --fa: "\\f12d";\n}\n\n.fa-puzzle-piece {\n --fa: "\\f12e";\n}\n\n.fa-microphone {\n --fa: "\\f130";\n}\n\n.fa-microphone-slash {\n --fa: "\\f131";\n}\n\n.fa-shield {\n --fa: "\\f132";\n}\n\n.fa-shield-blank {\n --fa: "\\f132";\n}\n\n.fa-calendar {\n --fa: "\\f133";\n}\n\n.fa-fire-extinguisher {\n --fa: "\\f134";\n}\n\n.fa-rocket {\n --fa: "\\f135";\n}\n\n.fa-circle-chevron-left {\n --fa: "\\f137";\n}\n\n.fa-chevron-circle-left {\n --fa: "\\f137";\n}\n\n.fa-circle-chevron-right {\n --fa: "\\f138";\n}\n\n.fa-chevron-circle-right {\n --fa: "\\f138";\n}\n\n.fa-circle-chevron-up {\n --fa: "\\f139";\n}\n\n.fa-chevron-circle-up {\n --fa: "\\f139";\n}\n\n.fa-circle-chevron-down {\n --fa: "\\f13a";\n}\n\n.fa-chevron-circle-down {\n --fa: "\\f13a";\n}\n\n.fa-anchor {\n --fa: "\\f13d";\n}\n\n.fa-unlock-keyhole {\n --fa: "\\f13e";\n}\n\n.fa-unlock-alt {\n --fa: "\\f13e";\n}\n\n.fa-bullseye {\n --fa: "\\f140";\n}\n\n.fa-ellipsis {\n --fa: "\\f141";\n}\n\n.fa-ellipsis-h {\n --fa: "\\f141";\n}\n\n.fa-ellipsis-vertical {\n --fa: "\\f142";\n}\n\n.fa-ellipsis-v {\n --fa: "\\f142";\n}\n\n.fa-square-rss {\n --fa: "\\f143";\n}\n\n.fa-rss-square {\n --fa: "\\f143";\n}\n\n.fa-circle-play {\n --fa: "\\f144";\n}\n\n.fa-play-circle {\n --fa: "\\f144";\n}\n\n.fa-ticket {\n --fa: "\\f145";\n}\n\n.fa-square-minus {\n --fa: "\\f146";\n}\n\n.fa-minus-square {\n --fa: "\\f146";\n}\n\n.fa-arrow-turn-up {\n --fa: "\\f148";\n}\n\n.fa-level-up {\n --fa: "\\f148";\n}\n\n.fa-arrow-turn-down {\n --fa: "\\f149";\n}\n\n.fa-level-down {\n --fa: "\\f149";\n}\n\n.fa-square-check {\n --fa: "\\f14a";\n}\n\n.fa-check-square {\n --fa: "\\f14a";\n}\n\n.fa-square-pen {\n --fa: "\\f14b";\n}\n\n.fa-pen-square {\n --fa: "\\f14b";\n}\n\n.fa-pencil-square {\n --fa: "\\f14b";\n}\n\n.fa-square-arrow-up-right {\n --fa: "\\f14c";\n}\n\n.fa-external-link-square {\n --fa: "\\f14c";\n}\n\n.fa-share-from-square {\n --fa: "\\f14d";\n}\n\n.fa-share-square {\n --fa: "\\f14d";\n}\n\n.fa-compass {\n --fa: "\\f14e";\n}\n\n.fa-square-caret-down {\n --fa: "\\f150";\n}\n\n.fa-caret-square-down {\n --fa: "\\f150";\n}\n\n.fa-square-caret-up {\n --fa: "\\f151";\n}\n\n.fa-caret-square-up {\n --fa: "\\f151";\n}\n\n.fa-square-caret-right {\n --fa: "\\f152";\n}\n\n.fa-caret-square-right {\n --fa: "\\f152";\n}\n\n.fa-euro-sign {\n --fa: "\\f153";\n}\n\n.fa-eur {\n --fa: "\\f153";\n}\n\n.fa-euro {\n --fa: "\\f153";\n}\n\n.fa-sterling-sign {\n --fa: "\\f154";\n}\n\n.fa-gbp {\n --fa: "\\f154";\n}\n\n.fa-pound-sign {\n --fa: "\\f154";\n}\n\n.fa-rupee-sign {\n --fa: "\\f156";\n}\n\n.fa-rupee {\n --fa: "\\f156";\n}\n\n.fa-yen-sign {\n --fa: "\\f157";\n}\n\n.fa-cny {\n --fa: "\\f157";\n}\n\n.fa-jpy {\n --fa: "\\f157";\n}\n\n.fa-rmb {\n --fa: "\\f157";\n}\n\n.fa-yen {\n --fa: "\\f157";\n}\n\n.fa-ruble-sign {\n --fa: "\\f158";\n}\n\n.fa-rouble {\n --fa: "\\f158";\n}\n\n.fa-rub {\n --fa: "\\f158";\n}\n\n.fa-ruble {\n --fa: "\\f158";\n}\n\n.fa-won-sign {\n --fa: "\\f159";\n}\n\n.fa-krw {\n --fa: "\\f159";\n}\n\n.fa-won {\n --fa: "\\f159";\n}\n\n.fa-file {\n --fa: "\\f15b";\n}\n\n.fa-file-lines {\n --fa: "\\f15c";\n}\n\n.fa-file-alt {\n --fa: "\\f15c";\n}\n\n.fa-file-text {\n --fa: "\\f15c";\n}\n\n.fa-arrow-down-a-z {\n --fa: "\\f15d";\n}\n\n.fa-sort-alpha-asc {\n --fa: "\\f15d";\n}\n\n.fa-sort-alpha-down {\n --fa: "\\f15d";\n}\n\n.fa-arrow-up-a-z {\n --fa: "\\f15e";\n}\n\n.fa-sort-alpha-up {\n --fa: "\\f15e";\n}\n\n.fa-arrow-down-wide-short {\n --fa: "\\f160";\n}\n\n.fa-sort-amount-asc {\n --fa: "\\f160";\n}\n\n.fa-sort-amount-down {\n --fa: "\\f160";\n}\n\n.fa-arrow-up-wide-short {\n --fa: "\\f161";\n}\n\n.fa-sort-amount-up {\n --fa: "\\f161";\n}\n\n.fa-arrow-down-1-9 {\n --fa: "\\f162";\n}\n\n.fa-sort-numeric-asc {\n --fa: "\\f162";\n}\n\n.fa-sort-numeric-down {\n --fa: "\\f162";\n}\n\n.fa-arrow-up-1-9 {\n --fa: "\\f163";\n}\n\n.fa-sort-numeric-up {\n --fa: "\\f163";\n}\n\n.fa-thumbs-up {\n --fa: "\\f164";\n}\n\n.fa-thumbs-down {\n --fa: "\\f165";\n}\n\n.fa-arrow-down-long {\n --fa: "\\f175";\n}\n\n.fa-long-arrow-down {\n --fa: "\\f175";\n}\n\n.fa-arrow-up-long {\n --fa: "\\f176";\n}\n\n.fa-long-arrow-up {\n --fa: "\\f176";\n}\n\n.fa-arrow-left-long {\n --fa: "\\f177";\n}\n\n.fa-long-arrow-left {\n --fa: "\\f177";\n}\n\n.fa-arrow-right-long {\n --fa: "\\f178";\n}\n\n.fa-long-arrow-right {\n --fa: "\\f178";\n}\n\n.fa-person-dress {\n --fa: "\\f182";\n}\n\n.fa-female {\n --fa: "\\f182";\n}\n\n.fa-person {\n --fa: "\\f183";\n}\n\n.fa-male {\n --fa: "\\f183";\n}\n\n.fa-sun {\n --fa: "\\f185";\n}\n\n.fa-moon {\n --fa: "\\f186";\n}\n\n.fa-box-archive {\n --fa: "\\f187";\n}\n\n.fa-archive {\n --fa: "\\f187";\n}\n\n.fa-bug {\n --fa: "\\f188";\n}\n\n.fa-square-caret-left {\n --fa: "\\f191";\n}\n\n.fa-caret-square-left {\n --fa: "\\f191";\n}\n\n.fa-circle-dot {\n --fa: "\\f192";\n}\n\n.fa-dot-circle {\n --fa: "\\f192";\n}\n\n.fa-wheelchair {\n --fa: "\\f193";\n}\n\n.fa-lira-sign {\n --fa: "\\f195";\n}\n\n.fa-shuttle-space {\n --fa: "\\f197";\n}\n\n.fa-space-shuttle {\n --fa: "\\f197";\n}\n\n.fa-square-envelope {\n --fa: "\\f199";\n}\n\n.fa-envelope-square {\n --fa: "\\f199";\n}\n\n.fa-building-columns {\n --fa: "\\f19c";\n}\n\n.fa-bank {\n --fa: "\\f19c";\n}\n\n.fa-institution {\n --fa: "\\f19c";\n}\n\n.fa-museum {\n --fa: "\\f19c";\n}\n\n.fa-university {\n --fa: "\\f19c";\n}\n\n.fa-graduation-cap {\n --fa: "\\f19d";\n}\n\n.fa-mortar-board {\n --fa: "\\f19d";\n}\n\n.fa-language {\n --fa: "\\f1ab";\n}\n\n.fa-fax {\n --fa: "\\f1ac";\n}\n\n.fa-building {\n --fa: "\\f1ad";\n}\n\n.fa-child {\n --fa: "\\f1ae";\n}\n\n.fa-paw {\n --fa: "\\f1b0";\n}\n\n.fa-cube {\n --fa: "\\f1b2";\n}\n\n.fa-cubes {\n --fa: "\\f1b3";\n}\n\n.fa-recycle {\n --fa: "\\f1b8";\n}\n\n.fa-car {\n --fa: "\\f1b9";\n}\n\n.fa-automobile {\n --fa: "\\f1b9";\n}\n\n.fa-taxi {\n --fa: "\\f1ba";\n}\n\n.fa-cab {\n --fa: "\\f1ba";\n}\n\n.fa-tree {\n --fa: "\\f1bb";\n}\n\n.fa-database {\n --fa: "\\f1c0";\n}\n\n.fa-file-pdf {\n --fa: "\\f1c1";\n}\n\n.fa-file-word {\n --fa: "\\f1c2";\n}\n\n.fa-file-excel {\n --fa: "\\f1c3";\n}\n\n.fa-file-powerpoint {\n --fa: "\\f1c4";\n}\n\n.fa-file-image {\n --fa: "\\f1c5";\n}\n\n.fa-file-zipper {\n --fa: "\\f1c6";\n}\n\n.fa-file-archive {\n --fa: "\\f1c6";\n}\n\n.fa-file-audio {\n --fa: "\\f1c7";\n}\n\n.fa-file-video {\n --fa: "\\f1c8";\n}\n\n.fa-file-code {\n --fa: "\\f1c9";\n}\n\n.fa-life-ring {\n --fa: "\\f1cd";\n}\n\n.fa-circle-notch {\n --fa: "\\f1ce";\n}\n\n.fa-paper-plane {\n --fa: "\\f1d8";\n}\n\n.fa-clock-rotate-left {\n --fa: "\\f1da";\n}\n\n.fa-history {\n --fa: "\\f1da";\n}\n\n.fa-heading {\n --fa: "\\f1dc";\n}\n\n.fa-header {\n --fa: "\\f1dc";\n}\n\n.fa-paragraph {\n --fa: "\\f1dd";\n}\n\n.fa-sliders {\n --fa: "\\f1de";\n}\n\n.fa-sliders-h {\n --fa: "\\f1de";\n}\n\n.fa-share-nodes {\n --fa: "\\f1e0";\n}\n\n.fa-share-alt {\n --fa: "\\f1e0";\n}\n\n.fa-square-share-nodes {\n --fa: "\\f1e1";\n}\n\n.fa-share-alt-square {\n --fa: "\\f1e1";\n}\n\n.fa-bomb {\n --fa: "\\f1e2";\n}\n\n.fa-futbol {\n --fa: "\\f1e3";\n}\n\n.fa-futbol-ball {\n --fa: "\\f1e3";\n}\n\n.fa-soccer-ball {\n --fa: "\\f1e3";\n}\n\n.fa-tty {\n --fa: "\\f1e4";\n}\n\n.fa-teletype {\n --fa: "\\f1e4";\n}\n\n.fa-binoculars {\n --fa: "\\f1e5";\n}\n\n.fa-plug {\n --fa: "\\f1e6";\n}\n\n.fa-newspaper {\n --fa: "\\f1ea";\n}\n\n.fa-wifi {\n --fa: "\\f1eb";\n}\n\n.fa-wifi-3 {\n --fa: "\\f1eb";\n}\n\n.fa-wifi-strong {\n --fa: "\\f1eb";\n}\n\n.fa-calculator {\n --fa: "\\f1ec";\n}\n\n.fa-bell-slash {\n --fa: "\\f1f6";\n}\n\n.fa-trash {\n --fa: "\\f1f8";\n}\n\n.fa-copyright {\n --fa: "\\f1f9";\n}\n\n.fa-eye-dropper {\n --fa: "\\f1fb";\n}\n\n.fa-eye-dropper-empty {\n --fa: "\\f1fb";\n}\n\n.fa-eyedropper {\n --fa: "\\f1fb";\n}\n\n.fa-paintbrush {\n --fa: "\\f1fc";\n}\n\n.fa-paint-brush {\n --fa: "\\f1fc";\n}\n\n.fa-cake-candles {\n --fa: "\\f1fd";\n}\n\n.fa-birthday-cake {\n --fa: "\\f1fd";\n}\n\n.fa-cake {\n --fa: "\\f1fd";\n}\n\n.fa-chart-area {\n --fa: "\\f1fe";\n}\n\n.fa-area-chart {\n --fa: "\\f1fe";\n}\n\n.fa-chart-pie {\n --fa: "\\f200";\n}\n\n.fa-pie-chart {\n --fa: "\\f200";\n}\n\n.fa-chart-line {\n --fa: "\\f201";\n}\n\n.fa-line-chart {\n --fa: "\\f201";\n}\n\n.fa-toggle-off {\n --fa: "\\f204";\n}\n\n.fa-toggle-on {\n --fa: "\\f205";\n}\n\n.fa-bicycle {\n --fa: "\\f206";\n}\n\n.fa-bus {\n --fa: "\\f207";\n}\n\n.fa-closed-captioning {\n --fa: "\\f20a";\n}\n\n.fa-shekel-sign {\n --fa: "\\f20b";\n}\n\n.fa-ils {\n --fa: "\\f20b";\n}\n\n.fa-shekel {\n --fa: "\\f20b";\n}\n\n.fa-sheqel {\n --fa: "\\f20b";\n}\n\n.fa-sheqel-sign {\n --fa: "\\f20b";\n}\n\n.fa-cart-plus {\n --fa: "\\f217";\n}\n\n.fa-cart-arrow-down {\n --fa: "\\f218";\n}\n\n.fa-diamond {\n --fa: "\\f219";\n}\n\n.fa-ship {\n --fa: "\\f21a";\n}\n\n.fa-user-secret {\n --fa: "\\f21b";\n}\n\n.fa-motorcycle {\n --fa: "\\f21c";\n}\n\n.fa-street-view {\n --fa: "\\f21d";\n}\n\n.fa-heart-pulse {\n --fa: "\\f21e";\n}\n\n.fa-heartbeat {\n --fa: "\\f21e";\n}\n\n.fa-venus {\n --fa: "\\f221";\n}\n\n.fa-mars {\n --fa: "\\f222";\n}\n\n.fa-mercury {\n --fa: "\\f223";\n}\n\n.fa-mars-and-venus {\n --fa: "\\f224";\n}\n\n.fa-transgender {\n --fa: "\\f225";\n}\n\n.fa-transgender-alt {\n --fa: "\\f225";\n}\n\n.fa-venus-double {\n --fa: "\\f226";\n}\n\n.fa-mars-double {\n --fa: "\\f227";\n}\n\n.fa-venus-mars {\n --fa: "\\f228";\n}\n\n.fa-mars-stroke {\n --fa: "\\f229";\n}\n\n.fa-mars-stroke-up {\n --fa: "\\f22a";\n}\n\n.fa-mars-stroke-v {\n --fa: "\\f22a";\n}\n\n.fa-mars-stroke-right {\n --fa: "\\f22b";\n}\n\n.fa-mars-stroke-h {\n --fa: "\\f22b";\n}\n\n.fa-neuter {\n --fa: "\\f22c";\n}\n\n.fa-genderless {\n --fa: "\\f22d";\n}\n\n.fa-server {\n --fa: "\\f233";\n}\n\n.fa-user-plus {\n --fa: "\\f234";\n}\n\n.fa-user-xmark {\n --fa: "\\f235";\n}\n\n.fa-user-times {\n --fa: "\\f235";\n}\n\n.fa-bed {\n --fa: "\\f236";\n}\n\n.fa-train {\n --fa: "\\f238";\n}\n\n.fa-train-subway {\n --fa: "\\f239";\n}\n\n.fa-subway {\n --fa: "\\f239";\n}\n\n.fa-battery-full {\n --fa: "\\f240";\n}\n\n.fa-battery {\n --fa: "\\f240";\n}\n\n.fa-battery-5 {\n --fa: "\\f240";\n}\n\n.fa-battery-three-quarters {\n --fa: "\\f241";\n}\n\n.fa-battery-4 {\n --fa: "\\f241";\n}\n\n.fa-battery-half {\n --fa: "\\f242";\n}\n\n.fa-battery-3 {\n --fa: "\\f242";\n}\n\n.fa-battery-quarter {\n --fa: "\\f243";\n}\n\n.fa-battery-2 {\n --fa: "\\f243";\n}\n\n.fa-battery-empty {\n --fa: "\\f244";\n}\n\n.fa-battery-0 {\n --fa: "\\f244";\n}\n\n.fa-arrow-pointer {\n --fa: "\\f245";\n}\n\n.fa-mouse-pointer {\n --fa: "\\f245";\n}\n\n.fa-i-cursor {\n --fa: "\\f246";\n}\n\n.fa-object-group {\n --fa: "\\f247";\n}\n\n.fa-object-ungroup {\n --fa: "\\f248";\n}\n\n.fa-note-sticky {\n --fa: "\\f249";\n}\n\n.fa-sticky-note {\n --fa: "\\f249";\n}\n\n.fa-clone {\n --fa: "\\f24d";\n}\n\n.fa-scale-balanced {\n --fa: "\\f24e";\n}\n\n.fa-balance-scale {\n --fa: "\\f24e";\n}\n\n.fa-hourglass-start {\n --fa: "\\f251";\n}\n\n.fa-hourglass-1 {\n --fa: "\\f251";\n}\n\n.fa-hourglass-half {\n --fa: "\\f252";\n}\n\n.fa-hourglass-2 {\n --fa: "\\f252";\n}\n\n.fa-hourglass-end {\n --fa: "\\f253";\n}\n\n.fa-hourglass-3 {\n --fa: "\\f253";\n}\n\n.fa-hourglass {\n --fa: "\\f254";\n}\n\n.fa-hourglass-empty {\n --fa: "\\f254";\n}\n\n.fa-hand-back-fist {\n --fa: "\\f255";\n}\n\n.fa-hand-rock {\n --fa: "\\f255";\n}\n\n.fa-hand {\n --fa: "\\f256";\n}\n\n.fa-hand-paper {\n --fa: "\\f256";\n}\n\n.fa-hand-scissors {\n --fa: "\\f257";\n}\n\n.fa-hand-lizard {\n --fa: "\\f258";\n}\n\n.fa-hand-spock {\n --fa: "\\f259";\n}\n\n.fa-hand-pointer {\n --fa: "\\f25a";\n}\n\n.fa-hand-peace {\n --fa: "\\f25b";\n}\n\n.fa-trademark {\n --fa: "\\f25c";\n}\n\n.fa-registered {\n --fa: "\\f25d";\n}\n\n.fa-tv {\n --fa: "\\f26c";\n}\n\n.fa-television {\n --fa: "\\f26c";\n}\n\n.fa-tv-alt {\n --fa: "\\f26c";\n}\n\n.fa-calendar-plus {\n --fa: "\\f271";\n}\n\n.fa-calendar-minus {\n --fa: "\\f272";\n}\n\n.fa-calendar-xmark {\n --fa: "\\f273";\n}\n\n.fa-calendar-times {\n --fa: "\\f273";\n}\n\n.fa-calendar-check {\n --fa: "\\f274";\n}\n\n.fa-industry {\n --fa: "\\f275";\n}\n\n.fa-map-pin {\n --fa: "\\f276";\n}\n\n.fa-signs-post {\n --fa: "\\f277";\n}\n\n.fa-map-signs {\n --fa: "\\f277";\n}\n\n.fa-map {\n --fa: "\\f279";\n}\n\n.fa-message {\n --fa: "\\f27a";\n}\n\n.fa-comment-alt {\n --fa: "\\f27a";\n}\n\n.fa-circle-pause {\n --fa: "\\f28b";\n}\n\n.fa-pause-circle {\n --fa: "\\f28b";\n}\n\n.fa-circle-stop {\n --fa: "\\f28d";\n}\n\n.fa-stop-circle {\n --fa: "\\f28d";\n}\n\n.fa-bag-shopping {\n --fa: "\\f290";\n}\n\n.fa-shopping-bag {\n --fa: "\\f290";\n}\n\n.fa-basket-shopping {\n --fa: "\\f291";\n}\n\n.fa-shopping-basket {\n --fa: "\\f291";\n}\n\n.fa-universal-access {\n --fa: "\\f29a";\n}\n\n.fa-person-walking-with-cane {\n --fa: "\\f29d";\n}\n\n.fa-blind {\n --fa: "\\f29d";\n}\n\n.fa-audio-description {\n --fa: "\\f29e";\n}\n\n.fa-phone-volume {\n --fa: "\\f2a0";\n}\n\n.fa-volume-control-phone {\n --fa: "\\f2a0";\n}\n\n.fa-braille {\n --fa: "\\f2a1";\n}\n\n.fa-ear-listen {\n --fa: "\\f2a2";\n}\n\n.fa-assistive-listening-systems {\n --fa: "\\f2a2";\n}\n\n.fa-hands-asl-interpreting {\n --fa: "\\f2a3";\n}\n\n.fa-american-sign-language-interpreting {\n --fa: "\\f2a3";\n}\n\n.fa-asl-interpreting {\n --fa: "\\f2a3";\n}\n\n.fa-hands-american-sign-language-interpreting {\n --fa: "\\f2a3";\n}\n\n.fa-ear-deaf {\n --fa: "\\f2a4";\n}\n\n.fa-deaf {\n --fa: "\\f2a4";\n}\n\n.fa-deafness {\n --fa: "\\f2a4";\n}\n\n.fa-hard-of-hearing {\n --fa: "\\f2a4";\n}\n\n.fa-hands {\n --fa: "\\f2a7";\n}\n\n.fa-sign-language {\n --fa: "\\f2a7";\n}\n\n.fa-signing {\n --fa: "\\f2a7";\n}\n\n.fa-eye-low-vision {\n --fa: "\\f2a8";\n}\n\n.fa-low-vision {\n --fa: "\\f2a8";\n}\n\n.fa-font-awesome {\n --fa: "\\f2b4";\n}\n\n.fa-font-awesome-flag {\n --fa: "\\f2b4";\n}\n\n.fa-font-awesome-logo-full {\n --fa: "\\f2b4";\n}\n\n.fa-handshake {\n --fa: "\\f2b5";\n}\n\n.fa-handshake-alt {\n --fa: "\\f2b5";\n}\n\n.fa-handshake-simple {\n --fa: "\\f2b5";\n}\n\n.fa-envelope-open {\n --fa: "\\f2b6";\n}\n\n.fa-address-book {\n --fa: "\\f2b9";\n}\n\n.fa-contact-book {\n --fa: "\\f2b9";\n}\n\n.fa-address-card {\n --fa: "\\f2bb";\n}\n\n.fa-contact-card {\n --fa: "\\f2bb";\n}\n\n.fa-vcard {\n --fa: "\\f2bb";\n}\n\n.fa-circle-user {\n --fa: "\\f2bd";\n}\n\n.fa-user-circle {\n --fa: "\\f2bd";\n}\n\n.fa-id-badge {\n --fa: "\\f2c1";\n}\n\n.fa-id-card {\n --fa: "\\f2c2";\n}\n\n.fa-drivers-license {\n --fa: "\\f2c2";\n}\n\n.fa-temperature-full {\n --fa: "\\f2c7";\n}\n\n.fa-temperature-4 {\n --fa: "\\f2c7";\n}\n\n.fa-thermometer-4 {\n --fa: "\\f2c7";\n}\n\n.fa-thermometer-full {\n --fa: "\\f2c7";\n}\n\n.fa-temperature-three-quarters {\n --fa: "\\f2c8";\n}\n\n.fa-temperature-3 {\n --fa: "\\f2c8";\n}\n\n.fa-thermometer-3 {\n --fa: "\\f2c8";\n}\n\n.fa-thermometer-three-quarters {\n --fa: "\\f2c8";\n}\n\n.fa-temperature-half {\n --fa: "\\f2c9";\n}\n\n.fa-temperature-2 {\n --fa: "\\f2c9";\n}\n\n.fa-thermometer-2 {\n --fa: "\\f2c9";\n}\n\n.fa-thermometer-half {\n --fa: "\\f2c9";\n}\n\n.fa-temperature-quarter {\n --fa: "\\f2ca";\n}\n\n.fa-temperature-1 {\n --fa: "\\f2ca";\n}\n\n.fa-thermometer-1 {\n --fa: "\\f2ca";\n}\n\n.fa-thermometer-quarter {\n --fa: "\\f2ca";\n}\n\n.fa-temperature-empty {\n --fa: "\\f2cb";\n}\n\n.fa-temperature-0 {\n --fa: "\\f2cb";\n}\n\n.fa-thermometer-0 {\n --fa: "\\f2cb";\n}\n\n.fa-thermometer-empty {\n --fa: "\\f2cb";\n}\n\n.fa-shower {\n --fa: "\\f2cc";\n}\n\n.fa-bath {\n --fa: "\\f2cd";\n}\n\n.fa-bathtub {\n --fa: "\\f2cd";\n}\n\n.fa-podcast {\n --fa: "\\f2ce";\n}\n\n.fa-window-maximize {\n --fa: "\\f2d0";\n}\n\n.fa-window-minimize {\n --fa: "\\f2d1";\n}\n\n.fa-window-restore {\n --fa: "\\f2d2";\n}\n\n.fa-square-xmark {\n --fa: "\\f2d3";\n}\n\n.fa-times-square {\n --fa: "\\f2d3";\n}\n\n.fa-xmark-square {\n --fa: "\\f2d3";\n}\n\n.fa-microchip {\n --fa: "\\f2db";\n}\n\n.fa-snowflake {\n --fa: "\\f2dc";\n}\n\n.fa-spoon {\n --fa: "\\f2e5";\n}\n\n.fa-utensil-spoon {\n --fa: "\\f2e5";\n}\n\n.fa-utensils {\n --fa: "\\f2e7";\n}\n\n.fa-cutlery {\n --fa: "\\f2e7";\n}\n\n.fa-rotate-left {\n --fa: "\\f2ea";\n}\n\n.fa-rotate-back {\n --fa: "\\f2ea";\n}\n\n.fa-rotate-backward {\n --fa: "\\f2ea";\n}\n\n.fa-undo-alt {\n --fa: "\\f2ea";\n}\n\n.fa-trash-can {\n --fa: "\\f2ed";\n}\n\n.fa-trash-alt {\n --fa: "\\f2ed";\n}\n\n.fa-rotate {\n --fa: "\\f2f1";\n}\n\n.fa-sync-alt {\n --fa: "\\f2f1";\n}\n\n.fa-stopwatch {\n --fa: "\\f2f2";\n}\n\n.fa-right-from-bracket {\n --fa: "\\f2f5";\n}\n\n.fa-sign-out-alt {\n --fa: "\\f2f5";\n}\n\n.fa-right-to-bracket {\n --fa: "\\f2f6";\n}\n\n.fa-sign-in-alt {\n --fa: "\\f2f6";\n}\n\n.fa-rotate-right {\n --fa: "\\f2f9";\n}\n\n.fa-redo-alt {\n --fa: "\\f2f9";\n}\n\n.fa-rotate-forward {\n --fa: "\\f2f9";\n}\n\n.fa-poo {\n --fa: "\\f2fe";\n}\n\n.fa-images {\n --fa: "\\f302";\n}\n\n.fa-pencil {\n --fa: "\\f303";\n}\n\n.fa-pencil-alt {\n --fa: "\\f303";\n}\n\n.fa-pen {\n --fa: "\\f304";\n}\n\n.fa-pen-clip {\n --fa: "\\f305";\n}\n\n.fa-pen-alt {\n --fa: "\\f305";\n}\n\n.fa-octagon {\n --fa: "\\f306";\n}\n\n.fa-down-long {\n --fa: "\\f309";\n}\n\n.fa-long-arrow-alt-down {\n --fa: "\\f309";\n}\n\n.fa-left-long {\n --fa: "\\f30a";\n}\n\n.fa-long-arrow-alt-left {\n --fa: "\\f30a";\n}\n\n.fa-right-long {\n --fa: "\\f30b";\n}\n\n.fa-long-arrow-alt-right {\n --fa: "\\f30b";\n}\n\n.fa-up-long {\n --fa: "\\f30c";\n}\n\n.fa-long-arrow-alt-up {\n --fa: "\\f30c";\n}\n\n.fa-hexagon {\n --fa: "\\f312";\n}\n\n.fa-file-pen {\n --fa: "\\f31c";\n}\n\n.fa-file-edit {\n --fa: "\\f31c";\n}\n\n.fa-maximize {\n --fa: "\\f31e";\n}\n\n.fa-expand-arrows-alt {\n --fa: "\\f31e";\n}\n\n.fa-clipboard {\n --fa: "\\f328";\n}\n\n.fa-left-right {\n --fa: "\\f337";\n}\n\n.fa-arrows-alt-h {\n --fa: "\\f337";\n}\n\n.fa-up-down {\n --fa: "\\f338";\n}\n\n.fa-arrows-alt-v {\n --fa: "\\f338";\n}\n\n.fa-alarm-clock {\n --fa: "\\f34e";\n}\n\n.fa-circle-down {\n --fa: "\\f358";\n}\n\n.fa-arrow-alt-circle-down {\n --fa: "\\f358";\n}\n\n.fa-circle-left {\n --fa: "\\f359";\n}\n\n.fa-arrow-alt-circle-left {\n --fa: "\\f359";\n}\n\n.fa-circle-right {\n --fa: "\\f35a";\n}\n\n.fa-arrow-alt-circle-right {\n --fa: "\\f35a";\n}\n\n.fa-circle-up {\n --fa: "\\f35b";\n}\n\n.fa-arrow-alt-circle-up {\n --fa: "\\f35b";\n}\n\n.fa-up-right-from-square {\n --fa: "\\f35d";\n}\n\n.fa-external-link-alt {\n --fa: "\\f35d";\n}\n\n.fa-square-up-right {\n --fa: "\\f360";\n}\n\n.fa-external-link-square-alt {\n --fa: "\\f360";\n}\n\n.fa-right-left {\n --fa: "\\f362";\n}\n\n.fa-exchange-alt {\n --fa: "\\f362";\n}\n\n.fa-repeat {\n --fa: "\\f363";\n}\n\n.fa-code-commit {\n --fa: "\\f386";\n}\n\n.fa-code-merge {\n --fa: "\\f387";\n}\n\n.fa-desktop {\n --fa: "\\f390";\n}\n\n.fa-desktop-alt {\n --fa: "\\f390";\n}\n\n.fa-gem {\n --fa: "\\f3a5";\n}\n\n.fa-turn-down {\n --fa: "\\f3be";\n}\n\n.fa-level-down-alt {\n --fa: "\\f3be";\n}\n\n.fa-turn-up {\n --fa: "\\f3bf";\n}\n\n.fa-level-up-alt {\n --fa: "\\f3bf";\n}\n\n.fa-lock-open {\n --fa: "\\f3c1";\n}\n\n.fa-location-dot {\n --fa: "\\f3c5";\n}\n\n.fa-map-marker-alt {\n --fa: "\\f3c5";\n}\n\n.fa-microphone-lines {\n --fa: "\\f3c9";\n}\n\n.fa-microphone-alt {\n --fa: "\\f3c9";\n}\n\n.fa-mobile-screen-button {\n --fa: "\\f3cd";\n}\n\n.fa-mobile-alt {\n --fa: "\\f3cd";\n}\n\n.fa-mobile {\n --fa: "\\f3ce";\n}\n\n.fa-mobile-android {\n --fa: "\\f3ce";\n}\n\n.fa-mobile-phone {\n --fa: "\\f3ce";\n}\n\n.fa-mobile-screen {\n --fa: "\\f3cf";\n}\n\n.fa-mobile-android-alt {\n --fa: "\\f3cf";\n}\n\n.fa-money-bill-1 {\n --fa: "\\f3d1";\n}\n\n.fa-money-bill-alt {\n --fa: "\\f3d1";\n}\n\n.fa-phone-slash {\n --fa: "\\f3dd";\n}\n\n.fa-image-portrait {\n --fa: "\\f3e0";\n}\n\n.fa-portrait {\n --fa: "\\f3e0";\n}\n\n.fa-reply {\n --fa: "\\f3e5";\n}\n\n.fa-mail-reply {\n --fa: "\\f3e5";\n}\n\n.fa-shield-halved {\n --fa: "\\f3ed";\n}\n\n.fa-shield-alt {\n --fa: "\\f3ed";\n}\n\n.fa-tablet-screen-button {\n --fa: "\\f3fa";\n}\n\n.fa-tablet-alt {\n --fa: "\\f3fa";\n}\n\n.fa-tablet {\n --fa: "\\f3fb";\n}\n\n.fa-tablet-android {\n --fa: "\\f3fb";\n}\n\n.fa-ticket-simple {\n --fa: "\\f3ff";\n}\n\n.fa-ticket-alt {\n --fa: "\\f3ff";\n}\n\n.fa-rectangle-xmark {\n --fa: "\\f410";\n}\n\n.fa-rectangle-times {\n --fa: "\\f410";\n}\n\n.fa-times-rectangle {\n --fa: "\\f410";\n}\n\n.fa-window-close {\n --fa: "\\f410";\n}\n\n.fa-down-left-and-up-right-to-center {\n --fa: "\\f422";\n}\n\n.fa-compress-alt {\n --fa: "\\f422";\n}\n\n.fa-up-right-and-down-left-from-center {\n --fa: "\\f424";\n}\n\n.fa-expand-alt {\n --fa: "\\f424";\n}\n\n.fa-baseball-bat-ball {\n --fa: "\\f432";\n}\n\n.fa-baseball {\n --fa: "\\f433";\n}\n\n.fa-baseball-ball {\n --fa: "\\f433";\n}\n\n.fa-basketball {\n --fa: "\\f434";\n}\n\n.fa-basketball-ball {\n --fa: "\\f434";\n}\n\n.fa-bowling-ball {\n --fa: "\\f436";\n}\n\n.fa-chess {\n --fa: "\\f439";\n}\n\n.fa-chess-bishop {\n --fa: "\\f43a";\n}\n\n.fa-chess-board {\n --fa: "\\f43c";\n}\n\n.fa-chess-king {\n --fa: "\\f43f";\n}\n\n.fa-chess-knight {\n --fa: "\\f441";\n}\n\n.fa-chess-pawn {\n --fa: "\\f443";\n}\n\n.fa-chess-queen {\n --fa: "\\f445";\n}\n\n.fa-chess-rook {\n --fa: "\\f447";\n}\n\n.fa-dumbbell {\n --fa: "\\f44b";\n}\n\n.fa-football {\n --fa: "\\f44e";\n}\n\n.fa-football-ball {\n --fa: "\\f44e";\n}\n\n.fa-golf-ball-tee {\n --fa: "\\f450";\n}\n\n.fa-golf-ball {\n --fa: "\\f450";\n}\n\n.fa-hockey-puck {\n --fa: "\\f453";\n}\n\n.fa-broom-ball {\n --fa: "\\f458";\n}\n\n.fa-quidditch {\n --fa: "\\f458";\n}\n\n.fa-quidditch-broom-ball {\n --fa: "\\f458";\n}\n\n.fa-square-full {\n --fa: "\\f45c";\n}\n\n.fa-table-tennis-paddle-ball {\n --fa: "\\f45d";\n}\n\n.fa-ping-pong-paddle-ball {\n --fa: "\\f45d";\n}\n\n.fa-table-tennis {\n --fa: "\\f45d";\n}\n\n.fa-volleyball {\n --fa: "\\f45f";\n}\n\n.fa-volleyball-ball {\n --fa: "\\f45f";\n}\n\n.fa-hand-dots {\n --fa: "\\f461";\n}\n\n.fa-allergies {\n --fa: "\\f461";\n}\n\n.fa-bandage {\n --fa: "\\f462";\n}\n\n.fa-band-aid {\n --fa: "\\f462";\n}\n\n.fa-box {\n --fa: "\\f466";\n}\n\n.fa-boxes-stacked {\n --fa: "\\f468";\n}\n\n.fa-boxes {\n --fa: "\\f468";\n}\n\n.fa-boxes-alt {\n --fa: "\\f468";\n}\n\n.fa-briefcase-medical {\n --fa: "\\f469";\n}\n\n.fa-fire-flame-simple {\n --fa: "\\f46a";\n}\n\n.fa-burn {\n --fa: "\\f46a";\n}\n\n.fa-capsules {\n --fa: "\\f46b";\n}\n\n.fa-clipboard-check {\n --fa: "\\f46c";\n}\n\n.fa-clipboard-list {\n --fa: "\\f46d";\n}\n\n.fa-person-dots-from-line {\n --fa: "\\f470";\n}\n\n.fa-diagnoses {\n --fa: "\\f470";\n}\n\n.fa-dna {\n --fa: "\\f471";\n}\n\n.fa-dolly {\n --fa: "\\f472";\n}\n\n.fa-dolly-box {\n --fa: "\\f472";\n}\n\n.fa-cart-flatbed {\n --fa: "\\f474";\n}\n\n.fa-dolly-flatbed {\n --fa: "\\f474";\n}\n\n.fa-file-medical {\n --fa: "\\f477";\n}\n\n.fa-file-waveform {\n --fa: "\\f478";\n}\n\n.fa-file-medical-alt {\n --fa: "\\f478";\n}\n\n.fa-kit-medical {\n --fa: "\\f479";\n}\n\n.fa-first-aid {\n --fa: "\\f479";\n}\n\n.fa-circle-h {\n --fa: "\\f47e";\n}\n\n.fa-hospital-symbol {\n --fa: "\\f47e";\n}\n\n.fa-id-card-clip {\n --fa: "\\f47f";\n}\n\n.fa-id-card-alt {\n --fa: "\\f47f";\n}\n\n.fa-notes-medical {\n --fa: "\\f481";\n}\n\n.fa-pallet {\n --fa: "\\f482";\n}\n\n.fa-pills {\n --fa: "\\f484";\n}\n\n.fa-prescription-bottle {\n --fa: "\\f485";\n}\n\n.fa-prescription-bottle-medical {\n --fa: "\\f486";\n}\n\n.fa-prescription-bottle-alt {\n --fa: "\\f486";\n}\n\n.fa-bed-pulse {\n --fa: "\\f487";\n}\n\n.fa-procedures {\n --fa: "\\f487";\n}\n\n.fa-truck-fast {\n --fa: "\\f48b";\n}\n\n.fa-shipping-fast {\n --fa: "\\f48b";\n}\n\n.fa-smoking {\n --fa: "\\f48d";\n}\n\n.fa-syringe {\n --fa: "\\f48e";\n}\n\n.fa-tablets {\n --fa: "\\f490";\n}\n\n.fa-thermometer {\n --fa: "\\f491";\n}\n\n.fa-vial {\n --fa: "\\f492";\n}\n\n.fa-vials {\n --fa: "\\f493";\n}\n\n.fa-warehouse {\n --fa: "\\f494";\n}\n\n.fa-weight-scale {\n --fa: "\\f496";\n}\n\n.fa-weight {\n --fa: "\\f496";\n}\n\n.fa-x-ray {\n --fa: "\\f497";\n}\n\n.fa-box-open {\n --fa: "\\f49e";\n}\n\n.fa-comment-dots {\n --fa: "\\f4ad";\n}\n\n.fa-commenting {\n --fa: "\\f4ad";\n}\n\n.fa-comment-slash {\n --fa: "\\f4b3";\n}\n\n.fa-couch {\n --fa: "\\f4b8";\n}\n\n.fa-circle-dollar-to-slot {\n --fa: "\\f4b9";\n}\n\n.fa-donate {\n --fa: "\\f4b9";\n}\n\n.fa-dove {\n --fa: "\\f4ba";\n}\n\n.fa-hand-holding {\n --fa: "\\f4bd";\n}\n\n.fa-hand-holding-heart {\n --fa: "\\f4be";\n}\n\n.fa-hand-holding-dollar {\n --fa: "\\f4c0";\n}\n\n.fa-hand-holding-usd {\n --fa: "\\f4c0";\n}\n\n.fa-hand-holding-droplet {\n --fa: "\\f4c1";\n}\n\n.fa-hand-holding-water {\n --fa: "\\f4c1";\n}\n\n.fa-hands-holding {\n --fa: "\\f4c2";\n}\n\n.fa-handshake-angle {\n --fa: "\\f4c4";\n}\n\n.fa-hands-helping {\n --fa: "\\f4c4";\n}\n\n.fa-parachute-box {\n --fa: "\\f4cd";\n}\n\n.fa-people-carry-box {\n --fa: "\\f4ce";\n}\n\n.fa-people-carry {\n --fa: "\\f4ce";\n}\n\n.fa-piggy-bank {\n --fa: "\\f4d3";\n}\n\n.fa-ribbon {\n --fa: "\\f4d6";\n}\n\n.fa-route {\n --fa: "\\f4d7";\n}\n\n.fa-seedling {\n --fa: "\\f4d8";\n}\n\n.fa-sprout {\n --fa: "\\f4d8";\n}\n\n.fa-sign-hanging {\n --fa: "\\f4d9";\n}\n\n.fa-sign {\n --fa: "\\f4d9";\n}\n\n.fa-face-smile-wink {\n --fa: "\\f4da";\n}\n\n.fa-smile-wink {\n --fa: "\\f4da";\n}\n\n.fa-tape {\n --fa: "\\f4db";\n}\n\n.fa-truck-ramp-box {\n --fa: "\\f4de";\n}\n\n.fa-truck-loading {\n --fa: "\\f4de";\n}\n\n.fa-truck-moving {\n --fa: "\\f4df";\n}\n\n.fa-video-slash {\n --fa: "\\f4e2";\n}\n\n.fa-wine-glass {\n --fa: "\\f4e3";\n}\n\n.fa-user-astronaut {\n --fa: "\\f4fb";\n}\n\n.fa-user-check {\n --fa: "\\f4fc";\n}\n\n.fa-user-clock {\n --fa: "\\f4fd";\n}\n\n.fa-user-gear {\n --fa: "\\f4fe";\n}\n\n.fa-user-cog {\n --fa: "\\f4fe";\n}\n\n.fa-user-pen {\n --fa: "\\f4ff";\n}\n\n.fa-user-edit {\n --fa: "\\f4ff";\n}\n\n.fa-user-group {\n --fa: "\\f500";\n}\n\n.fa-user-friends {\n --fa: "\\f500";\n}\n\n.fa-user-graduate {\n --fa: "\\f501";\n}\n\n.fa-user-lock {\n --fa: "\\f502";\n}\n\n.fa-user-minus {\n --fa: "\\f503";\n}\n\n.fa-user-ninja {\n --fa: "\\f504";\n}\n\n.fa-user-shield {\n --fa: "\\f505";\n}\n\n.fa-user-slash {\n --fa: "\\f506";\n}\n\n.fa-user-alt-slash {\n --fa: "\\f506";\n}\n\n.fa-user-large-slash {\n --fa: "\\f506";\n}\n\n.fa-user-tag {\n --fa: "\\f507";\n}\n\n.fa-user-tie {\n --fa: "\\f508";\n}\n\n.fa-users-gear {\n --fa: "\\f509";\n}\n\n.fa-users-cog {\n --fa: "\\f509";\n}\n\n.fa-scale-unbalanced {\n --fa: "\\f515";\n}\n\n.fa-balance-scale-left {\n --fa: "\\f515";\n}\n\n.fa-scale-unbalanced-flip {\n --fa: "\\f516";\n}\n\n.fa-balance-scale-right {\n --fa: "\\f516";\n}\n\n.fa-blender {\n --fa: "\\f517";\n}\n\n.fa-book-open {\n --fa: "\\f518";\n}\n\n.fa-tower-broadcast {\n --fa: "\\f519";\n}\n\n.fa-broadcast-tower {\n --fa: "\\f519";\n}\n\n.fa-broom {\n --fa: "\\f51a";\n}\n\n.fa-chalkboard {\n --fa: "\\f51b";\n}\n\n.fa-blackboard {\n --fa: "\\f51b";\n}\n\n.fa-chalkboard-user {\n --fa: "\\f51c";\n}\n\n.fa-chalkboard-teacher {\n --fa: "\\f51c";\n}\n\n.fa-church {\n --fa: "\\f51d";\n}\n\n.fa-coins {\n --fa: "\\f51e";\n}\n\n.fa-compact-disc {\n --fa: "\\f51f";\n}\n\n.fa-crow {\n --fa: "\\f520";\n}\n\n.fa-crown {\n --fa: "\\f521";\n}\n\n.fa-dice {\n --fa: "\\f522";\n}\n\n.fa-dice-five {\n --fa: "\\f523";\n}\n\n.fa-dice-four {\n --fa: "\\f524";\n}\n\n.fa-dice-one {\n --fa: "\\f525";\n}\n\n.fa-dice-six {\n --fa: "\\f526";\n}\n\n.fa-dice-three {\n --fa: "\\f527";\n}\n\n.fa-dice-two {\n --fa: "\\f528";\n}\n\n.fa-divide {\n --fa: "\\f529";\n}\n\n.fa-door-closed {\n --fa: "\\f52a";\n}\n\n.fa-door-open {\n --fa: "\\f52b";\n}\n\n.fa-feather {\n --fa: "\\f52d";\n}\n\n.fa-frog {\n --fa: "\\f52e";\n}\n\n.fa-gas-pump {\n --fa: "\\f52f";\n}\n\n.fa-glasses {\n --fa: "\\f530";\n}\n\n.fa-greater-than-equal {\n --fa: "\\f532";\n}\n\n.fa-helicopter {\n --fa: "\\f533";\n}\n\n.fa-infinity {\n --fa: "\\f534";\n}\n\n.fa-kiwi-bird {\n --fa: "\\f535";\n}\n\n.fa-less-than-equal {\n --fa: "\\f537";\n}\n\n.fa-memory {\n --fa: "\\f538";\n}\n\n.fa-microphone-lines-slash {\n --fa: "\\f539";\n}\n\n.fa-microphone-alt-slash {\n --fa: "\\f539";\n}\n\n.fa-money-bill-wave {\n --fa: "\\f53a";\n}\n\n.fa-money-bill-1-wave {\n --fa: "\\f53b";\n}\n\n.fa-money-bill-wave-alt {\n --fa: "\\f53b";\n}\n\n.fa-money-check {\n --fa: "\\f53c";\n}\n\n.fa-money-check-dollar {\n --fa: "\\f53d";\n}\n\n.fa-money-check-alt {\n --fa: "\\f53d";\n}\n\n.fa-not-equal {\n --fa: "\\f53e";\n}\n\n.fa-palette {\n --fa: "\\f53f";\n}\n\n.fa-square-parking {\n --fa: "\\f540";\n}\n\n.fa-parking {\n --fa: "\\f540";\n}\n\n.fa-diagram-project {\n --fa: "\\f542";\n}\n\n.fa-project-diagram {\n --fa: "\\f542";\n}\n\n.fa-receipt {\n --fa: "\\f543";\n}\n\n.fa-robot {\n --fa: "\\f544";\n}\n\n.fa-ruler {\n --fa: "\\f545";\n}\n\n.fa-ruler-combined {\n --fa: "\\f546";\n}\n\n.fa-ruler-horizontal {\n --fa: "\\f547";\n}\n\n.fa-ruler-vertical {\n --fa: "\\f548";\n}\n\n.fa-school {\n --fa: "\\f549";\n}\n\n.fa-screwdriver {\n --fa: "\\f54a";\n}\n\n.fa-shoe-prints {\n --fa: "\\f54b";\n}\n\n.fa-skull {\n --fa: "\\f54c";\n}\n\n.fa-ban-smoking {\n --fa: "\\f54d";\n}\n\n.fa-smoking-ban {\n --fa: "\\f54d";\n}\n\n.fa-store {\n --fa: "\\f54e";\n}\n\n.fa-shop {\n --fa: "\\f54f";\n}\n\n.fa-store-alt {\n --fa: "\\f54f";\n}\n\n.fa-bars-staggered {\n --fa: "\\f550";\n}\n\n.fa-reorder {\n --fa: "\\f550";\n}\n\n.fa-stream {\n --fa: "\\f550";\n}\n\n.fa-stroopwafel {\n --fa: "\\f551";\n}\n\n.fa-toolbox {\n --fa: "\\f552";\n}\n\n.fa-shirt {\n --fa: "\\f553";\n}\n\n.fa-t-shirt {\n --fa: "\\f553";\n}\n\n.fa-tshirt {\n --fa: "\\f553";\n}\n\n.fa-person-walking {\n --fa: "\\f554";\n}\n\n.fa-walking {\n --fa: "\\f554";\n}\n\n.fa-wallet {\n --fa: "\\f555";\n}\n\n.fa-face-angry {\n --fa: "\\f556";\n}\n\n.fa-angry {\n --fa: "\\f556";\n}\n\n.fa-archway {\n --fa: "\\f557";\n}\n\n.fa-book-atlas {\n --fa: "\\f558";\n}\n\n.fa-atlas {\n --fa: "\\f558";\n}\n\n.fa-award {\n --fa: "\\f559";\n}\n\n.fa-delete-left {\n --fa: "\\f55a";\n}\n\n.fa-backspace {\n --fa: "\\f55a";\n}\n\n.fa-bezier-curve {\n --fa: "\\f55b";\n}\n\n.fa-bong {\n --fa: "\\f55c";\n}\n\n.fa-brush {\n --fa: "\\f55d";\n}\n\n.fa-bus-simple {\n --fa: "\\f55e";\n}\n\n.fa-bus-alt {\n --fa: "\\f55e";\n}\n\n.fa-cannabis {\n --fa: "\\f55f";\n}\n\n.fa-check-double {\n --fa: "\\f560";\n}\n\n.fa-martini-glass-citrus {\n --fa: "\\f561";\n}\n\n.fa-cocktail {\n --fa: "\\f561";\n}\n\n.fa-bell-concierge {\n --fa: "\\f562";\n}\n\n.fa-concierge-bell {\n --fa: "\\f562";\n}\n\n.fa-cookie {\n --fa: "\\f563";\n}\n\n.fa-cookie-bite {\n --fa: "\\f564";\n}\n\n.fa-crop-simple {\n --fa: "\\f565";\n}\n\n.fa-crop-alt {\n --fa: "\\f565";\n}\n\n.fa-tachograph-digital {\n --fa: "\\f566";\n}\n\n.fa-digital-tachograph {\n --fa: "\\f566";\n}\n\n.fa-face-dizzy {\n --fa: "\\f567";\n}\n\n.fa-dizzy {\n --fa: "\\f567";\n}\n\n.fa-compass-drafting {\n --fa: "\\f568";\n}\n\n.fa-drafting-compass {\n --fa: "\\f568";\n}\n\n.fa-drum {\n --fa: "\\f569";\n}\n\n.fa-drum-steelpan {\n --fa: "\\f56a";\n}\n\n.fa-feather-pointed {\n --fa: "\\f56b";\n}\n\n.fa-feather-alt {\n --fa: "\\f56b";\n}\n\n.fa-file-contract {\n --fa: "\\f56c";\n}\n\n.fa-file-arrow-down {\n --fa: "\\f56d";\n}\n\n.fa-file-download {\n --fa: "\\f56d";\n}\n\n.fa-file-export {\n --fa: "\\f56e";\n}\n\n.fa-arrow-right-from-file {\n --fa: "\\f56e";\n}\n\n.fa-file-import {\n --fa: "\\f56f";\n}\n\n.fa-arrow-right-to-file {\n --fa: "\\f56f";\n}\n\n.fa-file-invoice {\n --fa: "\\f570";\n}\n\n.fa-file-invoice-dollar {\n --fa: "\\f571";\n}\n\n.fa-file-prescription {\n --fa: "\\f572";\n}\n\n.fa-file-signature {\n --fa: "\\f573";\n}\n\n.fa-file-arrow-up {\n --fa: "\\f574";\n}\n\n.fa-file-upload {\n --fa: "\\f574";\n}\n\n.fa-fill {\n --fa: "\\f575";\n}\n\n.fa-fill-drip {\n --fa: "\\f576";\n}\n\n.fa-fingerprint {\n --fa: "\\f577";\n}\n\n.fa-fish {\n --fa: "\\f578";\n}\n\n.fa-face-flushed {\n --fa: "\\f579";\n}\n\n.fa-flushed {\n --fa: "\\f579";\n}\n\n.fa-face-frown-open {\n --fa: "\\f57a";\n}\n\n.fa-frown-open {\n --fa: "\\f57a";\n}\n\n.fa-martini-glass {\n --fa: "\\f57b";\n}\n\n.fa-glass-martini-alt {\n --fa: "\\f57b";\n}\n\n.fa-earth-africa {\n --fa: "\\f57c";\n}\n\n.fa-globe-africa {\n --fa: "\\f57c";\n}\n\n.fa-earth-americas {\n --fa: "\\f57d";\n}\n\n.fa-earth {\n --fa: "\\f57d";\n}\n\n.fa-earth-america {\n --fa: "\\f57d";\n}\n\n.fa-globe-americas {\n --fa: "\\f57d";\n}\n\n.fa-earth-asia {\n --fa: "\\f57e";\n}\n\n.fa-globe-asia {\n --fa: "\\f57e";\n}\n\n.fa-face-grimace {\n --fa: "\\f57f";\n}\n\n.fa-grimace {\n --fa: "\\f57f";\n}\n\n.fa-face-grin {\n --fa: "\\f580";\n}\n\n.fa-grin {\n --fa: "\\f580";\n}\n\n.fa-face-grin-wide {\n --fa: "\\f581";\n}\n\n.fa-grin-alt {\n --fa: "\\f581";\n}\n\n.fa-face-grin-beam {\n --fa: "\\f582";\n}\n\n.fa-grin-beam {\n --fa: "\\f582";\n}\n\n.fa-face-grin-beam-sweat {\n --fa: "\\f583";\n}\n\n.fa-grin-beam-sweat {\n --fa: "\\f583";\n}\n\n.fa-face-grin-hearts {\n --fa: "\\f584";\n}\n\n.fa-grin-hearts {\n --fa: "\\f584";\n}\n\n.fa-face-grin-squint {\n --fa: "\\f585";\n}\n\n.fa-grin-squint {\n --fa: "\\f585";\n}\n\n.fa-face-grin-squint-tears {\n --fa: "\\f586";\n}\n\n.fa-grin-squint-tears {\n --fa: "\\f586";\n}\n\n.fa-face-grin-stars {\n --fa: "\\f587";\n}\n\n.fa-grin-stars {\n --fa: "\\f587";\n}\n\n.fa-face-grin-tears {\n --fa: "\\f588";\n}\n\n.fa-grin-tears {\n --fa: "\\f588";\n}\n\n.fa-face-grin-tongue {\n --fa: "\\f589";\n}\n\n.fa-grin-tongue {\n --fa: "\\f589";\n}\n\n.fa-face-grin-tongue-squint {\n --fa: "\\f58a";\n}\n\n.fa-grin-tongue-squint {\n --fa: "\\f58a";\n}\n\n.fa-face-grin-tongue-wink {\n --fa: "\\f58b";\n}\n\n.fa-grin-tongue-wink {\n --fa: "\\f58b";\n}\n\n.fa-face-grin-wink {\n --fa: "\\f58c";\n}\n\n.fa-grin-wink {\n --fa: "\\f58c";\n}\n\n.fa-grip {\n --fa: "\\f58d";\n}\n\n.fa-grid-horizontal {\n --fa: "\\f58d";\n}\n\n.fa-grip-horizontal {\n --fa: "\\f58d";\n}\n\n.fa-grip-vertical {\n --fa: "\\f58e";\n}\n\n.fa-grid-vertical {\n --fa: "\\f58e";\n}\n\n.fa-headset {\n --fa: "\\f590";\n}\n\n.fa-highlighter {\n --fa: "\\f591";\n}\n\n.fa-hot-tub-person {\n --fa: "\\f593";\n}\n\n.fa-hot-tub {\n --fa: "\\f593";\n}\n\n.fa-hotel {\n --fa: "\\f594";\n}\n\n.fa-joint {\n --fa: "\\f595";\n}\n\n.fa-face-kiss {\n --fa: "\\f596";\n}\n\n.fa-kiss {\n --fa: "\\f596";\n}\n\n.fa-face-kiss-beam {\n --fa: "\\f597";\n}\n\n.fa-kiss-beam {\n --fa: "\\f597";\n}\n\n.fa-face-kiss-wink-heart {\n --fa: "\\f598";\n}\n\n.fa-kiss-wink-heart {\n --fa: "\\f598";\n}\n\n.fa-face-laugh {\n --fa: "\\f599";\n}\n\n.fa-laugh {\n --fa: "\\f599";\n}\n\n.fa-face-laugh-beam {\n --fa: "\\f59a";\n}\n\n.fa-laugh-beam {\n --fa: "\\f59a";\n}\n\n.fa-face-laugh-squint {\n --fa: "\\f59b";\n}\n\n.fa-laugh-squint {\n --fa: "\\f59b";\n}\n\n.fa-face-laugh-wink {\n --fa: "\\f59c";\n}\n\n.fa-laugh-wink {\n --fa: "\\f59c";\n}\n\n.fa-cart-flatbed-suitcase {\n --fa: "\\f59d";\n}\n\n.fa-luggage-cart {\n --fa: "\\f59d";\n}\n\n.fa-map-location {\n --fa: "\\f59f";\n}\n\n.fa-map-marked {\n --fa: "\\f59f";\n}\n\n.fa-map-location-dot {\n --fa: "\\f5a0";\n}\n\n.fa-map-marked-alt {\n --fa: "\\f5a0";\n}\n\n.fa-marker {\n --fa: "\\f5a1";\n}\n\n.fa-medal {\n --fa: "\\f5a2";\n}\n\n.fa-face-meh-blank {\n --fa: "\\f5a4";\n}\n\n.fa-meh-blank {\n --fa: "\\f5a4";\n}\n\n.fa-face-rolling-eyes {\n --fa: "\\f5a5";\n}\n\n.fa-meh-rolling-eyes {\n --fa: "\\f5a5";\n}\n\n.fa-monument {\n --fa: "\\f5a6";\n}\n\n.fa-mortar-pestle {\n --fa: "\\f5a7";\n}\n\n.fa-paint-roller {\n --fa: "\\f5aa";\n}\n\n.fa-passport {\n --fa: "\\f5ab";\n}\n\n.fa-pen-fancy {\n --fa: "\\f5ac";\n}\n\n.fa-pen-nib {\n --fa: "\\f5ad";\n}\n\n.fa-pen-ruler {\n --fa: "\\f5ae";\n}\n\n.fa-pencil-ruler {\n --fa: "\\f5ae";\n}\n\n.fa-plane-arrival {\n --fa: "\\f5af";\n}\n\n.fa-plane-departure {\n --fa: "\\f5b0";\n}\n\n.fa-prescription {\n --fa: "\\f5b1";\n}\n\n.fa-face-sad-cry {\n --fa: "\\f5b3";\n}\n\n.fa-sad-cry {\n --fa: "\\f5b3";\n}\n\n.fa-face-sad-tear {\n --fa: "\\f5b4";\n}\n\n.fa-sad-tear {\n --fa: "\\f5b4";\n}\n\n.fa-van-shuttle {\n --fa: "\\f5b6";\n}\n\n.fa-shuttle-van {\n --fa: "\\f5b6";\n}\n\n.fa-signature {\n --fa: "\\f5b7";\n}\n\n.fa-face-smile-beam {\n --fa: "\\f5b8";\n}\n\n.fa-smile-beam {\n --fa: "\\f5b8";\n}\n\n.fa-solar-panel {\n --fa: "\\f5ba";\n}\n\n.fa-spa {\n --fa: "\\f5bb";\n}\n\n.fa-lotus {\n --fa: "\\f5bb";\n}\n\n.fa-splotch {\n --fa: "\\f5bc";\n}\n\n.fa-spray-can {\n --fa: "\\f5bd";\n}\n\n.fa-stamp {\n --fa: "\\f5bf";\n}\n\n.fa-star-half-stroke {\n --fa: "\\f5c0";\n}\n\n.fa-star-half-alt {\n --fa: "\\f5c0";\n}\n\n.fa-suitcase-rolling {\n --fa: "\\f5c1";\n}\n\n.fa-face-surprise {\n --fa: "\\f5c2";\n}\n\n.fa-surprise {\n --fa: "\\f5c2";\n}\n\n.fa-swatchbook {\n --fa: "\\f5c3";\n}\n\n.fa-person-swimming {\n --fa: "\\f5c4";\n}\n\n.fa-swimmer {\n --fa: "\\f5c4";\n}\n\n.fa-water-ladder {\n --fa: "\\f5c5";\n}\n\n.fa-ladder-water {\n --fa: "\\f5c5";\n}\n\n.fa-swimming-pool {\n --fa: "\\f5c5";\n}\n\n.fa-droplet-slash {\n --fa: "\\f5c7";\n}\n\n.fa-tint-slash {\n --fa: "\\f5c7";\n}\n\n.fa-face-tired {\n --fa: "\\f5c8";\n}\n\n.fa-tired {\n --fa: "\\f5c8";\n}\n\n.fa-tooth {\n --fa: "\\f5c9";\n}\n\n.fa-umbrella-beach {\n --fa: "\\f5ca";\n}\n\n.fa-weight-hanging {\n --fa: "\\f5cd";\n}\n\n.fa-wine-glass-empty {\n --fa: "\\f5ce";\n}\n\n.fa-wine-glass-alt {\n --fa: "\\f5ce";\n}\n\n.fa-spray-can-sparkles {\n --fa: "\\f5d0";\n}\n\n.fa-air-freshener {\n --fa: "\\f5d0";\n}\n\n.fa-apple-whole {\n --fa: "\\f5d1";\n}\n\n.fa-apple-alt {\n --fa: "\\f5d1";\n}\n\n.fa-atom {\n --fa: "\\f5d2";\n}\n\n.fa-bone {\n --fa: "\\f5d7";\n}\n\n.fa-book-open-reader {\n --fa: "\\f5da";\n}\n\n.fa-book-reader {\n --fa: "\\f5da";\n}\n\n.fa-brain {\n --fa: "\\f5dc";\n}\n\n.fa-car-rear {\n --fa: "\\f5de";\n}\n\n.fa-car-alt {\n --fa: "\\f5de";\n}\n\n.fa-car-battery {\n --fa: "\\f5df";\n}\n\n.fa-battery-car {\n --fa: "\\f5df";\n}\n\n.fa-car-burst {\n --fa: "\\f5e1";\n}\n\n.fa-car-crash {\n --fa: "\\f5e1";\n}\n\n.fa-car-side {\n --fa: "\\f5e4";\n}\n\n.fa-charging-station {\n --fa: "\\f5e7";\n}\n\n.fa-diamond-turn-right {\n --fa: "\\f5eb";\n}\n\n.fa-directions {\n --fa: "\\f5eb";\n}\n\n.fa-draw-polygon {\n --fa: "\\f5ee";\n}\n\n.fa-vector-polygon {\n --fa: "\\f5ee";\n}\n\n.fa-laptop-code {\n --fa: "\\f5fc";\n}\n\n.fa-layer-group {\n --fa: "\\f5fd";\n}\n\n.fa-location-crosshairs {\n --fa: "\\f601";\n}\n\n.fa-location {\n --fa: "\\f601";\n}\n\n.fa-lungs {\n --fa: "\\f604";\n}\n\n.fa-microscope {\n --fa: "\\f610";\n}\n\n.fa-oil-can {\n --fa: "\\f613";\n}\n\n.fa-poop {\n --fa: "\\f619";\n}\n\n.fa-shapes {\n --fa: "\\f61f";\n}\n\n.fa-triangle-circle-square {\n --fa: "\\f61f";\n}\n\n.fa-star-of-life {\n --fa: "\\f621";\n}\n\n.fa-gauge {\n --fa: "\\f624";\n}\n\n.fa-dashboard {\n --fa: "\\f624";\n}\n\n.fa-gauge-med {\n --fa: "\\f624";\n}\n\n.fa-tachometer-alt-average {\n --fa: "\\f624";\n}\n\n.fa-gauge-high {\n --fa: "\\f625";\n}\n\n.fa-tachometer-alt {\n --fa: "\\f625";\n}\n\n.fa-tachometer-alt-fast {\n --fa: "\\f625";\n}\n\n.fa-gauge-simple {\n --fa: "\\f629";\n}\n\n.fa-gauge-simple-med {\n --fa: "\\f629";\n}\n\n.fa-tachometer-average {\n --fa: "\\f629";\n}\n\n.fa-gauge-simple-high {\n --fa: "\\f62a";\n}\n\n.fa-tachometer {\n --fa: "\\f62a";\n}\n\n.fa-tachometer-fast {\n --fa: "\\f62a";\n}\n\n.fa-teeth {\n --fa: "\\f62e";\n}\n\n.fa-teeth-open {\n --fa: "\\f62f";\n}\n\n.fa-masks-theater {\n --fa: "\\f630";\n}\n\n.fa-theater-masks {\n --fa: "\\f630";\n}\n\n.fa-traffic-light {\n --fa: "\\f637";\n}\n\n.fa-truck-monster {\n --fa: "\\f63b";\n}\n\n.fa-truck-pickup {\n --fa: "\\f63c";\n}\n\n.fa-rectangle-ad {\n --fa: "\\f641";\n}\n\n.fa-ad {\n --fa: "\\f641";\n}\n\n.fa-ankh {\n --fa: "\\f644";\n}\n\n.fa-book-bible {\n --fa: "\\f647";\n}\n\n.fa-bible {\n --fa: "\\f647";\n}\n\n.fa-business-time {\n --fa: "\\f64a";\n}\n\n.fa-briefcase-clock {\n --fa: "\\f64a";\n}\n\n.fa-city {\n --fa: "\\f64f";\n}\n\n.fa-comment-dollar {\n --fa: "\\f651";\n}\n\n.fa-comments-dollar {\n --fa: "\\f653";\n}\n\n.fa-cross {\n --fa: "\\f654";\n}\n\n.fa-dharmachakra {\n --fa: "\\f655";\n}\n\n.fa-envelope-open-text {\n --fa: "\\f658";\n}\n\n.fa-folder-minus {\n --fa: "\\f65d";\n}\n\n.fa-folder-plus {\n --fa: "\\f65e";\n}\n\n.fa-filter-circle-dollar {\n --fa: "\\f662";\n}\n\n.fa-funnel-dollar {\n --fa: "\\f662";\n}\n\n.fa-gopuram {\n --fa: "\\f664";\n}\n\n.fa-hamsa {\n --fa: "\\f665";\n}\n\n.fa-bahai {\n --fa: "\\f666";\n}\n\n.fa-haykal {\n --fa: "\\f666";\n}\n\n.fa-jedi {\n --fa: "\\f669";\n}\n\n.fa-book-journal-whills {\n --fa: "\\f66a";\n}\n\n.fa-journal-whills {\n --fa: "\\f66a";\n}\n\n.fa-kaaba {\n --fa: "\\f66b";\n}\n\n.fa-khanda {\n --fa: "\\f66d";\n}\n\n.fa-landmark {\n --fa: "\\f66f";\n}\n\n.fa-envelopes-bulk {\n --fa: "\\f674";\n}\n\n.fa-mail-bulk {\n --fa: "\\f674";\n}\n\n.fa-menorah {\n --fa: "\\f676";\n}\n\n.fa-mosque {\n --fa: "\\f678";\n}\n\n.fa-om {\n --fa: "\\f679";\n}\n\n.fa-spaghetti-monster-flying {\n --fa: "\\f67b";\n}\n\n.fa-pastafarianism {\n --fa: "\\f67b";\n}\n\n.fa-peace {\n --fa: "\\f67c";\n}\n\n.fa-place-of-worship {\n --fa: "\\f67f";\n}\n\n.fa-square-poll-vertical {\n --fa: "\\f681";\n}\n\n.fa-poll {\n --fa: "\\f681";\n}\n\n.fa-square-poll-horizontal {\n --fa: "\\f682";\n}\n\n.fa-poll-h {\n --fa: "\\f682";\n}\n\n.fa-person-praying {\n --fa: "\\f683";\n}\n\n.fa-pray {\n --fa: "\\f683";\n}\n\n.fa-hands-praying {\n --fa: "\\f684";\n}\n\n.fa-praying-hands {\n --fa: "\\f684";\n}\n\n.fa-book-quran {\n --fa: "\\f687";\n}\n\n.fa-quran {\n --fa: "\\f687";\n}\n\n.fa-magnifying-glass-dollar {\n --fa: "\\f688";\n}\n\n.fa-search-dollar {\n --fa: "\\f688";\n}\n\n.fa-magnifying-glass-location {\n --fa: "\\f689";\n}\n\n.fa-search-location {\n --fa: "\\f689";\n}\n\n.fa-socks {\n --fa: "\\f696";\n}\n\n.fa-square-root-variable {\n --fa: "\\f698";\n}\n\n.fa-square-root-alt {\n --fa: "\\f698";\n}\n\n.fa-star-and-crescent {\n --fa: "\\f699";\n}\n\n.fa-star-of-david {\n --fa: "\\f69a";\n}\n\n.fa-synagogue {\n --fa: "\\f69b";\n}\n\n.fa-scroll-torah {\n --fa: "\\f6a0";\n}\n\n.fa-torah {\n --fa: "\\f6a0";\n}\n\n.fa-torii-gate {\n --fa: "\\f6a1";\n}\n\n.fa-vihara {\n --fa: "\\f6a7";\n}\n\n.fa-volume {\n --fa: "\\f6a8";\n}\n\n.fa-volume-medium {\n --fa: "\\f6a8";\n}\n\n.fa-volume-xmark {\n --fa: "\\f6a9";\n}\n\n.fa-volume-mute {\n --fa: "\\f6a9";\n}\n\n.fa-volume-times {\n --fa: "\\f6a9";\n}\n\n.fa-yin-yang {\n --fa: "\\f6ad";\n}\n\n.fa-blender-phone {\n --fa: "\\f6b6";\n}\n\n.fa-book-skull {\n --fa: "\\f6b7";\n}\n\n.fa-book-dead {\n --fa: "\\f6b7";\n}\n\n.fa-campground {\n --fa: "\\f6bb";\n}\n\n.fa-cat {\n --fa: "\\f6be";\n}\n\n.fa-chair {\n --fa: "\\f6c0";\n}\n\n.fa-cloud-moon {\n --fa: "\\f6c3";\n}\n\n.fa-cloud-sun {\n --fa: "\\f6c4";\n}\n\n.fa-cow {\n --fa: "\\f6c8";\n}\n\n.fa-dice-d20 {\n --fa: "\\f6cf";\n}\n\n.fa-dice-d6 {\n --fa: "\\f6d1";\n}\n\n.fa-dog {\n --fa: "\\f6d3";\n}\n\n.fa-dragon {\n --fa: "\\f6d5";\n}\n\n.fa-drumstick-bite {\n --fa: "\\f6d7";\n}\n\n.fa-dungeon {\n --fa: "\\f6d9";\n}\n\n.fa-file-csv {\n --fa: "\\f6dd";\n}\n\n.fa-hand-fist {\n --fa: "\\f6de";\n}\n\n.fa-fist-raised {\n --fa: "\\f6de";\n}\n\n.fa-ghost {\n --fa: "\\f6e2";\n}\n\n.fa-hammer {\n --fa: "\\f6e3";\n}\n\n.fa-hanukiah {\n --fa: "\\f6e6";\n}\n\n.fa-hat-wizard {\n --fa: "\\f6e8";\n}\n\n.fa-person-hiking {\n --fa: "\\f6ec";\n}\n\n.fa-hiking {\n --fa: "\\f6ec";\n}\n\n.fa-hippo {\n --fa: "\\f6ed";\n}\n\n.fa-horse {\n --fa: "\\f6f0";\n}\n\n.fa-house-chimney-crack {\n --fa: "\\f6f1";\n}\n\n.fa-house-damage {\n --fa: "\\f6f1";\n}\n\n.fa-hryvnia-sign {\n --fa: "\\f6f2";\n}\n\n.fa-hryvnia {\n --fa: "\\f6f2";\n}\n\n.fa-mask {\n --fa: "\\f6fa";\n}\n\n.fa-mountain {\n --fa: "\\f6fc";\n}\n\n.fa-network-wired {\n --fa: "\\f6ff";\n}\n\n.fa-otter {\n --fa: "\\f700";\n}\n\n.fa-ring {\n --fa: "\\f70b";\n}\n\n.fa-person-running {\n --fa: "\\f70c";\n}\n\n.fa-running {\n --fa: "\\f70c";\n}\n\n.fa-scroll {\n --fa: "\\f70e";\n}\n\n.fa-skull-crossbones {\n --fa: "\\f714";\n}\n\n.fa-slash {\n --fa: "\\f715";\n}\n\n.fa-spider {\n --fa: "\\f717";\n}\n\n.fa-toilet-paper {\n --fa: "\\f71e";\n}\n\n.fa-toilet-paper-alt {\n --fa: "\\f71e";\n}\n\n.fa-toilet-paper-blank {\n --fa: "\\f71e";\n}\n\n.fa-tractor {\n --fa: "\\f722";\n}\n\n.fa-user-injured {\n --fa: "\\f728";\n}\n\n.fa-vr-cardboard {\n --fa: "\\f729";\n}\n\n.fa-wand-sparkles {\n --fa: "\\f72b";\n}\n\n.fa-wind {\n --fa: "\\f72e";\n}\n\n.fa-wine-bottle {\n --fa: "\\f72f";\n}\n\n.fa-cloud-meatball {\n --fa: "\\f73b";\n}\n\n.fa-cloud-moon-rain {\n --fa: "\\f73c";\n}\n\n.fa-cloud-rain {\n --fa: "\\f73d";\n}\n\n.fa-cloud-showers-heavy {\n --fa: "\\f740";\n}\n\n.fa-cloud-sun-rain {\n --fa: "\\f743";\n}\n\n.fa-democrat {\n --fa: "\\f747";\n}\n\n.fa-flag-usa {\n --fa: "\\f74d";\n}\n\n.fa-hurricane {\n --fa: "\\f751";\n}\n\n.fa-landmark-dome {\n --fa: "\\f752";\n}\n\n.fa-landmark-alt {\n --fa: "\\f752";\n}\n\n.fa-meteor {\n --fa: "\\f753";\n}\n\n.fa-person-booth {\n --fa: "\\f756";\n}\n\n.fa-poo-storm {\n --fa: "\\f75a";\n}\n\n.fa-poo-bolt {\n --fa: "\\f75a";\n}\n\n.fa-rainbow {\n --fa: "\\f75b";\n}\n\n.fa-republican {\n --fa: "\\f75e";\n}\n\n.fa-smog {\n --fa: "\\f75f";\n}\n\n.fa-temperature-high {\n --fa: "\\f769";\n}\n\n.fa-temperature-low {\n --fa: "\\f76b";\n}\n\n.fa-cloud-bolt {\n --fa: "\\f76c";\n}\n\n.fa-thunderstorm {\n --fa: "\\f76c";\n}\n\n.fa-tornado {\n --fa: "\\f76f";\n}\n\n.fa-volcano {\n --fa: "\\f770";\n}\n\n.fa-check-to-slot {\n --fa: "\\f772";\n}\n\n.fa-vote-yea {\n --fa: "\\f772";\n}\n\n.fa-water {\n --fa: "\\f773";\n}\n\n.fa-baby {\n --fa: "\\f77c";\n}\n\n.fa-baby-carriage {\n --fa: "\\f77d";\n}\n\n.fa-carriage-baby {\n --fa: "\\f77d";\n}\n\n.fa-biohazard {\n --fa: "\\f780";\n}\n\n.fa-blog {\n --fa: "\\f781";\n}\n\n.fa-calendar-day {\n --fa: "\\f783";\n}\n\n.fa-calendar-week {\n --fa: "\\f784";\n}\n\n.fa-candy-cane {\n --fa: "\\f786";\n}\n\n.fa-carrot {\n --fa: "\\f787";\n}\n\n.fa-cash-register {\n --fa: "\\f788";\n}\n\n.fa-minimize {\n --fa: "\\f78c";\n}\n\n.fa-compress-arrows-alt {\n --fa: "\\f78c";\n}\n\n.fa-dumpster {\n --fa: "\\f793";\n}\n\n.fa-dumpster-fire {\n --fa: "\\f794";\n}\n\n.fa-ethernet {\n --fa: "\\f796";\n}\n\n.fa-gifts {\n --fa: "\\f79c";\n}\n\n.fa-champagne-glasses {\n --fa: "\\f79f";\n}\n\n.fa-glass-cheers {\n --fa: "\\f79f";\n}\n\n.fa-whiskey-glass {\n --fa: "\\f7a0";\n}\n\n.fa-glass-whiskey {\n --fa: "\\f7a0";\n}\n\n.fa-earth-europe {\n --fa: "\\f7a2";\n}\n\n.fa-globe-europe {\n --fa: "\\f7a2";\n}\n\n.fa-grip-lines {\n --fa: "\\f7a4";\n}\n\n.fa-grip-lines-vertical {\n --fa: "\\f7a5";\n}\n\n.fa-guitar {\n --fa: "\\f7a6";\n}\n\n.fa-heart-crack {\n --fa: "\\f7a9";\n}\n\n.fa-heart-broken {\n --fa: "\\f7a9";\n}\n\n.fa-holly-berry {\n --fa: "\\f7aa";\n}\n\n.fa-horse-head {\n --fa: "\\f7ab";\n}\n\n.fa-icicles {\n --fa: "\\f7ad";\n}\n\n.fa-igloo {\n --fa: "\\f7ae";\n}\n\n.fa-mitten {\n --fa: "\\f7b5";\n}\n\n.fa-mug-hot {\n --fa: "\\f7b6";\n}\n\n.fa-radiation {\n --fa: "\\f7b9";\n}\n\n.fa-circle-radiation {\n --fa: "\\f7ba";\n}\n\n.fa-radiation-alt {\n --fa: "\\f7ba";\n}\n\n.fa-restroom {\n --fa: "\\f7bd";\n}\n\n.fa-satellite {\n --fa: "\\f7bf";\n}\n\n.fa-satellite-dish {\n --fa: "\\f7c0";\n}\n\n.fa-sd-card {\n --fa: "\\f7c2";\n}\n\n.fa-sim-card {\n --fa: "\\f7c4";\n}\n\n.fa-person-skating {\n --fa: "\\f7c5";\n}\n\n.fa-skating {\n --fa: "\\f7c5";\n}\n\n.fa-person-skiing {\n --fa: "\\f7c9";\n}\n\n.fa-skiing {\n --fa: "\\f7c9";\n}\n\n.fa-person-skiing-nordic {\n --fa: "\\f7ca";\n}\n\n.fa-skiing-nordic {\n --fa: "\\f7ca";\n}\n\n.fa-sleigh {\n --fa: "\\f7cc";\n}\n\n.fa-comment-sms {\n --fa: "\\f7cd";\n}\n\n.fa-sms {\n --fa: "\\f7cd";\n}\n\n.fa-person-snowboarding {\n --fa: "\\f7ce";\n}\n\n.fa-snowboarding {\n --fa: "\\f7ce";\n}\n\n.fa-snowman {\n --fa: "\\f7d0";\n}\n\n.fa-snowplow {\n --fa: "\\f7d2";\n}\n\n.fa-tenge-sign {\n --fa: "\\f7d7";\n}\n\n.fa-tenge {\n --fa: "\\f7d7";\n}\n\n.fa-toilet {\n --fa: "\\f7d8";\n}\n\n.fa-screwdriver-wrench {\n --fa: "\\f7d9";\n}\n\n.fa-tools {\n --fa: "\\f7d9";\n}\n\n.fa-cable-car {\n --fa: "\\f7da";\n}\n\n.fa-tram {\n --fa: "\\f7da";\n}\n\n.fa-fire-flame-curved {\n --fa: "\\f7e4";\n}\n\n.fa-fire-alt {\n --fa: "\\f7e4";\n}\n\n.fa-bacon {\n --fa: "\\f7e5";\n}\n\n.fa-book-medical {\n --fa: "\\f7e6";\n}\n\n.fa-bread-slice {\n --fa: "\\f7ec";\n}\n\n.fa-cheese {\n --fa: "\\f7ef";\n}\n\n.fa-house-chimney-medical {\n --fa: "\\f7f2";\n}\n\n.fa-clinic-medical {\n --fa: "\\f7f2";\n}\n\n.fa-clipboard-user {\n --fa: "\\f7f3";\n}\n\n.fa-comment-medical {\n --fa: "\\f7f5";\n}\n\n.fa-crutch {\n --fa: "\\f7f7";\n}\n\n.fa-disease {\n --fa: "\\f7fa";\n}\n\n.fa-egg {\n --fa: "\\f7fb";\n}\n\n.fa-folder-tree {\n --fa: "\\f802";\n}\n\n.fa-burger {\n --fa: "\\f805";\n}\n\n.fa-hamburger {\n --fa: "\\f805";\n}\n\n.fa-hand-middle-finger {\n --fa: "\\f806";\n}\n\n.fa-helmet-safety {\n --fa: "\\f807";\n}\n\n.fa-hard-hat {\n --fa: "\\f807";\n}\n\n.fa-hat-hard {\n --fa: "\\f807";\n}\n\n.fa-hospital-user {\n --fa: "\\f80d";\n}\n\n.fa-hotdog {\n --fa: "\\f80f";\n}\n\n.fa-ice-cream {\n --fa: "\\f810";\n}\n\n.fa-laptop-medical {\n --fa: "\\f812";\n}\n\n.fa-pager {\n --fa: "\\f815";\n}\n\n.fa-pepper-hot {\n --fa: "\\f816";\n}\n\n.fa-pizza-slice {\n --fa: "\\f818";\n}\n\n.fa-sack-dollar {\n --fa: "\\f81d";\n}\n\n.fa-book-tanakh {\n --fa: "\\f827";\n}\n\n.fa-tanakh {\n --fa: "\\f827";\n}\n\n.fa-bars-progress {\n --fa: "\\f828";\n}\n\n.fa-tasks-alt {\n --fa: "\\f828";\n}\n\n.fa-trash-arrow-up {\n --fa: "\\f829";\n}\n\n.fa-trash-restore {\n --fa: "\\f829";\n}\n\n.fa-trash-can-arrow-up {\n --fa: "\\f82a";\n}\n\n.fa-trash-restore-alt {\n --fa: "\\f82a";\n}\n\n.fa-user-nurse {\n --fa: "\\f82f";\n}\n\n.fa-wave-square {\n --fa: "\\f83e";\n}\n\n.fa-person-biking {\n --fa: "\\f84a";\n}\n\n.fa-biking {\n --fa: "\\f84a";\n}\n\n.fa-border-all {\n --fa: "\\f84c";\n}\n\n.fa-border-none {\n --fa: "\\f850";\n}\n\n.fa-border-top-left {\n --fa: "\\f853";\n}\n\n.fa-border-style {\n --fa: "\\f853";\n}\n\n.fa-person-digging {\n --fa: "\\f85e";\n}\n\n.fa-digging {\n --fa: "\\f85e";\n}\n\n.fa-fan {\n --fa: "\\f863";\n}\n\n.fa-icons {\n --fa: "\\f86d";\n}\n\n.fa-heart-music-camera-bolt {\n --fa: "\\f86d";\n}\n\n.fa-phone-flip {\n --fa: "\\f879";\n}\n\n.fa-phone-alt {\n --fa: "\\f879";\n}\n\n.fa-square-phone-flip {\n --fa: "\\f87b";\n}\n\n.fa-phone-square-alt {\n --fa: "\\f87b";\n}\n\n.fa-photo-film {\n --fa: "\\f87c";\n}\n\n.fa-photo-video {\n --fa: "\\f87c";\n}\n\n.fa-text-slash {\n --fa: "\\f87d";\n}\n\n.fa-remove-format {\n --fa: "\\f87d";\n}\n\n.fa-arrow-down-z-a {\n --fa: "\\f881";\n}\n\n.fa-sort-alpha-desc {\n --fa: "\\f881";\n}\n\n.fa-sort-alpha-down-alt {\n --fa: "\\f881";\n}\n\n.fa-arrow-up-z-a {\n --fa: "\\f882";\n}\n\n.fa-sort-alpha-up-alt {\n --fa: "\\f882";\n}\n\n.fa-arrow-down-short-wide {\n --fa: "\\f884";\n}\n\n.fa-sort-amount-desc {\n --fa: "\\f884";\n}\n\n.fa-sort-amount-down-alt {\n --fa: "\\f884";\n}\n\n.fa-arrow-up-short-wide {\n --fa: "\\f885";\n}\n\n.fa-sort-amount-up-alt {\n --fa: "\\f885";\n}\n\n.fa-arrow-down-9-1 {\n --fa: "\\f886";\n}\n\n.fa-sort-numeric-desc {\n --fa: "\\f886";\n}\n\n.fa-sort-numeric-down-alt {\n --fa: "\\f886";\n}\n\n.fa-arrow-up-9-1 {\n --fa: "\\f887";\n}\n\n.fa-sort-numeric-up-alt {\n --fa: "\\f887";\n}\n\n.fa-spell-check {\n --fa: "\\f891";\n}\n\n.fa-voicemail {\n --fa: "\\f897";\n}\n\n.fa-hat-cowboy {\n --fa: "\\f8c0";\n}\n\n.fa-hat-cowboy-side {\n --fa: "\\f8c1";\n}\n\n.fa-computer-mouse {\n --fa: "\\f8cc";\n}\n\n.fa-mouse {\n --fa: "\\f8cc";\n}\n\n.fa-radio {\n --fa: "\\f8d7";\n}\n\n.fa-record-vinyl {\n --fa: "\\f8d9";\n}\n\n.fa-walkie-talkie {\n --fa: "\\f8ef";\n}\n\n.fa-caravan {\n --fa: "\\f8ff";\n}\n:root, :host {\n --fa-family-brands: \'Font Awesome 7 Brands\';\n --fa-font-brands: normal 400 1em/1 var(--fa-family-brands);\n}\n\n@font-face {\n font-family: "Font Awesome 7 Brands";\n font-style: normal;\n font-weight: 400;\n font-display: block;\n src: url("../webfonts/fa-brands-400.woff2");\n}\n.fab,\n.fa-brands,\n.fa-classic.fa-brands {\n --fa-family: var(--fa-family-brands);\n --fa-style: 400;\n}\n\n.fa-firefox-browser {\n --fa: "\\e007";\n}\n\n.fa-ideal {\n --fa: "\\e013";\n}\n\n.fa-microblog {\n --fa: "\\e01a";\n}\n\n.fa-square-pied-piper {\n --fa: "\\e01e";\n}\n\n.fa-pied-piper-square {\n --fa: "\\e01e";\n}\n\n.fa-unity {\n --fa: "\\e049";\n}\n\n.fa-dailymotion {\n --fa: "\\e052";\n}\n\n.fa-square-instagram {\n --fa: "\\e055";\n}\n\n.fa-instagram-square {\n --fa: "\\e055";\n}\n\n.fa-mixer {\n --fa: "\\e056";\n}\n\n.fa-shopify {\n --fa: "\\e057";\n}\n\n.fa-deezer {\n --fa: "\\e077";\n}\n\n.fa-edge-legacy {\n --fa: "\\e078";\n}\n\n.fa-google-pay {\n --fa: "\\e079";\n}\n\n.fa-rust {\n --fa: "\\e07a";\n}\n\n.fa-tiktok {\n --fa: "\\e07b";\n}\n\n.fa-unsplash {\n --fa: "\\e07c";\n}\n\n.fa-cloudflare {\n --fa: "\\e07d";\n}\n\n.fa-guilded {\n --fa: "\\e07e";\n}\n\n.fa-hive {\n --fa: "\\e07f";\n}\n\n.fa-42-group {\n --fa: "\\e080";\n}\n\n.fa-innosoft {\n --fa: "\\e080";\n}\n\n.fa-instalod {\n --fa: "\\e081";\n}\n\n.fa-octopus-deploy {\n --fa: "\\e082";\n}\n\n.fa-perbyte {\n --fa: "\\e083";\n}\n\n.fa-uncharted {\n --fa: "\\e084";\n}\n\n.fa-watchman-monitoring {\n --fa: "\\e087";\n}\n\n.fa-wodu {\n --fa: "\\e088";\n}\n\n.fa-wirsindhandwerk {\n --fa: "\\e2d0";\n}\n\n.fa-wsh {\n --fa: "\\e2d0";\n}\n\n.fa-bots {\n --fa: "\\e340";\n}\n\n.fa-cmplid {\n --fa: "\\e360";\n}\n\n.fa-bilibili {\n --fa: "\\e3d9";\n}\n\n.fa-golang {\n --fa: "\\e40f";\n}\n\n.fa-pix {\n --fa: "\\e43a";\n}\n\n.fa-sitrox {\n --fa: "\\e44a";\n}\n\n.fa-hashnode {\n --fa: "\\e499";\n}\n\n.fa-meta {\n --fa: "\\e49b";\n}\n\n.fa-padlet {\n --fa: "\\e4a0";\n}\n\n.fa-nfc-directional {\n --fa: "\\e530";\n}\n\n.fa-nfc-symbol {\n --fa: "\\e531";\n}\n\n.fa-screenpal {\n --fa: "\\e570";\n}\n\n.fa-space-awesome {\n --fa: "\\e5ac";\n}\n\n.fa-square-font-awesome {\n --fa: "\\e5ad";\n}\n\n.fa-square-gitlab {\n --fa: "\\e5ae";\n}\n\n.fa-gitlab-square {\n --fa: "\\e5ae";\n}\n\n.fa-odysee {\n --fa: "\\e5c6";\n}\n\n.fa-stubber {\n --fa: "\\e5c7";\n}\n\n.fa-debian {\n --fa: "\\e60b";\n}\n\n.fa-shoelace {\n --fa: "\\e60c";\n}\n\n.fa-threads {\n --fa: "\\e618";\n}\n\n.fa-square-threads {\n --fa: "\\e619";\n}\n\n.fa-square-x-twitter {\n --fa: "\\e61a";\n}\n\n.fa-x-twitter {\n --fa: "\\e61b";\n}\n\n.fa-opensuse {\n --fa: "\\e62b";\n}\n\n.fa-letterboxd {\n --fa: "\\e62d";\n}\n\n.fa-square-letterboxd {\n --fa: "\\e62e";\n}\n\n.fa-mintbit {\n --fa: "\\e62f";\n}\n\n.fa-google-scholar {\n --fa: "\\e63b";\n}\n\n.fa-brave {\n --fa: "\\e63c";\n}\n\n.fa-brave-reverse {\n --fa: "\\e63d";\n}\n\n.fa-pixiv {\n --fa: "\\e640";\n}\n\n.fa-upwork {\n --fa: "\\e641";\n}\n\n.fa-webflow {\n --fa: "\\e65c";\n}\n\n.fa-signal-messenger {\n --fa: "\\e663";\n}\n\n.fa-bluesky {\n --fa: "\\e671";\n}\n\n.fa-jxl {\n --fa: "\\e67b";\n}\n\n.fa-square-upwork {\n --fa: "\\e67c";\n}\n\n.fa-web-awesome {\n --fa: "\\e682";\n}\n\n.fa-square-web-awesome {\n --fa: "\\e683";\n}\n\n.fa-square-web-awesome-stroke {\n --fa: "\\e684";\n}\n\n.fa-dart-lang {\n --fa: "\\e693";\n}\n\n.fa-flutter {\n --fa: "\\e694";\n}\n\n.fa-files-pinwheel {\n --fa: "\\e69f";\n}\n\n.fa-css {\n --fa: "\\e6a2";\n}\n\n.fa-square-bluesky {\n --fa: "\\e6a3";\n}\n\n.fa-openai {\n --fa: "\\e7cf";\n}\n\n.fa-square-linkedin {\n --fa: "\\e7d0";\n}\n\n.fa-cash-app {\n --fa: "\\e7d4";\n}\n\n.fa-disqus {\n --fa: "\\e7d5";\n}\n\n.fa-eleventy {\n --fa: "\\e7d6";\n}\n\n.fa-11ty {\n --fa: "\\e7d6";\n}\n\n.fa-kakao-talk {\n --fa: "\\e7d7";\n}\n\n.fa-linktree {\n --fa: "\\e7d8";\n}\n\n.fa-notion {\n --fa: "\\e7d9";\n}\n\n.fa-pandora {\n --fa: "\\e7da";\n}\n\n.fa-pixelfed {\n --fa: "\\e7db";\n}\n\n.fa-tidal {\n --fa: "\\e7dc";\n}\n\n.fa-vsco {\n --fa: "\\e7dd";\n}\n\n.fa-w3c {\n --fa: "\\e7de";\n}\n\n.fa-lumon {\n --fa: "\\e7e2";\n}\n\n.fa-lumon-drop {\n --fa: "\\e7e3";\n}\n\n.fa-square-figma {\n --fa: "\\e7e4";\n}\n\n.fa-tex {\n --fa: "\\e7ff";\n}\n\n.fa-duolingo {\n --fa: "\\e812";\n}\n\n.fa-supportnow {\n --fa: "\\e833";\n}\n\n.fa-tor-browser {\n --fa: "\\e838";\n}\n\n.fa-typescript {\n --fa: "\\e840";\n}\n\n.fa-square-deskpro {\n --fa: "\\e844";\n}\n\n.fa-circle-zulip {\n --fa: "\\e851";\n}\n\n.fa-julia {\n --fa: "\\e852";\n}\n\n.fa-zulip {\n --fa: "\\e853";\n}\n\n.fa-unison {\n --fa: "\\e854";\n}\n\n.fa-board-game-geek {\n --fa: "\\e855";\n}\n\n.fa-bgg {\n --fa: "\\e855";\n}\n\n.fa-ko-fi {\n --fa: "\\e856";\n}\n\n.fa-kubernetes {\n --fa: "\\e857";\n}\n\n.fa-postgresql {\n --fa: "\\e858";\n}\n\n.fa-scaleway {\n --fa: "\\e859";\n}\n\n.fa-venmo {\n --fa: "\\e85a";\n}\n\n.fa-venmo-v {\n --fa: "\\e85b";\n}\n\n.fa-unreal-engine {\n --fa: "\\e85c";\n}\n\n.fa-globaleaks {\n --fa: "\\e85d";\n}\n\n.fa-solana {\n --fa: "\\e85e";\n}\n\n.fa-threema {\n --fa: "\\e85f";\n}\n\n.fa-forgejo {\n --fa: "\\e860";\n}\n\n.fa-claude {\n --fa: "\\e861";\n}\n\n.fa-gitee {\n --fa: "\\e863";\n}\n\n.fa-xmpp {\n --fa: "\\e864";\n}\n\n.fa-fediverse {\n --fa: "\\e865";\n}\n\n.fa-tailwind-css {\n --fa: "\\e866";\n}\n\n.fa-arch-linux {\n --fa: "\\e867";\n}\n\n.fa-svelte {\n --fa: "\\e868";\n}\n\n.fa-hugging-face {\n --fa: "\\e869";\n}\n\n.fa-leetcode {\n --fa: "\\e86a";\n}\n\n.fa-openstreetmap {\n --fa: "\\e86b";\n}\n\n.fa-ultralytics {\n --fa: "\\e86d";\n}\n\n.fa-ultralytics-hub {\n --fa: "\\e86e";\n}\n\n.fa-ultralytics-yolo {\n --fa: "\\e86f";\n}\n\n.fa-obsidian {\n --fa: "\\e879";\n}\n\n.fa-zoom {\n --fa: "\\e87b";\n}\n\n.fa-vim {\n --fa: "\\e88a";\n}\n\n.fa-symfonycasts {\n --fa: "\\e8ab";\n}\n\n.fa-build-awesome {\n --fa: "\\e8ac";\n}\n\n.fa-codeberg {\n --fa: "\\e8ad";\n}\n\n.fa-devpost {\n --fa: "\\e8ae";\n}\n\n.fa-internet-archive {\n --fa: "\\e8b1";\n}\n\n.fa-lets-encrypt {\n --fa: "\\e8b2";\n}\n\n.fa-matrix {\n --fa: "\\e8b3";\n}\n\n.fa-mattermost {\n --fa: "\\e8b4";\n}\n\n.fa-nextcloud {\n --fa: "\\e8b5";\n}\n\n.fa-roblox-creator-studio {\n --fa: "\\e8b6";\n}\n\n.fa-square-build-awesome-stroke {\n --fa: "\\e8b7";\n}\n\n.fa-substack {\n --fa: "\\e8b8";\n}\n\n.fa-tesla {\n --fa: "\\e8b9";\n}\n\n.fa-xrp {\n --fa: "\\e8ba";\n}\n\n.fa-xrpl {\n --fa: "\\e8bb";\n}\n\n.fa-youtube-shorts {\n --fa: "\\e8bc";\n}\n\n.fa-ror {\n --fa: "\\e8bd";\n}\n\n.fa-visual-studio {\n --fa: "\\e8be";\n}\n\n.fa-dolibarr {\n --fa: "\\e8bf";\n}\n\n.fa-obs-studio {\n --fa: "\\e8c0";\n}\n\n.fa-storybook {\n --fa: "\\e8c1";\n}\n\n.fa-a11y-project {\n --fa: "\\e8c2";\n}\n\n.fa-copilot {\n --fa: "\\e8c7";\n}\n\n.fa-square-twitter {\n --fa: "\\f081";\n}\n\n.fa-twitter-square {\n --fa: "\\f081";\n}\n\n.fa-square-facebook {\n --fa: "\\f082";\n}\n\n.fa-facebook-square {\n --fa: "\\f082";\n}\n\n.fa-linkedin {\n --fa: "\\f08c";\n}\n\n.fa-square-github {\n --fa: "\\f092";\n}\n\n.fa-github-square {\n --fa: "\\f092";\n}\n\n.fa-twitter {\n --fa: "\\f099";\n}\n\n.fa-facebook {\n --fa: "\\f09a";\n}\n\n.fa-github {\n --fa: "\\f09b";\n}\n\n.fa-pinterest {\n --fa: "\\f0d2";\n}\n\n.fa-square-pinterest {\n --fa: "\\f0d3";\n}\n\n.fa-pinterest-square {\n --fa: "\\f0d3";\n}\n\n.fa-square-google-plus {\n --fa: "\\f0d4";\n}\n\n.fa-google-plus-square {\n --fa: "\\f0d4";\n}\n\n.fa-google-plus-g {\n --fa: "\\f0d5";\n}\n\n.fa-linkedin-in {\n --fa: "\\f0e1";\n}\n\n.fa-github-alt {\n --fa: "\\f113";\n}\n\n.fa-maxcdn {\n --fa: "\\f136";\n}\n\n.fa-html5 {\n --fa: "\\f13b";\n}\n\n.fa-css3 {\n --fa: "\\f13c";\n}\n\n.fa-btc {\n --fa: "\\f15a";\n}\n\n.fa-youtube {\n --fa: "\\f167";\n}\n\n.fa-xing {\n --fa: "\\f168";\n}\n\n.fa-square-xing {\n --fa: "\\f169";\n}\n\n.fa-xing-square {\n --fa: "\\f169";\n}\n\n.fa-dropbox {\n --fa: "\\f16b";\n}\n\n.fa-stack-overflow {\n --fa: "\\f16c";\n}\n\n.fa-instagram {\n --fa: "\\f16d";\n}\n\n.fa-flickr {\n --fa: "\\f16e";\n}\n\n.fa-adn {\n --fa: "\\f170";\n}\n\n.fa-bitbucket {\n --fa: "\\f171";\n}\n\n.fa-tumblr {\n --fa: "\\f173";\n}\n\n.fa-square-tumblr {\n --fa: "\\f174";\n}\n\n.fa-tumblr-square {\n --fa: "\\f174";\n}\n\n.fa-apple {\n --fa: "\\f179";\n}\n\n.fa-windows {\n --fa: "\\f17a";\n}\n\n.fa-android {\n --fa: "\\f17b";\n}\n\n.fa-linux {\n --fa: "\\f17c";\n}\n\n.fa-dribbble {\n --fa: "\\f17d";\n}\n\n.fa-skype {\n --fa: "\\f17e";\n}\n\n.fa-foursquare {\n --fa: "\\f180";\n}\n\n.fa-trello {\n --fa: "\\f181";\n}\n\n.fa-gratipay {\n --fa: "\\f184";\n}\n\n.fa-vk {\n --fa: "\\f189";\n}\n\n.fa-weibo {\n --fa: "\\f18a";\n}\n\n.fa-renren {\n --fa: "\\f18b";\n}\n\n.fa-pagelines {\n --fa: "\\f18c";\n}\n\n.fa-stack-exchange {\n --fa: "\\f18d";\n}\n\n.fa-square-vimeo {\n --fa: "\\f194";\n}\n\n.fa-vimeo-square {\n --fa: "\\f194";\n}\n\n.fa-slack {\n --fa: "\\f198";\n}\n\n.fa-slack-hash {\n --fa: "\\f198";\n}\n\n.fa-wordpress {\n --fa: "\\f19a";\n}\n\n.fa-openid {\n --fa: "\\f19b";\n}\n\n.fa-yahoo {\n --fa: "\\f19e";\n}\n\n.fa-google {\n --fa: "\\f1a0";\n}\n\n.fa-reddit {\n --fa: "\\f1a1";\n}\n\n.fa-square-reddit {\n --fa: "\\f1a2";\n}\n\n.fa-reddit-square {\n --fa: "\\f1a2";\n}\n\n.fa-stumbleupon-circle {\n --fa: "\\f1a3";\n}\n\n.fa-stumbleupon {\n --fa: "\\f1a4";\n}\n\n.fa-delicious {\n --fa: "\\f1a5";\n}\n\n.fa-digg {\n --fa: "\\f1a6";\n}\n\n.fa-pied-piper-pp {\n --fa: "\\f1a7";\n}\n\n.fa-pied-piper-alt {\n --fa: "\\f1a8";\n}\n\n.fa-drupal {\n --fa: "\\f1a9";\n}\n\n.fa-joomla {\n --fa: "\\f1aa";\n}\n\n.fa-behance {\n --fa: "\\f1b4";\n}\n\n.fa-square-behance {\n --fa: "\\f1b5";\n}\n\n.fa-behance-square {\n --fa: "\\f1b5";\n}\n\n.fa-steam {\n --fa: "\\f1b6";\n}\n\n.fa-square-steam {\n --fa: "\\f1b7";\n}\n\n.fa-steam-square {\n --fa: "\\f1b7";\n}\n\n.fa-spotify {\n --fa: "\\f1bc";\n}\n\n.fa-deviantart {\n --fa: "\\f1bd";\n}\n\n.fa-soundcloud {\n --fa: "\\f1be";\n}\n\n.fa-vine {\n --fa: "\\f1ca";\n}\n\n.fa-codepen {\n --fa: "\\f1cb";\n}\n\n.fa-jsfiddle {\n --fa: "\\f1cc";\n}\n\n.fa-rebel {\n --fa: "\\f1d0";\n}\n\n.fa-empire {\n --fa: "\\f1d1";\n}\n\n.fa-square-git {\n --fa: "\\f1d2";\n}\n\n.fa-git-square {\n --fa: "\\f1d2";\n}\n\n.fa-git {\n --fa: "\\f1d3";\n}\n\n.fa-hacker-news {\n --fa: "\\f1d4";\n}\n\n.fa-tencent-weibo {\n --fa: "\\f1d5";\n}\n\n.fa-qq {\n --fa: "\\f1d6";\n}\n\n.fa-weixin {\n --fa: "\\f1d7";\n}\n\n.fa-slideshare {\n --fa: "\\f1e7";\n}\n\n.fa-twitch {\n --fa: "\\f1e8";\n}\n\n.fa-yelp {\n --fa: "\\f1e9";\n}\n\n.fa-paypal {\n --fa: "\\f1ed";\n}\n\n.fa-google-wallet {\n --fa: "\\f1ee";\n}\n\n.fa-cc-visa {\n --fa: "\\f1f0";\n}\n\n.fa-cc-mastercard {\n --fa: "\\f1f1";\n}\n\n.fa-cc-discover {\n --fa: "\\f1f2";\n}\n\n.fa-cc-amex {\n --fa: "\\f1f3";\n}\n\n.fa-cc-paypal {\n --fa: "\\f1f4";\n}\n\n.fa-cc-stripe {\n --fa: "\\f1f5";\n}\n\n.fa-lastfm {\n --fa: "\\f202";\n}\n\n.fa-square-lastfm {\n --fa: "\\f203";\n}\n\n.fa-lastfm-square {\n --fa: "\\f203";\n}\n\n.fa-ioxhost {\n --fa: "\\f208";\n}\n\n.fa-angellist {\n --fa: "\\f209";\n}\n\n.fa-buysellads {\n --fa: "\\f20d";\n}\n\n.fa-connectdevelop {\n --fa: "\\f20e";\n}\n\n.fa-dashcube {\n --fa: "\\f210";\n}\n\n.fa-forumbee {\n --fa: "\\f211";\n}\n\n.fa-leanpub {\n --fa: "\\f212";\n}\n\n.fa-sellsy {\n --fa: "\\f213";\n}\n\n.fa-shirtsinbulk {\n --fa: "\\f214";\n}\n\n.fa-simplybuilt {\n --fa: "\\f215";\n}\n\n.fa-skyatlas {\n --fa: "\\f216";\n}\n\n.fa-pinterest-p {\n --fa: "\\f231";\n}\n\n.fa-whatsapp {\n --fa: "\\f232";\n}\n\n.fa-viacoin {\n --fa: "\\f237";\n}\n\n.fa-medium {\n --fa: "\\f23a";\n}\n\n.fa-medium-m {\n --fa: "\\f23a";\n}\n\n.fa-y-combinator {\n --fa: "\\f23b";\n}\n\n.fa-optin-monster {\n --fa: "\\f23c";\n}\n\n.fa-opencart {\n --fa: "\\f23d";\n}\n\n.fa-expeditedssl {\n --fa: "\\f23e";\n}\n\n.fa-cc-jcb {\n --fa: "\\f24b";\n}\n\n.fa-cc-diners-club {\n --fa: "\\f24c";\n}\n\n.fa-creative-commons {\n --fa: "\\f25e";\n}\n\n.fa-gg {\n --fa: "\\f260";\n}\n\n.fa-gg-circle {\n --fa: "\\f261";\n}\n\n.fa-odnoklassniki {\n --fa: "\\f263";\n}\n\n.fa-square-odnoklassniki {\n --fa: "\\f264";\n}\n\n.fa-odnoklassniki-square {\n --fa: "\\f264";\n}\n\n.fa-get-pocket {\n --fa: "\\f265";\n}\n\n.fa-wikipedia-w {\n --fa: "\\f266";\n}\n\n.fa-safari {\n --fa: "\\f267";\n}\n\n.fa-chrome {\n --fa: "\\f268";\n}\n\n.fa-firefox {\n --fa: "\\f269";\n}\n\n.fa-opera {\n --fa: "\\f26a";\n}\n\n.fa-internet-explorer {\n --fa: "\\f26b";\n}\n\n.fa-contao {\n --fa: "\\f26d";\n}\n\n.fa-500px {\n --fa: "\\f26e";\n}\n\n.fa-amazon {\n --fa: "\\f270";\n}\n\n.fa-houzz {\n --fa: "\\f27c";\n}\n\n.fa-vimeo-v {\n --fa: "\\f27d";\n}\n\n.fa-black-tie {\n --fa: "\\f27e";\n}\n\n.fa-fonticons {\n --fa: "\\f280";\n}\n\n.fa-reddit-alien {\n --fa: "\\f281";\n}\n\n.fa-edge {\n --fa: "\\f282";\n}\n\n.fa-codiepie {\n --fa: "\\f284";\n}\n\n.fa-modx {\n --fa: "\\f285";\n}\n\n.fa-fort-awesome {\n --fa: "\\f286";\n}\n\n.fa-usb {\n --fa: "\\f287";\n}\n\n.fa-product-hunt {\n --fa: "\\f288";\n}\n\n.fa-mixcloud {\n --fa: "\\f289";\n}\n\n.fa-scribd {\n --fa: "\\f28a";\n}\n\n.fa-bluetooth {\n --fa: "\\f293";\n}\n\n.fa-bluetooth-b {\n --fa: "\\f294";\n}\n\n.fa-gitlab {\n --fa: "\\f296";\n}\n\n.fa-wpbeginner {\n --fa: "\\f297";\n}\n\n.fa-wpforms {\n --fa: "\\f298";\n}\n\n.fa-envira {\n --fa: "\\f299";\n}\n\n.fa-glide {\n --fa: "\\f2a5";\n}\n\n.fa-glide-g {\n --fa: "\\f2a6";\n}\n\n.fa-viadeo {\n --fa: "\\f2a9";\n}\n\n.fa-square-viadeo {\n --fa: "\\f2aa";\n}\n\n.fa-viadeo-square {\n --fa: "\\f2aa";\n}\n\n.fa-snapchat {\n --fa: "\\f2ab";\n}\n\n.fa-snapchat-ghost {\n --fa: "\\f2ab";\n}\n\n.fa-square-snapchat {\n --fa: "\\f2ad";\n}\n\n.fa-snapchat-square {\n --fa: "\\f2ad";\n}\n\n.fa-pied-piper {\n --fa: "\\f2ae";\n}\n\n.fa-first-order {\n --fa: "\\f2b0";\n}\n\n.fa-yoast {\n --fa: "\\f2b1";\n}\n\n.fa-themeisle {\n --fa: "\\f2b2";\n}\n\n.fa-google-plus {\n --fa: "\\f2b3";\n}\n\n.fa-font-awesome {\n --fa: "\\f2b4";\n}\n\n.fa-font-awesome-flag {\n --fa: "\\f2b4";\n}\n\n.fa-font-awesome-logo-full {\n --fa: "\\f2b4";\n}\n\n.fa-linode {\n --fa: "\\f2b8";\n}\n\n.fa-quora {\n --fa: "\\f2c4";\n}\n\n.fa-free-code-camp {\n --fa: "\\f2c5";\n}\n\n.fa-telegram {\n --fa: "\\f2c6";\n}\n\n.fa-telegram-plane {\n --fa: "\\f2c6";\n}\n\n.fa-bandcamp {\n --fa: "\\f2d5";\n}\n\n.fa-grav {\n --fa: "\\f2d6";\n}\n\n.fa-etsy {\n --fa: "\\f2d7";\n}\n\n.fa-imdb {\n --fa: "\\f2d8";\n}\n\n.fa-ravelry {\n --fa: "\\f2d9";\n}\n\n.fa-sellcast {\n --fa: "\\f2da";\n}\n\n.fa-superpowers {\n --fa: "\\f2dd";\n}\n\n.fa-wpexplorer {\n --fa: "\\f2de";\n}\n\n.fa-meetup {\n --fa: "\\f2e0";\n}\n\n.fa-square-font-awesome-stroke {\n --fa: "\\f35c";\n}\n\n.fa-font-awesome-alt {\n --fa: "\\f35c";\n}\n\n.fa-accessible-icon {\n --fa: "\\f368";\n}\n\n.fa-accusoft {\n --fa: "\\f369";\n}\n\n.fa-adversal {\n --fa: "\\f36a";\n}\n\n.fa-affiliatetheme {\n --fa: "\\f36b";\n}\n\n.fa-algolia {\n --fa: "\\f36c";\n}\n\n.fa-amilia {\n --fa: "\\f36d";\n}\n\n.fa-angrycreative {\n --fa: "\\f36e";\n}\n\n.fa-app-store {\n --fa: "\\f36f";\n}\n\n.fa-app-store-ios {\n --fa: "\\f370";\n}\n\n.fa-apper {\n --fa: "\\f371";\n}\n\n.fa-asymmetrik {\n --fa: "\\f372";\n}\n\n.fa-audible {\n --fa: "\\f373";\n}\n\n.fa-avianex {\n --fa: "\\f374";\n}\n\n.fa-aws {\n --fa: "\\f375";\n}\n\n.fa-bimobject {\n --fa: "\\f378";\n}\n\n.fa-bitcoin {\n --fa: "\\f379";\n}\n\n.fa-bity {\n --fa: "\\f37a";\n}\n\n.fa-blackberry {\n --fa: "\\f37b";\n}\n\n.fa-blogger {\n --fa: "\\f37c";\n}\n\n.fa-blogger-b {\n --fa: "\\f37d";\n}\n\n.fa-buromobelexperte {\n --fa: "\\f37f";\n}\n\n.fa-centercode {\n --fa: "\\f380";\n}\n\n.fa-cloudscale {\n --fa: "\\f383";\n}\n\n.fa-cloudsmith {\n --fa: "\\f384";\n}\n\n.fa-cloudversify {\n --fa: "\\f385";\n}\n\n.fa-cpanel {\n --fa: "\\f388";\n}\n\n.fa-css3-alt {\n --fa: "\\f38b";\n}\n\n.fa-cuttlefish {\n --fa: "\\f38c";\n}\n\n.fa-d-and-d {\n --fa: "\\f38d";\n}\n\n.fa-deploydog {\n --fa: "\\f38e";\n}\n\n.fa-deskpro {\n --fa: "\\f38f";\n}\n\n.fa-digital-ocean {\n --fa: "\\f391";\n}\n\n.fa-discord {\n --fa: "\\f392";\n}\n\n.fa-discourse {\n --fa: "\\f393";\n}\n\n.fa-dochub {\n --fa: "\\f394";\n}\n\n.fa-docker {\n --fa: "\\f395";\n}\n\n.fa-draft2digital {\n --fa: "\\f396";\n}\n\n.fa-square-dribbble {\n --fa: "\\f397";\n}\n\n.fa-dribbble-square {\n --fa: "\\f397";\n}\n\n.fa-dyalog {\n --fa: "\\f399";\n}\n\n.fa-earlybirds {\n --fa: "\\f39a";\n}\n\n.fa-erlang {\n --fa: "\\f39d";\n}\n\n.fa-facebook-f {\n --fa: "\\f39e";\n}\n\n.fa-facebook-messenger {\n --fa: "\\f39f";\n}\n\n.fa-firstdraft {\n --fa: "\\f3a1";\n}\n\n.fa-fonticons-fi {\n --fa: "\\f3a2";\n}\n\n.fa-fort-awesome-alt {\n --fa: "\\f3a3";\n}\n\n.fa-freebsd {\n --fa: "\\f3a4";\n}\n\n.fa-gitkraken {\n --fa: "\\f3a6";\n}\n\n.fa-gofore {\n --fa: "\\f3a7";\n}\n\n.fa-goodreads {\n --fa: "\\f3a8";\n}\n\n.fa-goodreads-g {\n --fa: "\\f3a9";\n}\n\n.fa-google-drive {\n --fa: "\\f3aa";\n}\n\n.fa-google-play {\n --fa: "\\f3ab";\n}\n\n.fa-gripfire {\n --fa: "\\f3ac";\n}\n\n.fa-grunt {\n --fa: "\\f3ad";\n}\n\n.fa-gulp {\n --fa: "\\f3ae";\n}\n\n.fa-square-hacker-news {\n --fa: "\\f3af";\n}\n\n.fa-hacker-news-square {\n --fa: "\\f3af";\n}\n\n.fa-hire-a-helper {\n --fa: "\\f3b0";\n}\n\n.fa-hotjar {\n --fa: "\\f3b1";\n}\n\n.fa-hubspot {\n --fa: "\\f3b2";\n}\n\n.fa-itunes {\n --fa: "\\f3b4";\n}\n\n.fa-itunes-note {\n --fa: "\\f3b5";\n}\n\n.fa-jenkins {\n --fa: "\\f3b6";\n}\n\n.fa-joget {\n --fa: "\\f3b7";\n}\n\n.fa-js {\n --fa: "\\f3b8";\n}\n\n.fa-square-js {\n --fa: "\\f3b9";\n}\n\n.fa-js-square {\n --fa: "\\f3b9";\n}\n\n.fa-keycdn {\n --fa: "\\f3ba";\n}\n\n.fa-kickstarter {\n --fa: "\\f3bb";\n}\n\n.fa-square-kickstarter {\n --fa: "\\f3bb";\n}\n\n.fa-kickstarter-k {\n --fa: "\\f3bc";\n}\n\n.fa-laravel {\n --fa: "\\f3bd";\n}\n\n.fa-line {\n --fa: "\\f3c0";\n}\n\n.fa-lyft {\n --fa: "\\f3c3";\n}\n\n.fa-magento {\n --fa: "\\f3c4";\n}\n\n.fa-medapps {\n --fa: "\\f3c6";\n}\n\n.fa-medrt {\n --fa: "\\f3c8";\n}\n\n.fa-microsoft {\n --fa: "\\f3ca";\n}\n\n.fa-mix {\n --fa: "\\f3cb";\n}\n\n.fa-mizuni {\n --fa: "\\f3cc";\n}\n\n.fa-monero {\n --fa: "\\f3d0";\n}\n\n.fa-napster {\n --fa: "\\f3d2";\n}\n\n.fa-node-js {\n --fa: "\\f3d3";\n}\n\n.fa-npm {\n --fa: "\\f3d4";\n}\n\n.fa-ns8 {\n --fa: "\\f3d5";\n}\n\n.fa-nutritionix {\n --fa: "\\f3d6";\n}\n\n.fa-page4 {\n --fa: "\\f3d7";\n}\n\n.fa-palfed {\n --fa: "\\f3d8";\n}\n\n.fa-patreon {\n --fa: "\\f3d9";\n}\n\n.fa-periscope {\n --fa: "\\f3da";\n}\n\n.fa-phabricator {\n --fa: "\\f3db";\n}\n\n.fa-phoenix-framework {\n --fa: "\\f3dc";\n}\n\n.fa-playstation {\n --fa: "\\f3df";\n}\n\n.fa-pushed {\n --fa: "\\f3e1";\n}\n\n.fa-python {\n --fa: "\\f3e2";\n}\n\n.fa-red-river {\n --fa: "\\f3e3";\n}\n\n.fa-wpressr {\n --fa: "\\f3e4";\n}\n\n.fa-rendact {\n --fa: "\\f3e4";\n}\n\n.fa-replyd {\n --fa: "\\f3e6";\n}\n\n.fa-resolving {\n --fa: "\\f3e7";\n}\n\n.fa-rocketchat {\n --fa: "\\f3e8";\n}\n\n.fa-rockrms {\n --fa: "\\f3e9";\n}\n\n.fa-schlix {\n --fa: "\\f3ea";\n}\n\n.fa-searchengin {\n --fa: "\\f3eb";\n}\n\n.fa-servicestack {\n --fa: "\\f3ec";\n}\n\n.fa-sistrix {\n --fa: "\\f3ee";\n}\n\n.fa-speakap {\n --fa: "\\f3f3";\n}\n\n.fa-staylinked {\n --fa: "\\f3f5";\n}\n\n.fa-steam-symbol {\n --fa: "\\f3f6";\n}\n\n.fa-sticker-mule {\n --fa: "\\f3f7";\n}\n\n.fa-studiovinari {\n --fa: "\\f3f8";\n}\n\n.fa-supple {\n --fa: "\\f3f9";\n}\n\n.fa-uber {\n --fa: "\\f402";\n}\n\n.fa-uikit {\n --fa: "\\f403";\n}\n\n.fa-uniregistry {\n --fa: "\\f404";\n}\n\n.fa-untappd {\n --fa: "\\f405";\n}\n\n.fa-ussunnah {\n --fa: "\\f407";\n}\n\n.fa-vaadin {\n --fa: "\\f408";\n}\n\n.fa-viber {\n --fa: "\\f409";\n}\n\n.fa-vimeo {\n --fa: "\\f40a";\n}\n\n.fa-vnv {\n --fa: "\\f40b";\n}\n\n.fa-square-whatsapp {\n --fa: "\\f40c";\n}\n\n.fa-whatsapp-square {\n --fa: "\\f40c";\n}\n\n.fa-whmcs {\n --fa: "\\f40d";\n}\n\n.fa-wordpress-simple {\n --fa: "\\f411";\n}\n\n.fa-xbox {\n --fa: "\\f412";\n}\n\n.fa-yandex {\n --fa: "\\f413";\n}\n\n.fa-yandex-international {\n --fa: "\\f414";\n}\n\n.fa-apple-pay {\n --fa: "\\f415";\n}\n\n.fa-cc-apple-pay {\n --fa: "\\f416";\n}\n\n.fa-fly {\n --fa: "\\f417";\n}\n\n.fa-node {\n --fa: "\\f419";\n}\n\n.fa-osi {\n --fa: "\\f41a";\n}\n\n.fa-react {\n --fa: "\\f41b";\n}\n\n.fa-autoprefixer {\n --fa: "\\f41c";\n}\n\n.fa-less {\n --fa: "\\f41d";\n}\n\n.fa-sass {\n --fa: "\\f41e";\n}\n\n.fa-vuejs {\n --fa: "\\f41f";\n}\n\n.fa-angular {\n --fa: "\\f420";\n}\n\n.fa-aviato {\n --fa: "\\f421";\n}\n\n.fa-ember {\n --fa: "\\f423";\n}\n\n.fa-gitter {\n --fa: "\\f426";\n}\n\n.fa-hooli {\n --fa: "\\f427";\n}\n\n.fa-strava {\n --fa: "\\f428";\n}\n\n.fa-stripe {\n --fa: "\\f429";\n}\n\n.fa-stripe-s {\n --fa: "\\f42a";\n}\n\n.fa-typo3 {\n --fa: "\\f42b";\n}\n\n.fa-amazon-pay {\n --fa: "\\f42c";\n}\n\n.fa-cc-amazon-pay {\n --fa: "\\f42d";\n}\n\n.fa-ethereum {\n --fa: "\\f42e";\n}\n\n.fa-korvue {\n --fa: "\\f42f";\n}\n\n.fa-elementor {\n --fa: "\\f430";\n}\n\n.fa-square-youtube {\n --fa: "\\f431";\n}\n\n.fa-youtube-square {\n --fa: "\\f431";\n}\n\n.fa-flipboard {\n --fa: "\\f44d";\n}\n\n.fa-hips {\n --fa: "\\f452";\n}\n\n.fa-php {\n --fa: "\\f457";\n}\n\n.fa-quinscape {\n --fa: "\\f459";\n}\n\n.fa-readme {\n --fa: "\\f4d5";\n}\n\n.fa-java {\n --fa: "\\f4e4";\n}\n\n.fa-pied-piper-hat {\n --fa: "\\f4e5";\n}\n\n.fa-creative-commons-by {\n --fa: "\\f4e7";\n}\n\n.fa-creative-commons-nc {\n --fa: "\\f4e8";\n}\n\n.fa-creative-commons-nc-eu {\n --fa: "\\f4e9";\n}\n\n.fa-creative-commons-nc-jp {\n --fa: "\\f4ea";\n}\n\n.fa-creative-commons-nd {\n --fa: "\\f4eb";\n}\n\n.fa-creative-commons-pd {\n --fa: "\\f4ec";\n}\n\n.fa-creative-commons-pd-alt {\n --fa: "\\f4ed";\n}\n\n.fa-creative-commons-remix {\n --fa: "\\f4ee";\n}\n\n.fa-creative-commons-sa {\n --fa: "\\f4ef";\n}\n\n.fa-creative-commons-sampling {\n --fa: "\\f4f0";\n}\n\n.fa-creative-commons-sampling-plus {\n --fa: "\\f4f1";\n}\n\n.fa-creative-commons-share {\n --fa: "\\f4f2";\n}\n\n.fa-creative-commons-zero {\n --fa: "\\f4f3";\n}\n\n.fa-ebay {\n --fa: "\\f4f4";\n}\n\n.fa-keybase {\n --fa: "\\f4f5";\n}\n\n.fa-mastodon {\n --fa: "\\f4f6";\n}\n\n.fa-r-project {\n --fa: "\\f4f7";\n}\n\n.fa-researchgate {\n --fa: "\\f4f8";\n}\n\n.fa-teamspeak {\n --fa: "\\f4f9";\n}\n\n.fa-first-order-alt {\n --fa: "\\f50a";\n}\n\n.fa-fulcrum {\n --fa: "\\f50b";\n}\n\n.fa-galactic-republic {\n --fa: "\\f50c";\n}\n\n.fa-galactic-senate {\n --fa: "\\f50d";\n}\n\n.fa-jedi-order {\n --fa: "\\f50e";\n}\n\n.fa-mandalorian {\n --fa: "\\f50f";\n}\n\n.fa-old-republic {\n --fa: "\\f510";\n}\n\n.fa-phoenix-squadron {\n --fa: "\\f511";\n}\n\n.fa-sith {\n --fa: "\\f512";\n}\n\n.fa-trade-federation {\n --fa: "\\f513";\n}\n\n.fa-wolf-pack-battalion {\n --fa: "\\f514";\n}\n\n.fa-hornbill {\n --fa: "\\f592";\n}\n\n.fa-mailchimp {\n --fa: "\\f59e";\n}\n\n.fa-megaport {\n --fa: "\\f5a3";\n}\n\n.fa-nimblr {\n --fa: "\\f5a8";\n}\n\n.fa-rev {\n --fa: "\\f5b2";\n}\n\n.fa-shopware {\n --fa: "\\f5b5";\n}\n\n.fa-squarespace {\n --fa: "\\f5be";\n}\n\n.fa-themeco {\n --fa: "\\f5c6";\n}\n\n.fa-weebly {\n --fa: "\\f5cc";\n}\n\n.fa-wix {\n --fa: "\\f5cf";\n}\n\n.fa-ello {\n --fa: "\\f5f1";\n}\n\n.fa-hackerrank {\n --fa: "\\f5f7";\n}\n\n.fa-kaggle {\n --fa: "\\f5fa";\n}\n\n.fa-markdown {\n --fa: "\\f60f";\n}\n\n.fa-neos {\n --fa: "\\f612";\n}\n\n.fa-zhihu {\n --fa: "\\f63f";\n}\n\n.fa-alipay {\n --fa: "\\f642";\n}\n\n.fa-the-red-yeti {\n --fa: "\\f69d";\n}\n\n.fa-critical-role {\n --fa: "\\f6c9";\n}\n\n.fa-d-and-d-beyond {\n --fa: "\\f6ca";\n}\n\n.fa-dev {\n --fa: "\\f6cc";\n}\n\n.fa-fantasy-flight-games {\n --fa: "\\f6dc";\n}\n\n.fa-wizards-of-the-coast {\n --fa: "\\f730";\n}\n\n.fa-think-peaks {\n --fa: "\\f731";\n}\n\n.fa-reacteurope {\n --fa: "\\f75d";\n}\n\n.fa-artstation {\n --fa: "\\f77a";\n}\n\n.fa-atlassian {\n --fa: "\\f77b";\n}\n\n.fa-canadian-maple-leaf {\n --fa: "\\f785";\n}\n\n.fa-centos {\n --fa: "\\f789";\n}\n\n.fa-confluence {\n --fa: "\\f78d";\n}\n\n.fa-dhl {\n --fa: "\\f790";\n}\n\n.fa-diaspora {\n --fa: "\\f791";\n}\n\n.fa-fedex {\n --fa: "\\f797";\n}\n\n.fa-fedora {\n --fa: "\\f798";\n}\n\n.fa-figma {\n --fa: "\\f799";\n}\n\n.fa-intercom {\n --fa: "\\f7af";\n}\n\n.fa-invision {\n --fa: "\\f7b0";\n}\n\n.fa-jira {\n --fa: "\\f7b1";\n}\n\n.fa-mendeley {\n --fa: "\\f7b3";\n}\n\n.fa-raspberry-pi {\n --fa: "\\f7bb";\n}\n\n.fa-redhat {\n --fa: "\\f7bc";\n}\n\n.fa-sketch {\n --fa: "\\f7c6";\n}\n\n.fa-sourcetree {\n --fa: "\\f7d3";\n}\n\n.fa-suse {\n --fa: "\\f7d6";\n}\n\n.fa-ubuntu {\n --fa: "\\f7df";\n}\n\n.fa-ups {\n --fa: "\\f7e0";\n}\n\n.fa-usps {\n --fa: "\\f7e1";\n}\n\n.fa-yarn {\n --fa: "\\f7e3";\n}\n\n.fa-airbnb {\n --fa: "\\f834";\n}\n\n.fa-battle-net {\n --fa: "\\f835";\n}\n\n.fa-bootstrap {\n --fa: "\\f836";\n}\n\n.fa-buffer {\n --fa: "\\f837";\n}\n\n.fa-chromecast {\n --fa: "\\f838";\n}\n\n.fa-evernote {\n --fa: "\\f839";\n}\n\n.fa-itch-io {\n --fa: "\\f83a";\n}\n\n.fa-salesforce {\n --fa: "\\f83b";\n}\n\n.fa-speaker-deck {\n --fa: "\\f83c";\n}\n\n.fa-symfony {\n --fa: "\\f83d";\n}\n\n.fa-waze {\n --fa: "\\f83f";\n}\n\n.fa-yammer {\n --fa: "\\f840";\n}\n\n.fa-git-alt {\n --fa: "\\f841";\n}\n\n.fa-stackpath {\n --fa: "\\f842";\n}\n\n.fa-cotton-bureau {\n --fa: "\\f89e";\n}\n\n.fa-buy-n-large {\n --fa: "\\f8a6";\n}\n\n.fa-mdb {\n --fa: "\\f8ca";\n}\n\n.fa-orcid {\n --fa: "\\f8d2";\n}\n\n.fa-swift {\n --fa: "\\f8e1";\n}\n\n.fa-umbraco {\n --fa: "\\f8e8";\n}:root, :host {\n --fa-family-classic: \'Font Awesome 7 Free\';\n --fa-font-regular: normal 400 1em/1 var(--fa-family-classic);\n /* deprecated: this older custom property will be removed next major release */\n --fa-style-family-classic: var(--fa-family-classic);\n}\n\n@font-face {\n font-family: "Font Awesome 7 Free";\n font-style: normal;\n font-weight: 400;\n font-display: block;\n src: url("../webfonts/fa-regular-400.woff2");\n}\n.far {\n --fa-family: var(--fa-family-classic);\n --fa-style: 400;\n}\n\n.fa-classic {\n --fa-family: var(--fa-family-classic);\n}\n\n.fa-regular {\n --fa-style: 400;\n}:root, :host {\n --fa-family-classic: \'Font Awesome 7 Free\';\n --fa-font-solid: normal 900 1em/1 var(--fa-family-classic);\n /* deprecated: this older custom property will be removed next major release */\n --fa-style-family-classic: var(--fa-family-classic);\n}\n\n@font-face {\n font-family: "Font Awesome 7 Free";\n font-style: normal;\n font-weight: 900;\n font-display: block;\n src: url("../webfonts/fa-solid-900.woff2");\n}\n.fas {\n --fa-family: var(--fa-family-classic);\n --fa-style: 900;\n}\n\n.fa-classic {\n --fa-family: var(--fa-family-classic);\n}\n\n.fa-solid {\n --fa-style: 900;\n}@font-face {\n font-family: "Font Awesome 5 Brands";\n font-display: block;\n font-weight: 400;\n src: url("../webfonts/fa-brands-400.woff2") format("woff2");\n}\n@font-face {\n font-family: "Font Awesome 5 Free";\n font-display: block;\n font-weight: 900;\n src: url("../webfonts/fa-solid-900.woff2") format("woff2");\n}\n@font-face {\n font-family: "Font Awesome 5 Free";\n font-display: block;\n font-weight: 400;\n src: url("../webfonts/fa-regular-400.woff2") format("woff2");\n}@font-face {\n font-family: "FontAwesome";\n font-display: block;\n src: url("../webfonts/fa-solid-900.woff2") format("woff2");\n}\n@font-face {\n font-family: "FontAwesome";\n font-display: block;\n src: url("../webfonts/fa-brands-400.woff2") format("woff2");\n}\n@font-face {\n font-family: "FontAwesome";\n font-display: block;\n src: url("../webfonts/fa-regular-400.woff2") format("woff2");\n unicode-range: U+F003, U+F006, U+F014, U+F016-F017, U+F01A-F01B, U+F01D, U+F022, U+F03E, U+F044, U+F046, U+F05C-F05D, U+F06E, U+F070, U+F087-F088, U+F08A, U+F094, U+F096-F097, U+F09D, U+F0A0, U+F0A2, U+F0A4-F0A7, U+F0C5, U+F0C7, U+F0E5-F0E6, U+F0EB, U+F0F6-F0F8, U+F10C, U+F114-F115, U+F118-F11A, U+F11C-F11D, U+F133, U+F147, U+F14E, U+F150-F152, U+F185-F186, U+F18E, U+F190-F192, U+F196, U+F1C1-F1C9, U+F1D9, U+F1DB, U+F1E3, U+F1EA, U+F1F7, U+F1F9, U+F20A, U+F247-F248, U+F24A, U+F24D, U+F255-F25B, U+F25D, U+F271-F274, U+F278, U+F27B, U+F28C, U+F28E, U+F29C, U+F2B5, U+F2B7, U+F2BA, U+F2BC, U+F2BE, U+F2C0-F2C1, U+F2C3, U+F2D0, U+F2D2, U+F2D4, U+F2DC;\n}\n@font-face {\n font-family: "FontAwesome";\n font-display: block;\n src: url("../webfonts/fa-v4compatibility.woff2") format("woff2");\n unicode-range: U+F041, U+F047, U+F065-F066, U+F07D-F07E, U+F080, U+F08B, U+F08E, U+F090, U+F09A, U+F0AC, U+F0AE, U+F0B2, U+F0D0, U+F0D6, U+F0E4, U+F0EC, U+F10A-F10B, U+F123, U+F13E, U+F148-F149, U+F14C, U+F156, U+F15E, U+F160-F161, U+F163, U+F175-F178, U+F195, U+F1F8, U+F219, U+F27A;\n}'],sourceRoot:""}]);const p=l;A.d(a,["A",0,p])},769(n,a,A){var f=A(582),e=A.n(f),E=A(991),i=A.n(E),r=A(725),t=A.n(r),C=A(798),o=A.n(C),s=A(754),c=A.n(s),l=A(567),d=A.n(l),m=A(804),u={};u.styleTagTransform=d(),u.setAttributes=o(),u.insert=t().bind(null,"head"),u.domAPI=i(),u.insertStyleElement=c(),e()(m.A,u),m.A&&m.A.locals&&m.A.locals},438(n,a,A){n.exports=A.p+"41062caea457897b1d3b.woff2"},502(n,a,A){n.exports=A.p+"fa2e58edfd73d8341e07.woff2"},322(n,a,A){n.exports=A.p+"dcef2f69dbd5989a2e69.woff2"},999(n,a,A){n.exports=A.p+"2129bf071a83c1d49732.woff2"}}]); //# sourceMappingURL=fontawesome.js.map \ No newline at end of file diff --git a/cmd/mdl/webapp/dist/headless.html b/cmd/mdl/webapp/dist/headless.html new file mode 100644 index 00000000..a2842928 --- /dev/null +++ b/cmd/mdl/webapp/dist/headless.html @@ -0,0 +1 @@ +Model - Architecture Diagrams as Code
\ No newline at end of file diff --git a/cmd/mdl/webapp/dist/headless.js b/cmd/mdl/webapp/dist/headless.js new file mode 100644 index 00000000..d4e765bf --- /dev/null +++ b/cmd/mdl/webapp/dist/headless.js @@ -0,0 +1,2 @@ +"use strict";(self.webpackChunkapp=self.webpackChunkapp||[]).push([[906],{752(e,t,o){o(769),o(574),o(919);var r=o(828),a=(o(983),o(71));async function s(e){const t=await fetch("/headless/result",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)});if(!t.ok)throw new Error(`report result: HTTP ${t.status} ${await t.text()}`)}function i(e){return e instanceof Error?e.stack??e.message:String(e)}!async function(){let e;try{e=function(){const e=new URLSearchParams(document.location.search),t=e.get("view")??"",o=e.get("digest")??"";if(!t||!o)throw new Error("view and digest are required");return{viewId:t,modelDigest:o,options:{direction:function(e){switch(e){case null:case"":return;case"UP":case"DOWN":case"LEFT":case"RIGHT":return e;default:throw new Error(`invalid direction ${e}`)}}(e.get("direction")),compactLayout:"true"===e.get("compact")}}}()}catch(e){throw new Error(`invalid headless request: ${i(e)}`)}try{const t=await fetch("/data/model.json");if(!t.ok)throw new Error(`load model: HTTP ${t.status}`);const o=await t.json(),i=(0,a.R)(o,{},e.viewId);if(!i)throw new Error(`model does not contain view ${e.viewId}`);const n=(0,r.oP)(i);document.body.append(n),await i.autoLayout(e.options),await s({status:"complete",viewId:e.viewId,modelDigest:e.modelDigest,svg:i.exportSVG()})}catch(t){await s({status:"error",viewId:e.viewId,modelDigest:e.modelDigest,error:i(t)})}}()}},e=>{e.O(0,[453,96,286],()=>e(e.s=752)),e.O()}]); +//# sourceMappingURL=headless.js.map \ No newline at end of file diff --git a/cmd/mdl/webapp/dist/headless.js.map b/cmd/mdl/webapp/dist/headless.js.map new file mode 100644 index 00000000..ec6a0bde --- /dev/null +++ b/cmd/mdl/webapp/dist/headless.js.map @@ -0,0 +1 @@ +{"version":3,"file":"headless.js","mappings":"wIAyGAA,eAAeC,EAAWC,GACzB,MAAMC,QAAiBC,MAAM,mBAAoB,CAChDC,OAAQ,OACRC,QAAS,CAAC,eAAgB,oBAC1BC,KAAMC,KAAKC,UAAUP,KAEtB,IAAKC,EAASO,GACb,MAAM,IAAIC,MAAM,uBAAuBR,EAASS,gBAAgBT,EAASU,SAE3E,CAGA,SAASC,EAAaC,GACrB,OAAOA,aAAiBJ,MAAQI,EAAMC,OAASD,EAAME,QAAUC,OAAOH,EACvE,EAvFAf,iBACC,IAAImB,EACJ,IACCA,EAmCF,WACC,MAAMC,EAAS,IAAIC,gBAAgBC,SAASC,SAASC,QAC/CC,EAASL,EAAOM,IAAI,SAAW,GAC/BC,EAAcP,EAAOM,IAAI,WAAa,GAC5C,IAAKD,IAAWE,EACf,MAAM,IAAIhB,MAAM,gCAGjB,MAAO,CACNc,SACAE,cACAC,QAAS,CACRC,UAOH,SAAuBC,GACtB,OAAQA,GACP,KAAK,KACL,IAAK,GACJ,OACD,IAAK,KACL,IAAK,OACL,IAAK,OACL,IAAK,QACJ,OAAOA,EACR,QACC,MAAM,IAAInB,MAAM,qBAAqBmB,KAExC,CAzBmBC,CAAcX,EAAOM,IAAI,cAMzCM,cAAyC,SAA1BZ,EAAOM,IAAI,YAG7B,CAnDYO,EACX,CAAE,MAAOlB,GACR,MAAM,IAAIJ,MAAM,6BAA6BG,EAAaC,KAC3D,CAEA,IACC,MAAMZ,QAAiBC,MAAM,oBAC7B,IAAKD,EAASO,GACb,MAAM,IAAIC,MAAM,oBAAoBR,EAASS,UAE9C,MAAMsB,QAAc/B,EAASgC,OACvBC,GAAQ,EAAAC,EAAAC,GAAUJ,EAAO,CAAC,EAAGf,EAAQM,QAC3C,IAAKW,EACJ,MAAM,IAAIzB,MAAM,+BAA+BQ,EAAQM,UAExD,MAAMc,GAAM,EAAAC,EAAAC,IAAeL,GAC3Bd,SAASf,KAAKmC,OAAOH,SACfH,EAAMO,WAAWxB,EAAQS,eACzB3B,EAAW,CAChBW,OAAQ,WACRa,OAAQN,EAAQM,OAChBE,YAAaR,EAAQQ,YACrBY,IAAKH,EAAMQ,aAEb,CAAE,MAAO7B,SACFd,EAAW,CAChBW,OAAQ,QACRa,OAAQN,EAAQM,OAChBE,YAAaR,EAAQQ,YACrBZ,MAAOD,EAAaC,IAEtB,CACD,CAsDK8B","sources":["webpack://app/./src/headless.ts"],"sourcesContent":["// This page renders one requested view for mdl svg. It does not start React,\n// routing, editor shortcuts, saved-layout loading, or LiveReload.\n\nimport \"@fortawesome/fontawesome-free/css/all.css\";\nimport \"./fonts.css\";\nimport \"./style.css\";\n\nimport {buildGraphView, LayoutDirection} from \"./graph-view/graph\";\nimport {LayoutOptions} from \"./graph-view/layout\";\nimport {parseView} from \"./parseModel\";\n\ninterface RenderRequest {\n\tviewId: string;\n\tmodelDigest: string;\n\toptions: LayoutOptions;\n}\n\ntype RenderResult =\n\t| {\n\t\tstatus: \"complete\";\n\t\tviewId: string;\n\t\tmodelDigest: string;\n\t\tsvg: string;\n\t}\n\t| {\n\t\tstatus: \"error\";\n\t\tviewId: string;\n\t\tmodelDigest: string;\n\t\terror: string;\n\t};\n\n/** run renders one view and reports one result to the local MDL process. */\nasync function run(): Promise {\n\tlet request: RenderRequest;\n\ttry {\n\t\trequest = readRequest();\n\t} catch (error) {\n\t\tthrow new Error(`invalid headless request: ${errorMessage(error)}`);\n\t}\n\n\ttry {\n\t\tconst response = await fetch(\"/data/model.json\");\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(`load model: HTTP ${response.status}`);\n\t\t}\n\t\tconst model = await response.json();\n\t\tconst graph = parseView(model, {}, request.viewId);\n\t\tif (!graph) {\n\t\t\tthrow new Error(`model does not contain view ${request.viewId}`);\n\t\t}\n\t\tconst svg = buildGraphView(graph);\n\t\tdocument.body.append(svg);\n\t\tawait graph.autoLayout(request.options);\n\t\tawait sendResult({\n\t\t\tstatus: \"complete\",\n\t\t\tviewId: request.viewId,\n\t\t\tmodelDigest: request.modelDigest,\n\t\t\tsvg: graph.exportSVG(),\n\t\t});\n\t} catch (error) {\n\t\tawait sendResult({\n\t\t\tstatus: \"error\",\n\t\t\tviewId: request.viewId,\n\t\t\tmodelDigest: request.modelDigest,\n\t\t\terror: errorMessage(error),\n\t\t});\n\t}\n}\n\n/** readRequest reads the view, model digest, and explicit layout choices. */\nfunction readRequest(): RenderRequest {\n\tconst params = new URLSearchParams(document.location.search);\n\tconst viewId = params.get(\"view\") ?? \"\";\n\tconst modelDigest = params.get(\"digest\") ?? \"\";\n\tif (!viewId || !modelDigest) {\n\t\tthrow new Error(\"view and digest are required\");\n\t}\n\tconst direction = readDirection(params.get(\"direction\"));\n\treturn {\n\t\tviewId,\n\t\tmodelDigest,\n\t\toptions: {\n\t\t\tdirection,\n\t\t\tcompactLayout: params.get(\"compact\") === \"true\",\n\t\t},\n\t};\n}\n\n/** readDirection accepts only the four directions supported by the Model DSL. */\nfunction readDirection(value: string | null): LayoutDirection | undefined {\n\tswitch (value) {\n\t\tcase null:\n\t\tcase \"\":\n\t\t\treturn undefined;\n\t\tcase \"UP\":\n\t\tcase \"DOWN\":\n\t\tcase \"LEFT\":\n\t\tcase \"RIGHT\":\n\t\t\treturn value;\n\t\tdefault:\n\t\t\tthrow new Error(`invalid direction ${value}`);\n\t}\n}\n\n/** sendResult sends the complete typed result to the waiting Go request. */\nasync function sendResult(result: RenderResult): Promise {\n\tconst response = await fetch(\"/headless/result\", {\n\t\tmethod: \"POST\",\n\t\theaders: {\"Content-Type\": \"application/json\"},\n\t\tbody: JSON.stringify(result),\n\t});\n\tif (!response.ok) {\n\t\tthrow new Error(`report result: HTTP ${response.status} ${await response.text()}`);\n\t}\n}\n\n/** errorMessage includes the stack so CLI failures name the browser code. */\nfunction errorMessage(error: unknown): string {\n\treturn error instanceof Error ? error.stack ?? error.message : String(error);\n}\n\nvoid run();\n"],"names":["async","sendResult","result","response","fetch","method","headers","body","JSON","stringify","ok","Error","status","text","errorMessage","error","stack","message","String","request","params","URLSearchParams","document","location","search","viewId","get","modelDigest","options","direction","value","readDirection","compactLayout","readRequest","model","json","graph","_parseModel__WEBPACK_IMPORTED_MODULE_5__","R","svg","_graph_view_graph__WEBPACK_IMPORTED_MODULE_3__","oP","append","autoLayout","exportSVG","run"],"sourceRoot":""} \ No newline at end of file diff --git a/cmd/mdl/webapp/dist/index.html b/cmd/mdl/webapp/dist/index.html index 37718aff..a3ecb79f 100644 --- a/cmd/mdl/webapp/dist/index.html +++ b/cmd/mdl/webapp/dist/index.html @@ -1 +1 @@ -Model - Architecture Diagrams as Code
\ No newline at end of file +Model - Architecture Diagrams as Code
\ No newline at end of file diff --git a/cmd/mdl/webapp/dist/main.js b/cmd/mdl/webapp/dist/main.js index 26d35d70..3c6a756d 100644 --- a/cmd/mdl/webapp/dist/main.js +++ b/cmd/mdl/webapp/dist/main.js @@ -1,2 +1,2 @@ -"use strict";(self.webpackChunkapp=self.webpackChunkapp||[]).push([[792],{486(e,t,n){n.d(t,{Root:()=>M,S:()=>$});var o=n(763),i=n(408),r=(n(538),n(32));const a={TopBottom:"DOWN",BottomTop:"UP",LeftRight:"RIGHT",RightLeft:"LEFT"},s=e=>{const t=[];return Object.keys(e.views).filter(e=>e.endsWith("Views")).forEach(n=>{e.views[n].forEach(e=>{t.push({key:e.key,title:e.title||e.key,section:n})})}),t};var l=n(264);const d={};function c(e){const t=e.replace(/([A-Z])/g," $1");return t.charAt(0).toUpperCase()+t.slice(1)}var h=n(686),u=n(987);const g=({model:e,currentID:t,onViewChange:n,graph:o,onAutoLayout:i,onSave:r,onToggleHelp:a,saving:l,layouting:d,dragMode:c,setDragMode:h})=>{const g=s(e);return(0,u.jsxs)("div",{className:"toolbar",children:[(0,u.jsx)(A,{views:g,currentID:t,onViewChange:n}),(0,u.jsx)(p,{graph:o,onAutoLayout:i,onSave:r,onToggleHelp:a,saving:l,layouting:d,dragMode:c,setDragMode:h})]})},A=({views:e,currentID:t,onViewChange:n})=>(0,u.jsxs)("div",{children:["View:",e.length>1?(0,u.jsxs)("select",{onChange:e=>n(e.target.value),value:t,children:[(0,u.jsx)("option",{disabled:!0,value:"",hidden:!0,children:"..."}),e.map(e=>(0,u.jsx)("option",{value:e.key,children:c(e.section)+": "+e.title},e.key))]}):(0,u.jsx)("span",{style:{marginLeft:"8px",fontWeight:"bold"},children:e[0]?c(e[0].section)+": "+e[0].title:"No views available"})]}),p=({graph:e,onAutoLayout:t,onSave:n,onToggleHelp:o,saving:i,layouting:r,dragMode:a,setDragMode:s})=>(0,u.jsxs)("div",{style:{display:"flex",alignItems:"center"},children:[(0,u.jsx)("div",{className:"toolbar-group",children:(0,u.jsx)(m,{dragMode:a,setDragMode:s})}),(0,u.jsx)("div",{className:"toolbar-group",children:(0,u.jsx)(f,{graph:e})}),(0,u.jsx)("div",{className:"toolbar-group",children:(0,u.jsx)(y,{graph:e})}),(0,u.jsx)("div",{className:"toolbar-group",children:(0,u.jsx)(b,{onAutoLayout:t,layouting:r})}),(0,u.jsx)("div",{className:"toolbar-group",children:(0,u.jsx)(x,{graph:e})}),(0,u.jsx)("div",{className:"toolbar-group",children:(0,u.jsx)(v,{graph:e})}),(0,u.jsx)("div",{className:"toolbar-group",children:(0,u.jsx)(C,{onSave:n,saving:i,graph:e})}),(0,u.jsx)("div",{className:"toolbar-group",children:(0,u.jsx)(k,{onToggleHelp:o})})]}),m=({dragMode:e,setDragMode:t})=>(0,u.jsx)("button",{className:"mode-toggle "+("select"===e?"select-mode":"pan-mode"),onClick:()=>t("pan"===e?"select":"pan"),"data-tooltip":"pan"===e?"Pan Mode: Drag to pan the view (T)":"Select Mode: Drag to select elements, Shift+click to add/remove selection (T)",children:"pan"===e?(0,u.jsx)("i",{className:"fas fa-hand-paper"}):(0,u.jsx)("i",{className:"fas fa-mouse-pointer"})}),f=({graph:e})=>{const t=(0,h.sy)();return(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)("button",{onClick:()=>e.undo(),"data-tooltip":`Undo the last change made to the diagram (${t}+Z)`,children:(0,u.jsx)("i",{className:"fas fa-undo"})}),(0,u.jsx)("button",{onClick:()=>e.redo(),"data-tooltip":`Redo the last undone action (${t}+Shift+Z / ${t}+Y)`,children:(0,u.jsx)("i",{className:"fas fa-redo"})})]})},y=({graph:e})=>{const t=(0,h.sy)();return(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)("button",{onClick:()=>e.alignSelectionH(),"data-tooltip":`Align all selected elements horizontally (left edges) (${t}+Shift+H)`,children:(0,u.jsx)("i",{className:"fas fa-align-left"})}),(0,u.jsx)("button",{onClick:()=>e.alignSelectionV(),"data-tooltip":`Align all selected elements vertically (top edges) (${t}+Shift+A)`,children:(0,u.jsx)("i",{className:"fas fa-align-left",style:{transform:"rotate(90deg)"}})}),(0,u.jsx)("button",{onClick:()=>e.distributeSelectionH(),"data-tooltip":`Distribute selected elements evenly horizontally (equal spacing) (${t}+Alt+H)`,children:(0,u.jsx)("i",{className:"fas fa-ellipsis-h"})}),(0,u.jsx)("button",{onClick:()=>e.distributeSelectionV(),"data-tooltip":`Distribute selected elements evenly vertically (equal spacing) (${t}+Alt+V)`,children:(0,u.jsx)("i",{className:"fas fa-ellipsis-v"})})]})},b=({onAutoLayout:e,layouting:t})=>{const n=(0,h.sy)();return(0,u.jsx)("button",{className:"auto-arrange",onClick:e,disabled:t,"data-tooltip":`Automatically arrange all elements using the Layered algorithm (${n}+L)`,children:t?(0,u.jsx)("i",{className:"fas fa-spinner fa-spin"}):(0,u.jsx)("i",{className:"fas fa-magic"})})},x=({graph:e})=>{const[t,n]=(0,o.useState)(e.isGridVisible()),[i,r]=(0,o.useState)(e.isSnapToGrid()),a=(0,h.sy)();return o.useEffect(()=>{const t=()=>{n(e.isGridVisible()),r(e.isSnapToGrid())};return t(),window.addEventListener("gridStateChanged",t),()=>{window.removeEventListener("gridStateChanged",t)}},[e]),(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)("button",{className:t?"active-toggle":"inactive-toggle",onClick:()=>{e.toggleGrid(),n(e.isGridVisible())},"data-tooltip":`Toggle grid visibility (${a}+G)`,children:(0,u.jsx)("i",{className:"fas fa-th"})}),(0,u.jsx)("button",{className:i?"active-toggle":"inactive-toggle",onClick:()=>{e.toggleSnapToGrid(),r(e.isSnapToGrid())},"data-tooltip":`Toggle snap to grid (${a}+Shift+G)`,children:(0,u.jsx)("i",{className:"fas fa-magnet"})}),(0,u.jsx)("button",{onClick:()=>{e.snapAllToGrid()},disabled:!i,"data-tooltip":`Snap all elements to grid (${a}+Alt+G)`,children:(0,u.jsx)("i",{className:"fas fa-border-all"})})]})},w=()=>{const[e,t]=(0,o.useState)(100);return(0,o.useEffect)(()=>{const e=()=>{const e=Math.round(100*(0,i.IX)());t(e)};e();const n=setInterval(e,100);return()=>clearInterval(n)},[]),(0,u.jsxs)("button",{onClick:()=>(0,i.a_)(1),className:"zoom-display","data-tooltip":"Click to reset zoom to 100%",children:[e,"%"]})},v=({graph:e})=>{const t=(0,h.sy)();return(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)("button",{onClick:()=>{(0,i.a_)(Math.max(.1,(0,i.IX)()/1.2))},"data-tooltip":`Zoom out to see more of the diagram (${t}+-)`,children:(0,u.jsx)("i",{className:"fas fa-search-minus"})}),(0,u.jsx)(w,{}),(0,u.jsx)("button",{onClick:()=>{(0,i.a_)(Math.min(5,1.2*(0,i.IX)()))},"data-tooltip":`Zoom in to see details more clearly (${t}+=)`,children:(0,u.jsx)("i",{className:"fas fa-search-plus"})}),(0,u.jsx)("button",{onClick:()=>{e.fitToView()},"data-tooltip":`Fit diagram to view (${t}+9)`,children:(0,u.jsx)("i",{className:"fas fa-expand"})})]})},C=({onSave:e,saving:t,graph:n})=>{const[i,r]=(0,o.useState)(!1),a=(0,h.sy)();return(0,o.useEffect)(()=>{const e=()=>{r(n.changed())};e();const t=setInterval(e,100);return()=>clearInterval(t)},[n]),(0,u.jsx)("button",{className:i?"grp":"action",disabled:t,onClick:e,"data-tooltip":`Save the current diagram layout (${a}+S)`,children:t?(0,u.jsx)("i",{className:"fas fa-spinner fa-spin"}):(0,u.jsx)("i",{className:"fas fa-save"})})},k=({onToggleHelp:e})=>(0,u.jsx)("button",{onClick:e,"data-tooltip":"Show keyboard shortcuts and help information (Shift+? / Shift+F1)",children:(0,u.jsx)("i",{className:"fas fa-question-circle"})}),I=(0,o.lazy)(()=>Promise.resolve().then(n.bind(n,264)).then(e=>({default:e.Help}))),B=(0,o.lazy)(()=>n.e(948).then(n.bind(n,948)).then(e=>({default:e.Graph}))),E=(e,t)=>{const n=document.documentElement;if(!e)return delete n.dataset.mdlAutomationStatus,void delete n.dataset.mdlAutomationError;n.dataset.mdlAutomationStatus=e,t?n.dataset.mdlAutomationError=t:delete n.dataset.mdlAutomationError},S=(e,t)=>{console.error(`${e} failed:`,t),alert(`${e} failed. See console for details.`)},M=({model:e,layout:t})=>(0,u.jsx)(r.Kd,{children:(0,u.jsx)(r.BV,{children:(0,u.jsx)(r.qh,{path:"/",element:(0,u.jsx)(D,{model:e,layouts:t})})})}),$=()=>{var e;(e=new URLSearchParams(document.location.search).get("id")||"")?delete d[e]:Object.keys(d).forEach(e=>delete d[e])},D=({model:e,layouts:t})=>{const[n,s]=(0,r.ok)(),c=decodeURI(n.get("id")||""),[h,A]=(0,o.useState)(!1),[p,m]=(0,o.useState)("pan"),[f,y]=(0,o.useState)(null),b=(0,o.useRef)(null),x=(0,o.useRef)(0),w=((e,t,n)=>{if(d[n])return d[n];const o=((e,t,n)=>{const o=new Map,r=new Map,s=e=>{Array.isArray(e.relationships)&&e.relationships.forEach(e=>{r.set(e.id,e)})};if(e.model.people&&e.model.people.forEach(e=>{o.set(e.id,e),Array.isArray(e.relationships)&&e.relationships.forEach(e=>{r.set(e.id,e)})}),e.model.softwareSystems&&e.model.softwareSystems.forEach(e=>{o.set(e.id,e),s(e),Array.isArray(e.containers)&&e.containers.forEach(t=>{t.parent=e,o.set(t.id,t),s(t),Array.isArray(t.components)&&t.components.forEach(e=>{e.parent=t,o.set(e.id,e),s(e)})})}),e.model.deploymentNodes){const t=e=>{e.containerInstances&&e.containerInstances.forEach(t=>{const n={...o.get(t.containerId),id:t.id};o.set(n.id,n),n.parent=e,s(t)})},n=(e,i)=>{e.parent=i,o.set(e.id,e),s(e),t(e),e.children&&e.children.forEach(t=>n(t,e)),e.infrastructureNodes&&e.infrastructureNodes.forEach(t=>n(t,e))};e.model.deploymentNodes.forEach(e=>n(e,null))}const{view:l,section:d}=function(e,t){let n=null,o="";return Object.keys(e.views).filter(e=>e.endsWith("Views")).some(i=>e.views[i].some(e=>{if(e.key==t)return n=e,o=i,!0})),{view:n,section:o}}(e,n);if(!l)return null;const c=new i.jg(l.key,l.title||l.key),h=l.automaticLayout?.rankDirection;c.layoutDirection=h?a[h]:void 0;const u={name:c.name,description:l.description,version:e.version,elements:[]};if(c.metadata=u,!l.elements)return c;const g={};if("deploymentViews"==d||"containerViews"==d)l.elements.forEach(e=>{const t=o.get(e.id);t?.parent&&(g[t.parent.id]=!0)});else if(l.softwareSystemId)l.elements.find(e=>e.id==l.softwareSystemId)||(g[l.softwareSystemId]=!0);else if("systemLandscapeViews"==d){const t={id:"__enterprise__",...e.model.enterprise};o.set(t.id,t),e.model.people&&e.model.people.filter(e=>"External"!=e.location).forEach(e=>e.parent=t),e.model.softwareSystems&&e.model.softwareSystems.filter(e=>"External"!=e.location).forEach(e=>e.parent=t),g[t.id]=!0}const A=e.views.styles,p=e=>e.toLowerCase().replace(/[^a-z0-9-]/g,"-");A?.elements&&A.elements.forEach(e=>{if(e.tag){const t=`--mdl-${p(e.tag)}`;e.background&&c.colorToVarMap.set(e.background,`${t}-bg`),e.color&&c.colorToVarMap.set(e.color,`${t}-color`),e.stroke&&c.colorToVarMap.set(e.stroke,`${t}-stroke`)}}),A?.relationships&&A.relationships.forEach(e=>{if(e.tag){const t=`--mdl-rel-${p(e.tag)}`;e.color&&c.colorToVarMap.set(e.color,`${t}-color`)}}),l.elements.forEach(t=>{if(g[t.id])return;const n=o.get(t.id),i=n?function(e,t){const n=e.views.containerViews?.find(e=>e.softwareSystemId==t);return n?.key}(e,n.id):void 0;let r="",a={};if(n){const e=n.tags.split(",");r=e[e.length-1],n.technology&&(r+=": "+n.technology),e.forEach(e=>{const t=A&&A.elements&&A.elements.find(t=>t.tag==e);t&&(a={...a,...t})})}c.addNode(t.id,n&&n.name||t.id,r,n&&n.description?n.description:"",a,function(e,t){if(t){const e=encodeURIComponent(t);return{href:`?id=${e}`,exportHref:`${e}.svg`}}if(e?.url)return{href:e.url,exportHref:e.url}}(n,i)),n&&u.elements.push({id:n.id,tags:n.tags,location:n.location,properties:n.properties,elementViewKey:i,technology:n.technology,url:n.url})}),Array.isArray(l.relationships)&&l.relationships.forEach(e=>{const t=r.get(e.id);if(!t)return;if(!c.nodesMap.has(t.sourceId)){if(o.has(t.sourceId)){const e=o.get(t.sourceId);console.warn("Element not found in this view: ",e.id,e.name)}else console.warn("Element not found: ",t.sourceId);return}if(!c.nodesMap.has(t.destinationId)){if(o.has(t.destinationId)){const e=o.get(t.destinationId);console.warn("Element not found in this view: ",e.id,e.name)}else console.warn("Element not found: ",t.destinationId);return}let n={};t.tags.split(",").forEach(e=>{const t=A&&A.relationships&&A.relationships.find(t=>t.tag==e);t&&(n={...n,...t})}),e.routing&&(n.routing=e.routing),c.addEdge(t.id,t.sourceId,t.destinationId,t.description,e.vertices,n)});const m=e=>{let t=0;for(let n=e.parent;n;n=n.parent)t++;return t};return Object.keys(g).map(e=>o.get(e)).sort((e,t)=>m(e)>m(t)?-1:1).forEach(e=>{let t={};"deploymentViews"==d&&o.get(e.id).tags.split(",").forEach(e=>{const n=A&&A.elements&&A.elements.find(t=>t.tag==e);n&&(t={...t,...n})});const n=l.elements.map(e=>o.get(e.id)).filter(t=>!(!t||t.parent!==e||"systemLandscapeViews"===d&&"__enterprise__"===e.id&&"External"===t.location)).map(e=>e.id);n.length>0&&c.addGroup(e.id,e.name,n,t)}),c.init(t[c.id]),c})(e,t,n);return o&&(d[n]=o),o})(e,t,c),{layouting:v,handleAutoLayout:C}=(e=>{const[t,n]=(0,o.useState)(!1);return{layouting:t,handleAutoLayout:(0,o.useCallback)(async t=>{n(!0);try{const n={direction:e.layoutDirection||"DOWN",...t||{}};await e.autoLayout(n)}finally{n(!1)}},[e])}})(w||{}),{saving:k,handleSave:M}=((e,t)=>{const[n,i]=(0,o.useState)(!1);return{saving:n,handleSave:(0,o.useCallback)(async()=>{i(!0);try{const n=await fetch("data/save?id="+encodeURIComponent(t),{method:"post",body:e.exportSVG()});if(202!==n.status){const e=(await n.text()).trim();throw new Error(e||`save failed with HTTP ${n.status}`)}e.setSaved()}finally{i(!1)}},[e,t])}})(w||{},c);if(!w)return(0,u.jsx)(j,{model:e});const $=(0,o.useCallback)(()=>{A(!h)},[h]),D=(0,o.useCallback)(()=>{y(c)},[c]),L=(0,o.useCallback)(()=>{C().catch(e=>S("Layout",e))},[C]),T=(0,o.useCallback)(()=>{M().catch(e=>S("Save",e))},[M]);(0,o.useEffect)(()=>{w&&w.name&&(document.title=`${w.name} - Model`)},[w]),(0,o.useEffect)(()=>{const e=Object.fromEntries(n.entries()),t="1"===e.auto||"true"===e.auto,o="1"===e.save||"true"===e.save;if(!t&&!o)return b.current=null,x.current++,void E(null);if(f!==c)return;const i=`${c}:${n.toString()}`;if(b.current===i)return;b.current=i;const r=++x.current;E("running");const a=(e.direction||"").toUpperCase(),s="1"===e.compact||"true"===e.compact,l={};["UP","DOWN","LEFT","RIGHT"].includes(a)&&(l.direction=a),s&&(l.compactLayout=!0),(async()=>{try{t&&await C(l),o&&await M(),x.current===r&&E("complete")}catch(e){const t=(e=>e instanceof Error?e.message:String(e))(e);console.error("Automation failed:",e),x.current===r&&E("error",t)}})()},[c,w,C,M,f,n]),((e,t,n,i,r,a)=>{(0,o.useEffect)(()=>{const o=o=>{const s=(0,l.Yp)(o);s&&o.preventDefault(),"help"===s?e():"save"===s?t():s===l.aX&&r&&i?r("pan"===i?"select":"pan"):n&&(s===l.t9?n.alignSelectionH():s===l.Jk?n.alignSelectionV():s===l.DE?n.distributeSelectionH():s===l.Vy?n.distributeSelectionV():s===l.Hd&&a?a():s===l._t?n.resetView():s===l.Op?n.toggleGrid():s===l.hZ?n.toggleSnapToGrid():s===l.OE?n.snapAllToGrid():s===l.Gg?n.moveSelected(-n.getGridSize(),0):s===l.J8?n.moveSelected(-1,0,!0):s===l.b3?n.moveSelected(n.getGridSize(),0):s===l.iD?n.moveSelected(1,0,!0):s===l.uK?n.moveSelected(0,-n.getGridSize()):s===l.l8?n.moveSelected(0,-1,!0):s===l.rB?n.moveSelected(0,n.getGridSize()):s===l.mt&&n.moveSelected(0,1,!0))};return window.addEventListener("keydown",o),()=>window.removeEventListener("keydown",o)},[e,t,n,i,r,a])})($,T,w,p,m,L);const _=(0,o.useCallback)(e=>{s({id:encodeURIComponent(e)})},[s]),V=(0,o.useCallback)(e=>{if(e){const n=w.metadata.elements.find(t=>t.id===e);console.log((t=n,JSON.parse(JSON.stringify(t))))}var t},[w]);return(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(g,{model:e,currentID:c,onViewChange:_,graph:w,onAutoLayout:L,onSave:T,onToggleHelp:$,saving:k,layouting:v,dragMode:p,setDragMode:m}),(0,u.jsx)(o.Suspense,{fallback:(0,u.jsx)("div",{children:"Loading graph..."}),children:(0,u.jsx)(B,{data:w,onSelect:V,onReady:D,dragMode:p},c)}),h&&(0,u.jsx)(o.Suspense,{fallback:(0,u.jsx)("div",{children:"Loading help..."}),children:(0,u.jsx)(I,{})})]})},j=({model:e})=>{const t=s(e);return o.useEffect(()=>{document.title="Model - Architecture Diagrams as Code",t.length>0&&(document.location.href="?id="+t[0].key)},[t]),t.length>0?(0,u.jsxs)(u.Fragment,{children:["Redirecting to ",t[0].title]}):(0,u.jsx)(u.Fragment,{children:"No views available"})}},408(e,t,n){n.d(t,{jg:()=>M,Qy:()=>W,ZG:()=>T,IX:()=>G,F_:()=>Q,Kp:()=>J,a_:()=>P});const o=(e,t,n)=>{const o=(()=>{const e=document.createElementNS("http://www.w3.org/2000/svg","svg");return document.body.appendChild(e),{measure:(t,n)=>{const o=document.createElementNS("http://www.w3.org/2000/svg","text");o.setAttribute("x","0"),o.setAttribute("y","0");for(let e in n)o.setAttribute(e,n[e]);o.appendChild(document.createTextNode(t)),e.appendChild(o);const{width:i,height:r}=o.getBBox();return e.removeChild(o),{width:i,height:r}},clean:()=>{document.body.removeChild(e)}}})();let i=0;const r=e.trim().split("\n").map(e=>{const r=e.trim().split(/\s+/);let a=[],s=[];return r.forEach(e=>{if(o.measure(e,n).width>t){s.length>0&&(a.push(s.join(" ")),s=[]);const r=((e,t,n,o)=>{const i=[];let r="";for(let a=0;at&&r.length>0?(i.push(r),r=e[a]):r=s}return r.length>0&&i.push(r),i})(e,t,n,o);for(let e=0;e0&&(s=[r[r.length-1]])}else{const r=[...s,e],l=o.measure(r.join(" "),n);l.width>t&&s.length>0?(a.push(s.join(" ")),s=[e]):(i=Math.max(i,l.width),s=r)}}),s.length>0&&a.push(s.join(" ")),a}).reduce((e,t)=>e.concat(t),[]);return o.clean(),{lines:r,maxW:i}},i={element(e,t={},n){const o=document.createElementNS("http://www.w3.org/2000/svg",e);return Object.entries(t).forEach(([e,t])=>o.setAttribute(e,String(t))),n&&o.classList.add(n),o},use(e,t={}){const n=this.element("use",t);return n.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href","#"+e),n},path(e,t={},n){return this.element("path",{...t,d:e},n)},text(e,t={}){const n=this.element("text",t);return e&&(n.textContent=e),n},textArea(e,t,n,i,r=0,a=0,s=""){const l={"font-size":`${n}px`,"font-weight":i?"bold":"normal"},{lines:d,maxW:c}=o(e,t,l),h=this.text("",{x:0,y:a,"text-anchor":s||void 0});return d.forEach((e,t)=>{const o=this.element("tspan",{x:r,dy:`${n+2}px`,...l});o.textContent=e,h.append(o)}),{txt:h,dy:(d.length+1)*(n+2),maxW:c}},rect(e,t,n=0,o=0,i=0,r){return this.element("rect",{x:n,y:o,rx:i,ry:i,width:e,height:t},r)},icon(e,t=0,n=0){return this.use(e,{x:t,y:n})},expand(e,t,n){const o=this.element("g",{transform:`translate(${e},${t})`},"expand");return o.append(this.rect(19,19,0,0,1),this.text(n?"-":"+",{x:10,y:14,"text-anchor":"middle"})),o}};function r(e,t,n){e.setAttribute("transform",`translate(${t},${n})`)}function a(e,t,n=!0){return n?e.x>t.x-t.width/2&&e.xt.y-t.height/2&&e.yt.x&&e.xt.y&&e.yfunction(e,t,n,o){let i,r,a,s,l,d={x:null,y:null,onLine1:!1,onLine2:!1};return i=(o.y-n.y)*(t.x-e.x)-(o.x-n.x)*(t.y-e.y),0==i||(r=e.y-n.y,a=e.x-n.x,s=(o.x-n.x)*r-(o.y-n.y)*a,l=(t.x-e.x)*r-(t.y-e.y)*a,r=s/i,a=l/i,d.x=e.x+r*(t.x-e.x),d.y=e.y+r*(t.y-e.y),r>0&&r<1&&(d.onLine1=!0),a>=0&&a<=1&&(d.onLine2=!0)),d}(e,t,n.p,n.q)).filter(e=>e.onLine1&&e.onLine2)}function d(e,t){return a(t,e)?{x:e.x,y:e.y}:l(e,t,e)[0]||{x:e.x,y:e.y}}function c(e,t,n,o,i){const r={x:i.x-e.x,y:i.y-e.y},a=o.x-e.x,s=o.y-e.y;a==r.x&&(r.x+=1e-7);const l=(s-r.y)/(a-r.x),d=s-l*a,c=n*n+t*t*l*l,h=2*t*t*d*l,u=t*t*d*d-t*t*n*n,g=Math.sqrt(h*h-4*c*u),A=r.x>a?(-h+g)/(2*c):(-h-g)/(2*c),p={x:A,y:l*A+d};return p.x+=e.x,p.y+=e.y,p}function h(e,t,n){let o=n.x-t.x,i=n.y-t.y,r=o*o+i*i,a=(e.x-t.x)*o+(e.y-t.y)*i,s=Math.min(1,Math.max(0,a/r));return{x:t.x+o*s,y:t.y+i*s}}function u(e,t){return Math.abs(t.x-e.x)+Math.abs(t.y-e.y)}function g(e){return e/2/(5.5+e/70)}function A(e,t,n){switch(e.toLowerCase()){case"cylinder":return 2*g(t);case"person":return.4*n;case"folder":return t/10;case"robot":return.35*n;case"webbrowser":return n/8;default:return 0}}class p{_el;constructor(e){this._el=e}node(){return this._el}attr(e,t){return this._el.setAttribute(e,String(t)),this}insert(e,t){const n=document.createElementNS("http://www.w3.org/2000/svg",e),o=this._el.insertBefore(n,this._el.querySelector(t));return new p(o)}}function m(e,t,n,o=!1){const i=e.insert("rect",":first-child").attr("rx",o?n.width/8:3).attr("ry",o?n.width/8:3).attr("x",-t.width/2).attr("y",-t.height/2).attr("width",t.width).attr("height",t.height);return n.intersect=function(e){return d(n,e)},i}function f(e,t,n,o,i){const r=e.insert("ellipse",":first-child").attr("cx",0).attr("cy",0).attr("rx",o).attr("ry",i).attr("width",n.width).attr("height",n.height);return n.intersect=function(e){return c(n,o,i,n,e)},r}function y(e,t,n){const o=n.width/8,i=n.width/14,r=e.insert("g",":first-child");return r.insert("path",":first-child").attr("d",`M${-n.width/2},${-n.height/2} l${n.width},0 M${-n.width/2},${n.height/2} l${n.width},0`),r.insert("circle",":first-child").attr("cx",0).attr("cy",n.height/2+o/2).attr("r",.4*i),r.insert("rect",":first-child").attr("x",-i).attr("y",-n.height/2-o/2-.2*i).attr("width",2*i).attr("height",.4*i),r.insert("rect",":first-child").attr("rx",i).attr("ry",i).attr("x",-t.width/2).attr("y",-t.height/2-o).attr("width",t.width).attr("height",t.height+2*o),n.intersect=function(e){return d({x:n.x,y:n.y,width:n.width,height:n.height+2*o},e)},r}const b={box:(e,t)=>m(new p(e),t,t).node(),roundedbox:(e,t)=>m(new p(e),t,t,!0).node(),component:(e,t)=>function(e,t,n){const o=n.width/10,i=e.insert("g",":first-child");return i.insert("rect",":first-child").attr("rx",3).attr("ry",3).attr("x",-n.width/2-o).attr("y",-n.height/2+o).attr("width",2*o).attr("height",o),i.insert("rect",":first-child").attr("rx",3).attr("ry",3).attr("x",-n.width/2-o).attr("y",-n.height/2+2.5*o).attr("width",2*o).attr("height",o),i.insert("rect",":first-child").attr("rx",3).attr("ry",3).attr("x",-n.width/2).attr("y",-n.height/2).attr("width",n.width).attr("height",n.height),n.intersect=function(e){return d({x:n.x-o/2,y:n.y,width:n.width+o,height:n.height},e)},i}(new p(e),0,t).node(),cylinder:(e,t)=>function(e,t,n){const o=t.width,i=o/2,r=g(o),a=t.height,s=`M 0,${r} a${i},${r} 0,0,0 ${o} 0 a ${i},${r} 0,0,0 ${-o} 0 l 0,${a-2*r} a ${i},${r} 0,0,0 ${o} 0 l 0,${2*r-a}`,l=e.attr("label-offset-y",A("cylinder",o,a)).insert("path",":first-child").attr("d",s).attr("transform","translate("+-o/2+","+-a/2+")");return n.intersect=function(e){const t=d(n,e);let o=n.y+n.height/2-r;return t.y>o?c({x:n.x,y:o},i,r,n,e):(o=n.y-n.height/2+r,t.yfunction(e,t,n){const o=t.width,i=t.height,r=`M ${.38*o},${i/3} A${o/2},${i/2} 0,0,0 0 ${i/2}\n\t\tL${o/11},${i} L${o-o/11},${i} L${o},${i/2}\n\t\tA${o/2},${i/2} 0,0,0 ${o-.38*o} ${i/3} \n\t\tA${o/6},${o/6} 0,1,0 ${.38*o} ${i/3}`,a=e.attr("label-offset-y",A("person",o,i)).insert("path",":first-child").attr("d",r).attr("transform","translate("+-o/2+","+-i/2+")");return n.intersect=function(e){return d(n,e)},a}(new p(e),t,t).node(),circle:(e,t)=>function(e,t,n){return f(e,0,n,n.width/2,n.width/2)}(new p(e),0,t).node(),ellipse:(e,t)=>function(e,t,n){return f(e,0,n,.55*n.width,.45*n.width)}(new p(e),0,t).node(),hexagon:(e,t)=>function(e,t,n){const o=n.width/2,i=e.insert("polygon",":first-child").attr("points",[.5,.866,1,0,.5,-.866,-.5,-.866,-1,-0,-.5,.866,.5,.866].map(e=>e*o).join(",")).attr("width",n.width).attr("height",n.height);return n.intersect=function(e){return c(n,n.width/2,n.width/2,n,e)},i}(new p(e),0,t).node(),folder:(e,t)=>function(e,t,n){const o=n.width/20,i=e.attr("label-offset-y",A("folder",n.width,n.height)).insert("g",":first-child");return i.insert("rect",":first-child").attr("rx",3).attr("ry",3).attr("x",-n.width/2).attr("y",-n.height/2+2*o).attr("width",n.width).attr("height",n.height-2*o),i.insert("path",":first-child").attr("d",`M0,${-n.height/2+2*o} l${o},${-2*o} h${n.width/2-2*o} v${2*o}`),n.intersect=function(e){return d({x:n.x,y:n.y+o/2,width:n.width,height:n.height+o},e)},i}(new p(e),0,t).node(),mobiledevicelandscape:(e,t)=>function(e,t,n){const o=n.width/8,i=n.width/14,r=e.insert("g",":first-child");return r.insert("path",":first-child").attr("d",`M${-n.width/2},${-n.height/2} l0,${n.height} M${n.width/2},${-n.height/2} l0,${n.height}`),r.insert("circle",":first-child").attr("cx",-n.width/2-o/2).attr("cy",0).attr("r",.4*i),r.insert("rect",":first-child").attr("x",n.width/2+o/2-.2*i).attr("y",-i).attr("width",.4*i).attr("height",2*i),r.insert("rect",":first-child").attr("rx",i).attr("ry",i).attr("x",-t.width/2-o).attr("y",-t.height/2).attr("width",t.width+2*o).attr("height",t.height),n.intersect=function(e){return d({x:n.x,y:n.y,width:n.width+2*o,height:n.height},e)},r}(new p(e),t,t).node(),mobiledeviceportrait:(e,t)=>y(new p(e),t,t).node(),mobiledevice:(e,t)=>y(new p(e),t,t).node(),pipe:(e,t)=>function(e,t,n){const o=n.width,i=n.height,r=i/2,a=r/(2.5+o/70),s=`M${-a},0\n\t\ta${a},${r} 0,0,1 0,${i}\n\t\ta${a},${r} 0,0,1 0,${-i}\n\t\tl${o},0\n\t\ta${a},${r} 0,0,1 0,${i}\n\t\tl${-o},0`,l=e.insert("path",":first-child").attr("d",s).attr("transform","translate("+-o/2+","+-i/2+")");return n.intersect=function(e){return d({x:n.x-a,y:n.y,width:n.width+2*a,height:n.height},e)},l}(new p(e),0,t).node(),robot:(e,t)=>function(e,t,n){const o=n.width,i=n.height,r=Math.min(.28*o,.25*i),a=.2*r,s=.25*r,l=.08*r,c=.12*r,h=.22*r,u=.12*r,g=.3*r,p=o,m=-i/2+s+r,f=i-s-r,y=e.attr("label-offset-y",A("robot",o,i)).insert("g",":first-child");y.insert("rect",":first-child").attr("rx",3).attr("ry",3).attr("x",-p/2).attr("y",m).attr("width",p).attr("height",f);const b=-i/2+s;y.insert("rect",":first-child").attr("rx",a).attr("ry",a).attr("x",-r/2).attr("y",b).attr("width",r).attr("height",r),y.insert("line",":first-child").attr("class","robot-antenna").attr("x1",0).attr("y1",b).attr("x2",0).attr("y2",-i/2+2*l).attr("stroke-width",.6*l).attr("stroke-linecap","round"),y.insert("circle",":first-child").attr("class","robot-antenna-ball").attr("cx",0).attr("cy",-i/2+2*l).attr("r",1.2*l);const x=b+.4*r;y.insert("circle",":first-child").attr("class","robot-eye").attr("cx",-h).attr("cy",x).attr("r",c),y.insert("circle",":first-child").attr("class","robot-eye").attr("cx",h).attr("cy",x).attr("r",c);const w=b+.7*r,v=.28*r;return y.insert("path",":first-child").attr("class","robot-mouth").attr("d",`M${-v/2},${w} Q0,${w+.3*v} ${v/2},${w}`).attr("fill","none").attr("stroke-width",.5*l).attr("stroke-linecap","round"),y.insert("rect",":first-child").attr("rx",.25*u).attr("ry",.25*u).attr("x",-r/2-u-1).attr("y",x-g/2).attr("width",u).attr("height",g),y.insert("rect",":first-child").attr("rx",.25*u).attr("ry",.25*u).attr("x",r/2+1).attr("y",x-g/2).attr("width",u).attr("height",g),n.intersect=function(e){return d(n,e)},y}(new p(e),0,t).node(),webbrowser:(e,t)=>function(e,t,n){const o=n.height/8,i=e.attr("label-offset-y",A("webbrowser",n.width,n.height)).insert("g",":first-child");return i.insert("path",":first-child").attr("d",`\n\t\t\tM${-n.width/2},${-n.height/2+o} h${n.width}\n\t\t\tM${-n.width/2+o/4},${-n.height/2+o/4} h${o/2} v${o/2} h${-o/2} z\n\t\t\tM${-n.width/2+o},${-n.height/2+o/4} h${n.width-o-o/4} v${o/2} h${-n.width+o+o/4} z\n\t\t`),i.insert("rect",":first-child").attr("rx",3).attr("ry",3).attr("x",-n.width/2).attr("y",-n.height/2).attr("width",n.width).attr("height",n.height),n.intersect=function(e){return d(n,e)},i}(new p(e),0,t).node()};var x=n(538);class w{versions=[];pos=0;lastSavedPos=0;exportDoc;importDoc;change;tmpPreviousState=null;constructor(e,t,n){this.exportDoc=t,this.importDoc=n,this.change=function(e){let t;return function(){const n=this;clearTimeout(t),t=setTimeout(function(){t=null,e.apply(n)},300)}}(()=>this.saveNow())}beforeChange(){this.tmpPreviousState||(this.tmpPreviousState=this.deepClone(this.exportDoc()))}length(){return this.versions.length}currentState(){return this.deepClone(this.versions[this.pos-1])}saveNow(){if(!this.tmpPreviousState)throw Error("undo.change() was called without previously calling undo.beforeChange()!");this.versions[this.pos]=this.deepClone(this.exportDoc()),this.versions[this.pos-1]=this.tmpPreviousState,this.tmpPreviousState=null,this.pos+=1,this.versions.splice(this.pos)}deepClone(e){return"undefined"!=typeof structuredClone?structuredClone(e):JSON.parse(JSON.stringify(e))}undo(){if(this.pos<2)return;this.pos-=1;const e=this.versions[this.pos-1];this.importDoc(this.deepClone(e))}redo(){if(this.pos>this.versions.length-1)return;const e=this.versions[this.pos];this.importDoc(this.deepClone(e)),this.pos+=1}changed(){return this.pos!==this.lastSavedPos}setSaved(){this.lastSavedPos=this.pos}}var v=n(264);const C={"font-family":"Inter, -apple-system, BlinkMacSystemFont, sans-serif",stroke:"none"},k=(e,t)=>{Object.keys(t).forEach(n=>{const o=t[n];"number"==typeof o?e.style.setProperty(n,o.toString()):e.style.setProperty(n,o)})},I=(e,t)=>Math.sqrt((t.x-e.x)*(t.x-e.x)+(t.y-e.y)*(t.y-e.y));function B(e,t,n,i,r,a){const s={"font-family":String(C["font-family"]),"font-size":`${n}px`,"font-weight":i?"bold":"normal"},l=o(e,t,s);return{lines:l.lines.length>0?l.lines:[""],fontSize:n,lineHeight:n+2,bold:i,field:a,gapAfter:r}}const E={thickness:3,color:"#999",opacity:1,fontSize:22,dashed:!0},S={width:280,height:180,background:"rgba(255, 255, 255, .9)",color:"#666",opacity:.9,stroke:"#999",fontSize:22,shape:"Box"};class M{id;name;nodesMap;edges;edgeVertices;groupsMap;metadata;layoutDirection;colorToVarMap=new Map;_undo;_gridVisible=!1;_snapToGrid=!0;_gridSize=25;_skipAutoFit=!1;constructor(e,t){this.id=e,this.name=t,this.edges=[],this.edgeVertices=new Map,this.nodesMap=new Map,this.groupsMap=new Map,this._undo=new w(this.id,()=>this.exportLayout(!0),e=>this.importLayout(e,!0)),window.graph=this}init(e){e&&this.importLayout(e),this._undo=new w(this.id,()=>this.exportLayout(!0),e=>this.importLayout(e,!0)),this._undo.length()&&this.importLayout(this._undo.currentState()),this._undo.beforeChange(),this._undo.change()}addNode(e,t,n,o,i,r){if(this.nodesMap.has(e))throw Error("duplicate node: "+e);const a={...S,...i},s=(a.shape||"Box").toLowerCase(),l="person"===s?240:180,d=Math.max(280,a.width||0),c=function(e,t,n,o,i){const r=Math.max(o-36,80),a=[B(e,r,i,!0,6,"name"),B(`[${t}]`,r,.75*i,!1,10),B(n,r,Math.min(.8*i,16),!1,0,"description")],s=a.reduce((e,t)=>e+t.lines.length*t.lineHeight+t.gapAfter,0);return{blocks:a,textHeight:s,minimumHeight:s+36}}(t,n,o,d,a.fontSize||22);let h=Math.max(l,a.height||0,c.minimumHeight);for(let e=0;e<20;e++){const e=c.minimumHeight+Math.abs(A(s,d,h));if(e<=h+.1)break;h=e}const u={id:e,title:t,sub:n,description:o,style:a,x:0,y:0,width:d,height:h,intersect:null,link:r,contentLayout:c};this.nodesMap.set(u.id,u)}nodes(){return Array.from(this.nodesMap.values())}addEdge(e,t,n,o,i,r){i&&i.forEach((t,n)=>{const o=t;o.id=`v-${e}-${n}`,this.edgeVertices.set(o.id,o)});const a={id:e,from:this.nodesMap.get(t),to:this.nodesMap.get(n),label:o,vertices:null,style:{...E,...r},initVertex:e=>{const t=e;return t.id||(t.id=((e,t)=>`v-${e}-a-${(e=>{let t=2166136261;for(let n=0;n>>0).toString(36)})(`${e}:${t.x}:${t.y}`)}`)(a.id,e),this.edgeVertices.set(t.id,t)),t.edge=a,e},userDeletedVertices:!1};this.edges.push(a),i&&(a.vertices=i.map(e=>a.initVertex(e)))}addGroup(e,t,n,o){if(this.groupsMap.has(e))return void console.error(`Group exists: ${e} ${t}`);const i={id:e,name:t,x:null,y:null,width:null,height:null,nodes:n.map(n=>{const o=this.nodesMap.get(n)||this.groupsMap.get(n);return o||console.error(`Node or group ${n} not found for group ${e} "${t}"`),o}).filter(Boolean),style:o};this.groupsMap.set(e,i)}setNodeSelected(e,t){e.selected=t,t?e.ref.classList.add("selected"):e.ref.classList.remove("selected"),this.updateEdgesSel()}updateEdgesSel(){this.edges.forEach(e=>{e.to.selected||e.from.selected?e.ref.classList.add("selected"):e.ref.classList.remove("selected")})}moveNode(e,t,n,o=!1,i=!1){if(e){if(this._snapToGrid&&!o){const e=this.snapToGrid(t,n);t=e.x,n=e.y}e.x==t&&e.y==n||(i||this._undo.beforeChange(),e.x=t,e.y=n,r(e.ref,t,n),this.redrawEdges(e),this.redrawGroups(e),i||this._undo.change())}}moveEdgeVertex(e,t,n,o=!1,i=!1){if(this._snapToGrid&&!o){const e=this.snapToGrid(t,n);t=e.x,n=e.y}e.x==t&&e.y==n||(i||this._undo.beforeChange(),e.x=t,e.y=n,this.redrawEdge(e.edge),i||this._undo.change())}moveSelected(e,t,n=!1){this.nodes().forEach(o=>o.selected&&this.moveNode(o,o.x+e,o.y+t,n,!1)),this.edgeVertices.forEach(o=>o.selected&&this.moveEdgeVertex(o,o.x+e,o.y+t,n,!1))}insertEdgeVertex(e,t,n,o){this._undo.beforeChange();const i=e.initVertex(t);i.selected=!0,o&&(e.vertices.forEach(e=>e.label=!1),i.label=!0),e.vertices.splice(n-1,0,i),this.redrawEdge(e),this._undo.change()}deleteEdgeVertex(e){this._undo.beforeChange();const t=e.edge.vertices.indexOf(e);t>=0&&(e.edge.vertices.splice(t,1),this.edgeVertices.delete(e.id),e.edge.userDeletedVertices=!0),this.redrawEdge(e.edge),this._undo.change()}changed(){return this._undo.changed()}undo(){this._undo.undo()}redo(){this._undo.redo()}alignTopLeft(){const e=this.calculateContentBounds(),t=100-e.x,n=100-e.y;this._skipAutoFit=!0,this._undo.beforeChange(),this.nodesMap.forEach(e=>{this.moveNode(e,e.x+t,e.y+n,!0,!0)}),this.edgeVertices.forEach(e=>{this.moveEdgeVertex(e,e.x+t,e.y+n,!0,!0)}),this._undo.change()}resetPanTransform(){const e=G(),t=D.querySelector("g.zoom");t&&(t.setAttribute("transform",`scale(${e}) translate(0, 0)`),function(e){const t=e.calculateContentBounds(),n=G(),o=Math.max(D.parentElement.clientWidth/n,t.x+t.width+20),i=Math.max(D.parentElement.clientHeight/n,t.y+t.height+20);D.setAttribute("width",String(o*n)),D.setAttribute("height",String(i*n))}(this)),ee(this.id),this._skipAutoFit=!1}shouldSkipAutoFit(){return this._skipAutoFit}resetView(){const e=D.querySelector("g.zoom");e&&(e.setAttribute("transform","scale(1) translate(0, 0)"),Y()),ee(this.id)}redrawEdges(e){this.edges.forEach(t=>(e==t.from||e==t.to)&&this.redrawEdge(t)),this.updateEdgesSel()}redrawEdge(e){const t=e.ref.parentElement;t.removeChild(e.ref),e.ref=V(this,e),t.append(e.ref)}redrawGroups(e){this.groupsMap.forEach(e=>{const t=e.ref.parentElement;t.removeChild(e.ref),q(e),t.append(e.ref)})}exportSVG(){const e=document.querySelector("svg#graph"),t=(e.querySelector("rect.elastic"),e.cloneNode(!0));t.querySelectorAll("a.nodeLink[data-export-href]").forEach(e=>{e.setAttribute("href",e.getAttribute("data-export-href")||""),e.removeAttribute("data-export-href")});const n=t.querySelector("rect.elastic");n&&n.remove();const o=this.calculateContentBounds(),i=o.width+100,r=o.height+100,a=50-o.x,s=50-o.y,l=t.querySelector("g.zoom");l&&l.setAttribute("transform",`scale(1) translate(${a}, ${s})`),t.setAttribute("viewBox",`0 0 ${i} ${r}`),t.setAttribute("width",String(i)),t.setAttribute("height",String(r)),t.setAttribute("xmlns","http://www.w3.org/2000/svg"),this.convertStylesToCustomProperties(t);const d=document.createElement("script");return d.setAttribute("type","application/json"),this.metadata.layout=this.exportLayout(),d.append("/g,"]]]>]>"),t.insertBefore(d,t.firstChild),t.outerHTML}convertStylesToCustomProperties(e){0!==this.colorToVarMap.size&&(e.querySelectorAll("[fill]").forEach(e=>{const t=e.getAttribute("fill");t&&this.colorToVarMap.has(t)&&e.setAttribute("fill",`var(${this.colorToVarMap.get(t)}, ${t})`)}),e.querySelectorAll("[stroke]").forEach(e=>{const t=e.getAttribute("stroke");t&&this.colorToVarMap.has(t)&&e.setAttribute("stroke",`var(${this.colorToVarMap.get(t)}, ${t})`)}))}calculateContentBounds(){let e=1/0,t=1/0,n=-1/0,o=-1/0;return this.nodes().forEach(i=>{const r=i.x-i.width/2,a=i.x+i.width/2,s=i.y-i.height/2,l=i.y+i.height/2;e=Math.min(e,r),n=Math.max(n,a),t=Math.min(t,s),o=Math.max(o,l)}),this.edgeVertices.forEach(i=>{e=Math.min(e,i.x-5),n=Math.max(n,i.x+5),t=Math.min(t,i.y-5),o=Math.max(o,i.y+5)}),this.groupsMap.forEach(i=>{const r=i.x-i.width/2,a=i.x+i.width/2,s=i.y-i.height/2,l=i.y+i.height/2;e=Math.min(e,r),n=Math.max(n,a),t=Math.min(t,s),o=Math.max(o,l)}),this.edges.forEach(i=>{if(e=Math.min(e,i.from.x-10,i.to.x-10),n=Math.max(n,i.from.x+10,i.to.x+10),t=Math.min(t,i.from.y-10,i.to.y-10),o=Math.max(o,i.from.y+10,i.to.y+10),i.vertices&&i.vertices.forEach(i=>{e=Math.min(e,i.x-10),n=Math.max(n,i.x+10),t=Math.min(t,i.y-10),o=Math.max(o,i.y+10)}),i.label&&i.label.trim()){const r=(i.from.x+i.to.x)/2,a=(i.from.y+i.to.y)/2,s=10*i.label.length+50;e=Math.min(e,r-s),n=Math.max(n,r+s),t=Math.min(t,a-25),o=Math.max(o,a+25)}}),e===1/0?{x:0,y:0,width:100,height:100}:{x:e,y:t,width:n-e,height:o-t}}exportLayout(e=!1){const t={};return this.nodes().forEach(e=>t[e.id]={x:e.x,y:e.y}),this.edges.forEach(n=>{if(!n.vertices)return;const o=n.vertices.map(e=>({x:e.x,y:e.y,label:e.label,auto:e.auto}));(o.length||e)&&(t[`e-${n.id}`]=o),n.userDeletedVertices&&(t[`e-${n.id}-deleted`]=!0)}),t}setSaved(){this._undo.setSaved()}importLayout(e,t=!1){const n=[];Object.entries(e).forEach(([e,t])=>{e.startsWith("e-")||void 0===t.x||void 0===t.y?e.startsWith("e-")&&Array.isArray(t)&&t.forEach(e=>{void 0!==e.x&&void 0!==e.y&&n.push({x:e.x,y:e.y})}):n.push({x:t.x,y:t.y})});let o=0,i=0;if(n.length>0){const e=Math.min(...n.map(e=>e.x)),t=Math.min(...n.map(e=>e.y));if(e<-100||t<-100||Math.max(...n.map(e=>e.x))>3e3||Math.max(...n.map(e=>e.y))>2e3){const n=50;o=-e+n,i=-t+n}}Object.entries(e).forEach(([e,t])=>{const n=this.nodesMap.get(e);if(n)n.x=t.x+o,n.y=t.y+i;else if(e.startsWith("e-")&&!e.endsWith("-deleted")){const n=this.edges.find(t=>t.id==e.slice(2));if(!n)return;return n.vertices&&n.vertices.forEach(e=>this.edgeVertices.delete(e.id)),void(n.vertices=t.map(e=>{const t={x:e.x+o,y:e.y+i};Object.assign(t,e,{x:e.x+o,y:e.y+i});const r=n.initVertex(t);return e.auto&&(r.auto=!0),r}))}if(e.endsWith("-deleted")){const n=e.slice(2,-8),o=this.edges.find(e=>e.id==n);return void(o&&!0===t&&(o.userDeletedVertices=!0))}}),t&&(this.nodes().forEach(e=>r(e.ref,e.x,e.y)),this.edges.forEach(e=>this.redrawEdge(e)),this.updateEdgesSel(),this.redrawGroups(null))}async autoLayout(e){try{const t=await(0,x.k)(this,e);this._undo.beforeChange(),t.nodes.forEach(e=>{const t=this.nodesMap.get(e.id);t&&this.moveNode(t,e.x,e.y,!1,!0)}),t.edges.forEach(e=>{const t=this.edges.find(t=>t.id==e.id);if(t){if(t.vertices&&t.vertices.forEach(e=>{e.id&&this.edgeVertices.delete(e.id)}),t.vertices=[],t.userDeletedVertices=!1,e.vertices&&e.vertices.length>0&&(t.vertices=e.vertices.map(e=>{const n=t.initVertex(e);return n.auto=!0,n})),e.label){t.vertices&&(t.vertices.forEach(e=>{e.label&&this.edgeVertices.delete(e.id)}),t.vertices=t.vertices.filter(e=>!e.label));const n=t.initVertex(e.label);n.label=!0,n.auto=!0,t.vertices=t.vertices||[];const o=function(e,t,n,o){if(0===e.length)return 0;const i=[n,...e,o];let r=1/0,a=0;for(let e=0;ee.selected);e.push(...Array.from(this.edgeVertices.values()).filter(e=>e.selected));let t=Math.min(...e.map(e=>e.y));this.nodesMap.forEach(e=>e.selected&&this.moveNode(e,e.x,t,!1,!1)),this.edgeVertices.forEach(e=>e.selected&&this.moveEdgeVertex(e,e.x,t,!1,!1))}alignSelectionH(){const e=this.nodes().filter(e=>e.selected);e.push(...Array.from(this.edgeVertices.values()).filter(e=>e.selected));let t=Math.min(...e.map(e=>e.x));this.nodesMap.forEach(e=>e.selected&&this.moveNode(e,t,e.y,!1,!1)),this.edgeVertices.forEach(e=>e.selected&&this.moveEdgeVertex(e,t,e.y,!1,!1))}distributeSelectionH(){const e=this.nodes().filter(e=>e.selected),t=Array.from(this.edgeVertices.values()).filter(e=>e.selected);if(e.length+t.length<3)return;this._undo.beforeChange();const n=[...e,...t];n.sort((e,t)=>e.x-t.x);const o=n[0].x,i=(n[n.length-1].x-o)/(n.length-1);n.forEach((e,t)=>{const n=o+t*i;"title"in e?this.moveNode(e,n,e.y,!1,!0):this.moveEdgeVertex(e,n,e.y,!1,!0)}),this._undo.change()}distributeSelectionV(){const e=this.nodes().filter(e=>e.selected),t=Array.from(this.edgeVertices.values()).filter(e=>e.selected);if(e.length+t.length<3)return;this._undo.beforeChange();const n=[...e,...t];n.sort((e,t)=>e.y-t.y);const o=n[0].y,i=(n[n.length-1].y-o)/(n.length-1);n.forEach((e,t)=>{const n=o+t*i;"title"in e?this.moveNode(e,e.x,n,!1,!0):this.moveEdgeVertex(e,e.x,n,!1,!0)}),this._undo.change()}setEdgeSelected(e,t){t&&(this.setNodeSelected(e.from,!0),this.setNodeSelected(e.to,!0)),this.updateEdgesSel()}fitToView(){const e=this.calculateContentBounds();if(0===e.width||0===e.height)return;const t=D.parentElement?.clientWidth||800,n=D.parentElement?.clientHeight||600,o=(t-80)/e.width,i=(n-80)/e.height,r=Math.min(o,i),a=Math.max(Math.min(r,2),.1),s=t/2-(e.x+e.width/2)*a,l=n/2-(e.y+e.height/2)*a,d=D.querySelector("g.zoom");d&&d.setAttribute("transform",`translate(${s}, ${l}) scale(${a})`),Y(),J(this.id)}saveLayoutState(){return this.exportLayout(!0)}restoreLayoutState(e){this.importLayout(e,!0)}isGridVisible(){return this._gridVisible}isSnapToGrid(){return this._snapToGrid}getGridSize(){return this._gridSize}toggleGrid(){this._gridVisible=!this._gridVisible,this.updateGridDisplay(),window.dispatchEvent(new CustomEvent("gridStateChanged"))}toggleSnapToGrid(){this._snapToGrid=!this._snapToGrid,window.dispatchEvent(new CustomEvent("gridStateChanged"))}snapAllToGrid(){this._snapToGrid&&(this._undo.beforeChange(),this.nodes().forEach(e=>{const t=Math.round(e.x/this._gridSize)*this._gridSize,n=Math.round(e.y/this._gridSize)*this._gridSize;this.moveNode(e,t,n,!1,!0)}),this._undo.change())}snapToGrid(e,t){return{x:Math.round(e/this._gridSize)*this._gridSize,y:Math.round(t/this._gridSize)*this._gridSize}}updateGridDisplay(){if(!D)return;const e=D.querySelector("#grid-pattern");e&&e.remove();const t=D.querySelector("#grid-background");if(t&&t.remove(),!this._gridVisible)return;let n=D.querySelector("defs");n||(n=document.createElementNS("http://www.w3.org/2000/svg","defs"),D.insertBefore(n,D.firstChild));const o=document.createElementNS("http://www.w3.org/2000/svg","pattern");o.id="grid-pattern",o.setAttribute("width",this._gridSize.toString()),o.setAttribute("height",this._gridSize.toString()),o.setAttribute("patternUnits","userSpaceOnUse");const i=document.createElementNS("http://www.w3.org/2000/svg","path");i.setAttribute("d",`M ${this._gridSize} 0 L 0 0 0 ${this._gridSize}`),i.setAttribute("fill","none"),i.setAttribute("stroke","#d0d0d0"),i.setAttribute("stroke-width","1"),i.setAttribute("opacity","0.8"),o.appendChild(i),n.appendChild(o);const r=document.createElementNS("http://www.w3.org/2000/svg","rect");r.id="grid-background",r.setAttribute("x","-10000"),r.setAttribute("y","-10000"),r.setAttribute("width","20000"),r.setAttribute("height","20000"),r.setAttribute("fill","url(#grid-pattern)"),r.setAttribute("pointer-events","none");const a=D.querySelector("g.zoom");a&&a.insertBefore(r,a.firstChild)}}let $,D=document.querySelector("svg#graph");D||(D=document.createElementNS("http://www.w3.org/2000/svg","svg"),D.setAttribute("id","graph"),D.addEventListener("click",e=>$(e))),D.setAttribute("width","100%"),D.setAttribute("height","100%");let j,L=!1;const T=(e,t,n)=>{D.innerHTML='\n\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n',document.body.append(D),D.__data=e,j=t,$=e=>{},_(e);const o=i.rect(300,300,50,50,0,"elastic");return D.append(o),e.updateGridDisplay(),W(D,n),{svg:D,setZoom:H}},_=e=>{const t=i.element("g",{},"zoom"),n=i.element("g",{},"nodes"),o=i.element("g",{},"edges"),a=i.element("g",{},"groups");t.append(a,o,n),e.nodesMap.forEach(t=>{!function(e,t){window.gdata=t;const n=i.element("g",{},"node");n.setAttribute("id",e.id),e.selected&&n.classList.add("selected"),r(n,e.x,e.y);const o=e.link?i.element("a",{href:e.link.href,"data-export-href":e.link.exportHref,"aria-label":`Open ${e.title}`},"nodeLink"):null,a=o||n;o&&(n.classList.add("linked"),n.append(o));const s=e.style.shape||"Box",l=(b[s.toLowerCase()]||b.box)(a,e);l.classList.add("nodeBorder"),k(l,Z.nodeBorder),l.setAttribute("fill",e.style.background),l.setAttribute("stroke",e.style.stroke),l.setAttribute("stroke-width","3"),l.setAttribute("opacity",String(e.style.opacity)),X(l,e.style.border);const d=function(e,t){const n=i.element("g");let o=-e.textHeight/2;return e.blocks.forEach(e=>{const r=i.text("",{"text-anchor":"middle"});k(r,C),t&&r.setAttribute("fill",t),e.field&&r.setAttribute("data-field",e.field),e.lines.forEach((t,n)=>{const a=i.element("tspan",{x:0,y:o+e.fontSize+n*e.lineHeight,"font-size":`${e.fontSize}px`,"font-weight":e.bold?"bold":"normal"});a.textContent=t,r.append(a)}),n.append(r),o+=e.lines.length*e.lineHeight+e.gapAfter}),n}(e.contentLayout,e.style.color);r(d,0,(Number(a.getAttribute("label-offset-y"))||0)/2),a.append(d),n.__data=e,e.ref=n}(t,e),n.append(t.ref)}),e.edges.forEach(e=>{e.labelBounds=void 0}),e.edges.forEach(t=>{V(e,t),o.append(t.ref)}),e.groupsMap.forEach(e=>{q(e),a.append(e.ref)}),D.append(t)};function V(e,t){const n=t.from,o=t.to,r=i.element("g",{},"edge");r.setAttribute("id",t.id),r.setAttribute("data-from",t.from.id),r.setAttribute("data-to",t.to.id);const d=(t.style.position||50)/100,c=function(e,t){const n=e.from,o=e.to;let i=e.vertices?e.vertices.concat():[];if(0==i.length&&!e.userDeletedVertices){const r=t.edges.filter(t=>t.from==e.from&&t.to==e.to);let a=0;if(r.length>1){a=r.indexOf(e)-(r.length-1)/2;let t=0,s=0;Math.abs(n.x-o.x)>Math.abs(n.y-o.y)?s=70*a:t=200*a;const l=e.initVertex({x:(n.x+o.x)/2+t,y:(n.y+o.y)/2+s});l.label=!0,l.auto=!0,i.push(l)}}i.unshift(n),i.push(o);let r=i[i.length-1];for(let e=1;e0;e--)if(!i[e].label){a=i[e];break}const s=(e,t)=>{const n=e.style?.shape?.toLowerCase()||"box",o=t.x-e.x,i=t.y-e.y;if(e.x,e.y,Math.abs(o)<.01&&Math.abs(i)<.01)return{x:e.x+e.width/2,y:e.y};if("cylinder"===n){const t=e.width,n=t/2,r=n/(5.5+t/70),a=e.height/2,s=Math.atan2(i,o),l=Math.cos(s),d=Math.sin(s);let c=1/0;Math.abs(l)>.01&&(c=Math.min(c,Math.abs(n/l))),Math.abs(d)>.01&&(c=Math.min(c,Math.abs(a/d)));const h=e.x+l*c,u=e.y+d*c,g=e.y-a+r,A=e.y+a-r;if(uA){const t=u=0){const e=Math.sqrt(l),n=(-s+e)/(2*i),r=(-s-e)/(2*i);return{x:o>0?Math.max(n,r):Math.min(n,r),y:t}}}return{x:h,y:u}}if("circle"===n){const t=e.width/2,n=Math.atan2(i,o);return{x:e.x+Math.cos(n)*t,y:e.y+Math.sin(n)*t}}if("ellipse"===n){const t=.55*e.width,n=.45*e.width,r=Math.atan2(i,o),a=Math.cos(r),s=Math.sin(r),l=Math.sqrt(t*t*s*s+n*n*a*a);return{x:e.x+t*a*n/l,y:e.y+n*s*t/l}}{const t=e.width/2,n=e.height/2,r=Math.atan2(i,o),a=Math.cos(r),s=Math.sin(r);let l=1/0;return Math.abs(a)>.01&&(l=Math.min(l,Math.abs(t/a))),Math.abs(s)>.01&&(l=Math.min(l,Math.abs(n/s))),{x:e.x+a*l,y:e.y+s*l}}};let l=s(n,r),d=s(o,a);return i[0]=l,i[i.length-1]=d,i}(t,e),h=function(e,t,n){let o,i={x:n.x,y:n.y};const r=e.findIndex(e=>e.label);let a=!0;if(r>=0){const t=e[r];i=t,a=!0===t.auto;const n=[];r>0&&n.push({p:e[r-1],q:i}),re?I(t.p,t.q)>I(e.p,e.q)?t:e:t,void 0)}else{const n=e.slice(1).reduce((t,n,o)=>t+I(e[o],n),0)*t;let r=0;for(let t=1;t0&&r+s>=n){const e=(n-r)/s;i={x:a.p.x+(a.q.x-a.p.x)*e,y:a.p.y+(a.q.y-a.p.y)*e},o=a;break}r+=s}}const s=o?Math.abs(o.q.x-o.p.x):0,l=o?Math.abs(o.q.y-o.p.y):0;return{...i,orientation:l>s?"vertical":"horizontal",segment:o,movable:a}}(c,d,n),{bg:u,txt:g,bbox:A}=function(e,t,n){const o=t.style.fontSize;let{txt:r,dy:a,maxW:l}=i.textArea(t.label,200,o,!1,e.x,e.y,"middle");a-=o/2,l+=o;const d=[{x:e.x,y:e.y}];if(e.movable&&e.segment)for(const t of[.5,.35,.65,.2,.8]){const n={x:e.segment.p.x+(e.segment.q.x-e.segment.p.x)*t,y:e.segment.p.y+(e.segment.q.y-e.segment.p.y)*t};d.some(e=>Math.abs(e.x-n.x)<.1&&Math.abs(e.y-n.y)<.1)||d.push(n)}const c=[...n.nodes().map(e=>z(s(e),8)),...n.edges.filter(e=>e!==t&&e.labelBounds).map(e=>z(e.labelBounds,8))],h=d.flatMap(t=>"vertical"===e.orientation?[1,-1].map(n=>N(t.x+n*(l/2+12),t.y,l,a,t,e,c)):[-1,1].map(n=>N(t.x,t.y+n*(a/2+12),l,a,t,e,c))).reduce((e,t)=>t.score{e.setAttribute("x",String(u))}),r.setAttribute("y",String(g-a/2)),k(r,Z.edgeText),r.setAttribute("stroke","none"),r.setAttribute("font-size",String(t.style.fontSize)),r.setAttribute("fill",t.style.color);const p={...A},m=i.rect(p.width,p.height,p.x,p.y);return k(m,Z.edgeRect),r.setAttribute("data-field","label"),t.labelBounds=A,p.x+=p.width/2,p.y+=p.height/2,{bg:m,txt:r,bbox:p}}(h,t,e);r.append(u,g);const{segments:p,path:m}=function(e,t,n,o){const i=[];for(let t=1;t0&&i[i.length-1],function(e,t){for(let n=0;nMath.abs(i[1].x-o.p.x)+Math.abs(i[1].y-o.p.y)&&i.reverse();const t={p:i[1],q:o.q};o.q=i[0],e.splice(n+1,0,t),n+=1}}}}(i,t),i.length>0){r=`M${i[0].p.x},${i[0].p.y}`;for(let e=0;e{if("id"in e&&"edge"in e){const n=e;return n.edge=t,n}return t.initVertex(e)}),t.vertices.forEach((e,t)=>{const n=e;n.ref=i.element("circle",{id:n.id,cx:e.x,cy:e.y,r:7,fill:"none"},"v-dot"),n.selected&&n.ref.classList.add("selected"),n.auto&&n.ref.classList.add("auto"),r.append(n.ref)}),t.ref=r,r}function N(e,t,n,o,i,r,a){const s={x:e-n/2,y:t-o/2,width:n,height:o},l=a.reduce((e,t)=>{return e+(n=s,o=t,Math.max(0,Math.min(n.x+n.width,o.x+o.width)-Math.max(n.x,o.x))*Math.max(0,Math.min(n.y+n.height,o.y+o.height)-Math.max(n.y,o.y)));var n,o},0);return{centerX:e,centerY:t,bounds:s,score:1e3*l+I(i,r)}}function z(e,t){return{x:e.x-t,y:e.y-t,width:e.width+2*t,height:e.height+2*t}}function q(e){if(0==e.nodes.length)return;const t=i.element("g",{},"group");let n={x:1e100,y:1e100},o={x:0,y:0};e.nodes.forEach(e=>{const t=e.style?.shape?.toLowerCase()||"box";let i=e.height/2,r=e.height/2;if("robot"===t){const t=.12*e.height;i=e.height/2+t,r=e.height/2}else if("hexagon"===t){const t=e.width/2*.866;i=t,r=t}const a={x:e.x-e.width/2,y:e.y-i,width:e.width,height:i+r};n.x=Math.min(n.x,a.x),n.y=Math.min(n.y,a.y),o.x=Math.max(o.x,a.x+a.width),o.y=Math.max(o.y,a.y+a.height)});const r=Math.max(o.x-n.x,200),a=o.y-n.y,s={x:n.x-25,y:n.y-25,width:r+50,height:a+50+30},l=i.rect(s.width,s.height,s.x,s.y);e.x=s.x+s.width/2,e.y=s.y+s.height/2,e.width=s.width,e.height=s.height,k(l,Z.groupRect),e.style.stroke&&l.setAttribute("stroke",e.style.stroke),e.style.background&&l.setAttribute("fill",e.style.background);const d=i.text(e.name,{x:n.x,y:s.y+s.height-Z.groupText["font-size"]});k(d,Z.groupText),e.style.color&&d.setAttribute("fill",e.style.color),t.append(l,d),e.ref=t}function R(e,t){let n={dst:Number.POSITIVE_INFINITY,pos:-1,edge:null,prj:null};return e.edges.forEach(e=>{const o=e.vertices||[],i=[e.from,...o,e.to];for(let o=1;o50||a3||Math.abs(s)>3)&&(h=!0,c=null,d)){const e=t.getSelection();e.length=0,e.push(d.node),t.setSelection(e),o=[{x:d.node.x,y:d.node.y,n:d.node}],d=null}if(r)!function(t,n){const o=e.querySelector("g.zoom");if(!o)return;const i=G();o.setAttribute("transform",`translate(${t}, ${n}) scale(${i})`)}(l.x+a,l.y+s);else if(o.length>0&&h){const e=t.getZoom(),n=a/e,i=s/e;o.forEach(e=>{t.moveNode(e.n,e.x+n,e.y+i)}),t.setDragging(!0)}else i&&(i.update(n),t.setDragging(!0))}(n=m(n),n.clientX-p.ex,n.clientY-p.ey)}function y(n){document.removeEventListener("touchmove",f),document.removeEventListener("mousemove",f),document.removeEventListener("mouseup",y),document.removeEventListener("touchend",y),function(n){t.setDragging(!1);const a=h?null:c;if(h&&(u=!0,window.setTimeout(()=>{u=!1},0)),d&&!h){const e=t.getSelection();e.length=0,e.push(d.node),t.setSelection(e)}if(i){const e=i.end();e?t.boxSelection(e,n.shiftKey):o.length||t.setSelection([]),i=null}if(r&&h){const t=e.__data;t&&t.id&&J(t.id)}d=null,c=null,h=!1,r=!1,t.updatePanning(),a&&(window.location.href=a)}(m(n)),p=null}function b(u){u=m(u),p={ex:u.clientX,ey:u.clientY},function(u){u.preventDefault(),h=!1,d=null;const g=u.target,A=g instanceof Element?g.closest("a.nodeLink"):null;c=u.shiftKey?null:A?.getAttribute("href")||null;const p=t.nodeFromEvent(u),m=u.shiftKey?"pan"===n?"select":"pan":n;if(p)if("pan"===m){r=!1,i=null;const e=t.getSelection();t.isSelected(p)?o=e.map(e=>({x:e.x,y:e.y,n:e})):(t.setSelection([p]),o=[{x:p.x,y:p.y,n:p}])}else{r=!1,i=null;const e=t.getSelection();if(u.shiftKey&&"select"===n){if(t.isSelected(p)){const t=e.findIndex(e=>e.id===p.id);t>=0&&e.splice(t,1)}else e.push(p);t.setSelection(e),o=e.map(e=>({x:e.x,y:e.y,n:e}))}else t.isSelected(p)?(o=e.map(e=>({x:e.x,y:e.y,n:e})),d=null):(d={node:p,shiftKey:u.shiftKey},o=[{x:p.x,y:p.y,n:p}])}else"pan"===m?(r=!0,i=null,a=u.clientX,s=u.clientY,l=function(){const t=e.querySelector("g.zoom");if(!t)return{x:0,y:0};const n=(t.getAttribute("transform")||"").match(/translate\(([^,]+),([^)]+)\)/);return n?{x:parseFloat(n[1])||0,y:parseFloat(n[2])||0}:{x:0,y:0}}(),o=[],t.setSelection([])):(r=!1,i=function(){let t=0,n=0,o=null;return{ini(i){const r=F(i);t=r.x,n=r.y,o=document.createElementNS("http://www.w3.org/2000/svg","rect"),o.setAttribute("fill","rgba(0, 100, 255, 0.1)"),o.setAttribute("stroke","rgba(0, 100, 255, 0.5)"),o.setAttribute("stroke-width","1"),o.setAttribute("stroke-dasharray","3,3"),o.setAttribute("x",String(t)),o.setAttribute("y",String(n)),o.setAttribute("width","0"),o.setAttribute("height","0");const a=e.querySelector("g.zoom");a?a.appendChild(o):e.appendChild(o)},update(e){if(!o)return;const i=F(e),r=i.x,a=i.y,s=Math.min(t,r),l=Math.min(n,a),d=Math.abs(r-t),c=Math.abs(a-n);o.setAttribute("x",String(s)),o.setAttribute("y",String(l)),o.setAttribute("width",String(d)),o.setAttribute("height",String(c))},end(){if(!o)return null;const e=parseFloat(o.getAttribute("x")||"0"),t=parseFloat(o.getAttribute("y")||"0"),n=parseFloat(o.getAttribute("width")||"0"),i=parseFloat(o.getAttribute("height")||"0");return o.remove(),o=null,n>5&&i>5?{x:e,y:t,width:n,height:i,left:e,top:t,right:e+n,bottom:t+i}:null}}}(),i&&i.ini(u),o=[])}(u),document.addEventListener("touchmove",f),document.addEventListener("mousemove",f),document.addEventListener("mouseup",y),document.addEventListener("touchend",y)}A.addEventListener("mousedown",b),A.addEventListener("touchstart",b),g.push({element:A,event:"mousedown",handler:b},{element:A,event:"touchstart",handler:b})}(e),e.addEventListener("click",A),g.push({element:e,event:"click",handler:A}),()=>{g.forEach(({element:e,event:t,handler:n})=>{e.removeEventListener(t,n)})}}function W(e,t){const n=e.__cursorInteractionCleanup;function o(e){return e.__data}n&&n();const r=()=>o(e),l=[],d=e=>{r().changed()&&(e.preventDefault(),e.returnValue="")};function c(t,n){t.selected=n;const o=e.querySelector("#"+t.id);t.selected?o.classList.add("selected"):o.classList.remove("selected")}window.addEventListener("beforeunload",d),l.push({element:window,event:"beforeunload",handler:d});const h=t=>{if(!t.altKey)return;const n=R(r(),F(t));if(n){const{prj:t}=n,o=e.querySelector("g.edges");let r=o.querySelector("#prj");r||(r=i.element("circle",{id:"prj",cx:t.x,cy:t.y,r:7}),o.append(r)),r.setAttribute("cx",String(t.x)),r.setAttribute("cy",String(t.y))}else g()};e.addEventListener("mousemove",h),l.push({element:e,event:"mousemove",handler:h});const u=e=>{const t=(0,v.Yp)(e,!0);t!=v.Zj&&t!=v._s&&g()};function g(){const t=e.querySelector("g.edges #prj");t&&t.parentElement.removeChild(t)}window.addEventListener("keyup",u),l.push({element:window,event:"keyup",handler:u});const A=e=>{const t=(0,v.Yp)(e,!0);if(t!=v._s&&t!=v.Zj)return;const n=R(r(),F(e));if(n){const{edge:e,pos:o,prj:i}=n;r().insertEdgeVertex(e,i,o,t==v._s),g()}};e.addEventListener("click",A),l.push({element:e,event:"click",handler:A});const p=t=>{const n=.1*Math.sign(t.deltaY),o=G(),i=Math.max(.1,Math.min(5,o-n));if(i!==o){const n=e.getBoundingClientRect();P(i,t.clientX-n.left,t.clientY-n.top),t.preventDefault();const o=e.__data;o&&o.id&&J(o.id)}};e.addEventListener("wheel",p),l.push({element:e,event:"wheel",handler:p});const m=e=>{const t=(0,v.Yp)(e);switch(t&&e.preventDefault(),t){case v.bl:Array.from(r().edgeVertices.values()).filter(e=>e.selected).forEach(e=>{r().deleteEdgeVertex(e)});break;case"undo":r().undo();break;case"redo":r().redo();break;case v.Ur:P(Math.min(5,1.2*G())),J(r().id);break;case v.hU:P(Math.max(.1,G()/1.2)),J(r().id);break;case v.i1:P(1),J(r().id);break;case v.mD:r().fitToView();break;case v.F:r().nodes().forEach(e=>r().setNodeSelected(e,!0)),r().edgeVertices.forEach(e=>c(e,!0));break;case v.Gn:r().nodes().forEach(e=>r().setNodeSelected(e,!1)),r().edgeVertices.forEach(e=>c(e,!1))}};window.addEventListener("keydown",m),l.push({element:window,event:"keydown",handler:m});const f=O(e,{nodeFromEvent(e){e.preventDefault();let t=e.target.closest("g.nodes g.node");return t?o(t):(t=e.target.closest("g.edges g.edge .v-dot"),t?r().edgeVertices.get(t.id):null)},setSelection(e){r().nodes().forEach(t=>r().setNodeSelected(t,e.some(e=>e.id==t.id))),r().edgeVertices.forEach(t=>c(t,e.some(e=>e.id==t.id))),j(r().nodes().find(e=>e.selected))},setDragging(e){L=e},isSelected:e=>e.selected,getSelection(){const e=r().nodes().filter(e=>e.selected);return r().edgeVertices.forEach(t=>t.selected&&e.push(t)),e},getZoom:G,moveNode(e,t,n){r().nodesMap.has(e.id)?r().moveNode(e,t,n):(e.auto=!1,r().moveEdgeVertex(e,t,n))},boxSelection(e,t){r().nodesMap.forEach(n=>{var o,i;o=s(n),i=e,o.xi.x&&o.y+o.height>i.y?r().setNodeSelected(n,!n.selected):t||r().setNodeSelected(n,!1)}),r().edgeVertices.forEach(n=>{a(n,e,!1)?c(n,!n.selected):t||c(n,!1)}),j(r().nodes().find(e=>e.selected))},updatePanning:Y},t);e.__cursorInteractionCleanup=()=>{l.forEach(({element:e,event:t,handler:n})=>{e.removeEventListener(t,n)}),f&&f()}}function G(){if(!D)return 1;const e=D.querySelector("g.zoom");if(!e)return 1;const t=(e.getAttribute("transform")||"").match(/scale\(([^)]+)\)/);return t&&parseFloat(t[1])||1}function H(e){if(!D)return;const t=D.querySelector("g.zoom");if(!t)return;const n=U();t.setAttribute("transform",`translate(${n.x}, ${n.y}) scale(${e})`),Y()}function P(e,t,n){const o=D.querySelector("g.zoom"),i=G();if(void 0===t||void 0===n){const e=D.parentElement;e?(t=e.clientWidth/2,n=e.clientHeight/2):(t=D.clientWidth/2,n=D.clientHeight/2)}const r=U(),a=t-(t-r.x)/i*e,s=n-(n-r.y)/i*e;o.setAttribute("transform",`translate(${a}, ${s}) scale(${e})`),Y()}function U(){if(!D)return{x:0,y:0};const e=D.querySelector("g.zoom");if(!e)return{x:0,y:0};const t=(e.getAttribute("transform")||"").match(/translate\(([^,]+),([^)]+)\)/);return t?{x:parseFloat(t[1])||0,y:parseFloat(t[2])||0}:{x:0,y:0}}function Y(){if(!D)return;const e=D.querySelector("g.zoom");if(!e)return;const t=e.getBBox(),n=G();if(!D.parentElement)return;const o=Math.max(D.parentElement.clientWidth/n,t.x+t.width+20),i=Math.max(D.parentElement.clientHeight/n,t.y+t.height+20);D.setAttribute("width",String(o*n)),D.setAttribute("height",String(i*n))}const X=(e,t)=>{"Dashed"==t?e.setAttribute("stroke-dasharray","4"):"Dotted"==t&&e.setAttribute("stroke-dasharray","2")},Z={nodeBorder:{filter:"url(#shadow)"},nodeText:{"font-family":"Arial, sans-serif",stroke:"none"},edgeText:{"font-family":"Arial, sans-serif",stroke:"none"},edgeRect:{fill:"none",stroke:"none"},groupRect:{fill:"rgba(0, 0, 0, 0.02)",stroke:"#666","stroke-width":3,"stroke-dasharray":4},groupText:{"font-family":"Arial, sans-serif",fill:"#666","font-size":22,"font-weight":"bold",cursor:"default"}},K=new Map;function J(e){if(!D)return;const t=G(),n=U(),o={zoom:t,transform:{x:n.x,y:n.y}};K.set(e,o)}function Q(e){if(!D||!K.has(e))return!1;const t=K.get(e);if(!t)return!1;const n=D.querySelector("g.zoom");return n&&(n.setAttribute("transform",`scale(${t.zoom}) translate(${t.transform.x}, ${t.transform.y})`),Y()),!0}function ee(e){K.delete(e)}function te(e,t,n){const o=e.x-t.x,i=e.y-t.y,r=n.x-t.x,a=n.y-t.y,s=o*r+i*a,l=r*r+a*a;if(0===l)return Math.sqrt(o*o+i*i);let d,c,h=s/l;h<0?(d=t.x,c=t.y):h>1?(d=n.x,c=n.y):(d=t.x+h*r,c=t.y+h*a);const u=e.x-d,g=e.y-c;return Math.sqrt(u*u+g*g)}},538(e,t,n){n.d(t,{k:()=>r}),n(408);function o(e={},t=!1){const n={nodeSpacing:e.nodeSpacing??80,layerSpacing:e.layerSpacing??60,componentSpacing:80,padding:40,groupMultiplier:.65};return t&&(n.nodeSpacing=Math.max(n.nodeSpacing*n.groupMultiplier,30),n.layerSpacing=Math.max(n.layerSpacing*n.groupMultiplier,35),n.componentSpacing=Math.max(n.componentSpacing*n.groupMultiplier,25),n.padding=Math.max(n.padding*n.groupMultiplier,15)),n}function i(e,t){const{direction:n="DOWN",compactLayout:o=!1}=t,i={"elk.algorithm":"layered","elk.direction":n,"elk.spacing.nodeNode":e.nodeSpacing.toString(),"elk.spacing.componentComponent":e.componentSpacing.toString(),"elk.padding":`[top=${e.padding},left=${e.padding},bottom=${e.padding},right=${e.padding}]`,"elk.layered.spacing.nodeNodeBetweenLayers":e.layerSpacing.toString(),"elk.layered.spacing.edgeNodeBetweenLayers":"10","elk.layered.spacing.edgeEdgeBetweenLayers":"10","elk.edgeRouting":"POLYLINE","elk.layered.unnecessaryBendpoints":"false","elk.layered.edgeRouting.orthogonal.mode":"DIRECTION_BASED","elk.layered.edgeRouting.orthogonal.spacing":"5","elk.layered.edgeRouting.orthogonal.nodeOverlapRatio":"0.1","elk.layered.compaction.connectedComponents":"true","elk.layered.compaction.postCompaction.strategy":"LEFT_RIGHT","elk.separateConnectedComponents":"true","elk.layered.nodePlacement.strategy":"NETWORK_SIMPLEX","elk.layered.nodePlacement.favorStraightEdges":"true","elk.layered.crossingMinimization.strategy":"LAYER_SWEEP","elk.layered.crossingMinimization.semiInteractive":"true","elk.hierarchyHandling":"SEPARATE_CHILDREN","elk.layered.considerModelOrder.strategy":"NONE","elk.edgeLabels.placement":"CENTER","elk.edgeLabels.inline":"true","elk.spacing.edgeLabel":"5","elk.edgeLabels.avoidOverlap":"false","elk.edgeLabels.considerModelOrder":"false","elk.layered.edgeLabels.sideSelection":"ALWAYS_UP"};return o&&(i["elk.spacing.nodeNode"]=Math.max(.7*e.nodeSpacing,30).toString(),i["elk.layered.spacing.nodeNodeBetweenLayers"]=Math.max(.7*e.layerSpacing,30).toString()),i}async function r(e,t={}){const r=new(await n.e(726).then(n.t.bind(n,862,23)).then(e=>e.default)),s={id:"root",layoutOptions:i(o(t,!1),t),children:[],edges:[]},l=new Map,d=new Map;e.nodesMap.forEach(e=>{if(!e.id)return;l.set(e.id,e);const t=Math.max(e.width||200,150),n=Math.max(e.height||100,250);d.set(e.id,{id:e.id,x:e.x,y:e.y,width:t+50,height:n+50,layoutOptions:{"elk.position":"","elk.nodeSize.constraints":"[FIXED_SIZE]"}})});const c=new Map,h=new Map,u=new Set;e.groupsMap.forEach(e=>{e.nodes.forEach(t=>{if(a(t))return h.has(t.id)||h.set(t.id,e.id),void u.add(t.id);c.has(t.id)||c.set(t.id,e.id)})});const g=new Map,A=e=>{const n=g.get(e.id);if(n)return n;const r=e.nodes.flatMap(t=>{if(a(t))return h.get(t.id)===e.id?[A(t)]:[];const n=d.get(t.id);return n&&c.get(t.id)===e.id?[n]:[]}),s={id:e.id,children:r,edges:[],layoutOptions:i(o(t,!0),t)};return g.set(e.id,s),s};e.groupsMap.forEach(e=>{if(!u.has(e.id)){const t=A(e);t.children.length>0&&s.children.push(t)}}),d.forEach((e,t)=>{c.has(t)||s.children.push(e)});const p=e=>{const t=[];let n=e;for(;n;)t.push(n),n=h.get(n);return t};if(e.edges.forEach(e=>{if(!e.id||!e.from?.id||!e.to?.id)return;if(!l.has(e.from.id)||!l.has(e.to.id))return void console.warn(`Skipping edge ${e.id}: source ${e.from.id} or target ${e.to.id} not found in nodes`);const t=e.label&&e.label.trim()?Math.min(7*e.label.length,200):0,n={id:e.id,sources:[e.from.id],targets:[e.to.id],labels:e.label&&e.label.trim()?[{id:`${e.id}-label`,text:e.label,width:t,height:20,layoutOptions:{"elk.edgeLabels.placement":"CENTER","elk.edgeLabels.inline":"true"}}]:[]},o=((e,t)=>{const n=p(c.get(e)),o=new Set(p(c.get(t)));return n.find(e=>o.has(e))})(e.from.id,e.to.id);(o?g.get(o):s).edges.push(n)}),!s.id||!s.children)throw new Error("Invalid ELK graph structure");try{const t=await r.layout(s),n=[],o=[],i=(e,t=0,o=0)=>{e.children?.forEach(e=>{e.children?i(e,t+(e.x||0),o+(e.y||0)):n.push({id:e.id,x:t+(e.x||0)+(e.width||0)/2,y:o+(e.y||0)+(e.height||0)/2})})},a=(t,n=0,i=0)=>{t.edges?.forEach(t=>{const r=[];let a;t.sections&&t.sections.length>0&&t.sections.forEach(e=>{e.startPoint&&r.push({x:n+e.startPoint.x,y:i+e.startPoint.y}),e.bendPoints&&e.bendPoints.length>0&&e.bendPoints.forEach(e=>{r.push({x:n+e.x,y:i+e.y})}),e.endPoint&&r.push({x:n+e.endPoint.x,y:i+e.endPoint.y})});const s=e.edges.find(e=>e.id===t.id);if(s?.label&&s.label.trim())if(t.labels&&t.labels.length>0){const e=t.labels[0];void 0!==e.x&&void 0!==e.y&&(a={x:n+e.x+(e.width||0)/2,y:i+e.y+(e.height||0)/2})}else if(r.length>=2){const e=Math.floor(r.length/2);if(r.length%2==0){const t=r[e-1],n=r[e];a={x:(t.x+n.x)/2,y:(t.y+n.y)/2}}else a=r[e]}o.push({id:t.id,vertices:r,label:a})}),t.children?.forEach(e=>{e.edges&&e.edges.length>0&&a(e,n+(e.x||0),i+(e.y||0))})};if(i(t),a(t),n.length>0){const e=Math.min(...n.map(e=>e.x)),t=Math.min(...n.map(e=>e.y)),i=50,r=-e+i,a=-t+i;n.forEach(e=>{e.x+=r,e.y+=a}),o.forEach(e=>{e.vertices.forEach(e=>{e.x+=r,e.y+=a}),e.label&&(e.label.x+=r,e.label.y+=a)})}return{nodes:n,edges:o}}catch(t){return console.warn("ELK layout failed, using fallback layout. Error:",t),function(e){const t=[],n=[];let o=0,i=0;const r=Math.ceil(Math.sqrt(e.nodesMap.size));let a=0;return e.nodesMap.forEach(e=>{t.push({id:e.id,x:o,y:i}),a++,a>=r?(a=0,o=0,i+=300):o+=300}),e.edges.forEach(e=>{n.push({id:e.id,vertices:[]})}),{nodes:t,edges:n}}(e)}}function a(e){return"nodes"in e}},245(e,t,n){var o=n(122),i=n(763),r=n(486),a=n(582),s=n.n(a),l=n(991),d=n.n(l),c=n(725),h=n.n(c),u=n(798),g=n.n(u),A=n(754),p=n.n(A),m=n(567),f=n.n(m),y=n(870),b={};b.styleTagTransform=f(),b.setAttributes=g(),b.insert=h().bind(null,"head"),b.domAPI=d(),b.insertStyleElement=p(),s()(y.A,b),y.A&&y.A.locals&&y.A.locals,n(769);class x{callback;handler;running=!1;timeoutId=null;constructor(e){this.callback=e,this.handler=()=>{this.running=!1,this.timeoutId=null,this.callback()}}start(e){this.running&&this.stop(),this.timeoutId=setTimeout(this.handler,e),this.running=!0}stop(){this.running&&null!==this.timeoutId&&(clearTimeout(this.timeoutId),this.running=!1,this.timeoutId=null)}isRunning(){return this.running}}class w{static DEFAULT_OPTIONS={minDelay:1e3,maxDelay:6e4,handshakeTimeout:5e3};static LIVERELOAD_PROTOCOLS=["http://livereload.com/protocols/official-9","http://livereload.com/protocols/2.x-remote-control"];uri;options;fileChangeHandler;socket=null;nextDelay;connectionDesired=!1;disconnectionReason="";handshakeTimeout;reconnectTimer;constructor(e,t){this.fileChangeHandler=e,this.options={...w.DEFAULT_OPTIONS,...t},this.uri="ws://localhost:35729/livereload",this.nextDelay=this.options.minDelay,this.handshakeTimeout=new x(()=>this.handleHandshakeTimeout()),this.reconnectTimer=new x(()=>this.attemptReconnection())}connect(){this.connectionDesired=!0,this.isSocketConnected()||(this.prepareForConnection(),this.createWebSocket())}disconnect(){this.connectionDesired=!1,this.reconnectTimer.stop(),this.isSocketConnected()&&(this.disconnectionReason="manual",this.socket.close())}isSocketConnected(){return null!==this.socket&&this.socket.readyState===WebSocket.OPEN}prepareForConnection(){this.reconnectTimer.stop(),this.disconnectionReason="cannot-connect"}createWebSocket(){this.socket=new WebSocket(this.uri),this.socket.onopen=()=>this.handleOpen(),this.socket.onclose=()=>this.handleClose(),this.socket.onmessage=e=>this.handleMessage(e),this.socket.onerror=()=>this.handleError()}handleOpen(){this.disconnectionReason="handshake-failed",this.startHandshake()}handleClose(){console.log(`WebSocket disconnected: ${this.disconnectionReason}. Retry in ${this.nextDelay}ms`),this.scheduleReconnection()}handleMessage(e){try{const t=JSON.parse(e.data);this.processMessage(t)}catch(e){console.error("Failed to parse WebSocket message:",e)}}handleError(){}processMessage(e){switch(e.command){case"hello":this.handleHelloMessage();break;case"reload":this.handleReloadMessage(e);break;default:console.log("Unknown WebSocket message received:",e)}}handleHelloMessage(){this.handshakeTimeout.stop(),this.nextDelay=this.options.minDelay}handleReloadMessage(e){this.reconnectTimer.stop(),this.connect(),e.path&&this.fileChangeHandler(e.path)}startHandshake(){const e={command:"hello",protocols:w.LIVERELOAD_PROTOCOLS,ver:"3.3.1"};this.sendCommand(e),this.handshakeTimeout.start(this.options.handshakeTimeout)}handleHandshakeTimeout(){this.isSocketConnected()&&(this.disconnectionReason="handshake-timeout",this.socket.close())}attemptReconnection(){this.connectionDesired&&this.connect()}scheduleReconnection(){this.connectionDesired&&(this.reconnectTimer.isRunning()||(this.reconnectTimer.start(this.nextDelay),this.nextDelay=Math.min(this.options.maxDelay,2*this.nextDelay)))}sendCommand(e){this.isSocketConnected()&&this.socket.send(JSON.stringify(e))}}var v=n(987);const C=(0,i.lazy)(()=>Promise.resolve().then(n.bind(n,486)).then(e=>({default:e.Root}))),k=()=>{const[e,t]=(0,i.useState)({data:null,error:null,loading:!0}),n=async()=>{t(e=>({...e,loading:!0,error:null}));try{const[e,n]=await Promise.all([fetch("data/model.json"),fetch("data/layout.json")]);if(!e.ok)throw new Error(`Failed to fetch model: ${e.statusText}`);if(!n.ok)throw new Error(`Failed to fetch layout: ${n.statusText}`);const[o,i]=await Promise.all([e.json(),n.json()]);t({data:{model:o,layout:i},error:null,loading:!1})}catch(e){console.error("Failed to load data:",e),t({data:null,error:e instanceof Error?e.message:"Unknown error occurred",loading:!1})}},o=e=>{e.endsWith(".svg")||(console.log("File changed:",e),(0,r.S)(),n())};return(0,i.useEffect)(()=>{const e=new URLSearchParams(document.location.search),t=e.get("auto"),i=e.get("save"),r="1"===t||"true"===t||"1"===i||"true"===i?null:new w(o);return r?.connect(),n(),()=>{r?.disconnect()}},[]),e.loading?(0,v.jsx)(I,{}):e.error?(0,v.jsx)(B,{error:e.error,onRetry:n}):e.data?(0,v.jsx)(i.Suspense,{fallback:(0,v.jsx)(I,{}),children:(0,v.jsx)(C,{model:e.data.model,layout:e.data.layout})}):(0,v.jsx)(B,{error:"No data available",onRetry:n})},I=()=>(0,v.jsx)("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh",fontFamily:"Arial, sans-serif"},children:(0,v.jsx)("div",{children:"Loading..."})}),B=({error:e,onRetry:t})=>(0,v.jsxs)("div",{style:{padding:"20px",color:"red",fontFamily:"monospace",whiteSpace:"pre-wrap",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",height:"100vh"},children:[(0,v.jsx)("h2",{children:"Error loading application"}),(0,v.jsx)("p",{children:e}),(0,v.jsx)("button",{onClick:t,style:{padding:"10px 20px",fontSize:"16px",cursor:"pointer",backgroundColor:"#007bff",color:"white",border:"none",borderRadius:"4px"},children:"Retry"})]}),E=document.getElementById("root");if(!E)throw new Error("Root container not found");(0,o.createRoot)(E).render((0,v.jsx)(k,{}))},264(e,t,n){n(763);var o=n(686),i=n(987);const r="add-vertex",a="add-label-vertex",s="del-vertex",l="zoom-in",d="zoom-out",c="zoom-fit",h="zoom-100",u="select-all",g="deselect",A="move-left",p="move-right",m="move-up",f="move-down",y="move-left-fine",b="move-right-fine",x="move-up-fine",w="move-down-fine",v="toggle_drag_mode",C="align_horizontal",k="align_vertical",I="distribute_horizontal",B="distribute_vertical",E="auto_layout",S="reset_position",M="toggle_grid",$="toggle_snap_to_grid",D="snap_all_to_grid",j=[{name:"Help",list:[{id:"help",help:"Show/hide this help",combinations:[{key:"?",shift:!0},{key:"F1",shift:!0}]}]},{name:"File",list:[{id:"save",help:"Save",combinations:[{key:"s",ctrl:!0}]}]},{name:"History",list:[{id:"undo",help:"Undo",combinations:[{ctrl:!0,key:"z"}]},{id:"redo",help:"Redo",combinations:[{ctrl:!0,shift:!0,key:"z"},{ctrl:!0,key:"y"}]}]},{name:"Relationship editing",list:[{id:r,help:"Add relationship vertex",combinations:[{alt:!0,click:!0}]},{id:a,help:"Add label anchor relationship vertex",combinations:[{alt:!0,shift:!0,click:!0}]},{id:s,help:"Remove relationship vertex",combinations:[{key:"DELETE"},{key:"BACKSPACE"}]}]},{name:"Zoom",list:[{id:l,help:"Zoom in",combinations:[{ctrl:!0,key:"="}]},{id:d,help:"Zoom out",combinations:[{ctrl:!0,key:"-"}]},{id:c,help:"Zoom - fit",combinations:[{ctrl:!0,key:"9"}]},{id:h,help:"Zoom 100%",combinations:[{ctrl:!0,key:"0"}]},{id:"wheel_zoom",help:"Zoom in/out with mouse wheel",combinations:[{wheel:!0}]}]},{name:"Mouse Interactions",list:[{id:"pan-view",help:"Pan view (drag empty space)",combinations:[{click:!0}]},{id:"select-element",help:"Select element",combinations:[{click:!0}]},{id:"multi-select",help:"Add/remove from selection",combinations:[{shift:!0,click:!0}]},{id:"box-select",help:"Box selection (drag empty space)",combinations:[{shift:!0,click:!0}]},{id:"move-elements",help:"Move selected elements",combinations:[{click:!0}]}]},{name:"Select",list:[{id:u,help:"Select All",combinations:[{ctrl:!0,key:"a"}]},{id:g,help:"Deselect",combinations:[{key:"ESC"}]}]},{name:"Move",list:[{id:m,help:"Move up (grid increment)",combinations:[{key:"UP"}]},{id:x,help:"Move up (1 pixel)",combinations:[{key:"UP",shift:!0}]},{id:p,help:"Move right (grid increment)",combinations:[{key:"RIGHT"}]},{id:b,help:"Move right (1 pixel)",combinations:[{key:"RIGHT",shift:!0}]},{id:f,help:"Move down (grid increment)",combinations:[{key:"DOWN"}]},{id:w,help:"Move down (1 pixel)",combinations:[{key:"DOWN",shift:!0}]},{id:A,help:"Move left (grid increment)",combinations:[{key:"LEFT"}]},{id:y,help:"Move left (1 pixel)",combinations:[{key:"LEFT",shift:!0}]}]},{name:"View",list:[{id:v,help:"Toggle between pan and select mode",combinations:[{key:"t"}]},{id:S,help:"Reset position and view",combinations:[{key:"Home",ctrl:!0}]}]},{name:"Alignment",list:[{id:C,help:"Align selected elements horizontally",combinations:[{key:"h",ctrl:!0,shift:!0}]},{id:k,help:"Align selected elements vertically",combinations:[{key:"a",ctrl:!0,shift:!0}]},{id:I,help:"Distribute selected elements horizontally",combinations:[{key:"h",ctrl:!0,alt:!0}]},{id:B,help:"Distribute selected elements vertically",combinations:[{key:"v",ctrl:!0,alt:!0}]}]},{name:"Layout",list:[{id:E,help:"Auto layout all elements",combinations:[{key:"l",ctrl:!0}]}]},{name:"Grid",list:[{id:M,help:"Toggle grid visibility",combinations:[{key:"g",ctrl:!0}]},{id:$,help:"Toggle snap to grid",combinations:[{key:"g",ctrl:!0,shift:!0}]},{id:D,help:"Snap all elements to grid",combinations:[{key:"g",ctrl:!0,alt:!0}]}]}],L=j.reduce((e,t)=>e.concat(t.list),[]).reduce((e,t)=>(e[t.id]=t,e),{}),T=e=>[e.ctrl&&(0,o.sy)().toUpperCase(),e.shift&&"SHIFT",e.alt&&"ALT",e.key&&(e.key.length>1?e.key:`"${e.key.toUpperCase()}"`),e.click&&"CLICK",e.wheel&&"WHEEL"].filter(Boolean).join(" + ");n.d(t,["DE",0,I,"F",0,u,"Gg",0,A,"Gn",0,g,"Hd",0,E,"Help",0,()=>(0,i.jsxs)("div",{className:"popover",children:[(0,i.jsx)("h1",{children:"Shortcuts"}),(0,i.jsx)("table",{children:(0,i.jsx)("tbody",{children:j.map(e=>(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)("tr",{children:(0,i.jsx)("th",{colSpan:2,children:e.name})}),e.list.map(e=>(0,i.jsxs)("tr",{children:[(0,i.jsx)("td",{children:e.combinations.map(T).join(", ")}),(0,i.jsx)("td",{children:e.help})]}))]}))})})]}),"J8",0,y,"Jk",0,k,"OE",0,D,"Op",0,M,"Ur",0,l,"Vy",0,B,"Yp",0,(e,t=!1,n=!1)=>{const i=Object.keys(L).filter(i=>((e,t,n,i)=>t.combinations.some(t=>{if(Boolean(t.shift)!=e.shiftKey)return!1;if(t.ctrl&&!(0,o.SA)(e))return!1;if(Boolean(t.alt)!=e.altKey)return!1;if(n)return t.click;if(i)return t.wheel;if(t.key){const n=e;return"DELETE"==t.key?"Delete"==n.key:"BACKSPACE"==t.key?"Backspace"==n.key:"ESC"==t.key?"Escape"==n.key:"UP"==t.key?"ArrowUp"==n.key:"DOWN"==t.key?"ArrowDown"==n.key:"LEFT"==t.key?"ArrowLeft"==n.key:"RIGHT"==t.key?"ArrowRight"==n.key:t.key&&n.key&&t.key.toLowerCase()==n.key.toLowerCase()}return!1}))(e,L[i],t,n));if(0!==i.length)return 1===i.length?i[0]:i.sort((e,t)=>{const n=L[e],o=L[t],i=n.combinations[0],r=o.combinations[0],a=(i.shift?1:0)+(i.ctrl?1:0)+(i.alt?1:0);return(r.shift?1:0)+(r.ctrl?1:0)+(r.alt?1:0)-a})[0]},"Zj",0,r,"_s",0,a,"_t",0,S,"aX",0,v,"b3",0,p,"bl",0,s,"hU",0,d,"hZ",0,$,"i1",0,h,"iD",0,b,"l8",0,x,"mD",0,c,"mt",0,w,"rB",0,f,"t9",0,C,"uK",0,m])},686(e,t,n){const o=()=>{if("undefined"==typeof navigator)return!1;if("userAgentData"in navigator&&navigator.userAgentData){const e=navigator.userAgentData.platform;if(e&&e.toLowerCase().includes("mac"))return!0}const e=navigator.userAgent.toLowerCase();if(e.includes("mac os")||e.includes("macintosh"))return!0;if(navigator.platform){const e=navigator.platform.toLowerCase();if(e.includes("mac")||e.includes("darwin"))return!0}try{if(void 0!==new KeyboardEvent("keydown",{metaKey:!0}).metaKey)return/mac|darwin|os x/i.test(navigator.userAgent)}catch(e){}return!1};n.d(t,["SA",0,e=>o()?e.metaKey:e.ctrlKey,"sy",0,()=>o()?"Cmd":"Ctrl"])},870(e,t,n){var o=n(220),i=n.n(o),r=n(716),a=n.n(r)()(i());a.push([e.id,"html, body, #root {\n height: 100%;\n}\n\nbody {\n font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n color: #666;\n margin: 0;\n}\n\n#root {\n display: flex;\n flex-direction: column;\n}\n#root > div.graph {\n flex: 1;\n overflow: auto;\n position: relative;\n}\n\n.toolbar {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 4px 10px;\n background-color: #f0f0f0;\n border-bottom: 1px solid #cccccc;\n}\n\n.toolbar > div {\n display: flex;\n align-items: center;\n}\n\n.toolbar button {\n padding: 5px 8px;\n margin: 0 2px;\n cursor: pointer;\n}\n\n.toolbar button:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* Drag mode toggle button styles */\n.toolbar button.mode-toggle {\n position: relative;\n border: 1px solid #8f9fc9;\n width: 40px;\n min-height: 28px;\n background: linear-gradient(to bottom, #abb8db, #8f9fc9);\n border-color: #8f9fc9;\n color: white;\n box-shadow: 2px 2px 2px rgba(0, 0, 0, .2);\n}\n\n.toolbar button.mode-toggle:hover {\n background: linear-gradient(to bottom, #bcc7e0, #abb8db);\n border-color: #abb8db;\n}\n\n.toolbar button.mode-toggle.select-mode:active {\n background: linear-gradient(to bottom, #8f9fc9, #7a8bb5);\n}\n\n/* Pan mode and active toggle - darker blue */\n.toolbar button.mode-toggle.pan-mode,\n.toolbar button.active-toggle {\n background: linear-gradient(to bottom, #4a90e2, #357abd);\n border-color: #2968a3;\n box-shadow: inset 0 1px 2px rgba(0,0,0,0.2);\n}\n\n.toolbar button.mode-toggle.pan-mode:hover,\n.toolbar button.active-toggle:hover {\n background: linear-gradient(to bottom, #5ba0f2, #4585c7);\n}\n\n.toolbar button.mode-toggle.pan-mode:active {\n background: linear-gradient(to bottom, #357abd, #2968a3);\n box-shadow: inset 0 1px 2px rgba(0,0,0,0.2);\n}\n\n/* Toggle buttons when inactive - gray styling */\n.toolbar button.inactive-toggle {\n background: #c1c1c1;\n color: #999;\n border-color: #c1c1c1;\n box-shadow: none;\n}\n\n.toolbar button.inactive-toggle:hover {\n background: #b1b1b1;\n}\n\n.toolbar button.inactive-toggle:active {\n background: #a1a1a1;\n}\n\n/* Toggle buttons when disabled and not active - gray like other disabled buttons */\n.toolbar button.mode-toggle:disabled:not(.pan-mode):not(.active-toggle),\n.toolbar button.active-toggle:disabled:not(.active-toggle) {\n background: #c1c1c1;\n color: #999;\n border-color: #c1c1c1;\n box-shadow: none;\n}\n\n/* Ensure Font Awesome icons are sized appropriately if not already handled */\n.toolbar button .fas {\n font-size: 1em;\n vertical-align: middle;\n}\n\n/* Zoom percentage display */\n.toolbar button.zoom-display {\n font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;\n font-size: 11px;\n font-weight: 600;\n font-variant-numeric: tabular-nums;\n min-width: 50px; /* Wider to prevent size change between 99% and 100% */\n padding: 6px 8px;\n text-align: center;\n}\n\n.toolbar-group {\n display: flex;\n align-items: center;\n margin-right: 25px; /* Large space between groups */\n}\n\n.toolbar-group:last-child {\n margin-right: 0; /* Remove right margin from the last group (help button) */\n}\n\nbutton {\n border: none;\n background: linear-gradient(to bottom, #4a90e2, #357abd);\n border-color: #2968a3;\n border-radius: 3px;\n padding: 6px 10px;\n color: #fff;\n outline: none;\n box-shadow: 2px 2px 2px rgba(0, 0, 0, .2);\n margin-right: 5px;\n min-width: 32px;\n min-height: 28px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: 14px;\n line-height: 1;\n font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n position: relative;\n}\n\nbutton:hover {\n background: linear-gradient(to bottom, #5ba0f2, #4585c7);\n}\n\nbutton:active {\n background: linear-gradient(to bottom, #357abd, #2968a3);\n}\n\nbutton:last-child {\n margin-right: 0;\n}\n\n/* Save button when no changes - gray */\nbutton.action {\n background: #c1c1c1;\n color: #999;\n}\n\nbutton.action:active {\n background: #b1b1b1;\n}\n\n/* Save button when there are changes - orange */\nbutton.grp {\n background: linear-gradient(to bottom, #ee9564, #de7d48);\n margin-right: 0;\n}\n\nbutton.grp:active {\n background: #d67540;\n}\n\n/* Auto-arrange button with AI purple to blue gradient */\nbutton.auto-arrange {\n background: linear-gradient(135deg, #6A4C93, #4a90e2);\n border-color: #4a4c93;\n}\n\nbutton.auto-arrange:hover {\n background: linear-gradient(135deg, #7B5DAD, #5ba0f2);\n border-color: #5a5ca3;\n}\n\nbutton.auto-arrange:active {\n background: linear-gradient(135deg, #593B83, #357abd);\n border-color: #3a3c83;\n}\n\nselect {\n border: 1px solid #ccc;\n background: white;\n border-radius: 3px;\n padding: 3px 7px;\n color: #666;\n outline: none;\n margin-right: 5px;\n font-size: 12px;\n}\n\nselect:disabled {\n background: #f5f5f5;\n color: #999;\n}\n\nbutton:disabled {\n background: #c1c1c1;\n color: #999;\n}\n\n#root > div > svg {\n position: absolute;\n user-select: none;\n}\n\n\n.node.selected .nodeBorder, .edge.selected path, .edge.selected rect {\n stroke: #29c229;\n}\n.edge .v-dot {\n fill: transparent;\n stroke: transparent;\n stroke-width: 3px;\n cursor: pointer;\n transition: stroke 0.15s ease;\n}\n.edge .v-dot:hover {\n stroke: #999;\n fill: rgba(153, 153, 153, 0.1);\n}\n.edge .v-dot.selected {\n stroke: #29c229;\n fill: rgba(41, 194, 41, 0.1);\n}\n.edge .v-dot.selected:hover {\n stroke: #29c229;\n fill: rgba(41, 194, 41, 0.2);\n}\n.edge .v-dot.auto.selected {\n stroke: #777;\n fill: rgba(119, 119, 119, 0.1);\n}\n.edge .v-dot.auto.selected:hover {\n stroke: #777;\n fill: rgba(119, 119, 119, 0.2);\n}\ncircle#prj {\n fill: none;\n stroke: #777;\n}\n\n.nodeShadow {\n fill: none;\n stroke-width: 4px;\n stroke: rgba(0, 0, 0, 0.13);\n}\n\ng.node {\n user-select: none;\n cursor: default;\n}\n\ng.node.linked {\n cursor: pointer;\n}\n\ng.node text {\n pointer-events: none;\n}\n\n.icon {\n fill: #aaa;\n stroke: #fff;\n}\n#icon-cube {\n fill: #aaa;\n}\n\n/* Ensure all button icons are uncolored */\nbutton .icon,\nbutton svg,\nbutton path {\n fill: currentColor !important;\n stroke: none !important;\n}\n\n/* Font Awesome icon styling in buttons */\nbutton i {\n font-size: 12px;\n color: inherit;\n}\n\nrect.elastic {\n pointer-events: none;\n stroke: none;\n fill: #3bd8281f;\n display: none;\n}\nrect.elastic.on {\n display: block;\n}\n\n.popover {\n position: absolute;\n top: 50px;\n bottom: 10px;\n overflow: auto;\n right: 10px;\n background: ghostwhite;\n padding: 30px;\n box-shadow: 3px 3px 5px rgba(0,0,0, .2);\n border: solid 1px #eee;\n}\n\n.popover th {\n text-align: left;\n padding: 20px 0px 10px;\n}\n.popover td {\n padding-right: 20px;\n font-size: 14px;\n}\n\n/* Simple tooltip system with smart positioning */\n[data-tooltip] {\n position: relative;\n}\n\n[data-tooltip]:hover::after {\n content: attr(data-tooltip);\n position: absolute;\n top: 100%;\n left: 50%;\n transform: translateX(-50%);\n background: rgba(0, 0, 0, 0.9);\n color: white;\n padding: 6px 12px;\n border-radius: 4px;\n font-size: 12px !important;\n font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif !important;\n font-weight: normal !important;\n white-space: nowrap;\n z-index: 1000;\n pointer-events: none;\n margin-top: 5px;\n animation: tooltip-appear 0.1s ease-out;\n min-width: 120px;\n max-width: calc(100vw - 20px);\n box-sizing: border-box;\n}\n\n[data-tooltip]:hover::before {\n content: '';\n position: absolute;\n top: 100%;\n left: 50%;\n transform: translateX(-50%);\n border: 4px solid transparent;\n border-bottom-color: rgba(0, 0, 0, 0.9);\n z-index: 1000;\n pointer-events: none;\n margin-top: 1px;\n animation: tooltip-appear 0.1s ease-out;\n}\n\n/* Special handling for rightmost elements that might overflow */\n.toolbar-group:nth-last-child(-n+2) button[data-tooltip]:hover::after {\n /* Apply to last 2 toolbar groups (save and help buttons) */\n left: auto;\n right: 0;\n transform: none;\n}\n\n.toolbar-group:nth-last-child(-n+2) button[data-tooltip]:hover::before {\n /* Apply to last 2 toolbar groups (save and help buttons) */\n left: auto;\n right: 16px;\n transform: none;\n}\n\n@keyframes tooltip-appear {\n from {\n opacity: 0;\n transform: translateX(-50%) translateY(-5px);\n }\n to {\n opacity: 1;\n transform: translateX(-50%) translateY(0);\n }\n}\n\nselect {\n position: relative;\n}\n\n/* Robot shape internal elements - inherit stroke from parent node */\n.node .robot-eye-socket {\n fill: none;\n stroke: inherit;\n stroke-width: 2;\n}\n\n.node .robot-eye {\n fill: currentColor;\n stroke: none;\n}\n\n.node .robot-mouth {\n stroke: inherit;\n}\n\n.node .robot-antenna {\n stroke: inherit;\n}\n\n.node .robot-antenna-ball {\n fill: currentColor;\n stroke: inherit;\n stroke-width: 1.5;\n}\n\n.node .robot-panel {\n stroke: inherit;\n}\n\n.node .robot-indicator {\n fill: currentColor;\n stroke: none;\n}","",{version:3,sources:["webpack://./src/style.css"],names:[],mappings:"AAAA;IACI,YAAY;AAChB;;AAEA;IACI,uFAAuF;IACvF,WAAW;IACX,SAAS;AACb;;AAEA;IACI,aAAa;IACb,sBAAsB;AAC1B;AACA;IACI,OAAO;IACP,cAAc;IACd,kBAAkB;AACtB;;AAEA;IACI,aAAa;IACb,8BAA8B;IAC9B,mBAAmB;IACnB,iBAAiB;IACjB,yBAAyB;IACzB,gCAAgC;AACpC;;AAEA;IACI,aAAa;IACb,mBAAmB;AACvB;;AAEA;IACI,gBAAgB;IAChB,aAAa;IACb,eAAe;AACnB;;AAEA;IACI,YAAY;IACZ,mBAAmB;AACvB;;AAEA,mCAAmC;AACnC;IACI,kBAAkB;IAClB,yBAAyB;IACzB,WAAW;IACX,gBAAgB;IAChB,wDAAwD;IACxD,qBAAqB;IACrB,YAAY;IACZ,yCAAyC;AAC7C;;AAEA;IACI,wDAAwD;IACxD,qBAAqB;AACzB;;AAEA;IACI,wDAAwD;AAC5D;;AAEA,6CAA6C;AAC7C;;IAEI,wDAAwD;IACxD,qBAAqB;IACrB,2CAA2C;AAC/C;;AAEA;;IAEI,wDAAwD;AAC5D;;AAEA;IACI,wDAAwD;IACxD,2CAA2C;AAC/C;;AAEA,gDAAgD;AAChD;IACI,mBAAmB;IACnB,WAAW;IACX,qBAAqB;IACrB,gBAAgB;AACpB;;AAEA;IACI,mBAAmB;AACvB;;AAEA;IACI,mBAAmB;AACvB;;AAEA,mFAAmF;AACnF;;IAEI,mBAAmB;IACnB,WAAW;IACX,qBAAqB;IACrB,gBAAgB;AACpB;;AAEA,6EAA6E;AAC7E;IACI,cAAc;IACd,sBAAsB;AAC1B;;AAEA,4BAA4B;AAC5B;IACI,mEAAmE;IACnE,eAAe;IACf,gBAAgB;IAChB,kCAAkC;IAClC,eAAe,GAAG,sDAAsD;IACxE,gBAAgB;IAChB,kBAAkB;AACtB;;AAEA;IACI,aAAa;IACb,mBAAmB;IACnB,kBAAkB,EAAE,+BAA+B;AACvD;;AAEA;IACI,eAAe,EAAE,0DAA0D;AAC/E;;AAEA;IACI,YAAY;IACZ,wDAAwD;IACxD,qBAAqB;IACrB,kBAAkB;IAClB,iBAAiB;IACjB,WAAW;IACX,aAAa;IACb,yCAAyC;IACzC,iBAAiB;IACjB,eAAe;IACf,gBAAgB;IAChB,oBAAoB;IACpB,mBAAmB;IACnB,uBAAuB;IACvB,eAAe;IACf,cAAc;IACd,uFAAuF;IACvF,kBAAkB;AACtB;;AAEA;IACI,wDAAwD;AAC5D;;AAEA;IACI,wDAAwD;AAC5D;;AAEA;IACI,eAAe;AACnB;;AAEA,uCAAuC;AACvC;IACI,mBAAmB;IACnB,WAAW;AACf;;AAEA;IACI,mBAAmB;AACvB;;AAEA,gDAAgD;AAChD;IACI,wDAAwD;IACxD,eAAe;AACnB;;AAEA;IACI,mBAAmB;AACvB;;AAEA,wDAAwD;AACxD;IACI,qDAAqD;IACrD,qBAAqB;AACzB;;AAEA;IACI,qDAAqD;IACrD,qBAAqB;AACzB;;AAEA;IACI,qDAAqD;IACrD,qBAAqB;AACzB;;AAEA;IACI,sBAAsB;IACtB,iBAAiB;IACjB,kBAAkB;IAClB,gBAAgB;IAChB,WAAW;IACX,aAAa;IACb,iBAAiB;IACjB,eAAe;AACnB;;AAEA;IACI,mBAAmB;IACnB,WAAW;AACf;;AAEA;IACI,mBAAmB;IACnB,WAAW;AACf;;AAEA;IACI,kBAAkB;IAClB,iBAAiB;AACrB;;;AAGA;IACI,eAAe;AACnB;AACA;IACI,iBAAiB;IACjB,mBAAmB;IACnB,iBAAiB;IACjB,eAAe;IACf,6BAA6B;AACjC;AACA;IACI,YAAY;IACZ,8BAA8B;AAClC;AACA;IACI,eAAe;IACf,4BAA4B;AAChC;AACA;IACI,eAAe;IACf,4BAA4B;AAChC;AACA;IACI,YAAY;IACZ,8BAA8B;AAClC;AACA;IACI,YAAY;IACZ,8BAA8B;AAClC;AACA;IACI,UAAU;IACV,YAAY;AAChB;;AAEA;IACI,UAAU;IACV,iBAAiB;IACjB,2BAA2B;AAC/B;;AAEA;IACI,iBAAiB;IACjB,eAAe;AACnB;;AAEA;IACI,eAAe;AACnB;;AAEA;IACI,oBAAoB;AACxB;;AAEA;IACI,UAAU;IACV,YAAY;AAChB;AACA;IACI,UAAU;AACd;;AAEA,0CAA0C;AAC1C;;;IAGI,6BAA6B;IAC7B,uBAAuB;AAC3B;;AAEA,yCAAyC;AACzC;IACI,eAAe;IACf,cAAc;AAClB;;AAEA;IACI,oBAAoB;IACpB,YAAY;IACZ,eAAe;IACf,aAAa;AACjB;AACA;IACI,cAAc;AAClB;;AAEA;IACI,kBAAkB;IAClB,SAAS;IACT,YAAY;IACZ,cAAc;IACd,WAAW;IACX,sBAAsB;IACtB,aAAa;IACb,uCAAuC;IACvC,sBAAsB;AAC1B;;AAEA;IACI,gBAAgB;IAChB,sBAAsB;AAC1B;AACA;IACI,mBAAmB;IACnB,eAAe;AACnB;;AAEA,iDAAiD;AACjD;IACI,kBAAkB;AACtB;;AAEA;IACI,2BAA2B;IAC3B,kBAAkB;IAClB,SAAS;IACT,SAAS;IACT,2BAA2B;IAC3B,8BAA8B;IAC9B,YAAY;IACZ,iBAAiB;IACjB,kBAAkB;IAClB,0BAA0B;IAC1B,8EAA8E;IAC9E,8BAA8B;IAC9B,mBAAmB;IACnB,aAAa;IACb,oBAAoB;IACpB,eAAe;IACf,uCAAuC;IACvC,gBAAgB;IAChB,6BAA6B;IAC7B,sBAAsB;AAC1B;;AAEA;IACI,WAAW;IACX,kBAAkB;IAClB,SAAS;IACT,SAAS;IACT,2BAA2B;IAC3B,6BAA6B;IAC7B,uCAAuC;IACvC,aAAa;IACb,oBAAoB;IACpB,eAAe;IACf,uCAAuC;AAC3C;;AAEA,gEAAgE;AAChE;IACI,2DAA2D;IAC3D,UAAU;IACV,QAAQ;IACR,eAAe;AACnB;;AAEA;IACI,2DAA2D;IAC3D,UAAU;IACV,WAAW;IACX,eAAe;AACnB;;AAEA;IACI;QACI,UAAU;QACV,4CAA4C;IAChD;IACA;QACI,UAAU;QACV,yCAAyC;IAC7C;AACJ;;AAEA;IACI,kBAAkB;AACtB;;AAEA,oEAAoE;AACpE;IACI,UAAU;IACV,eAAe;IACf,eAAe;AACnB;;AAEA;IACI,kBAAkB;IAClB,YAAY;AAChB;;AAEA;IACI,eAAe;AACnB;;AAEA;IACI,eAAe;AACnB;;AAEA;IACI,kBAAkB;IAClB,eAAe;IACf,iBAAiB;AACrB;;AAEA;IACI,eAAe;AACnB;;AAEA;IACI,kBAAkB;IAClB,YAAY;AAChB",sourcesContent:["html, body, #root {\n height: 100%;\n}\n\nbody {\n font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n color: #666;\n margin: 0;\n}\n\n#root {\n display: flex;\n flex-direction: column;\n}\n#root > div.graph {\n flex: 1;\n overflow: auto;\n position: relative;\n}\n\n.toolbar {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 4px 10px;\n background-color: #f0f0f0;\n border-bottom: 1px solid #cccccc;\n}\n\n.toolbar > div {\n display: flex;\n align-items: center;\n}\n\n.toolbar button {\n padding: 5px 8px;\n margin: 0 2px;\n cursor: pointer;\n}\n\n.toolbar button:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* Drag mode toggle button styles */\n.toolbar button.mode-toggle {\n position: relative;\n border: 1px solid #8f9fc9;\n width: 40px;\n min-height: 28px;\n background: linear-gradient(to bottom, #abb8db, #8f9fc9);\n border-color: #8f9fc9;\n color: white;\n box-shadow: 2px 2px 2px rgba(0, 0, 0, .2);\n}\n\n.toolbar button.mode-toggle:hover {\n background: linear-gradient(to bottom, #bcc7e0, #abb8db);\n border-color: #abb8db;\n}\n\n.toolbar button.mode-toggle.select-mode:active {\n background: linear-gradient(to bottom, #8f9fc9, #7a8bb5);\n}\n\n/* Pan mode and active toggle - darker blue */\n.toolbar button.mode-toggle.pan-mode,\n.toolbar button.active-toggle {\n background: linear-gradient(to bottom, #4a90e2, #357abd);\n border-color: #2968a3;\n box-shadow: inset 0 1px 2px rgba(0,0,0,0.2);\n}\n\n.toolbar button.mode-toggle.pan-mode:hover,\n.toolbar button.active-toggle:hover {\n background: linear-gradient(to bottom, #5ba0f2, #4585c7);\n}\n\n.toolbar button.mode-toggle.pan-mode:active {\n background: linear-gradient(to bottom, #357abd, #2968a3);\n box-shadow: inset 0 1px 2px rgba(0,0,0,0.2);\n}\n\n/* Toggle buttons when inactive - gray styling */\n.toolbar button.inactive-toggle {\n background: #c1c1c1;\n color: #999;\n border-color: #c1c1c1;\n box-shadow: none;\n}\n\n.toolbar button.inactive-toggle:hover {\n background: #b1b1b1;\n}\n\n.toolbar button.inactive-toggle:active {\n background: #a1a1a1;\n}\n\n/* Toggle buttons when disabled and not active - gray like other disabled buttons */\n.toolbar button.mode-toggle:disabled:not(.pan-mode):not(.active-toggle),\n.toolbar button.active-toggle:disabled:not(.active-toggle) {\n background: #c1c1c1;\n color: #999;\n border-color: #c1c1c1;\n box-shadow: none;\n}\n\n/* Ensure Font Awesome icons are sized appropriately if not already handled */\n.toolbar button .fas {\n font-size: 1em;\n vertical-align: middle;\n}\n\n/* Zoom percentage display */\n.toolbar button.zoom-display {\n font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;\n font-size: 11px;\n font-weight: 600;\n font-variant-numeric: tabular-nums;\n min-width: 50px; /* Wider to prevent size change between 99% and 100% */\n padding: 6px 8px;\n text-align: center;\n}\n\n.toolbar-group {\n display: flex;\n align-items: center;\n margin-right: 25px; /* Large space between groups */\n}\n\n.toolbar-group:last-child {\n margin-right: 0; /* Remove right margin from the last group (help button) */\n}\n\nbutton {\n border: none;\n background: linear-gradient(to bottom, #4a90e2, #357abd);\n border-color: #2968a3;\n border-radius: 3px;\n padding: 6px 10px;\n color: #fff;\n outline: none;\n box-shadow: 2px 2px 2px rgba(0, 0, 0, .2);\n margin-right: 5px;\n min-width: 32px;\n min-height: 28px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: 14px;\n line-height: 1;\n font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n position: relative;\n}\n\nbutton:hover {\n background: linear-gradient(to bottom, #5ba0f2, #4585c7);\n}\n\nbutton:active {\n background: linear-gradient(to bottom, #357abd, #2968a3);\n}\n\nbutton:last-child {\n margin-right: 0;\n}\n\n/* Save button when no changes - gray */\nbutton.action {\n background: #c1c1c1;\n color: #999;\n}\n\nbutton.action:active {\n background: #b1b1b1;\n}\n\n/* Save button when there are changes - orange */\nbutton.grp {\n background: linear-gradient(to bottom, #ee9564, #de7d48);\n margin-right: 0;\n}\n\nbutton.grp:active {\n background: #d67540;\n}\n\n/* Auto-arrange button with AI purple to blue gradient */\nbutton.auto-arrange {\n background: linear-gradient(135deg, #6A4C93, #4a90e2);\n border-color: #4a4c93;\n}\n\nbutton.auto-arrange:hover {\n background: linear-gradient(135deg, #7B5DAD, #5ba0f2);\n border-color: #5a5ca3;\n}\n\nbutton.auto-arrange:active {\n background: linear-gradient(135deg, #593B83, #357abd);\n border-color: #3a3c83;\n}\n\nselect {\n border: 1px solid #ccc;\n background: white;\n border-radius: 3px;\n padding: 3px 7px;\n color: #666;\n outline: none;\n margin-right: 5px;\n font-size: 12px;\n}\n\nselect:disabled {\n background: #f5f5f5;\n color: #999;\n}\n\nbutton:disabled {\n background: #c1c1c1;\n color: #999;\n}\n\n#root > div > svg {\n position: absolute;\n user-select: none;\n}\n\n\n.node.selected .nodeBorder, .edge.selected path, .edge.selected rect {\n stroke: #29c229;\n}\n.edge .v-dot {\n fill: transparent;\n stroke: transparent;\n stroke-width: 3px;\n cursor: pointer;\n transition: stroke 0.15s ease;\n}\n.edge .v-dot:hover {\n stroke: #999;\n fill: rgba(153, 153, 153, 0.1);\n}\n.edge .v-dot.selected {\n stroke: #29c229;\n fill: rgba(41, 194, 41, 0.1);\n}\n.edge .v-dot.selected:hover {\n stroke: #29c229;\n fill: rgba(41, 194, 41, 0.2);\n}\n.edge .v-dot.auto.selected {\n stroke: #777;\n fill: rgba(119, 119, 119, 0.1);\n}\n.edge .v-dot.auto.selected:hover {\n stroke: #777;\n fill: rgba(119, 119, 119, 0.2);\n}\ncircle#prj {\n fill: none;\n stroke: #777;\n}\n\n.nodeShadow {\n fill: none;\n stroke-width: 4px;\n stroke: rgba(0, 0, 0, 0.13);\n}\n\ng.node {\n user-select: none;\n cursor: default;\n}\n\ng.node.linked {\n cursor: pointer;\n}\n\ng.node text {\n pointer-events: none;\n}\n\n.icon {\n fill: #aaa;\n stroke: #fff;\n}\n#icon-cube {\n fill: #aaa;\n}\n\n/* Ensure all button icons are uncolored */\nbutton .icon,\nbutton svg,\nbutton path {\n fill: currentColor !important;\n stroke: none !important;\n}\n\n/* Font Awesome icon styling in buttons */\nbutton i {\n font-size: 12px;\n color: inherit;\n}\n\nrect.elastic {\n pointer-events: none;\n stroke: none;\n fill: #3bd8281f;\n display: none;\n}\nrect.elastic.on {\n display: block;\n}\n\n.popover {\n position: absolute;\n top: 50px;\n bottom: 10px;\n overflow: auto;\n right: 10px;\n background: ghostwhite;\n padding: 30px;\n box-shadow: 3px 3px 5px rgba(0,0,0, .2);\n border: solid 1px #eee;\n}\n\n.popover th {\n text-align: left;\n padding: 20px 0px 10px;\n}\n.popover td {\n padding-right: 20px;\n font-size: 14px;\n}\n\n/* Simple tooltip system with smart positioning */\n[data-tooltip] {\n position: relative;\n}\n\n[data-tooltip]:hover::after {\n content: attr(data-tooltip);\n position: absolute;\n top: 100%;\n left: 50%;\n transform: translateX(-50%);\n background: rgba(0, 0, 0, 0.9);\n color: white;\n padding: 6px 12px;\n border-radius: 4px;\n font-size: 12px !important;\n font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif !important;\n font-weight: normal !important;\n white-space: nowrap;\n z-index: 1000;\n pointer-events: none;\n margin-top: 5px;\n animation: tooltip-appear 0.1s ease-out;\n min-width: 120px;\n max-width: calc(100vw - 20px);\n box-sizing: border-box;\n}\n\n[data-tooltip]:hover::before {\n content: '';\n position: absolute;\n top: 100%;\n left: 50%;\n transform: translateX(-50%);\n border: 4px solid transparent;\n border-bottom-color: rgba(0, 0, 0, 0.9);\n z-index: 1000;\n pointer-events: none;\n margin-top: 1px;\n animation: tooltip-appear 0.1s ease-out;\n}\n\n/* Special handling for rightmost elements that might overflow */\n.toolbar-group:nth-last-child(-n+2) button[data-tooltip]:hover::after {\n /* Apply to last 2 toolbar groups (save and help buttons) */\n left: auto;\n right: 0;\n transform: none;\n}\n\n.toolbar-group:nth-last-child(-n+2) button[data-tooltip]:hover::before {\n /* Apply to last 2 toolbar groups (save and help buttons) */\n left: auto;\n right: 16px;\n transform: none;\n}\n\n@keyframes tooltip-appear {\n from {\n opacity: 0;\n transform: translateX(-50%) translateY(-5px);\n }\n to {\n opacity: 1;\n transform: translateX(-50%) translateY(0);\n }\n}\n\nselect {\n position: relative;\n}\n\n/* Robot shape internal elements - inherit stroke from parent node */\n.node .robot-eye-socket {\n fill: none;\n stroke: inherit;\n stroke-width: 2;\n}\n\n.node .robot-eye {\n fill: currentColor;\n stroke: none;\n}\n\n.node .robot-mouth {\n stroke: inherit;\n}\n\n.node .robot-antenna {\n stroke: inherit;\n}\n\n.node .robot-antenna-ball {\n fill: currentColor;\n stroke: inherit;\n stroke-width: 1.5;\n}\n\n.node .robot-panel {\n stroke: inherit;\n}\n\n.node .robot-indicator {\n fill: currentColor;\n stroke: none;\n}"],sourceRoot:""}]);const s=a;n.d(t,["A",0,s])}},e=>{e.O(0,[453,96],()=>e(e.s=245)),e.O()}]); +"use strict";(self.webpackChunkapp=self.webpackChunkapp||[]).push([[792],{522(e,t,a){a.d(t,{Root:()=>T,S:()=>D});var n=a(763),o=a(828),s=a(32),i=a(71),l=(a(983),a(264));const r={};function c(e){const t=e.replace(/([A-Z])/g," $1");return t.charAt(0).toUpperCase()+t.slice(1)}var d=a(686),h=a(987);const u=({model:e,currentID:t,onViewChange:a,graph:n,onAutoLayout:o,onSave:s,onToggleHelp:l,saving:r,layouting:c,dragMode:d,setDragMode:u})=>{const p=(0,i.B)(e);return(0,h.jsxs)("div",{className:"toolbar",children:[(0,h.jsx)(g,{views:p,currentID:t,onViewChange:a}),(0,h.jsx)(m,{graph:n,onAutoLayout:o,onSave:s,onToggleHelp:l,saving:r,layouting:c,dragMode:d,setDragMode:u})]})},g=({views:e,currentID:t,onViewChange:a})=>(0,h.jsxs)("div",{children:["View:",e.length>1?(0,h.jsxs)("select",{onChange:e=>a(e.target.value),value:t,children:[(0,h.jsx)("option",{disabled:!0,value:"",hidden:!0,children:"..."}),e.map(e=>(0,h.jsx)("option",{value:e.key,children:c(e.section)+": "+e.title},e.key))]}):(0,h.jsx)("span",{style:{marginLeft:"8px",fontWeight:"bold"},children:e[0]?c(e[0].section)+": "+e[0].title:"No views available"})]}),m=({graph:e,onAutoLayout:t,onSave:a,onToggleHelp:n,saving:o,layouting:s,dragMode:i,setDragMode:l})=>(0,h.jsxs)("div",{style:{display:"flex",alignItems:"center"},children:[(0,h.jsx)("div",{className:"toolbar-group",children:(0,h.jsx)(p,{dragMode:i,setDragMode:l})}),(0,h.jsx)("div",{className:"toolbar-group",children:(0,h.jsx)(f,{graph:e})}),(0,h.jsx)("div",{className:"toolbar-group",children:(0,h.jsx)(x,{graph:e})}),(0,h.jsx)("div",{className:"toolbar-group",children:(0,h.jsx)(j,{onAutoLayout:t,layouting:s})}),(0,h.jsx)("div",{className:"toolbar-group",children:(0,h.jsx)(y,{graph:e})}),(0,h.jsx)("div",{className:"toolbar-group",children:(0,h.jsx)(S,{graph:e})}),(0,h.jsx)("div",{className:"toolbar-group",children:(0,h.jsx)(k,{onSave:a,saving:o,graph:e})}),(0,h.jsx)("div",{className:"toolbar-group",children:(0,h.jsx)(b,{onToggleHelp:n})})]}),p=({dragMode:e,setDragMode:t})=>(0,h.jsx)("button",{className:"mode-toggle "+("select"===e?"select-mode":"pan-mode"),onClick:()=>t("pan"===e?"select":"pan"),"data-tooltip":"pan"===e?"Pan Mode: Drag to pan the view (T)":"Select Mode: Drag to select elements, Shift+click to add/remove selection (T)",children:"pan"===e?(0,h.jsx)("i",{className:"fas fa-hand-paper"}):(0,h.jsx)("i",{className:"fas fa-mouse-pointer"})}),f=({graph:e})=>{const t=(0,d.sy)();return(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("button",{onClick:()=>e.undo(),"data-tooltip":`Undo the last change made to the diagram (${t}+Z)`,children:(0,h.jsx)("i",{className:"fas fa-undo"})}),(0,h.jsx)("button",{onClick:()=>e.redo(),"data-tooltip":`Redo the last undone action (${t}+Shift+Z / ${t}+Y)`,children:(0,h.jsx)("i",{className:"fas fa-redo"})})]})},x=({graph:e})=>{const t=(0,d.sy)();return(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("button",{onClick:()=>e.alignSelectionH(),"data-tooltip":`Align all selected elements horizontally (left edges) (${t}+Shift+H)`,children:(0,h.jsx)("i",{className:"fas fa-align-left"})}),(0,h.jsx)("button",{onClick:()=>e.alignSelectionV(),"data-tooltip":`Align all selected elements vertically (top edges) (${t}+Shift+A)`,children:(0,h.jsx)("i",{className:"fas fa-align-left",style:{transform:"rotate(90deg)"}})}),(0,h.jsx)("button",{onClick:()=>e.distributeSelectionH(),"data-tooltip":`Distribute selected elements evenly horizontally (equal spacing) (${t}+Alt+H)`,children:(0,h.jsx)("i",{className:"fas fa-ellipsis-h"})}),(0,h.jsx)("button",{onClick:()=>e.distributeSelectionV(),"data-tooltip":`Distribute selected elements evenly vertically (equal spacing) (${t}+Alt+V)`,children:(0,h.jsx)("i",{className:"fas fa-ellipsis-v"})})]})},j=({onAutoLayout:e,layouting:t})=>{const a=(0,d.sy)();return(0,h.jsx)("button",{className:"auto-arrange",onClick:e,disabled:t,"data-tooltip":`Automatically arrange all elements using the Layered algorithm (${a}+L)`,children:t?(0,h.jsx)("i",{className:"fas fa-spinner fa-spin"}):(0,h.jsx)("i",{className:"fas fa-magic"})})},y=({graph:e})=>{const[t,a]=(0,n.useState)(e.isGridVisible()),[o,s]=(0,n.useState)(e.isSnapToGrid()),i=(0,d.sy)();return n.useEffect(()=>{const t=()=>{a(e.isGridVisible()),s(e.isSnapToGrid())};return t(),window.addEventListener("gridStateChanged",t),()=>{window.removeEventListener("gridStateChanged",t)}},[e]),(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("button",{className:t?"active-toggle":"inactive-toggle",onClick:()=>{e.toggleGrid(),a(e.isGridVisible())},"data-tooltip":`Toggle grid visibility (${i}+G)`,children:(0,h.jsx)("i",{className:"fas fa-th"})}),(0,h.jsx)("button",{className:o?"active-toggle":"inactive-toggle",onClick:()=>{e.toggleSnapToGrid(),s(e.isSnapToGrid())},"data-tooltip":`Toggle snap to grid (${i}+Shift+G)`,children:(0,h.jsx)("i",{className:"fas fa-magnet"})}),(0,h.jsx)("button",{onClick:()=>{e.snapAllToGrid()},disabled:!o,"data-tooltip":`Snap all elements to grid (${i}+Alt+G)`,children:(0,h.jsx)("i",{className:"fas fa-border-all"})})]})},v=()=>{const[e,t]=(0,n.useState)(100);return(0,n.useEffect)(()=>{const e=()=>{const e=Math.round(100*(0,o.IX)());t(e)};e();const a=setInterval(e,100);return()=>clearInterval(a)},[]),(0,h.jsxs)("button",{onClick:()=>(0,o.a_)(1),className:"zoom-display","data-tooltip":"Click to reset zoom to 100%",children:[e,"%"]})},S=({graph:e})=>{const t=(0,d.sy)();return(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("button",{onClick:()=>{(0,o.a_)(Math.max(.1,(0,o.IX)()/1.2))},"data-tooltip":`Zoom out to see more of the diagram (${t}+-)`,children:(0,h.jsx)("i",{className:"fas fa-search-minus"})}),(0,h.jsx)(v,{}),(0,h.jsx)("button",{onClick:()=>{(0,o.a_)(Math.min(5,1.2*(0,o.IX)()))},"data-tooltip":`Zoom in to see details more clearly (${t}+=)`,children:(0,h.jsx)("i",{className:"fas fa-search-plus"})}),(0,h.jsx)("button",{onClick:()=>{e.fitToView()},"data-tooltip":`Fit diagram to view (${t}+9)`,children:(0,h.jsx)("i",{className:"fas fa-expand"})})]})},k=({onSave:e,saving:t,graph:a})=>{const[o,s]=(0,n.useState)(!1),i=(0,d.sy)();return(0,n.useEffect)(()=>{const e=()=>{s(a.changed())};e();const t=setInterval(e,100);return()=>clearInterval(t)},[a]),(0,h.jsx)("button",{className:o?"grp":"action",disabled:t,onClick:e,"data-tooltip":`Save the current diagram layout (${i}+S)`,children:t?(0,h.jsx)("i",{className:"fas fa-spinner fa-spin"}):(0,h.jsx)("i",{className:"fas fa-save"})})},b=({onToggleHelp:e})=>(0,h.jsx)("button",{onClick:e,"data-tooltip":"Show keyboard shortcuts and help information (Shift+? / Shift+F1)",children:(0,h.jsx)("i",{className:"fas fa-question-circle"})}),C=(0,n.lazy)(()=>Promise.resolve().then(a.bind(a,264)).then(e=>({default:e.Help}))),w=(0,n.lazy)(()=>a.e(948).then(a.bind(a,948)).then(e=>({default:e.Graph}))),N=(e,t)=>{console.error(`${e} failed:`,t),alert(`${e} failed. See console for details.`)},T=({model:e,layout:t})=>(0,h.jsx)(s.Kd,{children:(0,h.jsx)(s.BV,{children:(0,h.jsx)(s.qh,{path:"/",element:(0,h.jsx)(R,{model:e,layouts:t})})})}),D=()=>{var e;(e=new URLSearchParams(document.location.search).get("id")||"")?delete r[e]:Object.keys(r).forEach(e=>delete r[e])},R=({model:e,layouts:t})=>{const[a,o]=(0,s.ok)(),c=decodeURI(a.get("id")||""),[d,g]=(0,n.useState)(!1),[m,p]=(0,n.useState)("pan"),f=((e,t,a)=>{if(r[a])return r[a];const n=(0,i.R)(e,t,a);return n&&(r[a]=n),n})(e,t,c),{layouting:x,handleAutoLayout:j}=(e=>{const[t,a]=(0,n.useState)(!1);return{layouting:t,handleAutoLayout:(0,n.useCallback)(async t=>{a(!0);try{const a={direction:e.layoutDirection||"DOWN",...t||{}};await e.autoLayout(a)}finally{a(!1)}},[e])}})(f||{}),{saving:y,handleSave:v}=((e,t)=>{const[a,o]=(0,n.useState)(!1);return{saving:a,handleSave:(0,n.useCallback)(async()=>{o(!0);try{const a=await fetch("data/save?id="+encodeURIComponent(t),{method:"post",body:e.exportSVG()});if(202!==a.status){const e=(await a.text()).trim();throw new Error(e||`save failed with HTTP ${a.status}`)}e.setSaved()}finally{o(!1)}},[e,t])}})(f||{},c);if(!f)return(0,h.jsx)(E,{model:e});const S=(0,n.useCallback)(()=>{g(!d)},[d]),k=(0,n.useCallback)(()=>{j().catch(e=>N("Layout",e))},[j]),b=(0,n.useCallback)(()=>{v().catch(e=>N("Save",e))},[v]);(0,n.useEffect)(()=>{f&&f.name&&(document.title=`${f.name} - Model`)},[f]),((e,t,a,o,s,i)=>{(0,n.useEffect)(()=>{const n=n=>{const r=(0,l.Yp)(n);r&&n.preventDefault(),"help"===r?e():"save"===r?t():r===l.aX&&s&&o?s("pan"===o?"select":"pan"):a&&(r===l.t9?a.alignSelectionH():r===l.Jk?a.alignSelectionV():r===l.DE?a.distributeSelectionH():r===l.Vy?a.distributeSelectionV():r===l.Hd&&i?i():r===l._t?a.resetView():r===l.Op?a.toggleGrid():r===l.hZ?a.toggleSnapToGrid():r===l.OE?a.snapAllToGrid():r===l.Gg?a.moveSelected(-a.getGridSize(),0):r===l.J8?a.moveSelected(-1,0,!0):r===l.b3?a.moveSelected(a.getGridSize(),0):r===l.iD?a.moveSelected(1,0,!0):r===l.uK?a.moveSelected(0,-a.getGridSize()):r===l.l8?a.moveSelected(0,-1,!0):r===l.rB?a.moveSelected(0,a.getGridSize()):r===l.mt&&a.moveSelected(0,1,!0))};return window.addEventListener("keydown",n),()=>window.removeEventListener("keydown",n)},[e,t,a,o,s,i])})(S,b,f,m,p,k);const T=(0,n.useCallback)(e=>{o({id:encodeURIComponent(e)})},[o]),D=(0,n.useCallback)(e=>{if(e){const a=f.metadata.elements.find(t=>t.id===e);console.log((t=a,JSON.parse(JSON.stringify(t))))}var t},[f]);return(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(u,{model:e,currentID:c,onViewChange:T,graph:f,onAutoLayout:k,onSave:b,onToggleHelp:S,saving:y,layouting:x,dragMode:m,setDragMode:p}),(0,h.jsx)(n.Suspense,{fallback:(0,h.jsx)("div",{children:"Loading graph..."}),children:(0,h.jsx)(w,{data:f,onSelect:D,dragMode:m},c)}),d&&(0,h.jsx)(n.Suspense,{fallback:(0,h.jsx)("div",{children:"Loading help..."}),children:(0,h.jsx)(C,{})})]})},E=({model:e})=>{const t=(0,i.B)(e);return n.useEffect(()=>{document.title="Model - Architecture Diagrams as Code",t.length>0&&(document.location.href="?id="+t[0].key)},[t]),t.length>0?(0,h.jsxs)(h.Fragment,{children:["Redirecting to ",t[0].title]}):(0,h.jsx)(h.Fragment,{children:"No views available"})}},279(e,t,a){var n=a(122),o=a(763),s=a(522);a(574),a(919),a(769);class i{callback;handler;running=!1;timeoutId=null;constructor(e){this.callback=e,this.handler=()=>{this.running=!1,this.timeoutId=null,this.callback()}}start(e){this.running&&this.stop(),this.timeoutId=setTimeout(this.handler,e),this.running=!0}stop(){this.running&&null!==this.timeoutId&&(clearTimeout(this.timeoutId),this.running=!1,this.timeoutId=null)}isRunning(){return this.running}}class l{static DEFAULT_OPTIONS={minDelay:1e3,maxDelay:6e4,handshakeTimeout:5e3};static LIVERELOAD_PROTOCOLS=["http://livereload.com/protocols/official-9","http://livereload.com/protocols/2.x-remote-control"];uri;options;fileChangeHandler;socket=null;nextDelay;connectionDesired=!1;disconnectionReason="";handshakeTimeout;reconnectTimer;constructor(e,t){this.fileChangeHandler=e,this.options={...l.DEFAULT_OPTIONS,...t},this.uri="ws://localhost:35729/livereload",this.nextDelay=this.options.minDelay,this.handshakeTimeout=new i(()=>this.handleHandshakeTimeout()),this.reconnectTimer=new i(()=>this.attemptReconnection())}connect(){this.connectionDesired=!0,this.isSocketConnected()||(this.prepareForConnection(),this.createWebSocket())}disconnect(){this.connectionDesired=!1,this.reconnectTimer.stop(),this.isSocketConnected()&&(this.disconnectionReason="manual",this.socket.close())}isSocketConnected(){return null!==this.socket&&this.socket.readyState===WebSocket.OPEN}prepareForConnection(){this.reconnectTimer.stop(),this.disconnectionReason="cannot-connect"}createWebSocket(){this.socket=new WebSocket(this.uri),this.socket.onopen=()=>this.handleOpen(),this.socket.onclose=()=>this.handleClose(),this.socket.onmessage=e=>this.handleMessage(e),this.socket.onerror=()=>this.handleError()}handleOpen(){this.disconnectionReason="handshake-failed",this.startHandshake()}handleClose(){console.log(`WebSocket disconnected: ${this.disconnectionReason}. Retry in ${this.nextDelay}ms`),this.scheduleReconnection()}handleMessage(e){try{const t=JSON.parse(e.data);this.processMessage(t)}catch(e){console.error("Failed to parse WebSocket message:",e)}}handleError(){}processMessage(e){switch(e.command){case"hello":this.handleHelloMessage();break;case"reload":this.handleReloadMessage(e);break;default:console.log("Unknown WebSocket message received:",e)}}handleHelloMessage(){this.handshakeTimeout.stop(),this.nextDelay=this.options.minDelay}handleReloadMessage(e){this.reconnectTimer.stop(),this.connect(),e.path&&this.fileChangeHandler(e.path)}startHandshake(){const e={command:"hello",protocols:l.LIVERELOAD_PROTOCOLS,ver:"3.3.1"};this.sendCommand(e),this.handshakeTimeout.start(this.options.handshakeTimeout)}handleHandshakeTimeout(){this.isSocketConnected()&&(this.disconnectionReason="handshake-timeout",this.socket.close())}attemptReconnection(){this.connectionDesired&&this.connect()}scheduleReconnection(){this.connectionDesired&&(this.reconnectTimer.isRunning()||(this.reconnectTimer.start(this.nextDelay),this.nextDelay=Math.min(this.options.maxDelay,2*this.nextDelay)))}sendCommand(e){this.isSocketConnected()&&this.socket.send(JSON.stringify(e))}}var r=a(987);const c=(0,o.lazy)(()=>Promise.resolve().then(a.bind(a,522)).then(e=>({default:e.Root}))),d=()=>{const[e,t]=(0,o.useState)({data:null,error:null,loading:!0}),a=async()=>{t(e=>({...e,loading:!0,error:null}));try{const[e,a]=await Promise.all([fetch("data/model.json"),fetch("data/layout.json")]);if(!e.ok)throw new Error(`Failed to fetch model: ${e.statusText}`);if(!a.ok)throw new Error(`Failed to fetch layout: ${a.statusText}`);const[n,o]=await Promise.all([e.json(),a.json()]);t({data:{model:n,layout:o},error:null,loading:!1})}catch(e){console.error("Failed to load data:",e),t({data:null,error:e instanceof Error?e.message:"Unknown error occurred",loading:!1})}},n=e=>{e.endsWith(".svg")||(console.log("File changed:",e),(0,s.S)(),a())};return(0,o.useEffect)(()=>{const e=new l(n);return e.connect(),a(),()=>{e.disconnect()}},[]),e.loading?(0,r.jsx)(h,{}):e.error?(0,r.jsx)(u,{error:e.error,onRetry:a}):e.data?(0,r.jsx)(o.Suspense,{fallback:(0,r.jsx)(h,{}),children:(0,r.jsx)(c,{model:e.data.model,layout:e.data.layout})}):(0,r.jsx)(u,{error:"No data available",onRetry:a})},h=()=>(0,r.jsx)("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh",fontFamily:"Arial, sans-serif"},children:(0,r.jsx)("div",{children:"Loading..."})}),u=({error:e,onRetry:t})=>(0,r.jsxs)("div",{style:{padding:"20px",color:"red",fontFamily:"monospace",whiteSpace:"pre-wrap",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",height:"100vh"},children:[(0,r.jsx)("h2",{children:"Error loading application"}),(0,r.jsx)("p",{children:e}),(0,r.jsx)("button",{onClick:t,style:{padding:"10px 20px",fontSize:"16px",cursor:"pointer",backgroundColor:"#007bff",color:"white",border:"none",borderRadius:"4px"},children:"Retry"})]}),g=document.getElementById("root");if(!g)throw new Error("Root container not found");(0,n.createRoot)(g).render((0,r.jsx)(d,{}))}},e=>{e.O(0,[453,96,286],()=>e(e.s=279)),e.O()}]); //# sourceMappingURL=main.js.map \ No newline at end of file diff --git a/cmd/mdl/webapp/dist/main.js.map b/cmd/mdl/webapp/dist/main.js.map index fb438865..971c2127 100644 --- a/cmd/mdl/webapp/dist/main.js.map +++ b/cmd/mdl/webapp/dist/main.js.map @@ -1 +1 @@ -{"version":3,"file":"main.js","mappings":"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","sources":["webpack://app/./src/parseModel.ts","webpack://app/./src/hooks.ts","webpack://app/./src/utils.ts","webpack://app/./src/components/Toolbar.tsx","webpack://app/./src/Root.tsx","webpack://app/./src/graph-view/defs.ts","webpack://app/./src/graph-view/svg-text.ts","webpack://app/./src/graph-view/svg-create.ts","webpack://app/./src/graph-view/intersect.ts","webpack://app/./src/graph-view/shapes.ts","webpack://app/./src/graph-view/undo.ts","webpack://app/./src/graph-view/constants.ts","webpack://app/./src/graph-view/node-content.ts","webpack://app/./src/graph-view/graph.ts","webpack://app/./src/graph-view/edge-utils.ts","webpack://app/./src/graph-view/layout.ts","webpack://app/./src/style.css?dd02","webpack://app/./src/websocket.ts","webpack://app/./src/index.tsx","webpack://app/./src/shortcuts.tsx","webpack://app/./src/utils/platform.ts","webpack://app/./src/style.css"],"sourcesContent":["import {GraphData, LayoutDirection, NodeLink} from \"./graph-view/graph\";\n\n\ninterface Model {\n\tname: string\n\tdescription: string\n\tversion: string\n\tmodel: {\n\t\tenterprise: {\n\t\t\tname: string\n\t\t}\n\t\tpeople: Element[]\n\t\tsoftwareSystems: Element[]\n\t\tdeploymentNodes: Element[]\n\t}\n\tviews: {\n\t\tsystemLandscapeViews: View[]\n\t\tcontainerViews: View[]\n\t\tcomponentViews: View[]\n\t\tdynamicViews: View[]\n\t\tdeploymentViews: View[]\n\t\tstyles: {\n\t\t\telements: {\n\t\t\t\t[key: string]: string\n\t\t\t}[];\n\t\t\trelationships: {\n\t\t\t\t[key: string]: string\n\t\t\t}[]\n\t\t}\n\t}\n}\n\ninterface Layouts {\n\t[key: string]: { // keyed by view key\n\t\t[key: string]: { x: number; y: number } // keyed by element id\n\t}\n}\n\ninterface Element {\n\tid: string;\n\tname: string;\n\ttechnology?: string;\n\tdescription?: string;\n\turl?: string;\n\tparent?: Element;\n\ttags?: string;\n\tlocation?: string;\n\tcontainers?: Element[];\n\tcomponents?: Element[];\n\trelationships?: Relation[];\n\tproperties?: { [key: string]: string }\n\tchildren?: Element[];\n\tinfrastructureNodes?: Element[];\n}\n\ninterface Relation {\n\tid: string;\n\tdescription: string;\n\ttags: string;\n\tsourceId: string;\n\tdestinationId: string;\n\ttechnology: string;\n\tinteractionStyle: string;\n}\n\ntype RankDirection = 'TopBottom' | 'BottomTop' | 'LeftRight' | 'RightLeft';\n\ninterface View {\n\tkey: string;\n\ttitle: string;\n\tdescription: string\n\tautomaticLayout?: {\n\t\trankDirection?: RankDirection;\n\t};\n\telements: {\n\t\tid: string\n\t}[];\n\trelationships: {\n\t\tid: string;\n\t\tvertices: { x: number; y: number }[];\n\t\trouting: string; // takes priority over style\n\t}[];\n\tsoftwareSystemId: string;\n}\n\nconst layoutDirections: Record = {\n\tTopBottom: 'DOWN',\n\tBottomTop: 'UP',\n\tLeftRight: 'RIGHT',\n\tRightLeft: 'LEFT',\n};\n\ninterface Metadata {\n\tname: string\n\tdescription: string\n\tversion: string\n\telements: {\n\t\tid: string\n\t\ttags?: string;\n\t\tlocation?: string;\n\t\tproperties?: { [key: string]: string };\n\t\telementViewKey?: string;\n\t\ttechnology?: string;\n\t\turl?: string;\n\t}[]\n}\n\nexport type ViewsList = {\n\tkey: string;\n\ttitle: string;\n\tsection: string;\n}[]\n\nexport const parseView = (model: Model, layouts: Layouts, viewKey: string) => {\n\n\tconst elements = new Map();\n\tconst relations = new Map();\n\n\tconst collectRels = (el: Element) => {\n\t\tif (Array.isArray(el.relationships)) {\n\t\t\tel.relationships.forEach(rel => {\n\t\t\t\trelations.set(rel.id, rel)\n\t\t\t})\n\t\t}\n\t}\n\n\t// People\n\tmodel.model.people && model.model.people.forEach((el: Element) => {\n\t\telements.set(el.id, el)\n\t\tif (Array.isArray(el.relationships)) {\n\t\t\tel.relationships.forEach(rel => {\n\t\t\t\trelations.set(rel.id, rel)\n\t\t\t})\n\t\t}\n\t})\n\t// Software Systems\n\tmodel.model.softwareSystems && model.model.softwareSystems.forEach((el: Element) => {\n\t\telements.set(el.id, el)\n\t\tcollectRels(el)\n\n\t\tif (Array.isArray(el.containers)) {\n\t\t\tel.containers.forEach((el1: Element) => {\n\t\t\t\tel1.parent = el;\n\t\t\t\telements.set(el1.id, el1)\n\t\t\t\tcollectRels(el1)\n\t\t\t\tif (Array.isArray(el1.components)) {\n\t\t\t\t\tel1.components.forEach((el2: Element) => {\n\t\t\t\t\t\tel2.parent = el1;\n\t\t\t\t\t\telements.set(el2.id, el2)\n\t\t\t\t\t\tcollectRels(el2)\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t})\n\n\t// Deployment Nodes\n\tif (model.model.deploymentNodes) {\n\t\tconst containerInstances = (el: any) => {\n\t\t\tel.containerInstances && el.containerInstances.forEach((item: any) => {\n\t\t\t\tconst el1 = {...elements.get(item.containerId), id: item.id}\n\t\t\t\telements.set(el1.id, el1)\n\t\t\t\tel1.parent = el\n\t\t\t\tcollectRels(item)\n\t\t\t})\n\t\t}\n\n\t\tconst recAddNodes = (el: Element, parent: Element) => {\n\t\t\tel.parent = parent;\n\t\t\telements.set(el.id, el)\n\t\t\tcollectRels(el)\n\t\t\tcontainerInstances(el)\n\t\t\tel.children && el.children.forEach((el1: Element) => recAddNodes(el1, el))\n\t\t\tel.infrastructureNodes && el.infrastructureNodes.forEach((el1: Element) => recAddNodes(el1, el))\n\t\t}\n\n\t\tmodel.model.deploymentNodes.forEach((el: Element) => recAddNodes(el, null))\n\t}\n\n\t// Create graph from selected view\n\tconst {view, section} = getView(model, viewKey)\n\n\tif (!view) return null\n\n\tconst graph = new GraphData(view.key, view.title || view.key)\n\tconst rankDirection = view.automaticLayout?.rankDirection\n\tgraph.layoutDirection = rankDirection ? layoutDirections[rankDirection] : undefined\n\tconst metadata: Metadata = {name: graph.name, description: view.description, version: model.version, elements: []}\n\tgraph.metadata = metadata\n\n\tif (!view.elements) return graph\n\n\t//grouping rules - elements that are groups will not be nodes\n\tconst groupingIDs: { [key: string]: boolean } = {}\n\tif (section == 'deploymentViews' || section == 'containerViews') {\n\t\tview.elements.forEach(ref => {\n\t\t\tconst el = elements.get(ref.id)\n\t\t\tif (el?.parent) {\n\t\t\t\tgroupingIDs[el.parent.id] = true\n\t\t\t}\n\t\t})\n\t} else if (view.softwareSystemId) {\n\t\t//don't show grouping if the element is listed in the view\n\t\tif (!view.elements.find(ref => ref.id == view.softwareSystemId))\n\t\t\tgroupingIDs[view.softwareSystemId] = true\n\t} else if (section == 'systemLandscapeViews') {\n\t\t// create a virtual parent element from enterprise\n\t\tconst p: Element = {id: '__enterprise__', ...model.model.enterprise}\n\t\telements.set(p.id, p)\n\t\tif (model.model.people) model.model.people.filter(el => el.location != 'External').forEach(el => el.parent = p)\n\t\tif (model.model.softwareSystems) model.model.softwareSystems.filter(el => el.location != 'External').forEach(el => el.parent = p)\n\t\tgroupingIDs[p.id] = true\n\t}\n\n\tconst styles = model.views.styles\n\n\t// Build color-to-variable mapping for CSS custom properties theming\n\tconst cssClassName = (tag: string) => tag.toLowerCase().replace(/[^a-z0-9-]/g, '-')\n\t\n\tif (styles?.elements) {\n\t\tstyles.elements.forEach(s => {\n\t\t\tif (s.tag) {\n\t\t\t\tconst varPrefix = `--mdl-${cssClassName(s.tag)}`\n\t\t\t\tif (s.background) graph.colorToVarMap.set(s.background as string, `${varPrefix}-bg`)\n\t\t\t\tif (s.color) graph.colorToVarMap.set(s.color as string, `${varPrefix}-color`)\n\t\t\t\tif (s.stroke) graph.colorToVarMap.set(s.stroke as string, `${varPrefix}-stroke`)\n\t\t\t}\n\t\t})\n\t}\n\n\tif (styles?.relationships) {\n\t\tstyles.relationships.forEach(s => {\n\t\t\tif (s.tag) {\n\t\t\t\tconst varPrefix = `--mdl-rel-${cssClassName(s.tag)}`\n\t\t\t\tif (s.color) graph.colorToVarMap.set(s.color as string, `${varPrefix}-color`)\n\t\t\t}\n\t\t})\n\t}\n\n\t//nodes\n\tview.elements.forEach((ref) => {\n\t\t// except grouping elements\n\t\tif (groupingIDs[ref.id]) return\n\n\t\tconst el = elements.get(ref.id)\n\t\tconst elementViewKey = el ? lookupContainerViewKey(model, el.id) : undefined\n\n\t\tlet sub = ''\n\t\tlet style = {}\n\t\tif (el) {\n\t\t\tconst tags = el.tags.split(',')\n\t\t\tsub = tags[tags.length - 1] // subtitle is []\n\t\t\tif (el.technology)\n\t\t\t\tsub += ': ' + el.technology // or [: ]\n\n\t\t\ttags.forEach(tag => {\n\t\t\t\tconst s = styles && styles.elements && styles.elements.find(s => s.tag == tag)\n\t\t\t\ts && (style = {...style, ...s})\n\t\t\t})\n\t\t}\n\n\t\tgraph.addNode(\n\t\t\tref.id,\n\t\t\tel ? (el.name || ref.id) : ref.id,\n\t\t\tsub,\n\t\t\t(el && el.description) ? el.description : '',\n\t\t\tstyle,\n\t\t\tnodeLink(el, elementViewKey)\n\t\t)\n\t\tel && metadata.elements.push({\n\t\t\tid: el.id,\n\t\t\ttags: el.tags,\n\t\t\tlocation: el.location,\n\t\t\tproperties: el.properties,\n\t\t\telementViewKey,\n\t\t\ttechnology: el.technology,\n\t\t\turl: el.url\n\t\t})\n\t})\n\t//edges\n\tif (Array.isArray(view.relationships)) {\n\t\tview.relationships.forEach(ref => {\n\t\t\tconst rel = relations.get(ref.id)\n\t\t\tif (!rel) return;\n\n\t\t\tif (!graph.nodesMap.has(rel.sourceId)) {\n\t\t\t\tif (elements.has(rel.sourceId)) {\n\t\t\t\t\tconst el = elements.get(rel.sourceId)\n\t\t\t\t\tconsole.warn('Element not found in this view: ', el.id, el.name)\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn('Element not found: ', rel.sourceId)\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!graph.nodesMap.has(rel.destinationId)) {\n\t\t\t\tif (elements.has(rel.destinationId)) {\n\t\t\t\t\tconst el = elements.get(rel.destinationId)\n\t\t\t\t\tconsole.warn('Element not found in this view: ', el.id, el.name)\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn('Element not found: ', rel.destinationId)\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlet style: any = {}\n\t\t\trel.tags.split(',').forEach(tag => {\n\t\t\t\tconst s = styles && styles.relationships && styles.relationships.find(s => s.tag == tag)\n\t\t\t\ts && (style = {...style, ...s})\n\t\t\t})\n\t\t\tif (ref.routing) style.routing = ref.routing\n\n\t\t\tgraph.addEdge(rel.id, rel.sourceId, rel.destinationId, rel.description, ref.vertices, style)\n\t\t})\n\t}\n\n\t//groups\n\t//sort by depth to solve dependency\n\tconst level = (el: Element) => {\n\t\tlet i = 0\n\t\tfor (let p = el.parent; p; p = p.parent) i++;\n\t\treturn i\n\t}\n\tconst gElements = Object.keys(groupingIDs)\n\t\t.map(id => elements.get(id))\n\t\t.sort((a, b) => level(a) > level(b) ? -1 : 1)\n\n\tgElements.forEach(parent => {\n\t\tlet style = {}\n\t\tif (section == 'deploymentViews') {\n\t\t\tconst el = elements.get(parent.id)\n\t\t\tconst tags = el.tags.split(',')\n\t\t\ttags.forEach(tag => {\n\t\t\t\tconst s = styles && styles.elements && styles.elements.find(s => s.tag == tag)\n\t\t\t\ts && (style = {...style, ...s})\n\t\t\t})\n\t\t}\n\t\t\n\t\t// Filter group members more carefully to respect boundaries\n\t\tconst groupMembers = view.elements\n\t\t\t.map(ref => elements.get(ref.id))\n\t\t\t.filter(el => {\n\t\t\t\tif (!el || el.parent !== parent) return false;\n\t\t\t\t\n\t\t\t\t// For system landscape views, respect the location-based grouping\n\t\t\t\tif (section === 'systemLandscapeViews' && parent.id === '__enterprise__') {\n\t\t\t\t\t// Only include elements that are explicitly non-external\n\t\t\t\t\treturn el.location !== 'External';\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// For other view types, include if parent matches\n\t\t\t\treturn true;\n\t\t\t})\n\t\t\t.map(el => el.id);\n\t\t\n\t\t// Only create group if it has members\n\t\tif (groupMembers.length > 0) {\n\t\t\tgraph.addGroup(\n\t\t\t\tparent.id,\n\t\t\t\tparent.name,\n\t\t\t\tgroupMembers,\n\t\t\t\tstyle\n\t\t\t)\n\t\t}\n\t})\n\n\t//layout if any and init graph\n\tgraph.init(layouts[graph.id])\n\treturn graph\n}\n\nfunction nodeLink(element: Element | undefined, elementViewKey: string | undefined): NodeLink | undefined {\n\tif (elementViewKey) {\n\t\tconst encodedViewKey = encodeURIComponent(elementViewKey)\n\t\treturn {\n\t\t\thref: `?id=${encodedViewKey}`,\n\t\t\texportHref: `${encodedViewKey}.svg`,\n\t\t}\n\t}\n\tif (element?.url) {\n\t\treturn {\n\t\t\thref: element.url,\n\t\t\texportHref: element.url,\n\t\t}\n\t}\n\treturn undefined\n}\n\n// lookup the view in all Views sections in the model. return the view and the section\nfunction getView(model: Model, viewKey: string) {\n\tlet view: View = null, section: string = ''\n\tObject.keys(model.views).filter(s => s.endsWith('Views')).some((s: string) => {\n\t\treturn ((model.views as any)[s]).some((v: View) => {\n\t\t\tif (v.key == viewKey) {\n\t\t\t\tview = v\n\t\t\t\tsection = s\n\t\t\t\treturn true\n\t\t\t}\n\t\t})\n\t})\n\treturn {view, section}\n}\n\n\nfunction lookupContainerViewKey(model: Model, softwareSystemId: string) {\n\tconst view = model.views.containerViews?.find(candidate => candidate.softwareSystemId == softwareSystemId)\n\treturn view?.key\n}\n\nexport const listViews = (model: any) => {\n\tconst viewsList: ViewsList = []\n\tconst sections = Object.keys(model.views).filter(section => section.endsWith('Views'))\n\tsections.forEach(s => {\n\t\tmodel.views[s].forEach((v: View) => {\n\t\t\tviewsList.push({key: v.key, title: v.title || v.key, section: s})\n\t\t})\n\t})\n\treturn viewsList;\n}\n","import { useState, useCallback, useEffect } from 'react';\nimport { GraphData } from './graph-view/graph';\nimport { parseView } from './parseModel';\nimport { LayoutOptions } from './graph-view/layout';\nimport { \n findShortcut, \n HELP, \n SAVE, \n TOGGLE_DRAG_MODE,\n ALIGN_HORIZONTAL,\n ALIGN_VERTICAL,\n DISTRIBUTE_HORIZONTAL,\n DISTRIBUTE_VERTICAL,\n AUTO_LAYOUT,\n RESET_POSITION,\n TOGGLE_GRID,\n TOGGLE_SNAP_TO_GRID,\n SNAP_ALL_TO_GRID,\n MOVE_LEFT,\n MOVE_RIGHT,\n MOVE_UP,\n MOVE_DOWN,\n MOVE_LEFT_FINE,\n MOVE_RIGHT_FINE,\n MOVE_UP_FINE,\n MOVE_DOWN_FINE\n} from './shortcuts';\n\n// Global state for graphs to preserve edits\nconst graphs: { [key: string]: GraphData } = {};\n\n// Custom hook for graph management\nexport const useGraph = (model: any, layouts: any, currentID: string): GraphData | null => {\n if (graphs[currentID]) {\n return graphs[currentID];\n }\n \n const graph = parseView(model, layouts, currentID);\n if (graph) {\n graphs[currentID] = graph;\n }\n \n return graph;\n};\n\n// Custom hook for auto layout functionality\nexport const useAutoLayout = (graph: GraphData) => {\n const [layouting, setLayouting] = useState(false);\n\n const handleAutoLayout = useCallback(async (opts?: LayoutOptions) => {\n setLayouting(true);\n try {\n const options: LayoutOptions = {\n direction: graph.layoutDirection || 'DOWN',\n ...(opts || {})\n };\n await graph.autoLayout(options);\n } finally {\n setLayouting(false);\n }\n }, [graph]);\n\n return { layouting, handleAutoLayout };\n};\n\n// Custom hook for save functionality\nexport const useSave = (graph: GraphData, currentID: string) => {\n const [saving, setSaving] = useState(false);\n\n const handleSave = useCallback(async () => {\n setSaving(true);\n \n try {\n const response = await fetch('data/save?id=' + encodeURIComponent(currentID), {\n method: 'post',\n body: graph.exportSVG()\n });\n \n if (response.status !== 202) {\n const detail = (await response.text()).trim();\n throw new Error(detail || `save failed with HTTP ${response.status}`);\n }\n graph.setSaved();\n } finally {\n setSaving(false);\n }\n }, [graph, currentID]);\n\n return { saving, handleSave };\n};\n\n// Custom hook for keyboard shortcuts\nexport const useKeyboardShortcuts = (\n toggleHelp: () => void,\n saveLayout: () => void,\n graph?: GraphData,\n dragMode?: 'pan' | 'select',\n setDragMode?: (mode: 'pan' | 'select') => void,\n onAutoLayout?: () => void\n) => {\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n const shortcut = findShortcut(e);\n \n // Prevent browser default for all recognized shortcuts\n if (shortcut) {\n e.preventDefault();\n }\n \n if (shortcut === HELP) {\n toggleHelp();\n } else if (shortcut === SAVE) {\n saveLayout();\n } else if (shortcut === TOGGLE_DRAG_MODE && setDragMode && dragMode) {\n setDragMode(dragMode === 'pan' ? 'select' : 'pan');\n } else if (graph) {\n // Graph-dependent shortcuts\n if (shortcut === ALIGN_HORIZONTAL) {\n graph.alignSelectionH();\n } else if (shortcut === ALIGN_VERTICAL) {\n graph.alignSelectionV();\n } else if (shortcut === DISTRIBUTE_HORIZONTAL) {\n graph.distributeSelectionH();\n } else if (shortcut === DISTRIBUTE_VERTICAL) {\n graph.distributeSelectionV();\n } else if (shortcut === AUTO_LAYOUT && onAutoLayout) {\n onAutoLayout();\n } else if (shortcut === RESET_POSITION) {\n graph.resetView();\n } else if (shortcut === TOGGLE_GRID) {\n graph.toggleGrid();\n } else if (shortcut === TOGGLE_SNAP_TO_GRID) {\n graph.toggleSnapToGrid();\n } else if (shortcut === SNAP_ALL_TO_GRID) {\n graph.snapAllToGrid();\n } else if (shortcut === MOVE_LEFT) {\n graph.moveSelected(-graph.getGridSize(), 0);\n } else if (shortcut === MOVE_LEFT_FINE) {\n graph.moveSelected(-1, 0, true); // Disable snap for fine movement\n } else if (shortcut === MOVE_RIGHT) {\n graph.moveSelected(graph.getGridSize(), 0);\n } else if (shortcut === MOVE_RIGHT_FINE) {\n graph.moveSelected(1, 0, true); // Disable snap for fine movement\n } else if (shortcut === MOVE_UP) {\n graph.moveSelected(0, -graph.getGridSize());\n } else if (shortcut === MOVE_UP_FINE) {\n graph.moveSelected(0, -1, true); // Disable snap for fine movement\n } else if (shortcut === MOVE_DOWN) {\n graph.moveSelected(0, graph.getGridSize());\n } else if (shortcut === MOVE_DOWN_FINE) {\n graph.moveSelected(0, 1, true); // Disable snap for fine movement\n }\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [toggleHelp, saveLayout, graph, dragMode, setDragMode, onAutoLayout]);\n};\n\n// Utility function to clear graph cache\nexport const clearGraphCache = (currentID?: string) => {\n if (currentID) {\n delete graphs[currentID];\n } else {\n Object.keys(graphs).forEach(key => delete graphs[key]);\n }\n};","// Helper functions for the application\n\nexport function removeEmptyProps(obj: any) {\n return JSON.parse(JSON.stringify(obj));\n}\n\nexport function camelToWords(camel: string) {\n const split = camel.replace(/([A-Z])/g, \" $1\");\n return split.charAt(0).toUpperCase() + split.slice(1);\n}\n\nexport function getCurrentViewID() {\n const params = new URLSearchParams(document.location.search);\n return params.get('id') || '';\n} ","import React, { FC, useState, useEffect } from 'react';\nimport { getZoomAuto, GraphData, setZoom, getZoom, setZoomCentered } from '../graph-view/graph';\nimport { listViews } from '../parseModel';\nimport { camelToWords } from '../utils';\nimport { getModifierKeyName } from '../utils/platform';\n\n// Types\ninterface ToolbarProps {\n model: any;\n currentID: string;\n onViewChange: (id: string) => void;\n graph: GraphData;\n onAutoLayout: () => void;\n onSave: () => void;\n onToggleHelp: () => void;\n saving: boolean;\n layouting: boolean;\n dragMode: 'pan' | 'select';\n setDragMode: (mode: 'pan' | 'select') => void;\n}\n\nexport const Toolbar: FC = ({\n model, currentID, onViewChange, graph, \n onAutoLayout, onSave, onToggleHelp, saving, layouting,\n dragMode, setDragMode\n}) => {\n const views = listViews(model);\n \n return (\n
\n \n \n
\n );\n};\n\nconst ViewSelector: FC<{\n views: any[];\n currentID: string;\n onViewChange: (id: string) => void;\n}> = ({ views, currentID, onViewChange }) => (\n
\n View:\n {views.length > 1 ? (\n \n ) : (\n \n {views[0] ? camelToWords(views[0].section) + ': ' + views[0].title : 'No views available'}\n \n )}\n
\n);\n\nconst ToolbarActions: FC<{\n graph: GraphData;\n onAutoLayout: () => void;\n onSave: () => void;\n onToggleHelp: () => void;\n saving: boolean;\n layouting: boolean;\n dragMode: 'pan' | 'select';\n setDragMode: (mode: 'pan' | 'select') => void;\n}> = ({\n graph, onAutoLayout, onSave, onToggleHelp, saving, layouting,\n dragMode, setDragMode\n}) => (\n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n);\n\nconst DragModeButton: FC<{\n dragMode: 'pan' | 'select';\n setDragMode: (mode: 'pan' | 'select') => void;\n}> = ({ dragMode, setDragMode }) => (\n \n);\n\nconst UndoRedoButtons: FC<{ graph: GraphData }> = ({ graph }) => {\n const modKey = getModifierKeyName();\n return (\n <>\n \n \n \n );\n};\n\nconst AlignmentButtons: FC<{ graph: GraphData }> = ({ graph }) => {\n const modKey = getModifierKeyName();\n return (\n <>\n \n \n \n \n \n );\n};\n\nconst LayoutControls: FC<{\n onAutoLayout: () => void;\n layouting: boolean;\n}> = ({ onAutoLayout, layouting }) => {\n const modKey = getModifierKeyName();\n return (\n \n );\n};\n\nconst GridControls: FC<{ graph: GraphData }> = ({ graph }) => {\n const [gridVisible, setGridVisible] = useState(graph.isGridVisible());\n const [snapToGrid, setSnapToGrid] = useState(graph.isSnapToGrid());\n const modKey = getModifierKeyName();\n \n // Update state when graph changes or when grid state changes via shortcuts\n React.useEffect(() => {\n const updateGridState = () => {\n setGridVisible(graph.isGridVisible());\n setSnapToGrid(graph.isSnapToGrid());\n };\n \n // Initial update\n updateGridState();\n \n // Listen for grid state changes from keyboard shortcuts\n window.addEventListener('gridStateChanged', updateGridState);\n \n return () => {\n window.removeEventListener('gridStateChanged', updateGridState);\n };\n }, [graph]);\n \n const handleToggleGrid = () => {\n graph.toggleGrid();\n setGridVisible(graph.isGridVisible());\n };\n \n const handleToggleSnap = () => {\n graph.toggleSnapToGrid();\n setSnapToGrid(graph.isSnapToGrid());\n };\n \n const handleSnapAll = () => {\n graph.snapAllToGrid();\n };\n \n return (\n <>\n \n \n \n \n );\n};\n\nconst ZoomDisplay: FC = () => {\n const [zoom, setZoomState] = useState(100);\n\n useEffect(() => {\n const updateZoom = () => {\n const currentZoom = Math.round(getZoom() * 100);\n setZoomState(currentZoom);\n };\n\n // Update zoom initially\n updateZoom();\n\n // Update zoom every 100ms to catch changes from wheel/keyboard/etc\n const interval = setInterval(updateZoom, 100);\n\n return () => clearInterval(interval);\n }, []);\n\n return (\n \n );\n};\n\nconst ZoomControls: FC<{ graph: GraphData }> = ({ graph }) => {\n const modKey = getModifierKeyName();\n return (\n <>\n \n \n \n \n \n );\n};\n\nconst SaveButton: FC<{\n onSave: () => void;\n saving: boolean;\n graph: GraphData;\n}> = ({ onSave, saving, graph }) => {\n const [hasChanges, setHasChanges] = useState(false);\n const modKey = getModifierKeyName();\n \n // Check for changes periodically\n useEffect(() => {\n const checkChanges = () => {\n setHasChanges(graph.changed());\n };\n \n // Initial check\n checkChanges();\n \n // Check every 100ms for changes\n const interval = setInterval(checkChanges, 100);\n \n return () => clearInterval(interval);\n }, [graph]);\n \n return (\n \n );\n};\n\nconst HelpButton: FC<{\n onToggleHelp: () => void;\n}> = ({ onToggleHelp }) => {\n return (\n \n );\n};","import React, { FC, useState, useCallback, useEffect, useRef, Suspense, lazy } from \"react\";\nimport { GraphData, LayoutDirection } from \"./graph-view/graph\";\nimport { LayoutOptions } from \"./graph-view/layout\";\nimport { BrowserRouter as Router, Routes, Route, useSearchParams } from 'react-router-dom';\nimport { listViews } from \"./parseModel\";\nimport { useGraph, useAutoLayout, useSave, useKeyboardShortcuts, clearGraphCache } from \"./hooks\";\nimport { Toolbar } from \"./components/Toolbar\";\nimport { removeEmptyProps, getCurrentViewID } from \"./utils\";\n\nconst Help = lazy(() => import(\"./shortcuts\").then(module => ({ default: module.Help })));\nconst Graph = lazy(() => import(\"./graph-view/graph-react\").then(module => ({ default: module.Graph })));\n\n// Types\ninterface ModelData {\n model: any;\n layout: any;\n}\n\ntype AutomationStatus = 'running' | 'complete' | 'error';\n\nconst setAutomationStatus = (status: AutomationStatus | null, error?: string) => {\n const root = document.documentElement;\n if (!status) {\n delete root.dataset.mdlAutomationStatus;\n delete root.dataset.mdlAutomationError;\n return;\n }\n root.dataset.mdlAutomationStatus = status;\n if (error) {\n root.dataset.mdlAutomationError = error;\n } else {\n delete root.dataset.mdlAutomationError;\n }\n};\n\nconst errorMessage = (error: unknown): string =>\n error instanceof Error ? error.message : String(error);\n\nconst reportInteractiveError = (action: string, error: unknown) => {\n console.error(`${action} failed:`, error);\n alert(`${action} failed. See console for details.`);\n};\n\nexport const Root: FC = ({ model, layout }) => (\n \n \n } />\n \n \n);\n\nexport const refreshGraph = () => {\n const currentID = getCurrentViewID();\n clearGraphCache(currentID);\n};\n\nconst ModelPane: FC<{ model: any; layouts: any }> = ({ model, layouts }) => {\n const [searchParams, setSearchParams] = useSearchParams();\n const currentID = decodeURI(searchParams.get('id') || '');\n \n // UI State\n const [helpVisible, setHelpVisible] = useState(false);\n const [dragMode, setDragMode] = useState<'pan' | 'select'>('pan');\n const [readyGraphID, setReadyGraphID] = useState(null);\n const automationKey = useRef(null);\n const automationRun = useRef(0);\n \n // Get or create graph for current view\n const graph = useGraph(model, layouts, currentID);\n \n // Custom hooks for functionality\n const { layouting, handleAutoLayout } = useAutoLayout(graph || ({} as GraphData));\n const { saving, handleSave } = useSave(graph || ({} as GraphData), currentID);\n \n if (!graph) {\n return ;\n }\n\n const handleToggleHelp = useCallback(() => {\n setHelpVisible(!helpVisible);\n }, [helpVisible]);\n\n const handleGraphReady = useCallback(() => {\n setReadyGraphID(currentID);\n }, [currentID]);\n\n const handleInteractiveAutoLayout = useCallback(() => {\n void handleAutoLayout().catch(error => reportInteractiveError('Layout', error));\n }, [handleAutoLayout]);\n\n const handleInteractiveSave = useCallback(() => {\n void handleSave().catch(error => reportInteractiveError('Save', error));\n }, [handleSave]);\n\n // Update document title when view changes\n useEffect(() => {\n if (graph && graph.name) {\n document.title = `${graph.name} - Model`;\n }\n }, [graph]);\n\n // Headless automation: support query params to auto-layout and save\n useEffect(() => {\n const params = Object.fromEntries(searchParams.entries());\n const auto = params['auto'] === '1' || params['auto'] === 'true';\n const save = params['save'] === '1' || params['save'] === 'true';\n if (!auto && !save) {\n automationKey.current = null;\n automationRun.current++;\n setAutomationStatus(null);\n return;\n }\n if (readyGraphID !== currentID) {\n return;\n }\n\n const key = `${currentID}:${searchParams.toString()}`;\n if (automationKey.current === key) {\n return;\n }\n automationKey.current = key;\n const run = ++automationRun.current;\n setAutomationStatus('running');\n\n const direction = (params['direction'] || '').toUpperCase();\n const compact = params['compact'] === '1' || params['compact'] === 'true';\n\n const validDirections: LayoutDirection[] = ['UP', 'DOWN', 'LEFT', 'RIGHT'];\n const layoutOpts: LayoutOptions = {};\n if (validDirections.includes(direction as LayoutDirection)) {\n layoutOpts.direction = direction as LayoutDirection;\n }\n if (compact) {\n layoutOpts.compactLayout = true;\n }\n\n (async () => {\n try {\n if (auto) {\n await handleAutoLayout(layoutOpts);\n }\n if (save) {\n await handleSave();\n }\n if (automationRun.current === run) {\n setAutomationStatus('complete');\n }\n } catch (error) {\n const message = errorMessage(error);\n console.error('Automation failed:', error);\n if (automationRun.current === run) {\n setAutomationStatus('error', message);\n }\n }\n })();\n }, [currentID, graph, handleAutoLayout, handleSave, readyGraphID, searchParams]);\n\n // Setup keyboard shortcuts\n useKeyboardShortcuts(\n handleToggleHelp,\n handleInteractiveSave,\n graph,\n dragMode,\n setDragMode,\n handleInteractiveAutoLayout,\n );\n\n const handleViewChange = useCallback((id: string) => {\n setSearchParams({ id: encodeURIComponent(id) });\n }, [setSearchParams]);\n\n const handleSelect = useCallback((id: string | null) => {\n if (id) {\n const element = graph.metadata.elements.find((m: any) => m.id === id);\n console.log(removeEmptyProps(element));\n }\n }, [graph]);\n\n\treturn (\n\t\t<>\n\t\t\t\n\t\t\tLoading graph...
}>\n\t\t\t\t\n\t\t\t\n\t\t\t{helpVisible && (\n\t\t\t\tLoading help...
}>\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t)}\n\t\t\n\t);\n};\n\nconst ViewRedirect: FC<{ model: any }> = ({ model }) => {\n const views = listViews(model);\n \n React.useEffect(() => {\n // Set default title when no view is selected\n document.title = 'Model - Architecture Diagrams as Code';\n \n if (views.length > 0) {\n document.location.href = '?id=' + views[0].key;\n }\n }, [views]);\n\n if (views.length > 0) {\n return <>Redirecting to {views[0].title};\n }\n return <>No views available;\n};\n\n","export const defs = `\n\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n`\n","const textMeasure = () => {\n\tconst svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n\tdocument.body.appendChild(svg);\n\n\treturn {\n\t\tmeasure: (text: string, attrs: { [key: string]: string }) => {\n\t\t\tconst node = document.createElementNS('http://www.w3.org/2000/svg', 'text')\n\t\t\tnode.setAttribute('x', '0');\n\t\t\tnode.setAttribute('y', '0');\n\t\t\tfor (let attr in attrs) {\n\t\t\t\tnode.setAttribute(attr, attrs[attr]);\n\t\t\t}\n\t\t\tnode.appendChild(document.createTextNode(text));\n\n\t\t\tsvg.appendChild(node);\n\t\t\tconst {width, height} = node.getBBox();\n\t\t\tsvg.removeChild(node);\n\t\t\treturn {width, height};\n\t\t},\n\t\tclean: () => {\n\t\t\tdocument.body.removeChild(svg);\n\t\t}\n\t}\n}\n\n// Helper function to break long words that exceed width\nconst breakLongWord = (word: string, maxWidth: number, attrs: { [key: string]: string }, mt: any): string[] => {\n\tconst parts: string[] = [];\n\tlet currentPart = '';\n\t\n\tfor (let i = 0; i < word.length; i++) {\n\t\tconst testPart = currentPart + word[i];\n\t\tconst size = mt.measure(testPart, attrs);\n\t\t\n\t\tif (size.width > maxWidth && currentPart.length > 0) {\n\t\t\tparts.push(currentPart);\n\t\t\tcurrentPart = word[i];\n\t\t} else {\n\t\t\tcurrentPart = testPart;\n\t\t}\n\t}\n\t\n\tif (currentPart.length > 0) {\n\t\tparts.push(currentPart);\n\t}\n\t\n\treturn parts;\n}\n\n// split a text in lines wrapped at a certain width\nexport const svgTextWrap = (text: string, width: number, attrs: { [key: string]: string }) => {\n\tconst mt = textMeasure()\n\tlet maxW = 0;\n\t\n\tconst ret = text.trim().split('\\n').map(text => { //split paragraphs\n\t\t//do one paragraph\n\t\tconst words = text.trim().split(/\\s+/);\n\t\tlet lines: string[] = [];\n\t\tlet currentLine: string[] = [];\n\t\t\n\t\twords.forEach(word => {\n\t\t\t// First check if the single word exceeds the width\n\t\t\tconst wordSize = mt.measure(word, attrs);\n\t\t\tif (wordSize.width > width) {\n\t\t\t\t// If we have content in current line, finish it first\n\t\t\t\tif (currentLine.length > 0) {\n\t\t\t\t\tlines.push(currentLine.join(' '));\n\t\t\t\t\tcurrentLine = [];\n\t\t\t\t}\n\t\t\t\t// Break the long word into smaller parts\n\t\t\t\tconst brokenParts = breakLongWord(word, width, attrs, mt);\n\t\t\t\t// Add all but the last part as complete lines\n\t\t\t\tfor (let i = 0; i < brokenParts.length - 1; i++) {\n\t\t\t\t\tlines.push(brokenParts[i]);\n\t\t\t\t\tmaxW = Math.max(maxW, mt.measure(brokenParts[i], attrs).width);\n\t\t\t\t}\n\t\t\t\t// Start new line with the last part\n\t\t\t\tif (brokenParts.length > 0) {\n\t\t\t\t\tcurrentLine = [brokenParts[brokenParts.length - 1]];\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Normal word processing\n\t\t\t\tconst newLine = [...currentLine, word];\n\t\t\t\tconst size = mt.measure(newLine.join(' '), attrs);\n\t\t\t\tif (size.width > width && currentLine.length > 0) {\n\t\t\t\t\tlines.push(currentLine.join(' '));\n\t\t\t\t\tcurrentLine = [word];\n\t\t\t\t} else {\n\t\t\t\t\tmaxW = Math.max(maxW, size.width)\n\t\t\t\t\tcurrentLine = newLine;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tif (currentLine.length > 0) {\n\t\t\tlines.push(currentLine.join(' '));\n\t\t}\n\t\treturn lines;\n\t}).reduce((a, v) => a.concat(v), []) //flatten\n\n\tmt.clean()\n\treturn {lines: ret, maxW};\n};\n\n\n","import {svgTextWrap} from \"./svg-text\";\n\nexport const create = {\n\telement(type: string, attrs: Record = {}, className?: string) {\n\t\tconst el = document.createElementNS('http://www.w3.org/2000/svg', type);\n\t\tObject.entries(attrs).forEach(([k, v]) => el.setAttribute(k, String(v)));\n\t\tif (className) el.classList.add(className);\n\t\treturn el;\n\t},\n\n\tuse(id: string, attrs: Record = {}) {\n\t\tconst el = this.element('use', attrs);\n\t\tel.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', '#' + id);\n\t\treturn el;\n\t},\n\n\tpath(path: string, attrs: Record = {}, className?: string) {\n\t\tconst p = this.element(\"path\", {...attrs, d: path}, className);\n\t\treturn p;\n\t},\n\n\ttext(text: string, attrs: Record = {}) {\n\t\tconst t = this.element('text', attrs) as SVGTextElement;\n\t\tif (text) t.textContent = text;\n\t\treturn t;\n\t},\n\n\ttextArea(text: string, width: number, fontSize: number, bold: boolean, x = 0, y = 0, anchor = '') {\n\t\tconst attrs: Record = {\n\t\t\t'font-size': `${fontSize}px`,\n\t\t\t'font-weight': bold ? 'bold' : 'normal'\n\t\t};\n\t\tconst {lines, maxW} = svgTextWrap(text, width, attrs);\n\t\tconst txt = this.text('', {x: 0, y, 'text-anchor': anchor || undefined});\n\t\t\n\t\tlines.forEach((line, i) => {\n\t\t\tconst span = this.element('tspan', {x, dy: `${fontSize + 2}px`, ...attrs});\n\t\t\tspan.textContent = line;\n\t\t\ttxt.append(span);\n\t\t});\n\t\t\n\t\treturn {txt, dy: (lines.length + 1) * (fontSize + 2), maxW};\n\t},\n\n\trect(width: number, height: number, x = 0, y = 0, r = 0, className?: string) {\n\t\treturn this.element('rect', {x, y, rx: r, ry: r, width, height}, className) as SVGRectElement;\n\t},\n\n\ticon(icon: string, x = 0, y = 0) {\n\t\treturn this.use(icon, {x, y});\n\t},\n\n\texpand(x: number, y: number, expanded: boolean) {\n\t\tconst g = this.element('g', {transform: `translate(${x},${y})`}, 'expand') as SVGGElement;\n\t\tg.append(\n\t\t\tthis.rect(19, 19, 0, 0, 1),\n\t\t\tthis.text(expanded ? '-' : '+', {x: 10, y: 14, 'text-anchor': 'middle'})\n\t\t);\n\t\treturn g;\n\t}\n};\n\nexport function setPosition(g: SVGGElement, x: number, y: number) {\n\tg.setAttribute('transform', `translate(${x},${y})`);\n}","interface Point {\n\tx: number;\n\ty: number;\n}\n\ninterface BBox extends Point {\n\twidth: number;\n\theight: number;\n}\n\n\nexport function insideBox(p: Point, b: BBox, centeredBox = true): boolean {\n\treturn centeredBox ?\n\t\t(p.x > b.x - b.width / 2 && p.x < b.x + b.width / 2 && p.y > b.y - b.height / 2 && p.y < b.y + b.height / 2) :\n\t\t(p.x > b.x && p.x < b.x + b.width && p.y > b.y && p.y < b.y + b.height)\n}\n\nexport function boxesOverlap(b1: BBox, b2: BBox): boolean {\n\treturn b1.x < b2.x + b2.width && b1.y < b2.y + b2.height && b1.x + b1.width > b2.x && b1.y + b1.height > b2.y\n}\n\nexport function uncenterBox(b: BBox): BBox {\n\treturn {x: b.x - b.width / 2, y: b.y - b.height / 2, width: b.width, height: b.height}\n}\n\nexport function scaleBox(b: BBox, sc: number): BBox {\n\treturn {x: b.x * sc, y: b.y * sc, width: b.width * sc, height: b.height * sc}\n}\n\n// intersect 2 segments (p1->q1) with (p2, q2)\n// if the lines intersect, the result contains the x and y of the intersection (treating the lines as infinite)\n// and booleans for whether line segment 1 or line segment 2 contain the point\nfunction segmentIntersection(p1: Point, q1: Point, p2: Point, q2: Point) {\n\tlet denominator, a, b, numerator1, numerator2,\n\t\tresult: { x: number, y: number, onLine1: boolean, onLine2: boolean } = {\n\t\t\tx: null,\n\t\t\ty: null,\n\t\t\tonLine1: false,\n\t\t\tonLine2: false\n\t\t};\n\tdenominator = (q2.y - p2.y) * (q1.x - p1.x) - (q2.x - p2.x) * (q1.y - p1.y);\n\tif (denominator == 0) {\n\t\treturn result;\n\t}\n\ta = p1.y - p2.y;\n\tb = p1.x - p2.x;\n\tnumerator1 = ((q2.x - p2.x) * a) - ((q2.y - p2.y) * b);\n\tnumerator2 = ((q1.x - p1.x) * a) - ((q1.y - p1.y) * b);\n\ta = numerator1 / denominator;\n\tb = numerator2 / denominator;\n\n\t// if we cast these lines infinitely in both directions, they intersect here:\n\tresult.x = p1.x + (a * (q1.x - p1.x));\n\tresult.y = p1.y + (a * (q1.y - p1.y));\n\n\t// if line1 is a segment and line2 is infinite, they intersect if:\n\tif (a > 0 && a < 1) {\n\t\tresult.onLine1 = true;\n\t}\n\t// if line2 is a segment and line1 is infinite, they intersect if:\n\tif (b >= 0 && b <= 1) {\n\t\tresult.onLine2 = true;\n\t}\n\t// if line1 and line2 are segments, they intersect if both of the above are true\n\treturn result;\n}\n\n// intersects a segment (p1->p2) with a box\nexport function intersectRectFull(p1: Point, p2: Point, box: BBox): Point[] {\n\tconst w = box.width / 2\n\tconst h = box.height / 2\n\tconst segs: { p: Point; q: Point }[] = [\n\t\t{p: {x: box.x - w, y: box.y - h}, q: {x: box.x - w, y: box.y + h}},\n\t\t{p: {x: box.x - w, y: box.y - h}, q: {x: box.x + w, y: box.y - h}},\n\t\t{p: {x: box.x + w, y: box.y - h}, q: {x: box.x + w, y: box.y + h}},\n\t\t{p: {x: box.x - w, y: box.y + h}, q: {x: box.x + w, y: box.y + h}},\n\t]\n\treturn segs.map(s => segmentIntersection(p1, p2, s.p, s.q)).filter(ret => ret.onLine1 && ret.onLine2)\n}\n\n// intersects a line that goes from p to the center of the box\nexport function intersectRect(box: BBox, p: Point): Point {\n\tif (insideBox(p, box)) return {x: box.x, y: box.y}\n\treturn intersectRectFull(box, p, box)[0] || {x: box.x, y: box.y}\n}\n\nexport function intersectEllipse(ellCenter: Point, rx: number, ry: number, nodeCenter: Point, point: Point) {\n\n\t//translate all to center ellipse\n\tconst p1 = {x: point.x - ellCenter.x, y: point.y - ellCenter.y}\n\tconst p2 = {x: nodeCenter.x - ellCenter.x, y: nodeCenter.y - ellCenter.y}\n\n\tif (p2.x == p1.x) { //hack to avoid singularity\n\t\tp1.x += .0000001\n\t}\n\n\tconst s = (p2.y - p1.y) / (p2.x - p1.x);\n\tconst si = p2.y - (s * p2.x);\n\tconst a = (ry * ry) + (rx * rx * s * s);\n\tconst b = 2 * rx * rx * si * s;\n\tconst c = rx * rx * si * si - rx * rx * ry * ry;\n\n\tconst radicand_sqrt = Math.sqrt((b * b) - (4 * a * c));\n\tconst x = p1.x > p2.x ?\n\t\t(-b + radicand_sqrt) / (2 * a) :\n\t\t(-b - radicand_sqrt) / (2 * a)\n\tconst pos = {\n\t\tx: x,\n\t\ty: s * x + si\n\t}\n\t//translate back\n\tpos.x += ellCenter.x;\n\tpos.y += ellCenter.y\n\n\treturn pos;\n}\n\nexport interface Segment {\n\tp: Point;\n\tq: Point;\n}\n\n// given a polyline as a list of segments, interrupt it over the box so no line is inside the box\nexport function intersectPolylineBox(segments: Segment[], box: BBox) {\n\tfor (let i = 0; i < segments.length; i++) {\n\t\tconst s = segments[i]\n\t\tif (insideBox(s.p, box)) {\n\t\t\tif (insideBox(s.q, box)) { // segment both ends inside box\n\t\t\t\tsegments.splice(i, 1)\n\t\t\t\ti -= 1\n\t\t\t} else { // segment start inside box\n\t\t\t\ts.p = intersectRectFull(s.p, s.q, box)[0]\n\t\t\t}\n\t\t} else {\n\t\t\tif (insideBox(s.q, box)) { // segment end inside box\n\t\t\t\ts.q = intersectRectFull(s.p, s.q, box)[0]\n\t\t\t} else { // both ends outside\n\t\t\t\tconst ret = intersectRectFull(s.p, s.q, box)\n\t\t\t\tif (ret.length == 2) { // intersects the box, splice segment\n\t\t\t\t\t// order the intersection points, closest first\n\t\t\t\t\tconst dst1 = Math.abs(ret[0].x - s.p.x) + Math.abs(ret[0].y - s.p.y)\n\t\t\t\t\tconst dst2 = Math.abs(ret[1].x - s.p.x) + Math.abs(ret[1].y - s.p.y)\n\t\t\t\t\tif (dst1 > dst2) ret.reverse()\n\t\t\t\t\t// split the segment in 2\n\t\t\t\t\tconst s2 = {p: ret[1], q: s.q}\n\t\t\t\t\ts.q = ret[0]\n\t\t\t\t\tsegments.splice(i + 1, 0, s2)\n\t\t\t\t\ti += 1\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport function project(p: Point, a: Point, b: Point): Point {\n\tlet atob = {x: b.x - a.x, y: b.y - a.y};\n\tlet atop = {x: p.x - a.x, y: p.y - a.y};\n\tlet len = atob.x * atob.x + atob.y * atob.y;\n\tlet dot = atop.x * atob.x + atop.y * atob.y;\n\tlet t = Math.min(1, Math.max(0, dot / len));\n\treturn {\n\t\tx: a.x + atob.x * t,\n\t\ty: a.y + atob.y * t\n\t};\n}\n\nexport function cabDistance(p1: Point, p2: Point): number {\n\treturn Math.abs(p2.x - p1.x) + Math.abs(p2.y - p1.y)\n}","import {intersectEllipse, intersectRect} from \"./intersect\";\n\ninterface Point {\n\tx: number;\n\ty: number;\n}\n\ninterface BBox extends Point {\n\twidth: number;\n\theight: number;\n}\n\ninterface D3Node extends BBox {\n\tintersect: (p: Point) => Point\n}\n\nfunction cylinderRadiusY(width: number) {\n\treturn width / 2 / (5.5 + width / 70);\n}\n\nexport function shapeLabelOffsetY(shape: string, width: number, height: number) {\n\tswitch (shape.toLowerCase()) {\n\t\tcase \"cylinder\":\n\t\t\treturn 2 * cylinderRadiusY(width);\n\t\tcase \"person\":\n\t\t\treturn height * 0.4;\n\t\tcase \"folder\":\n\t\t\treturn width / 10;\n\t\tcase \"robot\":\n\t\t\treturn height * 0.35;\n\t\tcase \"webbrowser\":\n\t\t\treturn height / 8;\n\t\tdefault:\n\t\t\treturn 0;\n\t}\n}\n\nclass D3Element {\n\tprivate readonly _el: SVGElement\n\n\tconstructor(el: SVGElement) {\n\t\tthis._el = el;\n\t}\n\n\tnode() {\n\t\treturn this._el;\n\t}\n\n\tattr(name: string, value: string | number) {\n\t\tthis._el.setAttribute(name, String(value))\n\t\treturn this;\n\t}\n\n\tinsert(type: string, pos: string) {\n\t\tconst el = document.createElementNS('http://www.w3.org/2000/svg', type)\n\t\tconst el2 = this._el.insertBefore(el, this._el.querySelector(pos))\n\t\treturn new D3Element(el2)\n\t}\n}\n\n\nfunction rect(parent: D3Element, bbox: BBox, node: D3Node, rounded = false) {\n\tconst shapeSvg = parent.insert(\"rect\", \":first-child\")\n\t\t.attr(\"rx\", rounded ? node.width / 8 : 3)\n\t\t.attr(\"ry\", rounded ? node.width / 8 : 3)\n\t\t.attr(\"x\", -bbox.width / 2)\n\t\t.attr(\"y\", -bbox.height / 2)\n\t\t.attr(\"width\", bbox.width)\n\t\t.attr(\"height\", bbox.height);\n\n\tnode.intersect = function (point) {\n\t\treturn intersectRect(node, point);\n\t};\n\n\treturn shapeSvg;\n}\n\n\nfunction cylinder(parent: D3Element, bbox: BBox, node: D3Node) {\n\tconst w = bbox.width;\n\tconst rx = w / 2;\n\tconst ry = cylinderRadiusY(w);\n\tconst h = bbox.height;\n\n\tconst shape =\n\t\t`M 0,${ry} a${rx},${ry} 0,0,0 ${w} 0 a ${rx},${ry} 0,0,0 ${-w} 0 l 0,${h - 2 * ry} a ${rx},${ry} 0,0,0 ${w} 0 l 0,${-h + 2 * ry}`;\n\n\tconst shapeSvg = parent\n\t\t.attr('label-offset-y', shapeLabelOffsetY(\"cylinder\", w, h))\n\t\t.insert('path', ':first-child')\n\t\t.attr('d', shape)\n\t\t.attr('transform', 'translate(' + -w / 2 + ',' + -(h / 2) + ')');\n\n\tnode.intersect = function (point: Point) {\n\t\tconst pos = intersectRect(node, point)\n\t\tlet cy = node.y + node.height / 2 - ry\n\t\tif (pos.y > cy)\n\t\t\treturn intersectEllipse({x: node.x, y: cy}, rx, ry, node, point)\n\n\t\tcy = node.y - node.height / 2 + ry\n\t\tif (pos.y < cy)\n\t\t\treturn intersectEllipse({x: node.x, y: cy}, rx, ry, node, point)\n\n\t\treturn pos;\n\t};\n\n\treturn shapeSvg;\n}\n\nfunction person(parent: D3Element, bbox: BBox, node: D3Node) {\n\tconst w = bbox.width;\n\tconst h = bbox.height;\n\n\tconst shape =\n\t\t`M ${.38 * w},${h / 3} A${w / 2},${h / 2} 0,0,0 0 ${h / 2}\n\t\tL${w / 11},${h} L${w - w / 11},${h} L${w},${h / 2}\n\t\tA${w / 2},${h / 2} 0,0,0 ${w - .38 * w} ${h / 3} \n\t\tA${w / 6},${w / 6} 0,1,0 ${.38 * w} ${h / 3}`;\n\n\tconst shapeSvg = parent\n\t\t.attr('label-offset-y', shapeLabelOffsetY(\"person\", w, h))\n\t\t.insert('path', ':first-child')\n\t\t.attr('d', shape)\n\t\t.attr('transform', 'translate(' + -w / 2 + ',' + -(h / 2) + ')');\n\n\tnode.intersect = function (point: Point) {\n\t\tconst pos = intersectRect(node, point)\n\t\treturn pos;\n\t};\n\n\treturn shapeSvg;\n}\n\nfunction _ellipse(parent: D3Element, bbox: BBox, node: D3Node, rx: number, ry: number) {\n\tconst shapeSvg = parent.insert(\"ellipse\", \":first-child\")\n\t\t.attr(\"cx\", 0)\n\t\t.attr(\"cy\", 0)\n\t\t.attr('rx', rx)\n\t\t.attr('ry', ry)\n\t\t.attr(\"width\", node.width)\n\t\t.attr(\"height\", node.height);\n\n\tnode.intersect = function (point) {\n\t\treturn intersectEllipse(node, rx, ry, node, point)\n\t};\n\treturn shapeSvg;\n}\n\nfunction circle(parent: D3Element, bbox: BBox, node: D3Node) {\n\treturn _ellipse(parent, bbox, node, node.width / 2, node.width / 2)\n}\n\nfunction ellipse(parent: D3Element, bbox: BBox, node: D3Node) {\n\treturn _ellipse(parent, bbox, node, node.width * .55, node.width * .45)\n}\n\nfunction hexagon(parent: D3Element, bbox: BBox, node: D3Node) {\n\tconst sz = node.width / 2\n\t// drawing a hexagon from polar coords\n\t// [0,1,2,3,4,5,6].map(i=>`${Math.sin(Math.PI/3*i+Math.PI/6).toFixed(4)},${Math.cos(Math.PI/3*i+Math.PI/6).toFixed(4)}`).join(',')\n\tconst shapeSvg = parent.insert(\"polygon\", \":first-child\")\n\t\t.attr(\"points\",\n\t\t\t[0.5000, 0.8660, 1.0000, 0.0000, 0.5000, -0.8660, -0.5000, -0.8660, -1.0000, -0.0000, -0.5000, 0.8660, 0.5000, 0.8660].map(n => n * sz).join(','))\n\t\t.attr(\"width\", node.width)\n\t\t.attr(\"height\", node.height);\n\n\tnode.intersect = function (point) {\n\t\treturn intersectEllipse(node, node.width / 2, node.width / 2, node, point)\n\t};\n\treturn shapeSvg;\n}\n\nfunction component(parent: D3Element, bbox: BBox, node: D3Node) {\n\tconst dx = node.width / 10\n\tconst shapeSvg = parent.insert('g', ':first-child')\n\tshapeSvg.insert(\"rect\", \":first-child\")\n\t\t.attr(\"rx\", 3).attr(\"ry\", 3)\n\t\t.attr(\"x\", -node.width / 2 - dx)\n\t\t.attr(\"y\", -node.height / 2 + dx)\n\t\t.attr(\"width\", dx * 2)\n\t\t.attr(\"height\", dx);\n\tshapeSvg.insert(\"rect\", \":first-child\")\n\t\t.attr(\"rx\", 3).attr(\"ry\", 3)\n\t\t.attr(\"x\", -node.width / 2 - dx)\n\t\t.attr(\"y\", -node.height / 2 + dx * 2.5)\n\t\t.attr(\"width\", dx * 2)\n\t\t.attr(\"height\", dx);\n\tshapeSvg.insert(\"rect\", \":first-child\")\n\t\t.attr(\"rx\", 3).attr(\"ry\", 3)\n\t\t.attr(\"x\", -node.width / 2)\n\t\t.attr(\"y\", -node.height / 2)\n\t\t.attr(\"width\", node.width)\n\t\t.attr(\"height\", node.height);\n\n\tnode.intersect = function (point) {\n\t\treturn intersectRect({x: node.x - dx / 2, y: node.y, width: node.width + dx, height: node.height}, point);\n\t};\n\n\treturn shapeSvg;\n}\n\nfunction folder(parent: D3Element, bbox: BBox, node: D3Node) {\n\tconst dy = node.width / 20\n\tconst shapeSvg = parent\n\t\t.attr('label-offset-y', shapeLabelOffsetY(\"folder\", node.width, node.height))\n\t\t.insert('g', ':first-child')\n\tshapeSvg.insert(\"rect\", \":first-child\")\n\t\t.attr(\"rx\", 3).attr(\"ry\", 3)\n\t\t.attr(\"x\", -node.width / 2)\n\t\t.attr(\"y\", -node.height / 2 + dy * 2)\n\t\t.attr(\"width\", node.width)\n\t\t.attr(\"height\", node.height - dy * 2);\n\tshapeSvg.insert(\"path\", \":first-child\")\n\t\t.attr('d', `M0,${-node.height / 2 + 2 * dy} l${dy},${-2 * dy} h${node.width / 2 - dy * 2} v${dy * 2}`)\n\n\tnode.intersect = function (point) {\n\t\treturn intersectRect({x: node.x, y: node.y + dy / 2, width: node.width, height: node.height + dy}, point);\n\t};\n\n\treturn shapeSvg;\n}\n\nfunction mobiledevicelandscape(parent: D3Element, bbox: BBox, node: D3Node, rounded = false) {\n\tconst dx = node.width / 8\n\tconst r = node.width / 14\n\tconst shapeSvg = parent.insert('g', ':first-child')\n\tshapeSvg.insert('path', ':first-child')\n\t\t.attr('d', `M${-node.width / 2},${-node.height / 2} l0,${node.height} M${node.width / 2},${-node.height / 2} l0,${node.height}`)\n\tshapeSvg.insert('circle', ':first-child')\n\t\t.attr('cx', -node.width / 2 - dx / 2)\n\t\t.attr('cy', 0)\n\t\t.attr('r', r * .4)\n\tshapeSvg.insert('rect', ':first-child')\n\t\t.attr('x', node.width / 2 + dx / 2 - r * .2)\n\t\t.attr('y', -r)\n\t\t.attr('width', r * .4)\n\t\t.attr('height', r * 2)\n\tshapeSvg.insert(\"rect\", \":first-child\")\n\t\t.attr(\"rx\", r)\n\t\t.attr(\"ry\", r)\n\t\t.attr(\"x\", -bbox.width / 2 - dx)\n\t\t.attr(\"y\", -bbox.height / 2)\n\t\t.attr(\"width\", bbox.width + 2 * dx)\n\t\t.attr(\"height\", bbox.height);\n\n\tnode.intersect = function (point) {\n\t\treturn intersectRect({x: node.x, y: node.y, width: node.width + 2 * dx, height: node.height}, point);\n\t};\n\n\treturn shapeSvg;\n}\n\nfunction mobiledeviceportrait(parent: D3Element, bbox: BBox, node: D3Node) {\n\tconst dy = node.width / 8\n\tconst r = node.width / 14\n\tconst shapeSvg = parent.insert('g', ':first-child')\n\tshapeSvg.insert('path', ':first-child')\n\t\t.attr('d', `M${-node.width / 2},${-node.height / 2} l${node.width},0 M${-node.width / 2},${node.height / 2} l${node.width},0`)\n\tshapeSvg.insert('circle', ':first-child')\n\t\t.attr('cx', 0)\n\t\t.attr('cy', node.height / 2 + dy / 2)\n\t\t.attr('r', r * .4)\n\tshapeSvg.insert('rect', ':first-child')\n\t\t.attr('x', -r)\n\t\t.attr('y', -node.height / 2 - dy / 2 - r * .2)\n\t\t.attr('width', r * 2)\n\t\t.attr('height', r * .4)\n\tshapeSvg.insert(\"rect\", \":first-child\")\n\t\t.attr(\"rx\", r)\n\t\t.attr(\"ry\", r)\n\t\t.attr(\"x\", -bbox.width / 2)\n\t\t.attr(\"y\", -bbox.height / 2 - dy)\n\t\t.attr(\"width\", bbox.width)\n\t\t.attr(\"height\", bbox.height + 2 * dy);\n\n\tnode.intersect = function (point) {\n\t\treturn intersectRect({x: node.x, y: node.y, width: node.width, height: node.height + 2 * dy}, point);\n\t};\n\n\treturn shapeSvg;\n}\n\nfunction pipe(parent: D3Element, bbox: BBox, node: D3Node) {\n\tconst w = node.width;\n\tconst h = node.height;\n\tconst ry = h / 2;\n\tconst rx = ry / (2.5 + w / 70);\n\n\tconst shape =\n\t\t`M${-rx},0\n\t\ta${rx},${ry} 0,0,1 0,${h}\n\t\ta${rx},${ry} 0,0,1 0,${-h}\n\t\tl${w},0\n\t\ta${rx},${ry} 0,0,1 0,${h}\n\t\tl${-w},0`;\n\n\tconst shapeSvg = parent\n\t\t.insert('path', ':first-child')\n\t\t.attr('d', shape)\n\t\t.attr('transform', 'translate(' + -w / 2 + ',' + -(h / 2) + ')');\n\n\tnode.intersect = function (point: Point) {\n\t\treturn intersectRect({x: node.x - rx, y: node.y, width: node.width + 2 * rx, height: node.height}, point)\n\t};\n\n\treturn shapeSvg;\n}\n\nfunction robot(parent: D3Element, bbox: BBox, node: D3Node) {\n\tconst w = node.width\n\tconst h = node.height\n\t\n\t// Small head at top (like person shape but robot-styled)\n\tconst headSize = Math.min(w * 0.28, h * 0.25)\n\tconst headR = headSize * 0.2\n\tconst antennaH = headSize * 0.25\n\tconst antennaR = headSize * 0.08\n\t\n\t// Eye dimensions\n\tconst eyeR = headSize * 0.12\n\tconst eyeSpacing = headSize * 0.22\n\t\n\t// Ear dimensions \n\tconst earW = headSize * 0.12\n\tconst earH = headSize * 0.3\n\t\n\t// Body fills most of the space for text\n\tconst bodyW = w\n\tconst bodyTop = -h / 2 + antennaH + headSize\n\tconst bodyH = h - antennaH - headSize\n\tconst bodyR = 3\n\t\n\tconst shapeSvg = parent\n\t\t.attr('label-offset-y', shapeLabelOffsetY(\"robot\", w, h))\n\t\t.insert('g', ':first-child')\n\t\n\t// Body - main rectangle for text (draw first so it's behind)\n\tshapeSvg.insert(\"rect\", \":first-child\")\n\t\t.attr(\"rx\", bodyR)\n\t\t.attr(\"ry\", bodyR)\n\t\t.attr('x', -bodyW / 2)\n\t\t.attr('y', bodyTop)\n\t\t.attr('width', bodyW)\n\t\t.attr('height', bodyH)\n\t\n\t// Head\n\tconst headTop = -h / 2 + antennaH\n\tshapeSvg.insert(\"rect\", \":first-child\")\n\t\t.attr(\"rx\", headR)\n\t\t.attr(\"ry\", headR)\n\t\t.attr('x', -headSize / 2)\n\t\t.attr('y', headTop)\n\t\t.attr('width', headSize)\n\t\t.attr('height', headSize)\n\t\n\t// Antenna\n\tshapeSvg.insert(\"line\", \":first-child\")\n\t\t.attr('class', 'robot-antenna')\n\t\t.attr('x1', 0)\n\t\t.attr('y1', headTop)\n\t\t.attr('x2', 0)\n\t\t.attr('y2', -h / 2 + antennaR * 2)\n\t\t.attr('stroke-width', antennaR * 0.6)\n\t\t.attr('stroke-linecap', 'round')\n\t\n\t// Antenna ball\n\tshapeSvg.insert(\"circle\", \":first-child\")\n\t\t.attr('class', 'robot-antenna-ball')\n\t\t.attr('cx', 0)\n\t\t.attr('cy', -h / 2 + antennaR * 2)\n\t\t.attr('r', antennaR * 1.2)\n\t\n\t// Eyes\n\tconst eyeY = headTop + headSize * 0.4\n\tshapeSvg.insert(\"circle\", \":first-child\")\n\t\t.attr('class', 'robot-eye')\n\t\t.attr('cx', -eyeSpacing)\n\t\t.attr('cy', eyeY)\n\t\t.attr('r', eyeR)\n\tshapeSvg.insert(\"circle\", \":first-child\")\n\t\t.attr('class', 'robot-eye')\n\t\t.attr('cx', eyeSpacing)\n\t\t.attr('cy', eyeY)\n\t\t.attr('r', eyeR)\n\t\n\t// Mouth - simple smile\n\tconst mouthY = headTop + headSize * 0.7\n\tconst mouthW = headSize * 0.28\n\tshapeSvg.insert(\"path\", \":first-child\")\n\t\t.attr('class', 'robot-mouth')\n\t\t.attr('d', `M${-mouthW / 2},${mouthY} Q0,${mouthY + mouthW * 0.3} ${mouthW / 2},${mouthY}`)\n\t\t.attr('fill', 'none')\n\t\t.attr('stroke-width', antennaR * 0.5)\n\t\t.attr('stroke-linecap', 'round')\n\t\n\t// Ears\n\tshapeSvg.insert(\"rect\", \":first-child\")\n\t\t.attr(\"rx\", earW * 0.25)\n\t\t.attr(\"ry\", earW * 0.25)\n\t\t.attr('x', -headSize / 2 - earW - 1)\n\t\t.attr('y', eyeY - earH / 2)\n\t\t.attr('width', earW)\n\t\t.attr('height', earH)\n\tshapeSvg.insert(\"rect\", \":first-child\")\n\t\t.attr(\"rx\", earW * 0.25)\n\t\t.attr(\"ry\", earW * 0.25)\n\t\t.attr('x', headSize / 2 + 1)\n\t\t.attr('y', eyeY - earH / 2)\n\t\t.attr('width', earW)\n\t\t.attr('height', earH)\n\n\tnode.intersect = function (point) {\n\t\treturn intersectRect(node, point);\n\t};\n\n\treturn shapeSvg;\n}\n\nfunction webbrowser(parent: D3Element, bbox: BBox, node: D3Node) {\n\tconst dy = node.height / 8\n\tconst shapeSvg = parent\n\t\t.attr('label-offset-y', shapeLabelOffsetY(\"webbrowser\", node.width, node.height))\n\t\t.insert('g', ':first-child')\n\tshapeSvg.insert(\"path\", \":first-child\")\n\t\t.attr('d', `\n\t\t\tM${-node.width / 2},${-node.height / 2 + dy} h${node.width}\n\t\t\tM${-node.width / 2 + dy / 4},${-node.height / 2 + dy / 4} h${dy / 2} v${dy / 2} h${-dy / 2} z\n\t\t\tM${-node.width / 2 + dy},${-node.height / 2 + dy / 4} h${node.width - dy - dy / 4} v${dy / 2} h${-node.width + dy + dy / 4} z\n\t\t`)\n\tshapeSvg.insert(\"rect\", \":first-child\")\n\t\t.attr(\"rx\", 3).attr(\"ry\", 3)\n\t\t.attr(\"x\", -node.width / 2)\n\t\t.attr(\"y\", -node.height / 2)\n\t\t.attr(\"width\", node.width)\n\t\t.attr(\"height\", node.height);\n\n\tnode.intersect = function (point) {\n\t\treturn intersectRect(node, point);\n\t};\n\n\treturn shapeSvg;\n}\n\nexport const shapes: { [key: string]: (parent: SVGElement, node: D3Node) => SVGElement } = {\n\tbox: (parent: SVGElement, node: D3Node) => rect(new D3Element(parent), node, node).node(),\n\troundedbox: (parent: SVGElement, node: D3Node) => rect(new D3Element(parent), node, node, true).node(),\n\tcomponent: (parent: SVGElement, node: D3Node) => component(new D3Element(parent), node, node).node(),\n\tcylinder: (parent: SVGElement, node: D3Node) => cylinder(new D3Element(parent), node, node).node(),\n\tperson: (parent: SVGElement, node: D3Node) => person(new D3Element(parent), node, node).node(),\n\tcircle: (parent: SVGElement, node: D3Node) => circle(new D3Element(parent), node, node).node(),\n\tellipse: (parent: SVGElement, node: D3Node) => ellipse(new D3Element(parent), node, node).node(),\n\thexagon: (parent: SVGElement, node: D3Node) => hexagon(new D3Element(parent), node, node).node(),\n\tfolder: (parent: SVGElement, node: D3Node) => folder(new D3Element(parent), node, node).node(),\n\tmobiledevicelandscape: (parent: SVGElement, node: D3Node) => mobiledevicelandscape(new D3Element(parent), node, node).node(),\n\tmobiledeviceportrait: (parent: SVGElement, node: D3Node) => mobiledeviceportrait(new D3Element(parent), node, node).node(),\n\tmobiledevice: (parent: SVGElement, node: D3Node) => mobiledeviceportrait(new D3Element(parent), node, node).node(),\n\tpipe: (parent: SVGElement, node: D3Node) => pipe(new D3Element(parent), node, node).node(),\n\trobot: (parent: SVGElement, node: D3Node) => robot(new D3Element(parent), node, node).node(),\n\twebbrowser: (parent: SVGElement, node: D3Node) => webbrowser(new D3Element(parent), node, node).node(),\n}\n","/**\n * Undo functionality\n * at every change in the document, Undo can save a new version\n * so the user can \"undo\" and \"redo\" changes by reverting to an\n * older version of the document\n */\n\nexport class Undo {\n\tprivate readonly versions: Doc[] = [];\n\tprivate pos: number = 0;\n\tprivate lastSavedPos: number = 0;\n\tprivate readonly exportDoc: () => Doc;\n\tprivate readonly importDoc: (d: Doc) => void;\n\tchange: () => void;\n\tprivate tmpPreviousState: Doc | null = null;\n\n\tconstructor(id: string, exportDoc: () => Doc, importDoc: (d: Doc) => void) {\n\t\tthis.exportDoc = exportDoc;\n\t\tthis.importDoc = importDoc;\n\t\tthis.change = debounce(() => this.saveNow(), 300);\n\t}\n\n\t// Store the state previous to the changes collected in the debounce period\n\tbeforeChange() {\n\t\tif (!this.tmpPreviousState) {\n\t\t\tthis.tmpPreviousState = this.deepClone(this.exportDoc());\n\t\t}\n\t}\n\n\tlength() {\n\t\treturn this.versions.length;\n\t}\n\n\tcurrentState() {\n\t\treturn this.deepClone(this.versions[this.pos - 1]);\n\t}\n\n\tprivate saveNow() {\n\t\tif (!this.tmpPreviousState) {\n\t\t\tthrow Error(\"undo.change() was called without previously calling undo.beforeChange()!\");\n\t\t}\n\t\t\n\t\tthis.versions[this.pos] = this.deepClone(this.exportDoc());\n\t\tthis.versions[this.pos - 1] = this.tmpPreviousState;\n\t\tthis.tmpPreviousState = null;\n\t\tthis.pos += 1;\n\t\t\n\t\t// Remove anything that might be on top of this version\n\t\tthis.versions.splice(this.pos);\n\t}\n\n\tprivate deepClone(doc: Doc): Doc {\n\t\t// Use modern structuredClone if available, fallback to JSON\n\t\tif (typeof structuredClone !== 'undefined') {\n\t\t\treturn structuredClone(doc);\n\t\t}\n\t\treturn JSON.parse(JSON.stringify(doc));\n\t}\n\n\tundo() {\n\t\tif (this.pos < 2) return;\n\t\tthis.pos -= 1;\n\t\tconst doc = this.versions[this.pos - 1];\n\t\tthis.importDoc(this.deepClone(doc));\n\t}\n\n\tredo() {\n\t\tif (this.pos > this.versions.length - 1) return;\n\t\tconst doc = this.versions[this.pos];\n\t\tthis.importDoc(this.deepClone(doc));\n\t\tthis.pos += 1;\n\t}\n\n\tchanged() {\n\t\treturn this.pos !== this.lastSavedPos;\n\t}\n\n\tsetSaved() {\n\t\tthis.lastSavedPos = this.pos;\n\t}\n}\n\nfunction debounce(func: () => void, wait: number) {\n\tlet timeout: ReturnType;\n\treturn function () {\n\t\tconst context = this;\n\t\tconst later = function () {\n\t\t\ttimeout = null;\n\t\t\tfunc.apply(context);\n\t\t};\n\t\tclearTimeout(timeout);\n\t\ttimeout = setTimeout(later, wait);\n\t};\n}","// Constants and default configurations for the graph view\n\nexport interface Point {\n\tx: number;\n\ty: number;\n}\n\nexport interface BBox extends Point {\n\twidth: number;\n\theight: number;\n}\n\nexport interface NodeStyle {\n\t// Width of element, in pixels.\n\twidth?: number\n\t// Height of element, in pixels.\n\theight?: number\n\t// Background color of element as HTML RGB hex string (e.g. \"#ffffff\")\n\tbackground?: string\n\t// Stroke color of element as HTML RGB hex string (e.g. \"#000000\")\n\tstroke?: string\n\t// Foreground (text) color of element as HTML RGB hex string (e.g. \"#ffffff\")\n\tcolor?: string\n\t// Standard font size used to render text, in pixels.\n\tfontSize?: number\n\t// Shape used to render element.\n\tshape?: string\n\t// URL of PNG/JPG/GIF file or Base64 data URI representation.\n\ticon?: string\n\t// Type of border used to render element.\n\tborder?: string\n\t// Opacity used to render element; 0-100.\n\topacity?: number\n\t// Whether element metadata should be shown.\n\tmetadata?: boolean\n\t// Whether element description should be shown.\n\tdescription?: boolean\n}\n\nexport interface EdgeStyle {\n\t// Thickness of line, in pixels.\n\tthickness?: number\n\t// Color of line as HTML RGB hex string (e.g. \"#ffffff\").\n\tcolor?: string\n\t// Standard font size used to render relationship annotation, in pixels.\n\tfontSize?: number\n\t// Width of relationship annotation, in pixels.\n\twidth?: number\n\t// Whether line is dashed.\n\tdashed?: boolean\n\t// Position of label along edge (0-100).\n\tposition?: number\n\t// Opacity used to render relationship; 0-100.\n\topacity?: number\n\t// Arrow style for the edge.\n\tarrowStyle?: 'normal' | 'large' | 'small' | 'none'\n}\n\n// Default styles\nexport const DEFAULT_EDGE_STYLE: EdgeStyle = {\n\tthickness: 3,\n\tcolor: '#999',\n\topacity: 1,\n\tfontSize: 22,\n\tdashed: true,\n};\n\nexport const DEFAULT_NODE_STYLE: NodeStyle = {\n\twidth: 280,\n\theight: 180,\n\tbackground: 'rgba(255, 255, 255, .9)',\n\tcolor: '#666',\n\topacity: .9,\n\tstroke: '#999',\n\tfontSize: 22,\n\tshape: 'Box'\n};\n\n// SVG styles\nexport const SVG_STYLES = {\n\tnodeBorder: {\n\t\tfill: \"rgba(255, 255, 255, 0.86)\",\n\t\tstroke: \"#aaa\",\n\t\tfilter: 'url(#shadow)',\n\t},\n\tnodeText: {\n\t\t'font-family': 'Inter, -apple-system, BlinkMacSystemFont, sans-serif',\n\t\tstroke: \"none\"\n\t},\n\tedgeText: {\n\t\t'font-family': 'Inter, -apple-system, BlinkMacSystemFont, sans-serif',\n\t\tstroke: \"none\"\n\t},\n\tedgeRect: {\n\t\tfill: \"none\",\n\t\tstroke: \"none\",\n\t},\n\tgroupRect: {\n\t\tfill: \"rgba(0, 0, 0, 0.02)\",\n\t\tstroke: \"#666\",\n\t\t'stroke-width': 3,\n\t\t\"stroke-dasharray\": 4,\n\t},\n\tgroupText: {\n\t\tfill: \"#666\",\n\t\t\"font-size\": 22,\n\t\t\"font-weight\": \"500\",\n\t\t'font-family': 'Inter, -apple-system, BlinkMacSystemFont, sans-serif',\n\t\tcursor: \"default\"\n\t}\n};\n\n// Configuration constants\nexport const SVG_PADDING = 20;\nexport const DEFAULT_GRID_SIZE = 25;\nexport const EDGE_SPREAD_DISTANCE = 70;\nexport const EDGE_SPREAD_DISTANCE_X = 200;\n\n// Utility function to apply styles to SVG elements\nexport const applyStyle = (el: SVGElement, style: { [key: string]: string | number }) => {\n\tObject.keys(style).forEach(key => {\n\t\tconst value = style[key];\n\t\tif (typeof value === 'number') {\n\t\t\tel.style.setProperty(key, value.toString());\n\t\t} else {\n\t\t\tel.style.setProperty(key, value);\n\t\t}\n\t});\n};\n\n// Utility function to calculate distance between two points\nexport const calculateDistance = (p1: Point, p2: Point): number => {\n\treturn Math.sqrt((p2.x - p1.x) * (p2.x - p1.x) + (p2.y - p1.y) * (p2.y - p1.y));\n};","import {applyStyle, SVG_STYLES} from \"./constants\";\nimport {create} from \"./svg-create\";\nimport {svgTextWrap} from \"./svg-text\";\n\ninterface TextBlockLayout {\n\tlines: string[];\n\tfontSize: number;\n\tlineHeight: number;\n\tbold: boolean;\n\tfield?: string;\n\tgapAfter: number;\n}\n\nexport interface NodeContentLayout {\n\tblocks: TextBlockLayout[];\n\ttextHeight: number;\n\tminimumHeight: number;\n}\n\nconst HORIZONTAL_PADDING = 18;\nconst VERTICAL_PADDING = 18;\nconst TITLE_GAP = 6;\nconst METADATA_GAP = 10;\n\nfunction textBlock(\n\ttext: string,\n\twidth: number,\n\tfontSize: number,\n\tbold: boolean,\n\tgapAfter: number,\n\tfield?: string,\n): TextBlockLayout {\n\tconst attrs = {\n\t\t\"font-family\": String(SVG_STYLES.nodeText[\"font-family\"]),\n\t\t\"font-size\": `${fontSize}px`,\n\t\t\"font-weight\": bold ? \"bold\" : \"normal\",\n\t};\n\tconst wrapped = svgTextWrap(text, width, attrs);\n\tconst lines = wrapped.lines.length > 0 ? wrapped.lines : [\"\"];\n\n\treturn {\n\t\tlines,\n\t\tfontSize,\n\t\tlineHeight: fontSize + 2,\n\t\tbold,\n\t\tfield,\n\t\tgapAfter,\n\t};\n}\n\nexport function layoutNodeContent(\n\ttitle: string,\n\tsubtitle: string,\n\tdescription: string,\n\tnodeWidth: number,\n\tfontSize: number,\n): NodeContentLayout {\n\tconst textWidth = Math.max(nodeWidth - HORIZONTAL_PADDING * 2, 80);\n\tconst blocks = [\n\t\ttextBlock(title, textWidth, fontSize, true, TITLE_GAP, \"name\"),\n\t\ttextBlock(`[${subtitle}]`, textWidth, fontSize * 0.75, false, METADATA_GAP),\n\t\ttextBlock(description, textWidth, Math.min(fontSize * 0.8, 16), false, 0, \"description\"),\n\t];\n\tconst textHeight = blocks.reduce(\n\t\t(height, block) => height + block.lines.length * block.lineHeight + block.gapAfter,\n\t\t0,\n\t);\n\n\treturn {\n\t\tblocks,\n\t\ttextHeight,\n\t\tminimumHeight: textHeight + VERTICAL_PADDING * 2,\n\t};\n}\n\nexport function buildNodeContent(layout: NodeContentLayout, color?: string): SVGGElement {\n\tconst group = create.element(\"g\") as SVGGElement;\n\tlet top = -layout.textHeight / 2;\n\n\tlayout.blocks.forEach((block) => {\n\t\tconst text = create.text(\"\", {\"text-anchor\": \"middle\"});\n\t\tapplyStyle(text, SVG_STYLES.nodeText);\n\t\tif (color) {\n\t\t\ttext.setAttribute(\"fill\", color);\n\t\t}\n\t\tif (block.field) {\n\t\t\ttext.setAttribute(\"data-field\", block.field);\n\t\t}\n\n\t\tblock.lines.forEach((line, index) => {\n\t\t\tconst span = create.element(\"tspan\", {\n\t\t\t\tx: 0,\n\t\t\t\ty: top + block.fontSize + index * block.lineHeight,\n\t\t\t\t\"font-size\": `${block.fontSize}px`,\n\t\t\t\t\"font-weight\": block.bold ? \"bold\" : \"normal\",\n\t\t\t});\n\t\t\tspan.textContent = line;\n\t\t\ttext.append(span);\n\t\t});\n\n\t\tgroup.append(text);\n\t\ttop += block.lines.length * block.lineHeight + block.gapAfter;\n\t});\n\n\treturn group;\n}\n","import {defs} from \"./defs\";\nimport {create, setPosition} from \"./svg-create\";\nimport {cursorInteraction} from \"svg-editor-tools/lib/cursor-interaction\";\nimport {shapeLabelOffsetY, shapes} from \"./shapes\";\nimport {\n\tboxesOverlap,\n\tcabDistance,\n\tinsideBox,\n\tintersectPolylineBox,\n\tproject,\n\tscaleBox,\n\tSegment,\n\tuncenterBox\n} from \"./intersect\";\nimport {autoLayout, LayoutOptions} from \"./layout\";\nimport {Undo} from \"./undo\";\nimport {\n\tADD_LABEL_VERTEX,\n\tADD_VERTEX,\n\tDEL_VERTEX,\n\tDESELECT,\n\tfindShortcut,\n\tREDO,\n\tSELECT_ALL,\n\tUNDO,\n\tZOOM_100,\n\tZOOM_FIT,\n\tZOOM_IN,\n\tZOOM_OUT\n} from \"../shortcuts\";\nimport {\n\tPoint,\n\tBBox,\n\tNodeStyle,\n\tEdgeStyle,\n\tDEFAULT_EDGE_STYLE,\n\tDEFAULT_NODE_STYLE,\n\tSVG_STYLES,\n\tSVG_PADDING,\n\tDEFAULT_GRID_SIZE,\n\tapplyStyle,\n\tcalculateDistance\n} from \"./constants\";\nimport {\n\tcalculateEdgeVertices,\n\tcalculateLabelPlacement,\n\tcreateEdgeSegments,\n\tEdgeLabelPlacement\n} from \"./edge-utils\";\nimport {\n\tbuildNodeContent,\n\tlayoutNodeContent,\n\tNodeContentLayout\n} from \"./node-content\";\n\n\n// Point and BBox interfaces are now imported from constants\n\nexport interface Group extends BBox {\n\tid: string;\n\tname: string;\n\tnodes: (Node | Group)[];\n\tref?: SVGGElement;\n\tstyle: NodeStyle;\n}\n\nexport interface NodeLink {\n\thref: string;\n\texportHref: string;\n}\n\nexport type LayoutDirection = 'UP' | 'DOWN' | 'LEFT' | 'RIGHT';\n\nexport interface Node extends BBox {\n\tid: string;\n\ttitle: string;\n\tsub: string;\n\tdescription: string;\n\n\tref?: SVGGElement;\n\tselected?: boolean;\n\n\tintersect: (p: Point) => Point\n\n\tstyle: NodeStyle\n\tlink?: NodeLink\n\tcontentLayout: NodeContentLayout\n}\n\n// NodeStyle interface is now imported from constants\n\n// EdgeStyle interface is now imported from constants\n\n// Default styles are now imported from constants\nconst defaultEdgeStyle = DEFAULT_EDGE_STYLE;\nconst defaultNodeStyle = DEFAULT_NODE_STYLE;\n\n// Edge and EdgeVertex interfaces are now defined in edge-utils.ts\n// Using local interfaces for compatibility with existing code\ninterface Edge {\n\tid: string;\n\tlabel: string;\n\tfrom: Node;\n\tto: Node;\n\tvertices?: EdgeVertex[];\n\tref?: SVGGElement;\n\tstyle: EdgeStyle;\n\tinitVertex: (p: Point) => EdgeVertex;\n\tuserDeletedVertices?: boolean; // Track if user explicitly deleted vertices\n\tlabelVertex?: EdgeVertex; // ELK-calculated label position (separate from routing vertices)\n\tlabelBounds?: BBox;\n}\n\ninterface EdgeVertex extends Point {\n\tid: string\n\tselected?: boolean\n\tedge: Edge\n\tref?: SVGElement\n\tlabel?: boolean\n\tauto?: boolean\n}\n\ninterface Layout {\n\t[k: string]: Point | (Point & { label: boolean })[] | boolean\n}\n\nexport class GraphData {\n\tid: string;\n\tname: string;\n\tnodesMap: Map;\n\tedges: Edge[];\n\tedgeVertices: Map\n\tgroupsMap: Map;\n\tmetadata: any;\n\tlayoutDirection?: LayoutDirection;\n\tcolorToVarMap: Map = new Map(); // For CSS custom properties theming\n\tprivate _undo: Undo;\n\tprivate _gridVisible: boolean = false;\n\tprivate _snapToGrid: boolean = true;\n\tprivate _gridSize: number = 25;\n\tprivate _skipAutoFit: boolean = false;\n\n\tconstructor(id?: string, name?: string) {\n\t\tthis.id = id;\n\t\tthis.name = name;\n\n\t\tthis.edges = [];\n\t\tthis.edgeVertices = new Map;\n\t\tthis.nodesMap = new Map;\n\t\tthis.groupsMap = new Map;\n\n\t\tthis._undo = new Undo(\n\t\t\tthis.id,\n\t\t\t() => this.exportLayout(true),\n\t\t\t(lo) => this.importLayout(lo, true)\n\t\t)\n\n\t\t// @ts-ignore\n\t\twindow.graph = this\n\t}\n\n\t// after the graph model is build using addNode, addEdge etc, initialize\n\tinit(layout?: Layout) {\n\t\tlayout && this.importLayout(layout)\n\t\tthis._undo = new Undo(\n\t\t\tthis.id,\n\t\t\t() => this.exportLayout(true),\n\t\t\t(lo) => this.importLayout(lo, true)\n\t\t)\n\t\tif (this._undo.length()) {\n\t\t\tthis.importLayout(this._undo.currentState())\n\t\t}\n\t\t\n\t\t// Save initial state so first action is undoable\n\t\tthis._undo.beforeChange()\n\t\tthis._undo.change()\n\t}\n\n\taddNode(id: string, label: string, sub: string, description: string, style: NodeStyle, link?: NodeLink) {\n\t\tif (this.nodesMap.has(id)) throw Error('duplicate node: ' + id)\n\t\tconst nodeStyle = {...defaultNodeStyle, ...style};\n\t\tconst shape = (nodeStyle.shape || 'Box').toLowerCase();\n\t\tconst minimumWidth = 280;\n\t\tconst minimumHeight = shape === 'person' ? 240 : 180;\n\t\tconst width = Math.max(minimumWidth, nodeStyle.width || 0);\n\t\tconst fontSize = nodeStyle.fontSize || 22;\n\t\tconst contentLayout = layoutNodeContent(label, sub, description, width, fontSize);\n\t\tlet height = Math.max(minimumHeight, nodeStyle.height || 0, contentLayout.minimumHeight);\n\n\t\t// Some shapes shift labels down to reserve visual space for an icon,\n\t\t// header, or curved edge. Grow until the shifted content also fits.\n\t\tfor (let i = 0; i < 20; i++) {\n\t\t\tconst requiredHeight = contentLayout.minimumHeight +\n\t\t\t\tMath.abs(shapeLabelOffsetY(shape, width, height));\n\t\t\tif (requiredHeight <= height + 0.1) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\theight = requiredHeight;\n\t\t}\n\n\t\tconst n: Node = {\n\t\t\tid, title: label, sub, description, style: nodeStyle,\n\t\t\tx: 0, y: 0, width, height, intersect: null, link, contentLayout\n\t\t}\n\t\tthis.nodesMap.set(n.id, n)\n\t}\n\n\tnodes() {\n\t\treturn Array.from(this.nodesMap.values())\n\t}\n\n\taddEdge(id: string, fromNode: string, toNode: string, label: string, vertices: Point[], style: EdgeStyle) {\n\t\tvertices && vertices.forEach((p, i) => {\n\t\t\tconst v = p as EdgeVertex\n\t\t\tv.id = `v-${id}-${i}`\n\t\t\tthis.edgeVertices.set(v.id, v)\n\t\t})\n\t\t// Deterministic vertex IDs.\n\t\t//\n\t\t// `mdl svg` renders diagrams headlessly and saves the resulting SVG. If we\n\t\t// generate random vertex IDs, the SVG changes on every run even when the\n\t\t// underlying model and layout are unchanged. Use a stable hash instead.\n\t\tconst fnv1a36 = (input: string) => {\n\t\t\tlet h = 0x811c9dc5\n\t\t\tfor (let i = 0; i < input.length; i++) {\n\t\t\t\th ^= input.charCodeAt(i)\n\t\t\t\th = Math.imul(h, 0x01000193)\n\t\t\t}\n\t\t\treturn (h >>> 0).toString(36)\n\t\t}\n\t\tconst stableVertexID = (edgeID: string, p: Point) => {\n\t\t\tconst x = (p as any).x\n\t\t\tconst y = (p as any).y\n\t\t\treturn `v-${edgeID}-a-${fnv1a36(`${edgeID}:${x}:${y}`)}`\n\t\t}\n\t\tconst initVertex = (p: Point) => {\n\t\t\tconst v = p as EdgeVertex\n\t\t\tif (!v.id) {\n\t\t\t\tv.id = stableVertexID(edge.id, p)\n\t\t\t\tthis.edgeVertices.set(v.id, v)\n\t\t\t}\n\t\t\tv.edge = edge\n\t\t\treturn p as EdgeVertex\n\t\t}\n\t\tconst edge = {\n\t\t\tid,\n\t\t\tfrom: this.nodesMap.get(fromNode),\n\t\t\tto: this.nodesMap.get(toNode),\n\t\t\tlabel,\n\t\t\tvertices: null as EdgeVertex[],\n\t\t\tstyle: {...defaultEdgeStyle, ...style},\n\t\t\tinitVertex,\n\t\t\tuserDeletedVertices: false\n\t\t}\n\t\tthis.edges.push(edge)\n\t\tif (vertices) {\n\t\t\tedge.vertices = vertices.map(p => edge.initVertex(p))\n\t\t}\n\t}\n\n\taddGroup(id: string, name: string, nodesOrGroups: string[], style: NodeStyle) {\n\t\tif (this.groupsMap.has(id)) {\n\t\t\tconsole.error(`Group exists: ${id} ${name}`)\n\t\t\treturn\n\t\t}\n\t\tconst group: Group = {\n\t\t\tid, name, x: null, y: null, width: null, height: null,\n\t\t\tnodes: nodesOrGroups.map(k => {\n\t\t\t\tconst n = this.nodesMap.get(k) || this.groupsMap.get(k)\n\t\t\t\tif (!n) console.error(`Node or group ${k} not found for group ${id} \"${name}\"`)\n\t\t\t\treturn n\n\t\t\t}).filter(Boolean),\n\t\t\tstyle\n\t\t}\n\t\tthis.groupsMap.set(id, group)\n\t}\n\n\t// private rebuildNode(node: Node) {\n\t// \tconst p = node.ref.parentElement;\n\t// \tp.removeChild(node.ref)\n\t// \tnode.ref = buildNode(node, this)\n\t// \tp.appendChild(node.ref)\n\t// \tthis.redrawEdges(node)\n\t// \tthis.redrawGroups(node)\n\t// }\n\n\tsetNodeSelected(node: Node, selected: boolean) {\n\t\tnode.selected = selected\n\t\tselected ?\n\t\t\tnode.ref.classList.add('selected') :\n\t\t\tnode.ref.classList.remove('selected')\n\t\tthis.updateEdgesSel()\n\t}\n\n\tprivate updateEdgesSel() {\n\t\tthis.edges.forEach(e => {\n\t\t\tif (e.to.selected || e.from.selected) {\n\t\t\t\te.ref.classList.add('selected')\n\t\t\t} else {\n\t\t\t\te.ref.classList.remove('selected')\n\t\t\t}\n\t\t})\n\t}\n\n\tmoveNode(n: Node, x: number, y: number, disableSnap: boolean = false, skipUndo: boolean = false) {\n\t\tif (!n) return\n\t\t\n\t\t// Apply snap-to-grid if enabled and not explicitly disabled\n\t\tif (this._snapToGrid && !disableSnap) {\n\t\t\tconst snapped = this.snapToGrid(x, y);\n\t\t\tx = snapped.x;\n\t\t\ty = snapped.y;\n\t\t}\n\t\t\n\t\tif (n.x == x && n.y == y) return\n\t\t\n\t\tif (!skipUndo) {\n\t\t\tthis._undo.beforeChange()\n\t\t}\n\t\tn.x = x;\n\t\tn.y = y;\n\t\tsetPosition(n.ref, x, y)\n\t\tthis.redrawEdges(n);\n\t\tthis.redrawGroups(n)\n\t\tif (!skipUndo) {\n\t\t\tthis._undo.change()\n\t\t}\n\t}\n\n\tmoveEdgeVertex(v: EdgeVertex, x: number, y: number, disableSnap: boolean = false, skipUndo: boolean = false) {\n\t\t\n\t\tif (this._snapToGrid && !disableSnap) {\n\t\t\tconst snapped = this.snapToGrid(x, y);\n\t\t\tx = snapped.x;\n\t\t\ty = snapped.y;\n\t\t}\n\t\t// Use exact coordinates (no rounding needed with modern grid system)\n\t\t\n\t\tif (v.x == x && v.y == y) return\n\t\tif (!skipUndo) {\n\t\t\tthis._undo.beforeChange()\n\t\t}\n\t\tv.x = x;\n\t\tv.y = y;\n\t\tthis.redrawEdge(v.edge)\n\t\tif (!skipUndo) {\n\t\t\tthis._undo.change()\n\t\t}\n\t}\n\n\tmoveSelected(dx: number, dy: number, disableSnap: boolean = false) {\n\t\tthis.nodes().forEach(n => n.selected && this.moveNode(n, n.x + dx, n.y + dy, disableSnap, false))\n\t\tthis.edgeVertices.forEach(v => v.selected && this.moveEdgeVertex(v, v.x + dx, v.y + dy, disableSnap, false))\n\t}\n\n\tinsertEdgeVertex(edge: Edge, p: Point, pos: number, isLabel: boolean) {\n\t\tthis._undo.beforeChange()\n\t\tconst v = edge.initVertex(p)\n\t\tv.selected = true\n\t\tif (isLabel) { // when shift down, make it label position\n\t\t\tedge.vertices.forEach(v => v.label = false)\n\t\t\tv.label = true\n\t\t}\n\t\tedge.vertices.splice(pos - 1, 0, v)\n\t\tthis.redrawEdge(edge)\n\t\tthis._undo.change()\n\t}\n\n\tdeleteEdgeVertex(v: EdgeVertex) {\n\t\tthis._undo.beforeChange()\n\t\t\n\t\tconst index = v.edge.vertices.indexOf(v)\n\t\tif (index >= 0) {\n\t\t\tv.edge.vertices.splice(index, 1)\n\t\t\tthis.edgeVertices.delete(v.id)\n\t\t\t\n\t\t\t// Mark that user explicitly deleted vertices from this edge\n\t\t\tv.edge.userDeletedVertices = true\n\t\t}\n\t\t\n\t\tthis.redrawEdge(v.edge)\n\t\tthis._undo.change()\n\t}\n\n\tchanged() {\n\t\treturn this._undo.changed()\n\t}\n\n\tundo() {\n\t\tthis._undo.undo()\n\t}\n\n\tredo() {\n\t\tthis._undo.redo()\n\t}\n\n\t// moves the entire graph to be aligned top-left of the drawing area\n\t// used to bring back to visible the nodes that end up at negative coordinates\n\talignTopLeft() {\n\t\tconst contentBounds = this.calculateContentBounds()\n\t\tconst padding = 100 // Reasonable padding for viewport\n\t\t\n\t\tconst offsetX = -contentBounds.x + padding\n\t\tconst offsetY = -contentBounds.y + padding\n\t\t\n\t\t// Set flag to prevent React useEffect from calling fitToView during this operation\n\t\tthis._skipAutoFit = true\n\t\t\n\t\tthis._undo.beforeChange()\n\t\t\n\t\tthis.nodesMap.forEach(node => {\n\t\t\tthis.moveNode(node, node.x + offsetX, node.y + offsetY, true, true) // Disable snap and undo during reset\n\t\t})\n\t\t\n\t\tthis.edgeVertices.forEach(vertex => {\n\t\t\tthis.moveEdgeVertex(vertex, vertex.x + offsetX, vertex.y + offsetY, true, true) // Disable snap and undo during reset\n\t\t})\n\t\t\n\t\tthis._undo.change()\n\t\t\n\t\t// DON'T clear view state here - let resetPanTransform handle it to avoid React useEffect recursion\n\t}\n\t\n\t// Reset pan transform to (0,0) while preserving zoom\n\tresetPanTransform() {\n\t\tconst currentZoom = getZoom()\n\t\tconst zoomGroup = svg.querySelector('g.zoom') as SVGGElement\n\t\tif (zoomGroup) {\n\t\t\tzoomGroup.setAttribute('transform', `scale(${currentZoom}) translate(0, 0)`)\n\t\t\tupdatePanningOptimized(this)\n\t\t}\n\t\t\n\t\t// Clear view state so this reset is not overridden\n\t\tclearViewState(this.id)\n\t\t\n\t\t// Reset the skip auto fit flag after reset is complete\n\t\tthis._skipAutoFit = false\n\t}\n\t\n\t// Check if auto-fit should be skipped (used by React useEffect)\n\tshouldSkipAutoFit(): boolean {\n\t\treturn this._skipAutoFit\n\t}\n\n\t// Reset view to default state: 100% zoom, centered at origin\n\tresetView() {\n\t\tconst zoomGroup = svg.querySelector('g.zoom') as SVGGElement\n\t\tif (zoomGroup) {\n\t\t\t// Reset to 100% zoom, centered at origin\n\t\t\tzoomGroup.setAttribute('transform', 'scale(1) translate(0, 0)')\n\t\t\tupdatePanning()\n\t\t}\n\t\t\n\t\t// Clear any saved view state so this reset position is not overridden\n\t\tclearViewState(this.id)\n\t}\n\n\t//redraw connected edges\n\tprivate redrawEdges(n: Node) {\n\t\tthis.edges.forEach(e => (n == e.from || n == e.to) && this.redrawEdge(e))\n\t\tthis.updateEdgesSel()\n\t}\n\n\tredrawEdge(e: Edge) {\n\t\tconst p = e.ref.parentElement;\n\t\tp.removeChild(e.ref)\n\t\te.ref = buildEdge(this, e)\n\t\tp.append(e.ref)\n\t}\n\n\tprivate redrawGroups(node: Node) {\n\t\tthis.groupsMap.forEach(group => {\n\t\t\t//if (group.nodes.indexOf(node) == -1) return\n\t\t\tconst p = group.ref.parentElement\n\t\t\tp.removeChild(group.ref)\n\t\t\tbuildGroup(group)\n\t\t\tp.append(group.ref)\n\t\t})\n\t}\n\n\texportSVG() {\n\t\t// Get the original SVG\n\t\tconst originalSvg: SVGSVGElement = document.querySelector('svg#graph')\n\t\tconst elastic = originalSvg.querySelector('rect.elastic')\n\t\t\n\t\t// Clone the SVG for export (completely separate from the live one)\n\t\tconst exportSvg = originalSvg.cloneNode(true) as SVGSVGElement\n\n\t\t// Standalone SVGs navigate to sibling view files instead of editor routes.\n\t\texportSvg.querySelectorAll('a.nodeLink[data-export-href]').forEach(link => {\n\t\t\tlink.setAttribute('href', link.getAttribute('data-export-href') || '')\n\t\t\tlink.removeAttribute('data-export-href')\n\t\t})\n\t\t\n\t\t// Remove elastic element from export\n\t\tconst exportElastic = exportSvg.querySelector('rect.elastic')\n\t\tif (exportElastic) {\n\t\t\texportElastic.remove()\n\t\t}\n\t\t\n\t\t// Calculate actual content bounds including all elements\n\t\tconst contentBounds = this.calculateContentBounds()\n\t\t\n\t\t// Add padding around content\n\t\tconst padding = 50\n\t\t\n\t\t// Calculate final export dimensions (always positive)\n\t\tconst exportWidth = contentBounds.width + (padding * 2)\n\t\tconst exportHeight = contentBounds.height + (padding * 2)\n\t\t\n\t\t// Calculate offset to move content to start at (padding, padding) within the export area\n\t\tconst offsetX = -contentBounds.x + padding\n\t\tconst offsetY = -contentBounds.y + padding\n\t\t\n\t\t// Apply export positioning to the cloned SVG elements\n\t\tconst exportZoomGroup = exportSvg.querySelector('g.zoom') as SVGGElement\n\t\tif (exportZoomGroup) {\n\t\t\t// Reset zoom to 1 and apply offset transform to position content properly\n\t\t\texportZoomGroup.setAttribute('transform', `scale(1) translate(${offsetX}, ${offsetY})`)\n\t\t}\n\t\t\n\t\t// Set proper viewBox and dimensions for export - viewBox always starts at (0,0)\n\t\texportSvg.setAttribute('viewBox', `0 0 ${exportWidth} ${exportHeight}`)\n\t\texportSvg.setAttribute('width', String(exportWidth))\n\t\texportSvg.setAttribute('height', String(exportHeight))\n\t\t\n\t\t// Add required SVG namespace for browser compatibility\n\t\texportSvg.setAttribute('xmlns', 'http://www.w3.org/2000/svg')\n\t\t\n\t\t// Convert inline styles to CSS custom properties for theming support\n\t\tthis.convertStylesToCustomProperties(exportSvg)\n\t\t\n\t\t// Inject metadata with current layout\n\t\tconst script = document.createElement('script')\n\t\tscript.setAttribute('type', 'application/json')\n\t\tthis.metadata.layout = this.exportLayout()\n\t\tscript.append('')\n\t\texportSvg.insertBefore(script, exportSvg.firstChild)\n\t\t\n\t\t// Get the export SVG as string\n\t\tconst src = exportSvg.outerHTML\n\t\t\n\t\t// No restoration needed since we never touched the original SVG!\n\t\treturn src\n\t}\n\n\t// Convert inline fill/stroke attributes to CSS custom properties with fallbacks.\n\t// This enables theming: container pages can override colors via CSS variables.\n\tprivate convertStylesToCustomProperties(svg: SVGSVGElement) {\n\t\tif (this.colorToVarMap.size === 0) return\n\n\t\t// Process all elements with fill attribute\n\t\tsvg.querySelectorAll('[fill]').forEach(el => {\n\t\t\tconst fill = el.getAttribute('fill')\n\t\t\tif (fill && this.colorToVarMap.has(fill)) {\n\t\t\t\tel.setAttribute('fill', `var(${this.colorToVarMap.get(fill)}, ${fill})`)\n\t\t\t}\n\t\t})\n\n\t\t// Process all elements with stroke attribute\n\t\tsvg.querySelectorAll('[stroke]').forEach(el => {\n\t\t\tconst stroke = el.getAttribute('stroke')\n\t\t\tif (stroke && this.colorToVarMap.has(stroke)) {\n\t\t\t\tel.setAttribute('stroke', `var(${this.colorToVarMap.get(stroke)}, ${stroke})`)\n\t\t\t}\n\t\t})\n\t}\n\n\t// Calculate the actual bounds of all content including nodes, edges, and groups\n\tcalculateContentBounds(): BBox {\n\t\tlet minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity\n\t\t\n\t\t// Process nodes (including their actual dimensions)\n\t\tthis.nodes().forEach(node => {\n\t\t\tconst left = node.x - node.width / 2\n\t\t\tconst right = node.x + node.width / 2\n\t\t\tconst top = node.y - node.height / 2\n\t\t\tconst bottom = node.y + node.height / 2\n\t\t\t\n\t\t\tminX = Math.min(minX, left)\n\t\t\tmaxX = Math.max(maxX, right)\n\t\t\tminY = Math.min(minY, top)\n\t\t\tmaxY = Math.max(maxY, bottom)\n\t\t})\n\t\t\n\t\t// Process edge vertices (much faster than complex label calculations)\n\t\tthis.edgeVertices.forEach(vertex => {\n\t\t\tminX = Math.min(minX, vertex.x - 5)\n\t\t\tmaxX = Math.max(maxX, vertex.x + 5)\n\t\t\tminY = Math.min(minY, vertex.y - 5)\n\t\t\tmaxY = Math.max(maxY, vertex.y + 5)\n\t\t})\n\t\t\n\t\t// Process groups\n\t\tthis.groupsMap.forEach(group => {\n\t\t\tconst left = group.x - group.width / 2\n\t\t\tconst right = group.x + group.width / 2\n\t\t\tconst top = group.y - group.height / 2\n\t\t\tconst bottom = group.y + group.height / 2\n\t\t\t\n\t\t\tminX = Math.min(minX, left)\n\t\t\tmaxX = Math.max(maxX, right)\n\t\t\tminY = Math.min(minY, top)\n\t\t\tmaxY = Math.max(maxY, bottom)\n\t\t})\n\t\t\n\t\t// Process edges (simplified - just endpoints and vertices, skip complex label calculations)\n\t\tthis.edges.forEach(edge => {\n\t\t\t// Edge endpoints\n\t\t\tminX = Math.min(minX, edge.from.x - 10, edge.to.x - 10)\n\t\t\tmaxX = Math.max(maxX, edge.from.x + 10, edge.to.x + 10)\n\t\t\tminY = Math.min(minY, edge.from.y - 10, edge.to.y - 10)\n\t\t\tmaxY = Math.max(maxY, edge.from.y + 10, edge.to.y + 10)\n\t\t\t\n\t\t\t// Edge vertices (if any)\n\t\t\tif (edge.vertices) {\n\t\t\t\tedge.vertices.forEach(vertex => {\n\t\t\t\t\tminX = Math.min(minX, vertex.x - 10)\n\t\t\t\t\tmaxX = Math.max(maxX, vertex.x + 10)\n\t\t\t\t\tminY = Math.min(minY, vertex.y - 10)\n\t\t\t\t\tmaxY = Math.max(maxY, vertex.y + 10)\n\t\t\t\t})\n\t\t\t}\n\t\t\t\n\t\t\t// Simplified label bounds (avoid expensive path calculations)\n\t\t\tif (edge.label && edge.label.trim()) {\n\t\t\t\t// Just use approximate center between from and to nodes\n\t\t\t\tconst centerX = (edge.from.x + edge.to.x) / 2\n\t\t\t\tconst centerY = (edge.from.y + edge.to.y) / 2\n\t\t\t\tconst approxLabelSize = edge.label.length * 10 + 50 // Rough estimate\n\t\t\t\t\n\t\t\t\tminX = Math.min(minX, centerX - approxLabelSize)\n\t\t\t\tmaxX = Math.max(maxX, centerX + approxLabelSize)\n\t\t\t\tminY = Math.min(minY, centerY - 25)\n\t\t\t\tmaxY = Math.max(maxY, centerY + 25)\n\t\t\t}\n\t\t})\n\t\t\n\t\t// Handle empty graph\n\t\tif (minX === Infinity) {\n\t\t\treturn { x: 0, y: 0, width: 100, height: 100 }\n\t\t}\n\t\t\n\t\treturn {\n\t\t\tx: minX,\n\t\t\ty: minY,\n\t\t\twidth: maxX - minX,\n\t\t\theight: maxY - minY\n\t\t}\n\t}\n\n\n\n\t/**\n\t * @param full when true, the edges without vertices are saved too, used for undo buffer\n\t * for saving, full is false\n\t */\n\texportLayout(full = false) {\n\t\tconst ret: Layout = {}\n\t\tthis.nodes().forEach(n => ret[n.id] = {x: n.x, y: n.y})\n\t\tthis.edges.forEach(e => {\n\t\t\tif (!e.vertices) return\n\t\t\t// Save all vertices (both user and auto-generated), preserving their properties\n\t\t\tconst lst = e.vertices.map(v => ({\n\t\t\t\tx: v.x, \n\t\t\t\ty: v.y, \n\t\t\t\tlabel: v.label,\n\t\t\t\tauto: v.auto // Preserve auto flag so we know which are ELK-generated\n\t\t\t}));\n\t\t\tif (lst.length || full) {\n\t\t\t\tret[`e-${e.id}`] = lst\n\t\t\t}\n\t\t\t// Also save the userDeletedVertices flag as metadata\n\t\t\tif (e.userDeletedVertices) {\n\t\t\t\tret[`e-${e.id}-deleted`] = true\n\t\t\t}\n\t\t})\n\t\treturn ret\n\t}\n\n\tsetSaved() {\n\t\tthis._undo.setSaved()\n\t}\n\n\timportLayout(layout: { [key: string]: any }, rerender = false) {\n\t\t// First pass: collect all coordinate values to find bounds\n\t\tconst coordinates: Array<{x: number, y: number}> = [];\n\t\t\n\t\tObject.entries(layout).forEach(([k, v]) => {\n\t\t\tif (!k.startsWith('e-') && v.x !== undefined && v.y !== undefined) {\n\t\t\t\t// Node coordinates\n\t\t\t\tcoordinates.push({x: v.x, y: v.y});\n\t\t\t} else if (k.startsWith('e-') && Array.isArray(v)) {\n\t\t\t\t// Edge vertex coordinates\n\t\t\t\tv.forEach((vertex: any) => {\n\t\t\t\t\tif (vertex.x !== undefined && vertex.y !== undefined) {\n\t\t\t\t\t\tcoordinates.push({x: vertex.x, y: vertex.y});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\t\n\t\t// Calculate normalization offset if we have coordinates\n\t\tlet offsetX = 0;\n\t\tlet offsetY = 0;\n\t\t\n\t\tif (coordinates.length > 0) {\n\t\t\tconst minX = Math.min(...coordinates.map(c => c.x));\n\t\t\tconst minY = Math.min(...coordinates.map(c => c.y));\n\t\t\t\n\t\t\t// Only normalize if coordinates are problematic (negative or very large)\n\t\t\tif (minX < -100 || minY < -100 || Math.max(...coordinates.map(c => c.x)) > 3000 || Math.max(...coordinates.map(c => c.y)) > 2000) {\n\t\t\t\tconst padding = 50;\n\t\t\t\toffsetX = -minX + padding;\n\t\t\t\toffsetY = -minY + padding;\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Second pass: apply coordinates with normalization\n\t\tObject.entries(layout).forEach(([k, v]) => {\n\t\t\t// nodes\n\t\t\tconst n = this.nodesMap.get(k)\n\t\t\tif (n) {\n\t\t\t\tn.x = v.x + offsetX\n\t\t\t\tn.y = v.y + offsetY\n\t\t\t} else\n\t\t\t\t// edge vertices\n\t\t\tif (k.startsWith('e-') && !k.endsWith('-deleted')) {\n\t\t\t\tconst edge = this.edges.find(e => e.id == k.slice(2))\n\t\t\t\tif (!edge) return;\n\t\t\t\tedge.vertices && edge.vertices.forEach(v => this.edgeVertices.delete(v.id))\n\t\t\t\tedge.vertices = v.map((p: Point) => {\n\t\t\t\t\tconst normalizedPoint = { \n\t\t\t\t\t\tx: p.x + offsetX, \n\t\t\t\t\t\ty: p.y + offsetY \n\t\t\t\t\t} as Point;\n\t\t\t\t\t// Preserve any additional properties like 'label' and 'auto'\n\t\t\t\t\tObject.assign(normalizedPoint, p, { x: p.x + offsetX, y: p.y + offsetY });\n\t\t\t\t\tconst vertex = edge.initVertex(normalizedPoint);\n\t\t\t\t\t// Ensure auto flag is preserved after initVertex\n\t\t\t\t\tif ((p as any).auto) {\n\t\t\t\t\t\tvertex.auto = true;\n\t\t\t\t\t}\n\t\t\t\t\treturn vertex;\n\t\t\t\t})\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (k.endsWith('-deleted')) {\n\t\t\t\tconst edgeId = k.slice(2, -8); // Remove 'e-' prefix and '-deleted' suffix\n\t\t\t\tconst edge = this.edges.find(e => e.id == edgeId)\n\t\t\t\tif (edge && v === true) {\n\t\t\t\t\tedge.userDeletedVertices = true\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t})\n\t\tif (rerender) {\n\t\t\tthis.nodes().forEach(n => setPosition(n.ref, n.x, n.y))\n\t\t\tthis.edges.forEach(e => this.redrawEdge(e))\n\t\t\tthis.updateEdgesSel()\n\t\t\tthis.redrawGroups(null)\n\t\t}\n\t}\n\n\tasync autoLayout(options?: LayoutOptions) {\n\t\ttry {\n\t\t\tconst auto = await autoLayout(this, options)\n\t\t\t\n\t\t\tthis._undo.beforeChange()\n\t\t\t\n\t\t\t// Apply node positions\n\t\t\tauto.nodes.forEach(an => {\n\t\t\t\tconst n = this.nodesMap.get(an.id)\n\t\t\t\tif (n) {\n\t\t\t\t\tthis.moveNode(n, an.x, an.y, false, true) // Skip undo for individual moves\n\t\t\t\t}\n\t\t\t})\n\t\t\t\n\t\t\t// Apply edge routing from ELK layout\n\t\t\tauto.edges.forEach(ae => {\n\t\t\t\tconst edge = this.edges.find(e => e.id == ae.id)\n\t\t\t\tif (edge) {\n\t\t\t\t\t// Clear existing vertices for this edge only\n\t\t\t\t\tif (edge.vertices) {\n\t\t\t\t\t\tedge.vertices.forEach(v => {\n\t\t\t\t\t\t\tif (v.id) {\n\t\t\t\t\t\t\t\tthis.edgeVertices.delete(v.id)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t\tedge.vertices = []\n\t\t\t\t\tedge.userDeletedVertices = false\n\t\t\t\t\t\n\t\t\t\t\t// Add routing vertices from ELK (these are proper bend points, not nodes)\n\t\t\t\t\tif (ae.vertices && ae.vertices.length > 0) {\n\t\t\t\t\t\tedge.vertices = ae.vertices.map(p => {\n\t\t\t\t\t\t\tconst vertex = edge.initVertex(p)\n\t\t\t\t\t\t\tvertex.auto = true // Mark as auto-generated\n\t\t\t\t\t\t\treturn vertex\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t// Handle edge label positioning - create proper interactive label vertices\n\t\t\t\t\tif (ae.label) {\n\t\t\t\t\t\t\n\t\t\t\t\t\t// Remove any existing label vertices (ELK or user-created)\n\t\t\t\t\t\tif (edge.vertices) {\n\t\t\t\t\t\t\tedge.vertices.forEach(v => {\n\t\t\t\t\t\t\t\tif (v.label) {\n\t\t\t\t\t\t\t\t\tthis.edgeVertices.delete(v.id)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tedge.vertices = edge.vertices.filter(v => !v.label)\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t// Create a proper label vertex that behaves like a user-created vertex\n\t\t\t\t\t\tconst labelVertex = edge.initVertex(ae.label)\n\t\t\t\t\t\tlabelVertex.label = true\n\t\t\t\t\t\tlabelVertex.auto = true // Mark as auto-generated so it can be cleaned up\n\t\t\t\t\t\t\n\t\t\t\t\t\t// Insert label vertex at the optimal position in the routing path\n\t\t\t\t\t\t// Find the best position to insert it and project it onto that line segment\n\t\t\t\t\t\tedge.vertices = edge.vertices || []\n\t\t\t\t\t\tconst insertPos = findOptimalLabelPosition(edge.vertices, ae.label, edge.from, edge.to)\n\t\t\t\t\t\t\n\t\t\t\t\t\t// Project the label position onto the line segment where it will be inserted\n\t\t\t\t\t\tconst projectedPos = projectLabelOntoSegment(edge.vertices, ae.label, insertPos, edge.from, edge.to)\n\t\t\t\t\t\tlabelVertex.x = projectedPos.x\n\t\t\t\t\t\tlabelVertex.y = projectedPos.y\n\t\t\t\t\t\t\n\t\t\t\t\t\tedge.vertices.splice(insertPos, 0, labelVertex)\n\t\t\t\t\t\tthis.edgeVertices.set(labelVertex.id, labelVertex)\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t// Redraw the edge with new routing\n\t\t\t\t\tthis.redrawEdge(edge)\n\t\t\t\t}\n\t\t\t})\n\t\t\t\n\t\t\t// Fit the layout to the viewport with optimal positioning\n\t\t\tthis.fitToView()\n\t\t\t\n\t\t\tthis._undo.change()\n\t\t\t\n\t\t} catch (error) {\n\t\t\tconsole.error('Auto layout failed:', error)\n\t\t\t// Could show user notification here\n\t\t}\n\t}\n\n\talignSelectionV() {\n\t\tconst lst: Point[] = this.nodes().filter(n => n.selected)\n\t\tlst.push(...Array.from(this.edgeVertices.values()).filter(v => v.selected))\n\t\tlet minY = Math.min(...lst.map(p => p.y))\n\t\tthis.nodesMap.forEach(n => n.selected && this.moveNode(n, n.x, minY, false, false))\n\t\tthis.edgeVertices.forEach(v => v.selected && this.moveEdgeVertex(v, v.x, minY, false, false))\n\t}\n\n\talignSelectionH() {\n\t\tconst lst: Point[] = this.nodes().filter(n => n.selected)\n\t\tlst.push(...Array.from(this.edgeVertices.values()).filter(v => v.selected))\n\t\tlet minX = Math.min(...lst.map(p => p.x))\n\t\tthis.nodesMap.forEach(n => n.selected && this.moveNode(n, minX, n.y, false, false))\n\t\tthis.edgeVertices.forEach(v => v.selected && this.moveEdgeVertex(v, minX, v.y, false, false))\n\t}\n\n\tdistributeSelectionH() {\n\t\tconst selectedNodes = this.nodes().filter(n => n.selected)\n\t\tconst selectedVertices = Array.from(this.edgeVertices.values()).filter(v => v.selected)\n\t\t\n\t\tif (selectedNodes.length + selectedVertices.length < 3) return // Need at least 3 elements to distribute\n\t\t\n\t\tthis._undo.beforeChange()\n\t\t\n\t\t// Combine and sort by X coordinate\n\t\tconst allElements = [...selectedNodes, ...selectedVertices]\n\t\tallElements.sort((a, b) => a.x - b.x)\n\t\t\n\t\tconst minX = allElements[0].x\n\t\tconst maxX = allElements[allElements.length - 1].x\n\t\tconst spacing = (maxX - minX) / (allElements.length - 1)\n\t\t\n\t\t// Distribute elements evenly between leftmost and rightmost\n\t\tallElements.forEach((element, index) => {\n\t\t\tconst newX = minX + (index * spacing)\n\t\t\tif ('title' in element) {\n\t\t\t\t// It's a Node\n\t\t\t\tthis.moveNode(element as Node, newX, element.y, false, true)\n\t\t\t} else {\n\t\t\t\t// It's an EdgeVertex\n\t\t\t\tthis.moveEdgeVertex(element as EdgeVertex, newX, element.y, false, true)\n\t\t\t}\n\t\t})\n\t\t\n\t\tthis._undo.change()\n\t}\n\n\tdistributeSelectionV() {\n\t\tconst selectedNodes = this.nodes().filter(n => n.selected)\n\t\tconst selectedVertices = Array.from(this.edgeVertices.values()).filter(v => v.selected)\n\t\t\n\t\tif (selectedNodes.length + selectedVertices.length < 3) return // Need at least 3 elements to distribute\n\t\t\n\t\tthis._undo.beforeChange()\n\t\t\n\t\t// Combine and sort by Y coordinate\n\t\tconst allElements = [...selectedNodes, ...selectedVertices]\n\t\tallElements.sort((a, b) => a.y - b.y)\n\t\t\n\t\tconst minY = allElements[0].y\n\t\tconst maxY = allElements[allElements.length - 1].y\n\t\tconst spacing = (maxY - minY) / (allElements.length - 1)\n\t\t\n\t\t// Distribute elements evenly between topmost and bottommost\n\t\tallElements.forEach((element, index) => {\n\t\t\tconst newY = minY + (index * spacing)\n\t\t\tif ('title' in element) {\n\t\t\t\t// It's a Node\n\t\t\t\tthis.moveNode(element as Node, element.x, newY, false, true)\n\t\t\t} else {\n\t\t\t\t// It's an EdgeVertex\n\t\t\t\tthis.moveEdgeVertex(element as EdgeVertex, element.x, newY, false, true)\n\t\t\t}\n\t\t})\n\t\t\n\t\tthis._undo.change()\n\t}\n\n\t// Set edge selection state\n\tsetEdgeSelected(edge: Edge, selected: boolean) {\n\t\t// Mark the edge as selected by selecting its connected nodes\n\t\tif (selected) {\n\t\t\tthis.setNodeSelected(edge.from, true)\n\t\t\tthis.setNodeSelected(edge.to, true)\n\t\t}\n\t\t// Update visual selection\n\t\tthis.updateEdgesSel()\n\t}\n\n\t// Fit the entire graph to the current viewport\n\tfitToView() {\n\t\tconst contentBounds = this.calculateContentBounds()\n\t\t\n\t\t// Handle edge case where there's no content\n\t\tif (contentBounds.width === 0 || contentBounds.height === 0) {\n\t\t\treturn\n\t\t}\n\t\t\n\t\t// Get viewport dimensions\n\t\tconst viewportWidth = svg.parentElement?.clientWidth || 800\n\t\tconst viewportHeight = svg.parentElement?.clientHeight || 600\n\t\t\n\t\t// Add padding around content\n\t\tconst padding = 40\n\t\t\n\t\t// Calculate zoom to fit content with padding\n\t\tconst zoomX = (viewportWidth - padding * 2) / contentBounds.width\n\t\tconst zoomY = (viewportHeight - padding * 2) / contentBounds.height\n\t\tconst optimalZoom = Math.min(zoomX, zoomY)\n\t\t\n\t\t// Clamp zoom between reasonable bounds\n\t\tconst finalZoom = Math.max(Math.min(optimalZoom, 2), 0.1)\n\t\t\n\t\t// Calculate content center in drawing coordinates\n\t\tconst contentCenterX = contentBounds.x + contentBounds.width / 2\n\t\tconst contentCenterY = contentBounds.y + contentBounds.height / 2\n\t\t\n\t\t// Calculate viewport center in screen coordinates\n\t\tconst viewportCenterX = viewportWidth / 2\n\t\tconst viewportCenterY = viewportHeight / 2\n\t\t\n\t\t// Calculate translation needed to center content in viewport\n\t\t// With translate(x,y) scale(zoom), translation is in screen coordinates\n\t\tconst translateX = viewportCenterX - (contentCenterX * finalZoom)\n\t\tconst translateY = viewportCenterY - (contentCenterY * finalZoom)\n\t\t\n\t\t// Apply zoom and translation transform\n\t\tconst zoomGroup = svg.querySelector('g.zoom') as SVGGElement\n\t\tif (zoomGroup) {\n\t\t\tzoomGroup.setAttribute('transform', `translate(${translateX}, ${translateY}) scale(${finalZoom})`)\n\t\t}\n\t\t\n\t\t// Update panning\n\t\tupdatePanning()\n\t\t\n\t\t// Save view state so this fit position is preserved after reload\n\t\tsaveViewState(this.id)\n\t}\n\n\t// Save current layout state for restoration\n\tprivate saveLayoutState(): Layout {\n\t\treturn this.exportLayout(true) // Include all vertices for complete state\n\t}\n\n\t// Restore layout state\n\tprivate restoreLayoutState(state: Layout) {\n\t\tthis.importLayout(state, true) // Rerender after restoring\n\t}\n\n\t// Grid functionality\n\tisGridVisible(): boolean {\n\t\treturn this._gridVisible;\n\t}\n\n\tisSnapToGrid(): boolean {\n\t\treturn this._snapToGrid;\n\t}\n\n\tgetGridSize(): number {\n\t\treturn this._gridSize;\n\t}\n\n\ttoggleGrid() {\n\t\tthis._gridVisible = !this._gridVisible;\n\t\tthis.updateGridDisplay();\n\t\t// Force toolbar update by dispatching a custom event\n\t\twindow.dispatchEvent(new CustomEvent('gridStateChanged'));\n\t}\n\n\ttoggleSnapToGrid() {\n\t\tthis._snapToGrid = !this._snapToGrid;\n\t\t// Force toolbar update by dispatching a custom event\n\t\twindow.dispatchEvent(new CustomEvent('gridStateChanged'));\n\t}\n\n\tsnapAllToGrid() {\n\t\tif (!this._snapToGrid) return;\n\t\t\n\t\tthis._undo.beforeChange();\n\t\tthis.nodes().forEach(node => {\n\t\t\tconst snappedX = Math.round(node.x / this._gridSize) * this._gridSize;\n\t\t\tconst snappedY = Math.round(node.y / this._gridSize) * this._gridSize;\n\t\t\tthis.moveNode(node, snappedX, snappedY, false, true);\n\t\t});\n\t\tthis._undo.change();\n\t}\n\n\t// Helper method to snap a point to grid\n\tprivate snapToGrid(x: number, y: number): { x: number, y: number } {\n\t\treturn {\n\t\t\tx: Math.round(x / this._gridSize) * this._gridSize,\n\t\t\ty: Math.round(y / this._gridSize) * this._gridSize\n\t\t};\n\t}\n\n\tupdateGridDisplay() {\n\t\tif (!svg) return;\n\n\t\t// Remove existing grid pattern and background\n\t\tconst existingGrid = svg.querySelector('#grid-pattern');\n\t\tif (existingGrid) {\n\t\t\texistingGrid.remove();\n\t\t}\n\n\t\tconst existingGridRect = svg.querySelector('#grid-background');\n\t\tif (existingGridRect) {\n\t\t\texistingGridRect.remove();\n\t\t}\n\n\t\tif (!this._gridVisible) return;\n\n\t\t// Create grid pattern in defs\n\t\tlet defs = svg.querySelector('defs');\n\t\tif (!defs) {\n\t\t\tdefs = document.createElementNS('http://www.w3.org/2000/svg', 'defs');\n\t\t\tsvg.insertBefore(defs, svg.firstChild);\n\t\t}\n\n\t\tconst pattern = document.createElementNS('http://www.w3.org/2000/svg', 'pattern');\n\t\tpattern.id = 'grid-pattern';\n\t\tpattern.setAttribute('width', this._gridSize.toString());\n\t\tpattern.setAttribute('height', this._gridSize.toString());\n\t\tpattern.setAttribute('patternUnits', 'userSpaceOnUse');\n\n\t\tconst path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n\t\tpath.setAttribute('d', `M ${this._gridSize} 0 L 0 0 0 ${this._gridSize}`);\n\t\tpath.setAttribute('fill', 'none');\n\t\tpath.setAttribute('stroke', '#d0d0d0');\n\t\tpath.setAttribute('stroke-width', '1');\n\t\tpath.setAttribute('opacity', '0.8');\n\n\t\tpattern.appendChild(path);\n\t\tdefs.appendChild(pattern);\n\n\t\t// Create grid background rectangle\n\t\tconst rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');\n\t\trect.id = 'grid-background';\n\t\trect.setAttribute('x', '-10000');\n\t\trect.setAttribute('y', '-10000');\n\t\trect.setAttribute('width', '20000');\n\t\trect.setAttribute('height', '20000');\n\t\trect.setAttribute('fill', 'url(#grid-pattern)');\n\t\trect.setAttribute('pointer-events', 'none');\n\n\t\t// Insert grid as first child of zoom group so it transforms with content\n\t\tconst zoomGroup = svg.querySelector('g.zoom');\n\t\tif (zoomGroup) {\n\t\t\tzoomGroup.insertBefore(rect, zoomGroup.firstChild);\n\t\t}\n\t}\n}\n\nfunction escapeCdata(code: string) {\n\treturn code.replace(/]]>/g, ']]]>]> clickListener(e))\n\t// addCursorInteraction(svg) // Call will be updated in buildGraph\n}\nsvg.setAttribute('width', '100%')\nsvg.setAttribute('height', '100%')\n\nlet clickListener: (e: MouseEvent) => void\nlet dragging = false;\nlet selectListener: (n: Node) => void\n\n\nexport const buildGraph = (data: GraphData, onNodeSelect: (n: Node) => void, dragMode: 'pan' | 'select') => {\n\t// empty svg\n\tsvg.innerHTML = defs\n\tdocument.body.append(svg) // make sure svg element is connected, we will measure texts sizes\n\t// @ts-ignore\n\tsvg.__data = data\n\n\tselectListener = onNodeSelect\n\n\t//use event delegation\n\tclickListener = e => {\n\t\tif (dragging) {\n\t\t\treturn;\n\t\t}\n\t\t// const el = (e.target as any).closest('.node > .expand');\n\t}\n\n\t_buildGraph(data)\n\tconst elasticEl = create.rect(300, 300, 50, 50, 0, 'elastic')\n\tsvg.append(elasticEl)\n\n\t// Initialize grid display now that the zoom group exists\n\tdata.updateGridDisplay()\n\n\t// Call addCursorInteraction with dragMode\n\taddCursorInteraction(svg, dragMode)\n\n\treturn {\n\t\tsvg,\n\t\tsetZoom,\n\t}\n}\n\nexport const buildGraphView = (data: GraphData) => {\n\tsvg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n\tsvg.setAttribute('id', 'graph')\n\t_buildGraph(data)\n\treturn svg\n}\n\nconst _buildGraph = (data: GraphData) => {\n\t//toplevel groups\n\tconst zoomG = create.element('g', {}, 'zoom') as SVGGElement\n\tconst nodesG = create.element('g', {}, 'nodes') as SVGGElement\n\tconst edgesG = create.element('g', {}, 'edges') as SVGGElement\n\tconst groupsG = create.element('g', {}, 'groups') as SVGGElement\n\tzoomG.append(groupsG, edgesG, nodesG)\n\n\n\tdata.nodesMap.forEach((n) => {\n\t\tbuildNode(n, data)\n\t\tnodesG.append(n.ref)\n\t})\n\n\tdata.edges.forEach(edge => {\n\t\tedge.labelBounds = undefined\n\t})\n\tdata.edges.forEach(e => {\n\t\tbuildEdge(data, e)\n\t\tedgesG.append(e.ref)\n\t})\n\n\tdata.groupsMap.forEach((group) => {\n\t\tbuildGroup(group)\n\t\tgroupsG.append(group.ref)\n\t})\n\n\tsvg.append(zoomG)\n}\n\nfunction buildEdge(data: GraphData, edge: Edge) {\n\tconst n1 = edge.from, n2 = edge.to;\n\n\tconst g = create.element('g', {}, 'edge') as SVGGElement\n\tg.setAttribute('id', edge.id)\n\tg.setAttribute('data-from', edge.from.id)\n\tg.setAttribute('data-to', edge.to.id)\n\n\tconst position = (edge.style.position || 50) / 100\n\n\t// Calculate edge vertices using utility function\n\tconst vertices = calculateEdgeVertices(edge, data)\n\n\tconst labelPlacement = calculateLabelPlacement(vertices, position, n1)\n\n\tconst {bg, txt, bbox} = buildEdgeLabel(labelPlacement, edge, data)\n\tg.append(bg, txt)\n\n\t// Create edge segments and path using utility function\n\tconst {segments, path} = createEdgeSegments(vertices, bbox, n1, n2)\n\n\tconst p = create.path(path, {'marker-end': 'url(#arrow)'}, 'edge')\n\tp.setAttribute('fill', 'none')\n\tp.setAttribute('stroke', edge.style.color)\n\tp.setAttribute('stroke-width', String(edge.style.thickness))\n\tp.setAttribute('stroke-linecap', 'round')\n\tedge.style.dashed && p.setAttribute('stroke-dasharray', '8')\n\tg.append(p)\n\t\n\t// Debug visualization removed - arrow issue fixed\n\n\t// drag handlers\n\tedge.vertices = vertices.slice(1, -1).map(p => {\n\t\t// Preserve existing EdgeVertex objects to maintain IDs and selection state\n\t\tif ('id' in p && 'edge' in p) {\n\t\t\t// This is already an EdgeVertex, preserve it\n\t\t\tconst v = p as EdgeVertex;\n\t\t\tv.edge = edge; // Ensure edge reference is correct\n\t\t\treturn v;\n\t\t} else {\n\t\t\t// This is a new Point, convert to EdgeVertex\n\t\t\treturn edge.initVertex(p);\n\t\t}\n\t})\n\tedge.vertices.forEach((p, i) => {\n\t\tconst v = p as EdgeVertex\n\t\tv.ref = create.element('circle', {id: v.id, cx: p.x, cy: p.y, r: 7, fill: 'none'}, 'v-dot')\n\t\tv.selected && v.ref.classList.add('selected')\n\t\tv.auto && v.ref.classList.add('auto')\n\t\tg.append(v.ref)\n\t})\n\n\tedge.ref = g\n\treturn g\n}\n\nfunction buildEdgeLabel(placement: EdgeLabelPlacement, edge: Edge, data: GraphData) {\n\tconst labelGap = 12;\n\tconst collisionPadding = 8;\n\tconst fontSize = edge.style.fontSize\n\tlet {txt, dy, maxW} = create.textArea(edge.label, 200, fontSize, false, placement.x, placement.y, 'middle')\n\tdy -= fontSize / 2\n\tmaxW += fontSize\n\n\tconst anchors: Point[] = [{x: placement.x, y: placement.y}]\n\tif (placement.movable && placement.segment) {\n\t\tfor (const fraction of [0.5, 0.35, 0.65, 0.2, 0.8]) {\n\t\t\tconst anchor = {\n\t\t\t\tx: placement.segment.p.x +\n\t\t\t\t\t(placement.segment.q.x - placement.segment.p.x) * fraction,\n\t\t\t\ty: placement.segment.p.y +\n\t\t\t\t\t(placement.segment.q.y - placement.segment.p.y) * fraction,\n\t\t\t}\n\t\t\tif (!anchors.some(existing =>\n\t\t\t\tMath.abs(existing.x - anchor.x) < 0.1 &&\n\t\t\t\tMath.abs(existing.y - anchor.y) < 0.1\n\t\t\t)) {\n\t\t\t\tanchors.push(anchor)\n\t\t\t}\n\t\t}\n\t}\n\n\tconst occupied = [\n\t\t...data.nodes().map(node => expandBox(uncenterBox(node), collisionPadding)),\n\t\t...data.edges\n\t\t\t.filter(other => other !== edge && other.labelBounds)\n\t\t\t.map(other => expandBox(other.labelBounds, collisionPadding)),\n\t]\n\tconst candidates = anchors.flatMap(anchor => {\n\t\tif (placement.orientation === 'vertical') {\n\t\t\treturn [1, -1].map(side => edgeLabelCandidate(\n\t\t\t\tanchor.x + side * (maxW / 2 + labelGap),\n\t\t\t\tanchor.y,\n\t\t\t\tmaxW,\n\t\t\t\tdy,\n\t\t\t\tanchor,\n\t\t\t\tplacement,\n\t\t\t\toccupied,\n\t\t\t))\n\t\t}\n\t\treturn [-1, 1].map(side => edgeLabelCandidate(\n\t\t\tanchor.x,\n\t\t\tanchor.y + side * (dy / 2 + labelGap),\n\t\t\tmaxW,\n\t\t\tdy,\n\t\t\tanchor,\n\t\t\tplacement,\n\t\t\toccupied,\n\t\t))\n\t})\n\tconst selected = candidates.reduce((best, candidate) =>\n\t\tcandidate.score < best.score ? candidate : best\n\t)\n\tconst {centerX, centerY, bounds} = selected\n\ttxt.querySelectorAll('tspan').forEach((span: SVGTSpanElement) => {\n\t\tspan.setAttribute('x', String(centerX))\n\t})\n\ttxt.setAttribute('y', String(centerY - dy / 2))\n\n\tapplyStyle(txt, styles.edgeText)\n\ttxt.setAttribute('stroke', 'none')\n\ttxt.setAttribute('font-size', String(edge.style.fontSize))\n\ttxt.setAttribute('fill', edge.style.color)\n\n\tconst bbox = {...bounds}\n\tconst bg = create.rect(bbox.width, bbox.height, bbox.x, bbox.y)\n\tapplyStyle(bg, styles.edgeRect)\n\ttxt.setAttribute('data-field', 'label')\n\tedge.labelBounds = bounds\n\n\tbbox.x += bbox.width / 2\n\tbbox.y += bbox.height / 2\n\treturn {bg, txt, bbox}\n}\n\nfunction edgeLabelCandidate(\n\tcenterX: number,\n\tcenterY: number,\n\twidth: number,\n\theight: number,\n\tanchor: Point,\n\tplacement: EdgeLabelPlacement,\n\toccupied: BBox[],\n) {\n\tconst bounds = {\n\t\tx: centerX - width / 2,\n\t\ty: centerY - height / 2,\n\t\twidth,\n\t\theight,\n\t}\n\tconst overlap = occupied.reduce(\n\t\t(total, box) => total + boxOverlapArea(bounds, box),\n\t\t0,\n\t)\n\treturn {\n\t\tcenterX,\n\t\tcenterY,\n\t\tbounds,\n\t\tscore: overlap * 1000 + calculateDistance(anchor, placement),\n\t}\n}\n\nfunction expandBox(box: BBox, padding: number): BBox {\n\treturn {\n\t\tx: box.x - padding,\n\t\ty: box.y - padding,\n\t\twidth: box.width + padding * 2,\n\t\theight: box.height + padding * 2,\n\t}\n}\n\nfunction boxOverlapArea(first: BBox, second: BBox): number {\n\tconst width = Math.max(\n\t\t0,\n\t\tMath.min(first.x + first.width, second.x + second.width) -\n\t\t\tMath.max(first.x, second.x),\n\t)\n\tconst height = Math.max(\n\t\t0,\n\t\tMath.min(first.y + first.height, second.y + second.height) -\n\t\t\tMath.max(first.y, second.y),\n\t)\n\treturn width * height\n}\n\n\nfunction buildNode(n: Node, data: GraphData) {\n\t// @ts-ignore\n\twindow.gdata = data\n\n\tconst g = create.element('g', {}, 'node') as SVGGElement\n\tg.setAttribute('id', n.id)\n\tn.selected && g.classList.add('selected')\n\tsetPosition(g, n.x, n.y)\n\tconst link = n.link\n\t\t? create.element('a', {\n\t\t\thref: n.link.href,\n\t\t\t'data-export-href': n.link.exportHref,\n\t\t\t'aria-label': `Open ${n.title}`,\n\t\t}, 'nodeLink') as SVGAElement\n\t\t: null\n\tconst content = link || g\n\tif (link) {\n\t\tg.classList.add('linked')\n\t\tg.append(link)\n\t}\n\n\t// Ensure we use the correct shape from style, defaulting to Box\n\tconst shapeType = n.style.shape || 'Box';\n\tconst shapeFn = shapes[shapeType.toLowerCase()] || shapes.box\n\tconst shape: SVGElement = shapeFn(content, n);\n\n\tshape.classList.add('nodeBorder')\n\n\t// Apply generic styles first\n\tapplyStyle(shape, styles.nodeBorder)\n\t// Then apply tag-specific styles to override generic ones\n\tshape.setAttribute('fill', n.style.background)\n\tshape.setAttribute('stroke', n.style.stroke)\n\t// Consistent border width for all elements\n\tshape.setAttribute('stroke-width', '3')\n\tshape.setAttribute('opacity', String(n.style.opacity))\n\tsetBorderStyle(shape, n.style.border)\n\n\tconst tg = buildNodeContent(n.contentLayout, n.style.color)\n\tconst labelOffsetY = Number(content.getAttribute('label-offset-y')) || 0\n\tsetPosition(tg, 0, labelOffsetY / 2)\n\tcontent.append(tg)\n\n\t// @ts-ignore\n\tg.__data = n;\n\tn.ref = g;\n\n\treturn g\n}\n\n\nfunction buildGroup(group: Group) {\n\tif (group.nodes.length == 0) {\n\t\treturn\n\t}\n\tconst g = create.element('g', {}, 'group') as SVGGElement\n\n\tlet p0: Point = {x: 1e100, y: 1e100}, p1: Point = {x: 0, y: 0}\n\tgroup.nodes.forEach(n => {\n\t\t// Calculate visual bounds accounting for shapes that extend beyond center\n\t\tconst shape = (n as Node).style?.shape?.toLowerCase() || 'box'\n\t\t\n\t\tlet topExtension = n.height / 2\n\t\tlet bottomExtension = n.height / 2\n\t\t\n\t\tif (shape === 'robot') {\n\t\t\t// Robot shape extends above with antenna\n\t\t\t// Account for antenna height (h * 0.08) plus some margin\n\t\t\tconst antennaH = n.height * 0.12\n\t\t\ttopExtension = n.height / 2 + antennaH\n\t\t\tbottomExtension = n.height / 2\n\t\t} else if (shape === 'hexagon') {\n\t\t\t// Hexagon extends to ±0.866 * (width/2) vertically\n\t\t\t// For width=280, that's ±121.24px from center\n\t\t\tconst hexHeight = n.width / 2 * 0.866\n\t\t\ttopExtension = hexHeight\n\t\t\tbottomExtension = hexHeight\n\t\t}\n\t\t\n\t\tconst b = {\n\t\t\tx: n.x - n.width / 2,\n\t\t\ty: n.y - topExtension,\n\t\t\twidth: n.width,\n\t\t\theight: topExtension + bottomExtension\n\t\t}\n\t\tp0.x = Math.min(p0.x, b.x)\n\t\tp0.y = Math.min(p0.y, b.y)\n\t\tp1.x = Math.max(p1.x, b.x + b.width)\n\t\tp1.y = Math.max(p1.y, b.y + b.height)\n\t})\n\tconst pad = 25 // Padding around content\n\tconst labelHeight = 30 // Space for the group label at bottom\n\tconst w = Math.max(p1.x - p0.x, 200)\n\tconst h = p1.y - p0.y\n\tconst bb = {\n\t\tx: p0.x - pad,\n\t\ty: p0.y - pad,\n\t\twidth: w + pad * 2,\n\t\theight: h + pad * 2 + labelHeight,\n\t}\n\tconst r = create.rect(bb.width, bb.height, bb.x, bb.y)\n\tgroup.x = bb.x + bb.width / 2\n\tgroup.y = bb.y + bb.height / 2\n\tgroup.width = bb.width\n\tgroup.height = bb.height\n\tapplyStyle(r, styles.groupRect)\n\tgroup.style.stroke && r.setAttribute('stroke', group.style.stroke)\n\tgroup.style.background && r.setAttribute('fill', group.style.background)\n\n\tconst txt = create.text(group.name, {x: p0.x, y: bb.y + bb.height - styles.groupText[\"font-size\"]})\n\tapplyStyle(txt, styles.groupText)\n\tgroup.style.color && txt.setAttribute('fill', group.style.color)\n\n\tg.append(r, txt)\n\tgroup.ref = g\n}\n\nfunction findClosestSegment(graph: GraphData, p: Point) {\n\t// find the closest point on a segment\n\tlet fnd = {dst: Number.POSITIVE_INFINITY, pos: -1, edge: null as Edge, prj: null as Point}\n\tgraph.edges.forEach(edge => {\n\t\tconst vertices = edge.vertices || []\n\t\tconst pts = [edge.from, ...vertices, edge.to]\n\t\tfor (let i = 1; i < pts.length; i++) {\n\t\t\tconst prj = project(p, pts[i - 1], pts[i])\n\t\t\tconst dst = cabDistance(p, prj)\n\t\t\tif (dst > 50) continue\n\t\t\tif (dst < fnd.dst) {\n\t\t\t\tfnd = {dst, pos: i, prj, edge}\n\t\t\t}\n\t\t}\n\t})\n\treturn fnd.edge ? fnd : null\n}\n\nfunction mouseToDrawing(e: MouseEvent): Point {\n\t// transform event coords to drawing coords\n\tconst b = svg.getBoundingClientRect()\n\tconst z = getZoom()\n\t\n\t// Get current pan transform\n\tconst currentTransform = getCurrentTransform()\n\t\n\t// Convert screen coordinates to drawing coordinates accounting for zoom and pan\n\t// The transform values are in screen coordinates, so we need to divide by zoom and subtract\n\treturn {\n\t\tx: (e.clientX - b.x - currentTransform.x) / z,\n\t\ty: (e.clientY - b.y - currentTransform.y) / z\n\t}\n}\n\ninterface Handle extends Point {\n\tid: string\n\tselected?: boolean\n\tref?: SVGElement\n}\n\n// Custom cursor interaction that prioritizes panning over selection\nfunction addCustomCursorInteraction(svg: SVGSVGElement, conn: {\n\tnodeFromEvent(e: MouseEvent): Handle | null;\n\tsetSelection(handles: Handle[]): void;\n\tsetDragging(dragging: boolean): void;\n\tisSelected(handle: Handle): boolean;\n\tgetSelection(): Handle[];\n\tgetZoom(): number;\n\tmoveNode(h: Handle, x: number, y: number): void;\n\tboxSelection(box: DOMRect, add: boolean): void;\n\tupdatePanning(): void;\n}, dragMode: 'pan' | 'select') {\n\tlet ini: { x: number; y: number; n: Handle }[] = []\n\tlet elastic: any = null\n\tlet isPanning = false\n\tlet panStartX = 0\n\tlet panStartY = 0\n\tlet initialTransform = { x: 0, y: 0 }\n\tlet pendingSelectionChange: { node: Handle; shiftKey: boolean } | null = null\n\tlet pendingNavigation: string | null = null\n\tlet hasDragged = false\n\tlet suppressLinkClick = false\n\t\n\t// Store event listeners for cleanup\n\tconst eventListeners: Array<{ element: Element | Window, event: string, handler: EventListener }> = []\n\n\t// Simple elastic selection box implementation - use mouseToDrawing for proper coordinate conversion\n\tfunction createElastic() {\n\t\tlet startDrawingX = 0, startDrawingY = 0, rect: SVGRectElement | null = null\n\t\t\n\t\treturn {\n\t\t\tini(e: MouseEvent) {\n\t\t\t\t// Use mouseToDrawing to get proper drawing coordinates (accounts for zoom and pan)\n\t\t\t\tconst pt = mouseToDrawing(e)\n\t\t\t\tstartDrawingX = pt.x\n\t\t\t\tstartDrawingY = pt.y\n\t\t\t\t\n\t\t\t\trect = document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\")\n\t\t\t\trect.setAttribute('fill', 'rgba(0, 100, 255, 0.1)')\n\t\t\t\trect.setAttribute('stroke', 'rgba(0, 100, 255, 0.5)')\n\t\t\t\trect.setAttribute('stroke-width', '1')\n\t\t\t\trect.setAttribute('stroke-dasharray', '3,3')\n\t\t\t\trect.setAttribute('x', String(startDrawingX))\n\t\t\t\trect.setAttribute('y', String(startDrawingY))\n\t\t\t\trect.setAttribute('width', '0')\n\t\t\t\trect.setAttribute('height', '0')\n\t\t\t\t\n\t\t\t\t// Add to the zoom group so it transforms with the content\n\t\t\t\tconst zoomGroup = svg.querySelector('g.zoom')\n\t\t\t\tif (zoomGroup) {\n\t\t\t\t\tzoomGroup.appendChild(rect)\n\t\t\t\t} else {\n\t\t\t\t\tsvg.appendChild(rect)\n\t\t\t\t}\n\t\t\t},\n\t\t\tupdate(e: MouseEvent) {\n\t\t\t\tif (!rect) return\n\t\t\t\t\n\t\t\t\t// Convert current mouse position to drawing coordinates (accounts for zoom and pan)\n\t\t\t\tconst currentPt = mouseToDrawing(e)\n\t\t\t\tconst currentDrawingX = currentPt.x\n\t\t\t\tconst currentDrawingY = currentPt.y\n\t\t\t\t\n\t\t\t\t// Calculate rectangle bounds in drawing coordinates\n\t\t\t\tconst x = Math.min(startDrawingX, currentDrawingX)\n\t\t\t\tconst y = Math.min(startDrawingY, currentDrawingY)\n\t\t\t\tconst width = Math.abs(currentDrawingX - startDrawingX)\n\t\t\t\tconst height = Math.abs(currentDrawingY - startDrawingY)\n\t\t\t\t\n\t\t\t\trect.setAttribute('x', String(x))\n\t\t\t\trect.setAttribute('y', String(y))\n\t\t\t\trect.setAttribute('width', String(width))\n\t\t\t\trect.setAttribute('height', String(height))\n\t\t\t},\n\t\t\tend(): DOMRect | null {\n\t\t\t\tif (!rect) return null\n\t\t\t\t\n\t\t\t\t// Get final rectangle bounds in drawing coordinates\n\t\t\t\tconst x = parseFloat(rect.getAttribute('x') || '0')\n\t\t\t\tconst y = parseFloat(rect.getAttribute('y') || '0')\n\t\t\t\tconst width = parseFloat(rect.getAttribute('width') || '0')\n\t\t\t\tconst height = parseFloat(rect.getAttribute('height') || '0')\n\t\t\t\t\n\t\t\t\trect.remove()\n\t\t\t\trect = null\n\t\t\t\t\n\t\t\t\t// Return drawing coordinates directly for boxSelection since we're now working in the same coordinate system\n\t\t\t\tif (width > 5 && height > 5) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tx: x, y: y, width: width, height: height,\n\t\t\t\t\t\tleft: x, top: y, right: x + width, bottom: y + height\n\t\t\t\t\t} as DOMRect\n\t\t\t\t}\n\t\t\t\treturn null\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction getCurrentTransformLocal() {\n\t\tconst zoomGroup = svg.querySelector('g.zoom') as SVGGElement\n\t\tif (!zoomGroup) return { x: 0, y: 0 }\n\t\t\n\t\tconst transform = zoomGroup.getAttribute('transform') || ''\n\t\tconst translateMatch = transform.match(/translate\\(([^,]+),([^)]+)\\)/)\n\t\tif (translateMatch) {\n\t\t\treturn {\n\t\t\t\tx: parseFloat(translateMatch[1]) || 0,\n\t\t\t\ty: parseFloat(translateMatch[2]) || 0\n\t\t\t}\n\t\t}\n\t\treturn { x: 0, y: 0 }\n\t}\n\n\tfunction setTransform(x: number, y: number) {\n\t\tconst zoomGroup = svg.querySelector('g.zoom') as SVGGElement\n\t\tif (!zoomGroup) return\n\t\t\n\t\tconst zoom = getZoom()\n\t\tzoomGroup.setAttribute('transform', `translate(${x}, ${y}) scale(${zoom})`)\n\t}\n\n\tfunction onMouseDown(e: MouseEvent) {\n\t\te.preventDefault();\n\t\thasDragged = false\n\t\tpendingSelectionChange = null\n\t\tconst target = e.target\n\t\tconst link = target instanceof Element ? target.closest('a.nodeLink') : null\n\t\tpendingNavigation = e.shiftKey ? null : link?.getAttribute('href') || null\n\n\t\tconst node = conn.nodeFromEvent(e)\n\t\t\n\t\t// Determine effective mode: invert if shift is held\n\t\tconst effectiveMode = e.shiftKey ? (dragMode === 'pan' ? 'select' : 'pan') : dragMode\n\t\t\n\t\tif (!node) { // Clicked on empty space\n\t\t\tif (effectiveMode === 'pan') {\n\t\t\t\t// Pan mode: pan and deselect\n\t\t\t\tisPanning = true;\n\t\t\t\telastic = null;\n\t\t\t\tpanStartX = e.clientX;\n\t\t\t\tpanStartY = e.clientY;\n\t\t\t\tinitialTransform = getCurrentTransformLocal();\n\t\t\t\tini = [];\n\t\t\t\t// Deselect all elements when clicking empty space in pan mode\n\t\t\t\tconn.setSelection([]);\n\t\t\t} else {\n\t\t\t\t// Select mode: ONLY select, no panning\n\t\t\t\tisPanning = false;\n\t\t\t\telastic = createElastic();\n\t\t\t\tif (elastic) elastic.ini(e);\n\t\t\t\tini = [];\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Clicked on a node/vertex - behavior depends on effective mode\n\t\tif (effectiveMode === 'pan') {\n\t\t\t// Pan mode: select the element, don't pan\n\t\t\tisPanning = false;\n\t\t\telastic = null;\n\t\t\t\n\t\t\tconst nodes = conn.getSelection()\n\t\t\tif (conn.isSelected(node)) {\n\t\t\t\t// Clicking on a selected node - prepare to drag all selected elements\n\t\t\t\tini = nodes.map(n => ({ x: n.x, y: n.y, n }))\n\t\t\t\t// No selection change needed since we're clicking on already selected element\n\t\t\t} else {\n\t\t\t\t// Clicking on an unselected node - select only this element\n\t\t\t\tconn.setSelection([node]);\n\t\t\t\tini = [{ x: node.x, y: node.y, n: node }];\n\t\t\t}\n\t\t} else {\n\t\t\t// Select mode: selection/drag logic\n\t\t\tisPanning = false; // Ensure no panning if a node is clicked\n\t\t\telastic = null; // Ensure no selection box if a node is clicked\n\t\t\tconst nodes = conn.getSelection()\n\t\t\t\n\t\t\tif (e.shiftKey && dragMode === 'select') {\n\t\t\t\t// Shift+click in select mode: immediately change selection (no dragging expected)\n\t\t\t\tif (conn.isSelected(node)) {\n\t\t\t\t\tconst index = nodes.findIndex(n => n.id === node.id)\n\t\t\t\t\tif (index >= 0) nodes.splice(index, 1)\n\t\t\t\t} else {\n\t\t\t\t\tnodes.push(node)\n\t\t\t\t}\n\t\t\t\tconn.setSelection(nodes)\n\t\t\t\tini = nodes.map(n => ({ x: n.x, y: n.y, n }))\n\t\t\t} else {\n\t\t\t\t// Regular click: defer selection change until we know if it's a drag or click\n\t\t\t\tif (conn.isSelected(node)) {\n\t\t\t\t\t// Clicking on a selected node - prepare to drag all selected elements\n\t\t\t\t\tini = nodes.map(n => ({ x: n.x, y: n.y, n }))\n\t\t\t\t\t// No pending selection change needed since we're clicking on already selected element\n\t\t\t\t\tpendingSelectionChange = null\n\t\t\t\t} else {\n\t\t\t\t\t// Clicking on an unselected node - defer selection change until we determine if it's a click or drag\n\t\t\t\t\tpendingSelectionChange = { node, shiftKey: e.shiftKey }\n\t\t\t\t\t// For now, prepare to drag just the clicked node (we'll update selection when drag starts)\n\t\t\t\t\tini = [{ x: node.x, y: node.y, n: node }]\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction onMouseMove(e: MouseEvent, dx: number, dy: number) {\n\t\t// Check if we've moved enough to consider this a drag\n\t\tconst dragThreshold = 3 // pixels\n\t\tif (!hasDragged && (Math.abs(dx) > dragThreshold || Math.abs(dy) > dragThreshold)) {\n\t\t\thasDragged = true\n\t\t\tpendingNavigation = null\n\t\t\t\n\t\t\t// If we have a pending selection change and we're now dragging, apply it\n\t\t\tif (pendingSelectionChange) {\n\t\t\t\tconst nodes = conn.getSelection()\n\t\t\t\tnodes.length = 0\n\t\t\t\tnodes.push(pendingSelectionChange.node)\n\t\t\t\tconn.setSelection(nodes)\n\t\t\t\t// Update ini to drag only the newly selected node\n\t\t\t\tini = [{ x: pendingSelectionChange.node.x, y: pendingSelectionChange.node.y, n: pendingSelectionChange.node }]\n\t\t\t\tpendingSelectionChange = null\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (isPanning) {\n\t\t\t// Pan the view - apply mouse delta directly (no zoom division needed)\n\t\t\t// setTransform expects screen coordinates, dx/dy are already screen pixel deltas\n\t\t\tconst newX = initialTransform.x + dx\n\t\t\tconst newY = initialTransform.y + dy\n\t\t\tsetTransform(newX, newY)\n\t\t} else if (ini.length > 0 && hasDragged) {\n\t\t\t// Move selected nodes/vertices (only if we've actually started dragging)\n\t\t\t// dx, dy are screen pixel deltas, convert to drawing coordinate deltas\n\t\t\tconst zoom = conn.getZoom()\n\t\t\tconst drawingDx = dx / zoom\n\t\t\tconst drawingDy = dy / zoom\n\t\t\tini.forEach(item => {\n\t\t\t\t// item.x, item.y are initial drawing coordinates\n\t\t\t\t// Add the drawing coordinate delta to get new position\n\t\t\t\tconn.moveNode(item.n, item.x + drawingDx, item.y + drawingDy)\n\t\t\t})\n\t\t\tconn.setDragging(true)\n\t\t} else if (elastic) {\n\t\t\t// Update selection box\n\t\t\telastic.update(e)\n\t\t\tconn.setDragging(true)\n\t\t}\n\t}\n\n\tfunction onMouseUp(e: MouseEvent) {\n\t\tconn.setDragging(false)\n\t\tconst navigation = hasDragged ? null : pendingNavigation\n\t\tif (hasDragged) {\n\t\t\tsuppressLinkClick = true\n\t\t\twindow.setTimeout(() => {\n\t\t\t\tsuppressLinkClick = false\n\t\t\t}, 0)\n\t\t}\n\t\t\n\t\t// If we have a pending selection change and didn't drag, apply it now (it was just a click)\n\t\tif (pendingSelectionChange && !hasDragged) {\n\t\t\tconst nodes = conn.getSelection()\n\t\t\tnodes.length = 0\n\t\t\tnodes.push(pendingSelectionChange.node)\n\t\t\tconn.setSelection(nodes)\n\t\t}\n\t\t\n\t\tif (elastic) {\n\t\t\tconst box = elastic.end()\n\t\t\tif (box) {\n\t\t\t\tconn.boxSelection(box, e.shiftKey)\n\t\t\t} else if (!ini.length) {\n\t\t\t\t// Deselect if no box was drawn\n\t\t\t\tconn.setSelection([])\n\t\t\t}\n\t\t\telastic = null\n\t\t}\n\t\t\n\t\t// Save view state if user was panning (user-initiated view change)\n\t\tif (isPanning && hasDragged) {\n\t\t\tconst graphData = (svg as any).__data as GraphData\n\t\t\tif (graphData && graphData.id) {\n\t\t\t\tsaveViewState(graphData.id)\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Reset state\n\t\tpendingSelectionChange = null\n\t\tpendingNavigation = null\n\t\thasDragged = false\n\t\tisPanning = false\n\t\tconn.updatePanning()\n\t\tif (navigation) {\n\t\t\twindow.location.href = navigation\n\t\t}\n\t}\n\n\tfunction onClick(e: MouseEvent) {\n\t\tconst target = e.target\n\t\tif (!(target instanceof Element) || !target.closest('a.nodeLink')) return\n\t\te.preventDefault()\n\t\tif (!suppressLinkClick) return\n\t\te.stopPropagation()\n\t\tsuppressLinkClick = false\n\t}\n\n\t// Add drag and drop functionality\n\tfunction addDnd(element: SVGSVGElement) {\n\t\tlet md: { ex: number; ey: number } | null = null\n\n\t\tfunction convertEvent(e: MouseEvent | TouchEvent): MouseEvent {\n\t\t\tif ('changedTouches' in e && e.changedTouches) {\n\t\t\t\treturn e.changedTouches[0] as any\n\t\t\t}\n\t\t\treturn e as MouseEvent\n\t\t}\n\n\t\tfunction onMouseMoveHandler(e: MouseEvent | TouchEvent) {\n\t\t\tif (!md) return\n\t\t\te = convertEvent(e)\n\t\t\tonMouseMove(e, e.clientX - md.ex, e.clientY - md.ey)\n\t\t}\n\n\t\tfunction removeListeners() {\n\t\t\tdocument.removeEventListener('touchmove', onMouseMoveHandler as any)\n\t\t\tdocument.removeEventListener('mousemove', onMouseMoveHandler as any)\n\t\t\tdocument.removeEventListener('mouseup', onMouseUpHandler)\n\t\t\tdocument.removeEventListener('touchend', onMouseUpHandler)\n\t\t}\n\n\t\tfunction onMouseUpHandler(e: MouseEvent | TouchEvent) {\n\t\t\tremoveListeners()\n\t\t\tonMouseUp(convertEvent(e))\n\t\t\tmd = null\n\t\t}\n\n\t\tfunction onMouseDownHandler(e: MouseEvent | TouchEvent) {\n\t\t\te = convertEvent(e)\n\t\t\tmd = { ex: e.clientX, ey: e.clientY }\n\t\t\tonMouseDown(e)\n\t\t\tdocument.addEventListener('touchmove', onMouseMoveHandler as any)\n\t\t\tdocument.addEventListener('mousemove', onMouseMoveHandler as any)\n\t\t\tdocument.addEventListener('mouseup', onMouseUpHandler)\n\t\t\tdocument.addEventListener('touchend', onMouseUpHandler)\n\t\t}\n\n\t\telement.addEventListener('mousedown', onMouseDownHandler as any)\n\t\telement.addEventListener('touchstart', onMouseDownHandler as any)\n\t\t\n\t\t// Track these listeners for cleanup\n\t\teventListeners.push(\n\t\t\t{ element, event: 'mousedown', handler: onMouseDownHandler as any },\n\t\t\t{ element, event: 'touchstart', handler: onMouseDownHandler as any }\n\t\t)\n\t}\n\n\taddDnd(svg)\n\tsvg.addEventListener('click', onClick)\n\teventListeners.push({ element: svg, event: 'click', handler: onClick })\n\t\n\t// Return cleanup function\n\treturn () => {\n\t\teventListeners.forEach(({ element, event, handler }) => {\n\t\t\telement.removeEventListener(event, handler)\n\t\t})\n\t}\n}\n\nexport function addCursorInteraction(svg: SVGSVGElement, dragMode: 'pan' | 'select') {\n\t// Clean up any existing event listeners to prevent conflicts\n\tconst existingCleanup = (svg as any).__cursorInteractionCleanup\n\tif (existingCleanup) {\n\t\texistingCleanup()\n\t}\n\n\tfunction getData(el: SVGElement) {\n\t\t// @ts-ignore\n\t\treturn el.__data\n\t}\n\n\tconst gd = () => (getData(svg) as GraphData)\n\t\n\t// Store event listeners for cleanup\n\tconst eventListeners: Array<{ element: Element | Window, event: string, handler: EventListener }> = []\n\n\tconst beforeUnloadHandler = (e: BeforeUnloadEvent) => {\n\t\tif (!gd().changed()) return\n\t\te.preventDefault()\n\t\te.returnValue = ''\n\t}\n\twindow.addEventListener(\"beforeunload\", beforeUnloadHandler)\n\teventListeners.push({ element: window, event: 'beforeunload', handler: beforeUnloadHandler })\n\n\tfunction setDotSelected(d: Handle, selected: boolean) {\n\t\td.selected = selected\n\t\tconst dotEl = svg.querySelector('#' + d.id)\n\t\td.selected ? dotEl.classList.add('selected') : dotEl.classList.remove('selected')\n\t}\n\n\t// show moving dot along edge when ALT is pressed\n\tconst mouseMoveHandler = (e: MouseEvent) => {\n\t\tif (!e.altKey) return\n\t\tconst fnd = findClosestSegment(gd(), mouseToDrawing(e))\n\t\tif (fnd) {\n\t\t\tconst {prj} = fnd\n\t\t\tconst parent = svg.querySelector('g.edges')\n\t\t\tlet dot = parent.querySelector('#prj')\n\t\t\tif (!dot) {\n\t\t\t\tdot = create.element('circle', {id: 'prj', cx: prj.x, cy: prj.y, r: 7})\n\t\t\t\tparent.append(dot)\n\t\t\t}\n\t\t\tdot.setAttribute('cx', String(prj.x))\n\t\t\tdot.setAttribute('cy', String(prj.y))\n\t\t} else {\n\t\t\tremovePrjDot()\n\t\t}\n\t}\n\tsvg.addEventListener('mousemove', mouseMoveHandler)\n\teventListeners.push({ element: svg, event: 'mousemove', handler: mouseMoveHandler })\n\n\tconst keyUpHandler = (e: KeyboardEvent) => {\n\t\tconst key = findShortcut(e, true)\n\t\tif (key == ADD_VERTEX || key == ADD_LABEL_VERTEX) return\n\t\tremovePrjDot()\n\t}\n\twindow.addEventListener('keyup', keyUpHandler)\n\teventListeners.push({ element: window, event: 'keyup', handler: keyUpHandler })\n\n\tfunction removePrjDot() {\n\t\tconst el = svg.querySelector('g.edges #prj')\n\t\tel && el.parentElement.removeChild(el)\n\t}\n\n\tconst clickHandler = (e: MouseEvent) => {\n\t\tconst key = findShortcut(e, true)\n\t\tif (key != ADD_LABEL_VERTEX && key != ADD_VERTEX) return\n\t\tconst fnd = findClosestSegment(gd(), mouseToDrawing(e))\n\t\tif (fnd) {\n\t\t\tconst {edge, pos, prj} = fnd\n\t\t\t// depending on keyboard modifier, make it label position\n\t\t\tgd().insertEdgeVertex(edge, prj, pos, key == ADD_LABEL_VERTEX)\n\t\t\tremovePrjDot()\n\t\t}\n\t}\n\tsvg.addEventListener('click', clickHandler)\n\teventListeners.push({ element: svg, event: 'click', handler: clickHandler })\n\n\tconst wheelHandler = (e: WheelEvent) => {\n\t\t// Handle wheel zoom directly without relying on shortcuts\n\t\t// deltaY > 0 means scrolling down (zoom out), deltaY < 0 means scrolling up (zoom in)\n\t\tconst delta = Math.sign(e.deltaY) * 0.1 // Normalize to 0.1 zoom steps\n\t\tconst currentZoom = getZoom()\n\t\tconst newZoom = Math.max(0.1, Math.min(5, currentZoom - delta)) // Clamp zoom between 0.1 and 5\n\t\t\n\t\tif (newZoom !== currentZoom) {\n\t\t\t// Convert absolute screen coordinates to SVG-relative coordinates\n\t\t\tconst rect = svg.getBoundingClientRect()\n\t\t\tconst svgX = e.clientX - rect.left\n\t\t\tconst svgY = e.clientY - rect.top\n\t\t\tsetZoomCentered(newZoom, svgX, svgY)\n\t\t\te.preventDefault()\n\t\t\t\n\t\t\t// Save view state after user wheel zoom\n\t\t\tconst graphData = (svg as any).__data as GraphData\n\t\t\tif (graphData && graphData.id) {\n\t\t\t\tsaveViewState(graphData.id)\n\t\t\t}\n\t\t}\n\t}\n\tsvg.addEventListener('wheel', wheelHandler)\n\teventListeners.push({ element: svg, event: 'wheel', handler: wheelHandler })\n\n\tconst keyDownHandler = (e: KeyboardEvent) => {\n\t\tconst shortcut = findShortcut(e)\n\t\t\n\t\t\n\t\tif (shortcut) {\n\t\t\te.preventDefault() // Prevent browser default for all recognized shortcuts\n\t\t}\n\t\t\n\t\tswitch (shortcut) {\n\t\t\tcase DEL_VERTEX:\n\t\t\t\tconst selectedVertices = Array.from(gd().edgeVertices.values()).filter(v => v.selected);\n\t\t\t\tselectedVertices.forEach(v => {\n\t\t\t\t\tgd().deleteEdgeVertex(v)\n\t\t\t\t})\n\t\t\t\tbreak\n\t\t\tcase UNDO:\n\t\t\t\tgd().undo()\n\t\t\t\tbreak\n\t\t\tcase REDO:\n\t\t\t\tgd().redo()\n\t\t\t\tbreak\n\t\t\tcase ZOOM_IN:\n\t\t\t\tconst newZoomIn = Math.min(5, getZoom() * 1.2)\n\t\t\t\t// Center zoom on viewport center like mouse wheel\n\t\t\t\tsetZoomCentered(newZoomIn)\n\t\t\t\tsaveViewState(gd().id) // Save after user keyboard zoom\n\t\t\t\tbreak\n\t\t\tcase ZOOM_OUT:\n\t\t\t\tconst newZoomOut = Math.max(0.1, getZoom() / 1.2)\n\t\t\t\t// Center zoom on viewport center like mouse wheel\n\t\t\t\tsetZoomCentered(newZoomOut)\n\t\t\t\tsaveViewState(gd().id) // Save after user keyboard zoom\n\t\t\t\tbreak\n\t\t\tcase ZOOM_100:\n\t\t\t\t// Center zoom on viewport center like mouse wheel\n\t\t\t\tsetZoomCentered(1)\n\t\t\t\tsaveViewState(gd().id) // Save after user keyboard zoom\n\t\t\t\tbreak\n\t\t\tcase ZOOM_FIT:\n\t\t\t\tgd().fitToView()\n\t\t\t\t// Don't save view state here - fitToView should not be persisted\n\t\t\t\tbreak\n\t\t\tcase SELECT_ALL:\n\t\t\t\tgd().nodes().forEach(n => gd().setNodeSelected(n, true))\n\t\t\t\tgd().edgeVertices.forEach(v => setDotSelected(v, true))\n\t\t\t\tbreak\n\t\t\tcase DESELECT:\n\t\t\t\tgd().nodes().forEach(n => gd().setNodeSelected(n, false))\n\t\t\t\tgd().edgeVertices.forEach(v => setDotSelected(v, false))\n\t\t\t\tbreak\n\t\t}\n\t}\n\twindow.addEventListener('keydown', keyDownHandler)\n\teventListeners.push({ element: window, event: 'keydown', handler: keyDownHandler })\n\n\t// Custom cursor interaction with pan-first behavior\n\tconst customInteractionCleanup = addCustomCursorInteraction(svg, {\n\t\tnodeFromEvent(e: MouseEvent): Handle {\n\t\t\te.preventDefault()\n\t\t\t// node clicked\n\t\t\tlet el = (e.target as SVGElement).closest('g.nodes g.node') as SVGElement\n\t\t\tif (el) return getData(el)\n\t\t\t// vertex dot clicked\n\t\t\tel = (e.target as SVGElement).closest('g.edges g.edge .v-dot') as SVGElement\n\t\t\tif (el) {\n\t\t\t\treturn gd().edgeVertices.get(el.id)\n\t\t\t}\n\t\t\treturn null\n\t\t},\n\t\tsetSelection(handles: Handle[]) {\n\t\t\t// nodes\n\t\t\tgd().nodes().forEach(n => gd().setNodeSelected(n, handles.some(h => h.id == n.id)))\n\t\t\t// dots\n\t\t\tgd().edgeVertices.forEach(d => setDotSelected(d, handles.some(h => h.id == d.id)))\n\t\t\tselectListener(gd().nodes().find(n => n.selected))\n\t\t},\n\t\tsetDragging(d: boolean) {\n\t\t\tdragging = d\n\t\t},\n\t\tisSelected(handle: Handle): boolean {\n\t\t\treturn handle.selected\n\t\t},\n\t\tgetSelection(): Handle[] {\n\t\t\tconst ret: Handle[] = gd().nodes().filter(n => n.selected)\n\t\t\tgd().edgeVertices.forEach(d => d.selected && ret.push(d))\n\t\t\treturn ret\n\t\t},\n\t\tgetZoom: getZoom,\n\t\tmoveNode(h: Handle, x: number, y: number) {\n\t\t\tif (gd().nodesMap.has(h.id))\n\t\t\t\tgd().moveNode(h as Node, x, y)\n\t\t\telse {\n\t\t\t\t(h as EdgeVertex).auto = false\n\t\t\t\tgd().moveEdgeVertex(h as EdgeVertex, x, y)\n\t\t\t}\n\t\t},\n\t\tboxSelection(box: DOMRect, add) {\n\t\t\t// Box is now already in drawing coordinates, no need to scale\n\t\t\t// nodes\n\t\t\tgd().nodesMap.forEach(n => {\n\t\t\t\tconst inBox = boxesOverlap(uncenterBox(n), box)\n\t\t\t\tif (inBox) {\n\t\t\t\t\t// Toggle selection for elements in the box\n\t\t\t\t\tgd().setNodeSelected(n, !n.selected)\n\t\t\t\t} else if (!add) {\n\t\t\t\t\t// If not holding shift and element is outside box, deselect it\n\t\t\t\t\tgd().setNodeSelected(n, false)\n\t\t\t\t}\n\t\t\t})\n\t\t\t// dots\n\t\t\tgd().edgeVertices.forEach(d => {\n\t\t\t\tconst inBox = insideBox(d, box, false)\n\t\t\t\tif (inBox) {\n\t\t\t\t\t// Toggle selection for elements in the box\n\t\t\t\t\tsetDotSelected(d, !d.selected)\n\t\t\t\t} else if (!add) {\n\t\t\t\t\t// If not holding shift and element is outside box, deselect it\n\t\t\t\t\tsetDotSelected(d, false)\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tselectListener(gd().nodes().find(n => n.selected))\n\t\t},\n\t\tupdatePanning: updatePanning,\n\t}, dragMode)\n\t\n\t// Store cleanup function on the SVG element for later use\n\tconst cleanup = () => {\n\t\teventListeners.forEach(({ element, event, handler }) => {\n\t\t\telement.removeEventListener(event, handler)\n\t\t})\n\t\tif (customInteractionCleanup) {\n\t\t\tcustomInteractionCleanup()\n\t\t}\n\t}\n\t\n\t// Store cleanup function on SVG element\n\t;(svg as any).__cursorInteractionCleanup = cleanup\n}\n\nexport function getZoom() {\n\tif (!svg) return 1\n\tconst el = svg.querySelector('g.zoom') as SVGGElement\n\tif (!el) return 1\n\t\n\t// Parse zoom from transform attribute to match how we set it\n\tconst transform = el.getAttribute('transform') || ''\n\tconst scaleMatch = transform.match(/scale\\(([^)]+)\\)/)\n\tif (scaleMatch) {\n\t\treturn parseFloat(scaleMatch[1]) || 1\n\t}\n\treturn 1\n}\n\n// svgPadding is now imported as SVG_PADDING from constants.ts\n\nexport function setZoom(zoom: number) {\n\tif (!svg) return\n\tconst el = svg.querySelector('g.zoom') as SVGGElement\n\tif (!el) return\n\t\n\t// Preserve existing translation when setting zoom\n\tconst currentTransform = getCurrentTransform()\n\tel.setAttribute('transform', `translate(${currentTransform.x}, ${currentTransform.y}) scale(${zoom})`)\n\t\n\t// also set panning size\n\tupdatePanning()\n}\n\nexport function setZoomCentered(newZoom: number, centerX?: number, centerY?: number) {\n\tconst el = svg.querySelector('g.zoom') as SVGGElement\n\tconst oldZoom = getZoom()\n\t\n\t// If no center point provided, use viewport center\n\tif (centerX === undefined || centerY === undefined) {\n\t\t// Use the parent container's dimensions for the visible viewport\n\t\t// The SVG might be larger than the visible area due to overflow\n\t\tconst container = svg.parentElement\n\t\tif (container) {\n\t\t\tcenterX = container.clientWidth / 2\n\t\t\tcenterY = container.clientHeight / 2\n\t\t} else {\n\t\t\t// Fallback to SVG dimensions if no parent\n\t\t\tcenterX = svg.clientWidth / 2\n\t\t\tcenterY = svg.clientHeight / 2\n\t\t}\n\t}\n\t\n\t// Get current transform\n\tconst currentTransform = getCurrentTransform()\n\t\n\t// Convert screen coordinates to drawing coordinates\n\t// For transform order translate(tx, ty) scale(s):\n\t// screen_point = (drawing_point * scale) + translation\n\t// So: drawing_point = (screen_point - translation) / scale\n\tconst drawingX = (centerX - currentTransform.x) / oldZoom\n\tconst drawingY = (centerY - currentTransform.y) / oldZoom\n\t\n\t// Calculate new translation to keep the same drawing point at the same screen position\n\t// screen_point = (drawing_point * new_scale) + new_translation\n\t// So: new_translation = screen_point - (drawing_point * new_scale)\n\tconst newTranslateX = centerX - (drawingX * newZoom)\n\tconst newTranslateY = centerY - (drawingY * newZoom)\n\t\n\t// Apply the new transform\n\tel.setAttribute('transform', `translate(${newTranslateX}, ${newTranslateY}) scale(${newZoom})`)\n\t\n\t// Update panning\n\tupdatePanning()\n}\n\nfunction getCurrentTransform() {\n\tif (!svg) return { x: 0, y: 0 }\n\tconst el = svg.querySelector('g.zoom') as SVGGElement\n\tif (!el) return { x: 0, y: 0 }\n\t\n\tconst transform = el.getAttribute('transform') || ''\n\tconst translateMatch = transform.match(/translate\\(([^,]+),([^)]+)\\)/)\n\tif (translateMatch) {\n\t\treturn {\n\t\t\tx: parseFloat(translateMatch[1]) || 0,\n\t\t\ty: parseFloat(translateMatch[2]) || 0\n\t\t}\n\t}\n\treturn { x: 0, y: 0 }\n}\n\nfunction updatePanning() {\n\tif (!svg) return\n\tconst el = svg.querySelector('g.zoom') as SVGGElement\n\tif (!el) return\n\tconst bb = el.getBBox()\n\tconst zoom = getZoom()\n\tif (!svg.parentElement) return\n\tconst w = Math.max(svg.parentElement.clientWidth / zoom, bb.x + bb.width + SVG_PADDING)\n\tconst h = Math.max(svg.parentElement.clientHeight / zoom, bb.y + bb.height + SVG_PADDING)\n\tsvg.setAttribute('width', String(w * zoom))\n\tsvg.setAttribute('height', String(h * zoom))\n\t\n\t// Note: View state saving removed from here to prevent interference with reset/fit functions\n\t// View state is now only saved on user interactions and page unload\n}\n\n// Optimized version that uses pre-calculated content bounds instead of expensive getBBox()\nfunction updatePanningOptimized(graphData: GraphData) {\n\tconst bb = graphData.calculateContentBounds() // Use already calculated bounds\n\tconst zoom = getZoom()\n\tconst w = Math.max(svg.parentElement.clientWidth / zoom, bb.x + bb.width + SVG_PADDING)\n\tconst h = Math.max(svg.parentElement.clientHeight / zoom, bb.y + bb.height + SVG_PADDING)\n\tsvg.setAttribute('width', String(w * zoom))\n\tsvg.setAttribute('height', String(h * zoom))\n}\n\nexport const getZoomAuto = () => {\n\t// Get the graph data to calculate proper content bounds\n\tconst graphData = (svg as any).__data as GraphData\n\tif (!graphData) {\n\t\treturn 1 // Default zoom if no graph data\n\t}\n\t\n\t// Use proper content bounds calculation\n\tconst contentBounds = graphData.calculateContentBounds()\n\tconst viewportWidth = svg.parentElement?.clientWidth || 800\n\tconst viewportHeight = svg.parentElement?.clientHeight || 600\n\t\n\t// Add padding around content\n\tconst padding = 40\n\t\n\t// Calculate zoom to fit content with padding\n\tconst zoomX = (viewportWidth - padding * 2) / contentBounds.width\n\tconst zoomY = (viewportHeight - padding * 2) / contentBounds.height\n\tconst zoom = Math.min(zoomX, zoomY)\n\t\n\t// Clamp zoom between reasonable bounds\n\treturn Math.max(Math.min(zoom, 2), 0.1)\n}\n\nconst setBorderStyle = (el: SVGElement, style: string) => {\n\tif (style == 'Dashed') el.setAttribute('stroke-dasharray', '4')\n\telse if (style == 'Dotted') el.setAttribute('stroke-dasharray', '2')\n}\n\nconst styles = {\n\t//node styles\n\tnodeBorder: {\n\t\t// Don't set fill and stroke here - let tag-specific styles handle colors\n\t\tfilter: 'url(#shadow)',\n\t},\n\tnodeText: {\n\t\t'font-family': 'Arial, sans-serif',\n\t\tstroke: \"none\"\n\t},\n\n\t//edge styles\n\tedgeText: {\n\t\t'font-family': 'Arial, sans-serif',\n\t\tstroke: \"none\"\n\t},\n\n\tedgeRect: {\n\t\tfill: \"none\",\n\t\tstroke: \"none\",\n\t},\n\n\t//group styles\n\tgroupRect: {\n\t\t//fill: \"none\",\n\t\tfill: \"rgba(0, 0, 0, 0.02)\",\n\t\tstroke: \"#666\",\n\t\t'stroke-width': 3,\n\t\t\"stroke-dasharray\": 4,\n\t},\n\tgroupText: {\n\t\t'font-family': 'Arial, sans-serif',\n\t\tfill: \"#666\",\n\t\t\"font-size\": 22,\n\t\t\"font-weight\": \"bold\",\n\t\tcursor: \"default\"\n\t}\n}\n\n// View state persistence - similar to undo cache but for zoom/pan\nconst viewStateCache = new Map();\n\n// Save current view state (zoom and pan)\nexport function saveViewState(graphId: string) {\n\tif (!svg) return;\n\t\n\tconst zoom = getZoom();\n\tconst transform = getCurrentTransform();\n\t\n\tconst state = {\n\t\tzoom,\n\t\ttransform: { x: transform.x, y: transform.y }\n\t};\n\t\n\tviewStateCache.set(graphId, state);\n}\n\n// Restore view state if it exists\nexport function restoreViewState(graphId: string): boolean {\n\tif (!svg || !viewStateCache.has(graphId)) {\n\t\treturn false;\n\t}\n\t\n\tconst state = viewStateCache.get(graphId);\n\tif (!state) {\n\t\treturn false;\n\t}\n\t\n\t// Restore zoom and transform\n\tconst zoomGroup = svg.querySelector('g.zoom') as SVGGElement;\n\tif (zoomGroup) {\n\t\tzoomGroup.setAttribute('transform', `scale(${state.zoom}) translate(${state.transform.x}, ${state.transform.y})`);\n\t\tupdatePanning();\n\t}\n\t\n\treturn true;\n}\n\n// Clear view state for a graph\nexport function clearViewState(graphId: string) {\n\tviewStateCache.delete(graphId);\n}\n\n/**\n * Find the optimal position to insert a label vertex into the routing path\n * to minimize disruption to the existing route\n */\nfunction findOptimalLabelPosition(vertices: Point[], labelPos: Point, fromNode: Point, toNode: Point): number {\n\t// If no existing vertices, insert at the beginning\n\tif (vertices.length === 0) {\n\t\treturn 0;\n\t}\n\t\n\t// Build the full routing path including start/end nodes\n\tconst fullPath = [fromNode, ...vertices, toNode];\n\t\n\t// Find the closest point on the path to the label position\n\tlet minDistance = Infinity;\n\tlet bestSegmentIndex = 0;\n\t\n\tfor (let i = 0; i < fullPath.length - 1; i++) {\n\t\tconst segmentStart = fullPath[i];\n\t\tconst segmentEnd = fullPath[i + 1];\n\t\t\n\t\t// Calculate distance from label position to this segment\n\t\tconst distance = distanceToSegment(labelPos, segmentStart, segmentEnd);\n\t\t\n\t\tif (distance < minDistance) {\n\t\t\tminDistance = distance;\n\t\t\tbestSegmentIndex = i;\n\t\t}\n\t}\n\t\n\t// Convert full path index to vertices array index\n\t// bestSegmentIndex 0 means between fromNode and vertices[0] -> insert at 0\n\t// bestSegmentIndex 1 means between vertices[0] and vertices[1] -> insert at 1\n\t// etc.\n\treturn bestSegmentIndex;\n}\n\n/**\n * Calculate distance from a point to a line segment\n */\nfunction distanceToSegment(point: Point, segmentStart: Point, segmentEnd: Point): number {\n\tconst A = point.x - segmentStart.x;\n\tconst B = point.y - segmentStart.y;\n\tconst C = segmentEnd.x - segmentStart.x;\n\tconst D = segmentEnd.y - segmentStart.y;\n\t\n\tconst dot = A * C + B * D;\n\tconst lenSq = C * C + D * D;\n\t\n\tif (lenSq === 0) {\n\t\t// Segment is actually a point\n\t\treturn Math.sqrt(A * A + B * B);\n\t}\n\t\n\tlet param = dot / lenSq;\n\t\n\tlet xx, yy;\n\t\n\tif (param < 0) {\n\t\txx = segmentStart.x;\n\t\tyy = segmentStart.y;\n\t} else if (param > 1) {\n\t\txx = segmentEnd.x;\n\t\tyy = segmentEnd.y;\n\t} else {\n\t\txx = segmentStart.x + param * C;\n\t\tyy = segmentStart.y + param * D;\n\t}\n\t\n\tconst dx = point.x - xx;\n\tconst dy = point.y - yy;\n\treturn Math.sqrt(dx * dx + dy * dy);\n}\n\n/**\n * Project a label position onto the line segment where it will be inserted\n */\nfunction projectLabelOntoSegment(vertices: Point[], labelPos: Point, insertPos: number, fromNode: Point, toNode: Point): Point {\n\t// Build the full routing path including start/end nodes\n\tconst fullPath = [fromNode, ...vertices, toNode];\n\t\n\t// The segment where we're inserting is between fullPath[insertPos] and fullPath[insertPos + 1]\n\tconst segmentStart = fullPath[insertPos];\n\tconst segmentEnd = fullPath[insertPos + 1];\n\t\n\t// Project the label position onto this line segment\n\treturn projectPointOntoSegment(labelPos, segmentStart, segmentEnd);\n}\n\n/**\n * Project a point onto a line segment (closest point on the segment)\n */\nfunction projectPointOntoSegment(point: Point, segmentStart: Point, segmentEnd: Point): Point {\n\tconst A = point.x - segmentStart.x;\n\tconst B = point.y - segmentStart.y;\n\tconst C = segmentEnd.x - segmentStart.x;\n\tconst D = segmentEnd.y - segmentStart.y;\n\t\n\tconst dot = A * C + B * D;\n\tconst lenSq = C * C + D * D;\n\t\n\tif (lenSq === 0) {\n\t\t// Segment is actually a point, return that point\n\t\treturn { x: segmentStart.x, y: segmentStart.y };\n\t}\n\t\n\tlet param = dot / lenSq;\n\t\n\t// Clamp to segment (don't extend beyond endpoints)\n\tparam = Math.max(0, Math.min(1, param));\n\t\n\treturn {\n\t\tx: segmentStart.x + param * C,\n\t\ty: segmentStart.y + param * D\n\t};\n}","import { Point, BBox, calculateDistance } from './constants';\nimport { intersectPolylineBox, Segment } from './intersect';\n\n// Define interfaces locally since they're not exported from graph.ts\ninterface NodeStyle {\n\tbackground?: string;\n\tstroke?: string;\n\topacity?: number;\n\tfontSize?: number;\n\tshape?: string;\n\tborder?: string;\n}\n\ninterface Node extends Point {\n\tid: string;\n\ttitle: string;\n\tsub: string;\n\tdescription: string;\n\twidth: number;\n\theight: number;\n\tref?: SVGGElement;\n\tselected?: boolean;\n\tintersect: (p: Point) => Point;\n\tstyle: NodeStyle;\n}\n\ninterface EdgeVertex extends Point {\n\tid: string;\n\tselected?: boolean;\n\tref?: SVGElement;\n\tlabel?: boolean;\n\tauto?: boolean;\n}\n\ninterface EdgeStyle {\n\tcolor?: string;\n\tthickness?: number;\n\tfontSize?: number;\n\tposition?: number;\n\tdashed?: boolean;\n}\n\ninterface Edge {\n\tid: string;\n\tlabel: string;\n\tfrom: Node;\n\tto: Node;\n\tvertices?: EdgeVertex[];\n\tref?: SVGGElement;\n\tstyle: EdgeStyle;\n\tinitVertex: (p: Point) => EdgeVertex;\n\tuserDeletedVertices?: boolean; // Track if user explicitly deleted vertices\n}\n\ninterface GraphData {\n\tid: string;\n\tname: string;\n\tnodesMap: Map;\n\tedges: Edge[];\n\tedgeVertices: Map;\n\tgroupsMap: Map;\n\tmetadata: any;\n}\n\nexport interface EdgeLabelPlacement extends Point {\n\torientation: 'horizontal' | 'vertical';\n\tsegment?: Segment;\n\tmovable: boolean;\n}\n\n/**\n * Calculate edge vertices, handling multi-edge scenarios and auto-vertices\n */\nexport function calculateEdgeVertices(edge: Edge, data: GraphData): Point[] {\n\tconst n1 = edge.from, n2 = edge.to;\n\t\n\t\n\t// if vertices exists, follow them\n\tlet vertices: Point[] = edge.vertices ? edge.vertices.concat() : [];\n\t// Don't remove label vertices - they should be preserved for rendering\n\t// (The autoLayout process handles replacing old ones with new ones)\n\tconst tmp = (vertices as EdgeVertex[]);\n\n\tif (vertices.length == 0 && !edge.userDeletedVertices) {\n\t\t// Only create auto vertices if user hasn't explicitly deleted them\n\t\t// for edges with same \"from\" and \"to\", we must spread the labels so they don't overlap\n\t\t// lookup the other \"same\" edges\n\t\tconst sameEdges = data.edges.filter(e => e.from == edge.from && e.to == edge.to)\n\t\tlet spreadPos = 0\n\t\tif (sameEdges.length > 1) {\n\t\t\tconst idx = sameEdges.indexOf(edge) // my index in the list of same edges\n\t\t\tspreadPos = idx - (sameEdges.length - 1) / 2\n\n\t\t\tlet spreadX = 0, spreadY = 0;\n\t\t\tif (Math.abs(n1.x - n2.x) > Math.abs(n1.y - n2.y)) {\n\t\t\t\tspreadY = spreadPos * 70\n\t\t\t} else {\n\t\t\t\tspreadX = spreadPos * 200\n\t\t\t}\n\t\t\tconst v = edge.initVertex({\n\t\t\t\tx: (n1.x + n2.x) / 2 + spreadX,\n\t\t\t\ty: (n1.y + n2.y) / 2 + spreadY\n\t\t\t})\n\t\t\tv.label = true\n\t\t\tv.auto = true\n\t\t\tvertices.push(v)\n\t\t} else {\n\t\t\t// If there are no user-defined vertices and not a multi-edge scenario,\n\t\t\t// we don't create any auto-vertices here. AutoLayout will provide them.\n\t\t\t// The path will be a straight line between n1 and n2 (after intersection points are calculated).\n\t\t\t// ELK/autoLayout is responsible for providing bend points for non-straight lines.\n\t\t}\n\t}\n\n\tvertices.unshift(n1)\n\tvertices.push(n2)\n\n\t// Calculate intersection points with node boundaries\n\t// Find first non-label vertex for start intersection\n\tlet firstRoutingVertex = vertices[vertices.length - 1]; // Default to end node\n\tfor (let i = 1; i < vertices.length - 1; i++) {\n\t\tif (!(vertices[i] as any).label) {\n\t\t\tfirstRoutingVertex = vertices[i];\n\t\t\tbreak;\n\t\t}\n\t}\n\t\n\t// Find last non-label vertex for end intersection \n\tlet lastRoutingVertex = vertices[0]; // Default to start node\n\tfor (let i = vertices.length - 2; i > 0; i--) {\n\t\tif (!(vertices[i] as any).label) {\n\t\t\tlastRoutingVertex = vertices[i];\n\t\t\tbreak;\n\t\t}\n\t}\n\t\n\t// For connections without routing vertices, ensure we have proper direction\n\t// The defaults are already correct: firstRoutingVertex = n2, lastRoutingVertex = n1\n\t\n\t\n\t// Calculate proper node boundary intersection\n\tconst calculateNodeIntersection = (node: any, targetPoint: Point): Point => {\n\t\tconst nodeShape = node.style?.shape?.toLowerCase() || 'box';\n\t\tconst dx = targetPoint.x - node.x;\n\t\tconst dy = targetPoint.y - node.y;\n\t\tconst nodeCenter = { x: node.x, y: node.y };\n\t\t\n\t\t// If target is at center, default to right edge\n\t\tif (Math.abs(dx) < 0.01 && Math.abs(dy) < 0.01) {\n\t\t\treturn { x: node.x + node.width / 2, y: node.y };\n\t\t}\n\t\t\n\t\tif (nodeShape === 'cylinder') {\n\t\t\t// Cylinder shape intersection (same as shapes.ts)\n\t\t\tconst w = node.width;\n\t\t\tconst rx = w / 2;\n\t\t\tconst ry = rx / (5.5 + w / 70);\n\t\t\tconst halfHeight = node.height / 2;\n\t\t\t\n\t\t\t// First calculate rectangular bounds intersection\n\t\t\tconst angle = Math.atan2(dy, dx);\n\t\t\tconst cos = Math.cos(angle);\n\t\t\tconst sin = Math.sin(angle);\n\t\t\t\n\t\t\t// Check intersection with rectangular bounds\n\t\t\tlet t = Infinity;\n\t\t\tif (Math.abs(cos) > 0.01) {\n\t\t\t\tt = Math.min(t, Math.abs(rx / cos));\n\t\t\t}\n\t\t\tif (Math.abs(sin) > 0.01) {\n\t\t\t\tt = Math.min(t, Math.abs(halfHeight / sin));\n\t\t\t}\n\t\t\t\n\t\t\tconst rectX = node.x + cos * t;\n\t\t\tconst rectY = node.y + sin * t;\n\t\t\t\n\t\t\t// Check if we need elliptical intersection for top/bottom curves\n\t\t\tconst topCurveY = node.y - halfHeight + ry;\n\t\t\tconst bottomCurveY = node.y + halfHeight - ry;\n\t\t\t\n\t\t\tif (rectY < topCurveY || rectY > bottomCurveY) {\n\t\t\t\t// Use ellipse intersection for curved parts\n\t\t\t\tconst ellipseY = rectY < topCurveY ? node.y - halfHeight + ry : node.y + halfHeight - ry;\n\t\t\t\t// Solve for ellipse intersection\n\t\t\t\tconst a = 1 / (rx * rx);\n\t\t\t\tconst b = -2 * node.x / (rx * rx);\n\t\t\t\tconst c = (node.x * node.x) / (rx * rx) + ((ellipseY - node.y) * (ellipseY - node.y)) / (ry * ry) - 1;\n\t\t\t\t\n\t\t\t\tconst discriminant = b * b - 4 * a * c;\n\t\t\t\tif (discriminant >= 0) {\n\t\t\t\t\tconst sqrt_d = Math.sqrt(discriminant);\n\t\t\t\t\tconst x1 = (-b + sqrt_d) / (2 * a);\n\t\t\t\t\tconst x2 = (-b - sqrt_d) / (2 * a);\n\t\t\t\t\t\n\t\t\t\t\t// Choose the intersection in the direction of the target\n\t\t\t\t\tconst intersectX = dx > 0 ? Math.max(x1, x2) : Math.min(x1, x2);\n\t\t\t\t\treturn { x: intersectX, y: ellipseY };\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\treturn { x: rectX, y: rectY };\n\t\t\t\n\t\t} else if (nodeShape === 'circle') {\n\t\t\tconst radius = node.width / 2;\n\t\t\tconst angle = Math.atan2(dy, dx);\n\t\t\treturn {\n\t\t\t\tx: node.x + Math.cos(angle) * radius,\n\t\t\t\ty: node.y + Math.sin(angle) * radius\n\t\t\t};\n\t\t\t\n\t\t} else if (nodeShape === 'ellipse') {\n\t\t\tconst rx = node.width * 0.55;\n\t\t\tconst ry = node.width * 0.45;\n\t\t\tconst angle = Math.atan2(dy, dx);\n\t\t\tconst cos = Math.cos(angle);\n\t\t\tconst sin = Math.sin(angle);\n\t\t\t\n\t\t\t// Parametric ellipse intersection\n\t\t\tconst t = Math.sqrt((rx * rx * sin * sin) + (ry * ry * cos * cos));\n\t\t\treturn {\n\t\t\t\tx: node.x + (rx * cos * ry) / t,\n\t\t\t\ty: node.y + (ry * sin * rx) / t\n\t\t\t};\n\t\t\t\n\t\t} else {\n\t\t\t// Default rectangular intersection\n\t\t\tconst halfWidth = node.width / 2;\n\t\t\tconst halfHeight = node.height / 2;\n\t\t\tconst angle = Math.atan2(dy, dx);\n\t\t\tconst cos = Math.cos(angle);\n\t\t\tconst sin = Math.sin(angle);\n\t\t\t\n\t\t\t// Calculate which edge we hit first\n\t\t\tlet t = Infinity;\n\t\t\tif (Math.abs(cos) > 0.01) {\n\t\t\t\tt = Math.min(t, Math.abs(halfWidth / cos));\n\t\t\t}\n\t\t\tif (Math.abs(sin) > 0.01) {\n\t\t\t\tt = Math.min(t, Math.abs(halfHeight / sin));\n\t\t\t}\n\t\t\t\n\t\t\treturn {\n\t\t\t\tx: node.x + cos * t,\n\t\t\t\ty: node.y + sin * t\n\t\t\t};\n\t\t}\n\t};\n\t\n\t// Calculate intersections, but use the direction from center to NEXT vertex in sequence\n\t// This ensures the line exits the node in the direction it needs to go\n\t\n\t// For start intersection: use direction from node center to first routing vertex\n\tlet startIntersection = calculateNodeIntersection(n1, firstRoutingVertex);\n\t\n\t// For end intersection: use direction from node center to last routing vertex \n\tlet endIntersection = calculateNodeIntersection(n2, lastRoutingVertex);\n\t\n\t// Start intersection: NO offset needed - intersection already gives perfect boundary point\n\t// End intersection: NO offset needed - the arrow marker now has refX=\"0\" so the tip is at the endpoint\n\t\n\tvertices[0] = startIntersection;\n\tvertices[vertices.length - 1] = endIntersection;\n\t\n\treturn vertices;\n}\n\n/**\n * Calculate the label anchor and the orientation of the path segment that owns\n * it. Renderers use the orientation to place text beside the relationship line\n * instead of centering text over vertical segments.\n */\nexport function calculateLabelPlacement(\n\tvertices: Point[],\n\tposition: number,\n\tfallback: Point,\n): EdgeLabelPlacement {\n\tlet point = {x: fallback.x, y: fallback.y};\n\tlet segment: Segment | undefined;\n\tconst labelIndex = vertices.findIndex(vertex => (vertex as EdgeVertex).label);\n\tlet movable = true;\n\n\tif (labelIndex >= 0) {\n\t\tconst labelVertex = vertices[labelIndex] as EdgeVertex;\n\t\tpoint = labelVertex;\n\t\tmovable = labelVertex.auto === true;\n\t\tconst adjacentSegments: Segment[] = [];\n\t\tif (labelIndex > 0) {\n\t\t\tadjacentSegments.push({p: vertices[labelIndex - 1], q: point});\n\t\t}\n\t\tif (labelIndex < vertices.length - 1) {\n\t\t\tadjacentSegments.push({p: point, q: vertices[labelIndex + 1]});\n\t\t}\n\t\tsegment = adjacentSegments.reduce((longest, candidate) => {\n\t\t\tif (!longest) {\n\t\t\t\treturn candidate;\n\t\t\t}\n\t\t\treturn calculateDistance(candidate.p, candidate.q) >\n\t\t\t\tcalculateDistance(longest.p, longest.q)\n\t\t\t\t? candidate\n\t\t\t\t: longest;\n\t\t}, undefined);\n\t} else {\n\t\tconst totalLength = vertices.slice(1).reduce(\n\t\t\t(sum, vertex, index) => sum + calculateDistance(vertices[index], vertex),\n\t\t\t0,\n\t\t);\n\t\tconst targetLength = totalLength * position;\n\t\tlet traversed = 0;\n\t\tfor (let index = 1; index < vertices.length; index++) {\n\t\t\tconst candidate = {p: vertices[index - 1], q: vertices[index]};\n\t\t\tconst length = calculateDistance(candidate.p, candidate.q);\n\t\t\tif (length > 0 && traversed + length >= targetLength) {\n\t\t\t\tconst segmentPosition = (targetLength - traversed) / length;\n\t\t\t\tpoint = {\n\t\t\t\t\tx: candidate.p.x + (candidate.q.x - candidate.p.x) * segmentPosition,\n\t\t\t\t\ty: candidate.p.y + (candidate.q.y - candidate.p.y) * segmentPosition,\n\t\t\t\t};\n\t\t\t\tsegment = candidate;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\ttraversed += length;\n\t\t}\n\t}\n\n\tconst horizontalDistance = segment ? Math.abs(segment.q.x - segment.p.x) : 0;\n\tconst verticalDistance = segment ? Math.abs(segment.q.y - segment.p.y) : 0;\n\treturn {\n\t\t...point,\n\t\torientation: verticalDistance > horizontalDistance ? 'vertical' : 'horizontal',\n\t\tsegment,\n\t\tmovable,\n\t};\n}\n\n/**\n * Create edge segments and generate SVG path\n */\nexport function createEdgeSegments(vertices: Point[], bbox: BBox, n1: Point, n2: Point): { segments: Segment[], path: string } {\n\tconst segments: Segment[] = []\n\tfor (let i = 1; i < vertices.length; i++) {\n\t\tsegments.push({p: vertices[i - 1], q: vertices[i]})\n\t}\n\t\n\t// Debug the final segment that will have the arrow\n\tif (segments.length > 0) {\n\t\tconst lastSegment = segments[segments.length - 1];\n\t}\n\t// splice edge over label box\n\tintersectPolylineBox(segments, bbox)\n\n\t// Generate path based on routing style - SIMPLIFIED\n\tlet path: string\n\t\n\t// Always draw a polyline through the segments.\n\t// If segments.length is 1 (meaning direct connection or only label vertex), it will be a straight line.\n\t// If autoLayout provided bend points, those will be in `segments`.\n\tif (segments.length > 0) {\n\t\tpath = `M${segments[0].p.x},${segments[0].p.y}`\n\t\tfor (let i = 0; i < segments.length; i++) {\n\t\t\tconst s = segments[i]\n\t\t\t// For polylines, we just draw line segments to each vertex point.\n\t\t\t// The ELK 'POLYLINE' routing should give us the necessary bend points.\n\t\t\tpath += ` L${s.q.x},${s.q.y}`\n\t\t}\n\t} else {\n\t\t// Fallback for edges with no segments (should ideally not happen if n1 and n2 are defined)\n\t\t// Draw a straight line between n1 and n2 directly if no vertices/segments exist.\n\t\t// Note: Intersection points are calculated before this, so n1/n2 are already adjusted.\n\t\tpath = `M${n1.x},${n1.y} L${n2.x},${n2.y}`\n\t}\n\t\n\treturn { segments, path };\n}","import {GraphData, Node, Group, LayoutDirection} from \"./graph\";\n\nexport interface LayoutOptions {\n\tdirection?: LayoutDirection;\n\tnodeSpacing?: number;\n\tlayerSpacing?: number;\n\tcompactLayout?: boolean;\n}\n\n// Simplified spacing configuration\ninterface SpacingConfig {\n\tnodeSpacing: number;\n\tlayerSpacing: number;\n\tcomponentSpacing: number;\n\tpadding: number;\n\tgroupMultiplier: number;\n}\n\n// Spacing configuration - balanced for readability\nconst DEFAULT_SPACING: SpacingConfig = {\n\tnodeSpacing: 80, // Comfortable vertical spacing between nodes in same layer\n\tlayerSpacing: 60, // Layer spacing (between nodes in flow direction)\n\tcomponentSpacing: 80, // Separation between disconnected components\n\tpadding: 40, // Padding around the entire layout (for group labels)\n\tgroupMultiplier: 0.65, // Moderate compaction within groups\n};\n\n// Helper function to get effective spacing for a context\nfunction getEffectiveSpacing(\n\tuserOptions: LayoutOptions = {},\n\tisGroup: boolean = false\n): SpacingConfig {\n\t// Apply user overrides to base config\n\tconst effectiveConfig: SpacingConfig = {\n\t\tnodeSpacing: userOptions.nodeSpacing ?? DEFAULT_SPACING.nodeSpacing,\n\t\tlayerSpacing: userOptions.layerSpacing ?? DEFAULT_SPACING.layerSpacing,\n\t\tcomponentSpacing: DEFAULT_SPACING.componentSpacing,\n\t\tpadding: DEFAULT_SPACING.padding,\n\t\tgroupMultiplier: DEFAULT_SPACING.groupMultiplier,\n\t};\n\t\n\t// Apply group multiplier if in group context\n\tif (isGroup) {\n\t\teffectiveConfig.nodeSpacing = Math.max(\n\t\t\teffectiveConfig.nodeSpacing * effectiveConfig.groupMultiplier,\n\t\t\t30 // Minimum 30px spacing within groups\n\t\t);\n\t\teffectiveConfig.layerSpacing = Math.max(\n\t\t\teffectiveConfig.layerSpacing * effectiveConfig.groupMultiplier,\n\t\t\t35 // Minimum 35px layer spacing within groups\n\t\t);\n\t\teffectiveConfig.componentSpacing = Math.max(\n\t\t\teffectiveConfig.componentSpacing * effectiveConfig.groupMultiplier,\n\t\t\t25 // Minimum 25px component spacing within groups\n\t\t);\n\t\teffectiveConfig.padding = Math.max(\n\t\t\teffectiveConfig.padding * effectiveConfig.groupMultiplier,\n\t\t\t15 // Minimum 15px padding within groups\n\t\t);\n\t}\n\t\n\treturn effectiveConfig;\n}\n\n// Simplified ELK layout options builder\nfunction getELKOptions(\n\tspacing: SpacingConfig,\n\tuserOptions: LayoutOptions\n): Record {\n\tconst {\n\t\tdirection = 'DOWN',\n\t\tcompactLayout = false\n\t} = userOptions;\n\t\n\tconst baseOptions: Record = {\n\t\t'elk.algorithm': 'layered', // Back to layered for better orthogonal routing\n\t\t'elk.direction': direction,\n\t\t'elk.spacing.nodeNode': spacing.nodeSpacing.toString(),\n\t\t'elk.spacing.componentComponent': spacing.componentSpacing.toString(),\n\t\t'elk.padding': `[top=${spacing.padding},left=${spacing.padding},bottom=${spacing.padding},right=${spacing.padding}]`,\n\t\t\n\t\t// Layer spacing for compact layout\n\t\t'elk.layered.spacing.nodeNodeBetweenLayers': spacing.layerSpacing.toString(),\n\t\t'elk.layered.spacing.edgeNodeBetweenLayers': '10', // Minimal spacing around nodes\n\t\t'elk.layered.spacing.edgeEdgeBetweenLayers': '10', // Minimal space between edges\n\t\t\n\t\t// ORTHOGONAL edge routing for cleaner layout\n\t\t'elk.edgeRouting': 'POLYLINE',\n\t\t'elk.layered.unnecessaryBendpoints': 'false',\n\t\t\n\t\t// Minimal edge routing - straight lines where possible\n\t\t'elk.layered.edgeRouting.orthogonal.mode': 'DIRECTION_BASED',\n\t\t'elk.layered.edgeRouting.orthogonal.spacing': '5', // Minimal edge spacing\n\t\t'elk.layered.edgeRouting.orthogonal.nodeOverlapRatio': '0.1',\n\t\t\n\t\t// Compaction options\n\t\t'elk.layered.compaction.connectedComponents': 'true',\n\t\t'elk.layered.compaction.postCompaction.strategy': 'LEFT_RIGHT',\n\t\t\n\t\t// Separate components to reduce complexity\n\t\t'elk.separateConnectedComponents': 'true',\n\t\t\n\t\t// Node placement strategy for consistent vertical spacing\n\t\t'elk.layered.nodePlacement.strategy': 'NETWORK_SIMPLEX',\n\t\t'elk.layered.nodePlacement.favorStraightEdges': 'true',\n\t\t\n\t\t// Crossing minimization - respect model order for consistent layout\n\t\t'elk.layered.crossingMinimization.strategy': 'LAYER_SWEEP',\n\t\t'elk.layered.crossingMinimization.semiInteractive': 'true',\n\t\t\n\t\t// Flatten hierarchy for better edge routing\n\t\t'elk.hierarchyHandling': 'SEPARATE_CHILDREN',\n\t\t'elk.layered.considerModelOrder.strategy': 'NONE', // Ignore model ordering constraints\n\t\t\n\t\t// Edge label handling - minimal space, labels positioned above edges\n\t\t'elk.edgeLabels.placement': 'CENTER',\n\t\t'elk.edgeLabels.inline': 'true',\n\t\t'elk.spacing.edgeLabel': '5', // Minimal spacing for labels\n\t\t'elk.edgeLabels.avoidOverlap': 'false', // Disable collision avoidance\n\t\t'elk.edgeLabels.considerModelOrder': 'false',\n\t\t'elk.layered.edgeLabels.sideSelection': 'ALWAYS_UP', // Labels above edges\n\t};\n\t\n\t// Additional compact layout options if requested\n\tif (compactLayout) {\n\t\tbaseOptions['elk.spacing.nodeNode'] = Math.max(spacing.nodeSpacing * 0.7, 30).toString();\n\t\tbaseOptions['elk.layered.spacing.nodeNodeBetweenLayers'] = Math.max(spacing.layerSpacing * 0.7, 30).toString();\n\t}\n\t\n\treturn baseOptions;\n}\n\nexport async function autoLayout(graph: GraphData, options: LayoutOptions = {}): Promise<{\n\tnodes: Array<{id: string, x: number, y: number}>,\n\tedges: Array<{id: string, vertices: Array<{x: number, y: number}>, label?: {x: number, y: number}}>\n}> {\n\t// Dynamically import ELK only when auto-layout is used\n\tconst ELK = await import('elkjs/lib/elk.bundled.js').then(module => module.default);\n\tconst elk = new ELK();\n\t// Get systematic spacing configuration\n\tconst rootSpacing = getEffectiveSpacing(options, false);\n\t\n\t// Build ELK graph structure\n\tconst elkGraph = {\n\t\tid: \"root\",\n\t\tlayoutOptions: getELKOptions(rootSpacing, options),\n\t\tchildren: [] as any[],\n\t\tedges: [] as any[]\n\t};\n\n\t// Build actual ELK nodes first. Groups below take ownership of their direct\n\t// members so ELK reserves non-overlapping space for every boundary.\n\tconst nodeMap = new Map();\n\tconst elkNodes = new Map();\n\tgraph.nodesMap.forEach(node => {\n\t\tif (!node.id) return; // Skip nodes without IDs\n\t\t\n\t\tnodeMap.set(node.id, node);\n\t\t\n\t\t// Ensure minimum dimensions and validate node size data\n\t\t// Use larger height to account for shapes like Robot that extend above the center\n\t\tconst nodeWidth = Math.max(node.width || 200, 150); // Min width 150px\n\t\tconst nodeHeight = Math.max(node.height || 100, 250); // Min height 250px to account for robot shape\n\t\t\n\t\t// Add padding to node dimensions for ELK to account for arrow size\n\t\t// This makes ELK route edges to a slightly larger boundary so arrow tips stay outside\n\t\tconst arrowPadding = 25; // Padding for arrow clearance\n\t\t\n\t\telkNodes.set(node.id, {\n\t\t\tid: node.id,\n\t\t\t// Provide current position as hint to ELK\n\t\t\tx: node.x,\n\t\t\ty: node.y,\n\t\t\twidth: nodeWidth + (arrowPadding * 2),\n\t\t\theight: nodeHeight + (arrowPadding * 2),\n\t\t\tlayoutOptions: {\n\t\t\t\t// Allow ELK to move nodes but consider current positions\n\t\t\t\t'elk.position': '',\n\t\t\t\t// Force ELK to use our exact dimensions\n\t\t\t\t'elk.nodeSize.constraints': '[FIXED_SIZE]'\n\t\t\t}\n\t\t});\n\t});\n\n\tconst nodeParentGroup = new Map();\n\tconst groupParent = new Map();\n\tconst childGroupIDs = new Set();\n\n\tgraph.groupsMap.forEach(group => {\n\t\tgroup.nodes.forEach(member => {\n\t\t\tif (isGroup(member)) {\n\t\t\t\tif (!groupParent.has(member.id)) {\n\t\t\t\t\tgroupParent.set(member.id, group.id);\n\t\t\t\t}\n\t\t\t\tchildGroupIDs.add(member.id);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!nodeParentGroup.has(member.id)) {\n\t\t\t\tnodeParentGroup.set(member.id, group.id);\n\t\t\t}\n\t\t});\n\t});\n\n\tconst elkGroups = new Map();\n\tconst buildELKGroup = (group: Group): any => {\n\t\tconst existing = elkGroups.get(group.id);\n\t\tif (existing) return existing;\n\n\t\tconst children = group.nodes.flatMap(member => {\n\t\t\tif (isGroup(member)) {\n\t\t\t\treturn groupParent.get(member.id) === group.id ? [buildELKGroup(member)] : [];\n\t\t\t}\n\t\t\tconst node = elkNodes.get(member.id);\n\t\t\treturn node && nodeParentGroup.get(member.id) === group.id ? [node] : [];\n\t\t});\n\t\tconst elkGroup = {\n\t\t\tid: group.id,\n\t\t\tchildren,\n\t\t\tedges: [] as any[],\n\t\t\tlayoutOptions: getELKOptions(getEffectiveSpacing(options, true), options),\n\t\t};\n\t\telkGroups.set(group.id, elkGroup);\n\t\treturn elkGroup;\n\t};\n\n\tgraph.groupsMap.forEach(group => {\n\t\tif (!childGroupIDs.has(group.id)) {\n\t\t\tconst elkGroup = buildELKGroup(group);\n\t\t\tif (elkGroup.children.length > 0) {\n\t\t\t\telkGraph.children.push(elkGroup);\n\t\t\t}\n\t\t}\n\t});\n\telkNodes.forEach((node, id) => {\n\t\tif (!nodeParentGroup.has(id)) {\n\t\t\telkGraph.children.push(node);\n\t\t}\n\t});\n\n\tconst groupAncestors = (groupID?: string) => {\n\t\tconst ancestors: string[] = [];\n\t\tlet current = groupID;\n\t\twhile (current) {\n\t\t\tancestors.push(current);\n\t\t\tcurrent = groupParent.get(current);\n\t\t}\n\t\treturn ancestors;\n\t};\n\tconst lowestCommonGroup = (sourceID: string, destinationID: string) => {\n\t\tconst sourceAncestors = groupAncestors(nodeParentGroup.get(sourceID));\n\t\tconst destinationAncestors = new Set(groupAncestors(nodeParentGroup.get(destinationID)));\n\t\treturn sourceAncestors.find(groupID => destinationAncestors.has(groupID));\n\t};\n\n\tgraph.edges.forEach(edge => {\n\t\t// Skip edges without proper IDs\n\t\tif (!edge.id || !edge.from?.id || !edge.to?.id) return;\n\t\t\n\t\t// Verify source and target nodes exist in our node map\n\t\tif (!nodeMap.has(edge.from.id) || !nodeMap.has(edge.to.id)) {\n\t\t\tconsole.warn(`Skipping edge ${edge.id}: source ${edge.from.id} or target ${edge.to.id} not found in nodes`);\n\t\t\treturn;\n\t\t}\n\t\t\n\t\t// Calculate more accurate label dimensions for ELK\n\t\tconst labelWidth = edge.label && edge.label.trim() ? \n\t\t\tMath.min(edge.label.length * 7, 200) : 0; // More realistic width estimate\n\t\t\n\t\t\n\t\tconst elkEdge = {\n\t\t\tid: edge.id,\n\t\t\tsources: [edge.from.id],\n\t\t\ttargets: [edge.to.id],\n\t\t\t// Include label information with much smaller dimensions\n\t\t\tlabels: edge.label && edge.label.trim() ? [{\n\t\t\t\tid: `${edge.id}-label`,\n\t\t\t\ttext: edge.label,\n\t\t\t\t// Much more conservative label size estimates\n\t\t\t\twidth: labelWidth,\n\t\t\t\theight: 20, // More realistic label height\n\t\t\t\tlayoutOptions: {\n\t\t\t\t\t'elk.edgeLabels.placement': 'CENTER',\n\t\t\t\t\t'elk.edgeLabels.inline': 'true'\n\t\t\t\t\t// Remove the FIXED_SIZE constraint that might be forcing detours\n\t\t\t\t}\n\t\t\t}] : []\n\t\t};\n\n\t\tconst groupID = lowestCommonGroup(edge.from.id, edge.to.id);\n\t\tconst edgeContainer = groupID ? elkGroups.get(groupID) : elkGraph;\n\t\tedgeContainer.edges.push(elkEdge);\n\t});\n\n\t// Enhanced validation - ensure ELK gets complete data\n\tif (!elkGraph.id || !elkGraph.children) {\n\t\tthrow new Error('Invalid ELK graph structure');\n\t}\n\t\n\n\ttry {\n\t\tconst layoutedGraph = await elk.layout(elkGraph);\n\t\t\n\t\t// Extract results\n\t\tconst nodes: Array<{id: string, x: number, y: number}> = [];\n\t\tconst edges: Array<{id: string, vertices: Array<{x: number, y: number}>, label?: {x: number, y: number}}> = [];\n\n\n\t\t// Extract nodes from layout result\n\t\tconst extractNodes = (container: any, offsetX = 0, offsetY = 0) => {\n\t\t\tcontainer.children?.forEach((child: any) => {\n\t\t\t\tif (child.children) {\n\t\t\t\t\t// This is a group, recurse\n\t\t\t\t\textractNodes(child, offsetX + (child.x || 0), offsetY + (child.y || 0));\n\t\t\t\t} else {\n\t\t\t\t\t// This is a node\n\t\t\t\t\t// Adjust for the padding we added - ELK positioned based on padded size\n\t\t\t\t\t// So we need to shift by the padding amount to get the real center\n\t\t\t\t\tnodes.push({\n\t\t\t\t\t\tid: child.id,\n\t\t\t\t\t\tx: offsetX + (child.x || 0) + (child.width || 0) / 2,\n\t\t\t\t\t\ty: offsetY + (child.y || 0) + (child.height || 0) / 2\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\n\t\t// Process edges from ELK layout result to get routing information\n\t\tconst processEdgesFromELK = (container: any, offsetX = 0, offsetY = 0) => {\n\t\t\tcontainer.edges?.forEach((elkEdge: any) => {\n\t\t\t\tconst vertices: Array<{x: number, y: number}> = [];\n\t\t\t\tlet label: {x: number, y: number} | undefined;\n\n\t\t\t\t// Process edge sections to get bend points\n\t\t\t\tif (elkEdge.sections && elkEdge.sections.length > 0) {\n\t\t\t\t\telkEdge.sections.forEach((section: any) => {\n\t\t\t\t\t\t// Add start point if it exists\n\t\t\t\t\t\tif (section.startPoint) {\n\t\t\t\t\t\t\tvertices.push({\n\t\t\t\t\t\t\t\tx: offsetX + section.startPoint.x, \n\t\t\t\t\t\t\t\ty: offsetY + section.startPoint.y\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t// Add bend points (this is where ELK puts the routing vertices!)\n\t\t\t\t\t\tif (section.bendPoints && section.bendPoints.length > 0) {\n\t\t\t\t\t\t\tsection.bendPoints.forEach((bp: any) => {\n\t\t\t\t\t\t\t\tvertices.push({\n\t\t\t\t\t\t\t\t\tx: offsetX + bp.x, \n\t\t\t\t\t\t\t\t\ty: offsetY + bp.y\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t// Add end point if it exists\n\t\t\t\t\t\tif (section.endPoint) {\n\t\t\t\t\t\t\tvertices.push({\n\t\t\t\t\t\t\t\tx: offsetX + section.endPoint.x, \n\t\t\t\t\t\t\t\ty: offsetY + section.endPoint.y\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Extract ELK's calculated label positions (respect collision avoidance!)\n\t\t\t\tconst originalEdge = graph.edges.find(e => e.id === elkEdge.id);\n\t\t\t\tif (originalEdge?.label && originalEdge.label.trim()) {\n\t\t\t\t\tif (elkEdge.labels && elkEdge.labels.length > 0) {\n\t\t\t\t\t\tconst elkLabel = elkEdge.labels[0]; // Get first label\n\t\t\t\t\t\tif (elkLabel.x !== undefined && elkLabel.y !== undefined) {\n\t\t\t\t\t\t\tlabel = {\n\t\t\t\t\t\t\t\tx: offsetX + elkLabel.x + (elkLabel.width || 0) / 2, // Center of label\n\t\t\t\t\t\t\t\ty: offsetY + elkLabel.y + (elkLabel.height || 0) / 2\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (vertices.length >= 2) {\n\t\t\t\t\t\t// Fallback: use middle of edge if ELK didn't provide label position\n\t\t\t\t\t\tconst midIndex = Math.floor(vertices.length / 2);\n\t\t\t\t\t\tif (vertices.length % 2 === 0) {\n\t\t\t\t\t\t\tconst v1 = vertices[midIndex - 1];\n\t\t\t\t\t\t\tconst v2 = vertices[midIndex];\n\t\t\t\t\t\t\tlabel = { x: (v1.x + v2.x) / 2, y: (v1.y + v2.y) / 2 };\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tlabel = vertices[midIndex];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\n\t\t\t\tedges.push({\n\t\t\t\t\tid: elkEdge.id,\n\t\t\t\t\tvertices,\n\t\t\t\t\tlabel\n\t\t\t\t});\n\t\t\t});\n\t\t\t\n\t\t\t// Also process edges in child containers (groups)\n\t\t\tcontainer.children?.forEach((child: any) => {\n\t\t\t\tif (child.edges && child.edges.length > 0) {\n\t\t\t\t\tprocessEdgesFromELK(child, offsetX + (child.x || 0), offsetY + (child.y || 0));\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\n\n\t\textractNodes(layoutedGraph);\n\t\tprocessEdgesFromELK(layoutedGraph);\n\n\t\t// Normalize coordinates to start near (0,0) to prevent huge canvas sizes\n\t\t// while preserving relative positioning between elements\n\t\tif (nodes.length > 0) {\n\t\t\t// Find the minimum coordinates across all elements\n\t\t\tconst minX = Math.min(...nodes.map(n => n.x));\n\t\t\tconst minY = Math.min(...nodes.map(n => n.y));\n\t\t\t\n\t\t\t// Add some padding so content doesn't start at exact (0,0)\n\t\t\tconst padding = 50;\n\t\t\tconst offsetX = -minX + padding;\n\t\t\tconst offsetY = -minY + padding;\n\t\t\t\n\t\t\t// Normalize all node positions\n\t\t\tnodes.forEach(node => {\n\t\t\t\tnode.x += offsetX;\n\t\t\t\tnode.y += offsetY;\n\t\t\t});\n\t\t\t\n\t\t\t// Normalize all edge positions\n\t\t\tedges.forEach(edge => {\n\t\t\t\tedge.vertices.forEach(vertex => {\n\t\t\t\t\tvertex.x += offsetX;\n\t\t\t\t\tvertex.y += offsetY;\n\t\t\t\t});\n\t\t\t\tif (edge.label) {\n\t\t\t\t\tedge.label.x += offsetX;\n\t\t\t\t\tedge.label.y += offsetY;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn { nodes, edges };\n\n\t} catch (error) {\n\t\tconsole.warn('ELK layout failed, using fallback layout. Error:', error);\n\t\treturn createFallbackLayout(graph);\n\t}\n}\n\n// Simplified fallback layout\nfunction createFallbackLayout(graph: GraphData): {\n\tnodes: Array<{id: string, x: number, y: number}>,\n\tedges: Array<{id: string, vertices: Array<{x: number, y: number}>}>\n} {\n\tconst nodes: Array<{id: string, x: number, y: number}> = [];\n\tconst edges: Array<{id: string, vertices: Array<{x: number, y: number}>}> = [];\n\n\t// Simple grid layout for nodes\n\tlet x = 0, y = 0;\n\tconst spacing = 300;\n\tconst maxCols = Math.ceil(Math.sqrt(graph.nodesMap.size));\n\n\tlet col = 0;\n\tgraph.nodesMap.forEach(node => {\n\t\tnodes.push({\n\t\t\tid: node.id,\n\t\t\tx: x,\n\t\t\ty: y\n\t\t});\n\n\t\tcol++;\n\t\tif (col >= maxCols) {\n\t\t\tcol = 0;\n\t\t\tx = 0;\n\t\t\ty += spacing;\n\t\t} else {\n\t\t\tx += spacing;\n\t\t}\n\t});\n\n\t// Simple straight line edges\n\tgraph.edges.forEach(edge => {\n\t\tedges.push({\n\t\t\tid: edge.id,\n\t\t\tvertices: []\n\t\t});\n\t});\n\n\treturn { nodes, edges };\n}\n\nfunction isGroup(member: Node | Group): member is Group {\n\treturn \"nodes\" in member;\n}","\n import API from \"!../node_modules/.pnpm/style-loader@4.0.0_webpack@5.109.2/node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../node_modules/.pnpm/style-loader@4.0.0_webpack@5.109.2/node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../node_modules/.pnpm/style-loader@4.0.0_webpack@5.109.2/node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../node_modules/.pnpm/style-loader@4.0.0_webpack@5.109.2/node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../node_modules/.pnpm/style-loader@4.0.0_webpack@5.109.2/node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../node_modules/.pnpm/style-loader@4.0.0_webpack@5.109.2/node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../node_modules/.pnpm/css-loader@7.1.4_webpack@5.109.2/node_modules/css-loader/dist/cjs.js!./style.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../node_modules/.pnpm/css-loader@7.1.4_webpack@5.109.2/node_modules/css-loader/dist/cjs.js!./style.css\";\n export default content && content.locals ? content.locals : undefined;\n","interface LiveReloadOptions {\n\tminDelay: number;\n\tmaxDelay: number;\n\thandshakeTimeout: number;\n}\n\ninterface LiveReloadMessage {\n\tcommand: string;\n\tprotocols?: string[];\n\tver?: string;\n\tpath?: string;\n}\n\nclass Timer {\n\tprivate readonly callback: () => void;\n\tprivate readonly handler: () => void;\n\tprivate running: boolean = false;\n\tprivate timeoutId: ReturnType | null = null;\n\n\tconstructor(callback: () => void) {\n\t\tthis.callback = callback;\n\t\tthis.handler = () => {\n\t\t\tthis.running = false;\n\t\t\tthis.timeoutId = null;\n\t\t\tthis.callback();\n\t\t};\n\t}\n\n\tstart(timeout: number): void {\n\t\tif (this.running) {\n\t\t\tthis.stop();\n\t\t}\n\t\tthis.timeoutId = setTimeout(this.handler, timeout);\n\t\tthis.running = true;\n\t}\n\n\tstop(): void {\n\t\tif (this.running && this.timeoutId !== null) {\n\t\t\tclearTimeout(this.timeoutId);\n\t\t\tthis.running = false;\n\t\t\tthis.timeoutId = null;\n\t\t}\n\t}\n\n\tisRunning(): boolean {\n\t\treturn this.running;\n\t}\n}\n\n/**\n * RefreshConnector implements the livereload protocol to listen for file changes via WebSocket\n */\nexport class RefreshConnector {\n\tprivate static readonly DEFAULT_OPTIONS: LiveReloadOptions = {\n\t\tminDelay: 1000,\n\t\tmaxDelay: 60000,\n\t\thandshakeTimeout: 5000\n\t};\n\n\tprivate static readonly LIVERELOAD_PROTOCOLS = [\n\t\t'http://livereload.com/protocols/official-9',\n\t\t'http://livereload.com/protocols/2.x-remote-control'\n\t];\n\n\tprivate readonly uri: string;\n\tprivate readonly options: LiveReloadOptions;\n\tprivate readonly fileChangeHandler: (path: string) => void;\n\t\n\tprivate socket: WebSocket | null = null;\n\tprivate nextDelay: number;\n\tprivate connectionDesired: boolean = false;\n\tprivate disconnectionReason: string = '';\n\t\n\tprivate readonly handshakeTimeout: Timer;\n\tprivate readonly reconnectTimer: Timer;\n\n\tconstructor(fileChangeHandler: (file: string) => void, options?: Partial) {\n\t\tthis.fileChangeHandler = fileChangeHandler;\n\t\tthis.options = { ...RefreshConnector.DEFAULT_OPTIONS, ...options };\n\t\tthis.uri = 'ws://localhost:35729/livereload';\n\t\tthis.nextDelay = this.options.minDelay;\n\n\t\tthis.handshakeTimeout = new Timer(() => this.handleHandshakeTimeout());\n\t\tthis.reconnectTimer = new Timer(() => this.attemptReconnection());\n\t}\n\n\tconnect(): void {\n\t\tthis.connectionDesired = true;\n\n\t\tif (this.isSocketConnected()) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.prepareForConnection();\n\t\tthis.createWebSocket();\n\t}\n\n\tdisconnect(): void {\n\t\tthis.connectionDesired = false;\n\t\tthis.reconnectTimer.stop();\n\n\t\tif (this.isSocketConnected()) {\n\t\t\tthis.disconnectionReason = 'manual';\n\t\t\tthis.socket!.close();\n\t\t}\n\t}\n\n\tprivate isSocketConnected(): boolean {\n\t\treturn this.socket !== null && this.socket.readyState === WebSocket.OPEN;\n\t}\n\n\tprivate prepareForConnection(): void {\n\t\tthis.reconnectTimer.stop();\n\t\tthis.disconnectionReason = 'cannot-connect';\n\t}\n\n\tprivate createWebSocket(): void {\n\t\tthis.socket = new WebSocket(this.uri);\n\t\tthis.socket.onopen = () => this.handleOpen();\n\t\tthis.socket.onclose = () => this.handleClose();\n\t\tthis.socket.onmessage = (event) => this.handleMessage(event);\n\t\tthis.socket.onerror = () => this.handleError();\n\t}\n\n\tprivate handleOpen(): void {\n\t\tthis.disconnectionReason = 'handshake-failed';\n\t\tthis.startHandshake();\n\t}\n\n\tprivate handleClose(): void {\n\t\tconsole.log(`WebSocket disconnected: ${this.disconnectionReason}. Retry in ${this.nextDelay}ms`);\n\t\tthis.scheduleReconnection();\n\t}\n\n\tprivate handleMessage(event: MessageEvent): void {\n\t\ttry {\n\t\t\tconst message: LiveReloadMessage = JSON.parse(event.data);\n\t\t\tthis.processMessage(message);\n\t\t} catch (error) {\n\t\t\tconsole.error('Failed to parse WebSocket message:', error);\n\t\t}\n\t}\n\n\tprivate handleError(): void {\n\t\t// Error handling is done in onclose\n\t}\n\n\tprivate processMessage(message: LiveReloadMessage): void {\n\t\tswitch (message.command) {\n\t\t\tcase 'hello':\n\t\t\t\tthis.handleHelloMessage();\n\t\t\t\tbreak;\n\t\t\tcase 'reload':\n\t\t\t\tthis.handleReloadMessage(message);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tconsole.log('Unknown WebSocket message received:', message);\n\t\t}\n\t}\n\n\tprivate handleHelloMessage(): void {\n\t\tthis.handshakeTimeout.stop();\n\t\tthis.nextDelay = this.options.minDelay;\n\t}\n\n\tprivate handleReloadMessage(message: LiveReloadMessage): void {\n\t\t// The livereload server closes connection after sending reload\n\t\t// We must reconnect\n\t\tthis.reconnectTimer.stop();\n\t\tthis.connect();\n\n\t\tif (message.path) {\n\t\t\tthis.fileChangeHandler(message.path);\n\t\t}\n\t}\n\n\tprivate startHandshake(): void {\n\t\tconst helloMessage: LiveReloadMessage = {\n\t\t\tcommand: 'hello',\n\t\t\tprotocols: RefreshConnector.LIVERELOAD_PROTOCOLS,\n\t\t\tver: '3.3.1'\n\t\t};\n\t\t\n\t\tthis.sendCommand(helloMessage);\n\t\tthis.handshakeTimeout.start(this.options.handshakeTimeout);\n\t}\n\n\tprivate handleHandshakeTimeout(): void {\n\t\tif (this.isSocketConnected()) {\n\t\t\tthis.disconnectionReason = 'handshake-timeout';\n\t\t\tthis.socket!.close();\n\t\t}\n\t}\n\n\tprivate attemptReconnection(): void {\n\t\tif (this.connectionDesired) {\n\t\t\tthis.connect();\n\t\t}\n\t}\n\n\tprivate scheduleReconnection(): void {\n\t\tif (!this.connectionDesired) {\n\t\t\treturn; // Don't reconnect after manual disconnection\n\t\t}\n\n\t\tif (!this.reconnectTimer.isRunning()) {\n\t\t\tthis.reconnectTimer.start(this.nextDelay);\n\t\t\tthis.nextDelay = Math.min(this.options.maxDelay, this.nextDelay * 2);\n\t\t}\n\t}\n\n\tprivate sendCommand(command: LiveReloadMessage): void {\n\t\tif (this.isSocketConnected()) {\n\t\t\tthis.socket!.send(JSON.stringify(command));\n\t\t}\n\t}\n}","import { createRoot } from 'react-dom/client';\nimport React, { Suspense, lazy, useEffect, useState } from 'react';\nimport { refreshGraph } from \"./Root\";\nimport './style.css';\nimport '@fortawesome/fontawesome-free/css/all.css';\nimport { RefreshConnector } from \"./websocket\";\n\nconst Root = lazy(() => import('./Root').then(module => ({ default: module.Root })));\n\ninterface ModelData {\n\tmodel: any;\n\tlayout: any;\n}\n\ninterface AppState {\n\tdata: ModelData | null;\n\terror: string | null;\n\tloading: boolean;\n}\n\nconst App: React.FC = () => {\n\tconst [state, setState] = useState({\n\t\tdata: null,\n\t\terror: null,\n\t\tloading: true\n\t});\n\n\tconst loadData = async () => {\n\t\tsetState(prev => ({ ...prev, loading: true, error: null }));\n\t\t\n\t\ttry {\n\t\t\tconst [modelResponse, layoutResponse] = await Promise.all([\n\t\t\t\tfetch('data/model.json'),\n\t\t\t\tfetch('data/layout.json')\n\t\t\t]);\n\n\t\t\tif (!modelResponse.ok) {\n\t\t\t\tthrow new Error(`Failed to fetch model: ${modelResponse.statusText}`);\n\t\t\t}\n\t\t\t\n\t\t\tif (!layoutResponse.ok) {\n\t\t\t\tthrow new Error(`Failed to fetch layout: ${layoutResponse.statusText}`);\n\t\t\t}\n\n\t\t\tconst [model, layout] = await Promise.all([\n\t\t\t\tmodelResponse.json(),\n\t\t\t\tlayoutResponse.json()\n\t\t\t]);\n\n\t\t\tsetState({\n\t\t\t\tdata: { model, layout },\n\t\t\t\terror: null,\n\t\t\t\tloading: false\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tconsole.error('Failed to load data:', error);\n\t\t\tsetState({\n\t\t\t\tdata: null,\n\t\t\t\terror: error instanceof Error ? error.message : 'Unknown error occurred',\n\t\t\t\tloading: false\n\t\t\t});\n\t\t}\n\t};\n\n\tconst handleFileChange = (path: string) => {\n\t\tif (path.endsWith('.svg')) {\n\t\t\treturn; // Ignore SVG changes to avoid infinite loops\n\t\t}\n\t\t\n\t\tconsole.log('File changed:', path);\n\t\trefreshGraph();\n\t\tloadData();\n\t};\n\n\tuseEffect(() => {\n\t\tconst params = new URLSearchParams(document.location.search);\n\t\t// Headless rendering has no watcher and must not receive reloads from an\n\t\t// unrelated interactive editor using the shared LiveReload port.\n\t\tconst auto = params.get('auto');\n\t\tconst save = params.get('save');\n\t\tconst automated = auto === '1' || auto === 'true' || save === '1' || save === 'true';\n\t\tconst refreshConnector = automated ? null : new RefreshConnector(handleFileChange);\n\t\trefreshConnector?.connect();\n\n\t\t// Initial data load\n\t\tloadData();\n\n\t\treturn () => {\n\t\t\trefreshConnector?.disconnect();\n\t\t};\n\t}, []);\n\n\tif (state.loading) {\n\t\treturn ;\n\t}\n\n\tif (state.error) {\n\t\treturn ;\n\t}\n\n\tif (!state.data) {\n\t\treturn ;\n\t}\n\n\treturn (\n\t\t}>\n\t\t\t\n\t\t\n\t);\n};\n\nconst LoadingScreen: React.FC = () => (\n\t
\n\t\t
Loading...
\n\t
\n);\n\nconst ErrorScreen: React.FC<{ error: string; onRetry: () => void }> = ({ error, onRetry }) => (\n\t
\n\t\t

Error loading application

\n\t\t

{error}

\n\t\t\n\t
\n);\n\n// Initialize the application\nconst container = document.getElementById('root');\nif (!container) {\n\tthrow new Error('Root container not found');\n}\n\nconst root = createRoot(container);\nroot.render();","import React, {FC} from \"react\";\nimport { isMac, getModifierKeyName, getModifierKeyProperty } from './utils/platform';\n\ninterface Combination {\n\tctrl?: boolean;\n\tshift?: boolean;\n\talt?: boolean;\n\twheel?: boolean\n\tkey?: string;\n\tclick?: boolean;\n}\n\ninterface Shortcut {\n\tid: string,\n\thelp: string,\n\tcombinations: Combination[]\n}\n\nexport const SAVE = 'save'\n\nexport const UNDO = 'undo'\nexport const REDO = 'redo'\nexport const ADD_VERTEX = 'add-vertex'\nexport const ADD_LABEL_VERTEX = 'add-label-vertex'\nexport const DEL_VERTEX = 'del-vertex'\n\nexport const ZOOM_IN = 'zoom-in'\nexport const ZOOM_OUT = 'zoom-out'\nexport const ZOOM_FIT = 'zoom-fit'\nexport const ZOOM_100 = 'zoom-100'\n\nexport const SELECT_ALL = 'select-all'\nexport const DESELECT = 'deselect'\n\nexport const MOVE_LEFT = 'move-left'\nexport const MOVE_RIGHT = 'move-right'\nexport const MOVE_UP = 'move-up'\nexport const MOVE_DOWN = 'move-down'\nexport const MOVE_LEFT_FINE = 'move-left-fine'\nexport const MOVE_RIGHT_FINE = 'move-right-fine'\nexport const MOVE_UP_FINE = 'move-up-fine'\nexport const MOVE_DOWN_FINE = 'move-down-fine'\n\nexport const PAN_VIEW = 'pan-view'\nexport const SELECT_ELEMENT = 'select-element'\nexport const MULTI_SELECT = 'multi-select'\nexport const BOX_SELECT = 'box-select'\nexport const MOVE_ELEMENTS = 'move-elements'\n\nexport const HELP = 'help'\n\n// New shortcuts for toolbar buttons\nexport const TOGGLE_DRAG_MODE = 'toggle_drag_mode'\nexport const ALIGN_HORIZONTAL = 'align_horizontal'\nexport const ALIGN_VERTICAL = 'align_vertical'\nexport const DISTRIBUTE_HORIZONTAL = 'distribute_horizontal'\nexport const DISTRIBUTE_VERTICAL = 'distribute_vertical'\nexport const AUTO_LAYOUT = 'auto_layout'\nexport const RESET_POSITION = 'reset_position'\nexport const TOGGLE_GRID = 'toggle_grid'\nexport const TOGGLE_SNAP_TO_GRID = 'toggle_snap_to_grid'\nexport const SNAP_ALL_TO_GRID = 'snap_all_to_grid'\n\nconst shortcuts: { name: string; list: Shortcut[] }[] = [\n\t{\n\t\tname: 'Help',\n\t\tlist: [\n\t\t\t{\n\t\t\t\tid: HELP,\n\t\t\t\thelp: 'Show/hide this help',\n\t\t\t\tcombinations: [\n\t\t\t\t\t{key: '?', shift: true},\n\t\t\t\t\t{key: 'F1', shift: true}\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tname: 'File',\n\t\tlist: [\n\t\t\t{\n\t\t\t\tid: SAVE,\n\t\t\t\thelp: 'Save',\n\t\t\t\tcombinations: [{key: 's', ctrl: true}]\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tname: 'History',\n\t\tlist: [\n\t\t\t{\n\t\t\t\tid: UNDO,\n\t\t\t\thelp: 'Undo',\n\t\t\t\tcombinations: [\n\t\t\t\t\t{ctrl: true, key: 'z'},\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: REDO,\n\t\t\t\thelp: 'Redo',\n\t\t\t\tcombinations: [\n\t\t\t\t\t{ctrl: true, shift: true, key: 'z'},\n\t\t\t\t\t{ctrl: true, key: 'y'},\n\t\t\t\t]\n\t\t\t}\n\n\t\t],\n\t},\n\t{\n\t\tname: 'Relationship editing',\n\t\tlist: [\n\t\t\t{\n\t\t\t\tid: ADD_VERTEX,\n\t\t\t\thelp: 'Add relationship vertex',\n\t\t\t\tcombinations: [\n\t\t\t\t\t{alt: true, click: true},\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: ADD_LABEL_VERTEX,\n\t\t\t\thelp: 'Add label anchor relationship vertex',\n\t\t\t\tcombinations: [\n\t\t\t\t\t{alt: true, shift: true, click: true},\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: DEL_VERTEX,\n\t\t\t\thelp: 'Remove relationship vertex',\n\t\t\t\tcombinations: [\n\t\t\t\t\t{key: 'DELETE'},\n\t\t\t\t\t{key: 'BACKSPACE'}\n\t\t\t\t]\n\t\t\t},\n\t\t]\n\t},\n\t{\n\t\tname: 'Zoom',\n\t\tlist: [\n\t\t\t{\n\t\t\t\tid: ZOOM_IN,\n\t\t\t\thelp: 'Zoom in',\n\t\t\t\tcombinations: [\n\t\t\t\t\t{ctrl: true, key: '='}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: ZOOM_OUT,\n\t\t\t\thelp: 'Zoom out',\n\t\t\t\tcombinations: [\n\t\t\t\t\t{ctrl: true, key: '-'}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: ZOOM_FIT,\n\t\t\t\thelp: 'Zoom - fit',\n\t\t\t\tcombinations: [{ctrl: true, key: '9'}]\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: ZOOM_100,\n\t\t\t\thelp: 'Zoom 100%',\n\t\t\t\tcombinations: [{ctrl: true, key: '0'}]\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'wheel_zoom',\n\t\t\t\thelp: 'Zoom in/out with mouse wheel',\n\t\t\t\tcombinations: [{wheel: true}]\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tname: 'Mouse Interactions',\n\t\tlist: [\n\t\t\t{\n\t\t\t\tid: PAN_VIEW,\n\t\t\t\thelp: 'Pan view (drag empty space)',\n\t\t\t\tcombinations: [{click: true}]\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: SELECT_ELEMENT,\n\t\t\t\thelp: 'Select element',\n\t\t\t\tcombinations: [{click: true}]\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: MULTI_SELECT,\n\t\t\t\thelp: 'Add/remove from selection',\n\t\t\t\tcombinations: [{shift: true, click: true}]\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: BOX_SELECT,\n\t\t\t\thelp: 'Box selection (drag empty space)',\n\t\t\t\tcombinations: [{shift: true, click: true}]\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: MOVE_ELEMENTS,\n\t\t\t\thelp: 'Move selected elements',\n\t\t\t\tcombinations: [{click: true}]\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tname: 'Select',\n\t\tlist: [\n\t\t\t{\n\t\t\t\tid: SELECT_ALL,\n\t\t\t\thelp: 'Select All',\n\t\t\t\tcombinations: [{ctrl: true, key: 'a'}]\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: DESELECT,\n\t\t\t\thelp: 'Deselect',\n\t\t\t\tcombinations: [{key: 'ESC'}]\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tname: 'Move',\n\t\tlist: [\n\t\t\t{\n\t\t\t\tid: MOVE_UP,\n\t\t\t\thelp: 'Move up (grid increment)',\n\t\t\t\tcombinations: [{key: 'UP'}]\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: MOVE_UP_FINE,\n\t\t\t\thelp: 'Move up (1 pixel)',\n\t\t\t\tcombinations: [{key: 'UP', shift: true}]\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: MOVE_RIGHT,\n\t\t\t\thelp: 'Move right (grid increment)',\n\t\t\t\tcombinations: [{key: 'RIGHT'}]\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: MOVE_RIGHT_FINE,\n\t\t\t\thelp: 'Move right (1 pixel)',\n\t\t\t\tcombinations: [{key: 'RIGHT', shift: true}]\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: MOVE_DOWN,\n\t\t\t\thelp: 'Move down (grid increment)',\n\t\t\t\tcombinations: [{key: 'DOWN'}]\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: MOVE_DOWN_FINE,\n\t\t\t\thelp: 'Move down (1 pixel)',\n\t\t\t\tcombinations: [{key: 'DOWN', shift: true}]\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: MOVE_LEFT,\n\t\t\t\thelp: 'Move left (grid increment)',\n\t\t\t\tcombinations: [{key: 'LEFT'}]\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: MOVE_LEFT_FINE,\n\t\t\t\thelp: 'Move left (1 pixel)',\n\t\t\t\tcombinations: [{key: 'LEFT', shift: true}]\n\t\t\t},\n\t\t]\n\t},\n\t\t\t{\n\t\t\tname: 'View',\n\t\t\tlist: [\n\t\t\t\t{\n\t\t\t\t\tid: TOGGLE_DRAG_MODE,\n\t\t\t\t\thelp: 'Toggle between pan and select mode',\n\t\t\t\t\tcombinations: [{key: 't'}]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: RESET_POSITION,\n\t\t\t\t\thelp: 'Reset position and view',\n\t\t\t\t\tcombinations: [{key: 'Home', ctrl: true}]\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t{\n\t\tname: 'Alignment',\n\t\tlist: [\n\t\t\t{\n\t\t\t\tid: ALIGN_HORIZONTAL,\n\t\t\t\thelp: 'Align selected elements horizontally',\n\t\t\t\tcombinations: [{key: 'h', ctrl: true, shift: true}]\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: ALIGN_VERTICAL,\n\t\t\t\thelp: 'Align selected elements vertically',\n\t\t\t\tcombinations: [{key: 'a', ctrl: true, shift: true}]\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: DISTRIBUTE_HORIZONTAL,\n\t\t\t\thelp: 'Distribute selected elements horizontally',\n\t\t\t\tcombinations: [{key: 'h', ctrl: true, alt: true}]\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: DISTRIBUTE_VERTICAL,\n\t\t\t\thelp: 'Distribute selected elements vertically',\n\t\t\t\tcombinations: [{key: 'v', ctrl: true, alt: true}]\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tname: 'Layout',\n\t\tlist: [\n\t\t\t{\n\t\t\t\tid: AUTO_LAYOUT,\n\t\t\t\thelp: 'Auto layout all elements',\n\t\t\t\tcombinations: [{key: 'l', ctrl: true}]\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tname: 'Grid',\n\t\tlist: [\n\t\t\t{\n\t\t\t\tid: TOGGLE_GRID,\n\t\t\t\thelp: 'Toggle grid visibility',\n\t\t\t\tcombinations: [{key: 'g', ctrl: true}]\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: TOGGLE_SNAP_TO_GRID,\n\t\t\t\thelp: 'Toggle snap to grid',\n\t\t\t\tcombinations: [{key: 'g', ctrl: true, shift: true}]\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: SNAP_ALL_TO_GRID,\n\t\t\t\thelp: 'Snap all elements to grid',\n\t\t\t\tcombinations: [{key: 'g', ctrl: true, alt: true}]\n\t\t\t}\n\t\t]\n\t}\n]\n\nconst shortcutMap = shortcuts\n\t.reduce((lst, s) => lst.concat(s.list), [] as Shortcut[])\n\t.reduce<{ [k: string]: Shortcut }>((map, s) => {\n\t\tmap[s.id] = s;\n\t\treturn map\n\t}, {})\n\nconst checkKey = (e: KeyboardEvent | MouseEvent, shortcut: Shortcut, click: boolean, wheel: boolean) => {\n\treturn shortcut.combinations.some(c => {\n\t\tif (Boolean(c.shift) != e.shiftKey) return false\n\t\t// Use platform-appropriate modifier key\n\t\tif (c.ctrl) {\n\t\t\tconst modifierKey = getModifierKeyProperty(e as KeyboardEvent);\n\t\t\tif (!modifierKey) return false;\n\t\t}\n\t\tif (Boolean(c.alt) != e.altKey) return false\n\t\tif (click) return c.click\n\t\tif (wheel) return c.wheel\n\t\tif (c.key) {\n\t\t\tconst ke = e as KeyboardEvent\n\t\t\tif (c.key == 'DELETE') return ke.key == 'Delete'\n\t\t\tif (c.key == 'BACKSPACE') return ke.key == 'Backspace'\n\t\t\tif (c.key == 'ESC') return ke.key == 'Escape'\n\t\t\tif (c.key == 'UP') return ke.key == 'ArrowUp'\n\t\t\tif (c.key == 'DOWN') return ke.key == 'ArrowDown'\n\t\t\tif (c.key == 'LEFT') return ke.key == 'ArrowLeft'\n\t\t\tif (c.key == 'RIGHT') return ke.key == 'ArrowRight'\n\t\t\treturn c.key && ke.key && c.key.toLowerCase() == ke.key.toLowerCase()\n\t\t}\n\t\treturn false\n\t})\n}\n\nexport const findShortcut = (e: KeyboardEvent | MouseEvent, click = false, wheel = false) => {\n\t// Find all matching shortcuts\n\tconst matches = Object.keys(shortcutMap).filter(k => checkKey(e, shortcutMap[k], click, wheel))\n\t\n\tif (matches.length === 0) return undefined\n\tif (matches.length === 1) return matches[0]\n\t\n\t// If multiple matches, prefer the one with more specific modifiers\n\t// Sort by number of modifiers (shift, ctrl, alt) in descending order\n\tconst sortedMatches = matches.sort((a, b) => {\n\t\tconst aShortcut = shortcutMap[a]\n\t\tconst bShortcut = shortcutMap[b]\n\t\t\n\t\tconst aModifiers = aShortcut.combinations[0]\n\t\tconst bModifiers = bShortcut.combinations[0]\n\t\t\n\t\tconst aCount = (aModifiers.shift ? 1 : 0) + (aModifiers.ctrl ? 1 : 0) + (aModifiers.alt ? 1 : 0)\n\t\tconst bCount = (bModifiers.shift ? 1 : 0) + (bModifiers.ctrl ? 1 : 0) + (bModifiers.alt ? 1 : 0)\n\t\t\n\t\treturn bCount - aCount // Descending order (more modifiers first)\n\t})\n\t\n\treturn sortedMatches[0]\n}\n\nconst comboText = (c: Combination) => {\n\treturn [\n\t\tc.ctrl && getModifierKeyName().toUpperCase(),\n\t\tc.shift && 'SHIFT',\n\t\tc.alt && 'ALT',\n\t\tc.key && (c.key.length > 1 ? c.key : `\"${c.key.toUpperCase()}\"`),\n\t\tc.click && 'CLICK',\n\t\tc.wheel && 'WHEEL'\n\t].filter(Boolean).join(' + ')\n}\n\nexport const Help: FC = () => {\n\treturn
\n\t\t

Shortcuts

\n\t\t\n\t\t\t\n\t\t\t{\n\t\t\t\tshortcuts.map(section => <>\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{section.list.map(item => \n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t)}\n\t\t\t\t)\n\t\t\t}\n\t\t\t\n\t\t
{section.name}
{item.combinations.map(comboText).join(', ')}{item.help}
\n\t
\n}\n","/**\n * Robust platform detection utilities\n */\n\n/**\n * Detects if the user is on a Mac platform using multiple detection methods\n * for maximum compatibility across browsers and future-proofing.\n */\nexport const isMac = (): boolean => {\n if (typeof navigator === 'undefined') return false;\n \n // Method 1: Check userAgentData (modern browsers, most reliable)\n if ('userAgentData' in navigator && (navigator as any).userAgentData) {\n const platform = (navigator as any).userAgentData.platform;\n if (platform && platform.toLowerCase().includes('mac')) {\n return true;\n }\n }\n \n // Method 2: Check userAgent string (widely supported)\n const userAgent = navigator.userAgent.toLowerCase();\n if (userAgent.includes('mac os') || userAgent.includes('macintosh')) {\n return true;\n }\n \n // Method 3: Check platform (fallback, deprecated but still widely supported)\n if (navigator.platform) {\n const platform = navigator.platform.toLowerCase();\n if (platform.includes('mac') || platform.includes('darwin')) {\n return true;\n }\n }\n \n // Method 4: Check for Mac-specific features as additional validation\n try {\n const testEvent = new KeyboardEvent('keydown', { metaKey: true });\n if (testEvent.metaKey !== undefined) {\n // Additional heuristic: Mac typically has different key layouts\n return /mac|darwin|os x/i.test(navigator.userAgent);\n }\n } catch (e) {\n // Ignore errors in older browsers\n }\n \n return false;\n};\n\n/**\n * Gets the appropriate modifier key name for the current platform\n */\nexport const getModifierKeyName = (): string => {\n return isMac() ? 'Cmd' : 'Ctrl';\n};\n\n/**\n * Gets the appropriate modifier key property for keyboard events\n */\nexport const getModifierKeyProperty = (event: KeyboardEvent): boolean => {\n return isMac() ? event.metaKey : event.ctrlKey;\n};\n\n/**\n * Gets the appropriate Alt key name for the current platform\n */\nexport const getAltKeyName = (): string => {\n return isMac() ? 'Option' : 'Alt';\n}; ","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../node_modules/.pnpm/css-loader@7.1.4_webpack@5.109.2/node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../node_modules/.pnpm/css-loader@7.1.4_webpack@5.109.2/node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `html, body, #root {\n height: 100%;\n}\n\nbody {\n font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n color: #666;\n margin: 0;\n}\n\n#root {\n display: flex;\n flex-direction: column;\n}\n#root > div.graph {\n flex: 1;\n overflow: auto;\n position: relative;\n}\n\n.toolbar {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 4px 10px;\n background-color: #f0f0f0;\n border-bottom: 1px solid #cccccc;\n}\n\n.toolbar > div {\n display: flex;\n align-items: center;\n}\n\n.toolbar button {\n padding: 5px 8px;\n margin: 0 2px;\n cursor: pointer;\n}\n\n.toolbar button:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* Drag mode toggle button styles */\n.toolbar button.mode-toggle {\n position: relative;\n border: 1px solid #8f9fc9;\n width: 40px;\n min-height: 28px;\n background: linear-gradient(to bottom, #abb8db, #8f9fc9);\n border-color: #8f9fc9;\n color: white;\n box-shadow: 2px 2px 2px rgba(0, 0, 0, .2);\n}\n\n.toolbar button.mode-toggle:hover {\n background: linear-gradient(to bottom, #bcc7e0, #abb8db);\n border-color: #abb8db;\n}\n\n.toolbar button.mode-toggle.select-mode:active {\n background: linear-gradient(to bottom, #8f9fc9, #7a8bb5);\n}\n\n/* Pan mode and active toggle - darker blue */\n.toolbar button.mode-toggle.pan-mode,\n.toolbar button.active-toggle {\n background: linear-gradient(to bottom, #4a90e2, #357abd);\n border-color: #2968a3;\n box-shadow: inset 0 1px 2px rgba(0,0,0,0.2);\n}\n\n.toolbar button.mode-toggle.pan-mode:hover,\n.toolbar button.active-toggle:hover {\n background: linear-gradient(to bottom, #5ba0f2, #4585c7);\n}\n\n.toolbar button.mode-toggle.pan-mode:active {\n background: linear-gradient(to bottom, #357abd, #2968a3);\n box-shadow: inset 0 1px 2px rgba(0,0,0,0.2);\n}\n\n/* Toggle buttons when inactive - gray styling */\n.toolbar button.inactive-toggle {\n background: #c1c1c1;\n color: #999;\n border-color: #c1c1c1;\n box-shadow: none;\n}\n\n.toolbar button.inactive-toggle:hover {\n background: #b1b1b1;\n}\n\n.toolbar button.inactive-toggle:active {\n background: #a1a1a1;\n}\n\n/* Toggle buttons when disabled and not active - gray like other disabled buttons */\n.toolbar button.mode-toggle:disabled:not(.pan-mode):not(.active-toggle),\n.toolbar button.active-toggle:disabled:not(.active-toggle) {\n background: #c1c1c1;\n color: #999;\n border-color: #c1c1c1;\n box-shadow: none;\n}\n\n/* Ensure Font Awesome icons are sized appropriately if not already handled */\n.toolbar button .fas {\n font-size: 1em;\n vertical-align: middle;\n}\n\n/* Zoom percentage display */\n.toolbar button.zoom-display {\n font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;\n font-size: 11px;\n font-weight: 600;\n font-variant-numeric: tabular-nums;\n min-width: 50px; /* Wider to prevent size change between 99% and 100% */\n padding: 6px 8px;\n text-align: center;\n}\n\n.toolbar-group {\n display: flex;\n align-items: center;\n margin-right: 25px; /* Large space between groups */\n}\n\n.toolbar-group:last-child {\n margin-right: 0; /* Remove right margin from the last group (help button) */\n}\n\nbutton {\n border: none;\n background: linear-gradient(to bottom, #4a90e2, #357abd);\n border-color: #2968a3;\n border-radius: 3px;\n padding: 6px 10px;\n color: #fff;\n outline: none;\n box-shadow: 2px 2px 2px rgba(0, 0, 0, .2);\n margin-right: 5px;\n min-width: 32px;\n min-height: 28px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: 14px;\n line-height: 1;\n font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n position: relative;\n}\n\nbutton:hover {\n background: linear-gradient(to bottom, #5ba0f2, #4585c7);\n}\n\nbutton:active {\n background: linear-gradient(to bottom, #357abd, #2968a3);\n}\n\nbutton:last-child {\n margin-right: 0;\n}\n\n/* Save button when no changes - gray */\nbutton.action {\n background: #c1c1c1;\n color: #999;\n}\n\nbutton.action:active {\n background: #b1b1b1;\n}\n\n/* Save button when there are changes - orange */\nbutton.grp {\n background: linear-gradient(to bottom, #ee9564, #de7d48);\n margin-right: 0;\n}\n\nbutton.grp:active {\n background: #d67540;\n}\n\n/* Auto-arrange button with AI purple to blue gradient */\nbutton.auto-arrange {\n background: linear-gradient(135deg, #6A4C93, #4a90e2);\n border-color: #4a4c93;\n}\n\nbutton.auto-arrange:hover {\n background: linear-gradient(135deg, #7B5DAD, #5ba0f2);\n border-color: #5a5ca3;\n}\n\nbutton.auto-arrange:active {\n background: linear-gradient(135deg, #593B83, #357abd);\n border-color: #3a3c83;\n}\n\nselect {\n border: 1px solid #ccc;\n background: white;\n border-radius: 3px;\n padding: 3px 7px;\n color: #666;\n outline: none;\n margin-right: 5px;\n font-size: 12px;\n}\n\nselect:disabled {\n background: #f5f5f5;\n color: #999;\n}\n\nbutton:disabled {\n background: #c1c1c1;\n color: #999;\n}\n\n#root > div > svg {\n position: absolute;\n user-select: none;\n}\n\n\n.node.selected .nodeBorder, .edge.selected path, .edge.selected rect {\n stroke: #29c229;\n}\n.edge .v-dot {\n fill: transparent;\n stroke: transparent;\n stroke-width: 3px;\n cursor: pointer;\n transition: stroke 0.15s ease;\n}\n.edge .v-dot:hover {\n stroke: #999;\n fill: rgba(153, 153, 153, 0.1);\n}\n.edge .v-dot.selected {\n stroke: #29c229;\n fill: rgba(41, 194, 41, 0.1);\n}\n.edge .v-dot.selected:hover {\n stroke: #29c229;\n fill: rgba(41, 194, 41, 0.2);\n}\n.edge .v-dot.auto.selected {\n stroke: #777;\n fill: rgba(119, 119, 119, 0.1);\n}\n.edge .v-dot.auto.selected:hover {\n stroke: #777;\n fill: rgba(119, 119, 119, 0.2);\n}\ncircle#prj {\n fill: none;\n stroke: #777;\n}\n\n.nodeShadow {\n fill: none;\n stroke-width: 4px;\n stroke: rgba(0, 0, 0, 0.13);\n}\n\ng.node {\n user-select: none;\n cursor: default;\n}\n\ng.node.linked {\n cursor: pointer;\n}\n\ng.node text {\n pointer-events: none;\n}\n\n.icon {\n fill: #aaa;\n stroke: #fff;\n}\n#icon-cube {\n fill: #aaa;\n}\n\n/* Ensure all button icons are uncolored */\nbutton .icon,\nbutton svg,\nbutton path {\n fill: currentColor !important;\n stroke: none !important;\n}\n\n/* Font Awesome icon styling in buttons */\nbutton i {\n font-size: 12px;\n color: inherit;\n}\n\nrect.elastic {\n pointer-events: none;\n stroke: none;\n fill: #3bd8281f;\n display: none;\n}\nrect.elastic.on {\n display: block;\n}\n\n.popover {\n position: absolute;\n top: 50px;\n bottom: 10px;\n overflow: auto;\n right: 10px;\n background: ghostwhite;\n padding: 30px;\n box-shadow: 3px 3px 5px rgba(0,0,0, .2);\n border: solid 1px #eee;\n}\n\n.popover th {\n text-align: left;\n padding: 20px 0px 10px;\n}\n.popover td {\n padding-right: 20px;\n font-size: 14px;\n}\n\n/* Simple tooltip system with smart positioning */\n[data-tooltip] {\n position: relative;\n}\n\n[data-tooltip]:hover::after {\n content: attr(data-tooltip);\n position: absolute;\n top: 100%;\n left: 50%;\n transform: translateX(-50%);\n background: rgba(0, 0, 0, 0.9);\n color: white;\n padding: 6px 12px;\n border-radius: 4px;\n font-size: 12px !important;\n font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif !important;\n font-weight: normal !important;\n white-space: nowrap;\n z-index: 1000;\n pointer-events: none;\n margin-top: 5px;\n animation: tooltip-appear 0.1s ease-out;\n min-width: 120px;\n max-width: calc(100vw - 20px);\n box-sizing: border-box;\n}\n\n[data-tooltip]:hover::before {\n content: '';\n position: absolute;\n top: 100%;\n left: 50%;\n transform: translateX(-50%);\n border: 4px solid transparent;\n border-bottom-color: rgba(0, 0, 0, 0.9);\n z-index: 1000;\n pointer-events: none;\n margin-top: 1px;\n animation: tooltip-appear 0.1s ease-out;\n}\n\n/* Special handling for rightmost elements that might overflow */\n.toolbar-group:nth-last-child(-n+2) button[data-tooltip]:hover::after {\n /* Apply to last 2 toolbar groups (save and help buttons) */\n left: auto;\n right: 0;\n transform: none;\n}\n\n.toolbar-group:nth-last-child(-n+2) button[data-tooltip]:hover::before {\n /* Apply to last 2 toolbar groups (save and help buttons) */\n left: auto;\n right: 16px;\n transform: none;\n}\n\n@keyframes tooltip-appear {\n from {\n opacity: 0;\n transform: translateX(-50%) translateY(-5px);\n }\n to {\n opacity: 1;\n transform: translateX(-50%) translateY(0);\n }\n}\n\nselect {\n position: relative;\n}\n\n/* Robot shape internal elements - inherit stroke from parent node */\n.node .robot-eye-socket {\n fill: none;\n stroke: inherit;\n stroke-width: 2;\n}\n\n.node .robot-eye {\n fill: currentColor;\n stroke: none;\n}\n\n.node .robot-mouth {\n stroke: inherit;\n}\n\n.node .robot-antenna {\n stroke: inherit;\n}\n\n.node .robot-antenna-ball {\n fill: currentColor;\n stroke: inherit;\n stroke-width: 1.5;\n}\n\n.node .robot-panel {\n stroke: inherit;\n}\n\n.node .robot-indicator {\n fill: currentColor;\n stroke: none;\n}`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/style.css\"],\"names\":[],\"mappings\":\"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\",\"sourcesContent\":[\"html, body, #root {\\n height: 100%;\\n}\\n\\nbody {\\n font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\\n color: #666;\\n margin: 0;\\n}\\n\\n#root {\\n display: flex;\\n flex-direction: column;\\n}\\n#root > div.graph {\\n flex: 1;\\n overflow: auto;\\n position: relative;\\n}\\n\\n.toolbar {\\n display: flex;\\n justify-content: space-between;\\n align-items: center;\\n padding: 4px 10px;\\n background-color: #f0f0f0;\\n border-bottom: 1px solid #cccccc;\\n}\\n\\n.toolbar > div {\\n display: flex;\\n align-items: center;\\n}\\n\\n.toolbar button {\\n padding: 5px 8px;\\n margin: 0 2px;\\n cursor: pointer;\\n}\\n\\n.toolbar button:disabled {\\n opacity: 0.5;\\n cursor: not-allowed;\\n}\\n\\n/* Drag mode toggle button styles */\\n.toolbar button.mode-toggle {\\n position: relative;\\n border: 1px solid #8f9fc9;\\n width: 40px;\\n min-height: 28px;\\n background: linear-gradient(to bottom, #abb8db, #8f9fc9);\\n border-color: #8f9fc9;\\n color: white;\\n box-shadow: 2px 2px 2px rgba(0, 0, 0, .2);\\n}\\n\\n.toolbar button.mode-toggle:hover {\\n background: linear-gradient(to bottom, #bcc7e0, #abb8db);\\n border-color: #abb8db;\\n}\\n\\n.toolbar button.mode-toggle.select-mode:active {\\n background: linear-gradient(to bottom, #8f9fc9, #7a8bb5);\\n}\\n\\n/* Pan mode and active toggle - darker blue */\\n.toolbar button.mode-toggle.pan-mode,\\n.toolbar button.active-toggle {\\n background: linear-gradient(to bottom, #4a90e2, #357abd);\\n border-color: #2968a3;\\n box-shadow: inset 0 1px 2px rgba(0,0,0,0.2);\\n}\\n\\n.toolbar button.mode-toggle.pan-mode:hover,\\n.toolbar button.active-toggle:hover {\\n background: linear-gradient(to bottom, #5ba0f2, #4585c7);\\n}\\n\\n.toolbar button.mode-toggle.pan-mode:active {\\n background: linear-gradient(to bottom, #357abd, #2968a3);\\n box-shadow: inset 0 1px 2px rgba(0,0,0,0.2);\\n}\\n\\n/* Toggle buttons when inactive - gray styling */\\n.toolbar button.inactive-toggle {\\n background: #c1c1c1;\\n color: #999;\\n border-color: #c1c1c1;\\n box-shadow: none;\\n}\\n\\n.toolbar button.inactive-toggle:hover {\\n background: #b1b1b1;\\n}\\n\\n.toolbar button.inactive-toggle:active {\\n background: #a1a1a1;\\n}\\n\\n/* Toggle buttons when disabled and not active - gray like other disabled buttons */\\n.toolbar button.mode-toggle:disabled:not(.pan-mode):not(.active-toggle),\\n.toolbar button.active-toggle:disabled:not(.active-toggle) {\\n background: #c1c1c1;\\n color: #999;\\n border-color: #c1c1c1;\\n box-shadow: none;\\n}\\n\\n/* Ensure Font Awesome icons are sized appropriately if not already handled */\\n.toolbar button .fas {\\n font-size: 1em;\\n vertical-align: middle;\\n}\\n\\n/* Zoom percentage display */\\n.toolbar button.zoom-display {\\n font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;\\n font-size: 11px;\\n font-weight: 600;\\n font-variant-numeric: tabular-nums;\\n min-width: 50px; /* Wider to prevent size change between 99% and 100% */\\n padding: 6px 8px;\\n text-align: center;\\n}\\n\\n.toolbar-group {\\n display: flex;\\n align-items: center;\\n margin-right: 25px; /* Large space between groups */\\n}\\n\\n.toolbar-group:last-child {\\n margin-right: 0; /* Remove right margin from the last group (help button) */\\n}\\n\\nbutton {\\n border: none;\\n background: linear-gradient(to bottom, #4a90e2, #357abd);\\n border-color: #2968a3;\\n border-radius: 3px;\\n padding: 6px 10px;\\n color: #fff;\\n outline: none;\\n box-shadow: 2px 2px 2px rgba(0, 0, 0, .2);\\n margin-right: 5px;\\n min-width: 32px;\\n min-height: 28px;\\n display: inline-flex;\\n align-items: center;\\n justify-content: center;\\n font-size: 14px;\\n line-height: 1;\\n font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\\n position: relative;\\n}\\n\\nbutton:hover {\\n background: linear-gradient(to bottom, #5ba0f2, #4585c7);\\n}\\n\\nbutton:active {\\n background: linear-gradient(to bottom, #357abd, #2968a3);\\n}\\n\\nbutton:last-child {\\n margin-right: 0;\\n}\\n\\n/* Save button when no changes - gray */\\nbutton.action {\\n background: #c1c1c1;\\n color: #999;\\n}\\n\\nbutton.action:active {\\n background: #b1b1b1;\\n}\\n\\n/* Save button when there are changes - orange */\\nbutton.grp {\\n background: linear-gradient(to bottom, #ee9564, #de7d48);\\n margin-right: 0;\\n}\\n\\nbutton.grp:active {\\n background: #d67540;\\n}\\n\\n/* Auto-arrange button with AI purple to blue gradient */\\nbutton.auto-arrange {\\n background: linear-gradient(135deg, #6A4C93, #4a90e2);\\n border-color: #4a4c93;\\n}\\n\\nbutton.auto-arrange:hover {\\n background: linear-gradient(135deg, #7B5DAD, #5ba0f2);\\n border-color: #5a5ca3;\\n}\\n\\nbutton.auto-arrange:active {\\n background: linear-gradient(135deg, #593B83, #357abd);\\n border-color: #3a3c83;\\n}\\n\\nselect {\\n border: 1px solid #ccc;\\n background: white;\\n border-radius: 3px;\\n padding: 3px 7px;\\n color: #666;\\n outline: none;\\n margin-right: 5px;\\n font-size: 12px;\\n}\\n\\nselect:disabled {\\n background: #f5f5f5;\\n color: #999;\\n}\\n\\nbutton:disabled {\\n background: #c1c1c1;\\n color: #999;\\n}\\n\\n#root > div > svg {\\n position: absolute;\\n user-select: none;\\n}\\n\\n\\n.node.selected .nodeBorder, .edge.selected path, .edge.selected rect {\\n stroke: #29c229;\\n}\\n.edge .v-dot {\\n fill: transparent;\\n stroke: transparent;\\n stroke-width: 3px;\\n cursor: pointer;\\n transition: stroke 0.15s ease;\\n}\\n.edge .v-dot:hover {\\n stroke: #999;\\n fill: rgba(153, 153, 153, 0.1);\\n}\\n.edge .v-dot.selected {\\n stroke: #29c229;\\n fill: rgba(41, 194, 41, 0.1);\\n}\\n.edge .v-dot.selected:hover {\\n stroke: #29c229;\\n fill: rgba(41, 194, 41, 0.2);\\n}\\n.edge .v-dot.auto.selected {\\n stroke: #777;\\n fill: rgba(119, 119, 119, 0.1);\\n}\\n.edge .v-dot.auto.selected:hover {\\n stroke: #777;\\n fill: rgba(119, 119, 119, 0.2);\\n}\\ncircle#prj {\\n fill: none;\\n stroke: #777;\\n}\\n\\n.nodeShadow {\\n fill: none;\\n stroke-width: 4px;\\n stroke: rgba(0, 0, 0, 0.13);\\n}\\n\\ng.node {\\n user-select: none;\\n cursor: default;\\n}\\n\\ng.node.linked {\\n cursor: pointer;\\n}\\n\\ng.node text {\\n pointer-events: none;\\n}\\n\\n.icon {\\n fill: #aaa;\\n stroke: #fff;\\n}\\n#icon-cube {\\n fill: #aaa;\\n}\\n\\n/* Ensure all button icons are uncolored */\\nbutton .icon,\\nbutton svg,\\nbutton path {\\n fill: currentColor !important;\\n stroke: none !important;\\n}\\n\\n/* Font Awesome icon styling in buttons */\\nbutton i {\\n font-size: 12px;\\n color: inherit;\\n}\\n\\nrect.elastic {\\n pointer-events: none;\\n stroke: none;\\n fill: #3bd8281f;\\n display: none;\\n}\\nrect.elastic.on {\\n display: block;\\n}\\n\\n.popover {\\n position: absolute;\\n top: 50px;\\n bottom: 10px;\\n overflow: auto;\\n right: 10px;\\n background: ghostwhite;\\n padding: 30px;\\n box-shadow: 3px 3px 5px rgba(0,0,0, .2);\\n border: solid 1px #eee;\\n}\\n\\n.popover th {\\n text-align: left;\\n padding: 20px 0px 10px;\\n}\\n.popover td {\\n padding-right: 20px;\\n font-size: 14px;\\n}\\n\\n/* Simple tooltip system with smart positioning */\\n[data-tooltip] {\\n position: relative;\\n}\\n\\n[data-tooltip]:hover::after {\\n content: attr(data-tooltip);\\n position: absolute;\\n top: 100%;\\n left: 50%;\\n transform: translateX(-50%);\\n background: rgba(0, 0, 0, 0.9);\\n color: white;\\n padding: 6px 12px;\\n border-radius: 4px;\\n font-size: 12px !important;\\n font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif !important;\\n font-weight: normal !important;\\n white-space: nowrap;\\n z-index: 1000;\\n pointer-events: none;\\n margin-top: 5px;\\n animation: tooltip-appear 0.1s ease-out;\\n min-width: 120px;\\n max-width: calc(100vw - 20px);\\n box-sizing: border-box;\\n}\\n\\n[data-tooltip]:hover::before {\\n content: '';\\n position: absolute;\\n top: 100%;\\n left: 50%;\\n transform: translateX(-50%);\\n border: 4px solid transparent;\\n border-bottom-color: rgba(0, 0, 0, 0.9);\\n z-index: 1000;\\n pointer-events: none;\\n margin-top: 1px;\\n animation: tooltip-appear 0.1s ease-out;\\n}\\n\\n/* Special handling for rightmost elements that might overflow */\\n.toolbar-group:nth-last-child(-n+2) button[data-tooltip]:hover::after {\\n /* Apply to last 2 toolbar groups (save and help buttons) */\\n left: auto;\\n right: 0;\\n transform: none;\\n}\\n\\n.toolbar-group:nth-last-child(-n+2) button[data-tooltip]:hover::before {\\n /* Apply to last 2 toolbar groups (save and help buttons) */\\n left: auto;\\n right: 16px;\\n transform: none;\\n}\\n\\n@keyframes tooltip-appear {\\n from {\\n opacity: 0;\\n transform: translateX(-50%) translateY(-5px);\\n }\\n to {\\n opacity: 1;\\n transform: translateX(-50%) translateY(0);\\n }\\n}\\n\\nselect {\\n position: relative;\\n}\\n\\n/* Robot shape internal elements - inherit stroke from parent node */\\n.node .robot-eye-socket {\\n fill: none;\\n stroke: inherit;\\n stroke-width: 2;\\n}\\n\\n.node .robot-eye {\\n fill: currentColor;\\n stroke: none;\\n}\\n\\n.node .robot-mouth {\\n stroke: inherit;\\n}\\n\\n.node .robot-antenna {\\n stroke: inherit;\\n}\\n\\n.node .robot-antenna-ball {\\n fill: currentColor;\\n stroke: inherit;\\n stroke-width: 1.5;\\n}\\n\\n.node .robot-panel {\\n stroke: inherit;\\n}\\n\\n.node .robot-indicator {\\n fill: currentColor;\\n stroke: none;\\n}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n"],"names":["layoutDirections","TopBottom","BottomTop","LeftRight","RightLeft","listViews","model","viewsList","Object","keys","views","filter","section","endsWith","forEach","s","v","push","key","title","graphs","camelToWords","camel","split","replace","charAt","toUpperCase","slice","Toolbar","currentID","onViewChange","graph","onAutoLayout","onSave","onToggleHelp","saving","layouting","dragMode","setDragMode","jsx_runtime","jsxs","className","children","jsx","ViewSelector","ToolbarActions","length","onChange","e","target","value","disabled","hidden","map","view","style","marginLeft","fontWeight","display","alignItems","DragModeButton","UndoRedoButtons","AlignmentButtons","LayoutControls","GridControls","ZoomControls","SaveButton","HelpButton","onClick","modKey","platform","sy","Fragment","undo","redo","alignSelectionH","alignSelectionV","transform","distributeSelectionH","distributeSelectionV","gridVisible","setGridVisible","react","useState","isGridVisible","snapToGrid","setSnapToGrid","isSnapToGrid","useEffect","updateGridState","window","addEventListener","removeEventListener","toggleGrid","toggleSnapToGrid","snapAllToGrid","ZoomDisplay","zoom","setZoomState","updateZoom","currentZoom","Math","round","graph_view_graph","IX","interval","setInterval","clearInterval","a_","max","min","fitToView","hasChanges","setHasChanges","checkChanges","changed","Help","lazy","Promise","resolve","then","__webpack_require__","bind","module","default","Graph","setAutomationStatus","status","error","root","document","documentElement","dataset","mdlAutomationStatus","mdlAutomationError","reportInteractiveError","action","console","alert","Root","layout","chunk_62JRHF6Z","Kd","BV","qh","path","element","ModelPane","layouts","refreshGraph","URLSearchParams","location","search","get","searchParams","setSearchParams","ok","decodeURI","helpVisible","setHelpVisible","readyGraphID","setReadyGraphID","automationKey","useRef","automationRun","viewKey","elements","Map","relations","collectRels","el","Array","isArray","relationships","rel","set","id","people","softwareSystems","containers","el1","parent","components","el2","deploymentNodes","containerInstances","item","containerId","recAddNodes","infrastructureNodes","some","getView","jg","rankDirection","automaticLayout","layoutDirection","undefined","metadata","name","description","version","groupingIDs","ref","softwareSystemId","find","p","enterprise","styles","cssClassName","tag","toLowerCase","varPrefix","background","colorToVarMap","color","stroke","elementViewKey","containerViews","candidate","lookupContainerViewKey","sub","tags","technology","addNode","encodedViewKey","encodeURIComponent","href","exportHref","url","nodeLink","properties","nodesMap","has","sourceId","warn","destinationId","routing","addEdge","vertices","level","i","sort","a","b","groupMembers","addGroup","init","parseView","useGraph","handleAutoLayout","setLayouting","useCallback","async","options","direction","opts","autoLayout","useAutoLayout","handleSave","setSaving","response","fetch","method","body","exportSVG","detail","text","trim","Error","setSaved","useSave","ViewRedirect","handleToggleHelp","handleGraphReady","handleInteractiveAutoLayout","catch","handleInteractiveSave","params","fromEntries","entries","auto","save","current","toString","run","compact","layoutOpts","includes","compactLayout","message","String","errorMessage","toggleHelp","saveLayout","handleKeyDown","shortcut","shortcuts","Yp","preventDefault","aX","t9","Jk","DE","Vy","Hd","_t","resetView","Op","hZ","OE","Gg","moveSelected","getGridSize","J8","b3","iD","uK","l8","rB","mt","useKeyboardShortcuts","handleViewChange","handleSelect","m","log","obj","JSON","parse","stringify","Suspense","fallback","data","onSelect","onReady","svgTextWrap","width","attrs","svg","createElementNS","appendChild","measure","node","setAttribute","attr","createTextNode","height","getBBox","removeChild","clean","textMeasure","maxW","ret","words","lines","currentLine","word","join","brokenParts","maxWidth","parts","currentPart","testPart","breakLongWord","newLine","size","reduce","concat","create","type","k","classList","add","use","this","setAttributeNS","d","t","textContent","textArea","fontSize","bold","x","y","anchor","txt","line","span","dy","append","rect","r","rx","ry","icon","expand","expanded","g","setPosition","insideBox","centeredBox","uncenterBox","intersectRectFull","p1","p2","box","w","h","q","q1","q2","denominator","numerator1","numerator2","result","onLine1","onLine2","segmentIntersection","intersectRect","intersectEllipse","ellCenter","nodeCenter","point","si","c","radicand_sqrt","sqrt","pos","project","atob","len","dot","cabDistance","abs","cylinderRadiusY","shapeLabelOffsetY","shape","D3Element","_el","constructor","insert","insertBefore","querySelector","bbox","rounded","shapeSvg","intersect","_ellipse","mobiledeviceportrait","shapes","roundedbox","component","dx","cylinder","cy","person","circle","ellipse","hexagon","sz","n","folder","mobiledevicelandscape","mobiledevice","pipe","robot","headSize","headR","antennaH","antennaR","eyeR","eyeSpacing","earW","earH","bodyW","bodyTop","bodyH","headTop","eyeY","mouthY","mouthW","webbrowser","Undo","versions","lastSavedPos","exportDoc","importDoc","change","tmpPreviousState","func","timeout","context","clearTimeout","setTimeout","apply","debounce","saveNow","beforeChange","deepClone","currentState","splice","doc","structuredClone","SVG_STYLES","applyStyle","setProperty","calculateDistance","textBlock","gapAfter","field","wrapped","lineHeight","defaultEdgeStyle","thickness","opacity","dashed","defaultNodeStyle","GraphData","edges","edgeVertices","groupsMap","_undo","_gridVisible","_snapToGrid","_gridSize","_skipAutoFit","exportLayout","lo","importLayout","label","link","nodeStyle","minimumHeight","contentLayout","subtitle","nodeWidth","textWidth","HORIZONTAL_PADDING","blocks","textHeight","block","VERTICAL_PADDING","layoutNodeContent","requiredHeight","nodes","from","values","fromNode","toNode","edge","to","initVertex","edgeID","input","charCodeAt","imul","fnv1a36","stableVertexID","userDeletedVertices","nodesOrGroups","group","Boolean","setNodeSelected","selected","remove","updateEdgesSel","moveNode","disableSnap","skipUndo","snapped","redrawEdges","redrawGroups","moveEdgeVertex","redrawEdge","insertEdgeVertex","isLabel","deleteEdgeVertex","index","indexOf","delete","alignTopLeft","contentBounds","calculateContentBounds","offsetX","offsetY","vertex","resetPanTransform","getZoom","zoomGroup","graphData","bb","parentElement","clientWidth","clientHeight","updatePanningOptimized","clearViewState","shouldSkipAutoFit","updatePanning","buildEdge","buildGroup","originalSvg","exportSvg","cloneNode","querySelectorAll","getAttribute","removeAttribute","exportElastic","exportWidth","padding","exportHeight","exportZoomGroup","convertStylesToCustomProperties","script","createElement","firstChild","outerHTML","fill","minX","Infinity","minY","maxX","maxY","left","right","top","bottom","centerX","centerY","approxLabelSize","full","lst","rerender","coordinates","startsWith","normalizedPoint","assign","edgeId","an","ae","labelVertex","insertPos","labelPos","fullPath","minDistance","bestSegmentIndex","distance","distanceToSegment","findOptimalLabelPosition","projectedPos","segmentStart","segmentEnd","A","B","C","D","lenSq","param","projectPointOntoSegment","projectLabelOntoSegment","selectedNodes","selectedVertices","allElements","spacing","newX","newY","setEdgeSelected","viewportWidth","viewportHeight","zoomX","zoomY","optimalZoom","finalZoom","translateX","translateY","saveViewState","saveLayoutState","restoreLayoutState","state","updateGridDisplay","dispatchEvent","CustomEvent","snappedX","snappedY","existingGrid","existingGridRect","defs","pattern","clickListener","selectListener","dragging","buildGraph","onNodeSelect","innerHTML","__data","_buildGraph","elasticEl","addCursorInteraction","setZoom","zoomG","nodesG","edgesG","groupsG","gdata","content","shapeType","nodeBorder","setBorderStyle","border","tg","buildNodeContent","Number","buildNode","labelBounds","n1","n2","position","sameEdges","spreadPos","spreadX","spreadY","unshift","firstRoutingVertex","lastRoutingVertex","calculateNodeIntersection","targetPoint","nodeShape","halfHeight","angle","atan2","cos","sin","rectX","rectY","topCurveY","bottomCurveY","ellipseY","discriminant","sqrt_d","x1","x2","radius","halfWidth","startIntersection","endIntersection","calculateEdgeVertices","labelPlacement","segment","labelIndex","findIndex","movable","adjacentSegments","longest","targetLength","sum","traversed","segmentPosition","horizontalDistance","verticalDistance","orientation","calculateLabelPlacement","bg","placement","anchors","fraction","existing","occupied","expandBox","other","flatMap","side","edgeLabelCandidate","best","score","bounds","edgeText","edgeRect","buildEdgeLabel","segments","reverse","s2","intersectPolylineBox","createEdgeSegments","cx","overlap","total","first","second","p0","topExtension","bottomExtension","hexHeight","pad","groupRect","groupText","findClosestSegment","fnd","dst","POSITIVE_INFINITY","prj","pts","mouseToDrawing","getBoundingClientRect","z","currentTransform","getCurrentTransform","clientX","clientY","addCustomCursorInteraction","conn","ini","elastic","isPanning","panStartX","panStartY","initialTransform","pendingSelectionChange","pendingNavigation","hasDragged","suppressLinkClick","eventListeners","Element","closest","stopPropagation","md","convertEvent","changedTouches","onMouseMoveHandler","getSelection","setSelection","setTransform","drawingDx","drawingDy","setDragging","update","onMouseMove","ex","ey","onMouseUpHandler","navigation","end","boxSelection","shiftKey","onMouseUp","onMouseDownHandler","nodeFromEvent","effectiveMode","isSelected","translateMatch","match","parseFloat","getCurrentTransformLocal","startDrawingX","startDrawingY","pt","currentPt","currentDrawingX","currentDrawingY","createElastic","onMouseDown","event","handler","addDnd","existingCleanup","__cursorInteractionCleanup","getData","gd","beforeUnloadHandler","returnValue","setDotSelected","dotEl","mouseMoveHandler","altKey","removePrjDot","keyUpHandler","Zj","_s","clickHandler","wheelHandler","delta","sign","deltaY","newZoom","setZoomCentered","keyDownHandler","bl","Ur","hU","i1","mD","F","Gn","customInteractionCleanup","handles","handle","b1","b2","scaleMatch","oldZoom","container","newTranslateX","newTranslateY","nodeText","cursor","viewStateCache","graphId","restoreViewState","xx","yy","getEffectiveSpacing","userOptions","isGroup","effectiveConfig","nodeSpacing","layerSpacing","componentSpacing","groupMultiplier","getELKOptions","baseOptions","elk","elkGraph","layoutOptions","nodeMap","elkNodes","nodeHeight","arrowPadding","nodeParentGroup","groupParent","childGroupIDs","Set","member","elkGroups","buildELKGroup","elkGroup","groupAncestors","groupID","ancestors","labelWidth","elkEdge","sources","targets","labels","sourceID","destinationID","sourceAncestors","destinationAncestors","lowestCommonGroup","layoutedGraph","extractNodes","child","processEdgesFromELK","sections","startPoint","bendPoints","bp","endPoint","originalEdge","elkLabel","midIndex","floor","v1","v2","maxCols","ceil","col","createFallbackLayout","styleTagTransform","styleTagTransform_default","setAttributes","setAttributesWithoutAttributes_default","insertBySelector_default","domAPI","styleDomAPI_default","insertStyleElement","insertStyleElement_default","injectStylesIntoStyleTag_default","locals","Timer","callback","running","timeoutId","start","stop","isRunning","RefreshConnector","static","minDelay","maxDelay","handshakeTimeout","uri","fileChangeHandler","socket","nextDelay","connectionDesired","disconnectionReason","reconnectTimer","DEFAULT_OPTIONS","handleHandshakeTimeout","attemptReconnection","connect","isSocketConnected","prepareForConnection","createWebSocket","disconnect","close","readyState","WebSocket","OPEN","onopen","handleOpen","onclose","handleClose","onmessage","handleMessage","onerror","handleError","startHandshake","scheduleReconnection","processMessage","command","handleHelloMessage","handleReloadMessage","helloMessage","protocols","LIVERELOAD_PROTOCOLS","ver","sendCommand","send","src_Root","App","setState","loading","loadData","prev","modelResponse","layoutResponse","all","statusText","json","handleFileChange","S","refreshConnector","LoadingScreen","ErrorScreen","onRetry","justifyContent","fontFamily","whiteSpace","flexDirection","backgroundColor","borderRadius","getElementById","client","createRoot","render","ADD_VERTEX","ADD_LABEL_VERTEX","DEL_VERTEX","ZOOM_IN","ZOOM_OUT","ZOOM_FIT","ZOOM_100","SELECT_ALL","DESELECT","MOVE_LEFT","MOVE_RIGHT","MOVE_UP","MOVE_DOWN","MOVE_LEFT_FINE","MOVE_RIGHT_FINE","MOVE_UP_FINE","MOVE_DOWN_FINE","TOGGLE_DRAG_MODE","ALIGN_HORIZONTAL","ALIGN_VERTICAL","DISTRIBUTE_HORIZONTAL","DISTRIBUTE_VERTICAL","AUTO_LAYOUT","RESET_POSITION","TOGGLE_GRID","TOGGLE_SNAP_TO_GRID","SNAP_ALL_TO_GRID","list","help","combinations","shift","ctrl","alt","click","wheel","shortcutMap","comboText","_utils_platform__WEBPACK_IMPORTED_MODULE_1__","react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__","colSpan","matches","SA","ke","checkKey","aShortcut","bShortcut","aModifiers","bModifiers","aCount","isMac","navigator","userAgentData","userAgent","KeyboardEvent","metaKey","test","ctrlKey","___CSS_LOADER_EXPORT___","_node_modules_pnpm_css_loader_7_1_4_webpack_5_109_2_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default","_node_modules_pnpm_css_loader_7_1_4_webpack_5_109_2_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default","names","mappings","sourcesContent","sourceRoot","__WEBPACK_DEFAULT_EXPORT__"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"main.js","mappings":"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","sources":["webpack://app/./src/hooks.ts","webpack://app/./src/utils.ts","webpack://app/./src/components/Toolbar.tsx","webpack://app/./src/Root.tsx","webpack://app/./src/websocket.ts","webpack://app/./src/index.tsx"],"sourcesContent":["import { useState, useCallback, useEffect } from 'react';\nimport { GraphData } from './graph-view/graph';\nimport { parseView } from './parseModel';\nimport { LayoutOptions } from './graph-view/layout';\nimport { \n findShortcut, \n HELP, \n SAVE, \n TOGGLE_DRAG_MODE,\n ALIGN_HORIZONTAL,\n ALIGN_VERTICAL,\n DISTRIBUTE_HORIZONTAL,\n DISTRIBUTE_VERTICAL,\n AUTO_LAYOUT,\n RESET_POSITION,\n TOGGLE_GRID,\n TOGGLE_SNAP_TO_GRID,\n SNAP_ALL_TO_GRID,\n MOVE_LEFT,\n MOVE_RIGHT,\n MOVE_UP,\n MOVE_DOWN,\n MOVE_LEFT_FINE,\n MOVE_RIGHT_FINE,\n MOVE_UP_FINE,\n MOVE_DOWN_FINE\n} from './shortcuts';\n\n// Global state for graphs to preserve edits\nconst graphs: { [key: string]: GraphData } = {};\n\n// Custom hook for graph management\nexport const useGraph = (model: any, layouts: any, currentID: string): GraphData | null => {\n if (graphs[currentID]) {\n return graphs[currentID];\n }\n \n const graph = parseView(model, layouts, currentID);\n if (graph) {\n graphs[currentID] = graph;\n }\n \n return graph;\n};\n\n// Custom hook for auto layout functionality\nexport const useAutoLayout = (graph: GraphData) => {\n const [layouting, setLayouting] = useState(false);\n\n const handleAutoLayout = useCallback(async (opts?: LayoutOptions) => {\n setLayouting(true);\n try {\n const options: LayoutOptions = {\n direction: graph.layoutDirection || 'DOWN',\n ...(opts || {})\n };\n await graph.autoLayout(options);\n } finally {\n setLayouting(false);\n }\n }, [graph]);\n\n return { layouting, handleAutoLayout };\n};\n\n// Custom hook for save functionality\nexport const useSave = (graph: GraphData, currentID: string) => {\n const [saving, setSaving] = useState(false);\n\n const handleSave = useCallback(async () => {\n setSaving(true);\n \n try {\n const response = await fetch('data/save?id=' + encodeURIComponent(currentID), {\n method: 'post',\n body: graph.exportSVG()\n });\n \n if (response.status !== 202) {\n const detail = (await response.text()).trim();\n throw new Error(detail || `save failed with HTTP ${response.status}`);\n }\n graph.setSaved();\n } finally {\n setSaving(false);\n }\n }, [graph, currentID]);\n\n return { saving, handleSave };\n};\n\n// Custom hook for keyboard shortcuts\nexport const useKeyboardShortcuts = (\n toggleHelp: () => void,\n saveLayout: () => void,\n graph?: GraphData,\n dragMode?: 'pan' | 'select',\n setDragMode?: (mode: 'pan' | 'select') => void,\n onAutoLayout?: () => void\n) => {\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n const shortcut = findShortcut(e);\n \n // Prevent browser default for all recognized shortcuts\n if (shortcut) {\n e.preventDefault();\n }\n \n if (shortcut === HELP) {\n toggleHelp();\n } else if (shortcut === SAVE) {\n saveLayout();\n } else if (shortcut === TOGGLE_DRAG_MODE && setDragMode && dragMode) {\n setDragMode(dragMode === 'pan' ? 'select' : 'pan');\n } else if (graph) {\n // Graph-dependent shortcuts\n if (shortcut === ALIGN_HORIZONTAL) {\n graph.alignSelectionH();\n } else if (shortcut === ALIGN_VERTICAL) {\n graph.alignSelectionV();\n } else if (shortcut === DISTRIBUTE_HORIZONTAL) {\n graph.distributeSelectionH();\n } else if (shortcut === DISTRIBUTE_VERTICAL) {\n graph.distributeSelectionV();\n } else if (shortcut === AUTO_LAYOUT && onAutoLayout) {\n onAutoLayout();\n } else if (shortcut === RESET_POSITION) {\n graph.resetView();\n } else if (shortcut === TOGGLE_GRID) {\n graph.toggleGrid();\n } else if (shortcut === TOGGLE_SNAP_TO_GRID) {\n graph.toggleSnapToGrid();\n } else if (shortcut === SNAP_ALL_TO_GRID) {\n graph.snapAllToGrid();\n } else if (shortcut === MOVE_LEFT) {\n graph.moveSelected(-graph.getGridSize(), 0);\n } else if (shortcut === MOVE_LEFT_FINE) {\n graph.moveSelected(-1, 0, true); // Disable snap for fine movement\n } else if (shortcut === MOVE_RIGHT) {\n graph.moveSelected(graph.getGridSize(), 0);\n } else if (shortcut === MOVE_RIGHT_FINE) {\n graph.moveSelected(1, 0, true); // Disable snap for fine movement\n } else if (shortcut === MOVE_UP) {\n graph.moveSelected(0, -graph.getGridSize());\n } else if (shortcut === MOVE_UP_FINE) {\n graph.moveSelected(0, -1, true); // Disable snap for fine movement\n } else if (shortcut === MOVE_DOWN) {\n graph.moveSelected(0, graph.getGridSize());\n } else if (shortcut === MOVE_DOWN_FINE) {\n graph.moveSelected(0, 1, true); // Disable snap for fine movement\n }\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [toggleHelp, saveLayout, graph, dragMode, setDragMode, onAutoLayout]);\n};\n\n// Utility function to clear graph cache\nexport const clearGraphCache = (currentID?: string) => {\n if (currentID) {\n delete graphs[currentID];\n } else {\n Object.keys(graphs).forEach(key => delete graphs[key]);\n }\n};","// Helper functions for the application\n\nexport function removeEmptyProps(obj: any) {\n return JSON.parse(JSON.stringify(obj));\n}\n\nexport function camelToWords(camel: string) {\n const split = camel.replace(/([A-Z])/g, \" $1\");\n return split.charAt(0).toUpperCase() + split.slice(1);\n}\n\nexport function getCurrentViewID() {\n const params = new URLSearchParams(document.location.search);\n return params.get('id') || '';\n} ","import React, { FC, useState, useEffect } from 'react';\nimport { getZoomAuto, GraphData, setZoom, getZoom, setZoomCentered } from '../graph-view/graph';\nimport { listViews } from '../parseModel';\nimport { camelToWords } from '../utils';\nimport { getModifierKeyName } from '../utils/platform';\n\n// Types\ninterface ToolbarProps {\n model: any;\n currentID: string;\n onViewChange: (id: string) => void;\n graph: GraphData;\n onAutoLayout: () => void;\n onSave: () => void;\n onToggleHelp: () => void;\n saving: boolean;\n layouting: boolean;\n dragMode: 'pan' | 'select';\n setDragMode: (mode: 'pan' | 'select') => void;\n}\n\nexport const Toolbar: FC = ({\n model, currentID, onViewChange, graph, \n onAutoLayout, onSave, onToggleHelp, saving, layouting,\n dragMode, setDragMode\n}) => {\n const views = listViews(model);\n \n return (\n
\n \n \n
\n );\n};\n\nconst ViewSelector: FC<{\n views: any[];\n currentID: string;\n onViewChange: (id: string) => void;\n}> = ({ views, currentID, onViewChange }) => (\n
\n View:\n {views.length > 1 ? (\n \n ) : (\n \n {views[0] ? camelToWords(views[0].section) + ': ' + views[0].title : 'No views available'}\n \n )}\n
\n);\n\nconst ToolbarActions: FC<{\n graph: GraphData;\n onAutoLayout: () => void;\n onSave: () => void;\n onToggleHelp: () => void;\n saving: boolean;\n layouting: boolean;\n dragMode: 'pan' | 'select';\n setDragMode: (mode: 'pan' | 'select') => void;\n}> = ({\n graph, onAutoLayout, onSave, onToggleHelp, saving, layouting,\n dragMode, setDragMode\n}) => (\n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n);\n\nconst DragModeButton: FC<{\n dragMode: 'pan' | 'select';\n setDragMode: (mode: 'pan' | 'select') => void;\n}> = ({ dragMode, setDragMode }) => (\n \n);\n\nconst UndoRedoButtons: FC<{ graph: GraphData }> = ({ graph }) => {\n const modKey = getModifierKeyName();\n return (\n <>\n \n \n \n );\n};\n\nconst AlignmentButtons: FC<{ graph: GraphData }> = ({ graph }) => {\n const modKey = getModifierKeyName();\n return (\n <>\n \n \n \n \n \n );\n};\n\nconst LayoutControls: FC<{\n onAutoLayout: () => void;\n layouting: boolean;\n}> = ({ onAutoLayout, layouting }) => {\n const modKey = getModifierKeyName();\n return (\n \n );\n};\n\nconst GridControls: FC<{ graph: GraphData }> = ({ graph }) => {\n const [gridVisible, setGridVisible] = useState(graph.isGridVisible());\n const [snapToGrid, setSnapToGrid] = useState(graph.isSnapToGrid());\n const modKey = getModifierKeyName();\n \n // Update state when graph changes or when grid state changes via shortcuts\n React.useEffect(() => {\n const updateGridState = () => {\n setGridVisible(graph.isGridVisible());\n setSnapToGrid(graph.isSnapToGrid());\n };\n \n // Initial update\n updateGridState();\n \n // Listen for grid state changes from keyboard shortcuts\n window.addEventListener('gridStateChanged', updateGridState);\n \n return () => {\n window.removeEventListener('gridStateChanged', updateGridState);\n };\n }, [graph]);\n \n const handleToggleGrid = () => {\n graph.toggleGrid();\n setGridVisible(graph.isGridVisible());\n };\n \n const handleToggleSnap = () => {\n graph.toggleSnapToGrid();\n setSnapToGrid(graph.isSnapToGrid());\n };\n \n const handleSnapAll = () => {\n graph.snapAllToGrid();\n };\n \n return (\n <>\n \n \n \n \n );\n};\n\nconst ZoomDisplay: FC = () => {\n const [zoom, setZoomState] = useState(100);\n\n useEffect(() => {\n const updateZoom = () => {\n const currentZoom = Math.round(getZoom() * 100);\n setZoomState(currentZoom);\n };\n\n // Update zoom initially\n updateZoom();\n\n // Update zoom every 100ms to catch changes from wheel/keyboard/etc\n const interval = setInterval(updateZoom, 100);\n\n return () => clearInterval(interval);\n }, []);\n\n return (\n \n );\n};\n\nconst ZoomControls: FC<{ graph: GraphData }> = ({ graph }) => {\n const modKey = getModifierKeyName();\n return (\n <>\n \n \n \n \n \n );\n};\n\nconst SaveButton: FC<{\n onSave: () => void;\n saving: boolean;\n graph: GraphData;\n}> = ({ onSave, saving, graph }) => {\n const [hasChanges, setHasChanges] = useState(false);\n const modKey = getModifierKeyName();\n \n // Check for changes periodically\n useEffect(() => {\n const checkChanges = () => {\n setHasChanges(graph.changed());\n };\n \n // Initial check\n checkChanges();\n \n // Check every 100ms for changes\n const interval = setInterval(checkChanges, 100);\n \n return () => clearInterval(interval);\n }, [graph]);\n \n return (\n \n );\n};\n\nconst HelpButton: FC<{\n onToggleHelp: () => void;\n}> = ({ onToggleHelp }) => {\n return (\n \n );\n};","import React, { FC, useState, useCallback, useEffect, Suspense, lazy } from \"react\";\nimport { GraphData } from \"./graph-view/graph\";\nimport { BrowserRouter as Router, Routes, Route, useSearchParams } from 'react-router-dom';\nimport { listViews } from \"./parseModel\";\nimport { useGraph, useAutoLayout, useSave, useKeyboardShortcuts, clearGraphCache } from \"./hooks\";\nimport { Toolbar } from \"./components/Toolbar\";\nimport { removeEmptyProps, getCurrentViewID } from \"./utils\";\n\nconst Help = lazy(() => import(\"./shortcuts\").then(module => ({ default: module.Help })));\nconst Graph = lazy(() => import(\"./graph-view/graph-react\").then(module => ({ default: module.Graph })));\n\n// Types\ninterface ModelData {\n model: any;\n layout: any;\n}\n\nconst reportInteractiveError = (action: string, error: unknown) => {\n console.error(`${action} failed:`, error);\n alert(`${action} failed. See console for details.`);\n};\n\nexport const Root: FC = ({ model, layout }) => (\n \n \n } />\n \n \n);\n\nexport const refreshGraph = () => {\n const currentID = getCurrentViewID();\n clearGraphCache(currentID);\n};\n\nconst ModelPane: FC<{ model: any; layouts: any }> = ({ model, layouts }) => {\n const [searchParams, setSearchParams] = useSearchParams();\n const currentID = decodeURI(searchParams.get('id') || '');\n \n // UI State\n const [helpVisible, setHelpVisible] = useState(false);\n const [dragMode, setDragMode] = useState<'pan' | 'select'>('pan');\n \n // Get or create graph for current view\n const graph = useGraph(model, layouts, currentID);\n \n // Custom hooks for functionality\n const { layouting, handleAutoLayout } = useAutoLayout(graph || ({} as GraphData));\n const { saving, handleSave } = useSave(graph || ({} as GraphData), currentID);\n \n if (!graph) {\n return ;\n }\n\n const handleToggleHelp = useCallback(() => {\n setHelpVisible(!helpVisible);\n }, [helpVisible]);\n\n const handleInteractiveAutoLayout = useCallback(() => {\n void handleAutoLayout().catch(error => reportInteractiveError('Layout', error));\n }, [handleAutoLayout]);\n\n const handleInteractiveSave = useCallback(() => {\n void handleSave().catch(error => reportInteractiveError('Save', error));\n }, [handleSave]);\n\n // Update document title when view changes\n useEffect(() => {\n if (graph && graph.name) {\n document.title = `${graph.name} - Model`;\n }\n }, [graph]);\n\n // Setup keyboard shortcuts\n useKeyboardShortcuts(\n handleToggleHelp,\n handleInteractiveSave,\n graph,\n dragMode,\n setDragMode,\n handleInteractiveAutoLayout,\n );\n\n const handleViewChange = useCallback((id: string) => {\n setSearchParams({ id: encodeURIComponent(id) });\n }, [setSearchParams]);\n\n const handleSelect = useCallback((id: string | null) => {\n if (id) {\n const element = graph.metadata.elements.find((m: any) => m.id === id);\n console.log(removeEmptyProps(element));\n }\n }, [graph]);\n\n\treturn (\n\t\t<>\n\t\t\t\n\t\t\tLoading graph...}>\n\t\t\t\t\n\t\t\t\n\t\t\t{helpVisible && (\n\t\t\t\tLoading help...}>\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t)}\n\t\t\n\t);\n};\n\nconst ViewRedirect: FC<{ model: any }> = ({ model }) => {\n const views = listViews(model);\n \n React.useEffect(() => {\n // Set default title when no view is selected\n document.title = 'Model - Architecture Diagrams as Code';\n \n if (views.length > 0) {\n document.location.href = '?id=' + views[0].key;\n }\n }, [views]);\n\n if (views.length > 0) {\n return <>Redirecting to {views[0].title};\n }\n return <>No views available;\n};\n\n","interface LiveReloadOptions {\n\tminDelay: number;\n\tmaxDelay: number;\n\thandshakeTimeout: number;\n}\n\ninterface LiveReloadMessage {\n\tcommand: string;\n\tprotocols?: string[];\n\tver?: string;\n\tpath?: string;\n}\n\nclass Timer {\n\tprivate readonly callback: () => void;\n\tprivate readonly handler: () => void;\n\tprivate running: boolean = false;\n\tprivate timeoutId: ReturnType | null = null;\n\n\tconstructor(callback: () => void) {\n\t\tthis.callback = callback;\n\t\tthis.handler = () => {\n\t\t\tthis.running = false;\n\t\t\tthis.timeoutId = null;\n\t\t\tthis.callback();\n\t\t};\n\t}\n\n\tstart(timeout: number): void {\n\t\tif (this.running) {\n\t\t\tthis.stop();\n\t\t}\n\t\tthis.timeoutId = setTimeout(this.handler, timeout);\n\t\tthis.running = true;\n\t}\n\n\tstop(): void {\n\t\tif (this.running && this.timeoutId !== null) {\n\t\t\tclearTimeout(this.timeoutId);\n\t\t\tthis.running = false;\n\t\t\tthis.timeoutId = null;\n\t\t}\n\t}\n\n\tisRunning(): boolean {\n\t\treturn this.running;\n\t}\n}\n\n/**\n * RefreshConnector implements the livereload protocol to listen for file changes via WebSocket\n */\nexport class RefreshConnector {\n\tprivate static readonly DEFAULT_OPTIONS: LiveReloadOptions = {\n\t\tminDelay: 1000,\n\t\tmaxDelay: 60000,\n\t\thandshakeTimeout: 5000\n\t};\n\n\tprivate static readonly LIVERELOAD_PROTOCOLS = [\n\t\t'http://livereload.com/protocols/official-9',\n\t\t'http://livereload.com/protocols/2.x-remote-control'\n\t];\n\n\tprivate readonly uri: string;\n\tprivate readonly options: LiveReloadOptions;\n\tprivate readonly fileChangeHandler: (path: string) => void;\n\t\n\tprivate socket: WebSocket | null = null;\n\tprivate nextDelay: number;\n\tprivate connectionDesired: boolean = false;\n\tprivate disconnectionReason: string = '';\n\t\n\tprivate readonly handshakeTimeout: Timer;\n\tprivate readonly reconnectTimer: Timer;\n\n\tconstructor(fileChangeHandler: (file: string) => void, options?: Partial) {\n\t\tthis.fileChangeHandler = fileChangeHandler;\n\t\tthis.options = { ...RefreshConnector.DEFAULT_OPTIONS, ...options };\n\t\tthis.uri = 'ws://localhost:35729/livereload';\n\t\tthis.nextDelay = this.options.minDelay;\n\n\t\tthis.handshakeTimeout = new Timer(() => this.handleHandshakeTimeout());\n\t\tthis.reconnectTimer = new Timer(() => this.attemptReconnection());\n\t}\n\n\tconnect(): void {\n\t\tthis.connectionDesired = true;\n\n\t\tif (this.isSocketConnected()) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.prepareForConnection();\n\t\tthis.createWebSocket();\n\t}\n\n\tdisconnect(): void {\n\t\tthis.connectionDesired = false;\n\t\tthis.reconnectTimer.stop();\n\n\t\tif (this.isSocketConnected()) {\n\t\t\tthis.disconnectionReason = 'manual';\n\t\t\tthis.socket!.close();\n\t\t}\n\t}\n\n\tprivate isSocketConnected(): boolean {\n\t\treturn this.socket !== null && this.socket.readyState === WebSocket.OPEN;\n\t}\n\n\tprivate prepareForConnection(): void {\n\t\tthis.reconnectTimer.stop();\n\t\tthis.disconnectionReason = 'cannot-connect';\n\t}\n\n\tprivate createWebSocket(): void {\n\t\tthis.socket = new WebSocket(this.uri);\n\t\tthis.socket.onopen = () => this.handleOpen();\n\t\tthis.socket.onclose = () => this.handleClose();\n\t\tthis.socket.onmessage = (event) => this.handleMessage(event);\n\t\tthis.socket.onerror = () => this.handleError();\n\t}\n\n\tprivate handleOpen(): void {\n\t\tthis.disconnectionReason = 'handshake-failed';\n\t\tthis.startHandshake();\n\t}\n\n\tprivate handleClose(): void {\n\t\tconsole.log(`WebSocket disconnected: ${this.disconnectionReason}. Retry in ${this.nextDelay}ms`);\n\t\tthis.scheduleReconnection();\n\t}\n\n\tprivate handleMessage(event: MessageEvent): void {\n\t\ttry {\n\t\t\tconst message: LiveReloadMessage = JSON.parse(event.data);\n\t\t\tthis.processMessage(message);\n\t\t} catch (error) {\n\t\t\tconsole.error('Failed to parse WebSocket message:', error);\n\t\t}\n\t}\n\n\tprivate handleError(): void {\n\t\t// Error handling is done in onclose\n\t}\n\n\tprivate processMessage(message: LiveReloadMessage): void {\n\t\tswitch (message.command) {\n\t\t\tcase 'hello':\n\t\t\t\tthis.handleHelloMessage();\n\t\t\t\tbreak;\n\t\t\tcase 'reload':\n\t\t\t\tthis.handleReloadMessage(message);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tconsole.log('Unknown WebSocket message received:', message);\n\t\t}\n\t}\n\n\tprivate handleHelloMessage(): void {\n\t\tthis.handshakeTimeout.stop();\n\t\tthis.nextDelay = this.options.minDelay;\n\t}\n\n\tprivate handleReloadMessage(message: LiveReloadMessage): void {\n\t\t// The livereload server closes connection after sending reload\n\t\t// We must reconnect\n\t\tthis.reconnectTimer.stop();\n\t\tthis.connect();\n\n\t\tif (message.path) {\n\t\t\tthis.fileChangeHandler(message.path);\n\t\t}\n\t}\n\n\tprivate startHandshake(): void {\n\t\tconst helloMessage: LiveReloadMessage = {\n\t\t\tcommand: 'hello',\n\t\t\tprotocols: RefreshConnector.LIVERELOAD_PROTOCOLS,\n\t\t\tver: '3.3.1'\n\t\t};\n\t\t\n\t\tthis.sendCommand(helloMessage);\n\t\tthis.handshakeTimeout.start(this.options.handshakeTimeout);\n\t}\n\n\tprivate handleHandshakeTimeout(): void {\n\t\tif (this.isSocketConnected()) {\n\t\t\tthis.disconnectionReason = 'handshake-timeout';\n\t\t\tthis.socket!.close();\n\t\t}\n\t}\n\n\tprivate attemptReconnection(): void {\n\t\tif (this.connectionDesired) {\n\t\t\tthis.connect();\n\t\t}\n\t}\n\n\tprivate scheduleReconnection(): void {\n\t\tif (!this.connectionDesired) {\n\t\t\treturn; // Don't reconnect after manual disconnection\n\t\t}\n\n\t\tif (!this.reconnectTimer.isRunning()) {\n\t\t\tthis.reconnectTimer.start(this.nextDelay);\n\t\t\tthis.nextDelay = Math.min(this.options.maxDelay, this.nextDelay * 2);\n\t\t}\n\t}\n\n\tprivate sendCommand(command: LiveReloadMessage): void {\n\t\tif (this.isSocketConnected()) {\n\t\t\tthis.socket!.send(JSON.stringify(command));\n\t\t}\n\t}\n}","import { createRoot } from 'react-dom/client';\nimport React, { Suspense, lazy, useEffect, useState } from 'react';\nimport { refreshGraph } from \"./Root\";\nimport \"./fonts.css\";\nimport './style.css';\nimport '@fortawesome/fontawesome-free/css/all.css';\nimport { RefreshConnector } from \"./websocket\";\n\nconst Root = lazy(() => import('./Root').then(module => ({ default: module.Root })));\n\ninterface ModelData {\n\tmodel: any;\n\tlayout: any;\n}\n\ninterface AppState {\n\tdata: ModelData | null;\n\terror: string | null;\n\tloading: boolean;\n}\n\nconst App: React.FC = () => {\n\tconst [state, setState] = useState({\n\t\tdata: null,\n\t\terror: null,\n\t\tloading: true\n\t});\n\n\tconst loadData = async () => {\n\t\tsetState(prev => ({ ...prev, loading: true, error: null }));\n\t\t\n\t\ttry {\n\t\t\tconst [modelResponse, layoutResponse] = await Promise.all([\n\t\t\t\tfetch('data/model.json'),\n\t\t\t\tfetch('data/layout.json')\n\t\t\t]);\n\n\t\t\tif (!modelResponse.ok) {\n\t\t\t\tthrow new Error(`Failed to fetch model: ${modelResponse.statusText}`);\n\t\t\t}\n\t\t\t\n\t\t\tif (!layoutResponse.ok) {\n\t\t\t\tthrow new Error(`Failed to fetch layout: ${layoutResponse.statusText}`);\n\t\t\t}\n\n\t\t\tconst [model, layout] = await Promise.all([\n\t\t\t\tmodelResponse.json(),\n\t\t\t\tlayoutResponse.json()\n\t\t\t]);\n\n\t\t\tsetState({\n\t\t\t\tdata: { model, layout },\n\t\t\t\terror: null,\n\t\t\t\tloading: false\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tconsole.error('Failed to load data:', error);\n\t\t\tsetState({\n\t\t\t\tdata: null,\n\t\t\t\terror: error instanceof Error ? error.message : 'Unknown error occurred',\n\t\t\t\tloading: false\n\t\t\t});\n\t\t}\n\t};\n\n\tconst handleFileChange = (path: string) => {\n\t\tif (path.endsWith('.svg')) {\n\t\t\treturn; // Ignore SVG changes to avoid infinite loops\n\t\t}\n\t\t\n\t\tconsole.log('File changed:', path);\n\t\trefreshGraph();\n\t\tloadData();\n\t};\n\n\tuseEffect(() => {\n\t\tconst refreshConnector = new RefreshConnector(handleFileChange);\n\t\trefreshConnector.connect();\n\n\t\t// Initial data load\n\t\tloadData();\n\n\t\treturn () => {\n\t\t\trefreshConnector.disconnect();\n\t\t};\n\t}, []);\n\n\tif (state.loading) {\n\t\treturn ;\n\t}\n\n\tif (state.error) {\n\t\treturn ;\n\t}\n\n\tif (!state.data) {\n\t\treturn ;\n\t}\n\n\treturn (\n\t\t}>\n\t\t\t\n\t\t\n\t);\n};\n\nconst LoadingScreen: React.FC = () => (\n\t
\n\t\t
Loading...
\n\t
\n);\n\nconst ErrorScreen: React.FC<{ error: string; onRetry: () => void }> = ({ error, onRetry }) => (\n\t
\n\t\t

Error loading application

\n\t\t

{error}

\n\t\t\n\t
\n);\n\n// Initialize the application\nconst container = document.getElementById('root');\nif (!container) {\n\tthrow new Error('Root container not found');\n}\n\nconst root = createRoot(container);\nroot.render();"],"names":["graphs","camelToWords","camel","split","replace","charAt","toUpperCase","slice","Toolbar","model","currentID","onViewChange","graph","onAutoLayout","onSave","onToggleHelp","saving","layouting","dragMode","setDragMode","views","parseModel","B","jsx_runtime","jsxs","className","children","jsx","ViewSelector","ToolbarActions","length","onChange","e","target","value","disabled","hidden","map","view","key","section","title","style","marginLeft","fontWeight","display","alignItems","DragModeButton","UndoRedoButtons","AlignmentButtons","LayoutControls","GridControls","ZoomControls","SaveButton","HelpButton","onClick","modKey","platform","sy","Fragment","undo","redo","alignSelectionH","alignSelectionV","transform","distributeSelectionH","distributeSelectionV","gridVisible","setGridVisible","react","useState","isGridVisible","snapToGrid","setSnapToGrid","isSnapToGrid","useEffect","updateGridState","window","addEventListener","removeEventListener","toggleGrid","toggleSnapToGrid","snapAllToGrid","ZoomDisplay","zoom","setZoomState","updateZoom","currentZoom","Math","round","graph_view_graph","IX","interval","setInterval","clearInterval","a_","max","min","fitToView","hasChanges","setHasChanges","checkChanges","changed","Help","lazy","Promise","resolve","then","__webpack_require__","bind","module","default","Graph","reportInteractiveError","action","error","console","alert","Root","layout","chunk_62JRHF6Z","Kd","BV","qh","path","element","ModelPane","layouts","refreshGraph","URLSearchParams","document","location","search","get","Object","keys","forEach","searchParams","setSearchParams","ok","decodeURI","helpVisible","setHelpVisible","R","useGraph","handleAutoLayout","setLayouting","useCallback","async","options","direction","layoutDirection","opts","autoLayout","useAutoLayout","handleSave","setSaving","response","fetch","encodeURIComponent","method","body","exportSVG","status","detail","text","trim","Error","setSaved","useSave","ViewRedirect","handleToggleHelp","handleInteractiveAutoLayout","catch","handleInteractiveSave","name","toggleHelp","saveLayout","handleKeyDown","shortcut","shortcuts","Yp","preventDefault","aX","t9","Jk","DE","Vy","Hd","_t","resetView","Op","hZ","OE","Gg","moveSelected","getGridSize","J8","b3","iD","uK","l8","rB","mt","useKeyboardShortcuts","handleViewChange","id","handleSelect","metadata","elements","find","m","log","obj","JSON","parse","stringify","Suspense","fallback","data","onSelect","href","Timer","callback","handler","running","timeoutId","constructor","this","start","timeout","stop","setTimeout","clearTimeout","isRunning","RefreshConnector","static","minDelay","maxDelay","handshakeTimeout","uri","fileChangeHandler","socket","nextDelay","connectionDesired","disconnectionReason","reconnectTimer","DEFAULT_OPTIONS","handleHandshakeTimeout","attemptReconnection","connect","isSocketConnected","prepareForConnection","createWebSocket","disconnect","close","readyState","WebSocket","OPEN","onopen","handleOpen","onclose","handleClose","onmessage","event","handleMessage","onerror","handleError","startHandshake","scheduleReconnection","message","processMessage","command","handleHelloMessage","handleReloadMessage","helloMessage","protocols","LIVERELOAD_PROTOCOLS","ver","sendCommand","send","src_Root","App","state","setState","loading","loadData","prev","modelResponse","layoutResponse","all","statusText","json","handleFileChange","endsWith","S","refreshConnector","LoadingScreen","ErrorScreen","onRetry","justifyContent","height","fontFamily","padding","color","whiteSpace","flexDirection","fontSize","cursor","backgroundColor","border","borderRadius","container","getElementById","client","createRoot","render"],"sourceRoot":""} \ No newline at end of file diff --git a/cmd/mdl/webapp/dist/vendors.js b/cmd/mdl/webapp/dist/vendors.js index 9178553a..647832b6 100644 --- a/cmd/mdl/webapp/dist/vendors.js +++ b/cmd/mdl/webapp/dist/vendors.js @@ -1,3 +1,3 @@ /*! For license information please see vendors.js.LICENSE.txt */ -"use strict";(self.webpackChunkapp=self.webpackChunkapp||[]).push([[96],{716(e){e.exports=function(e){var t=[];return t.toString=function(){return this.map(function(t){var n="",r=void 0!==t[5];return t[4]&&(n+="@supports (".concat(t[4],") {")),t[2]&&(n+="@media ".concat(t[2]," {")),r&&(n+="@layer".concat(t[5].length>0?" ".concat(t[5]):""," {")),n+=e(t),r&&(n+="}"),t[2]&&(n+="}"),t[4]&&(n+="}"),n}).join("")},t.i=function(e,n,r,a,l){"string"==typeof e&&(e=[[null,e,void 0]]);var o={};if(r)for(var i=0;i0?" ".concat(c[5]):""," {").concat(c[1],"}")),c[5]=l),n&&(c[2]?(c[1]="@media ".concat(c[2]," {").concat(c[1],"}"),c[2]=n):c[2]=n),a&&(c[4]?(c[1]="@supports (".concat(c[4],") {").concat(c[1],"}"),c[4]=a):c[4]="".concat(a)),t.push(c))}},t}},247(e){e.exports=function(e,t){return t||(t={}),e?(e=String(e.__esModule?e.default:e),/^['"].*['"]$/.test(e)&&(e=e.slice(1,-1)),t.hash&&(e+=t.hash),/["'() \t\n]|(%20)/.test(e)||t.needQuotes?'"'.concat(e.replace(/"/g,'\\"').replace(/\n/g,"\\n"),'"'):e):e}},220(e){e.exports=function(e){var t=e[1],n=e[3];if(!n)return t;if("function"==typeof btoa){var r=btoa(unescape(encodeURIComponent(JSON.stringify(n)))),a="sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(r),l="/*# ".concat(a," */");return[t].concat([l]).join("\n")}return[t].join("\n")}},663(e,t,n){var r=n(666),a=n(763),l=n(481);function o(e){var t="https://react.dev/errors/"+e;if(1M||(e.current=F[M],F[M]=null,M--)}function U(e,t){M++,F[M]=e.current,e.current=t}var j,H,B=$(null),W=$(null),V=$(null),Q=$(null);function q(e,t){switch(U(V,t),U(W,e),U(B,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?yf(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)e=vf(t=yf(t),e);else switch(e){case"svg":e=1;break;case"math":e=2;break;default:e=0}}I(B),U(B,e)}function K(){I(B),I(W),I(V)}function Y(e){null!==e.memoizedState&&U(Q,e);var t=B.current,n=vf(t,e.type);t!==n&&(U(W,e),U(B,n))}function G(e){W.current===e&&(I(B),I(W)),Q.current===e&&(I(Q),cd._currentValue=D)}function X(e){if(void 0===j)try{throw Error()}catch(e){var t=e.stack.trim().match(/\n( *(at )?)/);j=t&&t[1]||"",H=-1)":-1--a||u[r]!==s[a]){var c="\n"+u[r].replace(" at new "," at ");return e.displayName&&c.includes("")&&(c=c.replace("",e.displayName)),c}}while(1<=r&&0<=a);break}}}finally{J=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:"")?X(n):""}function ee(e,t){switch(e.tag){case 26:case 27:case 5:return X(e.type);case 16:return X("Lazy");case 13:return e.child!==t&&null!==t?X("Suspense Fallback"):X("Suspense");case 19:return X("SuspenseList");case 0:case 15:return Z(e.type,!1);case 11:return Z(e.type.render,!1);case 1:return Z(e.type,!0);case 31:return X("Activity");default:return""}}function te(e){try{var t="",n=null;do{t+=ee(e,n),n=e,e=e.return}while(e);return t}catch(e){return"\nError generating stack: "+e.message+"\n"+e.stack}}var ne=Object.prototype.hasOwnProperty,re=r.unstable_scheduleCallback,ae=r.unstable_cancelCallback,le=r.unstable_shouldYield,oe=r.unstable_requestPaint,ie=r.unstable_now,ue=r.unstable_getCurrentPriorityLevel,se=r.unstable_ImmediatePriority,ce=r.unstable_UserBlockingPriority,fe=r.unstable_NormalPriority,de=r.unstable_LowPriority,pe=r.unstable_IdlePriority,he=r.log,me=r.unstable_setDisableYieldValue,ge=null,ye=null;function ve(e){if("function"==typeof he&&me(e),ye&&"function"==typeof ye.setStrictMode)try{ye.setStrictMode(ge,e)}catch(e){}}var be=Math.clz32?Math.clz32:function(e){return 0==(e>>>=0)?32:31-(we(e)/ke|0)|0},we=Math.log,ke=Math.LN2,Se=256,Ee=262144,xe=4194304;function Ce(e){var t=42&e;if(0!==t)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return 261888&e;case 262144:case 524288:case 1048576:case 2097152:return 3932160&e;case 4194304:case 8388608:case 16777216:case 33554432:return 62914560&e;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function Pe(e,t,n){var r=e.pendingLanes;if(0===r)return 0;var a=0,l=e.suspendedLanes,o=e.pingedLanes;e=e.warmLanes;var i=134217727&r;return 0!==i?0!==(r=i&~l)?a=Ce(r):0!==(o&=i)?a=Ce(o):n||0!==(n=i&~e)&&(a=Ce(n)):0!==(i=r&~l)?a=Ce(i):0!==o?a=Ce(o):n||0!==(n=r&~e)&&(a=Ce(n)),0===a?0:0!==t&&t!==a&&0===(t&l)&&((l=a&-a)>=(n=t&-t)||32===l&&4194048&n)?t:a}function _e(e,t){return 0===(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)}function Te(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;default:return-1}}function ze(){var e=xe;return!(62914560&(xe<<=1))&&(xe=4194304),e}function Ne(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function Le(e,t){e.pendingLanes|=t,268435456!==t&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function Re(e,t,n){e.pendingLanes|=t,e.suspendedLanes&=~t;var r=31-be(t);e.entangledLanes|=t,e.entanglements[r]=1073741824|e.entanglements[r]|261930&n}function Oe(e,t){var n=e.entangledLanes|=t;for(e=e.entanglements;n;){var r=31-be(n),a=1<=Cn),Tn=String.fromCharCode(32),zn=!1;function Nn(e,t){switch(e){case"keyup":return-1!==En.indexOf(t.keyCode);case"keydown":return 229!==t.keyCode;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Ln(e){return"object"==typeof(e=e.detail)&&"data"in e?e.data:null}var Rn=!1,On={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function An(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"input"===t?!!On[e.type]:"textarea"===t}function Dn(e,t,n,r){At?Dt?Dt.push(r):Dt=[r]:At=r,0<(t=nf(t,"onChange")).length&&(n=new tn("onChange","change",null,n,r),e.push({event:n,listeners:t}))}var Fn=null,Mn=null;function $n(e){Kc(e,0)}function In(e){if(pt(Xe(e)))return e}function Un(e,t){if("change"===e)return t}var jn=!1;if(Ut){var Hn;if(Ut){var Bn="oninput"in document;if(!Bn){var Wn=document.createElement("div");Wn.setAttribute("oninput","return;"),Bn="function"==typeof Wn.oninput}Hn=Bn}else Hn=!1;jn=Hn&&(!document.documentMode||9=t)return{node:r,offset:t-e};e=n}e:{for(;r;){if(r.nextSibling){r=r.nextSibling;break e}r=r.parentNode}r=void 0}r=Zn(r)}}function tr(e,t){return!(!e||!t)&&(e===t||(!e||3!==e.nodeType)&&(t&&3===t.nodeType?tr(e,t.parentNode):"contains"in e?e.contains(t):!!e.compareDocumentPosition&&!!(16&e.compareDocumentPosition(t))))}function nr(e){for(var t=ht((e=null!=e&&null!=e.ownerDocument&&null!=e.ownerDocument.defaultView?e.ownerDocument.defaultView:window).document);t instanceof e.HTMLIFrameElement;){try{var n="string"==typeof t.contentWindow.location.href}catch(e){n=!1}if(!n)break;t=ht((e=t.contentWindow).document)}return t}function rr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&("input"===t&&("text"===e.type||"search"===e.type||"tel"===e.type||"url"===e.type||"password"===e.type)||"textarea"===t||"true"===e.contentEditable)}var ar=Ut&&"documentMode"in document&&11>=document.documentMode,lr=null,or=null,ir=null,ur=!1;function sr(e,t,n){var r=n.window===n?n.document:9===n.nodeType?n:n.ownerDocument;ur||null==lr||lr!==ht(r)||(r="selectionStart"in(r=lr)&&rr(r)?{start:r.selectionStart,end:r.selectionEnd}:{anchorNode:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection()).anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset},ir&&Jn(ir,r)||(ir=r,0<(r=nf(or,"onSelect")).length&&(t=new tn("onSelect","select",null,t,n),e.push({event:t,listeners:r}),t.target=lr)))}function cr(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["Webkit"+e]="webkit"+t,n["Moz"+e]="moz"+t,n}var fr={animationend:cr("Animation","AnimationEnd"),animationiteration:cr("Animation","AnimationIteration"),animationstart:cr("Animation","AnimationStart"),transitionrun:cr("Transition","TransitionRun"),transitionstart:cr("Transition","TransitionStart"),transitioncancel:cr("Transition","TransitionCancel"),transitionend:cr("Transition","TransitionEnd")},dr={},pr={};function hr(e){if(dr[e])return dr[e];if(!fr[e])return e;var t,n=fr[e];for(t in n)if(n.hasOwnProperty(t)&&t in pr)return dr[e]=n[t];return e}Ut&&(pr=document.createElement("div").style,"AnimationEvent"in window||(delete fr.animationend.animation,delete fr.animationiteration.animation,delete fr.animationstart.animation),"TransitionEvent"in window||delete fr.transitionend.transition);var mr=hr("animationend"),gr=hr("animationiteration"),yr=hr("animationstart"),vr=hr("transitionrun"),br=hr("transitionstart"),wr=hr("transitioncancel"),kr=hr("transitionend"),Sr=new Map,Er="abort auxClick beforeToggle cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel".split(" ");function xr(e,t){Sr.set(e,t),nt(t,[e])}Er.push("scrollEnd");var Cr="function"==typeof reportError?reportError:function(e){if("object"==typeof window&&"function"==typeof window.ErrorEvent){var t=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:"object"==typeof e&&null!==e&&"string"==typeof e.message?String(e.message):String(e),error:e});if(!window.dispatchEvent(t))return}else if("object"==typeof process&&"function"==typeof process.emit)return void process.emit("uncaughtException",e);console.error(e)},Pr=[],_r=0,Tr=0;function zr(){for(var e=_r,t=Tr=_r=0;t>=o,a-=o,ta=1<<32-be(t)+a|n<h?(m=f,f=null):m=f.sibling;var g=p(a,f,i[h],u);if(null===g){null===f&&(f=m);break}e&&f&&null===g.alternate&&t(a,f),o=l(g,o,h),null===c?s=g:c.sibling=g,c=g,f=m}if(h===i.length)return n(a,f),ca&&ra(a,h),s;if(null===f){for(;hm?(g=h,h=null):g=h.sibling;var b=p(a,h,v.value,s);if(null===b){null===h&&(h=g);break}e&&h&&null===b.alternate&&t(a,h),i=l(b,i,m),null===f?c=b:f.sibling=b,f=b,h=g}if(v.done)return n(a,h),ca&&ra(a,m),c;if(null===h){for(;!v.done;m++,v=u.next())null!==(v=d(a,v.value,s))&&(i=l(v,i,m),null===f?c=v:f.sibling=v,f=v);return ca&&ra(a,m),c}for(h=r(h);!v.done;m++,v=u.next())null!==(v=y(h,a,m,v.value,s))&&(e&&null!==v.alternate&&h.delete(null===v.key?m:v.key),i=l(v,i,m),null===f?c=v:f.sibling=v,f=v);return e&&h.forEach(function(e){return t(a,e)}),ca&&ra(a,m),c}(u,s,c=b.call(c),f)}if("function"==typeof c.then)return v(u,s,ul(c),f);if(c.$$typeof===w)return v(u,s,Ra(u,c),f);cl(u,c)}return"string"==typeof c&&""!==c||"number"==typeof c||"bigint"==typeof c?(c=""+c,null!==s&&6===s.tag?(n(u,s.sibling),(f=a(s,c)).return=u,u=f):(n(u,s),(f=Br(c,u.mode,f)).return=u,u=f),i(u)):n(u,s)}return function(e,t,n,r){try{il=0;var a=v(e,t,n,r);return ol=null,a}catch(t){if(t===Ga||t===Ja)throw t;var l=Mr(29,t,null,e.mode);return l.lanes=r,l.return=e,l}}}var dl=fl(!0),pl=fl(!1),hl=!1;function ml(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function gl(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function yl(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function vl(e,t,n){var r=e.updateQueue;if(null===r)return null;if(r=r.shared,2&ds){var a=r.pending;return null===a?t.next=t:(t.next=a.next,a.next=t),r.pending=t,t=Ar(e),Or(e,null,n),t}return Nr(e,r,t,n),Ar(e)}function bl(e,t,n){if(null!==(t=t.updateQueue)&&(t=t.shared,4194048&n)){var r=t.lanes;n|=r&=e.pendingLanes,t.lanes=n,Oe(e,n)}}function wl(e,t){var n=e.updateQueue,r=e.alternate;if(null!==r&&n===(r=r.updateQueue)){var a=null,l=null;if(null!==(n=n.firstBaseUpdate)){do{var o={lane:n.lane,tag:n.tag,payload:n.payload,callback:null,next:null};null===l?a=l=o:l=l.next=o,n=n.next}while(null!==n);null===l?a=l=t:l=l.next=t}else a=l=t;return n={baseState:r.baseState,firstBaseUpdate:a,lastBaseUpdate:l,shared:r.shared,callbacks:r.callbacks},void(e.updateQueue=n)}null===(e=n.lastBaseUpdate)?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}var kl=!1;function Sl(){if(kl&&null!==Ba)throw Ba}function El(e,t,n,r){kl=!1;var a=e.updateQueue;hl=!1;var l=a.firstBaseUpdate,o=a.lastBaseUpdate,i=a.shared.pending;if(null!==i){a.shared.pending=null;var u=i,s=u.next;u.next=null,null===o?l=s:o.next=s,o=u;var c=e.alternate;null!==c&&(i=(c=c.updateQueue).lastBaseUpdate)!==o&&(null===i?c.firstBaseUpdate=s:i.next=s,c.lastBaseUpdate=u)}if(null!==l){var f=a.baseState;for(o=0,c=s=u=null,i=l;;){var p=-536870913&i.lane,h=p!==i.lane;if(h?(ms&p)===p:(r&p)===p){0!==p&&p===Ha&&(kl=!0),null!==c&&(c=c.next={lane:0,tag:i.tag,payload:i.payload,callback:null,next:null});e:{var m=e,g=i;p=t;var y=n;switch(g.tag){case 1:if("function"==typeof(m=g.payload)){f=m.call(y,f,p);break e}f=m;break e;case 3:m.flags=-65537&m.flags|128;case 0:if(null==(p="function"==typeof(m=g.payload)?m.call(y,f,p):m))break e;f=d({},f,p);break e;case 2:hl=!0}}null!==(p=i.callback)&&(e.flags|=64,h&&(e.flags|=8192),null===(h=a.callbacks)?a.callbacks=[p]:h.push(p))}else h={lane:p,tag:i.tag,payload:i.payload,callback:i.callback,next:null},null===c?(s=c=h,u=f):c=c.next=h,o|=p;if(null===(i=i.next)){if(null===(i=a.shared.pending))break;i=(h=i).next,h.next=null,a.lastBaseUpdate=h,a.shared.pending=null}}null===c&&(u=f),a.baseState=u,a.firstBaseUpdate=s,a.lastBaseUpdate=c,null===l&&(a.shared.lanes=0),Es|=o,e.lanes=o,e.memoizedState=f}}function xl(e,t){if("function"!=typeof e)throw Error(o(191,e));e.call(t)}function Cl(e,t){var n=e.callbacks;if(null!==n)for(e.callbacks=null,e=0;el?l:8;var o,i,u,s=O.T,c={};O.T=c,ci(e,!1,t,n);try{var f=a(),d=O.S;null!==d&&d(c,f),null!==f&&"object"==typeof f&&"function"==typeof f.then?si(e,t,(o=r,i=[],u={status:"pending",value:null,reason:null,then:function(e){i.push(e)}},f.then(function(){u.status="fulfilled",u.value=o;for(var e=0;e<\/script>",l=l.removeChild(l.firstChild);break;case"select":l="string"==typeof r.is?i.createElement("select",{is:r.is}):i.createElement("select"),r.multiple?l.multiple=!0:r.size&&(l.size=r.size);break;default:l="string"==typeof r.is?i.createElement(a,{is:r.is}):i.createElement(a)}}l[Ue]=t,l[je]=r;e:for(i=t.child;null!==i;){if(5===i.tag||6===i.tag)l.appendChild(i.stateNode);else if(4!==i.tag&&27!==i.tag&&null!==i.child){i.child.return=i,i=i.child;continue}if(i===t)break e;for(;null===i.sibling;){if(null===i.return||i.return===t)break e;i=i.return}i.sibling.return=i.return,i=i.sibling}t.stateNode=l;e:switch(df(l,a,r),a){case"button":case"input":case"select":case"textarea":r=!!r.autoFocus;break e;case"img":r=!0;break e;default:r=!1}r&&ou(t)}}return fu(t),iu(t,t.type,null===e||e.memoizedProps,t.pendingProps,n),null;case 6:if(e&&null!=t.stateNode)e.memoizedProps!==r&&ou(t);else{if("string"!=typeof r&&null===t.stateNode)throw Error(o(166));if(e=V.current,ya(t)){if(e=t.stateNode,n=t.memoizedProps,r=null,null!==(a=ua))switch(a.tag){case 27:case 5:r=a.memoizedProps}e[Ue]=t,(e=!!(e.nodeValue===n||null!==r&&!0===r.suppressHydrationWarning||sf(e.nodeValue,n)))||ha(t,!0)}else(e=gf(e).createTextNode(r))[Ue]=t,t.stateNode=e}return fu(t),null;case 31:if(n=t.memoizedState,null===e||null!==e.memoizedState){if(r=ya(t),null!==n){if(null===e){if(!r)throw Error(o(318));if(!(e=null!==(e=t.memoizedState)?e.dehydrated:null))throw Error(o(557));e[Ue]=t}else va(),!(128&t.flags)&&(t.memoizedState=null),t.flags|=4;fu(t),e=!1}else n=ba(),null!==e&&null!==e.memoizedState&&(e.memoizedState.hydrationErrors=n),e=!0;if(!e)return 256&t.flags?(Ml(t),t):(Ml(t),null);if(128&t.flags)throw Error(o(558))}return fu(t),null;case 13:if(r=t.memoizedState,null===e||null!==e.memoizedState&&null!==e.memoizedState.dehydrated){if(a=ya(t),null!==r&&null!==r.dehydrated){if(null===e){if(!a)throw Error(o(318));if(!(a=null!==(a=t.memoizedState)?a.dehydrated:null))throw Error(o(317));a[Ue]=t}else va(),!(128&t.flags)&&(t.memoizedState=null),t.flags|=4;fu(t),a=!1}else a=ba(),null!==e&&null!==e.memoizedState&&(e.memoizedState.hydrationErrors=a),a=!0;if(!a)return 256&t.flags?(Ml(t),t):(Ml(t),null)}return Ml(t),128&t.flags?(t.lanes=n,t):(n=null!==r,e=null!==e&&null!==e.memoizedState,n&&(a=null,null!==(r=t.child).alternate&&null!==r.alternate.memoizedState&&null!==r.alternate.memoizedState.cachePool&&(a=r.alternate.memoizedState.cachePool.pool),l=null,null!==r.memoizedState&&null!==r.memoizedState.cachePool&&(l=r.memoizedState.cachePool.pool),l!==a&&(r.flags|=2048)),n!==e&&n&&(t.child.flags|=8192),su(t,t.updateQueue),fu(t),null);case 4:return K(),null===e&&Jc(t.stateNode.containerInfo),fu(t),null;case 10:return Ca(t.type),fu(t),null;case 19:if(I($l),null===(r=t.memoizedState))return fu(t),null;if(a=!!(128&t.flags),null===(l=r.rendering))if(a)cu(r,!1);else{if(0!==Ss||null!==e&&128&e.flags)for(e=t.child;null!==e;){if(null!==(l=Il(e))){for(t.flags|=128,cu(r,!1),e=l.updateQueue,t.updateQueue=e,su(t,e),t.subtreeFlags=0,e=n,n=t.child;null!==n;)Ur(n,e),n=n.sibling;return U($l,1&$l.current|2),ca&&ra(t,r.treeForkCount),t.child}e=e.sibling}null!==r.tail&&ie()>Os&&(t.flags|=128,a=!0,cu(r,!1),t.lanes=4194304)}else{if(!a)if(null!==(e=Il(l))){if(t.flags|=128,a=!0,e=e.updateQueue,t.updateQueue=e,su(t,e),cu(r,!0),null===r.tail&&"hidden"===r.tailMode&&!l.alternate&&!ca)return fu(t),null}else 2*ie()-r.renderingStartTime>Os&&536870912!==n&&(t.flags|=128,a=!0,cu(r,!1),t.lanes=4194304);r.isBackwards?(l.sibling=t.child,t.child=l):(null!==(e=r.last)?e.sibling=l:t.child=l,r.last=l)}return null!==r.tail?(e=r.tail,r.rendering=e,r.tail=e.sibling,r.renderingStartTime=ie(),e.sibling=null,n=$l.current,U($l,a?1&n|2:1&n),ca&&ra(t,r.treeForkCount),e):(fu(t),null);case 22:case 23:return Ml(t),Nl(),r=null!==t.memoizedState,null!==e?null!==e.memoizedState!==r&&(t.flags|=8192):r&&(t.flags|=8192),r?!!(536870912&n)&&!(128&t.flags)&&(fu(t),6&t.subtreeFlags&&(t.flags|=8192)):fu(t),null!==(n=t.updateQueue)&&su(t,n.retryQueue),n=null,null!==e&&null!==e.memoizedState&&null!==e.memoizedState.cachePool&&(n=e.memoizedState.cachePool.pool),r=null,null!==t.memoizedState&&null!==t.memoizedState.cachePool&&(r=t.memoizedState.cachePool.pool),r!==n&&(t.flags|=2048),null!==e&&I(Qa),null;case 24:return n=null,null!==e&&(n=e.memoizedState.cache),t.memoizedState.cache!==n&&(t.flags|=2048),Ca(Ma),fu(t),null;case 25:case 30:return null}throw Error(o(156,t.tag))}function pu(e,t){switch(oa(t),t.tag){case 1:return 65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 3:return Ca(Ma),K(),65536&(e=t.flags)&&!(128&e)?(t.flags=-65537&e|128,t):null;case 26:case 27:case 5:return G(t),null;case 31:if(null!==t.memoizedState){if(Ml(t),null===t.alternate)throw Error(o(340));va()}return 65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 13:if(Ml(t),null!==(e=t.memoizedState)&&null!==e.dehydrated){if(null===t.alternate)throw Error(o(340));va()}return 65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 19:return I($l),null;case 4:return K(),null;case 10:return Ca(t.type),null;case 22:case 23:return Ml(t),Nl(),null!==e&&I(Qa),65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 24:return Ca(Ma),null;default:return null}}function hu(e,t){switch(oa(t),t.tag){case 3:Ca(Ma),K();break;case 26:case 27:case 5:G(t);break;case 4:K();break;case 31:null!==t.memoizedState&&Ml(t);break;case 13:Ml(t);break;case 19:I($l);break;case 10:Ca(t.type);break;case 22:case 23:Ml(t),Nl(),null!==e&&I(Qa);break;case 24:Ca(Ma)}}function mu(e,t){try{var n=t.updateQueue,r=null!==n?n.lastEffect:null;if(null!==r){var a=r.next;n=a;do{if((n.tag&e)===e){r=void 0;var l=n.create,o=n.inst;r=l(),o.destroy=r}n=n.next}while(n!==a)}}catch(e){Sc(t,t.return,e)}}function gu(e,t,n){try{var r=t.updateQueue,a=null!==r?r.lastEffect:null;if(null!==a){var l=a.next;r=l;do{if((r.tag&e)===e){var o=r.inst,i=o.destroy;if(void 0!==i){o.destroy=void 0,a=t;var u=n,s=i;try{s()}catch(e){Sc(a,u,e)}}}r=r.next}while(r!==l)}}catch(e){Sc(t,t.return,e)}}function yu(e){var t=e.updateQueue;if(null!==t){var n=e.stateNode;try{Cl(t,n)}catch(t){Sc(e,e.return,t)}}}function vu(e,t,n){n.props=Si(e.type,e.memoizedProps),n.state=e.memoizedState;try{n.componentWillUnmount()}catch(n){Sc(e,t,n)}}function bu(e,t){try{var n=e.ref;if(null!==n){switch(e.tag){case 26:case 27:case 5:var r=e.stateNode;break;default:r=e.stateNode}"function"==typeof n?e.refCleanup=n(r):n.current=r}}catch(n){Sc(e,t,n)}}function wu(e,t){var n=e.ref,r=e.refCleanup;if(null!==n)if("function"==typeof r)try{r()}catch(n){Sc(e,t,n)}finally{e.refCleanup=null,null!=(e=e.alternate)&&(e.refCleanup=null)}else if("function"==typeof n)try{n(null)}catch(n){Sc(e,t,n)}else n.current=null}function ku(e){var t=e.type,n=e.memoizedProps,r=e.stateNode;try{e:switch(t){case"button":case"input":case"select":case"textarea":n.autoFocus&&r.focus();break e;case"img":n.src?r.src=n.src:n.srcSet&&(r.srcset=n.srcSet)}}catch(t){Sc(e,e.return,t)}}function Su(e,t,n){try{var r=e.stateNode;!function(e,t,n,r){switch(t){case"div":case"span":case"svg":case"path":case"a":case"g":case"p":case"li":break;case"input":var a=null,l=null,i=null,u=null,s=null,c=null,f=null;for(h in n){var d=n[h];if(n.hasOwnProperty(h)&&null!=d)switch(h){case"checked":case"value":break;case"defaultValue":s=d;default:r.hasOwnProperty(h)||cf(e,t,h,null,r,d)}}for(var p in r){var h=r[p];if(d=n[p],r.hasOwnProperty(p)&&(null!=h||null!=d))switch(p){case"type":l=h;break;case"name":a=h;break;case"checked":c=h;break;case"defaultChecked":f=h;break;case"value":i=h;break;case"defaultValue":u=h;break;case"children":case"dangerouslySetInnerHTML":if(null!=h)throw Error(o(137,t));break;default:h!==d&&cf(e,t,p,h,r,d)}}return void yt(e,i,u,s,c,f,l,a);case"select":for(l in h=i=u=p=null,n)if(s=n[l],n.hasOwnProperty(l)&&null!=s)switch(l){case"value":break;case"multiple":h=s;default:r.hasOwnProperty(l)||cf(e,t,l,null,r,s)}for(a in r)if(l=r[a],s=n[a],r.hasOwnProperty(a)&&(null!=l||null!=s))switch(a){case"value":p=l;break;case"defaultValue":u=l;break;case"multiple":i=l;default:l!==s&&cf(e,t,a,l,r,s)}return t=u,n=i,r=h,void(null!=p?wt(e,!!n,p,!1):!!r!=!!n&&(null!=t?wt(e,!!n,t,!0):wt(e,!!n,n?[]:"",!1)));case"textarea":for(u in h=p=null,n)if(a=n[u],n.hasOwnProperty(u)&&null!=a&&!r.hasOwnProperty(u))switch(u){case"value":case"children":break;default:cf(e,t,u,null,r,a)}for(i in r)if(a=r[i],l=n[i],r.hasOwnProperty(i)&&(null!=a||null!=l))switch(i){case"value":p=a;break;case"defaultValue":h=a;break;case"children":break;case"dangerouslySetInnerHTML":if(null!=a)throw Error(o(91));break;default:a!==l&&cf(e,t,i,a,r,l)}return void kt(e,p,h);case"option":for(var m in n)p=n[m],n.hasOwnProperty(m)&&null!=p&&!r.hasOwnProperty(m)&&("selected"===m?e.selected=!1:cf(e,t,m,null,r,p));for(s in r)p=r[s],h=n[s],!r.hasOwnProperty(s)||p===h||null==p&&null==h||("selected"===s?e.selected=p&&"function"!=typeof p&&"symbol"!=typeof p:cf(e,t,s,p,r,h));return;case"img":case"link":case"area":case"base":case"br":case"col":case"embed":case"hr":case"keygen":case"meta":case"param":case"source":case"track":case"wbr":case"menuitem":for(var g in n)p=n[g],n.hasOwnProperty(g)&&null!=p&&!r.hasOwnProperty(g)&&cf(e,t,g,null,r,p);for(c in r)if(p=r[c],h=n[c],r.hasOwnProperty(c)&&p!==h&&(null!=p||null!=h))switch(c){case"children":case"dangerouslySetInnerHTML":if(null!=p)throw Error(o(137,t));break;default:cf(e,t,c,p,r,h)}return;default:if(_t(t)){for(var y in n)p=n[y],n.hasOwnProperty(y)&&void 0!==p&&!r.hasOwnProperty(y)&&ff(e,t,y,void 0,r,p);for(f in r)p=r[f],h=n[f],!r.hasOwnProperty(f)||p===h||void 0===p&&void 0===h||ff(e,t,f,p,r,h);return}}for(var v in n)p=n[v],n.hasOwnProperty(v)&&null!=p&&!r.hasOwnProperty(v)&&cf(e,t,v,null,r,p);for(d in r)p=r[d],h=n[d],!r.hasOwnProperty(d)||p===h||null==p&&null==h||cf(e,t,d,p,r,h)}(r,e.type,n,t),r[je]=t}catch(t){Sc(e,e.return,t)}}function Eu(e){return 5===e.tag||3===e.tag||26===e.tag||27===e.tag&&Pf(e.type)||4===e.tag}function xu(e){e:for(;;){for(;null===e.sibling;){if(null===e.return||Eu(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;5!==e.tag&&6!==e.tag&&18!==e.tag;){if(27===e.tag&&Pf(e.type))continue e;if(2&e.flags)continue e;if(null===e.child||4===e.tag)continue e;e.child.return=e,e=e.child}if(!(2&e.flags))return e.stateNode}}function Cu(e,t,n){var r=e.tag;if(5===r||6===r)e=e.stateNode,t?(9===n.nodeType?n.body:"HTML"===n.nodeName?n.ownerDocument.body:n).insertBefore(e,t):((t=9===n.nodeType?n.body:"HTML"===n.nodeName?n.ownerDocument.body:n).appendChild(e),null!=(n=n._reactRootContainer)||null!==t.onclick||(t.onclick=Lt));else if(4!==r&&(27===r&&Pf(e.type)&&(n=e.stateNode,t=null),null!==(e=e.child)))for(Cu(e,t,n),e=e.sibling;null!==e;)Cu(e,t,n),e=e.sibling}function Pu(e,t,n){var r=e.tag;if(5===r||6===r)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(4!==r&&(27===r&&Pf(e.type)&&(n=e.stateNode),null!==(e=e.child)))for(Pu(e,t,n),e=e.sibling;null!==e;)Pu(e,t,n),e=e.sibling}function _u(e){var t=e.stateNode,n=e.memoizedProps;try{for(var r=e.type,a=t.attributes;a.length;)t.removeAttributeNode(a[0]);df(t,r,n),t[Ue]=e,t[je]=n}catch(t){Sc(e,e.return,t)}}var Tu=!1,zu=!1,Nu=!1,Lu="function"==typeof WeakSet?WeakSet:Set,Ru=null;function Ou(e,t,n){var r=n.flags;switch(n.tag){case 0:case 11:case 15:qu(e,n),4&r&&mu(5,n);break;case 1:if(qu(e,n),4&r)if(e=n.stateNode,null===t)try{e.componentDidMount()}catch(e){Sc(n,n.return,e)}else{var a=Si(n.type,t.memoizedProps);t=t.memoizedState;try{e.componentDidUpdate(a,t,e.__reactInternalSnapshotBeforeUpdate)}catch(e){Sc(n,n.return,e)}}64&r&&yu(n),512&r&&bu(n,n.return);break;case 3:if(qu(e,n),64&r&&null!==(e=n.updateQueue)){if(t=null,null!==n.child)switch(n.child.tag){case 27:case 5:case 1:t=n.child.stateNode}try{Cl(e,t)}catch(e){Sc(n,n.return,e)}}break;case 27:null===t&&4&r&&_u(n);case 26:case 5:qu(e,n),null===t&&4&r&&ku(n),512&r&&bu(n,n.return);break;case 12:qu(e,n);break;case 31:qu(e,n),4&r&&Iu(e,n);break;case 13:qu(e,n),4&r&&Uu(e,n),64&r&&null!==(e=n.memoizedState)&&null!==(e=e.dehydrated)&&function(e,t){var n=e.ownerDocument;if("$~"===e.data)e._reactRetry=t;else if("$?"!==e.data||"loading"!==n.readyState)t();else{var r=function(){t(),n.removeEventListener("DOMContentLoaded",r)};n.addEventListener("DOMContentLoaded",r),e._reactRetry=r}}(e,n=Pc.bind(null,n));break;case 22:if(!(r=null!==n.memoizedState||Tu)){t=null!==t&&null!==t.memoizedState||zu,a=Tu;var l=zu;Tu=r,(zu=t)&&!l?Yu(e,n,!!(8772&n.subtreeFlags)):qu(e,n),Tu=a,zu=l}break;case 30:break;default:qu(e,n)}}function Au(e){var t=e.alternate;null!==t&&(e.alternate=null,Au(t)),e.child=null,e.deletions=null,e.sibling=null,5===e.tag&&null!==(t=e.stateNode)&&Ke(t),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}var Du=null,Fu=!1;function Mu(e,t,n){for(n=n.child;null!==n;)$u(e,t,n),n=n.sibling}function $u(e,t,n){if(ye&&"function"==typeof ye.onCommitFiberUnmount)try{ye.onCommitFiberUnmount(ge,n)}catch(e){}switch(n.tag){case 26:zu||wu(n,t),Mu(e,t,n),n.memoizedState?n.memoizedState.count--:n.stateNode&&(n=n.stateNode).parentNode.removeChild(n);break;case 27:zu||wu(n,t);var r=Du,a=Fu;Pf(n.type)&&(Du=n.stateNode,Fu=!1),Mu(e,t,n),$f(n.stateNode),Du=r,Fu=a;break;case 5:zu||wu(n,t);case 6:if(r=Du,a=Fu,Du=null,Mu(e,t,n),Fu=a,null!==(Du=r))if(Fu)try{(9===Du.nodeType?Du.body:"HTML"===Du.nodeName?Du.ownerDocument.body:Du).removeChild(n.stateNode)}catch(e){Sc(n,t,e)}else try{Du.removeChild(n.stateNode)}catch(e){Sc(n,t,e)}break;case 18:null!==Du&&(Fu?(_f(9===(e=Du).nodeType?e.body:"HTML"===e.nodeName?e.ownerDocument.body:e,n.stateNode),Hd(e)):_f(Du,n.stateNode));break;case 4:r=Du,a=Fu,Du=n.stateNode.containerInfo,Fu=!0,Mu(e,t,n),Du=r,Fu=a;break;case 0:case 11:case 14:case 15:gu(2,n,t),zu||gu(4,n,t),Mu(e,t,n);break;case 1:zu||(wu(n,t),"function"==typeof(r=n.stateNode).componentWillUnmount&&vu(n,t,r)),Mu(e,t,n);break;case 21:Mu(e,t,n);break;case 22:zu=(r=zu)||null!==n.memoizedState,Mu(e,t,n),zu=r;break;default:Mu(e,t,n)}}function Iu(e,t){if(null===t.memoizedState&&null!==(e=t.alternate)&&null!==(e=e.memoizedState)){e=e.dehydrated;try{Hd(e)}catch(e){Sc(t,t.return,e)}}}function Uu(e,t){if(null===t.memoizedState&&null!==(e=t.alternate)&&null!==(e=e.memoizedState)&&null!==(e=e.dehydrated))try{Hd(e)}catch(e){Sc(t,t.return,e)}}function ju(e,t){var n=function(e){switch(e.tag){case 31:case 13:case 19:var t=e.stateNode;return null===t&&(t=e.stateNode=new Lu),t;case 22:return null===(t=(e=e.stateNode)._retryCache)&&(t=e._retryCache=new Lu),t;default:throw Error(o(435,e.tag))}}(e);t.forEach(function(t){if(!n.has(t)){n.add(t);var r=_c.bind(null,e,t);t.then(r,r)}})}function Hu(e,t){var n=t.deletions;if(null!==n)for(var r=0;r title"))),df(l,r,n),l[Ue]=e,Ze(l),r=l;break e;case"link":var i=nd("link","href",a).get(r+(n.href||""));if(i)for(var u=0;ui)break;var c=u.transferSize,f=u.initiatorType;c&&pf(f)&&(o+=c*((u=u.responseEnd)ld?50:800)+t);return e.unsuspend=n,function(){e.unsuspend=null,clearTimeout(r),clearTimeout(a)}}:null}(f,h)))return Is=l,e.cancelPendingCommit=h(hc.bind(null,e,t,l,n,r,a,o,i,u,c,f,null,d,p)),void Xs(e,l,o,!s)}hc(e,t,l,n,r,a,o,i,u)}function Gs(e){for(var t=e;;){var n=t.tag;if((0===n||11===n||15===n)&&16384&t.flags&&null!==(n=t.updateQueue)&&null!==(n=n.stores))for(var r=0;rg&&(o=g,g=m,m=o);var y=er(i,m),v=er(i,g);if(y&&v&&(1!==p.rangeCount||p.anchorNode!==y.node||p.anchorOffset!==y.offset||p.focusNode!==v.node||p.focusOffset!==v.offset)){var b=f.createRange();b.setStart(y.node,y.offset),p.removeAllRanges(),m>g?(p.addRange(b),p.extend(v.node,v.offset)):(b.setEnd(v.node,v.offset),p.addRange(b))}}}}for(f=[],p=i;p=p.parentNode;)1===p.nodeType&&f.push({element:p,left:p.scrollLeft,top:p.scrollTop});for("function"==typeof i.focus&&i.focus(),i=0;in?32:n,O.T=null,n=js,js=null;var l=Ms,i=Is;if(Fs=0,$s=Ms=null,Is=0,6&ds)throw Error(o(331));var u=ds;if(ds|=4,is(l.current),Zu(l,l.current,i,n),ds=u,Dc(0,!1),ye&&"function"==typeof ye.onPostCommitFiberRoot)try{ye.onPostCommitFiberRoot(ge,l)}catch(e){}return!0}finally{A.p=a,O.T=r,vc(e,t)}}function kc(e,t,n){t=qr(n,t),null!==(e=vl(e,t=Ti(e.stateNode,t,2),2))&&(Le(e,2),Ac(e))}function Sc(e,t,n){if(3===e.tag)kc(e,e,n);else for(;null!==t;){if(3===t.tag){kc(t,e,n);break}if(1===t.tag){var r=t.stateNode;if("function"==typeof t.type.getDerivedStateFromError||"function"==typeof r.componentDidCatch&&(null===Ds||!Ds.has(r))){e=qr(n,e),null!==(r=vl(t,n=zi(2),2))&&(Ni(n,r,t,e),Le(r,2),Ac(r));break}}t=t.return}}function Ec(e,t,n){var r=e.pingCache;if(null===r){r=e.pingCache=new fs;var a=new Set;r.set(t,a)}else void 0===(a=r.get(t))&&(a=new Set,r.set(t,a));a.has(n)||(ws=!0,a.add(n),e=xc.bind(null,e,t,n),t.then(e,e))}function xc(e,t,n){var r=e.pingCache;null!==r&&r.delete(t),e.pingedLanes|=e.suspendedLanes&n,e.warmLanes&=~n,ps===e&&(ms&n)===n&&(4===Ss||3===Ss&&(62914560&ms)===ms&&300>ie()-Ls?!(2&ds)&&ec(e,0):Cs|=n,_s===ms&&(_s=0)),Ac(e)}function Cc(e,t){0===t&&(t=ze()),null!==(e=Rr(e,t))&&(Le(e,t),Ac(e))}function Pc(e){var t=e.memoizedState,n=0;null!==t&&(n=t.retryLane),Cc(e,n)}function _c(e,t){var n=0;switch(e.tag){case 31:case 13:var r=e.stateNode,a=e.memoizedState;null!==a&&(n=a.retryLane);break;case 19:r=e.stateNode;break;case 22:r=e.stateNode._retryCache;break;default:throw Error(o(314))}null!==r&&r.delete(t),Cc(e,n)}var Tc=null,zc=null,Nc=!1,Lc=!1,Rc=!1,Oc=0;function Ac(e){e!==zc&&null===e.next&&(null===zc?Tc=zc=e:zc=zc.next=e),Lc=!0,Nc||(Nc=!0,xf(function(){6&ds?re(se,Fc):Mc()}))}function Dc(e,t){if(!Rc&&Lc){Rc=!0;do{for(var n=!1,r=Tc;null!==r;){if(!t)if(0!==e){var a=r.pendingLanes;if(0===a)var l=0;else{var o=r.suspendedLanes,i=r.pingedLanes;l=(1<<31-be(42|e)+1)-1,l=201326741&(l&=a&~(o&~i))?201326741&l|1:l?2|l:0}0!==l&&(n=!0,Uc(r,l))}else l=ms,!(3&(l=Pe(r,r===ps?l:0,null!==r.cancelPendingCommit||-1!==r.timeoutHandle)))||_e(r,l)||(n=!0,Uc(r,l));r=r.next}}while(n);Rc=!1}}function Fc(){Mc()}function Mc(){Lc=Nc=!1;var e,t=0;0!==Oc&&((e=window.event)&&"popstate"===e.type?e!==wf&&(wf=e,1):(wf=null,0))&&(t=Oc);for(var n=ie(),r=null,a=Tc;null!==a;){var l=a.next,o=$c(a,n);0===o?(a.next=null,null===r?Tc=l:r.next=l,null===l&&(zc=r)):(r=a,(0!==t||3&o)&&(Lc=!0)),a=l}0!==Fs&&5!==Fs||Dc(t,!1),0!==Oc&&(Oc=0)}function $c(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,a=e.expirationTimes,l=-62914561&e.pendingLanes;0 title"):null)}function ad(e){return!!("stylesheet"!==e.type||3&e.state.loading)}var ld=0;function od(){if(this.count--,0===this.count&&(0===this.imgCount||!this.waitingForImages))if(this.stylesheets)ud(this,this.stylesheets);else if(this.unsuspend){var e=this.unsuspend;this.unsuspend=null,e()}}var id=null;function ud(e,t){e.stylesheets=null,null!==e.unsuspend&&(e.count++,id=new Map,t.forEach(sd,e),id=null,od.call(e))}function sd(e,t){if(!(4&t.state.loading)){var n=id.get(e);if(n)var r=n.get(null);else{n=new Map,id.set(e,n);for(var a=e.querySelectorAll("link[data-precedence],style[data-precedence]"),l=0;l>>1,a=e[r];if(!(0>>1;rl(u,n))sl(c,u)?(e[r]=c,e[s]=n,r=s):(e[r]=u,e[i]=n,r=i);else{if(!(sl(c,n)))break e;e[r]=c,e[s]=n,r=s}}}return t}function l(e,t){var n=e.sortIndex-t.sortIndex;return 0!==n?n:e.id-t.id}if(t.unstable_now=void 0,"object"==typeof performance&&"function"==typeof performance.now){var o=performance;t.unstable_now=function(){return o.now()}}else{var i=Date,u=i.now();t.unstable_now=function(){return i.now()-u}}var s=[],c=[],f=1,d=null,p=3,h=!1,m=!1,g=!1,y=!1,v="function"==typeof setTimeout?setTimeout:null,b="function"==typeof clearTimeout?clearTimeout:null,w="undefined"!=typeof setImmediate?setImmediate:null;function k(e){for(var t=r(c);null!==t;){if(null===t.callback)a(c);else{if(!(t.startTime<=e))break;a(c),t.sortIndex=t.expirationTime,n(s,t)}t=r(c)}}function S(e){if(g=!1,k(e),!m)if(null!==r(s))m=!0,x||(x=!0,E());else{var t=r(c);null!==t&&R(S,t.startTime-e)}}var E,x=!1,C=-1,P=5,_=-1;function T(){return!(!y&&t.unstable_now()-_e&&T());){var o=d.callback;if("function"==typeof o){d.callback=null,p=d.priorityLevel;var i=o(d.expirationTime<=e);if(e=t.unstable_now(),"function"==typeof i){d.callback=i,k(e),n=!0;break t}d===r(s)&&a(s),k(e)}else a(s);d=r(s)}if(null!==d)n=!0;else{var u=r(c);null!==u&&R(S,u.startTime-e),n=!1}}break e}finally{d=null,p=l,h=!1}n=void 0}}finally{n?E():x=!1}}}if("function"==typeof w)E=function(){w(z)};else if("undefined"!=typeof MessageChannel){var N=new MessageChannel,L=N.port2;N.port1.onmessage=z,E=function(){L.postMessage(null)}}else E=function(){v(z,0)};function R(e,n){C=v(function(){e(t.unstable_now())},n)}t.unstable_IdlePriority=5,t.unstable_ImmediatePriority=1,t.unstable_LowPriority=4,t.unstable_NormalPriority=3,t.unstable_Profiling=null,t.unstable_UserBlockingPriority=2,t.unstable_cancelCallback=function(e){e.callback=null},t.unstable_forceFrameRate=function(e){0>e||125o?(e.sortIndex=l,n(c,e),null===r(s)&&e===r(c)&&(g?(b(C),C=-1):g=!0,R(S,l-o))):(e.sortIndex=i,n(s,e),m||h||(m=!0,x||(x=!0,E()))),e},t.unstable_shouldYield=T,t.unstable_wrapCallback=function(e){var t=p;return function(){var n=p;p=t;try{return e.apply(this,arguments)}finally{p=n}}}},666(e,t,n){e.exports=n(697)},582(e){var t=[];function n(e){for(var n=-1,r=0;r0?" ".concat(n.layer):""," {")),r+=n.css,a&&(r+="}"),n.media&&(r+="}"),n.supports&&(r+="}");var l=n.sourceMap;l&&"undefined"!=typeof btoa&&(r+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(l))))," */")),t.styleTagTransform(r,e,t.options)}(t,e,n)},remove:function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(t)}}}},567(e){e.exports=function(e,t){if(t.styleSheet)t.styleSheet.cssText=e;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(e))}}},32(e,t,n){let r;n.d(t,{BV:()=>ke,Kd:()=>Qe,ok:()=>Ye,qh:()=>be});var a=n(763),l=/^(?:[a-z][a-z0-9+.-]*:|[\\/]{2})/i,o=/^[\\/]{2}/;var i="popstate";function u(e){return"object"==typeof e&&null!=e&&"pathname"in e&&"search"in e&&"hash"in e&&"state"in e&&"key"in e}function s(e={}){return function(e,t,n,r={}){let{window:a=document.defaultView,v5Compat:l=!1}=r,s=a.history,f="POP",m=null,g=y();function y(){return(s.state||{idx:null}).idx}function v(){f="POP";let e=y(),t=null==e?null:e-g;g=e,m&&m({action:f,location:w.location,delta:t})}function b(e){return function(e,t,n=!1){let r="http://localhost";e&&(r="null"!==e.location.origin?e.location.origin:e.location.href),c(r,"No window.location.(origin|href) available to create URL");let a="string"==typeof t?t:h(t);return a=a.replace(/ $/,"%20"),!n&&o.test(a)&&(a=r+a),new URL(a,r)}(a,e)}null==g&&(g=0,s.replaceState({...s.state,idx:g},""));let w={get action(){return f},get location(){return e(a,s)},listen(e){if(m)throw new Error("A history only accepts one active listener");return a.addEventListener(i,v),m=e,()=>{a.removeEventListener(i,v),m=null}},createHref:e=>t(a,e),createURL:b,encodeLocation(e){let t=b(e);return{pathname:t.pathname,search:t.search,hash:t.hash}},push:function(e,t){f="PUSH";let r=u(e)?e:p(w.location,e,t);n&&n(r,e),g=y()+1;let o=d(r,g),i=w.createHref(r.mask||r);try{s.pushState(o,"",i)}catch(e){if(e instanceof DOMException&&"DataCloneError"===e.name)throw e;a.location.assign(i)}l&&m&&m({action:f,location:w.location,delta:1})},replace:function(e,t){f="REPLACE";let r=u(e)?e:p(w.location,e,t);n&&n(r,e),g=y();let a=d(r,g),o=w.createHref(r.mask||r);s.replaceState(a,"",o),l&&m&&m({action:f,location:w.location,delta:0})},go:e=>s.go(e)};return w}(function(e,t){let n=t.state?.masked,{pathname:r,search:a,hash:l}=n||e.location;return p("",{pathname:r,search:a,hash:l},t.state&&t.state.usr||null,t.state&&t.state.key||"default",n?{pathname:e.location.pathname,search:e.location.search,hash:e.location.hash}:void 0)},function(e,t){return"string"==typeof t?t:h(t)},null,e)}function c(e,t){if(!1===e||null==e)throw new Error(t)}function f(e,t){if(!e){"undefined"!=typeof console&&console.warn(t);try{throw new Error(t)}catch(e){}}}function d(e,t){return{usr:e.state,key:e.key,idx:t,masked:e.mask?{pathname:e.pathname,search:e.search,hash:e.hash}:void 0}}function p(e,t,n=null,r,a){return{pathname:"string"==typeof e?e:e.pathname,search:"",hash:"",..."string"==typeof t?m(t):t,state:n,key:t&&t.key||r||Math.random().toString(36).substring(2,10),mask:a}}function h({pathname:e="/",search:t="",hash:n=""}){return t&&"?"!==t&&(e+="?"===t.charAt(0)?t:"?"+t),n&&"#"!==n&&(e+="#"===n.charAt(0)?n:"#"+n),e}function m(e){let t={};if(e){let n=e.indexOf("#");n>=0&&(t.hash=e.substring(n),e=e.substring(0,n));let r=e.indexOf("?");r>=0&&(t.search=e.substring(r),e=e.substring(0,r)),e&&(t.pathname=e)}return t}function g(e,t,n="/"){return y(e,t,n,!1)}function y(e,t,n,r,a){let l=_(("string"==typeof t?m(t):t).pathname||"/",n);if(null==l)return null;let o=a??function(e){let t=v(e);return function(e){e.sort((e,t)=>e.score!==t.score?t.score-e.score:function(e,t){return e.length===t.length&&e.slice(0,-1).every((e,n)=>e===t[n])?e[e.length-1]-t[t.length-1]:0}(e.routesMeta.map(e=>e.childrenIndex),t.routesMeta.map(e=>e.childrenIndex)))}(t),t}(e),i=null,u=function(e){try{return e.split("/").map(e=>decodeURIComponent(e).replace(/\//g,"%2F")).join("/")}catch(t){return f(!1,`The URL path "${e}" could not be decoded because it is a malformed URL segment. This is probably due to a bad percent encoding (${t}).`),e}}(l);for(let e=0;null==i&&e{let u={relativePath:void 0===i?e.path||"":i,caseSensitive:!0===e.caseSensitive,childrenIndex:l,route:e};if(u.relativePath.startsWith("/")){if(!u.relativePath.startsWith(r)&&o)return;c(u.relativePath.startsWith(r),`Absolute route path "${u.relativePath}" nested under path "${r}" is not valid. An absolute child route path must start with the combined path of all its parent routes.`),u.relativePath=u.relativePath.slice(r.length)}let s=O([r,u.relativePath]),f=n.concat(u);e.children&&e.children.length>0&&(c(!0!==e.index,`Index routes must not have child routes. Please remove all child routes from route path "${s}".`),v(e.children,t,f,s,o)),(null!=e.path||e.index)&&t.push({path:s,score:S(s,e.index),routesMeta:f.map((e,t)=>{let[n,r]=P(e.relativePath,e.caseSensitive,t===f.length-1);return{...e,matcher:n,compiledParams:r}})})};return e.forEach((e,t)=>{if(""!==e.path&&e.path?.includes("?"))for(let n of b(e.path))l(e,t,!0,n);else l(e,t)}),t}function b(e){let t=e.split("/");if(0===t.length)return[];let[n,...r]=t,a=n.endsWith("?"),l=n.replace(/\?$/,"");if(0===r.length)return a?[l,""]:[l];let o=b(r.join("/")),i=[];return i.push(...o.map(e=>""===e?l:[l,e].join("/"))),a&&i.push(...o),i.map(t=>e.startsWith("/")&&""===t?"/":t)}new WeakMap;var w=/^:[\w-]+$/,k=e=>"*"===e;function S(e,t){let n=e.split("/"),r=n.length;return n.some(k)&&(r+=-2),t&&(r+=2),n.filter(e=>!k(e)).reduce((e,t)=>e+(w.test(t)?3:""===t?1:10),r)}function E(e,t,n=!1){let{routesMeta:r}=e,a={},l="/",o=[];for(let e=0;e{if("*"===t){let e=i[r]||"";o=l.slice(0,l.length-e.length).replace(/(.)\/+$/,"$1")}const a=i[r];return e[t]=n&&!a?void 0:(a||"").replace(/%2F/g,"/"),e},{}),pathname:l,pathnameBase:o,pattern:e}}function P(e,t=!1,n=!0){f("*"===e||!e.endsWith("*")||e.endsWith("/*"),`Route path "${e}" will be treated as if it were "${e.replace(/\*$/,"/*")}" because the \`*\` character must always follow a \`/\` in the pattern. To get rid of this warning, please change the route path to "${e.replace(/\*$/,"/*")}".`);let r=[],a="^"+e.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:([\w-]+)(\?)?/g,(e,t,n,a,l)=>{if(r.push({paramName:t,isOptional:null!=n}),n){let t=l.charAt(a+e.length);return t&&"/"!==t?"/([^\\/]*)":"(?:/([^\\/]*))?"}return"/([^\\/]+)"}).replace(/\/([\w-]+)\?(\/|$)/g,"(/$1)?$2");return e.endsWith("*")?(r.push({paramName:"*"}),a+="*"===e||"/*"===e?"(.*)$":"(?:\\/(.+)|\\/*)$"):n?a+="\\/*$":""!==e&&"/"!==e&&(a+="(?:(?=\\/|$))"),[new RegExp(a,t?void 0:"i"),r]}function _(e,t){if("/"===t)return e;if(!e.toLowerCase().startsWith(t.toLowerCase()))return null;let n=t.endsWith("/")?t.length-1:t.length,r=e.charAt(n);return r&&"/"!==r?null:e.slice(n)||"/"}function T(e,t){let n=A(t).split("/");return e.split("/").forEach(e=>{".."===e?n.length>1&&n.pop():"."!==e&&n.push(e)}),n.length>1?n.join("/"):"/"}function z(e,t,n,r){return`Cannot include a '${e}' character in a manually specified \`to.${t}\` field [${JSON.stringify(r)}]. Please separate it out to the \`to.${n}\` field. Alternatively you may provide the full path as a string in and the router will parse it for you.`}function N(e){let t=function(e){return e.filter((e,t)=>0===t||e.route.path&&e.route.path.length>0)}(e);return t.map((e,n)=>n===t.length-1?e.pathname:e.pathnameBase)}function L(e,t,n,r=!1){let a;"string"==typeof e?a=m(e):(a={...e},c(!a.pathname||!a.pathname.includes("?"),z("?","pathname","search",a)),c(!a.pathname||!a.pathname.includes("#"),z("#","pathname","hash",a)),c(!a.search||!a.search.includes("#"),z("#","search","hash",a)));let l,o=""===e||""===a.pathname,i=o?"/":a.pathname;if(null==i)l=n;else{let e=t.length-1;if(!r&&i.startsWith("..")){let t=i.split("/");for(;".."===t[0];)t.shift(),e-=1;a.pathname=t.join("/")}l=e>=0?t[e]:"/"}let u=function(e,t="/"){let n,{pathname:r,search:a="",hash:l=""}="string"==typeof e?m(e):e;return r?(r=R(r),n=r.startsWith("/")?T(r.substring(1),"/"):T(r,t)):n=t,{pathname:n,search:F(a),hash:M(l)}}(a,l),s=i&&"/"!==i&&i.endsWith("/"),f=(o||"."===i)&&n.endsWith("/");return u.pathname.endsWith("/")||!s&&!f||(u.pathname+="/"),u}var R=e=>e.replace(/[\\/]{2,}/g,"/"),O=e=>R(e.join("/")),A=e=>e.replace(/\/+$/,""),D=e=>A(e).replace(/^\/*/,"/"),F=e=>e&&"?"!==e?e.startsWith("?")?e:"?"+e:"",M=e=>e&&"#"!==e?e.startsWith("#")?e:"#"+e:"",$=class{constructor(e,t,n,r=!1){this.status=e,this.statusText=t||"",this.internal=r,n instanceof Error?(this.data=n.toString(),this.error=n):this.data=n}};function I(e){return null!=e&&"number"==typeof e.status&&"string"==typeof e.statusText&&"boolean"==typeof e.internal&&"data"in e}function U(e){let t=e.map(e=>e.route.path).filter(Boolean);return O(t)||"/"}var j="undefined"!=typeof window&&void 0!==window.document&&void 0!==window.document.createElement;function H(e,t){let n=e;if("string"!=typeof n||!l.test(n))return{absoluteURL:void 0,isExternal:!1,to:n};let r=n,a=!1;if(j)try{let e=new URL(window.location.href),r=o.test(n)?new URL((i=n,e.protocol+i.replace(/\\/g,"/"))):new URL(n),l=_(r.pathname,t);r.origin===e.origin&&null!=l?n=l+r.search+r.hash:a=!0}catch(e){f(!1,` contains an invalid URL which will probably break when clicked - please update to a valid URL path.`)}var i;return{absoluteURL:r,isExternal:a,to:n}}Symbol("Uninstrumented"),Object.getOwnPropertyNames(Object.prototype).sort().join("\0");var B=["POST","PUT","PATCH","DELETE"],W=(new Set(B),["GET",...B]);new Set(W),Symbol("ResetLoaderData"),new WeakMap,new WeakMap,new WeakMap,new WeakMap;var V=["about:","blob:","chrome:","chrome-untrusted:","content:","data:","devtools:","file:","filesystem:","javascript:"];var Q=a.createContext(null);Q.displayName="DataRouter";var q=a.createContext(null);q.displayName="DataRouterState";var K=a.createContext(!1);function Y(){return a.useContext(K)}var G=a.createContext({isTransitioning:!1});G.displayName="ViewTransition",a.createContext(new Map).displayName="Fetchers",a.createContext(null).displayName="Await";var X=a.createContext(null);X.displayName="Navigation";var J=a.createContext(null);J.displayName="Location";var Z=a.createContext({outlet:null,matches:[],isDataRoute:!1});Z.displayName="Route";var ee=a.createContext(null);ee.displayName="RouteError";var te="REACT_ROUTER_ERROR";function ne(){return null!=a.useContext(J)}function re(){return c(ne(),"useLocation() may be used only in the context of a component."),a.useContext(J).location}var ae="You should call navigate() in a React.useEffect(), not when your component is first rendered.";function le(e){a.useContext(X).static||a.useLayoutEffect(e)}function oe(){let{isDataRoute:e}=a.useContext(Z);return e?function(){let{router:e}=function(e){let t=a.useContext(Q);return c(t,me(e)),t}("useNavigate"),t=ge("useNavigate"),n=a.useRef(!1);return le(()=>{n.current=!0}),a.useCallback(async(r,a={})=>{f(n.current,ae),n.current&&("number"==typeof r?await e.navigate(r):await e.navigate(r,{fromRouteId:t,...a}))},[e,t])}():function(){c(ne(),"useNavigate() may be used only in the context of a component.");let e=a.useContext(Q),{basename:t,navigator:n}=a.useContext(X),{matches:r}=a.useContext(Z),{pathname:l}=re(),o=JSON.stringify(N(r)),i=a.useRef(!1);return le(()=>{i.current=!0}),a.useCallback((r,a={})=>{if(f(i.current,ae),!i.current)return;if("number"==typeof r)return void n.go(r);let u=L(r,JSON.parse(o),l,"path"===a.relative);null==e&&"/"!==t&&(u.pathname="/"===u.pathname?t:O([t,u.pathname])),(a.replace?n.replace:n.push)(u,a.state,a)},[t,n,o,l,e])}()}function ie(e,{relative:t}={}){let{matches:n}=a.useContext(Z),{pathname:r}=re(),l=JSON.stringify(N(n));return a.useMemo(()=>L(e,JSON.parse(l),r,"path"===t),[e,l,r,t])}function ue(e,t,n){c(ne(),"useRoutes() may be used only in the context of a component.");let{navigator:r}=a.useContext(X),{matches:l}=a.useContext(Z),o=l[l.length-1],i=o?o.params:{},u=o?o.pathname:"/",s=o?o.pathnameBase:"/",d=o&&o.route;{let e=d&&d.path||"";ve(u,!d||e.endsWith("*")||e.endsWith("*?"),`You rendered descendant (or called \`useRoutes()\`) at "${u}" (under ) but the parent route path has no trailing "*". This means if you navigate deeper, the parent won't match anymore and therefore the child routes will never render.\n\nPlease change the parent to .`)}let p,h=re();if(t){let e="string"==typeof t?m(t):t;c("/"===s||e.pathname?.startsWith(s),`When overriding the location using \`\` or \`useRoutes(routes, location)\`, the location pathname must begin with the portion of the URL pathname that was matched by all parent routes. The current pathname base is "${s}" but pathname "${e.pathname}" was given in the \`location\` prop.`),p=e}else p=h;let y=p.pathname||"/",v=y;if("/"!==s){let e=s.replace(/^\//,"").split("/");v="/"+y.replace(/^\//,"").split("/").slice(e.length).join("/")}let b=n&&n.state.matches.length?n.state.matches.map(e=>Object.assign(e,{route:n.manifest[e.route.id]||e.route})):g(e,{pathname:v});f(d||null!=b,`No routes matched location "${p.pathname}${p.search}${p.hash}" `),f(null==b||void 0!==b[b.length-1].route.element||void 0!==b[b.length-1].route.Component||void 0!==b[b.length-1].route.lazy,`Matched leaf route at location "${p.pathname}${p.search}${p.hash}" does not have an element or Component. This means it will render an with a null value by default resulting in an "empty" page.`);let w=function(e,t=[],n){let r=n?.state;if(null==e){if(!r)return null;if(r.errors)e=r.matches;else{if(0!==t.length||r.initialized||!(r.matches.length>0))return null;e=r.matches}}let l=e,o=r?.errors;if(null!=o){let e=l.findIndex(e=>e.route.id&&void 0!==o?.[e.route.id]);c(e>=0,`Could not find a matching route for errors on route IDs: ${Object.keys(o).join(",")}`),l=l.slice(0,Math.min(l.length,e+1))}let i=!1,u=-1;if(n&&r){i=r.renderFallback;for(let e=0;e=0?l.slice(0,u+1):[l[0]];break}}}}let s=n?.onError,f=r&&s?(e,t)=>{s(e,{location:r.location,params:r.matches?.[0]?.params??{},pattern:U(r.matches),errorInfo:t})}:void 0;return l.reduceRight((e,n,s)=>{let c,d=!1,p=null,h=null;r&&(c=o&&n.route.id?o[n.route.id]:void 0,p=n.route.errorElement||ce,i&&(u<0&&0===s?(ve("route-fallback",!1,"No `HydrateFallback` element provided to render during initial hydration"),d=!0,h=null):u===s&&(d=!0,h=n.route.hydrateFallbackElement||null)));let m=t.concat(l.slice(0,s+1)),g=()=>{let t;return t=c?p:d?h:n.route.Component?a.createElement(n.route.Component,null):n.route.element?n.route.element:e,a.createElement(he,{match:n,routeContext:{outlet:e,matches:m,isDataRoute:null!=r},children:t})};return r&&(n.route.ErrorBoundary||n.route.errorElement||0===s)?a.createElement(fe,{location:r.location,revalidation:r.revalidation,component:p,error:c,children:g(),routeContext:{outlet:null,matches:m,isDataRoute:!0},onError:f}):g()},null)}(b&&b.map(e=>Object.assign({},e,{params:Object.assign({},i,e.params),pathname:O([s,r.encodeLocation?r.encodeLocation(e.pathname.replace(/%/g,"%25").replace(/\?/g,"%3F").replace(/#/g,"%23")).pathname:e.pathname]),pathnameBase:"/"===e.pathnameBase?s:O([s,r.encodeLocation?r.encodeLocation(e.pathnameBase.replace(/%/g,"%25").replace(/\?/g,"%3F").replace(/#/g,"%23")).pathname:e.pathnameBase])})),l,n);return t&&w?a.createElement(J.Provider,{value:{location:{pathname:"/",search:"",hash:"",state:null,key:"default",mask:void 0,...p},navigationType:"POP"}},w):w}function se(){let e=function(){let e=a.useContext(ee),t=function(e){let t=a.useContext(q);return c(t,me(e)),t}("useRouteError"),n=ge("useRouteError");return void 0!==e?e:t.errors?.[n]}(),t=I(e)?`${e.status} ${e.statusText}`:e instanceof Error?e.message:JSON.stringify(e),n=e instanceof Error?e.stack:null,r="rgba(200,200,200, 0.5)",l={padding:"0.5rem",backgroundColor:r},o={padding:"2px 4px",backgroundColor:r},i=null;return console.error("Error handled by React Router default ErrorBoundary:",e),i=a.createElement(a.Fragment,null,a.createElement("p",null,"💿 Hey developer 👋"),a.createElement("p",null,"You can provide a way better UX than this when your app throws errors by providing your own ",a.createElement("code",{style:o},"ErrorBoundary")," or"," ",a.createElement("code",{style:o},"errorElement")," prop on your route.")),a.createElement(a.Fragment,null,a.createElement("h2",null,"Unexpected Application Error!"),a.createElement("h3",{style:{fontStyle:"italic"}},t),n?a.createElement("pre",{style:l},n):null,i)}a.createContext(null);var ce=a.createElement(se,null),fe=class extends a.Component{constructor(e){super(e),this.state={location:e.location,revalidation:e.revalidation,error:e.error}}static getDerivedStateFromError(e){return{error:e}}static getDerivedStateFromProps(e,t){return t.location!==e.location||"idle"!==t.revalidation&&"idle"===e.revalidation?{error:e.error,location:e.location,revalidation:e.revalidation}:{error:void 0!==e.error?e.error:t.error,location:t.location,revalidation:e.revalidation||t.revalidation}}componentDidCatch(e,t){this.props.onError?this.props.onError(e,t):console.error("React Router caught the following error during render",e)}render(){let e=this.state.error;if(this.context&&"object"==typeof e&&e&&"digest"in e&&"string"==typeof e.digest){const t=function(e){if(e.startsWith(`${te}:ROUTE_ERROR_RESPONSE:{`))try{let t=JSON.parse(e.slice(40));if("object"==typeof t&&t&&"number"==typeof t.status&&"string"==typeof t.statusText)return new $(t.status,t.statusText,t.data)}catch{}}(e.digest);t&&(e=t)}let t=void 0!==e?a.createElement(Z.Provider,{value:this.props.routeContext},a.createElement(ee.Provider,{value:e,children:this.props.component})):this.props.children;return this.context?a.createElement(pe,{error:e},t):t}};fe.contextType=K;var de=new WeakMap;function pe({children:e,error:t}){let{basename:n}=a.useContext(X);if("object"==typeof t&&t&&"digest"in t&&"string"==typeof t.digest){let e=function(e){if(e.startsWith(`${te}:REDIRECT:{`))try{let t=JSON.parse(e.slice(28));if("object"==typeof t&&t&&"number"==typeof t.status&&"string"==typeof t.statusText&&"string"==typeof t.location&&"boolean"==typeof t.reloadDocument&&"boolean"==typeof t.replace)return t}catch{}}(t.digest);if(e){let r=de.get(t);if(r)throw r;let l=H(e.location,n),o=l.absoluteURL||l.to;if(function(e){try{return V.includes(new URL(e).protocol)}catch{return!1}}(o))throw new Error("Invalid redirect location");if(j&&!de.get(t)){if(!l.isExternal&&!e.reloadDocument){const n=Promise.resolve().then(()=>window.__reactRouterDataRouter.navigate(l.to,{replace:e.replace}));throw de.set(t,n),n}window.location.href=o}return a.createElement("meta",{httpEquiv:"refresh",content:`0;url=${o}`})}}return e}function he({routeContext:e,match:t,children:n}){let r=a.useContext(Q);return r&&r.static&&r.staticContext&&(t.route.errorElement||t.route.ErrorBoundary)&&(r.staticContext._deepestRenderedBoundaryId=t.route.id),a.createElement(Z.Provider,{value:e},n)}function me(e){return`${e} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`}function ge(e){let t=function(e){let t=a.useContext(Z);return c(t,me(e)),t}(e),n=t.matches[t.matches.length-1];return c(n.route.id,`${e} can only be used on routes that contain a unique "id"`),n.route.id}var ye={};function ve(e,t,n){t||ye[e]||(ye[e]=!0,f(!1,n))}function be(e){c(!1,"A is only ever to be used as the child of element, never rendered directly. Please wrap your in a .")}function we({basename:e="/",children:t=null,location:n,navigationType:r="POP",navigator:l,static:o=!1,useTransitions:i}){c(!ne(),"You cannot render a inside another . You should never have more than one in your app.");let u=e.replace(/^\/*/,"/"),s=a.useMemo(()=>({basename:u,navigator:l,static:o,useTransitions:i,future:{}}),[u,l,o,i]);"string"==typeof n&&(n=m(n));let{pathname:d="/",search:p="",hash:h="",state:g=null,key:y="default",mask:v}=n,b=a.useMemo(()=>{let e=_(d,u);return null==e?null:{location:{pathname:e,search:p,hash:h,state:g,key:y,mask:v},navigationType:r}},[u,d,p,h,g,y,r,v]);return f(null!=b,` is not able to match the URL "${d}${p}${h}" because it does not start with the basename, so the won't render anything.`),null==b?null:a.createElement(X.Provider,{value:s},a.createElement(J.Provider,{children:t,value:b}))}function ke({children:e,location:t}){return ue(Se(e),t)}function Se(e,t=[]){let n=[];return a.Children.forEach(e,(e,r)=>{if(!a.isValidElement(e))return;let l=[...t,r];if(e.type===a.Fragment)return void n.push.apply(n,Se(e.props.children,l));c(e.type===be,`[${"string"==typeof e.type?e.type:e.type.name}] is not a component. All component children of must be a or `),c(!e.props.index||!e.props.children,"An index route cannot have child routes.");let o={id:e.props.id||l.join("-"),caseSensitive:e.props.caseSensitive,element:e.props.element,Component:e.props.Component,index:e.props.index,path:e.props.path,middleware:e.props.middleware,loader:e.props.loader,action:e.props.action,hydrateFallbackElement:e.props.hydrateFallbackElement,HydrateFallback:e.props.HydrateFallback,errorElement:e.props.errorElement,ErrorBoundary:e.props.ErrorBoundary,hasErrorBoundary:!0===e.props.hasErrorBoundary||null!=e.props.ErrorBoundary||null!=e.props.errorElement,shouldRevalidate:e.props.shouldRevalidate,handle:e.props.handle,lazy:e.props.lazy};e.props.children&&(o.children=Se(e.props.children,l)),n.push(o)}),n}(r||(r=n.t(a,2))).useOptimistic,a.memo(function({routes:e,manifest:t,future:n,state:r,isStatic:a,onError:l}){return ue(e,void 0,{manifest:t,state:r,isStatic:a,onError:l,future:n})}),a.Component;var Ee="get",xe="application/x-www-form-urlencoded";function Ce(e){return"undefined"!=typeof HTMLElement&&e instanceof HTMLElement}function Pe(e=""){return new URLSearchParams("string"==typeof e||Array.isArray(e)||e instanceof URLSearchParams?e:Object.keys(e).reduce((t,n)=>{let r=e[n];return t.concat(Array.isArray(r)?r.map(e=>[n,e]):[[n,r]])},[]))}var _e=null,Te=new Set(["application/x-www-form-urlencoded","multipart/form-data","text/plain"]);function ze(e){return null==e||Te.has(e)?e:(f(!1,`"${e}" is not a valid \`encType\` for \`
\`/\`\` and will default to "${xe}"`),null)}function Ne(e,t){if(!1===e||null==e)throw new Error(t)}function Le(e,t,n,r){let a="string"==typeof e?new URL(e,"undefined"==typeof window?"server://singlefetch/":window.location.origin):e;return n?a.pathname.endsWith("/")?a.pathname=`${a.pathname}_.${r}`:a.pathname=`${a.pathname}.${r}`:"/"===a.pathname?a.pathname=`_root.${r}`:t&&"/"===_(a.pathname,t)?a.pathname=`${A(t)}/_root.${r}`:a.pathname=`${A(a.pathname)}.${r}`,a}function Re(e){return null!=e&&(null==e.href?"preload"===e.rel&&"string"==typeof e.imageSrcSet&&"string"==typeof e.imageSizes:"string"==typeof e.rel&&"string"==typeof e.href)}function Oe(e,t,n,r,a,l){let o=(e,t)=>!n[t]||e.route.id!==n[t].route.id,i=(e,t)=>n[t].pathname!==e.pathname||n[t].route.path?.endsWith("*")&&n[t].params["*"]!==e.params["*"];return"assets"===l?t.filter((e,t)=>o(e,t)||i(e,t)):"data"===l?t.filter((t,l)=>{let u=r.routes[t.route.id];if(!u||!u.hasLoader)return!1;if(o(t,l)||i(t,l))return!0;if(t.route.shouldRevalidate){let r=t.route.shouldRevalidate({currentUrl:new URL(a.pathname+a.search+a.hash,window.origin),currentParams:n[0]?.params||{},nextUrl:new URL(e,window.origin),nextParams:t.params,defaultShouldRevalidate:!0});if("boolean"==typeof r)return r}return!0}):[]}function Ae(e,t,{includeHydrateFallback:n}={}){return r=e.map(e=>{let r=t.routes[e.route.id];if(!r)return[];let a=[r.module];return r.clientActionModule&&(a=a.concat(r.clientActionModule)),r.clientLoaderModule&&(a=a.concat(r.clientLoaderModule)),n&&r.hydrateFallbackModule&&(a=a.concat(r.hydrateFallbackModule)),r.imports&&(a=a.concat(r.imports)),a}).flat(1),[...new Set(r)];var r}function De(){let e=a.useContext(Q);return Ne(e,"You must render this element inside a element"),e}function Fe(){let e=a.useContext(q);return Ne(e,"You must render this element inside a element"),e}Object.getOwnPropertyNames(Object.prototype).sort().join("\0"),Symbol("SingleFetchRedirect");var Me=a.createContext(void 0);function $e(){let e=a.useContext(Me);return Ne(e,"You must render this element inside a element"),e}function Ie(e,t){return n=>{e&&e(n),n.defaultPrevented||t(n)}}function Ue({page:e,...t}){let n=Y(),{nonce:r}=$e(),{router:l}=De(),o=a.useMemo(()=>g(l.routes,e,l.basename),[l.routes,e,l.basename]);return o?(null==t.nonce&&r&&(t={...t,nonce:r}),n?a.createElement(He,{page:e,matches:o,...t}):a.createElement(Be,{page:e,matches:o,...t})):null}function je(e){let{manifest:t,routeModules:n}=$e(),[r,l]=a.useState([]);return a.useEffect(()=>{let r=!1;return async function(e,t,n){return function(e,t){let n=new Set,r=new Set(t);return e.reduce((e,a)=>{if(t&&(null==(l=a)||"string"!=typeof l.page)&&"script"===a.as&&a.href&&r.has(a.href))return e;var l;let o=JSON.stringify(function(e){let t={},n=Object.keys(e).sort();for(let r of n)t[r]=e[r];return t}(a));return n.has(o)||(n.add(o),e.push({key:o,link:a})),e},[])}((await Promise.all(e.map(async e=>{let r=t.routes[e.route.id];if(r){let e=await async function(e,t){if(e.id in t)return t[e.id];try{let n=await(import(e.module));return t[e.id]=n,n}catch(t){return console.error(`Error loading route module \`${e.module}\`, reloading page...`),console.error(t),window.__reactRouterContext&&window.__reactRouterContext.isSpaMode,window.location.reload(),new Promise(()=>{})}}(r,n);return e.links?e.links():[]}return[]}))).flat(1).filter(Re).filter(e=>"stylesheet"===e.rel||"preload"===e.rel).map(e=>"stylesheet"===e.rel?{...e,rel:"prefetch",as:"style"}:{...e,rel:"prefetch"}))}(e,t,n).then(e=>{r||l(e)}),()=>{r=!0}},[e,t,n]),r}function He({page:e,matches:t,...n}){let r=re(),{future:l}=$e(),{basename:o}=De(),i=a.useMemo(()=>{if(e===r.pathname+r.search+r.hash)return[];let n=Le(e,o,l.v8_trailingSlashAwareDataRequests,"rsc"),a=!1,i=[];for(let e of t)"function"==typeof e.route.shouldRevalidate?a=!0:i.push(e.route.id);return a&&i.length>0&&n.searchParams.set("_routes",i.join(",")),[n.pathname+n.search]},[o,l.v8_trailingSlashAwareDataRequests,e,r,t]);return a.createElement(a.Fragment,null,i.map(e=>a.createElement("link",{key:e,rel:"prefetch",as:"fetch",href:e,...n})))}function Be({page:e,matches:t,...n}){let r=re(),{future:l,manifest:o,routeModules:i}=$e(),{basename:u}=De(),{loaderData:s,matches:c}=Fe(),f=a.useMemo(()=>Oe(e,t,c,o,r,"data"),[e,t,c,o,r]),d=a.useMemo(()=>Oe(e,t,c,o,r,"assets"),[e,t,c,o,r]),p=a.useMemo(()=>{if(e===r.pathname+r.search+r.hash)return[];let n=new Set,a=!1;if(t.forEach(e=>{let t=o.routes[e.route.id];t&&t.hasLoader&&(!f.some(t=>t.route.id===e.route.id)&&e.route.id in s&&i[e.route.id]?.shouldRevalidate||t.hasClientLoader?a=!0:n.add(e.route.id))}),0===n.size)return[];let c=Le(e,u,l.v8_trailingSlashAwareDataRequests,"data");return a&&n.size>0&&c.searchParams.set("_routes",t.filter(e=>n.has(e.route.id)).map(e=>e.route.id).join(",")),[c.pathname+c.search]},[u,l.v8_trailingSlashAwareDataRequests,s,r,o,f,t,e,i]),h=a.useMemo(()=>Ae(d,o),[d,o]),m=je(d);return a.createElement(a.Fragment,null,p.map(e=>a.createElement("link",{key:e,rel:"prefetch",as:"fetch",href:e,...n})),h.map(e=>a.createElement("link",{key:e,rel:"modulepreload",href:e,...n})),m.map(({key:e,link:t})=>a.createElement("link",{key:e,nonce:n.nonce,...t,crossOrigin:t.crossOrigin??n.crossOrigin})))}Me.displayName="FrameworkContext";function We(...e){return t=>{e.forEach(e=>{"function"==typeof e?e(t):null!=e&&(e.current=t)})}}a.Component;var Ve="undefined"!=typeof window&&void 0!==window.document&&void 0!==window.document.createElement;try{Ve&&(window.__reactRouterVersion="7.18.2")}catch(e){}function Qe({basename:e,children:t,useTransitions:n,window:r}){let l=a.useRef();null==l.current&&(l.current=s({window:r,v5Compat:!0}));let o=l.current,[i,u]=a.useState({action:o.action,location:o.location}),c=a.useCallback(e=>{!1===n?u(e):a.startTransition(()=>u(e))},[n]);return a.useLayoutEffect(()=>o.listen(c),[o,c]),a.createElement(we,{basename:e,children:t,location:i.location,navigationType:i.action,navigator:o,useTransitions:n})}var qe=a.forwardRef(function({onClick:e,discover:t="render",prefetch:n="none",relative:r,reloadDocument:o,replace:i,mask:u,state:s,target:f,to:d,preventScrollReset:p,viewTransition:m,defaultShouldRevalidate:g,...y},v){let{basename:b,navigator:w,useTransitions:k}=a.useContext(X),S="string"==typeof d&&l.test(d),E=H(d,b),x=function(e,{relative:t}={}){c(ne(),"useHref() may be used only in the context of a component.");let{basename:n,navigator:r}=a.useContext(X),{hash:l,pathname:o,search:i}=ie(e,{relative:t}),u=o;return"/"!==n&&(u="/"===o?n:O([n,o])),r.createHref({pathname:u,search:i,hash:l})}(d=E.to,{relative:r}),C=re(),P=null;if(u){let e=L(u,[],C.mask?C.mask.pathname:"/",!0);"/"!==b&&(e.pathname="/"===e.pathname?b:O([b,e.pathname])),P=w.createHref(e)}let[_,T,z]=function(e,t){let n=a.useContext(Me),[r,l]=a.useState(!1),[o,i]=a.useState(!1),{onFocus:u,onBlur:s,onMouseEnter:c,onMouseLeave:f,onTouchStart:d}=t,p=a.useRef(null);a.useEffect(()=>{if("render"===e&&i(!0),"viewport"===e){let e=new IntersectionObserver(e=>{e.forEach(e=>{i(e.isIntersecting)})},{threshold:.5});return p.current&&e.observe(p.current),()=>{e.disconnect()}}},[e]),a.useEffect(()=>{if(r){let e=setTimeout(()=>{i(!0)},100);return()=>{clearTimeout(e)}}},[r]);let h=()=>{l(!0)},m=()=>{l(!1),i(!1)};return n?"intent"!==e?[o,p,{}]:[o,p,{onFocus:Ie(u,h),onBlur:Ie(s,m),onMouseEnter:Ie(c,h),onMouseLeave:Ie(f,m),onTouchStart:Ie(d,h)}]:[!1,p,{}]}(n,y),N=function(e,{target:t,replace:n,mask:r,state:l,preventScrollReset:o,relative:i,viewTransition:u,defaultShouldRevalidate:s,useTransitions:c}={}){let f=oe(),d=re(),p=ie(e,{relative:i});return a.useCallback(m=>{if(function(e,t){return!(0!==e.button||t&&"_self"!==t||function(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}(e))}(m,t)){m.preventDefault();let t=void 0!==n?n:h(d)===h(p),g=()=>f(e,{replace:t,mask:r,state:l,preventScrollReset:o,relative:i,viewTransition:u,defaultShouldRevalidate:s});c?a.startTransition(()=>g()):g()}},[d,f,p,n,r,l,t,e,o,i,u,s,c])}(d,{replace:i,mask:u,state:s,target:f,preventScrollReset:p,relative:r,viewTransition:m,defaultShouldRevalidate:g,useTransitions:k}),R=!(E.isExternal||o),A=a.createElement("a",{...y,...z,href:(R?P:void 0)||E.absoluteURL||x,onClick:R?function(t){e&&e(t),t.defaultPrevented||N(t)}:e,ref:We(v,T),target:f,"data-discover":S||"render"!==t?void 0:"true"});return _&&!S?a.createElement(a.Fragment,null,A,a.createElement(Ue,{page:x})):A});function Ke(e){let t=a.useContext(Q);return c(t,function(e){return`${e} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`}(e)),t}function Ye(e){f("undefined"!=typeof URLSearchParams,"You cannot use the `useSearchParams` hook in a browser that does not support the URLSearchParams API. If you need to support Internet Explorer 11, we recommend you load a polyfill such as https://github.com/ungap/url-search-params.");let t=a.useRef(Pe(e)),n=a.useRef(!1),r=re(),l=a.useMemo(()=>function(e,t){let n=Pe(e);return t&&t.forEach((e,r)=>{n.has(r)||t.getAll(r).forEach(e=>{n.append(r,e)})}),n}(r.search,n.current?null:t.current),[r.search]),o=oe(),i=a.useCallback((e,t)=>{const r=Pe("function"==typeof e?e(new URLSearchParams(l)):e);n.current=!0,o("?"+r,t)},[o,l]);return[l,i]}qe.displayName="Link",a.forwardRef(function({"aria-current":e="page",caseSensitive:t=!1,className:n="",end:r=!1,style:l,to:o,viewTransition:i,children:u,...s},f){let d=ie(o,{relative:s.relative}),p=re(),h=a.useContext(q),{navigator:m,basename:g}=a.useContext(X),y=null!=h&&function(e,{relative:t}={}){let n=a.useContext(G);c(null!=n,"`useViewTransitionState` must be used within `react-router-dom`'s `RouterProvider`. Did you accidentally import `RouterProvider` from `react-router`?");let{basename:r}=Ke("useViewTransitionState"),l=ie(e,{relative:t});if(!n.isTransitioning)return!1;let o=_(n.currentLocation.pathname,r)||n.currentLocation.pathname,i=_(n.nextLocation.pathname,r)||n.nextLocation.pathname;return null!=x(l.pathname,i)||null!=x(l.pathname,o)}(d)&&!0===i,v=m.encodeLocation?m.encodeLocation(d).pathname:d.pathname,b=p.pathname,w=h&&h.navigation&&h.navigation.location?h.navigation.location.pathname:null;t||(b=b.toLowerCase(),w=w?w.toLowerCase():null,v=v.toLowerCase()),w&&g&&(w=_(w,g)||w);const k="/"!==v&&v.endsWith("/")?v.length-1:v.length;let S,E=b===v||!r&&b.startsWith(v)&&"/"===b.charAt(k),C=null!=w&&(w===v||!r&&w.startsWith(v)&&"/"===w.charAt(v.length)),P={isActive:E,isPending:C,isTransitioning:y},T=E?e:void 0;S="function"==typeof n?n(P):[n,E?"active":null,C?"pending":null,y?"transitioning":null].filter(Boolean).join(" ");let z="function"==typeof l?l(P):l;return a.createElement(qe,{...s,"aria-current":T,className:S,ref:f,style:z,to:o,viewTransition:i},"function"==typeof u?u(P):u)}).displayName="NavLink",a.forwardRef(({discover:e="render",fetcherKey:t,navigate:n,reloadDocument:r,replace:o,state:i,method:u=Ee,action:s,onSubmit:f,relative:d,preventScrollReset:p,viewTransition:m,defaultShouldRevalidate:g,...y},v)=>{let{useTransitions:b}=a.useContext(X),w=function(){let{router:e}=Ke("useSubmit"),{basename:t}=a.useContext(X),n=ge("useRouteId"),r=e.fetch,l=e.navigate;return a.useCallback(async(e,a={})=>{let{action:o,method:i,encType:u,formData:s,body:c}=function(e,t){let n,r,a,l,o;if(Ce(i=e)&&"form"===i.tagName.toLowerCase()){let o=e.getAttribute("action");r=o?_(o,t):null,n=e.getAttribute("method")||Ee,a=ze(e.getAttribute("enctype"))||xe,l=new FormData(e)}else if(function(e){return Ce(e)&&"button"===e.tagName.toLowerCase()}(e)||function(e){return Ce(e)&&"input"===e.tagName.toLowerCase()}(e)&&("submit"===e.type||"image"===e.type)){let o=e.form;if(null==o)throw new Error('Cannot submit a